diff --git a/hrtcat/anonymity.html b/hrtcat/anonymity.html new file mode 100644 index 00000000..068a7da7 --- /dev/null +++ b/hrtcat/anonymity.html @@ -0,0 +1 @@ + Maintaining Anonymity | HRT Cat Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Maintaining Anonymity Online and In Person

Updated June 23, 2023

This article was written by request. It could be better. Please do your own homework and look far and wide for good info.

If anonymity was easy, more people would do it. The more anonymous you want to be, the more inconvenient everything you do becomes. As transgender people are further persecuted, and as the genocide against us picks up pace all around the world, the more dangerous it will be to operate in activist circles. Make no mistake, participating in DIY HRT, whether you brew, distribute, or just consume, is an act of political dissent and depending on your locale it may be punished as such. Just because something isn’t illegal today, doesn’t mean they won’t hold it against you next week when it is.

The Hitchhiker’s Guide to Online Anonymity is a project that is more researched and thorough than we could ever be here. They regularly update a roughly 500 page PDF with best practices on being fully anonymous online. We have a backup of v1.1.8-pre.1, published June 2023, located here.


Below here is some rough information that we threw together meant to be a high level overview of some of the rudimentary concepts we know. This is here below because we understand most people will not want to venture into a 500 page document.

It is of our opinion that you should protect yourself from anyone who may be snooping on your activities. This is a huge subject and we will focus just on high level points. This is all information that we have learned over time and unfortunately do not have any solid resources to recommend on where you can learn. Hopefully this is enough to get you started and googling the right info.

The intensity of your activity should determine the level of OPSEC (operations security) that you employ. For example, we see this website as a major risk to our personhoods: if the government wouldn’t punish us for it someone in a red hat surely would. Therefore, we strive for full anonymity around it. Only people who we directly partner with on it know this belongs to us, and the traces we leave around the internet largely cannot be tied back to us.

It is up to you to determine the risk level of your activity and what methods you want to employ to mitigate that risk.

Remember that, just like with sterilizing HRT vials, you want to avoid a single point of failure. Assuming a single thing you’re doing will protect you leaves you open for a single point of failure. Redundancy is key.

We’ll talk about protecting ourselves from two different straw men, cops and red hats. Cops represent anyone employed by or working on behalf of the government. Red hats are anyone who wishes to cause us harm because it’s their hobby.

Let’s talk about some tools

Your Phone

Do not allow your phone to be unlocked with biometrics. Once I was driving and our friend unlocked my phone with my face by shoving it in front of me. That was just to turn off our Sad Cat Girl Summer 2023 playlist, but it just as easily could have been a cop who wanted to read my texts. Cops can legally use your biometrics to get into your phone in some locales, and even if it’s against the law, since when has the law stopped the police?

Use a passcode to lock your phone. Now if a cop gets it they need a warrant to see what’s inside.

Location services should be off as much as possible.

Do not bring your phone to illegal actions. It’s always tracking you.

iPhones are likely more secure of devices than Android phones. We can infer this by looking at the business models of both Apple and Google. Apple makes their money selling hardware. Google makes their money selling data. If you’re able, opt to use an iPhone. Apple will still sell you out to the police, but we can assume they have stronger security practices because of their business model.

Signal

Signal is an end-to-end encrypted messaging app for both android and ios. Signal is open source and is evaluated by independent security researchers. WhatsApp will claim the same level of security, however we would STRONGLY advise against trusting that claim. Meta, the owners of WhatsApp, have a horrific trackrecord of boot licking.

If the encryption itself used in signal chats can be cracked, it’s only possible using equipment within the deepest of NSA black sites, and we guarantee they don’t give a fuck about us. Independent evaluation helps ensure there are no backdoors or zero-day exploits, though always keep auto-updates turned on so any vulnerabilities are patched ASAP.

Use Signal as an alternative to text messages or any sort of online chat app when you are talking about anything even remotely not in line with the law. Both you and the person you’re chatting with have to be on signal for it to work. Set disappearing messages if your topic is particularly sensitive. Set a pincode to get into signal.

Signal Calls

You can even place phone calls over the signal app that purport to be encrypted in the same way. Because it requires you to physically speak, it is inherently more dangerous to use than text. This is due to the possibility of malware on your phone recording you, Amazon Alexa listening, any other form of listening device, or even just someone who can overhear you through thin walls.

VPN (virtual private network)

A VPN obscures the websites your visiting from your ISP (internet service provider) and any cops that might also have access to that data. This is typically a software that you install on your computer that routes all your internet traffic through it.

When you route all your traffic through a single network you are simply relocating the point of failure. Now instead of your ISP and any cops they sanction watching your traffic, it’s the VPN and their cops. Therefore, you should have an exceptionally high level of trust in the VPN provider you choose. VPNs aren’t cheap to run. Never trust a free VPN, they are 100% selling your data.

Most VPNs are not trustworthy. They are often located in countries that have vast data sharing agreements with other countries.

We exclusively use ProtonVPN. Proton has a long proven track record of respecting user privacy, and is based in Switzerland, which has some of the most intense user privacy laws in the world.

Email

Speaking of ProtonVPN, use Proton Mail. They have super encryption on everything and, again, great privacy.

Gmail, Yahoo mail, AOL, whatever, any free email service, they’re ALL selling your data. They are ACTIVELY reading your email. Our gmail accounts only serve to get us access to essential google products. Nothing of consequence goes there.

Social Media

Social media include Instagram, Facebook, Reddit, Tumblr, Pintrest, YouTube, TikTok etc. etc.

Nothing we do that bares any consequence to our life goes on social media. We respect the folks who are using their name, face, and platform to advocate and educate about DIY HRT. They are doing something really important to get the word out about this. That said, we do not believe that there is long term safety in that. If the cops won’t get you for it then the red hats eventually will.

Even if the attack from red hats isn’t physical, we don’t need the anxiety in our life of someone doxing us on twitter because we’re trannies with a vast amount of knowledge about HRT.

Social media can also be used as a blueprint for piecing together parts of your life to help bad actors understand your story. By analyzing your posts people can learn much more than you realize.

Additionally, as with gmail and free vpns, when a great service is free, you’re paying with something else. Social media’s data harvesting practices are extreme. We don’t know how far they go, but we do know what they do goes far beyond what you do just on the apps. Limit your exposure as much as possible, especially around illegal or dissident activities.

Reddit is an important source for DIY info. You can make your account with a burner email over Tor if you need to comment and talk there without reddit being able to tie the account back to you. Don’t do anything sensitive on Reddit over your phone. All HRT Cat activity on reddit is done this way.

Tor/Tails/Dark Web

Tor: the onion routing network. Not to be confused with a VPN. When you are connected to tor, all your internet traffic is routed to multiple servers all around the globe in an effort to obscure the origin of the web traffic. Tor is an open source protocol used by journalists, activists, people doing super illegal shit, and also the CIA. Tor was originally invented by the US Navy. It is believed that the CIA operates a very significant portion of the Tor network in an effort to spy on those who use it. It’s impossible to substantiate those claims. Tor is how you access the Dark Web. You do not need the dark web for many activities regarding DIY HRT. However, Tor’s privacy protocol can be very useful for ensuring that the most sensitive part of your operation isn’t connected to you.

Tails: is an operating system that runs directly off of a flash drive. Tails is a version of linux that is 100% security focused. All internet traffic generated on Tails is automatically routed through Tor, no setup required. It has many other privacy features that make it the #1 choice for doing things you’re #notsupposedtobedoing. Tails doesn’t work great with Mac computers, we recommend a chromebook or a thinkpad to run it.

Dark Web: While Tor can grant you access to the dark web, you still have access to what is referred to at the “Clear Net” where you are still under some of Tor’s protections. The dark web can get you access to all sorts of shit, we like the website “tor taxi” for gaining access to the essentials. The dark net is not a safe place. You need to assume that everything there wants to scam you. Read the “dark net bible” for an intro on how OPSEC with tor works.

Cryptocurrency

If you are buying HRT or HRT raw powders online, especially testosterone, we recommend you purchase with cryptocurrency. We stick to using Monero as much as possible as it is substantially more anonymous than bitcoin or ethereum.

If you are selling HRT online, you should only be taking payments through crypto. There are payment providers who will facilitate this. We don’t sell online, but if we did, we would have strict rules in this regard.

Domain Names and Web Hosting

Again for if you’re selling online. We love Njalla. You can access them through Tor, pay in crypto, and give zero information to them. You can buy your domains and host both directly from them.

We get our domain from Njalla, however because this project doesn’t make money we decided to find a free hosting option. If we were selling HRT we would absolutely be hosted on Njalla.

More

More to come as we think of it. Please feel free to contribute.

diff --git a/hrtcat/assets/PDFs/HitchhikersGuide.pdf b/hrtcat/assets/PDFs/HitchhikersGuide.pdf new file mode 100644 index 00000000..1aeee77f Binary files /dev/null and b/hrtcat/assets/PDFs/HitchhikersGuide.pdf differ diff --git a/hrtcat/assets/PDFs/SyringeFilterChemicalCompatibility.pdf b/hrtcat/assets/PDFs/SyringeFilterChemicalCompatibility.pdf new file mode 100644 index 00000000..8c91a92f Binary files /dev/null and b/hrtcat/assets/PDFs/SyringeFilterChemicalCompatibility.pdf differ diff --git a/hrtcat/assets/PDFs/syringe_filter_selection.pdf b/hrtcat/assets/PDFs/syringe_filter_selection.pdf new file mode 100644 index 00000000..8ba73f63 Binary files /dev/null and b/hrtcat/assets/PDFs/syringe_filter_selection.pdf differ diff --git a/hrtcat/assets/css/just-the-docs-default.css b/hrtcat/assets/css/just-the-docs-default.css new file mode 100644 index 00000000..c04fc282 --- /dev/null +++ b/hrtcat/assets/css/just-the-docs-default.css @@ -0,0 +1,1805 @@ +@charset "UTF-8"; +.highlight, pre.highlight { background: #f9f9f9; color: #383942; } + +.highlight pre { background: #f9f9f9; } + +.highlight .hll { background: #f9f9f9; } + +.highlight .c { color: #9fa0a6; font-style: italic; } + +.highlight .err { color: #fff; background-color: #e05151; } + +.highlight .k { color: #a625a4; } + +.highlight .l { color: #50a04f; } + +.highlight .n { color: #383942; } + +.highlight .o { color: #383942; } + +.highlight .p { color: #383942; } + +.highlight .cm { color: #9fa0a6; font-style: italic; } + +.highlight .cp { color: #9fa0a6; font-style: italic; } + +.highlight .c1 { color: #9fa0a6; font-style: italic; } + +.highlight .cs { color: #9fa0a6; font-style: italic; } + +.highlight .ge { font-style: italic; } + +.highlight .gs { font-weight: 700; } + +.highlight .kc { color: #a625a4; } + +.highlight .kd { color: #a625a4; } + +.highlight .kn { color: #a625a4; } + +.highlight .kp { color: #a625a4; } + +.highlight .kr { color: #a625a4; } + +.highlight .kt { color: #a625a4; } + +.highlight .ld { color: #50a04f; } + +.highlight .m { color: #b66a00; } + +.highlight .s { color: #50a04f; } + +.highlight .na { color: #b66a00; } + +.highlight .nb { color: #ca7601; } + +.highlight .nc { color: #ca7601; } + +.highlight .no { color: #ca7601; } + +.highlight .nd { color: #ca7601; } + +.highlight .ni { color: #ca7601; } + +.highlight .ne { color: #ca7601; } + +.highlight .nf { color: #383942; } + +.highlight .nl { color: #ca7601; } + +.highlight .nn { color: #383942; } + +.highlight .nx { color: #383942; } + +.highlight .py { color: #ca7601; } + +.highlight .nt { color: #e35549; } + +.highlight .nv { color: #ca7601; } + +.highlight .ow { font-weight: 700; } + +.highlight .w { color: #f8f8f2; } + +.highlight .mf { color: #b66a00; } + +.highlight .mh { color: #b66a00; } + +.highlight .mi { color: #b66a00; } + +.highlight .mo { color: #b66a00; } + +.highlight .sb { color: #50a04f; } + +.highlight .sc { color: #50a04f; } + +.highlight .sd { color: #50a04f; } + +.highlight .s2 { color: #50a04f; } + +.highlight .se { color: #50a04f; } + +.highlight .sh { color: #50a04f; } + +.highlight .si { color: #50a04f; } + +.highlight .sx { color: #50a04f; } + +.highlight .sr { color: #0083bb; } + +.highlight .s1 { color: #50a04f; } + +.highlight .ss { color: #0083bb; } + +.highlight .bp { color: #ca7601; } + +.highlight .vc { color: #ca7601; } + +.highlight .vg { color: #ca7601; } + +.highlight .vi { color: #e35549; } + +.highlight .il { color: #b66a00; } + +.highlight .gu { color: #75715e; } + +.highlight .gd { color: #e05151; } + +.highlight .gi { color: #43d089; } + +.highlight ::selection { background-color: #fff; } + +.highlight .language-json .w + .s2 { color: #e35549; } + +.highlight .language-json .kc { color: #0083bb; } + +.highlight, pre.highlight { background: #31343f; color: #dee2f7; } + +.highlight pre { background: #31343f; } + +.highlight .hll { background: #31343f; } + +.highlight .c { color: #63677e; font-style: italic; } + +.highlight .err { color: #960050; background-color: #1e0010; } + +.highlight .k { color: #e19ef5; } + +.highlight .l { color: #a3eea0; } + +.highlight .n { color: #dee2f7; } + +.highlight .o { color: #dee2f7; } + +.highlight .p { color: #dee2f7; } + +.highlight .cm { color: #63677e; font-style: italic; } + +.highlight .cp { color: #63677e; font-style: italic; } + +.highlight .c1 { color: #63677e; font-style: italic; } + +.highlight .cs { color: #63677e; font-style: italic; } + +.highlight .ge { font-style: italic; } + +.highlight .gs { font-weight: 700; } + +.highlight .kc { color: #e19ef5; } + +.highlight .kd { color: #e19ef5; } + +.highlight .kn { color: #e19ef5; } + +.highlight .kp { color: #e19ef5; } + +.highlight .kr { color: #e19ef5; } + +.highlight .kt { color: #e19ef5; } + +.highlight .ld { color: #a3eea0; } + +.highlight .m { color: #eddc96; } + +.highlight .s { color: #a3eea0; } + +.highlight .na { color: #eddc96; } + +.highlight .nb { color: #fdce68; } + +.highlight .nc { color: #fdce68; } + +.highlight .no { color: #fdce68; } + +.highlight .nd { color: #fdce68; } + +.highlight .ni { color: #fdce68; } + +.highlight .ne { color: #fdce68; } + +.highlight .nf { color: #dee2f7; } + +.highlight .nl { color: #fdce68; } + +.highlight .nn { color: #dee2f7; } + +.highlight .nx { color: #dee2f7; } + +.highlight .py { color: #fdce68; } + +.highlight .nt { color: #f9867b; } + +.highlight .nv { color: #fdce68; } + +.highlight .ow { font-weight: 700; } + +.highlight .w { color: #f8f8f2; } + +.highlight .mf { color: #eddc96; } + +.highlight .mh { color: #eddc96; } + +.highlight .mi { color: #eddc96; } + +.highlight .mo { color: #eddc96; } + +.highlight .sb { color: #a3eea0; } + +.highlight .sc { color: #a3eea0; } + +.highlight .sd { color: #a3eea0; } + +.highlight .s2 { color: #a3eea0; } + +.highlight .se { color: #a3eea0; } + +.highlight .sh { color: #a3eea0; } + +.highlight .si { color: #a3eea0; } + +.highlight .sx { color: #a3eea0; } + +.highlight .sr { color: #7be2f9; } + +.highlight .s1 { color: #a3eea0; } + +.highlight .ss { color: #7be2f9; } + +.highlight .bp { color: #fdce68; } + +.highlight .vc { color: #fdce68; } + +.highlight .vg { color: #fdce68; } + +.highlight .vi { color: #f9867b; } + +.highlight .il { color: #eddc96; } + +.highlight .gu { color: #75715e; } + +.highlight .gd { color: #f92672; } + +.highlight .gi { color: #a6e22e; } + +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ +/* Document ========================================================================== */ +/** 1. Correct the line height in all browsers. 2. Prevent adjustments of font size after orientation changes in iOS. */ +html { line-height: 1.15; /* 1 */ -webkit-text-size-adjust: 100%; /* 2 */ } + +/* Sections ========================================================================== */ +/** Remove the margin in all browsers. */ +body { margin: 0; } + +/** Render the `main` element consistently in IE. */ +main { display: block; } + +/** Correct the font size and margin on `h1` elements within `section` and `article` contexts in Chrome, Firefox, and Safari. */ +h1 { font-size: 2em; margin: 0.67em 0; } + +/* Grouping content ========================================================================== */ +/** 1. Add the correct box sizing in Firefox. 2. Show the overflow in Edge and IE. */ +hr { box-sizing: content-box; /* 1 */ height: 0; /* 1 */ overflow: visible; /* 2 */ } + +/** 1. Correct the inheritance and scaling of font size in all browsers. 2. Correct the odd `em` font sizing in all browsers. */ +pre { font-family: monospace, monospace; /* 1 */ font-size: 1em; /* 2 */ } + +/* Text-level semantics ========================================================================== */ +/** Remove the gray background on active links in IE 10. */ +a { background-color: transparent; } + +/** 1. Remove the bottom border in Chrome 57- 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. */ +abbr[title] { border-bottom: none; /* 1 */ text-decoration: underline; /* 2 */ text-decoration: underline dotted; /* 2 */ } + +/** Add the correct font weight in Chrome, Edge, and Safari. */ +b, strong { font-weight: bolder; } + +/** 1. Correct the inheritance and scaling of font size in all browsers. 2. Correct the odd `em` font sizing in all browsers. */ +code, kbd, samp { font-family: monospace, monospace; /* 1 */ font-size: 1em; /* 2 */ } + +/** Add the correct font size in all browsers. */ +small { font-size: 80%; } + +/** Prevent `sub` and `sup` elements from affecting the line height in all browsers. */ +sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; } + +sub { bottom: -0.25em; } + +sup { top: -0.5em; } + +/* Embedded content ========================================================================== */ +/** Remove the border on images inside links in IE 10. */ +img { border-style: none; } + +/* Forms ========================================================================== */ +/** 1. Change the font styles in all browsers. 2. Remove the margin in Firefox and Safari. */ +button, input, optgroup, select, textarea { font-family: inherit; /* 1 */ font-size: 100%; /* 1 */ line-height: 1.15; /* 1 */ margin: 0; /* 2 */ } + +/** Show the overflow in IE. 1. Show the overflow in Edge. */ +button, input { /* 1 */ overflow: visible; } + +/** Remove the inheritance of text transform in Edge, Firefox, and IE. 1. Remove the inheritance of text transform in Firefox. */ +button, select { /* 1 */ text-transform: none; } + +/** Correct the inability to style clickable types in iOS and Safari. */ +button, [type="button"], [type="reset"], [type="submit"] { -webkit-appearance: button; } + +/** Remove the inner border and padding in Firefox. */ +button::-moz-focus-inner, [type="button"]::-moz-focus-inner, [type="reset"]::-moz-focus-inner, [type="submit"]::-moz-focus-inner { border-style: none; padding: 0; } + +/** Restore the focus styles unset by the previous rule. */ +button:-moz-focusring, [type="button"]:-moz-focusring, [type="reset"]:-moz-focusring, [type="submit"]:-moz-focusring { outline: 1px dotted ButtonText; } + +/** Correct the padding in Firefox. */ +fieldset { padding: 0.35em 0.75em 0.625em; } + +/** 1. Correct the text wrapping in Edge and IE. 2. Correct the color inheritance from `fieldset` elements in IE. 3. Remove the padding so developers are not caught out when they zero out `fieldset` elements in all browsers. */ +legend { box-sizing: border-box; /* 1 */ color: inherit; /* 2 */ display: table; /* 1 */ max-width: 100%; /* 1 */ padding: 0; /* 3 */ white-space: normal; /* 1 */ } + +/** Add the correct vertical alignment in Chrome, Firefox, and Opera. */ +progress { vertical-align: baseline; } + +/** Remove the default vertical scrollbar in IE 10+. */ +textarea { overflow: auto; } + +/** 1. Add the correct box sizing in IE 10. 2. Remove the padding in IE 10. */ +[type="checkbox"], [type="radio"] { box-sizing: border-box; /* 1 */ padding: 0; /* 2 */ } + +/** Correct the cursor style of increment and decrement buttons in Chrome. */ +[type="number"]::-webkit-inner-spin-button, [type="number"]::-webkit-outer-spin-button { height: auto; } + +/** 1. Correct the odd appearance in Chrome and Safari. 2. Correct the outline style in Safari. */ +[type="search"] { -webkit-appearance: textfield; /* 1 */ outline-offset: -2px; /* 2 */ } + +/** Remove the inner padding in Chrome and Safari on macOS. */ +[type="search"]::-webkit-search-decoration { -webkit-appearance: none; } + +/** 1. Correct the inability to style clickable types in iOS and Safari. 2. Change font properties to `inherit` in Safari. */ +::-webkit-file-upload-button { -webkit-appearance: button; /* 1 */ font: inherit; /* 2 */ } + +/* Interactive ========================================================================== */ +/* Add the correct display in Edge, IE 10+, and Firefox. */ +details { display: block; } + +/* Add the correct display in all browsers. */ +summary { display: list-item; } + +/* Misc ========================================================================== */ +/** Add the correct display in IE 10+. */ +template { display: none; } + +/** Add the correct display in IE 10. */ +[hidden] { display: none; } + +* { box-sizing: border-box; } + +::selection { color: #fff; background: #2c84fa; } + +html { font-size: 14px !important; scroll-behavior: smooth; } + +@media (min-width: 31.25rem) { html { font-size: 16px !important; } } + +body { font-family: system-ui, -apple-system, blinkmacsystemfont, "Segoe UI", roboto, "Helvetica Neue", arial, sans-serif; font-size: inherit; line-height: 1.4; color: #e6e1e8; background-color: #27262b; overflow-wrap: break-word; } + +ol, ul, dl, pre, address, blockquote, table, div, hr, form, fieldset, noscript .table-wrapper { margin-top: 0; } + +h1, h2, h3, h4, h5, h6, #toctitle { margin-top: 0; margin-bottom: 1em; font-weight: 500; line-height: 1.25; color: #f5f6fa; } + +p { margin-top: 1em; margin-bottom: 1em; } + +a { color: #2c84fa; text-decoration: none; } + +a:not([class]) { text-decoration: underline; text-decoration-color: #44434d; text-underline-offset: 2px; } + +a:not([class]):hover { text-decoration-color: rgba(44, 132, 250, 0.45); } + +code { font-family: "SFMono-Regular", menlo, consolas, monospace; font-size: 0.75em; line-height: 1.4; } + +figure, pre { margin: 0; } + +li { margin: 0.25em 0; } + +img { max-width: 100%; height: auto; } + +hr { height: 1px; padding: 0; margin: 2rem 0; background-color: #44434d; border: 0; } + +blockquote { margin: 10px 0; margin-block-start: 0; margin-inline-start: 0; padding-left: 15px; border-left: 3px solid #44434d; } + +.side-bar { z-index: 0; display: flex; flex-wrap: wrap; background-color: #27262b; } + +@media (min-width: 50rem) { .side-bar { flex-flow: column nowrap; position: fixed; width: 248px; height: 100%; border-right: 1px solid #44434d; align-items: flex-end; } } + +@media (min-width: 66.5rem) { .side-bar { width: calc((100% - 1064px) / 2 + 264px); min-width: 264px; } } + +@media (min-width: 50rem) { .main { position: relative; max-width: 800px; margin-left: 248px; } } + +@media (min-width: 66.5rem) { .main { margin-left: Max(264px, calc((100% - 1064px) / 2 + 264px)); } } + +.main-content-wrap { padding-right: 1rem; padding-left: 1rem; padding-top: 1rem; padding-bottom: 1rem; } + +@media (min-width: 50rem) { .main-content-wrap { padding-right: 2rem; padding-left: 2rem; } } + +@media (min-width: 50rem) { .main-content-wrap { padding-top: 2rem; padding-bottom: 2rem; } } + +.main-header { z-index: 0; display: none; background-color: #27262b; } + +@media (min-width: 50rem) { .main-header { display: flex; justify-content: space-between; height: 60px; background-color: #27262b; border-bottom: 1px solid #44434d; } } + +.main-header.nav-open { display: block; } + +@media (min-width: 50rem) { .main-header.nav-open { display: flex; } } + +.site-nav, .site-header, .site-footer { width: 100%; } + +@media (min-width: 66.5rem) { .site-nav, .site-header, .site-footer { width: 264px; } } + +.site-nav { display: none; } + +.site-nav.nav-open { display: block; } + +@media (min-width: 50rem) { .site-nav { display: block; padding-top: 3rem; padding-bottom: 1rem; overflow-y: auto; flex: 1 1 auto; } } + +.site-header { display: flex; min-height: 60px; align-items: center; } + +@media (min-width: 50rem) { .site-header { height: 60px; max-height: 60px; border-bottom: 1px solid #44434d; } } + +.site-title { padding-right: 1rem; padding-left: 1rem; flex-grow: 1; display: flex; height: 100%; align-items: center; padding-top: 0.75rem; padding-bottom: 0.75rem; color: #f5f6fa; font-size: 18px !important; } + +@media (min-width: 50rem) { .site-title { padding-right: 2rem; padding-left: 2rem; } } + +@media (min-width: 31.25rem) { .site-title { font-size: 24px !important; line-height: 1.25; } } + +@media (min-width: 50rem) { .site-title { padding-top: 0.5rem; padding-bottom: 0.5rem; } } + +.site-logo { width: 100%; height: 100%; background-image: url("../images/trickster.png"); background-repeat: no-repeat; background-position: left center; background-size: contain; } + +.site-button { display: flex; height: 100%; padding: 1rem; align-items: center; } + +@media (min-width: 50rem) { .site-header .site-button { display: none; } } + +.site-title:hover { background-image: linear-gradient(-90deg, #201f23 0%, rgba(32, 31, 35, 0.8) 80%, rgba(32, 31, 35, 0) 100%); } + +.site-button:hover { background-image: linear-gradient(-90deg, #201f23 0%, rgba(32, 31, 35, 0.8) 100%); } + +body { position: relative; padding-bottom: 4rem; overflow-y: scroll; } + +@media (min-width: 50rem) { body { position: static; padding-bottom: 0; } } + +.site-footer { padding-right: 1rem; padding-left: 1rem; position: absolute; bottom: 0; left: 0; padding-top: 1rem; padding-bottom: 1rem; color: #959396; font-size: 11px !important; } + +@media (min-width: 50rem) { .site-footer { padding-right: 2rem; padding-left: 2rem; } } + +@media (min-width: 31.25rem) { .site-footer { font-size: 12px !important; } } + +@media (min-width: 50rem) { .site-footer { position: static; justify-self: end; } } + +.icon { width: 1.5rem; height: 1.5rem; color: #2c84fa; } + +.main-content { line-height: 1.6; } + +.main-content ol, .main-content ul, .main-content dl, .main-content pre, .main-content address, .main-content blockquote, .main-content .table-wrapper { margin-top: 0.5em; } + +.main-content a { overflow: hidden; text-overflow: ellipsis; } + +.main-content ul, .main-content ol { padding-left: 1.5em; } + +.main-content li .highlight { margin-top: 0.25rem; } + +.main-content ol { list-style-type: none; counter-reset: step-counter; } + +.main-content ol > li { position: relative; } + +.main-content ol > li::before { position: absolute; top: 0.2em; left: -1.6em; color: #959396; content: counter(step-counter); counter-increment: step-counter; font-size: 12px !important; } + +@media (min-width: 31.25rem) { .main-content ol > li::before { font-size: 14px !important; } } + +@media (min-width: 31.25rem) { .main-content ol > li::before { top: 0.11em; } } + +.main-content ol > li ol { counter-reset: sub-counter; } + +.main-content ol > li ol > li::before { content: counter(sub-counter, lower-alpha); counter-increment: sub-counter; } + +.main-content ul { list-style: none; } + +.main-content ul > li::before { position: absolute; margin-left: -1.4em; color: #959396; content: "•"; } + +.main-content .task-list-item::before { content: ""; } + +.main-content .task-list-item-checkbox { margin-right: 0.6em; margin-left: -1.4em; } + +.main-content hr + * { margin-top: 0; } + +.main-content h1:first-of-type { margin-top: 0.5em; } + +.main-content dl { display: grid; grid-template: auto / 10em 1fr; } + +.main-content dt, .main-content dd { margin: 0.25em 0; } + +.main-content dt { grid-column: 1; font-weight: 500; text-align: right; } + +.main-content dt::after { content: ":"; } + +.main-content dd { grid-column: 2; margin-bottom: 0; margin-left: 1em; } + +.main-content dd blockquote:first-child, .main-content dd div:first-child, .main-content dd dl:first-child, .main-content dd dt:first-child, .main-content dd h1:first-child, .main-content dd h2:first-child, .main-content dd h3:first-child, .main-content dd h4:first-child, .main-content dd h5:first-child, .main-content dd h6:first-child, .main-content dd li:first-child, .main-content dd ol:first-child, .main-content dd p:first-child, .main-content dd pre:first-child, .main-content dd table:first-child, .main-content dd ul:first-child, .main-content dd .table-wrapper:first-child { margin-top: 0; } + +.main-content dd dl:first-child dt:first-child, .main-content dd dl:first-child dd:nth-child(2), .main-content ol dl:first-child dt:first-child, .main-content ol dl:first-child dd:nth-child(2), .main-content ul dl:first-child dt:first-child, .main-content ul dl:first-child dd:nth-child(2) { margin-top: 0; } + +.main-content .anchor-heading { position: absolute; right: -1rem; width: 1.5rem; height: 100%; padding-right: 0.25rem; padding-left: 0.25rem; overflow: visible; } + +@media (min-width: 50rem) { .main-content .anchor-heading { right: auto; left: -1.5rem; } } + +.main-content .anchor-heading svg { display: inline-block; width: 100%; height: 100%; color: #2c84fa; visibility: hidden; } + +.main-content .anchor-heading:hover svg, .main-content .anchor-heading:focus svg, .main-content h1:hover > .anchor-heading svg, .main-content h2:hover > .anchor-heading svg, .main-content h3:hover > .anchor-heading svg, .main-content h4:hover > .anchor-heading svg, .main-content h5:hover > .anchor-heading svg, .main-content h6:hover > .anchor-heading svg { visibility: visible; } + +.main-content summary { cursor: pointer; } + +.main-content h1, .main-content h2, .main-content h3, .main-content h4, .main-content h5, .main-content h6, .main-content #toctitle { position: relative; margin-top: 1.5em; margin-bottom: 0.25em; } + +.main-content h1 + table, .main-content h1 + .table-wrapper, .main-content h1 + .code-example, .main-content h1 + .highlighter-rouge, .main-content h1 + .sectionbody .listingblock, .main-content h2 + table, .main-content h2 + .table-wrapper, .main-content h2 + .code-example, .main-content h2 + .highlighter-rouge, .main-content h2 + .sectionbody .listingblock, .main-content h3 + table, .main-content h3 + .table-wrapper, .main-content h3 + .code-example, .main-content h3 + .highlighter-rouge, .main-content h3 + .sectionbody .listingblock, .main-content h4 + table, .main-content h4 + .table-wrapper, .main-content h4 + .code-example, .main-content h4 + .highlighter-rouge, .main-content h4 + .sectionbody .listingblock, .main-content h5 + table, .main-content h5 + .table-wrapper, .main-content h5 + .code-example, .main-content h5 + .highlighter-rouge, .main-content h5 + .sectionbody .listingblock, .main-content h6 + table, .main-content h6 + .table-wrapper, .main-content h6 + .code-example, .main-content h6 + .highlighter-rouge, .main-content h6 + .sectionbody .listingblock, .main-content #toctitle + table, .main-content #toctitle + .table-wrapper, .main-content #toctitle + .code-example, .main-content #toctitle + .highlighter-rouge, .main-content #toctitle + .sectionbody .listingblock { margin-top: 1em; } + +.main-content h1 + p:not(.label), .main-content h2 + p:not(.label), .main-content h3 + p:not(.label), .main-content h4 + p:not(.label), .main-content h5 + p:not(.label), .main-content h6 + p:not(.label), .main-content #toctitle + p:not(.label) { margin-top: 0; } + +.main-content > h1:first-child, .main-content > h2:first-child, .main-content > h3:first-child, .main-content > h4:first-child, .main-content > h5:first-child, .main-content > h6:first-child, .main-content > .sect1:first-child > h2, .main-content > .sect2:first-child > h3, .main-content > .sect3:first-child > h4, .main-content > .sect4:first-child > h5, .main-content > .sect5:first-child > h6 { margin-top: 0.5rem; } + +.nav-list { padding: 0; margin-top: 0; margin-bottom: 0; list-style: none; } + +.nav-list .nav-list-item { font-size: 14px !important; position: relative; margin: 0; } + +@media (min-width: 31.25rem) { .nav-list .nav-list-item { font-size: 16px !important; } } + +@media (min-width: 50rem) { .nav-list .nav-list-item { font-size: 12px !important; } } + +@media (min-width: 50rem) and (min-width: 31.25rem) { .nav-list .nav-list-item { font-size: 14px !important; } } + +.nav-list .nav-list-item .nav-list-link { display: block; min-height: 3rem; padding-top: 0.25rem; padding-bottom: 0.25rem; line-height: 2.5rem; padding-right: 3rem; padding-left: 1rem; } + +@media (min-width: 50rem) { .nav-list .nav-list-item .nav-list-link { min-height: 2rem; line-height: 1.5rem; padding-right: 2rem; padding-left: 2rem; } } + +.nav-list .nav-list-item .nav-list-link.external > svg { width: 1rem; height: 1rem; vertical-align: text-bottom; } + +.nav-list .nav-list-item .nav-list-link.active { font-weight: 600; text-decoration: none; } + +.nav-list .nav-list-item .nav-list-link:hover, .nav-list .nav-list-item .nav-list-link.active { background-image: linear-gradient(-90deg, #201f23 0%, rgba(32, 31, 35, 0.8) 80%, rgba(32, 31, 35, 0) 100%); } + +.nav-list .nav-list-item .nav-list-expander { position: absolute; right: 0; width: 3rem; height: 3rem; padding: 0.75rem; color: #2c84fa; } + +@media (min-width: 50rem) { .nav-list .nav-list-item .nav-list-expander { width: 2rem; height: 2rem; padding: 0.5rem; } } + +.nav-list .nav-list-item .nav-list-expander:hover { background-image: linear-gradient(-90deg, #201f23 0%, rgba(32, 31, 35, 0.8) 100%); } + +.nav-list .nav-list-item .nav-list-expander svg { transform: rotate(90deg); } + +.nav-list .nav-list-item > .nav-list { display: none; padding-left: 0.75rem; list-style: none; } + +.nav-list .nav-list-item > .nav-list .nav-list-item { position: relative; } + +.nav-list .nav-list-item > .nav-list .nav-list-item .nav-list-link { color: #959396; } + +.nav-list .nav-list-item > .nav-list .nav-list-item .nav-list-expander { color: #959396; } + +.nav-list .nav-list-item.active > .nav-list-expander svg { transform: rotate(-90deg); } + +.nav-list .nav-list-item.active > .nav-list { display: block; } + +.nav-category { padding: 0.5rem 1rem; font-weight: 600; text-align: start; text-transform: uppercase; border-bottom: 1px solid #44434d; font-size: 11px !important; } + +@media (min-width: 31.25rem) { .nav-category { font-size: 12px !important; } } + +@media (min-width: 50rem) { .nav-category { padding: 0.5rem 2rem; margin-top: 1rem; text-align: start; } .nav-category:first-child { margin-top: 0; } } + +.nav-list.nav-category-list > .nav-list-item { margin: 0; } + +.nav-list.nav-category-list > .nav-list-item > .nav-list { padding: 0; } + +.nav-list.nav-category-list > .nav-list-item > .nav-list > .nav-list-item > .nav-list-link { color: #2c84fa; } + +.nav-list.nav-category-list > .nav-list-item > .nav-list > .nav-list-item > .nav-list-expander { color: #2c84fa; } + +.aux-nav { height: 100%; overflow-x: auto; font-size: 11px !important; } + +@media (min-width: 31.25rem) { .aux-nav { font-size: 12px !important; } } + +.aux-nav .aux-nav-list { display: flex; height: 100%; padding: 0; margin: 0; list-style: none; } + +.aux-nav .aux-nav-list-item { display: inline-block; height: 100%; padding: 0; margin: 0; } + +@media (min-width: 50rem) { .aux-nav { padding-right: 1rem; } } + +@media (min-width: 50rem) { .breadcrumb-nav { margin-top: -1rem; } } + +.breadcrumb-nav-list { padding-left: 0; margin-bottom: 0.75rem; list-style: none; } + +.breadcrumb-nav-list-item { display: table-cell; font-size: 11px !important; } + +@media (min-width: 31.25rem) { .breadcrumb-nav-list-item { font-size: 12px !important; } } + +.breadcrumb-nav-list-item::before { display: none; } + +.breadcrumb-nav-list-item::after { display: inline-block; margin-right: 0.5rem; margin-left: 0.5rem; color: #959396; content: "/"; } + +.breadcrumb-nav-list-item:last-child::after { content: ""; } + +h1, .text-alpha { font-size: 32px !important; line-height: 1.25; font-weight: 300; } + +@media (min-width: 31.25rem) { h1, .text-alpha { font-size: 36px !important; } } + +h2, .text-beta, #toctitle { font-size: 18px !important; } + +@media (min-width: 31.25rem) { h2, .text-beta, #toctitle { font-size: 24px !important; line-height: 1.25; } } + +h3, .text-gamma { font-size: 16px !important; } + +@media (min-width: 31.25rem) { h3, .text-gamma { font-size: 18px !important; } } + +h4, .text-delta { font-size: 11px !important; font-weight: 400; text-transform: uppercase; letter-spacing: 0.1em; } + +@media (min-width: 31.25rem) { h4, .text-delta { font-size: 12px !important; } } + +h4 code { text-transform: none; } + +h5, .text-epsilon { font-size: 12px !important; } + +@media (min-width: 31.25rem) { h5, .text-epsilon { font-size: 14px !important; } } + +h6, .text-zeta { font-size: 11px !important; } + +@media (min-width: 31.25rem) { h6, .text-zeta { font-size: 12px !important; } } + +.text-small { font-size: 11px !important; } + +@media (min-width: 31.25rem) { .text-small { font-size: 12px !important; } } + +.text-mono { font-family: "SFMono-Regular", menlo, consolas, monospace !important; } + +.text-left { text-align: left !important; } + +.text-center { text-align: center !important; } + +.text-right { text-align: right !important; } + +.label, .label-blue { display: inline-block; padding: 0.16em 0.56em; margin-right: 0.5rem; margin-left: 0.5rem; color: #fff; text-transform: uppercase; vertical-align: middle; background-color: #2869e6; font-size: 11px !important; border-radius: 12px; } + +@media (min-width: 31.25rem) { .label, .label-blue { font-size: 12px !important; } } + +.label-green { background-color: #009c7b; } + +.label-purple { background-color: #5e41d0; } + +.label-red { background-color: #e94c4c; } + +.label-yellow { color: #44434d; background-color: #f7d12e; } + +.btn { display: inline-block; box-sizing: border-box; padding: 0.3em 1em; margin: 0; font-family: inherit; font-size: inherit; font-weight: 500; line-height: 1.5; color: #2c84fa; text-decoration: none; vertical-align: baseline; cursor: pointer; background-color: #302d36; border-width: 0; border-radius: 4px; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08); appearance: none; } + +.btn:focus { text-decoration: none; outline: none; box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.25); } + +.btn:focus:hover, .btn.selected:focus { box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.25); } + +.btn:hover, .btn.zeroclipboard-is-hover { color: #227efa; } + +.btn:hover, .btn:active, .btn.zeroclipboard-is-hover, .btn.zeroclipboard-is-active { text-decoration: none; background-color: #2e2b33; } + +.btn:active, .btn.selected, .btn.zeroclipboard-is-active { background-color: #29262e; background-image: none; box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15); } + +.btn.selected:hover { background-color: #cfcfcf; } + +.btn:disabled, .btn:disabled:hover, .btn.disabled, .btn.disabled:hover { color: rgba(102, 102, 102, 0.5); cursor: default; background-color: rgba(229, 229, 229, 0.5); background-image: none; box-shadow: none; } + +.btn-outline { color: #2c84fa; background: transparent; box-shadow: inset 0 0 0 2px #e6e1e8; } + +.btn-outline:hover, .btn-outline:active, .btn-outline.zeroclipboard-is-hover, .btn-outline.zeroclipboard-is-active { color: #1878fa; text-decoration: none; background-color: transparent; box-shadow: inset 0 0 0 3px #e6e1e8; } + +.btn-outline:focus { text-decoration: none; outline: none; box-shadow: inset 0 0 0 2px #5c5962, 0 0 0 3px rgba(0, 0, 255, 0.25); } + +.btn-outline:focus:hover, .btn-outline.selected:focus { box-shadow: inset 0 0 0 2px #5c5962; } + +.btn-primary { color: #fff; background-color: #2448a7; background-image: linear-gradient(#2b55c4, #2448a7); box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), 0 4px 10px rgba(0, 0, 0, 0.12); } + +.btn-primary:hover, .btn-primary.zeroclipboard-is-hover { color: #fff; background-color: #22459e; background-image: linear-gradient(#2850b7, #22459e); } + +.btn-primary:active, .btn-primary.selected, .btn-primary.zeroclipboard-is-active { background-color: #21439a; background-image: none; box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15); } + +.btn-primary.selected:hover { background-color: #1d3a85; } + +.btn-purple { color: #fff; background-color: #5739ce; background-image: linear-gradient(#6f55d5, #5739ce); box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), 0 4px 10px rgba(0, 0, 0, 0.12); } + +.btn-purple:hover, .btn-purple.zeroclipboard-is-hover { color: #fff; background-color: #5132cb; background-image: linear-gradient(#6549d2, #5132cb); } + +.btn-purple:active, .btn-purple.selected, .btn-purple.zeroclipboard-is-active { background-color: #4f31c6; background-image: none; box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15); } + +.btn-purple.selected:hover { background-color: #472cb2; } + +.btn-blue { color: #fff; background-color: #227efa; background-image: linear-gradient(#4593fb, #227efa); box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), 0 4px 10px rgba(0, 0, 0, 0.12); } + +.btn-blue:hover, .btn-blue.zeroclipboard-is-hover { color: #fff; background-color: #1878fa; background-image: linear-gradient(#368afa, #1878fa); } + +.btn-blue:active, .btn-blue.selected, .btn-blue.zeroclipboard-is-active { background-color: #1375f9; background-image: none; box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15); } + +.btn-blue.selected:hover { background-color: #0669ed; } + +.btn-green { color: #fff; background-color: #10ac7d; background-image: linear-gradient(#13cc95, #10ac7d); box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), 0 4px 10px rgba(0, 0, 0, 0.12); } + +.btn-green:hover, .btn-green.zeroclipboard-is-hover { color: #fff; background-color: #0fa276; background-image: linear-gradient(#12be8b, #0fa276); } + +.btn-green:active, .btn-green.selected, .btn-green.zeroclipboard-is-active { background-color: #0f9e73; background-image: none; box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15); } + +.btn-green.selected:hover { background-color: #0d8662; } + +.search { position: relative; z-index: 2; flex-grow: 1; height: 4rem; padding: 0.5rem; transition: padding linear 200ms; } + +@media (min-width: 50rem) { .search { position: relative !important; width: auto !important; height: 100% !important; padding: 0; transition: none; } } + +.search-input-wrap { position: relative; z-index: 1; height: 3rem; overflow: hidden; border-radius: 4px; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08); transition: height linear 200ms; } + +@media (min-width: 50rem) { .search-input-wrap { position: absolute; width: 100%; max-width: 536px; height: 100% !important; border-radius: 0; box-shadow: none; transition: width ease 400ms; } } + +.search-input { position: absolute; width: 100%; height: 100%; padding: 0.5rem 1rem 0.5rem 2.5rem; font-size: 16px; color: #e6e1e8; background-color: #302d36; border-top: 0; border-right: 0; border-bottom: 0; border-left: 0; border-radius: 0; } + +@media (min-width: 50rem) { .search-input { padding: 0.5rem 1rem 0.5rem 3.5rem; font-size: 14px; background-color: #27262b; transition: padding-left linear 200ms; } } + +.search-input:focus { outline: 0; } + +.search-input:focus + .search-label .search-icon { color: #2c84fa; } + +.search-label { position: absolute; display: flex; height: 100%; padding-left: 1rem; } + +@media (min-width: 50rem) { .search-label { padding-left: 2rem; transition: padding-left linear 200ms; } } + +.search-label .search-icon { width: 1.2rem; height: 1.2rem; align-self: center; color: #959396; } + +.search-results { position: absolute; left: 0; display: none; width: 100%; max-height: calc(100% - 4rem); overflow-y: auto; background-color: #302d36; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08); } + +@media (min-width: 50rem) { .search-results { top: 100%; width: 536px; max-height: calc(100vh - 200%) !important; } } + +.search-results-list { padding-left: 0; margin-bottom: 0.25rem; list-style: none; font-size: 14px !important; } + +@media (min-width: 31.25rem) { .search-results-list { font-size: 16px !important; } } + +@media (min-width: 50rem) { .search-results-list { font-size: 12px !important; } } + +@media (min-width: 50rem) and (min-width: 31.25rem) { .search-results-list { font-size: 14px !important; } } + +.search-results-list-item { padding: 0; margin: 0; } + +.search-result { display: block; padding: 0.25rem 0.75rem; } + +.search-result:hover, .search-result.active { background-color: #201f23; } + +.search-result-title { display: block; padding-top: 0.5rem; padding-bottom: 0.5rem; } + +@media (min-width: 31.25rem) { .search-result-title { display: inline-block; width: 40%; padding-right: 0.5rem; vertical-align: top; } } + +.search-result-doc { display: flex; align-items: center; word-wrap: break-word; } + +.search-result-doc.search-result-doc-parent { opacity: 0.5; font-size: 12px !important; } + +@media (min-width: 31.25rem) { .search-result-doc.search-result-doc-parent { font-size: 14px !important; } } + +@media (min-width: 50rem) { .search-result-doc.search-result-doc-parent { font-size: 11px !important; } } + +@media (min-width: 50rem) and (min-width: 31.25rem) { .search-result-doc.search-result-doc-parent { font-size: 12px !important; } } + +.search-result-doc .search-result-icon { width: 1rem; height: 1rem; margin-right: 0.5rem; color: #2c84fa; flex-shrink: 0; } + +.search-result-doc .search-result-doc-title { overflow: auto; } + +.search-result-section { margin-left: 1.5rem; word-wrap: break-word; } + +.search-result-rel-url { display: block; margin-left: 1.5rem; overflow: hidden; color: #959396; text-overflow: ellipsis; white-space: nowrap; font-size: 9px !important; } + +@media (min-width: 31.25rem) { .search-result-rel-url { font-size: 10px !important; } } + +.search-result-previews { display: block; padding-top: 0.5rem; padding-bottom: 0.5rem; padding-left: 1rem; margin-left: 0.5rem; color: #959396; word-wrap: break-word; border-left: 1px solid; border-left-color: #44434d; font-size: 11px !important; } + +@media (min-width: 31.25rem) { .search-result-previews { font-size: 12px !important; } } + +@media (min-width: 31.25rem) { .search-result-previews { display: inline-block; width: 60%; padding-left: 0.5rem; margin-left: 0; vertical-align: top; } } + +.search-result-preview + .search-result-preview { margin-top: 0.25rem; } + +.search-result-highlight { font-weight: bold; } + +.search-no-result { padding: 0.5rem 0.75rem; font-size: 12px !important; } + +@media (min-width: 31.25rem) { .search-no-result { font-size: 14px !important; } } + +.search-button { position: fixed; right: 1rem; bottom: 1rem; display: flex; width: 3.5rem; height: 3.5rem; background-color: #302d36; border: 1px solid rgba(44, 132, 250, 0.3); border-radius: 1.75rem; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08); align-items: center; justify-content: center; } + +.search-overlay { position: fixed; top: 0; left: 0; z-index: 1; width: 0; height: 0; background-color: rgba(0, 0, 0, 0.3); opacity: 0; transition: opacity ease 400ms, width 0s 400ms, height 0s 400ms; } + +.search-active .search { position: fixed; top: 0; left: 0; width: 100%; height: 100%; padding: 0; } + +.search-active .search-input-wrap { height: 4rem; border-radius: 0; } + +@media (min-width: 50rem) { .search-active .search-input-wrap { width: 536px; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08); } } + +.search-active .search-input { background-color: #302d36; } + +@media (min-width: 50rem) { .search-active .search-input { padding-left: 2.3rem; } } + +@media (min-width: 50rem) { .search-active .search-label { padding-left: 0.6rem; } } + +.search-active .search-results { display: block; } + +.search-active .search-overlay { width: 100%; height: 100%; opacity: 1; transition: opacity ease 400ms, width 0s, height 0s; } + +@media (min-width: 50rem) { .search-active .main { position: fixed; right: 0; left: 0; } } + +.search-active .main-header { padding-top: 4rem; } + +@media (min-width: 50rem) { .search-active .main-header { padding-top: 0; } } + +.table-wrapper { display: block; width: 100%; max-width: 100%; margin-bottom: 1.5rem; overflow-x: auto; border-radius: 4px; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08); } + +table { display: table; min-width: 100%; border-collapse: separate; } + +th, td { font-size: 12px !important; min-width: 120px; padding: 0.5rem 0.75rem; background-color: #302d36; border-bottom: 1px solid rgba(68, 67, 77, 0.5); border-left: 1px solid #44434d; } + +@media (min-width: 31.25rem) { th, td { font-size: 14px !important; } } + +th:first-of-type, td:first-of-type { border-left: 0; } + +tbody tr:last-of-type th, tbody tr:last-of-type td { border-bottom: 0; } + +tbody tr:last-of-type td { padding-bottom: 0.75rem; } + +thead th { border-bottom: 1px solid #44434d; } + +:not(pre, figure) > code { padding: 0.2em 0.15em; font-weight: 400; background-color: #31343f; border: 1px solid #44434d; border-radius: 4px; } + +a:visited code { border-color: #44434d; } + +div.highlighter-rouge, div.listingblock > div.content, figure.highlight { margin-top: 0; margin-bottom: 0.75rem; background-color: #31343f; border-radius: 4px; box-shadow: none; -webkit-overflow-scrolling: touch; position: relative; padding: 0; } + +div.highlighter-rouge > button, div.listingblock > div.content > button, figure.highlight > button { width: 0.75rem; opacity: 0; position: absolute; top: 0; right: 0; border: 0.75rem solid #31343f; background-color: #31343f; color: #e6e1e8; box-sizing: content-box; } + +div.highlighter-rouge > button svg, div.listingblock > div.content > button svg, figure.highlight > button svg { fill: #e6e1e8; } + +div.highlighter-rouge > button:active, div.listingblock > div.content > button:active, figure.highlight > button:active { text-decoration: none; outline: none; opacity: 1; } + +div.highlighter-rouge > button:focus, div.listingblock > div.content > button:focus, figure.highlight > button:focus { opacity: 1; } + +div.highlighter-rouge:hover > button, div.listingblock > div.content:hover > button, figure.highlight:hover > button { cursor: copy; opacity: 1; } + +div.highlighter-rouge div.highlight { overflow-x: auto; padding: 0.75rem; margin: 0; border: 0; } + +div.highlighter-rouge pre.highlight, div.highlighter-rouge code { padding: 0; margin: 0; border: 0; } + +div.listingblock { margin-top: 0; margin-bottom: 0.75rem; } + +div.listingblock div.content { overflow-x: auto; padding: 0.75rem; margin: 0; border: 0; } + +div.listingblock div.content > pre, div.listingblock code { padding: 0; margin: 0; border: 0; } + +figure.highlight pre, figure.highlight :not(pre) > code { overflow-x: auto; padding: 0.75rem; margin: 0; border: 0; } + +.highlight .table-wrapper { padding: 0.75rem 0; margin: 0; border: 0; box-shadow: none; } + +.highlight .table-wrapper td, .highlight .table-wrapper pre { font-size: 11px !important; min-width: 0; padding: 0; background-color: #31343f; border: 0; } + +@media (min-width: 31.25rem) { .highlight .table-wrapper td, .highlight .table-wrapper pre { font-size: 12px !important; } } + +.highlight .table-wrapper td.gl { width: 1em; padding-right: 0.75rem; padding-left: 0.75rem; } + +.highlight .table-wrapper pre { margin: 0; line-height: 2; } + +.code-example, .listingblock > .title { padding: 0.75rem; margin-bottom: 0.75rem; overflow: auto; border: 1px solid #44434d; border-radius: 4px; } + +.code-example + .highlighter-rouge, .code-example + .sectionbody .listingblock, .code-example + .content, .code-example + figure.highlight, .listingblock > .title + .highlighter-rouge, .listingblock > .title + .sectionbody .listingblock, .listingblock > .title + .content, .listingblock > .title + figure.highlight { position: relative; margin-top: -1rem; border-right: 1px solid #44434d; border-bottom: 1px solid #44434d; border-left: 1px solid #44434d; border-top-left-radius: 0; border-top-right-radius: 0; } + +code.language-mermaid { padding: 0; background-color: inherit; border: 0; } + +.highlight, pre.highlight { background: #31343f; color: #dee2f7; } + +.highlight pre { background: #31343f; } + +.text-grey-dk-000 { color: #959396 !important; } + +.text-grey-dk-100 { color: #5c5962 !important; } + +.text-grey-dk-200 { color: #44434d !important; } + +.text-grey-dk-250 { color: #302d36 !important; } + +.text-grey-dk-300 { color: #27262b !important; } + +.text-grey-lt-000 { color: #f5f6fa !important; } + +.text-grey-lt-100 { color: #eeebee !important; } + +.text-grey-lt-200 { color: #ecebed !important; } + +.text-grey-lt-300 { color: #e6e1e8 !important; } + +.text-blue-000 { color: #2c84fa !important; } + +.text-blue-100 { color: #2869e6 !important; } + +.text-blue-200 { color: #264caf !important; } + +.text-blue-300 { color: #183385 !important; } + +.text-green-000 { color: #41d693 !important; } + +.text-green-100 { color: #11b584 !important; } + +.text-green-200 { color: #009c7b !important; } + +.text-green-300 { color: #026e57 !important; } + +.text-purple-000 { color: #7253ed !important; } + +.text-purple-100 { color: #5e41d0 !important; } + +.text-purple-200 { color: #4e26af !important; } + +.text-purple-300 { color: #381885 !important; } + +.text-yellow-000 { color: #ffeb82 !important; } + +.text-yellow-100 { color: #fadf50 !important; } + +.text-yellow-200 { color: #f7d12e !important; } + +.text-yellow-300 { color: #e7af06 !important; } + +.text-red-000 { color: #f77e7e !important; } + +.text-red-100 { color: #f96e65 !important; } + +.text-red-200 { color: #e94c4c !important; } + +.text-red-300 { color: #dd2e2e !important; } + +.bg-grey-dk-000 { background-color: #959396 !important; } + +.bg-grey-dk-100 { background-color: #5c5962 !important; } + +.bg-grey-dk-200 { background-color: #44434d !important; } + +.bg-grey-dk-250 { background-color: #302d36 !important; } + +.bg-grey-dk-300 { background-color: #27262b !important; } + +.bg-grey-lt-000 { background-color: #f5f6fa !important; } + +.bg-grey-lt-100 { background-color: #eeebee !important; } + +.bg-grey-lt-200 { background-color: #ecebed !important; } + +.bg-grey-lt-300 { background-color: #e6e1e8 !important; } + +.bg-blue-000 { background-color: #2c84fa !important; } + +.bg-blue-100 { background-color: #2869e6 !important; } + +.bg-blue-200 { background-color: #264caf !important; } + +.bg-blue-300 { background-color: #183385 !important; } + +.bg-green-000 { background-color: #41d693 !important; } + +.bg-green-100 { background-color: #11b584 !important; } + +.bg-green-200 { background-color: #009c7b !important; } + +.bg-green-300 { background-color: #026e57 !important; } + +.bg-purple-000 { background-color: #7253ed !important; } + +.bg-purple-100 { background-color: #5e41d0 !important; } + +.bg-purple-200 { background-color: #4e26af !important; } + +.bg-purple-300 { background-color: #381885 !important; } + +.bg-yellow-000 { background-color: #ffeb82 !important; } + +.bg-yellow-100 { background-color: #fadf50 !important; } + +.bg-yellow-200 { background-color: #f7d12e !important; } + +.bg-yellow-300 { background-color: #e7af06 !important; } + +.bg-red-000 { background-color: #f77e7e !important; } + +.bg-red-100 { background-color: #f96e65 !important; } + +.bg-red-200 { background-color: #e94c4c !important; } + +.bg-red-300 { background-color: #dd2e2e !important; } + +.d-block { display: block !important; } + +.d-flex { display: flex !important; } + +.d-inline { display: inline !important; } + +.d-inline-block { display: inline-block !important; } + +.d-none { display: none !important; } + +@media (min-width: 20rem) { .d-xs-block { display: block !important; } .d-xs-flex { display: flex !important; } .d-xs-inline { display: inline !important; } .d-xs-inline-block { display: inline-block !important; } .d-xs-none { display: none !important; } } + +@media (min-width: 20rem) { .d-xs-block { display: block !important; } .d-xs-flex { display: flex !important; } .d-xs-inline { display: inline !important; } .d-xs-inline-block { display: inline-block !important; } .d-xs-none { display: none !important; } } + +@media (min-width: 20rem) { .d-xs-block { display: block !important; } .d-xs-flex { display: flex !important; } .d-xs-inline { display: inline !important; } .d-xs-inline-block { display: inline-block !important; } .d-xs-none { display: none !important; } } + +@media (min-width: 20rem) { .d-xs-block { display: block !important; } .d-xs-flex { display: flex !important; } .d-xs-inline { display: inline !important; } .d-xs-inline-block { display: inline-block !important; } .d-xs-none { display: none !important; } } + +@media (min-width: 20rem) { .d-xs-block { display: block !important; } .d-xs-flex { display: flex !important; } .d-xs-inline { display: inline !important; } .d-xs-inline-block { display: inline-block !important; } .d-xs-none { display: none !important; } } + +@media (min-width: 20rem) { .d-xs-block { display: block !important; } .d-xs-flex { display: flex !important; } .d-xs-inline { display: inline !important; } .d-xs-inline-block { display: inline-block !important; } .d-xs-none { display: none !important; } } + +@media (min-width: 20rem) { .d-xs-block { display: block !important; } .d-xs-flex { display: flex !important; } .d-xs-inline { display: inline !important; } .d-xs-inline-block { display: inline-block !important; } .d-xs-none { display: none !important; } } + +@media (min-width: 20rem) { .d-xs-block { display: block !important; } .d-xs-flex { display: flex !important; } .d-xs-inline { display: inline !important; } .d-xs-inline-block { display: inline-block !important; } .d-xs-none { display: none !important; } } + +@media (min-width: 20rem) { .d-xs-block { display: block !important; } .d-xs-flex { display: flex !important; } .d-xs-inline { display: inline !important; } .d-xs-inline-block { display: inline-block !important; } .d-xs-none { display: none !important; } } + +@media (min-width: 20rem) { .d-xs-block { display: block !important; } .d-xs-flex { display: flex !important; } .d-xs-inline { display: inline !important; } .d-xs-inline-block { display: inline-block !important; } .d-xs-none { display: none !important; } } + +@media (min-width: 20rem) { .d-xs-block { display: block !important; } .d-xs-flex { display: flex !important; } .d-xs-inline { display: inline !important; } .d-xs-inline-block { display: inline-block !important; } .d-xs-none { display: none !important; } } + +@media (min-width: 31.25rem) { .d-sm-block { display: block !important; } .d-sm-flex { display: flex !important; } .d-sm-inline { display: inline !important; } .d-sm-inline-block { display: inline-block !important; } .d-sm-none { display: none !important; } } + +@media (min-width: 31.25rem) { .d-sm-block { display: block !important; } .d-sm-flex { display: flex !important; } .d-sm-inline { display: inline !important; } .d-sm-inline-block { display: inline-block !important; } .d-sm-none { display: none !important; } } + +@media (min-width: 31.25rem) { .d-sm-block { display: block !important; } .d-sm-flex { display: flex !important; } .d-sm-inline { display: inline !important; } .d-sm-inline-block { display: inline-block !important; } .d-sm-none { display: none !important; } } + +@media (min-width: 31.25rem) { .d-sm-block { display: block !important; } .d-sm-flex { display: flex !important; } .d-sm-inline { display: inline !important; } .d-sm-inline-block { display: inline-block !important; } .d-sm-none { display: none !important; } } + +@media (min-width: 31.25rem) { .d-sm-block { display: block !important; } .d-sm-flex { display: flex !important; } .d-sm-inline { display: inline !important; } .d-sm-inline-block { display: inline-block !important; } .d-sm-none { display: none !important; } } + +@media (min-width: 31.25rem) { .d-sm-block { display: block !important; } .d-sm-flex { display: flex !important; } .d-sm-inline { display: inline !important; } .d-sm-inline-block { display: inline-block !important; } .d-sm-none { display: none !important; } } + +@media (min-width: 31.25rem) { .d-sm-block { display: block !important; } .d-sm-flex { display: flex !important; } .d-sm-inline { display: inline !important; } .d-sm-inline-block { display: inline-block !important; } .d-sm-none { display: none !important; } } + +@media (min-width: 31.25rem) { .d-sm-block { display: block !important; } .d-sm-flex { display: flex !important; } .d-sm-inline { display: inline !important; } .d-sm-inline-block { display: inline-block !important; } .d-sm-none { display: none !important; } } + +@media (min-width: 31.25rem) { .d-sm-block { display: block !important; } .d-sm-flex { display: flex !important; } .d-sm-inline { display: inline !important; } .d-sm-inline-block { display: inline-block !important; } .d-sm-none { display: none !important; } } + +@media (min-width: 31.25rem) { .d-sm-block { display: block !important; } .d-sm-flex { display: flex !important; } .d-sm-inline { display: inline !important; } .d-sm-inline-block { display: inline-block !important; } .d-sm-none { display: none !important; } } + +@media (min-width: 31.25rem) { .d-sm-block { display: block !important; } .d-sm-flex { display: flex !important; } .d-sm-inline { display: inline !important; } .d-sm-inline-block { display: inline-block !important; } .d-sm-none { display: none !important; } } + +@media (min-width: 50rem) { .d-md-block { display: block !important; } .d-md-flex { display: flex !important; } .d-md-inline { display: inline !important; } .d-md-inline-block { display: inline-block !important; } .d-md-none { display: none !important; } } + +@media (min-width: 50rem) { .d-md-block { display: block !important; } .d-md-flex { display: flex !important; } .d-md-inline { display: inline !important; } .d-md-inline-block { display: inline-block !important; } .d-md-none { display: none !important; } } + +@media (min-width: 50rem) { .d-md-block { display: block !important; } .d-md-flex { display: flex !important; } .d-md-inline { display: inline !important; } .d-md-inline-block { display: inline-block !important; } .d-md-none { display: none !important; } } + +@media (min-width: 50rem) { .d-md-block { display: block !important; } .d-md-flex { display: flex !important; } .d-md-inline { display: inline !important; } .d-md-inline-block { display: inline-block !important; } .d-md-none { display: none !important; } } + +@media (min-width: 50rem) { .d-md-block { display: block !important; } .d-md-flex { display: flex !important; } .d-md-inline { display: inline !important; } .d-md-inline-block { display: inline-block !important; } .d-md-none { display: none !important; } } + +@media (min-width: 50rem) { .d-md-block { display: block !important; } .d-md-flex { display: flex !important; } .d-md-inline { display: inline !important; } .d-md-inline-block { display: inline-block !important; } .d-md-none { display: none !important; } } + +@media (min-width: 50rem) { .d-md-block { display: block !important; } .d-md-flex { display: flex !important; } .d-md-inline { display: inline !important; } .d-md-inline-block { display: inline-block !important; } .d-md-none { display: none !important; } } + +@media (min-width: 50rem) { .d-md-block { display: block !important; } .d-md-flex { display: flex !important; } .d-md-inline { display: inline !important; } .d-md-inline-block { display: inline-block !important; } .d-md-none { display: none !important; } } + +@media (min-width: 50rem) { .d-md-block { display: block !important; } .d-md-flex { display: flex !important; } .d-md-inline { display: inline !important; } .d-md-inline-block { display: inline-block !important; } .d-md-none { display: none !important; } } + +@media (min-width: 50rem) { .d-md-block { display: block !important; } .d-md-flex { display: flex !important; } .d-md-inline { display: inline !important; } .d-md-inline-block { display: inline-block !important; } .d-md-none { display: none !important; } } + +@media (min-width: 50rem) { .d-md-block { display: block !important; } .d-md-flex { display: flex !important; } .d-md-inline { display: inline !important; } .d-md-inline-block { display: inline-block !important; } .d-md-none { display: none !important; } } + +@media (min-width: 66.5rem) { .d-lg-block { display: block !important; } .d-lg-flex { display: flex !important; } .d-lg-inline { display: inline !important; } .d-lg-inline-block { display: inline-block !important; } .d-lg-none { display: none !important; } } + +@media (min-width: 66.5rem) { .d-lg-block { display: block !important; } .d-lg-flex { display: flex !important; } .d-lg-inline { display: inline !important; } .d-lg-inline-block { display: inline-block !important; } .d-lg-none { display: none !important; } } + +@media (min-width: 66.5rem) { .d-lg-block { display: block !important; } .d-lg-flex { display: flex !important; } .d-lg-inline { display: inline !important; } .d-lg-inline-block { display: inline-block !important; } .d-lg-none { display: none !important; } } + +@media (min-width: 66.5rem) { .d-lg-block { display: block !important; } .d-lg-flex { display: flex !important; } .d-lg-inline { display: inline !important; } .d-lg-inline-block { display: inline-block !important; } .d-lg-none { display: none !important; } } + +@media (min-width: 66.5rem) { .d-lg-block { display: block !important; } .d-lg-flex { display: flex !important; } .d-lg-inline { display: inline !important; } .d-lg-inline-block { display: inline-block !important; } .d-lg-none { display: none !important; } } + +@media (min-width: 66.5rem) { .d-lg-block { display: block !important; } .d-lg-flex { display: flex !important; } .d-lg-inline { display: inline !important; } .d-lg-inline-block { display: inline-block !important; } .d-lg-none { display: none !important; } } + +@media (min-width: 66.5rem) { .d-lg-block { display: block !important; } .d-lg-flex { display: flex !important; } .d-lg-inline { display: inline !important; } .d-lg-inline-block { display: inline-block !important; } .d-lg-none { display: none !important; } } + +@media (min-width: 66.5rem) { .d-lg-block { display: block !important; } .d-lg-flex { display: flex !important; } .d-lg-inline { display: inline !important; } .d-lg-inline-block { display: inline-block !important; } .d-lg-none { display: none !important; } } + +@media (min-width: 66.5rem) { .d-lg-block { display: block !important; } .d-lg-flex { display: flex !important; } .d-lg-inline { display: inline !important; } .d-lg-inline-block { display: inline-block !important; } .d-lg-none { display: none !important; } } + +@media (min-width: 66.5rem) { .d-lg-block { display: block !important; } .d-lg-flex { display: flex !important; } .d-lg-inline { display: inline !important; } .d-lg-inline-block { display: inline-block !important; } .d-lg-none { display: none !important; } } + +@media (min-width: 66.5rem) { .d-lg-block { display: block !important; } .d-lg-flex { display: flex !important; } .d-lg-inline { display: inline !important; } .d-lg-inline-block { display: inline-block !important; } .d-lg-none { display: none !important; } } + +@media (min-width: 87.5rem) { .d-xl-block { display: block !important; } .d-xl-flex { display: flex !important; } .d-xl-inline { display: inline !important; } .d-xl-inline-block { display: inline-block !important; } .d-xl-none { display: none !important; } } + +@media (min-width: 87.5rem) { .d-xl-block { display: block !important; } .d-xl-flex { display: flex !important; } .d-xl-inline { display: inline !important; } .d-xl-inline-block { display: inline-block !important; } .d-xl-none { display: none !important; } } + +@media (min-width: 87.5rem) { .d-xl-block { display: block !important; } .d-xl-flex { display: flex !important; } .d-xl-inline { display: inline !important; } .d-xl-inline-block { display: inline-block !important; } .d-xl-none { display: none !important; } } + +@media (min-width: 87.5rem) { .d-xl-block { display: block !important; } .d-xl-flex { display: flex !important; } .d-xl-inline { display: inline !important; } .d-xl-inline-block { display: inline-block !important; } .d-xl-none { display: none !important; } } + +@media (min-width: 87.5rem) { .d-xl-block { display: block !important; } .d-xl-flex { display: flex !important; } .d-xl-inline { display: inline !important; } .d-xl-inline-block { display: inline-block !important; } .d-xl-none { display: none !important; } } + +@media (min-width: 87.5rem) { .d-xl-block { display: block !important; } .d-xl-flex { display: flex !important; } .d-xl-inline { display: inline !important; } .d-xl-inline-block { display: inline-block !important; } .d-xl-none { display: none !important; } } + +@media (min-width: 87.5rem) { .d-xl-block { display: block !important; } .d-xl-flex { display: flex !important; } .d-xl-inline { display: inline !important; } .d-xl-inline-block { display: inline-block !important; } .d-xl-none { display: none !important; } } + +@media (min-width: 87.5rem) { .d-xl-block { display: block !important; } .d-xl-flex { display: flex !important; } .d-xl-inline { display: inline !important; } .d-xl-inline-block { display: inline-block !important; } .d-xl-none { display: none !important; } } + +@media (min-width: 87.5rem) { .d-xl-block { display: block !important; } .d-xl-flex { display: flex !important; } .d-xl-inline { display: inline !important; } .d-xl-inline-block { display: inline-block !important; } .d-xl-none { display: none !important; } } + +@media (min-width: 87.5rem) { .d-xl-block { display: block !important; } .d-xl-flex { display: flex !important; } .d-xl-inline { display: inline !important; } .d-xl-inline-block { display: inline-block !important; } .d-xl-none { display: none !important; } } + +@media (min-width: 87.5rem) { .d-xl-block { display: block !important; } .d-xl-flex { display: flex !important; } .d-xl-inline { display: inline !important; } .d-xl-inline-block { display: inline-block !important; } .d-xl-none { display: none !important; } } + +.float-left { float: left !important; } + +.float-right { float: right !important; } + +.flex-justify-start { justify-content: flex-start !important; } + +.flex-justify-end { justify-content: flex-end !important; } + +.flex-justify-between { justify-content: space-between !important; } + +.flex-justify-around { justify-content: space-around !important; } + +.v-align-baseline { vertical-align: baseline !important; } + +.v-align-bottom { vertical-align: bottom !important; } + +.v-align-middle { vertical-align: middle !important; } + +.v-align-text-bottom { vertical-align: text-bottom !important; } + +.v-align-text-top { vertical-align: text-top !important; } + +.v-align-top { vertical-align: top !important; } + +.fs-1 { font-size: 9px !important; } + +@media (min-width: 31.25rem) { .fs-1 { font-size: 10px !important; } } + +.fs-2 { font-size: 11px !important; } + +@media (min-width: 31.25rem) { .fs-2 { font-size: 12px !important; } } + +.fs-3 { font-size: 12px !important; } + +@media (min-width: 31.25rem) { .fs-3 { font-size: 14px !important; } } + +.fs-4 { font-size: 14px !important; } + +@media (min-width: 31.25rem) { .fs-4 { font-size: 16px !important; } } + +.fs-5 { font-size: 16px !important; } + +@media (min-width: 31.25rem) { .fs-5 { font-size: 18px !important; } } + +.fs-6 { font-size: 18px !important; } + +@media (min-width: 31.25rem) { .fs-6 { font-size: 24px !important; line-height: 1.25; } } + +.fs-7 { font-size: 24px !important; line-height: 1.25; } + +@media (min-width: 31.25rem) { .fs-7 { font-size: 32px !important; } } + +.fs-8 { font-size: 32px !important; line-height: 1.25; } + +@media (min-width: 31.25rem) { .fs-8 { font-size: 36px !important; } } + +.fs-9 { font-size: 36px !important; line-height: 1.25; } + +@media (min-width: 31.25rem) { .fs-9 { font-size: 42px !important; } } + +.fs-10 { font-size: 42px !important; line-height: 1.25; } + +@media (min-width: 31.25rem) { .fs-10 { font-size: 48px !important; } } + +.fw-300 { font-weight: 300 !important; } + +.fw-400 { font-weight: 400 !important; } + +.fw-500 { font-weight: 500 !important; } + +.fw-700 { font-weight: 700 !important; } + +.lh-0 { line-height: 0 !important; } + +.lh-default { line-height: 1.4; } + +.lh-tight { line-height: 1.25; } + +.ls-5 { letter-spacing: 0.05em !important; } + +.ls-10 { letter-spacing: 0.1em !important; } + +.ls-0 { letter-spacing: 0 !important; } + +.text-uppercase { text-transform: uppercase !important; } + +.list-style-none { padding: 0 !important; margin: 0 !important; list-style: none !important; } + +.list-style-none li::before { display: none !important; } + +.mx-auto { margin-right: auto !important; margin-left: auto !important; } + +.m-0 { margin: 0 !important; } + +.mt-0 { margin-top: 0 !important; } + +.mr-0 { margin-right: 0 !important; } + +.mb-0 { margin-bottom: 0 !important; } + +.ml-0 { margin-left: 0 !important; } + +.mx-0 { margin-right: 0 !important; margin-left: 0 !important; } + +.my-0 { margin-top: 0 !important; margin-bottom: 0 !important; } + +.mxn-0 { margin-right: -0 !important; margin-left: -0 !important; } + +.mx-0-auto { margin-right: auto !important; margin-left: auto !important; } + +.m-1 { margin: 0.25rem !important; } + +.mt-1 { margin-top: 0.25rem !important; } + +.mr-1 { margin-right: 0.25rem !important; } + +.mb-1 { margin-bottom: 0.25rem !important; } + +.ml-1 { margin-left: 0.25rem !important; } + +.mx-1 { margin-right: 0.25rem !important; margin-left: 0.25rem !important; } + +.my-1 { margin-top: 0.25rem !important; margin-bottom: 0.25rem !important; } + +.mxn-1 { margin-right: -0.25rem !important; margin-left: -0.25rem !important; } + +.mx-1-auto { margin-right: auto !important; margin-left: auto !important; } + +.m-2 { margin: 0.5rem !important; } + +.mt-2 { margin-top: 0.5rem !important; } + +.mr-2 { margin-right: 0.5rem !important; } + +.mb-2 { margin-bottom: 0.5rem !important; } + +.ml-2 { margin-left: 0.5rem !important; } + +.mx-2 { margin-right: 0.5rem !important; margin-left: 0.5rem !important; } + +.my-2 { margin-top: 0.5rem !important; margin-bottom: 0.5rem !important; } + +.mxn-2 { margin-right: -0.5rem !important; margin-left: -0.5rem !important; } + +.mx-2-auto { margin-right: auto !important; margin-left: auto !important; } + +.m-3 { margin: 0.75rem !important; } + +.mt-3 { margin-top: 0.75rem !important; } + +.mr-3 { margin-right: 0.75rem !important; } + +.mb-3 { margin-bottom: 0.75rem !important; } + +.ml-3 { margin-left: 0.75rem !important; } + +.mx-3 { margin-right: 0.75rem !important; margin-left: 0.75rem !important; } + +.my-3 { margin-top: 0.75rem !important; margin-bottom: 0.75rem !important; } + +.mxn-3 { margin-right: -0.75rem !important; margin-left: -0.75rem !important; } + +.mx-3-auto { margin-right: auto !important; margin-left: auto !important; } + +.m-4 { margin: 1rem !important; } + +.mt-4 { margin-top: 1rem !important; } + +.mr-4 { margin-right: 1rem !important; } + +.mb-4 { margin-bottom: 1rem !important; } + +.ml-4 { margin-left: 1rem !important; } + +.mx-4 { margin-right: 1rem !important; margin-left: 1rem !important; } + +.my-4 { margin-top: 1rem !important; margin-bottom: 1rem !important; } + +.mxn-4 { margin-right: -1rem !important; margin-left: -1rem !important; } + +.mx-4-auto { margin-right: auto !important; margin-left: auto !important; } + +.m-5 { margin: 1.5rem !important; } + +.mt-5 { margin-top: 1.5rem !important; } + +.mr-5 { margin-right: 1.5rem !important; } + +.mb-5 { margin-bottom: 1.5rem !important; } + +.ml-5 { margin-left: 1.5rem !important; } + +.mx-5 { margin-right: 1.5rem !important; margin-left: 1.5rem !important; } + +.my-5 { margin-top: 1.5rem !important; margin-bottom: 1.5rem !important; } + +.mxn-5 { margin-right: -1.5rem !important; margin-left: -1.5rem !important; } + +.mx-5-auto { margin-right: auto !important; margin-left: auto !important; } + +.m-6 { margin: 2rem !important; } + +.mt-6 { margin-top: 2rem !important; } + +.mr-6 { margin-right: 2rem !important; } + +.mb-6 { margin-bottom: 2rem !important; } + +.ml-6 { margin-left: 2rem !important; } + +.mx-6 { margin-right: 2rem !important; margin-left: 2rem !important; } + +.my-6 { margin-top: 2rem !important; margin-bottom: 2rem !important; } + +.mxn-6 { margin-right: -2rem !important; margin-left: -2rem !important; } + +.mx-6-auto { margin-right: auto !important; margin-left: auto !important; } + +.m-7 { margin: 2.5rem !important; } + +.mt-7 { margin-top: 2.5rem !important; } + +.mr-7 { margin-right: 2.5rem !important; } + +.mb-7 { margin-bottom: 2.5rem !important; } + +.ml-7 { margin-left: 2.5rem !important; } + +.mx-7 { margin-right: 2.5rem !important; margin-left: 2.5rem !important; } + +.my-7 { margin-top: 2.5rem !important; margin-bottom: 2.5rem !important; } + +.mxn-7 { margin-right: -2.5rem !important; margin-left: -2.5rem !important; } + +.mx-7-auto { margin-right: auto !important; margin-left: auto !important; } + +.m-8 { margin: 3rem !important; } + +.mt-8 { margin-top: 3rem !important; } + +.mr-8 { margin-right: 3rem !important; } + +.mb-8 { margin-bottom: 3rem !important; } + +.ml-8 { margin-left: 3rem !important; } + +.mx-8 { margin-right: 3rem !important; margin-left: 3rem !important; } + +.my-8 { margin-top: 3rem !important; margin-bottom: 3rem !important; } + +.mxn-8 { margin-right: -3rem !important; margin-left: -3rem !important; } + +.mx-8-auto { margin-right: auto !important; margin-left: auto !important; } + +.m-9 { margin: 3.5rem !important; } + +.mt-9 { margin-top: 3.5rem !important; } + +.mr-9 { margin-right: 3.5rem !important; } + +.mb-9 { margin-bottom: 3.5rem !important; } + +.ml-9 { margin-left: 3.5rem !important; } + +.mx-9 { margin-right: 3.5rem !important; margin-left: 3.5rem !important; } + +.my-9 { margin-top: 3.5rem !important; margin-bottom: 3.5rem !important; } + +.mxn-9 { margin-right: -3.5rem !important; margin-left: -3.5rem !important; } + +.mx-9-auto { margin-right: auto !important; margin-left: auto !important; } + +.m-10 { margin: 4rem !important; } + +.mt-10 { margin-top: 4rem !important; } + +.mr-10 { margin-right: 4rem !important; } + +.mb-10 { margin-bottom: 4rem !important; } + +.ml-10 { margin-left: 4rem !important; } + +.mx-10 { margin-right: 4rem !important; margin-left: 4rem !important; } + +.my-10 { margin-top: 4rem !important; margin-bottom: 4rem !important; } + +.mxn-10 { margin-right: -4rem !important; margin-left: -4rem !important; } + +.mx-10-auto { margin-right: auto !important; margin-left: auto !important; } + +@media (min-width: 20rem) { .m-xs-0 { margin: 0 !important; } .mt-xs-0 { margin-top: 0 !important; } .mr-xs-0 { margin-right: 0 !important; } .mb-xs-0 { margin-bottom: 0 !important; } .ml-xs-0 { margin-left: 0 !important; } .mx-xs-0 { margin-right: 0 !important; margin-left: 0 !important; } .my-xs-0 { margin-top: 0 !important; margin-bottom: 0 !important; } .mxn-xs-0 { margin-right: -0 !important; margin-left: -0 !important; } } + +@media (min-width: 20rem) { .m-xs-1 { margin: 0.25rem !important; } .mt-xs-1 { margin-top: 0.25rem !important; } .mr-xs-1 { margin-right: 0.25rem !important; } .mb-xs-1 { margin-bottom: 0.25rem !important; } .ml-xs-1 { margin-left: 0.25rem !important; } .mx-xs-1 { margin-right: 0.25rem !important; margin-left: 0.25rem !important; } .my-xs-1 { margin-top: 0.25rem !important; margin-bottom: 0.25rem !important; } .mxn-xs-1 { margin-right: -0.25rem !important; margin-left: -0.25rem !important; } } + +@media (min-width: 20rem) { .m-xs-2 { margin: 0.5rem !important; } .mt-xs-2 { margin-top: 0.5rem !important; } .mr-xs-2 { margin-right: 0.5rem !important; } .mb-xs-2 { margin-bottom: 0.5rem !important; } .ml-xs-2 { margin-left: 0.5rem !important; } .mx-xs-2 { margin-right: 0.5rem !important; margin-left: 0.5rem !important; } .my-xs-2 { margin-top: 0.5rem !important; margin-bottom: 0.5rem !important; } .mxn-xs-2 { margin-right: -0.5rem !important; margin-left: -0.5rem !important; } } + +@media (min-width: 20rem) { .m-xs-3 { margin: 0.75rem !important; } .mt-xs-3 { margin-top: 0.75rem !important; } .mr-xs-3 { margin-right: 0.75rem !important; } .mb-xs-3 { margin-bottom: 0.75rem !important; } .ml-xs-3 { margin-left: 0.75rem !important; } .mx-xs-3 { margin-right: 0.75rem !important; margin-left: 0.75rem !important; } .my-xs-3 { margin-top: 0.75rem !important; margin-bottom: 0.75rem !important; } .mxn-xs-3 { margin-right: -0.75rem !important; margin-left: -0.75rem !important; } } + +@media (min-width: 20rem) { .m-xs-4 { margin: 1rem !important; } .mt-xs-4 { margin-top: 1rem !important; } .mr-xs-4 { margin-right: 1rem !important; } .mb-xs-4 { margin-bottom: 1rem !important; } .ml-xs-4 { margin-left: 1rem !important; } .mx-xs-4 { margin-right: 1rem !important; margin-left: 1rem !important; } .my-xs-4 { margin-top: 1rem !important; margin-bottom: 1rem !important; } .mxn-xs-4 { margin-right: -1rem !important; margin-left: -1rem !important; } } + +@media (min-width: 20rem) { .m-xs-5 { margin: 1.5rem !important; } .mt-xs-5 { margin-top: 1.5rem !important; } .mr-xs-5 { margin-right: 1.5rem !important; } .mb-xs-5 { margin-bottom: 1.5rem !important; } .ml-xs-5 { margin-left: 1.5rem !important; } .mx-xs-5 { margin-right: 1.5rem !important; margin-left: 1.5rem !important; } .my-xs-5 { margin-top: 1.5rem !important; margin-bottom: 1.5rem !important; } .mxn-xs-5 { margin-right: -1.5rem !important; margin-left: -1.5rem !important; } } + +@media (min-width: 20rem) { .m-xs-6 { margin: 2rem !important; } .mt-xs-6 { margin-top: 2rem !important; } .mr-xs-6 { margin-right: 2rem !important; } .mb-xs-6 { margin-bottom: 2rem !important; } .ml-xs-6 { margin-left: 2rem !important; } .mx-xs-6 { margin-right: 2rem !important; margin-left: 2rem !important; } .my-xs-6 { margin-top: 2rem !important; margin-bottom: 2rem !important; } .mxn-xs-6 { margin-right: -2rem !important; margin-left: -2rem !important; } } + +@media (min-width: 20rem) { .m-xs-7 { margin: 2.5rem !important; } .mt-xs-7 { margin-top: 2.5rem !important; } .mr-xs-7 { margin-right: 2.5rem !important; } .mb-xs-7 { margin-bottom: 2.5rem !important; } .ml-xs-7 { margin-left: 2.5rem !important; } .mx-xs-7 { margin-right: 2.5rem !important; margin-left: 2.5rem !important; } .my-xs-7 { margin-top: 2.5rem !important; margin-bottom: 2.5rem !important; } .mxn-xs-7 { margin-right: -2.5rem !important; margin-left: -2.5rem !important; } } + +@media (min-width: 20rem) { .m-xs-8 { margin: 3rem !important; } .mt-xs-8 { margin-top: 3rem !important; } .mr-xs-8 { margin-right: 3rem !important; } .mb-xs-8 { margin-bottom: 3rem !important; } .ml-xs-8 { margin-left: 3rem !important; } .mx-xs-8 { margin-right: 3rem !important; margin-left: 3rem !important; } .my-xs-8 { margin-top: 3rem !important; margin-bottom: 3rem !important; } .mxn-xs-8 { margin-right: -3rem !important; margin-left: -3rem !important; } } + +@media (min-width: 20rem) { .m-xs-9 { margin: 3.5rem !important; } .mt-xs-9 { margin-top: 3.5rem !important; } .mr-xs-9 { margin-right: 3.5rem !important; } .mb-xs-9 { margin-bottom: 3.5rem !important; } .ml-xs-9 { margin-left: 3.5rem !important; } .mx-xs-9 { margin-right: 3.5rem !important; margin-left: 3.5rem !important; } .my-xs-9 { margin-top: 3.5rem !important; margin-bottom: 3.5rem !important; } .mxn-xs-9 { margin-right: -3.5rem !important; margin-left: -3.5rem !important; } } + +@media (min-width: 20rem) { .m-xs-10 { margin: 4rem !important; } .mt-xs-10 { margin-top: 4rem !important; } .mr-xs-10 { margin-right: 4rem !important; } .mb-xs-10 { margin-bottom: 4rem !important; } .ml-xs-10 { margin-left: 4rem !important; } .mx-xs-10 { margin-right: 4rem !important; margin-left: 4rem !important; } .my-xs-10 { margin-top: 4rem !important; margin-bottom: 4rem !important; } .mxn-xs-10 { margin-right: -4rem !important; margin-left: -4rem !important; } } + +@media (min-width: 31.25rem) { .m-sm-0 { margin: 0 !important; } .mt-sm-0 { margin-top: 0 !important; } .mr-sm-0 { margin-right: 0 !important; } .mb-sm-0 { margin-bottom: 0 !important; } .ml-sm-0 { margin-left: 0 !important; } .mx-sm-0 { margin-right: 0 !important; margin-left: 0 !important; } .my-sm-0 { margin-top: 0 !important; margin-bottom: 0 !important; } .mxn-sm-0 { margin-right: -0 !important; margin-left: -0 !important; } } + +@media (min-width: 31.25rem) { .m-sm-1 { margin: 0.25rem !important; } .mt-sm-1 { margin-top: 0.25rem !important; } .mr-sm-1 { margin-right: 0.25rem !important; } .mb-sm-1 { margin-bottom: 0.25rem !important; } .ml-sm-1 { margin-left: 0.25rem !important; } .mx-sm-1 { margin-right: 0.25rem !important; margin-left: 0.25rem !important; } .my-sm-1 { margin-top: 0.25rem !important; margin-bottom: 0.25rem !important; } .mxn-sm-1 { margin-right: -0.25rem !important; margin-left: -0.25rem !important; } } + +@media (min-width: 31.25rem) { .m-sm-2 { margin: 0.5rem !important; } .mt-sm-2 { margin-top: 0.5rem !important; } .mr-sm-2 { margin-right: 0.5rem !important; } .mb-sm-2 { margin-bottom: 0.5rem !important; } .ml-sm-2 { margin-left: 0.5rem !important; } .mx-sm-2 { margin-right: 0.5rem !important; margin-left: 0.5rem !important; } .my-sm-2 { margin-top: 0.5rem !important; margin-bottom: 0.5rem !important; } .mxn-sm-2 { margin-right: -0.5rem !important; margin-left: -0.5rem !important; } } + +@media (min-width: 31.25rem) { .m-sm-3 { margin: 0.75rem !important; } .mt-sm-3 { margin-top: 0.75rem !important; } .mr-sm-3 { margin-right: 0.75rem !important; } .mb-sm-3 { margin-bottom: 0.75rem !important; } .ml-sm-3 { margin-left: 0.75rem !important; } .mx-sm-3 { margin-right: 0.75rem !important; margin-left: 0.75rem !important; } .my-sm-3 { margin-top: 0.75rem !important; margin-bottom: 0.75rem !important; } .mxn-sm-3 { margin-right: -0.75rem !important; margin-left: -0.75rem !important; } } + +@media (min-width: 31.25rem) { .m-sm-4 { margin: 1rem !important; } .mt-sm-4 { margin-top: 1rem !important; } .mr-sm-4 { margin-right: 1rem !important; } .mb-sm-4 { margin-bottom: 1rem !important; } .ml-sm-4 { margin-left: 1rem !important; } .mx-sm-4 { margin-right: 1rem !important; margin-left: 1rem !important; } .my-sm-4 { margin-top: 1rem !important; margin-bottom: 1rem !important; } .mxn-sm-4 { margin-right: -1rem !important; margin-left: -1rem !important; } } + +@media (min-width: 31.25rem) { .m-sm-5 { margin: 1.5rem !important; } .mt-sm-5 { margin-top: 1.5rem !important; } .mr-sm-5 { margin-right: 1.5rem !important; } .mb-sm-5 { margin-bottom: 1.5rem !important; } .ml-sm-5 { margin-left: 1.5rem !important; } .mx-sm-5 { margin-right: 1.5rem !important; margin-left: 1.5rem !important; } .my-sm-5 { margin-top: 1.5rem !important; margin-bottom: 1.5rem !important; } .mxn-sm-5 { margin-right: -1.5rem !important; margin-left: -1.5rem !important; } } + +@media (min-width: 31.25rem) { .m-sm-6 { margin: 2rem !important; } .mt-sm-6 { margin-top: 2rem !important; } .mr-sm-6 { margin-right: 2rem !important; } .mb-sm-6 { margin-bottom: 2rem !important; } .ml-sm-6 { margin-left: 2rem !important; } .mx-sm-6 { margin-right: 2rem !important; margin-left: 2rem !important; } .my-sm-6 { margin-top: 2rem !important; margin-bottom: 2rem !important; } .mxn-sm-6 { margin-right: -2rem !important; margin-left: -2rem !important; } } + +@media (min-width: 31.25rem) { .m-sm-7 { margin: 2.5rem !important; } .mt-sm-7 { margin-top: 2.5rem !important; } .mr-sm-7 { margin-right: 2.5rem !important; } .mb-sm-7 { margin-bottom: 2.5rem !important; } .ml-sm-7 { margin-left: 2.5rem !important; } .mx-sm-7 { margin-right: 2.5rem !important; margin-left: 2.5rem !important; } .my-sm-7 { margin-top: 2.5rem !important; margin-bottom: 2.5rem !important; } .mxn-sm-7 { margin-right: -2.5rem !important; margin-left: -2.5rem !important; } } + +@media (min-width: 31.25rem) { .m-sm-8 { margin: 3rem !important; } .mt-sm-8 { margin-top: 3rem !important; } .mr-sm-8 { margin-right: 3rem !important; } .mb-sm-8 { margin-bottom: 3rem !important; } .ml-sm-8 { margin-left: 3rem !important; } .mx-sm-8 { margin-right: 3rem !important; margin-left: 3rem !important; } .my-sm-8 { margin-top: 3rem !important; margin-bottom: 3rem !important; } .mxn-sm-8 { margin-right: -3rem !important; margin-left: -3rem !important; } } + +@media (min-width: 31.25rem) { .m-sm-9 { margin: 3.5rem !important; } .mt-sm-9 { margin-top: 3.5rem !important; } .mr-sm-9 { margin-right: 3.5rem !important; } .mb-sm-9 { margin-bottom: 3.5rem !important; } .ml-sm-9 { margin-left: 3.5rem !important; } .mx-sm-9 { margin-right: 3.5rem !important; margin-left: 3.5rem !important; } .my-sm-9 { margin-top: 3.5rem !important; margin-bottom: 3.5rem !important; } .mxn-sm-9 { margin-right: -3.5rem !important; margin-left: -3.5rem !important; } } + +@media (min-width: 31.25rem) { .m-sm-10 { margin: 4rem !important; } .mt-sm-10 { margin-top: 4rem !important; } .mr-sm-10 { margin-right: 4rem !important; } .mb-sm-10 { margin-bottom: 4rem !important; } .ml-sm-10 { margin-left: 4rem !important; } .mx-sm-10 { margin-right: 4rem !important; margin-left: 4rem !important; } .my-sm-10 { margin-top: 4rem !important; margin-bottom: 4rem !important; } .mxn-sm-10 { margin-right: -4rem !important; margin-left: -4rem !important; } } + +@media (min-width: 50rem) { .m-md-0 { margin: 0 !important; } .mt-md-0 { margin-top: 0 !important; } .mr-md-0 { margin-right: 0 !important; } .mb-md-0 { margin-bottom: 0 !important; } .ml-md-0 { margin-left: 0 !important; } .mx-md-0 { margin-right: 0 !important; margin-left: 0 !important; } .my-md-0 { margin-top: 0 !important; margin-bottom: 0 !important; } .mxn-md-0 { margin-right: -0 !important; margin-left: -0 !important; } } + +@media (min-width: 50rem) { .m-md-1 { margin: 0.25rem !important; } .mt-md-1 { margin-top: 0.25rem !important; } .mr-md-1 { margin-right: 0.25rem !important; } .mb-md-1 { margin-bottom: 0.25rem !important; } .ml-md-1 { margin-left: 0.25rem !important; } .mx-md-1 { margin-right: 0.25rem !important; margin-left: 0.25rem !important; } .my-md-1 { margin-top: 0.25rem !important; margin-bottom: 0.25rem !important; } .mxn-md-1 { margin-right: -0.25rem !important; margin-left: -0.25rem !important; } } + +@media (min-width: 50rem) { .m-md-2 { margin: 0.5rem !important; } .mt-md-2 { margin-top: 0.5rem !important; } .mr-md-2 { margin-right: 0.5rem !important; } .mb-md-2 { margin-bottom: 0.5rem !important; } .ml-md-2 { margin-left: 0.5rem !important; } .mx-md-2 { margin-right: 0.5rem !important; margin-left: 0.5rem !important; } .my-md-2 { margin-top: 0.5rem !important; margin-bottom: 0.5rem !important; } .mxn-md-2 { margin-right: -0.5rem !important; margin-left: -0.5rem !important; } } + +@media (min-width: 50rem) { .m-md-3 { margin: 0.75rem !important; } .mt-md-3 { margin-top: 0.75rem !important; } .mr-md-3 { margin-right: 0.75rem !important; } .mb-md-3 { margin-bottom: 0.75rem !important; } .ml-md-3 { margin-left: 0.75rem !important; } .mx-md-3 { margin-right: 0.75rem !important; margin-left: 0.75rem !important; } .my-md-3 { margin-top: 0.75rem !important; margin-bottom: 0.75rem !important; } .mxn-md-3 { margin-right: -0.75rem !important; margin-left: -0.75rem !important; } } + +@media (min-width: 50rem) { .m-md-4 { margin: 1rem !important; } .mt-md-4 { margin-top: 1rem !important; } .mr-md-4 { margin-right: 1rem !important; } .mb-md-4 { margin-bottom: 1rem !important; } .ml-md-4 { margin-left: 1rem !important; } .mx-md-4 { margin-right: 1rem !important; margin-left: 1rem !important; } .my-md-4 { margin-top: 1rem !important; margin-bottom: 1rem !important; } .mxn-md-4 { margin-right: -1rem !important; margin-left: -1rem !important; } } + +@media (min-width: 50rem) { .m-md-5 { margin: 1.5rem !important; } .mt-md-5 { margin-top: 1.5rem !important; } .mr-md-5 { margin-right: 1.5rem !important; } .mb-md-5 { margin-bottom: 1.5rem !important; } .ml-md-5 { margin-left: 1.5rem !important; } .mx-md-5 { margin-right: 1.5rem !important; margin-left: 1.5rem !important; } .my-md-5 { margin-top: 1.5rem !important; margin-bottom: 1.5rem !important; } .mxn-md-5 { margin-right: -1.5rem !important; margin-left: -1.5rem !important; } } + +@media (min-width: 50rem) { .m-md-6 { margin: 2rem !important; } .mt-md-6 { margin-top: 2rem !important; } .mr-md-6 { margin-right: 2rem !important; } .mb-md-6 { margin-bottom: 2rem !important; } .ml-md-6 { margin-left: 2rem !important; } .mx-md-6 { margin-right: 2rem !important; margin-left: 2rem !important; } .my-md-6 { margin-top: 2rem !important; margin-bottom: 2rem !important; } .mxn-md-6 { margin-right: -2rem !important; margin-left: -2rem !important; } } + +@media (min-width: 50rem) { .m-md-7 { margin: 2.5rem !important; } .mt-md-7 { margin-top: 2.5rem !important; } .mr-md-7 { margin-right: 2.5rem !important; } .mb-md-7 { margin-bottom: 2.5rem !important; } .ml-md-7 { margin-left: 2.5rem !important; } .mx-md-7 { margin-right: 2.5rem !important; margin-left: 2.5rem !important; } .my-md-7 { margin-top: 2.5rem !important; margin-bottom: 2.5rem !important; } .mxn-md-7 { margin-right: -2.5rem !important; margin-left: -2.5rem !important; } } + +@media (min-width: 50rem) { .m-md-8 { margin: 3rem !important; } .mt-md-8 { margin-top: 3rem !important; } .mr-md-8 { margin-right: 3rem !important; } .mb-md-8 { margin-bottom: 3rem !important; } .ml-md-8 { margin-left: 3rem !important; } .mx-md-8 { margin-right: 3rem !important; margin-left: 3rem !important; } .my-md-8 { margin-top: 3rem !important; margin-bottom: 3rem !important; } .mxn-md-8 { margin-right: -3rem !important; margin-left: -3rem !important; } } + +@media (min-width: 50rem) { .m-md-9 { margin: 3.5rem !important; } .mt-md-9 { margin-top: 3.5rem !important; } .mr-md-9 { margin-right: 3.5rem !important; } .mb-md-9 { margin-bottom: 3.5rem !important; } .ml-md-9 { margin-left: 3.5rem !important; } .mx-md-9 { margin-right: 3.5rem !important; margin-left: 3.5rem !important; } .my-md-9 { margin-top: 3.5rem !important; margin-bottom: 3.5rem !important; } .mxn-md-9 { margin-right: -3.5rem !important; margin-left: -3.5rem !important; } } + +@media (min-width: 50rem) { .m-md-10 { margin: 4rem !important; } .mt-md-10 { margin-top: 4rem !important; } .mr-md-10 { margin-right: 4rem !important; } .mb-md-10 { margin-bottom: 4rem !important; } .ml-md-10 { margin-left: 4rem !important; } .mx-md-10 { margin-right: 4rem !important; margin-left: 4rem !important; } .my-md-10 { margin-top: 4rem !important; margin-bottom: 4rem !important; } .mxn-md-10 { margin-right: -4rem !important; margin-left: -4rem !important; } } + +@media (min-width: 66.5rem) { .m-lg-0 { margin: 0 !important; } .mt-lg-0 { margin-top: 0 !important; } .mr-lg-0 { margin-right: 0 !important; } .mb-lg-0 { margin-bottom: 0 !important; } .ml-lg-0 { margin-left: 0 !important; } .mx-lg-0 { margin-right: 0 !important; margin-left: 0 !important; } .my-lg-0 { margin-top: 0 !important; margin-bottom: 0 !important; } .mxn-lg-0 { margin-right: -0 !important; margin-left: -0 !important; } } + +@media (min-width: 66.5rem) { .m-lg-1 { margin: 0.25rem !important; } .mt-lg-1 { margin-top: 0.25rem !important; } .mr-lg-1 { margin-right: 0.25rem !important; } .mb-lg-1 { margin-bottom: 0.25rem !important; } .ml-lg-1 { margin-left: 0.25rem !important; } .mx-lg-1 { margin-right: 0.25rem !important; margin-left: 0.25rem !important; } .my-lg-1 { margin-top: 0.25rem !important; margin-bottom: 0.25rem !important; } .mxn-lg-1 { margin-right: -0.25rem !important; margin-left: -0.25rem !important; } } + +@media (min-width: 66.5rem) { .m-lg-2 { margin: 0.5rem !important; } .mt-lg-2 { margin-top: 0.5rem !important; } .mr-lg-2 { margin-right: 0.5rem !important; } .mb-lg-2 { margin-bottom: 0.5rem !important; } .ml-lg-2 { margin-left: 0.5rem !important; } .mx-lg-2 { margin-right: 0.5rem !important; margin-left: 0.5rem !important; } .my-lg-2 { margin-top: 0.5rem !important; margin-bottom: 0.5rem !important; } .mxn-lg-2 { margin-right: -0.5rem !important; margin-left: -0.5rem !important; } } + +@media (min-width: 66.5rem) { .m-lg-3 { margin: 0.75rem !important; } .mt-lg-3 { margin-top: 0.75rem !important; } .mr-lg-3 { margin-right: 0.75rem !important; } .mb-lg-3 { margin-bottom: 0.75rem !important; } .ml-lg-3 { margin-left: 0.75rem !important; } .mx-lg-3 { margin-right: 0.75rem !important; margin-left: 0.75rem !important; } .my-lg-3 { margin-top: 0.75rem !important; margin-bottom: 0.75rem !important; } .mxn-lg-3 { margin-right: -0.75rem !important; margin-left: -0.75rem !important; } } + +@media (min-width: 66.5rem) { .m-lg-4 { margin: 1rem !important; } .mt-lg-4 { margin-top: 1rem !important; } .mr-lg-4 { margin-right: 1rem !important; } .mb-lg-4 { margin-bottom: 1rem !important; } .ml-lg-4 { margin-left: 1rem !important; } .mx-lg-4 { margin-right: 1rem !important; margin-left: 1rem !important; } .my-lg-4 { margin-top: 1rem !important; margin-bottom: 1rem !important; } .mxn-lg-4 { margin-right: -1rem !important; margin-left: -1rem !important; } } + +@media (min-width: 66.5rem) { .m-lg-5 { margin: 1.5rem !important; } .mt-lg-5 { margin-top: 1.5rem !important; } .mr-lg-5 { margin-right: 1.5rem !important; } .mb-lg-5 { margin-bottom: 1.5rem !important; } .ml-lg-5 { margin-left: 1.5rem !important; } .mx-lg-5 { margin-right: 1.5rem !important; margin-left: 1.5rem !important; } .my-lg-5 { margin-top: 1.5rem !important; margin-bottom: 1.5rem !important; } .mxn-lg-5 { margin-right: -1.5rem !important; margin-left: -1.5rem !important; } } + +@media (min-width: 66.5rem) { .m-lg-6 { margin: 2rem !important; } .mt-lg-6 { margin-top: 2rem !important; } .mr-lg-6 { margin-right: 2rem !important; } .mb-lg-6 { margin-bottom: 2rem !important; } .ml-lg-6 { margin-left: 2rem !important; } .mx-lg-6 { margin-right: 2rem !important; margin-left: 2rem !important; } .my-lg-6 { margin-top: 2rem !important; margin-bottom: 2rem !important; } .mxn-lg-6 { margin-right: -2rem !important; margin-left: -2rem !important; } } + +@media (min-width: 66.5rem) { .m-lg-7 { margin: 2.5rem !important; } .mt-lg-7 { margin-top: 2.5rem !important; } .mr-lg-7 { margin-right: 2.5rem !important; } .mb-lg-7 { margin-bottom: 2.5rem !important; } .ml-lg-7 { margin-left: 2.5rem !important; } .mx-lg-7 { margin-right: 2.5rem !important; margin-left: 2.5rem !important; } .my-lg-7 { margin-top: 2.5rem !important; margin-bottom: 2.5rem !important; } .mxn-lg-7 { margin-right: -2.5rem !important; margin-left: -2.5rem !important; } } + +@media (min-width: 66.5rem) { .m-lg-8 { margin: 3rem !important; } .mt-lg-8 { margin-top: 3rem !important; } .mr-lg-8 { margin-right: 3rem !important; } .mb-lg-8 { margin-bottom: 3rem !important; } .ml-lg-8 { margin-left: 3rem !important; } .mx-lg-8 { margin-right: 3rem !important; margin-left: 3rem !important; } .my-lg-8 { margin-top: 3rem !important; margin-bottom: 3rem !important; } .mxn-lg-8 { margin-right: -3rem !important; margin-left: -3rem !important; } } + +@media (min-width: 66.5rem) { .m-lg-9 { margin: 3.5rem !important; } .mt-lg-9 { margin-top: 3.5rem !important; } .mr-lg-9 { margin-right: 3.5rem !important; } .mb-lg-9 { margin-bottom: 3.5rem !important; } .ml-lg-9 { margin-left: 3.5rem !important; } .mx-lg-9 { margin-right: 3.5rem !important; margin-left: 3.5rem !important; } .my-lg-9 { margin-top: 3.5rem !important; margin-bottom: 3.5rem !important; } .mxn-lg-9 { margin-right: -3.5rem !important; margin-left: -3.5rem !important; } } + +@media (min-width: 66.5rem) { .m-lg-10 { margin: 4rem !important; } .mt-lg-10 { margin-top: 4rem !important; } .mr-lg-10 { margin-right: 4rem !important; } .mb-lg-10 { margin-bottom: 4rem !important; } .ml-lg-10 { margin-left: 4rem !important; } .mx-lg-10 { margin-right: 4rem !important; margin-left: 4rem !important; } .my-lg-10 { margin-top: 4rem !important; margin-bottom: 4rem !important; } .mxn-lg-10 { margin-right: -4rem !important; margin-left: -4rem !important; } } + +@media (min-width: 87.5rem) { .m-xl-0 { margin: 0 !important; } .mt-xl-0 { margin-top: 0 !important; } .mr-xl-0 { margin-right: 0 !important; } .mb-xl-0 { margin-bottom: 0 !important; } .ml-xl-0 { margin-left: 0 !important; } .mx-xl-0 { margin-right: 0 !important; margin-left: 0 !important; } .my-xl-0 { margin-top: 0 !important; margin-bottom: 0 !important; } .mxn-xl-0 { margin-right: -0 !important; margin-left: -0 !important; } } + +@media (min-width: 87.5rem) { .m-xl-1 { margin: 0.25rem !important; } .mt-xl-1 { margin-top: 0.25rem !important; } .mr-xl-1 { margin-right: 0.25rem !important; } .mb-xl-1 { margin-bottom: 0.25rem !important; } .ml-xl-1 { margin-left: 0.25rem !important; } .mx-xl-1 { margin-right: 0.25rem !important; margin-left: 0.25rem !important; } .my-xl-1 { margin-top: 0.25rem !important; margin-bottom: 0.25rem !important; } .mxn-xl-1 { margin-right: -0.25rem !important; margin-left: -0.25rem !important; } } + +@media (min-width: 87.5rem) { .m-xl-2 { margin: 0.5rem !important; } .mt-xl-2 { margin-top: 0.5rem !important; } .mr-xl-2 { margin-right: 0.5rem !important; } .mb-xl-2 { margin-bottom: 0.5rem !important; } .ml-xl-2 { margin-left: 0.5rem !important; } .mx-xl-2 { margin-right: 0.5rem !important; margin-left: 0.5rem !important; } .my-xl-2 { margin-top: 0.5rem !important; margin-bottom: 0.5rem !important; } .mxn-xl-2 { margin-right: -0.5rem !important; margin-left: -0.5rem !important; } } + +@media (min-width: 87.5rem) { .m-xl-3 { margin: 0.75rem !important; } .mt-xl-3 { margin-top: 0.75rem !important; } .mr-xl-3 { margin-right: 0.75rem !important; } .mb-xl-3 { margin-bottom: 0.75rem !important; } .ml-xl-3 { margin-left: 0.75rem !important; } .mx-xl-3 { margin-right: 0.75rem !important; margin-left: 0.75rem !important; } .my-xl-3 { margin-top: 0.75rem !important; margin-bottom: 0.75rem !important; } .mxn-xl-3 { margin-right: -0.75rem !important; margin-left: -0.75rem !important; } } + +@media (min-width: 87.5rem) { .m-xl-4 { margin: 1rem !important; } .mt-xl-4 { margin-top: 1rem !important; } .mr-xl-4 { margin-right: 1rem !important; } .mb-xl-4 { margin-bottom: 1rem !important; } .ml-xl-4 { margin-left: 1rem !important; } .mx-xl-4 { margin-right: 1rem !important; margin-left: 1rem !important; } .my-xl-4 { margin-top: 1rem !important; margin-bottom: 1rem !important; } .mxn-xl-4 { margin-right: -1rem !important; margin-left: -1rem !important; } } + +@media (min-width: 87.5rem) { .m-xl-5 { margin: 1.5rem !important; } .mt-xl-5 { margin-top: 1.5rem !important; } .mr-xl-5 { margin-right: 1.5rem !important; } .mb-xl-5 { margin-bottom: 1.5rem !important; } .ml-xl-5 { margin-left: 1.5rem !important; } .mx-xl-5 { margin-right: 1.5rem !important; margin-left: 1.5rem !important; } .my-xl-5 { margin-top: 1.5rem !important; margin-bottom: 1.5rem !important; } .mxn-xl-5 { margin-right: -1.5rem !important; margin-left: -1.5rem !important; } } + +@media (min-width: 87.5rem) { .m-xl-6 { margin: 2rem !important; } .mt-xl-6 { margin-top: 2rem !important; } .mr-xl-6 { margin-right: 2rem !important; } .mb-xl-6 { margin-bottom: 2rem !important; } .ml-xl-6 { margin-left: 2rem !important; } .mx-xl-6 { margin-right: 2rem !important; margin-left: 2rem !important; } .my-xl-6 { margin-top: 2rem !important; margin-bottom: 2rem !important; } .mxn-xl-6 { margin-right: -2rem !important; margin-left: -2rem !important; } } + +@media (min-width: 87.5rem) { .m-xl-7 { margin: 2.5rem !important; } .mt-xl-7 { margin-top: 2.5rem !important; } .mr-xl-7 { margin-right: 2.5rem !important; } .mb-xl-7 { margin-bottom: 2.5rem !important; } .ml-xl-7 { margin-left: 2.5rem !important; } .mx-xl-7 { margin-right: 2.5rem !important; margin-left: 2.5rem !important; } .my-xl-7 { margin-top: 2.5rem !important; margin-bottom: 2.5rem !important; } .mxn-xl-7 { margin-right: -2.5rem !important; margin-left: -2.5rem !important; } } + +@media (min-width: 87.5rem) { .m-xl-8 { margin: 3rem !important; } .mt-xl-8 { margin-top: 3rem !important; } .mr-xl-8 { margin-right: 3rem !important; } .mb-xl-8 { margin-bottom: 3rem !important; } .ml-xl-8 { margin-left: 3rem !important; } .mx-xl-8 { margin-right: 3rem !important; margin-left: 3rem !important; } .my-xl-8 { margin-top: 3rem !important; margin-bottom: 3rem !important; } .mxn-xl-8 { margin-right: -3rem !important; margin-left: -3rem !important; } } + +@media (min-width: 87.5rem) { .m-xl-9 { margin: 3.5rem !important; } .mt-xl-9 { margin-top: 3.5rem !important; } .mr-xl-9 { margin-right: 3.5rem !important; } .mb-xl-9 { margin-bottom: 3.5rem !important; } .ml-xl-9 { margin-left: 3.5rem !important; } .mx-xl-9 { margin-right: 3.5rem !important; margin-left: 3.5rem !important; } .my-xl-9 { margin-top: 3.5rem !important; margin-bottom: 3.5rem !important; } .mxn-xl-9 { margin-right: -3.5rem !important; margin-left: -3.5rem !important; } } + +@media (min-width: 87.5rem) { .m-xl-10 { margin: 4rem !important; } .mt-xl-10 { margin-top: 4rem !important; } .mr-xl-10 { margin-right: 4rem !important; } .mb-xl-10 { margin-bottom: 4rem !important; } .ml-xl-10 { margin-left: 4rem !important; } .mx-xl-10 { margin-right: 4rem !important; margin-left: 4rem !important; } .my-xl-10 { margin-top: 4rem !important; margin-bottom: 4rem !important; } .mxn-xl-10 { margin-right: -4rem !important; margin-left: -4rem !important; } } + +.p-0 { padding: 0 !important; } + +.pt-0 { padding-top: 0 !important; } + +.pr-0 { padding-right: 0 !important; } + +.pb-0 { padding-bottom: 0 !important; } + +.pl-0 { padding-left: 0 !important; } + +.px-0 { padding-right: 0 !important; padding-left: 0 !important; } + +.py-0 { padding-top: 0 !important; padding-bottom: 0 !important; } + +.p-1 { padding: 0.25rem !important; } + +.pt-1 { padding-top: 0.25rem !important; } + +.pr-1 { padding-right: 0.25rem !important; } + +.pb-1 { padding-bottom: 0.25rem !important; } + +.pl-1 { padding-left: 0.25rem !important; } + +.px-1 { padding-right: 0.25rem !important; padding-left: 0.25rem !important; } + +.py-1 { padding-top: 0.25rem !important; padding-bottom: 0.25rem !important; } + +.p-2 { padding: 0.5rem !important; } + +.pt-2 { padding-top: 0.5rem !important; } + +.pr-2 { padding-right: 0.5rem !important; } + +.pb-2 { padding-bottom: 0.5rem !important; } + +.pl-2 { padding-left: 0.5rem !important; } + +.px-2 { padding-right: 0.5rem !important; padding-left: 0.5rem !important; } + +.py-2 { padding-top: 0.5rem !important; padding-bottom: 0.5rem !important; } + +.p-3 { padding: 0.75rem !important; } + +.pt-3 { padding-top: 0.75rem !important; } + +.pr-3 { padding-right: 0.75rem !important; } + +.pb-3 { padding-bottom: 0.75rem !important; } + +.pl-3 { padding-left: 0.75rem !important; } + +.px-3 { padding-right: 0.75rem !important; padding-left: 0.75rem !important; } + +.py-3 { padding-top: 0.75rem !important; padding-bottom: 0.75rem !important; } + +.p-4 { padding: 1rem !important; } + +.pt-4 { padding-top: 1rem !important; } + +.pr-4 { padding-right: 1rem !important; } + +.pb-4 { padding-bottom: 1rem !important; } + +.pl-4 { padding-left: 1rem !important; } + +.px-4 { padding-right: 1rem !important; padding-left: 1rem !important; } + +.py-4 { padding-top: 1rem !important; padding-bottom: 1rem !important; } + +.p-5 { padding: 1.5rem !important; } + +.pt-5 { padding-top: 1.5rem !important; } + +.pr-5 { padding-right: 1.5rem !important; } + +.pb-5 { padding-bottom: 1.5rem !important; } + +.pl-5 { padding-left: 1.5rem !important; } + +.px-5 { padding-right: 1.5rem !important; padding-left: 1.5rem !important; } + +.py-5 { padding-top: 1.5rem !important; padding-bottom: 1.5rem !important; } + +.p-6 { padding: 2rem !important; } + +.pt-6 { padding-top: 2rem !important; } + +.pr-6 { padding-right: 2rem !important; } + +.pb-6 { padding-bottom: 2rem !important; } + +.pl-6 { padding-left: 2rem !important; } + +.px-6 { padding-right: 2rem !important; padding-left: 2rem !important; } + +.py-6 { padding-top: 2rem !important; padding-bottom: 2rem !important; } + +.p-7 { padding: 2.5rem !important; } + +.pt-7 { padding-top: 2.5rem !important; } + +.pr-7 { padding-right: 2.5rem !important; } + +.pb-7 { padding-bottom: 2.5rem !important; } + +.pl-7 { padding-left: 2.5rem !important; } + +.px-7 { padding-right: 2.5rem !important; padding-left: 2.5rem !important; } + +.py-7 { padding-top: 2.5rem !important; padding-bottom: 2.5rem !important; } + +.p-8 { padding: 3rem !important; } + +.pt-8 { padding-top: 3rem !important; } + +.pr-8 { padding-right: 3rem !important; } + +.pb-8 { padding-bottom: 3rem !important; } + +.pl-8 { padding-left: 3rem !important; } + +.px-8 { padding-right: 3rem !important; padding-left: 3rem !important; } + +.py-8 { padding-top: 3rem !important; padding-bottom: 3rem !important; } + +.p-9 { padding: 3.5rem !important; } + +.pt-9 { padding-top: 3.5rem !important; } + +.pr-9 { padding-right: 3.5rem !important; } + +.pb-9 { padding-bottom: 3.5rem !important; } + +.pl-9 { padding-left: 3.5rem !important; } + +.px-9 { padding-right: 3.5rem !important; padding-left: 3.5rem !important; } + +.py-9 { padding-top: 3.5rem !important; padding-bottom: 3.5rem !important; } + +.p-10 { padding: 4rem !important; } + +.pt-10 { padding-top: 4rem !important; } + +.pr-10 { padding-right: 4rem !important; } + +.pb-10 { padding-bottom: 4rem !important; } + +.pl-10 { padding-left: 4rem !important; } + +.px-10 { padding-right: 4rem !important; padding-left: 4rem !important; } + +.py-10 { padding-top: 4rem !important; padding-bottom: 4rem !important; } + +@media (min-width: 20rem) { .p-xs-0 { padding: 0 !important; } .pt-xs-0 { padding-top: 0 !important; } .pr-xs-0 { padding-right: 0 !important; } .pb-xs-0 { padding-bottom: 0 !important; } .pl-xs-0 { padding-left: 0 !important; } .px-xs-0 { padding-right: 0 !important; padding-left: 0 !important; } .py-xs-0 { padding-top: 0 !important; padding-bottom: 0 !important; } .p-xs-1 { padding: 0.25rem !important; } .pt-xs-1 { padding-top: 0.25rem !important; } .pr-xs-1 { padding-right: 0.25rem !important; } .pb-xs-1 { padding-bottom: 0.25rem !important; } .pl-xs-1 { padding-left: 0.25rem !important; } .px-xs-1 { padding-right: 0.25rem !important; padding-left: 0.25rem !important; } .py-xs-1 { padding-top: 0.25rem !important; padding-bottom: 0.25rem !important; } .p-xs-2 { padding: 0.5rem !important; } .pt-xs-2 { padding-top: 0.5rem !important; } .pr-xs-2 { padding-right: 0.5rem !important; } .pb-xs-2 { padding-bottom: 0.5rem !important; } .pl-xs-2 { padding-left: 0.5rem !important; } .px-xs-2 { padding-right: 0.5rem !important; padding-left: 0.5rem !important; } .py-xs-2 { padding-top: 0.5rem !important; padding-bottom: 0.5rem !important; } .p-xs-3 { padding: 0.75rem !important; } .pt-xs-3 { padding-top: 0.75rem !important; } .pr-xs-3 { padding-right: 0.75rem !important; } .pb-xs-3 { padding-bottom: 0.75rem !important; } .pl-xs-3 { padding-left: 0.75rem !important; } .px-xs-3 { padding-right: 0.75rem !important; padding-left: 0.75rem !important; } .py-xs-3 { padding-top: 0.75rem !important; padding-bottom: 0.75rem !important; } .p-xs-4 { padding: 1rem !important; } .pt-xs-4 { padding-top: 1rem !important; } .pr-xs-4 { padding-right: 1rem !important; } .pb-xs-4 { padding-bottom: 1rem !important; } .pl-xs-4 { padding-left: 1rem !important; } .px-xs-4 { padding-right: 1rem !important; padding-left: 1rem !important; } .py-xs-4 { padding-top: 1rem !important; padding-bottom: 1rem !important; } .p-xs-5 { padding: 1.5rem !important; } .pt-xs-5 { padding-top: 1.5rem !important; } .pr-xs-5 { padding-right: 1.5rem !important; } .pb-xs-5 { padding-bottom: 1.5rem !important; } .pl-xs-5 { padding-left: 1.5rem !important; } .px-xs-5 { padding-right: 1.5rem !important; padding-left: 1.5rem !important; } .py-xs-5 { padding-top: 1.5rem !important; padding-bottom: 1.5rem !important; } .p-xs-6 { padding: 2rem !important; } .pt-xs-6 { padding-top: 2rem !important; } .pr-xs-6 { padding-right: 2rem !important; } .pb-xs-6 { padding-bottom: 2rem !important; } .pl-xs-6 { padding-left: 2rem !important; } .px-xs-6 { padding-right: 2rem !important; padding-left: 2rem !important; } .py-xs-6 { padding-top: 2rem !important; padding-bottom: 2rem !important; } .p-xs-7 { padding: 2.5rem !important; } .pt-xs-7 { padding-top: 2.5rem !important; } .pr-xs-7 { padding-right: 2.5rem !important; } .pb-xs-7 { padding-bottom: 2.5rem !important; } .pl-xs-7 { padding-left: 2.5rem !important; } .px-xs-7 { padding-right: 2.5rem !important; padding-left: 2.5rem !important; } .py-xs-7 { padding-top: 2.5rem !important; padding-bottom: 2.5rem !important; } .p-xs-8 { padding: 3rem !important; } .pt-xs-8 { padding-top: 3rem !important; } .pr-xs-8 { padding-right: 3rem !important; } .pb-xs-8 { padding-bottom: 3rem !important; } .pl-xs-8 { padding-left: 3rem !important; } .px-xs-8 { padding-right: 3rem !important; padding-left: 3rem !important; } .py-xs-8 { padding-top: 3rem !important; padding-bottom: 3rem !important; } .p-xs-9 { padding: 3.5rem !important; } .pt-xs-9 { padding-top: 3.5rem !important; } .pr-xs-9 { padding-right: 3.5rem !important; } .pb-xs-9 { padding-bottom: 3.5rem !important; } .pl-xs-9 { padding-left: 3.5rem !important; } .px-xs-9 { padding-right: 3.5rem !important; padding-left: 3.5rem !important; } .py-xs-9 { padding-top: 3.5rem !important; padding-bottom: 3.5rem !important; } .p-xs-10 { padding: 4rem !important; } .pt-xs-10 { padding-top: 4rem !important; } .pr-xs-10 { padding-right: 4rem !important; } .pb-xs-10 { padding-bottom: 4rem !important; } .pl-xs-10 { padding-left: 4rem !important; } .px-xs-10 { padding-right: 4rem !important; padding-left: 4rem !important; } .py-xs-10 { padding-top: 4rem !important; padding-bottom: 4rem !important; } } + +@media (min-width: 31.25rem) { .p-sm-0 { padding: 0 !important; } .pt-sm-0 { padding-top: 0 !important; } .pr-sm-0 { padding-right: 0 !important; } .pb-sm-0 { padding-bottom: 0 !important; } .pl-sm-0 { padding-left: 0 !important; } .px-sm-0 { padding-right: 0 !important; padding-left: 0 !important; } .py-sm-0 { padding-top: 0 !important; padding-bottom: 0 !important; } .p-sm-1 { padding: 0.25rem !important; } .pt-sm-1 { padding-top: 0.25rem !important; } .pr-sm-1 { padding-right: 0.25rem !important; } .pb-sm-1 { padding-bottom: 0.25rem !important; } .pl-sm-1 { padding-left: 0.25rem !important; } .px-sm-1 { padding-right: 0.25rem !important; padding-left: 0.25rem !important; } .py-sm-1 { padding-top: 0.25rem !important; padding-bottom: 0.25rem !important; } .p-sm-2 { padding: 0.5rem !important; } .pt-sm-2 { padding-top: 0.5rem !important; } .pr-sm-2 { padding-right: 0.5rem !important; } .pb-sm-2 { padding-bottom: 0.5rem !important; } .pl-sm-2 { padding-left: 0.5rem !important; } .px-sm-2 { padding-right: 0.5rem !important; padding-left: 0.5rem !important; } .py-sm-2 { padding-top: 0.5rem !important; padding-bottom: 0.5rem !important; } .p-sm-3 { padding: 0.75rem !important; } .pt-sm-3 { padding-top: 0.75rem !important; } .pr-sm-3 { padding-right: 0.75rem !important; } .pb-sm-3 { padding-bottom: 0.75rem !important; } .pl-sm-3 { padding-left: 0.75rem !important; } .px-sm-3 { padding-right: 0.75rem !important; padding-left: 0.75rem !important; } .py-sm-3 { padding-top: 0.75rem !important; padding-bottom: 0.75rem !important; } .p-sm-4 { padding: 1rem !important; } .pt-sm-4 { padding-top: 1rem !important; } .pr-sm-4 { padding-right: 1rem !important; } .pb-sm-4 { padding-bottom: 1rem !important; } .pl-sm-4 { padding-left: 1rem !important; } .px-sm-4 { padding-right: 1rem !important; padding-left: 1rem !important; } .py-sm-4 { padding-top: 1rem !important; padding-bottom: 1rem !important; } .p-sm-5 { padding: 1.5rem !important; } .pt-sm-5 { padding-top: 1.5rem !important; } .pr-sm-5 { padding-right: 1.5rem !important; } .pb-sm-5 { padding-bottom: 1.5rem !important; } .pl-sm-5 { padding-left: 1.5rem !important; } .px-sm-5 { padding-right: 1.5rem !important; padding-left: 1.5rem !important; } .py-sm-5 { padding-top: 1.5rem !important; padding-bottom: 1.5rem !important; } .p-sm-6 { padding: 2rem !important; } .pt-sm-6 { padding-top: 2rem !important; } .pr-sm-6 { padding-right: 2rem !important; } .pb-sm-6 { padding-bottom: 2rem !important; } .pl-sm-6 { padding-left: 2rem !important; } .px-sm-6 { padding-right: 2rem !important; padding-left: 2rem !important; } .py-sm-6 { padding-top: 2rem !important; padding-bottom: 2rem !important; } .p-sm-7 { padding: 2.5rem !important; } .pt-sm-7 { padding-top: 2.5rem !important; } .pr-sm-7 { padding-right: 2.5rem !important; } .pb-sm-7 { padding-bottom: 2.5rem !important; } .pl-sm-7 { padding-left: 2.5rem !important; } .px-sm-7 { padding-right: 2.5rem !important; padding-left: 2.5rem !important; } .py-sm-7 { padding-top: 2.5rem !important; padding-bottom: 2.5rem !important; } .p-sm-8 { padding: 3rem !important; } .pt-sm-8 { padding-top: 3rem !important; } .pr-sm-8 { padding-right: 3rem !important; } .pb-sm-8 { padding-bottom: 3rem !important; } .pl-sm-8 { padding-left: 3rem !important; } .px-sm-8 { padding-right: 3rem !important; padding-left: 3rem !important; } .py-sm-8 { padding-top: 3rem !important; padding-bottom: 3rem !important; } .p-sm-9 { padding: 3.5rem !important; } .pt-sm-9 { padding-top: 3.5rem !important; } .pr-sm-9 { padding-right: 3.5rem !important; } .pb-sm-9 { padding-bottom: 3.5rem !important; } .pl-sm-9 { padding-left: 3.5rem !important; } .px-sm-9 { padding-right: 3.5rem !important; padding-left: 3.5rem !important; } .py-sm-9 { padding-top: 3.5rem !important; padding-bottom: 3.5rem !important; } .p-sm-10 { padding: 4rem !important; } .pt-sm-10 { padding-top: 4rem !important; } .pr-sm-10 { padding-right: 4rem !important; } .pb-sm-10 { padding-bottom: 4rem !important; } .pl-sm-10 { padding-left: 4rem !important; } .px-sm-10 { padding-right: 4rem !important; padding-left: 4rem !important; } .py-sm-10 { padding-top: 4rem !important; padding-bottom: 4rem !important; } } + +@media (min-width: 50rem) { .p-md-0 { padding: 0 !important; } .pt-md-0 { padding-top: 0 !important; } .pr-md-0 { padding-right: 0 !important; } .pb-md-0 { padding-bottom: 0 !important; } .pl-md-0 { padding-left: 0 !important; } .px-md-0 { padding-right: 0 !important; padding-left: 0 !important; } .py-md-0 { padding-top: 0 !important; padding-bottom: 0 !important; } .p-md-1 { padding: 0.25rem !important; } .pt-md-1 { padding-top: 0.25rem !important; } .pr-md-1 { padding-right: 0.25rem !important; } .pb-md-1 { padding-bottom: 0.25rem !important; } .pl-md-1 { padding-left: 0.25rem !important; } .px-md-1 { padding-right: 0.25rem !important; padding-left: 0.25rem !important; } .py-md-1 { padding-top: 0.25rem !important; padding-bottom: 0.25rem !important; } .p-md-2 { padding: 0.5rem !important; } .pt-md-2 { padding-top: 0.5rem !important; } .pr-md-2 { padding-right: 0.5rem !important; } .pb-md-2 { padding-bottom: 0.5rem !important; } .pl-md-2 { padding-left: 0.5rem !important; } .px-md-2 { padding-right: 0.5rem !important; padding-left: 0.5rem !important; } .py-md-2 { padding-top: 0.5rem !important; padding-bottom: 0.5rem !important; } .p-md-3 { padding: 0.75rem !important; } .pt-md-3 { padding-top: 0.75rem !important; } .pr-md-3 { padding-right: 0.75rem !important; } .pb-md-3 { padding-bottom: 0.75rem !important; } .pl-md-3 { padding-left: 0.75rem !important; } .px-md-3 { padding-right: 0.75rem !important; padding-left: 0.75rem !important; } .py-md-3 { padding-top: 0.75rem !important; padding-bottom: 0.75rem !important; } .p-md-4 { padding: 1rem !important; } .pt-md-4 { padding-top: 1rem !important; } .pr-md-4 { padding-right: 1rem !important; } .pb-md-4 { padding-bottom: 1rem !important; } .pl-md-4 { padding-left: 1rem !important; } .px-md-4 { padding-right: 1rem !important; padding-left: 1rem !important; } .py-md-4 { padding-top: 1rem !important; padding-bottom: 1rem !important; } .p-md-5 { padding: 1.5rem !important; } .pt-md-5 { padding-top: 1.5rem !important; } .pr-md-5 { padding-right: 1.5rem !important; } .pb-md-5 { padding-bottom: 1.5rem !important; } .pl-md-5 { padding-left: 1.5rem !important; } .px-md-5 { padding-right: 1.5rem !important; padding-left: 1.5rem !important; } .py-md-5 { padding-top: 1.5rem !important; padding-bottom: 1.5rem !important; } .p-md-6 { padding: 2rem !important; } .pt-md-6 { padding-top: 2rem !important; } .pr-md-6 { padding-right: 2rem !important; } .pb-md-6 { padding-bottom: 2rem !important; } .pl-md-6 { padding-left: 2rem !important; } .px-md-6 { padding-right: 2rem !important; padding-left: 2rem !important; } .py-md-6 { padding-top: 2rem !important; padding-bottom: 2rem !important; } .p-md-7 { padding: 2.5rem !important; } .pt-md-7 { padding-top: 2.5rem !important; } .pr-md-7 { padding-right: 2.5rem !important; } .pb-md-7 { padding-bottom: 2.5rem !important; } .pl-md-7 { padding-left: 2.5rem !important; } .px-md-7 { padding-right: 2.5rem !important; padding-left: 2.5rem !important; } .py-md-7 { padding-top: 2.5rem !important; padding-bottom: 2.5rem !important; } .p-md-8 { padding: 3rem !important; } .pt-md-8 { padding-top: 3rem !important; } .pr-md-8 { padding-right: 3rem !important; } .pb-md-8 { padding-bottom: 3rem !important; } .pl-md-8 { padding-left: 3rem !important; } .px-md-8 { padding-right: 3rem !important; padding-left: 3rem !important; } .py-md-8 { padding-top: 3rem !important; padding-bottom: 3rem !important; } .p-md-9 { padding: 3.5rem !important; } .pt-md-9 { padding-top: 3.5rem !important; } .pr-md-9 { padding-right: 3.5rem !important; } .pb-md-9 { padding-bottom: 3.5rem !important; } .pl-md-9 { padding-left: 3.5rem !important; } .px-md-9 { padding-right: 3.5rem !important; padding-left: 3.5rem !important; } .py-md-9 { padding-top: 3.5rem !important; padding-bottom: 3.5rem !important; } .p-md-10 { padding: 4rem !important; } .pt-md-10 { padding-top: 4rem !important; } .pr-md-10 { padding-right: 4rem !important; } .pb-md-10 { padding-bottom: 4rem !important; } .pl-md-10 { padding-left: 4rem !important; } .px-md-10 { padding-right: 4rem !important; padding-left: 4rem !important; } .py-md-10 { padding-top: 4rem !important; padding-bottom: 4rem !important; } } + +@media (min-width: 66.5rem) { .p-lg-0 { padding: 0 !important; } .pt-lg-0 { padding-top: 0 !important; } .pr-lg-0 { padding-right: 0 !important; } .pb-lg-0 { padding-bottom: 0 !important; } .pl-lg-0 { padding-left: 0 !important; } .px-lg-0 { padding-right: 0 !important; padding-left: 0 !important; } .py-lg-0 { padding-top: 0 !important; padding-bottom: 0 !important; } .p-lg-1 { padding: 0.25rem !important; } .pt-lg-1 { padding-top: 0.25rem !important; } .pr-lg-1 { padding-right: 0.25rem !important; } .pb-lg-1 { padding-bottom: 0.25rem !important; } .pl-lg-1 { padding-left: 0.25rem !important; } .px-lg-1 { padding-right: 0.25rem !important; padding-left: 0.25rem !important; } .py-lg-1 { padding-top: 0.25rem !important; padding-bottom: 0.25rem !important; } .p-lg-2 { padding: 0.5rem !important; } .pt-lg-2 { padding-top: 0.5rem !important; } .pr-lg-2 { padding-right: 0.5rem !important; } .pb-lg-2 { padding-bottom: 0.5rem !important; } .pl-lg-2 { padding-left: 0.5rem !important; } .px-lg-2 { padding-right: 0.5rem !important; padding-left: 0.5rem !important; } .py-lg-2 { padding-top: 0.5rem !important; padding-bottom: 0.5rem !important; } .p-lg-3 { padding: 0.75rem !important; } .pt-lg-3 { padding-top: 0.75rem !important; } .pr-lg-3 { padding-right: 0.75rem !important; } .pb-lg-3 { padding-bottom: 0.75rem !important; } .pl-lg-3 { padding-left: 0.75rem !important; } .px-lg-3 { padding-right: 0.75rem !important; padding-left: 0.75rem !important; } .py-lg-3 { padding-top: 0.75rem !important; padding-bottom: 0.75rem !important; } .p-lg-4 { padding: 1rem !important; } .pt-lg-4 { padding-top: 1rem !important; } .pr-lg-4 { padding-right: 1rem !important; } .pb-lg-4 { padding-bottom: 1rem !important; } .pl-lg-4 { padding-left: 1rem !important; } .px-lg-4 { padding-right: 1rem !important; padding-left: 1rem !important; } .py-lg-4 { padding-top: 1rem !important; padding-bottom: 1rem !important; } .p-lg-5 { padding: 1.5rem !important; } .pt-lg-5 { padding-top: 1.5rem !important; } .pr-lg-5 { padding-right: 1.5rem !important; } .pb-lg-5 { padding-bottom: 1.5rem !important; } .pl-lg-5 { padding-left: 1.5rem !important; } .px-lg-5 { padding-right: 1.5rem !important; padding-left: 1.5rem !important; } .py-lg-5 { padding-top: 1.5rem !important; padding-bottom: 1.5rem !important; } .p-lg-6 { padding: 2rem !important; } .pt-lg-6 { padding-top: 2rem !important; } .pr-lg-6 { padding-right: 2rem !important; } .pb-lg-6 { padding-bottom: 2rem !important; } .pl-lg-6 { padding-left: 2rem !important; } .px-lg-6 { padding-right: 2rem !important; padding-left: 2rem !important; } .py-lg-6 { padding-top: 2rem !important; padding-bottom: 2rem !important; } .p-lg-7 { padding: 2.5rem !important; } .pt-lg-7 { padding-top: 2.5rem !important; } .pr-lg-7 { padding-right: 2.5rem !important; } .pb-lg-7 { padding-bottom: 2.5rem !important; } .pl-lg-7 { padding-left: 2.5rem !important; } .px-lg-7 { padding-right: 2.5rem !important; padding-left: 2.5rem !important; } .py-lg-7 { padding-top: 2.5rem !important; padding-bottom: 2.5rem !important; } .p-lg-8 { padding: 3rem !important; } .pt-lg-8 { padding-top: 3rem !important; } .pr-lg-8 { padding-right: 3rem !important; } .pb-lg-8 { padding-bottom: 3rem !important; } .pl-lg-8 { padding-left: 3rem !important; } .px-lg-8 { padding-right: 3rem !important; padding-left: 3rem !important; } .py-lg-8 { padding-top: 3rem !important; padding-bottom: 3rem !important; } .p-lg-9 { padding: 3.5rem !important; } .pt-lg-9 { padding-top: 3.5rem !important; } .pr-lg-9 { padding-right: 3.5rem !important; } .pb-lg-9 { padding-bottom: 3.5rem !important; } .pl-lg-9 { padding-left: 3.5rem !important; } .px-lg-9 { padding-right: 3.5rem !important; padding-left: 3.5rem !important; } .py-lg-9 { padding-top: 3.5rem !important; padding-bottom: 3.5rem !important; } .p-lg-10 { padding: 4rem !important; } .pt-lg-10 { padding-top: 4rem !important; } .pr-lg-10 { padding-right: 4rem !important; } .pb-lg-10 { padding-bottom: 4rem !important; } .pl-lg-10 { padding-left: 4rem !important; } .px-lg-10 { padding-right: 4rem !important; padding-left: 4rem !important; } .py-lg-10 { padding-top: 4rem !important; padding-bottom: 4rem !important; } } + +@media (min-width: 87.5rem) { .p-xl-0 { padding: 0 !important; } .pt-xl-0 { padding-top: 0 !important; } .pr-xl-0 { padding-right: 0 !important; } .pb-xl-0 { padding-bottom: 0 !important; } .pl-xl-0 { padding-left: 0 !important; } .px-xl-0 { padding-right: 0 !important; padding-left: 0 !important; } .py-xl-0 { padding-top: 0 !important; padding-bottom: 0 !important; } .p-xl-1 { padding: 0.25rem !important; } .pt-xl-1 { padding-top: 0.25rem !important; } .pr-xl-1 { padding-right: 0.25rem !important; } .pb-xl-1 { padding-bottom: 0.25rem !important; } .pl-xl-1 { padding-left: 0.25rem !important; } .px-xl-1 { padding-right: 0.25rem !important; padding-left: 0.25rem !important; } .py-xl-1 { padding-top: 0.25rem !important; padding-bottom: 0.25rem !important; } .p-xl-2 { padding: 0.5rem !important; } .pt-xl-2 { padding-top: 0.5rem !important; } .pr-xl-2 { padding-right: 0.5rem !important; } .pb-xl-2 { padding-bottom: 0.5rem !important; } .pl-xl-2 { padding-left: 0.5rem !important; } .px-xl-2 { padding-right: 0.5rem !important; padding-left: 0.5rem !important; } .py-xl-2 { padding-top: 0.5rem !important; padding-bottom: 0.5rem !important; } .p-xl-3 { padding: 0.75rem !important; } .pt-xl-3 { padding-top: 0.75rem !important; } .pr-xl-3 { padding-right: 0.75rem !important; } .pb-xl-3 { padding-bottom: 0.75rem !important; } .pl-xl-3 { padding-left: 0.75rem !important; } .px-xl-3 { padding-right: 0.75rem !important; padding-left: 0.75rem !important; } .py-xl-3 { padding-top: 0.75rem !important; padding-bottom: 0.75rem !important; } .p-xl-4 { padding: 1rem !important; } .pt-xl-4 { padding-top: 1rem !important; } .pr-xl-4 { padding-right: 1rem !important; } .pb-xl-4 { padding-bottom: 1rem !important; } .pl-xl-4 { padding-left: 1rem !important; } .px-xl-4 { padding-right: 1rem !important; padding-left: 1rem !important; } .py-xl-4 { padding-top: 1rem !important; padding-bottom: 1rem !important; } .p-xl-5 { padding: 1.5rem !important; } .pt-xl-5 { padding-top: 1.5rem !important; } .pr-xl-5 { padding-right: 1.5rem !important; } .pb-xl-5 { padding-bottom: 1.5rem !important; } .pl-xl-5 { padding-left: 1.5rem !important; } .px-xl-5 { padding-right: 1.5rem !important; padding-left: 1.5rem !important; } .py-xl-5 { padding-top: 1.5rem !important; padding-bottom: 1.5rem !important; } .p-xl-6 { padding: 2rem !important; } .pt-xl-6 { padding-top: 2rem !important; } .pr-xl-6 { padding-right: 2rem !important; } .pb-xl-6 { padding-bottom: 2rem !important; } .pl-xl-6 { padding-left: 2rem !important; } .px-xl-6 { padding-right: 2rem !important; padding-left: 2rem !important; } .py-xl-6 { padding-top: 2rem !important; padding-bottom: 2rem !important; } .p-xl-7 { padding: 2.5rem !important; } .pt-xl-7 { padding-top: 2.5rem !important; } .pr-xl-7 { padding-right: 2.5rem !important; } .pb-xl-7 { padding-bottom: 2.5rem !important; } .pl-xl-7 { padding-left: 2.5rem !important; } .px-xl-7 { padding-right: 2.5rem !important; padding-left: 2.5rem !important; } .py-xl-7 { padding-top: 2.5rem !important; padding-bottom: 2.5rem !important; } .p-xl-8 { padding: 3rem !important; } .pt-xl-8 { padding-top: 3rem !important; } .pr-xl-8 { padding-right: 3rem !important; } .pb-xl-8 { padding-bottom: 3rem !important; } .pl-xl-8 { padding-left: 3rem !important; } .px-xl-8 { padding-right: 3rem !important; padding-left: 3rem !important; } .py-xl-8 { padding-top: 3rem !important; padding-bottom: 3rem !important; } .p-xl-9 { padding: 3.5rem !important; } .pt-xl-9 { padding-top: 3.5rem !important; } .pr-xl-9 { padding-right: 3.5rem !important; } .pb-xl-9 { padding-bottom: 3.5rem !important; } .pl-xl-9 { padding-left: 3.5rem !important; } .px-xl-9 { padding-right: 3.5rem !important; padding-left: 3.5rem !important; } .py-xl-9 { padding-top: 3.5rem !important; padding-bottom: 3.5rem !important; } .p-xl-10 { padding: 4rem !important; } .pt-xl-10 { padding-top: 4rem !important; } .pr-xl-10 { padding-right: 4rem !important; } .pb-xl-10 { padding-bottom: 4rem !important; } .pl-xl-10 { padding-left: 4rem !important; } .px-xl-10 { padding-right: 4rem !important; padding-left: 4rem !important; } .py-xl-10 { padding-top: 4rem !important; padding-bottom: 4rem !important; } } + +@media print { .site-footer, .site-button, #edit-this-page, #back-to-top, .site-nav, .main-header { display: none !important; } .side-bar { width: 100%; height: auto; border-right: 0 !important; } .site-header { border-bottom: 1px solid #44434d; } .site-title { font-size: 16px !important; font-weight: 700 !important; } .text-small { font-size: 8pt !important; } pre.highlight { border: 1px solid #44434d; } .main { max-width: none; margin-left: 0; } } + +a.skip-to-main { left: -999px; position: absolute; top: auto; width: 1px; height: 1px; overflow: hidden; z-index: -999; } + +a.skip-to-main:focus, a.skip-to-main:active { color: #2c84fa; background-color: #27262b; left: auto; top: auto; width: 30%; height: auto; overflow: auto; margin: 10px 35%; padding: 5px; border-radius: 15px; border: 4px solid #264caf; text-align: center; font-size: 1.2em; z-index: 999; } + +div.opaque { background-color: #27262b; } + +p.warning, blockquote.warning { background: rgba(221, 46, 46, 0.2); border-left: 4px solid #f77e7e; border-radius: 4px; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08); padding: .8rem; } + +p.warning::before, blockquote.warning::before { color: #f77e7e; content: "Warning"; display: block; font-weight: bold; text-transform: uppercase; font-size: .75em; padding-bottom: .125rem; } + +p.warning > .warning-title, blockquote.warning > .warning-title { color: #f77e7e; display: block; font-weight: bold; text-transform: uppercase; font-size: .75em; padding-bottom: .125rem; } + +p.warning-title, blockquote.warning-title { background: rgba(221, 46, 46, 0.2); border-left: 4px solid #f77e7e; border-radius: 4px; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08); padding: .8rem; } + +p.warning-title > p:first-child, blockquote.warning-title > p:first-child { margin-top: 0; margin-bottom: 0; color: #f77e7e; display: block; font-weight: bold; text-transform: uppercase; font-size: .75em; padding-bottom: .125rem; } + +blockquote.warning { margin-left: 0; margin-right: 0; } + +blockquote.warning > p:first-child { margin-top: 0; } + +blockquote.warning > p:last-child { margin-bottom: 0; } + +blockquote.warning-title { margin-left: 0; margin-right: 0; } + +blockquote.warning-title > p:nth-child(2) { margin-top: 0; } + +blockquote.warning-title > p:last-child { margin-bottom: 0; } + +p.caution, blockquote.caution { background: rgba(231, 175, 6, 0.2); border-left: 4px solid #ffeb82; border-radius: 4px; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08); padding: .8rem; } + +p.caution::before, blockquote.caution::before { color: #ffeb82; content: "Caution"; display: block; font-weight: bold; text-transform: uppercase; font-size: .75em; padding-bottom: .125rem; } + +p.caution > .caution-title, blockquote.caution > .caution-title { color: #ffeb82; display: block; font-weight: bold; text-transform: uppercase; font-size: .75em; padding-bottom: .125rem; } + +p.caution-title, blockquote.caution-title { background: rgba(231, 175, 6, 0.2); border-left: 4px solid #ffeb82; border-radius: 4px; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08); padding: .8rem; } + +p.caution-title > p:first-child, blockquote.caution-title > p:first-child { margin-top: 0; margin-bottom: 0; color: #ffeb82; display: block; font-weight: bold; text-transform: uppercase; font-size: .75em; padding-bottom: .125rem; } + +blockquote.caution { margin-left: 0; margin-right: 0; } + +blockquote.caution > p:first-child { margin-top: 0; } + +blockquote.caution > p:last-child { margin-bottom: 0; } + +blockquote.caution-title { margin-left: 0; margin-right: 0; } + +blockquote.caution-title > p:nth-child(2) { margin-top: 0; } + +blockquote.caution-title > p:last-child { margin-bottom: 0; } + +p.info, blockquote.info { background: rgba(24, 51, 133, 0.2); border-left: 4px solid #2c84fa; border-radius: 4px; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08); padding: .8rem; } + +p.info::before, blockquote.info::before { color: #2c84fa; content: "Info"; display: block; font-weight: bold; text-transform: uppercase; font-size: .75em; padding-bottom: .125rem; } + +p.info > .info-title, blockquote.info > .info-title { color: #2c84fa; display: block; font-weight: bold; text-transform: uppercase; font-size: .75em; padding-bottom: .125rem; } + +p.info-title, blockquote.info-title { background: rgba(24, 51, 133, 0.2); border-left: 4px solid #2c84fa; border-radius: 4px; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08); padding: .8rem; } + +p.info-title > p:first-child, blockquote.info-title > p:first-child { margin-top: 0; margin-bottom: 0; color: #2c84fa; display: block; font-weight: bold; text-transform: uppercase; font-size: .75em; padding-bottom: .125rem; } + +blockquote.info { margin-left: 0; margin-right: 0; } + +blockquote.info > p:first-child { margin-top: 0; } + +blockquote.info > p:last-child { margin-bottom: 0; } + +blockquote.info-title { margin-left: 0; margin-right: 0; } + +blockquote.info-title > p:nth-child(2) { margin-top: 0; } + +blockquote.info-title > p:last-child { margin-bottom: 0; } + +p.notice, blockquote.notice { background: rgba(2, 110, 87, 0.2); border-left: 4px solid #41d693; border-radius: 4px; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08); padding: .8rem; } + +p.notice::before, blockquote.notice::before { color: #41d693; content: "Notice"; display: block; font-weight: bold; text-transform: uppercase; font-size: .75em; padding-bottom: .125rem; } + +p.notice > .notice-title, blockquote.notice > .notice-title { color: #41d693; display: block; font-weight: bold; text-transform: uppercase; font-size: .75em; padding-bottom: .125rem; } + +p.notice-title, blockquote.notice-title { background: rgba(2, 110, 87, 0.2); border-left: 4px solid #41d693; border-radius: 4px; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08); padding: .8rem; } + +p.notice-title > p:first-child, blockquote.notice-title > p:first-child { margin-top: 0; margin-bottom: 0; color: #41d693; display: block; font-weight: bold; text-transform: uppercase; font-size: .75em; padding-bottom: .125rem; } + +blockquote.notice { margin-left: 0; margin-right: 0; } + +blockquote.notice > p:first-child { margin-top: 0; } + +blockquote.notice > p:last-child { margin-bottom: 0; } + +blockquote.notice-title { margin-left: 0; margin-right: 0; } + +blockquote.notice-title > p:nth-child(2) { margin-top: 0; } + +blockquote.notice-title > p:last-child { margin-bottom: 0; } + +.site-title { padding: 0; } + +.site-logo { background-position: center; } + +@media (max-width: 799px) { .home-logo { display: none; } .site-logo { background-size: contain; background-position: center; } } + +.landing-grid { display: flex; flex-wrap: wrap; width: 100%; } + +.grid-item { background-color: rgba(150, 150, 150, 0.1); width: 45%; min-width: 300px; text-align: center; font-size: 36px; margin: 10px; min-height: 64px; } + +@media (max-width: 951px) { .grid-item { width: 100%; } } + +/*# sourceMappingURL=just-the-docs-default.css.map */ \ No newline at end of file diff --git a/hrtcat/assets/images/badge.png b/hrtcat/assets/images/badge.png new file mode 100644 index 00000000..bdd4af32 Binary files /dev/null and b/hrtcat/assets/images/badge.png differ diff --git a/hrtcat/assets/images/fill_up.png b/hrtcat/assets/images/fill_up.png new file mode 100644 index 00000000..d9cd6bc2 Binary files /dev/null and b/hrtcat/assets/images/fill_up.png differ diff --git a/hrtcat/assets/images/guide-intro.png b/hrtcat/assets/images/guide-intro.png new file mode 100644 index 00000000..cbcc2c81 Binary files /dev/null and b/hrtcat/assets/images/guide-intro.png differ diff --git a/hrtcat/assets/images/media/meme1.png b/hrtcat/assets/images/media/meme1.png new file mode 100644 index 00000000..1de00be0 Binary files /dev/null and b/hrtcat/assets/images/media/meme1.png differ diff --git a/hrtcat/assets/images/media/meme2.png b/hrtcat/assets/images/media/meme2.png new file mode 100644 index 00000000..cf4a37bb Binary files /dev/null and b/hrtcat/assets/images/media/meme2.png differ diff --git a/hrtcat/assets/images/spirit.jpg b/hrtcat/assets/images/spirit.jpg new file mode 100644 index 00000000..b1677ec0 Binary files /dev/null and b/hrtcat/assets/images/spirit.jpg differ diff --git a/hrtcat/assets/images/trickster.png b/hrtcat/assets/images/trickster.png new file mode 100644 index 00000000..dafc13ba Binary files /dev/null and b/hrtcat/assets/images/trickster.png differ diff --git a/hrtcat/assets/images/two_needles.png b/hrtcat/assets/images/two_needles.png new file mode 100644 index 00000000..bd8c5182 Binary files /dev/null and b/hrtcat/assets/images/two_needles.png differ diff --git a/hrtcat/assets/images/vial_label.jpg b/hrtcat/assets/images/vial_label.jpg new file mode 100644 index 00000000..49445d54 Binary files /dev/null and b/hrtcat/assets/images/vial_label.jpg differ diff --git a/hrtcat/assets/js/just-the-docs.js b/hrtcat/assets/js/just-the-docs.js new file mode 100644 index 00000000..31939121 --- /dev/null +++ b/hrtcat/assets/js/just-the-docs.js @@ -0,0 +1,497 @@ +(function (jtd, undefined) { + +// Event handling + +jtd.addEvent = function(el, type, handler) { + if (el.attachEvent) el.attachEvent('on'+type, handler); else el.addEventListener(type, handler); +} +jtd.removeEvent = function(el, type, handler) { + if (el.detachEvent) el.detachEvent('on'+type, handler); else el.removeEventListener(type, handler); +} +jtd.onReady = function(ready) { + // in case the document is already rendered + if (document.readyState!='loading') ready(); + // modern browsers + else if (document.addEventListener) document.addEventListener('DOMContentLoaded', ready); + // IE <= 8 + else document.attachEvent('onreadystatechange', function(){ + if (document.readyState=='complete') ready(); + }); +} + +// Show/hide mobile menu + +function initNav() { + jtd.addEvent(document, 'click', function(e){ + var target = e.target; + while (target && !(target.classList && target.classList.contains('nav-list-expander'))) { + target = target.parentNode; + } + if (target) { + e.preventDefault(); + target.parentNode.classList.toggle('active'); + } + }); + + const siteNav = document.getElementById('site-nav'); + const mainHeader = document.getElementById('main-header'); + const menuButton = document.getElementById('menu-button'); + + jtd.addEvent(menuButton, 'click', function(e){ + e.preventDefault(); + + if (menuButton.classList.toggle('nav-open')) { + siteNav.classList.add('nav-open'); + mainHeader.classList.add('nav-open'); + } else { + siteNav.classList.remove('nav-open'); + mainHeader.classList.remove('nav-open'); + } + }); +} +// Site search + +function initSearch() { + var request = new XMLHttpRequest(); + request.open('GET', '/hrtcat/assets/js/search-data.json', true); + + request.onload = function(){ + if (request.status >= 200 && request.status < 400) { + var docs = JSON.parse(request.responseText); + + lunr.tokenizer.separator = /[\s\-/]+/ + + var index = lunr(function(){ + this.ref('id'); + this.field('title', { boost: 200 }); + this.field('content', { boost: 2 }); + this.field('relUrl'); + this.metadataWhitelist = ['position'] + + for (var i in docs) { + + this.add({ + id: i, + title: docs[i].title, + content: docs[i].content, + relUrl: docs[i].relUrl + }); + } + }); + + searchLoaded(index, docs); + } else { + console.log('Error loading ajax request. Request status:' + request.status); + } + }; + + request.onerror = function(){ + console.log('There was a connection error'); + }; + + request.send(); +} + +function searchLoaded(index, docs) { + var index = index; + var docs = docs; + var searchInput = document.getElementById('search-input'); + var searchResults = document.getElementById('search-results'); + var mainHeader = document.getElementById('main-header'); + var currentInput; + var currentSearchIndex = 0; + + function showSearch() { + document.documentElement.classList.add('search-active'); + } + + function hideSearch() { + document.documentElement.classList.remove('search-active'); + } + + function update() { + currentSearchIndex++; + + var input = searchInput.value; + if (input === '') { + hideSearch(); + } else { + showSearch(); + // scroll search input into view, workaround for iOS Safari + window.scroll(0, -1); + setTimeout(function(){ window.scroll(0, 0); }, 0); + } + if (input === currentInput) { + return; + } + currentInput = input; + searchResults.innerHTML = ''; + if (input === '') { + return; + } + + var results = index.query(function (query) { + var tokens = lunr.tokenizer(input) + query.term(tokens, { + boost: 10 + }); + query.term(tokens, { + wildcard: lunr.Query.wildcard.TRAILING + }); + }); + + if ((results.length == 0) && (input.length > 2)) { + var tokens = lunr.tokenizer(input).filter(function(token, i) { + return token.str.length < 20; + }) + if (tokens.length > 0) { + results = index.query(function (query) { + query.term(tokens, { + editDistance: Math.round(Math.sqrt(input.length / 2 - 1)) + }); + }); + } + } + + if (results.length == 0) { + var noResultsDiv = document.createElement('div'); + noResultsDiv.classList.add('search-no-result'); + noResultsDiv.innerText = 'No results found'; + searchResults.appendChild(noResultsDiv); + + } else { + var resultsList = document.createElement('ul'); + resultsList.classList.add('search-results-list'); + searchResults.appendChild(resultsList); + + addResults(resultsList, results, 0, 10, 100, currentSearchIndex); + } + + function addResults(resultsList, results, start, batchSize, batchMillis, searchIndex) { + if (searchIndex != currentSearchIndex) { + return; + } + for (var i = start; i < (start + batchSize); i++) { + if (i == results.length) { + return; + } + addResult(resultsList, results[i]); + } + setTimeout(function() { + addResults(resultsList, results, start + batchSize, batchSize, batchMillis, searchIndex); + }, batchMillis); + } + + function addResult(resultsList, result) { + var doc = docs[result.ref]; + + var resultsListItem = document.createElement('li'); + resultsListItem.classList.add('search-results-list-item'); + resultsList.appendChild(resultsListItem); + + var resultLink = document.createElement('a'); + resultLink.classList.add('search-result'); + resultLink.setAttribute('href', doc.url); + resultsListItem.appendChild(resultLink); + + var resultTitle = document.createElement('div'); + resultTitle.classList.add('search-result-title'); + resultLink.appendChild(resultTitle); + + // note: the SVG svg-doc is only loaded as a Jekyll include if site.search_enabled is true; see _includes/icons/icons.html + var resultDoc = document.createElement('div'); + resultDoc.classList.add('search-result-doc'); + resultDoc.innerHTML = ''; + resultTitle.appendChild(resultDoc); + + var resultDocTitle = document.createElement('div'); + resultDocTitle.classList.add('search-result-doc-title'); + resultDocTitle.innerHTML = doc.doc; + resultDoc.appendChild(resultDocTitle); + var resultDocOrSection = resultDocTitle; + + if (doc.doc != doc.title) { + resultDoc.classList.add('search-result-doc-parent'); + var resultSection = document.createElement('div'); + resultSection.classList.add('search-result-section'); + resultSection.innerHTML = doc.title; + resultTitle.appendChild(resultSection); + resultDocOrSection = resultSection; + } + + var metadata = result.matchData.metadata; + var titlePositions = []; + var contentPositions = []; + for (var j in metadata) { + var meta = metadata[j]; + if (meta.title) { + var positions = meta.title.position; + for (var k in positions) { + titlePositions.push(positions[k]); + } + } + if (meta.content) { + var positions = meta.content.position; + for (var k in positions) { + var position = positions[k]; + var previewStart = position[0]; + var previewEnd = position[0] + position[1]; + var ellipsesBefore = true; + var ellipsesAfter = true; + for (var k = 0; k < 5; k++) { + var nextSpace = doc.content.lastIndexOf(' ', previewStart - 2); + var nextDot = doc.content.lastIndexOf('. ', previewStart - 2); + if ((nextDot >= 0) && (nextDot > nextSpace)) { + previewStart = nextDot + 1; + ellipsesBefore = false; + break; + } + if (nextSpace < 0) { + previewStart = 0; + ellipsesBefore = false; + break; + } + previewStart = nextSpace + 1; + } + for (var k = 0; k < 10; k++) { + var nextSpace = doc.content.indexOf(' ', previewEnd + 1); + var nextDot = doc.content.indexOf('. ', previewEnd + 1); + if ((nextDot >= 0) && (nextDot < nextSpace)) { + previewEnd = nextDot; + ellipsesAfter = false; + break; + } + if (nextSpace < 0) { + previewEnd = doc.content.length; + ellipsesAfter = false; + break; + } + previewEnd = nextSpace; + } + contentPositions.push({ + highlight: position, + previewStart: previewStart, previewEnd: previewEnd, + ellipsesBefore: ellipsesBefore, ellipsesAfter: ellipsesAfter + }); + } + } + } + + if (titlePositions.length > 0) { + titlePositions.sort(function(p1, p2){ return p1[0] - p2[0] }); + resultDocOrSection.innerHTML = ''; + addHighlightedText(resultDocOrSection, doc.title, 0, doc.title.length, titlePositions); + } + + if (contentPositions.length > 0) { + contentPositions.sort(function(p1, p2){ return p1.highlight[0] - p2.highlight[0] }); + var contentPosition = contentPositions[0]; + var previewPosition = { + highlight: [contentPosition.highlight], + previewStart: contentPosition.previewStart, previewEnd: contentPosition.previewEnd, + ellipsesBefore: contentPosition.ellipsesBefore, ellipsesAfter: contentPosition.ellipsesAfter + }; + var previewPositions = [previewPosition]; + for (var j = 1; j < contentPositions.length; j++) { + contentPosition = contentPositions[j]; + if (previewPosition.previewEnd < contentPosition.previewStart) { + previewPosition = { + highlight: [contentPosition.highlight], + previewStart: contentPosition.previewStart, previewEnd: contentPosition.previewEnd, + ellipsesBefore: contentPosition.ellipsesBefore, ellipsesAfter: contentPosition.ellipsesAfter + } + previewPositions.push(previewPosition); + } else { + previewPosition.highlight.push(contentPosition.highlight); + previewPosition.previewEnd = contentPosition.previewEnd; + previewPosition.ellipsesAfter = contentPosition.ellipsesAfter; + } + } + + var resultPreviews = document.createElement('div'); + resultPreviews.classList.add('search-result-previews'); + resultLink.appendChild(resultPreviews); + + var content = doc.content; + for (var j = 0; j < Math.min(previewPositions.length, 3); j++) { + var position = previewPositions[j]; + + var resultPreview = document.createElement('div'); + resultPreview.classList.add('search-result-preview'); + resultPreviews.appendChild(resultPreview); + + if (position.ellipsesBefore) { + resultPreview.appendChild(document.createTextNode('... ')); + } + addHighlightedText(resultPreview, content, position.previewStart, position.previewEnd, position.highlight); + if (position.ellipsesAfter) { + resultPreview.appendChild(document.createTextNode(' ...')); + } + } + } + var resultRelUrl = document.createElement('span'); + resultRelUrl.classList.add('search-result-rel-url'); + resultRelUrl.innerText = doc.relUrl; + resultTitle.appendChild(resultRelUrl); + } + + function addHighlightedText(parent, text, start, end, positions) { + var index = start; + for (var i in positions) { + var position = positions[i]; + var span = document.createElement('span'); + span.innerHTML = text.substring(index, position[0]); + parent.appendChild(span); + index = position[0] + position[1]; + var highlight = document.createElement('span'); + highlight.classList.add('search-result-highlight'); + highlight.innerHTML = text.substring(position[0], index); + parent.appendChild(highlight); + } + var span = document.createElement('span'); + span.innerHTML = text.substring(index, end); + parent.appendChild(span); + } + } + + jtd.addEvent(searchInput, 'focus', function(){ + setTimeout(update, 0); + }); + + jtd.addEvent(searchInput, 'keyup', function(e){ + switch (e.keyCode) { + case 27: // When esc key is pressed, hide the results and clear the field + searchInput.value = ''; + break; + case 38: // arrow up + case 40: // arrow down + case 13: // enter + e.preventDefault(); + return; + } + update(); + }); + + jtd.addEvent(searchInput, 'keydown', function(e){ + switch (e.keyCode) { + case 38: // arrow up + e.preventDefault(); + var active = document.querySelector('.search-result.active'); + if (active) { + active.classList.remove('active'); + if (active.parentElement.previousSibling) { + var previous = active.parentElement.previousSibling.querySelector('.search-result'); + previous.classList.add('active'); + } + } + return; + case 40: // arrow down + e.preventDefault(); + var active = document.querySelector('.search-result.active'); + if (active) { + if (active.parentElement.nextSibling) { + var next = active.parentElement.nextSibling.querySelector('.search-result'); + active.classList.remove('active'); + next.classList.add('active'); + } + } else { + var next = document.querySelector('.search-result'); + if (next) { + next.classList.add('active'); + } + } + return; + case 13: // enter + e.preventDefault(); + var active = document.querySelector('.search-result.active'); + if (active) { + active.click(); + } else { + var first = document.querySelector('.search-result'); + if (first) { + first.click(); + } + } + return; + } + }); + + jtd.addEvent(document, 'click', function(e){ + if (e.target != searchInput) { + hideSearch(); + } + }); +} + +// Switch theme + +jtd.getTheme = function() { + var cssFileHref = document.querySelector('[rel="stylesheet"]').getAttribute('href'); + return cssFileHref.substring(cssFileHref.lastIndexOf('-') + 1, cssFileHref.length - 4); +} + +jtd.setTheme = function(theme) { + var cssFile = document.querySelector('[rel="stylesheet"]'); + cssFile.setAttribute('href', '/hrtcat/assets/css/just-the-docs-' + theme + '.css'); +} + +// Scroll site-nav to ensure the link to the current page is visible + +function scrollNav() { + const href = document.location.pathname; + const siteNav = document.getElementById('site-nav'); + const targetLink = siteNav.querySelector('a[href="' + href + '"], a[href="' + href + '/"]'); + if(targetLink){ + const rect = targetLink.getBoundingClientRect(); + siteNav.scrollBy(0, rect.top - 3*rect.height); + } +} + +// Document ready + +jtd.onReady(function(){ + initNav(); + initSearch(); + scrollNav(); +}); + +// Copy button on code + +jtd.onReady(function(){ + + var codeBlocks = document.querySelectorAll('div.highlighter-rouge, div.listingblock > div.content, figure.highlight'); + + // note: the SVG svg-copied and svg-copy is only loaded as a Jekyll include if site.enable_copy_code_button is true; see _includes/icons/icons.html + var svgCopied = ''; + var svgCopy = ''; + + codeBlocks.forEach(codeBlock => { + var copyButton = document.createElement('button'); + var timeout = null; + copyButton.type = 'button'; + copyButton.ariaLabel = 'Copy code to clipboard'; + copyButton.innerHTML = svgCopy; + codeBlock.append(copyButton); + + copyButton.addEventListener('click', function () { + if(timeout === null) { + var code = (codeBlock.querySelector('pre:not(.lineno, .highlight)') || codeBlock.querySelector('code')).innerText; + window.navigator.clipboard.writeText(code); + + copyButton.innerHTML = svgCopied; + + var timeoutSetting = 4000; + + timeout = setTimeout(function () { + copyButton.innerHTML = svgCopy; + timeout = null; + }, timeoutSetting); + } + }); + }); + +}); + +})(window.jtd = window.jtd || {}); + + diff --git a/hrtcat/assets/js/vendor/lunr.min.js b/hrtcat/assets/js/vendor/lunr.min.js new file mode 100644 index 00000000..46c594b8 --- /dev/null +++ b/hrtcat/assets/js/vendor/lunr.min.js @@ -0,0 +1,61 @@ +/** + * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.9 + * Copyright (C) 2020 Oliver Nightingale + * @license MIT + */ +/** + * ORIGINAL MIT LICENSE + * Copyright (C) 2013 by Oliver Nightingale + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +!function(){var e,t,r,i,n,s,o,a,u,l,c,h,d,f,p,y,m,g,x,v,w,Q,k,S,E,L,b,P,T=function(e){var t=new T.Builder;return t.pipeline.add(T.trimmer,T.stopWordFilter,T.stemmer),t.searchPipeline.add(T.stemmer),e.call(t,t),t.build()};T.version="2.3.9" +/*! +* lunr.utils +* Copyright (C) 2020 Oliver Nightingale +*/,T.utils={},T.utils.warn=(e=this,function(t){e.console&&console.warn&&console.warn(t)}),T.utils.asString=function(e){return null==e?"":e.toString()},T.utils.clone=function(e){if(null==e)return e;for(var t=Object.create(null),r=Object.keys(e),i=0;i0){var u=T.utils.clone(t)||{};u.position=[o,a],u.index=n.length,n.push(new T.Token(r.slice(o,s),u))}o=s+1}}return n},T.tokenizer.separator=/[\s\-]+/ +/*! +* lunr.Pipeline +* Copyright (C) 2020 Oliver Nightingale +*/,T.Pipeline=function(){this._stack=[]},T.Pipeline.registeredFunctions=Object.create(null),T.Pipeline.registerFunction=function(e,t){t in this.registeredFunctions&&T.utils.warn("Overwriting existing registered function: "+t),e.label=t,T.Pipeline.registeredFunctions[e.label]=e},T.Pipeline.warnIfFunctionNotRegistered=function(e){e.label&&e.label in this.registeredFunctions||T.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},T.Pipeline.load=function(e){var t=new T.Pipeline;return e.forEach((function(e){var r=T.Pipeline.registeredFunctions[e];if(!r)throw new Error("Cannot load unregistered function: "+e);t.add(r)})),t},T.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach((function(e){T.Pipeline.warnIfFunctionNotRegistered(e),this._stack.push(e)}),this)},T.Pipeline.prototype.after=function(e,t){T.Pipeline.warnIfFunctionNotRegistered(t);var r=this._stack.indexOf(e);if(-1==r)throw new Error("Cannot find existingFn");r+=1,this._stack.splice(r,0,t)},T.Pipeline.prototype.before=function(e,t){T.Pipeline.warnIfFunctionNotRegistered(t);var r=this._stack.indexOf(e);if(-1==r)throw new Error("Cannot find existingFn");this._stack.splice(r,0,t)},T.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);-1!=t&&this._stack.splice(t,1)},T.Pipeline.prototype.run=function(e){for(var t=this._stack.length,r=0;r1&&(se&&(r=n),s!=e);)i=r-t,n=t+Math.floor(i/2),s=this.elements[2*n];return s==e||s>e?2*n:sa?l+=2:o==a&&(t+=r[u+1]*i[l+1],u+=2,l+=2);return t},T.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},T.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,r=0;t0){var s,o=n.str.charAt(0);o in n.node.edges?s=n.node.edges[o]:(s=new T.TokenSet,n.node.edges[o]=s),1==n.str.length&&(s.final=!0),i.push({node:s,editsRemaining:n.editsRemaining,str:n.str.slice(1)})}if(0!=n.editsRemaining){if("*"in n.node.edges)var a=n.node.edges["*"];else{a=new T.TokenSet;n.node.edges["*"]=a}if(0==n.str.length&&(a.final=!0),i.push({node:a,editsRemaining:n.editsRemaining-1,str:n.str}),n.str.length>1&&i.push({node:n.node,editsRemaining:n.editsRemaining-1,str:n.str.slice(1)}),1==n.str.length&&(n.node.final=!0),n.str.length>=1){if("*"in n.node.edges)var u=n.node.edges["*"];else{u=new T.TokenSet;n.node.edges["*"]=u}1==n.str.length&&(u.final=!0),i.push({node:u,editsRemaining:n.editsRemaining-1,str:n.str.slice(1)})}if(n.str.length>1){var l,c=n.str.charAt(0),h=n.str.charAt(1);h in n.node.edges?l=n.node.edges[h]:(l=new T.TokenSet,n.node.edges[h]=l),1==n.str.length&&(l.final=!0),i.push({node:l,editsRemaining:n.editsRemaining-1,str:c+n.str.slice(2)})}}}return r},T.TokenSet.fromString=function(e){for(var t=new T.TokenSet,r=t,i=0,n=e.length;i=e;t--){var r=this.uncheckedNodes[t],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r.char]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}} +/*! +* lunr.Index +* Copyright (C) 2020 Oliver Nightingale +*/,T.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},T.Index.prototype.search=function(e){return this.query((function(t){new T.QueryParser(e,t).parse()}))},T.Index.prototype.query=function(e){for(var t=new T.Query(this.fields),r=Object.create(null),i=Object.create(null),n=Object.create(null),s=Object.create(null),o=Object.create(null),a=0;a1?1:e},T.Builder.prototype.k1=function(e){this._k1=e},T.Builder.prototype.add=function(e,t){var r=e[this._ref],i=Object.keys(this._fields);this._documents[r]=t||{},this.documentCount+=1;for(var n=0;n=this.length)return T.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},T.QueryLexer.prototype.width=function(){return this.pos-this.start},T.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},T.QueryLexer.prototype.backup=function(){this.pos-=1},T.QueryLexer.prototype.acceptDigitRun=function(){var e,t;do{t=(e=this.next()).charCodeAt(0)}while(t>47&&t<58);e!=T.QueryLexer.EOS&&this.backup()},T.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(T.QueryLexer.TERM)),e.ignore(),e.more())return T.QueryLexer.lexText},T.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(T.QueryLexer.EDIT_DISTANCE),T.QueryLexer.lexText},T.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(T.QueryLexer.BOOST),T.QueryLexer.lexText},T.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(T.QueryLexer.TERM)},T.QueryLexer.termSeparator=T.tokenizer.separator,T.QueryLexer.lexText=function(e){for(;;){var t=e.next();if(t==T.QueryLexer.EOS)return T.QueryLexer.lexEOS;if(92!=t.charCodeAt(0)){if(":"==t)return T.QueryLexer.lexField;if("~"==t)return e.backup(),e.width()>0&&e.emit(T.QueryLexer.TERM),T.QueryLexer.lexEditDistance;if("^"==t)return e.backup(),e.width()>0&&e.emit(T.QueryLexer.TERM),T.QueryLexer.lexBoost;if("+"==t&&1===e.width())return e.emit(T.QueryLexer.PRESENCE),T.QueryLexer.lexText;if("-"==t&&1===e.width())return e.emit(T.QueryLexer.PRESENCE),T.QueryLexer.lexText;if(t.match(T.QueryLexer.termSeparator))return T.QueryLexer.lexTerm}else e.escapeCharacter()}},T.QueryParser=function(e,t){this.lexer=new T.QueryLexer(e),this.query=t,this.currentClause={},this.lexemeIdx=0},T.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=T.QueryParser.parseClause;e;)e=e(this);return this.query},T.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},T.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},T.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},T.QueryParser.parseClause=function(e){var t=e.peekLexeme();if(null!=t)switch(t.type){case T.QueryLexer.PRESENCE:return T.QueryParser.parsePresence;case T.QueryLexer.FIELD:return T.QueryParser.parseField;case T.QueryLexer.TERM:return T.QueryParser.parseTerm;default:var r="expected either a field or a term, found "+t.type;throw t.str.length>=1&&(r+=" with value '"+t.str+"'"),new T.QueryParseError(r,t.start,t.end)}},T.QueryParser.parsePresence=function(e){var t=e.consumeLexeme();if(null!=t){switch(t.str){case"-":e.currentClause.presence=T.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=T.Query.presence.REQUIRED;break;default:var r="unrecognised presence operator'"+t.str+"'";throw new T.QueryParseError(r,t.start,t.end)}var i=e.peekLexeme();if(null==i){r="expecting term or field, found nothing";throw new T.QueryParseError(r,t.start,t.end)}switch(i.type){case T.QueryLexer.FIELD:return T.QueryParser.parseField;case T.QueryLexer.TERM:return T.QueryParser.parseTerm;default:r="expecting term or field, found '"+i.type+"'";throw new T.QueryParseError(r,i.start,i.end)}}},T.QueryParser.parseField=function(e){var t=e.consumeLexeme();if(null!=t){if(-1==e.query.allFields.indexOf(t.str)){var r=e.query.allFields.map((function(e){return"'"+e+"'"})).join(", "),i="unrecognised field '"+t.str+"', possible fields: "+r;throw new T.QueryParseError(i,t.start,t.end)}e.currentClause.fields=[t.str];var n=e.peekLexeme();if(null==n){i="expecting term, found nothing";throw new T.QueryParseError(i,t.start,t.end)}if(n.type===T.QueryLexer.TERM)return T.QueryParser.parseTerm;i="expecting term, found '"+n.type+"'";throw new T.QueryParseError(i,n.start,n.end)}},T.QueryParser.parseTerm=function(e){var t=e.consumeLexeme();if(null!=t){e.currentClause.term=t.str.toLowerCase(),-1!=t.str.indexOf("*")&&(e.currentClause.usePipeline=!1);var r=e.peekLexeme();if(null!=r)switch(r.type){case T.QueryLexer.TERM:return e.nextClause(),T.QueryParser.parseTerm;case T.QueryLexer.FIELD:return e.nextClause(),T.QueryParser.parseField;case T.QueryLexer.EDIT_DISTANCE:return T.QueryParser.parseEditDistance;case T.QueryLexer.BOOST:return T.QueryParser.parseBoost;case T.QueryLexer.PRESENCE:return e.nextClause(),T.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+r.type+"'";throw new T.QueryParseError(i,r.start,r.end)}else e.nextClause()}},T.QueryParser.parseEditDistance=function(e){var t=e.consumeLexeme();if(null!=t){var r=parseInt(t.str,10);if(isNaN(r)){var i="edit distance must be numeric";throw new T.QueryParseError(i,t.start,t.end)}e.currentClause.editDistance=r;var n=e.peekLexeme();if(null!=n)switch(n.type){case T.QueryLexer.TERM:return e.nextClause(),T.QueryParser.parseTerm;case T.QueryLexer.FIELD:return e.nextClause(),T.QueryParser.parseField;case T.QueryLexer.EDIT_DISTANCE:return T.QueryParser.parseEditDistance;case T.QueryLexer.BOOST:return T.QueryParser.parseBoost;case T.QueryLexer.PRESENCE:return e.nextClause(),T.QueryParser.parsePresence;default:i="Unexpected lexeme type '"+n.type+"'";throw new T.QueryParseError(i,n.start,n.end)}else e.nextClause()}},T.QueryParser.parseBoost=function(e){var t=e.consumeLexeme();if(null!=t){var r=parseInt(t.str,10);if(isNaN(r)){var i="boost must be numeric";throw new T.QueryParseError(i,t.start,t.end)}e.currentClause.boost=r;var n=e.peekLexeme();if(null!=n)switch(n.type){case T.QueryLexer.TERM:return e.nextClause(),T.QueryParser.parseTerm;case T.QueryLexer.FIELD:return e.nextClause(),T.QueryParser.parseField;case T.QueryLexer.EDIT_DISTANCE:return T.QueryParser.parseEditDistance;case T.QueryLexer.BOOST:return T.QueryParser.parseBoost;case T.QueryLexer.PRESENCE:return e.nextClause(),T.QueryParser.parsePresence;default:i="Unexpected lexeme type '"+n.type+"'";throw new T.QueryParseError(i,n.start,n.end)}else e.nextClause()}},b=this,P=function(){return T},"function"==typeof define&&define.amd?define(P):"object"==typeof exports?module.exports=P():b.lunr=P()}(); diff --git a/hrtcat/assets/scripts/recipe_calculator.js b/hrtcat/assets/scripts/recipe_calculator.js new file mode 100644 index 00000000..0d53dade --- /dev/null +++ b/hrtcat/assets/scripts/recipe_calculator.js @@ -0,0 +1,144 @@ + +// +// NOTE +// +// Recipes listed by weight in grams. +// They are converted to volume in the calculator. +// +// +// we want to take the needed vol of hormone + BB + BA +// then make up the remainder of the volume with oil + +const RECIPES = { + 'E_PAR_20': { + 'hormone': 0.02, + 'BB': 0.224, + 'BA': 0.02, + 'oil': 0.73 + }, + 'E_PAR_40': { + 'hormone': 0.04, + 'BB': 0.447, + 'BA': 0.02, + 'oil': 0.522 + }, + 'T_SLAYBACK_200': { + 'hormone': 0.2, + 'BB': 0.224, + 'BA': 0.02, + 'oil': 0.542 + } +} + +// +// Densities +// + +const DENSITIES = { + 'E': 1.1, + 'TC': 1.1, + 'TEn': 1.06, + 'TU': 1.03, + 'BB': 1.118, + 'BA': 1.044, + 'none': '' +} + +// +// +// + +const hormone_select = document.getElementById("hormone-select"); +const recipe_select = document.getElementById("recipe-select"); +const brew_vol = document.getElementById("brew-vol"); + +const updateHormoneDensity = () => { + const hormoneDensityCell = document.getElementById("hormone_density"); + let selectValue = document.getElementById("hormone-select").value; + hormoneDensityCell.innerText = DENSITIES[selectValue]; + + // if everything is filled out, calculate brew amounts. + if (isFormComplete()) { + updateRecipe(); + } +} + +const updateRecipe = () => { + // if everything isn't filled out, break. + if (!isFormComplete()) { + return; + } + + const recipeSelectValue = document.getElementById("recipe-select").value; + const hormoneDensity = DENSITIES[hormone_select.value]; + + // + // Get cells that will receive data + // + const hormoneMassCell = document.getElementById("hormone_mass"); + const bbMassCell = document.getElementById("bb_mass"); + const baMassCell = document.getElementById("ba_mass"); + + const hormoneVolCell = document.getElementById("hormone_vol"); + const bbVolCell = document.getElementById("bb_vol"); + const baVolCell = document.getElementById("ba_vol"); + const oilVolCell = document.getElementById("oil_vol"); + + const hormoneTotalCell = document.getElementById("hormone_total"); + const bbTotalCell = document.getElementById("bb_total"); + const baTotalCell = document.getElementById("ba_total"); + const oilTotalCell = document.getElementById("oil_total"); + // + // + + + const hormoneMass = RECIPES[recipeSelectValue]['hormone']; + const bbMass = RECIPES[recipeSelectValue]['BB']; + const baMass = RECIPES[recipeSelectValue]['BA']; + + hormoneMassCell.innerText = hormoneMass * 1000 + "mg"; + bbMassCell.innerText = bbMass * 1000 + "mg"; + baMassCell.innerText = baMass * 1000 + "mg"; + + // establish vol of BB and BA and hormone. + // make up for the remainder of the vol with oil. + // this makes up for subtle displacements due to + // density differences in hormone esters. + + const hormoneIn1ml = convertMassToVol(hormoneMass, hormoneDensity) + const bbIn1ml = convertMassToVol(bbMass, DENSITIES['BB']) + const baIn1ml = convertMassToVol(baMass, DENSITIES['BA']) + const oilIn1ml = Math.round((1 - hormoneIn1ml - bbIn1ml - baIn1ml) * 100) / 100; + + hormoneVolCell.innerText = hormoneIn1ml; + bbVolCell.innerText = bbIn1ml; + baVolCell.innerText = baIn1ml; + oilVolCell.innerText = oilIn1ml; + + const hormoneMassInTotal = hormoneMass * brew_vol.value; + const hormoneVolInTotal = convertMassToVol(hormoneMassInTotal, hormoneDensity) + const bbVolInTotal = bbIn1ml * brew_vol.value; + const baVolInTotal = baIn1ml * brew_vol.value; + + hormoneTotalCell.innerText = Math.round(hormoneMassInTotal * 100) / 100 + 'g / ' + hormoneVolInTotal + 'mL'; + bbTotalCell.innerText = Math.round(bbVolInTotal * 100) / 100 + 'mL'; + baTotalCell.innerText = Math.round(baVolInTotal * 100) / 100 + 'mL'; + oilTotalCell.innerText = Math.round((brew_vol.value - hormoneVolInTotal - bbVolInTotal - baVolInTotal) * 100) / 100 + 'mL'; +} + +hormone_select.addEventListener('change', updateHormoneDensity); +recipe_select.addEventListener('change', updateRecipe); +brew_vol.addEventListener('change', updateRecipe); + +const convertMassToVol = (mass, density) => { + return Math.round(mass/density * 100) / 100; +} + +const isFormComplete = () => { + const hormone_select = document.getElementById("hormone-select").value; + const recipe_select = document.getElementById("recipe-select").value; + const brewVol = document.getElementById("brew-vol").value; + + return (hormone_select !== 'none' && + recipe_select !== 'none' && brewVol !== "") +} diff --git a/hrtcat/calculator.html b/hrtcat/calculator.html new file mode 100644 index 00000000..d7f247ae --- /dev/null +++ b/hrtcat/calculator.html @@ -0,0 +1 @@ + Recipe Calculator | HRT Cat Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Recipe Calculator

Updated July 21, 2023

Most of the raw data that was turned into this calculator can be found here.

This calculator is in beta. It uses the methodology we use to calculate our brew ratios. There may be better ways to do these calculations. Double-check the work this calculator does. Proceed with caution. Please report any information about how to improve the calculator to our github or to our email.

Ingredient Density (g/mL) Mass in 1mL Vol in 1mL Your Recipe
Benzyl Benzoate ---
Benzyl Alcohol ---
Carrier Oil --- ---

Technical Notes

Ingredient Ratios:

When analyzing multiple recipes from various pharmaceutical manufacturers, a few things became clear. While the recipes are listed in mass, both BB and BA convert out into well-rounded volumetric measurements based on the density of those ingredients. For example, multiple recipes list exactly 224mg of BB per 1mL of medicine. This calculates out to be exactly 0.2mL of BB. Similar with BA. We theorize then that these ingredients are not added by weight but by volume. When you scale your recipe up, you will always see BB and BA in perfect volumetric ratios (20/40% and 2% respectively).

For the calculator, we use the density to calculate the displacement of your hormone ester of choice. Unless you’re working with ten’s of liters of medicine this probably doesn’t matter that much, but for the sake of accuracy this is how it’s calculated.

We then look at the sum of the volume of the hormone, BB, and BA, and then fill the remaining volume with the carrier oil.

Rounding:

Values are rounded to the nearest 0.01, but calculations are done on the unrounded numbers.

diff --git a/hrtcat/changelog.html b/hrtcat/changelog.html new file mode 100644 index 00000000..92a823f5 --- /dev/null +++ b/hrtcat/changelog.html @@ -0,0 +1 @@ + Changelog | HRT Cat Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Version 1.0

July 21, 2023

Bumping up a major version due to the large changes introduced to the brew guide.

  • Rewrote all of step 6, and pushed some of it’s content into a new step 8. Instead of filtering into the final vials, filter into a 100mL vial and then dispense from there. New illustration inspired by Tyger.
  • Added step 10 with security practices for running a business
  • Updated logo! We actually liked the cat girl logo a bit more lol, but we stole that artwork.
  • Created a changelog. hiiiiii.
  • Added info about “Manufactured by Tyger” to the sterilization method reviews.
  • Added a recommendation to read Tyger’s medium guide to step 1 of our injectables guide.
  • Added instructions how to make DIY topical lidocaine
  • Created a “recipe calculator” IN BETA to help brewers get the correct ratios of ingredients.
  • Added version, last updated date, and link to changelog on the home page.
  • Added an XMR donation address finally. Also put a stronger plea on this page as well as changed the permalink.
  • Added more ingredient densities to the recipe page, and corrected some formatting.
  • Added more melting points on the hormone testing page, and also improved some descriptions on there.
  • Added notice that we don’t check our email very often.
  • Clarified instructions on step 5, how to use heat to aid mixing the ingredients together.
  • Added warning to not make DIY laminar flow hoods.
  • Added a couple illustrations. Big thank you to anonymous for creating those for us. Such a beautiful name!
  • Updating lots of permalinks. Didn’t realize we could set those so easily in jekyll! fancy.
  • installed jekyll-redirect-from plugin to help preserve old links
diff --git a/hrtcat/contact.html b/hrtcat/contact.html new file mode 100644 index 00000000..c1f154df --- /dev/null +++ b/hrtcat/contact.html @@ -0,0 +1,41 @@ + Contact | HRT Cat Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Contact

hrtcat [at] proton [dot] me

Emails are only read once a week, at most.

We encourage feedback about this guide. If you would like to contact us in order to correct some information or to offer suggestions please email us at hrtcat [at] proton [dot] me. We do not check this email more than once a week.

We do accept requests for clarification when it feels the info we’ve provided is lacking. We do not give individualized advice outside the scope of this guide.

If you’re willing to make needed changes to this site yourself please see the page on contributing.

-----BEGIN PGP PUBLIC KEY BLOCK-----
+mQGNBGSjPE8BDADfJUX6NQM1+JN2RgehgSBuot7NLAxmOp0Ce7bVxsiWShzka6Hr
+LdT2h/YCqTlllgkOdAdmgPObYMxtZ6PiOdqo0ogP4eJGAjkEE65qTVDQ3lvO2Z16
+QRACZGUt9wKDkpyzOFt1lNwk+GlG3uScXi5Q7iGgsS7UGY68FbanosS7AetlWrcP
+jY2f/jfb8oJwVWiZ5V07/aVjGCFPlmSKXP1ejMdTSmPr1qi2k3M7j8C0pMtmjx4b
++9QNeQOtXtTwV3ZIrMb7y8kiDeZSrLWm3+Aie8W9iHMkED2LOQwlP0XLjQB2PaXt
+EWS8XOKKP4wzRdl1uBu62Op9xuUpzExC9/aQSy59ehJLi86fgMzubmphD4xBWbmL
+hZm6l+nExd9J1TPutVrUvSgF5br422Bt85gHVHc309/iXj2M6jMiOaXfPi3Om3LM
+hyRP/bKneykslZBsx4EQr2fCceqVPr1DqmzXoqbcXbZ70+5PF4xZRFWt26lmhuaO
+v/lercagqWYuHSEAEQEAAbQaSFJUIENhdCA8aHJ0Y2F0QHByb3Rvbi5tZT6JAdQE
+EwEKAD4WIQQ98RDErhlU6ccH14MLGlnqe+X9yQUCZKM8TwIbAwUJA8M0cQULCQgH
+AwUVCgkICwUWAgMBAAIeAQIXgAAKCRALGlnqe+X9yWaGC/4hnkAIK4UI4K02MkdT
+ZveRm4D2wvkYDPgzNc1imHHTsj1ZVaNC2EXGRuhkMjILjyhNgpH6o35SJORkYOWR
+4hPuhRaiVv2pfoQlvjyN82Dxco0eQS7ij0ynr2NP3pYg8Fiza8jWSzRJ/8TAPY22
+gN6ZxGBAENS+ThzJvQMy8huQs6dQUUaW/SSI32dj5yUM4cwHpWWQd9mSxhgM/cUh
+oEEHspWIOZL3amO6HXvMTgGErpZmvllNjMNgI7vcJVVc2w8yBrRrRNU66WSsDiSq
+gtViH28ASHB4NllKiNPU9JwZkOGUPwaU8AWyzWCTKGL0z4RuVpuLBfHp2bm1wB25
+O03prqqybuk2xSLPyU7TOedmmq/kfrt1ni9ZLRACrxB6QLXu2kwKHqFdJFkFwqZI
+K/eIHj/o/9PcFWbDcuyLcqRAkYuUQApo7KYQ9/CgAEYEuRciS+Pl+bdefS9p1Mr+
+wQ/NUl0UoPdLu7ab5f0zioBq7cscDWWALNRvkEoUyuU0NiS5AY0EZKM8TwEMAKoL
+1LLoHSjfe7J3QMgG8gHMk0yS/HFvgW8/wGUCS6ieTeCoVcUrLdNJf3yCICmDNflQ
+39dl6slh+RqGxm+rtcOYm1bpOPn1NJShCyGB4WiJWKZUd7H8dfv6Um7yTaiF2Zzm
+T1HFsvsomDR6vvZX7AiwAajy9G8ejLnxs2YtgzWmtJDYVlTWKVK5IdFV4t6Cq00G
+t/ThOU15lgobdtbFogfbuANt0oq5YQTiA70UJLjerviRRywH6g4UO3hBB6EJuQRZ
+3FLXxEJJ2vE1v2aY6zuOgmg0cbTyIcUKsH5mmgx9QsHo+ILfBkWs3Vu26IZrW7Xp
+X5oEAa1607q5bmIjO8aWILl2UuhvP/KWhuNURJVLKJ6BuqG335kcYG8wokcjvr4a
+KTGlrFXVNM2qfJ3lsBGimII7D7A+jBQJHrU8x9lbPSbVS/6wy2KJHlx7eK9iepjF
+yzS07y6sBfpJP0wrczZSKSIh3lzlLBL669GRAhm47Are2RGE4Thx3yfH1ikjOwAR
+AQABiQG8BBgBCgAmFiEEPfEQxK4ZVOnHB9eDCxpZ6nvl/ckFAmSjPE8CGwwFCQPD
+NHEACgkQCxpZ6nvl/cnLhgv/ePpJ6nqBrHhHY7J9XrWF8MhsZTs7H6BVYeQ+woDH
+gLRJOPRcl8Fpv49KrLC6FpYnGV6YMImHa8LYtyfZ1cqo81eJIaDWYAz/kptoOC2m
+K4RTen45kGSSznzzK42b7jhoHgPYd1bzSo70Rtpsd1Se5ZqL5teP3k+JJ/TqJlFE
+XMPlBSZD1S9ugJ5br+sQvmWL3OqbnmOpDI8L3X0jYOHrPbm02mIHPwI6Db2UuyXl
+B1q5E7M9V4Y+qmmNXNJSzKD49z2GEVPvmXyoLohJNypwyYXhPG3uI+3b+G3lc/Bd
+2vL48RykMBymJOHWRpx7LxWGiANHMq11X3v0ChMgeo9pPk4fDWCooLBUDGiX/d5w
+CTJV8NRD24ymRVy7lf8SskXremfoONcq5BK1CoUciC6AAt+mzFXonBQi7N/z71XT
+IPF0p9UL813usmkekuC3ergq/p9T/m7hHPT1WarvDpQDKCWSS9UfS0cPB9vQUxJ/
+HfEHUVT1d0LdJH09lClLAFSx
+=Hw+0
+-----END PGP PUBLIC KEY BLOCK-----
+
diff --git a/hrtcat/contribute.html b/hrtcat/contribute.html new file mode 100644 index 00000000..3149d856 --- /dev/null +++ b/hrtcat/contribute.html @@ -0,0 +1 @@ + Contribute | HRT Cat Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Contribute

HRT Cat is an open source project hosted here on Github. Pull requests to add or correct information are encouraged. If you would like to take a larger role in the maintenance of the site please contact us directly.

diff --git a/hrtcat/donate.html b/hrtcat/donate.html new file mode 100644 index 00000000..a917f74d --- /dev/null +++ b/hrtcat/donate.html @@ -0,0 +1,2 @@ + Donate | HRT Cat Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Donate

We hope it is evident that we have invested hundreds and hundreds of hours into this project (as well as over $1,000) with no desire for monetary gain. We do not run a business selling HRT, and we give all of this info free of charge to homebrew HRT sellers.

Our ask is that if you are an HRT seller, and you have relied on the info on this website, that you make a donation that accurately reflects the value that it provides to your business.

All donated funds will be shared amongst the follow avenues:

  • Investing in research with higher quality equipment to produce safely at a larger scale (laminar flow hood, bottle top filters)
  • Basic HRT experimentation
  • HRT mutual aid, so we may provide access to hormones for folks in our community or help connect people with folks who do.
  • Web hosting and security
  • Kickbacks to the generous people who let us use their physical space for HRT projects.

HRT Cat is a passion project. We do this because we are trans, and because we care about our community.

At this time we only accept Monero (XMR) cryptocurrency, as it is the safest and most anonymous option available for sending money on the web.

Monero XMR Address:

83H8WPtPa2HQXftRrTo5P3aLrrtiH2DTv2Wnhs16PrsG321pic2ETRT6HfQBMLHBfQ4X6eHJcjhXv66aumfJHctEBXA85iV
+
diff --git a/hrtcat/experiments.html b/hrtcat/experiments.html new file mode 100644 index 00000000..5efd9eac --- /dev/null +++ b/hrtcat/experiments.html @@ -0,0 +1 @@ + Experiments | HRT Cat Skip to main content Link Menu Expand (external link) Document Search Copy Copied diff --git a/hrtcat/experiments/benzyl_benzoate_concentration.html b/hrtcat/experiments/benzyl_benzoate_concentration.html new file mode 100644 index 00000000..a0a2395f --- /dev/null +++ b/hrtcat/experiments/benzyl_benzoate_concentration.html @@ -0,0 +1 @@ + Benzyl Benzoate Concentration | HRT Cat Skip to main content Link Menu Expand (external link) Document Search Copy Copied

How Much Benzyl Benzoate is Required to Stay in Solution?

In planning stages

Summary

Benzyl benzoate (BB) is a solvent in most HRT injectable recipes. It helps to absorb the hormone powder and blend it with the carrier oil. We are unable to find data that can help us determine just how much BB is needed to hold estradiol and testosterone esters in solution.

Par Pharmaceuticals uses 43% BB by weight in their 40mg/mL estradiol valerate and 23% BB in their 20mg/mL.1

For now it’s not worth the time to redo the work that Par Pharmaceuticals has done. However it may not be fair to say that the concentrations they’re using for EV also apply to other hormone esters like EEn. Make vials of 40mg/mL EEn at concentrations of 0%, 14%, 28%, and 43% BB. Use temperature fluctuations to attempt to get them to fall out of solution.

References and Notes

diff --git a/hrtcat/experiments/sterilizing_vials.html b/hrtcat/experiments/sterilizing_vials.html new file mode 100644 index 00000000..2e9ac052 --- /dev/null +++ b/hrtcat/experiments/sterilizing_vials.html @@ -0,0 +1 @@ + Sterilizing Vials | HRT Cat Skip to main content Link Menu Expand (external link) Document Search Copy Copied

What Makes Homebrew Vials Sterile?

In planning stages

Summary

Critical analysis of most homebrew methods reveals a distinct lack of understanding of modern sterilization practices. Are DIY patients who consume these vials avoiding infection because their bodies are fighting it off? Or perhaps the low-effort sterilization methods being employed are actually doing something? Maybe some people are picking up infections? It’s hard to know!

We want to design an experiment that replicates common homebrew methods and then analyzes the resulting product to determine sterility. Further, taking samples in 24 hour increments to determine if the preservatives in vials result in sterility over time as demonstrated in numerous studies (#TODO, link. on PubMed).

While this experiment will fall short of a study performed by trained scientists using a properly equipped lab, the results should be able to point us in a valid direction.

Importance

Thousands of trans people are injecting homemade HRT every single week. The vast percentage of the vials people use have received no quality control and very likely did not undergo adequate sterilization procedures. We have no data available within our community telling us how sterile these vials are and thereby how safe they are to inject.

If the data shows that, despite common guidelines, these vials are appearing to be sterile, then we can extrapolate that data, create further experiments, and potentially write guidelines on how to homebrew that use this data to make DIY more accessible.

If, on the other hand, the data shows that the vials are not sterile, we can use this information to help urge people to purchase their DIY from more reputable sellers. We may even be able to encourage the sellers to take on better homebrew practices.

Methods

Group A - Boil for 30 minutes. Group B - Autoclave for 30 minutes. Group C - Flask in oven @ 230°C for 30 minutes (fire risk) Group D - Syringe filter Group E - HRT Cat method

diff --git a/hrtcat/guide.html b/hrtcat/guide.html new file mode 100644 index 00000000..77fa3586 --- /dev/null +++ b/hrtcat/guide.html @@ -0,0 +1 @@ + Guide | HRT Cat Skip to main content Link Menu Expand (external link) Document Search Copy Copied diff --git a/hrtcat/guide/1-start.html b/hrtcat/guide/1-start.html new file mode 100644 index 00000000..2fd47dff --- /dev/null +++ b/hrtcat/guide/1-start.html @@ -0,0 +1 @@ + 1 - Getting Started | HRT Cat Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Getting Started Brewing Injectable HRT

Updated July 17, 2023

Talking about the safety of homebrewed HRT is difficult. Homebrewed vials have largely proven themselves to be safe through mountains of anecdotal evidence, yet when the average homebrew guide is analyzed critically it becomes clear that almost no one completes a single sterilization step effectively. We do not know how many people receive infections from these vials and whether or not immunocompromised people are disproportionately affected.

This guide aims to empower those who brew for themselves as well as those who brew for mutual aid and for profit to create vials that we can more confidently say have been sterilized. And while our general recommendation would be to stick with brewing topicals, this is a harm reduction-based guide that recognizes that vials are preferable to many people.

Certain steps and supplies will be annotated by a + symbol. This symbol indicates that this step is going above and beyond what people who are brewing for just themselves likely need to engage in. If you are brewing to distribute, either for mutual aid or for sale, we encourage you to follow these extra steps to ensure the safety of those who are receiving your vials. If you’re brewing for yourself and you’re immunocompromised, you may consider these steps as well.

What this guide contains

From a high level this is what we’ll be doing:

  • Gathering supplies
  • Building a clean room
  • Sanitizing, sterilizing, and depyrogenating everything we can
  • Working in a still air box or laminar flow hood+
  • Mixing, using a sterile syringe filter to achieve terminal sterilization
  • Taking a sterility sample+, and dispensing your preparation
  • Seal your vials, conduct a bubble point test, and document everything you did.
  • Place your vials in quarantine until sterility results are back+.

Read the sidebar

There are a plethora of articles in the sidebar. They are sometimes, but not always, referenced within the guide. We recommend you review the information in there, specifically in the Topics section.

We think homebrewing doesn’t have to be difficult or complex, but we do think that you need to be well-read on the topic to do it effectively.

Read Tyger’s guide on homebrewing

Tyger is a mutual aid homebrewer in the UK. While we have minor critiques on some of their recommendations, largely we think that their homebrew guide is exceptionally high quality.

If you are making vials at anything greater than small scale you would be best served to read their guide in conjunction with HRT Cat. We ask that you take a particularly strong look at their suggestions for aseptic technique, which go into far greater detail than we do on this site.

Guides by Tyger - look at “medium-scale”

This recommendation will remain in place until we are able to write a proper article on aseptic technique.

Create a procedure summary

Before you start with your brew we recommend you write out a step-by-step procedure explaining how exactly you’re going to do the process. Then, when you’re in the middle of brewing you don’t have to try to navigate this website, you’ll have a single document to reference. Here’s a sample we made, modify it to fit your brew plan.


2. What You’ll Need →

diff --git a/hrtcat/guide/10-selling.html b/hrtcat/guide/10-selling.html new file mode 100644 index 00000000..403a7735 --- /dev/null +++ b/hrtcat/guide/10-selling.html @@ -0,0 +1 @@ + 10 - Running a Business | HRT Cat Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Running your HRT Business

Updated July 19, 2023

It is up to you to check the laws in your specific locale to determine if this is legal or not. We would never advocate for you breaking the law. This info is for educational purposes only. HRT Cat cannot be held responsible for what you do with the info on this page or info anywhere else on this site. Delete your browser history. Burn your laptop. Move to the forest and join a commune of trans witches.

We’re going to give you some info about how to run an online business selling HRT. We can only discuss opsec as it pertains to the United States, so please check your local laws etc to see how certain things transfer over. This is aligned with the mission of HRT Cat because we want to see HRT get into the hands of those who need it. While we’re, perhaps unsurprisingly, not fans of capitalism, we recognize that selling vials is the most efficient way to distribute them. That said, a lot of this info could apply to a mutual aid based org.

Join the network

A lot of DIY users talk through various online platforms. As word of HRT Cat spreads, folks continue to demand higher quality HRT from their homebrew suppliers. While no one is able to verify that you are following our steps correctly, by virtue of you being here it shows that you’re putting in some of that effort.

Anyone who would like to can put this badge on their website. You can also make your own, or just say the words. We appreciate if you link back to hrt.cat/network.

People want to know what standards their homebrewers are following. We see lots of shit talk about various brewers across the different channels. Some people will even say “So and So looks like a good choice, but they don’t actually disclose their process.” So by directly linking to this website you are able to do that.

We believe the ultimate goal of homebrew is a mutual aid project, even when we choose to have profit involved. We understand that some people will want to hide their sources on how they learned to make DIY, but we hope you’ll consider the larger trans community and help spread the word about HRT Cat.

As much as donations are nice to help us keep this project going (and yes, they really do help), spreading the word is the number one thing you can do for us.

Testosterone

Before we start let’s discuss selling testosterone alongside estradiol. There is an obvious and highly understandable aversion to selling T due to the way many governments classify the hormone. This has created a vacuum of DIY T all over the world, as most producers are trans femmes who will only touch E. We’d like to call this out as problematic. Trans masculine people have a much more difficult time accessing hormones than trans femmes, and as HRT producers we have the power to close that gap.

Brewing T is the same exact process as brewing E. You just swap out the hormones for each other and change a few ratios around. You can even get raw T at most places you can get raw E.

We strongly believe that if you’re already going to take on the risk of selling E, that you should consider taking on the risk of T also. If selling HRT is about giving back to the trans community, then selling just E is neglecting half of our community.

Please consider it.

Digital Security

  • Purchase a dedicated laptop that can run Tails. Buy the laptop used, and in cash. Ideally unseen by cameras when doing so, wear a face mask and cover your ears to combat facial recognition. Not all laptops are compatible with Tails. Lenovo ThinkPads are usually a good choice.
  • only deal in Monero XMR cryptocurrency. no BTC, ETH, USD, etc. Only use the XMR wallet on your Tails laptop.
  • Learn how to use the Tails operating system. Your persistent storage should be encrypted and have a really good password. Look up what a really good password for Tails is.
  • Everything you do for your business is strictly done only on this laptop, only on Tails. Strictly.
  • If you’re able to, only use this laptop when at a public place such as coffee shops etc. so that you don’t have to access the Tor network over your home wifi. Rotate the shops you go to. This is a nice to have but not required.
  • Use protonmail as your email service, access it over Tor.
  • Use one protonmail account that’s going to be listed on your website, use a second, unlisted account that manages all of your back end stuff. Example: hotvials69[at]proton[dot]me is our public email, and 3903uthksb2snbg49[at]proton[dot]me is the account that actually controls our access to our webserver etc. This makes it that much harder for people to hack and track you.
  • Use the password manager that’s built into tails. every. single. thing. needs a unique password.
  • Learn how to use PGP and use it as much as possible. Put your public key on your website. Most of your customers won’t know how to use it, but some will and that’s good.
  • Checkout the aggregator website “tor taxi” to help you find the major websites that dominate the darkweb. some of them might even help you buy XMR without using your social security number!
  • purchase domain and webserver on njalla using XMR. we love njalla.
  • Do not use a database on your website, meaning no wordpress, etc. It’s a weak point. Instead, build a static website using either pure html, or something like Jekyll (what HRT Cat is built with).
  • Display your products on your website, and instruct people to email you with their order. You can then provide them with a unique, disposable, XMR address to pay you to.

Okay. Now you have an order, and you were even paid for it! Time to ship!

Shipping

We love the methodology of Vanna Pharma. They label all vials they sell with fake labels as if they’re essential oils meant to go into oil diffusers. We would add a batch number onto these as well so that folks can go to your website and lookup their batch number, like how Tyger does here.

  • no fingerprints on vials, packaging, labels, etc. None. Ever. Wear gloves. Wear gloves even when picking up packages to drop in the mailbox. No fingerprints ever.
  • purchase all shipping supplies in person with cash while wearing a face mask. Dark web vendors (selling large volumes of HIGHLY illegal drugs) have been busting using amazon purchase histories.
  • Use thin padded envelopes. No vial clinking noises allowed.
  • use stamps ONLY. no pre-paid postage, no tracking numbers, no credit cards, no ID.
  • packages MUST have a VALID return address with a fake but believable name. That address should NEVER be you. Don’t choose an abandoned house. Don’t choose your republican neighbor as a return address, as they’ll be much more likely to call the police if a package is accidentally returned to them. Use stereotypes and discrimination to choose return addresses that are more likely to have people throw away the package instead of call the cops. Rotate this address. Failure to have a return address is a MAJOR red flag with the USPS internal audit system.
  • Only mail packages from a street corner USPS big blue mail collector. ensure you are not being recorded by any cameras at this drop site, this includes neighbors doorbell cameras. Try to be filmed as little as possible on your way to drop off the packages, and always hold the packages in a larger bag (like a tote or purse) so cameras can’t see you have the small envelopes.
  • Regularly rotate the USPS drop-off you use. The return address you choose should always match the zipcode, or even the neighborhood of the drop-off site.
  • No handwriting on the packages. Print labels for the addresses.
  • On a regular basis, rotate the envelope brand, labels brand, fonts, and design of stamps that you use. It helps keep your packages unidentifiable.
  • Use the correct amount of postage. Too little will have it returned to your fake address which will raise a red flag with your neighbor. Too much will raise a red flag with USPS’s internal audit system.

This method does not include a tracking system. It instead relies on the honor of your customer to not lie to you about not receiving their package. That sucks, but you know what sucks even more? Going to prison as a trans person.

IRL Security

  • This project of yours is on a need to know basis. Don’t tell your friends you’re doing it unless you are recruiting their direct assistance. Even then, they less they know the better. The more information is siloed the safer everyone is.
  • Tails is run off a flash drive. Find a fantastic hiding spot for this flash drive when it’s not in use. One that might go overlooked if someone were to turn your living space upsidedown.
  • Don’t leave your brew supplies out in the open.
  • Don’t advertise your business using anything but your Tails laptop!
  • For ultimate safety, don’t offer homebrew to people in your local community. No hooking people up with hormones who you see asking on social media, for example.

Crypto

We don’t know a lot about withdrawing crypto safely. Keep as much of it as possible in your wallet, as you will be using it to purchase some of your raw supplies. Using your new darknet powers do some research on how best to withdraw. Try to avoid transferring it to coinbase and just straight cashing out.

Maybe by now you’ve seen the “Dark Net Bible.” Well there’s also something called the “Dark Net Vendors Bible.” It’s hard to find, check the forums on tor.taxi. There’s an outdated PDF circulating with this info. Someone has taken that and is trying to revamp it on a dedicated forum. Again, hard to find, but you can find it through the forums.

Anyway, this vendors bible might have info about how to safely cash out.

Giving Back

If you’ve read this far then it seems like HRT Cat has been pretty helpful for your business. We’d appreciate if you could support this project by sending us a donation! We have invested hundreds and hundreds of hours into creating this website, and we plan to invest many hundreds more.

Donated funds will directly contribute to server space, experiments, and HRT mutual aid. Please consider the value of this website.

With love, The HRT Cats

diff --git a/hrtcat/guide/2-supplies.html b/hrtcat/guide/2-supplies.html new file mode 100644 index 00000000..c3cfc591 --- /dev/null +++ b/hrtcat/guide/2-supplies.html @@ -0,0 +1 @@ + 2 - What You’ll Need | HRT Cat Skip to main content Link Menu Expand (external link) Document Search Copy Copied

What You’ll Need

Ingredients

Vials

  • 3mL glass vials (choosing size)
  • 100mL glass vials (empty, pre-sterilized & sealed or make your own)
  • Vial caps (make sure right size for vials)
  • Butyl rubber vial stoppers (make sure right size for vials)

OR

  • Pre-sterilized and sealed glass vials (3/5/10mL). Only use these if you’re making 1-2 vials at a time as it must be punctured to fill, thus accelerating expiration. The use of pre-sterilized and sealed vials substantially lowers risk of contamination, assuming the vials are finished within a couple of months of filling. This guide will not touch on this subject further as the focus here is bulk. When you puncture to fill, use a second needle puncture to allow air to escape as you fill the vial. (see step 6 for more details).

Disposables

  • Large sterile luer lock syringes to use with filtration (10-50mL, larger is more difficult to push because math)
  • Sterile 0.22μm hydrophilic PTFE syringe filters (how to choose)
  • Isopropyl alcohol 70% (IPA) (higher percentage is NOT better, use 70%)
  • Disinfecting hand soap
  • Aluminum foil
  • Distilled water
  • Poured and ready sterile Tryptic Soy Agar (TSA) plates+ (with and without neutralizer, how to make at home)
  • Biological indicators1
  • Autoclave indicator strips+ (more)

Tools

  • Autoclave (we use an Instant Pot, though a stove top pressure cooker would likely work too)
  • Milligram scale
  • Glass media containers/beakers for mixing
  • Glass stirring rod
  • Vial crimper (that will fit your vial size, i.e. 13mm or 20mm)
  • Table that can be sanitized to work on (don’t work directly on wood)
  • Oven that reaches 250°C/482°F
    • Oven thermometer to verify temps in your oven
  • Baking sheet/tray/dish
  • Spray bottle for the IPA
  • HEPA Air purifier+
  • Laminar flow hood+ OR a still air box
  • Plastic sheeting for creating a makeshift clean room

Garbs

  • Face masks
  • Latex or Nitrile gloves, ideally sterile
  • Long sleeve gown with wrist cinches (if unavailable, use freshly laundered item that is put on just before entering the clean room)
  • Shoe covers
  • Hair covers (includes facial hair)

← 1. Getting Started 3. Prepare Work Area →


Notes

+Indicates that the use of this item is going above and beyond what people who are brewing for just themselves likely need to engage in. If you are brewing to distribute, either for mutual aid or for sale, we encourage you to follow these extra steps to ensure the safety of those who are receiving your vials. If you’re brewing for yourself and you’re immunocompromised, you may consider investing in these additional items as well. There is no data that says where the line is, so we err towards conservative safety.


  1. Biological indicators are currently out of scope until we can find a way to lower cost. All indicators we can find for sale come in packages of hundreds. Contact us if you know more. 

diff --git a/hrtcat/guide/3-work-area.html b/hrtcat/guide/3-work-area.html new file mode 100644 index 00000000..665c821d --- /dev/null +++ b/hrtcat/guide/3-work-area.html @@ -0,0 +1 @@ + 3 - Creating a Work Area | HRT Cat Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Creating a Work Area

Creating a clean area where you can minimize the flow of dust particles and bacteria is essential to creating a clean product.

  1. Find an area where you can build a small clean room by hanging the plastic sheeting to create makeshift walls. There should be no carpet and nothing in this area that can hold on to dust and bacteria. Ideally in this area there’s nothing but the bare floor and the table.
  2. Hang the plastic sheeting. The clean room does not need to be airtight, which would be near impossible to achieve at home, but the closest you can get to that the better. If you have a HEPA air filter then there needs to be an opening for it to blow into the clean room, and a second opening to act as a doorway.
  3. You need a HEPA air purifier blowing air into the clean room, the in-take for the air purifier should be coming from outside the clean room, so as to create a pressurized environment1 inside of the clean room.
  4. The table in your clean room needs to be able to be sanitized, wood is not a good candidate for this, you can lay plastic sheeting down on your table in order to create a work surface that can be sanitized if you don’t have another option.
  5. Clean the clean room. Everything in here should be free of dust dirt grime, and sanitized. Keep the HEPA purifier running.

← 2. What You’ll Need 4. Wash and Sterilize Tools and Vials →


References

  1. Compounding Sterile Preparations, what page? 

diff --git a/hrtcat/guide/4-sterilize.html b/hrtcat/guide/4-sterilize.html new file mode 100644 index 00000000..9ab3ef84 --- /dev/null +++ b/hrtcat/guide/4-sterilize.html @@ -0,0 +1 @@ + 4 - Wash and Sterilize Tools and Vials | HRT Cat Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Wash and Sterilize Tools and Vials

Now that you have a clean room that is more or less clean, you can start bringing your tools inside of it. Wipe down everything with isopropyl alcohol 70% before bringing it inside the room. This includes wiping down the outside of plastic bags, etc. You should be wearing gloves that you are frequently sanitizing with the isopropyl alcohol. The goal here is that everything in this room is clean and sanitized, so if your hands are dirty or your shoes are dirty etcetera then you are working against yourself and the final sterility of your vials.

Set up your laminar flow hood or your still air box, ensuring that you wipe down the whole thing with alcohol to sanitize before use. If you are using a laminar flow hood you can turn it on now so that you can begin circulating more filtered air through your clean room.

Depyrogenation

All glassware and vials must be depyrogenated prior to use.1 The technique we are using will sterilize them at the same time.

Preheat your oven to 250°C/485°F for depyrogenation. You should have an oven thermometer inside your oven to verify that you’re at the right temperature. Hotter is okay.

Before you can depyrogenate your vials you need to wash them out to ensure that they are free from debris. We do this by dunking everything into a large pot of warm soapy water, shaking each vial underwater back and forth and then rinsing well with cold, distilled water.

No need to let the vials air/drip dry. If you used distilled water to rinse then it will leave to residue when you put it in the oven. Wrap your vials and glassware in aluminum foil in a way that will let steam escape but not let dust etc fall in, e.g. loosely fitted hats. Once your oven is at temperature put the items inside. You need to let the items get to the correct 250°C temp,2 and then once they are at temp you should bake for at least 30 minutes.3 It is difficult to determine when the items are at 250°, if you have a laser thermometer you could use that. Otherwise, we recommend you be play it very safe and give it an hour to get up to temp. This means you would have the items in the oven for 90 minutes after pre-heating.

Once the time is up transfer the tray with the still wrapped glassware from the oven directly into your clean room. Keep wrapped.

Sterilization in Autoclave

If you are using a pressure cooker to sterilize instead of an autoclave you should be sure to read this page.

Items that can’t be depyrogenated in the oven should be sterilized in the autoclave. While vial caps and stoppers are typically depyrogenated with pressurized Water For Injections (WFI) that is currently beyond the scope of what we feel we can achieve at home (if you’re distributing your vials please consider learning how to do this).

Wrap items in foil in a way that will allow steam penetration but will help keep them protected from microbes in the air when you remove them.

Vial caps, stoppers, vial crimper (if it fits and if it’s rated for autoclaves), any utensils etc that didn’t go in the oven.

Your autoclave should operate at 121°C at 15psi for 60 minutes.4 In a lab setting you might be able to leave it in for less than 60 minutes, but since we are unable to do certain validation testing at home, you should opt for this longer time.

Sanitize what’s left

Anything you couldn’t put in the oven or autoclave should be sanitized with 70% IPA. Examples like the work surface and scale.

Fingertip Testing+

If you are going to do fingertip testing+, now is the time to take the before sample. How to perform fingertip testing.


← 3. Prepare Work Area 5. Mix Solution →


References and Notes


  1. Compounding Sterile Preparations page 274 

  2. If a vial is 25°C, and you put it in the oven, it won’t instantly become 250°C. Therefore, you need to give it time to get up to temp. 

  3. DEPYROGENATION OF PHARMACEUTICAL PACKAGING COMPONENTS 

  4. Compounding Sterile Preparations pages 253-254 

diff --git a/hrtcat/guide/5-mix.html b/hrtcat/guide/5-mix.html new file mode 100644 index 00000000..ba9edfab --- /dev/null +++ b/hrtcat/guide/5-mix.html @@ -0,0 +1 @@ + 5 - Mix Solution | HRT Cat Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Mix Solution

Updated July 21, 2023

We do not use a magnetic stirrer but that is an option instead of using a glass rod. Would be useful if making large batches.

Recipe

Choose a recipe to brew, there are many options listed here.

You can also try out our new recipe calculator here! This calculator is in beta, so please use it with caution.

Mixing

Doing this all inside your still air box or laminar flow hood. Using proper sanitization techniques.

Measure out all the ingredients into a depyrogenated beaker or media bottle. They do not need to be added in any specific order. Mix them up with a glass stirring rod until the hormone powder is fully dissolved. If you are having trouble getting the powder into solution it is possible that you did not use enough benzyl benzoate.

If using heat

Heat is not required to get your hormone powder to dissolve, especially when you’re using benzyl benzoate in your mixture. However, the use of heat may accelerate the process of dissolving it, especially when making very high concentrations or leaving out BB. Without BB you risk it falling out of solution later with temperature fluctuations.

When we assemble our cleanroom we fill a large thermos with boiling water, so we don’t have to boil water in the clean room. We then take a large bowl, pour some boiling water into it, and then submerge the beaker into the water while stirring. It massively speeds up the dissolving process.


← 4. Wash and Sterilize Tools and Vials 6. Filter Solution →

diff --git a/hrtcat/guide/6-filter.html b/hrtcat/guide/6-filter.html new file mode 100644 index 00000000..76af3379 --- /dev/null +++ b/hrtcat/guide/6-filter.html @@ -0,0 +1 @@ + 6 - Filter Solution | HRT Cat Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Filter Solution

Updated July 17, 2023

It is easier to break syringe filters than you think. Really. They’re difficult to push the preparation through which leads to overcompensation. We highly recommend that you practice using a syringe filter and then preform a bubble point test on it to determine if you broke it or not. Do this with a mixture similar to your final preparation (e.g. 2% BA, 44% BB, 54% MCT), just without the hormone component. If you’re planning to make a 50mL batch, practice with 50mL. Practice enough so that when you’re doing the real thing you can be more confident you’re not going to break it. If you break the filter during the real thing all of your medicine will need to be extracted from vials and refiltered.

Verify what volume of liquid your filters are rated to work on. Do not exceed the manufacturer’s recommendation. In general if you’re filtering 1-10mL, use a 13mm filter, 10-100mL use a 25mm filter, 100m-250mL use a 33mm filter1. So for example, if you have 25mm syringe filters, and you’re filtering 250mL of your preparation, you’re going to need to use 3 filters in total. Pushing syringe filters sucks. If you’re working with too much preparation for this to be practical consider switching to a vacuum pump and bottle top filters. We are unclear on how to conduct DIY bubble point tests on bottle top filters, and in general we don’t recommend these unless you have a laminar flow hood.

Why do we filter into 100mL vials? The reasoning is that it exposes your preparation to as little un-sterile air as possible. If you’re filtering directly into your final vials, and then capping them, they’ve been exposed to air and dust and bacteria for over a minute due to how slow syringe filters work. With this method we can have our sterile empty vials exposed for around only 5 seconds.

Why don’t we use bottle top filters? Similar to the point above, bottle top filters require us to filter into a flask that is open to the air. This isn’t a problem if we have a laboratory grade flow hood or clean room, but since this guide is meant to be followed in your (very clean) kitchen, we prioritize sterility over efficiency.

You should be working inside your still air box or laminar flow hood. Your hands/gloves/etc and everything need to be fully clean. We lightly spray our gloves with IPA 70% and rub together to sanitize.

At this point your glass vials and the vial stoppers should still be wrapped/covered after their depyrogenation/sterilization process.

Attach a large gauge needle to a large2, freshly unwrapped, and sterile syringe. Insert into the mixture and draw it up. With clean hands remove the needle and attach a sterile syringe filter to the syringe and a new, sterile, large gauge needle on the end of the filter to help direct the flow successfully into the vials.

Grab your pre-sealed, pre-sterilized 100mL vial, wipe off the top with a sterile alcohol prep pad, and puncture it with the needle coming off the syringe filter. You will also need to puncture it with a second needle to allow air exchange. SLOWLY push down on the syringe, careful to not push harder than necessary to create a steady drip of filtered preparation.

This is going to take a while. After you’ve emptied your entire syringe into the vial, IF you’re going to immediately keep filtering, we’ve found it best to leave BOTH needles and the filter attached to the 100mL vial, but to disconnect the syringe at the filter. Then (with clean hands) you can fill your syringe back up, reconnect, and keep going. Remember to check the capacity of your filters so that you know when to change them.

Once you’re done, or if you’re taking a break, withdraw the needles. We think it is likely not ideal to leave a sterile syringe filter laying around that’s not in active use, so try not to take breaks. Once you do resume, be sure to switch to fresh needles for both the filtered preparation and the exhaust needle.

The beauty of this method is that as you filter your preparation, it is immediately protected and stored in a sterile container with no open air exchange (just the exhaust).

You can spend your afternoon doing this, filling as many 100mL vials as you desire.

A couple notes:

  • Every time you finish using a syringe filter, do a bubble point test on it BEFORE moving on to filter another batch. This can help you catch any flaws in your filtration earlier. We’d much rather find an issue with our filtration after filtering 100mL as opposed to 500mL.
  • Every syringe filter you use should have its filtered product separated from product that different filters were used on (i.e. don’t use multiple filters on the same 100mL vial). We need to preform sterility testing on the product that came out of EACH individual syringe filter.
  • Label the 100mL vials as you go with the order that you produced them. Track this alongside the filters that were used for each one and the bubble test results of each filter.
  • You can store your medicine in the 100mL vials overnight. We do not recommend storing like this for more than 24 hours considering the vial is punctured.

← 5. Mix the Solution 7. Bubble Point Testing →


References and Notes

  1. How to Select a Syringe Filter and How to Use it? (2020 Guide) 

  2. use something in the range of 10mL to 50mL. Word has it that the syringe gets more difficult to push the solution through the filter the large the syringe is. We haven’t tried it ourselves. 

diff --git a/hrtcat/guide/7-bubble-point.html b/hrtcat/guide/7-bubble-point.html new file mode 100644 index 00000000..c4117d96 --- /dev/null +++ b/hrtcat/guide/7-bubble-point.html @@ -0,0 +1 @@ + 7 - Bubble Point Test | HRT Cat Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Bubble Point Testing

Updated July 17, 2023

PLEASE do this step to ensure your preparation is sterile. It requires no additional tools.

At this point you should have one or more 100mL vials with filtered product. Before we go through the hassle of putting everything in vials, let’s make sure the filters held up during filtration!

We rely primarily on the syringe filter to ensure the sterility of the end product. While people will speak at length about other ways to sterilize DIY brews, filters are the only scientifically validated method of sterilization and depyrogenation of your preparation that are available for you in a DIY lab.

For this reason, we urge you to conduct a bubble point test to ensure that your syringe filter maintained integrity throughout your filtration process. Bubble point testing does not require any additional tools beyond what you already have on hand, and it takes only a minute to conduct plus some light math that we are going to help you with. This is a test we do on the syringe filter(s) we used to prepare our vials. If you did a 2nd pass filtration for sterility testing do not conduct a bubble point test on any 2nd pass filters.

  1. Find the bubble point of your syringe filters, A. It should be listed on the package or on the product’s webpage. You can also use a new filter soaked in MCT oil and this methodology to calculate it.
  2. Find the current air pressure at your location using today’s weather, convert from inHg to PSI, B.
  3. Remove the syringe filter from the syringe you were filling with, and then fill that syringe (or a new one) with air to an exact measurement, C, e.g. 10.0mL. Reattach the syringe filter. Attach a large gauge needle to the filter.
  4. Submerge the needle in a cup of tap water. Slowly exert pressure onto the plunger, attempting to push air through the filter. When the needle starts emitting a steady stream of air bubbles record the volume marked on the syringe, D.
  5. You should have the below values:

A - Rated bubble point pressure B - Current air pressure C - Starting volume D - Actual bubble point volume

Go to the Boyle’s Law Calculator and input your values. Initial pressure is B. Initial volume is C. Final volume is D. Make sure you’re using the correct units of measurement.

The calculator will give you a value for final pressure, call this E - actual bubble point

How does the rated bubble point of your filter, A, compare to the actual bubble point you calculated? If the actual bubble point is lower than the rated bubble point, you need to ask if your filter failed during filtration.

For example, if our filter is rated to 86psi, and our actual bubble point was 77psi, we’re going to consider the filter functional. It withstood a lot of pressure, and we’re working with only estimates here. Laboratory bubble point tests use more sophisticated methods of measurement.

On the other hand, if our filter is rated to 86psi, and our actual bubble point was 40psi, then this is a sign that there was a major failure with the filter during use. It is likely that a significant amount of medicine did not properly pass through the membrane.

If your filter failed, it might be worth running an experiment on a new filter from the same batch to determine where it’s bubble point is (once the filter is saturated in oil). It’s (unlikely but) possible the batch was incorrectly labeled

If we determine that our filter failed during use, we will redo all of our work. Working in the still air box or laminar flow hood we will remove all the mixture from all the vials with a syringe and needle. We will use a new syringe and new syringe filter and re-filter everything into NEW sterilized and depyrogenated vials.

HOWEVER, some filters will fail due to chemical degradation. There is always a chance that if this happened that chemicals from the filter leeched into your medicine. It’s unclear if another round of filtration would remove that. For this reason we recommend only PTFE filters or nylon filters if PTFE is unavailable. These are the only filter membranes that have a studied compatability with Benzyl Benzoate.


← 6. Filter Solution 8. Dispense Solution →

diff --git a/hrtcat/guide/8-dispense.html b/hrtcat/guide/8-dispense.html new file mode 100644 index 00000000..37d4b334 --- /dev/null +++ b/hrtcat/guide/8-dispense.html @@ -0,0 +1 @@ + 8 - Dispense Solution | HRT Cat Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Dispense Solution

Updated July 17, 2023

If you are going to do a final sterility test+ be sure to supplement the information in this section with the information in the one just below.

You should be working inside your still air box or laminar flow hood. Your hands/gloves/etc and everything need to be fully clean. We lightly spray our gloves with IPA 70% and rub together to sanitize.

At this point your glass vials and the vial stoppers should still be wrapped/covered after their depyrogenation/sterilization process.

Wipe off the stopper on the 100mL vial with a sterile alcohol prep pad. Use a fresh and sterile large syringe and needle, withdraw an amount of fluid that will evenly divide into your vials, so that you don’t need to fill up any one vial twice.

Example: Fill your 20mL syringe to 18mL, which divides evenly into 6 3mL vials.

You will need to aspirate the large vial in order to draw up such a large amount of fluid. Make sure that the air that you’re aspirating with is coming from inside your still air box or laminar flow hood… it’s that much more likely to be contamination free.

You now have your syringe with 100% sterile medicine in it. Make sure that your vial stoppers and caps are ready to be grabbed. Remove the aluminum foil hat on a single vial, being careful to not hover your hands or sleeves above the opening. Insert the needle into the vial and dispense the medicine, in our case, exactly 3mL.

Quickly, but without passing a hand or sleeve over the exposed vial, and without stirring up air currents in your box, place a rubber stopper on the now full vial.

Phew! If all done correctly, the tiny opening of the vial was only exposed to air for about 5 seconds before the stopper was put in place. We do not rely on heat sterilization, because heat sterilization isn’t scientifically sound for this preparation. We rely on swiftness, and gentleness in this last step.

Once the stopper is on, you can cap it and crimp, or pass the vial to a helper to have them cap and crimp.

Do this for each vial until you’ve used up all your mixture in the syringe. Then, use a new sterile alcohol prep pad to clean off the stopper of the 100mL vial, aspirate, and go ahead and draw up some more of the preparation to continue dispensing.

We like to change the needle out after 1-2 punctures of the 100mL vial, just as an over-abundance of caution.

Sterility Test+

If you are going to do a final sterility test+, you need to determine what total volume of your final preparation1 you’re going to run the test on.

Total Volume of Preparation Volume to Test
< 1mL 100%
1-40mL 50%
40-100mL 20mL
> 100mL 10% (min. 20mL)

Any volume you’re not using for sterility testing will be filtered directly into vials just like usual. The remaining liquid should be filtered into a sterile flask. Then, using a new sterile syringe, a new sterile filter, new sterile needles, you draw that fluid back up and re-filter it. This second pass filtration can be done with a 0.45μm filter to make it easier, but 0.22μm is okay too if that’s all you have.

The 2nd pass should be filtered directly into NEW sterile 100mL vials.

Set aside the 2nd pass filter(s) for now, you will preform the sterility testing on them later. The reasoning is that the 1st pass filter should have collected any contamination, making the 2nd pass filter in theory pointless. If we are unable to grow bacteria off of the 2nd pass filter, then we have validated the efficacy of the 1st pass. This will serve as validation for a sterile, contamination free batch.


← 7. Bubble Point Test 9. Final Steps →


References and Notes

  1. Compounding Sterile Preparations pg 261 

diff --git a/hrtcat/guide/9-final-steps.html b/hrtcat/guide/9-final-steps.html new file mode 100644 index 00000000..d70f0a73 --- /dev/null +++ b/hrtcat/guide/9-final-steps.html @@ -0,0 +1 @@ + 9 - Final Steps | HRT Cat Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Final Steps

Final Sterilization

There is a vast misconception that putting closed and finished vials into your autoclave will sterilize them. Because the vial is sealed and cannot be penetrated by steam, there is no veracity to this claim. The heat generated from your autoclave alone is not sufficient to sterilize the inside of the vial. See this page for more info.

Therefore, you do not need to take any final sterilization steps if you followed the previous steps precisely.

Of course, some bacteria is killed at 121°C. An autoclave cycle won’t do nothing, but it is not sufficient to create conditions of sterility in your vial. You may put your vials into the autoclave for 30-60 minutes, as a final just-in-case, but in theory it’s not needed.

Making a Record

It’s important that you have a written record of everything you did with this brew. This is an extremely important quality control technique.

  • The ingredients and supplies used, where they were acquired, when they were acquired, and their lot/batch numbers if available
  • The items that were sanitized, sterilized, and depyrogenated
  • The temperature, time length, and technique that was used for those “cleanings”
  • Bubble point test info
  • Outcome of fingertip+ and sterility testing+
  • As much as you can write about exactly what you did
  • Anything else you can think of.

This data should be given a Batch Number. If you encounter any problems with any of your vials down the line, you can look at the batch number and review the process and ingredients.

Labeling

You should label each vial with the following information

  • Active ingredient and strength (e.g. 40mg/mL)
  • Total volume
  • Manufacturer name (that’s you!)
  • Manufacture date
  • Batch number

Optionally you might add

  • Inactive ingredients and concentrations
  • Logo/design/cat girls/memes

Here’s an example of something we might use:

example vial label

If you plan to mail your vials, especially T, you may consider making fake labels for your vials to claim that something else is inside of them. If you’re doing this make sure your recipient knows you’re doing it and knows where to find the correct information that should be on the vials.

Check status of tests

If you preformed fingertip testing and final sterility testing #TODO

All done :)

If you have plans to sell your vials, or if you’re already doing so, we recommend you read through the tips on the next page to help your security culture.


← 8. Dispense Solution 10. Running a Business →

diff --git a/hrtcat/index.html b/hrtcat/index.html new file mode 100644 index 00000000..094151ae --- /dev/null +++ b/hrtcat/index.html @@ -0,0 +1 @@ + Home | HRT Cat Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Version 1.0

Last Updated July 21, 2023 View the changelog

Big updates: We rewrote the filtration and dispensing steps of the guide to create stronger conditions for sterility. A final section to the guide was also added with tips to safely run your business. A recipe calculator was added. View the changelog to see what else is new.

Hiya! Welcome to HRT Cat. This is a website where you can review information on how to make injectable HRT for sale, for mutual aid, or just for yourself. It’s also a launching point for so many other types of necessary information about DIY HRT. It seems like every day the world becomes a scarier place for trans people. This website is dedicated to taking hormone therapy into our own hands when bigoted governments and institutions stand in our way. This website is open source, please feel free to become a contributor or to make a donation.

HRT Cat is in active development and should be a considered a living document. Data here is subject to mistakes and changes. We cite our sources so that you can double-check our work.

Homebrewing HRT in the safest ways possible

Welcome the HRT Cat! This is a guide for homebrewing injectable estradiol and testosterone for yourself, for mutual aid, or for grey market resale. HRT Cat is open source and ready for contributions. We do not sell HRT, this guide is solely for the purposes of harm reduction in the trans community.

There is a lot of misinformation in the DIY injectables online community. This guide was thoroughly researched using a variety of scientific resources that are all cited throughout the guide. we have rigorously researched many commonplace claims about how to brew, and have either validated or refuted those claims.

We have done a deep dive into sterilization best practices when dealing with compounding what is called high-risk* preparations. Many of those practices cannot be completed in a home lab, but of the ones that are manageable we have written about them in the context of homebrewing. We hope that we can bring safe and necessary lab practices to people who are resorting to homebrewing, no matter the reason.

As far as we see it, given the state of the world, people in this community will be more and more forced into making their own hormones. And while there are options available for purchasing HRT online without a prescription, some people will opt to homebrew.

Homebrewed vials will never be as safe as what can be achieved with proper training and tools. Homebrew vials should be a last resort. Consider making topicals. We provide this information because we believe homebrew is better than what happens when trans people are not given access to hormones.

Where to start?

If you’re ready to dive right in, take a look at the first guide, Getting Started.

If you have a specific question, you might try looking at the documented topics to see if there’s any info you’re looking for.

Otherwise, explore the links in the sidebar. We put things there.


Notes

*starting with non-sterile ingredients and creating a sterile product, like what we’re doing.

diff --git a/hrtcat/journal.html b/hrtcat/journal.html new file mode 100644 index 00000000..7482aaee --- /dev/null +++ b/hrtcat/journal.html @@ -0,0 +1 @@ + Journal | HRT Cat Skip to main content Link Menu Expand (external link) Document Search Copy Copied

DIY Journal

Welcome to our journal where we write about wild fantasies we have about catgirls what we’re actively learning on any given day. Thoughts may be incomplete and scattered, these are merely our own notes. Look at Topics and Guide for more structured info.

Silicone Stoppers are Cancelled

These seemed like a good idea due to their high heat resistance and therefore their ability to withstand dry heat depyrogenation. However, we located a study that has indicated that benzyl alcohol (BA), the essential preservative in HRT, can be absorbed by silicone and then even evaporate out the other side of it. While this hasn’t been studied in relationship to a preparation with a 1% concentration of BA, it stands to reason that as the preparation make contact with the vial stopper it could, rather quickly, remove the preservative from the vial.

This is of much higher concern than a stopper that did not undergo depyrogenation. we are switching the guide back to using butyl rubber. We will use a minimum of autoclaving the stoppers for a sterilization cycle. We will look further into using pressurized WFI at home to depyrogenate. This is probably out of reach or asking too much of the average homebrewer. we’re sad to have lost this easy method but grateful no vials have been produced with the silicone stoppers.

Vial contamination

why do a severe lack of sterilization practices in most DIY guides result in vials that are not causing infection en masse? our theory is that the benzyl alcohol in the vials is killing stray contamination. There are some studies that tangentially support that theory.

Final Sterility Testing

There is a sterility test that can be preformed on the vials, CSP pg 261, USP 71

The minimum volume of each CSP to be tested is dependent on the volume of the final product. If the product is <1 mL, the entire volume must be tested. If 1–40 mL, then half the total volume is tested. If 40–100 mL, then 20 mL is tested. If the volume is >100 mL, then 10% of the volume is tested (but at least 20 mL).

To do this you would decide how much of your preparation you’re testing, then you run it all through a 0.45μm filter. Then you can disassemble the filter, and put the membrane on agar. Incubate for 14 days.

After the mixture passes through the 0.45μm filter it is, in theory, still adequate for use as soon as the tests clear. Therefore, you could do a procedure like filter most though a 0.22μm filter straight into vials. Filter the remainder through the 0.22μm into a sterile and depyrogenated container. Then run that all through the sterile 0.45μm filter (clean syringe) while dispensing into vials.

This is not part of our procedure right now, but it should be. The issue we run into is regarding which type of agar to use for this. CSP pg 262 says that USP says that it needs to be FTM (lol) or SCDM agar, neither of which appear to be readily available for the public to purchase or to even make at home for less than hundreds of dollars – https://microbiologie-clinique.com/trypticase-soy-agar-principle-interpretation.html

#TODO - finish section on sterility testing, revise the rest of the guide to reflect.

1 week later

Okay so scratch some of the above. This seemed more difficult to manage because the USP uses a weird naming convention for their agar types. What they call SCDM (soybean-casein digest agar medium) is typically referred to as TSA (tryptic soy agar) within the scientific community. TSA powder and plates are both readily available on Amazon for just shy of $50.

It would be good to do more research on the second type of recommended agar, FTM, to see what the primary difference is between TSA and what types of growth it supports. Using one of these is better than none.

Additionally, need to look into what type of agar is needed for fingertip testing.

What does heating a sealed vial to 120C actually do??

We can confidently say that the air inside the vial is heated to 120C also. When air is heated that much it should expand a relevant amount.

According to this Quora answer we can use the Ideal Gas Law to calculate the pressure changes.

103.4kPa x 393/293 = 138.7kPa

assuming we start at 15psi and 20C, and we heat to 120C, we end up with a final pressure of 20psi inside the vial.

Let’s crosscheck that pressure value with moist heat sanitization.

moist heat sterilization requires a pressure of 15psi. Not sure how to rectify that with 15psi being like, literally what is in our living room rn according to the internet. Maybe the moral of the story is that we need steam. No one says to sterilize with pressurized dry heat.

Benzyl Benzoate (BB)

May 29, 2023

There are reports of this ingredient not being needed as it’s primary purpose is to act as a solvent. Hormone esters are oil soluble, and so they will likely reach solution without it and with using a little heat. Unfortunately this could lead to preparations falling out of solution with dramatic environment changes, just a theory.

Looking further, it appears that every recipe we can find online both from DIYers and pharmaceutical companies list benzyl benzoate as an ingredient. Being unable to find verifiable information at to why this is, we will take it as a near certainty that we’re going to want the solvent boost in our brew.

Once we have more space around this project we may perform a set of experiments with E En, MCT, and BB to determine what’s needed to get it to fall in and out of solution at various concentrations. In the meantime we need to finish building this guide and there are more important questions to be answered, like “will anyone read this?” and “how many people are going to attack us in our DMs for claiming that using an autoclave on a sealed vial is pointless and has no supported scientific basis?” and “how do we make this logo look good at all screen sizes?”

Material List

Reddit r/steroids

Depyrogenation

Three common pharmaceutical packaging components are ampoules, vials and stoppers. Each component needs a specific depyrogenation procedure due to its chemical properties. document

great comments on reddit

depyrogenate glass, stoppers, and lil foil bits. after removal from oven, cover vial tops and stoppers in foil to protect. puncture aluminum to fill vial.

USP 1228: Depyrogenation - consider looking at USP 1211, it may have some methods for depyrogenation that are slightly out of date.

USP 381: Closures for Injections

Might be in the weeds on the question regarding how to depyrogenate the rubber stoppers. But also, it’s a very valid question. It seems to be largely overlooked within a DIY setting and in laboratory conditions there are tools to do the testing we’re not able to do.

we’re going to rest at this point here for now:

  1. Butyl rubber stoppers might lose integrity if dry-heat depyrogenated.
  2. Silicone rubber stoppers are significantly less likely to lose integrity if dry-heat depyrogenated, due to silicone being strong af.
  3. Using pre-sterilized vials sounds ideal, but there is a major downside of piercing a vial and then putting it in storage. we’re unable to find ANY information relating to doing things this way.

This makes silicone stoppers sound like the best option. Because this is a less common material we feel the need to check compatability with MCT, BA, and BB.


Depyrogenation 200C for 60 minutes - may be more compatible with silicone

PTFE/Silicone septa max temp 200C

There you have it. Use silicone stoppers and dry heat depyro at 200C for 60min.

hmm

See USP 1228 for information about Depyrogenation transfer. The effectiveness of the dry heat depyrogenation cycle must be verified using endotoxin challenge vials (ECVs)

A product may be sterile but still pyrogenic because of the presence of bacterial endotoxin.They can be difficult to remove from solutions but can be rendered inactive or destroyed by heat

Dry-heat depyrogenation continues to be the method of choice for the sterilization and depyrogenation of glassware. Depyrogenation uses a higher temperature and shorter duration than dry-heat sterilization (typically 250 °C or 482 °F) for 30 minutes (just within the threshold of most home ovens)

According to this document, glass vials need to be depyrogenated, while stoppers and caps can be sterilized.

According to Compounding Sterile Preparations, anything sterilized or depyrogenated needs to be done so in a container with a lid. This way it can be moved safely into the clean room. We will autoclave the caps and the lids inside of the clean room, however we still want to autoclave these things in a way so that they remain covered until they are ready for use. We will likely use aluminum foil wrapped in a way that allows steam penetration.

Reading Chapter 8

May 13, 2023

Build a clean room. The room needs to have high quality air filtration. Ideally this would be monitored but that seems unrealistic for DIY.

There needs to be a pressure differential between the clean room and the rest of your space. The differential isn’t listed. Logically we think it just means you need to have air flowing OUT of the clean room, not in. This could be achieved as simply as having your air filter get intake from outside the room and push the clean air into the room. Differential is supposed to be monitored but that’s unrealistic in DIY settings. Use simple tests such as dangling some string at the openings of the clean room to see that the airflow is blowing them out.

Recommended clean room temperature of 68F (20C) and humidity of 35-60%.

Isopropyl alcohol (IPA) 70% is the USPs primary recommendation on what to use as a disinfectant.

Info about Gowns and the order to put all garb on: pg127

“All compounding personnel must successfully complete an initial gloved fingertip/thumb sampling procedure (zero colony-forming units) no less than three times before they are allowed to compound CSPs for human use (Chapter 28)”

Reading Chapter 4

May 12, 2023

Because the bulk estradiol is going to arrive nonsterile the compounded sterile preparation (CSP) is considered “high risk”.

Use USP 797 requirements for cleansing, garbing, cleaning, disinfecting, etc.

BUD = Beyond Use Date

Institute for Safe Medication Practices (ISMP) best practices recommend verifying contents of CSPs using 3rd party verification. I.e., send vials in for testing after production.

There are more standards than can ever be kept up with in a DIY situation. How to pick and choose?

Reading Chapter 4. Make sure to read Chapter 18 later.

Find “Batch Master Worksheets”

“Pre-sterilized sealed containers should be used when feasible” does this mean the final product should go from syringe through filter through needle and directly into a pre-sealed sterile vial? and then distribute with a single puncture hole already in it?

Must do a sterility test to verify safety of contents. See USP 71.

So much of the guidelines require certain standards as to where the drug is coming from. Obviously made-in-china.com is not on the list of approved suppliers lol.

This chapter has more to offer and needs to be revisited.

Reading about sterility assurance

May 11, 2023

Chapter 17 of Compounding Sterile Preparations. We need to learn how to calculate the Sterility Assurance Level (SAL).

Filtration is important. Unless filtration is terminal filtration it cannot be assumed to create a sterile end product. (What makes it terminal?) An explanation of features needed in the syringe filter are listed in this chapter. Filters must be tested for integrity after they are used and results recorded. See CSP pg 252 for diagram.

Biological indicators must be used when sterilizing by heat to help ensure that the sterilization cycle was effective.

There is also info here about using steam and dry heat. Dry heat sterilizer using a static-air sterilizer (basically an oven) is not suitable for most materials. Use 338F for 60 mins, 320F for 120 mins, or 302F for 150 mins. We imagine if using a kitchen oven there should be a thermometer inside to verify temperatures.

Steam sterilization (autoclave) is considered terminal sterilization, it can be used to to sterilize the product and final container.It is the preferred method to sterilize aqueous solutions and suspensions that have been verified to maintain their chemical and physical stability under the required conditions. How can we verify this with EEn or TEn?

There is a formula that will let you determine temperature/time/pressure ratios.

D = decimal reduction time (minutes). time to reduce microbial population by 90% T = temperature Z = number of degrees of temp required to change D-value one log unit in time by a factor of 10. If D at 121C is 2 minutes, and the z-value is 10C, then D at 131C is 0.2 minutes. We get what this means but not really how to find the needed values. F0 = idk?? it says this is a value but doesn’t actually define it.

100 microbes in a solution, reduced by 1D, 10 microbes left.

Always document autoclave details per batch. Temp, pressure, chamber config, num articles sterilized.

A dry sealed container will not be sterilized by steam, a small amount of water must be within the container to sterilize interior. Most oils and powders can’t be sterilized by steam as it may adversely affect the material.

Need to be able to verify the sterilization process was successful. How?

Use biological indicators containing Geobacillus stearothermophilus (USP Chapter 1035) to help determine that sterilization is successful. See USP 71 for sterility tests.

Primary takeaways

  • get the right filters
  • autoclave at the right temp/pressure/time
  • use biological indicator strips to verify sterility

Getting Started

May 10, 2023

we’re going to use this page to document our “bathtub estradiol” project in hopefully fairly substantial depth. We have spent several months researching how to make DIY Estradiol Enanthate injectable vials, and we’re coming to the conclusion that there is no definitively good resource on how to do this. There is, however, a lot of information floating around. Most full-blown guides are lacking a full explanation of why they’re doing what they’re doing, and additionally fail to hold themselves to what we consider adequate sterilization standards.

we are of the mind that if you are making vials for just yourself, and you make an informed decision to skip some sterilization procedures, then that is your right. However, it seems like most people who are making DIY vials do not have access to the right information for them to be making informed decisions around this. Worse then, when people use incomplete guides online to make HRT to distribute.

So, it is our goal to document our learning and brewing process in order to create a new standard for DIY guides. We will always be open to researched and referenced criticisms with the ultimate goal of creating the best open source guide we possibly can.

More to come.

diff --git a/hrtcat/lena.html b/hrtcat/lena.html new file mode 100644 index 00000000..2b572bf2 --- /dev/null +++ b/hrtcat/lena.html @@ -0,0 +1 @@ + A Critique of Lena’s Method | HRT Cat Skip to main content Link Menu Expand (external link) Document Search Copy Copied

A Critique of Lena’s Method

It is not our intention to shit all over another trans woman, especially one who serves the trans community so broadly. Lena has surely saved many lives through her work of distributing hormones, and then many more so with all the people she has inspired in the DIY community. However, we have to understand that the information she is providing the community with is outdated and no longer should be considered safe. Just look at common methodology for the steroid homebrewing community to see that these methods are out of date.

While Lena has a strong point that the pharmaceutical industry and its standards are driven by profit, we need to also consider that death is a very real possibility as a result of injecting a contaminated vial. Just because we’re not aware of this having had happened it does not mean it’s not possible. We should take measures to protect everyone using our vials to the best of our ability, ESPECIALLY those with compromised immune systems.

The reason we are focusing on Lena’s methodology is because it has become overwhelmingly popular. Again, we are not interested in attacking a trans woman. We do, however, want to effectively demonstrate that the DIY community needs to adopt new methods.

Lena uses a single method of sterilization. Because it is the final step in her process, aka terminal sterilization, this could theoretically be #goodenough (though far below USP standards). Unfortunately there is a fatal flaw in the logic of her terminal sterilization. we’re pasting it below.

I heat already mixed solution in sealed vials in an autoclave under pressure 165 kPa = 24 PSI at temperature 129°C (overkill - more than recommended 121°C) for 30 min1

On Lena’s community guide for homebrewing, there are even more relaxed suggestions regarding sterilization.

The numbers she is stating here are accurate means of sterilization when using an autoclave. However, once the vials are sealed, putting them in the autoclave is pointless. All you are doing is sterilizing the outside.

Compounding Sterile Preparations states:

the interior of a dry sealed container will not be sterilized effectively by steam. A small amount of water must be within the sealed container to sterilize the interior.2

Keep in mind there should be NO water inside the vials for HRT preparations. The recipe we recommend is just hormone ester, MCT oil, benzyl benzoate, and a very small amount of benzyl alcohol.

Ethide Labs states:

oils or enclosed dry systems cannot effectively be terminally sterilized by moist heat as steam cannot reach these items… Any sealed or covered container must have some degree of moisture inside the sealed or covered system. Otherwise, steam cannot penetrate the container, and the container’s interior will not be appropriately sterilized.3

Pharmaceutical Engineering:

Direct steam contact with the surface of the object to be sterilized is required for the steam to transfer its stored energy to the object. Without direct steam contact to all surfaces, the item will not be sterilized. The amount of energy stored in steam is much higher than dry air or water at the same temperature… additional energy stored in the steam is… the key to steam sterilization. In order for the steam to transfer its stored energy, it must condense on the surface of the object being sterilized.4

An autoclave works by introducing surfaces to pressurized, saturated steam. It is not just pressure plus temperature that causes autoclaves to work, the steam is an essential component. How do you expect pressurized steam to get inside the vial? If you are compounding an aqueous solution, then when the autoclave reaches 120C, the water inside the solution hit 120C as well, it will be unable to boil and will pressurize, release steam, and sterilize the inside of the container. But because hormone esters are not soluble in water, and use an oil as a base, this doesn’t work.

Making sterility mistakes seems to not be life or death most of the time. However, if you are introducing a foreign substance into your flesh, you should have a high degree of confidence that what you’re doing is safe. This is infinitely more important when you are distributing what you are creating. You do not know if your vial contains a deadly fungal meningitis. You do not know when your vial is going to be used by someone who is immunocompromised.

References

diff --git a/hrtcat/lidocaine.html b/hrtcat/lidocaine.html new file mode 100644 index 00000000..82957e7f --- /dev/null +++ b/hrtcat/lidocaine.html @@ -0,0 +1 @@ + DIY Topical Lidocaine Cream | HRT Cat Skip to main content Link Menu Expand (external link) Document Search Copy Copied

DIY Topical Lidocaine Cream

Updated July 17, 2023

The lidocaine that you can get from the doctors sucks. For those of us on the more sensitive side of the spectrum, this can make electrolysis an absolute nightmare. So until the trans healthcare industry gets its shit together and starts offering lidocaine injections during electrolysis sessions then it seem like DIY is a perfectly natural solution.

This is not medical advice. Lidocaine IS dangerous. We are not responsible for how you choose to apply this information. Please be safe!

Alternatives to DIY

Instead of making your own cream you can do a couple things.

  1. Rough it
  2. Purchase BLT cream online. It’s rather expensive but it’s reported to be highly effective at numbing skin prior to electrolysis.
  3. Petition your doctor to write you a prescription to have a higher concentration of lidocaine custom compounded for you.

Dangers of lidocaine

Do NOT make lidocaine at concentrations higher than 30%. There is a governing body that sets that as the MAX LIMIT of all -caine numbing agents in combination. In all reality you probably don’t even need the 23% that’s listed in this recipe. You can start smaller and always add more later.

Lidocaine OD is real and is possible. When you start making higher concentrations it becomes even more likely. Please, please do your own research on this subject. Learn the dangers and the signs of having too much lidocaine in your system. You will likely need to go to the emergency room.

To combat this, know the exact patch of skin you are having electrolysis done on and only apply it to that one spot. Do NOT cover your whole face or genitals in this shit.

The recipe

The recipe itself comes from the loved/hated Dr Will Powers, it’s documented here.

Ingredient Quantity
Lidocaine 23%
Tetracaine 7%
DMSO 10%
Base remainder

Powers says:

The small amount of tetracane[sp] is just so that if somebody forgets to put it on multiple times before the procedure, it kicks in quickly with something

For this reason we believe it’s okay to leave out the tetracaine and to just stick with high percentage lidocaine and DMSO. The DMSO is a penetration enhancer and should be kept.

For the base we use VersaPro Cream base. This is a reputable carrier for topicals, and it is available online over-the-counter from 3rd party resellers. We have not had the opportunity to do a deep dive into what the ideal carrier for lidocaine is, so it should be remarked upon that there is quite possibly a better option here.

How to mix it

Take your active ingredients, so the lidocaine, tetracaine, and DMSO and mix them with the smallest amount of base possible. It’s common for people into DIY topicals to use an electric coffee/milk frother to thoroughly mix it.

Then once the tiny amount of base is mixed with the actives, start slowly mixing more and more base in. This ensures that the actives are fully distributed throughout the carrier, leaving no potential for pockets that have no actives in it.

Application

Powers says:

Apply a thin layer topically to treatment area 90 minutes, 45 minutes, and 15 minutes before procedure. Cover with clear plastic-wrap for increased efficacy. Do not cover more than 200sq centimeters at once.

If you follow these instructions you should be able to leave out the tetracaine, which will make the acquisition of the materials needed to make this that much easier. If you think you will mess up and not be able to follow the schedule laid out above, then you may want to try to acquire the tetracaine.

Where to get raw materials

Lidocaine is available on dragonordnance.com.

We’re not sure where to get tetracaine since we didn’t order it. We’d look on made-in-china.com searching by the CAS number if we wanted to but it.

The other ingredients are easy to find and you can google for them.

diff --git a/hrtcat/media.html b/hrtcat/media.html new file mode 100644 index 00000000..10d7ecd5 --- /dev/null +++ b/hrtcat/media.html @@ -0,0 +1 @@ + Shareable Media | HRT Cat Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Shareable Media

Sharing information about DIY HRT, and especially about this guide, can help countless trans people. As we make new content that can be shared online or in person we will put it here.

For now, here’s some memes

A meme about DIY HRT safety. The text reads: REMEMBER! There's nothing PUNK ROCK about ignoring DIY HRT safety and procedures / make sure your vials have been properly sterilized. visit https://hrt.cat

A meme about homebrewed HRT. The image shows a Caterpillar tractor. The text reads: HEARD Y'ALL LIKED CAT BOYS / What about home brewed HRT? https://hrt.cat - safe, researched, sterile

diff --git a/hrtcat/network.html b/hrtcat/network.html new file mode 100644 index 00000000..425a5b86 --- /dev/null +++ b/hrtcat/network.html @@ -0,0 +1 @@ + HRT Cat Network | HRT Cat Skip to main content Link Menu Expand (external link) Document Search Copy Copied

HRT Cat Network

Updated July 19, 2023

HRT Cat is a collection of guides and articles all on the subject of how to safely compound sterile HRT injectables at home. HRT Cat is about 25,000 words in length, similar in size to a master’s thesis. It is the most indepth research that we’re aware of on the english speaking internet on how to make DIY hormones.

Anyone who uses our methodology for making their DIY vials is welcome to link to this page in order to explain to their customers what standards they use for their homebrew operation.

While using homebrewed hormones will never be as safe as hormones you can get from a pharmacy, we believe that any injectables produced using the methodologies listed on this website will be significantly safer than 95% of other hormones available on the black/grey markets.

Check out the many links in the sidebar for more info.

diff --git a/hrtcat/other.html b/hrtcat/other.html new file mode 100644 index 00000000..51d6c944 --- /dev/null +++ b/hrtcat/other.html @@ -0,0 +1 @@ + Other | HRT Cat Skip to main content Link Menu Expand (external link) Document Search Copy Copied diff --git a/hrtcat/producers.html b/hrtcat/producers.html new file mode 100644 index 00000000..4f0993a3 --- /dev/null +++ b/hrtcat/producers.html @@ -0,0 +1 @@ + Known HRT Producers | HRT Cat Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Known HRT Producers

Updated July 19, 2023

  • Manufactured by Tyger - UK, estradiol AND testosterone
  • Otokonoko - Brazil, ships worldwide, estradiol only
  • Lena - link unknown, Ukraine, estradiol only
  • OE Labs - EU, estradiol only, currently suspended
  • Astrovials - EU, estradiol only, (there’s speculation that this is oe labs rebranded to avoid certain issues)
  • Vanna Pharma - UK only, estradiol only
  • Noire Labs - shut down
  • Felicitas - EU, estradiol only
diff --git a/hrtcat/properly-sterilized.html b/hrtcat/properly-sterilized.html new file mode 100644 index 00000000..ab404e13 --- /dev/null +++ b/hrtcat/properly-sterilized.html @@ -0,0 +1 @@ + Were Your DIY Vials Properly Sterilized? | HRT Cat Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Were Your DIY Vials Properly Sterilized?

Updated July 17, 2023

Broadly speaking, probably not. Of the 4 different homebrew guides that were evaluated, 3 failed to offer adequate terminal sterilization and none provided any guidance on depyrogenation. None offered any form of quality assurance testing. Does that mean they’re unsafe? Not necessarily. Many, many trans people inject homemade HRT every single week. If it was categorically unsafe then there would be large reports of infections on popular DIY forums and discords. A brief meta analysis of academic literature indicates that when contamination is introduced to multi-dose vials, the preservatives in the vials often kill the contamination in under 48 hours. While these are not studies regarding pre-existing contamination, nor studies about HRT, we can assume that at least the same logic structure applies.

When we take that data, and we combine it with the consideration that the average person is likely capable of fighting off small amounts of bacterial/viral contamination from an injection, the picture becomes a bit more clear. There is always potential for complication, but most people do not experience it.

That said. The creators of most DIY injectables believe they are achieving terminal sterilization, which they likely are not. Their methods are misguided and not scientifically supported. It is our belief that the amateur pharmacist who is compounding these medications should have a stronger understanding of the process they’re undertaking, especially regarding the safety of their product. Relying on the patients immune system, and potentially a preservative in the vial, to keep them safe from a product you’re making is irresponsible. Especially when sterility doesn’t have to be totally out of reach to achieve.

HRT.cat recommends the following sterilization procedure for folks who do not possess special equipment or know-how.

How sterilization should be done at home

This is about as close as we can get to following compounding pharmacy guidelines while working out of our own homes and without investing in expensive equipment.

  • All glassware washed and sterilized/depyrogenated
  • All other tools autoclave sterilized
  • All work area surfaces and items wiped down with isopropyl alcohol 70%
  • Working in a makeshift cleanroom under a still air box or laminar flow hood
  • Using sterile syringe filtration (0.22um) to achieve terminal sterilization
  • Testing the integrity of the filter
  • Testing the product for contamination

Lena / Ultimate DIY

https://groups.io/g/MTFHRT/wiki/29602 - This is often held up as the most reliable DIY injectables guide, but unfortunately falls vastly short in terms of safe sterilization practices. Lena has been brewing DIY since the 90s, and honestly power to her for that. She has helped countless trans women gain access to hormone therapy both through her supplying it and through the influence she has had on the community. It is our belief that the majority of misinformation that plagues the DIY injectables community comes directly from Lena. Lena taught herself how to do this in 1990s Ukraine, resources weren’t exactly available on safe lab manufacturing practices for HRT. It worked for her and the information has spread. That said, times have changed and we deserve higher-quality information.

The guide has a single recommendation for sterilization: make your vials and then boil them in a pot of water for 30 minutes.

  1. 100°C is not hot enough to achieve any type of sterilization. This is considered dry heat sterilization, as we’re not applying steam to the HRT inside the vial. Dry heat sterilization requires a holding temperature of 180°C for 30 minutes (above the MCT oil’s smoke point).
  2. Nothing was sterilized before sealing the vials and nothing gets sterilized after they’re sealed.

Lena has a separate page that recommends using an autoclave. Those instructions are also invalid. We did a full write-up on putting sealed vials into an autoclave here.

In summary: don’t use this method. Don’t write a new guide based on this method. If these vials have any sort of sterility it is solely because of the benzyl alcohol included in the recipe.

Noire Labs

https://noirelabs.net/diy-estradiol-guide - This person probably got the bulk of her info from Lena’s guide but has supplemented it with a few additional safety practices.

She recommends 175°C for 60 minutes to sterilize the vials, after rinsing them in ethanol. She recommends cleaning your workspace with ethanol, love this! Then the instruction is to fill the vials and to boil in a pressure cooker for 30 minutes.

  1. 175°C for 60 minutes is adequate to sterilize glassware. However, as mentioned elsewhere, this is a holding time at 175°C, not a cooking time. It probably falls short of actual sterilization, though noble effort!
  2. Sterilizing vials is great! But they need to be depyrogenated as well. That goes for the rubber stoppers too.
  3. And finally, the terminal sterilization is to boil in a pressure cooker for 30 minutes. Because the vials are already sealed this is essentially an application of dry heat (steam can’t penetrate the vial). Even a high level of heat in a pressure cooker isn’t enough. More about this here.

Ultimately we are left with a semi-sterilized glass vial and no proper sterilization on anything else. We do not recommend any of this.

Otokonoko Pharmaceuticals / Lilian

https://archive.is/htP6g - This one really upset us because we know how loved and respected Otokonoko is. This is an archived version of her method that was since deleted. Someone had a backup.

The only method of sterilization mentioned is putting a flask in an oven at 230° (presumably Celsius) for 30 minutes to sterilize a container of HRT. This is bad for a few reasons.

  1. It doesn’t depyrogenate
  2. 30 minutes is likely just long enough to get a small-sized flask up to temperature. When sterilization guidelines state that you can heat something at 230°C for 30 minutes it is instructing you to get the solution to that temperature and then to hold it there for 30 minutes. This isn’t like when a cooking recipe says 30 minutes in the oven.
  3. Nothing has been done to sterilize the vials the solution will go into
  4. We don’t know what that type of heat will do to the hormone compound, we’re unable to find research
  5. There is tons of room for contamination when the mixture is transported to the vials.
  6. The smoke point of MCT oil is 160°C. There’s no way it’s a good idea to inject burned oil.
  7. The guide states that this is overkill on sterilization, and that a simple water bath “would kill most bacteria”

This guide doesn’t add up to proper sterilization in any way. Hopefully, Lilian has adopted better lab safety procedures since this guide was published in 2020, however without evidence of her improving her practices we wouldn’t order from Otokonoko.

Guide by Anon

https://files.catbox.moe/ax9efj.pdf - This guide circulates sometimes and can be found in comment sections around reddit. Likely elsewhere. It has much more info in it besides how to brew vials. It is by far the best guide we’d seen written until we encountered Tyger’s guides below.

Soak all glassware, stoppers, and caps in IPA 70% for 30 minutes, then autoclave for 15+ minutes. Sterilize misc glassware, it links to what at first glance appears to be good data on how to do that. Sanitize lab area. Optional gloves and still air box. Use a sterile syringe filter to perform terminal sterilization. Cap. Heat in oven at 275°F(135°C) for 6+ hours.

  1. IPA soak might be unnecessary, but it’s not hurting.
  2. 15 minutes isn’t an adequate amount of time in an autoclave.
  3. Still air box and sanitized gloves should be required, not optional.
  4. Lacks depyrogenation
  5. Once getting to temperatures as low as 135°C it is hard to validate if sterilization is taking place. Maybe someone who knows more than us can help calculate this. It’s also unclear if subjecting the hormone to that temperature for that length of time is causing it to break down some.

Overall this is a very good method considering the other ones We’ve evaluated. If we added in depyrogenation and some validation testing that the syringe filter worked we would rubber stamp it. This method is likely properly sterilizing vials but isn’t removing pyrogens/endotoxins.

Guide by r/steroids Wiki

#TODO - Guide is here

Manufactured by Tyger

Tyger’s Guides

We’re looking at their “medium-scale” guide v1.3

Tyger’s opening section: “Who can homebrew?” sets the stage for the rest of this guide. They suggest a series of qualities in a person that makes for a good brewers, statements we wholeheartedly agree with. Overall this guide is exceptionally smart and is laden with good advice.

This is hands down the best guide on how to brew HRT that we’ve read thus far. Obviously we like our guide more, but we’re going to be biased on that ;)

The medium scale guide is for bottle top filtering, a technique we would like to support on this site soon.

The small scale guide, is for a technique to purchase pre-sterilized empty vials and to push syringe filtered preparation straight into it. A viable technique for small scale brews (1-4 vials).

There are minor issues with these guides and techniques, but at a certain point some of this actually just comes down to opinion. These are likely THE BEST vials you can get in Europe, and they’re all made from a lens of mutual aid.

We are in active communication with Tyger to compare notes and in hopes of improving both their guides and our guide. The minor issues we have with Tyger’s guide aren’t listed here as Tyger is actively working to change certain parts of their published technique. Expect an even stronger v1.4.

Once again, if we were in Europe these would be our preferred DIY vials.

Vanna Pharma

Vanna Pharma does not list their brew technique on their website, but we sure wish they did! They use all the right buzzwords and they speak about their brew process with the attitude we want to see out of homebrewers: intelligence, humility, and a strong admission that this isn’t pharmaceutical quality.

If anyone finds Vanna’s brew guide, send it along.

Other Producers

If you find the brew guides of ANY producers that aren’t listed here, please send them to us! We’d love to review their methods to add to this page.

diff --git a/hrtcat/resources.html b/hrtcat/resources.html new file mode 100644 index 00000000..fdb744ec --- /dev/null +++ b/hrtcat/resources.html @@ -0,0 +1 @@ + Additional Resources | HRT Cat Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Learning

U.S. Compounding Standards

  • USP 797 - If this is taken down you can just search “USP 797 pdf” and you should be able to find it. A revised version is slated to be published in Nov 2023.
  • Compounding Sterile Preparations - by E. Clyde Buchanan. This book is very expensive, you can find a PDF on libgen and maybe sci-hub.

Substance Testing

These resources are not endorsed, merely linked

Guides

We do not endorse these guides. They are linked here for your edification. For critical analysis of other injectable guides see Were My Vials Properly Sterilized?

  • Vials/Transdermal/Pills: HRT Homebrew - [backup] - We haven’t fully vetted these instructions, but considering this is the highest quality instructions for homebrewing HRT that we’ve seen, there may be merit to other information in here.
  • Homebrewing testosterone (r/steroids wiki) - r/steroids has almost 200k members on Reddit. They take their info seriously. We have not fully reviewed this info, but this will be a good source for info specific to brewing testosterone. There is an extremely significant overlap between brewing E and T, and this is likely a good resource.
  • How to make estradiol stickies - if you have limited resources and need to make your estradiol tablets last, this may be worth looking into. - backup
  • Reddit Instructions - We haven’t evaluated this guide, likely has issues.
  • Homebrewing Estrogel (Reddit) - A good resource for how to make your own estrogel, and can be adapted to make T gel. If you’re not confident about your safety and sterilization practices with making vials, making topicals is MUCH safer and can be as easy as mixing beta-estradiol/testosterone base, orange essential oil, and hand sanitizer in the right proportions.
  • Boobs Not Bombs Bulk Estrogel Guide - Very detailed guide on how to pool $2000 with some friends in order to make very large volumes of estrogel for your community. The information in this guide can be scaled down.

General

Suppliers

See How to Order HRT

Unrelated

  • Four Thieves Vinegar Collective - Information about building medical devices and using hacks to take medical care into our own hands. MicroLab, ER Suite, Abortion Care, Tooth Seal.
  • GALAP: Gender Affirming Letter Access Project - Connect with medical professionals in the US that will get you “informed consent” letters, looks like mostly for free.
  • Sci-Hub: you can find many academic papers here without paywalls.

Tech Resources

Wow it’d be great if this project was untraceable back to the creators. Here’s what we’ll be using for that.

  • Njalla Domain Registry - based in the Caribbean and notorious for privacy practices.
  • Monero - the standard for private crypto transactions.
  • Protonmail - for needing a reliable yet privacy-minded email service. This won’t be on our phones.
  • PGP encryption for as much communication as possible
  • Signal when chatting with friends about this
  • Tails - We’re using the Tails operating system on burner laptops paid for in cash.
  • ProtonVPN - when we’re not on tails we will be on ProtonVPN
  • Mozilla Firefox - Chrome is spying on you and Brave is run by a bigot.
diff --git a/hrtcat/start-hrt.html b/hrtcat/start-hrt.html new file mode 100644 index 00000000..b0adef08 --- /dev/null +++ b/hrtcat/start-hrt.html @@ -0,0 +1 @@ + Starting HRT | HRT Cat Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Starting HRT

This information isn’t exactly our wheelhouse nor our passion. The good news is that there is SO MUCH good information online that already has all this data. Instead of us re-doing all that work this will primarily be a page of links.

Medical transition is typically a binary process. We will be using the words trans femme and MtF to indicate someone interested in feminizing therapy and trans masc and FtM to indicate someone interested in masculinization. Apologies to the folks who don’t fit into this language model.

Tbh the bulk of what we’re going to list here we will be pulling from the r/TransDIY wiki. You can also find possibly everything you need on The DIY HRT Directory.

Medical guidelines for transition

These guides are sort of written by cops, so take the info with a grain of salt. That said, there will be some good recommendations here.

Get blood work

Most people will agree that you should get blood work before you start HRT and then occasionally while you’re on it in order to make sure your hormone levels are in check.

You can use the guidelines above to determine what you want to have tested. Typically, both MtF and FtM folks will do at minimum testosterone and estrogen.

Any further information we would give you we would likely pull directly from the page below. There are links to labs where you can get this blood work done without a doctors order.

DIY blood work info from the r/TransDIY wiki

Decide what you want to take

Trans femmes typically take an anti-androgen and an estradiol, however many people believe that anti-androgens are unnecessary if taking an adequate amount of estradiol (topical or intramuscular only). Trans femmes will sometimes add progesterone after a year on estradiol, as there is a widespread belief that it helps with breast development and fat redistribution, although these claims are largely unsubstantiated. If we could redo the early days of our HRT over again, we would only add anti-androgens if mono-therapy wasn’t working.

Trans mascs typically take just testosterone, which is strong enough to block estrogens in their bodies. Some people who find themselves predisposed to genetic hair loss will take finasteride to counteract the hair loss process that taking testosterone can cause.

The medical guidelines linked above will talk about options and dosages. We also love The DIY HRT Directory for this type of info.

Obtaining your HRT

We are vastly critical of both the medical system that gatekeeps HRT as well as of the DIY producers of HRT. If you are able to use the mainstream medical system to obtain HRT, that will always be the best and safest situation. When HRT is obtained at a pharmacy there is a very high level of purity and sterility assurance. Unfortunately, this is becoming impossible for more and more people.

How to get black and grey market HRT? Injectables can be obtained from a wide variety of online sources, however we urge caution when obtaining vials that are not coming from licensed compounding pharmacies. You may be able to get estradiol that was compounded in Thailand or India from a legitimate pharmacy. In general, this may be safer than standard “home lab” injectables due to the prevalence of false information about how to sterilize vials that circulates around the trans community. Vials are cheap, effective, and you only have to use them once a week. The downsides of vials are the need to consider sterility and having to give oneself injections.

Avoiding injectables, the other DIY option is generally topicals, the simplest form of which is just hand sanitizer, orange essential oil (penetration enhancer), and your hormone of choice. This is often safer because the product does not need to be sterile. The downside of this is that 1) you need to use it every day, as opposed to once a week, and 2) it’s more expensive in the long run.

To purchase either ready-made HRT or raw hormone powders, take a look at Where to Order HRT.

Safe injection and dosing

Let’s refer back to The DIY HRT Directory or r/TransDIY wiki for dosing info and how to safely inject.

Always sanitize the vial septum with a sterile alcohol swab before drawing your hormones. Always use a clean needle to draw and a different clean needle to inject. Sterile syringes and needles are available on Amazon.

Making your own injectables and topicals

Buddy, you’re in the right place. Head on over to The Guide for instructions on how to brew your own injectables. This is the most comprehensive, well-researched guide on the English speaking internet regarding making your own injectables, or your money back.

If you want to make your own topicals, it’s super easy! We’ll have a guide on this site soon, but in the meantime take a look at the r/Estrogel wiki. The recipes here work for both estradiol and testosterone, though if using T you will need to adjust the recipe as it requires many more mg per g than E for proper dosing.

A cool trick we like is to find a commercially available medication that we want to replicate and to find its package insert online. Let’s take AndroGel for example. The package insert tells us how much T is in a typical pump/dose. We can extrapolate that information to help us adapt DIY recipes. It requires a little bit of math, but we think it’s a more reliable resource than random Reddit comments.

diff --git a/hrtcat/summary.html b/hrtcat/summary.html new file mode 100644 index 00000000..5d4dcafe --- /dev/null +++ b/hrtcat/summary.html @@ -0,0 +1 @@ + Guide Summary | HRT Cat Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Guide Summary

This is an example of the exact procedure we perform when brewing in order to help us have a quick reference sheet. It contains no explanations and just has day-of procedures.

  • Clear work area
  • Sweep and mop
  • Hang plastic sheets
  • Install and turn on HEPA air purifier
  • Sanitize work surface
  • Clean floor once more
  • Begin wearing shoe covers and garbs in clean room
  • Preheat oven to 200°C
  • Wash, rinse, and wrap items for depyrogenation
  • Put in oven once pre-heated, set timer for 2 hours
  • Prepare autoclave with distilled water
  • Wash, rinse, and wrap items for sterilization
  • Autoclave for 1 hour.
  • Wipe down everything else with IPA
  • Setup laminar flow hood, leave on
  • Remove items from oven and autoclave, stage in clean room
  • Perform fingertip testing
  • Inside flow hood, mix in beaker:
    • ____mL MCT oil
    • ____mL Benzyl Alcohol
    • ____mL Benzyl Benzoate
    • ____mg Estradiol Enanthate
  • Filter ____mL aside for sterility testing+
  • Filter rest into vials, place stoppers immediately. Repeat.
  • Use clean filter to do a second pass filtration into vials, cap+.
  • Set 2nd pass filter aside for sterility testing+.
  • Cap.
  • Bubble point test
    • Listed bubble point: ____psi
    • Today’s air pressure: ____psi
    • Starting air volume: ____mL
    • Actual bubble point volume: ____mL
    • Actual bubble point (calculator): ____psi
  • Place 2nd pass filter on agar for testing+.
  • Make a record
  • Label vials
  • Incubate fingertip tests
diff --git a/hrtcat/todo.html b/hrtcat/todo.html new file mode 100644 index 00000000..9634f0bd --- /dev/null +++ b/hrtcat/todo.html @@ -0,0 +1 @@ + TO DO | HRT Cat Skip to main content Link Menu Expand (external link) Document Search Copy Copied

To do list

Do for Version 1.1

  • Review all info about agar plates, flow hood, still air, fingertip testing, final sterility testing
  • Get sketch of bubble point test
  • Review full guide
  • Update permalinks for topics

Lingering

  • search for #TODO to find items marked as needing completion.
  • All links need to be checked to make sure they’re working.
  • Need to write a guide for producing topicals.
  • would crimethinc write about this website? Write an article to submit?
diff --git a/hrtcat/topics.html b/hrtcat/topics.html new file mode 100644 index 00000000..dc876078 --- /dev/null +++ b/hrtcat/topics.html @@ -0,0 +1 @@ + Topics | HRT Cat Skip to main content Link Menu Expand (external link) Document Search Copy Copied diff --git a/hrtcat/topics/alcohol_technique.html b/hrtcat/topics/alcohol_technique.html new file mode 100644 index 00000000..2c088fae --- /dev/null +++ b/hrtcat/topics/alcohol_technique.html @@ -0,0 +1 @@ + Alcohol Sanitization Technique | HRT Cat Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Alcohol Sanitization Technique

#TODO, flesh out, find resources. There’s surely a good video from the mycology community about this on youtube.

make a spray bottle filled with isopropyl alcohol 70% (don’t get stronger) spray your hands and the items you’re working with as needed in order to sanitize. Don’t spray anything that you’ve already sterilized. Essentially you can use this to wipe down anything that might have bacteria on it, including your still air box or flow hood.

diff --git a/hrtcat/topics/biological_indicators.html b/hrtcat/topics/biological_indicators.html new file mode 100644 index 00000000..f8fdac0c --- /dev/null +++ b/hrtcat/topics/biological_indicators.html @@ -0,0 +1 @@ + Biological Indicators | HRT Cat Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Biological Indicators

Biological Indicators (BIs) are a safety verification technique required to be used in compounding pharmacies around the world. They contain microbes that are typically very resistant to death-by-autoclave. They are used by lab techs verify that their equipment is operating as expected. You would put the BI into the autoclave and run it at the desired settings. After it’s finished you incubate the BI, and it will change colors if your autoclave did not successfully kill off the microbes inside.

It would be really cool to have access to these for our home labs, especially those of us using pressure cooker autoclaves. Unfortunately we’ve only been able to find them to be purchased in bulk, and they’re not cheap.

This will remain a “wishlist” item for now.

Indicator Strips

There is an alternative to biological indicators called “indicator strips” and these are much more readily available at consumer pricing. The difference is that they aren’t using actual microbes to indicate if sterilization was effective, they are instead measuring steam/heat/pressure all to certain thresholds. This is mostly adequate if your autoclave is using standard parameters. However, if you’re using something like a pressure cooker then your standard heat and pressure parameters might not get met, and instead made up for by increasing time. While this is a valid method of sterilization these strips won’t trigger as you won’t meet their parameters.

If you purchased an autoclave off ebay or something though, then these indicator strips would work great for you.

diff --git a/hrtcat/topics/bulk_filtration.html b/hrtcat/topics/bulk_filtration.html new file mode 100644 index 00000000..0118657e --- /dev/null +++ b/hrtcat/topics/bulk_filtration.html @@ -0,0 +1 @@ + Bulk Filtration | HRT Cat Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Bulk Filtration

Considering syringe filters can filter at most 250mL of your preparation (for 33mm filters) before you need to swap to a new syringe filter, this can be a very inefficient process if you’re brewing bulk. You can use a vacuum pump and a bottle filter in order to have a more efficient version of the syringe filter. This is a common methodology used in the bodybuilding community when making large numbers of vials, as well as in just regular compounding labs. If you are producing in bulk, either for mutual aid or for sale, you may want to invest in this equipment.

We don’t have more info to share on this at the moment as it’s not something we’ve researched or that we are planning to use in the near future. If we wanted to learn more about this we would probably start by reading the wiki page on r/steroids here.

We do not have a guide on how to conduct a bubble point test on bottle top filters. This is a method of verifying that a filter maintained integrity during use, which we consider very important. You will need to research this yourself.

diff --git a/hrtcat/topics/choosing_filter.html b/hrtcat/topics/choosing_filter.html new file mode 100644 index 00000000..850bdc4b --- /dev/null +++ b/hrtcat/topics/choosing_filter.html @@ -0,0 +1 @@ + Syringe Filters | HRT Cat Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Choosing Syringe Filters

This page previously recommended PVDF filters. Do not use these. After further research we discovered that we received a bad recommendation. There is insufficient data about the interactions between benzyl benzoate and PDVF. Combining BB with PDVF may result in filter degradation and failure. Instead use PTFE filters. PTFE has studied compatibility with BA, BB, and organically derived oils.

  • Pore Size: 0.22μm (this size is required for sterilization)
  • Sterility: Use pre-packaged, sterile filters.
  • Size: if you’re filtering 1-10mL, use a 13mm filter. 10-100mL use a 25mm filter.1 100m-250mL use a 33mm filter.2 Keep in mind that the filter will eat some of your final product. The larger the filter the more product it will retain. At the same time, a larger filter will be easier to push your preparation through.
  • Filter material: Hydrophilic Polytetrafluoroethylene (PTFE) is moderately available and is compatible with our goals. It is safe with oil, benzyl alcohol, and benzyl benzoate.3 4

Make sure the filters you are purchasing list a bubble point on them. We need to do a bubble point test after terminal sterilization to ensure that the filter kept its integrity. We’ve seen it also listed as “Max Burst Pressure.” You can also preform a test on a spare filter to find the bubble point yourself.


More compatibility charts:

https://www.restek.com/globalassets/pdfs/literature/gnts2123-unv.pdf

https://scientificfilters.com/membrane-Filter-chemical-compatibility-chart/

https://www.ddbiolab.com/data/pdf_guides/en/Tableau_de_compatibilite_chimique_Whatman.pdf

https://www.astisensor.com/KYNAR_PVDF_Chemical_Compatibility_Resistance_Chart.pdf

https://www.calpaclab.com/teflon-ptfe-compatibility/

https://www.growinglabs.com/pages/syringe-filter-solvent-compatibility

References

diff --git a/hrtcat/topics/choosing_oil.html b/hrtcat/topics/choosing_oil.html new file mode 100644 index 00000000..faf436e3 --- /dev/null +++ b/hrtcat/topics/choosing_oil.html @@ -0,0 +1 @@ + Carrier Oils | HRT Cat Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Choosing a Carrier Oil

Most legal compounding pharmacies use castor, sesame, or sunflower oil.

Most DIY brewers use MCT oil (AKA Viscoleo). MCT is more viscous and so absorption rate is thought to be quicker. However, its viscousness makes it easier to inject.

We use MCT oil and feel that the trade-off is worth it. It may be absorbed faster by the body, but we like how easy it is to inject. Also, when combined with the long half-life of EEn or TC it doesn’t seem to cause issues for us.

Lena says:

“MCT oil… made from a mix of C8 (caprylic) and C10 (capric) fatty acids (not C8 only)”

This is like the MCT oil listed here, which is also listed as pharmaceutical grade. We haven’t researched the C8/C10 thing, but we will say that you should definitely get pharmaceutical grade if you can.

Some more info from an article on Transfeminine Science:

It is in any case known from other studies that different oil vehicles are absorbed at different rates from the injection site (Svendsen & Aaes‐Jørgensen, 1979; Schultz et al., 1998; Larsen et al., 2001) and can result in different concentration–time curve shapes (Ballard, 1978 [Excerpt]; Knudsen, Hansen, & Larsen, 1985). This is thought to be due to differences in oil lipophilicity and depot release rates. Viscosity of oils has also been hypothesized to potentially influence rate of depot escape (Schug, Donath, & Blume, 2012). However, research so far has not supported this hypothesis (Larsen & Larsen, 2009; Larsen, Thing, & Larsen, 2012). Oil vehicles can vary with injectable estradiol preparations even for the same estradiol ester. For instance, pharmaceutical estradiol valerate is formulated in sesame oil, castor oil, or sunflower oil depending on the preparation (Table). It is notable however that these three oils have similar lipophilicities (Table). On the other hand, homebrewed injectable estradiol preparations used by DIY transfeminine people often employ medium-chain triglyceride (MCT) oil as the oil vehicle. This oil (in the proprietary form of Viscoleo) has notably been found to be much more rapidly absorbed than conventional oils like sesame oil and castor oil in animals (Svendsen & Aaes‐Jørgensen, 1979; Schultz et al., 1998; Larsen et al., 2001). In addition, although based on very limited data, MCT oil has been found to give spikier and shorter-lasting depot injectable curves in humans (Knudsen, Hansen, & Larsen, 1985). As such, injectable estradiol preparations using MCT oil as the vehicle may have differing and less favorable concentration–time curve shapes than pharmaceutical injectable estradiol products. Other excipients, like benzyl alcohol, as well as factors like injection site and volume, have additionally been found to influence pharmacokinetic properties with depot injectables (Minto et al., 1997; Kalicharan, Schot, & Vromans, 2016). Excipients besides oil vehicle also vary by formulation (Table).

diff --git a/hrtcat/topics/diy_laminar.html b/hrtcat/topics/diy_laminar.html new file mode 100644 index 00000000..cf9374e2 --- /dev/null +++ b/hrtcat/topics/diy_laminar.html @@ -0,0 +1 @@ + Laminar Flow Hood | HRT Cat Skip to main content Link Menu Expand (external link) Document Search Copy Copied

DIY Laminar Flow Hood

Updated July 17, 2023

We did a test with a DIY flow hood and some agar plates and have come to the conclusion that a still air box is likely safer to use. Unless you really know what you’re doing, don’t make your own flow hood, just buy one.

These things are pretty expensive to buy out right, but they can be built for substantially less money at home. As usual this comes with a sacrifice in quality. If you decide to forego the flow hood, please do use a still air box.

There’s a variety of videos that can show you how to do this, we’re linking one below

https://youtu.be/lXmUcA-Oc58

We like this video because it demonstrates how this is good, but it’s not trying to pretend that it’s perfect. That seems to be how a lot of this works, we shouldn’t expect any one of our safety measures to be perfect. But if we stack enough of them up on top of each other, we can have a reasonable certainty that we have successfully created a sterile product.

It’s like Swiss cheese. With any single slice there are holes in it that you can see through. But if you take enough of those slices and stack them up on top of each other eventually you have a solid chunk of cheese.

diff --git a/hrtcat/topics/esters_compared.html b/hrtcat/topics/esters_compared.html new file mode 100644 index 00000000..19374e11 --- /dev/null +++ b/hrtcat/topics/esters_compared.html @@ -0,0 +1 @@ + Esters Compared | HRT Cat Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Hormone Esters Compared

#TODO, find data, cite sources.

This article is not finished.

Estradiol Esters Simulator

In general, we recommend people use Estradiol Enanthate (EEn) and Testosterone Cypionate (TC). The reasoning is straightforward.

For Estradiol: Valerate has too short of a half-life and can cause mood cycling. Cypionate is a good half-life, but Enanthate is a slightly longer one. For estradiol in particular we think stable levels are important as possible to help prevent mood swings and PMS-like symptoms. Therefore we recommend EEn or EC if EEn isn’t available.

For Testosterone: we’re not familiar with valerate, it’s not used in our area. TC and TEn seem to be the most common options. While TEn has a slightly longer half-life (just like with EC/EEn) the melting point of TEn powder is very low, maybe something like 30°C. This can make it more difficult to deal with in a home lab. Go with TC.

There are other esters that have very long half-lives, in the multi-week range. We think it’s best to avoid those in case there’s a problem with your dose or your DIY and you need it to cycle out of your system. Injecting once a week seems to be widely regarded as the right move, and EEn and TC seem to fit into that perfectly.

More data on estradiol esters surely on Transfem Science.

diff --git a/hrtcat/topics/fingertip_testing.html b/hrtcat/topics/fingertip_testing.html new file mode 100644 index 00000000..5fd06524 --- /dev/null +++ b/hrtcat/topics/fingertip_testing.html @@ -0,0 +1 @@ + Fingertip Testing | HRT Cat Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Fingertip Testing

See Compounding Sterile Preparations starting at page 447 for more info about this. This is a procedure that is recommended to be performed on occasion but not at every brew. In a compounding pharmacy, a technician must pass this test 3 times before being allowed to compound sterile medications for human consumption.1

In short, you start with 6 agar plates. At the start of your process, as soon as you glove and sanitize your gloves, you take a print of each of your fingers and thumb onto agar plates, one for the digits on each hand. Then once you finish your preparation you take another sample from each hand. You should not sterilize your gloves immediately prior to the final sample as this could create a false negative. Label each plate as which hand and if the sample was collected before or after making your preparation.

Take one more agar plate and leave it exposed to the air in your home for 5-10 minutes. Your final plate should remain sealed. These are your positive and negative controls.

Tape shut around the edges. Store/incubate inverted. If you can, incubate at 30–35°C/86-95°F for 48–72 hours.1 If you do not have access to an incubator, leave at room temperature in a warm spot in your house. Instead of waiting 72 hours you may need to wait a week. Use your control sample that you left exposed to the air to help you determine when there is visible growth.

According to the standards set forth in USP 797, if you show any pinpoints of growth on the two collections you took before compounding, or if you show more than 3 pinpoints of growth on the two plates collected after you finished compounding, then your sterile technique is lacking.

Failed test?

If you were working in a compounding pharmacy, and you failed fingertip testing you would not be cleared to compound for human use. Therefore, your vials you just made would not be cleared. You will need to rectify how you want to play this for yourself. If it was a minor failure maybe it’s easy to justify using the vials. If it’s a major failure you might be more cautious and decide to withdraw the preparations, re-filter, and dispense into new, clean vials.

References

  1. Compounding Sterile Preparations pg 447-448  2

diff --git a/hrtcat/topics/hormone_testing.html b/hrtcat/topics/hormone_testing.html new file mode 100644 index 00000000..87a79455 --- /dev/null +++ b/hrtcat/topics/hormone_testing.html @@ -0,0 +1 @@ + Hormone Testing | HRT Cat Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Hormone Testing

Updated July 17, 2023

Basic Compound Verification at Home

It is not possible to do adequate testing of hormone powders that you receive in the mail at home. Even the most basic of lab tests require chemicals that are too dangerous to be handled by someone without formal lab training, and even then the results would be suspect.

So what we can do instead is test the melting point of the compound, and the compound’s solubility in water and oil.

As you may have noticed, raw hormones are incredibly inexpensive. They also happen to have rather unique properties as powders. The general wisdom inside of the DIY community is that if you are buying from a reputable seller and your product has these properties then you can be fairly certain that you were sold the correct thing. This is because there is no money to be made in selling you fake powders that pass these tests the same way. It’s cheapest to just manufacture the real thing.

That being said, this does not account for impurities in the product, or being sold the wrong hormone ester purely by mistake.

Melting Point Test

Look up the hormone ester that you’re working with on Google, make sure you find the CAS number, and look up the melting point. Here are a few to get you started, try to use PubChem if you can, as they seem to have the most data publicly available.

Hormone CAS Melting Point
Estradiol Enanthate 4956-37-0 94-96° C 1
Estradiol Cypionate 313-06-4 151-152° C 2
β-Estradiol 50-28-2 173-179° C 3
Testosterone Cypionate 58-20-8 98-104° C 4
Testosterone Enanthate 315-37-7 34-39° C 5
Testosterone Base 58-22-0 151-157° C 6

To perform a melting point test with estradiol enanthate you can use a double boiler. Use a heat safe laboratory grade media bottle, or use a glass vial that your finished product will be put into. Place a small amount of product into the container and seal if necessary (to keep water out). Place that container into a pot of water and boil. The water will get to 100° C, and when the heat transfers to the product it should melt.

For substances with a higher melting point, we have to get more creative. With a proper thermometer such as a laser thermometer or an oven thermometer, you can cook it in the oven or on the stovetop, monitoring the temperature with your fancy thermometer to see when it melts.

Solubility Test

Hormones do not dissolve in water, but they do dissolve in oils as well as benzyl benzoate. Attempt to dissolve some of your product in both water and oil (or BB), and observe the results. You may need to shake or stir to encourage it to dissolve. With water, it won’t matter how much you shake.

If your product dissolves into oil but not water this is one more positive indication that you received the right compound.

Laboratory Hormone Testing

Hormones that are coming from the grey-market are unlikely to have the same level of purity as hormones acquired from USP grade pharmaceutical manufacturers. For example, instead of 99.8% purity you might end up with something like 97.2% (like was the case with Boobs Not Bombs testing7). We’re unable to determine what compromises the remaining 2.8%, or what levels of purity are expected from pharmaceutical-grade hormones.

When you purchase bulk raw hormones you should send them in to be tested before you brew with and inject them.

Ideally, you will adjust the amount of hormone ester to use based on knowing the purity of the raw product you purchased.

Additionally, you should have it tested for harmful substances like heavy metals and narcotics.

We recommend that anyone with the means to do so, submit their raw powder for laboratory testing. If you sell the HRT you are compounding you have an ethical obligation to do this, and you can even build the cost into the price you sell for.


References

diff --git a/hrtcat/topics/incubation.html b/hrtcat/topics/incubation.html new file mode 100644 index 00000000..d9555c2e --- /dev/null +++ b/hrtcat/topics/incubation.html @@ -0,0 +1 @@ + Incubation | HRT Cat Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Incubation

Sterility testing

Filter membranes that are on SCDM/TSA growth medium need to be incubated at 20-25°C (68-77°F) for 14 days.1 Our makeshift lab space stays consistently in this temperature range, so for TSA plates we will not be using an incubator.

Membranes on FTM growth medium need to be incubated at 30-35°C (86-95°F) for 14 days.1

Batches should remain in quarantine until the sterility test results are back.

References

  1. Compounding Sterile Preparations page 262  2

diff --git a/hrtcat/topics/instant_pot.html b/hrtcat/topics/instant_pot.html new file mode 100644 index 00000000..db35670c --- /dev/null +++ b/hrtcat/topics/instant_pot.html @@ -0,0 +1 @@ + Instant Pot Sterilization | HRT Cat Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Instant Pot Sterilization

“Only the Instant Pot brand pressure cooker was able to inactivate G. stearothermophilus endospores, which indicated that it would be the most appropriate choice for a laboratory pressure cooker.”1

In the study referenced above they tested the 8-quart IP-DUO80 Instant Pot. This device has the same pressure and temperature ratings as the smaller 3-quart DUO Mini and the 6-quart IP-DUO60 v3 version that we use. There is a newer model, Instant Pot Max, that gets up to and sustains 15psi. Theoretically this would be much more effective at sterilization than the DUO models. If you have the Max please investigate its temp and pressure ratings to help you determine how long you need to run it for to achieve sterility. The rest of this page is about the DUO.

The recommended temperature and pressure for steam sterilization is 121C at 15psi for 20-60 minutes.2 However the Instant Pot Duo only reaches 115-118°C at 10.2-11.6psi.1 3 Because of this the “standard” 20-60 minutes will be inadequate for sterilization. The study that evaluated commercial electric pressure cookers stated that it took a full 150 minutes for the pressure cooker to inactivate G. stearothermophilus endospores, which are of the most resistant to sterilization.

The Instant Pot should be operated for at least 150 minutes to achieve sterility.

Can math back up this data on how long to run the Instant Pot for?

Accepted industry standard Z value for steam sterilization is 10°C.4

If the recommendation is to use 121°C for 20-60 minutes, then operating at 111°C we’d need to run it for 200-600 minutes. This is looking on par.

D Time (minutes)
D111 200-600
D115 80-240
D121 20-60

Sterilization cycles should be validated to ensure that the survival of the most resistant microorganisms is no greater than 10-6 under specified operating conditions and parameters2

A 1°C variation in the sterilization temperature causes an increase (or reduction) of the sterilization rate by a factor of 1.26, i.e. 26%5

So yes, the maths back up the study’s claim of 150 minutes. You probably shouldn’t go any less than that, and you def could go more, up to 240.

References

diff --git a/hrtcat/topics/make_agar.html b/hrtcat/topics/make_agar.html new file mode 100644 index 00000000..5e66f263 --- /dev/null +++ b/hrtcat/topics/make_agar.html @@ -0,0 +1 @@ + Agar Plates | HRT Cat Skip to main content Link Menu Expand (external link) Document Search Copy Copied

How to Make Agar Plates

Used for fingertip testing and sterility assurance. You should use Tryptic Soy Agar (TSA)1 as your growth medium. If you have the ability and means to use Fluid Thioglycolate Medium (FTM) then you should use it in addition to TSA for your sterility testing.2 USP 71 says that both TSA and FTM need to be used for sterilization tests, however, FTM is expensive and difficult to procure and so we have opted to leave it out of this guide.

Your TSA plates for fingertip testing and for sterility testing need to be prepared slightly differently. Make TSA with neutralizers for fingertip testing.1 Make without neutralizers for sterility assurance tests. Neutralizers polysorbate 80 and lecithin are used in combination with the TSA to “to neutralize the effects of disinfecting agents”3

We’re not 100% certain what the neutralizers accomplish, but it seems like they protect the agar from any IPA residue left on gloves from cleaning.

Making Tryptic Soy Agar (TSA) plates is straightforward assuming you have the right equipment. Use the link above for an example of ratios to use when making TSA with neutralizers. Start with sterile plates, either you purchased them sterile off the internet (Amazon has them) or you sterilized them yourself in your autoclave.

Next, you should mix the TSA powder with distilled water according to the TSA package and then autoclave the now-mixed TSA in a media bottle.

When the agar cools to handling temperature but is still liquid, pour the sterile TSA into the sterile plates under a laminar flow hood or still air box. Seal with tape. Let set.


References

  1. Compounding Sterile Preparations page 276  2

  2. Compounding Sterile Preparations page 262 

  3. Compounding Sterile Preparations page 432 

diff --git a/hrtcat/topics/recipes.html b/hrtcat/topics/recipes.html new file mode 100644 index 00000000..3e219268 --- /dev/null +++ b/hrtcat/topics/recipes.html @@ -0,0 +1 @@ + Recipes | HRT Cat Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Recipes

We have no firm opinions on the recipes listed below except that we would be hesitant of any concentration of any hormone ester that would make your vial last more than a couple months.††.

Recipe Calculator

There is now a recipe calculator that will help you figure out the ratios you need to mix. Check it out here.

Ingredient Density

Ingredient Density
Estradiol Enanthate 1.1±0.1 g/mL1
Estradiol Cypionate 1.083 (rough estimate) g/mL2
Estradiol Valerate 1.102 (rough estimate) g/mL3
Estradiol Undecylate 1.07 g/mL 4
Testosterone Cypionate 1.1±0.1 g/mL5*
Testosterone Enanthate 1.056 (rough estimate) g/mL6
Testosterone Undecanoate 1.03±0.1 g/mL 7
Benzyl Benzoate 1.118 g/mL8
Benzyl Alcohol 1.044 g/mL9
C8 Acid* 0.910 g/mL10
C10 Acid* 0.893 g/mL11
Castor Oil 0.96 g/mL12

Use this chart to help you convert the below recipes from how they’re listed into usable volumetric measurements.

*Part of MCT oil. A good pharmaceutical grade MCT oil will list the percentage each of C8 and C10

Recipes used by drug manufacturers

These recipes are listed to help us understand how these drugs are formulated at the highest levels of the pharmaceutical industry. Surprise! It’s basically done the same way that homebrewers do it.

Some recipes list ingredients in different units of measurement. Look out for mg vs mL and use the above table to convert

Estradiol Valerate

By Par Pharmaceutical,13 10mg/mL:

  • E V: 10mg
  • Chlorobutanol†]: 5mg
  • Sesame oil: 915mg

By Par Pharmaceutical,13 20mg/mL:

  • E V: 20mg (2%)
  • Benzyl benzoate: 224mg (23%) (0.2mL)
  • Benzyl alcohol: 20mg (2%)
  • Castor oil: 730mg (73%)

By Par Pharmaceutical,13 40mg/mL:

  • E V: 40mg (4%)
  • Benzyl benzoate: 447mg (43%) (0.4mL)
  • Benzyl alcohol: 20mg (2%) (0.02mL)
  • Castor oil: 522mg (51%) (0.54mL)

Estradiol Cypionate

By Pfizer,14 5mg/mL:

  • E C: 5mg
  • Chlorobutanol anhydrous: 5.4mg
  • Cottonseed oil: 913mg

Testosterone Cypionate

By Xiromed,15 100mg/mL:

  • Test C: 100mg
  • Benzyl Benzoate: 0.1mL
  • Cottonseed oil: 732.79mg
  • Benzyl alcohol: 9.45mg

By Xiromed,15 200mg/mL: 1mL = 989.29g

  • Test C: 200mg (20%)
  • Benzyl Benzoate: 0.2mL (223.6mg) (23%)
  • Cottonseed oil: 556.24mg (56%)
  • Benzyl alcohol: 9.45mg (1%)

By Slayback Pharma,16 200mg/mL:

  • Benzyl Benzoate: 0.2mL
  • Benzyl Alcohol: 20mg
  • Cottonseed oil: 542mg

Testosterone Enanthate

By Hikma Pharmaceuticals,17 200mg/mL:

  • Test E: 200mg
  • Chlorobutanol: 5mg
  • USP sesame oil base

Recipes by homebrewers

Estradiol Enanthate

By Lena,18 50mg/mL††:

  • E En: 500mg
  • Benzyl alcohol: 0.2mL
  • MCT oil: 9.35mL

By Noire Labs,19 40mg/mL, 10mL††:

  • E En: 400mg
  • Benzyl alcohol: 0.2mL (2%)
  • Benzyl benzoate: 4mL (40%)
  • MCT oil: 5.4mL (54%)

Estradiol Undecylate

By Lena,18 60mg/mL††:

  • E En: 600mg
  • Benzyl alcohol: 0.2mL
  • MCT oil: 9.25mL

Estradiol Cypionate

By Anon,20 20mg/mL: Makes 50mL. (Clearly makes slightly more than 50mL but the percentages are close enough)

  • E C: 1,000mg
  • Benzyl benzoate: 12.5mL (25%)
  • Benzyl alcohol: 1.0mL (2%)
  • MCT oil: 36.5mL (73%)

Testosterone Cypionate

By r/steroids,21 200mg/mL: Makes 100mL

  • Test C: 20.4g
  • Benzyl alcohol: 1.56g
  • Benzyl benzoate: 20.7g
  • MCT oil: 57.4g

Lots more T recipes on the r/steroids wiki


Notes

Chlorobutanol is a preservative, and as far as we can tell does not act as a solvent. We will use benzyl alcohol instead of this primarily because it is much more readily available, and that’s what all the other homebrewers do. If you decide to brew with this stuff make sure you check through all the MSDS to ensure its safe to be handling outside a lab.

††While it’s cool to have a single vial last you for a year, as soon as you start puncturing a vial you should aim to use it within a couple of months. When you use it over and over again you risk introducing harmful bacteria to the vial, and then giving it time to grow.

References

diff --git a/hrtcat/topics/sanitize_sterilize_depyrogenate.html b/hrtcat/topics/sanitize_sterilize_depyrogenate.html new file mode 100644 index 00000000..f19b28d1 --- /dev/null +++ b/hrtcat/topics/sanitize_sterilize_depyrogenate.html @@ -0,0 +1 @@ + Sanitize vs Sterilize vs Depyrogenate | HRT Cat Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Sanitize vs Sterilize vs Depyrogenate

These terms all refer to different ways of removing microbes from a surface or material. But they are all saying different things.

Clean

Cleaning removes dirt, dust, crumbs, and germs from surfaces or objects. When you clean, you will likely use soap (or detergent) and water to physically clean off the surfaces and objects. This may not necessarily kill the germs. But since you removed some of them, there are fewer germs that could spread infection to you.1

Sanitize

Sanitizing could be done by either cleaning, disinfecting, or both. Sanitizing means that you are lowering the number of germs to a safe level. What is considered a safe level depends on public health standards or requirements at a workplace, school, etc. For example, there are sanitizing procedures for restaurants and other facilities that prepare food. What you do to sanitize will vary, depending on your needs. You might be mopping a floor using a mop, a chemical, and water. You might use a dishwasher to sanitize the dishes. Or you could be using an antibacterial wipe on a tv remote.1

Sterilize

#TODO - needs more info, citations

This means to fully remove or kill all microbes. If it’s not 100% it’s not sterile. This does not include pyrogens.

Depyrogenation

Depyrogenation is the removal of pyrogens.

A pyrogen is defined as any substance that can cause a fever. Bacterial pyrogens include endotoxins and exotoxins, although many pyrogens are endogenous to the host.2

Depyropgenation sometimes will result in sterilization, however they are considered distinct processes and measures.

References

diff --git a/hrtcat/topics/sterilization_temps.html b/hrtcat/topics/sterilization_temps.html new file mode 100644 index 00000000..1841bd84 --- /dev/null +++ b/hrtcat/topics/sterilization_temps.html @@ -0,0 +1 @@ + Sterilization Temperatures | HRT Cat Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Sterilization Temperatures

Dry Heat

Static air

Dry heat sterilization using a static-air sterilizer (basically an oven) is not suitable for most materials. Use 338°F for 60 mins, 320°F for 120 mins, or 302°F for 150 mins.1 If using a kitchen oven there should be a thermometer inside to verify temperatures, as the temperature you set it to is not a reliable indicator as to the temperature inside the oven. Some people will use two oven thermometers inside the oven to check temps in various locations as there are typically cool zones.

Temperature Time
180°C/356°F 30 mins
170°C/338°F 60 mins
160°C/320°F 120 mins
150°C/302°F 150 mins
140°C ??

Depyrogenation temps2

Temperature Time
250°C 30 mins
200°C 60 mins

Forced Air

See USP Chapter 797 for these details. Will not be filled in here as we are unlikely to use this method.

Steam / Autoclave

Considered an “advanced compounding procedure”. Consult USP Chapter 1211.

This is the use of an autoclave. Commercially available pressure cookers such as stovetop units and the electric Instant Pot can be used here, but understanding how they pressurize and what temps they reach is vitally important.

121°C at 15psi for 20-60 minutes.1

There is a relationship between temperature, pressure, and time. The math is a bit beyond us so we’re not going to attempt to explain it here. But take the Instant Pot for example. It gets up to 115°-118°C at 10.2-11.6psi, a bit short of the requirements listed above. Therefore, it needs to run a sterilization cycle for at least 150 minutes. See the instant pot page for data about sterilization with that.

See this page for info about sterilizing sealed containers.


  1. Compounding Sterile Preparations pages 253-254  2

  2. DEPYROGENATION OF PHARMACEUTICAL PACKAGING COMPONENTS 

diff --git a/hrtcat/topics/still_air.html b/hrtcat/topics/still_air.html new file mode 100644 index 00000000..5db0124e --- /dev/null +++ b/hrtcat/topics/still_air.html @@ -0,0 +1 @@ + Still Air Boxes | HRT Cat Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Still Air Boxes

Take a large, clear tupperware container. Cut two holes in one side for your hands and arms to fit through. You will use it by having it upside down on the tabletop and sticking your arms through it, doing all of your sterile work inside. It will vastly minimize your shit being hit by random microbes flying around your clean room.

This is a very common thing in the home mycology community. Look this up on youtube and you’ll find some good info on how to build/use one.

#TODO - flesh out, link more info

diff --git a/hrtcat/topics/vial_size_concentration.html b/hrtcat/topics/vial_size_concentration.html new file mode 100644 index 00000000..7ad6856b --- /dev/null +++ b/hrtcat/topics/vial_size_concentration.html @@ -0,0 +1 @@ + Vial Sizes and Concentrations | HRT Cat Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Vial Sizes and Concentrations

We want to determine what vial sizes and concentrations are a good fit, maximizing both. As we’ve said in other places, the official recommendation from USP/FDA, etc. is that vials be discarded 28 days after puncture. But, we’re going to call 12 weeks a rough good cutoff point for vials considering that any official number will be highly conservative.

Assuming a 5mg dose and a 0.035mL dead space:

Concentration Dose Vol. + ~Dead Space Vial Size Doses
20mg/mL 0.25mL 0.285mL 2mL 7
20mg/mL     5mL 17
40mg/mL 0.125mL 0.16mL 2mL 12
40mg/mL     5mL 31

We could extrapolate this out further, but we think what it says is pretty apparent: 5mL is too large of a vial size for high-concentration brews and 40mg/mL in a 2mL vial is perfectly sized to last 12 weeks.

Until we are able to conduct some experiments to determine how long these vials can last without contamination, being punctured regularly or even after a single puncture and being left around, then we think it’s best to hug closer to official guidelines.

We believe 3 times the official guideline is still okay seeing as many folks are putting 40mg/mL into 10mL vials, and using it for over a year. They are hopefully using extra benzyl alcohol (but not a toxic amount), but without further research that’s not something we’re willing to do or advocate for.

Now, most homebrewers will brew at a 40mg/mL concentration, and often distribute a 10mL vial, effectively containing two years worth of HRT in a single vial. This is a bad idea. The FDA requires that all vials are discarded 28 days after first puncture. And like, sure, ACAB, and truly the FDA is probably way too conservative, but also… they’re probably not that wrong here. Another issue to consider is coring. If you puncture your vial every week for a year eventually you run the risk of causing some rubber to fall into your meds. We’ve seen vials core in under 8 weeks due to poor puncturing techniques.

diff --git a/hrtcat/where-to-order.html b/hrtcat/where-to-order.html new file mode 100644 index 00000000..b37132f2 --- /dev/null +++ b/hrtcat/where-to-order.html @@ -0,0 +1 @@ + Where to Order HRT | HRT Cat Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Where to Order HRT

Updated June 15, 2023

The below resources have ready-made HRT and raw powders

  • (MtF/FtM?) - diyhrt.cafe has links to many different websites that will ship you all sorts of transition-related drugs. They are raising money to consult a lawyer about listing testosterone providers. Some of the shops they list do also sell T, but HRT Cafe won’t tell you which ones. Topicals, pills, patches, and injectables. We recommend staying away from homebrewers who are listed here, aside from Vanna.
  • (FtM) - steroidsourcetalk.cc is a forum for bodybuilders who use testosterone for building muscle mass. Testosterone Cypionate and Testosterone Enanthate are the same whether used for bodybuilding or transition. You can read reviews on this site and decide where to purchase from. Likely injectables only, not trans-friendly.
  • (MtF/FtM) - DragonOrdnance.com has raw powders for both estradiol and testosterone and some ready-made vials. They have many good reviews online, though many complaints about shipping issues. While there are other sources for raw estradiol powders, this is the only site we’ve identified with consistent access to testosterone powders.
  • (MtF/FtM) - DashPCT.com is owned by the same folks as Dragon Ordnance and may have similar shipping issues. They have ready-to-consume HRT for both trans mascs and trans femmes. Pills, topicals, injections.
  • (MtF/FtM?) - made-in-china.com is where many DIY producers get their raw hormone powders to produce both injectables and topicals. There are some reports indicating that most sellers on here are reliable and selling you the real thing (why scamming hormone powders doesn’t make sense). That said, you can use r/TransDIY to search for vendors that other people have had good experiences with. In order to find the substance you’re looking for, first identify the CAS number of the substance. Then search for just the CAS number on the website. We were able to find T doing this, though we didn’t order it.
  • (MtF?/FtM?) - alibaba.com, some people claim luck with this, but we haven’t looked much into it.
  • If you’re technically inclined, you can get on the dark web and probably find some raws on a marketplace, especially T. That is outside the scope of this guide, for now. https://tor.taxi/ has links to the various operating marketplaces. Make sure you check the PGP signatures of marketplaces against multiple sources before sending your money there, use tails os, and try to stick to the Monero cryptocurrency if you can.
diff --git a/index.html b/index.html index d3be601b..898d8ee8 100644 --- a/index.html +++ b/index.html @@ -25,6 +25,7 @@ diyhrt.market
/r/transdiy wiki (pharmacies)
transfemscience.org
+ hrt.cat
guides
related sites
archived / unmaintained sites