├── 2022 ├── skattemelding.xml └── naeringsspesifikasjon.xml ├── 2023 ├── skattemelding.xml └── naeringsspesifikasjon.xml ├── 2024 ├── skattemelding.xml └── naeringsspesifikasjon.xml ├── .gitignore ├── templates ├── guest.html ├── altinn.html └── validation.html ├── src ├── file.rs ├── base64.rs ├── jwt.rs ├── http.rs ├── error.rs ├── xml.rs └── main.rs ├── Cargo.toml ├── LICENSE ├── README.md └── Cargo.lock /.gitignore: -------------------------------------------------------------------------------- 1 | /result 2 | /target 3 | *secret* 4 | -------------------------------------------------------------------------------- /templates/guest.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Skattemelding innlogging 4 | 5 | 6 | Logg inn 7 | 8 | 9 | -------------------------------------------------------------------------------- /templates/altinn.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Skattemelding levering 4 | 8 | 9 | 10 | 11 | 12 |

Du er logga inn i Altinn som {{pid}}.

13 | 14 | 15 | -------------------------------------------------------------------------------- /src/file.rs: -------------------------------------------------------------------------------- 1 | use std::fs; 2 | 3 | use anyhow::Result; 4 | 5 | pub fn read_skattemelding(year: i32) -> Result { 6 | read_file("skattemelding.xml", year) 7 | } 8 | 9 | pub fn read_naeringsspesifikasjon(year: i32) -> Result { 10 | read_file("naeringsspesifikasjon.xml", year) 11 | } 12 | 13 | fn read_file(name: &str, year: i32) -> Result { 14 | Ok(fs::read_to_string(format!("{}/{}", year, name))?) 15 | } 16 | -------------------------------------------------------------------------------- /src/base64.rs: -------------------------------------------------------------------------------- 1 | use anyhow::Result; 2 | use data_encoding::{Encoding, BASE64, BASE64_NOPAD}; 3 | 4 | use std::str; 5 | 6 | pub fn decode(s: &str) -> Result { 7 | decode_inner(&BASE64, s) 8 | } 9 | 10 | pub fn decode_nopad(s: &str) -> Result { 11 | decode_inner(&BASE64_NOPAD, s) 12 | } 13 | 14 | pub fn encode(s: &str) -> String { 15 | BASE64.encode(s.as_bytes()) 16 | } 17 | 18 | fn decode_inner(encoding: &Encoding, s: &str) -> Result { 19 | Ok(str::from_utf8(&encoding.decode(s.as_bytes())?)?.to_string()) 20 | } 21 | -------------------------------------------------------------------------------- /src/jwt.rs: -------------------------------------------------------------------------------- 1 | use anyhow::Result; 2 | use serde::Deserialize; 3 | 4 | use std::str; 5 | 6 | use crate::base64::decode_nopad; 7 | 8 | #[derive(Deserialize)] 9 | pub struct TokenResponse { 10 | pub access_token: String, 11 | pub id_token: String, 12 | } 13 | 14 | #[derive(Deserialize)] 15 | pub struct IdToken { 16 | pub pid: String, 17 | } 18 | 19 | impl IdToken { 20 | pub fn from_str(value: &str) -> Result { 21 | let claims: IdToken = 22 | serde_json::from_str(&decode_nopad(value.split('.').collect::>()[1])?)?; 23 | 24 | Ok(Self { pid: claims.pid }) 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "skattemelding" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | [dependencies] 7 | anyhow = "1.0.81" 8 | axum = { version = "0.7.4", features = ["macros"] } 9 | axum-server = { version = "0.6", features = ["tls-rustls"] } 10 | chrono = "0.4.35" 11 | data-encoding = "2.5.0" 12 | reqwest = { version = "0.11.26", features = ["json", "stream"] } 13 | serde = { version = "1.0.197", features = ["derive"] } 14 | serde_json = "1.0.114" 15 | tera = { version = "1.19.1", default-features = false } 16 | tokio = { version = "1.36.0", features = ["fs", "macros", "rt-multi-thread"] } 17 | tokio-util = "0.7.10" 18 | tower-sessions = "0.11.0" 19 | tracing = "0.1" 20 | tracing-subscriber = { version = "0.3", features = ["env-filter"] } 21 | xmltree = "0.10.3" 22 | -------------------------------------------------------------------------------- /templates/validation.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Skattemelding validering 4 | 8 | 9 | 10 | 11 | 12 |

Du er logga inn i ID-porten som {{pid}}.

13 |

Dokumentreferanse:

14 |
{{dok_ref}}
15 |

Partsnummer:

16 |
{{partsnummer}}
17 |

Valideringsresultat:

18 |
{{validation}}
19 | 20 | {% for dokument in dokumenter -%} 21 |

Dokument:

22 |
{{dokument}}
23 | {%- endfor %} 24 | 25 |

Fastsatt skattemelding hos Skatteetaten?

26 |
{{er_fastsatt}}
27 | 28 | Altinn 29 | 30 | 31 | -------------------------------------------------------------------------------- /src/http.rs: -------------------------------------------------------------------------------- 1 | use anyhow::Result; 2 | use reqwest::{Client, RequestBuilder}; 3 | 4 | pub async fn get_text(url: &str, token: &str) -> Result { 5 | Ok(get(url, Some(token)) 6 | .send() 7 | .await? 8 | .error_for_status()? 9 | .text() 10 | .await?) 11 | } 12 | 13 | pub fn delete(url: &str, token: Option<&str>) -> RequestBuilder { 14 | let request = Client::new().delete(url); 15 | maybe_with_token(request, token) 16 | } 17 | 18 | pub fn get(url: &str, token: Option<&str>) -> RequestBuilder { 19 | let request = Client::new().get(url); 20 | maybe_with_token(request, token) 21 | } 22 | 23 | pub fn post(url: &str, token: Option<&str>) -> RequestBuilder { 24 | let request = Client::new().post(url); 25 | maybe_with_token(request, token) 26 | } 27 | 28 | pub fn put(url: &str, token: Option<&str>) -> RequestBuilder { 29 | let request = Client::new().put(url); 30 | maybe_with_token(request, token) 31 | } 32 | 33 | fn maybe_with_token(request: RequestBuilder, token: Option<&str>) -> RequestBuilder { 34 | if let Some(token) = token { 35 | request.header("Authorization", format!("Bearer {token}")) 36 | } else { 37 | request 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/error.rs: -------------------------------------------------------------------------------- 1 | use axum::http::StatusCode; 2 | use axum::response::{Html, IntoResponse, Response}; 3 | use serde::Deserialize; 4 | 5 | #[derive(Deserialize)] 6 | pub struct ErrorResponse { 7 | pub error: String, 8 | pub error_description: String, 9 | } 10 | 11 | impl IntoResponse for AppError { 12 | fn into_response(self) -> Response { 13 | ( 14 | StatusCode::INTERNAL_SERVER_ERROR, 15 | Html(format!( 16 | r#" 17 | 18 | Skattemelding feil 19 | 23 | 24 | 25 | 26 | 27 |

Ein feil oppstod:

28 |
{}
29 | Tilbake til start 30 | 31 | 32 | "#, 33 | self.0, 34 | )), 35 | ) 36 | .into_response() 37 | } 38 | } 39 | 40 | pub struct AppError(anyhow::Error); 41 | 42 | impl From for AppError 43 | where 44 | E: Into, 45 | { 46 | fn from(err: E) -> Self { 47 | Self(err.into()) 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/xml.rs: -------------------------------------------------------------------------------- 1 | use std::{borrow::Cow, io::BufWriter}; 2 | 3 | use anyhow::{anyhow, Result}; 4 | use xmltree::{Element, EmitterConfig, XMLNode}; 5 | 6 | pub trait XmlElement { 7 | fn child(&self, name: &str) -> Result<&Element>; 8 | fn format(&self) -> Result; 9 | fn text(&self) -> Result>; 10 | } 11 | 12 | impl XmlElement for Element { 13 | fn child(&self, name: &str) -> Result<&Element> { 14 | tracing::debug!("Looking for {name} in: {self:?}"); 15 | 16 | self.get_child(name) 17 | .ok_or_else(|| anyhow!(format!("Did not find {name} in XML element"))) 18 | } 19 | 20 | fn format(&self) -> Result { 21 | let mut cfg = EmitterConfig::new(); 22 | cfg.perform_indent = true; 23 | 24 | let mut buf = BufWriter::new(Vec::new()); 25 | self.write_with_config(&mut buf, cfg)?; 26 | let bytes = buf.into_inner()?; 27 | Ok(String::from_utf8(bytes)?) 28 | } 29 | 30 | fn text(&self) -> Result> { 31 | self.get_text() 32 | .ok_or_else(|| anyhow!("Did not find text in XML element")) 33 | } 34 | } 35 | 36 | pub trait XmlNode { 37 | fn element(&self) -> Result<&Element>; 38 | } 39 | 40 | impl XmlNode for XMLNode { 41 | fn element(&self) -> Result<&Element> { 42 | self.as_element() 43 | .ok_or_else(|| anyhow!("The node is not an XML element")) 44 | } 45 | } 46 | 47 | pub fn to_xml(s: &str) -> Result { 48 | Ok(Element::parse(s.as_bytes())?) 49 | } 50 | -------------------------------------------------------------------------------- /2022/skattemelding.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 1442927932 4 | 2022 5 | 6 | 7 | 8 | 58096 9 | 10 | 11 | 12 | 13 | 58096 14 | 15 | 16 | 17 | 18 | 19 | 1 20 | 21 | formuesobjektIkkeOmfattetAvVerdsettingsrabatt 22 | 23 | 24 | 645826 25 | 26 | 27 | 28 | 29 | 300886 30 | 31 | 32 | 33 | 34 | 645826 35 | 36 | 37 | 38 | 39 | 300886 40 | 41 | 42 | 43 | 44 | false 45 | 46 | 47 | 48 | 49 | 344940 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /2023/skattemelding.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 1442927932 5 | 2023 6 | 7 | 8 | 9 | 383932 10 | 11 | 12 | 13 | 383932 14 | 15 | 16 | 17 | 383932 18 | 19 | 20 | 21 | false 22 | 23 | 24 | 25 | 26 | 1 27 | 28 | formuesobjektIkkeOmfattetAvVerdsettingsrabatt 29 | 30 | 31 | 1086498 32 | 33 | 34 | 35 | 36 | 742091 37 | 38 | 39 | 40 | 41 | 1086498 42 | 43 | 44 | 45 | 46 | 742091 47 | 48 | 49 | 50 | 51 | false 52 | 53 | 54 | 55 | 56 | 344407 57 | 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /2024/skattemelding.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 1442927932 5 | 2024 6 | 7 | 8 | 9 | 493407 10 | 11 | 12 | 13 | 493407 14 | 15 | 16 | 17 | 493407 18 | 19 | 20 | 21 | 22 | 0 23 | 24 | 25 | 26 | 27 | 28 | 1 29 | 30 | formuesobjektIkkeOmfattetAvVerdsettingsrabatt 31 | 32 | 33 | 1312556 34 | 35 | 36 | 37 | 38 | 983291 39 | 40 | 41 | 42 | 43 | 1312556 44 | 45 | 46 | 47 | 48 | 983291 49 | 50 | 51 | 52 | 53 | false 54 | 55 | 56 | 57 | 58 | 329265 59 | 60 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /2022/naeringsspesifikasjon.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 1442927932 4 | 2022 5 | 6 | 7 | 8 | 9 | 686480 10 | 11 | 12 | 13 | 14 | 3000 15 | 16 | 3000 17 | 18 | 19 | 20 | 686480 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 631998 30 | 31 | 32 | 33 | 34 | 6000 35 | 36 | 6000 37 | 38 | 39 | 40 | 631998 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 3614 49 | 50 | 51 | 52 | 53 | 0 54 | 55 | 56 | 57 | 58 | 12781 59 | 60 | 61 | 62 | 63 | 8050 64 | 65 | 8050 66 | 67 | 68 | 69 | 3614 70 | 71 | 72 | 73 | 74 | 75 | 76 | 8115 77 | 78 | 8115 79 | 80 | 81 | 82 | 0 83 | 84 | 85 | 86 | 87 | 88 | 89 | 8300 90 | 91 | 8300 92 | 93 | 94 | 95 | 12781 96 | 97 | 98 | 99 | 100 | 101 | 102 | 45315 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 645826 111 | 112 | 113 | 114 | 115 | 1900 116 | 117 | 118 | 645826 119 | 120 | 121 | 122 | 1900 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 300886 131 | 132 | 133 | 134 | 135 | 344940 136 | 137 | 138 | 139 | 140 | 2400 141 | 142 | 143 | 300886 144 | 145 | 146 | 147 | 2400 148 | 149 | 150 | 151 | 152 | 153 | 2050 154 | 155 | 156 | 344940 157 | 158 | 159 | 160 | 2050 161 | 162 | 163 | 164 | 165 | 166 | 167 | 645826 168 | 169 | 170 | 171 | 172 | 645826 173 | 174 | 175 | 176 | 177 | 178 | h1 179 | 180 | annenNaering 181 | 182 | 183 | IT-konsultasjon 184 | 185 | 186 | 187 | 58096 188 | 189 | 190 | 191 | 192 | 58096 193 | 194 | 195 | 196 | 100 197 | 198 | 199 | 200 | 58096 201 | 202 | 203 | 204 | 205 | 206 | 12781 207 | 208 | 209 | 210 | 211 | 58096 212 | 213 | 214 | 215 | 216 | 217 | 1 218 | 219 | positivSkattekostnad 220 | 221 | 222 | 223 | 12781 224 | 225 | 226 | 227 | 228 | 229 | 230 | fullRegnskapsplikt 231 | 232 | 233 | 2022-01-01T00:00:00.000Z 234 | 2022-12-31T23:59:59.000Z 235 | 236 | 237 | oevrigSelskap 238 | 239 | 240 | regnskapslovensAlminneligeRegler 241 | 242 | 243 | 244 | 245 | 246 | 269625 247 | 248 | 249 | 250 | 251 | 45315 252 | 253 | 254 | 255 | EK1 256 | 257 | aaretsOverskudd 258 | 259 | 260 | 261 | 45315 262 | 263 | 264 | 265 | 266 | 267 | 314940 268 | 269 | 270 | 271 | false 272 | -------------------------------------------------------------------------------- /2023/naeringsspesifikasjon.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 1442927932 5 | 2023 6 | 7 | 8 | 9 | 10 | 1476230 11 | 12 | 13 | 14 | 15 | 16 | 17 | 1476230 18 | 19 | 20 | 3000 21 | 22 | 3000 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 1104263 31 | 32 | 33 | 34 | 35 | 36 | 37 | 1104263 38 | 39 | 40 | 6000 41 | 42 | 6000 43 | 44 | 45 | 46 | 47 | 48 | 49 | 12123 50 | 51 | 52 | 53 | 54 | 158 55 | 56 | 57 | 58 | 59 | 84465 60 | 61 | 62 | 63 | 64 | 65 | 66 | 12123 67 | 68 | 69 | 8050 70 | 71 | 8050 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 158 80 | 81 | 82 | 8115 83 | 84 | 8115 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 84465 93 | 94 | 95 | 8300 96 | 97 | 8300 98 | 99 | 100 | 101 | 102 | 103 | 299467 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 1086498 112 | 113 | 114 | 115 | 116 | 1900 117 | 118 | 119 | 1086498 120 | 121 | 122 | 123 | 1900 124 | 125 | 126 | true 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 742091 135 | 136 | 137 | 138 | 139 | 344407 140 | 141 | 142 | 143 | 144 | 2400 145 | 146 | 147 | 742091 148 | 149 | 150 | 151 | 2400 152 | 153 | 154 | true 155 | 156 | 157 | 158 | 159 | 160 | 2050 161 | 162 | 163 | 344407 164 | 165 | 166 | 167 | 2050 168 | 169 | 170 | 171 | 172 | 173 | 174 | 1086498 175 | 176 | 177 | 178 | 179 | 1086498 180 | 181 | 182 | 183 | 184 | 185 | h1 186 | 187 | 5001 188 | 189 | 190 | 191 | 383932 192 | 193 | 194 | 195 | 196 | 383932 197 | 198 | 199 | 200 | 201 | 202 | 383932 203 | 204 | 205 | 206 | 207 | 208 | 1 209 | 210 | positivSkattekostnad 211 | 212 | 213 | 214 | 84465 215 | 216 | 217 | 218 | 219 | 220 | 84465 221 | 222 | 223 | 224 | 225 | 226 | fullRegnskapsplikt 227 | 228 | 229 | 2023-01-01T00:00:00.000Z 230 | 2023-12-31T23:59:59.000Z 231 | 232 | 233 | oevrigSelskap 234 | 235 | 236 | regnskapslovensAlminneligeRegler 237 | 238 | 239 | 240 | 241 | 242 | 314940 243 | 244 | 245 | 246 | 247 | 299467 248 | 249 | 250 | 251 | 252 | 300000 253 | 254 | 255 | 256 | EK1 257 | 258 | aaretsOverskudd 259 | 260 | 261 | 262 | 299467 263 | 264 | 265 | 266 | 267 | EK2 268 | 269 | avsattEllerForventetUtbytte 270 | 271 | 272 | 273 | 300000 274 | 275 | 276 | 277 | 278 | 279 | 314407 280 | 281 | 282 | 283 | false 284 | 285 | -------------------------------------------------------------------------------- /2024/naeringsspesifikasjon.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 1442927932 5 | 2024 6 | 7 | 8 | 9 | 10 | 1587535 11 | 12 | 13 | 14 | 15 | 16 | 17 | 1587535 18 | 19 | 20 | 3000 21 | 22 | 3000 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 1118032 31 | 32 | 33 | 34 | 35 | 36 | 37 | 1118032 38 | 39 | 40 | 6000 41 | 42 | 6000 43 | 44 | 45 | 46 | 47 | 48 | 49 | 25586 50 | 51 | 52 | 53 | 54 | 1682 55 | 56 | 57 | 58 | 59 | 108549 60 | 61 | 62 | 63 | 64 | 65 | 66 | 25586 67 | 68 | 69 | 8050 70 | 71 | 8050 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 1682 80 | 81 | 82 | 8115 83 | 84 | 8115 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 108549 93 | 94 | 95 | 8300 96 | 97 | 8300 98 | 99 | 100 | 101 | 102 | 103 | 384858 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 1312556 112 | 113 | 114 | 115 | 116 | 1900 117 | 118 | 119 | 1312556 120 | 121 | 122 | 123 | 1900 124 | 125 | 126 | true 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 983291 135 | 136 | 137 | 138 | 139 | 329265 140 | 141 | 142 | 143 | 144 | 2400 145 | 146 | 147 | 983291 148 | 149 | 150 | 151 | 2400 152 | 153 | 154 | true 155 | 156 | 157 | 158 | 159 | 160 | 2050 161 | 162 | 163 | 329265 164 | 165 | 166 | 167 | 2050 168 | 169 | 170 | 171 | 172 | 173 | 174 | 1312556 175 | 176 | 177 | 178 | 179 | 1312556 180 | 181 | 182 | 183 | 184 | 185 | h1 186 | 187 | 5001 188 | 189 | 190 | 191 | 493407 192 | 193 | 194 | 195 | 196 | 493407 197 | 198 | 199 | 200 | 201 | 202 | 493407 203 | 204 | 205 | 206 | 207 | 208 | 1 209 | 210 | positivSkattekostnad 211 | 212 | 213 | 214 | 108549 215 | 216 | 217 | 218 | 219 | 220 | 108549 221 | 222 | 223 | 224 | 225 | 226 | fullRegnskapsplikt 227 | 228 | 229 | 2024-01-01 230 | 2024-12-31 231 | 232 | 233 | oevrigSelskap 234 | 235 | 236 | regnskapslovensAlminneligeRegler 237 | 238 | 239 | 240 | 241 | 242 | 314407 243 | 244 | 245 | 246 | 247 | 384858 248 | 249 | 250 | 251 | 252 | 400000 253 | 254 | 255 | 256 | EK1 257 | 258 | aaretsOverskudd 259 | 260 | 261 | 262 | 384858 263 | 264 | 265 | 266 | 267 | EK2 268 | 269 | avsattEllerForventetUtbytte 270 | 271 | 272 | 273 | 400000 274 | 275 | 276 | 277 | 278 | 279 | 299265 280 | 281 | 282 | 283 | false 284 | 285 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Skattemelding 2 | 3 | ## Nødvendige tilgangar 4 | 5 | For å få tilgang til å kunne levere skattemelding må du sende epost til servicedesk@digdir.no og be om at ditt organisasjonsnummer blir registrert i Samarbeidsportalen. Når det er på plass må du sende epost til skattemelding-sbs-brukerstotte@skatteetaten.no og be om tilgang til scope for levering av skattemelding for det gitte organisasjonsnummeret. 6 | 7 | ## Lokal køyring 8 | 9 | Sett opp ein tunnel frå https://mac.tail31c54.ts.net til http://localhost:12345 slik: 10 | 11 | ```bash 12 | tailscale funnel 12345 13 | ``` 14 | 15 | ```bash 16 | RUST_LOG=info cargo watch -x run 17 | ``` 18 | 19 | ## Spesifikasjon av prosess 20 | 21 | Finn endpoints her: 22 | 23 | https://idporten.no/.well-known/openid-configuration 24 | 25 | Dokumentasjon her: 26 | 27 | https://skatteetaten.github.io/mva-meldingen/english/idportenauthentication/#example-of-integration 28 | 29 | OAuth2 klient må inn her: 30 | https://sjolvbetjening.samarbeid.digdir.no/integrations 31 | 32 | Det fungerer ikkje med redirect URL som inneheld "local" eller "127.0.0.1". Så applikasjonen må enten køyre på ein server eller få eit dynamisk DNS-navn. Sistnemnte kan ordnast med Tailscale slik: 33 | 34 | ```bash 35 | tailscale funnel 12345 36 | ``` 37 | 38 | Redirect URL må dessutan innehalde portnummeret, så det blir til dømes https://mac.tailnnn.ts.net:443/token. 39 | 40 | Klientkonfigurasjonen må også ha følgande: 41 | 42 | - Difi-tjeneste: API-klient 43 | - Scopes: openid og skatteetaten:formueinntekt/skattemelding 44 | - Klientautentiseringsmetode: client_secret_basic 45 | - Applikasjonstype: web 46 | - PKCE: S256 47 | 48 | OAuth2 authorize: 49 | 50 | https://login.idporten.no/authorize?scope=skatteetaten%3Aformueinntekt%2Fskattemelding%20openid&client_id=4060f6d4-28ab-410d-bf14-edd62aa88dcf&redirect_uri=https%3A%2F%2Fmac.tail31c54.ts.net%3A443%2Ftoken&response_type=code&state=SgNdr4kEG_EJOptKwlwg5Q&nonce=1678988024798240&code_challenge=aFA1OAxhLtolRAYbYn0xqFUXvGncijKuXYOSQnltsaY&code_challenge_method=S256&ui_locales=nb 51 | 52 | Retur: 53 | https://mac.tail31c54.ts.net:443/token?code=5GyjYSmPkZAINh81\_\_DSVwHBMTNTM8U8UeVkbCv-2j0&state=SgNdr4kEG_EJOptKwlwg5Q 54 | 55 | POST https://idporten.no/token 56 | 57 | Retur: 58 | { 59 | "access*token": "ey..OQ", 60 | "id_token": "ey..QA", 61 | "token_type": "Bearer", 62 | "expires_in": 119, 63 | "refresh_token": "L*..uo", 64 | "scope": "openid skatteetaten:formueinntekt/skattemelding" 65 | } 66 | 67 | Hent utkast: 68 | GET https://idporten.api.skatteetaten.no/api/skattemelding/v2/utkast/2022/999579922 69 | {'Authorization': 'Bearer ' + js['access_token']} 70 | 71 | Retur: 72 | 73 | 74 | 75 | SKI:755:338422757 76 | utf-8 77 | PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c2thdHRlbWVsZGluZyB4bWxucz0idXJuOm5vOnNrYXR0ZWV0YXRlbjpmYXN0c2V0dGluZzpmb3JtdWVpbm50ZWt0OnNrYXR0ZW1lbGRpbmc6dXBlcnNvbmxpZzpla3N0ZXJuOnYyIj48cGFydHNudW1tZXI+MTQ0MjkyNzkzMjwvcGFydHNudW1tZXI+PGlubnRla3RzYWFyPjIwMjI8L2lubnRla3RzYWFyPjwvc2thdHRlbWVsZGluZz4= 78 | skattemeldingUpersonligUtkast 79 | 80 | 81 | 82 | 83 | er dokumentidentifikator. 84 | 85 | Hent gjeldende: 86 | GET https://idporten.api.skatteetaten.no/api/skattemelding/v2/2022/999579922 87 | {'Authorization': 'Bearer ' + js['access_token']} 88 | 89 | Retur: 90 | 91 | 92 | 93 | SKI:755:338422757 94 | utf-8 95 | PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c2thdHRlbWVsZGluZyB4bWxucz0idXJuOm5vOnNrYXR0ZWV0YXRlbjpmYXN0c2V0dGluZzpmb3JtdWVpbm50ZWt0OnNrYXR0ZW1lbGRpbmc6dXBlcnNvbmxpZzpla3N0ZXJuOnYyIj48cGFydHNudW1tZXI+MTQ0MjkyNzkzMjwvcGFydHNudW1tZXI+PGlubnRla3RzYWFyPjIwMjI8L2lubnRla3RzYWFyPjwvc2thdHRlbWVsZGluZz4= 96 | skattemeldingUpersonligUtkast 97 | 98 | 99 | 100 | 101 | Hent fastsatt (etter levering og behandling): 102 | GET https://idporten.api.skatteetaten.no/api/skattemelding/v2/fastsatt/2022/999579922 103 | {'Authorization': 'Bearer ' + js['access_token']} 104 | 105 | Base64 decode : 106 | 107 | 14429279322022 108 | 109 | trengs seinare. 110 | 111 | Base64 encode skattemelding.xml og naeringsspesifikasjon.xml og lag melding som dette: 112 | 113 | naering_as = """ 114 | 115 | 116 | 117 | 118 | 119 | skattemeldingUpersonlig 120 | utf-8 121 | PD..4= 122 | 123 | 124 | naeringsspesifikasjon 125 | utf-8 126 | PD..4= 127 | 128 | 129 | 130 | skattemeldingUpersonlig 131 | SKI:755:338422757 132 | 133 | 2022 134 | 135 | komplett 136 | Tor Hovland 137 | 138 | 139 | """ 140 | 141 | Valider med meldinga over som XML body: 142 | POST https://idporten.api.skatteetaten.no/api/skattemelding/v2/valider/2022/999579922 143 | {'Authorization': 'Bearer ' + js['access_token']} 144 | header["Content-Type"] = "application/xml" 145 | 146 | Retur: 147 | 148 | 149 | 150 | skattemeldingUpersonligEtterBeregning 151 | utf-8 152 | PD..c+ 153 | 154 | 155 | naeringsspesifikasjonEtterBeregning 156 | utf-8 157 | PD..== 158 | 159 | 160 | beregnetSkattUpersonlig 161 | utf-8 162 | PD..== 163 | 164 | 165 | summertSkattegrunnlagForVisningUpersonlig 166 | utf-8 167 | PD..4= 168 | 169 | 170 | 171 | 172 | avvikSkattemelding 173 | global 174 | 344940 175 | 44054 176 | 300886 177 | verdsettingAvAksje/samletVerdiBakAksjeneISelskapet/beloep/beloepSomHeltall 178 | 179 | 180 | avvikNaeringsopplysninger 181 | global 182 | 314940 183 | 269625 184 | 45315 185 | egenkapitalavstemming/utgaaendeEgenkapital/beloep/beloep 186 | 187 | 188 | 189 | 190 | N*AVVIK*ÅRSRESULTAT_EGENKAPITALAVSTEMMING 191 | global 192 | Det er avvik mellom årsresultat og årets overskudd eller årets underskudd i egenkapitalavstemmingen. 193 | merknadStandard 194 | resultatregnskap/aarsresultat/beloep/beloep 195 | 196 | 197 | N_AVVIK_TILBAKEFØRT_SKATTEKOSTNAD 198 | global 199 | Det er avvik mellom sum skattekostnad i resultatregnskapet og tilbakeført skattekostnad i permanente forskjeller. 200 | merknadStandard 201 | resultatregnskap/sumSkattekostnad/beloep/beloep 202 | 203 | 204 | validertMedFeil 205 | avvikSkattemelding 206 | avvikNaeringsopplysninger 207 | 208 | true 209 | false 210 | false 211 | false 212 | false 213 | false 214 | 215 | 216 | 217 | I tilfelle valideringsfeil, sjekk om det er kome nye XSD-filer her: 218 | https://github.com/Skatteetaten/skattemeldingen/tree/master/src/resources/xsd 219 | 220 | Sjekk validering for eksempel her: 221 | https://www.freeformatter.com/xml-validator-xsd.html 222 | 223 | Hent Altinn-token 224 | GET https://platform.altinn.no/authentication/api/v1/exchange/id-porten 225 | {'Authorization': 'Bearer ' + js['access_token']} 226 | 227 | Retur: 228 | ey..EQ 229 | 230 | Lag skattemeldingsinstans med JSON som body: 231 | POST https://skd.apps.altinn.no/skd/formueinntekt-skattemelding-v2/instances/ 232 | altinn_header = {"Authorization": "Bearer " + r.text} 233 | {"instanceOwner": {"organisationNumber": '999579922'}, 234 | "appOwner": { 235 | "labels": ["gr", "x2"] 236 | }, "appId": "skd/formueinntekt-skattemelding-v2", "dueBefore": "2023-04-16", "visibleAfter": "2023-03-16", 237 | "title": {"nb": "Skattemelding"}, "dataValues": {"inntektsaar": "2022"}} 238 | 239 | Retur: 240 | { 241 | "id": "60271338/d1ba8c2b-f424-44a6-b888-8425c202b810", 242 | "instanceOwner": { 243 | "partyId": "60271338", 244 | "personNumber": null, 245 | "organisationNumber": "999579922", 246 | "username": null 247 | }, 248 | "appId": "skd/formueinntekt-skattemelding-v2", 249 | "org": "skd", 250 | "selfLinks": { 251 | "apps": "https://skd.apps.altinn.no/skd/formueinntekt-skattemelding-v2/instances/60271338/d1ba8c2b-f424-44a6-b888-8425c202b810", 252 | "platform": "https://platform.altinn.no/storage/api/v1/instances/60271338/d1ba8c2b-f424-44a6-b888-8425c202b810" 253 | }, 254 | "dueBefore": "2023-04-16T00:00:00Z", 255 | "visibleAfter": "2023-03-16T00:00:00Z", 256 | "process": { 257 | "started": "2023-03-16T19:46:01.8526919Z", 258 | "startEvent": "StartEvent_1", 259 | "currentTask": { 260 | "flow": 2, 261 | "started": "2023-03-16T19:46:01.9580344Z", 262 | "elementId": "Task_1", 263 | "name": "Utfylling", 264 | "altinnTaskType": "data", 265 | "ended": null, 266 | "validated": null, 267 | "flowType": "CompleteCurrentMoveToNext" 268 | }, 269 | "ended": null, 270 | "endEvent": null 271 | }, 272 | "status": { 273 | "isArchived": false, 274 | "archived": null, 275 | "isSoftDeleted": false, 276 | "softDeleted": null, 277 | "isHardDeleted": false, 278 | "hardDeleted": null, 279 | "readStatus": 1, 280 | "substatus": null 281 | }, 282 | "completeConfirmations": null, 283 | "data": [ 284 | { 285 | "id": "bd0d0fd7-73c9-46c5-a9fb-33dafe61f26f", 286 | "instanceGuid": "d1ba8c2b-f424-44a6-b888-8425c202b810", 287 | "dataType": "Skattemeldingsapp_v2", 288 | "filename": null, 289 | "contentType": "application/xml", 290 | "blobStoragePath": "skd/formueinntekt-skattemelding-v2/d1ba8c2b-f424-44a6-b888-8425c202b810/data/bd0d0fd7-73c9-46c5-a9fb-33dafe61f26f", 291 | "selfLinks": { 292 | "apps": "https://skd.apps.altinn.no/skd/formueinntekt-skattemelding-v2/instances/60271338/d1ba8c2b-f424-44a6-b888-8425c202b810/data/bd0d0fd7-73c9-46c5-a9fb-33dafe61f26f", 293 | "platform": "https://platform.altinn.no/storage/api/v1/instances/60271338/d1ba8c2b-f424-44a6-b888-8425c202b810/data/bd0d0fd7-73c9-46c5-a9fb-33dafe61f26f" 294 | }, 295 | "size": 246, 296 | "contentHash": null, 297 | "locked": false, 298 | "refs": [], 299 | "isRead": true, 300 | "tags": [], 301 | "deleteStatus": null, 302 | "fileScanResult": "Pending", 303 | "created": "2023-03-16T19:46:02.1542743Z", 304 | "createdBy": "481908", 305 | "lastChanged": "2023-03-16T19:46:02.1542743Z", 306 | "lastChangedBy": "481908" 307 | } 308 | ], 309 | "presentationTexts": { 310 | "inntektsaar": "2022" 311 | }, 312 | "dataValues": { 313 | "inntektsaar": "2022" 314 | }, 315 | "created": "2023-03-16T19:46:02.0092026Z", 316 | "createdBy": "481908", 317 | "lastChanged": "2023-03-16T19:46:02.0092026Z", 318 | "lastChangedBy": "481908" 319 | } 320 | 321 | Last opp skattemelding: 322 | POST https://skd.apps.altinn.no/skd/formueinntekt-skattemelding-v2/instances/60271338/d1ba8c2b-f424-44a6-b888-8425c202b810/data?dataType=skattemeldingOgNaeringsspesifikasjon 323 | altinn_header = {"Authorization": "Bearer " + r.text} 324 | "content-type" = "text/xml" 325 | "Content-Disposition" = "attachment; filename=skattemelding.xml" 326 | 327 | req_bekreftelse = endre_prosess_status(instans_data, altinn_header, "next", appnavn=altinn3_applikasjon) 328 | def endre_prosess_status(instans_data: dict, token: dict, neste_status: str, 329 | appnavn: str = "skd/formueinntekt-skattemelding-v2") -> str: 330 | if neste_status not in ["start", "next", "completeProcess"]: 331 | raise NotImplementedError 332 | 333 | url = f"{ALTINN_URL}/{appnavn}/instances/{instans_data['id']}/process/{neste_status}" 334 | r = requests.put(url, headers=token, verify=False) 335 | r.raise_for_status() 336 | return r.text 337 | 338 | Sett status klar til bekreftelse: 339 | PUT https://skd.apps.altinn.no/skd/formueinntekt-skattemelding-v2/instances/60271338/d1ba8c2b-f424-44a6-b888-8425c202b810/process/next 340 | altinn_header = {"Authorization": "Bearer " + r.text} 341 | 342 | ### Åpner skattemelding visningsklient for å se beregnet skattemelding med næringsspesifikasjon. 343 | 344 | from skatteetaten_api import skattemelding_visning 345 | 346 | url_skattemelding_visning = skattemelding_visning(instans_data, appnavn=altinn3_applikasjon) 347 | print(url_skattemelding_visning) 348 | 349 | ### Sett statusen klar til henting av skatteetaten. 350 | 351 | req_bekreftelse = endre_prosess_status(instans_data, altinn_header, "next", appnavn=altinn3_applikasjon) 352 | req_bekreftelse 353 | 354 | ### Se innsending i Altinn 355 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | use anyhow::{anyhow, Result}; 2 | use axum::{ 3 | debug_handler, 4 | extract::{Query, State}, 5 | response::{Html, Redirect}, 6 | routing::get, 7 | Router, 8 | }; 9 | use chrono::{Datelike, Utc}; 10 | use serde::{Deserialize, Serialize}; 11 | use std::{error::Error, fs, net::SocketAddr, str}; 12 | use tera::{Context, Tera}; 13 | use tower_sessions::{cookie::time::Duration, Expiry, MemoryStore, Session, SessionManagerLayer}; 14 | 15 | use crate::{ 16 | base64::{decode, encode}, 17 | error::{AppError, ErrorResponse}, 18 | file::{read_naeringsspesifikasjon, read_skattemelding}, 19 | http::post, 20 | jwt::{IdToken, TokenResponse}, 21 | xml::{to_xml, XmlElement, XmlNode}, 22 | }; 23 | 24 | mod base64; 25 | mod error; 26 | mod file; 27 | mod http; 28 | mod jwt; 29 | mod xml; 30 | 31 | const ACCESS_TOKEN: &str = "access_token"; 32 | const ID_TOKEN: &str = "id_token"; 33 | const KONVOLUTT: &str = "konvolutt"; 34 | 35 | #[derive(Clone)] 36 | pub struct Config { 37 | pub tera: Tera, 38 | pub client_id: String, 39 | pub client_secret: String, 40 | pub redirect_uri: String, 41 | pub pkce_code_challenge: String, 42 | pub pkce_verifier_secret: String, 43 | pub org_number: String, 44 | pub year: i32, 45 | } 46 | 47 | #[tokio::main] 48 | async fn main() -> Result<(), Box> { 49 | tracing_subscriber::fmt::init(); 50 | 51 | let tera = Tera::new("templates/**/*.html")?; 52 | 53 | const CLIENT_SECRET_FILE_NAME: &str = "client_secret.txt"; 54 | const PKCE_VERIFIER_SECRET_FILE_NAME: &str = "pkce_verifier_secret.txt"; 55 | 56 | tracing::info!("Reading secrets"); 57 | // TODO: Deduplicate reading of secrets 58 | let client_secret = fs::read_to_string(CLIENT_SECRET_FILE_NAME)? 59 | .trim() 60 | .to_string(); 61 | let pkce_verifier_secret = fs::read_to_string(PKCE_VERIFIER_SECRET_FILE_NAME)? 62 | .trim() 63 | .to_string(); 64 | 65 | let session_store = MemoryStore::default(); 66 | 67 | let session_layer = SessionManagerLayer::new(session_store) 68 | .with_secure(false) 69 | .with_expiry(Expiry::OnInactivity(Duration::seconds(600))); 70 | 71 | let config = Config { 72 | tera, 73 | client_id: "4060f6d4-28ab-410d-bf14-edd62aa88dcf".to_string(), 74 | client_secret, 75 | redirect_uri: "https://mac.tail31c54.ts.net:443/token".to_string(), 76 | pkce_code_challenge: "aFA1OAxhLtolRAYbYn0xqFUXvGncijKuXYOSQnltsaY".to_string(), 77 | pkce_verifier_secret, 78 | org_number: "999579922".to_string(), 79 | year: Utc::now().date_naive().year() - 1, 80 | }; 81 | 82 | let app = Router::new() 83 | .route("/", get(index)) 84 | .route("/logginn", get(logginn)) 85 | .route("/token", get(token)) 86 | .route("/altinn", get(altinn)) 87 | .layer(session_layer) 88 | .with_state(config); 89 | 90 | let addr = SocketAddr::from(([127, 0, 0, 1], 12345)); 91 | tracing::info!("listening on {}", addr); 92 | axum_server::Server::bind(addr) 93 | .serve(app.into_make_service()) 94 | .await?; 95 | 96 | Ok(()) 97 | } 98 | 99 | #[debug_handler] 100 | async fn index(State(config): State, session: Session) -> Result, AppError> { 101 | let access_token: Option = session.get(ACCESS_TOKEN).await?; 102 | let id_token: Option = session.get(ID_TOKEN).await?; 103 | 104 | match (access_token, id_token) { 105 | (Some(access_token), Some(id_token)) => { 106 | let pid = IdToken::from_str(&id_token)?.pid; 107 | 108 | let utkast = http::get_text( 109 | &format!( 110 | "https://idporten.api.skatteetaten.no/api/skattemelding/v2/utkast/{}/{}", 111 | config.year, config.org_number 112 | ), 113 | &access_token, 114 | ) 115 | .await?; 116 | 117 | tracing::info!("Utkast: {utkast}"); 118 | 119 | let gjeldende = http::get_text( 120 | &format!( 121 | "https://idporten.api.skatteetaten.no/api/skattemelding/v2/{}/{}", 122 | config.year, config.org_number 123 | ), 124 | &access_token, 125 | ) 126 | .await?; 127 | 128 | tracing::info!("Gjeldende: {gjeldende}"); 129 | 130 | let fastsatt = http::get_text( 131 | &format!( 132 | "https://idporten.api.skatteetaten.no/api/skattemelding/v2/fastsatt/{}/{}", 133 | config.year, config.org_number 134 | ), 135 | &access_token, 136 | ) 137 | .await; 138 | 139 | let er_fastsatt = if let Ok(fastsatt) = fastsatt { 140 | tracing::info!("Fastsatt: {fastsatt}"); 141 | true 142 | } else { 143 | tracing::info!("Ingen fastsetting per no."); 144 | false 145 | }; 146 | 147 | let gjeldende_xml = to_xml(&gjeldende)?; 148 | let skattemeldingdokument = gjeldende_xml 149 | .child("dokumenter")? 150 | .child("skattemeldingdokument")?; 151 | 152 | let dok_ref = skattemeldingdokument.child("id")?.text()?; 153 | let content_base64 = &skattemeldingdokument.child("content")?.text()?; 154 | let content = decode(content_base64)?; 155 | 156 | let content_xml = to_xml(&content)?; 157 | let partsnummer = content_xml.child("partsnummer")?.text()?; 158 | 159 | let skattemelding = read_skattemelding(config.year)?; 160 | let skattemelding_base64 = encode(&skattemelding); 161 | 162 | let naeringsspesifikasjon = read_naeringsspesifikasjon(config.year)?; 163 | let naeringsspesifikasjon_base64 = encode(&naeringsspesifikasjon); 164 | 165 | let konvolutt = format!( 166 | r#" 167 | 168 | 169 | 170 | skattemeldingUpersonlig 171 | utf-8 172 | {} 173 | 174 | 175 | naeringsspesifikasjon 176 | utf-8 177 | {} 178 | 179 | 180 | 181 | skattemeldingUpersonlig 182 | {} 183 | 184 | {} 185 | 186 | komplett 187 | Tor Hovland 188 | 189 | "#, 190 | skattemelding_base64, naeringsspesifikasjon_base64, dok_ref, config.year 191 | ); 192 | 193 | tracing::debug!("Konvolutt: {konvolutt}"); 194 | session.insert(KONVOLUTT, konvolutt.clone()).await?; 195 | 196 | let validation_response = post( 197 | &format!( 198 | "https://idporten.api.skatteetaten.no/api/skattemelding/v2/valider/{}/{}", 199 | config.year, config.org_number 200 | ), 201 | Some(&access_token), 202 | ) 203 | .header("Content-Type", "application/xml") 204 | .body(konvolutt) 205 | .send() 206 | .await? 207 | .error_for_status()? 208 | .text() 209 | .await?; 210 | 211 | tracing::info!("Validation response: {}", validation_response); 212 | 213 | let validation_xml = to_xml(&validation_response)?; 214 | let validation = validation_xml.format()?; 215 | 216 | let dokumenter = validation_xml.child("dokumenter"); 217 | 218 | let dokumenter = if let Ok(dokumenter) = dokumenter { 219 | dokumenter 220 | .children 221 | .iter() 222 | .map(|d| { 223 | let encoded = d.element()?.child("content")?.text()?; 224 | let decoded = decode(&encoded)?; 225 | let xml = to_xml(&decoded)?; 226 | xml.format() 227 | }) 228 | .collect::>>()? 229 | } else { 230 | vec![] 231 | }; 232 | 233 | Ok(Html(config.tera.render( 234 | "validation.html", 235 | &Context::from_serialize(Validation { 236 | pid, 237 | dok_ref: &dok_ref, 238 | partsnummer: &partsnummer, 239 | validation: &validation, 240 | dokumenter, 241 | er_fastsatt, 242 | })?, 243 | )?)) 244 | } 245 | _ => Ok(Html(config.tera.render("guest.html", &Context::new())?)), 246 | } 247 | } 248 | 249 | async fn logginn(State(config): State) -> Redirect { 250 | // TODO: Look authorize URL up in https://idporten.no/.well-known/openid-configuration 251 | let uri = format!("https://login.idporten.no/authorize?scope=skatteetaten%3Aformueinntekt%2Fskattemelding%20openid&client_id={}&redirect_uri={}&response_type=code&state=SgNdr4kEG_EJOptKwlwg5Q&nonce=1678988024798240&code_challenge={}&code_challenge_method=S256&ui_locales=nb", 252 | config.client_id, 253 | // TODO: Use config.redirect_uri, and URL encode it 254 | "https%3A%2F%2Fmac.tail31c54.ts.net%3A443%2Ftoken", 255 | config.pkce_code_challenge); 256 | 257 | Redirect::permanent(&uri) 258 | } 259 | 260 | /// Using client defined at 261 | /// https://selvbetjening-samarbeid-prod.difi.no/integrations 262 | async fn token( 263 | State(config): State, 264 | session: Session, 265 | Query(query_params): Query, 266 | ) -> Result { 267 | let form_params = [ 268 | ("grant_type", "authorization_code".to_string()), 269 | ("client_id", config.client_id.clone()), 270 | ("client_secret", config.client_secret.clone()), 271 | ("code_verifier", config.pkce_verifier_secret.clone()), 272 | ("code", query_params.code), 273 | ("redirect_uri", config.redirect_uri.clone()), 274 | ]; 275 | 276 | tracing::info!("Token request params: {:#?}", form_params); 277 | tracing::info!( 278 | "Basic auth: {}:{}", 279 | config.client_id.clone(), 280 | config.client_secret.clone() 281 | ); 282 | 283 | let response = post("https://idporten.no/token", None) 284 | .basic_auth(config.client_id.clone(), Some(config.client_secret.clone())) 285 | .form(&form_params) 286 | .send() 287 | .await?; 288 | 289 | let response_status = response.status(); 290 | let response_body = response.text().await?.clone(); 291 | 292 | match response_status { 293 | reqwest::StatusCode::OK => { 294 | tracing::info!("Token response: {}", &response_body); 295 | 296 | let token_response: Result = serde_json::from_str(&response_body); 297 | 298 | match token_response { 299 | Ok(token_response) => { 300 | tracing::info!("Access token: {}", token_response.access_token); 301 | tracing::info!("Id token: {}", token_response.id_token); 302 | 303 | session 304 | .insert(ACCESS_TOKEN, token_response.access_token) 305 | .await?; 306 | session.insert(ID_TOKEN, token_response.id_token).await?; 307 | 308 | Ok(Redirect::permanent("/")) 309 | } 310 | Err(_) => { 311 | let error_response: Result = 312 | serde_json::from_str(&response_body); 313 | 314 | match error_response { 315 | Ok(error_response) => Err((anyhow!( 316 | "{}: {}", 317 | error_response.error, 318 | error_response.error_description 319 | )) 320 | .into()), 321 | _ => Err(anyhow!("Could not understand token response").into()), 322 | } 323 | } 324 | } 325 | } 326 | _ => { 327 | tracing::error!("Token error response: {}", &response_body); 328 | 329 | Err((anyhow!( 330 | "HTTP {} from token endpoint:\n{}", 331 | &response_status, 332 | &response_body, 333 | )) 334 | .into()) 335 | } 336 | } 337 | } 338 | 339 | async fn altinn(State(config): State, session: Session) -> Result { 340 | let access_token: Option = session.get(ACCESS_TOKEN).await?; 341 | let konvolutt: Option = session.get(KONVOLUTT).await?; 342 | 343 | tracing::info!("Access token: {access_token:?}"); 344 | 345 | match (access_token, konvolutt) { 346 | (Some(access_token), Some(konvolutt)) => { 347 | let altinn_token = http::get( 348 | "https://platform.altinn.no/authentication/api/v1/exchange/id-porten", 349 | Some(&access_token), 350 | ) 351 | .send() 352 | .await? 353 | .error_for_status()? 354 | .text() 355 | .await?; 356 | 357 | tracing::info!("Altinn token: {altinn_token}"); 358 | 359 | let instances_response = http::get("https://skd.apps.altinn.no/skd/formueinntekt-skattemelding-v2/instances/60271338/active", Some(&altinn_token)) 360 | .send() 361 | .await? 362 | .error_for_status()? 363 | .text() 364 | .await?; 365 | 366 | tracing::info!("Altinn instances: {instances_response}"); 367 | 368 | let instances: Vec = serde_json::from_str(&instances_response)?; 369 | 370 | for instance in instances { 371 | http::delete(&format!("https://skd.apps.altinn.no/skd/formueinntekt-skattemelding-v2/instances/{}", instance.id), Some(&altinn_token)) 372 | .send() 373 | .await? 374 | .error_for_status()?; 375 | } 376 | 377 | let body = format!("{{\"instanceOwner\": {{\"organisationNumber\": '{}'}}, 378 | \"appOwner\": {{ 379 | \"labels\": [\"gr\", \"x2\"] 380 | }}, \"appId\": \"skd/formueinntekt-skattemelding-v2\", \"dueBefore\": \"{}-12-31\", \"visibleAfter\": \"{}-01-01\", 381 | \"title\": {{\"nb\": \"Skattemelding\"}}, \"dataValues\": {{\"inntektsaar\": \"{}\"}}}}", config.org_number, config.year + 1, config.year + 1, config.year); 382 | 383 | tracing::info!("Posting new instance: {}", body); 384 | 385 | let instance_response = http::post( 386 | "https://skd.apps.altinn.no/skd/formueinntekt-skattemelding-v2/instances", 387 | Some(&altinn_token), 388 | ) 389 | .header("Content-Type", "application/json") 390 | .body(body) 391 | .send() 392 | .await? 393 | .error_for_status()? 394 | .text() 395 | .await?; 396 | 397 | tracing::info!("Instance response: {}", instance_response); 398 | 399 | let instance: AltinnInstance = serde_json::from_str(&instance_response)?; 400 | 401 | let upload_response = http::post(&(format!("https://skd.apps.altinn.no/skd/formueinntekt-skattemelding-v2/instances/{}/data?dataType=skattemeldingOgNaeringsspesifikasjon", instance.id)), Some(&altinn_token)) 402 | .header("Content-Type", "text/xml") 403 | .header( 404 | "Content-Disposition", 405 | "attachment; filename=skattemelding.xml", 406 | ) 407 | .body(konvolutt) 408 | .send() 409 | .await? 410 | .error_for_status()? 411 | .text() 412 | .await?; 413 | 414 | tracing::info!("Upload response: {}", upload_response); 415 | 416 | let endre_prosess_response = http::put(&(format!("https://skd.apps.altinn.no/skd/formueinntekt-skattemelding-v2/instances/{}/process/next", instance.id)), Some(&altinn_token)) 417 | .send() 418 | .await? 419 | .error_for_status()? 420 | .text() 421 | .await?; 422 | 423 | tracing::info!("Endre prosess response: {}", endre_prosess_response); 424 | 425 | let url = format!("https://skatt.skatteetaten.no/web/skattemelding-visning/altinn?appId=skd/formueinntekt-skattemelding-v2&instansId={}", instance.id); 426 | tracing::info!("Går til visning på {url}"); 427 | 428 | Ok(Redirect::permanent(&url)) 429 | } 430 | _ => { 431 | tracing::warn!("Fant ingen access token"); 432 | Ok(Redirect::permanent("/")) 433 | } 434 | } 435 | } 436 | 437 | #[derive(Debug, Deserialize)] 438 | struct QueryParams { 439 | code: String, 440 | } 441 | 442 | #[derive(Serialize)] 443 | struct Validation<'a> { 444 | pid: String, 445 | dok_ref: &'a str, 446 | partsnummer: &'a str, 447 | validation: &'a str, 448 | dokumenter: Vec, 449 | er_fastsatt: bool, 450 | } 451 | 452 | #[derive(Deserialize)] 453 | struct AltinnInstance { 454 | id: String, 455 | } 456 | -------------------------------------------------------------------------------- /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 = "addr2line" 7 | version = "0.24.2" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" 10 | dependencies = [ 11 | "gimli", 12 | ] 13 | 14 | [[package]] 15 | name = "adler2" 16 | version = "2.0.0" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" 19 | 20 | [[package]] 21 | name = "aho-corasick" 22 | version = "1.1.3" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 25 | dependencies = [ 26 | "memchr", 27 | ] 28 | 29 | [[package]] 30 | name = "android-tzdata" 31 | version = "0.1.1" 32 | source = "registry+https://github.com/rust-lang/crates.io-index" 33 | checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" 34 | 35 | [[package]] 36 | name = "android_system_properties" 37 | version = "0.1.5" 38 | source = "registry+https://github.com/rust-lang/crates.io-index" 39 | checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 40 | dependencies = [ 41 | "libc", 42 | ] 43 | 44 | [[package]] 45 | name = "anyhow" 46 | version = "1.0.95" 47 | source = "registry+https://github.com/rust-lang/crates.io-index" 48 | checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" 49 | 50 | [[package]] 51 | name = "arc-swap" 52 | version = "1.7.1" 53 | source = "registry+https://github.com/rust-lang/crates.io-index" 54 | checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" 55 | 56 | [[package]] 57 | name = "async-trait" 58 | version = "0.1.86" 59 | source = "registry+https://github.com/rust-lang/crates.io-index" 60 | checksum = "644dd749086bf3771a2fbc5f256fdb982d53f011c7d5d560304eafeecebce79d" 61 | dependencies = [ 62 | "proc-macro2", 63 | "quote", 64 | "syn", 65 | ] 66 | 67 | [[package]] 68 | name = "atomic-waker" 69 | version = "1.1.2" 70 | source = "registry+https://github.com/rust-lang/crates.io-index" 71 | checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" 72 | 73 | [[package]] 74 | name = "autocfg" 75 | version = "1.4.0" 76 | source = "registry+https://github.com/rust-lang/crates.io-index" 77 | checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" 78 | 79 | [[package]] 80 | name = "axum" 81 | version = "0.7.9" 82 | source = "registry+https://github.com/rust-lang/crates.io-index" 83 | checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" 84 | dependencies = [ 85 | "async-trait", 86 | "axum-core", 87 | "axum-macros", 88 | "bytes", 89 | "futures-util", 90 | "http 1.2.0", 91 | "http-body 1.0.1", 92 | "http-body-util", 93 | "hyper 1.6.0", 94 | "hyper-util", 95 | "itoa", 96 | "matchit", 97 | "memchr", 98 | "mime", 99 | "percent-encoding", 100 | "pin-project-lite", 101 | "rustversion", 102 | "serde", 103 | "serde_json", 104 | "serde_path_to_error", 105 | "serde_urlencoded", 106 | "sync_wrapper 1.0.2", 107 | "tokio", 108 | "tower 0.5.2", 109 | "tower-layer", 110 | "tower-service", 111 | "tracing", 112 | ] 113 | 114 | [[package]] 115 | name = "axum-core" 116 | version = "0.4.5" 117 | source = "registry+https://github.com/rust-lang/crates.io-index" 118 | checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" 119 | dependencies = [ 120 | "async-trait", 121 | "bytes", 122 | "futures-util", 123 | "http 1.2.0", 124 | "http-body 1.0.1", 125 | "http-body-util", 126 | "mime", 127 | "pin-project-lite", 128 | "rustversion", 129 | "sync_wrapper 1.0.2", 130 | "tower-layer", 131 | "tower-service", 132 | "tracing", 133 | ] 134 | 135 | [[package]] 136 | name = "axum-macros" 137 | version = "0.4.2" 138 | source = "registry+https://github.com/rust-lang/crates.io-index" 139 | checksum = "57d123550fa8d071b7255cb0cc04dc302baa6c8c4a79f55701552684d8399bce" 140 | dependencies = [ 141 | "proc-macro2", 142 | "quote", 143 | "syn", 144 | ] 145 | 146 | [[package]] 147 | name = "axum-server" 148 | version = "0.6.0" 149 | source = "registry+https://github.com/rust-lang/crates.io-index" 150 | checksum = "c1ad46c3ec4e12f4a4b6835e173ba21c25e484c9d02b49770bf006ce5367c036" 151 | dependencies = [ 152 | "arc-swap", 153 | "bytes", 154 | "futures-util", 155 | "http 1.2.0", 156 | "http-body 1.0.1", 157 | "http-body-util", 158 | "hyper 1.6.0", 159 | "hyper-util", 160 | "pin-project-lite", 161 | "rustls", 162 | "rustls-pemfile 2.2.0", 163 | "tokio", 164 | "tokio-rustls", 165 | "tower 0.4.13", 166 | "tower-service", 167 | ] 168 | 169 | [[package]] 170 | name = "backtrace" 171 | version = "0.3.74" 172 | source = "registry+https://github.com/rust-lang/crates.io-index" 173 | checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" 174 | dependencies = [ 175 | "addr2line", 176 | "cfg-if", 177 | "libc", 178 | "miniz_oxide", 179 | "object", 180 | "rustc-demangle", 181 | "windows-targets 0.52.6", 182 | ] 183 | 184 | [[package]] 185 | name = "base64" 186 | version = "0.21.7" 187 | source = "registry+https://github.com/rust-lang/crates.io-index" 188 | checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" 189 | 190 | [[package]] 191 | name = "base64" 192 | version = "0.22.1" 193 | source = "registry+https://github.com/rust-lang/crates.io-index" 194 | checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 195 | 196 | [[package]] 197 | name = "bitflags" 198 | version = "1.3.2" 199 | source = "registry+https://github.com/rust-lang/crates.io-index" 200 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 201 | 202 | [[package]] 203 | name = "bitflags" 204 | version = "2.8.0" 205 | source = "registry+https://github.com/rust-lang/crates.io-index" 206 | checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" 207 | 208 | [[package]] 209 | name = "block-buffer" 210 | version = "0.10.4" 211 | source = "registry+https://github.com/rust-lang/crates.io-index" 212 | checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 213 | dependencies = [ 214 | "generic-array", 215 | ] 216 | 217 | [[package]] 218 | name = "bstr" 219 | version = "1.11.3" 220 | source = "registry+https://github.com/rust-lang/crates.io-index" 221 | checksum = "531a9155a481e2ee699d4f98f43c0ca4ff8ee1bfd55c31e9e98fb29d2b176fe0" 222 | dependencies = [ 223 | "memchr", 224 | "serde", 225 | ] 226 | 227 | [[package]] 228 | name = "bumpalo" 229 | version = "3.17.0" 230 | source = "registry+https://github.com/rust-lang/crates.io-index" 231 | checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" 232 | 233 | [[package]] 234 | name = "byteorder" 235 | version = "1.5.0" 236 | source = "registry+https://github.com/rust-lang/crates.io-index" 237 | checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 238 | 239 | [[package]] 240 | name = "bytes" 241 | version = "1.10.0" 242 | source = "registry+https://github.com/rust-lang/crates.io-index" 243 | checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" 244 | 245 | [[package]] 246 | name = "cc" 247 | version = "1.2.12" 248 | source = "registry+https://github.com/rust-lang/crates.io-index" 249 | checksum = "755717a7de9ec452bf7f3f1a3099085deabd7f2962b861dae91ecd7a365903d2" 250 | dependencies = [ 251 | "shlex", 252 | ] 253 | 254 | [[package]] 255 | name = "cfg-if" 256 | version = "1.0.0" 257 | source = "registry+https://github.com/rust-lang/crates.io-index" 258 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 259 | 260 | [[package]] 261 | name = "chrono" 262 | version = "0.4.39" 263 | source = "registry+https://github.com/rust-lang/crates.io-index" 264 | checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" 265 | dependencies = [ 266 | "android-tzdata", 267 | "iana-time-zone", 268 | "js-sys", 269 | "num-traits", 270 | "wasm-bindgen", 271 | "windows-targets 0.52.6", 272 | ] 273 | 274 | [[package]] 275 | name = "cookie" 276 | version = "0.18.1" 277 | source = "registry+https://github.com/rust-lang/crates.io-index" 278 | checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" 279 | dependencies = [ 280 | "percent-encoding", 281 | "time", 282 | "version_check", 283 | ] 284 | 285 | [[package]] 286 | name = "core-foundation" 287 | version = "0.9.4" 288 | source = "registry+https://github.com/rust-lang/crates.io-index" 289 | checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" 290 | dependencies = [ 291 | "core-foundation-sys", 292 | "libc", 293 | ] 294 | 295 | [[package]] 296 | name = "core-foundation-sys" 297 | version = "0.8.7" 298 | source = "registry+https://github.com/rust-lang/crates.io-index" 299 | checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 300 | 301 | [[package]] 302 | name = "cpufeatures" 303 | version = "0.2.17" 304 | source = "registry+https://github.com/rust-lang/crates.io-index" 305 | checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" 306 | dependencies = [ 307 | "libc", 308 | ] 309 | 310 | [[package]] 311 | name = "crossbeam-deque" 312 | version = "0.8.6" 313 | source = "registry+https://github.com/rust-lang/crates.io-index" 314 | checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" 315 | dependencies = [ 316 | "crossbeam-epoch", 317 | "crossbeam-utils", 318 | ] 319 | 320 | [[package]] 321 | name = "crossbeam-epoch" 322 | version = "0.9.18" 323 | source = "registry+https://github.com/rust-lang/crates.io-index" 324 | checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" 325 | dependencies = [ 326 | "crossbeam-utils", 327 | ] 328 | 329 | [[package]] 330 | name = "crossbeam-utils" 331 | version = "0.8.21" 332 | source = "registry+https://github.com/rust-lang/crates.io-index" 333 | checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" 334 | 335 | [[package]] 336 | name = "crypto-common" 337 | version = "0.1.6" 338 | source = "registry+https://github.com/rust-lang/crates.io-index" 339 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 340 | dependencies = [ 341 | "generic-array", 342 | "typenum", 343 | ] 344 | 345 | [[package]] 346 | name = "data-encoding" 347 | version = "2.7.0" 348 | source = "registry+https://github.com/rust-lang/crates.io-index" 349 | checksum = "0e60eed09d8c01d3cee5b7d30acb059b76614c918fa0f992e0dd6eeb10daad6f" 350 | 351 | [[package]] 352 | name = "deranged" 353 | version = "0.3.11" 354 | source = "registry+https://github.com/rust-lang/crates.io-index" 355 | checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" 356 | dependencies = [ 357 | "powerfmt", 358 | "serde", 359 | ] 360 | 361 | [[package]] 362 | name = "digest" 363 | version = "0.10.7" 364 | source = "registry+https://github.com/rust-lang/crates.io-index" 365 | checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 366 | dependencies = [ 367 | "block-buffer", 368 | "crypto-common", 369 | ] 370 | 371 | [[package]] 372 | name = "displaydoc" 373 | version = "0.2.5" 374 | source = "registry+https://github.com/rust-lang/crates.io-index" 375 | checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" 376 | dependencies = [ 377 | "proc-macro2", 378 | "quote", 379 | "syn", 380 | ] 381 | 382 | [[package]] 383 | name = "encoding_rs" 384 | version = "0.8.35" 385 | source = "registry+https://github.com/rust-lang/crates.io-index" 386 | checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" 387 | dependencies = [ 388 | "cfg-if", 389 | ] 390 | 391 | [[package]] 392 | name = "equivalent" 393 | version = "1.0.1" 394 | source = "registry+https://github.com/rust-lang/crates.io-index" 395 | checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" 396 | 397 | [[package]] 398 | name = "errno" 399 | version = "0.3.10" 400 | source = "registry+https://github.com/rust-lang/crates.io-index" 401 | checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" 402 | dependencies = [ 403 | "libc", 404 | "windows-sys 0.59.0", 405 | ] 406 | 407 | [[package]] 408 | name = "fastrand" 409 | version = "2.3.0" 410 | source = "registry+https://github.com/rust-lang/crates.io-index" 411 | checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 412 | 413 | [[package]] 414 | name = "fnv" 415 | version = "1.0.7" 416 | source = "registry+https://github.com/rust-lang/crates.io-index" 417 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 418 | 419 | [[package]] 420 | name = "foreign-types" 421 | version = "0.3.2" 422 | source = "registry+https://github.com/rust-lang/crates.io-index" 423 | checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 424 | dependencies = [ 425 | "foreign-types-shared", 426 | ] 427 | 428 | [[package]] 429 | name = "foreign-types-shared" 430 | version = "0.1.1" 431 | source = "registry+https://github.com/rust-lang/crates.io-index" 432 | checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 433 | 434 | [[package]] 435 | name = "form_urlencoded" 436 | version = "1.2.1" 437 | source = "registry+https://github.com/rust-lang/crates.io-index" 438 | checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 439 | dependencies = [ 440 | "percent-encoding", 441 | ] 442 | 443 | [[package]] 444 | name = "futures" 445 | version = "0.3.31" 446 | source = "registry+https://github.com/rust-lang/crates.io-index" 447 | checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" 448 | dependencies = [ 449 | "futures-channel", 450 | "futures-core", 451 | "futures-io", 452 | "futures-sink", 453 | "futures-task", 454 | "futures-util", 455 | ] 456 | 457 | [[package]] 458 | name = "futures-channel" 459 | version = "0.3.31" 460 | source = "registry+https://github.com/rust-lang/crates.io-index" 461 | checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 462 | dependencies = [ 463 | "futures-core", 464 | "futures-sink", 465 | ] 466 | 467 | [[package]] 468 | name = "futures-core" 469 | version = "0.3.31" 470 | source = "registry+https://github.com/rust-lang/crates.io-index" 471 | checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 472 | 473 | [[package]] 474 | name = "futures-io" 475 | version = "0.3.31" 476 | source = "registry+https://github.com/rust-lang/crates.io-index" 477 | checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" 478 | 479 | [[package]] 480 | name = "futures-macro" 481 | version = "0.3.31" 482 | source = "registry+https://github.com/rust-lang/crates.io-index" 483 | checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" 484 | dependencies = [ 485 | "proc-macro2", 486 | "quote", 487 | "syn", 488 | ] 489 | 490 | [[package]] 491 | name = "futures-sink" 492 | version = "0.3.31" 493 | source = "registry+https://github.com/rust-lang/crates.io-index" 494 | checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" 495 | 496 | [[package]] 497 | name = "futures-task" 498 | version = "0.3.31" 499 | source = "registry+https://github.com/rust-lang/crates.io-index" 500 | checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" 501 | 502 | [[package]] 503 | name = "futures-util" 504 | version = "0.3.31" 505 | source = "registry+https://github.com/rust-lang/crates.io-index" 506 | checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 507 | dependencies = [ 508 | "futures-core", 509 | "futures-io", 510 | "futures-macro", 511 | "futures-sink", 512 | "futures-task", 513 | "memchr", 514 | "pin-project-lite", 515 | "pin-utils", 516 | "slab", 517 | ] 518 | 519 | [[package]] 520 | name = "generic-array" 521 | version = "0.14.7" 522 | source = "registry+https://github.com/rust-lang/crates.io-index" 523 | checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 524 | dependencies = [ 525 | "typenum", 526 | "version_check", 527 | ] 528 | 529 | [[package]] 530 | name = "getrandom" 531 | version = "0.2.15" 532 | source = "registry+https://github.com/rust-lang/crates.io-index" 533 | checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" 534 | dependencies = [ 535 | "cfg-if", 536 | "libc", 537 | "wasi 0.11.0+wasi-snapshot-preview1", 538 | ] 539 | 540 | [[package]] 541 | name = "getrandom" 542 | version = "0.3.1" 543 | source = "registry+https://github.com/rust-lang/crates.io-index" 544 | checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" 545 | dependencies = [ 546 | "cfg-if", 547 | "libc", 548 | "wasi 0.13.3+wasi-0.2.2", 549 | "windows-targets 0.52.6", 550 | ] 551 | 552 | [[package]] 553 | name = "gimli" 554 | version = "0.31.1" 555 | source = "registry+https://github.com/rust-lang/crates.io-index" 556 | checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" 557 | 558 | [[package]] 559 | name = "globset" 560 | version = "0.4.15" 561 | source = "registry+https://github.com/rust-lang/crates.io-index" 562 | checksum = "15f1ce686646e7f1e19bf7d5533fe443a45dbfb990e00629110797578b42fb19" 563 | dependencies = [ 564 | "aho-corasick", 565 | "bstr", 566 | "log", 567 | "regex-automata 0.4.9", 568 | "regex-syntax 0.8.5", 569 | ] 570 | 571 | [[package]] 572 | name = "globwalk" 573 | version = "0.9.1" 574 | source = "registry+https://github.com/rust-lang/crates.io-index" 575 | checksum = "0bf760ebf69878d9fd8f110c89703d90ce35095324d1f1edcb595c63945ee757" 576 | dependencies = [ 577 | "bitflags 2.8.0", 578 | "ignore", 579 | "walkdir", 580 | ] 581 | 582 | [[package]] 583 | name = "h2" 584 | version = "0.3.26" 585 | source = "registry+https://github.com/rust-lang/crates.io-index" 586 | checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" 587 | dependencies = [ 588 | "bytes", 589 | "fnv", 590 | "futures-core", 591 | "futures-sink", 592 | "futures-util", 593 | "http 0.2.12", 594 | "indexmap", 595 | "slab", 596 | "tokio", 597 | "tokio-util", 598 | "tracing", 599 | ] 600 | 601 | [[package]] 602 | name = "h2" 603 | version = "0.4.7" 604 | source = "registry+https://github.com/rust-lang/crates.io-index" 605 | checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e" 606 | dependencies = [ 607 | "atomic-waker", 608 | "bytes", 609 | "fnv", 610 | "futures-core", 611 | "futures-sink", 612 | "http 1.2.0", 613 | "indexmap", 614 | "slab", 615 | "tokio", 616 | "tokio-util", 617 | "tracing", 618 | ] 619 | 620 | [[package]] 621 | name = "hashbrown" 622 | version = "0.15.2" 623 | source = "registry+https://github.com/rust-lang/crates.io-index" 624 | checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" 625 | 626 | [[package]] 627 | name = "http" 628 | version = "0.2.12" 629 | source = "registry+https://github.com/rust-lang/crates.io-index" 630 | checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" 631 | dependencies = [ 632 | "bytes", 633 | "fnv", 634 | "itoa", 635 | ] 636 | 637 | [[package]] 638 | name = "http" 639 | version = "1.2.0" 640 | source = "registry+https://github.com/rust-lang/crates.io-index" 641 | checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" 642 | dependencies = [ 643 | "bytes", 644 | "fnv", 645 | "itoa", 646 | ] 647 | 648 | [[package]] 649 | name = "http-body" 650 | version = "0.4.6" 651 | source = "registry+https://github.com/rust-lang/crates.io-index" 652 | checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" 653 | dependencies = [ 654 | "bytes", 655 | "http 0.2.12", 656 | "pin-project-lite", 657 | ] 658 | 659 | [[package]] 660 | name = "http-body" 661 | version = "1.0.1" 662 | source = "registry+https://github.com/rust-lang/crates.io-index" 663 | checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" 664 | dependencies = [ 665 | "bytes", 666 | "http 1.2.0", 667 | ] 668 | 669 | [[package]] 670 | name = "http-body-util" 671 | version = "0.1.2" 672 | source = "registry+https://github.com/rust-lang/crates.io-index" 673 | checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" 674 | dependencies = [ 675 | "bytes", 676 | "futures-util", 677 | "http 1.2.0", 678 | "http-body 1.0.1", 679 | "pin-project-lite", 680 | ] 681 | 682 | [[package]] 683 | name = "httparse" 684 | version = "1.10.0" 685 | source = "registry+https://github.com/rust-lang/crates.io-index" 686 | checksum = "f2d708df4e7140240a16cd6ab0ab65c972d7433ab77819ea693fde9c43811e2a" 687 | 688 | [[package]] 689 | name = "httpdate" 690 | version = "1.0.3" 691 | source = "registry+https://github.com/rust-lang/crates.io-index" 692 | checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" 693 | 694 | [[package]] 695 | name = "hyper" 696 | version = "0.14.32" 697 | source = "registry+https://github.com/rust-lang/crates.io-index" 698 | checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" 699 | dependencies = [ 700 | "bytes", 701 | "futures-channel", 702 | "futures-core", 703 | "futures-util", 704 | "h2 0.3.26", 705 | "http 0.2.12", 706 | "http-body 0.4.6", 707 | "httparse", 708 | "httpdate", 709 | "itoa", 710 | "pin-project-lite", 711 | "socket2", 712 | "tokio", 713 | "tower-service", 714 | "tracing", 715 | "want", 716 | ] 717 | 718 | [[package]] 719 | name = "hyper" 720 | version = "1.6.0" 721 | source = "registry+https://github.com/rust-lang/crates.io-index" 722 | checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" 723 | dependencies = [ 724 | "bytes", 725 | "futures-channel", 726 | "futures-util", 727 | "h2 0.4.7", 728 | "http 1.2.0", 729 | "http-body 1.0.1", 730 | "httparse", 731 | "httpdate", 732 | "itoa", 733 | "pin-project-lite", 734 | "smallvec", 735 | "tokio", 736 | ] 737 | 738 | [[package]] 739 | name = "hyper-tls" 740 | version = "0.5.0" 741 | source = "registry+https://github.com/rust-lang/crates.io-index" 742 | checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" 743 | dependencies = [ 744 | "bytes", 745 | "hyper 0.14.32", 746 | "native-tls", 747 | "tokio", 748 | "tokio-native-tls", 749 | ] 750 | 751 | [[package]] 752 | name = "hyper-util" 753 | version = "0.1.10" 754 | source = "registry+https://github.com/rust-lang/crates.io-index" 755 | checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" 756 | dependencies = [ 757 | "bytes", 758 | "futures-util", 759 | "http 1.2.0", 760 | "http-body 1.0.1", 761 | "hyper 1.6.0", 762 | "pin-project-lite", 763 | "tokio", 764 | "tower-service", 765 | ] 766 | 767 | [[package]] 768 | name = "iana-time-zone" 769 | version = "0.1.61" 770 | source = "registry+https://github.com/rust-lang/crates.io-index" 771 | checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" 772 | dependencies = [ 773 | "android_system_properties", 774 | "core-foundation-sys", 775 | "iana-time-zone-haiku", 776 | "js-sys", 777 | "wasm-bindgen", 778 | "windows-core", 779 | ] 780 | 781 | [[package]] 782 | name = "iana-time-zone-haiku" 783 | version = "0.1.2" 784 | source = "registry+https://github.com/rust-lang/crates.io-index" 785 | checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" 786 | dependencies = [ 787 | "cc", 788 | ] 789 | 790 | [[package]] 791 | name = "icu_collections" 792 | version = "1.5.0" 793 | source = "registry+https://github.com/rust-lang/crates.io-index" 794 | checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" 795 | dependencies = [ 796 | "displaydoc", 797 | "yoke", 798 | "zerofrom", 799 | "zerovec", 800 | ] 801 | 802 | [[package]] 803 | name = "icu_locid" 804 | version = "1.5.0" 805 | source = "registry+https://github.com/rust-lang/crates.io-index" 806 | checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" 807 | dependencies = [ 808 | "displaydoc", 809 | "litemap", 810 | "tinystr", 811 | "writeable", 812 | "zerovec", 813 | ] 814 | 815 | [[package]] 816 | name = "icu_locid_transform" 817 | version = "1.5.0" 818 | source = "registry+https://github.com/rust-lang/crates.io-index" 819 | checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" 820 | dependencies = [ 821 | "displaydoc", 822 | "icu_locid", 823 | "icu_locid_transform_data", 824 | "icu_provider", 825 | "tinystr", 826 | "zerovec", 827 | ] 828 | 829 | [[package]] 830 | name = "icu_locid_transform_data" 831 | version = "1.5.0" 832 | source = "registry+https://github.com/rust-lang/crates.io-index" 833 | checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" 834 | 835 | [[package]] 836 | name = "icu_normalizer" 837 | version = "1.5.0" 838 | source = "registry+https://github.com/rust-lang/crates.io-index" 839 | checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" 840 | dependencies = [ 841 | "displaydoc", 842 | "icu_collections", 843 | "icu_normalizer_data", 844 | "icu_properties", 845 | "icu_provider", 846 | "smallvec", 847 | "utf16_iter", 848 | "utf8_iter", 849 | "write16", 850 | "zerovec", 851 | ] 852 | 853 | [[package]] 854 | name = "icu_normalizer_data" 855 | version = "1.5.0" 856 | source = "registry+https://github.com/rust-lang/crates.io-index" 857 | checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" 858 | 859 | [[package]] 860 | name = "icu_properties" 861 | version = "1.5.1" 862 | source = "registry+https://github.com/rust-lang/crates.io-index" 863 | checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" 864 | dependencies = [ 865 | "displaydoc", 866 | "icu_collections", 867 | "icu_locid_transform", 868 | "icu_properties_data", 869 | "icu_provider", 870 | "tinystr", 871 | "zerovec", 872 | ] 873 | 874 | [[package]] 875 | name = "icu_properties_data" 876 | version = "1.5.0" 877 | source = "registry+https://github.com/rust-lang/crates.io-index" 878 | checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" 879 | 880 | [[package]] 881 | name = "icu_provider" 882 | version = "1.5.0" 883 | source = "registry+https://github.com/rust-lang/crates.io-index" 884 | checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" 885 | dependencies = [ 886 | "displaydoc", 887 | "icu_locid", 888 | "icu_provider_macros", 889 | "stable_deref_trait", 890 | "tinystr", 891 | "writeable", 892 | "yoke", 893 | "zerofrom", 894 | "zerovec", 895 | ] 896 | 897 | [[package]] 898 | name = "icu_provider_macros" 899 | version = "1.5.0" 900 | source = "registry+https://github.com/rust-lang/crates.io-index" 901 | checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" 902 | dependencies = [ 903 | "proc-macro2", 904 | "quote", 905 | "syn", 906 | ] 907 | 908 | [[package]] 909 | name = "idna" 910 | version = "1.0.3" 911 | source = "registry+https://github.com/rust-lang/crates.io-index" 912 | checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" 913 | dependencies = [ 914 | "idna_adapter", 915 | "smallvec", 916 | "utf8_iter", 917 | ] 918 | 919 | [[package]] 920 | name = "idna_adapter" 921 | version = "1.2.0" 922 | source = "registry+https://github.com/rust-lang/crates.io-index" 923 | checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" 924 | dependencies = [ 925 | "icu_normalizer", 926 | "icu_properties", 927 | ] 928 | 929 | [[package]] 930 | name = "ignore" 931 | version = "0.4.23" 932 | source = "registry+https://github.com/rust-lang/crates.io-index" 933 | checksum = "6d89fd380afde86567dfba715db065673989d6253f42b88179abd3eae47bda4b" 934 | dependencies = [ 935 | "crossbeam-deque", 936 | "globset", 937 | "log", 938 | "memchr", 939 | "regex-automata 0.4.9", 940 | "same-file", 941 | "walkdir", 942 | "winapi-util", 943 | ] 944 | 945 | [[package]] 946 | name = "indexmap" 947 | version = "2.7.1" 948 | source = "registry+https://github.com/rust-lang/crates.io-index" 949 | checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" 950 | dependencies = [ 951 | "equivalent", 952 | "hashbrown", 953 | ] 954 | 955 | [[package]] 956 | name = "ipnet" 957 | version = "2.11.0" 958 | source = "registry+https://github.com/rust-lang/crates.io-index" 959 | checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" 960 | 961 | [[package]] 962 | name = "itoa" 963 | version = "1.0.14" 964 | source = "registry+https://github.com/rust-lang/crates.io-index" 965 | checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" 966 | 967 | [[package]] 968 | name = "js-sys" 969 | version = "0.3.77" 970 | source = "registry+https://github.com/rust-lang/crates.io-index" 971 | checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" 972 | dependencies = [ 973 | "once_cell", 974 | "wasm-bindgen", 975 | ] 976 | 977 | [[package]] 978 | name = "lazy_static" 979 | version = "1.5.0" 980 | source = "registry+https://github.com/rust-lang/crates.io-index" 981 | checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 982 | 983 | [[package]] 984 | name = "libc" 985 | version = "0.2.169" 986 | source = "registry+https://github.com/rust-lang/crates.io-index" 987 | checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" 988 | 989 | [[package]] 990 | name = "linux-raw-sys" 991 | version = "0.4.15" 992 | source = "registry+https://github.com/rust-lang/crates.io-index" 993 | checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" 994 | 995 | [[package]] 996 | name = "litemap" 997 | version = "0.7.4" 998 | source = "registry+https://github.com/rust-lang/crates.io-index" 999 | checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" 1000 | 1001 | [[package]] 1002 | name = "lock_api" 1003 | version = "0.4.12" 1004 | source = "registry+https://github.com/rust-lang/crates.io-index" 1005 | checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" 1006 | dependencies = [ 1007 | "autocfg", 1008 | "scopeguard", 1009 | "serde", 1010 | ] 1011 | 1012 | [[package]] 1013 | name = "log" 1014 | version = "0.4.25" 1015 | source = "registry+https://github.com/rust-lang/crates.io-index" 1016 | checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" 1017 | 1018 | [[package]] 1019 | name = "matchers" 1020 | version = "0.1.0" 1021 | source = "registry+https://github.com/rust-lang/crates.io-index" 1022 | checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" 1023 | dependencies = [ 1024 | "regex-automata 0.1.10", 1025 | ] 1026 | 1027 | [[package]] 1028 | name = "matchit" 1029 | version = "0.7.3" 1030 | source = "registry+https://github.com/rust-lang/crates.io-index" 1031 | checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" 1032 | 1033 | [[package]] 1034 | name = "memchr" 1035 | version = "2.7.4" 1036 | source = "registry+https://github.com/rust-lang/crates.io-index" 1037 | checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 1038 | 1039 | [[package]] 1040 | name = "mime" 1041 | version = "0.3.17" 1042 | source = "registry+https://github.com/rust-lang/crates.io-index" 1043 | checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 1044 | 1045 | [[package]] 1046 | name = "miniz_oxide" 1047 | version = "0.8.3" 1048 | source = "registry+https://github.com/rust-lang/crates.io-index" 1049 | checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924" 1050 | dependencies = [ 1051 | "adler2", 1052 | ] 1053 | 1054 | [[package]] 1055 | name = "mio" 1056 | version = "1.0.3" 1057 | source = "registry+https://github.com/rust-lang/crates.io-index" 1058 | checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" 1059 | dependencies = [ 1060 | "libc", 1061 | "wasi 0.11.0+wasi-snapshot-preview1", 1062 | "windows-sys 0.52.0", 1063 | ] 1064 | 1065 | [[package]] 1066 | name = "native-tls" 1067 | version = "0.2.13" 1068 | source = "registry+https://github.com/rust-lang/crates.io-index" 1069 | checksum = "0dab59f8e050d5df8e4dd87d9206fb6f65a483e20ac9fda365ade4fab353196c" 1070 | dependencies = [ 1071 | "libc", 1072 | "log", 1073 | "openssl", 1074 | "openssl-probe", 1075 | "openssl-sys", 1076 | "schannel", 1077 | "security-framework", 1078 | "security-framework-sys", 1079 | "tempfile", 1080 | ] 1081 | 1082 | [[package]] 1083 | name = "nu-ansi-term" 1084 | version = "0.46.0" 1085 | source = "registry+https://github.com/rust-lang/crates.io-index" 1086 | checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" 1087 | dependencies = [ 1088 | "overload", 1089 | "winapi", 1090 | ] 1091 | 1092 | [[package]] 1093 | name = "num-conv" 1094 | version = "0.1.0" 1095 | source = "registry+https://github.com/rust-lang/crates.io-index" 1096 | checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" 1097 | 1098 | [[package]] 1099 | name = "num-traits" 1100 | version = "0.2.19" 1101 | source = "registry+https://github.com/rust-lang/crates.io-index" 1102 | checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 1103 | dependencies = [ 1104 | "autocfg", 1105 | ] 1106 | 1107 | [[package]] 1108 | name = "object" 1109 | version = "0.36.7" 1110 | source = "registry+https://github.com/rust-lang/crates.io-index" 1111 | checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" 1112 | dependencies = [ 1113 | "memchr", 1114 | ] 1115 | 1116 | [[package]] 1117 | name = "once_cell" 1118 | version = "1.20.2" 1119 | source = "registry+https://github.com/rust-lang/crates.io-index" 1120 | checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" 1121 | 1122 | [[package]] 1123 | name = "openssl" 1124 | version = "0.10.70" 1125 | source = "registry+https://github.com/rust-lang/crates.io-index" 1126 | checksum = "61cfb4e166a8bb8c9b55c500bc2308550148ece889be90f609377e58140f42c6" 1127 | dependencies = [ 1128 | "bitflags 2.8.0", 1129 | "cfg-if", 1130 | "foreign-types", 1131 | "libc", 1132 | "once_cell", 1133 | "openssl-macros", 1134 | "openssl-sys", 1135 | ] 1136 | 1137 | [[package]] 1138 | name = "openssl-macros" 1139 | version = "0.1.1" 1140 | source = "registry+https://github.com/rust-lang/crates.io-index" 1141 | checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" 1142 | dependencies = [ 1143 | "proc-macro2", 1144 | "quote", 1145 | "syn", 1146 | ] 1147 | 1148 | [[package]] 1149 | name = "openssl-probe" 1150 | version = "0.1.6" 1151 | source = "registry+https://github.com/rust-lang/crates.io-index" 1152 | checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" 1153 | 1154 | [[package]] 1155 | name = "openssl-sys" 1156 | version = "0.9.105" 1157 | source = "registry+https://github.com/rust-lang/crates.io-index" 1158 | checksum = "8b22d5b84be05a8d6947c7cb71f7c849aa0f112acd4bf51c2a7c1c988ac0a9dc" 1159 | dependencies = [ 1160 | "cc", 1161 | "libc", 1162 | "pkg-config", 1163 | "vcpkg", 1164 | ] 1165 | 1166 | [[package]] 1167 | name = "overload" 1168 | version = "0.1.1" 1169 | source = "registry+https://github.com/rust-lang/crates.io-index" 1170 | checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" 1171 | 1172 | [[package]] 1173 | name = "parking_lot" 1174 | version = "0.12.3" 1175 | source = "registry+https://github.com/rust-lang/crates.io-index" 1176 | checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" 1177 | dependencies = [ 1178 | "lock_api", 1179 | "parking_lot_core", 1180 | ] 1181 | 1182 | [[package]] 1183 | name = "parking_lot_core" 1184 | version = "0.9.10" 1185 | source = "registry+https://github.com/rust-lang/crates.io-index" 1186 | checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" 1187 | dependencies = [ 1188 | "cfg-if", 1189 | "libc", 1190 | "redox_syscall", 1191 | "smallvec", 1192 | "windows-targets 0.52.6", 1193 | ] 1194 | 1195 | [[package]] 1196 | name = "percent-encoding" 1197 | version = "2.3.1" 1198 | source = "registry+https://github.com/rust-lang/crates.io-index" 1199 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 1200 | 1201 | [[package]] 1202 | name = "pest" 1203 | version = "2.7.15" 1204 | source = "registry+https://github.com/rust-lang/crates.io-index" 1205 | checksum = "8b7cafe60d6cf8e62e1b9b2ea516a089c008945bb5a275416789e7db0bc199dc" 1206 | dependencies = [ 1207 | "memchr", 1208 | "thiserror 2.0.11", 1209 | "ucd-trie", 1210 | ] 1211 | 1212 | [[package]] 1213 | name = "pest_derive" 1214 | version = "2.7.15" 1215 | source = "registry+https://github.com/rust-lang/crates.io-index" 1216 | checksum = "816518421cfc6887a0d62bf441b6ffb4536fcc926395a69e1a85852d4363f57e" 1217 | dependencies = [ 1218 | "pest", 1219 | "pest_generator", 1220 | ] 1221 | 1222 | [[package]] 1223 | name = "pest_generator" 1224 | version = "2.7.15" 1225 | source = "registry+https://github.com/rust-lang/crates.io-index" 1226 | checksum = "7d1396fd3a870fc7838768d171b4616d5c91f6cc25e377b673d714567d99377b" 1227 | dependencies = [ 1228 | "pest", 1229 | "pest_meta", 1230 | "proc-macro2", 1231 | "quote", 1232 | "syn", 1233 | ] 1234 | 1235 | [[package]] 1236 | name = "pest_meta" 1237 | version = "2.7.15" 1238 | source = "registry+https://github.com/rust-lang/crates.io-index" 1239 | checksum = "e1e58089ea25d717bfd31fb534e4f3afcc2cc569c70de3e239778991ea3b7dea" 1240 | dependencies = [ 1241 | "once_cell", 1242 | "pest", 1243 | "sha2", 1244 | ] 1245 | 1246 | [[package]] 1247 | name = "pin-project" 1248 | version = "1.1.9" 1249 | source = "registry+https://github.com/rust-lang/crates.io-index" 1250 | checksum = "dfe2e71e1471fe07709406bf725f710b02927c9c54b2b5b2ec0e8087d97c327d" 1251 | dependencies = [ 1252 | "pin-project-internal", 1253 | ] 1254 | 1255 | [[package]] 1256 | name = "pin-project-internal" 1257 | version = "1.1.9" 1258 | source = "registry+https://github.com/rust-lang/crates.io-index" 1259 | checksum = "f6e859e6e5bd50440ab63c47e3ebabc90f26251f7c73c3d3e837b74a1cc3fa67" 1260 | dependencies = [ 1261 | "proc-macro2", 1262 | "quote", 1263 | "syn", 1264 | ] 1265 | 1266 | [[package]] 1267 | name = "pin-project-lite" 1268 | version = "0.2.16" 1269 | source = "registry+https://github.com/rust-lang/crates.io-index" 1270 | checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 1271 | 1272 | [[package]] 1273 | name = "pin-utils" 1274 | version = "0.1.0" 1275 | source = "registry+https://github.com/rust-lang/crates.io-index" 1276 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 1277 | 1278 | [[package]] 1279 | name = "pkg-config" 1280 | version = "0.3.31" 1281 | source = "registry+https://github.com/rust-lang/crates.io-index" 1282 | checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" 1283 | 1284 | [[package]] 1285 | name = "powerfmt" 1286 | version = "0.2.0" 1287 | source = "registry+https://github.com/rust-lang/crates.io-index" 1288 | checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" 1289 | 1290 | [[package]] 1291 | name = "ppv-lite86" 1292 | version = "0.2.20" 1293 | source = "registry+https://github.com/rust-lang/crates.io-index" 1294 | checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" 1295 | dependencies = [ 1296 | "zerocopy", 1297 | ] 1298 | 1299 | [[package]] 1300 | name = "proc-macro2" 1301 | version = "1.0.93" 1302 | source = "registry+https://github.com/rust-lang/crates.io-index" 1303 | checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" 1304 | dependencies = [ 1305 | "unicode-ident", 1306 | ] 1307 | 1308 | [[package]] 1309 | name = "quote" 1310 | version = "1.0.38" 1311 | source = "registry+https://github.com/rust-lang/crates.io-index" 1312 | checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" 1313 | dependencies = [ 1314 | "proc-macro2", 1315 | ] 1316 | 1317 | [[package]] 1318 | name = "rand" 1319 | version = "0.8.5" 1320 | source = "registry+https://github.com/rust-lang/crates.io-index" 1321 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 1322 | dependencies = [ 1323 | "libc", 1324 | "rand_chacha", 1325 | "rand_core", 1326 | ] 1327 | 1328 | [[package]] 1329 | name = "rand_chacha" 1330 | version = "0.3.1" 1331 | source = "registry+https://github.com/rust-lang/crates.io-index" 1332 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 1333 | dependencies = [ 1334 | "ppv-lite86", 1335 | "rand_core", 1336 | ] 1337 | 1338 | [[package]] 1339 | name = "rand_core" 1340 | version = "0.6.4" 1341 | source = "registry+https://github.com/rust-lang/crates.io-index" 1342 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 1343 | dependencies = [ 1344 | "getrandom 0.2.15", 1345 | ] 1346 | 1347 | [[package]] 1348 | name = "redox_syscall" 1349 | version = "0.5.8" 1350 | source = "registry+https://github.com/rust-lang/crates.io-index" 1351 | checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" 1352 | dependencies = [ 1353 | "bitflags 2.8.0", 1354 | ] 1355 | 1356 | [[package]] 1357 | name = "regex" 1358 | version = "1.11.1" 1359 | source = "registry+https://github.com/rust-lang/crates.io-index" 1360 | checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" 1361 | dependencies = [ 1362 | "aho-corasick", 1363 | "memchr", 1364 | "regex-automata 0.4.9", 1365 | "regex-syntax 0.8.5", 1366 | ] 1367 | 1368 | [[package]] 1369 | name = "regex-automata" 1370 | version = "0.1.10" 1371 | source = "registry+https://github.com/rust-lang/crates.io-index" 1372 | checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" 1373 | dependencies = [ 1374 | "regex-syntax 0.6.29", 1375 | ] 1376 | 1377 | [[package]] 1378 | name = "regex-automata" 1379 | version = "0.4.9" 1380 | source = "registry+https://github.com/rust-lang/crates.io-index" 1381 | checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" 1382 | dependencies = [ 1383 | "aho-corasick", 1384 | "memchr", 1385 | "regex-syntax 0.8.5", 1386 | ] 1387 | 1388 | [[package]] 1389 | name = "regex-syntax" 1390 | version = "0.6.29" 1391 | source = "registry+https://github.com/rust-lang/crates.io-index" 1392 | checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" 1393 | 1394 | [[package]] 1395 | name = "regex-syntax" 1396 | version = "0.8.5" 1397 | source = "registry+https://github.com/rust-lang/crates.io-index" 1398 | checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" 1399 | 1400 | [[package]] 1401 | name = "reqwest" 1402 | version = "0.11.27" 1403 | source = "registry+https://github.com/rust-lang/crates.io-index" 1404 | checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" 1405 | dependencies = [ 1406 | "base64 0.21.7", 1407 | "bytes", 1408 | "encoding_rs", 1409 | "futures-core", 1410 | "futures-util", 1411 | "h2 0.3.26", 1412 | "http 0.2.12", 1413 | "http-body 0.4.6", 1414 | "hyper 0.14.32", 1415 | "hyper-tls", 1416 | "ipnet", 1417 | "js-sys", 1418 | "log", 1419 | "mime", 1420 | "native-tls", 1421 | "once_cell", 1422 | "percent-encoding", 1423 | "pin-project-lite", 1424 | "rustls-pemfile 1.0.4", 1425 | "serde", 1426 | "serde_json", 1427 | "serde_urlencoded", 1428 | "sync_wrapper 0.1.2", 1429 | "system-configuration", 1430 | "tokio", 1431 | "tokio-native-tls", 1432 | "tokio-util", 1433 | "tower-service", 1434 | "url", 1435 | "wasm-bindgen", 1436 | "wasm-bindgen-futures", 1437 | "wasm-streams", 1438 | "web-sys", 1439 | "winreg", 1440 | ] 1441 | 1442 | [[package]] 1443 | name = "ring" 1444 | version = "0.17.8" 1445 | source = "registry+https://github.com/rust-lang/crates.io-index" 1446 | checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" 1447 | dependencies = [ 1448 | "cc", 1449 | "cfg-if", 1450 | "getrandom 0.2.15", 1451 | "libc", 1452 | "spin", 1453 | "untrusted", 1454 | "windows-sys 0.52.0", 1455 | ] 1456 | 1457 | [[package]] 1458 | name = "rustc-demangle" 1459 | version = "0.1.24" 1460 | source = "registry+https://github.com/rust-lang/crates.io-index" 1461 | checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" 1462 | 1463 | [[package]] 1464 | name = "rustix" 1465 | version = "0.38.44" 1466 | source = "registry+https://github.com/rust-lang/crates.io-index" 1467 | checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" 1468 | dependencies = [ 1469 | "bitflags 2.8.0", 1470 | "errno", 1471 | "libc", 1472 | "linux-raw-sys", 1473 | "windows-sys 0.59.0", 1474 | ] 1475 | 1476 | [[package]] 1477 | name = "rustls" 1478 | version = "0.21.12" 1479 | source = "registry+https://github.com/rust-lang/crates.io-index" 1480 | checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" 1481 | dependencies = [ 1482 | "log", 1483 | "ring", 1484 | "rustls-webpki", 1485 | "sct", 1486 | ] 1487 | 1488 | [[package]] 1489 | name = "rustls-pemfile" 1490 | version = "1.0.4" 1491 | source = "registry+https://github.com/rust-lang/crates.io-index" 1492 | checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" 1493 | dependencies = [ 1494 | "base64 0.21.7", 1495 | ] 1496 | 1497 | [[package]] 1498 | name = "rustls-pemfile" 1499 | version = "2.2.0" 1500 | source = "registry+https://github.com/rust-lang/crates.io-index" 1501 | checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" 1502 | dependencies = [ 1503 | "rustls-pki-types", 1504 | ] 1505 | 1506 | [[package]] 1507 | name = "rustls-pki-types" 1508 | version = "1.11.0" 1509 | source = "registry+https://github.com/rust-lang/crates.io-index" 1510 | checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" 1511 | 1512 | [[package]] 1513 | name = "rustls-webpki" 1514 | version = "0.101.7" 1515 | source = "registry+https://github.com/rust-lang/crates.io-index" 1516 | checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" 1517 | dependencies = [ 1518 | "ring", 1519 | "untrusted", 1520 | ] 1521 | 1522 | [[package]] 1523 | name = "rustversion" 1524 | version = "1.0.19" 1525 | source = "registry+https://github.com/rust-lang/crates.io-index" 1526 | checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" 1527 | 1528 | [[package]] 1529 | name = "ryu" 1530 | version = "1.0.19" 1531 | source = "registry+https://github.com/rust-lang/crates.io-index" 1532 | checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" 1533 | 1534 | [[package]] 1535 | name = "same-file" 1536 | version = "1.0.6" 1537 | source = "registry+https://github.com/rust-lang/crates.io-index" 1538 | checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" 1539 | dependencies = [ 1540 | "winapi-util", 1541 | ] 1542 | 1543 | [[package]] 1544 | name = "schannel" 1545 | version = "0.1.27" 1546 | source = "registry+https://github.com/rust-lang/crates.io-index" 1547 | checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" 1548 | dependencies = [ 1549 | "windows-sys 0.59.0", 1550 | ] 1551 | 1552 | [[package]] 1553 | name = "scopeguard" 1554 | version = "1.2.0" 1555 | source = "registry+https://github.com/rust-lang/crates.io-index" 1556 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 1557 | 1558 | [[package]] 1559 | name = "sct" 1560 | version = "0.7.1" 1561 | source = "registry+https://github.com/rust-lang/crates.io-index" 1562 | checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" 1563 | dependencies = [ 1564 | "ring", 1565 | "untrusted", 1566 | ] 1567 | 1568 | [[package]] 1569 | name = "security-framework" 1570 | version = "2.11.1" 1571 | source = "registry+https://github.com/rust-lang/crates.io-index" 1572 | checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" 1573 | dependencies = [ 1574 | "bitflags 2.8.0", 1575 | "core-foundation", 1576 | "core-foundation-sys", 1577 | "libc", 1578 | "security-framework-sys", 1579 | ] 1580 | 1581 | [[package]] 1582 | name = "security-framework-sys" 1583 | version = "2.14.0" 1584 | source = "registry+https://github.com/rust-lang/crates.io-index" 1585 | checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" 1586 | dependencies = [ 1587 | "core-foundation-sys", 1588 | "libc", 1589 | ] 1590 | 1591 | [[package]] 1592 | name = "serde" 1593 | version = "1.0.217" 1594 | source = "registry+https://github.com/rust-lang/crates.io-index" 1595 | checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" 1596 | dependencies = [ 1597 | "serde_derive", 1598 | ] 1599 | 1600 | [[package]] 1601 | name = "serde_derive" 1602 | version = "1.0.217" 1603 | source = "registry+https://github.com/rust-lang/crates.io-index" 1604 | checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" 1605 | dependencies = [ 1606 | "proc-macro2", 1607 | "quote", 1608 | "syn", 1609 | ] 1610 | 1611 | [[package]] 1612 | name = "serde_json" 1613 | version = "1.0.138" 1614 | source = "registry+https://github.com/rust-lang/crates.io-index" 1615 | checksum = "d434192e7da787e94a6ea7e9670b26a036d0ca41e0b7efb2676dd32bae872949" 1616 | dependencies = [ 1617 | "itoa", 1618 | "memchr", 1619 | "ryu", 1620 | "serde", 1621 | ] 1622 | 1623 | [[package]] 1624 | name = "serde_path_to_error" 1625 | version = "0.1.16" 1626 | source = "registry+https://github.com/rust-lang/crates.io-index" 1627 | checksum = "af99884400da37c88f5e9146b7f1fd0fbcae8f6eec4e9da38b67d05486f814a6" 1628 | dependencies = [ 1629 | "itoa", 1630 | "serde", 1631 | ] 1632 | 1633 | [[package]] 1634 | name = "serde_urlencoded" 1635 | version = "0.7.1" 1636 | source = "registry+https://github.com/rust-lang/crates.io-index" 1637 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 1638 | dependencies = [ 1639 | "form_urlencoded", 1640 | "itoa", 1641 | "ryu", 1642 | "serde", 1643 | ] 1644 | 1645 | [[package]] 1646 | name = "sha2" 1647 | version = "0.10.8" 1648 | source = "registry+https://github.com/rust-lang/crates.io-index" 1649 | checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" 1650 | dependencies = [ 1651 | "cfg-if", 1652 | "cpufeatures", 1653 | "digest", 1654 | ] 1655 | 1656 | [[package]] 1657 | name = "sharded-slab" 1658 | version = "0.1.7" 1659 | source = "registry+https://github.com/rust-lang/crates.io-index" 1660 | checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" 1661 | dependencies = [ 1662 | "lazy_static", 1663 | ] 1664 | 1665 | [[package]] 1666 | name = "shlex" 1667 | version = "1.3.0" 1668 | source = "registry+https://github.com/rust-lang/crates.io-index" 1669 | checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 1670 | 1671 | [[package]] 1672 | name = "skattemelding" 1673 | version = "0.1.0" 1674 | dependencies = [ 1675 | "anyhow", 1676 | "axum", 1677 | "axum-server", 1678 | "chrono", 1679 | "data-encoding", 1680 | "reqwest", 1681 | "serde", 1682 | "serde_json", 1683 | "tera", 1684 | "tokio", 1685 | "tokio-util", 1686 | "tower-sessions", 1687 | "tracing", 1688 | "tracing-subscriber", 1689 | "xmltree", 1690 | ] 1691 | 1692 | [[package]] 1693 | name = "slab" 1694 | version = "0.4.9" 1695 | source = "registry+https://github.com/rust-lang/crates.io-index" 1696 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 1697 | dependencies = [ 1698 | "autocfg", 1699 | ] 1700 | 1701 | [[package]] 1702 | name = "smallvec" 1703 | version = "1.13.2" 1704 | source = "registry+https://github.com/rust-lang/crates.io-index" 1705 | checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" 1706 | 1707 | [[package]] 1708 | name = "socket2" 1709 | version = "0.5.8" 1710 | source = "registry+https://github.com/rust-lang/crates.io-index" 1711 | checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" 1712 | dependencies = [ 1713 | "libc", 1714 | "windows-sys 0.52.0", 1715 | ] 1716 | 1717 | [[package]] 1718 | name = "spin" 1719 | version = "0.9.8" 1720 | source = "registry+https://github.com/rust-lang/crates.io-index" 1721 | checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" 1722 | 1723 | [[package]] 1724 | name = "stable_deref_trait" 1725 | version = "1.2.0" 1726 | source = "registry+https://github.com/rust-lang/crates.io-index" 1727 | checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 1728 | 1729 | [[package]] 1730 | name = "syn" 1731 | version = "2.0.98" 1732 | source = "registry+https://github.com/rust-lang/crates.io-index" 1733 | checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" 1734 | dependencies = [ 1735 | "proc-macro2", 1736 | "quote", 1737 | "unicode-ident", 1738 | ] 1739 | 1740 | [[package]] 1741 | name = "sync_wrapper" 1742 | version = "0.1.2" 1743 | source = "registry+https://github.com/rust-lang/crates.io-index" 1744 | checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" 1745 | 1746 | [[package]] 1747 | name = "sync_wrapper" 1748 | version = "1.0.2" 1749 | source = "registry+https://github.com/rust-lang/crates.io-index" 1750 | checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" 1751 | 1752 | [[package]] 1753 | name = "synstructure" 1754 | version = "0.13.1" 1755 | source = "registry+https://github.com/rust-lang/crates.io-index" 1756 | checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" 1757 | dependencies = [ 1758 | "proc-macro2", 1759 | "quote", 1760 | "syn", 1761 | ] 1762 | 1763 | [[package]] 1764 | name = "system-configuration" 1765 | version = "0.5.1" 1766 | source = "registry+https://github.com/rust-lang/crates.io-index" 1767 | checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" 1768 | dependencies = [ 1769 | "bitflags 1.3.2", 1770 | "core-foundation", 1771 | "system-configuration-sys", 1772 | ] 1773 | 1774 | [[package]] 1775 | name = "system-configuration-sys" 1776 | version = "0.5.0" 1777 | source = "registry+https://github.com/rust-lang/crates.io-index" 1778 | checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" 1779 | dependencies = [ 1780 | "core-foundation-sys", 1781 | "libc", 1782 | ] 1783 | 1784 | [[package]] 1785 | name = "tempfile" 1786 | version = "3.16.0" 1787 | source = "registry+https://github.com/rust-lang/crates.io-index" 1788 | checksum = "38c246215d7d24f48ae091a2902398798e05d978b24315d6efbc00ede9a8bb91" 1789 | dependencies = [ 1790 | "cfg-if", 1791 | "fastrand", 1792 | "getrandom 0.3.1", 1793 | "once_cell", 1794 | "rustix", 1795 | "windows-sys 0.59.0", 1796 | ] 1797 | 1798 | [[package]] 1799 | name = "tera" 1800 | version = "1.20.0" 1801 | source = "registry+https://github.com/rust-lang/crates.io-index" 1802 | checksum = "ab9d851b45e865f178319da0abdbfe6acbc4328759ff18dafc3a41c16b4cd2ee" 1803 | dependencies = [ 1804 | "globwalk", 1805 | "lazy_static", 1806 | "pest", 1807 | "pest_derive", 1808 | "regex", 1809 | "serde", 1810 | "serde_json", 1811 | "unic-segment", 1812 | ] 1813 | 1814 | [[package]] 1815 | name = "thiserror" 1816 | version = "1.0.69" 1817 | source = "registry+https://github.com/rust-lang/crates.io-index" 1818 | checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" 1819 | dependencies = [ 1820 | "thiserror-impl 1.0.69", 1821 | ] 1822 | 1823 | [[package]] 1824 | name = "thiserror" 1825 | version = "2.0.11" 1826 | source = "registry+https://github.com/rust-lang/crates.io-index" 1827 | checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" 1828 | dependencies = [ 1829 | "thiserror-impl 2.0.11", 1830 | ] 1831 | 1832 | [[package]] 1833 | name = "thiserror-impl" 1834 | version = "1.0.69" 1835 | source = "registry+https://github.com/rust-lang/crates.io-index" 1836 | checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" 1837 | dependencies = [ 1838 | "proc-macro2", 1839 | "quote", 1840 | "syn", 1841 | ] 1842 | 1843 | [[package]] 1844 | name = "thiserror-impl" 1845 | version = "2.0.11" 1846 | source = "registry+https://github.com/rust-lang/crates.io-index" 1847 | checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" 1848 | dependencies = [ 1849 | "proc-macro2", 1850 | "quote", 1851 | "syn", 1852 | ] 1853 | 1854 | [[package]] 1855 | name = "thread_local" 1856 | version = "1.1.8" 1857 | source = "registry+https://github.com/rust-lang/crates.io-index" 1858 | checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" 1859 | dependencies = [ 1860 | "cfg-if", 1861 | "once_cell", 1862 | ] 1863 | 1864 | [[package]] 1865 | name = "time" 1866 | version = "0.3.37" 1867 | source = "registry+https://github.com/rust-lang/crates.io-index" 1868 | checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" 1869 | dependencies = [ 1870 | "deranged", 1871 | "itoa", 1872 | "num-conv", 1873 | "powerfmt", 1874 | "serde", 1875 | "time-core", 1876 | "time-macros", 1877 | ] 1878 | 1879 | [[package]] 1880 | name = "time-core" 1881 | version = "0.1.2" 1882 | source = "registry+https://github.com/rust-lang/crates.io-index" 1883 | checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" 1884 | 1885 | [[package]] 1886 | name = "time-macros" 1887 | version = "0.2.19" 1888 | source = "registry+https://github.com/rust-lang/crates.io-index" 1889 | checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" 1890 | dependencies = [ 1891 | "num-conv", 1892 | "time-core", 1893 | ] 1894 | 1895 | [[package]] 1896 | name = "tinystr" 1897 | version = "0.7.6" 1898 | source = "registry+https://github.com/rust-lang/crates.io-index" 1899 | checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" 1900 | dependencies = [ 1901 | "displaydoc", 1902 | "zerovec", 1903 | ] 1904 | 1905 | [[package]] 1906 | name = "tokio" 1907 | version = "1.43.0" 1908 | source = "registry+https://github.com/rust-lang/crates.io-index" 1909 | checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" 1910 | dependencies = [ 1911 | "backtrace", 1912 | "bytes", 1913 | "libc", 1914 | "mio", 1915 | "pin-project-lite", 1916 | "socket2", 1917 | "tokio-macros", 1918 | "windows-sys 0.52.0", 1919 | ] 1920 | 1921 | [[package]] 1922 | name = "tokio-macros" 1923 | version = "2.5.0" 1924 | source = "registry+https://github.com/rust-lang/crates.io-index" 1925 | checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" 1926 | dependencies = [ 1927 | "proc-macro2", 1928 | "quote", 1929 | "syn", 1930 | ] 1931 | 1932 | [[package]] 1933 | name = "tokio-native-tls" 1934 | version = "0.3.1" 1935 | source = "registry+https://github.com/rust-lang/crates.io-index" 1936 | checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" 1937 | dependencies = [ 1938 | "native-tls", 1939 | "tokio", 1940 | ] 1941 | 1942 | [[package]] 1943 | name = "tokio-rustls" 1944 | version = "0.24.1" 1945 | source = "registry+https://github.com/rust-lang/crates.io-index" 1946 | checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" 1947 | dependencies = [ 1948 | "rustls", 1949 | "tokio", 1950 | ] 1951 | 1952 | [[package]] 1953 | name = "tokio-util" 1954 | version = "0.7.13" 1955 | source = "registry+https://github.com/rust-lang/crates.io-index" 1956 | checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" 1957 | dependencies = [ 1958 | "bytes", 1959 | "futures-core", 1960 | "futures-sink", 1961 | "pin-project-lite", 1962 | "tokio", 1963 | ] 1964 | 1965 | [[package]] 1966 | name = "tower" 1967 | version = "0.4.13" 1968 | source = "registry+https://github.com/rust-lang/crates.io-index" 1969 | checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" 1970 | dependencies = [ 1971 | "futures-core", 1972 | "futures-util", 1973 | "pin-project", 1974 | "pin-project-lite", 1975 | "tower-layer", 1976 | "tower-service", 1977 | "tracing", 1978 | ] 1979 | 1980 | [[package]] 1981 | name = "tower" 1982 | version = "0.5.2" 1983 | source = "registry+https://github.com/rust-lang/crates.io-index" 1984 | checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" 1985 | dependencies = [ 1986 | "futures-core", 1987 | "futures-util", 1988 | "pin-project-lite", 1989 | "sync_wrapper 1.0.2", 1990 | "tokio", 1991 | "tower-layer", 1992 | "tower-service", 1993 | "tracing", 1994 | ] 1995 | 1996 | [[package]] 1997 | name = "tower-cookies" 1998 | version = "0.10.0" 1999 | source = "registry+https://github.com/rust-lang/crates.io-index" 2000 | checksum = "4fd0118512cf0b3768f7fcccf0bef1ae41d68f2b45edc1e77432b36c97c56c6d" 2001 | dependencies = [ 2002 | "async-trait", 2003 | "axum-core", 2004 | "cookie", 2005 | "futures-util", 2006 | "http 1.2.0", 2007 | "parking_lot", 2008 | "pin-project-lite", 2009 | "tower-layer", 2010 | "tower-service", 2011 | ] 2012 | 2013 | [[package]] 2014 | name = "tower-layer" 2015 | version = "0.3.3" 2016 | source = "registry+https://github.com/rust-lang/crates.io-index" 2017 | checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" 2018 | 2019 | [[package]] 2020 | name = "tower-service" 2021 | version = "0.3.3" 2022 | source = "registry+https://github.com/rust-lang/crates.io-index" 2023 | checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" 2024 | 2025 | [[package]] 2026 | name = "tower-sessions" 2027 | version = "0.11.1" 2028 | source = "registry+https://github.com/rust-lang/crates.io-index" 2029 | checksum = "b27326208b21807803c5f5aa1020d30ca0432b78cfe251b51a67a05e0baea102" 2030 | dependencies = [ 2031 | "async-trait", 2032 | "http 1.2.0", 2033 | "time", 2034 | "tokio", 2035 | "tower-cookies", 2036 | "tower-layer", 2037 | "tower-service", 2038 | "tower-sessions-core", 2039 | "tower-sessions-memory-store", 2040 | "tracing", 2041 | ] 2042 | 2043 | [[package]] 2044 | name = "tower-sessions-core" 2045 | version = "0.11.1" 2046 | source = "registry+https://github.com/rust-lang/crates.io-index" 2047 | checksum = "afd1c5040577134115d8cc758d7757da29e171f83102de3ed1b86e3a2405533f" 2048 | dependencies = [ 2049 | "async-trait", 2050 | "axum-core", 2051 | "base64 0.22.1", 2052 | "futures", 2053 | "http 1.2.0", 2054 | "parking_lot", 2055 | "rand", 2056 | "serde", 2057 | "serde_json", 2058 | "thiserror 1.0.69", 2059 | "time", 2060 | "tokio", 2061 | "tracing", 2062 | ] 2063 | 2064 | [[package]] 2065 | name = "tower-sessions-memory-store" 2066 | version = "0.11.1" 2067 | source = "registry+https://github.com/rust-lang/crates.io-index" 2068 | checksum = "88ac75309918b8f6ba16d09865a2a64f81e01b05cf42d5e88e5d3c6cbf775486" 2069 | dependencies = [ 2070 | "async-trait", 2071 | "time", 2072 | "tokio", 2073 | "tower-sessions-core", 2074 | ] 2075 | 2076 | [[package]] 2077 | name = "tracing" 2078 | version = "0.1.41" 2079 | source = "registry+https://github.com/rust-lang/crates.io-index" 2080 | checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" 2081 | dependencies = [ 2082 | "log", 2083 | "pin-project-lite", 2084 | "tracing-attributes", 2085 | "tracing-core", 2086 | ] 2087 | 2088 | [[package]] 2089 | name = "tracing-attributes" 2090 | version = "0.1.28" 2091 | source = "registry+https://github.com/rust-lang/crates.io-index" 2092 | checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" 2093 | dependencies = [ 2094 | "proc-macro2", 2095 | "quote", 2096 | "syn", 2097 | ] 2098 | 2099 | [[package]] 2100 | name = "tracing-core" 2101 | version = "0.1.33" 2102 | source = "registry+https://github.com/rust-lang/crates.io-index" 2103 | checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" 2104 | dependencies = [ 2105 | "once_cell", 2106 | "valuable", 2107 | ] 2108 | 2109 | [[package]] 2110 | name = "tracing-log" 2111 | version = "0.2.0" 2112 | source = "registry+https://github.com/rust-lang/crates.io-index" 2113 | checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" 2114 | dependencies = [ 2115 | "log", 2116 | "once_cell", 2117 | "tracing-core", 2118 | ] 2119 | 2120 | [[package]] 2121 | name = "tracing-subscriber" 2122 | version = "0.3.19" 2123 | source = "registry+https://github.com/rust-lang/crates.io-index" 2124 | checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" 2125 | dependencies = [ 2126 | "matchers", 2127 | "nu-ansi-term", 2128 | "once_cell", 2129 | "regex", 2130 | "sharded-slab", 2131 | "smallvec", 2132 | "thread_local", 2133 | "tracing", 2134 | "tracing-core", 2135 | "tracing-log", 2136 | ] 2137 | 2138 | [[package]] 2139 | name = "try-lock" 2140 | version = "0.2.5" 2141 | source = "registry+https://github.com/rust-lang/crates.io-index" 2142 | checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" 2143 | 2144 | [[package]] 2145 | name = "typenum" 2146 | version = "1.17.0" 2147 | source = "registry+https://github.com/rust-lang/crates.io-index" 2148 | checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" 2149 | 2150 | [[package]] 2151 | name = "ucd-trie" 2152 | version = "0.1.7" 2153 | source = "registry+https://github.com/rust-lang/crates.io-index" 2154 | checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" 2155 | 2156 | [[package]] 2157 | name = "unic-char-property" 2158 | version = "0.9.0" 2159 | source = "registry+https://github.com/rust-lang/crates.io-index" 2160 | checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221" 2161 | dependencies = [ 2162 | "unic-char-range", 2163 | ] 2164 | 2165 | [[package]] 2166 | name = "unic-char-range" 2167 | version = "0.9.0" 2168 | source = "registry+https://github.com/rust-lang/crates.io-index" 2169 | checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc" 2170 | 2171 | [[package]] 2172 | name = "unic-common" 2173 | version = "0.9.0" 2174 | source = "registry+https://github.com/rust-lang/crates.io-index" 2175 | checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc" 2176 | 2177 | [[package]] 2178 | name = "unic-segment" 2179 | version = "0.9.0" 2180 | source = "registry+https://github.com/rust-lang/crates.io-index" 2181 | checksum = "e4ed5d26be57f84f176157270c112ef57b86debac9cd21daaabbe56db0f88f23" 2182 | dependencies = [ 2183 | "unic-ucd-segment", 2184 | ] 2185 | 2186 | [[package]] 2187 | name = "unic-ucd-segment" 2188 | version = "0.9.0" 2189 | source = "registry+https://github.com/rust-lang/crates.io-index" 2190 | checksum = "2079c122a62205b421f499da10f3ee0f7697f012f55b675e002483c73ea34700" 2191 | dependencies = [ 2192 | "unic-char-property", 2193 | "unic-char-range", 2194 | "unic-ucd-version", 2195 | ] 2196 | 2197 | [[package]] 2198 | name = "unic-ucd-version" 2199 | version = "0.9.0" 2200 | source = "registry+https://github.com/rust-lang/crates.io-index" 2201 | checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4" 2202 | dependencies = [ 2203 | "unic-common", 2204 | ] 2205 | 2206 | [[package]] 2207 | name = "unicode-ident" 2208 | version = "1.0.16" 2209 | source = "registry+https://github.com/rust-lang/crates.io-index" 2210 | checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034" 2211 | 2212 | [[package]] 2213 | name = "untrusted" 2214 | version = "0.9.0" 2215 | source = "registry+https://github.com/rust-lang/crates.io-index" 2216 | checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" 2217 | 2218 | [[package]] 2219 | name = "url" 2220 | version = "2.5.4" 2221 | source = "registry+https://github.com/rust-lang/crates.io-index" 2222 | checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" 2223 | dependencies = [ 2224 | "form_urlencoded", 2225 | "idna", 2226 | "percent-encoding", 2227 | ] 2228 | 2229 | [[package]] 2230 | name = "utf16_iter" 2231 | version = "1.0.5" 2232 | source = "registry+https://github.com/rust-lang/crates.io-index" 2233 | checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" 2234 | 2235 | [[package]] 2236 | name = "utf8_iter" 2237 | version = "1.0.4" 2238 | source = "registry+https://github.com/rust-lang/crates.io-index" 2239 | checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" 2240 | 2241 | [[package]] 2242 | name = "valuable" 2243 | version = "0.1.1" 2244 | source = "registry+https://github.com/rust-lang/crates.io-index" 2245 | checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" 2246 | 2247 | [[package]] 2248 | name = "vcpkg" 2249 | version = "0.2.15" 2250 | source = "registry+https://github.com/rust-lang/crates.io-index" 2251 | checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 2252 | 2253 | [[package]] 2254 | name = "version_check" 2255 | version = "0.9.5" 2256 | source = "registry+https://github.com/rust-lang/crates.io-index" 2257 | checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" 2258 | 2259 | [[package]] 2260 | name = "walkdir" 2261 | version = "2.5.0" 2262 | source = "registry+https://github.com/rust-lang/crates.io-index" 2263 | checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" 2264 | dependencies = [ 2265 | "same-file", 2266 | "winapi-util", 2267 | ] 2268 | 2269 | [[package]] 2270 | name = "want" 2271 | version = "0.3.1" 2272 | source = "registry+https://github.com/rust-lang/crates.io-index" 2273 | checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" 2274 | dependencies = [ 2275 | "try-lock", 2276 | ] 2277 | 2278 | [[package]] 2279 | name = "wasi" 2280 | version = "0.11.0+wasi-snapshot-preview1" 2281 | source = "registry+https://github.com/rust-lang/crates.io-index" 2282 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 2283 | 2284 | [[package]] 2285 | name = "wasi" 2286 | version = "0.13.3+wasi-0.2.2" 2287 | source = "registry+https://github.com/rust-lang/crates.io-index" 2288 | checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" 2289 | dependencies = [ 2290 | "wit-bindgen-rt", 2291 | ] 2292 | 2293 | [[package]] 2294 | name = "wasm-bindgen" 2295 | version = "0.2.100" 2296 | source = "registry+https://github.com/rust-lang/crates.io-index" 2297 | checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" 2298 | dependencies = [ 2299 | "cfg-if", 2300 | "once_cell", 2301 | "rustversion", 2302 | "wasm-bindgen-macro", 2303 | ] 2304 | 2305 | [[package]] 2306 | name = "wasm-bindgen-backend" 2307 | version = "0.2.100" 2308 | source = "registry+https://github.com/rust-lang/crates.io-index" 2309 | checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" 2310 | dependencies = [ 2311 | "bumpalo", 2312 | "log", 2313 | "proc-macro2", 2314 | "quote", 2315 | "syn", 2316 | "wasm-bindgen-shared", 2317 | ] 2318 | 2319 | [[package]] 2320 | name = "wasm-bindgen-futures" 2321 | version = "0.4.50" 2322 | source = "registry+https://github.com/rust-lang/crates.io-index" 2323 | checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" 2324 | dependencies = [ 2325 | "cfg-if", 2326 | "js-sys", 2327 | "once_cell", 2328 | "wasm-bindgen", 2329 | "web-sys", 2330 | ] 2331 | 2332 | [[package]] 2333 | name = "wasm-bindgen-macro" 2334 | version = "0.2.100" 2335 | source = "registry+https://github.com/rust-lang/crates.io-index" 2336 | checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" 2337 | dependencies = [ 2338 | "quote", 2339 | "wasm-bindgen-macro-support", 2340 | ] 2341 | 2342 | [[package]] 2343 | name = "wasm-bindgen-macro-support" 2344 | version = "0.2.100" 2345 | source = "registry+https://github.com/rust-lang/crates.io-index" 2346 | checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" 2347 | dependencies = [ 2348 | "proc-macro2", 2349 | "quote", 2350 | "syn", 2351 | "wasm-bindgen-backend", 2352 | "wasm-bindgen-shared", 2353 | ] 2354 | 2355 | [[package]] 2356 | name = "wasm-bindgen-shared" 2357 | version = "0.2.100" 2358 | source = "registry+https://github.com/rust-lang/crates.io-index" 2359 | checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" 2360 | dependencies = [ 2361 | "unicode-ident", 2362 | ] 2363 | 2364 | [[package]] 2365 | name = "wasm-streams" 2366 | version = "0.4.2" 2367 | source = "registry+https://github.com/rust-lang/crates.io-index" 2368 | checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" 2369 | dependencies = [ 2370 | "futures-util", 2371 | "js-sys", 2372 | "wasm-bindgen", 2373 | "wasm-bindgen-futures", 2374 | "web-sys", 2375 | ] 2376 | 2377 | [[package]] 2378 | name = "web-sys" 2379 | version = "0.3.77" 2380 | source = "registry+https://github.com/rust-lang/crates.io-index" 2381 | checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" 2382 | dependencies = [ 2383 | "js-sys", 2384 | "wasm-bindgen", 2385 | ] 2386 | 2387 | [[package]] 2388 | name = "winapi" 2389 | version = "0.3.9" 2390 | source = "registry+https://github.com/rust-lang/crates.io-index" 2391 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 2392 | dependencies = [ 2393 | "winapi-i686-pc-windows-gnu", 2394 | "winapi-x86_64-pc-windows-gnu", 2395 | ] 2396 | 2397 | [[package]] 2398 | name = "winapi-i686-pc-windows-gnu" 2399 | version = "0.4.0" 2400 | source = "registry+https://github.com/rust-lang/crates.io-index" 2401 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 2402 | 2403 | [[package]] 2404 | name = "winapi-util" 2405 | version = "0.1.9" 2406 | source = "registry+https://github.com/rust-lang/crates.io-index" 2407 | checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" 2408 | dependencies = [ 2409 | "windows-sys 0.59.0", 2410 | ] 2411 | 2412 | [[package]] 2413 | name = "winapi-x86_64-pc-windows-gnu" 2414 | version = "0.4.0" 2415 | source = "registry+https://github.com/rust-lang/crates.io-index" 2416 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 2417 | 2418 | [[package]] 2419 | name = "windows-core" 2420 | version = "0.52.0" 2421 | source = "registry+https://github.com/rust-lang/crates.io-index" 2422 | checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" 2423 | dependencies = [ 2424 | "windows-targets 0.52.6", 2425 | ] 2426 | 2427 | [[package]] 2428 | name = "windows-sys" 2429 | version = "0.48.0" 2430 | source = "registry+https://github.com/rust-lang/crates.io-index" 2431 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 2432 | dependencies = [ 2433 | "windows-targets 0.48.5", 2434 | ] 2435 | 2436 | [[package]] 2437 | name = "windows-sys" 2438 | version = "0.52.0" 2439 | source = "registry+https://github.com/rust-lang/crates.io-index" 2440 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 2441 | dependencies = [ 2442 | "windows-targets 0.52.6", 2443 | ] 2444 | 2445 | [[package]] 2446 | name = "windows-sys" 2447 | version = "0.59.0" 2448 | source = "registry+https://github.com/rust-lang/crates.io-index" 2449 | checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 2450 | dependencies = [ 2451 | "windows-targets 0.52.6", 2452 | ] 2453 | 2454 | [[package]] 2455 | name = "windows-targets" 2456 | version = "0.48.5" 2457 | source = "registry+https://github.com/rust-lang/crates.io-index" 2458 | checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 2459 | dependencies = [ 2460 | "windows_aarch64_gnullvm 0.48.5", 2461 | "windows_aarch64_msvc 0.48.5", 2462 | "windows_i686_gnu 0.48.5", 2463 | "windows_i686_msvc 0.48.5", 2464 | "windows_x86_64_gnu 0.48.5", 2465 | "windows_x86_64_gnullvm 0.48.5", 2466 | "windows_x86_64_msvc 0.48.5", 2467 | ] 2468 | 2469 | [[package]] 2470 | name = "windows-targets" 2471 | version = "0.52.6" 2472 | source = "registry+https://github.com/rust-lang/crates.io-index" 2473 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 2474 | dependencies = [ 2475 | "windows_aarch64_gnullvm 0.52.6", 2476 | "windows_aarch64_msvc 0.52.6", 2477 | "windows_i686_gnu 0.52.6", 2478 | "windows_i686_gnullvm", 2479 | "windows_i686_msvc 0.52.6", 2480 | "windows_x86_64_gnu 0.52.6", 2481 | "windows_x86_64_gnullvm 0.52.6", 2482 | "windows_x86_64_msvc 0.52.6", 2483 | ] 2484 | 2485 | [[package]] 2486 | name = "windows_aarch64_gnullvm" 2487 | version = "0.48.5" 2488 | source = "registry+https://github.com/rust-lang/crates.io-index" 2489 | checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 2490 | 2491 | [[package]] 2492 | name = "windows_aarch64_gnullvm" 2493 | version = "0.52.6" 2494 | source = "registry+https://github.com/rust-lang/crates.io-index" 2495 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 2496 | 2497 | [[package]] 2498 | name = "windows_aarch64_msvc" 2499 | version = "0.48.5" 2500 | source = "registry+https://github.com/rust-lang/crates.io-index" 2501 | checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 2502 | 2503 | [[package]] 2504 | name = "windows_aarch64_msvc" 2505 | version = "0.52.6" 2506 | source = "registry+https://github.com/rust-lang/crates.io-index" 2507 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 2508 | 2509 | [[package]] 2510 | name = "windows_i686_gnu" 2511 | version = "0.48.5" 2512 | source = "registry+https://github.com/rust-lang/crates.io-index" 2513 | checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 2514 | 2515 | [[package]] 2516 | name = "windows_i686_gnu" 2517 | version = "0.52.6" 2518 | source = "registry+https://github.com/rust-lang/crates.io-index" 2519 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 2520 | 2521 | [[package]] 2522 | name = "windows_i686_gnullvm" 2523 | version = "0.52.6" 2524 | source = "registry+https://github.com/rust-lang/crates.io-index" 2525 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 2526 | 2527 | [[package]] 2528 | name = "windows_i686_msvc" 2529 | version = "0.48.5" 2530 | source = "registry+https://github.com/rust-lang/crates.io-index" 2531 | checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 2532 | 2533 | [[package]] 2534 | name = "windows_i686_msvc" 2535 | version = "0.52.6" 2536 | source = "registry+https://github.com/rust-lang/crates.io-index" 2537 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 2538 | 2539 | [[package]] 2540 | name = "windows_x86_64_gnu" 2541 | version = "0.48.5" 2542 | source = "registry+https://github.com/rust-lang/crates.io-index" 2543 | checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 2544 | 2545 | [[package]] 2546 | name = "windows_x86_64_gnu" 2547 | version = "0.52.6" 2548 | source = "registry+https://github.com/rust-lang/crates.io-index" 2549 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 2550 | 2551 | [[package]] 2552 | name = "windows_x86_64_gnullvm" 2553 | version = "0.48.5" 2554 | source = "registry+https://github.com/rust-lang/crates.io-index" 2555 | checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 2556 | 2557 | [[package]] 2558 | name = "windows_x86_64_gnullvm" 2559 | version = "0.52.6" 2560 | source = "registry+https://github.com/rust-lang/crates.io-index" 2561 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 2562 | 2563 | [[package]] 2564 | name = "windows_x86_64_msvc" 2565 | version = "0.48.5" 2566 | source = "registry+https://github.com/rust-lang/crates.io-index" 2567 | checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 2568 | 2569 | [[package]] 2570 | name = "windows_x86_64_msvc" 2571 | version = "0.52.6" 2572 | source = "registry+https://github.com/rust-lang/crates.io-index" 2573 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 2574 | 2575 | [[package]] 2576 | name = "winreg" 2577 | version = "0.50.0" 2578 | source = "registry+https://github.com/rust-lang/crates.io-index" 2579 | checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" 2580 | dependencies = [ 2581 | "cfg-if", 2582 | "windows-sys 0.48.0", 2583 | ] 2584 | 2585 | [[package]] 2586 | name = "wit-bindgen-rt" 2587 | version = "0.33.0" 2588 | source = "registry+https://github.com/rust-lang/crates.io-index" 2589 | checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" 2590 | dependencies = [ 2591 | "bitflags 2.8.0", 2592 | ] 2593 | 2594 | [[package]] 2595 | name = "write16" 2596 | version = "1.0.0" 2597 | source = "registry+https://github.com/rust-lang/crates.io-index" 2598 | checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" 2599 | 2600 | [[package]] 2601 | name = "writeable" 2602 | version = "0.5.5" 2603 | source = "registry+https://github.com/rust-lang/crates.io-index" 2604 | checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" 2605 | 2606 | [[package]] 2607 | name = "xml-rs" 2608 | version = "0.8.25" 2609 | source = "registry+https://github.com/rust-lang/crates.io-index" 2610 | checksum = "c5b940ebc25896e71dd073bad2dbaa2abfe97b0a391415e22ad1326d9c54e3c4" 2611 | 2612 | [[package]] 2613 | name = "xmltree" 2614 | version = "0.10.3" 2615 | source = "registry+https://github.com/rust-lang/crates.io-index" 2616 | checksum = "d7d8a75eaf6557bb84a65ace8609883db44a29951042ada9b393151532e41fcb" 2617 | dependencies = [ 2618 | "xml-rs", 2619 | ] 2620 | 2621 | [[package]] 2622 | name = "yoke" 2623 | version = "0.7.5" 2624 | source = "registry+https://github.com/rust-lang/crates.io-index" 2625 | checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" 2626 | dependencies = [ 2627 | "serde", 2628 | "stable_deref_trait", 2629 | "yoke-derive", 2630 | "zerofrom", 2631 | ] 2632 | 2633 | [[package]] 2634 | name = "yoke-derive" 2635 | version = "0.7.5" 2636 | source = "registry+https://github.com/rust-lang/crates.io-index" 2637 | checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" 2638 | dependencies = [ 2639 | "proc-macro2", 2640 | "quote", 2641 | "syn", 2642 | "synstructure", 2643 | ] 2644 | 2645 | [[package]] 2646 | name = "zerocopy" 2647 | version = "0.7.35" 2648 | source = "registry+https://github.com/rust-lang/crates.io-index" 2649 | checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" 2650 | dependencies = [ 2651 | "byteorder", 2652 | "zerocopy-derive", 2653 | ] 2654 | 2655 | [[package]] 2656 | name = "zerocopy-derive" 2657 | version = "0.7.35" 2658 | source = "registry+https://github.com/rust-lang/crates.io-index" 2659 | checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" 2660 | dependencies = [ 2661 | "proc-macro2", 2662 | "quote", 2663 | "syn", 2664 | ] 2665 | 2666 | [[package]] 2667 | name = "zerofrom" 2668 | version = "0.1.5" 2669 | source = "registry+https://github.com/rust-lang/crates.io-index" 2670 | checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" 2671 | dependencies = [ 2672 | "zerofrom-derive", 2673 | ] 2674 | 2675 | [[package]] 2676 | name = "zerofrom-derive" 2677 | version = "0.1.5" 2678 | source = "registry+https://github.com/rust-lang/crates.io-index" 2679 | checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" 2680 | dependencies = [ 2681 | "proc-macro2", 2682 | "quote", 2683 | "syn", 2684 | "synstructure", 2685 | ] 2686 | 2687 | [[package]] 2688 | name = "zerovec" 2689 | version = "0.10.4" 2690 | source = "registry+https://github.com/rust-lang/crates.io-index" 2691 | checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" 2692 | dependencies = [ 2693 | "yoke", 2694 | "zerofrom", 2695 | "zerovec-derive", 2696 | ] 2697 | 2698 | [[package]] 2699 | name = "zerovec-derive" 2700 | version = "0.10.3" 2701 | source = "registry+https://github.com/rust-lang/crates.io-index" 2702 | checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" 2703 | dependencies = [ 2704 | "proc-macro2", 2705 | "quote", 2706 | "syn", 2707 | ] 2708 | --------------------------------------------------------------------------------