├── src ├── static │ ├── img │ │ └── .keep │ ├── js │ │ ├── main.js │ │ ├── plugins.js │ │ └── vendor │ │ │ ├── modernizr-3.11.2.min.js │ │ │ └── htmx.min.js │ ├── icon.png │ ├── tile.png │ ├── favicon.ico │ ├── tile-wide.png │ ├── robots.txt │ ├── site.webmanifest │ ├── humans.txt │ ├── browserconfig.xml │ └── css │ │ ├── main.css │ │ └── normalize.css ├── strings.rs ├── page.rs └── main.rs ├── .rustfmt.toml ├── .gitignore ├── Cargo.toml ├── .editorconfig ├── README.md ├── .gitattributes ├── LICENSE └── Cargo.lock /src/static/img/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/static/js/main.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.rustfmt.toml: -------------------------------------------------------------------------------- 1 | edition = "2021" 2 | -------------------------------------------------------------------------------- /src/static/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pyxy-dk/actix-maud-htmx-h5bp/HEAD/src/static/icon.png -------------------------------------------------------------------------------- /src/static/tile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pyxy-dk/actix-maud-htmx-h5bp/HEAD/src/static/tile.png -------------------------------------------------------------------------------- /src/static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pyxy-dk/actix-maud-htmx-h5bp/HEAD/src/static/favicon.ico -------------------------------------------------------------------------------- /src/static/tile-wide.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pyxy-dk/actix-maud-htmx-h5bp/HEAD/src/static/tile-wide.png -------------------------------------------------------------------------------- /src/static/robots.txt: -------------------------------------------------------------------------------- 1 | # www.robotstxt.org/ 2 | 3 | # Allow crawling of all content 4 | User-agent: * 5 | Disallow: 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Include your project-specific ignores in this file 2 | # Read about how to use .gitignore: https://help.github.com/articles/ignoring-files 3 | # Useful .gitignore templates: https://github.com/github/gitignore 4 | 5 | .vscode/ 6 | /target 7 | -------------------------------------------------------------------------------- /src/static/site.webmanifest: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "", 3 | "name": "", 4 | "icons": [{ 5 | "src": "icon.png", 6 | "type": "image/png", 7 | "sizes": "192x192" 8 | }], 9 | "start_url": "/?utm_source=homescreen", 10 | "background_color": "#fafafa", 11 | "theme_color": "#fafafa" 12 | } 13 | -------------------------------------------------------------------------------- /src/static/humans.txt: -------------------------------------------------------------------------------- 1 | # humanstxt.org/ 2 | # The humans responsible & technology colophon 3 | 4 | # TEAM 5 | 6 | -- -- 7 | 8 | # THANKS 9 | 10 | 11 | 12 | # TECHNOLOGY COLOPHON 13 | 14 | CSS3, HTML5 15 | Apache Server Configs, jQuery, Modernizr, Normalize.css 16 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "actix-maud-htmx-h5bp" 3 | version = "0.1.1" 4 | edition = "2021" 5 | 6 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 7 | 8 | [dependencies] 9 | actix-files = "0.6" 10 | actix-web = "4" 11 | maud = { version="0.24", features = ["actix-web"] } 12 | serde = { version = "1", features = ["derive"] } 13 | -------------------------------------------------------------------------------- /src/static/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | indent_size = 4 7 | indent_style = space 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.{bat,cmd,ps1}] 12 | end_of_line = crlf 13 | 14 | [*.{html,svg,xml}] 15 | insert_final_newline = false 16 | 17 | [*.md] 18 | # Double whitespace at EOL equals a line break in Markdown 19 | trim_trailing_whitespace = false 20 | 21 | [*.yml] 22 | indent_size = 2 23 | -------------------------------------------------------------------------------- /src/static/js/plugins.js: -------------------------------------------------------------------------------- 1 | // Avoid `console` errors in browsers that lack a console. 2 | (function() { 3 | var method; 4 | var noop = function () {}; 5 | var methods = [ 6 | 'assert', 'clear', 'count', 'debug', 'dir', 'dirxml', 'error', 7 | 'exception', 'group', 'groupCollapsed', 'groupEnd', 'info', 'log', 8 | 'markTimeline', 'profile', 'profileEnd', 'table', 'time', 'timeEnd', 9 | 'timeline', 'timelineEnd', 'timeStamp', 'trace', 'warn' 10 | ]; 11 | var length = methods.length; 12 | var console = (window.console = window.console || {}); 13 | 14 | while (length--) { 15 | method = methods[length]; 16 | 17 | // Only stub undefined methods. 18 | if (!console[method]) { 19 | console[method] = noop; 20 | } 21 | } 22 | }()); 23 | 24 | // Place any jQuery/helper plugins in here. 25 | -------------------------------------------------------------------------------- /src/strings.rs: -------------------------------------------------------------------------------- 1 | /// HTML5 Boilerplate &strs 2 | 3 | pub static DESCRIPTION: &str = "description"; 4 | pub static NOT_FOUND_COMMENT: &str = ""; 5 | pub static NOT_FOUND_MESSAGE: &str = "Sorry, but the page you were trying to view does not exist."; 6 | pub static NOT_FOUND_STYLE: &str = " 7 | * { 8 | line-height: 1.2; 9 | margin: 0; 10 | } 11 | 12 | html { 13 | color: #888; 14 | display: table; 15 | font-family: sans-serif; 16 | height: 100%; 17 | text-align: center; 18 | width: 100%; 19 | } 20 | 21 | body { 22 | display: table-cell; 23 | vertical-align: middle; 24 | margin: 2em auto; 25 | } 26 | 27 | h1 { 28 | color: #555; 29 | font-size: 2em; 30 | font-weight: 400; 31 | } 32 | 33 | p { 34 | margin: 0 auto; 35 | width: 280px; 36 | } 37 | 38 | @media only screen and (max-width: 280px) { 39 | 40 | body, 41 | p { 42 | width: 95%; 43 | } 44 | 45 | h1 { 46 | font-size: 1.5em; 47 | margin: 0 0 0.3em; 48 | } 49 | 50 | }"; 51 | pub static NOT_FOUND_TITLE: &str = "Page Not Found"; 52 | pub static UTF8: &str = "utf-8"; 53 | pub static VIEWPORT: &str = "viewport"; 54 | pub static VIEWPORT_CONTENT: &str = "width=device-width, initial-scale=1"; 55 | pub static WEBSITE: &str = "website"; 56 | -------------------------------------------------------------------------------- /src/page.rs: -------------------------------------------------------------------------------- 1 | use crate::strings; 2 | use maud::{html, Markup, DOCTYPE}; 3 | 4 | fn body(content: Markup) -> Markup { 5 | html! { 6 | body { 7 | (content) 8 | script src="js/vendor/htmx.min.js" {} 9 | script src="js/vendor/modernizr-3.11.2.min.js" {} 10 | script src="js/plugins.js" {} 11 | script src="js/main.js" {} 12 | // TODO: Google Analytics: change UA-XXXXX-Y to be your site's ID. 13 | (google_analytics("UA-XXXXX-Y")) 14 | // Non-H5BP editorial comment: please consider using another analytics solution 15 | // instead of gifting your users' data to Alphabet Inc. - see e.g. 16 | // 17 | // for a discussion of alternatives. 18 | } 19 | } 20 | } 21 | 22 | fn google_analytics(site_id: &str) -> Markup { 23 | html! { 24 | script {" 25 | window.ga = function () {{ ga.q.push(arguments) }}; ga.q = []; ga.l = +new Date; 26 | ga('create', '" (site_id) "', 'auto'); ga('set', 'anonymizeIp', true); ga('set', 'transport', 'beacon'); ga('send', 'pageview')" } 27 | script src="https://www.google-analytics.com/analytics.js" async {} 28 | } 29 | } 30 | 31 | fn head(title: &str, desc: &str, url: &str) -> Markup { 32 | html! { 33 | head { 34 | meta charset=(strings::UTF8); 35 | title { (title) } 36 | meta name=(strings::DESCRIPTION) content=(desc); 37 | meta name=(strings::VIEWPORT) content=(strings::VIEWPORT_CONTENT); 38 | meta property="og:title" content=(title); 39 | meta property="og:type" content=(strings::WEBSITE); 40 | meta property="og:url" content=(url); 41 | meta property="og:image" content=""; 42 | link rel="manifest" href="site.webmanifest"; 43 | link rel="apple-touch-icon" href="icon.png"; 44 | link rel="stylesheet" href="css/normalize.css"; 45 | link rel="stylesheet" href="css/main.css"; 46 | meta name="theme-color" content="#fafafa"; 47 | } 48 | } 49 | } 50 | 51 | pub(crate) fn page(host: &str, title: &str, desc: &str, lang: &str, content: Markup) -> Markup { 52 | html! { 53 | (DOCTYPE) 54 | html class="no-js" lang=(lang) { 55 | (head(title, desc, host)) 56 | (body(content)) 57 | } 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # actix-maud-htmx-h5bp 2 | 3 | A template repository implementing [HTML5 Boilerplate 8.0][h5bp] in [Actix] using the [Maud] HTML 4 | template engine. [HTMX] is vendored in for your [HATEOAS] pleasure. 5 | 6 | ## 🏃 Running 7 | 8 | ```text 9 | git clone git@github.com:pyxy-dk/actix-maud-htmx-h5bp.git 10 | 11 | cd actix-maud-htmx-h5bp 12 | 13 | cargo run 14 | ``` 15 | 16 | Now open in your browser. 17 | 18 | ## 🗺️ File mapping from H5BP 19 | 20 | The files from a standard download of H5BP 8.0 maps to the following files in 21 | this template project: 22 | 23 | ```text 24 | h5bp 25 | │ 26 | ├── css 27 | │ ├── main.css ⇒ ./src/static/css/ 28 | │ └── normalize.css ⇒ ./src/static/css/ 29 | │ 30 | ├── doc ¬ Not included 31 | │ 32 | ├── img ⇒ ./src/static/img/ 33 | │ 34 | ├── js 35 | │ ├── vendor 36 | │ │ └── modernizer-3.11.2.min.js ⇒ ./src/static/js/vendor/ 37 | │ ├── main.js ⇒ ./src/static/js/ 38 | │ └── plugins.js ⇒ ./src/static/js/ 39 | │ 40 | ├── .editorconfig ⇒ expanded in ./.editorconfig 41 | ├── .gitattributes ⇒ expanded in ./.gitattributes 42 | ├── .gitignore ⇒ expanded in ./.gitignore 43 | ├── .htaccess ¬ Not included 44 | ├── 404.html ⇏ Implemented in Actix 45 | ├── browserconfig.xml ⇒ ./src/static/ 46 | ├── favicon.ico ⇒ ./src/static/ 47 | ├── humans.txt ⇒ ./src/static/ 48 | ├── icon.png ⇒ ./src/static/ 49 | ├── index.html ⇏ Implemented in Actix 50 | ├── LICENSE.txt ⇒ ./LICENSE 51 | ├── package.json ¬ Not included 52 | ├── package-lock.json ¬ Not included 53 | ├── robots.txt ⇒ ./src/static/ 54 | ├── site.webmanifest ⇒ ./src/static/ 55 | ├── tile.png ⇒ ./src/static/ 56 | └── tile-wide.png ⇒ ./src/static/ 57 | ``` 58 | 59 | ## 🙏 Thanks to 60 | 61 | * The [Actix] web framework. 62 | * [Maud], a Rust macro for writing type-safe HTML. Maud rocks! 63 | * [HTMX] for making frontend fun again. 64 | * Good old [HTML5 Boilerplate][h5bp]. 65 | 66 | [Actix]: https://actix.rs/ 67 | [h5bp]: https://html5boilerplate.com/ 68 | [HATEOAS]: https://en.wikipedia.org/wiki/HATEOAS 69 | [HTMX]: https://htmx.org/ 70 | [Maud]: https://maud.lambda.xyz/ 71 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | use actix_files::Files as ActixFiles; 2 | use actix_web::web::{route, Form}; 3 | use actix_web::{get, post, App, HttpRequest, HttpServer, Responder, Result as ActixResult}; 4 | use maud::{html, Markup, PreEscaped}; 5 | use serde::Deserialize; 6 | 7 | mod page; 8 | mod strings; 9 | 10 | #[get("/")] 11 | async fn index(req: HttpRequest) -> ActixResult { 12 | let host = format!("{}", req.uri()); 13 | let title = "actix-maud-htmx-h5bp"; 14 | let desc = "This is a template. There are many like it but this one is mine."; 15 | let lang = "en"; 16 | // TODO: Add your site or application content here. 17 | let content = html! { 18 | #content { 19 | p { "Hello world! This is HTML5 Boilerplate." } 20 | } 21 | form hx-post="/hello" hx-target="#content" hx-swap="outerHTML" { 22 | div { 23 | label { "What's your name? " } 24 | input type="text" name="name" value="" {} 25 | } 26 | button { "Submit" } 27 | } 28 | }; 29 | Ok(page::page(&host, title, desc, lang, content)) 30 | } 31 | 32 | #[post("/hello")] 33 | async fn hello(user_input: Form) -> ActixResult { 34 | Ok(html! { 35 | #content { 36 | p { "Hello " (user_input.name) "! This is HTMX." } 37 | } 38 | }) 39 | } 40 | 41 | async fn not_found() -> impl Responder { 42 | ( 43 | html! { 44 | html lang="en" { 45 | head { 46 | meta charset=(strings::UTF8); 47 | title { (strings::NOT_FOUND_TITLE) } 48 | meta name=(strings::VIEWPORT) content=(strings::VIEWPORT_CONTENT); 49 | style { (strings::NOT_FOUND_STYLE) } 50 | } 51 | body { 52 | h1 { (strings::NOT_FOUND_TITLE) } 53 | p { (strings::NOT_FOUND_MESSAGE) } 54 | } 55 | (PreEscaped(strings::NOT_FOUND_COMMENT)) 56 | } 57 | }, 58 | actix_web::http::StatusCode::NOT_FOUND, 59 | ) 60 | } 61 | 62 | #[actix_web::main] 63 | async fn main() -> std::io::Result<()> { 64 | HttpServer::new(|| { 65 | App::new() 66 | .service(index) 67 | .service(hello) 68 | .service(ActixFiles::new("/", "./src/static").prefer_utf8(true)) 69 | .default_service(route().to(not_found)) 70 | }) 71 | .bind(("127.0.0.1", 8080))? 72 | .run() 73 | .await 74 | } 75 | 76 | #[derive(Deserialize)] 77 | struct HelloForm { 78 | name: String, 79 | } 80 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | ## GITATTRIBUTES FOR WEB PROJECTS 2 | # 3 | # These settings are for any web project. 4 | # 5 | # Details per file setting: 6 | # text These files should be normalized (i.e. convert CRLF to LF). 7 | # binary These files are binary and should be left untouched. 8 | # 9 | # Note that binary is a macro for -text -diff. 10 | ###################################################################### 11 | 12 | ## AUTO-DETECT 13 | ## Handle line endings automatically for files detected as 14 | ## text and leave all files detected as binary untouched. 15 | ## This will handle all files NOT defined below. 16 | * text=auto 17 | 18 | ## SOURCE CODE 19 | *.css text eol=lf 20 | *.js text eol=lf 21 | *.rs text eol=lf 22 | *.webmanifest text eol=lf 23 | *.xml text eol=lf 24 | 25 | ## DOCKER 26 | *.dockerignore text eol=lf 27 | Dockerfile text eol=lf 28 | 29 | ## DOCUMENTATION 30 | *.md text eol=lf 31 | *.txt text eol=lf 32 | LICENSE text eol=lf 33 | 34 | ## CONFIGS 35 | .editorconfig text eol=lf 36 | .gitattributes text eol=lf 37 | .gitconfig text eol=lf 38 | .gitignore text eol=lf 39 | *.toml text eol=lf 40 | *.yaml text eol=lf 41 | *.yml text eol=lf 42 | browserslist text eol=lf 43 | Makefile text eol=lf 44 | makefile text eol=lf 45 | 46 | ## CARGO 47 | Cargo.* text eol=lf 48 | 49 | ## GRAPHICS 50 | *.ai binary 51 | *.bmp binary 52 | *.eps binary 53 | *.gif binary 54 | *.ico binary 55 | *.jng binary 56 | *.jp2 binary 57 | *.jpg binary 58 | *.jpeg binary 59 | *.jpx binary 60 | *.jxr binary 61 | *.pdf binary 62 | *.png binary 63 | *.psb binary 64 | *.psd binary 65 | *.svg text eol=lf 66 | *.svgz binary 67 | *.tif binary 68 | *.tiff binary 69 | *.wbmp binary 70 | *.webp binary 71 | 72 | ## AUDIO 73 | *.kar binary 74 | *.m4a binary 75 | *.mid binary 76 | *.midi binary 77 | *.mp3 binary 78 | *.ogg binary 79 | *.ra binary 80 | 81 | ## VIDEO 82 | *.3gpp binary 83 | *.3gp binary 84 | *.as binary 85 | *.asf binary 86 | *.asx binary 87 | *.fla binary 88 | *.flv binary 89 | *.m4v binary 90 | *.mng binary 91 | *.mov binary 92 | *.mp4 binary 93 | *.mpeg binary 94 | *.mpg binary 95 | *.ogv binary 96 | *.swc binary 97 | *.swf binary 98 | *.webm binary 99 | 100 | ## ARCHIVES 101 | *.7z binary 102 | *.gz binary 103 | *.jar binary 104 | *.rar binary 105 | *.tar binary 106 | *.zip binary 107 | 108 | ## FONTS 109 | *.ttf binary 110 | *.eot binary 111 | *.otf binary 112 | *.woff binary 113 | *.woff2 binary 114 | 115 | ## EXECUTABLES 116 | *.exe binary 117 | *.pyc binary 118 | -------------------------------------------------------------------------------- /src/static/css/main.css: -------------------------------------------------------------------------------- 1 | /*! HTML5 Boilerplate v8.0.0 | MIT License | https://html5boilerplate.com/ */ 2 | 3 | /* main.css 2.1.0 | MIT License | https://github.com/h5bp/main.css#readme */ 4 | /* 5 | * What follows is the result of much research on cross-browser styling. 6 | * Credit left inline and big thanks to Nicolas Gallagher, Jonathan Neal, 7 | * Kroc Camen, and the H5BP dev community and team. 8 | */ 9 | 10 | /* ========================================================================== 11 | Base styles: opinionated defaults 12 | ========================================================================== */ 13 | 14 | html { 15 | color: #222; 16 | font-size: 1em; 17 | line-height: 1.4; 18 | } 19 | 20 | /* 21 | * Remove text-shadow in selection highlight: 22 | * https://twitter.com/miketaylr/status/12228805301 23 | * 24 | * Vendor-prefixed and regular ::selection selectors cannot be combined: 25 | * https://stackoverflow.com/a/16982510/7133471 26 | * 27 | * Customize the background color to match your design. 28 | */ 29 | 30 | ::-moz-selection { 31 | background: #b3d4fc; 32 | text-shadow: none; 33 | } 34 | 35 | ::selection { 36 | background: #b3d4fc; 37 | text-shadow: none; 38 | } 39 | 40 | /* 41 | * A better looking default horizontal rule 42 | */ 43 | 44 | hr { 45 | display: block; 46 | height: 1px; 47 | border: 0; 48 | border-top: 1px solid #ccc; 49 | margin: 1em 0; 50 | padding: 0; 51 | } 52 | 53 | /* 54 | * Remove the gap between audio, canvas, iframes, 55 | * images, videos and the bottom of their containers: 56 | * https://github.com/h5bp/html5-boilerplate/issues/440 57 | */ 58 | 59 | audio, 60 | canvas, 61 | iframe, 62 | img, 63 | svg, 64 | video { 65 | vertical-align: middle; 66 | } 67 | 68 | /* 69 | * Remove default fieldset styles. 70 | */ 71 | 72 | fieldset { 73 | border: 0; 74 | margin: 0; 75 | padding: 0; 76 | } 77 | 78 | /* 79 | * Allow only vertical resizing of textareas. 80 | */ 81 | 82 | textarea { 83 | resize: vertical; 84 | } 85 | 86 | /* ========================================================================== 87 | Author's custom styles 88 | ========================================================================== */ 89 | 90 | /* ========================================================================== 91 | Helper classes 92 | ========================================================================== */ 93 | 94 | /* 95 | * Hide visually and from screen readers 96 | */ 97 | 98 | .hidden, 99 | [hidden] { 100 | display: none !important; 101 | } 102 | 103 | /* 104 | * Hide only visually, but have it available for screen readers: 105 | * https://snook.ca/archives/html_and_css/hiding-content-for-accessibility 106 | * 107 | * 1. For long content, line feeds are not interpreted as spaces and small width 108 | * causes content to wrap 1 word per line: 109 | * https://medium.com/@jessebeach/beware-smushed-off-screen-accessible-text-5952a4c2cbfe 110 | */ 111 | 112 | .sr-only { 113 | border: 0; 114 | clip: rect(0, 0, 0, 0); 115 | height: 1px; 116 | margin: -1px; 117 | overflow: hidden; 118 | padding: 0; 119 | position: absolute; 120 | white-space: nowrap; 121 | width: 1px; 122 | /* 1 */ 123 | } 124 | 125 | /* 126 | * Extends the .sr-only class to allow the element 127 | * to be focusable when navigated to via the keyboard: 128 | * https://www.drupal.org/node/897638 129 | */ 130 | 131 | .sr-only.focusable:active, 132 | .sr-only.focusable:focus { 133 | clip: auto; 134 | height: auto; 135 | margin: 0; 136 | overflow: visible; 137 | position: static; 138 | white-space: inherit; 139 | width: auto; 140 | } 141 | 142 | /* 143 | * Hide visually and from screen readers, but maintain layout 144 | */ 145 | 146 | .invisible { 147 | visibility: hidden; 148 | } 149 | 150 | /* 151 | * Clearfix: contain floats 152 | * 153 | * For modern browsers 154 | * 1. The space content is one way to avoid an Opera bug when the 155 | * `contenteditable` attribute is included anywhere else in the document. 156 | * Otherwise it causes space to appear at the top and bottom of elements 157 | * that receive the `clearfix` class. 158 | * 2. The use of `table` rather than `block` is only necessary if using 159 | * `:before` to contain the top-margins of child elements. 160 | */ 161 | 162 | .clearfix::before, 163 | .clearfix::after { 164 | content: " "; 165 | display: table; 166 | } 167 | 168 | .clearfix::after { 169 | clear: both; 170 | } 171 | 172 | /* ========================================================================== 173 | EXAMPLE Media Queries for Responsive Design. 174 | These examples override the primary ('mobile first') styles. 175 | Modify as content requires. 176 | ========================================================================== */ 177 | 178 | @media only screen and (min-width: 35em) { 179 | /* Style adjustments for viewports that meet the condition */ 180 | } 181 | 182 | @media print, 183 | (-webkit-min-device-pixel-ratio: 1.25), 184 | (min-resolution: 1.25dppx), 185 | (min-resolution: 120dpi) { 186 | /* Style adjustments for high resolution devices */ 187 | } 188 | 189 | /* ========================================================================== 190 | Print styles. 191 | Inlined to avoid the additional HTTP request: 192 | https://www.phpied.com/delay-loading-your-print-css/ 193 | ========================================================================== */ 194 | 195 | @media print { 196 | *, 197 | *::before, 198 | *::after { 199 | background: #fff !important; 200 | color: #000 !important; 201 | /* Black prints faster */ 202 | box-shadow: none !important; 203 | text-shadow: none !important; 204 | } 205 | 206 | a, 207 | a:visited { 208 | text-decoration: underline; 209 | } 210 | 211 | a[href]::after { 212 | content: " (" attr(href) ")"; 213 | } 214 | 215 | abbr[title]::after { 216 | content: " (" attr(title) ")"; 217 | } 218 | 219 | /* 220 | * Don't show links that are fragment identifiers, 221 | * or use the `javascript:` pseudo protocol 222 | */ 223 | a[href^="#"]::after, 224 | a[href^="javascript:"]::after { 225 | content: ""; 226 | } 227 | 228 | pre { 229 | white-space: pre-wrap !important; 230 | } 231 | 232 | pre, 233 | blockquote { 234 | border: 1px solid #999; 235 | page-break-inside: avoid; 236 | } 237 | 238 | /* 239 | * Printing Tables: 240 | * https://web.archive.org/web/20180815150934/http://css-discuss.incutio.com/wiki/Printing_Tables 241 | */ 242 | thead { 243 | display: table-header-group; 244 | } 245 | 246 | tr, 247 | img { 248 | page-break-inside: avoid; 249 | } 250 | 251 | p, 252 | h2, 253 | h3 { 254 | orphans: 3; 255 | widows: 3; 256 | } 257 | 258 | h2, 259 | h3 { 260 | page-break-after: avoid; 261 | } 262 | } 263 | 264 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | # Creative Commons CC0 1.0 Universal 2 | 3 | CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED HEREUNDER. 4 | 5 | ## Statement of Purpose 6 | 7 | The laws of most jurisdictions throughout the world automatically confer exclusive Copyright and Related Rights (defined below) upon the creator and subsequent owner(s) (each and all, an "owner") of an original work of authorship and/or a database (each, a "Work"). 8 | 9 | Certain owners wish to permanently relinquish those rights to a Work for the purpose of contributing to a commons of creative, cultural and scientific works ("Commons") that the public can reliably and without fear of later claims of infringement build upon, modify, incorporate in other works, reuse and redistribute as freely as possible in any form whatsoever and for any purposes, including without limitation commercial purposes. These owners may contribute to the Commons to promote the ideal of a free culture and the further production of creative, cultural and scientific works, or to gain reputation or greater distribution for their Work in part through the use and efforts of others. 10 | 11 | For these and/or other purposes and motivations, and without any expectation of additional consideration or compensation, the person associating CC0 with a Work (the "Affirmer"), to the extent that he or she is an owner of Copyright and Related Rights in the Work, voluntarily elects to apply CC0 to the Work and publicly distribute the Work under its terms, with knowledge of his or her Copyright and Related Rights in the Work and the meaning and intended legal effect of CC0 on those rights. 12 | 13 | 1. __Copyright and Related Rights.__ A Work made available under CC0 may be protected by copyright and related or neighboring rights ("Copyright and Related Rights"). Copyright and Related Rights include, but are not limited to, the following: 14 | 15 | i. the right to reproduce, adapt, distribute, perform, display, communicate, and translate a Work; 16 | 17 | ii. moral rights retained by the original author(s) and/or performer(s); 18 | 19 | iii. publicity and privacy rights pertaining to a person's image or likeness depicted in a Work; 20 | 21 | iv. rights protecting against unfair competition in regards to a Work, subject to the limitations in paragraph 4(a), below; 22 | 23 | v. rights protecting the extraction, dissemination, use and reuse of data in a Work; 24 | 25 | vi. database rights (such as those arising under Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, and under any national implementation thereof, including any amended or successor version of such directive); and 26 | 27 | vii. other similar, equivalent or corresponding rights throughout the world based on applicable law or treaty, and any national implementations thereof. 28 | 29 | 2. __Waiver.__ To the greatest extent permitted by, but not in contravention of, applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and unconditionally waives, abandons, and surrenders all of Affirmer's Copyright and Related Rights and associated claims and causes of action, whether now known or unknown (including existing as well as future claims and causes of action), in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each member of the public at large and to the detriment of Affirmer's heirs and successors, fully intending that such Waiver shall not be subject to revocation, rescission, cancellation, termination, or any other legal or equitable action to disrupt the quiet enjoyment of the Work by the public as contemplated by Affirmer's express Statement of Purpose. 30 | 31 | 3. __Public License Fallback.__ Should any part of the Waiver for any reason be judged legally invalid or ineffective under applicable law, then the Waiver shall be preserved to the maximum extent permitted taking into account Affirmer's express Statement of Purpose. In addition, to the extent the Waiver is so judged Affirmer hereby grants to each affected person a royalty-free, non transferable, non sublicensable, non exclusive, irrevocable and unconditional license to exercise Affirmer's Copyright and Related Rights in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "License"). The License shall be deemed effective as of the date CC0 was applied by Affirmer to the Work. Should any part of the License for any reason be judged legally invalid or ineffective under applicable law, such partial invalidity or ineffectiveness shall not invalidate the remainder of the License, and in such case Affirmer hereby affirms that he or she will not (i) exercise any of his or her remaining Copyright and Related Rights in the Work or (ii) assert any associated claims and causes of action with respect to the Work, in either case contrary to Affirmer's express Statement of Purpose. 32 | 33 | 4. __Limitations and Disclaimers.__ 34 | 35 | a. No trademark or patent rights held by Affirmer are waived, abandoned, surrendered, licensed or otherwise affected by this document. 36 | 37 | b. Affirmer offers the Work as-is and makes no representations or warranties of any kind concerning the Work, express, implied, statutory or otherwise, including without limitation warranties of title, merchantability, fitness for a particular purpose, non infringement, or the absence of latent or other defects, accuracy, or the present or absence of errors, whether or not discoverable, all to the greatest extent permissible under applicable law. 38 | 39 | c. Affirmer disclaims responsibility for clearing rights of other persons that may apply to the Work or any use thereof, including without limitation any person's Copyright and Related Rights in the Work. Further, Affirmer disclaims responsibility for obtaining any necessary consents, permissions or other rights required for any use of the Work. 40 | 41 | d. Affirmer understands and acknowledges that Creative Commons is not a party to this document and has no duty or obligation with respect to this CC0 or use of the Work. 42 | -------------------------------------------------------------------------------- /src/static/css/normalize.css: -------------------------------------------------------------------------------- 1 | /*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ 2 | 3 | /* Document 4 | ========================================================================== */ 5 | 6 | /** 7 | * 1. Correct the line height in all browsers. 8 | * 2. Prevent adjustments of font size after orientation changes in iOS. 9 | */ 10 | 11 | html { 12 | line-height: 1.15; /* 1 */ 13 | -webkit-text-size-adjust: 100%; /* 2 */ 14 | } 15 | 16 | /* Sections 17 | ========================================================================== */ 18 | 19 | /** 20 | * Remove the margin in all browsers. 21 | */ 22 | 23 | body { 24 | margin: 0; 25 | } 26 | 27 | /** 28 | * Render the `main` element consistently in IE. 29 | */ 30 | 31 | main { 32 | display: block; 33 | } 34 | 35 | /** 36 | * Correct the font size and margin on `h1` elements within `section` and 37 | * `article` contexts in Chrome, Firefox, and Safari. 38 | */ 39 | 40 | h1 { 41 | font-size: 2em; 42 | margin: 0.67em 0; 43 | } 44 | 45 | /* Grouping content 46 | ========================================================================== */ 47 | 48 | /** 49 | * 1. Add the correct box sizing in Firefox. 50 | * 2. Show the overflow in Edge and IE. 51 | */ 52 | 53 | hr { 54 | box-sizing: content-box; /* 1 */ 55 | height: 0; /* 1 */ 56 | overflow: visible; /* 2 */ 57 | } 58 | 59 | /** 60 | * 1. Correct the inheritance and scaling of font size in all browsers. 61 | * 2. Correct the odd `em` font sizing in all browsers. 62 | */ 63 | 64 | pre { 65 | font-family: monospace, monospace; /* 1 */ 66 | font-size: 1em; /* 2 */ 67 | } 68 | 69 | /* Text-level semantics 70 | ========================================================================== */ 71 | 72 | /** 73 | * Remove the gray background on active links in IE 10. 74 | */ 75 | 76 | a { 77 | background-color: transparent; 78 | } 79 | 80 | /** 81 | * 1. Remove the bottom border in Chrome 57- 82 | * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. 83 | */ 84 | 85 | abbr[title] { 86 | border-bottom: none; /* 1 */ 87 | text-decoration: underline; /* 2 */ 88 | text-decoration: underline dotted; /* 2 */ 89 | } 90 | 91 | /** 92 | * Add the correct font weight in Chrome, Edge, and Safari. 93 | */ 94 | 95 | b, 96 | strong { 97 | font-weight: bolder; 98 | } 99 | 100 | /** 101 | * 1. Correct the inheritance and scaling of font size in all browsers. 102 | * 2. Correct the odd `em` font sizing in all browsers. 103 | */ 104 | 105 | code, 106 | kbd, 107 | samp { 108 | font-family: monospace, monospace; /* 1 */ 109 | font-size: 1em; /* 2 */ 110 | } 111 | 112 | /** 113 | * Add the correct font size in all browsers. 114 | */ 115 | 116 | small { 117 | font-size: 80%; 118 | } 119 | 120 | /** 121 | * Prevent `sub` and `sup` elements from affecting the line height in 122 | * all browsers. 123 | */ 124 | 125 | sub, 126 | sup { 127 | font-size: 75%; 128 | line-height: 0; 129 | position: relative; 130 | vertical-align: baseline; 131 | } 132 | 133 | sub { 134 | bottom: -0.25em; 135 | } 136 | 137 | sup { 138 | top: -0.5em; 139 | } 140 | 141 | /* Embedded content 142 | ========================================================================== */ 143 | 144 | /** 145 | * Remove the border on images inside links in IE 10. 146 | */ 147 | 148 | img { 149 | border-style: none; 150 | } 151 | 152 | /* Forms 153 | ========================================================================== */ 154 | 155 | /** 156 | * 1. Change the font styles in all browsers. 157 | * 2. Remove the margin in Firefox and Safari. 158 | */ 159 | 160 | button, 161 | input, 162 | optgroup, 163 | select, 164 | textarea { 165 | font-family: inherit; /* 1 */ 166 | font-size: 100%; /* 1 */ 167 | line-height: 1.15; /* 1 */ 168 | margin: 0; /* 2 */ 169 | } 170 | 171 | /** 172 | * Show the overflow in IE. 173 | * 1. Show the overflow in Edge. 174 | */ 175 | 176 | button, 177 | input { /* 1 */ 178 | overflow: visible; 179 | } 180 | 181 | /** 182 | * Remove the inheritance of text transform in Edge, Firefox, and IE. 183 | * 1. Remove the inheritance of text transform in Firefox. 184 | */ 185 | 186 | button, 187 | select { /* 1 */ 188 | text-transform: none; 189 | } 190 | 191 | /** 192 | * Correct the inability to style clickable types in iOS and Safari. 193 | */ 194 | 195 | button, 196 | [type="button"], 197 | [type="reset"], 198 | [type="submit"] { 199 | -webkit-appearance: button; 200 | } 201 | 202 | /** 203 | * Remove the inner border and padding in Firefox. 204 | */ 205 | 206 | button::-moz-focus-inner, 207 | [type="button"]::-moz-focus-inner, 208 | [type="reset"]::-moz-focus-inner, 209 | [type="submit"]::-moz-focus-inner { 210 | border-style: none; 211 | padding: 0; 212 | } 213 | 214 | /** 215 | * Restore the focus styles unset by the previous rule. 216 | */ 217 | 218 | button:-moz-focusring, 219 | [type="button"]:-moz-focusring, 220 | [type="reset"]:-moz-focusring, 221 | [type="submit"]:-moz-focusring { 222 | outline: 1px dotted ButtonText; 223 | } 224 | 225 | /** 226 | * Correct the padding in Firefox. 227 | */ 228 | 229 | fieldset { 230 | padding: 0.35em 0.75em 0.625em; 231 | } 232 | 233 | /** 234 | * 1. Correct the text wrapping in Edge and IE. 235 | * 2. Correct the color inheritance from `fieldset` elements in IE. 236 | * 3. Remove the padding so developers are not caught out when they zero out 237 | * `fieldset` elements in all browsers. 238 | */ 239 | 240 | legend { 241 | box-sizing: border-box; /* 1 */ 242 | color: inherit; /* 2 */ 243 | display: table; /* 1 */ 244 | max-width: 100%; /* 1 */ 245 | padding: 0; /* 3 */ 246 | white-space: normal; /* 1 */ 247 | } 248 | 249 | /** 250 | * Add the correct vertical alignment in Chrome, Firefox, and Opera. 251 | */ 252 | 253 | progress { 254 | vertical-align: baseline; 255 | } 256 | 257 | /** 258 | * Remove the default vertical scrollbar in IE 10+. 259 | */ 260 | 261 | textarea { 262 | overflow: auto; 263 | } 264 | 265 | /** 266 | * 1. Add the correct box sizing in IE 10. 267 | * 2. Remove the padding in IE 10. 268 | */ 269 | 270 | [type="checkbox"], 271 | [type="radio"] { 272 | box-sizing: border-box; /* 1 */ 273 | padding: 0; /* 2 */ 274 | } 275 | 276 | /** 277 | * Correct the cursor style of increment and decrement buttons in Chrome. 278 | */ 279 | 280 | [type="number"]::-webkit-inner-spin-button, 281 | [type="number"]::-webkit-outer-spin-button { 282 | height: auto; 283 | } 284 | 285 | /** 286 | * 1. Correct the odd appearance in Chrome and Safari. 287 | * 2. Correct the outline style in Safari. 288 | */ 289 | 290 | [type="search"] { 291 | -webkit-appearance: textfield; /* 1 */ 292 | outline-offset: -2px; /* 2 */ 293 | } 294 | 295 | /** 296 | * Remove the inner padding in Chrome and Safari on macOS. 297 | */ 298 | 299 | [type="search"]::-webkit-search-decoration { 300 | -webkit-appearance: none; 301 | } 302 | 303 | /** 304 | * 1. Correct the inability to style clickable types in iOS and Safari. 305 | * 2. Change font properties to `inherit` in Safari. 306 | */ 307 | 308 | ::-webkit-file-upload-button { 309 | -webkit-appearance: button; /* 1 */ 310 | font: inherit; /* 2 */ 311 | } 312 | 313 | /* Interactive 314 | ========================================================================== */ 315 | 316 | /* 317 | * Add the correct display in Edge, IE 10+, and Firefox. 318 | */ 319 | 320 | details { 321 | display: block; 322 | } 323 | 324 | /* 325 | * Add the correct display in all browsers. 326 | */ 327 | 328 | summary { 329 | display: list-item; 330 | } 331 | 332 | /* Misc 333 | ========================================================================== */ 334 | 335 | /** 336 | * Add the correct display in IE 10+. 337 | */ 338 | 339 | template { 340 | display: none; 341 | } 342 | 343 | /** 344 | * Add the correct display in IE 10. 345 | */ 346 | 347 | [hidden] { 348 | display: none; 349 | } 350 | -------------------------------------------------------------------------------- /src/static/js/vendor/modernizr-3.11.2.min.js: -------------------------------------------------------------------------------- 1 | /*! modernizr 3.11.2 (Custom Build) | MIT * 2 | * https://modernizr.com/download/?-cssanimations-csscolumns-customelements-flexbox-history-picture-pointerevents-postmessage-sizes-srcset-webgl-websockets-webworkers-addtest-domprefixes-hasevent-mq-prefixedcssvalue-prefixes-setclasses-testallprops-testprop-teststyles !*/ 3 | !function(e,t,n,r){function o(e,t){return typeof e===t}function i(e){var t=_.className,n=Modernizr._config.classPrefix||"";if(S&&(t=t.baseVal),Modernizr._config.enableJSClass){var r=new RegExp("(^|\\s)"+n+"no-js(\\s|$)");t=t.replace(r,"$1"+n+"js$2")}Modernizr._config.enableClasses&&(e.length>0&&(t+=" "+n+e.join(" "+n)),S?_.className.baseVal=t:_.className=t)}function s(e,t){if("object"==typeof e)for(var n in e)k(e,n)&&s(n,e[n]);else{e=e.toLowerCase();var r=e.split("."),o=Modernizr[r[0]];if(2===r.length&&(o=o[r[1]]),void 0!==o)return Modernizr;t="function"==typeof t?t():t,1===r.length?Modernizr[r[0]]=t:(!Modernizr[r[0]]||Modernizr[r[0]]instanceof Boolean||(Modernizr[r[0]]=new Boolean(Modernizr[r[0]])),Modernizr[r[0]][r[1]]=t),i([(t&&!1!==t?"":"no-")+r.join("-")]),Modernizr._trigger(e,t)}return Modernizr}function a(){return"function"!=typeof n.createElement?n.createElement(arguments[0]):S?n.createElementNS.call(n,"http://www.w3.org/2000/svg",arguments[0]):n.createElement.apply(n,arguments)}function l(){var e=n.body;return e||(e=a(S?"svg":"body"),e.fake=!0),e}function u(e,t,r,o){var i,s,u,f,c="modernizr",d=a("div"),p=l();if(parseInt(r,10))for(;r--;)u=a("div"),u.id=o?o[r]:c+(r+1),d.appendChild(u);return i=a("style"),i.type="text/css",i.id="s"+c,(p.fake?p:d).appendChild(i),p.appendChild(d),i.styleSheet?i.styleSheet.cssText=e:i.appendChild(n.createTextNode(e)),d.id=c,p.fake&&(p.style.background="",p.style.overflow="hidden",f=_.style.overflow,_.style.overflow="hidden",_.appendChild(p)),s=t(d,e),p.fake?(p.parentNode.removeChild(p),_.style.overflow=f,_.offsetHeight):d.parentNode.removeChild(d),!!s}function f(e,n,r){var o;if("getComputedStyle"in t){o=getComputedStyle.call(t,e,n);var i=t.console;if(null!==o)r&&(o=o.getPropertyValue(r));else if(i){var s=i.error?"error":"log";i[s].call(i,"getComputedStyle returning null, its possible modernizr test results are inaccurate")}}else o=!n&&e.currentStyle&&e.currentStyle[r];return o}function c(e,t){return!!~(""+e).indexOf(t)}function d(e){return e.replace(/([A-Z])/g,function(e,t){return"-"+t.toLowerCase()}).replace(/^ms-/,"-ms-")}function p(e,n){var o=e.length;if("CSS"in t&&"supports"in t.CSS){for(;o--;)if(t.CSS.supports(d(e[o]),n))return!0;return!1}if("CSSSupportsRule"in t){for(var i=[];o--;)i.push("("+d(e[o])+":"+n+")");return i=i.join(" or "),u("@supports ("+i+") { #modernizr { position: absolute; } }",function(e){return"absolute"===f(e,null,"position")})}return r}function m(e){return e.replace(/([a-z])-([a-z])/g,function(e,t,n){return t+n.toUpperCase()}).replace(/^-/,"")}function h(e,t,n,i){function s(){u&&(delete N.style,delete N.modElem)}if(i=!o(i,"undefined")&&i,!o(n,"undefined")){var l=p(e,n);if(!o(l,"undefined"))return l}for(var u,f,d,h,A,v=["modernizr","tspan","samp"];!N.style&&v.length;)u=!0,N.modElem=a(v.shift()),N.style=N.modElem.style;for(d=e.length,f=0;f\x20\t\r\n\f]*)/i;var r=t.exec(e);if(r){return r[1].toLowerCase()}else{return""}}function o(e,t){var r=new DOMParser;var n=r.parseFromString(e,"text/html");var i=n.body;while(t>0){t--;i=i.firstChild}if(i==null){i=P().createDocumentFragment()}return i}function u(e){if(D.config.useTemplateFragments){var t=o("",0);return t.querySelector("template").content}else{var r=i(e);switch(r){case"thead":case"tbody":case"tfoot":case"colgroup":case"caption":return o(""+e+"
",1);case"col":return o(""+e+"
",2);case"tr":return o(""+e+"
",2);case"td":case"th":return o(""+e+"
",3);case"script":return o("
"+e+"
",1);default:return o(e,0)}}}function U(e){if(e){e()}}function a(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function f(e){return a(e,"Function")}function g(e){return a(e,"Object")}function j(e){var t="htmx-internal-data";var r=e[t];if(!r){r=e[t]={}}return r}function p(e){var t=[];if(e){for(var r=0;r=0}function z(e){return P().body.contains(e)}function y(e){return e.trim().split(/\s+/)}function V(e,t){for(var r in t){if(t.hasOwnProperty(r)){e[r]=t[r]}}return e}function x(e){try{return JSON.parse(e)}catch(e){ut(e);return null}}function e(e){return Ut(P().body,function(){return eval(e)})}function t(t){var e=D.on("htmx:load",function(e){t(e.detail.elt)});return e}function b(){D.logger=function(e,t,r){if(console){console.log(t,e,r)}}}function w(e,t){if(t){return e.querySelector(t)}else{return w(P(),e)}}function S(e,t){if(t){return e.querySelectorAll(t)}else{return S(P(),e)}}function E(e,t){e=H(e);if(t){setTimeout(function(){E(e)},t)}else{e.parentElement.removeChild(e)}}function C(e,t,r){e=H(e);if(r){setTimeout(function(){C(e,t)},r)}else{e.classList&&e.classList.add(t)}}function R(e,t,r){e=H(e);if(r){setTimeout(function(){R(e,t)},r)}else{if(e.classList){e.classList.remove(t);if(e.classList.length===0){e.removeAttribute("class")}}}}function q(e,t){e=H(e);e.classList.toggle(t)}function L(e,t){e=H(e);B(e.parentElement.children,function(e){R(e,t)});C(e,t)}function O(e,t){e=H(e);if(e.closest){return e.closest(t)}else{do{if(e==null||v(e,t)){return e}}while(e=e&&l(e))}}function T(e,t){if(t.indexOf("closest ")===0){return[O(e,t.substr(8))]}else if(t.indexOf("find ")===0){return[w(e,t.substr(5))]}else if(t==="document"){return[document]}else if(t==="window"){return[window]}else{return P().querySelectorAll(t)}}function A(e,t){if(t){return T(e,t)[0]}else{return T(P().body,e)[0]}}function H(e){if(a(e,"String")){return w(e)}else{return e}}function k(e,t,r){if(f(t)){return{target:P().body,event:e,listener:t}}else{return{target:H(e),event:t,listener:r}}}function N(t,r,n){rr(function(){var e=k(t,r,n);e.target.addEventListener(e.event,e.listener)});var e=f(r);return e?r:n}function I(t,r,n){rr(function(){var e=k(t,r,n);e.target.removeEventListener(e.event,e.listener)});return f(r)?r:n}function _(e){var t=d(e,function(e){return F(e,"hx-target")!==null});if(t){var r=F(t,"hx-target");if(r==="this"){return t}else{return A(e,r)}}else{var n=j(e);if(n.boosted){return P().body}else{return e}}}function M(e){var t=D.config.attributesToSettle;for(var r=0;r0){i=e.substr(0,e.indexOf(":"));n=e.substr(e.indexOf(":")+1,e.length)}else{i=e}var o=P().querySelector(n);if(o){var a;a=P().createDocumentFragment();a.appendChild(t);if(!$(i,o)){a=t}le(i,o,o,a,r)}else{t.parentNode.removeChild(t);ot(P().body,"htmx:oobErrorNoTarget",{content:t})}return e}function Z(e,r){B(S(e,"[hx-swap-oob], [data-hx-swap-oob]"),function(e){var t=F(e,"hx-swap-oob");if(t!=null){J(t,e,r)}})}function G(e){B(S(e,"[hx-preserve], [data-hx-preserve]"),function(e){var t=F(e,"id");var r=P().getElementById(t);if(r!=null){e.parentNode.replaceChild(r,e)}})}function K(n,e,i){B(e.querySelectorAll("[id]"),function(e){if(e.id&&e.id.length>0){var t=n.querySelector(e.tagName+"[id='"+e.id+"']");if(t&&t!==n){var r=e.cloneNode();W(e,t);i.tasks.push(function(){W(e,r)})}}})}function Y(e){return function(){R(e,D.config.addedClass);rt(e);Ke(e);Q(e);lt(e,"htmx:load")}}function Q(e){var t="[autofocus]";var r=v(e,t)?e:e.querySelector(t);if(r!=null){r.focus()}}function ee(e,t,r,n){K(e,r,n);while(r.childNodes.length>0){var i=r.firstChild;C(i,D.config.addedClass);e.insertBefore(i,t);if(i.nodeType!==Node.TEXT_NODE&&i.nodeType!==Node.COMMENT_NODE){n.tasks.push(Y(i))}}}function te(t){var e=j(t);if(e.webSocket){e.webSocket.close()}if(e.sseEventSource){e.sseEventSource.close()}if(e.listenerInfos){B(e.listenerInfos,function(e){if(t!==e.on){e.on.removeEventListener(e.trigger,e.listener)}})}if(t.children){B(t.children,function(e){te(e)})}}function re(e,t,r){if(e.tagName==="BODY"){return se(e,t,r)}else{var n=e.previousSibling;ee(l(e),e,t,r);if(n==null){var i=l(e).firstChild}else{var i=n.nextSibling}j(e).replacedWith=i;r.elts=[];while(i&&i!==e){if(i.nodeType===Node.ELEMENT_NODE){r.elts.push(i)}i=i.nextElementSibling}te(e);l(e).removeChild(e)}}function ne(e,t,r){return ee(e,e.firstChild,t,r)}function ie(e,t,r){return ee(l(e),e,t,r)}function oe(e,t,r){return ee(e,null,t,r)}function ae(e,t,r){return ee(l(e),e.nextSibling,t,r)}function se(e,t,r){var n=e.firstChild;ee(e,n,t,r);if(n){while(n.nextSibling){te(n.nextSibling);e.removeChild(n.nextSibling)}te(n);e.removeChild(n)}}function ue(e,t){var r=X(e,"hx-select");if(r){var n=P().createDocumentFragment();B(t.querySelectorAll(r),function(e){n.appendChild(e)});t=n}return t}function le(e,t,r,n,i){switch(e){case"none":return;case"outerHTML":re(r,n,i);return;case"afterbegin":ne(r,n,i);return;case"beforebegin":ie(r,n,i);return;case"beforeend":oe(r,n,i);return;case"afterend":ae(r,n,i);return;default:var o=tr(t);for(var a=0;a-1){var t=e.replace(/]*>|>)([\s\S]*?)<\/svg>/gim,"");var r=t.match(/]*>|>)([\s\S]*?)<\/title>/im);if(r){return r[2]}}}function ce(e,t,r,n,i){var o=fe(n);if(o){var a=w("title");if(a){a.innerHTML=o}else{window.document.title=o}}var s=u(n);if(s){Z(s,i);s=ue(r,s);G(s);return le(e,r,t,s,i)}}function he(e,t,r){var n=e.getResponseHeader(t);if(n.indexOf("{")===0){var i=x(n);for(var o in i){if(i.hasOwnProperty(o)){var a=i[o];if(!g(a)){a={value:a}}lt(r,o,a)}}}else{lt(r,n,[])}}var de=/\s/;var ve=/[\s,]/;var ge=/[_$a-zA-Z]/;var pe=/[_$a-zA-Z0-9]/;var me=['"',"'","/"];var ye=/[^\s]/;function xe(e){var t=[];var r=0;while(r0){var a=t[0];if(a==="]"){n--;if(n===0){if(o===null){i=i+"true"}t.shift();i+=")})";try{var s=Ut(e,function(){return Function(i)()},function(){return true});s.source=i;return s}catch(e){ot(P().body,"htmx:syntax:error",{error:e,source:i});return null}}}else if(a==="["){n++}if(be(a,o,r)){i+="(("+r+"."+a+") ? ("+r+"."+a+") : (window."+a+"))"}else{i=i+a}o=t.shift()}}}function Se(e,t){var r="";while(e.length>0&&!e[0].match(t)){r+=e.shift()}return r}var Ee="input, textarea, select";function Ce(e){var t=F(e,"hx-trigger");var r=[];if(t){var n=xe(t);do{Se(n,ye);var i=n.length;var o=Se(n,/[,\[\s]/);if(o!==""){if(o==="every"){var a={trigger:"every"};Se(n,ye);a.pollInterval=h(Se(n,/[,\[\s]/));Se(n,ye);var s=we(e,n,"event");if(s){a.eventFilter=s}r.push(a)}else if(o.indexOf("sse:")===0){r.push({trigger:"sse",sseEvent:o.substr(4)})}else{var u={trigger:o};var s=we(e,n,"event");if(s){u.eventFilter=s}while(n.length>0&&n[0]!==","){Se(n,ye);var l=n.shift();if(l==="changed"){u.changed=true}else if(l==="once"){u.once=true}else if(l==="consume"){u.consume=true}else if(l==="delay"&&n[0]===":"){n.shift();u.delay=h(Se(n,ve))}else if(l==="from"&&n[0]===":"){n.shift();let e=Se(n,ve);if(e==="closest"||e==="find"){n.shift();e+=" "+Se(n,ve)}u.from=e}else if(l==="target"&&n[0]===":"){n.shift();u.target=Se(n,ve)}else if(l==="throttle"&&n[0]===":"){n.shift();u.throttle=h(Se(n,ve))}else if(l==="queue"&&n[0]===":"){n.shift();u.queue=Se(n,ve)}else if((l==="root"||l==="threshold")&&n[0]===":"){n.shift();u[l]=Se(n,ve)}else{ot(e,"htmx:syntax:error",{token:n.shift()})}}r.push(u)}}if(n.length===i){ot(e,"htmx:syntax:error",{token:n.shift()})}Se(n,ye)}while(n[0]===","&&n.shift())}if(r.length>0){return r}else if(v(e,"form")){return[{trigger:"submit"}]}else if(v(e,Ee)){return[{trigger:"change"}]}else{return[{trigger:"click"}]}}function Re(e){j(e).cancelled=true}function qe(e,t,r,n){var i=j(e);i.timeout=setTimeout(function(){if(z(e)&&i.cancelled!==true){if(!He(n,it("hx:poll:trigger",{triggerSpec:n}))){Zt(t,r,e)}qe(e,t,F(e,"hx-"+t),n)}},n.pollInterval)}function Le(e){return location.hostname===e.hostname&&c(e,"href")&&c(e,"href").indexOf("#")!==0}function Oe(t,r,e){if(t.tagName==="A"&&Le(t)&&t.target===""||t.tagName==="FORM"){r.boosted=true;var n,i;if(t.tagName==="A"){n="get";i=c(t,"href");r.pushURL=true}else{var o=c(t,"method");n=o?o.toLowerCase():"get";if(n==="get"){r.pushURL=true}i=c(t,"action")}e.forEach(function(e){ke(t,n,i,r,e,true)})}}function Te(e,t){if(e.type==="submit"||e.type==="click"){if(t.tagName==="FORM"){return true}if(v(t,'input[type="submit"], button')&&O(t,"form")!==null){return true}if(t.tagName==="A"&&t.href&&(t.getAttribute("href")==="#"||t.getAttribute("href").indexOf("#")!==0)){return true}}return false}function Ae(e,t){return j(e).boosted&&e.tagName==="A"&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function He(e,t){var r=e.eventFilter;if(r){try{return r(t)!==true}catch(e){ot(P().body,"htmx:eventFilter:error",{error:e,source:r.source});return true}}return false}function ke(o,a,s,e,u,l){var t;if(u.from){t=T(o,u.from)}else{t=[o]}B(t,function(n){var i=function(e){if(!z(o)){n.removeEventListener(u.trigger,i);return}if(Ae(o,e)){return}if(l||Te(e,o)){e.preventDefault()}if(He(u,e)){return}var t=j(e);t.triggerSpec=u;if(t.handledFor==null){t.handledFor=[]}var r=j(o);if(t.handledFor.indexOf(o)<0){t.handledFor.push(o);if(u.consume){e.stopPropagation()}if(u.target&&e.target){if(!v(e.target,u.target)){return}}if(u.once){if(r.triggeredOnce){return}else{r.triggeredOnce=true}}if(u.changed){if(r.lastValue===o.value){return}else{r.lastValue=o.value}}if(r.delayed){clearTimeout(r.delayed)}if(r.throttle){return}if(u.throttle){if(!r.throttle){Zt(a,s,o,e);r.throttle=setTimeout(function(){r.throttle=null},u.throttle)}}else if(u.delay){r.delayed=setTimeout(function(){Zt(a,s,o,e)},u.delay)}else{Zt(a,s,o,e)}}};if(e.listenerInfos==null){e.listenerInfos=[]}e.listenerInfos.push({trigger:u.trigger,listener:i,on:n});n.addEventListener(u.trigger,i)})}var Ne=false;var Ie=null;function Me(){if(!Ie){Ie=function(){Ne=true};window.addEventListener("scroll",Ie);setInterval(function(){if(Ne){Ne=false;B(P().querySelectorAll("[hx-trigger='revealed'],[data-hx-trigger='revealed']"),function(e){De(e)})}},200)}}function De(e){if(!s(e,"data-hx-revealed")&&m(e)){e.setAttribute("data-hx-revealed","true");var t=j(e);if(t.initialized){Zt(t.verb,t.path,e)}else{e.addEventListener("htmx:afterProcessNode",function(){Zt(t.verb,t.path,e)},{once:true})}}}function Fe(e,t,r){var n=y(r);for(var i=0;i=0){var t=je(n);setTimeout(function(){Pe(s,r,n+1)},t)}};t.onopen=function(e){n=0};j(s).webSocket=t;t.addEventListener("message",function(e){if(Xe(s)){return}var t=e.data;st(s,function(e){t=e.transformResponse(t,null,s)});var r=Ft(s);var n=u(t);var i=p(n.children);for(var o=0;o0){lt(l,"htmx:validation:halted",i);return}t.send(JSON.stringify(u));if(Te(e,l)){e.preventDefault()}})}else{ot(l,"htmx:noWebSocketSourceError")}}function je(e){var t=D.config.wsReconnectDelay;if(typeof t==="function"){return t(e)}if(t==="full-jitter"){var r=Math.min(e,6);var n=1e3*Math.pow(2,r);return n*Math.random()}ut('htmx.config.wsReconnectDelay must either be a function or the string "full-jitter"')}function Be(e,t,r){var n=y(r);for(var i=0;iD.config.historyCacheSize){i.shift()}while(i.length>0){try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(e){ot(P().body,"htmx:historyCacheError",{cause:e,cache:i});i.shift()}}}function dt(e){var t=x(localStorage.getItem("htmx-history-cache"))||[];for(var r=0;r=200&&this.status<400){lt(P().body,"htmx:historyCacheMissLoad",i);var e=u(this.response);e=e.querySelector("[hx-history-elt],[data-hx-history-elt]")||e;var t=ct();var r=Ft(t);se(t,e,r);mt(r.tasks);ft=n;lt(P().body,"htmx:historyRestore",{path:n})}else{ot(P().body,"htmx:historyCacheMissLoadError",i)}};e.send()}function xt(e){gt();e=e||location.pathname+location.search;var t=dt(e);if(t){var r=u(t.content);var n=ct();var i=Ft(n);se(n,r,i);mt(i.tasks);document.title=t.title;window.scrollTo(0,t.scroll);ft=e;lt(P().body,"htmx:historyRestore",{path:e})}else{if(D.config.refreshOnHistoryMiss){window.location.reload(true)}else{yt(e)}}}function bt(e){var t=X(e,"hx-push-url");return t&&t!=="false"||j(e).boosted&&j(e).pushURL}function wt(e){var t=X(e,"hx-push-url");return t==="true"||t==="false"?null:t}function St(e){var t=X(e,"hx-indicator");if(t){var r=T(e,t)}else{r=[e]}B(r,function(e){e.classList["add"].call(e.classList,D.config.requestClass)});return r}function Et(e){B(e,function(e){e.classList["remove"].call(e.classList,D.config.requestClass)})}function Ct(e,t){for(var r=0;r=0}function Mt(e){var t=X(e,"hx-swap");var r={swapStyle:j(e).boosted?"innerHTML":D.config.defaultSwapStyle,swapDelay:D.config.defaultSwapDelay,settleDelay:D.config.defaultSettleDelay};if(j(e).boosted&&!It(e)){r["show"]="top"}if(t){var n=y(t);if(n.length>0){r["swapStyle"]=n[0];for(var i=1;i0?s.join(":"):null;r["scroll"]=u;r["scrollTarget"]=l}if(o.indexOf("show:")===0){var f=o.substr(5);var s=f.split(":");var c=s.pop();var l=s.length>0?s.join(":"):null;r["show"]=c;r["showTarget"]=l}}}}return r}function Dt(t,r,n){var i=null;st(r,function(e){if(i==null){i=e.encodeParameters(t,n,r)}});if(i!=null){return i}else{if(X(r,"hx-encoding")==="multipart/form-data"||v(r,"form")&&c(r,"enctype")==="multipart/form-data"){return Ht(n)}else{return At(n)}}}function Ft(e){return{tasks:[],elts:[e]}}function Pt(e,t){var r=e[0];var n=e[e.length-1];if(t.scroll){var i=null;if(t.scrollTarget){i=A(r,t.scrollTarget)}if(t.scroll==="top"&&(r||i)){i=i||r;i.scrollTop=0}if(t.scroll==="bottom"&&(n||i)){i=i||n;i.scrollTop=i.scrollHeight}}if(t.show){var i=null;if(t.showTarget){var o=t.showTarget;if(t.showTarget==="window"){o="body"}i=A(r,o)}if(t.show==="top"&&(r||i)){i=i||r;i.scrollIntoView({block:"start",behavior:D.config.scrollBehavior})}if(t.show==="bottom"&&(n||i)){i=i||n;i.scrollIntoView({block:"end",behavior:D.config.scrollBehavior})}}}function Xt(e,t,r,n){if(n==null){n={}}if(e==null){return n}var i=F(e,t);if(i){var o=i.trim();var a=r;if(o.indexOf("javascript:")===0){o=o.substr(11);a=true}else if(o.indexOf("js:")===0){o=o.substr(3);a=true}if(o.indexOf("{")!==0){o="{"+o+"}"}var s;if(a){s=Ut(e,function(){return Function("return ("+o+")")()},{})}else{s=x(o)}for(var u in s){if(s.hasOwnProperty(u)){if(n[u]==null){n[u]=s[u]}}}}return Xt(l(e),t,r,n)}function Ut(e,t,r){if(D.config.allowEval){return t()}else{ot(e,"htmx:evalDisallowedError");return r}}function jt(e,t){return Xt(e,"hx-vars",true,t)}function Bt(e,t){return Xt(e,"hx-vals",false,t)}function zt(e){return V(jt(e),Bt(e))}function Vt(t,r,n){if(n!==null){try{t.setRequestHeader(r,n)}catch(e){t.setRequestHeader(r,encodeURIComponent(n));t.setRequestHeader(r+"-URI-AutoEncoded","true")}}}function _t(t){if(t.responseURL&&typeof URL!=="undefined"){try{var e=new URL(t.responseURL);return e.pathname+e.search}catch(e){ot(P().body,"htmx:badResponseUrl",{url:t.responseURL})}}}function Wt(e,t){return e.getAllResponseHeaders().match(t)}function $t(e,t,r){e=e.toLowerCase();if(r){if(r instanceof Element||a(r,"String")){return Zt(e,t,null,null,{targetOverride:H(r),returnPromise:true})}else{return Zt(e,t,H(r.source),r.event,{handler:r.handler,headers:r.headers,values:r.values,targetOverride:H(r.target),returnPromise:true})}}else{return Zt(e,t,null,null,{returnPromise:true})}}function Jt(e){var t=[];while(e){t.push(e);e=e.parentElement}return t}function Zt(e,t,n,r,i){var o=null;var a=null;i=i!=null?i:{};if(i.returnPromise&&typeof Promise!=="undefined"){var s=new Promise(function(e,t){o=e;a=t})}if(n==null){n=P().body}var u=i.handler||Gt;if(!z(n)){return}var l=i.targetOverride||_(n);if(l==null){ot(n,"htmx:targetError",{target:F(n,"hx-target")});return}var f=j(n);if(f.requestInFlight){var c="last";if(r){var h=j(r);if(h&&h.triggerSpec&&h.triggerSpec.queue){c=h.triggerSpec.queue}}if(f.queuedRequests==null){f.queuedRequests=[]}if(c==="first"&&f.queuedRequests.length===0){f.queuedRequests.push(function(){Zt(e,t,n,r,i)})}else if(c==="all"){f.queuedRequests.push(function(){Zt(e,t,n,r,i)})}else if(c==="last"){f.queuedRequests=[];f.queuedRequests.push(function(){Zt(e,t,n,r,i)})}return}else{f.requestInFlight=true}var d=function(){f.requestInFlight=false;if(f.queuedRequests!=null&&f.queuedRequests.length>0){var e=f.queuedRequests.shift();e()}};var v=X(n,"hx-prompt");if(v){var g=prompt(v);if(g===null||!lt(n,"htmx:prompt",{prompt:g,target:l})){U(o);d();return s}}var p=X(n,"hx-confirm");if(p){if(!confirm(p)){U(o);d();return s}}var m=new XMLHttpRequest;var y=kt(n,l,g);if(i.headers){y=V(y,i.headers)}var x=Ot(n,e);var b=x.errors;var w=x.values;if(i.values){w=V(w,i.values)}var S=zt(n);var E=V(w,S);var C=Nt(E,n);if(e!=="get"&&X(n,"hx-encoding")==null){y["Content-Type"]="application/x-www-form-urlencoded; charset=UTF-8"}if(t==null||t===""){t=P().location.href}var R=Xt(n,"hx-request");var q={parameters:C,unfilteredParameters:E,headers:y,target:l,verb:e,errors:b,withCredentials:i.credentials||R.credentials||D.config.withCredentials,timeout:i.timeout||R.timeout||D.config.timeout,path:t,triggeringEvent:r};if(!lt(n,"htmx:configRequest",q)){U(o);d();return s}t=q.path;e=q.verb;y=q.headers;C=q.parameters;b=q.errors;if(b&&b.length>0){lt(n,"htmx:validation:halted",q);U(o);d();return s}var L=t.split("#");var O=L[0];var T=L[1];if(e==="get"){var A=O;var H=Object.keys(C).length!==0;if(H){if(A.indexOf("?")<0){A+="?"}else{A+="&"}A+=At(C);if(T){A+="#"+T}}m.open("GET",A,true)}else{m.open(e.toUpperCase(),t,true)}m.overrideMimeType("text/html");m.withCredentials=q.withCredentials;m.timeout=q.timeout;if(R.noHeaders){}else{for(var k in y){if(y.hasOwnProperty(k)){var N=y[k];Vt(m,k,N)}}}var I={xhr:m,target:l,requestConfig:q,pathInfo:{path:t,finalPath:A,anchor:T}};m.onload=function(){try{var e=Jt(n);u(n,I);Et(M);lt(n,"htmx:afterRequest",I);lt(n,"htmx:afterOnLoad",I);if(!z(n)){var t=null;while(e.length>0&&t==null){var r=e.shift();if(z(r)){t=r}}if(t){lt(t,"htmx:afterRequest",I);lt(t,"htmx:afterOnLoad",I)}}U(o);d()}catch(e){ot(n,"htmx:onLoadError",V({error:e},I));throw e}};m.onerror=function(){Et(M);ot(n,"htmx:afterRequest",I);ot(n,"htmx:sendError",I);U(a);d()};m.onabort=function(){Et(M);ot(n,"htmx:afterRequest",I);ot(n,"htmx:sendAbort",I);U(a);d()};m.ontimeout=function(){Et(M);ot(n,"htmx:afterRequest",I);ot(n,"htmx:timeout",I);U(a);d()};if(!lt(n,"htmx:beforeRequest",I)){U(o);d();return s}var M=St(n);B(["loadstart","loadend","progress","abort"],function(t){B([m,m.upload],function(e){e.addEventListener(t,function(e){lt(n,"htmx:xhr:"+t,{lengthComputable:e.lengthComputable,loaded:e.loaded,total:e.total})})})});lt(n,"htmx:beforeSend",I);m.send(e==="get"?null:Dt(m,n,C));return s}function Gt(a,s){var u=s.xhr;var l=s.target;if(!lt(a,"htmx:beforeOnLoad",s))return;if(Wt(u,/HX-Trigger:/i)){he(u,"HX-Trigger",a)}if(Wt(u,/HX-Push:/i)){var f=u.getResponseHeader("HX-Push")}if(Wt(u,/HX-Redirect:/i)){window.location.href=u.getResponseHeader("HX-Redirect");return}if(Wt(u,/HX-Refresh:/i)){if("true"===u.getResponseHeader("HX-Refresh")){location.reload();return}}if(Wt(u,/HX-Retarget:/i)){s.target=P().querySelector(u.getResponseHeader("HX-Retarget"))}var c=bt(a)||f;var e=u.status>=200&&u.status<400&&u.status!==204;var h=u.response;var t=u.status>=400;var r=V({shouldSwap:e,serverResponse:h,isError:t},s);if(!lt(l,"htmx:beforeSwap",r))return;l=r.target;h=r.serverResponse;t=r.isError;s.failed=t;s.successful=!t;if(r.shouldSwap){if(u.status===286){Re(a)}st(a,function(e){h=e.transformResponse(h,u,a)});if(c){gt()}var d=Mt(a);l.classList.add(D.config.swappingClass);var n=function(){try{var e=document.activeElement;var t={};try{t={elt:e,start:e?e.selectionStart:null,end:e?e.selectionEnd:null}}catch(e){}var r=Ft(l);ce(d.swapStyle,l,a,h,r);if(t.elt&&!z(t.elt)&&t.elt.id){var n=document.getElementById(t.elt.id);if(n){if(t.start&&n.setSelectionRange){n.setSelectionRange(t.start,t.end)}n.focus()}}l.classList.remove(D.config.swappingClass);B(r.elts,function(e){if(e.classList){e.classList.add(D.config.settlingClass)}lt(e,"htmx:afterSwap",s)});if(s.pathInfo.anchor){location.hash=s.pathInfo.anchor}if(Wt(u,/HX-Trigger-After-Swap:/i)){var i=a;if(!z(a)){i=P().body}he(u,"HX-Trigger-After-Swap",i)}var o=function(){B(r.tasks,function(e){e.call()});B(r.elts,function(e){if(e.classList){e.classList.remove(D.config.settlingClass)}lt(e,"htmx:afterSettle",s)});if(c){var e=f||wt(a)||_t(u)||s.pathInfo.finalPath||s.pathInfo.path;pt(e);lt(P().body,"htmx:pushedIntoHistory",{path:e})}Pt(r.elts,d);if(Wt(u,/HX-Trigger-After-Settle:/i)){var t=a;if(!z(a)){t=P().body}he(u,"HX-Trigger-After-Settle",t)}};if(d.settleDelay>0){setTimeout(o,d.settleDelay)}else{o()}}catch(e){ot(a,"htmx:swapError",s);throw e}};if(d.swapDelay>0){setTimeout(n,d.swapDelay)}else{n()}}if(t){ot(a,"htmx:responseError",V({error:"Response Status Error Code "+u.status+" from "+s.pathInfo.path},s))}}var Kt={};function Yt(){return{onEvent:function(e,t){return true},transformResponse:function(e,t,r){return e},isInlineSwap:function(e){return false},handleSwap:function(e,t,r,n){return false},encodeParameters:function(e,t,r){return null}}}function Qt(e,t){Kt[e]=V(Yt(),t)}function er(e){delete Kt[e]}function tr(e,r,n){if(e==undefined){return r}if(r==undefined){r=[]}if(n==undefined){n=[]}var t=F(e,"hx-ext");if(t){B(t.split(","),function(e){e=e.replace(/ /g,"");if(e.slice(0,7)=="ignore:"){n.push(e.slice(7));return}if(n.indexOf(e)<0){var t=Kt[e];if(t&&r.indexOf(t)<0){r.push(t)}}})}return tr(l(e),r,n)}function rr(e){if(P().readyState!=="loading"){e()}else{P().addEventListener("DOMContentLoaded",e)}}function nr(){if(D.config.includeIndicatorStyles!==false){P().head.insertAdjacentHTML("beforeend","")}}function ir(){var e=P().querySelector('meta[name="htmx-config"]');if(e){return x(e.content)}else{return null}}function or(){var e=ir();if(e){D.config=V(D.config,e)}}rr(function(){or();nr();var e=P().body;rt(e);window.onpopstate=function(e){if(e.state&&e.state.htmx){xt()}};setTimeout(function(){lt(e,"htmx:load",{})},0)});return D}()}); 2 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "actix-codec" 7 | version = "0.5.0" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "57a7559404a7f3573127aab53c08ce37a6c6a315c374a31070f3c91cd1b4a7fe" 10 | dependencies = [ 11 | "bitflags", 12 | "bytes", 13 | "futures-core", 14 | "futures-sink", 15 | "log", 16 | "memchr", 17 | "pin-project-lite", 18 | "tokio", 19 | "tokio-util", 20 | ] 21 | 22 | [[package]] 23 | name = "actix-files" 24 | version = "0.6.2" 25 | source = "registry+https://github.com/rust-lang/crates.io-index" 26 | checksum = "d832782fac6ca7369a70c9ee9a20554623c5e51c76e190ad151780ebea1cf689" 27 | dependencies = [ 28 | "actix-http", 29 | "actix-service", 30 | "actix-utils", 31 | "actix-web", 32 | "askama_escape", 33 | "bitflags", 34 | "bytes", 35 | "derive_more", 36 | "futures-core", 37 | "http-range", 38 | "log", 39 | "mime", 40 | "mime_guess", 41 | "percent-encoding", 42 | "pin-project-lite", 43 | ] 44 | 45 | [[package]] 46 | name = "actix-http" 47 | version = "3.2.2" 48 | source = "registry+https://github.com/rust-lang/crates.io-index" 49 | checksum = "0c83abf9903e1f0ad9973cc4f7b9767fd5a03a583f51a5b7a339e07987cd2724" 50 | dependencies = [ 51 | "actix-codec", 52 | "actix-rt", 53 | "actix-service", 54 | "actix-utils", 55 | "ahash", 56 | "base64", 57 | "bitflags", 58 | "brotli", 59 | "bytes", 60 | "bytestring", 61 | "derive_more", 62 | "encoding_rs", 63 | "flate2", 64 | "futures-core", 65 | "h2", 66 | "http", 67 | "httparse", 68 | "httpdate", 69 | "itoa 1.0.4", 70 | "language-tags", 71 | "local-channel", 72 | "mime", 73 | "percent-encoding", 74 | "pin-project-lite", 75 | "rand", 76 | "sha1", 77 | "smallvec", 78 | "tracing", 79 | "zstd", 80 | ] 81 | 82 | [[package]] 83 | name = "actix-macros" 84 | version = "0.2.3" 85 | source = "registry+https://github.com/rust-lang/crates.io-index" 86 | checksum = "465a6172cf69b960917811022d8f29bc0b7fa1398bc4f78b3c466673db1213b6" 87 | dependencies = [ 88 | "quote", 89 | "syn", 90 | ] 91 | 92 | [[package]] 93 | name = "actix-maud-htmx-h5bp" 94 | version = "0.1.1" 95 | dependencies = [ 96 | "actix-files", 97 | "actix-web", 98 | "maud", 99 | "serde", 100 | ] 101 | 102 | [[package]] 103 | name = "actix-router" 104 | version = "0.5.1" 105 | source = "registry+https://github.com/rust-lang/crates.io-index" 106 | checksum = "d66ff4d247d2b160861fa2866457e85706833527840e4133f8f49aa423a38799" 107 | dependencies = [ 108 | "bytestring", 109 | "http", 110 | "regex", 111 | "serde", 112 | "tracing", 113 | ] 114 | 115 | [[package]] 116 | name = "actix-rt" 117 | version = "2.7.0" 118 | source = "registry+https://github.com/rust-lang/crates.io-index" 119 | checksum = "7ea16c295198e958ef31930a6ef37d0fb64e9ca3b6116e6b93a8bdae96ee1000" 120 | dependencies = [ 121 | "futures-core", 122 | "tokio", 123 | ] 124 | 125 | [[package]] 126 | name = "actix-server" 127 | version = "2.1.1" 128 | source = "registry+https://github.com/rust-lang/crates.io-index" 129 | checksum = "0da34f8e659ea1b077bb4637948b815cd3768ad5a188fdcd74ff4d84240cd824" 130 | dependencies = [ 131 | "actix-rt", 132 | "actix-service", 133 | "actix-utils", 134 | "futures-core", 135 | "futures-util", 136 | "mio", 137 | "num_cpus", 138 | "socket2", 139 | "tokio", 140 | "tracing", 141 | ] 142 | 143 | [[package]] 144 | name = "actix-service" 145 | version = "2.0.2" 146 | source = "registry+https://github.com/rust-lang/crates.io-index" 147 | checksum = "3b894941f818cfdc7ccc4b9e60fa7e53b5042a2e8567270f9147d5591893373a" 148 | dependencies = [ 149 | "futures-core", 150 | "paste", 151 | "pin-project-lite", 152 | ] 153 | 154 | [[package]] 155 | name = "actix-utils" 156 | version = "3.0.0" 157 | source = "registry+https://github.com/rust-lang/crates.io-index" 158 | checksum = "e491cbaac2e7fc788dfff99ff48ef317e23b3cf63dbaf7aaab6418f40f92aa94" 159 | dependencies = [ 160 | "local-waker", 161 | "pin-project-lite", 162 | ] 163 | 164 | [[package]] 165 | name = "actix-web" 166 | version = "4.2.1" 167 | source = "registry+https://github.com/rust-lang/crates.io-index" 168 | checksum = "d48f7b6534e06c7bfc72ee91db7917d4af6afe23e7d223b51e68fffbb21e96b9" 169 | dependencies = [ 170 | "actix-codec", 171 | "actix-http", 172 | "actix-macros", 173 | "actix-router", 174 | "actix-rt", 175 | "actix-server", 176 | "actix-service", 177 | "actix-utils", 178 | "actix-web-codegen", 179 | "ahash", 180 | "bytes", 181 | "bytestring", 182 | "cfg-if", 183 | "cookie", 184 | "derive_more", 185 | "encoding_rs", 186 | "futures-core", 187 | "futures-util", 188 | "http", 189 | "itoa 1.0.4", 190 | "language-tags", 191 | "log", 192 | "mime", 193 | "once_cell", 194 | "pin-project-lite", 195 | "regex", 196 | "serde", 197 | "serde_json", 198 | "serde_urlencoded", 199 | "smallvec", 200 | "socket2", 201 | "time", 202 | "url", 203 | ] 204 | 205 | [[package]] 206 | name = "actix-web-codegen" 207 | version = "4.1.0" 208 | source = "registry+https://github.com/rust-lang/crates.io-index" 209 | checksum = "1fa9362663c8643d67b2d5eafba49e4cb2c8a053a29ed00a0bea121f17c76b13" 210 | dependencies = [ 211 | "actix-router", 212 | "proc-macro2", 213 | "quote", 214 | "syn", 215 | ] 216 | 217 | [[package]] 218 | name = "adler" 219 | version = "1.0.2" 220 | source = "registry+https://github.com/rust-lang/crates.io-index" 221 | checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" 222 | 223 | [[package]] 224 | name = "ahash" 225 | version = "0.7.6" 226 | source = "registry+https://github.com/rust-lang/crates.io-index" 227 | checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" 228 | dependencies = [ 229 | "getrandom", 230 | "once_cell", 231 | "version_check", 232 | ] 233 | 234 | [[package]] 235 | name = "aho-corasick" 236 | version = "0.7.19" 237 | source = "registry+https://github.com/rust-lang/crates.io-index" 238 | checksum = "b4f55bd91a0978cbfd91c457a164bab8b4001c833b7f323132c0a4e1922dd44e" 239 | dependencies = [ 240 | "memchr", 241 | ] 242 | 243 | [[package]] 244 | name = "alloc-no-stdlib" 245 | version = "2.0.4" 246 | source = "registry+https://github.com/rust-lang/crates.io-index" 247 | checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" 248 | 249 | [[package]] 250 | name = "alloc-stdlib" 251 | version = "0.2.2" 252 | source = "registry+https://github.com/rust-lang/crates.io-index" 253 | checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" 254 | dependencies = [ 255 | "alloc-no-stdlib", 256 | ] 257 | 258 | [[package]] 259 | name = "askama_escape" 260 | version = "0.10.3" 261 | source = "registry+https://github.com/rust-lang/crates.io-index" 262 | checksum = "619743e34b5ba4e9703bba34deac3427c72507c7159f5fd030aea8cac0cfe341" 263 | 264 | [[package]] 265 | name = "autocfg" 266 | version = "1.1.0" 267 | source = "registry+https://github.com/rust-lang/crates.io-index" 268 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 269 | 270 | [[package]] 271 | name = "base64" 272 | version = "0.13.0" 273 | source = "registry+https://github.com/rust-lang/crates.io-index" 274 | checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" 275 | 276 | [[package]] 277 | name = "bitflags" 278 | version = "1.3.2" 279 | source = "registry+https://github.com/rust-lang/crates.io-index" 280 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 281 | 282 | [[package]] 283 | name = "block-buffer" 284 | version = "0.10.3" 285 | source = "registry+https://github.com/rust-lang/crates.io-index" 286 | checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e" 287 | dependencies = [ 288 | "generic-array", 289 | ] 290 | 291 | [[package]] 292 | name = "brotli" 293 | version = "3.3.4" 294 | source = "registry+https://github.com/rust-lang/crates.io-index" 295 | checksum = "a1a0b1dbcc8ae29329621f8d4f0d835787c1c38bb1401979b49d13b0b305ff68" 296 | dependencies = [ 297 | "alloc-no-stdlib", 298 | "alloc-stdlib", 299 | "brotli-decompressor", 300 | ] 301 | 302 | [[package]] 303 | name = "brotli-decompressor" 304 | version = "2.3.2" 305 | source = "registry+https://github.com/rust-lang/crates.io-index" 306 | checksum = "59ad2d4653bf5ca36ae797b1f4bb4dbddb60ce49ca4aed8a2ce4829f60425b80" 307 | dependencies = [ 308 | "alloc-no-stdlib", 309 | "alloc-stdlib", 310 | ] 311 | 312 | [[package]] 313 | name = "bytes" 314 | version = "1.2.1" 315 | source = "registry+https://github.com/rust-lang/crates.io-index" 316 | checksum = "ec8a7b6a70fde80372154c65702f00a0f56f3e1c36abbc6c440484be248856db" 317 | 318 | [[package]] 319 | name = "bytestring" 320 | version = "1.1.0" 321 | source = "registry+https://github.com/rust-lang/crates.io-index" 322 | checksum = "86b6a75fd3048808ef06af5cd79712be8111960adaf89d90250974b38fc3928a" 323 | dependencies = [ 324 | "bytes", 325 | ] 326 | 327 | [[package]] 328 | name = "cc" 329 | version = "1.0.73" 330 | source = "registry+https://github.com/rust-lang/crates.io-index" 331 | checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" 332 | dependencies = [ 333 | "jobserver", 334 | ] 335 | 336 | [[package]] 337 | name = "cfg-if" 338 | version = "1.0.0" 339 | source = "registry+https://github.com/rust-lang/crates.io-index" 340 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 341 | 342 | [[package]] 343 | name = "convert_case" 344 | version = "0.4.0" 345 | source = "registry+https://github.com/rust-lang/crates.io-index" 346 | checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" 347 | 348 | [[package]] 349 | name = "cookie" 350 | version = "0.16.1" 351 | source = "registry+https://github.com/rust-lang/crates.io-index" 352 | checksum = "344adc371239ef32293cb1c4fe519592fcf21206c79c02854320afcdf3ab4917" 353 | dependencies = [ 354 | "percent-encoding", 355 | "time", 356 | "version_check", 357 | ] 358 | 359 | [[package]] 360 | name = "cpufeatures" 361 | version = "0.2.5" 362 | source = "registry+https://github.com/rust-lang/crates.io-index" 363 | checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" 364 | dependencies = [ 365 | "libc", 366 | ] 367 | 368 | [[package]] 369 | name = "crc32fast" 370 | version = "1.3.2" 371 | source = "registry+https://github.com/rust-lang/crates.io-index" 372 | checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" 373 | dependencies = [ 374 | "cfg-if", 375 | ] 376 | 377 | [[package]] 378 | name = "crypto-common" 379 | version = "0.1.6" 380 | source = "registry+https://github.com/rust-lang/crates.io-index" 381 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 382 | dependencies = [ 383 | "generic-array", 384 | "typenum", 385 | ] 386 | 387 | [[package]] 388 | name = "derive_more" 389 | version = "0.99.17" 390 | source = "registry+https://github.com/rust-lang/crates.io-index" 391 | checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" 392 | dependencies = [ 393 | "convert_case", 394 | "proc-macro2", 395 | "quote", 396 | "rustc_version", 397 | "syn", 398 | ] 399 | 400 | [[package]] 401 | name = "digest" 402 | version = "0.10.5" 403 | source = "registry+https://github.com/rust-lang/crates.io-index" 404 | checksum = "adfbc57365a37acbd2ebf2b64d7e69bb766e2fea813521ed536f5d0520dcf86c" 405 | dependencies = [ 406 | "block-buffer", 407 | "crypto-common", 408 | ] 409 | 410 | [[package]] 411 | name = "encoding_rs" 412 | version = "0.8.31" 413 | source = "registry+https://github.com/rust-lang/crates.io-index" 414 | checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" 415 | dependencies = [ 416 | "cfg-if", 417 | ] 418 | 419 | [[package]] 420 | name = "flate2" 421 | version = "1.0.24" 422 | source = "registry+https://github.com/rust-lang/crates.io-index" 423 | checksum = "f82b0f4c27ad9f8bfd1f3208d882da2b09c301bc1c828fd3a00d0216d2fbbff6" 424 | dependencies = [ 425 | "crc32fast", 426 | "miniz_oxide", 427 | ] 428 | 429 | [[package]] 430 | name = "fnv" 431 | version = "1.0.7" 432 | source = "registry+https://github.com/rust-lang/crates.io-index" 433 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 434 | 435 | [[package]] 436 | name = "form_urlencoded" 437 | version = "1.1.0" 438 | source = "registry+https://github.com/rust-lang/crates.io-index" 439 | checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" 440 | dependencies = [ 441 | "percent-encoding", 442 | ] 443 | 444 | [[package]] 445 | name = "futures-core" 446 | version = "0.3.24" 447 | source = "registry+https://github.com/rust-lang/crates.io-index" 448 | checksum = "4e5aa3de05362c3fb88de6531e6296e85cde7739cccad4b9dfeeb7f6ebce56bf" 449 | 450 | [[package]] 451 | name = "futures-sink" 452 | version = "0.3.24" 453 | source = "registry+https://github.com/rust-lang/crates.io-index" 454 | checksum = "21b20ba5a92e727ba30e72834706623d94ac93a725410b6a6b6fbc1b07f7ba56" 455 | 456 | [[package]] 457 | name = "futures-task" 458 | version = "0.3.24" 459 | source = "registry+https://github.com/rust-lang/crates.io-index" 460 | checksum = "a6508c467c73851293f390476d4491cf4d227dbabcd4170f3bb6044959b294f1" 461 | 462 | [[package]] 463 | name = "futures-util" 464 | version = "0.3.24" 465 | source = "registry+https://github.com/rust-lang/crates.io-index" 466 | checksum = "44fb6cb1be61cc1d2e43b262516aafcf63b241cffdb1d3fa115f91d9c7b09c90" 467 | dependencies = [ 468 | "futures-core", 469 | "futures-task", 470 | "pin-project-lite", 471 | "pin-utils", 472 | ] 473 | 474 | [[package]] 475 | name = "generic-array" 476 | version = "0.14.6" 477 | source = "registry+https://github.com/rust-lang/crates.io-index" 478 | checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" 479 | dependencies = [ 480 | "typenum", 481 | "version_check", 482 | ] 483 | 484 | [[package]] 485 | name = "getrandom" 486 | version = "0.2.7" 487 | source = "registry+https://github.com/rust-lang/crates.io-index" 488 | checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6" 489 | dependencies = [ 490 | "cfg-if", 491 | "libc", 492 | "wasi", 493 | ] 494 | 495 | [[package]] 496 | name = "h2" 497 | version = "0.3.14" 498 | source = "registry+https://github.com/rust-lang/crates.io-index" 499 | checksum = "5ca32592cf21ac7ccab1825cd87f6c9b3d9022c44d086172ed0966bec8af30be" 500 | dependencies = [ 501 | "bytes", 502 | "fnv", 503 | "futures-core", 504 | "futures-sink", 505 | "futures-util", 506 | "http", 507 | "indexmap", 508 | "slab", 509 | "tokio", 510 | "tokio-util", 511 | "tracing", 512 | ] 513 | 514 | [[package]] 515 | name = "hashbrown" 516 | version = "0.12.3" 517 | source = "registry+https://github.com/rust-lang/crates.io-index" 518 | checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" 519 | 520 | [[package]] 521 | name = "hermit-abi" 522 | version = "0.1.19" 523 | source = "registry+https://github.com/rust-lang/crates.io-index" 524 | checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" 525 | dependencies = [ 526 | "libc", 527 | ] 528 | 529 | [[package]] 530 | name = "http" 531 | version = "0.2.8" 532 | source = "registry+https://github.com/rust-lang/crates.io-index" 533 | checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" 534 | dependencies = [ 535 | "bytes", 536 | "fnv", 537 | "itoa 1.0.4", 538 | ] 539 | 540 | [[package]] 541 | name = "http-range" 542 | version = "0.1.5" 543 | source = "registry+https://github.com/rust-lang/crates.io-index" 544 | checksum = "21dec9db110f5f872ed9699c3ecf50cf16f423502706ba5c72462e28d3157573" 545 | 546 | [[package]] 547 | name = "httparse" 548 | version = "1.8.0" 549 | source = "registry+https://github.com/rust-lang/crates.io-index" 550 | checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" 551 | 552 | [[package]] 553 | name = "httpdate" 554 | version = "1.0.2" 555 | source = "registry+https://github.com/rust-lang/crates.io-index" 556 | checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" 557 | 558 | [[package]] 559 | name = "idna" 560 | version = "0.3.0" 561 | source = "registry+https://github.com/rust-lang/crates.io-index" 562 | checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" 563 | dependencies = [ 564 | "unicode-bidi", 565 | "unicode-normalization", 566 | ] 567 | 568 | [[package]] 569 | name = "indexmap" 570 | version = "1.9.1" 571 | source = "registry+https://github.com/rust-lang/crates.io-index" 572 | checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e" 573 | dependencies = [ 574 | "autocfg", 575 | "hashbrown", 576 | ] 577 | 578 | [[package]] 579 | name = "itoa" 580 | version = "0.4.8" 581 | source = "registry+https://github.com/rust-lang/crates.io-index" 582 | checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" 583 | 584 | [[package]] 585 | name = "itoa" 586 | version = "1.0.4" 587 | source = "registry+https://github.com/rust-lang/crates.io-index" 588 | checksum = "4217ad341ebadf8d8e724e264f13e593e0648f5b3e94b3896a5df283be015ecc" 589 | 590 | [[package]] 591 | name = "jobserver" 592 | version = "0.1.25" 593 | source = "registry+https://github.com/rust-lang/crates.io-index" 594 | checksum = "068b1ee6743e4d11fb9c6a1e6064b3693a1b600e7f5f5988047d98b3dc9fb90b" 595 | dependencies = [ 596 | "libc", 597 | ] 598 | 599 | [[package]] 600 | name = "language-tags" 601 | version = "0.3.2" 602 | source = "registry+https://github.com/rust-lang/crates.io-index" 603 | checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388" 604 | 605 | [[package]] 606 | name = "libc" 607 | version = "0.2.135" 608 | source = "registry+https://github.com/rust-lang/crates.io-index" 609 | checksum = "68783febc7782c6c5cb401fbda4de5a9898be1762314da0bb2c10ced61f18b0c" 610 | 611 | [[package]] 612 | name = "local-channel" 613 | version = "0.1.3" 614 | source = "registry+https://github.com/rust-lang/crates.io-index" 615 | checksum = "7f303ec0e94c6c54447f84f3b0ef7af769858a9c4ef56ef2a986d3dcd4c3fc9c" 616 | dependencies = [ 617 | "futures-core", 618 | "futures-sink", 619 | "futures-util", 620 | "local-waker", 621 | ] 622 | 623 | [[package]] 624 | name = "local-waker" 625 | version = "0.1.3" 626 | source = "registry+https://github.com/rust-lang/crates.io-index" 627 | checksum = "e34f76eb3611940e0e7d53a9aaa4e6a3151f69541a282fd0dad5571420c53ff1" 628 | 629 | [[package]] 630 | name = "lock_api" 631 | version = "0.4.9" 632 | source = "registry+https://github.com/rust-lang/crates.io-index" 633 | checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" 634 | dependencies = [ 635 | "autocfg", 636 | "scopeguard", 637 | ] 638 | 639 | [[package]] 640 | name = "log" 641 | version = "0.4.17" 642 | source = "registry+https://github.com/rust-lang/crates.io-index" 643 | checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" 644 | dependencies = [ 645 | "cfg-if", 646 | ] 647 | 648 | [[package]] 649 | name = "maud" 650 | version = "0.24.0" 651 | source = "registry+https://github.com/rust-lang/crates.io-index" 652 | checksum = "19aff2cd19eb4b93df29efa602652513b0f731f1d3474f6e377f763fddf61e58" 653 | dependencies = [ 654 | "actix-web", 655 | "futures-util", 656 | "itoa 0.4.8", 657 | "maud_macros", 658 | ] 659 | 660 | [[package]] 661 | name = "maud_macros" 662 | version = "0.24.0" 663 | source = "registry+https://github.com/rust-lang/crates.io-index" 664 | checksum = "e5c114f6f24b08fdd4a25d2fb87a8b140df56b577723247b382e8b04c583f2eb" 665 | dependencies = [ 666 | "proc-macro-error", 667 | "proc-macro2", 668 | "quote", 669 | "syn", 670 | ] 671 | 672 | [[package]] 673 | name = "memchr" 674 | version = "2.5.0" 675 | source = "registry+https://github.com/rust-lang/crates.io-index" 676 | checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" 677 | 678 | [[package]] 679 | name = "mime" 680 | version = "0.3.16" 681 | source = "registry+https://github.com/rust-lang/crates.io-index" 682 | checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" 683 | 684 | [[package]] 685 | name = "mime_guess" 686 | version = "2.0.4" 687 | source = "registry+https://github.com/rust-lang/crates.io-index" 688 | checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" 689 | dependencies = [ 690 | "mime", 691 | "unicase", 692 | ] 693 | 694 | [[package]] 695 | name = "miniz_oxide" 696 | version = "0.5.4" 697 | source = "registry+https://github.com/rust-lang/crates.io-index" 698 | checksum = "96590ba8f175222643a85693f33d26e9c8a015f599c216509b1a6894af675d34" 699 | dependencies = [ 700 | "adler", 701 | ] 702 | 703 | [[package]] 704 | name = "mio" 705 | version = "0.8.4" 706 | source = "registry+https://github.com/rust-lang/crates.io-index" 707 | checksum = "57ee1c23c7c63b0c9250c339ffdc69255f110b298b901b9f6c82547b7b87caaf" 708 | dependencies = [ 709 | "libc", 710 | "log", 711 | "wasi", 712 | "windows-sys", 713 | ] 714 | 715 | [[package]] 716 | name = "num_cpus" 717 | version = "1.13.1" 718 | source = "registry+https://github.com/rust-lang/crates.io-index" 719 | checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" 720 | dependencies = [ 721 | "hermit-abi", 722 | "libc", 723 | ] 724 | 725 | [[package]] 726 | name = "num_threads" 727 | version = "0.1.6" 728 | source = "registry+https://github.com/rust-lang/crates.io-index" 729 | checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" 730 | dependencies = [ 731 | "libc", 732 | ] 733 | 734 | [[package]] 735 | name = "once_cell" 736 | version = "1.15.0" 737 | source = "registry+https://github.com/rust-lang/crates.io-index" 738 | checksum = "e82dad04139b71a90c080c8463fe0dc7902db5192d939bd0950f074d014339e1" 739 | 740 | [[package]] 741 | name = "parking_lot" 742 | version = "0.12.1" 743 | source = "registry+https://github.com/rust-lang/crates.io-index" 744 | checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" 745 | dependencies = [ 746 | "lock_api", 747 | "parking_lot_core", 748 | ] 749 | 750 | [[package]] 751 | name = "parking_lot_core" 752 | version = "0.9.3" 753 | source = "registry+https://github.com/rust-lang/crates.io-index" 754 | checksum = "09a279cbf25cb0757810394fbc1e359949b59e348145c643a939a525692e6929" 755 | dependencies = [ 756 | "cfg-if", 757 | "libc", 758 | "redox_syscall", 759 | "smallvec", 760 | "windows-sys", 761 | ] 762 | 763 | [[package]] 764 | name = "paste" 765 | version = "1.0.9" 766 | source = "registry+https://github.com/rust-lang/crates.io-index" 767 | checksum = "b1de2e551fb905ac83f73f7aedf2f0cb4a0da7e35efa24a202a936269f1f18e1" 768 | 769 | [[package]] 770 | name = "percent-encoding" 771 | version = "2.2.0" 772 | source = "registry+https://github.com/rust-lang/crates.io-index" 773 | checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" 774 | 775 | [[package]] 776 | name = "pin-project-lite" 777 | version = "0.2.9" 778 | source = "registry+https://github.com/rust-lang/crates.io-index" 779 | checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" 780 | 781 | [[package]] 782 | name = "pin-utils" 783 | version = "0.1.0" 784 | source = "registry+https://github.com/rust-lang/crates.io-index" 785 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 786 | 787 | [[package]] 788 | name = "ppv-lite86" 789 | version = "0.2.16" 790 | source = "registry+https://github.com/rust-lang/crates.io-index" 791 | checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" 792 | 793 | [[package]] 794 | name = "proc-macro-error" 795 | version = "1.0.4" 796 | source = "registry+https://github.com/rust-lang/crates.io-index" 797 | checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" 798 | dependencies = [ 799 | "proc-macro-error-attr", 800 | "proc-macro2", 801 | "quote", 802 | "syn", 803 | "version_check", 804 | ] 805 | 806 | [[package]] 807 | name = "proc-macro-error-attr" 808 | version = "1.0.4" 809 | source = "registry+https://github.com/rust-lang/crates.io-index" 810 | checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" 811 | dependencies = [ 812 | "proc-macro2", 813 | "quote", 814 | "version_check", 815 | ] 816 | 817 | [[package]] 818 | name = "proc-macro2" 819 | version = "1.0.47" 820 | source = "registry+https://github.com/rust-lang/crates.io-index" 821 | checksum = "5ea3d908b0e36316caf9e9e2c4625cdde190a7e6f440d794667ed17a1855e725" 822 | dependencies = [ 823 | "unicode-ident", 824 | ] 825 | 826 | [[package]] 827 | name = "quote" 828 | version = "1.0.21" 829 | source = "registry+https://github.com/rust-lang/crates.io-index" 830 | checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" 831 | dependencies = [ 832 | "proc-macro2", 833 | ] 834 | 835 | [[package]] 836 | name = "rand" 837 | version = "0.8.5" 838 | source = "registry+https://github.com/rust-lang/crates.io-index" 839 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 840 | dependencies = [ 841 | "libc", 842 | "rand_chacha", 843 | "rand_core", 844 | ] 845 | 846 | [[package]] 847 | name = "rand_chacha" 848 | version = "0.3.1" 849 | source = "registry+https://github.com/rust-lang/crates.io-index" 850 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 851 | dependencies = [ 852 | "ppv-lite86", 853 | "rand_core", 854 | ] 855 | 856 | [[package]] 857 | name = "rand_core" 858 | version = "0.6.4" 859 | source = "registry+https://github.com/rust-lang/crates.io-index" 860 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 861 | dependencies = [ 862 | "getrandom", 863 | ] 864 | 865 | [[package]] 866 | name = "redox_syscall" 867 | version = "0.2.16" 868 | source = "registry+https://github.com/rust-lang/crates.io-index" 869 | checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" 870 | dependencies = [ 871 | "bitflags", 872 | ] 873 | 874 | [[package]] 875 | name = "regex" 876 | version = "1.6.0" 877 | source = "registry+https://github.com/rust-lang/crates.io-index" 878 | checksum = "4c4eb3267174b8c6c2f654116623910a0fef09c4753f8dd83db29c48a0df988b" 879 | dependencies = [ 880 | "aho-corasick", 881 | "memchr", 882 | "regex-syntax", 883 | ] 884 | 885 | [[package]] 886 | name = "regex-syntax" 887 | version = "0.6.27" 888 | source = "registry+https://github.com/rust-lang/crates.io-index" 889 | checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244" 890 | 891 | [[package]] 892 | name = "rustc_version" 893 | version = "0.4.0" 894 | source = "registry+https://github.com/rust-lang/crates.io-index" 895 | checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" 896 | dependencies = [ 897 | "semver", 898 | ] 899 | 900 | [[package]] 901 | name = "ryu" 902 | version = "1.0.11" 903 | source = "registry+https://github.com/rust-lang/crates.io-index" 904 | checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09" 905 | 906 | [[package]] 907 | name = "scopeguard" 908 | version = "1.1.0" 909 | source = "registry+https://github.com/rust-lang/crates.io-index" 910 | checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" 911 | 912 | [[package]] 913 | name = "semver" 914 | version = "1.0.14" 915 | source = "registry+https://github.com/rust-lang/crates.io-index" 916 | checksum = "e25dfac463d778e353db5be2449d1cce89bd6fd23c9f1ea21310ce6e5a1b29c4" 917 | 918 | [[package]] 919 | name = "serde" 920 | version = "1.0.145" 921 | source = "registry+https://github.com/rust-lang/crates.io-index" 922 | checksum = "728eb6351430bccb993660dfffc5a72f91ccc1295abaa8ce19b27ebe4f75568b" 923 | dependencies = [ 924 | "serde_derive", 925 | ] 926 | 927 | [[package]] 928 | name = "serde_derive" 929 | version = "1.0.145" 930 | source = "registry+https://github.com/rust-lang/crates.io-index" 931 | checksum = "81fa1584d3d1bcacd84c277a0dfe21f5b0f6accf4a23d04d4c6d61f1af522b4c" 932 | dependencies = [ 933 | "proc-macro2", 934 | "quote", 935 | "syn", 936 | ] 937 | 938 | [[package]] 939 | name = "serde_json" 940 | version = "1.0.86" 941 | source = "registry+https://github.com/rust-lang/crates.io-index" 942 | checksum = "41feea4228a6f1cd09ec7a3593a682276702cd67b5273544757dae23c096f074" 943 | dependencies = [ 944 | "itoa 1.0.4", 945 | "ryu", 946 | "serde", 947 | ] 948 | 949 | [[package]] 950 | name = "serde_urlencoded" 951 | version = "0.7.1" 952 | source = "registry+https://github.com/rust-lang/crates.io-index" 953 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 954 | dependencies = [ 955 | "form_urlencoded", 956 | "itoa 1.0.4", 957 | "ryu", 958 | "serde", 959 | ] 960 | 961 | [[package]] 962 | name = "sha1" 963 | version = "0.10.5" 964 | source = "registry+https://github.com/rust-lang/crates.io-index" 965 | checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" 966 | dependencies = [ 967 | "cfg-if", 968 | "cpufeatures", 969 | "digest", 970 | ] 971 | 972 | [[package]] 973 | name = "signal-hook-registry" 974 | version = "1.4.0" 975 | source = "registry+https://github.com/rust-lang/crates.io-index" 976 | checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" 977 | dependencies = [ 978 | "libc", 979 | ] 980 | 981 | [[package]] 982 | name = "slab" 983 | version = "0.4.7" 984 | source = "registry+https://github.com/rust-lang/crates.io-index" 985 | checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" 986 | dependencies = [ 987 | "autocfg", 988 | ] 989 | 990 | [[package]] 991 | name = "smallvec" 992 | version = "1.10.0" 993 | source = "registry+https://github.com/rust-lang/crates.io-index" 994 | checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" 995 | 996 | [[package]] 997 | name = "socket2" 998 | version = "0.4.7" 999 | source = "registry+https://github.com/rust-lang/crates.io-index" 1000 | checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd" 1001 | dependencies = [ 1002 | "libc", 1003 | "winapi", 1004 | ] 1005 | 1006 | [[package]] 1007 | name = "syn" 1008 | version = "1.0.102" 1009 | source = "registry+https://github.com/rust-lang/crates.io-index" 1010 | checksum = "3fcd952facd492f9be3ef0d0b7032a6e442ee9b361d4acc2b1d0c4aaa5f613a1" 1011 | dependencies = [ 1012 | "proc-macro2", 1013 | "quote", 1014 | "unicode-ident", 1015 | ] 1016 | 1017 | [[package]] 1018 | name = "time" 1019 | version = "0.3.15" 1020 | source = "registry+https://github.com/rust-lang/crates.io-index" 1021 | checksum = "d634a985c4d4238ec39cacaed2e7ae552fbd3c476b552c1deac3021b7d7eaf0c" 1022 | dependencies = [ 1023 | "itoa 1.0.4", 1024 | "libc", 1025 | "num_threads", 1026 | "time-macros", 1027 | ] 1028 | 1029 | [[package]] 1030 | name = "time-macros" 1031 | version = "0.2.4" 1032 | source = "registry+https://github.com/rust-lang/crates.io-index" 1033 | checksum = "42657b1a6f4d817cda8e7a0ace261fe0cc946cf3a80314390b22cc61ae080792" 1034 | 1035 | [[package]] 1036 | name = "tinyvec" 1037 | version = "1.6.0" 1038 | source = "registry+https://github.com/rust-lang/crates.io-index" 1039 | checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" 1040 | dependencies = [ 1041 | "tinyvec_macros", 1042 | ] 1043 | 1044 | [[package]] 1045 | name = "tinyvec_macros" 1046 | version = "0.1.0" 1047 | source = "registry+https://github.com/rust-lang/crates.io-index" 1048 | checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" 1049 | 1050 | [[package]] 1051 | name = "tokio" 1052 | version = "1.21.2" 1053 | source = "registry+https://github.com/rust-lang/crates.io-index" 1054 | checksum = "a9e03c497dc955702ba729190dc4aac6f2a0ce97f913e5b1b5912fc5039d9099" 1055 | dependencies = [ 1056 | "autocfg", 1057 | "bytes", 1058 | "libc", 1059 | "memchr", 1060 | "mio", 1061 | "parking_lot", 1062 | "pin-project-lite", 1063 | "signal-hook-registry", 1064 | "socket2", 1065 | "winapi", 1066 | ] 1067 | 1068 | [[package]] 1069 | name = "tokio-util" 1070 | version = "0.7.4" 1071 | source = "registry+https://github.com/rust-lang/crates.io-index" 1072 | checksum = "0bb2e075f03b3d66d8d8785356224ba688d2906a371015e225beeb65ca92c740" 1073 | dependencies = [ 1074 | "bytes", 1075 | "futures-core", 1076 | "futures-sink", 1077 | "pin-project-lite", 1078 | "tokio", 1079 | "tracing", 1080 | ] 1081 | 1082 | [[package]] 1083 | name = "tracing" 1084 | version = "0.1.37" 1085 | source = "registry+https://github.com/rust-lang/crates.io-index" 1086 | checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" 1087 | dependencies = [ 1088 | "cfg-if", 1089 | "log", 1090 | "pin-project-lite", 1091 | "tracing-core", 1092 | ] 1093 | 1094 | [[package]] 1095 | name = "tracing-core" 1096 | version = "0.1.30" 1097 | source = "registry+https://github.com/rust-lang/crates.io-index" 1098 | checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" 1099 | dependencies = [ 1100 | "once_cell", 1101 | ] 1102 | 1103 | [[package]] 1104 | name = "typenum" 1105 | version = "1.15.0" 1106 | source = "registry+https://github.com/rust-lang/crates.io-index" 1107 | checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" 1108 | 1109 | [[package]] 1110 | name = "unicase" 1111 | version = "2.6.0" 1112 | source = "registry+https://github.com/rust-lang/crates.io-index" 1113 | checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" 1114 | dependencies = [ 1115 | "version_check", 1116 | ] 1117 | 1118 | [[package]] 1119 | name = "unicode-bidi" 1120 | version = "0.3.8" 1121 | source = "registry+https://github.com/rust-lang/crates.io-index" 1122 | checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" 1123 | 1124 | [[package]] 1125 | name = "unicode-ident" 1126 | version = "1.0.5" 1127 | source = "registry+https://github.com/rust-lang/crates.io-index" 1128 | checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3" 1129 | 1130 | [[package]] 1131 | name = "unicode-normalization" 1132 | version = "0.1.22" 1133 | source = "registry+https://github.com/rust-lang/crates.io-index" 1134 | checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" 1135 | dependencies = [ 1136 | "tinyvec", 1137 | ] 1138 | 1139 | [[package]] 1140 | name = "url" 1141 | version = "2.3.1" 1142 | source = "registry+https://github.com/rust-lang/crates.io-index" 1143 | checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" 1144 | dependencies = [ 1145 | "form_urlencoded", 1146 | "idna", 1147 | "percent-encoding", 1148 | ] 1149 | 1150 | [[package]] 1151 | name = "version_check" 1152 | version = "0.9.4" 1153 | source = "registry+https://github.com/rust-lang/crates.io-index" 1154 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 1155 | 1156 | [[package]] 1157 | name = "wasi" 1158 | version = "0.11.0+wasi-snapshot-preview1" 1159 | source = "registry+https://github.com/rust-lang/crates.io-index" 1160 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 1161 | 1162 | [[package]] 1163 | name = "winapi" 1164 | version = "0.3.9" 1165 | source = "registry+https://github.com/rust-lang/crates.io-index" 1166 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 1167 | dependencies = [ 1168 | "winapi-i686-pc-windows-gnu", 1169 | "winapi-x86_64-pc-windows-gnu", 1170 | ] 1171 | 1172 | [[package]] 1173 | name = "winapi-i686-pc-windows-gnu" 1174 | version = "0.4.0" 1175 | source = "registry+https://github.com/rust-lang/crates.io-index" 1176 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 1177 | 1178 | [[package]] 1179 | name = "winapi-x86_64-pc-windows-gnu" 1180 | version = "0.4.0" 1181 | source = "registry+https://github.com/rust-lang/crates.io-index" 1182 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 1183 | 1184 | [[package]] 1185 | name = "windows-sys" 1186 | version = "0.36.1" 1187 | source = "registry+https://github.com/rust-lang/crates.io-index" 1188 | checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" 1189 | dependencies = [ 1190 | "windows_aarch64_msvc", 1191 | "windows_i686_gnu", 1192 | "windows_i686_msvc", 1193 | "windows_x86_64_gnu", 1194 | "windows_x86_64_msvc", 1195 | ] 1196 | 1197 | [[package]] 1198 | name = "windows_aarch64_msvc" 1199 | version = "0.36.1" 1200 | source = "registry+https://github.com/rust-lang/crates.io-index" 1201 | checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" 1202 | 1203 | [[package]] 1204 | name = "windows_i686_gnu" 1205 | version = "0.36.1" 1206 | source = "registry+https://github.com/rust-lang/crates.io-index" 1207 | checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" 1208 | 1209 | [[package]] 1210 | name = "windows_i686_msvc" 1211 | version = "0.36.1" 1212 | source = "registry+https://github.com/rust-lang/crates.io-index" 1213 | checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" 1214 | 1215 | [[package]] 1216 | name = "windows_x86_64_gnu" 1217 | version = "0.36.1" 1218 | source = "registry+https://github.com/rust-lang/crates.io-index" 1219 | checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" 1220 | 1221 | [[package]] 1222 | name = "windows_x86_64_msvc" 1223 | version = "0.36.1" 1224 | source = "registry+https://github.com/rust-lang/crates.io-index" 1225 | checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" 1226 | 1227 | [[package]] 1228 | name = "zstd" 1229 | version = "0.11.2+zstd.1.5.2" 1230 | source = "registry+https://github.com/rust-lang/crates.io-index" 1231 | checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" 1232 | dependencies = [ 1233 | "zstd-safe", 1234 | ] 1235 | 1236 | [[package]] 1237 | name = "zstd-safe" 1238 | version = "5.0.2+zstd.1.5.2" 1239 | source = "registry+https://github.com/rust-lang/crates.io-index" 1240 | checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" 1241 | dependencies = [ 1242 | "libc", 1243 | "zstd-sys", 1244 | ] 1245 | 1246 | [[package]] 1247 | name = "zstd-sys" 1248 | version = "2.0.1+zstd.1.5.2" 1249 | source = "registry+https://github.com/rust-lang/crates.io-index" 1250 | checksum = "9fd07cbbc53846d9145dbffdf6dd09a7a0aa52be46741825f5c97bdd4f73f12b" 1251 | dependencies = [ 1252 | "cc", 1253 | "libc", 1254 | ] 1255 | --------------------------------------------------------------------------------