diff --git a/.hugo_build.lock b/.hugo_build.lock deleted file mode 100644 index e69de29..0000000 diff --git a/404.html b/404.html deleted file mode 100644 index 85e764d..0000000 --- a/404.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - - - - -404 Page not found - mCaptcha - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
-
- -
-
-
-

Page not found :(

-

The page you are looking for doesn't exist or has been moved.

-
-
-
- -
-
- - - - - - - - - diff --git a/_headers b/_headers deleted file mode 100644 index 31746da..0000000 --- a/_headers +++ /dev/null @@ -1,9 +0,0 @@ -/* - Strict-Transport-Security: max-age=31536000; includeSubDomains; preload - X-Content-Type-Options: nosniff - X-XSS-Protection: 1; mode=block - Content-Security-Policy: default-src 'self'; frame-ancestors https://jamstackthemes.dev; manifest-src 'self'; connect-src 'self'; font-src 'self'; img-src 'self' data:; script-src 'self'; style-src 'self' - X-Frame-Options: SAMEORIGIN - Referrer-Policy: strict-origin - Feature-Policy: geolocation 'self' - Cache-Control: public, max-age=31536000 \ No newline at end of file diff --git a/_redirects b/_redirects deleted file mode 100644 index b16b733..0000000 --- a/_redirects +++ /dev/null @@ -1 +0,0 @@ -# redirects for Netlify - https://www.netlify.com/docs/redirects/ \ No newline at end of file diff --git a/about/index.html b/about/index.html deleted file mode 100644 index 9178eb0..0000000 --- a/about/index.html +++ /dev/null @@ -1,190 +0,0 @@ - - - - - - - - - - - - - - About - mCaptcha - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
-
- -
- -
- -

About

-

-

mCaptcha is a kickass CAPTCHA systems that gives (DDoS) -attackers a run for their money. And we do all of this without tracking -your users. Oh and did I mention our UX is great?

-

At mCaptcha, we believe in digital freedom and privacy and so we built -a proof-of-work based CAPTCHA system that doesn’t track. Seriously, no -tracking. But that isn’t the killer feature, our system doesn’t require -the user to pick cars or ID sidewalks — our system does it’s -thing(usually at the click of a button) and gets out of the way.

-

Philosophy

-

Man has has come so far only because our ancestors chose to share their -knowledge with others. If everything was labeled intellectual property, -we might still be stuck in Stone Age. The idea of intellectual property -is alien to us. For this reason, all of our source code is freely -available(both as in freedom and beers) at our GitHub.

-

People

- - -

Edit this page on git.batsense.net

- -
-
- -
-
- - - - - - - - - diff --git a/blog/december-2021-monthly-report/index.html b/blog/december-2021-monthly-report/index.html deleted file mode 100644 index cc96dda..0000000 --- a/blog/december-2021-monthly-report/index.html +++ /dev/null @@ -1,249 +0,0 @@ - - - - - - - - - - - - - - December, 2021: Monthly Report - mCaptcha - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
-
- -
- -
- -
-
-

December, 2021: Monthly Report

-

Posted December 23, 2021 by Aravinth Manivannan ‐ 2 min read

-

Last Edited June 14, 2022

- -

-

We are mCaptcha. We build kickass CAPTCHA systems that give (DDoS) attackers a run for their money. And we do all of this without tracking your users. Oh and did I mention our UX is great?

-

Hello and welcome to the first edition of the monthly report!

-

I believe free software like mCaptcha is critical to a healthy internet -but being a one-person show, there’s hardly any accountability in the -way software is built. I hope, through monthly reports, I can explain -the logic and intentions behind decisions taken in the development -process.

-

This month, the following things were accomplished:

-

1. Full LibreJS Compliance

-

The CAPTCHA widget and the admin dashboard are 100% LibreJS compliant!

-
- Screenshot of mCaptcha admin dashboard with GNU LibreJS extension's report in frame.LibreJS reports that all scripts in this webpage are accepted(and hence free software) and are licensed under the AGPL license. - -
LibreJS report of the dashboard webpage
-
-
- Screenshot of mCaptcha client-side widget(I'm-not-a-robot widget) with GNU LibreJS extension's report in frame. LibreJS reports that all scripts in this webpage are accepted(and hence free software) and are licensed under the X11(aka MIT license). It should also detect the Apache licensing but I probably botched it up. - -
LibreJS report of the CAPTCHA widget webpage
-
-

2. JavaScript PolyFill

-

mCaptcha relied on a WebAssembly(WASM) port of the proof-of-work -algorithm used in mCaptcha. This meanth browsers without WASM support -couldn’t process CAPTCHAs. This month, a pure JavaScript(TypeScript, -technically) implementation - was released to -overcome this limitation.

-

3. Integration libraries for Vanilla JS, React and Svelte:

-

To make migration from existing CAPTCHA deployments to mCaptha, -integration libraries for Vanilla -JS, React -Js and -Svelte with -similar APIs very similar to that of Google’s reCAPTCHA and Cloudflare’s -hCaptcha.

- -

4. Beginner friendly CAPTCHA configuration options.

-

The original configuration panel offers a comprehensive but daunting -task for folks that are justgetting started with mCaptcha.

-
- Screenshot of mCaptcha admin dashboard CAPTCHA creation form with advance configuration options - -
CAPTCHA creation with advance configuration options
-
-

A new CAPTCHA creation format is rolled out which generates a -configuration from familiar metrics like average, peak and traffic that -took the user’s website down.

-
- Screenshot of mCaptcha admin dashboard CAPTCHA creation form with easy configuration options - -
CAPTCHA creation with easy configuration options
-
-

Of course, the advance option is available and can always be swished to -at any moment!

- -
- - -

Edit this page on git.batsense.net

- -
-
- -
-
- - - - - - - - - diff --git a/blog/february-2023-monthly-report/index.html b/blog/february-2023-monthly-report/index.html deleted file mode 100644 index 2970ff8..0000000 --- a/blog/february-2023-monthly-report/index.html +++ /dev/null @@ -1,223 +0,0 @@ - - - - - - - - - - - - - - February, 2023: Monthly Report - mCaptcha - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
-
- -
- -
- -
-
-

February, 2023: Monthly Report

-

Posted March 8, 2023 by Aravinth Manivannan ‐ 2 min read

-

Last Edited March 9, 2023

- -

-

We are mCaptcha. We build kickass CAPTCHA systems that give (DDoS) attackers a run for their money. And we do all of this without tracking your users. Oh and did I mention our UX is great?

-

Hello and welcome to the (August 2022 to) February, 2023 monthly report!

-

TL;DR

-

Gusted and I secured funding from NLnet to work -on mCaptcha in 2023, we suffered an outage from 15 January to February -6, polyfill benchmarking support in mCaptcha

-

We have funding!

-

Gusted and I applied and secured funding through -2023 development is funded through the NGI0 -Entrust Fund, via NLnet.

-

The full list of tasks that we’ll be working on in the period is is -available -here.

-

Infrastructure outage: 15 January, 2023 to February 6, 2023

-

A hard disk on of the servers hosting mCaptcha infrastructure failed, -which caused the outage. Fixing the hard disk lead to additional -problems, the fan on that server was failing and we couldn’t get spares -sooner.

-

We had current backups, so there was no data loss.

-

Going forward, we are planning to create Infrastructure-as-Code to fully -restore all mCaptcha infrastructure, so that in the even of an outage, -we could restore our infrastructure in much shorter duration.

-

mCaptcha/survey now includes polyfill benchmarking

-

mCaptcha/survey runs benchmarks with mCaptcha’s PoW algorithm to collect -statistics on how mCaptcha performs on various browsers and devices. So -far, we’ve only been running benchmarks with the WebAssembly -implementation. This pull request added support for running benchmarks -with the JavaScript polyfill implementation on browsers without -WebAssembly support.

- -
- - -

Edit this page on git.batsense.net

- -
-
- -
-
- - - - - - - - - diff --git a/blog/index.html b/blog/index.html deleted file mode 100644 index 769ed56..0000000 --- a/blog/index.html +++ /dev/null @@ -1,232 +0,0 @@ - - - - - - - - - - - - - - Blog - mCaptcha - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
-
- -
-
-
-

Blog

-
-
-
-
-

Testing on screenreaders

-

A network of mCaptcha instances sharing PoW stats to make mCaptcha more efficient and accessible

-

Posted February 10, 2024 by Aravinth Manivannan ‐ 1 min read

-

Last Edited February 12, 2024

-

-
-
-
-

Introducing mCaptcha net

-

A network of mCaptcha instances sharing PoW stats to make mCaptcha more efficient and accessible

-

Posted October 19, 2023 by Aravinth Manivannan ‐ 2 min read

-

Last Edited October 21, 2023

-

-
-
-
-

February, 2023: Monthly Report

-

Gusted and I secured funding from NLnet to work on mCaptcha in 2023, we suffered an outage from 15 January to February 6, polyfill benchmarking support in mCaptcha

-

Posted March 8, 2023 by Aravinth Manivannan ‐ 2 min read

-

Last Edited March 9, 2023

-

-
-
-
-

July, 2022: Monthly Report

-

Codeberg is trying out mCaptcha, Gitea is getting mCaptcha support, mCaptcha supports MariaDB, I've applied for NLnet and Open Tech Fund, documentation is updated: tutorials and glossary is added and glue libraries have new releases.

-

Posted August 4, 2022 by Aravinth Manivannan ‐ 2 min read

-

Last Edited March 23, 2024

-

-
-
-
-

June, 2022: Monthly Report

-

mCaptcha is successfully incorporated in India and ideas for mCaptcha commercial operations

-

Posted July 7, 2022 by Aravinth Manivannan ‐ 2 min read

-

Last Edited July 7, 2022

-

-
-
-
-

May, 2022: Monthly Report

-

Python bindings to mCaptcha PoW, DDoS effectiveness measurement, major refactoring to prepare for support for other databases, We also tried to test its DoS defence effectiveness, and some exciting news regarding managed hosting!

-

Posted June 10, 2022 by Aravinth Manivannan ‐ 4 min read

-

Last Edited June 14, 2022

-

-
-
-
-

December, 2021: Monthly Report

-

New features, improved accessibility and software integrations

-

Posted December 23, 2021 by Aravinth Manivannan ‐ 2 min read

-

Last Edited June 14, 2022

-

-
-
-
-

Survey

-

We are conducting a survey to benchmark and gather performance metrics of our system on various devices

-

Posted October 28, 2021 by Aravinth Manivannan ‐ 1 min read

-

Last Edited December 23, 2021

-

-
-
-
-

PoW performance

-

PoW performance of native and WASM implementations. Does the native implementation have and edge over the WASM library?

-

Posted September 1, 2021 by Aravinth Manivannan ‐ 2 min read

-

Last Edited September 1, 2021

-

-
-
-
-

Say hello to mCaptcha

-

Introducing mCaptcha, a kickass CAPTCHA systems that gives (DDoS) attackers a run for their money. Oh and UX is great too!

-

Posted May 26, 2021 by Aravinth Manivannan ‐ 2 min read

-

Last Edited December 2, 2021

-

-
-
-
-
-
- -
-
- - - - - - - - - diff --git a/blog/index.xml b/blog/index.xml deleted file mode 100644 index 5d4c33f..0000000 --- a/blog/index.xml +++ /dev/null @@ -1,81 +0,0 @@ - - - - Blog on - //localhost:1313/blog/ - Recent content in Blog on - Hugo - en-US - - - Testing on screenreaders - //localhost:1313/blog/testing-on-screenreaders/ - Sat, 10 Feb 2024 00:00:00 +0000 - //localhost:1313/blog/testing-on-screenreaders/ - <p><a href="www.han.nl">HAN University of Applied Sciences</a> kindly did an accessibility test of the mCaptcha widget and the showcase site, which features a real world integration of mCaptcha in a third-party service. The report motived us to make screen reader testing an integral part of the release process.</p> <p>Here are the results:</p> <h2 id="android-in-built-screen-reader-on-fennec">Android in-built screen reader on Fennec</h2> <iframe title="Testing mCaptcha on Android screenreader with Fennec browser" width="560" height="315" src="https://peertube.batsense.net/videos/embed/e9579d73-b19e-4051-9337-8432fc15c3b3" frameborder="0" allowfullscreen="" sandbox="allow-same-origin allow-scripts allow-popups"></iframe> <h2 id="nvda-on-microsoft-windows-and-mozilla-firefox">NVDA on Microsoft Windows and Mozilla Firefox</h2> <iframe title="Testing mCaptcha on NVDA screen reader on MS Windows with Mozilla Firefox browser" width="560" height="315" src="https://peertube.batsense.net/videos/embed/cf534270-8089-4aad-95b3-543c467a6a12" frameborder="0" allowfullscreen="" sandbox="allow-same-origin allow-scripts allow-popups"></iframe> <h2 id="macos-in-built-screen-reader-on-google-chrome">macOS in-built screen reader on Google Chrome</h2> <iframe title="Testing mCaptcha on macOS in-built screen reader and Google Chrome browser" width="560" height="315" src="https://peertube.batsense.net/videos/embed/45be4f8c-1978-4650-b9f1-972cfead8420" frameborder="0" allowfullscreen="" sandbox="allow-same-origin allow-scripts allow-popups"></iframe> <h2 id="ios-in-built-screen-reader-on-safari">iOS in-built screen reader on Safari</h2> <iframe title="Testing mCaptcha on iOS screenreader with Safari" width="560" height="315" src="https://peertube.batsense.net/videos/embed/ac9722a4-3dce-4c40-bb0c-7bc8d721c3db" frameborder="0" allowfullscreen="" sandbox="allow-same-origin allow-scripts allow-popups"></iframe> - - - Introducing mCaptcha net - //localhost:1313/blog/introducing-mcaptcha-net/ - Thu, 19 Oct 2023 00:00:00 +0000 - //localhost:1313/blog/introducing-mcaptcha-net/ - <p>mCaptcha uses a Proof-of-Work (PoW) based algorithm to offer Denial-of-Service protection, because of <a href="https://www.w3.org/TR/turingtest/#proof-of-work">its excellent accessibility characteristics</a>. PoW within mCaptcha is configuration &mdash; webmasters can configure <a href="//localhost:1313/docs/terminology/difficulty-factor">difficulty factors</a> for their installations, which determines waiting time for visitors. But PoW can become inaccessible if webmasters choose a very high difficulty factor. So they have to maintain a balance which imposes sufficient load on DDoS attackers while also being accessible to common folk.</p> - - - February, 2023: Monthly Report - //localhost:1313/blog/february-2023-monthly-report/ - Wed, 08 Mar 2023 00:00:00 +0000 - //localhost:1313/blog/february-2023-monthly-report/ - <p>Hello and welcome to the (August 2022 to) February, 2023 monthly report!</p> <h2 id="tldr">TL;DR</h2> <p><em><a href="https://gusted.xyz">Gusted</a> and I secured funding from NLnet to work on mCaptcha in 2023, we suffered an outage from 15 January to February 6, polyfill benchmarking support in mCaptcha</em></p> <h2 id="we-have-funding">We have funding!</h2> <p><a href="https://gusted.xyz">Gusted</a> and I applied and secured funding through 2023 development is funded through the <a href="https://nlnet.nl/entrust">NGI0 Entrust</a> Fund, via <a href="https://nlnet.nl">NLnet</a>.</p> - - - July, 2022: Monthly Report - //localhost:1313/blog/july-2022-monthly-report/ - Thu, 04 Aug 2022 00:00:00 +0000 - //localhost:1313/blog/july-2022-monthly-report/ - <p>Hello and welcome to the July, 2022 monthly report!</p> <h2 id="tldr">TL;DR</h2> <p><em>Codeberg is trying out mCaptcha, Gitea is getting mCaptcha support, mCaptcha supports MariaDB, I&rsquo;ve applied for NLnet and Open Tech Fund, documentation is updated: tutorials and glossary is added and glue libraries have new releases.</em></p> <h2 id="codeberg-is-deploying-mcaptcha">Codeberg is deploying mCaptcha</h2> <p>Codeberg is committed to trying out mCaptcha to make their platform more accessible: they currently use a text-based CAPTCHA, which will be replaced by mCaptcha. The decision was finalized after I presented mCaptcha to them at a meeting their organized. Please see <a href="https://batsense.net/talks/codeberg-introducing-mcaptcha/">here</a> for slides.</p> - - - June, 2022: Monthly Report - //localhost:1313/blog/june-2022-monthly-report/ - Thu, 07 Jul 2022 00:00:00 +0000 - //localhost:1313/blog/june-2022-monthly-report/ - <p>Hello and welcome to the June 2022 edition of the monthly report!</p> <h2 id="mcaptcha-is-incorporated">mCaptcha is incorporated!</h2> <p>I spent June doing non-technical tasks but I made significant progress: I had been trying to do it since summer 2021, but I faced various setbacks along the way. A family friend, who is also an auditor helped me finally get mCaptcha incorporated!</p> <p>And we&rsquo;ve already filed successfully filed the first tax return too!</p> - - - May, 2022: Monthly Report - //localhost:1313/blog/may-2022-monthly-report/ - Fri, 10 Jun 2022 00:00:00 +0000 - //localhost:1313/blog/may-2022-monthly-report/ - <p>Hello and welcome to the May 2022 edition of the monthly report!</p> <p>mCaptcha, for a while was showing all the signs of a dead project: no commits on the repositories and no monthly updates. But the project is far from dead!</p> <h2 id="python-bindings-to-mcaptcha-powhttpsgithubcommcaptchapow_sha256">Python bindings to <a href="https://github.com/mCaptcha/pow_sha256/">mCaptcha PoW</a></h2> <p><a href="https://github.com/mCaptcha/pow_py">pow_py</a> contains bindings to <a href="https://github.com/mCaptcha/pow_sha256">pow_sha256</a>, the <a href="https://en.wikipedia.org/wiki/Proof_of_work">proof-of-work</a> library that mCaptcha uses. For the uninitiated, the bindings allow for python programs to automatically solve mCaptcha.</p> - - - December, 2021: Monthly Report - //localhost:1313/blog/december-2021-monthly-report/ - Thu, 23 Dec 2021 00:00:00 +0000 - //localhost:1313/blog/december-2021-monthly-report/ - <p>Hello and welcome to the first edition of the monthly report!</p> <p>I believe free software like mCaptcha is critical to a healthy internet but being a one-person show, there&rsquo;s hardly any accountability in the way software is built. I hope, through monthly reports, I can explain the logic and intentions behind decisions taken in the development process.</p> <p>This month, the following things were accomplished:</p> <h2 id="1-full-librejs-compliance">1. Full LibreJS Compliance</h2> <p>The CAPTCHA widget and the admin dashboard are 100% LibreJS compliant!</p> - - - Survey - //localhost:1313/blog/survey/ - Thu, 28 Oct 2021 00:00:00 +0000 - //localhost:1313/blog/survey/ - <p><strong>Survey link:</strong> <a href="https://survey.mcaptcha.org/survey/campaigns/b717e51e-24d4-4ab6-912f-de2dfe3ce1fe/about">https://survey.mcaptcha.org/survey/campaigns/b717e51e-24d4-4ab6-912f-de2dfe3ce1fe/about</a></p> <p><strong>NOTE:</strong> The survey(at least, the lucky draw is temporarily suspended due to some logistical reasons. Apologies for any inconvenience caused.</p> <p>mCaptcha relies on a <a href="https://en.wikipedia.org/wiki/Proof_of_work">proof-of-work(PoW)</a> mechanism to guard against bots. In order for this to be effective, the difficulty factor should be configured properly. If the difficulty factor is too high all the time, it will inconvenience the users and if it&rsquo;s too low during attack, the defence will be weak.</p> - - - PoW performance - //localhost:1313/blog/pow-performance/ - Wed, 01 Sep 2021 00:00:00 +0000 - //localhost:1313/blog/pow-performance/ - <p>mCaptcha uses a <a href="https://en.wikipedia.org/wiki/Proof_of_work">proof-of-work(PoW)</a> mechanism to rate limit users or potential bots. In order for this to be effective, the PoW should be configured properly. The difficulty requirement can&rsquo;t be too high, as it could cause accessibility issues on the client-side while at the same time, it shouldn&rsquo;t be too low, as it wouldn&rsquo;t offer proper protection against bots.</p> <p>Malicious bots(the ones that wreak havoc), run native code which is capable of running in a multi-threaded context. This creates an unfair advantage for crackers using these bots over legitimate users, who usually use browsers to access a website.</p> - - - Say hello to mCaptcha - //localhost:1313/blog/say-hello-to-mcaptcha/ - Wed, 26 May 2021 00:00:00 +0000 - //localhost:1313/blog/say-hello-to-mcaptcha/ - <p>At mCaptcha, we believe in digital freedom and privacy and so we built a <a href="https://en.wikipedia.org/wiki/Proof_of_work">proof-of-work</a> based CAPTCHA system that doesn&rsquo;t track. Seriously, no tracking. But that isn&rsquo;t the killer feature, our system doesn&rsquo;t require the user to pick cars or ID sidewalks &mdash; our system does it&rsquo;s thing(usually at the click of a button) and gets out of the way.</p> <h2 id="how-does-it-work">How does it work?</h2> <p>mCaptcha uses SHA256 based proof-of-work(PoW) to rate limit users.</p> - - - diff --git a/blog/introducing-mcaptcha-net/index.html b/blog/introducing-mcaptcha-net/index.html deleted file mode 100644 index f2cb571..0000000 --- a/blog/introducing-mcaptcha-net/index.html +++ /dev/null @@ -1,252 +0,0 @@ - - - - - - - - - - - - - - Introducing mCaptcha net - mCaptcha - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
-
- -
- -
- -
-
-

Introducing mCaptcha net

-

Posted October 19, 2023 by Aravinth Manivannan ‐ 2 min read

-

Last Edited October 21, 2023

- -

-

-

mCaptcha uses a Proof-of-Work (PoW) based algorithm to offer -Denial-of-Service protection, because of its excellent accessibility -characteristics. PoW -within mCaptcha is configuration — webmasters can configure -difficulty factors for their -installations, which determines waiting time for visitors. But PoW can -become inaccessible if webmasters choose a very high difficulty factor. -So they have to maintain a balance which imposes sufficient load on DDoS -attackers while also being accessible to common folk.

- -

To help webmasters correctly configure difficult factors, we are -building a feedback loop which would gather performance statistics from -voluntary mCaptcha installations and make them available to other -mCaptcha installations. The performance statistics can be used by all -mCaptcha instances to automatically optimize an installation. We are -calling this the mCaptcha net.

-

Participation is optional

-

Participation in the mCaptcha net is disabled by default and is -optional as it has privacy implications: it will reveal the -existence of an mCaptcha instance.

-

The admins of mCaptcha instances can choose to upload truly anonymous -PoW performance statistics to a number of mCaptcha/survey instances. -The data uploaded is public and so is accessible to all mCaptcha -instances.

-

We also offer opt-in controls at installation level:

-
- A screenshot of the 'add sitekey' form on the mCaptcha dashboard with a checkbox for anonymously publishing performance statistics. It is not checked by default. - -
Add sitekey form on the mCaptcha dashboard with a checkbox for anonymously publishing performance statistics. It is not checked by default.
-
-

Ensuring anonymity

-

mCaptcha doesn’t fingerprint its users. Performance parameters include:

-
    -
  1. Time taken to generate PoW
  2. -
  3. The difficulty factor for which the PoW was computed
  4. -
  5. Type of client library used.
  6. -
-
1"time":14,
-2"difficulty_factor":50000,
-3"worker_type":"wasm"
-

This doesn’t include the usual fingerprinting parameters like -User-Agent, cookies, and IP address. Additionally, we use pseudo IDs -at both mCaptcha/mCaptcha and mCaptcha/survey to avoid exposing installations.

-
- A screenshot of a tmux window with logs of mCaptcha/mCaptcha and mCapctha/survey showing both of them talking to eachother - -
mCaptcha/mCaptcha uploading performance statistics to a mCaptcha/survey instance
-
-

Status

-

We now have performance statistics uploads to mCaptcha/survey instances -working. Pull request mCaptcha/mCaptcha#92 -added abilities to mCaptcha to upload statistics to mCaptcha/survey instances and -mCaptcha/survey#40 enable survey to process the uploaded data. We will soon build a -self-tuning algorithm within mCaptcha to use this data and optimize -installations automatically.

- -
- - -

Edit this page on git.batsense.net

- -
-
- -
-
- - - - - - - - - diff --git a/blog/july-2022-monthly-report/index.html b/blog/july-2022-monthly-report/index.html deleted file mode 100644 index e480e38..0000000 --- a/blog/july-2022-monthly-report/index.html +++ /dev/null @@ -1,261 +0,0 @@ - - - - - - - - - - - - - - July, 2022: Monthly Report - mCaptcha - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
-
- -
- -
- -
-
-

July, 2022: Monthly Report

-

Posted August 4, 2022 by Aravinth Manivannan ‐ 2 min read

-

Last Edited March 23, 2024

- -

-

We are mCaptcha. We build kickass CAPTCHA systems that give (DDoS) attackers a run for their money. And we do all of this without tracking your users. Oh and did I mention our UX is great?

-

Hello and welcome to the July, 2022 monthly report!

-

TL;DR

-

Codeberg is trying out mCaptcha, Gitea is getting mCaptcha support, -mCaptcha supports MariaDB, I’ve applied for NLnet and Open Tech Fund, -documentation is updated: tutorials and glossary is added and glue libraries -have new releases.

-

Codeberg is deploying mCaptcha

-

Codeberg is committed to trying out mCaptcha to make their platform more -accessible: they currently use a text-based CAPTCHA, which will be -replaced by mCaptcha. The decision was finalized after I presented -mCaptcha to them at a meeting their organized. Please see -here for -slides.

-

Gitea gets mCaptcha support

-

@Gusted from Codeberg is working on integrating -mCaptcha in Gitea so that Codeberg can deploy it. Please see -here for related the -pull request.

-

This project is yet to see usage, so we are venturing into uncharted -territory: should you face issues with either deploying or -integrating mCaptcha, please feel free to reach out.

-

mCaptcha supports MariaDB:

-

Codeberg uses MariaDB. To facilitate Codeberg deployment, I implemented -support for MariaDB. The work done in -May, 2022 made -implementing support easy. Support for MariaDB is first class in -mCaptcha: automatic testing exist to run tests with both Postgres and -MariaDB, so I expect things to be stable.

-

Applied for Funding: NLnet and Open Tech Fund

-

I’ve applied for NLnet and Open Tech Fund[0], Please find the -applications -here -and -here -respectively.

-

If funding is granted:

-
    -
  1. I’ll be able to work full-time for a year at the rate of 2,000 EUR/month
  2. -
  3. We’ll have a dedicated build server
  4. -
  5. We’ll have funds to run a DDoS test to gauge mCaptcha’s effectiveness
  6. -
-

Documentation updates

-

mCaptcha docs over the months have become inconsistent and incorrect. I -cleaned up some of the mess and added a -tutorial to help folks install -mCaptcha on their website. The docs also gets a -glossary, which contain explanations -to mCaptcha jargon.

-

New releases: glue libraries

-

0.1.0-alpha-2 for -vanilla, -react and -svelte glue -libraries were released. They now hand over widget sizing to the client -code(associated PR).

-

Footnotes

-
    -
  • [0]: Special thanks to -@humantech for his thoughtful -reviews and to @dachary for pointing me towards -OTF.
  • -
- -
- - -

Edit this page on git.batsense.net

- -
-
- -
-
- - - - - - - - - diff --git a/blog/june-2022-monthly-report/index.html b/blog/june-2022-monthly-report/index.html deleted file mode 100644 index 0db4e68..0000000 --- a/blog/june-2022-monthly-report/index.html +++ /dev/null @@ -1,227 +0,0 @@ - - - - - - - - - - - - - - June, 2022: Monthly Report - mCaptcha - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
-
- -
- -
- -
-
-

June, 2022: Monthly Report

-

Posted July 7, 2022 by Aravinth Manivannan ‐ 2 min read

-

Last Edited July 7, 2022

- -

-

We are mCaptcha. We build kickass CAPTCHA systems that give (DDoS) attackers a run for their money. And we do all of this without tracking your users. Oh and did I mention our UX is great?

-

Hello and welcome to the June 2022 edition of the monthly report!

-

mCaptcha is incorporated!

-

I spent June doing non-technical tasks but I made significant -progress: I had been trying to do it since summer 2021, but I faced -various setbacks along the way. A family friend, who is also an auditor -helped me finally get mCaptcha incorporated!

-

And we’ve already filed successfully filed the first tax return too!

-

GSTIN

-
33DGKPA2253J1ZN
-

Ideas for Commercial Operations

-

Commercial operations will take a while longer(end of 2022, most -probably). For Hostea, I wrote a dashboard with -payments capabilities(via Stripe) so that experience will help me do the -same for mCaptcha. Working on Hostea has been truly enlightening: it’s -probably the first effort to offer a fully libre, infrastructure-as-code -and payments software included, hosting service. I would like to do the -same for mCaptcha so that service that I setup goes rogue or if someone -wants to offer mCaptcha hosted services, they can replicate my set up -with ease.

-

But the commercial offering will at no point force me or future -maintainers turn mCaptcha into adopting a non-free license like the -Server Side Public -License. -So the following months will see administrative changes within mCaptcha -to device mechanisms to prevent me or any future party with influence in -mCaptcha development from hurting the project by it non-free.

-

Hostea is also an experiment in Free Software commercial operations, so -naturally I’m highly impressed by the ideas that are being discussed -there. mCaptcha, too, will borrow ideas from that project to make its -development economically sustainable.

- -
- - -

Edit this page on git.batsense.net

- -
-
- -
-
- - - - - - - - - diff --git a/blog/may-2022-monthly-report/index.html b/blog/may-2022-monthly-report/index.html deleted file mode 100644 index 9c5fc57..0000000 --- a/blog/may-2022-monthly-report/index.html +++ /dev/null @@ -1,333 +0,0 @@ - - - - - - - - - - - - - - May, 2022: Monthly Report - mCaptcha - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
-
- -
- -
- -
-
-

May, 2022: Monthly Report

-

Posted June 10, 2022 by Aravinth Manivannan ‐ 4 min read

-

Last Edited June 14, 2022

- -

-

We are mCaptcha. We build kickass CAPTCHA systems that give (DDoS) attackers a run for their money. And we do all of this without tracking your users. Oh and did I mention our UX is great?

-

Hello and welcome to the May 2022 edition of the monthly report!

-

mCaptcha, for a while was showing all the signs of a dead project: -no commits on the repositories and no monthly updates. But the project -is far from dead!

-

Python bindings to mCaptcha PoW

-

pow_py contains bindings to -pow_sha256, the -proof-of-work library -that mCaptcha uses. For the uninitiated, the bindings allow for python -programs to automatically solve mCaptcha.

-

So if you are writing a script to do some chore on your favourite -website that is protected by mCaptcha, you can now solve the mCaptcha -automatically from within the program.

-

Here’s an example:

-
 1import os
- 2
- 3import mcaptcha_pow_py
- 4import requests
- 5
- 6# get the sitekey that is used in the mCaptcha protected form
- 7SITEKEY = os.getenv("MCAPTCHA_CAPTCHA_SITEKEY")
- 8# the hostname of the mCaptcha instance that the form is using
- 9MCAPTCHA_HOST = os.getenv("MCAPTCHA_CAPTCHA_HOST")
-10
-11
-12GET_CONFIG_ROUTE = f"{MCAPTCHA_HOST}/api/v1/pow/config"
-13VERIFY_POW_ROUTE = f"{MCAPTCHA_HOST}/api/v1/pow/verify"
-14
-15def solve_captcha():
-16
-17    # get challenge configuration
-18    key = {"key": sitekey}
-19    challenge_config = requests.post(GET_CONFIG_ROUTE, json=key)
-20    challenge_config = challenge_config.json()
-21
-22    # extract configuration data
-23    config = mcaptcha_pow_py.PoWConfig(challenge_config["salt"])
-24    pow_string = challenge_config["string"]
-25    pow_difficulty_factor = challenge_config["difficulty_factor"]
-26
-27    # generate work
-28    work = config.work(pow_string, pow_difficulty_factor)
-29
-30    # verify PoW
-31    proof = {
-32        "key": SITEKEY,
-33        "nonce": work.nonce,
-34        "result": work.result,
-35        "string": challenge_config["string"],
-36    }
-37    resp = requests.post(VERIFY_POW_ROUTE, json=proof)
-38    resp = resp.json()
-39
-40    # extract verification token
-41    token = resp["token"]
-42
-43    return token
-44
-45
-46token = solve_captcha()
-47data = {
-48    "username": "me",
-49    "password": "superlongpassword",
-50    "confirm_password": "superlongpassword",
-51    "mcaptcha__token": token,
-52}
-53response = requests.post("/mCaptcha-protected-form", data=data)
-

This could be missed for building DDoS bots(more on that -here) but this could also be -used to make CAPTCHA solving automated within screen readers and other -accessibility devices!

-

Measuring DDoS protection effectiveness

-

Proof-of-work has historically been a good method to achieve rate -limiting but how much attack can it, specifically mCaptcha’s -implementation, withstand when compared to an unprotected endpoint? To -find out, we used the recently created Python bindings to the mCaptcha -PoW library, the excellent load testing tool, -locust and wrote -mCaptcha/dos!

-

VIT AP kindly permitted me, @realaravinth, to use their network -security lab for setting up a isolated, contained testing environment to -mount a DDoS attack on a test -server -instance.

-

The initial topology consisted of one mCaptcha instance, one DDoS demo -server, one locust node running in leader configuration and six locust -nodes running in follower configuration. I was authorised to use the -netsec lab for three days, which unfortunately wasn’t enough to go -finish running the experiment. Dr. Sibi Chakkaravarthy -Sethuraman has kindly offered to -arrange authorisation to use the netsec lab once again in July 2022, -during which I hope to finish running the experiment

-

Special thanks to ackr-8 and -alan2000alex for help with setting up -infrastructure of the experiment.

-

Refactor

-

mCaptcha underwent a major refactor during the month of May: We re-wrote -and cleaned up all database-related stuff for higher flexibility -and generally good architecture. This refactor lays the foundation -for implementing support for alternate database software -programs(we currently support PostgreSQL only).

-

mCaptcha is now on the Fediverse

-

We recently joined the Fediverse on a -GoToSocial instance run by -@realaravinth. We’ll soon be deleting our Twitter account in favour of -the Fediverse account.

-

Fediverse account: -@mCaptcha@batsense.net

-

Generic hosting

-

I, @realaravinth, have been busy with ForgeFlux -and Hostea — both of which are software -forge related and so -when usable, will mostly improve the Free Software ecosystem. Hostea is -a project that aims to create a libre software development ecosystem and -provide managed hosting for the same. The project is built by a -horizontal community, which allows for multiple service providers who -adhere to the Hostea policies to operate -under the Hostea umbrella — essentially allowing for the creation of -smaller, highly localised cooperatives.

-

Cooperatives are interesting, and we believe that mCaptcha, too, can -benefit from such an architecture as it will prevent any one party from -single-handedly sabotaging the project. The experience gained from -Hostea will be reused in providing managed hosting for mCaptcha.

-

By the end of this year, mCaptcha will reorganise into a horizontal -community and adopt radical transparency to improve trust and -reliability of the project

-
-

P.S: I, realaravinth, would do it sooner but I’m a little busy right -now, so if someone is interested to help out do reach out and so that -we could do it sooner!

-
-

In context of mCaptcha, radical transparency will include all decisions -publicly made, funding and expenses publicly documented, and all -collaborations, too, publicly documented. This of course doesn’t imply -that private, personally identifiable information(addresses and phone -numbers, for instance) will be publicly disclosed. Such information will -be redacted and published.

- -
- - -

Edit this page on git.batsense.net

- -
-
- -
-
- - - - - - - - - diff --git a/blog/pow-performance/index.html b/blog/pow-performance/index.html deleted file mode 100644 index 70d8fdb..0000000 --- a/blog/pow-performance/index.html +++ /dev/null @@ -1,416 +0,0 @@ - - - - - - - - - - - - - - PoW performance - mCaptcha - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
-
- -
- -
- -
-
-

PoW performance

-

Posted September 1, 2021 by Aravinth Manivannan ‐ 2 min read

-

Last Edited September 1, 2021

- -

-

We are mCaptcha. We build kickass CAPTCHA systems that give (DDoS) attackers a run for their money. And we do all of this without tracking your users. Oh and did I mention our UX is great?

-

mCaptcha uses a -proof-of-work(PoW) mechanism -to rate limit users or potential bots. In order for this to be -effective, the PoW should be configured properly. The difficulty -requirement can’t be too high, as it could cause accessibility issues on -the client-side while at the same time, it shouldn’t be too low, as it -wouldn’t offer proper protection against bots.

-

Malicious bots(the ones that wreak havoc), run native code which is -capable of running in a multi-threaded context. This creates an unfair -advantage for crackers using these bots over legitimate users, who -usually use browsers to access a website.

-

I wanted to see how much of an advantage a native program would have -over our WASM library.

-

Benchmark tools

-

So I wrote these to compare native and WASM performances:

- - -

Results

-

The tests were run on my development machine featuring an Intel Core -i7-9750h.

-

Native

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
DifficultyRealUserSys
5000000m0.220s0m0.197s0m0.006s
10000000m0.203s0m0.203s0m0.000s
15000000m0.198s0m0.198s0m0.000s
20000000m0.203s0m0.203s0m0.000s
25000000m0.758s0m0.752s0m0.003s
30000000m0.776s0m0.769s0m0.003s
35000000m2.010s0m1.998s0m0.000s
40000000m2.038s0m2.033s0m0.003s
45000000m2.014s0m2.013s0m0.000s
-

Browser

-

I ran the tests on both Firefox and Chromium to compare results

-

Firefox

-
    -
  • User Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Firefox/91.0
  • -
  • Hardware concurrency: 12
  • -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
DifficultyDuration(in ms)
500000401
1000000413
1500000398
2000000394
25000001495
30000001556
35000003971
40000004235
45000004116
-
-

To be fair, my Firefox installation is loaded with a gazillion -extensions while the Chromium instance is clean, as I don’t use it -much

-
-

Chromium

-
    -
  • User Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36
  • -
  • Hardware concurrency: 12
  • -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
DifficultyDuration(in ms)
500000399.40000000037253
1000000354.6000000014901
1500000351.19999999925494
2000000353.80000000074506
25000001337.800000000745
30000001311.199999999255
35000003417.5999999996275
40000003488.800000000745
45000003458.2999999988824
-

Conclusion

-

At the highest difficulty factor, the native implementation was a almost second -faster than the WASM library. But the fact that both of them were able -to run to completion in under 5 seconds is impressive!

-

So, in my opinion, native implementation is only slightly faster than -the WASM library and for all intents and purposes, this shouldn’t matter -much.

-
-

P.S Work is underway to benchmark multiple platforms. A detailed report -will be published when that data is available.

-

For this post, I asked some of my friends to run the tests on their -computers. The results slightly varied but even the slowest case -generated proof for 4500000 difficulty(the highest in this test), in under -15 seconds!

- -
- - -

Edit this page on git.batsense.net

- -
-
- -
-
- - - - - - - - - diff --git a/blog/say-hello-to-mcaptcha/index.html b/blog/say-hello-to-mcaptcha/index.html deleted file mode 100644 index 8865206..0000000 --- a/blog/say-hello-to-mcaptcha/index.html +++ /dev/null @@ -1,255 +0,0 @@ - - - - - - - - - - - - - - Say hello to mCaptcha - mCaptcha - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
-
- -
- -
- -
-
-

Say hello to mCaptcha

-

Posted May 26, 2021 by Aravinth Manivannan ‐ 2 min read

-

Last Edited December 2, 2021

- -

-

We are mCaptcha. We build kickass CAPTCHA systems that give (DDoS) attackers a run for their money. And we do all of this without tracking your users. Oh and did I mention our UX is great?

-

At mCaptcha, we believe in digital freedom and privacy and so we built a -proof-of-work based -CAPTCHA system that doesn’t track. Seriously, no tracking. But that -isn’t the killer feature, our system doesn’t require the user to -pick cars or ID sidewalks — our system does it’s thing(usually -at the click of a button) and gets out of the way.

-

How does it work?

-

mCaptcha uses SHA256 based proof-of-work(PoW) to rate limit users.

-

When a user wants to do something on an mCaptcha-protected website,

-
    -
  1. -

    they will have to generate proof-of-work(a bunch of math that will -takes time to compute) and submit it to mCaptcha.

    -
  2. -
  3. -

    We’ll validate the proof:

    -
  4. -
-
    -
  • if validation is unsuccessful, they will be prevented from accessing -the destination website
  • -
  • if validation is successful, read on,
  • -
-
    -
  1. -

    They will be issued a token that should be submit along with the -request/form to the destination website.

    -
  2. -
  3. -

    The destination website validates the submitted token with -mCaptcha before processing the request.

    -
  4. -
-

The whole process is automated from the user’s point of view. All they -have to do is click on a button to initiate the process.

-

Okay, but what about bad actors?

-

mCaptcha makes interacting with websites (computationally)expensive for -the user. A well-behaving user will experience a slight delay(no delay -when under moderate load to 2-3 seconds when under attack; PoW difficulty is -variable) but if someone wants to hammer your site, they will have to do -more work to send requests than your server you will have to do to respond -to their request.

-

Why use mCaptcha?

-
    -
  • Free software, privacy focused
  • -
  • Seamless UX — No more annoying CAPTCHAs!
  • -
  • IP address independent: your users are behind a NAT? We got you covered!
  • -
  • Automatic bot throttling
  • -
  • Resistant to replay attacks: proof-of-work configurations have short lifetimes(30s) and can be used only once. If a user submits a PoW to an already used configuration or an expired one, their proof will be rejected.
  • -
-

How to migrate?

-

Our client libraries are mostly compatible with reCAPTCHA and hCaptcha. -A detailed guide will be published soon.

-

Our Philosophy

-

Man has has come so far only because our ancestors chose to -share their knowledge with others. If everything was labeled -intellectual property, we might still be stuck in Stone Age. The idea of -intellectual property is alien to us. For this reason, all of our source -code is freely available(both as in freedom and beers) at our -GitHub.

-

Resources

- - -
- - -

Edit this page on git.batsense.net

- -
-
- -
-
- - - - - - - - - diff --git a/blog/sitemap.xml b/blog/sitemap.xml deleted file mode 100644 index a5292f8..0000000 --- a/blog/sitemap.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - //localhost:1313/blog/testing-on-screenreaders/ - 2024-02-12T18:21:49+05:30 - weekly - 0.5 - - - - //localhost:1313/blog/introducing-mcaptcha-net/ - 2023-10-21T16:48:55+05:30 - weekly - 0.5 - - - - //localhost:1313/blog/february-2023-monthly-report/ - 2023-03-09T02:30:43+05:30 - weekly - 0.5 - - - - //localhost:1313/blog/july-2022-monthly-report/ - 2024-03-23T13:48:45+05:30 - weekly - 0.5 - - - - //localhost:1313/blog/june-2022-monthly-report/ - 2022-07-07T20:05:57+05:30 - weekly - 0.5 - - - - //localhost:1313/blog/may-2022-monthly-report/ - 2022-06-14T15:39:59+05:30 - weekly - 0.5 - - - - //localhost:1313/blog/december-2021-monthly-report/ - 2022-06-14T15:39:59+05:30 - weekly - 0.5 - - - - //localhost:1313/blog/survey/ - 2021-12-23T23:26:38+05:30 - weekly - 0.5 - - - - //localhost:1313/blog/pow-performance/ - 2021-09-01T15:33:12+05:30 - weekly - 0.5 - - - - //localhost:1313/blog/say-hello-to-mcaptcha/ - 2021-12-02T10:25:42+05:30 - weekly - 0.5 - - \ No newline at end of file diff --git a/blog/survey/index.html b/blog/survey/index.html deleted file mode 100644 index 32c9d8a..0000000 --- a/blog/survey/index.html +++ /dev/null @@ -1,215 +0,0 @@ - - - - - - - - - - - - - - Survey - mCaptcha - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
-
- -
- -
- -
-
-

Survey

-

Posted October 28, 2021 by Aravinth Manivannan ‐ 1 min read

-

Last Edited December 23, 2021

- -

-

We are mCaptcha. We build kickass CAPTCHA systems that give (DDoS) attackers a run for their money. And we do all of this without tracking your users. Oh and did I mention our UX is great?

-

Survey link: https://survey.mcaptcha.org/survey/campaigns/b717e51e-24d4-4ab6-912f-de2dfe3ce1fe/about

-

NOTE: The survey(at least, the lucky draw is temporarily suspended -due to some logistical reasons. Apologies for any inconvenience caused.

-

mCaptcha relies on a -proof-of-work(PoW) -mechanism to guard against bots. In order for this to be effective, the -difficulty factor should be configured properly. If the difficulty -factor is too high all the time, it will inconvenience the users and if -it’s too low during attack, the defence will be weak.

-

So we are conducting a survey to gather performance benchmarks from -various devices and browsers. The data collected from the survey will be made -public, we believe it will guide sysadmins configure difficulty factor -properly.

-

If you are interested in the lucky draw, please save the submission ID and the proof will be presented -to you at the end of the survey.

-
- survey lucky draw identifier credentials - -
Lucky draw credentials
-
-

Winners

-

This blog post will be updated with the winning submission IDs and the -winners should provide the matching proof to claim their rewards.

- -
- - -

Edit this page on git.batsense.net

- -
-
- -
-
- - - - - - - - - diff --git a/blog/testing-on-screenreaders/index.html b/blog/testing-on-screenreaders/index.html deleted file mode 100644 index 6ddafdc..0000000 --- a/blog/testing-on-screenreaders/index.html +++ /dev/null @@ -1,202 +0,0 @@ - - - - - - - - - - - - - - Testing on screenreaders - mCaptcha - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
-
- -
- -
- -
-
-

Testing on screenreaders

-

Posted February 10, 2024 by Aravinth Manivannan ‐ 1 min read

-

Last Edited February 12, 2024

- -

-

-

HAN University of Applied Sciences kindly did an -accessibility test of the mCaptcha widget and the showcase site, which -features a real world integration of mCaptcha in a third-party service. -The report motived us to make screen reader testing an integral part of -the release process.

-

Here are the results:

-

Android in-built screen reader on Fennec

- -

NVDA on Microsoft Windows and Mozilla Firefox

- -

macOS in-built screen reader on Google Chrome

- -

iOS in-built screen reader on Safari

- - -
- - -

Edit this page on git.batsense.net

- -
-
- -
-
- - - - - - - - - diff --git a/community/index.html b/community/index.html deleted file mode 100644 index c689e16..0000000 --- a/community/index.html +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - Community - mCaptcha - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
-
- -
- -
- -

Community

-

-

Matrix Community

-

Come say hi at our Matrix community!

-

Fediverse handle

-

We are on the Fediverse at -@mCapthca@batsense.net, toot at -us for queries and whatnot :)

-

Official Twitter handle

-

The project also has a twitter twitter presence at @m_captcha(Nitter -hyperlink). This space is used in -addition to the blog to post short updates.

-

Lead developer email

-

Write to me at realaravinth@batsense.net!

-

Bug reports

-

We use GitHub for managing tickets

- -

Edit this page on git.batsense.net

- -
-
- -
-
- - - - - - - - - diff --git a/contact/index.html b/contact/index.html deleted file mode 100644 index 633b322..0000000 --- a/contact/index.html +++ /dev/null @@ -1,173 +0,0 @@ - - - - - - - - - - - - - - Contact - mCaptcha - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
-
- -
- -
- -

Contact

-

-

Matrix Community

-

We have a Matrix -community, come say -hi!.

-

Lead developer

-

You can find me(@realaravinth) on -the Matrix, on -GitHub or email me at -realaravinth@batense.net.

- -

Edit this page on git.batsense.net

- -
-
- -
-
- - - - - - - - - diff --git a/contributors/aravinth-manivannan/index.html b/contributors/aravinth-manivannan/index.html deleted file mode 100644 index 97e0366..0000000 --- a/contributors/aravinth-manivannan/index.html +++ /dev/null @@ -1,239 +0,0 @@ - - - - - - - - - - - - - - Aravinth Manivannan - mCaptcha - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
-
- -
-
-
-

Aravinth Manivannan

-

Creator of mCaptcha.

-

@realaravinth

-
-
-
-
-

Testing on screenreaders

-

-

Posted February 10, 2024 by Aravinth Manivannan ‐ 1 min read

-

Last Edited February 12, 2024

-

-
-
-
-

Introducing mCaptcha net

-

-

Posted October 19, 2023 by Aravinth Manivannan ‐ 2 min read

-

Last Edited October 21, 2023

-

-
-
-
-

February, 2023: Monthly Report

-

We are mCaptcha. We build kickass CAPTCHA systems that give (DDoS) attackers a run for their money. And we do all of this without tracking your users. Oh and did I mention our UX is great?

-

Posted March 8, 2023 by Aravinth Manivannan ‐ 2 min read

-

Last Edited March 9, 2023

-

-
-
-
-

July, 2022: Monthly Report

-

We are mCaptcha. We build kickass CAPTCHA systems that give (DDoS) attackers a run for their money. And we do all of this without tracking your users. Oh and did I mention our UX is great?

-

Posted August 4, 2022 by Aravinth Manivannan ‐ 2 min read

-

Last Edited March 23, 2024

-

-
-
-
-

June, 2022: Monthly Report

-

We are mCaptcha. We build kickass CAPTCHA systems that give (DDoS) attackers a run for their money. And we do all of this without tracking your users. Oh and did I mention our UX is great?

-

Posted July 7, 2022 by Aravinth Manivannan ‐ 2 min read

-

Last Edited July 7, 2022

-

-
-
-
-

May, 2022: Monthly Report

-

We are mCaptcha. We build kickass CAPTCHA systems that give (DDoS) attackers a run for their money. And we do all of this without tracking your users. Oh and did I mention our UX is great?

-

Posted June 10, 2022 by Aravinth Manivannan ‐ 4 min read

-

Last Edited June 14, 2022

-

-
-
-
-

December, 2021: Monthly Report

-

We are mCaptcha. We build kickass CAPTCHA systems that give (DDoS) attackers a run for their money. And we do all of this without tracking your users. Oh and did I mention our UX is great?

-

Posted December 23, 2021 by Aravinth Manivannan ‐ 2 min read

-

Last Edited June 14, 2022

-

-
-
-
-

Survey

-

We are mCaptcha. We build kickass CAPTCHA systems that give (DDoS) attackers a run for their money. And we do all of this without tracking your users. Oh and did I mention our UX is great?

-

Posted October 28, 2021 by Aravinth Manivannan ‐ 1 min read

-

Last Edited December 23, 2021

-

-
-
-
-

PoW performance

-

We are mCaptcha. We build kickass CAPTCHA systems that give (DDoS) attackers a run for their money. And we do all of this without tracking your users. Oh and did I mention our UX is great?

-

Posted September 1, 2021 by Aravinth Manivannan ‐ 2 min read

-

Last Edited September 1, 2021

-

-
-
-
-

Say hello to mCaptcha

-

We are mCaptcha. We build kickass CAPTCHA systems that give (DDoS) attackers a run for their money. And we do all of this without tracking your users. Oh and did I mention our UX is great?

-

Posted May 26, 2021 by Aravinth Manivannan ‐ 2 min read

-

Last Edited December 2, 2021

-

-
-
-
-
-
- -
-
- - - - - - - - - diff --git a/contributors/aravinth-manivannan/index.xml b/contributors/aravinth-manivannan/index.xml deleted file mode 100644 index 0f7e00e..0000000 --- a/contributors/aravinth-manivannan/index.xml +++ /dev/null @@ -1,82 +0,0 @@ - - - - Aravinth Manivannan on - //localhost:1313/contributors/aravinth-manivannan/ - Recent content in Aravinth Manivannan on - Hugo - en-US - Sat, 23 Mar 2024 13:48:45 +0530 - - - Testing on screenreaders - //localhost:1313/blog/testing-on-screenreaders/ - Sat, 10 Feb 2024 00:00:00 +0000 - //localhost:1313/blog/testing-on-screenreaders/ - <p><a href="www.han.nl">HAN University of Applied Sciences</a> kindly did an accessibility test of the mCaptcha widget and the showcase site, which features a real world integration of mCaptcha in a third-party service. The report motived us to make screen reader testing an integral part of the release process.</p> <p>Here are the results:</p> <h2 id="android-in-built-screen-reader-on-fennec">Android in-built screen reader on Fennec</h2> <iframe title="Testing mCaptcha on Android screenreader with Fennec browser" width="560" height="315" src="https://peertube.batsense.net/videos/embed/e9579d73-b19e-4051-9337-8432fc15c3b3" frameborder="0" allowfullscreen="" sandbox="allow-same-origin allow-scripts allow-popups"></iframe> <h2 id="nvda-on-microsoft-windows-and-mozilla-firefox">NVDA on Microsoft Windows and Mozilla Firefox</h2> <iframe title="Testing mCaptcha on NVDA screen reader on MS Windows with Mozilla Firefox browser" width="560" height="315" src="https://peertube.batsense.net/videos/embed/cf534270-8089-4aad-95b3-543c467a6a12" frameborder="0" allowfullscreen="" sandbox="allow-same-origin allow-scripts allow-popups"></iframe> <h2 id="macos-in-built-screen-reader-on-google-chrome">macOS in-built screen reader on Google Chrome</h2> <iframe title="Testing mCaptcha on macOS in-built screen reader and Google Chrome browser" width="560" height="315" src="https://peertube.batsense.net/videos/embed/45be4f8c-1978-4650-b9f1-972cfead8420" frameborder="0" allowfullscreen="" sandbox="allow-same-origin allow-scripts allow-popups"></iframe> <h2 id="ios-in-built-screen-reader-on-safari">iOS in-built screen reader on Safari</h2> <iframe title="Testing mCaptcha on iOS screenreader with Safari" width="560" height="315" src="https://peertube.batsense.net/videos/embed/ac9722a4-3dce-4c40-bb0c-7bc8d721c3db" frameborder="0" allowfullscreen="" sandbox="allow-same-origin allow-scripts allow-popups"></iframe> - - - Introducing mCaptcha net - //localhost:1313/blog/introducing-mcaptcha-net/ - Thu, 19 Oct 2023 00:00:00 +0000 - //localhost:1313/blog/introducing-mcaptcha-net/ - <p>mCaptcha uses a Proof-of-Work (PoW) based algorithm to offer Denial-of-Service protection, because of <a href="https://www.w3.org/TR/turingtest/#proof-of-work">its excellent accessibility characteristics</a>. PoW within mCaptcha is configuration &mdash; webmasters can configure <a href="//localhost:1313/docs/terminology/difficulty-factor">difficulty factors</a> for their installations, which determines waiting time for visitors. But PoW can become inaccessible if webmasters choose a very high difficulty factor. So they have to maintain a balance which imposes sufficient load on DDoS attackers while also being accessible to common folk.</p> - - - February, 2023: Monthly Report - //localhost:1313/blog/february-2023-monthly-report/ - Wed, 08 Mar 2023 00:00:00 +0000 - //localhost:1313/blog/february-2023-monthly-report/ - <p>Hello and welcome to the (August 2022 to) February, 2023 monthly report!</p> <h2 id="tldr">TL;DR</h2> <p><em><a href="https://gusted.xyz">Gusted</a> and I secured funding from NLnet to work on mCaptcha in 2023, we suffered an outage from 15 January to February 6, polyfill benchmarking support in mCaptcha</em></p> <h2 id="we-have-funding">We have funding!</h2> <p><a href="https://gusted.xyz">Gusted</a> and I applied and secured funding through 2023 development is funded through the <a href="https://nlnet.nl/entrust">NGI0 Entrust</a> Fund, via <a href="https://nlnet.nl">NLnet</a>.</p> - - - July, 2022: Monthly Report - //localhost:1313/blog/july-2022-monthly-report/ - Thu, 04 Aug 2022 00:00:00 +0000 - //localhost:1313/blog/july-2022-monthly-report/ - <p>Hello and welcome to the July, 2022 monthly report!</p> <h2 id="tldr">TL;DR</h2> <p><em>Codeberg is trying out mCaptcha, Gitea is getting mCaptcha support, mCaptcha supports MariaDB, I&rsquo;ve applied for NLnet and Open Tech Fund, documentation is updated: tutorials and glossary is added and glue libraries have new releases.</em></p> <h2 id="codeberg-is-deploying-mcaptcha">Codeberg is deploying mCaptcha</h2> <p>Codeberg is committed to trying out mCaptcha to make their platform more accessible: they currently use a text-based CAPTCHA, which will be replaced by mCaptcha. The decision was finalized after I presented mCaptcha to them at a meeting their organized. Please see <a href="https://batsense.net/talks/codeberg-introducing-mcaptcha/">here</a> for slides.</p> - - - June, 2022: Monthly Report - //localhost:1313/blog/june-2022-monthly-report/ - Thu, 07 Jul 2022 00:00:00 +0000 - //localhost:1313/blog/june-2022-monthly-report/ - <p>Hello and welcome to the June 2022 edition of the monthly report!</p> <h2 id="mcaptcha-is-incorporated">mCaptcha is incorporated!</h2> <p>I spent June doing non-technical tasks but I made significant progress: I had been trying to do it since summer 2021, but I faced various setbacks along the way. A family friend, who is also an auditor helped me finally get mCaptcha incorporated!</p> <p>And we&rsquo;ve already filed successfully filed the first tax return too!</p> - - - May, 2022: Monthly Report - //localhost:1313/blog/may-2022-monthly-report/ - Fri, 10 Jun 2022 00:00:00 +0000 - //localhost:1313/blog/may-2022-monthly-report/ - <p>Hello and welcome to the May 2022 edition of the monthly report!</p> <p>mCaptcha, for a while was showing all the signs of a dead project: no commits on the repositories and no monthly updates. But the project is far from dead!</p> <h2 id="python-bindings-to-mcaptcha-powhttpsgithubcommcaptchapow_sha256">Python bindings to <a href="https://github.com/mCaptcha/pow_sha256/">mCaptcha PoW</a></h2> <p><a href="https://github.com/mCaptcha/pow_py">pow_py</a> contains bindings to <a href="https://github.com/mCaptcha/pow_sha256">pow_sha256</a>, the <a href="https://en.wikipedia.org/wiki/Proof_of_work">proof-of-work</a> library that mCaptcha uses. For the uninitiated, the bindings allow for python programs to automatically solve mCaptcha.</p> - - - December, 2021: Monthly Report - //localhost:1313/blog/december-2021-monthly-report/ - Thu, 23 Dec 2021 00:00:00 +0000 - //localhost:1313/blog/december-2021-monthly-report/ - <p>Hello and welcome to the first edition of the monthly report!</p> <p>I believe free software like mCaptcha is critical to a healthy internet but being a one-person show, there&rsquo;s hardly any accountability in the way software is built. I hope, through monthly reports, I can explain the logic and intentions behind decisions taken in the development process.</p> <p>This month, the following things were accomplished:</p> <h2 id="1-full-librejs-compliance">1. Full LibreJS Compliance</h2> <p>The CAPTCHA widget and the admin dashboard are 100% LibreJS compliant!</p> - - - Survey - //localhost:1313/blog/survey/ - Thu, 28 Oct 2021 00:00:00 +0000 - //localhost:1313/blog/survey/ - <p><strong>Survey link:</strong> <a href="https://survey.mcaptcha.org/survey/campaigns/b717e51e-24d4-4ab6-912f-de2dfe3ce1fe/about">https://survey.mcaptcha.org/survey/campaigns/b717e51e-24d4-4ab6-912f-de2dfe3ce1fe/about</a></p> <p><strong>NOTE:</strong> The survey(at least, the lucky draw is temporarily suspended due to some logistical reasons. Apologies for any inconvenience caused.</p> <p>mCaptcha relies on a <a href="https://en.wikipedia.org/wiki/Proof_of_work">proof-of-work(PoW)</a> mechanism to guard against bots. In order for this to be effective, the difficulty factor should be configured properly. If the difficulty factor is too high all the time, it will inconvenience the users and if it&rsquo;s too low during attack, the defence will be weak.</p> - - - PoW performance - //localhost:1313/blog/pow-performance/ - Wed, 01 Sep 2021 00:00:00 +0000 - //localhost:1313/blog/pow-performance/ - <p>mCaptcha uses a <a href="https://en.wikipedia.org/wiki/Proof_of_work">proof-of-work(PoW)</a> mechanism to rate limit users or potential bots. In order for this to be effective, the PoW should be configured properly. The difficulty requirement can&rsquo;t be too high, as it could cause accessibility issues on the client-side while at the same time, it shouldn&rsquo;t be too low, as it wouldn&rsquo;t offer proper protection against bots.</p> <p>Malicious bots(the ones that wreak havoc), run native code which is capable of running in a multi-threaded context. This creates an unfair advantage for crackers using these bots over legitimate users, who usually use browsers to access a website.</p> - - - Say hello to mCaptcha - //localhost:1313/blog/say-hello-to-mcaptcha/ - Wed, 26 May 2021 00:00:00 +0000 - //localhost:1313/blog/say-hello-to-mcaptcha/ - <p>At mCaptcha, we believe in digital freedom and privacy and so we built a <a href="https://en.wikipedia.org/wiki/Proof_of_work">proof-of-work</a> based CAPTCHA system that doesn&rsquo;t track. Seriously, no tracking. But that isn&rsquo;t the killer feature, our system doesn&rsquo;t require the user to pick cars or ID sidewalks &mdash; our system does it&rsquo;s thing(usually at the click of a button) and gets out of the way.</p> <h2 id="how-does-it-work">How does it work?</h2> <p>mCaptcha uses SHA256 based proof-of-work(PoW) to rate limit users.</p> - - - diff --git a/contributors/index.html b/contributors/index.html deleted file mode 100644 index 549d04d..0000000 --- a/contributors/index.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - - - - - - - - Contributors - mCaptcha - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
-
- -
-
- -
-
- -
-
- - - - - - - - - diff --git a/contributors/index.xml b/contributors/index.xml deleted file mode 100644 index 8115368..0000000 --- a/contributors/index.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - Contributors on - //localhost:1313/contributors/ - Recent content in Contributors on - Hugo - en-US - Wed, 26 May 2021 14:18:41 +0530 - - - Aravinth Manivannan - //localhost:1313/contributors/aravinth-manivannan/ - Wed, 26 May 2021 00:00:00 +0000 - //localhost:1313/contributors/aravinth-manivannan/ - <p>Creator of mCaptcha.</p> <p><a href="https://batsense.net">@realaravinth</a></p> - - - diff --git a/docs/api/browser/index.html b/docs/api/browser/index.html deleted file mode 100644 index 19af8bc..0000000 --- a/docs/api/browser/index.html +++ /dev/null @@ -1,259 +0,0 @@ - - - - - - - - - - - - - - Browser libraries - mCaptcha - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
-
- -
- - -
- -

Browser libraries

-

-

The browser part of mCaptcha is divided into three components.

-
    -
  • Glue code
  • -
  • Widget program
  • -
  • Proof-of-Work libraries(WebAssembly and JavaScript polyfill)
  • -
-

Glue code

-

This is the code that links mCaptcha with your website’s frontend code. -It creates an iframe containing the mCaptcha widget and injects the -received verification proof token into a hidden input field.

-

Support is available for various frameworks, see -mCaptcha/glue for the full list.

-

For frameworks without official support, a low-level library, -@mcaptcha/core-glue, -can be used to implement support.

-

Widget Program

-

This part is served by the mCaptcha backend. It fetches PoW config from -the backend, generates proof and submits it for verification. If -verification is successful, it sends a message containing the -verification proof token to the parent window, assuming it’s loaded as -an iframe.

- -

WebAssembly library which generates Proofs of Work for mCaptcha systems.

-

Proof-of-Work(PoW) library

-

WebAssembly bindings(mCaptcha/pow_wasm) are available for the main rust library(mCaptcha/pow_sha256).

-

For browsers without support WebAssembly, a -polyfill(pow_sha256-polyfill) -is available.

- -

Edit this page on git.batsense.net

- - - -
-
- -
-
- - - - - - - - - diff --git a/docs/api/index.html b/docs/api/index.html deleted file mode 100644 index 38bdd0e..0000000 --- a/docs/api/index.html +++ /dev/null @@ -1,208 +0,0 @@ - - - - - - - - - - - - - - API - mCaptcha - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
-
- -
-
- -
-
- -
-
- - - - - - - - - diff --git a/docs/api/index.xml b/docs/api/index.xml deleted file mode 100644 index 0b244c1..0000000 --- a/docs/api/index.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - API on - //localhost:1313/docs/api/ - Recent content in API on - Hugo - en-US - Mon, 01 Aug 2022 20:24:18 +0530 - - - Browser libraries - //localhost:1313/docs/api/browser/ - Thu, 11 Mar 2021 00:00:00 +0000 - //localhost:1313/docs/api/browser/ - <p>The browser part of mCaptcha is divided into three components.</p> <ul> <li>Glue code</li> <li>Widget program</li> <li>Proof-of-Work libraries(WebAssembly and JavaScript polyfill)</li> </ul> <h2 id="glue-code">Glue code</h2> <p>This is the code that links mCaptcha with your website&rsquo;s frontend code. It creates an <code>iframe</code> containing the mCaptcha widget and injects the received verification proof token into a hidden input field.</p> <p>Support is available for various frameworks, see <a href="https://github.com/mCaptcha/glue"><code>mCaptcha/glue</code></a> for the full list.</p> - - - mCaptcha System Library - //localhost:1313/docs/api/mcaptcha-system/ - Thu, 11 Mar 2021 00:00:00 +0000 - //localhost:1313/docs/api/mcaptcha-system/ - <p>Documentation for the library used in mCaptcha core.</p> <h2 id="versions">Versions</h2> <ul> <li><a href="https://mcaptcha.github.io/mCaptcha/m_captcha/index.html">master-branch</a></li> <li><a href="//localhost:1313/api-docs/m_captcha/0.1.3/m_captcha/index.html">0.1.3</a></li> <li><a href="//localhost:1313/api-docs/m_captcha/0.1.2/m_captcha/index.html">0.1.2</a></li> <li><a href="//localhost:1313/api-docs/m_captcha/0.1.1/m_captcha/index.html">0.1.1</a></li> <li><a href="//localhost:1313/api-docs/m_captcha/0.1.0/m_captcha/index.html">0.1.0</a></li> </ul> - - - pow_sha256 - //localhost:1313/docs/api/pow-sha256/ - Thu, 11 Mar 2021 00:00:00 +0000 - //localhost:1313/docs/api/pow-sha256/ - <p>Rust crate which generates SHA256 Proofs of Work on serializable datatypes.</p> <p>This is a fork of the <a href="https://github.com/bddap/pow"><code>pow</code> library</a> by <a href="https://github.com/robkorn/pow_sha256">@robkorn</a>) with some new additions. Primary of these being:</p> <ul> <li>PoW datatype now offers a constructor</li> <li>Salt is no longer hard coded into the library, users can provide unique salts.</li> </ul> <p>Other small changes have also been included of various importance but mostly just stylistic/ease of use improvements.</p> - - - diff --git a/docs/api/mcaptcha-system/index.html b/docs/api/mcaptcha-system/index.html deleted file mode 100644 index fc0b498..0000000 --- a/docs/api/mcaptcha-system/index.html +++ /dev/null @@ -1,235 +0,0 @@ - - - - - - - - - - - - - - mCaptcha System Library - mCaptcha - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
-
- -
- - -
- -

mCaptcha System Library

-

-

Documentation for the library used in mCaptcha core.

-

Versions

- - -

Edit this page on git.batsense.net

- - - -
-
- -
-
- - - - - - - - - diff --git a/docs/api/pow-sha256/index.html b/docs/api/pow-sha256/index.html deleted file mode 100644 index d78d401..0000000 --- a/docs/api/pow-sha256/index.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - - - - - - - - - - pow_sha256 - mCaptcha - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
-
- -
- - -
- -

pow_sha256

-

-

Rust crate which generates SHA256 Proofs of Work on serializable datatypes.

-

This is a fork of the pow library by -@robkorn) with some new -additions. Primary of these being:

-
    -
  • PoW datatype now offers a constructor
  • -
  • Salt is no longer hard coded into the library, users can provide -unique salts.
  • -
-

Other small changes have also been included of various importance but -mostly just stylistic/ease of use improvements.

-

Versions

- -

Changelog

-

Changelog is available at the project’s -repository

- -

Edit this page on git.batsense.net

- - - -
-
- -
-
- - - - - - - - - diff --git a/docs/api/sitemap.xml b/docs/api/sitemap.xml deleted file mode 100644 index 819a20b..0000000 --- a/docs/api/sitemap.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - //localhost:1313/docs/api/browser/ - 2022-08-01T20:24:18+05:30 - weekly - 0.5 - - - - //localhost:1313/docs/api/mcaptcha-system/ - 2022-08-01T20:24:18+05:30 - weekly - 0.5 - - - - //localhost:1313/docs/api/pow-sha256/ - 2022-08-01T20:24:18+05:30 - weekly - 0.5 - - \ No newline at end of file diff --git a/docs/help/faq/index.html b/docs/help/faq/index.html deleted file mode 100644 index ec63a5c..0000000 --- a/docs/help/faq/index.html +++ /dev/null @@ -1,222 +0,0 @@ - - - - - - - - - - - - - - FAQ - mCaptcha - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
-
- -
- - -
- -

FAQ

-

Answers to frequently asked questions.

-

Coming soon

- -

Edit this page on git.batsense.net

- - - -
-
- -
-
- - - - - - - - - diff --git a/docs/help/index.html b/docs/help/index.html deleted file mode 100644 index cc5613a..0000000 --- a/docs/help/index.html +++ /dev/null @@ -1,202 +0,0 @@ - - - - - - - - - - - - - - Help - mCaptcha - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
-
- -
-
-
-

Help

-
-
- - - - - - - - - - - -
-
- FAQ → -
-
- - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
- -
-
- - - - - - - - - diff --git a/docs/help/index.xml b/docs/help/index.xml deleted file mode 100644 index 1ef92a6..0000000 --- a/docs/help/index.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - Help on - //localhost:1313/docs/help/ - Recent content in Help on - Hugo - en-US - Mon, 01 Aug 2022 22:24:30 +0530 - - - Troubleshooting - //localhost:1313/docs/help/troubleshooting/ - Mon, 01 Jan 0001 00:00:00 +0000 - //localhost:1313/docs/help/troubleshooting/ - <h2 id="q-i-just-setup-an-instance-but-i-am-unable-to-login">Q: I just setup an instance but I am unable to login</h2> <p>mCaptcha by default is configured to server at <code>localhost</code> hostname. If the instance is deployed at another hostname, please try setting <code>MCAPTCHA_SERVER_DOMAIN</code> environment variable to the hostname at which your instance is deployed or setting the equivalent in config.toml:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-toml" data-lang="toml"><span style="display:flex;"><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1</span><span>[server] </span></span><span style="display:flex;"><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2</span><span>domain=mydomain </span></span></code></pr - - - FAQ - //localhost:1313/docs/help/faq/ - Mon, 01 Jan 0001 00:00:00 +0000 - //localhost:1313/docs/help/faq/ - <p>Coming soon</p> - - - diff --git a/docs/help/sitemap.xml b/docs/help/sitemap.xml deleted file mode 100644 index a481367..0000000 --- a/docs/help/sitemap.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - //localhost:1313/docs/help/troubleshooting/ - 2022-08-01T22:24:30+05:30 - weekly - 0.5 - - - - //localhost:1313/docs/help/faq/ - 2022-08-01T19:16:21+05:30 - weekly - 0.5 - - \ No newline at end of file diff --git a/docs/help/troubleshooting/index.html b/docs/help/troubleshooting/index.html deleted file mode 100644 index 51bb425..0000000 --- a/docs/help/troubleshooting/index.html +++ /dev/null @@ -1,232 +0,0 @@ - - - - - - - - - - - - - - Troubleshooting - mCaptcha - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
-
- -
- - -
- -

Troubleshooting

-

Solutions to common problems.

-

Q: I just setup an instance but I am unable to login

-

mCaptcha by default is configured to server at localhost hostname. If -the instance is deployed at another hostname, please try setting -MCAPTCHA_SERVER_DOMAIN environment variable to the hostname at which -your instance is deployed or setting the equivalent in config.toml:

-
1[server]
-2domain=mydomain
-
-

Edit this page on git.batsense.net

- - - -
-
- -
-
- - - - - - - - - diff --git a/docs/index.html b/docs/index.html deleted file mode 100644 index 93d2785..0000000 --- a/docs/index.html +++ /dev/null @@ -1,274 +0,0 @@ - - - - - - - - - - - - - - mCaptcha - mCaptcha - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
-
- -
-
-
-

mCaptcha

-
-
- - - - - - - -
- -
- - - - - - - - - - - -
-
- FAQ → -
-
- - - - - - - - - - - - - - - -
- -
- - - -
- -
- - - - - - - - - - - - - - - - - - - - - - -
-
-
-
- -
-
- - - - - - - - - diff --git a/docs/index.xml b/docs/index.xml deleted file mode 100644 index 26257d7..0000000 --- a/docs/index.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - mCaptcha on - //localhost:1313/docs/ - Recent content in mCaptcha on - Hugo - en-US - - - diff --git a/docs/self-hosting/ansible/index.html b/docs/self-hosting/ansible/index.html deleted file mode 100644 index 00cedf5..0000000 --- a/docs/self-hosting/ansible/index.html +++ /dev/null @@ -1,260 +0,0 @@ - - - - - - - - - - - - - - Using Ansible - mCaptcha - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
-
- -
- - -
- -

Using Ansible

-

Deploy mCaptcha software using Ansible playbooks

-

Ansible playbooks to install mCaptcha are available here.

-

Instructions

-

Installation

-
    -
  1. Clone the repository:
  2. -
-
1git clone https://git.batsense.net/mCaptcha/iac && cd iac
-
    -
  1. -

    Create inventory file. You should have SSH access to the remote -machine, and the user must have sudo privileges. Example inventory -file:

    -
    1[mcaptcha_hosts]
    -2"mcaptcha_hosts"
    -3<node name> ansible_host=<node IP> ansible_user=<remote username>
    -

    It is important that the group name be mcaptcha_hosts.

    -
  2. -
  3. -

    Configure installation by editing ansible/vars/mcaptcha/vars.yml. Most parameters have defaults, and the required parameters are annotated.

    -
  4. -
  5. -

    Run playbook:

    -
  6. -
-
1	ansible-playbook -i path/to/inventory-file -f 10 ./ansible/mcaptcha.yml
-

Update

-
    -
  1. Pull changes from Git repository
  2. -
  3. Rerun playbook
  4. -
- -

Edit this page on git.batsense.net

- - - -
-
- -
-
- - - - - - - - - diff --git a/docs/self-hosting/bare-metal/index.html b/docs/self-hosting/bare-metal/index.html deleted file mode 100644 index 00b51e0..0000000 --- a/docs/self-hosting/bare-metal/index.html +++ /dev/null @@ -1,360 +0,0 @@ - - - - - - - - - - - - - - Deploy bare metal - mCaptcha - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
-
- -
- - -
- -

Deploy bare metal

-

Bare metal deployment is tedious, most of this will be automated with a script in the future.

-

1. Install Database

-

The following databases are supported:

-
    -
  1. Postgres
  2. -
  3. MariaDB
  4. -
-

Please install the database of your choice. Then:

-
    -
  1. Create new database user for mCaptcha
  2. -
  3. Create new database for mCaptcha
  4. -
-

mCaptcha binary has migrations baked-in and is applied on start up. The -choice of database is described using the scheme of the database URL. For -instance:

-
    -
  1. Postgres: postgres://mcaptcha:password@localhost:5432/mcaptcha
  2. -
  3. Mariadb: mysql://mcaptcha:password@localhost:3306/mcaptcha
  4. -
-

2. Optionally, install mCaptcha/cache

-

We recommend this for larger instances. For single-user instances or for -instances that protect personal websites, we recommend using the -internal cache system. To do so, please comment out the -redis section of the configuration file.

-

Please see mCaptcha/cache for more details.

-

3. Install mCaptcha

-

3.1 Install from source

-

To build mcaptcha, you need the following dependencies:

-
    -
  1. rust
  2. -
  3. node(v20)
  4. -
  5. yarn(JavaScript package manager)
  6. -
  7. make
  8. -
-

With all dependencies installed, run:

-
make dev-env && make release
-

And the following commands to install the compiled binary:

-
sudo cp ./target/release/mcaptcha /usr/bin/ && \
-	mkdir sudo /etc/mcaptcha && \
-	sudo cp config/default.toml /etc/mcaptcha/config.toml
-

3.2 Install pre-compiled binary

-

i. Download assets

-
wget https://dl.mcaptcha.org/mcaptcha/mCaptcha/master/mcaptcha-master-linux-amd64.tar.gz.asc
-wget https://dl.mcaptcha.org/mcaptcha/mCaptcha/master/mcaptcha-master-linux-amd64.tar.gz.sha256
-wget https://dl.mcaptcha.org/mcaptcha/mCaptcha/master/mcaptcha-master-linux-amd64.tar.gz
-

ii Verify checksum

-
sha256sum -c mcaptcha-master-linux-amd64.tar.gz.sha256
-

iii Verify GPG signature

-

All mcaptcha binaries are signed with our GPG -key. -Please verify signatures to verify authenticity.

-
gpg --keyserver keyserver.ubuntu.com --recv 73DAC973A9ADBB9ADCB5CDC4595A08135BA9FF73
-gpg --verify mcaptcha-master-linux-amd64.tar.gz.asc
-

iv. Install

-
tar -xvzf mcaptcha-master-linux-amd64.tar.gz \
-  && sudo cp mcaptcha-master-linux-amd64/mcaptcha /usr/local/bin \
-  && sudo mkdir /etc/mcaptcha \
-  && sudo cp mcaptcha-master-linux-amd64/config.toml /etc/mcaptcha/
-

4. Configuration

-

mCaptcha is highly configurable.

-

Configuration is applied/merged in the following order:

-
    -
  1. path to configuration file passed in via MCAPTCHA_CONFIG
  2. -
  3. ./config/default.toml
  4. -
  5. /etc/mcaptcha/config.toml
  6. -
  7. environment variables. Please see -here for a full list of environment variables.
  8. -
-

5. Systemd service configuration:

-
    -
  1. Copy the following to /etc/systemd/system/mcaptcha.service:
  2. -
-
[Unit]
-Description=mCaptcha: a CAPTCHA system that gives attackers a run for their money
-
-[Service]
-Type=simple
-User=mcaptcha
-ExecStart=/usr/bin/mcaptcha
-Restart=on-failure
-RestartSec=1
-SuccessExitStatus=3 4
-RestartForceExitStatus=3 4
-SystemCallArchitectures=native
-MemoryDenyWriteExecute=true
-NoNewPrivileges=true
-Environment="RUST_LOG=info"
-
-[Unit]
-After=sound.target
-Wants=network-online.target
-Wants=network-online.target
-Requires=postgresql.service
-After=syslog.target
-
-[Install]
-WantedBy=multi-user.target
-
    -
  1. Enable service:
  2. -
-
sudo systemctl daemon-reload && \
-	sudo systemctl enable mcaptcha && \ # Auto startup during boot
-	sudo systemctl start mcaptcha
-

6. Install and configure Nginx

-

mCaptcha doesn’t implement SSL yet. Please use a reverse proxy like -Nginx to add SSL to your deployment. Here’s an example virtual host -configuration for Nginx:

-
server {
-  server_name <your mcaptcha hostname>;
-	listen 80;
-	listen [::]:80;
-
-	location / {
-		proxy_pass http://127.0.0.1:<mcaptcha_port>;
-		proxy_set_header Host $host;
-    proxy_set_header Host $host;
-    proxy_set_header Upgrade $http_upgrade;
-    proxy_set_header Connection "upgrade";
-    proxy_set_header X-Forwarded-For $remote_addr;
-    proxy_set_header X-Forwarded-Proto $scheme;
-	}
-
-}
-
-

Edit this page on git.batsense.net

- - - -
-
- -
-
- - - - - - - - - diff --git a/docs/self-hosting/docker/index.html b/docs/self-hosting/docker/index.html deleted file mode 100644 index 5d32dfc..0000000 --- a/docs/self-hosting/docker/index.html +++ /dev/null @@ -1,274 +0,0 @@ - - - - - - - - - - - - - - Using Docker - mCaptcha - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
-
- -
- - -
- -

Using Docker

-

-

With Docker

-

1. Configure

-

mcaptcha is highly configurable.

-

Configuration is applied/merged in the following order:

-
    -
  1. path to configuration file passed in via MCAPTCHA_CONFIG
  2. -
  3. ./config/default.toml
  4. -
  5. /etc/mcaptcha/config.toml
  6. -
  7. environment variables.
  8. -
-

See -CONFIGURATION.md -for configurable options.

-

2. Run image

-

If you have already have a Postgres instance running, then:

-
docker run -p <host-machine-port>:<port-in-configuration-file> \
-	--add-host=database:<database-ip-addrss> \
-	-e RUST_LOG=debug \
-	-e DATABASE_URL="postgres://<db-user>:<db-password>@database:<db-port>/<db-name>" \
-	mcaptcha/mcaptcha:latest
-

If you don’t have a Postgres instance running, you can either install -one using a package manager or launch one with docker.

-

With docker-compose

-
    -
  1. Download docker-compose file and the configuration file:
  2. -
-
wget https://raw.githubusercontent.com/mCaptcha/mCaptcha/master/.env.docker-compose
-wget https://raw.githubusercontent.com/mCaptcha/mCaptcha/master/docker-compose.yml
-
    -
  1. -

    Configure deployment using .env.docker-compose environment variable -file

    -
  2. -
  3. -

    Launch containers:

    -
  4. -
-
docker-compose up -d
-
    -
  1. Configure SSL using reverse proxy: mCaptcha doesn’t support SSL at -the moment, so please use a reverse proxy to secure your instance. A -reference nginx virtual host configuration file is available here.
  2. -
- -

Edit this page on git.batsense.net

- - - -
-
- -
-
- - - - - - - - - diff --git a/docs/self-hosting/getting-started/index.html b/docs/self-hosting/getting-started/index.html deleted file mode 100644 index 6d259d1..0000000 --- a/docs/self-hosting/getting-started/index.html +++ /dev/null @@ -1,232 +0,0 @@ - - - - - - - - - - - - - - Getting started - mCaptcha - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
-
- -
- - -
- -

Getting started

-

Get started with self-hosting mCaptcha

-

Get started

-

There are two main ways to self-host mCaptcha:

-
    -
  1. Bare metal
  2. -
  3. With Docker
  4. -
  5. With Ansible
  6. -
- -

Edit this page on git.batsense.net

- - - -
-
- -
-
- - - - - - - - - diff --git a/docs/self-hosting/index.html b/docs/self-hosting/index.html deleted file mode 100644 index fd285df..0000000 --- a/docs/self-hosting/index.html +++ /dev/null @@ -1,213 +0,0 @@ - - - - - - - - - - - - - - Self-Hosting - mCaptcha - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
-
- -
-
- -
-
- -
-
- - - - - - - - - diff --git a/docs/self-hosting/index.xml b/docs/self-hosting/index.xml deleted file mode 100644 index 292b02b..0000000 --- a/docs/self-hosting/index.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - Self-Hosting on - //localhost:1313/docs/self-hosting/ - Recent content in Self-Hosting on - Hugo - en-US - - - Getting started - //localhost:1313/docs/self-hosting/getting-started/ - Mon, 01 Jan 0001 00:00:00 +0000 - //localhost:1313/docs/self-hosting/getting-started/ - <h2 id="get-started">Get started</h2> <p>There are two main ways to self-host mCaptcha:</p> <p>&laquo;&laquo;&laquo;&lt; Updated upstream</p> <ol> <li><a href="./bare-metal">Bare metal</a></li> <li><a href="./docker">With Docker</a></li> <li><a href="./ansible">With Ansible</a> =======</li> <li><a href="//localhost:1313/docs/self-hosting/bare-metal">Bare metal</a></li> <li><a href="//localhost:1313/docs/self-hosting/docker">With Docker</a></li> <li><a href="//localhost:1313/docs/self-hosting/ansible">With Ansible</a></li> </ol> <blockquote> <blockquote> <blockquote> <blockquote> <blockquote> <blockquote> <blockquote> <p>Stashed changes</p> </blockquote> </blockquote> </blockquote> </blockquote> </blockquote> </blockquote> </blockquote> - - - Deploy bare metal - //localhost:1313/docs/self-hosting/bare-metal/ - Mon, 01 Jan 0001 00:00:00 +0000 - //localhost:1313/docs/self-hosting/bare-metal/ - <h2 id="1-install-database">1. Install Database</h2> <p>The following databases are supported:</p> <ol> <li>Postgres</li> <li>MariaDB</li> </ol> <p>Please install the database of your choice. Then:</p> <ol> <li>Create new database user for mCaptcha</li> <li>Create new database for mCaptcha</li> </ol> <p>mCaptcha binary has migrations baked-in and is applied on start up. The choice of database is described using the <a href="https://developer.mozilla.org/en-US/docs/Learn/Common_questions/Web_mechanics/What_is_a_URL#scheme">scheme</a> of the database URL. For instance:</p> <ol> <li>Postgres: <code>postgres://mcaptcha:password@localhost:5432/mcaptcha</code></li> <li>Mariadb: <code>mysql://mcaptcha:password@localhost:3306/mcaptcha</code></li> </ol> <h2 id="2-optionally-install-mcaptchacache">2. Optionally, install mCaptcha/cache</h2> <p>We recommend this for larger instances. For single-user instances or for instances that protect personal websites, we recommend using the internal cache system. To do so, please comment out the <a href="https://github.com/mCaptcha/mCaptcha/blob/d4967626ee59504b32b0f85e409b4e3444ddc4f0/config/default.toml#L54"><code>redis</code></a> section of the configuration file.</p> - - - Using Ansible - //localhost:1313/docs/self-hosting/ansible/ - Mon, 01 Jan 0001 00:00:00 +0000 - //localhost:1313/docs/self-hosting/ansible/ - <p>Ansible playbooks to install mCaptcha are available <a href="https://git.batsense.net/mCaptcha/iac">here</a>.</p> <h2 id="instructions">Instructions</h2> <h3 id="installation">Installation</h3> <ol> <li>Clone the repository:</li> </ol> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1</span><span>git clone https://git.batsense.net/mCaptcha/iac <span style="color:#ff79c6">&amp;&amp;</span> <span style="color:#8be9fd;font-style:italic">cd</span> iac </span></span></code></pre></div><ol start="2"> <li> <p>Create inventory file. You should have SSH access to the remote machine, and the user must have <code>sudo</code> privileges. Example inventory file:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-ini" data-lang="ini"><span style="display:flex;"><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1</span><span><span style="color:#ff79c6">[mcaptcha_hosts]</span> </span></span><span style="display:flex;"><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2</span><span><span style="color:#50fa7b">&#34;mcaptcha_hosts&#34;</span> </span></span><span style="display:flex;"><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">3</span><span><span style="color:#50fa7b">&lt;node name&gt; ansible_host</span><span style="color:#ff79c6">=</span><span style="color:#f1fa8c">&lt;node IP&gt; ansible_user=&lt;remote username&gt;</span> </span></span></code></pr - - - Using Docker - //localhost:1313/docs/self-hosting/docker/ - Mon, 01 Jan 0001 00:00:00 +0000 - //localhost:1313/docs/self-hosting/docker/ - <h2 id="with-docker">With Docker</h2> <h3 id="1-configure">1. Configure</h3> <p>mcaptcha is highly configurable.</p> <p>Configuration is applied/merged in the following order:</p> <ol> <li>path to configuration file passed in via <code>MCAPTCHA_CONFIG</code></li> <li><code>./config/default.toml</code></li> <li><code>/etc/mcaptcha/config.toml</code></li> <li>environment variables.</li> </ol> <p>See <a href="https://github.com/mCaptcha/mCaptcha/tree/master/docs/CONFIGURATION.md">CONFIGURATION.md</a> for configurable options.</p> <h3 id="2-run-image">2. Run image</h3> <p>If you have already have a Postgres instance running, then:</p> <pre tabindex="0"><code>docker run -p &lt;host-machine-port&gt;:&lt;port-in-configuration-file&gt; \ --add-host=database:&lt;database-ip-addrss&gt; \ -e RUST_LOG=debug \ -e DATABASE_URL=&#34;postgres://&lt;db-user&gt;:&lt;db-password&gt;@database:&lt;db-port&gt;/&lt;db-name&gt;&#34; \ mcaptcha/mcaptcha:latest </code></pr - - - diff --git a/docs/self-hosting/sitemap.xml b/docs/self-hosting/sitemap.xml deleted file mode 100644 index 67a3477..0000000 --- a/docs/self-hosting/sitemap.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - //localhost:1313/docs/self-hosting/getting-started/ - 2023-12-09T03:43:25+05:30 - weekly - 0.5 - - - - //localhost:1313/docs/self-hosting/bare-metal/ - 2024-01-08T00:31:40+05:30 - weekly - 0.5 - - - - //localhost:1313/docs/self-hosting/ansible/ - 2023-12-09T03:43:25+05:30 - weekly - 0.5 - - - - //localhost:1313/docs/self-hosting/docker/ - 2024-01-08T00:32:17+05:30 - weekly - 0.5 - - \ No newline at end of file diff --git a/docs/sitemap.xml b/docs/sitemap.xml deleted file mode 100644 index 0e690e0..0000000 --- a/docs/sitemap.xml +++ /dev/null @@ -1,128 +0,0 @@ - - - - //localhost:1313/docs/user-manual/ - 2023-10-28T01:09:37+05:30 - weekly - 0.5 - - - - //localhost:1313/docs/help/ - 2021-07-21T15:49:53+05:30 - weekly - 0.5 - - - - //localhost:1313/docs/webmasters/ - 2023-10-27T21:39:40+05:30 - weekly - 0.5 - - - - //localhost:1313/docs/api/ - 2022-08-01T22:24:03+05:30 - weekly - 0.5 - - - - //localhost:1313/docs/self-hosting/ - 2023-10-27T21:39:40+05:30 - weekly - 0.5 - - - //localhost:1313/docs/user-manual/cli/ - 2023-10-28T01:09:37+05:30 - weekly - 0.5 - - - //localhost:1313/docs/user-manual/how-to-mcaptcha-without-js/ - 2023-10-28T03:16:49+05:30 - weekly - 0.5 - - - //localhost:1313/docs/help/troubleshooting/ - 2022-08-01T22:24:30+05:30 - weekly - 0.5 - - - //localhost:1313/docs/help/faq/ - 2022-08-01T19:16:21+05:30 - weekly - 0.5 - - - //localhost:1313/docs/webmasters/installing-captcha/ - 2024-03-23T13:53:02+05:30 - weekly - 0.5 - - - //localhost:1313/docs/webmasters/configuring-difficulty-factor/ - 2023-10-27T21:39:40+05:30 - weekly - 0.5 - - - //localhost:1313/docs/webmasters/terminology/ - 2023-10-27T21:39:40+05:30 - weekly - 0.5 - - - //localhost:1313/docs/webmasters/faq/ - 2023-10-27T21:39:40+05:30 - weekly - 0.5 - - - //localhost:1313/docs/api/browser/ - 2022-08-01T20:24:18+05:30 - weekly - 0.5 - - - //localhost:1313/docs/api/mcaptcha-system/ - 2022-08-01T20:24:18+05:30 - weekly - 0.5 - - - //localhost:1313/docs/api/pow-sha256/ - 2022-08-01T20:24:18+05:30 - weekly - 0.5 - - - //localhost:1313/docs/self-hosting/getting-started/ - 2023-12-09T03:43:25+05:30 - weekly - 0.5 - - - //localhost:1313/docs/self-hosting/bare-metal/ - 2024-01-08T00:31:40+05:30 - weekly - 0.5 - - - //localhost:1313/docs/self-hosting/ansible/ - 2023-12-09T03:43:25+05:30 - weekly - 0.5 - - - //localhost:1313/docs/self-hosting/docker/ - 2024-01-08T00:32:17+05:30 - weekly - 0.5 - - \ No newline at end of file diff --git a/docs/user-manual/cli/index.html b/docs/user-manual/cli/index.html deleted file mode 100644 index 9d1e900..0000000 --- a/docs/user-manual/cli/index.html +++ /dev/null @@ -1,331 +0,0 @@ - - - - - - - - - - - - - - CLI tool - mCaptcha - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
-
- -
- - -
- -

CLI tool

-

-

A CLI tool exists to compute mCaptcha challenges. It can be installed -from multiple sources:

-

Install

-

crates.io

-

The CLI tool is available on, crates.io, the Rust -language’s package registry. Rust language toolchain is required to -install from crates.io, please see rustup.rs for -Instructions to install it.

-
1cargo install mcaptcha-cli
-

Pre-compiled binaries

-

Nightly builds and stable releases are regularly published to -dl.mcaptcha.org for a variety of -CPU architectures and operating systems.

-
    -
  1. Download binary, checksum and GPG signature files
  2. -
-
1wget https://dl.mcaptcha.org/mcaptcha/cli/{VERSION}/{FILENAME}.tar.gz
-2wget https://dl.mcaptcha.org/mcaptcha/cli/{VERSION}/{FILENAME}.tar.gz.asc
-3wget https://dl.mcaptcha.org/mcaptcha/cli/{VERSION}/{FILENAME}.tar.gz.sha256
-
    -
  1. Verify checksum
  2. -
-
1sha256sum -c {FILENAME}.tar.gz.sha256
-
    -
  1. Download mCaptcha’s GPG release keys and verify GPG signature
  2. -
-
1gpg --keyserver keyserver.ubuntu.com --recv 73DAC973A9ADBB9ADCB5CDC4595A08135BA9FF73
-2gpg --verify {FILENAME}.tar.gz.asc
-
    -
  1. Install Binary
  2. -
-
1tar -xvzf {FILENAME}.tar.gz && sudo cp {FILENAME}/mcaptcha-cli /usr/local/bin
-

Build from source

-
    -
  1. Install Rust tool chain -Please see here for instructions.
  2. -
  3. Download source code
  4. -
-
1git clone https://git.batsense.net/mCaptcha/cli
-
    -
  1. Compile and install
  2. -
-
1cargo build --release && sudp cp ./target/release/mcaptcha-cli
-2/usr/local/bin
-

Pass mCaptcha challenge

-

The CLI tool requires details about the challenge to work on it. The -tool can be used in three different modes compute challenge:

-
    -
  1. Protected Page: Compute mCaptcha challenge for the CAPTCHA at a -protected page
  2. -
  3. Widget URL: Compute PoW for captcha at widget URL
  4. -
  5. (Developer mode) Offline: Computes PoW over given CAPTCHA parameters
  6. -
-

From protected page URL

-

The most convenient mode: copy the URL of the webpage which has the -mCaptcha widget (example: showcase.mcaptcha.org) and run the CLI tool -with it to get an authorization code: -Compute challenge using the URL

-
103:39 atm@lab cli ±|feat-parse-webpage ✗|→ mcaptcha-cli protected-page https://showcase.mcaptcha.org/
-2Authorization token: eRAZJiMrW58uDYA1s64Tmwq1u30HutuF
-

Widget URL

-

If you have the widget URL (will be in format https://mcaptcha.example.org/widget?sitekey=randomstring), it can be used to solve challenge as well:

-
1Compute PoW by fetching parameters from  CAPTCHA URL
-2
-3Usage: mcaptcha-cli online --url <URL>
-4
-5Options:
-6  -u, --url <URL>  URL of the CAPTCHA. Example:  https://example.org/widget?sitekey=foo
-7  -h, --help       Print help
-

Example usage:

-
113:32 atm@lab cli ±|online ✗|→ mcaptcha-cli online -u https://demo.mcaptcha.org/widget?sitekey=pHy0AktWyOKuxZDzFfoaewncWecCHo23
-2Authorization token: 3xleN26OctBuVu3X4t6CYyUjErhaxQvz
-

[Developer mode] Offline

-

Useful while debugging mCaptcha configurations, works on raw challenge -parameters.

-

Help menu:

-
1Compute PoW with offline parameters
-2
-3Usage: mcaptcha-cli offline --salt <SALT> --phrase <PHRASE> --difficulty-factor <DIFFICULTY_FACTOR>
-4
-5Options:
-6  -s, --salt <SALT>                            Salt with which PoW should be computed
-7  -p, --phrase <PHRASE>                        Phrase over which PoW should be computed
-8  -d, --difficulty-factor <DIFFICULTY_FACTOR>  Difficulty Factor
-9  -h, --help                                   Print help
-

Example usage:

-
113:28 atm@lab cli ±|online|→ mcaptcha-cli offline -s $(rand 32) -p $(rand 32) -d 50000
-2difficulty: 50000
-3nonce: 90507
-4original phrase: f351f333d44b2c6b5bf7f033b065bbb8fb5e9dd153bd402e43ed04425f5a3859
-5result: 340276562956196291522979356090220150471
-

Where rand is this script.

- -

Edit this page on git.batsense.net

- - - -
-
- -
-
- - - - - - - - - diff --git a/docs/user-manual/how-to-mcaptcha-without-js/index.html b/docs/user-manual/how-to-mcaptcha-without-js/index.html deleted file mode 100644 index 65f2b0b..0000000 --- a/docs/user-manual/how-to-mcaptcha-without-js/index.html +++ /dev/null @@ -1,232 +0,0 @@ - - - - - - - - - - - - - - Use mCaptcha without JavaScript - mCaptcha - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
-
- -
- - -
- -

Use mCaptcha without JavaScript

-

-

To use mCaptcha without JavaScript:

-
    -
  1. Install mCaptcha CLI too. Please see here for instructions.
  2. -
  3. Copy the URL of the protected page
  4. -
  5. Run mCaptcha CLI with that URL:
  6. -
-
1mcapthca-cli protected-page <URL>
-
    -
  1. Copy authorization code and paste it in the form
  2. -
- -

Edit this page on git.batsense.net

- - - -
-
- -
-
- - - - - - - - - diff --git a/docs/user-manual/index.html b/docs/user-manual/index.html deleted file mode 100644 index 861cf68..0000000 --- a/docs/user-manual/index.html +++ /dev/null @@ -1,202 +0,0 @@ - - - - - - - - - - - - - - User Manual - mCaptcha - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
-
- -
-
- -
-
- -
-
- - - - - - - - - diff --git a/docs/user-manual/index.xml b/docs/user-manual/index.xml deleted file mode 100644 index 8d724f1..0000000 --- a/docs/user-manual/index.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - User Manual on - //localhost:1313/docs/user-manual/ - Recent content in User Manual on - Hugo - en-US - Sat, 28 Oct 2023 03:16:49 +0530 - - - CLI tool - //localhost:1313/docs/user-manual/cli/ - Fri, 27 Oct 2023 08:48:45 +0000 - //localhost:1313/docs/user-manual/cli/ - <p>A CLI tool exists to compute mCaptcha challenges. It can be installed from multiple sources:</p> <h2 id="install">Install</h2> <h3 id="cratesio">crates.io</h3> <p>The CLI tool is available on, <a href="https://crates.io">crates.io</a>, the Rust language&rsquo;s package registry. Rust language toolchain is required to install from crates.io, please see <a href="https://rustup.rs">rustup.rs</a> for Instructions to install it.</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1</span><span>cargo install mcaptcha-cli </span></span></code></pre></div><h3 id="pre-compiled-binaries">Pre-compiled binaries</h3> <p>Nightly builds and stable releases are regularly published to <a href="https://dl.mcaptcha.org/mcaptcha/cli">dl.mcaptcha.org</a> for a variety of CPU architectures and operating systems.</p> - - - Use mCaptcha without JavaScript - //localhost:1313/docs/user-manual/how-to-mcaptcha-without-js/ - Fri, 27 Oct 2023 08:48:45 +0000 - //localhost:1313/docs/user-manual/how-to-mcaptcha-without-js/ - <p>To use mCaptcha without JavaScript:</p> <ol> <li>Install mCaptcha CLI too. Please see <a href="./cli">here</a> for instructions.</li> <li>Copy the URL of the protected page</li> <li>Run mCaptcha CLI with that URL:</li> </ol> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1</span><span>mcapthca-cli protected-page &lt;URL&gt; </span></span></code></pre></div><ol start="4"> <li>Copy authorization code and paste it in the form</li> </ol> - - - diff --git a/docs/user-manual/sitemap.xml b/docs/user-manual/sitemap.xml deleted file mode 100644 index 04efc5f..0000000 --- a/docs/user-manual/sitemap.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - //localhost:1313/docs/user-manual/cli/ - 2023-10-28T01:09:37+05:30 - weekly - 0.5 - - - - //localhost:1313/docs/user-manual/how-to-mcaptcha-without-js/ - 2023-10-28T03:16:49+05:30 - weekly - 0.5 - - \ No newline at end of file diff --git a/docs/webmasters/configuring-difficulty-factor/index.html b/docs/webmasters/configuring-difficulty-factor/index.html deleted file mode 100644 index 8107f57..0000000 --- a/docs/webmasters/configuring-difficulty-factor/index.html +++ /dev/null @@ -1,271 +0,0 @@ - - - - - - - - - - - - - - Configuring Difficulty Factor - mCaptcha - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
-
- -
- - -
- -

Configuring Difficulty Factor

-

-

mCaptcha is highly responsive to detecting DDoS attacks. Admins are -advised to take advantage of it by setting low difficulty -factors for normal traffic levels -for their website.

-

Lowest advisable difficulty factor is 5000.

-

For instance, if it is normal for my website to get 2000 requests for -every 30 seconds, I will set a cool -down period of 30 seconds and the -first level of difficulty configuration will have a visitor threshold of 2000 with a -difficulty factor of 5000.

-

There are two modes to setting difficulty factor for your website on -mCaptcha:

-

Easy option

-

Easy mode asks a few basic statistics about your website and generates a -configuration that should work for your website. Currently, easy mode is -guided by assumptions on suitable difficulty factors to protect a -website but it will be fine-tuned as mCaptcha sees more deployment.

-

Configuration generated by easy mode can be tweaked later using the -advance mode, as you become more familiar with how mCaptcha works.

-
- new sitekey form in easy mode - -
-

Advance option

-

Advance mode gives the admin granular control over how mCaptcha behaves -on their website. It has options to set the difficulty factor for each -level of traffic(or visitor threshold, in mCaptcha speak), fully taking -advantage of mCaptcha’s variable difficulty factor feature.

-

For instance, if it is normal for a website to get 200 requests over 30 -seconds, then setting a very low difficulty factor for a visitor -threshold of 200 and a cool down period of 30 seconds will allow the -users to pass through without waiting on the CAPTCHA. But if 1000 -requests over 30 seconds will bring down the service, then the admin can -configure increasing levels of difficulty factor of increasing traffic -levels, effectively rate limiting its users and protecting the -underlying website.

-
- new sitekey form in advance mode - -
- -

Edit this page on git.batsense.net

- - - -
-
- -
-
- - - - - - - - - diff --git a/docs/webmasters/faq/index.html b/docs/webmasters/faq/index.html deleted file mode 100644 index 6ece834..0000000 --- a/docs/webmasters/faq/index.html +++ /dev/null @@ -1,244 +0,0 @@ - - - - - - - - - - - - - - Webmasters FAQ - mCaptcha - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
-
- -
- - -
- -

Webmasters FAQ

-

-

Easy Mode: Default cooldown period

-

When configuring mCaptcha in easy mode, the default cooldown period is set to 30 seconds.

-

How to get site key from dashboard?

-
    -
  1. Go to “Site keys” on the side panel in the dashboard
  2. -
-
-
- Site key menu option on the dashboard, encircled in red. - -
-
-
    -
  1. click on the clipboard button to copy the site key to your -clipboard.
  2. -
-
- Copy site key to clipboard. Clipboard button is highlighted in the photo - -
- -

Edit this page on git.batsense.net

- - - -
-
- -
-
- - - - - - - - - diff --git a/docs/webmasters/index.html b/docs/webmasters/index.html deleted file mode 100644 index 00203c1..0000000 --- a/docs/webmasters/index.html +++ /dev/null @@ -1,214 +0,0 @@ - - - - - - - - - - - - - - Webmasters - mCaptcha - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
-
- -
-
- -
-
- -
-
- - - - - - - - - diff --git a/docs/webmasters/index.xml b/docs/webmasters/index.xml deleted file mode 100644 index 8faf3a9..0000000 --- a/docs/webmasters/index.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - - Webmasters on - //localhost:1313/docs/webmasters/ - Recent content in Webmasters on - Hugo - en-US - Sat, 23 Mar 2024 13:53:02 +0530 - - - Installing mCaptcha on your website - //localhost:1313/docs/webmasters/installing-captcha/ - Wed, 22 Jun 2022 00:00:00 +0000 - //localhost:1313/docs/webmasters/installing-captcha/ - <p>mCaptcha can protect your website from DDoS attacks. In this guide we&rsquo;ll explore how to install mCaptcha on your website. The end result will be something like this, on your website:</p> <figure> <img class="img-fluid lazyload blur-up" data-sizes="auto" src="//localhost:1313/docs/webmasters/installing-captcha/mcaptcha-widget-installation-result_hu8539423057366315365.png" data-srcset="//localhost:1313/docs/webmasters/installing-captcha/mcaptcha-widget-installation-result_hu1419480717185241492.png 800w,//localhost:1313/docs/webmasters/installing-captcha/mcaptcha-widget-installation-result_hu18366116196027657266.png 700w,//localhost:1313/docs/webmasters/installing-captcha/mcaptcha-widget-installation-result_hu8883404866445004597.png 600w,//localhost:1313/docs/webmasters/installing-captcha/mcaptcha-widget-installation-result_hu1488805238489702261.png 500w" width="618" height="669" alt="A registration form with mCaptcha widget installed"> <noscript><img class="img-fluid" sizes="100vw" srcset="//localhost:1313/docs/webmasters/installing-captcha/mcaptcha-widget-installation-result_hu1419480717185241492.png 800w,//localhost:1313/docs/webmasters/installing-captcha/mcaptcha-widget-installation-result_hu18366116196027657266.png 700w,//localhost:1313/docs/webmasters/installing-captcha/mcaptcha-widget-installation-result_hu8883404866445004597.png 600w,//localhost:1313/docs/webmasters/installing-captcha/mcaptcha-widget-installation-result_hu1488805238489702261.png 500w" src="//localhost:1313/docs/webmasters/installing-captcha/mcaptcha-widget-installation-result.png" width="618" height="669" alt="A registration form with mCaptcha widget installed"></noscript> </figure> <p>For the purpose of this demo, we will be using <a href="https://demo.mcaptcha.org">demo.mcaptcha.org</a>, a demo instance running in @realaravinth&rsquo;s bedroom(for this same reason, it shouldn&rsquo;t be used for anything serious)</p> - - - Configuring Difficulty Factor - //localhost:1313/docs/webmasters/configuring-difficulty-factor/ - Wed, 22 Jun 2022 00:00:00 +0000 - //localhost:1313/docs/webmasters/configuring-difficulty-factor/ - <p>mCaptcha is highly responsive to detecting DDoS attacks. Admins are advised to take advantage of it by setting low <a href="//localhost:1313/docs/terminology/difficulty-factor/">difficulty factors</a> for normal traffic levels for their website.</p> <p><strong>Lowest advisable difficulty factor is 5000.</strong></p> <p>For instance, if it is normal for my website to get 2000 requests for every 30 seconds, I will set a <a href="//localhost:1313/docs/terminology/cooldown-period">cool down</a> period of 30 seconds and the first level of difficulty configuration will have a <a href="//localhost:1313/docs/terminology/visitor-threshold">visitor threshold</a> of 2000 with a difficulty factor of 5000.</p> - - - Terminology - //localhost:1313/docs/webmasters/terminology/ - Wed, 27 Jul 2022 08:48:45 +0000 - //localhost:1313/docs/webmasters/terminology/ - <h2 id="authorization-token">Authorization token</h2> <p>When a visitor solves the CAPTCHA and sends their solution to an mCaptcha instance, the solution will be verified for correctness. If the solution is correct, mCaptcha will return a single use authorization token.</p> <p>This authorization token should be attached to the visitor&rsquo;s requited to the protected service and the protected service should validity of the authorization token with the mCaptcha instance and only allow authorization to protected resource if the authorization token is valid.</p> - - - Webmasters FAQ - //localhost:1313/docs/webmasters/faq/ - Wed, 27 Jul 2022 08:48:45 +0000 - //localhost:1313/docs/webmasters/faq/ - <h3 id="easy-mode-default-cooldown-period">Easy Mode: Default cooldown period</h3> <p>When configuring mCaptcha in <a href="//localhost:1313/docs/webmasters/configuring-difficulty-factor/#easy-option">easy mode</a>, the default cooldown period is set to 30 seconds.</p> <h2 id="how-to-get-site-key-from-dashboard">How to get site key from dashboard?</h2> <ol> <li>Go to &ldquo;Site keys&rdquo; on the side panel in the dashboard</li> </ol> <div align=center> <figure> <img class="img-fluid lazyload blur-up" data-sizes="auto" src="//localhost:1313/docs/webmasters/faq/sitekey-in-dashboard-sidepanel_hu1842978153838973955.png" data-srcset="//localhost:1313/docs/webmasters/faq/sitekey-in-dashboard-sidepanel_hu7616676515296954887.png 800w,//localhost:1313/docs/webmasters/faq/sitekey-in-dashboard-sidepanel_hu2820398381730295401.png 700w,//localhost:1313/docs/webmasters/faq/sitekey-in-dashboard-sidepanel_hu14296824487641448064.png 600w,//localhost:1313/docs/webmasters/faq/sitekey-in-dashboard-sidepanel_hu13642425771348413616.png 500w" width="222" height="496" alt="Site key menu option on the dashboard, encircled in red."> <noscript><img class="img-fluid" sizes="100vw" srcset="//localhost:1313/docs/webmasters/faq/sitekey-in-dashboard-sidepanel_hu7616676515296954887.png 800w,//localhost:1313/docs/webmasters/faq/sitekey-in-dashboard-sidepanel_hu2820398381730295401.png 700w,//localhost:1313/docs/webmasters/faq/sitekey-in-dashboard-sidepanel_hu14296824487641448064.png 600w,//localhost:1313/docs/webmasters/faq/sitekey-in-dashboard-sidepanel_hu13642425771348413616.png 500w" src="//localhost:1313/docs/webmasters/faq/sitekey-in-dashboard-sidepanel.png" width="222" height="496" alt="Site key menu option on the dashboard, encircled in red."></noscript> </figure> </div> <ol start="2"> <li>click on the clipboard button to copy the site key to your clipboard.</li> </ol> <figure> <img class="img-fluid lazyload blur-up" data-sizes="auto" src="//localhost:1313/docs/webmasters/faq/copy-sitekey_hu10670341732240698368.png" data-srcset="//localhost:1313/docs/webmasters/faq/copy-sitekey_hu12574324563529048918.png 900w,//localhost:1313/docs/webmasters/faq/copy-sitekey_hu10402720001579260311.png 800w,//localhost:1313/docs/webmasters/faq/copy-sitekey_hu3452963981457815043.png 700w,//localhost:1313/docs/webmasters/faq/copy-sitekey_hu12392874392811771870.png 600w,//localhost:1313/docs/webmasters/faq/copy-sitekey_hu2183952705797892621.png 500w" width="1825" height="831" alt="Copy site key to clipboard. Clipboard button is highlighted in the photo"> <noscript><img class="img-fluid" sizes="100vw" srcset="//localhost:1313/docs/webmasters/faq/copy-sitekey_hu12574324563529048918.png 900w,//localhost:1313/docs/webmasters/faq/copy-sitekey_hu10402720001579260311.png 800w,//localhost:1313/docs/webmasters/faq/copy-sitekey_hu3452963981457815043.png 700w,//localhost:1313/docs/webmasters/faq/copy-sitekey_hu12392874392811771870.png 600w,//localhost:1313/docs/webmasters/faq/copy-sitekey_hu2183952705797892621.png 500w" src="//localhost:1313/docs/webmasters/faq/copy-sitekey.png" width="1825" height="831" alt="Copy site key to clipboard. Clipboard button is highlighted in the photo"></noscript> </figure> - - - diff --git a/docs/webmasters/installing-captcha/index.html b/docs/webmasters/installing-captcha/index.html deleted file mode 100644 index d15c7b5..0000000 --- a/docs/webmasters/installing-captcha/index.html +++ /dev/null @@ -1,321 +0,0 @@ - - - - - - - - - - - - - - Installing mCaptcha on your website - mCaptcha - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
-
- -
- - -
- -

Installing mCaptcha on your website

-

-

mCaptcha can protect your website from DDoS attacks. In this guide we’ll -explore how to install mCaptcha on your website. The end result will be -something like this, on your website:

-
- A registration form with mCaptcha widget installed - -
-

For the purpose of this demo, we will be using -demo.mcaptcha.org, a demo instance running -in @realaravinth’s bedroom(for this same reason, it shouldn’t be used -for anything serious)

-

1. Create an account and sign into the mCaptcha dashboard

-

Head over to demo.mcaptcha.org and -create an account. When ready, sign in.

-

2. Create new site key

-

A site key is how a new CAPTCHA is configured within mCaptcha. To create -a new site key, click on “New Site” button in the dashboard.

-
- mCaptcha dashboard with the 'new site key' button highlighted - -
-

There are two options to create a new site key, easy and advanced. We -are going to use the easy mode in this tutorial. If you are interested -in learning more about the advance mode, please see here.

-

Fill the form and submit it.

-
- mCaptcha dashboard with the 'new site key' form in easy mode, with details filled in - -
- -

Submitting the form will take you to a page where site key configuration -can be viewed. “View deployment” link will display CAPTCHA widget with -the supplied configuration. Click on it and grab the widget link.

-

4. Install mCaptcha on your website

-

Integration support is available for some frontend JavaScript -frameworks. To see full list of supported frameworks, please see -here.

-

There are two options to use the integration library to integrate -mCaptcha on your website:

-
    -
  1. Serve the integration library yourself
  2. -
  3. Use a CDN like unpkg.com
  4. -
-

In this tutorial, we’ll be using the CDN.

-

Pasting the following snippet on the page, within the form that requires to be protected -will load the mCaptcha widget with the configuration supplied. Be sure -to replace Your {{paste your widget link}} with the link obtained from -the previous step.

-
 1<label
- 2  data-mcaptcha_url="{{paste your widget link here}}"
- 3  for="mcaptcha__token"
- 4  id="mcaptcha__token-label"
- 5>
- 6  mCaptcha authorization token.
- 7  <a
- 8    href="https://mcaptcha.org/docs/user-manual/how-to-mcaptcha-without-js/"
- 9    >Instructions</a
-10  >.
-11  <input type="text" name="mcaptcha__token" id="mcaptcha__token" />
-12</label>
-13<div id="mcaptcha__widget-container"></div>
-14<script src="https://unpkg.com/@mcaptcha/vanilla-glue@0.1.0-rc2/dist/index.js"></script>
-

A full example is available -here.

-

5. Configure backend to authenticate CAPTCHA tokens

-
    -
  1. -

    Get authorization token from the user’s -form submission payload. The access token will be associated with a -parameter called mcaptcha__token.

    -
    1 mcaptcha_token = request.form["mcaptcha__token"]
    -
  2. -
  3. -

    Validate access token with mCaptcha instance

    -
  4. -
-
 1payload = {
- 2    "token": mcaptcha_token,
- 3    "key": mcaptcha_sitekey, # captcha site key
- 4    # mCaptcha account secret; available in settings
- 5    "secret": mcaptcha_account_secret,
- 6}
- 7resp = requests.post(
- 8    "https://demo.mcaptha.org/api/v1/pow/siteverify", json=payload
- 9)
-10resp = resp.json()
-

Note: secret (mcaptcha_account_secret from above) is available in Dashboard > Settings > Secret

-
    -
  1. If access token is valid, allow access to protected resource or deny -access.
  2. -
-
1 if resp["valid"] == False:
-2     return "invalid captcha", 400
-3 else:
-4     return allow_access_to_protected_resource(request.form)
-

Please see here for a complete Flask example and here for an Actix -Web example.

-

Congratulations, mCaptcha is now integrated with your website!

- -

Edit this page on git.batsense.net

- - - -
-
- -
-
- - - - - - - - - diff --git a/docs/webmasters/sitemap.xml b/docs/webmasters/sitemap.xml deleted file mode 100644 index 1264fb0..0000000 --- a/docs/webmasters/sitemap.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - //localhost:1313/docs/webmasters/installing-captcha/ - 2024-03-23T13:53:02+05:30 - weekly - 0.5 - - - - //localhost:1313/docs/webmasters/configuring-difficulty-factor/ - 2023-10-27T21:39:40+05:30 - weekly - 0.5 - - - - //localhost:1313/docs/webmasters/terminology/ - 2023-10-27T21:39:40+05:30 - weekly - 0.5 - - - - //localhost:1313/docs/webmasters/faq/ - 2023-10-27T21:39:40+05:30 - weekly - 0.5 - - \ No newline at end of file diff --git a/docs/webmasters/terminology/index.html b/docs/webmasters/terminology/index.html deleted file mode 100644 index 4959c6c..0000000 --- a/docs/webmasters/terminology/index.html +++ /dev/null @@ -1,313 +0,0 @@ - - - - - - - - - - - - - - Terminology - mCaptcha - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
-
- -
- - -
- -

Terminology

-

-

Authorization token

-

When a visitor solves the CAPTCHA and sends their solution to an -mCaptcha instance, the solution will be verified for correctness. If the -solution is correct, mCaptcha will return a single use authorization token.

-

This authorization token should be attached to the visitor’s requited to the -protected service and the protected service should validity of the -authorization token with the mCaptcha instance and only allow authorization to -protected resource if the authorization token is valid.

-

Cooldown Period

-

mCaptcha implements leaky bucket algorithm to measure -current traffic levels. Cooldown period specifies the leak or the time -after which a visitor addition is decremented.

-

For instance, if initial traffic level is 0 and a user visits one -second later, the traffic level will be incremented to 1. Now, if the -cooldown period is set to 30 seconds, the traffic level will be -decremented after 30 seconds. So after 30 seconds, the traffic level will -go from 1 to 0.

-

Difficulty Factor

-

Difficulty factor determines the time it takes to solve a CAPTCHA. The -higher the difficulty factor, the longer it will take to generate a -proof of work for it to solve the CAPTCHA.

-

mCaptcha’s proof of work based mechanism makes it highly accessible to -people with special needs but it is important to choose the difficulty factor -with care as very high difficulty factors will make the CAPTCHA -inaccessible to users on slow devices.

-

Sitekey

-

Site key is a unique identifier associated with CAPTCHA configurations -created on mCaptcha. It is required to integrate a CAPTCHA with your -website.

-

Visitor Threshold

-

mCaptcha’s variable difficulty factor mechanism requires a website’s traffic -statistics be split into levels, so that it can deploy the right -difficulty factor for each level.

-

Visitor threshold is used to traffic into levels and mCaptcha accepts a -difficulty configuration for each of these levels. When current traffic -exceeds a difficulty factor, mCaptcha will increase the difficulty -factor to the next configured level.

-

For instance, consider the configuration given below:

-
    -
  • Cool down period: 30 seconds
  • -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
LevelDifficulty FactorVisitor Threshold
15,0002,000
250,0005,000
3500,00010,000
45,000,00015,000
-

If the website sees 2,000 requests in a 30 second window, level 1 -difficulty factor(5,000) will be deployed. If the traffic increases to -5,000 requests in a 30 second window, then difficulty factor will be -upgraded to level 2(50,000). Likewise 10,000 and 15,000 requests over 30 -seconds will result in difficulty factor being upgraded to 500,000 and -5,000,000 respectively.

-

Visitor threshold is how mCaptcha determines which difficulty factor -level to deploy. mCaptcha uses leaky bucket algorithm to keep the -visitor threshold constantly updated within the configured cool down -period. So, at any given moment the, the current visitor level will be -the amount of traffic that was served in the cool down period specified.

- -

Edit this page on git.batsense.net

- - - -
-
- -
-
- - - - - - - - - diff --git a/donate/index.html b/donate/index.html deleted file mode 100644 index 92e8eb2..0000000 --- a/donate/index.html +++ /dev/null @@ -1,183 +0,0 @@ - - - - - - - - - - - - - - Donate - mCaptcha - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
-
- -
- -
- -

Donate

-

Last Edited July 16, 2021

-

-

mCaptcha is a small operation that is self-funded. At the time of -writing, we are not backed by any venture capitals. If you like -mCaptcha, please consider donating. Your donations will go a long -way in supporting us.

-

Some of the payment options are anonymous. You can optionally send -me(@realaravinth) an email so that -I can thank you :)

-

XMR

-
85QAHsHqg4WfA6G7ycXc7U4LmrSLCQARv6H9p3AYjf8o8YP
-WH3ngC8Zi7bUYGUifdXb54Xuz41kcu2pqgGFuAYp3VSh5JsR
-
- Monero address QR code - -
Monero address QR code
-
-

Liberapay

- -

- -

Edit this page on git.batsense.net

- -
-
- -
-
- - - - - - - - - diff --git a/index.html b/index.html deleted file mode 100644 index 9737f06..0000000 --- a/index.html +++ /dev/null @@ -1,189 +0,0 @@ - - - - - - - - - - - - - - mCaptcha - mCaptcha - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
-
- -
-
-
-

Defend Like Castles

-
-
-

mCaptcha is proof-of-work based captcha system that is privacy focused and fully automated.

- Try mCaptcha -       - Get started -

Libre software GitHub

-
-
-
- -
-
- -
-
-
-
-

Privacy focused

-

Doesn't track, doesn't profile your users.

-
-
-

Robust and Accurate

-

Got users behind NATs? No issues. We don't use IP address for rate-liming. NAT or not you get the mCaptcha experience. -

-
-

Best-in-class UX

-

mCaptcha is silent, so silent that your users won't even feel it. No more annoying images, no more helping for Big Brothers with their ML stuff

-
-
-
-
-

Defend like castles

-

Our PoW-based solution defends fierily. mCaptcha makes attacking your site more expensive than what it will take for you to respond to the attacker's requests

-
-
-

Libre Software

-

Client libraries are licensed using proprietary-friendly free software licenses but the core is AGPL'd. We believe this is a tech that can change the way the web works so mCaptcha will always be free

-
-
-

xCaptcha drop-in replacement

-

Already using a captcha solution? No worries, our APIs are compatible with reCAPTCHA and hCaptcha!

-
-
-
-
- - -
-
-
-
-
- - - - - - - - diff --git a/index.js b/index.js deleted file mode 100644 index 906e1f6..0000000 --- a/index.js +++ /dev/null @@ -1,284 +0,0 @@ -var suggestions = document.getElementById('suggestions'); -var userinput = document.getElementById('userinput'); - -document.addEventListener('keydown', inputFocus); - -function inputFocus(e) { - - if (e.keyCode === 191 ) { - e.preventDefault(); - userinput.focus(); - } - - if (e.keyCode === 27 ) { - userinput.blur(); - suggestions.classList.add('d-none'); - } - -} - -document.addEventListener('click', function(event) { - - var isClickInsideElement = suggestions.contains(event.target); - - if (!isClickInsideElement) { - suggestions.classList.add('d-none'); - } - -}); - -/* -Source: - - https://dev.to/shubhamprakash/trap-focus-using-javascript-6a3 -*/ - -document.addEventListener('keydown',suggestionFocus); - -function suggestionFocus(e){ - - const focusableSuggestions= suggestions.querySelectorAll('a'); - const focusable= [...focusableSuggestions]; - const index = focusable.indexOf(document.activeElement); - - let nextIndex = 0; - - if (e.keyCode === 38) { - e.preventDefault(); - nextIndex= index > 0 ? index-1 : 0; - focusableSuggestions[nextIndex].focus(); - } - else if (e.keyCode === 40) { - e.preventDefault(); - nextIndex= index+1 < focusable.length ? index+1 : index; - focusableSuggestions[nextIndex].focus(); - } - -} - - -/* -Source: - - https://github.com/nextapps-de/flexsearch#index-documents-field-search - - https://raw.githack.com/nextapps-de/flexsearch/master/demo/autocomplete.html -*/ - -(function(){ - - var index = new FlexSearch({ - preset: 'score', - cache: true, - doc: { - id: 'id', - field: [ - 'title', - 'description', - 'content', - ], - store: [ - 'href', - 'title', - 'description', - ], - }, - }); - - var docs = [ - { - id: 0, - href: "//localhost:1313/docs/webmasters/installing-captcha/", - title: "Installing mCaptcha on your website", - description: "Interested in deploying mCpatcha? From deploying a self-hosted instance to installing the CAPTCHA on your website, this guide will have you covered!", - content: "\u003cp\u003emCaptcha can protect your website from DDoS attacks. In this guide we\u0026rsquo;ll\nexplore how to install mCaptcha on your website. The end result will be\nsomething like this, on your website:\u003c/p\u003e\n\u003cfigure\u003e\n \u003cimg class=\"img-fluid lazyload blur-up\" data-sizes=\"auto\" src=\"//localhost:1313/docs/webmasters/installing-captcha/mcaptcha-widget-installation-result_hu8539423057366315365.png\" data-srcset=\"//localhost:1313/docs/webmasters/installing-captcha/mcaptcha-widget-installation-result_hu1419480717185241492.png 800w,//localhost:1313/docs/webmasters/installing-captcha/mcaptcha-widget-installation-result_hu18366116196027657266.png 700w,//localhost:1313/docs/webmasters/installing-captcha/mcaptcha-widget-installation-result_hu8883404866445004597.png 600w,//localhost:1313/docs/webmasters/installing-captcha/mcaptcha-widget-installation-result_hu1488805238489702261.png 500w\" width=\"618\" height=\"669\" alt=\"A registration form with mCaptcha widget installed\"\u003e\n \u003cnoscript\u003e\u003cimg class=\"img-fluid\" sizes=\"100vw\" srcset=\"//localhost:1313/docs/webmasters/installing-captcha/mcaptcha-widget-installation-result_hu1419480717185241492.png 800w,//localhost:1313/docs/webmasters/installing-captcha/mcaptcha-widget-installation-result_hu18366116196027657266.png 700w,//localhost:1313/docs/webmasters/installing-captcha/mcaptcha-widget-installation-result_hu8883404866445004597.png 600w,//localhost:1313/docs/webmasters/installing-captcha/mcaptcha-widget-installation-result_hu1488805238489702261.png 500w\" src=\"//localhost:1313/docs/webmasters/installing-captcha/mcaptcha-widget-installation-result.png\" width=\"618\" height=\"669\" alt=\"A registration form with mCaptcha widget installed\"\u003e\u003c/noscript\u003e\n\u003c/figure\u003e\n\u003cp\u003eFor the purpose of this demo, we will be using\n\u003ca href=\"https://demo.mcaptcha.org\"\u003edemo.mcaptcha.org\u003c/a\u003e, a demo instance running\nin @realaravinth\u0026rsquo;s bedroom(for this same reason, it shouldn\u0026rsquo;t be used\nfor anything serious)\u003c/p\u003e\n\u003ch2 id=\"1-create-an-account-and-sign-into-the-mcaptcha-dashboard\"\u003e1. Create an account and sign into the mCaptcha dashboard\u003c/h2\u003e\n\u003cp\u003eHead over to \u003ca href=\"https://demo.mcaptcha.org/join\"\u003edemo.mcaptcha.org\u003c/a\u003e and\ncreate an account. When ready, sign in.\u003c/p\u003e\n\u003ch2 id=\"2-create-new-site-key\"\u003e2. Create new site key\u003c/h2\u003e\n\u003cp\u003eA \u003ca href=\"/docs/terminology/sitekey/\"\u003esite key\u003c/a\u003e is how a new CAPTCHA is configured within mCaptcha. To create\na new site key, click on \u0026ldquo;New Site\u0026rdquo; button in the dashboard.\u003c/p\u003e\n\u003cfigure\u003e\n \u003cimg class=\"img-fluid lazyload blur-up\" data-sizes=\"auto\" src=\"//localhost:1313/docs/webmasters/installing-captcha/new-sitekey-btn_hu11033699157513405873.png\" data-srcset=\"//localhost:1313/docs/webmasters/installing-captcha/new-sitekey-btn_hu10010004554705777348.png 900w,//localhost:1313/docs/webmasters/installing-captcha/new-sitekey-btn_hu14464019368571524603.png 800w,//localhost:1313/docs/webmasters/installing-captcha/new-sitekey-btn_hu9084147443362993093.png 700w,//localhost:1313/docs/webmasters/installing-captcha/new-sitekey-btn_hu14798931076198918212.png 600w,//localhost:1313/docs/webmasters/installing-captcha/new-sitekey-btn_hu15308330692516730217.png 500w\" width=\"1825\" height=\"857\" alt=\"mCaptcha dashboard with the \u0026#39;new site key\u0026#39; button highlighted\"\u003e\n \u003cnoscript\u003e\u003cimg class=\"img-fluid\" sizes=\"100vw\" srcset=\"//localhost:1313/docs/webmasters/installing-captcha/new-sitekey-btn_hu10010004554705777348.png 900w,//localhost:1313/docs/webmasters/installing-captcha/new-sitekey-btn_hu14464019368571524603.png 800w,//localhost:1313/docs/webmasters/installing-captcha/new-sitekey-btn_hu9084147443362993093.png 700w,//localhost:1313/docs/webmasters/installing-captcha/new-sitekey-btn_hu14798931076198918212.png 600w,//localhost:1313/docs/webmasters/installing-captcha/new-sitekey-btn_hu15308330692516730217.png 500w\" src=\"//localhost:1313/docs/webmasters/installing-captcha/new-sitekey-btn.png\" width=\"1825\" height=\"857\" alt=\"mCaptcha dashboard with the \u0026#39;new site key\u0026#39; button highlighted\"\u003e\u003c/noscript\u003e\n\u003c/figure\u003e\n\u003cp\u003eThere are two options to create a new site key, easy and advanced. \u003cstrong\u003eWe\nare going to use the \u003ca href=\"/docs/webmasters/configuring-difficulty-factor#easy-option\"\u003eeasy mode\u003c/a\u003e in this tutorial.\u003c/strong\u003e If you are interested\nin learning more about the advance mode, please see \u003ca href=\"/docs/introduction/configuring-difficulty-factor/#advance-option\"\u003ehere\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eFill the form and submit it.\u003c/p\u003e\n\u003cfigure\u003e\n \u003cimg class=\"img-fluid lazyload blur-up\" data-sizes=\"auto\" src=\"//localhost:1313/docs/webmasters/installing-captcha/new-sitekey-easy-mode-filled_hu10048884879092657437.png\" data-srcset=\"//localhost:1313/docs/webmasters/installing-captcha/new-sitekey-easy-mode-filled_hu12219892087371285417.png 900w,//localhost:1313/docs/webmasters/installing-captcha/new-sitekey-easy-mode-filled_hu10382683775793860778.png 800w,//localhost:1313/docs/webmasters/installing-captcha/new-sitekey-easy-mode-filled_hu9217787487936361361.png 700w,//localhost:1313/docs/webmasters/installing-captcha/new-sitekey-easy-mode-filled_hu4911848437118511279.png 600w,//localhost:1313/docs/webmasters/installing-captcha/new-sitekey-easy-mode-filled_hu4122546434746224491.png 500w\" width=\"720\" height=\"452\" alt=\"mCaptcha dashboard with the \u0026#39;new site key\u0026#39; form in easy mode, with details filled in\"\u003e\n \u003cnoscript\u003e\u003cimg class=\"img-fluid\" sizes=\"100vw\" srcset=\"//localhost:1313/docs/webmasters/installing-captcha/new-sitekey-easy-mode-filled_hu12219892087371285417.png 900w,//localhost:1313/docs/webmasters/installing-captcha/new-sitekey-easy-mode-filled_hu10382683775793860778.png 800w,//localhost:1313/docs/webmasters/installing-captcha/new-sitekey-easy-mode-filled_hu9217787487936361361.png 700w,//localhost:1313/docs/webmasters/installing-captcha/new-sitekey-easy-mode-filled_hu4911848437118511279.png 600w,//localhost:1313/docs/webmasters/installing-captcha/new-sitekey-easy-mode-filled_hu4122546434746224491.png 500w\" src=\"//localhost:1313/docs/webmasters/installing-captcha/new-sitekey-easy-mode-filled.png\" width=\"720\" height=\"452\" alt=\"mCaptcha dashboard with the \u0026#39;new site key\u0026#39; form in easy mode, with details filled in\"\u003e\u003c/noscript\u003e\n\u003c/figure\u003e\n\u003ch2 id=\"3-copy-widget-link\"\u003e3. Copy widget link\u003c/h2\u003e\n\u003cp\u003eSubmitting the form will take you to a page where site key configuration\ncan be viewed. \u0026ldquo;View deployment\u0026rdquo; link will display CAPTCHA widget with\nthe supplied configuration. Click on it and grab the widget link.\u003c/p\u003e\n\u003ch2 id=\"4-install-mcaptcha-on-your-website\"\u003e4. Install mCaptcha on your website\u003c/h2\u003e\n\u003cp\u003eIntegration support is available for some frontend JavaScript\nframeworks. To see full list of supported frameworks, please see\n\u003ca href=\"https://github.com/mCaptcha/glue#framework-support\"\u003ehere\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eThere are two options to use the integration library to integrate\nmCaptcha on your website:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eServe the integration library yourself\u003c/li\u003e\n\u003cli\u003eUse a CDN like unpkg.com\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eIn this tutorial, we\u0026rsquo;ll be using the CDN.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ePasting the following snippet on the page, within the form\u003c/strong\u003e that requires to be protected\nwill load the mCaptcha widget with the configuration supplied. Be sure\nto replace \u003ccode\u003eYour {{paste your widget link}}\u003c/code\u003e with the link obtained from\nthe previous step.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e 1\u003c/span\u003e\u003cspan\u003e\u0026lt;\u003cspan style=\"color:#ff79c6\"\u003elabel\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e 2\u003c/span\u003e\u003cspan\u003e \u003cspan style=\"color:#50fa7b\"\u003edata-mcaptcha_url\u003c/span\u003e\u003cspan style=\"color:#ff79c6\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f1fa8c\"\u003e\u0026#34;{{paste your widget link here}}\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e 3\u003c/span\u003e\u003cspan\u003e \u003cspan style=\"color:#50fa7b\"\u003efor\u003c/span\u003e\u003cspan style=\"color:#ff79c6\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f1fa8c\"\u003e\u0026#34;mcaptcha__token\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e 4\u003c/span\u003e\u003cspan\u003e \u003cspan style=\"color:#50fa7b\"\u003eid\u003c/span\u003e\u003cspan style=\"color:#ff79c6\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f1fa8c\"\u003e\u0026#34;mcaptcha__token-label\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e 5\u003c/span\u003e\u003cspan\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e 6\u003c/span\u003e\u003cspan\u003e mCaptcha authorization token.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e 7\u003c/span\u003e\u003cspan\u003e \u0026lt;\u003cspan style=\"color:#ff79c6\"\u003ea\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e 8\u003c/span\u003e\u003cspan\u003e \u003cspan style=\"color:#50fa7b\"\u003ehref\u003c/span\u003e\u003cspan style=\"color:#ff79c6\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f1fa8c\"\u003e\u0026#34;https://mcaptcha.org/docs/user-manual/how-to-mcaptcha-without-js/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e 9\u003c/span\u003e\u003cspan\u003e \u0026gt;Instructions\u0026lt;/\u003cspan style=\"color:#ff79c6\"\u003ea\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e10\u003c/span\u003e\u003cspan\u003e \u0026gt;.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e11\u003c/span\u003e\u003cspan\u003e \u0026lt;\u003cspan style=\"color:#ff79c6\"\u003einput\u003c/span\u003e \u003cspan style=\"color:#50fa7b\"\u003etype\u003c/span\u003e\u003cspan style=\"color:#ff79c6\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f1fa8c\"\u003e\u0026#34;text\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#50fa7b\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#ff79c6\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f1fa8c\"\u003e\u0026#34;mcaptcha__token\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#50fa7b\"\u003eid\u003c/span\u003e\u003cspan style=\"color:#ff79c6\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f1fa8c\"\u003e\u0026#34;mcaptcha__token\u0026#34;\u003c/span\u003e /\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e12\u003c/span\u003e\u003cspan\u003e\u0026lt;/\u003cspan style=\"color:#ff79c6\"\u003elabel\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e13\u003c/span\u003e\u003cspan\u003e\u0026lt;\u003cspan style=\"color:#ff79c6\"\u003ediv\u003c/span\u003e \u003cspan style=\"color:#50fa7b\"\u003eid\u003c/span\u003e\u003cspan style=\"color:#ff79c6\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f1fa8c\"\u003e\u0026#34;mcaptcha__widget-container\u0026#34;\u003c/span\u003e\u0026gt;\u0026lt;/\u003cspan style=\"color:#ff79c6\"\u003ediv\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e14\u003c/span\u003e\u003cspan\u003e\u0026lt;\u003cspan style=\"color:#ff79c6\"\u003escript\u003c/span\u003e \u003cspan style=\"color:#50fa7b\"\u003esrc\u003c/span\u003e\u003cspan style=\"color:#ff79c6\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f1fa8c\"\u003e\u0026#34;https://unpkg.com/@mcaptcha/vanilla-glue@0.1.0-rc2/dist/index.js\u0026#34;\u003c/span\u003e\u0026gt;\u0026lt;/\u003cspan style=\"color:#ff79c6\"\u003escript\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eA full example is available\n\u003ca href=\"https://github.com/mCaptcha/glue/blob/ea576d875457de54d82bed3edfc4ee68302fa4d8/packages/vanilla/static/embeded.html\"\u003ehere\u003c/a\u003e.\u003c/p\u003e\n\u003ch2 id=\"5-configure-backend-to-authenticate-captcha-tokens\"\u003e5. Configure backend to authenticate CAPTCHA tokens\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eGet \u003ca href=\"/docs/webmasters/terminology/#authorization-token\"\u003eauthorization token\u003c/a\u003e from the user\u0026rsquo;s\nform submission payload. The access token will be associated with a\nparameter called \u003ccode\u003emcaptcha__token\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-python\" data-lang=\"python\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e1\u003c/span\u003e\u003cspan\u003e mcaptcha_token \u003cspan style=\"color:#ff79c6\"\u003e=\u003c/span\u003e request\u003cspan style=\"color:#ff79c6\"\u003e.\u003c/span\u003eform[\u003cspan style=\"color:#f1fa8c\"\u003e\u0026#34;mcaptcha__token\u0026#34;\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eValidate access token with mCaptcha instance\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-python\" data-lang=\"python\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e 1\u003c/span\u003e\u003cspan\u003epayload \u003cspan style=\"color:#ff79c6\"\u003e=\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e 2\u003c/span\u003e\u003cspan\u003e \u003cspan style=\"color:#f1fa8c\"\u003e\u0026#34;token\u0026#34;\u003c/span\u003e: mcaptcha_token,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e 3\u003c/span\u003e\u003cspan\u003e \u003cspan style=\"color:#f1fa8c\"\u003e\u0026#34;key\u0026#34;\u003c/span\u003e: mcaptcha_sitekey, \u003cspan style=\"color:#6272a4\"\u003e# captcha site key\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e 4\u003c/span\u003e\u003cspan\u003e \u003cspan style=\"color:#6272a4\"\u003e# mCaptcha account secret; available in settings\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e 5\u003c/span\u003e\u003cspan\u003e \u003cspan style=\"color:#f1fa8c\"\u003e\u0026#34;secret\u0026#34;\u003c/span\u003e: mcaptcha_account_secret,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e 6\u003c/span\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e 7\u003c/span\u003e\u003cspan\u003eresp \u003cspan style=\"color:#ff79c6\"\u003e=\u003c/span\u003e requests\u003cspan style=\"color:#ff79c6\"\u003e.\u003c/span\u003epost(\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e 8\u003c/span\u003e\u003cspan\u003e \u003cspan style=\"color:#f1fa8c\"\u003e\u0026#34;https://demo.mcaptha.org/api/v1/pow/siteverify\u0026#34;\u003c/span\u003e, json\u003cspan style=\"color:#ff79c6\"\u003e=\u003c/span\u003epayload\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e 9\u003c/span\u003e\u003cspan\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e10\u003c/span\u003e\u003cspan\u003eresp \u003cspan style=\"color:#ff79c6\"\u003e=\u003c/span\u003e resp\u003cspan style=\"color:#ff79c6\"\u003e.\u003c/span\u003ejson()\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cstrong\u003eNote\u003c/strong\u003e: secret (\u003ccode\u003emcaptcha_account_secret\u003c/code\u003e from above) is available in Dashboard \u0026gt; Settings \u0026gt; Secret\u003c/p\u003e\n\u003col start=\"3\"\u003e\n\u003cli\u003eIf access token is valid, allow access to protected resource or deny\naccess.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-python\" data-lang=\"python\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e1\u003c/span\u003e\u003cspan\u003e \u003cspan style=\"color:#ff79c6\"\u003eif\u003c/span\u003e resp[\u003cspan style=\"color:#f1fa8c\"\u003e\u0026#34;valid\u0026#34;\u003c/span\u003e] \u003cspan style=\"color:#ff79c6\"\u003e==\u003c/span\u003e \u003cspan style=\"color:#ff79c6\"\u003eFalse\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e2\u003c/span\u003e\u003cspan\u003e \u003cspan style=\"color:#ff79c6\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#f1fa8c\"\u003e\u0026#34;invalid captcha\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#bd93f9\"\u003e400\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e3\u003c/span\u003e\u003cspan\u003e \u003cspan style=\"color:#ff79c6\"\u003eelse\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e4\u003c/span\u003e\u003cspan\u003e \u003cspan style=\"color:#ff79c6\"\u003ereturn\u003c/span\u003e allow_access_to_protected_resource(request\u003cspan style=\"color:#ff79c6\"\u003e.\u003c/span\u003eform)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePlease see here for a complete \u003ca href=\"https://github.com/mCaptcha/dos/tree/8f2b53ab46d64fa78a8300dc8ce9d78578ffce12/server\"\u003eFlask example\u003c/a\u003e and here for an \u003ca href=\"https://github.com/mCaptcha/dos/tree/8f2b53ab46d64fa78a8300dc8ce9d78578ffce12/rust-server/demo-server\"\u003eActix\nWeb example\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eCongratulations, mCaptcha is now integrated with your website!\u003c/p\u003e\n" - }, - { - id: 1, - href: "//localhost:1313/docs/webmasters/configuring-difficulty-factor/", - title: "Configuring Difficulty Factor", - description: "mCaptcha has options to configure its proof of work engine behavior, this page explains how to determine difficulty facotrs that work best for your website!", - content: "\u003cp\u003emCaptcha is highly responsive to detecting DDoS attacks. Admins are\nadvised to take advantage of it by setting low \u003ca href=\"/docs/terminology/difficulty-factor/\"\u003edifficulty\nfactors\u003c/a\u003e for normal traffic levels\nfor their website.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eLowest advisable difficulty factor is 5000.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eFor instance, if it is normal for my website to get 2000 requests for\nevery 30 seconds, I will set a \u003ca href=\"/docs/terminology/cooldown-period\"\u003ecool\ndown\u003c/a\u003e period of 30 seconds and the\nfirst level of difficulty configuration will have a \u003ca href=\"/docs/terminology/visitor-threshold\"\u003evisitor threshold\u003c/a\u003e of 2000 with a\ndifficulty factor of 5000.\u003c/p\u003e\n\u003cp\u003eThere are two modes to setting difficulty factor for your website on\nmCaptcha:\u003c/p\u003e\n\u003ch3 id=\"easy-option\"\u003eEasy option\u003c/h3\u003e\n\u003cp\u003eEasy mode asks a few basic statistics about your website and generates a\nconfiguration that should work for your website. Currently, easy mode is\nguided by assumptions on suitable difficulty factors to protect a\nwebsite but it will be fine-tuned as mCaptcha sees more deployment.\u003c/p\u003e\n\u003cp\u003eConfiguration generated by easy mode can be tweaked later using the\nadvance mode, as you become more familiar with how mCaptcha works.\u003c/p\u003e\n\u003cfigure\u003e\n \u003cimg class=\"img-fluid lazyload blur-up\" data-sizes=\"auto\" src=\"//localhost:1313/docs/webmasters/configuring-difficulty-factor/new-sitekey-easy-mode_hu3790320397528559381.png\" data-srcset=\"//localhost:1313/docs/webmasters/configuring-difficulty-factor/new-sitekey-easy-mode_hu3841561947870357023.png 900w,//localhost:1313/docs/webmasters/configuring-difficulty-factor/new-sitekey-easy-mode_hu16851969312021998206.png 800w,//localhost:1313/docs/webmasters/configuring-difficulty-factor/new-sitekey-easy-mode_hu1638060647632851116.png 700w,//localhost:1313/docs/webmasters/configuring-difficulty-factor/new-sitekey-easy-mode_hu6084644606388858577.png 600w,//localhost:1313/docs/webmasters/configuring-difficulty-factor/new-sitekey-easy-mode_hu14912407229894826701.png 500w\" width=\"720\" height=\"452\" alt=\"new sitekey form in easy mode\"\u003e\n \u003cnoscript\u003e\u003cimg class=\"img-fluid\" sizes=\"100vw\" srcset=\"//localhost:1313/docs/webmasters/configuring-difficulty-factor/new-sitekey-easy-mode_hu3841561947870357023.png 900w,//localhost:1313/docs/webmasters/configuring-difficulty-factor/new-sitekey-easy-mode_hu16851969312021998206.png 800w,//localhost:1313/docs/webmasters/configuring-difficulty-factor/new-sitekey-easy-mode_hu1638060647632851116.png 700w,//localhost:1313/docs/webmasters/configuring-difficulty-factor/new-sitekey-easy-mode_hu6084644606388858577.png 600w,//localhost:1313/docs/webmasters/configuring-difficulty-factor/new-sitekey-easy-mode_hu14912407229894826701.png 500w\" src=\"//localhost:1313/docs/webmasters/configuring-difficulty-factor/new-sitekey-easy-mode.png\" width=\"720\" height=\"452\" alt=\"new sitekey form in easy mode\"\u003e\u003c/noscript\u003e\n\u003c/figure\u003e\n\u003ch3 id=\"advance-option\"\u003eAdvance option\u003c/h3\u003e\n\u003cp\u003eAdvance mode gives the admin granular control over how mCaptcha behaves\non their website. It has options to set the difficulty factor for each\nlevel of traffic(or visitor threshold, in mCaptcha speak), fully taking\nadvantage of mCaptcha\u0026rsquo;s variable difficulty factor feature.\u003c/p\u003e\n\u003cp\u003eFor instance, if it is normal for a website to get 200 requests over 30\nseconds, then setting a very low difficulty factor for a visitor\nthreshold of 200 and a cool down period of 30 seconds will allow the\nusers to pass through without waiting on the CAPTCHA. But if 1000\nrequests over 30 seconds will bring down the service, then the admin can\nconfigure increasing levels of difficulty factor of increasing traffic\nlevels, effectively rate limiting its users and protecting the\nunderlying website.\u003c/p\u003e\n\u003cfigure\u003e\n \u003cimg class=\"img-fluid lazyload blur-up\" data-sizes=\"auto\" src=\"//localhost:1313/docs/webmasters/configuring-difficulty-factor/new-sitekey-adv-mode_hu14086191014643178449.png\" data-srcset=\"//localhost:1313/docs/webmasters/configuring-difficulty-factor/new-sitekey-adv-mode_hu15526148153509317663.png 900w,//localhost:1313/docs/webmasters/configuring-difficulty-factor/new-sitekey-adv-mode_hu2633109694258692951.png 800w,//localhost:1313/docs/webmasters/configuring-difficulty-factor/new-sitekey-adv-mode_hu4034073819773116662.png 700w,//localhost:1313/docs/webmasters/configuring-difficulty-factor/new-sitekey-adv-mode_hu11041752311853583462.png 600w,//localhost:1313/docs/webmasters/configuring-difficulty-factor/new-sitekey-adv-mode_hu13951058338117607007.png 500w\" width=\"720\" height=\"407\" alt=\"new sitekey form in advance mode\"\u003e\n \u003cnoscript\u003e\u003cimg class=\"img-fluid\" sizes=\"100vw\" srcset=\"//localhost:1313/docs/webmasters/configuring-difficulty-factor/new-sitekey-adv-mode_hu15526148153509317663.png 900w,//localhost:1313/docs/webmasters/configuring-difficulty-factor/new-sitekey-adv-mode_hu2633109694258692951.png 800w,//localhost:1313/docs/webmasters/configuring-difficulty-factor/new-sitekey-adv-mode_hu4034073819773116662.png 700w,//localhost:1313/docs/webmasters/configuring-difficulty-factor/new-sitekey-adv-mode_hu11041752311853583462.png 600w,//localhost:1313/docs/webmasters/configuring-difficulty-factor/new-sitekey-adv-mode_hu13951058338117607007.png 500w\" src=\"//localhost:1313/docs/webmasters/configuring-difficulty-factor/new-sitekey-adv-mode.png\" width=\"720\" height=\"407\" alt=\"new sitekey form in advance mode\"\u003e\u003c/noscript\u003e\n\u003c/figure\u003e\n" - }, - { - id: 2, - href: "//localhost:1313/docs/self-hosting/getting-started/", - title: "Getting started", - description: "Get started with self-hosting mCaptcha", - content: "\u003ch2 id=\"get-started\"\u003eGet started\u003c/h2\u003e\n\u003cp\u003eThere are two main ways to self-host mCaptcha:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"./bare-metal\"\u003eBare metal\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"./docker\"\u003eWith Docker\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"./ansible\"\u003eWith Ansible\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n" - }, - { - id: 3, - href: "//localhost:1313/docs/self-hosting/bare-metal/", - title: "Deploy bare metal", - description: "Bare metal deployment is tedious, most of this will be automated with a script in the future.", - content: "\u003ch2 id=\"1-install-database\"\u003e1. Install Database\u003c/h2\u003e\n\u003cp\u003eThe following databases are supported:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003ePostgres\u003c/li\u003e\n\u003cli\u003eMariaDB\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003ePlease install the database of your choice. Then:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eCreate new database user for mCaptcha\u003c/li\u003e\n\u003cli\u003eCreate new database for mCaptcha\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003emCaptcha binary has migrations baked-in and is applied on start up. The\nchoice of database is described using the \u003ca href=\"https://developer.mozilla.org/en-US/docs/Learn/Common_questions/Web_mechanics/What_is_a_URL#scheme\"\u003escheme\u003c/a\u003e of the database URL. For\ninstance:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003ePostgres: \u003ccode\u003epostgres://mcaptcha:password@localhost:5432/mcaptcha\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eMariadb: \u003ccode\u003emysql://mcaptcha:password@localhost:3306/mcaptcha\u003c/code\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"2-optionally-install-mcaptchacache\"\u003e2. Optionally, install mCaptcha/cache\u003c/h2\u003e\n\u003cp\u003eWe recommend this for larger instances. For single-user instances or for\ninstances that protect personal websites, we recommend using the\ninternal cache system. To do so, please comment out the\n\u003ca href=\"https://github.com/mCaptcha/mCaptcha/blob/d4967626ee59504b32b0f85e409b4e3444ddc4f0/config/default.toml#L54\"\u003e\u003ccode\u003eredis\u003c/code\u003e\u003c/a\u003e section of the configuration file.\u003c/p\u003e\n\u003cp\u003ePlease see \u003ca href=\"https://github.com/mCaptcha/cache\"\u003e\u003ccode\u003emCaptcha/cache\u003c/code\u003e\u003c/a\u003e for more details.\u003c/p\u003e\n\u003ch2 id=\"3-install-mcaptcha\"\u003e3. Install mCaptcha\u003c/h2\u003e\n\u003ch3 id=\"31-install-from-source\"\u003e3.1 Install from source\u003c/h3\u003e\n\u003cp\u003eTo build \u003ccode\u003emcaptcha\u003c/code\u003e, you need the following dependencies:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003erust\u003c/li\u003e\n\u003cli\u003enode(\u003ccode\u003ev20\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eyarn(JavaScript package manager)\u003c/li\u003e\n\u003cli\u003emake\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eWith all dependencies installed, run:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003emake dev-env \u0026amp;\u0026amp; make release\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eAnd the following commands to install the compiled binary:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003esudo cp ./target/release/mcaptcha /usr/bin/ \u0026amp;\u0026amp; \\\n\tmkdir sudo /etc/mcaptcha \u0026amp;\u0026amp; \\\n\tsudo cp config/default.toml /etc/mcaptcha/config.toml\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"32-install-pre-compiled-binary\"\u003e3.2 Install pre-compiled binary\u003c/h3\u003e\n\u003ch4 id=\"i-download-assets\"\u003ei. Download assets\u003c/h4\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ewget https://dl.mcaptcha.org/mcaptcha/mCaptcha/master/mcaptcha-master-linux-amd64.tar.gz.asc\nwget https://dl.mcaptcha.org/mcaptcha/mCaptcha/master/mcaptcha-master-linux-amd64.tar.gz.sha256\nwget https://dl.mcaptcha.org/mcaptcha/mCaptcha/master/mcaptcha-master-linux-amd64.tar.gz\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"ii-verify-checksum\"\u003eii Verify checksum\u003c/h3\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003esha256sum -c mcaptcha-master-linux-amd64.tar.gz.sha256\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"iii-verify-gpg-signature\"\u003eiii Verify GPG signature\u003c/h3\u003e\n\u003cp\u003eAll mcaptcha binaries are signed with \u003ca href=\"https://keyserver.ubuntu.com/pks/lookup?search=73DAC973A9ADBB9ADCB5CDC4595A08135BA9FF73\u0026amp;fingerprint=on\u0026amp;op=index\"\u003eour GPG\nkey\u003c/a\u003e.\nPlease verify signatures to verify authenticity.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003egpg --keyserver keyserver.ubuntu.com --recv 73DAC973A9ADBB9ADCB5CDC4595A08135BA9FF73\ngpg --verify mcaptcha-master-linux-amd64.tar.gz.asc\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"iv-install\"\u003eiv. Install\u003c/h3\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003etar -xvzf mcaptcha-master-linux-amd64.tar.gz \\\n \u0026amp;\u0026amp; sudo cp mcaptcha-master-linux-amd64/mcaptcha /usr/local/bin \\\n \u0026amp;\u0026amp; sudo mkdir /etc/mcaptcha \\\n \u0026amp;\u0026amp; sudo cp mcaptcha-master-linux-amd64/config.toml /etc/mcaptcha/\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"4-configuration\"\u003e4. Configuration\u003c/h3\u003e\n\u003cp\u003emCaptcha is highly configurable.\u003c/p\u003e\n\u003cp\u003eConfiguration is applied/merged in the following order:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003epath to configuration file passed in via \u003ccode\u003eMCAPTCHA_CONFIG\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e./config/default.toml\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/etc/mcaptcha/config.toml\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eenvironment variables. Please see\n\u003ca href=\"https://github.com/mCaptcha/mCaptcha/blob/master/docs/CONFIGURATION.md\"\u003ehere\u003c/a\u003e for a full list of environment variables.\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"5-systemd-service-configuration\"\u003e5. Systemd service configuration:\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eCopy the following to \u003ccode\u003e/etc/systemd/system/mcaptcha.service\u003c/code\u003e:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e[Unit]\nDescription=mCaptcha: a CAPTCHA system that gives attackers a run for their money\n\n[Service]\nType=simple\nUser=mcaptcha\nExecStart=/usr/bin/mcaptcha\nRestart=on-failure\nRestartSec=1\nSuccessExitStatus=3 4\nRestartForceExitStatus=3 4\nSystemCallArchitectures=native\nMemoryDenyWriteExecute=true\nNoNewPrivileges=true\nEnvironment=\u0026#34;RUST_LOG=info\u0026#34;\n\n[Unit]\nAfter=sound.target\nWants=network-online.target\nWants=network-online.target\nRequires=postgresql.service\nAfter=syslog.target\n\n[Install]\nWantedBy=multi-user.target\n\u003c/code\u003e\u003c/pre\u003e\u003col start=\"2\"\u003e\n\u003cli\u003eEnable service:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003esudo systemctl daemon-reload \u0026amp;\u0026amp; \\\n\tsudo systemctl enable mcaptcha \u0026amp;\u0026amp; \\ # Auto startup during boot\n\tsudo systemctl start mcaptcha\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"6-install-and-configure-nginx\"\u003e6. Install and configure Nginx\u003c/h3\u003e\n\u003cp\u003emCaptcha doesn\u0026rsquo;t implement SSL yet. Please use a reverse proxy like\nNginx to add SSL to your deployment. Here\u0026rsquo;s an example virtual host\nconfiguration for Nginx:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eserver {\n server_name \u0026lt;your mcaptcha hostname\u0026gt;;\n\tlisten 80;\n\tlisten [::]:80;\n\n\tlocation / {\n\t\tproxy_pass http://127.0.0.1:\u0026lt;mcaptcha_port\u0026gt;;\n\t\tproxy_set_header Host $host;\n proxy_set_header Host $host;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection \u0026#34;upgrade\u0026#34;;\n proxy_set_header X-Forwarded-For $remote_addr;\n proxy_set_header X-Forwarded-Proto $scheme;\n\t}\n\n}\n\u003c/code\u003e\u003c/pre\u003e" - }, - { - id: 4, - href: "//localhost:1313/docs/self-hosting/ansible/", - title: "Using Ansible", - description: "Deploy mCaptcha software using Ansible playbooks", - content: "\u003cp\u003eAnsible playbooks to install mCaptcha are available \u003ca href=\"https://git.batsense.net/mCaptcha/iac\"\u003ehere\u003c/a\u003e.\u003c/p\u003e\n\u003ch2 id=\"instructions\"\u003eInstructions\u003c/h2\u003e\n\u003ch3 id=\"installation\"\u003eInstallation\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eClone the repository:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e1\u003c/span\u003e\u003cspan\u003egit clone https://git.batsense.net/mCaptcha/iac \u003cspan style=\"color:#ff79c6\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan style=\"color:#8be9fd;font-style:italic\"\u003ecd\u003c/span\u003e iac\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"2\"\u003e\n\u003cli\u003e\n\u003cp\u003eCreate inventory file. You should have SSH access to the remote\nmachine, and the user must have \u003ccode\u003esudo\u003c/code\u003e privileges. Example inventory\nfile:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ini\" data-lang=\"ini\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e1\u003c/span\u003e\u003cspan\u003e\u003cspan style=\"color:#ff79c6\"\u003e[mcaptcha_hosts]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e2\u003c/span\u003e\u003cspan\u003e\u003cspan style=\"color:#50fa7b\"\u003e\u0026#34;mcaptcha_hosts\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e3\u003c/span\u003e\u003cspan\u003e\u003cspan style=\"color:#50fa7b\"\u003e\u0026lt;node name\u0026gt; ansible_host\u003c/span\u003e\u003cspan style=\"color:#ff79c6\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f1fa8c\"\u003e\u0026lt;node IP\u0026gt; ansible_user=\u0026lt;remote username\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eIt is important that the group name be \u003ccode\u003emcaptcha_hosts\u003c/code\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eConfigure installation by editing \u003ca href=\"https://git.batsense.net/mCaptcha/iac/src/branch/master/ansible/vars/mcaptcha/vars.yml\"\u003eansible/vars/mcaptcha/vars.yml\u003c/a\u003e. Most parameters have defaults, and the required parameters are annotated.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRun playbook:\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e1\u003c/span\u003e\u003cspan\u003e\tansible-playbook -i path/to/inventory-file -f \u003cspan style=\"color:#bd93f9\"\u003e10\u003c/span\u003e ./ansible/mcaptcha.yml\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"update\"\u003eUpdate\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003ePull changes from Git repository\u003c/li\u003e\n\u003cli\u003eRerun playbook\u003c/li\u003e\n\u003c/ol\u003e\n" - }, - { - id: 5, - href: "//localhost:1313/docs/self-hosting/docker/", - title: "Using Docker", - description: "Deploy mCaptcha using docker", - content: "\u003ch2 id=\"with-docker\"\u003eWith Docker\u003c/h2\u003e\n\u003ch3 id=\"1-configure\"\u003e1. Configure\u003c/h3\u003e\n\u003cp\u003emcaptcha is highly configurable.\u003c/p\u003e\n\u003cp\u003eConfiguration is applied/merged in the following order:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003epath to configuration file passed in via \u003ccode\u003eMCAPTCHA_CONFIG\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e./config/default.toml\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/etc/mcaptcha/config.toml\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eenvironment variables.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eSee\n\u003ca href=\"https://github.com/mCaptcha/mCaptcha/tree/master/docs/CONFIGURATION.md\"\u003eCONFIGURATION.md\u003c/a\u003e\nfor configurable options.\u003c/p\u003e\n\u003ch3 id=\"2-run-image\"\u003e2. Run image\u003c/h3\u003e\n\u003cp\u003eIf you have already have a Postgres instance running, then:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003edocker run -p \u0026lt;host-machine-port\u0026gt;:\u0026lt;port-in-configuration-file\u0026gt; \\\n\t--add-host=database:\u0026lt;database-ip-addrss\u0026gt; \\\n\t-e RUST_LOG=debug \\\n\t-e DATABASE_URL=\u0026#34;postgres://\u0026lt;db-user\u0026gt;:\u0026lt;db-password\u0026gt;@database:\u0026lt;db-port\u0026gt;/\u0026lt;db-name\u0026gt;\u0026#34; \\\n\tmcaptcha/mcaptcha:latest\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eIf you don\u0026rsquo;t have a Postgres instance running, you can either install\none using a package manager or launch one with docker.\u003c/p\u003e\n\u003ch2 id=\"with-docker-compose\"\u003eWith docker-compose\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003eDownload docker-compose file and the configuration file:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ewget https://raw.githubusercontent.com/mCaptcha/mCaptcha/master/.env.docker-compose\nwget https://raw.githubusercontent.com/mCaptcha/mCaptcha/master/docker-compose.yml\n\u003c/code\u003e\u003c/pre\u003e\u003col start=\"2\"\u003e\n\u003cli\u003e\n\u003cp\u003eConfigure deployment using \u003ccode\u003e.env.docker-compose\u003c/code\u003e environment variable\nfile\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLaunch containers:\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003edocker-compose up -d\n\u003c/code\u003e\u003c/pre\u003e\u003col start=\"4\"\u003e\n\u003cli\u003eConfigure SSL using reverse proxy: mCaptcha doesn\u0026rsquo;t support SSL at\nthe moment, so please use a reverse proxy to secure your instance. A\nreference nginx virtual host configuration file is available \u003ca href=\"../bare-metal/#6-install-and-configure-nginx\"\u003ehere\u003c/a\u003e.\u003c/li\u003e\n\u003c/ol\u003e\n" - }, - { - id: 6, - href: "//localhost:1313/docs/help/troubleshooting/", - title: "Troubleshooting", - description: "Solutions to common problems.", - content: "\u003ch2 id=\"q-i-just-setup-an-instance-but-i-am-unable-to-login\"\u003eQ: I just setup an instance but I am unable to login\u003c/h2\u003e\n\u003cp\u003emCaptcha by default is configured to server at \u003ccode\u003elocalhost\u003c/code\u003e hostname. If\nthe instance is deployed at another hostname, please try setting\n\u003ccode\u003eMCAPTCHA_SERVER_DOMAIN\u003c/code\u003e environment variable to the hostname at which\nyour instance is deployed or setting the equivalent in config.toml:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-toml\" data-lang=\"toml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e1\u003c/span\u003e\u003cspan\u003e[server]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e2\u003c/span\u003e\u003cspan\u003edomain=mydomain\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e" - }, - { - id: 7, - href: "//localhost:1313/docs/api/browser/", - title: "Browser libraries", - description: "API documenttion for mCaptcha WASM library", - content: "\u003cp\u003eThe browser part of mCaptcha is divided into three components.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eGlue code\u003c/li\u003e\n\u003cli\u003eWidget program\u003c/li\u003e\n\u003cli\u003eProof-of-Work libraries(WebAssembly and JavaScript polyfill)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"glue-code\"\u003eGlue code\u003c/h2\u003e\n\u003cp\u003eThis is the code that links mCaptcha with your website\u0026rsquo;s frontend code.\nIt creates an \u003ccode\u003eiframe\u003c/code\u003e containing the mCaptcha widget and injects the\nreceived verification proof token into a hidden input field.\u003c/p\u003e\n\u003cp\u003eSupport is available for various frameworks, see\n\u003ca href=\"https://github.com/mCaptcha/glue\"\u003e\u003ccode\u003emCaptcha/glue\u003c/code\u003e\u003c/a\u003e for the full list.\u003c/p\u003e\n\u003cp\u003eFor frameworks without official support, a low-level library,\n\u003ca href=\"https://www.npmjs.com/package/@mcaptcha/core-glue\"\u003e\u003ccode\u003e@mcaptcha/core-glue\u003c/code\u003e\u003c/a\u003e,\ncan be used to implement support.\u003c/p\u003e\n\u003ch2 id=\"widget-program\"\u003eWidget Program\u003c/h2\u003e\n\u003cp\u003eThis part is served by the mCaptcha backend. It fetches PoW config from\nthe backend, generates proof and submits it for verification. If\nverification is successful, it sends a message containing the\nverification proof token to the parent window, assuming it\u0026rsquo;s loaded as\nan \u003ccode\u003eiframe\u003c/code\u003e.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSource code:\n\u003ca href=\"https://github.com/mCaptcha/mCaptcha/tree/master/templates/widget\"\u003e\u003ccode\u003emCaptcha/mCaptcha/templates/widget\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eWebAssembly library which generates Proofs of Work for mCaptcha systems.\u003c/p\u003e\n\u003ch2 id=\"proof-of-workpow-library\"\u003eProof-of-Work(PoW) library\u003c/h2\u003e\n\u003cp\u003eWebAssembly bindings(\u003ca href=\"https://github.com/mCaptcha/pow_wasm\"\u003e\u003ccode\u003emCaptcha/pow_wasm\u003c/code\u003e\u003c/a\u003e) are available for the main rust library(\u003ca href=\"https://github.com/mCaptcha/pow_sha256\"\u003e\u003ccode\u003emCaptcha/pow_sha256\u003c/code\u003e\u003c/a\u003e).\u003c/p\u003e\n\u003cp\u003eFor browsers without support WebAssembly, a\npolyfill(\u003ca href=\"https://github.com/mCaptcha/pow_sha256-polyfill\"\u003e\u003ccode\u003epow_sha256-polyfill\u003c/code\u003e\u003c/a\u003e)\nis available.\u003c/p\u003e\n" - }, - { - id: 8, - href: "//localhost:1313/docs/api/mcaptcha-system/", - title: "mCaptcha System Library", - description: "API documenttion for the core Library used in mCaptcha", - content: "\u003cp\u003eDocumentation for the library used in mCaptcha core.\u003c/p\u003e\n\u003ch2 id=\"versions\"\u003eVersions\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://mcaptcha.github.io/mCaptcha/m_captcha/index.html\"\u003emaster-branch\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/api-docs/m_captcha/0.1.3/m_captcha/index.html\"\u003e0.1.3\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/api-docs/m_captcha/0.1.2/m_captcha/index.html\"\u003e0.1.2\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/api-docs/m_captcha/0.1.1/m_captcha/index.html\"\u003e0.1.1\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/api-docs/m_captcha/0.1.0/m_captcha/index.html\"\u003e0.1.0\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n" - }, - { - id: 9, - href: "//localhost:1313/docs/api/pow-sha256/", - title: "pow_sha256", - description: "API documenttion for PoW Library used in mCaptcha", - content: "\u003cp\u003eRust crate which generates SHA256 Proofs of Work on serializable datatypes.\u003c/p\u003e\n\u003cp\u003eThis is a fork of the \u003ca href=\"https://github.com/bddap/pow\"\u003e\u003ccode\u003epow\u003c/code\u003e library\u003c/a\u003e by\n\u003ca href=\"https://github.com/robkorn/pow_sha256\"\u003e@robkorn\u003c/a\u003e) with some new\nadditions. Primary of these being:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ePoW datatype now offers a constructor\u003c/li\u003e\n\u003cli\u003eSalt is no longer hard coded into the library, users can provide\nunique salts.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eOther small changes have also been included of various importance but\nmostly just stylistic/ease of use improvements.\u003c/p\u003e\n\u003ch2 id=\"versions\"\u003eVersions\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://mcaptcha.github.io/pow_sha256/pow_sha256/index.html\"\u003emaster-branch\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/api-docs/pow_sha256/0.2.1/pow_sha256/index.html\"\u003e0.2.1\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/api-docs/pow_sha256/0.2.0/pow_sha256/index.html\"\u003e0.2.0\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/api-docs/pow_sha256/0.1.0/pow_sha256/index.html\"\u003e0.1.0\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"changelog\"\u003eChangelog\u003c/h2\u003e\n\u003cp\u003eChangelog is available at the project\u0026rsquo;s\n\u003ca href=\"https://github.com/mCaptcha/pow_sha256/blob/master/CHANGELOG.md\"\u003erepository\u003c/a\u003e\u003c/p\u003e\n" - }, - { - id: 10, - href: "//localhost:1313/docs/help/faq/", - title: "FAQ", - description: "Answers to frequently asked questions.", - content: "\u003cp\u003eComing soon\u003c/p\u003e\n" - }, - { - id: 11, - href: "//localhost:1313/docs/user-manual/cli/", - title: "CLI tool", - description: "Instructions to install mCaptcha CLI", - content: "\u003cp\u003eA CLI tool exists to compute mCaptcha challenges. It can be installed\nfrom multiple sources:\u003c/p\u003e\n\u003ch2 id=\"install\"\u003eInstall\u003c/h2\u003e\n\u003ch3 id=\"cratesio\"\u003ecrates.io\u003c/h3\u003e\n\u003cp\u003eThe CLI tool is available on, \u003ca href=\"https://crates.io\"\u003ecrates.io\u003c/a\u003e, the Rust\nlanguage\u0026rsquo;s package registry. Rust language toolchain is required to\ninstall from crates.io, please see \u003ca href=\"https://rustup.rs\"\u003erustup.rs\u003c/a\u003e for\nInstructions to install it.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e1\u003c/span\u003e\u003cspan\u003ecargo install mcaptcha-cli\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"pre-compiled-binaries\"\u003ePre-compiled binaries\u003c/h3\u003e\n\u003cp\u003eNightly builds and stable releases are regularly published to\n\u003ca href=\"https://dl.mcaptcha.org/mcaptcha/cli\"\u003edl.mcaptcha.org\u003c/a\u003e for a variety of\nCPU architectures and operating systems.\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eDownload binary, checksum and GPG signature files\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e1\u003c/span\u003e\u003cspan\u003ewget https://dl.mcaptcha.org/mcaptcha/cli/\u003cspan style=\"color:#ff79c6\"\u003e{\u003c/span\u003eVERSION\u003cspan style=\"color:#ff79c6\"\u003e}\u003c/span\u003e/\u003cspan style=\"color:#ff79c6\"\u003e{\u003c/span\u003eFILENAME\u003cspan style=\"color:#ff79c6\"\u003e}\u003c/span\u003e.tar.gz\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e2\u003c/span\u003e\u003cspan\u003ewget https://dl.mcaptcha.org/mcaptcha/cli/\u003cspan style=\"color:#ff79c6\"\u003e{\u003c/span\u003eVERSION\u003cspan style=\"color:#ff79c6\"\u003e}\u003c/span\u003e/\u003cspan style=\"color:#ff79c6\"\u003e{\u003c/span\u003eFILENAME\u003cspan style=\"color:#ff79c6\"\u003e}\u003c/span\u003e.tar.gz.asc\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e3\u003c/span\u003e\u003cspan\u003ewget https://dl.mcaptcha.org/mcaptcha/cli/\u003cspan style=\"color:#ff79c6\"\u003e{\u003c/span\u003eVERSION\u003cspan style=\"color:#ff79c6\"\u003e}\u003c/span\u003e/\u003cspan style=\"color:#ff79c6\"\u003e{\u003c/span\u003eFILENAME\u003cspan style=\"color:#ff79c6\"\u003e}\u003c/span\u003e.tar.gz.sha256\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"2\"\u003e\n\u003cli\u003eVerify checksum\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e1\u003c/span\u003e\u003cspan\u003esha256sum -c \u003cspan style=\"color:#ff79c6\"\u003e{\u003c/span\u003eFILENAME\u003cspan style=\"color:#ff79c6\"\u003e}\u003c/span\u003e.tar.gz.sha256\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"3\"\u003e\n\u003cli\u003eDownload mCaptcha\u0026rsquo;s GPG release keys and verify GPG signature\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e1\u003c/span\u003e\u003cspan\u003egpg --keyserver keyserver.ubuntu.com --recv 73DAC973A9ADBB9ADCB5CDC4595A08135BA9FF73\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e2\u003c/span\u003e\u003cspan\u003egpg --verify \u003cspan style=\"color:#ff79c6\"\u003e{\u003c/span\u003eFILENAME\u003cspan style=\"color:#ff79c6\"\u003e}\u003c/span\u003e.tar.gz.asc\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"4\"\u003e\n\u003cli\u003eInstall Binary\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e1\u003c/span\u003e\u003cspan\u003etar -xvzf \u003cspan style=\"color:#ff79c6\"\u003e{\u003c/span\u003eFILENAME\u003cspan style=\"color:#ff79c6\"\u003e}\u003c/span\u003e.tar.gz \u003cspan style=\"color:#ff79c6\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e sudo cp \u003cspan style=\"color:#ff79c6\"\u003e{\u003c/span\u003eFILENAME\u003cspan style=\"color:#ff79c6\"\u003e}\u003c/span\u003e/mcaptcha-cli /usr/local/bin\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"build-from-source\"\u003eBuild from source\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eInstall Rust tool chain\nPlease see \u003ca href=\"https://rustup.rs\"\u003ehere\u003c/a\u003e for instructions.\u003c/li\u003e\n\u003cli\u003eDownload source code\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e1\u003c/span\u003e\u003cspan\u003egit clone https://git.batsense.net/mCaptcha/cli\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"3\"\u003e\n\u003cli\u003eCompile and install\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e1\u003c/span\u003e\u003cspan\u003ecargo build --release \u003cspan style=\"color:#ff79c6\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e sudp cp ./target/release/mcaptcha-cli\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e2\u003c/span\u003e\u003cspan\u003e/usr/local/bin\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"pass-mcaptcha-challenge\"\u003ePass mCaptcha challenge\u003c/h2\u003e\n\u003cp\u003eThe CLI tool requires details about the challenge to work on it. The\ntool can be used in three different modes compute challenge:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eProtected Page: Compute mCaptcha challenge for the CAPTCHA at a\nprotected page\u003c/li\u003e\n\u003cli\u003eWidget URL: Compute PoW for captcha at widget URL\u003c/li\u003e\n\u003cli\u003e(Developer mode) Offline: Computes PoW over given CAPTCHA parameters\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"from-protected-page-url\"\u003eFrom protected page URL\u003c/h3\u003e\n\u003cp\u003eThe most convenient mode: copy the URL of the webpage which has the\nmCaptcha widget (example: showcase.mcaptcha.org) and run the CLI tool\nwith it to get an authorization code:\nCompute challenge using the URL\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e1\u003c/span\u003e\u003cspan\u003e03:39 atm@lab cli ±|feat-parse-webpage ✗|→ mcaptcha-cli protected-page https://showcase.mcaptcha.org/\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e2\u003c/span\u003e\u003cspan\u003eAuthorization token: eRAZJiMrW58uDYA1s64Tmwq1u30HutuF\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"widget-url\"\u003eWidget URL\u003c/h3\u003e\n\u003cp\u003eIf you have the widget URL (will be in format https://mcaptcha.example.org/widget?sitekey=randomstring), it can be used to solve challenge as well:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e1\u003c/span\u003e\u003cspan\u003eCompute PoW by fetching parameters from CAPTCHA URL\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e2\u003c/span\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e3\u003c/span\u003e\u003cspan\u003eUsage: mcaptcha-cli online --url \u0026lt;URL\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e4\u003c/span\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e5\u003c/span\u003e\u003cspan\u003eOptions:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e6\u003c/span\u003e\u003cspan\u003e -u, --url \u0026lt;URL\u0026gt; URL of the CAPTCHA. Example: https://example.org/widget?sitekey\u003cspan style=\"color:#ff79c6\"\u003e=\u003c/span\u003efoo\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e7\u003c/span\u003e\u003cspan\u003e -h, --help Print \u003cspan style=\"color:#8be9fd;font-style:italic\"\u003ehelp\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eExample usage:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e1\u003c/span\u003e\u003cspan\u003e13:32 atm@lab cli ±|online ✗|→ mcaptcha-cli online -u https://demo.mcaptcha.org/widget?sitekey\u003cspan style=\"color:#ff79c6\"\u003e=\u003c/span\u003epHy0AktWyOKuxZDzFfoaewncWecCHo23\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e2\u003c/span\u003e\u003cspan\u003eAuthorization token: 3xleN26OctBuVu3X4t6CYyUjErhaxQvz\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"developer-mode-offline\"\u003e[Developer mode] Offline\u003c/h3\u003e\n\u003cp\u003eUseful while debugging mCaptcha configurations, works on raw challenge\nparameters.\u003c/p\u003e\n\u003cp\u003eHelp menu:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e1\u003c/span\u003e\u003cspan\u003eCompute PoW with offline parameters\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e2\u003c/span\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e3\u003c/span\u003e\u003cspan\u003eUsage: mcaptcha-cli offline --salt \u0026lt;SALT\u0026gt; --phrase \u0026lt;PHRASE\u0026gt; --difficulty-factor \u0026lt;DIFFICULTY_FACTOR\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e4\u003c/span\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e5\u003c/span\u003e\u003cspan\u003eOptions:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e6\u003c/span\u003e\u003cspan\u003e -s, --salt \u0026lt;SALT\u0026gt; Salt with which PoW should be computed\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e7\u003c/span\u003e\u003cspan\u003e -p, --phrase \u0026lt;PHRASE\u0026gt; Phrase over which PoW should be computed\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e8\u003c/span\u003e\u003cspan\u003e -d, --difficulty-factor \u0026lt;DIFFICULTY_FACTOR\u0026gt; Difficulty Factor\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e9\u003c/span\u003e\u003cspan\u003e -h, --help Print \u003cspan style=\"color:#8be9fd;font-style:italic\"\u003ehelp\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eExample usage:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e1\u003c/span\u003e\u003cspan\u003e13:28 atm@lab cli ±|online|→ mcaptcha-cli offline -s \u003cspan style=\"color:#ff79c6\"\u003e$(\u003c/span\u003erand 32\u003cspan style=\"color:#ff79c6\"\u003e)\u003c/span\u003e -p \u003cspan style=\"color:#ff79c6\"\u003e$(\u003c/span\u003erand 32\u003cspan style=\"color:#ff79c6\"\u003e)\u003c/span\u003e -d \u003cspan style=\"color:#bd93f9\"\u003e50000\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e2\u003c/span\u003e\u003cspan\u003edifficulty: \u003cspan style=\"color:#bd93f9\"\u003e50000\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e3\u003c/span\u003e\u003cspan\u003enonce: \u003cspan style=\"color:#bd93f9\"\u003e90507\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e4\u003c/span\u003e\u003cspan\u003eoriginal phrase: f351f333d44b2c6b5bf7f033b065bbb8fb5e9dd153bd402e43ed04425f5a3859\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e5\u003c/span\u003e\u003cspan\u003eresult: \u003cspan style=\"color:#bd93f9\"\u003e340276562956196291522979356090220150471\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eWhere rand is \u003ca href=\"https://github.com/realaravinth/dotfiles/blob/6fc6c87cc912e17488a35c0d3327ecf393221270/scripts/rand#L20\"\u003ethis\u003c/a\u003e script.\u003c/p\u003e\n" - }, - { - id: 12, - href: "//localhost:1313/docs/user-manual/how-to-mcaptcha-without-js/", - title: "Use mCaptcha without JavaScript", - description: "Instructions to solve mCaptcha with JavaScript disabled", - content: "\u003cp\u003eTo use mCaptcha without JavaScript:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eInstall mCaptcha CLI too. Please see \u003ca href=\"./cli\"\u003ehere\u003c/a\u003e for instructions.\u003c/li\u003e\n\u003cli\u003eCopy the URL of the protected page\u003c/li\u003e\n\u003cli\u003eRun mCaptcha CLI with that URL:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e1\u003c/span\u003e\u003cspan\u003emcapthca-cli protected-page \u0026lt;URL\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"4\"\u003e\n\u003cli\u003eCopy authorization code and paste it in the form\u003c/li\u003e\n\u003c/ol\u003e\n" - }, - { - id: 13, - href: "//localhost:1313/docs/user-manual/", - title: "User Manual", - description: "Introduction to mCaptcha for users", - content: "" - }, - { - id: 14, - href: "//localhost:1313/docs/webmasters/terminology/", - title: "Terminology", - description: "Information about terminology used in mCaptcha, some of which unique to the project", - content: "\u003ch2 id=\"authorization-token\"\u003eAuthorization token\u003c/h2\u003e\n\u003cp\u003eWhen a visitor solves the CAPTCHA and sends their solution to an\nmCaptcha instance, the solution will be verified for correctness. If the\nsolution is correct, mCaptcha will return a single use authorization token.\u003c/p\u003e\n\u003cp\u003eThis authorization token should be attached to the visitor\u0026rsquo;s requited to the\nprotected service and the protected service should validity of the\nauthorization token with the mCaptcha instance and only allow authorization to\nprotected resource if the authorization token is valid.\u003c/p\u003e\n\u003ch2 id=\"cooldown-period\"\u003eCooldown Period\u003c/h2\u003e\n\u003cp\u003emCaptcha implements leaky bucket algorithm to measure\ncurrent traffic levels. Cooldown period specifies the leak or the time\nafter which a visitor addition is decremented.\u003c/p\u003e\n\u003cp\u003eFor instance, if initial traffic level is 0 and a user visits one\nsecond later, the traffic level will be incremented to 1. Now, if the\ncooldown period is set to 30 seconds, the traffic level will be\ndecremented after 30 seconds. So after 30 seconds, the traffic level will\ngo from 1 to 0.\u003c/p\u003e\n\u003ch2 id=\"difficulty-factor\"\u003eDifficulty Factor\u003c/h2\u003e\n\u003cp\u003eDifficulty factor determines the time it takes to solve a CAPTCHA. The\nhigher the difficulty factor, the longer it will take to generate a\nproof of work for it to solve the CAPTCHA.\u003c/p\u003e\n\u003cp\u003emCaptcha\u0026rsquo;s proof of work based mechanism makes it highly accessible to\npeople with special needs but it is important to choose the difficulty factor\nwith care as very high difficulty factors will make the CAPTCHA\ninaccessible to users on slow devices.\u003c/p\u003e\n\u003ch2 id=\"sitekey\"\u003eSitekey\u003c/h2\u003e\n\u003cp\u003eSite key is a unique identifier associated with CAPTCHA configurations\ncreated on mCaptcha. It is required to integrate a CAPTCHA with your\nwebsite.\u003c/p\u003e\n\u003ch2 id=\"visitor-threshold\"\u003eVisitor Threshold\u003c/h2\u003e\n\u003cp\u003emCaptcha\u0026rsquo;s variable difficulty factor mechanism requires a website\u0026rsquo;s traffic\nstatistics be split into levels, so that it can deploy the right\ndifficulty factor for each level.\u003c/p\u003e\n\u003cp\u003eVisitor threshold is used to traffic into levels and mCaptcha accepts a\ndifficulty configuration for each of these levels. When current traffic\nexceeds a difficulty factor, mCaptcha will increase the difficulty\nfactor to the next configured level.\u003c/p\u003e\n\u003cp\u003eFor instance, consider the configuration given below:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eCool down period: 30 seconds\u003c/li\u003e\n\u003c/ul\u003e\n\u003ctable\u003e\n \u003cthead\u003e\n \u003ctr\u003e\n \u003cth style=\"text-align: left\"\u003eLevel\u003c/th\u003e\n \u003cth style=\"text-align: left\"\u003eDifficulty Factor\u003c/th\u003e\n \u003cth style=\"text-align: left\"\u003eVisitor Threshold\u003c/th\u003e\n \u003c/tr\u003e\n \u003c/thead\u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd style=\"text-align: left\"\u003e1\u003c/td\u003e\n \u003ctd style=\"text-align: left\"\u003e5,000\u003c/td\u003e\n \u003ctd style=\"text-align: left\"\u003e2,000\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd style=\"text-align: left\"\u003e2\u003c/td\u003e\n \u003ctd style=\"text-align: left\"\u003e50,000\u003c/td\u003e\n \u003ctd style=\"text-align: left\"\u003e5,000\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd style=\"text-align: left\"\u003e3\u003c/td\u003e\n \u003ctd style=\"text-align: left\"\u003e500,000\u003c/td\u003e\n \u003ctd style=\"text-align: left\"\u003e10,000\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd style=\"text-align: left\"\u003e4\u003c/td\u003e\n \u003ctd style=\"text-align: left\"\u003e5,000,000\u003c/td\u003e\n \u003ctd style=\"text-align: left\"\u003e15,000\u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eIf the website sees 2,000 requests in a 30 second window, level 1\ndifficulty factor(5,000) will be deployed. If the traffic increases to\n5,000 requests in a 30 second window, then difficulty factor will be\nupgraded to level 2(50,000). Likewise 10,000 and 15,000 requests over 30\nseconds will result in difficulty factor being upgraded to 500,000 and\n5,000,000 respectively.\u003c/p\u003e\n\u003cp\u003eVisitor threshold is how mCaptcha determines which difficulty factor\nlevel to deploy. mCaptcha uses leaky bucket algorithm to keep the\nvisitor threshold constantly updated within the configured cool down\nperiod. So, at any given moment the, the current visitor level will be\nthe amount of traffic that was served in the cool down period specified.\u003c/p\u003e\n" - }, - { - id: 15, - href: "//localhost:1313/docs/webmasters/faq/", - title: "Webmasters FAQ", - description: "Frequently asked questions related to using mCaptcha as a webmaster", - content: "\u003ch3 id=\"easy-mode-default-cooldown-period\"\u003eEasy Mode: Default cooldown period\u003c/h3\u003e\n\u003cp\u003eWhen configuring mCaptcha in \u003ca href=\"/docs/webmasters/configuring-difficulty-factor/#easy-option\"\u003eeasy mode\u003c/a\u003e, the default cooldown period is set to 30 seconds.\u003c/p\u003e\n\u003ch2 id=\"how-to-get-site-key-from-dashboard\"\u003eHow to get site key from dashboard?\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003eGo to \u0026ldquo;Site keys\u0026rdquo; on the side panel in the dashboard\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv align=center\u003e\n\u003cfigure\u003e\n \u003cimg class=\"img-fluid lazyload blur-up\" data-sizes=\"auto\" src=\"//localhost:1313/docs/webmasters/faq/sitekey-in-dashboard-sidepanel_hu1842978153838973955.png\" data-srcset=\"//localhost:1313/docs/webmasters/faq/sitekey-in-dashboard-sidepanel_hu7616676515296954887.png 800w,//localhost:1313/docs/webmasters/faq/sitekey-in-dashboard-sidepanel_hu2820398381730295401.png 700w,//localhost:1313/docs/webmasters/faq/sitekey-in-dashboard-sidepanel_hu14296824487641448064.png 600w,//localhost:1313/docs/webmasters/faq/sitekey-in-dashboard-sidepanel_hu13642425771348413616.png 500w\" width=\"222\" height=\"496\" alt=\"Site key menu option on the dashboard, encircled in red.\"\u003e\n \u003cnoscript\u003e\u003cimg class=\"img-fluid\" sizes=\"100vw\" srcset=\"//localhost:1313/docs/webmasters/faq/sitekey-in-dashboard-sidepanel_hu7616676515296954887.png 800w,//localhost:1313/docs/webmasters/faq/sitekey-in-dashboard-sidepanel_hu2820398381730295401.png 700w,//localhost:1313/docs/webmasters/faq/sitekey-in-dashboard-sidepanel_hu14296824487641448064.png 600w,//localhost:1313/docs/webmasters/faq/sitekey-in-dashboard-sidepanel_hu13642425771348413616.png 500w\" src=\"//localhost:1313/docs/webmasters/faq/sitekey-in-dashboard-sidepanel.png\" width=\"222\" height=\"496\" alt=\"Site key menu option on the dashboard, encircled in red.\"\u003e\u003c/noscript\u003e\n\u003c/figure\u003e\n\u003c/div\u003e\n\u003col start=\"2\"\u003e\n\u003cli\u003eclick on the clipboard button to copy the site key to your\nclipboard.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cfigure\u003e\n \u003cimg class=\"img-fluid lazyload blur-up\" data-sizes=\"auto\" src=\"//localhost:1313/docs/webmasters/faq/copy-sitekey_hu10670341732240698368.png\" data-srcset=\"//localhost:1313/docs/webmasters/faq/copy-sitekey_hu12574324563529048918.png 900w,//localhost:1313/docs/webmasters/faq/copy-sitekey_hu10402720001579260311.png 800w,//localhost:1313/docs/webmasters/faq/copy-sitekey_hu3452963981457815043.png 700w,//localhost:1313/docs/webmasters/faq/copy-sitekey_hu12392874392811771870.png 600w,//localhost:1313/docs/webmasters/faq/copy-sitekey_hu2183952705797892621.png 500w\" width=\"1825\" height=\"831\" alt=\"Copy site key to clipboard. Clipboard button is highlighted in the photo\"\u003e\n \u003cnoscript\u003e\u003cimg class=\"img-fluid\" sizes=\"100vw\" srcset=\"//localhost:1313/docs/webmasters/faq/copy-sitekey_hu12574324563529048918.png 900w,//localhost:1313/docs/webmasters/faq/copy-sitekey_hu10402720001579260311.png 800w,//localhost:1313/docs/webmasters/faq/copy-sitekey_hu3452963981457815043.png 700w,//localhost:1313/docs/webmasters/faq/copy-sitekey_hu12392874392811771870.png 600w,//localhost:1313/docs/webmasters/faq/copy-sitekey_hu2183952705797892621.png 500w\" src=\"//localhost:1313/docs/webmasters/faq/copy-sitekey.png\" width=\"1825\" height=\"831\" alt=\"Copy site key to clipboard. Clipboard button is highlighted in the photo\"\u003e\u003c/noscript\u003e\n\u003c/figure\u003e\n" - }, - { - id: 16, - href: "//localhost:1313/docs/help/", - title: "Help", - description: "Help mCaptcha.", - content: "" - }, - { - id: 17, - href: "//localhost:1313/docs/webmasters/", - title: "Webmasters", - description: "Introduction to mCaptcha for webmasters", - content: "" - }, - { - id: 18, - href: "//localhost:1313/docs/api/", - title: "API", - description: "Documentation for libraries used in mCaptcha", - content: "" - }, - { - id: 19, - href: "//localhost:1313/docs/", - title: "mCaptcha", - description: "Docs mCaptcha", - content: "" - }, - { - id: 20, - href: "//localhost:1313/docs/self-hosting/", - title: "Self-Hosting", - description: "Instructions to self-host mCaptcha", - content: "" - }, - ]; - - index.add(docs); - - userinput.addEventListener('input', show_results, true); - suggestions.addEventListener('click', accept_suggestion, true); - - function show_results(){ - - var value = this.value; - var results = index.search(value, 5); - var entry, childs = suggestions.childNodes; - var i = 0, len = results.length; - - suggestions.classList.remove('d-none'); - - results.forEach(function(page) { - - entry = document.createElement('div'); - - entry.innerHTML = ''; - - a = entry.querySelector('a'), - t = entry.querySelector('span:first-child'), - d = entry.querySelector('span:nth-child(2)'); - - a.href = page.href; - t.textContent = page.title; - d.textContent = page.description; - - suggestions.appendChild(entry); - - }); - - while(childs.length > len){ - - suggestions.removeChild(childs[i]) - } - - } - - function accept_suggestion(){ - - while(suggestions.lastChild){ - - suggestions.removeChild(suggestions.lastChild); - } - - return false; - } - -}()); diff --git a/index.xml b/index.xml deleted file mode 100644 index 7602a25..0000000 --- a/index.xml +++ /dev/null @@ -1,184 +0,0 @@ - - - - Defend Like Castles on - //localhost:1313/ - Recent content in Defend Like Castles on - Hugo -- gohugo.io - en-US - Tue, 09 Mar 2021 00:00:00 +0000 - - - - - - About - //localhost:1313/about/ - Thu, 27 May 2021 00:00:00 +0000 - - //localhost:1313/about/ - <p>mCaptcha is a kickass CAPTCHA systems that gives (DDoS) -attackers a run for their money. And we do all of this without tracking -your users. Oh and did I mention our UX is great?</p> -<p>At mCaptcha, we believe in digital freedom and privacy and so we built -a proof-of-work based CAPTCHA system that doesn’t track. Seriously, no -tracking. But that isn’t the killer feature, our system doesn’t require -the user to pick cars or ID sidewalks — our system does it’s -thing(usually at the click of a button) and gets out of the way.</p> - - - - Donate - //localhost:1313/donate/ - Thu, 27 May 2021 00:00:00 +0000 - - //localhost:1313/donate/ - <p>mCaptcha is a small operation that is self-funded. At the time of -writing, we are not backed by any venture capitals. If you like -mCaptcha, please consider donating. Your donations will go a long -way in supporting us.</p> -<p>Some of the payment options are anonymous. You can optionally send -me(<a href="//localhost:1313/contributors/aravinth-manivannan/">@realaravinth</a>) an email so that -I can thank you :)</p> -<h2 id="xmr">XMR</h2> -<pre tabindex="0"><code>85QAHsHqg4WfA6G7ycXc7U4LmrSLCQARv6H9p3AYjf8o8YP -WH3ngC8Zi7bUYGUifdXb54Xuz41kcu2pqgGFuAYp3VSh5JsR -</code></pre><figure> - <img class="img-fluid lazyload blur-up" data-sizes="auto" src="//localhost:1313/donate/mcptcha-donations-monero-address-qr_hu17158619302850468841.png" data-srcset="//localhost:1313/donate/mcptcha-donations-monero-address-qr_hu10587411859009476424.png 900w,//localhost:1313/donate/mcptcha-donations-monero-address-qr_hu15868991819992263353.png 800w,//localhost:1313/donate/mcptcha-donations-monero-address-qr_hu10903122095026686332.png 700w,//localhost:1313/donate/mcptcha-donations-monero-address-qr_hu6245944374810128641.png 600w,//localhost:1313/donate/mcptcha-donations-monero-address-qr_hu6616972071318057901.png 500w" width="240" height="240" alt="Monero address QR code"> - <noscript><img class="img-fluid" sizes="100vw" srcset="//localhost:1313/donate/mcptcha-donations-monero-address-qr_hu10587411859009476424.png 900w,//localhost:1313/donate/mcptcha-donations-monero-address-qr_hu15868991819992263353.png 800w,//localhost:1313/donate/mcptcha-donations-monero-address-qr_hu10903122095026686332.png 700w,//localhost:1313/donate/mcptcha-donations-monero-address-qr_hu6245944374810128641.png 600w,//localhost:1313/donate/mcptcha-donations-monero-address-qr_hu6616972071318057901.png 500w" src="//localhost:1313/donate/mcptcha-donations-monero-address-qr.png" width="240" height="240" alt="Monero address QR code"></noscript> - <figcaption class="figure-caption"><em>Monero address QR code</em></figcaption> -</figure> -<h2 id="liberapay">Liberapay</h2> -<script src="https://liberapay.com/realaravinth/widgets/button.js"></script> -<p><noscript><a href="https://liberapay.com/realaravinth/donate"><img alt="Donate using Liberapay" src="https://liberapay.com/assets/widgets/donate.svg"></a></noscript></p> - - - - Privacy Policy - //localhost:1313/privacy-policy/ - Wed, 26 May 2021 00:00:00 +0000 - - //localhost:1313/privacy-policy/ - <p><strong>TLDR</strong>: We do not use cookies, we do not collect any personal data and -logs aren&rsquo;t shared with third-parties.</p> -<h2 id="website-visitors">Website visitors</h2> -<ul> -<li>No personal information is collected.</li> -<li>No information is stored in the browser.</li> -<li>No information is shared with, sent to or sold to third-parties.</li> -<li>No information is shared with advertising companies.</li> -<li>No information is mined and harvested for personal and behavioral trends.</li> -<li>No information is monetized.</li> -</ul> -<h3 id="information-we-collect-and-what-we-use-it-for">Information we collect and what we use it for</h3> -<p>Website activity is logged and stored for a period of one month for -debugging purposes. We don&rsquo;t share this information with anyone nor do -we run analytics on it.</p> - - - - Community - //localhost:1313/community/ - Wed, 10 Mar 2021 00:00:00 +0000 - - //localhost:1313/community/ - <h2 id="matrix-community">Matrix Community</h2> -<p>Come say hi at our <a href="https://matrix.to/#/#mcaptcha:matrix.batsense.net">Matrix community</a>!</p> -<h2 id="fediverse-handle">Fediverse handle</h2> -<p>We are on the Fediverse at -<a href="https://gts.batsense.net/@mcaptcha">@mCapthca@batsense.net</a>, toot at -us for queries and whatnot :)</p> -<h2 id="official-twitter-handle">Official Twitter handle</h2> -<p>The project also has a twitter twitter presence at <a href="https://twitter.com/m_captcha/">@m_captcha(Nitter -hyperlink)</a>. This space is used in -addition to the blog to post short updates.</p> -<h2 id="lead-developer-email">Lead developer email</h2> -<p>Write to me at <a href="mailto:realaravinth@batsense.net">realaravinth@batsense.net</a>!</p> - - - - Security - //localhost:1313/security/ - Wed, 10 Mar 2021 00:00:00 +0000 - - //localhost:1313/security/ - <p>Security is at the heart of mCaptcha. If you find any discrepancies in -our software(see listing on our <a href="https://github.com/mCaptcha">GitHub</a>, -<a href="#scope">services available</a>)</p> -<h2 id="rules">Rules:</h2> -<h3 id="before-you-start">Before you start</h3> -<ul> -<li> -<p>Check the list of domains that are in scope for security research -and the list of targets for useful information for getting started.</p> -</li> -<li> -<p>Check the list of bugs that have been classified as ineligible.</p> -</li> -<li> -<p>Check our changelog(in our GitHub repositories) for recently launched -features.</p> - - - - Thanks - //localhost:1313/thanks/ - Wed, 10 Mar 2021 00:00:00 +0000 - - //localhost:1313/thanks/ - <h2 id="funding">Funding</h2> -<h3 id="nlnet">NLnet</h3> -<div align="center"> - <img - height="150px" - alt="NLnet NGIZero logo" - src="//localhost:1313/third-party/NGIZero-green.hex.svg" - /> -</div> -<br /> -<p>2023 development is funded through the <a href="https://nlnet.nl/entrust">NGI0 Entrust -Fund</a>, via <a href="https://nlnet.nl/">NLnet</a>. Please -see <a href="https://nlnet.nl/project/mCaptcha/">here</a> for more details.</p> -<h2 id="free-software-libraries-and-tools">Free software libraries and tools</h2> -<p>mCaptcha is built entirely using free software libraries tools. We are -grateful for all maintainers and contributors for their time and effort -in making them!</p> - - - - Contact - //localhost:1313/contact/ - Thu, 27 Aug 2020 19:23:18 +0200 - - //localhost:1313/contact/ - <h2 id="matrix-community">Matrix Community</h2> -<p>We have a <a href="https://matrix.to/#/+mcaptcha:matrix.batsense.net">Matrix -community</a>, come say -hi!.</p> -<h2 id="lead-developer">Lead developer</h2> -<p>You can find me(<a href="//localhost:1313/contributors/aravinth-manivannan/">@realaravinth</a>) on -the <a href="https://matrix.to/#/@realaravinth:matrix.batsense.net">Matrix</a>, on -<a href="https://github.com/realaravinth">GitHub</a> or email me at -<a href="mailto:realaravinth@batsense.net">realaravinth@batense.net</a>.</p> - - - - Blog - //localhost:1313/blog/ - Mon, 01 Jan 0001 00:00:00 +0000 - - //localhost:1313/blog/ - - - - - mCaptcha - //localhost:1313/docs/ - Mon, 01 Jan 0001 00:00:00 +0000 - - //localhost:1313/docs/ - - - - - diff --git a/main.css b/main.css deleted file mode 100644 index c6de22d..0000000 --- a/main.css +++ /dev/null @@ -1,10439 +0,0 @@ -/** Import Bootstrap functions */ -/** Import theme variables */ -/** Bootstrap navbar fix (https://git.io/fADqW) */ -/** Import Bootstrap */ -/*! - * Bootstrap v5.2.3 (https://getbootstrap.com/) - * Copyright 2011-2022 The Bootstrap Authors - * Copyright 2011-2022 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */ -:root { - --bs-blue: #0d6efd; - --bs-indigo: #6610f2; - --bs-purple: #5d2f86; - --bs-pink: #d63384; - --bs-red: #dc3545; - --bs-orange: #fd7e14; - --bs-yellow: #ffe000; - --bs-green: #198754; - --bs-teal: #20c997; - --bs-cyan: #0dcaf0; - --bs-black: #1d2d35; - --bs-white: #fff; - --bs-gray: #6c757d; - --bs-gray-dark: #343a40; - --bs-gray-100: #f8f9fa; - --bs-gray-200: #e9ecef; - --bs-gray-300: #dee2e6; - --bs-gray-400: #ced4da; - --bs-gray-500: #adb5bd; - --bs-gray-600: #6c757d; - --bs-gray-700: #495057; - --bs-gray-800: #343a40; - --bs-gray-900: #212529; - --bs-primary: #5d2f86; - --bs-secondary: #6c757d; - --bs-success: #198754; - --bs-info: #0dcaf0; - --bs-warning: #ffe000; - --bs-danger: #dc3545; - --bs-light: #f8f9fa; - --bs-dark: #212529; - --bs-primary-rgb: 93, 47, 134; - --bs-secondary-rgb: 108, 117, 125; - --bs-success-rgb: 25, 135, 84; - --bs-info-rgb: 13, 202, 240; - --bs-warning-rgb: 255, 224, 0; - --bs-danger-rgb: 220, 53, 69; - --bs-light-rgb: 248, 249, 250; - --bs-dark-rgb: 33, 37, 41; - --bs-white-rgb: 255, 255, 255; - --bs-black-rgb: 29, 45, 53; - --bs-body-color-rgb: 29, 45, 53; - --bs-body-bg-rgb: 255, 255, 255; - --bs-font-sans-serif: "Jost", -apple-system, blinkmacsystemfont, "Segoe UI", roboto, "Helvetica Neue", arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - --bs-font-monospace: sfmono-regular, menlo, monaco, consolas, "Liberation Mono", "Courier New", monospace; - --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0)); - --bs-body-font-family: Jost, -apple-system, blinkmacsystemfont, Segoe UI, roboto, Helvetica Neue, arial, Noto Sans, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji; - --bs-body-font-size: 1rem; - --bs-body-font-weight: 400; - --bs-body-line-height: 1.5; - --bs-body-color: #1d2d35; - --bs-body-bg: #fff; - --bs-border-width: 1px; - --bs-border-style: solid; - --bs-border-color: #e9ecef; - --bs-border-color-translucent: rgba(29, 45, 53, 0.175); - --bs-border-radius: 0.375rem; - --bs-border-radius-sm: 0.25rem; - --bs-border-radius-lg: 0.5rem; - --bs-border-radius-xl: 1rem; - --bs-border-radius-2xl: 2rem; - --bs-border-radius-pill: 50rem; - --bs-link-color: #5d2f86; - --bs-link-hover-color: #4a266b; - --bs-code-color: #d63384; - --bs-highlight-bg: #fff9cc; } - -*, -*::before, -*::after { - box-sizing: border-box; } - -@media (prefers-reduced-motion: no-preference) { - :root { - scroll-behavior: smooth; } } - -body { - margin: 0; - font-family: var(--bs-body-font-family); - font-size: var(--bs-body-font-size); - font-weight: var(--bs-body-font-weight); - line-height: var(--bs-body-line-height); - color: var(--bs-body-color); - text-align: var(--bs-body-text-align); - background-color: var(--bs-body-bg); - -webkit-text-size-adjust: 100%; - -webkit-tap-highlight-color: rgba(29, 45, 53, 0); } - -hr { - margin: 1rem 0; - color: inherit; - border: 0; - border-top: 1px solid; - opacity: 0.25; } - -h6, .h6, h5, .h5, h4, .h4, h3, .h3, h2, .h2, h1, .h1 { - margin-top: 0; - margin-bottom: 0.5rem; - font-weight: 700; - line-height: 1.2; } - -h1, .h1 { - font-size: calc(1.375rem + 1.5vw); } - @media (min-width: 1200px) { - h1, .h1 { - font-size: 2.5rem; } } -h2, .h2 { - font-size: calc(1.325rem + 0.9vw); } - @media (min-width: 1200px) { - h2, .h2 { - font-size: 2rem; } } -h3, .h3 { - font-size: calc(1.3rem + 0.6vw); } - @media (min-width: 1200px) { - h3, .h3 { - font-size: 1.75rem; } } -h4, .h4 { - font-size: calc(1.275rem + 0.3vw); } - @media (min-width: 1200px) { - h4, .h4 { - font-size: 1.5rem; } } -h5, .h5 { - font-size: 1.25rem; } - -h6, .h6 { - font-size: 1rem; } - -p { - margin-top: 0; - margin-bottom: 1rem; } - -abbr[title] { - text-decoration: underline dotted; - cursor: help; - text-decoration-skip-ink: none; } - -address { - margin-bottom: 1rem; - font-style: normal; - line-height: inherit; } - -ol, -ul { - padding-left: 2rem; } - -ol, -ul, -dl { - margin-top: 0; - margin-bottom: 1rem; } - -ol ol, -ul ul, -ol ul, -ul ol { - margin-bottom: 0; } - -dt { - font-weight: 700; } - -dd { - margin-bottom: .5rem; - margin-left: 0; } - -blockquote { - margin: 0 0 1rem; } - -b, -strong { - font-weight: bolder; } - -small, .small { - font-size: 0.875em; } - -mark, .mark { - padding: 0.1875em; - background-color: var(--bs-highlight-bg); } - -sub, -sup { - position: relative; - font-size: 0.75em; - line-height: 0; - vertical-align: baseline; } - -sub { - bottom: -.25em; } - -sup { - top: -.5em; } - -a { - color: var(--bs-link-color); - text-decoration: none; } - a:hover { - color: var(--bs-link-hover-color); } - -a:not([href]):not([class]), a:not([href]):not([class]):hover { - color: inherit; - text-decoration: none; } - -pre, -code, -kbd, -samp { - font-family: var(--bs-font-monospace); - font-size: 1em; } - -pre { - display: block; - margin-top: 0; - margin-bottom: 1rem; - overflow: auto; - font-size: 0.875em; } - pre code { - font-size: inherit; - color: inherit; - word-break: normal; } - -code { - font-size: 0.875em; - color: var(--bs-code-color); - word-wrap: break-word; } - a > code { - color: inherit; } - -kbd { - padding: 0.1875rem 0.375rem; - font-size: 0.875em; - color: var(--bs-body-bg); - background-color: var(--bs-body-color); - border-radius: 0.25rem; } - kbd kbd { - padding: 0; - font-size: 1em; } - -figure { - margin: 0 0 1rem; } - -img, -svg { - vertical-align: middle; } - -table { - caption-side: bottom; - border-collapse: collapse; } - -caption { - padding-top: 0.5rem; - padding-bottom: 0.5rem; - color: #6c757d; - text-align: left; } - -th { - text-align: inherit; - text-align: -webkit-match-parent; } - -thead, -tbody, -tfoot, -tr, -td, -th { - border-color: inherit; - border-style: solid; - border-width: 0; } - -label { - display: inline-block; } - -button { - border-radius: 0; } - -button:focus:not(:focus-visible) { - outline: 0; } - -input, -button, -select, -optgroup, -textarea { - margin: 0; - font-family: inherit; - font-size: inherit; - line-height: inherit; } - -button, -select { - text-transform: none; } - -[role="button"] { - cursor: pointer; } - -select { - word-wrap: normal; } - select:disabled { - opacity: 1; } - -[list]:not([type="date"]):not([type="datetime-local"]):not([type="month"]):not([type="week"]):not([type="time"])::-webkit-calendar-picker-indicator { - display: none !important; } - -button, -[type="button"], -[type="reset"], -[type="submit"] { - -webkit-appearance: button; } - button:not(:disabled), - [type="button"]:not(:disabled), - [type="reset"]:not(:disabled), - [type="submit"]:not(:disabled) { - cursor: pointer; } - -::-moz-focus-inner { - padding: 0; - border-style: none; } - -textarea { - resize: vertical; } - -fieldset { - min-width: 0; - padding: 0; - margin: 0; - border: 0; } - -legend { - float: left; - width: 100%; - padding: 0; - margin-bottom: 0.5rem; - font-size: calc(1.275rem + 0.3vw); - line-height: inherit; } - @media (min-width: 1200px) { - legend { - font-size: 1.5rem; } } - legend + * { - clear: left; } - -::-webkit-datetime-edit-fields-wrapper, -::-webkit-datetime-edit-text, -::-webkit-datetime-edit-minute, -::-webkit-datetime-edit-hour-field, -::-webkit-datetime-edit-day-field, -::-webkit-datetime-edit-month-field, -::-webkit-datetime-edit-year-field { - padding: 0; } - -::-webkit-inner-spin-button { - height: auto; } - -[type="search"] { - outline-offset: -2px; - -webkit-appearance: textfield; } - -/* rtl:raw: -[type="tel"], -[type="url"], -[type="email"], -[type="number"] { - direction: ltr; -} -*/ -::-webkit-search-decoration { - -webkit-appearance: none; } - -::-webkit-color-swatch-wrapper { - padding: 0; } - -::file-selector-button { - font: inherit; - -webkit-appearance: button; } - -output { - display: inline-block; } - -iframe { - border: 0; } - -summary { - display: list-item; - cursor: pointer; } - -progress { - vertical-align: baseline; } - -[hidden] { - display: none !important; } - -.lead { - font-size: 1.25rem; - font-weight: 400; } - -.display-1 { - font-size: calc(1.625rem + 4.5vw); - font-weight: 300; - line-height: 1.2; } - @media (min-width: 1200px) { - .display-1 { - font-size: 5rem; } } -.display-2 { - font-size: calc(1.575rem + 3.9vw); - font-weight: 300; - line-height: 1.2; } - @media (min-width: 1200px) { - .display-2 { - font-size: 4.5rem; } } -.display-3 { - font-size: calc(1.525rem + 3.3vw); - font-weight: 300; - line-height: 1.2; } - @media (min-width: 1200px) { - .display-3 { - font-size: 4rem; } } -.display-4 { - font-size: calc(1.475rem + 2.7vw); - font-weight: 300; - line-height: 1.2; } - @media (min-width: 1200px) { - .display-4 { - font-size: 3.5rem; } } -.display-5 { - font-size: calc(1.425rem + 2.1vw); - font-weight: 300; - line-height: 1.2; } - @media (min-width: 1200px) { - .display-5 { - font-size: 3rem; } } -.display-6 { - font-size: calc(1.375rem + 1.5vw); - font-weight: 300; - line-height: 1.2; } - @media (min-width: 1200px) { - .display-6 { - font-size: 2.5rem; } } -.list-unstyled, .comment-list { - padding-left: 0; - list-style: none; } - -.list-inline { - padding-left: 0; - list-style: none; } - -.list-inline-item { - display: inline-block; } - .list-inline-item:not(:last-child) { - margin-right: 0.5rem; } - -.initialism { - font-size: 0.875em; - text-transform: uppercase; } - -.blockquote { - margin-bottom: 1rem; - font-size: 1.25rem; } - .blockquote > :last-child { - margin-bottom: 0; } - -.blockquote-footer { - margin-top: -1rem; - margin-bottom: 1rem; - font-size: 0.875em; - color: #6c757d; } - .blockquote-footer::before { - content: "\2014\00A0"; } - -.img-fluid { - max-width: 100%; - height: auto; } - -.img-thumbnail { - padding: 0.25rem; - background-color: #fff; - border: 1px solid var(--bs-border-color); - border-radius: 0.375rem; - max-width: 100%; - height: auto; } - -.figure { - display: inline-block; } - -.figure-img { - margin-bottom: 0.5rem; - line-height: 1; } - -.figure-caption { - font-size: 0.875em; - color: #6c757d; } - -.container, -.container-fluid, -.container-xxl, -.container-xl, -.container-lg, -.container-md, -.container-sm { - --bs-gutter-x: 48px; - --bs-gutter-y: 0; - width: 100%; - padding-right: calc(var(--bs-gutter-x) * .5); - padding-left: calc(var(--bs-gutter-x) * .5); - margin-right: auto; - margin-left: auto; } - -@media (min-width: 576px) { - .container-sm, .container { - max-width: 540px; } } - -@media (min-width: 768px) { - .container-md, .container-sm, .container { - max-width: 720px; } } - -@media (min-width: 992px) { - .container-lg, .container-md, .container-sm, .container { - max-width: 960px; } } - -@media (min-width: 1200px) { - .container-xl, .container-lg, .container-md, .container-sm, .container { - max-width: 1240px; } } - -@media (min-width: 1400px) { - .container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container { - max-width: 1320px; } } - -.row { - --bs-gutter-x: 48px; - --bs-gutter-y: 0; - display: flex; - flex-wrap: wrap; - margin-top: calc(-1 * var(--bs-gutter-y)); - margin-right: calc(-.5 * var(--bs-gutter-x)); - margin-left: calc(-.5 * var(--bs-gutter-x)); } - .row > * { - flex-shrink: 0; - width: 100%; - max-width: 100%; - padding-right: calc(var(--bs-gutter-x) * .5); - padding-left: calc(var(--bs-gutter-x) * .5); - margin-top: var(--bs-gutter-y); } - -.col { - flex: 1 0 0%; } - -.row-cols-auto > * { - flex: 0 0 auto; - width: auto; } - -.row-cols-1 > * { - flex: 0 0 auto; - width: 100%; } - -.row-cols-2 > * { - flex: 0 0 auto; - width: 50%; } - -.row-cols-3 > * { - flex: 0 0 auto; - width: 33.33333333%; } - -.row-cols-4 > * { - flex: 0 0 auto; - width: 25%; } - -.row-cols-5 > * { - flex: 0 0 auto; - width: 20%; } - -.row-cols-6 > * { - flex: 0 0 auto; - width: 16.66666667%; } - -.col-auto { - flex: 0 0 auto; - width: auto; } - -.col-1 { - flex: 0 0 auto; - width: 6.25%; } - -.col-2 { - flex: 0 0 auto; - width: 12.5%; } - -.col-3 { - flex: 0 0 auto; - width: 18.75%; } - -.col-4 { - flex: 0 0 auto; - width: 25%; } - -.col-5 { - flex: 0 0 auto; - width: 31.25%; } - -.col-6 { - flex: 0 0 auto; - width: 37.5%; } - -.col-7 { - flex: 0 0 auto; - width: 43.75%; } - -.col-8 { - flex: 0 0 auto; - width: 50%; } - -.col-9 { - flex: 0 0 auto; - width: 56.25%; } - -.col-10 { - flex: 0 0 auto; - width: 62.5%; } - -.col-11 { - flex: 0 0 auto; - width: 68.75%; } - -.col-12 { - flex: 0 0 auto; - width: 75%; } - -.col-13 { - flex: 0 0 auto; - width: 81.25%; } - -.col-14 { - flex: 0 0 auto; - width: 87.5%; } - -.col-15 { - flex: 0 0 auto; - width: 93.75%; } - -.col-16 { - flex: 0 0 auto; - width: 100%; } - -.offset-1 { - margin-left: 6.25%; } - -.offset-2 { - margin-left: 12.5%; } - -.offset-3 { - margin-left: 18.75%; } - -.offset-4 { - margin-left: 25%; } - -.offset-5 { - margin-left: 31.25%; } - -.offset-6 { - margin-left: 37.5%; } - -.offset-7 { - margin-left: 43.75%; } - -.offset-8 { - margin-left: 50%; } - -.offset-9 { - margin-left: 56.25%; } - -.offset-10 { - margin-left: 62.5%; } - -.offset-11 { - margin-left: 68.75%; } - -.offset-12 { - margin-left: 75%; } - -.offset-13 { - margin-left: 81.25%; } - -.offset-14 { - margin-left: 87.5%; } - -.offset-15 { - margin-left: 93.75%; } - -.g-0, -.gx-0 { - --bs-gutter-x: 0; } - -.g-0, -.gy-0 { - --bs-gutter-y: 0; } - -.g-1, -.gx-1 { - --bs-gutter-x: 0.25rem; } - -.g-1, -.gy-1 { - --bs-gutter-y: 0.25rem; } - -.g-2, -.gx-2 { - --bs-gutter-x: 0.5rem; } - -.g-2, -.gy-2 { - --bs-gutter-y: 0.5rem; } - -.g-3, -.gx-3 { - --bs-gutter-x: 1rem; } - -.g-3, -.gy-3 { - --bs-gutter-y: 1rem; } - -.g-4, -.gx-4 { - --bs-gutter-x: 1.5rem; } - -.g-4, -.gy-4 { - --bs-gutter-y: 1.5rem; } - -.g-5, -.gx-5 { - --bs-gutter-x: 3rem; } - -.g-5, -.gy-5 { - --bs-gutter-y: 3rem; } - -@media (min-width: 576px) { - .col-sm { - flex: 1 0 0%; } - .row-cols-sm-auto > * { - flex: 0 0 auto; - width: auto; } - .row-cols-sm-1 > * { - flex: 0 0 auto; - width: 100%; } - .row-cols-sm-2 > * { - flex: 0 0 auto; - width: 50%; } - .row-cols-sm-3 > * { - flex: 0 0 auto; - width: 33.33333333%; } - .row-cols-sm-4 > * { - flex: 0 0 auto; - width: 25%; } - .row-cols-sm-5 > * { - flex: 0 0 auto; - width: 20%; } - .row-cols-sm-6 > * { - flex: 0 0 auto; - width: 16.66666667%; } - .col-sm-auto { - flex: 0 0 auto; - width: auto; } - .col-sm-1 { - flex: 0 0 auto; - width: 6.25%; } - .col-sm-2 { - flex: 0 0 auto; - width: 12.5%; } - .col-sm-3 { - flex: 0 0 auto; - width: 18.75%; } - .col-sm-4 { - flex: 0 0 auto; - width: 25%; } - .col-sm-5 { - flex: 0 0 auto; - width: 31.25%; } - .col-sm-6 { - flex: 0 0 auto; - width: 37.5%; } - .col-sm-7 { - flex: 0 0 auto; - width: 43.75%; } - .col-sm-8 { - flex: 0 0 auto; - width: 50%; } - .col-sm-9 { - flex: 0 0 auto; - width: 56.25%; } - .col-sm-10 { - flex: 0 0 auto; - width: 62.5%; } - .col-sm-11 { - flex: 0 0 auto; - width: 68.75%; } - .col-sm-12 { - flex: 0 0 auto; - width: 75%; } - .col-sm-13 { - flex: 0 0 auto; - width: 81.25%; } - .col-sm-14 { - flex: 0 0 auto; - width: 87.5%; } - .col-sm-15 { - flex: 0 0 auto; - width: 93.75%; } - .col-sm-16 { - flex: 0 0 auto; - width: 100%; } - .offset-sm-0 { - margin-left: 0; } - .offset-sm-1 { - margin-left: 6.25%; } - .offset-sm-2 { - margin-left: 12.5%; } - .offset-sm-3 { - margin-left: 18.75%; } - .offset-sm-4 { - margin-left: 25%; } - .offset-sm-5 { - margin-left: 31.25%; } - .offset-sm-6 { - margin-left: 37.5%; } - .offset-sm-7 { - margin-left: 43.75%; } - .offset-sm-8 { - margin-left: 50%; } - .offset-sm-9 { - margin-left: 56.25%; } - .offset-sm-10 { - margin-left: 62.5%; } - .offset-sm-11 { - margin-left: 68.75%; } - .offset-sm-12 { - margin-left: 75%; } - .offset-sm-13 { - margin-left: 81.25%; } - .offset-sm-14 { - margin-left: 87.5%; } - .offset-sm-15 { - margin-left: 93.75%; } - .g-sm-0, - .gx-sm-0 { - --bs-gutter-x: 0; } - .g-sm-0, - .gy-sm-0 { - --bs-gutter-y: 0; } - .g-sm-1, - .gx-sm-1 { - --bs-gutter-x: 0.25rem; } - .g-sm-1, - .gy-sm-1 { - --bs-gutter-y: 0.25rem; } - .g-sm-2, - .gx-sm-2 { - --bs-gutter-x: 0.5rem; } - .g-sm-2, - .gy-sm-2 { - --bs-gutter-y: 0.5rem; } - .g-sm-3, - .gx-sm-3 { - --bs-gutter-x: 1rem; } - .g-sm-3, - .gy-sm-3 { - --bs-gutter-y: 1rem; } - .g-sm-4, - .gx-sm-4 { - --bs-gutter-x: 1.5rem; } - .g-sm-4, - .gy-sm-4 { - --bs-gutter-y: 1.5rem; } - .g-sm-5, - .gx-sm-5 { - --bs-gutter-x: 3rem; } - .g-sm-5, - .gy-sm-5 { - --bs-gutter-y: 3rem; } } - -@media (min-width: 768px) { - .col-md { - flex: 1 0 0%; } - .row-cols-md-auto > * { - flex: 0 0 auto; - width: auto; } - .row-cols-md-1 > * { - flex: 0 0 auto; - width: 100%; } - .row-cols-md-2 > * { - flex: 0 0 auto; - width: 50%; } - .row-cols-md-3 > * { - flex: 0 0 auto; - width: 33.33333333%; } - .row-cols-md-4 > * { - flex: 0 0 auto; - width: 25%; } - .row-cols-md-5 > * { - flex: 0 0 auto; - width: 20%; } - .row-cols-md-6 > * { - flex: 0 0 auto; - width: 16.66666667%; } - .col-md-auto { - flex: 0 0 auto; - width: auto; } - .col-md-1 { - flex: 0 0 auto; - width: 6.25%; } - .col-md-2 { - flex: 0 0 auto; - width: 12.5%; } - .col-md-3 { - flex: 0 0 auto; - width: 18.75%; } - .col-md-4 { - flex: 0 0 auto; - width: 25%; } - .col-md-5 { - flex: 0 0 auto; - width: 31.25%; } - .col-md-6 { - flex: 0 0 auto; - width: 37.5%; } - .col-md-7 { - flex: 0 0 auto; - width: 43.75%; } - .col-md-8 { - flex: 0 0 auto; - width: 50%; } - .col-md-9 { - flex: 0 0 auto; - width: 56.25%; } - .col-md-10 { - flex: 0 0 auto; - width: 62.5%; } - .col-md-11 { - flex: 0 0 auto; - width: 68.75%; } - .col-md-12 { - flex: 0 0 auto; - width: 75%; } - .col-md-13 { - flex: 0 0 auto; - width: 81.25%; } - .col-md-14 { - flex: 0 0 auto; - width: 87.5%; } - .col-md-15 { - flex: 0 0 auto; - width: 93.75%; } - .col-md-16 { - flex: 0 0 auto; - width: 100%; } - .offset-md-0 { - margin-left: 0; } - .offset-md-1 { - margin-left: 6.25%; } - .offset-md-2 { - margin-left: 12.5%; } - .offset-md-3 { - margin-left: 18.75%; } - .offset-md-4 { - margin-left: 25%; } - .offset-md-5 { - margin-left: 31.25%; } - .offset-md-6 { - margin-left: 37.5%; } - .offset-md-7 { - margin-left: 43.75%; } - .offset-md-8 { - margin-left: 50%; } - .offset-md-9 { - margin-left: 56.25%; } - .offset-md-10 { - margin-left: 62.5%; } - .offset-md-11 { - margin-left: 68.75%; } - .offset-md-12 { - margin-left: 75%; } - .offset-md-13 { - margin-left: 81.25%; } - .offset-md-14 { - margin-left: 87.5%; } - .offset-md-15 { - margin-left: 93.75%; } - .g-md-0, - .gx-md-0 { - --bs-gutter-x: 0; } - .g-md-0, - .gy-md-0 { - --bs-gutter-y: 0; } - .g-md-1, - .gx-md-1 { - --bs-gutter-x: 0.25rem; } - .g-md-1, - .gy-md-1 { - --bs-gutter-y: 0.25rem; } - .g-md-2, - .gx-md-2 { - --bs-gutter-x: 0.5rem; } - .g-md-2, - .gy-md-2 { - --bs-gutter-y: 0.5rem; } - .g-md-3, - .gx-md-3 { - --bs-gutter-x: 1rem; } - .g-md-3, - .gy-md-3 { - --bs-gutter-y: 1rem; } - .g-md-4, - .gx-md-4 { - --bs-gutter-x: 1.5rem; } - .g-md-4, - .gy-md-4 { - --bs-gutter-y: 1.5rem; } - .g-md-5, - .gx-md-5 { - --bs-gutter-x: 3rem; } - .g-md-5, - .gy-md-5 { - --bs-gutter-y: 3rem; } } - -@media (min-width: 992px) { - .col-lg { - flex: 1 0 0%; } - .row-cols-lg-auto > * { - flex: 0 0 auto; - width: auto; } - .row-cols-lg-1 > * { - flex: 0 0 auto; - width: 100%; } - .row-cols-lg-2 > * { - flex: 0 0 auto; - width: 50%; } - .row-cols-lg-3 > * { - flex: 0 0 auto; - width: 33.33333333%; } - .row-cols-lg-4 > * { - flex: 0 0 auto; - width: 25%; } - .row-cols-lg-5 > * { - flex: 0 0 auto; - width: 20%; } - .row-cols-lg-6 > * { - flex: 0 0 auto; - width: 16.66666667%; } - .col-lg-auto { - flex: 0 0 auto; - width: auto; } - .col-lg-1 { - flex: 0 0 auto; - width: 6.25%; } - .col-lg-2 { - flex: 0 0 auto; - width: 12.5%; } - .col-lg-3 { - flex: 0 0 auto; - width: 18.75%; } - .col-lg-4 { - flex: 0 0 auto; - width: 25%; } - .col-lg-5 { - flex: 0 0 auto; - width: 31.25%; } - .col-lg-6 { - flex: 0 0 auto; - width: 37.5%; } - .col-lg-7 { - flex: 0 0 auto; - width: 43.75%; } - .col-lg-8 { - flex: 0 0 auto; - width: 50%; } - .col-lg-9 { - flex: 0 0 auto; - width: 56.25%; } - .col-lg-10 { - flex: 0 0 auto; - width: 62.5%; } - .col-lg-11 { - flex: 0 0 auto; - width: 68.75%; } - .col-lg-12 { - flex: 0 0 auto; - width: 75%; } - .col-lg-13 { - flex: 0 0 auto; - width: 81.25%; } - .col-lg-14 { - flex: 0 0 auto; - width: 87.5%; } - .col-lg-15 { - flex: 0 0 auto; - width: 93.75%; } - .col-lg-16 { - flex: 0 0 auto; - width: 100%; } - .offset-lg-0 { - margin-left: 0; } - .offset-lg-1 { - margin-left: 6.25%; } - .offset-lg-2 { - margin-left: 12.5%; } - .offset-lg-3 { - margin-left: 18.75%; } - .offset-lg-4 { - margin-left: 25%; } - .offset-lg-5 { - margin-left: 31.25%; } - .offset-lg-6 { - margin-left: 37.5%; } - .offset-lg-7 { - margin-left: 43.75%; } - .offset-lg-8 { - margin-left: 50%; } - .offset-lg-9 { - margin-left: 56.25%; } - .offset-lg-10 { - margin-left: 62.5%; } - .offset-lg-11 { - margin-left: 68.75%; } - .offset-lg-12 { - margin-left: 75%; } - .offset-lg-13 { - margin-left: 81.25%; } - .offset-lg-14 { - margin-left: 87.5%; } - .offset-lg-15 { - margin-left: 93.75%; } - .g-lg-0, - .gx-lg-0 { - --bs-gutter-x: 0; } - .g-lg-0, - .gy-lg-0 { - --bs-gutter-y: 0; } - .g-lg-1, - .gx-lg-1 { - --bs-gutter-x: 0.25rem; } - .g-lg-1, - .gy-lg-1 { - --bs-gutter-y: 0.25rem; } - .g-lg-2, - .gx-lg-2 { - --bs-gutter-x: 0.5rem; } - .g-lg-2, - .gy-lg-2 { - --bs-gutter-y: 0.5rem; } - .g-lg-3, - .gx-lg-3 { - --bs-gutter-x: 1rem; } - .g-lg-3, - .gy-lg-3 { - --bs-gutter-y: 1rem; } - .g-lg-4, - .gx-lg-4 { - --bs-gutter-x: 1.5rem; } - .g-lg-4, - .gy-lg-4 { - --bs-gutter-y: 1.5rem; } - .g-lg-5, - .gx-lg-5 { - --bs-gutter-x: 3rem; } - .g-lg-5, - .gy-lg-5 { - --bs-gutter-y: 3rem; } } - -@media (min-width: 1200px) { - .col-xl { - flex: 1 0 0%; } - .row-cols-xl-auto > * { - flex: 0 0 auto; - width: auto; } - .row-cols-xl-1 > * { - flex: 0 0 auto; - width: 100%; } - .row-cols-xl-2 > * { - flex: 0 0 auto; - width: 50%; } - .row-cols-xl-3 > * { - flex: 0 0 auto; - width: 33.33333333%; } - .row-cols-xl-4 > * { - flex: 0 0 auto; - width: 25%; } - .row-cols-xl-5 > * { - flex: 0 0 auto; - width: 20%; } - .row-cols-xl-6 > * { - flex: 0 0 auto; - width: 16.66666667%; } - .col-xl-auto { - flex: 0 0 auto; - width: auto; } - .col-xl-1 { - flex: 0 0 auto; - width: 6.25%; } - .col-xl-2 { - flex: 0 0 auto; - width: 12.5%; } - .col-xl-3 { - flex: 0 0 auto; - width: 18.75%; } - .col-xl-4 { - flex: 0 0 auto; - width: 25%; } - .col-xl-5 { - flex: 0 0 auto; - width: 31.25%; } - .col-xl-6 { - flex: 0 0 auto; - width: 37.5%; } - .col-xl-7 { - flex: 0 0 auto; - width: 43.75%; } - .col-xl-8 { - flex: 0 0 auto; - width: 50%; } - .col-xl-9 { - flex: 0 0 auto; - width: 56.25%; } - .col-xl-10 { - flex: 0 0 auto; - width: 62.5%; } - .col-xl-11 { - flex: 0 0 auto; - width: 68.75%; } - .col-xl-12 { - flex: 0 0 auto; - width: 75%; } - .col-xl-13 { - flex: 0 0 auto; - width: 81.25%; } - .col-xl-14 { - flex: 0 0 auto; - width: 87.5%; } - .col-xl-15 { - flex: 0 0 auto; - width: 93.75%; } - .col-xl-16 { - flex: 0 0 auto; - width: 100%; } - .offset-xl-0 { - margin-left: 0; } - .offset-xl-1 { - margin-left: 6.25%; } - .offset-xl-2 { - margin-left: 12.5%; } - .offset-xl-3 { - margin-left: 18.75%; } - .offset-xl-4 { - margin-left: 25%; } - .offset-xl-5 { - margin-left: 31.25%; } - .offset-xl-6 { - margin-left: 37.5%; } - .offset-xl-7 { - margin-left: 43.75%; } - .offset-xl-8 { - margin-left: 50%; } - .offset-xl-9 { - margin-left: 56.25%; } - .offset-xl-10 { - margin-left: 62.5%; } - .offset-xl-11 { - margin-left: 68.75%; } - .offset-xl-12 { - margin-left: 75%; } - .offset-xl-13 { - margin-left: 81.25%; } - .offset-xl-14 { - margin-left: 87.5%; } - .offset-xl-15 { - margin-left: 93.75%; } - .g-xl-0, - .gx-xl-0 { - --bs-gutter-x: 0; } - .g-xl-0, - .gy-xl-0 { - --bs-gutter-y: 0; } - .g-xl-1, - .gx-xl-1 { - --bs-gutter-x: 0.25rem; } - .g-xl-1, - .gy-xl-1 { - --bs-gutter-y: 0.25rem; } - .g-xl-2, - .gx-xl-2 { - --bs-gutter-x: 0.5rem; } - .g-xl-2, - .gy-xl-2 { - --bs-gutter-y: 0.5rem; } - .g-xl-3, - .gx-xl-3 { - --bs-gutter-x: 1rem; } - .g-xl-3, - .gy-xl-3 { - --bs-gutter-y: 1rem; } - .g-xl-4, - .gx-xl-4 { - --bs-gutter-x: 1.5rem; } - .g-xl-4, - .gy-xl-4 { - --bs-gutter-y: 1.5rem; } - .g-xl-5, - .gx-xl-5 { - --bs-gutter-x: 3rem; } - .g-xl-5, - .gy-xl-5 { - --bs-gutter-y: 3rem; } } - -@media (min-width: 1400px) { - .col-xxl { - flex: 1 0 0%; } - .row-cols-xxl-auto > * { - flex: 0 0 auto; - width: auto; } - .row-cols-xxl-1 > * { - flex: 0 0 auto; - width: 100%; } - .row-cols-xxl-2 > * { - flex: 0 0 auto; - width: 50%; } - .row-cols-xxl-3 > * { - flex: 0 0 auto; - width: 33.33333333%; } - .row-cols-xxl-4 > * { - flex: 0 0 auto; - width: 25%; } - .row-cols-xxl-5 > * { - flex: 0 0 auto; - width: 20%; } - .row-cols-xxl-6 > * { - flex: 0 0 auto; - width: 16.66666667%; } - .col-xxl-auto { - flex: 0 0 auto; - width: auto; } - .col-xxl-1 { - flex: 0 0 auto; - width: 6.25%; } - .col-xxl-2 { - flex: 0 0 auto; - width: 12.5%; } - .col-xxl-3 { - flex: 0 0 auto; - width: 18.75%; } - .col-xxl-4 { - flex: 0 0 auto; - width: 25%; } - .col-xxl-5 { - flex: 0 0 auto; - width: 31.25%; } - .col-xxl-6 { - flex: 0 0 auto; - width: 37.5%; } - .col-xxl-7 { - flex: 0 0 auto; - width: 43.75%; } - .col-xxl-8 { - flex: 0 0 auto; - width: 50%; } - .col-xxl-9 { - flex: 0 0 auto; - width: 56.25%; } - .col-xxl-10 { - flex: 0 0 auto; - width: 62.5%; } - .col-xxl-11 { - flex: 0 0 auto; - width: 68.75%; } - .col-xxl-12 { - flex: 0 0 auto; - width: 75%; } - .col-xxl-13 { - flex: 0 0 auto; - width: 81.25%; } - .col-xxl-14 { - flex: 0 0 auto; - width: 87.5%; } - .col-xxl-15 { - flex: 0 0 auto; - width: 93.75%; } - .col-xxl-16 { - flex: 0 0 auto; - width: 100%; } - .offset-xxl-0 { - margin-left: 0; } - .offset-xxl-1 { - margin-left: 6.25%; } - .offset-xxl-2 { - margin-left: 12.5%; } - .offset-xxl-3 { - margin-left: 18.75%; } - .offset-xxl-4 { - margin-left: 25%; } - .offset-xxl-5 { - margin-left: 31.25%; } - .offset-xxl-6 { - margin-left: 37.5%; } - .offset-xxl-7 { - margin-left: 43.75%; } - .offset-xxl-8 { - margin-left: 50%; } - .offset-xxl-9 { - margin-left: 56.25%; } - .offset-xxl-10 { - margin-left: 62.5%; } - .offset-xxl-11 { - margin-left: 68.75%; } - .offset-xxl-12 { - margin-left: 75%; } - .offset-xxl-13 { - margin-left: 81.25%; } - .offset-xxl-14 { - margin-left: 87.5%; } - .offset-xxl-15 { - margin-left: 93.75%; } - .g-xxl-0, - .gx-xxl-0 { - --bs-gutter-x: 0; } - .g-xxl-0, - .gy-xxl-0 { - --bs-gutter-y: 0; } - .g-xxl-1, - .gx-xxl-1 { - --bs-gutter-x: 0.25rem; } - .g-xxl-1, - .gy-xxl-1 { - --bs-gutter-y: 0.25rem; } - .g-xxl-2, - .gx-xxl-2 { - --bs-gutter-x: 0.5rem; } - .g-xxl-2, - .gy-xxl-2 { - --bs-gutter-y: 0.5rem; } - .g-xxl-3, - .gx-xxl-3 { - --bs-gutter-x: 1rem; } - .g-xxl-3, - .gy-xxl-3 { - --bs-gutter-y: 1rem; } - .g-xxl-4, - .gx-xxl-4 { - --bs-gutter-x: 1.5rem; } - .g-xxl-4, - .gy-xxl-4 { - --bs-gutter-y: 1.5rem; } - .g-xxl-5, - .gx-xxl-5 { - --bs-gutter-x: 3rem; } - .g-xxl-5, - .gy-xxl-5 { - --bs-gutter-y: 3rem; } } - -.table, table { - --bs-table-color: var(--bs-body-color); - --bs-table-bg: transparent; - --bs-table-border-color: var(--bs-border-color); - --bs-table-accent-bg: transparent; - --bs-table-striped-color: var(--bs-body-color); - --bs-table-striped-bg: rgba(29, 45, 53, 0.05); - --bs-table-active-color: var(--bs-body-color); - --bs-table-active-bg: rgba(29, 45, 53, 0.1); - --bs-table-hover-color: var(--bs-body-color); - --bs-table-hover-bg: rgba(29, 45, 53, 0.075); - width: 100%; - margin-bottom: 1rem; - color: var(--bs-table-color); - vertical-align: top; - border-color: var(--bs-table-border-color); } - .table > :not(caption) > * > *, table > :not(caption) > * > * { - padding: 0.5rem 0.5rem; - background-color: var(--bs-table-bg); - border-bottom-width: 1px; - box-shadow: inset 0 0 0 9999px var(--bs-table-accent-bg); } - .table > tbody, table > tbody { - vertical-align: inherit; } - .table > thead, table > thead { - vertical-align: bottom; } - -.table-group-divider { - border-top: 2px solid currentcolor; } - -.caption-top { - caption-side: top; } - -.table-sm > :not(caption) > * > * { - padding: 0.25rem 0.25rem; } - -.table-bordered > :not(caption) > * { - border-width: 1px 0; } - .table-bordered > :not(caption) > * > * { - border-width: 0 1px; } - -.table-borderless > :not(caption) > * > * { - border-bottom-width: 0; } - -.table-borderless > :not(:first-child) { - border-top-width: 0; } - -.table-striped > tbody > tr:nth-of-type(odd) > * { - --bs-table-accent-bg: var(--bs-table-striped-bg); - color: var(--bs-table-striped-color); } - -.table-striped-columns > :not(caption) > tr > :nth-child(even) { - --bs-table-accent-bg: var(--bs-table-striped-bg); - color: var(--bs-table-striped-color); } - -.table-active { - --bs-table-accent-bg: var(--bs-table-active-bg); - color: var(--bs-table-active-color); } - -.table-hover > tbody > tr:hover > * { - --bs-table-accent-bg: var(--bs-table-hover-bg); - color: var(--bs-table-hover-color); } - -.table-primary { - --bs-table-color: #1d2d35; - --bs-table-bg: #dfd5e7; - --bs-table-border-color: #ccc4d5; - --bs-table-striped-bg: #d5cdde; - --bs-table-striped-color: #1d2d35; - --bs-table-active-bg: #ccc4d5; - --bs-table-active-color: #1d2d35; - --bs-table-hover-bg: #d0c8da; - --bs-table-hover-color: #1d2d35; - color: var(--bs-table-color); - border-color: var(--bs-table-border-color); } - -.table-secondary { - --bs-table-color: #1d2d35; - --bs-table-bg: #e2e3e5; - --bs-table-border-color: #ced1d3; - --bs-table-striped-bg: #d8dadc; - --bs-table-striped-color: #1d2d35; - --bs-table-active-bg: #ced1d3; - --bs-table-active-color: #1d2d35; - --bs-table-hover-bg: #d3d5d8; - --bs-table-hover-color: #1d2d35; - color: var(--bs-table-color); - border-color: var(--bs-table-border-color); } - -.table-success { - --bs-table-color: #1d2d35; - --bs-table-bg: #d1e7dd; - --bs-table-border-color: #bfd4cc; - --bs-table-striped-bg: #c8ded5; - --bs-table-striped-color: #1d2d35; - --bs-table-active-bg: #bfd4cc; - --bs-table-active-color: #1d2d35; - --bs-table-hover-bg: #c4d9d0; - --bs-table-hover-color: #1d2d35; - color: var(--bs-table-color); - border-color: var(--bs-table-border-color); } - -.table-info { - --bs-table-color: #1d2d35; - --bs-table-bg: #cff4fc; - --bs-table-border-color: #bde0e8; - --bs-table-striped-bg: #c6eaf2; - --bs-table-striped-color: #1d2d35; - --bs-table-active-bg: #bde0e8; - --bs-table-active-color: #1d2d35; - --bs-table-hover-bg: #c2e5ed; - --bs-table-hover-color: #1d2d35; - color: var(--bs-table-color); - border-color: var(--bs-table-border-color); } - -.table-warning { - --bs-table-color: #1d2d35; - --bs-table-bg: #fff9cc; - --bs-table-border-color: #e8e5bd; - --bs-table-striped-bg: #f4efc4; - --bs-table-striped-color: #1d2d35; - --bs-table-active-bg: #e8e5bd; - --bs-table-active-color: #1d2d35; - --bs-table-hover-bg: #eeeac1; - --bs-table-hover-color: #1d2d35; - color: var(--bs-table-color); - border-color: var(--bs-table-border-color); } - -.table-danger { - --bs-table-color: #1d2d35; - --bs-table-bg: #f8d7da; - --bs-table-border-color: #e2c6ca; - --bs-table-striped-bg: #edcfd2; - --bs-table-striped-color: #1d2d35; - --bs-table-active-bg: #e2c6ca; - --bs-table-active-color: #1d2d35; - --bs-table-hover-bg: #e8cace; - --bs-table-hover-color: #1d2d35; - color: var(--bs-table-color); - border-color: var(--bs-table-border-color); } - -.table-light { - --bs-table-color: #1d2d35; - --bs-table-bg: #f8f9fa; - --bs-table-border-color: #e2e5e6; - --bs-table-striped-bg: #edeff0; - --bs-table-striped-color: #1d2d35; - --bs-table-active-bg: #e2e5e6; - --bs-table-active-color: #1d2d35; - --bs-table-hover-bg: #e8eaeb; - --bs-table-hover-color: #1d2d35; - color: var(--bs-table-color); - border-color: var(--bs-table-border-color); } - -.table-dark, body.dark table { - --bs-table-color: #fff; - --bs-table-bg: #212529; - --bs-table-border-color: #373b3e; - --bs-table-striped-bg: #2c3034; - --bs-table-striped-color: #fff; - --bs-table-active-bg: #373b3e; - --bs-table-active-color: #fff; - --bs-table-hover-bg: #323539; - --bs-table-hover-color: #fff; - color: var(--bs-table-color); - border-color: var(--bs-table-border-color); } - -.table-responsive { - overflow-x: auto; - -webkit-overflow-scrolling: touch; } - -@media (max-width: 575.98px) { - .table-responsive-sm { - overflow-x: auto; - -webkit-overflow-scrolling: touch; } } - -@media (max-width: 767.98px) { - .table-responsive-md { - overflow-x: auto; - -webkit-overflow-scrolling: touch; } } - -@media (max-width: 991.98px) { - .table-responsive-lg { - overflow-x: auto; - -webkit-overflow-scrolling: touch; } } - -@media (max-width: 1199.98px) { - .table-responsive-xl { - overflow-x: auto; - -webkit-overflow-scrolling: touch; } } - -@media (max-width: 1399.98px) { - .table-responsive-xxl { - overflow-x: auto; - -webkit-overflow-scrolling: touch; } } - -.form-label { - margin-bottom: 0.5rem; } - -.col-form-label { - padding-top: calc(0.375rem + 1px); - padding-bottom: calc(0.375rem + 1px); - margin-bottom: 0; - font-size: inherit; - line-height: 1.5; } - -.col-form-label-lg { - padding-top: calc(0.5rem + 1px); - padding-bottom: calc(0.5rem + 1px); - font-size: 1.25rem; } - -.col-form-label-sm { - padding-top: calc(0.25rem + 1px); - padding-bottom: calc(0.25rem + 1px); - font-size: 0.875rem; } - -.form-text { - margin-top: 0.25rem; - font-size: 0.875em; - color: #6c757d; } - -.form-control, .search-form .search-field, .comment-form input[type="text"], -.comment-form input[type="email"], -.comment-form input[type="url"], -.comment-form textarea { - display: block; - width: 100%; - padding: 0.375rem 0.75rem; - font-size: 1rem; - font-weight: 400; - line-height: 1.5; - color: #1d2d35; - background-color: #fff; - background-clip: padding-box; - border: 1px solid #ced4da; - appearance: none; - border-radius: 0.375rem; - transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; } - @media (prefers-reduced-motion: reduce) { - .form-control, .search-form .search-field, .comment-form input[type="text"], - .comment-form input[type="email"], - .comment-form input[type="url"], - .comment-form textarea { - transition: none; } } - .form-control[type="file"], .search-form [type="file"].search-field, .comment-form input[type="file"][type="text"], - .comment-form input[type="file"][type="email"], - .comment-form input[type="file"][type="url"], - .comment-form textarea[type="file"] { - overflow: hidden; } - .form-control[type="file"]:not(:disabled):not([readonly]), .search-form [type="file"].search-field:not(:disabled):not([readonly]), .comment-form input[type="file"][type="text"]:not(:disabled):not([readonly]), - .comment-form input[type="file"][type="email"]:not(:disabled):not([readonly]), - .comment-form input[type="file"][type="url"]:not(:disabled):not([readonly]), - .comment-form textarea[type="file"]:not(:disabled):not([readonly]) { - cursor: pointer; } - .form-control:focus, .search-form .search-field:focus, .comment-form input[type="text"]:focus, - .comment-form input[type="email"]:focus, - .comment-form input[type="url"]:focus, - .comment-form textarea:focus { - color: #1d2d35; - background-color: #fff; - border-color: #ae97c3; - outline: 0; - box-shadow: 0 0 0 0.25rem rgba(93, 47, 134, 0.25); } - .form-control::-webkit-date-and-time-value, .search-form .search-field::-webkit-date-and-time-value, .comment-form input[type="text"]::-webkit-date-and-time-value, - .comment-form input[type="email"]::-webkit-date-and-time-value, - .comment-form input[type="url"]::-webkit-date-and-time-value, - .comment-form textarea::-webkit-date-and-time-value { - height: 1.5em; } - .form-control::placeholder, .search-form .search-field::placeholder, .comment-form input[type="text"]::placeholder, - .comment-form input[type="email"]::placeholder, - .comment-form input[type="url"]::placeholder, - .comment-form textarea::placeholder { - color: #6c757d; - opacity: 1; } - .form-control:disabled, .search-form .search-field:disabled, .comment-form input[type="text"]:disabled, - .comment-form input[type="email"]:disabled, - .comment-form input[type="url"]:disabled, - .comment-form textarea:disabled { - background-color: #e9ecef; - opacity: 1; } - .form-control::file-selector-button, .search-form .search-field::file-selector-button, .comment-form input[type="text"]::file-selector-button, - .comment-form input[type="email"]::file-selector-button, - .comment-form input[type="url"]::file-selector-button, - .comment-form textarea::file-selector-button { - padding: 0.375rem 0.75rem; - margin: -0.375rem -0.75rem; - margin-inline-end: 0.75rem; - color: #1d2d35; - background-color: #e9ecef; - pointer-events: none; - border-color: inherit; - border-style: solid; - border-width: 0; - border-inline-end-width: 1px; - border-radius: 0; - transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; } - @media (prefers-reduced-motion: reduce) { - .form-control::file-selector-button, .search-form .search-field::file-selector-button, .comment-form input[type="text"]::file-selector-button, - .comment-form input[type="email"]::file-selector-button, - .comment-form input[type="url"]::file-selector-button, - .comment-form textarea::file-selector-button { - transition: none; } } - .form-control:hover:not(:disabled):not([readonly])::file-selector-button, .search-form .search-field:hover:not(:disabled):not([readonly])::file-selector-button, .comment-form input[type="text"]:hover:not(:disabled):not([readonly])::file-selector-button, - .comment-form input[type="email"]:hover:not(:disabled):not([readonly])::file-selector-button, - .comment-form input[type="url"]:hover:not(:disabled):not([readonly])::file-selector-button, - .comment-form textarea:hover:not(:disabled):not([readonly])::file-selector-button { - background-color: #dde0e3; } - -.form-control-plaintext { - display: block; - width: 100%; - padding: 0.375rem 0; - margin-bottom: 0; - line-height: 1.5; - color: #1d2d35; - background-color: transparent; - border: solid transparent; - border-width: 1px 0; } - .form-control-plaintext:focus { - outline: 0; } - .form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg { - padding-right: 0; - padding-left: 0; } - -.form-control-sm { - min-height: calc(1.5em + 0.5rem + 2px); - padding: 0.25rem 0.5rem; - font-size: 0.875rem; - border-radius: 0.25rem; } - .form-control-sm::file-selector-button { - padding: 0.25rem 0.5rem; - margin: -0.25rem -0.5rem; - margin-inline-end: 0.5rem; } - -.form-control-lg { - min-height: calc(1.5em + 1rem + 2px); - padding: 0.5rem 1rem; - font-size: 1.25rem; - border-radius: 0.5rem; } - .form-control-lg::file-selector-button { - padding: 0.5rem 1rem; - margin: -0.5rem -1rem; - margin-inline-end: 1rem; } - -textarea.form-control, .search-form textarea.search-field { - min-height: calc(1.5em + 0.75rem + 2px); } - -textarea.form-control-sm { - min-height: calc(1.5em + 0.5rem + 2px); } - -textarea.form-control-lg { - min-height: calc(1.5em + 1rem + 2px); } - -.form-control-color { - width: 3rem; - height: calc(1.5em + 0.75rem + 2px); - padding: 0.375rem; } - .form-control-color:not(:disabled):not([readonly]) { - cursor: pointer; } - .form-control-color::-moz-color-swatch { - border: 0 !important; - border-radius: 0.375rem; } - .form-control-color::-webkit-color-swatch { - border-radius: 0.375rem; } - .form-control-color.form-control-sm { - height: calc(1.5em + 0.5rem + 2px); } - .form-control-color.form-control-lg { - height: calc(1.5em + 1rem + 2px); } - -.form-select { - display: block; - width: 100%; - padding: 0.375rem 2.25rem 0.375rem 0.75rem; - -moz-padding-start: calc(0.75rem - 3px); - font-size: 1rem; - font-weight: 400; - line-height: 1.5; - color: #1d2d35; - background-color: #fff; - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"); - background-repeat: no-repeat; - background-position: right 0.75rem center; - background-size: 16px 12px; - border: 1px solid #ced4da; - border-radius: 0.375rem; - transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; - appearance: none; } - @media (prefers-reduced-motion: reduce) { - .form-select { - transition: none; } } - .form-select:focus { - border-color: #ae97c3; - outline: 0; - box-shadow: 0 0 0 0.25rem rgba(93, 47, 134, 0.25); } - .form-select[multiple], .form-select[size]:not([size="1"]) { - padding-right: 0.75rem; - background-image: none; } - .form-select:disabled { - background-color: #e9ecef; } - .form-select:-moz-focusring { - color: transparent; - text-shadow: 0 0 0 #1d2d35; } - -.form-select-sm { - padding-top: 0.25rem; - padding-bottom: 0.25rem; - padding-left: 0.5rem; - font-size: 0.875rem; - border-radius: 0.25rem; } - -.form-select-lg { - padding-top: 0.5rem; - padding-bottom: 0.5rem; - padding-left: 1rem; - font-size: 1.25rem; - border-radius: 0.5rem; } - -.form-check { - display: block; - min-height: 1.5rem; - padding-left: 1.5em; - margin-bottom: 0.125rem; } - .form-check .form-check-input { - float: left; - margin-left: -1.5em; } - -.form-check-reverse { - padding-right: 1.5em; - padding-left: 0; - text-align: right; } - .form-check-reverse .form-check-input { - float: right; - margin-right: -1.5em; - margin-left: 0; } - -.form-check-input { - width: 1em; - height: 1em; - margin-top: 0.25em; - vertical-align: top; - background-color: #fff; - background-repeat: no-repeat; - background-position: center; - background-size: contain; - border: 1px solid rgba(29, 45, 53, 0.25); - appearance: none; - print-color-adjust: exact; } - .form-check-input[type="checkbox"] { - border-radius: 0.25em; } - .form-check-input[type="radio"] { - border-radius: 50%; } - .form-check-input:active { - filter: brightness(90%); } - .form-check-input:focus { - border-color: #ae97c3; - outline: 0; - box-shadow: 0 0 0 0.25rem rgba(93, 47, 134, 0.25); } - .form-check-input:checked { - background-color: #5d2f86; - border-color: #5d2f86; } - .form-check-input:checked[type="checkbox"] { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e"); } - .form-check-input:checked[type="radio"] { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e"); } - .form-check-input[type="checkbox"]:indeterminate { - background-color: #5d2f86; - border-color: #5d2f86; - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e"); } - .form-check-input:disabled { - pointer-events: none; - filter: none; - opacity: 0.5; } - .form-check-input[disabled] ~ .form-check-label, .form-check-input:disabled ~ .form-check-label { - cursor: default; - opacity: 0.5; } - -.form-switch { - padding-left: 2.5em; } - .form-switch .form-check-input { - width: 2em; - margin-left: -2.5em; - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%2829, 45, 53, 0.25%29'/%3e%3c/svg%3e"); - background-position: left center; - border-radius: 2em; - transition: background-position 0.15s ease-in-out; } - @media (prefers-reduced-motion: reduce) { - .form-switch .form-check-input { - transition: none; } } - .form-switch .form-check-input:focus { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23ae97c3'/%3e%3c/svg%3e"); } - .form-switch .form-check-input:checked { - background-position: right center; - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e"); } - .form-switch.form-check-reverse { - padding-right: 2.5em; - padding-left: 0; } - .form-switch.form-check-reverse .form-check-input { - margin-right: -2.5em; - margin-left: 0; } - -.form-check-inline { - display: inline-block; - margin-right: 1rem; } - -.btn-check { - position: absolute; - clip: rect(0, 0, 0, 0); - pointer-events: none; } - .btn-check[disabled] + .btn, .search-form .btn-check[disabled] + .search-submit, .comment-form .btn-check[disabled] + input[type="submit"], .btn-check:disabled + .btn, .search-form .btn-check:disabled + .search-submit, .comment-form .btn-check:disabled + input[type="submit"] { - pointer-events: none; - filter: none; - opacity: 0.65; } - -.form-range { - width: 100%; - height: 1.5rem; - padding: 0; - background-color: transparent; - appearance: none; } - .form-range:focus { - outline: 0; } - .form-range:focus::-webkit-slider-thumb { - box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(93, 47, 134, 0.25); } - .form-range:focus::-moz-range-thumb { - box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(93, 47, 134, 0.25); } - .form-range::-moz-focus-outer { - border: 0; } - .form-range::-webkit-slider-thumb { - width: 1rem; - height: 1rem; - margin-top: -0.25rem; - background-color: #5d2f86; - border: 0; - border-radius: 1rem; - transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; - appearance: none; } - @media (prefers-reduced-motion: reduce) { - .form-range::-webkit-slider-thumb { - transition: none; } } - .form-range::-webkit-slider-thumb:active { - background-color: #cec1db; } - .form-range::-webkit-slider-runnable-track { - width: 100%; - height: 0.5rem; - color: transparent; - cursor: pointer; - background-color: #dee2e6; - border-color: transparent; - border-radius: 1rem; } - .form-range::-moz-range-thumb { - width: 1rem; - height: 1rem; - background-color: #5d2f86; - border: 0; - border-radius: 1rem; - transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; - appearance: none; } - @media (prefers-reduced-motion: reduce) { - .form-range::-moz-range-thumb { - transition: none; } } - .form-range::-moz-range-thumb:active { - background-color: #cec1db; } - .form-range::-moz-range-track { - width: 100%; - height: 0.5rem; - color: transparent; - cursor: pointer; - background-color: #dee2e6; - border-color: transparent; - border-radius: 1rem; } - .form-range:disabled { - pointer-events: none; } - .form-range:disabled::-webkit-slider-thumb { - background-color: #adb5bd; } - .form-range:disabled::-moz-range-thumb { - background-color: #adb5bd; } - -.form-floating { - position: relative; } - .form-floating > .form-control, .search-form .form-floating > .search-field, .comment-form .form-floating > input[type="text"], - .comment-form .form-floating > input[type="email"], - .comment-form .form-floating > input[type="url"], - .comment-form .form-floating > textarea, - .form-floating > .form-control-plaintext, - .form-floating > .form-select { - height: calc(3.5rem + 2px); - line-height: 1.25; } - .form-floating > label { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - padding: 1rem 0.75rem; - overflow: hidden; - text-align: start; - text-overflow: ellipsis; - white-space: nowrap; - pointer-events: none; - border: 1px solid transparent; - transform-origin: 0 0; - transition: opacity 0.1s ease-in-out, transform 0.1s ease-in-out; } - @media (prefers-reduced-motion: reduce) { - .form-floating > label { - transition: none; } } - .form-floating > .form-control, .search-form .form-floating > .search-field, .comment-form .form-floating > input[type="text"], - .comment-form .form-floating > input[type="email"], - .comment-form .form-floating > input[type="url"], - .comment-form .form-floating > textarea, - .form-floating > .form-control-plaintext { - padding: 1rem 0.75rem; } - .form-floating > .form-control::placeholder, .search-form .form-floating > .search-field::placeholder, .comment-form .form-floating > input[type="text"]::placeholder, - .comment-form .form-floating > input[type="email"]::placeholder, - .comment-form .form-floating > input[type="url"]::placeholder, - .comment-form .form-floating > textarea::placeholder, - .form-floating > .form-control-plaintext::placeholder { - color: transparent; } - .form-floating > .form-control:focus, .search-form .form-floating > .search-field:focus, .comment-form .form-floating > input[type="text"]:focus, - .comment-form .form-floating > input[type="email"]:focus, - .comment-form .form-floating > input[type="url"]:focus, - .comment-form .form-floating > textarea:focus, .form-floating > .form-control:not(:placeholder-shown), .search-form .form-floating > .search-field:not(:placeholder-shown), .comment-form .form-floating > input[type="text"]:not(:placeholder-shown), - .comment-form .form-floating > input[type="email"]:not(:placeholder-shown), - .comment-form .form-floating > input[type="url"]:not(:placeholder-shown), - .comment-form .form-floating > textarea:not(:placeholder-shown), - .form-floating > .form-control-plaintext:focus, - .form-floating > .form-control-plaintext:not(:placeholder-shown) { - padding-top: 1.625rem; - padding-bottom: 0.625rem; } - .form-floating > .form-control:-webkit-autofill, .search-form .form-floating > .search-field:-webkit-autofill, .comment-form .form-floating > input[type="text"]:-webkit-autofill, - .comment-form .form-floating > input[type="email"]:-webkit-autofill, - .comment-form .form-floating > input[type="url"]:-webkit-autofill, - .comment-form .form-floating > textarea:-webkit-autofill, - .form-floating > .form-control-plaintext:-webkit-autofill { - padding-top: 1.625rem; - padding-bottom: 0.625rem; } - .form-floating > .form-select { - padding-top: 1.625rem; - padding-bottom: 0.625rem; } - .form-floating > .form-control:focus ~ label, .search-form .form-floating > .search-field:focus ~ label, .comment-form .form-floating > input[type="text"]:focus ~ label, - .comment-form .form-floating > input[type="email"]:focus ~ label, - .comment-form .form-floating > input[type="url"]:focus ~ label, - .comment-form .form-floating > textarea:focus ~ label, - .form-floating > .form-control:not(:placeholder-shown) ~ label, - .search-form .form-floating > .search-field:not(:placeholder-shown) ~ label, - .comment-form .form-floating > input[type="text"]:not(:placeholder-shown) ~ label, - .comment-form .form-floating > input[type="email"]:not(:placeholder-shown) ~ label, - .comment-form .form-floating > input[type="url"]:not(:placeholder-shown) ~ label, - .comment-form .form-floating > textarea:not(:placeholder-shown) ~ label, - .form-floating > .form-control-plaintext ~ label, - .form-floating > .form-select ~ label { - opacity: 0.65; - transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); } - .form-floating > .form-control:-webkit-autofill ~ label, .search-form .form-floating > .search-field:-webkit-autofill ~ label, .comment-form .form-floating > input[type="text"]:-webkit-autofill ~ label, - .comment-form .form-floating > input[type="email"]:-webkit-autofill ~ label, - .comment-form .form-floating > input[type="url"]:-webkit-autofill ~ label, - .comment-form .form-floating > textarea:-webkit-autofill ~ label { - opacity: 0.65; - transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); } - .form-floating > .form-control-plaintext ~ label { - border-width: 1px 0; } - -.input-group { - position: relative; - display: flex; - flex-wrap: wrap; - align-items: stretch; - width: 100%; } - .input-group > .form-control, .search-form .input-group > .search-field, .comment-form .input-group > input[type="text"], - .comment-form .input-group > input[type="email"], - .comment-form .input-group > input[type="url"], - .comment-form .input-group > textarea, - .input-group > .form-select, - .input-group > .form-floating { - position: relative; - flex: 1 1 auto; - width: 1%; - min-width: 0; } - .input-group > .form-control:focus, .search-form .input-group > .search-field:focus, .comment-form .input-group > input[type="text"]:focus, - .comment-form .input-group > input[type="email"]:focus, - .comment-form .input-group > input[type="url"]:focus, - .comment-form .input-group > textarea:focus, - .input-group > .form-select:focus, - .input-group > .form-floating:focus-within { - z-index: 5; } - .input-group .btn, .input-group .search-form .search-submit, .search-form .input-group .search-submit, .input-group .comment-form input[type="submit"], .comment-form .input-group input[type="submit"] { - position: relative; - z-index: 2; } - .input-group .btn:focus, .input-group .search-form .search-submit:focus, .search-form .input-group .search-submit:focus, .input-group .comment-form input[type="submit"]:focus, .comment-form .input-group input[type="submit"]:focus { - z-index: 5; } - -.input-group-text { - display: flex; - align-items: center; - padding: 0.375rem 0.75rem; - font-size: 1rem; - font-weight: 400; - line-height: 1.5; - color: #1d2d35; - text-align: center; - white-space: nowrap; - background-color: #e9ecef; - border: 1px solid #ced4da; - border-radius: 0.375rem; } - -.input-group-lg > .form-control, .search-form .input-group-lg > .search-field, .comment-form .input-group-lg > input[type="text"], -.comment-form .input-group-lg > input[type="email"], -.comment-form .input-group-lg > input[type="url"], -.comment-form .input-group-lg > textarea, -.input-group-lg > .form-select, -.input-group-lg > .input-group-text, -.input-group-lg > .btn, -.search-form .input-group-lg > .search-submit, -.comment-form .input-group-lg > input[type="submit"] { - padding: 0.5rem 1rem; - font-size: 1.25rem; - border-radius: 0.5rem; } - -.input-group-sm > .form-control, .search-form .input-group-sm > .search-field, .comment-form .input-group-sm > input[type="text"], -.comment-form .input-group-sm > input[type="email"], -.comment-form .input-group-sm > input[type="url"], -.comment-form .input-group-sm > textarea, -.input-group-sm > .form-select, -.input-group-sm > .input-group-text, -.input-group-sm > .btn, -.search-form .input-group-sm > .search-submit, -.comment-form .input-group-sm > input[type="submit"] { - padding: 0.25rem 0.5rem; - font-size: 0.875rem; - border-radius: 0.25rem; } - -.input-group-lg > .form-select, -.input-group-sm > .form-select { - padding-right: 3rem; } - -.input-group:not(.has-validation) > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating), -.input-group:not(.has-validation) > .dropdown-toggle:nth-last-child(n + 3), -.input-group:not(.has-validation) > .form-floating:not(:last-child) > .form-control, -.search-form .input-group:not(.has-validation) > .form-floating:not(:last-child) > .search-field, -.comment-form .input-group:not(.has-validation) > .form-floating:not(:last-child) > input[type="text"], -.comment-form .input-group:not(.has-validation) > .form-floating:not(:last-child) > input[type="email"], -.comment-form .input-group:not(.has-validation) > .form-floating:not(:last-child) > input[type="url"], -.comment-form .input-group:not(.has-validation) > .form-floating:not(:last-child) > textarea, -.input-group:not(.has-validation) > .form-floating:not(:last-child) > .form-select { - border-top-right-radius: 0; - border-bottom-right-radius: 0; } - -.input-group.has-validation > :nth-last-child(n + 3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating), -.input-group.has-validation > .dropdown-toggle:nth-last-child(n + 4), -.input-group.has-validation > .form-floating:nth-last-child(n + 3) > .form-control, -.search-form .input-group.has-validation > .form-floating:nth-last-child(n + 3) > .search-field, -.comment-form .input-group.has-validation > .form-floating:nth-last-child(n + 3) > input[type="text"], -.comment-form .input-group.has-validation > .form-floating:nth-last-child(n + 3) > input[type="email"], -.comment-form .input-group.has-validation > .form-floating:nth-last-child(n + 3) > input[type="url"], -.comment-form .input-group.has-validation > .form-floating:nth-last-child(n + 3) > textarea, -.input-group.has-validation > .form-floating:nth-last-child(n + 3) > .form-select { - border-top-right-radius: 0; - border-bottom-right-radius: 0; } - -.input-group > :not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback) { - margin-left: -1px; - border-top-left-radius: 0; - border-bottom-left-radius: 0; } - -.input-group > .form-floating:not(:first-child) > .form-control, .search-form .input-group > .form-floating:not(:first-child) > .search-field, .comment-form .input-group > .form-floating:not(:first-child) > input[type="text"], -.comment-form .input-group > .form-floating:not(:first-child) > input[type="email"], -.comment-form .input-group > .form-floating:not(:first-child) > input[type="url"], -.comment-form .input-group > .form-floating:not(:first-child) > textarea, -.input-group > .form-floating:not(:first-child) > .form-select { - border-top-left-radius: 0; - border-bottom-left-radius: 0; } - -.valid-feedback { - display: none; - width: 100%; - margin-top: 0.25rem; - font-size: 0.875em; - color: #198754; } - -.valid-tooltip { - position: absolute; - top: 100%; - z-index: 5; - display: none; - max-width: 100%; - padding: 0.25rem 0.5rem; - margin-top: .1rem; - font-size: 0.875rem; - color: #fff; - background-color: rgba(25, 135, 84, 0.9); - border-radius: 0.375rem; } - -.was-validated :valid ~ .valid-feedback, -.was-validated :valid ~ .valid-tooltip, -.is-valid ~ .valid-feedback, -.is-valid ~ .valid-tooltip { - display: block; } - -.was-validated .form-control:valid, .was-validated .search-form .search-field:valid, .search-form .was-validated .search-field:valid, .was-validated .comment-form input[type="text"]:valid, .comment-form .was-validated input[type="text"]:valid, -.was-validated .comment-form input[type="email"]:valid, -.comment-form .was-validated input[type="email"]:valid, -.was-validated .comment-form input[type="url"]:valid, -.comment-form .was-validated input[type="url"]:valid, -.was-validated .comment-form textarea:valid, -.comment-form .was-validated textarea:valid, .form-control.is-valid, .search-form .is-valid.search-field, .comment-form input.is-valid[type="text"], -.comment-form input.is-valid[type="email"], -.comment-form input.is-valid[type="url"], -.comment-form textarea.is-valid { - border-color: #198754; - padding-right: calc(1.5em + 0.75rem); - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); - background-repeat: no-repeat; - background-position: right calc(0.375em + 0.1875rem) center; - background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); } - .was-validated .form-control:valid:focus, .was-validated .search-form .search-field:valid:focus, .search-form .was-validated .search-field:valid:focus, .was-validated .comment-form input[type="text"]:valid:focus, .comment-form .was-validated input[type="text"]:valid:focus, - .was-validated .comment-form input[type="email"]:valid:focus, - .comment-form .was-validated input[type="email"]:valid:focus, - .was-validated .comment-form input[type="url"]:valid:focus, - .comment-form .was-validated input[type="url"]:valid:focus, - .was-validated .comment-form textarea:valid:focus, - .comment-form .was-validated textarea:valid:focus, .form-control.is-valid:focus, .search-form .is-valid.search-field:focus, .comment-form input.is-valid[type="text"]:focus, - .comment-form input.is-valid[type="email"]:focus, - .comment-form input.is-valid[type="url"]:focus, - .comment-form textarea.is-valid:focus { - border-color: #198754; - box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25); } - -.was-validated textarea.form-control:valid, .was-validated .search-form textarea.search-field:valid, .search-form .was-validated textarea.search-field:valid, textarea.form-control.is-valid, .search-form textarea.is-valid.search-field { - padding-right: calc(1.5em + 0.75rem); - background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); } - -.was-validated .form-select:valid, .form-select.is-valid { - border-color: #198754; } - .was-validated .form-select:valid:not([multiple]):not([size]), .was-validated .form-select:valid:not([multiple])[size="1"], .form-select.is-valid:not([multiple]):not([size]), .form-select.is-valid:not([multiple])[size="1"] { - padding-right: 4.125rem; - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"), url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); - background-position: right 0.75rem center, center right 2.25rem; - background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); } - .was-validated .form-select:valid:focus, .form-select.is-valid:focus { - border-color: #198754; - box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25); } - -.was-validated .form-control-color:valid, .form-control-color.is-valid { - width: calc(3rem + calc(1.5em + 0.75rem)); } - -.was-validated .form-check-input:valid, .form-check-input.is-valid { - border-color: #198754; } - .was-validated .form-check-input:valid:checked, .form-check-input.is-valid:checked { - background-color: #198754; } - .was-validated .form-check-input:valid:focus, .form-check-input.is-valid:focus { - box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25); } - .was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label { - color: #198754; } - -.form-check-inline .form-check-input ~ .valid-feedback { - margin-left: .5em; } - -.was-validated .input-group > .form-control:not(:focus):valid, .was-validated .search-form .input-group > .search-field:not(:focus):valid, .search-form .was-validated .input-group > .search-field:not(:focus):valid, .was-validated .comment-form .input-group > input[type="text"]:not(:focus):valid, .comment-form .was-validated .input-group > input[type="text"]:not(:focus):valid, -.was-validated .comment-form .input-group > input[type="email"]:not(:focus):valid, -.comment-form .was-validated .input-group > input[type="email"]:not(:focus):valid, -.was-validated .comment-form .input-group > input[type="url"]:not(:focus):valid, -.comment-form .was-validated .input-group > input[type="url"]:not(:focus):valid, -.was-validated .comment-form .input-group > textarea:not(:focus):valid, -.comment-form .was-validated .input-group > textarea:not(:focus):valid, .input-group > .form-control:not(:focus).is-valid, .search-form .input-group > .search-field:not(:focus).is-valid, .comment-form .input-group > input[type="text"]:not(:focus).is-valid, -.comment-form .input-group > input[type="email"]:not(:focus).is-valid, -.comment-form .input-group > input[type="url"]:not(:focus).is-valid, -.comment-form .input-group > textarea:not(:focus).is-valid, .was-validated .input-group > .form-select:not(:focus):valid, -.input-group > .form-select:not(:focus).is-valid, .was-validated .input-group > .form-floating:not(:focus-within):valid, -.input-group > .form-floating:not(:focus-within).is-valid { - z-index: 3; } - -.invalid-feedback { - display: none; - width: 100%; - margin-top: 0.25rem; - font-size: 0.875em; - color: #dc3545; } - -.invalid-tooltip { - position: absolute; - top: 100%; - z-index: 5; - display: none; - max-width: 100%; - padding: 0.25rem 0.5rem; - margin-top: .1rem; - font-size: 0.875rem; - color: #fff; - background-color: rgba(220, 53, 69, 0.9); - border-radius: 0.375rem; } - -.was-validated :invalid ~ .invalid-feedback, -.was-validated :invalid ~ .invalid-tooltip, -.is-invalid ~ .invalid-feedback, -.is-invalid ~ .invalid-tooltip { - display: block; } - -.was-validated .form-control:invalid, .was-validated .search-form .search-field:invalid, .search-form .was-validated .search-field:invalid, .was-validated .comment-form input[type="text"]:invalid, .comment-form .was-validated input[type="text"]:invalid, -.was-validated .comment-form input[type="email"]:invalid, -.comment-form .was-validated input[type="email"]:invalid, -.was-validated .comment-form input[type="url"]:invalid, -.comment-form .was-validated input[type="url"]:invalid, -.was-validated .comment-form textarea:invalid, -.comment-form .was-validated textarea:invalid, .form-control.is-invalid, .search-form .is-invalid.search-field, .comment-form input.is-invalid[type="text"], -.comment-form input.is-invalid[type="email"], -.comment-form input.is-invalid[type="url"], -.comment-form textarea.is-invalid { - border-color: #dc3545; - padding-right: calc(1.5em + 0.75rem); - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e"); - background-repeat: no-repeat; - background-position: right calc(0.375em + 0.1875rem) center; - background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); } - .was-validated .form-control:invalid:focus, .was-validated .search-form .search-field:invalid:focus, .search-form .was-validated .search-field:invalid:focus, .was-validated .comment-form input[type="text"]:invalid:focus, .comment-form .was-validated input[type="text"]:invalid:focus, - .was-validated .comment-form input[type="email"]:invalid:focus, - .comment-form .was-validated input[type="email"]:invalid:focus, - .was-validated .comment-form input[type="url"]:invalid:focus, - .comment-form .was-validated input[type="url"]:invalid:focus, - .was-validated .comment-form textarea:invalid:focus, - .comment-form .was-validated textarea:invalid:focus, .form-control.is-invalid:focus, .search-form .is-invalid.search-field:focus, .comment-form input.is-invalid[type="text"]:focus, - .comment-form input.is-invalid[type="email"]:focus, - .comment-form input.is-invalid[type="url"]:focus, - .comment-form textarea.is-invalid:focus { - border-color: #dc3545; - box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25); } - -.was-validated textarea.form-control:invalid, .was-validated .search-form textarea.search-field:invalid, .search-form .was-validated textarea.search-field:invalid, textarea.form-control.is-invalid, .search-form textarea.is-invalid.search-field { - padding-right: calc(1.5em + 0.75rem); - background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); } - -.was-validated .form-select:invalid, .form-select.is-invalid { - border-color: #dc3545; } - .was-validated .form-select:invalid:not([multiple]):not([size]), .was-validated .form-select:invalid:not([multiple])[size="1"], .form-select.is-invalid:not([multiple]):not([size]), .form-select.is-invalid:not([multiple])[size="1"] { - padding-right: 4.125rem; - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"), url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e"); - background-position: right 0.75rem center, center right 2.25rem; - background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); } - .was-validated .form-select:invalid:focus, .form-select.is-invalid:focus { - border-color: #dc3545; - box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25); } - -.was-validated .form-control-color:invalid, .form-control-color.is-invalid { - width: calc(3rem + calc(1.5em + 0.75rem)); } - -.was-validated .form-check-input:invalid, .form-check-input.is-invalid { - border-color: #dc3545; } - .was-validated .form-check-input:invalid:checked, .form-check-input.is-invalid:checked { - background-color: #dc3545; } - .was-validated .form-check-input:invalid:focus, .form-check-input.is-invalid:focus { - box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25); } - .was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label { - color: #dc3545; } - -.form-check-inline .form-check-input ~ .invalid-feedback { - margin-left: .5em; } - -.was-validated .input-group > .form-control:not(:focus):invalid, .was-validated .search-form .input-group > .search-field:not(:focus):invalid, .search-form .was-validated .input-group > .search-field:not(:focus):invalid, .was-validated .comment-form .input-group > input[type="text"]:not(:focus):invalid, .comment-form .was-validated .input-group > input[type="text"]:not(:focus):invalid, -.was-validated .comment-form .input-group > input[type="email"]:not(:focus):invalid, -.comment-form .was-validated .input-group > input[type="email"]:not(:focus):invalid, -.was-validated .comment-form .input-group > input[type="url"]:not(:focus):invalid, -.comment-form .was-validated .input-group > input[type="url"]:not(:focus):invalid, -.was-validated .comment-form .input-group > textarea:not(:focus):invalid, -.comment-form .was-validated .input-group > textarea:not(:focus):invalid, .input-group > .form-control:not(:focus).is-invalid, .search-form .input-group > .search-field:not(:focus).is-invalid, .comment-form .input-group > input[type="text"]:not(:focus).is-invalid, -.comment-form .input-group > input[type="email"]:not(:focus).is-invalid, -.comment-form .input-group > input[type="url"]:not(:focus).is-invalid, -.comment-form .input-group > textarea:not(:focus).is-invalid, .was-validated .input-group > .form-select:not(:focus):invalid, -.input-group > .form-select:not(:focus).is-invalid, .was-validated .input-group > .form-floating:not(:focus-within):invalid, -.input-group > .form-floating:not(:focus-within).is-invalid { - z-index: 4; } - -.btn, .search-form .search-submit, .comment-form input[type="submit"] { - --bs-btn-padding-x: 0.75rem; - --bs-btn-padding-y: 0.375rem; - --bs-btn-font-family: ; - --bs-btn-font-size: 1rem; - --bs-btn-font-weight: 400; - --bs-btn-line-height: 1.5; - --bs-btn-color: #1d2d35; - --bs-btn-bg: transparent; - --bs-btn-border-width: 1px; - --bs-btn-border-color: transparent; - --bs-btn-border-radius: 0.375rem; - --bs-btn-hover-border-color: transparent; - --bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(29, 45, 53, 0.075); - --bs-btn-disabled-opacity: 0.65; - --bs-btn-focus-box-shadow: 0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5); - display: inline-block; - padding: var(--bs-btn-padding-y) var(--bs-btn-padding-x); - font-family: var(--bs-btn-font-family); - font-size: var(--bs-btn-font-size); - font-weight: var(--bs-btn-font-weight); - line-height: var(--bs-btn-line-height); - color: var(--bs-btn-color); - text-align: center; - vertical-align: middle; - cursor: pointer; - user-select: none; - border: var(--bs-btn-border-width) solid var(--bs-btn-border-color); - border-radius: var(--bs-btn-border-radius); - background-color: var(--bs-btn-bg); - transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; } - @media (prefers-reduced-motion: reduce) { - .btn, .search-form .search-submit, .comment-form input[type="submit"] { - transition: none; } } - .btn:hover, .search-form .search-submit:hover, .comment-form input[type="submit"]:hover { - color: var(--bs-btn-hover-color); - background-color: var(--bs-btn-hover-bg); - border-color: var(--bs-btn-hover-border-color); } - .btn-check + .btn:hover, .search-form .btn-check + .search-submit:hover, .comment-form .btn-check + input[type="submit"]:hover { - color: var(--bs-btn-color); - background-color: var(--bs-btn-bg); - border-color: var(--bs-btn-border-color); } - .btn:focus-visible, .search-form .search-submit:focus-visible, .comment-form input[type="submit"]:focus-visible { - color: var(--bs-btn-hover-color); - background-color: var(--bs-btn-hover-bg); - border-color: var(--bs-btn-hover-border-color); - outline: 0; - box-shadow: var(--bs-btn-focus-box-shadow); } - .btn-check:focus-visible + .btn, .search-form .btn-check:focus-visible + .search-submit, .comment-form .btn-check:focus-visible + input[type="submit"] { - border-color: var(--bs-btn-hover-border-color); - outline: 0; - box-shadow: var(--bs-btn-focus-box-shadow); } - .btn-check:checked + .btn, .search-form .btn-check:checked + .search-submit, .comment-form .btn-check:checked + input[type="submit"], :not(.btn-check) + .btn:active, .search-form :not(.btn-check) + .search-submit:active, .comment-form :not(.btn-check) + input[type="submit"]:active, .btn:first-child:active, .search-form .search-submit:first-child:active, .comment-form input[type="submit"]:first-child:active, .btn.active, .search-form .active.search-submit, .comment-form input.active[type="submit"], .btn.show, .search-form .show.search-submit, .comment-form input.show[type="submit"] { - color: var(--bs-btn-active-color); - background-color: var(--bs-btn-active-bg); - border-color: var(--bs-btn-active-border-color); } - .btn-check:checked + .btn:focus-visible, .search-form .btn-check:checked + .search-submit:focus-visible, .comment-form .btn-check:checked + input[type="submit"]:focus-visible, :not(.btn-check) + .btn:active:focus-visible, .search-form :not(.btn-check) + .search-submit:active:focus-visible, .comment-form :not(.btn-check) + input[type="submit"]:active:focus-visible, .btn:first-child:active:focus-visible, .search-form .search-submit:first-child:active:focus-visible, .comment-form input[type="submit"]:first-child:active:focus-visible, .btn.active:focus-visible, .search-form .active.search-submit:focus-visible, .comment-form input.active[type="submit"]:focus-visible, .btn.show:focus-visible, .search-form .show.search-submit:focus-visible, .comment-form input.show[type="submit"]:focus-visible { - box-shadow: var(--bs-btn-focus-box-shadow); } - .btn:disabled, .search-form .search-submit:disabled, .comment-form input[type="submit"]:disabled, .btn.disabled, .search-form .disabled.search-submit, .comment-form input.disabled[type="submit"], fieldset:disabled .btn, fieldset:disabled .search-form .search-submit, .search-form fieldset:disabled .search-submit, fieldset:disabled .comment-form input[type="submit"], .comment-form fieldset:disabled input[type="submit"] { - color: var(--bs-btn-disabled-color); - pointer-events: none; - background-color: var(--bs-btn-disabled-bg); - border-color: var(--bs-btn-disabled-border-color); - opacity: var(--bs-btn-disabled-opacity); } - -.btn-primary { - --bs-btn-color: #fff; - --bs-btn-bg: #5d2f86; - --bs-btn-border-color: #5d2f86; - --bs-btn-hover-color: #fff; - --bs-btn-hover-bg: #4f2872; - --bs-btn-hover-border-color: #4a266b; - --bs-btn-focus-shadow-rgb: 117, 78, 152; - --bs-btn-active-color: #fff; - --bs-btn-active-bg: #4a266b; - --bs-btn-active-border-color: #462365; - --bs-btn-active-shadow: inset 0 3px 5px rgba(29, 45, 53, 0.125); - --bs-btn-disabled-color: #fff; - --bs-btn-disabled-bg: #5d2f86; - --bs-btn-disabled-border-color: #5d2f86; } - -.btn-secondary, .search-form .search-submit, .comment-form input[type="submit"] { - --bs-btn-color: #fff; - --bs-btn-bg: #6c757d; - --bs-btn-border-color: #6c757d; - --bs-btn-hover-color: #fff; - --bs-btn-hover-bg: #5c636a; - --bs-btn-hover-border-color: #565e64; - --bs-btn-focus-shadow-rgb: 130, 138, 145; - --bs-btn-active-color: #fff; - --bs-btn-active-bg: #565e64; - --bs-btn-active-border-color: #51585e; - --bs-btn-active-shadow: inset 0 3px 5px rgba(29, 45, 53, 0.125); - --bs-btn-disabled-color: #fff; - --bs-btn-disabled-bg: #6c757d; - --bs-btn-disabled-border-color: #6c757d; } - -.btn-success { - --bs-btn-color: #fff; - --bs-btn-bg: #198754; - --bs-btn-border-color: #198754; - --bs-btn-hover-color: #fff; - --bs-btn-hover-bg: #157347; - --bs-btn-hover-border-color: #146c43; - --bs-btn-focus-shadow-rgb: 60, 153, 110; - --bs-btn-active-color: #fff; - --bs-btn-active-bg: #146c43; - --bs-btn-active-border-color: #13653f; - --bs-btn-active-shadow: inset 0 3px 5px rgba(29, 45, 53, 0.125); - --bs-btn-disabled-color: #fff; - --bs-btn-disabled-bg: #198754; - --bs-btn-disabled-border-color: #198754; } - -.btn-info { - --bs-btn-color: #1d2d35; - --bs-btn-bg: #0dcaf0; - --bs-btn-border-color: #0dcaf0; - --bs-btn-hover-color: #1d2d35; - --bs-btn-hover-bg: #31d2f2; - --bs-btn-hover-border-color: #25cff2; - --bs-btn-focus-shadow-rgb: 15, 178, 212; - --bs-btn-active-color: #1d2d35; - --bs-btn-active-bg: #3dd5f3; - --bs-btn-active-border-color: #25cff2; - --bs-btn-active-shadow: inset 0 3px 5px rgba(29, 45, 53, 0.125); - --bs-btn-disabled-color: #1d2d35; - --bs-btn-disabled-bg: #0dcaf0; - --bs-btn-disabled-border-color: #0dcaf0; } - -.btn-warning { - --bs-btn-color: #1d2d35; - --bs-btn-bg: #ffe000; - --bs-btn-border-color: #ffe000; - --bs-btn-hover-color: #1d2d35; - --bs-btn-hover-bg: #ffe526; - --bs-btn-hover-border-color: #ffe31a; - --bs-btn-focus-shadow-rgb: 221, 197, 8; - --bs-btn-active-color: #1d2d35; - --bs-btn-active-bg: #ffe633; - --bs-btn-active-border-color: #ffe31a; - --bs-btn-active-shadow: inset 0 3px 5px rgba(29, 45, 53, 0.125); - --bs-btn-disabled-color: #1d2d35; - --bs-btn-disabled-bg: #ffe000; - --bs-btn-disabled-border-color: #ffe000; } - -.btn-danger { - --bs-btn-color: #fff; - --bs-btn-bg: #dc3545; - --bs-btn-border-color: #dc3545; - --bs-btn-hover-color: #fff; - --bs-btn-hover-bg: #bb2d3b; - --bs-btn-hover-border-color: #b02a37; - --bs-btn-focus-shadow-rgb: 225, 83, 97; - --bs-btn-active-color: #fff; - --bs-btn-active-bg: #b02a37; - --bs-btn-active-border-color: #a52834; - --bs-btn-active-shadow: inset 0 3px 5px rgba(29, 45, 53, 0.125); - --bs-btn-disabled-color: #fff; - --bs-btn-disabled-bg: #dc3545; - --bs-btn-disabled-border-color: #dc3545; } - -.btn-light { - --bs-btn-color: #1d2d35; - --bs-btn-bg: #f8f9fa; - --bs-btn-border-color: #f8f9fa; - --bs-btn-hover-color: #1d2d35; - --bs-btn-hover-bg: #d3d4d5; - --bs-btn-hover-border-color: #c6c7c8; - --bs-btn-focus-shadow-rgb: 215, 218, 220; - --bs-btn-active-color: #1d2d35; - --bs-btn-active-bg: #c6c7c8; - --bs-btn-active-border-color: #babbbc; - --bs-btn-active-shadow: inset 0 3px 5px rgba(29, 45, 53, 0.125); - --bs-btn-disabled-color: #1d2d35; - --bs-btn-disabled-bg: #f8f9fa; - --bs-btn-disabled-border-color: #f8f9fa; } - -.btn-dark { - --bs-btn-color: #fff; - --bs-btn-bg: #212529; - --bs-btn-border-color: #212529; - --bs-btn-hover-color: #fff; - --bs-btn-hover-bg: #424649; - --bs-btn-hover-border-color: #373b3e; - --bs-btn-focus-shadow-rgb: 66, 70, 73; - --bs-btn-active-color: #fff; - --bs-btn-active-bg: #4d5154; - --bs-btn-active-border-color: #373b3e; - --bs-btn-active-shadow: inset 0 3px 5px rgba(29, 45, 53, 0.125); - --bs-btn-disabled-color: #fff; - --bs-btn-disabled-bg: #212529; - --bs-btn-disabled-border-color: #212529; } - -.btn-outline-primary { - --bs-btn-color: #5d2f86; - --bs-btn-border-color: #5d2f86; - --bs-btn-hover-color: #fff; - --bs-btn-hover-bg: #5d2f86; - --bs-btn-hover-border-color: #5d2f86; - --bs-btn-focus-shadow-rgb: 93, 47, 134; - --bs-btn-active-color: #fff; - --bs-btn-active-bg: #5d2f86; - --bs-btn-active-border-color: #5d2f86; - --bs-btn-active-shadow: inset 0 3px 5px rgba(29, 45, 53, 0.125); - --bs-btn-disabled-color: #5d2f86; - --bs-btn-disabled-bg: transparent; - --bs-btn-disabled-border-color: #5d2f86; - --bs-gradient: none; } - -.btn-outline-secondary { - --bs-btn-color: #6c757d; - --bs-btn-border-color: #6c757d; - --bs-btn-hover-color: #fff; - --bs-btn-hover-bg: #6c757d; - --bs-btn-hover-border-color: #6c757d; - --bs-btn-focus-shadow-rgb: 108, 117, 125; - --bs-btn-active-color: #fff; - --bs-btn-active-bg: #6c757d; - --bs-btn-active-border-color: #6c757d; - --bs-btn-active-shadow: inset 0 3px 5px rgba(29, 45, 53, 0.125); - --bs-btn-disabled-color: #6c757d; - --bs-btn-disabled-bg: transparent; - --bs-btn-disabled-border-color: #6c757d; - --bs-gradient: none; } - -.btn-outline-success { - --bs-btn-color: #198754; - --bs-btn-border-color: #198754; - --bs-btn-hover-color: #fff; - --bs-btn-hover-bg: #198754; - --bs-btn-hover-border-color: #198754; - --bs-btn-focus-shadow-rgb: 25, 135, 84; - --bs-btn-active-color: #fff; - --bs-btn-active-bg: #198754; - --bs-btn-active-border-color: #198754; - --bs-btn-active-shadow: inset 0 3px 5px rgba(29, 45, 53, 0.125); - --bs-btn-disabled-color: #198754; - --bs-btn-disabled-bg: transparent; - --bs-btn-disabled-border-color: #198754; - --bs-gradient: none; } - -.btn-outline-info { - --bs-btn-color: #0dcaf0; - --bs-btn-border-color: #0dcaf0; - --bs-btn-hover-color: #1d2d35; - --bs-btn-hover-bg: #0dcaf0; - --bs-btn-hover-border-color: #0dcaf0; - --bs-btn-focus-shadow-rgb: 13, 202, 240; - --bs-btn-active-color: #1d2d35; - --bs-btn-active-bg: #0dcaf0; - --bs-btn-active-border-color: #0dcaf0; - --bs-btn-active-shadow: inset 0 3px 5px rgba(29, 45, 53, 0.125); - --bs-btn-disabled-color: #0dcaf0; - --bs-btn-disabled-bg: transparent; - --bs-btn-disabled-border-color: #0dcaf0; - --bs-gradient: none; } - -.btn-outline-warning { - --bs-btn-color: #ffe000; - --bs-btn-border-color: #ffe000; - --bs-btn-hover-color: #1d2d35; - --bs-btn-hover-bg: #ffe000; - --bs-btn-hover-border-color: #ffe000; - --bs-btn-focus-shadow-rgb: 255, 224, 0; - --bs-btn-active-color: #1d2d35; - --bs-btn-active-bg: #ffe000; - --bs-btn-active-border-color: #ffe000; - --bs-btn-active-shadow: inset 0 3px 5px rgba(29, 45, 53, 0.125); - --bs-btn-disabled-color: #ffe000; - --bs-btn-disabled-bg: transparent; - --bs-btn-disabled-border-color: #ffe000; - --bs-gradient: none; } - -.btn-outline-danger { - --bs-btn-color: #dc3545; - --bs-btn-border-color: #dc3545; - --bs-btn-hover-color: #fff; - --bs-btn-hover-bg: #dc3545; - --bs-btn-hover-border-color: #dc3545; - --bs-btn-focus-shadow-rgb: 220, 53, 69; - --bs-btn-active-color: #fff; - --bs-btn-active-bg: #dc3545; - --bs-btn-active-border-color: #dc3545; - --bs-btn-active-shadow: inset 0 3px 5px rgba(29, 45, 53, 0.125); - --bs-btn-disabled-color: #dc3545; - --bs-btn-disabled-bg: transparent; - --bs-btn-disabled-border-color: #dc3545; - --bs-gradient: none; } - -.btn-outline-light { - --bs-btn-color: #f8f9fa; - --bs-btn-border-color: #f8f9fa; - --bs-btn-hover-color: #1d2d35; - --bs-btn-hover-bg: #f8f9fa; - --bs-btn-hover-border-color: #f8f9fa; - --bs-btn-focus-shadow-rgb: 248, 249, 250; - --bs-btn-active-color: #1d2d35; - --bs-btn-active-bg: #f8f9fa; - --bs-btn-active-border-color: #f8f9fa; - --bs-btn-active-shadow: inset 0 3px 5px rgba(29, 45, 53, 0.125); - --bs-btn-disabled-color: #f8f9fa; - --bs-btn-disabled-bg: transparent; - --bs-btn-disabled-border-color: #f8f9fa; - --bs-gradient: none; } - -.btn-outline-dark { - --bs-btn-color: #212529; - --bs-btn-border-color: #212529; - --bs-btn-hover-color: #fff; - --bs-btn-hover-bg: #212529; - --bs-btn-hover-border-color: #212529; - --bs-btn-focus-shadow-rgb: 33, 37, 41; - --bs-btn-active-color: #fff; - --bs-btn-active-bg: #212529; - --bs-btn-active-border-color: #212529; - --bs-btn-active-shadow: inset 0 3px 5px rgba(29, 45, 53, 0.125); - --bs-btn-disabled-color: #212529; - --bs-btn-disabled-bg: transparent; - --bs-btn-disabled-border-color: #212529; - --bs-gradient: none; } - -.btn-link { - --bs-btn-font-weight: 400; - --bs-btn-color: var(--bs-link-color); - --bs-btn-bg: transparent; - --bs-btn-border-color: transparent; - --bs-btn-hover-color: var(--bs-link-hover-color); - --bs-btn-hover-border-color: transparent; - --bs-btn-active-color: var(--bs-link-hover-color); - --bs-btn-active-border-color: transparent; - --bs-btn-disabled-color: #6c757d; - --bs-btn-disabled-border-color: transparent; - --bs-btn-box-shadow: none; - --bs-btn-focus-shadow-rgb: 117, 78, 152; - text-decoration: none; } - .btn-link:focus-visible { - color: var(--bs-btn-color); } - .btn-link:hover { - color: var(--bs-btn-hover-color); } - -.btn-lg, .btn-group-lg > .btn, .search-form .btn-group-lg > .search-submit, .comment-form .btn-group-lg > input[type="submit"] { - --bs-btn-padding-y: 0.5rem; - --bs-btn-padding-x: 1rem; - --bs-btn-font-size: 1.25rem; - --bs-btn-border-radius: 0.5rem; } - -.btn-sm, .btn-group-sm > .btn, .search-form .btn-group-sm > .search-submit, .comment-form .btn-group-sm > input[type="submit"] { - --bs-btn-padding-y: 0.25rem; - --bs-btn-padding-x: 0.5rem; - --bs-btn-font-size: 0.875rem; - --bs-btn-border-radius: 0.25rem; } - -.fade { - transition: opacity 0.15s linear; } - @media (prefers-reduced-motion: reduce) { - .fade { - transition: none; } } - .fade:not(.show) { - opacity: 0; } - -.collapse:not(.show) { - display: none; } - -.collapsing { - height: 0; - overflow: hidden; - transition: height 0.35s ease; } - @media (prefers-reduced-motion: reduce) { - .collapsing { - transition: none; } } - .collapsing.collapse-horizontal { - width: 0; - height: auto; - transition: width 0.35s ease; } - @media (prefers-reduced-motion: reduce) { - .collapsing.collapse-horizontal { - transition: none; } } -.dropup, -.dropend, -.dropdown, -.dropstart, -.dropup-center, -.dropdown-center { - position: relative; } - -.dropdown-toggle { - white-space: nowrap; } - .dropdown-toggle::after { - display: inline-block; - margin-left: 0.255em; - vertical-align: 0.255em; - content: ""; - border-top: 0.3em solid; - border-right: 0.3em solid transparent; - border-bottom: 0; - border-left: 0.3em solid transparent; } - .dropdown-toggle:empty::after { - margin-left: 0; } - -.dropdown-menu { - --bs-dropdown-zindex: 1000; - --bs-dropdown-min-width: 10rem; - --bs-dropdown-padding-x: 0; - --bs-dropdown-padding-y: 0.5rem; - --bs-dropdown-spacer: 0.125rem; - --bs-dropdown-font-size: 1rem; - --bs-dropdown-color: #1d2d35; - --bs-dropdown-bg: #fff; - --bs-dropdown-border-color: var(--bs-border-color-translucent); - --bs-dropdown-border-radius: 0.375rem; - --bs-dropdown-border-width: 1px; - --bs-dropdown-inner-border-radius: calc(0.375rem - 1px); - --bs-dropdown-divider-bg: var(--bs-border-color-translucent); - --bs-dropdown-divider-margin-y: 0.5rem; - --bs-dropdown-box-shadow: 0 0.5rem 1rem rgba(29, 45, 53, 0.15); - --bs-dropdown-link-color: #212529; - --bs-dropdown-link-hover-color: #1e2125; - --bs-dropdown-link-hover-bg: #e9ecef; - --bs-dropdown-link-active-color: #fff; - --bs-dropdown-link-active-bg: #5d2f86; - --bs-dropdown-link-disabled-color: #adb5bd; - --bs-dropdown-item-padding-x: 1rem; - --bs-dropdown-item-padding-y: 0.25rem; - --bs-dropdown-header-color: #6c757d; - --bs-dropdown-header-padding-x: 1rem; - --bs-dropdown-header-padding-y: 0.5rem; - position: absolute; - z-index: var(--bs-dropdown-zindex); - display: none; - min-width: var(--bs-dropdown-min-width); - padding: var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x); - margin: 0; - font-size: var(--bs-dropdown-font-size); - color: var(--bs-dropdown-color); - text-align: left; - list-style: none; - background-color: var(--bs-dropdown-bg); - background-clip: padding-box; - border: var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color); - border-radius: var(--bs-dropdown-border-radius); } - .dropdown-menu[data-bs-popper] { - top: 100%; - left: 0; - margin-top: var(--bs-dropdown-spacer); } - -.dropdown-menu-start { - --bs-position: start; } - .dropdown-menu-start[data-bs-popper] { - right: auto; - left: 0; } - -.dropdown-menu-end { - --bs-position: end; } - .dropdown-menu-end[data-bs-popper] { - right: 0; - left: auto; } - -@media (min-width: 576px) { - .dropdown-menu-sm-start { - --bs-position: start; } - .dropdown-menu-sm-start[data-bs-popper] { - right: auto; - left: 0; } - .dropdown-menu-sm-end { - --bs-position: end; } - .dropdown-menu-sm-end[data-bs-popper] { - right: 0; - left: auto; } } - -@media (min-width: 768px) { - .dropdown-menu-md-start { - --bs-position: start; } - .dropdown-menu-md-start[data-bs-popper] { - right: auto; - left: 0; } - .dropdown-menu-md-end { - --bs-position: end; } - .dropdown-menu-md-end[data-bs-popper] { - right: 0; - left: auto; } } - -@media (min-width: 992px) { - .dropdown-menu-lg-start { - --bs-position: start; } - .dropdown-menu-lg-start[data-bs-popper] { - right: auto; - left: 0; } - .dropdown-menu-lg-end { - --bs-position: end; } - .dropdown-menu-lg-end[data-bs-popper] { - right: 0; - left: auto; } } - -@media (min-width: 1200px) { - .dropdown-menu-xl-start { - --bs-position: start; } - .dropdown-menu-xl-start[data-bs-popper] { - right: auto; - left: 0; } - .dropdown-menu-xl-end { - --bs-position: end; } - .dropdown-menu-xl-end[data-bs-popper] { - right: 0; - left: auto; } } - -@media (min-width: 1400px) { - .dropdown-menu-xxl-start { - --bs-position: start; } - .dropdown-menu-xxl-start[data-bs-popper] { - right: auto; - left: 0; } - .dropdown-menu-xxl-end { - --bs-position: end; } - .dropdown-menu-xxl-end[data-bs-popper] { - right: 0; - left: auto; } } - -.dropup .dropdown-menu[data-bs-popper] { - top: auto; - bottom: 100%; - margin-top: 0; - margin-bottom: var(--bs-dropdown-spacer); } - -.dropup .dropdown-toggle::after { - display: inline-block; - margin-left: 0.255em; - vertical-align: 0.255em; - content: ""; - border-top: 0; - border-right: 0.3em solid transparent; - border-bottom: 0.3em solid; - border-left: 0.3em solid transparent; } - -.dropup .dropdown-toggle:empty::after { - margin-left: 0; } - -.dropend .dropdown-menu[data-bs-popper] { - top: 0; - right: auto; - left: 100%; - margin-top: 0; - margin-left: var(--bs-dropdown-spacer); } - -.dropend .dropdown-toggle::after { - display: inline-block; - margin-left: 0.255em; - vertical-align: 0.255em; - content: ""; - border-top: 0.3em solid transparent; - border-right: 0; - border-bottom: 0.3em solid transparent; - border-left: 0.3em solid; } - -.dropend .dropdown-toggle:empty::after { - margin-left: 0; } - -.dropend .dropdown-toggle::after { - vertical-align: 0; } - -.dropstart .dropdown-menu[data-bs-popper] { - top: 0; - right: 100%; - left: auto; - margin-top: 0; - margin-right: var(--bs-dropdown-spacer); } - -.dropstart .dropdown-toggle::after { - display: inline-block; - margin-left: 0.255em; - vertical-align: 0.255em; - content: ""; } - -.dropstart .dropdown-toggle::after { - display: none; } - -.dropstart .dropdown-toggle::before { - display: inline-block; - margin-right: 0.255em; - vertical-align: 0.255em; - content: ""; - border-top: 0.3em solid transparent; - border-right: 0.3em solid; - border-bottom: 0.3em solid transparent; } - -.dropstart .dropdown-toggle:empty::after { - margin-left: 0; } - -.dropstart .dropdown-toggle::before { - vertical-align: 0; } - -.dropdown-divider { - height: 0; - margin: var(--bs-dropdown-divider-margin-y) 0; - overflow: hidden; - border-top: 1px solid var(--bs-dropdown-divider-bg); - opacity: 1; } - -.dropdown-item { - display: block; - width: 100%; - padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x); - clear: both; - font-weight: 400; - color: var(--bs-dropdown-link-color); - text-align: inherit; - white-space: nowrap; - background-color: transparent; - border: 0; } - .dropdown-item:hover, .dropdown-item:focus { - color: var(--bs-dropdown-link-hover-color); - background-color: var(--bs-dropdown-link-hover-bg); } - .dropdown-item.active, .dropdown-item:active { - color: var(--bs-dropdown-link-active-color); - text-decoration: none; - background-color: var(--bs-dropdown-link-active-bg); } - .dropdown-item.disabled, .dropdown-item:disabled { - color: var(--bs-dropdown-link-disabled-color); - pointer-events: none; - background-color: transparent; } - -.dropdown-menu.show { - display: block; } - -.dropdown-header { - display: block; - padding: var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x); - margin-bottom: 0; - font-size: 0.875rem; - color: var(--bs-dropdown-header-color); - white-space: nowrap; } - -.dropdown-item-text { - display: block; - padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x); - color: var(--bs-dropdown-link-color); } - -.dropdown-menu-dark { - --bs-dropdown-color: #dee2e6; - --bs-dropdown-bg: #343a40; - --bs-dropdown-border-color: var(--bs-border-color-translucent); - --bs-dropdown-box-shadow: ; - --bs-dropdown-link-color: #dee2e6; - --bs-dropdown-link-hover-color: #fff; - --bs-dropdown-divider-bg: var(--bs-border-color-translucent); - --bs-dropdown-link-hover-bg: rgba(255, 255, 255, 0.15); - --bs-dropdown-link-active-color: #fff; - --bs-dropdown-link-active-bg: #5d2f86; - --bs-dropdown-link-disabled-color: #adb5bd; - --bs-dropdown-header-color: #adb5bd; } - -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-flex; - vertical-align: middle; } - .btn-group > .btn, .search-form .btn-group > .search-submit, .comment-form .btn-group > input[type="submit"], - .btn-group-vertical > .btn, - .search-form .btn-group-vertical > .search-submit, - .comment-form .btn-group-vertical > input[type="submit"] { - position: relative; - flex: 1 1 auto; } - .btn-group > .btn-check:checked + .btn, .search-form .btn-group > .btn-check:checked + .search-submit, .comment-form .btn-group > .btn-check:checked + input[type="submit"], - .btn-group > .btn-check:focus + .btn, - .search-form .btn-group > .btn-check:focus + .search-submit, - .comment-form .btn-group > .btn-check:focus + input[type="submit"], - .btn-group > .btn:hover, - .search-form .btn-group > .search-submit:hover, - .comment-form .btn-group > input[type="submit"]:hover, - .btn-group > .btn:focus, - .search-form .btn-group > .search-submit:focus, - .comment-form .btn-group > input[type="submit"]:focus, - .btn-group > .btn:active, - .search-form .btn-group > .search-submit:active, - .comment-form .btn-group > input[type="submit"]:active, - .btn-group > .btn.active, - .search-form .btn-group > .active.search-submit, - .comment-form .btn-group > input.active[type="submit"], - .btn-group-vertical > .btn-check:checked + .btn, - .search-form .btn-group-vertical > .btn-check:checked + .search-submit, - .comment-form .btn-group-vertical > .btn-check:checked + input[type="submit"], - .btn-group-vertical > .btn-check:focus + .btn, - .search-form .btn-group-vertical > .btn-check:focus + .search-submit, - .comment-form .btn-group-vertical > .btn-check:focus + input[type="submit"], - .btn-group-vertical > .btn:hover, - .search-form .btn-group-vertical > .search-submit:hover, - .comment-form .btn-group-vertical > input[type="submit"]:hover, - .btn-group-vertical > .btn:focus, - .search-form .btn-group-vertical > .search-submit:focus, - .comment-form .btn-group-vertical > input[type="submit"]:focus, - .btn-group-vertical > .btn:active, - .search-form .btn-group-vertical > .search-submit:active, - .comment-form .btn-group-vertical > input[type="submit"]:active, - .btn-group-vertical > .btn.active, - .search-form .btn-group-vertical > .active.search-submit, - .comment-form .btn-group-vertical > input.active[type="submit"] { - z-index: 1; } - -.btn-toolbar { - display: flex; - flex-wrap: wrap; - justify-content: flex-start; } - .btn-toolbar .input-group { - width: auto; } - -.btn-group { - border-radius: 0.375rem; } - .btn-group > :not(.btn-check:first-child) + .btn, .search-form .btn-group > :not(.btn-check:first-child) + .search-submit, .comment-form .btn-group > :not(.btn-check:first-child) + input[type="submit"], - .btn-group > .btn-group:not(:first-child) { - margin-left: -1px; } - .btn-group > .btn:not(:last-child):not(.dropdown-toggle), .search-form .btn-group > .search-submit:not(:last-child):not(.dropdown-toggle), .comment-form .btn-group > input[type="submit"]:not(:last-child):not(.dropdown-toggle), - .btn-group > .btn.dropdown-toggle-split:first-child, - .search-form .btn-group > .dropdown-toggle-split.search-submit:first-child, - .comment-form .btn-group > input.dropdown-toggle-split[type="submit"]:first-child, - .btn-group > .btn-group:not(:last-child) > .btn, - .search-form .btn-group > .btn-group:not(:last-child) > .search-submit, - .comment-form .btn-group > .btn-group:not(:last-child) > input[type="submit"] { - border-top-right-radius: 0; - border-bottom-right-radius: 0; } - .btn-group > .btn:nth-child(n + 3), .search-form .btn-group > .search-submit:nth-child(n + 3), .comment-form .btn-group > input[type="submit"]:nth-child(n + 3), - .btn-group > :not(.btn-check) + .btn, - .search-form .btn-group > :not(.btn-check) + .search-submit, - .comment-form .btn-group > :not(.btn-check) + input[type="submit"], - .btn-group > .btn-group:not(:first-child) > .btn, - .search-form .btn-group > .btn-group:not(:first-child) > .search-submit, - .comment-form .btn-group > .btn-group:not(:first-child) > input[type="submit"] { - border-top-left-radius: 0; - border-bottom-left-radius: 0; } - -.dropdown-toggle-split { - padding-right: 0.5625rem; - padding-left: 0.5625rem; } - .dropdown-toggle-split::after, .dropup .dropdown-toggle-split::after, .dropend .dropdown-toggle-split::after { - margin-left: 0; } - .dropstart .dropdown-toggle-split::before { - margin-right: 0; } - -.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split, .search-form .btn-group-sm > .search-submit + .dropdown-toggle-split, .comment-form .btn-group-sm > input[type="submit"] + .dropdown-toggle-split { - padding-right: 0.375rem; - padding-left: 0.375rem; } - -.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split, .search-form .btn-group-lg > .search-submit + .dropdown-toggle-split, .comment-form .btn-group-lg > input[type="submit"] + .dropdown-toggle-split { - padding-right: 0.75rem; - padding-left: 0.75rem; } - -.btn-group-vertical { - flex-direction: column; - align-items: flex-start; - justify-content: center; } - .btn-group-vertical > .btn, .search-form .btn-group-vertical > .search-submit, .comment-form .btn-group-vertical > input[type="submit"], - .btn-group-vertical > .btn-group { - width: 100%; } - .btn-group-vertical > .btn:not(:first-child), .search-form .btn-group-vertical > .search-submit:not(:first-child), .comment-form .btn-group-vertical > input[type="submit"]:not(:first-child), - .btn-group-vertical > .btn-group:not(:first-child) { - margin-top: -1px; } - .btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle), .search-form .btn-group-vertical > .search-submit:not(:last-child):not(.dropdown-toggle), .comment-form .btn-group-vertical > input[type="submit"]:not(:last-child):not(.dropdown-toggle), - .btn-group-vertical > .btn-group:not(:last-child) > .btn, - .search-form .btn-group-vertical > .btn-group:not(:last-child) > .search-submit, - .comment-form .btn-group-vertical > .btn-group:not(:last-child) > input[type="submit"] { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; } - .btn-group-vertical > .btn ~ .btn, .search-form .btn-group-vertical > .search-submit ~ .btn, .search-form .btn-group-vertical > .btn ~ .search-submit, .search-form .btn-group-vertical > .search-submit ~ .search-submit, .comment-form .btn-group-vertical > input[type="submit"] ~ .btn, .comment-form .search-form .btn-group-vertical > input[type="submit"] ~ .search-submit, .search-form .comment-form .btn-group-vertical > input[type="submit"] ~ .search-submit, .comment-form .btn-group-vertical > .btn ~ input[type="submit"], .comment-form .search-form .btn-group-vertical > .search-submit ~ input[type="submit"], .search-form .comment-form .btn-group-vertical > .search-submit ~ input[type="submit"], .comment-form .btn-group-vertical > input[type="submit"] ~ input[type="submit"], - .btn-group-vertical > .btn-group:not(:first-child) > .btn, - .search-form .btn-group-vertical > .btn-group:not(:first-child) > .search-submit, - .comment-form .btn-group-vertical > .btn-group:not(:first-child) > input[type="submit"] { - border-top-left-radius: 0; - border-top-right-radius: 0; } - -.nav { - --bs-nav-link-padding-x: 1rem; - --bs-nav-link-padding-y: 0.5rem; - --bs-nav-link-font-weight: ; - --bs-nav-link-color: var(--bs-link-color); - --bs-nav-link-hover-color: var(--bs-link-hover-color); - --bs-nav-link-disabled-color: #6c757d; - display: flex; - flex-wrap: wrap; - padding-left: 0; - margin-bottom: 0; - list-style: none; } - -.nav-link, .banner .nav a { - display: block; - padding: var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x); - font-size: var(--bs-nav-link-font-size); - font-weight: var(--bs-nav-link-font-weight); - color: var(--bs-nav-link-color); - transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out; } - @media (prefers-reduced-motion: reduce) { - .nav-link, .banner .nav a { - transition: none; } } - .nav-link:hover, .banner .nav a:hover, .nav-link:focus, .banner .nav a:focus { - color: var(--bs-nav-link-hover-color); } - .nav-link.disabled, .banner .nav a.disabled { - color: var(--bs-nav-link-disabled-color); - pointer-events: none; - cursor: default; } - -.nav-tabs { - --bs-nav-tabs-border-width: 1px; - --bs-nav-tabs-border-color: #dee2e6; - --bs-nav-tabs-border-radius: 0.375rem; - --bs-nav-tabs-link-hover-border-color: #e9ecef #e9ecef #dee2e6; - --bs-nav-tabs-link-active-color: #495057; - --bs-nav-tabs-link-active-bg: #fff; - --bs-nav-tabs-link-active-border-color: #dee2e6 #dee2e6 #fff; - border-bottom: var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color); } - .nav-tabs .nav-link, .nav-tabs .banner .nav a, .banner .nav .nav-tabs a { - margin-bottom: calc(-1 * var(--bs-nav-tabs-border-width)); - background: none; - border: var(--bs-nav-tabs-border-width) solid transparent; - border-top-left-radius: var(--bs-nav-tabs-border-radius); - border-top-right-radius: var(--bs-nav-tabs-border-radius); } - .nav-tabs .nav-link:hover, .nav-tabs .banner .nav a:hover, .banner .nav .nav-tabs a:hover, .nav-tabs .nav-link:focus, .nav-tabs .banner .nav a:focus, .banner .nav .nav-tabs a:focus { - isolation: isolate; - border-color: var(--bs-nav-tabs-link-hover-border-color); } - .nav-tabs .nav-link.disabled, .nav-tabs .banner .nav a.disabled, .banner .nav .nav-tabs a.disabled, .nav-tabs .nav-link:disabled, .nav-tabs .banner .nav a:disabled, .banner .nav .nav-tabs a:disabled { - color: var(--bs-nav-link-disabled-color); - background-color: transparent; - border-color: transparent; } - .nav-tabs .nav-link.active, .nav-tabs .banner .nav a.active, .banner .nav .nav-tabs a.active, - .nav-tabs .nav-item.show .nav-link, - .nav-tabs .nav-item.show .banner .nav a, - .banner .nav .nav-tabs .nav-item.show a, - .nav-tabs .banner .nav li.show .nav-link, - .nav-tabs .banner .nav li.show a, - .banner .nav .nav-tabs li.show .nav-link, - .banner .nav .nav-tabs li.show a { - color: var(--bs-nav-tabs-link-active-color); - background-color: var(--bs-nav-tabs-link-active-bg); - border-color: var(--bs-nav-tabs-link-active-border-color); } - .nav-tabs .dropdown-menu { - margin-top: calc(-1 * var(--bs-nav-tabs-border-width)); - border-top-left-radius: 0; - border-top-right-radius: 0; } - -.nav-pills { - --bs-nav-pills-border-radius: 0.375rem; - --bs-nav-pills-link-active-color: #fff; - --bs-nav-pills-link-active-bg: #5d2f86; } - .nav-pills .nav-link, .nav-pills .banner .nav a, .banner .nav .nav-pills a { - background: none; - border: 0; - border-radius: var(--bs-nav-pills-border-radius); } - .nav-pills .nav-link:disabled, .nav-pills .banner .nav a:disabled, .banner .nav .nav-pills a:disabled { - color: var(--bs-nav-link-disabled-color); - background-color: transparent; - border-color: transparent; } - .nav-pills .nav-link.active, .nav-pills .banner .nav a.active, .banner .nav .nav-pills a.active, - .nav-pills .show > .nav-link, - .nav-pills .banner .nav .show > a, - .banner .nav .nav-pills .show > a { - color: var(--bs-nav-pills-link-active-color); - background-color: var(--bs-nav-pills-link-active-bg); } - -.nav-fill > .nav-link, .banner .nav .nav-fill > a, -.nav-fill .nav-item, -.nav-fill .banner .nav li, -.banner .nav .nav-fill li { - flex: 1 1 auto; - text-align: center; } - -.nav-justified > .nav-link, .banner .nav .nav-justified > a, -.nav-justified .nav-item, -.nav-justified .banner .nav li, -.banner .nav .nav-justified li { - flex-basis: 0; - flex-grow: 1; - text-align: center; } - -.nav-fill .nav-item .nav-link, .nav-fill .nav-item .banner .nav a, .banner .nav .nav-fill .nav-item a, .nav-fill .banner .nav li .nav-link, .nav-fill .banner .nav li a, .banner .nav .nav-fill li .nav-link, .banner .nav .nav-fill li a, -.nav-justified .nav-item .nav-link, -.nav-justified .nav-item .banner .nav a, -.banner .nav .nav-justified .nav-item a, -.nav-justified .banner .nav li .nav-link, -.nav-justified .banner .nav li a, -.banner .nav .nav-justified li .nav-link, -.banner .nav .nav-justified li a { - width: 100%; } - -.tab-content > .tab-pane { - display: none; } - -.tab-content > .active { - display: block; } - -.navbar { - --bs-navbar-padding-x: 0; - --bs-navbar-padding-y: 0.5rem; - --bs-navbar-color: #1d2d35; - --bs-navbar-hover-color: #5d2f86; - --bs-navbar-disabled-color: rgba(29, 45, 53, 0.3); - --bs-navbar-active-color: #5d2f86; - --bs-navbar-brand-padding-y: 0.3125rem; - --bs-navbar-brand-margin-end: 1rem; - --bs-navbar-brand-font-size: 1.25rem; - --bs-navbar-brand-color: #5d2f86; - --bs-navbar-brand-hover-color: #5d2f86; - --bs-navbar-nav-link-padding-x: 0.5rem; - --bs-navbar-toggler-padding-y: 0.25rem; - --bs-navbar-toggler-padding-x: 0.75rem; - --bs-navbar-toggler-font-size: 1.25rem; - --bs-navbar-toggler-icon-bg: none; - --bs-navbar-toggler-border-color: rgba(29, 45, 53, 0.1); - --bs-navbar-toggler-border-radius: 0.375rem; - --bs-navbar-toggler-focus-width: 0.25rem; - --bs-navbar-toggler-transition: box-shadow 0.15s ease-in-out; - position: relative; - display: flex; - flex-wrap: wrap; - align-items: center; - justify-content: space-between; - padding: var(--bs-navbar-padding-y) var(--bs-navbar-padding-x); } - .navbar > .container, - .navbar > .container-fluid, - .navbar > .container-sm, - .navbar > .container-md, - .navbar > .container-lg, - .navbar > .container-xl, - .navbar > .container-xxl { - display: flex; - flex-wrap: inherit; - align-items: center; - justify-content: space-between; } - -.navbar-brand { - padding-top: var(--bs-navbar-brand-padding-y); - padding-bottom: var(--bs-navbar-brand-padding-y); - margin-right: var(--bs-navbar-brand-margin-end); - font-size: var(--bs-navbar-brand-font-size); - color: var(--bs-navbar-brand-color); - white-space: nowrap; } - .navbar-brand:hover, .navbar-brand:focus { - color: var(--bs-navbar-brand-hover-color); } - -.navbar-nav { - --bs-nav-link-padding-x: 0; - --bs-nav-link-padding-y: 0.5rem; - --bs-nav-link-font-weight: ; - --bs-nav-link-color: var(--bs-navbar-color); - --bs-nav-link-hover-color: var(--bs-navbar-hover-color); - --bs-nav-link-disabled-color: var(--bs-navbar-disabled-color); - display: flex; - flex-direction: column; - padding-left: 0; - margin-bottom: 0; - list-style: none; } - .navbar-nav .show > .nav-link, .navbar-nav .banner .nav .show > a, .banner .nav .navbar-nav .show > a, - .navbar-nav .nav-link.active, - .navbar-nav .banner .nav a.active, - .banner .nav .navbar-nav a.active { - color: var(--bs-navbar-active-color); } - .navbar-nav .dropdown-menu { - position: static; } - -.navbar-text { - padding-top: 0.5rem; - padding-bottom: 0.5rem; - color: var(--bs-navbar-color); } - .navbar-text a, - .navbar-text a:hover, - .navbar-text a:focus { - color: var(--bs-navbar-active-color); } - -.navbar-collapse { - flex-basis: 100%; - flex-grow: 1; - align-items: center; } - -.navbar-toggler { - padding: var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x); - font-size: var(--bs-navbar-toggler-font-size); - line-height: 1; - color: var(--bs-navbar-color); - background-color: transparent; - border: var(--bs-border-width) solid var(--bs-navbar-toggler-border-color); - border-radius: var(--bs-navbar-toggler-border-radius); - transition: var(--bs-navbar-toggler-transition); } - @media (prefers-reduced-motion: reduce) { - .navbar-toggler { - transition: none; } } - .navbar-toggler:hover { - text-decoration: none; } - .navbar-toggler:focus { - text-decoration: none; - outline: 0; - box-shadow: 0 0 0 var(--bs-navbar-toggler-focus-width); } - -.navbar-toggler-icon { - display: inline-block; - width: 1.5em; - height: 1.5em; - vertical-align: middle; - background-image: var(--bs-navbar-toggler-icon-bg); - background-repeat: no-repeat; - background-position: center; - background-size: 100%; } - -.navbar-nav-scroll { - max-height: var(--bs-scroll-height, 75vh); - overflow-y: auto; } - -@media (min-width: 576px) { - .navbar-expand-sm { - flex-wrap: nowrap; - justify-content: flex-start; } - .navbar-expand-sm .navbar-nav { - flex-direction: row; } - .navbar-expand-sm .navbar-nav .dropdown-menu { - position: absolute; } - .navbar-expand-sm .navbar-nav .nav-link, .navbar-expand-sm .navbar-nav .banner .nav a, .banner .nav .navbar-expand-sm .navbar-nav a { - padding-right: var(--bs-navbar-nav-link-padding-x); - padding-left: var(--bs-navbar-nav-link-padding-x); } - .navbar-expand-sm .navbar-nav-scroll { - overflow: visible; } - .navbar-expand-sm .navbar-collapse { - display: flex !important; - flex-basis: auto; } - .navbar-expand-sm .navbar-toggler { - display: none; } - .navbar-expand-sm .offcanvas { - position: static; - z-index: auto; - flex-grow: 1; - width: auto !important; - height: auto !important; - visibility: visible !important; - background-color: transparent !important; - border: 0 !important; - transform: none !important; - transition: none; } - .navbar-expand-sm .offcanvas .offcanvas-header { - display: none; } - .navbar-expand-sm .offcanvas .offcanvas-body { - display: flex; - flex-grow: 0; - padding: 0; - overflow-y: visible; } } - -@media (min-width: 768px) { - .navbar-expand-md { - flex-wrap: nowrap; - justify-content: flex-start; } - .navbar-expand-md .navbar-nav { - flex-direction: row; } - .navbar-expand-md .navbar-nav .dropdown-menu { - position: absolute; } - .navbar-expand-md .navbar-nav .nav-link, .navbar-expand-md .navbar-nav .banner .nav a, .banner .nav .navbar-expand-md .navbar-nav a { - padding-right: var(--bs-navbar-nav-link-padding-x); - padding-left: var(--bs-navbar-nav-link-padding-x); } - .navbar-expand-md .navbar-nav-scroll { - overflow: visible; } - .navbar-expand-md .navbar-collapse { - display: flex !important; - flex-basis: auto; } - .navbar-expand-md .navbar-toggler { - display: none; } - .navbar-expand-md .offcanvas { - position: static; - z-index: auto; - flex-grow: 1; - width: auto !important; - height: auto !important; - visibility: visible !important; - background-color: transparent !important; - border: 0 !important; - transform: none !important; - transition: none; } - .navbar-expand-md .offcanvas .offcanvas-header { - display: none; } - .navbar-expand-md .offcanvas .offcanvas-body { - display: flex; - flex-grow: 0; - padding: 0; - overflow-y: visible; } } - -@media (min-width: 992px) { - .navbar-expand-lg { - flex-wrap: nowrap; - justify-content: flex-start; } - .navbar-expand-lg .navbar-nav { - flex-direction: row; } - .navbar-expand-lg .navbar-nav .dropdown-menu { - position: absolute; } - .navbar-expand-lg .navbar-nav .nav-link, .navbar-expand-lg .navbar-nav .banner .nav a, .banner .nav .navbar-expand-lg .navbar-nav a { - padding-right: var(--bs-navbar-nav-link-padding-x); - padding-left: var(--bs-navbar-nav-link-padding-x); } - .navbar-expand-lg .navbar-nav-scroll { - overflow: visible; } - .navbar-expand-lg .navbar-collapse { - display: flex !important; - flex-basis: auto; } - .navbar-expand-lg .navbar-toggler { - display: none; } - .navbar-expand-lg .offcanvas { - position: static; - z-index: auto; - flex-grow: 1; - width: auto !important; - height: auto !important; - visibility: visible !important; - background-color: transparent !important; - border: 0 !important; - transform: none !important; - transition: none; } - .navbar-expand-lg .offcanvas .offcanvas-header { - display: none; } - .navbar-expand-lg .offcanvas .offcanvas-body { - display: flex; - flex-grow: 0; - padding: 0; - overflow-y: visible; } } - -@media (min-width: 1200px) { - .navbar-expand-xl { - flex-wrap: nowrap; - justify-content: flex-start; } - .navbar-expand-xl .navbar-nav { - flex-direction: row; } - .navbar-expand-xl .navbar-nav .dropdown-menu { - position: absolute; } - .navbar-expand-xl .navbar-nav .nav-link, .navbar-expand-xl .navbar-nav .banner .nav a, .banner .nav .navbar-expand-xl .navbar-nav a { - padding-right: var(--bs-navbar-nav-link-padding-x); - padding-left: var(--bs-navbar-nav-link-padding-x); } - .navbar-expand-xl .navbar-nav-scroll { - overflow: visible; } - .navbar-expand-xl .navbar-collapse { - display: flex !important; - flex-basis: auto; } - .navbar-expand-xl .navbar-toggler { - display: none; } - .navbar-expand-xl .offcanvas { - position: static; - z-index: auto; - flex-grow: 1; - width: auto !important; - height: auto !important; - visibility: visible !important; - background-color: transparent !important; - border: 0 !important; - transform: none !important; - transition: none; } - .navbar-expand-xl .offcanvas .offcanvas-header { - display: none; } - .navbar-expand-xl .offcanvas .offcanvas-body { - display: flex; - flex-grow: 0; - padding: 0; - overflow-y: visible; } } - -@media (min-width: 1400px) { - .navbar-expand-xxl { - flex-wrap: nowrap; - justify-content: flex-start; } - .navbar-expand-xxl .navbar-nav { - flex-direction: row; } - .navbar-expand-xxl .navbar-nav .dropdown-menu { - position: absolute; } - .navbar-expand-xxl .navbar-nav .nav-link, .navbar-expand-xxl .navbar-nav .banner .nav a, .banner .nav .navbar-expand-xxl .navbar-nav a { - padding-right: var(--bs-navbar-nav-link-padding-x); - padding-left: var(--bs-navbar-nav-link-padding-x); } - .navbar-expand-xxl .navbar-nav-scroll { - overflow: visible; } - .navbar-expand-xxl .navbar-collapse { - display: flex !important; - flex-basis: auto; } - .navbar-expand-xxl .navbar-toggler { - display: none; } - .navbar-expand-xxl .offcanvas { - position: static; - z-index: auto; - flex-grow: 1; - width: auto !important; - height: auto !important; - visibility: visible !important; - background-color: transparent !important; - border: 0 !important; - transform: none !important; - transition: none; } - .navbar-expand-xxl .offcanvas .offcanvas-header { - display: none; } - .navbar-expand-xxl .offcanvas .offcanvas-body { - display: flex; - flex-grow: 0; - padding: 0; - overflow-y: visible; } } - -.navbar-expand { - flex-wrap: nowrap; - justify-content: flex-start; } - .navbar-expand .navbar-nav { - flex-direction: row; } - .navbar-expand .navbar-nav .dropdown-menu { - position: absolute; } - .navbar-expand .navbar-nav .nav-link, .navbar-expand .navbar-nav .banner .nav a, .banner .nav .navbar-expand .navbar-nav a { - padding-right: var(--bs-navbar-nav-link-padding-x); - padding-left: var(--bs-navbar-nav-link-padding-x); } - .navbar-expand .navbar-nav-scroll { - overflow: visible; } - .navbar-expand .navbar-collapse { - display: flex !important; - flex-basis: auto; } - .navbar-expand .navbar-toggler { - display: none; } - .navbar-expand .offcanvas { - position: static; - z-index: auto; - flex-grow: 1; - width: auto !important; - height: auto !important; - visibility: visible !important; - background-color: transparent !important; - border: 0 !important; - transform: none !important; - transition: none; } - .navbar-expand .offcanvas .offcanvas-header { - display: none; } - .navbar-expand .offcanvas .offcanvas-body { - display: flex; - flex-grow: 0; - padding: 0; - overflow-y: visible; } - -.navbar-dark { - --bs-navbar-color: rgba(255, 255, 255, 0.55); - --bs-navbar-hover-color: rgba(255, 255, 255, 0.75); - --bs-navbar-disabled-color: rgba(255, 255, 255, 0.25); - --bs-navbar-active-color: #fff; - --bs-navbar-brand-color: #fff; - --bs-navbar-brand-hover-color: #fff; - --bs-navbar-toggler-border-color: rgba(255, 255, 255, 0.1); - --bs-navbar-toggler-icon-bg: none; } - -.card { - --bs-card-spacer-y: 1rem; - --bs-card-spacer-x: 1rem; - --bs-card-title-spacer-y: 0.5rem; - --bs-card-border-width: 1px; - --bs-card-border-color: #e9ecef; - --bs-card-border-radius: 0.375rem; - --bs-card-box-shadow: ; - --bs-card-inner-border-radius: calc(0.375rem - 1px); - --bs-card-cap-padding-y: 0.5rem; - --bs-card-cap-padding-x: 1rem; - --bs-card-cap-bg: rgba(29, 45, 53, 0.03); - --bs-card-cap-color: ; - --bs-card-height: ; - --bs-card-color: ; - --bs-card-bg: #fff; - --bs-card-img-overlay-padding: 1rem; - --bs-card-group-margin: 24px; - position: relative; - display: flex; - flex-direction: column; - min-width: 0; - height: var(--bs-card-height); - word-wrap: break-word; - background-color: var(--bs-card-bg); - background-clip: border-box; - border: var(--bs-card-border-width) solid var(--bs-card-border-color); - border-radius: var(--bs-card-border-radius); } - .card > hr { - margin-right: 0; - margin-left: 0; } - .card > .list-group { - border-top: inherit; - border-bottom: inherit; } - .card > .list-group:first-child { - border-top-width: 0; - border-top-left-radius: var(--bs-card-inner-border-radius); - border-top-right-radius: var(--bs-card-inner-border-radius); } - .card > .list-group:last-child { - border-bottom-width: 0; - border-bottom-right-radius: var(--bs-card-inner-border-radius); - border-bottom-left-radius: var(--bs-card-inner-border-radius); } - .card > .card-header + .list-group, - .card > .list-group + .card-footer { - border-top: 0; } - -.card-body { - flex: 1 1 auto; - padding: var(--bs-card-spacer-y) var(--bs-card-spacer-x); - color: var(--bs-card-color); } - -.card-title { - margin-bottom: var(--bs-card-title-spacer-y); } - -.card-subtitle { - margin-top: calc(-.5 * var(--bs-card-title-spacer-y)); - margin-bottom: 0; } - -.card-text:last-child { - margin-bottom: 0; } - -.card-link + .card-link { - margin-left: var(--bs-card-spacer-x); } - -.card-header { - padding: var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x); - margin-bottom: 0; - color: var(--bs-card-cap-color); - background-color: var(--bs-card-cap-bg); - border-bottom: var(--bs-card-border-width) solid var(--bs-card-border-color); } - .card-header:first-child { - border-radius: var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0; } - -.card-footer { - padding: var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x); - color: var(--bs-card-cap-color); - background-color: var(--bs-card-cap-bg); - border-top: var(--bs-card-border-width) solid var(--bs-card-border-color); } - .card-footer:last-child { - border-radius: 0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius); } - -.card-header-tabs { - margin-right: calc(-.5 * var(--bs-card-cap-padding-x)); - margin-bottom: calc(-1 * var(--bs-card-cap-padding-y)); - margin-left: calc(-.5 * var(--bs-card-cap-padding-x)); - border-bottom: 0; } - .card-header-tabs .nav-link.active, .card-header-tabs .banner .nav a.active, .banner .nav .card-header-tabs a.active { - background-color: var(--bs-card-bg); - border-bottom-color: var(--bs-card-bg); } - -.card-header-pills { - margin-right: calc(-.5 * var(--bs-card-cap-padding-x)); - margin-left: calc(-.5 * var(--bs-card-cap-padding-x)); } - -.card-img-overlay { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - padding: var(--bs-card-img-overlay-padding); - border-radius: var(--bs-card-inner-border-radius); } - -.card-img, -.card-img-top, -.card-img-bottom { - width: 100%; } - -.card-img, -.card-img-top { - border-top-left-radius: var(--bs-card-inner-border-radius); - border-top-right-radius: var(--bs-card-inner-border-radius); } - -.card-img, -.card-img-bottom { - border-bottom-right-radius: var(--bs-card-inner-border-radius); - border-bottom-left-radius: var(--bs-card-inner-border-radius); } - -.card-group > .card { - margin-bottom: var(--bs-card-group-margin); } - -@media (min-width: 576px) { - .card-group { - display: flex; - flex-flow: row wrap; } - .card-group > .card { - flex: 1 0 0%; - margin-bottom: 0; } - .card-group > .card + .card { - margin-left: 0; - border-left: 0; } - .card-group > .card:not(:last-child) { - border-top-right-radius: 0; - border-bottom-right-radius: 0; } - .card-group > .card:not(:last-child) .card-img-top, - .card-group > .card:not(:last-child) .card-header { - border-top-right-radius: 0; } - .card-group > .card:not(:last-child) .card-img-bottom, - .card-group > .card:not(:last-child) .card-footer { - border-bottom-right-radius: 0; } - .card-group > .card:not(:first-child) { - border-top-left-radius: 0; - border-bottom-left-radius: 0; } - .card-group > .card:not(:first-child) .card-img-top, - .card-group > .card:not(:first-child) .card-header { - border-top-left-radius: 0; } - .card-group > .card:not(:first-child) .card-img-bottom, - .card-group > .card:not(:first-child) .card-footer { - border-bottom-left-radius: 0; } } - -.accordion { - --bs-accordion-color: #1d2d35; - --bs-accordion-bg: #fff; - --bs-accordion-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease; - --bs-accordion-border-color: var(--bs-border-color); - --bs-accordion-border-width: 1px; - --bs-accordion-border-radius: 0.375rem; - --bs-accordion-inner-border-radius: calc(0.375rem - 1px); - --bs-accordion-btn-padding-x: 1.25rem; - --bs-accordion-btn-padding-y: 1rem; - --bs-accordion-btn-color: #1d2d35; - --bs-accordion-btn-bg: var(--bs-accordion-bg); - --bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%231d2d35'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); - --bs-accordion-btn-icon-width: 1.25rem; - --bs-accordion-btn-icon-transform: rotate(-180deg); - --bs-accordion-btn-icon-transition: transform 0.2s ease-in-out; - --bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23542a79'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); - --bs-accordion-btn-focus-border-color: #ae97c3; - --bs-accordion-btn-focus-box-shadow: 0 0 0 0.25rem rgba(93, 47, 134, 0.25); - --bs-accordion-body-padding-x: 1.25rem; - --bs-accordion-body-padding-y: 1rem; - --bs-accordion-active-color: #542a79; - --bs-accordion-active-bg: #efeaf3; } - -.accordion-button { - position: relative; - display: flex; - align-items: center; - width: 100%; - padding: var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x); - font-size: 1rem; - color: var(--bs-accordion-btn-color); - text-align: left; - background-color: var(--bs-accordion-btn-bg); - border: 0; - border-radius: 0; - overflow-anchor: none; - transition: var(--bs-accordion-transition); } - @media (prefers-reduced-motion: reduce) { - .accordion-button { - transition: none; } } - .accordion-button:not(.collapsed) { - color: var(--bs-accordion-active-color); - background-color: var(--bs-accordion-active-bg); - box-shadow: inset 0 calc(-1 * var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color); } - .accordion-button:not(.collapsed)::after { - background-image: var(--bs-accordion-btn-active-icon); - transform: var(--bs-accordion-btn-icon-transform); } - .accordion-button::after { - flex-shrink: 0; - width: var(--bs-accordion-btn-icon-width); - height: var(--bs-accordion-btn-icon-width); - margin-left: auto; - content: ""; - background-image: var(--bs-accordion-btn-icon); - background-repeat: no-repeat; - background-size: var(--bs-accordion-btn-icon-width); - transition: var(--bs-accordion-btn-icon-transition); } - @media (prefers-reduced-motion: reduce) { - .accordion-button::after { - transition: none; } } - .accordion-button:hover { - z-index: 2; } - .accordion-button:focus { - z-index: 3; - border-color: var(--bs-accordion-btn-focus-border-color); - outline: 0; - box-shadow: var(--bs-accordion-btn-focus-box-shadow); } - -.accordion-header { - margin-bottom: 0; } - -.accordion-item { - color: var(--bs-accordion-color); - background-color: var(--bs-accordion-bg); - border: var(--bs-accordion-border-width) solid var(--bs-accordion-border-color); } - .accordion-item:first-of-type { - border-top-left-radius: var(--bs-accordion-border-radius); - border-top-right-radius: var(--bs-accordion-border-radius); } - .accordion-item:first-of-type .accordion-button { - border-top-left-radius: var(--bs-accordion-inner-border-radius); - border-top-right-radius: var(--bs-accordion-inner-border-radius); } - .accordion-item:not(:first-of-type) { - border-top: 0; } - .accordion-item:last-of-type { - border-bottom-right-radius: var(--bs-accordion-border-radius); - border-bottom-left-radius: var(--bs-accordion-border-radius); } - .accordion-item:last-of-type .accordion-button.collapsed { - border-bottom-right-radius: var(--bs-accordion-inner-border-radius); - border-bottom-left-radius: var(--bs-accordion-inner-border-radius); } - .accordion-item:last-of-type .accordion-collapse { - border-bottom-right-radius: var(--bs-accordion-border-radius); - border-bottom-left-radius: var(--bs-accordion-border-radius); } - -.accordion-body { - padding: var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x); } - -.accordion-flush .accordion-collapse { - border-width: 0; } - -.accordion-flush .accordion-item { - border-right: 0; - border-left: 0; - border-radius: 0; } - .accordion-flush .accordion-item:first-child { - border-top: 0; } - .accordion-flush .accordion-item:last-child { - border-bottom: 0; } - .accordion-flush .accordion-item .accordion-button, .accordion-flush .accordion-item .accordion-button.collapsed { - border-radius: 0; } - -.breadcrumb { - --bs-breadcrumb-padding-x: 0; - --bs-breadcrumb-padding-y: 0; - --bs-breadcrumb-margin-bottom: 1rem; - --bs-breadcrumb-bg: ; - --bs-breadcrumb-border-radius: ; - --bs-breadcrumb-divider-color: #6c757d; - --bs-breadcrumb-item-padding-x: 0.5rem; - --bs-breadcrumb-item-active-color: #6c757d; - display: flex; - flex-wrap: wrap; - padding: var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x); - margin-bottom: var(--bs-breadcrumb-margin-bottom); - font-size: var(--bs-breadcrumb-font-size); - list-style: none; - background-color: var(--bs-breadcrumb-bg); - border-radius: var(--bs-breadcrumb-border-radius); } - -.breadcrumb-item + .breadcrumb-item { - padding-left: var(--bs-breadcrumb-item-padding-x); } - .breadcrumb-item + .breadcrumb-item::before { - float: left; - padding-right: var(--bs-breadcrumb-item-padding-x); - color: var(--bs-breadcrumb-divider-color); - content: var(--bs-breadcrumb-divider, "/") /* rtl: var(--bs-breadcrumb-divider, "/") */; } - -.breadcrumb-item.active { - color: var(--bs-breadcrumb-item-active-color); } - -.pagination { - --bs-pagination-padding-x: 0.75rem; - --bs-pagination-padding-y: 0.375rem; - --bs-pagination-font-size: 1rem; - --bs-pagination-color: var(--bs-link-color); - --bs-pagination-bg: #fff; - --bs-pagination-border-width: 1px; - --bs-pagination-border-color: #dee2e6; - --bs-pagination-border-radius: 0.375rem; - --bs-pagination-hover-color: var(--bs-link-hover-color); - --bs-pagination-hover-bg: #e9ecef; - --bs-pagination-hover-border-color: #dee2e6; - --bs-pagination-focus-color: var(--bs-link-hover-color); - --bs-pagination-focus-bg: #e9ecef; - --bs-pagination-focus-box-shadow: 0 0 0 0.25rem rgba(93, 47, 134, 0.25); - --bs-pagination-active-color: #fff; - --bs-pagination-active-bg: #5d2f86; - --bs-pagination-active-border-color: #5d2f86; - --bs-pagination-disabled-color: #6c757d; - --bs-pagination-disabled-bg: #fff; - --bs-pagination-disabled-border-color: #dee2e6; - display: flex; - padding-left: 0; - list-style: none; } - -.page-link { - position: relative; - display: block; - padding: var(--bs-pagination-padding-y) var(--bs-pagination-padding-x); - font-size: var(--bs-pagination-font-size); - color: var(--bs-pagination-color); - background-color: var(--bs-pagination-bg); - border: var(--bs-pagination-border-width) solid var(--bs-pagination-border-color); - transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; } - @media (prefers-reduced-motion: reduce) { - .page-link { - transition: none; } } - .page-link:hover { - z-index: 2; - color: var(--bs-pagination-hover-color); - background-color: var(--bs-pagination-hover-bg); - border-color: var(--bs-pagination-hover-border-color); } - .page-link:focus { - z-index: 3; - color: var(--bs-pagination-focus-color); - background-color: var(--bs-pagination-focus-bg); - outline: 0; - box-shadow: var(--bs-pagination-focus-box-shadow); } - .page-link.active, .active > .page-link { - z-index: 3; - color: var(--bs-pagination-active-color); - background-color: var(--bs-pagination-active-bg); - border-color: var(--bs-pagination-active-border-color); } - .page-link.disabled, .disabled > .page-link { - color: var(--bs-pagination-disabled-color); - pointer-events: none; - background-color: var(--bs-pagination-disabled-bg); - border-color: var(--bs-pagination-disabled-border-color); } - -.page-item:not(:first-child) .page-link { - margin-left: -1px; } - -.page-item:first-child .page-link { - border-top-left-radius: var(--bs-pagination-border-radius); - border-bottom-left-radius: var(--bs-pagination-border-radius); } - -.page-item:last-child .page-link { - border-top-right-radius: var(--bs-pagination-border-radius); - border-bottom-right-radius: var(--bs-pagination-border-radius); } - -.pagination-lg { - --bs-pagination-padding-x: 1.5rem; - --bs-pagination-padding-y: 0.75rem; - --bs-pagination-font-size: 1.25rem; - --bs-pagination-border-radius: 0.5rem; } - -.pagination-sm { - --bs-pagination-padding-x: 0.5rem; - --bs-pagination-padding-y: 0.25rem; - --bs-pagination-font-size: 0.875rem; - --bs-pagination-border-radius: 0.25rem; } - -.badge { - --bs-badge-padding-x: 0.65em; - --bs-badge-padding-y: 0.35em; - --bs-badge-font-size: 0.75em; - --bs-badge-font-weight: 700; - --bs-badge-color: #fff; - --bs-badge-border-radius: 0.375rem; - display: inline-block; - padding: var(--bs-badge-padding-y) var(--bs-badge-padding-x); - font-size: var(--bs-badge-font-size); - font-weight: var(--bs-badge-font-weight); - line-height: 1; - color: var(--bs-badge-color); - text-align: center; - white-space: nowrap; - vertical-align: baseline; - border-radius: var(--bs-badge-border-radius); } - .badge:empty { - display: none; } - -.btn .badge, .search-form .search-submit .badge, .comment-form input[type="submit"] .badge { - position: relative; - top: -1px; } - -.alert { - --bs-alert-bg: transparent; - --bs-alert-padding-x: 1.5rem; - --bs-alert-padding-y: 1rem; - --bs-alert-margin-bottom: 0; - --bs-alert-color: inherit; - --bs-alert-border-color: transparent; - --bs-alert-border: 0 solid var(--bs-alert-border-color); - --bs-alert-border-radius: 0; - position: relative; - padding: var(--bs-alert-padding-y) var(--bs-alert-padding-x); - margin-bottom: var(--bs-alert-margin-bottom); - color: var(--bs-alert-color); - background-color: var(--bs-alert-bg); - border: var(--bs-alert-border); - border-radius: var(--bs-alert-border-radius); } - -.alert-heading { - color: inherit; } - -.alert-link { - font-weight: 700; } - -.alert-dismissible { - padding-right: 4.5rem; } - .alert-dismissible .btn-close { - position: absolute; - top: 0; - right: 0; - z-index: 2; - padding: 1.25rem 1.5rem; } - -.alert-primary { - --bs-alert-color: white; - --bs-alert-bg: #5d2f86; - --bs-alert-border-color: #5d2f86; } - .alert-primary .alert-link { - color: #cccccc; } - -.alert-secondary { - --bs-alert-color: white; - --bs-alert-bg: #6c757d; - --bs-alert-border-color: #6c757d; } - .alert-secondary .alert-link { - color: #cccccc; } - -.alert-success { - --bs-alert-color: white; - --bs-alert-bg: #198754; - --bs-alert-border-color: #198754; } - .alert-success .alert-link { - color: #cccccc; } - -.alert-info { - --bs-alert-color: #1d2d35; - --bs-alert-bg: #0dcaf0; - --bs-alert-border-color: #0dcaf0; } - .alert-info .alert-link { - color: #17242a; } - -.alert-warning { - --bs-alert-color: #1d2d35; - --bs-alert-bg: #ffe000; - --bs-alert-border-color: #ffe000; } - .alert-warning .alert-link { - color: #17242a; } - -.alert-danger { - --bs-alert-color: white; - --bs-alert-bg: #dc3545; - --bs-alert-border-color: #dc3545; } - .alert-danger .alert-link { - color: #cccccc; } - -.alert-light { - --bs-alert-color: #1d2d35; - --bs-alert-bg: #f8f9fa; - --bs-alert-border-color: #f8f9fa; } - .alert-light .alert-link { - color: #17242a; } - -.alert-dark { - --bs-alert-color: white; - --bs-alert-bg: #212529; - --bs-alert-border-color: #212529; } - .alert-dark .alert-link { - color: #cccccc; } - -@keyframes progress-bar-stripes { - 0% { - background-position-x: 1rem; } } - -.progress { - --bs-progress-height: 1rem; - --bs-progress-font-size: 0.75rem; - --bs-progress-bg: #e9ecef; - --bs-progress-border-radius: 0.375rem; - --bs-progress-box-shadow: inset 0 1px 2px rgba(29, 45, 53, 0.075); - --bs-progress-bar-color: #fff; - --bs-progress-bar-bg: #5d2f86; - --bs-progress-bar-transition: width 0.6s ease; - display: flex; - height: var(--bs-progress-height); - overflow: hidden; - font-size: var(--bs-progress-font-size); - background-color: var(--bs-progress-bg); - border-radius: var(--bs-progress-border-radius); } - -.progress-bar { - display: flex; - flex-direction: column; - justify-content: center; - overflow: hidden; - color: var(--bs-progress-bar-color); - text-align: center; - white-space: nowrap; - background-color: var(--bs-progress-bar-bg); - transition: var(--bs-progress-bar-transition); } - @media (prefers-reduced-motion: reduce) { - .progress-bar { - transition: none; } } -.progress-bar-striped { - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-size: var(--bs-progress-height) var(--bs-progress-height); } - -.progress-bar-animated { - animation: 1s linear infinite progress-bar-stripes; } - @media (prefers-reduced-motion: reduce) { - .progress-bar-animated { - animation: none; } } -.list-group { - --bs-list-group-color: #212529; - --bs-list-group-bg: #fff; - --bs-list-group-border-color: rgba(29, 45, 53, 0.125); - --bs-list-group-border-width: 1px; - --bs-list-group-border-radius: 0.375rem; - --bs-list-group-item-padding-x: 1rem; - --bs-list-group-item-padding-y: 0.5rem; - --bs-list-group-action-color: #495057; - --bs-list-group-action-hover-color: #495057; - --bs-list-group-action-hover-bg: #f8f9fa; - --bs-list-group-action-active-color: #1d2d35; - --bs-list-group-action-active-bg: #e9ecef; - --bs-list-group-disabled-color: #6c757d; - --bs-list-group-disabled-bg: #fff; - --bs-list-group-active-color: #fff; - --bs-list-group-active-bg: #5d2f86; - --bs-list-group-active-border-color: #5d2f86; - display: flex; - flex-direction: column; - padding-left: 0; - margin-bottom: 0; - border-radius: var(--bs-list-group-border-radius); } - -.list-group-numbered { - list-style-type: none; - counter-reset: section; } - .list-group-numbered > .list-group-item::before { - content: counters(section, ".") ". "; - counter-increment: section; } - -.list-group-item-action { - width: 100%; - color: var(--bs-list-group-action-color); - text-align: inherit; } - .list-group-item-action:hover, .list-group-item-action:focus { - z-index: 1; - color: var(--bs-list-group-action-hover-color); - text-decoration: none; - background-color: var(--bs-list-group-action-hover-bg); } - .list-group-item-action:active { - color: var(--bs-list-group-action-active-color); - background-color: var(--bs-list-group-action-active-bg); } - -.list-group-item { - position: relative; - display: block; - padding: var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x); - color: var(--bs-list-group-color); - background-color: var(--bs-list-group-bg); - border: var(--bs-list-group-border-width) solid var(--bs-list-group-border-color); } - .list-group-item:first-child { - border-top-left-radius: inherit; - border-top-right-radius: inherit; } - .list-group-item:last-child { - border-bottom-right-radius: inherit; - border-bottom-left-radius: inherit; } - .list-group-item.disabled, .list-group-item:disabled { - color: var(--bs-list-group-disabled-color); - pointer-events: none; - background-color: var(--bs-list-group-disabled-bg); } - .list-group-item.active { - z-index: 2; - color: var(--bs-list-group-active-color); - background-color: var(--bs-list-group-active-bg); - border-color: var(--bs-list-group-active-border-color); } - .list-group-item + .list-group-item { - border-top-width: 0; } - .list-group-item + .list-group-item.active { - margin-top: calc(-1 * var(--bs-list-group-border-width)); - border-top-width: var(--bs-list-group-border-width); } - -.list-group-horizontal { - flex-direction: row; } - .list-group-horizontal > .list-group-item:first-child:not(:last-child) { - border-bottom-left-radius: var(--bs-list-group-border-radius); - border-top-right-radius: 0; } - .list-group-horizontal > .list-group-item:last-child:not(:first-child) { - border-top-right-radius: var(--bs-list-group-border-radius); - border-bottom-left-radius: 0; } - .list-group-horizontal > .list-group-item.active { - margin-top: 0; } - .list-group-horizontal > .list-group-item + .list-group-item { - border-top-width: var(--bs-list-group-border-width); - border-left-width: 0; } - .list-group-horizontal > .list-group-item + .list-group-item.active { - margin-left: calc(-1 * var(--bs-list-group-border-width)); - border-left-width: var(--bs-list-group-border-width); } - -@media (min-width: 576px) { - .list-group-horizontal-sm { - flex-direction: row; } - .list-group-horizontal-sm > .list-group-item:first-child:not(:last-child) { - border-bottom-left-radius: var(--bs-list-group-border-radius); - border-top-right-radius: 0; } - .list-group-horizontal-sm > .list-group-item:last-child:not(:first-child) { - border-top-right-radius: var(--bs-list-group-border-radius); - border-bottom-left-radius: 0; } - .list-group-horizontal-sm > .list-group-item.active { - margin-top: 0; } - .list-group-horizontal-sm > .list-group-item + .list-group-item { - border-top-width: var(--bs-list-group-border-width); - border-left-width: 0; } - .list-group-horizontal-sm > .list-group-item + .list-group-item.active { - margin-left: calc(-1 * var(--bs-list-group-border-width)); - border-left-width: var(--bs-list-group-border-width); } } - -@media (min-width: 768px) { - .list-group-horizontal-md { - flex-direction: row; } - .list-group-horizontal-md > .list-group-item:first-child:not(:last-child) { - border-bottom-left-radius: var(--bs-list-group-border-radius); - border-top-right-radius: 0; } - .list-group-horizontal-md > .list-group-item:last-child:not(:first-child) { - border-top-right-radius: var(--bs-list-group-border-radius); - border-bottom-left-radius: 0; } - .list-group-horizontal-md > .list-group-item.active { - margin-top: 0; } - .list-group-horizontal-md > .list-group-item + .list-group-item { - border-top-width: var(--bs-list-group-border-width); - border-left-width: 0; } - .list-group-horizontal-md > .list-group-item + .list-group-item.active { - margin-left: calc(-1 * var(--bs-list-group-border-width)); - border-left-width: var(--bs-list-group-border-width); } } - -@media (min-width: 992px) { - .list-group-horizontal-lg { - flex-direction: row; } - .list-group-horizontal-lg > .list-group-item:first-child:not(:last-child) { - border-bottom-left-radius: var(--bs-list-group-border-radius); - border-top-right-radius: 0; } - .list-group-horizontal-lg > .list-group-item:last-child:not(:first-child) { - border-top-right-radius: var(--bs-list-group-border-radius); - border-bottom-left-radius: 0; } - .list-group-horizontal-lg > .list-group-item.active { - margin-top: 0; } - .list-group-horizontal-lg > .list-group-item + .list-group-item { - border-top-width: var(--bs-list-group-border-width); - border-left-width: 0; } - .list-group-horizontal-lg > .list-group-item + .list-group-item.active { - margin-left: calc(-1 * var(--bs-list-group-border-width)); - border-left-width: var(--bs-list-group-border-width); } } - -@media (min-width: 1200px) { - .list-group-horizontal-xl { - flex-direction: row; } - .list-group-horizontal-xl > .list-group-item:first-child:not(:last-child) { - border-bottom-left-radius: var(--bs-list-group-border-radius); - border-top-right-radius: 0; } - .list-group-horizontal-xl > .list-group-item:last-child:not(:first-child) { - border-top-right-radius: var(--bs-list-group-border-radius); - border-bottom-left-radius: 0; } - .list-group-horizontal-xl > .list-group-item.active { - margin-top: 0; } - .list-group-horizontal-xl > .list-group-item + .list-group-item { - border-top-width: var(--bs-list-group-border-width); - border-left-width: 0; } - .list-group-horizontal-xl > .list-group-item + .list-group-item.active { - margin-left: calc(-1 * var(--bs-list-group-border-width)); - border-left-width: var(--bs-list-group-border-width); } } - -@media (min-width: 1400px) { - .list-group-horizontal-xxl { - flex-direction: row; } - .list-group-horizontal-xxl > .list-group-item:first-child:not(:last-child) { - border-bottom-left-radius: var(--bs-list-group-border-radius); - border-top-right-radius: 0; } - .list-group-horizontal-xxl > .list-group-item:last-child:not(:first-child) { - border-top-right-radius: var(--bs-list-group-border-radius); - border-bottom-left-radius: 0; } - .list-group-horizontal-xxl > .list-group-item.active { - margin-top: 0; } - .list-group-horizontal-xxl > .list-group-item + .list-group-item { - border-top-width: var(--bs-list-group-border-width); - border-left-width: 0; } - .list-group-horizontal-xxl > .list-group-item + .list-group-item.active { - margin-left: calc(-1 * var(--bs-list-group-border-width)); - border-left-width: var(--bs-list-group-border-width); } } - -.list-group-flush { - border-radius: 0; } - .list-group-flush > .list-group-item { - border-width: 0 0 var(--bs-list-group-border-width); } - .list-group-flush > .list-group-item:last-child { - border-bottom-width: 0; } - -.list-group-item-primary { - color: #381c50; - background-color: #dfd5e7; } - .list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus { - color: #381c50; - background-color: #c9c0d0; } - .list-group-item-primary.list-group-item-action.active { - color: #fff; - background-color: #381c50; - border-color: #381c50; } - -.list-group-item-secondary { - color: #41464b; - background-color: #e2e3e5; } - .list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus { - color: #41464b; - background-color: #cbccce; } - .list-group-item-secondary.list-group-item-action.active { - color: #fff; - background-color: #41464b; - border-color: #41464b; } - -.list-group-item-success { - color: #0f5132; - background-color: #d1e7dd; } - .list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus { - color: #0f5132; - background-color: #bcd0c7; } - .list-group-item-success.list-group-item-action.active { - color: #fff; - background-color: #0f5132; - border-color: #0f5132; } - -.list-group-item-info { - color: #176c80; - background-color: #cff4fc; } - .list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus { - color: #176c80; - background-color: #badce3; } - .list-group-item-info.list-group-item-action.active { - color: #fff; - background-color: #176c80; - border-color: #176c80; } - -.list-group-item-warning { - color: #777520; - background-color: #fff9cc; } - .list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus { - color: #777520; - background-color: #e6e0b8; } - .list-group-item-warning.list-group-item-action.active { - color: #fff; - background-color: #777520; - border-color: #777520; } - -.list-group-item-danger { - color: #842029; - background-color: #f8d7da; } - .list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus { - color: #842029; - background-color: #dfc2c4; } - .list-group-item-danger.list-group-item-action.active { - color: #fff; - background-color: #842029; - border-color: #842029; } - -.list-group-item-light { - color: #757f84; - background-color: #fefefe; } - .list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus { - color: #757f84; - background-color: #e5e5e5; } - .list-group-item-light.list-group-item-action.active { - color: #fff; - background-color: #757f84; - border-color: #757f84; } - -.list-group-item-dark { - color: #141619; - background-color: #d3d3d4; } - .list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus { - color: #141619; - background-color: #bebebf; } - .list-group-item-dark.list-group-item-action.active { - color: #fff; - background-color: #141619; - border-color: #141619; } - -.btn-close { - box-sizing: content-box; - width: 1em; - height: 1em; - padding: 0.25em 0.25em; - color: #1d2d35; - background: transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%231d2d35'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat; - border: 0; - border-radius: 0.375rem; - opacity: 0.5; } - .btn-close:hover { - color: #1d2d35; - text-decoration: none; - opacity: 0.75; } - .btn-close:focus { - outline: 0; - box-shadow: 0 0 0 0.25rem rgba(93, 47, 134, 0.25); - opacity: 1; } - .btn-close:disabled, .btn-close.disabled { - pointer-events: none; - user-select: none; - opacity: 0.25; } - -.btn-close-white { - filter: invert(1) grayscale(100%) brightness(200%); } - -.toast { - --bs-toast-zindex: 1090; - --bs-toast-padding-x: 0.75rem; - --bs-toast-padding-y: 0.5rem; - --bs-toast-spacing: 48px; - --bs-toast-max-width: 350px; - --bs-toast-font-size: 0.875rem; - --bs-toast-color: ; - --bs-toast-bg: rgba(255, 255, 255, 0.85); - --bs-toast-border-width: 1px; - --bs-toast-border-color: var(--bs-border-color-translucent); - --bs-toast-border-radius: 0.375rem; - --bs-toast-box-shadow: 0 0.5rem 1rem rgba(29, 45, 53, 0.15); - --bs-toast-header-color: #6c757d; - --bs-toast-header-bg: rgba(255, 255, 255, 0.85); - --bs-toast-header-border-color: rgba(29, 45, 53, 0.05); - width: var(--bs-toast-max-width); - max-width: 100%; - font-size: var(--bs-toast-font-size); - color: var(--bs-toast-color); - pointer-events: auto; - background-color: var(--bs-toast-bg); - background-clip: padding-box; - border: var(--bs-toast-border-width) solid var(--bs-toast-border-color); - box-shadow: var(--bs-toast-box-shadow); - border-radius: var(--bs-toast-border-radius); } - .toast.showing { - opacity: 0; } - .toast:not(.show) { - display: none; } - -.toast-container { - --bs-toast-zindex: 1090; - position: absolute; - z-index: var(--bs-toast-zindex); - width: max-content; - max-width: 100%; - pointer-events: none; } - .toast-container > :not(:last-child) { - margin-bottom: var(--bs-toast-spacing); } - -.toast-header { - display: flex; - align-items: center; - padding: var(--bs-toast-padding-y) var(--bs-toast-padding-x); - color: var(--bs-toast-header-color); - background-color: var(--bs-toast-header-bg); - background-clip: padding-box; - border-bottom: var(--bs-toast-border-width) solid var(--bs-toast-header-border-color); - border-top-left-radius: calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width)); - border-top-right-radius: calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width)); } - .toast-header .btn-close { - margin-right: calc(-.5 * var(--bs-toast-padding-x)); - margin-left: var(--bs-toast-padding-x); } - -.toast-body { - padding: var(--bs-toast-padding-x); - word-wrap: break-word; } - -.modal { - --bs-modal-zindex: 1055; - --bs-modal-width: 500px; - --bs-modal-padding: 1rem; - --bs-modal-margin: 0.5rem; - --bs-modal-color: ; - --bs-modal-bg: #fff; - --bs-modal-border-color: var(--bs-border-color-translucent); - --bs-modal-border-width: 1px; - --bs-modal-border-radius: 0.5rem; - --bs-modal-box-shadow: 0 0.125rem 0.25rem rgba(29, 45, 53, 0.075); - --bs-modal-inner-border-radius: calc(0.5rem - 1px); - --bs-modal-header-padding-x: 1rem; - --bs-modal-header-padding-y: 1rem; - --bs-modal-header-padding: 1rem 1rem; - --bs-modal-header-border-color: var(--bs-border-color); - --bs-modal-header-border-width: 1px; - --bs-modal-title-line-height: 1.5; - --bs-modal-footer-gap: 0.5rem; - --bs-modal-footer-bg: ; - --bs-modal-footer-border-color: var(--bs-border-color); - --bs-modal-footer-border-width: 1px; - position: fixed; - top: 0; - left: 0; - z-index: var(--bs-modal-zindex); - display: none; - width: 100%; - height: 100%; - overflow-x: hidden; - overflow-y: auto; - outline: 0; } - -.modal-dialog { - position: relative; - width: auto; - margin: var(--bs-modal-margin); - pointer-events: none; } - .modal.fade .modal-dialog { - transition: transform 0.3s ease-out; - transform: translate(0, -50px); } - @media (prefers-reduced-motion: reduce) { - .modal.fade .modal-dialog { - transition: none; } } - .modal.show .modal-dialog { - transform: none; } - .modal.modal-static .modal-dialog { - transform: scale(1.02); } - -.modal-dialog-scrollable { - height: calc(100% - var(--bs-modal-margin) * 2); } - .modal-dialog-scrollable .modal-content { - max-height: 100%; - overflow: hidden; } - .modal-dialog-scrollable .modal-body { - overflow-y: auto; } - -.modal-dialog-centered { - display: flex; - align-items: center; - min-height: calc(100% - var(--bs-modal-margin) * 2); } - -.modal-content { - position: relative; - display: flex; - flex-direction: column; - width: 100%; - color: var(--bs-modal-color); - pointer-events: auto; - background-color: var(--bs-modal-bg); - background-clip: padding-box; - border: var(--bs-modal-border-width) solid var(--bs-modal-border-color); - border-radius: var(--bs-modal-border-radius); - outline: 0; } - -.modal-backdrop { - --bs-backdrop-zindex: 1050; - --bs-backdrop-bg: #1d2d35; - --bs-backdrop-opacity: 0.5; - position: fixed; - top: 0; - left: 0; - z-index: var(--bs-backdrop-zindex); - width: 100vw; - height: 100vh; - background-color: var(--bs-backdrop-bg); } - .modal-backdrop.fade { - opacity: 0; } - .modal-backdrop.show { - opacity: var(--bs-backdrop-opacity); } - -.modal-header { - display: flex; - flex-shrink: 0; - align-items: center; - justify-content: space-between; - padding: var(--bs-modal-header-padding); - border-bottom: var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color); - border-top-left-radius: var(--bs-modal-inner-border-radius); - border-top-right-radius: var(--bs-modal-inner-border-radius); } - .modal-header .btn-close { - padding: calc(var(--bs-modal-header-padding-y) * .5) calc(var(--bs-modal-header-padding-x) * .5); - margin: calc(-.5 * var(--bs-modal-header-padding-y)) calc(-.5 * var(--bs-modal-header-padding-x)) calc(-.5 * var(--bs-modal-header-padding-y)) auto; } - -.modal-title { - margin-bottom: 0; - line-height: var(--bs-modal-title-line-height); } - -.modal-body { - position: relative; - flex: 1 1 auto; - padding: var(--bs-modal-padding); } - -.modal-footer { - display: flex; - flex-shrink: 0; - flex-wrap: wrap; - align-items: center; - justify-content: flex-end; - padding: calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * .5); - background-color: var(--bs-modal-footer-bg); - border-top: var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color); - border-bottom-right-radius: var(--bs-modal-inner-border-radius); - border-bottom-left-radius: var(--bs-modal-inner-border-radius); } - .modal-footer > * { - margin: calc(var(--bs-modal-footer-gap) * .5); } - -@media (min-width: 576px) { - .modal { - --bs-modal-margin: 1.75rem; - --bs-modal-box-shadow: 0 0.5rem 1rem rgba(29, 45, 53, 0.15); } - .modal-dialog { - max-width: var(--bs-modal-width); - margin-right: auto; - margin-left: auto; } - .modal-sm { - --bs-modal-width: 300px; } } - -@media (min-width: 992px) { - .modal-lg, - .modal-xl { - --bs-modal-width: 800px; } } - -@media (min-width: 1200px) { - .modal-xl { - --bs-modal-width: 1140px; } } - -.modal-fullscreen { - width: 100vw; - max-width: none; - height: 100%; - margin: 0; } - .modal-fullscreen .modal-content { - height: 100%; - border: 0; - border-radius: 0; } - .modal-fullscreen .modal-header, - .modal-fullscreen .modal-footer { - border-radius: 0; } - .modal-fullscreen .modal-body { - overflow-y: auto; } - -@media (max-width: 575.98px) { - .modal-fullscreen-sm-down { - width: 100vw; - max-width: none; - height: 100%; - margin: 0; } - .modal-fullscreen-sm-down .modal-content { - height: 100%; - border: 0; - border-radius: 0; } - .modal-fullscreen-sm-down .modal-header, - .modal-fullscreen-sm-down .modal-footer { - border-radius: 0; } - .modal-fullscreen-sm-down .modal-body { - overflow-y: auto; } } - -@media (max-width: 767.98px) { - .modal-fullscreen-md-down { - width: 100vw; - max-width: none; - height: 100%; - margin: 0; } - .modal-fullscreen-md-down .modal-content { - height: 100%; - border: 0; - border-radius: 0; } - .modal-fullscreen-md-down .modal-header, - .modal-fullscreen-md-down .modal-footer { - border-radius: 0; } - .modal-fullscreen-md-down .modal-body { - overflow-y: auto; } } - -@media (max-width: 991.98px) { - .modal-fullscreen-lg-down { - width: 100vw; - max-width: none; - height: 100%; - margin: 0; } - .modal-fullscreen-lg-down .modal-content { - height: 100%; - border: 0; - border-radius: 0; } - .modal-fullscreen-lg-down .modal-header, - .modal-fullscreen-lg-down .modal-footer { - border-radius: 0; } - .modal-fullscreen-lg-down .modal-body { - overflow-y: auto; } } - -@media (max-width: 1199.98px) { - .modal-fullscreen-xl-down { - width: 100vw; - max-width: none; - height: 100%; - margin: 0; } - .modal-fullscreen-xl-down .modal-content { - height: 100%; - border: 0; - border-radius: 0; } - .modal-fullscreen-xl-down .modal-header, - .modal-fullscreen-xl-down .modal-footer { - border-radius: 0; } - .modal-fullscreen-xl-down .modal-body { - overflow-y: auto; } } - -@media (max-width: 1399.98px) { - .modal-fullscreen-xxl-down { - width: 100vw; - max-width: none; - height: 100%; - margin: 0; } - .modal-fullscreen-xxl-down .modal-content { - height: 100%; - border: 0; - border-radius: 0; } - .modal-fullscreen-xxl-down .modal-header, - .modal-fullscreen-xxl-down .modal-footer { - border-radius: 0; } - .modal-fullscreen-xxl-down .modal-body { - overflow-y: auto; } } - -.tooltip { - --bs-tooltip-zindex: 1080; - --bs-tooltip-max-width: 200px; - --bs-tooltip-padding-x: 0.5rem; - --bs-tooltip-padding-y: 0.25rem; - --bs-tooltip-margin: ; - --bs-tooltip-font-size: 0.875rem; - --bs-tooltip-color: #fff; - --bs-tooltip-bg: #1d2d35; - --bs-tooltip-border-radius: 0.375rem; - --bs-tooltip-opacity: 0.9; - --bs-tooltip-arrow-width: 0.8rem; - --bs-tooltip-arrow-height: 0.4rem; - z-index: var(--bs-tooltip-zindex); - display: block; - padding: var(--bs-tooltip-arrow-height); - margin: var(--bs-tooltip-margin); - font-family: "Jost", -apple-system, blinkmacsystemfont, "Segoe UI", roboto, "Helvetica Neue", arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - font-style: normal; - font-weight: 400; - line-height: 1.5; - text-align: left; - text-align: start; - text-decoration: none; - text-shadow: none; - text-transform: none; - letter-spacing: normal; - word-break: normal; - white-space: normal; - word-spacing: normal; - line-break: auto; - font-size: var(--bs-tooltip-font-size); - word-wrap: break-word; - opacity: 0; } - .tooltip.show { - opacity: var(--bs-tooltip-opacity); } - .tooltip .tooltip-arrow { - display: block; - width: var(--bs-tooltip-arrow-width); - height: var(--bs-tooltip-arrow-height); } - .tooltip .tooltip-arrow::before { - position: absolute; - content: ""; - border-color: transparent; - border-style: solid; } - -.bs-tooltip-top .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^="top"] .tooltip-arrow { - bottom: 0; } - .bs-tooltip-top .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^="top"] .tooltip-arrow::before { - top: -1px; - border-width: var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0; - border-top-color: var(--bs-tooltip-bg); } - -/* rtl:begin:ignore */ -.bs-tooltip-end .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^="right"] .tooltip-arrow { - left: 0; - width: var(--bs-tooltip-arrow-height); - height: var(--bs-tooltip-arrow-width); } - .bs-tooltip-end .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^="right"] .tooltip-arrow::before { - right: -1px; - border-width: calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0; - border-right-color: var(--bs-tooltip-bg); } - -/* rtl:end:ignore */ -.bs-tooltip-bottom .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^="bottom"] .tooltip-arrow { - top: 0; } - .bs-tooltip-bottom .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^="bottom"] .tooltip-arrow::before { - bottom: -1px; - border-width: 0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height); - border-bottom-color: var(--bs-tooltip-bg); } - -/* rtl:begin:ignore */ -.bs-tooltip-start .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^="left"] .tooltip-arrow { - right: 0; - width: var(--bs-tooltip-arrow-height); - height: var(--bs-tooltip-arrow-width); } - .bs-tooltip-start .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^="left"] .tooltip-arrow::before { - left: -1px; - border-width: calc(var(--bs-tooltip-arrow-width) * .5) 0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height); - border-left-color: var(--bs-tooltip-bg); } - -/* rtl:end:ignore */ -.tooltip-inner { - max-width: var(--bs-tooltip-max-width); - padding: var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x); - color: var(--bs-tooltip-color); - text-align: center; - background-color: var(--bs-tooltip-bg); - border-radius: var(--bs-tooltip-border-radius); } - -.popover { - --bs-popover-zindex: 1070; - --bs-popover-max-width: 276px; - --bs-popover-font-size: 0.875rem; - --bs-popover-bg: #fff; - --bs-popover-border-width: 1px; - --bs-popover-border-color: var(--bs-border-color-translucent); - --bs-popover-border-radius: 0.5rem; - --bs-popover-inner-border-radius: calc(0.5rem - 1px); - --bs-popover-box-shadow: 0 0.5rem 1rem rgba(29, 45, 53, 0.15); - --bs-popover-header-padding-x: 1rem; - --bs-popover-header-padding-y: 0.5rem; - --bs-popover-header-font-size: 1rem; - --bs-popover-header-color: ; - --bs-popover-header-bg: #f0f0f0; - --bs-popover-body-padding-x: 1rem; - --bs-popover-body-padding-y: 1rem; - --bs-popover-body-color: #1d2d35; - --bs-popover-arrow-width: 1rem; - --bs-popover-arrow-height: 0.5rem; - --bs-popover-arrow-border: var(--bs-popover-border-color); - z-index: var(--bs-popover-zindex); - display: block; - max-width: var(--bs-popover-max-width); - font-family: "Jost", -apple-system, blinkmacsystemfont, "Segoe UI", roboto, "Helvetica Neue", arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - font-style: normal; - font-weight: 400; - line-height: 1.5; - text-align: left; - text-align: start; - text-decoration: none; - text-shadow: none; - text-transform: none; - letter-spacing: normal; - word-break: normal; - white-space: normal; - word-spacing: normal; - line-break: auto; - font-size: var(--bs-popover-font-size); - word-wrap: break-word; - background-color: var(--bs-popover-bg); - background-clip: padding-box; - border: var(--bs-popover-border-width) solid var(--bs-popover-border-color); - border-radius: var(--bs-popover-border-radius); } - .popover .popover-arrow { - display: block; - width: var(--bs-popover-arrow-width); - height: var(--bs-popover-arrow-height); } - .popover .popover-arrow::before, .popover .popover-arrow::after { - position: absolute; - display: block; - content: ""; - border-color: transparent; - border-style: solid; - border-width: 0; } - -.bs-popover-top > .popover-arrow, .bs-popover-auto[data-popper-placement^="top"] > .popover-arrow { - bottom: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width)); } - .bs-popover-top > .popover-arrow::before, .bs-popover-auto[data-popper-placement^="top"] > .popover-arrow::before, .bs-popover-top > .popover-arrow::after, .bs-popover-auto[data-popper-placement^="top"] > .popover-arrow::after { - border-width: var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0; } - .bs-popover-top > .popover-arrow::before, .bs-popover-auto[data-popper-placement^="top"] > .popover-arrow::before { - bottom: 0; - border-top-color: var(--bs-popover-arrow-border); } - .bs-popover-top > .popover-arrow::after, .bs-popover-auto[data-popper-placement^="top"] > .popover-arrow::after { - bottom: var(--bs-popover-border-width); - border-top-color: var(--bs-popover-bg); } - -/* rtl:begin:ignore */ -.bs-popover-end > .popover-arrow, .bs-popover-auto[data-popper-placement^="right"] > .popover-arrow { - left: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width)); - width: var(--bs-popover-arrow-height); - height: var(--bs-popover-arrow-width); } - .bs-popover-end > .popover-arrow::before, .bs-popover-auto[data-popper-placement^="right"] > .popover-arrow::before, .bs-popover-end > .popover-arrow::after, .bs-popover-auto[data-popper-placement^="right"] > .popover-arrow::after { - border-width: calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0; } - .bs-popover-end > .popover-arrow::before, .bs-popover-auto[data-popper-placement^="right"] > .popover-arrow::before { - left: 0; - border-right-color: var(--bs-popover-arrow-border); } - .bs-popover-end > .popover-arrow::after, .bs-popover-auto[data-popper-placement^="right"] > .popover-arrow::after { - left: var(--bs-popover-border-width); - border-right-color: var(--bs-popover-bg); } - -/* rtl:end:ignore */ -.bs-popover-bottom > .popover-arrow, .bs-popover-auto[data-popper-placement^="bottom"] > .popover-arrow { - top: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width)); } - .bs-popover-bottom > .popover-arrow::before, .bs-popover-auto[data-popper-placement^="bottom"] > .popover-arrow::before, .bs-popover-bottom > .popover-arrow::after, .bs-popover-auto[data-popper-placement^="bottom"] > .popover-arrow::after { - border-width: 0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height); } - .bs-popover-bottom > .popover-arrow::before, .bs-popover-auto[data-popper-placement^="bottom"] > .popover-arrow::before { - top: 0; - border-bottom-color: var(--bs-popover-arrow-border); } - .bs-popover-bottom > .popover-arrow::after, .bs-popover-auto[data-popper-placement^="bottom"] > .popover-arrow::after { - top: var(--bs-popover-border-width); - border-bottom-color: var(--bs-popover-bg); } - -.bs-popover-bottom .popover-header::before, .bs-popover-auto[data-popper-placement^="bottom"] .popover-header::before { - position: absolute; - top: 0; - left: 50%; - display: block; - width: var(--bs-popover-arrow-width); - margin-left: calc(-.5 * var(--bs-popover-arrow-width)); - content: ""; - border-bottom: var(--bs-popover-border-width) solid var(--bs-popover-header-bg); } - -/* rtl:begin:ignore */ -.bs-popover-start > .popover-arrow, .bs-popover-auto[data-popper-placement^="left"] > .popover-arrow { - right: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width)); - width: var(--bs-popover-arrow-height); - height: var(--bs-popover-arrow-width); } - .bs-popover-start > .popover-arrow::before, .bs-popover-auto[data-popper-placement^="left"] > .popover-arrow::before, .bs-popover-start > .popover-arrow::after, .bs-popover-auto[data-popper-placement^="left"] > .popover-arrow::after { - border-width: calc(var(--bs-popover-arrow-width) * .5) 0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height); } - .bs-popover-start > .popover-arrow::before, .bs-popover-auto[data-popper-placement^="left"] > .popover-arrow::before { - right: 0; - border-left-color: var(--bs-popover-arrow-border); } - .bs-popover-start > .popover-arrow::after, .bs-popover-auto[data-popper-placement^="left"] > .popover-arrow::after { - right: var(--bs-popover-border-width); - border-left-color: var(--bs-popover-bg); } - -/* rtl:end:ignore */ -.popover-header { - padding: var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x); - margin-bottom: 0; - font-size: var(--bs-popover-header-font-size); - color: var(--bs-popover-header-color); - background-color: var(--bs-popover-header-bg); - border-bottom: var(--bs-popover-border-width) solid var(--bs-popover-border-color); - border-top-left-radius: var(--bs-popover-inner-border-radius); - border-top-right-radius: var(--bs-popover-inner-border-radius); } - .popover-header:empty { - display: none; } - -.popover-body { - padding: var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x); - color: var(--bs-popover-body-color); } - -.carousel { - position: relative; } - -.carousel.pointer-event { - touch-action: pan-y; } - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; } - .carousel-inner::after { - display: block; - clear: both; - content: ""; } - -.carousel-item { - position: relative; - display: none; - float: left; - width: 100%; - margin-right: -100%; - backface-visibility: hidden; - transition: transform 0.6s ease-in-out; } - @media (prefers-reduced-motion: reduce) { - .carousel-item { - transition: none; } } -.carousel-item.active, -.carousel-item-next, -.carousel-item-prev { - display: block; } - -.carousel-item-next:not(.carousel-item-start), -.active.carousel-item-end { - transform: translateX(100%); } - -.carousel-item-prev:not(.carousel-item-end), -.active.carousel-item-start { - transform: translateX(-100%); } - -.carousel-fade .carousel-item { - opacity: 0; - transition-property: opacity; - transform: none; } - -.carousel-fade .carousel-item.active, -.carousel-fade .carousel-item-next.carousel-item-start, -.carousel-fade .carousel-item-prev.carousel-item-end { - z-index: 1; - opacity: 1; } - -.carousel-fade .active.carousel-item-start, -.carousel-fade .active.carousel-item-end { - z-index: 0; - opacity: 0; - transition: opacity 0s 0.6s; } - @media (prefers-reduced-motion: reduce) { - .carousel-fade .active.carousel-item-start, - .carousel-fade .active.carousel-item-end { - transition: none; } } -.carousel-control-prev, -.carousel-control-next { - position: absolute; - top: 0; - bottom: 0; - z-index: 1; - display: flex; - align-items: center; - justify-content: center; - width: 15%; - padding: 0; - color: #fff; - text-align: center; - background: none; - border: 0; - opacity: 0.5; - transition: opacity 0.15s ease; } - @media (prefers-reduced-motion: reduce) { - .carousel-control-prev, - .carousel-control-next { - transition: none; } } - .carousel-control-prev:hover, .carousel-control-prev:focus, - .carousel-control-next:hover, - .carousel-control-next:focus { - color: #fff; - text-decoration: none; - outline: 0; - opacity: 0.9; } - -.carousel-control-prev { - left: 0; } - -.carousel-control-next { - right: 0; } - -.carousel-control-prev-icon, -.carousel-control-next-icon { - display: inline-block; - width: 2rem; - height: 2rem; - background-repeat: no-repeat; - background-position: 50%; - background-size: 100% 100%; } - -/* rtl:options: { - "autoRename": true, - "stringMap":[ { - "name" : "prev-next", - "search" : "prev", - "replace" : "next" - } ] -} */ -.carousel-control-prev-icon { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e"); } - -.carousel-control-next-icon { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); } - -.carousel-indicators { - position: absolute; - right: 0; - bottom: 0; - left: 0; - z-index: 2; - display: flex; - justify-content: center; - padding: 0; - margin-right: 15%; - margin-bottom: 1rem; - margin-left: 15%; - list-style: none; } - .carousel-indicators [data-bs-target] { - box-sizing: content-box; - flex: 0 1 auto; - width: 30px; - height: 3px; - padding: 0; - margin-right: 3px; - margin-left: 3px; - text-indent: -999px; - cursor: pointer; - background-color: #fff; - background-clip: padding-box; - border: 0; - border-top: 10px solid transparent; - border-bottom: 10px solid transparent; - opacity: 0.5; - transition: opacity 0.6s ease; } - @media (prefers-reduced-motion: reduce) { - .carousel-indicators [data-bs-target] { - transition: none; } } - .carousel-indicators .active { - opacity: 1; } - -.carousel-caption { - position: absolute; - right: 15%; - bottom: 1.25rem; - left: 15%; - padding-top: 1.25rem; - padding-bottom: 1.25rem; - color: #fff; - text-align: center; } - -.carousel-dark .carousel-control-prev-icon, -.carousel-dark .carousel-control-next-icon { - filter: invert(1) grayscale(100); } - -.carousel-dark .carousel-indicators [data-bs-target] { - background-color: #1d2d35; } - -.carousel-dark .carousel-caption { - color: #1d2d35; } - -.spinner-grow, -.spinner-border { - display: inline-block; - width: var(--bs-spinner-width); - height: var(--bs-spinner-height); - vertical-align: var(--bs-spinner-vertical-align); - border-radius: 50%; - animation: var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name); } - -@keyframes spinner-border { - to { - transform: rotate(360deg) /* rtl:ignore */; } } - -.spinner-border { - --bs-spinner-width: 2rem; - --bs-spinner-height: 2rem; - --bs-spinner-vertical-align: -0.125em; - --bs-spinner-border-width: 0.25em; - --bs-spinner-animation-speed: 0.75s; - --bs-spinner-animation-name: spinner-border; - border: var(--bs-spinner-border-width) solid currentcolor; - border-right-color: transparent; } - -.spinner-border-sm { - --bs-spinner-width: 1rem; - --bs-spinner-height: 1rem; - --bs-spinner-border-width: 0.2em; } - -@keyframes spinner-grow { - 0% { - transform: scale(0); } - 50% { - opacity: 1; - transform: none; } } - -.spinner-grow { - --bs-spinner-width: 2rem; - --bs-spinner-height: 2rem; - --bs-spinner-vertical-align: -0.125em; - --bs-spinner-animation-speed: 0.75s; - --bs-spinner-animation-name: spinner-grow; - background-color: currentcolor; - opacity: 0; } - -.spinner-grow-sm { - --bs-spinner-width: 1rem; - --bs-spinner-height: 1rem; } - -@media (prefers-reduced-motion: reduce) { - .spinner-border, - .spinner-grow { - --bs-spinner-animation-speed: 1.5s; } } - -.offcanvas, .offcanvas-xxl, .offcanvas-xl, .offcanvas-lg, .offcanvas-md, .offcanvas-sm { - --bs-offcanvas-zindex: 1045; - --bs-offcanvas-width: 400px; - --bs-offcanvas-height: 30vh; - --bs-offcanvas-padding-x: 1rem; - --bs-offcanvas-padding-y: 1rem; - --bs-offcanvas-color: ; - --bs-offcanvas-bg: #fff; - --bs-offcanvas-border-width: 1px; - --bs-offcanvas-border-color: var(--bs-border-color-translucent); - --bs-offcanvas-box-shadow: 0 0.125rem 0.25rem rgba(29, 45, 53, 0.075); } - -@media (max-width: 575.98px) { - .offcanvas-sm { - position: fixed; - bottom: 0; - z-index: var(--bs-offcanvas-zindex); - display: flex; - flex-direction: column; - max-width: 100%; - color: var(--bs-offcanvas-color); - visibility: hidden; - background-color: var(--bs-offcanvas-bg); - background-clip: padding-box; - outline: 0; - transition: transform 0.3s ease-in-out; } } - @media (max-width: 575.98px) and (prefers-reduced-motion: reduce) { - .offcanvas-sm { - transition: none; } } -@media (max-width: 575.98px) { - .offcanvas-sm.offcanvas-start { - top: 0; - left: 0; - width: var(--bs-offcanvas-width); - border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateX(-100%); } - .offcanvas-sm.offcanvas-end { - top: 0; - right: 0; - width: var(--bs-offcanvas-width); - border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateX(100%); } - .offcanvas-sm.offcanvas-top { - top: 0; - right: 0; - left: 0; - height: var(--bs-offcanvas-height); - max-height: 100%; - border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateY(-100%); } - .offcanvas-sm.offcanvas-bottom { - right: 0; - left: 0; - height: var(--bs-offcanvas-height); - max-height: 100%; - border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateY(100%); } - .offcanvas-sm.showing, .offcanvas-sm.show:not(.hiding) { - transform: none; } - .offcanvas-sm.showing, .offcanvas-sm.hiding, .offcanvas-sm.show { - visibility: visible; } } - -@media (min-width: 576px) { - .offcanvas-sm { - --bs-offcanvas-height: auto; - --bs-offcanvas-border-width: 0; - background-color: transparent !important; } - .offcanvas-sm .offcanvas-header { - display: none; } - .offcanvas-sm .offcanvas-body { - display: flex; - flex-grow: 0; - padding: 0; - overflow-y: visible; - background-color: transparent !important; } } - -@media (max-width: 767.98px) { - .offcanvas-md { - position: fixed; - bottom: 0; - z-index: var(--bs-offcanvas-zindex); - display: flex; - flex-direction: column; - max-width: 100%; - color: var(--bs-offcanvas-color); - visibility: hidden; - background-color: var(--bs-offcanvas-bg); - background-clip: padding-box; - outline: 0; - transition: transform 0.3s ease-in-out; } } - @media (max-width: 767.98px) and (prefers-reduced-motion: reduce) { - .offcanvas-md { - transition: none; } } -@media (max-width: 767.98px) { - .offcanvas-md.offcanvas-start { - top: 0; - left: 0; - width: var(--bs-offcanvas-width); - border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateX(-100%); } - .offcanvas-md.offcanvas-end { - top: 0; - right: 0; - width: var(--bs-offcanvas-width); - border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateX(100%); } - .offcanvas-md.offcanvas-top { - top: 0; - right: 0; - left: 0; - height: var(--bs-offcanvas-height); - max-height: 100%; - border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateY(-100%); } - .offcanvas-md.offcanvas-bottom { - right: 0; - left: 0; - height: var(--bs-offcanvas-height); - max-height: 100%; - border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateY(100%); } - .offcanvas-md.showing, .offcanvas-md.show:not(.hiding) { - transform: none; } - .offcanvas-md.showing, .offcanvas-md.hiding, .offcanvas-md.show { - visibility: visible; } } - -@media (min-width: 768px) { - .offcanvas-md { - --bs-offcanvas-height: auto; - --bs-offcanvas-border-width: 0; - background-color: transparent !important; } - .offcanvas-md .offcanvas-header { - display: none; } - .offcanvas-md .offcanvas-body { - display: flex; - flex-grow: 0; - padding: 0; - overflow-y: visible; - background-color: transparent !important; } } - -@media (max-width: 991.98px) { - .offcanvas-lg { - position: fixed; - bottom: 0; - z-index: var(--bs-offcanvas-zindex); - display: flex; - flex-direction: column; - max-width: 100%; - color: var(--bs-offcanvas-color); - visibility: hidden; - background-color: var(--bs-offcanvas-bg); - background-clip: padding-box; - outline: 0; - transition: transform 0.3s ease-in-out; } } - @media (max-width: 991.98px) and (prefers-reduced-motion: reduce) { - .offcanvas-lg { - transition: none; } } -@media (max-width: 991.98px) { - .offcanvas-lg.offcanvas-start { - top: 0; - left: 0; - width: var(--bs-offcanvas-width); - border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateX(-100%); } - .offcanvas-lg.offcanvas-end { - top: 0; - right: 0; - width: var(--bs-offcanvas-width); - border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateX(100%); } - .offcanvas-lg.offcanvas-top { - top: 0; - right: 0; - left: 0; - height: var(--bs-offcanvas-height); - max-height: 100%; - border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateY(-100%); } - .offcanvas-lg.offcanvas-bottom { - right: 0; - left: 0; - height: var(--bs-offcanvas-height); - max-height: 100%; - border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateY(100%); } - .offcanvas-lg.showing, .offcanvas-lg.show:not(.hiding) { - transform: none; } - .offcanvas-lg.showing, .offcanvas-lg.hiding, .offcanvas-lg.show { - visibility: visible; } } - -@media (min-width: 992px) { - .offcanvas-lg { - --bs-offcanvas-height: auto; - --bs-offcanvas-border-width: 0; - background-color: transparent !important; } - .offcanvas-lg .offcanvas-header { - display: none; } - .offcanvas-lg .offcanvas-body { - display: flex; - flex-grow: 0; - padding: 0; - overflow-y: visible; - background-color: transparent !important; } } - -@media (max-width: 1199.98px) { - .offcanvas-xl { - position: fixed; - bottom: 0; - z-index: var(--bs-offcanvas-zindex); - display: flex; - flex-direction: column; - max-width: 100%; - color: var(--bs-offcanvas-color); - visibility: hidden; - background-color: var(--bs-offcanvas-bg); - background-clip: padding-box; - outline: 0; - transition: transform 0.3s ease-in-out; } } - @media (max-width: 1199.98px) and (prefers-reduced-motion: reduce) { - .offcanvas-xl { - transition: none; } } -@media (max-width: 1199.98px) { - .offcanvas-xl.offcanvas-start { - top: 0; - left: 0; - width: var(--bs-offcanvas-width); - border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateX(-100%); } - .offcanvas-xl.offcanvas-end { - top: 0; - right: 0; - width: var(--bs-offcanvas-width); - border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateX(100%); } - .offcanvas-xl.offcanvas-top { - top: 0; - right: 0; - left: 0; - height: var(--bs-offcanvas-height); - max-height: 100%; - border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateY(-100%); } - .offcanvas-xl.offcanvas-bottom { - right: 0; - left: 0; - height: var(--bs-offcanvas-height); - max-height: 100%; - border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateY(100%); } - .offcanvas-xl.showing, .offcanvas-xl.show:not(.hiding) { - transform: none; } - .offcanvas-xl.showing, .offcanvas-xl.hiding, .offcanvas-xl.show { - visibility: visible; } } - -@media (min-width: 1200px) { - .offcanvas-xl { - --bs-offcanvas-height: auto; - --bs-offcanvas-border-width: 0; - background-color: transparent !important; } - .offcanvas-xl .offcanvas-header { - display: none; } - .offcanvas-xl .offcanvas-body { - display: flex; - flex-grow: 0; - padding: 0; - overflow-y: visible; - background-color: transparent !important; } } - -@media (max-width: 1399.98px) { - .offcanvas-xxl { - position: fixed; - bottom: 0; - z-index: var(--bs-offcanvas-zindex); - display: flex; - flex-direction: column; - max-width: 100%; - color: var(--bs-offcanvas-color); - visibility: hidden; - background-color: var(--bs-offcanvas-bg); - background-clip: padding-box; - outline: 0; - transition: transform 0.3s ease-in-out; } } - @media (max-width: 1399.98px) and (prefers-reduced-motion: reduce) { - .offcanvas-xxl { - transition: none; } } -@media (max-width: 1399.98px) { - .offcanvas-xxl.offcanvas-start { - top: 0; - left: 0; - width: var(--bs-offcanvas-width); - border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateX(-100%); } - .offcanvas-xxl.offcanvas-end { - top: 0; - right: 0; - width: var(--bs-offcanvas-width); - border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateX(100%); } - .offcanvas-xxl.offcanvas-top { - top: 0; - right: 0; - left: 0; - height: var(--bs-offcanvas-height); - max-height: 100%; - border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateY(-100%); } - .offcanvas-xxl.offcanvas-bottom { - right: 0; - left: 0; - height: var(--bs-offcanvas-height); - max-height: 100%; - border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateY(100%); } - .offcanvas-xxl.showing, .offcanvas-xxl.show:not(.hiding) { - transform: none; } - .offcanvas-xxl.showing, .offcanvas-xxl.hiding, .offcanvas-xxl.show { - visibility: visible; } } - -@media (min-width: 1400px) { - .offcanvas-xxl { - --bs-offcanvas-height: auto; - --bs-offcanvas-border-width: 0; - background-color: transparent !important; } - .offcanvas-xxl .offcanvas-header { - display: none; } - .offcanvas-xxl .offcanvas-body { - display: flex; - flex-grow: 0; - padding: 0; - overflow-y: visible; - background-color: transparent !important; } } - -.offcanvas { - position: fixed; - bottom: 0; - z-index: var(--bs-offcanvas-zindex); - display: flex; - flex-direction: column; - max-width: 100%; - color: var(--bs-offcanvas-color); - visibility: hidden; - background-color: var(--bs-offcanvas-bg); - background-clip: padding-box; - outline: 0; - transition: transform 0.3s ease-in-out; } - @media (prefers-reduced-motion: reduce) { - .offcanvas { - transition: none; } } - .offcanvas.offcanvas-start { - top: 0; - left: 0; - width: var(--bs-offcanvas-width); - border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateX(-100%); } - .offcanvas.offcanvas-end { - top: 0; - right: 0; - width: var(--bs-offcanvas-width); - border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateX(100%); } - .offcanvas.offcanvas-top { - top: 0; - right: 0; - left: 0; - height: var(--bs-offcanvas-height); - max-height: 100%; - border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateY(-100%); } - .offcanvas.offcanvas-bottom { - right: 0; - left: 0; - height: var(--bs-offcanvas-height); - max-height: 100%; - border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateY(100%); } - .offcanvas.showing, .offcanvas.show:not(.hiding) { - transform: none; } - .offcanvas.showing, .offcanvas.hiding, .offcanvas.show { - visibility: visible; } - -.offcanvas-backdrop { - position: fixed; - top: 0; - left: 0; - z-index: 1040; - width: 100vw; - height: 100vh; - background-color: #1d2d35; } - .offcanvas-backdrop.fade { - opacity: 0; } - .offcanvas-backdrop.show { - opacity: 0.5; } - -.offcanvas-header { - display: flex; - align-items: center; - justify-content: space-between; - padding: var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x); } - .offcanvas-header .btn-close { - padding: calc(var(--bs-offcanvas-padding-y) * .5) calc(var(--bs-offcanvas-padding-x) * .5); - margin-top: calc(-.5 * var(--bs-offcanvas-padding-y)); - margin-right: calc(-.5 * var(--bs-offcanvas-padding-x)); - margin-bottom: calc(-.5 * var(--bs-offcanvas-padding-y)); } - -.offcanvas-title { - margin-bottom: 0; - line-height: 1.5; } - -.offcanvas-body { - flex-grow: 1; - padding: var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x); - overflow-y: auto; } - -.placeholder { - display: inline-block; - min-height: 1em; - vertical-align: middle; - cursor: wait; - background-color: currentcolor; - opacity: 0.5; } - .placeholder.btn::before, .search-form .placeholder.search-submit::before, .comment-form input.placeholder[type="submit"]::before { - display: inline-block; - content: ""; } - -.placeholder-xs { - min-height: .6em; } - -.placeholder-sm { - min-height: .8em; } - -.placeholder-lg { - min-height: 1.2em; } - -.placeholder-glow .placeholder { - animation: placeholder-glow 2s ease-in-out infinite; } - -@keyframes placeholder-glow { - 50% { - opacity: 0.2; } } - -.placeholder-wave { - mask-image: linear-gradient(130deg, #1d2d35 55%, rgba(0, 0, 0, 0.8) 75%, #1d2d35 95%); - mask-size: 200% 100%; - animation: placeholder-wave 2s linear infinite; } - -@keyframes placeholder-wave { - 100% { - mask-position: -200% 0%; } } - -.clearfix::after { - display: block; - clear: both; - content: ""; } - -.text-bg-primary { - color: #fff !important; - background-color: RGBA(93, 47, 134, var(--bs-bg-opacity, 1)) !important; } - -.text-bg-secondary { - color: #fff !important; - background-color: RGBA(108, 117, 125, var(--bs-bg-opacity, 1)) !important; } - -.text-bg-success { - color: #fff !important; - background-color: RGBA(25, 135, 84, var(--bs-bg-opacity, 1)) !important; } - -.text-bg-info { - color: #1d2d35 !important; - background-color: RGBA(13, 202, 240, var(--bs-bg-opacity, 1)) !important; } - -.text-bg-warning { - color: #1d2d35 !important; - background-color: RGBA(255, 224, 0, var(--bs-bg-opacity, 1)) !important; } - -.text-bg-danger { - color: #fff !important; - background-color: RGBA(220, 53, 69, var(--bs-bg-opacity, 1)) !important; } - -.text-bg-light { - color: #1d2d35 !important; - background-color: RGBA(248, 249, 250, var(--bs-bg-opacity, 1)) !important; } - -.text-bg-dark { - color: #fff !important; - background-color: RGBA(33, 37, 41, var(--bs-bg-opacity, 1)) !important; } - -.link-primary { - color: #5d2f86 !important; } - .link-primary:hover, .link-primary:focus { - color: #4a266b !important; } - -.link-secondary { - color: #6c757d !important; } - .link-secondary:hover, .link-secondary:focus { - color: #565e64 !important; } - -.link-success { - color: #198754 !important; } - .link-success:hover, .link-success:focus { - color: #146c43 !important; } - -.link-info { - color: #0dcaf0 !important; } - .link-info:hover, .link-info:focus { - color: #3dd5f3 !important; } - -.link-warning { - color: #ffe000 !important; } - .link-warning:hover, .link-warning:focus { - color: #ffe633 !important; } - -.link-danger { - color: #dc3545 !important; } - .link-danger:hover, .link-danger:focus { - color: #b02a37 !important; } - -.link-light { - color: #f8f9fa !important; } - .link-light:hover, .link-light:focus { - color: #f9fafb !important; } - -.link-dark { - color: #212529 !important; } - .link-dark:hover, .link-dark:focus { - color: #1a1e21 !important; } - -.ratio { - position: relative; - width: 100%; } - .ratio::before { - display: block; - padding-top: var(--bs-aspect-ratio); - content: ""; } - .ratio > * { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; } - -.ratio-1x1 { - --bs-aspect-ratio: 100%; } - -.ratio-4x3 { - --bs-aspect-ratio: calc(3 / 4 * 100%); } - -.ratio-16x9 { - --bs-aspect-ratio: calc(9 / 16 * 100%); } - -.ratio-21x9 { - --bs-aspect-ratio: calc(9 / 21 * 100%); } - -.fixed-top { - position: fixed; - top: 0; - right: 0; - left: 0; - z-index: 1030; } - -.fixed-bottom { - position: fixed; - right: 0; - bottom: 0; - left: 0; - z-index: 1030; } - -.sticky-top { - position: sticky; - top: 0; - z-index: 1020; } - -.sticky-bottom { - position: sticky; - bottom: 0; - z-index: 1020; } - -@media (min-width: 576px) { - .sticky-sm-top { - position: sticky; - top: 0; - z-index: 1020; } - .sticky-sm-bottom { - position: sticky; - bottom: 0; - z-index: 1020; } } - -@media (min-width: 768px) { - .sticky-md-top { - position: sticky; - top: 0; - z-index: 1020; } - .sticky-md-bottom { - position: sticky; - bottom: 0; - z-index: 1020; } } - -@media (min-width: 992px) { - .sticky-lg-top { - position: sticky; - top: 0; - z-index: 1020; } - .sticky-lg-bottom { - position: sticky; - bottom: 0; - z-index: 1020; } } - -@media (min-width: 1200px) { - .sticky-xl-top { - position: sticky; - top: 0; - z-index: 1020; } - .sticky-xl-bottom { - position: sticky; - bottom: 0; - z-index: 1020; } } - -@media (min-width: 1400px) { - .sticky-xxl-top { - position: sticky; - top: 0; - z-index: 1020; } - .sticky-xxl-bottom { - position: sticky; - bottom: 0; - z-index: 1020; } } - -.hstack { - display: flex; - flex-direction: row; - align-items: center; - align-self: stretch; } - -.vstack { - display: flex; - flex: 1 1 auto; - flex-direction: column; - align-self: stretch; } - -.visually-hidden, -.visually-hidden-focusable:not(:focus):not(:focus-within) { - position: absolute !important; - width: 1px !important; - height: 1px !important; - padding: 0 !important; - margin: -1px !important; - overflow: hidden !important; - clip: rect(0, 0, 0, 0) !important; - white-space: nowrap !important; - border: 0 !important; } - -.stretched-link::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1; - content: ""; } - -.text-truncate { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; } - -.vr { - display: inline-block; - align-self: stretch; - width: 1px; - min-height: 1em; - background-color: currentcolor; - opacity: 0.25; } - -.align-baseline { - vertical-align: baseline !important; } - -.align-top { - vertical-align: top !important; } - -.align-middle { - vertical-align: middle !important; } - -.align-bottom { - vertical-align: bottom !important; } - -.align-text-bottom { - vertical-align: text-bottom !important; } - -.align-text-top { - vertical-align: text-top !important; } - -.float-start { - float: left !important; } - -.float-end { - float: right !important; } - -.float-none { - float: none !important; } - -.opacity-0 { - opacity: 0 !important; } - -.opacity-25 { - opacity: 0.25 !important; } - -.opacity-50 { - opacity: 0.5 !important; } - -.opacity-75 { - opacity: 0.75 !important; } - -.opacity-100 { - opacity: 1 !important; } - -.overflow-auto { - overflow: auto !important; } - -.overflow-hidden { - overflow: hidden !important; } - -.overflow-visible { - overflow: visible !important; } - -.overflow-scroll { - overflow: scroll !important; } - -.d-inline { - display: inline !important; } - -.d-inline-block { - display: inline-block !important; } - -.d-block { - display: block !important; } - -.d-grid { - display: grid !important; } - -.d-table { - display: table !important; } - -.d-table-row { - display: table-row !important; } - -.d-table-cell { - display: table-cell !important; } - -.d-flex { - display: flex !important; } - -.d-inline-flex { - display: inline-flex !important; } - -.d-none { - display: none !important; } - -.shadow { - box-shadow: 0 0.5rem 1rem rgba(29, 45, 53, 0.15) !important; } - -.shadow-sm { - box-shadow: 0 0.125rem 0.25rem rgba(29, 45, 53, 0.075) !important; } - -.shadow-lg { - box-shadow: 0 1rem 3rem rgba(29, 45, 53, 0.175) !important; } - -.shadow-none { - box-shadow: none !important; } - -.position-static { - position: static !important; } - -.position-relative { - position: relative !important; } - -.position-absolute { - position: absolute !important; } - -.position-fixed { - position: fixed !important; } - -.position-sticky { - position: sticky !important; } - -.top-0 { - top: 0 !important; } - -.top-50 { - top: 50% !important; } - -.top-100 { - top: 100% !important; } - -.bottom-0 { - bottom: 0 !important; } - -.bottom-50 { - bottom: 50% !important; } - -.bottom-100 { - bottom: 100% !important; } - -.start-0 { - left: 0 !important; } - -.start-50 { - left: 50% !important; } - -.start-100 { - left: 100% !important; } - -.end-0 { - right: 0 !important; } - -.end-50 { - right: 50% !important; } - -.end-100 { - right: 100% !important; } - -.translate-middle { - transform: translate(-50%, -50%) !important; } - -.translate-middle-x { - transform: translateX(-50%) !important; } - -.translate-middle-y { - transform: translateY(-50%) !important; } - -.border { - border: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; } - -.border-0 { - border: 0 !important; } - -.border-top { - border-top: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; } - -.border-top-0 { - border-top: 0 !important; } - -.border-end { - border-right: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; } - -.border-end-0 { - border-right: 0 !important; } - -.border-bottom { - border-bottom: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; } - -.border-bottom-0 { - border-bottom: 0 !important; } - -.border-start { - border-left: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; } - -.border-start-0 { - border-left: 0 !important; } - -.border-primary { - --bs-border-opacity: 1; - border-color: rgba(var(--bs-primary-rgb), var(--bs-border-opacity)) !important; } - -.border-secondary { - --bs-border-opacity: 1; - border-color: rgba(var(--bs-secondary-rgb), var(--bs-border-opacity)) !important; } - -.border-success { - --bs-border-opacity: 1; - border-color: rgba(var(--bs-success-rgb), var(--bs-border-opacity)) !important; } - -.border-info { - --bs-border-opacity: 1; - border-color: rgba(var(--bs-info-rgb), var(--bs-border-opacity)) !important; } - -.border-warning { - --bs-border-opacity: 1; - border-color: rgba(var(--bs-warning-rgb), var(--bs-border-opacity)) !important; } - -.border-danger { - --bs-border-opacity: 1; - border-color: rgba(var(--bs-danger-rgb), var(--bs-border-opacity)) !important; } - -.border-light { - --bs-border-opacity: 1; - border-color: rgba(var(--bs-light-rgb), var(--bs-border-opacity)) !important; } - -.border-dark { - --bs-border-opacity: 1; - border-color: rgba(var(--bs-dark-rgb), var(--bs-border-opacity)) !important; } - -.border-white { - --bs-border-opacity: 1; - border-color: rgba(var(--bs-white-rgb), var(--bs-border-opacity)) !important; } - -.border-1 { - --bs-border-width: 1px; } - -.border-2 { - --bs-border-width: 2px; } - -.border-3 { - --bs-border-width: 3px; } - -.border-4 { - --bs-border-width: 4px; } - -.border-5 { - --bs-border-width: 5px; } - -.border-opacity-10 { - --bs-border-opacity: 0.1; } - -.border-opacity-25 { - --bs-border-opacity: 0.25; } - -.border-opacity-50 { - --bs-border-opacity: 0.5; } - -.border-opacity-75 { - --bs-border-opacity: 0.75; } - -.border-opacity-100 { - --bs-border-opacity: 1; } - -.w-25 { - width: 25% !important; } - -.w-50 { - width: 50% !important; } - -.w-75 { - width: 75% !important; } - -.w-100 { - width: 100% !important; } - -.w-auto { - width: auto !important; } - -.mw-100 { - max-width: 100% !important; } - -.vw-100 { - width: 100vw !important; } - -.min-vw-100 { - min-width: 100vw !important; } - -.h-25 { - height: 25% !important; } - -.h-50 { - height: 50% !important; } - -.h-75 { - height: 75% !important; } - -.h-100 { - height: 100% !important; } - -.h-auto { - height: auto !important; } - -.mh-100 { - max-height: 100% !important; } - -.vh-100 { - height: 100vh !important; } - -.min-vh-100 { - min-height: 100vh !important; } - -.flex-fill { - flex: 1 1 auto !important; } - -.flex-row { - flex-direction: row !important; } - -.flex-column { - flex-direction: column !important; } - -.flex-row-reverse { - flex-direction: row-reverse !important; } - -.flex-column-reverse { - flex-direction: column-reverse !important; } - -.flex-grow-0 { - flex-grow: 0 !important; } - -.flex-grow-1 { - flex-grow: 1 !important; } - -.flex-shrink-0 { - flex-shrink: 0 !important; } - -.flex-shrink-1 { - flex-shrink: 1 !important; } - -.flex-wrap { - flex-wrap: wrap !important; } - -.flex-nowrap { - flex-wrap: nowrap !important; } - -.flex-wrap-reverse { - flex-wrap: wrap-reverse !important; } - -.justify-content-start { - justify-content: flex-start !important; } - -.justify-content-end { - justify-content: flex-end !important; } - -.justify-content-center { - justify-content: center !important; } - -.justify-content-between { - justify-content: space-between !important; } - -.justify-content-around { - justify-content: space-around !important; } - -.justify-content-evenly { - justify-content: space-evenly !important; } - -.align-items-start { - align-items: flex-start !important; } - -.align-items-end { - align-items: flex-end !important; } - -.align-items-center { - align-items: center !important; } - -.align-items-baseline { - align-items: baseline !important; } - -.align-items-stretch { - align-items: stretch !important; } - -.align-content-start { - align-content: flex-start !important; } - -.align-content-end { - align-content: flex-end !important; } - -.align-content-center { - align-content: center !important; } - -.align-content-between { - align-content: space-between !important; } - -.align-content-around { - align-content: space-around !important; } - -.align-content-stretch { - align-content: stretch !important; } - -.align-self-auto { - align-self: auto !important; } - -.align-self-start { - align-self: flex-start !important; } - -.align-self-end { - align-self: flex-end !important; } - -.align-self-center { - align-self: center !important; } - -.align-self-baseline { - align-self: baseline !important; } - -.align-self-stretch { - align-self: stretch !important; } - -.order-first { - order: -1 !important; } - -.order-0 { - order: 0 !important; } - -.order-1 { - order: 1 !important; } - -.order-2 { - order: 2 !important; } - -.order-3 { - order: 3 !important; } - -.order-4 { - order: 4 !important; } - -.order-5 { - order: 5 !important; } - -.order-last { - order: 6 !important; } - -.m-0 { - margin: 0 !important; } - -.m-1 { - margin: 0.25rem !important; } - -.m-2 { - margin: 0.5rem !important; } - -.m-3 { - margin: 1rem !important; } - -.m-4 { - margin: 1.5rem !important; } - -.m-5 { - margin: 3rem !important; } - -.m-auto { - margin: auto !important; } - -.mx-0 { - margin-right: 0 !important; - margin-left: 0 !important; } - -.mx-1 { - margin-right: 0.25rem !important; - margin-left: 0.25rem !important; } - -.mx-2 { - margin-right: 0.5rem !important; - margin-left: 0.5rem !important; } - -.mx-3 { - margin-right: 1rem !important; - margin-left: 1rem !important; } - -.mx-4 { - margin-right: 1.5rem !important; - margin-left: 1.5rem !important; } - -.mx-5 { - margin-right: 3rem !important; - margin-left: 3rem !important; } - -.mx-auto { - margin-right: auto !important; - margin-left: auto !important; } - -.my-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; } - -.my-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; } - -.my-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; } - -.my-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; } - -.my-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; } - -.my-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; } - -.my-auto { - margin-top: auto !important; - margin-bottom: auto !important; } - -.mt-0 { - margin-top: 0 !important; } - -.mt-1 { - margin-top: 0.25rem !important; } - -.mt-2 { - margin-top: 0.5rem !important; } - -.mt-3 { - margin-top: 1rem !important; } - -.mt-4 { - margin-top: 1.5rem !important; } - -.mt-5 { - margin-top: 3rem !important; } - -.mt-auto { - margin-top: auto !important; } - -.me-0 { - margin-right: 0 !important; } - -.me-1 { - margin-right: 0.25rem !important; } - -.me-2 { - margin-right: 0.5rem !important; } - -.me-3 { - margin-right: 1rem !important; } - -.me-4 { - margin-right: 1.5rem !important; } - -.me-5 { - margin-right: 3rem !important; } - -.me-auto { - margin-right: auto !important; } - -.mb-0 { - margin-bottom: 0 !important; } - -.mb-1 { - margin-bottom: 0.25rem !important; } - -.mb-2 { - margin-bottom: 0.5rem !important; } - -.mb-3 { - margin-bottom: 1rem !important; } - -.mb-4 { - margin-bottom: 1.5rem !important; } - -.mb-5 { - margin-bottom: 3rem !important; } - -.mb-auto { - margin-bottom: auto !important; } - -.ms-0 { - margin-left: 0 !important; } - -.ms-1 { - margin-left: 0.25rem !important; } - -.ms-2 { - margin-left: 0.5rem !important; } - -.ms-3 { - margin-left: 1rem !important; } - -.ms-4 { - margin-left: 1.5rem !important; } - -.ms-5 { - margin-left: 3rem !important; } - -.ms-auto { - margin-left: auto !important; } - -.m-n1 { - margin: -0.25rem !important; } - -.m-n2 { - margin: -0.5rem !important; } - -.m-n3 { - margin: -1rem !important; } - -.m-n4 { - margin: -1.5rem !important; } - -.m-n5 { - margin: -3rem !important; } - -.mx-n1 { - margin-right: -0.25rem !important; - margin-left: -0.25rem !important; } - -.mx-n2 { - margin-right: -0.5rem !important; - margin-left: -0.5rem !important; } - -.mx-n3 { - margin-right: -1rem !important; - margin-left: -1rem !important; } - -.mx-n4 { - margin-right: -1.5rem !important; - margin-left: -1.5rem !important; } - -.mx-n5 { - margin-right: -3rem !important; - margin-left: -3rem !important; } - -.my-n1 { - margin-top: -0.25rem !important; - margin-bottom: -0.25rem !important; } - -.my-n2 { - margin-top: -0.5rem !important; - margin-bottom: -0.5rem !important; } - -.my-n3 { - margin-top: -1rem !important; - margin-bottom: -1rem !important; } - -.my-n4 { - margin-top: -1.5rem !important; - margin-bottom: -1.5rem !important; } - -.my-n5 { - margin-top: -3rem !important; - margin-bottom: -3rem !important; } - -.mt-n1 { - margin-top: -0.25rem !important; } - -.mt-n2 { - margin-top: -0.5rem !important; } - -.mt-n3 { - margin-top: -1rem !important; } - -.mt-n4 { - margin-top: -1.5rem !important; } - -.mt-n5 { - margin-top: -3rem !important; } - -.me-n1 { - margin-right: -0.25rem !important; } - -.me-n2 { - margin-right: -0.5rem !important; } - -.me-n3 { - margin-right: -1rem !important; } - -.me-n4 { - margin-right: -1.5rem !important; } - -.me-n5 { - margin-right: -3rem !important; } - -.mb-n1 { - margin-bottom: -0.25rem !important; } - -.mb-n2 { - margin-bottom: -0.5rem !important; } - -.mb-n3 { - margin-bottom: -1rem !important; } - -.mb-n4 { - margin-bottom: -1.5rem !important; } - -.mb-n5 { - margin-bottom: -3rem !important; } - -.ms-n1 { - margin-left: -0.25rem !important; } - -.ms-n2 { - margin-left: -0.5rem !important; } - -.ms-n3 { - margin-left: -1rem !important; } - -.ms-n4 { - margin-left: -1.5rem !important; } - -.ms-n5 { - margin-left: -3rem !important; } - -.p-0 { - padding: 0 !important; } - -.p-1 { - padding: 0.25rem !important; } - -.p-2 { - padding: 0.5rem !important; } - -.p-3 { - padding: 1rem !important; } - -.p-4 { - padding: 1.5rem !important; } - -.p-5 { - padding: 3rem !important; } - -.px-0 { - padding-right: 0 !important; - padding-left: 0 !important; } - -.px-1 { - padding-right: 0.25rem !important; - padding-left: 0.25rem !important; } - -.px-2 { - padding-right: 0.5rem !important; - padding-left: 0.5rem !important; } - -.px-3 { - padding-right: 1rem !important; - padding-left: 1rem !important; } - -.px-4 { - padding-right: 1.5rem !important; - padding-left: 1.5rem !important; } - -.px-5 { - padding-right: 3rem !important; - padding-left: 3rem !important; } - -.py-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; } - -.py-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; } - -.py-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; } - -.py-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; } - -.py-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; } - -.py-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; } - -.pt-0 { - padding-top: 0 !important; } - -.pt-1 { - padding-top: 0.25rem !important; } - -.pt-2 { - padding-top: 0.5rem !important; } - -.pt-3 { - padding-top: 1rem !important; } - -.pt-4 { - padding-top: 1.5rem !important; } - -.pt-5 { - padding-top: 3rem !important; } - -.pe-0 { - padding-right: 0 !important; } - -.pe-1 { - padding-right: 0.25rem !important; } - -.pe-2 { - padding-right: 0.5rem !important; } - -.pe-3 { - padding-right: 1rem !important; } - -.pe-4 { - padding-right: 1.5rem !important; } - -.pe-5 { - padding-right: 3rem !important; } - -.pb-0 { - padding-bottom: 0 !important; } - -.pb-1 { - padding-bottom: 0.25rem !important; } - -.pb-2 { - padding-bottom: 0.5rem !important; } - -.pb-3 { - padding-bottom: 1rem !important; } - -.pb-4 { - padding-bottom: 1.5rem !important; } - -.pb-5 { - padding-bottom: 3rem !important; } - -.ps-0 { - padding-left: 0 !important; } - -.ps-1 { - padding-left: 0.25rem !important; } - -.ps-2 { - padding-left: 0.5rem !important; } - -.ps-3 { - padding-left: 1rem !important; } - -.ps-4 { - padding-left: 1.5rem !important; } - -.ps-5 { - padding-left: 3rem !important; } - -.gap-0 { - gap: 0 !important; } - -.gap-1 { - gap: 0.25rem !important; } - -.gap-2 { - gap: 0.5rem !important; } - -.gap-3 { - gap: 1rem !important; } - -.gap-4 { - gap: 1.5rem !important; } - -.gap-5 { - gap: 3rem !important; } - -.font-monospace { - font-family: var(--bs-font-monospace) !important; } - -.fs-1 { - font-size: calc(1.375rem + 1.5vw) !important; } - -.fs-2 { - font-size: calc(1.325rem + 0.9vw) !important; } - -.fs-3 { - font-size: calc(1.3rem + 0.6vw) !important; } - -.fs-4 { - font-size: calc(1.275rem + 0.3vw) !important; } - -.fs-5 { - font-size: 1.25rem !important; } - -.fs-6 { - font-size: 1rem !important; } - -.fst-italic { - font-style: italic !important; } - -.fst-normal { - font-style: normal !important; } - -.fw-light { - font-weight: 300 !important; } - -.fw-lighter { - font-weight: lighter !important; } - -.fw-normal { - font-weight: 400 !important; } - -.fw-bold { - font-weight: 700 !important; } - -.fw-semibold { - font-weight: 600 !important; } - -.fw-bolder { - font-weight: bolder !important; } - -.lh-1 { - line-height: 1 !important; } - -.lh-sm { - line-height: 1.25 !important; } - -.lh-base { - line-height: 1.5 !important; } - -.lh-lg { - line-height: 2 !important; } - -.text-start { - text-align: left !important; } - -.text-end { - text-align: right !important; } - -.text-center { - text-align: center !important; } - -.text-decoration-none { - text-decoration: none !important; } - -.text-decoration-underline { - text-decoration: underline !important; } - -.text-decoration-line-through { - text-decoration: line-through !important; } - -.text-lowercase { - text-transform: lowercase !important; } - -.text-uppercase { - text-transform: uppercase !important; } - -.text-capitalize { - text-transform: capitalize !important; } - -.text-wrap { - white-space: normal !important; } - -.text-nowrap { - white-space: nowrap !important; } - -/* rtl:begin:remove */ -.text-break { - word-wrap: break-word !important; - word-break: break-word !important; } - -/* rtl:end:remove */ -.text-primary { - --bs-text-opacity: 1; - color: rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important; } - -.text-secondary { - --bs-text-opacity: 1; - color: rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important; } - -.text-success { - --bs-text-opacity: 1; - color: rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important; } - -.text-info { - --bs-text-opacity: 1; - color: rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important; } - -.text-warning { - --bs-text-opacity: 1; - color: rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important; } - -.text-danger { - --bs-text-opacity: 1; - color: rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important; } - -.text-light { - --bs-text-opacity: 1; - color: rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important; } - -.text-dark { - --bs-text-opacity: 1; - color: rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important; } - -.text-black { - --bs-text-opacity: 1; - color: rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important; } - -.text-white { - --bs-text-opacity: 1; - color: rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important; } - -.text-body { - --bs-text-opacity: 1; - color: rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important; } - -.text-muted { - --bs-text-opacity: 1; - color: #6c757d !important; } - -.text-black-50 { - --bs-text-opacity: 1; - color: rgba(29, 45, 53, 0.5) !important; } - -.text-white-50 { - --bs-text-opacity: 1; - color: rgba(255, 255, 255, 0.5) !important; } - -.text-reset { - --bs-text-opacity: 1; - color: inherit !important; } - -.text-opacity-25 { - --bs-text-opacity: 0.25; } - -.text-opacity-50 { - --bs-text-opacity: 0.5; } - -.text-opacity-75 { - --bs-text-opacity: 0.75; } - -.text-opacity-100 { - --bs-text-opacity: 1; } - -.bg-primary { - --bs-bg-opacity: 1; - background-color: rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important; } - -.bg-secondary { - --bs-bg-opacity: 1; - background-color: rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important; } - -.bg-success { - --bs-bg-opacity: 1; - background-color: rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important; } - -.bg-info { - --bs-bg-opacity: 1; - background-color: rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important; } - -.bg-warning { - --bs-bg-opacity: 1; - background-color: rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important; } - -.bg-danger { - --bs-bg-opacity: 1; - background-color: rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important; } - -.bg-light { - --bs-bg-opacity: 1; - background-color: rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important; } - -.bg-dark { - --bs-bg-opacity: 1; - background-color: rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important; } - -.bg-black { - --bs-bg-opacity: 1; - background-color: rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important; } - -.bg-white { - --bs-bg-opacity: 1; - background-color: rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important; } - -.bg-body { - --bs-bg-opacity: 1; - background-color: rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important; } - -.bg-transparent { - --bs-bg-opacity: 1; - background-color: transparent !important; } - -.bg-opacity-10 { - --bs-bg-opacity: 0.1; } - -.bg-opacity-25 { - --bs-bg-opacity: 0.25; } - -.bg-opacity-50 { - --bs-bg-opacity: 0.5; } - -.bg-opacity-75 { - --bs-bg-opacity: 0.75; } - -.bg-opacity-100 { - --bs-bg-opacity: 1; } - -.bg-gradient { - background-image: var(--bs-gradient) !important; } - -.user-select-all { - user-select: all !important; } - -.user-select-auto { - user-select: auto !important; } - -.user-select-none { - user-select: none !important; } - -.pe-none { - pointer-events: none !important; } - -.pe-auto { - pointer-events: auto !important; } - -.rounded { - border-radius: var(--bs-border-radius) !important; } - -.rounded-0 { - border-radius: 0 !important; } - -.rounded-1 { - border-radius: var(--bs-border-radius-sm) !important; } - -.rounded-2 { - border-radius: var(--bs-border-radius) !important; } - -.rounded-3 { - border-radius: var(--bs-border-radius-lg) !important; } - -.rounded-4 { - border-radius: var(--bs-border-radius-xl) !important; } - -.rounded-5 { - border-radius: var(--bs-border-radius-2xl) !important; } - -.rounded-circle { - border-radius: 50% !important; } - -.rounded-pill { - border-radius: var(--bs-border-radius-pill) !important; } - -.rounded-top { - border-top-left-radius: var(--bs-border-radius) !important; - border-top-right-radius: var(--bs-border-radius) !important; } - -.rounded-end { - border-top-right-radius: var(--bs-border-radius) !important; - border-bottom-right-radius: var(--bs-border-radius) !important; } - -.rounded-bottom { - border-bottom-right-radius: var(--bs-border-radius) !important; - border-bottom-left-radius: var(--bs-border-radius) !important; } - -.rounded-start { - border-bottom-left-radius: var(--bs-border-radius) !important; - border-top-left-radius: var(--bs-border-radius) !important; } - -.visible { - visibility: visible !important; } - -.invisible { - visibility: hidden !important; } - -@media (min-width: 576px) { - .float-sm-start { - float: left !important; } - .float-sm-end { - float: right !important; } - .float-sm-none { - float: none !important; } - .d-sm-inline { - display: inline !important; } - .d-sm-inline-block { - display: inline-block !important; } - .d-sm-block { - display: block !important; } - .d-sm-grid { - display: grid !important; } - .d-sm-table { - display: table !important; } - .d-sm-table-row { - display: table-row !important; } - .d-sm-table-cell { - display: table-cell !important; } - .d-sm-flex { - display: flex !important; } - .d-sm-inline-flex { - display: inline-flex !important; } - .d-sm-none { - display: none !important; } - .flex-sm-fill { - flex: 1 1 auto !important; } - .flex-sm-row { - flex-direction: row !important; } - .flex-sm-column { - flex-direction: column !important; } - .flex-sm-row-reverse { - flex-direction: row-reverse !important; } - .flex-sm-column-reverse { - flex-direction: column-reverse !important; } - .flex-sm-grow-0 { - flex-grow: 0 !important; } - .flex-sm-grow-1 { - flex-grow: 1 !important; } - .flex-sm-shrink-0 { - flex-shrink: 0 !important; } - .flex-sm-shrink-1 { - flex-shrink: 1 !important; } - .flex-sm-wrap { - flex-wrap: wrap !important; } - .flex-sm-nowrap { - flex-wrap: nowrap !important; } - .flex-sm-wrap-reverse { - flex-wrap: wrap-reverse !important; } - .justify-content-sm-start { - justify-content: flex-start !important; } - .justify-content-sm-end { - justify-content: flex-end !important; } - .justify-content-sm-center { - justify-content: center !important; } - .justify-content-sm-between { - justify-content: space-between !important; } - .justify-content-sm-around { - justify-content: space-around !important; } - .justify-content-sm-evenly { - justify-content: space-evenly !important; } - .align-items-sm-start { - align-items: flex-start !important; } - .align-items-sm-end { - align-items: flex-end !important; } - .align-items-sm-center { - align-items: center !important; } - .align-items-sm-baseline { - align-items: baseline !important; } - .align-items-sm-stretch { - align-items: stretch !important; } - .align-content-sm-start { - align-content: flex-start !important; } - .align-content-sm-end { - align-content: flex-end !important; } - .align-content-sm-center { - align-content: center !important; } - .align-content-sm-between { - align-content: space-between !important; } - .align-content-sm-around { - align-content: space-around !important; } - .align-content-sm-stretch { - align-content: stretch !important; } - .align-self-sm-auto { - align-self: auto !important; } - .align-self-sm-start { - align-self: flex-start !important; } - .align-self-sm-end { - align-self: flex-end !important; } - .align-self-sm-center { - align-self: center !important; } - .align-self-sm-baseline { - align-self: baseline !important; } - .align-self-sm-stretch { - align-self: stretch !important; } - .order-sm-first { - order: -1 !important; } - .order-sm-0 { - order: 0 !important; } - .order-sm-1 { - order: 1 !important; } - .order-sm-2 { - order: 2 !important; } - .order-sm-3 { - order: 3 !important; } - .order-sm-4 { - order: 4 !important; } - .order-sm-5 { - order: 5 !important; } - .order-sm-last { - order: 6 !important; } - .m-sm-0 { - margin: 0 !important; } - .m-sm-1 { - margin: 0.25rem !important; } - .m-sm-2 { - margin: 0.5rem !important; } - .m-sm-3 { - margin: 1rem !important; } - .m-sm-4 { - margin: 1.5rem !important; } - .m-sm-5 { - margin: 3rem !important; } - .m-sm-auto { - margin: auto !important; } - .mx-sm-0 { - margin-right: 0 !important; - margin-left: 0 !important; } - .mx-sm-1 { - margin-right: 0.25rem !important; - margin-left: 0.25rem !important; } - .mx-sm-2 { - margin-right: 0.5rem !important; - margin-left: 0.5rem !important; } - .mx-sm-3 { - margin-right: 1rem !important; - margin-left: 1rem !important; } - .mx-sm-4 { - margin-right: 1.5rem !important; - margin-left: 1.5rem !important; } - .mx-sm-5 { - margin-right: 3rem !important; - margin-left: 3rem !important; } - .mx-sm-auto { - margin-right: auto !important; - margin-left: auto !important; } - .my-sm-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; } - .my-sm-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; } - .my-sm-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; } - .my-sm-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; } - .my-sm-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; } - .my-sm-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; } - .my-sm-auto { - margin-top: auto !important; - margin-bottom: auto !important; } - .mt-sm-0 { - margin-top: 0 !important; } - .mt-sm-1 { - margin-top: 0.25rem !important; } - .mt-sm-2 { - margin-top: 0.5rem !important; } - .mt-sm-3 { - margin-top: 1rem !important; } - .mt-sm-4 { - margin-top: 1.5rem !important; } - .mt-sm-5 { - margin-top: 3rem !important; } - .mt-sm-auto { - margin-top: auto !important; } - .me-sm-0 { - margin-right: 0 !important; } - .me-sm-1 { - margin-right: 0.25rem !important; } - .me-sm-2 { - margin-right: 0.5rem !important; } - .me-sm-3 { - margin-right: 1rem !important; } - .me-sm-4 { - margin-right: 1.5rem !important; } - .me-sm-5 { - margin-right: 3rem !important; } - .me-sm-auto { - margin-right: auto !important; } - .mb-sm-0 { - margin-bottom: 0 !important; } - .mb-sm-1 { - margin-bottom: 0.25rem !important; } - .mb-sm-2 { - margin-bottom: 0.5rem !important; } - .mb-sm-3 { - margin-bottom: 1rem !important; } - .mb-sm-4 { - margin-bottom: 1.5rem !important; } - .mb-sm-5 { - margin-bottom: 3rem !important; } - .mb-sm-auto { - margin-bottom: auto !important; } - .ms-sm-0 { - margin-left: 0 !important; } - .ms-sm-1 { - margin-left: 0.25rem !important; } - .ms-sm-2 { - margin-left: 0.5rem !important; } - .ms-sm-3 { - margin-left: 1rem !important; } - .ms-sm-4 { - margin-left: 1.5rem !important; } - .ms-sm-5 { - margin-left: 3rem !important; } - .ms-sm-auto { - margin-left: auto !important; } - .m-sm-n1 { - margin: -0.25rem !important; } - .m-sm-n2 { - margin: -0.5rem !important; } - .m-sm-n3 { - margin: -1rem !important; } - .m-sm-n4 { - margin: -1.5rem !important; } - .m-sm-n5 { - margin: -3rem !important; } - .mx-sm-n1 { - margin-right: -0.25rem !important; - margin-left: -0.25rem !important; } - .mx-sm-n2 { - margin-right: -0.5rem !important; - margin-left: -0.5rem !important; } - .mx-sm-n3 { - margin-right: -1rem !important; - margin-left: -1rem !important; } - .mx-sm-n4 { - margin-right: -1.5rem !important; - margin-left: -1.5rem !important; } - .mx-sm-n5 { - margin-right: -3rem !important; - margin-left: -3rem !important; } - .my-sm-n1 { - margin-top: -0.25rem !important; - margin-bottom: -0.25rem !important; } - .my-sm-n2 { - margin-top: -0.5rem !important; - margin-bottom: -0.5rem !important; } - .my-sm-n3 { - margin-top: -1rem !important; - margin-bottom: -1rem !important; } - .my-sm-n4 { - margin-top: -1.5rem !important; - margin-bottom: -1.5rem !important; } - .my-sm-n5 { - margin-top: -3rem !important; - margin-bottom: -3rem !important; } - .mt-sm-n1 { - margin-top: -0.25rem !important; } - .mt-sm-n2 { - margin-top: -0.5rem !important; } - .mt-sm-n3 { - margin-top: -1rem !important; } - .mt-sm-n4 { - margin-top: -1.5rem !important; } - .mt-sm-n5 { - margin-top: -3rem !important; } - .me-sm-n1 { - margin-right: -0.25rem !important; } - .me-sm-n2 { - margin-right: -0.5rem !important; } - .me-sm-n3 { - margin-right: -1rem !important; } - .me-sm-n4 { - margin-right: -1.5rem !important; } - .me-sm-n5 { - margin-right: -3rem !important; } - .mb-sm-n1 { - margin-bottom: -0.25rem !important; } - .mb-sm-n2 { - margin-bottom: -0.5rem !important; } - .mb-sm-n3 { - margin-bottom: -1rem !important; } - .mb-sm-n4 { - margin-bottom: -1.5rem !important; } - .mb-sm-n5 { - margin-bottom: -3rem !important; } - .ms-sm-n1 { - margin-left: -0.25rem !important; } - .ms-sm-n2 { - margin-left: -0.5rem !important; } - .ms-sm-n3 { - margin-left: -1rem !important; } - .ms-sm-n4 { - margin-left: -1.5rem !important; } - .ms-sm-n5 { - margin-left: -3rem !important; } - .p-sm-0 { - padding: 0 !important; } - .p-sm-1 { - padding: 0.25rem !important; } - .p-sm-2 { - padding: 0.5rem !important; } - .p-sm-3 { - padding: 1rem !important; } - .p-sm-4 { - padding: 1.5rem !important; } - .p-sm-5 { - padding: 3rem !important; } - .px-sm-0 { - padding-right: 0 !important; - padding-left: 0 !important; } - .px-sm-1 { - padding-right: 0.25rem !important; - padding-left: 0.25rem !important; } - .px-sm-2 { - padding-right: 0.5rem !important; - padding-left: 0.5rem !important; } - .px-sm-3 { - padding-right: 1rem !important; - padding-left: 1rem !important; } - .px-sm-4 { - padding-right: 1.5rem !important; - padding-left: 1.5rem !important; } - .px-sm-5 { - padding-right: 3rem !important; - padding-left: 3rem !important; } - .py-sm-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; } - .py-sm-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; } - .py-sm-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; } - .py-sm-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; } - .py-sm-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; } - .py-sm-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; } - .pt-sm-0 { - padding-top: 0 !important; } - .pt-sm-1 { - padding-top: 0.25rem !important; } - .pt-sm-2 { - padding-top: 0.5rem !important; } - .pt-sm-3 { - padding-top: 1rem !important; } - .pt-sm-4 { - padding-top: 1.5rem !important; } - .pt-sm-5 { - padding-top: 3rem !important; } - .pe-sm-0 { - padding-right: 0 !important; } - .pe-sm-1 { - padding-right: 0.25rem !important; } - .pe-sm-2 { - padding-right: 0.5rem !important; } - .pe-sm-3 { - padding-right: 1rem !important; } - .pe-sm-4 { - padding-right: 1.5rem !important; } - .pe-sm-5 { - padding-right: 3rem !important; } - .pb-sm-0 { - padding-bottom: 0 !important; } - .pb-sm-1 { - padding-bottom: 0.25rem !important; } - .pb-sm-2 { - padding-bottom: 0.5rem !important; } - .pb-sm-3 { - padding-bottom: 1rem !important; } - .pb-sm-4 { - padding-bottom: 1.5rem !important; } - .pb-sm-5 { - padding-bottom: 3rem !important; } - .ps-sm-0 { - padding-left: 0 !important; } - .ps-sm-1 { - padding-left: 0.25rem !important; } - .ps-sm-2 { - padding-left: 0.5rem !important; } - .ps-sm-3 { - padding-left: 1rem !important; } - .ps-sm-4 { - padding-left: 1.5rem !important; } - .ps-sm-5 { - padding-left: 3rem !important; } - .gap-sm-0 { - gap: 0 !important; } - .gap-sm-1 { - gap: 0.25rem !important; } - .gap-sm-2 { - gap: 0.5rem !important; } - .gap-sm-3 { - gap: 1rem !important; } - .gap-sm-4 { - gap: 1.5rem !important; } - .gap-sm-5 { - gap: 3rem !important; } - .text-sm-start { - text-align: left !important; } - .text-sm-end { - text-align: right !important; } - .text-sm-center { - text-align: center !important; } } - -@media (min-width: 768px) { - .float-md-start { - float: left !important; } - .float-md-end { - float: right !important; } - .float-md-none { - float: none !important; } - .d-md-inline { - display: inline !important; } - .d-md-inline-block { - display: inline-block !important; } - .d-md-block { - display: block !important; } - .d-md-grid { - display: grid !important; } - .d-md-table { - display: table !important; } - .d-md-table-row { - display: table-row !important; } - .d-md-table-cell { - display: table-cell !important; } - .d-md-flex { - display: flex !important; } - .d-md-inline-flex { - display: inline-flex !important; } - .d-md-none { - display: none !important; } - .flex-md-fill { - flex: 1 1 auto !important; } - .flex-md-row { - flex-direction: row !important; } - .flex-md-column { - flex-direction: column !important; } - .flex-md-row-reverse { - flex-direction: row-reverse !important; } - .flex-md-column-reverse { - flex-direction: column-reverse !important; } - .flex-md-grow-0 { - flex-grow: 0 !important; } - .flex-md-grow-1 { - flex-grow: 1 !important; } - .flex-md-shrink-0 { - flex-shrink: 0 !important; } - .flex-md-shrink-1 { - flex-shrink: 1 !important; } - .flex-md-wrap { - flex-wrap: wrap !important; } - .flex-md-nowrap { - flex-wrap: nowrap !important; } - .flex-md-wrap-reverse { - flex-wrap: wrap-reverse !important; } - .justify-content-md-start { - justify-content: flex-start !important; } - .justify-content-md-end { - justify-content: flex-end !important; } - .justify-content-md-center { - justify-content: center !important; } - .justify-content-md-between { - justify-content: space-between !important; } - .justify-content-md-around { - justify-content: space-around !important; } - .justify-content-md-evenly { - justify-content: space-evenly !important; } - .align-items-md-start { - align-items: flex-start !important; } - .align-items-md-end { - align-items: flex-end !important; } - .align-items-md-center { - align-items: center !important; } - .align-items-md-baseline { - align-items: baseline !important; } - .align-items-md-stretch { - align-items: stretch !important; } - .align-content-md-start { - align-content: flex-start !important; } - .align-content-md-end { - align-content: flex-end !important; } - .align-content-md-center { - align-content: center !important; } - .align-content-md-between { - align-content: space-between !important; } - .align-content-md-around { - align-content: space-around !important; } - .align-content-md-stretch { - align-content: stretch !important; } - .align-self-md-auto { - align-self: auto !important; } - .align-self-md-start { - align-self: flex-start !important; } - .align-self-md-end { - align-self: flex-end !important; } - .align-self-md-center { - align-self: center !important; } - .align-self-md-baseline { - align-self: baseline !important; } - .align-self-md-stretch { - align-self: stretch !important; } - .order-md-first { - order: -1 !important; } - .order-md-0 { - order: 0 !important; } - .order-md-1 { - order: 1 !important; } - .order-md-2 { - order: 2 !important; } - .order-md-3 { - order: 3 !important; } - .order-md-4 { - order: 4 !important; } - .order-md-5 { - order: 5 !important; } - .order-md-last { - order: 6 !important; } - .m-md-0 { - margin: 0 !important; } - .m-md-1 { - margin: 0.25rem !important; } - .m-md-2 { - margin: 0.5rem !important; } - .m-md-3 { - margin: 1rem !important; } - .m-md-4 { - margin: 1.5rem !important; } - .m-md-5 { - margin: 3rem !important; } - .m-md-auto { - margin: auto !important; } - .mx-md-0 { - margin-right: 0 !important; - margin-left: 0 !important; } - .mx-md-1 { - margin-right: 0.25rem !important; - margin-left: 0.25rem !important; } - .mx-md-2 { - margin-right: 0.5rem !important; - margin-left: 0.5rem !important; } - .mx-md-3 { - margin-right: 1rem !important; - margin-left: 1rem !important; } - .mx-md-4 { - margin-right: 1.5rem !important; - margin-left: 1.5rem !important; } - .mx-md-5 { - margin-right: 3rem !important; - margin-left: 3rem !important; } - .mx-md-auto { - margin-right: auto !important; - margin-left: auto !important; } - .my-md-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; } - .my-md-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; } - .my-md-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; } - .my-md-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; } - .my-md-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; } - .my-md-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; } - .my-md-auto { - margin-top: auto !important; - margin-bottom: auto !important; } - .mt-md-0 { - margin-top: 0 !important; } - .mt-md-1 { - margin-top: 0.25rem !important; } - .mt-md-2 { - margin-top: 0.5rem !important; } - .mt-md-3 { - margin-top: 1rem !important; } - .mt-md-4 { - margin-top: 1.5rem !important; } - .mt-md-5 { - margin-top: 3rem !important; } - .mt-md-auto { - margin-top: auto !important; } - .me-md-0 { - margin-right: 0 !important; } - .me-md-1 { - margin-right: 0.25rem !important; } - .me-md-2 { - margin-right: 0.5rem !important; } - .me-md-3 { - margin-right: 1rem !important; } - .me-md-4 { - margin-right: 1.5rem !important; } - .me-md-5 { - margin-right: 3rem !important; } - .me-md-auto { - margin-right: auto !important; } - .mb-md-0 { - margin-bottom: 0 !important; } - .mb-md-1 { - margin-bottom: 0.25rem !important; } - .mb-md-2 { - margin-bottom: 0.5rem !important; } - .mb-md-3 { - margin-bottom: 1rem !important; } - .mb-md-4 { - margin-bottom: 1.5rem !important; } - .mb-md-5 { - margin-bottom: 3rem !important; } - .mb-md-auto { - margin-bottom: auto !important; } - .ms-md-0 { - margin-left: 0 !important; } - .ms-md-1 { - margin-left: 0.25rem !important; } - .ms-md-2 { - margin-left: 0.5rem !important; } - .ms-md-3 { - margin-left: 1rem !important; } - .ms-md-4 { - margin-left: 1.5rem !important; } - .ms-md-5 { - margin-left: 3rem !important; } - .ms-md-auto { - margin-left: auto !important; } - .m-md-n1 { - margin: -0.25rem !important; } - .m-md-n2 { - margin: -0.5rem !important; } - .m-md-n3 { - margin: -1rem !important; } - .m-md-n4 { - margin: -1.5rem !important; } - .m-md-n5 { - margin: -3rem !important; } - .mx-md-n1 { - margin-right: -0.25rem !important; - margin-left: -0.25rem !important; } - .mx-md-n2 { - margin-right: -0.5rem !important; - margin-left: -0.5rem !important; } - .mx-md-n3 { - margin-right: -1rem !important; - margin-left: -1rem !important; } - .mx-md-n4 { - margin-right: -1.5rem !important; - margin-left: -1.5rem !important; } - .mx-md-n5 { - margin-right: -3rem !important; - margin-left: -3rem !important; } - .my-md-n1 { - margin-top: -0.25rem !important; - margin-bottom: -0.25rem !important; } - .my-md-n2 { - margin-top: -0.5rem !important; - margin-bottom: -0.5rem !important; } - .my-md-n3 { - margin-top: -1rem !important; - margin-bottom: -1rem !important; } - .my-md-n4 { - margin-top: -1.5rem !important; - margin-bottom: -1.5rem !important; } - .my-md-n5 { - margin-top: -3rem !important; - margin-bottom: -3rem !important; } - .mt-md-n1 { - margin-top: -0.25rem !important; } - .mt-md-n2 { - margin-top: -0.5rem !important; } - .mt-md-n3 { - margin-top: -1rem !important; } - .mt-md-n4 { - margin-top: -1.5rem !important; } - .mt-md-n5 { - margin-top: -3rem !important; } - .me-md-n1 { - margin-right: -0.25rem !important; } - .me-md-n2 { - margin-right: -0.5rem !important; } - .me-md-n3 { - margin-right: -1rem !important; } - .me-md-n4 { - margin-right: -1.5rem !important; } - .me-md-n5 { - margin-right: -3rem !important; } - .mb-md-n1 { - margin-bottom: -0.25rem !important; } - .mb-md-n2 { - margin-bottom: -0.5rem !important; } - .mb-md-n3 { - margin-bottom: -1rem !important; } - .mb-md-n4 { - margin-bottom: -1.5rem !important; } - .mb-md-n5 { - margin-bottom: -3rem !important; } - .ms-md-n1 { - margin-left: -0.25rem !important; } - .ms-md-n2 { - margin-left: -0.5rem !important; } - .ms-md-n3 { - margin-left: -1rem !important; } - .ms-md-n4 { - margin-left: -1.5rem !important; } - .ms-md-n5 { - margin-left: -3rem !important; } - .p-md-0 { - padding: 0 !important; } - .p-md-1 { - padding: 0.25rem !important; } - .p-md-2 { - padding: 0.5rem !important; } - .p-md-3 { - padding: 1rem !important; } - .p-md-4 { - padding: 1.5rem !important; } - .p-md-5 { - padding: 3rem !important; } - .px-md-0 { - padding-right: 0 !important; - padding-left: 0 !important; } - .px-md-1 { - padding-right: 0.25rem !important; - padding-left: 0.25rem !important; } - .px-md-2 { - padding-right: 0.5rem !important; - padding-left: 0.5rem !important; } - .px-md-3 { - padding-right: 1rem !important; - padding-left: 1rem !important; } - .px-md-4 { - padding-right: 1.5rem !important; - padding-left: 1.5rem !important; } - .px-md-5 { - padding-right: 3rem !important; - padding-left: 3rem !important; } - .py-md-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; } - .py-md-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; } - .py-md-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; } - .py-md-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; } - .py-md-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; } - .py-md-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; } - .pt-md-0 { - padding-top: 0 !important; } - .pt-md-1 { - padding-top: 0.25rem !important; } - .pt-md-2 { - padding-top: 0.5rem !important; } - .pt-md-3 { - padding-top: 1rem !important; } - .pt-md-4 { - padding-top: 1.5rem !important; } - .pt-md-5 { - padding-top: 3rem !important; } - .pe-md-0 { - padding-right: 0 !important; } - .pe-md-1 { - padding-right: 0.25rem !important; } - .pe-md-2 { - padding-right: 0.5rem !important; } - .pe-md-3 { - padding-right: 1rem !important; } - .pe-md-4 { - padding-right: 1.5rem !important; } - .pe-md-5 { - padding-right: 3rem !important; } - .pb-md-0 { - padding-bottom: 0 !important; } - .pb-md-1 { - padding-bottom: 0.25rem !important; } - .pb-md-2 { - padding-bottom: 0.5rem !important; } - .pb-md-3 { - padding-bottom: 1rem !important; } - .pb-md-4 { - padding-bottom: 1.5rem !important; } - .pb-md-5 { - padding-bottom: 3rem !important; } - .ps-md-0 { - padding-left: 0 !important; } - .ps-md-1 { - padding-left: 0.25rem !important; } - .ps-md-2 { - padding-left: 0.5rem !important; } - .ps-md-3 { - padding-left: 1rem !important; } - .ps-md-4 { - padding-left: 1.5rem !important; } - .ps-md-5 { - padding-left: 3rem !important; } - .gap-md-0 { - gap: 0 !important; } - .gap-md-1 { - gap: 0.25rem !important; } - .gap-md-2 { - gap: 0.5rem !important; } - .gap-md-3 { - gap: 1rem !important; } - .gap-md-4 { - gap: 1.5rem !important; } - .gap-md-5 { - gap: 3rem !important; } - .text-md-start { - text-align: left !important; } - .text-md-end { - text-align: right !important; } - .text-md-center { - text-align: center !important; } } - -@media (min-width: 992px) { - .float-lg-start { - float: left !important; } - .float-lg-end { - float: right !important; } - .float-lg-none { - float: none !important; } - .d-lg-inline { - display: inline !important; } - .d-lg-inline-block { - display: inline-block !important; } - .d-lg-block { - display: block !important; } - .d-lg-grid { - display: grid !important; } - .d-lg-table { - display: table !important; } - .d-lg-table-row { - display: table-row !important; } - .d-lg-table-cell { - display: table-cell !important; } - .d-lg-flex { - display: flex !important; } - .d-lg-inline-flex { - display: inline-flex !important; } - .d-lg-none { - display: none !important; } - .flex-lg-fill { - flex: 1 1 auto !important; } - .flex-lg-row { - flex-direction: row !important; } - .flex-lg-column { - flex-direction: column !important; } - .flex-lg-row-reverse { - flex-direction: row-reverse !important; } - .flex-lg-column-reverse { - flex-direction: column-reverse !important; } - .flex-lg-grow-0 { - flex-grow: 0 !important; } - .flex-lg-grow-1 { - flex-grow: 1 !important; } - .flex-lg-shrink-0 { - flex-shrink: 0 !important; } - .flex-lg-shrink-1 { - flex-shrink: 1 !important; } - .flex-lg-wrap { - flex-wrap: wrap !important; } - .flex-lg-nowrap { - flex-wrap: nowrap !important; } - .flex-lg-wrap-reverse { - flex-wrap: wrap-reverse !important; } - .justify-content-lg-start { - justify-content: flex-start !important; } - .justify-content-lg-end { - justify-content: flex-end !important; } - .justify-content-lg-center { - justify-content: center !important; } - .justify-content-lg-between { - justify-content: space-between !important; } - .justify-content-lg-around { - justify-content: space-around !important; } - .justify-content-lg-evenly { - justify-content: space-evenly !important; } - .align-items-lg-start { - align-items: flex-start !important; } - .align-items-lg-end { - align-items: flex-end !important; } - .align-items-lg-center { - align-items: center !important; } - .align-items-lg-baseline { - align-items: baseline !important; } - .align-items-lg-stretch { - align-items: stretch !important; } - .align-content-lg-start { - align-content: flex-start !important; } - .align-content-lg-end { - align-content: flex-end !important; } - .align-content-lg-center { - align-content: center !important; } - .align-content-lg-between { - align-content: space-between !important; } - .align-content-lg-around { - align-content: space-around !important; } - .align-content-lg-stretch { - align-content: stretch !important; } - .align-self-lg-auto { - align-self: auto !important; } - .align-self-lg-start { - align-self: flex-start !important; } - .align-self-lg-end { - align-self: flex-end !important; } - .align-self-lg-center { - align-self: center !important; } - .align-self-lg-baseline { - align-self: baseline !important; } - .align-self-lg-stretch { - align-self: stretch !important; } - .order-lg-first { - order: -1 !important; } - .order-lg-0 { - order: 0 !important; } - .order-lg-1 { - order: 1 !important; } - .order-lg-2 { - order: 2 !important; } - .order-lg-3 { - order: 3 !important; } - .order-lg-4 { - order: 4 !important; } - .order-lg-5 { - order: 5 !important; } - .order-lg-last { - order: 6 !important; } - .m-lg-0 { - margin: 0 !important; } - .m-lg-1 { - margin: 0.25rem !important; } - .m-lg-2 { - margin: 0.5rem !important; } - .m-lg-3 { - margin: 1rem !important; } - .m-lg-4 { - margin: 1.5rem !important; } - .m-lg-5 { - margin: 3rem !important; } - .m-lg-auto { - margin: auto !important; } - .mx-lg-0 { - margin-right: 0 !important; - margin-left: 0 !important; } - .mx-lg-1 { - margin-right: 0.25rem !important; - margin-left: 0.25rem !important; } - .mx-lg-2 { - margin-right: 0.5rem !important; - margin-left: 0.5rem !important; } - .mx-lg-3 { - margin-right: 1rem !important; - margin-left: 1rem !important; } - .mx-lg-4 { - margin-right: 1.5rem !important; - margin-left: 1.5rem !important; } - .mx-lg-5 { - margin-right: 3rem !important; - margin-left: 3rem !important; } - .mx-lg-auto { - margin-right: auto !important; - margin-left: auto !important; } - .my-lg-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; } - .my-lg-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; } - .my-lg-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; } - .my-lg-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; } - .my-lg-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; } - .my-lg-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; } - .my-lg-auto { - margin-top: auto !important; - margin-bottom: auto !important; } - .mt-lg-0 { - margin-top: 0 !important; } - .mt-lg-1 { - margin-top: 0.25rem !important; } - .mt-lg-2 { - margin-top: 0.5rem !important; } - .mt-lg-3 { - margin-top: 1rem !important; } - .mt-lg-4 { - margin-top: 1.5rem !important; } - .mt-lg-5 { - margin-top: 3rem !important; } - .mt-lg-auto { - margin-top: auto !important; } - .me-lg-0 { - margin-right: 0 !important; } - .me-lg-1 { - margin-right: 0.25rem !important; } - .me-lg-2 { - margin-right: 0.5rem !important; } - .me-lg-3 { - margin-right: 1rem !important; } - .me-lg-4 { - margin-right: 1.5rem !important; } - .me-lg-5 { - margin-right: 3rem !important; } - .me-lg-auto { - margin-right: auto !important; } - .mb-lg-0 { - margin-bottom: 0 !important; } - .mb-lg-1 { - margin-bottom: 0.25rem !important; } - .mb-lg-2 { - margin-bottom: 0.5rem !important; } - .mb-lg-3 { - margin-bottom: 1rem !important; } - .mb-lg-4 { - margin-bottom: 1.5rem !important; } - .mb-lg-5 { - margin-bottom: 3rem !important; } - .mb-lg-auto { - margin-bottom: auto !important; } - .ms-lg-0 { - margin-left: 0 !important; } - .ms-lg-1 { - margin-left: 0.25rem !important; } - .ms-lg-2 { - margin-left: 0.5rem !important; } - .ms-lg-3 { - margin-left: 1rem !important; } - .ms-lg-4 { - margin-left: 1.5rem !important; } - .ms-lg-5 { - margin-left: 3rem !important; } - .ms-lg-auto { - margin-left: auto !important; } - .m-lg-n1 { - margin: -0.25rem !important; } - .m-lg-n2 { - margin: -0.5rem !important; } - .m-lg-n3 { - margin: -1rem !important; } - .m-lg-n4 { - margin: -1.5rem !important; } - .m-lg-n5 { - margin: -3rem !important; } - .mx-lg-n1 { - margin-right: -0.25rem !important; - margin-left: -0.25rem !important; } - .mx-lg-n2 { - margin-right: -0.5rem !important; - margin-left: -0.5rem !important; } - .mx-lg-n3 { - margin-right: -1rem !important; - margin-left: -1rem !important; } - .mx-lg-n4 { - margin-right: -1.5rem !important; - margin-left: -1.5rem !important; } - .mx-lg-n5 { - margin-right: -3rem !important; - margin-left: -3rem !important; } - .my-lg-n1 { - margin-top: -0.25rem !important; - margin-bottom: -0.25rem !important; } - .my-lg-n2 { - margin-top: -0.5rem !important; - margin-bottom: -0.5rem !important; } - .my-lg-n3 { - margin-top: -1rem !important; - margin-bottom: -1rem !important; } - .my-lg-n4 { - margin-top: -1.5rem !important; - margin-bottom: -1.5rem !important; } - .my-lg-n5 { - margin-top: -3rem !important; - margin-bottom: -3rem !important; } - .mt-lg-n1 { - margin-top: -0.25rem !important; } - .mt-lg-n2 { - margin-top: -0.5rem !important; } - .mt-lg-n3 { - margin-top: -1rem !important; } - .mt-lg-n4 { - margin-top: -1.5rem !important; } - .mt-lg-n5 { - margin-top: -3rem !important; } - .me-lg-n1 { - margin-right: -0.25rem !important; } - .me-lg-n2 { - margin-right: -0.5rem !important; } - .me-lg-n3 { - margin-right: -1rem !important; } - .me-lg-n4 { - margin-right: -1.5rem !important; } - .me-lg-n5 { - margin-right: -3rem !important; } - .mb-lg-n1 { - margin-bottom: -0.25rem !important; } - .mb-lg-n2 { - margin-bottom: -0.5rem !important; } - .mb-lg-n3 { - margin-bottom: -1rem !important; } - .mb-lg-n4 { - margin-bottom: -1.5rem !important; } - .mb-lg-n5 { - margin-bottom: -3rem !important; } - .ms-lg-n1 { - margin-left: -0.25rem !important; } - .ms-lg-n2 { - margin-left: -0.5rem !important; } - .ms-lg-n3 { - margin-left: -1rem !important; } - .ms-lg-n4 { - margin-left: -1.5rem !important; } - .ms-lg-n5 { - margin-left: -3rem !important; } - .p-lg-0 { - padding: 0 !important; } - .p-lg-1 { - padding: 0.25rem !important; } - .p-lg-2 { - padding: 0.5rem !important; } - .p-lg-3 { - padding: 1rem !important; } - .p-lg-4 { - padding: 1.5rem !important; } - .p-lg-5 { - padding: 3rem !important; } - .px-lg-0 { - padding-right: 0 !important; - padding-left: 0 !important; } - .px-lg-1 { - padding-right: 0.25rem !important; - padding-left: 0.25rem !important; } - .px-lg-2 { - padding-right: 0.5rem !important; - padding-left: 0.5rem !important; } - .px-lg-3 { - padding-right: 1rem !important; - padding-left: 1rem !important; } - .px-lg-4 { - padding-right: 1.5rem !important; - padding-left: 1.5rem !important; } - .px-lg-5 { - padding-right: 3rem !important; - padding-left: 3rem !important; } - .py-lg-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; } - .py-lg-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; } - .py-lg-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; } - .py-lg-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; } - .py-lg-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; } - .py-lg-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; } - .pt-lg-0 { - padding-top: 0 !important; } - .pt-lg-1 { - padding-top: 0.25rem !important; } - .pt-lg-2 { - padding-top: 0.5rem !important; } - .pt-lg-3 { - padding-top: 1rem !important; } - .pt-lg-4 { - padding-top: 1.5rem !important; } - .pt-lg-5 { - padding-top: 3rem !important; } - .pe-lg-0 { - padding-right: 0 !important; } - .pe-lg-1 { - padding-right: 0.25rem !important; } - .pe-lg-2 { - padding-right: 0.5rem !important; } - .pe-lg-3 { - padding-right: 1rem !important; } - .pe-lg-4 { - padding-right: 1.5rem !important; } - .pe-lg-5 { - padding-right: 3rem !important; } - .pb-lg-0 { - padding-bottom: 0 !important; } - .pb-lg-1 { - padding-bottom: 0.25rem !important; } - .pb-lg-2 { - padding-bottom: 0.5rem !important; } - .pb-lg-3 { - padding-bottom: 1rem !important; } - .pb-lg-4 { - padding-bottom: 1.5rem !important; } - .pb-lg-5 { - padding-bottom: 3rem !important; } - .ps-lg-0 { - padding-left: 0 !important; } - .ps-lg-1 { - padding-left: 0.25rem !important; } - .ps-lg-2 { - padding-left: 0.5rem !important; } - .ps-lg-3 { - padding-left: 1rem !important; } - .ps-lg-4 { - padding-left: 1.5rem !important; } - .ps-lg-5 { - padding-left: 3rem !important; } - .gap-lg-0 { - gap: 0 !important; } - .gap-lg-1 { - gap: 0.25rem !important; } - .gap-lg-2 { - gap: 0.5rem !important; } - .gap-lg-3 { - gap: 1rem !important; } - .gap-lg-4 { - gap: 1.5rem !important; } - .gap-lg-5 { - gap: 3rem !important; } - .text-lg-start { - text-align: left !important; } - .text-lg-end { - text-align: right !important; } - .text-lg-center { - text-align: center !important; } } - -@media (min-width: 1200px) { - .float-xl-start { - float: left !important; } - .float-xl-end { - float: right !important; } - .float-xl-none { - float: none !important; } - .d-xl-inline { - display: inline !important; } - .d-xl-inline-block { - display: inline-block !important; } - .d-xl-block { - display: block !important; } - .d-xl-grid { - display: grid !important; } - .d-xl-table { - display: table !important; } - .d-xl-table-row { - display: table-row !important; } - .d-xl-table-cell { - display: table-cell !important; } - .d-xl-flex { - display: flex !important; } - .d-xl-inline-flex { - display: inline-flex !important; } - .d-xl-none { - display: none !important; } - .flex-xl-fill { - flex: 1 1 auto !important; } - .flex-xl-row { - flex-direction: row !important; } - .flex-xl-column { - flex-direction: column !important; } - .flex-xl-row-reverse { - flex-direction: row-reverse !important; } - .flex-xl-column-reverse { - flex-direction: column-reverse !important; } - .flex-xl-grow-0 { - flex-grow: 0 !important; } - .flex-xl-grow-1 { - flex-grow: 1 !important; } - .flex-xl-shrink-0 { - flex-shrink: 0 !important; } - .flex-xl-shrink-1 { - flex-shrink: 1 !important; } - .flex-xl-wrap { - flex-wrap: wrap !important; } - .flex-xl-nowrap { - flex-wrap: nowrap !important; } - .flex-xl-wrap-reverse { - flex-wrap: wrap-reverse !important; } - .justify-content-xl-start { - justify-content: flex-start !important; } - .justify-content-xl-end { - justify-content: flex-end !important; } - .justify-content-xl-center { - justify-content: center !important; } - .justify-content-xl-between { - justify-content: space-between !important; } - .justify-content-xl-around { - justify-content: space-around !important; } - .justify-content-xl-evenly { - justify-content: space-evenly !important; } - .align-items-xl-start { - align-items: flex-start !important; } - .align-items-xl-end { - align-items: flex-end !important; } - .align-items-xl-center { - align-items: center !important; } - .align-items-xl-baseline { - align-items: baseline !important; } - .align-items-xl-stretch { - align-items: stretch !important; } - .align-content-xl-start { - align-content: flex-start !important; } - .align-content-xl-end { - align-content: flex-end !important; } - .align-content-xl-center { - align-content: center !important; } - .align-content-xl-between { - align-content: space-between !important; } - .align-content-xl-around { - align-content: space-around !important; } - .align-content-xl-stretch { - align-content: stretch !important; } - .align-self-xl-auto { - align-self: auto !important; } - .align-self-xl-start { - align-self: flex-start !important; } - .align-self-xl-end { - align-self: flex-end !important; } - .align-self-xl-center { - align-self: center !important; } - .align-self-xl-baseline { - align-self: baseline !important; } - .align-self-xl-stretch { - align-self: stretch !important; } - .order-xl-first { - order: -1 !important; } - .order-xl-0 { - order: 0 !important; } - .order-xl-1 { - order: 1 !important; } - .order-xl-2 { - order: 2 !important; } - .order-xl-3 { - order: 3 !important; } - .order-xl-4 { - order: 4 !important; } - .order-xl-5 { - order: 5 !important; } - .order-xl-last { - order: 6 !important; } - .m-xl-0 { - margin: 0 !important; } - .m-xl-1 { - margin: 0.25rem !important; } - .m-xl-2 { - margin: 0.5rem !important; } - .m-xl-3 { - margin: 1rem !important; } - .m-xl-4 { - margin: 1.5rem !important; } - .m-xl-5 { - margin: 3rem !important; } - .m-xl-auto { - margin: auto !important; } - .mx-xl-0 { - margin-right: 0 !important; - margin-left: 0 !important; } - .mx-xl-1 { - margin-right: 0.25rem !important; - margin-left: 0.25rem !important; } - .mx-xl-2 { - margin-right: 0.5rem !important; - margin-left: 0.5rem !important; } - .mx-xl-3 { - margin-right: 1rem !important; - margin-left: 1rem !important; } - .mx-xl-4 { - margin-right: 1.5rem !important; - margin-left: 1.5rem !important; } - .mx-xl-5 { - margin-right: 3rem !important; - margin-left: 3rem !important; } - .mx-xl-auto { - margin-right: auto !important; - margin-left: auto !important; } - .my-xl-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; } - .my-xl-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; } - .my-xl-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; } - .my-xl-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; } - .my-xl-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; } - .my-xl-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; } - .my-xl-auto { - margin-top: auto !important; - margin-bottom: auto !important; } - .mt-xl-0 { - margin-top: 0 !important; } - .mt-xl-1 { - margin-top: 0.25rem !important; } - .mt-xl-2 { - margin-top: 0.5rem !important; } - .mt-xl-3 { - margin-top: 1rem !important; } - .mt-xl-4 { - margin-top: 1.5rem !important; } - .mt-xl-5 { - margin-top: 3rem !important; } - .mt-xl-auto { - margin-top: auto !important; } - .me-xl-0 { - margin-right: 0 !important; } - .me-xl-1 { - margin-right: 0.25rem !important; } - .me-xl-2 { - margin-right: 0.5rem !important; } - .me-xl-3 { - margin-right: 1rem !important; } - .me-xl-4 { - margin-right: 1.5rem !important; } - .me-xl-5 { - margin-right: 3rem !important; } - .me-xl-auto { - margin-right: auto !important; } - .mb-xl-0 { - margin-bottom: 0 !important; } - .mb-xl-1 { - margin-bottom: 0.25rem !important; } - .mb-xl-2 { - margin-bottom: 0.5rem !important; } - .mb-xl-3 { - margin-bottom: 1rem !important; } - .mb-xl-4 { - margin-bottom: 1.5rem !important; } - .mb-xl-5 { - margin-bottom: 3rem !important; } - .mb-xl-auto { - margin-bottom: auto !important; } - .ms-xl-0 { - margin-left: 0 !important; } - .ms-xl-1 { - margin-left: 0.25rem !important; } - .ms-xl-2 { - margin-left: 0.5rem !important; } - .ms-xl-3 { - margin-left: 1rem !important; } - .ms-xl-4 { - margin-left: 1.5rem !important; } - .ms-xl-5 { - margin-left: 3rem !important; } - .ms-xl-auto { - margin-left: auto !important; } - .m-xl-n1 { - margin: -0.25rem !important; } - .m-xl-n2 { - margin: -0.5rem !important; } - .m-xl-n3 { - margin: -1rem !important; } - .m-xl-n4 { - margin: -1.5rem !important; } - .m-xl-n5 { - margin: -3rem !important; } - .mx-xl-n1 { - margin-right: -0.25rem !important; - margin-left: -0.25rem !important; } - .mx-xl-n2 { - margin-right: -0.5rem !important; - margin-left: -0.5rem !important; } - .mx-xl-n3 { - margin-right: -1rem !important; - margin-left: -1rem !important; } - .mx-xl-n4 { - margin-right: -1.5rem !important; - margin-left: -1.5rem !important; } - .mx-xl-n5 { - margin-right: -3rem !important; - margin-left: -3rem !important; } - .my-xl-n1 { - margin-top: -0.25rem !important; - margin-bottom: -0.25rem !important; } - .my-xl-n2 { - margin-top: -0.5rem !important; - margin-bottom: -0.5rem !important; } - .my-xl-n3 { - margin-top: -1rem !important; - margin-bottom: -1rem !important; } - .my-xl-n4 { - margin-top: -1.5rem !important; - margin-bottom: -1.5rem !important; } - .my-xl-n5 { - margin-top: -3rem !important; - margin-bottom: -3rem !important; } - .mt-xl-n1 { - margin-top: -0.25rem !important; } - .mt-xl-n2 { - margin-top: -0.5rem !important; } - .mt-xl-n3 { - margin-top: -1rem !important; } - .mt-xl-n4 { - margin-top: -1.5rem !important; } - .mt-xl-n5 { - margin-top: -3rem !important; } - .me-xl-n1 { - margin-right: -0.25rem !important; } - .me-xl-n2 { - margin-right: -0.5rem !important; } - .me-xl-n3 { - margin-right: -1rem !important; } - .me-xl-n4 { - margin-right: -1.5rem !important; } - .me-xl-n5 { - margin-right: -3rem !important; } - .mb-xl-n1 { - margin-bottom: -0.25rem !important; } - .mb-xl-n2 { - margin-bottom: -0.5rem !important; } - .mb-xl-n3 { - margin-bottom: -1rem !important; } - .mb-xl-n4 { - margin-bottom: -1.5rem !important; } - .mb-xl-n5 { - margin-bottom: -3rem !important; } - .ms-xl-n1 { - margin-left: -0.25rem !important; } - .ms-xl-n2 { - margin-left: -0.5rem !important; } - .ms-xl-n3 { - margin-left: -1rem !important; } - .ms-xl-n4 { - margin-left: -1.5rem !important; } - .ms-xl-n5 { - margin-left: -3rem !important; } - .p-xl-0 { - padding: 0 !important; } - .p-xl-1 { - padding: 0.25rem !important; } - .p-xl-2 { - padding: 0.5rem !important; } - .p-xl-3 { - padding: 1rem !important; } - .p-xl-4 { - padding: 1.5rem !important; } - .p-xl-5 { - padding: 3rem !important; } - .px-xl-0 { - padding-right: 0 !important; - padding-left: 0 !important; } - .px-xl-1 { - padding-right: 0.25rem !important; - padding-left: 0.25rem !important; } - .px-xl-2 { - padding-right: 0.5rem !important; - padding-left: 0.5rem !important; } - .px-xl-3 { - padding-right: 1rem !important; - padding-left: 1rem !important; } - .px-xl-4 { - padding-right: 1.5rem !important; - padding-left: 1.5rem !important; } - .px-xl-5 { - padding-right: 3rem !important; - padding-left: 3rem !important; } - .py-xl-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; } - .py-xl-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; } - .py-xl-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; } - .py-xl-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; } - .py-xl-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; } - .py-xl-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; } - .pt-xl-0 { - padding-top: 0 !important; } - .pt-xl-1 { - padding-top: 0.25rem !important; } - .pt-xl-2 { - padding-top: 0.5rem !important; } - .pt-xl-3 { - padding-top: 1rem !important; } - .pt-xl-4 { - padding-top: 1.5rem !important; } - .pt-xl-5 { - padding-top: 3rem !important; } - .pe-xl-0 { - padding-right: 0 !important; } - .pe-xl-1 { - padding-right: 0.25rem !important; } - .pe-xl-2 { - padding-right: 0.5rem !important; } - .pe-xl-3 { - padding-right: 1rem !important; } - .pe-xl-4 { - padding-right: 1.5rem !important; } - .pe-xl-5 { - padding-right: 3rem !important; } - .pb-xl-0 { - padding-bottom: 0 !important; } - .pb-xl-1 { - padding-bottom: 0.25rem !important; } - .pb-xl-2 { - padding-bottom: 0.5rem !important; } - .pb-xl-3 { - padding-bottom: 1rem !important; } - .pb-xl-4 { - padding-bottom: 1.5rem !important; } - .pb-xl-5 { - padding-bottom: 3rem !important; } - .ps-xl-0 { - padding-left: 0 !important; } - .ps-xl-1 { - padding-left: 0.25rem !important; } - .ps-xl-2 { - padding-left: 0.5rem !important; } - .ps-xl-3 { - padding-left: 1rem !important; } - .ps-xl-4 { - padding-left: 1.5rem !important; } - .ps-xl-5 { - padding-left: 3rem !important; } - .gap-xl-0 { - gap: 0 !important; } - .gap-xl-1 { - gap: 0.25rem !important; } - .gap-xl-2 { - gap: 0.5rem !important; } - .gap-xl-3 { - gap: 1rem !important; } - .gap-xl-4 { - gap: 1.5rem !important; } - .gap-xl-5 { - gap: 3rem !important; } - .text-xl-start { - text-align: left !important; } - .text-xl-end { - text-align: right !important; } - .text-xl-center { - text-align: center !important; } } - -@media (min-width: 1400px) { - .float-xxl-start { - float: left !important; } - .float-xxl-end { - float: right !important; } - .float-xxl-none { - float: none !important; } - .d-xxl-inline { - display: inline !important; } - .d-xxl-inline-block { - display: inline-block !important; } - .d-xxl-block { - display: block !important; } - .d-xxl-grid { - display: grid !important; } - .d-xxl-table { - display: table !important; } - .d-xxl-table-row { - display: table-row !important; } - .d-xxl-table-cell { - display: table-cell !important; } - .d-xxl-flex { - display: flex !important; } - .d-xxl-inline-flex { - display: inline-flex !important; } - .d-xxl-none { - display: none !important; } - .flex-xxl-fill { - flex: 1 1 auto !important; } - .flex-xxl-row { - flex-direction: row !important; } - .flex-xxl-column { - flex-direction: column !important; } - .flex-xxl-row-reverse { - flex-direction: row-reverse !important; } - .flex-xxl-column-reverse { - flex-direction: column-reverse !important; } - .flex-xxl-grow-0 { - flex-grow: 0 !important; } - .flex-xxl-grow-1 { - flex-grow: 1 !important; } - .flex-xxl-shrink-0 { - flex-shrink: 0 !important; } - .flex-xxl-shrink-1 { - flex-shrink: 1 !important; } - .flex-xxl-wrap { - flex-wrap: wrap !important; } - .flex-xxl-nowrap { - flex-wrap: nowrap !important; } - .flex-xxl-wrap-reverse { - flex-wrap: wrap-reverse !important; } - .justify-content-xxl-start { - justify-content: flex-start !important; } - .justify-content-xxl-end { - justify-content: flex-end !important; } - .justify-content-xxl-center { - justify-content: center !important; } - .justify-content-xxl-between { - justify-content: space-between !important; } - .justify-content-xxl-around { - justify-content: space-around !important; } - .justify-content-xxl-evenly { - justify-content: space-evenly !important; } - .align-items-xxl-start { - align-items: flex-start !important; } - .align-items-xxl-end { - align-items: flex-end !important; } - .align-items-xxl-center { - align-items: center !important; } - .align-items-xxl-baseline { - align-items: baseline !important; } - .align-items-xxl-stretch { - align-items: stretch !important; } - .align-content-xxl-start { - align-content: flex-start !important; } - .align-content-xxl-end { - align-content: flex-end !important; } - .align-content-xxl-center { - align-content: center !important; } - .align-content-xxl-between { - align-content: space-between !important; } - .align-content-xxl-around { - align-content: space-around !important; } - .align-content-xxl-stretch { - align-content: stretch !important; } - .align-self-xxl-auto { - align-self: auto !important; } - .align-self-xxl-start { - align-self: flex-start !important; } - .align-self-xxl-end { - align-self: flex-end !important; } - .align-self-xxl-center { - align-self: center !important; } - .align-self-xxl-baseline { - align-self: baseline !important; } - .align-self-xxl-stretch { - align-self: stretch !important; } - .order-xxl-first { - order: -1 !important; } - .order-xxl-0 { - order: 0 !important; } - .order-xxl-1 { - order: 1 !important; } - .order-xxl-2 { - order: 2 !important; } - .order-xxl-3 { - order: 3 !important; } - .order-xxl-4 { - order: 4 !important; } - .order-xxl-5 { - order: 5 !important; } - .order-xxl-last { - order: 6 !important; } - .m-xxl-0 { - margin: 0 !important; } - .m-xxl-1 { - margin: 0.25rem !important; } - .m-xxl-2 { - margin: 0.5rem !important; } - .m-xxl-3 { - margin: 1rem !important; } - .m-xxl-4 { - margin: 1.5rem !important; } - .m-xxl-5 { - margin: 3rem !important; } - .m-xxl-auto { - margin: auto !important; } - .mx-xxl-0 { - margin-right: 0 !important; - margin-left: 0 !important; } - .mx-xxl-1 { - margin-right: 0.25rem !important; - margin-left: 0.25rem !important; } - .mx-xxl-2 { - margin-right: 0.5rem !important; - margin-left: 0.5rem !important; } - .mx-xxl-3 { - margin-right: 1rem !important; - margin-left: 1rem !important; } - .mx-xxl-4 { - margin-right: 1.5rem !important; - margin-left: 1.5rem !important; } - .mx-xxl-5 { - margin-right: 3rem !important; - margin-left: 3rem !important; } - .mx-xxl-auto { - margin-right: auto !important; - margin-left: auto !important; } - .my-xxl-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; } - .my-xxl-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; } - .my-xxl-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; } - .my-xxl-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; } - .my-xxl-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; } - .my-xxl-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; } - .my-xxl-auto { - margin-top: auto !important; - margin-bottom: auto !important; } - .mt-xxl-0 { - margin-top: 0 !important; } - .mt-xxl-1 { - margin-top: 0.25rem !important; } - .mt-xxl-2 { - margin-top: 0.5rem !important; } - .mt-xxl-3 { - margin-top: 1rem !important; } - .mt-xxl-4 { - margin-top: 1.5rem !important; } - .mt-xxl-5 { - margin-top: 3rem !important; } - .mt-xxl-auto { - margin-top: auto !important; } - .me-xxl-0 { - margin-right: 0 !important; } - .me-xxl-1 { - margin-right: 0.25rem !important; } - .me-xxl-2 { - margin-right: 0.5rem !important; } - .me-xxl-3 { - margin-right: 1rem !important; } - .me-xxl-4 { - margin-right: 1.5rem !important; } - .me-xxl-5 { - margin-right: 3rem !important; } - .me-xxl-auto { - margin-right: auto !important; } - .mb-xxl-0 { - margin-bottom: 0 !important; } - .mb-xxl-1 { - margin-bottom: 0.25rem !important; } - .mb-xxl-2 { - margin-bottom: 0.5rem !important; } - .mb-xxl-3 { - margin-bottom: 1rem !important; } - .mb-xxl-4 { - margin-bottom: 1.5rem !important; } - .mb-xxl-5 { - margin-bottom: 3rem !important; } - .mb-xxl-auto { - margin-bottom: auto !important; } - .ms-xxl-0 { - margin-left: 0 !important; } - .ms-xxl-1 { - margin-left: 0.25rem !important; } - .ms-xxl-2 { - margin-left: 0.5rem !important; } - .ms-xxl-3 { - margin-left: 1rem !important; } - .ms-xxl-4 { - margin-left: 1.5rem !important; } - .ms-xxl-5 { - margin-left: 3rem !important; } - .ms-xxl-auto { - margin-left: auto !important; } - .m-xxl-n1 { - margin: -0.25rem !important; } - .m-xxl-n2 { - margin: -0.5rem !important; } - .m-xxl-n3 { - margin: -1rem !important; } - .m-xxl-n4 { - margin: -1.5rem !important; } - .m-xxl-n5 { - margin: -3rem !important; } - .mx-xxl-n1 { - margin-right: -0.25rem !important; - margin-left: -0.25rem !important; } - .mx-xxl-n2 { - margin-right: -0.5rem !important; - margin-left: -0.5rem !important; } - .mx-xxl-n3 { - margin-right: -1rem !important; - margin-left: -1rem !important; } - .mx-xxl-n4 { - margin-right: -1.5rem !important; - margin-left: -1.5rem !important; } - .mx-xxl-n5 { - margin-right: -3rem !important; - margin-left: -3rem !important; } - .my-xxl-n1 { - margin-top: -0.25rem !important; - margin-bottom: -0.25rem !important; } - .my-xxl-n2 { - margin-top: -0.5rem !important; - margin-bottom: -0.5rem !important; } - .my-xxl-n3 { - margin-top: -1rem !important; - margin-bottom: -1rem !important; } - .my-xxl-n4 { - margin-top: -1.5rem !important; - margin-bottom: -1.5rem !important; } - .my-xxl-n5 { - margin-top: -3rem !important; - margin-bottom: -3rem !important; } - .mt-xxl-n1 { - margin-top: -0.25rem !important; } - .mt-xxl-n2 { - margin-top: -0.5rem !important; } - .mt-xxl-n3 { - margin-top: -1rem !important; } - .mt-xxl-n4 { - margin-top: -1.5rem !important; } - .mt-xxl-n5 { - margin-top: -3rem !important; } - .me-xxl-n1 { - margin-right: -0.25rem !important; } - .me-xxl-n2 { - margin-right: -0.5rem !important; } - .me-xxl-n3 { - margin-right: -1rem !important; } - .me-xxl-n4 { - margin-right: -1.5rem !important; } - .me-xxl-n5 { - margin-right: -3rem !important; } - .mb-xxl-n1 { - margin-bottom: -0.25rem !important; } - .mb-xxl-n2 { - margin-bottom: -0.5rem !important; } - .mb-xxl-n3 { - margin-bottom: -1rem !important; } - .mb-xxl-n4 { - margin-bottom: -1.5rem !important; } - .mb-xxl-n5 { - margin-bottom: -3rem !important; } - .ms-xxl-n1 { - margin-left: -0.25rem !important; } - .ms-xxl-n2 { - margin-left: -0.5rem !important; } - .ms-xxl-n3 { - margin-left: -1rem !important; } - .ms-xxl-n4 { - margin-left: -1.5rem !important; } - .ms-xxl-n5 { - margin-left: -3rem !important; } - .p-xxl-0 { - padding: 0 !important; } - .p-xxl-1 { - padding: 0.25rem !important; } - .p-xxl-2 { - padding: 0.5rem !important; } - .p-xxl-3 { - padding: 1rem !important; } - .p-xxl-4 { - padding: 1.5rem !important; } - .p-xxl-5 { - padding: 3rem !important; } - .px-xxl-0 { - padding-right: 0 !important; - padding-left: 0 !important; } - .px-xxl-1 { - padding-right: 0.25rem !important; - padding-left: 0.25rem !important; } - .px-xxl-2 { - padding-right: 0.5rem !important; - padding-left: 0.5rem !important; } - .px-xxl-3 { - padding-right: 1rem !important; - padding-left: 1rem !important; } - .px-xxl-4 { - padding-right: 1.5rem !important; - padding-left: 1.5rem !important; } - .px-xxl-5 { - padding-right: 3rem !important; - padding-left: 3rem !important; } - .py-xxl-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; } - .py-xxl-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; } - .py-xxl-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; } - .py-xxl-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; } - .py-xxl-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; } - .py-xxl-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; } - .pt-xxl-0 { - padding-top: 0 !important; } - .pt-xxl-1 { - padding-top: 0.25rem !important; } - .pt-xxl-2 { - padding-top: 0.5rem !important; } - .pt-xxl-3 { - padding-top: 1rem !important; } - .pt-xxl-4 { - padding-top: 1.5rem !important; } - .pt-xxl-5 { - padding-top: 3rem !important; } - .pe-xxl-0 { - padding-right: 0 !important; } - .pe-xxl-1 { - padding-right: 0.25rem !important; } - .pe-xxl-2 { - padding-right: 0.5rem !important; } - .pe-xxl-3 { - padding-right: 1rem !important; } - .pe-xxl-4 { - padding-right: 1.5rem !important; } - .pe-xxl-5 { - padding-right: 3rem !important; } - .pb-xxl-0 { - padding-bottom: 0 !important; } - .pb-xxl-1 { - padding-bottom: 0.25rem !important; } - .pb-xxl-2 { - padding-bottom: 0.5rem !important; } - .pb-xxl-3 { - padding-bottom: 1rem !important; } - .pb-xxl-4 { - padding-bottom: 1.5rem !important; } - .pb-xxl-5 { - padding-bottom: 3rem !important; } - .ps-xxl-0 { - padding-left: 0 !important; } - .ps-xxl-1 { - padding-left: 0.25rem !important; } - .ps-xxl-2 { - padding-left: 0.5rem !important; } - .ps-xxl-3 { - padding-left: 1rem !important; } - .ps-xxl-4 { - padding-left: 1.5rem !important; } - .ps-xxl-5 { - padding-left: 3rem !important; } - .gap-xxl-0 { - gap: 0 !important; } - .gap-xxl-1 { - gap: 0.25rem !important; } - .gap-xxl-2 { - gap: 0.5rem !important; } - .gap-xxl-3 { - gap: 1rem !important; } - .gap-xxl-4 { - gap: 1.5rem !important; } - .gap-xxl-5 { - gap: 3rem !important; } - .text-xxl-start { - text-align: left !important; } - .text-xxl-end { - text-align: right !important; } - .text-xxl-center { - text-align: center !important; } } - -@media (min-width: 1200px) { - .fs-1 { - font-size: 2.5rem !important; } - .fs-2 { - font-size: 2rem !important; } - .fs-3 { - font-size: 1.75rem !important; } - .fs-4 { - font-size: 1.5rem !important; } } - -@media print { - .d-print-inline { - display: inline !important; } - .d-print-inline-block { - display: inline-block !important; } - .d-print-block { - display: block !important; } - .d-print-grid { - display: grid !important; } - .d-print-table { - display: table !important; } - .d-print-table-row { - display: table-row !important; } - .d-print-table-cell { - display: table-cell !important; } - .d-print-flex { - display: flex !important; } - .d-print-inline-flex { - display: inline-flex !important; } - .d-print-none { - display: none !important; } } - -/** Import theme styles */ -/* jost-regular - latin */ -@font-face { - font-family: "Jost"; - font-style: normal; - font-weight: 400; - font-display: swap; - src: local("Jost"), url("fonts/vendor/jost/jost-v4-latin-regular.woff2") format("woff2"), url("fonts/vendor/jost/jost-v4-latin-regular.woff") format("woff"); - /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ } - -/* jost-500 - latin */ -@font-face { - font-family: "Jost"; - font-style: normal; - font-weight: 500; - font-display: swap; - src: local("Jost"), url("fonts/vendor/jost/jost-v4-latin-500.woff2") format("woff2"), url("fonts/vendor/jost/jost-v4-latin-500.woff") format("woff"); - /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ } - -/* jost-700 - latin */ -@font-face { - font-family: "Jost"; - font-style: normal; - font-weight: 700; - font-display: swap; - src: local("Jost"), url("fonts/vendor/jost/jost-v4-latin-700.woff2") format("woff2"), url("fonts/vendor/jost/jost-v4-latin-700.woff") format("woff"); - /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ } - -/* jost-italic - latin */ -@font-face { - font-family: "Jost"; - font-style: italic; - font-weight: 400; - font-display: swap; - src: local("Jost"), url("fonts/vendor/jost/jost-v4-latin-italic.woff2") format("woff2"), url("fonts/vendor/jost/jost-v4-latin-italic.woff") format("woff"); - /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ } - -/* jost-500italic - latin */ -@font-face { - font-family: "Jost"; - font-style: italic; - font-weight: 500; - font-display: swap; - src: local("Jost"), url("fonts/vendor/jost/jost-v4-latin-500italic.woff2") format("woff2"), url("fonts/vendor/jost/jost-v4-latin-500italic.woff") format("woff"); - /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ } - -/* jost-700italic - latin */ -@font-face { - font-family: "Jost"; - font-style: italic; - font-weight: 700; - font-display: swap; - src: local("Jost"), url("fonts/vendor/jost/jost-v4-latin-700italic.woff2") format("woff2"), url("fonts/vendor/jost/jost-v4-latin-700italic.woff") format("woff"); - /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ } - -.contributors .content, -.blog .content, -.page .content, -.error404 .content, -.docs.list .content, -.tutorial.list .content, -.showcase.list .content { - padding-top: 1rem; - padding-bottom: 3rem; } - -h1, -h2, -h3, -h4, -h5, -h6, -.h1, -.h2, -.h3, -.h4, -.h5, -.h6 { - margin: 2rem 0 1rem; } - -@media (min-width: 768px) { - body { - font-size: 1.125rem; - padding-top: 4rem !important; } - h1, - h2, - h3, - h4, - h5, - h6, - .h1, - .h2, - .h3, - .h4, - .h5, - .h6 { - margin-bottom: 1.125rem; } } - -.home h1, .home .h1 { - /* font-size: calc(1.375rem + 1.5vw); */ - font-size: calc(1.875rem + 1.5vw); } - -a:hover, -a:focus { - text-decoration: underline; } - -a.btn:hover, .search-form a.search-submit:hover, -a.btn:focus, -.search-form a.search-submit:focus { - text-decoration: none; } - -.section { - padding-top: 5rem; - padding-bottom: 5rem; } - -.section-md { - padding-top: 3rem; - padding-bottom: 3rem; } - -.section-sm { - padding-top: 1rem; - padding-bottom: 1rem; } - -/* -.section svg { - display: inline-block; - width: 2rem; - height: 2rem; - vertical-align: text-top; -} -*/ -body { - padding-top: 3.5625rem; } - -.docs-sidebar { - order: 2; } - -@media (min-width: 992px) { - .docs-sidebar { - order: 0; - border-right: 1px solid #e9ecef; } - @supports (position: -webkit-sticky) or (position: sticky) { - .docs-sidebar { - position: -webkit-sticky; - position: sticky; - top: 4rem; - z-index: 1000; - height: calc(100vh - 4rem); } } } - -@media (min-width: 1200px) { - .docs-sidebar { - flex: 0 1 320px; } } - -.docs-links { - padding-bottom: 5rem; } - -@media (min-width: 992px) { - @supports (position: -webkit-sticky) or (position: sticky) { - .docs-links { - max-height: calc(100vh - 4rem); - overflow-y: scroll; } } } - -@media (min-width: 992px) { - .docs-links { - display: block; - width: auto; - margin-right: -1.5rem; - padding-bottom: 4rem; } } - -.docs-toc { - order: 2; } - -@supports (position: -webkit-sticky) or (position: sticky) { - .docs-toc { - position: -webkit-sticky; - position: sticky; - top: 4rem; - height: calc(100vh - 4rem); - overflow-y: auto; } } - -.docs-content { - padding-bottom: 3rem; - order: 1; } - -.docs-navigation { - border-top: 1px solid #e9ecef; - margin-top: 2rem; - margin-bottom: 0; - padding-top: 2rem; } - -.docs-navigation a { - font-size: 0.9rem; } - -@media (min-width: 992px) { - .docs-navigation { - margin-bottom: -1rem; } - .docs-navigation a { - font-size: 1rem; } } - -.navbar a:hover, -.navbar a:focus { - text-decoration: none; } - -#TableOfContents ul { - padding-left: 0; - list-style: none; } - -::selection { - background: #e7dbf2; } - -.bg-dots { - background-image: radial-gradient(#dee2e6 15%, transparent 15%); - background-position: 0 0; - background-size: 1rem 1rem; - -webkit-mask: linear-gradient(to top, #fff, transparent); - mask: linear-gradient(to top, #fff, transparent); - width: 100%; - height: 9rem; - margin-top: -10rem; - z-index: -1; } - -.bg-dots-md { - margin-top: -11rem; } - -.bg-dots-lg { - margin-top: -12rem; } - -.gradient-text { - background-color: #5d2f86; - background-image: linear-gradient(90deg, #5d2f86, #8ed6fb 50%, #d32e9d); - background-size: 100%; - background-repeat: repeat; - -webkit-background-clip: text; - -moz-background-clip: text; - -webkit-text-fill-color: transparent; - -moz-text-fill-color: transparent; } - -/** Theme variables */ -/** Theme styles */ -body.dark { - background: #212529; - color: #dee2e6; } - -body.dark a { - color: #8ed6fb; } - -body.dark a.text-body { - color: #dee2e6 !important; } - -body.dark .btn-primary { - --bs-btn-color: #1d2d35; - --bs-btn-bg: #8ed6fb; - --bs-btn-border-color: #8ed6fb; - --bs-btn-hover-color: #1d2d35; - --bs-btn-hover-bg: #9fdcfc; - --bs-btn-hover-border-color: #99dafb; - --bs-btn-focus-shadow-rgb: 125, 189, 221; - --bs-btn-active-color: #1d2d35; - --bs-btn-active-bg: #a5defc; - --bs-btn-active-border-color: #99dafb; - --bs-btn-active-shadow: inset 0 3px 5px rgba(29, 45, 53, 0.125); - --bs-btn-disabled-color: #1d2d35; - --bs-btn-disabled-bg: #8ed6fb; - --bs-btn-disabled-border-color: #8ed6fb; - color: #212529 !important; } - -body.dark .navbar { - background: #212529; - opacity: 0.975; - border-bottom: 1px solid #1b1f22; } - -body.dark.home .navbar { - border-bottom: 0; } - -body.dark .navbar-light .navbar-brand { - color: #dee2e6 !important; } - -body.dark .navbar-light .navbar-nav .nav-link, body.dark .navbar-light .navbar-nav .banner .nav a, .banner .nav body.dark .navbar-light .navbar-nav a { - color: #dee2e6; } - -body.dark .navbar-light .navbar-nav .nav-link:hover, body.dark .navbar-light .navbar-nav .banner .nav a:hover, .banner .nav body.dark .navbar-light .navbar-nav a:hover, -body.dark .navbar-light .navbar-nav .nav-link:focus, -body.dark .navbar-light .navbar-nav .banner .nav a:focus, -.banner .nav body.dark .navbar-light .navbar-nav a:focus { - color: #8ed6fb; } - -body.dark .navbar-light .navbar-nav .nav-link.disabled, body.dark .navbar-light .navbar-nav .banner .nav a.disabled, .banner .nav body.dark .navbar-light .navbar-nav a.disabled { - color: rgba(255, 255, 255, 0.25); } - -body.dark .navbar-light .navbar-nav .show > .nav-link, body.dark .navbar-light .navbar-nav .banner .nav .show > a, .banner .nav body.dark .navbar-light .navbar-nav .show > a, -body.dark .navbar-light .navbar-nav .active > .nav-link, -body.dark .navbar-light .navbar-nav .banner .nav .active > a, -.banner .nav body.dark .navbar-light .navbar-nav .active > a, -body.dark .navbar-light .navbar-nav .nav-link.show, -body.dark .navbar-light .navbar-nav .banner .nav a.show, -.banner .nav body.dark .navbar-light .navbar-nav a.show, -body.dark .navbar-light .navbar-nav .nav-link.active, -body.dark .navbar-light .navbar-nav .banner .nav a.active, -.banner .nav body.dark .navbar-light .navbar-nav a.active { - color: #8ed6fb; } - -body.dark .navbar-light .navbar-text { - color: #dee2e6; } - -body.dark .alert-primary a { - color: #212529; } - -body.dark .alert-warning { - background: #1b1f22; - color: #dee2e6; } - -body.dark .page-links a { - color: #dee2e6; } - -body.dark .showcase-meta a { - color: #dee2e6; } - -body.dark .showcase-meta a:hover, -body.dark .showcase-meta a:focus { - color: #8ed6fb; } - -body.dark .docs-link:hover, -body.dark .docs-link.active, -body.dark .page-links a:hover { - text-decoration: none; - color: #8ed6fb; } - -body.dark .navbar-light .navbar-text a { - color: #8ed6fb; } - -body.dark .docs-links h3.sidebar-link a, body.dark .docs-links .sidebar-link.h3 a, -body.dark .page-links h3.sidebar-link a, -body.dark .page-links .sidebar-link.h3 a { - color: #dee2e6; } - -body.dark .navbar-light .navbar-text a:hover, -body.dark .navbar-light .navbar-text a:focus { - color: #8ed6fb; } - -body.dark .navbar .btn-link { - color: #dee2e6; } - -body.dark .content .btn-link { - color: #8ed6fb; } - -body.dark .content .btn-link:hover { - color: #8ed6fb; } - -body.dark .navbar .btn-link:hover { - color: #8ed6fb; } - -body.dark .navbar .btn-link:active { - color: #8ed6fb; } - -body.dark .form-control.is-search, body.dark .search-form .is-search.search-field, .search-form body.dark .is-search.search-field, body.dark .comment-form input.is-search[type="text"], .comment-form body.dark input.is-search[type="text"], -body.dark .comment-form input.is-search[type="email"], -.comment-form body.dark input.is-search[type="email"], -body.dark .comment-form input.is-search[type="url"], -.comment-form body.dark input.is-search[type="url"], -body.dark .comment-form textarea.is-search, -.comment-form body.dark textarea.is-search { - background: #1b1f22; - /* - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='%236c757d' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' class='feather feather-search'%3E%3Ccircle cx='11' cy='11' r='8'%3E%3C/circle%3E%3Cline x1='21' y1='21' x2='16.65' y2='16.65'%3E%3C/line%3E%3C/svg%3E"); - background-repeat: no-repeat; - background-position: right calc(0.375em + 0.1875rem) center; - background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); - */ } - -body.dark .navbar-form::after { - color: #495057; - border: 1px solid #212529; } - -body.dark .form-control:focus, body.dark .search-form .search-field:focus, .search-form body.dark .search-field:focus, body.dark .comment-form input[type="text"]:focus, .comment-form body.dark input[type="text"]:focus, -body.dark .comment-form input[type="email"]:focus, -.comment-form body.dark input[type="email"]:focus, -body.dark .comment-form input[type="url"]:focus, -.comment-form body.dark input[type="url"]:focus, -body.dark .comment-form textarea:focus, -.comment-form body.dark textarea:focus { - box-shadow: 0 0 0 0.2rem #9adafb; } - -body.dark .border-top { - border-top: 1px solid #1b1f22 !important; } - -@media (min-width: 992px) { - body.dark .docs-sidebar { - order: 0; - border-right: 1px solid #1b1f22; } } - -body.dark .docs-navigation { - border-top: 1px solid #1b1f22; } - -body.dark ::selection { - background: #9adafb; } - -body.dark pre { - background: #1b1f22; - color: #dee2e6; } - -body.dark code { - background: #1b1f22; - color: #dee2e6; } - -body.dark blockquote { - border-left: 3px solid #1b1f22; } - -body.dark .footer { - border-top: 1px solid #1b1f22; } - -body.dark .docs-links, -body.dark .docs-toc { - scrollbar-width: thin; - scrollbar-color: #212529 #212529; } - -body.dark .docs-links::-webkit-scrollbar, -body.dark .docs-toc::-webkit-scrollbar { - width: 5px; } - -body.dark .docs-links::-webkit-scrollbar-track, -body.dark .docs-toc::-webkit-scrollbar-track { - background: #212529; } - -body.dark .docs-links::-webkit-scrollbar-thumb, -body.dark .docs-toc::-webkit-scrollbar-thumb { - background: #212529; } - -body.dark .docs-links:hover, -body.dark .docs-toc:hover { - scrollbar-width: thin; - scrollbar-color: #1b1f22 #212529; } - -body.dark .docs-links:hover::-webkit-scrollbar-thumb, -body.dark .docs-toc:hover::-webkit-scrollbar-thumb { - background: #1b1f22; } - -body.dark .docs-links::-webkit-scrollbar-thumb:hover, -body.dark .docs-toc::-webkit-scrollbar-thumb:hover { - background: #1b1f22; } - -body.dark .docs-links h3:not(:first-child), body.dark .docs-links .h3:not(:first-child) { - border-top: 1px solid #1b1f22; } - -body.dark a.docs-link { - color: #dee2e6; } - -body.dark .page-links li:not(:first-child) { - border-top: 1px dashed #1b1f22; } - -body.dark .card { - background: #212529; - border: 1px solid #1b1f22; } - -body.dark .card.bg-light { - background: #1b1f22 !important; } - -body.dark .navbar .menu-icon .navicon { - background: #dee2e6; } - -body.dark .navbar .menu-icon .navicon::before, -body.dark .navbar .menu-icon .navicon::after { - background: #dee2e6; } - -body.dark .logo-light { - display: none !important; } - -body.dark .logo-dark { - display: inline-block !important; } - -body.dark .bg-light { - background: #1e2125 !important; } - -body.dark .bg-dots { - background-image: radial-gradient(#556370 15%, transparent 15%); } - -body.dark .text-muted { - color: #c8cfd6 !important; } - -body.dark .alert-primary { - background: #8ed6fb; - color: #212529; } - -body.dark .figure-caption { - color: #dee2e6; } - -.alert { - font-family: sfmono-regular, menlo, monaco, consolas, "Liberation Mono", "Courier New", monospace; - font-size: 0.875rem; } - -.alert-icon { - margin-right: 0.75rem; } - -.docs .alert { - margin: 2rem -1.5rem; } - -.alert .alert-link { - text-decoration: underline; } - -.alert-dark { - color: #fff; - background-color: #1d2d35; } - -.alert-dark .alert-link { - color: #fff; } - -.alert-light { - color: #1d2d35; } - -.alert-warning { - background: #fbf7f0; - color: #1d2d35; } - -/* -.alert-light { - color: #215888; - background: linear-gradient(-45deg, rgb(212, 245, 255), rgb(234, 250, 255), rgb(234, 250, 255), #d3f6ef); -} - -.alert-light .alert-link { - color: #215888; -} -*/ -.alert-white { - background-color: rgba(255, 255, 255, 0.95); } - -.alert-primary { - color: #fff; - background-color: #5d2f86; } - -.alert-primary .alert-link { - color: #fff; } - -.alert .alert-link:hover, -.alert .alert-link:focus { - text-decoration: none; } - -.navbar .btn-link { - color: #1d2d35; - padding: 0.4375rem 0; } - -#mode { - margin-right: 1.25rem; } - -.btn-link:focus { - outline: 0; - box-shadow: none; } - -#navigation { - margin-left: 1.25rem; } - -@media (min-width: 768px) { - #mode { - margin-right: 0.5rem; } - .navbar .btn-link { - padding: 0.5625em 0.25rem 0.5rem 0.125rem; } } - -.navbar .btn-link:hover { - color: #5d2f86; } - -.navbar .btn-link:active { - color: #5d2f86; } - -body .toggle-dark { - display: block; } - -body .toggle-light { - display: none; } - -body.dark .toggle-light { - display: block; } - -body.dark .toggle-dark { - display: none; } - -.btn-clipboard { - display: none; } - -@media (min-width: 768px) { - .btn-clipboard { - display: block; - margin: 2.0625rem 0.25rem -4rem auto; } } - -.copy-status::after, -.copy-status:hover::after { - content: "Copy"; - display: block; } - -.copy-status:focus::after, -.copy-status:active::after { - content: "Copied"; - display: block; } - -pre, -code, -kbd, -samp { - font-family: sfmono-regular, menlo, monaco, consolas, "Liberation Mono", "Courier New", monospace; - font-size: 0.875rem; - border-radius: 0.375rem; } - -pre { - background: #fbf7f0; - color: #1d2d35; - line-height: 1.5; - margin: 2rem 0; - overflow: auto; - padding: 1.25rem 1.5rem; - tab-size: 4; } - -code { - background: #fbf7f0; - color: #1d2d35; - padding: 0.25rem 0.5rem; } - -pre code { - background: none; - font-size: inherit; - padding: 0; } - -@media (max-width: 575.98px) { - pre { - margin: 2rem -1.5rem; } - pre, - code, - kbd, - samp { - border-radius: 0; } } - -/*! - * GitHub Light v0.5.0 - * Copyright (c) 2012 - 2017 GitHub, Inc. - * Licensed under MIT (https://github.com/primer/github-syntax-theme-generator/blob/master/LICENSE) - */ -.c1, -.c { - color: #6a737d; } - -.v, -.smw { - color: #e36209; } - -.s .v { - color: #005cc5; } - -.e, -.en { - color: #6f42c1; } - -.smi, -.s .s1 { - color: #24292e; } - -.ent { - color: #22863a; } - -.k { - color: #d73a49; } - -.s, -.pds, -.s .pse .s1, -.sr, -.sr .cce, -.sr .sre, -.sr .sra { - color: #032f62; } - -.bu { - color: #b31d28; } - -.ii { - color: #fafbfc; - background-color: #b31d28; } - -.c2 { - color: #fafbfc; - background-color: #d73a49; } - -.c2::before { - content: "^M"; } - -.sr .cce { - font-weight: bold; - color: #22863a; } - -.ml { - color: #735c0f; } - -.mh, -.mh .en, -.ms { - font-weight: bold; - color: #005cc5; } - -.mi { - font-style: italic; - color: #24292e; } - -.mb { - font-weight: bold; - color: #24292e; } - -.md { - color: #b31d28; - background-color: #ffeef0; } - -.mi1 { - color: #22863a; - background-color: #f0fff4; } - -.mc { - color: #e36209; - background-color: #ffebda; } - -.mi2 { - color: #f6f8fa; - background-color: #005cc5; } - -.mdr { - font-weight: bold; - color: #6f42c1; } - -.ba { - color: #586069; } - -.sg { - color: #959da5; } - -.corl { - text-decoration: underline; - color: #032f62; } - -.comment-list ol { - list-style: none; } - -blockquote { - margin-bottom: 1rem; - font-size: 1.25rem; - border-left: 3px solid #dee2e6; - padding-left: 1rem; } - -/** Search form */ -.search-form label { - font-weight: normal; } - -figure { - margin: 2rem 0; } - -.figure-caption { - margin: 0.25rem 0 0.75rem; } - -figure.wide { - margin: 2rem -1.5rem; } - -figure.wide .figure-caption { - margin: 0.25rem 1.5rem 0.75rem; } - -@media (min-width: 768px) { - figure.wide { - margin: 2rem -2.5rem; } - figure.wide .figure-caption { - margin: 0.25rem 2.5rem 0.75rem; } } - -@media (min-width: 992px) { - figure.wide { - margin: 2rem -5rem; } - figure.wide .figure-caption { - margin: 0.25rem 5rem 0.75rem; } } - -.blur-up { - filter: blur(5px); } - -.blur-up.lazyloaded { - filter: unset; } - -.img-simple { - margin-top: 0.375rem; - margin-bottom: 1.25rem; } - -.navbar-form { - position: relative; } - -#suggestions { - position: absolute; - right: 0; - margin-top: 0.5rem; - width: calc(100vw - 3rem); } - -#suggestions a { - display: block; - text-decoration: none; - padding: 0.75rem; - margin: 0 0.5rem; } - -#suggestions a:focus { - background: #f8f9fa; - outline: 0; } - -#suggestions div:not(:first-child) { - border-top: 1px dashed #e9ecef; } - -#suggestions div:first-child { - margin-top: 0.5rem; } - -#suggestions div:last-child { - margin-bottom: 0.5rem; } - -#suggestions a:hover { - background: #f8f9fa; } - -#suggestions span { - display: flex; - font-size: 1rem; } - -#suggestions span:first-child { - font-weight: 700; - color: #1d2d35; } - -#suggestions span:nth-child(2) { - color: #495057; } - -@media (min-width: 576px) { - #suggestions { - width: 30rem; } - #suggestions a { - display: flex; } - #suggestions span:first-child { - width: 9rem; - padding-right: 1rem; - border-right: 1px solid #e9ecef; - display: inline-block; - text-align: right; } - #suggestions span:nth-child(2) { - width: 19rem; - padding-left: 1rem; } } - -table { - margin: 3rem 0; } - -.footer { - border-top: 1px solid #e9ecef; - padding-top: 1.125rem; - padding-bottom: 1.125rem; } - -.footer ul { - margin-bottom: 0; } - -.footer li { - font-size: 0.875rem; - margin-bottom: 0; } - -@media (min-width: 768px) { - .footer li { - font-size: 1rem; } } - -.navbar-text { - margin-left: 1rem; } - -.navbar-brand { - font-weight: 700; } - -.navbar-light .navbar-brand, -.navbar-light .navbar-brand:hover, -.navbar-light .navbar-brand:active { - color: #1d2d35; } - -.navbar-light .navbar-nav .active .nav-link, .navbar-light .navbar-nav .active .banner .nav a, .banner .nav .navbar-light .navbar-nav .active a { - color: #5d2f86; } - -@media (min-width: 768px) { - .navbar-brand { - font-size: 1.375rem; } - .navbar-text { - margin-left: 1.25rem; } } - -.navbar-nav { - flex-direction: row; } - -.nav-item, .banner .nav li { - margin-left: 1.25rem; } - -@media (min-width: 768px) { - .nav-item, .banner .nav li { - margin-left: 0.5rem; } } - -@media (max-width: 575.98px) { - .nav-item:first-child, .banner .nav li:first-child { - margin-left: 0; } } - -@media (max-width: 767.98px) { - .navbar .container { - padding-left: 1.5rem; - padding-right: 1.5rem; } } - -.break { - flex-basis: 100%; - height: 0; } - -.navbar { - background-color: rgba(255, 255, 255, 0.95); - border-bottom: 1px solid #e9ecef; - margin-top: 4px; } - -.header-bar { - border-top: 4px solid; - border-image-source: linear-gradient(90deg, #5d2f86, #8ed6fb 50%, #d32e9d); - border-image-slice: 1; } - -.home .navbar { - border-bottom: 0; } - -.navbar-form { - position: relative; - margin-top: 0.25rem; } - -@media (min-width: 768px) { - .navbar-brand { - margin-right: 1rem !important; } - .main-nav .nav-item:first-child .nav-link, .main-nav .banner .nav li:first-child .nav-link, .banner .nav .main-nav li:first-child .nav-link, .main-nav .nav-item:first-child .banner .nav a, .banner .nav .main-nav .nav-item:first-child a, .main-nav .banner .nav li:first-child a, .banner .nav .main-nav li:first-child a, - .social-nav .nav-item:first-child .nav-link, - .social-nav .banner .nav li:first-child .nav-link, - .banner .nav .social-nav li:first-child .nav-link, - .social-nav .nav-item:first-child .banner .nav a, - .banner .nav .social-nav .nav-item:first-child a, - .social-nav .banner .nav li:first-child a, - .banner .nav .social-nav li:first-child a { - padding-left: 0; } - .main-nav .nav-item:last-child .nav-link, .main-nav .banner .nav li:last-child .nav-link, .banner .nav .main-nav li:last-child .nav-link, .main-nav .nav-item:last-child .banner .nav a, .banner .nav .main-nav .nav-item:last-child a, .main-nav .banner .nav li:last-child a, .banner .nav .main-nav li:last-child a, - .social-nav .nav-item:last-child .nav-link, - .social-nav .banner .nav li:last-child .nav-link, - .banner .nav .social-nav li:last-child .nav-link, - .social-nav .nav-item:last-child .banner .nav a, - .banner .nav .social-nav .nav-item:last-child a, - .social-nav .banner .nav li:last-child a, - .banner .nav .social-nav li:last-child a { - padding-right: 0; } - .navbar-form { - margin-top: 0; - margin-left: 6rem; - margin-right: 1.5rem; } } - -@media (min-width: 992px) { - .navbar-form { - margin-left: 15rem; } } - -@media (min-width: 1200px) { - .navbar-form { - margin-left: 30rem; } } - -.form-control.is-search, .comment-form input.is-search[type="text"], -.comment-form input.is-search[type="email"], -.comment-form input.is-search[type="url"], -.comment-form textarea.is-search, .search-form .is-search.search-field { - /* - padding-right: calc(1.5em + 0.75rem); - */ - padding-right: 2.5rem; - background: #f8f9fa; - border: 0; - /* - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='%236c757d' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' class='feather feather-search'%3E%3Ccircle cx='11' cy='11' r='8'%3E%3C/circle%3E%3Cline x1='21' y1='21' x2='16.65' y2='16.65'%3E%3C/line%3E%3C/svg%3E"); - background-repeat: no-repeat; - background-position: right calc(0.375em + 0.1875rem) center; - background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); - */ } - -.navbar-form::after { - position: absolute; - top: 0.4625rem; - right: 0.5375rem; - display: flex; - align-items: center; - justify-content: center; - height: 1.5rem; - padding-right: 0.4375rem; - padding-left: 0.4375rem; - font-size: 0.75rem; - color: #495057; - content: "/"; - border: 1px solid #dee2e6; - border-radius: 0.25rem; } - -/*! purgecss start ignore */ -.algolia-autocomplete { - display: flex !important; } - -.algolia-autocomplete .ds-dropdown-menu { - box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important; } - -@media (max-width: 575.98px) { - .algolia-autocomplete .ds-dropdown-menu { - max-width: 512px !important; - min-width: 312px !important; - width: auto !important; } - .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column::after { - content: "|"; - margin-right: 0.25rem; } } - -.algolia-autocomplete .algolia-docsearch-suggestion--title { - margin-bottom: 0; } - -.algolia-autocomplete .algolia-docsearch-suggestion--highlight { - padding: 0 0.05em; } - -.algolia-autocomplete .algolia-docsearch-footer { - margin-top: 1rem; - margin-right: 0.5rem; - margin-bottom: 0.5rem; } - -/*! purgecss end ignore */ -/* - * Source: https://medium.com/creative-technology-concepts-code/responsive-mobile-dropdown-navigation-using-css-only-7218e4498a99 -*/ -/* Style the menu icon for the dropdown */ -.navbar .menu-icon { - cursor: pointer; - /* display: inline-block; */ - /* float: right; */ - padding: 1.125rem 0.625rem; - margin: 0 0 0 -0.625rem; - /* position: relative; */ - user-select: none; } - -.navbar .menu-icon .navicon { - background: #1d2d35; - display: block; - height: 2px; - position: relative; - transition: background 0.2s ease-out; - width: 18px; } - -.navbar .menu-icon .navicon::before, -.navbar .menu-icon .navicon::after { - background: #1d2d35; - content: ""; - display: block; - height: 100%; - position: absolute; - transition: all 0.2s ease-out; - width: 100%; } - -.navbar .menu-icon .navicon::before { - top: 5px; } - -.navbar .menu-icon .navicon::after { - top: -5px; } - -/* Add the icon and menu animations when the checkbox is clicked */ -.navbar .menu-btn { - display: none; } - -.navbar .menu-btn:checked ~ .navbar-collapse { - display: block; - max-height: 100vh; } - -.navbar .menu-btn:checked ~ .menu-icon .navicon { - background: transparent; } - -.navbar .menu-btn:checked ~ .menu-icon .navicon::before { - transform: rotate(-45deg); } - -.navbar .menu-btn:checked ~ .menu-icon .navicon::after { - transform: rotate(45deg); } - -.navbar .menu-btn:checked ~ .menu-icon:not(.steps) .navicon::before, -.navbar .menu-btn:checked ~ .menu-icon:not(.steps) .navicon::after { - top: 0; } - -.docs-content > h2[id]::before, .docs-content > [id].h2::before, -.docs-content > h3[id]::before, -.docs-content > [id].h3::before, -.docs-content > h4[id]::before, -.docs-content > [id].h4::before { - display: block; - height: 6rem; - margin-top: -6rem; - content: ""; } - -.anchor { - visibility: hidden; - padding-left: 0.5rem; } - -h1:hover a, .h1:hover a, -h2:hover a, -.h2:hover a, -h3:hover a, -.h3:hover a, -h4:hover a, -.h4:hover a { - visibility: visible; - text-decoration: none; } - -.card-list { - margin-top: 2.25rem; } - -.edit-page { - margin-top: 3rem; - font-size: 1rem; } - -.edit-page svg { - margin-right: 0.5rem; - margin-bottom: 0.25rem; } - -p.meta { - margin-top: 0.5rem; - font-size: 1rem; } - -.breadcrumb { - margin-top: 2.25rem; - font-size: 1rem; } - -.home .card, -.contributors.list .card, -.blog.list .card { - margin-top: 2rem; - margin-bottom: 2rem; - transition: transform 0.3s; } - -.home .card:hover, -.contributors.list .card:hover, -.blog.list .card:hover { - transform: scale(1.025); } - -.home .card-body, -.contributors.list .card-body, -.blog.list .card-body { - padding: 0 2rem 1rem; } - -.blog-header { - text-align: center; - margin-bottom: 2rem; } - -.blog-footer { - text-align: center; } - -.lead { - color: #5d2f86; } - -body.dark .lead { - color: #8ed6fb; } - -.docs-links, -.docs-toc { - scrollbar-width: thin; - scrollbar-color: #fff #fff; } - -.docs-links::-webkit-scrollbar, -.docs-toc::-webkit-scrollbar { - width: 5px; } - -.docs-links::-webkit-scrollbar-track, -.docs-toc::-webkit-scrollbar-track { - background: #fff; } - -.docs-links::-webkit-scrollbar-thumb, -.docs-toc::-webkit-scrollbar-thumb { - background: #fff; } - -.docs-links:hover, -.docs-toc:hover { - scrollbar-width: thin; - scrollbar-color: #e9ecef #fff; } - -.docs-links:hover::-webkit-scrollbar-thumb, -.docs-toc:hover::-webkit-scrollbar-thumb { - background: #e9ecef; } - -.docs-links::-webkit-scrollbar-thumb:hover, -.docs-toc::-webkit-scrollbar-thumb:hover { - background: #e9ecef; } - -.docs-links h3, .docs-links .h3, -.page-links h3, -.page-links .h3 { - text-transform: uppercase; - font-size: 1rem; - margin: 1.25rem 0 0.5rem 0; - padding: 1.5rem 0 0 0; } - -@media (min-width: 992px) { - .docs-links h3, .docs-links .h3, - .page-links h3, - .page-links .h3 { - margin: 1.125rem 1.5rem 0.75rem 0; - padding: 1.375rem 0 0 0; } } - -.docs-links h3:not(:first-child), .docs-links .h3:not(:first-child) { - border-top: 1px solid #e9ecef; } - -a.docs-link { - color: #1d2d35; - display: block; - padding: 0.125rem 0; - font-size: 1rem; } - -.page-links li { - margin-top: 0.375rem; - padding-top: 0.375rem; } - -.page-links li ul li { - border-top: none; - padding-left: 1rem; - margin-top: 0.125rem; - padding-top: 0.125rem; } - -.page-links li:not(:first-child) { - border-top: 1px dashed #e9ecef; } - -.page-links a { - color: #1d2d35; - display: block; - padding: 0.125rem 0; - font-size: 0.9375rem; } - -.docs-link:hover, -.docs-link.active, -.page-links a:hover { - text-decoration: none; - color: #5d2f86; } - -.docs-links h3.sidebar-link, .docs-links .sidebar-link.h3, -.page-links h3.sidebar-link, -.page-links .sidebar-link.h3 { - text-transform: none; - font-size: 1.125rem; - font-weight: normal; } - -.docs-links h3.sidebar-link a, .docs-links .sidebar-link.h3 a, -.page-links h3.sidebar-link a, -.page-links .sidebar-link.h3 a { - color: #1d2d35; } - -.docs-links h3.sidebar-link a:hover, .docs-links .sidebar-link.h3 a:hover, -.page-links h3.sidebar-link a:hover, -.page-links .sidebar-link.h3 a:hover { - text-decoration: underline; } - -/*# sourceMappingURL=main.css.map */ \ No newline at end of file diff --git a/main.css.map b/main.css.map deleted file mode 100644 index 8a0f2ca..0000000 --- a/main.css.map +++ /dev/null @@ -1,221 +0,0 @@ -{ - "version": 3, - "file": "main.css", - "sourceRoot": "/src/atm/code/mcaptcha/website", - "sources": [ - "assets/scss/app.scss", - "node_modules/bootstrap/scss/_functions.scss", - "assets/scss/common/_variables.scss", - "node_modules/bootstrap/scss/bootstrap.scss", - "node_modules/bootstrap/scss/mixins/_banner.scss", - "node_modules/bootstrap/scss/_functions.scss", - "node_modules/bootstrap/scss/_variables.scss", - "node_modules/bootstrap/scss/_maps.scss", - "node_modules/bootstrap/scss/_mixins.scss", - "node_modules/bootstrap/scss/vendor/_rfs.scss", - "node_modules/bootstrap/scss/mixins/_deprecate.scss", - "node_modules/bootstrap/scss/mixins/_breakpoints.scss", - "node_modules/bootstrap/scss/mixins/_color-scheme.scss", - "node_modules/bootstrap/scss/mixins/_image.scss", - "node_modules/bootstrap/scss/mixins/_resize.scss", - "node_modules/bootstrap/scss/mixins/_visually-hidden.scss", - "node_modules/bootstrap/scss/mixins/_reset-text.scss", - "node_modules/bootstrap/scss/mixins/_text-truncate.scss", - "node_modules/bootstrap/scss/mixins/_utilities.scss", - "node_modules/bootstrap/scss/mixins/_alert.scss", - "node_modules/bootstrap/scss/mixins/_backdrop.scss", - "node_modules/bootstrap/scss/mixins/_buttons.scss", - "node_modules/bootstrap/scss/mixins/_caret.scss", - "node_modules/bootstrap/scss/mixins/_pagination.scss", - "node_modules/bootstrap/scss/mixins/_lists.scss", - "node_modules/bootstrap/scss/mixins/_list-group.scss", - "node_modules/bootstrap/scss/mixins/_forms.scss", - "node_modules/bootstrap/scss/mixins/_table-variants.scss", - "node_modules/bootstrap/scss/mixins/_border-radius.scss", - "node_modules/bootstrap/scss/mixins/_box-shadow.scss", - "node_modules/bootstrap/scss/mixins/_gradients.scss", - "node_modules/bootstrap/scss/mixins/_transition.scss", - "node_modules/bootstrap/scss/mixins/_clearfix.scss", - "node_modules/bootstrap/scss/mixins/_container.scss", - "node_modules/bootstrap/scss/mixins/_grid.scss", - "node_modules/bootstrap/scss/_utilities.scss", - "node_modules/bootstrap/scss/_root.scss", - "node_modules/bootstrap/scss/_reboot.scss", - "node_modules/bootstrap/scss/_type.scss", - "node_modules/bootstrap/scss/_images.scss", - "node_modules/bootstrap/scss/_containers.scss", - "node_modules/bootstrap/scss/_grid.scss", - "node_modules/bootstrap/scss/_tables.scss", - "node_modules/bootstrap/scss/_forms.scss", - "node_modules/bootstrap/scss/forms/_labels.scss", - "node_modules/bootstrap/scss/forms/_form-text.scss", - "node_modules/bootstrap/scss/forms/_form-control.scss", - "node_modules/bootstrap/scss/forms/_form-select.scss", - "node_modules/bootstrap/scss/forms/_form-check.scss", - "node_modules/bootstrap/scss/forms/_form-range.scss", - "node_modules/bootstrap/scss/forms/_floating-labels.scss", - "node_modules/bootstrap/scss/forms/_input-group.scss", - "node_modules/bootstrap/scss/forms/_validation.scss", - "node_modules/bootstrap/scss/_buttons.scss", - "node_modules/bootstrap/scss/_transitions.scss", - "node_modules/bootstrap/scss/_dropdown.scss", - "node_modules/bootstrap/scss/_button-group.scss", - "node_modules/bootstrap/scss/_nav.scss", - "node_modules/bootstrap/scss/_navbar.scss", - "node_modules/bootstrap/scss/_card.scss", - "node_modules/bootstrap/scss/_accordion.scss", - "node_modules/bootstrap/scss/_breadcrumb.scss", - "node_modules/bootstrap/scss/_pagination.scss", - "node_modules/bootstrap/scss/_badge.scss", - "node_modules/bootstrap/scss/_alert.scss", - "node_modules/bootstrap/scss/_progress.scss", - "node_modules/bootstrap/scss/_list-group.scss", - "node_modules/bootstrap/scss/_close.scss", - "node_modules/bootstrap/scss/_toasts.scss", - "node_modules/bootstrap/scss/_modal.scss", - "node_modules/bootstrap/scss/_tooltip.scss", - "node_modules/bootstrap/scss/_popover.scss", - "node_modules/bootstrap/scss/_carousel.scss", - "node_modules/bootstrap/scss/_spinners.scss", - "node_modules/bootstrap/scss/_offcanvas.scss", - "node_modules/bootstrap/scss/_placeholders.scss", - "node_modules/bootstrap/scss/_helpers.scss", - "node_modules/bootstrap/scss/helpers/_clearfix.scss", - "node_modules/bootstrap/scss/helpers/_color-bg.scss", - "node_modules/bootstrap/scss/helpers/_colored-links.scss", - "node_modules/bootstrap/scss/helpers/_ratio.scss", - "node_modules/bootstrap/scss/helpers/_position.scss", - "node_modules/bootstrap/scss/helpers/_stacks.scss", - "node_modules/bootstrap/scss/helpers/_visually-hidden.scss", - "node_modules/bootstrap/scss/helpers/_stretched-link.scss", - "node_modules/bootstrap/scss/helpers/_text-truncation.scss", - "node_modules/bootstrap/scss/helpers/_vr.scss", - "node_modules/bootstrap/scss/utilities/_api.scss", - "assets/scss/common/_fonts.scss", - "assets/scss/common/_global.scss", - "assets/scss/common/_dark.scss", - "assets/scss/components/_alerts.scss", - "assets/scss/components/_buttons.scss", - "assets/scss/components/_code.scss", - "assets/scss/components/_syntax.scss", - "assets/scss/components/_comments.scss", - "assets/scss/components/_forms.scss", - "assets/scss/components/_images.scss", - "assets/scss/components/_search.scss", - "assets/scss/components/_tables.scss", - "assets/scss/layouts/_footer.scss", - "assets/scss/layouts/_header.scss", - "assets/scss/layouts/_pages.scss", - "assets/scss/layouts/_posts.scss", - "assets/scss/layouts/_sidebar.scss" - ], - "sourcesContent": [ - "/** Import Bootstrap functions */\n@import \"bootstrap/scss/functions\";\n\n/** Import theme variables */\n@import \"common/variables\";\n\n/** Import Bootstrap */\n@import \"bootstrap/scss/bootstrap\";\n\n/** Import theme styles */\n@import \"common/fonts\";\n@import \"common/global\";\n@import \"common/dark\";\n@import \"components/alerts\";\n@import \"components/buttons\";\n@import \"components/code\";\n@import \"components/syntax\";\n@import \"components/comments\";\n@import \"components/forms\";\n@import \"components/images\";\n@import \"components/search\";\n@import \"components/tables\";\n@import \"layouts/footer\";\n@import \"layouts/header\";\n@import \"layouts/pages\";\n@import \"layouts/posts\";\n@import \"layouts/sidebar\";\n", - "// Bootstrap functions\n//\n// Utility mixins and functions for evaluating source code across our variables, maps, and mixins.\n\n// Ascending\n// Used to evaluate Sass maps like our grid breakpoints.\n@mixin _assert-ascending($map, $map-name) {\n $prev-key: null;\n $prev-num: null;\n @each $key, $num in $map {\n @if $prev-num == null or unit($num) == \"%\" or unit($prev-num) == \"%\" {\n // Do nothing\n } @else if not comparable($prev-num, $num) {\n @warn \"Potentially invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} whose unit makes it incomparable to #{$prev-num}, the value of the previous key '#{$prev-key}' !\";\n } @else if $prev-num >= $num {\n @warn \"Invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} which isn't greater than #{$prev-num}, the value of the previous key '#{$prev-key}' !\";\n }\n $prev-key: $key;\n $prev-num: $num;\n }\n}\n\n// Starts at zero\n// Used to ensure the min-width of the lowest breakpoint starts at 0.\n@mixin _assert-starts-at-zero($map, $map-name: \"$grid-breakpoints\") {\n @if length($map) > 0 {\n $values: map-values($map);\n $first-value: nth($values, 1);\n @if $first-value != 0 {\n @warn \"First breakpoint in #{$map-name} must start at 0, but starts at #{$first-value}.\";\n }\n }\n}\n\n// Colors\n@function to-rgb($value) {\n @return red($value), green($value), blue($value);\n}\n\n// stylelint-disable scss/dollar-variable-pattern\n@function rgba-css-var($identifier, $target) {\n @if $identifier == \"body\" and $target == \"bg\" {\n @return rgba(var(--#{$prefix}#{$identifier}-bg-rgb), var(--#{$prefix}#{$target}-opacity));\n } @if $identifier == \"body\" and $target == \"text\" {\n @return rgba(var(--#{$prefix}#{$identifier}-color-rgb), var(--#{$prefix}#{$target}-opacity));\n } @else {\n @return rgba(var(--#{$prefix}#{$identifier}-rgb), var(--#{$prefix}#{$target}-opacity));\n }\n}\n\n@function map-loop($map, $func, $args...) {\n $_map: ();\n\n @each $key, $value in $map {\n // allow to pass the $key and $value of the map as an function argument\n $_args: ();\n @each $arg in $args {\n $_args: append($_args, if($arg == \"$key\", $key, if($arg == \"$value\", $value, $arg)));\n }\n\n $_map: map-merge($_map, ($key: call(get-function($func), $_args...)));\n }\n\n @return $_map;\n}\n// stylelint-enable scss/dollar-variable-pattern\n\n@function varify($list) {\n $result: null;\n @each $entry in $list {\n $result: append($result, var(--#{$prefix}#{$entry}), space);\n }\n @return $result;\n}\n\n// Internal Bootstrap function to turn maps into its negative variant.\n// It prefixes the keys with `n` and makes the value negative.\n@function negativify-map($map) {\n $result: ();\n @each $key, $value in $map {\n @if $key != 0 {\n $result: map-merge($result, (\"n\" + $key: (-$value)));\n }\n }\n @return $result;\n}\n\n// Get multiple keys from a sass map\n@function map-get-multiple($map, $values) {\n $result: ();\n @each $key, $value in $map {\n @if (index($values, $key) != null) {\n $result: map-merge($result, ($key: $value));\n }\n }\n @return $result;\n}\n\n// Merge multiple maps\n@function map-merge-multiple($maps...) {\n $merged-maps: ();\n\n @each $map in $maps {\n $merged-maps: map-merge($merged-maps, $map);\n }\n @return $merged-maps;\n}\n\n// Replace `$search` with `$replace` in `$string`\n// Used on our SVG icon backgrounds for custom forms.\n//\n// @author Kitty Giraudel\n// @param {String} $string - Initial string\n// @param {String} $search - Substring to replace\n// @param {String} $replace ('') - New value\n// @return {String} - Updated string\n@function str-replace($string, $search, $replace: \"\") {\n $index: str-index($string, $search);\n\n @if $index {\n @return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace);\n }\n\n @return $string;\n}\n\n// See https://codepen.io/kevinweber/pen/dXWoRw\n//\n// Requires the use of quotes around data URIs.\n\n@function escape-svg($string) {\n @if str-index($string, \"data:image/svg+xml\") {\n @each $char, $encoded in $escaped-characters {\n // Do not escape the url brackets\n @if str-index($string, \"url(\") == 1 {\n $string: url(\"#{str-replace(str-slice($string, 6, -3), $char, $encoded)}\");\n } @else {\n $string: str-replace($string, $char, $encoded);\n }\n }\n }\n\n @return $string;\n}\n\n// Color contrast\n// See https://github.com/twbs/bootstrap/pull/30168\n\n// A list of pre-calculated numbers of pow(divide((divide($value, 255) + .055), 1.055), 2.4). (from 0 to 255)\n// stylelint-disable-next-line scss/dollar-variable-default, scss/dollar-variable-pattern\n$_luminance-list: .0008 .001 .0011 .0013 .0015 .0017 .002 .0022 .0025 .0027 .003 .0033 .0037 .004 .0044 .0048 .0052 .0056 .006 .0065 .007 .0075 .008 .0086 .0091 .0097 .0103 .011 .0116 .0123 .013 .0137 .0144 .0152 .016 .0168 .0176 .0185 .0194 .0203 .0212 .0222 .0232 .0242 .0252 .0262 .0273 .0284 .0296 .0307 .0319 .0331 .0343 .0356 .0369 .0382 .0395 .0409 .0423 .0437 .0452 .0467 .0482 .0497 .0513 .0529 .0545 .0561 .0578 .0595 .0612 .063 .0648 .0666 .0685 .0704 .0723 .0742 .0762 .0782 .0802 .0823 .0844 .0865 .0887 .0908 .0931 .0953 .0976 .0999 .1022 .1046 .107 .1095 .1119 .1144 .117 .1195 .1221 .1248 .1274 .1301 .1329 .1356 .1384 .1413 .1441 .147 .15 .1529 .1559 .159 .162 .1651 .1683 .1714 .1746 .1779 .1812 .1845 .1878 .1912 .1946 .1981 .2016 .2051 .2086 .2122 .2159 .2195 .2232 .227 .2307 .2346 .2384 .2423 .2462 .2502 .2542 .2582 .2623 .2664 .2705 .2747 .2789 .2831 .2874 .2918 .2961 .3005 .305 .3095 .314 .3185 .3231 .3278 .3325 .3372 .3419 .3467 .3515 .3564 .3613 .3663 .3712 .3763 .3813 .3864 .3916 .3968 .402 .4072 .4125 .4179 .4233 .4287 .4342 .4397 .4452 .4508 .4564 .4621 .4678 .4735 .4793 .4851 .491 .4969 .5029 .5089 .5149 .521 .5271 .5333 .5395 .5457 .552 .5583 .5647 .5711 .5776 .5841 .5906 .5972 .6038 .6105 .6172 .624 .6308 .6376 .6445 .6514 .6584 .6654 .6724 .6795 .6867 .6939 .7011 .7084 .7157 .7231 .7305 .7379 .7454 .7529 .7605 .7682 .7758 .7835 .7913 .7991 .807 .8148 .8228 .8308 .8388 .8469 .855 .8632 .8714 .8796 .8879 .8963 .9047 .9131 .9216 .9301 .9387 .9473 .956 .9647 .9734 .9823 .9911 1;\n\n@function color-contrast($background, $color-contrast-dark: $color-contrast-dark, $color-contrast-light: $color-contrast-light, $min-contrast-ratio: $min-contrast-ratio) {\n $foregrounds: $color-contrast-light, $color-contrast-dark, $white, $black;\n $max-ratio: 0;\n $max-ratio-color: null;\n\n @each $color in $foregrounds {\n $contrast-ratio: contrast-ratio($background, $color);\n @if $contrast-ratio > $min-contrast-ratio {\n @return $color;\n } @else if $contrast-ratio > $max-ratio {\n $max-ratio: $contrast-ratio;\n $max-ratio-color: $color;\n }\n }\n\n @warn \"Found no color leading to #{$min-contrast-ratio}:1 contrast ratio against #{$background}...\";\n\n @return $max-ratio-color;\n}\n\n@function contrast-ratio($background, $foreground: $color-contrast-light) {\n $l1: luminance($background);\n $l2: luminance(opaque($background, $foreground));\n\n @return if($l1 > $l2, divide($l1 + .05, $l2 + .05), divide($l2 + .05, $l1 + .05));\n}\n\n// Return WCAG2.1 relative luminance\n// See https://www.w3.org/TR/WCAG/#dfn-relative-luminance\n// See https://www.w3.org/TR/WCAG/#dfn-contrast-ratio\n@function luminance($color) {\n $rgb: (\n \"r\": red($color),\n \"g\": green($color),\n \"b\": blue($color)\n );\n\n @each $name, $value in $rgb {\n $value: if(divide($value, 255) < .03928, divide(divide($value, 255), 12.92), nth($_luminance-list, $value + 1));\n $rgb: map-merge($rgb, ($name: $value));\n }\n\n @return (map-get($rgb, \"r\") * .2126) + (map-get($rgb, \"g\") * .7152) + (map-get($rgb, \"b\") * .0722);\n}\n\n// Return opaque color\n// opaque(#fff, rgba(0, 0, 0, .5)) => #808080\n@function opaque($background, $foreground) {\n @return mix(rgba($foreground, 1), $background, opacity($foreground) * 100%);\n}\n\n// scss-docs-start color-functions\n// Tint a color: mix a color with white\n@function tint-color($color, $weight) {\n @return mix(white, $color, $weight);\n}\n\n// Shade a color: mix a color with black\n@function shade-color($color, $weight) {\n @return mix(black, $color, $weight);\n}\n\n// Shade the color if the weight is positive, else tint it\n@function shift-color($color, $weight) {\n @return if($weight > 0, shade-color($color, $weight), tint-color($color, -$weight));\n}\n// scss-docs-end color-functions\n\n// Return valid calc\n@function add($value1, $value2, $return-calc: true) {\n @if $value1 == null {\n @return $value2;\n }\n\n @if $value2 == null {\n @return $value1;\n }\n\n @if type-of($value1) == number and type-of($value2) == number and comparable($value1, $value2) {\n @return $value1 + $value2;\n }\n\n @return if($return-calc == true, calc(#{$value1} + #{$value2}), $value1 + unquote(\" + \") + $value2);\n}\n\n@function subtract($value1, $value2, $return-calc: true) {\n @if $value1 == null and $value2 == null {\n @return null;\n }\n\n @if $value1 == null {\n @return -$value2;\n }\n\n @if $value2 == null {\n @return $value1;\n }\n\n @if type-of($value1) == number and type-of($value2) == number and comparable($value1, $value2) {\n @return $value1 - $value2;\n }\n\n @if type-of($value2) != number {\n $value2: unquote(\"(\") + $value2 + unquote(\")\");\n }\n\n @return if($return-calc == true, calc(#{$value1} - #{$value2}), $value1 + unquote(\" - \") + $value2);\n}\n\n@function divide($dividend, $divisor, $precision: 10) {\n $sign: if($dividend > 0 and $divisor > 0 or $dividend < 0 and $divisor < 0, 1, -1);\n $dividend: abs($dividend);\n $divisor: abs($divisor);\n @if $dividend == 0 {\n @return 0;\n }\n @if $divisor == 0 {\n @error \"Cannot divide by 0\";\n }\n $remainder: $dividend;\n $result: 0;\n $factor: 10;\n @while ($remainder > 0 and $precision >= 0) {\n $quotient: 0;\n @while ($remainder >= $divisor) {\n $remainder: $remainder - $divisor;\n $quotient: $quotient + 1;\n }\n $result: $result * 10 + $quotient;\n $factor: $factor * .1;\n $remainder: $remainder * 10;\n $precision: $precision - 1;\n @if ($precision < 0 and $remainder >= $divisor * 5) {\n $result: $result + 1;\n }\n }\n $result: $result * $factor * $sign;\n $dividend-unit: unit($dividend);\n $divisor-unit: unit($divisor);\n $unit-map: (\n \"px\": 1px,\n \"rem\": 1rem,\n \"em\": 1em,\n \"%\": 1%\n );\n @if ($dividend-unit != $divisor-unit and map-has-key($unit-map, $dividend-unit)) {\n $result: $result * map-get($unit-map, $dividend-unit);\n }\n @return $result;\n}\n", - "// Color system\n\n$white: #fff;\n$gray-100: #f8f9fa;\n$gray-200: #e9ecef;\n$gray-300: #dee2e6;\n$gray-400: #ced4da;\n$gray-500: #adb5bd;\n$gray-600: #6c757d;\n$gray-700: #495057;\n$gray-800: #343a40;\n$gray-900: #212529;\n$black: #000;\n\n$yellow: #ffe000;\n$black: #1d2d35;\n$beige: #fbf7f0;\n// $red: #e55235;\n$purple: #5d2f86;\n$brown: #aa9c84;\n\n$blue-300: #8ed6fb;\n$pink-500: #d32e9d;\n\n$primary: $purple;\n\n// Options\n//\n// Quickly modify global styling by enabling or disabling optional features.\n\n$enable-caret: true;\n$enable-rounded: true;\n$enable-shadows: false;\n$enable-gradients: false;\n$enable-transitions: true;\n$enable-reduced-motion: true;\n$enable-smooth-scroll: true;\n$enable-grid-classes: true;\n$enable-button-pointers: true;\n$enable-rfs: true;\n$enable-validation-icons: true;\n$enable-negative-margins: true;\n$enable-deprecation-messages: true;\n$enable-important-utilities: true;\n\n/** Bootstrap navbar fix (https://git.io/fADqW) */\n$navbar-dark-toggler-icon-bg: none;\n$navbar-light-toggler-icon-bg: none;\n\n// Options\n//\n// Quickly modify global styling by enabling or disabling optional features.\n\n// $enable-responsive-font-sizes: true;\n\n// Body\n//\n// Settings for the `` element.\n\n$body-bg: $white;\n$body-color: $black;\n\n// Links\n//\n// Style anchor elements.\n\n$link-color: $primary;\n$link-decoration: none;\n\n// Grid containers\n//\n// Define the maximum width of `.container` for different screen sizes.\n\n$container-max-widths: (\n sm: 540px,\n md: 720px,\n lg: 960px,\n xl: 1240px,\n xxl: 1320px\n);\n\n@include _assert-ascending($container-max-widths, \"$container-max-widths\");\n\n// Grid columns\n//\n// Set the number of columns and specify the width of the gutters.\n\n$grid-columns: 16;\n$grid-gutter-width: 48px;\n$grid-row-columns: 6;\n\n// Components\n//\n// Define common padding and border radius sizes and more.\n\n$border-color: $gray-200;\n\n// Typography\n//\n// Font, line-height, and color for body text, headings, and more.\n\n// stylelint-disable value-keyword-case\n$font-family-sans-serif: \"Jost\", -apple-system, blinkmacsystemfont, \"Segoe UI\", roboto, \"Helvetica Neue\", arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n$font-family-monospace: sfmono-regular, menlo, monaco, consolas, \"Liberation Mono\", \"Courier New\", monospace;\n$font-family-base: $font-family-sans-serif;\n// stylelint-enable value-keyword-case\n\n$font-size-base: 1rem; // Assumes the browser default, typically `16px`\n$font-size-xl: $font-size-base * 1.375;\n$font-size-lg: $font-size-base * 1.25;\n$font-size-md: $font-size-base * 1.125;\n$font-size-sm: $font-size-base * 0.875;\n\n$line-height-base: 1.5;\n\n$headings-font-family: null;\n$headings-font-weight: 700;\n\n$lead-font-weight: 400;\n\n// Spacing\n//\n// Control the default styling of most Bootstrap elements by modifying these\n// variables. Mostly focused on spacing.\n// You can add more entries to the $spacers map, should you need more variation.\n\n$spacer: 1rem;\n\n// Navbar\n\n$navbar-padding-y: $spacer / 2;\n$navbar-padding-x: null;\n\n$navbar-nav-link-padding-x: 0.5rem;\n\n$navbar-light-color: $black;\n$navbar-light-hover-color: $primary;\n$navbar-light-active-color: $primary;\n\n// Cards\n\n$card-border-color: $gray-200;\n\n// Alerts\n//\n// Define alert colors, border radius, and padding.\n\n$alert-padding-y: $spacer;\n$alert-padding-x: $spacer * 1.5;\n$alert-margin-bottom: 0;\n$alert-border-radius: 0;\n$alert-link-font-weight: $headings-font-weight;\n$alert-border-width: 0;\n\n$alert-bg-scale: 0;\n$alert-border-scale: 0;\n$alert-color-scale: 0;\n", - "@import \"mixins/banner\";\n@include bsBanner(\"\");\n\n\n// scss-docs-start import-stack\n// Configuration\n@import \"functions\";\n@import \"variables\";\n@import \"maps\";\n@import \"mixins\";\n@import \"utilities\";\n\n// Layout & components\n@import \"root\";\n@import \"reboot\";\n@import \"type\";\n@import \"images\";\n@import \"containers\";\n@import \"grid\";\n@import \"tables\";\n@import \"forms\";\n@import \"buttons\";\n@import \"transitions\";\n@import \"dropdown\";\n@import \"button-group\";\n@import \"nav\";\n@import \"navbar\";\n@import \"card\";\n@import \"accordion\";\n@import \"breadcrumb\";\n@import \"pagination\";\n@import \"badge\";\n@import \"alert\";\n@import \"progress\";\n@import \"list-group\";\n@import \"close\";\n@import \"toasts\";\n@import \"modal\";\n@import \"tooltip\";\n@import \"popover\";\n@import \"carousel\";\n@import \"spinners\";\n@import \"offcanvas\";\n@import \"placeholders\";\n\n// Helpers\n@import \"helpers\";\n\n// Utilities\n@import \"utilities/api\";\n// scss-docs-end import-stack\n", - "@mixin bsBanner($file) {\n /*!\n * Bootstrap #{$file} v5.2.3 (https://getbootstrap.com/)\n * Copyright 2011-2022 The Bootstrap Authors\n * Copyright 2011-2022 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n}\n\n", - "// Bootstrap functions\n//\n// Utility mixins and functions for evaluating source code across our variables, maps, and mixins.\n\n// Ascending\n// Used to evaluate Sass maps like our grid breakpoints.\n@mixin _assert-ascending($map, $map-name) {\n $prev-key: null;\n $prev-num: null;\n @each $key, $num in $map {\n @if $prev-num == null or unit($num) == \"%\" or unit($prev-num) == \"%\" {\n // Do nothing\n } @else if not comparable($prev-num, $num) {\n @warn \"Potentially invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} whose unit makes it incomparable to #{$prev-num}, the value of the previous key '#{$prev-key}' !\";\n } @else if $prev-num >= $num {\n @warn \"Invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} which isn't greater than #{$prev-num}, the value of the previous key '#{$prev-key}' !\";\n }\n $prev-key: $key;\n $prev-num: $num;\n }\n}\n\n// Starts at zero\n// Used to ensure the min-width of the lowest breakpoint starts at 0.\n@mixin _assert-starts-at-zero($map, $map-name: \"$grid-breakpoints\") {\n @if length($map) > 0 {\n $values: map-values($map);\n $first-value: nth($values, 1);\n @if $first-value != 0 {\n @warn \"First breakpoint in #{$map-name} must start at 0, but starts at #{$first-value}.\";\n }\n }\n}\n\n// Colors\n@function to-rgb($value) {\n @return red($value), green($value), blue($value);\n}\n\n// stylelint-disable scss/dollar-variable-pattern\n@function rgba-css-var($identifier, $target) {\n @if $identifier == \"body\" and $target == \"bg\" {\n @return rgba(var(--#{$prefix}#{$identifier}-bg-rgb), var(--#{$prefix}#{$target}-opacity));\n } @if $identifier == \"body\" and $target == \"text\" {\n @return rgba(var(--#{$prefix}#{$identifier}-color-rgb), var(--#{$prefix}#{$target}-opacity));\n } @else {\n @return rgba(var(--#{$prefix}#{$identifier}-rgb), var(--#{$prefix}#{$target}-opacity));\n }\n}\n\n@function map-loop($map, $func, $args...) {\n $_map: ();\n\n @each $key, $value in $map {\n // allow to pass the $key and $value of the map as an function argument\n $_args: ();\n @each $arg in $args {\n $_args: append($_args, if($arg == \"$key\", $key, if($arg == \"$value\", $value, $arg)));\n }\n\n $_map: map-merge($_map, ($key: call(get-function($func), $_args...)));\n }\n\n @return $_map;\n}\n// stylelint-enable scss/dollar-variable-pattern\n\n@function varify($list) {\n $result: null;\n @each $entry in $list {\n $result: append($result, var(--#{$prefix}#{$entry}), space);\n }\n @return $result;\n}\n\n// Internal Bootstrap function to turn maps into its negative variant.\n// It prefixes the keys with `n` and makes the value negative.\n@function negativify-map($map) {\n $result: ();\n @each $key, $value in $map {\n @if $key != 0 {\n $result: map-merge($result, (\"n\" + $key: (-$value)));\n }\n }\n @return $result;\n}\n\n// Get multiple keys from a sass map\n@function map-get-multiple($map, $values) {\n $result: ();\n @each $key, $value in $map {\n @if (index($values, $key) != null) {\n $result: map-merge($result, ($key: $value));\n }\n }\n @return $result;\n}\n\n// Merge multiple maps\n@function map-merge-multiple($maps...) {\n $merged-maps: ();\n\n @each $map in $maps {\n $merged-maps: map-merge($merged-maps, $map);\n }\n @return $merged-maps;\n}\n\n// Replace `$search` with `$replace` in `$string`\n// Used on our SVG icon backgrounds for custom forms.\n//\n// @author Kitty Giraudel\n// @param {String} $string - Initial string\n// @param {String} $search - Substring to replace\n// @param {String} $replace ('') - New value\n// @return {String} - Updated string\n@function str-replace($string, $search, $replace: \"\") {\n $index: str-index($string, $search);\n\n @if $index {\n @return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace);\n }\n\n @return $string;\n}\n\n// See https://codepen.io/kevinweber/pen/dXWoRw\n//\n// Requires the use of quotes around data URIs.\n\n@function escape-svg($string) {\n @if str-index($string, \"data:image/svg+xml\") {\n @each $char, $encoded in $escaped-characters {\n // Do not escape the url brackets\n @if str-index($string, \"url(\") == 1 {\n $string: url(\"#{str-replace(str-slice($string, 6, -3), $char, $encoded)}\");\n } @else {\n $string: str-replace($string, $char, $encoded);\n }\n }\n }\n\n @return $string;\n}\n\n// Color contrast\n// See https://github.com/twbs/bootstrap/pull/30168\n\n// A list of pre-calculated numbers of pow(divide((divide($value, 255) + .055), 1.055), 2.4). (from 0 to 255)\n// stylelint-disable-next-line scss/dollar-variable-default, scss/dollar-variable-pattern\n$_luminance-list: .0008 .001 .0011 .0013 .0015 .0017 .002 .0022 .0025 .0027 .003 .0033 .0037 .004 .0044 .0048 .0052 .0056 .006 .0065 .007 .0075 .008 .0086 .0091 .0097 .0103 .011 .0116 .0123 .013 .0137 .0144 .0152 .016 .0168 .0176 .0185 .0194 .0203 .0212 .0222 .0232 .0242 .0252 .0262 .0273 .0284 .0296 .0307 .0319 .0331 .0343 .0356 .0369 .0382 .0395 .0409 .0423 .0437 .0452 .0467 .0482 .0497 .0513 .0529 .0545 .0561 .0578 .0595 .0612 .063 .0648 .0666 .0685 .0704 .0723 .0742 .0762 .0782 .0802 .0823 .0844 .0865 .0887 .0908 .0931 .0953 .0976 .0999 .1022 .1046 .107 .1095 .1119 .1144 .117 .1195 .1221 .1248 .1274 .1301 .1329 .1356 .1384 .1413 .1441 .147 .15 .1529 .1559 .159 .162 .1651 .1683 .1714 .1746 .1779 .1812 .1845 .1878 .1912 .1946 .1981 .2016 .2051 .2086 .2122 .2159 .2195 .2232 .227 .2307 .2346 .2384 .2423 .2462 .2502 .2542 .2582 .2623 .2664 .2705 .2747 .2789 .2831 .2874 .2918 .2961 .3005 .305 .3095 .314 .3185 .3231 .3278 .3325 .3372 .3419 .3467 .3515 .3564 .3613 .3663 .3712 .3763 .3813 .3864 .3916 .3968 .402 .4072 .4125 .4179 .4233 .4287 .4342 .4397 .4452 .4508 .4564 .4621 .4678 .4735 .4793 .4851 .491 .4969 .5029 .5089 .5149 .521 .5271 .5333 .5395 .5457 .552 .5583 .5647 .5711 .5776 .5841 .5906 .5972 .6038 .6105 .6172 .624 .6308 .6376 .6445 .6514 .6584 .6654 .6724 .6795 .6867 .6939 .7011 .7084 .7157 .7231 .7305 .7379 .7454 .7529 .7605 .7682 .7758 .7835 .7913 .7991 .807 .8148 .8228 .8308 .8388 .8469 .855 .8632 .8714 .8796 .8879 .8963 .9047 .9131 .9216 .9301 .9387 .9473 .956 .9647 .9734 .9823 .9911 1;\n\n@function color-contrast($background, $color-contrast-dark: $color-contrast-dark, $color-contrast-light: $color-contrast-light, $min-contrast-ratio: $min-contrast-ratio) {\n $foregrounds: $color-contrast-light, $color-contrast-dark, $white, $black;\n $max-ratio: 0;\n $max-ratio-color: null;\n\n @each $color in $foregrounds {\n $contrast-ratio: contrast-ratio($background, $color);\n @if $contrast-ratio > $min-contrast-ratio {\n @return $color;\n } @else if $contrast-ratio > $max-ratio {\n $max-ratio: $contrast-ratio;\n $max-ratio-color: $color;\n }\n }\n\n @warn \"Found no color leading to #{$min-contrast-ratio}:1 contrast ratio against #{$background}...\";\n\n @return $max-ratio-color;\n}\n\n@function contrast-ratio($background, $foreground: $color-contrast-light) {\n $l1: luminance($background);\n $l2: luminance(opaque($background, $foreground));\n\n @return if($l1 > $l2, divide($l1 + .05, $l2 + .05), divide($l2 + .05, $l1 + .05));\n}\n\n// Return WCAG2.1 relative luminance\n// See https://www.w3.org/TR/WCAG/#dfn-relative-luminance\n// See https://www.w3.org/TR/WCAG/#dfn-contrast-ratio\n@function luminance($color) {\n $rgb: (\n \"r\": red($color),\n \"g\": green($color),\n \"b\": blue($color)\n );\n\n @each $name, $value in $rgb {\n $value: if(divide($value, 255) < .03928, divide(divide($value, 255), 12.92), nth($_luminance-list, $value + 1));\n $rgb: map-merge($rgb, ($name: $value));\n }\n\n @return (map-get($rgb, \"r\") * .2126) + (map-get($rgb, \"g\") * .7152) + (map-get($rgb, \"b\") * .0722);\n}\n\n// Return opaque color\n// opaque(#fff, rgba(0, 0, 0, .5)) => #808080\n@function opaque($background, $foreground) {\n @return mix(rgba($foreground, 1), $background, opacity($foreground) * 100%);\n}\n\n// scss-docs-start color-functions\n// Tint a color: mix a color with white\n@function tint-color($color, $weight) {\n @return mix(white, $color, $weight);\n}\n\n// Shade a color: mix a color with black\n@function shade-color($color, $weight) {\n @return mix(black, $color, $weight);\n}\n\n// Shade the color if the weight is positive, else tint it\n@function shift-color($color, $weight) {\n @return if($weight > 0, shade-color($color, $weight), tint-color($color, -$weight));\n}\n// scss-docs-end color-functions\n\n// Return valid calc\n@function add($value1, $value2, $return-calc: true) {\n @if $value1 == null {\n @return $value2;\n }\n\n @if $value2 == null {\n @return $value1;\n }\n\n @if type-of($value1) == number and type-of($value2) == number and comparable($value1, $value2) {\n @return $value1 + $value2;\n }\n\n @return if($return-calc == true, calc(#{$value1} + #{$value2}), $value1 + unquote(\" + \") + $value2);\n}\n\n@function subtract($value1, $value2, $return-calc: true) {\n @if $value1 == null and $value2 == null {\n @return null;\n }\n\n @if $value1 == null {\n @return -$value2;\n }\n\n @if $value2 == null {\n @return $value1;\n }\n\n @if type-of($value1) == number and type-of($value2) == number and comparable($value1, $value2) {\n @return $value1 - $value2;\n }\n\n @if type-of($value2) != number {\n $value2: unquote(\"(\") + $value2 + unquote(\")\");\n }\n\n @return if($return-calc == true, calc(#{$value1} - #{$value2}), $value1 + unquote(\" - \") + $value2);\n}\n\n@function divide($dividend, $divisor, $precision: 10) {\n $sign: if($dividend > 0 and $divisor > 0 or $dividend < 0 and $divisor < 0, 1, -1);\n $dividend: abs($dividend);\n $divisor: abs($divisor);\n @if $dividend == 0 {\n @return 0;\n }\n @if $divisor == 0 {\n @error \"Cannot divide by 0\";\n }\n $remainder: $dividend;\n $result: 0;\n $factor: 10;\n @while ($remainder > 0 and $precision >= 0) {\n $quotient: 0;\n @while ($remainder >= $divisor) {\n $remainder: $remainder - $divisor;\n $quotient: $quotient + 1;\n }\n $result: $result * 10 + $quotient;\n $factor: $factor * .1;\n $remainder: $remainder * 10;\n $precision: $precision - 1;\n @if ($precision < 0 and $remainder >= $divisor * 5) {\n $result: $result + 1;\n }\n }\n $result: $result * $factor * $sign;\n $dividend-unit: unit($dividend);\n $divisor-unit: unit($divisor);\n $unit-map: (\n \"px\": 1px,\n \"rem\": 1rem,\n \"em\": 1em,\n \"%\": 1%\n );\n @if ($dividend-unit != $divisor-unit and map-has-key($unit-map, $dividend-unit)) {\n $result: $result * map-get($unit-map, $dividend-unit);\n }\n @return $result;\n}\n", - "// Variables\n//\n// Variables should follow the `$component-state-property-size` formula for\n// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.\n\n// Color system\n\n// scss-docs-start gray-color-variables\n$white: #fff !default;\n$gray-100: #f8f9fa !default;\n$gray-200: #e9ecef !default;\n$gray-300: #dee2e6 !default;\n$gray-400: #ced4da !default;\n$gray-500: #adb5bd !default;\n$gray-600: #6c757d !default;\n$gray-700: #495057 !default;\n$gray-800: #343a40 !default;\n$gray-900: #212529 !default;\n$black: #000 !default;\n// scss-docs-end gray-color-variables\n\n// fusv-disable\n// scss-docs-start gray-colors-map\n$grays: (\n \"100\": $gray-100,\n \"200\": $gray-200,\n \"300\": $gray-300,\n \"400\": $gray-400,\n \"500\": $gray-500,\n \"600\": $gray-600,\n \"700\": $gray-700,\n \"800\": $gray-800,\n \"900\": $gray-900\n) !default;\n// scss-docs-end gray-colors-map\n// fusv-enable\n\n// scss-docs-start color-variables\n$blue: #0d6efd !default;\n$indigo: #6610f2 !default;\n$purple: #6f42c1 !default;\n$pink: #d63384 !default;\n$red: #dc3545 !default;\n$orange: #fd7e14 !default;\n$yellow: #ffc107 !default;\n$green: #198754 !default;\n$teal: #20c997 !default;\n$cyan: #0dcaf0 !default;\n// scss-docs-end color-variables\n\n// scss-docs-start colors-map\n$colors: (\n \"blue\": $blue,\n \"indigo\": $indigo,\n \"purple\": $purple,\n \"pink\": $pink,\n \"red\": $red,\n \"orange\": $orange,\n \"yellow\": $yellow,\n \"green\": $green,\n \"teal\": $teal,\n \"cyan\": $cyan,\n \"black\": $black,\n \"white\": $white,\n \"gray\": $gray-600,\n \"gray-dark\": $gray-800\n) !default;\n// scss-docs-end colors-map\n\n// The contrast ratio to reach against white, to determine if color changes from \"light\" to \"dark\". Acceptable values for WCAG 2.0 are 3, 4.5 and 7.\n// See https://www.w3.org/TR/WCAG20/#visual-audio-contrast-contrast\n$min-contrast-ratio: 4.5 !default;\n\n// Customize the light and dark text colors for use in our color contrast function.\n$color-contrast-dark: $black !default;\n$color-contrast-light: $white !default;\n\n// fusv-disable\n$blue-100: tint-color($blue, 80%) !default;\n$blue-200: tint-color($blue, 60%) !default;\n$blue-300: tint-color($blue, 40%) !default;\n$blue-400: tint-color($blue, 20%) !default;\n$blue-500: $blue !default;\n$blue-600: shade-color($blue, 20%) !default;\n$blue-700: shade-color($blue, 40%) !default;\n$blue-800: shade-color($blue, 60%) !default;\n$blue-900: shade-color($blue, 80%) !default;\n\n$indigo-100: tint-color($indigo, 80%) !default;\n$indigo-200: tint-color($indigo, 60%) !default;\n$indigo-300: tint-color($indigo, 40%) !default;\n$indigo-400: tint-color($indigo, 20%) !default;\n$indigo-500: $indigo !default;\n$indigo-600: shade-color($indigo, 20%) !default;\n$indigo-700: shade-color($indigo, 40%) !default;\n$indigo-800: shade-color($indigo, 60%) !default;\n$indigo-900: shade-color($indigo, 80%) !default;\n\n$purple-100: tint-color($purple, 80%) !default;\n$purple-200: tint-color($purple, 60%) !default;\n$purple-300: tint-color($purple, 40%) !default;\n$purple-400: tint-color($purple, 20%) !default;\n$purple-500: $purple !default;\n$purple-600: shade-color($purple, 20%) !default;\n$purple-700: shade-color($purple, 40%) !default;\n$purple-800: shade-color($purple, 60%) !default;\n$purple-900: shade-color($purple, 80%) !default;\n\n$pink-100: tint-color($pink, 80%) !default;\n$pink-200: tint-color($pink, 60%) !default;\n$pink-300: tint-color($pink, 40%) !default;\n$pink-400: tint-color($pink, 20%) !default;\n$pink-500: $pink !default;\n$pink-600: shade-color($pink, 20%) !default;\n$pink-700: shade-color($pink, 40%) !default;\n$pink-800: shade-color($pink, 60%) !default;\n$pink-900: shade-color($pink, 80%) !default;\n\n$red-100: tint-color($red, 80%) !default;\n$red-200: tint-color($red, 60%) !default;\n$red-300: tint-color($red, 40%) !default;\n$red-400: tint-color($red, 20%) !default;\n$red-500: $red !default;\n$red-600: shade-color($red, 20%) !default;\n$red-700: shade-color($red, 40%) !default;\n$red-800: shade-color($red, 60%) !default;\n$red-900: shade-color($red, 80%) !default;\n\n$orange-100: tint-color($orange, 80%) !default;\n$orange-200: tint-color($orange, 60%) !default;\n$orange-300: tint-color($orange, 40%) !default;\n$orange-400: tint-color($orange, 20%) !default;\n$orange-500: $orange !default;\n$orange-600: shade-color($orange, 20%) !default;\n$orange-700: shade-color($orange, 40%) !default;\n$orange-800: shade-color($orange, 60%) !default;\n$orange-900: shade-color($orange, 80%) !default;\n\n$yellow-100: tint-color($yellow, 80%) !default;\n$yellow-200: tint-color($yellow, 60%) !default;\n$yellow-300: tint-color($yellow, 40%) !default;\n$yellow-400: tint-color($yellow, 20%) !default;\n$yellow-500: $yellow !default;\n$yellow-600: shade-color($yellow, 20%) !default;\n$yellow-700: shade-color($yellow, 40%) !default;\n$yellow-800: shade-color($yellow, 60%) !default;\n$yellow-900: shade-color($yellow, 80%) !default;\n\n$green-100: tint-color($green, 80%) !default;\n$green-200: tint-color($green, 60%) !default;\n$green-300: tint-color($green, 40%) !default;\n$green-400: tint-color($green, 20%) !default;\n$green-500: $green !default;\n$green-600: shade-color($green, 20%) !default;\n$green-700: shade-color($green, 40%) !default;\n$green-800: shade-color($green, 60%) !default;\n$green-900: shade-color($green, 80%) !default;\n\n$teal-100: tint-color($teal, 80%) !default;\n$teal-200: tint-color($teal, 60%) !default;\n$teal-300: tint-color($teal, 40%) !default;\n$teal-400: tint-color($teal, 20%) !default;\n$teal-500: $teal !default;\n$teal-600: shade-color($teal, 20%) !default;\n$teal-700: shade-color($teal, 40%) !default;\n$teal-800: shade-color($teal, 60%) !default;\n$teal-900: shade-color($teal, 80%) !default;\n\n$cyan-100: tint-color($cyan, 80%) !default;\n$cyan-200: tint-color($cyan, 60%) !default;\n$cyan-300: tint-color($cyan, 40%) !default;\n$cyan-400: tint-color($cyan, 20%) !default;\n$cyan-500: $cyan !default;\n$cyan-600: shade-color($cyan, 20%) !default;\n$cyan-700: shade-color($cyan, 40%) !default;\n$cyan-800: shade-color($cyan, 60%) !default;\n$cyan-900: shade-color($cyan, 80%) !default;\n\n$blues: (\n \"blue-100\": $blue-100,\n \"blue-200\": $blue-200,\n \"blue-300\": $blue-300,\n \"blue-400\": $blue-400,\n \"blue-500\": $blue-500,\n \"blue-600\": $blue-600,\n \"blue-700\": $blue-700,\n \"blue-800\": $blue-800,\n \"blue-900\": $blue-900\n) !default;\n\n$indigos: (\n \"indigo-100\": $indigo-100,\n \"indigo-200\": $indigo-200,\n \"indigo-300\": $indigo-300,\n \"indigo-400\": $indigo-400,\n \"indigo-500\": $indigo-500,\n \"indigo-600\": $indigo-600,\n \"indigo-700\": $indigo-700,\n \"indigo-800\": $indigo-800,\n \"indigo-900\": $indigo-900\n) !default;\n\n$purples: (\n \"purple-100\": $purple-100,\n \"purple-200\": $purple-200,\n \"purple-300\": $purple-300,\n \"purple-400\": $purple-400,\n \"purple-500\": $purple-500,\n \"purple-600\": $purple-600,\n \"purple-700\": $purple-700,\n \"purple-800\": $purple-800,\n \"purple-900\": $purple-900\n) !default;\n\n$pinks: (\n \"pink-100\": $pink-100,\n \"pink-200\": $pink-200,\n \"pink-300\": $pink-300,\n \"pink-400\": $pink-400,\n \"pink-500\": $pink-500,\n \"pink-600\": $pink-600,\n \"pink-700\": $pink-700,\n \"pink-800\": $pink-800,\n \"pink-900\": $pink-900\n) !default;\n\n$reds: (\n \"red-100\": $red-100,\n \"red-200\": $red-200,\n \"red-300\": $red-300,\n \"red-400\": $red-400,\n \"red-500\": $red-500,\n \"red-600\": $red-600,\n \"red-700\": $red-700,\n \"red-800\": $red-800,\n \"red-900\": $red-900\n) !default;\n\n$oranges: (\n \"orange-100\": $orange-100,\n \"orange-200\": $orange-200,\n \"orange-300\": $orange-300,\n \"orange-400\": $orange-400,\n \"orange-500\": $orange-500,\n \"orange-600\": $orange-600,\n \"orange-700\": $orange-700,\n \"orange-800\": $orange-800,\n \"orange-900\": $orange-900\n) !default;\n\n$yellows: (\n \"yellow-100\": $yellow-100,\n \"yellow-200\": $yellow-200,\n \"yellow-300\": $yellow-300,\n \"yellow-400\": $yellow-400,\n \"yellow-500\": $yellow-500,\n \"yellow-600\": $yellow-600,\n \"yellow-700\": $yellow-700,\n \"yellow-800\": $yellow-800,\n \"yellow-900\": $yellow-900\n) !default;\n\n$greens: (\n \"green-100\": $green-100,\n \"green-200\": $green-200,\n \"green-300\": $green-300,\n \"green-400\": $green-400,\n \"green-500\": $green-500,\n \"green-600\": $green-600,\n \"green-700\": $green-700,\n \"green-800\": $green-800,\n \"green-900\": $green-900\n) !default;\n\n$teals: (\n \"teal-100\": $teal-100,\n \"teal-200\": $teal-200,\n \"teal-300\": $teal-300,\n \"teal-400\": $teal-400,\n \"teal-500\": $teal-500,\n \"teal-600\": $teal-600,\n \"teal-700\": $teal-700,\n \"teal-800\": $teal-800,\n \"teal-900\": $teal-900\n) !default;\n\n$cyans: (\n \"cyan-100\": $cyan-100,\n \"cyan-200\": $cyan-200,\n \"cyan-300\": $cyan-300,\n \"cyan-400\": $cyan-400,\n \"cyan-500\": $cyan-500,\n \"cyan-600\": $cyan-600,\n \"cyan-700\": $cyan-700,\n \"cyan-800\": $cyan-800,\n \"cyan-900\": $cyan-900\n) !default;\n// fusv-enable\n\n// scss-docs-start theme-color-variables\n$primary: $blue !default;\n$secondary: $gray-600 !default;\n$success: $green !default;\n$info: $cyan !default;\n$warning: $yellow !default;\n$danger: $red !default;\n$light: $gray-100 !default;\n$dark: $gray-900 !default;\n// scss-docs-end theme-color-variables\n\n// scss-docs-start theme-colors-map\n$theme-colors: (\n \"primary\": $primary,\n \"secondary\": $secondary,\n \"success\": $success,\n \"info\": $info,\n \"warning\": $warning,\n \"danger\": $danger,\n \"light\": $light,\n \"dark\": $dark\n) !default;\n// scss-docs-end theme-colors-map\n\n// Characters which are escaped by the escape-svg function\n$escaped-characters: (\n (\"<\", \"%3c\"),\n (\">\", \"%3e\"),\n (\"#\", \"%23\"),\n (\"(\", \"%28\"),\n (\")\", \"%29\"),\n) !default;\n\n// Options\n//\n// Quickly modify global styling by enabling or disabling optional features.\n\n$enable-caret: true !default;\n$enable-rounded: true !default;\n$enable-shadows: false !default;\n$enable-gradients: false !default;\n$enable-transitions: true !default;\n$enable-reduced-motion: true !default;\n$enable-smooth-scroll: true !default;\n$enable-grid-classes: true !default;\n$enable-container-classes: true !default;\n$enable-cssgrid: false !default;\n$enable-button-pointers: true !default;\n$enable-rfs: true !default;\n$enable-validation-icons: true !default;\n$enable-negative-margins: false !default;\n$enable-deprecation-messages: true !default;\n$enable-important-utilities: true !default;\n\n// Prefix for :root CSS variables\n\n$variable-prefix: bs- !default; // Deprecated in v5.2.0 for the shorter `$prefix`\n$prefix: $variable-prefix !default;\n\n// Gradient\n//\n// The gradient which is added to components if `$enable-gradients` is `true`\n// This gradient is also added to elements with `.bg-gradient`\n// scss-docs-start variable-gradient\n$gradient: linear-gradient(180deg, rgba($white, .15), rgba($white, 0)) !default;\n// scss-docs-end variable-gradient\n\n// Spacing\n//\n// Control the default styling of most Bootstrap elements by modifying these\n// variables. Mostly focused on spacing.\n// You can add more entries to the $spacers map, should you need more variation.\n\n// scss-docs-start spacer-variables-maps\n$spacer: 1rem !default;\n$spacers: (\n 0: 0,\n 1: $spacer * .25,\n 2: $spacer * .5,\n 3: $spacer,\n 4: $spacer * 1.5,\n 5: $spacer * 3,\n) !default;\n// scss-docs-end spacer-variables-maps\n\n// Position\n//\n// Define the edge positioning anchors of the position utilities.\n\n// scss-docs-start position-map\n$position-values: (\n 0: 0,\n 50: 50%,\n 100: 100%\n) !default;\n// scss-docs-end position-map\n\n// Body\n//\n// Settings for the `` element.\n\n$body-bg: $white !default;\n$body-color: $gray-900 !default;\n$body-text-align: null !default;\n\n// Links\n//\n// Style anchor elements.\n\n$link-color: $primary !default;\n$link-decoration: underline !default;\n$link-shade-percentage: 20% !default;\n$link-hover-color: shift-color($link-color, $link-shade-percentage) !default;\n$link-hover-decoration: null !default;\n\n$stretched-link-pseudo-element: after !default;\n$stretched-link-z-index: 1 !default;\n\n// Paragraphs\n//\n// Style p element.\n\n$paragraph-margin-bottom: 1rem !default;\n\n\n// Grid breakpoints\n//\n// Define the minimum dimensions at which your layout will change,\n// adapting to different screen sizes, for use in media queries.\n\n// scss-docs-start grid-breakpoints\n$grid-breakpoints: (\n xs: 0,\n sm: 576px,\n md: 768px,\n lg: 992px,\n xl: 1200px,\n xxl: 1400px\n) !default;\n// scss-docs-end grid-breakpoints\n\n@include _assert-ascending($grid-breakpoints, \"$grid-breakpoints\");\n@include _assert-starts-at-zero($grid-breakpoints, \"$grid-breakpoints\");\n\n\n// Grid containers\n//\n// Define the maximum width of `.container` for different screen sizes.\n\n// scss-docs-start container-max-widths\n$container-max-widths: (\n sm: 540px,\n md: 720px,\n lg: 960px,\n xl: 1140px,\n xxl: 1320px\n) !default;\n// scss-docs-end container-max-widths\n\n@include _assert-ascending($container-max-widths, \"$container-max-widths\");\n\n\n// Grid columns\n//\n// Set the number of columns and specify the width of the gutters.\n\n$grid-columns: 12 !default;\n$grid-gutter-width: 1.5rem !default;\n$grid-row-columns: 6 !default;\n\n// Container padding\n\n$container-padding-x: $grid-gutter-width !default;\n\n\n// Components\n//\n// Define common padding and border radius sizes and more.\n\n// scss-docs-start border-variables\n$border-width: 1px !default;\n$border-widths: (\n 1: 1px,\n 2: 2px,\n 3: 3px,\n 4: 4px,\n 5: 5px\n) !default;\n\n$border-style: solid !default;\n$border-color: $gray-300 !default;\n$border-color-translucent: rgba($black, .175) !default;\n// scss-docs-end border-variables\n\n// scss-docs-start border-radius-variables\n$border-radius: .375rem !default;\n$border-radius-sm: .25rem !default;\n$border-radius-lg: .5rem !default;\n$border-radius-xl: 1rem !default;\n$border-radius-2xl: 2rem !default;\n$border-radius-pill: 50rem !default;\n// scss-docs-end border-radius-variables\n\n// scss-docs-start box-shadow-variables\n$box-shadow: 0 .5rem 1rem rgba($black, .15) !default;\n$box-shadow-sm: 0 .125rem .25rem rgba($black, .075) !default;\n$box-shadow-lg: 0 1rem 3rem rgba($black, .175) !default;\n$box-shadow-inset: inset 0 1px 2px rgba($black, .075) !default;\n// scss-docs-end box-shadow-variables\n\n$component-active-color: $white !default;\n$component-active-bg: $primary !default;\n\n// scss-docs-start caret-variables\n$caret-width: .3em !default;\n$caret-vertical-align: $caret-width * .85 !default;\n$caret-spacing: $caret-width * .85 !default;\n// scss-docs-end caret-variables\n\n$transition-base: all .2s ease-in-out !default;\n$transition-fade: opacity .15s linear !default;\n// scss-docs-start collapse-transition\n$transition-collapse: height .35s ease !default;\n$transition-collapse-width: width .35s ease !default;\n// scss-docs-end collapse-transition\n\n// stylelint-disable function-disallowed-list\n// scss-docs-start aspect-ratios\n$aspect-ratios: (\n \"1x1\": 100%,\n \"4x3\": calc(3 / 4 * 100%),\n \"16x9\": calc(9 / 16 * 100%),\n \"21x9\": calc(9 / 21 * 100%)\n) !default;\n// scss-docs-end aspect-ratios\n// stylelint-enable function-disallowed-list\n\n// Typography\n//\n// Font, line-height, and color for body text, headings, and more.\n\n// scss-docs-start font-variables\n// stylelint-disable value-keyword-case\n$font-family-sans-serif: system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", \"Noto Sans\", \"Liberation Sans\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\" !default;\n$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !default;\n// stylelint-enable value-keyword-case\n$font-family-base: var(--#{$prefix}font-sans-serif) !default;\n$font-family-code: var(--#{$prefix}font-monospace) !default;\n\n// $font-size-root affects the value of `rem`, which is used for as well font sizes, paddings, and margins\n// $font-size-base affects the font size of the body text\n$font-size-root: null !default;\n$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`\n$font-size-sm: $font-size-base * .875 !default;\n$font-size-lg: $font-size-base * 1.25 !default;\n\n$font-weight-lighter: lighter !default;\n$font-weight-light: 300 !default;\n$font-weight-normal: 400 !default;\n$font-weight-semibold: 600 !default;\n$font-weight-bold: 700 !default;\n$font-weight-bolder: bolder !default;\n\n$font-weight-base: $font-weight-normal !default;\n\n$line-height-base: 1.5 !default;\n$line-height-sm: 1.25 !default;\n$line-height-lg: 2 !default;\n\n$h1-font-size: $font-size-base * 2.5 !default;\n$h2-font-size: $font-size-base * 2 !default;\n$h3-font-size: $font-size-base * 1.75 !default;\n$h4-font-size: $font-size-base * 1.5 !default;\n$h5-font-size: $font-size-base * 1.25 !default;\n$h6-font-size: $font-size-base !default;\n// scss-docs-end font-variables\n\n// scss-docs-start font-sizes\n$font-sizes: (\n 1: $h1-font-size,\n 2: $h2-font-size,\n 3: $h3-font-size,\n 4: $h4-font-size,\n 5: $h5-font-size,\n 6: $h6-font-size\n) !default;\n// scss-docs-end font-sizes\n\n// scss-docs-start headings-variables\n$headings-margin-bottom: $spacer * .5 !default;\n$headings-font-family: null !default;\n$headings-font-style: null !default;\n$headings-font-weight: 500 !default;\n$headings-line-height: 1.2 !default;\n$headings-color: null !default;\n// scss-docs-end headings-variables\n\n// scss-docs-start display-headings\n$display-font-sizes: (\n 1: 5rem,\n 2: 4.5rem,\n 3: 4rem,\n 4: 3.5rem,\n 5: 3rem,\n 6: 2.5rem\n) !default;\n\n$display-font-family: null !default;\n$display-font-style: null !default;\n$display-font-weight: 300 !default;\n$display-line-height: $headings-line-height !default;\n// scss-docs-end display-headings\n\n// scss-docs-start type-variables\n$lead-font-size: $font-size-base * 1.25 !default;\n$lead-font-weight: 300 !default;\n\n$small-font-size: .875em !default;\n\n$sub-sup-font-size: .75em !default;\n\n$text-muted: $gray-600 !default;\n\n$initialism-font-size: $small-font-size !default;\n\n$blockquote-margin-y: $spacer !default;\n$blockquote-font-size: $font-size-base * 1.25 !default;\n$blockquote-footer-color: $gray-600 !default;\n$blockquote-footer-font-size: $small-font-size !default;\n\n$hr-margin-y: $spacer !default;\n$hr-color: inherit !default;\n\n// fusv-disable\n$hr-bg-color: null !default; // Deprecated in v5.2.0\n$hr-height: null !default; // Deprecated in v5.2.0\n// fusv-enable\n\n$hr-border-color: null !default; // Allows for inherited colors\n$hr-border-width: $border-width !default;\n$hr-opacity: .25 !default;\n\n$legend-margin-bottom: .5rem !default;\n$legend-font-size: 1.5rem !default;\n$legend-font-weight: null !default;\n\n$dt-font-weight: $font-weight-bold !default;\n\n$list-inline-padding: .5rem !default;\n\n$mark-padding: .1875em !default;\n$mark-bg: $yellow-100 !default;\n// scss-docs-end type-variables\n\n\n// Tables\n//\n// Customizes the `.table` component with basic values, each used across all table variations.\n\n// scss-docs-start table-variables\n$table-cell-padding-y: .5rem !default;\n$table-cell-padding-x: .5rem !default;\n$table-cell-padding-y-sm: .25rem !default;\n$table-cell-padding-x-sm: .25rem !default;\n\n$table-cell-vertical-align: top !default;\n\n$table-color: var(--#{$prefix}body-color) !default;\n$table-bg: transparent !default;\n$table-accent-bg: transparent !default;\n\n$table-th-font-weight: null !default;\n\n$table-striped-color: $table-color !default;\n$table-striped-bg-factor: .05 !default;\n$table-striped-bg: rgba($black, $table-striped-bg-factor) !default;\n\n$table-active-color: $table-color !default;\n$table-active-bg-factor: .1 !default;\n$table-active-bg: rgba($black, $table-active-bg-factor) !default;\n\n$table-hover-color: $table-color !default;\n$table-hover-bg-factor: .075 !default;\n$table-hover-bg: rgba($black, $table-hover-bg-factor) !default;\n\n$table-border-factor: .1 !default;\n$table-border-width: $border-width !default;\n$table-border-color: var(--#{$prefix}border-color) !default;\n\n$table-striped-order: odd !default;\n$table-striped-columns-order: even !default;\n\n$table-group-separator-color: currentcolor !default;\n\n$table-caption-color: $text-muted !default;\n\n$table-bg-scale: -80% !default;\n// scss-docs-end table-variables\n\n// scss-docs-start table-loop\n$table-variants: (\n \"primary\": shift-color($primary, $table-bg-scale),\n \"secondary\": shift-color($secondary, $table-bg-scale),\n \"success\": shift-color($success, $table-bg-scale),\n \"info\": shift-color($info, $table-bg-scale),\n \"warning\": shift-color($warning, $table-bg-scale),\n \"danger\": shift-color($danger, $table-bg-scale),\n \"light\": $light,\n \"dark\": $dark,\n) !default;\n// scss-docs-end table-loop\n\n\n// Buttons + Forms\n//\n// Shared variables that are reassigned to `$input-` and `$btn-` specific variables.\n\n// scss-docs-start input-btn-variables\n$input-btn-padding-y: .375rem !default;\n$input-btn-padding-x: .75rem !default;\n$input-btn-font-family: null !default;\n$input-btn-font-size: $font-size-base !default;\n$input-btn-line-height: $line-height-base !default;\n\n$input-btn-focus-width: .25rem !default;\n$input-btn-focus-color-opacity: .25 !default;\n$input-btn-focus-color: rgba($component-active-bg, $input-btn-focus-color-opacity) !default;\n$input-btn-focus-blur: 0 !default;\n$input-btn-focus-box-shadow: 0 0 $input-btn-focus-blur $input-btn-focus-width $input-btn-focus-color !default;\n\n$input-btn-padding-y-sm: .25rem !default;\n$input-btn-padding-x-sm: .5rem !default;\n$input-btn-font-size-sm: $font-size-sm !default;\n\n$input-btn-padding-y-lg: .5rem !default;\n$input-btn-padding-x-lg: 1rem !default;\n$input-btn-font-size-lg: $font-size-lg !default;\n\n$input-btn-border-width: $border-width !default;\n// scss-docs-end input-btn-variables\n\n\n// Buttons\n//\n// For each of Bootstrap's buttons, define text, background, and border color.\n\n// scss-docs-start btn-variables\n$btn-padding-y: $input-btn-padding-y !default;\n$btn-padding-x: $input-btn-padding-x !default;\n$btn-font-family: $input-btn-font-family !default;\n$btn-font-size: $input-btn-font-size !default;\n$btn-line-height: $input-btn-line-height !default;\n$btn-white-space: null !default; // Set to `nowrap` to prevent text wrapping\n\n$btn-padding-y-sm: $input-btn-padding-y-sm !default;\n$btn-padding-x-sm: $input-btn-padding-x-sm !default;\n$btn-font-size-sm: $input-btn-font-size-sm !default;\n\n$btn-padding-y-lg: $input-btn-padding-y-lg !default;\n$btn-padding-x-lg: $input-btn-padding-x-lg !default;\n$btn-font-size-lg: $input-btn-font-size-lg !default;\n\n$btn-border-width: $input-btn-border-width !default;\n\n$btn-font-weight: $font-weight-normal !default;\n$btn-box-shadow: inset 0 1px 0 rgba($white, .15), 0 1px 1px rgba($black, .075) !default;\n$btn-focus-width: $input-btn-focus-width !default;\n$btn-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$btn-disabled-opacity: .65 !default;\n$btn-active-box-shadow: inset 0 3px 5px rgba($black, .125) !default;\n\n$btn-link-color: var(--#{$prefix}link-color) !default;\n$btn-link-hover-color: var(--#{$prefix}link-hover-color) !default;\n$btn-link-disabled-color: $gray-600 !default;\n\n// Allows for customizing button radius independently from global border radius\n$btn-border-radius: $border-radius !default;\n$btn-border-radius-sm: $border-radius-sm !default;\n$btn-border-radius-lg: $border-radius-lg !default;\n\n$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$btn-hover-bg-shade-amount: 15% !default;\n$btn-hover-bg-tint-amount: 15% !default;\n$btn-hover-border-shade-amount: 20% !default;\n$btn-hover-border-tint-amount: 10% !default;\n$btn-active-bg-shade-amount: 20% !default;\n$btn-active-bg-tint-amount: 20% !default;\n$btn-active-border-shade-amount: 25% !default;\n$btn-active-border-tint-amount: 10% !default;\n// scss-docs-end btn-variables\n\n\n// Forms\n\n// scss-docs-start form-text-variables\n$form-text-margin-top: .25rem !default;\n$form-text-font-size: $small-font-size !default;\n$form-text-font-style: null !default;\n$form-text-font-weight: null !default;\n$form-text-color: $text-muted !default;\n// scss-docs-end form-text-variables\n\n// scss-docs-start form-label-variables\n$form-label-margin-bottom: .5rem !default;\n$form-label-font-size: null !default;\n$form-label-font-style: null !default;\n$form-label-font-weight: null !default;\n$form-label-color: null !default;\n// scss-docs-end form-label-variables\n\n// scss-docs-start form-input-variables\n$input-padding-y: $input-btn-padding-y !default;\n$input-padding-x: $input-btn-padding-x !default;\n$input-font-family: $input-btn-font-family !default;\n$input-font-size: $input-btn-font-size !default;\n$input-font-weight: $font-weight-base !default;\n$input-line-height: $input-btn-line-height !default;\n\n$input-padding-y-sm: $input-btn-padding-y-sm !default;\n$input-padding-x-sm: $input-btn-padding-x-sm !default;\n$input-font-size-sm: $input-btn-font-size-sm !default;\n\n$input-padding-y-lg: $input-btn-padding-y-lg !default;\n$input-padding-x-lg: $input-btn-padding-x-lg !default;\n$input-font-size-lg: $input-btn-font-size-lg !default;\n\n$input-bg: $body-bg !default;\n$input-disabled-color: null !default;\n$input-disabled-bg: $gray-200 !default;\n$input-disabled-border-color: null !default;\n\n$input-color: $body-color !default;\n$input-border-color: $gray-400 !default;\n$input-border-width: $input-btn-border-width !default;\n$input-box-shadow: $box-shadow-inset !default;\n\n$input-border-radius: $border-radius !default;\n$input-border-radius-sm: $border-radius-sm !default;\n$input-border-radius-lg: $border-radius-lg !default;\n\n$input-focus-bg: $input-bg !default;\n$input-focus-border-color: tint-color($component-active-bg, 50%) !default;\n$input-focus-color: $input-color !default;\n$input-focus-width: $input-btn-focus-width !default;\n$input-focus-box-shadow: $input-btn-focus-box-shadow !default;\n\n$input-placeholder-color: $gray-600 !default;\n$input-plaintext-color: $body-color !default;\n\n$input-height-border: $input-border-width * 2 !default;\n\n$input-height-inner: add($input-line-height * 1em, $input-padding-y * 2) !default;\n$input-height-inner-half: add($input-line-height * .5em, $input-padding-y) !default;\n$input-height-inner-quarter: add($input-line-height * .25em, $input-padding-y * .5) !default;\n\n$input-height: add($input-line-height * 1em, add($input-padding-y * 2, $input-height-border, false)) !default;\n$input-height-sm: add($input-line-height * 1em, add($input-padding-y-sm * 2, $input-height-border, false)) !default;\n$input-height-lg: add($input-line-height * 1em, add($input-padding-y-lg * 2, $input-height-border, false)) !default;\n\n$input-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$form-color-width: 3rem !default;\n// scss-docs-end form-input-variables\n\n// scss-docs-start form-check-variables\n$form-check-input-width: 1em !default;\n$form-check-min-height: $font-size-base * $line-height-base !default;\n$form-check-padding-start: $form-check-input-width + .5em !default;\n$form-check-margin-bottom: .125rem !default;\n$form-check-label-color: null !default;\n$form-check-label-cursor: null !default;\n$form-check-transition: null !default;\n\n$form-check-input-active-filter: brightness(90%) !default;\n\n$form-check-input-bg: $input-bg !default;\n$form-check-input-border: 1px solid rgba($black, .25) !default;\n$form-check-input-border-radius: .25em !default;\n$form-check-radio-border-radius: 50% !default;\n$form-check-input-focus-border: $input-focus-border-color !default;\n$form-check-input-focus-box-shadow: $input-btn-focus-box-shadow !default;\n\n$form-check-input-checked-color: $component-active-color !default;\n$form-check-input-checked-bg-color: $component-active-bg !default;\n$form-check-input-checked-border-color: $form-check-input-checked-bg-color !default;\n$form-check-input-checked-bg-image: url(\"data:image/svg+xml,\") !default;\n$form-check-radio-checked-bg-image: url(\"data:image/svg+xml,\") !default;\n\n$form-check-input-indeterminate-color: $component-active-color !default;\n$form-check-input-indeterminate-bg-color: $component-active-bg !default;\n$form-check-input-indeterminate-border-color: $form-check-input-indeterminate-bg-color !default;\n$form-check-input-indeterminate-bg-image: url(\"data:image/svg+xml,\") !default;\n\n$form-check-input-disabled-opacity: .5 !default;\n$form-check-label-disabled-opacity: $form-check-input-disabled-opacity !default;\n$form-check-btn-check-disabled-opacity: $btn-disabled-opacity !default;\n\n$form-check-inline-margin-end: 1rem !default;\n// scss-docs-end form-check-variables\n\n// scss-docs-start form-switch-variables\n$form-switch-color: rgba($black, .25) !default;\n$form-switch-width: 2em !default;\n$form-switch-padding-start: $form-switch-width + .5em !default;\n$form-switch-bg-image: url(\"data:image/svg+xml,\") !default;\n$form-switch-border-radius: $form-switch-width !default;\n$form-switch-transition: background-position .15s ease-in-out !default;\n\n$form-switch-focus-color: $input-focus-border-color !default;\n$form-switch-focus-bg-image: url(\"data:image/svg+xml,\") !default;\n\n$form-switch-checked-color: $component-active-color !default;\n$form-switch-checked-bg-image: url(\"data:image/svg+xml,\") !default;\n$form-switch-checked-bg-position: right center !default;\n// scss-docs-end form-switch-variables\n\n// scss-docs-start input-group-variables\n$input-group-addon-padding-y: $input-padding-y !default;\n$input-group-addon-padding-x: $input-padding-x !default;\n$input-group-addon-font-weight: $input-font-weight !default;\n$input-group-addon-color: $input-color !default;\n$input-group-addon-bg: $gray-200 !default;\n$input-group-addon-border-color: $input-border-color !default;\n// scss-docs-end input-group-variables\n\n// scss-docs-start form-select-variables\n$form-select-padding-y: $input-padding-y !default;\n$form-select-padding-x: $input-padding-x !default;\n$form-select-font-family: $input-font-family !default;\n$form-select-font-size: $input-font-size !default;\n$form-select-indicator-padding: $form-select-padding-x * 3 !default; // Extra padding for background-image\n$form-select-font-weight: $input-font-weight !default;\n$form-select-line-height: $input-line-height !default;\n$form-select-color: $input-color !default;\n$form-select-bg: $input-bg !default;\n$form-select-disabled-color: null !default;\n$form-select-disabled-bg: $gray-200 !default;\n$form-select-disabled-border-color: $input-disabled-border-color !default;\n$form-select-bg-position: right $form-select-padding-x center !default;\n$form-select-bg-size: 16px 12px !default; // In pixels because image dimensions\n$form-select-indicator-color: $gray-800 !default;\n$form-select-indicator: url(\"data:image/svg+xml,\") !default;\n\n$form-select-feedback-icon-padding-end: $form-select-padding-x * 2.5 + $form-select-indicator-padding !default;\n$form-select-feedback-icon-position: center right $form-select-indicator-padding !default;\n$form-select-feedback-icon-size: $input-height-inner-half $input-height-inner-half !default;\n\n$form-select-border-width: $input-border-width !default;\n$form-select-border-color: $input-border-color !default;\n$form-select-border-radius: $input-border-radius !default;\n$form-select-box-shadow: $box-shadow-inset !default;\n\n$form-select-focus-border-color: $input-focus-border-color !default;\n$form-select-focus-width: $input-focus-width !default;\n$form-select-focus-box-shadow: 0 0 0 $form-select-focus-width $input-btn-focus-color !default;\n\n$form-select-padding-y-sm: $input-padding-y-sm !default;\n$form-select-padding-x-sm: $input-padding-x-sm !default;\n$form-select-font-size-sm: $input-font-size-sm !default;\n$form-select-border-radius-sm: $input-border-radius-sm !default;\n\n$form-select-padding-y-lg: $input-padding-y-lg !default;\n$form-select-padding-x-lg: $input-padding-x-lg !default;\n$form-select-font-size-lg: $input-font-size-lg !default;\n$form-select-border-radius-lg: $input-border-radius-lg !default;\n\n$form-select-transition: $input-transition !default;\n// scss-docs-end form-select-variables\n\n// scss-docs-start form-range-variables\n$form-range-track-width: 100% !default;\n$form-range-track-height: .5rem !default;\n$form-range-track-cursor: pointer !default;\n$form-range-track-bg: $gray-300 !default;\n$form-range-track-border-radius: 1rem !default;\n$form-range-track-box-shadow: $box-shadow-inset !default;\n\n$form-range-thumb-width: 1rem !default;\n$form-range-thumb-height: $form-range-thumb-width !default;\n$form-range-thumb-bg: $component-active-bg !default;\n$form-range-thumb-border: 0 !default;\n$form-range-thumb-border-radius: 1rem !default;\n$form-range-thumb-box-shadow: 0 .1rem .25rem rgba($black, .1) !default;\n$form-range-thumb-focus-box-shadow: 0 0 0 1px $body-bg, $input-focus-box-shadow !default;\n$form-range-thumb-focus-box-shadow-width: $input-focus-width !default; // For focus box shadow issue in Edge\n$form-range-thumb-active-bg: tint-color($component-active-bg, 70%) !default;\n$form-range-thumb-disabled-bg: $gray-500 !default;\n$form-range-thumb-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n// scss-docs-end form-range-variables\n\n// scss-docs-start form-file-variables\n$form-file-button-color: $input-color !default;\n$form-file-button-bg: $input-group-addon-bg !default;\n$form-file-button-hover-bg: shade-color($form-file-button-bg, 5%) !default;\n// scss-docs-end form-file-variables\n\n// scss-docs-start form-floating-variables\n$form-floating-height: add(3.5rem, $input-height-border) !default;\n$form-floating-line-height: 1.25 !default;\n$form-floating-padding-x: $input-padding-x !default;\n$form-floating-padding-y: 1rem !default;\n$form-floating-input-padding-t: 1.625rem !default;\n$form-floating-input-padding-b: .625rem !default;\n$form-floating-label-opacity: .65 !default;\n$form-floating-label-transform: scale(.85) translateY(-.5rem) translateX(.15rem) !default;\n$form-floating-transition: opacity .1s ease-in-out, transform .1s ease-in-out !default;\n// scss-docs-end form-floating-variables\n\n// Form validation\n\n// scss-docs-start form-feedback-variables\n$form-feedback-margin-top: $form-text-margin-top !default;\n$form-feedback-font-size: $form-text-font-size !default;\n$form-feedback-font-style: $form-text-font-style !default;\n$form-feedback-valid-color: $success !default;\n$form-feedback-invalid-color: $danger !default;\n\n$form-feedback-icon-valid-color: $form-feedback-valid-color !default;\n$form-feedback-icon-valid: url(\"data:image/svg+xml,\") !default;\n$form-feedback-icon-invalid-color: $form-feedback-invalid-color !default;\n$form-feedback-icon-invalid: url(\"data:image/svg+xml,\") !default;\n// scss-docs-end form-feedback-variables\n\n// scss-docs-start form-validation-states\n$form-validation-states: (\n \"valid\": (\n \"color\": $form-feedback-valid-color,\n \"icon\": $form-feedback-icon-valid\n ),\n \"invalid\": (\n \"color\": $form-feedback-invalid-color,\n \"icon\": $form-feedback-icon-invalid\n )\n) !default;\n// scss-docs-end form-validation-states\n\n// Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n\n// scss-docs-start zindex-stack\n$zindex-dropdown: 1000 !default;\n$zindex-sticky: 1020 !default;\n$zindex-fixed: 1030 !default;\n$zindex-offcanvas-backdrop: 1040 !default;\n$zindex-offcanvas: 1045 !default;\n$zindex-modal-backdrop: 1050 !default;\n$zindex-modal: 1055 !default;\n$zindex-popover: 1070 !default;\n$zindex-tooltip: 1080 !default;\n$zindex-toast: 1090 !default;\n// scss-docs-end zindex-stack\n\n\n// Navs\n\n// scss-docs-start nav-variables\n$nav-link-padding-y: .5rem !default;\n$nav-link-padding-x: 1rem !default;\n$nav-link-font-size: null !default;\n$nav-link-font-weight: null !default;\n$nav-link-color: var(--#{$prefix}link-color) !default;\n$nav-link-hover-color: var(--#{$prefix}link-hover-color) !default;\n$nav-link-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out !default;\n$nav-link-disabled-color: $gray-600 !default;\n\n$nav-tabs-border-color: $gray-300 !default;\n$nav-tabs-border-width: $border-width !default;\n$nav-tabs-border-radius: $border-radius !default;\n$nav-tabs-link-hover-border-color: $gray-200 $gray-200 $nav-tabs-border-color !default;\n$nav-tabs-link-active-color: $gray-700 !default;\n$nav-tabs-link-active-bg: $body-bg !default;\n$nav-tabs-link-active-border-color: $gray-300 $gray-300 $nav-tabs-link-active-bg !default;\n\n$nav-pills-border-radius: $border-radius !default;\n$nav-pills-link-active-color: $component-active-color !default;\n$nav-pills-link-active-bg: $component-active-bg !default;\n// scss-docs-end nav-variables\n\n\n// Navbar\n\n// scss-docs-start navbar-variables\n$navbar-padding-y: $spacer * .5 !default;\n$navbar-padding-x: null !default;\n\n$navbar-nav-link-padding-x: .5rem !default;\n\n$navbar-brand-font-size: $font-size-lg !default;\n// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link\n$nav-link-height: $font-size-base * $line-height-base + $nav-link-padding-y * 2 !default;\n$navbar-brand-height: $navbar-brand-font-size * $line-height-base !default;\n$navbar-brand-padding-y: ($nav-link-height - $navbar-brand-height) * .5 !default;\n$navbar-brand-margin-end: 1rem !default;\n\n$navbar-toggler-padding-y: .25rem !default;\n$navbar-toggler-padding-x: .75rem !default;\n$navbar-toggler-font-size: $font-size-lg !default;\n$navbar-toggler-border-radius: $btn-border-radius !default;\n$navbar-toggler-focus-width: $btn-focus-width !default;\n$navbar-toggler-transition: box-shadow .15s ease-in-out !default;\n\n$navbar-light-color: rgba($black, .55) !default;\n$navbar-light-hover-color: rgba($black, .7) !default;\n$navbar-light-active-color: rgba($black, .9) !default;\n$navbar-light-disabled-color: rgba($black, .3) !default;\n$navbar-light-toggler-icon-bg: url(\"data:image/svg+xml,\") !default;\n$navbar-light-toggler-border-color: rgba($black, .1) !default;\n$navbar-light-brand-color: $navbar-light-active-color !default;\n$navbar-light-brand-hover-color: $navbar-light-active-color !default;\n// scss-docs-end navbar-variables\n\n// scss-docs-start navbar-dark-variables\n$navbar-dark-color: rgba($white, .55) !default;\n$navbar-dark-hover-color: rgba($white, .75) !default;\n$navbar-dark-active-color: $white !default;\n$navbar-dark-disabled-color: rgba($white, .25) !default;\n$navbar-dark-toggler-icon-bg: url(\"data:image/svg+xml,\") !default;\n$navbar-dark-toggler-border-color: rgba($white, .1) !default;\n$navbar-dark-brand-color: $navbar-dark-active-color !default;\n$navbar-dark-brand-hover-color: $navbar-dark-active-color !default;\n// scss-docs-end navbar-dark-variables\n\n\n// Dropdowns\n//\n// Dropdown menu container and contents.\n\n// scss-docs-start dropdown-variables\n$dropdown-min-width: 10rem !default;\n$dropdown-padding-x: 0 !default;\n$dropdown-padding-y: .5rem !default;\n$dropdown-spacer: .125rem !default;\n$dropdown-font-size: $font-size-base !default;\n$dropdown-color: $body-color !default;\n$dropdown-bg: $white !default;\n$dropdown-border-color: var(--#{$prefix}border-color-translucent) !default;\n$dropdown-border-radius: $border-radius !default;\n$dropdown-border-width: $border-width !default;\n$dropdown-inner-border-radius: subtract($dropdown-border-radius, $dropdown-border-width) !default;\n$dropdown-divider-bg: $dropdown-border-color !default;\n$dropdown-divider-margin-y: $spacer * .5 !default;\n$dropdown-box-shadow: $box-shadow !default;\n\n$dropdown-link-color: $gray-900 !default;\n$dropdown-link-hover-color: shade-color($dropdown-link-color, 10%) !default;\n$dropdown-link-hover-bg: $gray-200 !default;\n\n$dropdown-link-active-color: $component-active-color !default;\n$dropdown-link-active-bg: $component-active-bg !default;\n\n$dropdown-link-disabled-color: $gray-500 !default;\n\n$dropdown-item-padding-y: $spacer * .25 !default;\n$dropdown-item-padding-x: $spacer !default;\n\n$dropdown-header-color: $gray-600 !default;\n$dropdown-header-padding-x: $dropdown-item-padding-x !default;\n$dropdown-header-padding-y: $dropdown-padding-y !default;\n// fusv-disable\n$dropdown-header-padding: $dropdown-header-padding-y $dropdown-header-padding-x !default; // Deprecated in v5.2.0\n// fusv-enable\n// scss-docs-end dropdown-variables\n\n// scss-docs-start dropdown-dark-variables\n$dropdown-dark-color: $gray-300 !default;\n$dropdown-dark-bg: $gray-800 !default;\n$dropdown-dark-border-color: $dropdown-border-color !default;\n$dropdown-dark-divider-bg: $dropdown-divider-bg !default;\n$dropdown-dark-box-shadow: null !default;\n$dropdown-dark-link-color: $dropdown-dark-color !default;\n$dropdown-dark-link-hover-color: $white !default;\n$dropdown-dark-link-hover-bg: rgba($white, .15) !default;\n$dropdown-dark-link-active-color: $dropdown-link-active-color !default;\n$dropdown-dark-link-active-bg: $dropdown-link-active-bg !default;\n$dropdown-dark-link-disabled-color: $gray-500 !default;\n$dropdown-dark-header-color: $gray-500 !default;\n// scss-docs-end dropdown-dark-variables\n\n\n// Pagination\n\n// scss-docs-start pagination-variables\n$pagination-padding-y: .375rem !default;\n$pagination-padding-x: .75rem !default;\n$pagination-padding-y-sm: .25rem !default;\n$pagination-padding-x-sm: .5rem !default;\n$pagination-padding-y-lg: .75rem !default;\n$pagination-padding-x-lg: 1.5rem !default;\n\n$pagination-font-size: $font-size-base !default;\n\n$pagination-color: var(--#{$prefix}link-color) !default;\n$pagination-bg: $white !default;\n$pagination-border-radius: $border-radius !default;\n$pagination-border-width: $border-width !default;\n$pagination-margin-start: ($pagination-border-width * -1) !default;\n$pagination-border-color: $gray-300 !default;\n\n$pagination-focus-color: var(--#{$prefix}link-hover-color) !default;\n$pagination-focus-bg: $gray-200 !default;\n$pagination-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$pagination-focus-outline: 0 !default;\n\n$pagination-hover-color: var(--#{$prefix}link-hover-color) !default;\n$pagination-hover-bg: $gray-200 !default;\n$pagination-hover-border-color: $gray-300 !default;\n\n$pagination-active-color: $component-active-color !default;\n$pagination-active-bg: $component-active-bg !default;\n$pagination-active-border-color: $pagination-active-bg !default;\n\n$pagination-disabled-color: $gray-600 !default;\n$pagination-disabled-bg: $white !default;\n$pagination-disabled-border-color: $gray-300 !default;\n\n$pagination-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$pagination-border-radius-sm: $border-radius-sm !default;\n$pagination-border-radius-lg: $border-radius-lg !default;\n// scss-docs-end pagination-variables\n\n\n// Placeholders\n\n// scss-docs-start placeholders\n$placeholder-opacity-max: .5 !default;\n$placeholder-opacity-min: .2 !default;\n// scss-docs-end placeholders\n\n// Cards\n\n// scss-docs-start card-variables\n$card-spacer-y: $spacer !default;\n$card-spacer-x: $spacer !default;\n$card-title-spacer-y: $spacer * .5 !default;\n$card-border-width: $border-width !default;\n$card-border-color: var(--#{$prefix}border-color-translucent) !default;\n$card-border-radius: $border-radius !default;\n$card-box-shadow: null !default;\n$card-inner-border-radius: subtract($card-border-radius, $card-border-width) !default;\n$card-cap-padding-y: $card-spacer-y * .5 !default;\n$card-cap-padding-x: $card-spacer-x !default;\n$card-cap-bg: rgba($black, .03) !default;\n$card-cap-color: null !default;\n$card-height: null !default;\n$card-color: null !default;\n$card-bg: $white !default;\n$card-img-overlay-padding: $spacer !default;\n$card-group-margin: $grid-gutter-width * .5 !default;\n// scss-docs-end card-variables\n\n// Accordion\n\n// scss-docs-start accordion-variables\n$accordion-padding-y: 1rem !default;\n$accordion-padding-x: 1.25rem !default;\n$accordion-color: $body-color !default; // Sass variable because of $accordion-button-icon\n$accordion-bg: $body-bg !default;\n$accordion-border-width: $border-width !default;\n$accordion-border-color: var(--#{$prefix}border-color) !default;\n$accordion-border-radius: $border-radius !default;\n$accordion-inner-border-radius: subtract($accordion-border-radius, $accordion-border-width) !default;\n\n$accordion-body-padding-y: $accordion-padding-y !default;\n$accordion-body-padding-x: $accordion-padding-x !default;\n\n$accordion-button-padding-y: $accordion-padding-y !default;\n$accordion-button-padding-x: $accordion-padding-x !default;\n$accordion-button-color: $accordion-color !default;\n$accordion-button-bg: var(--#{$prefix}accordion-bg) !default;\n$accordion-transition: $btn-transition, border-radius .15s ease !default;\n$accordion-button-active-bg: tint-color($component-active-bg, 90%) !default;\n$accordion-button-active-color: shade-color($primary, 10%) !default;\n\n$accordion-button-focus-border-color: $input-focus-border-color !default;\n$accordion-button-focus-box-shadow: $btn-focus-box-shadow !default;\n\n$accordion-icon-width: 1.25rem !default;\n$accordion-icon-color: $accordion-button-color !default;\n$accordion-icon-active-color: $accordion-button-active-color !default;\n$accordion-icon-transition: transform .2s ease-in-out !default;\n$accordion-icon-transform: rotate(-180deg) !default;\n\n$accordion-button-icon: url(\"data:image/svg+xml,\") !default;\n$accordion-button-active-icon: url(\"data:image/svg+xml,\") !default;\n// scss-docs-end accordion-variables\n\n// Tooltips\n\n// scss-docs-start tooltip-variables\n$tooltip-font-size: $font-size-sm !default;\n$tooltip-max-width: 200px !default;\n$tooltip-color: $white !default;\n$tooltip-bg: $black !default;\n$tooltip-border-radius: $border-radius !default;\n$tooltip-opacity: .9 !default;\n$tooltip-padding-y: $spacer * .25 !default;\n$tooltip-padding-x: $spacer * .5 !default;\n$tooltip-margin: null !default; // TODO: remove this in v6\n\n$tooltip-arrow-width: .8rem !default;\n$tooltip-arrow-height: .4rem !default;\n// fusv-disable\n$tooltip-arrow-color: null !default; // Deprecated in Bootstrap 5.2.0 for CSS variables\n// fusv-enable\n// scss-docs-end tooltip-variables\n\n// Form tooltips must come after regular tooltips\n// scss-docs-start tooltip-feedback-variables\n$form-feedback-tooltip-padding-y: $tooltip-padding-y !default;\n$form-feedback-tooltip-padding-x: $tooltip-padding-x !default;\n$form-feedback-tooltip-font-size: $tooltip-font-size !default;\n$form-feedback-tooltip-line-height: null !default;\n$form-feedback-tooltip-opacity: $tooltip-opacity !default;\n$form-feedback-tooltip-border-radius: $tooltip-border-radius !default;\n// scss-docs-end tooltip-feedback-variables\n\n\n// Popovers\n\n// scss-docs-start popover-variables\n$popover-font-size: $font-size-sm !default;\n$popover-bg: $white !default;\n$popover-max-width: 276px !default;\n$popover-border-width: $border-width !default;\n$popover-border-color: var(--#{$prefix}border-color-translucent) !default;\n$popover-border-radius: $border-radius-lg !default;\n$popover-inner-border-radius: subtract($popover-border-radius, $popover-border-width) !default;\n$popover-box-shadow: $box-shadow !default;\n\n$popover-header-font-size: $font-size-base !default;\n$popover-header-bg: shade-color($popover-bg, 6%) !default;\n$popover-header-color: $headings-color !default;\n$popover-header-padding-y: .5rem !default;\n$popover-header-padding-x: $spacer !default;\n\n$popover-body-color: $body-color !default;\n$popover-body-padding-y: $spacer !default;\n$popover-body-padding-x: $spacer !default;\n\n$popover-arrow-width: 1rem !default;\n$popover-arrow-height: .5rem !default;\n// scss-docs-end popover-variables\n\n// fusv-disable\n// Deprecated in Bootstrap 5.2.0 for CSS variables\n$popover-arrow-color: $popover-bg !default;\n$popover-arrow-outer-color: var(--#{$prefix}border-color-translucent) !default;\n// fusv-enable\n\n\n// Toasts\n\n// scss-docs-start toast-variables\n$toast-max-width: 350px !default;\n$toast-padding-x: .75rem !default;\n$toast-padding-y: .5rem !default;\n$toast-font-size: .875rem !default;\n$toast-color: null !default;\n$toast-background-color: rgba($white, .85) !default;\n$toast-border-width: $border-width !default;\n$toast-border-color: var(--#{$prefix}border-color-translucent) !default;\n$toast-border-radius: $border-radius !default;\n$toast-box-shadow: $box-shadow !default;\n$toast-spacing: $container-padding-x !default;\n\n$toast-header-color: $gray-600 !default;\n$toast-header-background-color: rgba($white, .85) !default;\n$toast-header-border-color: rgba($black, .05) !default;\n// scss-docs-end toast-variables\n\n\n// Badges\n\n// scss-docs-start badge-variables\n$badge-font-size: .75em !default;\n$badge-font-weight: $font-weight-bold !default;\n$badge-color: $white !default;\n$badge-padding-y: .35em !default;\n$badge-padding-x: .65em !default;\n$badge-border-radius: $border-radius !default;\n// scss-docs-end badge-variables\n\n\n// Modals\n\n// scss-docs-start modal-variables\n$modal-inner-padding: $spacer !default;\n\n$modal-footer-margin-between: .5rem !default;\n\n$modal-dialog-margin: .5rem !default;\n$modal-dialog-margin-y-sm-up: 1.75rem !default;\n\n$modal-title-line-height: $line-height-base !default;\n\n$modal-content-color: null !default;\n$modal-content-bg: $white !default;\n$modal-content-border-color: var(--#{$prefix}border-color-translucent) !default;\n$modal-content-border-width: $border-width !default;\n$modal-content-border-radius: $border-radius-lg !default;\n$modal-content-inner-border-radius: subtract($modal-content-border-radius, $modal-content-border-width) !default;\n$modal-content-box-shadow-xs: $box-shadow-sm !default;\n$modal-content-box-shadow-sm-up: $box-shadow !default;\n\n$modal-backdrop-bg: $black !default;\n$modal-backdrop-opacity: .5 !default;\n\n$modal-header-border-color: var(--#{$prefix}border-color) !default;\n$modal-header-border-width: $modal-content-border-width !default;\n$modal-header-padding-y: $modal-inner-padding !default;\n$modal-header-padding-x: $modal-inner-padding !default;\n$modal-header-padding: $modal-header-padding-y $modal-header-padding-x !default; // Keep this for backwards compatibility\n\n$modal-footer-bg: null !default;\n$modal-footer-border-color: $modal-header-border-color !default;\n$modal-footer-border-width: $modal-header-border-width !default;\n\n$modal-sm: 300px !default;\n$modal-md: 500px !default;\n$modal-lg: 800px !default;\n$modal-xl: 1140px !default;\n\n$modal-fade-transform: translate(0, -50px) !default;\n$modal-show-transform: none !default;\n$modal-transition: transform .3s ease-out !default;\n$modal-scale-transform: scale(1.02) !default;\n// scss-docs-end modal-variables\n\n\n// Alerts\n//\n// Define alert colors, border radius, and padding.\n\n// scss-docs-start alert-variables\n$alert-padding-y: $spacer !default;\n$alert-padding-x: $spacer !default;\n$alert-margin-bottom: 1rem !default;\n$alert-border-radius: $border-radius !default;\n$alert-link-font-weight: $font-weight-bold !default;\n$alert-border-width: $border-width !default;\n$alert-bg-scale: -80% !default;\n$alert-border-scale: -70% !default;\n$alert-color-scale: 40% !default;\n$alert-dismissible-padding-r: $alert-padding-x * 3 !default; // 3x covers width of x plus default padding on either side\n// scss-docs-end alert-variables\n\n\n// Progress bars\n\n// scss-docs-start progress-variables\n$progress-height: 1rem !default;\n$progress-font-size: $font-size-base * .75 !default;\n$progress-bg: $gray-200 !default;\n$progress-border-radius: $border-radius !default;\n$progress-box-shadow: $box-shadow-inset !default;\n$progress-bar-color: $white !default;\n$progress-bar-bg: $primary !default;\n$progress-bar-animation-timing: 1s linear infinite !default;\n$progress-bar-transition: width .6s ease !default;\n// scss-docs-end progress-variables\n\n\n// List group\n\n// scss-docs-start list-group-variables\n$list-group-color: $gray-900 !default;\n$list-group-bg: $white !default;\n$list-group-border-color: rgba($black, .125) !default;\n$list-group-border-width: $border-width !default;\n$list-group-border-radius: $border-radius !default;\n\n$list-group-item-padding-y: $spacer * .5 !default;\n$list-group-item-padding-x: $spacer !default;\n$list-group-item-bg-scale: -80% !default;\n$list-group-item-color-scale: 40% !default;\n\n$list-group-hover-bg: $gray-100 !default;\n$list-group-active-color: $component-active-color !default;\n$list-group-active-bg: $component-active-bg !default;\n$list-group-active-border-color: $list-group-active-bg !default;\n\n$list-group-disabled-color: $gray-600 !default;\n$list-group-disabled-bg: $list-group-bg !default;\n\n$list-group-action-color: $gray-700 !default;\n$list-group-action-hover-color: $list-group-action-color !default;\n\n$list-group-action-active-color: $body-color !default;\n$list-group-action-active-bg: $gray-200 !default;\n// scss-docs-end list-group-variables\n\n\n// Image thumbnails\n\n// scss-docs-start thumbnail-variables\n$thumbnail-padding: .25rem !default;\n$thumbnail-bg: $body-bg !default;\n$thumbnail-border-width: $border-width !default;\n$thumbnail-border-color: var(--#{$prefix}border-color) !default;\n$thumbnail-border-radius: $border-radius !default;\n$thumbnail-box-shadow: $box-shadow-sm !default;\n// scss-docs-end thumbnail-variables\n\n\n// Figures\n\n// scss-docs-start figure-variables\n$figure-caption-font-size: $small-font-size !default;\n$figure-caption-color: $gray-600 !default;\n// scss-docs-end figure-variables\n\n\n// Breadcrumbs\n\n// scss-docs-start breadcrumb-variables\n$breadcrumb-font-size: null !default;\n$breadcrumb-padding-y: 0 !default;\n$breadcrumb-padding-x: 0 !default;\n$breadcrumb-item-padding-x: .5rem !default;\n$breadcrumb-margin-bottom: 1rem !default;\n$breadcrumb-bg: null !default;\n$breadcrumb-divider-color: $gray-600 !default;\n$breadcrumb-active-color: $gray-600 !default;\n$breadcrumb-divider: quote(\"/\") !default;\n$breadcrumb-divider-flipped: $breadcrumb-divider !default;\n$breadcrumb-border-radius: null !default;\n// scss-docs-end breadcrumb-variables\n\n// Carousel\n\n// scss-docs-start carousel-variables\n$carousel-control-color: $white !default;\n$carousel-control-width: 15% !default;\n$carousel-control-opacity: .5 !default;\n$carousel-control-hover-opacity: .9 !default;\n$carousel-control-transition: opacity .15s ease !default;\n\n$carousel-indicator-width: 30px !default;\n$carousel-indicator-height: 3px !default;\n$carousel-indicator-hit-area-height: 10px !default;\n$carousel-indicator-spacer: 3px !default;\n$carousel-indicator-opacity: .5 !default;\n$carousel-indicator-active-bg: $white !default;\n$carousel-indicator-active-opacity: 1 !default;\n$carousel-indicator-transition: opacity .6s ease !default;\n\n$carousel-caption-width: 70% !default;\n$carousel-caption-color: $white !default;\n$carousel-caption-padding-y: 1.25rem !default;\n$carousel-caption-spacer: 1.25rem !default;\n\n$carousel-control-icon-width: 2rem !default;\n\n$carousel-control-prev-icon-bg: url(\"data:image/svg+xml,\") !default;\n$carousel-control-next-icon-bg: url(\"data:image/svg+xml,\") !default;\n\n$carousel-transition-duration: .6s !default;\n$carousel-transition: transform $carousel-transition-duration ease-in-out !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`)\n// scss-docs-end carousel-variables\n\n// scss-docs-start carousel-dark-variables\n$carousel-dark-indicator-active-bg: $black !default;\n$carousel-dark-caption-color: $black !default;\n$carousel-dark-control-icon-filter: invert(1) grayscale(100) !default;\n// scss-docs-end carousel-dark-variables\n\n\n// Spinners\n\n// scss-docs-start spinner-variables\n$spinner-width: 2rem !default;\n$spinner-height: $spinner-width !default;\n$spinner-vertical-align: -.125em !default;\n$spinner-border-width: .25em !default;\n$spinner-animation-speed: .75s !default;\n\n$spinner-width-sm: 1rem !default;\n$spinner-height-sm: $spinner-width-sm !default;\n$spinner-border-width-sm: .2em !default;\n// scss-docs-end spinner-variables\n\n\n// Close\n\n// scss-docs-start close-variables\n$btn-close-width: 1em !default;\n$btn-close-height: $btn-close-width !default;\n$btn-close-padding-x: .25em !default;\n$btn-close-padding-y: $btn-close-padding-x !default;\n$btn-close-color: $black !default;\n$btn-close-bg: url(\"data:image/svg+xml,\") !default;\n$btn-close-focus-shadow: $input-btn-focus-box-shadow !default;\n$btn-close-opacity: .5 !default;\n$btn-close-hover-opacity: .75 !default;\n$btn-close-focus-opacity: 1 !default;\n$btn-close-disabled-opacity: .25 !default;\n$btn-close-white-filter: invert(1) grayscale(100%) brightness(200%) !default;\n// scss-docs-end close-variables\n\n\n// Offcanvas\n\n// scss-docs-start offcanvas-variables\n$offcanvas-padding-y: $modal-inner-padding !default;\n$offcanvas-padding-x: $modal-inner-padding !default;\n$offcanvas-horizontal-width: 400px !default;\n$offcanvas-vertical-height: 30vh !default;\n$offcanvas-transition-duration: .3s !default;\n$offcanvas-border-color: $modal-content-border-color !default;\n$offcanvas-border-width: $modal-content-border-width !default;\n$offcanvas-title-line-height: $modal-title-line-height !default;\n$offcanvas-bg-color: $modal-content-bg !default;\n$offcanvas-color: $modal-content-color !default;\n$offcanvas-box-shadow: $modal-content-box-shadow-xs !default;\n$offcanvas-backdrop-bg: $modal-backdrop-bg !default;\n$offcanvas-backdrop-opacity: $modal-backdrop-opacity !default;\n// scss-docs-end offcanvas-variables\n\n// Code\n\n$code-font-size: $small-font-size !default;\n$code-color: $pink !default;\n\n$kbd-padding-y: .1875rem !default;\n$kbd-padding-x: .375rem !default;\n$kbd-font-size: $code-font-size !default;\n$kbd-color: var(--#{$prefix}body-bg) !default;\n$kbd-bg: var(--#{$prefix}body-color) !default;\n$nested-kbd-font-weight: null !default; // Deprecated in v5.2.0, removing in v6\n\n$pre-color: null !default;\n", - "// Re-assigned maps\n//\n// Placed here so that others can override the default Sass maps and see automatic updates to utilities and more.\n\n// scss-docs-start theme-colors-rgb\n$theme-colors-rgb: map-loop($theme-colors, to-rgb, \"$value\") !default;\n// scss-docs-end theme-colors-rgb\n\n// Utilities maps\n//\n// Extends the default `$theme-colors` maps to help create our utilities.\n\n// Come v6, we'll de-dupe these variables. Until then, for backward compatibility, we keep them to reassign.\n// scss-docs-start utilities-colors\n$utilities-colors: $theme-colors-rgb !default;\n// scss-docs-end utilities-colors\n\n// scss-docs-start utilities-text-colors\n$utilities-text: map-merge(\n $utilities-colors,\n (\n \"black\": to-rgb($black),\n \"white\": to-rgb($white),\n \"body\": to-rgb($body-color)\n )\n) !default;\n$utilities-text-colors: map-loop($utilities-text, rgba-css-var, \"$key\", \"text\") !default;\n// scss-docs-end utilities-text-colors\n\n// scss-docs-start utilities-bg-colors\n$utilities-bg: map-merge(\n $utilities-colors,\n (\n \"black\": to-rgb($black),\n \"white\": to-rgb($white),\n \"body\": to-rgb($body-bg)\n )\n) !default;\n$utilities-bg-colors: map-loop($utilities-bg, rgba-css-var, \"$key\", \"bg\") !default;\n// scss-docs-end utilities-bg-colors\n\n// scss-docs-start utilities-border-colors\n$utilities-border: map-merge(\n $utilities-colors,\n (\n \"white\": to-rgb($white)\n )\n) !default;\n$utilities-border-colors: map-loop($utilities-border, rgba-css-var, \"$key\", \"border\") !default;\n// scss-docs-end utilities-border-colors\n\n$negative-spacers: if($enable-negative-margins, negativify-map($spacers), null) !default;\n\n$gutters: $spacers !default;\n", - "// Toggles\n//\n// Used in conjunction with global variables to enable certain theme features.\n\n// Vendor\n@import \"vendor/rfs\";\n\n// Deprecate\n@import \"mixins/deprecate\";\n\n// Helpers\n@import \"mixins/breakpoints\";\n@import \"mixins/color-scheme\";\n@import \"mixins/image\";\n@import \"mixins/resize\";\n@import \"mixins/visually-hidden\";\n@import \"mixins/reset-text\";\n@import \"mixins/text-truncate\";\n\n// Utilities\n@import \"mixins/utilities\";\n\n// Components\n@import \"mixins/alert\";\n@import \"mixins/backdrop\";\n@import \"mixins/buttons\";\n@import \"mixins/caret\";\n@import \"mixins/pagination\";\n@import \"mixins/lists\";\n@import \"mixins/list-group\";\n@import \"mixins/forms\";\n@import \"mixins/table-variants\";\n\n// Skins\n@import \"mixins/border-radius\";\n@import \"mixins/box-shadow\";\n@import \"mixins/gradients\";\n@import \"mixins/transition\";\n\n// Layout\n@import \"mixins/clearfix\";\n@import \"mixins/container\";\n@import \"mixins/grid\";\n", - "// stylelint-disable property-blacklist, scss/dollar-variable-default\n\n// SCSS RFS mixin\n//\n// Automated responsive values for font sizes, paddings, margins and much more\n//\n// Licensed under MIT (https://github.com/twbs/rfs/blob/main/LICENSE)\n\n// Configuration\n\n// Base value\n$rfs-base-value: 1.25rem !default;\n$rfs-unit: rem !default;\n\n@if $rfs-unit != rem and $rfs-unit != px {\n @error \"`#{$rfs-unit}` is not a valid unit for $rfs-unit. Use `px` or `rem`.\";\n}\n\n// Breakpoint at where values start decreasing if screen width is smaller\n$rfs-breakpoint: 1200px !default;\n$rfs-breakpoint-unit: px !default;\n\n@if $rfs-breakpoint-unit != px and $rfs-breakpoint-unit != em and $rfs-breakpoint-unit != rem {\n @error \"`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.\";\n}\n\n// Resize values based on screen height and width\n$rfs-two-dimensional: false !default;\n\n// Factor of decrease\n$rfs-factor: 10 !default;\n\n@if type-of($rfs-factor) != number or $rfs-factor <= 1 {\n @error \"`#{$rfs-factor}` is not a valid $rfs-factor, it must be greater than 1.\";\n}\n\n// Mode. Possibilities: \"min-media-query\", \"max-media-query\"\n$rfs-mode: min-media-query !default;\n\n// Generate enable or disable classes. Possibilities: false, \"enable\" or \"disable\"\n$rfs-class: false !default;\n\n// 1 rem = $rfs-rem-value px\n$rfs-rem-value: 16 !default;\n\n// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14\n$rfs-safari-iframe-resize-bug-fix: false !default;\n\n// Disable RFS by setting $enable-rfs to false\n$enable-rfs: true !default;\n\n// Cache $rfs-base-value unit\n$rfs-base-value-unit: unit($rfs-base-value);\n\n@function divide($dividend, $divisor, $precision: 10) {\n $sign: if($dividend > 0 and $divisor > 0 or $dividend < 0 and $divisor < 0, 1, -1);\n $dividend: abs($dividend);\n $divisor: abs($divisor);\n @if $dividend == 0 {\n @return 0;\n }\n @if $divisor == 0 {\n @error \"Cannot divide by 0\";\n }\n $remainder: $dividend;\n $result: 0;\n $factor: 10;\n @while ($remainder > 0 and $precision >= 0) {\n $quotient: 0;\n @while ($remainder >= $divisor) {\n $remainder: $remainder - $divisor;\n $quotient: $quotient + 1;\n }\n $result: $result * 10 + $quotient;\n $factor: $factor * .1;\n $remainder: $remainder * 10;\n $precision: $precision - 1;\n @if ($precision < 0 and $remainder >= $divisor * 5) {\n $result: $result + 1;\n }\n }\n $result: $result * $factor * $sign;\n $dividend-unit: unit($dividend);\n $divisor-unit: unit($divisor);\n $unit-map: (\n \"px\": 1px,\n \"rem\": 1rem,\n \"em\": 1em,\n \"%\": 1%\n );\n @if ($dividend-unit != $divisor-unit and map-has-key($unit-map, $dividend-unit)) {\n $result: $result * map-get($unit-map, $dividend-unit);\n }\n @return $result;\n}\n\n// Remove px-unit from $rfs-base-value for calculations\n@if $rfs-base-value-unit == px {\n $rfs-base-value: divide($rfs-base-value, $rfs-base-value * 0 + 1);\n}\n@else if $rfs-base-value-unit == rem {\n $rfs-base-value: divide($rfs-base-value, divide($rfs-base-value * 0 + 1, $rfs-rem-value));\n}\n\n// Cache $rfs-breakpoint unit to prevent multiple calls\n$rfs-breakpoint-unit-cache: unit($rfs-breakpoint);\n\n// Remove unit from $rfs-breakpoint for calculations\n@if $rfs-breakpoint-unit-cache == px {\n $rfs-breakpoint: divide($rfs-breakpoint, $rfs-breakpoint * 0 + 1);\n}\n@else if $rfs-breakpoint-unit-cache == rem or $rfs-breakpoint-unit-cache == \"em\" {\n $rfs-breakpoint: divide($rfs-breakpoint, divide($rfs-breakpoint * 0 + 1, $rfs-rem-value));\n}\n\n// Calculate the media query value\n$rfs-mq-value: if($rfs-breakpoint-unit == px, #{$rfs-breakpoint}px, #{divide($rfs-breakpoint, $rfs-rem-value)}#{$rfs-breakpoint-unit});\n$rfs-mq-property-width: if($rfs-mode == max-media-query, max-width, min-width);\n$rfs-mq-property-height: if($rfs-mode == max-media-query, max-height, min-height);\n\n// Internal mixin used to determine which media query needs to be used\n@mixin _rfs-media-query {\n @if $rfs-two-dimensional {\n @if $rfs-mode == max-media-query {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}), (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\n @content;\n }\n }\n @else {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) and (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\n @content;\n }\n }\n }\n @else {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) {\n @content;\n }\n }\n}\n\n// Internal mixin that adds disable classes to the selector if needed.\n@mixin _rfs-rule {\n @if $rfs-class == disable and $rfs-mode == max-media-query {\n // Adding an extra class increases specificity, which prevents the media query to override the property\n &,\n .disable-rfs &,\n &.disable-rfs {\n @content;\n }\n }\n @else if $rfs-class == enable and $rfs-mode == min-media-query {\n .enable-rfs &,\n &.enable-rfs {\n @content;\n }\n }\n @else {\n @content;\n }\n}\n\n// Internal mixin that adds enable classes to the selector if needed.\n@mixin _rfs-media-query-rule {\n\n @if $rfs-class == enable {\n @if $rfs-mode == min-media-query {\n @content;\n }\n\n @include _rfs-media-query {\n .enable-rfs &,\n &.enable-rfs {\n @content;\n }\n }\n }\n @else {\n @if $rfs-class == disable and $rfs-mode == min-media-query {\n .disable-rfs &,\n &.disable-rfs {\n @content;\n }\n }\n @include _rfs-media-query {\n @content;\n }\n }\n}\n\n// Helper function to get the formatted non-responsive value\n@function rfs-value($values) {\n // Convert to list\n $values: if(type-of($values) != list, ($values,), $values);\n\n $val: '';\n\n // Loop over each value and calculate value\n @each $value in $values {\n @if $value == 0 {\n $val: $val + ' 0';\n }\n @else {\n // Cache $value unit\n $unit: if(type-of($value) == \"number\", unit($value), false);\n\n @if $unit == px {\n // Convert to rem if needed\n $val: $val + ' ' + if($rfs-unit == rem, #{divide($value, $value * 0 + $rfs-rem-value)}rem, $value);\n }\n @else if $unit == rem {\n // Convert to px if needed\n $val: $val + ' ' + if($rfs-unit == px, #{divide($value, $value * 0 + 1) * $rfs-rem-value}px, $value);\n }\n @else {\n // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n $val: $val + ' ' + $value;\n }\n }\n }\n\n // Remove first space\n @return unquote(str-slice($val, 2));\n}\n\n// Helper function to get the responsive value calculated by RFS\n@function rfs-fluid-value($values) {\n // Convert to list\n $values: if(type-of($values) != list, ($values,), $values);\n\n $val: '';\n\n // Loop over each value and calculate value\n @each $value in $values {\n @if $value == 0 {\n $val: $val + ' 0';\n }\n\n @else {\n // Cache $value unit\n $unit: if(type-of($value) == \"number\", unit($value), false);\n\n // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n @if not $unit or $unit != px and $unit != rem {\n $val: $val + ' ' + $value;\n }\n\n @else {\n // Remove unit from $value for calculations\n $value: divide($value, $value * 0 + if($unit == px, 1, divide(1, $rfs-rem-value)));\n\n // Only add the media query if the value is greater than the minimum value\n @if abs($value) <= $rfs-base-value or not $enable-rfs {\n $val: $val + ' ' + if($rfs-unit == rem, #{divide($value, $rfs-rem-value)}rem, #{$value}px);\n }\n @else {\n // Calculate the minimum value\n $value-min: $rfs-base-value + divide(abs($value) - $rfs-base-value, $rfs-factor);\n\n // Calculate difference between $value and the minimum value\n $value-diff: abs($value) - $value-min;\n\n // Base value formatting\n $min-width: if($rfs-unit == rem, #{divide($value-min, $rfs-rem-value)}rem, #{$value-min}px);\n\n // Use negative value if needed\n $min-width: if($value < 0, -$min-width, $min-width);\n\n // Use `vmin` if two-dimensional is enabled\n $variable-unit: if($rfs-two-dimensional, vmin, vw);\n\n // Calculate the variable width between 0 and $rfs-breakpoint\n $variable-width: #{divide($value-diff * 100, $rfs-breakpoint)}#{$variable-unit};\n\n // Return the calculated value\n $val: $val + ' calc(' + $min-width + if($value < 0, ' - ', ' + ') + $variable-width + ')';\n }\n }\n }\n }\n\n // Remove first space\n @return unquote(str-slice($val, 2));\n}\n\n// RFS mixin\n@mixin rfs($values, $property: font-size) {\n @if $values != null {\n $val: rfs-value($values);\n $fluidVal: rfs-fluid-value($values);\n\n // Do not print the media query if responsive & non-responsive values are the same\n @if $val == $fluidVal {\n #{$property}: $val;\n }\n @else {\n @include _rfs-rule {\n #{$property}: if($rfs-mode == max-media-query, $val, $fluidVal);\n\n // Include safari iframe resize fix if needed\n min-width: if($rfs-safari-iframe-resize-bug-fix, (0 * 1vw), null);\n }\n\n @include _rfs-media-query-rule {\n #{$property}: if($rfs-mode == max-media-query, $fluidVal, $val);\n }\n }\n }\n}\n\n// Shorthand helper mixins\n@mixin font-size($value) {\n @include rfs($value);\n}\n\n@mixin padding($value) {\n @include rfs($value, padding);\n}\n\n@mixin padding-top($value) {\n @include rfs($value, padding-top);\n}\n\n@mixin padding-right($value) {\n @include rfs($value, padding-right);\n}\n\n@mixin padding-bottom($value) {\n @include rfs($value, padding-bottom);\n}\n\n@mixin padding-left($value) {\n @include rfs($value, padding-left);\n}\n\n@mixin margin($value) {\n @include rfs($value, margin);\n}\n\n@mixin margin-top($value) {\n @include rfs($value, margin-top);\n}\n\n@mixin margin-right($value) {\n @include rfs($value, margin-right);\n}\n\n@mixin margin-bottom($value) {\n @include rfs($value, margin-bottom);\n}\n\n@mixin margin-left($value) {\n @include rfs($value, margin-left);\n}\n", - "// Deprecate mixin\n//\n// This mixin can be used to deprecate mixins or functions.\n// `$enable-deprecation-messages` is a global variable, `$ignore-warning` is a variable that can be passed to\n// some deprecated mixins to suppress the warning (for example if the mixin is still be used in the current version of Bootstrap)\n@mixin deprecate($name, $deprecate-version, $remove-version, $ignore-warning: false) {\n @if ($enable-deprecation-messages != false and $ignore-warning != true) {\n @warn \"#{$name} has been deprecated as of #{$deprecate-version}. It will be removed entirely in #{$remove-version}.\";\n }\n}\n", - "// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl xxl))\n// md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @if not $n {\n @error \"breakpoint `#{$name}` not found in `#{$breakpoints}`\";\n }\n @return if($n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n $min: map-get($breakpoints, $name);\n @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width.\n// The maximum value is reduced by 0.02px to work around the limitations of\n// `min-` and `max-` prefixes and viewports with fractional widths.\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\n//\n// >> breakpoint-max(md, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// 767.98px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n $max: map-get($breakpoints, $name);\n @return if($max and $max > 0, $max - .02, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($lower, $breakpoints);\n $max: breakpoint-max($upper, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($lower, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($upper, $breakpoints) {\n @content;\n }\n }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n $next: breakpoint-next($name, $breakpoints);\n $max: breakpoint-max($next, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($name, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($next, $breakpoints) {\n @content;\n }\n }\n}\n", - "// scss-docs-start mixin-color-scheme\n@mixin color-scheme($name) {\n @media (prefers-color-scheme: #{$name}) {\n @content;\n }\n}\n// scss-docs-end mixin-color-scheme\n", - "// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n\n@mixin img-fluid {\n // Part 1: Set a maximum relative to the parent\n max-width: 100%;\n // Part 2: Override the height to auto, otherwise images will be stretched\n // when setting a width and height attribute on the img element.\n height: auto;\n}\n", - "// Resize anything\n\n@mixin resizable($direction) {\n overflow: auto; // Per CSS3 UI, `resize` only applies when `overflow` isn't `visible`\n resize: $direction; // Options: horizontal, vertical, both\n}\n", - "// stylelint-disable declaration-no-important\n\n// Hide content visually while keeping it accessible to assistive technologies\n//\n// See: https://www.a11yproject.com/posts/2013-01-11-how-to-hide-content/\n// See: https://kittygiraudel.com/2016/10/13/css-hide-and-seek/\n\n@mixin visually-hidden() {\n position: absolute !important;\n width: 1px !important;\n height: 1px !important;\n padding: 0 !important;\n margin: -1px !important; // Fix for https://github.com/twbs/bootstrap/issues/25686\n overflow: hidden !important;\n clip: rect(0, 0, 0, 0) !important;\n white-space: nowrap !important;\n border: 0 !important;\n}\n\n// Use to only display content when it's focused, or one of its child elements is focused\n// (i.e. when focus is within the element/container that the class was applied to)\n//\n// Useful for \"Skip to main content\" links; see https://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n\n@mixin visually-hidden-focusable() {\n &:not(:focus):not(:focus-within) {\n @include visually-hidden();\n }\n}\n", - "@mixin reset-text {\n font-family: $font-family-base;\n // We deliberately do NOT reset font-size or overflow-wrap / word-wrap.\n font-style: normal;\n font-weight: $font-weight-normal;\n line-height: $line-height-base;\n text-align: left; // Fallback for where `start` is not supported\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n white-space: normal;\n word-spacing: normal;\n line-break: auto;\n}\n", - "// Text truncate\n// Requires inline-block or block for proper styling\n\n@mixin text-truncate() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n", - "// Utility generator\n// Used to generate utilities & print utilities\n@mixin generate-utility($utility, $infix, $is-rfs-media-query: false) {\n $values: map-get($utility, values);\n\n // If the values are a list or string, convert it into a map\n @if type-of($values) == \"string\" or type-of(nth($values, 1)) != \"list\" {\n $values: zip($values, $values);\n }\n\n @each $key, $value in $values {\n $properties: map-get($utility, property);\n\n // Multiple properties are possible, for example with vertical or horizontal margins or paddings\n @if type-of($properties) == \"string\" {\n $properties: append((), $properties);\n }\n\n // Use custom class if present\n $property-class: if(map-has-key($utility, class), map-get($utility, class), nth($properties, 1));\n $property-class: if($property-class == null, \"\", $property-class);\n\n // Use custom CSS variable name if present, otherwise default to `class`\n $css-variable-name: if(map-has-key($utility, css-variable-name), map-get($utility, css-variable-name), map-get($utility, class));\n\n // State params to generate pseudo-classes\n $state: if(map-has-key($utility, state), map-get($utility, state), ());\n\n $infix: if($property-class == \"\" and str-slice($infix, 1, 1) == \"-\", str-slice($infix, 2), $infix);\n\n // Don't prefix if value key is null (e.g. with shadow class)\n $property-class-modifier: if($key, if($property-class == \"\" and $infix == \"\", \"\", \"-\") + $key, \"\");\n\n @if map-get($utility, rfs) {\n // Inside the media query\n @if $is-rfs-media-query {\n $val: rfs-value($value);\n\n // Do not render anything if fluid and non fluid values are the same\n $value: if($val == rfs-fluid-value($value), null, $val);\n }\n @else {\n $value: rfs-fluid-value($value);\n }\n }\n\n $is-css-var: map-get($utility, css-var);\n $is-local-vars: map-get($utility, local-vars);\n $is-rtl: map-get($utility, rtl);\n\n @if $value != null {\n @if $is-rtl == false {\n /* rtl:begin:remove */\n }\n\n @if $is-css-var {\n .#{$property-class + $infix + $property-class-modifier} {\n --#{$prefix}#{$css-variable-name}: #{$value};\n }\n\n @each $pseudo in $state {\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n --#{$prefix}#{$css-variable-name}: #{$value};\n }\n }\n } @else {\n .#{$property-class + $infix + $property-class-modifier} {\n @each $property in $properties {\n @if $is-local-vars {\n @each $local-var, $variable in $is-local-vars {\n --#{$prefix}#{$local-var}: #{$variable};\n }\n }\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n\n @each $pseudo in $state {\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n @each $property in $properties {\n @if $is-local-vars {\n @each $local-var, $variable in $is-local-vars {\n --#{$prefix}#{$local-var}: #{$variable};\n }\n }\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n }\n }\n\n @if $is-rtl == false {\n /* rtl:end:remove */\n }\n }\n }\n}\n", - "// scss-docs-start alert-variant-mixin\n@mixin alert-variant($background, $border, $color) {\n --#{$prefix}alert-color: #{$color};\n --#{$prefix}alert-bg: #{$background};\n --#{$prefix}alert-border-color: #{$border};\n\n @if $enable-gradients {\n background-image: var(--#{$prefix}gradient);\n }\n\n .alert-link {\n color: shade-color($color, 20%);\n }\n}\n// scss-docs-end alert-variant-mixin\n", - "// Shared between modals and offcanvases\n@mixin overlay-backdrop($zindex, $backdrop-bg, $backdrop-opacity) {\n position: fixed;\n top: 0;\n left: 0;\n z-index: $zindex;\n width: 100vw;\n height: 100vh;\n background-color: $backdrop-bg;\n\n // Fade for backdrop\n &.fade { opacity: 0; }\n &.show { opacity: $backdrop-opacity; }\n}\n", - "// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n// scss-docs-start btn-variant-mixin\n@mixin button-variant(\n $background,\n $border,\n $color: color-contrast($background),\n $hover-background: if($color == $color-contrast-light, shade-color($background, $btn-hover-bg-shade-amount), tint-color($background, $btn-hover-bg-tint-amount)),\n $hover-border: if($color == $color-contrast-light, shade-color($border, $btn-hover-border-shade-amount), tint-color($border, $btn-hover-border-tint-amount)),\n $hover-color: color-contrast($hover-background),\n $active-background: if($color == $color-contrast-light, shade-color($background, $btn-active-bg-shade-amount), tint-color($background, $btn-active-bg-tint-amount)),\n $active-border: if($color == $color-contrast-light, shade-color($border, $btn-active-border-shade-amount), tint-color($border, $btn-active-border-tint-amount)),\n $active-color: color-contrast($active-background),\n $disabled-background: $background,\n $disabled-border: $border,\n $disabled-color: color-contrast($disabled-background)\n) {\n --#{$prefix}btn-color: #{$color};\n --#{$prefix}btn-bg: #{$background};\n --#{$prefix}btn-border-color: #{$border};\n --#{$prefix}btn-hover-color: #{$hover-color};\n --#{$prefix}btn-hover-bg: #{$hover-background};\n --#{$prefix}btn-hover-border-color: #{$hover-border};\n --#{$prefix}btn-focus-shadow-rgb: #{to-rgb(mix($color, $border, 15%))};\n --#{$prefix}btn-active-color: #{$active-color};\n --#{$prefix}btn-active-bg: #{$active-background};\n --#{$prefix}btn-active-border-color: #{$active-border};\n --#{$prefix}btn-active-shadow: #{$btn-active-box-shadow};\n --#{$prefix}btn-disabled-color: #{$disabled-color};\n --#{$prefix}btn-disabled-bg: #{$disabled-background};\n --#{$prefix}btn-disabled-border-color: #{$disabled-border};\n}\n// scss-docs-end btn-variant-mixin\n\n// scss-docs-start btn-outline-variant-mixin\n@mixin button-outline-variant(\n $color,\n $color-hover: color-contrast($color),\n $active-background: $color,\n $active-border: $color,\n $active-color: color-contrast($active-background)\n) {\n --#{$prefix}btn-color: #{$color};\n --#{$prefix}btn-border-color: #{$color};\n --#{$prefix}btn-hover-color: #{$color-hover};\n --#{$prefix}btn-hover-bg: #{$active-background};\n --#{$prefix}btn-hover-border-color: #{$active-border};\n --#{$prefix}btn-focus-shadow-rgb: #{to-rgb($color)};\n --#{$prefix}btn-active-color: #{$active-color};\n --#{$prefix}btn-active-bg: #{$active-background};\n --#{$prefix}btn-active-border-color: #{$active-border};\n --#{$prefix}btn-active-shadow: #{$btn-active-box-shadow};\n --#{$prefix}btn-disabled-color: #{$color};\n --#{$prefix}btn-disabled-bg: transparent;\n --#{$prefix}btn-disabled-border-color: #{$color};\n --#{$prefix}gradient: none;\n}\n// scss-docs-end btn-outline-variant-mixin\n\n// scss-docs-start btn-size-mixin\n@mixin button-size($padding-y, $padding-x, $font-size, $border-radius) {\n --#{$prefix}btn-padding-y: #{$padding-y};\n --#{$prefix}btn-padding-x: #{$padding-x};\n @include rfs($font-size, --#{$prefix}btn-font-size);\n --#{$prefix}btn-border-radius: #{$border-radius};\n}\n// scss-docs-end btn-size-mixin\n", - "// scss-docs-start caret-mixins\n@mixin caret-down {\n border-top: $caret-width solid;\n border-right: $caret-width solid transparent;\n border-bottom: 0;\n border-left: $caret-width solid transparent;\n}\n\n@mixin caret-up {\n border-top: 0;\n border-right: $caret-width solid transparent;\n border-bottom: $caret-width solid;\n border-left: $caret-width solid transparent;\n}\n\n@mixin caret-end {\n border-top: $caret-width solid transparent;\n border-right: 0;\n border-bottom: $caret-width solid transparent;\n border-left: $caret-width solid;\n}\n\n@mixin caret-start {\n border-top: $caret-width solid transparent;\n border-right: $caret-width solid;\n border-bottom: $caret-width solid transparent;\n}\n\n@mixin caret($direction: down) {\n @if $enable-caret {\n &::after {\n display: inline-block;\n margin-left: $caret-spacing;\n vertical-align: $caret-vertical-align;\n content: \"\";\n @if $direction == down {\n @include caret-down();\n } @else if $direction == up {\n @include caret-up();\n } @else if $direction == end {\n @include caret-end();\n }\n }\n\n @if $direction == start {\n &::after {\n display: none;\n }\n\n &::before {\n display: inline-block;\n margin-right: $caret-spacing;\n vertical-align: $caret-vertical-align;\n content: \"\";\n @include caret-start();\n }\n }\n\n &:empty::after {\n margin-left: 0;\n }\n }\n}\n// scss-docs-end caret-mixins\n", - "// Pagination\n\n// scss-docs-start pagination-mixin\n@mixin pagination-size($padding-y, $padding-x, $font-size, $border-radius) {\n --#{$prefix}pagination-padding-x: #{$padding-x};\n --#{$prefix}pagination-padding-y: #{$padding-y};\n @include rfs($font-size, --#{$prefix}pagination-font-size);\n --#{$prefix}pagination-border-radius: #{$border-radius};\n}\n// scss-docs-end pagination-mixin\n", - "// Lists\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n@mixin list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n", - "// List Groups\n\n// scss-docs-start list-group-mixin\n@mixin list-group-item-variant($state, $background, $color) {\n .list-group-item-#{$state} {\n color: $color;\n background-color: $background;\n\n &.list-group-item-action {\n &:hover,\n &:focus {\n color: $color;\n background-color: shade-color($background, 10%);\n }\n\n &.active {\n color: $white;\n background-color: $color;\n border-color: $color;\n }\n }\n }\n}\n// scss-docs-end list-group-mixin\n", - "// This mixin uses an `if()` technique to be compatible with Dart Sass\n// See https://github.com/sass/sass/issues/1873#issuecomment-152293725 for more details\n\n// scss-docs-start form-validation-mixins\n@mixin form-validation-state-selector($state) {\n @if ($state == \"valid\" or $state == \"invalid\") {\n .was-validated #{if(&, \"&\", \"\")}:#{$state},\n #{if(&, \"&\", \"\")}.is-#{$state} {\n @content;\n }\n } @else {\n #{if(&, \"&\", \"\")}.is-#{$state} {\n @content;\n }\n }\n}\n\n@mixin form-validation-state(\n $state,\n $color,\n $icon,\n $tooltip-color: color-contrast($color),\n $tooltip-bg-color: rgba($color, $form-feedback-tooltip-opacity),\n $focus-box-shadow: 0 0 $input-btn-focus-blur $input-focus-width rgba($color, $input-btn-focus-color-opacity)\n) {\n .#{$state}-feedback {\n display: none;\n width: 100%;\n margin-top: $form-feedback-margin-top;\n @include font-size($form-feedback-font-size);\n font-style: $form-feedback-font-style;\n color: $color;\n }\n\n .#{$state}-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%; // Contain to parent when possible\n padding: $form-feedback-tooltip-padding-y $form-feedback-tooltip-padding-x;\n margin-top: .1rem;\n @include font-size($form-feedback-tooltip-font-size);\n line-height: $form-feedback-tooltip-line-height;\n color: $tooltip-color;\n background-color: $tooltip-bg-color;\n @include border-radius($form-feedback-tooltip-border-radius);\n }\n\n @include form-validation-state-selector($state) {\n ~ .#{$state}-feedback,\n ~ .#{$state}-tooltip {\n display: block;\n }\n }\n\n .form-control {\n @include form-validation-state-selector($state) {\n border-color: $color;\n\n @if $enable-validation-icons {\n padding-right: $input-height-inner;\n background-image: escape-svg($icon);\n background-repeat: no-repeat;\n background-position: right $input-height-inner-quarter center;\n background-size: $input-height-inner-half $input-height-inner-half;\n }\n\n &:focus {\n border-color: $color;\n box-shadow: $focus-box-shadow;\n }\n }\n }\n\n // stylelint-disable-next-line selector-no-qualifying-type\n textarea.form-control {\n @include form-validation-state-selector($state) {\n @if $enable-validation-icons {\n padding-right: $input-height-inner;\n background-position: top $input-height-inner-quarter right $input-height-inner-quarter;\n }\n }\n }\n\n .form-select {\n @include form-validation-state-selector($state) {\n border-color: $color;\n\n @if $enable-validation-icons {\n &:not([multiple]):not([size]),\n &:not([multiple])[size=\"1\"] {\n padding-right: $form-select-feedback-icon-padding-end;\n background-image: escape-svg($form-select-indicator), escape-svg($icon);\n background-position: $form-select-bg-position, $form-select-feedback-icon-position;\n background-size: $form-select-bg-size, $form-select-feedback-icon-size;\n }\n }\n\n &:focus {\n border-color: $color;\n box-shadow: $focus-box-shadow;\n }\n }\n }\n\n .form-control-color {\n @include form-validation-state-selector($state) {\n @if $enable-validation-icons {\n width: add($form-color-width, $input-height-inner);\n }\n }\n }\n\n .form-check-input {\n @include form-validation-state-selector($state) {\n border-color: $color;\n\n &:checked {\n background-color: $color;\n }\n\n &:focus {\n box-shadow: $focus-box-shadow;\n }\n\n ~ .form-check-label {\n color: $color;\n }\n }\n }\n .form-check-inline .form-check-input {\n ~ .#{$state}-feedback {\n margin-left: .5em;\n }\n }\n\n .input-group {\n > .form-control:not(:focus),\n > .form-select:not(:focus),\n > .form-floating:not(:focus-within) {\n @include form-validation-state-selector($state) {\n @if $state == \"valid\" {\n z-index: 3;\n } @else if $state == \"invalid\" {\n z-index: 4;\n }\n }\n }\n }\n}\n// scss-docs-end form-validation-mixins\n", - "// scss-docs-start table-variant\n@mixin table-variant($state, $background) {\n .table-#{$state} {\n $color: color-contrast(opaque($body-bg, $background));\n $hover-bg: mix($color, $background, percentage($table-hover-bg-factor));\n $striped-bg: mix($color, $background, percentage($table-striped-bg-factor));\n $active-bg: mix($color, $background, percentage($table-active-bg-factor));\n $table-border-color: mix($color, $background, percentage($table-border-factor));\n\n --#{$prefix}table-color: #{$color};\n --#{$prefix}table-bg: #{$background};\n --#{$prefix}table-border-color: #{$table-border-color};\n --#{$prefix}table-striped-bg: #{$striped-bg};\n --#{$prefix}table-striped-color: #{color-contrast($striped-bg)};\n --#{$prefix}table-active-bg: #{$active-bg};\n --#{$prefix}table-active-color: #{color-contrast($active-bg)};\n --#{$prefix}table-hover-bg: #{$hover-bg};\n --#{$prefix}table-hover-color: #{color-contrast($hover-bg)};\n\n color: var(--#{$prefix}table-color);\n border-color: var(--#{$prefix}table-border-color);\n }\n}\n// scss-docs-end table-variant\n", - "// stylelint-disable property-disallowed-list\n// Single side border-radius\n\n// Helper function to replace negative values with 0\n@function valid-radius($radius) {\n $return: ();\n @each $value in $radius {\n @if type-of($value) == number {\n $return: append($return, max($value, 0));\n } @else {\n $return: append($return, $value);\n }\n }\n @return $return;\n}\n\n// scss-docs-start border-radius-mixins\n@mixin border-radius($radius: $border-radius, $fallback-border-radius: false) {\n @if $enable-rounded {\n border-radius: valid-radius($radius);\n }\n @else if $fallback-border-radius != false {\n border-radius: $fallback-border-radius;\n }\n}\n\n@mixin border-top-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-left-radius: valid-radius($radius);\n border-top-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-end-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-right-radius: valid-radius($radius);\n border-bottom-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-bottom-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-bottom-right-radius: valid-radius($radius);\n border-bottom-left-radius: valid-radius($radius);\n }\n}\n\n@mixin border-start-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-left-radius: valid-radius($radius);\n border-bottom-left-radius: valid-radius($radius);\n }\n}\n\n@mixin border-top-start-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-left-radius: valid-radius($radius);\n }\n}\n\n@mixin border-top-end-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-bottom-end-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-bottom-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-bottom-start-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-bottom-left-radius: valid-radius($radius);\n }\n}\n// scss-docs-end border-radius-mixins\n", - "@mixin box-shadow($shadow...) {\n @if $enable-shadows {\n $result: ();\n\n @each $value in $shadow {\n @if $value != null {\n $result: append($result, $value, \"comma\");\n }\n @if $value == none and length($shadow) > 1 {\n @warn \"The keyword 'none' must be used as a single argument.\";\n }\n }\n\n @if (length($result) > 0) {\n box-shadow: $result;\n }\n }\n}\n", - "// Gradients\n\n// scss-docs-start gradient-bg-mixin\n@mixin gradient-bg($color: null) {\n background-color: $color;\n\n @if $enable-gradients {\n background-image: var(--#{$prefix}gradient);\n }\n}\n// scss-docs-end gradient-bg-mixin\n\n// scss-docs-start gradient-mixins\n// Horizontal gradient, from left to right\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n@mixin gradient-x($start-color: $gray-700, $end-color: $gray-800, $start-percent: 0%, $end-percent: 100%) {\n background-image: linear-gradient(to right, $start-color $start-percent, $end-color $end-percent);\n}\n\n// Vertical gradient, from top to bottom\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n@mixin gradient-y($start-color: $gray-700, $end-color: $gray-800, $start-percent: null, $end-percent: null) {\n background-image: linear-gradient(to bottom, $start-color $start-percent, $end-color $end-percent);\n}\n\n@mixin gradient-directional($start-color: $gray-700, $end-color: $gray-800, $deg: 45deg) {\n background-image: linear-gradient($deg, $start-color, $end-color);\n}\n\n@mixin gradient-x-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {\n background-image: linear-gradient(to right, $start-color, $mid-color $color-stop, $end-color);\n}\n\n@mixin gradient-y-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {\n background-image: linear-gradient($start-color, $mid-color $color-stop, $end-color);\n}\n\n@mixin gradient-radial($inner-color: $gray-700, $outer-color: $gray-800) {\n background-image: radial-gradient(circle, $inner-color, $outer-color);\n}\n\n@mixin gradient-striped($color: rgba($white, .15), $angle: 45deg) {\n background-image: linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);\n}\n// scss-docs-end gradient-mixins\n", - "// stylelint-disable property-disallowed-list\n@mixin transition($transition...) {\n @if length($transition) == 0 {\n $transition: $transition-base;\n }\n\n @if length($transition) > 1 {\n @each $value in $transition {\n @if $value == null or $value == none {\n @warn \"The keyword 'none' or 'null' must be used as a single argument.\";\n }\n }\n }\n\n @if $enable-transitions {\n @if nth($transition, 1) != null {\n transition: $transition;\n }\n\n @if $enable-reduced-motion and nth($transition, 1) != null and nth($transition, 1) != none {\n @media (prefers-reduced-motion: reduce) {\n transition: none;\n }\n }\n }\n}\n", - "// scss-docs-start clearfix\n@mixin clearfix() {\n &::after {\n display: block;\n clear: both;\n content: \"\";\n }\n}\n// scss-docs-end clearfix\n", - "// Container mixins\n\n@mixin make-container($gutter: $container-padding-x) {\n --#{$prefix}gutter-x: #{$gutter};\n --#{$prefix}gutter-y: 0;\n width: 100%;\n padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n margin-right: auto;\n margin-left: auto;\n}\n", - "// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n@mixin make-row($gutter: $grid-gutter-width) {\n --#{$prefix}gutter-x: #{$gutter};\n --#{$prefix}gutter-y: 0;\n display: flex;\n flex-wrap: wrap;\n // TODO: Revisit calc order after https://github.com/react-bootstrap/react-bootstrap/issues/6039 is fixed\n margin-top: calc(-1 * var(--#{$prefix}gutter-y)); // stylelint-disable-line function-disallowed-list\n margin-right: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n margin-left: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n}\n\n@mixin make-col-ready() {\n // Add box sizing if only the grid is loaded\n box-sizing: if(variable-exists(include-column-box-sizing) and $include-column-box-sizing, border-box, null);\n // Prevent columns from becoming too narrow when at smaller grid tiers by\n // always setting `width: 100%;`. This works because we set the width\n // later on to override this initial width.\n flex-shrink: 0;\n width: 100%;\n max-width: 100%; // Prevent `.col-auto`, `.col` (& responsive variants) from breaking out the grid\n padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n margin-top: var(--#{$prefix}gutter-y);\n}\n\n@mixin make-col($size: false, $columns: $grid-columns) {\n @if $size {\n flex: 0 0 auto;\n width: percentage(divide($size, $columns));\n\n } @else {\n flex: 1 1 0;\n max-width: 100%;\n }\n}\n\n@mixin make-col-auto() {\n flex: 0 0 auto;\n width: auto;\n}\n\n@mixin make-col-offset($size, $columns: $grid-columns) {\n $num: divide($size, $columns);\n margin-left: if($num == 0, 0, percentage($num));\n}\n\n// Row columns\n//\n// Specify on a parent element(e.g., .row) to force immediate children into NN\n// number of columns. Supports wrapping to new lines, but does not do a Masonry\n// style grid.\n@mixin row-cols($count) {\n > * {\n flex: 0 0 auto;\n width: divide(100%, $count);\n }\n}\n\n// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n .col#{$infix} {\n flex: 1 0 0%; // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4\n }\n\n .row-cols#{$infix}-auto > * {\n @include make-col-auto();\n }\n\n @if $grid-row-columns > 0 {\n @for $i from 1 through $grid-row-columns {\n .row-cols#{$infix}-#{$i} {\n @include row-cols($i);\n }\n }\n }\n\n .col#{$infix}-auto {\n @include make-col-auto();\n }\n\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @include make-col($i, $columns);\n }\n }\n\n // `$columns - 1` because offsetting by the width of an entire row isn't possible\n @for $i from 0 through ($columns - 1) {\n @if not ($infix == \"\" and $i == 0) { // Avoid emitting useless .offset-0\n .offset#{$infix}-#{$i} {\n @include make-col-offset($i, $columns);\n }\n }\n }\n }\n\n // Gutters\n //\n // Make use of `.g-*`, `.gx-*` or `.gy-*` utilities to change spacing between the columns.\n @each $key, $value in $gutters {\n .g#{$infix}-#{$key},\n .gx#{$infix}-#{$key} {\n --#{$prefix}gutter-x: #{$value};\n }\n\n .g#{$infix}-#{$key},\n .gy#{$infix}-#{$key} {\n --#{$prefix}gutter-y: #{$value};\n }\n }\n }\n }\n}\n\n@mixin make-cssgrid($columns: $grid-columns, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .g-col#{$infix}-#{$i} {\n grid-column: auto / span $i;\n }\n }\n\n // Start with `1` because `0` is and invalid value.\n // Ends with `$columns - 1` because offsetting by the width of an entire row isn't possible.\n @for $i from 1 through ($columns - 1) {\n .g-start#{$infix}-#{$i} {\n grid-column-start: $i;\n }\n }\n }\n }\n }\n}\n", - "// Utilities\n\n$utilities: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$utilities: map-merge(\n (\n // scss-docs-start utils-vertical-align\n \"align\": (\n property: vertical-align,\n class: align,\n values: baseline top middle bottom text-bottom text-top\n ),\n // scss-docs-end utils-vertical-align\n // scss-docs-start utils-float\n \"float\": (\n responsive: true,\n property: float,\n values: (\n start: left,\n end: right,\n none: none,\n )\n ),\n // scss-docs-end utils-float\n // Opacity utilities\n // scss-docs-start utils-opacity\n \"opacity\": (\n property: opacity,\n values: (\n 0: 0,\n 25: .25,\n 50: .5,\n 75: .75,\n 100: 1,\n )\n ),\n // scss-docs-end utils-opacity\n // scss-docs-start utils-overflow\n \"overflow\": (\n property: overflow,\n values: auto hidden visible scroll,\n ),\n // scss-docs-end utils-overflow\n // scss-docs-start utils-display\n \"display\": (\n responsive: true,\n print: true,\n property: display,\n class: d,\n values: inline inline-block block grid table table-row table-cell flex inline-flex none\n ),\n // scss-docs-end utils-display\n // scss-docs-start utils-shadow\n \"shadow\": (\n property: box-shadow,\n class: shadow,\n values: (\n null: $box-shadow,\n sm: $box-shadow-sm,\n lg: $box-shadow-lg,\n none: none,\n )\n ),\n // scss-docs-end utils-shadow\n // scss-docs-start utils-position\n \"position\": (\n property: position,\n values: static relative absolute fixed sticky\n ),\n \"top\": (\n property: top,\n values: $position-values\n ),\n \"bottom\": (\n property: bottom,\n values: $position-values\n ),\n \"start\": (\n property: left,\n class: start,\n values: $position-values\n ),\n \"end\": (\n property: right,\n class: end,\n values: $position-values\n ),\n \"translate-middle\": (\n property: transform,\n class: translate-middle,\n values: (\n null: translate(-50%, -50%),\n x: translateX(-50%),\n y: translateY(-50%),\n )\n ),\n // scss-docs-end utils-position\n // scss-docs-start utils-borders\n \"border\": (\n property: border,\n values: (\n null: var(--#{$prefix}border-width) var(--#{$prefix}border-style) var(--#{$prefix}border-color),\n 0: 0,\n )\n ),\n \"border-top\": (\n property: border-top,\n values: (\n null: var(--#{$prefix}border-width) var(--#{$prefix}border-style) var(--#{$prefix}border-color),\n 0: 0,\n )\n ),\n \"border-end\": (\n property: border-right,\n class: border-end,\n values: (\n null: var(--#{$prefix}border-width) var(--#{$prefix}border-style) var(--#{$prefix}border-color),\n 0: 0,\n )\n ),\n \"border-bottom\": (\n property: border-bottom,\n values: (\n null: var(--#{$prefix}border-width) var(--#{$prefix}border-style) var(--#{$prefix}border-color),\n 0: 0,\n )\n ),\n \"border-start\": (\n property: border-left,\n class: border-start,\n values: (\n null: var(--#{$prefix}border-width) var(--#{$prefix}border-style) var(--#{$prefix}border-color),\n 0: 0,\n )\n ),\n \"border-color\": (\n property: border-color,\n class: border,\n local-vars: (\n \"border-opacity\": 1\n ),\n values: $utilities-border-colors\n ),\n \"border-width\": (\n css-var: true,\n css-variable-name: border-width,\n class: border,\n values: $border-widths\n ),\n \"border-opacity\": (\n css-var: true,\n class: border-opacity,\n values: (\n 10: .1,\n 25: .25,\n 50: .5,\n 75: .75,\n 100: 1\n )\n ),\n // scss-docs-end utils-borders\n // Sizing utilities\n // scss-docs-start utils-sizing\n \"width\": (\n property: width,\n class: w,\n values: (\n 25: 25%,\n 50: 50%,\n 75: 75%,\n 100: 100%,\n auto: auto\n )\n ),\n \"max-width\": (\n property: max-width,\n class: mw,\n values: (100: 100%)\n ),\n \"viewport-width\": (\n property: width,\n class: vw,\n values: (100: 100vw)\n ),\n \"min-viewport-width\": (\n property: min-width,\n class: min-vw,\n values: (100: 100vw)\n ),\n \"height\": (\n property: height,\n class: h,\n values: (\n 25: 25%,\n 50: 50%,\n 75: 75%,\n 100: 100%,\n auto: auto\n )\n ),\n \"max-height\": (\n property: max-height,\n class: mh,\n values: (100: 100%)\n ),\n \"viewport-height\": (\n property: height,\n class: vh,\n values: (100: 100vh)\n ),\n \"min-viewport-height\": (\n property: min-height,\n class: min-vh,\n values: (100: 100vh)\n ),\n // scss-docs-end utils-sizing\n // Flex utilities\n // scss-docs-start utils-flex\n \"flex\": (\n responsive: true,\n property: flex,\n values: (fill: 1 1 auto)\n ),\n \"flex-direction\": (\n responsive: true,\n property: flex-direction,\n class: flex,\n values: row column row-reverse column-reverse\n ),\n \"flex-grow\": (\n responsive: true,\n property: flex-grow,\n class: flex,\n values: (\n grow-0: 0,\n grow-1: 1,\n )\n ),\n \"flex-shrink\": (\n responsive: true,\n property: flex-shrink,\n class: flex,\n values: (\n shrink-0: 0,\n shrink-1: 1,\n )\n ),\n \"flex-wrap\": (\n responsive: true,\n property: flex-wrap,\n class: flex,\n values: wrap nowrap wrap-reverse\n ),\n \"justify-content\": (\n responsive: true,\n property: justify-content,\n values: (\n start: flex-start,\n end: flex-end,\n center: center,\n between: space-between,\n around: space-around,\n evenly: space-evenly,\n )\n ),\n \"align-items\": (\n responsive: true,\n property: align-items,\n values: (\n start: flex-start,\n end: flex-end,\n center: center,\n baseline: baseline,\n stretch: stretch,\n )\n ),\n \"align-content\": (\n responsive: true,\n property: align-content,\n values: (\n start: flex-start,\n end: flex-end,\n center: center,\n between: space-between,\n around: space-around,\n stretch: stretch,\n )\n ),\n \"align-self\": (\n responsive: true,\n property: align-self,\n values: (\n auto: auto,\n start: flex-start,\n end: flex-end,\n center: center,\n baseline: baseline,\n stretch: stretch,\n )\n ),\n \"order\": (\n responsive: true,\n property: order,\n values: (\n first: -1,\n 0: 0,\n 1: 1,\n 2: 2,\n 3: 3,\n 4: 4,\n 5: 5,\n last: 6,\n ),\n ),\n // scss-docs-end utils-flex\n // Margin utilities\n // scss-docs-start utils-spacing\n \"margin\": (\n responsive: true,\n property: margin,\n class: m,\n values: map-merge($spacers, (auto: auto))\n ),\n \"margin-x\": (\n responsive: true,\n property: margin-right margin-left,\n class: mx,\n values: map-merge($spacers, (auto: auto))\n ),\n \"margin-y\": (\n responsive: true,\n property: margin-top margin-bottom,\n class: my,\n values: map-merge($spacers, (auto: auto))\n ),\n \"margin-top\": (\n responsive: true,\n property: margin-top,\n class: mt,\n values: map-merge($spacers, (auto: auto))\n ),\n \"margin-end\": (\n responsive: true,\n property: margin-right,\n class: me,\n values: map-merge($spacers, (auto: auto))\n ),\n \"margin-bottom\": (\n responsive: true,\n property: margin-bottom,\n class: mb,\n values: map-merge($spacers, (auto: auto))\n ),\n \"margin-start\": (\n responsive: true,\n property: margin-left,\n class: ms,\n values: map-merge($spacers, (auto: auto))\n ),\n // Negative margin utilities\n \"negative-margin\": (\n responsive: true,\n property: margin,\n class: m,\n values: $negative-spacers\n ),\n \"negative-margin-x\": (\n responsive: true,\n property: margin-right margin-left,\n class: mx,\n values: $negative-spacers\n ),\n \"negative-margin-y\": (\n responsive: true,\n property: margin-top margin-bottom,\n class: my,\n values: $negative-spacers\n ),\n \"negative-margin-top\": (\n responsive: true,\n property: margin-top,\n class: mt,\n values: $negative-spacers\n ),\n \"negative-margin-end\": (\n responsive: true,\n property: margin-right,\n class: me,\n values: $negative-spacers\n ),\n \"negative-margin-bottom\": (\n responsive: true,\n property: margin-bottom,\n class: mb,\n values: $negative-spacers\n ),\n \"negative-margin-start\": (\n responsive: true,\n property: margin-left,\n class: ms,\n values: $negative-spacers\n ),\n // Padding utilities\n \"padding\": (\n responsive: true,\n property: padding,\n class: p,\n values: $spacers\n ),\n \"padding-x\": (\n responsive: true,\n property: padding-right padding-left,\n class: px,\n values: $spacers\n ),\n \"padding-y\": (\n responsive: true,\n property: padding-top padding-bottom,\n class: py,\n values: $spacers\n ),\n \"padding-top\": (\n responsive: true,\n property: padding-top,\n class: pt,\n values: $spacers\n ),\n \"padding-end\": (\n responsive: true,\n property: padding-right,\n class: pe,\n values: $spacers\n ),\n \"padding-bottom\": (\n responsive: true,\n property: padding-bottom,\n class: pb,\n values: $spacers\n ),\n \"padding-start\": (\n responsive: true,\n property: padding-left,\n class: ps,\n values: $spacers\n ),\n // Gap utility\n \"gap\": (\n responsive: true,\n property: gap,\n class: gap,\n values: $spacers\n ),\n // scss-docs-end utils-spacing\n // Text\n // scss-docs-start utils-text\n \"font-family\": (\n property: font-family,\n class: font,\n values: (monospace: var(--#{$prefix}font-monospace))\n ),\n \"font-size\": (\n rfs: true,\n property: font-size,\n class: fs,\n values: $font-sizes\n ),\n \"font-style\": (\n property: font-style,\n class: fst,\n values: italic normal\n ),\n \"font-weight\": (\n property: font-weight,\n class: fw,\n values: (\n light: $font-weight-light,\n lighter: $font-weight-lighter,\n normal: $font-weight-normal,\n bold: $font-weight-bold,\n semibold: $font-weight-semibold,\n bolder: $font-weight-bolder\n )\n ),\n \"line-height\": (\n property: line-height,\n class: lh,\n values: (\n 1: 1,\n sm: $line-height-sm,\n base: $line-height-base,\n lg: $line-height-lg,\n )\n ),\n \"text-align\": (\n responsive: true,\n property: text-align,\n class: text,\n values: (\n start: left,\n end: right,\n center: center,\n )\n ),\n \"text-decoration\": (\n property: text-decoration,\n values: none underline line-through\n ),\n \"text-transform\": (\n property: text-transform,\n class: text,\n values: lowercase uppercase capitalize\n ),\n \"white-space\": (\n property: white-space,\n class: text,\n values: (\n wrap: normal,\n nowrap: nowrap,\n )\n ),\n \"word-wrap\": (\n property: word-wrap word-break,\n class: text,\n values: (break: break-word),\n rtl: false\n ),\n // scss-docs-end utils-text\n // scss-docs-start utils-color\n \"color\": (\n property: color,\n class: text,\n local-vars: (\n \"text-opacity\": 1\n ),\n values: map-merge(\n $utilities-text-colors,\n (\n \"muted\": $text-muted,\n \"black-50\": rgba($black, .5), // deprecated\n \"white-50\": rgba($white, .5), // deprecated\n \"reset\": inherit,\n )\n )\n ),\n \"text-opacity\": (\n css-var: true,\n class: text-opacity,\n values: (\n 25: .25,\n 50: .5,\n 75: .75,\n 100: 1\n )\n ),\n // scss-docs-end utils-color\n // scss-docs-start utils-bg-color\n \"background-color\": (\n property: background-color,\n class: bg,\n local-vars: (\n \"bg-opacity\": 1\n ),\n values: map-merge(\n $utilities-bg-colors,\n (\n \"transparent\": transparent\n )\n )\n ),\n \"bg-opacity\": (\n css-var: true,\n class: bg-opacity,\n values: (\n 10: .1,\n 25: .25,\n 50: .5,\n 75: .75,\n 100: 1\n )\n ),\n // scss-docs-end utils-bg-color\n \"gradient\": (\n property: background-image,\n class: bg,\n values: (gradient: var(--#{$prefix}gradient))\n ),\n // scss-docs-start utils-interaction\n \"user-select\": (\n property: user-select,\n values: all auto none\n ),\n \"pointer-events\": (\n property: pointer-events,\n class: pe,\n values: none auto,\n ),\n // scss-docs-end utils-interaction\n // scss-docs-start utils-border-radius\n \"rounded\": (\n property: border-radius,\n class: rounded,\n values: (\n null: var(--#{$prefix}border-radius),\n 0: 0,\n 1: var(--#{$prefix}border-radius-sm),\n 2: var(--#{$prefix}border-radius),\n 3: var(--#{$prefix}border-radius-lg),\n 4: var(--#{$prefix}border-radius-xl),\n 5: var(--#{$prefix}border-radius-2xl),\n circle: 50%,\n pill: var(--#{$prefix}border-radius-pill)\n )\n ),\n \"rounded-top\": (\n property: border-top-left-radius border-top-right-radius,\n class: rounded-top,\n values: (null: var(--#{$prefix}border-radius))\n ),\n \"rounded-end\": (\n property: border-top-right-radius border-bottom-right-radius,\n class: rounded-end,\n values: (null: var(--#{$prefix}border-radius))\n ),\n \"rounded-bottom\": (\n property: border-bottom-right-radius border-bottom-left-radius,\n class: rounded-bottom,\n values: (null: var(--#{$prefix}border-radius))\n ),\n \"rounded-start\": (\n property: border-bottom-left-radius border-top-left-radius,\n class: rounded-start,\n values: (null: var(--#{$prefix}border-radius))\n ),\n // scss-docs-end utils-border-radius\n // scss-docs-start utils-visibility\n \"visibility\": (\n property: visibility,\n class: null,\n values: (\n visible: visible,\n invisible: hidden,\n )\n )\n // scss-docs-end utils-visibility\n ),\n $utilities\n);\n", - ":root {\n // Note: Custom variable values only support SassScript inside `#{}`.\n\n // Colors\n //\n // Generate palettes for full colors, grays, and theme colors.\n\n @each $color, $value in $colors {\n --#{$prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $grays {\n --#{$prefix}gray-#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors {\n --#{$prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors-rgb {\n --#{$prefix}#{$color}-rgb: #{$value};\n }\n\n --#{$prefix}white-rgb: #{to-rgb($white)};\n --#{$prefix}black-rgb: #{to-rgb($black)};\n --#{$prefix}body-color-rgb: #{to-rgb($body-color)};\n --#{$prefix}body-bg-rgb: #{to-rgb($body-bg)};\n\n // Fonts\n\n // Note: Use `inspect` for lists so that quoted items keep the quotes.\n // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\n --#{$prefix}font-sans-serif: #{inspect($font-family-sans-serif)};\n --#{$prefix}font-monospace: #{inspect($font-family-monospace)};\n --#{$prefix}gradient: #{$gradient};\n\n // Root and body\n // scss-docs-start root-body-variables\n @if $font-size-root != null {\n --#{$prefix}root-font-size: #{$font-size-root};\n }\n --#{$prefix}body-font-family: #{$font-family-base};\n @include rfs($font-size-base, --#{$prefix}body-font-size);\n --#{$prefix}body-font-weight: #{$font-weight-base};\n --#{$prefix}body-line-height: #{$line-height-base};\n --#{$prefix}body-color: #{$body-color};\n @if $body-text-align != null {\n --#{$prefix}body-text-align: #{$body-text-align};\n }\n --#{$prefix}body-bg: #{$body-bg};\n // scss-docs-end root-body-variables\n\n // scss-docs-start root-border-var\n --#{$prefix}border-width: #{$border-width};\n --#{$prefix}border-style: #{$border-style};\n --#{$prefix}border-color: #{$border-color};\n --#{$prefix}border-color-translucent: #{$border-color-translucent};\n\n --#{$prefix}border-radius: #{$border-radius};\n --#{$prefix}border-radius-sm: #{$border-radius-sm};\n --#{$prefix}border-radius-lg: #{$border-radius-lg};\n --#{$prefix}border-radius-xl: #{$border-radius-xl};\n --#{$prefix}border-radius-2xl: #{$border-radius-2xl};\n --#{$prefix}border-radius-pill: #{$border-radius-pill};\n // scss-docs-end root-border-var\n\n --#{$prefix}link-color: #{$link-color};\n --#{$prefix}link-hover-color: #{$link-hover-color};\n\n --#{$prefix}code-color: #{$code-color};\n\n --#{$prefix}highlight-bg: #{$mark-bg};\n}\n", - "// stylelint-disable declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n\n// Root\n//\n// Ability to the value of the root font sizes, affecting the value of `rem`.\n// null by default, thus nothing is generated.\n\n:root {\n @if $font-size-root != null {\n @include font-size(var(--#{$prefix}root-font-size));\n }\n\n @if $enable-smooth-scroll {\n @media (prefers-reduced-motion: no-preference) {\n scroll-behavior: smooth;\n }\n }\n}\n\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Prevent adjustments of font size after orientation changes in iOS.\n// 4. Change the default tap highlight to be completely transparent in iOS.\n\n// scss-docs-start reboot-body-rules\nbody {\n margin: 0; // 1\n font-family: var(--#{$prefix}body-font-family);\n @include font-size(var(--#{$prefix}body-font-size));\n font-weight: var(--#{$prefix}body-font-weight);\n line-height: var(--#{$prefix}body-line-height);\n color: var(--#{$prefix}body-color);\n text-align: var(--#{$prefix}body-text-align);\n background-color: var(--#{$prefix}body-bg); // 2\n -webkit-text-size-adjust: 100%; // 3\n -webkit-tap-highlight-color: rgba($black, 0); // 4\n}\n// scss-docs-end reboot-body-rules\n\n\n// Content grouping\n//\n// 1. Reset Firefox's gray color\n\nhr {\n margin: $hr-margin-y 0;\n color: $hr-color; // 1\n border: 0;\n border-top: $hr-border-width solid $hr-border-color;\n opacity: $hr-opacity;\n}\n\n\n// Typography\n//\n// 1. Remove top margins from headings\n// By default, `

`-`

` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n\n%heading {\n margin-top: 0; // 1\n margin-bottom: $headings-margin-bottom;\n font-family: $headings-font-family;\n font-style: $headings-font-style;\n font-weight: $headings-font-weight;\n line-height: $headings-line-height;\n color: $headings-color;\n}\n\nh1 {\n @extend %heading;\n @include font-size($h1-font-size);\n}\n\nh2 {\n @extend %heading;\n @include font-size($h2-font-size);\n}\n\nh3 {\n @extend %heading;\n @include font-size($h3-font-size);\n}\n\nh4 {\n @extend %heading;\n @include font-size($h4-font-size);\n}\n\nh5 {\n @extend %heading;\n @include font-size($h5-font-size);\n}\n\nh6 {\n @extend %heading;\n @include font-size($h6-font-size);\n}\n\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `

`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\n\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n\n// Abbreviations\n//\n// 1. Add the correct text decoration in Chrome, Edge, Opera, and Safari.\n// 2. Add explicit cursor to indicate changed behavior.\n// 3. Prevent the text-decoration to be skipped.\n\nabbr[title] {\n text-decoration: underline dotted; // 1\n cursor: help; // 2\n text-decoration-skip-ink: none; // 3\n}\n\n\n// Address\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\n\n// Lists\n\nol,\nul {\n padding-left: 2rem;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\n// 1. Undo browser default\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // 1\n}\n\n\n// Blockquote\n\nblockquote {\n margin: 0 0 1rem;\n}\n\n\n// Strong\n//\n// Add the correct font weight in Chrome, Edge, and Safari\n\nb,\nstrong {\n font-weight: $font-weight-bolder;\n}\n\n\n// Small\n//\n// Add the correct font size in all browsers\n\nsmall {\n @include font-size($small-font-size);\n}\n\n\n// Mark\n\nmark {\n padding: $mark-padding;\n background-color: var(--#{$prefix}highlight-bg);\n}\n\n\n// Sub and Sup\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n\nsub,\nsup {\n position: relative;\n @include font-size($sub-sup-font-size);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n// Links\n\na {\n color: var(--#{$prefix}link-color);\n text-decoration: $link-decoration;\n\n &:hover {\n color: var(--#{$prefix}link-hover-color);\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([class]) {\n &,\n &:hover {\n color: inherit;\n text-decoration: none;\n }\n}\n\n\n// Code\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-code;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n}\n\n// 1. Remove browser default top margin\n// 2. Reset browser default of `1em` to use `rem`s\n// 3. Don't allow content to break outside\n\npre {\n display: block;\n margin-top: 0; // 1\n margin-bottom: 1rem; // 2\n overflow: auto; // 3\n @include font-size($code-font-size);\n color: $pre-color;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n @include font-size(inherit);\n color: inherit;\n word-break: normal;\n }\n}\n\ncode {\n @include font-size($code-font-size);\n color: var(--#{$prefix}code-color);\n word-wrap: break-word;\n\n // Streamline the style when inside anchors to avoid broken underline and more\n a > & {\n color: inherit;\n }\n}\n\nkbd {\n padding: $kbd-padding-y $kbd-padding-x;\n @include font-size($kbd-font-size);\n color: $kbd-color;\n background-color: $kbd-bg;\n @include border-radius($border-radius-sm);\n\n kbd {\n padding: 0;\n @include font-size(1em);\n font-weight: $nested-kbd-font-weight;\n }\n}\n\n\n// Figures\n//\n// Apply a consistent margin strategy (matches our type styles).\n\nfigure {\n margin: 0 0 1rem;\n}\n\n\n// Images and content\n\nimg,\nsvg {\n vertical-align: middle;\n}\n\n\n// Tables\n//\n// Prevent double borders\n\ntable {\n caption-side: bottom;\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: $table-cell-padding-y;\n padding-bottom: $table-cell-padding-y;\n color: $table-caption-color;\n text-align: left;\n}\n\n// 1. Removes font-weight bold by inheriting\n// 2. Matches default `` alignment by inheriting `text-align`.\n// 3. Fix alignment for Safari\n\nth {\n font-weight: $table-th-font-weight; // 1\n text-align: inherit; // 2\n text-align: -webkit-match-parent; // 3\n}\n\nthead,\ntbody,\ntfoot,\ntr,\ntd,\nth {\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n}\n\n\n// Forms\n//\n// 1. Allow labels to use `margin` for spacing.\n\nlabel {\n display: inline-block; // 1\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n// See https://github.com/twbs/bootstrap/issues/24093\n\nbutton {\n // stylelint-disable-next-line property-disallowed-list\n border-radius: 0;\n}\n\n// Explicitly remove focus outline in Chromium when it shouldn't be\n// visible (e.g. as result of mouse click or touch tap). It already\n// should be doing this automatically, but seems to currently be\n// confused and applies its very visible two-tone outline anyway.\n\nbutton:focus:not(:focus-visible) {\n outline: 0;\n}\n\n// 1. Remove the margin in Firefox and Safari\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // 1\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\n// Remove the inheritance of text transform in Firefox\nbutton,\nselect {\n text-transform: none;\n}\n// Set the cursor for non-` -

- - - - -
-
- -
- -
- -

Privacy Policy

-

Last Edited May 27, 2021

-

-

TLDR: We do not use cookies, we do not collect any personal data and -logs aren’t shared with third-parties.

-

Website visitors

-
    -
  • No personal information is collected.
  • -
  • No information is stored in the browser.
  • -
  • No information is shared with, sent to or sold to third-parties.
  • -
  • No information is shared with advertising companies.
  • -
  • No information is mined and harvested for personal and behavioral trends.
  • -
  • No information is monetized.
  • -
-

Information we collect and what we use it for

-

Website activity is logged and stored for a period of one month for -debugging purposes. We don’t share this information with anyone nor do -we run analytics on it.

-

The following information is collected:

-
    -
  • Page URL. the page URL of each page view on this website. For -example: https://mcaptcha.org/contact
  • -
  • Browser. We use this to reproduce browser-specific bugs people -see. This is derived from the User-Agent HTTP header. For example: Chrome.
  • -
-

Contact us

-

Contact us if you have any questions.

-

Effective Date: 20th May, 2021

- -

Edit this page on git.batsense.net

- -
-
- -
-
- - - - - - - - - diff --git a/public/categories/index.xml b/public/categories/index.xml deleted file mode 100644 index 97e554c..0000000 --- a/public/categories/index.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - Categories on - //localhost:1313/categories/ - Recent content in Categories on - Hugo - en - - - diff --git a/public/index.xml b/public/index.xml deleted file mode 100644 index ddfcdb6..0000000 --- a/public/index.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - //localhost:1313/ - Recent content on - Hugo - en - - - diff --git a/public/sitemap.xml b/public/sitemap.xml deleted file mode 100644 index 7501792..0000000 --- a/public/sitemap.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - //localhost:1313/ - - //localhost:1313/categories/ - - //localhost:1313/tags/ - - diff --git a/public/tags/index.xml b/public/tags/index.xml deleted file mode 100644 index b21383f..0000000 --- a/public/tags/index.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - Tags on - //localhost:1313/tags/ - Recent content in Tags on - Hugo - en - - - diff --git a/robots.txt b/robots.txt index 765c782..446726b 100644 --- a/robots.txt +++ b/robots.txt @@ -1,4 +1,4 @@ User-agent: * -Disallow: / +Allow: / -Sitemap: //localhost:1313/sitemap.xml \ No newline at end of file +Sitemap: /sitemap.xml \ No newline at end of file diff --git a/security/index.html b/security/index.html deleted file mode 100644 index 2bfe97d..0000000 --- a/security/index.html +++ /dev/null @@ -1,508 +0,0 @@ - - - - - - - - - - - - - - Security - mCaptcha - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
-
- -
- -
- -

Security

-

Last Edited May 27, 2021

-

-

Security is at the heart of mCaptcha. If you find any discrepancies in -our software(see listing on our GitHub, -services available)

-

Rules:

-

Before you start

-
    -
  • -

    Check the list of domains that are in scope for security research -and the list of targets for useful information for getting started.

    -
  • -
  • -

    Check the list of bugs that have been classified as ineligible.

    -
  • -
  • -

    Check our changelog(in our GitHub repositories) for recently launched -features.

    -
  • -
  • -

    Never attempt non-technical attacks such as social engineering, -phishing, or physical attacks against our employees, users, or -infrastructure.

    -
  • -
-

When in doubt, contact -me(@realaravinth) at -realaravinth@batense.net.

-

Performing your research

-
    -
  • -

    Do not impact other users with your testing, this includes testing -vulnerabilities with CAPTCHA credentials and account credentials -of accounts you do not own. If you are attempting to find an -authorization bypass, you must use accounts you own.

    -
  • -
  • -

    The following are never allowed for research. We may -suspend your mCaptcha account for:

    -
      -
    • -

      Performing distributed denial of service (DDoS) or other volumetric -attacks. Sure, we are a DDoS protection organisation, but with sufficient -resources and motivation, it is possible to take us down. For this -reason, we request you to not hurt us.

      -
    • -
    • -

      Spamming content Large-scale vulnerability scanners, scrapers, or -automated tools which produce excessive amounts of traffic.

      -

      Note: We do allow the use of automated tools so long as they do -not produce excessive amounts of traffic. For example, running -one nmap scan against one host is allowed, but sending 65,000 -requests in two minutes using Burp Suite Intruder is excessive.

      -
    • -
    -
  • -
  • -

    Researching denial-of-service attacks is allowed only if you follow -these rules:

    -
      -
    • -

      There are no limits for researching denial of service -vulnerabilities against your own instance of mCaptcha server. We -strongly recommend/prefer this method for researching denial of -service issues.

      -
    • -
    • -

      If you choose to test on mCaptcha proper (i.e. -https://mcaptcha.org or https://mcaptcha.io):

      -
        -
      • Research must be performed using credentials you own.
      • -
      • Stop immediately if you believe you have affected the -availability of our services. Don’t worry about demonstrating -the full impact of your vulnerability, our team -will be able to determine the impact.
      • -
      -
    • -
    -
  • -
-

Handling personally identifiable information (PII)

-
    -
  • -

    Personally identifying information (PII) includes:

    -
      -
    • legal and/or full names
    • -
    • names or usernames combined with other identifiers like phone numbers or email addresses
    • -
    • health or financial information (including insurance information, social security numbers, etc.)
    • -
    • information about political or religious affiliations
    • -
    • information about race, ethnicity, sexual orientation, gender, or other identifying information that could be used for discriminatory purposes
    • -
    -
  • -
  • -

    Do not intentionally access others’ PII. If you suspect a service -provides access to PII, limit queries to your own personal -information.

    -
  • -
  • -

    Report the vulnerability immediately and do not attempt to access any -other data. We will assess the scope and impact of the PII exposure.

    -
  • -
  • -

    Limit the amount of data returned from services. For SQL injection, -for example, limit the number of rows returned

    -
  • -
  • -

    You must delete all your local, stored, or cached copies of data -containing PII as soon as possible. We may ask you to sign a -certificate of deletion and confidentiality agreement regarding the -exact information you accessed. We may ask you for the usernames and -IP addresses used during your testing to assess the impact of the -vulnerability.

    -
  • -
-

Reporting your vulnerability

-
    -
  • -

    Reports must include written instructions for reproducing the -vulnerability.

    -
  • -
  • -

    When reporting vulnerabilities you must keep all information on -restricted to email correspondence with us(see below for -contact). If you believe the bug to be critical, please use -encryption.

    -
  • -
  • -

    Do not post information to -video-sharing or pastebin sites.

    -
  • -
  • -

    For vulnerabilities involving personally identifiable information, -please explain the kind of PII you believe is exposed and limit the -amount of PII data included in your bug report. For textual -information and screenshots, please only include redacted data in your -bug report.

    -
  • -
  • -

    During the course of an investigation, it may take time to resolve -the issue you have reported. We ask that you refrain from publicly -disclosing details regarding an issue you’ve reported until the fix has -been publicly made available.

    -
  • -
- -

We currently don’t have any legal policies in place but rest assured -that as long as your research adheres to the above rules, your security -research and vulnerability disclosure activities are considered as -“authorized”.

-

A detailed policy based on this sentiment is in the works.

-

Scope:

-

mCaptcha runs a number of services. Only domains listed below are are -eligible for security research. Any mCaptcha-owned domains not listed -below are not in scope and are not covered by our legal safe -harbor

-

mcaptcha.org

-
    -
  • mcaptcha.org
  • -
  • demo.mcaptcha.org
  • -
  • demo2.mcaptcha.org
  • -
-

mcaptcha.io

-
    -
  • mcaptcha.io
  • -
-

Contact

-

Email

-

realaravinth@batense.net.

-

GPG Key

-

Click here to download key

-
-----BEGIN PGP PUBLIC KEY BLOCK-----
-
-mQGNBF7jJtMBDADwoO98P31bTkBmWlkICljq8o+S9ltFab9f9l6Npox+qbCnZUCd
-Y+p1jCmRc+6iBh4N2p5kP/02z6BkW7BhVtPKU9Zg1nvkhluCUSMixUlpn/dUYw2J
-j41lqqmvpytI5Gr9xwFbPuLxzccMge1hqlVli1eZJTQyhZnv3Og2xj6kmThgaCDO
-U0lMDwT4n1AjjdLT/FX5APssw9v2fgmClmHl8YC1ojZ2msPfHd85q90YdzB5G4Q6
-g3zAgv9ADkYkkvy4ElFl1ePwrUtD+EcszWZgYnqVRt1NBoo4J200fJSRmkq9qYh9
-4WDLIeX+DnB2ofqJrxJFX5P7elsn3ic4WVxtpkpoCbwuVsMWi8vBBU3fyxxqwGIv
-aOErCGy9Vd4iuDUu7GymDjMxJi+uYvjGncjasPRmBToCZzY94FIHgn8cxJdkrPaV
-FbyE8BkxLlbaiRNLcu79EHYqs2UxygGWlglMA9Z/QmuGcHsAzUtlkcFdPLg7+KvU
-xzMiBFmdh0Eabn8AEQEAAbQsQXJhdmludGggTWFuaXZhbm5hbiA8YXJhdmludGg3
-ODIwQGdtYWlsLmNvbT6JAcQEEwEIAC4ECwkIBwIVCgIWAQKeAQKbAxYhBO3wOyzk
-G1g2vjW6O62fDwjoVe2IBQJe7G0jAAoJEK2fDwjoVe2IPLkL/icH+eresFyQrv7S
-qSUWLkTlK+Ht7qURBeb4TV+nkJshcvnxHoaDiov1ZFyvyhzLi3Ncw17ntRD+tIlr
-IYZ6YWekpkYIjWRcyU0DWJI2u6OAcT/l7EbxKJzywRLi8cGJQyLxSQMFK2GsU6dt
-7VSOshoXpUGApxJ0tkRZX2xQ+3LSvCNKK0VCFnT+MyJW+4/r9+NCjxyEw0FR5Rka
-28kIaq8E4MwP1O1cyFAXmT9FVBAEEoAwLM7GRFguacr8EHi0W/NZKNsu87e4/oL3
-lh2vetIv7+rUdH5hf2WRZcNxNJllJc7povrdUl8+5mLlRB0JAogz5nLfacr2affw
-0esNL/g+Futgip3I5lLla4izMy62EsRIjqaafHpZZPfl0FmUchCZKMKaG38dyAN+
-yPvxpoQuqCp/+Mch5aSijOb7tcXIzTDev38dYBW+0afrzKlMubvWTOMfwj6bo1qS
-sTtxYNRt2DPOD4/ZVOSz0Flx4VxfZJ5E/a82bw3UPQaBvrk7XokBsAQTAQoAGgQL
-CQgHAhUKAhYBAhkABYJe573AAp4BApsDAAoJEK2fDwjoVe2I2/QL+QHs5QblIP4C
-2tPj0hE+stU5EjXipLdkO5KuLEe3qn+QtfxFFXRmsGolaWxypWIzX5A7RE28XJ+i
-aaULK/YeqVzuF/UcpGuJ771v8cvJYgUcAUsQfHOubwKltxRfCzRBBVcDLG0BUOiO
-alYZKZriN7R5Y/Jx14roQcC5k/RnJCLu1W3bxi/0mdmqE3fj7fkCTQeJQKNoUggt
-w4uzXMqEwy0SRZeGvhZI6Mdw5TOdJO8NAy08tK4vLGVYQpQD/iOyj5NLg7PgSQTk
-vt7ejl6ff7TTCcW/nEq+lymDGktxrRBeb4A1LMlSy59LSTJhk96+RXyTpmSYDmAx
-T/tIL7PEjj9byzWJUrBAOeT47q0dwNMqL8Bn1mICf3OHg/dVtT61Zd/qp86vBYXx
-2WZwGVKA64qJgrsFxeRfjhJHTet6SCgPygC+/k7H+YGSQ5kwwrbaTS/YOwjtgobL
-pnNHKi/yoCr4cS/NUEpOeHx7+MNxf3bvz+Qk40UUEgzeqINUsQKIGIkBsAQTAQoA
-GgQLCQgHAhUKAhYBAhkBBYJe4ybTAp4BApsDAAoJEK2fDwjoVe2IA54MAOe1eX6V
-k3Lyse0pOdfRmaTdctLyRd3ERZecxPh8RVXoIv1U1AhoQQLfFMSUiniJvGNInWp1
-qY0iPnXgLDU51mRuGw06YuBxWIEGy1oTJQ2KQ+ClA1tF75e7eX6N5PVxioKvDLSN
-lzIugJIIHTeOy8uIf9vZJrduTMOADtjXKbJIh6cDyCU+t3rdPOcNrqspEVOgKpN1
-2XmsD2xBkkmWpiL+CU47ZkJ49r9y6F2ojBnymceFtwc3OXKsoamzUY75cBEW+Gcm
-kFVcWmffaf1VHjXCYfpki+YKxJEq7u2UwtbqAWBjGLVAC6SBPbQGUxa5tTb3MuSP
-PtWF4j8LqD5ZlbNxvv/c/zOh8o0Vb2jQLUBMsaxUB6RQU1D+zSbQMr0nBJmc2Gkt
-OKib/v83iM/+XfVRFy8eurPAHRIhYPuKKxHbkhUYFAqQ32sb2Y4gR8UBLsBIZj5J
-TJdDSaZ36e/knxfg80GLQEBD2FF/yHlSTipeDAjF/hq7kfazRNwx5ePHubQ0QXJh
-dmludGggTWFuaXZhbm5hbiA8YXJhdmludGguMTliY2U3NDE1QHZpdGFwLmFjLmlu
-PokBsAQTAQoAGgQLCQgHAhUKAhYBAhkABYJe4ybTAp4BApsDAAoJEK2fDwjoVe2I
-ougL/AtxgTK591CPdbb4n0J0i7raWZABJD/kjZ/5HmdypCj8l2utyw405pJsAZrg
-F7QOuJ6UjLyd6hIbtTXNdC6rp1ayXudTEeJSYJzvkeWCxuY6yjDjcfKInv9/Sr3q
-1XfA7N3uRIiDmyewE1scOttA8BAqGYcHYi6fPoLioHDM+yrgJUeBxSW1BpLp4jZ6
-zGof4uRrFX7NtQdNJJ1A6M/+oMVxnnGDA9BN4CjQBxMfAHFVGXLNfVVhJ9g+995f
-OjntCtS+fWW/PwPN5OO5mHfMleexigrx6Ju79qC69pMKGef+rVuzQBH9reg1QeSt
-x7hHOoSXC/YMl8GvItqhhR84xb9EFF6WsCWlg5LwMet2vS9TYY/zbY4SO2FUvWZz
-CgvxnWNasNfzMS08U1tvUH4k+Gt1m2toPacSIx1DyNExseY8FaRoXOHB8ojRcmNe
-jAbpWx7tOk8hhiyvQkVFXpU/U3mzzKWNMrVIQX/ZZV4W1XQA5pIvbvgNVoSoC36C
-lT8Ck7QvQXJhdmludGggTWFuaXZhbm5hbiA8cmVhbGFyYXZpbnRoQGJhdHNlbnNl
-Lm5ldD6JAccEEwEIADEECwkIBwIVCgIWAQKeAQKbAxYhBO3wOyzkG1g2vjW6O62f
-DwjoVe2IBQJe7G0qAhkBAAoJEK2fDwjoVe2IiusMAJYC7hrMnJFKp7JOhpj12H1H
-JDKSyrok7uRCCBLCTDbKx0nDvqQqYjIlM3/ZyQruezBxgh92o6ti8wXSuygtLvmf
-qQbSOzugw1nCis5WxW1g2pmZbbnTgq9KBR4dQnjSB8AVy1l6EU6bUJiQPwT5/TWo
-cSPEmlycLSCNgZkUsgOSJDqb10P0PmKXbr8U0VVtUlmODDDgXtjGnvTEa76Dyryp
-9uGFG+vBt6r51xn3Qdbx/fRsQMhsYZkxFlh3Uh5LgVOOCTbCUJON7mj8G6Mfl/Ek
-y2zpF9+xAbpRcbgADas5hLDsoPZ6D5XglRek3lWmYjYLEYt5WOCjLgoAbLuYzH5P
-1L1BAJaaXMvgxw62YA6sPnlopfglctopL0cCHo3N8TlSuYiL1p3C9jqPXc/y6zfi
-4Gxq7e/y9L+TZr1BQMoWpqkzDq1ruLL3GgIairs+byHZN8vA3L5UkqsN14SLwmLb
-dr50QW9vDyrHGJIPKf0W2CG25RO87RpW2QIZMdYNt4kBsAQTAQoAGgQLCQgHAhUK
-AhYBAhkABYJe4ybTAp4BApsDAAoJEK2fDwjoVe2IArQL/AwOsQJUIyni9v7DhQsl
-CVTGmB05xRVF7wHjuwEuFR4R8sVCqNRcFL1JcRDGjGZ+ir+VvTA1Z5a7FA+tpEFR
-TVt6wZH0ewDNd47anKFJadkbdnI2fVKLZ0AIGtiohB0LWMw4LWKmfi0BZkJQnL5E
-E1dvkM0oQx/KItkO+19ykTLivUyuy/cVPb3rLS4elmztxRSrjqTd3Ti7JB/FbK1X
-noso7i79L63k31j8tGL1nhMF+q+0trZXWv/1iQwD+8o6WnON02VmyOpVrWnoxRos
-BB7XpkDxkCreF5pU5yl5F8c9jYXyssfiyQM/37O3LLoivfzlgRC+3lW3glfO6ykt
-6tggEi5wm24ojmcrlhrL0qJvwaD/5x5aOgXtgbUu7IR7smyt+l4r0xQg3Z8fTBxb
-yn3FoVod97shg3X2Sq4Fo15N3TP53vRXQmVGXtwWwOPeFI0ro2aR3cjgURUrhYlm
-GpfS1Sv4FMsYLWqqhdr//TsL8WI71zUoLMTuYOeqB+hDQYkBsAQTAQoAGgQLCQgH
-AhUKAhYBAhkBBYJe573AAp4BApsDAAoJEK2fDwjoVe2Iu10L/1sI0nbA6GRc2BgA
-dRtCTLSg809Zn1CD+6Iju4o3conFYsmRri2sbP2yVx6yJyn0004TRwqNaSx6pGWc
-KLmjLDwc9WQ4CQ1FLrwxGFXs0DV3Mrgo2PuQsKzPDZ6sEh/RQutoa4aC94ShddQC
-ywJ5nu2vlqnU1uchERzuwRlvLzbC0yPVz7WXhNGxji4KNs2t9r079iiTYyRYZqic
-LQIHwsbmPIMo4/bqSrz3lPuft2ZZYILya/PSvfjmQC7Lz6HG/VE42yGg3iCQqMSI
-WZJrVkJBxrkAbad6vf/t/FYppDrlTGtYKck+jA0UFDXSAVHKAPdJO31K4oQ2igyA
-a6Db5a1AUo9Z4m9gJs/SC2+7JNusF/OR6+fLEMgOsuBgxNIIKdRGaJV2SW7wMGZY
-ywUOsJA0IXw5UvJvyn0uZ5pEMKgkw0J5mhLvZPmLqwNIvuFoVdLSkofA4wzP8AaO
-qr46XoZsbNfba1Rle6llEvuzUT7gjBmN4dkSbRORT9H7WcnXYbQwQXJhdmludGgg
-TWFuaXZhbm5hbiA8YXJhdmludGhyZWNlaXB0c0BnbWFpbC5jb20+iQGwBBMBCgAa
-BAsJCAcCFQoCFgECGQAFgl7jJtMCngECmwMACgkQrZ8PCOhV7YjJuQv9FIineflp
-Yxf+Qam6thJbjY4n6N5U48s5SKx35bkFCD9YlkDsGyhNx0aTSmMSHUNTbBov/l5/
-F4h7omCPVL1hSFjlzqttupsTaQKD76Z5qFRAcj2osOUOiieVOqRaCElUSERI45DA
-LIHiwAFSczJ5wpkQg2gGEbH7BBWBqceLPBbxrcb82QfiKR7jUg+lpXONVZd1Sbph
-VMocsPEX4mdetZNDZaodJ8nX8yEhOZGIuBrfQFpscyE3Ydg3JrZq+a+K32CKk1l6
-PxXfJJh48wKePt9NmezkcJ1Gw/ITZywlufXMQj8Sqfto1fLzkMsmCFt1T9VQ6HNR
-E4uw8QOSnHCnaRRPAbdFYY3rB0EIfqtM2WDV4M/4IVtVL4OGDQ9AmAp1R6j5W2Pz
-EPitMteTo/0L28aB5PbAxpA+P0RROHPpqqrHtbWZ03jF4ev8NBA8DE82GkNIJlio
-+MCs4QeSge1OcPAb8aMJ+7+KYOYlPDYFLb/1ubiVGcmmQjwhNIM6fo/YtCxBcmF2
-aW50aCBNYW5pdmFubmFuIDxhcmF2bnRoQHByb3Rvbm1haWwuY29tPokBsAQTAQoA
-GgQLCQgHAhUKAhYBAhkABYJe4ybTAp4BApsDAAoJEK2fDwjoVe2IdGAL/00PcW0k
-M2PqzJXogxWBELPTTaP4Yd4vEuGZfAoXlUsAFqmgqnM8GGEWnVA2Axr6f1i8IEV/
-vRgpEd9HBka8Uftv5luVU9SS9KXExALqfai19/R1AE0QNTAm/2ZsWAb6fWC1o9yQ
-l7HaBsX3DPtKYwwOJGwdbdStqRlH90T/+VoVLLVdrewo2Gk0k/37pExl0v04Wt3m
-JR1+Gh6nFDRDRlZkuX0EGLhWIoOn9F/HFpNElVwkuSIToTASTZhM+WgX2PxAyw9t
-Gb9u2vavvWrR0bnhlrn5kmnW8O633bzwL4WdnP0bhOhSH6l/rQob5QnEU4Ur4/HS
-F+yw8lCjF3gS7U3NlXgD3IMxBzKuAXgEF69NKYJEd4a2P3MWVRuy7eQz21v1dEot
-KuUsRbe5BU4Ya20nKU102Z63dIdRXi3Z1XazKmwSTPYaS/Rt1GUeU3cZ0b6u8DL4
-TgjfrEZXYp+4/UWVa6l+B44fmfiyBgialyZnhwluq56UeWr6t+NtPnuUcbQxQXJh
-dmludGggTWFuaXZhbm5hbiA8cmVhbGFyYXZpbnRoQHByb3Rvbm1haWwuY29uPokB
-sAQTAQoAGgQLCQgHAhUKAhYBAhkABYJe4ybTAp4BApsDAAoJEK2fDwjoVe2IV90M
-AL4u9dGEZcOY9HqPduqv+i/IWlY/ws3BSQyihR0HTobtWq0u/5Hti60HOqQ+Kenj
-9fVwzraEyub6BheajU86iqACKnkTSV32fQGe2ccnioLTNXsyPWTSI8iaJdJIJVhg
-5K+3bScKE/spjH38fQWtyy2myZyGZASj6DEjpbbKIqJBjcWNJ3/byXRmg94mfS1P
-H+hXZ3BbbhTklQ6iZS+X6B1tlvdEHd3I7zXDcT4nqUt0VqdSjX+ivfWYJqwkMDw4
-GmcACHqATurJMmFX+INFbdtM7IASpfCsHuVMoibifyb+YpGcS9IgB/qOfWmicCl8
-HvJ7hKV1MfZQtwSos63tbg3R37aQbSsebvfE+Vqs2vVUB1VkmYvDsqZQwy/ek+yB
-pvKP0gAUOoOziIfr3nxtKEEQwNuJkb9d+Ef3+cEPBdt8R+oQpiw194QPFDsLvXW6
-DoJzcJ8kt8V0JCEEkbkLa2NX9xZ89TqnVopaWd8IZueqR4eLAcgBorwDYpq13+ix
-dIkBnwQwAQoACQIdAAWCXuORlgAKCRCtnw8I6FXtiPrzDAC9m3dUOPwXTXv1qCst
-+Cd/h3mwlwKaGNbQkqP498vG4BNGeOmGkFl3TI17yaK7T1jCaxNmvnoX6b2IE+uO
-CCNq4t98dsvVw5M8K3SX9NRO6hUZRKq1l7/9MhsATpSus7jfJIkFs4++6MngHzA2
-F0fLcuVpeWNtp8kE4hPFQvvNl1kAQc0IQ+tzJeLG5j1K8BUX68HmiSj/ZzoYjNGc
-IF/XlXyJXnrtoId1SmFk8iBvmwkEfzs5uZNd/jqLoWj3JDgfxGBOzC8n+V5jlQAP
-7PHedw2TX+iCs2KDdSatbY09GXi1mTfYxqFmLlxSFeuB7GqerwpqmIR2n7iJxh1q
-O5121cR4xY1WR+LjTpGUJ3c0oKwbDi/RYq2KEzH5zt1Wz5rEq/Rch8coo+q0gn/n
-a3Ab6OB8Y4JJ8lFlM0oO0dInT3nmdFA9hxFtwLBlmZkmB0wtq1gM3uwTc1yMDknW
-iqVD7gRaw0audTs7c0OxopyI58e+5qdk9BWKwLIkpGHz13K0LEFyYXZpbnRoIE1h
-bml2YW5uYW4gPHJlYWxhcmF2aW50aEBnbWFpbC5jb20+iQGwBBMBCgAaBAsJCAcC
-FQoCFgECGQAFgl7jkZYCngECmwMACgkQrZ8PCOhV7YgayAv/dEbOEAbW2qGcT46Y
-PJe1mjNkc6ll4CER5Pa8armuM0a+XAKrKOyfejlN6vbKCe/yV8elGWau6P8D2QbF
-/dmm4yzm7qNiCND932e3skqloR8xu3jSfscc7tH07aZaxDtEa7f0na4/n/PYBHV9
-LQN/8OdeZbWSYtEQiX6iD5w5sw74wdOKZbPXgkJPOQ5dn5RFAsqvRfZiHWnHwQnT
-RbtBsWbQA2nCdPgm36Jd6L3WzLOg0OD8dS0xQKvApg4+zzYsemB+E0tevko4ywld
-nogdo83buiqh5Q3XlqK5SSlJtEVW5mF/kxxIGIzcpsalMvM5pmHxDquDM8+f6mE2
-AYHza0nBERvaeG8bJ7DvGAGlIz40aiy1LlSwqYSDy8sR813sAPBpxgoevUQ1hEQ/
-p1LtlRY/WANFuY3oOxSMQ1m1zG8E1yMiMfC+mQHxEkCONeOfYbk3k+/a0YOKepZq
-ixNf5XiUnEa6zWehtB9WEAWvDIqmJaF9k8Wt9UWgpfnx1LGbtDFBcmF2aW50aCBN
-YW5pdmFubmFuIDxyZWFsYXJhdmludGhAcHJvdG9ubWFpbC5jb20+iQGwBBMBCgAa
-BAsJCAcCFQoCFgECGQAFgl7jkZYCngECmwMACgkQrZ8PCOhV7YjxKgwAm4BThlJI
-JIcDFuqfDDQQEwRR3ZVIPw9hnO5Z2xQp+uJndMSVSKs31GddYW5M69ksjkm9kcLQ
-oTZc/z/paSIRjPc1RUTPSNwtjmP7LN1h4v9lHahQD++FnoA61vrwWPN74U1rhYPI
-8vs+0pKDcShHIikv0a9hz13VTQls7QWOnCDB3xtyVn1mCRQdTN4Nk6fNZL0WYVGP
-K5UhFOiXD2YC+9bxkp66bSyngriftCb4v/BONaNEydYYQLRcFje8S5oomdCUyHbX
-YhdIzucAK3nPfHITHNdjTSe1iE3mDOWmu04KM/BMIXtzv7T4/B0YaZ2MrrC+8kdE
-I2QtOKm4FpOvn1LK6ZopOzi5oB/Ffg5nGesBmP7CDxFVjo+z9Yyg3dnrzvD2OmZ0
-603m6z5PGs2q1bLDcPAU+cy7X0A5va98VvsqKybgeSjrNR61Jlp4iJdUXxmRML7J
-PRfq891t+saJDivhtvmpwShqILGv5qDBCqS2bYYdwFfqPTIBJtdIneWCuQGNBF7j
-JtMBDACbpNg346AJzKI2unuBlR2OtTKra7jtEJTxDSZg0HhiDz752gCguA2UV2Kl
-qmXhTycIwYD+gYyz0ly3l/dKyHDItF4DHRT7ba8+wQcnWyiGX7WZepIcj8KJfDvJ
-dTtpZUauPhNEPH0qZEFL9waOZIbFUdpv9zmcAJ/NAAVDFbn9NQlyKskbNrNMjA8u
-JnzYMN3fP1pNAJRJ5UX9aBsYONhagUBCSj6AdZc8YFENCz9ZznBNqjVyqHQyixA1
-5xLs715hgWA8BlKLOvowTWYGQUeVpzEaA05DBo33XnQzfDRb5JecC7vmLJld7RWs
-e3KrGTANskM1NffGnmBmujiQGXJiU5flzN0pCwPJexsZGXkd10Y3SKB7lrz/Sac0
-/L9ORSiGNre/rx7W0H+7vJwYSuZjI3gg5w9UADwLxMQ68Hu6zgSi/Y3hEdUbMcrn
-nbuZC7irjCtiXRuyQCWD6an/SFZsG6fnVfYVqcLb8GIb24uLMBnW+xX62aPaxszC
-eFkQpb0AEQEAAYkBnwQYAQoACQWCXuMm0wKbDAAKCRCtnw8I6FXtiC6xC/4xQqBq
-n1x53JxF938xiZMYxWXOELZk106/prs7F5/vM6XvZ+ZSnqa1/IrdUYjwXYRx27A0
-DkfFqXeREBQDxEWZlaNH615MGfF+tg1F/IN0ERI187sbezLhRFXf2srqyQh2WvHm
-htE+DVgnYhv+aqJxNxTPT0lpgu5M6bSWdj938mruLoyo/wFamWlokuZmHEf4uuV+
-Xc9ZaOWY0Q50vk675OXJyH8haaewt2aN28JS7dNY5ArohRj6r4spxrik5VfLtei1
-KcJGwB4O3/VbRh9OfzPqK/ZnYpWrrz2PDlqpcvJiXeFWEf4MIjbAEHte1YbAJ3CE
-yLhn0Ut5RSd7zCg8DMXTWdMr1hoUSshiF71F/Wxji1TN5vYZGGHykhjfeubl21dV
-NXxBvA5ABkcHzULubZWLB3QoKDP5DgEXB4cA7kMDryFPnN2shSdBsWt69g1E3gVo
-zKdOEDuIPIv4f7HhhCDCylGwfwqar5XJwnHQrBXLpwlTm4neDsnEOvOzyd8=
-=gpUQ
------END PGP PUBLIC KEY BLOCK-----
-
-

Edit this page on git.batsense.net

- -
-
- -
-
- - - - - - - - - diff --git a/sitemap.xml b/sitemap.xml index 6efdba3..bf38895 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -3,294 +3,294 @@ xmlns:xhtml="http://www.w3.org/1999/xhtml"> - //localhost:1313/blog/testing-on-screenreaders/ + /blog/testing-on-screenreaders/ 2024-02-12T18:21:49+05:30 weekly 0.5 - //localhost:1313/blog/introducing-mcaptcha-net/ + /blog/introducing-mcaptcha-net/ 2023-10-21T16:48:55+05:30 weekly 0.5 - //localhost:1313/blog/february-2023-monthly-report/ + /blog/february-2023-monthly-report/ 2023-03-09T02:30:43+05:30 weekly 0.5 - //localhost:1313/blog/july-2022-monthly-report/ + /blog/july-2022-monthly-report/ 2024-03-23T13:48:45+05:30 weekly 0.5 - //localhost:1313/blog/june-2022-monthly-report/ + /blog/june-2022-monthly-report/ 2022-07-07T20:05:57+05:30 weekly 0.5 - //localhost:1313/blog/may-2022-monthly-report/ + /blog/may-2022-monthly-report/ 2022-06-14T15:39:59+05:30 weekly 0.5 - //localhost:1313/blog/december-2021-monthly-report/ + /blog/december-2021-monthly-report/ 2022-06-14T15:39:59+05:30 weekly 0.5 - //localhost:1313/blog/survey/ + /blog/survey/ 2021-12-23T23:26:38+05:30 weekly 0.5 - //localhost:1313/blog/pow-performance/ + /blog/pow-performance/ 2021-09-01T15:33:12+05:30 weekly 0.5 - //localhost:1313/blog/say-hello-to-mcaptcha/ + /blog/say-hello-to-mcaptcha/ 2021-12-02T10:25:42+05:30 weekly 0.5 - //localhost:1313/docs/webmasters/installing-captcha/ + /docs/webmasters/installing-captcha/ 2024-03-23T13:53:02+05:30 weekly 0.5 - //localhost:1313/docs/webmasters/configuring-difficulty-factor/ + /docs/webmasters/configuring-difficulty-factor/ 2023-10-27T21:39:40+05:30 weekly 0.5 - //localhost:1313/docs/self-hosting/getting-started/ - 2023-12-09T03:43:25+05:30 + /docs/self-hosting/getting-started/ + 2024-09-12T18:38:08+05:30 weekly 0.5 - //localhost:1313/docs/self-hosting/bare-metal/ + /docs/self-hosting/bare-metal/ 2024-01-08T00:31:40+05:30 weekly 0.5 - //localhost:1313/docs/self-hosting/ansible/ + /docs/self-hosting/ansible/ 2023-12-09T03:43:25+05:30 weekly 0.5 - //localhost:1313/docs/self-hosting/docker/ + /docs/self-hosting/docker/ 2024-01-08T00:32:17+05:30 weekly 0.5 - //localhost:1313/docs/help/troubleshooting/ + /docs/help/troubleshooting/ 2022-08-01T22:24:30+05:30 weekly 0.5 - //localhost:1313/docs/api/browser/ + /docs/api/browser/ 2022-08-01T20:24:18+05:30 weekly 0.5 - //localhost:1313/docs/api/mcaptcha-system/ + /docs/api/mcaptcha-system/ 2022-08-01T20:24:18+05:30 weekly 0.5 - //localhost:1313/docs/api/pow-sha256/ + /docs/api/pow-sha256/ 2022-08-01T20:24:18+05:30 weekly 0.5 - //localhost:1313/docs/help/faq/ + /docs/help/faq/ 2022-08-01T19:16:21+05:30 weekly 0.5 - //localhost:1313/docs/user-manual/cli/ + /docs/user-manual/cli/ 2023-10-28T01:09:37+05:30 weekly 0.5 - //localhost:1313/docs/user-manual/how-to-mcaptcha-without-js/ + /docs/user-manual/how-to-mcaptcha-without-js/ 2023-10-28T03:16:49+05:30 weekly 0.5 - //localhost:1313/docs/user-manual/ + /docs/user-manual/ 2023-10-28T01:09:37+05:30 weekly 0.5 - //localhost:1313/docs/webmasters/terminology/ + /docs/webmasters/terminology/ 2023-10-27T21:39:40+05:30 weekly 0.5 - //localhost:1313/docs/webmasters/faq/ + /docs/webmasters/faq/ 2023-10-27T21:39:40+05:30 weekly 0.5 - //localhost:1313/about/ + /about/ 2023-05-29T16:01:44-04:00 weekly 0.5 - //localhost:1313/donate/ + /donate/ 2021-07-16T21:58:39+05:30 weekly 0.5 - //localhost:1313/contributors/aravinth-manivannan/ + /contributors/aravinth-manivannan/ 2021-05-26T14:18:41+05:30 weekly 0.5 - //localhost:1313/contributors/ + /contributors/ 2021-05-26T14:18:41+05:30 weekly 0.5 - //localhost:1313/privacy-policy/ + /privacy-policy/ 2021-05-27T19:15:04+05:30 weekly 0.5 - //localhost:1313/community/ + /community/ 2022-08-01T18:47:16+05:30 weekly 0.5 - //localhost:1313/security/ + /security/ 2021-05-27T19:15:04+05:30 weekly 0.5 - //localhost:1313/thanks/ + /thanks/ 2023-03-08T17:28:52+05:30 weekly 0.5 - //localhost:1313/ + / 2022-08-01T22:26:08+05:30 weekly 0.5 - //localhost:1313/docs/help/ + /docs/help/ 2021-07-21T15:49:53+05:30 weekly 0.5 - //localhost:1313/docs/webmasters/ + /docs/webmasters/ 2023-10-27T21:39:40+05:30 weekly 0.5 - //localhost:1313/docs/api/ + /docs/api/ 2022-08-01T22:24:03+05:30 weekly 0.5 - //localhost:1313/contact/ + /contact/ 2021-05-27T18:12:01+05:30 weekly 0.5 - //localhost:1313/blog/ + /blog/ 2021-05-26T14:18:41+05:30 weekly 0.5 - //localhost:1313/docs/ + /docs/ 2021-07-21T15:49:53+05:30 weekly 0.5 - //localhost:1313/docs/self-hosting/ + /docs/self-hosting/ 2023-10-27T21:39:40+05:30 weekly 0.5 diff --git a/thanks/index.html b/thanks/index.html deleted file mode 100644 index cb6dca4..0000000 --- a/thanks/index.html +++ /dev/null @@ -1,195 +0,0 @@ - - - - - - - - - - - - - - Thanks - mCaptcha - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
-
- -
- -
- -

Thanks

-

-

Funding

-

NLnet

-
- NLnet NGIZero logo -
-
-

2023 development is funded through the NGI0 Entrust -Fund, via NLnet. Please -see here for more details.

-

Free software libraries and tools

-

mCaptcha is built entirely using free software libraries tools. We are -grateful for all maintainers and contributors for their time and effort -in making them!

-

Creative Commons licensed artwork

-

mCaptcha shied logo is derived from this -photo captured by Paweł -Czerwiński. You can check out -their work at:

- - -

Edit this page on git.batsense.net

- -
-
- -
-
- - - - - - - - -