From b8400952477d3cf3d66535f9a913f03585176b09 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Mon, 23 Sep 2024 16:28:42 +0200 Subject: [PATCH 001/274] feat: create new 'Pythagoras' era --- mithril-common/src/era/supported_era.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mithril-common/src/era/supported_era.rs b/mithril-common/src/era/supported_era.rs index eb9a42b1481..6fd1f596e56 100644 --- a/mithril-common/src/era/supported_era.rs +++ b/mithril-common/src/era/supported_era.rs @@ -10,6 +10,9 @@ use strum::{Display, EnumIter, EnumString, IntoEnumIterator}; pub enum SupportedEra { /// Thales era Thales, + + /// Pythagoras era + Pythagoras, } impl SupportedEra { From 688d21db783c6db2396307b944f833f88b94e058 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Tue, 24 Sep 2024 09:42:48 +0200 Subject: [PATCH 002/274] docs: update CHANGELOG --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d4ab4069227..10d07eabee6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,8 @@ As a minor extension, we have adopted a slightly different versioning convention - Expose the Cardano transactions signing configuration for the current and upcoming epoch via the `/epoch-settings` route. +- Support for new `Pythagoras` Mithril era. + - Crates versions: | Crate | Version | From 9e63511c87de6916aa0d8465b600fbf4cf83538e Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Tue, 24 Sep 2024 09:43:40 +0200 Subject: [PATCH 003/274] chore: bump crates versions - 'mithril-common' from '0.4.54' to '0.4.55'. --- Cargo.lock | 2 +- mithril-common/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 42487787eba..0e0db3deb74 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3559,7 +3559,7 @@ dependencies = [ [[package]] name = "mithril-common" -version = "0.4.54" +version = "0.4.55" dependencies = [ "anyhow", "async-trait", diff --git a/mithril-common/Cargo.toml b/mithril-common/Cargo.toml index 293da6558a8..b39512628fa 100644 --- a/mithril-common/Cargo.toml +++ b/mithril-common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-common" -version = "0.4.54" +version = "0.4.55" description = "Common types, interfaces, and utilities for Mithril nodes." authors = { workspace = true } edition = { workspace = true } From bde46cf919abf3fb84488d1edb979c3c6fb1c807 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Mon, 23 Sep 2024 17:52:10 +0200 Subject: [PATCH 004/274] chore: upgrade doc dependencies By running 'make upgrade' command. --- docs/website/package-lock.json | 4326 +++++++++++--------------------- docs/website/package.json | 2 +- 2 files changed, 1515 insertions(+), 2813 deletions(-) diff --git a/docs/website/package-lock.json b/docs/website/package-lock.json index 1529ec8e35f..2849dbfe735 100644 --- a/docs/website/package-lock.json +++ b/docs/website/package-lock.json @@ -14,7 +14,7 @@ "clsx": "^2.1.1", "react": "^18.3.1", "react-dom": "^18.3.1", - "redocusaurus": "^2.1.1" + "redocusaurus": "^2.1.2" }, "devDependencies": { "prettier": "3.3.2" @@ -24,7 +24,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz", "integrity": "sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==", - "license": "MIT", "dependencies": { "@algolia/autocomplete-plugin-algolia-insights": "1.9.3", "@algolia/autocomplete-shared": "1.9.3" @@ -34,7 +33,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz", "integrity": "sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==", - "license": "MIT", "dependencies": { "@algolia/autocomplete-shared": "1.9.3" }, @@ -46,7 +44,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz", "integrity": "sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==", - "license": "MIT", "dependencies": { "@algolia/autocomplete-shared": "1.9.3" }, @@ -59,7 +56,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz", "integrity": "sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==", - "license": "MIT", "peerDependencies": { "@algolia/client-search": ">= 4.9.1 < 6", "algoliasearch": ">= 4.9.1 < 6" @@ -69,7 +65,6 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.24.0.tgz", "integrity": "sha512-t63W9BnoXVrGy9iYHBgObNXqYXM3tYXCjDSHeNwnsc324r4o5UiVKUiAB4THQ5z9U5hTj6qUvwg/Ez43ZD85ww==", - "license": "MIT", "dependencies": { "@algolia/cache-common": "4.24.0" } @@ -77,14 +72,12 @@ "node_modules/@algolia/cache-common": { "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.24.0.tgz", - "integrity": "sha512-emi+v+DmVLpMGhp0V9q9h5CdkURsNmFC+cOS6uK9ndeJm9J4TiqSvPYVu+THUP8P/S08rxf5x2P+p3CfID0Y4g==", - "license": "MIT" + "integrity": "sha512-emi+v+DmVLpMGhp0V9q9h5CdkURsNmFC+cOS6uK9ndeJm9J4TiqSvPYVu+THUP8P/S08rxf5x2P+p3CfID0Y4g==" }, "node_modules/@algolia/cache-in-memory": { "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.24.0.tgz", "integrity": "sha512-gDrt2so19jW26jY3/MkFg5mEypFIPbPoXsQGQWAi6TrCPsNOSEYepBMPlucqWigsmEy/prp5ug2jy/N3PVG/8w==", - "license": "MIT", "dependencies": { "@algolia/cache-common": "4.24.0" } @@ -93,7 +86,6 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.24.0.tgz", "integrity": "sha512-adcvyJ3KjPZFDybxlqnf+5KgxJtBjwTPTeyG2aOyoJvx0Y8dUQAEOEVOJ/GBxX0WWNbmaSrhDURMhc+QeevDsA==", - "license": "MIT", "dependencies": { "@algolia/client-common": "4.24.0", "@algolia/client-search": "4.24.0", @@ -104,7 +96,6 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", - "license": "MIT", "dependencies": { "@algolia/requester-common": "4.24.0", "@algolia/transporter": "4.24.0" @@ -114,7 +105,6 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz", "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==", - "license": "MIT", "dependencies": { "@algolia/client-common": "4.24.0", "@algolia/requester-common": "4.24.0", @@ -125,7 +115,6 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.24.0.tgz", "integrity": "sha512-y8jOZt1OjwWU4N2qr8G4AxXAzaa8DBvyHTWlHzX/7Me1LX8OayfgHexqrsL4vSBcoMmVw2XnVW9MhL+Y2ZDJXg==", - "license": "MIT", "dependencies": { "@algolia/client-common": "4.24.0", "@algolia/client-search": "4.24.0", @@ -137,7 +126,6 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", - "license": "MIT", "dependencies": { "@algolia/requester-common": "4.24.0", "@algolia/transporter": "4.24.0" @@ -147,7 +135,6 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz", "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==", - "license": "MIT", "dependencies": { "@algolia/client-common": "4.24.0", "@algolia/requester-common": "4.24.0", @@ -155,10 +142,9 @@ } }, "node_modules/@algolia/client-common": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.2.5.tgz", - "integrity": "sha512-ITE85veJWwClnoNyv7Zydh9U0eKA82cDy8pLw+2hzL+zlzFIvV68ihGOEQ/kXt8N4v+R4MFzvsxnIpMruQzEug==", - "license": "MIT", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.4.1.tgz", + "integrity": "sha512-IffPD+CETiR8YJMVC1lcjnhETLpJ2L0ORZCbbRvwo/S11D1j/keR7AqKVMn4TseRJCfjmBFOcFrC+m4sXjyQWA==", "peer": true, "engines": { "node": ">= 14.0.0" @@ -168,7 +154,6 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.24.0.tgz", "integrity": "sha512-l5FRFm/yngztweU0HdUzz1rC4yoWCFo3IF+dVIVTfEPg906eZg5BOd1k0K6rZx5JzyyoP4LdmOikfkfGsKVE9w==", - "license": "MIT", "dependencies": { "@algolia/client-common": "4.24.0", "@algolia/requester-common": "4.24.0", @@ -179,22 +164,21 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", - "license": "MIT", "dependencies": { "@algolia/requester-common": "4.24.0", "@algolia/transporter": "4.24.0" } }, "node_modules/@algolia/client-search": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.2.5.tgz", - "integrity": "sha512-OVDLzm5BEUbJmjfMm7b0Xx8vkK+NyEh7whPHuap2qy0x7RxQDLMXjiKsBbt1WNq+9nfX6+M/f2t0CJ8ENVuyYQ==", - "license": "MIT", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.4.1.tgz", + "integrity": "sha512-nCgWY2p0tZgBqJKmA5E6B3VW+7uqxi1Orf88zNWOihJBRFeOV932pzG4vGrX9l0+p0o/vJabYxuomO35rEt5dw==", "peer": true, "dependencies": { - "@algolia/client-common": "5.2.5", - "@algolia/requester-browser-xhr": "5.2.5", - "@algolia/requester-node-http": "5.2.5" + "@algolia/client-common": "5.4.1", + "@algolia/requester-browser-xhr": "5.4.1", + "@algolia/requester-fetch": "5.4.1", + "@algolia/requester-node-http": "5.4.1" }, "engines": { "node": ">= 14.0.0" @@ -203,20 +187,17 @@ "node_modules/@algolia/events": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz", - "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==", - "license": "MIT" + "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==" }, "node_modules/@algolia/logger-common": { "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.24.0.tgz", - "integrity": "sha512-LLUNjkahj9KtKYrQhFKCzMx0BY3RnNP4FEtO+sBybCjJ73E8jNdaKJ/Dd8A/VA4imVHP5tADZ8pn5B8Ga/wTMA==", - "license": "MIT" + "integrity": "sha512-LLUNjkahj9KtKYrQhFKCzMx0BY3RnNP4FEtO+sBybCjJ73E8jNdaKJ/Dd8A/VA4imVHP5tADZ8pn5B8Ga/wTMA==" }, "node_modules/@algolia/logger-console": { "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.24.0.tgz", "integrity": "sha512-X4C8IoHgHfiUROfoRCV+lzSy+LHMgkoEEU1BbKcsfnV0i0S20zyy0NLww9dwVHUWNfPPxdMU+/wKmLGYf96yTg==", - "license": "MIT", "dependencies": { "@algolia/logger-common": "4.24.0" } @@ -225,7 +206,6 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-4.24.0.tgz", "integrity": "sha512-P9kcgerfVBpfYHDfVZDvvdJv0lEoCvzNlOy2nykyt5bK8TyieYyiD0lguIJdRZZYGre03WIAFf14pgE+V+IBlw==", - "license": "MIT", "dependencies": { "@algolia/cache-browser-local-storage": "4.24.0", "@algolia/cache-common": "4.24.0", @@ -244,7 +224,6 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", - "license": "MIT", "dependencies": { "@algolia/requester-common": "4.24.0", "@algolia/transporter": "4.24.0" @@ -254,7 +233,6 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz", "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==", - "license": "MIT", "dependencies": { "@algolia/client-common": "4.24.0", "@algolia/requester-common": "4.24.0", @@ -265,7 +243,6 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.24.0.tgz", "integrity": "sha512-Z2NxZMb6+nVXSjF13YpjYTdvV3032YTBSGm2vnYvYPA6mMxzM3v5rsCiSspndn9rzIW4Qp1lPHBvuoKJV6jnAA==", - "license": "MIT", "dependencies": { "@algolia/requester-common": "4.24.0" } @@ -274,19 +251,17 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.24.0.tgz", "integrity": "sha512-JF18yTjNOVYvU/L3UosRcvbPMGT9B+/GQWNWnenIImglzNVGpyzChkXLnrSf6uxwVNO6ESGu6oN8MqcGQcjQJw==", - "license": "MIT", "dependencies": { "@algolia/requester-common": "4.24.0" } }, "node_modules/@algolia/requester-browser-xhr": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.2.5.tgz", - "integrity": "sha512-Ri73PphNy1ceig94xJW9bPdN7uIYFAjpsABpp2Fsun4DmeZD5a4rMCNwwOXXsbC8h+lUzW34zpUf+h4Nk+eaqA==", - "license": "MIT", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.4.1.tgz", + "integrity": "sha512-J6+YfU+maR0nIbsYRHoq0UpneilX97hrZzPuuvSoBojQmPo8PeCXKGeT/F0D8uFI6G4CMTKEPGmQYrC9IpCbcQ==", "peer": true, "dependencies": { - "@algolia/client-common": "5.2.5" + "@algolia/client-common": "5.4.1" }, "engines": { "node": ">= 14.0.0" @@ -295,17 +270,27 @@ "node_modules/@algolia/requester-common": { "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.24.0.tgz", - "integrity": "sha512-k3CXJ2OVnvgE3HMwcojpvY6d9kgKMPRxs/kVohrwF5WMr2fnqojnycZkxPoEg+bXm8fi5BBfFmOqgYztRtHsQA==", - "license": "MIT" + "integrity": "sha512-k3CXJ2OVnvgE3HMwcojpvY6d9kgKMPRxs/kVohrwF5WMr2fnqojnycZkxPoEg+bXm8fi5BBfFmOqgYztRtHsQA==" + }, + "node_modules/@algolia/requester-fetch": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.4.1.tgz", + "integrity": "sha512-AO/C1pqqpIS8p2IsfM5x92S+UBKkcIen5dHfMEh1rnV0ArWDreeqrtxMD2A+6AjQVwYeZNy56w7o7PVIm6mc8g==", + "peer": true, + "dependencies": { + "@algolia/client-common": "5.4.1" + }, + "engines": { + "node": ">= 14.0.0" + } }, "node_modules/@algolia/requester-node-http": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.2.5.tgz", - "integrity": "sha512-/tTdEuWcWHSe/mGMomWkuaFDoRcpfl/jvGISVTPRq3pJvM1FPAzxlh2MXge6C30aUS9bxh3V0aWwgKFCilzyMQ==", - "license": "MIT", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.4.1.tgz", + "integrity": "sha512-2Y3vffc91egwFxz0SjXFEH4q8nvlNJHcz+0//NaWItRU68AvD+3aI/j66STPjkLQOC0Ku6ckA9ChhbOVfrv+Uw==", "peer": true, "dependencies": { - "@algolia/client-common": "5.2.5" + "@algolia/client-common": "5.4.1" }, "engines": { "node": ">= 14.0.0" @@ -315,7 +300,6 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.24.0.tgz", "integrity": "sha512-86nI7w6NzWxd1Zp9q3413dRshDqAzSbsQjhcDhPIatEFiZrL1/TjnHL8S7jVKFePlIMzDsZWXAXwXzcok9c5oA==", - "license": "MIT", "dependencies": { "@algolia/cache-common": "4.24.0", "@algolia/logger-common": "4.24.0", @@ -324,8 +308,7 @@ }, "node_modules/@ampproject/remapping": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" @@ -336,8 +319,7 @@ }, "node_modules/@babel/code-frame": { "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", - "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "license": "MIT", "dependencies": { "@babel/highlight": "^7.24.2", "picocolors": "^1.0.0" @@ -347,28 +329,26 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", - "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", + "version": "7.24.1", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.5.tgz", - "integrity": "sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==", + "version": "7.24.3", + "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.5", + "@babel/generator": "^7.24.1", "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.24.5", - "@babel/helpers": "^7.24.5", - "@babel/parser": "^7.24.5", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.24.1", + "@babel/parser": "^7.24.1", "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.5", - "@babel/types": "^7.24.5", + "@babel/traverse": "^7.24.1", + "@babel/types": "^7.24.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -385,18 +365,16 @@ }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.5.tgz", - "integrity": "sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==", + "version": "7.24.1", + "license": "MIT", "dependencies": { - "@babel/types": "^7.24.5", + "@babel/types": "^7.24.0", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -407,8 +385,7 @@ }, "node_modules/@babel/helper-annotate-as-pure": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "license": "MIT", "dependencies": { "@babel/types": "^7.22.5" }, @@ -418,8 +395,7 @@ }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", - "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "license": "MIT", "dependencies": { "@babel/types": "^7.22.15" }, @@ -429,8 +405,7 @@ }, "node_modules/@babel/helper-compilation-targets": { "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "license": "MIT", "dependencies": { "@babel/compat-data": "^7.23.5", "@babel/helper-validator-option": "^7.23.5", @@ -444,25 +419,23 @@ }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.5.tgz", - "integrity": "sha512-uRc4Cv8UQWnE4NXlYTIIdM7wfFkOqlFztcC/gVXDKohKoVB3OyonfelUBaJzSwpBntZ2KYGF/9S7asCHsXwW6g==", + "version": "7.24.1", + "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", - "@babel/helper-member-expression-to-functions": "^7.24.5", + "@babel/helper-member-expression-to-functions": "^7.23.0", "@babel/helper-optimise-call-expression": "^7.22.5", "@babel/helper-replace-supers": "^7.24.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.24.5", + "@babel/helper-split-export-declaration": "^7.22.6", "semver": "^6.3.1" }, "engines": { @@ -474,16 +447,14 @@ }, "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-create-regexp-features-plugin": { "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", - "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "regexpu-core": "^5.3.1", @@ -498,16 +469,14 @@ }, "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", - "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", + "version": "0.6.1", + "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", "@babel/helper-plugin-utils": "^7.22.5", @@ -521,16 +490,14 @@ }, "node_modules/@babel/helper-environment-visitor": { "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "license": "MIT", "dependencies": { "@babel/template": "^7.22.15", "@babel/types": "^7.23.0" @@ -541,8 +508,7 @@ }, "node_modules/@babel/helper-hoist-variables": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "license": "MIT", "dependencies": { "@babel/types": "^7.22.5" }, @@ -551,11 +517,10 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.5.tgz", - "integrity": "sha512-4owRteeihKWKamtqg4JmWSsEZU445xpFRXPEwp44HbgbxdWlUV1b4Agg4lkA806Lil5XM/e+FJyS0vj5T6vmcA==", + "version": "7.23.0", + "license": "MIT", "dependencies": { - "@babel/types": "^7.24.5" + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" @@ -563,8 +528,7 @@ }, "node_modules/@babel/helper-module-imports": { "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", - "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", + "license": "MIT", "dependencies": { "@babel/types": "^7.24.0" }, @@ -573,15 +537,14 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz", - "integrity": "sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==", + "version": "7.23.3", + "license": "MIT", "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.24.3", - "@babel/helper-simple-access": "^7.24.5", - "@babel/helper-split-export-declaration": "^7.24.5", - "@babel/helper-validator-identifier": "^7.24.5" + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -592,8 +555,7 @@ }, "node_modules/@babel/helper-optimise-call-expression": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "license": "MIT", "dependencies": { "@babel/types": "^7.22.5" }, @@ -602,17 +564,16 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz", - "integrity": "sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz", + "integrity": "sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", - "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-environment-visitor": "^7.22.20", @@ -627,8 +588,7 @@ }, "node_modules/@babel/helper-replace-supers": { "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz", - "integrity": "sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==", + "license": "MIT", "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-member-expression-to-functions": "^7.23.0", @@ -642,11 +602,10 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz", - "integrity": "sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==", + "version": "7.22.5", + "license": "MIT", "dependencies": { - "@babel/types": "^7.24.5" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -654,8 +613,7 @@ }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "license": "MIT", "dependencies": { "@babel/types": "^7.22.5" }, @@ -664,11 +622,10 @@ } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz", - "integrity": "sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==", + "version": "7.22.6", + "license": "MIT", "dependencies": { - "@babel/types": "^7.24.5" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -676,60 +633,54 @@ }, "node_modules/@babel/helper-string-parser": { "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", - "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz", - "integrity": "sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==", + "version": "7.22.20", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.5.tgz", - "integrity": "sha512-/xxzuNvgRl4/HLNKvnFwdhdgN3cpLxgLROeLDl83Yx0AJ1SGvq1ak0OszTOjDfiB8Vx03eJbeDWh9r+jCCWttw==", + "version": "7.22.20", + "license": "MIT", "dependencies": { - "@babel/helper-function-name": "^7.23.0", - "@babel/template": "^7.24.0", - "@babel/types": "^7.24.5" + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.19" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.5.tgz", - "integrity": "sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==", + "version": "7.24.1", + "license": "MIT", "dependencies": { "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.5", - "@babel/types": "^7.24.5" + "@babel/traverse": "^7.24.1", + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.5.tgz", - "integrity": "sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==", + "version": "7.24.2", + "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.24.5", + "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" @@ -740,8 +691,7 @@ }, "node_modules/@babel/highlight/node_modules/ansi-styles": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -751,8 +701,7 @@ }, "node_modules/@babel/highlight/node_modules/chalk": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -764,37 +713,32 @@ }, "node_modules/@babel/highlight/node_modules/color-convert": { "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", "dependencies": { "color-name": "1.1.3" } }, "node_modules/@babel/highlight/node_modules/color-name": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + "license": "MIT" }, "node_modules/@babel/highlight/node_modules/escape-string-regexp": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", "engines": { "node": ">=0.8.0" } }, "node_modules/@babel/highlight/node_modules/has-flag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/@babel/highlight/node_modules/supports-color": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -803,9 +747,8 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz", - "integrity": "sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==", + "version": "7.24.1", + "license": "MIT", "bin": { "parser": "bin/babel-parser.js" }, @@ -813,25 +756,9 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.5.tgz", - "integrity": "sha512-LdXRi1wEMTrHVR4Zc9F8OewC3vdm5h4QB6L71zy6StmYeqGi1b3ttIO8UC+BfZKcH9jdr4aI249rBkm+3+YvHw==", - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz", - "integrity": "sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.0" }, @@ -844,8 +771,7 @@ }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz", - "integrity": "sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", @@ -860,8 +786,7 @@ }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz", - "integrity": "sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==", + "license": "MIT", "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-plugin-utils": "^7.24.0" @@ -875,8 +800,7 @@ }, "node_modules/@babel/plugin-proposal-private-property-in-object": { "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "license": "MIT", "engines": { "node": ">=6.9.0" }, @@ -886,8 +810,7 @@ }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -897,8 +820,7 @@ }, "node_modules/@babel/plugin-syntax-class-properties": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, @@ -908,8 +830,7 @@ }, "node_modules/@babel/plugin-syntax-class-static-block": { "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -922,8 +843,7 @@ }, "node_modules/@babel/plugin-syntax-dynamic-import": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -933,8 +853,7 @@ }, "node_modules/@babel/plugin-syntax-export-namespace-from": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.3" }, @@ -944,8 +863,7 @@ }, "node_modules/@babel/plugin-syntax-import-assertions": { "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz", - "integrity": "sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.0" }, @@ -958,8 +876,7 @@ }, "node_modules/@babel/plugin-syntax-import-attributes": { "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz", - "integrity": "sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.0" }, @@ -972,8 +889,7 @@ }, "node_modules/@babel/plugin-syntax-import-meta": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -983,8 +899,7 @@ }, "node_modules/@babel/plugin-syntax-json-strings": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -994,8 +909,7 @@ }, "node_modules/@babel/plugin-syntax-jsx": { "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz", - "integrity": "sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.0" }, @@ -1008,8 +922,7 @@ }, "node_modules/@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -1019,8 +932,7 @@ }, "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1030,8 +942,7 @@ }, "node_modules/@babel/plugin-syntax-numeric-separator": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -1041,8 +952,7 @@ }, "node_modules/@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1052,8 +962,7 @@ }, "node_modules/@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1063,8 +972,7 @@ }, "node_modules/@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1074,8 +982,7 @@ }, "node_modules/@babel/plugin-syntax-private-property-in-object": { "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -1088,8 +995,7 @@ }, "node_modules/@babel/plugin-syntax-top-level-await": { "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -1102,8 +1008,7 @@ }, "node_modules/@babel/plugin-syntax-typescript": { "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz", - "integrity": "sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.0" }, @@ -1116,8 +1021,7 @@ }, "node_modules/@babel/plugin-syntax-unicode-sets-regex": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -1131,8 +1035,7 @@ }, "node_modules/@babel/plugin-transform-arrow-functions": { "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz", - "integrity": "sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.0" }, @@ -1145,8 +1048,7 @@ }, "node_modules/@babel/plugin-transform-async-generator-functions": { "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz", - "integrity": "sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==", + "license": "MIT", "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-plugin-utils": "^7.24.0", @@ -1162,8 +1064,7 @@ }, "node_modules/@babel/plugin-transform-async-to-generator": { "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz", - "integrity": "sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==", + "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.24.1", "@babel/helper-plugin-utils": "^7.24.0", @@ -1178,8 +1079,7 @@ }, "node_modules/@babel/plugin-transform-block-scoped-functions": { "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz", - "integrity": "sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.0" }, @@ -1191,11 +1091,10 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.5.tgz", - "integrity": "sha512-sMfBc3OxghjC95BkYrYocHL3NaOplrcaunblzwXhGmlPwpmfsxr4vK+mBBt49r+S240vahmv+kUxkeKgs+haCw==", + "version": "7.24.1", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1206,8 +1105,7 @@ }, "node_modules/@babel/plugin-transform-class-properties": { "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz", - "integrity": "sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==", + "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.24.1", "@babel/helper-plugin-utils": "^7.24.0" @@ -1220,11 +1118,10 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz", - "integrity": "sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==", + "version": "7.24.1", + "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.4", + "@babel/helper-create-class-features-plugin": "^7.24.1", "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, @@ -1236,17 +1133,16 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.5.tgz", - "integrity": "sha512-gWkLP25DFj2dwe9Ck8uwMOpko4YsqyfZJrOmqqcegeDYEbp7rmn4U6UQZNj08UF6MaX39XenSpKRCvpDRBtZ7Q==", + "version": "7.24.1", + "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.24.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-replace-supers": "^7.24.1", - "@babel/helper-split-export-declaration": "^7.24.5", + "@babel/helper-split-export-declaration": "^7.22.6", "globals": "^11.1.0" }, "engines": { @@ -1258,8 +1154,7 @@ }, "node_modules/@babel/plugin-transform-computed-properties": { "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz", - "integrity": "sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.0", "@babel/template": "^7.24.0" @@ -1272,11 +1167,10 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.5.tgz", - "integrity": "sha512-SZuuLyfxvsm+Ah57I/i1HVjveBENYK9ue8MJ7qkc7ndoNjqquJiElzA7f5yaAXjyW2hKojosOTAQQRX50bPSVg==", + "version": "7.24.1", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1287,8 +1181,7 @@ }, "node_modules/@babel/plugin-transform-dotall-regex": { "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz", - "integrity": "sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==", + "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.24.0" @@ -1302,8 +1195,7 @@ }, "node_modules/@babel/plugin-transform-duplicate-keys": { "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz", - "integrity": "sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.0" }, @@ -1316,8 +1208,7 @@ }, "node_modules/@babel/plugin-transform-dynamic-import": { "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz", - "integrity": "sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-dynamic-import": "^7.8.3" @@ -1331,8 +1222,7 @@ }, "node_modules/@babel/plugin-transform-exponentiation-operator": { "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz", - "integrity": "sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==", + "license": "MIT", "dependencies": { "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", "@babel/helper-plugin-utils": "^7.24.0" @@ -1346,8 +1236,7 @@ }, "node_modules/@babel/plugin-transform-export-namespace-from": { "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz", - "integrity": "sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" @@ -1361,8 +1250,7 @@ }, "node_modules/@babel/plugin-transform-for-of": { "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz", - "integrity": "sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" @@ -1376,8 +1264,7 @@ }, "node_modules/@babel/plugin-transform-function-name": { "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz", - "integrity": "sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==", + "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-function-name": "^7.23.0", @@ -1392,8 +1279,7 @@ }, "node_modules/@babel/plugin-transform-json-strings": { "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz", - "integrity": "sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-json-strings": "^7.8.3" @@ -1407,8 +1293,7 @@ }, "node_modules/@babel/plugin-transform-literals": { "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz", - "integrity": "sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.0" }, @@ -1421,8 +1306,7 @@ }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz", - "integrity": "sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" @@ -1436,8 +1320,7 @@ }, "node_modules/@babel/plugin-transform-member-expression-literals": { "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz", - "integrity": "sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.0" }, @@ -1450,8 +1333,7 @@ }, "node_modules/@babel/plugin-transform-modules-amd": { "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz", - "integrity": "sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==", + "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.23.3", "@babel/helper-plugin-utils": "^7.24.0" @@ -1465,8 +1347,7 @@ }, "node_modules/@babel/plugin-transform-modules-commonjs": { "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz", - "integrity": "sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==", + "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.23.3", "@babel/helper-plugin-utils": "^7.24.0", @@ -1481,8 +1362,7 @@ }, "node_modules/@babel/plugin-transform-modules-systemjs": { "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz", - "integrity": "sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==", + "license": "MIT", "dependencies": { "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-module-transforms": "^7.23.3", @@ -1498,8 +1378,7 @@ }, "node_modules/@babel/plugin-transform-modules-umd": { "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz", - "integrity": "sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==", + "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.23.3", "@babel/helper-plugin-utils": "^7.24.0" @@ -1513,8 +1392,7 @@ }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5" @@ -1528,8 +1406,7 @@ }, "node_modules/@babel/plugin-transform-new-target": { "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz", - "integrity": "sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.0" }, @@ -1542,8 +1419,7 @@ }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz", - "integrity": "sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" @@ -1557,8 +1433,7 @@ }, "node_modules/@babel/plugin-transform-numeric-separator": { "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz", - "integrity": "sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-numeric-separator": "^7.10.4" @@ -1571,14 +1446,13 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.5.tgz", - "integrity": "sha512-7EauQHszLGM3ay7a161tTQH7fj+3vVM/gThlz5HpFtnygTxjrlvoeq7MPVA1Vy9Q555OB8SnAOsMkLShNkkrHA==", + "version": "7.24.1", + "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.24.5" + "@babel/plugin-transform-parameters": "^7.24.1" }, "engines": { "node": ">=6.9.0" @@ -1589,8 +1463,7 @@ }, "node_modules/@babel/plugin-transform-object-super": { "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz", - "integrity": "sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-replace-supers": "^7.24.1" @@ -1604,8 +1477,7 @@ }, "node_modules/@babel/plugin-transform-optional-catch-binding": { "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz", - "integrity": "sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" @@ -1618,11 +1490,10 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.5.tgz", - "integrity": "sha512-xWCkmwKT+ihmA6l7SSTpk8e4qQl/274iNbSKRRS8mpqFR32ksy36+a+LWY8OXCCEefF8WFlnOHVsaDI2231wBg==", + "version": "7.24.1", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, @@ -1634,11 +1505,10 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.5.tgz", - "integrity": "sha512-9Co00MqZ2aoky+4j2jhofErthm6QVLKbpQrvz20c3CH9KQCLHyNB+t2ya4/UrRpQGR+Wrwjg9foopoeSdnHOkA==", + "version": "7.24.1", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1649,8 +1519,7 @@ }, "node_modules/@babel/plugin-transform-private-methods": { "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz", - "integrity": "sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==", + "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.24.1", "@babel/helper-plugin-utils": "^7.24.0" @@ -1663,13 +1532,12 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.5.tgz", - "integrity": "sha512-JM4MHZqnWR04jPMujQDTBVRnqxpLLpx2tkn7iPn+Hmsc0Gnb79yvRWOkvqFOx3Z7P7VxiRIR22c4eGSNj87OBQ==", + "version": "7.24.1", + "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.24.5", - "@babel/helper-plugin-utils": "^7.24.5", + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -1681,8 +1549,7 @@ }, "node_modules/@babel/plugin-transform-property-literals": { "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz", - "integrity": "sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.0" }, @@ -1694,11 +1561,11 @@ } }, "node_modules/@babel/plugin-transform-react-constant-elements": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.24.1.tgz", - "integrity": "sha512-QXp1U9x0R7tkiGB0FOk8o74jhnap0FlZ5gNkRIWdG3eP+SvMFg118e1zaWewDzgABb106QSKpVsD3Wgd8t6ifA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.24.7.tgz", + "integrity": "sha512-7LidzZfUXyfZ8/buRW6qIIHBY8wAZ1OrY9c/wTr8YhZ6vMPo+Uc/CVFLYY1spZrEQlD4w5u8wjqk5NQ3OVqQKA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1709,8 +1576,7 @@ }, "node_modules/@babel/plugin-transform-react-display-name": { "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.1.tgz", - "integrity": "sha512-mvoQg2f9p2qlpDQRBC7M3c3XTr0k7cp/0+kFKKO/7Gtu0LSw16eKB+Fabe2bDT/UpsyasTBBkAnbdsLrkD5XMw==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.0" }, @@ -1723,8 +1589,7 @@ }, "node_modules/@babel/plugin-transform-react-jsx": { "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz", - "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==", + "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-module-imports": "^7.22.15", @@ -1741,8 +1606,7 @@ }, "node_modules/@babel/plugin-transform-react-jsx-development": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", - "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", + "license": "MIT", "dependencies": { "@babel/plugin-transform-react-jsx": "^7.22.5" }, @@ -1755,8 +1619,7 @@ }, "node_modules/@babel/plugin-transform-react-pure-annotations": { "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.1.tgz", - "integrity": "sha512-+pWEAaDJvSm9aFvJNpLiM2+ktl2Sn2U5DdyiWdZBxmLc6+xGt88dvFqsHiAiDS+8WqUwbDfkKz9jRxK3M0k+kA==", + "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-plugin-utils": "^7.24.0" @@ -1770,8 +1633,7 @@ }, "node_modules/@babel/plugin-transform-regenerator": { "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz", - "integrity": "sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.0", "regenerator-transform": "^0.15.2" @@ -1785,8 +1647,7 @@ }, "node_modules/@babel/plugin-transform-reserved-words": { "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz", - "integrity": "sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.0" }, @@ -1799,8 +1660,7 @@ }, "node_modules/@babel/plugin-transform-runtime": { "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.3.tgz", - "integrity": "sha512-J0BuRPNlNqlMTRJ72eVptpt9VcInbxO6iP3jaxr+1NPhC0UkKL+6oeX6VXMEYdADnuqmMmsBspt4d5w8Y/TCbQ==", + "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.24.3", "@babel/helper-plugin-utils": "^7.24.0", @@ -1818,16 +1678,14 @@ }, "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/plugin-transform-shorthand-properties": { "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz", - "integrity": "sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.0" }, @@ -1840,8 +1698,7 @@ }, "node_modules/@babel/plugin-transform-spread": { "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz", - "integrity": "sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" @@ -1855,8 +1712,7 @@ }, "node_modules/@babel/plugin-transform-sticky-regex": { "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz", - "integrity": "sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.0" }, @@ -1869,8 +1725,7 @@ }, "node_modules/@babel/plugin-transform-template-literals": { "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz", - "integrity": "sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.0" }, @@ -1882,11 +1737,10 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.5.tgz", - "integrity": "sha512-UTGnhYVZtTAjdwOTzT+sCyXmTn8AhaxOS/MjG9REclZ6ULHWF9KoCZur0HSGU7hk8PdBFKKbYe6+gqdXWz84Jg==", + "version": "7.24.1", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1896,13 +1750,12 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.5.tgz", - "integrity": "sha512-E0VWu/hk83BIFUWnsKZ4D81KXjN5L3MobvevOHErASk9IPwKHOkTgvqzvNo1yP/ePJWqqK2SpUR5z+KQbl6NVw==", + "version": "7.24.1", + "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.24.5", - "@babel/helper-plugin-utils": "^7.24.5", + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-typescript": "^7.24.1" }, "engines": { @@ -1914,8 +1767,7 @@ }, "node_modules/@babel/plugin-transform-unicode-escapes": { "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz", - "integrity": "sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.0" }, @@ -1928,8 +1780,7 @@ }, "node_modules/@babel/plugin-transform-unicode-property-regex": { "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz", - "integrity": "sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==", + "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.24.0" @@ -1943,8 +1794,7 @@ }, "node_modules/@babel/plugin-transform-unicode-regex": { "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz", - "integrity": "sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==", + "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.24.0" @@ -1958,8 +1808,7 @@ }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz", - "integrity": "sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==", + "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.24.0" @@ -1972,15 +1821,13 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.5.tgz", - "integrity": "sha512-UGK2ifKtcC8i5AI4cH+sbLLuLc2ktYSFJgBAXorKAsHUZmrQ1q6aQ6i3BvU24wWs2AAKqQB6kq3N9V9Gw1HiMQ==", + "version": "7.24.3", + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.24.4", + "@babel/compat-data": "^7.24.1", "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.5", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.1", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.1", "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.1", @@ -2007,12 +1854,12 @@ "@babel/plugin-transform-async-generator-functions": "^7.24.3", "@babel/plugin-transform-async-to-generator": "^7.24.1", "@babel/plugin-transform-block-scoped-functions": "^7.24.1", - "@babel/plugin-transform-block-scoping": "^7.24.5", + "@babel/plugin-transform-block-scoping": "^7.24.1", "@babel/plugin-transform-class-properties": "^7.24.1", - "@babel/plugin-transform-class-static-block": "^7.24.4", - "@babel/plugin-transform-classes": "^7.24.5", + "@babel/plugin-transform-class-static-block": "^7.24.1", + "@babel/plugin-transform-classes": "^7.24.1", "@babel/plugin-transform-computed-properties": "^7.24.1", - "@babel/plugin-transform-destructuring": "^7.24.5", + "@babel/plugin-transform-destructuring": "^7.24.1", "@babel/plugin-transform-dotall-regex": "^7.24.1", "@babel/plugin-transform-duplicate-keys": "^7.24.1", "@babel/plugin-transform-dynamic-import": "^7.24.1", @@ -2032,13 +1879,13 @@ "@babel/plugin-transform-new-target": "^7.24.1", "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1", "@babel/plugin-transform-numeric-separator": "^7.24.1", - "@babel/plugin-transform-object-rest-spread": "^7.24.5", + "@babel/plugin-transform-object-rest-spread": "^7.24.1", "@babel/plugin-transform-object-super": "^7.24.1", "@babel/plugin-transform-optional-catch-binding": "^7.24.1", - "@babel/plugin-transform-optional-chaining": "^7.24.5", - "@babel/plugin-transform-parameters": "^7.24.5", + "@babel/plugin-transform-optional-chaining": "^7.24.1", + "@babel/plugin-transform-parameters": "^7.24.1", "@babel/plugin-transform-private-methods": "^7.24.1", - "@babel/plugin-transform-private-property-in-object": "^7.24.5", + "@babel/plugin-transform-private-property-in-object": "^7.24.1", "@babel/plugin-transform-property-literals": "^7.24.1", "@babel/plugin-transform-regenerator": "^7.24.1", "@babel/plugin-transform-reserved-words": "^7.24.1", @@ -2046,7 +1893,7 @@ "@babel/plugin-transform-spread": "^7.24.1", "@babel/plugin-transform-sticky-regex": "^7.24.1", "@babel/plugin-transform-template-literals": "^7.24.1", - "@babel/plugin-transform-typeof-symbol": "^7.24.5", + "@babel/plugin-transform-typeof-symbol": "^7.24.1", "@babel/plugin-transform-unicode-escapes": "^7.24.1", "@babel/plugin-transform-unicode-property-regex": "^7.24.1", "@babel/plugin-transform-unicode-regex": "^7.24.1", @@ -2067,16 +1914,14 @@ }, "node_modules/@babel/preset-env/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/preset-modules": { "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/types": "^7.4.4", @@ -2088,8 +1933,7 @@ }, "node_modules/@babel/preset-react": { "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.24.1.tgz", - "integrity": "sha512-eFa8up2/8cZXLIpkafhaADTXSnl7IsUFCYenRWrARBz0/qZwcT0RBXpys0LJU4+WfPoF2ZG6ew6s2V6izMCwRA==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-validator-option": "^7.23.5", @@ -2107,8 +1951,7 @@ }, "node_modules/@babel/preset-typescript": { "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.1.tgz", - "integrity": "sha512-1DBaMmRDpuYQBPWD8Pf/WEwCrtgRHxsZnP4mIy9G/X+hFfbI47Q2G4t1Paakld84+qsk2fSsUPMKg71jkoOOaQ==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-validator-option": "^7.23.5", @@ -2125,13 +1968,11 @@ }, "node_modules/@babel/regjsgen": { "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" + "license": "MIT" }, "node_modules/@babel/runtime": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.5.tgz", - "integrity": "sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==", + "version": "7.24.1", + "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -2140,9 +1981,8 @@ } }, "node_modules/@babel/runtime-corejs3": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.24.5.tgz", - "integrity": "sha512-GWO0mgzNMLWaSYM4z4NVIuY0Cd1fl8cPnuetuddu5w/qGuvt5Y7oUi/kvvQGK9xgOkFJDQX2heIvTRn/OQ1XTg==", + "version": "7.24.1", + "license": "MIT", "dependencies": { "core-js-pure": "^3.30.2", "regenerator-runtime": "^0.14.0" @@ -2153,8 +1993,7 @@ }, "node_modules/@babel/template": { "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", - "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.23.5", "@babel/parser": "^7.24.0", @@ -2165,18 +2004,17 @@ } }, "node_modules/@babel/traverse": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.5.tgz", - "integrity": "sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==", + "version": "7.24.1", + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.5", + "@babel/code-frame": "^7.24.1", + "@babel/generator": "^7.24.1", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.24.5", - "@babel/parser": "^7.24.5", - "@babel/types": "^7.24.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.24.1", + "@babel/types": "^7.24.0", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -2185,12 +2023,11 @@ } }, "node_modules/@babel/types": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz", - "integrity": "sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==", + "version": "7.24.0", + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.24.1", - "@babel/helper-validator-identifier": "^7.24.5", + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { @@ -2199,14 +2036,12 @@ }, "node_modules/@braintree/sanitize-url": { "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.4.tgz", - "integrity": "sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==" + "license": "MIT" }, "node_modules/@cfaester/enzyme-adapter-react-18": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/@cfaester/enzyme-adapter-react-18/-/enzyme-adapter-react-18-0.8.0.tgz", "integrity": "sha512-3Z3ThTUouHwz8oIyhTYQljEMNRFtlVyc3VOOHCbxs47U6cnXs8K9ygi/c1tv49s7MBlTXeIcuN+Ttd9aPtILFQ==", - "license": "MIT", "dependencies": { "enzyme-shallow-equal": "^1.0.0", "function.prototype.name": "^1.1.6", @@ -2223,13 +2058,11 @@ "node_modules/@cfaester/enzyme-adapter-react-18/node_modules/react-is": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "license": "MIT" + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" }, "node_modules/@colors/colors": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "license": "MIT", "optional": true, "engines": { "node": ">=0.1.90" @@ -2237,8 +2070,7 @@ }, "node_modules/@discoveryjs/json-ext": { "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "license": "MIT", "engines": { "node": ">=10.0.0" } @@ -2246,14 +2078,12 @@ "node_modules/@docsearch/css": { "version": "3.6.1", "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.6.1.tgz", - "integrity": "sha512-VtVb5DS+0hRIprU2CO6ZQjK2Zg4QU5HrDM1+ix6rT0umsYvFvatMAnf97NHZlVWDaaLlx7GRfR/7FikANiM2Fg==", - "license": "MIT" + "integrity": "sha512-VtVb5DS+0hRIprU2CO6ZQjK2Zg4QU5HrDM1+ix6rT0umsYvFvatMAnf97NHZlVWDaaLlx7GRfR/7FikANiM2Fg==" }, "node_modules/@docsearch/react": { "version": "3.6.1", "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.6.1.tgz", "integrity": "sha512-qXZkEPvybVhSXj0K7U3bXc233tk5e8PfhoZ6MhPOiik/qUQxYC+Dn9DnoS7CxHQQhHfCvTiN0eY9M12oRghEXw==", - "license": "MIT", "dependencies": { "@algolia/autocomplete-core": "1.9.3", "@algolia/autocomplete-preset-algolia": "1.9.3", @@ -2285,7 +2115,6 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.5.2.tgz", "integrity": "sha512-4Z1WkhCSkX4KO0Fw5m/Vuc7Q3NxBG53NE5u59Rs96fWkMPZVSrzEPP16/Nk6cWb/shK7xXPndTmalJtw7twL/w==", - "license": "MIT", "dependencies": { "@babel/core": "^7.23.3", "@babel/generator": "^7.23.3", @@ -2372,7 +2201,6 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.5.2.tgz", "integrity": "sha512-D3KiQXOMA8+O0tqORBrTOEQyQxNIfPm9jEaJoALjjSjc2M/ZAWcUfPQEnwr2JB2TadHw2gqWgpZckQmrVWkytA==", - "license": "MIT", "dependencies": { "cssnano-preset-advanced": "^6.1.2", "postcss": "^8.4.38", @@ -2387,7 +2215,6 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.5.2.tgz", "integrity": "sha512-LHC540SGkeLfyT3RHK3gAMK6aS5TRqOD4R72BEU/DE2M/TY8WwEUAMY576UUc/oNJXv8pGhBmQB6N9p3pt8LQw==", - "license": "MIT", "dependencies": { "chalk": "^4.1.2", "tslib": "^2.6.0" @@ -2400,7 +2227,6 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.5.2.tgz", "integrity": "sha512-ku3xO9vZdwpiMIVd8BzWV0DCqGEbCP5zs1iHfKX50vw6jX8vQo0ylYo1YJMZyz6e+JFJ17HYHT5FzVidz2IflA==", - "license": "MIT", "dependencies": { "@docusaurus/logger": "3.5.2", "@docusaurus/utils": "3.5.2", @@ -2439,7 +2265,6 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.5.2.tgz", "integrity": "sha512-Z+Xu3+2rvKef/YKTMxZHsEXp1y92ac0ngjDiExRdqGTmEKtCUpkbNYH8v5eXo5Ls+dnW88n6WTa+Q54kLOkwPg==", - "license": "MIT", "dependencies": { "@docusaurus/types": "3.5.2", "@types/history": "^4.7.11", @@ -2458,7 +2283,6 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.5.2.tgz", "integrity": "sha512-R7ghWnMvjSf+aeNDH0K4fjyQnt5L0KzUEnUhmf1e3jZrv3wogeytZNN6n7X8yHcMsuZHPOrctQhXWnmxu+IRRg==", - "license": "MIT", "dependencies": { "@docusaurus/core": "3.5.2", "@docusaurus/logger": "3.5.2", @@ -2492,7 +2316,6 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.5.2.tgz", "integrity": "sha512-Bt+OXn/CPtVqM3Di44vHjE7rPCEsRCB/DMo2qoOuozB9f7+lsdrHvD0QCHdBs0uhz6deYJDppAr2VgqybKPlVQ==", - "license": "MIT", "dependencies": { "@docusaurus/core": "3.5.2", "@docusaurus/logger": "3.5.2", @@ -2524,7 +2347,6 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.5.2.tgz", "integrity": "sha512-WzhHjNpoQAUz/ueO10cnundRz+VUtkjFhhaQ9jApyv1a46FPURO4cef89pyNIOMny1fjDz/NUN2z6Yi+5WUrCw==", - "license": "MIT", "dependencies": { "@docusaurus/core": "3.5.2", "@docusaurus/mdx-loader": "3.5.2", @@ -2547,7 +2369,6 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.5.2.tgz", "integrity": "sha512-kBK6GlN0itCkrmHuCS6aX1wmoWc5wpd5KJlqQ1FyrF0cLDnvsYSnh7+ftdwzt7G6lGBho8lrVwkkL9/iQvaSOA==", - "license": "MIT", "dependencies": { "@docusaurus/core": "3.5.2", "@docusaurus/types": "3.5.2", @@ -2568,7 +2389,6 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.5.2.tgz", "integrity": "sha512-rjEkJH/tJ8OXRE9bwhV2mb/WP93V441rD6XnM6MIluu7rk8qg38iSxS43ga2V2Q/2ib53PcqbDEJDG/yWQRJhQ==", - "license": "MIT", "dependencies": { "@docusaurus/core": "3.5.2", "@docusaurus/types": "3.5.2", @@ -2587,7 +2407,6 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.5.2.tgz", "integrity": "sha512-lm8XL3xLkTPHFKKjLjEEAHUrW0SZBSHBE1I+i/tmYMBsjCcUB5UJ52geS5PSiOCFVR74tbPGcPHEV/gaaxFeSA==", - "license": "MIT", "dependencies": { "@docusaurus/core": "3.5.2", "@docusaurus/types": "3.5.2", @@ -2607,7 +2426,6 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.5.2.tgz", "integrity": "sha512-QkpX68PMOMu10Mvgvr5CfZAzZQFx8WLlOiUQ/Qmmcl6mjGK6H21WLT5x7xDmcpCoKA/3CegsqIqBR+nA137lQg==", - "license": "MIT", "dependencies": { "@docusaurus/core": "3.5.2", "@docusaurus/types": "3.5.2", @@ -2626,7 +2444,6 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.5.2.tgz", "integrity": "sha512-DnlqYyRAdQ4NHY28TfHuVk414ft2uruP4QWCH//jzpHjqvKyXjj2fmDtI8RPUBh9K8iZKFMHRnLtzJKySPWvFA==", - "license": "MIT", "dependencies": { "@docusaurus/core": "3.5.2", "@docusaurus/logger": "3.5.2", @@ -2650,7 +2467,6 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.5.2.tgz", "integrity": "sha512-3ihfXQ95aOHiLB5uCu+9PRy2gZCeSZoDcqpnDvf3B+sTrMvMTr8qRUzBvWkoIqc82yG5prCboRjk1SVILKx6sg==", - "license": "MIT", "dependencies": { "@docusaurus/core": "3.5.2", "@docusaurus/plugin-content-blog": "3.5.2", @@ -2678,7 +2494,6 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.5.2.tgz", "integrity": "sha512-XRpinSix3NBv95Rk7xeMF9k4safMkwnpSgThn0UNQNumKvmcIYjfkwfh2BhwYh/BxMXQHJ/PdmNh22TQFpIaYg==", - "license": "MIT", "dependencies": { "@docusaurus/core": "3.5.2", "@docusaurus/mdx-loader": "3.5.2", @@ -2718,7 +2533,6 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.5.2.tgz", "integrity": "sha512-QXqlm9S6x9Ibwjs7I2yEDgsCocp708DrCrgHgKwg2n2AY0YQ6IjU0gAK35lHRLOvAoJUfCKpQAwUykB0R7+Eew==", - "license": "MIT", "dependencies": { "@docusaurus/mdx-loader": "3.5.2", "@docusaurus/module-type-aliases": "3.5.2", @@ -2746,7 +2560,6 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/@docusaurus/theme-mermaid/-/theme-mermaid-3.5.2.tgz", "integrity": "sha512-7vWCnIe/KoyTN1Dc55FIyqO5hJ3YaV08Mr63Zej0L0mX1iGzt+qKSmeVUAJ9/aOalUhF0typV0RmNUSy5FAmCg==", - "license": "MIT", "dependencies": { "@docusaurus/core": "3.5.2", "@docusaurus/module-type-aliases": "3.5.2", @@ -2768,7 +2581,6 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.5.2.tgz", "integrity": "sha512-qW53kp3VzMnEqZGjakaV90sst3iN1o32PH+nawv1uepROO8aEGxptcq2R5rsv7aBShSRbZwIobdvSYKsZ5pqvA==", - "license": "MIT", "dependencies": { "@docsearch/react": "^3.5.2", "@docusaurus/core": "3.5.2", @@ -2799,7 +2611,6 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.5.2.tgz", "integrity": "sha512-GPZLcu4aT1EmqSTmbdpVrDENGR2yObFEX8ssEFYTCiAIVc0EihNSdOIBTazUvgNqwvnoU1A8vIs1xyzc3LITTw==", - "license": "MIT", "dependencies": { "fs-extra": "^11.1.1", "tslib": "^2.6.0" @@ -2812,7 +2623,6 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.5.2.tgz", "integrity": "sha512-N6GntLXoLVUwkZw7zCxwy9QiuEXIcTVzA9AkmNw16oc0AP3SXLrMmDMMBIfgqwuKWa6Ox6epHol9kMtJqekACw==", - "license": "MIT", "dependencies": { "@mdx-js/mdx": "^3.0.0", "@types/history": "^4.7.11", @@ -2833,7 +2643,6 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.5.2.tgz", "integrity": "sha512-33QvcNFh+Gv+C2dP9Y9xWEzMgf3JzrpL2nW9PopidiohS1nDcyknKRx2DWaFvyVTTYIkkABVSr073VTj/NITNA==", - "license": "MIT", "dependencies": { "@docusaurus/logger": "3.5.2", "@docusaurus/utils-common": "3.5.2", @@ -2872,7 +2681,6 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.5.2.tgz", "integrity": "sha512-i0AZjHiRgJU6d7faQngIhuHKNrszpL/SHQPgF1zH4H+Ij6E9NBYGy6pkcGWToIv7IVPbs+pQLh1P3whn0gWXVg==", - "license": "MIT", "dependencies": { "tslib": "^2.6.0" }, @@ -2892,7 +2700,6 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.5.2.tgz", "integrity": "sha512-m+Foq7augzXqB6HufdS139PFxDC5d5q2QKZy8q0qYYvGdI6nnlNsGH4cIGsgBnV7smz+mopl3g4asbSDvMV0jA==", - "license": "MIT", "dependencies": { "@docusaurus/logger": "3.5.2", "@docusaurus/utils": "3.5.2", @@ -2911,7 +2718,6 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", - "license": "MIT", "dependencies": { "@emotion/memoize": "^0.8.1" } @@ -2919,30 +2725,25 @@ "node_modules/@emotion/memoize": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", - "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==", - "license": "MIT" + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" }, "node_modules/@emotion/unitless": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", - "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==", - "license": "MIT" + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" }, "node_modules/@exodus/schemasafe": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@exodus/schemasafe/-/schemasafe-1.3.0.tgz", - "integrity": "sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw==", - "license": "MIT" + "integrity": "sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw==" }, "node_modules/@hapi/hoek": { "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" + "license": "BSD-3-Clause" }, "node_modules/@hapi/topo": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "license": "BSD-3-Clause", "dependencies": { "@hapi/hoek": "^9.0.0" } @@ -2976,8 +2777,7 @@ }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -2989,24 +2789,21 @@ }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/source-map": { "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" @@ -3014,27 +2811,23 @@ }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", - "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==" + "version": "2.0.4", + "license": "MIT" }, "node_modules/@mdx-js/mdx": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.0.1.tgz", - "integrity": "sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA==", + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", @@ -3083,8 +2876,7 @@ }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -3095,16 +2887,14 @@ }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -3115,16 +2905,14 @@ }, "node_modules/@pnpm/config.env-replace": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", - "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", + "license": "MIT", "engines": { "node": ">=12.22.0" } }, "node_modules/@pnpm/network.ca-file": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", - "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", + "license": "MIT", "dependencies": { "graceful-fs": "4.2.10" }, @@ -3134,13 +2922,11 @@ }, "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + "license": "ISC" }, "node_modules/@pnpm/npm-conf": { "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz", - "integrity": "sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==", + "license": "MIT", "dependencies": { "@pnpm/config.env-replace": "^1.1.0", "@pnpm/network.ca-file": "^1.0.1", @@ -3152,14 +2938,12 @@ }, "node_modules/@polka/url": { "version": "1.0.0-next.25", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.25.tgz", - "integrity": "sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==" + "license": "MIT" }, "node_modules/@redocly/ajv": { "version": "8.11.0", "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.11.0.tgz", "integrity": "sha512-9GWx27t7xWhDIR02PA18nzBdLcKQRgc46xNQvjFkrYk4UOmvKhJ/dawwiX0cCOeetN5LcaaiqQbVOWYK62SGHw==", - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -3172,16 +2956,14 @@ } }, "node_modules/@redocly/config": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.6.3.tgz", - "integrity": "sha512-hGWJgCsXRw0Ow4rplqRlUQifZvoSwZipkYnt11e3SeH1Eb23VUIDBcRuaQOUqy1wn0eevXkU2GzzQ8fbKdQ7Mg==", - "license": "MIT" + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.6.2.tgz", + "integrity": "sha512-c3K5u64eMnr2ootPcpEI0ioIRLE8QP8ptvLxG9MwAmb2sU8HMRfVwXDU3AZiMVY2w4Ts0mDc+Xv4HTIk8DRqFw==" }, "node_modules/@redocly/openapi-core": { "version": "1.16.0", "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.16.0.tgz", "integrity": "sha512-z06h+svyqbUcdAaePq8LPSwTPlm6Ig7j2VlL8skPBYnJvyaQ2IN7x/JkOvRL4ta+wcOCBdAex5JWnZbKaNktJg==", - "license": "MIT", "dependencies": { "@redocly/ajv": "^8.11.0", "@redocly/config": "^0.6.0", @@ -3204,7 +2986,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -3213,7 +2994,6 @@ "version": "5.1.6", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -3223,21 +3003,18 @@ }, "node_modules/@sideway/address": { "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", - "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", + "license": "BSD-3-Clause", "dependencies": { "@hapi/hoek": "^9.0.0" } }, "node_modules/@sideway/formula": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", - "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" + "license": "BSD-3-Clause" }, "node_modules/@sideway/pinpoint": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" + "license": "BSD-3-Clause" }, "node_modules/@sinclair/typebox": { "version": "0.27.8", @@ -3246,8 +3023,7 @@ }, "node_modules/@sindresorhus/is": { "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -3257,8 +3033,7 @@ }, "node_modules/@slorber/remark-comment": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@slorber/remark-comment/-/remark-comment-1.0.0.tgz", - "integrity": "sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA==", + "license": "MIT", "dependencies": { "micromark-factory-space": "^1.0.0", "micromark-util-character": "^1.1.0", @@ -3510,8 +3285,7 @@ }, "node_modules/@szmarczak/http-timer": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "license": "MIT", "dependencies": { "defer-to-connect": "^2.0.1" }, @@ -3529,16 +3303,14 @@ }, "node_modules/@types/acorn": { "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.6.tgz", - "integrity": "sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==", + "license": "MIT", "dependencies": { "@types/estree": "*" } }, "node_modules/@types/body-parser": { "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "license": "MIT", "dependencies": { "@types/connect": "*", "@types/node": "*" @@ -3546,24 +3318,21 @@ }, "node_modules/@types/bonjour": { "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", - "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/connect": { "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/connect-history-api-fallback": { "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", - "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "license": "MIT", "dependencies": { "@types/express-serve-static-core": "*", "@types/node": "*" @@ -3571,47 +3340,56 @@ }, "node_modules/@types/d3-scale": { "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz", - "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==", + "license": "MIT", "dependencies": { "@types/d3-time": "*" } }, "node_modules/@types/d3-scale-chromatic": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.3.tgz", - "integrity": "sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==" + "license": "MIT" }, "node_modules/@types/d3-time": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz", - "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==" + "license": "MIT" }, "node_modules/@types/debug": { "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "license": "MIT", "dependencies": { "@types/ms": "*" } }, + "node_modules/@types/eslint": { + "version": "8.56.6", + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, "node_modules/@types/estree": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + "license": "MIT" }, "node_modules/@types/estree-jsx": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", - "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", "dependencies": { "@types/estree": "*" } }, "node_modules/@types/express": { "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", - "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "license": "MIT", "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", @@ -3620,9 +3398,8 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.0.tgz", - "integrity": "sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ==", + "version": "4.17.43", + "license": "MIT", "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -3633,41 +3410,34 @@ "node_modules/@types/gtag.js": { "version": "0.0.12", "resolved": "https://registry.npmjs.org/@types/gtag.js/-/gtag.js-0.0.12.tgz", - "integrity": "sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg==", - "license": "MIT" + "integrity": "sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg==" }, "node_modules/@types/hast": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", "dependencies": { "@types/unist": "*" } }, "node_modules/@types/history": { "version": "4.7.11", - "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", - "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==" + "license": "MIT" }, "node_modules/@types/html-minifier-terser": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==" + "license": "MIT" }, "node_modules/@types/http-cache-semantics": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", - "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==" + "license": "MIT" }, "node_modules/@types/http-errors": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==" + "license": "MIT" }, "node_modules/@types/http-proxy": { "version": "1.17.14", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", - "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -3695,86 +3465,73 @@ }, "node_modules/@types/json-schema": { "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" + "license": "MIT" }, "node_modules/@types/mdast": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", - "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "version": "4.0.3", + "license": "MIT", "dependencies": { "@types/unist": "*" } }, "node_modules/@types/mdx": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", - "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==" + "version": "2.0.11", + "license": "MIT" }, "node_modules/@types/mime": { "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" + "license": "MIT" }, "node_modules/@types/ms": { "version": "0.7.34", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", - "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" + "license": "MIT" }, "node_modules/@types/node": { - "version": "20.12.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.12.tgz", - "integrity": "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==", + "version": "20.11.30", + "license": "MIT", "dependencies": { "undici-types": "~5.26.4" } }, "node_modules/@types/node-forge": { "version": "1.3.11", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", - "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/parse-json": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" + "license": "MIT" }, "node_modules/@types/prismjs": { - "version": "1.26.4", - "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.4.tgz", - "integrity": "sha512-rlAnzkW2sZOjbqZ743IHUhFcvzaGbqijwOu8QZnZCjfQzBqFE3s4lOTJEsxikImav9uzz/42I+O7YUs1mWgMlg==" + "version": "1.26.3", + "license": "MIT" }, "node_modules/@types/prop-types": { - "version": "15.7.12", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", - "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" + "version": "15.7.11", + "license": "MIT" }, "node_modules/@types/qs": { - "version": "6.9.15", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", - "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==" + "version": "6.9.14", + "license": "MIT" }, "node_modules/@types/range-parser": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" + "license": "MIT" }, "node_modules/@types/react": { - "version": "18.3.2", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.2.tgz", - "integrity": "sha512-Btgg89dAnqD4vV7R3hlwOxgqobUQKgx3MmrQRi0yYbs/P0ym8XozIAlkqVilPqHQwXs4e9Tf63rrCgl58BcO4w==", + "version": "18.2.67", + "license": "MIT", "dependencies": { "@types/prop-types": "*", + "@types/scheduler": "*", "csstype": "^3.0.2" } }, "node_modules/@types/react-router": { "version": "5.1.20", - "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", - "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", + "license": "MIT", "dependencies": { "@types/history": "^4.7.11", "@types/react": "*" @@ -3782,8 +3539,7 @@ }, "node_modules/@types/react-router-config": { "version": "5.0.11", - "resolved": "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.11.tgz", - "integrity": "sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw==", + "license": "MIT", "dependencies": { "@types/history": "^4.7.11", "@types/react": "*", @@ -3802,22 +3558,23 @@ }, "node_modules/@types/retry": { "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" + "license": "MIT" }, "node_modules/@types/sax": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", - "license": "MIT", "dependencies": { "@types/node": "*" } }, + "node_modules/@types/scheduler": { + "version": "0.16.8", + "license": "MIT" + }, "node_modules/@types/send": { "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "license": "MIT", "dependencies": { "@types/mime": "^1", "@types/node": "*" @@ -3825,26 +3582,23 @@ }, "node_modules/@types/serve-index": { "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", - "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "license": "MIT", "dependencies": { "@types/express": "*" } }, "node_modules/@types/serve-static": { - "version": "1.15.7", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", - "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "version": "1.15.5", + "license": "MIT", "dependencies": { "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "*" + "@types/mime": "*", + "@types/node": "*" } }, "node_modules/@types/sockjs": { "version": "0.3.36", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", - "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -3852,18 +3606,15 @@ "node_modules/@types/stylis": { "version": "4.2.5", "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.5.tgz", - "integrity": "sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==", - "license": "MIT" + "integrity": "sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==" }, "node_modules/@types/unist": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", - "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + "license": "MIT" }, "node_modules/@types/ws": { "version": "8.5.10", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", - "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -3883,13 +3634,11 @@ }, "node_modules/@ungap/structured-clone": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" + "license": "ISC" }, "node_modules/@webassemblyjs/ast": { "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", - "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "license": "MIT", "dependencies": { "@webassemblyjs/helper-numbers": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6" @@ -3897,23 +3646,19 @@ }, "node_modules/@webassemblyjs/floating-point-hex-parser": { "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" + "license": "MIT" }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" + "license": "MIT" }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", - "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==" + "license": "MIT" }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "license": "MIT", "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.11.6", "@webassemblyjs/helper-api-error": "1.11.6", @@ -3922,13 +3667,11 @@ }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" + "license": "MIT" }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", - "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-buffer": "1.12.1", @@ -3938,29 +3681,25 @@ }, "node_modules/@webassemblyjs/ieee754": { "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "license": "MIT", "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "license": "Apache-2.0", "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" + "license": "MIT" }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", - "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-buffer": "1.12.1", @@ -3974,8 +3713,7 @@ }, "node_modules/@webassemblyjs/wasm-gen": { "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", - "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", @@ -3986,8 +3724,7 @@ }, "node_modules/@webassemblyjs/wasm-opt": { "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", - "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-buffer": "1.12.1", @@ -3997,8 +3734,7 @@ }, "node_modules/@webassemblyjs/wasm-parser": { "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", - "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-api-error": "1.11.6", @@ -4010,8 +3746,7 @@ }, "node_modules/@webassemblyjs/wast-printer": { "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", - "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.12.1", "@xtuc/long": "4.2.2" @@ -4019,18 +3754,15 @@ }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + "license": "BSD-3-Clause" }, "node_modules/@xtuc/long": { "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + "license": "Apache-2.0" }, "node_modules/accepts": { "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -4041,16 +3773,14 @@ }, "node_modules/accepts/node_modules/mime-db": { "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/accepts/node_modules/mime-types": { "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -4060,8 +3790,7 @@ }, "node_modules/acorn": { "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -4069,10 +3798,8 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-attributes": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", - "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "node_modules/acorn-import-assertions": { + "version": "1.9.0", "license": "MIT", "peerDependencies": { "acorn": "^8" @@ -4080,24 +3807,21 @@ }, "node_modules/acorn-jsx": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/acorn-walk": { "version": "8.3.2", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", - "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "license": "MIT", "engines": { "node": ">=0.4.0" } }, "node_modules/address": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", - "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", + "license": "MIT", "engines": { "node": ">= 10.0.0" } @@ -4106,7 +3830,6 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "license": "MIT", "dependencies": { "debug": "^4.3.4" }, @@ -4116,8 +3839,7 @@ }, "node_modules/aggregate-error": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "license": "MIT", "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -4127,14 +3849,13 @@ } }, "node_modules/ajv": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", - "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", + "version": "8.12.0", + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.3", + "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.4.1" + "uri-js": "^4.2.2" }, "funding": { "type": "github", @@ -4143,8 +3864,7 @@ }, "node_modules/ajv-formats": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "license": "MIT", "dependencies": { "ajv": "^8.0.0" }, @@ -4159,8 +3879,7 @@ }, "node_modules/ajv-keywords": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3" }, @@ -4172,7 +3891,6 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.24.0.tgz", "integrity": "sha512-bf0QV/9jVejssFBmz2HQLxUadxk574t4iwjCKp5E7NBzwKkrDEhKPISIIjAU/p6K5qDx3qoeh4+26zWN1jmw3g==", - "license": "MIT", "dependencies": { "@algolia/cache-browser-local-storage": "4.24.0", "@algolia/cache-common": "4.24.0", @@ -4192,10 +3910,9 @@ } }, "node_modules/algoliasearch-helper": { - "version": "3.22.4", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.22.4.tgz", - "integrity": "sha512-fvBCywguW9f+939S6awvRMstqMF1XXcd2qs1r1aGqL/PJ1go/DqN06tWmDVmhCDqBJanm++imletrQWf0G2S1g==", - "license": "MIT", + "version": "3.22.5", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.22.5.tgz", + "integrity": "sha512-lWvhdnc+aKOKx8jyA3bsdEgHzm/sglC4cYdMG4xSQyRiPLJVJtH/IVYZG3Hp6PkTEhQqhyVYkeP9z2IlcHJsWw==", "dependencies": { "@algolia/events": "^4.0.1" }, @@ -4207,7 +3924,6 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", - "license": "MIT", "dependencies": { "@algolia/requester-common": "4.24.0", "@algolia/transporter": "4.24.0" @@ -4217,7 +3933,6 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz", "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==", - "license": "MIT", "dependencies": { "@algolia/client-common": "4.24.0", "@algolia/requester-common": "4.24.0", @@ -4228,7 +3943,6 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.24.0.tgz", "integrity": "sha512-Z2NxZMb6+nVXSjF13YpjYTdvV3032YTBSGm2vnYvYPA6mMxzM3v5rsCiSspndn9rzIW4Qp1lPHBvuoKJV6jnAA==", - "license": "MIT", "dependencies": { "@algolia/requester-common": "4.24.0" } @@ -4237,28 +3951,24 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.24.0.tgz", "integrity": "sha512-JF18yTjNOVYvU/L3UosRcvbPMGT9B+/GQWNWnenIImglzNVGpyzChkXLnrSf6uxwVNO6ESGu6oN8MqcGQcjQJw==", - "license": "MIT", "dependencies": { "@algolia/requester-common": "4.24.0" } }, "node_modules/ansi-align": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "license": "ISC", "dependencies": { "string-width": "^4.1.0" } }, "node_modules/ansi-align/node_modules/emoji-regex": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "license": "MIT" }, "node_modules/ansi-align/node_modules/string-width": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -4270,27 +3980,24 @@ }, "node_modules/ansi-html-community": { "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", "engines": [ "node >= 0.8.0" ], + "license": "Apache-2.0", "bin": { "ansi-html": "bin/ansi-html" } }, "node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -4303,8 +4010,7 @@ }, "node_modules/anymatch": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -4316,19 +4022,16 @@ "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "license": "MIT" + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" }, "node_modules/argparse": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + "license": "Python-2.0" }, "node_modules/array-buffer-byte-length": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.5", "is-array-buffer": "^3.0.4" @@ -4342,13 +4045,11 @@ }, "node_modules/array-flatten": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + "license": "MIT" }, "node_modules/array-union": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "license": "MIT", "engines": { "node": ">=8" } @@ -4357,7 +4058,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.4.tgz", "integrity": "sha512-r+mCJ7zXgXElgR4IRC+fkvNCeoaavWBs6EdCso5Tbcf+iEMKzBU/His60lt34WEZ9vlb8wDkZvQGcVI5GwkfoQ==", - "license": "MIT", "peer": true, "dependencies": { "call-bind": "^1.0.7", @@ -4378,7 +4078,6 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", - "license": "MIT", "peer": true, "dependencies": { "call-bind": "^1.0.2", @@ -4397,7 +4096,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", - "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.5", @@ -4417,16 +4115,14 @@ }, "node_modules/astring": { "version": "1.8.6", - "resolved": "https://registry.npmjs.org/astring/-/astring-1.8.6.tgz", - "integrity": "sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==", + "license": "MIT", "bin": { "astring": "bin/astring" } }, "node_modules/at-least-node": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "license": "ISC", "engines": { "node": ">= 4.0.0" } @@ -4449,7 +4145,6 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "browserslist": "^4.23.3", "caniuse-lite": "^1.0.30001646", @@ -4472,7 +4167,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "license": "MIT", "dependencies": { "possible-typed-array-names": "^1.0.0" }, @@ -4485,8 +4179,7 @@ }, "node_modules/babel-loader": { "version": "9.1.3", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", - "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", + "license": "MIT", "dependencies": { "find-cache-dir": "^4.0.0", "schema-utils": "^4.0.0" @@ -4501,19 +4194,17 @@ }, "node_modules/babel-plugin-dynamic-import-node": { "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "license": "MIT", "dependencies": { "object.assign": "^4.1.0" } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", - "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", + "version": "0.4.10", + "license": "MIT", "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.2", + "@babel/helper-define-polyfill-provider": "^0.6.1", "semver": "^6.3.1" }, "peerDependencies": { @@ -4522,16 +4213,14 @@ }, "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/babel-plugin-polyfill-corejs3": { "version": "0.10.4", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz", - "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==", + "license": "MIT", "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.1", "core-js-compat": "^3.36.1" @@ -4541,11 +4230,10 @@ } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", - "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", + "version": "0.6.1", + "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.2" + "@babel/helper-define-polyfill-provider": "^0.6.1" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -4553,8 +4241,7 @@ }, "node_modules/bail": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -4562,26 +4249,22 @@ }, "node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + "license": "MIT" }, "node_modules/batch": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" + "license": "MIT" }, "node_modules/big.js": { "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "license": "MIT", "engines": { "node": "*" } }, "node_modules/binary-extensions": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "license": "MIT", "engines": { "node": ">=8" }, @@ -4591,8 +4274,7 @@ }, "node_modules/body-parser": { "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "license": "MIT", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", @@ -4614,24 +4296,21 @@ }, "node_modules/body-parser/node_modules/bytes": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/body-parser/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/body-parser/node_modules/iconv-lite": { "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -4641,13 +4320,11 @@ }, "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "license": "MIT" }, "node_modules/bonjour-service": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", - "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", "multicast-dns": "^7.2.5" @@ -4655,13 +4332,11 @@ }, "node_modules/boolbase": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + "license": "ISC" }, "node_modules/boxen": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz", - "integrity": "sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==", + "license": "MIT", "dependencies": { "ansi-align": "^3.0.1", "camelcase": "^6.2.0", @@ -4681,8 +4356,7 @@ }, "node_modules/brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4692,7 +4366,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "license": "MIT", "dependencies": { "fill-range": "^7.1.1" }, @@ -4718,7 +4391,6 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "caniuse-lite": "^1.0.30001646", "electron-to-chromium": "^1.5.4", @@ -4734,29 +4406,25 @@ }, "node_modules/buffer-from": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + "license": "MIT" }, "node_modules/bytes": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/cacheable-lookup": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", - "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", + "license": "MIT", "engines": { "node": ">=14.16" } }, "node_modules/cacheable-request": { "version": "10.2.14", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", - "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", + "license": "MIT", "dependencies": { "@types/http-cache-semantics": "^4.0.2", "get-stream": "^6.0.1", @@ -4770,10 +4438,19 @@ "node": ">=14.16" } }, + "node_modules/cacheable-request/node_modules/normalize-url": { + "version": "8.0.1", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/call-bind": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -4791,21 +4468,18 @@ "node_modules/call-me-maybe": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", - "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", - "license": "MIT" + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==" }, "node_modules/callsites": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/camel-case": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "license": "MIT", "dependencies": { "pascal-case": "^3.1.2", "tslib": "^2.0.3" @@ -4813,8 +4487,7 @@ }, "node_modules/camelcase": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -4826,7 +4499,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -4843,9 +4515,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001658", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001658.tgz", - "integrity": "sha512-N2YVqWbJELVdrnsW5p+apoQyYt51aBMSsBZki1XZEfeBCexcM/sf4xiAHcXQBkuOwJBXtWF7aW1sYX6tKebPHw==", + "version": "1.0.30001660", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001660.tgz", + "integrity": "sha512-GacvNTTuATm26qC74pt+ad1fW15mlQ/zuTzzY1ZoIzECTP8HURDfF43kNxPgf7H1jmelCBQTTbBNxdSXOA7Bqg==", "funding": [ { "type": "opencollective", @@ -4859,13 +4531,11 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ], - "license": "CC-BY-4.0" + ] }, "node_modules/ccount": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -4873,8 +4543,7 @@ }, "node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -4888,16 +4557,14 @@ }, "node_modules/char-regex": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "license": "MIT", "engines": { "node": ">=10" } }, "node_modules/character-entities": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -4905,8 +4572,7 @@ }, "node_modules/character-entities-html4": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", - "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -4914,8 +4580,7 @@ }, "node_modules/character-entities-legacy": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", - "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -4923,8 +4588,7 @@ }, "node_modules/character-reference-invalid": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", - "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -4932,8 +4596,7 @@ }, "node_modules/cheerio": { "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", - "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "license": "MIT", "dependencies": { "cheerio-select": "^2.1.0", "dom-serializer": "^2.0.0", @@ -4952,8 +4615,7 @@ }, "node_modules/cheerio-select": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", - "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", "css-select": "^5.1.0", @@ -4968,8 +4630,7 @@ }, "node_modules/chokidar": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -4991,22 +4652,20 @@ }, "node_modules/chrome-trace-event": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "license": "MIT", "engines": { "node": ">=6.0" } }, "node_modules/ci-info": { "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/sibiraj-s" } ], + "license": "MIT", "engines": { "node": ">=8" } @@ -5014,13 +4673,11 @@ "node_modules/classnames": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", - "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", - "license": "MIT" + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" }, "node_modules/clean-css": { "version": "5.3.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", - "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", + "license": "MIT", "dependencies": { "source-map": "~0.6.0" }, @@ -5030,24 +4687,21 @@ }, "node_modules/clean-css/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/clean-stack": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/cli-boxes": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", - "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -5056,9 +4710,8 @@ } }, "node_modules/cli-table3": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", - "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", + "version": "0.6.3", + "license": "MIT", "dependencies": { "string-width": "^4.2.0" }, @@ -5071,13 +4724,11 @@ }, "node_modules/cli-table3/node_modules/emoji-regex": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "license": "MIT" }, "node_modules/cli-table3/node_modules/string-width": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -5091,7 +4742,6 @@ "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -5104,14 +4754,12 @@ "node_modules/cliui/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/cliui/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -5125,7 +4773,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -5140,8 +4787,7 @@ }, "node_modules/clone-deep": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "license": "MIT", "dependencies": { "is-plain-object": "^2.0.4", "kind-of": "^6.0.2", @@ -5151,19 +4797,27 @@ "node": ">=6" } }, + "node_modules/clone-deep/node_modules/is-plain-object": { + "version": "2.0.4", + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/clsx": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/collapse-white-space": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", - "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -5171,8 +4825,7 @@ }, "node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -5182,8 +4835,7 @@ }, "node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "license": "MIT" }, "node_modules/colord": { "version": "2.9.3", @@ -5193,21 +4845,18 @@ "node_modules/colorette": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", - "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", - "license": "MIT" + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==" }, "node_modules/combine-promises": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.2.0.tgz", - "integrity": "sha512-VcQB1ziGD0NXrhKxiwyNbCDmRzs/OShMs2GqW2DlU2A/Sd0nQxE1oWDAE5O0ygSx5mgQOn9eIFh7yKPgFRVkPQ==", + "license": "MIT", "engines": { "node": ">=10" } }, "node_modules/comma-separated-tokens": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -5215,21 +4864,18 @@ }, "node_modules/commander": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "license": "MIT", "engines": { "node": ">= 6" } }, "node_modules/common-path-prefix": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==" + "license": "ISC" }, "node_modules/compressible": { "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "license": "MIT", "dependencies": { "mime-db": ">= 1.43.0 < 2" }, @@ -5239,16 +4885,14 @@ }, "node_modules/compressible/node_modules/mime-db": { "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/compression": { "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "license": "MIT", "dependencies": { "accepts": "~1.3.5", "bytes": "3.0.0", @@ -5264,31 +4908,26 @@ }, "node_modules/compression/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/compression/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "license": "MIT" }, "node_modules/compression/node_modules/safe-buffer": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "license": "MIT" }, "node_modules/concat-map": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + "license": "MIT" }, "node_modules/config-chain": { "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "license": "MIT", "dependencies": { "ini": "^1.3.4", "proto-list": "~1.2.1" @@ -5296,8 +4935,7 @@ }, "node_modules/configstore": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", - "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", + "license": "BSD-2-Clause", "dependencies": { "dot-prop": "^6.0.1", "graceful-fs": "^4.2.6", @@ -5314,56 +4952,48 @@ }, "node_modules/connect-history-api-fallback": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "license": "MIT", "engines": { "node": ">=0.8" } }, "node_modules/consola": { "version": "2.15.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", - "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" + "license": "MIT" }, "node_modules/content-disposition": { "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/content-type": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/convert-source-map": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + "license": "MIT" }, "node_modules/cookie": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/cookie-signature": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + "license": "MIT" }, "node_modules/copy-text-to-clipboard": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.0.tgz", "integrity": "sha512-RnJFp1XR/LOBDckxTib5Qjr/PMfkatD0MUCQgdpqS8MdKiNUzBjAQBEN6oUy+jW7LI93BBG3DtMB2KOOKpGs2Q==", - "license": "MIT", "engines": { "node": ">=12" }, @@ -5373,8 +5003,7 @@ }, "node_modules/copy-webpack-plugin": { "version": "11.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", - "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "license": "MIT", "dependencies": { "fast-glob": "^3.2.11", "glob-parent": "^6.0.1", @@ -5396,8 +5025,7 @@ }, "node_modules/copy-webpack-plugin/node_modules/glob-parent": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -5407,8 +5035,7 @@ }, "node_modules/copy-webpack-plugin/node_modules/globby": { "version": "13.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", - "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "license": "MIT", "dependencies": { "dir-glob": "^3.0.1", "fast-glob": "^3.3.0", @@ -5425,8 +5052,7 @@ }, "node_modules/copy-webpack-plugin/node_modules/slash": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -5435,19 +5061,17 @@ } }, "node_modules/core-js": { - "version": "3.37.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.37.1.tgz", - "integrity": "sha512-Xn6qmxrQZyB0FFY8E3bgRXei3lWDJHhvI+u0q9TKIYM49G8pAr0FgnnrFRAmsbptZL1yxRADVXn+x5AGsbBfyw==", + "version": "3.36.1", "hasInstallScript": true, + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, "node_modules/core-js-compat": { - "version": "3.37.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz", - "integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==", + "version": "3.36.1", + "license": "MIT", "dependencies": { "browserslist": "^4.23.0" }, @@ -5457,10 +5081,9 @@ } }, "node_modules/core-js-pure": { - "version": "3.37.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.37.1.tgz", - "integrity": "sha512-J/r5JTHSmzTxbiYYrzXg9w1VpqrYt+gexenBE9pugeyhwPZTAEJddyiReJWsLO6uNQ8xJZFbod6XC7KKwatCiA==", + "version": "3.36.1", "hasInstallScript": true, + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" @@ -5468,13 +5091,11 @@ }, "node_modules/core-util-is": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + "license": "MIT" }, "node_modules/cose-base": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", - "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", + "license": "MIT", "dependencies": { "layout-base": "^1.0.0" } @@ -5506,8 +5127,7 @@ }, "node_modules/cross-spawn": { "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -5519,8 +5139,7 @@ }, "node_modules/crypto-random-string": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", - "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", + "license": "MIT", "dependencies": { "type-fest": "^1.0.1" }, @@ -5533,8 +5152,7 @@ }, "node_modules/crypto-random-string/node_modules/type-fest": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -5546,7 +5164,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", - "license": "ISC", "engines": { "node": ">=4" } @@ -5563,15 +5180,14 @@ } }, "node_modules/css-loader": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", - "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", + "version": "6.10.0", + "license": "MIT", "dependencies": { "icss-utils": "^5.1.0", "postcss": "^8.4.33", - "postcss-modules-extract-imports": "^3.1.0", - "postcss-modules-local-by-default": "^4.0.5", - "postcss-modules-scope": "^3.2.0", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.4", + "postcss-modules-scope": "^3.1.1", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", "semver": "^7.5.4" @@ -5641,8 +5257,7 @@ }, "node_modules/css-select": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", @@ -5658,7 +5273,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", - "license": "MIT", "dependencies": { "camelize": "^1.0.0", "css-color-keywords": "^1.0.0", @@ -5679,8 +5293,7 @@ }, "node_modules/css-what": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "license": "BSD-2-Clause", "engines": { "node": ">= 6" }, @@ -5690,8 +5303,7 @@ }, "node_modules/cssesc": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", "bin": { "cssesc": "bin/cssesc" }, @@ -5722,7 +5334,6 @@ "version": "6.1.2", "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-6.1.2.tgz", "integrity": "sha512-Nhao7eD8ph2DoHolEzQs5CfRpiEP0xa1HBdnFZ82kvqdmbwVBUr2r1QuQ4t1pi+D1ZpqpcO4T+wy/7RxzJ/WPQ==", - "license": "MIT", "dependencies": { "autoprefixer": "^10.4.19", "browserslist": "^4.23.0", @@ -5825,21 +5436,22 @@ }, "node_modules/csstype": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + "license": "MIT" }, "node_modules/cytoscape": { - "version": "3.29.2", - "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.29.2.tgz", - "integrity": "sha512-2G1ycU28Nh7OHT9rkXRLpCDP30MKH1dXJORZuBhtEhEW7pKwgPi77ImqlCWinouyE1PNepIOGZBOrE84DG7LyQ==", + "version": "3.28.1", + "license": "MIT", + "dependencies": { + "heap": "^0.2.6", + "lodash": "^4.17.21" + }, "engines": { "node": ">=0.10" } }, "node_modules/cytoscape-cose-bilkent": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", - "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", + "license": "MIT", "dependencies": { "cose-base": "^1.0.0" }, @@ -5849,8 +5461,7 @@ }, "node_modules/d3": { "version": "7.9.0", - "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", - "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", + "license": "ISC", "dependencies": { "d3-array": "3", "d3-axis": "3", @@ -5889,8 +5500,7 @@ }, "node_modules/d3-array": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", "dependencies": { "internmap": "1 - 2" }, @@ -5900,16 +5510,14 @@ }, "node_modules/d3-axis": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", - "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/d3-brush": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", - "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "license": "ISC", "dependencies": { "d3-dispatch": "1 - 3", "d3-drag": "2 - 3", @@ -5923,8 +5531,7 @@ }, "node_modules/d3-chord": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", - "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "license": "ISC", "dependencies": { "d3-path": "1 - 3" }, @@ -5934,16 +5541,14 @@ }, "node_modules/d3-color": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/d3-contour": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", - "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "license": "ISC", "dependencies": { "d3-array": "^3.2.0" }, @@ -5953,8 +5558,7 @@ }, "node_modules/d3-delaunay": { "version": "6.0.4", - "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", - "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "license": "ISC", "dependencies": { "delaunator": "5" }, @@ -5964,16 +5568,14 @@ }, "node_modules/d3-dispatch": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", - "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/d3-drag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", - "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "license": "ISC", "dependencies": { "d3-dispatch": "1 - 3", "d3-selection": "3" @@ -5984,8 +5586,7 @@ }, "node_modules/d3-dsv": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", - "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "license": "ISC", "dependencies": { "commander": "7", "iconv-lite": "0.6", @@ -6008,24 +5609,21 @@ }, "node_modules/d3-dsv/node_modules/commander": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", "engines": { "node": ">= 10" } }, "node_modules/d3-ease": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", "engines": { "node": ">=12" } }, "node_modules/d3-fetch": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", - "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "license": "ISC", "dependencies": { "d3-dsv": "1 - 3" }, @@ -6035,8 +5633,7 @@ }, "node_modules/d3-force": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", - "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "license": "ISC", "dependencies": { "d3-dispatch": "1 - 3", "d3-quadtree": "1 - 3", @@ -6048,16 +5645,14 @@ }, "node_modules/d3-format": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", - "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/d3-geo": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", - "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", + "license": "ISC", "dependencies": { "d3-array": "2.5.0 - 3" }, @@ -6067,16 +5662,14 @@ }, "node_modules/d3-hierarchy": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", - "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/d3-interpolate": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", "dependencies": { "d3-color": "1 - 3" }, @@ -6086,40 +5679,35 @@ }, "node_modules/d3-path": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", - "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/d3-polygon": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", - "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/d3-quadtree": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", - "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/d3-random": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", - "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/d3-sankey": { "version": "0.12.3", - "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz", - "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==", + "license": "BSD-3-Clause", "dependencies": { "d3-array": "1 - 2", "d3-shape": "^1.2.0" @@ -6127,34 +5715,29 @@ }, "node_modules/d3-sankey/node_modules/d3-array": { "version": "2.12.1", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", - "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", + "license": "BSD-3-Clause", "dependencies": { "internmap": "^1.0.0" } }, "node_modules/d3-sankey/node_modules/d3-path": { "version": "1.0.9", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", - "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" + "license": "BSD-3-Clause" }, "node_modules/d3-sankey/node_modules/d3-shape": { "version": "1.3.7", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", - "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "license": "BSD-3-Clause", "dependencies": { "d3-path": "1" } }, "node_modules/d3-sankey/node_modules/internmap": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", - "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==" + "license": "ISC" }, "node_modules/d3-scale": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", - "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", "dependencies": { "d3-array": "2.10.0 - 3", "d3-format": "1 - 3", @@ -6168,8 +5751,7 @@ }, "node_modules/d3-scale-chromatic": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", - "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "license": "ISC", "dependencies": { "d3-color": "1 - 3", "d3-interpolate": "1 - 3" @@ -6180,16 +5762,14 @@ }, "node_modules/d3-selection": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/d3-shape": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", - "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", "dependencies": { "d3-path": "^3.1.0" }, @@ -6199,8 +5779,7 @@ }, "node_modules/d3-time": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", - "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", "dependencies": { "d3-array": "2 - 3" }, @@ -6210,8 +5789,7 @@ }, "node_modules/d3-time-format": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", - "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", "dependencies": { "d3-time": "1 - 3" }, @@ -6221,16 +5799,14 @@ }, "node_modules/d3-timer": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/d3-transition": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", - "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "license": "ISC", "dependencies": { "d3-color": "1 - 3", "d3-dispatch": "1 - 3", @@ -6247,8 +5823,7 @@ }, "node_modules/d3-zoom": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", - "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "license": "ISC", "dependencies": { "d3-dispatch": "1 - 3", "d3-drag": "2 - 3", @@ -6262,8 +5837,7 @@ }, "node_modules/dagre-d3-es": { "version": "7.0.10", - "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.10.tgz", - "integrity": "sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A==", + "license": "MIT", "dependencies": { "d3": "^7.8.2", "lodash-es": "^4.17.21" @@ -6273,7 +5847,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.6", "es-errors": "^1.3.0", @@ -6290,7 +5863,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -6307,7 +5879,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.6", "es-errors": "^1.3.0", @@ -6321,19 +5892,16 @@ } }, "node_modules/dayjs": { - "version": "1.11.11", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.11.tgz", - "integrity": "sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==" + "version": "1.11.10", + "license": "MIT" }, "node_modules/debounce": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", - "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==" + "license": "MIT" }, "node_modules/debug": { "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "license": "MIT", "dependencies": { "ms": "2.1.2" }, @@ -6353,8 +5921,7 @@ }, "node_modules/decode-named-character-reference": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", - "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "license": "MIT", "dependencies": { "character-entities": "^2.0.0" }, @@ -6365,8 +5932,7 @@ }, "node_modules/decompress-response": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", "dependencies": { "mimic-response": "^3.1.0" }, @@ -6379,8 +5945,7 @@ }, "node_modules/decompress-response/node_modules/mimic-response": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -6390,24 +5955,21 @@ }, "node_modules/deep-extend": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", "engines": { "node": ">=4.0.0" } }, "node_modules/deepmerge": { "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/default-gateway": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "license": "BSD-2-Clause", "dependencies": { "execa": "^5.0.0" }, @@ -6417,16 +5979,14 @@ }, "node_modules/defer-to-connect": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "license": "MIT", "engines": { "node": ">=10" } }, "node_modules/define-data-property": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -6441,16 +6001,14 @@ }, "node_modules/define-lazy-prop": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/define-properties": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", @@ -6465,8 +6023,7 @@ }, "node_modules/del": { "version": "6.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", - "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", + "license": "MIT", "dependencies": { "globby": "^11.0.1", "graceful-fs": "^4.2.4", @@ -6486,32 +6043,28 @@ }, "node_modules/delaunator": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", - "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", + "license": "ISC", "dependencies": { "robust-predicates": "^3.0.2" } }, "node_modules/depd": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/dequal": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/destroy": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" @@ -6519,13 +6072,11 @@ }, "node_modules/detect-node": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" + "license": "MIT" }, "node_modules/detect-port": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.6.1.tgz", - "integrity": "sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==", + "version": "1.5.1", + "license": "MIT", "dependencies": { "address": "^1.0.1", "debug": "4" @@ -6533,15 +6084,11 @@ "bin": { "detect": "bin/detect-port.js", "detect-port": "bin/detect-port.js" - }, - "engines": { - "node": ">= 4.0.0" } }, "node_modules/detect-port-alt": { "version": "1.1.6", - "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", - "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", + "license": "MIT", "dependencies": { "address": "^1.0.1", "debug": "^2.6.0" @@ -6556,21 +6103,18 @@ }, "node_modules/detect-port-alt/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/detect-port-alt/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "license": "MIT" }, "node_modules/devlop": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", "dependencies": { "dequal": "^2.0.0" }, @@ -6581,16 +6125,14 @@ }, "node_modules/diff": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", - "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } }, "node_modules/dir-glob": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "license": "MIT", "dependencies": { "path-type": "^4.0.0" }, @@ -6602,13 +6144,11 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", "integrity": "sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==", - "license": "MIT", "peer": true }, "node_modules/dns-packet": { "version": "5.6.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", - "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "license": "MIT", "dependencies": { "@leichtgewicht/ip-codec": "^2.0.1" }, @@ -6620,7 +6160,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/docusaurus-plugin-redoc/-/docusaurus-plugin-redoc-2.1.1.tgz", "integrity": "sha512-gf9HbFAKPZu17rbx+3C6vIpfMMTuvUFG8rRKeuHro1B5wUutBSjE5/VjB1owVGjIJQ74OgVKJvgczqUjhcQcjQ==", - "license": "MIT", "dependencies": { "@redocly/openapi-core": "1.16.0", "redoc": "2.1.5" @@ -6633,15 +6172,16 @@ } }, "node_modules/docusaurus-theme-redoc": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/docusaurus-theme-redoc/-/docusaurus-theme-redoc-2.1.1.tgz", - "integrity": "sha512-a9yuYyGVhj7NgBYiqJyjLEkJg/yTdsqg9Rn/cG8YXMIFwxIpn4tanIplUqwisK2PS81ZxOv7SfSgvGm/FSi/wA==", - "license": "MIT", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/docusaurus-theme-redoc/-/docusaurus-theme-redoc-2.1.2.tgz", + "integrity": "sha512-UB6g+YDPjVgFMhJnIUaW/mNl9vsCMbrMQutgdoG5DaI+HpxO2sV+zT2z23Wg6ngi2GM+oxEhYf5Qc1dPwKZqBQ==", "dependencies": { "@redocly/openapi-core": "1.16.0", "clsx": "^1.2.1", "lodash": "^4.17.21", "mobx": "^6.12.4", + "postcss": "^8.4.45", + "postcss-prefix-selector": "^1.16.1", "redoc": "2.1.5", "styled-components": "^6.1.11" }, @@ -6657,23 +6197,47 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", - "license": "MIT", "engines": { "node": ">=6" } }, + "node_modules/docusaurus-theme-redoc/node_modules/postcss": { + "version": "8.4.47", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", + "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.0", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, "node_modules/dom-converter": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "license": "MIT", "dependencies": { "utila": "~0.4" } }, "node_modules/dom-serializer": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", @@ -6685,19 +6249,17 @@ }, "node_modules/domelementtype": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/fb55" } - ] + ], + "license": "BSD-2-Clause" }, "node_modules/domhandler": { "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.3.0" }, @@ -6709,14 +6271,12 @@ } }, "node_modules/dompurify": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.1.3.tgz", - "integrity": "sha512-5sOWYSNPaxz6o2MUPvtyxTTqR4D3L77pr5rUQoWgD5ROQtVIZQgJkXbo1DLlK3vj11YGw5+LnF4SYti4gZmwng==" + "version": "3.0.11", + "license": "(MPL-2.0 OR Apache-2.0)" }, "node_modules/domutils": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", @@ -6728,8 +6288,7 @@ }, "node_modules/dot-case": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "license": "MIT", "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" @@ -6737,8 +6296,7 @@ }, "node_modules/dot-prop": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", - "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "license": "MIT", "dependencies": { "is-obj": "^2.0.0" }, @@ -6751,60 +6309,50 @@ }, "node_modules/dot-prop/node_modules/is-obj": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/duplexer": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + "license": "MIT" }, "node_modules/eastasianwidth": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + "license": "MIT" }, "node_modules/ee-first": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.16", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.16.tgz", - "integrity": "sha512-2gQpi2WYobXmz2q23FrOBYTLcI1O/P4heW3eqX+ldmPVDQELRqhiebV380EhlGG12NtnX1qbK/FHpN0ba+7bLA==", - "license": "ISC" + "version": "1.5.20", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.20.tgz", + "integrity": "sha512-74mdl6Fs1HHzK9SUX4CKFxAtAe3nUns48y79TskHNAG6fGOlLfyKA4j855x+0b5u8rWJIrlaG9tcTPstMlwjIw==" }, "node_modules/elkjs": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/elkjs/-/elkjs-0.9.3.tgz", - "integrity": "sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ==" + "version": "0.9.2", + "license": "EPL-2.0" }, "node_modules/emoji-regex": { "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + "license": "MIT" }, "node_modules/emojilib": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", - "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==" + "license": "MIT" }, "node_modules/emojis-list": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/emoticon": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-4.0.1.tgz", - "integrity": "sha512-dqx7eA9YaqyvYtUhJwT4rC1HIp82j5ybS1/vQ42ur+jBe17dJMwZE4+gvL1XadSFfxaPFFGt3Xsw+Y8akThDlw==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -6812,16 +6360,13 @@ }, "node_modules/encodeurl": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/enhanced-resolve": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", - "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "version": "5.16.0", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", @@ -6833,8 +6378,7 @@ }, "node_modules/entities": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", "engines": { "node": ">=0.12" }, @@ -6846,7 +6390,6 @@ "version": "3.11.0", "resolved": "https://registry.npmjs.org/enzyme/-/enzyme-3.11.0.tgz", "integrity": "sha512-Dw8/Gs4vRjxY6/6i9wU0V+utmQO9kvh9XLnz3LIudviOnVYDEe2ec+0k+NQoMamn1VrjKgCUOWj5jG/5M5M0Qw==", - "license": "MIT", "peer": true, "dependencies": { "array.prototype.flat": "^1.2.3", @@ -6880,7 +6423,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.7.tgz", "integrity": "sha512-/um0GFqUXnpM9SvKtje+9Tjoz3f1fpBC3eXRFrNs8kpYn69JljciYP7KZTqM/YQbUY9KUjvKB4jo/q+L6WGGvg==", - "license": "MIT", "dependencies": { "hasown": "^2.0.0", "object-is": "^1.1.5" @@ -6891,8 +6433,7 @@ }, "node_modules/error-ex": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } @@ -6901,7 +6442,6 @@ "version": "1.23.3", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", - "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.1", "arraybuffer.prototype.slice": "^1.0.3", @@ -6961,13 +6501,11 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", - "license": "MIT", "peer": true }, "node_modules/es-define-property": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.4" }, @@ -6977,22 +6515,19 @@ }, "node_modules/es-errors": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/es-module-lexer": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.2.tgz", - "integrity": "sha512-l60ETUTmLqbVbVHv1J4/qj+M8nq7AwMzEcg3kmJDt9dCNrTk+yHcYFf/Kw75pMDwd9mPcIGCG5LcS20SxYRzFA==" + "version": "1.4.2", + "license": "MIT" }, "node_modules/es-object-atoms": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", - "license": "MIT", "dependencies": { "es-errors": "^1.3.0" }, @@ -7004,7 +6539,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", - "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.4", "has-tostringtag": "^1.0.2", @@ -7018,7 +6552,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", - "license": "MIT", "peer": true, "dependencies": { "hasown": "^2.0.0" @@ -7028,7 +6561,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "license": "MIT", "dependencies": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", @@ -7044,21 +6576,18 @@ "node_modules/es6-promise": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", - "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==", - "license": "MIT" + "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==" }, "node_modules/escalade": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/escape-goat": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", - "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -7068,13 +6597,11 @@ }, "node_modules/escape-html": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + "license": "MIT" }, "node_modules/escape-string-regexp": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -7084,8 +6611,7 @@ }, "node_modules/eslint-scope": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -7096,8 +6622,7 @@ }, "node_modules/esprima": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -7108,8 +6633,7 @@ }, "node_modules/esrecurse": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -7119,24 +6643,21 @@ }, "node_modules/esrecurse/node_modules/estraverse": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/estraverse": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/estree-util-attach-comments": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", - "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" }, @@ -7147,8 +6668,7 @@ }, "node_modules/estree-util-build-jsx": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", - "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", + "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", "devlop": "^1.0.0", @@ -7162,8 +6682,7 @@ }, "node_modules/estree-util-is-identifier-name": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", - "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" @@ -7171,8 +6690,7 @@ }, "node_modules/estree-util-to-js": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", - "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", + "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", "astring": "^1.8.0", @@ -7184,21 +6702,22 @@ } }, "node_modules/estree-util-value-to-estree": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.1.1.tgz", - "integrity": "sha512-5mvUrF2suuv5f5cGDnDphIy4/gW86z82kl5qG6mM9z04SEQI4FB5Apmaw/TGEf3l55nLtMs5s51dmhUzvAHQCA==", + "version": "3.0.1", + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "is-plain-obj": "^4.0.0" }, + "engines": { + "node": ">=16.0.0" + }, "funding": { "url": "https://github.com/sponsors/remcohaszing" } }, "node_modules/estree-util-visit": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", - "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", + "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/unist": "^3.0.0" @@ -7210,24 +6729,21 @@ }, "node_modules/estree-walker": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" } }, "node_modules/esutils": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/eta": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/eta/-/eta-2.2.0.tgz", - "integrity": "sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g==", + "license": "MIT", "engines": { "node": ">=6.0.0" }, @@ -7237,8 +6753,7 @@ }, "node_modules/etag": { "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -7257,21 +6772,18 @@ }, "node_modules/eventemitter3": { "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + "license": "MIT" }, "node_modules/events": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", "engines": { "node": ">=0.8.x" } }, "node_modules/execa": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -7333,8 +6845,7 @@ }, "node_modules/express/node_modules/content-disposition": { "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", "dependencies": { "safe-buffer": "5.2.1" }, @@ -7344,39 +6855,33 @@ }, "node_modules/express/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/express/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "license": "MIT" }, "node_modules/express/node_modules/path-to-regexp": { "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + "license": "MIT" }, "node_modules/express/node_modules/range-parser": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/extend": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + "license": "MIT" }, "node_modules/extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "license": "MIT", "dependencies": { "is-extendable": "^0.1.0" }, @@ -7386,13 +6891,11 @@ }, "node_modules/fast-deep-equal": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "license": "MIT" }, "node_modules/fast-glob": { "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -7406,35 +6909,30 @@ }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + "license": "MIT" }, "node_modules/fast-safe-stringify": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", - "license": "MIT" + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" }, "node_modules/fast-url-parser": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", - "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==", + "license": "MIT", "dependencies": { "punycode": "^1.3.2" } }, "node_modules/fastq": { "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "license": "ISC", "dependencies": { "reusify": "^1.0.4" } }, "node_modules/fault": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", - "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", + "license": "MIT", "dependencies": { "format": "^0.2.0" }, @@ -7445,8 +6943,7 @@ }, "node_modules/faye-websocket": { "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "license": "Apache-2.0", "dependencies": { "websocket-driver": ">=0.5.1" }, @@ -7456,8 +6953,7 @@ }, "node_modules/feed": { "version": "4.2.2", - "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", - "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==", + "license": "MIT", "dependencies": { "xml-js": "^1.6.11" }, @@ -7467,8 +6963,7 @@ }, "node_modules/file-loader": { "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", - "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "license": "MIT", "dependencies": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0" @@ -7486,8 +6981,7 @@ }, "node_modules/file-loader/node_modules/ajv": { "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -7501,21 +6995,18 @@ }, "node_modules/file-loader/node_modules/ajv-keywords": { "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" } }, "node_modules/file-loader/node_modules/json-schema-traverse": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "license": "MIT" }, "node_modules/file-loader/node_modules/schema-utils": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -7531,8 +7022,7 @@ }, "node_modules/filesize": { "version": "8.0.7", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", - "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==", + "license": "BSD-3-Clause", "engines": { "node": ">= 0.4.0" } @@ -7541,7 +7031,6 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -7551,8 +7040,7 @@ }, "node_modules/finalhandler": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "license": "MIT", "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", @@ -7568,21 +7056,18 @@ }, "node_modules/finalhandler/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "license": "MIT" }, "node_modules/find-cache-dir": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", - "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "license": "MIT", "dependencies": { "common-path-prefix": "^3.0.0", "pkg-dir": "^7.0.0" @@ -7596,8 +7081,7 @@ }, "node_modules/find-up": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "license": "MIT", "dependencies": { "locate-path": "^7.1.0", "path-exists": "^5.0.0" @@ -7611,22 +7095,20 @@ }, "node_modules/flat": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "license": "BSD-3-Clause", "bin": { "flat": "cli.js" } }, "node_modules/follow-redirects": { "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "funding": [ { "type": "individual", "url": "https://github.com/sponsors/RubenVerborgh" } ], + "license": "MIT", "engines": { "node": ">=4.0" }, @@ -7640,7 +7122,6 @@ "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "license": "MIT", "dependencies": { "is-callable": "^1.1.3" } @@ -7648,13 +7129,11 @@ "node_modules/foreach": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.6.tgz", - "integrity": "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==", - "license": "MIT" + "integrity": "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==" }, "node_modules/fork-ts-checker-webpack-plugin": { "version": "6.5.3", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", - "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==", + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.8.3", "@types/json-schema": "^7.0.5", @@ -7691,8 +7170,7 @@ }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv": { "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -7706,16 +7184,14 @@ }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv-keywords": { "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" } }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "license": "MIT", "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.1.0", @@ -7729,8 +7205,7 @@ }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "license": "MIT", "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -7743,13 +7218,11 @@ }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/json-schema-traverse": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "license": "MIT" }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { "version": "2.7.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", - "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.4", "ajv": "^6.12.2", @@ -7765,32 +7238,27 @@ }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/form-data-encoder": { "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", - "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", + "license": "MIT", "engines": { "node": ">= 14.17" } }, "node_modules/format": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", - "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", "engines": { "node": ">=0.4.x" } }, "node_modules/forwarded": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -7799,7 +7267,6 @@ "version": "4.3.7", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "license": "MIT", "engines": { "node": "*" }, @@ -7810,16 +7277,14 @@ }, "node_modules/fresh": { "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/fs-extra": { "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -7830,33 +7295,16 @@ } }, "node_modules/fs-monkey": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", - "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==" + "version": "1.0.5", + "license": "Unlicense" }, "node_modules/fs.realpath": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } + "license": "ISC" }, "node_modules/function-bind": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -7865,7 +7313,6 @@ "version": "1.1.6", "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -7883,15 +7330,13 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/gensync": { "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -7900,15 +7345,13 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/get-intrinsic": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", @@ -7925,13 +7368,11 @@ }, "node_modules/get-own-enumerable-property-symbols": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" + "license": "ISC" }, "node_modules/get-stream": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -7943,7 +7384,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.5", "es-errors": "^1.3.0", @@ -7958,13 +7398,11 @@ }, "node_modules/github-slugger": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", - "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==" + "license": "ISC" }, "node_modules/glob": { "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -7982,8 +7420,7 @@ }, "node_modules/glob-parent": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -7993,13 +7430,11 @@ }, "node_modules/glob-to-regexp": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + "license": "BSD-2-Clause" }, "node_modules/global-dirs": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "license": "MIT", "dependencies": { "ini": "2.0.0" }, @@ -8012,16 +7447,14 @@ }, "node_modules/global-dirs/node_modules/ini": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "license": "ISC", "engines": { "node": ">=10" } }, "node_modules/global-modules": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "license": "MIT", "dependencies": { "global-prefix": "^3.0.0" }, @@ -8031,8 +7464,7 @@ }, "node_modules/global-prefix": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "license": "MIT", "dependencies": { "ini": "^1.3.5", "kind-of": "^6.0.2", @@ -8044,8 +7476,7 @@ }, "node_modules/global-prefix/node_modules/which": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -8055,8 +7486,7 @@ }, "node_modules/globals": { "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "license": "MIT", "engines": { "node": ">=4" } @@ -8065,7 +7495,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "license": "MIT", "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" @@ -8079,8 +7508,7 @@ }, "node_modules/globby": { "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "license": "MIT", "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -8098,8 +7526,7 @@ }, "node_modules/gopd": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "license": "MIT", "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -8109,8 +7536,7 @@ }, "node_modules/got": { "version": "12.6.1", - "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", - "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", + "license": "MIT", "dependencies": { "@sindresorhus/is": "^5.2.0", "@szmarczak/http-timer": "^5.0.1", @@ -8133,8 +7559,7 @@ }, "node_modules/got/node_modules/@sindresorhus/is": { "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", - "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", + "license": "MIT", "engines": { "node": ">=14.16" }, @@ -8144,13 +7569,11 @@ }, "node_modules/graceful-fs": { "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + "license": "ISC" }, "node_modules/gray-matter": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", - "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "license": "MIT", "dependencies": { "js-yaml": "^3.13.1", "kind-of": "^6.0.2", @@ -8163,16 +7586,14 @@ }, "node_modules/gray-matter/node_modules/argparse": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } }, "node_modules/gray-matter/node_modules/js-yaml": { "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -8183,8 +7604,7 @@ }, "node_modules/gzip-size": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", - "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "license": "MIT", "dependencies": { "duplexer": "^0.1.2" }, @@ -8197,14 +7617,12 @@ }, "node_modules/handle-thing": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" + "license": "MIT" }, "node_modules/has": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", - "license": "MIT", "engines": { "node": ">= 0.4.0" } @@ -8213,23 +7631,20 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/has-property-descriptors": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" }, @@ -8239,8 +7654,7 @@ }, "node_modules/has-proto": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -8250,8 +7664,7 @@ }, "node_modules/has-symbols": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -8263,7 +7676,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" }, @@ -8276,8 +7688,7 @@ }, "node_modules/has-yarn": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", - "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -8287,8 +7698,7 @@ }, "node_modules/hasown": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -8298,8 +7708,7 @@ }, "node_modules/hast-util-from-parse5": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz", - "integrity": "sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", @@ -8317,8 +7726,7 @@ }, "node_modules/hast-util-parse-selector": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", - "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0" }, @@ -8328,9 +7736,8 @@ } }, "node_modules/hast-util-raw": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.0.3.tgz", - "integrity": "sha512-ICWvVOF2fq4+7CMmtCPD5CM4QKjPbHpPotE6+8tDooV0ZuyJVUzHsrNX+O5NaRbieTf0F7FfeBOMAwi6Td0+yQ==", + "version": "9.0.2", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", @@ -8353,8 +7760,7 @@ }, "node_modules/hast-util-to-estree": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.0.tgz", - "integrity": "sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==", + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", @@ -8380,8 +7786,7 @@ }, "node_modules/hast-util-to-jsx-runtime": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.0.tgz", - "integrity": "sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==", + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", @@ -8405,22 +7810,19 @@ } }, "node_modules/hast-util-to-jsx-runtime/node_modules/inline-style-parser": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.3.tgz", - "integrity": "sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g==" + "version": "0.2.2", + "license": "MIT" }, "node_modules/hast-util-to-jsx-runtime/node_modules/style-to-object": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.6.tgz", - "integrity": "sha512-khxq+Qm3xEyZfKd/y9L3oIWQimxuc4STrQKtQn8aSDRHb8mFgpukgX1hdzfrMEW6JCjyJ8p89x+IUMVnCBI1PA==", + "version": "1.0.5", + "license": "MIT", "dependencies": { - "inline-style-parser": "0.2.3" + "inline-style-parser": "0.2.2" } }, "node_modules/hast-util-to-parse5": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", - "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", @@ -8437,8 +7839,7 @@ }, "node_modules/hast-util-whitespace": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", - "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0" }, @@ -8449,8 +7850,7 @@ }, "node_modules/hastscript": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-8.0.0.tgz", - "integrity": "sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", @@ -8465,16 +7865,18 @@ }, "node_modules/he": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "license": "MIT", "bin": { "he": "bin/he" } }, + "node_modules/heap": { + "version": "0.2.7", + "license": "MIT" + }, "node_modules/history": { "version": "4.10.1", - "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", - "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.1.2", "loose-envify": "^1.2.0", @@ -8486,16 +7888,14 @@ }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", "dependencies": { "react-is": "^16.7.0" } }, "node_modules/hpack.js": { "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "license": "MIT", "dependencies": { "inherits": "^2.0.1", "obuf": "^1.0.0", @@ -8505,13 +7905,11 @@ }, "node_modules/hpack.js/node_modules/isarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "license": "MIT" }, "node_modules/hpack.js/node_modules/readable-stream": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -8524,13 +7922,11 @@ }, "node_modules/hpack.js/node_modules/safe-buffer": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "license": "MIT" }, "node_modules/hpack.js/node_modules/string_decoder": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" } @@ -8539,7 +7935,6 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/html-element-map/-/html-element-map-1.3.1.tgz", "integrity": "sha512-6XMlxrAFX4UEEGxctfFnmrFaaZFNf9i5fNuV5wZ3WWQ4FVaNP1aX1LkX9j2mfEx1NpjeE/rL3nmgEn23GdFmrg==", - "license": "MIT", "peer": true, "dependencies": { "array.prototype.filter": "^1.0.0", @@ -8551,8 +7946,6 @@ }, "node_modules/html-entities": { "version": "2.5.2", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", - "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", "funding": [ { "type": "github", @@ -8562,17 +7955,16 @@ "type": "patreon", "url": "https://patreon.com/mdevils" } - ] + ], + "license": "MIT" }, "node_modules/html-escaper": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" + "license": "MIT" }, "node_modules/html-minifier-terser": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", - "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==", + "license": "MIT", "dependencies": { "camel-case": "^4.1.2", "clean-css": "~5.3.2", @@ -8591,16 +7983,14 @@ }, "node_modules/html-minifier-terser/node_modules/commander": { "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "license": "MIT", "engines": { "node": ">=14" } }, "node_modules/html-tags": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", - "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "license": "MIT", "engines": { "node": ">=8" }, @@ -8610,8 +8000,7 @@ }, "node_modules/html-void-elements": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", - "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -8619,8 +8008,7 @@ }, "node_modules/html-webpack-plugin": { "version": "5.6.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz", - "integrity": "sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==", + "license": "MIT", "dependencies": { "@types/html-minifier-terser": "^6.0.0", "html-minifier-terser": "^6.0.2", @@ -8650,16 +8038,14 @@ }, "node_modules/html-webpack-plugin/node_modules/commander": { "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "license": "MIT", "engines": { "node": ">= 12" } }, "node_modules/html-webpack-plugin/node_modules/html-minifier-terser": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "license": "MIT", "dependencies": { "camel-case": "^4.1.2", "clean-css": "^5.2.2", @@ -8678,8 +8064,6 @@ }, "node_modules/htmlparser2": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { @@ -8687,6 +8071,7 @@ "url": "https://github.com/sponsors/fb55" } ], + "license": "MIT", "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", @@ -8696,18 +8081,15 @@ }, "node_modules/http-cache-semantics": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" + "license": "BSD-2-Clause" }, "node_modules/http-deceiver": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==" + "license": "MIT" }, "node_modules/http-errors": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -8721,13 +8103,11 @@ }, "node_modules/http-parser-js": { "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" + "license": "MIT" }, "node_modules/http-proxy": { "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "license": "MIT", "dependencies": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", @@ -8739,8 +8119,7 @@ }, "node_modules/http-proxy-middleware": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "license": "MIT", "dependencies": { "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", @@ -8762,8 +8141,7 @@ }, "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -8774,13 +8152,11 @@ "node_modules/http2-client": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/http2-client/-/http2-client-1.3.5.tgz", - "integrity": "sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA==", - "license": "MIT" + "integrity": "sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA==" }, "node_modules/http2-wrapper": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", - "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", + "license": "MIT", "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.2.0" @@ -8793,7 +8169,6 @@ "version": "7.0.5", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", - "license": "MIT", "dependencies": { "agent-base": "^7.0.2", "debug": "4" @@ -8804,16 +8179,14 @@ }, "node_modules/human-signals": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "license": "Apache-2.0", "engines": { "node": ">=10.17.0" } }, "node_modules/iconv-lite": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -8823,8 +8196,7 @@ }, "node_modules/icss-utils": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "license": "ISC", "engines": { "node": "^10 || ^12 || >= 14" }, @@ -8834,16 +8206,14 @@ }, "node_modules/ignore": { "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/image-size": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.1.1.tgz", - "integrity": "sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==", + "license": "MIT", "dependencies": { "queue": "6.0.2" }, @@ -8856,8 +8226,7 @@ }, "node_modules/immer": { "version": "9.0.21", - "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", - "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/immer" @@ -8865,8 +8234,7 @@ }, "node_modules/import-fresh": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -8880,24 +8248,21 @@ }, "node_modules/import-lazy": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/imurmurhash": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "license": "MIT", "engines": { "node": ">=0.8.19" } }, "node_modules/indent-string": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "license": "MIT", "engines": { "node": ">=8" } @@ -8906,15 +8271,13 @@ "version": "0.2.0-alpha.44", "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.44.tgz", "integrity": "sha512-tuRkUSO/lB3rEhLJk25atwAjgLuzq070+pOW8XcvpHky/YbENnRRdPd85IBkyeTgttmOy5ah+yHYsK1HhUd4lQ==", - "license": "MIT", "engines": { "node": ">=12" } }, "node_modules/inflight": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -8922,24 +8285,20 @@ }, "node_modules/inherits": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "license": "ISC" }, "node_modules/ini": { "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + "license": "ISC" }, "node_modules/inline-style-parser": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", - "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" + "license": "MIT" }, "node_modules/internal-slot": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", - "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.0", @@ -8951,40 +8310,35 @@ }, "node_modules/internmap": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", - "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/interpret": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "license": "MIT", "engines": { "node": ">= 0.10" } }, "node_modules/invariant": { "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "license": "MIT", "dependencies": { "loose-envify": "^1.0.0" } }, "node_modules/ipaddr.js": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", - "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", + "version": "2.1.0", + "license": "MIT", "engines": { "node": ">= 10" } }, "node_modules/is-alphabetical": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", - "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -8992,8 +8346,7 @@ }, "node_modules/is-alphanumerical": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", - "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", "dependencies": { "is-alphabetical": "^2.0.0", "is-decimal": "^2.0.0" @@ -9007,7 +8360,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.1" @@ -9021,14 +8373,12 @@ }, "node_modules/is-arrayish": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + "license": "MIT" }, "node_modules/is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "license": "MIT", "dependencies": { "has-bigints": "^1.0.1" }, @@ -9038,8 +8388,7 @@ }, "node_modules/is-binary-path": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" }, @@ -9051,7 +8400,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -9067,7 +8415,6 @@ "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -9077,8 +8424,7 @@ }, "node_modules/is-ci": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "license": "MIT", "dependencies": { "ci-info": "^3.2.0" }, @@ -9088,8 +8434,7 @@ }, "node_modules/is-core-module": { "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "license": "MIT", "dependencies": { "hasown": "^2.0.0" }, @@ -9101,7 +8446,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", - "license": "MIT", "dependencies": { "is-typed-array": "^1.1.13" }, @@ -9116,7 +8460,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -9129,8 +8472,7 @@ }, "node_modules/is-decimal": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", - "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -9138,8 +8480,7 @@ }, "node_modules/is-docker": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "license": "MIT", "bin": { "is-docker": "cli.js" }, @@ -9152,32 +8493,28 @@ }, "node_modules/is-extendable": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-extglob": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-glob": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -9187,8 +8524,7 @@ }, "node_modules/is-hexadecimal": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", - "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -9196,8 +8532,7 @@ }, "node_modules/is-installed-globally": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "license": "MIT", "dependencies": { "global-dirs": "^3.0.0", "is-path-inside": "^3.0.2" @@ -9213,7 +8548,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -9223,8 +8557,7 @@ }, "node_modules/is-npm": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz", - "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==", + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -9236,7 +8569,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -9245,7 +8577,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -9258,32 +8589,28 @@ }, "node_modules/is-obj": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-path-cwd": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/is-path-inside": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-plain-obj": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -9292,20 +8619,15 @@ } }, "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dependencies": { - "isobject": "^3.0.1" - }, + "version": "5.0.0", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-reference": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", - "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==", + "license": "MIT", "dependencies": { "@types/estree": "*" } @@ -9314,7 +8636,6 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -9328,16 +8649,14 @@ }, "node_modules/is-regexp": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-root": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", - "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", + "license": "MIT", "engines": { "node": ">=6" } @@ -9346,7 +8665,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.7" }, @@ -9359,8 +8677,7 @@ }, "node_modules/is-stream": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", "engines": { "node": ">=8" }, @@ -9372,7 +8689,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -9387,14 +8703,12 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", "integrity": "sha512-6Ybun0IkarhmEqxXCNw/C0bna6Zb/TkfUX9UbwJtK6ObwAVCxmAP308WWTHviM/zAqXk05cdhYsUsZeGQh99iw==", - "license": "MIT", "peer": true }, "node_modules/is-symbol": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "license": "MIT", "dependencies": { "has-symbols": "^1.0.2" }, @@ -9409,7 +8723,6 @@ "version": "1.1.13", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", - "license": "MIT", "dependencies": { "which-typed-array": "^1.1.14" }, @@ -9422,14 +8735,12 @@ }, "node_modules/is-typedarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + "license": "MIT" }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.2" }, @@ -9439,8 +8750,7 @@ }, "node_modules/is-wsl": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "license": "MIT", "dependencies": { "is-docker": "^2.0.0" }, @@ -9450,26 +8760,22 @@ }, "node_modules/is-yarn-global": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz", - "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==", + "license": "MIT", "engines": { "node": ">=12" } }, "node_modules/isarray": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + "license": "MIT" }, "node_modules/isexe": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + "license": "ISC" }, "node_modules/isobject": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -9520,16 +8826,14 @@ }, "node_modules/jiti": { "version": "1.21.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", - "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "license": "MIT", "bin": { "jiti": "bin/jiti.js" } }, "node_modules/joi": { - "version": "17.13.1", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.1.tgz", - "integrity": "sha512-vaBlIKCyo4FCUtCm7Eu4QZd/q02bWcxfUO6YSXAZOWF6gzcLBeba8kwotUdYJjDLW8Cz8RywsSOqiNJZW0mNvg==", + "version": "17.12.2", + "license": "BSD-3-Clause", "dependencies": { "@hapi/hoek": "^9.3.0", "@hapi/topo": "^5.1.0", @@ -9542,20 +8846,17 @@ "version": "1.1.6", "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/js-tokens": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "license": "MIT" }, "node_modules/js-yaml": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -9565,8 +8866,7 @@ }, "node_modules/jsesc": { "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, @@ -9576,32 +8876,27 @@ }, "node_modules/json-buffer": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + "license": "MIT" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + "license": "MIT" }, "node_modules/json-pointer": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/json-pointer/-/json-pointer-0.6.2.tgz", "integrity": "sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw==", - "license": "MIT", "dependencies": { "foreach": "^2.0.4" } }, "node_modules/json-schema-traverse": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + "license": "MIT" }, "node_modules/json5": { "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -9611,8 +8906,7 @@ }, "node_modules/jsonfile": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "license": "MIT", "dependencies": { "universalify": "^2.0.0" }, @@ -9637,45 +8931,38 @@ }, "node_modules/katex/node_modules/commander": { "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "license": "MIT", "engines": { "node": ">= 12" } }, "node_modules/keyv": { "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } }, "node_modules/khroma": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz", - "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==" + "version": "2.1.0" }, "node_modules/kind-of": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/kleur": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/latest-version": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", - "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", + "license": "MIT", "dependencies": { "package-json": "^8.1.0" }, @@ -9688,8 +8975,7 @@ }, "node_modules/launch-editor": { "version": "2.6.1", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", - "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", + "license": "MIT", "dependencies": { "picocolors": "^1.0.0", "shell-quote": "^1.8.1" @@ -9697,21 +8983,19 @@ }, "node_modules/layout-base": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", - "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==" + "license": "MIT" }, "node_modules/leven": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/lilconfig": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz", - "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", "engines": { "node": ">=14" }, @@ -9721,21 +9005,18 @@ }, "node_modules/lines-and-columns": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + "license": "MIT" }, "node_modules/loader-runner": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "license": "MIT", "engines": { "node": ">=6.11.5" } }, "node_modules/loader-utils": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "license": "MIT", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -9747,8 +9028,7 @@ }, "node_modules/locate-path": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "license": "MIT", "dependencies": { "p-locate": "^6.0.0" }, @@ -9761,38 +9041,32 @@ }, "node_modules/lodash": { "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "license": "MIT" }, "node_modules/lodash-es": { "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + "license": "MIT" }, "node_modules/lodash.debounce": { "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + "license": "MIT" }, "node_modules/lodash.escape": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz", "integrity": "sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw==", - "license": "MIT", "peer": true }, "node_modules/lodash.flattendeep": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", - "license": "MIT", "peer": true }, "node_modules/lodash.isequal": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", - "license": "MIT" + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" }, "node_modules/lodash.memoize": { "version": "4.1.2", @@ -9806,8 +9080,7 @@ }, "node_modules/longest-streak": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", - "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -9815,8 +9088,7 @@ }, "node_modules/loose-envify": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, @@ -9826,16 +9098,14 @@ }, "node_modules/lower-case": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "license": "MIT", "dependencies": { "tslib": "^2.0.3" } }, "node_modules/lowercase-keys": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -9845,8 +9115,7 @@ }, "node_modules/lru-cache": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", "dependencies": { "yallist": "^3.0.2" } @@ -9854,19 +9123,16 @@ "node_modules/lunr": { "version": "2.3.9", "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", - "license": "MIT" + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==" }, "node_modules/mark.js": { "version": "8.11.1", "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", - "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", - "license": "MIT" + "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==" }, "node_modules/markdown-extensions": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", - "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", + "license": "MIT", "engines": { "node": ">=16" }, @@ -9876,8 +9142,7 @@ }, "node_modules/markdown-table": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", - "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -9887,7 +9152,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", - "license": "MIT", "bin": { "marked": "bin/marked.js" }, @@ -9897,8 +9161,7 @@ }, "node_modules/mdast-util-directive": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.0.0.tgz", - "integrity": "sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", @@ -9916,8 +9179,7 @@ }, "node_modules/mdast-util-find-and-replace": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz", - "integrity": "sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "escape-string-regexp": "^5.0.0", @@ -9931,8 +9193,7 @@ }, "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -9942,8 +9203,7 @@ }, "node_modules/mdast-util-from-markdown": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz", - "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", @@ -9965,8 +9225,6 @@ }, "node_modules/mdast-util-from-markdown/node_modules/micromark-util-symbol": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", "funding": [ { "type": "GitHub Sponsors", @@ -9976,12 +9234,12 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/mdast-util-frontmatter": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz", - "integrity": "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", @@ -9997,8 +9255,7 @@ }, "node_modules/mdast-util-frontmatter/node_modules/escape-string-regexp": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -10008,8 +9265,7 @@ }, "node_modules/mdast-util-gfm": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz", - "integrity": "sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==", + "license": "MIT", "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-gfm-autolink-literal": "^2.0.0", @@ -10026,8 +9282,7 @@ }, "node_modules/mdast-util-gfm-autolink-literal": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.0.tgz", - "integrity": "sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "ccount": "^2.0.0", @@ -10042,8 +9297,6 @@ }, "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-character": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -10054,6 +9307,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -10061,8 +9315,6 @@ }, "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-symbol": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", "funding": [ { "type": "GitHub Sponsors", @@ -10072,12 +9324,12 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/mdast-util-gfm-footnote": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz", - "integrity": "sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.1.0", @@ -10092,8 +9344,7 @@ }, "node_modules/mdast-util-gfm-strikethrough": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", - "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", @@ -10106,8 +9357,7 @@ }, "node_modules/mdast-util-gfm-table": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", - "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", @@ -10122,8 +9372,7 @@ }, "node_modules/mdast-util-gfm-task-list-item": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", - "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", @@ -10137,8 +9386,7 @@ }, "node_modules/mdast-util-mdx": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", - "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", + "license": "MIT", "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-mdx-expression": "^2.0.0", @@ -10153,8 +9401,7 @@ }, "node_modules/mdast-util-mdx-expression": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.0.tgz", - "integrity": "sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==", + "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", @@ -10170,8 +9417,7 @@ }, "node_modules/mdast-util-mdx-jsx": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.2.tgz", - "integrity": "sha512-eKMQDeywY2wlHc97k5eD8VC+9ASMjN8ItEZQNGwJ6E0XWKiW/Z0V5/H8pvoXUf+y+Mj0VIgeRRbujBmFn4FTyA==", + "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", @@ -10194,8 +9440,7 @@ }, "node_modules/mdast-util-mdxjs-esm": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", - "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", @@ -10211,8 +9456,7 @@ }, "node_modules/mdast-util-phrasing": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", - "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "unist-util-is": "^6.0.0" @@ -10224,8 +9468,7 @@ }, "node_modules/mdast-util-to-hast": { "version": "13.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.1.0.tgz", - "integrity": "sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", @@ -10244,8 +9487,7 @@ }, "node_modules/mdast-util-to-markdown": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", - "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", @@ -10263,8 +9505,7 @@ }, "node_modules/mdast-util-to-string": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", - "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0" }, @@ -10280,16 +9521,14 @@ }, "node_modules/media-typer": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/memfs": { "version": "3.5.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", - "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "license": "Unlicense", "dependencies": { "fs-monkey": "^1.0.4" }, @@ -10299,26 +9538,22 @@ }, "node_modules/merge-descriptors": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + "license": "MIT" }, "node_modules/merge-stream": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + "license": "MIT" }, "node_modules/merge2": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/mermaid": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-10.9.1.tgz", - "integrity": "sha512-Mx45Obds5W1UkW1nv/7dHRsbfMM1aOKA2+Pxs/IGHNonygDHwmng8xTHyS9z4KWVi0rbko8gjiBmuwwXQ7tiNA==", + "version": "10.9.0", + "license": "MIT", "dependencies": { "@braintree/sanitize-url": "^6.0.1", "@types/d3-scale": "^4.0.3", @@ -10344,21 +9579,18 @@ }, "node_modules/mermaid/node_modules/@types/mdast": { "version": "3.0.15", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", - "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", + "license": "MIT", "dependencies": { "@types/unist": "^2" } }, "node_modules/mermaid/node_modules/@types/unist": { "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", - "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" + "license": "MIT" }, "node_modules/mermaid/node_modules/mdast-util-from-markdown": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", - "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==", + "license": "MIT", "dependencies": { "@types/mdast": "^3.0.0", "@types/unist": "^2.0.0", @@ -10380,8 +9612,7 @@ }, "node_modules/mermaid/node_modules/mdast-util-to-string": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", - "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", + "license": "MIT", "dependencies": { "@types/mdast": "^3.0.0" }, @@ -10392,8 +9623,6 @@ }, "node_modules/mermaid/node_modules/micromark": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz", - "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==", "funding": [ { "type": "GitHub Sponsors", @@ -10404,6 +9633,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "@types/debug": "^4.0.0", "debug": "^4.0.0", @@ -10426,8 +9656,6 @@ }, "node_modules/mermaid/node_modules/micromark-core-commonmark": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz", - "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==", "funding": [ { "type": "GitHub Sponsors", @@ -10438,6 +9666,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "decode-named-character-reference": "^1.0.0", "micromark-factory-destination": "^1.0.0", @@ -10459,8 +9688,6 @@ }, "node_modules/mermaid/node_modules/micromark-factory-destination": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", - "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==", "funding": [ { "type": "GitHub Sponsors", @@ -10471,6 +9698,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^1.0.0", "micromark-util-symbol": "^1.0.0", @@ -10479,8 +9707,6 @@ }, "node_modules/mermaid/node_modules/micromark-factory-label": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz", - "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==", "funding": [ { "type": "GitHub Sponsors", @@ -10491,6 +9717,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^1.0.0", "micromark-util-symbol": "^1.0.0", @@ -10500,8 +9727,6 @@ }, "node_modules/mermaid/node_modules/micromark-factory-title": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz", - "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==", "funding": [ { "type": "GitHub Sponsors", @@ -10512,6 +9737,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-factory-space": "^1.0.0", "micromark-util-character": "^1.0.0", @@ -10521,8 +9747,6 @@ }, "node_modules/mermaid/node_modules/micromark-factory-whitespace": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz", - "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==", "funding": [ { "type": "GitHub Sponsors", @@ -10533,6 +9757,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-factory-space": "^1.0.0", "micromark-util-character": "^1.0.0", @@ -10542,8 +9767,6 @@ }, "node_modules/mermaid/node_modules/micromark-util-chunked": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz", - "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==", "funding": [ { "type": "GitHub Sponsors", @@ -10554,14 +9777,13 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^1.0.0" } }, "node_modules/mermaid/node_modules/micromark-util-classify-character": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz", - "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==", "funding": [ { "type": "GitHub Sponsors", @@ -10572,6 +9794,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^1.0.0", "micromark-util-symbol": "^1.0.0", @@ -10580,8 +9803,6 @@ }, "node_modules/mermaid/node_modules/micromark-util-combine-extensions": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz", - "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==", "funding": [ { "type": "GitHub Sponsors", @@ -10592,6 +9813,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-chunked": "^1.0.0", "micromark-util-types": "^1.0.0" @@ -10599,8 +9821,6 @@ }, "node_modules/mermaid/node_modules/micromark-util-decode-numeric-character-reference": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", - "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", "funding": [ { "type": "GitHub Sponsors", @@ -10611,14 +9831,13 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^1.0.0" } }, "node_modules/mermaid/node_modules/micromark-util-decode-string": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz", - "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==", "funding": [ { "type": "GitHub Sponsors", @@ -10629,6 +9848,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "decode-named-character-reference": "^1.0.0", "micromark-util-character": "^1.0.0", @@ -10638,8 +9858,6 @@ }, "node_modules/mermaid/node_modules/micromark-util-encode": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", - "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==", "funding": [ { "type": "GitHub Sponsors", @@ -10649,12 +9867,11 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/mermaid/node_modules/micromark-util-html-tag-name": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz", - "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==", "funding": [ { "type": "GitHub Sponsors", @@ -10664,12 +9881,11 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/mermaid/node_modules/micromark-util-normalize-identifier": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", - "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", "funding": [ { "type": "GitHub Sponsors", @@ -10680,14 +9896,13 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^1.0.0" } }, "node_modules/mermaid/node_modules/micromark-util-resolve-all": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz", - "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==", "funding": [ { "type": "GitHub Sponsors", @@ -10698,14 +9913,13 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-types": "^1.0.0" } }, "node_modules/mermaid/node_modules/micromark-util-sanitize-uri": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", - "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", "funding": [ { "type": "GitHub Sponsors", @@ -10716,6 +9930,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^1.0.0", "micromark-util-encode": "^1.0.0", @@ -10724,8 +9939,6 @@ }, "node_modules/mermaid/node_modules/micromark-util-subtokenize": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz", - "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==", "funding": [ { "type": "GitHub Sponsors", @@ -10736,6 +9949,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-chunked": "^1.0.0", "micromark-util-symbol": "^1.0.0", @@ -10745,8 +9959,6 @@ }, "node_modules/mermaid/node_modules/micromark-util-types": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", - "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", "funding": [ { "type": "GitHub Sponsors", @@ -10756,12 +9968,12 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/mermaid/node_modules/unist-util-stringify-position": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", - "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", + "license": "MIT", "dependencies": { "@types/unist": "^2.0.0" }, @@ -10772,16 +9984,13 @@ }, "node_modules/methods": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/micromark": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", - "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", "funding": [ { "type": "GitHub Sponsors", @@ -10792,6 +10001,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "@types/debug": "^4.0.0", "debug": "^4.0.0", @@ -10813,9 +10023,7 @@ } }, "node_modules/micromark-core-commonmark": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.1.tgz", - "integrity": "sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==", + "version": "2.0.0", "funding": [ { "type": "GitHub Sponsors", @@ -10826,6 +10034,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", @@ -10847,8 +10056,6 @@ }, "node_modules/micromark-core-commonmark/node_modules/micromark-factory-space": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", "funding": [ { "type": "GitHub Sponsors", @@ -10859,6 +10066,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -10866,8 +10074,6 @@ }, "node_modules/micromark-core-commonmark/node_modules/micromark-util-character": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -10878,6 +10084,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -10885,8 +10092,6 @@ }, "node_modules/micromark-core-commonmark/node_modules/micromark-util-symbol": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", "funding": [ { "type": "GitHub Sponsors", @@ -10896,12 +10101,12 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-extension-directive": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.0.tgz", - "integrity": "sha512-61OI07qpQrERc+0wEysLHMvoiO3s2R56x5u7glHq2Yqq6EHbH4dW25G9GfDdGCDYqA21KE6DWgNSzxSwHc2hSg==", + "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", @@ -10918,8 +10123,6 @@ }, "node_modules/micromark-extension-directive/node_modules/micromark-factory-space": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", "funding": [ { "type": "GitHub Sponsors", @@ -10930,6 +10133,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -10937,8 +10141,6 @@ }, "node_modules/micromark-extension-directive/node_modules/micromark-util-character": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -10949,6 +10151,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -10956,8 +10159,6 @@ }, "node_modules/micromark-extension-directive/node_modules/micromark-util-symbol": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", "funding": [ { "type": "GitHub Sponsors", @@ -10967,12 +10168,12 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-extension-frontmatter": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz", - "integrity": "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==", + "license": "MIT", "dependencies": { "fault": "^2.0.0", "micromark-util-character": "^2.0.0", @@ -10986,8 +10187,6 @@ }, "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-character": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -10998,6 +10197,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -11005,8 +10205,6 @@ }, "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-symbol": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", "funding": [ { "type": "GitHub Sponsors", @@ -11016,12 +10214,12 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-extension-gfm": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", - "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "license": "MIT", "dependencies": { "micromark-extension-gfm-autolink-literal": "^2.0.0", "micromark-extension-gfm-footnote": "^2.0.0", @@ -11039,8 +10237,7 @@ }, "node_modules/micromark-extension-gfm-autolink-literal": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.0.0.tgz", - "integrity": "sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==", + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", @@ -11054,8 +10251,6 @@ }, "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-character": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -11066,6 +10261,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -11073,8 +10269,6 @@ }, "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-symbol": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", "funding": [ { "type": "GitHub Sponsors", @@ -11084,12 +10278,12 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-extension-gfm-footnote": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.0.0.tgz", - "integrity": "sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg==", + "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", @@ -11107,8 +10301,6 @@ }, "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-factory-space": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", "funding": [ { "type": "GitHub Sponsors", @@ -11119,6 +10311,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -11126,8 +10319,6 @@ }, "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-character": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -11138,6 +10329,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -11145,8 +10337,6 @@ }, "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-symbol": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", "funding": [ { "type": "GitHub Sponsors", @@ -11156,12 +10346,12 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-extension-gfm-strikethrough": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.0.0.tgz", - "integrity": "sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw==", + "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", @@ -11177,8 +10367,6 @@ }, "node_modules/micromark-extension-gfm-strikethrough/node_modules/micromark-util-symbol": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", "funding": [ { "type": "GitHub Sponsors", @@ -11188,12 +10376,12 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-extension-gfm-table": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.0.0.tgz", - "integrity": "sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw==", + "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", @@ -11208,8 +10396,6 @@ }, "node_modules/micromark-extension-gfm-table/node_modules/micromark-factory-space": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", "funding": [ { "type": "GitHub Sponsors", @@ -11220,6 +10406,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -11227,8 +10414,6 @@ }, "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-character": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -11239,6 +10424,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -11246,8 +10432,6 @@ }, "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-symbol": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", "funding": [ { "type": "GitHub Sponsors", @@ -11257,12 +10441,12 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-extension-gfm-tagfilter": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", - "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "license": "MIT", "dependencies": { "micromark-util-types": "^2.0.0" }, @@ -11273,8 +10457,7 @@ }, "node_modules/micromark-extension-gfm-task-list-item": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.0.1.tgz", - "integrity": "sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw==", + "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", @@ -11289,8 +10472,6 @@ }, "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-factory-space": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", "funding": [ { "type": "GitHub Sponsors", @@ -11301,6 +10482,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -11308,8 +10490,6 @@ }, "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-character": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -11320,6 +10500,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -11327,8 +10508,6 @@ }, "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-symbol": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", "funding": [ { "type": "GitHub Sponsors", @@ -11338,12 +10517,11 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-extension-mdx-expression": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.0.tgz", - "integrity": "sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==", "funding": [ { "type": "GitHub Sponsors", @@ -11354,6 +10532,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", @@ -11367,8 +10546,6 @@ }, "node_modules/micromark-extension-mdx-expression/node_modules/micromark-factory-space": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", "funding": [ { "type": "GitHub Sponsors", @@ -11379,6 +10556,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -11386,8 +10564,6 @@ }, "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-character": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -11398,6 +10574,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -11405,8 +10582,6 @@ }, "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-symbol": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", "funding": [ { "type": "GitHub Sponsors", @@ -11416,12 +10591,12 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-extension-mdx-jsx": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.0.tgz", - "integrity": "sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w==", + "license": "MIT", "dependencies": { "@types/acorn": "^4.0.0", "@types/estree": "^1.0.0", @@ -11441,8 +10616,6 @@ }, "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-factory-space": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", "funding": [ { "type": "GitHub Sponsors", @@ -11453,6 +10626,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -11460,8 +10634,6 @@ }, "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-character": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -11472,6 +10644,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -11479,8 +10652,6 @@ }, "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-symbol": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", "funding": [ { "type": "GitHub Sponsors", @@ -11490,12 +10661,12 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-extension-mdx-md": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", - "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", + "license": "MIT", "dependencies": { "micromark-util-types": "^2.0.0" }, @@ -11506,8 +10677,7 @@ }, "node_modules/micromark-extension-mdxjs": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", - "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", + "license": "MIT", "dependencies": { "acorn": "^8.0.0", "acorn-jsx": "^5.0.0", @@ -11525,8 +10695,7 @@ }, "node_modules/micromark-extension-mdxjs-esm": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", - "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", @@ -11545,8 +10714,6 @@ }, "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-character": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -11557,6 +10724,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -11564,8 +10732,6 @@ }, "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-symbol": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", "funding": [ { "type": "GitHub Sponsors", @@ -11575,12 +10741,11 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-factory-destination": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", - "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", "funding": [ { "type": "GitHub Sponsors", @@ -11591,6 +10756,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", @@ -11599,8 +10765,6 @@ }, "node_modules/micromark-factory-destination/node_modules/micromark-util-character": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -11611,6 +10775,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -11618,8 +10783,6 @@ }, "node_modules/micromark-factory-destination/node_modules/micromark-util-symbol": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", "funding": [ { "type": "GitHub Sponsors", @@ -11629,12 +10792,11 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-factory-label": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", - "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", "funding": [ { "type": "GitHub Sponsors", @@ -11645,6 +10807,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-util-character": "^2.0.0", @@ -11654,8 +10817,6 @@ }, "node_modules/micromark-factory-label/node_modules/micromark-util-character": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -11666,6 +10827,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -11673,8 +10835,6 @@ }, "node_modules/micromark-factory-label/node_modules/micromark-util-symbol": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", "funding": [ { "type": "GitHub Sponsors", @@ -11684,12 +10844,11 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-factory-mdx-expression": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.1.tgz", - "integrity": "sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg==", "funding": [ { "type": "GitHub Sponsors", @@ -11700,6 +10859,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", @@ -11713,8 +10873,6 @@ }, "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-character": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -11725,6 +10883,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -11732,8 +10891,6 @@ }, "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-symbol": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", "funding": [ { "type": "GitHub Sponsors", @@ -11743,12 +10900,11 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-factory-space": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", - "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", "funding": [ { "type": "GitHub Sponsors", @@ -11759,6 +10915,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^1.0.0", "micromark-util-types": "^1.0.0" @@ -11766,8 +10923,6 @@ }, "node_modules/micromark-factory-space/node_modules/micromark-util-types": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", - "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", "funding": [ { "type": "GitHub Sponsors", @@ -11777,12 +10932,11 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-factory-title": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", - "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", "funding": [ { "type": "GitHub Sponsors", @@ -11793,6 +10947,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", @@ -11802,8 +10957,6 @@ }, "node_modules/micromark-factory-title/node_modules/micromark-factory-space": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", "funding": [ { "type": "GitHub Sponsors", @@ -11814,6 +10967,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -11821,8 +10975,6 @@ }, "node_modules/micromark-factory-title/node_modules/micromark-util-character": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -11833,6 +10985,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -11840,8 +10993,6 @@ }, "node_modules/micromark-factory-title/node_modules/micromark-util-symbol": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", "funding": [ { "type": "GitHub Sponsors", @@ -11851,12 +11002,11 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-factory-whitespace": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", - "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", "funding": [ { "type": "GitHub Sponsors", @@ -11867,6 +11017,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", @@ -11876,8 +11027,6 @@ }, "node_modules/micromark-factory-whitespace/node_modules/micromark-factory-space": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", "funding": [ { "type": "GitHub Sponsors", @@ -11888,6 +11037,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -11895,8 +11045,6 @@ }, "node_modules/micromark-factory-whitespace/node_modules/micromark-util-character": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -11907,6 +11055,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -11914,8 +11063,6 @@ }, "node_modules/micromark-factory-whitespace/node_modules/micromark-util-symbol": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", "funding": [ { "type": "GitHub Sponsors", @@ -11925,12 +11072,11 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-util-character": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", - "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", "funding": [ { "type": "GitHub Sponsors", @@ -11941,6 +11087,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0" @@ -11948,8 +11095,6 @@ }, "node_modules/micromark-util-character/node_modules/micromark-util-types": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", - "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", "funding": [ { "type": "GitHub Sponsors", @@ -11959,12 +11104,11 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-util-chunked": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", - "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", "funding": [ { "type": "GitHub Sponsors", @@ -11975,14 +11119,13 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "node_modules/micromark-util-chunked/node_modules/micromark-util-symbol": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", "funding": [ { "type": "GitHub Sponsors", @@ -11992,12 +11135,11 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-util-classify-character": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", - "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", "funding": [ { "type": "GitHub Sponsors", @@ -12008,6 +11150,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", @@ -12016,8 +11159,6 @@ }, "node_modules/micromark-util-classify-character/node_modules/micromark-util-character": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -12028,6 +11169,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -12035,8 +11177,6 @@ }, "node_modules/micromark-util-classify-character/node_modules/micromark-util-symbol": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", "funding": [ { "type": "GitHub Sponsors", @@ -12046,12 +11186,11 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-util-combine-extensions": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", - "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", "funding": [ { "type": "GitHub Sponsors", @@ -12062,6 +11201,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-chunked": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -12069,8 +11209,6 @@ }, "node_modules/micromark-util-decode-numeric-character-reference": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", - "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", "funding": [ { "type": "GitHub Sponsors", @@ -12081,14 +11219,13 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "node_modules/micromark-util-decode-numeric-character-reference/node_modules/micromark-util-symbol": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", "funding": [ { "type": "GitHub Sponsors", @@ -12098,12 +11235,11 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-util-decode-string": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", - "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", "funding": [ { "type": "GitHub Sponsors", @@ -12114,6 +11250,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "decode-named-character-reference": "^1.0.0", "micromark-util-character": "^2.0.0", @@ -12123,8 +11260,6 @@ }, "node_modules/micromark-util-decode-string/node_modules/micromark-util-character": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -12135,6 +11270,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -12142,8 +11278,6 @@ }, "node_modules/micromark-util-decode-string/node_modules/micromark-util-symbol": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", "funding": [ { "type": "GitHub Sponsors", @@ -12153,12 +11287,11 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-util-encode": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", - "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", "funding": [ { "type": "GitHub Sponsors", @@ -12168,12 +11301,11 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-util-events-to-acorn": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.2.tgz", - "integrity": "sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==", "funding": [ { "type": "GitHub Sponsors", @@ -12184,6 +11316,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "@types/acorn": "^4.0.0", "@types/estree": "^1.0.0", @@ -12197,8 +11330,6 @@ }, "node_modules/micromark-util-events-to-acorn/node_modules/micromark-util-symbol": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", "funding": [ { "type": "GitHub Sponsors", @@ -12208,12 +11339,11 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-util-html-tag-name": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", - "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", "funding": [ { "type": "GitHub Sponsors", @@ -12223,12 +11353,11 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-util-normalize-identifier": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", - "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", "funding": [ { "type": "GitHub Sponsors", @@ -12239,14 +11368,13 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "node_modules/micromark-util-normalize-identifier/node_modules/micromark-util-symbol": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", "funding": [ { "type": "GitHub Sponsors", @@ -12256,12 +11384,11 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-util-resolve-all": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", - "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", "funding": [ { "type": "GitHub Sponsors", @@ -12272,14 +11399,13 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-util-sanitize-uri": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", - "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", "funding": [ { "type": "GitHub Sponsors", @@ -12290,6 +11416,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-encode": "^2.0.0", @@ -12298,8 +11425,6 @@ }, "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-character": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -12310,6 +11435,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -12317,8 +11443,6 @@ }, "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-symbol": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", "funding": [ { "type": "GitHub Sponsors", @@ -12328,12 +11452,11 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-util-subtokenize": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.1.tgz", - "integrity": "sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==", + "version": "2.0.0", "funding": [ { "type": "GitHub Sponsors", @@ -12344,6 +11467,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", @@ -12353,8 +11477,6 @@ }, "node_modules/micromark-util-subtokenize/node_modules/micromark-util-symbol": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", "funding": [ { "type": "GitHub Sponsors", @@ -12364,12 +11486,11 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-util-symbol": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", - "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", "funding": [ { "type": "GitHub Sponsors", @@ -12379,12 +11500,11 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-util-types": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", - "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", "funding": [ { "type": "GitHub Sponsors", @@ -12394,12 +11514,11 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark/node_modules/micromark-factory-space": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", "funding": [ { "type": "GitHub Sponsors", @@ -12410,6 +11529,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -12417,8 +11537,6 @@ }, "node_modules/micromark/node_modules/micromark-util-character": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -12429,6 +11547,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -12436,8 +11555,6 @@ }, "node_modules/micromark/node_modules/micromark-util-symbol": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", "funding": [ { "type": "GitHub Sponsors", @@ -12447,15 +11564,14 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "version": "4.0.5", "license": "MIT", "dependencies": { - "braces": "^3.0.3", + "braces": "^3.0.2", "picomatch": "^2.3.1" }, "engines": { @@ -12464,8 +11580,7 @@ }, "node_modules/mime": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", "bin": { "mime": "cli.js" }, @@ -12475,16 +11590,14 @@ }, "node_modules/mime-db": { "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "license": "MIT", "dependencies": { "mime-db": "~1.33.0" }, @@ -12494,16 +11607,14 @@ }, "node_modules/mimic-fn": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/mimic-response": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", - "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -12512,9 +11623,8 @@ } }, "node_modules/mini-css-extract-plugin": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.0.tgz", - "integrity": "sha512-Zs1YsZVfemekSZG+44vBsYTLQORkPMwnlv+aehcxK/NLKC+EGhDB39/YePYYqx/sTk6NnYpuqikhSn7+JIevTA==", + "version": "2.8.1", + "license": "MIT", "dependencies": { "schema-utils": "^4.0.0", "tapable": "^2.2.1" @@ -12532,13 +11642,11 @@ }, "node_modules/minimalistic-assert": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + "license": "ISC" }, "node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -12548,17 +11656,15 @@ }, "node_modules/minimist": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/mobx": { - "version": "6.13.1", - "resolved": "https://registry.npmjs.org/mobx/-/mobx-6.13.1.tgz", - "integrity": "sha512-ekLRxgjWJr8hVxj9ZKuClPwM/iHckx3euIJ3Np7zLVNtqJvfbbq7l370W/98C8EabdQ1pB5Jd3BbDWxJPNnaOg==", - "license": "MIT", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/mobx/-/mobx-6.13.0.tgz", + "integrity": "sha512-1laWODrBWmB7mDJ8EClCjUQTyLwJ0ydJgE4FtK7t9r3JnjXgc9OhmYs2P4RtHrY1co5+4T6cKP2UswX2SU29mA==", "funding": { "type": "opencollective", "url": "https://opencollective.com/mobx" @@ -12568,7 +11674,6 @@ "version": "9.1.1", "resolved": "https://registry.npmjs.org/mobx-react/-/mobx-react-9.1.1.tgz", "integrity": "sha512-gVV7AdSrAAxqXOJ2bAbGa5TkPqvITSzaPiiEkzpW4rRsMhSec7C2NBCJYILADHKp2tzOAIETGRsIY0UaCV5aEw==", - "license": "MIT", "dependencies": { "mobx-react-lite": "^4.0.7" }, @@ -12593,7 +11698,6 @@ "version": "4.0.7", "resolved": "https://registry.npmjs.org/mobx-react-lite/-/mobx-react-lite-4.0.7.tgz", "integrity": "sha512-RjwdseshK9Mg8On5tyJZHtGD+J78ZnCnRaxeQDSiciKVQDUbfZcXhmld0VMxAwvcTnPEHZySGGewm467Fcpreg==", - "license": "MIT", "dependencies": { "use-sync-external-store": "^1.2.0" }, @@ -12618,34 +11722,29 @@ "version": "0.5.2", "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz", "integrity": "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==", - "license": "BSD-3-Clause", "peer": true }, "node_modules/mri": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/mrmime": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", - "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", + "license": "MIT", "engines": { "node": ">=10" } }, "node_modules/ms": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "license": "MIT" }, "node_modules/multicast-dns": { "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "license": "MIT", "dependencies": { "dns-packet": "^5.2.2", "thunky": "^1.0.2" @@ -12656,14 +11755,13 @@ }, "node_modules/nanoid": { "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -12675,7 +11773,6 @@ "version": "2.20.1", "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.20.1.tgz", "integrity": "sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==", - "license": "MIT", "peer": true, "dependencies": { "commander": "^2.19.0", @@ -12698,26 +11795,22 @@ "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "license": "MIT", "peer": true }, "node_modules/negotiator": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/neo-async": { "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + "license": "MIT" }, "node_modules/no-case": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "license": "MIT", "dependencies": { "lower-case": "^2.0.2", "tslib": "^2.0.3" @@ -12725,8 +11818,7 @@ }, "node_modules/node-emoji": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.1.3.tgz", - "integrity": "sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==", + "license": "MIT", "dependencies": { "@sindresorhus/is": "^4.6.0", "char-regex": "^1.0.2", @@ -12741,7 +11833,6 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -12761,7 +11852,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/node-fetch-h2/-/node-fetch-h2-2.3.0.tgz", "integrity": "sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg==", - "license": "MIT", "dependencies": { "http2-client": "^1.2.5" }, @@ -12771,8 +11861,7 @@ }, "node_modules/node-forge": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "license": "(BSD-3-Clause OR GPL-2.0)", "engines": { "node": ">= 6.13.0" } @@ -12781,7 +11870,6 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/node-readfiles/-/node-readfiles-0.2.0.tgz", "integrity": "sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA==", - "license": "MIT", "dependencies": { "es6-promise": "^3.2.1" } @@ -12789,18 +11877,15 @@ "node_modules/node-releases": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", - "license": "MIT" + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==" }, "node_modules/non-layered-tidy-tree-layout": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz", - "integrity": "sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==" + "license": "MIT" }, "node_modules/normalize-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -12809,26 +11894,13 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/normalize-url": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz", - "integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/npm-run-path": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "license": "MIT", "dependencies": { "path-key": "^3.0.0" }, @@ -12839,13 +11911,11 @@ "node_modules/nprogress": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", - "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==", - "license": "MIT" + "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==" }, "node_modules/nth-check": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0" }, @@ -12857,7 +11927,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/oas-kit-common/-/oas-kit-common-1.0.8.tgz", "integrity": "sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ==", - "license": "BSD-3-Clause", "dependencies": { "fast-safe-stringify": "^2.0.7" } @@ -12866,7 +11935,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/oas-linter/-/oas-linter-3.2.2.tgz", "integrity": "sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ==", - "license": "BSD-3-Clause", "dependencies": { "@exodus/schemasafe": "^1.0.0-rc.2", "should": "^13.2.1", @@ -12880,7 +11948,6 @@ "version": "2.5.6", "resolved": "https://registry.npmjs.org/oas-resolver/-/oas-resolver-2.5.6.tgz", "integrity": "sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ==", - "license": "BSD-3-Clause", "dependencies": { "node-fetch-h2": "^2.3.0", "oas-kit-common": "^1.0.8", @@ -12899,7 +11966,6 @@ "version": "1.1.5", "resolved": "https://registry.npmjs.org/oas-schema-walker/-/oas-schema-walker-1.1.5.tgz", "integrity": "sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ==", - "license": "BSD-3-Clause", "funding": { "url": "https://github.com/Mermade/oas-kit?sponsor=1" } @@ -12908,7 +11974,6 @@ "version": "5.0.8", "resolved": "https://registry.npmjs.org/oas-validator/-/oas-validator-5.0.8.tgz", "integrity": "sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw==", - "license": "BSD-3-Clause", "dependencies": { "call-me-maybe": "^1.0.1", "oas-kit-common": "^1.0.8", @@ -12925,16 +11990,14 @@ }, "node_modules/object-assign": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/object-inspect": { "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -12943,7 +12006,6 @@ "version": "1.1.6", "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1" @@ -12957,16 +12019,14 @@ }, "node_modules/object-keys": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/object.assign": { "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "license": "MIT", "dependencies": { "call-bind": "^1.0.5", "define-properties": "^1.2.1", @@ -12984,7 +12044,6 @@ "version": "1.1.8", "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", - "license": "MIT", "peer": true, "dependencies": { "call-bind": "^1.0.7", @@ -12999,7 +12058,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", - "license": "MIT", "peer": true, "dependencies": { "call-bind": "^1.0.7", @@ -13015,13 +12073,11 @@ }, "node_modules/obuf": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" + "license": "MIT" }, "node_modules/on-finished": { "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", "dependencies": { "ee-first": "1.1.1" }, @@ -13031,24 +12087,21 @@ }, "node_modules/on-headers": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/once": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", "dependencies": { "wrappy": "1" } }, "node_modules/onetime": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -13061,8 +12114,7 @@ }, "node_modules/open": { "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "license": "MIT", "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", @@ -13079,7 +12131,6 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/openapi-sampler/-/openapi-sampler-1.5.1.tgz", "integrity": "sha512-tIWIrZUKNAsbqf3bd9U1oH6JEXo8LNYuDlXw26By67EygpjT+ArFnsxxyTMjFWRfbqo5ozkvgSQDK69Gd8CddA==", - "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.7", "json-pointer": "0.6.2" @@ -13087,24 +12138,21 @@ }, "node_modules/opener": { "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "license": "(WTFPL OR MIT)", "bin": { "opener": "bin/opener-bin.js" } }, "node_modules/p-cancelable": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "license": "MIT", "engines": { "node": ">=12.20" } }, "node_modules/p-limit": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "license": "MIT", "dependencies": { "yocto-queue": "^1.0.0" }, @@ -13117,8 +12165,7 @@ }, "node_modules/p-locate": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "license": "MIT", "dependencies": { "p-limit": "^4.0.0" }, @@ -13131,8 +12178,7 @@ }, "node_modules/p-map": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "license": "MIT", "dependencies": { "aggregate-error": "^3.0.0" }, @@ -13145,8 +12191,7 @@ }, "node_modules/p-retry": { "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "license": "MIT", "dependencies": { "@types/retry": "0.12.0", "retry": "^0.13.1" @@ -13157,16 +12202,14 @@ }, "node_modules/p-try": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/package-json": { "version": "8.1.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz", - "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==", + "license": "MIT", "dependencies": { "got": "^12.1.0", "registry-auth-token": "^5.0.1", @@ -13182,8 +12225,7 @@ }, "node_modules/param-case": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "license": "MIT", "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" @@ -13191,8 +12233,7 @@ }, "node_modules/parent-module": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -13202,8 +12243,7 @@ }, "node_modules/parse-entities": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz", - "integrity": "sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==", + "license": "MIT", "dependencies": { "@types/unist": "^2.0.0", "character-entities": "^2.0.0", @@ -13221,13 +12261,11 @@ }, "node_modules/parse-entities/node_modules/@types/unist": { "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", - "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" + "license": "MIT" }, "node_modules/parse-json": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -13243,13 +12281,11 @@ }, "node_modules/parse-numeric-range": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", - "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==" + "license": "ISC" }, "node_modules/parse5": { "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "license": "MIT", "dependencies": { "entities": "^4.4.0" }, @@ -13259,8 +12295,7 @@ }, "node_modules/parse5-htmlparser2-tree-adapter": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", - "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "license": "MIT", "dependencies": { "domhandler": "^5.0.2", "parse5": "^7.0.0" @@ -13271,16 +12306,14 @@ }, "node_modules/parseurl": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/pascal-case": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "license": "MIT", "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" @@ -13289,55 +12322,47 @@ "node_modules/path-browserify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "license": "MIT" + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" }, "node_modules/path-exists": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, "node_modules/path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/path-is-inside": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==" + "license": "(WTFPL OR MIT)" }, "node_modules/path-key": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/path-parse": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + "license": "MIT" }, "node_modules/path-to-regexp": { "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "license": "MIT", "dependencies": { "isarray": "0.0.1" } }, "node_modules/path-type": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", "engines": { "node": ">=8" } @@ -13345,20 +12370,17 @@ "node_modules/perfect-scrollbar": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/perfect-scrollbar/-/perfect-scrollbar-1.5.5.tgz", - "integrity": "sha512-dzalfutyP3e/FOpdlhVryN4AJ5XDVauVWxybSkLZmakFE2sS3y3pc4JnSprw8tGmHvkaG5Edr5T7LBTZ+WWU2g==", - "license": "MIT" + "integrity": "sha512-dzalfutyP3e/FOpdlhVryN4AJ5XDVauVWxybSkLZmakFE2sS3y3pc4JnSprw8tGmHvkaG5Edr5T7LBTZ+WWU2g==" }, "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "license": "MIT", "peer": true }, "node_modules/periscopic": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", - "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^3.0.0", @@ -13366,14 +12388,13 @@ } }, "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==" }, "node_modules/picomatch": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -13383,8 +12404,7 @@ }, "node_modules/pkg-dir": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", - "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "license": "MIT", "dependencies": { "find-up": "^6.3.0" }, @@ -13397,8 +12417,7 @@ }, "node_modules/pkg-up": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "license": "MIT", "dependencies": { "find-up": "^3.0.0" }, @@ -13408,8 +12427,7 @@ }, "node_modules/pkg-up/node_modules/find-up": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "license": "MIT", "dependencies": { "locate-path": "^3.0.0" }, @@ -13419,8 +12437,7 @@ }, "node_modules/pkg-up/node_modules/locate-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "license": "MIT", "dependencies": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" @@ -13431,8 +12448,7 @@ }, "node_modules/pkg-up/node_modules/p-limit": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -13445,8 +12461,7 @@ }, "node_modules/pkg-up/node_modules/p-locate": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "license": "MIT", "dependencies": { "p-limit": "^2.0.0" }, @@ -13456,8 +12471,7 @@ }, "node_modules/pkg-up/node_modules/path-exists": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "license": "MIT", "engines": { "node": ">=4" } @@ -13466,7 +12480,6 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", - "license": "MIT", "engines": { "node": ">=4" } @@ -13475,7 +12488,6 @@ "version": "4.3.1", "resolved": "https://registry.npmjs.org/polished/-/polished-4.3.1.tgz", "integrity": "sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==", - "license": "MIT", "dependencies": { "@babel/runtime": "^7.17.8" }, @@ -13487,15 +12499,12 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", - "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/postcss": { "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", "funding": [ { "type": "opencollective", @@ -13510,6 +12519,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.0.0", @@ -13614,7 +12624,6 @@ "version": "6.0.5", "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-6.0.5.tgz", "integrity": "sha512-wHalBlRHkaNnNwfC8z+ppX57VhvS+HWgjW508esjdaEYr3Mx7Gnn2xA4R/CKf5+Z9S5qsqC+Uzh4ueENWwCVUA==", - "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.16" }, @@ -13627,8 +12636,7 @@ }, "node_modules/postcss-loader": { "version": "7.3.4", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.4.tgz", - "integrity": "sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A==", + "license": "MIT", "dependencies": { "cosmiconfig": "^8.3.5", "jiti": "^1.20.0", @@ -13650,7 +12658,6 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-6.0.3.tgz", "integrity": "sha512-1oIoAsODUs6IHQZkLQGO15uGEbK3EAl5wi9SS8hs45VgsxQfMnxvt+L+zIr7ifZFIH14cfAeVe2uCTa+SPRa3g==", - "license": "MIT", "dependencies": { "cssnano-utils": "^4.0.2", "postcss-value-parser": "^4.2.0" @@ -13755,9 +12762,8 @@ } }, "node_modules/postcss-modules-extract-imports": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", - "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "version": "3.0.0", + "license": "ISC", "engines": { "node": "^10 || ^12 || >= 14" }, @@ -13766,9 +12772,8 @@ } }, "node_modules/postcss-modules-local-by-default": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", - "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", + "version": "4.0.4", + "license": "MIT", "dependencies": { "icss-utils": "^5.0.0", "postcss-selector-parser": "^6.0.2", @@ -13782,9 +12787,8 @@ } }, "node_modules/postcss-modules-scope": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", - "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", + "version": "3.1.1", + "license": "ISC", "dependencies": { "postcss-selector-parser": "^6.0.4" }, @@ -13797,8 +12801,7 @@ }, "node_modules/postcss-modules-values": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "license": "ISC", "dependencies": { "icss-utils": "^5.0.0" }, @@ -13948,11 +12951,18 @@ "postcss": "^8.4.31" } }, + "node_modules/postcss-prefix-selector": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/postcss-prefix-selector/-/postcss-prefix-selector-1.16.1.tgz", + "integrity": "sha512-Umxu+FvKMwlY6TyDzGFoSUnzW+NOfMBLyC1tAkIjgX+Z/qGspJeRjVC903D7mx7TuBpJlwti2ibXtWuA7fKMeQ==", + "peerDependencies": { + "postcss": ">4 <9" + } + }, "node_modules/postcss-reduce-idents": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-6.0.3.tgz", "integrity": "sha512-G3yCqZDpsNPoQgbDUy3T0E6hqOQ5xigUtBQyrmq3tn2GxlyiL0yyl7H+T8ulQR6kOcHJ9t7/9H4/R2tv8tJbMA==", - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -13994,8 +13004,7 @@ }, "node_modules/postcss-selector-parser": { "version": "6.0.16", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", - "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", + "license": "MIT", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -14008,7 +13017,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-5.2.0.tgz", "integrity": "sha512-AZ5fDMLD8SldlAYlvi8NIqo0+Z8xnXU2ia0jxmuhxAU+Lqt9K+AlmLNJ/zWEnE9x+Zx3qL3+1K20ATgNOr3fAA==", - "license": "MIT", "dependencies": { "sort-css-media-queries": "2.2.0" }, @@ -14050,14 +13058,12 @@ }, "node_modules/postcss-value-parser": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + "license": "MIT" }, "node_modules/postcss-zindex": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-6.0.2.tgz", "integrity": "sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg==", - "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" }, @@ -14070,7 +13076,6 @@ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.2.tgz", "integrity": "sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==", "dev": true, - "license": "MIT", "bin": { "prettier": "bin/prettier.cjs" }, @@ -14083,8 +13088,7 @@ }, "node_modules/pretty-error": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", - "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "license": "MIT", "dependencies": { "lodash": "^4.17.20", "renderkid": "^3.0.0" @@ -14092,16 +13096,14 @@ }, "node_modules/pretty-time": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", - "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/prism-react-renderer": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.3.1.tgz", - "integrity": "sha512-Rdf+HzBLR7KYjzpJ1rSoxT9ioO85nZngQEoFIhL07XhtJHlCU3SOz0GJ6+qvMyQe0Se+BV3qpe6Yd/NmQF5Juw==", + "license": "MIT", "dependencies": { "@types/prismjs": "^1.26.0", "clsx": "^2.0.0" @@ -14112,21 +13114,18 @@ }, "node_modules/prismjs": { "version": "1.29.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", - "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/process-nextick-args": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + "license": "MIT" }, "node_modules/prompts": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "license": "MIT", "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" @@ -14137,8 +13136,7 @@ }, "node_modules/prop-types": { "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", @@ -14146,9 +13144,8 @@ } }, "node_modules/property-information": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", - "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "version": "6.4.1", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -14156,13 +13153,11 @@ }, "node_modules/proto-list": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==" + "license": "ISC" }, "node_modules/proxy-addr": { "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" @@ -14173,21 +13168,18 @@ }, "node_modules/proxy-addr/node_modules/ipaddr.js": { "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", "engines": { "node": ">= 0.10" } }, "node_modules/punycode": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" + "license": "MIT" }, "node_modules/pupa": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz", - "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==", + "license": "MIT", "dependencies": { "escape-goat": "^4.0.0" }, @@ -14200,8 +13192,7 @@ }, "node_modules/qs": { "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.0.4" }, @@ -14214,16 +13205,13 @@ }, "node_modules/queue": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", - "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", + "license": "MIT", "dependencies": { "inherits": "~2.0.3" } }, "node_modules/queue-microtask": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "funding": [ { "type": "github", @@ -14237,12 +13225,12 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/quick-lru": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -14254,7 +13242,6 @@ "version": "3.4.1", "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", - "license": "MIT", "peer": true, "dependencies": { "performance-now": "^2.1.0" @@ -14264,14 +13251,12 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", "integrity": "sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==", - "license": "CC0-1.0", "peer": true }, "node_modules/randexp": { "version": "0.4.6", "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", - "license": "MIT", "peer": true, "dependencies": { "discontinuous-range": "1.0.0", @@ -14283,24 +13268,21 @@ }, "node_modules/randombytes": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "license": "MIT", "dependencies": { "safe-buffer": "^5.1.0" } }, "node_modules/range-parser": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/raw-body": { "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -14313,16 +13295,14 @@ }, "node_modules/raw-body/node_modules/bytes": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/raw-body/node_modules/iconv-lite": { "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -14332,8 +13312,7 @@ }, "node_modules/rc": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -14346,8 +13325,7 @@ }, "node_modules/rc/node_modules/strip-json-comments": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -14356,7 +13334,6 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" }, @@ -14366,8 +13343,7 @@ }, "node_modules/react-dev-utils": { "version": "12.0.1", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", - "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.16.0", "address": "^1.1.2", @@ -14400,8 +13376,7 @@ }, "node_modules/react-dev-utils/node_modules/find-up": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -14415,16 +13390,14 @@ }, "node_modules/react-dev-utils/node_modules/loader-utils": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", - "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", + "license": "MIT", "engines": { "node": ">= 12.13.0" } }, "node_modules/react-dev-utils/node_modules/locate-path": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -14437,8 +13410,7 @@ }, "node_modules/react-dev-utils/node_modules/p-limit": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -14451,8 +13423,7 @@ }, "node_modules/react-dev-utils/node_modules/p-locate": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -14465,16 +13436,14 @@ }, "node_modules/react-dev-utils/node_modules/path-exists": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/react-dev-utils/node_modules/yocto-queue": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -14486,7 +13455,6 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "license": "MIT", "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -14497,18 +13465,15 @@ }, "node_modules/react-error-overlay": { "version": "6.0.11", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", - "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" + "license": "MIT" }, "node_modules/react-fast-compare": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", - "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==" + "license": "MIT" }, "node_modules/react-helmet-async": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.3.0.tgz", - "integrity": "sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==", + "license": "Apache-2.0", "dependencies": { "@babel/runtime": "^7.12.5", "invariant": "^2.2.4", @@ -14523,14 +13488,12 @@ }, "node_modules/react-is": { "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + "license": "MIT" }, "node_modules/react-json-view-lite": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-1.5.0.tgz", "integrity": "sha512-nWqA1E4jKPklL2jvHWs6s+7Na0qNgw9HCP6xehdQJeg6nPBTFZgGwyko9Q0oj+jQWKTTVRS30u0toM5wiuL3iw==", - "license": "MIT", "engines": { "node": ">=14" }, @@ -14552,8 +13515,7 @@ }, "node_modules/react-loadable-ssr-addon-v5-slorber": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz", - "integrity": "sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.3" }, @@ -14567,8 +13529,7 @@ }, "node_modules/react-router": { "version": "5.3.4", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", - "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", @@ -14586,8 +13547,7 @@ }, "node_modules/react-router-config": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz", - "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.1.2" }, @@ -14598,8 +13558,7 @@ }, "node_modules/react-router-dom": { "version": "5.3.4", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", - "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", @@ -14617,7 +13576,6 @@ "version": "16.15.0", "resolved": "https://registry.npmjs.org/react-shallow-renderer/-/react-shallow-renderer-16.15.0.tgz", "integrity": "sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA==", - "license": "MIT", "dependencies": { "object-assign": "^4.1.1", "react-is": "^16.12.0 || ^17.0.0 || ^18.0.0" @@ -14630,7 +13588,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/react-tabs/-/react-tabs-6.0.2.tgz", "integrity": "sha512-aQXTKolnM28k3KguGDBSAbJvcowOQr23A+CUJdzJtOSDOtTwzEaJA+1U4KwhNL9+Obe+jFS7geuvA7ICQPXOnQ==", - "license": "MIT", "dependencies": { "clsx": "^2.0.0", "prop-types": "^15.5.0" @@ -14641,8 +13598,7 @@ }, "node_modules/readable-stream": { "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -14654,8 +13610,7 @@ }, "node_modules/readdirp": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", "dependencies": { "picomatch": "^2.2.1" }, @@ -14665,13 +13620,10 @@ }, "node_modules/reading-time": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz", - "integrity": "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==" + "license": "MIT" }, "node_modules/rechoir": { "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", "dependencies": { "resolve": "^1.1.6" }, @@ -14681,8 +13633,7 @@ }, "node_modules/recursive-readdir": { "version": "2.2.3", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", - "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", + "license": "MIT", "dependencies": { "minimatch": "^3.0.5" }, @@ -14694,7 +13645,6 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/redoc/-/redoc-2.1.5.tgz", "integrity": "sha512-POSbVg+7WLf+/5/c6GWLxL7+9t2D+1WlZdLN0a6qaCQc+ih3XYzteRBkXEN5kjrYrRNjdspfxTZkDLN5WV3Tzg==", - "license": "MIT", "dependencies": { "@cfaester/enzyme-adapter-react-18": "^0.8.0", "@redocly/openapi-core": "^1.4.0", @@ -14734,17 +13684,15 @@ "node_modules/redoc/node_modules/eventemitter3": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", - "license": "MIT" + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" }, "node_modules/redocusaurus": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/redocusaurus/-/redocusaurus-2.1.1.tgz", - "integrity": "sha512-uaiuSsty0TcYuibabEw72DzN5JL6eF9KTIR5dL61qP7smFwIY8THEsNogzKTfcKCb6MJ8ug4vohrnrANn3K3cg==", - "license": "MIT", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/redocusaurus/-/redocusaurus-2.1.2.tgz", + "integrity": "sha512-PqMXxmjAyQ78zdI9W5lUI21a9N9bXDQYj5NuTcjG5xmyn63+KfqF+ugmqh7FbY3Fr9Sud14X6ZDoRGdwVtBDew==", "dependencies": { "docusaurus-plugin-redoc": "2.1.1", - "docusaurus-theme-redoc": "2.1.1" + "docusaurus-theme-redoc": "2.1.2" }, "engines": { "node": ">=14" @@ -14758,20 +13706,17 @@ "version": "1.1.9", "resolved": "https://registry.npmjs.org/reftools/-/reftools-1.1.9.tgz", "integrity": "sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w==", - "license": "BSD-3-Clause", "funding": { "url": "https://github.com/Mermade/oas-kit?sponsor=1" } }, "node_modules/regenerate": { "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" + "license": "MIT" }, "node_modules/regenerate-unicode-properties": { "version": "10.1.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", - "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "license": "MIT", "dependencies": { "regenerate": "^1.4.2" }, @@ -14781,13 +13726,11 @@ }, "node_modules/regenerator-runtime": { "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + "license": "MIT" }, "node_modules/regenerator-transform": { "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.8.4" } @@ -14796,7 +13739,6 @@ "version": "1.5.2", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.6", "define-properties": "^1.2.1", @@ -14812,8 +13754,7 @@ }, "node_modules/regexpu-core": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "license": "MIT", "dependencies": { "@babel/regjsgen": "^0.8.0", "regenerate": "^1.4.2", @@ -14828,8 +13769,7 @@ }, "node_modules/registry-auth-token": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", - "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", + "license": "MIT", "dependencies": { "@pnpm/npm-conf": "^2.1.0" }, @@ -14839,8 +13779,7 @@ }, "node_modules/registry-url": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", - "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", + "license": "MIT", "dependencies": { "rc": "1.2.8" }, @@ -14853,8 +13792,7 @@ }, "node_modules/regjsparser": { "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "license": "BSD-2-Clause", "dependencies": { "jsesc": "~0.5.0" }, @@ -14864,16 +13802,13 @@ }, "node_modules/regjsparser/node_modules/jsesc": { "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", "bin": { "jsesc": "bin/jsesc" } }, "node_modules/rehype-raw": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", - "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "hast-util-raw": "^9.0.0", @@ -14886,16 +13821,14 @@ }, "node_modules/relateurl": { "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "license": "MIT", "engines": { "node": ">= 0.10" } }, "node_modules/remark-directive": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-3.0.0.tgz", - "integrity": "sha512-l1UyWJ6Eg1VPU7Hm/9tt0zKtReJQNOA4+iDMAxTyZNWnJnFlbS/7zhiel/rogTLQ2vMYwDzSJa4BiVNqGlqIMA==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-directive": "^3.0.0", @@ -14909,8 +13842,7 @@ }, "node_modules/remark-emoji": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-4.0.1.tgz", - "integrity": "sha512-fHdvsTR1dHkWKev9eNyhTo4EFwbUvJ8ka9SgeWkMPYFX4WoI7ViVBms3PjlQYgw5TLvNQso3GUB/b/8t3yo+dg==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.2", "emoticon": "^4.0.1", @@ -14924,8 +13856,7 @@ }, "node_modules/remark-frontmatter": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz", - "integrity": "sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-frontmatter": "^2.0.0", @@ -14939,8 +13870,7 @@ }, "node_modules/remark-gfm": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.0.tgz", - "integrity": "sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-gfm": "^3.0.0", @@ -14956,8 +13886,7 @@ }, "node_modules/remark-mdx": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.0.1.tgz", - "integrity": "sha512-3Pz3yPQ5Rht2pM5R+0J2MrGoBSrzf+tJG94N+t/ilfdh8YLyyKYtidAYwTveB20BoHAcwIopOUqhcmh2F7hGYA==", + "license": "MIT", "dependencies": { "mdast-util-mdx": "^3.0.0", "micromark-extension-mdxjs": "^3.0.0" @@ -14969,8 +13898,7 @@ }, "node_modules/remark-parse": { "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", - "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", @@ -14984,8 +13912,7 @@ }, "node_modules/remark-rehype": { "version": "11.1.0", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.0.tgz", - "integrity": "sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", @@ -15000,8 +13927,7 @@ }, "node_modules/remark-stringify": { "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", - "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-to-markdown": "^2.0.0", @@ -15014,8 +13940,7 @@ }, "node_modules/renderkid": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", - "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "license": "MIT", "dependencies": { "css-select": "^4.1.3", "dom-converter": "^0.2.0", @@ -15026,8 +13951,7 @@ }, "node_modules/renderkid/node_modules/css-select": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.0.1", @@ -15041,8 +13965,7 @@ }, "node_modules/renderkid/node_modules/dom-serializer": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "license": "MIT", "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", @@ -15054,8 +13977,7 @@ }, "node_modules/renderkid/node_modules/domhandler": { "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.2.0" }, @@ -15068,8 +13990,7 @@ }, "node_modules/renderkid/node_modules/domutils": { "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", @@ -15081,16 +14002,13 @@ }, "node_modules/renderkid/node_modules/entities": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "license": "BSD-2-Clause", "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } }, "node_modules/renderkid/node_modules/htmlparser2": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { @@ -15098,6 +14016,7 @@ "url": "https://github.com/sponsors/fb55" } ], + "license": "MIT", "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.0.0", @@ -15109,15 +14028,13 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/require-from-string": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -15132,13 +14049,11 @@ }, "node_modules/requires-port": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + "license": "MIT" }, "node_modules/resolve": { "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -15153,26 +14068,22 @@ }, "node_modules/resolve-alpn": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" + "license": "MIT" }, "node_modules/resolve-from": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/resolve-pathname": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", - "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" + "license": "MIT" }, "node_modules/responselike": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "license": "MIT", "dependencies": { "lowercase-keys": "^3.0.0" }, @@ -15187,7 +14098,6 @@ "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "license": "MIT", "peer": true, "engines": { "node": ">=0.12" @@ -15195,16 +14105,14 @@ }, "node_modules/retry": { "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/reusify": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -15212,8 +14120,7 @@ }, "node_modules/rimraf": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -15226,14 +14133,12 @@ }, "node_modules/robust-predicates": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", - "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==" + "license": "Unlicense" }, "node_modules/rst-selector-parser": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz", "integrity": "sha512-nDG1rZeP6oFTLN6yNDV/uiAvs1+FS/KlrEwh7+y7dpuApDBy6bI2HTBcc0/V8lv9OTqfyD34eF7au2pm8aBbhA==", - "license": "BSD-3-Clause", "peer": true, "dependencies": { "lodash.flattendeep": "^4.4.0", @@ -15242,14 +14147,12 @@ }, "node_modules/rtl-detect": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/rtl-detect/-/rtl-detect-1.1.2.tgz", - "integrity": "sha512-PGMBq03+TTG/p/cRB7HCLKJ1MgDIi07+QU1faSjiYRfmY5UsAttV9Hs08jDAHVwcOwmVLcSJkpwyfXszVjWfIQ==" + "license": "BSD-3-Clause" }, "node_modules/rtlcss": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz", "integrity": "sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig==", - "license": "MIT", "dependencies": { "escalade": "^3.1.1", "picocolors": "^1.0.0", @@ -15265,8 +14168,6 @@ }, "node_modules/run-parallel": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "funding": [ { "type": "github", @@ -15281,19 +14182,18 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } }, "node_modules/rw": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" + "license": "BSD-3-Clause" }, "node_modules/sade": { "version": "1.8.1", - "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", - "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "license": "MIT", "dependencies": { "mri": "^1.1.0" }, @@ -15305,7 +14205,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "get-intrinsic": "^1.2.4", @@ -15322,13 +14221,10 @@ "node_modules/safe-array-concat/node_modules/isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "license": "MIT" + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" }, "node_modules/safe-buffer": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -15342,13 +14238,13 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/safe-regex-test": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.6", "es-errors": "^1.3.0", @@ -15363,13 +14259,11 @@ }, "node_modules/safer-buffer": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "license": "MIT" }, "node_modules/sax": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", - "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==" + "license": "ISC" }, "node_modules/scheduler": { "version": "0.23.2", @@ -15381,8 +14275,7 @@ }, "node_modules/schema-utils": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", @@ -15398,16 +14291,14 @@ } }, "node_modules/search-insights": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.1.tgz", - "integrity": "sha512-HHFjYH/0AqXacETlIbe9EYc3UNlQYGNNTY0fZ/sWl6SweX+GDxq9NB5+RVoPLgEFuOtCz7M9dhYxqDnhbbF0eQ==", - "license": "MIT", + "version": "2.17.2", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.2.tgz", + "integrity": "sha512-zFNpOpUO+tY2D85KrxJ+aqwnIfdEGi06UH2+xEb+Bp9Mwznmauqc9djbnBibJO5mpfUPPa8st6Sx65+vbeO45g==", "peer": true }, "node_modules/section-matter": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", - "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "license": "MIT", "dependencies": { "extend-shallow": "^2.0.1", "kind-of": "^6.0.0" @@ -15418,13 +14309,11 @@ }, "node_modules/select-hose": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==" + "license": "MIT" }, "node_modules/selfsigned": { "version": "2.4.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", - "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "license": "MIT", "dependencies": { "@types/node-forge": "^1.3.0", "node-forge": "^1" @@ -15434,9 +14323,11 @@ } }, "node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.0", + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, "bin": { "semver": "bin/semver.js" }, @@ -15446,8 +14337,7 @@ }, "node_modules/semver-diff": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", - "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", + "license": "MIT", "dependencies": { "semver": "^7.3.5" }, @@ -15458,10 +14348,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, "node_modules/send": { "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "license": "MIT", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -15483,42 +14386,36 @@ }, "node_modules/send/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "license": "MIT" }, "node_modules/send/node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "license": "MIT" }, "node_modules/send/node_modules/range-parser": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/serialize-javascript": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" } }, "node_modules/serve-handler": { "version": "6.1.5", - "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz", - "integrity": "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==", + "license": "MIT", "dependencies": { "bytes": "3.0.0", "content-disposition": "0.5.2", @@ -15532,13 +14429,11 @@ }, "node_modules/serve-handler/node_modules/path-to-regexp": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", - "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==" + "license": "MIT" }, "node_modules/serve-index": { "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "license": "MIT", "dependencies": { "accepts": "~1.3.4", "batch": "0.6.1", @@ -15554,24 +14449,21 @@ }, "node_modules/serve-index/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/serve-index/node_modules/depd": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/serve-index/node_modules/http-errors": { "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "license": "MIT", "dependencies": { "depd": "~1.1.2", "inherits": "2.0.3", @@ -15584,31 +14476,26 @@ }, "node_modules/serve-index/node_modules/inherits": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + "license": "ISC" }, "node_modules/serve-index/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "license": "MIT" }, "node_modules/serve-index/node_modules/setprototypeof": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + "license": "ISC" }, "node_modules/serve-index/node_modules/statuses": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/serve-static": { "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "license": "MIT", "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", @@ -15621,8 +14508,7 @@ }, "node_modules/set-function-length": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -15639,7 +14525,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -15652,13 +14537,11 @@ }, "node_modules/setprototypeof": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + "license": "ISC" }, "node_modules/shallow-clone": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "license": "MIT", "dependencies": { "kind-of": "^6.0.2" }, @@ -15668,13 +14551,11 @@ }, "node_modules/shallowequal": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + "license": "MIT" }, "node_modules/shebang-command": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -15684,24 +14565,21 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/shell-quote": { "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/shelljs": { "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "license": "BSD-3-Clause", "dependencies": { "glob": "^7.0.0", "interpret": "^1.0.0", @@ -15718,7 +14596,6 @@ "version": "13.2.3", "resolved": "https://registry.npmjs.org/should/-/should-13.2.3.tgz", "integrity": "sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==", - "license": "MIT", "dependencies": { "should-equal": "^2.0.0", "should-format": "^3.0.3", @@ -15731,7 +14608,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/should-equal/-/should-equal-2.0.0.tgz", "integrity": "sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==", - "license": "MIT", "dependencies": { "should-type": "^1.4.0" } @@ -15740,7 +14616,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz", "integrity": "sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q==", - "license": "MIT", "dependencies": { "should-type": "^1.3.0", "should-type-adaptors": "^1.0.1" @@ -15749,14 +14624,12 @@ "node_modules/should-type": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz", - "integrity": "sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ==", - "license": "MIT" + "integrity": "sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ==" }, "node_modules/should-type-adaptors": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz", "integrity": "sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==", - "license": "MIT", "dependencies": { "should-type": "^1.3.0", "should-util": "^1.0.0" @@ -15765,13 +14638,11 @@ "node_modules/should-util": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/should-util/-/should-util-1.0.1.tgz", - "integrity": "sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==", - "license": "MIT" + "integrity": "sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==" }, "node_modules/side-channel": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -15787,13 +14658,11 @@ }, "node_modules/signal-exit": { "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + "license": "ISC" }, "node_modules/sirv": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", - "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", + "license": "MIT", "dependencies": { "@polka/url": "^1.0.0-next.24", "mrmime": "^2.0.0", @@ -15805,14 +14674,12 @@ }, "node_modules/sisteransi": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + "license": "MIT" }, "node_modules/sitemap": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.2.tgz", "integrity": "sha512-ARCqzHJ0p4gWt+j7NlU5eDlIO9+Rkr/JhPFZKKQ1l5GCus7rJH4UdrlVAh0xC/gDS/Qir2UMxqYNHtsKr2rpCw==", - "license": "MIT", "dependencies": { "@types/node": "^17.0.5", "@types/sax": "^1.2.1", @@ -15830,13 +14697,11 @@ "node_modules/sitemap/node_modules/@types/node": { "version": "17.0.45", "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", - "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==", - "license": "MIT" + "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==" }, "node_modules/skin-tone": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", - "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", + "license": "MIT", "dependencies": { "unicode-emoji-modifier-base": "^1.0.0" }, @@ -15846,8 +14711,7 @@ }, "node_modules/slash": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", "engines": { "node": ">=8" } @@ -15856,7 +14720,6 @@ "version": "1.4.7", "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.4.7.tgz", "integrity": "sha512-tf+h5W1IrjNm/9rKKj0JU2MDMruiopx0jjVA5zCdBtcGjfp0+c5rHw/zADLC3IeKlGHtVbHtpfzvYA0OYT+HKg==", - "license": "MIT", "engines": { "node": ">=8.0.0" } @@ -15872,8 +14735,7 @@ }, "node_modules/sockjs": { "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "license": "MIT", "dependencies": { "faye-websocket": "^0.11.3", "uuid": "^8.3.2", @@ -15882,8 +14744,7 @@ }, "node_modules/sockjs/node_modules/uuid": { "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } @@ -15892,31 +14753,28 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.2.0.tgz", "integrity": "sha512-0xtkGhWCC9MGt/EzgnvbbbKhqWjl1+/rncmhTh5qCpbYguXh6S/qwePfv/JQ8jePXXmqingylxoC49pCkSPIbA==", - "license": "MIT", "engines": { "node": ">= 6.3.0" } }, "node_modules/source-map": { "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "license": "BSD-3-Clause", "engines": { "node": ">= 8" } }, "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "engines": { "node": ">=0.10.0" } }, "node_modules/source-map-support": { "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -15924,16 +14782,14 @@ }, "node_modules/source-map-support/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/space-separated-tokens": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -15941,8 +14797,7 @@ }, "node_modules/spdy": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "license": "MIT", "dependencies": { "debug": "^4.1.0", "handle-thing": "^2.0.0", @@ -15956,8 +14811,7 @@ }, "node_modules/spdy-transport": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "license": "MIT", "dependencies": { "debug": "^4.1.0", "detect-node": "^2.0.4", @@ -15969,13 +14823,11 @@ }, "node_modules/sprintf-js": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + "license": "BSD-3-Clause" }, "node_modules/srcset": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/srcset/-/srcset-4.0.0.tgz", - "integrity": "sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -15985,16 +14837,14 @@ }, "node_modules/statuses": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/std-env": { "version": "3.7.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", - "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==" + "license": "MIT" }, "node_modules/stickyfill": { "version": "1.1.1", @@ -16003,16 +14853,14 @@ }, "node_modules/string_decoder": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" } }, "node_modules/string-width": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -16027,8 +14875,7 @@ }, "node_modules/string-width/node_modules/ansi-regex": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -16038,8 +14885,7 @@ }, "node_modules/string-width/node_modules/strip-ansi": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -16054,7 +14900,6 @@ "version": "1.2.9", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -16072,7 +14917,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -16086,7 +14930,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -16100,9 +14943,8 @@ } }, "node_modules/stringify-entities": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", - "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "version": "4.0.3", + "license": "MIT", "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" @@ -16114,8 +14956,7 @@ }, "node_modules/stringify-object": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "license": "BSD-2-Clause", "dependencies": { "get-own-enumerable-property-symbols": "^3.0.0", "is-obj": "^1.0.1", @@ -16127,8 +14968,7 @@ }, "node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -16138,16 +14978,14 @@ }, "node_modules/strip-bom-string": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", - "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/strip-final-newline": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "license": "MIT", "engines": { "node": ">=6" } @@ -16156,7 +14994,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "license": "MIT", "engines": { "node": ">=8" }, @@ -16166,17 +15003,15 @@ }, "node_modules/style-to-object": { "version": "0.4.4", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz", - "integrity": "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==", + "license": "MIT", "dependencies": { "inline-style-parser": "0.1.1" } }, "node_modules/styled-components": { - "version": "6.1.13", - "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.13.tgz", - "integrity": "sha512-M0+N2xSnAtwcVAQeFEsGWFFxXDftHUD7XrKla06QbpUMmbmtFBMMTcKWvFXtWxuD5qQkB8iU5gk6QASlx2ZRMw==", - "license": "MIT", + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.11.tgz", + "integrity": "sha512-Ui0jXPzbp1phYij90h12ksljKGqF8ncGx+pjrNPsSPhbUUjWT2tD1FwGo2LF6USCnbrsIhNngDfodhxbegfEOA==", "dependencies": { "@emotion/is-prop-valid": "1.2.2", "@emotion/unitless": "0.8.1", @@ -16222,8 +15057,7 @@ }, "node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -16233,8 +15067,7 @@ }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -16283,7 +15116,6 @@ "version": "7.0.8", "resolved": "https://registry.npmjs.org/swagger2openapi/-/swagger2openapi-7.0.8.tgz", "integrity": "sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g==", - "license": "BSD-3-Clause", "dependencies": { "call-me-maybe": "^1.0.1", "node-fetch": "^2.6.1", @@ -16308,16 +15140,14 @@ }, "node_modules/tapable": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/terser": { - "version": "5.31.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.0.tgz", - "integrity": "sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg==", + "version": "5.29.2", + "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -16333,8 +15163,7 @@ }, "node_modules/terser-webpack-plugin": { "version": "5.3.10", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", - "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", @@ -16366,8 +15195,7 @@ }, "node_modules/terser-webpack-plugin/node_modules/ajv": { "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -16381,16 +15209,14 @@ }, "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" } }, "node_modules/terser-webpack-plugin/node_modules/jest-worker": { "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "license": "MIT", "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -16402,13 +15228,11 @@ }, "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "license": "MIT" }, "node_modules/terser-webpack-plugin/node_modules/schema-utils": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -16424,8 +15248,7 @@ }, "node_modules/terser-webpack-plugin/node_modules/supports-color": { "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -16438,33 +15261,27 @@ }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + "license": "MIT" }, "node_modules/text-table": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + "license": "MIT" }, "node_modules/thunky": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" + "license": "MIT" }, "node_modules/tiny-invariant": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", - "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==" + "license": "MIT" }, "node_modules/tiny-warning": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" + "license": "MIT" }, "node_modules/to-fast-properties": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "license": "MIT", "engines": { "node": ">=4" } @@ -16473,7 +15290,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -16483,16 +15299,14 @@ }, "node_modules/toidentifier": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", "engines": { "node": ">=0.6" } }, "node_modules/totalist": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "license": "MIT", "engines": { "node": ">=6" } @@ -16500,13 +15314,11 @@ "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "node_modules/trim-lines": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", - "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -16514,8 +15326,7 @@ }, "node_modules/trough": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", - "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -16523,21 +15334,18 @@ }, "node_modules/ts-dedent": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", - "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", + "license": "MIT", "engines": { "node": ">=6.10" } }, "node_modules/tslib": { "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "license": "0BSD" }, "node_modules/type-fest": { "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=12.20" }, @@ -16547,8 +15355,7 @@ }, "node_modules/type-is": { "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -16559,16 +15366,14 @@ }, "node_modules/type-is/node_modules/mime-db": { "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/type-is/node_modules/mime-types": { "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -16580,7 +15385,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -16594,7 +15398,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", @@ -16613,7 +15416,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", - "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.7", @@ -16633,7 +15435,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", @@ -16651,16 +15452,14 @@ }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "license": "MIT", "dependencies": { "is-typedarray": "^1.0.0" } }, "node_modules/typescript": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "version": "5.4.3", + "license": "Apache-2.0", "peer": true, "bin": { "tsc": "bin/tsc", @@ -16674,7 +15473,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-bigints": "^1.0.2", @@ -16687,29 +15485,25 @@ }, "node_modules/undici-types": { "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + "license": "MIT" }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/unicode-emoji-modifier-base": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", - "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/unicode-match-property-ecmascript": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "license": "MIT", "dependencies": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" @@ -16720,24 +15514,21 @@ }, "node_modules/unicode-match-property-value-ecmascript": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/unicode-property-aliases-ecmascript": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/unified": { "version": "11.0.4", - "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.4.tgz", - "integrity": "sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", @@ -16754,8 +15545,7 @@ }, "node_modules/unique-string": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", - "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", + "license": "MIT", "dependencies": { "crypto-random-string": "^4.0.0" }, @@ -16768,8 +15558,7 @@ }, "node_modules/unist-util-is": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", - "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" }, @@ -16780,8 +15569,7 @@ }, "node_modules/unist-util-position": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", - "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" }, @@ -16792,8 +15580,7 @@ }, "node_modules/unist-util-position-from-estree": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", - "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" }, @@ -16804,8 +15591,7 @@ }, "node_modules/unist-util-remove-position": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", - "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "unist-util-visit": "^5.0.0" @@ -16817,8 +15603,7 @@ }, "node_modules/unist-util-stringify-position": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", - "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" }, @@ -16829,8 +15614,7 @@ }, "node_modules/unist-util-visit": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", - "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", @@ -16843,8 +15627,7 @@ }, "node_modules/unist-util-visit-parents": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", - "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" @@ -16856,16 +15639,14 @@ }, "node_modules/universalify": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", "engines": { "node": ">= 10.0.0" } }, "node_modules/unpipe": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -16888,7 +15669,6 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "escalade": "^3.1.2", "picocolors": "^1.0.1" @@ -16902,8 +15682,7 @@ }, "node_modules/update-notifier": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz", - "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==", + "license": "BSD-2-Clause", "dependencies": { "boxen": "^7.0.0", "chalk": "^5.0.1", @@ -16929,8 +15708,7 @@ }, "node_modules/update-notifier/node_modules/boxen": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", - "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", + "license": "MIT", "dependencies": { "ansi-align": "^3.0.1", "camelcase": "^7.0.1", @@ -16950,8 +15728,7 @@ }, "node_modules/update-notifier/node_modules/camelcase": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", - "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", + "license": "MIT", "engines": { "node": ">=14.16" }, @@ -16961,8 +15738,7 @@ }, "node_modules/update-notifier/node_modules/chalk": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -16972,24 +15748,21 @@ }, "node_modules/uri-js": { "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } }, "node_modules/uri-js/node_modules/punycode": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/url-loader": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", - "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", + "license": "MIT", "dependencies": { "loader-utils": "^2.0.0", "mime-types": "^2.1.27", @@ -17014,8 +15787,7 @@ }, "node_modules/url-loader/node_modules/ajv": { "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -17029,29 +15801,25 @@ }, "node_modules/url-loader/node_modules/ajv-keywords": { "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" } }, "node_modules/url-loader/node_modules/json-schema-traverse": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "license": "MIT" }, "node_modules/url-loader/node_modules/mime-db": { "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/url-loader/node_modules/mime-types": { "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -17061,8 +15829,7 @@ }, "node_modules/url-loader/node_modules/schema-utils": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -17079,60 +15846,52 @@ "node_modules/url-template": { "version": "2.0.8", "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", - "integrity": "sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==", - "license": "BSD" + "integrity": "sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==" }, "node_modules/use-sync-external-store": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", - "license": "MIT", "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, "node_modules/util-deprecate": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "license": "MIT" }, "node_modules/utila": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==" + "license": "MIT" }, "node_modules/utility-types": { "version": "3.11.0", - "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", - "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/utils-merge": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", "engines": { "node": ">= 0.4.0" } }, "node_modules/uuid": { "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/uvu": { "version": "0.5.6", - "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", - "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==", + "license": "MIT", "dependencies": { "dequal": "^2.0.0", "diff": "^5.0.0", @@ -17148,29 +15907,25 @@ }, "node_modules/uvu/node_modules/kleur": { "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/value-equal": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", - "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" + "license": "MIT" }, "node_modules/vary": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/vfile": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", - "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0", @@ -17183,8 +15938,7 @@ }, "node_modules/vfile-location": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.2.tgz", - "integrity": "sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "vfile": "^6.0.0" @@ -17196,8 +15950,7 @@ }, "node_modules/vfile-message": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", - "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" @@ -17209,8 +15962,7 @@ }, "node_modules/watchpack": { "version": "2.4.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", - "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", + "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -17221,16 +15973,14 @@ }, "node_modules/wbuf": { "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "license": "MIT", "dependencies": { "minimalistic-assert": "^1.0.0" } }, "node_modules/web-namespaces": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", - "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -17238,30 +15988,27 @@ }, "node_modules/web-worker": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.3.0.tgz", - "integrity": "sha512-BSR9wyRsy/KOValMgd5kMyr3JzpdeoR9KVId8u5GVlTTAtNChlsE4yTxeY7zMdNSyOmoKBv8NH2qeRY9Tg+IaA==" + "license": "Apache-2.0" }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "license": "BSD-2-Clause" + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/webpack": { - "version": "5.94.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", - "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", + "version": "5.91.0", "license": "MIT", "dependencies": { + "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.5", "@webassemblyjs/ast": "^1.12.1", "@webassemblyjs/wasm-edit": "^1.12.1", "@webassemblyjs/wasm-parser": "^1.12.1", "acorn": "^8.7.1", - "acorn-import-attributes": "^1.9.5", + "acorn-import-assertions": "^1.9.0", "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.1", + "enhanced-resolve": "^5.16.0", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -17294,9 +16041,8 @@ } }, "node_modules/webpack-bundle-analyzer": { - "version": "4.10.2", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz", - "integrity": "sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==", + "version": "4.10.1", + "license": "MIT", "dependencies": { "@discoveryjs/json-ext": "0.5.7", "acorn": "^8.0.4", @@ -17306,6 +16052,7 @@ "escape-string-regexp": "^4.0.0", "gzip-size": "^6.0.0", "html-escaper": "^2.0.2", + "is-plain-object": "^5.0.0", "opener": "^1.5.2", "picocolors": "^1.0.0", "sirv": "^2.0.3", @@ -17320,16 +16067,14 @@ }, "node_modules/webpack-bundle-analyzer/node_modules/commander": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", "engines": { "node": ">= 10" } }, "node_modules/webpack-dev-middleware": { "version": "5.3.4", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", - "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", + "license": "MIT", "dependencies": { "colorette": "^2.0.10", "memfs": "^3.4.3", @@ -17350,21 +16095,18 @@ }, "node_modules/webpack-dev-middleware/node_modules/colorette": { "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" + "license": "MIT" }, "node_modules/webpack-dev-middleware/node_modules/mime-db": { "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/webpack-dev-middleware/node_modules/mime-types": { "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -17374,16 +16116,14 @@ }, "node_modules/webpack-dev-middleware/node_modules/range-parser": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/webpack-dev-server": { "version": "4.15.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", - "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", + "license": "MIT", "dependencies": { "@types/bonjour": "^3.5.9", "@types/connect-history-api-fallback": "^1.3.5", @@ -17440,14 +16180,12 @@ }, "node_modules/webpack-dev-server/node_modules/colorette": { "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" + "license": "MIT" }, "node_modules/webpack-dev-server/node_modules/ws": { "version": "8.18.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", - "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -17466,8 +16204,7 @@ }, "node_modules/webpack-merge": { "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "license": "MIT", "dependencies": { "clone-deep": "^4.0.1", "flat": "^5.0.2", @@ -17479,16 +16216,14 @@ }, "node_modules/webpack-sources": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "license": "MIT", "engines": { "node": ">=10.13.0" } }, "node_modules/webpack/node_modules/ajv": { "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -17502,29 +16237,25 @@ }, "node_modules/webpack/node_modules/ajv-keywords": { "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" } }, "node_modules/webpack/node_modules/json-schema-traverse": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "license": "MIT" }, "node_modules/webpack/node_modules/mime-db": { "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/webpack/node_modules/mime-types": { "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -17534,8 +16265,7 @@ }, "node_modules/webpack/node_modules/schema-utils": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -17551,8 +16281,7 @@ }, "node_modules/webpackbar": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-5.0.2.tgz", - "integrity": "sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ==", + "license": "MIT", "dependencies": { "chalk": "^4.1.0", "consola": "^2.15.3", @@ -17568,8 +16297,7 @@ }, "node_modules/websocket-driver": { "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "license": "Apache-2.0", "dependencies": { "http-parser-js": ">=0.5.1", "safe-buffer": ">=5.1.0", @@ -17581,8 +16309,7 @@ }, "node_modules/websocket-extensions": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "license": "Apache-2.0", "engines": { "node": ">=0.8.0" } @@ -17591,7 +16318,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "license": "MIT", "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -17599,8 +16325,7 @@ }, "node_modules/which": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -17615,7 +16340,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "license": "MIT", "dependencies": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", @@ -17631,7 +16355,6 @@ "version": "1.1.15", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", - "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.7", @@ -17648,8 +16371,7 @@ }, "node_modules/widest-line": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", - "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", + "license": "MIT", "dependencies": { "string-width": "^5.0.1" }, @@ -17662,13 +16384,11 @@ }, "node_modules/wildcard": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", - "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==" + "license": "MIT" }, "node_modules/wrap-ansi": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -17683,8 +16403,7 @@ }, "node_modules/wrap-ansi/node_modules/ansi-regex": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -17694,8 +16413,7 @@ }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -17705,8 +16423,7 @@ }, "node_modules/wrap-ansi/node_modules/strip-ansi": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -17719,13 +16436,11 @@ }, "node_modules/wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "license": "ISC" }, "node_modules/write-file-atomic": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", @@ -17737,7 +16452,6 @@ "version": "7.5.10", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "license": "MIT", "engines": { "node": ">=8.3.0" }, @@ -17756,8 +16470,7 @@ }, "node_modules/xdg-basedir": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", - "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -17767,8 +16480,7 @@ }, "node_modules/xml-js": { "version": "1.6.11", - "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", - "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "license": "MIT", "dependencies": { "sax": "^1.2.4" }, @@ -17780,20 +16492,17 @@ "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "license": "ISC", "engines": { "node": ">=10" } }, "node_modules/yallist": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + "license": "ISC" }, "node_modules/yaml": { "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "license": "ISC", "engines": { "node": ">= 6" } @@ -17801,14 +16510,12 @@ "node_modules/yaml-ast-parser": { "version": "0.0.43", "resolved": "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz", - "integrity": "sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==", - "license": "Apache-2.0" + "integrity": "sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==" }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "license": "MIT", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -17826,7 +16533,6 @@ "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "license": "ISC", "engines": { "node": ">=12" } @@ -17834,14 +16540,12 @@ "node_modules/yargs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/yargs/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -17853,8 +16557,7 @@ }, "node_modules/yocto-queue": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "license": "MIT", "engines": { "node": ">=12.20" }, @@ -17864,8 +16567,7 @@ }, "node_modules/zwitch": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", - "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" diff --git a/docs/website/package.json b/docs/website/package.json index d16361c5d5b..cf2c5e55d15 100644 --- a/docs/website/package.json +++ b/docs/website/package.json @@ -22,7 +22,7 @@ "clsx": "^2.1.1", "react": "^18.3.1", "react-dom": "^18.3.1", - "redocusaurus": "^2.1.1" + "redocusaurus": "^2.1.2" }, "browserslist": { "production": [ From 8880c30554a66d1be1755413616784c73dddd86e Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Mon, 23 Sep 2024 17:52:22 +0200 Subject: [PATCH 005/274] chore: upgrade explorer dependencies By running 'make upgrade' command. --- mithril-explorer/package-lock.json | 1951 +++++++++++++++++----------- mithril-explorer/package.json | 6 +- 2 files changed, 1206 insertions(+), 751 deletions(-) diff --git a/mithril-explorer/package-lock.json b/mithril-explorer/package-lock.json index 1052304e5ac..d3208d79e13 100644 --- a/mithril-explorer/package-lock.json +++ b/mithril-explorer/package-lock.json @@ -14,7 +14,7 @@ "bootstrap": "^5.3.3", "bootstrap-icons": "^1.11.3", "chart.js": "^4.4.4", - "next": "^14.2.8", + "next": "^14.2.13", "react": "^18.3.1", "react-bootstrap": "^2.10.4", "react-chartjs-2": "^5.2.0", @@ -24,8 +24,8 @@ "devDependencies": { "@testing-library/jest-dom": "^6.5.0", "@testing-library/react": "^16.0.1", - "eslint": "^8.57.0", - "eslint-config-next": "^14.2.8", + "eslint": "^8.57.1", + "eslint-config-next": "^14.2.13", "fantasticon": "^3.0.0", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", @@ -36,9 +36,17 @@ }, "../mithril-client-wasm/pkg": { "name": "mithril-client-wasm", - "version": "0.3.11", + "version": "0.4.2", "license": "Apache-2.0" }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@adobe/css-tools": { "version": "4.4.0", "dev": true, @@ -57,19 +65,83 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.24.7", + "version": "7.23.5", "dev": true, "license": "MIT", "dependencies": { - "@babel/highlight": "^7.24.7", - "picocolors": "^1.0.0" + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/compat-data": { - "version": "7.24.7", + "version": "7.23.5", "dev": true, "license": "MIT", "engines": { @@ -77,20 +149,20 @@ } }, "node_modules/@babel/core": { - "version": "7.24.7", + "version": "7.24.0", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.7", - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helpers": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/template": "^7.24.7", - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.24.0", + "@babel/parser": "^7.24.0", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.0", + "@babel/types": "^7.24.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -114,13 +186,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.24.7", + "version": "7.23.6", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.24.7", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", + "@babel/types": "^7.23.6", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" }, "engines": { @@ -128,12 +200,12 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.24.7", + "version": "7.23.6", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.24.7", - "@babel/helper-validator-option": "^7.24.7", + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", "browserslist": "^4.22.2", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -151,61 +223,57 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.24.7", + "version": "7.22.20", "dev": true, "license": "MIT", - "dependencies": { - "@babel/types": "^7.24.7" - }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.24.7", + "version": "7.23.0", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.24.7", + "version": "7.22.5", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.24.7" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.24.7", + "version": "7.22.15", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.24.7", + "version": "7.23.3", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -215,7 +283,7 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.7", + "version": "7.24.0", "dev": true, "license": "MIT", "engines": { @@ -223,30 +291,29 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.24.7", + "version": "7.22.5", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.7", + "version": "7.22.6", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.24.7" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.7", + "version": "7.23.4", "dev": true, "license": "MIT", "engines": { @@ -254,7 +321,7 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", + "version": "7.22.20", "dev": true, "license": "MIT", "engines": { @@ -262,7 +329,7 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.24.7", + "version": "7.23.5", "dev": true, "license": "MIT", "engines": { @@ -270,26 +337,26 @@ } }, "node_modules/@babel/helpers": { - "version": "7.24.7", + "version": "7.24.0", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.0", + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.24.7", + "version": "7.23.4", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", + "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "js-tokens": "^4.0.0" }, "engines": { "node": ">=6.9.0" @@ -360,7 +427,7 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.7", + "version": "7.24.0", "dev": true, "license": "MIT", "bin": { @@ -426,11 +493,11 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.24.7", + "version": "7.23.3", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -520,11 +587,11 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.24.7", + "version": "7.23.3", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -534,7 +601,7 @@ } }, "node_modules/@babel/runtime": { - "version": "7.24.7", + "version": "7.25.6", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -544,31 +611,31 @@ } }, "node_modules/@babel/template": { - "version": "7.24.7", + "version": "7.24.0", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.24.7", + "version": "7.24.0", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-hoist-variables": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -585,12 +652,12 @@ } }, "node_modules/@babel/types": { - "version": "7.24.7", + "version": "7.24.0", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7", + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { @@ -617,7 +684,7 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.1", + "version": "4.10.0", "dev": true, "license": "MIT", "engines": { @@ -647,7 +714,7 @@ } }, "node_modules/@eslint/js": { - "version": "8.57.0", + "version": "8.57.1", "dev": true, "license": "MIT", "engines": { @@ -660,11 +727,11 @@ "license": "MIT" }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", + "version": "0.13.0", "dev": true, "license": "Apache-2.0", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", + "@humanwhocodes/object-schema": "^2.0.3", "debug": "^4.3.1", "minimatch": "^3.0.5" }, @@ -821,11 +888,6 @@ "node": ">=8" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/sprintf-js": { - "version": "1.0.3", - "dev": true, - "license": "BSD-3-Clause" - }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", "dev": true, @@ -850,6 +912,21 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/@jest/console/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/@jest/core": { "version": "29.7.0", "dev": true, @@ -896,15 +973,19 @@ } } }, - "node_modules/@jest/core/node_modules/ansi-styles": { - "version": "5.2.0", + "node_modules/@jest/core/node_modules/chalk": { + "version": "4.1.2", "dev": true, "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/@jest/core/node_modules/pretty-format": { @@ -920,8 +1001,19 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/@jest/core/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/@jest/core/node_modules/react-is": { - "version": "18.3.1", + "version": "18.2.0", "dev": true, "license": "MIT" }, @@ -1034,6 +1126,21 @@ } } }, + "node_modules/@jest/reporters/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/@jest/reporters/node_modules/glob": { "version": "7.2.3", "dev": true, @@ -1130,6 +1237,21 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/@jest/transform/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/@jest/types": { "version": "29.6.3", "dev": true, @@ -1146,6 +1268,21 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/@jest/types/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.5", "dev": true, @@ -1198,29 +1335,26 @@ "link": true }, "node_modules/@next/env": { - "version": "14.2.8", - "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.8.tgz", - "integrity": "sha512-L44a+ynqkolyNBnYfF8VoCiSrjSZWgEHYKkKLGcs/a80qh7AkfVUD/MduVPgdsWZ31tgROR+yJRA0PZjSVBXWQ==", - "license": "MIT" + "version": "14.2.13", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.13.tgz", + "integrity": "sha512-s3lh6K8cbW1h5Nga7NNeXrbe0+2jIIYK9YaA9T7IufDWnZpozdFUp6Hf0d5rNWUKu4fEuSX2rCKlGjCrtylfDw==" }, "node_modules/@next/eslint-plugin-next": { - "version": "14.2.8", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.8.tgz", - "integrity": "sha512-ue5vcq9Fjk3asACRDrzYjcGMEN7pMMDQ5zUD+FenkqvlPCVUD1x7PxBNOLfPYDZOrk/Vnl4GHmjj2mZDqPW8TQ==", + "version": "14.2.13", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.13.tgz", + "integrity": "sha512-z8Mk0VljxhIzsSiZUSdt3wp+t2lKd+jk5a9Jsvh3zDGkItgDMfjv/ZbET6HsxEl/fSihVoHGsXV6VLyDH0lfTQ==", "dev": true, - "license": "MIT", "dependencies": { "glob": "10.3.10" } }, "node_modules/@next/swc-darwin-arm64": { - "version": "14.2.8", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.8.tgz", - "integrity": "sha512-1VrQlG8OzdyvvGZhGJFnaNE2P10Jjy/2FopnqbY0nSa/gr8If3iINxvOEW3cmVeoAYkmW0RsBazQecA2dBFOSw==", + "version": "14.2.13", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.13.tgz", + "integrity": "sha512-IkAmQEa2Htq+wHACBxOsslt+jMoV3msvxCn0WFSfJSkv/scy+i/EukBKNad36grRxywaXUYJc9mxEGkeIs8Bzg==", "cpu": [ "arm64" ], - "license": "MIT", "optional": true, "os": [ "darwin" @@ -1230,13 +1364,12 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "14.2.8", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.8.tgz", - "integrity": "sha512-87t3I86rNRSOJB1gXIUzaQWWSWrkWPDyZGsR0Z7JAPtLeX3uUOW2fHxl7dNWD2BZvbvftctTQjgtfpp7nMtmWg==", + "version": "14.2.13", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.13.tgz", + "integrity": "sha512-Dv1RBGs2TTjkwEnFMVL5XIfJEavnLqqwYSD6LXgTPdEy/u6FlSrLBSSfe1pcfqhFEXRAgVL3Wpjibe5wXJzWog==", "cpu": [ "x64" ], - "license": "MIT", "optional": true, "os": [ "darwin" @@ -1246,13 +1379,12 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "14.2.8", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.8.tgz", - "integrity": "sha512-ta2sfVzbOpTbgBrF9HM5m+U58dv6QPuwU4n5EX4LLyCJGKc433Z0D9h9gay/HSOjLEXJ2fJYrMP5JYYbHdxhtw==", + "version": "14.2.13", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.13.tgz", + "integrity": "sha512-yB1tYEFFqo4ZNWkwrJultbsw7NPAAxlPXURXioRl9SdW6aIefOLS+0TEsKrWBtbJ9moTDgU3HRILL6QBQnMevg==", "cpu": [ "arm64" ], - "license": "MIT", "optional": true, "os": [ "linux" @@ -1262,13 +1394,12 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "14.2.8", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.8.tgz", - "integrity": "sha512-+IoLTPK6Z5uIgDhgeWnQF5/o5GBN7+zyUNrs4Bes1W3g9++YELb8y0unFybS8s87ntAKMDl6jeQ+mD7oNwp/Ng==", + "version": "14.2.13", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.13.tgz", + "integrity": "sha512-v5jZ/FV/eHGoWhMKYrsAweQ7CWb8xsWGM/8m1mwwZQ/sutJjoFaXchwK4pX8NqwImILEvQmZWyb8pPTcP7htWg==", "cpu": [ "arm64" ], - "license": "MIT", "optional": true, "os": [ "linux" @@ -1278,13 +1409,12 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "14.2.8", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.8.tgz", - "integrity": "sha512-pO+hVXC+mvzUOQJJRG4RX4wJsRJ5BkURSf6dD6EjUXAX4Ml9es1WsEfkaZ4lcpmFzFvY47IkDaffks/GdCn9ag==", + "version": "14.2.13", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.13.tgz", + "integrity": "sha512-aVc7m4YL7ViiRv7SOXK3RplXzOEe/qQzRA5R2vpXboHABs3w8vtFslGTz+5tKiQzWUmTmBNVW0UQdhkKRORmGA==", "cpu": [ "x64" ], - "license": "MIT", "optional": true, "os": [ "linux" @@ -1294,13 +1424,12 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "14.2.8", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.8.tgz", - "integrity": "sha512-bCat9izctychCtf3uL1nqHq31N5e1VxvdyNcBQflkudPMLbxVnlrw45Vi87K+lt1CwrtVayHqzo4ie0Szcpwzg==", + "version": "14.2.13", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.13.tgz", + "integrity": "sha512-4wWY7/OsSaJOOKvMsu1Teylku7vKyTuocvDLTZQq0TYv9OjiYYWt63PiE1nTuZnqQ4RPvME7Xai+9enoiN0Wrg==", "cpu": [ "x64" ], - "license": "MIT", "optional": true, "os": [ "linux" @@ -1310,13 +1439,12 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "14.2.8", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.8.tgz", - "integrity": "sha512-gbxfUaSPV7EyUobpavida2Hwi62GhSJaSg7iBjmBWoxkxlmETOD7U4tWt763cGIsyE6jM7IoNavq0BXqwdW2QA==", + "version": "14.2.13", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.13.tgz", + "integrity": "sha512-uP1XkqCqV2NVH9+g2sC7qIw+w2tRbcMiXFEbMihkQ8B1+V6m28sshBwAB0SDmOe0u44ne1vFU66+gx/28RsBVQ==", "cpu": [ "arm64" ], - "license": "MIT", "optional": true, "os": [ "win32" @@ -1326,13 +1454,12 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "14.2.8", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.8.tgz", - "integrity": "sha512-PUXzEzjTTlUh3b5VAn1nlpwvujTnuCMMwbiCnaTazoVlN1nA3kWjlmp42IfURA2N/nyrlVEw7pURa/o4Qxj1cw==", + "version": "14.2.13", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.13.tgz", + "integrity": "sha512-V26ezyjPqQpDBV4lcWIh8B/QICQ4v+M5Bo9ykLN+sqeKKBxJVDpEc6biDVyluTXTC40f5IqCU0ttth7Es2ZuMw==", "cpu": [ "ia32" ], - "license": "MIT", "optional": true, "os": [ "win32" @@ -1342,13 +1469,12 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "14.2.8", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.8.tgz", - "integrity": "sha512-EnPKv0ttq02E9/1KZ/8Dn7kuutv6hy1CKc0HlNcvzOQcm4/SQtvfws5gY0zrG9tuupd3HfC2L/zcTrnBhpjTuQ==", + "version": "14.2.13", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.13.tgz", + "integrity": "sha512-WwzOEAFBGhlDHE5Z73mNU8CO8mqMNLqaG+AO9ETmzdCQlJhVtWZnOl2+rqgVQS+YHunjOWptdFmNfbpwcUuEsw==", "cpu": [ "x64" ], - "license": "MIT", "optional": true, "os": [ "win32" @@ -1426,14 +1552,13 @@ "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", - "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/popperjs" } }, "node_modules/@react-aria/ssr": { - "version": "3.9.4", + "version": "3.9.5", "license": "Apache-2.0", "dependencies": { "@swc/helpers": "^0.5.0" @@ -1442,14 +1567,13 @@ "node": ">= 12" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0" } }, "node_modules/@reduxjs/toolkit": { "version": "2.2.7", "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.2.7.tgz", "integrity": "sha512-faI3cZbSdFb8yv9dhDTmGwclW0vk0z5o1cia+kf7gCbaCwHI5e+7tP57mJUv22pNcNbeA62GSrPpfrUfdXcQ6g==", - "license": "MIT", "dependencies": { "immer": "^10.0.3", "redux": "^5.0.1", @@ -1480,7 +1604,7 @@ } }, "node_modules/@restart/ui": { - "version": "1.6.9", + "version": "1.8.0", "license": "MIT", "dependencies": { "@babel/runtime": "^7.21.0", @@ -1506,7 +1630,7 @@ } }, "node_modules/@rushstack/eslint-patch": { - "version": "1.10.3", + "version": "1.7.2", "dev": true, "license": "MIT" }, @@ -1544,7 +1668,7 @@ } }, "node_modules/@testing-library/dom": { - "version": "10.1.0", + "version": "10.3.1", "dev": true, "license": "MIT", "peer": true, @@ -1562,12 +1686,33 @@ "node": ">=18" } }, + "node_modules/@testing-library/dom/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@testing-library/dom/node_modules/dom-accessibility-api": { + "version": "0.5.16", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/@testing-library/jest-dom": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.5.0.tgz", "integrity": "sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA==", "dev": true, - "license": "MIT", "dependencies": { "@adobe/css-tools": "^4.4.0", "aria-query": "^5.0.0", @@ -1583,29 +1728,11 @@ "yarn": ">=1" } }, - "node_modules/@testing-library/jest-dom/node_modules/chalk": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { - "version": "0.6.3", - "dev": true, - "license": "MIT" - }, "node_modules/@testing-library/react": { "version": "16.0.1", "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.0.1.tgz", "integrity": "sha512-dSmwJVtJXmku+iocRhWOUFbrERC76TX2Mnf0ATODz8brzAZrMBbzLwQixlBSanZxR6LddK3eiwpSFZgDET1URg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5" }, @@ -1672,7 +1799,7 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.20.6", + "version": "7.20.5", "dev": true, "license": "MIT", "dependencies": { @@ -1720,8 +1847,6 @@ }, "node_modules/@types/json-schema": { "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true, "license": "MIT" }, @@ -1731,7 +1856,7 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "20.14.5", + "version": "20.11.25", "dev": true, "license": "MIT", "dependencies": { @@ -1739,17 +1864,28 @@ } }, "node_modules/@types/prop-types": { - "version": "15.7.12", + "version": "15.7.11", "license": "MIT" }, "node_modules/@types/react": { - "version": "18.3.3", + "version": "18.2.64", "license": "MIT", "dependencies": { "@types/prop-types": "*", + "@types/scheduler": "*", "csstype": "^3.0.2" } }, + "node_modules/@types/react-dom": { + "version": "18.2.20", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/react": "*" + } + }, "node_modules/@types/react-transition-group": { "version": "4.4.10", "license": "MIT", @@ -1757,10 +1893,12 @@ "@types/react": "*" } }, + "node_modules/@types/scheduler": { + "version": "0.16.8", + "license": "MIT" + }, "node_modules/@types/semver": { "version": "7.5.8", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", - "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", "dev": true, "license": "MIT" }, @@ -1795,24 +1933,16 @@ "dev": true, "license": "MIT" }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.2.0.tgz", - "integrity": "sha512-mdekAHOqS9UjlmyF/LSs6AIEvfceV749GFxoBAjwAv0nkevfKHWQFDMcBZWUiIC5ft6ePWivXoS36aKQ0Cy3sw==", + "node_modules/@typescript-eslint/parser": { + "version": "6.21.0", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "7.2.0", - "@typescript-eslint/type-utils": "7.2.0", - "@typescript-eslint/utils": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1822,8 +1952,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^7.0.0", - "eslint": "^8.56.0" + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -1831,16 +1960,13 @@ } } }, - "node_modules/@typescript-eslint/parser": { - "version": "7.2.0", + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.21.0", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "7.2.0", - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/typescript-estree": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", - "debug": "^4.3.4" + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1848,23 +1974,17 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } } }, - "node_modules/@typescript-eslint/scope-manager": { + "node_modules/@typescript-eslint/type-utils": { "version": "7.2.0", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0" + "@typescript-eslint/typescript-estree": "7.2.0", + "@typescript-eslint/utils": "7.2.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1872,18 +1992,40 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@typescript-eslint/type-utils": { + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.2.0.tgz", - "integrity": "sha512-xHi51adBHo9O9330J8GQYQwrKBqbIPJGZZVQTHHmy200hvkLZFWJIFtAG/7IYTWUyun6DE6w5InDReePJYJlJA==", "dev": true, "license": "MIT", + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "7.2.0", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/typescript-estree": "7.2.0", - "@typescript-eslint/utils": "7.2.0", + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0", "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", "ts-api-utils": "^1.0.1" }, "engines": { @@ -1893,19 +2035,54 @@ "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependencies": { - "eslint": "^8.56.0" - }, "peerDependenciesMeta": { "typescript": { "optional": true } } }, - "node_modules/@typescript-eslint/types": { + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { "version": "7.2.0", "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "7.2.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/minimatch": { + "version": "9.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.21.0", + "dev": true, + "license": "MIT", "engines": { "node": "^16.0.0 || >=18.0.0" }, @@ -1915,12 +2092,12 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.2.0", + "version": "6.21.0", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1965,8 +2142,6 @@ }, "node_modules/@typescript-eslint/utils": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.2.0.tgz", - "integrity": "sha512-YfHpnMAGb1Eekpm3XRK8hcMwGLGsnT6L+7b2XyRv6ouDuJU1tZir1GS2i0+VXRatMwSI1/UfcyPe53ADkU+IuA==", "dev": true, "license": "MIT", "dependencies": { @@ -1989,12 +2164,105 @@ "eslint": "^8.56.0" } }, - "node_modules/@typescript-eslint/visitor-keys": { + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { "version": "7.2.0", "dev": true, "license": "MIT", "dependencies": { "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "7.2.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "7.2.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/minimatch": { + "version": "9.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.21.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -2029,7 +2297,7 @@ "license": "ISC" }, "node_modules/acorn": { - "version": "8.12.0", + "version": "8.11.3", "dev": true, "license": "MIT", "bin": { @@ -2057,12 +2325,9 @@ } }, "node_modules/acorn-walk": { - "version": "8.3.3", + "version": "8.3.2", "dev": true, "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, "engines": { "node": ">=0.4.0" } @@ -2221,15 +2486,14 @@ } }, "node_modules/array-includes": { - "version": "3.1.8", + "version": "3.1.7", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", "is-string": "^1.0.7" }, "engines": { @@ -2247,16 +2511,33 @@ "node": ">=8" } }, + "node_modules/array.prototype.filter": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array.prototype.findlast": { - "version": "1.2.5", + "version": "1.2.4", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.5", "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", + "es-abstract": "^1.22.3", "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", "es-shim-unscopables": "^1.0.2" }, "engines": { @@ -2267,15 +2548,14 @@ } }, "node_modules/array.prototype.findlastindex": { - "version": "1.2.5", + "version": "1.2.4", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.5", "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", + "es-abstract": "^1.22.3", "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", "es-shim-unscopables": "^1.0.2" }, "engines": { @@ -2331,18 +2611,15 @@ } }, "node_modules/array.prototype.tosorted": { - "version": "1.1.4", + "version": "1.1.3", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.5", "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", - "es-errors": "^1.3.0", + "es-abstract": "^1.22.3", + "es-errors": "^1.1.0", "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" } }, "node_modules/arraybuffer.prototype.slice": { @@ -2371,6 +2648,14 @@ "dev": true, "license": "MIT" }, + "node_modules/asynciterator.prototype": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + } + }, "node_modules/asynckit": { "version": "0.4.0", "dev": true, @@ -2426,6 +2711,21 @@ "@babel/core": "^7.8.0" } }, + "node_modules/babel-jest/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/babel-plugin-istanbul": { "version": "6.1.1", "dev": true, @@ -2542,7 +2842,6 @@ "url": "https://opencollective.com/bootstrap" } ], - "license": "MIT", "peerDependencies": { "@popperjs/core": "^2.11.8" } @@ -2560,8 +2859,7 @@ "type": "opencollective", "url": "https://opencollective.com/bootstrap" } - ], - "license": "MIT" + ] }, "node_modules/brace-expansion": { "version": "1.1.11", @@ -2584,7 +2882,7 @@ } }, "node_modules/browserslist": { - "version": "4.23.1", + "version": "4.23.0", "dev": true, "funding": [ { @@ -2602,10 +2900,10 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001629", - "electron-to-chromium": "^1.4.796", + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.16" + "update-browserslist-db": "^1.0.13" }, "bin": { "browserslist": "cli.js" @@ -2771,7 +3069,7 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001636", + "version": "1.0.30001594", "funding": [ { "type": "opencollective", @@ -2797,7 +3095,7 @@ } }, "node_modules/chalk": { - "version": "4.1.2", + "version": "3.0.0", "dev": true, "license": "MIT", "dependencies": { @@ -2805,10 +3103,7 @@ "supports-color": "^7.1.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=8" } }, "node_modules/char-regex": { @@ -2823,7 +3118,6 @@ "version": "4.4.4", "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.4.tgz", "integrity": "sha512-emICKGBABnxhMjUjlYRR12PmOXhJ2eJjEHL2/dZlWjxRAZT1D8xplLFq5M0tMQK8ja+wBS/tuVEJB5C6r7VxJA==", - "license": "MIT", "dependencies": { "@kurkle/color": "^0.3.0" }, @@ -2854,7 +3148,7 @@ } }, "node_modules/cjs-module-lexer": { - "version": "1.3.1", + "version": "1.2.3", "dev": true, "license": "MIT" }, @@ -2986,11 +3280,11 @@ } }, "node_modules/commander": { - "version": "12.1.0", + "version": "9.5.0", "dev": true, "license": "MIT", "engines": { - "node": ">=18" + "node": "^12.20.0 || >=14" } }, "node_modules/common-tags": { @@ -3036,6 +3330,21 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/create-jest/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "dev": true, @@ -3114,56 +3423,8 @@ "node": ">=12" } }, - "node_modules/data-view-buffer": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/debug": { - "version": "4.3.5", + "version": "4.3.4", "dev": true, "license": "MIT", "dependencies": { @@ -3184,7 +3445,7 @@ "license": "MIT" }, "node_modules/dedent": { - "version": "1.5.3", + "version": "1.5.1", "dev": true, "license": "MIT", "peerDependencies": { @@ -3305,10 +3566,9 @@ } }, "node_modules/dom-accessibility-api": { - "version": "0.5.16", + "version": "0.6.3", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/dom-helpers": { "version": "5.2.1", @@ -3335,7 +3595,7 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.4.805", + "version": "1.4.693", "dev": true, "license": "ISC" }, @@ -3365,7 +3625,7 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.17.0", + "version": "5.15.1", "dev": true, "license": "MIT", "dependencies": { @@ -3409,7 +3669,7 @@ } }, "node_modules/es-abstract": { - "version": "1.23.3", + "version": "1.22.5", "dev": true, "license": "MIT", "dependencies": { @@ -3417,12 +3677,8 @@ "arraybuffer.prototype.slice": "^1.0.3", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.7", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", "es-define-property": "^1.0.0", "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", "es-set-tostringtag": "^2.0.3", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.6", @@ -3433,11 +3689,10 @@ "has-property-descriptors": "^1.0.2", "has-proto": "^1.0.3", "has-symbols": "^1.0.3", - "hasown": "^2.0.2", + "hasown": "^2.0.1", "internal-slot": "^1.0.7", "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", "is-negative-zero": "^2.0.3", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.3", @@ -3448,17 +3703,17 @@ "object-keys": "^1.1.1", "object.assign": "^4.1.5", "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.2", + "safe-array-concat": "^1.1.0", "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", - "string.prototype.trimstart": "^1.0.8", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", "typed-array-buffer": "^1.0.2", "typed-array-byte-length": "^1.0.1", "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.6", + "typed-array-length": "^1.0.5", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" + "which-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -3467,6 +3722,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, "node_modules/es-define-property": { "version": "1.0.0", "dev": true, @@ -3487,35 +3747,25 @@ } }, "node_modules/es-iterator-helpers": { - "version": "1.0.19", + "version": "1.0.17", "dev": true, "license": "MIT", "dependencies": { + "asynciterator.prototype": "^1.0.0", "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", + "es-abstract": "^1.22.4", "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.3", + "es-set-tostringtag": "^2.0.2", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "globalthis": "^1.0.3", "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "internal-slot": "^1.0.7", "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" + "safe-array-concat": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -3646,17 +3896,16 @@ } }, "node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", "dev": true, - "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", @@ -3702,16 +3951,15 @@ } }, "node_modules/eslint-config-next": { - "version": "14.2.8", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.8.tgz", - "integrity": "sha512-gRqxHkSuCrQro6xqXnmXphcq8rdiw7FI+nLXpWmIlp/AfUzHCgXNQE7mOK+oco+SRaJbhqCg/68uRln1qjkF+Q==", + "version": "14.2.13", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.13.tgz", + "integrity": "sha512-aro1EKAoyYchnO/3Tlo91hnNBO7QO7qnv/79MAFC+4Jq8TdUVKQlht5d2F+YjrePjdpOvfL+mV9JPfyYNwkk1g==", "dev": true, - "license": "MIT", "dependencies": { - "@next/eslint-plugin-next": "14.2.8", + "@next/eslint-plugin-next": "14.2.13", "@rushstack/eslint-patch": "^1.3.3", - "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || 7.0.0 - 7.2.0", - "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || 7.0.0 - 7.2.0", + "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", "eslint-plugin-import": "^2.28.1", @@ -3729,6 +3977,160 @@ } } }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "7.2.0", + "@typescript-eslint/type-utils": "7.2.0", + "@typescript-eslint/utils": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/parser": { + "version": "7.2.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "7.2.0", + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/typescript-estree": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/scope-manager": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/types": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/typescript-estree": { + "version": "7.2.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/visitor-keys": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "7.2.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/eslint-config-next/node_modules/minimatch": { + "version": "9.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "dev": true, @@ -3882,28 +4284,28 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.34.2", + "version": "7.34.0", "dev": true, "license": "MIT", "dependencies": { - "array-includes": "^3.1.8", - "array.prototype.findlast": "^1.2.5", + "array-includes": "^3.1.7", + "array.prototype.findlast": "^1.2.4", "array.prototype.flatmap": "^1.3.2", "array.prototype.toreversed": "^1.1.2", "array.prototype.tosorted": "^1.1.3", "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.19", + "es-iterator-helpers": "^1.0.17", "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", - "object.entries": "^1.1.8", - "object.fromentries": "^2.0.8", - "object.hasown": "^1.1.4", - "object.values": "^1.2.0", + "object.entries": "^1.1.7", + "object.fromentries": "^2.0.7", + "object.hasown": "^1.1.3", + "object.values": "^1.1.7", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.5", "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.11" + "string.prototype.matchall": "^4.0.10" }, "engines": { "node": ">=4" @@ -3913,7 +4315,7 @@ } }, "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.2", + "version": "4.6.0", "dev": true, "license": "MIT", "engines": { @@ -3984,6 +4386,21 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/esniff": { "version": "2.0.1", "dev": true, @@ -4140,7 +4557,6 @@ "resolved": "https://registry.npmjs.org/fantasticon/-/fantasticon-3.0.0.tgz", "integrity": "sha512-PylulixZA8I0SeiUKtuyOhwrz/ojZTSA1KXddipvEyQXCVrpPMTnSXzaE9nXXK7nCjJWFkqoBAQ1aBdaxMltrg==", "dev": true, - "license": "MIT", "dependencies": { "case": "^1.6.3", "cli-color": "^2.0.4", @@ -4169,8 +4585,16 @@ "balanced-match": "^1.0.0" } }, + "node_modules/fantasticon/node_modules/commander": { + "version": "12.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/fantasticon/node_modules/glob": { - "version": "10.4.1", + "version": "10.4.5", "dev": true, "license": "ISC", "dependencies": { @@ -4178,27 +4602,25 @@ "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/fantasticon/node_modules/jackspeak": { - "version": "3.4.0", + "version": "3.4.2", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, "engines": { - "node": ">=14" + "node": "14 >=14.21 || 16 >=16.20 || >=18" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -4208,7 +4630,7 @@ } }, "node_modules/fantasticon/node_modules/minimatch": { - "version": "9.0.4", + "version": "9.0.5", "dev": true, "license": "ISC", "dependencies": { @@ -4550,7 +4972,7 @@ } }, "node_modules/get-tsconfig": { - "version": "4.7.5", + "version": "4.7.2", "dev": true, "license": "MIT", "dependencies": { @@ -4565,7 +4987,6 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", "dev": true, - "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^2.3.5", @@ -4599,7 +5020,6 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -4609,7 +5029,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -4635,12 +5054,11 @@ } }, "node_modules/globalthis": { - "version": "1.0.4", + "version": "1.0.3", "dev": true, "license": "MIT", "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" + "define-properties": "^1.1.3" }, "engines": { "node": ">= 0.4" @@ -4796,7 +5214,7 @@ "license": "ISC" }, "node_modules/hasown": { - "version": "2.0.2", + "version": "2.0.1", "dev": true, "license": "MIT", "dependencies": { @@ -4888,7 +5306,7 @@ } }, "node_modules/immer": { - "version": "10.1.1", + "version": "10.0.3", "license": "MIT", "funding": { "type": "opencollective", @@ -4995,6 +5413,11 @@ "node": ">= 12" } }, + "node_modules/ip-address/node_modules/sprintf-js": { + "version": "1.1.3", + "dev": true, + "license": "BSD-3-Clause" + }, "node_modules/is-array-buffer": { "version": "3.0.4", "dev": true, @@ -5077,20 +5500,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-data-view": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-date-object": { "version": "1.0.5", "dev": true, @@ -5171,12 +5580,9 @@ "license": "MIT" }, "node_modules/is-map": { - "version": "2.0.3", + "version": "2.0.2", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.4" - }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -5248,12 +5654,9 @@ } }, "node_modules/is-set": { - "version": "2.0.3", + "version": "2.0.2", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.4" - }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -5326,12 +5729,9 @@ } }, "node_modules/is-weakmap": { - "version": "2.0.2", + "version": "2.0.1", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.4" - }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -5348,15 +5748,12 @@ } }, "node_modules/is-weakset": { - "version": "2.0.3", + "version": "2.0.2", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5450,7 +5847,6 @@ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", "dev": true, - "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -5469,7 +5865,6 @@ "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, - "license": "MIT", "dependencies": { "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", @@ -5534,15 +5929,19 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-circus/node_modules/ansi-styles": { - "version": "5.2.0", + "node_modules/jest-circus/node_modules/chalk": { + "version": "4.1.2", "dev": true, "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-circus/node_modules/pretty-format": { @@ -5555,11 +5954,22 @@ "react-is": "^18.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-circus/node_modules/react-is": { - "version": "18.3.1", + "version": "18.2.0", "dev": true, "license": "MIT" }, @@ -5595,6 +6005,21 @@ } } }, + "node_modules/jest-cli/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/jest-config": { "version": "29.7.0", "dev": true, @@ -5639,15 +6064,19 @@ } } }, - "node_modules/jest-config/node_modules/ansi-styles": { - "version": "5.2.0", + "node_modules/jest-config/node_modules/chalk": { + "version": "4.1.2", "dev": true, "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-config/node_modules/glob": { @@ -5682,8 +6111,19 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-config/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/jest-config/node_modules/react-is": { - "version": "18.3.1", + "version": "18.2.0", "dev": true, "license": "MIT" }, @@ -5701,15 +6141,19 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-diff/node_modules/ansi-styles": { - "version": "5.2.0", + "node_modules/jest-diff/node_modules/chalk": { + "version": "4.1.2", "dev": true, "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-diff/node_modules/pretty-format": { @@ -5725,8 +6169,19 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-diff/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/jest-diff/node_modules/react-is": { - "version": "18.3.1", + "version": "18.2.0", "dev": true, "license": "MIT" }, @@ -5756,15 +6211,19 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-each/node_modules/ansi-styles": { - "version": "5.2.0", + "node_modules/jest-each/node_modules/chalk": { + "version": "4.1.2", "dev": true, "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-each/node_modules/pretty-format": { @@ -5780,8 +6239,19 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-each/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/jest-each/node_modules/react-is": { - "version": "18.3.1", + "version": "18.2.0", "dev": true, "license": "MIT" }, @@ -5790,7 +6260,6 @@ "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz", "integrity": "sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==", "dev": true, - "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -5898,7 +6367,7 @@ } }, "node_modules/jest-leak-detector/node_modules/react-is": { - "version": "18.3.1", + "version": "18.2.0", "dev": true, "license": "MIT" }, @@ -5916,15 +6385,19 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-matcher-utils/node_modules/ansi-styles": { - "version": "5.2.0", + "node_modules/jest-matcher-utils/node_modules/chalk": { + "version": "4.1.2", "dev": true, "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-matcher-utils/node_modules/pretty-format": { @@ -5940,8 +6413,19 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-matcher-utils/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/jest-matcher-utils/node_modules/react-is": { - "version": "18.3.1", + "version": "18.2.0", "dev": true, "license": "MIT" }, @@ -5964,15 +6448,19 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-message-util/node_modules/ansi-styles": { - "version": "5.2.0", + "node_modules/jest-message-util/node_modules/chalk": { + "version": "4.1.2", "dev": true, "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-message-util/node_modules/pretty-format": { @@ -5988,8 +6476,19 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-message-util/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/jest-message-util/node_modules/react-is": { - "version": "18.3.1", + "version": "18.2.0", "dev": true, "license": "MIT" }, @@ -6061,6 +6560,21 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-resolve/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/jest-runner": { "version": "29.7.0", "dev": true, @@ -6092,6 +6606,21 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-runner/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/jest-runtime": { "version": "29.7.0", "dev": true, @@ -6124,6 +6653,21 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-runtime/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/jest-runtime/node_modules/glob": { "version": "7.2.3", "dev": true, @@ -6173,15 +6717,19 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-snapshot/node_modules/ansi-styles": { - "version": "5.2.0", + "node_modules/jest-snapshot/node_modules/chalk": { + "version": "4.1.2", "dev": true, "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-snapshot/node_modules/pretty-format": { @@ -6197,8 +6745,19 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-snapshot/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/jest-snapshot/node_modules/react-is": { - "version": "18.3.1", + "version": "18.2.0", "dev": true, "license": "MIT" }, @@ -6218,6 +6777,21 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-util/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/jest-validate": { "version": "29.7.0", "dev": true, @@ -6234,26 +6808,30 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-validate/node_modules/ansi-styles": { - "version": "5.2.0", + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", "dev": true, "license": "MIT", "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", + "node_modules/jest-validate/node_modules/chalk": { + "version": "4.1.2", "dev": true, "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-validate/node_modules/pretty-format": { @@ -6269,8 +6847,19 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-validate/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/jest-validate/node_modules/react-is": { - "version": "18.3.1", + "version": "18.2.0", "dev": true, "license": "MIT" }, @@ -6292,6 +6881,21 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-watcher/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/jest-worker": { "version": "29.7.0", "dev": true, @@ -6457,7 +7061,7 @@ } }, "node_modules/language-subtag-registry": { - "version": "0.3.23", + "version": "0.3.22", "dev": true, "license": "CC0-1.0" }, @@ -6708,21 +7312,18 @@ } }, "node_modules/memoizee": { - "version": "0.4.17", + "version": "0.4.15", "dev": true, "license": "ISC", "dependencies": { - "d": "^1.0.2", - "es5-ext": "^0.10.64", + "d": "^1.0.1", + "es5-ext": "^0.10.53", "es6-weak-map": "^2.0.3", "event-emitter": "^0.3.5", "is-promise": "^2.2.2", "lru-queue": "^0.1.0", "next-tick": "^1.1.0", "timers-ext": "^0.1.7" - }, - "engines": { - "node": ">=0.12" } }, "node_modules/merge-stream": { @@ -6744,11 +7345,11 @@ "license": "MIT" }, "node_modules/micromatch": { - "version": "4.0.7", + "version": "4.0.5", "dev": true, "license": "MIT", "dependencies": { - "braces": "^3.0.3", + "braces": "^3.0.2", "picomatch": "^2.3.1" }, "engines": { @@ -7041,12 +7642,11 @@ "license": "MIT" }, "node_modules/next": { - "version": "14.2.8", - "resolved": "https://registry.npmjs.org/next/-/next-14.2.8.tgz", - "integrity": "sha512-EyEyJZ89r8C5FPlS/401AiF3O8jeMtHIE+bLom9MwcdWJJFBgRl+MR/2VgO0v5bI6tQORNY0a0DR5sjpFNrjbg==", - "license": "MIT", + "version": "14.2.13", + "resolved": "https://registry.npmjs.org/next/-/next-14.2.13.tgz", + "integrity": "sha512-BseY9YNw8QJSwLYD7hlZzl6QVDoSFHL/URN5K64kVEVpCsSOWeyjbIGK+dZUaRViHTaMQX8aqmnn0PHBbGZezg==", "dependencies": { - "@next/env": "14.2.8", + "@next/env": "14.2.13", "@swc/helpers": "0.5.5", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001579", @@ -7061,15 +7661,15 @@ "node": ">=18.17.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "14.2.8", - "@next/swc-darwin-x64": "14.2.8", - "@next/swc-linux-arm64-gnu": "14.2.8", - "@next/swc-linux-arm64-musl": "14.2.8", - "@next/swc-linux-x64-gnu": "14.2.8", - "@next/swc-linux-x64-musl": "14.2.8", - "@next/swc-win32-arm64-msvc": "14.2.8", - "@next/swc-win32-ia32-msvc": "14.2.8", - "@next/swc-win32-x64-msvc": "14.2.8" + "@next/swc-darwin-arm64": "14.2.13", + "@next/swc-darwin-x64": "14.2.13", + "@next/swc-linux-arm64-gnu": "14.2.13", + "@next/swc-linux-arm64-musl": "14.2.13", + "@next/swc-linux-x64-gnu": "14.2.13", + "@next/swc-linux-x64-musl": "14.2.13", + "@next/swc-win32-arm64-msvc": "14.2.13", + "@next/swc-win32-ia32-msvc": "14.2.13", + "@next/swc-win32-x64-msvc": "14.2.13" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", @@ -7095,7 +7695,6 @@ "resolved": "https://registry.npmjs.org/next-router-mock/-/next-router-mock-0.9.13.tgz", "integrity": "sha512-906n2RRaE6Y28PfYJbaz5XZeJ6Tw8Xz1S6E31GGwZ0sXB6/XjldD1/2azn1ZmBmRk5PQRkzjg+n+RHZe5xQzWA==", "dev": true, - "license": "MIT", "peerDependencies": { "next": ">=10.0.0", "react": ">=17.0.0" @@ -7207,7 +7806,7 @@ } }, "node_modules/nwsapi": { - "version": "2.2.10", + "version": "2.2.7", "dev": true, "license": "MIT" }, @@ -7252,27 +7851,26 @@ } }, "node_modules/object.entries": { - "version": "1.1.8", + "version": "1.1.7", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" } }, "node_modules/object.fromentries": { - "version": "2.0.8", + "version": "2.0.7", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -7282,42 +7880,37 @@ } }, "node_modules/object.groupby": { - "version": "1.0.3", + "version": "1.0.2", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2" - }, - "engines": { - "node": ">= 0.4" + "array.prototype.filter": "^1.0.3", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.0.0" } }, "node_modules/object.hasown": { - "version": "1.1.4", + "version": "1.1.3", "dev": true, "license": "MIT", "dependencies": { - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object.values": { - "version": "1.2.0", + "version": "1.1.7", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -7349,16 +7942,16 @@ } }, "node_modules/optionator": { - "version": "0.9.4", + "version": "0.9.3", "dev": true, "license": "MIT", "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" + "type-check": "^0.4.0" }, "engines": { "node": ">= 0.8.0" @@ -7414,6 +8007,11 @@ "node": ">=6" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "dev": true, + "license": "BlueOak-1.0.0" + }, "node_modules/pako": { "version": "1.0.11", "dev": true, @@ -7503,12 +8101,9 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.2.2", + "version": "10.4.3", "dev": true, - "license": "ISC", - "engines": { - "node": "14 || >=16.14" - } + "license": "ISC" }, "node_modules/path-type": { "version": "4.0.0", @@ -7519,7 +8114,7 @@ } }, "node_modules/picocolors": { - "version": "1.0.1", + "version": "1.0.0", "license": "ISC" }, "node_modules/picomatch": { @@ -7647,7 +8242,6 @@ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", "dev": true, - "license": "MIT", "bin": { "prettier": "bin/prettier.cjs" }, @@ -7663,7 +8257,6 @@ "resolved": "https://registry.npmjs.org/prettier-eslint/-/prettier-eslint-16.3.0.tgz", "integrity": "sha512-Lh102TIFCr11PJKUMQ2kwNmxGhTsv/KzUg9QYF2Gkw259g/kPgndZDWavk7/ycbRvj2oz4BPZ1gCU8bhfZH/Xg==", "dev": true, - "license": "MIT", "dependencies": { "@typescript-eslint/parser": "^6.7.5", "common-tags": "^1.4.0", @@ -7694,104 +8287,6 @@ } } }, - "node_modules/prettier-eslint/node_modules/@typescript-eslint/parser": { - "version": "6.21.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/prettier-eslint/node_modules/@typescript-eslint/scope-manager": { - "version": "6.21.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/prettier-eslint/node_modules/@typescript-eslint/types": { - "version": "6.21.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/prettier-eslint/node_modules/@typescript-eslint/typescript-estree": { - "version": "6.21.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/prettier-eslint/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.21.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/prettier-eslint/node_modules/ansi-styles": { "version": "5.2.0", "dev": true, @@ -7803,28 +8298,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/prettier-eslint/node_modules/brace-expansion": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/prettier-eslint/node_modules/minimatch": { - "version": "9.0.3", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/prettier-eslint/node_modules/pretty-format": { "version": "29.7.0", "dev": true, @@ -7839,7 +8312,7 @@ } }, "node_modules/prettier-eslint/node_modules/react-is": { - "version": "18.3.1", + "version": "18.2.0", "dev": true, "license": "MIT" }, @@ -7940,7 +8413,7 @@ } }, "node_modules/pure-rand": { - "version": "6.1.0", + "version": "6.0.4", "dev": true, "funding": [ { @@ -7982,7 +8455,6 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" }, @@ -7994,7 +8466,6 @@ "version": "2.10.4", "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-2.10.4.tgz", "integrity": "sha512-W3398nBM2CBfmGP2evneEO3ZZwEMPtHs72q++eNw60uDGDAdiGn0f9yNys91eo7/y8CTF5Ke1C0QO8JFVPU40Q==", - "license": "MIT", "dependencies": { "@babel/runtime": "^7.24.7", "@restart/hooks": "^0.4.9", @@ -8024,7 +8495,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/react-chartjs-2/-/react-chartjs-2-5.2.0.tgz", "integrity": "sha512-98iN5aguJyVSxp5U3CblRLH67J8gkfyGNbiK3c+l1QI/G4irHMPQw44aEPmjVag+YKTyQ260NcF82GTQ3bdscA==", - "license": "MIT", "peerDependencies": { "chart.js": "^4.1.1", "react": "^16.8.0 || ^17.0.0 || ^18.0.0" @@ -8034,7 +8504,6 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "license": "MIT", "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -8057,7 +8526,6 @@ "version": "9.1.2", "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.1.2.tgz", "integrity": "sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w==", - "license": "MIT", "dependencies": { "@types/use-sync-external-store": "^0.0.3", "use-sync-external-store": "^1.0.0" @@ -8127,15 +8595,15 @@ } }, "node_modules/reflect.getprototypeof": { - "version": "1.0.6", + "version": "1.0.5", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.5", "define-properties": "^1.2.1", - "es-abstract": "^1.23.1", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", + "es-abstract": "^1.22.3", + "es-errors": "^1.0.0", + "get-intrinsic": "^1.2.3", "globalthis": "^1.0.3", "which-builtin-type": "^1.1.3" }, @@ -8186,7 +8654,7 @@ "license": "MIT" }, "node_modules/reselect": { - "version": "5.1.1", + "version": "5.1.0", "license": "MIT" }, "node_modules/resolve": { @@ -8321,12 +8789,12 @@ } }, "node_modules/safe-array-concat": { - "version": "1.1.2", + "version": "1.1.0", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, @@ -8378,7 +8846,7 @@ "license": "MIT" }, "node_modules/sax": { - "version": "1.4.1", + "version": "1.3.0", "dev": true, "license": "ISC" }, @@ -8401,9 +8869,12 @@ } }, "node_modules/semver": { - "version": "7.6.2", + "version": "7.6.0", "dev": true, "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, "bin": { "semver": "bin/semver.js" }, @@ -8411,22 +8882,38 @@ "node": ">=10" } }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, "node_modules/set-blocking": { "version": "2.0.0", "dev": true, "license": "ISC" }, "node_modules/set-function-length": { - "version": "1.2.2", + "version": "1.2.1", "dev": true, "license": "MIT", "dependencies": { - "define-data-property": "^1.1.4", + "define-data-property": "^1.1.2", "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", + "get-intrinsic": "^1.2.3", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" + "has-property-descriptors": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -8558,7 +9045,7 @@ } }, "node_modules/source-map-js": { - "version": "1.2.0", + "version": "1.0.2", "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -8574,7 +9061,7 @@ } }, "node_modules/sprintf-js": { - "version": "1.1.3", + "version": "1.0.3", "dev": true, "license": "BSD-3-Clause" }, @@ -8711,39 +9198,32 @@ } }, "node_modules/string.prototype.matchall": { - "version": "4.0.11", + "version": "4.0.10", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "regexp.prototype.flags": "^1.5.2", - "set-function-name": "^2.0.2", - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">= 0.4" + "internal-slot": "^1.0.5", + "regexp.prototype.flags": "^1.5.0", + "set-function-name": "^2.0.0", + "side-channel": "^1.0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trim": { - "version": "1.2.9", + "version": "1.2.8", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -8753,29 +9233,26 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.8", + "version": "1.0.7", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.8", + "version": "1.0.7", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8934,14 +9411,6 @@ "balanced-match": "^1.0.0" } }, - "node_modules/svgicons2svgfont/node_modules/commander": { - "version": "9.5.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || >=14" - } - }, "node_modules/svgicons2svgfont/node_modules/glob": { "version": "8.1.0", "dev": true, @@ -9059,15 +9528,12 @@ "license": "MIT" }, "node_modules/timers-ext": { - "version": "0.1.8", + "version": "0.1.7", "dev": true, "license": "ISC", "dependencies": { - "es5-ext": "^0.10.64", - "next-tick": "^1.1.0" - }, - "engines": { - "node": ">=0.12" + "es5-ext": "~0.10.46", + "next-tick": "1" } }, "node_modules/tmpl": { @@ -9095,7 +9561,7 @@ } }, "node_modules/tough-cookie": { - "version": "4.1.4", + "version": "4.1.3", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -9120,7 +9586,7 @@ } }, "node_modules/ts-api-utils": { - "version": "1.3.0", + "version": "1.2.1", "dev": true, "license": "MIT", "engines": { @@ -9161,7 +9627,7 @@ } }, "node_modules/tslib": { - "version": "2.6.3", + "version": "2.6.2", "license": "0BSD" }, "node_modules/ttf2eot": { @@ -9206,7 +9672,7 @@ } }, "node_modules/type": { - "version": "2.7.3", + "version": "2.7.2", "dev": true, "license": "ISC" }, @@ -9291,7 +9757,7 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.6", + "version": "1.0.5", "dev": true, "license": "MIT", "dependencies": { @@ -9310,7 +9776,7 @@ } }, "node_modules/typescript": { - "version": "5.4.5", + "version": "5.4.2", "dev": true, "license": "Apache-2.0", "bin": { @@ -9322,7 +9788,7 @@ } }, "node_modules/uglify-js": { - "version": "3.18.0", + "version": "3.17.4", "dev": true, "license": "BSD-2-Clause", "optional": true, @@ -9396,7 +9862,7 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.16", + "version": "1.0.13", "dev": true, "funding": [ { @@ -9414,8 +9880,8 @@ ], "license": "MIT", "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" + "escalade": "^3.1.1", + "picocolors": "^1.0.0" }, "bin": { "update-browserslist-db": "cli.js" @@ -9442,7 +9908,7 @@ } }, "node_modules/use-sync-external-store": { - "version": "1.2.2", + "version": "1.2.0", "license": "MIT", "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0" @@ -9467,7 +9933,7 @@ } }, "node_modules/vue-eslint-parser": { - "version": "9.4.3", + "version": "9.4.2", "dev": true, "license": "MIT", "dependencies": { @@ -9609,32 +10075,29 @@ } }, "node_modules/which-collection": { - "version": "1.0.2", + "version": "1.0.1", "dev": true, "license": "MIT", "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/which-typed-array": { - "version": "1.1.15", + "version": "1.1.14", "dev": true, "license": "MIT", "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", + "available-typed-arrays": "^1.0.6", + "call-bind": "^1.0.5", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.2" + "has-tostringtag": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -9669,14 +10132,6 @@ "node": ">=8" } }, - "node_modules/word-wrap": { - "version": "1.2.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/wordwrap": { "version": "1.0.0", "dev": true, @@ -9792,7 +10247,7 @@ "license": "ISC" }, "node_modules/ws": { - "version": "8.17.1", + "version": "8.18.0", "dev": true, "license": "MIT", "engines": { diff --git a/mithril-explorer/package.json b/mithril-explorer/package.json index e80e25520a7..a0dd244558b 100644 --- a/mithril-explorer/package.json +++ b/mithril-explorer/package.json @@ -19,7 +19,7 @@ "bootstrap": "^5.3.3", "bootstrap-icons": "^1.11.3", "chart.js": "^4.4.4", - "next": "^14.2.8", + "next": "^14.2.13", "react": "^18.3.1", "react-bootstrap": "^2.10.4", "react-chartjs-2": "^5.2.0", @@ -29,8 +29,8 @@ "devDependencies": { "@testing-library/jest-dom": "^6.5.0", "@testing-library/react": "^16.0.1", - "eslint": "^8.57.0", - "eslint-config-next": "^14.2.8", + "eslint": "^8.57.1", + "eslint-config-next": "^14.2.13", "fantasticon": "^3.0.0", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", From cc2ae8baf15151e01c1f386ff26e342052d3d102 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Mon, 23 Sep 2024 17:52:51 +0200 Subject: [PATCH 006/274] chore: upgrade mithril client wasm 'www' and 'www-test' dependencies By running 'make upgrade-www-deps' command. --- .../www-test/package-lock.json | 51 ++++++++++--------- mithril-client-wasm/www/package-lock.json | 6 +-- 2 files changed, 27 insertions(+), 30 deletions(-) diff --git a/mithril-client-wasm/www-test/package-lock.json b/mithril-client-wasm/www-test/package-lock.json index 67ce8845640..03ef5ec8170 100644 --- a/mithril-client-wasm/www-test/package-lock.json +++ b/mithril-client-wasm/www-test/package-lock.json @@ -21,7 +21,7 @@ }, "../pkg": { "name": "mithril-client-wasm", - "version": "0.4.2", + "version": "0.4.1", "license": "Apache-2.0" }, "node_modules/@discoveryjs/json-ext": { @@ -71,7 +71,7 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", + "version": "1.5.0", "dev": true, "license": "MIT" }, @@ -238,7 +238,7 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.19.3", + "version": "4.19.5", "dev": true, "license": "MIT", "dependencies": { @@ -272,7 +272,7 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "20.14.2", + "version": "20.14.10", "dev": true, "license": "MIT", "dependencies": { @@ -540,7 +540,7 @@ } }, "node_modules/acorn": { - "version": "8.11.3", + "version": "8.12.1", "dev": true, "license": "MIT", "bin": { @@ -696,7 +696,7 @@ } }, "node_modules/browserslist": { - "version": "4.23.0", + "version": "4.23.2", "dev": true, "funding": [ { @@ -714,10 +714,10 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", + "caniuse-lite": "^1.0.30001640", + "electron-to-chromium": "^1.4.820", "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" + "update-browserslist-db": "^1.1.0" }, "bin": { "browserslist": "cli.js" @@ -772,7 +772,7 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001629", + "version": "1.0.30001641", "dev": true, "funding": [ { @@ -933,7 +933,6 @@ "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-12.0.2.tgz", "integrity": "sha512-SNwdBeHyII+rWvee/bTnAYyO8vfVdcSTud4EIb6jcZ8inLeWucJE0DnxXQBjlQ5zlteuuvooGQy3LIyGxhvlOA==", "dev": true, - "license": "MIT", "dependencies": { "fast-glob": "^3.3.2", "glob-parent": "^6.0.1", @@ -1086,7 +1085,6 @@ "resolved": "https://registry.npmjs.org/dotenv-webpack/-/dotenv-webpack-8.1.0.tgz", "integrity": "sha512-owK1JcsPkIobeqjVrk6h7jPED/W6ZpdFsMPR+5ursB7/SdgDyO+VzAU+szK8C8u3qUhtENyYnj8eyXMR5kkGag==", "dev": true, - "license": "MIT", "dependencies": { "dotenv-defaults": "^2.0.2" }, @@ -1103,7 +1101,7 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.4.791", + "version": "1.4.823", "dev": true, "license": "ISC" }, @@ -1158,7 +1156,7 @@ } }, "node_modules/es-module-lexer": { - "version": "1.5.3", + "version": "1.5.4", "dev": true, "license": "MIT" }, @@ -1465,7 +1463,7 @@ "license": "BSD-2-Clause" }, "node_modules/globby": { - "version": "14.0.1", + "version": "14.0.2", "dev": true, "license": "MIT", "dependencies": { @@ -1748,11 +1746,14 @@ } }, "node_modules/is-core-module": { - "version": "2.13.1", + "version": "2.14.0", "dev": true, "license": "MIT", "dependencies": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -1913,7 +1914,7 @@ } }, "node_modules/launch-editor": { - "version": "2.6.1", + "version": "2.8.0", "dev": true, "license": "MIT", "dependencies": { @@ -2091,9 +2092,12 @@ } }, "node_modules/object-inspect": { - "version": "1.13.1", + "version": "1.13.2", "dev": true, "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -2261,7 +2265,7 @@ } }, "node_modules/prettier": { - "version": "3.3.3", + "version": "3.3.2", "dev": true, "license": "MIT", "bin": { @@ -2911,7 +2915,7 @@ } }, "node_modules/terser": { - "version": "5.31.0", + "version": "5.31.1", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -3097,7 +3101,7 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.16", + "version": "1.1.0", "dev": true, "funding": [ { @@ -3187,7 +3191,6 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", "dev": true, - "license": "MIT", "dependencies": { "@types/estree": "^1.0.5", "@webassemblyjs/ast": "^1.12.1", @@ -3234,7 +3237,6 @@ "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", "dev": true, - "license": "MIT", "dependencies": { "@discoveryjs/json-ext": "^0.5.0", "@webpack-cli/configtest": "^2.1.1", @@ -3316,7 +3318,6 @@ "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.1.0.tgz", "integrity": "sha512-aQpaN81X6tXie1FoOB7xlMfCsN19pSvRAeYUHOdFWOlhpQ/LlbfTqYwwmEDFV0h8GGuqmCmKmT+pxcUV/Nt2gQ==", "dev": true, - "license": "MIT", "dependencies": { "@types/bonjour": "^3.5.13", "@types/connect-history-api-fallback": "^1.5.4", diff --git a/mithril-client-wasm/www/package-lock.json b/mithril-client-wasm/www/package-lock.json index 871f4496068..94be6ec73e5 100644 --- a/mithril-client-wasm/www/package-lock.json +++ b/mithril-client-wasm/www/package-lock.json @@ -20,7 +20,7 @@ }, "../pkg": { "name": "mithril-client-wasm", - "version": "0.4.2", + "version": "0.4.1", "license": "Apache-2.0" }, "node_modules/@discoveryjs/json-ext": { @@ -932,7 +932,6 @@ "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-12.0.2.tgz", "integrity": "sha512-SNwdBeHyII+rWvee/bTnAYyO8vfVdcSTud4EIb6jcZ8inLeWucJE0DnxXQBjlQ5zlteuuvooGQy3LIyGxhvlOA==", "dev": true, - "license": "MIT", "dependencies": { "fast-glob": "^3.3.2", "glob-parent": "^6.0.1", @@ -3160,7 +3159,6 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", "dev": true, - "license": "MIT", "dependencies": { "@types/estree": "^1.0.5", "@webassemblyjs/ast": "^1.12.1", @@ -3207,7 +3205,6 @@ "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", "dev": true, - "license": "MIT", "dependencies": { "@discoveryjs/json-ext": "^0.5.0", "@webpack-cli/configtest": "^2.1.1", @@ -3289,7 +3286,6 @@ "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.1.0.tgz", "integrity": "sha512-aQpaN81X6tXie1FoOB7xlMfCsN19pSvRAeYUHOdFWOlhpQ/LlbfTqYwwmEDFV0h8GGuqmCmKmT+pxcUV/Nt2gQ==", "dev": true, - "license": "MIT", "dependencies": { "@types/bonjour": "^3.5.13", "@types/connect-history-api-fallback": "^1.5.4", From 97f92a119fdfad89d749ac84de7412a7f7ad7e0f Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Tue, 24 Sep 2024 10:15:08 +0200 Subject: [PATCH 007/274] chore: apply security patch to doc website By running 'npm audit fix'. --- docs/website/package-lock.json | 228 +++++++++++++++++++-------------- 1 file changed, 133 insertions(+), 95 deletions(-) diff --git a/docs/website/package-lock.json b/docs/website/package-lock.json index 2849dbfe735..56a3392a6a9 100644 --- a/docs/website/package-lock.json +++ b/docs/website/package-lock.json @@ -3360,22 +3360,6 @@ "@types/ms": "*" } }, - "node_modules/@types/eslint": { - "version": "8.56.6", - "license": "MIT", - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "license": "MIT", - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, "node_modules/@types/estree": { "version": "1.0.5", "license": "MIT" @@ -3798,9 +3782,10 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", - "license": "MIT", + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", "peerDependencies": { "acorn": "^8" } @@ -4273,8 +4258,9 @@ } }, "node_modules/body-parser": { - "version": "1.20.2", - "license": "MIT", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", @@ -4284,7 +4270,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.11.0", + "qs": "6.13.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -4296,21 +4282,24 @@ }, "node_modules/body-parser/node_modules/bytes": { "version": "3.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "engines": { "node": ">= 0.8" } }, "node_modules/body-parser/node_modules/debug": { "version": "2.6.9", - "license": "MIT", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { "ms": "2.0.0" } }, "node_modules/body-parser/node_modules/iconv-lite": { "version": "0.4.24", - "license": "MIT", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -4320,7 +4309,8 @@ }, "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/bonjour-service": { "version": "1.2.1", @@ -4970,7 +4960,8 @@ }, "node_modules/content-type": { "version": "1.0.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "engines": { "node": ">= 0.6" } @@ -6050,7 +6041,8 @@ }, "node_modules/depd": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "engines": { "node": ">= 0.8" } @@ -6064,7 +6056,8 @@ }, "node_modules/destroy": { "version": "1.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" @@ -6271,8 +6264,9 @@ } }, "node_modules/dompurify": { - "version": "3.0.11", - "license": "(MPL-2.0 OR Apache-2.0)" + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.1.6.tgz", + "integrity": "sha512-cTOAhc36AalkjtBpfG6O8JimdTMWNXjiePT2xQH/ppBGi/4uIpmj8eKyIkMJErXWARyINV/sB38yf8JCLF5pbQ==" }, "node_modules/domutils": { "version": "3.1.0", @@ -6324,7 +6318,8 @@ }, "node_modules/ee-first": { "version": "1.1.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { "version": "1.5.20", @@ -6359,15 +6354,17 @@ } }, "node_modules/encodeurl": { - "version": "1.0.2", - "license": "MIT", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "engines": { "node": ">= 0.8" } }, "node_modules/enhanced-resolve": { - "version": "5.16.0", - "license": "MIT", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -6753,7 +6750,8 @@ }, "node_modules/etag": { "version": "1.8.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "engines": { "node": ">= 0.6" } @@ -6803,36 +6801,36 @@ } }, "node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", + "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.2", + "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.6.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.2.0", + "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", + "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", + "path-to-regexp": "0.1.10", "proxy-addr": "~2.0.7", - "qs": "6.11.0", + "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", + "send": "0.19.0", + "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -6865,8 +6863,9 @@ "license": "MIT" }, "node_modules/express/node_modules/path-to-regexp": { - "version": "0.1.7", - "license": "MIT" + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", + "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==" }, "node_modules/express/node_modules/range-parser": { "version": "1.2.1", @@ -7039,11 +7038,12 @@ } }, "node_modules/finalhandler": { - "version": "1.2.0", - "license": "MIT", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "dependencies": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", @@ -7056,14 +7056,16 @@ }, "node_modules/finalhandler/node_modules/debug": { "version": "2.6.9", - "license": "MIT", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { "ms": "2.0.0" } }, "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/find-cache-dir": { "version": "4.0.0", @@ -7277,7 +7279,8 @@ }, "node_modules/fresh": { "version": "0.5.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "engines": { "node": ">= 0.6" } @@ -8089,7 +8092,8 @@ }, "node_modules/http-errors": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -9521,7 +9525,8 @@ }, "node_modules/media-typer": { "version": "0.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "engines": { "node": ">= 0.6" } @@ -9537,8 +9542,12 @@ } }, "node_modules/merge-descriptors": { - "version": "1.0.1", - "license": "MIT" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/merge-stream": { "version": "2.0.0", @@ -11568,10 +11577,11 @@ "license": "MIT" }, "node_modules/micromatch": { - "version": "4.0.5", - "license": "MIT", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -11580,7 +11590,8 @@ }, "node_modules/mime": { "version": "1.6.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "bin": { "mime": "cli.js" }, @@ -12077,7 +12088,8 @@ }, "node_modules/on-finished": { "version": "2.4.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dependencies": { "ee-first": "1.1.1" }, @@ -12354,8 +12366,9 @@ "license": "MIT" }, "node_modules/path-to-regexp": { - "version": "1.8.0", - "license": "MIT", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", + "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", "dependencies": { "isarray": "0.0.1" } @@ -13191,10 +13204,11 @@ } }, "node_modules/qs": { - "version": "6.11.0", - "license": "BSD-3-Clause", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" }, "engines": { "node": ">=0.6" @@ -13282,7 +13296,8 @@ }, "node_modules/raw-body": { "version": "2.5.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -13295,14 +13310,16 @@ }, "node_modules/raw-body/node_modules/bytes": { "version": "3.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "engines": { "node": ">= 0.8" } }, "node_modules/raw-body/node_modules/iconv-lite": { "version": "0.4.24", - "license": "MIT", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -14363,8 +14380,9 @@ "license": "ISC" }, "node_modules/send": { - "version": "0.18.0", - "license": "MIT", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -14386,22 +14404,34 @@ }, "node_modules/send/node_modules/debug": { "version": "2.6.9", - "license": "MIT", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { "ms": "2.0.0" } }, "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } }, "node_modules/send/node_modules/ms": { "version": "2.1.3", - "license": "MIT" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/send/node_modules/range-parser": { "version": "1.2.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "engines": { "node": ">= 0.6" } @@ -14494,13 +14524,14 @@ } }, "node_modules/serve-static": { - "version": "1.15.0", - "license": "MIT", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "dependencies": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" + "send": "0.19.0" }, "engines": { "node": ">= 0.8.0" @@ -14537,7 +14568,8 @@ }, "node_modules/setprototypeof": { "version": "1.2.0", - "license": "ISC" + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, "node_modules/shallow-clone": { "version": "3.0.1", @@ -14837,7 +14869,8 @@ }, "node_modules/statuses": { "version": "2.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "engines": { "node": ">= 0.8" } @@ -15299,7 +15332,8 @@ }, "node_modules/toidentifier": { "version": "1.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "engines": { "node": ">=0.6" } @@ -15355,7 +15389,8 @@ }, "node_modules/type-is": { "version": "1.6.18", - "license": "MIT", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -15366,14 +15401,16 @@ }, "node_modules/type-is/node_modules/mime-db": { "version": "1.52.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "engines": { "node": ">= 0.6" } }, "node_modules/type-is/node_modules/mime-types": { "version": "2.1.35", - "license": "MIT", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dependencies": { "mime-db": "1.52.0" }, @@ -15646,7 +15683,8 @@ }, "node_modules/unpipe": { "version": "1.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "engines": { "node": ">= 0.8" } @@ -15996,19 +16034,19 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/webpack": { - "version": "5.91.0", - "license": "MIT", + "version": "5.94.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", + "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", "dependencies": { - "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.5", "@webassemblyjs/ast": "^1.12.1", "@webassemblyjs/wasm-edit": "^1.12.1", "@webassemblyjs/wasm-parser": "^1.12.1", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", + "acorn-import-attributes": "^1.9.5", "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.16.0", + "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", From d66a832dc79af1485f2259b94814c316e2dda661 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Tue, 24 Sep 2024 10:17:05 +0200 Subject: [PATCH 008/274] chore: apply security patch to explorer By running 'npm audit fix'. --- mithril-explorer/package-lock.json | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/mithril-explorer/package-lock.json b/mithril-explorer/package-lock.json index d3208d79e13..cf1caa68868 100644 --- a/mithril-explorer/package-lock.json +++ b/mithril-explorer/package-lock.json @@ -4828,6 +4828,20 @@ "dev": true, "license": "ISC" }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/function-bind": { "version": "1.1.2", "dev": true, @@ -7345,11 +7359,12 @@ "license": "MIT" }, "node_modules/micromatch": { - "version": "4.0.5", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, - "license": "MIT", "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { From 3b896ccf6cfb9e57e7f0ebabd4456bab90509b0f Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Tue, 24 Sep 2024 10:18:21 +0200 Subject: [PATCH 009/274] chore: apply security patch to client wasm 'www' and 'www-test' By running 'npm audit fix'. --- .../www-test/package-lock.json | 189 +++++++++++------- mithril-client-wasm/www/package-lock.json | 189 +++++++++++------- 2 files changed, 242 insertions(+), 136 deletions(-) diff --git a/mithril-client-wasm/www-test/package-lock.json b/mithril-client-wasm/www-test/package-lock.json index 03ef5ec8170..82fa94b9ada 100644 --- a/mithril-client-wasm/www-test/package-lock.json +++ b/mithril-client-wasm/www-test/package-lock.json @@ -645,9 +645,10 @@ } }, "node_modules/body-parser": { - "version": "1.20.2", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "dev": true, - "license": "MIT", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", @@ -657,7 +658,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.11.0", + "qs": "6.13.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -669,8 +670,9 @@ }, "node_modules/body-parser/node_modules/bytes": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -755,8 +757,9 @@ }, "node_modules/call-bind": { "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, - "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -909,8 +912,9 @@ }, "node_modules/content-type": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -1006,8 +1010,9 @@ }, "node_modules/define-data-property": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, - "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -1033,16 +1038,18 @@ }, "node_modules/depd": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/destroy": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" @@ -1106,9 +1113,10 @@ "license": "ISC" }, "node_modules/encodeurl": { - "version": "1.0.2", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -1138,8 +1146,9 @@ }, "node_modules/es-define-property": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", "dev": true, - "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.4" }, @@ -1149,8 +1158,9 @@ }, "node_modules/es-errors": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" } @@ -1214,8 +1224,9 @@ }, "node_modules/etag": { "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -1234,36 +1245,37 @@ } }, "node_modules/express": { - "version": "4.19.2", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", + "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", "dev": true, - "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.2", + "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.6.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.2.0", + "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", + "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", + "path-to-regexp": "0.1.10", "proxy-addr": "~2.0.7", - "qs": "6.11.0", + "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", + "send": "0.19.0", + "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -1349,12 +1361,13 @@ } }, "node_modules/finalhandler": { - "version": "1.2.0", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "dev": true, - "license": "MIT", "dependencies": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", @@ -1414,8 +1427,9 @@ }, "node_modules/fresh": { "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -1430,8 +1444,9 @@ }, "node_modules/get-intrinsic": { "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, - "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", @@ -1483,8 +1498,9 @@ }, "node_modules/gopd": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dev": true, - "license": "MIT", "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -1512,8 +1528,9 @@ }, "node_modules/has-property-descriptors": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, - "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" }, @@ -1523,8 +1540,9 @@ }, "node_modules/has-proto": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -1534,8 +1552,9 @@ }, "node_modules/has-symbols": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -1614,8 +1633,9 @@ }, "node_modules/http-errors": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dev": true, - "license": "MIT", "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -1678,8 +1698,9 @@ }, "node_modules/iconv-lite": { "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, - "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -1943,8 +1964,9 @@ }, "node_modules/media-typer": { "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -1968,9 +1990,13 @@ } }, "node_modules/merge-descriptors": { - "version": "1.0.1", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", "dev": true, - "license": "MIT" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/merge-stream": { "version": "2.0.0", @@ -1994,9 +2020,10 @@ } }, "node_modules/micromatch": { - "version": "4.0.7", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, - "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -2007,8 +2034,9 @@ }, "node_modules/mime": { "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true, - "license": "MIT", "bin": { "mime": "cli.js" }, @@ -2093,8 +2121,9 @@ }, "node_modules/object-inspect": { "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -2222,9 +2251,10 @@ "license": "MIT" }, "node_modules/path-to-regexp": { - "version": "0.1.7", - "dev": true, - "license": "MIT" + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", + "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", + "dev": true }, "node_modules/path-type": { "version": "5.0.0", @@ -2312,11 +2342,12 @@ } }, "node_modules/qs": { - "version": "6.11.0", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" }, "engines": { "node": ">=0.6" @@ -2362,8 +2393,9 @@ }, "node_modules/raw-body": { "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dev": true, - "license": "MIT", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -2376,8 +2408,9 @@ }, "node_modules/raw-body/node_modules/bytes": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -2536,8 +2569,9 @@ }, "node_modules/safer-buffer": { "version": "2.1.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true }, "node_modules/schema-utils": { "version": "4.2.0", @@ -2575,9 +2609,10 @@ } }, "node_modules/send": { - "version": "0.18.0", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "dev": true, - "license": "MIT", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -2597,10 +2632,20 @@ "node": ">= 0.8.0" } }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/send/node_modules/ms": { "version": "2.1.3", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true }, "node_modules/serialize-javascript": { "version": "6.0.2", @@ -2668,14 +2713,15 @@ } }, "node_modules/serve-static": { - "version": "1.15.0", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "dev": true, - "license": "MIT", "dependencies": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" + "send": "0.19.0" }, "engines": { "node": ">= 0.8.0" @@ -2683,8 +2729,9 @@ }, "node_modules/set-function-length": { "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, - "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -2699,8 +2746,9 @@ }, "node_modules/setprototypeof": { "version": "1.2.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true }, "node_modules/shallow-clone": { "version": "3.0.1", @@ -2742,8 +2790,9 @@ }, "node_modules/side-channel": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -2867,8 +2916,9 @@ }, "node_modules/statuses": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -3038,8 +3088,9 @@ }, "node_modules/toidentifier": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.6" } @@ -3066,8 +3117,9 @@ }, "node_modules/type-is": { "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, - "license": "MIT", "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -3094,8 +3146,9 @@ }, "node_modules/unpipe": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8" } diff --git a/mithril-client-wasm/www/package-lock.json b/mithril-client-wasm/www/package-lock.json index 94be6ec73e5..1cd84288bc5 100644 --- a/mithril-client-wasm/www/package-lock.json +++ b/mithril-client-wasm/www/package-lock.json @@ -644,9 +644,10 @@ } }, "node_modules/body-parser": { - "version": "1.20.2", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "dev": true, - "license": "MIT", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", @@ -656,7 +657,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.11.0", + "qs": "6.13.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -668,8 +669,9 @@ }, "node_modules/body-parser/node_modules/bytes": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -754,8 +756,9 @@ }, "node_modules/call-bind": { "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, - "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -908,8 +911,9 @@ }, "node_modules/content-type": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -1005,8 +1009,9 @@ }, "node_modules/define-data-property": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, - "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -1032,16 +1037,18 @@ }, "node_modules/depd": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/destroy": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" @@ -1074,9 +1081,10 @@ "license": "ISC" }, "node_modules/encodeurl": { - "version": "1.0.2", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -1106,8 +1114,9 @@ }, "node_modules/es-define-property": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", "dev": true, - "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.4" }, @@ -1117,8 +1126,9 @@ }, "node_modules/es-errors": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" } @@ -1182,8 +1192,9 @@ }, "node_modules/etag": { "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -1202,36 +1213,37 @@ } }, "node_modules/express": { - "version": "4.19.2", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", + "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", "dev": true, - "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.2", + "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.6.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.2.0", + "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", + "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", + "path-to-regexp": "0.1.10", "proxy-addr": "~2.0.7", - "qs": "6.11.0", + "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", + "send": "0.19.0", + "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -1317,12 +1329,13 @@ } }, "node_modules/finalhandler": { - "version": "1.2.0", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "dev": true, - "license": "MIT", "dependencies": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", @@ -1382,8 +1395,9 @@ }, "node_modules/fresh": { "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -1398,8 +1412,9 @@ }, "node_modules/get-intrinsic": { "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, - "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", @@ -1451,8 +1466,9 @@ }, "node_modules/gopd": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dev": true, - "license": "MIT", "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -1480,8 +1496,9 @@ }, "node_modules/has-property-descriptors": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, - "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" }, @@ -1491,8 +1508,9 @@ }, "node_modules/has-proto": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -1502,8 +1520,9 @@ }, "node_modules/has-symbols": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -1582,8 +1601,9 @@ }, "node_modules/http-errors": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dev": true, - "license": "MIT", "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -1646,8 +1666,9 @@ }, "node_modules/iconv-lite": { "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, - "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -1911,8 +1932,9 @@ }, "node_modules/media-typer": { "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -1936,9 +1958,13 @@ } }, "node_modules/merge-descriptors": { - "version": "1.0.1", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", "dev": true, - "license": "MIT" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/merge-stream": { "version": "2.0.0", @@ -1962,9 +1988,10 @@ } }, "node_modules/micromatch": { - "version": "4.0.7", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, - "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -1975,8 +2002,9 @@ }, "node_modules/mime": { "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true, - "license": "MIT", "bin": { "mime": "cli.js" }, @@ -2061,8 +2089,9 @@ }, "node_modules/object-inspect": { "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -2190,9 +2219,10 @@ "license": "MIT" }, "node_modules/path-to-regexp": { - "version": "0.1.7", - "dev": true, - "license": "MIT" + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", + "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", + "dev": true }, "node_modules/path-type": { "version": "5.0.0", @@ -2280,11 +2310,12 @@ } }, "node_modules/qs": { - "version": "6.11.0", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" }, "engines": { "node": ">=0.6" @@ -2330,8 +2361,9 @@ }, "node_modules/raw-body": { "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dev": true, - "license": "MIT", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -2344,8 +2376,9 @@ }, "node_modules/raw-body/node_modules/bytes": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -2504,8 +2537,9 @@ }, "node_modules/safer-buffer": { "version": "2.1.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true }, "node_modules/schema-utils": { "version": "4.2.0", @@ -2543,9 +2577,10 @@ } }, "node_modules/send": { - "version": "0.18.0", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "dev": true, - "license": "MIT", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -2565,10 +2600,20 @@ "node": ">= 0.8.0" } }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/send/node_modules/ms": { "version": "2.1.3", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true }, "node_modules/serialize-javascript": { "version": "6.0.2", @@ -2636,14 +2681,15 @@ } }, "node_modules/serve-static": { - "version": "1.15.0", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "dev": true, - "license": "MIT", "dependencies": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" + "send": "0.19.0" }, "engines": { "node": ">= 0.8.0" @@ -2651,8 +2697,9 @@ }, "node_modules/set-function-length": { "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, - "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -2667,8 +2714,9 @@ }, "node_modules/setprototypeof": { "version": "1.2.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true }, "node_modules/shallow-clone": { "version": "3.0.1", @@ -2710,8 +2758,9 @@ }, "node_modules/side-channel": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -2835,8 +2884,9 @@ }, "node_modules/statuses": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -3006,8 +3056,9 @@ }, "node_modules/toidentifier": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.6" } @@ -3034,8 +3085,9 @@ }, "node_modules/type-is": { "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, - "license": "MIT", "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -3062,8 +3114,9 @@ }, "node_modules/unpipe": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8" } From ec92c48967e01569404e99ee97900dba99670978 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Mon, 23 Sep 2024 17:53:02 +0200 Subject: [PATCH 010/274] chore: bump mithril client wasm 'www' and 'www-test' dependencies By running: - 'make www-install' command in 'mithril-client-wasm'. - 'make www-test-install' command in 'mithril-client-wasm'. - 'make install' command in 'mithril-explorer'. - 'make install' command in 'docs/website'. --- docs/website/package-lock.json | 4 ++-- docs/website/package.json | 2 +- mithril-client-wasm/www-test/package-lock.json | 6 +++--- mithril-client-wasm/www-test/package.json | 2 +- mithril-client-wasm/www/package-lock.json | 6 +++--- mithril-client-wasm/www/package.json | 2 +- mithril-explorer/package-lock.json | 4 ++-- mithril-explorer/package.json | 2 +- 8 files changed, 14 insertions(+), 14 deletions(-) diff --git a/docs/website/package-lock.json b/docs/website/package-lock.json index 56a3392a6a9..b18fe8f0272 100644 --- a/docs/website/package-lock.json +++ b/docs/website/package-lock.json @@ -1,12 +1,12 @@ { "name": "mithril-doc", - "version": "0.1.41", + "version": "0.1.42", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "mithril-doc", - "version": "0.1.41", + "version": "0.1.42", "dependencies": { "@docusaurus/core": "^3.5.2", "@docusaurus/preset-classic": "^3.5.2", diff --git a/docs/website/package.json b/docs/website/package.json index cf2c5e55d15..01d46b1ff2a 100644 --- a/docs/website/package.json +++ b/docs/website/package.json @@ -1,6 +1,6 @@ { "name": "mithril-doc", - "version": "0.1.41", + "version": "0.1.42", "private": true, "scripts": { "docusaurus": "docusaurus", diff --git a/mithril-client-wasm/www-test/package-lock.json b/mithril-client-wasm/www-test/package-lock.json index 82fa94b9ada..97b208fa12e 100644 --- a/mithril-client-wasm/www-test/package-lock.json +++ b/mithril-client-wasm/www-test/package-lock.json @@ -1,12 +1,12 @@ { "name": "www-test", - "version": "0.2.1", + "version": "0.2.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "www-test", - "version": "0.2.1", + "version": "0.2.2", "dependencies": { "@mithril-dev/mithril-client-wasm": "file:../pkg" }, @@ -21,7 +21,7 @@ }, "../pkg": { "name": "mithril-client-wasm", - "version": "0.4.1", + "version": "0.4.2", "license": "Apache-2.0" }, "node_modules/@discoveryjs/json-ext": { diff --git a/mithril-client-wasm/www-test/package.json b/mithril-client-wasm/www-test/package.json index bba72ca9c33..15de64f3095 100644 --- a/mithril-client-wasm/www-test/package.json +++ b/mithril-client-wasm/www-test/package.json @@ -1,6 +1,6 @@ { "name": "www-test", - "version": "0.2.1", + "version": "0.2.2", "private": true, "scripts": { "build": "webpack --config webpack.config.js", diff --git a/mithril-client-wasm/www/package-lock.json b/mithril-client-wasm/www/package-lock.json index 1cd84288bc5..ae0bba6aa40 100644 --- a/mithril-client-wasm/www/package-lock.json +++ b/mithril-client-wasm/www/package-lock.json @@ -1,12 +1,12 @@ { "name": "www", - "version": "0.2.1", + "version": "0.2.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "www", - "version": "0.2.1", + "version": "0.2.2", "dependencies": { "@mithril-dev/mithril-client-wasm": "file:../pkg" }, @@ -20,7 +20,7 @@ }, "../pkg": { "name": "mithril-client-wasm", - "version": "0.4.1", + "version": "0.4.2", "license": "Apache-2.0" }, "node_modules/@discoveryjs/json-ext": { diff --git a/mithril-client-wasm/www/package.json b/mithril-client-wasm/www/package.json index b624a4ee5af..b583aaae576 100644 --- a/mithril-client-wasm/www/package.json +++ b/mithril-client-wasm/www/package.json @@ -1,6 +1,6 @@ { "name": "www", - "version": "0.2.1", + "version": "0.2.2", "private": true, "scripts": { "build": "webpack --config webpack.config.js", diff --git a/mithril-explorer/package-lock.json b/mithril-explorer/package-lock.json index cf1caa68868..26d6c94d6d8 100644 --- a/mithril-explorer/package-lock.json +++ b/mithril-explorer/package-lock.json @@ -1,12 +1,12 @@ { "name": "mithril-explorer", - "version": "0.7.7", + "version": "0.7.8", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "mithril-explorer", - "version": "0.7.7", + "version": "0.7.8", "dependencies": { "@mithril-dev/mithril-client-wasm": "file:../mithril-client-wasm/pkg", "@popperjs/core": "^2.11.8", diff --git a/mithril-explorer/package.json b/mithril-explorer/package.json index a0dd244558b..141e178d9ae 100644 --- a/mithril-explorer/package.json +++ b/mithril-explorer/package.json @@ -1,6 +1,6 @@ { "name": "mithril-explorer", - "version": "0.7.7", + "version": "0.7.8", "private": true, "scripts": { "dev": "next dev", From 2b37187d842597a5b5258fd566d27c4f6e506e6c Mon Sep 17 00:00:00 2001 From: Damien Lachaume <135982616+dlachaume@users.noreply.github.com> Date: Mon, 23 Sep 2024 14:34:04 +0200 Subject: [PATCH 011/274] refactor: move `EpochSettings` to Signer and rename it `SignerEpochSettings` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Sébastien Fauvel --- mithril-common/src/entities/epoch_settings.rs | 28 -------- mithril-common/src/entities/mod.rs | 2 - mithril-common/src/test_utils/fake_data.rs | 32 ---------- mithril-signer/src/entities/mod.rs | 7 ++ .../src/entities/signer_epoch_settings.rs | 64 +++++++++++++++++++ mithril-signer/src/lib.rs | 2 + .../message_adapters/from_epoch_settings.rs | 11 ++-- mithril-signer/src/runtime/runner.rs | 27 ++++---- mithril-signer/src/runtime/state_machine.rs | 16 ++--- .../src/services/aggregator_client.rs | 19 +++--- mithril-signer/src/services/epoch_service.rs | 21 +++--- .../test_extensions/certificate_handler.rs | 9 +-- 12 files changed, 127 insertions(+), 111 deletions(-) delete mode 100644 mithril-common/src/entities/epoch_settings.rs create mode 100644 mithril-signer/src/entities/mod.rs create mode 100644 mithril-signer/src/entities/signer_epoch_settings.rs diff --git a/mithril-common/src/entities/epoch_settings.rs b/mithril-common/src/entities/epoch_settings.rs deleted file mode 100644 index b46e7c80137..00000000000 --- a/mithril-common/src/entities/epoch_settings.rs +++ /dev/null @@ -1,28 +0,0 @@ -use crate::entities::{CardanoTransactionsSigningConfig, Epoch, ProtocolParameters}; - -use super::Signer; - -/// EpochSettings represents the settings of an epoch -#[derive(Clone, Debug, PartialEq, Default)] -pub struct EpochSettings { - /// Current Epoch - pub epoch: Epoch, - - /// Current Protocol parameters - pub protocol_parameters: ProtocolParameters, - - /// Next Protocol parameters - pub next_protocol_parameters: ProtocolParameters, - - /// Current Signers - pub current_signers: Vec, - - /// Signers that will be able to sign on the next epoch - pub next_signers: Vec, - - /// Cardano transactions signing configuration for the current epoch - pub cardano_transactions_signing_config: Option, - - /// Cardano transactions signing configuration for the next epoch - pub next_cardano_transactions_signing_config: Option, -} diff --git a/mithril-common/src/entities/mod.rs b/mithril-common/src/entities/mod.rs index a44a8831abe..a8dbfc24c57 100644 --- a/mithril-common/src/entities/mod.rs +++ b/mithril-common/src/entities/mod.rs @@ -14,7 +14,6 @@ mod certificate; mod certificate_metadata; mod certificate_pending; mod epoch; -mod epoch_settings; mod http_server_error; mod mithril_stake_distribution; mod protocol_message; @@ -42,7 +41,6 @@ pub use certificate::{Certificate, CertificateSignature}; pub use certificate_metadata::{CertificateMetadata, StakeDistributionParty}; pub use certificate_pending::CertificatePending; pub use epoch::{Epoch, EpochError}; -pub use epoch_settings::EpochSettings; pub use http_server_error::{ClientError, ServerError}; pub use mithril_stake_distribution::MithrilStakeDistribution; pub use protocol_message::{ProtocolMessage, ProtocolMessagePartKey, ProtocolMessagePartValue}; diff --git a/mithril-common/src/test_utils/fake_data.rs b/mithril-common/src/test_utils/fake_data.rs index a4a409c1c9c..6d9e6f7e572 100644 --- a/mithril-common/src/test_utils/fake_data.rs +++ b/mithril-common/src/test_utils/fake_data.rs @@ -52,38 +52,6 @@ pub fn protocol_parameters() -> entities::ProtocolParameters { entities::ProtocolParameters::new(k, m, phi_f) } -/// Fake EpochSettings -pub fn epoch_settings() -> entities::EpochSettings { - // Beacon - let beacon = beacon(); - - // Protocol parameters - let protocol_parameters = protocol_parameters(); - let next_protocol_parameters = protocol_parameters.clone(); - - // Signers - let signers = signers(5); - let current_signers = signers[1..3].to_vec(); - let next_signers = signers[2..5].to_vec(); - - // Cardano transactions signing configuration - let cardano_transactions_signing_config = - Some(entities::CardanoTransactionsSigningConfig::dummy()); - let next_cardano_transactions_signing_config = - Some(entities::CardanoTransactionsSigningConfig::dummy()); - - // Epoch settings - entities::EpochSettings { - epoch: beacon.epoch, - protocol_parameters, - next_protocol_parameters, - current_signers, - next_signers, - cardano_transactions_signing_config, - next_cardano_transactions_signing_config, - } -} - /// Fake CertificatePending pub fn certificate_pending() -> entities::CertificatePending { // Epoch diff --git a/mithril-signer/src/entities/mod.rs b/mithril-signer/src/entities/mod.rs new file mode 100644 index 00000000000..b807cde846f --- /dev/null +++ b/mithril-signer/src/entities/mod.rs @@ -0,0 +1,7 @@ +//! Entities module +//! +//! This module provide domain entities for the services & state machine. + +mod signer_epoch_settings; + +pub use signer_epoch_settings::*; diff --git a/mithril-signer/src/entities/signer_epoch_settings.rs b/mithril-signer/src/entities/signer_epoch_settings.rs new file mode 100644 index 00000000000..faa1208c237 --- /dev/null +++ b/mithril-signer/src/entities/signer_epoch_settings.rs @@ -0,0 +1,64 @@ +use mithril_common::entities::{ + CardanoTransactionsSigningConfig, Epoch, ProtocolParameters, Signer, +}; + +/// SignerEpochSettings represents the settings of an epoch +#[derive(Clone, Debug, PartialEq, Default)] +pub struct SignerEpochSettings { + /// Current Epoch + pub epoch: Epoch, + + /// Current Protocol parameters + pub protocol_parameters: ProtocolParameters, + + /// Next Protocol parameters + pub next_protocol_parameters: ProtocolParameters, + + /// Current Signers + pub current_signers: Vec, + + /// Signers that will be able to sign on the next epoch + pub next_signers: Vec, + + /// Cardano transactions signing configuration for the current epoch + pub cardano_transactions_signing_config: Option, + + /// Cardano transactions signing configuration for the next epoch + pub next_cardano_transactions_signing_config: Option, +} + +impl SignerEpochSettings { + #[cfg(test)] + /// Create a dummy SignerEpochSettings + pub fn dummy() -> SignerEpochSettings { + use mithril_common::test_utils::fake_data; + + // Beacon + let beacon = fake_data::beacon(); + + // Protocol parameters + let protocol_parameters = fake_data::protocol_parameters(); + let next_protocol_parameters = protocol_parameters.clone(); + + // Signers + let signers = fake_data::signers(5); + let current_signers = signers[1..3].to_vec(); + let next_signers = signers[2..5].to_vec(); + + // Cardano transactions signing configuration + let cardano_transactions_signing_config = Some(CardanoTransactionsSigningConfig::dummy()); + let next_cardano_transactions_signing_config = + Some(CardanoTransactionsSigningConfig::dummy()); + + // Signer Epoch settings + SignerEpochSettings { + epoch: beacon.epoch, + protocol_parameters, + next_protocol_parameters, + current_signers, + next_signers, + cardano_transactions_signing_config, + next_cardano_transactions_signing_config, + } + } +} diff --git a/mithril-signer/src/lib.rs b/mithril-signer/src/lib.rs index f68b90916f5..c5df36df3b3 100644 --- a/mithril-signer/src/lib.rs +++ b/mithril-signer/src/lib.rs @@ -9,6 +9,7 @@ mod configuration; pub mod database; pub mod dependency_injection; +pub mod entities; mod message_adapters; pub mod metrics; mod runtime; @@ -16,6 +17,7 @@ pub mod services; pub mod store; pub use configuration::{Configuration, DefaultConfiguration}; +pub use entities::SignerEpochSettings; pub use message_adapters::{ FromEpochSettingsAdapter, FromPendingCertificateMessageAdapter, ToRegisterSignerMessageAdapter, }; diff --git a/mithril-signer/src/message_adapters/from_epoch_settings.rs b/mithril-signer/src/message_adapters/from_epoch_settings.rs index 5e04f973e20..57746a1f40a 100644 --- a/mithril-signer/src/message_adapters/from_epoch_settings.rs +++ b/mithril-signer/src/message_adapters/from_epoch_settings.rs @@ -1,17 +1,18 @@ use anyhow::Context; use mithril_common::{ - entities::EpochSettings, messages::{EpochSettingsMessage, SignerMessagePart, TryFromMessageAdapter}, StdResult, }; -/// Adapter to convert [EpochSettingsMessage] to [EpochSettings]. +use crate::entities::SignerEpochSettings; + +/// Adapter to convert [EpochSettingsMessage] to [SignerEpochSettings]. pub struct FromEpochSettingsAdapter; -impl TryFromMessageAdapter for FromEpochSettingsAdapter { +impl TryFromMessageAdapter for FromEpochSettingsAdapter { /// Method to convert. - fn try_adapt(message: EpochSettingsMessage) -> StdResult { - let epoch_settings = EpochSettings { + fn try_adapt(message: EpochSettingsMessage) -> StdResult { + let epoch_settings = SignerEpochSettings { epoch: message.epoch, protocol_parameters: message.protocol_parameters, next_protocol_parameters: message.next_protocol_parameters, diff --git a/mithril-signer/src/runtime/runner.rs b/mithril-signer/src/runtime/runner.rs index 2927a1b8378..724ea69bd5f 100644 --- a/mithril-signer/src/runtime/runner.rs +++ b/mithril-signer/src/runtime/runner.rs @@ -6,13 +6,14 @@ use tokio::sync::RwLockReadGuard; use mithril_common::crypto_helper::{KESPeriod, OpCert, ProtocolOpCert, SerDeShelleyFileFormat}; use mithril_common::entities::{ - CertificatePending, Epoch, EpochSettings, PartyId, ProtocolMessage, ProtocolMessagePartKey, - SignedEntityType, Signer, SignerWithStake, SingleSignatures, TimePoint, + CertificatePending, Epoch, PartyId, ProtocolMessage, ProtocolMessagePartKey, SignedEntityType, + Signer, SignerWithStake, SingleSignatures, TimePoint, }; use mithril_common::StdResult; use mithril_persistence::store::StakeStorer; use crate::dependency_injection::SignerDependencyContainer; +use crate::entities::SignerEpochSettings; use crate::services::{EpochService, MithrilProtocolInitializerBuilder}; use crate::Configuration; @@ -20,7 +21,7 @@ use crate::Configuration; #[async_trait] pub trait Runner: Send + Sync { /// Fetch the current epoch settings if any. - async fn get_epoch_settings(&self) -> StdResult>; + async fn get_epoch_settings(&self) -> StdResult>; /// Fetch the current pending certificate if any. async fn get_pending_certificate(&self) -> StdResult>; @@ -41,7 +42,7 @@ pub trait Runner: Send + Sync { async fn can_sign_signed_entity_type(&self, signed_entity_type: &SignedEntityType) -> bool; /// Register epoch information - async fn inform_epoch_settings(&self, epoch_settings: EpochSettings) -> StdResult<()>; + async fn inform_epoch_settings(&self, epoch_settings: SignerEpochSettings) -> StdResult<()>; /// Create the message to be signed with the single signature. async fn compute_message( @@ -122,7 +123,7 @@ impl SignerRunner { #[cfg_attr(test, mockall::automock)] #[async_trait] impl Runner for SignerRunner { - async fn get_epoch_settings(&self) -> StdResult> { + async fn get_epoch_settings(&self) -> StdResult> { debug!("RUNNER: get_epoch_settings"); self.services @@ -295,7 +296,7 @@ impl Runner for SignerRunner { } } - async fn inform_epoch_settings(&self, epoch_settings: EpochSettings) -> StdResult<()> { + async fn inform_epoch_settings(&self, epoch_settings: SignerEpochSettings) -> StdResult<()> { debug!("RUNNER: register_epoch"); self.services .epoch_service @@ -527,7 +528,7 @@ mod tests { #[async_trait] impl EpochService for FakeEpochServiceImpl { - fn inform_epoch_settings(&mut self, _epoch_settings: EpochSettings) -> StdResult<()> { + fn inform_epoch_settings(&mut self, _epoch_settings: SignerEpochSettings) -> StdResult<()> { Ok(()) } fn epoch_of_current_data(&self) -> StdResult { @@ -759,11 +760,11 @@ mod tests { let runner = init_runner(Some(services), None).await; // inform epoch settings - let epoch_settings = EpochSettings { + let epoch_settings = SignerEpochSettings { epoch: current_epoch, current_signers: fixture.signers(), next_signers: fixture.signers(), - ..fake_data::epoch_settings().clone() + ..SignerEpochSettings::dummy().clone() }; runner.inform_epoch_settings(epoch_settings).await.unwrap(); @@ -965,11 +966,11 @@ mod tests { let runner = init_runner(Some(services), None).await; // inform epoch settings - let epoch_settings = EpochSettings { + let epoch_settings = SignerEpochSettings { epoch: current_time_point.epoch, current_signers: fixture.signers(), next_signers: next_signers.to_vec(), - ..fake_data::epoch_settings().clone() + ..SignerEpochSettings::dummy().clone() }; runner.inform_epoch_settings(epoch_settings).await.unwrap(); @@ -1040,11 +1041,11 @@ mod tests { let runner = init_runner(Some(services), None).await; // inform epoch settings - let epoch_settings = EpochSettings { + let epoch_settings = SignerEpochSettings { epoch: current_time_point.epoch, current_signers: signers.to_vec(), next_signers: fixture.signers(), - ..fake_data::epoch_settings().clone() + ..SignerEpochSettings::dummy().clone() }; runner.inform_epoch_settings(epoch_settings).await.unwrap(); diff --git a/mithril-signer/src/runtime/state_machine.rs b/mithril-signer/src/runtime/state_machine.rs index 7e3147260c6..c6d58580123 100644 --- a/mithril-signer/src/runtime/state_machine.rs +++ b/mithril-signer/src/runtime/state_machine.rs @@ -4,10 +4,10 @@ use tokio::{sync::Mutex, time::sleep}; use mithril_common::{ crypto_helper::ProtocolInitializerError, - entities::{CertificatePending, Epoch, EpochSettings, SignedEntityType, TimePoint}, + entities::{CertificatePending, Epoch, SignedEntityType, TimePoint}, }; -use crate::MetricsService; +use crate::{entities::SignerEpochSettings, MetricsService}; use super::{Runner, RuntimeError}; @@ -324,7 +324,7 @@ impl StateMachine { /// Launch the transition process from the `Unregistered` to `ReadyToSign` or `RegisteredNotAbleToSign` state. async fn transition_from_unregistered_to_one_of_registered_states( &self, - epoch_settings: EpochSettings, + epoch_settings: SignerEpochSettings, ) -> Result { self.metrics_service .signer_registration_total_since_startup_counter_increment(); @@ -542,7 +542,7 @@ mod tests { #[tokio::test] async fn unregistered_epoch_settings_behind_known_epoch() { let mut runner = MockSignerRunner::new(); - let epoch_settings = EpochSettings { + let epoch_settings = SignerEpochSettings { epoch: Epoch(3), protocol_parameters: fake_data::protocol_parameters(), next_protocol_parameters: fake_data::protocol_parameters(), @@ -582,11 +582,11 @@ mod tests { runner .expect_get_epoch_settings() .once() - .returning(|| Ok(Some(fake_data::epoch_settings()))); + .returning(|| Ok(Some(SignerEpochSettings::dummy()))); runner .expect_inform_epoch_settings() - .with(predicate::eq(fake_data::epoch_settings())) + .with(predicate::eq(SignerEpochSettings::dummy())) .once() .returning(|_| Ok(())); @@ -636,11 +636,11 @@ mod tests { runner .expect_get_epoch_settings() .once() - .returning(|| Ok(Some(fake_data::epoch_settings()))); + .returning(|| Ok(Some(SignerEpochSettings::dummy()))); runner .expect_inform_epoch_settings() - .with(predicate::eq(fake_data::epoch_settings())) + .with(predicate::eq(SignerEpochSettings::dummy())) .once() .returning(|_| Ok(())); diff --git a/mithril-signer/src/services/aggregator_client.rs b/mithril-signer/src/services/aggregator_client.rs index e004bbc356d..e7e9d55bc64 100644 --- a/mithril-signer/src/services/aggregator_client.rs +++ b/mithril-signer/src/services/aggregator_client.rs @@ -8,8 +8,7 @@ use thiserror::Error; use mithril_common::{ api_version::APIVersionProvider, entities::{ - CertificatePending, Epoch, EpochSettings, ProtocolMessage, SignedEntityType, Signer, - SingleSignatures, + CertificatePending, Epoch, ProtocolMessage, SignedEntityType, Signer, SingleSignatures, }, messages::{ AggregatorFeaturesMessage, CertificatePendingMessage, EpochSettingsMessage, @@ -18,6 +17,7 @@ use mithril_common::{ StdError, MITHRIL_API_VERSION_HEADER, MITHRIL_SIGNER_VERSION_HEADER, }; +use crate::entities::SignerEpochSettings; use crate::message_adapters::{ FromEpochSettingsAdapter, FromPendingCertificateMessageAdapter, ToRegisterSignatureMessageAdapter, ToRegisterSignerMessageAdapter, @@ -76,8 +76,9 @@ impl AggregatorClientError { #[async_trait] pub trait AggregatorClient: Sync + Send { /// Retrieves epoch settings from the aggregator - async fn retrieve_epoch_settings(&self) - -> Result, AggregatorClientError>; + async fn retrieve_epoch_settings( + &self, + ) -> Result, AggregatorClientError>; /// Retrieves a pending certificate from the aggregator async fn retrieve_pending_certificate( @@ -185,7 +186,7 @@ impl AggregatorHTTPClient { impl AggregatorClient for AggregatorHTTPClient { async fn retrieve_epoch_settings( &self, - ) -> Result, AggregatorClientError> { + ) -> Result, AggregatorClientError> { debug!("Retrieve epoch settings"); let url = format!("{}/epoch-settings", self.aggregator_endpoint); let response = self @@ -351,7 +352,7 @@ pub(crate) mod dumb { /// It actually does not communicate with an aggregator host but mimics this behavior. /// It is driven by a Tester that controls the CertificatePending it can return and it can return its internal state for testing. pub struct DumbAggregatorClient { - epoch_settings: RwLock>, + epoch_settings: RwLock>, certificate_pending: RwLock>, last_registered_signer: RwLock>, } @@ -367,7 +368,7 @@ pub(crate) mod dumb { } /// this method pilots the epoch settings handler - pub async fn set_epoch_settings(&self, epoch_settings: Option) { + pub async fn set_epoch_settings(&self, epoch_settings: Option) { let mut epoch_settings_writer = self.epoch_settings.write().await; *epoch_settings_writer = epoch_settings; } @@ -393,7 +394,7 @@ pub(crate) mod dumb { impl Default for DumbAggregatorClient { fn default() -> Self { Self { - epoch_settings: RwLock::new(Some(fake_data::epoch_settings())), + epoch_settings: RwLock::new(Some(SignerEpochSettings::dummy())), certificate_pending: RwLock::new(Some(fake_data::certificate_pending())), last_registered_signer: RwLock::new(None), } @@ -404,7 +405,7 @@ pub(crate) mod dumb { impl AggregatorClient for DumbAggregatorClient { async fn retrieve_epoch_settings( &self, - ) -> Result, AggregatorClientError> { + ) -> Result, AggregatorClientError> { let epoch_settings = self.epoch_settings.read().await.clone(); Ok(epoch_settings) diff --git a/mithril-signer/src/services/epoch_service.rs b/mithril-signer/src/services/epoch_service.rs index efa9a9fe856..ffb94d5ebcc 100644 --- a/mithril-signer/src/services/epoch_service.rs +++ b/mithril-signer/src/services/epoch_service.rs @@ -11,10 +11,10 @@ use mithril_persistence::store::StakeStorer; use slog_scope::{debug, trace}; use thiserror::Error; -use mithril_common::entities::EpochSettings; use mithril_common::entities::SignerWithStake; use mithril_common::StdResult; +use crate::entities::SignerEpochSettings; use crate::RunnerError; /// Errors dedicated to the EpochService. @@ -30,7 +30,7 @@ pub enum EpochServiceError { pub trait EpochService: Sync + Send { /// Inform the service a new epoch has been detected, telling it to update its /// internal state for the new epoch. - fn inform_epoch_settings(&mut self, epoch_settings: EpochSettings) -> StdResult<()>; + fn inform_epoch_settings(&mut self, epoch_settings: SignerEpochSettings) -> StdResult<()>; /// Get the current epoch for which the data stored in this service are computed. fn epoch_of_current_data(&self) -> StdResult; @@ -140,7 +140,7 @@ impl MithrilEpochService { #[async_trait] impl EpochService for MithrilEpochService { - fn inform_epoch_settings(&mut self, epoch_settings: EpochSettings) -> StdResult<()> { + fn inform_epoch_settings(&mut self, epoch_settings: SignerEpochSettings) -> StdResult<()> { debug!( "EpochService: register_epoch_settings: {:?}", epoch_settings @@ -221,12 +221,13 @@ impl EpochService for MithrilEpochService { mod tests { use std::sync::Arc; + use crate::entities::SignerEpochSettings; use crate::services::MithrilProtocolInitializerBuilder; use super::*; use mithril_common::{ - entities::{Epoch, EpochSettings, StakeDistribution}, + entities::{Epoch, StakeDistribution}, test_utils::{ fake_data::{self}, MithrilFixtureBuilder, @@ -266,10 +267,10 @@ mod tests { let epoch = Epoch(12); let signers = fixtures.signers(); let stake_store = Arc::new(StakeStore::new(Box::new(DumbStoreAdapter::new()), None)); - let epoch_settings = EpochSettings { + let epoch_settings = SignerEpochSettings { epoch, current_signers: signers[..5].to_vec(), - ..fake_data::epoch_settings().clone() + ..SignerEpochSettings::dummy().clone() }; let mut service = MithrilEpochService::new(stake_store); @@ -344,11 +345,11 @@ mod tests { let stake_store = Arc::new(StakeStore::new(Box::new(DumbStoreAdapter::new()), None)); // Epoch settings - let epoch_settings = EpochSettings { + let epoch_settings = SignerEpochSettings { epoch, current_signers: signers[2..5].to_vec(), next_signers: signers[3..7].to_vec(), - ..fake_data::epoch_settings().clone() + ..SignerEpochSettings::dummy().clone() }; // Build service and register epoch settings @@ -428,11 +429,11 @@ mod tests { )); // Epoch settings - let epoch_settings = EpochSettings { + let epoch_settings = SignerEpochSettings { epoch, current_signers: signers[2..5].to_vec(), next_signers: signers[3..7].to_vec(), - ..fake_data::epoch_settings().clone() + ..SignerEpochSettings::dummy().clone() }; // Build service and register epoch settings diff --git a/mithril-signer/tests/test_extensions/certificate_handler.rs b/mithril-signer/tests/test_extensions/certificate_handler.rs index 4d6864cdcb1..6e24549e48c 100644 --- a/mithril-signer/tests/test_extensions/certificate_handler.rs +++ b/mithril-signer/tests/test_extensions/certificate_handler.rs @@ -4,13 +4,14 @@ use anyhow::anyhow; use async_trait::async_trait; use mithril_common::{ entities::{ - CertificatePending, Epoch, EpochSettings, ProtocolMessage, SignedEntityConfig, - SignedEntityType, SignedEntityTypeDiscriminants, Signer, SingleSignatures, TimePoint, + CertificatePending, Epoch, ProtocolMessage, SignedEntityConfig, SignedEntityType, + SignedEntityTypeDiscriminants, Signer, SingleSignatures, TimePoint, }, messages::AggregatorFeaturesMessage, test_utils::fake_data, MithrilTickerService, TickerService, }; +use mithril_signer::entities::SignerEpochSettings; use mithril_signer::services::{AggregatorClient, AggregatorClientError}; use tokio::sync::RwLock; @@ -94,7 +95,7 @@ impl FakeAggregator { impl AggregatorClient for FakeAggregator { async fn retrieve_epoch_settings( &self, - ) -> Result, AggregatorClientError> { + ) -> Result, AggregatorClientError> { if *self.withhold_epoch_settings.read().await { Ok(None) } else { @@ -103,7 +104,7 @@ impl AggregatorClient for FakeAggregator { let current_signers = self.get_current_signers(&store).await?; let next_signers = self.get_next_signers(&store).await?; - Ok(Some(EpochSettings { + Ok(Some(SignerEpochSettings { epoch: time_point.epoch, current_signers, next_signers, From ce18d43f21f6db9def8bfa45e623b4b7326703b1 Mon Sep 17 00:00:00 2001 From: Damien Lachaume <135982616+dlachaume@users.noreply.github.com> Date: Mon, 23 Sep 2024 17:09:47 +0200 Subject: [PATCH 012/274] refactor: rename singular `EpochSetting` occurrences with plural `EpochSettings` --- .../src/database/query/epoch_setting/mod.rs | 7 ----- .../delete_epoch_settings.rs} | 26 +++++++++---------- .../get_epoch_settings.rs} | 22 ++++++++-------- .../src/database/query/epoch_settings/mod.rs | 7 +++++ .../update_epoch_settings.rs} | 22 ++++++++-------- mithril-aggregator/src/database/query/mod.rs | 4 +-- .../src/database/record/epoch_setting.rs | 4 +-- ...tting_store.rs => epoch_settings_store.rs} | 20 +++++++------- .../src/database/repository/mod.rs | 4 +-- .../src/database/test_helper.rs | 4 +-- .../src/dependency_injection/builder.rs | 4 +-- 11 files changed, 62 insertions(+), 62 deletions(-) delete mode 100644 mithril-aggregator/src/database/query/epoch_setting/mod.rs rename mithril-aggregator/src/database/query/{epoch_setting/delete_epoch_setting.rs => epoch_settings/delete_epoch_settings.rs} (77%) rename mithril-aggregator/src/database/query/{epoch_setting/get_epoch_setting.rs => epoch_settings/get_epoch_settings.rs} (76%) create mode 100644 mithril-aggregator/src/database/query/epoch_settings/mod.rs rename mithril-aggregator/src/database/query/{epoch_setting/update_epoch_setting.rs => epoch_settings/update_epoch_settings.rs} (80%) rename mithril-aggregator/src/database/repository/{epoch_setting_store.rs => epoch_settings_store.rs} (86%) diff --git a/mithril-aggregator/src/database/query/epoch_setting/mod.rs b/mithril-aggregator/src/database/query/epoch_setting/mod.rs deleted file mode 100644 index 12a492328a0..00000000000 --- a/mithril-aggregator/src/database/query/epoch_setting/mod.rs +++ /dev/null @@ -1,7 +0,0 @@ -mod delete_epoch_setting; -mod get_epoch_setting; -mod update_epoch_setting; - -pub use delete_epoch_setting::*; -pub use get_epoch_setting::*; -pub use update_epoch_setting::*; diff --git a/mithril-aggregator/src/database/query/epoch_setting/delete_epoch_setting.rs b/mithril-aggregator/src/database/query/epoch_settings/delete_epoch_settings.rs similarity index 77% rename from mithril-aggregator/src/database/query/epoch_setting/delete_epoch_setting.rs rename to mithril-aggregator/src/database/query/epoch_settings/delete_epoch_settings.rs index 6130dc6489d..cab03c6252a 100644 --- a/mithril-aggregator/src/database/query/epoch_setting/delete_epoch_setting.rs +++ b/mithril-aggregator/src/database/query/epoch_settings/delete_epoch_settings.rs @@ -3,15 +3,15 @@ use sqlite::Value; use mithril_common::entities::Epoch; use mithril_persistence::sqlite::{Query, SourceAlias, SqLiteEntity, WhereCondition}; -use crate::database::record::EpochSettingRecord; +use crate::database::record::EpochSettingsRecord; -/// Query to delete old [EpochSettingRecord] from the sqlite database -pub struct DeleteEpochSettingQuery { +/// Query to delete old [EpochSettingsRecord] from the sqlite database +pub struct DeleteEpochSettingsQuery { condition: WhereCondition, } -impl Query for DeleteEpochSettingQuery { - type Entity = EpochSettingRecord; +impl Query for DeleteEpochSettingsQuery { + type Entity = EpochSettingsRecord; fn filters(&self) -> WhereCondition { self.condition.clone() @@ -27,7 +27,7 @@ impl Query for DeleteEpochSettingQuery { } } -impl DeleteEpochSettingQuery { +impl DeleteEpochSettingsQuery { #[cfg(test)] /// Create the SQL condition to delete a record given the Epoch. pub fn by_epoch(epoch: Epoch) -> Self { @@ -50,7 +50,7 @@ impl DeleteEpochSettingQuery { #[cfg(test)] mod tests { - use crate::database::query::GetEpochSettingQuery; + use crate::database::query::GetEpochSettingsQuery; use crate::database::test_helper::{insert_epoch_settings, main_db_connection}; use mithril_persistence::sqlite::ConnectionExtensions; @@ -62,19 +62,19 @@ mod tests { insert_epoch_settings(&connection, &[1, 2]).unwrap(); let cursor = connection - .fetch(DeleteEpochSettingQuery::by_epoch(Epoch(2))) + .fetch(DeleteEpochSettingsQuery::by_epoch(Epoch(2))) .unwrap(); assert_eq!(1, cursor.count()); let cursor = connection - .fetch(GetEpochSettingQuery::by_epoch(Epoch(1)).unwrap()) + .fetch(GetEpochSettingsQuery::by_epoch(Epoch(1)).unwrap()) .unwrap(); assert_eq!(1, cursor.count()); let cursor = connection - .fetch(GetEpochSettingQuery::by_epoch(Epoch(2)).unwrap()) + .fetch(GetEpochSettingsQuery::by_epoch(Epoch(2)).unwrap()) .unwrap(); assert_eq!(0, cursor.count()); @@ -86,19 +86,19 @@ mod tests { insert_epoch_settings(&connection, &[1, 2]).unwrap(); let cursor = connection - .fetch(DeleteEpochSettingQuery::below_epoch_threshold(Epoch(2))) + .fetch(DeleteEpochSettingsQuery::below_epoch_threshold(Epoch(2))) .unwrap(); assert_eq!(1, cursor.count()); let cursor = connection - .fetch(GetEpochSettingQuery::by_epoch(Epoch(1)).unwrap()) + .fetch(GetEpochSettingsQuery::by_epoch(Epoch(1)).unwrap()) .unwrap(); assert_eq!(0, cursor.count()); let cursor = connection - .fetch(GetEpochSettingQuery::by_epoch(Epoch(2)).unwrap()) + .fetch(GetEpochSettingsQuery::by_epoch(Epoch(2)).unwrap()) .unwrap(); assert_eq!(1, cursor.count()); diff --git a/mithril-aggregator/src/database/query/epoch_setting/get_epoch_setting.rs b/mithril-aggregator/src/database/query/epoch_settings/get_epoch_settings.rs similarity index 76% rename from mithril-aggregator/src/database/query/epoch_setting/get_epoch_setting.rs rename to mithril-aggregator/src/database/query/epoch_settings/get_epoch_settings.rs index c7510baf81d..a89b84bea36 100644 --- a/mithril-aggregator/src/database/query/epoch_setting/get_epoch_setting.rs +++ b/mithril-aggregator/src/database/query/epoch_settings/get_epoch_settings.rs @@ -4,14 +4,14 @@ use sqlite::Value; use mithril_common::{entities::Epoch, StdResult}; use mithril_persistence::sqlite::{Query, SourceAlias, SqLiteEntity, WhereCondition}; -use crate::database::record::EpochSettingRecord; +use crate::database::record::EpochSettingsRecord; -/// Simple queries to retrieve [EpochSettingRecord] from the sqlite database. -pub struct GetEpochSettingQuery { +/// Simple queries to retrieve [EpochSettingsRecord] from the sqlite database. +pub struct GetEpochSettingsQuery { condition: WhereCondition, } -impl GetEpochSettingQuery { +impl GetEpochSettingsQuery { pub fn by_epoch(epoch: Epoch) -> StdResult { let epoch_setting_id: i64 = epoch .try_into() @@ -26,8 +26,8 @@ impl GetEpochSettingQuery { } } -impl Query for GetEpochSettingQuery { - type Entity = EpochSettingRecord; +impl Query for GetEpochSettingsQuery { + type Entity = EpochSettingsRecord; fn filters(&self) -> WhereCondition { self.condition.clone() @@ -55,9 +55,9 @@ mod tests { insert_epoch_settings(&connection, &[1, 2, 3]).unwrap(); let epoch_setting_record = connection - .fetch_first(GetEpochSettingQuery::by_epoch(Epoch(1)).unwrap()) + .fetch_first(GetEpochSettingsQuery::by_epoch(Epoch(1)).unwrap()) .unwrap() - .expect("Should have an epoch setting for epoch 1."); + .expect("Should have an epoch settings for epoch 1."); assert_eq!(Epoch(1), epoch_setting_record.epoch_setting_id); assert_eq!( ProtocolParameters::new(1, 2, 1.0), @@ -65,9 +65,9 @@ mod tests { ); let epoch_setting_record = connection - .fetch_first(GetEpochSettingQuery::by_epoch(Epoch(3)).unwrap()) + .fetch_first(GetEpochSettingsQuery::by_epoch(Epoch(3)).unwrap()) .unwrap() - .expect("Should have an epoch setting for epoch 3."); + .expect("Should have an epoch settings for epoch 3."); assert_eq!(Epoch(3), epoch_setting_record.epoch_setting_id); assert_eq!( ProtocolParameters::new(3, 4, 1.0), @@ -75,7 +75,7 @@ mod tests { ); let cursor = connection - .fetch(GetEpochSettingQuery::by_epoch(Epoch(5)).unwrap()) + .fetch(GetEpochSettingsQuery::by_epoch(Epoch(5)).unwrap()) .unwrap(); assert_eq!(0, cursor.count()); } diff --git a/mithril-aggregator/src/database/query/epoch_settings/mod.rs b/mithril-aggregator/src/database/query/epoch_settings/mod.rs new file mode 100644 index 00000000000..8ff7fb12e7d --- /dev/null +++ b/mithril-aggregator/src/database/query/epoch_settings/mod.rs @@ -0,0 +1,7 @@ +mod delete_epoch_settings; +mod get_epoch_settings; +mod update_epoch_settings; + +pub use delete_epoch_settings::*; +pub use get_epoch_settings::*; +pub use update_epoch_settings::*; diff --git a/mithril-aggregator/src/database/query/epoch_setting/update_epoch_setting.rs b/mithril-aggregator/src/database/query/epoch_settings/update_epoch_settings.rs similarity index 80% rename from mithril-aggregator/src/database/query/epoch_setting/update_epoch_setting.rs rename to mithril-aggregator/src/database/query/epoch_settings/update_epoch_settings.rs index 45e6cfccc9e..ccb39e4a6cc 100644 --- a/mithril-aggregator/src/database/query/epoch_setting/update_epoch_setting.rs +++ b/mithril-aggregator/src/database/query/epoch_settings/update_epoch_settings.rs @@ -3,14 +3,14 @@ use sqlite::Value; use mithril_common::entities::{Epoch, ProtocolParameters}; use mithril_persistence::sqlite::{Query, SourceAlias, SqLiteEntity, WhereCondition}; -use crate::database::record::EpochSettingRecord; +use crate::database::record::EpochSettingsRecord; -/// Query to update [EpochSettingRecord] in the sqlite database -pub struct UpdateEpochSettingQuery { +/// Query to update [EpochSettingsRecord] in the sqlite database +pub struct UpdateEpochSettingsQuery { condition: WhereCondition, } -impl UpdateEpochSettingQuery { +impl UpdateEpochSettingsQuery { pub fn one(epoch: Epoch, protocol_parameters: ProtocolParameters) -> Self { let epoch_setting_id: i64 = epoch.try_into().unwrap(); @@ -26,8 +26,8 @@ impl UpdateEpochSettingQuery { } } -impl Query for UpdateEpochSettingQuery { - type Entity = EpochSettingRecord; +impl Query for UpdateEpochSettingsQuery { + type Entity = EpochSettingsRecord; fn filters(&self) -> WhereCondition { self.condition.clone() @@ -48,18 +48,18 @@ mod tests { use mithril_common::test_utils::fake_data; use mithril_persistence::sqlite::ConnectionExtensions; - use crate::database::query::GetEpochSettingQuery; + use crate::database::query::GetEpochSettingsQuery; use crate::database::test_helper::{insert_epoch_settings, main_db_connection}; use super::*; #[test] - fn test_update_epoch_setting() { + fn test_update_epoch_settings() { let connection = main_db_connection().unwrap(); insert_epoch_settings(&connection, &[3]).unwrap(); let epoch_setting_record = connection - .fetch_first(UpdateEpochSettingQuery::one( + .fetch_first(UpdateEpochSettingsQuery::one( Epoch(3), fake_data::protocol_parameters(), )) @@ -73,11 +73,11 @@ mod tests { ); let mut cursor = connection - .fetch(GetEpochSettingQuery::by_epoch(Epoch(3)).unwrap()) + .fetch(GetEpochSettingsQuery::by_epoch(Epoch(3)).unwrap()) .unwrap(); let epoch_setting_record = cursor .next() - .expect("Should have an epoch setting for epoch 3."); + .expect("Should have an epoch settings for epoch 3."); assert_eq!(Epoch(3), epoch_setting_record.epoch_setting_id); assert_eq!( diff --git a/mithril-aggregator/src/database/query/mod.rs b/mithril-aggregator/src/database/query/mod.rs index c5010c32ac1..0af0fe26a14 100644 --- a/mithril-aggregator/src/database/query/mod.rs +++ b/mithril-aggregator/src/database/query/mod.rs @@ -1,7 +1,7 @@ //! Aggregator related database queries mod buffered_single_signature; mod certificate; -mod epoch_setting; +mod epoch_settings; mod open_message; mod signed_entity; mod signer; @@ -11,7 +11,7 @@ mod stake_pool; pub use buffered_single_signature::*; pub use certificate::*; -pub use epoch_setting::*; +pub use epoch_settings::*; pub use open_message::*; pub use signed_entity::*; pub use signer::*; diff --git a/mithril-aggregator/src/database/record/epoch_setting.rs b/mithril-aggregator/src/database/record/epoch_setting.rs index d510b4c0ee3..7b0236300ce 100644 --- a/mithril-aggregator/src/database/record/epoch_setting.rs +++ b/mithril-aggregator/src/database/record/epoch_setting.rs @@ -3,7 +3,7 @@ use mithril_persistence::sqlite::{HydrationError, Projection, SqLiteEntity}; /// Settings for an epoch, including the protocol parameters. #[derive(Debug, PartialEq)] -pub struct EpochSettingRecord { +pub struct EpochSettingsRecord { /// Epoch setting id, i.e. the epoch number. pub epoch_setting_id: Epoch, @@ -11,7 +11,7 @@ pub struct EpochSettingRecord { pub protocol_parameters: ProtocolParameters, } -impl SqLiteEntity for EpochSettingRecord { +impl SqLiteEntity for EpochSettingsRecord { fn hydrate(row: sqlite::Row) -> Result where Self: Sized, diff --git a/mithril-aggregator/src/database/repository/epoch_setting_store.rs b/mithril-aggregator/src/database/repository/epoch_settings_store.rs similarity index 86% rename from mithril-aggregator/src/database/repository/epoch_setting_store.rs rename to mithril-aggregator/src/database/repository/epoch_settings_store.rs index 0402c1ce303..2aecb2a8c7d 100644 --- a/mithril-aggregator/src/database/repository/epoch_setting_store.rs +++ b/mithril-aggregator/src/database/repository/epoch_settings_store.rs @@ -8,12 +8,12 @@ use mithril_persistence::sqlite::{ConnectionExtensions, SqliteConnection}; use mithril_persistence::store::adapter::AdapterError; use crate::database::query::{ - DeleteEpochSettingQuery, GetEpochSettingQuery, UpdateEpochSettingQuery, + DeleteEpochSettingsQuery, GetEpochSettingsQuery, UpdateEpochSettingsQuery, }; use crate::ProtocolParametersStorer; /// Service to deal with epoch settings (read & write). -pub struct EpochSettingStore { +pub struct EpochSettingsStore { connection: Arc, /// Number of epochs before previous records will be pruned at the next call to @@ -21,8 +21,8 @@ pub struct EpochSettingStore { retention_limit: Option, } -impl EpochSettingStore { - /// Create a new EpochSetting service +impl EpochSettingsStore { + /// Create a new EpochSettings store pub fn new(connection: Arc, retention_limit: Option) -> Self { Self { connection, @@ -32,7 +32,7 @@ impl EpochSettingStore { } #[async_trait] -impl ProtocolParametersStorer for EpochSettingStore { +impl ProtocolParametersStorer for EpochSettingsStore { async fn save_protocol_parameters( &self, epoch: Epoch, @@ -40,7 +40,7 @@ impl ProtocolParametersStorer for EpochSettingStore { ) -> StdResult> { let epoch_setting_record = self .connection - .fetch_first(UpdateEpochSettingQuery::one(epoch, protocol_parameters)) + .fetch_first(UpdateEpochSettingsQuery::one(epoch, protocol_parameters)) .map_err(|e| { AdapterError::GeneralError(e.context("persist protocol parameters failure")) })? @@ -50,7 +50,7 @@ impl ProtocolParametersStorer for EpochSettingStore { if let Some(threshold) = self.retention_limit { let _ = self .connection - .fetch(DeleteEpochSettingQuery::below_epoch_threshold( + .fetch(DeleteEpochSettingsQuery::below_epoch_threshold( epoch - threshold, )) .map_err(AdapterError::QueryError)? @@ -63,8 +63,8 @@ impl ProtocolParametersStorer for EpochSettingStore { async fn get_protocol_parameters(&self, epoch: Epoch) -> StdResult> { let mut cursor = self .connection - .fetch(GetEpochSettingQuery::by_epoch(epoch)?) - .map_err(|e| AdapterError::GeneralError(e.context("Could not get epoch setting")))?; + .fetch(GetEpochSettingsQuery::by_epoch(epoch)?) + .map_err(|e| AdapterError::GeneralError(e.context("Could not get epoch settings")))?; if let Some(epoch_setting_record) = cursor.next() { return Ok(Some(epoch_setting_record.protocol_parameters)); @@ -87,7 +87,7 @@ mod tests { let connection = main_db_connection().unwrap(); insert_epoch_settings(&connection, &[1, 2]).unwrap(); - let store = EpochSettingStore::new( + let store = EpochSettingsStore::new( Arc::new(connection), Some(EPOCH_SETTING_PRUNE_EPOCH_THRESHOLD), ); diff --git a/mithril-aggregator/src/database/repository/mod.rs b/mithril-aggregator/src/database/repository/mod.rs index 6ba624a92ac..df1bfce3998 100644 --- a/mithril-aggregator/src/database/repository/mod.rs +++ b/mithril-aggregator/src/database/repository/mod.rs @@ -2,7 +2,7 @@ mod buffered_single_signature_repository; mod cardano_transaction_repository; mod certificate_repository; -mod epoch_setting_store; +mod epoch_settings_store; mod open_message_repository; mod signed_entity_store; mod signer_registration_store; @@ -12,7 +12,7 @@ mod stake_pool_store; pub use buffered_single_signature_repository::*; pub use certificate_repository::*; -pub use epoch_setting_store::*; +pub use epoch_settings_store::*; pub use open_message_repository::*; pub use signed_entity_store::*; pub use signer_registration_store::*; diff --git a/mithril-aggregator/src/database/test_helper.rs b/mithril-aggregator/src/database/test_helper.rs index 13d698edaff..2a5b355a944 100644 --- a/mithril-aggregator/src/database/test_helper.rs +++ b/mithril-aggregator/src/database/test_helper.rs @@ -13,7 +13,7 @@ use crate::database::query::{ ImportSignerRecordQuery, InsertCertificateRecordQuery, InsertOrReplaceBufferedSingleSignatureRecordQuery, InsertOrReplaceSignerRegistrationRecordQuery, InsertOrReplaceStakePoolQuery, - InsertSignedEntityRecordQuery, UpdateEpochSettingQuery, UpdateSingleSignatureRecordQuery, + InsertSignedEntityRecordQuery, UpdateEpochSettingsQuery, UpdateSingleSignatureRecordQuery, }; use crate::database::record::{ BufferedSingleSignatureRecord, CertificateRecord, SignedEntityRecord, SignerRecord, @@ -199,7 +199,7 @@ pub fn insert_epoch_settings( // leverage the expanded parameter from this query which is unit // tested on its own above. let (sql_values, _) = - UpdateEpochSettingQuery::one(Epoch(1), ProtocolParameters::new(1, 2, 1.0)) + UpdateEpochSettingsQuery::one(Epoch(1), ProtocolParameters::new(1, 2, 1.0)) .filters() .expand(); diff --git a/mithril-aggregator/src/dependency_injection/builder.rs b/mithril-aggregator/src/dependency_injection/builder.rs index a5afeae4ef1..3c11a8f47d6 100644 --- a/mithril-aggregator/src/dependency_injection/builder.rs +++ b/mithril-aggregator/src/dependency_injection/builder.rs @@ -59,7 +59,7 @@ use crate::{ }, configuration::ExecutionEnvironment, database::repository::{ - BufferedSingleSignatureRepository, CertificateRepository, EpochSettingStore, + BufferedSingleSignatureRepository, CertificateRepository, EpochSettingsStore, OpenMessageRepository, SignedEntityStore, SignedEntityStorer, SignerRegistrationStore, SignerStore, SingleSignatureRepository, StakePoolStore, }, @@ -557,7 +557,7 @@ impl DependenciesBuilder { async fn build_protocol_parameters_store( &mut self, ) -> Result> { - let protocol_parameters_store = EpochSettingStore::new( + let protocol_parameters_store = EpochSettingsStore::new( self.get_sqlite_connection().await?, self.configuration.safe_epoch_retention_limit(), ); From 9eb155d92fa2eae68d3d7655dfa9906d4d2fbc98 Mon Sep 17 00:00:00 2001 From: Damien Lachaume <135982616+dlachaume@users.noreply.github.com> Date: Mon, 23 Sep 2024 17:17:38 +0200 Subject: [PATCH 013/274] refactor: rename `ProtocolParametersStorer` to `EpochSettingsStorer` --- .../repository/epoch_settings_store.rs | 14 +++--- .../src/dependency_injection/builder.rs | 40 ++++++++-------- .../src/dependency_injection/containers.rs | 17 ++++--- mithril-aggregator/src/lib.rs | 2 +- mithril-aggregator/src/runtime/runner.rs | 6 +-- .../src/services/epoch_service.rs | 26 +++++------ ...ters_store.rs => epoch_settings_storer.rs} | 46 +++++++++---------- mithril-aggregator/src/store/mod.rs | 6 +-- mithril-aggregator/src/tools/genesis.rs | 16 +++---- .../tests/test_extensions/runtime_tester.rs | 4 +- 10 files changed, 86 insertions(+), 91 deletions(-) rename mithril-aggregator/src/store/{protocol_parameters_store.rs => epoch_settings_storer.rs} (72%) diff --git a/mithril-aggregator/src/database/repository/epoch_settings_store.rs b/mithril-aggregator/src/database/repository/epoch_settings_store.rs index 2aecb2a8c7d..def0581f35b 100644 --- a/mithril-aggregator/src/database/repository/epoch_settings_store.rs +++ b/mithril-aggregator/src/database/repository/epoch_settings_store.rs @@ -10,7 +10,7 @@ use mithril_persistence::store::adapter::AdapterError; use crate::database::query::{ DeleteEpochSettingsQuery, GetEpochSettingsQuery, UpdateEpochSettingsQuery, }; -use crate::ProtocolParametersStorer; +use crate::EpochSettingsStorer; /// Service to deal with epoch settings (read & write). pub struct EpochSettingsStore { @@ -32,8 +32,8 @@ impl EpochSettingsStore { } #[async_trait] -impl ProtocolParametersStorer for EpochSettingsStore { - async fn save_protocol_parameters( +impl EpochSettingsStorer for EpochSettingsStore { + async fn save_epoch_settings( &self, epoch: Epoch, protocol_parameters: ProtocolParameters, @@ -60,7 +60,7 @@ impl ProtocolParametersStorer for EpochSettingsStore { Ok(Some(epoch_setting_record.protocol_parameters)) } - async fn get_protocol_parameters(&self, epoch: Epoch) -> StdResult> { + async fn get_epoch_settings(&self, epoch: Epoch) -> StdResult> { let mut cursor = self .connection .fetch(GetEpochSettingsQuery::by_epoch(epoch)?) @@ -93,14 +93,14 @@ mod tests { ); store - .save_protocol_parameters( + .save_epoch_settings( Epoch(2) + EPOCH_SETTING_PRUNE_EPOCH_THRESHOLD, fake_data::protocol_parameters(), ) .await .expect("saving protocol parameters should not fails"); - let epoch1_params = store.get_protocol_parameters(Epoch(1)).await.unwrap(); - let epoch2_params = store.get_protocol_parameters(Epoch(2)).await.unwrap(); + let epoch1_params = store.get_epoch_settings(Epoch(1)).await.unwrap(); + let epoch2_params = store.get_epoch_settings(Epoch(2)).await.unwrap(); assert!( epoch1_params.is_none(), diff --git a/mithril-aggregator/src/dependency_injection/builder.rs b/mithril-aggregator/src/dependency_injection/builder.rs index 3c11a8f47d6..958b4892ed9 100644 --- a/mithril-aggregator/src/dependency_injection/builder.rs +++ b/mithril-aggregator/src/dependency_injection/builder.rs @@ -75,8 +75,8 @@ use crate::{ tools::{CExplorerSignerRetriever, GcpFileUploader, GenesisToolsDependency, SignersImporter}, AggregatorConfig, AggregatorRunner, AggregatorRuntime, CertificatePendingStore, CompressedArchiveSnapshotter, Configuration, DependencyContainer, DumbSnapshotUploader, - DumbSnapshotter, LocalSnapshotUploader, MithrilSignerRegisterer, MultiSigner, MultiSignerImpl, - ProtocolParametersStorer, RemoteSnapshotUploader, SingleSignatureAuthenticator, + DumbSnapshotter, EpochSettingsStorer, LocalSnapshotUploader, MithrilSignerRegisterer, + MultiSigner, MultiSignerImpl, RemoteSnapshotUploader, SingleSignatureAuthenticator, SnapshotUploader, SnapshotUploaderType, Snapshotter, SnapshotterCompressionAlgorithm, VerificationKeyStorer, }; @@ -130,8 +130,8 @@ pub struct DependenciesBuilder { /// Verification key store. pub verification_key_store: Option>, - /// Protocol parameter store. - pub protocol_parameters_store: Option>, + /// Epoch settings storer. + pub epoch_settings_storer: Option>, /// Cardano CLI Runner for the [ChainObserver] pub cardano_cli_runner: Option>, @@ -251,7 +251,7 @@ impl DependenciesBuilder { certificate_repository: None, open_message_repository: None, verification_key_store: None, - protocol_parameters_store: None, + epoch_settings_storer: None, cardano_cli_runner: None, chain_observer: None, chain_block_reader: None, @@ -554,10 +554,8 @@ impl DependenciesBuilder { Ok(self.verification_key_store.as_ref().cloned().unwrap()) } - async fn build_protocol_parameters_store( - &mut self, - ) -> Result> { - let protocol_parameters_store = EpochSettingsStore::new( + async fn build_epoch_settings_storer(&mut self) -> Result> { + let epoch_settings_store = EpochSettingsStore::new( self.get_sqlite_connection().await?, self.configuration.safe_epoch_retention_limit(), ); @@ -576,7 +574,7 @@ impl DependenciesBuilder { error: None, })?; - protocol_parameters_store + epoch_settings_store .handle_discrepancies_at_startup(current_epoch, &self.configuration.protocol_parameters) .await .map_err(|e| DependenciesBuilderError::Initialization { @@ -584,18 +582,16 @@ impl DependenciesBuilder { error: Some(e), })?; - Ok(Arc::new(protocol_parameters_store)) + Ok(Arc::new(epoch_settings_store)) } - /// Get a configured [ProtocolParametersStorer]. - pub async fn get_protocol_parameters_store( - &mut self, - ) -> Result> { - if self.protocol_parameters_store.is_none() { - self.protocol_parameters_store = Some(self.build_protocol_parameters_store().await?); + /// Get a configured [EpochSettingsStorer]. + pub async fn get_epoch_settings_storer(&mut self) -> Result> { + if self.epoch_settings_storer.is_none() { + self.epoch_settings_storer = Some(self.build_epoch_settings_storer().await?); } - Ok(self.protocol_parameters_store.as_ref().cloned().unwrap()) + Ok(self.epoch_settings_storer.as_ref().cloned().unwrap()) } async fn build_chain_observer(&mut self) -> Result> { @@ -1181,11 +1177,11 @@ impl DependenciesBuilder { async fn build_epoch_service(&mut self) -> Result { let verification_key_store = self.get_verification_key_store().await?; - let protocol_parameters_store = self.get_protocol_parameters_store().await?; + let epoch_settings_storer = self.get_epoch_settings_storer().await?; let epoch_service = Arc::new(RwLock::new(MithrilEpochService::new( self.configuration.protocol_parameters.clone(), - protocol_parameters_store, + epoch_settings_storer, verification_key_store, ))); @@ -1305,7 +1301,7 @@ impl DependenciesBuilder { certificate_repository: self.get_certificate_repository().await?, open_message_repository: self.get_open_message_repository().await?, verification_key_store: self.get_verification_key_store().await?, - protocol_parameters_store: self.get_protocol_parameters_store().await?, + epoch_settings_storer: self.get_epoch_settings_storer().await?, chain_observer: self.get_chain_observer().await?, immutable_file_observer: self.get_immutable_file_observer().await?, digester: self.get_immutable_digester().await?, @@ -1411,7 +1407,7 @@ impl DependenciesBuilder { certificate_repository: self.get_certificate_repository().await?, certificate_verifier: self.get_certificate_verifier().await?, genesis_verifier: self.get_genesis_verifier().await?, - protocol_parameters_store: self.get_protocol_parameters_store().await?, + epoch_settings_storer: self.get_epoch_settings_storer().await?, verification_key_store: self.get_verification_key_store().await?, }; diff --git a/mithril-aggregator/src/dependency_injection/containers.rs b/mithril-aggregator/src/dependency_injection/containers.rs index 4be9b1766cc..f2bbdf03700 100644 --- a/mithril-aggregator/src/dependency_injection/containers.rs +++ b/mithril-aggregator/src/dependency_injection/containers.rs @@ -32,9 +32,8 @@ use crate::{ }, signer_registerer::SignerRecorder, snapshot_uploaders::SnapshotUploader, - CertificatePendingStore, ProtocolParametersStorer, SignerRegisterer, - SignerRegistrationRoundOpener, SingleSignatureAuthenticator, Snapshotter, - VerificationKeyStorer, + CertificatePendingStore, EpochSettingsStorer, SignerRegisterer, SignerRegistrationRoundOpener, + SingleSignatureAuthenticator, Snapshotter, VerificationKeyStorer, }; /// EpochServiceWrapper wraps a [EpochService] @@ -79,8 +78,8 @@ pub struct DependencyContainer { /// Verification key store. pub verification_key_store: Arc, - /// Protocol parameter store. - pub protocol_parameters_store: Arc, + /// Epoch settings storer. + pub epoch_settings_storer: Arc, /// Chain observer service. pub chain_observer: Arc, @@ -193,8 +192,8 @@ impl DependencyContainer { /// using the data from a precomputed fixture. pub async fn init_state_from_fixture(&self, fixture: &MithrilFixture, target_epochs: &[Epoch]) { for epoch in target_epochs { - self.protocol_parameters_store - .save_protocol_parameters(*epoch, fixture.protocol_parameters()) + self.epoch_settings_storer + .save_epoch_settings(*epoch, fixture.protocol_parameters()) .await .expect("save_protocol_parameters should not fail"); self.fill_verification_key_store(*epoch, &fixture.signers_with_stake()) @@ -241,8 +240,8 @@ impl DependencyContainer { epochs_to_save.push(epoch_to_sign); epochs_to_save.push(epoch_to_sign.next()); for epoch in epochs_to_save { - self.protocol_parameters_store - .save_protocol_parameters(epoch, protocol_parameters.clone()) + self.epoch_settings_storer + .save_epoch_settings(epoch, protocol_parameters.clone()) .await .expect("save_protocol_parameters should not fail"); } diff --git a/mithril-aggregator/src/lib.rs b/mithril-aggregator/src/lib.rs index fa955490d73..1c96977db70 100644 --- a/mithril-aggregator/src/lib.rs +++ b/mithril-aggregator/src/lib.rs @@ -53,7 +53,7 @@ pub use snapshotter::{ SnapshotterCompressionAlgorithm, }; pub use store::{ - CertificatePendingStore, ProtocolParametersStorer, VerificationKeyStore, VerificationKeyStorer, + CertificatePendingStore, EpochSettingsStorer, VerificationKeyStore, VerificationKeyStorer, }; pub use tools::{ CExplorerSignerRetriever, SignersImporter, SignersImporterPersister, SignersImporterRetriever, diff --git a/mithril-aggregator/src/runtime/runner.rs b/mithril-aggregator/src/runtime/runner.rs index b75dfcb6418..a612faf8f78 100644 --- a/mithril-aggregator/src/runtime/runner.rs +++ b/mithril-aggregator/src/runtime/runner.rs @@ -940,7 +940,7 @@ pub mod tests { let mut deps = initialize_dependencies().await; deps.certifier_service = Arc::new(mock_certifier_service); - let protocol_parameters_store = deps.protocol_parameters_store.clone(); + let epoch_settings_storer = deps.epoch_settings_storer.clone(); let expected_protocol_parameters = deps.config.protocol_parameters.clone(); let current_epoch = deps.ticker_service.get_current_epoch().await.unwrap(); let insert_epoch = current_epoch.offset_to_protocol_parameters_recording_epoch(); @@ -952,8 +952,8 @@ pub mod tests { .await .expect("update_protocol_parameters should not fail"); - let saved_protocol_parameters = protocol_parameters_store - .get_protocol_parameters(insert_epoch) + let saved_protocol_parameters = epoch_settings_storer + .get_epoch_settings(insert_epoch) .await .unwrap() .unwrap_or_else(|| panic!("should have protocol parameters for epoch {insert_epoch}",)); diff --git a/mithril-aggregator/src/services/epoch_service.rs b/mithril-aggregator/src/services/epoch_service.rs index e2926963670..b3c829b0f63 100644 --- a/mithril-aggregator/src/services/epoch_service.rs +++ b/mithril-aggregator/src/services/epoch_service.rs @@ -9,7 +9,7 @@ use mithril_common::entities::{Epoch, ProtocolParameters, Signer, SignerWithStak use mithril_common::protocol::{MultiSigner as ProtocolMultiSigner, SignerBuilder}; use mithril_common::StdResult; -use crate::{ProtocolParametersStorer, VerificationKeyStorer}; +use crate::{EpochSettingsStorer, VerificationKeyStorer}; /// Errors dedicated to the CertifierService. #[derive(Debug, Error)] @@ -107,7 +107,7 @@ pub struct MithrilEpochService { future_protocol_parameters: ProtocolParameters, epoch_data: Option, computed_epoch_data: Option, - protocol_parameters_store: Arc, + epoch_settings_storer: Arc, verification_key_store: Arc, } @@ -115,14 +115,14 @@ impl MithrilEpochService { /// Create a new service instance pub fn new( future_protocol_parameters: ProtocolParameters, - protocol_parameters_store: Arc, + epoch_settings_storer: Arc, verification_key_store: Arc, ) -> Self { Self { future_protocol_parameters, epoch_data: None, computed_epoch_data: None, - protocol_parameters_store, + epoch_settings_storer, verification_key_store, } } @@ -146,8 +146,8 @@ impl MithrilEpochService { name: &str, ) -> StdResult { let parameters = self - .protocol_parameters_store - .get_protocol_parameters(epoch) + .epoch_settings_storer + .get_epoch_settings(epoch) .await .with_context(|| format!("Epoch service failed to obtain {name}"))? .ok_or(EpochServiceError::UnavailableData(epoch, name.to_string()))?; @@ -164,8 +164,8 @@ impl MithrilEpochService { "protocol_parameters" => ?self.future_protocol_parameters ); - self.protocol_parameters_store - .save_protocol_parameters( + self.epoch_settings_storer + .save_epoch_settings( recording_epoch, self.future_protocol_parameters.clone(), ) @@ -521,7 +521,7 @@ mod tests { use std::collections::{BTreeSet, HashMap}; use crate::services::epoch_service::tests::ServiceBuilderParameters::WithFutureProtocolParameters; - use crate::store::FakeProtocolParametersStorer; + use crate::store::FakeEpochSettingsStorer; use crate::VerificationKeyStore; use super::*; @@ -617,7 +617,7 @@ mod tests { } } - let protocol_parameters_store = FakeProtocolParametersStorer::new(vec![ + let epoch_settings_storer = FakeEpochSettingsStorer::new(vec![ ( signer_retrieval_epoch, current_epoch_fixture.protocol_parameters(), @@ -647,7 +647,7 @@ mod tests { MithrilEpochService::new( future_protocol_parameters, - Arc::new(protocol_parameters_store), + Arc::new(epoch_settings_storer), Arc::new(vkey_store), ) } @@ -796,8 +796,8 @@ mod tests { .expect("update_protocol_parameters should not fail"); let inserted_protocol_parameters = service - .protocol_parameters_store - .get_protocol_parameters(epoch.offset_to_protocol_parameters_recording_epoch()) + .epoch_settings_storer + .get_epoch_settings(epoch.offset_to_protocol_parameters_recording_epoch()) .await .unwrap_or_else(|_| { panic!( diff --git a/mithril-aggregator/src/store/protocol_parameters_store.rs b/mithril-aggregator/src/store/epoch_settings_storer.rs similarity index 72% rename from mithril-aggregator/src/store/protocol_parameters_store.rs rename to mithril-aggregator/src/store/epoch_settings_storer.rs index a85d9e0ce28..31e322b13dd 100644 --- a/mithril-aggregator/src/store/protocol_parameters_store.rs +++ b/mithril-aggregator/src/store/epoch_settings_storer.rs @@ -9,16 +9,16 @@ use mithril_common::entities::{Epoch, ProtocolParameters}; /// Store and get [protocol parameters][ProtocolParameters] for given epoch. #[async_trait] -pub trait ProtocolParametersStorer: Sync + Send { +pub trait EpochSettingsStorer: Sync + Send { /// Save the given `ProtocolParameter` for the given [Epoch]. - async fn save_protocol_parameters( + async fn save_epoch_settings( &self, epoch: Epoch, protocol_parameters: ProtocolParameters, ) -> StdResult>; /// Get the saved `ProtocolParameter` for the given [Epoch] if any. - async fn get_protocol_parameters(&self, epoch: Epoch) -> StdResult>; + async fn get_epoch_settings(&self, epoch: Epoch) -> StdResult>; /// Handle discrepancies at startup in the protocol parameters store. /// In case an aggregator has been launched after some epochs of not being up or at initial startup, @@ -31,9 +31,9 @@ pub trait ProtocolParametersStorer: Sync + Send { ) -> StdResult<()> { for epoch_offset in 0..=2 { let epoch = current_epoch + epoch_offset; - if self.get_protocol_parameters(epoch).await?.is_none() { + if self.get_epoch_settings(epoch).await?.is_none() { debug!("Handle discrepancies at startup of protocol parameters store, will record protocol parameters from the configuration for epoch {epoch}: {configuration_protocol_parameters:?}"); - self.save_protocol_parameters(epoch, configuration_protocol_parameters.clone()) + self.save_epoch_settings(epoch, configuration_protocol_parameters.clone()) .await?; } } @@ -42,11 +42,11 @@ pub trait ProtocolParametersStorer: Sync + Send { } } -pub struct FakeProtocolParametersStorer { +pub struct FakeEpochSettingsStorer { pub protocol_parameters: RwLock>, } -impl FakeProtocolParametersStorer { +impl FakeEpochSettingsStorer { #[cfg(test)] pub fn new(data: Vec<(Epoch, ProtocolParameters)>) -> Self { let protocol_parameters = RwLock::new(data.into_iter().collect()); @@ -57,8 +57,8 @@ impl FakeProtocolParametersStorer { } #[async_trait] -impl ProtocolParametersStorer for FakeProtocolParametersStorer { - async fn save_protocol_parameters( +impl EpochSettingsStorer for FakeEpochSettingsStorer { + async fn save_epoch_settings( &self, epoch: Epoch, protocol_parameters: ProtocolParameters, @@ -67,7 +67,7 @@ impl ProtocolParametersStorer for FakeProtocolParametersStorer { Ok(protocol_parameters_write.insert(epoch, protocol_parameters)) } - async fn get_protocol_parameters(&self, epoch: Epoch) -> StdResult> { + async fn get_epoch_settings(&self, epoch: Epoch) -> StdResult> { let protocol_parameters = self.protocol_parameters.read().await; Ok(protocol_parameters.get(&epoch).cloned()) } @@ -84,9 +84,9 @@ mod tests { async fn test_save_protocol_parameters_do_not_exist_yet() { let protocol_parameters = fake_data::protocol_parameters(); let epoch = Epoch(1); - let store = FakeProtocolParametersStorer::new(vec![]); + let store = FakeEpochSettingsStorer::new(vec![]); let protocol_parameters_previous = store - .save_protocol_parameters(epoch, protocol_parameters) + .save_epoch_settings(epoch, protocol_parameters) .await .unwrap(); @@ -97,13 +97,13 @@ mod tests { async fn test_save_protocol_parameters_already_exist() { let protocol_parameters = fake_data::protocol_parameters(); let epoch = Epoch(1); - let store = FakeProtocolParametersStorer::new(vec![(epoch, protocol_parameters.clone())]); + let store = FakeEpochSettingsStorer::new(vec![(epoch, protocol_parameters.clone())]); let protocol_parameters_new = ProtocolParameters { k: protocol_parameters.k + 1, ..protocol_parameters }; let protocol_parameters_previous = store - .save_protocol_parameters(epoch, protocol_parameters_new) + .save_epoch_settings(epoch, protocol_parameters_new) .await .unwrap(); @@ -114,8 +114,8 @@ mod tests { async fn test_get_protocol_parameters_exist() { let protocol_parameters = fake_data::protocol_parameters(); let epoch = Epoch(1); - let store = FakeProtocolParametersStorer::new(vec![(epoch, protocol_parameters.clone())]); - let protocol_parameters_stored = store.get_protocol_parameters(epoch).await.unwrap(); + let store = FakeEpochSettingsStorer::new(vec![(epoch, protocol_parameters.clone())]); + let protocol_parameters_stored = store.get_epoch_settings(epoch).await.unwrap(); assert_eq!(Some(protocol_parameters), protocol_parameters_stored); } @@ -124,8 +124,8 @@ mod tests { async fn test_get_protocol_parameters_do_not_exist() { let protocol_parameters = fake_data::protocol_parameters(); let epoch = Epoch(1); - let store = FakeProtocolParametersStorer::new(vec![(epoch, protocol_parameters.clone())]); - let protocol_parameters_stored = store.get_protocol_parameters(epoch + 1).await.unwrap(); + let store = FakeEpochSettingsStorer::new(vec![(epoch, protocol_parameters.clone())]); + let protocol_parameters_stored = store.get_epoch_settings(epoch + 1).await.unwrap(); assert!(protocol_parameters_stored.is_none()); } @@ -138,7 +138,7 @@ mod tests { ..protocol_parameters }; let epoch = Epoch(1); - let store = FakeProtocolParametersStorer::new(vec![ + let store = FakeEpochSettingsStorer::new(vec![ (epoch, protocol_parameters.clone()), (epoch + 1, protocol_parameters.clone()), ]); @@ -148,25 +148,25 @@ mod tests { .await .unwrap(); - let protocol_parameters_stored = store.get_protocol_parameters(epoch).await.unwrap(); + let protocol_parameters_stored = store.get_epoch_settings(epoch).await.unwrap(); assert_eq!( Some(protocol_parameters.clone()), protocol_parameters_stored ); - let protocol_parameters_stored = store.get_protocol_parameters(epoch + 1).await.unwrap(); + let protocol_parameters_stored = store.get_epoch_settings(epoch + 1).await.unwrap(); assert_eq!( Some(protocol_parameters.clone()), protocol_parameters_stored ); - let protocol_parameters_stored = store.get_protocol_parameters(epoch + 2).await.unwrap(); + let protocol_parameters_stored = store.get_epoch_settings(epoch + 2).await.unwrap(); assert_eq!( Some(protocol_parameters_new.clone()), protocol_parameters_stored ); - let protocol_parameters_stored = store.get_protocol_parameters(epoch + 3).await.unwrap(); + let protocol_parameters_stored = store.get_epoch_settings(epoch + 3).await.unwrap(); assert!(protocol_parameters_stored.is_none()); } } diff --git a/mithril-aggregator/src/store/mod.rs b/mithril-aggregator/src/store/mod.rs index bdf83e93323..7650c223665 100644 --- a/mithril-aggregator/src/store/mod.rs +++ b/mithril-aggregator/src/store/mod.rs @@ -1,13 +1,13 @@ +mod epoch_settings_storer; mod pending_certificate_store; -mod protocol_parameters_store; mod verification_key_store; +pub use epoch_settings_storer::EpochSettingsStorer; pub use pending_certificate_store::CertificatePendingStore; -pub use protocol_parameters_store::ProtocolParametersStorer; pub use verification_key_store::{VerificationKeyStore, VerificationKeyStorer}; #[cfg(test)] -pub use protocol_parameters_store::FakeProtocolParametersStorer; +pub use epoch_settings_storer::FakeEpochSettingsStorer; #[cfg(test)] pub use verification_key_store::test_suite as verification_key_store_test_suite; #[cfg(test)] diff --git a/mithril-aggregator/src/tools/genesis.rs b/mithril-aggregator/src/tools/genesis.rs index dedc3f9a209..a2419936dc6 100644 --- a/mithril-aggregator/src/tools/genesis.rs +++ b/mithril-aggregator/src/tools/genesis.rs @@ -13,7 +13,7 @@ use mithril_common::{ }; use crate::database::repository::CertificateRepository; -use crate::{ProtocolParametersStorer, VerificationKeyStorer}; +use crate::{EpochSettingsStorer, VerificationKeyStorer}; pub struct GenesisToolsDependency { /// Cardano network @@ -31,8 +31,8 @@ pub struct GenesisToolsDependency { /// Certificate verifier service. pub certificate_verifier: Arc, - /// Protocol parameter store. - pub protocol_parameters_store: Arc, + /// Epoch settings storer. + pub epoch_settings_storer: Arc, /// Certificate store. pub certificate_repository: Arc, @@ -76,19 +76,19 @@ impl GenesisTools { let genesis_verifier = dependencies.genesis_verifier.clone(); let certificate_verifier = dependencies.certificate_verifier.clone(); let certificate_repository = dependencies.certificate_repository.clone(); - let protocol_parameters_store = dependencies.protocol_parameters_store.clone(); + let epoch_settings_storer = dependencies.epoch_settings_storer.clone(); let protocol_params_epoch = time_point.epoch.offset_to_signer_retrieval_epoch()?; - let protocol_parameters = protocol_parameters_store - .get_protocol_parameters(protocol_params_epoch) + let protocol_parameters = epoch_settings_storer + .get_epoch_settings(protocol_params_epoch) .await? .ok_or_else(|| { anyhow!("Missing protocol parameters for epoch {protocol_params_epoch}") })?; let genesis_avk_epoch = time_point.epoch.offset_to_next_signer_retrieval_epoch(); - let genesis_avk_protocol_parameters = protocol_parameters_store - .get_protocol_parameters(time_point.epoch.offset_to_signer_retrieval_epoch()?) + let genesis_avk_protocol_parameters = epoch_settings_storer + .get_epoch_settings(time_point.epoch.offset_to_signer_retrieval_epoch()?) .await? .ok_or_else(|| anyhow!("Missing protocol parameters for epoch {genesis_avk_epoch}"))?; let genesis_signers = dependencies diff --git a/mithril-aggregator/tests/test_extensions/runtime_tester.rs b/mithril-aggregator/tests/test_extensions/runtime_tester.rs index c2ccf35fd16..48af64819f2 100644 --- a/mithril-aggregator/tests/test_extensions/runtime_tester.rs +++ b/mithril-aggregator/tests/test_extensions/runtime_tester.rs @@ -491,8 +491,8 @@ impl RuntimeTester { let epoch = self.observer.current_time_point().await.epoch; let protocol_parameters = self .dependencies - .protocol_parameters_store - .get_protocol_parameters(epoch.offset_to_recording_epoch()) + .epoch_settings_storer + .get_epoch_settings(epoch.offset_to_recording_epoch()) .await .with_context(|| "Querying the recording epoch protocol_parameters should not fail")? .ok_or(anyhow!( From e54339d70e2874ed473c2f6a7efa6c20d1a607de Mon Sep 17 00:00:00 2001 From: Damien Lachaume <135982616+dlachaume@users.noreply.github.com> Date: Mon, 23 Sep 2024 18:19:11 +0200 Subject: [PATCH 014/274] refactor: rename epoch setting variables names to plural --- .../epoch_settings/delete_epoch_settings.rs | 8 ++++---- .../query/epoch_settings/get_epoch_settings.rs | 16 ++++++++-------- .../epoch_settings/update_epoch_settings.rs | 16 ++++++++-------- .../insert_or_replace_signer_registration.rs | 2 +- .../single_signature/update_single_signature.rs | 2 +- .../src/database/record/epoch_setting.rs | 14 +++++++------- .../src/database/record/open_message.rs | 6 +++--- .../src/database/record/signer_registration.rs | 10 +++++----- .../src/database/record/single_signature.rs | 14 +++++++------- .../database/repository/epoch_settings_store.rs | 14 +++++++------- mithril-aggregator/src/database/test_helper.rs | 6 +++--- 11 files changed, 54 insertions(+), 54 deletions(-) diff --git a/mithril-aggregator/src/database/query/epoch_settings/delete_epoch_settings.rs b/mithril-aggregator/src/database/query/epoch_settings/delete_epoch_settings.rs index cab03c6252a..bf177aa9aab 100644 --- a/mithril-aggregator/src/database/query/epoch_settings/delete_epoch_settings.rs +++ b/mithril-aggregator/src/database/query/epoch_settings/delete_epoch_settings.rs @@ -31,19 +31,19 @@ impl DeleteEpochSettingsQuery { #[cfg(test)] /// Create the SQL condition to delete a record given the Epoch. pub fn by_epoch(epoch: Epoch) -> Self { - let epoch_setting_id_value = Value::Integer(epoch.try_into().unwrap()); + let epoch_settings_id_value = Value::Integer(epoch.try_into().unwrap()); Self { - condition: WhereCondition::new("epoch_setting_id = ?*", vec![epoch_setting_id_value]), + condition: WhereCondition::new("epoch_setting_id = ?*", vec![epoch_settings_id_value]), } } /// Create the SQL condition to prune data older than the given Epoch. pub fn below_epoch_threshold(epoch_threshold: Epoch) -> Self { - let epoch_setting_id_value = Value::Integer(epoch_threshold.try_into().unwrap()); + let epoch_settings_id_value = Value::Integer(epoch_threshold.try_into().unwrap()); Self { - condition: WhereCondition::new("epoch_setting_id < ?*", vec![epoch_setting_id_value]), + condition: WhereCondition::new("epoch_setting_id < ?*", vec![epoch_settings_id_value]), } } } diff --git a/mithril-aggregator/src/database/query/epoch_settings/get_epoch_settings.rs b/mithril-aggregator/src/database/query/epoch_settings/get_epoch_settings.rs index a89b84bea36..b9dc46ab888 100644 --- a/mithril-aggregator/src/database/query/epoch_settings/get_epoch_settings.rs +++ b/mithril-aggregator/src/database/query/epoch_settings/get_epoch_settings.rs @@ -13,14 +13,14 @@ pub struct GetEpochSettingsQuery { impl GetEpochSettingsQuery { pub fn by_epoch(epoch: Epoch) -> StdResult { - let epoch_setting_id: i64 = epoch + let epoch_settings_id: i64 = epoch .try_into() .with_context(|| format!("Can not convert epoch: '{epoch}'"))?; Ok(Self { condition: WhereCondition::new( "epoch_setting_id = ?*", - vec![Value::Integer(epoch_setting_id)], + vec![Value::Integer(epoch_settings_id)], ), }) } @@ -54,24 +54,24 @@ mod tests { let connection = main_db_connection().unwrap(); insert_epoch_settings(&connection, &[1, 2, 3]).unwrap(); - let epoch_setting_record = connection + let epoch_settings_record = connection .fetch_first(GetEpochSettingsQuery::by_epoch(Epoch(1)).unwrap()) .unwrap() .expect("Should have an epoch settings for epoch 1."); - assert_eq!(Epoch(1), epoch_setting_record.epoch_setting_id); + assert_eq!(Epoch(1), epoch_settings_record.epoch_settings_id); assert_eq!( ProtocolParameters::new(1, 2, 1.0), - epoch_setting_record.protocol_parameters + epoch_settings_record.protocol_parameters ); - let epoch_setting_record = connection + let epoch_settings_record = connection .fetch_first(GetEpochSettingsQuery::by_epoch(Epoch(3)).unwrap()) .unwrap() .expect("Should have an epoch settings for epoch 3."); - assert_eq!(Epoch(3), epoch_setting_record.epoch_setting_id); + assert_eq!(Epoch(3), epoch_settings_record.epoch_settings_id); assert_eq!( ProtocolParameters::new(3, 4, 1.0), - epoch_setting_record.protocol_parameters + epoch_settings_record.protocol_parameters ); let cursor = connection diff --git a/mithril-aggregator/src/database/query/epoch_settings/update_epoch_settings.rs b/mithril-aggregator/src/database/query/epoch_settings/update_epoch_settings.rs index ccb39e4a6cc..427da07cc75 100644 --- a/mithril-aggregator/src/database/query/epoch_settings/update_epoch_settings.rs +++ b/mithril-aggregator/src/database/query/epoch_settings/update_epoch_settings.rs @@ -12,13 +12,13 @@ pub struct UpdateEpochSettingsQuery { impl UpdateEpochSettingsQuery { pub fn one(epoch: Epoch, protocol_parameters: ProtocolParameters) -> Self { - let epoch_setting_id: i64 = epoch.try_into().unwrap(); + let epoch_settings_id: i64 = epoch.try_into().unwrap(); Self { condition: WhereCondition::new( "(epoch_setting_id, protocol_parameters) values (?1, ?2)", vec![ - Value::Integer(epoch_setting_id), + Value::Integer(epoch_settings_id), Value::String(serde_json::to_string(&protocol_parameters).unwrap()), ], ), @@ -58,7 +58,7 @@ mod tests { let connection = main_db_connection().unwrap(); insert_epoch_settings(&connection, &[3]).unwrap(); - let epoch_setting_record = connection + let epoch_settings_record = connection .fetch_first(UpdateEpochSettingsQuery::one( Epoch(3), fake_data::protocol_parameters(), @@ -66,23 +66,23 @@ mod tests { .unwrap() .unwrap(); - assert_eq!(Epoch(3), epoch_setting_record.epoch_setting_id); + assert_eq!(Epoch(3), epoch_settings_record.epoch_settings_id); assert_eq!( fake_data::protocol_parameters(), - epoch_setting_record.protocol_parameters + epoch_settings_record.protocol_parameters ); let mut cursor = connection .fetch(GetEpochSettingsQuery::by_epoch(Epoch(3)).unwrap()) .unwrap(); - let epoch_setting_record = cursor + let epoch_settings_record = cursor .next() .expect("Should have an epoch settings for epoch 3."); - assert_eq!(Epoch(3), epoch_setting_record.epoch_setting_id); + assert_eq!(Epoch(3), epoch_settings_record.epoch_settings_id); assert_eq!( fake_data::protocol_parameters(), - epoch_setting_record.protocol_parameters + epoch_settings_record.protocol_parameters ); assert_eq!(0, cursor.count()); } diff --git a/mithril-aggregator/src/database/query/signer_registration/insert_or_replace_signer_registration.rs b/mithril-aggregator/src/database/query/signer_registration/insert_or_replace_signer_registration.rs index f8b8311c7a3..d8a90a33204 100644 --- a/mithril-aggregator/src/database/query/signer_registration/insert_or_replace_signer_registration.rs +++ b/mithril-aggregator/src/database/query/signer_registration/insert_or_replace_signer_registration.rs @@ -16,7 +16,7 @@ impl InsertOrReplaceSignerRegistrationRecordQuery { vec![ Value::String(signer_registration_record.signer_id), Value::Integer( - signer_registration_record.epoch_setting_id.try_into().unwrap(), + signer_registration_record.epoch_settings_id.try_into().unwrap(), ), Value::String(signer_registration_record.verification_key), signer_registration_record diff --git a/mithril-aggregator/src/database/query/single_signature/update_single_signature.rs b/mithril-aggregator/src/database/query/single_signature/update_single_signature.rs index 71fcedc60f2..12c45d6a472 100644 --- a/mithril-aggregator/src/database/query/single_signature/update_single_signature.rs +++ b/mithril-aggregator/src/database/query/single_signature/update_single_signature.rs @@ -18,7 +18,7 @@ impl UpdateSingleSignatureRecordQuery { Value::String(single_signature_record.open_message_id.to_string()), Value::String(single_signature_record.signer_id), Value::Integer( - single_signature_record.registration_epoch_setting_id.try_into().unwrap(), + single_signature_record.registration_epoch_settings_id.try_into().unwrap(), ), Value::String(serde_json::to_string(&single_signature_record.lottery_indexes).unwrap()), Value::String(single_signature_record.signature), diff --git a/mithril-aggregator/src/database/record/epoch_setting.rs b/mithril-aggregator/src/database/record/epoch_setting.rs index 7b0236300ce..a6098792588 100644 --- a/mithril-aggregator/src/database/record/epoch_setting.rs +++ b/mithril-aggregator/src/database/record/epoch_setting.rs @@ -4,8 +4,8 @@ use mithril_persistence::sqlite::{HydrationError, Projection, SqLiteEntity}; /// Settings for an epoch, including the protocol parameters. #[derive(Debug, PartialEq)] pub struct EpochSettingsRecord { - /// Epoch setting id, i.e. the epoch number. - pub epoch_setting_id: Epoch, + /// Epoch settings id, i.e. the epoch number. + pub epoch_settings_id: Epoch, /// Protocol parameters. pub protocol_parameters: ProtocolParameters, @@ -16,13 +16,13 @@ impl SqLiteEntity for EpochSettingsRecord { where Self: Sized, { - let epoch_setting_id_int = row.read::(0); + let epoch_settings_id_int = row.read::(0); let protocol_parameters_string = &row.read::<&str, _>(1); - let epoch_setting_record = Self { - epoch_setting_id: Epoch(epoch_setting_id_int.try_into().map_err(|e| { + let epoch_settings_record = Self { + epoch_settings_id: Epoch(epoch_settings_id_int.try_into().map_err(|e| { HydrationError::InvalidData(format!( - "Could not cast i64 ({epoch_setting_id_int}) to u64. Error: '{e}'" + "Could not cast i64 ({epoch_settings_id_int}) to u64. Error: '{e}'" )) })?), protocol_parameters: serde_json::from_str(protocol_parameters_string).map_err( @@ -34,7 +34,7 @@ impl SqLiteEntity for EpochSettingsRecord { )?, }; - Ok(epoch_setting_record) + Ok(epoch_settings_record) } fn get_projection() -> Projection { diff --git a/mithril-aggregator/src/database/record/open_message.rs b/mithril-aggregator/src/database/record/open_message.rs index 883c11329e1..993ead563e5 100644 --- a/mithril-aggregator/src/database/record/open_message.rs +++ b/mithril-aggregator/src/database/record/open_message.rs @@ -76,9 +76,9 @@ impl SqLiteEntity for OpenMessageRecord { "Invalid protocol message JSON representation '{protocol_message}'. Error: {e}" )) })?; - let epoch_setting_id = row.read::(1); - let epoch_val = u64::try_from(epoch_setting_id) - .map_err(|e| panic!("Integer field open_message.epoch_setting_id (value={epoch_setting_id}) is incompatible with u64 Epoch representation. Error = {e}"))?; + let epoch_settings_id = row.read::(1); + let epoch_val = u64::try_from(epoch_settings_id) + .map_err(|e| panic!("Integer field open_message.epoch_setting_id (value={epoch_settings_id}) is incompatible with u64 Epoch representation. Error = {e}"))?; let beacon_str = Hydrator::read_signed_entity_beacon_column(&row, 2); let signed_entity_type_id = usize::try_from(row.read::(3)).map_err(|e| { panic!( diff --git a/mithril-aggregator/src/database/record/signer_registration.rs b/mithril-aggregator/src/database/record/signer_registration.rs index 1b51cc680f9..de29441bf95 100644 --- a/mithril-aggregator/src/database/record/signer_registration.rs +++ b/mithril-aggregator/src/database/record/signer_registration.rs @@ -14,7 +14,7 @@ pub struct SignerRegistrationRecord { pub signer_id: String, /// Epoch of creation of the signer_registration. - pub epoch_setting_id: Epoch, + pub epoch_settings_id: Epoch, /// Verification key of the signer pub verification_key: HexEncodedVerificationKey, @@ -39,7 +39,7 @@ impl SignerRegistrationRecord { pub(crate) fn from_signer_with_stake(other: SignerWithStake, epoch: Epoch) -> Self { SignerRegistrationRecord { signer_id: other.party_id, - epoch_setting_id: epoch, + epoch_settings_id: epoch, verification_key: other.verification_key.to_json_hex().unwrap(), verification_key_signature: other .verification_key_signature @@ -93,7 +93,7 @@ impl SqLiteEntity for SignerRegistrationRecord { Self: Sized, { let signer_id = row.read::<&str, _>(0).to_string(); - let epoch_setting_id_int = row.read::(1); + let epoch_settings_id_int = row.read::(1); let verification_key = row.read::<&str, _>(2).to_string(); let verification_key_signature = row.read::, _>(3).map(|s| s.to_owned()); let operational_certificate = row.read::, _>(4).map(|s| s.to_owned()); @@ -103,9 +103,9 @@ impl SqLiteEntity for SignerRegistrationRecord { let signer_registration_record = Self { signer_id, - epoch_setting_id: Epoch(epoch_setting_id_int.try_into().map_err(|e| { + epoch_settings_id: Epoch(epoch_settings_id_int.try_into().map_err(|e| { HydrationError::InvalidData(format!( - "Could not cast i64 ({epoch_setting_id_int}) to u64. Error: '{e}'" + "Could not cast i64 ({epoch_settings_id_int}) to u64. Error: '{e}'" )) })?), verification_key, diff --git a/mithril-aggregator/src/database/record/single_signature.rs b/mithril-aggregator/src/database/record/single_signature.rs index c273e9dcd91..e20ad0e9778 100644 --- a/mithril-aggregator/src/database/record/single_signature.rs +++ b/mithril-aggregator/src/database/record/single_signature.rs @@ -15,7 +15,7 @@ pub struct SingleSignatureRecord { pub signer_id: String, /// Registration epoch setting id - pub registration_epoch_setting_id: Epoch, + pub registration_epoch_settings_id: Epoch, /// Lottery indexes pub lottery_indexes: Vec, @@ -31,12 +31,12 @@ impl SingleSignatureRecord { pub(crate) fn try_from_single_signatures( other: &SingleSignatures, open_message_id: &Uuid, - registration_epoch_setting_id: Epoch, + registration_epoch_settings_id: Epoch, ) -> StdResult { let record = SingleSignatureRecord { open_message_id: open_message_id.to_owned(), signer_id: other.party_id.to_owned(), - registration_epoch_setting_id, + registration_epoch_settings_id, lottery_indexes: other.won_indexes.to_owned(), signature: other.signature.to_json_hex()?, created_at: Utc::now(), @@ -73,7 +73,7 @@ impl SqLiteEntity for SingleSignatureRecord { )) })?; let signer_id = row.read::<&str, _>(1).to_string(); - let registration_epoch_setting_id_int = row.read::(2); + let registration_epoch_settings_id_int = row.read::(2); let lottery_indexes_str = row.read::<&str, _>(3); let signature = row.read::<&str, _>(4).to_string(); let created_at = row.read::<&str, _>(5); @@ -81,10 +81,10 @@ impl SqLiteEntity for SingleSignatureRecord { let single_signature_record = Self { open_message_id, signer_id, - registration_epoch_setting_id: Epoch( - registration_epoch_setting_id_int.try_into().map_err(|e| { + registration_epoch_settings_id: Epoch( + registration_epoch_settings_id_int.try_into().map_err(|e| { HydrationError::InvalidData(format!( - "Could not cast i64 ({registration_epoch_setting_id_int}) to u64. Error: '{e}'" + "Could not cast i64 ({registration_epoch_settings_id_int}) to u64. Error: '{e}'" )) })?, ), diff --git a/mithril-aggregator/src/database/repository/epoch_settings_store.rs b/mithril-aggregator/src/database/repository/epoch_settings_store.rs index def0581f35b..32265ec810a 100644 --- a/mithril-aggregator/src/database/repository/epoch_settings_store.rs +++ b/mithril-aggregator/src/database/repository/epoch_settings_store.rs @@ -38,7 +38,7 @@ impl EpochSettingsStorer for EpochSettingsStore { epoch: Epoch, protocol_parameters: ProtocolParameters, ) -> StdResult> { - let epoch_setting_record = self + let epoch_settings_record = self .connection .fetch_first(UpdateEpochSettingsQuery::one(epoch, protocol_parameters)) .map_err(|e| { @@ -57,7 +57,7 @@ impl EpochSettingsStorer for EpochSettingsStore { .count(); } - Ok(Some(epoch_setting_record.protocol_parameters)) + Ok(Some(epoch_settings_record.protocol_parameters)) } async fn get_epoch_settings(&self, epoch: Epoch) -> StdResult> { @@ -66,8 +66,8 @@ impl EpochSettingsStorer for EpochSettingsStore { .fetch(GetEpochSettingsQuery::by_epoch(epoch)?) .map_err(|e| AdapterError::GeneralError(e.context("Could not get epoch settings")))?; - if let Some(epoch_setting_record) = cursor.next() { - return Ok(Some(epoch_setting_record.protocol_parameters)); + if let Some(epoch_settings_record) = cursor.next() { + return Ok(Some(epoch_settings_record.protocol_parameters)); } Ok(None) } @@ -83,18 +83,18 @@ mod tests { #[tokio::test] async fn save_protocol_parameters_prune_older_epoch_settings() { - const EPOCH_SETTING_PRUNE_EPOCH_THRESHOLD: u64 = 5; + const EPOCH_SETTINGS_PRUNE_EPOCH_THRESHOLD: u64 = 5; let connection = main_db_connection().unwrap(); insert_epoch_settings(&connection, &[1, 2]).unwrap(); let store = EpochSettingsStore::new( Arc::new(connection), - Some(EPOCH_SETTING_PRUNE_EPOCH_THRESHOLD), + Some(EPOCH_SETTINGS_PRUNE_EPOCH_THRESHOLD), ); store .save_epoch_settings( - Epoch(2) + EPOCH_SETTING_PRUNE_EPOCH_THRESHOLD, + Epoch(2) + EPOCH_SETTINGS_PRUNE_EPOCH_THRESHOLD, fake_data::protocol_parameters(), ) .await diff --git a/mithril-aggregator/src/database/test_helper.rs b/mithril-aggregator/src/database/test_helper.rs index 2a5b355a944..2a23491f1f3 100644 --- a/mithril-aggregator/src/database/test_helper.rs +++ b/mithril-aggregator/src/database/test_helper.rs @@ -82,7 +82,7 @@ pub fn setup_single_signature_records( single_signature_records.push(SingleSignatureRecord { open_message_id, signer_id: format!("signer-{signer_idx}"), - registration_epoch_setting_id: Epoch(epoch), + registration_epoch_settings_id: Epoch(epoch), lottery_indexes: (1..=single_signature_id).collect(), signature: fake_keys::single_signature()[3].to_string(), created_at: Utc::now(), @@ -124,7 +124,7 @@ pub fn insert_single_signatures_in_db( (2, single_signature_record.signer_id.into()), ( 3, - Value::Integer(*single_signature_record.registration_epoch_setting_id as i64), + Value::Integer(*single_signature_record.registration_epoch_settings_id as i64), ), ( 4, @@ -360,7 +360,7 @@ pub fn insert_signer_registrations( (1, signer_registration_record.signer_id.into()), ( 2, - Value::Integer(*signer_registration_record.epoch_setting_id as i64), + Value::Integer(*signer_registration_record.epoch_settings_id as i64), ), (3, signer_registration_record.verification_key.into()), ( From 178cb8919df3c9450a265237c6b3a37b39bb805d Mon Sep 17 00:00:00 2001 From: Damien Lachaume <135982616+dlachaume@users.noreply.github.com> Date: Mon, 23 Sep 2024 18:23:08 +0200 Subject: [PATCH 015/274] refactor: rename `epoch_setting` record filename to `epoch_settings` --- .../database/record/{epoch_setting.rs => epoch_settings.rs} | 0 mithril-aggregator/src/database/record/mod.rs | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) rename mithril-aggregator/src/database/record/{epoch_setting.rs => epoch_settings.rs} (100%) diff --git a/mithril-aggregator/src/database/record/epoch_setting.rs b/mithril-aggregator/src/database/record/epoch_settings.rs similarity index 100% rename from mithril-aggregator/src/database/record/epoch_setting.rs rename to mithril-aggregator/src/database/record/epoch_settings.rs diff --git a/mithril-aggregator/src/database/record/mod.rs b/mithril-aggregator/src/database/record/mod.rs index 7f65aedfcad..272732d476b 100644 --- a/mithril-aggregator/src/database/record/mod.rs +++ b/mithril-aggregator/src/database/record/mod.rs @@ -2,7 +2,7 @@ mod buffered_single_signature_record; mod certificate; -mod epoch_setting; +mod epoch_settings; mod open_message; mod open_message_with_single_signatures; mod signed_entity; @@ -13,7 +13,7 @@ mod stake_pool; pub use buffered_single_signature_record::*; pub use certificate::*; -pub use epoch_setting::*; +pub use epoch_settings::*; pub use open_message::*; pub use open_message_with_single_signatures::*; pub use signed_entity::*; From 6a00d0cdc9c19dc291e90dc8614f82b283731861 Mon Sep 17 00:00:00 2001 From: Damien Lachaume <135982616+dlachaume@users.noreply.github.com> Date: Tue, 24 Sep 2024 11:01:32 +0200 Subject: [PATCH 016/274] refactor: revert the renaming `EpochSettingsStorer` trait functions --- .../repository/epoch_settings_store.rs | 10 +++---- .../src/dependency_injection/containers.rs | 4 +-- mithril-aggregator/src/runtime/runner.rs | 2 +- .../src/services/epoch_service.rs | 6 ++-- .../src/store/epoch_settings_storer.rs | 28 +++++++++---------- mithril-aggregator/src/tools/genesis.rs | 4 +-- .../tests/test_extensions/runtime_tester.rs | 2 +- 7 files changed, 28 insertions(+), 28 deletions(-) diff --git a/mithril-aggregator/src/database/repository/epoch_settings_store.rs b/mithril-aggregator/src/database/repository/epoch_settings_store.rs index 32265ec810a..3f36682dd71 100644 --- a/mithril-aggregator/src/database/repository/epoch_settings_store.rs +++ b/mithril-aggregator/src/database/repository/epoch_settings_store.rs @@ -33,7 +33,7 @@ impl EpochSettingsStore { #[async_trait] impl EpochSettingsStorer for EpochSettingsStore { - async fn save_epoch_settings( + async fn save_protocol_parameters( &self, epoch: Epoch, protocol_parameters: ProtocolParameters, @@ -60,7 +60,7 @@ impl EpochSettingsStorer for EpochSettingsStore { Ok(Some(epoch_settings_record.protocol_parameters)) } - async fn get_epoch_settings(&self, epoch: Epoch) -> StdResult> { + async fn get_protocol_parameters(&self, epoch: Epoch) -> StdResult> { let mut cursor = self .connection .fetch(GetEpochSettingsQuery::by_epoch(epoch)?) @@ -93,14 +93,14 @@ mod tests { ); store - .save_epoch_settings( + .save_protocol_parameters( Epoch(2) + EPOCH_SETTINGS_PRUNE_EPOCH_THRESHOLD, fake_data::protocol_parameters(), ) .await .expect("saving protocol parameters should not fails"); - let epoch1_params = store.get_epoch_settings(Epoch(1)).await.unwrap(); - let epoch2_params = store.get_epoch_settings(Epoch(2)).await.unwrap(); + let epoch1_params = store.get_protocol_parameters(Epoch(1)).await.unwrap(); + let epoch2_params = store.get_protocol_parameters(Epoch(2)).await.unwrap(); assert!( epoch1_params.is_none(), diff --git a/mithril-aggregator/src/dependency_injection/containers.rs b/mithril-aggregator/src/dependency_injection/containers.rs index f2bbdf03700..0ac400dfb40 100644 --- a/mithril-aggregator/src/dependency_injection/containers.rs +++ b/mithril-aggregator/src/dependency_injection/containers.rs @@ -193,7 +193,7 @@ impl DependencyContainer { pub async fn init_state_from_fixture(&self, fixture: &MithrilFixture, target_epochs: &[Epoch]) { for epoch in target_epochs { self.epoch_settings_storer - .save_epoch_settings(*epoch, fixture.protocol_parameters()) + .save_protocol_parameters(*epoch, fixture.protocol_parameters()) .await .expect("save_protocol_parameters should not fail"); self.fill_verification_key_store(*epoch, &fixture.signers_with_stake()) @@ -241,7 +241,7 @@ impl DependencyContainer { epochs_to_save.push(epoch_to_sign.next()); for epoch in epochs_to_save { self.epoch_settings_storer - .save_epoch_settings(epoch, protocol_parameters.clone()) + .save_protocol_parameters(epoch, protocol_parameters.clone()) .await .expect("save_protocol_parameters should not fail"); } diff --git a/mithril-aggregator/src/runtime/runner.rs b/mithril-aggregator/src/runtime/runner.rs index a612faf8f78..544b7c6ae82 100644 --- a/mithril-aggregator/src/runtime/runner.rs +++ b/mithril-aggregator/src/runtime/runner.rs @@ -953,7 +953,7 @@ pub mod tests { .expect("update_protocol_parameters should not fail"); let saved_protocol_parameters = epoch_settings_storer - .get_epoch_settings(insert_epoch) + .get_protocol_parameters(insert_epoch) .await .unwrap() .unwrap_or_else(|| panic!("should have protocol parameters for epoch {insert_epoch}",)); diff --git a/mithril-aggregator/src/services/epoch_service.rs b/mithril-aggregator/src/services/epoch_service.rs index b3c829b0f63..fb5152eb1da 100644 --- a/mithril-aggregator/src/services/epoch_service.rs +++ b/mithril-aggregator/src/services/epoch_service.rs @@ -147,7 +147,7 @@ impl MithrilEpochService { ) -> StdResult { let parameters = self .epoch_settings_storer - .get_epoch_settings(epoch) + .get_protocol_parameters(epoch) .await .with_context(|| format!("Epoch service failed to obtain {name}"))? .ok_or(EpochServiceError::UnavailableData(epoch, name.to_string()))?; @@ -165,7 +165,7 @@ impl MithrilEpochService { ); self.epoch_settings_storer - .save_epoch_settings( + .save_protocol_parameters( recording_epoch, self.future_protocol_parameters.clone(), ) @@ -797,7 +797,7 @@ mod tests { let inserted_protocol_parameters = service .epoch_settings_storer - .get_epoch_settings(epoch.offset_to_protocol_parameters_recording_epoch()) + .get_protocol_parameters(epoch.offset_to_protocol_parameters_recording_epoch()) .await .unwrap_or_else(|_| { panic!( diff --git a/mithril-aggregator/src/store/epoch_settings_storer.rs b/mithril-aggregator/src/store/epoch_settings_storer.rs index 31e322b13dd..8c9fba6f234 100644 --- a/mithril-aggregator/src/store/epoch_settings_storer.rs +++ b/mithril-aggregator/src/store/epoch_settings_storer.rs @@ -11,14 +11,14 @@ use mithril_common::entities::{Epoch, ProtocolParameters}; #[async_trait] pub trait EpochSettingsStorer: Sync + Send { /// Save the given `ProtocolParameter` for the given [Epoch]. - async fn save_epoch_settings( + async fn save_protocol_parameters( &self, epoch: Epoch, protocol_parameters: ProtocolParameters, ) -> StdResult>; /// Get the saved `ProtocolParameter` for the given [Epoch] if any. - async fn get_epoch_settings(&self, epoch: Epoch) -> StdResult>; + async fn get_protocol_parameters(&self, epoch: Epoch) -> StdResult>; /// Handle discrepancies at startup in the protocol parameters store. /// In case an aggregator has been launched after some epochs of not being up or at initial startup, @@ -31,9 +31,9 @@ pub trait EpochSettingsStorer: Sync + Send { ) -> StdResult<()> { for epoch_offset in 0..=2 { let epoch = current_epoch + epoch_offset; - if self.get_epoch_settings(epoch).await?.is_none() { + if self.get_protocol_parameters(epoch).await?.is_none() { debug!("Handle discrepancies at startup of protocol parameters store, will record protocol parameters from the configuration for epoch {epoch}: {configuration_protocol_parameters:?}"); - self.save_epoch_settings(epoch, configuration_protocol_parameters.clone()) + self.save_protocol_parameters(epoch, configuration_protocol_parameters.clone()) .await?; } } @@ -58,7 +58,7 @@ impl FakeEpochSettingsStorer { #[async_trait] impl EpochSettingsStorer for FakeEpochSettingsStorer { - async fn save_epoch_settings( + async fn save_protocol_parameters( &self, epoch: Epoch, protocol_parameters: ProtocolParameters, @@ -67,7 +67,7 @@ impl EpochSettingsStorer for FakeEpochSettingsStorer { Ok(protocol_parameters_write.insert(epoch, protocol_parameters)) } - async fn get_epoch_settings(&self, epoch: Epoch) -> StdResult> { + async fn get_protocol_parameters(&self, epoch: Epoch) -> StdResult> { let protocol_parameters = self.protocol_parameters.read().await; Ok(protocol_parameters.get(&epoch).cloned()) } @@ -86,7 +86,7 @@ mod tests { let epoch = Epoch(1); let store = FakeEpochSettingsStorer::new(vec![]); let protocol_parameters_previous = store - .save_epoch_settings(epoch, protocol_parameters) + .save_protocol_parameters(epoch, protocol_parameters) .await .unwrap(); @@ -103,7 +103,7 @@ mod tests { ..protocol_parameters }; let protocol_parameters_previous = store - .save_epoch_settings(epoch, protocol_parameters_new) + .save_protocol_parameters(epoch, protocol_parameters_new) .await .unwrap(); @@ -115,7 +115,7 @@ mod tests { let protocol_parameters = fake_data::protocol_parameters(); let epoch = Epoch(1); let store = FakeEpochSettingsStorer::new(vec![(epoch, protocol_parameters.clone())]); - let protocol_parameters_stored = store.get_epoch_settings(epoch).await.unwrap(); + let protocol_parameters_stored = store.get_protocol_parameters(epoch).await.unwrap(); assert_eq!(Some(protocol_parameters), protocol_parameters_stored); } @@ -125,7 +125,7 @@ mod tests { let protocol_parameters = fake_data::protocol_parameters(); let epoch = Epoch(1); let store = FakeEpochSettingsStorer::new(vec![(epoch, protocol_parameters.clone())]); - let protocol_parameters_stored = store.get_epoch_settings(epoch + 1).await.unwrap(); + let protocol_parameters_stored = store.get_protocol_parameters(epoch + 1).await.unwrap(); assert!(protocol_parameters_stored.is_none()); } @@ -148,25 +148,25 @@ mod tests { .await .unwrap(); - let protocol_parameters_stored = store.get_epoch_settings(epoch).await.unwrap(); + let protocol_parameters_stored = store.get_protocol_parameters(epoch).await.unwrap(); assert_eq!( Some(protocol_parameters.clone()), protocol_parameters_stored ); - let protocol_parameters_stored = store.get_epoch_settings(epoch + 1).await.unwrap(); + let protocol_parameters_stored = store.get_protocol_parameters(epoch + 1).await.unwrap(); assert_eq!( Some(protocol_parameters.clone()), protocol_parameters_stored ); - let protocol_parameters_stored = store.get_epoch_settings(epoch + 2).await.unwrap(); + let protocol_parameters_stored = store.get_protocol_parameters(epoch + 2).await.unwrap(); assert_eq!( Some(protocol_parameters_new.clone()), protocol_parameters_stored ); - let protocol_parameters_stored = store.get_epoch_settings(epoch + 3).await.unwrap(); + let protocol_parameters_stored = store.get_protocol_parameters(epoch + 3).await.unwrap(); assert!(protocol_parameters_stored.is_none()); } } diff --git a/mithril-aggregator/src/tools/genesis.rs b/mithril-aggregator/src/tools/genesis.rs index a2419936dc6..98b7b6a7bbb 100644 --- a/mithril-aggregator/src/tools/genesis.rs +++ b/mithril-aggregator/src/tools/genesis.rs @@ -80,7 +80,7 @@ impl GenesisTools { let protocol_params_epoch = time_point.epoch.offset_to_signer_retrieval_epoch()?; let protocol_parameters = epoch_settings_storer - .get_epoch_settings(protocol_params_epoch) + .get_protocol_parameters(protocol_params_epoch) .await? .ok_or_else(|| { anyhow!("Missing protocol parameters for epoch {protocol_params_epoch}") @@ -88,7 +88,7 @@ impl GenesisTools { let genesis_avk_epoch = time_point.epoch.offset_to_next_signer_retrieval_epoch(); let genesis_avk_protocol_parameters = epoch_settings_storer - .get_epoch_settings(time_point.epoch.offset_to_signer_retrieval_epoch()?) + .get_protocol_parameters(time_point.epoch.offset_to_signer_retrieval_epoch()?) .await? .ok_or_else(|| anyhow!("Missing protocol parameters for epoch {genesis_avk_epoch}"))?; let genesis_signers = dependencies diff --git a/mithril-aggregator/tests/test_extensions/runtime_tester.rs b/mithril-aggregator/tests/test_extensions/runtime_tester.rs index 48af64819f2..e9fe84a3a9a 100644 --- a/mithril-aggregator/tests/test_extensions/runtime_tester.rs +++ b/mithril-aggregator/tests/test_extensions/runtime_tester.rs @@ -492,7 +492,7 @@ impl RuntimeTester { let protocol_parameters = self .dependencies .epoch_settings_storer - .get_epoch_settings(epoch.offset_to_recording_epoch()) + .get_protocol_parameters(epoch.offset_to_recording_epoch()) .await .with_context(|| "Querying the recording epoch protocol_parameters should not fail")? .ok_or(anyhow!( From d8880b4c24baef9e7e12e7f62c72fbf8808d1d47 Mon Sep 17 00:00:00 2001 From: Damien Lachaume <135982616+dlachaume@users.noreply.github.com> Date: Tue, 24 Sep 2024 16:08:16 +0200 Subject: [PATCH 017/274] chore: bump crates versions --- Cargo.lock | 6 +++--- mithril-aggregator/Cargo.toml | 2 +- mithril-common/Cargo.toml | 2 +- mithril-signer/Cargo.toml | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0e0db3deb74..44ce4e04ca9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3403,7 +3403,7 @@ dependencies = [ [[package]] name = "mithril-aggregator" -version = "0.5.65" +version = "0.5.66" dependencies = [ "anyhow", "async-trait", @@ -3559,7 +3559,7 @@ dependencies = [ [[package]] name = "mithril-common" -version = "0.4.55" +version = "0.4.56" dependencies = [ "anyhow", "async-trait", @@ -3703,7 +3703,7 @@ dependencies = [ [[package]] name = "mithril-signer" -version = "0.2.185" +version = "0.2.186" dependencies = [ "anyhow", "async-trait", diff --git a/mithril-aggregator/Cargo.toml b/mithril-aggregator/Cargo.toml index 0d011c61d3c..e52b7b4f686 100644 --- a/mithril-aggregator/Cargo.toml +++ b/mithril-aggregator/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-aggregator" -version = "0.5.65" +version = "0.5.66" description = "A Mithril Aggregator server" authors = { workspace = true } edition = { workspace = true } diff --git a/mithril-common/Cargo.toml b/mithril-common/Cargo.toml index b39512628fa..c559638a033 100644 --- a/mithril-common/Cargo.toml +++ b/mithril-common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-common" -version = "0.4.55" +version = "0.4.56" description = "Common types, interfaces, and utilities for Mithril nodes." authors = { workspace = true } edition = { workspace = true } diff --git a/mithril-signer/Cargo.toml b/mithril-signer/Cargo.toml index 3332d03edcf..0850cc95d96 100644 --- a/mithril-signer/Cargo.toml +++ b/mithril-signer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-signer" -version = "0.2.185" +version = "0.2.186" description = "A Mithril Signer" authors = { workspace = true } edition = { workspace = true } From 5c3117a8f9fdf41a739ca0565bd5e94c14340ada Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Mon, 23 Sep 2024 17:18:05 +0200 Subject: [PATCH 018/274] feat: add 'NextProtocolParameters' protocol message part key --- .../src/entities/protocol_message.rs | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/mithril-common/src/entities/protocol_message.rs b/mithril-common/src/entities/protocol_message.rs index 93b80111a8a..d7acb14a176 100644 --- a/mithril-common/src/entities/protocol_message.rs +++ b/mithril-common/src/entities/protocol_message.rs @@ -21,6 +21,12 @@ pub enum ProtocolMessagePartKey { #[serde(rename = "next_aggregate_verification_key")] NextAggregateVerificationKey, + /// The ProtocolMessage part key associated to the Next epoch protocol parameters + /// The protocol parameters that will be allowed to be used to sign during the next epoch + /// aka PPARAMS(n-1) + #[serde(rename = "next_protocol_parameters")] + NextProtocolParameters, + /// The ProtocolMessage part key associated to the latest block number signed #[serde(rename = "latest_block_number")] LatestBlockNumber, @@ -39,6 +45,7 @@ impl Display for ProtocolMessagePartKey { match *self { Self::SnapshotDigest => write!(f, "snapshot_digest"), Self::NextAggregateVerificationKey => write!(f, "next_aggregate_verification_key"), + Self::NextProtocolParameters => write!(f, "next_protocol_parameters"), Self::CardanoTransactionsMerkleRoot => write!(f, "cardano_transactions_merkle_root"), Self::LatestBlockNumber => write!(f, "latest_block_number"), Self::CardanoStakeDistributionEpoch => write!(f, "cardano_stake_distribution_epoch"), @@ -191,6 +198,20 @@ mod tests { assert_ne!(hash_expected, protocol_message_modified.compute_hash()); } + #[test] + fn test_protocol_message_compute_hash_include_next_protocol_parameters() { + let protocol_message = build_protocol_message_reference(); + let hash_expected = protocol_message.compute_hash(); + + let mut protocol_message_modified = protocol_message.clone(); + protocol_message_modified.set_message_part( + ProtocolMessagePartKey::NextProtocolParameters, + "latest-protocol-parameters-456".to_string(), + ); + + assert_ne!(hash_expected, protocol_message_modified.compute_hash()); + } + #[test] fn test_protocol_message_compute_hash_the_same_hash_with_same_protocol_message() { assert_eq!( @@ -209,6 +230,10 @@ mod tests { ProtocolMessagePartKey::NextAggregateVerificationKey, "next-avk-123".to_string(), ); + protocol_message.set_message_part( + ProtocolMessagePartKey::NextProtocolParameters, + "next-protocol-parameters-123".to_string(), + ); protocol_message.set_message_part( ProtocolMessagePartKey::CardanoTransactionsMerkleRoot, "ctx-merkle-root-123".to_string(), From 2a26b08f028a1b886b0fe9e65609c2823a70e5ad Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Mon, 23 Sep 2024 17:30:36 +0200 Subject: [PATCH 019/274] feat: compute the genesis protocol message with protocol parameters --- .../certificate_chain/certificate_genesis.rs | 42 ++++++++++++++++++- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/mithril-common/src/certificate_chain/certificate_genesis.rs b/mithril-common/src/certificate_chain/certificate_genesis.rs index d35626e74cf..9694196998c 100644 --- a/mithril-common/src/certificate_chain/certificate_genesis.rs +++ b/mithril-common/src/certificate_chain/certificate_genesis.rs @@ -41,6 +41,7 @@ impl CertificateGenesisProducer { /// Create the Genesis protocol message pub fn create_genesis_protocol_message( + genesis_protocol_paremeters: &ProtocolParameters, genesis_avk: &ProtocolAggregateVerificationKey, ) -> StdResult { let genesis_avk = genesis_avk.to_json_hex()?; @@ -49,6 +50,10 @@ impl CertificateGenesisProducer { ProtocolMessagePartKey::NextAggregateVerificationKey, genesis_avk, ); + protocol_message.set_message_part( + ProtocolMessagePartKey::NextProtocolParameters, + genesis_protocol_paremeters.compute_hash(), + ); Ok(protocol_message) } @@ -82,13 +87,14 @@ impl CertificateGenesisProducer { network, immutable_file_number, protocol_version, - protocol_parameters, + protocol_parameters.clone(), initiated_at, sealed_at, signers, ); let previous_hash = "".to_string(); - let genesis_protocol_message = Self::create_genesis_protocol_message(&genesis_avk)?; + let genesis_protocol_message = + Self::create_genesis_protocol_message(&protocol_parameters, &genesis_avk)?; Ok(Certificate::new( previous_hash, epoch, @@ -99,3 +105,35 @@ impl CertificateGenesisProducer { )) } } + +#[cfg(test)] +mod tests { + use super::*; + + use crate::{entities::ProtocolMessagePartKey, test_utils::MithrilFixtureBuilder}; + + #[test] + fn test_create_genesis_protocol_message_has_expected_keys_and_values() { + let fixture = MithrilFixtureBuilder::default().with_signers(5).build(); + let genesis_protocol_parameters = fixture.protocol_parameters(); + let genesis_avk = fixture.compute_avk(); + let protocol_message = CertificateGenesisProducer::create_genesis_protocol_message( + &genesis_protocol_parameters, + &genesis_avk, + ) + .unwrap(); + + let expected_genesis_avk_value = fixture.compute_and_encode_avk(); + assert_eq!( + protocol_message + .get_message_part(&ProtocolMessagePartKey::NextAggregateVerificationKey), + Some(&expected_genesis_avk_value) + ); + + let expected_genesis_protocol_parameters_value = genesis_protocol_parameters.compute_hash(); + assert_eq!( + protocol_message.get_message_part(&ProtocolMessagePartKey::NextProtocolParameters), + Some(&expected_genesis_protocol_parameters_value) + ); + } +} From 02ce17005507be3c61c5de538f75c8d5928895a9 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Mon, 23 Sep 2024 17:33:15 +0200 Subject: [PATCH 020/274] feat: update the genesis certificate tools to compute new protocol message --- mithril-aggregator/src/tools/genesis.rs | 44 ++++++++++--------------- 1 file changed, 18 insertions(+), 26 deletions(-) diff --git a/mithril-aggregator/src/tools/genesis.rs b/mithril-aggregator/src/tools/genesis.rs index 98b7b6a7bbb..98e7f935ecb 100644 --- a/mithril-aggregator/src/tools/genesis.rs +++ b/mithril-aggregator/src/tools/genesis.rs @@ -39,10 +39,10 @@ pub struct GenesisToolsDependency { } pub struct GenesisTools { - protocol_parameters: ProtocolParameters, network: CardanoNetwork, time_point: TimePoint, genesis_avk: ProtocolAggregateVerificationKey, + genesis_protocol_parameters: ProtocolParameters, genesis_verifier: Arc, certificate_verifier: Arc, certificate_repository: Arc, @@ -50,19 +50,19 @@ pub struct GenesisTools { impl GenesisTools { pub fn new( - protocol_parameters: ProtocolParameters, network: CardanoNetwork, time_point: TimePoint, genesis_avk: ProtocolAggregateVerificationKey, + genesis_protocol_parameters: ProtocolParameters, genesis_verifier: Arc, certificate_verifier: Arc, certificate_repository: Arc, ) -> Self { Self { - protocol_parameters, network, time_point, genesis_avk, + genesis_protocol_parameters, genesis_verifier, certificate_verifier, certificate_repository, @@ -72,20 +72,10 @@ impl GenesisTools { pub async fn from_dependencies(dependencies: GenesisToolsDependency) -> StdResult { let ticker_service = dependencies.ticker_service.clone(); let time_point = ticker_service.get_current_time_point().await?; - let genesis_verifier = dependencies.genesis_verifier.clone(); let certificate_verifier = dependencies.certificate_verifier.clone(); let certificate_repository = dependencies.certificate_repository.clone(); let epoch_settings_storer = dependencies.epoch_settings_storer.clone(); - - let protocol_params_epoch = time_point.epoch.offset_to_signer_retrieval_epoch()?; - let protocol_parameters = epoch_settings_storer - .get_protocol_parameters(protocol_params_epoch) - .await? - .ok_or_else(|| { - anyhow!("Missing protocol parameters for epoch {protocol_params_epoch}") - })?; - let genesis_avk_epoch = time_point.epoch.offset_to_next_signer_retrieval_epoch(); let genesis_avk_protocol_parameters = epoch_settings_storer .get_protocol_parameters(time_point.epoch.offset_to_signer_retrieval_epoch()?) @@ -98,17 +88,16 @@ impl GenesisTools { .ok_or_else(|| anyhow!("Missing signers for epoch {genesis_avk_epoch}"))?; let protocol_multi_signer = - SignerBuilder::new(&genesis_signers, &genesis_avk_protocol_parameters) + SignerBuilder::new(&genesis_signers, &genesis_protocol_parameters) .with_context(|| "Could not build a multi signer to compute the genesis avk")? .build_multi_signer(); - let genesis_avk = protocol_multi_signer.compute_aggregate_verification_key(); Ok(Self::new( - protocol_parameters, dependencies.network, time_point, genesis_avk, + genesis_protocol_parameters, genesis_verifier, certificate_verifier, certificate_repository, @@ -118,8 +107,10 @@ impl GenesisTools { /// Export AVK of the genesis stake distribution to a payload file pub fn export_payload_to_sign(&self, target_path: &Path) -> StdResult<()> { let mut target_file = File::create(target_path)?; - let protocol_message = - CertificateGenesisProducer::create_genesis_protocol_message(&self.genesis_avk)?; + let protocol_message = CertificateGenesisProducer::create_genesis_protocol_message( + &self.genesis_protocol_parameters, + &self.genesis_avk, + )?; target_file.write_all(protocol_message.compute_hash().as_bytes())?; Ok(()) } @@ -141,8 +132,10 @@ impl GenesisTools { genesis_signer: ProtocolGenesisSigner, ) -> StdResult<()> { let genesis_producer = CertificateGenesisProducer::new(Some(Arc::new(genesis_signer))); - let genesis_protocol_message = - CertificateGenesisProducer::create_genesis_protocol_message(&self.genesis_avk)?; + let genesis_protocol_message = CertificateGenesisProducer::create_genesis_protocol_message( + &self.genesis_protocol_parameters, + &self.genesis_avk, + )?; let genesis_signature = genesis_producer.sign_genesis_protocol_message(genesis_protocol_message)?; self.create_and_save_genesis_certificate(genesis_signature) @@ -183,7 +176,7 @@ impl GenesisTools { genesis_signature: ProtocolGenesisSignature, ) -> StdResult<()> { let genesis_certificate = CertificateGenesisProducer::create_genesis_certificate( - self.protocol_parameters.clone(), + self.genesis_protocol_parameters.clone(), self.network.to_string(), self.time_point.epoch, self.time_point.immutable_file_number, @@ -214,7 +207,7 @@ mod tests { use crate::database::test_helper::main_db_connection; use mithril_common::{ certificate_chain::MithrilCertificateVerifier, - crypto_helper::{ProtocolClerk, ProtocolGenesisSigner}, + crypto_helper::ProtocolGenesisSigner, test_utils::{fake_data, MithrilFixtureBuilder, TempDir}, }; use std::path::PathBuf; @@ -227,9 +220,8 @@ mod tests { fn create_fake_genesis_avk() -> ProtocolAggregateVerificationKey { let fixture = MithrilFixtureBuilder::default().with_signers(5).build(); - let first_signer = fixture.signers_fixture()[0].clone().protocol_signer; - let clerk = ProtocolClerk::from_signer(&first_signer); - clerk.compute_avk().into() + + fixture.compute_avk() } fn build_tools( @@ -249,10 +241,10 @@ mod tests { let genesis_avk = create_fake_genesis_avk(); let genesis_verifier = Arc::new(genesis_signer.create_genesis_verifier()); let genesis_tools = GenesisTools::new( - fake_data::protocol_parameters(), fake_data::network(), TimePoint::dummy(), genesis_avk, + fake_data::protocol_parameters(), genesis_verifier.clone(), certificate_verifier.clone(), certificate_store.clone(), From bddeee09a599b4aba3bfb89d8d2f2de1f8aee211 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Mon, 23 Sep 2024 17:34:34 +0200 Subject: [PATCH 021/274] feat: adapt test fixtures and certificate chain generation To use the new genesis certificate producer. --- mithril-common/src/crypto_helper/tests_setup.rs | 9 ++++++--- mithril-common/src/test_utils/mithril_fixture.rs | 7 +++++-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/mithril-common/src/crypto_helper/tests_setup.rs b/mithril-common/src/crypto_helper/tests_setup.rs index 733bda9f55c..040f9824cea 100644 --- a/mithril-common/src/crypto_helper/tests_setup.rs +++ b/mithril-common/src/crypto_helper/tests_setup.rs @@ -219,6 +219,7 @@ pub fn setup_certificate_chain( let next_fixture = fixture_per_epoch.get(&(epoch + 1)).unwrap(); let avk = avk_for_signers(&fixture.signers_fixture()); let next_avk = avk_for_signers(&next_fixture.signers_fixture()); + let next_protocol_parameters = &next_fixture.protocol_parameters(); let mut fake_certificate = { let mut base_certificate = fake_data::certificate(certificate_hash); base_certificate @@ -228,7 +229,6 @@ pub fn setup_certificate_chain( ProtocolMessagePartKey::NextAggregateVerificationKey, next_avk.to_json_hex().unwrap(), ); - Certificate { epoch, aggregate_verification_key: avk, @@ -247,8 +247,11 @@ pub fn setup_certificate_chain( match i { 0 => { let genesis_protocol_message = - CertificateGenesisProducer::create_genesis_protocol_message(&next_avk) - .unwrap(); + CertificateGenesisProducer::create_genesis_protocol_message( + next_protocol_parameters, + &next_avk, + ) + .unwrap(); let genesis_signature = genesis_producer .sign_genesis_protocol_message(genesis_protocol_message) .unwrap(); diff --git a/mithril-common/src/test_utils/mithril_fixture.rs b/mithril-common/src/test_utils/mithril_fixture.rs index 4c339834e65..9303b05c153 100644 --- a/mithril-common/src/test_utils/mithril_fixture.rs +++ b/mithril-common/src/test_utils/mithril_fixture.rs @@ -180,8 +180,11 @@ impl MithrilFixture { let genesis_avk = self.compute_avk(); let genesis_signer = ProtocolGenesisSigner::create_deterministic_genesis_signer(); let genesis_producer = CertificateGenesisProducer::new(Some(Arc::new(genesis_signer))); - let genesis_protocol_message = - CertificateGenesisProducer::create_genesis_protocol_message(&genesis_avk).unwrap(); + let genesis_protocol_message = CertificateGenesisProducer::create_genesis_protocol_message( + &self.protocol_parameters, + &genesis_avk, + ) + .unwrap(); let genesis_signature = genesis_producer .sign_genesis_protocol_message(genesis_protocol_message) .unwrap(); From d1e1ea9e327c9efd95df240897c11eefd2046b8e Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Tue, 24 Sep 2024 09:28:11 +0200 Subject: [PATCH 022/274] fix: typo in 'genesis_protocol_parameters' name --- mithril-common/src/certificate_chain/certificate_genesis.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mithril-common/src/certificate_chain/certificate_genesis.rs b/mithril-common/src/certificate_chain/certificate_genesis.rs index 9694196998c..c1e7df45f8f 100644 --- a/mithril-common/src/certificate_chain/certificate_genesis.rs +++ b/mithril-common/src/certificate_chain/certificate_genesis.rs @@ -41,7 +41,7 @@ impl CertificateGenesisProducer { /// Create the Genesis protocol message pub fn create_genesis_protocol_message( - genesis_protocol_paremeters: &ProtocolParameters, + genesis_protocol_parameters: &ProtocolParameters, genesis_avk: &ProtocolAggregateVerificationKey, ) -> StdResult { let genesis_avk = genesis_avk.to_json_hex()?; @@ -52,7 +52,7 @@ impl CertificateGenesisProducer { ); protocol_message.set_message_part( ProtocolMessagePartKey::NextProtocolParameters, - genesis_protocol_paremeters.compute_hash(), + genesis_protocol_parameters.compute_hash(), ); Ok(protocol_message) } From 71647dc26cfad5c566d0c764f24e4fa2ba04995a Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Tue, 24 Sep 2024 16:47:16 +0200 Subject: [PATCH 023/274] fix: handle merge conflicts with main branch --- mithril-aggregator/src/tools/genesis.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mithril-aggregator/src/tools/genesis.rs b/mithril-aggregator/src/tools/genesis.rs index 98e7f935ecb..bdf93db1fff 100644 --- a/mithril-aggregator/src/tools/genesis.rs +++ b/mithril-aggregator/src/tools/genesis.rs @@ -77,7 +77,7 @@ impl GenesisTools { let certificate_repository = dependencies.certificate_repository.clone(); let epoch_settings_storer = dependencies.epoch_settings_storer.clone(); let genesis_avk_epoch = time_point.epoch.offset_to_next_signer_retrieval_epoch(); - let genesis_avk_protocol_parameters = epoch_settings_storer + let genesis_protocol_parameters = epoch_settings_storer .get_protocol_parameters(time_point.epoch.offset_to_signer_retrieval_epoch()?) .await? .ok_or_else(|| anyhow!("Missing protocol parameters for epoch {genesis_avk_epoch}"))?; From b02872c4b70a1d5ba54d934377b3c6836ccc9539 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Tue, 24 Sep 2024 16:48:59 +0200 Subject: [PATCH 024/274] chore: better comment formatting in ProtocolMessagePartKey enum --- mithril-common/src/entities/protocol_message.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mithril-common/src/entities/protocol_message.rs b/mithril-common/src/entities/protocol_message.rs index d7acb14a176..81b3d473ed8 100644 --- a/mithril-common/src/entities/protocol_message.rs +++ b/mithril-common/src/entities/protocol_message.rs @@ -16,12 +16,14 @@ pub enum ProtocolMessagePartKey { CardanoTransactionsMerkleRoot, /// The ProtocolMessage part key associated to the Next epoch aggregate verification key + /// /// The AVK that will be allowed to be used to sign during the next epoch /// aka AVK(n-1) #[serde(rename = "next_aggregate_verification_key")] NextAggregateVerificationKey, /// The ProtocolMessage part key associated to the Next epoch protocol parameters + /// /// The protocol parameters that will be allowed to be used to sign during the next epoch /// aka PPARAMS(n-1) #[serde(rename = "next_protocol_parameters")] From 477ad3d5b51e82be58fa0ae716897a293fd23786 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Tue, 24 Sep 2024 16:55:24 +0200 Subject: [PATCH 025/274] docs: update CHANGELOG --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 10d07eabee6..19c0b4a5d95 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,8 @@ As a minor extension, we have adopted a slightly different versioning convention - Support for new `Pythagoras` Mithril era. +- Support for signing the protocol parameters in the Genesis certificate. + - Crates versions: | Crate | Version | From 9c62875137dd0c78d54389d8c25c2da65110bcfa Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Tue, 24 Sep 2024 17:01:01 +0200 Subject: [PATCH 026/274] chore: bump crates versions - 'mithril-aggregator' from '0.5.66' to '0.5.67' - 'mithril-common' from '0.4.56' to '0.4.57'. --- Cargo.lock | 4 ++-- mithril-aggregator/Cargo.toml | 2 +- mithril-common/Cargo.toml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 44ce4e04ca9..7731da10efd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3403,7 +3403,7 @@ dependencies = [ [[package]] name = "mithril-aggregator" -version = "0.5.66" +version = "0.5.67" dependencies = [ "anyhow", "async-trait", @@ -3559,7 +3559,7 @@ dependencies = [ [[package]] name = "mithril-common" -version = "0.4.56" +version = "0.4.57" dependencies = [ "anyhow", "async-trait", diff --git a/mithril-aggregator/Cargo.toml b/mithril-aggregator/Cargo.toml index e52b7b4f686..a61d19ae513 100644 --- a/mithril-aggregator/Cargo.toml +++ b/mithril-aggregator/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-aggregator" -version = "0.5.66" +version = "0.5.67" description = "A Mithril Aggregator server" authors = { workspace = true } edition = { workspace = true } diff --git a/mithril-common/Cargo.toml b/mithril-common/Cargo.toml index c559638a033..abe516931bf 100644 --- a/mithril-common/Cargo.toml +++ b/mithril-common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-common" -version = "0.4.56" +version = "0.4.57" description = "Common types, interfaces, and utilities for Mithril nodes." authors = { workspace = true } edition = { workspace = true } From a81db87eb60919402c52bd5626c03047cfc366e1 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Fri, 20 Sep 2024 18:28:51 +0200 Subject: [PATCH 027/274] feat: introduce SignableSeedBuilder trait Which is responsible for computing the seed message that will be used by signable builders to compute their respective protocol messages. --- mithril-common/src/signable_builder/interface.rs | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/mithril-common/src/signable_builder/interface.rs b/mithril-common/src/signable_builder/interface.rs index 95f2d522571..94bf6f0a951 100644 --- a/mithril-common/src/signable_builder/interface.rs +++ b/mithril-common/src/signable_builder/interface.rs @@ -16,7 +16,7 @@ pub trait Artifact: Debug + Send + Sync { fn get_id(&self) -> String; } -/// SignableBuilder is trait for building a protocol message for a beacon +/// SignableBuilder is a trait for building a protocol message for a beacon #[cfg_attr(test, automock)] #[async_trait] pub trait SignableBuilder: Send + Sync @@ -24,5 +24,17 @@ where U: Beacon, { /// Compute a protocol message - async fn compute_protocol_message(&self, beacon: U) -> StdResult; + async fn compute_protocol_message( + &self, + beacon: U, + seed_protocol_message: ProtocolMessage, + ) -> StdResult; +} + +/// SignableSeedBuilder is a trait for building a seed protocol message +#[cfg_attr(test, automock)] +#[async_trait] +pub trait SignableSeedBuilder: Send + Sync { + /// Compute seed protocol message + async fn compute_seed_protocol_message(&self) -> StdResult; } From 01e6ac84bf27f43f4f08cb37e4bd52bb8f96ee9f Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Fri, 20 Sep 2024 18:30:22 +0200 Subject: [PATCH 028/274] feat: make SignableBuilder service use SignableSeedBuilder --- .../signable_builder_service.rs | 64 +++++++++++++++---- 1 file changed, 50 insertions(+), 14 deletions(-) diff --git a/mithril-common/src/signable_builder/signable_builder_service.rs b/mithril-common/src/signable_builder/signable_builder_service.rs index dd818d3e631..f8aeb3e4e36 100644 --- a/mithril-common/src/signable_builder/signable_builder_service.rs +++ b/mithril-common/src/signable_builder/signable_builder_service.rs @@ -4,7 +4,7 @@ use std::sync::Arc; use crate::{ entities::{BlockNumber, CardanoDbBeacon, Epoch, ProtocolMessage, SignedEntityType}, - signable_builder::SignableBuilder, + signable_builder::{SignableBuilder, SignableSeedBuilder}, StdResult, }; @@ -24,6 +24,7 @@ pub trait SignableBuilderService: Send + Sync { /// Mithril Signable Builder Service pub struct MithrilSignableBuilderService { + seed_signable_builder: Arc, mithril_stake_distribution_builder: Arc>, immutable_signable_builder: Arc>, cardano_transactions_signable_builder: Arc>, @@ -33,12 +34,14 @@ pub struct MithrilSignableBuilderService { impl MithrilSignableBuilderService { /// MithrilSignableBuilderService factory pub fn new( + seed_signable_builder: Arc, mithril_stake_distribution_builder: Arc>, immutable_signable_builder: Arc>, cardano_transactions_signable_builder: Arc>, cardano_stake_distribution_builder: Arc>, ) -> Self { Self { + seed_signable_builder, mithril_stake_distribution_builder, immutable_signable_builder, cardano_transactions_signable_builder, @@ -53,29 +56,33 @@ impl SignableBuilderService for MithrilSignableBuilderService { &self, signed_entity_type: SignedEntityType, ) -> StdResult { + let seed_protocol_message = self + .seed_signable_builder + .compute_seed_protocol_message() + .await?; let protocol_message = match signed_entity_type { SignedEntityType::MithrilStakeDistribution(e) => self .mithril_stake_distribution_builder - .compute_protocol_message(e) + .compute_protocol_message(e, seed_protocol_message) .await .with_context(|| format!( "Signable builder service can not compute protocol message with epoch: '{e}'" ))?, SignedEntityType::CardanoImmutableFilesFull(beacon) => self .immutable_signable_builder - .compute_protocol_message(beacon.clone()) + .compute_protocol_message(beacon.clone(), seed_protocol_message) .await .with_context(|| format!( "Signable builder service can not compute protocol message with beacon: '{beacon}'" ))?, SignedEntityType::CardanoStakeDistribution(e) => self .cardano_stake_distribution_builder - .compute_protocol_message(e) + .compute_protocol_message(e, seed_protocol_message) .await .with_context(|| "Signable builder service can not compute protocol message for Cardano stake distribution with epoch: '{e}")?, SignedEntityType::CardanoTransactions(_, block_number) => self .cardano_transactions_signable_builder - .compute_protocol_message(block_number) + .compute_protocol_message(block_number, seed_protocol_message) .await .with_context(|| format!( "Signable builder service can not compute protocol message with block_number: '{block_number}'" @@ -105,8 +112,16 @@ mod tests { #[async_trait] impl SignableBuilder for SignableBuilderImpl where U: Beaconnable, { + async fn compute_protocol_message(&self, beacon: U, seed_protocol_message: ProtocolMessage) -> StdResult; + } + } + + mock! { + SignableSeedBuilderImpl { } - async fn compute_protocol_message(&self, beacon: U) -> StdResult; + #[async_trait] + impl SignableSeedBuilder for SignableSeedBuilderImpl { + async fn compute_seed_protocol_message(&self) -> StdResult; } } @@ -115,13 +130,17 @@ mod tests { ) { let protocol_message = ProtocolMessage::new(); let protocol_message_clone = protocol_message.clone(); + let mut mock_signable_seed_builder = MockSignableSeedBuilderImpl::new(); + mock_signable_seed_builder + .expect_compute_seed_protocol_message() + .once() + .return_once(move || Ok(ProtocolMessage::new())); let mut mock_mithril_stake_distribution_signable_builder = MockSignableBuilderImpl::::new(); mock_mithril_stake_distribution_signable_builder .expect_compute_protocol_message() .once() - .return_once(move |_| Ok(protocol_message_clone)); - + .return_once(move |_, _| Ok(protocol_message_clone)); let mock_cardano_immutable_files_full_signable_builder = MockSignableBuilderImpl::::new(); let mock_cardano_transactions_signable_builder = @@ -129,7 +148,9 @@ mod tests { let mock_cardano_stake_distribution_signable_builder = MockSignableBuilderImpl::::new(); + // TODO: refactor mock builders let signable_builder_service = MithrilSignableBuilderService::new( + Arc::new(mock_signable_seed_builder), Arc::new(mock_mithril_stake_distribution_signable_builder), Arc::new(mock_cardano_immutable_files_full_signable_builder), Arc::new(mock_cardano_transactions_signable_builder), @@ -147,21 +168,26 @@ mod tests { async fn build_snapshot_signable_when_given_cardano_immutable_files_full_entity_type() { let protocol_message = ProtocolMessage::new(); let protocol_message_clone = protocol_message.clone(); + let mut mock_signable_seed_builder = MockSignableSeedBuilderImpl::new(); + mock_signable_seed_builder + .expect_compute_seed_protocol_message() + .once() + .return_once(move || Ok(ProtocolMessage::new())); let mock_mithril_stake_distribution_signable_builder = MockSignableBuilderImpl::::new(); - let mut mock_cardano_immutable_files_full_signable_builder = MockSignableBuilderImpl::::new(); mock_cardano_immutable_files_full_signable_builder .expect_compute_protocol_message() .once() - .return_once(move |_| Ok(protocol_message_clone)); + .return_once(move |_, _| Ok(protocol_message_clone)); let mock_cardano_transactions_signable_builder = MockSignableBuilderImpl::::new(); let mock_cardano_stake_distribution_signable_builder = MockSignableBuilderImpl::::new(); let signable_builder_service = MithrilSignableBuilderService::new( + Arc::new(mock_signable_seed_builder), Arc::new(mock_mithril_stake_distribution_signable_builder), Arc::new(mock_cardano_immutable_files_full_signable_builder), Arc::new(mock_cardano_transactions_signable_builder), @@ -180,9 +206,13 @@ mod tests { async fn build_transactions_signable_when_given_cardano_transactions_entity_type() { let protocol_message = ProtocolMessage::new(); let protocol_message_clone = protocol_message.clone(); + let mut mock_signable_seed_builder = MockSignableSeedBuilderImpl::new(); + mock_signable_seed_builder + .expect_compute_seed_protocol_message() + .once() + .return_once(move || Ok(ProtocolMessage::new())); let mock_mithril_stake_distribution_signable_builder = MockSignableBuilderImpl::::new(); - let mock_cardano_immutable_files_full_signable_builder = MockSignableBuilderImpl::::new(); let mut mock_cardano_transactions_signable_builder = @@ -190,11 +220,12 @@ mod tests { mock_cardano_transactions_signable_builder .expect_compute_protocol_message() .once() - .return_once(move |_| Ok(protocol_message_clone)); + .return_once(move |_, _| Ok(protocol_message_clone)); let mock_cardano_stake_distribution_signable_builder = MockSignableBuilderImpl::::new(); let signable_builder_service = MithrilSignableBuilderService::new( + Arc::new(mock_signable_seed_builder), Arc::new(mock_mithril_stake_distribution_signable_builder), Arc::new(mock_cardano_immutable_files_full_signable_builder), Arc::new(mock_cardano_transactions_signable_builder), @@ -213,21 +244,26 @@ mod tests { ) { let protocol_message = ProtocolMessage::new(); let protocol_message_clone = protocol_message.clone(); + let mut mock_signable_seed_builder = MockSignableSeedBuilderImpl::new(); + mock_signable_seed_builder + .expect_compute_seed_protocol_message() + .once() + .return_once(move || Ok(ProtocolMessage::new())); let mock_mithril_stake_distribution_signable_builder = MockSignableBuilderImpl::::new(); let mock_cardano_immutable_files_full_signable_builder = MockSignableBuilderImpl::::new(); let mock_cardano_transactions_signable_builder = MockSignableBuilderImpl::::new(); - let mut mock_cardano_stake_distribution_signable_builder = MockSignableBuilderImpl::::new(); mock_cardano_stake_distribution_signable_builder .expect_compute_protocol_message() .once() - .return_once(move |_| Ok(protocol_message_clone)); + .return_once(move |_, _| Ok(protocol_message_clone)); let signable_builder_service = MithrilSignableBuilderService::new( + Arc::new(mock_signable_seed_builder), Arc::new(mock_mithril_stake_distribution_signable_builder), Arc::new(mock_cardano_immutable_files_full_signable_builder), Arc::new(mock_cardano_transactions_signable_builder), From 1e0afa7fb947d6209d60730483501cbe170f5205 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Fri, 20 Sep 2024 18:32:32 +0200 Subject: [PATCH 029/274] chore: adapt CardanoTransactionsSignableBuilder to updated SignableBuilder trait --- .../src/messages/cardano_transactions_proof.rs | 3 ++- .../src/signable_builder/cardano_transactions.rs | 14 ++++++++++---- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/mithril-common/src/messages/cardano_transactions_proof.rs b/mithril-common/src/messages/cardano_transactions_proof.rs index b2175bf931e..65a9bd63906 100644 --- a/mithril-common/src/messages/cardano_transactions_proof.rs +++ b/mithril-common/src/messages/cardano_transactions_proof.rs @@ -390,6 +390,7 @@ mod tests { transactions: &[CardanoTransaction], block_number: BlockNumber, ) -> ProtocolMessage { + let seed_protocol_message = ProtocolMessage::new(); let mut transaction_importer = MockTransactionsImporter::new(); transaction_importer .expect_import() @@ -419,7 +420,7 @@ mod tests { Logger::root(slog::Discard, slog::o!()), ); cardano_transaction_signable_builder - .compute_protocol_message(block_number) + .compute_protocol_message(block_number, seed_protocol_message) .await .unwrap() } diff --git a/mithril-common/src/signable_builder/cardano_transactions.rs b/mithril-common/src/signable_builder/cardano_transactions.rs index 7b99884ad6a..bc84789b5f0 100644 --- a/mithril-common/src/signable_builder/cardano_transactions.rs +++ b/mithril-common/src/signable_builder/cardano_transactions.rs @@ -73,7 +73,11 @@ impl CardanoTransactionsSignableBuilder { #[async_trait] impl SignableBuilder for CardanoTransactionsSignableBuilder { - async fn compute_protocol_message(&self, beacon: BlockNumber) -> StdResult { + async fn compute_protocol_message( + &self, + beacon: BlockNumber, + seed_protocol_message: ProtocolMessage, + ) -> StdResult { debug!( self.logger, "Compute protocol message for CardanoTransactions at block_number: {beacon}" @@ -87,7 +91,7 @@ impl SignableBuilder for CardanoTransactionsSignab .await? .compute_root()?; - let mut protocol_message = ProtocolMessage::new(); + let mut protocol_message = seed_protocol_message; protocol_message.set_message_part( ProtocolMessagePartKey::CardanoTransactionsMerkleRoot, mk_root.to_hex(), @@ -128,6 +132,7 @@ mod tests { async fn test_compute_signable() { // Arrange let block_number = BlockNumber(1453); + let seed_protocol_message = ProtocolMessage::new(); let transactions = CardanoTransactionsBuilder::new().build_transactions(3); let mk_map = compute_mk_map_from_transactions(transactions.clone()); let mut transaction_importer = MockTransactionsImporter::new(); @@ -148,7 +153,7 @@ mod tests { // Action let signable = cardano_transactions_signable_builder - .compute_protocol_message(block_number) + .compute_protocol_message(block_number, seed_protocol_message) .await .unwrap(); @@ -168,6 +173,7 @@ mod tests { #[tokio::test] async fn test_compute_signable_with_no_block_range_root_return_error() { let block_number = BlockNumber(50); + let seed_protocol_message = ProtocolMessage::new(); let mut transaction_importer = MockTransactionsImporter::new(); transaction_importer.expect_import().return_once(|_| Ok(())); let mut block_range_root_retriever = MockBlockRangeRootRetriever::new(); @@ -181,7 +187,7 @@ mod tests { ); let result = cardano_transactions_signable_builder - .compute_protocol_message(block_number) + .compute_protocol_message(block_number, seed_protocol_message) .await; assert!(result.is_err()); From e4d4a4e8d536faf8b4098240db3c574fabfcfed6 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Fri, 20 Sep 2024 18:33:38 +0200 Subject: [PATCH 030/274] chore: adapt CardanoImmutableFilesFullSignableBuilder to updated SignableBuilder trait --- .../cardano_immutable_full_signable_builder.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mithril-common/src/signable_builder/cardano_immutable_full_signable_builder.rs b/mithril-common/src/signable_builder/cardano_immutable_full_signable_builder.rs index 8f107263dcc..6a8926356fa 100644 --- a/mithril-common/src/signable_builder/cardano_immutable_full_signable_builder.rs +++ b/mithril-common/src/signable_builder/cardano_immutable_full_signable_builder.rs @@ -41,6 +41,7 @@ impl SignableBuilder for CardanoImmutableFilesFullSignableBuild async fn compute_protocol_message( &self, beacon: CardanoDbBeacon, + seed_protocol_message: ProtocolMessage, ) -> StdResult { debug!(self.logger, "compute_signable({beacon:?})"); let digest = self @@ -54,7 +55,7 @@ impl SignableBuilder for CardanoImmutableFilesFullSignableBuild ) })?; info!(self.logger, "digest = '{digest}'."); - let mut protocol_message = ProtocolMessage::new(); + let mut protocol_message = seed_protocol_message; protocol_message.set_message_part(ProtocolMessagePartKey::SnapshotDigest, digest); Ok(protocol_message) @@ -94,8 +95,9 @@ mod tests { Path::new(""), TestLogger::stdout(), ); + let seed_protocol_message = ProtocolMessage::new(); let protocol_message = signable_builder - .compute_protocol_message(CardanoDbBeacon::default()) + .compute_protocol_message(CardanoDbBeacon::default(), seed_protocol_message) .await .unwrap(); From ca183be22fd9f7067c96f6d9b588ea815fda2e4e Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Fri, 20 Sep 2024 18:34:10 +0200 Subject: [PATCH 031/274] chore: adapt CardanoStakeDistributionSignableBuilder to updated SignableBuilder trait --- .../signable_builder/cardano_stake_distribution.rs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/mithril-common/src/signable_builder/cardano_stake_distribution.rs b/mithril-common/src/signable_builder/cardano_stake_distribution.rs index 65e6dcf99b1..35039ece097 100644 --- a/mithril-common/src/signable_builder/cardano_stake_distribution.rs +++ b/mithril-common/src/signable_builder/cardano_stake_distribution.rs @@ -63,7 +63,11 @@ impl CardanoStakeDistributionSignableBuilder { #[async_trait] impl SignableBuilder for CardanoStakeDistributionSignableBuilder { - async fn compute_protocol_message(&self, epoch: Epoch) -> StdResult { + async fn compute_protocol_message( + &self, + epoch: Epoch, + seed_protocol_message: ProtocolMessage, + ) -> StdResult { let pools_with_stake = self .cardano_stake_distribution_retriever .retrieve(epoch.offset_to_cardano_stake_distribution_snapshot_epoch()) @@ -73,7 +77,7 @@ impl SignableBuilder for CardanoStakeDistributionSignableBuilder { let mk_tree = Self::compute_merkle_tree_from_stake_distribution(pools_with_stake)?; - let mut protocol_message = ProtocolMessage::new(); + let mut protocol_message = seed_protocol_message; protocol_message.set_message_part( ProtocolMessagePartKey::CardanoStakeDistributionEpoch, epoch.to_string(), @@ -142,6 +146,7 @@ mod tests { #[tokio::test] async fn compute_protocol_message_returns_error_when_no_cardano_stake_distribution_found() { let epoch = Epoch(1); + let seed_protocol_message = ProtocolMessage::new(); let mut cardano_stake_distribution_retriever = MockStakeDistributionRetriever::new(); cardano_stake_distribution_retriever @@ -153,7 +158,7 @@ mod tests { )); cardano_stake_distribution_signable_builder - .compute_protocol_message(epoch) + .compute_protocol_message(epoch, seed_protocol_message) .await .expect_err("Should return an error when no cardano stake distribution found"); } @@ -164,6 +169,7 @@ mod tests { let epoch_to_retrieve = Epoch(3); let stake_distribution = StakeDistribution::from([("pool-123".to_string(), 100)]); let stake_distribution_clone = stake_distribution.clone(); + let seed_protocol_message = ProtocolMessage::new(); let mut pools_with_stake_retriever = MockStakeDistributionRetriever::new(); pools_with_stake_retriever @@ -174,7 +180,7 @@ mod tests { CardanoStakeDistributionSignableBuilder::new(Arc::new(pools_with_stake_retriever)); let signable = cardano_stake_distribution_signable_builder - .compute_protocol_message(epoch) + .compute_protocol_message(epoch, seed_protocol_message) .await .unwrap(); From 5e3a66caef8ade2273a7af7239aad09684bd1c33 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Fri, 20 Sep 2024 18:34:34 +0200 Subject: [PATCH 032/274] chore: adapt MithrilStakeDistributionSignableBuilder to updated SignableBuilder trait --- .../signable_builder/mithril_stake_distribution.rs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/mithril-common/src/signable_builder/mithril_stake_distribution.rs b/mithril-common/src/signable_builder/mithril_stake_distribution.rs index b4fe3365ccb..0644cbe559a 100644 --- a/mithril-common/src/signable_builder/mithril_stake_distribution.rs +++ b/mithril-common/src/signable_builder/mithril_stake_distribution.rs @@ -12,9 +12,12 @@ pub struct MithrilStakeDistributionSignableBuilder {} #[async_trait] impl SignableBuilder for MithrilStakeDistributionSignableBuilder { - // We just need to return an empty protocol message as the next AVK will be appended by the signing engine automatically - async fn compute_protocol_message(&self, _beacon: Epoch) -> StdResult { - Ok(ProtocolMessage::new()) + async fn compute_protocol_message( + &self, + _beacon: Epoch, + seed_protocol_message: ProtocolMessage, + ) -> StdResult { + Ok(seed_protocol_message) } } @@ -24,10 +27,11 @@ mod tests { #[tokio::test] async fn test_compute_signable() { + let seed_protocol_message = ProtocolMessage::new(); let mithril_stake_distribution_signable_builder = MithrilStakeDistributionSignableBuilder::default(); let signable = mithril_stake_distribution_signable_builder - .compute_protocol_message(Epoch(1)) + .compute_protocol_message(Epoch(1), seed_protocol_message) .await .unwrap(); let signable_expected = ProtocolMessage::new(); From 6a7b55458a651c343c9c2f8e9cf81f5de26722f5 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Fri, 20 Sep 2024 18:35:52 +0200 Subject: [PATCH 033/274] feat: add SignableSeedBuilderService in aggregator --- mithril-aggregator/src/services/mod.rs | 2 + .../src/services/signable_seed_builder.rs | 56 +++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 mithril-aggregator/src/services/signable_seed_builder.rs diff --git a/mithril-aggregator/src/services/mod.rs b/mithril-aggregator/src/services/mod.rs index 73767b5efe3..14ef4733886 100644 --- a/mithril-aggregator/src/services/mod.rs +++ b/mithril-aggregator/src/services/mod.rs @@ -14,6 +14,7 @@ mod certifier; mod epoch_service; mod message; mod prover; +mod signable_seed_builder; mod signed_entity; mod stake_distribution; mod upkeep; @@ -23,6 +24,7 @@ pub use certifier::*; pub use epoch_service::*; pub use message::*; pub use prover::*; +pub use signable_seed_builder::*; pub use signed_entity::*; pub use stake_distribution::*; pub use upkeep::*; diff --git a/mithril-aggregator/src/services/signable_seed_builder.rs b/mithril-aggregator/src/services/signable_seed_builder.rs new file mode 100644 index 00000000000..fe5e5ead327 --- /dev/null +++ b/mithril-aggregator/src/services/signable_seed_builder.rs @@ -0,0 +1,56 @@ +//! ## SignableSeedBuilderService +//! +//! This service is responsible for computing the seed protocol message +//! that is used by the [SignableBuilder] to compute the final protocol message. +//! +use anyhow::Context; +use async_trait::async_trait; +use std::sync::Arc; +use tokio::sync::RwLock; + +use mithril_common::{ + entities::{ProtocolMessage, ProtocolMessagePartKey}, + signable_builder::SignableSeedBuilder, + StdResult, +}; + +use crate::services::EpochService; + +/// SignableSeedBuilder service +pub struct SignableSeedBuilderService { + epoch_service: Arc>, +} + +impl SignableSeedBuilderService { + /// SignableSeedBuilderService factory + pub fn new(epoch_service: Arc>) -> Self { + Self { epoch_service } + } +} + +#[async_trait] +impl SignableSeedBuilder for SignableSeedBuilderService { + /// Compute seed protocol message + async fn compute_seed_protocol_message(&self) -> StdResult { + let epoch_service = self.epoch_service.read().await; + let mut protocol_message = ProtocolMessage::new(); + protocol_message.set_message_part( + ProtocolMessagePartKey::NextAggregateVerificationKey, + (*epoch_service) + .next_aggregate_verification_key()? + .to_json_hex() + .with_context(|| "convert next avk to json hex failure")? + .to_string(), + ); + + Ok(protocol_message) + } +} + +#[cfg(test)] +mod tests { + #[test] + fn test_compute_seed_protocol_message() { + // TODO: implement test + } +} From 0336a6cc78beab6e44c35113db34b73ce0fa13d7 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Fri, 20 Sep 2024 18:36:49 +0200 Subject: [PATCH 034/274] feat: wire SignableSeedBuilderService in aggregator DI --- .../src/dependency_injection/builder.rs | 44 ++++++++++++++++--- 1 file changed, 39 insertions(+), 5 deletions(-) diff --git a/mithril-aggregator/src/dependency_injection/builder.rs b/mithril-aggregator/src/dependency_injection/builder.rs index 958b4892ed9..fbda8d42c9d 100644 --- a/mithril-aggregator/src/dependency_injection/builder.rs +++ b/mithril-aggregator/src/dependency_injection/builder.rs @@ -40,7 +40,8 @@ use mithril_common::{ signable_builder::{ CardanoImmutableFilesFullSignableBuilder, CardanoStakeDistributionSignableBuilder, CardanoTransactionsSignableBuilder, MithrilSignableBuilderService, - MithrilStakeDistributionSignableBuilder, SignableBuilderService, TransactionsImporter, + MithrilStakeDistributionSignableBuilder, SignableBuilderService, SignableSeedBuilder, + TransactionsImporter, }, signed_entity_type_lock::SignedEntityTypeLock, MithrilTickerService, TickerService, @@ -69,8 +70,8 @@ use crate::{ AggregatorUpkeepService, BufferedCertifierService, CardanoTransactionsImporter, CertifierService, MessageService, MithrilCertifierService, MithrilEpochService, MithrilMessageService, MithrilProverService, MithrilSignedEntityService, - MithrilStakeDistributionService, ProverService, SignedEntityService, - StakeDistributionService, UpkeepService, + MithrilStakeDistributionService, ProverService, SignableSeedBuilderService, + SignedEntityService, StakeDistributionService, UpkeepService, }, tools::{CExplorerSignerRetriever, GcpFileUploader, GenesisToolsDependency, SignersImporter}, AggregatorConfig, AggregatorRunner, AggregatorRuntime, CertificatePendingStore, @@ -202,6 +203,9 @@ pub struct DependenciesBuilder { /// Signer Store pub signer_store: Option>, + /// Signable Seed Builder Service + pub signable_seed_builder_service: Option>, + /// Signable Builder Service pub signable_builder_service: Option>, @@ -274,6 +278,7 @@ impl DependenciesBuilder { stake_distribution_service: None, ticker_service: None, signer_store: None, + signable_seed_builder_service: None, signable_builder_service: None, signed_entity_service: None, certifier_service: None, @@ -1079,6 +1084,7 @@ impl DependenciesBuilder { } async fn build_signable_builder_service(&mut self) -> Result> { + let seed_signable_builder = self.get_signable_seed_builder_service().await?; let mithril_stake_distribution_builder = Arc::new(MithrilStakeDistributionSignableBuilder::default()); let immutable_signable_builder = Arc::new(CardanoImmutableFilesFullSignableBuilder::new( @@ -1099,6 +1105,7 @@ impl DependenciesBuilder { CardanoStakeDistributionSignableBuilder::new(self.get_stake_store().await?), ); let signable_builder_service = Arc::new(MithrilSignableBuilderService::new( + seed_signable_builder, mithril_stake_distribution_builder, immutable_signable_builder, cardano_transactions_builder, @@ -1119,11 +1126,38 @@ impl DependenciesBuilder { Ok(self.signable_builder_service.as_ref().cloned().unwrap()) } + async fn build_signable_seed_builder_service( + &mut self, + ) -> Result> { + let signable_seed_builder_service = Arc::new(SignableSeedBuilderService::new( + self.get_epoch_service().await?, + )); + + Ok(signable_seed_builder_service) + } + + /// [SignableSeedBuilderService] service + pub async fn get_signable_seed_builder_service( + &mut self, + ) -> Result> { + if self.signable_seed_builder_service.is_none() { + self.signable_seed_builder_service = + Some(self.build_signable_seed_builder_service().await?); + } + + Ok(self + .signable_seed_builder_service + .as_ref() + .cloned() + .unwrap()) + } + async fn build_signed_entity_service(&mut self) -> Result> { let signed_entity_storer = self.build_signed_entity_storer().await?; let epoch_service = self.get_epoch_service().await?; - let mithril_stake_distribution_artifact_builder = - Arc::new(MithrilStakeDistributionArtifactBuilder::new(epoch_service)); + let mithril_stake_distribution_artifact_builder = Arc::new( + MithrilStakeDistributionArtifactBuilder::new(epoch_service.clone()), + ); let snapshotter = self.build_snapshotter().await?; let snapshot_uploader = self.build_snapshot_uploader().await?; let cardano_node_version = Version::parse(&self.configuration.cardano_node_version) From 8fffd147fcec7f34b09875c27a4f52f2f9101878 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Fri, 20 Sep 2024 18:38:27 +0200 Subject: [PATCH 035/274] chore: remove ad hoc signature of next avk for protocol message in aggregator runner --- mithril-aggregator/src/runtime/runner.rs | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/mithril-aggregator/src/runtime/runner.rs b/mithril-aggregator/src/runtime/runner.rs index 544b7c6ae82..53d59aa292a 100644 --- a/mithril-aggregator/src/runtime/runner.rs +++ b/mithril-aggregator/src/runtime/runner.rs @@ -5,8 +5,8 @@ use std::sync::Arc; use std::time::Duration; use mithril_common::entities::{ - Certificate, CertificatePending, Epoch, ProtocolMessage, ProtocolMessagePartKey, - SignedEntityConfig, SignedEntityType, Signer, TimePoint, + Certificate, CertificatePending, Epoch, ProtocolMessage, SignedEntityConfig, SignedEntityType, + Signer, TimePoint, }; use mithril_common::StdResult; use mithril_persistence::store::StakeStorer; @@ -284,22 +284,13 @@ impl AggregatorRunnerTrait for AggregatorRunner { signed_entity_type: &SignedEntityType, ) -> StdResult { debug!("RUNNER: compute protocol message"); - let mut protocol_message = self + let protocol_message = self .dependencies .signable_builder_service .compute_protocol_message(signed_entity_type.to_owned()) .await .with_context(|| format!("Runner can not compute protocol message for signed entity type: '{signed_entity_type}'"))?; - let epoch_service = self.dependencies.epoch_service.read().await; - protocol_message.set_message_part( - ProtocolMessagePartKey::NextAggregateVerificationKey, - epoch_service - .next_aggregate_verification_key()? - .to_json_hex() - .with_context(|| "convert next avk to json hex failure")?, - ); - Ok(protocol_message) } From 1e124574a96fd8c35d4d01813378438bbd268580 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Fri, 20 Sep 2024 18:39:27 +0200 Subject: [PATCH 036/274] chore: remove ad hoc signature of next avk for protocol message in aggregator integration test --- .../tests/test_extensions/runtime_tester.rs | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/mithril-aggregator/tests/test_extensions/runtime_tester.rs b/mithril-aggregator/tests/test_extensions/runtime_tester.rs index e9fe84a3a9a..40b403f9fd0 100644 --- a/mithril-aggregator/tests/test_extensions/runtime_tester.rs +++ b/mithril-aggregator/tests/test_extensions/runtime_tester.rs @@ -16,8 +16,8 @@ use mithril_common::{ digesters::{DumbImmutableDigester, DumbImmutableFileObserver}, entities::{ BlockNumber, Certificate, CertificateSignature, ChainPoint, Epoch, ImmutableFileNumber, - ProtocolMessagePartKey, SignedEntityType, SignedEntityTypeDiscriminants, - SingleSignatureAuthenticationStatus, SlotNumber, Snapshot, StakeDistribution, TimePoint, + SignedEntityType, SignedEntityTypeDiscriminants, SingleSignatureAuthenticationStatus, + SlotNumber, Snapshot, StakeDistribution, TimePoint, }, era::{adapters::EraReaderDummyAdapter, EraMarker, EraReader, SupportedEra}, test_utils::{ @@ -417,24 +417,12 @@ impl RuntimeTester { .build_current_signed_entity_type(discriminant) .await?; - // Code copied from `AggregatorRunner::compute_protocol_message` - // Todo: Refactor this code to avoid code duplication by making the signable_builder_service - // able to retrieve the next avk by itself. - let mut message = self + let message = self .dependencies .signable_builder_service .compute_protocol_message(signed_entity_type.clone()) .await?; - let epoch_service = self.dependencies.epoch_service.read().await; - message.set_message_part( - ProtocolMessagePartKey::NextAggregateVerificationKey, - epoch_service - .next_aggregate_verification_key()? - .to_json_hex() - .with_context(|| "convert next avk to json hex failure")?, - ); - for signer_fixture in signers { if let Some(mut single_signatures) = signer_fixture.sign(&message) { if authentication_status == SingleSignatureAuthenticationStatus::Authenticated { From 8aa4db1cf4b99ed914d624821cd8b2debd14bb1c Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Fri, 20 Sep 2024 18:40:26 +0200 Subject: [PATCH 037/274] feat: add SignableSeedBuilderService in signer --- mithril-signer/src/services/mod.rs | 2 + .../src/services/signable_seed_builder.rs | 81 +++++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 mithril-signer/src/services/signable_seed_builder.rs diff --git a/mithril-signer/src/services/mod.rs b/mithril-signer/src/services/mod.rs index e0ecc517c63..7b3b38e1736 100644 --- a/mithril-signer/src/services/mod.rs +++ b/mithril-signer/src/services/mod.rs @@ -12,6 +12,7 @@ mod aggregator_client; mod cardano_transactions; mod epoch_service; +mod signable_seed_builder; mod single_signer; mod upkeep_service; @@ -20,5 +21,6 @@ pub use aggregator_client::dumb::DumbAggregatorClient; pub use aggregator_client::*; pub use cardano_transactions::*; pub use epoch_service::*; +pub use signable_seed_builder::*; pub use single_signer::*; pub use upkeep_service::*; diff --git a/mithril-signer/src/services/signable_seed_builder.rs b/mithril-signer/src/services/signable_seed_builder.rs new file mode 100644 index 00000000000..ff54e1aa026 --- /dev/null +++ b/mithril-signer/src/services/signable_seed_builder.rs @@ -0,0 +1,81 @@ +//! ## SignableSeedBuilderService +//! +//! This service is responsible for computing the seed protocol message +//! that is used by the [SignableBuilder] to compute the final protocol message. +//! +use anyhow::anyhow; +use async_trait::async_trait; +use std::sync::Arc; +use tokio::sync::RwLock; + +use mithril_common::{ + entities::{ProtocolMessage, ProtocolMessagePartKey}, + signable_builder::SignableSeedBuilder, + StdResult, +}; + +use crate::{ + services::{EpochService, SingleSigner}, + store::ProtocolInitializerStorer, +}; + +/// SignableSeedBuilder service +pub struct SignableSeedBuilderService { + epoch_service: Arc>, + single_signer: Arc, + protocol_initializer_store: Arc, +} + +impl SignableSeedBuilderService { + /// SignableSeedBuilderService factory + pub fn new( + epoch_service: Arc>, + single_signer: Arc, + protocol_initializer_store: Arc, + ) -> Self { + Self { + epoch_service, + single_signer, + protocol_initializer_store, + } + } +} + +#[async_trait] +impl SignableSeedBuilder for SignableSeedBuilderService { + /// Compute seed protocol message + async fn compute_seed_protocol_message(&self) -> StdResult { + let mut protocol_message = ProtocolMessage::new(); + let epoch_service = self.epoch_service.read().await; + let epoch = (*epoch_service).epoch_of_current_data()?; + let next_signer_retrieval_epoch = epoch.offset_to_next_signer_retrieval_epoch(); + let next_protocol_initializer = self + .protocol_initializer_store + .get_protocol_initializer(next_signer_retrieval_epoch) + .await? + .ok_or_else(|| { + anyhow!("protocol_initializer at epoch {next_signer_retrieval_epoch}") + })?; + + let next_signers_with_stake = epoch_service.next_signers_with_stake().await?; + let avk = self + .single_signer + .compute_aggregate_verification_key( + &next_signers_with_stake, + &next_protocol_initializer, + )? + .ok_or_else(|| anyhow!("next_signers avk".to_string()))?; + protocol_message + .set_message_part(ProtocolMessagePartKey::NextAggregateVerificationKey, avk); + + Ok(protocol_message) + } +} + +#[cfg(test)] +mod tests { + #[test] + fn test_compute_seed_protocol_message() { + //TODO: implement test + } +} From 6459e9545d7da650406148953fafbc9f4626d0e7 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Fri, 20 Sep 2024 18:40:45 +0200 Subject: [PATCH 038/274] feat: wire SignableSeedBuilderService in signer DI --- mithril-signer/src/dependency_injection/builder.rs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/mithril-signer/src/dependency_injection/builder.rs b/mithril-signer/src/dependency_injection/builder.rs index 636fad2d4c6..eb6cc235a9d 100644 --- a/mithril-signer/src/dependency_injection/builder.rs +++ b/mithril-signer/src/dependency_injection/builder.rs @@ -39,8 +39,8 @@ use crate::dependency_injection::SignerDependencyContainer; use crate::services::{ AggregatorHTTPClient, CardanoTransactionsImporter, CardanoTransactionsPreloaderActivationSigner, MithrilEpochService, MithrilSingleSigner, - SignerUpkeepService, TransactionsImporterByChunk, TransactionsImporterWithPruner, - TransactionsImporterWithVacuum, + SignableSeedBuilderService, SignerUpkeepService, TransactionsImporterByChunk, + TransactionsImporterWithPruner, TransactionsImporterWithVacuum, }; use crate::store::{MKTreeStoreSqlite, ProtocolInitializerStore}; use crate::{ @@ -320,7 +320,14 @@ impl<'a> DependenciesBuilder<'a> { let cardano_stake_distribution_signable_builder = Arc::new( CardanoStakeDistributionSignableBuilder::new(stake_store.clone()), ); + let epoch_service = Arc::new(RwLock::new(MithrilEpochService::new(stake_store.clone()))); + let signable_seed_builder_service = Arc::new(SignableSeedBuilderService::new( + epoch_service.clone(), + single_signer.clone(), + protocol_initializer_store.clone(), + )); let signable_builder_service = Arc::new(MithrilSignableBuilderService::new( + signable_seed_builder_service, mithril_stake_distribution_signable_builder, cardano_immutable_snapshot_builder, cardano_transactions_builder, @@ -344,7 +351,6 @@ impl<'a> DependenciesBuilder<'a> { slog_scope::logger(), )); - let epoch_service = Arc::new(RwLock::new(MithrilEpochService::new(stake_store.clone()))); let services = SignerDependencyContainer { ticker_service, certificate_handler: aggregator_client, From aed8c61b2101bdfc8b5bbe7a76823798d9100813 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Fri, 20 Sep 2024 18:41:48 +0200 Subject: [PATCH 039/274] chore: remove ad hoc signature of next avk for protocol message in signer runner --- mithril-signer/src/runtime/runner.rs | 91 ++++++++++------------------ 1 file changed, 33 insertions(+), 58 deletions(-) diff --git a/mithril-signer/src/runtime/runner.rs b/mithril-signer/src/runtime/runner.rs index 724ea69bd5f..e7095446adb 100644 --- a/mithril-signer/src/runtime/runner.rs +++ b/mithril-signer/src/runtime/runner.rs @@ -6,8 +6,8 @@ use tokio::sync::RwLockReadGuard; use mithril_common::crypto_helper::{KESPeriod, OpCert, ProtocolOpCert, SerDeShelleyFileFormat}; use mithril_common::entities::{ - CertificatePending, Epoch, PartyId, ProtocolMessage, ProtocolMessagePartKey, SignedEntityType, - Signer, SignerWithStake, SingleSignatures, TimePoint, + CertificatePending, Epoch, EpochSettings, PartyId, ProtocolMessage, SignedEntityType, Signer, + SignerWithStake, SingleSignatures, TimePoint, }; use mithril_common::StdResult; use mithril_persistence::store::StakeStorer; @@ -108,13 +108,6 @@ impl SignerRunner { epoch_service.current_signers_with_stake().await } - /// Get the next signers with their stake. - async fn get_next_signers_with_stake(&self) -> StdResult> { - let epoch_service = self.epoch_service_read().await; - - epoch_service.next_signers_with_stake().await - } - async fn epoch_service_read(&self) -> RwLockReadGuard<'_, dyn EpochService> { self.services.epoch_service.read().await } @@ -311,41 +304,14 @@ impl Runner for SignerRunner { ) -> StdResult { debug!("RUNNER: compute_message"); - let next_signers = self - .get_next_signers_with_stake() - .await - .with_context(|| "Runner can not not retrieve next signers")?; - - // 1 compute the signed entity type part of the message - let mut message = self + let protocol_message = self .services .signable_builder_service .compute_protocol_message(signed_entity_type.to_owned()) .await .with_context(|| format!("Runner can not compute protocol message for signed entity type: '{signed_entity_type}'"))?; - // 2 set the next signers keys and stakes in the message - let epoch = signed_entity_type.get_epoch(); - let next_signer_retrieval_epoch = epoch.offset_to_next_signer_retrieval_epoch(); - let next_protocol_initializer = self - .services - .protocol_initializer_store - .get_protocol_initializer(next_signer_retrieval_epoch) - .await? - .ok_or_else(|| { - RunnerError::NoValueError(format!( - "protocol_initializer at epoch {next_signer_retrieval_epoch}" - )) - })?; - - let avk = self - .services - .single_signer - .compute_aggregate_verification_key(&next_signers, &next_protocol_initializer)? - .ok_or_else(|| RunnerError::NoValueError("next_signers avk".to_string()))?; - message.set_message_part(ProtocolMessagePartKey::NextAggregateVerificationKey, avk); - - Ok(message) + Ok(protocol_message) } async fn compute_single_signature( @@ -448,6 +414,14 @@ impl Runner for SignerRunner { #[cfg(test)] mod tests { + + use mockall::mock; + use rand_chacha::ChaCha20Rng; + use rand_core::SeedableRng; + + use std::{path::Path, path::PathBuf, sync::Arc}; + use tokio::sync::RwLock; + use mithril_common::{ api_version::APIVersionProvider, cardano_block_scanner::DumbBlockScanner, @@ -461,7 +435,7 @@ mod tests { digesters::{DumbImmutableDigester, DumbImmutableFileObserver}, entities::{ BlockNumber, BlockRange, CardanoDbBeacon, CardanoTransactionsSigningConfig, Epoch, - ProtocolParameters, + ProtocolMessagePartKey, ProtocolParameters, }, era::{adapters::EraReaderBootstrapAdapter, EraChecker, EraReader}, signable_builder::{ @@ -475,21 +449,16 @@ mod tests { }; use mithril_persistence::store::adapter::{DumbStoreAdapter, MemoryAdapter}; use mithril_persistence::store::{StakeStore, StakeStorer}; - use mockall::mock; - use rand_chacha::ChaCha20Rng; - use rand_core::SeedableRng; - - use std::{path::Path, path::PathBuf, sync::Arc}; - use crate::metrics::MetricsService; - use crate::services::{ - CardanoTransactionsImporter, DumbAggregatorClient, MithrilEpochService, - MithrilSingleSigner, MockAggregatorClient, MockTransactionStore, MockUpkeepService, - SingleSigner, + use crate::{ + metrics::MetricsService, + services::{ + CardanoTransactionsImporter, DumbAggregatorClient, MithrilEpochService, + MithrilSingleSigner, MockAggregatorClient, MockTransactionStore, MockUpkeepService, + SignableSeedBuilderService, SingleSigner, + }, + store::ProtocolInitializerStore, }; - use crate::store::ProtocolInitializerStore; - - use tokio::sync::RwLock; use super::*; @@ -632,7 +601,17 @@ mod tests { let cardano_stake_distribution_builder = Arc::new( CardanoStakeDistributionSignableBuilder::new(stake_store.clone()), ); + let epoch_service = Arc::new(RwLock::new(MithrilEpochService::new(stake_store.clone()))); + let single_signer = Arc::new(MithrilSingleSigner::new(party_id)); + let protocol_initializer_store = + Arc::new(ProtocolInitializerStore::new(Box::new(adapter), None)); + let signable_seed_builder_service = Arc::new(SignableSeedBuilderService::new( + epoch_service.clone(), + single_signer.clone(), + protocol_initializer_store.clone(), + )); let signable_builder_service = Arc::new(MithrilSignableBuilderService::new( + signable_seed_builder_service, mithril_stake_distribution_signable_builder, cardano_immutable_signable_builder, cardano_transactions_builder, @@ -650,19 +629,15 @@ mod tests { Arc::new(CardanoTransactionsPreloaderActivation::new(true)), )); let upkeep_service = Arc::new(MockUpkeepService::new()); - let epoch_service = Arc::new(RwLock::new(MithrilEpochService::new(stake_store.clone()))); SignerDependencyContainer { stake_store, certificate_handler: Arc::new(DumbAggregatorClient::default()), chain_observer, digester, - single_signer: Arc::new(MithrilSingleSigner::new(party_id)), + single_signer, ticker_service, - protocol_initializer_store: Arc::new(ProtocolInitializerStore::new( - Box::new(adapter), - None, - )), + protocol_initializer_store, era_checker, era_reader, api_version_provider, From e3059bf255ad1d48165fe13a317b90335cf9299b Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Fri, 20 Sep 2024 18:42:08 +0200 Subject: [PATCH 040/274] chore: remove ad hoc signature of next avk for protocol message in signer integration test --- .../tests/test_extensions/state_machine_tester.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/mithril-signer/tests/test_extensions/state_machine_tester.rs b/mithril-signer/tests/test_extensions/state_machine_tester.rs index 38ad9d88669..7ea7fe4d024 100644 --- a/mithril-signer/tests/test_extensions/state_machine_tester.rs +++ b/mithril-signer/tests/test_extensions/state_machine_tester.rs @@ -32,7 +32,7 @@ use mithril_signer::{ metrics::*, services::{ AggregatorClient, CardanoTransactionsImporter, MithrilEpochService, MithrilSingleSigner, - SignerUpkeepService, + SignableSeedBuilderService, SignerUpkeepService, }, store::{MKTreeStoreSqlite, ProtocolInitializerStore, ProtocolInitializerStorer}, Configuration, MetricsService, RuntimeError, SignerRunner, SignerState, StateMachine, @@ -205,7 +205,14 @@ impl StateMachineTester { let cardano_stake_distribution_builder = Arc::new( CardanoStakeDistributionSignableBuilder::new(stake_store.clone()), ); + let epoch_service = Arc::new(RwLock::new(MithrilEpochService::new(stake_store.clone()))); + let signable_seed_builder_service = Arc::new(SignableSeedBuilderService::new( + epoch_service.clone(), + single_signer.clone(), + protocol_initializer_store.clone(), + )); let signable_builder_service = Arc::new(MithrilSignableBuilderService::new( + signable_seed_builder_service, mithril_stake_distribution_signable_builder, cardano_immutable_snapshot_builder, cardano_transactions_builder, @@ -229,7 +236,6 @@ impl StateMachineTester { signed_entity_type_lock.clone(), slog_scope::logger(), )); - let epoch_service = Arc::new(RwLock::new(MithrilEpochService::new(stake_store.clone()))); let services = SignerDependencyContainer { certificate_handler: certificate_handler.clone(), From a06a6d1df31f4058a586ae232039a8a46fae8ee4 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Mon, 23 Sep 2024 15:51:19 +0200 Subject: [PATCH 041/274] test: add missing test for SignableSeedBuilder in aggregator --- .../src/services/signable_seed_builder.rs | 35 +++++++++++++++++-- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/mithril-aggregator/src/services/signable_seed_builder.rs b/mithril-aggregator/src/services/signable_seed_builder.rs index fe5e5ead327..f3303bcf0de 100644 --- a/mithril-aggregator/src/services/signable_seed_builder.rs +++ b/mithril-aggregator/src/services/signable_seed_builder.rs @@ -49,8 +49,37 @@ impl SignableSeedBuilder for SignableSeedBuilderService { #[cfg(test)] mod tests { - #[test] - fn test_compute_seed_protocol_message() { - // TODO: implement test + use mithril_common::{entities::Epoch, test_utils::MithrilFixtureBuilder}; + + use crate::services::FakeEpochService; + + use super::*; + + #[tokio::test] + async fn test_compute_seed_protocol_message() { + let epoch = Epoch(5); + let fixture = MithrilFixtureBuilder::default().with_signers(5).build(); + let next_fixture = MithrilFixtureBuilder::default().with_signers(4).build(); + let expected_next_aggregate_verification_key = next_fixture.compute_and_encode_avk(); + let epoch_service = Arc::new(RwLock::new(FakeEpochService::with_data( + epoch, + &fixture.protocol_parameters(), + &next_fixture.protocol_parameters(), + &next_fixture.protocol_parameters(), + &fixture.signers_with_stake(), + &next_fixture.signers_with_stake(), + ))); + let signable_seed_builder_service = SignableSeedBuilderService::new(epoch_service); + + let protocol_message = signable_seed_builder_service + .compute_seed_protocol_message() + .await + .unwrap(); + + assert_eq!( + protocol_message + .get_message_part(&ProtocolMessagePartKey::NextAggregateVerificationKey), + Some(&expected_next_aggregate_verification_key) + ); } } From 0e3b172668d162e38522434a28c7a62925c37286 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Mon, 23 Sep 2024 15:51:28 +0200 Subject: [PATCH 042/274] test: add missing test for SignableSeedBuilder in signer --- .../src/services/signable_seed_builder.rs | 112 +++++++++++++++++- .../src/store/protocol_initializer_store.rs | 4 + 2 files changed, 113 insertions(+), 3 deletions(-) diff --git a/mithril-signer/src/services/signable_seed_builder.rs b/mithril-signer/src/services/signable_seed_builder.rs index ff54e1aa026..bf2b040fa4f 100644 --- a/mithril-signer/src/services/signable_seed_builder.rs +++ b/mithril-signer/src/services/signable_seed_builder.rs @@ -74,8 +74,114 @@ impl SignableSeedBuilder for SignableSeedBuilderService { #[cfg(test)] mod tests { - #[test] - fn test_compute_seed_protocol_message() { - //TODO: implement test + + use mockall::mock; + + use mithril_common::{ + crypto_helper::ProtocolInitializer, + entities::{ + CardanoTransactionsSigningConfig, Epoch, EpochSettings, PartyId, ProtocolParameters, + Signer, SignerWithStake, + }, + test_utils::MithrilFixtureBuilder, + }; + + use crate::{services::MockSingleSigner, store::MockProtocolInitializerStorer}; + + use super::*; + + mock! { + pub EpochServiceImpl {} + + #[async_trait] + impl EpochService for EpochServiceImpl { + /// Inform the service a new epoch has been detected, telling it to update its + /// internal state for the new epoch. + fn inform_epoch_settings(&mut self, epoch_settings: EpochSettings) -> StdResult<()>; + + /// Get the current epoch for which the data stored in this service are computed. + fn epoch_of_current_data(&self) -> StdResult; + + /// Get next protocol parameters used in next epoch (associated with the actual epoch) + fn next_protocol_parameters(&self) -> StdResult<&'static ProtocolParameters>; + + /// Get signers for the current epoch + fn current_signers(&self) -> StdResult<&'static Vec>; + + /// Get signers for the next epoch + fn next_signers(&self) -> StdResult<&'static Vec>; + + /// Get signers with stake for the current epoch + async fn current_signers_with_stake(&self) -> StdResult>; + + /// Get signers with stake for the next epoch + async fn next_signers_with_stake(&self) -> StdResult>; + + /// Get the cardano transactions signing configuration for the current epoch + fn cardano_transactions_signing_config( + &self, + ) -> StdResult<&'static Option>; + + /// Get the cardano transactions signing configuration for the next epoch + fn next_cardano_transactions_signing_config( + &self, + ) -> StdResult<&'static Option>; + + /// Check if a signer is included in the current stake distribution + fn is_signer_included_in_current_stake_distribution( + &self, + party_id: PartyId, + protocol_initializer: ProtocolInitializer, + ) -> StdResult; + } + } + + #[tokio::test] + async fn test_compute_seed_protocol_message() { + let epoch = Epoch(5); + let fixture = MithrilFixtureBuilder::default().with_signers(5).build(); + let next_fixture = MithrilFixtureBuilder::default().with_signers(4).build(); + let expected_next_aggregate_verification_key = next_fixture.compute_and_encode_avk(); + let expected_next_aggregate_verification_key_clone = + expected_next_aggregate_verification_key.clone(); + let protocol_initializer = fixture.signers_fixture()[0].protocol_initializer.clone(); + let mut mock_epoch_service = MockEpochServiceImpl::new(); + mock_epoch_service + .expect_epoch_of_current_data() + .return_once(move || Ok(epoch)) + .once(); + mock_epoch_service + .expect_next_signers_with_stake() + .return_once(move || Ok(Vec::new())) + .once(); + let mut mock_single_signer = MockSingleSigner::new(); + mock_single_signer + .expect_compute_aggregate_verification_key() + .return_once(move |_, _| Ok(Some(expected_next_aggregate_verification_key_clone))) + .once(); + let mut mock_protocol_initializer_store = MockProtocolInitializerStorer::new(); + mock_protocol_initializer_store + .expect_get_protocol_initializer() + .return_once(move |_| Ok(Some(protocol_initializer))) + .once(); + let epoch_service = Arc::new(RwLock::new(mock_epoch_service)); + let single_signer = Arc::new(mock_single_signer); + let protocol_initializer_store = Arc::new(mock_protocol_initializer_store); + let signable_seed_builder_service = SignableSeedBuilderService::new( + epoch_service, + single_signer, + protocol_initializer_store, + ); + + let protocol_message = signable_seed_builder_service + .compute_seed_protocol_message() + .await + .unwrap(); + + assert_eq!( + protocol_message + .get_message_part(&ProtocolMessagePartKey::NextAggregateVerificationKey), + Some(&expected_next_aggregate_verification_key) + ); } } diff --git a/mithril-signer/src/store/protocol_initializer_store.rs b/mithril-signer/src/store/protocol_initializer_store.rs index f7fef1950af..b76e3ec6ca3 100644 --- a/mithril-signer/src/store/protocol_initializer_store.rs +++ b/mithril-signer/src/store/protocol_initializer_store.rs @@ -4,8 +4,12 @@ use tokio::sync::RwLock; use mithril_common::{crypto_helper::ProtocolInitializer, entities::Epoch, StdResult}; use mithril_persistence::store::{adapter::StoreAdapter, StorePruner}; +#[cfg(test)] +use mockall::automock; + type Adapter = Box>; +#[cfg_attr(test, automock)] #[async_trait] /// Store the ProtocolInitializer used for each Epoch. This is useful because /// protocol parameters and stake distribution change over time. From 637868be0fa999fa1483fc75401364be65bccc59 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Mon, 23 Sep 2024 16:14:26 +0200 Subject: [PATCH 043/274] refactor: add Mock DI container in SignableBuilderService tests --- .../signable_builder_service.rs | 140 ++++++++---------- 1 file changed, 59 insertions(+), 81 deletions(-) diff --git a/mithril-common/src/signable_builder/signable_builder_service.rs b/mithril-common/src/signable_builder/signable_builder_service.rs index f8aeb3e4e36..a48d9864d80 100644 --- a/mithril-common/src/signable_builder/signable_builder_service.rs +++ b/mithril-common/src/signable_builder/signable_builder_service.rs @@ -125,39 +125,56 @@ mod tests { } } + struct MockDependencyInjector { + mock_signable_seed_builder: MockSignableSeedBuilderImpl, + mock_mithril_stake_distribution_signable_builder: MockSignableBuilderImpl, + mock_cardano_immutable_files_full_signable_builder: + MockSignableBuilderImpl, + mock_cardano_transactions_signable_builder: MockSignableBuilderImpl, + mock_cardano_stake_distribution_signable_builder: MockSignableBuilderImpl, + } + + impl MockDependencyInjector { + fn new() -> MockDependencyInjector { + MockDependencyInjector { + mock_signable_seed_builder: MockSignableSeedBuilderImpl::new(), + mock_mithril_stake_distribution_signable_builder: MockSignableBuilderImpl::new(), + mock_cardano_immutable_files_full_signable_builder: MockSignableBuilderImpl::new(), + mock_cardano_stake_distribution_signable_builder: MockSignableBuilderImpl::new(), + mock_cardano_transactions_signable_builder: MockSignableBuilderImpl::new(), + } + } + + fn build_signable_builder_service(self) -> MithrilSignableBuilderService { + MithrilSignableBuilderService::new( + Arc::new(self.mock_signable_seed_builder), + Arc::new(self.mock_mithril_stake_distribution_signable_builder), + Arc::new(self.mock_cardano_immutable_files_full_signable_builder), + Arc::new(self.mock_cardano_transactions_signable_builder), + Arc::new(self.mock_cardano_stake_distribution_signable_builder), + ) + } + } + #[tokio::test] async fn build_mithril_stake_distribution_signable_when_given_mithril_stake_distribution_entity_type( ) { let protocol_message = ProtocolMessage::new(); let protocol_message_clone = protocol_message.clone(); - let mut mock_signable_seed_builder = MockSignableSeedBuilderImpl::new(); - mock_signable_seed_builder + let mut mock_container = MockDependencyInjector::new(); + mock_container + .mock_signable_seed_builder .expect_compute_seed_protocol_message() .once() .return_once(move || Ok(ProtocolMessage::new())); - let mut mock_mithril_stake_distribution_signable_builder = - MockSignableBuilderImpl::::new(); - mock_mithril_stake_distribution_signable_builder + mock_container + .mock_mithril_stake_distribution_signable_builder .expect_compute_protocol_message() .once() .return_once(move |_, _| Ok(protocol_message_clone)); - let mock_cardano_immutable_files_full_signable_builder = - MockSignableBuilderImpl::::new(); - let mock_cardano_transactions_signable_builder = - MockSignableBuilderImpl::::new(); - let mock_cardano_stake_distribution_signable_builder = - MockSignableBuilderImpl::::new(); - - // TODO: refactor mock builders - let signable_builder_service = MithrilSignableBuilderService::new( - Arc::new(mock_signable_seed_builder), - Arc::new(mock_mithril_stake_distribution_signable_builder), - Arc::new(mock_cardano_immutable_files_full_signable_builder), - Arc::new(mock_cardano_transactions_signable_builder), - Arc::new(mock_cardano_stake_distribution_signable_builder), - ); - + let signable_builder_service = mock_container.build_signable_builder_service(); let signed_entity_type = SignedEntityType::MithrilStakeDistribution(Epoch(1)); + signable_builder_service .compute_protocol_message(signed_entity_type) .await @@ -168,34 +185,21 @@ mod tests { async fn build_snapshot_signable_when_given_cardano_immutable_files_full_entity_type() { let protocol_message = ProtocolMessage::new(); let protocol_message_clone = protocol_message.clone(); - let mut mock_signable_seed_builder = MockSignableSeedBuilderImpl::new(); - mock_signable_seed_builder + let mut mock_container = MockDependencyInjector::new(); + mock_container + .mock_signable_seed_builder .expect_compute_seed_protocol_message() .once() .return_once(move || Ok(ProtocolMessage::new())); - let mock_mithril_stake_distribution_signable_builder = - MockSignableBuilderImpl::::new(); - let mut mock_cardano_immutable_files_full_signable_builder = - MockSignableBuilderImpl::::new(); - mock_cardano_immutable_files_full_signable_builder + mock_container + .mock_cardano_immutable_files_full_signable_builder .expect_compute_protocol_message() .once() .return_once(move |_, _| Ok(protocol_message_clone)); - let mock_cardano_transactions_signable_builder = - MockSignableBuilderImpl::::new(); - let mock_cardano_stake_distribution_signable_builder = - MockSignableBuilderImpl::::new(); - - let signable_builder_service = MithrilSignableBuilderService::new( - Arc::new(mock_signable_seed_builder), - Arc::new(mock_mithril_stake_distribution_signable_builder), - Arc::new(mock_cardano_immutable_files_full_signable_builder), - Arc::new(mock_cardano_transactions_signable_builder), - Arc::new(mock_cardano_stake_distribution_signable_builder), - ); - + let signable_builder_service = mock_container.build_signable_builder_service(); let signed_entity_type = SignedEntityType::CardanoImmutableFilesFull(CardanoDbBeacon::default()); + signable_builder_service .compute_protocol_message(signed_entity_type) .await @@ -206,33 +210,20 @@ mod tests { async fn build_transactions_signable_when_given_cardano_transactions_entity_type() { let protocol_message = ProtocolMessage::new(); let protocol_message_clone = protocol_message.clone(); - let mut mock_signable_seed_builder = MockSignableSeedBuilderImpl::new(); - mock_signable_seed_builder + let mut mock_container = MockDependencyInjector::new(); + mock_container + .mock_signable_seed_builder .expect_compute_seed_protocol_message() .once() .return_once(move || Ok(ProtocolMessage::new())); - let mock_mithril_stake_distribution_signable_builder = - MockSignableBuilderImpl::::new(); - let mock_cardano_immutable_files_full_signable_builder = - MockSignableBuilderImpl::::new(); - let mut mock_cardano_transactions_signable_builder = - MockSignableBuilderImpl::::new(); - mock_cardano_transactions_signable_builder + mock_container + .mock_cardano_transactions_signable_builder .expect_compute_protocol_message() .once() .return_once(move |_, _| Ok(protocol_message_clone)); - let mock_cardano_stake_distribution_signable_builder = - MockSignableBuilderImpl::::new(); - - let signable_builder_service = MithrilSignableBuilderService::new( - Arc::new(mock_signable_seed_builder), - Arc::new(mock_mithril_stake_distribution_signable_builder), - Arc::new(mock_cardano_immutable_files_full_signable_builder), - Arc::new(mock_cardano_transactions_signable_builder), - Arc::new(mock_cardano_stake_distribution_signable_builder), - ); - + let signable_builder_service = mock_container.build_signable_builder_service(); let signed_entity_type = SignedEntityType::CardanoTransactions(Epoch(5), BlockNumber(1000)); + signable_builder_service .compute_protocol_message(signed_entity_type) .await @@ -244,33 +235,20 @@ mod tests { ) { let protocol_message = ProtocolMessage::new(); let protocol_message_clone = protocol_message.clone(); - let mut mock_signable_seed_builder = MockSignableSeedBuilderImpl::new(); - mock_signable_seed_builder + let mut mock_container = MockDependencyInjector::new(); + mock_container + .mock_signable_seed_builder .expect_compute_seed_protocol_message() .once() .return_once(move || Ok(ProtocolMessage::new())); - let mock_mithril_stake_distribution_signable_builder = - MockSignableBuilderImpl::::new(); - let mock_cardano_immutable_files_full_signable_builder = - MockSignableBuilderImpl::::new(); - let mock_cardano_transactions_signable_builder = - MockSignableBuilderImpl::::new(); - let mut mock_cardano_stake_distribution_signable_builder = - MockSignableBuilderImpl::::new(); - mock_cardano_stake_distribution_signable_builder + mock_container + .mock_cardano_stake_distribution_signable_builder .expect_compute_protocol_message() .once() .return_once(move |_, _| Ok(protocol_message_clone)); - - let signable_builder_service = MithrilSignableBuilderService::new( - Arc::new(mock_signable_seed_builder), - Arc::new(mock_mithril_stake_distribution_signable_builder), - Arc::new(mock_cardano_immutable_files_full_signable_builder), - Arc::new(mock_cardano_transactions_signable_builder), - Arc::new(mock_cardano_stake_distribution_signable_builder), - ); - + let signable_builder_service = mock_container.build_signable_builder_service(); let signed_entity_type = SignedEntityType::CardanoStakeDistribution(Epoch(5)); + signable_builder_service .compute_protocol_message(signed_entity_type) .await From f080739f088719cae0f651912d8e751705d88ddd Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Tue, 24 Sep 2024 14:21:54 +0200 Subject: [PATCH 044/274] chore: apply review comments --- mithril-signer/src/services/signable_seed_builder.rs | 2 +- mithril-signer/src/store/protocol_initializer_store.rs | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/mithril-signer/src/services/signable_seed_builder.rs b/mithril-signer/src/services/signable_seed_builder.rs index bf2b040fa4f..593834c7875 100644 --- a/mithril-signer/src/services/signable_seed_builder.rs +++ b/mithril-signer/src/services/signable_seed_builder.rs @@ -54,7 +54,7 @@ impl SignableSeedBuilder for SignableSeedBuilderService { .get_protocol_initializer(next_signer_retrieval_epoch) .await? .ok_or_else(|| { - anyhow!("protocol_initializer at epoch {next_signer_retrieval_epoch}") + anyhow!("can not get protocol_initializer at epoch {next_signer_retrieval_epoch}") })?; let next_signers_with_stake = epoch_service.next_signers_with_stake().await?; diff --git a/mithril-signer/src/store/protocol_initializer_store.rs b/mithril-signer/src/store/protocol_initializer_store.rs index b76e3ec6ca3..b37f57db754 100644 --- a/mithril-signer/src/store/protocol_initializer_store.rs +++ b/mithril-signer/src/store/protocol_initializer_store.rs @@ -4,12 +4,9 @@ use tokio::sync::RwLock; use mithril_common::{crypto_helper::ProtocolInitializer, entities::Epoch, StdResult}; use mithril_persistence::store::{adapter::StoreAdapter, StorePruner}; -#[cfg(test)] -use mockall::automock; - type Adapter = Box>; -#[cfg_attr(test, automock)] +#[cfg_attr(test, mockall::automock)] #[async_trait] /// Store the ProtocolInitializer used for each Epoch. This is useful because /// protocol parameters and stake distribution change over time. From 88ae081d53da6ad9bc513adb0c723f8aef0cf3a3 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Tue, 24 Sep 2024 14:42:40 +0200 Subject: [PATCH 045/274] refactor: migrate EpochService mock in epoch service --- mithril-signer/src/services/epoch_service.rs | 64 +++++++++++++++ .../src/services/signable_seed_builder.rs | 79 ++++--------------- 2 files changed, 78 insertions(+), 65 deletions(-) diff --git a/mithril-signer/src/services/epoch_service.rs b/mithril-signer/src/services/epoch_service.rs index ffb94d5ebcc..7712125cd3f 100644 --- a/mithril-signer/src/services/epoch_service.rs +++ b/mithril-signer/src/services/epoch_service.rs @@ -217,6 +217,70 @@ impl EpochService for MithrilEpochService { } } +#[cfg(test)] +pub mod mock { + use mockall::mock; + + use super::*; + + mock! { + pub EpochServiceImpl {} + + #[async_trait] + impl EpochService for EpochServiceImpl { + /// Inform the service a new epoch has been detected, telling it to update its + /// internal state for the new epoch. + fn inform_epoch_settings(&mut self, epoch_settings: EpochSettings) -> StdResult<()>; + + /// Get the current epoch for which the data stored in this service are computed. + fn epoch_of_current_data(&self) -> StdResult; + + /// Get next protocol parameters used in next epoch (associated with the actual epoch) + fn next_protocol_parameters(&self) -> StdResult<&'static ProtocolParameters>; + + /// Get signers for the current epoch + fn current_signers(&self) -> StdResult<&'static Vec>; + + /// Get signers for the next epoch + fn next_signers(&self) -> StdResult<&'static Vec>; + + /// Get signers with stake for the current epoch + async fn current_signers_with_stake(&self) -> StdResult>; + + /// Get signers with stake for the next epoch + async fn next_signers_with_stake(&self) -> StdResult>; + + /// Get the cardano transactions signing configuration for the current epoch + fn cardano_transactions_signing_config( + &self, + ) -> StdResult<&'static Option>; + + /// Get the cardano transactions signing configuration for the next epoch + fn next_cardano_transactions_signing_config( + &self, + ) -> StdResult<&'static Option>; + + /// Check if a signer is included in the current stake distribution + fn is_signer_included_in_current_stake_distribution( + &self, + party_id: PartyId, + protocol_initializer: ProtocolInitializer, + ) -> StdResult; + } + } + + impl MockEpochServiceImpl { + pub fn new_with_config( + config: impl FnOnce(&mut MockEpochServiceImpl), + ) -> MockEpochServiceImpl { + let mut epoch_service_mock = MockEpochServiceImpl::new(); + config(&mut epoch_service_mock); + + epoch_service_mock + } + } +} + #[cfg(test)] mod tests { use std::sync::Arc; diff --git a/mithril-signer/src/services/signable_seed_builder.rs b/mithril-signer/src/services/signable_seed_builder.rs index 593834c7875..140cb0a5fa1 100644 --- a/mithril-signer/src/services/signable_seed_builder.rs +++ b/mithril-signer/src/services/signable_seed_builder.rs @@ -75,67 +75,15 @@ impl SignableSeedBuilder for SignableSeedBuilderService { #[cfg(test)] mod tests { - use mockall::mock; + use mithril_common::{entities::Epoch, test_utils::MithrilFixtureBuilder}; - use mithril_common::{ - crypto_helper::ProtocolInitializer, - entities::{ - CardanoTransactionsSigningConfig, Epoch, EpochSettings, PartyId, ProtocolParameters, - Signer, SignerWithStake, - }, - test_utils::MithrilFixtureBuilder, + use crate::{ + services::{mock::MockEpochServiceImpl, MockSingleSigner}, + store::MockProtocolInitializerStorer, }; - use crate::{services::MockSingleSigner, store::MockProtocolInitializerStorer}; - use super::*; - mock! { - pub EpochServiceImpl {} - - #[async_trait] - impl EpochService for EpochServiceImpl { - /// Inform the service a new epoch has been detected, telling it to update its - /// internal state for the new epoch. - fn inform_epoch_settings(&mut self, epoch_settings: EpochSettings) -> StdResult<()>; - - /// Get the current epoch for which the data stored in this service are computed. - fn epoch_of_current_data(&self) -> StdResult; - - /// Get next protocol parameters used in next epoch (associated with the actual epoch) - fn next_protocol_parameters(&self) -> StdResult<&'static ProtocolParameters>; - - /// Get signers for the current epoch - fn current_signers(&self) -> StdResult<&'static Vec>; - - /// Get signers for the next epoch - fn next_signers(&self) -> StdResult<&'static Vec>; - - /// Get signers with stake for the current epoch - async fn current_signers_with_stake(&self) -> StdResult>; - - /// Get signers with stake for the next epoch - async fn next_signers_with_stake(&self) -> StdResult>; - - /// Get the cardano transactions signing configuration for the current epoch - fn cardano_transactions_signing_config( - &self, - ) -> StdResult<&'static Option>; - - /// Get the cardano transactions signing configuration for the next epoch - fn next_cardano_transactions_signing_config( - &self, - ) -> StdResult<&'static Option>; - - /// Check if a signer is included in the current stake distribution - fn is_signer_included_in_current_stake_distribution( - &self, - party_id: PartyId, - protocol_initializer: ProtocolInitializer, - ) -> StdResult; - } - } - #[tokio::test] async fn test_compute_seed_protocol_message() { let epoch = Epoch(5); @@ -145,15 +93,16 @@ mod tests { let expected_next_aggregate_verification_key_clone = expected_next_aggregate_verification_key.clone(); let protocol_initializer = fixture.signers_fixture()[0].protocol_initializer.clone(); - let mut mock_epoch_service = MockEpochServiceImpl::new(); - mock_epoch_service - .expect_epoch_of_current_data() - .return_once(move || Ok(epoch)) - .once(); - mock_epoch_service - .expect_next_signers_with_stake() - .return_once(move || Ok(Vec::new())) - .once(); + let mock_epoch_service = MockEpochServiceImpl::new_with_config(|mock_epoch_service| { + mock_epoch_service + .expect_epoch_of_current_data() + .return_once(move || Ok(epoch)) + .once(); + mock_epoch_service + .expect_next_signers_with_stake() + .return_once(move || Ok(Vec::new())) + .once(); + }); let mut mock_single_signer = MockSingleSigner::new(); mock_single_signer .expect_compute_aggregate_verification_key() From e30164ed9609046109d1c1ef00e6d3285d8b06d8 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Tue, 24 Sep 2024 15:15:59 +0200 Subject: [PATCH 046/274] refactor: remove seed protocol message from signable builder Rollback to the original trait. --- .../messages/cardano_transactions_proof.rs | 3 +-- ...cardano_immutable_full_signable_builder.rs | 6 ++--- .../cardano_stake_distribution.rs | 14 +++------- .../signable_builder/cardano_transactions.rs | 14 +++------- .../src/signable_builder/interface.rs | 6 +---- .../mithril_stake_distribution.rs | 11 +++----- .../signable_builder_service.rs | 26 +++++++++---------- 7 files changed, 28 insertions(+), 52 deletions(-) diff --git a/mithril-common/src/messages/cardano_transactions_proof.rs b/mithril-common/src/messages/cardano_transactions_proof.rs index 65a9bd63906..b2175bf931e 100644 --- a/mithril-common/src/messages/cardano_transactions_proof.rs +++ b/mithril-common/src/messages/cardano_transactions_proof.rs @@ -390,7 +390,6 @@ mod tests { transactions: &[CardanoTransaction], block_number: BlockNumber, ) -> ProtocolMessage { - let seed_protocol_message = ProtocolMessage::new(); let mut transaction_importer = MockTransactionsImporter::new(); transaction_importer .expect_import() @@ -420,7 +419,7 @@ mod tests { Logger::root(slog::Discard, slog::o!()), ); cardano_transaction_signable_builder - .compute_protocol_message(block_number, seed_protocol_message) + .compute_protocol_message(block_number) .await .unwrap() } diff --git a/mithril-common/src/signable_builder/cardano_immutable_full_signable_builder.rs b/mithril-common/src/signable_builder/cardano_immutable_full_signable_builder.rs index 6a8926356fa..8f107263dcc 100644 --- a/mithril-common/src/signable_builder/cardano_immutable_full_signable_builder.rs +++ b/mithril-common/src/signable_builder/cardano_immutable_full_signable_builder.rs @@ -41,7 +41,6 @@ impl SignableBuilder for CardanoImmutableFilesFullSignableBuild async fn compute_protocol_message( &self, beacon: CardanoDbBeacon, - seed_protocol_message: ProtocolMessage, ) -> StdResult { debug!(self.logger, "compute_signable({beacon:?})"); let digest = self @@ -55,7 +54,7 @@ impl SignableBuilder for CardanoImmutableFilesFullSignableBuild ) })?; info!(self.logger, "digest = '{digest}'."); - let mut protocol_message = seed_protocol_message; + let mut protocol_message = ProtocolMessage::new(); protocol_message.set_message_part(ProtocolMessagePartKey::SnapshotDigest, digest); Ok(protocol_message) @@ -95,9 +94,8 @@ mod tests { Path::new(""), TestLogger::stdout(), ); - let seed_protocol_message = ProtocolMessage::new(); let protocol_message = signable_builder - .compute_protocol_message(CardanoDbBeacon::default(), seed_protocol_message) + .compute_protocol_message(CardanoDbBeacon::default()) .await .unwrap(); diff --git a/mithril-common/src/signable_builder/cardano_stake_distribution.rs b/mithril-common/src/signable_builder/cardano_stake_distribution.rs index 35039ece097..65e6dcf99b1 100644 --- a/mithril-common/src/signable_builder/cardano_stake_distribution.rs +++ b/mithril-common/src/signable_builder/cardano_stake_distribution.rs @@ -63,11 +63,7 @@ impl CardanoStakeDistributionSignableBuilder { #[async_trait] impl SignableBuilder for CardanoStakeDistributionSignableBuilder { - async fn compute_protocol_message( - &self, - epoch: Epoch, - seed_protocol_message: ProtocolMessage, - ) -> StdResult { + async fn compute_protocol_message(&self, epoch: Epoch) -> StdResult { let pools_with_stake = self .cardano_stake_distribution_retriever .retrieve(epoch.offset_to_cardano_stake_distribution_snapshot_epoch()) @@ -77,7 +73,7 @@ impl SignableBuilder for CardanoStakeDistributionSignableBuilder { let mk_tree = Self::compute_merkle_tree_from_stake_distribution(pools_with_stake)?; - let mut protocol_message = seed_protocol_message; + let mut protocol_message = ProtocolMessage::new(); protocol_message.set_message_part( ProtocolMessagePartKey::CardanoStakeDistributionEpoch, epoch.to_string(), @@ -146,7 +142,6 @@ mod tests { #[tokio::test] async fn compute_protocol_message_returns_error_when_no_cardano_stake_distribution_found() { let epoch = Epoch(1); - let seed_protocol_message = ProtocolMessage::new(); let mut cardano_stake_distribution_retriever = MockStakeDistributionRetriever::new(); cardano_stake_distribution_retriever @@ -158,7 +153,7 @@ mod tests { )); cardano_stake_distribution_signable_builder - .compute_protocol_message(epoch, seed_protocol_message) + .compute_protocol_message(epoch) .await .expect_err("Should return an error when no cardano stake distribution found"); } @@ -169,7 +164,6 @@ mod tests { let epoch_to_retrieve = Epoch(3); let stake_distribution = StakeDistribution::from([("pool-123".to_string(), 100)]); let stake_distribution_clone = stake_distribution.clone(); - let seed_protocol_message = ProtocolMessage::new(); let mut pools_with_stake_retriever = MockStakeDistributionRetriever::new(); pools_with_stake_retriever @@ -180,7 +174,7 @@ mod tests { CardanoStakeDistributionSignableBuilder::new(Arc::new(pools_with_stake_retriever)); let signable = cardano_stake_distribution_signable_builder - .compute_protocol_message(epoch, seed_protocol_message) + .compute_protocol_message(epoch) .await .unwrap(); diff --git a/mithril-common/src/signable_builder/cardano_transactions.rs b/mithril-common/src/signable_builder/cardano_transactions.rs index bc84789b5f0..7b99884ad6a 100644 --- a/mithril-common/src/signable_builder/cardano_transactions.rs +++ b/mithril-common/src/signable_builder/cardano_transactions.rs @@ -73,11 +73,7 @@ impl CardanoTransactionsSignableBuilder { #[async_trait] impl SignableBuilder for CardanoTransactionsSignableBuilder { - async fn compute_protocol_message( - &self, - beacon: BlockNumber, - seed_protocol_message: ProtocolMessage, - ) -> StdResult { + async fn compute_protocol_message(&self, beacon: BlockNumber) -> StdResult { debug!( self.logger, "Compute protocol message for CardanoTransactions at block_number: {beacon}" @@ -91,7 +87,7 @@ impl SignableBuilder for CardanoTransactionsSignab .await? .compute_root()?; - let mut protocol_message = seed_protocol_message; + let mut protocol_message = ProtocolMessage::new(); protocol_message.set_message_part( ProtocolMessagePartKey::CardanoTransactionsMerkleRoot, mk_root.to_hex(), @@ -132,7 +128,6 @@ mod tests { async fn test_compute_signable() { // Arrange let block_number = BlockNumber(1453); - let seed_protocol_message = ProtocolMessage::new(); let transactions = CardanoTransactionsBuilder::new().build_transactions(3); let mk_map = compute_mk_map_from_transactions(transactions.clone()); let mut transaction_importer = MockTransactionsImporter::new(); @@ -153,7 +148,7 @@ mod tests { // Action let signable = cardano_transactions_signable_builder - .compute_protocol_message(block_number, seed_protocol_message) + .compute_protocol_message(block_number) .await .unwrap(); @@ -173,7 +168,6 @@ mod tests { #[tokio::test] async fn test_compute_signable_with_no_block_range_root_return_error() { let block_number = BlockNumber(50); - let seed_protocol_message = ProtocolMessage::new(); let mut transaction_importer = MockTransactionsImporter::new(); transaction_importer.expect_import().return_once(|_| Ok(())); let mut block_range_root_retriever = MockBlockRangeRootRetriever::new(); @@ -187,7 +181,7 @@ mod tests { ); let result = cardano_transactions_signable_builder - .compute_protocol_message(block_number, seed_protocol_message) + .compute_protocol_message(block_number) .await; assert!(result.is_err()); diff --git a/mithril-common/src/signable_builder/interface.rs b/mithril-common/src/signable_builder/interface.rs index 94bf6f0a951..b67638f1066 100644 --- a/mithril-common/src/signable_builder/interface.rs +++ b/mithril-common/src/signable_builder/interface.rs @@ -24,11 +24,7 @@ where U: Beacon, { /// Compute a protocol message - async fn compute_protocol_message( - &self, - beacon: U, - seed_protocol_message: ProtocolMessage, - ) -> StdResult; + async fn compute_protocol_message(&self, beacon: U) -> StdResult; } /// SignableSeedBuilder is a trait for building a seed protocol message diff --git a/mithril-common/src/signable_builder/mithril_stake_distribution.rs b/mithril-common/src/signable_builder/mithril_stake_distribution.rs index 0644cbe559a..39aabd54e41 100644 --- a/mithril-common/src/signable_builder/mithril_stake_distribution.rs +++ b/mithril-common/src/signable_builder/mithril_stake_distribution.rs @@ -12,12 +12,8 @@ pub struct MithrilStakeDistributionSignableBuilder {} #[async_trait] impl SignableBuilder for MithrilStakeDistributionSignableBuilder { - async fn compute_protocol_message( - &self, - _beacon: Epoch, - seed_protocol_message: ProtocolMessage, - ) -> StdResult { - Ok(seed_protocol_message) + async fn compute_protocol_message(&self, _beacon: Epoch) -> StdResult { + Ok(ProtocolMessage::new()) } } @@ -27,11 +23,10 @@ mod tests { #[tokio::test] async fn test_compute_signable() { - let seed_protocol_message = ProtocolMessage::new(); let mithril_stake_distribution_signable_builder = MithrilStakeDistributionSignableBuilder::default(); let signable = mithril_stake_distribution_signable_builder - .compute_protocol_message(Epoch(1), seed_protocol_message) + .compute_protocol_message(Epoch(1)) .await .unwrap(); let signable_expected = ProtocolMessage::new(); diff --git a/mithril-common/src/signable_builder/signable_builder_service.rs b/mithril-common/src/signable_builder/signable_builder_service.rs index a48d9864d80..a212d1cbbb3 100644 --- a/mithril-common/src/signable_builder/signable_builder_service.rs +++ b/mithril-common/src/signable_builder/signable_builder_service.rs @@ -56,38 +56,38 @@ impl SignableBuilderService for MithrilSignableBuilderService { &self, signed_entity_type: SignedEntityType, ) -> StdResult { - let seed_protocol_message = self - .seed_signable_builder - .compute_seed_protocol_message() - .await?; let protocol_message = match signed_entity_type { SignedEntityType::MithrilStakeDistribution(e) => self .mithril_stake_distribution_builder - .compute_protocol_message(e, seed_protocol_message) + .compute_protocol_message(e) .await .with_context(|| format!( "Signable builder service can not compute protocol message with epoch: '{e}'" ))?, SignedEntityType::CardanoImmutableFilesFull(beacon) => self .immutable_signable_builder - .compute_protocol_message(beacon.clone(), seed_protocol_message) + .compute_protocol_message(beacon.clone()) .await .with_context(|| format!( "Signable builder service can not compute protocol message with beacon: '{beacon}'" ))?, SignedEntityType::CardanoStakeDistribution(e) => self .cardano_stake_distribution_builder - .compute_protocol_message(e, seed_protocol_message) + .compute_protocol_message(e) .await .with_context(|| "Signable builder service can not compute protocol message for Cardano stake distribution with epoch: '{e}")?, SignedEntityType::CardanoTransactions(_, block_number) => self .cardano_transactions_signable_builder - .compute_protocol_message(block_number, seed_protocol_message) + .compute_protocol_message(block_number) .await .with_context(|| format!( "Signable builder service can not compute protocol message with block_number: '{block_number}'" ))?, }; + let seed_protocol_message = self + .seed_signable_builder + .compute_seed_protocol_message() + .await?; Ok(protocol_message) } @@ -112,7 +112,7 @@ mod tests { #[async_trait] impl SignableBuilder for SignableBuilderImpl where U: Beaconnable, { - async fn compute_protocol_message(&self, beacon: U, seed_protocol_message: ProtocolMessage) -> StdResult; + async fn compute_protocol_message(&self, beacon: U) -> StdResult; } } @@ -171,7 +171,7 @@ mod tests { .mock_mithril_stake_distribution_signable_builder .expect_compute_protocol_message() .once() - .return_once(move |_, _| Ok(protocol_message_clone)); + .return_once(move |_| Ok(protocol_message_clone)); let signable_builder_service = mock_container.build_signable_builder_service(); let signed_entity_type = SignedEntityType::MithrilStakeDistribution(Epoch(1)); @@ -195,7 +195,7 @@ mod tests { .mock_cardano_immutable_files_full_signable_builder .expect_compute_protocol_message() .once() - .return_once(move |_, _| Ok(protocol_message_clone)); + .return_once(move |_| Ok(protocol_message_clone)); let signable_builder_service = mock_container.build_signable_builder_service(); let signed_entity_type = SignedEntityType::CardanoImmutableFilesFull(CardanoDbBeacon::default()); @@ -220,7 +220,7 @@ mod tests { .mock_cardano_transactions_signable_builder .expect_compute_protocol_message() .once() - .return_once(move |_, _| Ok(protocol_message_clone)); + .return_once(move |_| Ok(protocol_message_clone)); let signable_builder_service = mock_container.build_signable_builder_service(); let signed_entity_type = SignedEntityType::CardanoTransactions(Epoch(5), BlockNumber(1000)); @@ -245,7 +245,7 @@ mod tests { .mock_cardano_stake_distribution_signable_builder .expect_compute_protocol_message() .once() - .return_once(move |_, _| Ok(protocol_message_clone)); + .return_once(move |_| Ok(protocol_message_clone)); let signable_builder_service = mock_container.build_signable_builder_service(); let signed_entity_type = SignedEntityType::CardanoStakeDistribution(Epoch(5)); From 64dca076e8dc708b867195614ae78898b0c2960f Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Tue, 24 Sep 2024 15:26:45 +0200 Subject: [PATCH 047/274] refactor: make signable seed builder use an existing protocol message --- .../src/services/signable_seed_builder.rs | 12 +++++----- .../src/signable_builder/interface.rs | 7 ++++-- .../signable_builder_service.rs | 22 +++++++++---------- .../src/services/signable_seed_builder.rs | 12 +++++----- 4 files changed, 30 insertions(+), 23 deletions(-) diff --git a/mithril-aggregator/src/services/signable_seed_builder.rs b/mithril-aggregator/src/services/signable_seed_builder.rs index f3303bcf0de..706b741c4ad 100644 --- a/mithril-aggregator/src/services/signable_seed_builder.rs +++ b/mithril-aggregator/src/services/signable_seed_builder.rs @@ -30,10 +30,12 @@ impl SignableSeedBuilderService { #[async_trait] impl SignableSeedBuilder for SignableSeedBuilderService { - /// Compute seed protocol message - async fn compute_seed_protocol_message(&self) -> StdResult { + async fn compute_seeded_protocol_message( + &self, + protocol_message: ProtocolMessage, + ) -> StdResult { let epoch_service = self.epoch_service.read().await; - let mut protocol_message = ProtocolMessage::new(); + let mut protocol_message = protocol_message; protocol_message.set_message_part( ProtocolMessagePartKey::NextAggregateVerificationKey, (*epoch_service) @@ -56,7 +58,7 @@ mod tests { use super::*; #[tokio::test] - async fn test_compute_seed_protocol_message() { + async fn test_compute_seeded_protocol_message() { let epoch = Epoch(5); let fixture = MithrilFixtureBuilder::default().with_signers(5).build(); let next_fixture = MithrilFixtureBuilder::default().with_signers(4).build(); @@ -72,7 +74,7 @@ mod tests { let signable_seed_builder_service = SignableSeedBuilderService::new(epoch_service); let protocol_message = signable_seed_builder_service - .compute_seed_protocol_message() + .compute_seeded_protocol_message(ProtocolMessage::new()) .await .unwrap(); diff --git a/mithril-common/src/signable_builder/interface.rs b/mithril-common/src/signable_builder/interface.rs index b67638f1066..bddf01fcbca 100644 --- a/mithril-common/src/signable_builder/interface.rs +++ b/mithril-common/src/signable_builder/interface.rs @@ -31,6 +31,9 @@ where #[cfg_attr(test, automock)] #[async_trait] pub trait SignableSeedBuilder: Send + Sync { - /// Compute seed protocol message - async fn compute_seed_protocol_message(&self) -> StdResult; + /// Compute seeded protocol message + async fn compute_seeded_protocol_message( + &self, + protocol_message: ProtocolMessage, + ) -> StdResult; } diff --git a/mithril-common/src/signable_builder/signable_builder_service.rs b/mithril-common/src/signable_builder/signable_builder_service.rs index a212d1cbbb3..7ad5a05a91b 100644 --- a/mithril-common/src/signable_builder/signable_builder_service.rs +++ b/mithril-common/src/signable_builder/signable_builder_service.rs @@ -84,9 +84,9 @@ impl SignableBuilderService for MithrilSignableBuilderService { "Signable builder service can not compute protocol message with block_number: '{block_number}'" ))?, }; - let seed_protocol_message = self + let protocol_message = self .seed_signable_builder - .compute_seed_protocol_message() + .compute_seeded_protocol_message(protocol_message) .await?; Ok(protocol_message) @@ -121,7 +121,7 @@ mod tests { #[async_trait] impl SignableSeedBuilder for SignableSeedBuilderImpl { - async fn compute_seed_protocol_message(&self) -> StdResult; + async fn compute_seeded_protocol_message(&self, protocol_message: ProtocolMessage) -> StdResult; } } @@ -164,9 +164,9 @@ mod tests { let mut mock_container = MockDependencyInjector::new(); mock_container .mock_signable_seed_builder - .expect_compute_seed_protocol_message() + .expect_compute_seeded_protocol_message() .once() - .return_once(move || Ok(ProtocolMessage::new())); + .return_once(move |_| Ok(ProtocolMessage::new())); mock_container .mock_mithril_stake_distribution_signable_builder .expect_compute_protocol_message() @@ -188,9 +188,9 @@ mod tests { let mut mock_container = MockDependencyInjector::new(); mock_container .mock_signable_seed_builder - .expect_compute_seed_protocol_message() + .expect_compute_seeded_protocol_message() .once() - .return_once(move || Ok(ProtocolMessage::new())); + .return_once(move |_| Ok(ProtocolMessage::new())); mock_container .mock_cardano_immutable_files_full_signable_builder .expect_compute_protocol_message() @@ -213,9 +213,9 @@ mod tests { let mut mock_container = MockDependencyInjector::new(); mock_container .mock_signable_seed_builder - .expect_compute_seed_protocol_message() + .expect_compute_seeded_protocol_message() .once() - .return_once(move || Ok(ProtocolMessage::new())); + .return_once(move |_| Ok(ProtocolMessage::new())); mock_container .mock_cardano_transactions_signable_builder .expect_compute_protocol_message() @@ -238,9 +238,9 @@ mod tests { let mut mock_container = MockDependencyInjector::new(); mock_container .mock_signable_seed_builder - .expect_compute_seed_protocol_message() + .expect_compute_seeded_protocol_message() .once() - .return_once(move || Ok(ProtocolMessage::new())); + .return_once(move |_| Ok(ProtocolMessage::new())); mock_container .mock_cardano_stake_distribution_signable_builder .expect_compute_protocol_message() diff --git a/mithril-signer/src/services/signable_seed_builder.rs b/mithril-signer/src/services/signable_seed_builder.rs index 140cb0a5fa1..dd824a3b938 100644 --- a/mithril-signer/src/services/signable_seed_builder.rs +++ b/mithril-signer/src/services/signable_seed_builder.rs @@ -43,9 +43,11 @@ impl SignableSeedBuilderService { #[async_trait] impl SignableSeedBuilder for SignableSeedBuilderService { - /// Compute seed protocol message - async fn compute_seed_protocol_message(&self) -> StdResult { - let mut protocol_message = ProtocolMessage::new(); + async fn compute_seeded_protocol_message( + &self, + protocol_message: ProtocolMessage, + ) -> StdResult { + let mut protocol_message = protocol_message; let epoch_service = self.epoch_service.read().await; let epoch = (*epoch_service).epoch_of_current_data()?; let next_signer_retrieval_epoch = epoch.offset_to_next_signer_retrieval_epoch(); @@ -85,7 +87,7 @@ mod tests { use super::*; #[tokio::test] - async fn test_compute_seed_protocol_message() { + async fn test_compute_seeded_protocol_message() { let epoch = Epoch(5); let fixture = MithrilFixtureBuilder::default().with_signers(5).build(); let next_fixture = MithrilFixtureBuilder::default().with_signers(4).build(); @@ -123,7 +125,7 @@ mod tests { ); let protocol_message = signable_seed_builder_service - .compute_seed_protocol_message() + .compute_seeded_protocol_message(ProtocolMessage::new()) .await .unwrap(); From 8af7ef79abe6645b4fffea646859ebc8b022e00d Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Tue, 24 Sep 2024 15:57:12 +0200 Subject: [PATCH 048/274] refactor: make signable seed builder compute protocol message part values And let the responsibility of using it in the signable builder service. --- .../src/services/signable_seed_builder.rs | 36 ++++------ .../src/signable_builder/interface.rs | 14 ++-- .../signable_builder_service.rs | 67 +++++++++++++------ .../src/services/signable_seed_builder.rs | 27 +++----- 4 files changed, 79 insertions(+), 65 deletions(-) diff --git a/mithril-aggregator/src/services/signable_seed_builder.rs b/mithril-aggregator/src/services/signable_seed_builder.rs index 706b741c4ad..267d4001856 100644 --- a/mithril-aggregator/src/services/signable_seed_builder.rs +++ b/mithril-aggregator/src/services/signable_seed_builder.rs @@ -9,9 +9,7 @@ use std::sync::Arc; use tokio::sync::RwLock; use mithril_common::{ - entities::{ProtocolMessage, ProtocolMessagePartKey}, - signable_builder::SignableSeedBuilder, - StdResult, + entities::ProtocolMessagePartValue, signable_builder::SignableSeedBuilder, StdResult, }; use crate::services::EpochService; @@ -30,22 +28,17 @@ impl SignableSeedBuilderService { #[async_trait] impl SignableSeedBuilder for SignableSeedBuilderService { - async fn compute_seeded_protocol_message( + async fn compute_next_aggregate_verification_key_protocol_message_part_value( &self, - protocol_message: ProtocolMessage, - ) -> StdResult { + ) -> StdResult { let epoch_service = self.epoch_service.read().await; - let mut protocol_message = protocol_message; - protocol_message.set_message_part( - ProtocolMessagePartKey::NextAggregateVerificationKey, - (*epoch_service) - .next_aggregate_verification_key()? - .to_json_hex() - .with_context(|| "convert next avk to json hex failure")? - .to_string(), - ); + let next_aggregate_verification_key = (*epoch_service) + .next_aggregate_verification_key()? + .to_json_hex() + .with_context(|| "convert next avk to json hex failure")? + .to_string(); - Ok(protocol_message) + Ok(next_aggregate_verification_key) } } @@ -58,7 +51,7 @@ mod tests { use super::*; #[tokio::test] - async fn test_compute_seeded_protocol_message() { + async fn test_compute_next_aggregate_verification_key_protocol_message_value() { let epoch = Epoch(5); let fixture = MithrilFixtureBuilder::default().with_signers(5).build(); let next_fixture = MithrilFixtureBuilder::default().with_signers(4).build(); @@ -73,15 +66,14 @@ mod tests { ))); let signable_seed_builder_service = SignableSeedBuilderService::new(epoch_service); - let protocol_message = signable_seed_builder_service - .compute_seeded_protocol_message(ProtocolMessage::new()) + let next_aggregate_verification_key = signable_seed_builder_service + .compute_next_aggregate_verification_key_protocol_message_part_value() .await .unwrap(); assert_eq!( - protocol_message - .get_message_part(&ProtocolMessagePartKey::NextAggregateVerificationKey), - Some(&expected_next_aggregate_verification_key) + next_aggregate_verification_key, + expected_next_aggregate_verification_key ); } } diff --git a/mithril-common/src/signable_builder/interface.rs b/mithril-common/src/signable_builder/interface.rs index bddf01fcbca..45a89fa53d9 100644 --- a/mithril-common/src/signable_builder/interface.rs +++ b/mithril-common/src/signable_builder/interface.rs @@ -1,7 +1,10 @@ use async_trait::async_trait; use std::fmt::Debug; -use crate::{entities::ProtocolMessage, StdResult}; +use crate::{ + entities::{ProtocolMessage, ProtocolMessagePartValue}, + StdResult, +}; #[cfg(test)] use mockall::automock; @@ -27,13 +30,12 @@ where async fn compute_protocol_message(&self, beacon: U) -> StdResult; } -/// SignableSeedBuilder is a trait for building a seed protocol message +/// SignableSeedBuilder is a trait for building seed protocol message part values #[cfg_attr(test, automock)] #[async_trait] pub trait SignableSeedBuilder: Send + Sync { - /// Compute seeded protocol message - async fn compute_seeded_protocol_message( + /// Compute next aggregate verification key protocol message part value + async fn compute_next_aggregate_verification_key_protocol_message_part_value( &self, - protocol_message: ProtocolMessage, - ) -> StdResult; + ) -> StdResult; } diff --git a/mithril-common/src/signable_builder/signable_builder_service.rs b/mithril-common/src/signable_builder/signable_builder_service.rs index 7ad5a05a91b..60b667c0b57 100644 --- a/mithril-common/src/signable_builder/signable_builder_service.rs +++ b/mithril-common/src/signable_builder/signable_builder_service.rs @@ -3,16 +3,16 @@ use async_trait::async_trait; use std::sync::Arc; use crate::{ - entities::{BlockNumber, CardanoDbBeacon, Epoch, ProtocolMessage, SignedEntityType}, + entities::{ + BlockNumber, CardanoDbBeacon, Epoch, ProtocolMessage, ProtocolMessagePartKey, + SignedEntityType, + }, signable_builder::{SignableBuilder, SignableSeedBuilder}, StdResult, }; -#[cfg(test)] -use mockall::automock; - /// ArtifactBuilder Service trait -#[cfg_attr(test, automock)] +#[cfg_attr(test, mockall::automock)] #[async_trait] pub trait SignableBuilderService: Send + Sync { /// Compute signable from signed entity type @@ -48,11 +48,8 @@ impl MithrilSignableBuilderService { cardano_stake_distribution_builder, } } -} -#[async_trait] -impl SignableBuilderService for MithrilSignableBuilderService { - async fn compute_protocol_message( + async fn compute_signed_entity_protocol_message( &self, signed_entity_type: SignedEntityType, ) -> StdResult { @@ -84,8 +81,38 @@ impl SignableBuilderService for MithrilSignableBuilderService { "Signable builder service can not compute protocol message with block_number: '{block_number}'" ))?, }; - let protocol_message = self + + Ok(protocol_message) + } + + async fn compute_seeded_protocol_message( + &self, + protocol_message: ProtocolMessage, + ) -> StdResult { + let next_aggregate_verification_key = self .seed_signable_builder + .compute_next_aggregate_verification_key_protocol_message_part_value() + .await?; + let mut protocol_message = protocol_message; + protocol_message.set_message_part( + ProtocolMessagePartKey::NextAggregateVerificationKey, + next_aggregate_verification_key, + ); + + Ok(protocol_message) + } +} + +#[async_trait] +impl SignableBuilderService for MithrilSignableBuilderService { + async fn compute_protocol_message( + &self, + signed_entity_type: SignedEntityType, + ) -> StdResult { + let protocol_message = self + .compute_signed_entity_protocol_message(signed_entity_type) + .await?; + let protocol_message = self .compute_seeded_protocol_message(protocol_message) .await?; @@ -98,7 +125,7 @@ mod tests { use super::*; use crate::{ - entities::{BlockNumber, Epoch, ProtocolMessage}, + entities::{BlockNumber, Epoch, ProtocolMessage, ProtocolMessagePartValue}, signable_builder::{Beacon as Beaconnable, SignableBuilder}, StdResult, }; @@ -121,7 +148,7 @@ mod tests { #[async_trait] impl SignableSeedBuilder for SignableSeedBuilderImpl { - async fn compute_seeded_protocol_message(&self, protocol_message: ProtocolMessage) -> StdResult; + async fn compute_next_aggregate_verification_key_protocol_message_part_value(&self) -> StdResult; } } @@ -164,9 +191,9 @@ mod tests { let mut mock_container = MockDependencyInjector::new(); mock_container .mock_signable_seed_builder - .expect_compute_seeded_protocol_message() + .expect_compute_next_aggregate_verification_key_protocol_message_value() .once() - .return_once(move |_| Ok(ProtocolMessage::new())); + .return_once(move || Ok("next-avk-123".to_string())); mock_container .mock_mithril_stake_distribution_signable_builder .expect_compute_protocol_message() @@ -188,9 +215,9 @@ mod tests { let mut mock_container = MockDependencyInjector::new(); mock_container .mock_signable_seed_builder - .expect_compute_seeded_protocol_message() + .expect_compute_next_aggregate_verification_key_protocol_message_value() .once() - .return_once(move |_| Ok(ProtocolMessage::new())); + .return_once(move || Ok("next-avk-123".to_string())); mock_container .mock_cardano_immutable_files_full_signable_builder .expect_compute_protocol_message() @@ -213,9 +240,9 @@ mod tests { let mut mock_container = MockDependencyInjector::new(); mock_container .mock_signable_seed_builder - .expect_compute_seeded_protocol_message() + .expect_compute_next_aggregate_verification_key_protocol_message_value() .once() - .return_once(move |_| Ok(ProtocolMessage::new())); + .return_once(move || Ok("next-avk-123".to_string())); mock_container .mock_cardano_transactions_signable_builder .expect_compute_protocol_message() @@ -238,9 +265,9 @@ mod tests { let mut mock_container = MockDependencyInjector::new(); mock_container .mock_signable_seed_builder - .expect_compute_seeded_protocol_message() + .expect_compute_next_aggregate_verification_key_protocol_message_value() .once() - .return_once(move |_| Ok(ProtocolMessage::new())); + .return_once(move || Ok("next-avk-123".to_string())); mock_container .mock_cardano_stake_distribution_signable_builder .expect_compute_protocol_message() diff --git a/mithril-signer/src/services/signable_seed_builder.rs b/mithril-signer/src/services/signable_seed_builder.rs index dd824a3b938..1824573a283 100644 --- a/mithril-signer/src/services/signable_seed_builder.rs +++ b/mithril-signer/src/services/signable_seed_builder.rs @@ -9,9 +9,7 @@ use std::sync::Arc; use tokio::sync::RwLock; use mithril_common::{ - entities::{ProtocolMessage, ProtocolMessagePartKey}, - signable_builder::SignableSeedBuilder, - StdResult, + entities::ProtocolMessagePartValue, signable_builder::SignableSeedBuilder, StdResult, }; use crate::{ @@ -43,11 +41,9 @@ impl SignableSeedBuilderService { #[async_trait] impl SignableSeedBuilder for SignableSeedBuilderService { - async fn compute_seeded_protocol_message( + async fn compute_next_aggregate_verification_key_protocol_message_part_value( &self, - protocol_message: ProtocolMessage, - ) -> StdResult { - let mut protocol_message = protocol_message; + ) -> StdResult { let epoch_service = self.epoch_service.read().await; let epoch = (*epoch_service).epoch_of_current_data()?; let next_signer_retrieval_epoch = epoch.offset_to_next_signer_retrieval_epoch(); @@ -60,17 +56,15 @@ impl SignableSeedBuilder for SignableSeedBuilderService { })?; let next_signers_with_stake = epoch_service.next_signers_with_stake().await?; - let avk = self + let next_aggregate_verification_key = self .single_signer .compute_aggregate_verification_key( &next_signers_with_stake, &next_protocol_initializer, )? .ok_or_else(|| anyhow!("next_signers avk".to_string()))?; - protocol_message - .set_message_part(ProtocolMessagePartKey::NextAggregateVerificationKey, avk); - Ok(protocol_message) + Ok(next_aggregate_verification_key) } } @@ -87,7 +81,7 @@ mod tests { use super::*; #[tokio::test] - async fn test_compute_seeded_protocol_message() { + async fn test_compute_next_aggregate_verification_key_protocol_message_value() { let epoch = Epoch(5); let fixture = MithrilFixtureBuilder::default().with_signers(5).build(); let next_fixture = MithrilFixtureBuilder::default().with_signers(4).build(); @@ -124,15 +118,14 @@ mod tests { protocol_initializer_store, ); - let protocol_message = signable_seed_builder_service - .compute_seeded_protocol_message(ProtocolMessage::new()) + let next_aggregate_verification_key = signable_seed_builder_service + .compute_next_aggregate_verification_key_protocol_message_part_value() .await .unwrap(); assert_eq!( - protocol_message - .get_message_part(&ProtocolMessagePartKey::NextAggregateVerificationKey), - Some(&expected_next_aggregate_verification_key) + next_aggregate_verification_key, + expected_next_aggregate_verification_key ); } } From 695f694c43547e1725b827be8ebe535354daea68 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Tue, 24 Sep 2024 16:11:05 +0200 Subject: [PATCH 049/274] refactor: rename 'SignableSeedBuilderService' to 'AggregatorSignableSeedBuilder' in aggregator --- .../src/dependency_injection/builder.rs | 10 +++++----- .../src/services/signable_seed_builder.rs | 14 +++++++------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/mithril-aggregator/src/dependency_injection/builder.rs b/mithril-aggregator/src/dependency_injection/builder.rs index fbda8d42c9d..d69b18090a6 100644 --- a/mithril-aggregator/src/dependency_injection/builder.rs +++ b/mithril-aggregator/src/dependency_injection/builder.rs @@ -67,10 +67,10 @@ use crate::{ event_store::{EventMessage, EventStore, TransmitterService}, http_server::routes::router, services::{ - AggregatorUpkeepService, BufferedCertifierService, CardanoTransactionsImporter, - CertifierService, MessageService, MithrilCertifierService, MithrilEpochService, - MithrilMessageService, MithrilProverService, MithrilSignedEntityService, - MithrilStakeDistributionService, ProverService, SignableSeedBuilderService, + AggregatorSignableSeedBuilder, AggregatorUpkeepService, BufferedCertifierService, + CardanoTransactionsImporter, CertifierService, MessageService, MithrilCertifierService, + MithrilEpochService, MithrilMessageService, MithrilProverService, + MithrilSignedEntityService, MithrilStakeDistributionService, ProverService, SignedEntityService, StakeDistributionService, UpkeepService, }, tools::{CExplorerSignerRetriever, GcpFileUploader, GenesisToolsDependency, SignersImporter}, @@ -1129,7 +1129,7 @@ impl DependenciesBuilder { async fn build_signable_seed_builder_service( &mut self, ) -> Result> { - let signable_seed_builder_service = Arc::new(SignableSeedBuilderService::new( + let signable_seed_builder_service = Arc::new(AggregatorSignableSeedBuilder::new( self.get_epoch_service().await?, )); diff --git a/mithril-aggregator/src/services/signable_seed_builder.rs b/mithril-aggregator/src/services/signable_seed_builder.rs index 267d4001856..46b661b1b36 100644 --- a/mithril-aggregator/src/services/signable_seed_builder.rs +++ b/mithril-aggregator/src/services/signable_seed_builder.rs @@ -14,20 +14,20 @@ use mithril_common::{ use crate::services::EpochService; -/// SignableSeedBuilder service -pub struct SignableSeedBuilderService { +/// SignableSeedBuilder aggregator implementation +pub struct AggregatorSignableSeedBuilder { epoch_service: Arc>, } -impl SignableSeedBuilderService { - /// SignableSeedBuilderService factory +impl AggregatorSignableSeedBuilder { + /// AggregatorSignableSeedBuilder factory pub fn new(epoch_service: Arc>) -> Self { Self { epoch_service } } } #[async_trait] -impl SignableSeedBuilder for SignableSeedBuilderService { +impl SignableSeedBuilder for AggregatorSignableSeedBuilder { async fn compute_next_aggregate_verification_key_protocol_message_part_value( &self, ) -> StdResult { @@ -64,9 +64,9 @@ mod tests { &fixture.signers_with_stake(), &next_fixture.signers_with_stake(), ))); - let signable_seed_builder_service = SignableSeedBuilderService::new(epoch_service); + let signable_seed_builder = AggregatorSignableSeedBuilder::new(epoch_service); - let next_aggregate_verification_key = signable_seed_builder_service + let next_aggregate_verification_key = signable_seed_builder .compute_next_aggregate_verification_key_protocol_message_part_value() .await .unwrap(); From cc2d75f5fea77974d5f3c5fd37e3f3fe7f1f813d Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Tue, 24 Sep 2024 16:11:23 +0200 Subject: [PATCH 050/274] refactor: rename 'SignableSeedBuilderService' to 'SignerSignableSeedBuilder' in signer --- mithril-signer/src/dependency_injection/builder.rs | 4 ++-- mithril-signer/src/runtime/runner.rs | 4 ++-- .../src/services/signable_seed_builder.rs | 14 +++++++------- .../tests/test_extensions/state_machine_tester.rs | 4 ++-- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/mithril-signer/src/dependency_injection/builder.rs b/mithril-signer/src/dependency_injection/builder.rs index eb6cc235a9d..57926f5738c 100644 --- a/mithril-signer/src/dependency_injection/builder.rs +++ b/mithril-signer/src/dependency_injection/builder.rs @@ -39,7 +39,7 @@ use crate::dependency_injection::SignerDependencyContainer; use crate::services::{ AggregatorHTTPClient, CardanoTransactionsImporter, CardanoTransactionsPreloaderActivationSigner, MithrilEpochService, MithrilSingleSigner, - SignableSeedBuilderService, SignerUpkeepService, TransactionsImporterByChunk, + SignerSignableSeedBuilder, SignerUpkeepService, TransactionsImporterByChunk, TransactionsImporterWithPruner, TransactionsImporterWithVacuum, }; use crate::store::{MKTreeStoreSqlite, ProtocolInitializerStore}; @@ -321,7 +321,7 @@ impl<'a> DependenciesBuilder<'a> { CardanoStakeDistributionSignableBuilder::new(stake_store.clone()), ); let epoch_service = Arc::new(RwLock::new(MithrilEpochService::new(stake_store.clone()))); - let signable_seed_builder_service = Arc::new(SignableSeedBuilderService::new( + let signable_seed_builder_service = Arc::new(SignerSignableSeedBuilder::new( epoch_service.clone(), single_signer.clone(), protocol_initializer_store.clone(), diff --git a/mithril-signer/src/runtime/runner.rs b/mithril-signer/src/runtime/runner.rs index e7095446adb..ee3ebc4d3e6 100644 --- a/mithril-signer/src/runtime/runner.rs +++ b/mithril-signer/src/runtime/runner.rs @@ -455,7 +455,7 @@ mod tests { services::{ CardanoTransactionsImporter, DumbAggregatorClient, MithrilEpochService, MithrilSingleSigner, MockAggregatorClient, MockTransactionStore, MockUpkeepService, - SignableSeedBuilderService, SingleSigner, + SignerSignableSeedBuilder, SingleSigner, }, store::ProtocolInitializerStore, }; @@ -605,7 +605,7 @@ mod tests { let single_signer = Arc::new(MithrilSingleSigner::new(party_id)); let protocol_initializer_store = Arc::new(ProtocolInitializerStore::new(Box::new(adapter), None)); - let signable_seed_builder_service = Arc::new(SignableSeedBuilderService::new( + let signable_seed_builder_service = Arc::new(SignerSignableSeedBuilder::new( epoch_service.clone(), single_signer.clone(), protocol_initializer_store.clone(), diff --git a/mithril-signer/src/services/signable_seed_builder.rs b/mithril-signer/src/services/signable_seed_builder.rs index 1824573a283..b9e4cebfb76 100644 --- a/mithril-signer/src/services/signable_seed_builder.rs +++ b/mithril-signer/src/services/signable_seed_builder.rs @@ -17,15 +17,15 @@ use crate::{ store::ProtocolInitializerStorer, }; -/// SignableSeedBuilder service -pub struct SignableSeedBuilderService { +/// SignableSeedBuilder signer implementation +pub struct SignerSignableSeedBuilder { epoch_service: Arc>, single_signer: Arc, protocol_initializer_store: Arc, } -impl SignableSeedBuilderService { - /// SignableSeedBuilderService factory +impl SignerSignableSeedBuilder { + /// SignerSignableSeedBuilder factory pub fn new( epoch_service: Arc>, single_signer: Arc, @@ -40,7 +40,7 @@ impl SignableSeedBuilderService { } #[async_trait] -impl SignableSeedBuilder for SignableSeedBuilderService { +impl SignableSeedBuilder for SignerSignableSeedBuilder { async fn compute_next_aggregate_verification_key_protocol_message_part_value( &self, ) -> StdResult { @@ -112,13 +112,13 @@ mod tests { let epoch_service = Arc::new(RwLock::new(mock_epoch_service)); let single_signer = Arc::new(mock_single_signer); let protocol_initializer_store = Arc::new(mock_protocol_initializer_store); - let signable_seed_builder_service = SignableSeedBuilderService::new( + let signable_seed_builder = SignerSignableSeedBuilder::new( epoch_service, single_signer, protocol_initializer_store, ); - let next_aggregate_verification_key = signable_seed_builder_service + let next_aggregate_verification_key = signable_seed_builder .compute_next_aggregate_verification_key_protocol_message_part_value() .await .unwrap(); diff --git a/mithril-signer/tests/test_extensions/state_machine_tester.rs b/mithril-signer/tests/test_extensions/state_machine_tester.rs index 7ea7fe4d024..20881701954 100644 --- a/mithril-signer/tests/test_extensions/state_machine_tester.rs +++ b/mithril-signer/tests/test_extensions/state_machine_tester.rs @@ -32,7 +32,7 @@ use mithril_signer::{ metrics::*, services::{ AggregatorClient, CardanoTransactionsImporter, MithrilEpochService, MithrilSingleSigner, - SignableSeedBuilderService, SignerUpkeepService, + SignerSignableSeedBuilder, SignerUpkeepService, }, store::{MKTreeStoreSqlite, ProtocolInitializerStore, ProtocolInitializerStorer}, Configuration, MetricsService, RuntimeError, SignerRunner, SignerState, StateMachine, @@ -206,7 +206,7 @@ impl StateMachineTester { CardanoStakeDistributionSignableBuilder::new(stake_store.clone()), ); let epoch_service = Arc::new(RwLock::new(MithrilEpochService::new(stake_store.clone()))); - let signable_seed_builder_service = Arc::new(SignableSeedBuilderService::new( + let signable_seed_builder_service = Arc::new(SignerSignableSeedBuilder::new( epoch_service.clone(), single_signer.clone(), protocol_initializer_store.clone(), From 16a3ea0f6a858aee61880ca4290d1ef9f14a68dc Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Tue, 24 Sep 2024 16:27:04 +0200 Subject: [PATCH 051/274] fixup refactor: make signable seed builder compute protocol message part values --- .../src/signable_builder/signable_builder_service.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mithril-common/src/signable_builder/signable_builder_service.rs b/mithril-common/src/signable_builder/signable_builder_service.rs index 60b667c0b57..a62dd40d2cd 100644 --- a/mithril-common/src/signable_builder/signable_builder_service.rs +++ b/mithril-common/src/signable_builder/signable_builder_service.rs @@ -191,7 +191,7 @@ mod tests { let mut mock_container = MockDependencyInjector::new(); mock_container .mock_signable_seed_builder - .expect_compute_next_aggregate_verification_key_protocol_message_value() + .expect_compute_next_aggregate_verification_key_protocol_message_part_value() .once() .return_once(move || Ok("next-avk-123".to_string())); mock_container @@ -215,7 +215,7 @@ mod tests { let mut mock_container = MockDependencyInjector::new(); mock_container .mock_signable_seed_builder - .expect_compute_next_aggregate_verification_key_protocol_message_value() + .expect_compute_next_aggregate_verification_key_protocol_message_part_value() .once() .return_once(move || Ok("next-avk-123".to_string())); mock_container @@ -240,7 +240,7 @@ mod tests { let mut mock_container = MockDependencyInjector::new(); mock_container .mock_signable_seed_builder - .expect_compute_next_aggregate_verification_key_protocol_message_value() + .expect_compute_next_aggregate_verification_key_protocol_message_part_value() .once() .return_once(move || Ok("next-avk-123".to_string())); mock_container @@ -265,7 +265,7 @@ mod tests { let mut mock_container = MockDependencyInjector::new(); mock_container .mock_signable_seed_builder - .expect_compute_next_aggregate_verification_key_protocol_message_value() + .expect_compute_next_aggregate_verification_key_protocol_message_part_value() .once() .return_once(move || Ok("next-avk-123".to_string())); mock_container From 5c196f5dee1f2b32bcb34c8b594effefa84f848d Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Tue, 24 Sep 2024 16:28:13 +0200 Subject: [PATCH 052/274] refactor: move SignableSeedBuilder in a dedicated 'signable_builder' sub-module of services in aggregator --- mithril-aggregator/src/services/mod.rs | 4 ++-- mithril-aggregator/src/services/signable_builder/mod.rs | 3 +++ .../services/{ => signable_builder}/signable_seed_builder.rs | 0 3 files changed, 5 insertions(+), 2 deletions(-) create mode 100644 mithril-aggregator/src/services/signable_builder/mod.rs rename mithril-aggregator/src/services/{ => signable_builder}/signable_seed_builder.rs (100%) diff --git a/mithril-aggregator/src/services/mod.rs b/mithril-aggregator/src/services/mod.rs index 14ef4733886..a92c39b3bb0 100644 --- a/mithril-aggregator/src/services/mod.rs +++ b/mithril-aggregator/src/services/mod.rs @@ -14,7 +14,7 @@ mod certifier; mod epoch_service; mod message; mod prover; -mod signable_seed_builder; +mod signable_builder; mod signed_entity; mod stake_distribution; mod upkeep; @@ -24,7 +24,7 @@ pub use certifier::*; pub use epoch_service::*; pub use message::*; pub use prover::*; -pub use signable_seed_builder::*; +pub use signable_builder::*; pub use signed_entity::*; pub use stake_distribution::*; pub use upkeep::*; diff --git a/mithril-aggregator/src/services/signable_builder/mod.rs b/mithril-aggregator/src/services/signable_builder/mod.rs new file mode 100644 index 00000000000..0910729ee34 --- /dev/null +++ b/mithril-aggregator/src/services/signable_builder/mod.rs @@ -0,0 +1,3 @@ +mod signable_seed_builder; + +pub use signable_seed_builder::*; diff --git a/mithril-aggregator/src/services/signable_seed_builder.rs b/mithril-aggregator/src/services/signable_builder/signable_seed_builder.rs similarity index 100% rename from mithril-aggregator/src/services/signable_seed_builder.rs rename to mithril-aggregator/src/services/signable_builder/signable_seed_builder.rs From 917a18c3213b6767cca47bff3ee5da3a788431ee Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Tue, 24 Sep 2024 16:28:26 +0200 Subject: [PATCH 053/274] refactor: move SignableSeedBuilder in a dedicated 'signable_builder' sub-module of services in signer --- mithril-signer/src/services/mod.rs | 4 ++-- mithril-signer/src/services/signable_builder/mod.rs | 3 +++ .../services/{ => signable_builder}/signable_seed_builder.rs | 0 3 files changed, 5 insertions(+), 2 deletions(-) create mode 100644 mithril-signer/src/services/signable_builder/mod.rs rename mithril-signer/src/services/{ => signable_builder}/signable_seed_builder.rs (100%) diff --git a/mithril-signer/src/services/mod.rs b/mithril-signer/src/services/mod.rs index 7b3b38e1736..e6231f5d35f 100644 --- a/mithril-signer/src/services/mod.rs +++ b/mithril-signer/src/services/mod.rs @@ -12,7 +12,7 @@ mod aggregator_client; mod cardano_transactions; mod epoch_service; -mod signable_seed_builder; +mod signable_builder; mod single_signer; mod upkeep_service; @@ -21,6 +21,6 @@ pub use aggregator_client::dumb::DumbAggregatorClient; pub use aggregator_client::*; pub use cardano_transactions::*; pub use epoch_service::*; -pub use signable_seed_builder::*; +pub use signable_builder::*; pub use single_signer::*; pub use upkeep_service::*; diff --git a/mithril-signer/src/services/signable_builder/mod.rs b/mithril-signer/src/services/signable_builder/mod.rs new file mode 100644 index 00000000000..0910729ee34 --- /dev/null +++ b/mithril-signer/src/services/signable_builder/mod.rs @@ -0,0 +1,3 @@ +mod signable_seed_builder; + +pub use signable_seed_builder::*; diff --git a/mithril-signer/src/services/signable_seed_builder.rs b/mithril-signer/src/services/signable_builder/signable_seed_builder.rs similarity index 100% rename from mithril-signer/src/services/signable_seed_builder.rs rename to mithril-signer/src/services/signable_builder/signable_seed_builder.rs From c2a0f0e0edf6b24072c4a3d17f7fcfd6b4521326 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Tue, 24 Sep 2024 16:34:16 +0200 Subject: [PATCH 054/274] fix: handle merge conflicts with main branch --- mithril-signer/src/runtime/runner.rs | 4 ++-- mithril-signer/src/services/epoch_service.rs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mithril-signer/src/runtime/runner.rs b/mithril-signer/src/runtime/runner.rs index ee3ebc4d3e6..c1c36ce6c9a 100644 --- a/mithril-signer/src/runtime/runner.rs +++ b/mithril-signer/src/runtime/runner.rs @@ -6,8 +6,8 @@ use tokio::sync::RwLockReadGuard; use mithril_common::crypto_helper::{KESPeriod, OpCert, ProtocolOpCert, SerDeShelleyFileFormat}; use mithril_common::entities::{ - CertificatePending, Epoch, EpochSettings, PartyId, ProtocolMessage, SignedEntityType, Signer, - SignerWithStake, SingleSignatures, TimePoint, + CertificatePending, Epoch, PartyId, ProtocolMessage, SignedEntityType, Signer, SignerWithStake, + SingleSignatures, TimePoint, }; use mithril_common::StdResult; use mithril_persistence::store::StakeStorer; diff --git a/mithril-signer/src/services/epoch_service.rs b/mithril-signer/src/services/epoch_service.rs index 7712125cd3f..9e78a89e3ed 100644 --- a/mithril-signer/src/services/epoch_service.rs +++ b/mithril-signer/src/services/epoch_service.rs @@ -230,7 +230,7 @@ pub mod mock { impl EpochService for EpochServiceImpl { /// Inform the service a new epoch has been detected, telling it to update its /// internal state for the new epoch. - fn inform_epoch_settings(&mut self, epoch_settings: EpochSettings) -> StdResult<()>; + fn inform_epoch_settings(&mut self, epoch_settings: SignerEpochSettings) -> StdResult<()>; /// Get the current epoch for which the data stored in this service are computed. fn epoch_of_current_data(&self) -> StdResult; From bdc3ad685ec2e93c02e0a8d8be9bb162a13bbef4 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Tue, 24 Sep 2024 17:05:54 +0200 Subject: [PATCH 055/274] refactor: remove mentions to SignableSeedBuilder service in aggregator DI builder --- .../src/dependency_injection/builder.rs | 29 +++++++------------ .../signable_builder/signable_seed_builder.rs | 2 +- .../signable_builder/signable_seed_builder.rs | 2 +- 3 files changed, 12 insertions(+), 21 deletions(-) diff --git a/mithril-aggregator/src/dependency_injection/builder.rs b/mithril-aggregator/src/dependency_injection/builder.rs index d69b18090a6..e96573f4897 100644 --- a/mithril-aggregator/src/dependency_injection/builder.rs +++ b/mithril-aggregator/src/dependency_injection/builder.rs @@ -203,8 +203,8 @@ pub struct DependenciesBuilder { /// Signer Store pub signer_store: Option>, - /// Signable Seed Builder Service - pub signable_seed_builder_service: Option>, + /// Signable Seed Builder + pub signable_seed_builder: Option>, /// Signable Builder Service pub signable_builder_service: Option>, @@ -278,7 +278,7 @@ impl DependenciesBuilder { stake_distribution_service: None, ticker_service: None, signer_store: None, - signable_seed_builder_service: None, + signable_seed_builder: None, signable_builder_service: None, signed_entity_service: None, certifier_service: None, @@ -1084,7 +1084,7 @@ impl DependenciesBuilder { } async fn build_signable_builder_service(&mut self) -> Result> { - let seed_signable_builder = self.get_signable_seed_builder_service().await?; + let seed_signable_builder = self.get_signable_seed_builder().await?; let mithril_stake_distribution_builder = Arc::new(MithrilStakeDistributionSignableBuilder::default()); let immutable_signable_builder = Arc::new(CardanoImmutableFilesFullSignableBuilder::new( @@ -1126,9 +1126,7 @@ impl DependenciesBuilder { Ok(self.signable_builder_service.as_ref().cloned().unwrap()) } - async fn build_signable_seed_builder_service( - &mut self, - ) -> Result> { + async fn build_signable_seed_builder(&mut self) -> Result> { let signable_seed_builder_service = Arc::new(AggregatorSignableSeedBuilder::new( self.get_epoch_service().await?, )); @@ -1136,20 +1134,13 @@ impl DependenciesBuilder { Ok(signable_seed_builder_service) } - /// [SignableSeedBuilderService] service - pub async fn get_signable_seed_builder_service( - &mut self, - ) -> Result> { - if self.signable_seed_builder_service.is_none() { - self.signable_seed_builder_service = - Some(self.build_signable_seed_builder_service().await?); + /// [SignableSeedBuilder] service + pub async fn get_signable_seed_builder(&mut self) -> Result> { + if self.signable_seed_builder.is_none() { + self.signable_seed_builder = Some(self.build_signable_seed_builder().await?); } - Ok(self - .signable_seed_builder_service - .as_ref() - .cloned() - .unwrap()) + Ok(self.signable_seed_builder.as_ref().cloned().unwrap()) } async fn build_signed_entity_service(&mut self) -> Result> { diff --git a/mithril-aggregator/src/services/signable_builder/signable_seed_builder.rs b/mithril-aggregator/src/services/signable_builder/signable_seed_builder.rs index 46b661b1b36..4fc4cdbde6b 100644 --- a/mithril-aggregator/src/services/signable_builder/signable_seed_builder.rs +++ b/mithril-aggregator/src/services/signable_builder/signable_seed_builder.rs @@ -1,4 +1,4 @@ -//! ## SignableSeedBuilderService +//! ## AggregatorSignableSeedBuilder //! //! This service is responsible for computing the seed protocol message //! that is used by the [SignableBuilder] to compute the final protocol message. diff --git a/mithril-signer/src/services/signable_builder/signable_seed_builder.rs b/mithril-signer/src/services/signable_builder/signable_seed_builder.rs index b9e4cebfb76..0d52c079445 100644 --- a/mithril-signer/src/services/signable_builder/signable_seed_builder.rs +++ b/mithril-signer/src/services/signable_builder/signable_seed_builder.rs @@ -1,4 +1,4 @@ -//! ## SignableSeedBuilderService +//! ## SignerSignableSeedBuilder //! //! This service is responsible for computing the seed protocol message //! that is used by the [SignableBuilder] to compute the final protocol message. From aecd8e30fc5731eae6305bd45297d0a094ed3b1a Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Tue, 24 Sep 2024 18:12:41 +0200 Subject: [PATCH 056/274] refactor: remove unused custom mock implementation in SignabeBuilder tests --- .../signable_builder_service.rs | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/mithril-common/src/signable_builder/signable_builder_service.rs b/mithril-common/src/signable_builder/signable_builder_service.rs index a62dd40d2cd..2436ee1f586 100644 --- a/mithril-common/src/signable_builder/signable_builder_service.rs +++ b/mithril-common/src/signable_builder/signable_builder_service.rs @@ -125,8 +125,8 @@ mod tests { use super::*; use crate::{ - entities::{BlockNumber, Epoch, ProtocolMessage, ProtocolMessagePartValue}, - signable_builder::{Beacon as Beaconnable, SignableBuilder}, + entities::{BlockNumber, Epoch, ProtocolMessage}, + signable_builder::{Beacon as Beaconnable, MockSignableSeedBuilder, SignableBuilder}, StdResult, }; @@ -143,17 +143,8 @@ mod tests { } } - mock! { - SignableSeedBuilderImpl { } - - #[async_trait] - impl SignableSeedBuilder for SignableSeedBuilderImpl { - async fn compute_next_aggregate_verification_key_protocol_message_part_value(&self) -> StdResult; - } - } - struct MockDependencyInjector { - mock_signable_seed_builder: MockSignableSeedBuilderImpl, + mock_signable_seed_builder: MockSignableSeedBuilder, mock_mithril_stake_distribution_signable_builder: MockSignableBuilderImpl, mock_cardano_immutable_files_full_signable_builder: MockSignableBuilderImpl, @@ -164,7 +155,7 @@ mod tests { impl MockDependencyInjector { fn new() -> MockDependencyInjector { MockDependencyInjector { - mock_signable_seed_builder: MockSignableSeedBuilderImpl::new(), + mock_signable_seed_builder: MockSignableSeedBuilder::new(), mock_mithril_stake_distribution_signable_builder: MockSignableBuilderImpl::new(), mock_cardano_immutable_files_full_signable_builder: MockSignableBuilderImpl::new(), mock_cardano_stake_distribution_signable_builder: MockSignableBuilderImpl::new(), From f4c22a132117d2f9ad50f42c87748df857527778 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Tue, 24 Sep 2024 18:16:49 +0200 Subject: [PATCH 057/274] refactor: rename 'mock' sub module of Epoch Service in 'mock_epoch_service' --- mithril-signer/src/services/epoch_service.rs | 2 +- .../src/services/signable_builder/signable_seed_builder.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mithril-signer/src/services/epoch_service.rs b/mithril-signer/src/services/epoch_service.rs index 9e78a89e3ed..d6d7ca44cb0 100644 --- a/mithril-signer/src/services/epoch_service.rs +++ b/mithril-signer/src/services/epoch_service.rs @@ -218,7 +218,7 @@ impl EpochService for MithrilEpochService { } #[cfg(test)] -pub mod mock { +pub mod mock_epoch_service { use mockall::mock; use super::*; diff --git a/mithril-signer/src/services/signable_builder/signable_seed_builder.rs b/mithril-signer/src/services/signable_builder/signable_seed_builder.rs index 0d52c079445..8dee8e00105 100644 --- a/mithril-signer/src/services/signable_builder/signable_seed_builder.rs +++ b/mithril-signer/src/services/signable_builder/signable_seed_builder.rs @@ -74,7 +74,7 @@ mod tests { use mithril_common::{entities::Epoch, test_utils::MithrilFixtureBuilder}; use crate::{ - services::{mock::MockEpochServiceImpl, MockSingleSigner}, + services::{mock_epoch_service::MockEpochServiceImpl, MockSingleSigner}, store::MockProtocolInitializerStorer, }; From 46bfc03c48e436c83ca67c1d198272cfdf09313d Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Tue, 24 Sep 2024 18:20:33 +0200 Subject: [PATCH 058/274] docs: update CHANGELOG --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 19c0b4a5d95..71be1b28819 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,8 @@ As a minor extension, we have adopted a slightly different versioning convention - Support for signing the protocol parameters in the Genesis certificate. +- Refactor the builder of the protocol messages to be signed. + - Crates versions: | Crate | Version | From 71fef49c6bebf9eeb60c64504cfd37d0daa8a53e Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Tue, 24 Sep 2024 18:21:47 +0200 Subject: [PATCH 059/274] chore: bump crates versions - 'mithril-aggregator' from '0.5.67' to '0.5.68' - 'mithril-common' from '0.4.57' to '0.4.58' - 'mithril-signer' from '0.2.186' to '0.2.187'. --- Cargo.lock | 6 +++--- mithril-aggregator/Cargo.toml | 2 +- mithril-common/Cargo.toml | 2 +- mithril-signer/Cargo.toml | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7731da10efd..e94457b0148 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3403,7 +3403,7 @@ dependencies = [ [[package]] name = "mithril-aggregator" -version = "0.5.67" +version = "0.5.68" dependencies = [ "anyhow", "async-trait", @@ -3559,7 +3559,7 @@ dependencies = [ [[package]] name = "mithril-common" -version = "0.4.57" +version = "0.4.58" dependencies = [ "anyhow", "async-trait", @@ -3703,7 +3703,7 @@ dependencies = [ [[package]] name = "mithril-signer" -version = "0.2.186" +version = "0.2.187" dependencies = [ "anyhow", "async-trait", diff --git a/mithril-aggregator/Cargo.toml b/mithril-aggregator/Cargo.toml index a61d19ae513..f36004d51d9 100644 --- a/mithril-aggregator/Cargo.toml +++ b/mithril-aggregator/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-aggregator" -version = "0.5.67" +version = "0.5.68" description = "A Mithril Aggregator server" authors = { workspace = true } edition = { workspace = true } diff --git a/mithril-common/Cargo.toml b/mithril-common/Cargo.toml index abe516931bf..037bb3bbda2 100644 --- a/mithril-common/Cargo.toml +++ b/mithril-common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-common" -version = "0.4.57" +version = "0.4.58" description = "Common types, interfaces, and utilities for Mithril nodes." authors = { workspace = true } edition = { workspace = true } diff --git a/mithril-signer/Cargo.toml b/mithril-signer/Cargo.toml index 0850cc95d96..efc86b5173b 100644 --- a/mithril-signer/Cargo.toml +++ b/mithril-signer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-signer" -version = "0.2.186" +version = "0.2.187" description = "A Mithril Signer" authors = { workspace = true } edition = { workspace = true } From 63acc59959224fa7e242fcc54d814b834ba9fb08 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Wed, 25 Sep 2024 11:28:49 +0200 Subject: [PATCH 060/274] docs: update 'Certification of Cardano transactions' dev blog post --- .../img/cardano-transaction-rollout-plan.png | Bin 34069 -> 18511 bytes .../index.md | 12 ++++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/docs/website/blog/2024-07-30-cardano-transaction-certification/img/cardano-transaction-rollout-plan.png b/docs/website/blog/2024-07-30-cardano-transaction-certification/img/cardano-transaction-rollout-plan.png index fea08c1d06d5001954fb5d4ab2f561ff0da860ff..fcebc0e8f687e9dfaef81940825ec8cc16cda538 100644 GIT binary patch literal 18511 zcmeIacU04Dw>B75Y*-#_s8ky$3Me4G*bsRXP$5zSC>?~*0)!TQ5J3@8k=|6A1OiGY zAt0c%08t=`l+Z(j0FlHHLJ4!n_q^YlnYGSYbIw1rX3dvBjQQ2O?0fHPU-z|ncH6{o z_s*j`ArQ!JqZ`-mLLi&lArK+n_O0Luj3IUcd~NZ+Vr0G@e8RRn#em;O0t_qz%-}8o zLHGTfA+FwVFJ}dRM?Yt0Z+|y<0CRJr9=J$RaM4vi=lcQfaBmrNcQ0p%g|m~4@CbDOK-qGUjm6;A|v!tk+AyAo%pI*y z>fv3Lhy5R1QI2(bt$0Wlfrv~z8h1VMg4;v2)!m1jRgW5*ytdlgd?EJrKc9RV=l%hY z3cyi2YA-*Mol_rMlYf4NDS8M!%EZ<7T-n}!?nR_TZ2wF^<<_jtOXBC!*IPqwOtuQ$ zi@VUCX*t_7aV^Ebv&#BYV`Jl-htJMAbq$5q<7L}~()t|EDaXDQK4NLr+&A63dryzL zqk-n`r}H1TZ&H?4yl zgamwYQQ(B&e~gamv*1bjhh_rCY~^O2YyTQ{IIoek`dNuJ6@J9T6L(25Tz@v+7(vY) znhzATX>RqR#2z{N$=vU!ujhWBqW4XOZY?wvQ5IJ~n9T)fiTeKj+cRQc`krzq=3-xI zzgpe%j6MC}V$dZo3kEiE0^QaZ8XMEGdUJ4osY{D!ZO;!IRO5BDVzcY7n)NM7^Mc+j z;F25E*?~0@32lkvk}c!EELZc~5gjzDNimr+g-@a+c2b(Zx-&Q-RmA+*Ug&Im6+6PU zZ#0+}dhpIhkUr+cnzo8(oz-ZC6*E7KZ^nUT2lCAoJ;{EtTGEjfZ-vw1NFG(P)Z(p? zO(#>Qd)ZWP^`|ZO=MT~sgKY<@wDEz-VLJX)q44vE&FyxWI!|%_X3C-T@QnxjTro;1 zb~z)c6;fD+4-}*E3DBI?*nn4-;+3&#SVB@?*Ph|vnxYDV>j5n+l*Tdi9Q&DzkJ*Cl1S=F<)# z^tQTQ2J_*mdQ{R~7~>IVG+t#C^Z{GkV=TMFh`|id`aU0+5bms+^@h$=k~9a?Fw8LC zR)kfY&He6H`s{B9YQBgSFX+rDDsSDOn50#1`-L6*H!ny&>p;)Zop<%l%yB~Gw2W@a zWzn#C;qCS4r4(L-?_l6#0|s|B@nz};zI!P2-7Hfp+|&h=OJQ_p+MkrHVKWV+?y@N~ zSasro0yD}l_t6TpV+fUB=skK{v619q98#@{3~x~AH7G~Z&`Vi(J7V3|n}xz@RjLwu za!DSND;5p=Y(`!cdh0^vGAc}_dfBw%FMU{_Q?$*T5??c88ZEn0B)7QI#}b)yn-o?4 z_s&{GSq=wwmY6*{6JRp@TAA4JOM}rDmG0cR*`s&rM`nMxYlhv}3~030l&&dyHnB_v z7USt>a#w2S1!ic`Y7Yh9#^RT{>lTwO4nARov`Ns9>t}9NXfMex(Ecuata9eEsw9M6 z+=wLns??gAd~!Dp;V6=UKH4_?`=lNPOg)v*8;EEYk;BDYlu9^@gWaoYo_hZNgU*pG z4pysAcB@XuO0Q9ExG*8v`W5>^opF4(vFiG&$<^a5#V<56wcay;Z^^^iL0v);jJcZ; zt2qTGEPM|!sCUCy$#Q#J$xcCA`kU|aQ~KlTG@r2!5@oqYCfgdr>hDA#cp7qJMO|UH zd}i&!ha;`ikt)aI`$c;)DmU6MuIt^>J~Ph=F;jYwul%%S{N1`i$ehMqB<)jFpR9U% z!6?%di!7LTvfGr5p?aG(gz`=Xu}d9AIfvt}Ct(H=Efw*ruo7j@jS4s88Y_}t#ZvUg zTh=cJZqPpIiFV8Nr_1VpR;{~|wdWpma*yfVl!!+CBa}pwEoiJ$_kO>=$GVN18fI&H z{xK*%dNx%mhpru(nf%h7eJoE#%M%a9+(B}?(2JzDSN7*^>8rSkBP=^BM52H9UG=th z-#0c@W|F2WlI}-O6K8Qh0y4U_6ZOw!9CA`K(YmaIIh#21mQtyR*cOE@O+Zv!yQiCM zlE)tKF7AYvH~8Tt+BKM+s|f{|ygrxg>;msO2ftx*PCag>WZi(uC^Vv$a5V0x^^OM2 zuB#F+Jj_n}kb%bDCRK{vAO#i8a2d6$Ig{u?7uvWJg3u(t|D}};l1mGdFeU9l-l>u6 z+}mu7v!GWZV|~(g%xfiF{-*9t zR`?Cl$3nkHM8b!a(l^l$NLl_}gBw$Xtm|&2LoPhN!yx}##6QqeG8M_4j=wv(`@3A< z+;ZF@h8TL(|5~N^U_r+YIB)4MD5sP$ZL9Z52_6Yt5;wTVb&FDv@J-A$cTI~(t03rV z!tWsJ@6gnS6Yg~Z_uL+_8wg6-I4*U8jA}%cV+f# z^7Qc=2!+uH6~Ovt)0unc#VnnbB*5n!ZeK}FlY>ubYf4_$T6rtIU^9%W@zof+;Z`$* z(EqXc>Mm!-rw4`=roBJ?Kt~GRh5U=~PWZ^QDslaw zX^XF%j8IQXKNecms2q9@V!r?7yT@VYzR7RtXZ^?u3wyQSUdG}gvB?O&dmAL9(<}S! zW1W}DZ9`dAs?&u!1*hZg_%(}M(-B{#%mm0Y8TCe2FF+h#ZEps=a>w!QZS>gnt+8WYf_1Bg<~#7%@so3#El(=6pR?5(sLFj{ z*SyGcZfx?^ykLg{c*Nm+OhhBI!bx#v;kp+-41th7Add$TsjHlx|@-{(*rnFvTgyk3V1} z-2`Zz-Zau?DyNTPs5kCkj~IOnkIP$cU0Mo!2!|`-v@-YOaJa;rMn0!(2!77!j}cYlcYJLA3fwrXzHCw^Wx z;;8mst}yN5`NO*=O!-r$4?;t=y+<4Hf6gu}v_@{*yM?9#z&=Pzmfih{M{_*2i z&b!d&z(d=lQ93&a=kCp3V39rTcea*DTuzhS;v~O&Yh>{6oYDQytwcf-a#~REX4HNNoZ9!4dFixsy4%|N462(}mst z`po{9&thC_?l0$}*rrjAWV@Xmdjbl}PVXE~jeB{ee7!a7iKAN7%UdRwWRGW8ZK4KW z)o@XH2*V#p;Il*T2&|<1`_{Qj=T{gP#AgJZANQ%9^Z4kr5E<5U&_FbIgN_n?IbezUh1ZW;Utf2&aLhemAd2GC zQHnAZpGsjkm&OZUaT|<{!y99v8{Pw?M`q(A?QWO#=%9~2UDp})z5`A$5f?v2HR}8j zc$Wvb-Qa%2Hno%y(e3T@OrI{KLwV`f70|C_n6L(7Nu0A~yIPir6FuWmSkHja$C*;w zaQ6Wyg#1EkAIDZ>Oh;pRt;N~m@u__;h1|LfE^3Uy*ZRV3S}> zKR^FLrN&XIRA-CLmiPZyo}O>|9>On>!b9Rc>2j-vQaC?OeoSy6bEq8OX6i^Ej~K?T z&YP7{1Z$c$2NoTZ$}kLsCln!H>=CWI9wTqGDq7-2X&RA1qOpMX?k&%(?wb+Ql^3ora-Irc&7D3vtlp5$!!?ND)fTR zaDt6RMvYbulrRrk@gs!R`|93IpZBqC@q=KT)knir1j~`XzDg+FbN;JM848)_yaalb zP&sk^%O`6nGu+45qc|XGW0|-?7^ZbG1U(g;uP^L-C>f17DO2Hl*DV6{?g5ya#Lrmn zvbzp)jrR(Y5k%_2xfPc7f{8Urt^;${;m;%T{EMJ961Hq-HjRKN3aPi{X64M8b{a9d za*A!ZmE~+@7X=ZCWa}9E?lvUBZ)A69wzHH@@Lx6XQ9bgCpSz@wlrdHf<+FI(p`OeC z{?W$!SWk{A(HMJUW2LSizY5lq&hM2PyA9Sie<%yQBW-E0e&LLS{>s$XjurH*n&|*d z@CwEieG#=@GU?`b=OJ2fXkkEg%}Rqc;Gxhi`{%CSl#LnIqHy84<;*m^%H_~*DK{`|IVxk zMREPLb6Rj)@8NtTbFy%86}6^KL~S4}e#P*x&T!yHYf2+L1L0{!*f;ICgz!1Jav zqOUN)aS#VrzpeDG1c*etV(Jk0RgMc2#3sQ4DlbQro zfo8@nixsR{+?gDg1&+2wZAag z;K>kpwdAZ+xOL|{^@)L1X)vNoQu-HL5BC86@DrgXF5NYp=Lwct!VCQ#xPfrj5(v#E z*sFBM7sO7mqU9g_eU^J%ClpRn@vuknEUcdn1oN8*EJLMv!KW#Y!Dd zl&?9E(x%aZR7<1QT^_^nSr&^U349M_MXsv#Yt!Dlp|2@+z&jQ>e!Ac1e%a+jzEvJQ zYfV1xrrvI7g&9*fA|!8>{T^ooju1$Sc{Gn(S;qaA77Onw@Fgs~^i@AwqIRfIx$r3o8^>EXtERC>ZW1Xaw_hY>EHdF-%|`r=KL_j4Zk}vZRRAM%2bPEWn+*$dWZI)~K4**2n0qiT;~=>(Fb> zy}eUriHogDsEZd53rx?j*~!BzKKKxtpkmg@&9yi2ZhK=I2vuK%lKd(5e2;w}&5+<5 z>I`GEvMDoVdxXbhTAI}LY7aBlf2LH?Op_Jx6u$xY_vNz89ptb7hT#MNv36~I-I!C; zdsx30^}7l%C4|z}>wwMWa~k;+EWI>MXNv`5$b@@EEra8aT8>5?{)2EWH39t?v9fog z3}6Bi5}vEn%G^lY2pS+c7`?c>_0ewi`9PB^7a%(7L1K)6gXtXZS26o9DE27IaexFF zdqZsq5AB6%!`F#&3;W&(jioxil)T1JSW%Py+>x~ug@+EyW#7x1npd49)#LGA#}jtHYL#h0`lL54=tQ+DH7py%ja73V66HJbwze{p^|c_bloy{*f!4+}>^gH=seGsk?8e=GZGB3k zWN7~SlU11(v{jUdTgD#*)*klzyCI=;)4|?rusQ?NLB#$0p8s5|WGAjKM>5yl0hqGp zt&L0;RuLr)`#27esi0k~TT_qi|9!TrQfqX*t*u}jckvq{98iZ)}f`=?GzeTl<+P;tQH5wX=@M*FPF8y}tIfmfQ5TmY-#BEOql3 z58Pj{HPF&o;DComW>j~y{}p|e87EyCzlA8S@22Z1%&*0U2F$YRIi24h*&ciVUwezl ziwdES^D7Qb-h}}ds=e>2u%jg$MD!$~>V-wCC-*gMh*wx_^043b1`r;6*J))SHC7@& z?G0t>i;!q9ZAqP>;Gis_fX?`5L9li?DJaAgufE}9yh#N~!*!Q(=4}riezCRV3IiBg z660sRFYg*d*n}bg6oXZsi74p)7+YMR0$7o9gyfVC>Bhi$Yn|X<4)5fIjAv7^p3H>> zDQj=C76Sj&11aJ?ke3wP1j{y4hr^1-m$x`+yaRX#z&w^yrcW+q4f~Y`oaj*ndy3!g zlBd8@+6<+`4@igqz5}v-tMdhpSPaJMj@odxdYufTazDf=gAPN7zEi&unxhv2}h zvR9UM*}K8q9DQ+VTkj5ISTWuGyKxzkQ8m+4Q_4B)W+LY4CKGq3r)^VV+XC0F1|_oEEH zRNNcyy=DiM3THjYMQrA5aY{XA{2|G-{NQ4}CxW*qF90v(NxDMUWOU9~5IFaCXYMYE z$3D`)X#0jNXu#r&J3R-LZNz@ELxaf}ePL<=ZCatL`9i-S6_Ks5Op!)`&Z^kR6~!)9 zTY`qIcMc5=Rl(lTcQYzxf7-R59}=KlQA4?}=|RK3=|9h+)+?<(Wdt;B zbpbSFE3lHqkt}=jk+NU_w^xrg0)!ncWt!lH_jC84FaWqo7$z^ME>X0 z8gkE&K`3mhhI~V8%M1OdEwjzOUn(HLGVP6%J9Kezed+}x>O2f3r~3g6p+DJwFm&*X zgP<*BDX^F=TxymV!q{!nBl6wB+@LhS# z3F)C-Iw}ehhS$6p3%RCfIkpzoHhjC9rr5doN4riLH!lLOl|;?%bF!O36dCYtaOdom zEcSdAOhi(#l5w&r;o=ecu1pNJqjoyY_N=|3Vs~(O@1endSiSdp+wNK}b2Mi-zSGhv zcqBYzu&W;dE6%Aphq{Q27z|H5fp-1+?^n53&n&hOAAmIU1d(20s{RV=km6dRxb4?( zw!q)G4Itsigfp{-YT%~LE??N*?d%upc+>`eir% z3aQ7BN32f6C6IjJG1HmJCi2JX1hY0Ppb=c;=@|l&a^Y_1&0P$ z%fs#r>c~iZg5HW-ud_C$#z@4k&-XLvzJ4ViojmEzK&Nl-(tSCe20SI=J$Z;5@tbgU zdy1s;5K(XsIk z6M#zFz=LDvRYMIM^fW-s%qVsg3?XY9=j0z|G9$QvPurA<-nLij9B$`XLeyq8YObl` z&j;Z>yx-5Va<>2VuoS*N9b~&*OL)_kj5&t=26p{AXp-bc1QRZ3qK6>Nt*rCQi<|c0 zeZc4A+}|H1e_LjgR`-4jeDTd8ngT}Hvwo9ENcN`US^=y0XcdL za9$ID3~L3%LERksb949xbu{j~TP5JLu35i)W>;2tFfFc!_$}+W++Pph3tqKCX>6GDD2cKw z6XTAEy&gEn9clcz>BuH!;@Ze4fAtgB@`j85oX)V=gvkJWoeWpN?fiIquawUD9nh;w zWe?K@RH~R=2m;_m;qC3$zEo_^8i*J;AmBg+G%8d6*BP)eyEvU87?zKJfjeUa!@DHz zU;7KA4VrvdmVR9HW!kbFb4^;{dCq~+JN|D9wfpkIi?v+T?}R5#uCwEFwK4!h*LOOu>{x+heqF9SCknGf~%Wr z7PhzD0{p2VVC~==KT*$Zf*SF2=u3`B!l%gLfwKTFFY5E#1Sz$%h49hPUt^aA?`&S& zRLj}VI34APH*DY0ZvOW%UaL6f2R6igfb_U1Frr+VveBxrt@ac^0)X%OgvSFG`m?#9 zx1%eV(ehDCnPX`P0h(C^K;k=(88NE&=)@K$4?syqHp%F%6LLg4OELlDHVItoTrS4igahqT^%LPg(1&V)kL5{v2Fq*e7gXjdQ-a z`bdDK3@+FOA~X!`f@etJF^V5l#DtFYe3RynOShV$R{EALHfHS=aPpAPN0+rxbmkXs z@VSM3IB*$|p2u>g*zehkpzXS_fWy>BoYF5j<{A9zuUfma{aKj#z&8sQv*+aKVn>|Dwr(q5WqJ`hRiC zWB_a+y*~|{H+WVW2sjQvf>SdTcdz&$@b^G@1hiu+XK;V?R<3sswe`&hrm&7wSu3E# zA&`;-LdZzq1i+O*0|W$bAaMsOwfCbyf8}v@Qm4v?0xJOv>gI>;3P0_vp1Yk}A&=zk zZ32ZgbR(M__PrpWrL+@(hN5nV`wa8lLo2acYr8i=K6+Hjz(2e{4R*d-$K{w$VH9E9 z(7cKDvA%L7!xJfqP^bWRmp@#wuu}uFE*TwSqtWykk{**VaVDJyPQW zzJOD>QRqcMd)Zg%##czPxUcxKoz8h&6;Bv6$F+ekn-k8fLe>>Y8CQe7hs>=)$gBC} z<^rl~?EBP8HSX$q=R)lt=~;Hbzyc>Ex|4wO14jq{QkU3sV#12xyz>|BuQ$!Mc4Z)Z z0<~3p2+$tADlbkh2L3#Elqv0D)U(;Uj8g1{G{(H8-A=7G3$aHGRh@o*0-g+1Ma`|7_wM5 zzV_wSN{uz9$oZCvXNC~uv-|gd>ff1YEt*qnhuz1~Yv~0T3W7k=wOb&=4z3&$Ets}4 z?Bm|9f{A^=;2&poGgB^1Kp^LG4ozLWdoXWSRx4fo zG|kbxu*jMjtWz3ZI{PW{&BcVtrnhP8s-~`Pk5@y zb>3^VYCH^e9!dTt+Z*+S zrG{Z7>m;alKzEM2|AUSh$XTtN_sI+~50{;}pwJ3|Jd{^x7neu$N$!b`+vGMYo7JTv zTkZYOqffDkR!+ZT5x9akO3kQQLoX0x&9irhl9fe?qx9pmuQ&PCy>N%k2tge7yIme} z075c9>4C6AlLsR1QpWrkjvlnELTB}E)y$f_dzeCxy2SK*OC{bvMWfpS)xC#(C2H@Pja_D996$VQ_0`#CyV6kV9F>QuVU@1ACqD$5OmijvuW0?X@$$1x z{@U8wzO>FHfor-#<_>z68C#3#umA1?Zs|D&gE6|)nZg^3+$&4We`)Uhcs@YuQ&klr zFVm!Of0l{d^Y^K5RF1|?M2XpHRAz_ORc5bAeVO@WPV}=T}L=wh>ol7w}`T0>%eW~J@m5&~gLC{Q-cy;Hw5=xIo{uaTUs4ktCb zGk~ZyDJPs1DBnobqRmsCGB8*JRJ2e5k~L*CH$VTixU2y?hlaF`Y1fDRTag>Qut3H6 z0-tHW&(f@+<+Ihwua>=zuC8(m!*vz^zW9IWH|?|y?p(WbfKa;i+?z&s2;|=5NA)gS zBQFE-sI$dn*T3ALHHKUlw&8l;YN+<~bFi_kXYuIZ-2-2zGJ(<{b0DfK;M@a5{^XK! zC!+MT)n6|uU2dw+V?IWXnIp8aRL&Mty$$~?@DHbsICR`yo(aSyuKV$SAcICiSkNqZ zeA{IH!|26e3E*jN5vIcSy`k%)m=Ykz*S8GKG zk){v{WTZ=6t|JgOt{7$(J3^r{^W0T|toMz76xc~tQAlLZcoIq>ZGB8`pufS6>{O-q0BhwqkYO6zxL8Ye4y~%{ zWrX39DLMK;#kY6e?!ebBZic=+S85trPxa2>H640H?`^1)-)^d1YNEY$x-GHtA?eeH z4qp_x9O`Ub9NN&}PN0Et1>wZ#gh52TaU+G~e-BApF;vwqOsm#SZ)il%Cy{g1+ozb^ zTIT|al5!C``Y z=DbuwLOmbs0d51=WLhPxRe|kC&(Ux$wUg7hx`0b!6ouBWDUncQKVynTRd)fV*rZ{% z3%%?E*t!=&K<)ypXHs?AIrf zLZhKK1xo!h+gXg0(Y{IbWHdXK%HLMQUwWC-@!!flJ_H<}|$%#6%VKt4hv6fY!FgOLJ+6XK81Y9TXPCf#v ztA8^jeC44_hkiy(i{o1sH+#eaZKyYXZv-Yk8i+{uo(z+ueX?>Ns9z1_Yd{DoOW%#T z-85Rk?!+Rkp1jgdo_|Grcb#3C1+rctB`JcKqVRm;o8}$6B_r9#^3UHdrD}P)+1e%4 z+Zhv|q4g5bEVkos9}OMW5eY*rix0r5<XuJTqRhkb9PK%XB4{6qjFQ9n=smh~l5^B8*8dvfVS17^(~ziw2oH5v6Mb zQv~Coz=~E&(_*teqQ2xef}G5Jpte?4&%6EcvP}|?zMhsgJB0Kt*FoLL!uo!Iju(Y> zwbR<(VcC(glc|inaz-nqN11Wac;OO|@TQLP?hn>|tt7g>YMZbUvj8aUmB=yYK0WTF zk7#z{w|~OoyF!X z0g8aUGSXher}<}3c7|p{!%JuEdc6t4ZMnj{%%Yu&#!0vn3RgT3=Yq_#DV12-<5CJk za&`n3bY42{I#BO8r2#NBHS(E<*VvD zvki9qIqKEJ>EHhe+hdL}@;GWz5T~F}rX)S7O|;CY%=SAwU$WV-4@)ZYGrlsbGZZ{nt+|kjfb^J*Ah;USNEr3-1Z(k} z@R9+{T!9#SM{%`Mam++qw(0}I6bE&Ll{Fa*_toi?-Kw({`(mZOiKTh|UyAP8Y*kaj z{SjStW&x1nAB`(alPxoB;P+p2BMY4@vk5V-^QMg@XP0T8r!zXrZWnT65p`^?sZSLO{>?O)@mbQwF zJi64(l}pfpig?rcz*S2z(e!$vEc&SyjeE5xg^*J==zxQlO;eo~SU!!NC%fqmR>GXZ-@uH;|2VS#h*%!;A_prsglwKi8z z>6=qj0sTNzOhdi;utc*2WR0Pg18wrvp-;x9*!k%*ZB3;ke_}z{@_6*8ii-U~3&U2+ zSXW7lLx|xt`j7gblSE$%GLxc!<;Q9PPjUU$MhV?2h5cmOgst7RxV`=CwCZN%;$y;7 zi6*yNJ@&nPTro9ul$^o*HG5&JKqK`Z5~=e>lvZWOvDseCQGiDhAJxCR75@<%rUrq0 zOb__FF2@7(^Vfxf=qHGxEu5N;N{J1^Svm>%;tgBOE zPxJ+eJ&rn3IaX;5??19hoxa#3a!LH^u%3rUfpW_sGVXe=k;tjyB7kB5-Dy`=Gl!M{ zTf2ZC>`Z=uvUzx%3o_OpJ^IKB#PIJfmNDO z(prBMP_BQO;)oJ$ZiCQraw<7R96XH1(wZjF1V}fHqNz)+Bvs4*Rp3jevC!29P+fY_ zRnj%jzUoj|IGdIJFk?+6l6_4C6gln(Lkm!xU0KlSm$Lt=^?B!`hJmW>wZq%NSu3g| z)e_CUSXTwH#dAOMX+UTB?sM8KXp$Twqq@{R1aAk5g`|(1$ec~r&)&uX`hTPsdeS!! z^sPjeW9;IU0a9a-TB6}0Wfh7~KV$cUK}!W-4OGksQqChAHr^zRCq7FSuGu3^Alx9B zE7+78dKjDRhb0l(DL{8E%eZmulabY#V7icwl9D~#s!>3kPd==uA9e>A3@%^RQGG$> zB0Wu!41wG-N33?Y04>Pz&X#*n%9L%NH$KaRe*5PffTs?YdpLcaB_aB`-#>i+;$WO? zbzPl?l)ae2L4HP_1Oxu<#)wCVM4z|go1m{Iv;eIv07?z7*v?vKwaS``?}b@Rmn8qF zFPS_Yq+m*;?YCF3q0$EehCa&*wy{&u6ozqYL63HPb>EBxs7l#ymejUTFs9}e=D)KO zdDDx8c~@Zk6k+Y?!44_w^~z*X_KZBSK~6u&OHo{hI{O`k0MXH54mVam?$2d z%7J-c5-c&F_r}T!j0n2(TG7Ee9q*ufDZ~ApHk`o&&3A)F`!8xTvuzPK^U(-UAJ(zL z>iE>@=tX>gN)@h2BoHIn<+p~^oRQ4OEU!9;{W}0BMz_ULv$gazfT?%dTqeK}1V+bI ze`J>rKV9b`4OA!<`mwQ7m`_kfC&i-FKk<do~mo%pqB%zz&Wb4vT(V@q0X4y0xdrWVp`XbpR?9-xL(gsog6m z&i(Jxl!YaypPzpI0B~UtNa~;b!4)Jrw;~omHJd09UlU7)zqd@kb+>`+Cgo06ev$|Tg4i;(8+yRNOC$cn zf*tID!Hc%ZLB$`)52cLc45^%hTJ$q#?E?q3GLm6-dctk>QZ%l0RgV=dAJG+3M&ky* zb}mpzp%ktKQ&-X(+GGj9@03azkDdj5MQ<#~o%f<@=l=dR42ICQ&hJzy_~$*Retl_Z zai%aw?dYn_0R!8{2wlD9vB(Z)(W>Xp)1so3GW!IOH^Up(1J}Mwuiv?L?V*>~S2CIG zBzb1)fWZYT`)gl3%kXNvI+92CImUd=Xgna{jku$x`s=CyndN;A^7Qm9p95Uo=qi3x z+k9yV-Wcvw2PzIzOVshQq+^JypgJv)`@3nI^ex4$d933P?v}kjy$9b0)aRk0p^4aj zJmq&-NWFKOY>p|iZrtZEI0_Q_gP=`Id9etz#md~>brynzZ~L7-wZdVDimKEYCNU^w zZ8Z%Xj8PpgFul6_9`#RL(?POME-fuhkSy$BfzU^eza;H0Z!38ty|LW3O@DQOXi}e@ zp$?ZCu18iZvL+XozcHB&s|!suLdss#Kocuasgm$|}UGPH$!rJmy{l1xsT)oAD}UISV+Z+Daz6+KPvO(voW2sjd{KjCKn)9q4TQ-L#Z`B`k`0cZt^*PsVf{ZW)wtFl!EZQQ$2pbcV3$tWcGr*P` zEqMC<>3AJG^|O9;CGLcz98eV*EgSSVHJ8z;*KyJoN-Jz5G*S>k-pVQgi95ZnN_CN7Mo3&go zCKO*WpYc!y0?|+qkX#Y51;62yu&%QBAT4`>)T^Sj4w$%f6F)rwk#GZ3%+E z3jhLfhvgy~QApedZiNYM1F^rK0c(0sCk%?nqU+4=^>6&rT%A6FMbE>L;+Bqwa&jXU1 z*@Ze=zNV4bCUo^xJ1)!B{8VG@>ty4cJ|nrYP2i6X$jZP!Ml_v0{!sM=c_3y^XRY3Hh8la2K*6_OWp}R= ztY~39qOm+4sxS#1I<}Ds2<&%QQ;|+&5c9VtaPZfM4nQDe(!W(~L@GX1-Fvv!S6*Et zM{UwSkuC=9IZn_j=43}1MCkP;X9bC4*lMt+eQSF*zX|_8LBs!8Lb}#3iLb1Vx!yVU zp(DiPtPjTjr41+&&hz9QCkunIyY~NBG5>$z`|Y%WMh;Z#rX_(q>^+!t0Q)MGt?B{( z%5l7NAX*CijfQMdV6*_Ujr(Zq&@99NXrxc3fMH;1Ru9d`#HirG$U=&5U9wXFI6VZP zeY@ofpqEZRZyp6ZU;o-InFe%E3M|U;%<~7m9v!n_CjjhYfGvV8fEGoAw-%G016KsL z3jswo#XX6tpXIsVEq3G&hJ|@Tj})0eCqER=_Bz#}m5cKz`7{FKgLUBf!xGkkBVHCY z*~sK9s0#@sORkQY7a$PT6Eg5xP@4uKM+ESDqKoGq=C=XlmggL#A)&UjgX+!w#xS$$ zYqo5#wKJ)U=lK;iK%GHfjM9wTZdi~$mB#u~SBr|_)N1iP(S~HRnuoA79{r*xk5%6K zax(&tT0hkNHkG!MLPCb5zLg`=6y#tV%sT3j7zHu~1 z$KI~=Z?vnm-d@5CK5u0jA(hZpq25{sO2GhAp8!a<6GJB~MgogGLqkyRx->6~gV#gx zBhNa!^vf!<&0VB^vFG2U?0`VJTz0WEUvBG;(Ks-6_v}Nf#KmSBrC^l6Af#j*bTa!q z$6bx?RH~_-u95${3~Wy)G4t2-SQmzoRP=~Hsrn{?UIxh8#J{uw$yFi;-=S}k21PJI zo}^q{4Tphndg-DNPa^eD0DwYWhbGIB3%NFwi?z0m0>nB8*5*%6NYeh-#%ERH#=9xH zUi;8GKgc9ZkIs;yJ<+JM#JXB>xyMWv2#;iPZX(Y*&K879@P5$bc|XR$K0M%tfolbr z{{&%ab^T|6R`e$CodL8%qtLV+xKc$VVg5a|$^_V4>@k^~t2FW#BwRenIyCmZTR`kv zfq!~YU!@-P(=TY+%2}<*R7#nS-+)V*WHgkSn;>_weLK6l)5Fdx`Db4kgg|`kcC^!P zkK}6#)4&$WjyuMYa3F7*@Y{Y<;Vbfk@#RwQ>1n^zvq6$QZA15x(vscZ>$LcP2~+6f zRo|S7Jv5+`OxkJQt!^>aF~ufXhHvFPpw#2Q$l?~lSeE>iJeTHg`RjW+P+D6%ua zC(QsrLSk}V1B)g9&=#*~ohqj+FmiE6fQ=ZsJTTFxPd;b2y*`jh z3$`4}iy@i&m((G#9Kj!sX(~Sp;tGV|vg>~aM8Un+{`>Ite}31OjnN3n?cjdM_Q9Nx uSLHWAvI2R#Pf*76VT&L`m;bXli{46LP7!Y_-)s?FYGhz?t@Mh+KmP{+To|nY literal 34069 zcmeFZbx_sq`!0%#qJSWZBCQD0-K_%B-7Vc+(kL&Yw6s!6v*_*;X#t5vhe$V)5)1ad z-tYOH*>h&j%-%D5&L3y*_0PiPC!goJ>$zZELRIbA`)NT8j7J#K;?LDyCvVPpxDqb??)YO-PG5m>i#}8N#STq6m-3z3+(%N9 z^A|t!-@nx)xL*4B%OfeGJEa&`uU=6O8B*I-dCPTu?S1S&m@jT)O3k291h-hErLMl2 zFl|b6agO+ulH&Wjo6XaF*0a;NdTQ$`JSs-wyU@Wa=sz$#h$QZyzvbRh-9&#s6(hhz zf5&{ii9Rx*TL}|=V2ddoj1mUMD-Ocv=x;XSkVok6MBM*#`v1R%&WT$9V=rxdT#H=9 zM=OcPjza(&_s-qB=^^(S5q_xCmy)gI9ZmN3n;R#Zrly(S+SZl)XjA=f5 z7BHy%Ymv#le#YMQ<|2M+Y3ce@bukH#EuFOWbWQ2oz`)xILG{cG3^E@-ehhj4Udhq1 zLV50t7W{@q|$Nzh1>S@C)DV7 zDk>^M0)np@l9ATyBYA``Og~V)C%c7@ulf3QO-CeUaa7cujD;3y@s}^xn=etUSf8(& zZjP72{eGrPgoZ_2rM(Mh4`xV~7YpWfbxDPj@v8`XAE{-$3=fOAMoU0UoTr|zLC?Yx zagV=?@c1T`E&%}nHa`9soK5$}5j`BzF;A`j?#_pN_`oiJXRj(Q{!e;(I^CPDFUlD& z*Ukiz2f98!;dWbBlX*n;&p-dHPFSSHQTtw^j&J0=;Y^1MmRk%g-0!(1Su*Sy}JacX_98 z546AD{GAQs$Jg>ml7!d3pwecHg#23d8((t%!7N!K)X7TP%g%ryh0(G(Dq6U%>%ppW zhDi(f0Vmb-j5o>HczC1BeM#XFZ*&*8w(MLn7w@&UwuXd-aS7arN0gvtEL4qhn7!t>!PHAxo3HA@9&IK=mu%~HnV*L-h zmT!)n=0B9+^RCz$iCF4Bdh+DSeL})a)Y$J?IGa?U`^XW!$vwa;3mfrR2*R2Lpg(u97=5CaY)q6NJ?ta60 z+1V9PeE6QC zkdZ6yBiW0Ki^(!G+4zAh-3rT(=O`3;yr;K!KHPHe;NV9&+2&Nsj1#S&$AteIT`_`x zR2^MhR8gmg)unog8d%GV#{y;+?p&g3jECLP_(zyYjbwAg|~73cOjBNH9O4M#DqM) zv$K;C?u+w)sf(lSWPhd7ypN>PentoGtNi-)>vwLcUhDLYe>zBs<9TgH<%YB6WiKya zS)Vpvo{1uJm7laljic=q1_>siC(5Neng*ekr*e8sPfvfk+lKEp=X;#zbFznxgEJh; z+LSAsz_QlIJ2$dB-&X0iF?wJpDK2h$vVY~Jl$4YbT&2=-Fdes;*|14(sV7dgJ>))l zyams+AV0shSTLSC%=LW|5(JBW-6}i;e@|45Z#`UGr_A(2TN!va^mN0Bto80$&qaiX zt2g_h)N&NagWkPESPf^Ba9hVxmpZgrnRyiSZ+jfaD2gbzy}PYmq{m-rjg;9KD;_xF z>m3}C%+az34;6l_lMhl0>Lc#AectsZYo>Tz>`LjIN52Ag6&lRwbf{WHiKSG z2_A(|Zf^ps?A#BXw>YYDIdrOrpcY z$A%GoU95C(9kFv1(=?QnqT0&v$OTpxB1Pk4c?fO69M+2Cm~}P4>c&P3b;(11Wy>d3 zI4{Yd*Oc#s=;eHsPT~4=ZTSOcokbISWoFXB>Vh}#b-gL$4zoig?d;a*N6}$jDWg)fL%ceY7XuTWkznYj zUGKitgly`*4ETiz*d zbK8R%!S8O9W=D#gO0l!E*Y;oK3;hv+eYHY5@E8ZS}w#w<{n~ zkRHMpJ^uo8kds!}`=inui_&NJIeHzL^~NK=f4El(F;egHiD9|9{K?sw&H3LybXXk4cuji!s zMZ5ZHSt{t&8|HvV!|Qc%elVwfyd~m$x;m^Vii~I09VsyqYyA5=lz3bAYO=gSB$Bs| z$2kX{1OcZJ9AKV)y}OLOJo5ZxA10Fpb#b<14Ri3$ zjroCWMAby0E-$lonYeqsJ{+qK&qvmO^+FXUqX~7Si*`Yx=evPznlMac{X*u4CzoWY z>&wg8#GK}<5cf2+v=U)e(HI&U29vJ4l%?1pGzt-sq8D1aRkq4-(#TgaEOLHlYROAV z3=8D~Eq1iOpYz!dud<&(a9Z@Qew3u>9`yG0@uAL=C;6jD#G+TTc4qG}*W~2?W5c%| zUQegS@hi-0Rt&8o0^AS0OXJ!A=0h6Z&UMoJtOj~2lefNb+l*%V7wT5C^nRTuOL{XU zN$}6`RI`6`f0}5T$d#~mWAyUEBja=IowA*(D*U~$a0uSP8r;e{WQFk?7Z9dGA|uCO zs0#($*7S3&=#N45P--QMo*&yP3D|rhuz)XlcgrXZDW=G zTHsb$;Vylt!n&Q2lw&*1mqkQ|KFS|He5gM61T#~IO#J{>N50%Aj2QBWc6Q}Czq3M(BE7Yel;WmS8L<4puVTTjo8#=hCrb$e z{ue%{oDcKW^RwY{*5G(ULPC0uL~gf8;S22s$i&iph37U%5%lQ)bJoz%Fw*GlahsG! z4!ub6C`Ae&4B8B3O7r>}+8=L0fLsSNMKAscazQS$o><(S-h5y0#jcM!)%GdyTQ*b& zmXj4$kWI)mTSWVkzT}7OvdVVi_byEHS2D_c&a;`rg99}P?Od;SU-|xNCz`Bv$#LHt z|2LdL#_(zR*EsI9i23ax)f&h7x06+N8zlv=|NNe;c1ZK_@!|5^GYu!sH(Al)QRl;Ey_F8smp`=67*o(U;86IXu<~?}kukgaETq+DU;< z3BN9MM&=tf`w6%#%Xy8G=Df2XFZl|wV`+E#8~CV=j7Sj`n8C&0ztaaq&g6EQ&Wg5c zS12Ifpxs=|Q+buSCg0&X)e1{x`D8w2sGXdhoRqU<;tn8P&xiCmIul~!MqW zt2uXhSnR*n%i8>7uv8#_ZbsA4R~-!TGrP&VcleY=--2-RRkCEf4w0IirZD)6w?l=i zRUfyif#Jrk1*YP>h2^n6C`qXf6;)3xy~~)02TbNE7(AEJH_Yo;Sh6zp)yA+)VDO(e zr5bIv6B)WD3Xq*hUS6QM{mx%!m@L{{_nd1|M(4Y<({G)|9rh!LkLGM>iy<3A*M1N& z6Gz7k{R<(Hm_^>D%bE%N2@Ce%T6pZyX4Z|{B&$PNvbCw%Bmpk3=5Fk<9vLPQh>007 zI5|1h!73RoHY`S`L$eK@9>QV}FS%jeLoy&rUI#xvaat_S&wquXT^GGPiA?oe{#2ie z^=$V4ehi5_*?Z$Ak!!H5IJp875)#0%*je7d@Qm~&?P?zPH+nh!1YjKJrL<$^D;RsU zA&=~P1_lOJZ+1xv2?>Qo1n9a74lH553j6izm4vwXL-K1U;%aJyobSF}fqKpD^uQ|P z$)mLQ@8AF8mkPM`PjE04$R9ewNf|jfhE^YT(elj)lPW_Y2$Q4%rS>3u6u#|bg*13b zbam&o+lp0N7C<(i8M&XU^!4f)vokdn)mvr3t^lg{Nl-jx!6NM>mYi1mPr3YefsN7z zel;IRwR6Sgt9}3eCQPsk6o!9KPV&G%CznW6!G9M1S?DAszozgGuCjM@G%C2$km0n@ zK}>#Kfq{b~`kLI8Ut3#+t$|qi5Y%5vzKKD*Hpu$9U$tOlWc;G!GYZ`dBNx# z8jP*;qqltx` z3Y8|5EXlqzi&Rjv0?+_a1mUvM|KDL8kcz+e9Ydc)Ej`)bS^iZ1^LM$gU3Vq!)IK03 z%^w+2D>Q6Q&A;&!+2HAdEH<25eOS{5HJTgX5eF|Y_Kge&(%_%OEY`-G)m`-e1=Jn? zA3*Q_70lGkxYoj-%^q2kbU35e3-qG@f7qr#oqm5q&j)f|QHzCL+a9jC|5mxbQj zwVkV4*EJUZWMHRp8W0eWF6tsm+&9l^@!W{l-11_ zQ9M}s>Q3m4eKjfh)ee5Y^Tc;yB$&^voe#S?N_tYxfU&s7ok)4?egq&m$@5+gIsGRp(EUu zS!V+w(M*W+=pADWh^fkMdHv|#sae~A^@Ws)C$B(ZhwxSUH#Lkf9;>OBjOl-)>=5@g zBxut!!Xngu*-h6dL)DQBQG6v z>GG10=d?`JI6Z;?dCbP91Zg#L%AvV0uGRK?YRI7MK-JJUqa6A-Y$KKVfmOr%H5^(k za4~9y6oEYVMv6?#Z+Uw49Dlc_x%cRoOk9(%8bLmYhAu=<2dWtv7;EVn8OR((O1qgl z9R5Hsz8cW>qps!XXGsK-2{`iuo|V-D0(5Usk@;91q75&;OK53aWIcb+-+ z8DG{b(fW>K!HmH+LoNaAZH$mFx5CJIH6B+Aqv5i=j<&3W{@v#Q<{hIi1zAgm35GTl z4;f9T>x>yDd~p}7LPeT&Pa(*3sg$JYYqC;kY|?M)n@~81@L5 z2^N~PdBiWfL|%tf$UaS6aerlBy>`tFU{chdPRf^(P9%D_#r<~GLSsIo+Jj$qKBLIE z`M|N+_Eejjg2fE5L0$P&?4c0K1QPNmb7%-0UJ3n}`5rs7la1chgY3!Q-qxy)-nMz2J=*D!y`WK zkO{a-UAb}v2FLkFdyuFob)G>b)k{eX=K`ZXHFAM2RO9tqmv@O?o#AgQJNbLS!1HTl zYdDef`;D(Y#Mmwg2*7CX=pZ3)bEJspM4v~qKK>k%5PW!9zHNL=>?Vk^@7_@vqMy#1 z;ke_?3P9YRpgqE_Bq!?fSU+Sa*iT@JrVf>0 z(Ed@RbKll$Z=SHye)TV3)Dmgo=bE4L`JJ>~#@%O3Vj>=z#$^ZdIMUIXS19W@WZp`o zHKZmUQyx_>-_nVue)e{8-IOnSDPLa?wmpy{V+uQiHhtQWlYUDbg4&8_b^2|oKVRql+2V4U}7Tx zc0@p>0;QV@)Te6s8q9zUK?*Jgt&WdKYinj~7e6PM@G3f{!?2e)3_CB%&U^k1k`SRlIw%m0>p(|ON2!o5A zd-3-(<8P}VPn*<)QE!6R)vNMcLJ6g?LYb z3{biI3heglJ7I3~ggn{{$`%f+I9@5AEZtP|dS368yPTTVZ@G~kBS0BL$BR#N67*p3 z+U2c}`SlX}SmZyEq4e1P`vKJSnejPw;YElUn|{jyMT^6({H03cX#$CzP|X;MH+9u6 z&$7jy+vT|zetxZn#ha`tQzrkoQs_`Ajbjg6hB0UGY=OJ_Ql#;(oBsVnXIcNb3&Vb^ zrGK7yElshd2>WsO3Ndz2D670cOg5^sqZ(HfsV!%SJ_X>bYE|^5OX!vO}?1+d7ek_4v(xHy3*U#OqIi;T#_Q}t-+{SH1ex8kX+`KMs!RJ zH*})_R@9M}mPV*#g`6Jm6t5%mbBfFDX9SqFN}fSiMa9{<3?SnoD5vzle*GGqxw>kJ zMmqr=8bL#$09pZrvO4R%gABNG4H`x%O@*HO%T@qG3poA$M@6+5Kh1mbqa>iDyF%xp zR~|0B@yhc$zaaFj8sTod$pTRy-@JCM`jaM&bm8to8p3O3bix7!7BJRSId=kZ? zp9(aJ35Qyxh)^|si0-*ea=}PH7YT?h!au7^+y`pYjX0+(T^sXBM&*!1f%iDcvDdfF z$8uz+xi+vgQ<`2Wx4%l7UHw>qwXQ$6b0It}_SnzecelYr+V0QXi}fQVgjaRFXKFSp z;V9zIEriO`LTZC1>%rVwdmREJWYFu-9<1>LpEE)?pIt9y{fbfb{m~kP;+bi{?qvdI1(bR4v2HL2EfAaR7=f+ zRYW7W_WKVwsjU{K?=k32tLsauE05vlciETQ%uivN$#$PKUY%Gv$?08*IXtvEGpm*+ zf2XE0_ECNDzMj-R*0$!Rp(fd=KKs%8bH)eiJH(ZT-;xFPuo*HPg2`26?uyAPm!P0u zRyJX44Ul)l=;dB7>k=TdV0at*1EQMncDj(N8Av@}>1iuJYPO0kpA(a}>wCcN%k`n`|>(;{-6r zAT+GfjJ%)ujZ!hGV?EIy+IieC*pjy$Qg1t$;PBLXLh=^Lu4!~nyn>)R%NgBsH-?FW zZ}++d*e*lxel+{}$W}`Gc6!l0Rz6)k6hGYgeE4%PtxEfFgMvujk6XF-C2g)WbJ7Lp zkXW$d;`YEy($WcSz5eMy@b+X$uf&rx>b0qlx7Npn)B|&BZMGRYZJ6uv>Mhr+?LYsO zi9Y(#m`;D~F1JmP&AY>Z`VVs=i=^$SX*WlcWvl?4!CMTAYl!u}Ml&aA!JF6BS>rG2 zkj!?ULXlLO9-Y^|ovdOCkK}}{SMLw-h$$hBt&dzCPmk@eG=El52v%PDuc$Rj^gk^u z)v`}rNpoisrpZr|*qY0uBeI$FzM6l3_#_w8F4^UUVuLQd?@W|HyZR2LCTr3W?g(YR z!iJvdi+3N~1Kv_Y(hUJh^}}5n=L$b`KLeT)+5VR>llg!yqZ^>;&V;ne@%9Y)?EbXN zz#8-iiqU{Pl|<2wA{?U*tuGpB=xDCbHr4|?+IBEDR-~T~u(%c&csw-#xN^{;LmK*{ z&=vmNBt9 zG7E3P7t`_HwcgcRNCo7JKFIv<(3W=2y^lDG*od`dE<`)+oO+}QDOxeFaR=l&@ z*z7+k{RJGL=}9U8NwU!ZSd+(Jy71*u$1$kOB(NH4ym;}JdJSBuvzwdH%KG{`LwyP{ zmU7AX1%*#ElC5(aKW8;idz*xJPM+Pu#e>tZI-Z|Vrt*ayaft4MPTr*VLH~Jey;*T+ z&*{{#>@RNoxg>-O5wpPS^V1a_{Y;W2^09q-BhAedLAET0C^7WQJ3SU)@6{HFD_z&GOL-h-OL8%&|e!l%zj}AM*4!_MT8uQUW7E8t`QXjRLKz4R23RejkSu?{^<; zmVTI*uR(1$2rue({?}<@%RSip>;jFse`2Xdp){QU!9N6I#2WYkP3Yl5Uy=t3YE|E} zqrN`_Sc_Pl3UyuWRB=cB=ZVAh`eh8569*?8n)3R3T9I5bNWsSF#g#Y|J41xjHIfSE5H`D{zaQz!o^SzM-V?<;$AV%di1Kas8ZPV{?tEC4-v7Y~or5Sqnz)=7rO>_1v8k)c6ZixgNQ9+oDU~*FQt-Ak zQtUW$y~T;Bk#k00e~vzrl2*UZuPl~~V*Piqxt=>uKh<3H7^hj~Sz2@A*+QPjt@{2B zGoQKI=7cz=m%V{5CYE%`sWawdpCcpbX}Yt$?8^KT>+|bF*G0FBWx^W?D+TQyCLobi zp`lAvv*myMi;I1UapO__TtU0a4CKgNEN6PW@$6!^0#mL z0zs$xfD_}oJhTYVX#sRAp$+R&-Pj1lSsvhXb&!NDZKv{J&qGR4T~UZb#Ig!`0unIb zLx>m9O3{X9)`Xn}W^(u2G`&jqV0G4tfr-^b1~XfdlNZqu-?dy%ckQjOoHVJR3P;P6u?Yo=x&p(d_iB~PS+UWk z! z#hEdhXGPmArzS|^lyMhn#fbd)jq_*E5BmjoR%=&MRU;{c(LEC23&`^%$qx<=Lf6LY z_Xk?%hC+adt@}Q6pQ4WEmKGK==KL@9_m}(Xv-E)IBcq@&T58fsNJK=Nk7NJ~jbn%_ z@6N)oxaTsO-YBUT8%sqlYBsnRUZm65j%Xr}LDm^9i{;W-jgawjBdkbH7TJs1K#v_P2YBo{~y0P~vZ5Ak5 zKG%)Q2YOLwDH2}eV+?te-0#tL5gY4nHZVMmMW!&2~i9stlam$TaxJCIs;EGxZqth}zU8wDa+HXPVw19q zkgD8a-5|As68(*AQ;vR4(qebn(KyUd1Co`ma5#d@csQ*3uKG45P0J%RT1 zs%^4Fmh8kKq)N{9^Q^yoAw)S zmu**+k>Qu9N!-Wc7bR8-6$V>E2DeGM*ac*oIG|WiFE-FOGBN_FTr^q8Q$AC z7*D{kD_(mj{tJjHM@iNILA8Z^7xEPZwCM2ejn~xGF#sb8sAa?y5?3%m~j%=i#6{?;Wmi1!GyQ*4YeL4>HgyM}pa~YHDhxz(b;2nrH+Rn)D>( z1Q@T3Ygyhx@~Q)k#FVbLLgpUwBZ0@}qPR_pTa3jUM1dMTiG#Qc~{+39eu~jo+Yp_~5}yf(9`_ z+4fz%8U1w-E|XC?Q<&QoS+WV;#wH`D-2C*Z(AY&7G@j~91x`b<9i&rX39K@VXCgel zr>=H$P5RKU>K{JAa7K+iu&CTgZn*G2>%7O=1zJ@P<_F@PB(;V|v8i;Rd)WV#U$V|3IzO)BhF0ico| zsnF|^K?1VHc1rbH=5!$;%x4P!1O?Fp>MNu>8>eXhI$_>rCBpM-+8X?l*D%`t(>YsM&jZW`?|p656SDhUA(5 zIT^}=?8_&6OBB$@!LXM#m_lja8E&rJ2g-FTeAy86&XsbmE-c$ z_RITT_7>M(!RQLF6f8JhC<#5SP>ion8nkk@Ka$bZE*y%%&v{7R&W0~M@)oOy)D-Xx zynF8Nf`Vp_7TF1(6Y|*y>6v~!KuJm-Y_3!;Dvzx1o@Nb8ha^%Kwly0lz3@RaTooGm zq8eZ=6#GZ6mm7;Wbu9Y$a-`XSC1R6jop!7{**FF1kUEhLR!2HmmIy!xsj6PYrIbq3@wOx-(myG7kW=s)|Z9Ftwbf zAdQeebmnP1$*b2Z9110m=4`l_xzvLiCI5)r?V|-jJqfa6t?yD+#cJn=MT?-*WV!|l zXKnsQ-sfHCXzFhJgeFv4{_^E2LRgY1Iy0oz{ctO)K;t;u{F7bR%J%2VZ|WP_dg`@9 z5otsurenjDuXAOHlfEIw?GHP#oS6j#Cck3h5p#$`7SOo0rGlyah}(-piN4z%#dnxU z;Vpb{isNqe$2(Y!qeTq=m@((K-?qTfltkgf?2hJBeIrMt4dU&ZA1PF=*&A%jQES>=e=kjaxbQ#JkQHy%(K39m(ZTktFYR> z<-6bi{4iNf{{fL~zw+4C|T~~+0FbVs8ihRG>)I;gI-hR0b5qdv?y zCU=ze^mxLi^@;Q2Ez#|Cs3mZwH5v8Y)A1-c44x@2P8FI5kzi^h`q6 zSvhv2xDvb0Zx1F-J^M!(-100+6ud=qbiG=ePObx_P4vRF0`)} z)9VbW-%8+!IGL;7PFA?^l#utjLC<~i?lFBlZa(9@^JHslqvK?eo6m~GNi1`+!Bv{> zj9hiV^bf~IajO5QVnk&^MrrvYk$wH=*TBzQR_VY@T!+NcLu&=>VHjLn5wmU;nn#MJ zp1W^N(nyDdha(|?6rnk=z@HogSTimv>QCgb?w`Xk!+dC^021+$!h4fl{u75pclTIu zE4o7k@Rd5$Y-s_ln{-z;!686*-_$76k+3K z*;@pWi}tdm1kRn2pd^N9Q<#7!6==um67kez~?}RI6)7E;>M%Tz@^B5(fF6dsa2Xz;j`O% zaEPYD(8$K4+3D&)aDftzPMQQ5ohquT-1gIao?c#P7SCr$cI;Lz4~7*FVURYK5)3sU z^+Y#3fU0gltB~wivoip-UO4Zp(x2b$XeOzrrx_WIMr9&UI{O$3}T zR|m2o$P3WqqiT zuMw%JWZa?q;LX)gs++@tgiZ#f{`$&EZz7Ht(YPs6H&#W8d4Oq_e!|W@+@V>&O09mA zC(mnN#d@OJ_7wT;dvD$zUHl)vYmnB_=>0Bu5)}uS{Gw%}aeD|qVLp%{(8N?hk8M}F zx6lw7PUd%kY+>oZEQ!})6iE1oz(dXjW>s`1LOmZS2P#1R={qXtWXuOH4HWdFz;emD za_vSgETHJjo;b#QpaFVaoUB0jXALHU%n@1c9TkF3F5e-`6| z+sVI+@V#ie>udDcEjWp{uc13~iIcUtn1y8iYWPC;emgGNA4giavM@Z4Y}TI7-l?w9 z8nKa)r=guB^x#l#W{yM__<0{JCL$O#)}MNOwD5Hz2*?CUL_V-riQ}73mXju$s^Rat z*MHL6%HX{PVp*jpftCjv4m9WhGdrM6KnCPaG>@rd6VN?%Ik~XA_wJ#Yv%zEEzI{^z zx)Qok_gEGJH|I=KXlN*!T$GtfjV8Q|l3H|Q$h}%k*cR~bPWMP{GWd&^<~Z0Hs#m!h z_#HQMmh=o z)K>GlSZZ5W9A@_aX>QxA9DZ{6z5f1^ab;J$S7YVGRx~q`g=piD^WE%YtLsC}#suoN zS}L3d~aR|GgB3mGGT0Pl)1b&4-^qf67r(&TntOe!B!j!_WLK*=TMY zG)Q`Ylns!F7Xa5}qrC-cslwho!(S7Dz&4=V0d!D-wt}w!mqBI|MQv7R=isn|8=10u zJaGQ?HwZ~&q@_Ow2M41OwiiJhc$`?+Wzsk^6}ExuICF|}%?@nHr?>x(>koi21U*YC z(vPiX+NP#^fS~W}AW!lw0MGaNahcNUjw?_W`=U_{Z z)Y!UQJJ!0qx5t)*u7&O`TNYrxmA}HTG3Zv;=rn1K&Q~^9eW#yS30ZDz5^X!vP!vEQ zVkxIu>@L4~tG~{L?3S`p&Tp`;?M2>=gtF&St#+Mf6cQoc$ETzq4Lo-!5BQ zku&GHj*T7iNN#1loiGSrp{h(O0$089`u5yp{M3W(U-goZynJPEsk#hS>8qO3? zwP+R9O@YIe`|8%Q?lfO~v~Crq-Os9t`M{toQ23WdUmE!*C1Iq@;gekTl}8q6@*-qp z2e)2P(*ubz7@sn}y4s^^rx-ZhXlBU0dodS&(r6BwJ)}0BIV~#B{caI3Y0NbMd2)9_UC&aZ&%0N?!sR#az=g+vj5CUt;{V(Zt>>U zUZvIAYS_}|f`q+{!bgLx_=2(v?K%I_g@DkWbAajeWtz|NbgJ@9v(nb|5sy^$Zj$Mxg6jk%$ifsvPwpGrT}nSOZDDH zlOpZ;Nq=oNX|EtWL|n!Kw!7XK`A4Pflkw)x-4&vbx#0LYKZ;4z33a3Cr#PoddJm@xFqgeCj}Co^YUNy z6oKTU?-M}|>B-BmpCIb-)}8P=Sp5p&%&I?`AKi=wZXobv3xPH< zJ#>U-=Ex`UtQA(z4goT`G~fEunNUu4RM)JWao8xWl3~1pDJK8Tr#yrHY&XH_gFe=x zkkIN}HK%$+T)9n4hH8s?v0m^QpxFfvJ;WR9j(G%LHmT>S z(7c;^Y^YUb`w0@f=fG?UT4ols{C1TWco!3s4V@BZ431@0UtoM3Sw)5oNmo+YfTB~# zNUMMFZ1@2XWU9eoXTg-AnJ^l_^8J@GJ5P9ier=IR>tp^~N3YP)I>ZWRF){fy&oF;a zY(D?XA;bfn1o$uO`my9ef3K!ju3JzYK1fVK-fTl;Sv-`x*ZX1eQ_McAxJRHbwe(HNNo#{;L&eBGF=sL1hf-At*qK zp9kJ>;@*8~oStzo-@+EY)@kDUi;QQ-Y4H0_kJTW@Q!2(>Adpd^3}1_>hh6l8~;`UqAHzx>Eg*7WtEKjd+i|H5L z+ovjJnF*=Bh&1%sxZl{Ea_(~b|MU~qS<${tF4VKicRd<>OGg-S1|aXMH;fXYM=yMN zzK`9@k^>sR)NxwzqC!J4exFBvyK%XLQ^ zpox5Nm$3tb`b2p`4|Omwor4a;&up7GPlIdQ&=h}kbJubH8*pEk2OfUcuLRY_;o7hy zP}*5Eue#*H$R5rd>vDNHxfS94E(!^$%$=&IaQ?H^ANMTg7sc~?g5ayN{rC-_wo~hi z7qOmx@^e*+E&$BYdf;>U#%mST?%VAVJ?l4p}XPMqwtIgb%n(*1Z2Q^lM0-A1X)7sZ&lPz7z z&@9H)9}}E9P0po$Q}yaL8t0i&lc~{}(CWBBE9U3=M{QCZtMjskj?$1aNZlr#MBOH@ z_nt7W!aHE_T0vEf&X1d*?Qzg;ny7Z8n(FD(m(djfNdn}H0M;WK%0u(|17q$pIT7`* z?S7rnsb3~Vc{&4P9s*Kceg|YTuP%r0wr^W3kba& zd@e^}Dyk|Kmp=_MGWZJT#Uxi#9ytkM{0l#MFj?d$m(%VaT>H7i=GJ(N-7@m~i4s;3#LEGyG$S3iaNp9P=)$j7#FR*>Ve&x{@KTB#!=M1}Ia} zfrOiiN~ML40EF=Hp??*76Uc<{A!L)m1a3ckupiRA{r51c>tT1F|9jZSt1mx%`S-B@ zEiTu=-b|{b1X9FBk9&)X0=}nQU%db3<^#s+$NOBILgn=2VpUd3>I+CxPG)dVVh$)! zuf~br87+D|!A{Rf^$GzAz_JIYICkbg|6oFc`{P{SosYpF=4;!lzeROjLrxC&@@(!h z7FPu0GrdO^YbS&m;|0(=uHip--j$-Lp@$@9pwD~U`l>H*#=Q1 z?0zs*Wv2^5rro2XY`~V~QiX`~kzRAZBgpup6AZl8nvkp>M3j_~&CQ~qD)WEzr|II< z1|;ASMi23+Q_;(0S~TKh2IFKOH1(j0!2z)63n-QUo}HOg>YM-?#1BIn5pjLv2oT?Y zc6S{iHb>9NpG*PN6!!P;YqUItf>AXa7ph@CK|#?d9uT?_`}_NEZf;UY389x{tv|L# z_HH6EuRR$EfX$&i0_>z+XciC$A6xZ{8uu*{P)1RKe5EnD6>Y|Ppom`b+my_=eZ^Bm{Zr!@H8}u@N}^`tZN4~VymkZk3xws@US2~W z%O5S$w@Fo$lKRz6o3;qe>o5{-Y|zj`4sDb=*XYeVAheGQ?h+Fdlg(xM2U&SIXz{{G zc_ToI@oQ~OT1n{+Xu?Y9IbBzkKppoDwBMkWO9y&+h2`Me+}vC;y9-dXTMcF2f(nMq z@@D|OYPKU}gnDNli(Ldj7nW8~$cFMyi|GO9W4$IHe%QHT5yXKYrTYjk&SBA?EEJCO z4DOS!QD_XpYY?82LMInMm2uFfX@e#g@=U_FZ{Pl4hn*fCSy@?`f8uvp{+TUL3d*`% z5K{ut{4qB-@~MWN9vPID-#R;k;YEk*+-yMP3ex%Oq&&8-Ab!FlK>yQoj_Cmov@SU| zYJ5&OKprXJ=jT^bUq75KfdlK_=$-|XX|QWU2~hu_t_aV`p@klpT#7(kSXh`|C*N5e zygX{j3q1$amsT%#2_Wrzz`@CBHP?jF?=`4%{Xm=g`YllZl(XfCfrZ@((!+^T6Rf4) z1gu9-o&*9crV9NsD3|GVtC*tV9ARIBARrTQS`AST4G*9E3dA2Tx4>5vK8z*KQ2P3U znug}jsICLZRMnwV_YH~;0A#)b+GJjfmb$?PAWbLBq%sLCeb6d@4Q<%ny*&<#hFRZZ z{Rd21=+4T32Y)^1~u9E!~{Di&%mH)Kp7hn6LSyZCG2ehtNS@nuh2Fk zdhs`-FS-xB2-K>PX=#+VZr#Eq;Q|Z0`BX0PRfLPBB^}7*ethP}fyxe~L$W}K(JnW? z4b3@BEG$l-M^4RJw6U!s^NFB0h#q)&uQIm{4Fl)`6&W=4G+!LDmfPCeG6B!T{AhCm zD#vix=K$JDGC=xTohV!0UmLJnj56Fra-kO6ZVRQ z8FSiOlm>y87}(d9-GhTn7&e|#fDCN?cIM}w1I995=a%nj3q>`bfIyjP_uX>V=g*(> zpL*KN*;m0TH8wW>3)0yhq$K#9q4FG$FDQ*Kgnbp%?@OEG*p-{&3 zrw9f&HVVU@72Nk^x^%L2095tfp6Y`Jh6{Q1CLeEP3V_b?&i*!Od+R$0*g-^GoPw$E zridw6PX{QxZT#d@1h~hX0deYN!{xD`e%*NrogxX~H{Qa-Glv~n&Vk~wIaAL&_MMKm zsHlkFybB}A1fBq#VbsTuXm!hvhk&j0sfHz)(Q*J)n!g{mgITen-z;=a;z#8#IOlI# zoWV7Nii=rU8+NZk48{23FxMn5Dai@N9a=UF_MWt$Eox!0q8IbiTe-?sn?$bzP=M+0DZylbqh6;XrjQ&{|3!5F1bJ~lq5zL7QsmCO6`zDP4M`H ztOn@iG)^`LYbY--k3Ti3cX@U7ePH0VwY4?RkbTY0C3moo&RBX?@Ecs96X(PLwuCEG zs9=eo$}O<)$VzHi9z6^aF_je zN;q{$PH)0CDZhe<48Fi<9&Ak|0B9BU=~Fl0VQjd8Mf&x>x3=U}RPF-amkEKKOw=zK zoG19NJ;Dq~Ntj^3Ku13W8}}3$HY>o^RDC~Uf`hTZ_Zb5*`CuIx3acODT^lUZ?OH_z z1%Gzq(t_Sv$`2brD)OuT%8n-)d>ArgPs8FXe9ds8B(0Bpj$OqUDfdd>ZRP8Yf zPejp!l=*AO;awyffKd<@J0azO*1sa3_Yo5ysvUiOebY|mFmmXi^5Gt>GpLUt@p~xh z*U*QT=J9)ZxdQ-&L_Q}fK(Nr8R5XA@1qR@4n&0WIE*s0SLOmko55gM$Fn?oS(=g@r1*CJI{Z+4!c(LWJ<@t z{v^Y~$NyPRhVC7GHW!O;hH95o$U97 ze5aSkzgCI=7Z*sa!Q-GW2dMhSSh3*%+-GqeX59!Hq)=)6oA^q~U{V@GKN&nG&5tz5 zVIjYTd45%@1v?LR?PLq>fzVhMPz6ueH;mHqzg2hUVL9i0-#=|5Bl}jQtSw|nw2)*O zYh=a@m4wP^D`}bPRLVXKN+d1R%q81cE2&h9R_ZKN5bw9^_ z9MAn6$NkUq*L59?^ZcE^-}n3ZzPHckXJcVuQR-FEi?dx}R`JULlW{cp$|(Aq9{kz~ zunH)DL|PDwN>*m)%di7Z+tTETR2-fU4@fE!R@!ZQuT>%aIAA8n3ssDhgyM z842#M`r|GSWnRz=*uZ&$Sw==im7WUq3!r~yAt{nnKV-i7GGytX!PcekGEmi*3* zz)?(?J(+fYv4b@=HTV0qR%jq_^i@;KW5YV$x7Ho}`pK1CP65^F9=ZTAWew936OBQG zzC~JUc>6XD^z7GGv!<1}yzG}UHbj2JjK%avfj1mL#uA1D5vN)TVg&F%zO*txtWBPE z()$Sp2Eokv`0LG^Ba|a{-v)G1;};(&2qZC}H5+++$oS>Vc#%>-3mO>{RbE|zM2&0V|J-SPd^$NRaOBKBSC9NP}*4%}a*VI>BIzegW07+F#bu4*R z%JDknQ0DH)$Ve++&`SqZ=s7^sd{V%N`ZA3}nRfy4_0tSSjp|H`aX%1i1zS7GK9Nex zs+o^F$o(0kt$l!L6iBTaW)0DckWQyyk;n4vmV z2e?o*q*aC-3=z4foTDQ_B4O3I?MoLdP~tPr@W;@({wgXt9DwoASjtU71nu}*-nXqjn*AS%rUFV%x()#pOlQx>qBol3@l_1koraU%ZQRl$8 zJNGxwPSBDa@$Q|w+rqn)+JhXzSVRn9fWzDY?!S8QTbC7=nr=1?H`=z7!jHV^ZL@kc z;~Bmp0VB>e=iAL$x}H^esw=M99$Ba2C6fgnJ9ZafUIfW9y)Va@G*?l&2t5*QSevC26mle#S!V~By%P{NFH zIzt8wNI%eT^xuWoG*|~Zln05x6I3|U&mZlBC$90obP18e{9Zq;kt27(WJQA<#3qwL zji?fPmxMyZm}4R5#u~d;Dv{K#;8#h(CDKrok_Qa>BOsCkuo8zX)KHwxt+YiXzIP!u ztgJF=C!U`hO%x{q)t5!`*kH`6eCUk0=JY-@D=Y6E_fg0V)l9sOLf}Lx z2}$k#Ji$c(sPC`Y&R|HTWwc#4QbFhV!P4PKF6Z!PbQwv(ap>Cg`bTJ(LxiF79`za9 zuWx#!$q|(M9}N2a``h+qTbqDA{b9DuTd_*nK2>mFDxk8u$50=LZfROsuv{?9sEQeoI79kOO~=DmPSo0|;0sWZ|Z_5))OA3^Ozc{$}-N zAF@&gFIjX>f;&oWz(bBG9jes@k%r^=|N2`&+_6^Gm@JOZ^eJ%sB$KjYk+R@3v$8e( z9QleHjzxb^&LjE_9xO#~D?-wVk++$fn~H^e%xTk2+UhaLUt6f1t)(2!_jI;VvH;wU_Z?E}HV;1Cyt*WD;_Z)jQA2M# zg)`a4>uvd(->cWX^=xfFo{TUXu!{s?XRDfYMt0tTBDt-8raE|V7GtR7h47jY#>T2U zBmF)XwT>?#t1W3vZpiuAP$2_q$qRW>U1OvtCnoYoe`jBJX^c({lVKq-eI}tRLb8+JzQTJwK z-#X5|Tm~_e&@lw6Hwg_5RWtPo(Teo><6JG*N~K)n{}Hw`x&BZ?`%HVmO)0M%pI#qn zF|%z7vo(ivtlqS`WqoE|FJaqkNkR%Zb>6#}v=*HE4nJL~M~}bQoMbhFVLtP&1YfZA-l3oX9AMbxBJ54_GLCi^M zY3pU1o2zD?`>U$D2^Hq(8K3Rjr%`Xgi%->3<1VMB`dw|3N~JLYU=AB2geRjS6@njOB|!$(rY^*4FSvG$Vd)3U?th7 zSLd6Nj9pw^?=Qbhv5uj0TJe#k=Ts_j8|Iy3{2B4VU}3qu0$nQ6CR@i_XCqAhBgObB zvp~=*^iS@SP8=p*Vp})CVM3D)RUXlCwDd$9K=M^GwuDbe?V;!yX-Rhd@9GTy4E)iT)3dU^pw#oZo2=5 zQ4?3+3L0IPa)0Ssw_!=3jH;(|e&bPizFBG8y1FT+V&TDZdjX~qKzrpZ8Yfv4tQ&f! zssAq)e4$N)gC)-S{MS_Bkr9^=B>E) z_|N6Z#((9ii^rGPmT8nE#^Smy=_pQeX{6UgcJQ%RiM={YCWF2a{W13hctVbco2~=BI znSpdLn@N;;HLGoG@_sb%Tj9}J;8JvOCn1cL8LS(S7^ezSA(7**k zoz9NCZheIX7?$mPdTh$_HSx}6TNQWif};&IRKG`#CR=7KF>R^Umk6i`1x1r{b73M{mC%$h#;$;2laH!)TvE3hvgk8u?XwuqYMh`giGdj^FCWZw5Bvo zn?HYksgGg_vEI8N)QfOP4zWshAChh$AG4er<-OH{vs~B!h+*p+EAI)dj#<0gpbY4> zcabBUr!O|5e~dFI3%ySqTF_`p&(V;O95|-eU`CH$!SdW!L* zM#T?NQ!@t+hfdklKee^7Cu8JvDRw}(gR}}fVp0w?Un~!9`af85W3;qjx2K9tXS-Zt zt1crg#|-?m1ec0!E-vffOO7Q8534rZ{HLne+&zV;V>I2-{7Bb=wxQH1Y$4$RA)ir0 zLLn-|_>(JQePPha@f@Ag;MX{`EkziSCw5|U4kghR6T$zOm5`EzIOYi5tvzH@Jzl zGn=oKZ+MIkDlm~)dVERHgjK<)g(cE1Lopr@p%~ow7o{A8@uIpqn{a<#XhL$vt#B$T zgC9LfE$upVs3*{H6w@aP9>rnbykvr96ml%!hN#Q8+%i}nBYN+hbL9ERH%z6veaxQu z*`@H4V!N~RQX}Vxg}0j(-I{!UJ&=XL3>0j|(aA4pp z4nm01I-XJU^HU}b@7`6?B(oOXrTO{5er6p>oSYeM?(PnEc6U?RFXR?Ql5w|uFp9C) zTjA=TLa|Q`?_!2(gD9NvruqL+V;w^m)V(wAh?MxvMo&1=wdy#urx6jok&cXqK)u$j zy>S8UsZS;i83R0Z3yA)=EC81#iTZ-y6wn$42^1$YccF$d-fTbEZSn1@a2L4c*;4KRKx(>#Urn%2H*X)%Ma zfuVBrrufEm7TTfA+3xOBP*BgZKE1rXAN@9`J9Fwc4#*}#0b1bNT|7O{ z!~4ZfrRsFPPNC&J70PK~jJ&Zas8yaRk)xUyehKb;n1u&Lo?_IrX+w8%h)J${HP{hz z>1DRE|(3K)Pi`Mn?qLe#pjU7Rc*1gd!ElY^E5apR8|ux$FVMqFH9O2clRiS zos8^kp`QW(xl4I&E%gp8LAY`#64UZ%yKfmug3u?d9Dqo1(3_%IE%=#mX`t>xAQMmz zsd6V-28rM>JTq}us*iaB-yLHs&%264>u+uO?8 zQOu_=T(roJ(kY$=;TXx$hzNf$0_>)o*)_l7i%1NH-L5>_=4lsaE&FTVkf$^k(`+l6 z{JO4X-6jUFiQhULV85Q#B{^lfBaE5Tl5OQ_o!q3(ybHt!_l0pdeS*GO9mZXX@on2q z!CK1P28obbnQ*ZVN=&;$?Nz5i_rOphtCwhj0)rFxkLFK68?Zo^w`iOCOaYP5l-BjA zz10gjk%XO>ty<8v@px#0Xb44iKqzTNpjihm6YA1Ae=-4`Lc+rY(%>|ud#ewD z-lY($I-Mt{2afyU0FY;}1Z7L%g=p^YZ}w>;yzUfx=`1ma8$6Xq~!US{;lnE|G~@~WD!7nueioeXfwW14Te z-)Dt}So=3NJz}n+IwyrXvQqBy%S=Z&$yDU9Y({byP|WfQSr=0V+~#Br&tAQHwY)xd z!0)vlFXP%g-4u-vYo8{r4qufRo+}NQ16#aWv5k*0iJM=!E~+CtS!sH2>E4(Vx>kR* znj$v?S*sJT)^1_XZZCemh<5qB_2B?V{Q(a-!Yj1}QUpH;jwa)pm=WHYwfhfFRoO4B z{%^v2SqkwczwFru$M^5!{U&ds%F4F3pLWm+@r$#0@8o|(U_QauZugez<--om#kJ4{$fK<2#61d&3xV%m|Xqr`Z1LW`MIHtYb5 zoq^+59HwM7z>B(A>8}M-%9mf}@hhnLp=(g?Wf})e5|+1U1l78bpbL}x|BkoA5(;t3 zD^=2-I`sric#|hjUa(}zj<>xACwBj`G-YORKNSPBcUUDMJ;t!-A!7^?%bMg)i zbCi6yl$&e`T@rq*`TpwaVoy=~!BzX&QV%a%=?gT?&Ls@-8x8$nC{e~)J_|@1*I1*N zP@F`W5}(al98qJO$e~rG^Q7%);rp4|bddha3c?NvBK;G~d<`Jl9hO0Y>&vgnCuL*L z<7jo>_VWH9vNX~0@zuh7#Aff4EFUF1+hOGfcGuR`JxrB&$ZQ>+(!oQA(xEMM1*=b- zc&*rWCC!PqTN@X%27bmEq#z4?SWz(t=~uGN!$WiOaHl#H6ukp><(xMUNSt|P(1O9v1+c&n!3w(S`xMd=tP}Nw-cj-fO zBD`MoAVGzmihotLD*W5VyZJda%i|m4aRL65U%dg^EbL<00-oJr-h5H!Azezyv8~;E z+m|ByKbQgjcmTLEl*NMpIG6}ra!LyCHtEJ0MclA7K7pg5l99Q$oSSl=|GSf%Ok6OG zNT0n*R+ocXA{6x@K=`_!lQAZFugYC+2Oz!=8Bla{-?pZeOCwE>oUy-iD@BA9Niad^ zDm|Bf_TZ2jO-h7?9G;CQum^aH<=-c&7Xn~bS((Q4=}F!Df5~}9?mnSoBIWqV=BO7z zxgUT3K`$VFGXrl{otO!g$wH}6!tt*^S2BdG3G(vHsrG(_F(l`hb`-IeN&DQe{e(yL@G@yyp9Svgl#`S5EA#`<@e9cDe((em znWxx{zahc^6c1t|h=zTk?$AlOK1&dADv~fagg%4sHi^B6ZM%^%tyXooXJe4gFf;c9 z!(;6-zqXaV97OylPxYEOg@~_+_ptpF0^!ODjOAHZqSglL97;ntTjFQRO+PiY!zpd; zEyJ>5RRF^oA33q_;jGFtj3-ufw(5azX|D=fMVdPdyAb$@u+NLi%DD~>V?diQn`J;W z_J~}_@39X0Urfb{>gxH(VYtTZu-%yUAr)#vhtfIP2jSvwX68Olk?)ytBY-e;3hx<- zx%K9UqDjg;LP24<@n;EUIzGR30;BZ=ptA9rUt6y3FaRmmWGI0>7&c%%nEmrT>Lw^q zR_M3f&-0&AM;)FJV?qZbU6QQbQ5b^+@(-A8RSg=Bf++&g=p;z=o75-TB#5ZNjl}n7 z0!;q_nH9-a*tmpx%_QF&I@Ptcj`=q_;hF8je~bpWh0nc?tnyD)K>`BLH8Pi5dYHYz!b7R1)%dti!}Zm*fJ{X<>b z`K+^CqQOErZ{)MO<*vhtB)9;I*D;Lt2MI3r5|bG-c!yQ!lFJ-7;bq=lUJuZ0i1Kb$ zUxk;B0I6#glTo{v7tZX`DEcR4Q@&0{&U|!JpmHrtSb4P61uQOxDjBGc5 zPKk`7qEK*K+0?o#XkVyqiq*N#x7x6|wp z&_eX7yfJSJSfJfSIX#}{$lKjULNL&1!?QWE9D`-ESERjkpjZId31~E z|LdyAhR)h+Zkv!Dy{2+|(vo z#Y8Q+i<_?}Y;rgW8sOuf^76V)I)0}1>_x-z!0RCsZIkC%xUEF8 z#-R?b@UqQ*xz(w+vT`N2{w3Pe2==qcQdEUIhuw3vwjRp8gtvu(E!Kf*Io9QS`^N-d z3?9F-E~3RF_VMG#HrW%V=gaM@U%aq8UQ+h#eDbHH*P=QFc3-T&yH6;)rvYjmwuY@F zkF!Av(o^1pGFcjZ8&LQVxCo!LO7)!~WI#e}@~L|Fk6gO6#b0%DT9qYNKrzHC65_nR z2+S!4R!EBuniG!occaBXX8pDIr4s4V_SXp|<64TuXTp?odrnMF;|!JjT^v7=jEi}s z>1kL{s4yYCo)i=n85fRuXDd`MPA^rLM0Z>nNxH%DE5aCr6V3?-emQ zz#{;q^N=AYO)>=};f6WzMxl4)Z-KkS+&1YecmvC<-)8T#ys@#L;Q6e6xTD|^-gU>J z!$h?v83r+Iy_{_#dO{H8z5_GbTq9NeE0q>$Q;E}b=XBr8S!;%$4BvsZ7o=--3_Vt; z*5ZAU0K<)@tNw-%F%Qvc>viTfj6?gL7dYzMylK=dIVaF79yaUi46Pa>O97f`B=7kG zgQQN~nzWux%U~6i1)M!1mcpr}iC1q&EJ|201fD8C=JXK@Kqui{_+O**($n{FEb0L{ z#6(^ZUc-HH!AJKjapcZ%sMsOA!XtYC{CI<^b8LF`XO8S;fKAj(bA1Lz6 zBCE!X3(Uj-J|`TlI0l4{u$+TtYHnsGp}?k8`!Q()F}=YN$FUjun}21e)Q;0q);~K286LH$2xG6*PFP)jfGc-BYtYJ zuNjP>Pv||iHwc7>D{FZZ|BCTu``1A;o$5@d@xmvxyL^~+0R0Ja|1*Z+GyP22a`rrL zB!yj~%?7iP`ruyB_GLYtJnf!To9_kFj5~evp!B2Jgw`&SO}cQ0ysG8ylmU&36ZtZR&?{6NU^yN*g7@CyCcl_>eW3o zflgRvq8Kqhhf!|Aq!AQ>XXtrl`hS&rG+2-AGEc~PpzlYIhzEvE;qikFTwXT*=-Z0}lB6f0b5P_#vWV*nXio zvQ`Pt9O30-VplD{?IY_zbe5taj*|%Yb&v!H4|0%AOQR7~f`h(0ML0}Qu%Ft<-WeQ> z?N~--v&hFJaB^aoTA`_>^Oym0l{^Kmu9KC%r$7=yJOjB@0e2DIKHqGjbAi%1Rb<|I z_Lk(uC?Arwe1J5Ovf#>lI7I>inQ9)=NvFJ`De03$ZbBj|65L4y*~D`vk5Y!9r}KT3 z5-%qd9vP*#_fCYmZIt?OR}uZBj9}o32i4Il zpovg{Jwo9?O2XQl!-lBS2~KG{-M-=>@1zlw#thkx$EQVxMEK;K0AVlLYa;sZD4ktD z)t8DduZhH)7EJ-vV$r@gc2Q7*{beEE^<~y1i=dMV${uH3#^$&f)NLX}M%&6I62Th@ z%t%^kVU>dXJ=MB*R0MB2P4vp^>zx(TT8z`6V?@)!&a}cNU9V`7Iz{^!QB#yi#wJ`r zLIaAr2L|Sr1!%EVa?%W)?_6-v~}rUg=f6>xMpXxK_cloW8vIcKNKPs zKh|sz{2!nhrxU)q0F~q;!`&V8RrlXPYD%Pajb~OR-hj^2?Na`~lMf9YGGS4{pX-b1 zspJXVkDirxB{s@0?wUkwW8MTc7LAY}FA;5hZkt}87K!bhVkgqV$S=nv?h?~Kv-bJ7 zTOMCn7rfZqoVC>m&VL@)fjc|uX7;lG8Q)(d_MymsF!Kk`-!*UddIyIG|1Hn|)C3>Q z6>v^cP27i}?L>snU?UksW4CWBG&&lW^a=&38AR_zeqx)uJ3pfH1JeDV86}4|H#j#| z0Eq#6gnsn0YtMD8t2Jj;?_@s~vNiE6k%NYaj6t>%y;tOEi+$a@?j*GiG<(4m=QDE; z_UDXnL966->yG)Gdy(cPjk+A#g7z{8;B1xTaYbIGivzQF|9)Zycd5P$xuXRI0YJ|X zeHYomp9~2m{K|tCscz`EtxvyIGwCDVMre${D&&%Kp@s5a%6|EgXGbPm z&btIHz}-iPmf&Iw2jMUN8^c^?a~wmP`VO_>>p|n@BF%I(F}WQ6vVAabWuATh9S(Up z{3p9M`C2p%lZ5{TFJII=@Z}9esXqduixb?mg}-8WHSN z{Mmg%m1W^ivJ_j3fKJI5^|E5>TM8x=q?tsd%1$XYK9ttkKh^IfDNpUYn_&`qv-^^J z$-45JPgH1`=jy_#P7@@OkUIxQNF-*5`*xK`4)puie>P9N+%7|DmPE2sB{je+$3-po z)>Xbm(rS0O;hoY^_lW98qaA#nf7mf|2LDvTxFY6QjQIC|Hj)=7_8r}|lSE>-_y77G f|KI+{ie7OS)tq$3RbJ;VNEUv(bneyJYj^)ImcnbR diff --git a/docs/website/blog/2024-07-30-cardano-transaction-certification/index.md b/docs/website/blog/2024-07-30-cardano-transaction-certification/index.md index f9df35fdb92..b8563a4ced8 100644 --- a/docs/website/blog/2024-07-30-cardano-transaction-certification/index.md +++ b/docs/website/blog/2024-07-30-cardano-transaction-certification/index.md @@ -7,16 +7,24 @@ tags: [certification, cardano transaction] ### Certification of Cardano transactions +:::info + +A threshold of at least **75%** of the stake running version `0.2.182` (within **10** days after the distribution `2437` is released) is mandatory in order to activate the certification of the Cardano transactions on the `release-mainnet` network. + +The [Mithril Protocol Insights](https://lookerstudio.google.com/u/0/reporting/8b05ea4b-6a43-45ea-aef2-237906ec7a42?s=oi6CR5eZrnQ) dashboard displays the adoption rate of the different signer versions on the `release-mainnet` network. + +::: + With the release of the new distribution [2430](https://github.com/input-output-hk/mithril/releases/tag/2430.0), we have started to roll-out the certification of the **Cardano transactions** in the Mithril networks. ![](img/cardano-transaction-rollout-plan.png) The roll-out plan of the feature is the following: -- [x] Distribution `2430` (before the **Chang** hardfork): +- [x] Distribution [2430](https://github.com/input-output-hk/mithril/releases/tag/2430.0) (before the **Chang** hardfork): - [x] Activation of the certification of **Cardano transactions** in the `pre-release-preview` network. - [x] Activation of the certification of **Cardano transactions** in the `release-preprod` network. -- [ ] Distribution `2434` (after the **Chang** hardfork): +- [x] Distribution [2437](https://github.com/input-output-hk/mithril/releases/tag/2437.1) (after the **Chang** hardfork): - [ ] Activation of the certification of **Cardano transactions** in the `release-mainnet` network. For any inquiries or assistance, don't hesitate to reach out to the team on the [Discord channel](https://discord.gg/5kaErDKDRq). From 10e28dae5a831ce78ef74f94c3fcb888b02ea8a4 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Wed, 25 Sep 2024 11:39:32 +0200 Subject: [PATCH 061/274] docs: add ''Mithril client WASM breaking-change' dev blog post --- ...24-client-wasm-unstable-breaking-change.md | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 docs/website/blog/2024-09-24-client-wasm-unstable-breaking-change.md diff --git a/docs/website/blog/2024-09-24-client-wasm-unstable-breaking-change.md b/docs/website/blog/2024-09-24-client-wasm-unstable-breaking-change.md new file mode 100644 index 00000000000..a47d857c49b --- /dev/null +++ b/docs/website/blog/2024-09-24-client-wasm-unstable-breaking-change.md @@ -0,0 +1,44 @@ +--- +title: Mithril client WASM breaking change +authors: + - name: Mithril Team +tags: [mithril client, cli, breaking-change] +--- + +### Breaking change introduced in the unstable features of the Mithril client WASM + +With the release of the new distribution [2437](https://github.com/input-output-hk/mithril/releases/tag/2437.1), we have introduced a breaking change to the **Mithril client WASM** version `0.4.1`: the activation of the unstable features is now done with a **configuration option of the client** instead of using the special `.unstable` property of the client. + +This means that when a new `unstable` feature is switched to `stable`, there will be no breaking change in the developers code using the Mithril client WASM, thus providing a seamless transition and a better developer experience. + +Here is the code used to activate the `unstable` features with the client options: + +```js +let client = new MithrilClient(aggregator_endpoint, genesis_verification_key, { + // The following option activates the unstable features of the client. + // Unstable features will trigger an error if this option is not set. + unstable: true, +}); +``` + +The previous `client.unstable` implementation is not supported anymore and must be replaced with `client`: + +```js +// Before +let mithril_stake_distributions_message = + await client.unstable.compute_mithril_stake_distribution_message( + last_stake_distribution, + ); +``` + +```js +// After +let mithril_stake_distributions_message = + await client.compute_mithril_stake_distribution_message( + last_stake_distribution, + ); +``` + +The Mithril client WASM documentation is available [here](https://mithril.network/doc/manual/developer-docs/nodes/mithril-client-library-wasm). + +For any inquiries or assistance, don't hesitate to reach out to the team on the [Discord channel](https://discord.gg/5kaErDKDRq). From 09be8567e6c3ef82122fe80d8f890d75a8693629 Mon Sep 17 00:00:00 2001 From: Damien Lachaume <135982616+dlachaume@users.noreply.github.com> Date: Thu, 26 Sep 2024 11:06:53 +0200 Subject: [PATCH 062/274] fix: remove `allow` linting reason --- mithril-common/src/logging.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/mithril-common/src/logging.rs b/mithril-common/src/logging.rs index ff275b9e202..9b4ae29baa0 100644 --- a/mithril-common/src/logging.rs +++ b/mithril-common/src/logging.rs @@ -26,10 +26,8 @@ mod tests { use slog::info; struct TestStruct; - #[allow( - dead_code, - reason = "A field is needed to add the lifetime but is unused" - )] + // The `allow(dead_code)` is used because a field is needed to add the lifetime but is unused. + #[allow(dead_code)] struct TestStructWithLifetime<'a>(&'a str); enum TestEnum {} From 69fc137cb45290e8422c2679f74eb8a3bf9ed080 Mon Sep 17 00:00:00 2001 From: Damien Lachaume <135982616+dlachaume@users.noreply.github.com> Date: Thu, 26 Sep 2024 16:59:08 +0200 Subject: [PATCH 063/274] chore: bump crate version --- Cargo.lock | 2 +- mithril-common/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e94457b0148..79cf5144f62 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3559,7 +3559,7 @@ dependencies = [ [[package]] name = "mithril-common" -version = "0.4.58" +version = "0.4.59" dependencies = [ "anyhow", "async-trait", diff --git a/mithril-common/Cargo.toml b/mithril-common/Cargo.toml index 037bb3bbda2..e2e5eba391d 100644 --- a/mithril-common/Cargo.toml +++ b/mithril-common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-common" -version = "0.4.58" +version = "0.4.59" description = "Common types, interfaces, and utilities for Mithril nodes." authors = { workspace = true } edition = { workspace = true } From 6eac9af379cc88abfef32935cfd0deb4b0456ed2 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Wed, 25 Sep 2024 15:26:12 +0200 Subject: [PATCH 064/274] feat: extend SignableSeedBuilder trait To compute the next protocol parameters protocol message part value. --- mithril-common/src/signable_builder/interface.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/mithril-common/src/signable_builder/interface.rs b/mithril-common/src/signable_builder/interface.rs index 45a89fa53d9..f3181659861 100644 --- a/mithril-common/src/signable_builder/interface.rs +++ b/mithril-common/src/signable_builder/interface.rs @@ -38,4 +38,9 @@ pub trait SignableSeedBuilder: Send + Sync { async fn compute_next_aggregate_verification_key_protocol_message_part_value( &self, ) -> StdResult; + + /// Compute next protocol parameters protocol message part value + async fn compute_next_protocol_parameters_protocol_message_part_value( + &self, + ) -> StdResult; } From c5c0ec7705f9057f5d9a16de7c39b58ebed9962b Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Wed, 25 Sep 2024 15:27:25 +0200 Subject: [PATCH 065/274] feat: make SignableSeedBuilder era aware And sign protocol parameters for the new Pythagoras era. --- .../signable_builder_service.rs | 346 +++++++++++++----- 1 file changed, 251 insertions(+), 95 deletions(-) diff --git a/mithril-common/src/signable_builder/signable_builder_service.rs b/mithril-common/src/signable_builder/signable_builder_service.rs index 2436ee1f586..d2c97020ea7 100644 --- a/mithril-common/src/signable_builder/signable_builder_service.rs +++ b/mithril-common/src/signable_builder/signable_builder_service.rs @@ -7,6 +7,7 @@ use crate::{ BlockNumber, CardanoDbBeacon, Epoch, ProtocolMessage, ProtocolMessagePartKey, SignedEntityType, }, + era::{EraChecker, SupportedEra}, signable_builder::{SignableBuilder, SignableSeedBuilder}, StdResult, }; @@ -24,6 +25,7 @@ pub trait SignableBuilderService: Send + Sync { /// Mithril Signable Builder Service pub struct MithrilSignableBuilderService { + era_checker: Arc, seed_signable_builder: Arc, mithril_stake_distribution_builder: Arc>, immutable_signable_builder: Arc>, @@ -34,6 +36,7 @@ pub struct MithrilSignableBuilderService { impl MithrilSignableBuilderService { /// MithrilSignableBuilderService factory pub fn new( + era_checker: Arc, seed_signable_builder: Arc, mithril_stake_distribution_builder: Arc>, immutable_signable_builder: Arc>, @@ -41,6 +44,7 @@ impl MithrilSignableBuilderService { cardano_stake_distribution_builder: Arc>, ) -> Self { Self { + era_checker, seed_signable_builder, mithril_stake_distribution_builder, immutable_signable_builder, @@ -89,16 +93,27 @@ impl MithrilSignableBuilderService { &self, protocol_message: ProtocolMessage, ) -> StdResult { + let mut protocol_message = protocol_message; let next_aggregate_verification_key = self .seed_signable_builder .compute_next_aggregate_verification_key_protocol_message_part_value() .await?; - let mut protocol_message = protocol_message; protocol_message.set_message_part( ProtocolMessagePartKey::NextAggregateVerificationKey, next_aggregate_verification_key, ); + if matches!(self.era_checker.current_era(), SupportedEra::Pythagoras) { + let next_protocol_parameters = self + .seed_signable_builder + .compute_next_protocol_parameters_protocol_message_part_value() + .await?; + protocol_message.set_message_part( + ProtocolMessagePartKey::NextProtocolParameters, + next_protocol_parameters, + ); + } + Ok(protocol_message) } } @@ -126,6 +141,7 @@ mod tests { use crate::{ entities::{BlockNumber, Epoch, ProtocolMessage}, + era::SupportedEra, signable_builder::{Beacon as Beaconnable, MockSignableSeedBuilder, SignableBuilder}, StdResult, }; @@ -144,6 +160,7 @@ mod tests { } struct MockDependencyInjector { + era_checker: EraChecker, mock_signable_seed_builder: MockSignableSeedBuilder, mock_mithril_stake_distribution_signable_builder: MockSignableBuilderImpl, mock_cardano_immutable_files_full_signable_builder: @@ -153,8 +170,9 @@ mod tests { } impl MockDependencyInjector { - fn new() -> MockDependencyInjector { + fn new(current_era: SupportedEra) -> MockDependencyInjector { MockDependencyInjector { + era_checker: EraChecker::new(current_era, Epoch(1)), mock_signable_seed_builder: MockSignableSeedBuilder::new(), mock_mithril_stake_distribution_signable_builder: MockSignableBuilderImpl::new(), mock_cardano_immutable_files_full_signable_builder: MockSignableBuilderImpl::new(), @@ -165,6 +183,7 @@ mod tests { fn build_signable_builder_service(self) -> MithrilSignableBuilderService { MithrilSignableBuilderService::new( + Arc::new(self.era_checker), Arc::new(self.mock_signable_seed_builder), Arc::new(self.mock_mithril_stake_distribution_signable_builder), Arc::new(self.mock_cardano_immutable_files_full_signable_builder), @@ -174,102 +193,239 @@ mod tests { } } - #[tokio::test] - async fn build_mithril_stake_distribution_signable_when_given_mithril_stake_distribution_entity_type( - ) { - let protocol_message = ProtocolMessage::new(); - let protocol_message_clone = protocol_message.clone(); - let mut mock_container = MockDependencyInjector::new(); - mock_container - .mock_signable_seed_builder - .expect_compute_next_aggregate_verification_key_protocol_message_part_value() - .once() - .return_once(move || Ok("next-avk-123".to_string())); - mock_container - .mock_mithril_stake_distribution_signable_builder - .expect_compute_protocol_message() - .once() - .return_once(move |_| Ok(protocol_message_clone)); - let signable_builder_service = mock_container.build_signable_builder_service(); - let signed_entity_type = SignedEntityType::MithrilStakeDistribution(Epoch(1)); - - signable_builder_service - .compute_protocol_message(signed_entity_type) - .await - .unwrap(); - } + mod pythagoras_era { + use super::*; - #[tokio::test] - async fn build_snapshot_signable_when_given_cardano_immutable_files_full_entity_type() { - let protocol_message = ProtocolMessage::new(); - let protocol_message_clone = protocol_message.clone(); - let mut mock_container = MockDependencyInjector::new(); - mock_container - .mock_signable_seed_builder - .expect_compute_next_aggregate_verification_key_protocol_message_part_value() - .once() - .return_once(move || Ok("next-avk-123".to_string())); - mock_container - .mock_cardano_immutable_files_full_signable_builder - .expect_compute_protocol_message() - .once() - .return_once(move |_| Ok(protocol_message_clone)); - let signable_builder_service = mock_container.build_signable_builder_service(); - let signed_entity_type = - SignedEntityType::CardanoImmutableFilesFull(CardanoDbBeacon::default()); - - signable_builder_service - .compute_protocol_message(signed_entity_type) - .await - .unwrap(); - } + #[tokio::test] + async fn build_mithril_stake_distribution_signable_when_given_mithril_stake_distribution_entity_type( + ) { + let protocol_message = ProtocolMessage::new(); + let protocol_message_clone = protocol_message.clone(); + let current_era = SupportedEra::Pythagoras; + let mut mock_container = MockDependencyInjector::new(current_era); + mock_container + .mock_signable_seed_builder + .expect_compute_next_aggregate_verification_key_protocol_message_part_value() + .once() + .return_once(move || Ok("next-avk-123".to_string())); + mock_container + .mock_signable_seed_builder + .expect_compute_next_protocol_parameters_protocol_message_part_value() + .once() + .return_once(move || Ok("protocol-params-hash-123".to_string())); + mock_container + .mock_mithril_stake_distribution_signable_builder + .expect_compute_protocol_message() + .once() + .return_once(move |_| Ok(protocol_message_clone)); + let signable_builder_service = mock_container.build_signable_builder_service(); + let signed_entity_type = SignedEntityType::MithrilStakeDistribution(Epoch(1)); + + signable_builder_service + .compute_protocol_message(signed_entity_type) + .await + .unwrap(); + } + + #[tokio::test] + async fn build_snapshot_signable_when_given_cardano_immutable_files_full_entity_type() { + let protocol_message = ProtocolMessage::new(); + let protocol_message_clone = protocol_message.clone(); + let current_era = SupportedEra::Pythagoras; + let mut mock_container = MockDependencyInjector::new(current_era); + mock_container + .mock_signable_seed_builder + .expect_compute_next_aggregate_verification_key_protocol_message_part_value() + .once() + .return_once(move || Ok("next-avk-123".to_string())); + mock_container + .mock_signable_seed_builder + .expect_compute_next_protocol_parameters_protocol_message_part_value() + .once() + .return_once(move || Ok("protocol-params-hash-123".to_string())); + mock_container + .mock_cardano_immutable_files_full_signable_builder + .expect_compute_protocol_message() + .once() + .return_once(move |_| Ok(protocol_message_clone)); + let signable_builder_service = mock_container.build_signable_builder_service(); + let signed_entity_type = + SignedEntityType::CardanoImmutableFilesFull(CardanoDbBeacon::default()); + + signable_builder_service + .compute_protocol_message(signed_entity_type) + .await + .unwrap(); + } + + #[tokio::test] + async fn build_transactions_signable_when_given_cardano_transactions_entity_type() { + let protocol_message = ProtocolMessage::new(); + let protocol_message_clone = protocol_message.clone(); + let current_era = SupportedEra::Pythagoras; + let mut mock_container = MockDependencyInjector::new(current_era); + mock_container + .mock_signable_seed_builder + .expect_compute_next_aggregate_verification_key_protocol_message_part_value() + .once() + .return_once(move || Ok("next-avk-123".to_string())); + mock_container + .mock_signable_seed_builder + .expect_compute_next_protocol_parameters_protocol_message_part_value() + .once() + .return_once(move || Ok("protocol-params-hash-123".to_string())); + mock_container + .mock_cardano_transactions_signable_builder + .expect_compute_protocol_message() + .once() + .return_once(move |_| Ok(protocol_message_clone)); + let signable_builder_service = mock_container.build_signable_builder_service(); + let signed_entity_type = + SignedEntityType::CardanoTransactions(Epoch(5), BlockNumber(1000)); + + signable_builder_service + .compute_protocol_message(signed_entity_type) + .await + .unwrap(); + } + + #[tokio::test] + async fn build_cardano_stake_distribution_signable_when_given_cardano_stake_distribution_entity_type( + ) { + let protocol_message = ProtocolMessage::new(); + let protocol_message_clone = protocol_message.clone(); + let current_era = SupportedEra::Pythagoras; + let mut mock_container = MockDependencyInjector::new(current_era); + mock_container + .mock_signable_seed_builder + .expect_compute_next_aggregate_verification_key_protocol_message_part_value() + .once() + .return_once(move || Ok("next-avk-123".to_string())); + mock_container + .mock_signable_seed_builder + .expect_compute_next_protocol_parameters_protocol_message_part_value() + .once() + .return_once(move || Ok("protocol-params-hash-123".to_string())); + mock_container + .mock_cardano_stake_distribution_signable_builder + .expect_compute_protocol_message() + .once() + .return_once(move |_| Ok(protocol_message_clone)); + let signable_builder_service = mock_container.build_signable_builder_service(); + let signed_entity_type = SignedEntityType::CardanoStakeDistribution(Epoch(5)); - #[tokio::test] - async fn build_transactions_signable_when_given_cardano_transactions_entity_type() { - let protocol_message = ProtocolMessage::new(); - let protocol_message_clone = protocol_message.clone(); - let mut mock_container = MockDependencyInjector::new(); - mock_container - .mock_signable_seed_builder - .expect_compute_next_aggregate_verification_key_protocol_message_part_value() - .once() - .return_once(move || Ok("next-avk-123".to_string())); - mock_container - .mock_cardano_transactions_signable_builder - .expect_compute_protocol_message() - .once() - .return_once(move |_| Ok(protocol_message_clone)); - let signable_builder_service = mock_container.build_signable_builder_service(); - let signed_entity_type = SignedEntityType::CardanoTransactions(Epoch(5), BlockNumber(1000)); - - signable_builder_service - .compute_protocol_message(signed_entity_type) - .await - .unwrap(); + signable_builder_service + .compute_protocol_message(signed_entity_type) + .await + .unwrap(); + } } - #[tokio::test] - async fn build_cardano_stake_distribution_signable_when_given_cardano_stake_distribution_entity_type( - ) { - let protocol_message = ProtocolMessage::new(); - let protocol_message_clone = protocol_message.clone(); - let mut mock_container = MockDependencyInjector::new(); - mock_container - .mock_signable_seed_builder - .expect_compute_next_aggregate_verification_key_protocol_message_part_value() - .once() - .return_once(move || Ok("next-avk-123".to_string())); - mock_container - .mock_cardano_stake_distribution_signable_builder - .expect_compute_protocol_message() - .once() - .return_once(move |_| Ok(protocol_message_clone)); - let signable_builder_service = mock_container.build_signable_builder_service(); - let signed_entity_type = SignedEntityType::CardanoStakeDistribution(Epoch(5)); - - signable_builder_service - .compute_protocol_message(signed_entity_type) - .await - .unwrap(); + mod thales_era { + use super::*; + + #[tokio::test] + async fn build_mithril_stake_distribution_signable_when_given_mithril_stake_distribution_entity_type( + ) { + let protocol_message = ProtocolMessage::new(); + let protocol_message_clone = protocol_message.clone(); + let current_era = SupportedEra::Thales; + let mut mock_container = MockDependencyInjector::new(current_era); + mock_container + .mock_signable_seed_builder + .expect_compute_next_aggregate_verification_key_protocol_message_part_value() + .once() + .return_once(move || Ok("next-avk-123".to_string())); + mock_container + .mock_mithril_stake_distribution_signable_builder + .expect_compute_protocol_message() + .once() + .return_once(move |_| Ok(protocol_message_clone)); + let signable_builder_service = mock_container.build_signable_builder_service(); + let signed_entity_type = SignedEntityType::MithrilStakeDistribution(Epoch(1)); + + signable_builder_service + .compute_protocol_message(signed_entity_type) + .await + .unwrap(); + } + + #[tokio::test] + async fn build_snapshot_signable_when_given_cardano_immutable_files_full_entity_type() { + let protocol_message = ProtocolMessage::new(); + let protocol_message_clone = protocol_message.clone(); + let current_era = SupportedEra::Thales; + let mut mock_container = MockDependencyInjector::new(current_era); + mock_container + .mock_signable_seed_builder + .expect_compute_next_aggregate_verification_key_protocol_message_part_value() + .once() + .return_once(move || Ok("next-avk-123".to_string())); + mock_container + .mock_cardano_immutable_files_full_signable_builder + .expect_compute_protocol_message() + .once() + .return_once(move |_| Ok(protocol_message_clone)); + let signable_builder_service = mock_container.build_signable_builder_service(); + let signed_entity_type = + SignedEntityType::CardanoImmutableFilesFull(CardanoDbBeacon::default()); + + signable_builder_service + .compute_protocol_message(signed_entity_type) + .await + .unwrap(); + } + + #[tokio::test] + async fn build_transactions_signable_when_given_cardano_transactions_entity_type() { + let protocol_message = ProtocolMessage::new(); + let protocol_message_clone = protocol_message.clone(); + let current_era = SupportedEra::Thales; + let mut mock_container = MockDependencyInjector::new(current_era); + mock_container + .mock_signable_seed_builder + .expect_compute_next_aggregate_verification_key_protocol_message_part_value() + .once() + .return_once(move || Ok("next-avk-123".to_string())); + mock_container + .mock_cardano_transactions_signable_builder + .expect_compute_protocol_message() + .once() + .return_once(move |_| Ok(protocol_message_clone)); + let signable_builder_service = mock_container.build_signable_builder_service(); + let signed_entity_type = + SignedEntityType::CardanoTransactions(Epoch(5), BlockNumber(1000)); + + signable_builder_service + .compute_protocol_message(signed_entity_type) + .await + .unwrap(); + } + + #[tokio::test] + async fn build_cardano_stake_distribution_signable_when_given_cardano_stake_distribution_entity_type( + ) { + let protocol_message = ProtocolMessage::new(); + let protocol_message_clone = protocol_message.clone(); + let current_era = SupportedEra::Thales; + let mut mock_container = MockDependencyInjector::new(current_era); + mock_container + .mock_signable_seed_builder + .expect_compute_next_aggregate_verification_key_protocol_message_part_value() + .once() + .return_once(move || Ok("next-avk-123".to_string())); + mock_container + .mock_cardano_stake_distribution_signable_builder + .expect_compute_protocol_message() + .once() + .return_once(move |_| Ok(protocol_message_clone)); + let signable_builder_service = mock_container.build_signable_builder_service(); + let signed_entity_type = SignedEntityType::CardanoStakeDistribution(Epoch(5)); + + signable_builder_service + .compute_protocol_message(signed_entity_type) + .await + .unwrap(); + } } } From 6d0e4292b2399c9d37969dd1f425653542e6938f Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Wed, 25 Sep 2024 15:28:20 +0200 Subject: [PATCH 066/274] feat: inject EraChecker in SignableBuilderService in aggregator DI builder --- mithril-aggregator/src/dependency_injection/builder.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mithril-aggregator/src/dependency_injection/builder.rs b/mithril-aggregator/src/dependency_injection/builder.rs index e96573f4897..22ef5a53111 100644 --- a/mithril-aggregator/src/dependency_injection/builder.rs +++ b/mithril-aggregator/src/dependency_injection/builder.rs @@ -1104,7 +1104,9 @@ impl DependenciesBuilder { let cardano_stake_distribution_builder = Arc::new( CardanoStakeDistributionSignableBuilder::new(self.get_stake_store().await?), ); + let era_checker = self.get_era_checker().await?; let signable_builder_service = Arc::new(MithrilSignableBuilderService::new( + era_checker, seed_signable_builder, mithril_stake_distribution_builder, immutable_signable_builder, From 818f9c57b986f7b05a6cdc2e740197a843f3f79e Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Wed, 25 Sep 2024 15:28:39 +0200 Subject: [PATCH 067/274] feat: inject EraChecker in SignableBuilderService in signer DI builder --- mithril-signer/src/dependency_injection/builder.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/mithril-signer/src/dependency_injection/builder.rs b/mithril-signer/src/dependency_injection/builder.rs index 57926f5738c..63fe60b0668 100644 --- a/mithril-signer/src/dependency_injection/builder.rs +++ b/mithril-signer/src/dependency_injection/builder.rs @@ -327,6 +327,7 @@ impl<'a> DependenciesBuilder<'a> { protocol_initializer_store.clone(), )); let signable_builder_service = Arc::new(MithrilSignableBuilderService::new( + era_checker.clone(), signable_seed_builder_service, mithril_stake_distribution_signable_builder, cardano_immutable_snapshot_builder, From 8f3ebec09e266ebbfcbd14df8fec0266305bda7e Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Wed, 25 Sep 2024 15:29:03 +0200 Subject: [PATCH 068/274] feat: inject EraChecker in SignableBuilderService in signer tests --- mithril-signer/src/runtime/runner.rs | 1 + mithril-signer/tests/test_extensions/state_machine_tester.rs | 1 + 2 files changed, 2 insertions(+) diff --git a/mithril-signer/src/runtime/runner.rs b/mithril-signer/src/runtime/runner.rs index c1c36ce6c9a..cf9640e2fb8 100644 --- a/mithril-signer/src/runtime/runner.rs +++ b/mithril-signer/src/runtime/runner.rs @@ -611,6 +611,7 @@ mod tests { protocol_initializer_store.clone(), )); let signable_builder_service = Arc::new(MithrilSignableBuilderService::new( + era_checker.clone(), signable_seed_builder_service, mithril_stake_distribution_signable_builder, cardano_immutable_signable_builder, diff --git a/mithril-signer/tests/test_extensions/state_machine_tester.rs b/mithril-signer/tests/test_extensions/state_machine_tester.rs index 20881701954..84907bec245 100644 --- a/mithril-signer/tests/test_extensions/state_machine_tester.rs +++ b/mithril-signer/tests/test_extensions/state_machine_tester.rs @@ -212,6 +212,7 @@ impl StateMachineTester { protocol_initializer_store.clone(), )); let signable_builder_service = Arc::new(MithrilSignableBuilderService::new( + era_checker.clone(), signable_seed_builder_service, mithril_stake_distribution_signable_builder, cardano_immutable_snapshot_builder, From fde28625f2bf6d3bb3be2efc59dc4ab8cbf6760f Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Wed, 25 Sep 2024 15:35:36 +0200 Subject: [PATCH 069/274] feat: compute next protocol parameters message part value in AggregatorSignableSeedBuilder --- .../signable_builder/signable_seed_builder.rs | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/mithril-aggregator/src/services/signable_builder/signable_seed_builder.rs b/mithril-aggregator/src/services/signable_builder/signable_seed_builder.rs index 4fc4cdbde6b..a7b88c6bbbb 100644 --- a/mithril-aggregator/src/services/signable_builder/signable_seed_builder.rs +++ b/mithril-aggregator/src/services/signable_builder/signable_seed_builder.rs @@ -40,6 +40,16 @@ impl SignableSeedBuilder for AggregatorSignableSeedBuilder { Ok(next_aggregate_verification_key) } + + /// Compute next protocol parameters protocol message part value + async fn compute_next_protocol_parameters_protocol_message_part_value( + &self, + ) -> StdResult { + let epoch_service = self.epoch_service.read().await; + let next_protocol_parameters = epoch_service.next_protocol_parameters()?.compute_hash(); + + Ok(next_protocol_parameters) + } } #[cfg(test)] @@ -76,4 +86,28 @@ mod tests { expected_next_aggregate_verification_key ); } + + #[tokio::test] + async fn test_compute_next_protocol_parameters_protocol_message_value() { + let epoch = Epoch(5); + let fixture = MithrilFixtureBuilder::default().with_signers(5).build(); + let next_fixture = MithrilFixtureBuilder::default().with_signers(4).build(); + let expected_next_protocol_parameters = next_fixture.protocol_parameters().compute_hash(); + let epoch_service = Arc::new(RwLock::new(FakeEpochService::with_data( + epoch, + &fixture.protocol_parameters(), + &next_fixture.protocol_parameters(), + &next_fixture.protocol_parameters(), + &fixture.signers_with_stake(), + &next_fixture.signers_with_stake(), + ))); + let signable_seed_builder = AggregatorSignableSeedBuilder::new(epoch_service); + + let next_protocol_parameters = signable_seed_builder + .compute_next_protocol_parameters_protocol_message_part_value() + .await + .unwrap(); + + assert_eq!(next_protocol_parameters, expected_next_protocol_parameters); + } } From adbd7d62446baab6b79ae115cfb115623b860c47 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Wed, 25 Sep 2024 15:57:34 +0200 Subject: [PATCH 070/274] feat: compute next protocol parameters message part value in SignerSignableSeedBuilder --- .../signable_builder/signable_seed_builder.rs | 47 ++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/mithril-signer/src/services/signable_builder/signable_seed_builder.rs b/mithril-signer/src/services/signable_builder/signable_seed_builder.rs index 8dee8e00105..27b1ff6f4c7 100644 --- a/mithril-signer/src/services/signable_builder/signable_seed_builder.rs +++ b/mithril-signer/src/services/signable_builder/signable_seed_builder.rs @@ -66,12 +66,24 @@ impl SignableSeedBuilder for SignerSignableSeedBuilder { Ok(next_aggregate_verification_key) } + + /// Compute next protocol parameters protocol message part value + async fn compute_next_protocol_parameters_protocol_message_part_value( + &self, + ) -> StdResult { + let epoch_service = self.epoch_service.read().await; + let next_protocol_parameters = epoch_service.next_protocol_parameters()?.compute_hash(); + + Ok(next_protocol_parameters) + } } #[cfg(test)] mod tests { - use mithril_common::{entities::Epoch, test_utils::MithrilFixtureBuilder}; + use mithril_common::{ + entities::Epoch, entities::ProtocolParameters, test_utils::MithrilFixtureBuilder, + }; use crate::{ services::{mock_epoch_service::MockEpochServiceImpl, MockSingleSigner}, @@ -128,4 +140,37 @@ mod tests { expected_next_aggregate_verification_key ); } + + #[tokio::test] + async fn test_compute_next_protocol_parameters_protocol_message_value() { + const NEXT_PROTOCOL_PARAMETERS: ProtocolParameters = ProtocolParameters { + k: 10, + m: 10, + phi_f: 1.0, + }; + let expected_next_protocol_parameters = NEXT_PROTOCOL_PARAMETERS.compute_hash(); + let mock_epoch_service = MockEpochServiceImpl::new_with_config(|mock_epoch_service| { + mock_epoch_service + .expect_next_protocol_parameters() + .return_once(|| Ok(&NEXT_PROTOCOL_PARAMETERS)) + .once(); + }); + let mock_single_signer = MockSingleSigner::new(); + let mock_protocol_initializer_store = MockProtocolInitializerStorer::new(); + let epoch_service = Arc::new(RwLock::new(mock_epoch_service)); + let single_signer = Arc::new(mock_single_signer); + let protocol_initializer_store = Arc::new(mock_protocol_initializer_store); + let signable_seed_builder = SignerSignableSeedBuilder::new( + epoch_service, + single_signer, + protocol_initializer_store, + ); + + let next_protocol_parameters = signable_seed_builder + .compute_next_protocol_parameters_protocol_message_part_value() + .await + .unwrap(); + + assert_eq!(next_protocol_parameters, expected_next_protocol_parameters); + } } From d5e3454ed8ff13dc8850a162b10c36802e412876 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Wed, 25 Sep 2024 16:08:04 +0200 Subject: [PATCH 071/274] refactor: enhance readability of AggregatorSignableSeedBuilder tests --- .../signable_builder/signable_seed_builder.rs | 38 ++++++++++--------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/mithril-aggregator/src/services/signable_builder/signable_seed_builder.rs b/mithril-aggregator/src/services/signable_builder/signable_seed_builder.rs index a7b88c6bbbb..3a836c7fd36 100644 --- a/mithril-aggregator/src/services/signable_builder/signable_seed_builder.rs +++ b/mithril-aggregator/src/services/signable_builder/signable_seed_builder.rs @@ -54,18 +54,20 @@ impl SignableSeedBuilder for AggregatorSignableSeedBuilder { #[cfg(test)] mod tests { - use mithril_common::{entities::Epoch, test_utils::MithrilFixtureBuilder}; + use mithril_common::{ + entities::Epoch, + test_utils::{MithrilFixture, MithrilFixtureBuilder}, + }; use crate::services::FakeEpochService; use super::*; - #[tokio::test] - async fn test_compute_next_aggregate_verification_key_protocol_message_value() { - let epoch = Epoch(5); - let fixture = MithrilFixtureBuilder::default().with_signers(5).build(); - let next_fixture = MithrilFixtureBuilder::default().with_signers(4).build(); - let expected_next_aggregate_verification_key = next_fixture.compute_and_encode_avk(); + fn build_signable_builder_service( + epoch: Epoch, + fixture: &MithrilFixture, + next_fixture: &MithrilFixture, + ) -> AggregatorSignableSeedBuilder { let epoch_service = Arc::new(RwLock::new(FakeEpochService::with_data( epoch, &fixture.protocol_parameters(), @@ -74,7 +76,17 @@ mod tests { &fixture.signers_with_stake(), &next_fixture.signers_with_stake(), ))); - let signable_seed_builder = AggregatorSignableSeedBuilder::new(epoch_service); + + AggregatorSignableSeedBuilder::new(epoch_service) + } + + #[tokio::test] + async fn test_compute_next_aggregate_verification_key_protocol_message_value() { + let epoch = Epoch(5); + let fixture = MithrilFixtureBuilder::default().with_signers(5).build(); + let next_fixture = MithrilFixtureBuilder::default().with_signers(4).build(); + let signable_seed_builder = build_signable_builder_service(epoch, &fixture, &next_fixture); + let expected_next_aggregate_verification_key = next_fixture.compute_and_encode_avk(); let next_aggregate_verification_key = signable_seed_builder .compute_next_aggregate_verification_key_protocol_message_part_value() @@ -92,16 +104,8 @@ mod tests { let epoch = Epoch(5); let fixture = MithrilFixtureBuilder::default().with_signers(5).build(); let next_fixture = MithrilFixtureBuilder::default().with_signers(4).build(); + let signable_seed_builder = build_signable_builder_service(epoch, &fixture, &next_fixture); let expected_next_protocol_parameters = next_fixture.protocol_parameters().compute_hash(); - let epoch_service = Arc::new(RwLock::new(FakeEpochService::with_data( - epoch, - &fixture.protocol_parameters(), - &next_fixture.protocol_parameters(), - &next_fixture.protocol_parameters(), - &fixture.signers_with_stake(), - &next_fixture.signers_with_stake(), - ))); - let signable_seed_builder = AggregatorSignableSeedBuilder::new(epoch_service); let next_protocol_parameters = signable_seed_builder .compute_next_protocol_parameters_protocol_message_part_value() From a79df7740d68266ef0260200bad34db9f7118b0f Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Wed, 25 Sep 2024 16:22:49 +0200 Subject: [PATCH 072/274] refactor: enhance readability of SignerSignableSeedBuilder tests --- .../signable_builder/signable_seed_builder.rs | 88 +++++++++++-------- 1 file changed, 50 insertions(+), 38 deletions(-) diff --git a/mithril-signer/src/services/signable_builder/signable_seed_builder.rs b/mithril-signer/src/services/signable_builder/signable_seed_builder.rs index 27b1ff6f4c7..17a6c0f860a 100644 --- a/mithril-signer/src/services/signable_builder/signable_seed_builder.rs +++ b/mithril-signer/src/services/signable_builder/signable_seed_builder.rs @@ -92,6 +92,30 @@ mod tests { use super::*; + struct MockDependencyInjector { + mock_epoch_service: MockEpochServiceImpl, + mock_single_signer: MockSingleSigner, + mock_protocol_initializer_store: MockProtocolInitializerStorer, + } + + impl MockDependencyInjector { + fn new() -> MockDependencyInjector { + MockDependencyInjector { + mock_epoch_service: MockEpochServiceImpl::new(), + mock_single_signer: MockSingleSigner::new(), + mock_protocol_initializer_store: MockProtocolInitializerStorer::new(), + } + } + + fn build_signable_builder_service(self) -> SignerSignableSeedBuilder { + SignerSignableSeedBuilder::new( + Arc::new(RwLock::new(self.mock_epoch_service)), + Arc::new(self.mock_single_signer), + Arc::new(self.mock_protocol_initializer_store), + ) + } + } + #[tokio::test] async fn test_compute_next_aggregate_verification_key_protocol_message_value() { let epoch = Epoch(5); @@ -101,34 +125,29 @@ mod tests { let expected_next_aggregate_verification_key_clone = expected_next_aggregate_verification_key.clone(); let protocol_initializer = fixture.signers_fixture()[0].protocol_initializer.clone(); - let mock_epoch_service = MockEpochServiceImpl::new_with_config(|mock_epoch_service| { - mock_epoch_service - .expect_epoch_of_current_data() - .return_once(move || Ok(epoch)) - .once(); - mock_epoch_service - .expect_next_signers_with_stake() - .return_once(move || Ok(Vec::new())) - .once(); - }); - let mut mock_single_signer = MockSingleSigner::new(); - mock_single_signer + let mut mock_container = MockDependencyInjector::new(); + mock_container.mock_epoch_service = + MockEpochServiceImpl::new_with_config(|mock_epoch_service| { + mock_epoch_service + .expect_epoch_of_current_data() + .return_once(move || Ok(epoch)) + .once(); + mock_epoch_service + .expect_next_signers_with_stake() + .return_once(move || Ok(Vec::new())) + .once(); + }); + mock_container + .mock_single_signer .expect_compute_aggregate_verification_key() .return_once(move |_, _| Ok(Some(expected_next_aggregate_verification_key_clone))) .once(); - let mut mock_protocol_initializer_store = MockProtocolInitializerStorer::new(); - mock_protocol_initializer_store + mock_container + .mock_protocol_initializer_store .expect_get_protocol_initializer() .return_once(move |_| Ok(Some(protocol_initializer))) .once(); - let epoch_service = Arc::new(RwLock::new(mock_epoch_service)); - let single_signer = Arc::new(mock_single_signer); - let protocol_initializer_store = Arc::new(mock_protocol_initializer_store); - let signable_seed_builder = SignerSignableSeedBuilder::new( - epoch_service, - single_signer, - protocol_initializer_store, - ); + let signable_seed_builder = mock_container.build_signable_builder_service(); let next_aggregate_verification_key = signable_seed_builder .compute_next_aggregate_verification_key_protocol_message_part_value() @@ -149,22 +168,15 @@ mod tests { phi_f: 1.0, }; let expected_next_protocol_parameters = NEXT_PROTOCOL_PARAMETERS.compute_hash(); - let mock_epoch_service = MockEpochServiceImpl::new_with_config(|mock_epoch_service| { - mock_epoch_service - .expect_next_protocol_parameters() - .return_once(|| Ok(&NEXT_PROTOCOL_PARAMETERS)) - .once(); - }); - let mock_single_signer = MockSingleSigner::new(); - let mock_protocol_initializer_store = MockProtocolInitializerStorer::new(); - let epoch_service = Arc::new(RwLock::new(mock_epoch_service)); - let single_signer = Arc::new(mock_single_signer); - let protocol_initializer_store = Arc::new(mock_protocol_initializer_store); - let signable_seed_builder = SignerSignableSeedBuilder::new( - epoch_service, - single_signer, - protocol_initializer_store, - ); + let mut mock_container = MockDependencyInjector::new(); + mock_container.mock_epoch_service = + MockEpochServiceImpl::new_with_config(|mock_epoch_service| { + mock_epoch_service + .expect_next_protocol_parameters() + .return_once(|| Ok(&NEXT_PROTOCOL_PARAMETERS)) + .once(); + }); + let signable_seed_builder = mock_container.build_signable_builder_service(); let next_protocol_parameters = signable_seed_builder .compute_next_protocol_parameters_protocol_message_part_value() From 52b332f1b2a8d3818b6e9d908967f78c2b032c8c Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Wed, 25 Sep 2024 16:35:08 +0200 Subject: [PATCH 073/274] feat: add new 'CurrentEpoch' protocol message part key --- mithril-common/src/entities/protocol_message.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/mithril-common/src/entities/protocol_message.rs b/mithril-common/src/entities/protocol_message.rs index 81b3d473ed8..2aa0fdf53e8 100644 --- a/mithril-common/src/entities/protocol_message.rs +++ b/mithril-common/src/entities/protocol_message.rs @@ -29,6 +29,12 @@ pub enum ProtocolMessagePartKey { #[serde(rename = "next_protocol_parameters")] NextProtocolParameters, + /// The ProtocolMessage part key associated to the current epoch + /// + /// aka EPOCH(n) + #[serde(rename = "current_epoch")] + CurrentEpoch, + /// The ProtocolMessage part key associated to the latest block number signed #[serde(rename = "latest_block_number")] LatestBlockNumber, @@ -48,6 +54,7 @@ impl Display for ProtocolMessagePartKey { Self::SnapshotDigest => write!(f, "snapshot_digest"), Self::NextAggregateVerificationKey => write!(f, "next_aggregate_verification_key"), Self::NextProtocolParameters => write!(f, "next_protocol_parameters"), + Self::CurrentEpoch => write!(f, "current_epoch"), Self::CardanoTransactionsMerkleRoot => write!(f, "cardano_transactions_merkle_root"), Self::LatestBlockNumber => write!(f, "latest_block_number"), Self::CardanoStakeDistributionEpoch => write!(f, "cardano_stake_distribution_epoch"), From d2ffe7fd91769d654b6171a7bb6b83f9acb732b6 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Wed, 25 Sep 2024 16:43:44 +0200 Subject: [PATCH 074/274] feat: extend SignableSeedBuilder trait To compute the current epoch protocol message part value. --- mithril-common/src/signable_builder/interface.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/mithril-common/src/signable_builder/interface.rs b/mithril-common/src/signable_builder/interface.rs index f3181659861..28082ecf8bb 100644 --- a/mithril-common/src/signable_builder/interface.rs +++ b/mithril-common/src/signable_builder/interface.rs @@ -43,4 +43,9 @@ pub trait SignableSeedBuilder: Send + Sync { async fn compute_next_protocol_parameters_protocol_message_part_value( &self, ) -> StdResult; + + /// Compute current epoch protocol message part value + async fn compute_current_epoch_protocol_message_part_value( + &self, + ) -> StdResult; } From eaedba644f16de012ac0b121cb4a81d7c14b53c9 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Wed, 25 Sep 2024 16:47:28 +0200 Subject: [PATCH 075/274] feat: make SignableBuilderService compute current epoch in protocol message Only for the new 'Pythagoras' era. --- .../signable_builder_service.rs | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/mithril-common/src/signable_builder/signable_builder_service.rs b/mithril-common/src/signable_builder/signable_builder_service.rs index d2c97020ea7..5fca6eb74c9 100644 --- a/mithril-common/src/signable_builder/signable_builder_service.rs +++ b/mithril-common/src/signable_builder/signable_builder_service.rs @@ -112,6 +112,11 @@ impl MithrilSignableBuilderService { ProtocolMessagePartKey::NextProtocolParameters, next_protocol_parameters, ); + let current_epoch = self + .seed_signable_builder + .compute_current_epoch_protocol_message_part_value() + .await?; + protocol_message.set_message_part(ProtocolMessagePartKey::CurrentEpoch, current_epoch); } Ok(protocol_message) @@ -213,6 +218,11 @@ mod tests { .expect_compute_next_protocol_parameters_protocol_message_part_value() .once() .return_once(move || Ok("protocol-params-hash-123".to_string())); + mock_container + .mock_signable_seed_builder + .expect_compute_current_epoch_protocol_message_part_value() + .once() + .return_once(move || Ok("epoch-123".to_string())); mock_container .mock_mithril_stake_distribution_signable_builder .expect_compute_protocol_message() @@ -243,6 +253,11 @@ mod tests { .expect_compute_next_protocol_parameters_protocol_message_part_value() .once() .return_once(move || Ok("protocol-params-hash-123".to_string())); + mock_container + .mock_signable_seed_builder + .expect_compute_current_epoch_protocol_message_part_value() + .once() + .return_once(move || Ok("epoch-123".to_string())); mock_container .mock_cardano_immutable_files_full_signable_builder .expect_compute_protocol_message() @@ -274,6 +289,11 @@ mod tests { .expect_compute_next_protocol_parameters_protocol_message_part_value() .once() .return_once(move || Ok("protocol-params-hash-123".to_string())); + mock_container + .mock_signable_seed_builder + .expect_compute_current_epoch_protocol_message_part_value() + .once() + .return_once(move || Ok("epoch-123".to_string())); mock_container .mock_cardano_transactions_signable_builder .expect_compute_protocol_message() @@ -306,6 +326,11 @@ mod tests { .expect_compute_next_protocol_parameters_protocol_message_part_value() .once() .return_once(move || Ok("protocol-params-hash-123".to_string())); + mock_container + .mock_signable_seed_builder + .expect_compute_current_epoch_protocol_message_part_value() + .once() + .return_once(move || Ok("epoch-123".to_string())); mock_container .mock_cardano_stake_distribution_signable_builder .expect_compute_protocol_message() From dabd0e7ab6f2dd177f6d2ae967f5e64d7bae0422 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Wed, 25 Sep 2024 16:51:49 +0200 Subject: [PATCH 076/274] feat: compute current epoch message part value in AggregatorSignableSeedBuilder --- .../signable_builder/signable_seed_builder.rs | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/mithril-aggregator/src/services/signable_builder/signable_seed_builder.rs b/mithril-aggregator/src/services/signable_builder/signable_seed_builder.rs index 3a836c7fd36..717ffcbe53e 100644 --- a/mithril-aggregator/src/services/signable_builder/signable_seed_builder.rs +++ b/mithril-aggregator/src/services/signable_builder/signable_seed_builder.rs @@ -41,7 +41,6 @@ impl SignableSeedBuilder for AggregatorSignableSeedBuilder { Ok(next_aggregate_verification_key) } - /// Compute next protocol parameters protocol message part value async fn compute_next_protocol_parameters_protocol_message_part_value( &self, ) -> StdResult { @@ -50,6 +49,15 @@ impl SignableSeedBuilder for AggregatorSignableSeedBuilder { Ok(next_protocol_parameters) } + + async fn compute_current_epoch_protocol_message_part_value( + &self, + ) -> StdResult { + let epoch_service = self.epoch_service.read().await; + let current_epoch = epoch_service.epoch_of_current_data()?.to_string(); + + Ok(current_epoch) + } } #[cfg(test)] @@ -114,4 +122,20 @@ mod tests { assert_eq!(next_protocol_parameters, expected_next_protocol_parameters); } + + #[tokio::test] + async fn test_compute_current_epoch_protocol_message_value() { + let epoch = Epoch(5); + let fixture = MithrilFixtureBuilder::default().with_signers(5).build(); + let next_fixture = MithrilFixtureBuilder::default().with_signers(4).build(); + let signable_seed_builder = build_signable_builder_service(epoch, &fixture, &next_fixture); + let expected_current_epoch = epoch.to_string(); + + let current_epoch = signable_seed_builder + .compute_current_epoch_protocol_message_part_value() + .await + .unwrap(); + + assert_eq!(current_epoch, expected_current_epoch); + } } From e1b0d4ea60e4650c563d8071e88f5b403e87f3a8 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Wed, 25 Sep 2024 16:58:58 +0200 Subject: [PATCH 077/274] feat: compute current epoch message part value in SignerSignableSeedBuilder --- .../signable_builder/signable_seed_builder.rs | 32 ++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/mithril-signer/src/services/signable_builder/signable_seed_builder.rs b/mithril-signer/src/services/signable_builder/signable_seed_builder.rs index 17a6c0f860a..a1f9c0d5943 100644 --- a/mithril-signer/src/services/signable_builder/signable_seed_builder.rs +++ b/mithril-signer/src/services/signable_builder/signable_seed_builder.rs @@ -67,7 +67,6 @@ impl SignableSeedBuilder for SignerSignableSeedBuilder { Ok(next_aggregate_verification_key) } - /// Compute next protocol parameters protocol message part value async fn compute_next_protocol_parameters_protocol_message_part_value( &self, ) -> StdResult { @@ -76,6 +75,15 @@ impl SignableSeedBuilder for SignerSignableSeedBuilder { Ok(next_protocol_parameters) } + + async fn compute_current_epoch_protocol_message_part_value( + &self, + ) -> StdResult { + let epoch_service = self.epoch_service.read().await; + let current_epoch = epoch_service.epoch_of_current_data()?.to_string(); + + Ok(current_epoch) + } } #[cfg(test)] @@ -185,4 +193,26 @@ mod tests { assert_eq!(next_protocol_parameters, expected_next_protocol_parameters); } + + #[tokio::test] + async fn test_compute_current_epoch_protocol_message_value() { + let epoch = Epoch(5); + let expected_current_epoch = epoch.to_string(); + let mut mock_container = MockDependencyInjector::new(); + mock_container.mock_epoch_service = + MockEpochServiceImpl::new_with_config(|mock_epoch_service| { + mock_epoch_service + .expect_epoch_of_current_data() + .return_once(move || Ok(epoch)) + .once(); + }); + let signable_seed_builder = mock_container.build_signable_builder_service(); + + let current_epoch = signable_seed_builder + .compute_current_epoch_protocol_message_part_value() + .await + .unwrap(); + + assert_eq!(current_epoch, expected_current_epoch); + } } From 90ee068114b5e01e2ea38473c3278cc4d645668d Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Thu, 26 Sep 2024 15:52:30 +0200 Subject: [PATCH 078/274] fix: compute next protocol parameters from ProtocolInitializer in SignerSignableSeedBuilder --- .../signable_builder/signable_seed_builder.rs | 47 +++++++++++++------ 1 file changed, 33 insertions(+), 14 deletions(-) diff --git a/mithril-signer/src/services/signable_builder/signable_seed_builder.rs b/mithril-signer/src/services/signable_builder/signable_seed_builder.rs index a1f9c0d5943..1b5173b273a 100644 --- a/mithril-signer/src/services/signable_builder/signable_seed_builder.rs +++ b/mithril-signer/src/services/signable_builder/signable_seed_builder.rs @@ -9,7 +9,9 @@ use std::sync::Arc; use tokio::sync::RwLock; use mithril_common::{ - entities::ProtocolMessagePartValue, signable_builder::SignableSeedBuilder, StdResult, + entities::{ProtocolMessagePartValue, ProtocolParameters}, + signable_builder::SignableSeedBuilder, + StdResult, }; use crate::{ @@ -54,7 +56,6 @@ impl SignableSeedBuilder for SignerSignableSeedBuilder { .ok_or_else(|| { anyhow!("can not get protocol_initializer at epoch {next_signer_retrieval_epoch}") })?; - let next_signers_with_stake = epoch_service.next_signers_with_stake().await?; let next_aggregate_verification_key = self .single_signer @@ -71,9 +72,19 @@ impl SignableSeedBuilder for SignerSignableSeedBuilder { &self, ) -> StdResult { let epoch_service = self.epoch_service.read().await; - let next_protocol_parameters = epoch_service.next_protocol_parameters()?.compute_hash(); + let epoch = (*epoch_service).epoch_of_current_data()?; + let next_signer_retrieval_epoch = epoch.offset_to_next_signer_retrieval_epoch(); + let next_protocol_initializer = self + .protocol_initializer_store + .get_protocol_initializer(next_signer_retrieval_epoch) + .await? + .ok_or_else(|| { + anyhow!("can not get protocol_initializer at epoch {next_signer_retrieval_epoch}") + })?; + let next_protocol_parameters: ProtocolParameters = + next_protocol_initializer.get_protocol_parameters().into(); - Ok(next_protocol_parameters) + Ok(next_protocol_parameters.compute_hash()) } async fn compute_current_epoch_protocol_message_part_value( @@ -127,12 +138,13 @@ mod tests { #[tokio::test] async fn test_compute_next_aggregate_verification_key_protocol_message_value() { let epoch = Epoch(5); - let fixture = MithrilFixtureBuilder::default().with_signers(5).build(); let next_fixture = MithrilFixtureBuilder::default().with_signers(4).build(); + let protocol_initializer = next_fixture.signers_fixture()[0] + .protocol_initializer + .clone(); let expected_next_aggregate_verification_key = next_fixture.compute_and_encode_avk(); let expected_next_aggregate_verification_key_clone = expected_next_aggregate_verification_key.clone(); - let protocol_initializer = fixture.signers_fixture()[0].protocol_initializer.clone(); let mut mock_container = MockDependencyInjector::new(); mock_container.mock_epoch_service = MockEpochServiceImpl::new_with_config(|mock_epoch_service| { @@ -170,20 +182,27 @@ mod tests { #[tokio::test] async fn test_compute_next_protocol_parameters_protocol_message_value() { - const NEXT_PROTOCOL_PARAMETERS: ProtocolParameters = ProtocolParameters { - k: 10, - m: 10, - phi_f: 1.0, - }; - let expected_next_protocol_parameters = NEXT_PROTOCOL_PARAMETERS.compute_hash(); + let epoch = Epoch(5); + let next_fixture = MithrilFixtureBuilder::default().with_signers(4).build(); + let protocol_initializer = next_fixture.signers_fixture()[0] + .protocol_initializer + .clone(); + let expected_next_protocol_parameters = + Into::::into(protocol_initializer.get_protocol_parameters()) + .compute_hash(); let mut mock_container = MockDependencyInjector::new(); mock_container.mock_epoch_service = MockEpochServiceImpl::new_with_config(|mock_epoch_service| { mock_epoch_service - .expect_next_protocol_parameters() - .return_once(|| Ok(&NEXT_PROTOCOL_PARAMETERS)) + .expect_epoch_of_current_data() + .return_once(move || Ok(epoch)) .once(); }); + mock_container + .mock_protocol_initializer_store + .expect_get_protocol_initializer() + .return_once(move |_| Ok(Some(protocol_initializer))) + .once(); let signable_seed_builder = mock_container.build_signable_builder_service(); let next_protocol_parameters = signable_seed_builder From ca2e746b7b4879b6a8364aa58e659f330d39ff84 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Thu, 26 Sep 2024 17:19:07 +0200 Subject: [PATCH 079/274] fix: make accurate computation of protocol message for Mithril Stake Distribution in client library --- mithril-client/src/message.rs | 4 ++-- mithril-client/tests/extensions/fake.rs | 15 +++++++-------- ...ril_stake_distribution_list_get_show_verify.rs | 2 +- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/mithril-client/src/message.rs b/mithril-client/src/message.rs index 9b0014863e6..8e2fea173b1 100644 --- a/mithril-client/src/message.rs +++ b/mithril-client/src/message.rs @@ -16,7 +16,6 @@ use std::sync::Arc; use crate::common::{ProtocolMessage, ProtocolMessagePartKey}; #[cfg(feature = "unstable")] use crate::CardanoStakeDistribution; -#[cfg(any(feature = "fs", feature = "unstable"))] use crate::MithrilCertificate; #[cfg(feature = "unstable")] use crate::VerifiedCardanoTransactions; @@ -106,6 +105,7 @@ impl MessageBuilder { /// Compute message for a Mithril stake distribution. pub fn compute_mithril_stake_distribution_message( &self, + certificate: &MithrilCertificate, mithril_stake_distribution: &MithrilStakeDistribution, ) -> MithrilResult { let signers = @@ -125,7 +125,7 @@ impl MessageBuilder { "Could not compute message: aggregate verification key encoding failed" })?; - let mut message = ProtocolMessage::new(); + let mut message = certificate.protocol_message.clone(); message.set_message_part(ProtocolMessagePartKey::NextAggregateVerificationKey, avk); Ok(message) diff --git a/mithril-client/tests/extensions/fake.rs b/mithril-client/tests/extensions/fake.rs index dbc8813da51..2fa6a7403b9 100644 --- a/mithril-client/tests/extensions/fake.rs +++ b/mithril-client/tests/extensions/fake.rs @@ -91,16 +91,15 @@ impl FakeAggregator { ]) .unwrap(); - let message = MessageBuilder::new() - .compute_mithril_stake_distribution_message(&mithril_stake_distribution) - .expect("Computing msd message should not fail"); - - let certificate_json = serde_json::to_string(&MithrilCertificate { + let mut certificate = MithrilCertificate { hash: certificate_hash.to_string(), - signed_message: message.compute_hash(), ..MithrilCertificate::dummy() - }) - .unwrap(); + }; + let message = MessageBuilder::new() + .compute_mithril_stake_distribution_message(&certificate, &mithril_stake_distribution) + .expect("Computing msd message should not fail"); + certificate.signed_message = message.compute_hash(); + let certificate_json = serde_json::to_string(&certificate).unwrap(); test_http_server( routes::mithril_stake_distribution::routes( diff --git a/mithril-client/tests/mithril_stake_distribution_list_get_show_verify.rs b/mithril-client/tests/mithril_stake_distribution_list_get_show_verify.rs index 52746425aba..deb194e2340 100644 --- a/mithril-client/tests/mithril_stake_distribution_list_get_show_verify.rs +++ b/mithril-client/tests/mithril_stake_distribution_list_get_show_verify.rs @@ -67,7 +67,7 @@ async fn mithril_stake_distribution_list_get_show_verify() { ); let message = MessageBuilder::new() - .compute_mithril_stake_distribution_message(&mithril_stake_distribution) + .compute_mithril_stake_distribution_message(&certificate, &mithril_stake_distribution) .expect("Computing msd message should not fail"); assert!( From 4e70a71385880c15ba8017aefea2412683407f6e Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Thu, 26 Sep 2024 17:19:24 +0200 Subject: [PATCH 080/274] fix: make accurate computation of protocol message for Mithril Stake Distribution in client CLI --- .../src/commands/mithril_stake_distribution/download.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mithril-client-cli/src/commands/mithril_stake_distribution/download.rs b/mithril-client-cli/src/commands/mithril_stake_distribution/download.rs index a9c4f0dd993..dba43e7490d 100644 --- a/mithril-client-cli/src/commands/mithril_stake_distribution/download.rs +++ b/mithril-client-cli/src/commands/mithril_stake_distribution/download.rs @@ -113,7 +113,7 @@ impl MithrilStakeDistributionDownloadCommand { "Verify that the Mithril stake distribution is signed in the associated certificate", )?; let message = MessageBuilder::new() - .compute_mithril_stake_distribution_message(&mithril_stake_distribution) + .compute_mithril_stake_distribution_message(&certificate, &mithril_stake_distribution) .with_context(|| { "Can not compute the message for the given Mithril stake distribution" })?; From 070984981a5b68e2be5fb37f9f2f12413c8499f6 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Thu, 26 Sep 2024 17:19:36 +0200 Subject: [PATCH 081/274] fix: make accurate computation of protocol message for Mithril Stake Distribution in client WASM --- mithril-client-wasm/npm/README.md | 1 + mithril-client-wasm/src/client_wasm.rs | 18 +++++++++++++++--- mithril-client-wasm/www-test/index.js | 1 + mithril-client-wasm/www/index.js | 6 ++++-- mithril-client-wasm/www/package-lock.json | 2 +- 5 files changed, 22 insertions(+), 6 deletions(-) diff --git a/mithril-client-wasm/npm/README.md b/mithril-client-wasm/npm/README.md index 401a124f083..815976dedc0 100644 --- a/mithril-client-wasm/npm/README.md +++ b/mithril-client-wasm/npm/README.md @@ -79,6 +79,7 @@ console.log( let mithril_stake_distributions_message = await client.compute_mithril_stake_distribution_message( last_stake_distribution, + last_certificate_from_chain, ); console.log( "mithril_stake_distributions_message:", diff --git a/mithril-client-wasm/src/client_wasm.rs b/mithril-client-wasm/src/client_wasm.rs index 7fd6546614f..5ab6c224947 100644 --- a/mithril-client-wasm/src/client_wasm.rs +++ b/mithril-client-wasm/src/client_wasm.rs @@ -154,11 +154,14 @@ impl MithrilClient { pub async fn compute_mithril_stake_distribution_message( &self, stake_distribution: JsValue, + certificate: JsValue, ) -> WasmResult { + let certificate: MithrilCertificate = + serde_wasm_bindgen::from_value(certificate).map_err(|err| format!("{err:?}"))?; let stake_distribution = serde_wasm_bindgen::from_value(stake_distribution).map_err(|err| format!("{err:?}"))?; let result = MessageBuilder::new() - .compute_mithril_stake_distribution_message(&stake_distribution) + .compute_mithril_stake_distribution_message(&certificate, &stake_distribution) .map_err(|err| format!("{err:?}"))?; Ok(serde_wasm_bindgen::to_value(&result)?) @@ -609,9 +612,15 @@ mod tests { .get_mithril_stake_distribution(test_data::msd_hashes()[0]) .await .unwrap(); + let msd = serde_wasm_bindgen::from_value::(msd_js_value.clone()) + .unwrap(); + let certificate_js_value = client + .get_mithril_certificate(&msd.certificate_hash) + .await + .unwrap(); let message_js_value = client - .compute_mithril_stake_distribution_message(msd_js_value) + .compute_mithril_stake_distribution_message(msd_js_value, certificate_js_value) .await .expect("compute_mithril_stake_distribution_message should not fail"); serde_wasm_bindgen::from_value::(message_js_value) @@ -649,7 +658,10 @@ mod tests { .await .unwrap(); let message_js_value = client - .compute_mithril_stake_distribution_message(msd_js_value) + .compute_mithril_stake_distribution_message( + msd_js_value, + last_certificate_js_value.clone(), + ) .await .unwrap(); diff --git a/mithril-client-wasm/www-test/index.js b/mithril-client-wasm/www-test/index.js index 43c2a838248..141ee72ecd6 100644 --- a/mithril-client-wasm/www-test/index.js +++ b/mithril-client-wasm/www-test/index.js @@ -100,6 +100,7 @@ let mithril_stake_distribution_message; test_number++; await run_test("compute_mithril_stake_distribution_message", test_number, async () => { mithril_stake_distribution_message = await client.compute_mithril_stake_distribution_message( + last_certificate_from_chain, mithril_stake_distribution, ); console.log("mithril_stake_distribution_message", mithril_stake_distribution_message); diff --git a/mithril-client-wasm/www/index.js b/mithril-client-wasm/www/index.js index 3583a75d317..856fdebfd3c 100644 --- a/mithril-client-wasm/www/index.js +++ b/mithril-client-wasm/www/index.js @@ -116,8 +116,10 @@ console.log( ); displayStepInDOM(5, "Computing the Mithril stake distribution message..."); -let mithril_stake_distributions_message = - await client.compute_mithril_stake_distribution_message(last_stake_distribution); +let mithril_stake_distributions_message = await client.compute_mithril_stake_distribution_message( + last_stake_distribution, + last_certificate_from_chain, +); displayMessageInDOM("Result", "Mithril stake distribution message computed ✓"); console.log("mithril_stake_distributions_message:", mithril_stake_distributions_message); diff --git a/mithril-client-wasm/www/package-lock.json b/mithril-client-wasm/www/package-lock.json index ae0bba6aa40..56d48466dc6 100644 --- a/mithril-client-wasm/www/package-lock.json +++ b/mithril-client-wasm/www/package-lock.json @@ -20,7 +20,7 @@ }, "../pkg": { "name": "mithril-client-wasm", - "version": "0.4.2", + "version": "0.4.1", "license": "Apache-2.0" }, "node_modules/@discoveryjs/json-ext": { From dc8b8cf1dba4bbeac0e82643df6c571802f96d78 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Thu, 26 Sep 2024 17:19:48 +0200 Subject: [PATCH 082/274] fix: make accurate computation of protocol message for Mithril Stake Distribution in client example --- examples/client-mithril-stake-distribution/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/client-mithril-stake-distribution/src/main.rs b/examples/client-mithril-stake-distribution/src/main.rs index 44998b5dd09..c0344462317 100644 --- a/examples/client-mithril-stake-distribution/src/main.rs +++ b/examples/client-mithril-stake-distribution/src/main.rs @@ -82,7 +82,7 @@ async fn main() -> MithrilResult<()> { ); let message = MessageBuilder::new() - .compute_mithril_stake_distribution_message(&mithril_stake_distribution)?; + .compute_mithril_stake_distribution_message(&certificate, &mithril_stake_distribution)?; if certificate.match_message(&message) { info!( From 014b68d66e0b8bb7f33c2bd11c7372d10f10e231 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Fri, 27 Sep 2024 10:26:57 +0200 Subject: [PATCH 083/274] refactor: remove 'protocol_message_part_value' suffix in SignableSeedBuilder trait --- .../signable_builder/signable_seed_builder.rs | 21 +++------- .../src/signable_builder/interface.rs | 12 ++---- .../signable_builder_service.rs | 38 +++++++++---------- .../signable_builder/signable_seed_builder.rs | 23 ++++------- 4 files changed, 35 insertions(+), 59 deletions(-) diff --git a/mithril-aggregator/src/services/signable_builder/signable_seed_builder.rs b/mithril-aggregator/src/services/signable_builder/signable_seed_builder.rs index 717ffcbe53e..c399b79a576 100644 --- a/mithril-aggregator/src/services/signable_builder/signable_seed_builder.rs +++ b/mithril-aggregator/src/services/signable_builder/signable_seed_builder.rs @@ -28,9 +28,7 @@ impl AggregatorSignableSeedBuilder { #[async_trait] impl SignableSeedBuilder for AggregatorSignableSeedBuilder { - async fn compute_next_aggregate_verification_key_protocol_message_part_value( - &self, - ) -> StdResult { + async fn compute_next_aggregate_verification_key(&self) -> StdResult { let epoch_service = self.epoch_service.read().await; let next_aggregate_verification_key = (*epoch_service) .next_aggregate_verification_key()? @@ -41,18 +39,14 @@ impl SignableSeedBuilder for AggregatorSignableSeedBuilder { Ok(next_aggregate_verification_key) } - async fn compute_next_protocol_parameters_protocol_message_part_value( - &self, - ) -> StdResult { + async fn compute_next_protocol_parameters(&self) -> StdResult { let epoch_service = self.epoch_service.read().await; let next_protocol_parameters = epoch_service.next_protocol_parameters()?.compute_hash(); Ok(next_protocol_parameters) } - async fn compute_current_epoch_protocol_message_part_value( - &self, - ) -> StdResult { + async fn compute_current_epoch(&self) -> StdResult { let epoch_service = self.epoch_service.read().await; let current_epoch = epoch_service.epoch_of_current_data()?.to_string(); @@ -97,7 +91,7 @@ mod tests { let expected_next_aggregate_verification_key = next_fixture.compute_and_encode_avk(); let next_aggregate_verification_key = signable_seed_builder - .compute_next_aggregate_verification_key_protocol_message_part_value() + .compute_next_aggregate_verification_key() .await .unwrap(); @@ -116,7 +110,7 @@ mod tests { let expected_next_protocol_parameters = next_fixture.protocol_parameters().compute_hash(); let next_protocol_parameters = signable_seed_builder - .compute_next_protocol_parameters_protocol_message_part_value() + .compute_next_protocol_parameters() .await .unwrap(); @@ -131,10 +125,7 @@ mod tests { let signable_seed_builder = build_signable_builder_service(epoch, &fixture, &next_fixture); let expected_current_epoch = epoch.to_string(); - let current_epoch = signable_seed_builder - .compute_current_epoch_protocol_message_part_value() - .await - .unwrap(); + let current_epoch = signable_seed_builder.compute_current_epoch().await.unwrap(); assert_eq!(current_epoch, expected_current_epoch); } diff --git a/mithril-common/src/signable_builder/interface.rs b/mithril-common/src/signable_builder/interface.rs index 28082ecf8bb..2c3f76df85d 100644 --- a/mithril-common/src/signable_builder/interface.rs +++ b/mithril-common/src/signable_builder/interface.rs @@ -35,17 +35,11 @@ where #[async_trait] pub trait SignableSeedBuilder: Send + Sync { /// Compute next aggregate verification key protocol message part value - async fn compute_next_aggregate_verification_key_protocol_message_part_value( - &self, - ) -> StdResult; + async fn compute_next_aggregate_verification_key(&self) -> StdResult; /// Compute next protocol parameters protocol message part value - async fn compute_next_protocol_parameters_protocol_message_part_value( - &self, - ) -> StdResult; + async fn compute_next_protocol_parameters(&self) -> StdResult; /// Compute current epoch protocol message part value - async fn compute_current_epoch_protocol_message_part_value( - &self, - ) -> StdResult; + async fn compute_current_epoch(&self) -> StdResult; } diff --git a/mithril-common/src/signable_builder/signable_builder_service.rs b/mithril-common/src/signable_builder/signable_builder_service.rs index 5fca6eb74c9..887fae71cda 100644 --- a/mithril-common/src/signable_builder/signable_builder_service.rs +++ b/mithril-common/src/signable_builder/signable_builder_service.rs @@ -96,7 +96,7 @@ impl MithrilSignableBuilderService { let mut protocol_message = protocol_message; let next_aggregate_verification_key = self .seed_signable_builder - .compute_next_aggregate_verification_key_protocol_message_part_value() + .compute_next_aggregate_verification_key() .await?; protocol_message.set_message_part( ProtocolMessagePartKey::NextAggregateVerificationKey, @@ -106,7 +106,7 @@ impl MithrilSignableBuilderService { if matches!(self.era_checker.current_era(), SupportedEra::Pythagoras) { let next_protocol_parameters = self .seed_signable_builder - .compute_next_protocol_parameters_protocol_message_part_value() + .compute_next_protocol_parameters() .await?; protocol_message.set_message_part( ProtocolMessagePartKey::NextProtocolParameters, @@ -114,7 +114,7 @@ impl MithrilSignableBuilderService { ); let current_epoch = self .seed_signable_builder - .compute_current_epoch_protocol_message_part_value() + .compute_current_epoch() .await?; protocol_message.set_message_part(ProtocolMessagePartKey::CurrentEpoch, current_epoch); } @@ -210,17 +210,17 @@ mod tests { let mut mock_container = MockDependencyInjector::new(current_era); mock_container .mock_signable_seed_builder - .expect_compute_next_aggregate_verification_key_protocol_message_part_value() + .expect_compute_next_aggregate_verification_key() .once() .return_once(move || Ok("next-avk-123".to_string())); mock_container .mock_signable_seed_builder - .expect_compute_next_protocol_parameters_protocol_message_part_value() + .expect_compute_next_protocol_parameters() .once() .return_once(move || Ok("protocol-params-hash-123".to_string())); mock_container .mock_signable_seed_builder - .expect_compute_current_epoch_protocol_message_part_value() + .expect_compute_current_epoch() .once() .return_once(move || Ok("epoch-123".to_string())); mock_container @@ -245,17 +245,17 @@ mod tests { let mut mock_container = MockDependencyInjector::new(current_era); mock_container .mock_signable_seed_builder - .expect_compute_next_aggregate_verification_key_protocol_message_part_value() + .expect_compute_next_aggregate_verification_key() .once() .return_once(move || Ok("next-avk-123".to_string())); mock_container .mock_signable_seed_builder - .expect_compute_next_protocol_parameters_protocol_message_part_value() + .expect_compute_next_protocol_parameters() .once() .return_once(move || Ok("protocol-params-hash-123".to_string())); mock_container .mock_signable_seed_builder - .expect_compute_current_epoch_protocol_message_part_value() + .expect_compute_current_epoch() .once() .return_once(move || Ok("epoch-123".to_string())); mock_container @@ -281,17 +281,17 @@ mod tests { let mut mock_container = MockDependencyInjector::new(current_era); mock_container .mock_signable_seed_builder - .expect_compute_next_aggregate_verification_key_protocol_message_part_value() + .expect_compute_next_aggregate_verification_key() .once() .return_once(move || Ok("next-avk-123".to_string())); mock_container .mock_signable_seed_builder - .expect_compute_next_protocol_parameters_protocol_message_part_value() + .expect_compute_next_protocol_parameters() .once() .return_once(move || Ok("protocol-params-hash-123".to_string())); mock_container .mock_signable_seed_builder - .expect_compute_current_epoch_protocol_message_part_value() + .expect_compute_current_epoch() .once() .return_once(move || Ok("epoch-123".to_string())); mock_container @@ -318,17 +318,17 @@ mod tests { let mut mock_container = MockDependencyInjector::new(current_era); mock_container .mock_signable_seed_builder - .expect_compute_next_aggregate_verification_key_protocol_message_part_value() + .expect_compute_next_aggregate_verification_key() .once() .return_once(move || Ok("next-avk-123".to_string())); mock_container .mock_signable_seed_builder - .expect_compute_next_protocol_parameters_protocol_message_part_value() + .expect_compute_next_protocol_parameters() .once() .return_once(move || Ok("protocol-params-hash-123".to_string())); mock_container .mock_signable_seed_builder - .expect_compute_current_epoch_protocol_message_part_value() + .expect_compute_current_epoch() .once() .return_once(move || Ok("epoch-123".to_string())); mock_container @@ -358,7 +358,7 @@ mod tests { let mut mock_container = MockDependencyInjector::new(current_era); mock_container .mock_signable_seed_builder - .expect_compute_next_aggregate_verification_key_protocol_message_part_value() + .expect_compute_next_aggregate_verification_key() .once() .return_once(move || Ok("next-avk-123".to_string())); mock_container @@ -383,7 +383,7 @@ mod tests { let mut mock_container = MockDependencyInjector::new(current_era); mock_container .mock_signable_seed_builder - .expect_compute_next_aggregate_verification_key_protocol_message_part_value() + .expect_compute_next_aggregate_verification_key() .once() .return_once(move || Ok("next-avk-123".to_string())); mock_container @@ -409,7 +409,7 @@ mod tests { let mut mock_container = MockDependencyInjector::new(current_era); mock_container .mock_signable_seed_builder - .expect_compute_next_aggregate_verification_key_protocol_message_part_value() + .expect_compute_next_aggregate_verification_key() .once() .return_once(move || Ok("next-avk-123".to_string())); mock_container @@ -436,7 +436,7 @@ mod tests { let mut mock_container = MockDependencyInjector::new(current_era); mock_container .mock_signable_seed_builder - .expect_compute_next_aggregate_verification_key_protocol_message_part_value() + .expect_compute_next_aggregate_verification_key() .once() .return_once(move || Ok("next-avk-123".to_string())); mock_container diff --git a/mithril-signer/src/services/signable_builder/signable_seed_builder.rs b/mithril-signer/src/services/signable_builder/signable_seed_builder.rs index 1b5173b273a..e315cf80f90 100644 --- a/mithril-signer/src/services/signable_builder/signable_seed_builder.rs +++ b/mithril-signer/src/services/signable_builder/signable_seed_builder.rs @@ -43,9 +43,7 @@ impl SignerSignableSeedBuilder { #[async_trait] impl SignableSeedBuilder for SignerSignableSeedBuilder { - async fn compute_next_aggregate_verification_key_protocol_message_part_value( - &self, - ) -> StdResult { + async fn compute_next_aggregate_verification_key(&self) -> StdResult { let epoch_service = self.epoch_service.read().await; let epoch = (*epoch_service).epoch_of_current_data()?; let next_signer_retrieval_epoch = epoch.offset_to_next_signer_retrieval_epoch(); @@ -68,9 +66,7 @@ impl SignableSeedBuilder for SignerSignableSeedBuilder { Ok(next_aggregate_verification_key) } - async fn compute_next_protocol_parameters_protocol_message_part_value( - &self, - ) -> StdResult { + async fn compute_next_protocol_parameters(&self) -> StdResult { let epoch_service = self.epoch_service.read().await; let epoch = (*epoch_service).epoch_of_current_data()?; let next_signer_retrieval_epoch = epoch.offset_to_next_signer_retrieval_epoch(); @@ -87,9 +83,7 @@ impl SignableSeedBuilder for SignerSignableSeedBuilder { Ok(next_protocol_parameters.compute_hash()) } - async fn compute_current_epoch_protocol_message_part_value( - &self, - ) -> StdResult { + async fn compute_current_epoch(&self) -> StdResult { let epoch_service = self.epoch_service.read().await; let current_epoch = epoch_service.epoch_of_current_data()?.to_string(); @@ -154,7 +148,7 @@ mod tests { .once(); mock_epoch_service .expect_next_signers_with_stake() - .return_once(move || Ok(Vec::new())) + .return_once(|| Ok(Vec::new())) .once(); }); mock_container @@ -170,7 +164,7 @@ mod tests { let signable_seed_builder = mock_container.build_signable_builder_service(); let next_aggregate_verification_key = signable_seed_builder - .compute_next_aggregate_verification_key_protocol_message_part_value() + .compute_next_aggregate_verification_key() .await .unwrap(); @@ -206,7 +200,7 @@ mod tests { let signable_seed_builder = mock_container.build_signable_builder_service(); let next_protocol_parameters = signable_seed_builder - .compute_next_protocol_parameters_protocol_message_part_value() + .compute_next_protocol_parameters() .await .unwrap(); @@ -227,10 +221,7 @@ mod tests { }); let signable_seed_builder = mock_container.build_signable_builder_service(); - let current_epoch = signable_seed_builder - .compute_current_epoch_protocol_message_part_value() - .await - .unwrap(); + let current_epoch = signable_seed_builder.compute_current_epoch().await.unwrap(); assert_eq!(current_epoch, expected_current_epoch); } From 6d2bbae103fbb48029176d2b015ae1c56664d381 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Fri, 27 Sep 2024 10:53:25 +0200 Subject: [PATCH 084/274] refactor: improve readability of tests in MithrilSignableBuilderService --- .../signable_builder_service.rs | 137 +++++------------- 1 file changed, 35 insertions(+), 102 deletions(-) diff --git a/mithril-common/src/signable_builder/signable_builder_service.rs b/mithril-common/src/signable_builder/signable_builder_service.rs index 887fae71cda..126c25f5049 100644 --- a/mithril-common/src/signable_builder/signable_builder_service.rs +++ b/mithril-common/src/signable_builder/signable_builder_service.rs @@ -112,10 +112,7 @@ impl MithrilSignableBuilderService { ProtocolMessagePartKey::NextProtocolParameters, next_protocol_parameters, ); - let current_epoch = self - .seed_signable_builder - .compute_current_epoch() - .await?; + let current_epoch = self.seed_signable_builder.compute_current_epoch().await?; protocol_message.set_message_part(ProtocolMessagePartKey::CurrentEpoch, current_epoch); } @@ -201,12 +198,7 @@ mod tests { mod pythagoras_era { use super::*; - #[tokio::test] - async fn build_mithril_stake_distribution_signable_when_given_mithril_stake_distribution_entity_type( - ) { - let protocol_message = ProtocolMessage::new(); - let protocol_message_clone = protocol_message.clone(); - let current_era = SupportedEra::Pythagoras; + fn build_mock_container(current_era: SupportedEra) -> MockDependencyInjector { let mut mock_container = MockDependencyInjector::new(current_era); mock_container .mock_signable_seed_builder @@ -223,11 +215,20 @@ mod tests { .expect_compute_current_epoch() .once() .return_once(move || Ok("epoch-123".to_string())); + + mock_container + } + + #[tokio::test] + async fn build_mithril_stake_distribution_signable_when_given_mithril_stake_distribution_entity_type( + ) { + let current_era = SupportedEra::Pythagoras; + let mut mock_container = build_mock_container(current_era); mock_container .mock_mithril_stake_distribution_signable_builder .expect_compute_protocol_message() .once() - .return_once(move |_| Ok(protocol_message_clone)); + .return_once(|_| Ok(ProtocolMessage::new())); let signable_builder_service = mock_container.build_signable_builder_service(); let signed_entity_type = SignedEntityType::MithrilStakeDistribution(Epoch(1)); @@ -239,30 +240,13 @@ mod tests { #[tokio::test] async fn build_snapshot_signable_when_given_cardano_immutable_files_full_entity_type() { - let protocol_message = ProtocolMessage::new(); - let protocol_message_clone = protocol_message.clone(); let current_era = SupportedEra::Pythagoras; - let mut mock_container = MockDependencyInjector::new(current_era); - mock_container - .mock_signable_seed_builder - .expect_compute_next_aggregate_verification_key() - .once() - .return_once(move || Ok("next-avk-123".to_string())); - mock_container - .mock_signable_seed_builder - .expect_compute_next_protocol_parameters() - .once() - .return_once(move || Ok("protocol-params-hash-123".to_string())); - mock_container - .mock_signable_seed_builder - .expect_compute_current_epoch() - .once() - .return_once(move || Ok("epoch-123".to_string())); + let mut mock_container = build_mock_container(current_era); mock_container .mock_cardano_immutable_files_full_signable_builder .expect_compute_protocol_message() .once() - .return_once(move |_| Ok(protocol_message_clone)); + .return_once(|_| Ok(ProtocolMessage::new())); let signable_builder_service = mock_container.build_signable_builder_service(); let signed_entity_type = SignedEntityType::CardanoImmutableFilesFull(CardanoDbBeacon::default()); @@ -275,30 +259,13 @@ mod tests { #[tokio::test] async fn build_transactions_signable_when_given_cardano_transactions_entity_type() { - let protocol_message = ProtocolMessage::new(); - let protocol_message_clone = protocol_message.clone(); let current_era = SupportedEra::Pythagoras; - let mut mock_container = MockDependencyInjector::new(current_era); - mock_container - .mock_signable_seed_builder - .expect_compute_next_aggregate_verification_key() - .once() - .return_once(move || Ok("next-avk-123".to_string())); - mock_container - .mock_signable_seed_builder - .expect_compute_next_protocol_parameters() - .once() - .return_once(move || Ok("protocol-params-hash-123".to_string())); - mock_container - .mock_signable_seed_builder - .expect_compute_current_epoch() - .once() - .return_once(move || Ok("epoch-123".to_string())); + let mut mock_container = build_mock_container(current_era); mock_container .mock_cardano_transactions_signable_builder .expect_compute_protocol_message() .once() - .return_once(move |_| Ok(protocol_message_clone)); + .return_once(|_| Ok(ProtocolMessage::new())); let signable_builder_service = mock_container.build_signable_builder_service(); let signed_entity_type = SignedEntityType::CardanoTransactions(Epoch(5), BlockNumber(1000)); @@ -312,30 +279,13 @@ mod tests { #[tokio::test] async fn build_cardano_stake_distribution_signable_when_given_cardano_stake_distribution_entity_type( ) { - let protocol_message = ProtocolMessage::new(); - let protocol_message_clone = protocol_message.clone(); let current_era = SupportedEra::Pythagoras; - let mut mock_container = MockDependencyInjector::new(current_era); - mock_container - .mock_signable_seed_builder - .expect_compute_next_aggregate_verification_key() - .once() - .return_once(move || Ok("next-avk-123".to_string())); - mock_container - .mock_signable_seed_builder - .expect_compute_next_protocol_parameters() - .once() - .return_once(move || Ok("protocol-params-hash-123".to_string())); - mock_container - .mock_signable_seed_builder - .expect_compute_current_epoch() - .once() - .return_once(move || Ok("epoch-123".to_string())); + let mut mock_container = build_mock_container(current_era); mock_container .mock_cardano_stake_distribution_signable_builder .expect_compute_protocol_message() .once() - .return_once(move |_| Ok(protocol_message_clone)); + .return_once(|_| Ok(ProtocolMessage::new())); let signable_builder_service = mock_container.build_signable_builder_service(); let signed_entity_type = SignedEntityType::CardanoStakeDistribution(Epoch(5)); @@ -349,23 +299,27 @@ mod tests { mod thales_era { use super::*; - #[tokio::test] - async fn build_mithril_stake_distribution_signable_when_given_mithril_stake_distribution_entity_type( - ) { - let protocol_message = ProtocolMessage::new(); - let protocol_message_clone = protocol_message.clone(); - let current_era = SupportedEra::Thales; + fn build_mock_container(current_era: SupportedEra) -> MockDependencyInjector { let mut mock_container = MockDependencyInjector::new(current_era); mock_container .mock_signable_seed_builder .expect_compute_next_aggregate_verification_key() .once() .return_once(move || Ok("next-avk-123".to_string())); + + mock_container + } + + #[tokio::test] + async fn build_mithril_stake_distribution_signable_when_given_mithril_stake_distribution_entity_type( + ) { + let current_era = SupportedEra::Thales; + let mut mock_container = build_mock_container(current_era); mock_container .mock_mithril_stake_distribution_signable_builder .expect_compute_protocol_message() .once() - .return_once(move |_| Ok(protocol_message_clone)); + .return_once(|_| Ok(ProtocolMessage::new())); let signable_builder_service = mock_container.build_signable_builder_service(); let signed_entity_type = SignedEntityType::MithrilStakeDistribution(Epoch(1)); @@ -377,20 +331,13 @@ mod tests { #[tokio::test] async fn build_snapshot_signable_when_given_cardano_immutable_files_full_entity_type() { - let protocol_message = ProtocolMessage::new(); - let protocol_message_clone = protocol_message.clone(); let current_era = SupportedEra::Thales; - let mut mock_container = MockDependencyInjector::new(current_era); - mock_container - .mock_signable_seed_builder - .expect_compute_next_aggregate_verification_key() - .once() - .return_once(move || Ok("next-avk-123".to_string())); + let mut mock_container = build_mock_container(current_era); mock_container .mock_cardano_immutable_files_full_signable_builder .expect_compute_protocol_message() .once() - .return_once(move |_| Ok(protocol_message_clone)); + .return_once(|_| Ok(ProtocolMessage::new())); let signable_builder_service = mock_container.build_signable_builder_service(); let signed_entity_type = SignedEntityType::CardanoImmutableFilesFull(CardanoDbBeacon::default()); @@ -403,20 +350,13 @@ mod tests { #[tokio::test] async fn build_transactions_signable_when_given_cardano_transactions_entity_type() { - let protocol_message = ProtocolMessage::new(); - let protocol_message_clone = protocol_message.clone(); let current_era = SupportedEra::Thales; - let mut mock_container = MockDependencyInjector::new(current_era); - mock_container - .mock_signable_seed_builder - .expect_compute_next_aggregate_verification_key() - .once() - .return_once(move || Ok("next-avk-123".to_string())); + let mut mock_container = build_mock_container(current_era); mock_container .mock_cardano_transactions_signable_builder .expect_compute_protocol_message() .once() - .return_once(move |_| Ok(protocol_message_clone)); + .return_once(|_| Ok(ProtocolMessage::new())); let signable_builder_service = mock_container.build_signable_builder_service(); let signed_entity_type = SignedEntityType::CardanoTransactions(Epoch(5), BlockNumber(1000)); @@ -430,20 +370,13 @@ mod tests { #[tokio::test] async fn build_cardano_stake_distribution_signable_when_given_cardano_stake_distribution_entity_type( ) { - let protocol_message = ProtocolMessage::new(); - let protocol_message_clone = protocol_message.clone(); let current_era = SupportedEra::Thales; - let mut mock_container = MockDependencyInjector::new(current_era); - mock_container - .mock_signable_seed_builder - .expect_compute_next_aggregate_verification_key() - .once() - .return_once(move || Ok("next-avk-123".to_string())); + let mut mock_container = build_mock_container(current_era); mock_container .mock_cardano_stake_distribution_signable_builder .expect_compute_protocol_message() .once() - .return_once(move |_| Ok(protocol_message_clone)); + .return_once(|_| Ok(ProtocolMessage::new())); let signable_builder_service = mock_container.build_signable_builder_service(); let signed_entity_type = SignedEntityType::CardanoStakeDistribution(Epoch(5)); From 553a280f08ff357a92eea4e338ca2f7d18a08447 Mon Sep 17 00:00:00 2001 From: Damien Lachaume <135982616+dlachaume@users.noreply.github.com> Date: Fri, 27 Sep 2024 09:42:30 +0200 Subject: [PATCH 085/274] docs: improve clarity in "Verify your signer is registered" section --- docs/website/root/manual/getting-started/run-signer-node.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/website/root/manual/getting-started/run-signer-node.md b/docs/website/root/manual/getting-started/run-signer-node.md index 39b28127250..f8cdfba8be6 100644 --- a/docs/website/root/manual/getting-started/run-signer-node.md +++ b/docs/website/root/manual/getting-started/run-signer-node.md @@ -909,7 +909,7 @@ Once this delay has passed, you should be able to observe your `PoolId` listed i ### Verify your signer is registered -After installing the Mithril signer, you can verify that your node is registered by checking your Mithril signer node logs. +After installing the Mithril signer, you can verify that your node is registered. First, download the script into the desired directory: From b2731554c63c8ab2f0fefa3730c5485e99489cff Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Fri, 27 Sep 2024 11:15:24 +0200 Subject: [PATCH 086/274] chore: improve readability of tests in SignerSignableSeedBuilder --- .../src/services/signable_builder/signable_seed_builder.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mithril-signer/src/services/signable_builder/signable_seed_builder.rs b/mithril-signer/src/services/signable_builder/signable_seed_builder.rs index e315cf80f90..7529816f626 100644 --- a/mithril-signer/src/services/signable_builder/signable_seed_builder.rs +++ b/mithril-signer/src/services/signable_builder/signable_seed_builder.rs @@ -181,9 +181,9 @@ mod tests { let protocol_initializer = next_fixture.signers_fixture()[0] .protocol_initializer .clone(); - let expected_next_protocol_parameters = - Into::::into(protocol_initializer.get_protocol_parameters()) - .compute_hash(); + let protocol_parameters: ProtocolParameters = + protocol_initializer.get_protocol_parameters().into(); + let expected_next_protocol_parameters = protocol_parameters.compute_hash(); let mut mock_container = MockDependencyInjector::new(); mock_container.mock_epoch_service = MockEpochServiceImpl::new_with_config(|mock_epoch_service| { From 238a4dc6b40b9c1d492aeb8930a5c3482fa29d6c Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Fri, 27 Sep 2024 10:57:19 +0200 Subject: [PATCH 087/274] docs: update CHANGELOG --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 71be1b28819..0660cf0739d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,7 +19,7 @@ As a minor extension, we have adopted a slightly different versioning convention - Support for signing the protocol parameters in the Genesis certificate. -- Refactor the builder of the protocol messages to be signed. +- Refactor the builder of the protocol messages, and add support for protocol parameters and epoch parts. - Crates versions: From f7ba3b9a5fb14568aa2507f5abbb4e642d6de354 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Fri, 27 Sep 2024 11:20:27 +0200 Subject: [PATCH 088/274] chore: bump crates versions - 'client-mithril-stake-distribution' from '0.1.17' to '0.2.0' - 'mithril-aggregator' from '0.5.68' to '0.5.69' - 'mithril-client-cli' from '0.9.12' to '0.9.13' - 'mithril-client-wasm' from '0.4.1' to '0.5.0' - 'mithril-client' from '0.8.18' to '0.9.0' - 'mithril-common' from '0.4.59' to '0.4.60' - 'mithril-signer' from '0.2.187' to '0.2.188'. --- Cargo.lock | 14 +++++++------- .../client-mithril-stake-distribution/Cargo.toml | 2 +- mithril-aggregator/Cargo.toml | 2 +- mithril-client-cli/Cargo.toml | 2 +- mithril-client-wasm/Cargo.toml | 2 +- mithril-client/Cargo.toml | 2 +- mithril-common/Cargo.toml | 2 +- mithril-signer/Cargo.toml | 2 +- 8 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 79cf5144f62..5b684292b20 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -946,7 +946,7 @@ dependencies = [ [[package]] name = "client-mithril-stake-distribution" -version = "0.1.17" +version = "0.2.0" dependencies = [ "anyhow", "clap", @@ -3403,7 +3403,7 @@ dependencies = [ [[package]] name = "mithril-aggregator" -version = "0.5.68" +version = "0.5.69" dependencies = [ "anyhow", "async-trait", @@ -3480,7 +3480,7 @@ dependencies = [ [[package]] name = "mithril-client" -version = "0.8.18" +version = "0.9.0" dependencies = [ "anyhow", "async-recursion", @@ -3513,7 +3513,7 @@ dependencies = [ [[package]] name = "mithril-client-cli" -version = "0.9.12" +version = "0.9.13" dependencies = [ "anyhow", "async-trait", @@ -3543,7 +3543,7 @@ dependencies = [ [[package]] name = "mithril-client-wasm" -version = "0.4.1" +version = "0.5.0" dependencies = [ "async-trait", "futures", @@ -3559,7 +3559,7 @@ dependencies = [ [[package]] name = "mithril-common" -version = "0.4.59" +version = "0.4.60" dependencies = [ "anyhow", "async-trait", @@ -3703,7 +3703,7 @@ dependencies = [ [[package]] name = "mithril-signer" -version = "0.2.187" +version = "0.2.188" dependencies = [ "anyhow", "async-trait", diff --git a/examples/client-mithril-stake-distribution/Cargo.toml b/examples/client-mithril-stake-distribution/Cargo.toml index 745f5c44f93..dde022f24bd 100644 --- a/examples/client-mithril-stake-distribution/Cargo.toml +++ b/examples/client-mithril-stake-distribution/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "client-mithril-stake-distribution" description = "Mithril client stake distribution example" -version = "0.1.17" +version = "0.2.0" authors = ["dev@iohk.io", "mithril-dev@iohk.io"] documentation = "https://mithril.network/doc" edition = "2021" diff --git a/mithril-aggregator/Cargo.toml b/mithril-aggregator/Cargo.toml index f36004d51d9..705cd49504c 100644 --- a/mithril-aggregator/Cargo.toml +++ b/mithril-aggregator/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-aggregator" -version = "0.5.68" +version = "0.5.69" description = "A Mithril Aggregator server" authors = { workspace = true } edition = { workspace = true } diff --git a/mithril-client-cli/Cargo.toml b/mithril-client-cli/Cargo.toml index 48501cd547f..2b79f20b530 100644 --- a/mithril-client-cli/Cargo.toml +++ b/mithril-client-cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-client-cli" -version = "0.9.12" +version = "0.9.13" description = "A Mithril Client" authors = { workspace = true } edition = { workspace = true } diff --git a/mithril-client-wasm/Cargo.toml b/mithril-client-wasm/Cargo.toml index 4a833224168..b82660e95b2 100644 --- a/mithril-client-wasm/Cargo.toml +++ b/mithril-client-wasm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-client-wasm" -version = "0.4.1" +version = "0.5.0" description = "Mithril client WASM" authors = { workspace = true } edition = { workspace = true } diff --git a/mithril-client/Cargo.toml b/mithril-client/Cargo.toml index 0bf6e7fe48e..a991ff141d3 100644 --- a/mithril-client/Cargo.toml +++ b/mithril-client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-client" -version = "0.8.18" +version = "0.9.0" description = "Mithril client library" authors = { workspace = true } edition = { workspace = true } diff --git a/mithril-common/Cargo.toml b/mithril-common/Cargo.toml index e2e5eba391d..251ed7b4676 100644 --- a/mithril-common/Cargo.toml +++ b/mithril-common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-common" -version = "0.4.59" +version = "0.4.60" description = "Common types, interfaces, and utilities for Mithril nodes." authors = { workspace = true } edition = { workspace = true } diff --git a/mithril-signer/Cargo.toml b/mithril-signer/Cargo.toml index efc86b5173b..93cf4bde3ac 100644 --- a/mithril-signer/Cargo.toml +++ b/mithril-signer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-signer" -version = "0.2.187" +version = "0.2.188" description = "A Mithril Signer" authors = { workspace = true } edition = { workspace = true } From f0b0a7ba4e07dab937b44f2cd4a1e96fecf11920 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Fri, 27 Sep 2024 11:29:31 +0200 Subject: [PATCH 089/274] chore: bump WASM client websites versions - 'www' from '0.2.2.' to '0.2.3' - 'www-test' from '0.2.2' to '0.2.3'. --- mithril-client-wasm/www-test/package.json | 2 +- mithril-client-wasm/www/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mithril-client-wasm/www-test/package.json b/mithril-client-wasm/www-test/package.json index 15de64f3095..e3fa8824aa7 100644 --- a/mithril-client-wasm/www-test/package.json +++ b/mithril-client-wasm/www-test/package.json @@ -1,6 +1,6 @@ { "name": "www-test", - "version": "0.2.2", + "version": "0.2.3", "private": true, "scripts": { "build": "webpack --config webpack.config.js", diff --git a/mithril-client-wasm/www/package.json b/mithril-client-wasm/www/package.json index b583aaae576..8b4ac2fa522 100644 --- a/mithril-client-wasm/www/package.json +++ b/mithril-client-wasm/www/package.json @@ -1,6 +1,6 @@ { "name": "www", - "version": "0.2.2", + "version": "0.2.3", "private": true, "scripts": { "build": "webpack --config webpack.config.js", From 09c5a51cb9459c64f57209a3d8cb0316c346ed2b Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Thu, 26 Sep 2024 09:19:38 +0200 Subject: [PATCH 090/274] chore: revert fixed crane version '0.18.0' --- flake.nix | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/flake.nix b/flake.nix index dac3dde9725..2cac18c7bd7 100644 --- a/flake.nix +++ b/flake.nix @@ -4,9 +4,7 @@ nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable"; treefmt-nix.url = "github:numtide/treefmt-nix"; treefmt-nix.inputs.nixpkgs.follows = "nixpkgs"; - # Latest compatible version of crane with this flake is v0.18.0 with a version of rust of 1.80.0 - # TODO: Remove the `?ref=...` and adapt this flake to work with the latest version of crane - crane.url = "github:ipetkov/crane?ref=v0.18.0"; + crane.url = "github:ipetkov/crane"; crane.inputs.nixpkgs.follows = "nixpkgs"; }; From 9167014d65b22a13ced81d23dec658981e759ed7 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Thu, 26 Sep 2024 09:20:19 +0200 Subject: [PATCH 091/274] chore: update nix flake dependencies By running 'nix flake update' command. --- flake.lock | 30 ++++++++++++------------------ 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/flake.lock b/flake.lock index e1474183bb7..440e77ea8a3 100644 --- a/flake.lock +++ b/flake.lock @@ -1,22 +1,16 @@ { "nodes": { "crane": { - "inputs": { - "nixpkgs": [ - "nixpkgs" - ] - }, "locked": { - "lastModified": 1720226507, - "narHash": "sha256-yHVvNsgrpyNTXZBEokL8uyB2J6gB1wEx0KOJzoeZi1A=", + "lastModified": 1727316705, + "narHash": "sha256-/mumx8AQ5xFuCJqxCIOFCHTVlxHkMT21idpbgbm/TIE=", "owner": "ipetkov", "repo": "crane", - "rev": "0aed560c5c0a61c9385bddff471a13036203e11c", + "rev": "5b03654ce046b5167e7b0bccbd8244cb56c16f0e", "type": "github" }, "original": { "owner": "ipetkov", - "ref": "v0.18.0", "repo": "crane", "type": "github" } @@ -26,11 +20,11 @@ "nixpkgs-lib": "nixpkgs-lib" }, "locked": { - "lastModified": 1725234343, - "narHash": "sha256-+ebgonl3NbiKD2UD0x4BszCZQ6sTfL4xioaM49o5B3Y=", + "lastModified": 1726153070, + "narHash": "sha256-HO4zgY0ekfwO5bX0QH/3kJ/h4KvUDFZg8YpkNwIbg1U=", "owner": "hercules-ci", "repo": "flake-parts", - "rev": "567b938d64d4b4112ee253b9274472dc3a346eb6", + "rev": "bcef6817a8b2aa20a5a6dbb19b43e63c5bf8619a", "type": "github" }, "original": { @@ -41,11 +35,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1725816686, - "narHash": "sha256-0Kq2MkQ/sQX1rhWJ/ySBBQlBJBUK8mPMDcuDhhdBkSU=", + "lastModified": 1727173215, + "narHash": "sha256-OtMlWYCqBDbnEsByoows785Gem9CSMiXYEBiKKtStk4=", "owner": "nixos", "repo": "nixpkgs", - "rev": "add0443ee587a0c44f22793b8c8649a0dbc3bb00", + "rev": "965289e5e07243f1cde3212d8bcaf726d36c5c46", "type": "github" }, "original": { @@ -82,11 +76,11 @@ ] }, "locked": { - "lastModified": 1725271838, - "narHash": "sha256-VcqxWT0O/gMaeWTTjf1r4MOyG49NaNxW4GHTO3xuThE=", + "lastModified": 1727252110, + "narHash": "sha256-3O7RWiXpvqBcCl84Mvqa8dXudZ1Bol1ubNdSmQt7nF4=", "owner": "numtide", "repo": "treefmt-nix", - "rev": "9fb342d14b69aefdf46187f6bb80a4a0d97007cd", + "rev": "1bff2ba6ec22bc90e9ad3f7e94cca0d37870afa3", "type": "github" }, "original": { From 99ddc8fa33a4242700c6416ba5f2c4104dd13aeb Mon Sep 17 00:00:00 2001 From: Daniel Firth Date: Fri, 27 Sep 2024 10:37:04 +0000 Subject: [PATCH 092/274] Fix call to craneLib --- flake.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flake.nix b/flake.nix index 2cac18c7bd7..82bef7453c5 100644 --- a/flake.nix +++ b/flake.nix @@ -24,7 +24,7 @@ ... }: let inherit (inputs.nixpkgs) lib; - craneLib = inputs.crane.lib.${system}; + craneLib = inputs.crane.mkLib pkgs; clean = root: lib.cleanSourceWith { From 76f48d8dbcabf4d8d68db5cc394d37a4a459fe0f Mon Sep 17 00:00:00 2001 From: Sebastian Nagel Date: Fri, 27 Sep 2024 18:15:39 +0200 Subject: [PATCH 093/274] Drop invalid override of crane nixpkgs --- flake.nix | 1 - 1 file changed, 1 deletion(-) diff --git a/flake.nix b/flake.nix index 82bef7453c5..3521c3221e1 100644 --- a/flake.nix +++ b/flake.nix @@ -5,7 +5,6 @@ treefmt-nix.url = "github:numtide/treefmt-nix"; treefmt-nix.inputs.nixpkgs.follows = "nixpkgs"; crane.url = "github:ipetkov/crane"; - crane.inputs.nixpkgs.follows = "nixpkgs"; }; outputs = inputs: From 748175f400077b3ce7ac0bcfc34b29249c4f7c37 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Mon, 30 Sep 2024 09:49:36 +0200 Subject: [PATCH 094/274] fix: swagger build step failing in CI Due to missing 'GITHUB_TOKEN' which is now required. --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0bf8dd65c5b..31c60799820 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -841,6 +841,7 @@ jobs: with: output: out/ spec-file: ./openapi.yaml + token: ${{ secrets.GITHUB_TOKEN }} - name: Publish OpenAPI UI build uses: actions/upload-artifact@v4 From a81e7e82b0a2c5872aecb4d7957bbfb716793976 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Mon, 30 Sep 2024 11:31:11 +0200 Subject: [PATCH 095/274] fix: protocol parameters discrepancy in pending certificate --- mithril-aggregator/src/runtime/runner.rs | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/mithril-aggregator/src/runtime/runner.rs b/mithril-aggregator/src/runtime/runner.rs index 53d59aa292a..5f9dc932658 100644 --- a/mithril-aggregator/src/runtime/runner.rs +++ b/mithril-aggregator/src/runtime/runner.rs @@ -326,16 +326,15 @@ impl AggregatorRunnerTrait for AggregatorRunner { let signers = epoch_service.current_signers_with_stake()?; let next_signers = epoch_service.next_signers_with_stake()?; - let protocol_parameters = + let protocol_parameters = epoch_service.next_protocol_parameters().with_context(|| { + format!("no current protocol parameters found for time point {time_point:?}") + })?; + let next_protocol_parameters = epoch_service - .current_protocol_parameters() + .upcoming_protocol_parameters() .with_context(|| { - format!("no current protocol parameters found for time point {time_point:?}") + format!("no next protocol parameters found for time point {time_point:?}") })?; - let next_protocol_parameters = - epoch_service.next_protocol_parameters().with_context(|| { - format!("no next protocol parameters found for time point {time_point:?}") - })?; let pending_certificate = CertificatePending::new( time_point.epoch, From e9e24a315d9bdb7d97d2f7bb6b27dda92907c576 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Mon, 30 Sep 2024 11:32:39 +0200 Subject: [PATCH 096/274] chore: bump crates versions - 'mithril-aggregator' from '0.5.69' to '0.5.70'. --- Cargo.lock | 2 +- mithril-aggregator/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5b684292b20..648e6aff7fa 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3403,7 +3403,7 @@ dependencies = [ [[package]] name = "mithril-aggregator" -version = "0.5.69" +version = "0.5.70" dependencies = [ "anyhow", "async-trait", diff --git a/mithril-aggregator/Cargo.toml b/mithril-aggregator/Cargo.toml index 705cd49504c..400184d7970 100644 --- a/mithril-aggregator/Cargo.toml +++ b/mithril-aggregator/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-aggregator" -version = "0.5.69" +version = "0.5.70" description = "A Mithril Aggregator server" authors = { workspace = true } edition = { workspace = true } From 3bb09aff16b5eb67ddc8765ef785bd1a6fb80e88 Mon Sep 17 00:00:00 2001 From: sfauvel Date: Tue, 24 Sep 2024 15:58:12 +0200 Subject: [PATCH 097/274] Create an `aggregator_epoch_settings` and use it in EpochService --- .../src/entities/aggregator_epoch_settings.rs | 8 ++ mithril-aggregator/src/entities/mod.rs | 3 + .../src/services/epoch_service.rs | 85 ++++++++++++------- 3 files changed, 64 insertions(+), 32 deletions(-) create mode 100644 mithril-aggregator/src/entities/aggregator_epoch_settings.rs diff --git a/mithril-aggregator/src/entities/aggregator_epoch_settings.rs b/mithril-aggregator/src/entities/aggregator_epoch_settings.rs new file mode 100644 index 00000000000..2f1bd02bf0c --- /dev/null +++ b/mithril-aggregator/src/entities/aggregator_epoch_settings.rs @@ -0,0 +1,8 @@ +use mithril_common::entities::ProtocolParameters; + +/// AggregatorEpochSettings represents the settings of an epoch +#[derive(Clone, Debug, PartialEq, Default)] +pub struct AggregatorEpochSettings { + /// Protocol parameters + pub protocol_parameters: ProtocolParameters, +} diff --git a/mithril-aggregator/src/entities/mod.rs b/mithril-aggregator/src/entities/mod.rs index 1638ceab2d4..cfa28a32fed 100644 --- a/mithril-aggregator/src/entities/mod.rs +++ b/mithril-aggregator/src/entities/mod.rs @@ -1,10 +1,13 @@ //! Entities module //! //! This module provide domain entities for the services & state machine. +//! +mod aggregator_epoch_settings; mod open_message; mod signer_registration_message; mod signer_ticker_message; +pub use aggregator_epoch_settings::AggregatorEpochSettings; pub use open_message::OpenMessage; pub use signer_registration_message::{ SignerRegistrationsListItemMessage, SignerRegistrationsMessage, diff --git a/mithril-aggregator/src/services/epoch_service.rs b/mithril-aggregator/src/services/epoch_service.rs index fb5152eb1da..d288d5cbd41 100644 --- a/mithril-aggregator/src/services/epoch_service.rs +++ b/mithril-aggregator/src/services/epoch_service.rs @@ -9,6 +9,7 @@ use mithril_common::entities::{Epoch, ProtocolParameters, Signer, SignerWithStak use mithril_common::protocol::{MultiSigner as ProtocolMultiSigner, SignerBuilder}; use mithril_common::StdResult; +use crate::entities::AggregatorEpochSettings; use crate::{EpochSettingsStorer, VerificationKeyStorer}; /// Errors dedicated to the CertifierService. @@ -85,9 +86,9 @@ pub trait EpochService: Sync + Send { struct EpochData { epoch: Epoch, - protocol_parameters: ProtocolParameters, - next_protocol_parameters: ProtocolParameters, - upcoming_protocol_parameters: ProtocolParameters, + epoch_settings: AggregatorEpochSettings, + next_epoch_settings: AggregatorEpochSettings, + upcoming_epoch_settings: AggregatorEpochSettings, current_signers_with_stake: Vec, next_signers_with_stake: Vec, current_signers: Vec, @@ -140,19 +141,21 @@ impl MithrilEpochService { Ok(signers) } - async fn get_protocol_parameters( + async fn get_epoch_settings( &self, epoch: Epoch, name: &str, - ) -> StdResult { - let parameters = self + ) -> StdResult { + let protocol_parameters = self .epoch_settings_storer .get_protocol_parameters(epoch) .await .with_context(|| format!("Epoch service failed to obtain {name}"))? .ok_or(EpochServiceError::UnavailableData(epoch, name.to_string()))?; - Ok(parameters) + Ok(AggregatorEpochSettings { + protocol_parameters, + }) } async fn insert_future_protocol_parameters(&self, actual_epoch: Epoch) -> StdResult<()> { @@ -200,16 +203,18 @@ impl EpochService for MithrilEpochService { })?; let next_signer_retrieval_epoch = epoch.offset_to_next_signer_retrieval_epoch(); - let current_protocol_parameters = self - .get_protocol_parameters(signer_retrieval_epoch, "current protocol parameters") + let epoch_settings = self + .get_epoch_settings(signer_retrieval_epoch, "current epoch settings") .await?; - let next_protocol_parameters = self - .get_protocol_parameters(next_signer_retrieval_epoch, "next protocol parameters") + + let next_epoch_settings = self + .get_epoch_settings(next_signer_retrieval_epoch, "next epoch settings") .await?; - let upcoming_protocol_parameters = self - .get_protocol_parameters( + + let upcoming_epoch_settings = self + .get_epoch_settings( next_signer_retrieval_epoch.next(), - "upcoming protocol parameters", + "upcoming epoch settings", ) .await?; @@ -224,9 +229,9 @@ impl EpochService for MithrilEpochService { self.epoch_data = Some(EpochData { epoch, - protocol_parameters: current_protocol_parameters, - next_protocol_parameters, - upcoming_protocol_parameters, + epoch_settings, + next_epoch_settings, + upcoming_epoch_settings, current_signers_with_stake, next_signers_with_stake, current_signers, @@ -254,14 +259,16 @@ impl EpochService for MithrilEpochService { "can't precompute epoch data if inform_epoch has not been called first" })?; - let protocol_multi_signer = - SignerBuilder::new(&data.current_signers_with_stake, &data.protocol_parameters) - .with_context(|| "Epoch service failed to build protocol multi signer")? - .build_multi_signer(); + let protocol_multi_signer = SignerBuilder::new( + &data.current_signers_with_stake, + &data.epoch_settings.protocol_parameters, + ) + .with_context(|| "Epoch service failed to build protocol multi signer")? + .build_multi_signer(); let next_protocol_multi_signer = SignerBuilder::new( &data.next_signers_with_stake, - &data.next_protocol_parameters, + &data.next_epoch_settings.protocol_parameters, ) .with_context(|| "Epoch service failed to build next protocol multi signer")? .build_multi_signer(); @@ -282,15 +289,18 @@ impl EpochService for MithrilEpochService { } fn current_protocol_parameters(&self) -> StdResult<&ProtocolParameters> { - Ok(&self.unwrap_data()?.protocol_parameters) + Ok(&self.unwrap_data()?.epoch_settings.protocol_parameters) } fn next_protocol_parameters(&self) -> StdResult<&ProtocolParameters> { - Ok(&self.unwrap_data()?.next_protocol_parameters) + Ok(&self.unwrap_data()?.next_epoch_settings.protocol_parameters) } fn upcoming_protocol_parameters(&self) -> StdResult<&ProtocolParameters> { - Ok(&self.unwrap_data()?.upcoming_protocol_parameters) + Ok(&self + .unwrap_data()? + .upcoming_epoch_settings + .protocol_parameters) } fn current_aggregate_verification_key(&self) -> StdResult<&ProtocolAggregateVerificationKey> { @@ -362,13 +372,21 @@ impl FakeEpochService { let next_signers_with_stake = next_signers_with_stake.to_vec(); let current_signers = Signer::vec_from(current_signers_with_stake.clone()); let next_signers = Signer::vec_from(next_signers_with_stake.clone()); - + let epoch_settings = AggregatorEpochSettings { + protocol_parameters: protocol_parameters.clone(), + }; + let next_epoch_settings = AggregatorEpochSettings { + protocol_parameters: next_protocol_parameters.clone(), + }; + let upcoming_epoch_settings = AggregatorEpochSettings { + protocol_parameters: upcoming_protocol_parameters.clone(), + }; Self { epoch_data: Some(EpochData { epoch, - protocol_parameters: protocol_parameters.clone(), - next_protocol_parameters: next_protocol_parameters.clone(), - upcoming_protocol_parameters: upcoming_protocol_parameters.clone(), + epoch_settings, + next_epoch_settings, + upcoming_epoch_settings, current_signers_with_stake, next_signers_with_stake, current_signers, @@ -469,15 +487,18 @@ impl EpochService for FakeEpochService { } fn current_protocol_parameters(&self) -> StdResult<&ProtocolParameters> { - Ok(&self.unwrap_data()?.protocol_parameters) + Ok(&self.unwrap_data()?.epoch_settings.protocol_parameters) } fn next_protocol_parameters(&self) -> StdResult<&ProtocolParameters> { - Ok(&self.unwrap_data()?.next_protocol_parameters) + Ok(&self.unwrap_data()?.next_epoch_settings.protocol_parameters) } fn upcoming_protocol_parameters(&self) -> StdResult<&ProtocolParameters> { - Ok(&self.unwrap_data()?.upcoming_protocol_parameters) + Ok(&self + .unwrap_data()? + .upcoming_epoch_settings + .protocol_parameters) } fn current_aggregate_verification_key(&self) -> StdResult<&ProtocolAggregateVerificationKey> { From fb2eb95a6d6f2ab91fa98755e3c9cecd733ba62c Mon Sep 17 00:00:00 2001 From: sfauvel Date: Tue, 24 Sep 2024 17:33:00 +0200 Subject: [PATCH 098/274] Replace `save_protocol_parameters` by `save_epoch_settings` --- .../repository/epoch_settings_store.rs | 28 +++--- .../src/dependency_injection/containers.rs | 17 +++- .../src/entities/aggregator_epoch_settings.rs | 16 ++++ .../src/services/epoch_service.rs | 6 +- .../src/store/epoch_settings_storer.rs | 85 ++++++++++++------- 5 files changed, 103 insertions(+), 49 deletions(-) diff --git a/mithril-aggregator/src/database/repository/epoch_settings_store.rs b/mithril-aggregator/src/database/repository/epoch_settings_store.rs index 3f36682dd71..e14df8641d3 100644 --- a/mithril-aggregator/src/database/repository/epoch_settings_store.rs +++ b/mithril-aggregator/src/database/repository/epoch_settings_store.rs @@ -10,6 +10,7 @@ use mithril_persistence::store::adapter::AdapterError; use crate::database::query::{ DeleteEpochSettingsQuery, GetEpochSettingsQuery, UpdateEpochSettingsQuery, }; +use crate::entities::AggregatorEpochSettings; use crate::EpochSettingsStorer; /// Service to deal with epoch settings (read & write). @@ -33,17 +34,18 @@ impl EpochSettingsStore { #[async_trait] impl EpochSettingsStorer for EpochSettingsStore { - async fn save_protocol_parameters( + async fn save_epoch_settings( &self, epoch: Epoch, - protocol_parameters: ProtocolParameters, - ) -> StdResult> { + epoch_settings: AggregatorEpochSettings, + ) -> StdResult> { let epoch_settings_record = self .connection - .fetch_first(UpdateEpochSettingsQuery::one(epoch, protocol_parameters)) - .map_err(|e| { - AdapterError::GeneralError(e.context("persist protocol parameters failure")) - })? + .fetch_first(UpdateEpochSettingsQuery::one( + epoch, + epoch_settings.protocol_parameters, + )) + .map_err(|e| AdapterError::GeneralError(e.context("persist epoch settings failure")))? .unwrap_or_else(|| panic!("No entity returned by the persister, epoch = {epoch:?}")); // Prune useless old epoch settings. @@ -57,7 +59,9 @@ impl EpochSettingsStorer for EpochSettingsStore { .count(); } - Ok(Some(epoch_settings_record.protocol_parameters)) + Ok(Some(AggregatorEpochSettings { + protocol_parameters: epoch_settings_record.protocol_parameters, + })) } async fn get_protocol_parameters(&self, epoch: Epoch) -> StdResult> { @@ -75,8 +79,6 @@ impl EpochSettingsStorer for EpochSettingsStore { #[cfg(test)] mod tests { - use mithril_common::test_utils::fake_data; - use crate::database::test_helper::{insert_epoch_settings, main_db_connection}; use super::*; @@ -93,12 +95,12 @@ mod tests { ); store - .save_protocol_parameters( + .save_epoch_settings( Epoch(2) + EPOCH_SETTINGS_PRUNE_EPOCH_THRESHOLD, - fake_data::protocol_parameters(), + AggregatorEpochSettings::dummy(), ) .await - .expect("saving protocol parameters should not fails"); + .expect("saving epoch settings should not fails"); let epoch1_params = store.get_protocol_parameters(Epoch(1)).await.unwrap(); let epoch2_params = store.get_protocol_parameters(Epoch(2)).await.unwrap(); diff --git a/mithril-aggregator/src/dependency_injection/containers.rs b/mithril-aggregator/src/dependency_injection/containers.rs index 0ac400dfb40..6e6ce2c6cb9 100644 --- a/mithril-aggregator/src/dependency_injection/containers.rs +++ b/mithril-aggregator/src/dependency_injection/containers.rs @@ -24,6 +24,7 @@ use crate::{ CertificateRepository, OpenMessageRepository, SignedEntityStorer, SignerGetter, StakePoolStore, }, + entities::AggregatorEpochSettings, event_store::{EventMessage, TransmitterService}, multi_signer::MultiSigner, services::{ @@ -193,7 +194,12 @@ impl DependencyContainer { pub async fn init_state_from_fixture(&self, fixture: &MithrilFixture, target_epochs: &[Epoch]) { for epoch in target_epochs { self.epoch_settings_storer - .save_protocol_parameters(*epoch, fixture.protocol_parameters()) + .save_epoch_settings( + *epoch, + AggregatorEpochSettings { + protocol_parameters: fixture.protocol_parameters(), + }, + ) .await .expect("save_protocol_parameters should not fail"); self.fill_verification_key_store(*epoch, &fixture.signers_with_stake()) @@ -241,9 +247,14 @@ impl DependencyContainer { epochs_to_save.push(epoch_to_sign.next()); for epoch in epochs_to_save { self.epoch_settings_storer - .save_protocol_parameters(epoch, protocol_parameters.clone()) + .save_epoch_settings( + epoch, + AggregatorEpochSettings { + protocol_parameters: protocol_parameters.clone(), + }, + ) .await - .expect("save_protocol_parameters should not fail"); + .expect("save_epoch_settings should not fail"); } } diff --git a/mithril-aggregator/src/entities/aggregator_epoch_settings.rs b/mithril-aggregator/src/entities/aggregator_epoch_settings.rs index 2f1bd02bf0c..337b07b7c44 100644 --- a/mithril-aggregator/src/entities/aggregator_epoch_settings.rs +++ b/mithril-aggregator/src/entities/aggregator_epoch_settings.rs @@ -6,3 +6,19 @@ pub struct AggregatorEpochSettings { /// Protocol parameters pub protocol_parameters: ProtocolParameters, } + +impl AggregatorEpochSettings { + #[cfg(test)] + /// Create a dummy AggregatorEpochSettings + pub fn dummy() -> AggregatorEpochSettings { + use mithril_common::test_utils::fake_data; + + // Protocol parameters + let protocol_parameters = fake_data::protocol_parameters(); + + // Aggregator Epoch settings + AggregatorEpochSettings { + protocol_parameters, + } + } +} diff --git a/mithril-aggregator/src/services/epoch_service.rs b/mithril-aggregator/src/services/epoch_service.rs index d288d5cbd41..fd60e1f8937 100644 --- a/mithril-aggregator/src/services/epoch_service.rs +++ b/mithril-aggregator/src/services/epoch_service.rs @@ -168,9 +168,11 @@ impl MithrilEpochService { ); self.epoch_settings_storer - .save_protocol_parameters( + .save_epoch_settings( recording_epoch, - self.future_protocol_parameters.clone(), + AggregatorEpochSettings { + protocol_parameters: self.future_protocol_parameters.clone(), + }, ) .await .with_context(|| format!("Epoch service failed to insert future_protocol_parameters to epoch {recording_epoch}")) diff --git a/mithril-aggregator/src/store/epoch_settings_storer.rs b/mithril-aggregator/src/store/epoch_settings_storer.rs index 8c9fba6f234..40bea3bc37c 100644 --- a/mithril-aggregator/src/store/epoch_settings_storer.rs +++ b/mithril-aggregator/src/store/epoch_settings_storer.rs @@ -7,15 +7,17 @@ use tokio::sync::RwLock; use mithril_common::entities::{Epoch, ProtocolParameters}; +use crate::entities::AggregatorEpochSettings; + /// Store and get [protocol parameters][ProtocolParameters] for given epoch. #[async_trait] pub trait EpochSettingsStorer: Sync + Send { - /// Save the given `ProtocolParameter` for the given [Epoch]. - async fn save_protocol_parameters( + /// Save the given `AggregatorEpochSettings` for the given [Epoch]. + async fn save_epoch_settings( &self, epoch: Epoch, - protocol_parameters: ProtocolParameters, - ) -> StdResult>; + epoch_settings: AggregatorEpochSettings, + ) -> StdResult>; /// Get the saved `ProtocolParameter` for the given [Epoch] if any. async fn get_protocol_parameters(&self, epoch: Epoch) -> StdResult>; @@ -24,6 +26,7 @@ pub trait EpochSettingsStorer: Sync + Send { /// In case an aggregator has been launched after some epochs of not being up or at initial startup, /// the discrepancies in the protocol parameters store needs to be fixed. /// The protocol parameters needs to be recorded for the working epoch and the next 2 epochs. + // TODO: Should we pass a AggegatorEpochSettings instead of ProtocolParameters? async fn handle_discrepancies_at_startup( &self, current_epoch: Epoch, @@ -33,8 +36,13 @@ pub trait EpochSettingsStorer: Sync + Send { let epoch = current_epoch + epoch_offset; if self.get_protocol_parameters(epoch).await?.is_none() { debug!("Handle discrepancies at startup of protocol parameters store, will record protocol parameters from the configuration for epoch {epoch}: {configuration_protocol_parameters:?}"); - self.save_protocol_parameters(epoch, configuration_protocol_parameters.clone()) - .await?; + self.save_epoch_settings( + epoch, + AggregatorEpochSettings { + protocol_parameters: configuration_protocol_parameters.clone(), + }, + ) + .await?; } } @@ -43,33 +51,42 @@ pub trait EpochSettingsStorer: Sync + Send { } pub struct FakeEpochSettingsStorer { - pub protocol_parameters: RwLock>, + pub epoch_settings: RwLock>, } impl FakeEpochSettingsStorer { #[cfg(test)] pub fn new(data: Vec<(Epoch, ProtocolParameters)>) -> Self { - let protocol_parameters = RwLock::new(data.into_iter().collect()); - Self { - protocol_parameters, - } + let data_epoch_settings = data.into_iter().map(|(epoch, protocol_parameters)| { + ( + epoch, + AggregatorEpochSettings { + protocol_parameters, + }, + ) + }); + let epoch_settings = RwLock::new(data_epoch_settings.into_iter().collect()); + Self { epoch_settings } } } #[async_trait] impl EpochSettingsStorer for FakeEpochSettingsStorer { - async fn save_protocol_parameters( + async fn save_epoch_settings( &self, epoch: Epoch, - protocol_parameters: ProtocolParameters, - ) -> StdResult> { - let mut protocol_parameters_write = self.protocol_parameters.write().await; - Ok(protocol_parameters_write.insert(epoch, protocol_parameters)) + epoch_settings: AggregatorEpochSettings, + ) -> StdResult> { + let mut epoch_settings_write = self.epoch_settings.write().await; + + Ok(epoch_settings_write.insert(epoch, epoch_settings)) } async fn get_protocol_parameters(&self, epoch: Epoch) -> StdResult> { - let protocol_parameters = self.protocol_parameters.read().await; - Ok(protocol_parameters.get(&epoch).cloned()) + let epoch_settings = self.epoch_settings.read().await; + Ok(epoch_settings + .get(&epoch) + .map(|es| es.protocol_parameters.clone())) } } @@ -81,33 +98,39 @@ mod tests { use super::*; #[tokio::test] - async fn test_save_protocol_parameters_do_not_exist_yet() { - let protocol_parameters = fake_data::protocol_parameters(); + async fn test_save_epoch_settings_do_not_exist_yet() { + let epoch_settings = AggregatorEpochSettings::dummy(); let epoch = Epoch(1); let store = FakeEpochSettingsStorer::new(vec![]); - let protocol_parameters_previous = store - .save_protocol_parameters(epoch, protocol_parameters) + let epoch_settings_previous = store + .save_epoch_settings(epoch, epoch_settings) .await .unwrap(); - assert!(protocol_parameters_previous.is_none()); + assert!(epoch_settings_previous.is_none()); } #[tokio::test] - async fn test_save_protocol_parameters_already_exist() { - let protocol_parameters = fake_data::protocol_parameters(); + async fn test_save_epoch_settings_already_exist() { + let epoch_settings = AggregatorEpochSettings::dummy(); let epoch = Epoch(1); - let store = FakeEpochSettingsStorer::new(vec![(epoch, protocol_parameters.clone())]); + let store = + FakeEpochSettingsStorer::new(vec![(epoch, epoch_settings.protocol_parameters.clone())]); let protocol_parameters_new = ProtocolParameters { - k: protocol_parameters.k + 1, - ..protocol_parameters + k: epoch_settings.protocol_parameters.k + 1, + ..epoch_settings.protocol_parameters }; - let protocol_parameters_previous = store - .save_protocol_parameters(epoch, protocol_parameters_new) + let epoch_settings_previous = store + .save_epoch_settings( + epoch, + AggregatorEpochSettings { + protocol_parameters: protocol_parameters_new.clone(), + }, + ) .await .unwrap(); - assert_eq!(Some(protocol_parameters), protocol_parameters_previous); + assert_eq!(Some(epoch_settings), epoch_settings_previous); } #[tokio::test] From ddd347397090061cc8b26b312ac58ae34da632c3 Mon Sep 17 00:00:00 2001 From: sfauvel Date: Tue, 24 Sep 2024 17:53:15 +0200 Subject: [PATCH 099/274] Create a `get_epoch_settings` in `EpochSettingsStorer` --- .../repository/epoch_settings_store.rs | 22 ++++++++---- .../src/store/epoch_settings_storer.rs | 36 +++++++++++++++++-- 2 files changed, 49 insertions(+), 9 deletions(-) diff --git a/mithril-aggregator/src/database/repository/epoch_settings_store.rs b/mithril-aggregator/src/database/repository/epoch_settings_store.rs index e14df8641d3..7dad5941cf3 100644 --- a/mithril-aggregator/src/database/repository/epoch_settings_store.rs +++ b/mithril-aggregator/src/database/repository/epoch_settings_store.rs @@ -65,13 +65,23 @@ impl EpochSettingsStorer for EpochSettingsStore { } async fn get_protocol_parameters(&self, epoch: Epoch) -> StdResult> { + Ok(self + .get_epoch_settings(epoch) + .await? + .map(|epoch_settings| epoch_settings.protocol_parameters)) + } + + async fn get_epoch_settings(&self, epoch: Epoch) -> StdResult> { let mut cursor = self .connection .fetch(GetEpochSettingsQuery::by_epoch(epoch)?) .map_err(|e| AdapterError::GeneralError(e.context("Could not get epoch settings")))?; if let Some(epoch_settings_record) = cursor.next() { - return Ok(Some(epoch_settings_record.protocol_parameters)); + // TODO create an adapter ? + return Ok(Some(AggregatorEpochSettings { + protocol_parameters: epoch_settings_record.protocol_parameters, + })); } Ok(None) } @@ -84,7 +94,7 @@ mod tests { use super::*; #[tokio::test] - async fn save_protocol_parameters_prune_older_epoch_settings() { + async fn save_epoch_settings_prune_older_epoch_settings() { const EPOCH_SETTINGS_PRUNE_EPOCH_THRESHOLD: u64 = 5; let connection = main_db_connection().unwrap(); @@ -101,16 +111,16 @@ mod tests { ) .await .expect("saving epoch settings should not fails"); - let epoch1_params = store.get_protocol_parameters(Epoch(1)).await.unwrap(); - let epoch2_params = store.get_protocol_parameters(Epoch(2)).await.unwrap(); + let epoch1_params = store.get_epoch_settings(Epoch(1)).await.unwrap(); + let epoch2_params = store.get_epoch_settings(Epoch(2)).await.unwrap(); assert!( epoch1_params.is_none(), - "Protocol parameters at epoch 1 should have been pruned", + "Epoch settings at epoch 1 should have been pruned", ); assert!( epoch2_params.is_some(), - "Protocol parameters at epoch 2 should still exist", + "Epoch settings at epoch 2 should still exist", ); } } diff --git a/mithril-aggregator/src/store/epoch_settings_storer.rs b/mithril-aggregator/src/store/epoch_settings_storer.rs index 40bea3bc37c..8b977eefd69 100644 --- a/mithril-aggregator/src/store/epoch_settings_storer.rs +++ b/mithril-aggregator/src/store/epoch_settings_storer.rs @@ -22,6 +22,9 @@ pub trait EpochSettingsStorer: Sync + Send { /// Get the saved `ProtocolParameter` for the given [Epoch] if any. async fn get_protocol_parameters(&self, epoch: Epoch) -> StdResult>; + /// Get the saved `AggregatorEpochSettings` for the given [Epoch] if any. + async fn get_epoch_settings(&self, epoch: Epoch) -> StdResult>; + /// Handle discrepancies at startup in the protocol parameters store. /// In case an aggregator has been launched after some epochs of not being up or at initial startup, /// the discrepancies in the protocol parameters store needs to be fixed. @@ -83,10 +86,15 @@ impl EpochSettingsStorer for FakeEpochSettingsStorer { } async fn get_protocol_parameters(&self, epoch: Epoch) -> StdResult> { + Ok(self + .get_epoch_settings(epoch) + .await? + .map(|epoch_settings| epoch_settings.protocol_parameters.clone())) + } + + async fn get_epoch_settings(&self, epoch: Epoch) -> StdResult> { let epoch_settings = self.epoch_settings.read().await; - Ok(epoch_settings - .get(&epoch) - .map(|es| es.protocol_parameters.clone())) + Ok(epoch_settings.get(&epoch).cloned()) } } @@ -153,6 +161,28 @@ mod tests { assert!(protocol_parameters_stored.is_none()); } + #[tokio::test] + async fn test_get_epoch_settings_exist() { + let epoch_settings = AggregatorEpochSettings::dummy(); + let epoch = Epoch(1); + let store = + FakeEpochSettingsStorer::new(vec![(epoch, epoch_settings.protocol_parameters.clone())]); + let epoch_settings_stored = store.get_epoch_settings(epoch).await.unwrap(); + + assert_eq!(Some(epoch_settings), epoch_settings_stored); + } + + #[tokio::test] + async fn test_get_epoch_settings_do_not_exist() { + let epoch_settings = AggregatorEpochSettings::dummy(); + let epoch = Epoch(1); + let store = + FakeEpochSettingsStorer::new(vec![(epoch, epoch_settings.protocol_parameters.clone())]); + let epoch_settings_stored = store.get_epoch_settings(epoch + 1).await.unwrap(); + + assert!(epoch_settings_stored.is_none()); + } + #[tokio::test] async fn test_handle_discrepancies_at_startup_should_complete_at_least_two_epochs() { let protocol_parameters = fake_data::protocol_parameters(); From fb49ff2012f610e095636f0c7a0b0499cd7932b8 Mon Sep 17 00:00:00 2001 From: Damien Lachaume <135982616+dlachaume@users.noreply.github.com> Date: Fri, 20 Sep 2024 17:01:07 +0200 Subject: [PATCH 100/274] feat: add migration to add new column `cardano_transactions_signing_config` to `epoch_setting` table --- mithril-aggregator/src/database/migration.rs | 27 ++++++++++++ .../epoch_settings/get_epoch_settings.rs | 23 ++++++++-- .../epoch_settings/update_epoch_settings.rs | 29 ++++++++++-- .../src/database/record/epoch_settings.rs | 21 ++++++++- .../repository/epoch_settings_store.rs | 33 +++++++++++++- .../src/database/test_helper.rs | 44 +++++++++++++++---- .../src/entities/signed_entity_config.rs | 8 ++++ 7 files changed, 168 insertions(+), 17 deletions(-) diff --git a/mithril-aggregator/src/database/migration.rs b/mithril-aggregator/src/database/migration.rs index 5608437f718..ebeee03cb2b 100644 --- a/mithril-aggregator/src/database/migration.rs +++ b/mithril-aggregator/src/database/migration.rs @@ -777,5 +777,32 @@ create index buffered_single_signature_signed_entity_type_id on buffered_single_ create index buffered_single_signature_party_id_index on buffered_single_signature(party_id); "#, ), + // Migration 28 + // Add new column `cardano_transactions_signing_config` to `epoch_setting` table` + SqlMigration::new( + 28, + r#" +-- disable foreign keys since we will delete tables linked using them +pragma foreign_keys=false; + +create table new_epoch_setting ( + epoch_setting_id integer not null, + protocol_parameters json not null, + cardano_transactions_signing_config json not null, + primary key (epoch_setting_id) +); + +insert into new_epoch_setting (epoch_setting_id, protocol_parameters, cardano_transactions_signing_config) + select epoch_setting_id, protocol_parameters, json('{}') + from epoch_setting order by rowid asc; + +drop table epoch_setting; +alter table new_epoch_setting rename to epoch_setting; + +-- reenable foreign keys +pragma foreign_key_check; +pragma foreign_keys=true; + "#, + ), ] } diff --git a/mithril-aggregator/src/database/query/epoch_settings/get_epoch_settings.rs b/mithril-aggregator/src/database/query/epoch_settings/get_epoch_settings.rs index b9dc46ab888..ef9fd8c19b1 100644 --- a/mithril-aggregator/src/database/query/epoch_settings/get_epoch_settings.rs +++ b/mithril-aggregator/src/database/query/epoch_settings/get_epoch_settings.rs @@ -1,8 +1,8 @@ use anyhow::Context; -use sqlite::Value; - -use mithril_common::{entities::Epoch, StdResult}; +use mithril_common::entities::{CardanoTransactionsSigningConfig, Epoch}; +use mithril_common::StdResult; use mithril_persistence::sqlite::{Query, SourceAlias, SqLiteEntity, WhereCondition}; +use sqlite::Value; use crate::database::record::EpochSettingsRecord; @@ -42,7 +42,10 @@ impl Query for GetEpochSettingsQuery { #[cfg(test)] mod tests { - use mithril_common::entities::ProtocolParameters; + use mithril_common::{ + entities::{BlockNumber, ProtocolParameters}, + signable_builder::CardanoTransactionsSignableBuilder, + }; use mithril_persistence::sqlite::ConnectionExtensions; use crate::database::test_helper::{insert_epoch_settings, main_db_connection}; @@ -64,6 +67,11 @@ mod tests { epoch_settings_record.protocol_parameters ); + assert_eq!( + CardanoTransactionsSigningConfig::new(BlockNumber(10), BlockNumber(15)), + epoch_settings_record.cardano_transactions_signing_config + ); + let epoch_settings_record = connection .fetch_first(GetEpochSettingsQuery::by_epoch(Epoch(3)).unwrap()) .unwrap() @@ -73,6 +81,13 @@ mod tests { ProtocolParameters::new(3, 4, 1.0), epoch_settings_record.protocol_parameters ); + assert_eq!( + CardanoTransactionsSigningConfig { + security_parameter: BlockNumber(30), + step: BlockNumber(15), + }, + epoch_settings_record.cardano_transactions_signing_config + ); let cursor = connection .fetch(GetEpochSettingsQuery::by_epoch(Epoch(5)).unwrap()) diff --git a/mithril-aggregator/src/database/query/epoch_settings/update_epoch_settings.rs b/mithril-aggregator/src/database/query/epoch_settings/update_epoch_settings.rs index 427da07cc75..72bcd92760c 100644 --- a/mithril-aggregator/src/database/query/epoch_settings/update_epoch_settings.rs +++ b/mithril-aggregator/src/database/query/epoch_settings/update_epoch_settings.rs @@ -1,6 +1,6 @@ use sqlite::Value; -use mithril_common::entities::{Epoch, ProtocolParameters}; +use mithril_common::entities::{CardanoTransactionsSigningConfig, Epoch, ProtocolParameters}; use mithril_persistence::sqlite::{Query, SourceAlias, SqLiteEntity, WhereCondition}; use crate::database::record::EpochSettingsRecord; @@ -11,15 +11,22 @@ pub struct UpdateEpochSettingsQuery { } impl UpdateEpochSettingsQuery { - pub fn one(epoch: Epoch, protocol_parameters: ProtocolParameters) -> Self { + pub fn one( + epoch: Epoch, + protocol_parameters: ProtocolParameters, + cardano_transactions_signing_config: CardanoTransactionsSigningConfig, + ) -> Self { let epoch_settings_id: i64 = epoch.try_into().unwrap(); Self { condition: WhereCondition::new( - "(epoch_setting_id, protocol_parameters) values (?1, ?2)", + "(epoch_setting_id, protocol_parameters, cardano_transactions_signing_config) values (?1, ?2, ?3)", vec![ Value::Integer(epoch_settings_id), Value::String(serde_json::to_string(&protocol_parameters).unwrap()), + Value::String( + serde_json::to_string(&cardano_transactions_signing_config).unwrap(), + ), ], ), } @@ -45,6 +52,7 @@ impl Query for UpdateEpochSettingsQuery { #[cfg(test)] mod tests { + use mithril_common::entities::{BlockNumber, CardanoTransactionsSigningConfig}; use mithril_common::test_utils::fake_data; use mithril_persistence::sqlite::ConnectionExtensions; @@ -62,6 +70,7 @@ mod tests { .fetch_first(UpdateEpochSettingsQuery::one( Epoch(3), fake_data::protocol_parameters(), + CardanoTransactionsSigningConfig::new(BlockNumber(24), BlockNumber(62)), )) .unwrap() .unwrap(); @@ -71,6 +80,13 @@ mod tests { fake_data::protocol_parameters(), epoch_settings_record.protocol_parameters ); + assert_eq!( + CardanoTransactionsSigningConfig { + security_parameter: BlockNumber(24), + step: BlockNumber(62), + }, + epoch_settings_record.cardano_transactions_signing_config + ); let mut cursor = connection .fetch(GetEpochSettingsQuery::by_epoch(Epoch(3)).unwrap()) @@ -84,6 +100,13 @@ mod tests { fake_data::protocol_parameters(), epoch_settings_record.protocol_parameters ); + assert_eq!( + CardanoTransactionsSigningConfig { + security_parameter: BlockNumber(24), + step: BlockNumber(62), + }, + epoch_settings_record.cardano_transactions_signing_config + ); assert_eq!(0, cursor.count()); } } diff --git a/mithril-aggregator/src/database/record/epoch_settings.rs b/mithril-aggregator/src/database/record/epoch_settings.rs index a6098792588..69860c964cc 100644 --- a/mithril-aggregator/src/database/record/epoch_settings.rs +++ b/mithril-aggregator/src/database/record/epoch_settings.rs @@ -1,4 +1,6 @@ -use mithril_common::entities::{Epoch, ProtocolParameters}; +use mithril_common::entities::{ + BlockNumber, CardanoTransactionsSigningConfig, Epoch, ProtocolParameters, +}; use mithril_persistence::sqlite::{HydrationError, Projection, SqLiteEntity}; /// Settings for an epoch, including the protocol parameters. @@ -9,6 +11,9 @@ pub struct EpochSettingsRecord { /// Protocol parameters. pub protocol_parameters: ProtocolParameters, + + /// Cardano transactions signing configuration. + pub cardano_transactions_signing_config: CardanoTransactionsSigningConfig, } impl SqLiteEntity for EpochSettingsRecord { @@ -18,6 +23,7 @@ impl SqLiteEntity for EpochSettingsRecord { { let epoch_settings_id_int = row.read::(0); let protocol_parameters_string = &row.read::<&str, _>(1); + let cardano_transactions_signing_config_string = &row.read::<&str, _>(2); let epoch_settings_record = Self { epoch_settings_id: Epoch(epoch_settings_id_int.try_into().map_err(|e| { @@ -32,6 +38,14 @@ impl SqLiteEntity for EpochSettingsRecord { )) }, )?, + cardano_transactions_signing_config: serde_json::from_str(cardano_transactions_signing_config_string).map_err( + |e| { + HydrationError::InvalidData(format!( + "Could not turn string '{cardano_transactions_signing_config_string}' to CardanoTransactionsSigningConfig. Error: {e}" + )) + }, + )?, + }; Ok(epoch_settings_record) @@ -49,6 +63,11 @@ impl SqLiteEntity for EpochSettingsRecord { "{:epoch_setting:}.protocol_parameters", "text", ); + projection.add_field( + "cardano_transactions_signing_config", + "{:epoch_setting:}.cardano_transactions_signing_config", + "text", + ); projection } diff --git a/mithril-aggregator/src/database/repository/epoch_settings_store.rs b/mithril-aggregator/src/database/repository/epoch_settings_store.rs index 7dad5941cf3..21f0d4bcaa8 100644 --- a/mithril-aggregator/src/database/repository/epoch_settings_store.rs +++ b/mithril-aggregator/src/database/repository/epoch_settings_store.rs @@ -2,7 +2,9 @@ use std::sync::Arc; use async_trait::async_trait; -use mithril_common::entities::{Epoch, ProtocolParameters}; +use mithril_common::entities::{ + BlockNumber, CardanoTransactionsSigningConfig, Epoch, ProtocolParameters, +}; use mithril_common::StdResult; use mithril_persistence::sqlite::{ConnectionExtensions, SqliteConnection}; use mithril_persistence::store::adapter::AdapterError; @@ -44,6 +46,11 @@ impl EpochSettingsStorer for EpochSettingsStore { .fetch_first(UpdateEpochSettingsQuery::one( epoch, epoch_settings.protocol_parameters, + // TODO retrieve from the AggregatorEpochSettings + CardanoTransactionsSigningConfig { + security_parameter: BlockNumber(0), + step: BlockNumber(0), + }, )) .map_err(|e| AdapterError::GeneralError(e.context("persist epoch settings failure")))? .unwrap_or_else(|| panic!("No entity returned by the persister, epoch = {epoch:?}")); @@ -123,4 +130,28 @@ mod tests { "Epoch settings at epoch 2 should still exist", ); } + + #[tokio::test] + async fn save_epoch_settings_stores_in_database() { + let connection = main_db_connection().unwrap(); + + let store = EpochSettingsStore::new(Arc::new(connection), None); + + store + .save_epoch_settings(Epoch(2), AggregatorEpochSettings::dummy()) + .await + .expect("saving epoch settings should not fails"); + { + let epoch_settings = store.get_epoch_settings(Epoch(1)).await.unwrap(); + assert_eq!(None, epoch_settings); + } + { + let epoch_settings = store.get_epoch_settings(Epoch(2)).await.unwrap().unwrap(); + assert_eq!(AggregatorEpochSettings::dummy(), epoch_settings); + } + { + let epoch_settings = store.get_epoch_settings(Epoch(3)).await.unwrap(); + assert_eq!(None, epoch_settings); + } + } } diff --git a/mithril-aggregator/src/database/test_helper.rs b/mithril-aggregator/src/database/test_helper.rs index 2a23491f1f3..90599e78489 100644 --- a/mithril-aggregator/src/database/test_helper.rs +++ b/mithril-aggregator/src/database/test_helper.rs @@ -1,9 +1,12 @@ use chrono::Utc; +use mithril_persistence::store::adapter::AdapterError; use sqlite::{ConnectionThreadSafe, Value}; use std::path::Path; use uuid::Uuid; -use mithril_common::entities::{ProtocolParameters, SignerWithStake}; +use mithril_common::entities::{ + BlockNumber, CardanoTransactionsSigningConfig, ProtocolParameters, SignerWithStake, +}; use mithril_common::{entities::Epoch, test_utils::fake_keys, StdError, StdResult}; use mithril_persistence::sqlite::{ ConnectionBuilder, ConnectionExtensions, ConnectionOptions, Query, SqliteConnection, @@ -195,20 +198,44 @@ pub fn insert_epoch_settings( connection: &SqliteConnection, epoch_to_insert_settings: &[u64], ) -> StdResult<()> { + // for (epoch, protocol_parameters) in epoch_to_insert_settings.iter().map(|epoch| { + // ( + // Epoch(*epoch), + // ProtocolParameters::new(*epoch, epoch + 1, 1.0), + // ) + // }) { + // connection.fetch_first(UpdateEpochSettingsQuery::one(epoch, protocol_parameters))? + // } + + // for epoch in epoch_to_insert_settings { + // connection.fetch_first(UpdateEpochSettingsQuery::one( + // Epoch(*epoch), + // ProtocolParameters::new(*epoch, epoch + 1, 1.0), + // ))? + // } + let query = { // leverage the expanded parameter from this query which is unit // tested on its own above. - let (sql_values, _) = - UpdateEpochSettingsQuery::one(Epoch(1), ProtocolParameters::new(1, 2, 1.0)) - .filters() - .expand(); + let (sql_values, _) = UpdateEpochSettingsQuery::one( + Epoch(1), + ProtocolParameters::new(1, 2, 1.0), + CardanoTransactionsSigningConfig::new(BlockNumber(0), BlockNumber(0)), + ) + .filters() + .expand(); format!("insert into epoch_setting {sql_values}") }; - for (epoch, protocol_parameters) in epoch_to_insert_settings - .iter() - .map(|epoch| (epoch, ProtocolParameters::new(*epoch, epoch + 1, 1.0))) + for (epoch, protocol_parameters, signing_config) in + epoch_to_insert_settings.iter().map(|epoch| { + ( + epoch, + ProtocolParameters::new(*epoch, epoch + 1, 1.0), + CardanoTransactionsSigningConfig::new(BlockNumber(epoch * 10), BlockNumber(15)), + ) + }) { let mut statement = connection.prepare(&query)?; statement @@ -218,6 +245,7 @@ pub fn insert_epoch_settings( 2, serde_json::to_string(&protocol_parameters).unwrap().into(), ), + (3, serde_json::to_string(&signing_config).unwrap().into()), ]) .unwrap(); diff --git a/mithril-common/src/entities/signed_entity_config.rs b/mithril-common/src/entities/signed_entity_config.rs index f858048e78b..635eeafd461 100644 --- a/mithril-common/src/entities/signed_entity_config.rs +++ b/mithril-common/src/entities/signed_entity_config.rs @@ -117,6 +117,14 @@ pub struct CardanoTransactionsSigningConfig { impl CardanoTransactionsSigningConfig { cfg_test_tools! { + /// Create a new CardanoTransactionsSigningConfig + pub fn new(security_parameter: BlockNumber, step: BlockNumber) -> Self { + Self { + security_parameter, + step, + } + } + /// Create a dummy config pub fn dummy() -> Self { Self { From f6197ffe75ea549327ccbe4627bb423f26e747dd Mon Sep 17 00:00:00 2001 From: sfauvel Date: Wed, 25 Sep 2024 16:04:29 +0200 Subject: [PATCH 101/274] Create `EpochService` with an `AggregatorEpochSettings` instead of a `ProtocolParameters` --- .../src/dependency_injection/builder.rs | 11 +++- mithril-aggregator/src/runtime/runner.rs | 29 ++++---- .../src/runtime/state_machine.rs | 6 +- .../src/services/epoch_service.rs | 66 ++++++++++--------- mithril-common/src/entities/epoch.rs | 10 +-- 5 files changed, 68 insertions(+), 54 deletions(-) diff --git a/mithril-aggregator/src/dependency_injection/builder.rs b/mithril-aggregator/src/dependency_injection/builder.rs index 22ef5a53111..cccc34cca76 100644 --- a/mithril-aggregator/src/dependency_injection/builder.rs +++ b/mithril-aggregator/src/dependency_injection/builder.rs @@ -64,6 +64,7 @@ use crate::{ OpenMessageRepository, SignedEntityStore, SignedEntityStorer, SignerRegistrationStore, SignerStore, SingleSignatureRepository, StakePoolStore, }, + entities::AggregatorEpochSettings, event_store::{EventMessage, EventStore, TransmitterService}, http_server::routes::router, services::{ @@ -1206,8 +1207,16 @@ impl DependenciesBuilder { let verification_key_store = self.get_verification_key_store().await?; let epoch_settings_storer = self.get_epoch_settings_storer().await?; + let epoch_settings = AggregatorEpochSettings { + protocol_parameters: self.configuration.protocol_parameters.clone(), + // TODO : complete the final structure + // cardano_transactions_signing_config: self + // .get_signed_entity_config()? + // .cardano_transactions_signing_config, + }; + let epoch_service = Arc::new(RwLock::new(MithrilEpochService::new( - self.configuration.protocol_parameters.clone(), + epoch_settings, epoch_settings_storer, verification_key_store, ))); diff --git a/mithril-aggregator/src/runtime/runner.rs b/mithril-aggregator/src/runtime/runner.rs index 5f9dc932658..706b0d07106 100644 --- a/mithril-aggregator/src/runtime/runner.rs +++ b/mithril-aggregator/src/runtime/runner.rs @@ -68,8 +68,8 @@ pub trait AggregatorRunnerTrait: Sync + Send { /// Close the signer registration round of an epoch. async fn close_signer_registration_round(&self) -> StdResult<()>; - /// Ask the EpochService to update the protocol parameters. - async fn update_protocol_parameters(&self) -> StdResult<()>; + /// Ask the EpochService to update the epoch settings. + async fn update_epoch_settings(&self) -> StdResult<()>; /// Compute the protocol message async fn compute_protocol_message( @@ -270,12 +270,12 @@ impl AggregatorRunnerTrait for AggregatorRunner { .await } - async fn update_protocol_parameters(&self) -> StdResult<()> { + async fn update_epoch_settings(&self) -> StdResult<()> { self.dependencies .epoch_service .write() .await - .update_protocol_parameters() + .update_epoch_settings() .await } @@ -490,6 +490,7 @@ impl AggregatorRunnerTrait for AggregatorRunner { #[cfg(test)] pub mod tests { + use crate::entities::AggregatorEpochSettings; use crate::services::{FakeEpochService, MockUpkeepService}; use crate::{ entities::OpenMessage, @@ -921,7 +922,7 @@ pub mod tests { } #[tokio::test] - async fn test_update_protocol_parameters() { + async fn test_update_epoch_settings() { let mut mock_certifier_service = MockCertifierService::new(); mock_certifier_service .expect_inform_epoch() @@ -931,24 +932,26 @@ pub mod tests { let mut deps = initialize_dependencies().await; deps.certifier_service = Arc::new(mock_certifier_service); let epoch_settings_storer = deps.epoch_settings_storer.clone(); - let expected_protocol_parameters = deps.config.protocol_parameters.clone(); + let expected_epoch_settings = AggregatorEpochSettings { + protocol_parameters: deps.config.protocol_parameters.clone(), + }; let current_epoch = deps.ticker_service.get_current_epoch().await.unwrap(); - let insert_epoch = current_epoch.offset_to_protocol_parameters_recording_epoch(); + let insert_epoch = current_epoch.offset_to_epoch_settings_recording_epoch(); let runner = build_runner_with_fixture_data(deps).await; runner.inform_new_epoch(current_epoch).await.unwrap(); runner - .update_protocol_parameters() + .update_epoch_settings() .await - .expect("update_protocol_parameters should not fail"); + .expect("update_epoch_settings should not fail"); - let saved_protocol_parameters = epoch_settings_storer - .get_protocol_parameters(insert_epoch) + let saved_epoch_settings = epoch_settings_storer + .get_epoch_settings(insert_epoch) .await .unwrap() - .unwrap_or_else(|| panic!("should have protocol parameters for epoch {insert_epoch}",)); + .unwrap_or_else(|| panic!("should have epoch settings for epoch {insert_epoch}",)); - assert_eq!(expected_protocol_parameters, saved_protocol_parameters); + assert_eq!(expected_epoch_settings, saved_epoch_settings); } #[tokio::test] diff --git a/mithril-aggregator/src/runtime/state_machine.rs b/mithril-aggregator/src/runtime/state_machine.rs index aa59ab076e0..8da6cf40b09 100644 --- a/mithril-aggregator/src/runtime/state_machine.rs +++ b/mithril-aggregator/src/runtime/state_machine.rs @@ -294,7 +294,7 @@ impl AggregatorRuntime { self.runner .open_signer_registration_round(&new_time_point) .await?; - self.runner.update_protocol_parameters().await?; + self.runner.update_epoch_settings().await?; self.runner.precompute_epoch_data().await?; } @@ -463,7 +463,7 @@ mod tests { .once() .returning(|_| Ok(())); runner - .expect_update_protocol_parameters() + .expect_update_epoch_settings() .once() .returning(|| Ok(())); runner @@ -520,7 +520,7 @@ mod tests { .once() .returning(|_| Ok(())); runner - .expect_update_protocol_parameters() + .expect_update_epoch_settings() .once() .returning(|| Ok(())); runner diff --git a/mithril-aggregator/src/services/epoch_service.rs b/mithril-aggregator/src/services/epoch_service.rs index fd60e1f8937..7a1c1b6224d 100644 --- a/mithril-aggregator/src/services/epoch_service.rs +++ b/mithril-aggregator/src/services/epoch_service.rs @@ -37,10 +37,10 @@ pub trait EpochService: Sync + Send { /// internal state for the new epoch. async fn inform_epoch(&mut self, epoch: Epoch) -> StdResult<()>; - /// Insert future protocol parameters in the store based on this service current epoch. + /// Insert future epoch settings in the store based on this service current epoch. /// /// Note: must be called after `inform_epoch`. - async fn update_protocol_parameters(&mut self) -> StdResult<()>; + async fn update_epoch_settings(&mut self) -> StdResult<()>; /// Inform the service that it can precompute data for its current epoch. /// @@ -104,8 +104,8 @@ struct ComputedEpochData { /// Implementation of the [epoch service][EpochService]. pub struct MithrilEpochService { - /// Protocol parameters that will be inserted when inform_epoch is called - future_protocol_parameters: ProtocolParameters, + /// Epoch settings that will be inserted when inform_epoch is called + future_epoch_settings: AggregatorEpochSettings, epoch_data: Option, computed_epoch_data: Option, epoch_settings_storer: Arc, @@ -115,12 +115,12 @@ pub struct MithrilEpochService { impl MithrilEpochService { /// Create a new service instance pub fn new( - future_protocol_parameters: ProtocolParameters, + future_epoch_settings: AggregatorEpochSettings, epoch_settings_storer: Arc, verification_key_store: Arc, ) -> Self { Self { - future_protocol_parameters, + future_epoch_settings, epoch_data: None, computed_epoch_data: None, epoch_settings_storer, @@ -158,24 +158,22 @@ impl MithrilEpochService { }) } - async fn insert_future_protocol_parameters(&self, actual_epoch: Epoch) -> StdResult<()> { - let recording_epoch = actual_epoch.offset_to_protocol_parameters_recording_epoch(); + async fn insert_future_epoch_settings(&self, actual_epoch: Epoch) -> StdResult<()> { + let recording_epoch = actual_epoch.offset_to_epoch_settings_recording_epoch(); debug!( - "EpochService: inserting protocol parameters in epoch {}", + "EpochService: inserting epoch settings in epoch {}", recording_epoch; - "protocol_parameters" => ?self.future_protocol_parameters + "epoch_settings" => ?self.future_epoch_settings ); self.epoch_settings_storer .save_epoch_settings( recording_epoch, - AggregatorEpochSettings { - protocol_parameters: self.future_protocol_parameters.clone(), - }, + self.future_epoch_settings.clone(), ) .await - .with_context(|| format!("Epoch service failed to insert future_protocol_parameters to epoch {recording_epoch}")) + .with_context(|| format!("Epoch service failed to insert future_epoch_settings to epoch {recording_epoch}")) .map(|_| ()) } @@ -244,14 +242,14 @@ impl EpochService for MithrilEpochService { Ok(()) } - async fn update_protocol_parameters(&mut self) -> StdResult<()> { - debug!("EpochService::update_protocol_parameters"); + async fn update_epoch_settings(&mut self) -> StdResult<()> { + debug!("EpochService::update_epoch_settings"); let data = self.unwrap_data().with_context(|| { - "can't update protocol parameters if inform_epoch has not been called first" + "can't update epoch settings if inform_epoch has not been called first" })?; - self.insert_future_protocol_parameters(data.epoch).await + self.insert_future_epoch_settings(data.epoch).await } async fn precompute_epoch_data(&mut self) -> StdResult<()> { @@ -343,7 +341,7 @@ pub struct FakeEpochService { epoch_data: Option, computed_epoch_data: Option, inform_epoch_error: bool, - update_protocol_parameters_error: bool, + update_epoch_settings_error: bool, precompute_epoch_data_error: bool, } @@ -403,7 +401,7 @@ impl FakeEpochService { next_protocol_multi_signer, }), inform_epoch_error: false, - update_protocol_parameters_error: false, + update_epoch_settings_error: false, precompute_epoch_data_error: false, } } @@ -429,7 +427,7 @@ impl FakeEpochService { epoch_data: None, computed_epoch_data: None, inform_epoch_error: false, - update_protocol_parameters_error: false, + update_epoch_settings_error: false, precompute_epoch_data_error: false, } } @@ -441,7 +439,7 @@ impl FakeEpochService { precompute_epoch: bool, ) { self.inform_epoch_error = inform_epoch; - self.update_protocol_parameters_error = update_protocol_parameters; + self.update_epoch_settings_error = update_protocol_parameters; self.precompute_epoch_data_error = precompute_epoch; } @@ -470,9 +468,9 @@ impl EpochService for FakeEpochService { Ok(()) } - async fn update_protocol_parameters(&mut self) -> StdResult<()> { - if self.update_protocol_parameters_error { - anyhow::bail!("update_protocol_parameters fake error"); + async fn update_epoch_settings(&mut self) -> StdResult<()> { + if self.update_epoch_settings_error { + anyhow::bail!("update_epoch_settings fake error"); } Ok(()) } @@ -669,7 +667,9 @@ mod tests { )); MithrilEpochService::new( - future_protocol_parameters, + AggregatorEpochSettings { + protocol_parameters: future_protocol_parameters, + }, Arc::new(epoch_settings_storer), Arc::new(vkey_store), ) @@ -796,8 +796,9 @@ mod tests { } #[tokio::test] - async fn update_protocol_parameters_insert_future_protocol_parameters_in_the_store() { + async fn update_epoch_settings_insert_future_epoch_settings_in_the_store() { let fixture = MithrilFixtureBuilder::default().with_signers(3).build(); + // TODO use epoch_settings let future_protocol_parameters = ProtocolParameters::new(6, 89, 0.124); let epoch = Epoch(4); let mut service = build_service( @@ -814,18 +815,19 @@ mod tests { .await .expect("inform_epoch should not fail"); service - .update_protocol_parameters() + .update_epoch_settings() .await - .expect("update_protocol_parameters should not fail"); + .expect("update_epoch_settings should not fail"); + // TODO use epoch_settings let inserted_protocol_parameters = service .epoch_settings_storer - .get_protocol_parameters(epoch.offset_to_protocol_parameters_recording_epoch()) + .get_protocol_parameters(epoch.offset_to_epoch_settings_recording_epoch()) .await .unwrap_or_else(|_| { panic!( - "protocol parameters should have been inserted for epoch {}", - epoch.offset_to_protocol_parameters_recording_epoch() + "epoch settings should have been inserted for epoch {}", + epoch.offset_to_epoch_settings_recording_epoch() ) }); diff --git a/mithril-common/src/entities/epoch.rs b/mithril-common/src/entities/epoch.rs index fa025b4400a..5e99e99ff42 100644 --- a/mithril-common/src/entities/epoch.rs +++ b/mithril-common/src/entities/epoch.rs @@ -27,8 +27,8 @@ impl Epoch { /// The epoch offset used for signers stake distribution and verification keys recording. pub const SIGNER_RECORDING_OFFSET: u64 = 1; - /// The epoch offset used for aggregator protocol parameters recording. - pub const PROTOCOL_PARAMETERS_RECORDING_OFFSET: u64 = 2; + /// The epoch offset used for aggregator epoch settings recording. + pub const EPOCH_SETTINGS_RECORDING_OFFSET: u64 = 2; /// The epoch offset used to retrieve, given the epoch at which a signer registered, the epoch /// at which the signer can send single signatures. @@ -64,9 +64,9 @@ impl Epoch { *self + Self::SIGNER_RECORDING_OFFSET } - /// Apply the [protocol parameters recording offset][Self::PROTOCOL_PARAMETERS_RECORDING_OFFSET] to this epoch - pub fn offset_to_protocol_parameters_recording_epoch(&self) -> Self { - *self + Self::PROTOCOL_PARAMETERS_RECORDING_OFFSET + /// Apply the [epoch settings recording offset][Self::EPOCH_SETTINGS_RECORDING_OFFSET] to this epoch + pub fn offset_to_epoch_settings_recording_epoch(&self) -> Self { + *self + Self::EPOCH_SETTINGS_RECORDING_OFFSET } /// Apply the [signer signing offset][Self::SIGNER_SIGNING_OFFSET] to this epoch From cfb430e54f01cb2e3f519a601bba138685b3c26f Mon Sep 17 00:00:00 2001 From: sfauvel Date: Wed, 25 Sep 2024 16:34:06 +0200 Subject: [PATCH 102/274] Build `FakeEpochSettingsStorer` with `AggregatorEpochSettings` instead of `ProtocolParameters` --- .../src/services/epoch_service.rs | 12 +++-- .../src/store/epoch_settings_storer.rs | 48 ++++--------------- 2 files changed, 19 insertions(+), 41 deletions(-) diff --git a/mithril-aggregator/src/services/epoch_service.rs b/mithril-aggregator/src/services/epoch_service.rs index 7a1c1b6224d..8e7c5e76f05 100644 --- a/mithril-aggregator/src/services/epoch_service.rs +++ b/mithril-aggregator/src/services/epoch_service.rs @@ -641,15 +641,21 @@ mod tests { let epoch_settings_storer = FakeEpochSettingsStorer::new(vec![ ( signer_retrieval_epoch, - current_epoch_fixture.protocol_parameters(), + AggregatorEpochSettings { + protocol_parameters: current_epoch_fixture.protocol_parameters(), + }, ), ( next_signer_retrieval_epoch, - next_epoch_fixture.protocol_parameters(), + AggregatorEpochSettings { + protocol_parameters: next_epoch_fixture.protocol_parameters(), + }, ), ( next_signer_retrieval_epoch.next(), - upcoming_protocol_parameters.clone(), + AggregatorEpochSettings { + protocol_parameters: upcoming_protocol_parameters.clone(), + }, ), ]); let vkey_store = VerificationKeyStore::new(Box::new( diff --git a/mithril-aggregator/src/store/epoch_settings_storer.rs b/mithril-aggregator/src/store/epoch_settings_storer.rs index 8b977eefd69..6d653e0ec43 100644 --- a/mithril-aggregator/src/store/epoch_settings_storer.rs +++ b/mithril-aggregator/src/store/epoch_settings_storer.rs @@ -59,16 +59,8 @@ pub struct FakeEpochSettingsStorer { impl FakeEpochSettingsStorer { #[cfg(test)] - pub fn new(data: Vec<(Epoch, ProtocolParameters)>) -> Self { - let data_epoch_settings = data.into_iter().map(|(epoch, protocol_parameters)| { - ( - epoch, - AggregatorEpochSettings { - protocol_parameters, - }, - ) - }); - let epoch_settings = RwLock::new(data_epoch_settings.into_iter().collect()); + pub fn new(data: Vec<(Epoch, AggregatorEpochSettings)>) -> Self { + let epoch_settings = RwLock::new(data.into_iter().collect()); Self { epoch_settings } } } @@ -122,8 +114,7 @@ mod tests { async fn test_save_epoch_settings_already_exist() { let epoch_settings = AggregatorEpochSettings::dummy(); let epoch = Epoch(1); - let store = - FakeEpochSettingsStorer::new(vec![(epoch, epoch_settings.protocol_parameters.clone())]); + let store = FakeEpochSettingsStorer::new(vec![(epoch, epoch_settings.clone())]); let protocol_parameters_new = ProtocolParameters { k: epoch_settings.protocol_parameters.k + 1, ..epoch_settings.protocol_parameters @@ -141,32 +132,11 @@ mod tests { assert_eq!(Some(epoch_settings), epoch_settings_previous); } - #[tokio::test] - async fn test_get_protocol_parameters_exist() { - let protocol_parameters = fake_data::protocol_parameters(); - let epoch = Epoch(1); - let store = FakeEpochSettingsStorer::new(vec![(epoch, protocol_parameters.clone())]); - let protocol_parameters_stored = store.get_protocol_parameters(epoch).await.unwrap(); - - assert_eq!(Some(protocol_parameters), protocol_parameters_stored); - } - - #[tokio::test] - async fn test_get_protocol_parameters_do_not_exist() { - let protocol_parameters = fake_data::protocol_parameters(); - let epoch = Epoch(1); - let store = FakeEpochSettingsStorer::new(vec![(epoch, protocol_parameters.clone())]); - let protocol_parameters_stored = store.get_protocol_parameters(epoch + 1).await.unwrap(); - - assert!(protocol_parameters_stored.is_none()); - } - #[tokio::test] async fn test_get_epoch_settings_exist() { let epoch_settings = AggregatorEpochSettings::dummy(); let epoch = Epoch(1); - let store = - FakeEpochSettingsStorer::new(vec![(epoch, epoch_settings.protocol_parameters.clone())]); + let store = FakeEpochSettingsStorer::new(vec![(epoch, epoch_settings.clone())]); let epoch_settings_stored = store.get_epoch_settings(epoch).await.unwrap(); assert_eq!(Some(epoch_settings), epoch_settings_stored); @@ -176,8 +146,7 @@ mod tests { async fn test_get_epoch_settings_do_not_exist() { let epoch_settings = AggregatorEpochSettings::dummy(); let epoch = Epoch(1); - let store = - FakeEpochSettingsStorer::new(vec![(epoch, epoch_settings.protocol_parameters.clone())]); + let store = FakeEpochSettingsStorer::new(vec![(epoch, epoch_settings.clone())]); let epoch_settings_stored = store.get_epoch_settings(epoch + 1).await.unwrap(); assert!(epoch_settings_stored.is_none()); @@ -190,10 +159,13 @@ mod tests { k: protocol_parameters.k + 1, ..protocol_parameters }; + let aggregator_epoch_settings = AggregatorEpochSettings { + protocol_parameters: protocol_parameters.clone(), + }; let epoch = Epoch(1); let store = FakeEpochSettingsStorer::new(vec![ - (epoch, protocol_parameters.clone()), - (epoch + 1, protocol_parameters.clone()), + (epoch, aggregator_epoch_settings.clone()), + (epoch + 1, aggregator_epoch_settings.clone()), ]); store From 11eedfdfb967735e0046bf3be98ee5e79969733c Mon Sep 17 00:00:00 2001 From: sfauvel Date: Thu, 26 Sep 2024 17:43:27 +0200 Subject: [PATCH 103/274] Indicate incorrect usage of `Default` on `ProtocolParameters` --- mithril-common/src/entities/protocol_parameters.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/mithril-common/src/entities/protocol_parameters.rs b/mithril-common/src/entities/protocol_parameters.rs index 8303bdf8d77..34fda89e9a6 100644 --- a/mithril-common/src/entities/protocol_parameters.rs +++ b/mithril-common/src/entities/protocol_parameters.rs @@ -3,6 +3,7 @@ use serde::{Deserialize, Serialize}; use sha2::{Digest, Sha256}; /// Protocol cryptographic parameters +// TODO: `Default` should be removed. There is no functional sense in having a default value for this struct. #[derive(Clone, Debug, Default, Serialize, Deserialize)] pub struct ProtocolParameters { /// Quorum parameter From e8b01d2f59a06bcb5992f08fdab3f5de305d040d Mon Sep 17 00:00:00 2001 From: sfauvel Date: Thu, 26 Sep 2024 17:55:56 +0200 Subject: [PATCH 104/274] Add `CardanoTransactionsSigningConfig`to the `AggregatorEpochSettings` --- mithril-aggregator/src/configuration.rs | 2 +- .../epoch_settings/get_epoch_settings.rs | 7 +- .../epoch_settings/update_epoch_settings.rs | 53 +++++------- .../src/database/record/epoch_settings.rs | 15 +++- .../repository/epoch_settings_store.rs | 23 +---- .../src/database/test_helper.rs | 27 ++---- .../src/dependency_injection/builder.rs | 26 +++--- .../src/dependency_injection/containers.rs | 30 +++++-- .../src/entities/aggregator_epoch_settings.rs | 10 ++- mithril-aggregator/src/runtime/runner.rs | 10 ++- .../services/certifier/certifier_service.rs | 8 +- .../src/services/epoch_service.rs | 19 +++-- .../src/store/epoch_settings_storer.rs | 83 ++++++++----------- .../tests/test_extensions/runtime_tester.rs | 7 +- 14 files changed, 167 insertions(+), 153 deletions(-) diff --git a/mithril-aggregator/src/configuration.rs b/mithril-aggregator/src/configuration.rs index 50d5fbc5021..5b40873eea8 100644 --- a/mithril-aggregator/src/configuration.rs +++ b/mithril-aggregator/src/configuration.rs @@ -249,7 +249,7 @@ impl Configuration { cardano_transactions_prover_cache_pool_size: 3, cardano_transactions_database_connection_pool_size: 5, cardano_transactions_signing_config: CardanoTransactionsSigningConfig { - security_parameter: BlockNumber(100), + security_parameter: BlockNumber(120), step: BlockNumber(15), }, cardano_transactions_prover_max_hashes_allowed_by_request: 100, diff --git a/mithril-aggregator/src/database/query/epoch_settings/get_epoch_settings.rs b/mithril-aggregator/src/database/query/epoch_settings/get_epoch_settings.rs index ef9fd8c19b1..007f8e1c976 100644 --- a/mithril-aggregator/src/database/query/epoch_settings/get_epoch_settings.rs +++ b/mithril-aggregator/src/database/query/epoch_settings/get_epoch_settings.rs @@ -1,5 +1,5 @@ use anyhow::Context; -use mithril_common::entities::{CardanoTransactionsSigningConfig, Epoch}; +use mithril_common::entities::Epoch; use mithril_common::StdResult; use mithril_persistence::sqlite::{Query, SourceAlias, SqLiteEntity, WhereCondition}; use sqlite::Value; @@ -42,9 +42,8 @@ impl Query for GetEpochSettingsQuery { #[cfg(test)] mod tests { - use mithril_common::{ - entities::{BlockNumber, ProtocolParameters}, - signable_builder::CardanoTransactionsSignableBuilder, + use mithril_common::entities::{ + BlockNumber, CardanoTransactionsSigningConfig, ProtocolParameters, }; use mithril_persistence::sqlite::ConnectionExtensions; diff --git a/mithril-aggregator/src/database/query/epoch_settings/update_epoch_settings.rs b/mithril-aggregator/src/database/query/epoch_settings/update_epoch_settings.rs index 72bcd92760c..48c60d21423 100644 --- a/mithril-aggregator/src/database/query/epoch_settings/update_epoch_settings.rs +++ b/mithril-aggregator/src/database/query/epoch_settings/update_epoch_settings.rs @@ -1,9 +1,10 @@ use sqlite::Value; -use mithril_common::entities::{CardanoTransactionsSigningConfig, Epoch, ProtocolParameters}; +use mithril_common::entities::Epoch; use mithril_persistence::sqlite::{Query, SourceAlias, SqLiteEntity, WhereCondition}; use crate::database::record::EpochSettingsRecord; +use crate::entities::AggregatorEpochSettings; /// Query to update [EpochSettingsRecord] in the sqlite database pub struct UpdateEpochSettingsQuery { @@ -11,11 +12,7 @@ pub struct UpdateEpochSettingsQuery { } impl UpdateEpochSettingsQuery { - pub fn one( - epoch: Epoch, - protocol_parameters: ProtocolParameters, - cardano_transactions_signing_config: CardanoTransactionsSigningConfig, - ) -> Self { + pub fn one(epoch: Epoch, epoch_settings: AggregatorEpochSettings) -> Self { let epoch_settings_id: i64 = epoch.try_into().unwrap(); Self { @@ -23,9 +20,9 @@ impl UpdateEpochSettingsQuery { "(epoch_setting_id, protocol_parameters, cardano_transactions_signing_config) values (?1, ?2, ?3)", vec![ Value::Integer(epoch_settings_id), - Value::String(serde_json::to_string(&protocol_parameters).unwrap()), + Value::String(serde_json::to_string(&epoch_settings.protocol_parameters).unwrap()), Value::String( - serde_json::to_string(&cardano_transactions_signing_config).unwrap(), + serde_json::to_string(&epoch_settings.cardano_transactions_signing_config).unwrap(), ), ], ), @@ -64,28 +61,31 @@ mod tests { #[test] fn test_update_epoch_settings() { let connection = main_db_connection().unwrap(); - insert_epoch_settings(&connection, &[3]).unwrap(); + insert_epoch_settings(&connection, &[*Epoch(3)]).unwrap(); - let epoch_settings_record = connection + let epoch_settings_send_to_update = AggregatorEpochSettings { + protocol_parameters: fake_data::protocol_parameters(), + cardano_transactions_signing_config: CardanoTransactionsSigningConfig::new( + BlockNumber(24), + BlockNumber(62), + ), + }; + let record_returned_by_update_query = connection .fetch_first(UpdateEpochSettingsQuery::one( Epoch(3), - fake_data::protocol_parameters(), - CardanoTransactionsSigningConfig::new(BlockNumber(24), BlockNumber(62)), + epoch_settings_send_to_update.clone(), )) .unwrap() .unwrap(); - assert_eq!(Epoch(3), epoch_settings_record.epoch_settings_id); + assert_eq!(Epoch(3), record_returned_by_update_query.epoch_settings_id); assert_eq!( - fake_data::protocol_parameters(), - epoch_settings_record.protocol_parameters + epoch_settings_send_to_update.protocol_parameters, + record_returned_by_update_query.protocol_parameters ); assert_eq!( - CardanoTransactionsSigningConfig { - security_parameter: BlockNumber(24), - step: BlockNumber(62), - }, - epoch_settings_record.cardano_transactions_signing_config + epoch_settings_send_to_update.cardano_transactions_signing_config, + record_returned_by_update_query.cardano_transactions_signing_config ); let mut cursor = connection @@ -95,18 +95,7 @@ mod tests { .next() .expect("Should have an epoch settings for epoch 3."); - assert_eq!(Epoch(3), epoch_settings_record.epoch_settings_id); - assert_eq!( - fake_data::protocol_parameters(), - epoch_settings_record.protocol_parameters - ); - assert_eq!( - CardanoTransactionsSigningConfig { - security_parameter: BlockNumber(24), - step: BlockNumber(62), - }, - epoch_settings_record.cardano_transactions_signing_config - ); + assert_eq!(record_returned_by_update_query, epoch_settings_record); assert_eq!(0, cursor.count()); } } diff --git a/mithril-aggregator/src/database/record/epoch_settings.rs b/mithril-aggregator/src/database/record/epoch_settings.rs index 69860c964cc..21cc605742a 100644 --- a/mithril-aggregator/src/database/record/epoch_settings.rs +++ b/mithril-aggregator/src/database/record/epoch_settings.rs @@ -1,8 +1,8 @@ -use mithril_common::entities::{ - BlockNumber, CardanoTransactionsSigningConfig, Epoch, ProtocolParameters, -}; +use mithril_common::entities::{CardanoTransactionsSigningConfig, Epoch, ProtocolParameters}; use mithril_persistence::sqlite::{HydrationError, Projection, SqLiteEntity}; +use crate::entities::AggregatorEpochSettings; + /// Settings for an epoch, including the protocol parameters. #[derive(Debug, PartialEq)] pub struct EpochSettingsRecord { @@ -16,6 +16,15 @@ pub struct EpochSettingsRecord { pub cardano_transactions_signing_config: CardanoTransactionsSigningConfig, } +impl From for AggregatorEpochSettings { + fn from(other: EpochSettingsRecord) -> Self { + Self { + protocol_parameters: other.protocol_parameters, + cardano_transactions_signing_config: other.cardano_transactions_signing_config, + } + } +} + impl SqLiteEntity for EpochSettingsRecord { fn hydrate(row: sqlite::Row) -> Result where diff --git a/mithril-aggregator/src/database/repository/epoch_settings_store.rs b/mithril-aggregator/src/database/repository/epoch_settings_store.rs index 21f0d4bcaa8..65ade79cc78 100644 --- a/mithril-aggregator/src/database/repository/epoch_settings_store.rs +++ b/mithril-aggregator/src/database/repository/epoch_settings_store.rs @@ -2,9 +2,7 @@ use std::sync::Arc; use async_trait::async_trait; -use mithril_common::entities::{ - BlockNumber, CardanoTransactionsSigningConfig, Epoch, ProtocolParameters, -}; +use mithril_common::entities::{Epoch, ProtocolParameters}; use mithril_common::StdResult; use mithril_persistence::sqlite::{ConnectionExtensions, SqliteConnection}; use mithril_persistence::store::adapter::AdapterError; @@ -43,15 +41,7 @@ impl EpochSettingsStorer for EpochSettingsStore { ) -> StdResult> { let epoch_settings_record = self .connection - .fetch_first(UpdateEpochSettingsQuery::one( - epoch, - epoch_settings.protocol_parameters, - // TODO retrieve from the AggregatorEpochSettings - CardanoTransactionsSigningConfig { - security_parameter: BlockNumber(0), - step: BlockNumber(0), - }, - )) + .fetch_first(UpdateEpochSettingsQuery::one(epoch, epoch_settings)) .map_err(|e| AdapterError::GeneralError(e.context("persist epoch settings failure")))? .unwrap_or_else(|| panic!("No entity returned by the persister, epoch = {epoch:?}")); @@ -66,9 +56,7 @@ impl EpochSettingsStorer for EpochSettingsStore { .count(); } - Ok(Some(AggregatorEpochSettings { - protocol_parameters: epoch_settings_record.protocol_parameters, - })) + Ok(Some(AggregatorEpochSettings::from(epoch_settings_record))) } async fn get_protocol_parameters(&self, epoch: Epoch) -> StdResult> { @@ -85,10 +73,7 @@ impl EpochSettingsStorer for EpochSettingsStore { .map_err(|e| AdapterError::GeneralError(e.context("Could not get epoch settings")))?; if let Some(epoch_settings_record) = cursor.next() { - // TODO create an adapter ? - return Ok(Some(AggregatorEpochSettings { - protocol_parameters: epoch_settings_record.protocol_parameters, - })); + return Ok(Some(AggregatorEpochSettings::from(epoch_settings_record))); } Ok(None) } diff --git a/mithril-aggregator/src/database/test_helper.rs b/mithril-aggregator/src/database/test_helper.rs index 90599e78489..7bba7fec546 100644 --- a/mithril-aggregator/src/database/test_helper.rs +++ b/mithril-aggregator/src/database/test_helper.rs @@ -1,5 +1,4 @@ use chrono::Utc; -use mithril_persistence::store::adapter::AdapterError; use sqlite::{ConnectionThreadSafe, Value}; use std::path::Path; use uuid::Uuid; @@ -22,6 +21,7 @@ use crate::database::record::{ BufferedSingleSignatureRecord, CertificateRecord, SignedEntityRecord, SignerRecord, SignerRegistrationRecord, SingleSignatureRecord, }; +use crate::entities::AggregatorEpochSettings; /// In-memory sqlite database without foreign key support with migrations applied pub fn main_db_connection() -> StdResult { @@ -198,29 +198,18 @@ pub fn insert_epoch_settings( connection: &SqliteConnection, epoch_to_insert_settings: &[u64], ) -> StdResult<()> { - // for (epoch, protocol_parameters) in epoch_to_insert_settings.iter().map(|epoch| { - // ( - // Epoch(*epoch), - // ProtocolParameters::new(*epoch, epoch + 1, 1.0), - // ) - // }) { - // connection.fetch_first(UpdateEpochSettingsQuery::one(epoch, protocol_parameters))? - // } - - // for epoch in epoch_to_insert_settings { - // connection.fetch_first(UpdateEpochSettingsQuery::one( - // Epoch(*epoch), - // ProtocolParameters::new(*epoch, epoch + 1, 1.0), - // ))? - // } - let query = { // leverage the expanded parameter from this query which is unit // tested on its own above. let (sql_values, _) = UpdateEpochSettingsQuery::one( Epoch(1), - ProtocolParameters::new(1, 2, 1.0), - CardanoTransactionsSigningConfig::new(BlockNumber(0), BlockNumber(0)), + AggregatorEpochSettings { + protocol_parameters: ProtocolParameters::new(1, 2, 1.0), + cardano_transactions_signing_config: CardanoTransactionsSigningConfig::new( + BlockNumber(0), + BlockNumber(0), + ), + }, ) .filters() .expand(); diff --git a/mithril-aggregator/src/dependency_injection/builder.rs b/mithril-aggregator/src/dependency_injection/builder.rs index cccc34cca76..09d149b22bd 100644 --- a/mithril-aggregator/src/dependency_injection/builder.rs +++ b/mithril-aggregator/src/dependency_injection/builder.rs @@ -44,7 +44,7 @@ use mithril_common::{ TransactionsImporter, }, signed_entity_type_lock::SignedEntityTypeLock, - MithrilTickerService, TickerService, + MithrilTickerService, StdResult, TickerService, }; use mithril_persistence::{ database::{repository::CardanoTransactionRepository, ApplicationNodeType, SqlMigration}, @@ -579,9 +579,11 @@ impl DependenciesBuilder { message: "cannot build aggregator runner: no epoch returned.".to_string(), error: None, })?; - epoch_settings_store - .handle_discrepancies_at_startup(current_epoch, &self.configuration.protocol_parameters) + .handle_discrepancies_at_startup( + current_epoch, + &self.get_epoch_settings_configuration()?, + ) .await .map_err(|e| DependenciesBuilderError::Initialization { message: "can not create aggregator runner".to_string(), @@ -1207,13 +1209,7 @@ impl DependenciesBuilder { let verification_key_store = self.get_verification_key_store().await?; let epoch_settings_storer = self.get_epoch_settings_storer().await?; - let epoch_settings = AggregatorEpochSettings { - protocol_parameters: self.configuration.protocol_parameters.clone(), - // TODO : complete the final structure - // cardano_transactions_signing_config: self - // .get_signed_entity_config()? - // .cardano_transactions_signing_config, - }; + let epoch_settings = self.get_epoch_settings_configuration()?; let epoch_service = Arc::new(RwLock::new(MithrilEpochService::new( epoch_settings, @@ -1321,6 +1317,16 @@ impl DependenciesBuilder { Ok(self.single_signer_authenticator.as_ref().cloned().unwrap()) } + fn get_epoch_settings_configuration(&mut self) -> StdResult { + let epoch_settings = AggregatorEpochSettings { + protocol_parameters: self.configuration.protocol_parameters.clone(), + cardano_transactions_signing_config: self + .get_signed_entity_config()? + .cardano_transactions_signing_config, + }; + Ok(epoch_settings) + } + /// Return an unconfigured [DependencyContainer] pub async fn build_dependency_container(&mut self) -> Result { let dependency_manager = DependencyContainer { diff --git a/mithril-aggregator/src/dependency_injection/containers.rs b/mithril-aggregator/src/dependency_injection/containers.rs index 6e6ce2c6cb9..91a2b57e990 100644 --- a/mithril-aggregator/src/dependency_injection/containers.rs +++ b/mithril-aggregator/src/dependency_injection/containers.rs @@ -9,7 +9,10 @@ use mithril_common::{ chain_observer::ChainObserver, crypto_helper::ProtocolGenesisVerifier, digesters::{ImmutableDigester, ImmutableFileObserver}, - entities::{Epoch, ProtocolParameters, SignedEntityConfig, SignerWithStake, StakeDistribution}, + entities::{ + CardanoTransactionsSigningConfig, Epoch, ProtocolParameters, SignedEntityConfig, + SignerWithStake, StakeDistribution, + }, era::{EraChecker, EraReader}, signable_builder::SignableBuilderService, signed_entity_type_lock::SignedEntityTypeLock, @@ -191,13 +194,20 @@ impl DependencyContainer { /// /// Fill the stores of a [DependencyManager] in a way to simulate an aggregator state /// using the data from a precomputed fixture. - pub async fn init_state_from_fixture(&self, fixture: &MithrilFixture, target_epochs: &[Epoch]) { + pub async fn init_state_from_fixture( + &self, + fixture: &MithrilFixture, + cardano_transactions_signing_config: &CardanoTransactionsSigningConfig, + target_epochs: &[Epoch], + ) { for epoch in target_epochs { self.epoch_settings_storer .save_epoch_settings( *epoch, AggregatorEpochSettings { protocol_parameters: fixture.protocol_parameters(), + cardano_transactions_signing_config: cardano_transactions_signing_config + .clone(), }, ) .await @@ -222,9 +232,13 @@ impl DependencyContainer { genesis_signers: Vec, second_epoch_signers: Vec, genesis_protocol_parameters: &ProtocolParameters, + cardano_transactions_signing_config: &CardanoTransactionsSigningConfig, ) { - self.init_protocol_parameter_store(genesis_protocol_parameters) - .await; + self.init_protocol_parameter_store( + genesis_protocol_parameters, + cardano_transactions_signing_config, + ) + .await; let (work_epoch, epoch_to_sign) = self.get_genesis_epochs().await; for (epoch, signers) in [ @@ -239,7 +253,11 @@ impl DependencyContainer { /// `TEST METHOD ONLY` /// /// Fill up to the first three epochs of the [ProtocolParametersStore] with the given value. - pub async fn init_protocol_parameter_store(&self, protocol_parameters: &ProtocolParameters) { + pub async fn init_protocol_parameter_store( + &self, + protocol_parameters: &ProtocolParameters, + cardano_transactions_signing_config: &CardanoTransactionsSigningConfig, + ) { let (work_epoch, epoch_to_sign) = self.get_genesis_epochs().await; let mut epochs_to_save = Vec::new(); epochs_to_save.push(work_epoch); @@ -251,6 +269,8 @@ impl DependencyContainer { epoch, AggregatorEpochSettings { protocol_parameters: protocol_parameters.clone(), + cardano_transactions_signing_config: cardano_transactions_signing_config + .clone(), }, ) .await diff --git a/mithril-aggregator/src/entities/aggregator_epoch_settings.rs b/mithril-aggregator/src/entities/aggregator_epoch_settings.rs index 337b07b7c44..61ff980b062 100644 --- a/mithril-aggregator/src/entities/aggregator_epoch_settings.rs +++ b/mithril-aggregator/src/entities/aggregator_epoch_settings.rs @@ -1,10 +1,13 @@ -use mithril_common::entities::ProtocolParameters; +use mithril_common::entities::{CardanoTransactionsSigningConfig, ProtocolParameters}; /// AggregatorEpochSettings represents the settings of an epoch -#[derive(Clone, Debug, PartialEq, Default)] +#[derive(Clone, Debug, PartialEq)] pub struct AggregatorEpochSettings { /// Protocol parameters pub protocol_parameters: ProtocolParameters, + + /// Cardano transactions signing configuration + pub cardano_transactions_signing_config: CardanoTransactionsSigningConfig, } impl AggregatorEpochSettings { @@ -13,12 +16,13 @@ impl AggregatorEpochSettings { pub fn dummy() -> AggregatorEpochSettings { use mithril_common::test_utils::fake_data; - // Protocol parameters let protocol_parameters = fake_data::protocol_parameters(); + let cardano_transactions_signing_config = CardanoTransactionsSigningConfig::dummy(); // Aggregator Epoch settings AggregatorEpochSettings { protocol_parameters, + cardano_transactions_signing_config, } } } diff --git a/mithril-aggregator/src/runtime/runner.rs b/mithril-aggregator/src/runtime/runner.rs index 706b0d07106..c3735f7ce63 100644 --- a/mithril-aggregator/src/runtime/runner.rs +++ b/mithril-aggregator/src/runtime/runner.rs @@ -501,7 +501,9 @@ pub mod tests { }; use async_trait::async_trait; use chrono::{DateTime, Utc}; - use mithril_common::entities::{ChainPoint, SignedEntityTypeDiscriminants}; + use mithril_common::entities::{ + CardanoTransactionsSigningConfig, ChainPoint, SignedEntityTypeDiscriminants, + }; use mithril_common::signed_entity_type_lock::SignedEntityTypeLock; use mithril_common::{ chain_observer::FakeObserver, @@ -544,6 +546,7 @@ pub mod tests { .unwrap(); deps.init_state_from_fixture( &fixture, + &CardanoTransactionsSigningConfig::dummy(), &[ current_epoch.offset_to_signer_retrieval_epoch().unwrap(), current_epoch, @@ -798,6 +801,7 @@ pub mod tests { current_signers.clone(), next_signers.clone(), &protocol_parameters.clone(), + &CardanoTransactionsSigningConfig::dummy(), ) .await; runner.inform_new_epoch(time_point.epoch).await.unwrap(); @@ -934,6 +938,10 @@ pub mod tests { let epoch_settings_storer = deps.epoch_settings_storer.clone(); let expected_epoch_settings = AggregatorEpochSettings { protocol_parameters: deps.config.protocol_parameters.clone(), + cardano_transactions_signing_config: deps + .signed_entity_config + .cardano_transactions_signing_config + .clone(), }; let current_epoch = deps.ticker_service.get_current_epoch().await.unwrap(); let insert_epoch = current_epoch.offset_to_epoch_settings_recording_epoch(); diff --git a/mithril-aggregator/src/services/certifier/certifier_service.rs b/mithril-aggregator/src/services/certifier/certifier_service.rs index a2c26097cfc..a5f25ac3f8e 100644 --- a/mithril-aggregator/src/services/certifier/certifier_service.rs +++ b/mithril-aggregator/src/services/certifier/certifier_service.rs @@ -382,7 +382,7 @@ mod tests { }; use chrono::{DateTime, Days}; use mithril_common::{ - entities::{CardanoDbBeacon, ProtocolMessagePartKey}, + entities::{CardanoDbBeacon, CardanoTransactionsSigningConfig, ProtocolMessagePartKey}, test_utils::{fake_data, MithrilFixture, MithrilFixtureBuilder}, }; use tokio::sync::RwLock; @@ -442,7 +442,11 @@ mod tests { .await .unwrap(); dependency_manager - .init_state_from_fixture(fixture, epochs_with_signers) + .init_state_from_fixture( + fixture, + &CardanoTransactionsSigningConfig::dummy(), + epochs_with_signers, + ) .await; MithrilCertifierService::from_deps(network, dependency_builder).await diff --git a/mithril-aggregator/src/services/epoch_service.rs b/mithril-aggregator/src/services/epoch_service.rs index 8e7c5e76f05..48168f3431c 100644 --- a/mithril-aggregator/src/services/epoch_service.rs +++ b/mithril-aggregator/src/services/epoch_service.rs @@ -146,16 +146,14 @@ impl MithrilEpochService { epoch: Epoch, name: &str, ) -> StdResult { - let protocol_parameters = self + let epoch_settings = self .epoch_settings_storer - .get_protocol_parameters(epoch) + .get_epoch_settings(epoch) .await .with_context(|| format!("Epoch service failed to obtain {name}"))? .ok_or(EpochServiceError::UnavailableData(epoch, name.to_string()))?; - Ok(AggregatorEpochSettings { - protocol_parameters, - }) + Ok(epoch_settings) } async fn insert_future_epoch_settings(&self, actual_epoch: Epoch) -> StdResult<()> { @@ -357,6 +355,8 @@ impl FakeEpochService { current_signers_with_stake: &[SignerWithStake], next_signers_with_stake: &[SignerWithStake], ) -> Self { + use mithril_common::entities::CardanoTransactionsSigningConfig; + let protocol_multi_signer = SignerBuilder::new(current_signers_with_stake, protocol_parameters) .with_context(|| "Could not build protocol_multi_signer for epoch service") @@ -374,12 +374,15 @@ impl FakeEpochService { let next_signers = Signer::vec_from(next_signers_with_stake.clone()); let epoch_settings = AggregatorEpochSettings { protocol_parameters: protocol_parameters.clone(), + cardano_transactions_signing_config: CardanoTransactionsSigningConfig::dummy(), }; let next_epoch_settings = AggregatorEpochSettings { protocol_parameters: next_protocol_parameters.clone(), + cardano_transactions_signing_config: CardanoTransactionsSigningConfig::dummy(), }; let upcoming_epoch_settings = AggregatorEpochSettings { protocol_parameters: upcoming_protocol_parameters.clone(), + cardano_transactions_signing_config: CardanoTransactionsSigningConfig::dummy(), }; Self { epoch_data: Some(EpochData { @@ -536,7 +539,7 @@ impl EpochService for FakeEpochService { #[cfg(test)] mod tests { - use mithril_common::entities::PartyId; + use mithril_common::entities::{CardanoTransactionsSigningConfig, PartyId}; use mithril_common::test_utils::{fake_data, MithrilFixture, MithrilFixtureBuilder}; use mithril_persistence::store::adapter::MemoryAdapter; use std::collections::{BTreeSet, HashMap}; @@ -643,18 +646,21 @@ mod tests { signer_retrieval_epoch, AggregatorEpochSettings { protocol_parameters: current_epoch_fixture.protocol_parameters(), + cardano_transactions_signing_config: CardanoTransactionsSigningConfig::dummy(), }, ), ( next_signer_retrieval_epoch, AggregatorEpochSettings { protocol_parameters: next_epoch_fixture.protocol_parameters(), + cardano_transactions_signing_config: CardanoTransactionsSigningConfig::dummy(), }, ), ( next_signer_retrieval_epoch.next(), AggregatorEpochSettings { protocol_parameters: upcoming_protocol_parameters.clone(), + cardano_transactions_signing_config: CardanoTransactionsSigningConfig::dummy(), }, ), ]); @@ -675,6 +681,7 @@ mod tests { MithrilEpochService::new( AggregatorEpochSettings { protocol_parameters: future_protocol_parameters, + cardano_transactions_signing_config: CardanoTransactionsSigningConfig::dummy(), }, Arc::new(epoch_settings_storer), Arc::new(vkey_store), diff --git a/mithril-aggregator/src/store/epoch_settings_storer.rs b/mithril-aggregator/src/store/epoch_settings_storer.rs index 6d653e0ec43..fde40d77639 100644 --- a/mithril-aggregator/src/store/epoch_settings_storer.rs +++ b/mithril-aggregator/src/store/epoch_settings_storer.rs @@ -25,27 +25,21 @@ pub trait EpochSettingsStorer: Sync + Send { /// Get the saved `AggregatorEpochSettings` for the given [Epoch] if any. async fn get_epoch_settings(&self, epoch: Epoch) -> StdResult>; - /// Handle discrepancies at startup in the protocol parameters store. + /// Handle discrepancies at startup in the epoch settings store. /// In case an aggregator has been launched after some epochs of not being up or at initial startup, - /// the discrepancies in the protocol parameters store needs to be fixed. - /// The protocol parameters needs to be recorded for the working epoch and the next 2 epochs. - // TODO: Should we pass a AggegatorEpochSettings instead of ProtocolParameters? + /// the discrepancies in the epoch settings store needs to be fixed. + /// The epoch settings needs to be recorded for the working epoch and the next 2 epochs. async fn handle_discrepancies_at_startup( &self, current_epoch: Epoch, - configuration_protocol_parameters: &ProtocolParameters, + epoch_settings_configuration: &AggregatorEpochSettings, ) -> StdResult<()> { for epoch_offset in 0..=2 { let epoch = current_epoch + epoch_offset; - if self.get_protocol_parameters(epoch).await?.is_none() { - debug!("Handle discrepancies at startup of protocol parameters store, will record protocol parameters from the configuration for epoch {epoch}: {configuration_protocol_parameters:?}"); - self.save_epoch_settings( - epoch, - AggregatorEpochSettings { - protocol_parameters: configuration_protocol_parameters.clone(), - }, - ) - .await?; + if self.get_epoch_settings(epoch).await?.is_none() { + debug!("Handle discrepancies at startup of epoch settings store, will record epoch settings from the configuration for epoch {epoch}: {epoch_settings_configuration:?}"); + self.save_epoch_settings(epoch, epoch_settings_configuration.clone()) + .await?; } } @@ -93,12 +87,12 @@ impl EpochSettingsStorer for FakeEpochSettingsStorer { #[cfg(test)] mod tests { - use mithril_common::test_utils::fake_data; + use mithril_common::entities::CardanoTransactionsSigningConfig; use super::*; #[tokio::test] - async fn test_save_epoch_settings_do_not_exist_yet() { + async fn test_save_epoch_settings_do_not_exist_yet_return_none() { let epoch_settings = AggregatorEpochSettings::dummy(); let epoch = Epoch(1); let store = FakeEpochSettingsStorer::new(vec![]); @@ -111,7 +105,7 @@ mod tests { } #[tokio::test] - async fn test_save_epoch_settings_already_exist() { + async fn test_save_epoch_settings_already_exist_return_previous_epoch_settings_stored() { let epoch_settings = AggregatorEpochSettings::dummy(); let epoch = Epoch(1); let store = FakeEpochSettingsStorer::new(vec![(epoch, epoch_settings.clone())]); @@ -124,6 +118,7 @@ mod tests { epoch, AggregatorEpochSettings { protocol_parameters: protocol_parameters_new.clone(), + ..epoch_settings.clone() }, ) .await @@ -154,44 +149,38 @@ mod tests { #[tokio::test] async fn test_handle_discrepancies_at_startup_should_complete_at_least_two_epochs() { - let protocol_parameters = fake_data::protocol_parameters(); - let protocol_parameters_new = ProtocolParameters { - k: protocol_parameters.k + 1, - ..protocol_parameters - }; - let aggregator_epoch_settings = AggregatorEpochSettings { - protocol_parameters: protocol_parameters.clone(), + let epoch_settings = AggregatorEpochSettings::dummy(); + let epoch_settings_new = AggregatorEpochSettings { + protocol_parameters: ProtocolParameters { + k: epoch_settings.protocol_parameters.k + 1, + ..epoch_settings.protocol_parameters + }, + cardano_transactions_signing_config: CardanoTransactionsSigningConfig { + step: epoch_settings.cardano_transactions_signing_config.step + 1, + ..epoch_settings.cardano_transactions_signing_config + }, }; let epoch = Epoch(1); let store = FakeEpochSettingsStorer::new(vec![ - (epoch, aggregator_epoch_settings.clone()), - (epoch + 1, aggregator_epoch_settings.clone()), + (epoch, epoch_settings.clone()), + (epoch + 1, epoch_settings.clone()), ]); store - .handle_discrepancies_at_startup(epoch, &protocol_parameters_new) + .handle_discrepancies_at_startup(epoch, &epoch_settings_new) .await .unwrap(); - let protocol_parameters_stored = store.get_protocol_parameters(epoch).await.unwrap(); - assert_eq!( - Some(protocol_parameters.clone()), - protocol_parameters_stored - ); - - let protocol_parameters_stored = store.get_protocol_parameters(epoch + 1).await.unwrap(); - assert_eq!( - Some(protocol_parameters.clone()), - protocol_parameters_stored - ); - - let protocol_parameters_stored = store.get_protocol_parameters(epoch + 2).await.unwrap(); - assert_eq!( - Some(protocol_parameters_new.clone()), - protocol_parameters_stored - ); - - let protocol_parameters_stored = store.get_protocol_parameters(epoch + 3).await.unwrap(); - assert!(protocol_parameters_stored.is_none()); + let epoch_settings_stored = store.get_epoch_settings(epoch).await.unwrap(); + assert_eq!(Some(epoch_settings.clone()), epoch_settings_stored); + + let epoch_settings_stored = store.get_epoch_settings(epoch + 1).await.unwrap(); + assert_eq!(Some(epoch_settings.clone()), epoch_settings_stored); + + let epoch_settings_stored = store.get_epoch_settings(epoch + 2).await.unwrap(); + assert_eq!(Some(epoch_settings_new.clone()), epoch_settings_stored); + + let epoch_settings_stored = store.get_epoch_settings(epoch + 3).await.unwrap(); + assert!(epoch_settings_stored.is_none()); } } diff --git a/mithril-aggregator/tests/test_extensions/runtime_tester.rs b/mithril-aggregator/tests/test_extensions/runtime_tester.rs index 40b403f9fd0..896a5222fce 100644 --- a/mithril-aggregator/tests/test_extensions/runtime_tester.rs +++ b/mithril-aggregator/tests/test_extensions/runtime_tester.rs @@ -9,6 +9,7 @@ use mithril_aggregator::{ AggregatorRuntime, Configuration, DependencyContainer, DumbSnapshotUploader, DumbSnapshotter, SignerRegistrationError, }; +use mithril_common::entities::CardanoTransactionsSigningConfig; use mithril_common::{ cardano_block_scanner::{DumbBlockScanner, ScannedBlock}, chain_observer::{ChainObserver, FakeObserver}, @@ -190,7 +191,11 @@ impl RuntimeTester { // Init the stores needed for a genesis certificate let genesis_epochs = self.dependencies.get_genesis_epochs().await; self.dependencies - .init_state_from_fixture(fixture, &[genesis_epochs.0, genesis_epochs.1]) + .init_state_from_fixture( + fixture, + &CardanoTransactionsSigningConfig::dummy(), + &[genesis_epochs.0, genesis_epochs.1], + ) .await; Ok(()) } From 18d233c37824678220b06d3ca575846b6133fa9b Mon Sep 17 00:00:00 2001 From: sfauvel Date: Fri, 27 Sep 2024 12:07:28 +0200 Subject: [PATCH 105/274] =?UTF-8?q?refacto:=20=E1=BA=81ith=5Fdata`=20in=20?= =?UTF-8?q?`FakeEpochService`=20takes=20`AggregatorEpochSettings`=20instea?= =?UTF-8?q?d=20of=20`ProtocolParameters`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mithril_stake_distribution.rs | 20 ++++-- .../src/http_server/routes/epoch_routes.rs | 51 +++++++++++-- mithril-aggregator/src/multi_signer.rs | 16 ++++- .../src/services/epoch_service.rs | 71 ++++++++++--------- .../signable_builder/signable_seed_builder.rs | 17 +++-- 5 files changed, 124 insertions(+), 51 deletions(-) diff --git a/mithril-aggregator/src/artifact_builder/mithril_stake_distribution.rs b/mithril-aggregator/src/artifact_builder/mithril_stake_distribution.rs index 69435ab80c9..6ac599fdc71 100644 --- a/mithril-aggregator/src/artifact_builder/mithril_stake_distribution.rs +++ b/mithril-aggregator/src/artifact_builder/mithril_stake_distribution.rs @@ -44,18 +44,21 @@ mod tests { use super::*; - use crate::services::FakeEpochService; + use crate::{entities::AggregatorEpochSettings, services::FakeEpochService}; #[tokio::test] async fn should_compute_valid_artifact() { let signers_with_stake = fake_data::signers_with_stakes(5); let certificate = fake_data::certificate("certificate-123".to_string()); - let protocol_parameters = fake_data::protocol_parameters(); + let epoch_settings = AggregatorEpochSettings { + protocol_parameters: fake_data::protocol_parameters(), + ..AggregatorEpochSettings::dummy() + }; let epoch_service = FakeEpochService::with_data( Epoch(1), - &protocol_parameters, - &protocol_parameters, - &protocol_parameters, + &epoch_settings, + &epoch_settings, + &epoch_settings, &signers_with_stake, &signers_with_stake, ); @@ -65,8 +68,11 @@ mod tests { .compute_artifact(Epoch(1), &certificate) .await .unwrap(); - let artifact_expected = - MithrilStakeDistribution::new(Epoch(1), signers_with_stake, &protocol_parameters); + let artifact_expected = MithrilStakeDistribution::new( + Epoch(1), + signers_with_stake, + &epoch_settings.protocol_parameters, + ); assert_eq!(artifact_expected, artifact); } diff --git a/mithril-aggregator/src/http_server/routes/epoch_routes.rs b/mithril-aggregator/src/http_server/routes/epoch_routes.rs index 7aa6bbe93b3..fd1073c83d9 100644 --- a/mithril-aggregator/src/http_server/routes/epoch_routes.rs +++ b/mithril-aggregator/src/http_server/routes/epoch_routes.rs @@ -98,15 +98,15 @@ mod tests { use mithril_common::{ entities::{ - BlockNumber, CardanoTransactionsSigningConfig, Epoch, SignedEntityConfig, - SignedEntityTypeDiscriminants, + BlockNumber, CardanoTransactionsSigningConfig, Epoch, ProtocolParameters, + SignedEntityConfig, SignedEntityTypeDiscriminants, }, - test_utils::{apispec::APISpec, MithrilFixtureBuilder}, + test_utils::{apispec::APISpec, fake_data, MithrilFixtureBuilder}, }; - use crate::http_server::SERVER_BASE_PATH; use crate::initialize_dependencies; use crate::services::FakeEpochService; + use crate::{entities::AggregatorEpochSettings, http_server::SERVER_BASE_PATH}; use super::*; @@ -179,6 +179,49 @@ mod tests { assert_eq!(message.next_cardano_transactions_signing_config, None); } + #[tokio::test] + async fn get_epoch_settings_message_retrieves_protocol_parameters_from_epoch_service() { + let current_epoch_settings = AggregatorEpochSettings { + protocol_parameters: ProtocolParameters::new(101, 10, 0.5), + ..AggregatorEpochSettings::dummy() + }; + let next_epoch_settings = AggregatorEpochSettings { + protocol_parameters: ProtocolParameters::new(102, 20, 0.5), + ..AggregatorEpochSettings::dummy() + }; + let upcoming_epoch_settings = AggregatorEpochSettings { + protocol_parameters: ProtocolParameters::new(103, 30, 0.5), + ..AggregatorEpochSettings::dummy() + }; + + let epoch_service = FakeEpochService::with_data( + Epoch(1), + ¤t_epoch_settings, + &next_epoch_settings, + &upcoming_epoch_settings, + &fake_data::signers_with_stakes(5), + &fake_data::signers_with_stakes(3), + ); + + let message = get_epoch_settings_message( + Arc::new(RwLock::new(epoch_service)), + SignedEntityConfig::dummy(), + ) + .await + .unwrap(); + + // TODO: What we expect ? see #1963 Discrepancy of protocol parameters in epoch settings and pending certificates routes + // https://github.com/input-output-hk/mithril/issues/1963 + assert_eq!( + message.protocol_parameters, + next_epoch_settings.protocol_parameters + ); + assert_eq!( + message.next_protocol_parameters, + upcoming_epoch_settings.protocol_parameters + ); + } + #[tokio::test] async fn test_epoch_settings_get_ok() { let method = Method::GET.as_str(); diff --git a/mithril-aggregator/src/multi_signer.rs b/mithril-aggregator/src/multi_signer.rs index b4aded9ee96..586259403dc 100644 --- a/mithril-aggregator/src/multi_signer.rs +++ b/mithril-aggregator/src/multi_signer.rs @@ -142,6 +142,7 @@ mod tests { use mithril_common::protocol::ToMessage; use mithril_common::test_utils::{fake_data, MithrilFixtureBuilder}; + use crate::entities::AggregatorEpochSettings; use crate::services::FakeEpochService; use super::*; @@ -174,9 +175,18 @@ mod tests { let multi_signer = MultiSignerImpl::new(Arc::new(RwLock::new(FakeEpochService::with_data( epoch, - &fixture.protocol_parameters(), - &next_fixture.protocol_parameters(), - &next_fixture.protocol_parameters(), + &AggregatorEpochSettings { + protocol_parameters: fixture.protocol_parameters(), + ..AggregatorEpochSettings::dummy() + }, + &AggregatorEpochSettings { + protocol_parameters: next_fixture.protocol_parameters(), + ..AggregatorEpochSettings::dummy() + }, + &AggregatorEpochSettings { + protocol_parameters: next_fixture.protocol_parameters(), + ..AggregatorEpochSettings::dummy() + }, &fixture.signers_with_stake(), &next_fixture.signers_with_stake(), )))); diff --git a/mithril-aggregator/src/services/epoch_service.rs b/mithril-aggregator/src/services/epoch_service.rs index 48168f3431c..6057cb49fad 100644 --- a/mithril-aggregator/src/services/epoch_service.rs +++ b/mithril-aggregator/src/services/epoch_service.rs @@ -349,47 +349,38 @@ impl FakeEpochService { /// parameters and signers. pub fn with_data( epoch: Epoch, - protocol_parameters: &ProtocolParameters, - next_protocol_parameters: &ProtocolParameters, - upcoming_protocol_parameters: &ProtocolParameters, + epoch_settings: &AggregatorEpochSettings, + next_epoch_settings: &AggregatorEpochSettings, + upcoming_epoch_settings: &AggregatorEpochSettings, current_signers_with_stake: &[SignerWithStake], next_signers_with_stake: &[SignerWithStake], ) -> Self { - use mithril_common::entities::CardanoTransactionsSigningConfig; - - let protocol_multi_signer = - SignerBuilder::new(current_signers_with_stake, protocol_parameters) - .with_context(|| "Could not build protocol_multi_signer for epoch service") - .unwrap() - .build_multi_signer(); - let next_protocol_multi_signer = - SignerBuilder::new(next_signers_with_stake, next_protocol_parameters) - .with_context(|| "Could not build protocol_multi_signer for epoch service") - .unwrap() - .build_multi_signer(); + let protocol_multi_signer = SignerBuilder::new( + current_signers_with_stake, + &epoch_settings.protocol_parameters, + ) + .with_context(|| "Could not build protocol_multi_signer for epoch service") + .unwrap() + .build_multi_signer(); + let next_protocol_multi_signer = SignerBuilder::new( + next_signers_with_stake, + &next_epoch_settings.protocol_parameters, + ) + .with_context(|| "Could not build protocol_multi_signer for epoch service") + .unwrap() + .build_multi_signer(); let current_signers_with_stake = current_signers_with_stake.to_vec(); let next_signers_with_stake = next_signers_with_stake.to_vec(); let current_signers = Signer::vec_from(current_signers_with_stake.clone()); let next_signers = Signer::vec_from(next_signers_with_stake.clone()); - let epoch_settings = AggregatorEpochSettings { - protocol_parameters: protocol_parameters.clone(), - cardano_transactions_signing_config: CardanoTransactionsSigningConfig::dummy(), - }; - let next_epoch_settings = AggregatorEpochSettings { - protocol_parameters: next_protocol_parameters.clone(), - cardano_transactions_signing_config: CardanoTransactionsSigningConfig::dummy(), - }; - let upcoming_epoch_settings = AggregatorEpochSettings { - protocol_parameters: upcoming_protocol_parameters.clone(), - cardano_transactions_signing_config: CardanoTransactionsSigningConfig::dummy(), - }; + Self { epoch_data: Some(EpochData { epoch, - epoch_settings, - next_epoch_settings, - upcoming_epoch_settings, + epoch_settings: epoch_settings.clone(), + next_epoch_settings: next_epoch_settings.clone(), + upcoming_epoch_settings: upcoming_epoch_settings.clone(), current_signers_with_stake, next_signers_with_stake, current_signers, @@ -413,11 +404,25 @@ impl FakeEpochService { epoch: Epoch, fixture: &mithril_common::test_utils::MithrilFixture, ) -> Self { + use mithril_common::entities::CardanoTransactionsSigningConfig; + + let epoch_settings = AggregatorEpochSettings { + protocol_parameters: fixture.protocol_parameters(), + cardano_transactions_signing_config: CardanoTransactionsSigningConfig::dummy(), + }; + let next_epoch_settings = AggregatorEpochSettings { + protocol_parameters: fixture.protocol_parameters(), + cardano_transactions_signing_config: CardanoTransactionsSigningConfig::dummy(), + }; + let upcoming_epoch_settings = AggregatorEpochSettings { + protocol_parameters: fixture.protocol_parameters(), + cardano_transactions_signing_config: CardanoTransactionsSigningConfig::dummy(), + }; Self::with_data( epoch, - &fixture.protocol_parameters(), - &fixture.protocol_parameters(), - &fixture.protocol_parameters(), + &epoch_settings, + &next_epoch_settings, + &upcoming_epoch_settings, &fixture.signers_with_stake(), &fixture.signers_with_stake(), ) diff --git a/mithril-aggregator/src/services/signable_builder/signable_seed_builder.rs b/mithril-aggregator/src/services/signable_builder/signable_seed_builder.rs index c399b79a576..a845acb54e3 100644 --- a/mithril-aggregator/src/services/signable_builder/signable_seed_builder.rs +++ b/mithril-aggregator/src/services/signable_builder/signable_seed_builder.rs @@ -61,7 +61,7 @@ mod tests { test_utils::{MithrilFixture, MithrilFixtureBuilder}, }; - use crate::services::FakeEpochService; + use crate::{entities::AggregatorEpochSettings, services::FakeEpochService}; use super::*; @@ -72,9 +72,18 @@ mod tests { ) -> AggregatorSignableSeedBuilder { let epoch_service = Arc::new(RwLock::new(FakeEpochService::with_data( epoch, - &fixture.protocol_parameters(), - &next_fixture.protocol_parameters(), - &next_fixture.protocol_parameters(), + &AggregatorEpochSettings { + protocol_parameters: fixture.protocol_parameters(), + ..AggregatorEpochSettings::dummy() + }, + &AggregatorEpochSettings { + protocol_parameters: next_fixture.protocol_parameters(), + ..AggregatorEpochSettings::dummy() + }, + &AggregatorEpochSettings { + protocol_parameters: next_fixture.protocol_parameters(), + ..AggregatorEpochSettings::dummy() + }, &fixture.signers_with_stake(), &next_fixture.signers_with_stake(), ))); From 990fcbb09dd8669a044479c607a5a8261e4f9af0 Mon Sep 17 00:00:00 2001 From: sfauvel Date: Fri, 27 Sep 2024 13:11:04 +0200 Subject: [PATCH 106/274] Plug epoch route with cardano transactions signing config from EpochService MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Sébastien Fauvel --- .../src/http_server/routes/epoch_routes.rs | 73 +++++++++++++++---- .../src/services/epoch_service.rs | 73 ++++++++++++++++++- 2 files changed, 132 insertions(+), 14 deletions(-) diff --git a/mithril-aggregator/src/http_server/routes/epoch_routes.rs b/mithril-aggregator/src/http_server/routes/epoch_routes.rs index fd1073c83d9..9a77c3d4266 100644 --- a/mithril-aggregator/src/http_server/routes/epoch_routes.rs +++ b/mithril-aggregator/src/http_server/routes/epoch_routes.rs @@ -40,11 +40,18 @@ async fn get_epoch_settings_message( let current_signers = epoch_service.current_signers()?; let next_signers = epoch_service.next_signers()?; - let cardano_transactions_signing_config = signed_entity_config - .list_allowed_signed_entity_types_discriminants() - .contains(&SignedEntityTypeDiscriminants::CardanoTransactions) - .then_some(signed_entity_config.cardano_transactions_signing_config); - let next_cardano_transactions_signing_config = cardano_transactions_signing_config.clone(); + let allowed_types = signed_entity_config.list_allowed_signed_entity_types_discriminants(); + let cardano_transactions_discriminant = + allowed_types.get(&SignedEntityTypeDiscriminants::CardanoTransactions); + + let cardano_transactions_signing_config = cardano_transactions_discriminant + .map(|_| epoch_service.current_cardano_transactions_signing_config()) + .transpose()? + .cloned(); + let next_cardano_transactions_signing_config = cardano_transactions_discriminant + .map(|_| epoch_service.next_cardano_transactions_signing_config()) + .transpose()? + .cloned(); let epoch_settings_message = EpochSettingsMessage { epoch, @@ -145,14 +152,8 @@ mod tests { .await .unwrap(); - assert_eq!( - message.cardano_transactions_signing_config, - Some(cardano_transactions_signing_config.clone()) - ); - assert_eq!( - message.next_cardano_transactions_signing_config, - Some(cardano_transactions_signing_config) - ); + assert!(message.cardano_transactions_signing_config.is_some()); + assert!(message.next_cardano_transactions_signing_config.is_some(),); } #[tokio::test] @@ -222,6 +223,52 @@ mod tests { ); } + #[tokio::test] + async fn get_epoch_settings_message_retrieves_signing_configuration_from_epoch_service() { + let current_epoch_settings = AggregatorEpochSettings { + cardano_transactions_signing_config: CardanoTransactionsSigningConfig::new( + BlockNumber(100), + BlockNumber(15), + ), + ..AggregatorEpochSettings::dummy() + }; + let next_epoch_settings = AggregatorEpochSettings { + cardano_transactions_signing_config: CardanoTransactionsSigningConfig::new( + BlockNumber(200), + BlockNumber(15), + ), + ..AggregatorEpochSettings::dummy() + }; + + let epoch_service = FakeEpochService::with_data( + Epoch(1), + ¤t_epoch_settings, + &next_epoch_settings, + &AggregatorEpochSettings::dummy(), + &fake_data::signers_with_stakes(5), + &fake_data::signers_with_stakes(3), + ); + + let message = get_epoch_settings_message( + Arc::new(RwLock::new(epoch_service)), + SignedEntityConfig::dummy(), + ) + .await + .unwrap(); + + // TODO: What we expect ? see #1963 Discrepancy of protocol parameters in epoch settings and pending certificates routes + // https://github.com/input-output-hk/mithril/issues/1963 + // TODO if they need to be aligned with protocol parameters, we may assert in the same test + assert_eq!( + message.cardano_transactions_signing_config, + Some(current_epoch_settings.cardano_transactions_signing_config), + ); + assert_eq!( + message.next_cardano_transactions_signing_config, + Some(next_epoch_settings.cardano_transactions_signing_config), + ); + } + #[tokio::test] async fn test_epoch_settings_get_ok() { let method = Method::GET.as_str(); diff --git a/mithril-aggregator/src/services/epoch_service.rs b/mithril-aggregator/src/services/epoch_service.rs index 6057cb49fad..b2b4ce5c000 100644 --- a/mithril-aggregator/src/services/epoch_service.rs +++ b/mithril-aggregator/src/services/epoch_service.rs @@ -5,7 +5,9 @@ use std::sync::Arc; use thiserror::Error; use mithril_common::crypto_helper::ProtocolAggregateVerificationKey; -use mithril_common::entities::{Epoch, ProtocolParameters, Signer, SignerWithStake}; +use mithril_common::entities::{ + CardanoTransactionsSigningConfig, Epoch, ProtocolParameters, Signer, SignerWithStake, +}; use mithril_common::protocol::{MultiSigner as ProtocolMultiSigner, SignerBuilder}; use mithril_common::StdResult; @@ -59,6 +61,21 @@ pub trait EpochService: Sync + Send { /// Get upcoming protocol parameters used in next epoch (associated with the next epoch) fn upcoming_protocol_parameters(&self) -> StdResult<&ProtocolParameters>; + /// Get cardano transactions signing configuration used in current epoch (associated with the previous epoch) + fn current_cardano_transactions_signing_config( + &self, + ) -> StdResult<&CardanoTransactionsSigningConfig>; + + /// Get next cardano transactions signing configuration used in next epoch (associated with the actual epoch) + fn next_cardano_transactions_signing_config( + &self, + ) -> StdResult<&CardanoTransactionsSigningConfig>; + + /// Get upcoming cardano transactions signing configuration used in next epoch (associated with the next epoch) + fn upcoming_cardano_transactions_signing_config( + &self, + ) -> StdResult<&CardanoTransactionsSigningConfig>; + /// Get aggregate verification key for current epoch fn current_aggregate_verification_key(&self) -> StdResult<&ProtocolAggregateVerificationKey>; @@ -301,6 +318,33 @@ impl EpochService for MithrilEpochService { .protocol_parameters) } + fn current_cardano_transactions_signing_config( + &self, + ) -> StdResult<&CardanoTransactionsSigningConfig> { + Ok(&self + .unwrap_data()? + .epoch_settings + .cardano_transactions_signing_config) + } + + fn next_cardano_transactions_signing_config( + &self, + ) -> StdResult<&CardanoTransactionsSigningConfig> { + Ok(&self + .unwrap_data()? + .next_epoch_settings + .cardano_transactions_signing_config) + } + + fn upcoming_cardano_transactions_signing_config( + &self, + ) -> StdResult<&CardanoTransactionsSigningConfig> { + Ok(&self + .unwrap_data()? + .upcoming_epoch_settings + .cardano_transactions_signing_config) + } + fn current_aggregate_verification_key(&self) -> StdResult<&ProtocolAggregateVerificationKey> { Ok(&self.unwrap_computed_data()?.aggregate_verification_key) } @@ -509,6 +553,33 @@ impl EpochService for FakeEpochService { .protocol_parameters) } + fn current_cardano_transactions_signing_config( + &self, + ) -> StdResult<&CardanoTransactionsSigningConfig> { + Ok(&self + .unwrap_data()? + .epoch_settings + .cardano_transactions_signing_config) + } + + fn next_cardano_transactions_signing_config( + &self, + ) -> StdResult<&CardanoTransactionsSigningConfig> { + Ok(&self + .unwrap_data()? + .next_epoch_settings + .cardano_transactions_signing_config) + } + + fn upcoming_cardano_transactions_signing_config( + &self, + ) -> StdResult<&CardanoTransactionsSigningConfig> { + Ok(&self + .unwrap_data()? + .upcoming_epoch_settings + .cardano_transactions_signing_config) + } + fn current_aggregate_verification_key(&self) -> StdResult<&ProtocolAggregateVerificationKey> { Ok(&self.unwrap_computed_data()?.aggregate_verification_key) } From 2d501703b5639f58c0522d6db7e165af8ec3c44c Mon Sep 17 00:00:00 2001 From: Damien Lachaume <135982616+dlachaume@users.noreply.github.com> Date: Fri, 27 Sep 2024 17:59:41 +0200 Subject: [PATCH 107/274] Fix typos MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Sébastien Fauvel --- mithril-aggregator/src/dependency_injection/containers.rs | 2 +- mithril-aggregator/src/store/epoch_settings_storer.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mithril-aggregator/src/dependency_injection/containers.rs b/mithril-aggregator/src/dependency_injection/containers.rs index 91a2b57e990..f6f8e8dd55d 100644 --- a/mithril-aggregator/src/dependency_injection/containers.rs +++ b/mithril-aggregator/src/dependency_injection/containers.rs @@ -211,7 +211,7 @@ impl DependencyContainer { }, ) .await - .expect("save_protocol_parameters should not fail"); + .expect("save_epoch_settings should not fail"); self.fill_verification_key_store(*epoch, &fixture.signers_with_stake()) .await; self.fill_stakes_store(*epoch, fixture.signers_with_stake()) diff --git a/mithril-aggregator/src/store/epoch_settings_storer.rs b/mithril-aggregator/src/store/epoch_settings_storer.rs index fde40d77639..21165771da1 100644 --- a/mithril-aggregator/src/store/epoch_settings_storer.rs +++ b/mithril-aggregator/src/store/epoch_settings_storer.rs @@ -9,7 +9,7 @@ use mithril_common::entities::{Epoch, ProtocolParameters}; use crate::entities::AggregatorEpochSettings; -/// Store and get [protocol parameters][ProtocolParameters] for given epoch. +/// Store and get [aggregator epoch settings][AggregatorEpochSettings] for given epoch. #[async_trait] pub trait EpochSettingsStorer: Sync + Send { /// Save the given `AggregatorEpochSettings` for the given [Epoch]. From 24f62d16c8d69df24e375801118a782bb9cf8c34 Mon Sep 17 00:00:00 2001 From: Damien Lachaume <135982616+dlachaume@users.noreply.github.com> Date: Mon, 30 Sep 2024 12:01:19 +0200 Subject: [PATCH 108/274] Adapt test that save future epoch settings in store by retrieving Epoch settings instead of Protocol Parameters --- mithril-aggregator/src/services/epoch_service.rs | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/mithril-aggregator/src/services/epoch_service.rs b/mithril-aggregator/src/services/epoch_service.rs index b2b4ce5c000..c1d93cfb75d 100644 --- a/mithril-aggregator/src/services/epoch_service.rs +++ b/mithril-aggregator/src/services/epoch_service.rs @@ -887,7 +887,6 @@ mod tests { #[tokio::test] async fn update_epoch_settings_insert_future_epoch_settings_in_the_store() { let fixture = MithrilFixtureBuilder::default().with_signers(3).build(); - // TODO use epoch_settings let future_protocol_parameters = ProtocolParameters::new(6, 89, 0.124); let epoch = Epoch(4); let mut service = build_service( @@ -908,21 +907,21 @@ mod tests { .await .expect("update_epoch_settings should not fail"); - // TODO use epoch_settings - let inserted_protocol_parameters = service + let inserted_epoch_settings = service .epoch_settings_storer - .get_protocol_parameters(epoch.offset_to_epoch_settings_recording_epoch()) + .get_epoch_settings(epoch.offset_to_epoch_settings_recording_epoch()) .await .unwrap_or_else(|_| { panic!( "epoch settings should have been inserted for epoch {}", epoch.offset_to_epoch_settings_recording_epoch() ) - }); + }) + .unwrap(); assert_eq!( - inserted_protocol_parameters, - Some(future_protocol_parameters) + inserted_epoch_settings.protocol_parameters, + future_protocol_parameters ); } From 849ae86586da50fbe6412750458fec716115cbe6 Mon Sep 17 00:00:00 2001 From: Damien Lachaume <135982616+dlachaume@users.noreply.github.com> Date: Mon, 30 Sep 2024 16:35:32 +0200 Subject: [PATCH 109/274] Minor changes after PR review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - fix functions renaming - simplify `init_epoch_settings_storer` parameters - remove unused function `upcoming_cardano_transactions_signing_config` Co-authored-by: Sébastien Fauvel --- .../repository/epoch_settings_store.rs | 4 +-- .../src/dependency_injection/containers.rs | 25 +++++----------- .../src/http_server/routes/epoch_routes.rs | 5 ---- .../src/services/epoch_service.rs | 29 ++----------------- .../src/store/epoch_settings_storer.rs | 1 + 5 files changed, 13 insertions(+), 51 deletions(-) diff --git a/mithril-aggregator/src/database/repository/epoch_settings_store.rs b/mithril-aggregator/src/database/repository/epoch_settings_store.rs index 65ade79cc78..1416eba2f66 100644 --- a/mithril-aggregator/src/database/repository/epoch_settings_store.rs +++ b/mithril-aggregator/src/database/repository/epoch_settings_store.rs @@ -56,7 +56,7 @@ impl EpochSettingsStorer for EpochSettingsStore { .count(); } - Ok(Some(AggregatorEpochSettings::from(epoch_settings_record))) + Ok(Some(epoch_settings_record.into())) } async fn get_protocol_parameters(&self, epoch: Epoch) -> StdResult> { @@ -73,7 +73,7 @@ impl EpochSettingsStorer for EpochSettingsStore { .map_err(|e| AdapterError::GeneralError(e.context("Could not get epoch settings")))?; if let Some(epoch_settings_record) = cursor.next() { - return Ok(Some(AggregatorEpochSettings::from(epoch_settings_record))); + return Ok(Some(epoch_settings_record.into())); } Ok(None) } diff --git a/mithril-aggregator/src/dependency_injection/containers.rs b/mithril-aggregator/src/dependency_injection/containers.rs index f6f8e8dd55d..73fac4805ff 100644 --- a/mithril-aggregator/src/dependency_injection/containers.rs +++ b/mithril-aggregator/src/dependency_injection/containers.rs @@ -234,10 +234,10 @@ impl DependencyContainer { genesis_protocol_parameters: &ProtocolParameters, cardano_transactions_signing_config: &CardanoTransactionsSigningConfig, ) { - self.init_protocol_parameter_store( - genesis_protocol_parameters, - cardano_transactions_signing_config, - ) + self.init_epoch_settings_storer(&AggregatorEpochSettings { + protocol_parameters: genesis_protocol_parameters.clone(), + cardano_transactions_signing_config: cardano_transactions_signing_config.clone(), + }) .await; let (work_epoch, epoch_to_sign) = self.get_genesis_epochs().await; @@ -252,12 +252,8 @@ impl DependencyContainer { /// `TEST METHOD ONLY` /// - /// Fill up to the first three epochs of the [ProtocolParametersStore] with the given value. - pub async fn init_protocol_parameter_store( - &self, - protocol_parameters: &ProtocolParameters, - cardano_transactions_signing_config: &CardanoTransactionsSigningConfig, - ) { + /// Fill up to the first three epochs of the [EpochSettingsStorer] with the given value. + pub async fn init_epoch_settings_storer(&self, epoch_settings: &AggregatorEpochSettings) { let (work_epoch, epoch_to_sign) = self.get_genesis_epochs().await; let mut epochs_to_save = Vec::new(); epochs_to_save.push(work_epoch); @@ -265,14 +261,7 @@ impl DependencyContainer { epochs_to_save.push(epoch_to_sign.next()); for epoch in epochs_to_save { self.epoch_settings_storer - .save_epoch_settings( - epoch, - AggregatorEpochSettings { - protocol_parameters: protocol_parameters.clone(), - cardano_transactions_signing_config: cardano_transactions_signing_config - .clone(), - }, - ) + .save_epoch_settings(epoch, epoch_settings.clone()) .await .expect("save_epoch_settings should not fail"); } diff --git a/mithril-aggregator/src/http_server/routes/epoch_routes.rs b/mithril-aggregator/src/http_server/routes/epoch_routes.rs index 9a77c3d4266..77463cef2c0 100644 --- a/mithril-aggregator/src/http_server/routes/epoch_routes.rs +++ b/mithril-aggregator/src/http_server/routes/epoch_routes.rs @@ -211,8 +211,6 @@ mod tests { .await .unwrap(); - // TODO: What we expect ? see #1963 Discrepancy of protocol parameters in epoch settings and pending certificates routes - // https://github.com/input-output-hk/mithril/issues/1963 assert_eq!( message.protocol_parameters, next_epoch_settings.protocol_parameters @@ -256,9 +254,6 @@ mod tests { .await .unwrap(); - // TODO: What we expect ? see #1963 Discrepancy of protocol parameters in epoch settings and pending certificates routes - // https://github.com/input-output-hk/mithril/issues/1963 - // TODO if they need to be aligned with protocol parameters, we may assert in the same test assert_eq!( message.cardano_transactions_signing_config, Some(current_epoch_settings.cardano_transactions_signing_config), diff --git a/mithril-aggregator/src/services/epoch_service.rs b/mithril-aggregator/src/services/epoch_service.rs index c1d93cfb75d..296a3a276ae 100644 --- a/mithril-aggregator/src/services/epoch_service.rs +++ b/mithril-aggregator/src/services/epoch_service.rs @@ -39,7 +39,7 @@ pub trait EpochService: Sync + Send { /// internal state for the new epoch. async fn inform_epoch(&mut self, epoch: Epoch) -> StdResult<()>; - /// Insert future epoch settings in the store based on this service current epoch. + /// Insert future epoch settings in the store based on this service current epoch (epoch offset +2). /// /// Note: must be called after `inform_epoch`. async fn update_epoch_settings(&mut self) -> StdResult<()>; @@ -61,21 +61,16 @@ pub trait EpochService: Sync + Send { /// Get upcoming protocol parameters used in next epoch (associated with the next epoch) fn upcoming_protocol_parameters(&self) -> StdResult<&ProtocolParameters>; - /// Get cardano transactions signing configuration used in current epoch (associated with the previous epoch) + /// Get cardano transactions signing configuration used in current epoch fn current_cardano_transactions_signing_config( &self, ) -> StdResult<&CardanoTransactionsSigningConfig>; - /// Get next cardano transactions signing configuration used in next epoch (associated with the actual epoch) + /// Get next cardano transactions signing configuration used in next epoch fn next_cardano_transactions_signing_config( &self, ) -> StdResult<&CardanoTransactionsSigningConfig>; - /// Get upcoming cardano transactions signing configuration used in next epoch (associated with the next epoch) - fn upcoming_cardano_transactions_signing_config( - &self, - ) -> StdResult<&CardanoTransactionsSigningConfig>; - /// Get aggregate verification key for current epoch fn current_aggregate_verification_key(&self) -> StdResult<&ProtocolAggregateVerificationKey>; @@ -336,15 +331,6 @@ impl EpochService for MithrilEpochService { .cardano_transactions_signing_config) } - fn upcoming_cardano_transactions_signing_config( - &self, - ) -> StdResult<&CardanoTransactionsSigningConfig> { - Ok(&self - .unwrap_data()? - .upcoming_epoch_settings - .cardano_transactions_signing_config) - } - fn current_aggregate_verification_key(&self) -> StdResult<&ProtocolAggregateVerificationKey> { Ok(&self.unwrap_computed_data()?.aggregate_verification_key) } @@ -571,15 +557,6 @@ impl EpochService for FakeEpochService { .cardano_transactions_signing_config) } - fn upcoming_cardano_transactions_signing_config( - &self, - ) -> StdResult<&CardanoTransactionsSigningConfig> { - Ok(&self - .unwrap_data()? - .upcoming_epoch_settings - .cardano_transactions_signing_config) - } - fn current_aggregate_verification_key(&self) -> StdResult<&ProtocolAggregateVerificationKey> { Ok(&self.unwrap_computed_data()?.aggregate_verification_key) } diff --git a/mithril-aggregator/src/store/epoch_settings_storer.rs b/mithril-aggregator/src/store/epoch_settings_storer.rs index 21165771da1..d90c4a67374 100644 --- a/mithril-aggregator/src/store/epoch_settings_storer.rs +++ b/mithril-aggregator/src/store/epoch_settings_storer.rs @@ -80,6 +80,7 @@ impl EpochSettingsStorer for FakeEpochSettingsStorer { async fn get_epoch_settings(&self, epoch: Epoch) -> StdResult> { let epoch_settings = self.epoch_settings.read().await; + Ok(epoch_settings.get(&epoch).cloned()) } } From 00fea10a12603b385305b0ba634dafb2d7c573e6 Mon Sep 17 00:00:00 2001 From: Damien Lachaume <135982616+dlachaume@users.noreply.github.com> Date: Mon, 30 Sep 2024 16:37:13 +0200 Subject: [PATCH 110/274] Remove inappropriate `Default` implementation on structs --- mithril-aggregator/src/database/record/certificate.rs | 6 +++++- mithril-common/src/entities/certificate_metadata.rs | 2 +- mithril-common/src/entities/mithril_stake_distribution.rs | 3 ++- mithril-common/src/entities/protocol_parameters.rs | 3 +-- mithril-common/src/messages/epoch_settings.rs | 6 +++--- .../src/messages/message_parts/certificate_metadata.rs | 2 +- mithril-common/src/messages/mithril_stake_distribution.rs | 2 +- mithril-signer/src/entities/signer_epoch_settings.rs | 2 +- mithril-signer/tests/test_extensions/certificate_handler.rs | 5 ++++- 9 files changed, 19 insertions(+), 12 deletions(-) diff --git a/mithril-aggregator/src/database/record/certificate.rs b/mithril-aggregator/src/database/record/certificate.rs index 5104ffe16c7..c12ec89dcc8 100644 --- a/mithril-aggregator/src/database/record/certificate.rs +++ b/mithril-aggregator/src/database/record/certificate.rs @@ -141,7 +141,11 @@ impl CertificateRecord { immutable_file_number, signed_entity_type, protocol_version: "protocol_version".to_string(), - protocol_parameters: Default::default(), + protocol_parameters: ProtocolParameters { + k: 0, + m: 0, + phi_f: 0.0, + }, protocol_message: Default::default(), signers: vec![], initiated_at: DateTime::parse_from_rfc3339("2024-02-12T13:11:47Z") diff --git a/mithril-common/src/entities/certificate_metadata.rs b/mithril-common/src/entities/certificate_metadata.rs index efdcab3415e..15e901e3a02 100644 --- a/mithril-common/src/entities/certificate_metadata.rs +++ b/mithril-common/src/entities/certificate_metadata.rs @@ -46,7 +46,7 @@ impl StakeDistributionParty { era_deprecate!("Remove immutable file number as it's here only for message backward-compatibility"); /// CertificateMetadata represents the metadata associated to a Certificate -#[derive(Clone, Debug, PartialEq, Default)] +#[derive(Clone, Debug, PartialEq)] pub struct CertificateMetadata { /// Cardano network pub network: String, diff --git a/mithril-common/src/entities/mithril_stake_distribution.rs b/mithril-common/src/entities/mithril_stake_distribution.rs index 1f425f9375e..d57647608c4 100644 --- a/mithril-common/src/entities/mithril_stake_distribution.rs +++ b/mithril-common/src/entities/mithril_stake_distribution.rs @@ -115,7 +115,8 @@ mod tests { .signers_with_stake(); let protocol_parameters = ProtocolParameters { k: 100, - ..Default::default() + m: 0, + phi_f: 0.0, }; let stake_distribution = MithrilStakeDistribution::new(Epoch(1), signers, &protocol_parameters); diff --git a/mithril-common/src/entities/protocol_parameters.rs b/mithril-common/src/entities/protocol_parameters.rs index 34fda89e9a6..346c51445f2 100644 --- a/mithril-common/src/entities/protocol_parameters.rs +++ b/mithril-common/src/entities/protocol_parameters.rs @@ -3,8 +3,7 @@ use serde::{Deserialize, Serialize}; use sha2::{Digest, Sha256}; /// Protocol cryptographic parameters -// TODO: `Default` should be removed. There is no functional sense in having a default value for this struct. -#[derive(Clone, Debug, Default, Serialize, Deserialize)] +#[derive(Clone, Debug, Serialize, Deserialize)] pub struct ProtocolParameters { /// Quorum parameter pub k: u64, diff --git a/mithril-common/src/messages/epoch_settings.rs b/mithril-common/src/messages/epoch_settings.rs index 197da16944c..f85421e5959 100644 --- a/mithril-common/src/messages/epoch_settings.rs +++ b/mithril-common/src/messages/epoch_settings.rs @@ -3,7 +3,7 @@ use crate::messages::SignerMessagePart; use serde::{Deserialize, Serialize}; /// EpochSettings represents the settings of an epoch -#[derive(Clone, Debug, PartialEq, Default, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct EpochSettingsMessage { /// Current Epoch pub epoch: Epoch, @@ -93,7 +93,7 @@ mod tests { }"#; // Supported structure until OpenAPI version 0.1.28. - #[derive(Clone, Debug, PartialEq, Default, Serialize, Deserialize)] + #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct EpochSettingsMessageUntilV0_1_28 { /// Current Epoch pub epoch: Epoch, @@ -108,7 +108,7 @@ mod tests { } // Supported structure until OpenAPI version 0.1.29. - #[derive(Clone, Debug, PartialEq, Default, Serialize, Deserialize)] + #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct EpochSettingsMessageUntilV0_1_29 { /// Current Epoch pub epoch: Epoch, diff --git a/mithril-common/src/messages/message_parts/certificate_metadata.rs b/mithril-common/src/messages/message_parts/certificate_metadata.rs index 222b3311f99..3940a90697d 100644 --- a/mithril-common/src/messages/message_parts/certificate_metadata.rs +++ b/mithril-common/src/messages/message_parts/certificate_metadata.rs @@ -4,7 +4,7 @@ use chrono::{DateTime, Duration, Utc}; use serde::{Deserialize, Serialize}; /// CertificateMetadata represents the metadata associated to a Certificate -#[derive(Clone, Debug, PartialEq, Default, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct CertificateMetadataMessagePart { /// Cardano network /// part of METADATA(p,n) diff --git a/mithril-common/src/messages/mithril_stake_distribution.rs b/mithril-common/src/messages/mithril_stake_distribution.rs index 235d48a2356..02b7056d78e 100644 --- a/mithril-common/src/messages/mithril_stake_distribution.rs +++ b/mithril-common/src/messages/mithril_stake_distribution.rs @@ -9,7 +9,7 @@ use crate::test_utils::fake_data; use super::SignerWithStakeMessagePart; /// Message structure of a Mithril Stake Distribution -#[derive(Clone, Debug, PartialEq, Default, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct MithrilStakeDistributionMessage { /// Epoch at which the Mithril Stake Distribution is created pub epoch: Epoch, diff --git a/mithril-signer/src/entities/signer_epoch_settings.rs b/mithril-signer/src/entities/signer_epoch_settings.rs index faa1208c237..001e7746b84 100644 --- a/mithril-signer/src/entities/signer_epoch_settings.rs +++ b/mithril-signer/src/entities/signer_epoch_settings.rs @@ -3,7 +3,7 @@ use mithril_common::entities::{ }; /// SignerEpochSettings represents the settings of an epoch -#[derive(Clone, Debug, PartialEq, Default)] +#[derive(Clone, Debug, PartialEq)] pub struct SignerEpochSettings { /// Current Epoch pub epoch: Epoch, diff --git a/mithril-signer/tests/test_extensions/certificate_handler.rs b/mithril-signer/tests/test_extensions/certificate_handler.rs index 6e24549e48c..becb8988304 100644 --- a/mithril-signer/tests/test_extensions/certificate_handler.rs +++ b/mithril-signer/tests/test_extensions/certificate_handler.rs @@ -108,7 +108,10 @@ impl AggregatorClient for FakeAggregator { epoch: time_point.epoch, current_signers, next_signers, - ..Default::default() + protocol_parameters: fake_data::protocol_parameters(), + next_protocol_parameters: fake_data::protocol_parameters(), + cardano_transactions_signing_config: None, + next_cardano_transactions_signing_config: None, })) } } From a81fa853490e442bb65aef935a753986b6c7d615 Mon Sep 17 00:00:00 2001 From: Damien Lachaume <135982616+dlachaume@users.noreply.github.com> Date: Tue, 1 Oct 2024 10:50:50 +0200 Subject: [PATCH 111/274] Add missing test cases when accessing to cardano signing configurations before calling `inform_epoch` --- mithril-aggregator/src/services/epoch_service.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/mithril-aggregator/src/services/epoch_service.rs b/mithril-aggregator/src/services/epoch_service.rs index 296a3a276ae..91597431a15 100644 --- a/mithril-aggregator/src/services/epoch_service.rs +++ b/mithril-aggregator/src/services/epoch_service.rs @@ -924,6 +924,14 @@ mod tests { "upcoming_protocol_parameters", service.upcoming_protocol_parameters().err(), ), + ( + "current_cardano_transactions_signing_config", + service.current_cardano_transactions_signing_config().err(), + ), + ( + "next_cardano_transactions_signing_config", + service.next_cardano_transactions_signing_config().err(), + ), ( "current_signers_with_stake", service.current_signers_with_stake().err(), From 058f6ed94f22db770059fb6a956281bf63371b23 Mon Sep 17 00:00:00 2001 From: Damien Lachaume <135982616+dlachaume@users.noreply.github.com> Date: Tue, 1 Oct 2024 11:46:46 +0200 Subject: [PATCH 112/274] Change `get_epoch_settings_configuration` result type to dedicated `Result` --- mithril-aggregator/src/dependency_injection/builder.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mithril-aggregator/src/dependency_injection/builder.rs b/mithril-aggregator/src/dependency_injection/builder.rs index 09d149b22bd..a0f1d3b6493 100644 --- a/mithril-aggregator/src/dependency_injection/builder.rs +++ b/mithril-aggregator/src/dependency_injection/builder.rs @@ -44,7 +44,7 @@ use mithril_common::{ TransactionsImporter, }, signed_entity_type_lock::SignedEntityTypeLock, - MithrilTickerService, StdResult, TickerService, + MithrilTickerService, TickerService, }; use mithril_persistence::{ database::{repository::CardanoTransactionRepository, ApplicationNodeType, SqlMigration}, @@ -1317,7 +1317,7 @@ impl DependenciesBuilder { Ok(self.single_signer_authenticator.as_ref().cloned().unwrap()) } - fn get_epoch_settings_configuration(&mut self) -> StdResult { + fn get_epoch_settings_configuration(&mut self) -> Result { let epoch_settings = AggregatorEpochSettings { protocol_parameters: self.configuration.protocol_parameters.clone(), cardano_transactions_signing_config: self From d0ff532d7bef19df0d3cc70d19fed5d36f066a74 Mon Sep 17 00:00:00 2001 From: Damien Lachaume <135982616+dlachaume@users.noreply.github.com> Date: Tue, 1 Oct 2024 11:56:26 +0200 Subject: [PATCH 113/274] Enrich `ExpectedEpochData` with cardano signing config fields --- mithril-aggregator/src/services/epoch_service.rs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/mithril-aggregator/src/services/epoch_service.rs b/mithril-aggregator/src/services/epoch_service.rs index 91597431a15..fab60ac3c54 100644 --- a/mithril-aggregator/src/services/epoch_service.rs +++ b/mithril-aggregator/src/services/epoch_service.rs @@ -608,6 +608,8 @@ mod tests { epoch: Epoch, protocol_parameters: ProtocolParameters, next_protocol_parameters: ProtocolParameters, + cardano_signing_config: CardanoTransactionsSigningConfig, + next_cardano_signing_config: CardanoTransactionsSigningConfig, upcoming_protocol_parameters: ProtocolParameters, current_signers_with_stake: BTreeSet, next_signers_with_stake: BTreeSet, @@ -628,6 +630,12 @@ mod tests { protocol_parameters: service.current_protocol_parameters()?.clone(), next_protocol_parameters: service.next_protocol_parameters()?.clone(), upcoming_protocol_parameters: service.upcoming_protocol_parameters()?.clone(), + cardano_signing_config: service + .current_cardano_transactions_signing_config()? + .clone(), + next_cardano_signing_config: service + .next_cardano_transactions_signing_config()? + .clone(), current_signers_with_stake: service .current_signers_with_stake()? .clone() @@ -781,6 +789,8 @@ mod tests { protocol_parameters: current_epoch_fixture.protocol_parameters(), next_protocol_parameters: next_epoch_fixture.protocol_parameters(), upcoming_protocol_parameters, + cardano_signing_config: CardanoTransactionsSigningConfig::dummy(), + next_cardano_signing_config: CardanoTransactionsSigningConfig::dummy(), current_signers_with_stake: current_epoch_fixture .signers_with_stake() .into_iter() @@ -980,6 +990,10 @@ mod tests { assert!(service.current_protocol_parameters().is_ok()); assert!(service.next_protocol_parameters().is_ok()); assert!(service.upcoming_protocol_parameters().is_ok()); + assert!(service + .current_cardano_transactions_signing_config() + .is_ok()); + assert!(service.next_cardano_transactions_signing_config().is_ok()); assert!(service.current_signers_with_stake().is_ok()); assert!(service.next_signers_with_stake().is_ok()); assert!(service.current_signers().is_ok()); From 239e18ab5ae3ef76e348be298dca72dfafb7a5ea Mon Sep 17 00:00:00 2001 From: Damien Lachaume <135982616+dlachaume@users.noreply.github.com> Date: Mon, 30 Sep 2024 16:51:50 +0200 Subject: [PATCH 114/274] chore: bump crates versions * mithril-aggregator from `0.5.70` to `0.5.71` * mithril-common from `0.4.60` to `0.4.61` * mithril-signer from `0.2.188` to `0.2.189` --- Cargo.lock | 6 +++--- mithril-aggregator/Cargo.toml | 2 +- mithril-common/Cargo.toml | 2 +- mithril-signer/Cargo.toml | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 648e6aff7fa..fdb79b92f34 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3403,7 +3403,7 @@ dependencies = [ [[package]] name = "mithril-aggregator" -version = "0.5.70" +version = "0.5.71" dependencies = [ "anyhow", "async-trait", @@ -3559,7 +3559,7 @@ dependencies = [ [[package]] name = "mithril-common" -version = "0.4.60" +version = "0.4.61" dependencies = [ "anyhow", "async-trait", @@ -3703,7 +3703,7 @@ dependencies = [ [[package]] name = "mithril-signer" -version = "0.2.188" +version = "0.2.189" dependencies = [ "anyhow", "async-trait", diff --git a/mithril-aggregator/Cargo.toml b/mithril-aggregator/Cargo.toml index 400184d7970..74e5a80c480 100644 --- a/mithril-aggregator/Cargo.toml +++ b/mithril-aggregator/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-aggregator" -version = "0.5.70" +version = "0.5.71" description = "A Mithril Aggregator server" authors = { workspace = true } edition = { workspace = true } diff --git a/mithril-common/Cargo.toml b/mithril-common/Cargo.toml index 251ed7b4676..848967bdcae 100644 --- a/mithril-common/Cargo.toml +++ b/mithril-common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-common" -version = "0.4.60" +version = "0.4.61" description = "Common types, interfaces, and utilities for Mithril nodes." authors = { workspace = true } edition = { workspace = true } diff --git a/mithril-signer/Cargo.toml b/mithril-signer/Cargo.toml index 93cf4bde3ac..ac8edf0eb74 100644 --- a/mithril-signer/Cargo.toml +++ b/mithril-signer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-signer" -version = "0.2.188" +version = "0.2.189" description = "A Mithril Signer" authors = { workspace = true } edition = { workspace = true } From beaf38da60e06189982e836be621d3ce94fe033f Mon Sep 17 00:00:00 2001 From: Damien Lachaume <135982616+dlachaume@users.noreply.github.com> Date: Tue, 1 Oct 2024 12:49:34 +0200 Subject: [PATCH 115/274] fix: updating the empty existing stored configurations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Sébastien Fauvel --- .../repository/epoch_settings_store.rs | 88 ++++++++++++++++++- .../src/dependency_injection/builder.rs | 12 +++ 2 files changed, 99 insertions(+), 1 deletion(-) diff --git a/mithril-aggregator/src/database/repository/epoch_settings_store.rs b/mithril-aggregator/src/database/repository/epoch_settings_store.rs index 1416eba2f66..80491a7e6c7 100644 --- a/mithril-aggregator/src/database/repository/epoch_settings_store.rs +++ b/mithril-aggregator/src/database/repository/epoch_settings_store.rs @@ -2,10 +2,11 @@ use std::sync::Arc; use async_trait::async_trait; -use mithril_common::entities::{Epoch, ProtocolParameters}; +use mithril_common::entities::{CardanoTransactionsSigningConfig, Epoch, ProtocolParameters}; use mithril_common::StdResult; use mithril_persistence::sqlite::{ConnectionExtensions, SqliteConnection}; use mithril_persistence::store::adapter::AdapterError; +use sqlite::Value; use crate::database::query::{ DeleteEpochSettingsQuery, GetEpochSettingsQuery, UpdateEpochSettingsQuery, @@ -30,6 +31,28 @@ impl EpochSettingsStore { retention_limit, } } + + #[deprecated(since = "0.5.72", note = "temporary fix, should be removed")] + /// Replace empty JSON values '{}' injected with Migration #28 + pub fn replace_cardano_signing_config_empty_values( + &self, + cardano_signing_config: CardanoTransactionsSigningConfig, + ) -> StdResult<()> { + let query = r#" + update epoch_setting + set cardano_transactions_signing_config = ? + where cardano_transactions_signing_config == '{}'"#; + + let mut statement = self.connection.prepare(query)?; + statement.bind::<&[(_, Value)]>(&[( + 1, + serde_json::to_string(&cardano_signing_config)?.into(), + )])?; + + statement.next()?; + + Ok(()) + } } #[async_trait] @@ -81,10 +104,73 @@ impl EpochSettingsStorer for EpochSettingsStore { #[cfg(test)] mod tests { + use mithril_common::entities::BlockNumber; + use crate::database::test_helper::{insert_epoch_settings, main_db_connection}; use super::*; + #[tokio::test] + async fn replace_cardano_signing_config_empty_values_updates_only_empty_values() { + let connection = main_db_connection().unwrap(); + connection.execute( + r#"insert into epoch_setting (epoch_setting_id, protocol_parameters, cardano_transactions_signing_config) + values ( + 1, + '{"k": 5, "m": 100, "phi_f": 0.65}', + '{"security_parameter": 70, "step": 20}' + )"#, + ).unwrap(); + connection.execute( + r#"insert into epoch_setting (epoch_setting_id, protocol_parameters, cardano_transactions_signing_config) + values ( + 2, + '{"k": 73, "m": 100, "phi_f": 0.65}', + '{}' + )"#, + ).unwrap(); + + let store = EpochSettingsStore::new(Arc::new(connection), None); + + let epoch_settings = store.get_epoch_settings(Epoch(1)).await.unwrap().unwrap(); + assert_eq!( + CardanoTransactionsSigningConfig { + security_parameter: BlockNumber(70), + step: BlockNumber(20), + }, + epoch_settings.cardano_transactions_signing_config + ); + + #[allow(deprecated)] + store + .replace_cardano_signing_config_empty_values(CardanoTransactionsSigningConfig { + security_parameter: BlockNumber(50), + step: BlockNumber(10), + }) + .unwrap(); + + { + let epoch_settings = store.get_epoch_settings(Epoch(1)).await.unwrap().unwrap(); + assert_eq!( + CardanoTransactionsSigningConfig { + security_parameter: BlockNumber(70), + step: BlockNumber(20), + }, + epoch_settings.cardano_transactions_signing_config + ); + } + { + let epoch_settings = store.get_epoch_settings(Epoch(2)).await.unwrap().unwrap(); + assert_eq!( + CardanoTransactionsSigningConfig { + security_parameter: BlockNumber(50), + step: BlockNumber(10), + }, + epoch_settings.cardano_transactions_signing_config + ); + } + } + #[tokio::test] async fn save_epoch_settings_prune_older_epoch_settings() { const EPOCH_SETTINGS_PRUNE_EPOCH_THRESHOLD: u64 = 5; diff --git a/mithril-aggregator/src/dependency_injection/builder.rs b/mithril-aggregator/src/dependency_injection/builder.rs index a0f1d3b6493..552bfcee96f 100644 --- a/mithril-aggregator/src/dependency_injection/builder.rs +++ b/mithril-aggregator/src/dependency_injection/builder.rs @@ -579,6 +579,18 @@ impl DependenciesBuilder { message: "cannot build aggregator runner: no epoch returned.".to_string(), error: None, })?; + + { + // Temporary fix, should be removed + // Replace empty JSON values '{}' injected with Migration #28 + let cardano_signing_config = self + .get_signed_entity_config()? + .cardano_transactions_signing_config; + #[allow(deprecated)] + epoch_settings_store + .replace_cardano_signing_config_empty_values(cardano_signing_config)?; + } + epoch_settings_store .handle_discrepancies_at_startup( current_epoch, From 0939f5624fc4e4e2fcef02c5a5a44b40c4cc6727 Mon Sep 17 00:00:00 2001 From: sfauvel Date: Tue, 1 Oct 2024 16:20:16 +0200 Subject: [PATCH 116/274] Upgrade crate versions * mithril-aggregator from `0.5.71` to `0.5.72` --- Cargo.lock | 2 +- mithril-aggregator/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index fdb79b92f34..79dc05eeddc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3403,7 +3403,7 @@ dependencies = [ [[package]] name = "mithril-aggregator" -version = "0.5.71" +version = "0.5.72" dependencies = [ "anyhow", "async-trait", diff --git a/mithril-aggregator/Cargo.toml b/mithril-aggregator/Cargo.toml index 74e5a80c480..9cb07656cb8 100644 --- a/mithril-aggregator/Cargo.toml +++ b/mithril-aggregator/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-aggregator" -version = "0.5.71" +version = "0.5.72" description = "A Mithril Aggregator server" authors = { workspace = true } edition = { workspace = true } From 342d1de35a79625e01b0582177a22cc08f399e22 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Wed, 2 Oct 2024 11:06:32 +0200 Subject: [PATCH 117/274] docs: update 'Certification of Cardano transactions' dev blog post Cardano transactions certification has been activated. --- .../index.md | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/docs/website/blog/2024-07-30-cardano-transaction-certification/index.md b/docs/website/blog/2024-07-30-cardano-transaction-certification/index.md index b8563a4ced8..be57f254582 100644 --- a/docs/website/blog/2024-07-30-cardano-transaction-certification/index.md +++ b/docs/website/blog/2024-07-30-cardano-transaction-certification/index.md @@ -7,9 +7,17 @@ tags: [certification, cardano transaction] ### Certification of Cardano transactions -:::info +:::info Update 2024/10/02 -A threshold of at least **75%** of the stake running version `0.2.182` (within **10** days after the distribution `2437` is released) is mandatory in order to activate the certification of the Cardano transactions on the `release-mainnet` network. +We have activated the **Cardano transactions certification** on the `release-mainnet` network. + +::: + +:::info Update 2024/09/25 + +We have shipped stable support for the **Cardano transaction certification** with distribution [2437](https://github.com/input-output-hk/mithril/releases/tag/2437.1). + +A threshold of at least **70%** of the stake running version `0.2.182` (within **10** days after the distribution `2437` is released) is mandatory in order to activate the certification of the Cardano transactions on the `release-mainnet` network. The [Mithril Protocol Insights](https://lookerstudio.google.com/u/0/reporting/8b05ea4b-6a43-45ea-aef2-237906ec7a42?s=oi6CR5eZrnQ) dashboard displays the adoption rate of the different signer versions on the `release-mainnet` network. @@ -25,6 +33,6 @@ The roll-out plan of the feature is the following: - [x] Activation of the certification of **Cardano transactions** in the `pre-release-preview` network. - [x] Activation of the certification of **Cardano transactions** in the `release-preprod` network. - [x] Distribution [2437](https://github.com/input-output-hk/mithril/releases/tag/2437.1) (after the **Chang** hardfork): - - [ ] Activation of the certification of **Cardano transactions** in the `release-mainnet` network. + - [x] Activation of the certification of **Cardano transactions** in the `release-mainnet` network. For any inquiries or assistance, don't hesitate to reach out to the team on the [Discord channel](https://discord.gg/5kaErDKDRq). From 433befd2072d31cdb61d289348e998f6b1ef672f Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Fri, 20 Sep 2024 16:13:16 +0200 Subject: [PATCH 118/274] feat: scaffold a certifier service in signer to compute the beacon to sign --- Cargo.lock | 1 + mithril-signer/Cargo.toml | 1 + mithril-signer/src/services/certifier.rs | 72 ++++++++++++++++++++++++ mithril-signer/src/services/mod.rs | 2 + 4 files changed, 76 insertions(+) create mode 100644 mithril-signer/src/services/certifier.rs diff --git a/Cargo.lock b/Cargo.lock index 79dc05eeddc..07ed7c1a705 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3708,6 +3708,7 @@ dependencies = [ "anyhow", "async-trait", "axum", + "chrono", "clap", "config", "criterion", diff --git a/mithril-signer/Cargo.toml b/mithril-signer/Cargo.toml index ac8edf0eb74..8332f8e749a 100644 --- a/mithril-signer/Cargo.toml +++ b/mithril-signer/Cargo.toml @@ -17,6 +17,7 @@ harness = false anyhow = "1.0.86" async-trait = "0.1.82" axum = "0.7.5" +chrono = { version = "0.4.38", features = ["serde"] } clap = { version = "4.5.17", features = ["derive", "env"] } config = "0.14.0" hex = "0.4.3" diff --git a/mithril-signer/src/services/certifier.rs b/mithril-signer/src/services/certifier.rs new file mode 100644 index 00000000000..a0de0e47d7e --- /dev/null +++ b/mithril-signer/src/services/certifier.rs @@ -0,0 +1,72 @@ +use async_trait::async_trait; +use chrono::{DateTime, Utc}; +use std::sync::Arc; + +use mithril_common::entities::{Epoch, SignedEntityType}; +use mithril_common::signed_entity_type_lock::SignedEntityTypeLock; +use mithril_common::StdResult; + +/// Beacon to sign +#[derive(Debug, Clone, PartialEq)] +pub struct BeaconToSign { + /// The epoch when the beacon was issued + pub epoch: Epoch, + + /// The signed entity type to sign + pub signed_entity_type: SignedEntityType, + + /// Datetime when the beacon was initiated + pub initiated_at: DateTime, +} + +/// Certifier Service +/// +/// This service is responsible for providing the beacons that need to be signed by the signer. +#[cfg_attr(test, mockall::automock)] +#[async_trait] +pub trait CertifierService: Sync + Send { + /// Get the beacon to sign. + /// + /// If all available signed entity have already been signed, `None` is returned. + async fn get_beacon_to_sign(&self) -> StdResult>; +} + +/// Implementation of the [Certifier Service][CertifierService] for the Mithril Signer. +pub struct SignerCertifierService { + signed_entity_type_lock: Arc, +} + +impl SignerCertifierService { + /// Create a new `SignerCertifierService` instance. + pub fn new(signed_entity_type_lock: Arc) -> Self { + Self { + signed_entity_type_lock, + } + } +} + +#[async_trait] +impl CertifierService for SignerCertifierService { + async fn get_beacon_to_sign(&self) -> StdResult> { + Ok(None) + } +} + +#[cfg(test)] +mod tests { + use mithril_common::entities::SignedEntityTypeDiscriminants; + + use super::*; + + #[tokio::test] + async fn no_beacon_can_be_signed_if_all_entities_are_locked() { + let locker = Arc::new(SignedEntityTypeLock::new()); + for signed_entity_type in SignedEntityTypeDiscriminants::all() { + locker.lock(signed_entity_type).await; + } + let certifier_service = SignerCertifierService::new(locker); + + let beacon_to_sign = certifier_service.get_beacon_to_sign().await.unwrap(); + assert_eq!(beacon_to_sign, None); + } +} diff --git a/mithril-signer/src/services/mod.rs b/mithril-signer/src/services/mod.rs index e6231f5d35f..ed06ad841de 100644 --- a/mithril-signer/src/services/mod.rs +++ b/mithril-signer/src/services/mod.rs @@ -11,6 +11,7 @@ mod aggregator_client; mod cardano_transactions; +mod certifier; mod epoch_service; mod signable_builder; mod single_signer; @@ -20,6 +21,7 @@ mod upkeep_service; pub use aggregator_client::dumb::DumbAggregatorClient; pub use aggregator_client::*; pub use cardano_transactions::*; +pub use certifier::*; pub use epoch_service::*; pub use signable_builder::*; pub use single_signer::*; From 408c665bf821d20b1533e2a1dccdc93c26f26743 Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Fri, 20 Sep 2024 17:35:36 +0200 Subject: [PATCH 119/274] feat: get mithril stake distribution beacon to sign --- mithril-signer/src/services/certifier.rs | 161 ++++++++++++++++++++++- 1 file changed, 154 insertions(+), 7 deletions(-) diff --git a/mithril-signer/src/services/certifier.rs b/mithril-signer/src/services/certifier.rs index a0de0e47d7e..3833f895c2a 100644 --- a/mithril-signer/src/services/certifier.rs +++ b/mithril-signer/src/services/certifier.rs @@ -1,10 +1,14 @@ use async_trait::async_trait; use chrono::{DateTime, Utc}; +use std::collections::BTreeSet; use std::sync::Arc; -use mithril_common::entities::{Epoch, SignedEntityType}; +use mithril_common::entities::{ + CardanoTransactionsSigningConfig, Epoch, SignedEntityConfig, SignedEntityType, + SignedEntityTypeDiscriminants, TimePoint, +}; use mithril_common::signed_entity_type_lock::SignedEntityTypeLock; -use mithril_common::StdResult; +use mithril_common::{CardanoNetwork, StdResult, TickerService}; /// Beacon to sign #[derive(Debug, Clone, PartialEq)] @@ -31,32 +35,104 @@ pub trait CertifierService: Sync + Send { async fn get_beacon_to_sign(&self) -> StdResult>; } +/// Trait to provide the current Cardano transactions signing configuration. +#[cfg_attr(test, mockall::automock)] +pub trait CardanoTransactionsSigningConfigProvider: Sync + Send { + /// Get the current Cardano transactions signing configuration. + fn get(&self) -> StdResult; +} + /// Implementation of the [Certifier Service][CertifierService] for the Mithril Signer. pub struct SignerCertifierService { + network: CardanoNetwork, + ticker_service: Arc, + cardano_transactions_signing_config_provider: Arc, signed_entity_type_lock: Arc, } impl SignerCertifierService { /// Create a new `SignerCertifierService` instance. - pub fn new(signed_entity_type_lock: Arc) -> Self { + pub fn new( + network: CardanoNetwork, + ticker_service: Arc, + cardano_transactions_signing_config_provider: Arc< + dyn CardanoTransactionsSigningConfigProvider, + >, + signed_entity_type_lock: Arc, + ) -> Self { Self { + network, + ticker_service, + cardano_transactions_signing_config_provider, signed_entity_type_lock, } } + + async fn compute_signing_config(&self) -> StdResult { + // Hardcoded list, should we allow to configure this? + // Note: we don't use `SignedEntityTypeDiscriminants::all()` to avoid adding entities + // that are still in development. + let allowed_discriminants = BTreeSet::from([ + SignedEntityTypeDiscriminants::MithrilStakeDistribution, + SignedEntityTypeDiscriminants::CardanoImmutableFilesFull, + SignedEntityTypeDiscriminants::CardanoStakeDistribution, + SignedEntityTypeDiscriminants::CardanoTransactions, + ]); + let cardano_transactions_signing_config = + self.cardano_transactions_signing_config_provider.get()?; + + Ok(SignedEntityConfig { + allowed_discriminants, + network: self.network, + cardano_transactions_signing_config, + }) + } + + async fn list_available_signed_entity_types( + &self, + time_point: &TimePoint, + ) -> StdResult> { + let signed_entity_types = self + .compute_signing_config() + .await? + .list_allowed_signed_entity_types(time_point)?; + let unlocked_signed_entities = self + .signed_entity_type_lock + .filter_unlocked_entries(signed_entity_types) + .await; + + Ok(unlocked_signed_entities) + } } #[async_trait] impl CertifierService for SignerCertifierService { async fn get_beacon_to_sign(&self) -> StdResult> { - Ok(None) + let time_point = self.ticker_service.get_current_time_point().await?; + + let available_signed_entity_types = + self.list_available_signed_entity_types(&time_point).await?; + + if available_signed_entity_types.is_empty() { + Ok(None) + } else { + let signed_entity_type = available_signed_entity_types[0].clone(); + let beacon_to_sign = BeaconToSign { + epoch: time_point.epoch, + signed_entity_type, + initiated_at: Utc::now(), + }; + + Ok(Some(beacon_to_sign)) + } } } #[cfg(test)] mod tests { - use mithril_common::entities::SignedEntityTypeDiscriminants; + use mithril_common::entities::ChainPoint; - use super::*; + use super::{tests::tests_tooling::*, *}; #[tokio::test] async fn no_beacon_can_be_signed_if_all_entities_are_locked() { @@ -64,9 +140,80 @@ mod tests { for signed_entity_type in SignedEntityTypeDiscriminants::all() { locker.lock(signed_entity_type).await; } - let certifier_service = SignerCertifierService::new(locker); + let certifier_service = SignerCertifierService::new( + CardanoNetwork::TestNet(42), + Arc::new(DumbTickerService::new(TimePoint::dummy())), + Arc::new(DumbCardanoTransactionsSigningConfigProvider::new( + CardanoTransactionsSigningConfig::dummy(), + )), + locker, + ); let beacon_to_sign = certifier_service.get_beacon_to_sign().await.unwrap(); assert_eq!(beacon_to_sign, None); } + + #[tokio::test] + async fn if_available_mithril_stake_distribution_is_the_first_beacon_to_sign() { + let ticker_service = DumbTickerService::new(TimePoint::new(1, 14, ChainPoint::dummy())); + let certifier_service = SignerCertifierService::new( + CardanoNetwork::TestNet(42), + Arc::new(ticker_service), + Arc::new(DumbCardanoTransactionsSigningConfigProvider::new( + CardanoTransactionsSigningConfig::dummy(), + )), + Arc::new(SignedEntityTypeLock::new()), + ); + + let beacon_to_sign = certifier_service.get_beacon_to_sign().await.unwrap(); + + assert!( + matches!( + beacon_to_sign, + Some(BeaconToSign { + epoch: Epoch(1), + signed_entity_type: SignedEntityType::MithrilStakeDistribution(Epoch(1)), + .. + }) + ), + "expected beacon to sign to be MithrilStakeDistribution(Epoch(1)), got: {beacon_to_sign:?}", + ); + } + + pub mod tests_tooling { + use super::*; + + pub struct DumbTickerService { + time_point: TimePoint, + } + + impl DumbTickerService { + pub fn new(time_point: TimePoint) -> Self { + Self { time_point } + } + } + + #[async_trait] + impl TickerService for DumbTickerService { + async fn get_current_time_point(&self) -> StdResult { + Ok(self.time_point.clone()) + } + } + + pub struct DumbCardanoTransactionsSigningConfigProvider { + config: CardanoTransactionsSigningConfig, + } + + impl DumbCardanoTransactionsSigningConfigProvider { + pub fn new(config: CardanoTransactionsSigningConfig) -> Self { + Self { config } + } + } + + impl CardanoTransactionsSigningConfigProvider for DumbCardanoTransactionsSigningConfigProvider { + fn get(&self) -> StdResult { + Ok(self.config.clone()) + } + } + } } From 0b90d513561307ffb7ec14a994873c2b8e7f03cd Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Mon, 23 Sep 2024 17:31:00 +0200 Subject: [PATCH 120/274] feat: allow to mark a beacon as signed so it's not reused --- mithril-signer/src/services/certifier.rs | 101 +++++++++++++++++++++++ 1 file changed, 101 insertions(+) diff --git a/mithril-signer/src/services/certifier.rs b/mithril-signer/src/services/certifier.rs index 3833f895c2a..fa57e3e21f4 100644 --- a/mithril-signer/src/services/certifier.rs +++ b/mithril-signer/src/services/certifier.rs @@ -33,6 +33,9 @@ pub trait CertifierService: Sync + Send { /// /// If all available signed entity have already been signed, `None` is returned. async fn get_beacon_to_sign(&self) -> StdResult>; + + /// Mark a beacon as signed so it won't be returned by `get_beacon_to_sign` anymore. + async fn mark_beacon_as_signed(&self, signed_beacon: &BeaconToSign) -> StdResult<()>; } /// Trait to provide the current Cardano transactions signing configuration. @@ -42,10 +45,25 @@ pub trait CardanoTransactionsSigningConfigProvider: Sync + Send { fn get(&self) -> StdResult; } +/// Trait to store beacons that have been signed in order to avoid signing them twice. +#[cfg_attr(test, mockall::automock)] +#[async_trait] +pub trait SignedBeaconStore: Sync + Send { + /// Filter out already signed entities from a list of signed entities. + async fn filter_out_already_signed_entities( + &self, + entities: Vec, + ) -> StdResult>; + + /// Mark a beacon as signed. + async fn mark_beacon_as_signed(&self, entity: &BeaconToSign) -> StdResult<()>; +} + /// Implementation of the [Certifier Service][CertifierService] for the Mithril Signer. pub struct SignerCertifierService { network: CardanoNetwork, ticker_service: Arc, + signed_beacon_store: Arc, cardano_transactions_signing_config_provider: Arc, signed_entity_type_lock: Arc, } @@ -55,6 +73,7 @@ impl SignerCertifierService { pub fn new( network: CardanoNetwork, ticker_service: Arc, + signed_beacon_store: Arc, cardano_transactions_signing_config_provider: Arc< dyn CardanoTransactionsSigningConfigProvider, >, @@ -63,6 +82,7 @@ impl SignerCertifierService { Self { network, ticker_service, + signed_beacon_store, cardano_transactions_signing_config_provider, signed_entity_type_lock, } @@ -126,6 +146,12 @@ impl CertifierService for SignerCertifierService { Ok(Some(beacon_to_sign)) } } + + async fn mark_beacon_as_signed(&self, signed_beacon: &BeaconToSign) -> StdResult<()> { + self.signed_beacon_store + .mark_beacon_as_signed(signed_beacon) + .await + } } #[cfg(test)] @@ -143,6 +169,7 @@ mod tests { let certifier_service = SignerCertifierService::new( CardanoNetwork::TestNet(42), Arc::new(DumbTickerService::new(TimePoint::dummy())), + Arc::new(DumbSignedBeaconStore::default()), Arc::new(DumbCardanoTransactionsSigningConfigProvider::new( CardanoTransactionsSigningConfig::dummy(), )), @@ -159,6 +186,7 @@ mod tests { let certifier_service = SignerCertifierService::new( CardanoNetwork::TestNet(42), Arc::new(ticker_service), + Arc::new(DumbSignedBeaconStore::default()), Arc::new(DumbCardanoTransactionsSigningConfigProvider::new( CardanoTransactionsSigningConfig::dummy(), )), @@ -180,7 +208,38 @@ mod tests { ); } + #[tokio::test] + async fn mark_beacon_as_signed_update_the_store() { + let signed_beacons_store = Arc::new(DumbSignedBeaconStore::default()); + let certifier_service = SignerCertifierService::new( + CardanoNetwork::TestNet(42), + Arc::new(DumbTickerService::new(TimePoint::dummy())), + signed_beacons_store.clone(), + Arc::new(DumbCardanoTransactionsSigningConfigProvider::new( + CardanoTransactionsSigningConfig::dummy(), + )), + Arc::new(SignedEntityTypeLock::new()), + ); + + certifier_service + .mark_beacon_as_signed(&BeaconToSign { + epoch: Epoch(1), + signed_entity_type: SignedEntityType::MithrilStakeDistribution(Epoch(4)), + initiated_at: Utc::now(), + }) + .await + .unwrap(); + + let signed_beacons = signed_beacons_store.signed_beacons().await; + assert_eq!( + vec![SignedEntityType::MithrilStakeDistribution(Epoch(4))], + signed_beacons + ); + } + pub mod tests_tooling { + use tokio::sync::RwLock; + use super::*; pub struct DumbTickerService { @@ -215,5 +274,47 @@ mod tests { Ok(self.config.clone()) } } + + pub struct DumbSignedBeaconStore { + signed_beacons: RwLock>, + } + + impl DumbSignedBeaconStore { + pub fn new(signed_beacons: Vec) -> Self { + Self { + signed_beacons: RwLock::new(signed_beacons), + } + } + + pub async fn signed_beacons(&self) -> Vec { + self.signed_beacons.read().await.clone() + } + } + + impl Default for DumbSignedBeaconStore { + fn default() -> Self { + Self::new(vec![]) + } + } + + #[async_trait] + impl SignedBeaconStore for DumbSignedBeaconStore { + async fn filter_out_already_signed_entities( + &self, + entities: Vec, + ) -> StdResult> { + let already_signed_entities = self.signed_beacons.read().await.clone(); + Ok(entities + .into_iter() + .filter(|entity| !already_signed_entities.contains(entity)) + .collect()) + } + + async fn mark_beacon_as_signed(&self, beacon: &BeaconToSign) -> StdResult<()> { + let mut already_signed_entities = self.signed_beacons.write().await; + already_signed_entities.push(beacon.signed_entity_type.clone()); + Ok(()) + } + } } } From 82c7fc4698af819424936efb1370478bff14c8d1 Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Mon, 23 Sep 2024 18:24:17 +0200 Subject: [PATCH 121/274] feat: beacon marked as signed are filtered out by `get_beacon_to_sign` --- mithril-signer/src/services/certifier.rs | 40 +++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/mithril-signer/src/services/certifier.rs b/mithril-signer/src/services/certifier.rs index fa57e3e21f4..cd4284a6287 100644 --- a/mithril-signer/src/services/certifier.rs +++ b/mithril-signer/src/services/certifier.rs @@ -120,8 +120,12 @@ impl SignerCertifierService { .signed_entity_type_lock .filter_unlocked_entries(signed_entity_types) .await; + let not_already_signed_entities = self + .signed_beacon_store + .filter_out_already_signed_entities(unlocked_signed_entities) + .await?; - Ok(unlocked_signed_entities) + Ok(not_already_signed_entities) } } @@ -237,6 +241,40 @@ mod tests { ); } + #[tokio::test] + async fn if_already_signed_a_beacon_is_not_returned_anymore() { + let ticker_service = DumbTickerService::new(TimePoint::new(1, 14, ChainPoint::dummy())); + let certifier_service = SignerCertifierService::new( + CardanoNetwork::TestNet(42), + Arc::new(ticker_service), + Arc::new(DumbSignedBeaconStore::default()), + Arc::new(DumbCardanoTransactionsSigningConfigProvider::new( + CardanoTransactionsSigningConfig::dummy(), + )), + Arc::new(SignedEntityTypeLock::new()), + ); + + let first_beacon_to_sign = certifier_service + .get_beacon_to_sign() + .await + .unwrap() + .unwrap(); + certifier_service + .mark_beacon_as_signed(&first_beacon_to_sign.clone()) + .await + .unwrap(); + let second_beacon_to_sign = certifier_service + .get_beacon_to_sign() + .await + .unwrap() + .unwrap(); + + assert_ne!( + first_beacon_to_sign.signed_entity_type, + second_beacon_to_sign.signed_entity_type + ); + } + pub mod tests_tooling { use tokio::sync::RwLock; From c410621129440d218c1ea7c95e502ac7679d184c Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Mon, 23 Sep 2024 19:03:23 +0200 Subject: [PATCH 122/274] test: check beacon to sign order & that they don't repeat + Simplify a previous test that was too tighted to the SignedEntityDiscriminant. --- mithril-signer/src/services/certifier.rs | 68 +++++++++++++++++++----- 1 file changed, 55 insertions(+), 13 deletions(-) diff --git a/mithril-signer/src/services/certifier.rs b/mithril-signer/src/services/certifier.rs index cd4284a6287..47d5ca490d7 100644 --- a/mithril-signer/src/services/certifier.rs +++ b/mithril-signer/src/services/certifier.rs @@ -185,8 +185,12 @@ mod tests { } #[tokio::test] - async fn if_available_mithril_stake_distribution_is_the_first_beacon_to_sign() { - let ticker_service = DumbTickerService::new(TimePoint::new(1, 14, ChainPoint::dummy())); + async fn only_one_unlocked_and_not_yet_signed_yield_a_beacon_to_sign() { + let ticker_service = DumbTickerService::new(TimePoint::new(3, 14, ChainPoint::dummy())); + let locker = Arc::new(SignedEntityTypeLock::new()); + for signed_entity_type in SignedEntityTypeDiscriminants::all().into_iter().skip(1) { + locker.lock(signed_entity_type).await; + } let certifier_service = SignerCertifierService::new( CardanoNetwork::TestNet(42), Arc::new(ticker_service), @@ -199,17 +203,7 @@ mod tests { let beacon_to_sign = certifier_service.get_beacon_to_sign().await.unwrap(); - assert!( - matches!( - beacon_to_sign, - Some(BeaconToSign { - epoch: Epoch(1), - signed_entity_type: SignedEntityType::MithrilStakeDistribution(Epoch(1)), - .. - }) - ), - "expected beacon to sign to be MithrilStakeDistribution(Epoch(1)), got: {beacon_to_sign:?}", - ); + assert!(beacon_to_sign.is_some()); } #[tokio::test] @@ -275,6 +269,54 @@ mod tests { ); } + #[tokio::test] + async fn draining_out_all_beacon_to_signs_dont_repeat_value_and_use_signed_entity_discriminant_order( + ) { + let ticker_service = DumbTickerService::new(TimePoint::new(1, 14, ChainPoint::dummy())); + let certifier_service = SignerCertifierService::new( + CardanoNetwork::TestNet(42), + Arc::new(ticker_service), + Arc::new(DumbSignedBeaconStore::default()), + Arc::new(DumbCardanoTransactionsSigningConfigProvider::new( + CardanoTransactionsSigningConfig::dummy(), + )), + Arc::new(SignedEntityTypeLock::new()), + ); + + let mut previous_beacon_to_sign = certifier_service + .get_beacon_to_sign() + .await + .unwrap() + .expect("There should be a beacon to sign since nothing is locked or signed"); + let mut all_signed_beacons = vec![previous_beacon_to_sign.clone()]; + + loop { + certifier_service + .mark_beacon_as_signed(&previous_beacon_to_sign) + .await + .unwrap(); + let next_beacon_to_sign = certifier_service.get_beacon_to_sign().await.unwrap(); + + if let Some(beacon) = next_beacon_to_sign { + assert!( + !all_signed_beacons.contains(&beacon), + "Beacon should not repeat" + ); + assert!( + SignedEntityTypeDiscriminants::from( + &previous_beacon_to_sign.signed_entity_type + ) < SignedEntityTypeDiscriminants::from(&beacon.signed_entity_type), + "Beacon should follow SignedEntityTypeDiscriminants order" + ); + + all_signed_beacons.push(beacon.clone()); + previous_beacon_to_sign = beacon; + } else { + break; + } + } + } + pub mod tests_tooling { use tokio::sync::RwLock; From 6b7aadeebc831dd02d6e0164613e1c0d43069927 Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Tue, 24 Sep 2024 17:20:52 +0200 Subject: [PATCH 123/274] feat: add allowed discriminants in signer epoch service Retrieved once per epoch from the aggregator `/` route. --- .../src/messages/aggregator_features.rs | 6 +- mithril-signer/src/runtime/runner.rs | 79 ++++++++++++++++--- .../src/services/aggregator_client.rs | 14 +++- mithril-signer/src/services/epoch_service.rs | 62 +++++++++++---- 4 files changed, 129 insertions(+), 32 deletions(-) diff --git a/mithril-common/src/messages/aggregator_features.rs b/mithril-common/src/messages/aggregator_features.rs index 901151b92b0..870044b3f7d 100644 --- a/mithril-common/src/messages/aggregator_features.rs +++ b/mithril-common/src/messages/aggregator_features.rs @@ -5,7 +5,7 @@ use serde::{Deserialize, Serialize}; use crate::entities::{CardanoTransactionsSigningConfig, SignedEntityTypeDiscriminants}; /// Message advertised by an Aggregator to inform about its features -#[derive(Debug, Serialize, Deserialize, PartialEq)] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] pub struct AggregatorFeaturesMessage { /// Version of the OpenAPI specification pub open_api_version: String, @@ -35,7 +35,7 @@ impl AggregatorFeaturesMessage { } /// Capabilities of an Aggregator -#[derive(Debug, Serialize, Deserialize, PartialEq)] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] pub struct AggregatorCapabilities { /// Signed entity types that are signed by the aggregator pub signed_entity_types: BTreeSet, @@ -50,7 +50,7 @@ pub struct AggregatorCapabilities { } /// Cardano transactions prover capabilities -#[derive(Debug, Serialize, Deserialize, PartialEq)] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] pub struct CardanoTransactionsProverCapabilities { /// Maximum number of hashes allowed for a single request pub max_hashes_allowed_by_request: usize, diff --git a/mithril-signer/src/runtime/runner.rs b/mithril-signer/src/runtime/runner.rs index cf9640e2fb8..da311f1865e 100644 --- a/mithril-signer/src/runtime/runner.rs +++ b/mithril-signer/src/runtime/runner.rs @@ -291,11 +291,20 @@ impl Runner for SignerRunner { async fn inform_epoch_settings(&self, epoch_settings: SignerEpochSettings) -> StdResult<()> { debug!("RUNNER: register_epoch"); + let aggregator_features = self + .services + .certificate_handler + .retrieve_aggregator_features() + .await?; + self.services .epoch_service .write() .await - .inform_epoch_settings(epoch_settings) + .inform_epoch_settings( + epoch_settings, + aggregator_features.capabilities.signed_entity_types, + ) } async fn compute_message( @@ -414,11 +423,10 @@ impl Runner for SignerRunner { #[cfg(test)] mod tests { - use mockall::mock; use rand_chacha::ChaCha20Rng; use rand_core::SeedableRng; - + use std::collections::BTreeSet; use std::{path::Path, path::PathBuf, sync::Arc}; use tokio::sync::RwLock; @@ -435,9 +443,10 @@ mod tests { digesters::{DumbImmutableDigester, DumbImmutableFileObserver}, entities::{ BlockNumber, BlockRange, CardanoDbBeacon, CardanoTransactionsSigningConfig, Epoch, - ProtocolMessagePartKey, ProtocolParameters, + ProtocolMessagePartKey, ProtocolParameters, SignedEntityTypeDiscriminants, }, era::{adapters::EraReaderBootstrapAdapter, EraChecker, EraReader}, + messages::{AggregatorCapabilities, AggregatorFeaturesMessage}, signable_builder::{ BlockRangeRootRetriever, CardanoImmutableFilesFullSignableBuilder, CardanoStakeDistributionSignableBuilder, CardanoTransactionsSignableBuilder, @@ -450,15 +459,13 @@ mod tests { use mithril_persistence::store::adapter::{DumbStoreAdapter, MemoryAdapter}; use mithril_persistence::store::{StakeStore, StakeStorer}; - use crate::{ - metrics::MetricsService, - services::{ - CardanoTransactionsImporter, DumbAggregatorClient, MithrilEpochService, - MithrilSingleSigner, MockAggregatorClient, MockTransactionStore, MockUpkeepService, - SignerSignableSeedBuilder, SingleSigner, - }, - store::ProtocolInitializerStore, + use crate::metrics::MetricsService; + use crate::services::{ + CardanoTransactionsImporter, DumbAggregatorClient, MithrilEpochService, + MithrilSingleSigner, MockAggregatorClient, MockTransactionStore, MockUpkeepService, + SignerSignableSeedBuilder, SingleSigner, }; + use crate::store::ProtocolInitializerStore; use super::*; @@ -497,7 +504,11 @@ mod tests { #[async_trait] impl EpochService for FakeEpochServiceImpl { - fn inform_epoch_settings(&mut self, _epoch_settings: SignerEpochSettings) -> StdResult<()> { + fn inform_epoch_settings( + &mut self, + _epoch_settings: SignerEpochSettings, + _allowed_discriminants: BTreeSet, + ) -> StdResult<()> { Ok(()) } fn epoch_of_current_data(&self) -> StdResult { @@ -518,6 +529,11 @@ mod tests { async fn next_signers_with_stake(&self) -> StdResult> { Ok(vec![]) } + + fn allowed_discriminants(&self) -> StdResult<&BTreeSet> { + unimplemented!() + } + fn cardano_transactions_signing_config( &self, ) -> StdResult<&Option> { @@ -1078,4 +1094,41 @@ mod tests { let runner = init_runner(Some(services), None).await; runner.upkeep().await.expect("upkeep should not fail"); } + + #[tokio::test] + async fn test_inform_epoch_setting_pass_allowed_discriminant_to_epoch_service() { + let mut services = init_services().await; + let certificate_handler = Arc::new(DumbAggregatorClient::default()); + certificate_handler + .set_aggregator_features(AggregatorFeaturesMessage { + capabilities: AggregatorCapabilities { + signed_entity_types: BTreeSet::from([ + SignedEntityTypeDiscriminants::MithrilStakeDistribution, + SignedEntityTypeDiscriminants::CardanoTransactions, + ]), + ..AggregatorFeaturesMessage::dummy().capabilities + }, + ..AggregatorFeaturesMessage::dummy() + }) + .await; + services.certificate_handler = certificate_handler; + let runner = init_runner(Some(services), None).await; + + let epoch_settings = SignerEpochSettings { + epoch: Epoch(1), + ..SignerEpochSettings::dummy() + }; + runner.inform_epoch_settings(epoch_settings).await.unwrap(); + + let epoch_service = runner.services.epoch_service.read().await; + let recorded_allowed_discriminants = epoch_service.allowed_discriminants().unwrap(); + + assert_eq!( + &BTreeSet::from([ + SignedEntityTypeDiscriminants::MithrilStakeDistribution, + SignedEntityTypeDiscriminants::CardanoTransactions, + ]), + recorded_allowed_discriminants + ); + } } diff --git a/mithril-signer/src/services/aggregator_client.rs b/mithril-signer/src/services/aggregator_client.rs index e7e9d55bc64..631d39158a6 100644 --- a/mithril-signer/src/services/aggregator_client.rs +++ b/mithril-signer/src/services/aggregator_client.rs @@ -355,6 +355,7 @@ pub(crate) mod dumb { epoch_settings: RwLock>, certificate_pending: RwLock>, last_registered_signer: RwLock>, + aggregator_features: RwLock, } impl DumbAggregatorClient { @@ -364,6 +365,7 @@ pub(crate) mod dumb { epoch_settings: RwLock::new(None), certificate_pending: RwLock::new(None), last_registered_signer: RwLock::new(None), + aggregator_features: RwLock::new(AggregatorFeaturesMessage::dummy()), } } @@ -389,6 +391,14 @@ pub(crate) mod dumb { pub async fn get_last_registered_signer(&self) -> Option { self.last_registered_signer.read().await.clone() } + + pub async fn set_aggregator_features( + &self, + aggregator_features: AggregatorFeaturesMessage, + ) { + let mut aggregator_features_writer = self.aggregator_features.write().await; + *aggregator_features_writer = aggregator_features; + } } impl Default for DumbAggregatorClient { @@ -397,6 +407,7 @@ pub(crate) mod dumb { epoch_settings: RwLock::new(Some(SignerEpochSettings::dummy())), certificate_pending: RwLock::new(Some(fake_data::certificate_pending())), last_registered_signer: RwLock::new(None), + aggregator_features: RwLock::new(AggregatorFeaturesMessage::dummy()), } } } @@ -445,7 +456,8 @@ pub(crate) mod dumb { async fn retrieve_aggregator_features( &self, ) -> Result { - Ok(AggregatorFeaturesMessage::dummy()) + let aggregator_features = self.aggregator_features.read().await; + Ok(aggregator_features.clone()) } } } diff --git a/mithril-signer/src/services/epoch_service.rs b/mithril-signer/src/services/epoch_service.rs index d6d7ca44cb0..062beb10cc9 100644 --- a/mithril-signer/src/services/epoch_service.rs +++ b/mithril-signer/src/services/epoch_service.rs @@ -1,15 +1,15 @@ +use async_trait::async_trait; +use slog_scope::{debug, trace}; +use std::collections::BTreeSet; use std::sync::Arc; +use thiserror::Error; -use async_trait::async_trait; use mithril_common::crypto_helper::ProtocolInitializer; -use mithril_common::entities::CardanoTransactionsSigningConfig; -use mithril_common::entities::Epoch; -use mithril_common::entities::PartyId; -use mithril_common::entities::ProtocolParameters; -use mithril_common::entities::Signer; +use mithril_common::entities::{ + CardanoTransactionsSigningConfig, Epoch, PartyId, ProtocolParameters, + SignedEntityTypeDiscriminants, Signer, +}; use mithril_persistence::store::StakeStorer; -use slog_scope::{debug, trace}; -use thiserror::Error; use mithril_common::entities::SignerWithStake; use mithril_common::StdResult; @@ -30,7 +30,11 @@ pub enum EpochServiceError { pub trait EpochService: Sync + Send { /// Inform the service a new epoch has been detected, telling it to update its /// internal state for the new epoch. - fn inform_epoch_settings(&mut self, epoch_settings: SignerEpochSettings) -> StdResult<()>; + fn inform_epoch_settings( + &mut self, + epoch_settings: SignerEpochSettings, + allowed_discriminants: BTreeSet, + ) -> StdResult<()>; /// Get the current epoch for which the data stored in this service are computed. fn epoch_of_current_data(&self) -> StdResult; @@ -50,6 +54,9 @@ pub trait EpochService: Sync + Send { /// Get signers with stake for the next epoch async fn next_signers_with_stake(&self) -> StdResult>; + /// Get the list of signed entity types that are allowed to sign for the current epoch + fn allowed_discriminants(&self) -> StdResult<&BTreeSet>; + /// Get the cardano transactions signing configuration for the current epoch fn cardano_transactions_signing_config( &self, @@ -73,6 +80,7 @@ struct EpochData { next_protocol_parameters: ProtocolParameters, current_signers: Vec, next_signers: Vec, + allowed_discriminants: BTreeSet, cardano_transactions_signing_config: Option, next_cardano_transactions_signing_config: Option, } @@ -80,7 +88,6 @@ struct EpochData { /// Implementation of the [epoch service][EpochService]. pub struct MithrilEpochService { stake_storer: Arc, - epoch_data: Option, } @@ -140,7 +147,11 @@ impl MithrilEpochService { #[async_trait] impl EpochService for MithrilEpochService { - fn inform_epoch_settings(&mut self, epoch_settings: SignerEpochSettings) -> StdResult<()> { + fn inform_epoch_settings( + &mut self, + epoch_settings: SignerEpochSettings, + allowed_discriminants: BTreeSet, + ) -> StdResult<()> { debug!( "EpochService: register_epoch_settings: {:?}", epoch_settings @@ -151,6 +162,7 @@ impl EpochService for MithrilEpochService { next_protocol_parameters: epoch_settings.next_protocol_parameters, current_signers: epoch_settings.current_signers, next_signers: epoch_settings.next_signers, + allowed_discriminants, cardano_transactions_signing_config: epoch_settings.cardano_transactions_signing_config, next_cardano_transactions_signing_config: epoch_settings .next_cardano_transactions_signing_config, @@ -193,6 +205,10 @@ impl EpochService for MithrilEpochService { .await } + fn allowed_discriminants(&self) -> StdResult<&BTreeSet> { + Ok(&self.unwrap_data()?.allowed_discriminants) + } + fn cardano_transactions_signing_config( &self, ) -> StdResult<&Option> { @@ -230,7 +246,11 @@ pub mod mock_epoch_service { impl EpochService for EpochServiceImpl { /// Inform the service a new epoch has been detected, telling it to update its /// internal state for the new epoch. - fn inform_epoch_settings(&mut self, epoch_settings: SignerEpochSettings) -> StdResult<()>; + fn inform_epoch_settings( + &mut self, + epoch_settings: SignerEpochSettings, + allowed_discriminants: BTreeSet, + ) -> StdResult<()>; /// Get the current epoch for which the data stored in this service are computed. fn epoch_of_current_data(&self) -> StdResult; @@ -244,6 +264,9 @@ pub mod mock_epoch_service { /// Get signers for the next epoch fn next_signers(&self) -> StdResult<&'static Vec>; + /// Get the list of signed entity types that are allowed to sign for the current epoch + fn allowed_discriminants(&self) -> StdResult<&'static BTreeSet>; + /// Get signers with stake for the current epoch async fn current_signers_with_stake(&self) -> StdResult>; @@ -339,7 +362,7 @@ mod tests { let mut service = MithrilEpochService::new(stake_store); service - .inform_epoch_settings(epoch_settings.clone()) + .inform_epoch_settings(epoch_settings.clone(), BTreeSet::new()) .unwrap(); let party_id = fixtures.signers_fixture()[0].party_id(); @@ -420,7 +443,10 @@ mod tests { let mut service = MithrilEpochService::new(stake_store); service - .inform_epoch_settings(epoch_settings.clone()) + .inform_epoch_settings( + epoch_settings.clone(), + BTreeSet::from([SignedEntityTypeDiscriminants::CardanoImmutableFilesFull]), + ) .unwrap(); // Check current_signers @@ -446,6 +472,12 @@ mod tests { *service.next_protocol_parameters().unwrap() ); + // Check allowed_discriminants + assert_eq!( + BTreeSet::from([SignedEntityTypeDiscriminants::CardanoImmutableFilesFull]), + *service.allowed_discriminants().unwrap() + ); + // Check cardano_transactions_signing_config assert_eq!( epoch_settings.cardano_transactions_signing_config, @@ -503,7 +535,7 @@ mod tests { // Build service and register epoch settings let mut service = MithrilEpochService::new(stake_store); service - .inform_epoch_settings(epoch_settings.clone()) + .inform_epoch_settings(epoch_settings.clone(), BTreeSet::new()) .unwrap(); // Check current signers with stake From abb699682bc9ec9c91b2ac00a7e2c5f010e2da40 Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Tue, 24 Sep 2024 16:23:12 +0200 Subject: [PATCH 124/274] feat: fetch data needed to construct SignedEntityConfig with the EpochService As they will probably have the same source and the same lifespan (that's they will be provided by the epoch service). --- mithril-signer/src/services/certifier.rs | 75 ++++++++++++-------- mithril-signer/src/services/epoch_service.rs | 17 +++++ 2 files changed, 63 insertions(+), 29 deletions(-) diff --git a/mithril-signer/src/services/certifier.rs b/mithril-signer/src/services/certifier.rs index 47d5ca490d7..e370740694c 100644 --- a/mithril-signer/src/services/certifier.rs +++ b/mithril-signer/src/services/certifier.rs @@ -38,11 +38,15 @@ pub trait CertifierService: Sync + Send { async fn mark_beacon_as_signed(&self, signed_beacon: &BeaconToSign) -> StdResult<()>; } -/// Trait to provide the current Cardano transactions signing configuration. +/// Trait to provide the part of current signed entity signing configuration that can change over time. #[cfg_attr(test, mockall::automock)] -pub trait CardanoTransactionsSigningConfigProvider: Sync + Send { +pub trait SignedEntityConfigDataProvider: Sync + Send { /// Get the current Cardano transactions signing configuration. - fn get(&self) -> StdResult; + fn get_cardano_transaction_signing_config(&self) + -> StdResult; + + /// Get the list of signed entity types that are allowed to sign. + fn get_allowed_discriminants(&self) -> StdResult>; } /// Trait to store beacons that have been signed in order to avoid signing them twice. @@ -64,7 +68,7 @@ pub struct SignerCertifierService { network: CardanoNetwork, ticker_service: Arc, signed_beacon_store: Arc, - cardano_transactions_signing_config_provider: Arc, + cardano_transactions_signing_config_provider: Arc, signed_entity_type_lock: Arc, } @@ -74,9 +78,7 @@ impl SignerCertifierService { network: CardanoNetwork, ticker_service: Arc, signed_beacon_store: Arc, - cardano_transactions_signing_config_provider: Arc< - dyn CardanoTransactionsSigningConfigProvider, - >, + cardano_transactions_signing_config_provider: Arc, signed_entity_type_lock: Arc, ) -> Self { Self { @@ -89,17 +91,12 @@ impl SignerCertifierService { } async fn compute_signing_config(&self) -> StdResult { - // Hardcoded list, should we allow to configure this? - // Note: we don't use `SignedEntityTypeDiscriminants::all()` to avoid adding entities - // that are still in development. - let allowed_discriminants = BTreeSet::from([ - SignedEntityTypeDiscriminants::MithrilStakeDistribution, - SignedEntityTypeDiscriminants::CardanoImmutableFilesFull, - SignedEntityTypeDiscriminants::CardanoStakeDistribution, - SignedEntityTypeDiscriminants::CardanoTransactions, - ]); - let cardano_transactions_signing_config = - self.cardano_transactions_signing_config_provider.get()?; + let allowed_discriminants = self + .cardano_transactions_signing_config_provider + .get_allowed_discriminants()?; + let cardano_transactions_signing_config = self + .cardano_transactions_signing_config_provider + .get_cardano_transaction_signing_config()?; Ok(SignedEntityConfig { allowed_discriminants, @@ -174,8 +171,9 @@ mod tests { CardanoNetwork::TestNet(42), Arc::new(DumbTickerService::new(TimePoint::dummy())), Arc::new(DumbSignedBeaconStore::default()), - Arc::new(DumbCardanoTransactionsSigningConfigProvider::new( + Arc::new(DumbSignedEntityConfigDataProvider::new( CardanoTransactionsSigningConfig::dummy(), + SignedEntityTypeDiscriminants::all(), )), locker, ); @@ -195,8 +193,9 @@ mod tests { CardanoNetwork::TestNet(42), Arc::new(ticker_service), Arc::new(DumbSignedBeaconStore::default()), - Arc::new(DumbCardanoTransactionsSigningConfigProvider::new( + Arc::new(DumbSignedEntityConfigDataProvider::new( CardanoTransactionsSigningConfig::dummy(), + SignedEntityTypeDiscriminants::all(), )), Arc::new(SignedEntityTypeLock::new()), ); @@ -213,8 +212,9 @@ mod tests { CardanoNetwork::TestNet(42), Arc::new(DumbTickerService::new(TimePoint::dummy())), signed_beacons_store.clone(), - Arc::new(DumbCardanoTransactionsSigningConfigProvider::new( + Arc::new(DumbSignedEntityConfigDataProvider::new( CardanoTransactionsSigningConfig::dummy(), + SignedEntityTypeDiscriminants::all(), )), Arc::new(SignedEntityTypeLock::new()), ); @@ -242,8 +242,9 @@ mod tests { CardanoNetwork::TestNet(42), Arc::new(ticker_service), Arc::new(DumbSignedBeaconStore::default()), - Arc::new(DumbCardanoTransactionsSigningConfigProvider::new( + Arc::new(DumbSignedEntityConfigDataProvider::new( CardanoTransactionsSigningConfig::dummy(), + SignedEntityTypeDiscriminants::all(), )), Arc::new(SignedEntityTypeLock::new()), ); @@ -277,8 +278,9 @@ mod tests { CardanoNetwork::TestNet(42), Arc::new(ticker_service), Arc::new(DumbSignedBeaconStore::default()), - Arc::new(DumbCardanoTransactionsSigningConfigProvider::new( + Arc::new(DumbSignedEntityConfigDataProvider::new( CardanoTransactionsSigningConfig::dummy(), + SignedEntityTypeDiscriminants::all(), )), Arc::new(SignedEntityTypeLock::new()), ); @@ -339,20 +341,35 @@ mod tests { } } - pub struct DumbCardanoTransactionsSigningConfigProvider { + pub struct DumbSignedEntityConfigDataProvider { config: CardanoTransactionsSigningConfig, + allowed_discriminants: BTreeSet, } - impl DumbCardanoTransactionsSigningConfigProvider { - pub fn new(config: CardanoTransactionsSigningConfig) -> Self { - Self { config } + impl DumbSignedEntityConfigDataProvider { + pub fn new( + config: CardanoTransactionsSigningConfig, + allowed_discriminants: BTreeSet, + ) -> Self { + Self { + config, + allowed_discriminants, + } } } - impl CardanoTransactionsSigningConfigProvider for DumbCardanoTransactionsSigningConfigProvider { - fn get(&self) -> StdResult { + impl SignedEntityConfigDataProvider for DumbSignedEntityConfigDataProvider { + fn get_cardano_transaction_signing_config( + &self, + ) -> StdResult { Ok(self.config.clone()) } + + fn get_allowed_discriminants( + &self, + ) -> StdResult> { + Ok(self.allowed_discriminants.clone()) + } } pub struct DumbSignedBeaconStore { diff --git a/mithril-signer/src/services/epoch_service.rs b/mithril-signer/src/services/epoch_service.rs index 062beb10cc9..23547808c68 100644 --- a/mithril-signer/src/services/epoch_service.rs +++ b/mithril-signer/src/services/epoch_service.rs @@ -1,3 +1,4 @@ +use anyhow::anyhow; use async_trait::async_trait; use slog_scope::{debug, trace}; use std::collections::BTreeSet; @@ -15,6 +16,7 @@ use mithril_common::entities::SignerWithStake; use mithril_common::StdResult; use crate::entities::SignerEpochSettings; +use crate::services::SignedEntityConfigDataProvider; use crate::RunnerError; /// Errors dedicated to the EpochService. @@ -233,6 +235,21 @@ impl EpochService for MithrilEpochService { } } +impl SignedEntityConfigDataProvider for MithrilEpochService { + fn get_cardano_transaction_signing_config( + &self, + ) -> StdResult { + match self.cardano_transactions_signing_config()? { + Some(config) => Ok(config.clone()), + None => Err(anyhow!("No cardano transaction signing config available")), + } + } + + fn get_allowed_discriminants(&self) -> StdResult> { + self.allowed_discriminants().cloned() + } +} + #[cfg(test)] pub mod mock_epoch_service { use mockall::mock; From 63cde486e090fa76fd58c3b94927642edcc35d50 Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Tue, 24 Sep 2024 19:27:01 +0200 Subject: [PATCH 125/274] feat: add sqlite based `SignedBeaconStore` --- mithril-signer/src/database/migration.rs | 37 +++ mithril-signer/src/database/mod.rs | 2 + mithril-signer/src/database/query/mod.rs | 5 + .../query/signed_beacon/get_signed_beacon.rs | 243 ++++++++++++++++++ .../signed_beacon/insert_signed_beacon.rs | 87 +++++++ .../src/database/query/signed_beacon/mod.rs | 5 + mithril-signer/src/database/record/mod.rs | 5 + .../database/record/signed_beacon_record.rs | 154 +++++++++++ mithril-signer/src/database/repository/mod.rs | 3 + .../repository/signed_beacon_repository.rs | 201 +++++++++++++++ mithril-signer/src/database/test_helper.rs | 15 +- 11 files changed, 756 insertions(+), 1 deletion(-) create mode 100644 mithril-signer/src/database/query/mod.rs create mode 100644 mithril-signer/src/database/query/signed_beacon/get_signed_beacon.rs create mode 100644 mithril-signer/src/database/query/signed_beacon/insert_signed_beacon.rs create mode 100644 mithril-signer/src/database/query/signed_beacon/mod.rs create mode 100644 mithril-signer/src/database/record/mod.rs create mode 100644 mithril-signer/src/database/record/signed_beacon_record.rs create mode 100644 mithril-signer/src/database/repository/signed_beacon_repository.rs diff --git a/mithril-signer/src/database/migration.rs b/mithril-signer/src/database/migration.rs index 92a243161cb..3669f1ae8fc 100644 --- a/mithril-signer/src/database/migration.rs +++ b/mithril-signer/src/database/migration.rs @@ -23,5 +23,42 @@ drop table db_version; alter table new_db_version rename to db_version; ", ), + // Migration 2 + // Add the `signed_entity_type` table and insert first types + SqlMigration::new( + 2, + r#" +create table signed_entity_type ( + signed_entity_type_id integer not null, + name text not null, + primary key (signed_entity_type_id) +); +insert into signed_entity_type (signed_entity_type_id, name) + values (0, 'Mithril Stake Distribution'), + (1, 'Cardano Stake Distribution'), + (2, 'Full Cardano Immutable Files'), + (3, 'Cardano Transactions'); +"#, + ), + // Migration 3 + // Create the `signed_beacon` table. + SqlMigration::new( + 3, + r" +create table if not exists signed_beacon ( + epoch integer not null, + beacon text not null, + signed_entity_type_id integer not null, + initiated_at text not null, + signed_at text not null, + + primary key (epoch, beacon, signed_entity_type_id), + foreign key (signed_entity_type_id) references signed_entity_type (signed_entity_type_id) +); + +create index signed_beacon_epoch on signed_beacon(epoch); +create index signed_beacon_signed_entity_type_id on signed_beacon(signed_entity_type_id); + ", + ), ] } diff --git a/mithril-signer/src/database/mod.rs b/mithril-signer/src/database/mod.rs index c435285cc41..efd73711816 100644 --- a/mithril-signer/src/database/mod.rs +++ b/mithril-signer/src/database/mod.rs @@ -2,6 +2,8 @@ //! This module contains the entities definition tied with database //! representation with their associated providers. pub mod migration; +pub(crate) mod query; +pub mod record; pub mod repository; #[cfg(test)] pub(crate) mod test_helper; diff --git a/mithril-signer/src/database/query/mod.rs b/mithril-signer/src/database/query/mod.rs new file mode 100644 index 00000000000..5be4618bf4d --- /dev/null +++ b/mithril-signer/src/database/query/mod.rs @@ -0,0 +1,5 @@ +//! Signer related database queries + +mod signed_beacon; + +pub use signed_beacon::*; diff --git a/mithril-signer/src/database/query/signed_beacon/get_signed_beacon.rs b/mithril-signer/src/database/query/signed_beacon/get_signed_beacon.rs new file mode 100644 index 00000000000..36e22eb1036 --- /dev/null +++ b/mithril-signer/src/database/query/signed_beacon/get_signed_beacon.rs @@ -0,0 +1,243 @@ +use sqlite::Value; + +use mithril_common::entities::SignedEntityType; +use mithril_common::StdResult; +use mithril_persistence::sqlite::{Query, SourceAlias, SqLiteEntity, WhereCondition}; + +use crate::database::record::SignedBeaconRecord; + +/// Simple queries to retrieve [SignedBeacon] from the sqlite database. +pub struct GetSignedBeaconQuery { + condition: WhereCondition, +} + +impl GetSignedBeaconQuery { + #[cfg(test)] + pub(crate) fn all() -> Self { + Self { + condition: WhereCondition::default(), + } + } + + /// Get all signed beacons that match the given signed entity types. + pub fn by_signed_entities(signed_entity_types: &[SignedEntityType]) -> StdResult { + fn signed_entity_condition(entity: &SignedEntityType) -> StdResult { + Ok(WhereCondition::new( + "signed_entity_type_id = ?* and beacon = ?*", + vec![ + Value::Integer(entity.index() as i64), + Value::String(entity.get_json_beacon()?), + ], + )) + } + + let condition = match signed_entity_types { + [] => WhereCondition::new("false", vec![]), + [first, rest @ ..] => { + let mut condition = signed_entity_condition(first)?; + + for entity in rest { + condition = condition.or_where(signed_entity_condition(entity)?); + } + + condition + } + }; + + Ok(Self { condition }) + } +} + +impl Query for GetSignedBeaconQuery { + type Entity = SignedBeaconRecord; + + fn filters(&self) -> WhereCondition { + self.condition.clone() + } + + fn get_definition(&self, condition: &str) -> String { + let aliases = SourceAlias::new(&[("{:signed_beacon:}", "b")]); + let projection = Self::Entity::get_projection().expand(aliases); + format!("select {projection} from signed_beacon as b where {condition} order by ROWID desc") + } +} + +#[cfg(test)] +mod tests { + use mithril_common::entities::{BlockNumber, Epoch}; + use mithril_persistence::sqlite::ConnectionExtensions; + + use crate::database::test_helper::{insert_signed_beacons, main_db_connection}; + + use super::*; + + #[test] + fn test_get_all() { + let connection = main_db_connection().unwrap(); + let records = SignedBeaconRecord::fakes(&[ + ( + Epoch(3), + vec![SignedEntityType::MithrilStakeDistribution(Epoch(3))], + ), + ( + Epoch(4), + vec![ + SignedEntityType::CardanoStakeDistribution(Epoch(4)), + SignedEntityType::CardanoTransactions(Epoch(4), BlockNumber(124)), + ], + ), + ]); + insert_signed_beacons(&connection, records.clone()); + + let stored_records: Vec = connection + .fetch_collect(GetSignedBeaconQuery::all()) + .unwrap(); + + assert_eq!( + records.into_iter().rev().collect::>(), + stored_records + ); + } + + mod get_by_signed_entities { + use super::*; + + #[test] + fn with_empty_db() { + let connection = main_db_connection().unwrap(); + + let stored_records: Vec = connection + .fetch_collect( + GetSignedBeaconQuery::by_signed_entities(&[ + SignedEntityType::MithrilStakeDistribution(Epoch(3)), + SignedEntityType::CardanoTransactions(Epoch(4), BlockNumber(124)), + ]) + .unwrap(), + ) + .unwrap(); + + assert_eq!(Vec::::new(), stored_records); + } + + #[test] + fn with_empty_list() { + let connection = main_db_connection().unwrap(); + let records = SignedBeaconRecord::fakes(&[ + ( + Epoch(3), + vec![SignedEntityType::MithrilStakeDistribution(Epoch(3))], + ), + ( + Epoch(4), + vec![SignedEntityType::CardanoStakeDistribution(Epoch(4))], + ), + ]); + insert_signed_beacons(&connection, records.clone()); + + let stored_records: Vec = connection + .fetch_collect(GetSignedBeaconQuery::by_signed_entities(&[]).unwrap()) + .unwrap(); + + assert_eq!(Vec::::new(), stored_records); + } + + #[test] + fn with_one_matching() { + let connection = main_db_connection().unwrap(); + let records = SignedBeaconRecord::fakes(&[ + ( + Epoch(3), + vec![SignedEntityType::MithrilStakeDistribution(Epoch(3))], + ), + ( + Epoch(4), + vec![SignedEntityType::CardanoStakeDistribution(Epoch(4))], + ), + ]); + insert_signed_beacons(&connection, records.clone()); + + let stored_records: Vec = connection + .fetch_collect( + GetSignedBeaconQuery::by_signed_entities(&[ + SignedEntityType::MithrilStakeDistribution(Epoch(3)), + ]) + .unwrap(), + ) + .unwrap(); + + assert_eq!( + vec![SignedBeaconRecord::fake( + Epoch(3), + SignedEntityType::MithrilStakeDistribution(Epoch(3)) + )], + stored_records + ); + } + + #[test] + fn with_multiple_matchings_over_several_epochs() { + let connection = main_db_connection().unwrap(); + let records = SignedBeaconRecord::fakes(&[ + ( + Epoch(3), + vec![ + SignedEntityType::MithrilStakeDistribution(Epoch(3)), + SignedEntityType::CardanoStakeDistribution(Epoch(3)), + ], + ), + ( + Epoch(4), + vec![ + SignedEntityType::CardanoStakeDistribution(Epoch(4)), + SignedEntityType::MithrilStakeDistribution(Epoch(4)), + SignedEntityType::CardanoTransactions(Epoch(4), BlockNumber(109)), + ], + ), + ( + Epoch(5), + vec![ + SignedEntityType::CardanoTransactions(Epoch(5), BlockNumber(124)), + SignedEntityType::CardanoTransactions(Epoch(5), BlockNumber(133)), + ], + ), + ]); + insert_signed_beacons(&connection, records.clone()); + + let stored_records: Vec = connection + .fetch_collect( + GetSignedBeaconQuery::by_signed_entities(&[ + SignedEntityType::MithrilStakeDistribution(Epoch(3)), + SignedEntityType::MithrilStakeDistribution(Epoch(4)), + SignedEntityType::CardanoTransactions(Epoch(4), BlockNumber(109)), + SignedEntityType::CardanoTransactions(Epoch(5), BlockNumber(133)), + ]) + .unwrap(), + ) + .unwrap(); + + assert_eq!( + SignedBeaconRecord::fakes(&[ + ( + Epoch(5), + vec![SignedEntityType::CardanoTransactions( + Epoch(5), + BlockNumber(133) + ),], + ), + ( + Epoch(4), + vec![ + SignedEntityType::CardanoTransactions(Epoch(4), BlockNumber(109)), + SignedEntityType::MithrilStakeDistribution(Epoch(4)), + ], + ), + ( + Epoch(3), + vec![SignedEntityType::MithrilStakeDistribution(Epoch(3)),], + ), + ]), + stored_records + ); + } + } +} diff --git a/mithril-signer/src/database/query/signed_beacon/insert_signed_beacon.rs b/mithril-signer/src/database/query/signed_beacon/insert_signed_beacon.rs new file mode 100644 index 00000000000..767216c18a7 --- /dev/null +++ b/mithril-signer/src/database/query/signed_beacon/insert_signed_beacon.rs @@ -0,0 +1,87 @@ +use sqlite::Value; + +use mithril_common::StdResult; +use mithril_persistence::sqlite::{Query, SourceAlias, SqLiteEntity, WhereCondition}; + +use crate::database::record::SignedBeaconRecord; + +/// Query to insert or replace [SignedBeaconRecord] in the sqlite database +pub struct InsertSignedBeaconRecordQuery { + condition: WhereCondition, +} + +impl InsertSignedBeaconRecordQuery { + pub fn one(record: SignedBeaconRecord) -> StdResult { + let condition = + WhereCondition::new( + "(epoch, beacon, signed_entity_type_id, initiated_at, signed_at) values (?*, ?*, ?*, ?*, ?*)", + vec![ + Value::Integer(record.epoch.try_into()?), + Value::String(record.signed_entity_type.get_json_beacon()?), + Value::Integer(record.signed_entity_type.index() as i64), + Value::String(record.initiated_at.to_rfc3339()), + Value::String(record.signed_at.to_rfc3339()), + ], + ); + + Ok(Self { condition }) + } +} + +impl Query for InsertSignedBeaconRecordQuery { + type Entity = SignedBeaconRecord; + + fn filters(&self) -> WhereCondition { + self.condition.clone() + } + + fn get_definition(&self, condition: &str) -> String { + // it is important to alias the fields with the same name as the table + // since the table cannot be aliased in a RETURNING statement in SQLite. + let projection = Self::Entity::get_projection() + .expand(SourceAlias::new(&[("{:signed_beacon:}", "signed_beacon")])); + + format!("insert into signed_beacon {condition} returning {projection}") + } +} + +#[cfg(test)] +mod tests { + use mithril_common::entities::{Epoch, SignedEntityType}; + use mithril_persistence::sqlite::ConnectionExtensions; + + use crate::database::test_helper::main_db_connection; + + use super::*; + + #[test] + fn insert_records_in_empty_db() { + let connection = main_db_connection().unwrap(); + + let record = SignedBeaconRecord::fake( + Epoch(5), + SignedEntityType::CardanoStakeDistribution(Epoch(6)), + ); + let inserted_record = connection + .fetch_first(InsertSignedBeaconRecordQuery::one(record.clone()).unwrap()) + .unwrap(); + + assert_eq!(Some(record), inserted_record); + } + + #[test] + #[should_panic] + fn inserting_same_record_twice_should_fail() { + let connection = main_db_connection().unwrap(); + + let record = SignedBeaconRecord::fake( + Epoch(13), + SignedEntityType::CardanoStakeDistribution(Epoch(17)), + ); + + connection + .fetch_first(InsertSignedBeaconRecordQuery::one(record.clone()).unwrap()) + .unwrap(); + let _ = connection.fetch_first(InsertSignedBeaconRecordQuery::one(record.clone()).unwrap()); + } +} diff --git a/mithril-signer/src/database/query/signed_beacon/mod.rs b/mithril-signer/src/database/query/signed_beacon/mod.rs new file mode 100644 index 00000000000..c3087485734 --- /dev/null +++ b/mithril-signer/src/database/query/signed_beacon/mod.rs @@ -0,0 +1,5 @@ +mod get_signed_beacon; +mod insert_signed_beacon; + +pub use get_signed_beacon::*; +pub use insert_signed_beacon::*; diff --git a/mithril-signer/src/database/record/mod.rs b/mithril-signer/src/database/record/mod.rs new file mode 100644 index 00000000000..9d493c54652 --- /dev/null +++ b/mithril-signer/src/database/record/mod.rs @@ -0,0 +1,5 @@ +//! Signer related database records + +mod signed_beacon_record; + +pub use signed_beacon_record::*; diff --git a/mithril-signer/src/database/record/signed_beacon_record.rs b/mithril-signer/src/database/record/signed_beacon_record.rs new file mode 100644 index 00000000000..8ae2f897f10 --- /dev/null +++ b/mithril-signer/src/database/record/signed_beacon_record.rs @@ -0,0 +1,154 @@ +use chrono::{DateTime, Utc}; +use sqlite::Row; + +use mithril_common::entities::{Epoch, SignedEntityType}; +use mithril_persistence::database::Hydrator; +use mithril_persistence::sqlite::{HydrationError, Projection, SqLiteEntity}; + +use crate::services::BeaconToSign; + +/// Database record of a beacon signed by the signer +#[derive(Debug, Clone, PartialEq)] +pub struct SignedBeaconRecord { + /// The epoch when the beacon was issued + pub epoch: Epoch, + + /// The signed entity type to sign + pub signed_entity_type: SignedEntityType, + + /// Datetime when the beacon was initiated + pub initiated_at: DateTime, + + /// Datetime when the beacon was signed + pub signed_at: DateTime, +} + +impl From for SignedBeaconRecord { + fn from(beacon: BeaconToSign) -> Self { + Self { + epoch: beacon.epoch, + signed_entity_type: beacon.signed_entity_type, + initiated_at: beacon.initiated_at, + signed_at: Utc::now(), + } + } +} + +#[cfg(test)] +impl SignedBeaconRecord { + /// Create a fake `SignedBeaconRecord` for testing purposes + /// + /// The dates fields are set to constant values to make it easier to compare. + pub(crate) fn fake(epoch: Epoch, signed_entity_type: SignedEntityType) -> Self { + let initiated_at = DateTime::::default(); + Self { + epoch, + signed_entity_type, + initiated_at, + signed_at: initiated_at + chrono::TimeDelta::minutes(3), + } + } + + pub(crate) fn fakes(records: &[(Epoch, Vec)]) -> Vec { + records + .iter() + .flat_map(|(epoch, signed_entity_types)| { + signed_entity_types + .iter() + .map(|se| Self::fake(*epoch, se.clone())) + }) + .collect() + } +} + +#[cfg(test)] +impl PartialEq for SignedBeaconRecord { + fn eq(&self, other: &BeaconToSign) -> bool { + self.epoch.eq(&other.epoch) + && self.signed_entity_type.eq(&other.signed_entity_type) + && self.initiated_at.eq(&other.initiated_at) + } +} + +#[cfg(test)] +impl PartialEq for BeaconToSign { + fn eq(&self, other: &SignedBeaconRecord) -> bool { + other.eq(self) + } +} + +impl SqLiteEntity for SignedBeaconRecord { + fn hydrate(row: Row) -> Result + where + Self: Sized, + { + let epoch = row.read::(0); + let beacon_str = Hydrator::read_signed_entity_beacon_column(&row, 1); + let signed_entity_type_id = usize::try_from(row.read::(2)).map_err(|e| { + panic!( + "Integer field open_message.signed_entity_type_id cannot be turned into usize: {e}" + ) + })?; + let initiated_at = &row.read::<&str, _>(3); + let signed_at = &row.read::<&str, _>(4); + + let open_message = Self { + epoch: Epoch(epoch.try_into().map_err(|e| { + HydrationError::InvalidData(format!( + "Could not cast i64 ({epoch}) to u64. Error: '{e}'" + )) + })?), + signed_entity_type: Hydrator::hydrate_signed_entity_type(signed_entity_type_id, &beacon_str)?, + initiated_at: DateTime::parse_from_rfc3339(initiated_at).map_err(|e| { + HydrationError::InvalidData(format!( + "Could not turn signed_beacon.initiated_at field value '{initiated_at}' to rfc3339 Datetime. Error: {e}" + )) + })?.with_timezone(&Utc), + signed_at:DateTime::parse_from_rfc3339(signed_at).map_err(|e| { + HydrationError::InvalidData(format!( + "Could not turn signed_beacon.initiated_at field value '{initiated_at}' to rfc3339 Datetime. Error: {e}" + )) + })?.with_timezone(&Utc), + }; + + Ok(open_message) + } + + fn get_projection() -> Projection { + Projection::from(&[ + ("epoch", "{:signed_beacon:}.epoch", "int"), + ("beacon", "{:signed_beacon:}.beacon", "text"), + ( + "signed_entity_type_id", + "{:signed_beacon:}.signed_entity_type_id", + "int", + ), + ("created_at", "{:signed_beacon:}.initiated_at", "text"), + ("expires_at", "{:signed_beacon:}.signed_at", "text"), + ]) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn eq_beacon_to_sign() { + let initiated_at = DateTime::::default(); + let beacon_to_sign = BeaconToSign { + epoch: Epoch(3), + signed_entity_type: SignedEntityType::MithrilStakeDistribution(Epoch(4)), + initiated_at, + }; + let signed_beacon = SignedBeaconRecord { + epoch: Epoch(3), + signed_entity_type: SignedEntityType::MithrilStakeDistribution(Epoch(4)), + initiated_at, + signed_at: initiated_at + chrono::TimeDelta::minutes(2), + }; + + assert_eq!(signed_beacon, beacon_to_sign); + assert_eq!(beacon_to_sign, signed_beacon); + } +} diff --git a/mithril-signer/src/database/repository/mod.rs b/mithril-signer/src/database/repository/mod.rs index 3f090812712..750bcbea6a1 100644 --- a/mithril-signer/src/database/repository/mod.rs +++ b/mithril-signer/src/database/repository/mod.rs @@ -1,3 +1,6 @@ //! Signer related database repositories mod cardano_transaction_repository; +mod signed_beacon_repository; + +pub use signed_beacon_repository::*; diff --git a/mithril-signer/src/database/repository/signed_beacon_repository.rs b/mithril-signer/src/database/repository/signed_beacon_repository.rs new file mode 100644 index 00000000000..28b9b3f041c --- /dev/null +++ b/mithril-signer/src/database/repository/signed_beacon_repository.rs @@ -0,0 +1,201 @@ +use async_trait::async_trait; +use std::sync::Arc; + +use mithril_common::entities::SignedEntityType; +use mithril_common::StdResult; +use mithril_persistence::sqlite::{ConnectionExtensions, SqliteConnection}; + +use crate::database::query::{GetSignedBeaconQuery, InsertSignedBeaconRecordQuery}; +use crate::database::record::SignedBeaconRecord; +use crate::services::{BeaconToSign, SignedBeaconStore}; + +/// A [SignedBeaconStore] implementation using SQLite. +pub struct SignedBeaconRepository { + connection: Arc, +} + +impl SignedBeaconRepository { + /// Create a new instance of the `SignedBeaconRepository`. + pub fn new(connection: Arc) -> Self { + Self { connection } + } +} + +#[async_trait] +impl SignedBeaconStore for SignedBeaconRepository { + async fn filter_out_already_signed_entities( + &self, + entities: Vec, + ) -> StdResult> { + let already_signed_entities: Vec = self + .connection + .fetch(GetSignedBeaconQuery::by_signed_entities(&entities)?)? + .map(|record| record.signed_entity_type) + .collect(); + + Ok(entities + .into_iter() + .filter(|e| !already_signed_entities.contains(e)) + .collect()) + } + + async fn mark_beacon_as_signed(&self, entity: &BeaconToSign) -> StdResult<()> { + let record = SignedBeaconRecord { + epoch: entity.epoch, + signed_entity_type: entity.signed_entity_type.clone(), + initiated_at: entity.initiated_at, + signed_at: chrono::Utc::now(), + }; + let _ = self + .connection + .fetch_first(InsertSignedBeaconRecordQuery::one(record)?)?; + + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use chrono::Utc; + + use mithril_common::entities::{ + Epoch, SignedEntityConfig, SignedEntityTypeDiscriminants, TimePoint, + }; + use mithril_persistence::sqlite::ConnectionExtensions; + + use crate::database::query::GetSignedBeaconQuery; + use crate::database::record::SignedBeaconRecord; + use crate::database::test_helper::{insert_signed_beacons, main_db_connection}; + + use super::*; + + fn all_signed_entity_type_for(time_point: &TimePoint) -> Vec { + let config = SignedEntityConfig { + allowed_discriminants: SignedEntityTypeDiscriminants::all(), + ..SignedEntityConfig::dummy() + }; + config.list_allowed_signed_entity_types(time_point).unwrap() + } + + #[tokio::test] + async fn filter_out_nothing_if_nothing_was_previously_signed() { + let connection = Arc::new(main_db_connection().unwrap()); + let repository = SignedBeaconRepository::new(connection.clone()); + + let to_filter = all_signed_entity_type_for(&TimePoint::dummy()); + let available_entities = repository + .filter_out_already_signed_entities(to_filter.clone()) + .await + .unwrap(); + + assert_eq!(to_filter, available_entities); + } + + #[tokio::test] + async fn filter_out_nothing_if_previously_signed_entities_doesnt_match_passed_entities() { + let connection = Arc::new(main_db_connection().unwrap()); + let repository = SignedBeaconRepository::new(connection.clone()); + + let time_point = TimePoint::dummy(); + insert_signed_beacons( + &connection, + SignedBeaconRecord::fakes(&[( + Epoch(1941), + vec![SignedEntityType::MithrilStakeDistribution( + time_point.epoch - 2, + )], + )]), + ); + let to_filter = all_signed_entity_type_for(&time_point); + + let available_entities = repository + .filter_out_already_signed_entities(to_filter.clone()) + .await + .unwrap(); + assert_eq!(to_filter, available_entities); + } + + #[tokio::test] + async fn filter_out_everything_if_previously_signed_entities_match_all_passed_entities() { + let connection = Arc::new(main_db_connection().unwrap()); + let repository = SignedBeaconRepository::new(connection.clone()); + + let to_filter = all_signed_entity_type_for(&TimePoint::dummy()); + insert_signed_beacons( + &connection, + to_filter + .iter() + .map(|entity| SignedBeaconRecord::fake(Epoch(4872), entity.clone())) + .collect(), + ); + + let available_entities = repository + .filter_out_already_signed_entities(to_filter.clone()) + .await + .unwrap(); + assert_eq!(Vec::::new(), available_entities); + } + + #[tokio::test] + async fn filter_out_partially_if_some_previously_signed_entities_match_passed_entities() { + let connection = Arc::new(main_db_connection().unwrap()); + let repository = SignedBeaconRepository::new(connection.clone()); + + let time_point = TimePoint::dummy(); + let signed_beacons = [ + SignedEntityType::MithrilStakeDistribution(time_point.epoch), + SignedEntityType::CardanoTransactions( + time_point.epoch, + time_point.chain_point.block_number, + ), + ]; + insert_signed_beacons( + &connection, + signed_beacons + .iter() + .map(|entity| SignedBeaconRecord::fake(Epoch(4872), entity.clone())) + .collect(), + ); + + let to_filter = all_signed_entity_type_for(&time_point); + let available_entities = repository + .filter_out_already_signed_entities(to_filter.clone()) + .await + .unwrap(); + + let expected: Vec = to_filter + .iter() + .filter(|entity| !signed_beacons.contains(entity)) + .cloned() + .collect(); + assert_eq!(expected, available_entities); + } + + #[tokio::test] + async fn mark_beacon_as_signed() { + let connection = Arc::new(main_db_connection().unwrap()); + let repository = SignedBeaconRepository::new(connection.clone()); + + let beacon_to_sign = BeaconToSign { + epoch: Epoch(13), + signed_entity_type: SignedEntityType::MithrilStakeDistribution(Epoch(13)), + initiated_at: Utc::now(), + }; + + let signed_beacons: Vec = connection + .fetch_collect(GetSignedBeaconQuery::all()) + .unwrap(); + assert_eq!(Vec::::new(), signed_beacons); + + repository + .mark_beacon_as_signed(&beacon_to_sign) + .await + .unwrap(); + + let signed_beacon = connection + .fetch_first(GetSignedBeaconQuery::all()) + .unwrap() + .expect("A signed beacon should have been inserted"); + assert_eq!(beacon_to_sign, signed_beacon); + } +} diff --git a/mithril-signer/src/database/test_helper.rs b/mithril-signer/src/database/test_helper.rs index 89b20636221..6600c0a59db 100644 --- a/mithril-signer/src/database/test_helper.rs +++ b/mithril-signer/src/database/test_helper.rs @@ -1,7 +1,12 @@ use std::path::Path; use mithril_common::StdResult; -use mithril_persistence::sqlite::{ConnectionBuilder, ConnectionOptions, SqliteConnection}; +use mithril_persistence::sqlite::{ + ConnectionBuilder, ConnectionExtensions, ConnectionOptions, SqliteConnection, +}; + +use crate::database::query::InsertSignedBeaconRecordQuery; +use crate::database::record::SignedBeaconRecord; /// In-memory sqlite database without foreign key support with migrations applied pub fn main_db_connection() -> StdResult { @@ -48,3 +53,11 @@ fn build_cardano_tx_db_connection( .build()?; Ok(connection) } + +pub fn insert_signed_beacons(connection: &SqliteConnection, records: Vec) { + for record in records.iter() { + connection + .fetch_first(InsertSignedBeaconRecordQuery::one(record.clone()).unwrap()) + .unwrap(); + } +} From b1e97908891029aa57ca32004d41a7d31c54d280 Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Fri, 27 Sep 2024 16:34:06 +0200 Subject: [PATCH 126/274] refactor: make signer `EpochService` a source of `SignedEntityConfig` For the certifier. This implies that the epoch service must now hold the configured cardano network. --- .../src/dependency_injection/builder.rs | 5 +- mithril-signer/src/runtime/runner.rs | 6 +- mithril-signer/src/services/certifier.rs | 96 +++++--------- mithril-signer/src/services/epoch_service.rs | 122 +++++++++++++----- .../test_extensions/state_machine_tester.rs | 8 +- 5 files changed, 136 insertions(+), 101 deletions(-) diff --git a/mithril-signer/src/dependency_injection/builder.rs b/mithril-signer/src/dependency_injection/builder.rs index 63fe60b0668..3f01c3d8711 100644 --- a/mithril-signer/src/dependency_injection/builder.rs +++ b/mithril-signer/src/dependency_injection/builder.rs @@ -320,7 +320,10 @@ impl<'a> DependenciesBuilder<'a> { let cardano_stake_distribution_signable_builder = Arc::new( CardanoStakeDistributionSignableBuilder::new(stake_store.clone()), ); - let epoch_service = Arc::new(RwLock::new(MithrilEpochService::new(stake_store.clone()))); + let epoch_service = Arc::new(RwLock::new(MithrilEpochService::new( + stake_store.clone(), + network, + ))); let signable_seed_builder_service = Arc::new(SignerSignableSeedBuilder::new( epoch_service.clone(), single_signer.clone(), diff --git a/mithril-signer/src/runtime/runner.rs b/mithril-signer/src/runtime/runner.rs index da311f1865e..a826aeb9100 100644 --- a/mithril-signer/src/runtime/runner.rs +++ b/mithril-signer/src/runtime/runner.rs @@ -572,6 +572,7 @@ mod tests { let adapter: MemoryAdapter = MemoryAdapter::new(None).unwrap(); let stake_distribution_signers = fake_data::signers_with_stakes(2); let party_id = stake_distribution_signers[1].party_id.clone(); + let network = fake_data::network(); let fake_observer = FakeObserver::default(); fake_observer.set_signers(stake_distribution_signers).await; let chain_observer = Arc::new(fake_observer); @@ -617,7 +618,10 @@ mod tests { let cardano_stake_distribution_builder = Arc::new( CardanoStakeDistributionSignableBuilder::new(stake_store.clone()), ); - let epoch_service = Arc::new(RwLock::new(MithrilEpochService::new(stake_store.clone()))); + let epoch_service = Arc::new(RwLock::new(MithrilEpochService::new( + stake_store.clone(), + network, + ))); let single_signer = Arc::new(MithrilSingleSigner::new(party_id)); let protocol_initializer_store = Arc::new(ProtocolInitializerStore::new(Box::new(adapter), None)); diff --git a/mithril-signer/src/services/certifier.rs b/mithril-signer/src/services/certifier.rs index e370740694c..f89e76c0415 100644 --- a/mithril-signer/src/services/certifier.rs +++ b/mithril-signer/src/services/certifier.rs @@ -1,14 +1,10 @@ use async_trait::async_trait; use chrono::{DateTime, Utc}; -use std::collections::BTreeSet; use std::sync::Arc; -use mithril_common::entities::{ - CardanoTransactionsSigningConfig, Epoch, SignedEntityConfig, SignedEntityType, - SignedEntityTypeDiscriminants, TimePoint, -}; +use mithril_common::entities::{Epoch, SignedEntityConfig, SignedEntityType, TimePoint}; use mithril_common::signed_entity_type_lock::SignedEntityTypeLock; -use mithril_common::{CardanoNetwork, StdResult, TickerService}; +use mithril_common::{StdResult, TickerService}; /// Beacon to sign #[derive(Debug, Clone, PartialEq)] @@ -38,15 +34,11 @@ pub trait CertifierService: Sync + Send { async fn mark_beacon_as_signed(&self, signed_beacon: &BeaconToSign) -> StdResult<()>; } -/// Trait to provide the part of current signed entity signing configuration that can change over time. +/// Trait to provide the current signed entity configuration that can change over time. #[cfg_attr(test, mockall::automock)] -pub trait SignedEntityConfigDataProvider: Sync + Send { - /// Get the current Cardano transactions signing configuration. - fn get_cardano_transaction_signing_config(&self) - -> StdResult; - - /// Get the list of signed entity types that are allowed to sign. - fn get_allowed_discriminants(&self) -> StdResult>; +pub trait SignedEntityConfigProvider: Sync + Send { + /// Get the current signed entity configuration. + fn get(&self) -> StdResult; } /// Trait to store beacons that have been signed in order to avoid signing them twice. @@ -65,53 +57,35 @@ pub trait SignedBeaconStore: Sync + Send { /// Implementation of the [Certifier Service][CertifierService] for the Mithril Signer. pub struct SignerCertifierService { - network: CardanoNetwork, ticker_service: Arc, signed_beacon_store: Arc, - cardano_transactions_signing_config_provider: Arc, + signed_entity_config_provider: Arc, signed_entity_type_lock: Arc, } impl SignerCertifierService { /// Create a new `SignerCertifierService` instance. pub fn new( - network: CardanoNetwork, ticker_service: Arc, signed_beacon_store: Arc, - cardano_transactions_signing_config_provider: Arc, + signed_entity_config_provider: Arc, signed_entity_type_lock: Arc, ) -> Self { Self { - network, ticker_service, signed_beacon_store, - cardano_transactions_signing_config_provider, + signed_entity_config_provider, signed_entity_type_lock, } } - async fn compute_signing_config(&self) -> StdResult { - let allowed_discriminants = self - .cardano_transactions_signing_config_provider - .get_allowed_discriminants()?; - let cardano_transactions_signing_config = self - .cardano_transactions_signing_config_provider - .get_cardano_transaction_signing_config()?; - - Ok(SignedEntityConfig { - allowed_discriminants, - network: self.network, - cardano_transactions_signing_config, - }) - } - async fn list_available_signed_entity_types( &self, time_point: &TimePoint, ) -> StdResult> { let signed_entity_types = self - .compute_signing_config() - .await? + .signed_entity_config_provider + .get()? .list_allowed_signed_entity_types(time_point)?; let unlocked_signed_entities = self .signed_entity_type_lock @@ -157,7 +131,9 @@ impl CertifierService for SignerCertifierService { #[cfg(test)] mod tests { - use mithril_common::entities::ChainPoint; + use mithril_common::entities::{ + CardanoTransactionsSigningConfig, ChainPoint, SignedEntityTypeDiscriminants, + }; use super::{tests::tests_tooling::*, *}; @@ -168,10 +144,9 @@ mod tests { locker.lock(signed_entity_type).await; } let certifier_service = SignerCertifierService::new( - CardanoNetwork::TestNet(42), Arc::new(DumbTickerService::new(TimePoint::dummy())), Arc::new(DumbSignedBeaconStore::default()), - Arc::new(DumbSignedEntityConfigDataProvider::new( + Arc::new(DumbSignedEntityConfigProvider::new( CardanoTransactionsSigningConfig::dummy(), SignedEntityTypeDiscriminants::all(), )), @@ -190,10 +165,9 @@ mod tests { locker.lock(signed_entity_type).await; } let certifier_service = SignerCertifierService::new( - CardanoNetwork::TestNet(42), Arc::new(ticker_service), Arc::new(DumbSignedBeaconStore::default()), - Arc::new(DumbSignedEntityConfigDataProvider::new( + Arc::new(DumbSignedEntityConfigProvider::new( CardanoTransactionsSigningConfig::dummy(), SignedEntityTypeDiscriminants::all(), )), @@ -209,10 +183,9 @@ mod tests { async fn mark_beacon_as_signed_update_the_store() { let signed_beacons_store = Arc::new(DumbSignedBeaconStore::default()); let certifier_service = SignerCertifierService::new( - CardanoNetwork::TestNet(42), Arc::new(DumbTickerService::new(TimePoint::dummy())), signed_beacons_store.clone(), - Arc::new(DumbSignedEntityConfigDataProvider::new( + Arc::new(DumbSignedEntityConfigProvider::new( CardanoTransactionsSigningConfig::dummy(), SignedEntityTypeDiscriminants::all(), )), @@ -239,10 +212,9 @@ mod tests { async fn if_already_signed_a_beacon_is_not_returned_anymore() { let ticker_service = DumbTickerService::new(TimePoint::new(1, 14, ChainPoint::dummy())); let certifier_service = SignerCertifierService::new( - CardanoNetwork::TestNet(42), Arc::new(ticker_service), Arc::new(DumbSignedBeaconStore::default()), - Arc::new(DumbSignedEntityConfigDataProvider::new( + Arc::new(DumbSignedEntityConfigProvider::new( CardanoTransactionsSigningConfig::dummy(), SignedEntityTypeDiscriminants::all(), )), @@ -275,10 +247,9 @@ mod tests { ) { let ticker_service = DumbTickerService::new(TimePoint::new(1, 14, ChainPoint::dummy())); let certifier_service = SignerCertifierService::new( - CardanoNetwork::TestNet(42), Arc::new(ticker_service), Arc::new(DumbSignedBeaconStore::default()), - Arc::new(DumbSignedEntityConfigDataProvider::new( + Arc::new(DumbSignedEntityConfigProvider::new( CardanoTransactionsSigningConfig::dummy(), SignedEntityTypeDiscriminants::all(), )), @@ -320,8 +291,11 @@ mod tests { } pub mod tests_tooling { + use std::collections::BTreeSet; use tokio::sync::RwLock; + use mithril_common::CardanoNetwork; + use super::*; pub struct DumbTickerService { @@ -341,35 +315,29 @@ mod tests { } } - pub struct DumbSignedEntityConfigDataProvider { - config: CardanoTransactionsSigningConfig, - allowed_discriminants: BTreeSet, + pub struct DumbSignedEntityConfigProvider { + config: SignedEntityConfig, } - impl DumbSignedEntityConfigDataProvider { + impl DumbSignedEntityConfigProvider { pub fn new( config: CardanoTransactionsSigningConfig, allowed_discriminants: BTreeSet, ) -> Self { Self { - config, - allowed_discriminants, + config: SignedEntityConfig { + cardano_transactions_signing_config: config, + network: CardanoNetwork::TestNet(42), + allowed_discriminants, + }, } } } - impl SignedEntityConfigDataProvider for DumbSignedEntityConfigDataProvider { - fn get_cardano_transaction_signing_config( - &self, - ) -> StdResult { + impl SignedEntityConfigProvider for DumbSignedEntityConfigProvider { + fn get(&self) -> StdResult { Ok(self.config.clone()) } - - fn get_allowed_discriminants( - &self, - ) -> StdResult> { - Ok(self.allowed_discriminants.clone()) - } } pub struct DumbSignedBeaconStore { diff --git a/mithril-signer/src/services/epoch_service.rs b/mithril-signer/src/services/epoch_service.rs index 23547808c68..b1a2c160512 100644 --- a/mithril-signer/src/services/epoch_service.rs +++ b/mithril-signer/src/services/epoch_service.rs @@ -7,16 +7,16 @@ use thiserror::Error; use mithril_common::crypto_helper::ProtocolInitializer; use mithril_common::entities::{ - CardanoTransactionsSigningConfig, Epoch, PartyId, ProtocolParameters, + CardanoTransactionsSigningConfig, Epoch, PartyId, ProtocolParameters, SignedEntityConfig, SignedEntityTypeDiscriminants, Signer, }; use mithril_persistence::store::StakeStorer; use mithril_common::entities::SignerWithStake; -use mithril_common::StdResult; +use mithril_common::{CardanoNetwork, StdResult}; use crate::entities::SignerEpochSettings; -use crate::services::SignedEntityConfigDataProvider; +use crate::services::SignedEntityConfigProvider; use crate::RunnerError; /// Errors dedicated to the EpochService. @@ -91,14 +91,16 @@ struct EpochData { pub struct MithrilEpochService { stake_storer: Arc, epoch_data: Option, + cardano_network: CardanoNetwork, } impl MithrilEpochService { /// Create a new service instance - pub fn new(stake_storer: Arc) -> Self { + pub fn new(stake_storer: Arc, cardano_network: CardanoNetwork) -> Self { Self { stake_storer, epoch_data: None, + cardano_network, } } @@ -235,18 +237,19 @@ impl EpochService for MithrilEpochService { } } -impl SignedEntityConfigDataProvider for MithrilEpochService { - fn get_cardano_transaction_signing_config( - &self, - ) -> StdResult { - match self.cardano_transactions_signing_config()? { - Some(config) => Ok(config.clone()), - None => Err(anyhow!("No cardano transaction signing config available")), - } - } - - fn get_allowed_discriminants(&self) -> StdResult> { - self.allowed_discriminants().cloned() +impl SignedEntityConfigProvider for MithrilEpochService { + fn get(&self) -> StdResult { + let cardano_transactions_signing_config = + match self.cardano_transactions_signing_config()? { + Some(config) => Ok(config.clone()), + None => Err(anyhow!("No cardano transaction signing config available")), + }?; + + Ok(SignedEntityConfig { + allowed_discriminants: self.allowed_discriminants()?.clone(), + network: self.cardano_network, + cardano_transactions_signing_config, + }) } } @@ -325,23 +328,16 @@ pub mod mock_epoch_service { mod tests { use std::sync::Arc; + use mithril_common::entities::{Epoch, StakeDistribution}; + use mithril_common::test_utils::{fake_data, MithrilFixtureBuilder}; + use mithril_persistence::store::adapter::{DumbStoreAdapter, MemoryAdapter}; + use mithril_persistence::store::{StakeStore, StakeStorer}; + use crate::entities::SignerEpochSettings; use crate::services::MithrilProtocolInitializerBuilder; use super::*; - use mithril_common::{ - entities::{Epoch, StakeDistribution}, - test_utils::{ - fake_data::{self}, - MithrilFixtureBuilder, - }, - }; - use mithril_persistence::store::{ - adapter::{DumbStoreAdapter, MemoryAdapter}, - StakeStore, StakeStorer, - }; - #[test] fn test_is_signer_included_in_current_stake_distribution_returns_error_when_epoch_settings_is_not_set( ) { @@ -354,7 +350,7 @@ mod tests { ) .unwrap(); let stake_store = Arc::new(StakeStore::new(Box::new(DumbStoreAdapter::new()), None)); - let service = MithrilEpochService::new(stake_store); + let service = MithrilEpochService::new(stake_store, fake_data::network()); service .is_signer_included_in_current_stake_distribution(party_id, protocol_initializer) @@ -377,7 +373,7 @@ mod tests { ..SignerEpochSettings::dummy().clone() }; - let mut service = MithrilEpochService::new(stake_store); + let mut service = MithrilEpochService::new(stake_store, fake_data::network()); service .inform_epoch_settings(epoch_settings.clone(), BTreeSet::new()) .unwrap(); @@ -428,7 +424,7 @@ mod tests { .expect("save_stakes should not fail"); // Build service and register epoch settings - let service = MithrilEpochService::new(stake_store); + let service = MithrilEpochService::new(stake_store, fake_data::network()); assert!(service.epoch_of_current_data().is_err()); assert!(service.next_protocol_parameters().is_err()); assert!(service.current_signers().is_err()); @@ -457,7 +453,7 @@ mod tests { }; // Build service and register epoch settings - let mut service = MithrilEpochService::new(stake_store); + let mut service = MithrilEpochService::new(stake_store, fake_data::network()); service .inform_epoch_settings( @@ -550,7 +546,7 @@ mod tests { }; // Build service and register epoch settings - let mut service = MithrilEpochService::new(stake_store); + let mut service = MithrilEpochService::new(stake_store, fake_data::network()); service .inform_epoch_settings(epoch_settings.clone(), BTreeSet::new()) .unwrap(); @@ -577,4 +573,64 @@ mod tests { } } } + + #[test] + fn is_source_of_signed_entity_config() { + let stake_store = Arc::new(StakeStore::new( + Box::new(MemoryAdapter::::new(None).unwrap()), + None, + )); + let mut service = MithrilEpochService::new(stake_store, fake_data::network()); + + // Fail before the first `inform_epoch_settings` + { + SignedEntityConfigProvider::get(&service).expect_err( + "Should fail since sources data are not set before the first inform_epoch_settings", + ); + } + // Fail after `inform_epoch_settings` if `cardano_transactions_signing_config` is not set + { + let allowed_discriminants = + BTreeSet::from([SignedEntityTypeDiscriminants::CardanoImmutableFilesFull]); + service + .inform_epoch_settings( + SignerEpochSettings { + cardano_transactions_signing_config: None, + ..SignerEpochSettings::dummy() + }, + allowed_discriminants.clone(), + ) + .unwrap(); + + SignedEntityConfigProvider::get(&service) + .expect_err("Should fail since cardano_transactions_signing_config is not set"); + } + // Success after `inform_epoch_settings` if `cardano_transactions_signing_config` is set + { + let allowed_discriminants = + BTreeSet::from([SignedEntityTypeDiscriminants::CardanoImmutableFilesFull]); + service + .inform_epoch_settings( + SignerEpochSettings { + cardano_transactions_signing_config: Some( + CardanoTransactionsSigningConfig::dummy(), + ), + ..SignerEpochSettings::dummy() + }, + allowed_discriminants.clone(), + ) + .unwrap(); + + let config = SignedEntityConfigProvider::get(&service).unwrap(); + + assert_eq!( + SignedEntityConfig { + allowed_discriminants, + network: fake_data::network(), + cardano_transactions_signing_config: CardanoTransactionsSigningConfig::dummy(), + }, + config + ); + } + } } diff --git a/mithril-signer/tests/test_extensions/state_machine_tester.rs b/mithril-signer/tests/test_extensions/state_machine_tester.rs index 84907bec245..be9e25e4cba 100644 --- a/mithril-signer/tests/test_extensions/state_machine_tester.rs +++ b/mithril-signer/tests/test_extensions/state_machine_tester.rs @@ -97,6 +97,7 @@ impl StateMachineTester { })?; let selected_signer_party_id = selected_signer_with_stake.party_id.clone(); let config = Configuration::new_sample(&selected_signer_party_id); + let network = config.get_network()?; let dependencies_builder = DependenciesBuilder::new(&config); let sqlite_connection = Arc::new( @@ -140,7 +141,7 @@ impl StateMachineTester { let certificate_handler = Arc::new(FakeAggregator::new( SignedEntityConfig { allowed_discriminants: SignedEntityTypeDiscriminants::all(), - network: config.get_network().unwrap(), + network, cardano_transactions_signing_config: cardano_transactions_signing_config.clone(), }, ticker_service.clone(), @@ -205,7 +206,10 @@ impl StateMachineTester { let cardano_stake_distribution_builder = Arc::new( CardanoStakeDistributionSignableBuilder::new(stake_store.clone()), ); - let epoch_service = Arc::new(RwLock::new(MithrilEpochService::new(stake_store.clone()))); + let epoch_service = Arc::new(RwLock::new(MithrilEpochService::new( + stake_store.clone(), + network, + ))); let signable_seed_builder_service = Arc::new(SignerSignableSeedBuilder::new( epoch_service.clone(), single_signer.clone(), From c8070d3b23242ecc3c04ef9483bc5a121aa766c2 Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Fri, 27 Sep 2024 17:29:48 +0200 Subject: [PATCH 127/274] refactor: wrap epoch service with a small struct to handle the RwLock Else we would need to wrap in a RwLock the trait passed to the certifier in order to be able to call the method that get the current signed entity config. --- .../src/dependency_injection/builder.rs | 5 +- mithril-signer/src/runtime/runner.rs | 5 +- mithril-signer/src/services/certifier.rs | 9 ++- mithril-signer/src/services/epoch_service.rs | 78 +++++++++++++------ .../test_extensions/state_machine_tester.rs | 5 +- 5 files changed, 63 insertions(+), 39 deletions(-) diff --git a/mithril-signer/src/dependency_injection/builder.rs b/mithril-signer/src/dependency_injection/builder.rs index 3f01c3d8711..63fe60b0668 100644 --- a/mithril-signer/src/dependency_injection/builder.rs +++ b/mithril-signer/src/dependency_injection/builder.rs @@ -320,10 +320,7 @@ impl<'a> DependenciesBuilder<'a> { let cardano_stake_distribution_signable_builder = Arc::new( CardanoStakeDistributionSignableBuilder::new(stake_store.clone()), ); - let epoch_service = Arc::new(RwLock::new(MithrilEpochService::new( - stake_store.clone(), - network, - ))); + let epoch_service = Arc::new(RwLock::new(MithrilEpochService::new(stake_store.clone()))); let signable_seed_builder_service = Arc::new(SignerSignableSeedBuilder::new( epoch_service.clone(), single_signer.clone(), diff --git a/mithril-signer/src/runtime/runner.rs b/mithril-signer/src/runtime/runner.rs index a826aeb9100..64d0138c062 100644 --- a/mithril-signer/src/runtime/runner.rs +++ b/mithril-signer/src/runtime/runner.rs @@ -618,10 +618,7 @@ mod tests { let cardano_stake_distribution_builder = Arc::new( CardanoStakeDistributionSignableBuilder::new(stake_store.clone()), ); - let epoch_service = Arc::new(RwLock::new(MithrilEpochService::new( - stake_store.clone(), - network, - ))); + let epoch_service = Arc::new(RwLock::new(MithrilEpochService::new(stake_store.clone()))); let single_signer = Arc::new(MithrilSingleSigner::new(party_id)); let protocol_initializer_store = Arc::new(ProtocolInitializerStore::new(Box::new(adapter), None)); diff --git a/mithril-signer/src/services/certifier.rs b/mithril-signer/src/services/certifier.rs index f89e76c0415..3b51a1cdd88 100644 --- a/mithril-signer/src/services/certifier.rs +++ b/mithril-signer/src/services/certifier.rs @@ -36,9 +36,10 @@ pub trait CertifierService: Sync + Send { /// Trait to provide the current signed entity configuration that can change over time. #[cfg_attr(test, mockall::automock)] +#[async_trait] pub trait SignedEntityConfigProvider: Sync + Send { /// Get the current signed entity configuration. - fn get(&self) -> StdResult; + async fn get(&self) -> StdResult; } /// Trait to store beacons that have been signed in order to avoid signing them twice. @@ -85,7 +86,8 @@ impl SignerCertifierService { ) -> StdResult> { let signed_entity_types = self .signed_entity_config_provider - .get()? + .get() + .await? .list_allowed_signed_entity_types(time_point)?; let unlocked_signed_entities = self .signed_entity_type_lock @@ -334,8 +336,9 @@ mod tests { } } + #[async_trait] impl SignedEntityConfigProvider for DumbSignedEntityConfigProvider { - fn get(&self) -> StdResult { + async fn get(&self) -> StdResult { Ok(self.config.clone()) } } diff --git a/mithril-signer/src/services/epoch_service.rs b/mithril-signer/src/services/epoch_service.rs index b1a2c160512..bbae068b12f 100644 --- a/mithril-signer/src/services/epoch_service.rs +++ b/mithril-signer/src/services/epoch_service.rs @@ -8,13 +8,12 @@ use thiserror::Error; use mithril_common::crypto_helper::ProtocolInitializer; use mithril_common::entities::{ CardanoTransactionsSigningConfig, Epoch, PartyId, ProtocolParameters, SignedEntityConfig, - SignedEntityTypeDiscriminants, Signer, + SignedEntityTypeDiscriminants, Signer, SignerWithStake, }; -use mithril_persistence::store::StakeStorer; - -use mithril_common::entities::SignerWithStake; use mithril_common::{CardanoNetwork, StdResult}; +use mithril_persistence::store::StakeStorer; +use crate::dependency_injection::EpochServiceWrapper; use crate::entities::SignerEpochSettings; use crate::services::SignedEntityConfigProvider; use crate::RunnerError; @@ -91,16 +90,14 @@ struct EpochData { pub struct MithrilEpochService { stake_storer: Arc, epoch_data: Option, - cardano_network: CardanoNetwork, } impl MithrilEpochService { /// Create a new service instance - pub fn new(stake_storer: Arc, cardano_network: CardanoNetwork) -> Self { + pub fn new(stake_storer: Arc) -> Self { Self { stake_storer, epoch_data: None, - cardano_network, } } @@ -237,16 +234,37 @@ impl EpochService for MithrilEpochService { } } -impl SignedEntityConfigProvider for MithrilEpochService { - fn get(&self) -> StdResult { +/// Simple wrapper to the [EpochService] to implement the [SignedEntityConfigProvider] trait. +/// +/// Needed because the epoch service is wrapped in an Arc> in the dependencies, making +/// direct usage of implemented traits methods difficult. +pub struct SignerSignedEntityConfigProvider { + cardano_network: CardanoNetwork, + epoch_service: EpochServiceWrapper, +} + +impl SignerSignedEntityConfigProvider { + /// Create a new instance of the `SignerSignedEntityConfigProvider`. + pub fn new(cardano_network: CardanoNetwork, epoch_service: EpochServiceWrapper) -> Self { + Self { + cardano_network, + epoch_service, + } + } +} + +#[async_trait] +impl SignedEntityConfigProvider for SignerSignedEntityConfigProvider { + async fn get(&self) -> StdResult { + let epoch_service = self.epoch_service.read().await; let cardano_transactions_signing_config = - match self.cardano_transactions_signing_config()? { + match epoch_service.cardano_transactions_signing_config()? { Some(config) => Ok(config.clone()), None => Err(anyhow!("No cardano transaction signing config available")), }?; Ok(SignedEntityConfig { - allowed_discriminants: self.allowed_discriminants()?.clone(), + allowed_discriminants: epoch_service.allowed_discriminants()?.clone(), network: self.cardano_network, cardano_transactions_signing_config, }) @@ -327,6 +345,7 @@ pub mod mock_epoch_service { #[cfg(test)] mod tests { use std::sync::Arc; + use tokio::sync::RwLock; use mithril_common::entities::{Epoch, StakeDistribution}; use mithril_common::test_utils::{fake_data, MithrilFixtureBuilder}; @@ -350,7 +369,7 @@ mod tests { ) .unwrap(); let stake_store = Arc::new(StakeStore::new(Box::new(DumbStoreAdapter::new()), None)); - let service = MithrilEpochService::new(stake_store, fake_data::network()); + let service = MithrilEpochService::new(stake_store); service .is_signer_included_in_current_stake_distribution(party_id, protocol_initializer) @@ -373,7 +392,7 @@ mod tests { ..SignerEpochSettings::dummy().clone() }; - let mut service = MithrilEpochService::new(stake_store, fake_data::network()); + let mut service = MithrilEpochService::new(stake_store); service .inform_epoch_settings(epoch_settings.clone(), BTreeSet::new()) .unwrap(); @@ -424,7 +443,7 @@ mod tests { .expect("save_stakes should not fail"); // Build service and register epoch settings - let service = MithrilEpochService::new(stake_store, fake_data::network()); + let service = MithrilEpochService::new(stake_store); assert!(service.epoch_of_current_data().is_err()); assert!(service.next_protocol_parameters().is_err()); assert!(service.current_signers().is_err()); @@ -453,7 +472,7 @@ mod tests { }; // Build service and register epoch settings - let mut service = MithrilEpochService::new(stake_store, fake_data::network()); + let mut service = MithrilEpochService::new(stake_store); service .inform_epoch_settings( @@ -546,7 +565,7 @@ mod tests { }; // Build service and register epoch settings - let mut service = MithrilEpochService::new(stake_store, fake_data::network()); + let mut service = MithrilEpochService::new(stake_store); service .inform_epoch_settings(epoch_settings.clone(), BTreeSet::new()) .unwrap(); @@ -574,17 +593,21 @@ mod tests { } } - #[test] - fn is_source_of_signed_entity_config() { + #[tokio::test] + async fn is_source_of_signed_entity_config() { let stake_store = Arc::new(StakeStore::new( Box::new(MemoryAdapter::::new(None).unwrap()), None, )); - let mut service = MithrilEpochService::new(stake_store, fake_data::network()); + let epoch_service = Arc::new(RwLock::new(MithrilEpochService::new(stake_store))); + let config_provider = SignerSignedEntityConfigProvider { + cardano_network: fake_data::network(), + epoch_service: epoch_service.clone(), + }; // Fail before the first `inform_epoch_settings` { - SignedEntityConfigProvider::get(&service).expect_err( + config_provider.get().await.expect_err( "Should fail since sources data are not set before the first inform_epoch_settings", ); } @@ -592,7 +615,10 @@ mod tests { { let allowed_discriminants = BTreeSet::from([SignedEntityTypeDiscriminants::CardanoImmutableFilesFull]); - service + + epoch_service + .write() + .await .inform_epoch_settings( SignerEpochSettings { cardano_transactions_signing_config: None, @@ -602,14 +628,18 @@ mod tests { ) .unwrap(); - SignedEntityConfigProvider::get(&service) + config_provider + .get() + .await .expect_err("Should fail since cardano_transactions_signing_config is not set"); } // Success after `inform_epoch_settings` if `cardano_transactions_signing_config` is set { let allowed_discriminants = BTreeSet::from([SignedEntityTypeDiscriminants::CardanoImmutableFilesFull]); - service + epoch_service + .write() + .await .inform_epoch_settings( SignerEpochSettings { cardano_transactions_signing_config: Some( @@ -621,7 +651,7 @@ mod tests { ) .unwrap(); - let config = SignedEntityConfigProvider::get(&service).unwrap(); + let config = config_provider.get().await.unwrap(); assert_eq!( SignedEntityConfig { diff --git a/mithril-signer/tests/test_extensions/state_machine_tester.rs b/mithril-signer/tests/test_extensions/state_machine_tester.rs index be9e25e4cba..2ab3aa5101e 100644 --- a/mithril-signer/tests/test_extensions/state_machine_tester.rs +++ b/mithril-signer/tests/test_extensions/state_machine_tester.rs @@ -206,10 +206,7 @@ impl StateMachineTester { let cardano_stake_distribution_builder = Arc::new( CardanoStakeDistributionSignableBuilder::new(stake_store.clone()), ); - let epoch_service = Arc::new(RwLock::new(MithrilEpochService::new( - stake_store.clone(), - network, - ))); + let epoch_service = Arc::new(RwLock::new(MithrilEpochService::new(stake_store.clone()))); let signable_seed_builder_service = Arc::new(SignerSignableSeedBuilder::new( epoch_service.clone(), single_signer.clone(), From 4ce60621650e23437a2b09ffe6794be0ac001283 Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Fri, 27 Sep 2024 17:39:04 +0200 Subject: [PATCH 128/274] chore: wire certifier service in signer dependencies --- .../src/dependency_injection/builder.rs | 16 +++++++-- .../src/dependency_injection/containers.rs | 7 +++- mithril-signer/src/runtime/runner.rs | 16 ++++++++- .../test_extensions/state_machine_tester.rs | 33 +++++++++++++------ 4 files changed, 58 insertions(+), 14 deletions(-) diff --git a/mithril-signer/src/dependency_injection/builder.rs b/mithril-signer/src/dependency_injection/builder.rs index 63fe60b0668..d62eed6ba34 100644 --- a/mithril-signer/src/dependency_injection/builder.rs +++ b/mithril-signer/src/dependency_injection/builder.rs @@ -35,12 +35,14 @@ use mithril_persistence::sqlite::{ConnectionBuilder, SqliteConnection, SqliteCon use mithril_persistence::store::adapter::SQLiteAdapter; use mithril_persistence::store::StakeStore; +use crate::database::repository::SignedBeaconRepository; use crate::dependency_injection::SignerDependencyContainer; use crate::services::{ AggregatorHTTPClient, CardanoTransactionsImporter, CardanoTransactionsPreloaderActivationSigner, MithrilEpochService, MithrilSingleSigner, - SignerSignableSeedBuilder, SignerUpkeepService, TransactionsImporterByChunk, - TransactionsImporterWithPruner, TransactionsImporterWithVacuum, + SignerCertifierService, SignerSignableSeedBuilder, SignerSignedEntityConfigProvider, + SignerUpkeepService, TransactionsImporterByChunk, TransactionsImporterWithPruner, + TransactionsImporterWithVacuum, }; use crate::store::{MKTreeStoreSqlite, ProtocolInitializerStore}; use crate::{ @@ -351,6 +353,15 @@ impl<'a> DependenciesBuilder<'a> { signed_entity_type_lock.clone(), slog_scope::logger(), )); + let certifier = Arc::new(SignerCertifierService::new( + ticker_service.clone(), + Arc::new(SignedBeaconRepository::new(sqlite_connection.clone())), + Arc::new(SignerSignedEntityConfigProvider::new( + network, + epoch_service.clone(), + )), + signed_entity_type_lock.clone(), + )); let services = SignerDependencyContainer { ticker_service, @@ -369,6 +380,7 @@ impl<'a> DependenciesBuilder<'a> { cardano_transactions_preloader, upkeep_service, epoch_service, + certifier, }; Ok(services) diff --git a/mithril-signer/src/dependency_injection/containers.rs b/mithril-signer/src/dependency_injection/containers.rs index 1fa46f13add..fedc972e145 100644 --- a/mithril-signer/src/dependency_injection/containers.rs +++ b/mithril-signer/src/dependency_injection/containers.rs @@ -11,7 +11,9 @@ use mithril_common::TickerService; use mithril_persistence::store::StakeStore; use tokio::sync::RwLock; -use crate::services::{AggregatorClient, EpochService, SingleSigner, UpkeepService}; +use crate::services::{ + AggregatorClient, CertifierService, EpochService, SingleSigner, UpkeepService, +}; use crate::store::ProtocolInitializerStorer; use crate::MetricsService; @@ -75,4 +77,7 @@ pub struct SignerDependencyContainer { /// Epoch service pub epoch_service: EpochServiceWrapper, + + /// Certifier service + pub certifier: Arc, } diff --git a/mithril-signer/src/runtime/runner.rs b/mithril-signer/src/runtime/runner.rs index 64d0138c062..91f5f70f549 100644 --- a/mithril-signer/src/runtime/runner.rs +++ b/mithril-signer/src/runtime/runner.rs @@ -459,11 +459,14 @@ mod tests { use mithril_persistence::store::adapter::{DumbStoreAdapter, MemoryAdapter}; use mithril_persistence::store::{StakeStore, StakeStorer}; + use crate::database::repository::SignedBeaconRepository; + use crate::database::test_helper::main_db_connection; use crate::metrics::MetricsService; use crate::services::{ CardanoTransactionsImporter, DumbAggregatorClient, MithrilEpochService, MithrilSingleSigner, MockAggregatorClient, MockTransactionStore, MockUpkeepService, - SignerSignableSeedBuilder, SingleSigner, + SignerCertifierService, SignerSignableSeedBuilder, SignerSignedEntityConfigProvider, + SingleSigner, }; use crate::store::ProtocolInitializerStore; @@ -569,6 +572,7 @@ mod tests { } async fn init_services() -> SignerDependencyContainer { + let sqlite_connection = Arc::new(main_db_connection().unwrap()); let adapter: MemoryAdapter = MemoryAdapter::new(None).unwrap(); let stake_distribution_signers = fake_data::signers_with_stakes(2); let party_id = stake_distribution_signers[1].party_id.clone(); @@ -647,6 +651,15 @@ mod tests { Arc::new(CardanoTransactionsPreloaderActivation::new(true)), )); let upkeep_service = Arc::new(MockUpkeepService::new()); + let certifier = Arc::new(SignerCertifierService::new( + ticker_service.clone(), + Arc::new(SignedBeaconRepository::new(sqlite_connection.clone())), + Arc::new(SignerSignedEntityConfigProvider::new( + network, + epoch_service.clone(), + )), + signed_entity_type_lock.clone(), + )); SignerDependencyContainer { stake_store, @@ -665,6 +678,7 @@ mod tests { cardano_transactions_preloader, upkeep_service, epoch_service, + certifier, } } diff --git a/mithril-signer/tests/test_extensions/state_machine_tester.rs b/mithril-signer/tests/test_extensions/state_machine_tester.rs index 2ab3aa5101e..295390759db 100644 --- a/mithril-signer/tests/test_extensions/state_machine_tester.rs +++ b/mithril-signer/tests/test_extensions/state_machine_tester.rs @@ -1,5 +1,12 @@ #![allow(dead_code)] use anyhow::anyhow; +use prometheus_parse::Value; +use slog::Drain; +use slog_scope::debug; +use std::{collections::BTreeMap, fmt::Debug, path::Path, sync::Arc, time::Duration}; +use thiserror::Error; +use tokio::sync::RwLock; + use mithril_common::{ api_version::APIVersionProvider, cardano_block_scanner::{DumbBlockScanner, ScannedBlock}, @@ -21,28 +28,24 @@ use mithril_common::{ signed_entity_type_lock::SignedEntityTypeLock, MithrilTickerService, StdError, TickerService, }; -use mithril_persistence::database::repository::CardanoTransactionRepository; -use mithril_persistence::store::adapter::SQLiteAdapter; use mithril_persistence::{ + database::repository::CardanoTransactionRepository, sqlite::SqliteConnectionPool, - store::{StakeStore, StakeStorer}, + store::{adapter::SQLiteAdapter, StakeStore, StakeStorer}, }; + use mithril_signer::{ + database::repository::SignedBeaconRepository, dependency_injection::{DependenciesBuilder, SignerDependencyContainer}, metrics::*, services::{ AggregatorClient, CardanoTransactionsImporter, MithrilEpochService, MithrilSingleSigner, - SignerSignableSeedBuilder, SignerUpkeepService, + SignerCertifierService, SignerSignableSeedBuilder, SignerSignedEntityConfigProvider, + SignerUpkeepService, }, store::{MKTreeStoreSqlite, ProtocolInitializerStore, ProtocolInitializerStorer}, Configuration, MetricsService, RuntimeError, SignerRunner, SignerState, StateMachine, }; -use prometheus_parse::Value; -use slog::Drain; -use slog_scope::debug; -use std::{collections::BTreeMap, fmt::Debug, path::Path, sync::Arc, time::Duration}; -use thiserror::Error; -use tokio::sync::RwLock; use super::FakeAggregator; @@ -238,6 +241,15 @@ impl StateMachineTester { signed_entity_type_lock.clone(), slog_scope::logger(), )); + let certifier = Arc::new(SignerCertifierService::new( + ticker_service.clone(), + Arc::new(SignedBeaconRepository::new(sqlite_connection.clone())), + Arc::new(SignerSignedEntityConfigProvider::new( + network, + epoch_service.clone(), + )), + signed_entity_type_lock.clone(), + )); let services = SignerDependencyContainer { certificate_handler: certificate_handler.clone(), @@ -256,6 +268,7 @@ impl StateMachineTester { cardano_transactions_preloader, upkeep_service, epoch_service, + certifier, }; // set up stake distribution chain_observer From cb4d253f3924160bc4e8588b01dbd95412cecf8d Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Fri, 27 Sep 2024 18:22:16 +0200 Subject: [PATCH 129/274] feat: make signer compute what to sign on its own In its state machine, using the new certifier service. --- mithril-signer/src/runtime/runner.rs | 20 ++- mithril-signer/src/runtime/state_machine.rs | 147 +++++++++++--------- 2 files changed, 97 insertions(+), 70 deletions(-) diff --git a/mithril-signer/src/runtime/runner.rs b/mithril-signer/src/runtime/runner.rs index 91f5f70f549..6797323172f 100644 --- a/mithril-signer/src/runtime/runner.rs +++ b/mithril-signer/src/runtime/runner.rs @@ -14,7 +14,7 @@ use mithril_persistence::store::StakeStorer; use crate::dependency_injection::SignerDependencyContainer; use crate::entities::SignerEpochSettings; -use crate::services::{EpochService, MithrilProtocolInitializerBuilder}; +use crate::services::{BeaconToSign, EpochService, MithrilProtocolInitializerBuilder}; use crate::Configuration; /// This trait is mainly intended for mocking. @@ -26,6 +26,9 @@ pub trait Runner: Send + Sync { /// Fetch the current pending certificate if any. async fn get_pending_certificate(&self) -> StdResult>; + /// Fetch the beacon to sign if any. + async fn get_beacon_to_sign(&self) -> StdResult>; + /// Fetch the current time point from the Cardano node. async fn get_current_time_point(&self) -> StdResult; @@ -65,6 +68,9 @@ pub trait Runner: Send + Sync { signed_message: &ProtocolMessage, ) -> StdResult<()>; + /// Mark the beacon as signed. + async fn mark_beacon_as_signed(&self, beacon: &BeaconToSign) -> StdResult<()>; + /// Read the current era and update the EraChecker. async fn update_era_checker(&self, epoch: Epoch) -> StdResult<()>; @@ -136,6 +142,12 @@ impl Runner for SignerRunner { .map_err(|e| e.into()) } + async fn get_beacon_to_sign(&self) -> StdResult> { + debug!("RUNNER: get_beacon_to_sign"); + + self.services.certifier.get_beacon_to_sign().await + } + async fn get_current_time_point(&self) -> StdResult { debug!("RUNNER: get_current_time_point"); @@ -387,6 +399,12 @@ impl Runner for SignerRunner { } } + async fn mark_beacon_as_signed(&self, beacon: &BeaconToSign) -> StdResult<()> { + debug!("RUNNER: mark_beacon_as_signed"; "beacon" => ?beacon); + + self.services.certifier.mark_beacon_as_signed(beacon).await + } + async fn update_era_checker(&self, epoch: Epoch) -> StdResult<()> { debug!("RUNNER: update_era_checker"); diff --git a/mithril-signer/src/runtime/state_machine.rs b/mithril-signer/src/runtime/state_machine.rs index c6d58580123..e23192048a5 100644 --- a/mithril-signer/src/runtime/state_machine.rs +++ b/mithril-signer/src/runtime/state_machine.rs @@ -4,9 +4,10 @@ use tokio::{sync::Mutex, time::sleep}; use mithril_common::{ crypto_helper::ProtocolInitializerError, - entities::{CertificatePending, Epoch, SignedEntityType, TimePoint}, + entities::{Epoch, SignedEntityType, TimePoint}, }; +use crate::services::BeaconToSign; use crate::{entities::SignerEpochSettings, MetricsService}; use super::{Runner, RuntimeError}; @@ -87,10 +88,10 @@ pub struct StateMachine { } enum ReadyToSignTransition { - ToReadyToSign(CertificatePending), + ToReadyToSign(BeaconToSign), NoTransitionAlreadySigned, - NoTransitionCannotSignPendingCertificate, - NoTransitionNoPendingCertificate, + NoTransitionCannotSignBeacon, + NoTransitionNoBeaconToSign, } impl StateMachine { @@ -207,25 +208,21 @@ impl StateMachine { .await?; } None => { - let pending_certificate = - self.runner.get_pending_certificate().await.map_err(|e| { - RuntimeError::KeepState { - message: "could not fetch the pending certificate".to_string(), - nested_error: Some(e), - } - })?; - if let ReadyToSignTransition::ToReadyToSign(certificate) = self + let beacon_to_sign = self.runner.get_beacon_to_sign().await.map_err(|e| { + RuntimeError::KeepState { + message: "could not fetch the beacon to sign".to_string(), + nested_error: Some(e), + } + })?; + if let ReadyToSignTransition::ToReadyToSign(beacon) = self .ready_to_sign_certificate_next_transition( - pending_certificate, + beacon_to_sign, last_signed_entity_type, ) .await { *state = self - .transition_from_ready_to_sign_to_ready_to_sign( - *epoch, - &certificate.signed_entity_type, - ) + .transition_from_ready_to_sign_to_ready_to_sign(*epoch, beacon) .await?; } } @@ -240,47 +237,45 @@ impl StateMachine { async fn ready_to_sign_certificate_next_transition( &self, - certificate_pending: Option, + beacon_to_sign: Option, last_signed_entity: &Option, ) -> ReadyToSignTransition { + // Todo: remove those two checks are they are already done by the certifier fn is_same_signed_entity_type( signed_entity_type: &Option, - certificate: &CertificatePending, + beacon_to_sign: &BeaconToSign, ) -> bool { - Some(&certificate.signed_entity_type) == signed_entity_type.as_ref() + Some(&beacon_to_sign.signed_entity_type) == signed_entity_type.as_ref() } - async fn can_sign_signed_entity_type( - s: &StateMachine, - certificate: &CertificatePending, - ) -> bool { + async fn can_sign_signed_entity_type(s: &StateMachine, beacon: &BeaconToSign) -> bool { s.runner - .can_sign_signed_entity_type(&certificate.signed_entity_type) + .can_sign_signed_entity_type(&beacon.signed_entity_type) .await } - match certificate_pending { - Some(certificate) if is_same_signed_entity_type(last_signed_entity, &certificate) => { - info!(" â‹… same entity type, already signed the pending certificate, waiting…"); + match beacon_to_sign { + Some(beacon) if is_same_signed_entity_type(last_signed_entity, &beacon) => { + info!(" â‹… same entity type, already signed, waiting…"); ReadyToSignTransition::NoTransitionAlreadySigned } - Some(certificate) if can_sign_signed_entity_type(self, &certificate).await => { + Some(beacon) if can_sign_signed_entity_type(self, &beacon).await => { info!( - " â‹… Epoch has NOT changed we can sign this certificate, transiting to ReadyToSign"; - "pending_certificate" => ?certificate, + " â‹… Epoch has NOT changed we can sign this beacon, transiting to ReadyToSign"; + "beacon_to_sign" => ?beacon, ); - ReadyToSignTransition::ToReadyToSign(certificate) + ReadyToSignTransition::ToReadyToSign(beacon) } - Some(certificate) => { + Some(beacon) => { info!( - " â‹… Epoch has NOT changed but cannot sign this pending certificate, waiting…"; - "pending_certificate" => ?certificate + " â‹… Epoch has NOT changed but cannot sign this beacon, waiting…"; + "beacon_to_sign" => ?beacon ); - ReadyToSignTransition::NoTransitionCannotSignPendingCertificate + ReadyToSignTransition::NoTransitionCannotSignBeacon } None => { - info!(" â‹… no pending certificate, waiting…"); - ReadyToSignTransition::NoTransitionNoPendingCertificate + info!(" â‹… no beacon to sign, waiting…"); + ReadyToSignTransition::NoTransitionNoBeaconToSign } } } @@ -410,7 +405,7 @@ impl StateMachine { async fn transition_from_ready_to_sign_to_ready_to_sign( &self, current_epoch: Epoch, - signed_entity_type: &SignedEntityType, + beacon_to_sign: BeaconToSign, ) -> Result { let (retrieval_epoch, next_retrieval_epoch) = ( current_epoch.offset_to_signer_retrieval_epoch()?, @@ -429,7 +424,7 @@ impl StateMachine { let message = self .runner - .compute_message(signed_entity_type) + .compute_message(&beacon_to_sign.signed_entity_type) .await .map_err(|e| RuntimeError::KeepState { message: format!("Could not compute message during 'ready to sign → ready to sign' phase (current epoch {current_epoch:?})"), @@ -444,11 +439,16 @@ impl StateMachine { message: format!("Could not compute single signature during 'ready to sign → ready to sign' phase (current epoch {current_epoch:?})"), nested_error: Some(e) })?; - self.runner.send_single_signature(signed_entity_type, single_signatures, &message).await + self.runner.send_single_signature(&beacon_to_sign.signed_entity_type, single_signatures, &message).await .map_err(|e| RuntimeError::KeepState { message: format!("Could not send single signature during 'ready to sign → ready to sign' phase (current epoch {current_epoch:?})"), nested_error: Some(e) })?; + self.runner.mark_beacon_as_signed(&beacon_to_sign).await + .map_err(|e| RuntimeError::KeepState { + message: format!("Could not mark beacon as signed during 'ready to sign → ready to sign' phase (current epoch {current_epoch:?})"), + nested_error: Some(e) + })?; self.metrics_service .signature_registration_success_since_startup_counter_increment(); @@ -457,7 +457,7 @@ impl StateMachine { Ok(SignerState::ReadyToSign { epoch: current_epoch, - last_signed_entity_type: Some(signed_entity_type.to_owned()), + last_signed_entity_type: Some(beacon_to_sign.signed_entity_type), }) } @@ -491,11 +491,14 @@ impl StateMachine { #[cfg(test)] mod tests { + use chrono::DateTime; + use mockall::predicate; + use mithril_common::entities::{ChainPoint, Epoch, ProtocolMessage}; use mithril_common::test_utils::fake_data; - use mockall::predicate; use crate::runtime::runner::MockSignerRunner; + use crate::services::BeaconToSign; use super::*; @@ -775,9 +778,10 @@ mod tests { last_signed_entity_type: None, }; - let certificate_pending = CertificatePending { + let beacon_to_sign = BeaconToSign { epoch: time_point.epoch, - ..fake_data::certificate_pending() + signed_entity_type: SignedEntityType::MithrilStakeDistribution(time_point.epoch), + initiated_at: DateTime::default(), }; let time_point_clone = time_point.clone(); let mut runner = MockSignerRunner::new(); @@ -786,9 +790,9 @@ mod tests { .once() .returning(move || Ok(time_point_clone.to_owned())); runner - .expect_get_pending_certificate() + .expect_get_beacon_to_sign() .once() - .returning(move || Ok(Some(certificate_pending.to_owned()))); + .returning(move || Ok(Some(beacon_to_sign.to_owned()))); runner .expect_can_sign_signed_entity_type() .once() @@ -814,14 +818,15 @@ mod tests { #[tokio::test] async fn ready_to_sign_to_ready_to_sign_when_same_signed_entity_type() { let time_point = TimePoint::dummy(); - let certificate_pending = CertificatePending { - epoch: time_point.clone().epoch, - ..fake_data::certificate_pending() + let beacon_to_sign = BeaconToSign { + epoch: time_point.epoch, + signed_entity_type: SignedEntityType::CardanoStakeDistribution(time_point.epoch), + initiated_at: DateTime::default(), }; - let certificate_pending_clone = certificate_pending.clone(); + let beacon_to_sign_clone = beacon_to_sign.clone(); let state = SignerState::ReadyToSign { epoch: time_point.epoch, - last_signed_entity_type: Some(certificate_pending.signed_entity_type.clone()), + last_signed_entity_type: Some(beacon_to_sign.signed_entity_type.clone()), }; let time_point_clone = time_point.clone(); let mut runner = MockSignerRunner::new(); @@ -829,9 +834,9 @@ mod tests { .expect_get_current_time_point() .returning(move || Ok(time_point_clone.to_owned())); runner - .expect_get_pending_certificate() + .expect_get_beacon_to_sign() .times(1) - .returning(move || Ok(Some(certificate_pending.clone()))); + .returning(move || Ok(Some(beacon_to_sign.clone()))); runner .expect_can_sign_signed_entity_type() .returning(move |_| true); @@ -845,7 +850,7 @@ mod tests { assert_eq!( SignerState::ReadyToSign { epoch: time_point.epoch, - last_signed_entity_type: Some(certificate_pending_clone.signed_entity_type) + last_signed_entity_type: Some(beacon_to_sign_clone.signed_entity_type) }, state_machine.get_state().await, "state machine did not return a ReadyToSign state but {:?}", @@ -860,14 +865,14 @@ mod tests { epoch: time_point.epoch, last_signed_entity_type: None, }; - let certificate_pending = CertificatePending { + let beacon_to_sign = BeaconToSign { epoch: time_point.epoch, signed_entity_type: SignedEntityType::MithrilStakeDistribution(time_point.epoch), - ..fake_data::certificate_pending() + initiated_at: Default::default(), }; assert_ready_to_sign_to_ready_to_sign_when_different_state_than_previous_one( state, - certificate_pending, + beacon_to_sign, ) .await } @@ -881,15 +886,15 @@ mod tests { time_point.epoch, )), }; - let certificate_pending = CertificatePending { + let beacon_to_sign = BeaconToSign { epoch: time_point.epoch, signed_entity_type: SignedEntityType::MithrilStakeDistribution(time_point.epoch), - ..fake_data::certificate_pending() + initiated_at: Default::default(), }; assert_ready_to_sign_to_ready_to_sign_when_different_state_than_previous_one( state, - certificate_pending, + beacon_to_sign, ) .await } @@ -904,22 +909,22 @@ mod tests { time_point.epoch, )), }; - let certificate_pending = CertificatePending { + let beacon_to_sign = BeaconToSign { epoch: time_point.epoch + 10, // Check that the epoch signed_entity_type: SignedEntityType::MithrilStakeDistribution(time_point.epoch), - ..fake_data::certificate_pending() + initiated_at: Default::default(), }; assert_ready_to_sign_to_ready_to_sign_when_different_state_than_previous_one( state, - certificate_pending, + beacon_to_sign, ) .await } async fn assert_ready_to_sign_to_ready_to_sign_when_different_state_than_previous_one( initial_state: SignerState, - certificate_pending: CertificatePending, + beacon_to_sign: BeaconToSign, ) { let initial_state_epoch = match initial_state.clone() { SignerState::ReadyToSign { @@ -933,16 +938,16 @@ mod tests { ..TimePoint::dummy() }; - let certificate_pending_clone = certificate_pending.clone(); + let beacon_to_sign_clone = beacon_to_sign.clone(); let mut runner = MockSignerRunner::new(); runner .expect_get_current_time_point() .once() .returning(move || Ok(time_point.to_owned())); runner - .expect_get_pending_certificate() + .expect_get_beacon_to_sign() .once() - .returning(move || Ok(Some(certificate_pending.clone()))); + .returning(move || Ok(Some(beacon_to_sign.clone()))); runner .expect_compute_single_signature() .once() @@ -955,6 +960,10 @@ mod tests { .expect_send_single_signature() .once() .returning(|_, _, _| Ok(())); + runner + .expect_mark_beacon_as_signed() + .once() + .returning(|_| Ok(())); runner .expect_can_sign_signed_entity_type() .once() @@ -969,7 +978,7 @@ mod tests { assert_eq!( SignerState::ReadyToSign { epoch: initial_state_epoch, - last_signed_entity_type: Some(certificate_pending_clone.signed_entity_type) + last_signed_entity_type: Some(beacon_to_sign_clone.signed_entity_type) }, state_machine.get_state().await, "state machine did not return a ReadyToSign state but {:?}", From 16cce94e851f33cf31d86033ff059acc5dfefc05 Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Mon, 30 Sep 2024 17:45:32 +0200 Subject: [PATCH 130/274] test: adapt signer integration test * Make `FakeAggregator` emit parametrized list of allowed signed entities in its "aggregator features" and cardano transactions signing config in its "epoch settings". * Check not only the number of sent single signatures but also the last signed beacon. * Adapt scenario to the fact that `MithrilStakeDistribution` and `CardanoImmutableFileFull` signed entities are mandatory in the allowed signed entities (meaning for example that the cardano transaction scenario must sign them both before signing transactions). --- .../query/signed_beacon/get_signed_beacon.rs | 4 +- .../repository/signed_beacon_repository.rs | 54 ++++++++ ...te_cardano_transaction_single_signature.rs | 23 ++-- ...e_immutable_files_full_single_signature.rs | 32 +++-- .../test_extensions/certificate_handler.rs | 118 +++++++++++++++--- .../test_extensions/state_machine_tester.rs | 49 ++++++-- 6 files changed, 236 insertions(+), 44 deletions(-) diff --git a/mithril-signer/src/database/query/signed_beacon/get_signed_beacon.rs b/mithril-signer/src/database/query/signed_beacon/get_signed_beacon.rs index 36e22eb1036..8e382b87b68 100644 --- a/mithril-signer/src/database/query/signed_beacon/get_signed_beacon.rs +++ b/mithril-signer/src/database/query/signed_beacon/get_signed_beacon.rs @@ -12,8 +12,8 @@ pub struct GetSignedBeaconQuery { } impl GetSignedBeaconQuery { - #[cfg(test)] - pub(crate) fn all() -> Self { + /// Get all signed beacons. + pub fn all() -> Self { Self { condition: WhereCondition::default(), } diff --git a/mithril-signer/src/database/repository/signed_beacon_repository.rs b/mithril-signer/src/database/repository/signed_beacon_repository.rs index 28b9b3f041c..67e66bbfe92 100644 --- a/mithril-signer/src/database/repository/signed_beacon_repository.rs +++ b/mithril-signer/src/database/repository/signed_beacon_repository.rs @@ -19,6 +19,11 @@ impl SignedBeaconRepository { pub fn new(connection: Arc) -> Self { Self { connection } } + + /// Get the last signed beacon. + pub fn get_last(&self) -> StdResult> { + self.connection.fetch_first(GetSignedBeaconQuery::all()) + } } #[async_trait] @@ -77,6 +82,55 @@ mod tests { config.list_allowed_signed_entity_types(time_point).unwrap() } + #[test] + fn get_last_stored_signed_beacon() { + let connection = Arc::new(main_db_connection().unwrap()); + let repository = SignedBeaconRepository::new(connection.clone()); + + let last_signed_beacon = repository.get_last().unwrap(); + assert_eq!(None, last_signed_beacon); + + insert_signed_beacons( + &connection, + vec![SignedBeaconRecord::fake( + Epoch(1941), + SignedEntityType::MithrilStakeDistribution(Epoch(1941)), + )], + ); + + let last_signed_beacon = repository.get_last().unwrap(); + assert_eq!( + Some(SignedBeaconRecord::fake( + Epoch(1941), + SignedEntityType::MithrilStakeDistribution(Epoch(1941)), + )), + last_signed_beacon + ); + + insert_signed_beacons( + &connection, + SignedBeaconRecord::fakes(&[ + ( + Epoch(1942), + vec![SignedEntityType::MithrilStakeDistribution(Epoch(1942))], + ), + ( + Epoch(1943), + vec![SignedEntityType::MithrilStakeDistribution(Epoch(1943))], + ), + ]), + ); + + let last_signed_beacon = repository.get_last().unwrap(); + assert_eq!( + Some(SignedBeaconRecord::fake( + Epoch(1943), + SignedEntityType::MithrilStakeDistribution(Epoch(1943)), + )), + last_signed_beacon + ); + } + #[tokio::test] async fn filter_out_nothing_if_nothing_was_previously_signed() { let connection = Arc::new(main_db_connection().unwrap()); diff --git a/mithril-signer/tests/create_cardano_transaction_single_signature.rs b/mithril-signer/tests/create_cardano_transaction_single_signature.rs index 7b4e665cd0c..72e00b8d022 100644 --- a/mithril-signer/tests/create_cardano_transaction_single_signature.rs +++ b/mithril-signer/tests/create_cardano_transaction_single_signature.rs @@ -3,11 +3,14 @@ mod test_extensions; use mithril_common::{ crypto_helper::tests_setup, entities::{ - BlockNumber, ChainPoint, Epoch, SignedEntityTypeDiscriminants, SlotNumber, TimePoint, + BlockNumber, CardanoDbBeacon, ChainPoint, Epoch, + SignedEntityType::{ + CardanoImmutableFilesFull, CardanoTransactions, MithrilStakeDistribution, + }, + SignedEntityTypeDiscriminants, SlotNumber, TimePoint, }, test_utils::MithrilFixtureBuilder, }; - use test_extensions::StateMachineTester; #[rustfmt::skip] @@ -34,12 +37,12 @@ async fn test_create_cardano_transaction_single_signature() { .await .expect("state machine tester init should not fail"); let total_signer_registrations_expected = 3; - let total_signature_registrations_expected = 2; + let total_signature_registrations_expected = 4; tester .comment("state machine starts in Init and transit to Unregistered state.") .is_init().await.unwrap() - .aggregator_send_signed_entity(SignedEntityTypeDiscriminants::CardanoTransactions).await + .aggregator_allow_signed_entities(&[SignedEntityTypeDiscriminants::CardanoTransactions]).await .cycle_unregistered().await.unwrap() .comment("getting an epoch settings changes the state → RegisteredNotAbleToSign") @@ -59,10 +62,16 @@ async fn test_create_cardano_transaction_single_signature() { .comment("signer can now create a single signature → ReadyToSign") .cycle_ready_to_sign_without_signature_registration().await.unwrap() - + + .comment("signer signs a single signature for MithrilStakeDistribution = ReadyToSign") + .cycle_ready_to_sign_with_signature_registration(MithrilStakeDistribution(Epoch(3))).await.unwrap() + + .comment("signer signs a single signature for CardanoImmutableFilesFull = ReadyToSign") + .cycle_ready_to_sign_with_signature_registration(CardanoImmutableFilesFull(CardanoDbBeacon::new("devnet", 3, 1))).await.unwrap() + .comment("creating a new certificate pending with a cardano transaction signed entity → ReadyToSign") .increase_block_number_and_slot_number(70, SlotNumber(80), BlockNumber(170)).await.unwrap() - .cycle_ready_to_sign_with_signature_registration().await.unwrap() + .cycle_ready_to_sign_with_signature_registration(CardanoTransactions(Epoch(3), BlockNumber(149))).await.unwrap() .comment("more cycles do not change the state = ReadyToSign") .cycle_ready_to_sign_without_signature_registration().await.unwrap() @@ -71,7 +80,7 @@ async fn test_create_cardano_transaction_single_signature() { .comment("new blocks means a new signature with the same stake distribution → ReadyToSign") .increase_block_number_and_slot_number(125, SlotNumber(205), BlockNumber(295)).await.unwrap() .cardano_chain_send_rollback(SlotNumber(205), BlockNumber(230)).await.unwrap() - .cycle_ready_to_sign_with_signature_registration().await.unwrap() + .cycle_ready_to_sign_with_signature_registration(CardanoTransactions(Epoch(3), BlockNumber(209))).await.unwrap() .comment("metrics should be correctly computed") .check_metrics(total_signer_registrations_expected,total_signature_registrations_expected).await.unwrap() diff --git a/mithril-signer/tests/create_immutable_files_full_single_signature.rs b/mithril-signer/tests/create_immutable_files_full_single_signature.rs index f7d09f68e24..2a6599fbd70 100644 --- a/mithril-signer/tests/create_immutable_files_full_single_signature.rs +++ b/mithril-signer/tests/create_immutable_files_full_single_signature.rs @@ -1,17 +1,19 @@ mod test_extensions; +use mithril_common::entities::SignedEntityType::{ + CardanoImmutableFilesFull, CardanoStakeDistribution, MithrilStakeDistribution, +}; +use mithril_common::entities::{CardanoDbBeacon, SignedEntityTypeDiscriminants}; use mithril_common::{ crypto_helper::tests_setup, entities::{BlockNumber, ChainPoint, Epoch, SlotNumber, TimePoint}, test_utils::MithrilFixtureBuilder, }; - use test_extensions::StateMachineTester; #[rustfmt::skip] #[tokio::test] async fn test_create_immutable_files_full_single_signature() { - let protocol_parameters = tests_setup::setup_protocol_parameters(); let fixture = MithrilFixtureBuilder::default().with_signers(10).with_protocol_parameters(protocol_parameters.into()).build(); let signers_with_stake = fixture.signers_with_stake(); @@ -26,11 +28,17 @@ async fn test_create_immutable_files_full_single_signature() { }; let mut tester = StateMachineTester::init(&signers_with_stake, initial_time_point).await.expect("state machine tester init should not fail"); let total_signer_registrations_expected = 4; - let total_signature_registrations_expected = 3; + let total_signature_registrations_expected = 5; tester .comment("state machine starts in Init and transit to Unregistered state.") .is_init().await.unwrap() + .aggregator_allow_signed_entities( + &[ + SignedEntityTypeDiscriminants::CardanoImmutableFilesFull, + SignedEntityTypeDiscriminants::MithrilStakeDistribution, + SignedEntityTypeDiscriminants::CardanoStakeDistribution, + ]).await .cycle_unregistered().await.unwrap() .cycle_unregistered().await.unwrap() .check_era_checker_last_updated_at(Epoch(1)).await.unwrap() @@ -84,16 +92,22 @@ async fn test_create_immutable_files_full_single_signature() { .comment("signer can now create a single signature → ReadyToSign") .cycle_ready_to_sign_without_signature_registration().await.unwrap() .check_protocol_initializer(Epoch(4)).await.unwrap() + + .comment("signer signs a single signature for MithrilStakeDistribution = ReadyToSign") + .cycle_ready_to_sign_with_signature_registration(MithrilStakeDistribution(Epoch(4))).await.unwrap() + + .comment("signer signs a single signature for CardanoStakeDistribution = ReadyToSign") + .cycle_ready_to_sign_with_signature_registration(CardanoStakeDistribution(Epoch(3))).await.unwrap() - .comment("signer signs a single signature = ReadyToSign") - .cycle_ready_to_sign_with_signature_registration().await.unwrap() + .comment("signer signs a single signature for CardanoImmutableFilesFull = ReadyToSign") + .cycle_ready_to_sign_with_signature_registration(CardanoImmutableFilesFull(CardanoDbBeacon::new("devnet", 4, 8))).await.unwrap() .comment("more cycles do not change the state = ReadyToSign") .cycle_ready_to_sign_without_signature_registration().await.unwrap() .comment("new immutable means a new signature with the same stake distribution → ReadyToSign") .increase_immutable(1, 9).await.unwrap() - .cycle_ready_to_sign_with_signature_registration().await.unwrap() + .cycle_ready_to_sign_with_signature_registration(CardanoImmutableFilesFull(CardanoDbBeacon::new("devnet", 4, 9))).await.unwrap() .comment("changing epoch changes the state → Unregistered") .increase_epoch(5).await.unwrap() @@ -101,12 +115,12 @@ async fn test_create_immutable_files_full_single_signature() { .check_era_checker_last_updated_at(Epoch(5)).await.unwrap() .comment("signer should be able to create a single signature → ReadyToSign") - .check_total_signature_registrations_metrics(2).unwrap() + .check_total_signature_registrations_metrics(4).unwrap() .cycle_ready_to_sign_without_signature_registration().await.unwrap() - .cycle_ready_to_sign_with_signature_registration().await.unwrap() + .cycle_ready_to_sign_with_signature_registration(MithrilStakeDistribution(Epoch(5))).await.unwrap() .check_protocol_initializer(Epoch(5)).await.unwrap() .comment("metrics should be correctly computed") - .check_metrics(total_signer_registrations_expected,total_signature_registrations_expected).await.unwrap() + .check_metrics(total_signer_registrations_expected, total_signature_registrations_expected).await.unwrap() ; } diff --git a/mithril-signer/tests/test_extensions/certificate_handler.rs b/mithril-signer/tests/test_extensions/certificate_handler.rs index becb8988304..f92962e8f61 100644 --- a/mithril-signer/tests/test_extensions/certificate_handler.rs +++ b/mithril-signer/tests/test_extensions/certificate_handler.rs @@ -1,22 +1,27 @@ -use std::{collections::HashMap, sync::Arc}; - use anyhow::anyhow; use async_trait::async_trait; +use std::collections::BTreeSet; +use std::{collections::HashMap, sync::Arc}; +use tokio::sync::RwLock; + use mithril_common::{ entities::{ - CertificatePending, Epoch, ProtocolMessage, SignedEntityConfig, SignedEntityType, - SignedEntityTypeDiscriminants, Signer, SingleSignatures, TimePoint, + CardanoTransactionsSigningConfig, CertificatePending, Epoch, ProtocolMessage, + SignedEntityConfig, SignedEntityType, SignedEntityTypeDiscriminants, Signer, + SingleSignatures, TimePoint, }, messages::AggregatorFeaturesMessage, test_utils::fake_data, MithrilTickerService, TickerService, }; -use mithril_signer::entities::SignerEpochSettings; -use mithril_signer::services::{AggregatorClient, AggregatorClientError}; -use tokio::sync::RwLock; + +use mithril_signer::{ + entities::SignerEpochSettings, + services::{AggregatorClient, AggregatorClientError}, +}; pub struct FakeAggregator { - signed_entity_config: SignedEntityConfig, + signed_entity_config: RwLock, registered_signers: RwLock>>, ticker_service: Arc, current_certificate_pending_signed_entity: RwLock, @@ -29,7 +34,7 @@ impl FakeAggregator { ticker_service: Arc, ) -> Self { Self { - signed_entity_config, + signed_entity_config: RwLock::new(signed_entity_config), registered_signers: RwLock::new(HashMap::new()), ticker_service, current_certificate_pending_signed_entity: RwLock::new( @@ -49,12 +54,21 @@ impl FakeAggregator { *settings = false; } - pub async fn change_certificate_pending_signed_entity( + pub async fn change_allowed_discriminants( &self, - discriminant: SignedEntityTypeDiscriminants, + discriminants: &BTreeSet, ) { - let mut signed_entity = self.current_certificate_pending_signed_entity.write().await; - *signed_entity = discriminant; + let mut signed_entity_config = self.signed_entity_config.write().await; + signed_entity_config.allowed_discriminants = discriminants.clone(); + } + + pub async fn change_transaction_signing_config( + &self, + transaction_signing_config: &CardanoTransactionsSigningConfig, + ) { + let mut signed_entity_config = self.signed_entity_config.write().await; + signed_entity_config.cardano_transactions_signing_config = + transaction_signing_config.clone(); } async fn get_time_point(&self) -> Result { @@ -100,6 +114,7 @@ impl AggregatorClient for FakeAggregator { Ok(None) } else { let store = self.registered_signers.read().await; + let signed_entity_config = self.signed_entity_config.read().await; let time_point = self.get_time_point().await?; let current_signers = self.get_current_signers(&store).await?; let next_signers = self.get_next_signers(&store).await?; @@ -110,7 +125,11 @@ impl AggregatorClient for FakeAggregator { next_signers, protocol_parameters: fake_data::protocol_parameters(), next_protocol_parameters: fake_data::protocol_parameters(), - cardano_transactions_signing_config: None, + cardano_transactions_signing_config: Some( + signed_entity_config + .cardano_transactions_signing_config + .clone(), + ), next_cardano_transactions_signing_config: None, })) } @@ -126,11 +145,11 @@ impl AggregatorClient for FakeAggregator { } let current_signed_entity = *self.current_certificate_pending_signed_entity.read().await; + let signed_entity_config = self.signed_entity_config.read().await; let time_point = self.get_time_point().await?; let mut certificate_pending = CertificatePending { epoch: time_point.epoch, - signed_entity_type: self - .signed_entity_config + signed_entity_type: signed_entity_config .time_point_to_signed_entity(current_signed_entity, &time_point) .unwrap(), ..fake_data::certificate_pending() @@ -169,7 +188,18 @@ impl AggregatorClient for FakeAggregator { async fn retrieve_aggregator_features( &self, ) -> Result { - Ok(AggregatorFeaturesMessage::dummy()) + let signed_entity_config = self.signed_entity_config.read().await; + + let mut message = AggregatorFeaturesMessage::dummy(); + message.capabilities.signed_entity_types = + signed_entity_config.allowed_discriminants.clone(); + message.capabilities.cardano_transactions_signing_config = Some( + signed_entity_config + .cardano_transactions_signing_config + .clone(), + ); + + Ok(message) } } @@ -177,7 +207,7 @@ impl AggregatorClient for FakeAggregator { mod tests { use mithril_common::chain_observer::{ChainObserver, FakeObserver}; use mithril_common::digesters::DumbImmutableFileObserver; - use mithril_common::entities::ChainPoint; + use mithril_common::entities::{BlockNumber, ChainPoint}; use mithril_common::test_utils::fake_data; use super::*; @@ -349,4 +379,56 @@ mod tests { assert_eq!(2, cert.next_signers.len()); assert_eq!(3, cert.epoch); } + + #[tokio::test] + async fn retrieve_aggregator_features() { + let (_chain_observer, fake_aggregator) = init().await; + + { + let mut signing_config = fake_aggregator.signed_entity_config.write().await; + signing_config.allowed_discriminants = SignedEntityTypeDiscriminants::all(); + signing_config.cardano_transactions_signing_config = + CardanoTransactionsSigningConfig::dummy(); + } + + let features = fake_aggregator + .retrieve_aggregator_features() + .await + .unwrap(); + assert_eq!( + &SignedEntityTypeDiscriminants::all(), + &features.capabilities.signed_entity_types, + ); + + let new_discriminants = BTreeSet::from([ + SignedEntityTypeDiscriminants::CardanoTransactions, + SignedEntityTypeDiscriminants::CardanoImmutableFilesFull, + ]); + let new_transaction_signing_config = CardanoTransactionsSigningConfig { + security_parameter: BlockNumber(70), + step: BlockNumber(20), + }; + + fake_aggregator + .change_allowed_discriminants(&new_discriminants) + .await; + fake_aggregator + .change_transaction_signing_config(&new_transaction_signing_config) + .await; + + let updated_features = fake_aggregator + .retrieve_aggregator_features() + .await + .unwrap(); + assert_eq!( + &new_discriminants, + &updated_features.capabilities.signed_entity_types, + ); + assert_eq!( + &Some(new_transaction_signing_config), + &updated_features + .capabilities + .cardano_transactions_signing_config, + ); + } } diff --git a/mithril-signer/tests/test_extensions/state_machine_tester.rs b/mithril-signer/tests/test_extensions/state_machine_tester.rs index 295390759db..587c546df67 100644 --- a/mithril-signer/tests/test_extensions/state_machine_tester.rs +++ b/mithril-signer/tests/test_extensions/state_machine_tester.rs @@ -3,7 +3,13 @@ use anyhow::anyhow; use prometheus_parse::Value; use slog::Drain; use slog_scope::debug; -use std::{collections::BTreeMap, fmt::Debug, path::Path, sync::Arc, time::Duration}; +use std::{ + collections::{BTreeMap, BTreeSet}, + fmt::Debug, + path::Path, + sync::Arc, + time::Duration, +}; use thiserror::Error; use tokio::sync::RwLock; @@ -17,7 +23,7 @@ use mithril_common::{ digesters::{DumbImmutableDigester, DumbImmutableFileObserver, ImmutableFileObserver}, entities::{ BlockNumber, CardanoTransactionsSigningConfig, ChainPoint, Epoch, SignedEntityConfig, - SignedEntityTypeDiscriminants, SignerWithStake, SlotNumber, TimePoint, + SignedEntityType, SignedEntityTypeDiscriminants, SignerWithStake, SlotNumber, TimePoint, }, era::{adapters::EraReaderDummyAdapter, EraChecker, EraMarker, EraReader, SupportedEra}, signable_builder::{ @@ -77,6 +83,7 @@ pub struct StateMachineTester { era_checker: Arc, era_reader_adapter: Arc, block_scanner: Arc, + signed_beacon_repository: Arc, metrics_service: Arc, expected_metrics_service: Arc, comment_no: u32, @@ -241,9 +248,11 @@ impl StateMachineTester { signed_entity_type_lock.clone(), slog_scope::logger(), )); + let signed_beacon_repository = + Arc::new(SignedBeaconRepository::new(sqlite_connection.clone())); let certifier = Arc::new(SignerCertifierService::new( ticker_service.clone(), - Arc::new(SignedBeaconRepository::new(sqlite_connection.clone())), + signed_beacon_repository.clone(), Arc::new(SignerSignedEntityConfigProvider::new( network, epoch_service.clone(), @@ -294,6 +303,7 @@ impl StateMachineTester { era_checker, era_reader_adapter, block_scanner, + signed_beacon_repository, metrics_service, expected_metrics_service, comment_no: 0, @@ -308,6 +318,7 @@ impl StateMachineTester { Ok(self) } } + /// trigger a cycle in the state machine async fn cycle(&mut self) -> Result<&mut Self> { self.expected_metrics_service @@ -355,13 +366,18 @@ impl StateMachineTester { self.check_total_signature_registrations_metrics(expected_metric) } - pub async fn cycle_ready_to_sign_with_signature_registration(&mut self) -> Result<&mut Self> { + pub async fn cycle_ready_to_sign_with_signature_registration( + &mut self, + expected_beacon: SignedEntityType, + ) -> Result<&mut Self> { let metric_before = self .metrics_service .signature_registration_success_since_startup_counter_get(); self.cycle_ready_to_sign().await?; + self.check_last_signed_beacon(Some(expected_beacon))?; + let expected_metric = metric_before + 1; self.check_total_signature_registrations_metrics(expected_metric) } @@ -401,13 +417,13 @@ impl StateMachineTester { self } - /// make the aggregator send the certificate pending with the given signed entity from now on - pub async fn aggregator_send_signed_entity( + /// change the signed entities allowed by the aggregator (returned by its '/' endpoint) + pub async fn aggregator_allow_signed_entities( &mut self, - discriminant: SignedEntityTypeDiscriminants, + discriminants: &[SignedEntityTypeDiscriminants], ) -> &mut Self { self.certificate_handler - .change_certificate_pending_signed_entity(discriminant) + .change_allowed_discriminants(&BTreeSet::from_iter(discriminants.iter().cloned())) .await; self } @@ -695,4 +711,21 @@ impl StateMachineTester { Ok(self) } + + pub fn check_last_signed_beacon( + &mut self, + expected_beacon: Option, + ) -> Result<&mut Self> { + let last_signed_beacon = self + .signed_beacon_repository + .get_last()? + .map(|b| b.signed_entity_type); + + self.assert( + expected_beacon == last_signed_beacon, + format!( + "Last signed beacon: given {last_signed_beacon:?}, expected {expected_beacon:?}" + ), + ) + } } From 9fbccb7569fec6da50b01f1dba4dfeb128e341ac Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Mon, 30 Sep 2024 18:56:50 +0200 Subject: [PATCH 131/274] refactor: pass current epoch to signer upkeep service To allow tasks that needs it as parameter such as pruning tasks. --- mithril-signer/src/runtime/runner.rs | 18 +++++++++++++----- mithril-signer/src/runtime/state_machine.rs | 6 +++--- mithril-signer/src/services/upkeep_service.rs | 9 +++++---- 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/mithril-signer/src/runtime/runner.rs b/mithril-signer/src/runtime/runner.rs index 6797323172f..e2822ecd563 100644 --- a/mithril-signer/src/runtime/runner.rs +++ b/mithril-signer/src/runtime/runner.rs @@ -75,7 +75,7 @@ pub trait Runner: Send + Sync { async fn update_era_checker(&self, epoch: Epoch) -> StdResult<()>; /// Perform the upkeep tasks. - async fn upkeep(&self) -> StdResult<()>; + async fn upkeep(&self, current_epoch: Epoch) -> StdResult<()>; } /// This type represents the errors thrown from the Runner. @@ -432,9 +432,9 @@ impl Runner for SignerRunner { Ok(()) } - async fn upkeep(&self) -> StdResult<()> { + async fn upkeep(&self, current_epoch: Epoch) -> StdResult<()> { debug!("RUNNER: upkeep"); - self.services.upkeep_service.run().await?; + self.services.upkeep_service.run(current_epoch).await?; Ok(()) } } @@ -442,6 +442,7 @@ impl Runner for SignerRunner { #[cfg(test)] mod tests { use mockall::mock; + use mockall::predicate::eq; use rand_chacha::ChaCha20Rng; use rand_core::SeedableRng; use std::collections::BTreeSet; @@ -1121,11 +1122,18 @@ mod tests { async fn test_upkeep() { let mut services = init_services().await; let mut upkeep_service_mock = MockUpkeepService::new(); - upkeep_service_mock.expect_run().returning(|| Ok(())).once(); + upkeep_service_mock + .expect_run() + .with(eq(Epoch(17))) + .returning(|_| Ok(())) + .once(); services.upkeep_service = Arc::new(upkeep_service_mock); let runner = init_runner(Some(services), None).await; - runner.upkeep().await.expect("upkeep should not fail"); + runner + .upkeep(Epoch(17)) + .await + .expect("upkeep should not fail"); } #[tokio::test] diff --git a/mithril-signer/src/runtime/state_machine.rs b/mithril-signer/src/runtime/state_machine.rs index e23192048a5..9525270b90a 100644 --- a/mithril-signer/src/runtime/state_machine.rs +++ b/mithril-signer/src/runtime/state_machine.rs @@ -361,7 +361,7 @@ impl StateMachine { .signer_registration_success_last_epoch_gauge_set(epoch); self.runner - .upkeep() + .upkeep(epoch) .await .map_err(|e| RuntimeError::KeepState { message: "Failed to upkeep signer in 'unregistered → registered' phase".to_string(), @@ -581,7 +581,7 @@ mod tests { #[tokio::test] async fn unregistered_to_registered_not_able_to_sign() { let mut runner = MockSignerRunner::new(); - runner.expect_upkeep().returning(|| Ok(())).once(); + runner.expect_upkeep().returning(|_| Ok(())).once(); runner .expect_get_epoch_settings() .once() @@ -635,7 +635,7 @@ mod tests { #[tokio::test] async fn unregistered_to_ready_to_sign() { let mut runner = MockSignerRunner::new(); - runner.expect_upkeep().returning(|| Ok(())).once(); + runner.expect_upkeep().returning(|_| Ok(())).once(); runner .expect_get_epoch_settings() .once() diff --git a/mithril-signer/src/services/upkeep_service.rs b/mithril-signer/src/services/upkeep_service.rs index 22d2f4fbdf3..422d271e952 100644 --- a/mithril-signer/src/services/upkeep_service.rs +++ b/mithril-signer/src/services/upkeep_service.rs @@ -11,6 +11,7 @@ use anyhow::Context; use async_trait::async_trait; use slog::{info, Logger}; +use mithril_common::entities::Epoch; use mithril_common::signed_entity_type_lock::SignedEntityTypeLock; use mithril_common::StdResult; use mithril_persistence::sqlite::{ @@ -22,7 +23,7 @@ use mithril_persistence::sqlite::{ #[async_trait] pub trait UpkeepService: Send + Sync { /// Run the upkeep service. - async fn run(&self) -> StdResult<()>; + async fn run(&self, current_epoch: Epoch) -> StdResult<()>; } /// Implementation of the upkeep service for the signer. @@ -97,7 +98,7 @@ impl SignerUpkeepService { #[async_trait] impl UpkeepService for SignerUpkeepService { - async fn run(&self) -> StdResult<()> { + async fn run(&self, _current_epoch: Epoch) -> StdResult<()> { info!(self.logger, "UpkeepService::start"); self.upkeep_all_databases() @@ -147,7 +148,7 @@ mod tests { TestLogger::file(&log_path), ); - service.run().await.expect("Upkeep service failed"); + service.run(Epoch(13)).await.expect("Upkeep service failed"); } let logs = std::fs::read_to_string(&log_path).unwrap(); @@ -188,7 +189,7 @@ mod tests { TestLogger::file(&log_path), ); - service.run().await.expect("Upkeep service failed"); + service.run(Epoch(13)).await.expect("Upkeep service failed"); } let logs = std::fs::read_to_string(&log_path).unwrap(); From 630085a23875323739c6d606280c0b217b88cf17 Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Mon, 30 Sep 2024 19:03:28 +0200 Subject: [PATCH 132/274] feat: prune stored signed beacon in signer Using the already existing `store_retention_limit`. --- .../signed_beacon/delete_signed_beacon.rs | 99 ++++++++++++++ .../src/database/query/signed_beacon/mod.rs | 2 + .../repository/signed_beacon_repository.rs | 64 ++++++++- .../src/dependency_injection/builder.rs | 6 +- mithril-signer/src/services/upkeep_service.rs | 127 +++++++++++++++++- .../test_extensions/state_machine_tester.rs | 2 + .../mithril-end-to-end/src/mithril/signer.rs | 1 + 7 files changed, 295 insertions(+), 6 deletions(-) create mode 100644 mithril-signer/src/database/query/signed_beacon/delete_signed_beacon.rs diff --git a/mithril-signer/src/database/query/signed_beacon/delete_signed_beacon.rs b/mithril-signer/src/database/query/signed_beacon/delete_signed_beacon.rs new file mode 100644 index 00000000000..030cb2aa4d1 --- /dev/null +++ b/mithril-signer/src/database/query/signed_beacon/delete_signed_beacon.rs @@ -0,0 +1,99 @@ +use sqlite::Value; + +use mithril_common::entities::Epoch; +use mithril_persistence::sqlite::{Query, SourceAlias, SqLiteEntity, WhereCondition}; + +use crate::database::record::SignedBeaconRecord; + +/// Query to delete old [SignedBeaconRecord] from the sqlite database +pub struct DeleteSignedBeaconRecordQuery { + condition: WhereCondition, +} + +impl Query for DeleteSignedBeaconRecordQuery { + type Entity = SignedBeaconRecord; + + fn filters(&self) -> WhereCondition { + self.condition.clone() + } + + fn get_definition(&self, condition: &str) -> String { + // it is important to alias the fields with the same name as the table + // since the table cannot be aliased in a RETURNING statement in SQLite. + let projection = Self::Entity::get_projection() + .expand(SourceAlias::new(&[("{:signed_beacon:}", "signed_beacon")])); + + format!("delete from signed_beacon where {condition} returning {projection}") + } +} + +impl DeleteSignedBeaconRecordQuery { + /// Create the SQL query to prune data older than the given Epoch. + pub fn below_epoch_threshold(epoch_threshold: Epoch) -> Self { + let epoch_threshold = Value::Integer(epoch_threshold.try_into().unwrap()); + + Self { + condition: WhereCondition::new("epoch < ?*", vec![epoch_threshold]), + } + } +} + +#[cfg(test)] +mod tests { + use mithril_common::entities::{BlockNumber, SignedEntityType}; + use mithril_persistence::sqlite::ConnectionExtensions; + + use crate::database::query::GetSignedBeaconQuery; + use crate::database::test_helper::{insert_signed_beacons, main_db_connection}; + + use super::*; + + #[test] + fn test_prune_below_epoch_threshold() { + let connection = main_db_connection().unwrap(); + insert_signed_beacons( + &connection, + SignedBeaconRecord::fakes(&[ + ( + Epoch(7), + vec![ + SignedEntityType::MithrilStakeDistribution(Epoch(7)), + SignedEntityType::CardanoTransactions(Epoch(7), BlockNumber(12)), + ], + ), + ( + Epoch(8), + vec![ + SignedEntityType::MithrilStakeDistribution(Epoch(8)), + SignedEntityType::CardanoStakeDistribution(Epoch(8)), + ], + ), + ( + Epoch(9), + vec![ + SignedEntityType::MithrilStakeDistribution(Epoch(9)), + SignedEntityType::CardanoStakeDistribution(Epoch(9)), + SignedEntityType::CardanoTransactions(Epoch(9), BlockNumber(23)), + ], + ), + ]), + ); + + let cursor = connection + .fetch(DeleteSignedBeaconRecordQuery::below_epoch_threshold(Epoch( + 7, + ))) + .unwrap(); + assert_eq!(0, cursor.count()); + + let cursor = connection + .fetch(DeleteSignedBeaconRecordQuery::below_epoch_threshold(Epoch( + 9, + ))) + .unwrap(); + assert_eq!(4, cursor.count()); + + let cursor = connection.fetch(GetSignedBeaconQuery::all()).unwrap(); + assert_eq!(3, cursor.count()); + } +} diff --git a/mithril-signer/src/database/query/signed_beacon/mod.rs b/mithril-signer/src/database/query/signed_beacon/mod.rs index c3087485734..a77052a7a60 100644 --- a/mithril-signer/src/database/query/signed_beacon/mod.rs +++ b/mithril-signer/src/database/query/signed_beacon/mod.rs @@ -1,5 +1,7 @@ +mod delete_signed_beacon; mod get_signed_beacon; mod insert_signed_beacon; +pub use delete_signed_beacon::*; pub use get_signed_beacon::*; pub use insert_signed_beacon::*; diff --git a/mithril-signer/src/database/repository/signed_beacon_repository.rs b/mithril-signer/src/database/repository/signed_beacon_repository.rs index 67e66bbfe92..1d4aeef99fb 100644 --- a/mithril-signer/src/database/repository/signed_beacon_repository.rs +++ b/mithril-signer/src/database/repository/signed_beacon_repository.rs @@ -1,13 +1,15 @@ use async_trait::async_trait; use std::sync::Arc; -use mithril_common::entities::SignedEntityType; +use mithril_common::entities::{Epoch, SignedEntityType}; use mithril_common::StdResult; use mithril_persistence::sqlite::{ConnectionExtensions, SqliteConnection}; -use crate::database::query::{GetSignedBeaconQuery, InsertSignedBeaconRecordQuery}; +use crate::database::query::{ + DeleteSignedBeaconRecordQuery, GetSignedBeaconQuery, InsertSignedBeaconRecordQuery, +}; use crate::database::record::SignedBeaconRecord; -use crate::services::{BeaconToSign, SignedBeaconStore}; +use crate::services::{BeaconToSign, EpochPruningTask, SignedBeaconStore}; /// A [SignedBeaconStore] implementation using SQLite. pub struct SignedBeaconRepository { @@ -24,6 +26,14 @@ impl SignedBeaconRepository { pub fn get_last(&self) -> StdResult> { self.connection.fetch_first(GetSignedBeaconQuery::all()) } + + /// Prune all signed beacons that have an epoch below the given threshold. + pub fn prune_below_epoch(&self, epoch: Epoch) -> StdResult<()> { + let _ = self + .connection + .fetch_first(DeleteSignedBeaconRecordQuery::below_epoch_threshold(epoch))?; + Ok(()) + } } #[async_trait] @@ -59,12 +69,23 @@ impl SignedBeaconStore for SignedBeaconRepository { } } +#[async_trait] +impl EpochPruningTask for SignedBeaconRepository { + fn pruned_data(&self) -> &'static str { + "Signed Beacon" + } + + async fn prune_below_epoch_threshold(&self, epoch_threshold: Epoch) -> StdResult<()> { + self.prune_below_epoch(epoch_threshold) + } +} + #[cfg(test)] mod tests { use chrono::Utc; use mithril_common::entities::{ - Epoch, SignedEntityConfig, SignedEntityTypeDiscriminants, TimePoint, + BlockNumber, Epoch, SignedEntityConfig, SignedEntityTypeDiscriminants, TimePoint, }; use mithril_persistence::sqlite::ConnectionExtensions; @@ -252,4 +273,39 @@ mod tests { .expect("A signed beacon should have been inserted"); assert_eq!(beacon_to_sign, signed_beacon); } + + #[test] + fn test_prune() { + let connection = Arc::new(main_db_connection().unwrap()); + let repository = SignedBeaconRepository::new(connection.clone()); + insert_signed_beacons( + &connection, + SignedBeaconRecord::fakes(&[ + ( + Epoch(7), + vec![ + SignedEntityType::MithrilStakeDistribution(Epoch(7)), + SignedEntityType::CardanoTransactions(Epoch(7), BlockNumber(12)), + ], + ), + ( + Epoch(8), + vec![SignedEntityType::MithrilStakeDistribution(Epoch(8))], + ), + ]), + ); + + repository.prune_below_epoch(Epoch(8)).unwrap(); + + let signed_beacons: Vec = connection + .fetch_collect(GetSignedBeaconQuery::all()) + .unwrap(); + assert_eq!( + vec![SignedBeaconRecord::fake( + Epoch(8), + SignedEntityType::MithrilStakeDistribution(Epoch(8)) + )], + signed_beacons + ); + } } diff --git a/mithril-signer/src/dependency_injection/builder.rs b/mithril-signer/src/dependency_injection/builder.rs index d62eed6ba34..ff28629d3ea 100644 --- a/mithril-signer/src/dependency_injection/builder.rs +++ b/mithril-signer/src/dependency_injection/builder.rs @@ -347,15 +347,19 @@ impl<'a> DependenciesBuilder<'a> { slog_scope::logger(), Arc::new(preloader_activation), )); + let signed_beacon_repository = + Arc::new(SignedBeaconRepository::new(sqlite_connection.clone())); let upkeep_service = Arc::new(SignerUpkeepService::new( sqlite_connection.clone(), sqlite_connection_cardano_transaction_pool, signed_entity_type_lock.clone(), + vec![signed_beacon_repository.clone()], + self.config.store_retention_limit.map(|limit| limit as u64), slog_scope::logger(), )); let certifier = Arc::new(SignerCertifierService::new( ticker_service.clone(), - Arc::new(SignedBeaconRepository::new(sqlite_connection.clone())), + signed_beacon_repository, Arc::new(SignerSignedEntityConfigProvider::new( network, epoch_service.clone(), diff --git a/mithril-signer/src/services/upkeep_service.rs b/mithril-signer/src/services/upkeep_service.rs index 422d271e952..83449c485e2 100644 --- a/mithril-signer/src/services/upkeep_service.rs +++ b/mithril-signer/src/services/upkeep_service.rs @@ -26,6 +26,17 @@ pub trait UpkeepService: Send + Sync { async fn run(&self, current_epoch: Epoch) -> StdResult<()>; } +/// Define the task responsible for pruning a datasource below a certain epoch threshold. +#[cfg_attr(test, mockall::automock)] +#[async_trait] +pub trait EpochPruningTask: Send + Sync { + /// Get the name of the data that will be pruned. + fn pruned_data(&self) -> &'static str; + + /// Prune the datasource below the given epoch threshold. + async fn prune_below_epoch_threshold(&self, epoch_threshold: Epoch) -> StdResult<()>; +} + /// Implementation of the upkeep service for the signer. /// /// To ensure that connections are cleaned up properly, it creates new connections itself @@ -34,6 +45,8 @@ pub struct SignerUpkeepService { main_db_connection: Arc, cardano_tx_connection_pool: Arc, signed_entity_type_lock: Arc, + pruning_tasks: Vec>, + store_retention_limit: Option, logger: Logger, } @@ -43,16 +56,40 @@ impl SignerUpkeepService { main_db_connection: Arc, cardano_tx_connection_pool: Arc, signed_entity_type_lock: Arc, + pruning_tasks: Vec>, + store_retention_limit: Option, logger: Logger, ) -> Self { Self { main_db_connection, cardano_tx_connection_pool, signed_entity_type_lock, + pruning_tasks, + store_retention_limit, logger, } } + async fn execute_pruning_tasks(&self, current_epoch: Epoch) -> StdResult<()> { + match self + .store_retention_limit + .map(|limit| current_epoch - limit) + { + Some(threshold) if *threshold > 0 => { + for task in &self.pruning_tasks { + info!( + self.logger, "UpkeepService::Pruning stale data"; + "pruned_data" => task.pruned_data(), "below_epoch_threshold" => ?threshold + ); + + task.prune_below_epoch_threshold(threshold).await?; + } + Ok(()) + } + _ => Ok(()), + } + } + async fn upkeep_all_databases(&self) -> StdResult<()> { if self.signed_entity_type_lock.has_locked_entities().await { info!( @@ -98,9 +135,13 @@ impl SignerUpkeepService { #[async_trait] impl UpkeepService for SignerUpkeepService { - async fn run(&self, _current_epoch: Epoch) -> StdResult<()> { + async fn run(&self, current_epoch: Epoch) -> StdResult<()> { info!(self.logger, "UpkeepService::start"); + self.execute_pruning_tasks(current_epoch) + .await + .with_context(|| "Pruning tasks failed")?; + self.upkeep_all_databases() .await .with_context(|| "Database upkeep failed")?; @@ -112,6 +153,8 @@ impl UpkeepService for SignerUpkeepService { #[cfg(test)] mod tests { + use mockall::predicate::eq; + use mithril_common::entities::SignedEntityTypeDiscriminants; use mithril_common::test_utils::TempDir; @@ -123,6 +166,15 @@ mod tests { use super::*; + fn mock_epoch_pruning_task( + mock_config: impl FnOnce(&mut MockEpochPruningTask), + ) -> Arc { + let mut task_mock = MockEpochPruningTask::new(); + task_mock.expect_pruned_data().return_const("mock_data"); + mock_config(&mut task_mock); + Arc::new(task_mock) + } + #[tokio::test] async fn test_cleanup_database() { let (main_db_path, ctx_db_path, log_path) = { @@ -145,6 +197,8 @@ mod tests { cardano_tx_connection, )), Arc::new(SignedEntityTypeLock::default()), + vec![], + None, TestLogger::file(&log_path), ); @@ -186,6 +240,8 @@ mod tests { Arc::new(main_db_connection().unwrap()), Arc::new(SqliteConnectionPool::build(1, cardano_tx_db_connection).unwrap()), signed_entity_type_lock.clone(), + vec![], + None, TestLogger::file(&log_path), ); @@ -205,4 +261,73 @@ mod tests { 0, ); } + + #[tokio::test] + async fn test_execute_all_pruning_tasks() { + let task1 = mock_epoch_pruning_task(|mock| { + mock.expect_prune_below_epoch_threshold() + .once() + .with(eq(Epoch(4))) + .returning(|_| Ok(())); + }); + let task2 = mock_epoch_pruning_task(|mock| { + mock.expect_prune_below_epoch_threshold() + .once() + .with(eq(Epoch(4))) + .returning(|_| Ok(())); + }); + + let service = SignerUpkeepService::new( + Arc::new(main_db_connection().unwrap()), + Arc::new(SqliteConnectionPool::build(1, cardano_tx_db_connection).unwrap()), + Arc::new(SignedEntityTypeLock::default()), + vec![task1, task2], + Some(10), + TestLogger::stdout(), + ); + + service.run(Epoch(14)).await.expect("Upkeep service failed"); + } + + #[tokio::test] + async fn test_dont_execute_pruning_tasks_if_current_epoch_minus_retention_limit_is_0() { + let task = mock_epoch_pruning_task(|mock| { + mock.expect_prune_below_epoch_threshold() + .never() + .returning(|_| Ok(())); + }); + + let service = SignerUpkeepService::new( + Arc::new(main_db_connection().unwrap()), + Arc::new(SqliteConnectionPool::build(1, cardano_tx_db_connection).unwrap()), + Arc::new(SignedEntityTypeLock::default()), + vec![task], + Some(17), + TestLogger::stdout(), + ); + + service.run(Epoch(1)).await.expect("Upkeep service failed"); + service.run(Epoch(16)).await.expect("Upkeep service failed"); + service.run(Epoch(17)).await.expect("Upkeep service failed"); + } + + #[tokio::test] + async fn test_dont_execute_pruning_tasks_if_no_retention_limit_set() { + let task = mock_epoch_pruning_task(|mock| { + mock.expect_prune_below_epoch_threshold() + .never() + .returning(|_| Ok(())); + }); + + let service = SignerUpkeepService::new( + Arc::new(main_db_connection().unwrap()), + Arc::new(SqliteConnectionPool::build(1, cardano_tx_db_connection).unwrap()), + Arc::new(SignedEntityTypeLock::default()), + vec![task], + None, + TestLogger::stdout(), + ); + + service.run(Epoch(29)).await.expect("Upkeep service failed"); + } } diff --git a/mithril-signer/tests/test_extensions/state_machine_tester.rs b/mithril-signer/tests/test_extensions/state_machine_tester.rs index 587c546df67..919f2c7bea2 100644 --- a/mithril-signer/tests/test_extensions/state_machine_tester.rs +++ b/mithril-signer/tests/test_extensions/state_machine_tester.rs @@ -246,6 +246,8 @@ impl StateMachineTester { sqlite_connection.clone(), sqlite_connection_cardano_transaction_pool, signed_entity_type_lock.clone(), + vec![], + None, slog_scope::logger(), )); let signed_beacon_repository = diff --git a/mithril-test-lab/mithril-end-to-end/src/mithril/signer.rs b/mithril-test-lab/mithril-end-to-end/src/mithril/signer.rs index 74aa66fff78..ecfcdf85725 100644 --- a/mithril-test-lab/mithril-end-to-end/src/mithril/signer.rs +++ b/mithril-test-lab/mithril-end-to-end/src/mithril/signer.rs @@ -55,6 +55,7 @@ impl Signer { signer_config.pool_node.db_path.to_str().unwrap(), ), ("DATA_STORES_DIRECTORY", &data_stores_path), + ("STORE_RETENTION_LIMIT", "10"), ("NETWORK_MAGIC", &magic_id), ( "CARDANO_NODE_SOCKET_PATH", From 9e6d67afe0d99b72f77cddfd1951ec6976465118 Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Tue, 1 Oct 2024 12:07:52 +0200 Subject: [PATCH 133/274] refactor: move `BeaconToSign` to entities module in signer --- .../database/record/signed_beacon_record.rs | 2 +- .../repository/signed_beacon_repository.rs | 3 +- mithril-signer/src/entities/beacon_to_sign.rs | 31 +++++++++++++++++++ mithril-signer/src/entities/mod.rs | 2 ++ mithril-signer/src/runtime/runner.rs | 4 +-- mithril-signer/src/runtime/state_machine.rs | 5 ++- mithril-signer/src/services/certifier.rs | 26 ++++------------ 7 files changed, 46 insertions(+), 27 deletions(-) create mode 100644 mithril-signer/src/entities/beacon_to_sign.rs diff --git a/mithril-signer/src/database/record/signed_beacon_record.rs b/mithril-signer/src/database/record/signed_beacon_record.rs index 8ae2f897f10..65f74b948f4 100644 --- a/mithril-signer/src/database/record/signed_beacon_record.rs +++ b/mithril-signer/src/database/record/signed_beacon_record.rs @@ -5,7 +5,7 @@ use mithril_common::entities::{Epoch, SignedEntityType}; use mithril_persistence::database::Hydrator; use mithril_persistence::sqlite::{HydrationError, Projection, SqLiteEntity}; -use crate::services::BeaconToSign; +use crate::entities::BeaconToSign; /// Database record of a beacon signed by the signer #[derive(Debug, Clone, PartialEq)] diff --git a/mithril-signer/src/database/repository/signed_beacon_repository.rs b/mithril-signer/src/database/repository/signed_beacon_repository.rs index 1d4aeef99fb..1b5ace52362 100644 --- a/mithril-signer/src/database/repository/signed_beacon_repository.rs +++ b/mithril-signer/src/database/repository/signed_beacon_repository.rs @@ -9,7 +9,8 @@ use crate::database::query::{ DeleteSignedBeaconRecordQuery, GetSignedBeaconQuery, InsertSignedBeaconRecordQuery, }; use crate::database::record::SignedBeaconRecord; -use crate::services::{BeaconToSign, EpochPruningTask, SignedBeaconStore}; +use crate::entities::BeaconToSign; +use crate::services::{EpochPruningTask, SignedBeaconStore}; /// A [SignedBeaconStore] implementation using SQLite. pub struct SignedBeaconRepository { diff --git a/mithril-signer/src/entities/beacon_to_sign.rs b/mithril-signer/src/entities/beacon_to_sign.rs new file mode 100644 index 00000000000..4e283892afa --- /dev/null +++ b/mithril-signer/src/entities/beacon_to_sign.rs @@ -0,0 +1,31 @@ +use chrono::{DateTime, Utc}; + +use mithril_common::entities::{Epoch, SignedEntityType}; + +/// Beacon to sign +#[derive(Debug, Clone, PartialEq)] +pub struct BeaconToSign { + /// The epoch when the beacon was issued + pub epoch: Epoch, + + /// The signed entity type to sign + pub signed_entity_type: SignedEntityType, + + /// Datetime when the beacon was initiated + pub initiated_at: DateTime, +} + +impl BeaconToSign { + /// Create a new `BeaconToSign` + pub fn new( + epoch: Epoch, + signed_entity_type: SignedEntityType, + initiated_at: DateTime, + ) -> Self { + Self { + epoch, + signed_entity_type, + initiated_at, + } + } +} diff --git a/mithril-signer/src/entities/mod.rs b/mithril-signer/src/entities/mod.rs index b807cde846f..d873f48c1d8 100644 --- a/mithril-signer/src/entities/mod.rs +++ b/mithril-signer/src/entities/mod.rs @@ -2,6 +2,8 @@ //! //! This module provide domain entities for the services & state machine. +mod beacon_to_sign; mod signer_epoch_settings; +pub use beacon_to_sign::*; pub use signer_epoch_settings::*; diff --git a/mithril-signer/src/runtime/runner.rs b/mithril-signer/src/runtime/runner.rs index e2822ecd563..61307f4da7f 100644 --- a/mithril-signer/src/runtime/runner.rs +++ b/mithril-signer/src/runtime/runner.rs @@ -13,8 +13,8 @@ use mithril_common::StdResult; use mithril_persistence::store::StakeStorer; use crate::dependency_injection::SignerDependencyContainer; -use crate::entities::SignerEpochSettings; -use crate::services::{BeaconToSign, EpochService, MithrilProtocolInitializerBuilder}; +use crate::entities::{BeaconToSign, SignerEpochSettings}; +use crate::services::{EpochService, MithrilProtocolInitializerBuilder}; use crate::Configuration; /// This trait is mainly intended for mocking. diff --git a/mithril-signer/src/runtime/state_machine.rs b/mithril-signer/src/runtime/state_machine.rs index 9525270b90a..4b119a58d9e 100644 --- a/mithril-signer/src/runtime/state_machine.rs +++ b/mithril-signer/src/runtime/state_machine.rs @@ -7,8 +7,8 @@ use mithril_common::{ entities::{Epoch, SignedEntityType, TimePoint}, }; -use crate::services::BeaconToSign; -use crate::{entities::SignerEpochSettings, MetricsService}; +use crate::entities::{BeaconToSign, SignerEpochSettings}; +use crate::MetricsService; use super::{Runner, RuntimeError}; @@ -498,7 +498,6 @@ mod tests { use mithril_common::test_utils::fake_data; use crate::runtime::runner::MockSignerRunner; - use crate::services::BeaconToSign; use super::*; diff --git a/mithril-signer/src/services/certifier.rs b/mithril-signer/src/services/certifier.rs index 3b51a1cdd88..074e0b6b4e5 100644 --- a/mithril-signer/src/services/certifier.rs +++ b/mithril-signer/src/services/certifier.rs @@ -1,23 +1,12 @@ use async_trait::async_trait; -use chrono::{DateTime, Utc}; +use chrono::Utc; use std::sync::Arc; -use mithril_common::entities::{Epoch, SignedEntityConfig, SignedEntityType, TimePoint}; +use mithril_common::entities::{SignedEntityConfig, SignedEntityType, TimePoint}; use mithril_common::signed_entity_type_lock::SignedEntityTypeLock; use mithril_common::{StdResult, TickerService}; -/// Beacon to sign -#[derive(Debug, Clone, PartialEq)] -pub struct BeaconToSign { - /// The epoch when the beacon was issued - pub epoch: Epoch, - - /// The signed entity type to sign - pub signed_entity_type: SignedEntityType, - - /// Datetime when the beacon was initiated - pub initiated_at: DateTime, -} +use crate::entities::BeaconToSign; /// Certifier Service /// @@ -114,11 +103,8 @@ impl CertifierService for SignerCertifierService { Ok(None) } else { let signed_entity_type = available_signed_entity_types[0].clone(); - let beacon_to_sign = BeaconToSign { - epoch: time_point.epoch, - signed_entity_type, - initiated_at: Utc::now(), - }; + let beacon_to_sign = + BeaconToSign::new(time_point.epoch, signed_entity_type, Utc::now()); Ok(Some(beacon_to_sign)) } @@ -134,7 +120,7 @@ impl CertifierService for SignerCertifierService { #[cfg(test)] mod tests { use mithril_common::entities::{ - CardanoTransactionsSigningConfig, ChainPoint, SignedEntityTypeDiscriminants, + CardanoTransactionsSigningConfig, ChainPoint, Epoch, SignedEntityTypeDiscriminants, }; use super::{tests::tests_tooling::*, *}; From c9aee831d8eabf8a28c079f559a47022cf960ce9 Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Tue, 1 Oct 2024 17:44:49 +0200 Subject: [PATCH 134/274] refactor: simplify signer state machine & runner Remove two check that are now handled by the certifier: * check that a beacon is already signed * check that the signed entity of a beacon is not locked Remove `get_pending_certificate` and `can_sign_signed_entity_type` from the runner since they are not used anymore by the state machine. --- mithril-signer/src/runtime/runner.rs | 67 +---- mithril-signer/src/runtime/state_machine.rs | 304 ++++---------------- 2 files changed, 60 insertions(+), 311 deletions(-) diff --git a/mithril-signer/src/runtime/runner.rs b/mithril-signer/src/runtime/runner.rs index 61307f4da7f..87347232ee8 100644 --- a/mithril-signer/src/runtime/runner.rs +++ b/mithril-signer/src/runtime/runner.rs @@ -6,8 +6,8 @@ use tokio::sync::RwLockReadGuard; use mithril_common::crypto_helper::{KESPeriod, OpCert, ProtocolOpCert, SerDeShelleyFileFormat}; use mithril_common::entities::{ - CertificatePending, Epoch, PartyId, ProtocolMessage, SignedEntityType, Signer, SignerWithStake, - SingleSignatures, TimePoint, + Epoch, PartyId, ProtocolMessage, SignedEntityType, Signer, SignerWithStake, SingleSignatures, + TimePoint, }; use mithril_common::StdResult; use mithril_persistence::store::StakeStorer; @@ -23,9 +23,6 @@ pub trait Runner: Send + Sync { /// Fetch the current epoch settings if any. async fn get_epoch_settings(&self) -> StdResult>; - /// Fetch the current pending certificate if any. - async fn get_pending_certificate(&self) -> StdResult>; - /// Fetch the beacon to sign if any. async fn get_beacon_to_sign(&self) -> StdResult>; @@ -41,9 +38,6 @@ pub trait Runner: Send + Sync { /// Check if the signer can sign the current epoch. async fn can_sign_current_epoch(&self) -> StdResult; - /// Check if the signer can sign the given signed entity type. - async fn can_sign_signed_entity_type(&self, signed_entity_type: &SignedEntityType) -> bool; - /// Register epoch information async fn inform_epoch_settings(&self, epoch_settings: SignerEpochSettings) -> StdResult<()>; @@ -132,16 +126,6 @@ impl Runner for SignerRunner { .map_err(|e| e.into()) } - async fn get_pending_certificate(&self) -> StdResult> { - debug!("RUNNER: get_pending_certificate"); - - self.services - .certificate_handler - .retrieve_pending_certificate() - .await - .map_err(|e| e.into()) - } - async fn get_beacon_to_sign(&self) -> StdResult> { debug!("RUNNER: get_beacon_to_sign"); @@ -287,20 +271,6 @@ impl Runner for SignerRunner { Ok(false) } - async fn can_sign_signed_entity_type(&self, signed_entity_type: &SignedEntityType) -> bool { - if self - .services - .signed_entity_type_lock - .is_locked(signed_entity_type) - .await - { - debug!(" > signed entity type is locked, can NOT sign"); - false - } else { - true - } - } - async fn inform_epoch_settings(&self, epoch_settings: SignerEpochSettings) -> StdResult<()> { debug!("RUNNER: register_epoch"); let aggregator_features = self @@ -813,39 +783,6 @@ mod tests { ); } - #[tokio::test] - async fn can_sign_signed_entity_type_when_signed_entity_type_is_locked() { - let signed_entity_type = SignedEntityType::MithrilStakeDistribution(Epoch(9)); - let signed_entity_type_lock = Arc::new(SignedEntityTypeLock::new()); - signed_entity_type_lock.lock(&signed_entity_type).await; - let mut services = init_services().await; - services.signed_entity_type_lock = signed_entity_type_lock.clone(); - - let runner = init_runner(Some(services), None).await; - - assert!( - !runner - .can_sign_signed_entity_type(&signed_entity_type) - .await - ); - } - - #[tokio::test] - async fn can_sign_signed_entity_type_when_signed_entity_type_is_not_locked() { - let signed_entity_type = SignedEntityType::MithrilStakeDistribution(Epoch(9)); - let signed_entity_type_lock = Arc::new(SignedEntityTypeLock::new()); - let mut services = init_services().await; - services.signed_entity_type_lock = signed_entity_type_lock.clone(); - - let runner = init_runner(Some(services), None).await; - - assert!( - runner - .can_sign_signed_entity_type(&signed_entity_type) - .await - ); - } - #[tokio::test] async fn can_sign_current_epoch_returns_false_when_epoch_service_returns_false() { let mut services = init_services().await; diff --git a/mithril-signer/src/runtime/state_machine.rs b/mithril-signer/src/runtime/state_machine.rs index 4b119a58d9e..9e2190bdd12 100644 --- a/mithril-signer/src/runtime/state_machine.rs +++ b/mithril-signer/src/runtime/state_machine.rs @@ -4,7 +4,7 @@ use tokio::{sync::Mutex, time::sleep}; use mithril_common::{ crypto_helper::ProtocolInitializerError, - entities::{Epoch, SignedEntityType, TimePoint}, + entities::{Epoch, TimePoint}, }; use crate::entities::{BeaconToSign, SignerEpochSettings}; @@ -28,8 +28,6 @@ pub enum SignerState { ReadyToSign { /// Epoch when signer transitioned to the state. epoch: Epoch, - /// Last signed entity type that the signer signed on this epoch. - last_signed_entity_type: Option, }, /// `RegisteredNotAbleToSign` state. The signer is registered but not able to sign for the duration of the epoch. @@ -69,11 +67,8 @@ impl Display for SignerState { Self::RegisteredNotAbleToSign { epoch } => { write!(f, "RegisteredNotAbleToSign - {epoch}") } - Self::ReadyToSign { - epoch, - last_signed_entity_type, - } => { - write!(f, "ReadyToSign - {epoch} - {last_signed_entity_type:?}") + Self::ReadyToSign { epoch } => { + write!(f, "ReadyToSign - {epoch}") } } } @@ -87,13 +82,6 @@ pub struct StateMachine { metrics_service: Arc, } -enum ReadyToSignTransition { - ToReadyToSign(BeaconToSign), - NoTransitionAlreadySigned, - NoTransitionCannotSignBeacon, - NoTransitionNoBeaconToSign, -} - impl StateMachine { /// Create a new StateMachine instance. pub fn new( @@ -197,10 +185,7 @@ impl StateMachine { } } - SignerState::ReadyToSign { - epoch, - last_signed_entity_type, - } => match self.has_epoch_changed(*epoch).await? { + SignerState::ReadyToSign { epoch } => match self.has_epoch_changed(*epoch).await? { Some(new_epoch) => { info!("→ Epoch has changed, transiting to Unregistered"); *state = self @@ -214,16 +199,20 @@ impl StateMachine { nested_error: Some(e), } })?; - if let ReadyToSignTransition::ToReadyToSign(beacon) = self - .ready_to_sign_certificate_next_transition( - beacon_to_sign, - last_signed_entity_type, - ) - .await - { - *state = self - .transition_from_ready_to_sign_to_ready_to_sign(*epoch, beacon) - .await?; + + match beacon_to_sign { + Some(beacon) => { + info!( + "→ Epoch has NOT changed we can sign this beacon, transiting to ReadyToSign"; + "beacon_to_sign" => ?beacon, + ); + *state = self + .transition_from_ready_to_sign_to_ready_to_sign(*epoch, beacon) + .await?; + } + None => { + info!(" â‹… no beacon to sign, waiting…"); + } } } }, @@ -235,51 +224,6 @@ impl StateMachine { Ok(()) } - async fn ready_to_sign_certificate_next_transition( - &self, - beacon_to_sign: Option, - last_signed_entity: &Option, - ) -> ReadyToSignTransition { - // Todo: remove those two checks are they are already done by the certifier - fn is_same_signed_entity_type( - signed_entity_type: &Option, - beacon_to_sign: &BeaconToSign, - ) -> bool { - Some(&beacon_to_sign.signed_entity_type) == signed_entity_type.as_ref() - } - - async fn can_sign_signed_entity_type(s: &StateMachine, beacon: &BeaconToSign) -> bool { - s.runner - .can_sign_signed_entity_type(&beacon.signed_entity_type) - .await - } - - match beacon_to_sign { - Some(beacon) if is_same_signed_entity_type(last_signed_entity, &beacon) => { - info!(" â‹… same entity type, already signed, waiting…"); - ReadyToSignTransition::NoTransitionAlreadySigned - } - Some(beacon) if can_sign_signed_entity_type(self, &beacon).await => { - info!( - " â‹… Epoch has NOT changed we can sign this beacon, transiting to ReadyToSign"; - "beacon_to_sign" => ?beacon, - ); - ReadyToSignTransition::ToReadyToSign(beacon) - } - Some(beacon) => { - info!( - " â‹… Epoch has NOT changed but cannot sign this beacon, waiting…"; - "beacon_to_sign" => ?beacon - ); - ReadyToSignTransition::NoTransitionCannotSignBeacon - } - None => { - info!(" â‹… no beacon to sign, waiting…"); - ReadyToSignTransition::NoTransitionNoBeaconToSign - } - } - } - /// Return the new epoch if the epoch is different than the given one. async fn has_epoch_changed(&self, epoch: Epoch) -> Result, RuntimeError> { let current_time_point = self @@ -376,7 +320,7 @@ impl StateMachine { message: "Failed to check if signer can sign in the current epoch in 'unregistered → ?' phase".to_string(), nested_error: Some(e), })? { - true => Ok(SignerState::ReadyToSign { epoch, last_signed_entity_type: None }), + true => Ok(SignerState::ReadyToSign { epoch }), false => Ok(SignerState::RegisteredNotAbleToSign { epoch }), } } @@ -457,7 +401,6 @@ impl StateMachine { Ok(SignerState::ReadyToSign { epoch: current_epoch, - last_signed_entity_type: Some(beacon_to_sign.signed_entity_type), }) } @@ -494,7 +437,7 @@ mod tests { use chrono::DateTime; use mockall::predicate; - use mithril_common::entities::{ChainPoint, Epoch, ProtocolMessage}; + use mithril_common::entities::{ChainPoint, Epoch, ProtocolMessage, SignedEntityType}; use mithril_common::test_utils::fake_data; use crate::runtime::runner::MockSignerRunner; @@ -679,7 +622,6 @@ mod tests { assert_eq!( SignerState::ReadyToSign { epoch: TimePoint::dummy().epoch, - last_signed_entity_type: None }, state_machine.get_state().await ); @@ -747,13 +689,8 @@ mod tests { .once() .returning(|_e: Epoch| Ok(())); - let state_machine = init_state_machine( - SignerState::ReadyToSign { - epoch: Epoch(0), - last_signed_entity_type: None, - }, - runner, - ); + let state_machine = + init_state_machine(SignerState::ReadyToSign { epoch: Epoch(0) }, runner); state_machine .cycle() @@ -766,81 +703,49 @@ mod tests { } #[tokio::test] - async fn ready_to_sign_to_ready_to_sign_when_signed_entity_type_is_locked() { - let time_point = TimePoint { - immutable_file_number: 99, - epoch: Epoch(9), - chain_point: ChainPoint::dummy(), - }; - let state = SignerState::ReadyToSign { - epoch: time_point.epoch, - last_signed_entity_type: None, - }; - + async fn ready_to_sign_to_ready_to_sign_when_there_is_a_beacon_to_sign() { + let time_point = TimePoint::dummy(); let beacon_to_sign = BeaconToSign { epoch: time_point.epoch, signed_entity_type: SignedEntityType::MithrilStakeDistribution(time_point.epoch), initiated_at: DateTime::default(), }; - let time_point_clone = time_point.clone(); + let beacon_to_sign_clone = beacon_to_sign.clone(); + let current_epoch = time_point.epoch; + let mut runner = MockSignerRunner::new(); runner .expect_get_current_time_point() .once() - .returning(move || Ok(time_point_clone.to_owned())); + .returning(move || Ok(time_point.to_owned())); runner .expect_get_beacon_to_sign() .once() - .returning(move || Ok(Some(beacon_to_sign.to_owned()))); + .returning(move || Ok(Some(beacon_to_sign_clone.clone()))); runner - .expect_can_sign_signed_entity_type() + .expect_compute_single_signature() .once() - .returning(move |_| false); - - let state_machine = init_state_machine(state, runner); - state_machine - .cycle() - .await - .expect("Cycling the state machine should not fail"); - - assert_eq!( - SignerState::ReadyToSign { - epoch: time_point.epoch, - last_signed_entity_type: None - }, - state_machine.get_state().await, - "state machine did not return a ReadyToSign but {:?}", - state_machine.get_state().await - ); - } - - #[tokio::test] - async fn ready_to_sign_to_ready_to_sign_when_same_signed_entity_type() { - let time_point = TimePoint::dummy(); - let beacon_to_sign = BeaconToSign { - epoch: time_point.epoch, - signed_entity_type: SignedEntityType::CardanoStakeDistribution(time_point.epoch), - initiated_at: DateTime::default(), - }; - let beacon_to_sign_clone = beacon_to_sign.clone(); - let state = SignerState::ReadyToSign { - epoch: time_point.epoch, - last_signed_entity_type: Some(beacon_to_sign.signed_entity_type.clone()), - }; - let time_point_clone = time_point.clone(); - let mut runner = MockSignerRunner::new(); + .returning(|_, _| Ok(Some(fake_data::single_signatures(vec![1, 5, 23])))); runner - .expect_get_current_time_point() - .returning(move || Ok(time_point_clone.to_owned())); + .expect_compute_message() + .once() + .returning(|_| Ok(ProtocolMessage::new())); runner - .expect_get_beacon_to_sign() - .times(1) - .returning(move || Ok(Some(beacon_to_sign.clone()))); + .expect_send_single_signature() + .once() + .returning(|_, _, _| Ok(())); runner - .expect_can_sign_signed_entity_type() - .returning(move |_| true); + .expect_mark_beacon_as_signed() + .once() + .with(predicate::eq(beacon_to_sign)) + .returning(|_| Ok(())); - let state_machine = init_state_machine(state, runner); + let state_machine = init_state_machine( + SignerState::ReadyToSign { + epoch: current_epoch, + }, + runner, + ); state_machine .cycle() .await @@ -848,8 +753,7 @@ mod tests { assert_eq!( SignerState::ReadyToSign { - epoch: time_point.epoch, - last_signed_entity_type: Some(beacon_to_sign_clone.signed_entity_type) + epoch: current_epoch }, state_machine.get_state().await, "state machine did not return a ReadyToSign state but {:?}", @@ -858,86 +762,10 @@ mod tests { } #[tokio::test] - async fn ready_to_sign_to_ready_to_sign_when_can_sign_the_first_signed_entity_type() { - let time_point = TimePoint::dummy(); - let state = SignerState::ReadyToSign { - epoch: time_point.epoch, - last_signed_entity_type: None, - }; - let beacon_to_sign = BeaconToSign { - epoch: time_point.epoch, - signed_entity_type: SignedEntityType::MithrilStakeDistribution(time_point.epoch), - initiated_at: Default::default(), - }; - assert_ready_to_sign_to_ready_to_sign_when_different_state_than_previous_one( - state, - beacon_to_sign, - ) - .await - } - - #[tokio::test] - async fn ready_to_sign_to_ready_to_sign_when_different_state_than_previous_one() { + async fn ready_to_sign_to_ready_to_sign_when_there_no_beacon_to_sign() { let time_point = TimePoint::dummy(); - let state = SignerState::ReadyToSign { - epoch: time_point.epoch, - last_signed_entity_type: Some(SignedEntityType::CardanoStakeDistribution( - time_point.epoch, - )), - }; - let beacon_to_sign = BeaconToSign { - epoch: time_point.epoch, - signed_entity_type: SignedEntityType::MithrilStakeDistribution(time_point.epoch), - initiated_at: Default::default(), - }; + let current_epoch = time_point.epoch; - assert_ready_to_sign_to_ready_to_sign_when_different_state_than_previous_one( - state, - beacon_to_sign, - ) - .await - } - - #[tokio::test] - async fn ready_to_sign_to_ready_to_sign_when_different_state_than_previous_return_state_with_same_epoch( - ) { - let time_point = TimePoint::dummy(); - let state = SignerState::ReadyToSign { - epoch: time_point.epoch, - last_signed_entity_type: Some(SignedEntityType::CardanoStakeDistribution( - time_point.epoch, - )), - }; - let beacon_to_sign = BeaconToSign { - epoch: time_point.epoch + 10, // Check that the epoch - signed_entity_type: SignedEntityType::MithrilStakeDistribution(time_point.epoch), - initiated_at: Default::default(), - }; - - assert_ready_to_sign_to_ready_to_sign_when_different_state_than_previous_one( - state, - beacon_to_sign, - ) - .await - } - - async fn assert_ready_to_sign_to_ready_to_sign_when_different_state_than_previous_one( - initial_state: SignerState, - beacon_to_sign: BeaconToSign, - ) { - let initial_state_epoch = match initial_state.clone() { - SignerState::ReadyToSign { - epoch, - last_signed_entity_type: _, - } => epoch, - _ => panic!("Invalid state, use only ReadyToSign"), - }; - let time_point = TimePoint { - epoch: initial_state_epoch, - ..TimePoint::dummy() - }; - - let beacon_to_sign_clone = beacon_to_sign.clone(); let mut runner = MockSignerRunner::new(); runner .expect_get_current_time_point() @@ -946,29 +774,14 @@ mod tests { runner .expect_get_beacon_to_sign() .once() - .returning(move || Ok(Some(beacon_to_sign.clone()))); - runner - .expect_compute_single_signature() - .once() - .returning(|_, _| Ok(Some(fake_data::single_signatures(vec![1, 5, 23])))); - runner - .expect_compute_message() - .once() - .returning(|_| Ok(ProtocolMessage::new())); - runner - .expect_send_single_signature() - .once() - .returning(|_, _, _| Ok(())); - runner - .expect_mark_beacon_as_signed() - .once() - .returning(|_| Ok(())); - runner - .expect_can_sign_signed_entity_type() - .once() - .returning(move |_| true); + .returning(move || Ok(None)); - let state_machine = init_state_machine(initial_state.clone(), runner); + let state_machine = init_state_machine( + SignerState::ReadyToSign { + epoch: current_epoch, + }, + runner, + ); state_machine .cycle() .await @@ -976,8 +789,7 @@ mod tests { assert_eq!( SignerState::ReadyToSign { - epoch: initial_state_epoch, - last_signed_entity_type: Some(beacon_to_sign_clone.signed_entity_type) + epoch: current_epoch }, state_machine.get_state().await, "state machine did not return a ReadyToSign state but {:?}", From 2ce5838ffad57f389555459fe10f0ff1c62c3d95 Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Tue, 1 Oct 2024 18:30:15 +0200 Subject: [PATCH 135/274] feat: make `mithril-relay` transmits requests to aggregator `/` route --- mithril-relay/src/relay/signer.rs | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/mithril-relay/src/relay/signer.rs b/mithril-relay/src/relay/signer.rs index a5d71c529a5..4ff11e11f4f 100644 --- a/mithril-relay/src/relay/signer.rs +++ b/mithril-relay/src/relay/signer.rs @@ -65,11 +65,17 @@ impl SignerRelay { signer_repeater: Arc>, ) -> TestHttpServer { test_http_server_with_socket_address( - warp::path("register-signatures") - .and(warp::post()) - .and(warp::body::json()) - .and(middlewares::with_transmitter(signature_tx)) - .and_then(handlers::register_signatures_handler) + warp::path::end() + .and(warp::get()) + .and(middlewares::with_aggregator_endpoint( + aggregator_endpoint.to_string(), + )) + .and_then(handlers::aggregator_features_handler) + .or(warp::path("register-signatures") + .and(warp::post()) + .and(warp::body::json()) + .and(middlewares::with_transmitter(signature_tx)) + .and_then(handlers::register_signatures_handler)) .or(warp::path("register-signer") .and(warp::post()) .and(warp::body::json()) @@ -189,6 +195,17 @@ mod handlers { use crate::repeater; + pub async fn aggregator_features_handler( + aggregator_endpoint: String, + ) -> Result { + debug!("SignerRelay: serve HTTP route /"); + let response = reqwest::Client::new() + .get(format!("{aggregator_endpoint}/")) + .send() + .await; + reply_response(response).await + } + pub async fn register_signer_handler( register_signer_message: RegisterSignerMessage, tx: UnboundedSender, From 0dfa192056da72442a3a931025d758ba11ab2544 Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Wed, 2 Oct 2024 16:39:25 +0200 Subject: [PATCH 136/274] test: adjustments following pr reviews --- .../signed_beacon/delete_signed_beacon.rs | 56 ++++++++++++------- .../query/signed_beacon/get_signed_beacon.rs | 48 ++++++++++++---- .../database/record/signed_beacon_record.rs | 17 ++++++ .../repository/signed_beacon_repository.rs | 24 +++++--- mithril-signer/src/services/certifier.rs | 50 ++++++++++++++--- 5 files changed, 149 insertions(+), 46 deletions(-) diff --git a/mithril-signer/src/database/query/signed_beacon/delete_signed_beacon.rs b/mithril-signer/src/database/query/signed_beacon/delete_signed_beacon.rs index 030cb2aa4d1..9c24fea243b 100644 --- a/mithril-signer/src/database/query/signed_beacon/delete_signed_beacon.rs +++ b/mithril-signer/src/database/query/signed_beacon/delete_signed_beacon.rs @@ -48,8 +48,33 @@ mod tests { use super::*; + // Epoch of the signed entities is irrelevant for those tests, only SignedBeacon.epoch matter + const WHATEVER_EPOCH: Epoch = Epoch(378); + #[test] - fn test_prune_below_epoch_threshold() { + fn test_delete_nothing_if_nothing_strictly_below_epoch_threshold() { + let connection = main_db_connection().unwrap(); + insert_signed_beacons( + &connection, + SignedBeaconRecord::fakes(&[( + Epoch(7), + vec![SignedEntityType::MithrilStakeDistribution(WHATEVER_EPOCH)], + )]), + ); + + let delete_cursor = connection + .fetch(DeleteSignedBeaconRecordQuery::below_epoch_threshold(Epoch( + 7, + ))) + .unwrap(); + assert_eq!(0, delete_cursor.count()); + + let get_all_cursor = connection.fetch(GetSignedBeaconQuery::all()).unwrap(); + assert_eq!(1, get_all_cursor.count()); + } + + #[test] + fn test_delete_below_epoch_threshold() { let connection = main_db_connection().unwrap(); insert_signed_beacons( &connection, @@ -57,43 +82,36 @@ mod tests { ( Epoch(7), vec![ - SignedEntityType::MithrilStakeDistribution(Epoch(7)), - SignedEntityType::CardanoTransactions(Epoch(7), BlockNumber(12)), + SignedEntityType::MithrilStakeDistribution(WHATEVER_EPOCH), + SignedEntityType::CardanoTransactions(WHATEVER_EPOCH, BlockNumber(12)), ], ), ( Epoch(8), vec![ - SignedEntityType::MithrilStakeDistribution(Epoch(8)), - SignedEntityType::CardanoStakeDistribution(Epoch(8)), + SignedEntityType::MithrilStakeDistribution(WHATEVER_EPOCH), + SignedEntityType::CardanoStakeDistribution(WHATEVER_EPOCH), ], ), ( Epoch(9), vec![ - SignedEntityType::MithrilStakeDistribution(Epoch(9)), - SignedEntityType::CardanoStakeDistribution(Epoch(9)), - SignedEntityType::CardanoTransactions(Epoch(9), BlockNumber(23)), + SignedEntityType::MithrilStakeDistribution(WHATEVER_EPOCH), + SignedEntityType::CardanoStakeDistribution(WHATEVER_EPOCH), + SignedEntityType::CardanoTransactions(WHATEVER_EPOCH, BlockNumber(23)), ], ), ]), ); - let cursor = connection - .fetch(DeleteSignedBeaconRecordQuery::below_epoch_threshold(Epoch( - 7, - ))) - .unwrap(); - assert_eq!(0, cursor.count()); - - let cursor = connection + let delete_cursor = connection .fetch(DeleteSignedBeaconRecordQuery::below_epoch_threshold(Epoch( 9, ))) .unwrap(); - assert_eq!(4, cursor.count()); + assert_eq!(4, delete_cursor.count()); - let cursor = connection.fetch(GetSignedBeaconQuery::all()).unwrap(); - assert_eq!(3, cursor.count()); + let get_all_cursor = connection.fetch(GetSignedBeaconQuery::all()).unwrap(); + assert_eq!(3, get_all_cursor.count()); } } diff --git a/mithril-signer/src/database/query/signed_beacon/get_signed_beacon.rs b/mithril-signer/src/database/query/signed_beacon/get_signed_beacon.rs index 8e382b87b68..356616f3672 100644 --- a/mithril-signer/src/database/query/signed_beacon/get_signed_beacon.rs +++ b/mithril-signer/src/database/query/signed_beacon/get_signed_beacon.rs @@ -146,11 +146,11 @@ mod tests { let connection = main_db_connection().unwrap(); let records = SignedBeaconRecord::fakes(&[ ( - Epoch(3), + Epoch(974), vec![SignedEntityType::MithrilStakeDistribution(Epoch(3))], ), ( - Epoch(4), + Epoch(975), vec![SignedEntityType::CardanoStakeDistribution(Epoch(4))], ), ]); @@ -167,7 +167,7 @@ mod tests { assert_eq!( vec![SignedBeaconRecord::fake( - Epoch(3), + Epoch(974), SignedEntityType::MithrilStakeDistribution(Epoch(3)) )], stored_records @@ -175,18 +175,18 @@ mod tests { } #[test] - fn with_multiple_matchings_over_several_epochs() { + fn with_multiple_matching_over_several_epochs() { let connection = main_db_connection().unwrap(); let records = SignedBeaconRecord::fakes(&[ ( - Epoch(3), + Epoch(329), vec![ SignedEntityType::MithrilStakeDistribution(Epoch(3)), SignedEntityType::CardanoStakeDistribution(Epoch(3)), ], ), ( - Epoch(4), + Epoch(330), vec![ SignedEntityType::CardanoStakeDistribution(Epoch(4)), SignedEntityType::MithrilStakeDistribution(Epoch(4)), @@ -194,7 +194,7 @@ mod tests { ], ), ( - Epoch(5), + Epoch(331), vec![ SignedEntityType::CardanoTransactions(Epoch(5), BlockNumber(124)), SignedEntityType::CardanoTransactions(Epoch(5), BlockNumber(133)), @@ -218,26 +218,54 @@ mod tests { assert_eq!( SignedBeaconRecord::fakes(&[ ( - Epoch(5), + Epoch(331), vec![SignedEntityType::CardanoTransactions( Epoch(5), BlockNumber(133) ),], ), ( - Epoch(4), + Epoch(330), vec![ SignedEntityType::CardanoTransactions(Epoch(4), BlockNumber(109)), SignedEntityType::MithrilStakeDistribution(Epoch(4)), ], ), ( - Epoch(3), + Epoch(329), vec![SignedEntityType::MithrilStakeDistribution(Epoch(3)),], ), ]), stored_records ); } + + #[test] + fn duplicate_entities_in_parameter_should_not_yield_duplicate_matching() { + let connection = main_db_connection().unwrap(); + let records = SignedBeaconRecord::fakes(&[( + Epoch(242), + vec![SignedEntityType::MithrilStakeDistribution(Epoch(3))], + )]); + insert_signed_beacons(&connection, records.clone()); + + let stored_records: Vec = connection + .fetch_collect( + GetSignedBeaconQuery::by_signed_entities(&[ + SignedEntityType::MithrilStakeDistribution(Epoch(3)), + SignedEntityType::MithrilStakeDistribution(Epoch(3)), + ]) + .unwrap(), + ) + .unwrap(); + + assert_eq!( + vec![SignedBeaconRecord::fake( + Epoch(242), + SignedEntityType::MithrilStakeDistribution(Epoch(3)) + )], + stored_records + ); + } } } diff --git a/mithril-signer/src/database/record/signed_beacon_record.rs b/mithril-signer/src/database/record/signed_beacon_record.rs index 65f74b948f4..66ee73fd9e3 100644 --- a/mithril-signer/src/database/record/signed_beacon_record.rs +++ b/mithril-signer/src/database/record/signed_beacon_record.rs @@ -148,7 +148,24 @@ mod tests { signed_at: initiated_at + chrono::TimeDelta::minutes(2), }; + // Check `impl PartialEq for SignedBeaconRecord` assert_eq!(signed_beacon, beacon_to_sign); + assert_ne!( + signed_beacon, + BeaconToSign { + epoch: beacon_to_sign.epoch + 13, + ..beacon_to_sign.clone() + } + ); + + // Check `impl PartialEq for BeaconToSign` assert_eq!(beacon_to_sign, signed_beacon); + assert_ne!( + beacon_to_sign, + SignedBeaconRecord { + epoch: signed_beacon.epoch + 11, + ..signed_beacon.clone() + } + ); } } diff --git a/mithril-signer/src/database/repository/signed_beacon_repository.rs b/mithril-signer/src/database/repository/signed_beacon_repository.rs index 1b5ace52362..c29c694cf4e 100644 --- a/mithril-signer/src/database/repository/signed_beacon_repository.rs +++ b/mithril-signer/src/database/repository/signed_beacon_repository.rs @@ -233,18 +233,26 @@ mod tests { .collect(), ); - let to_filter = all_signed_entity_type_for(&time_point); let available_entities = repository - .filter_out_already_signed_entities(to_filter.clone()) + .filter_out_already_signed_entities(vec![ + SignedEntityType::MithrilStakeDistribution(time_point.epoch), + SignedEntityType::CardanoStakeDistribution(time_point.epoch), + SignedEntityType::CardanoTransactions( + time_point.epoch, + time_point.chain_point.block_number, + ), + SignedEntityType::CardanoStakeDistribution(time_point.epoch + 10), + ]) .await .unwrap(); - let expected: Vec = to_filter - .iter() - .filter(|entity| !signed_beacons.contains(entity)) - .cloned() - .collect(); - assert_eq!(expected, available_entities); + assert_eq!( + vec![ + SignedEntityType::CardanoStakeDistribution(time_point.epoch), + SignedEntityType::CardanoStakeDistribution(time_point.epoch + 10), + ], + available_entities + ); } #[tokio::test] diff --git a/mithril-signer/src/services/certifier.rs b/mithril-signer/src/services/certifier.rs index 074e0b6b4e5..f7efec8907d 100644 --- a/mithril-signer/src/services/certifier.rs +++ b/mithril-signer/src/services/certifier.rs @@ -163,8 +163,13 @@ mod tests { ); let beacon_to_sign = certifier_service.get_beacon_to_sign().await.unwrap(); + let signed_discriminant: Option = + beacon_to_sign.map(|b| b.signed_entity_type.into()); - assert!(beacon_to_sign.is_some()); + assert_eq!( + SignedEntityTypeDiscriminants::all().first().cloned(), + signed_discriminant + ); } #[tokio::test] @@ -231,8 +236,7 @@ mod tests { } #[tokio::test] - async fn draining_out_all_beacon_to_signs_dont_repeat_value_and_use_signed_entity_discriminant_order( - ) { + async fn draining_out_all_beacons_to_sign_use_signed_entity_discriminant_order() { let ticker_service = DumbTickerService::new(TimePoint::new(1, 14, ChainPoint::dummy())); let certifier_service = SignerCertifierService::new( Arc::new(ticker_service), @@ -249,7 +253,6 @@ mod tests { .await .unwrap() .expect("There should be a beacon to sign since nothing is locked or signed"); - let mut all_signed_beacons = vec![previous_beacon_to_sign.clone()]; loop { certifier_service @@ -259,10 +262,6 @@ mod tests { let next_beacon_to_sign = certifier_service.get_beacon_to_sign().await.unwrap(); if let Some(beacon) = next_beacon_to_sign { - assert!( - !all_signed_beacons.contains(&beacon), - "Beacon should not repeat" - ); assert!( SignedEntityTypeDiscriminants::from( &previous_beacon_to_sign.signed_entity_type @@ -270,7 +269,6 @@ mod tests { "Beacon should follow SignedEntityTypeDiscriminants order" ); - all_signed_beacons.push(beacon.clone()); previous_beacon_to_sign = beacon; } else { break; @@ -278,6 +276,40 @@ mod tests { } } + #[tokio::test] + async fn draining_out_all_beacons_to_sign_doesnt_repeat_value() { + let ticker_service = DumbTickerService::new(TimePoint::new(1, 14, ChainPoint::dummy())); + let certifier_service = SignerCertifierService::new( + Arc::new(ticker_service), + Arc::new(DumbSignedBeaconStore::default()), + Arc::new(DumbSignedEntityConfigProvider::new( + CardanoTransactionsSigningConfig::dummy(), + SignedEntityTypeDiscriminants::all(), + )), + Arc::new(SignedEntityTypeLock::new()), + ); + + let mut all_signed_beacons = vec![]; + while let Some(beacon_to_sign) = certifier_service.get_beacon_to_sign().await.unwrap() { + certifier_service + .mark_beacon_as_signed(&beacon_to_sign) + .await + .unwrap(); + all_signed_beacons.push(beacon_to_sign); + } + + let mut dedup_signed_beacons = all_signed_beacons.clone(); + dedup_signed_beacons.dedup(); + assert!( + !all_signed_beacons.is_empty(), + "There should be at least one beacon to sign" + ); + assert_eq!( + all_signed_beacons, dedup_signed_beacons, + "Beacon should not repeat" + ); + } + pub mod tests_tooling { use std::collections::BTreeSet; use tokio::sync::RwLock; From 4d66fb9d60c37e89fdb550e8c02d480e03071b1a Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Wed, 2 Oct 2024 16:45:18 +0200 Subject: [PATCH 137/274] style: adjustments following pr reviews --- .../query/signed_beacon/get_signed_beacon.rs | 15 ++++++--------- .../src/database/record/signed_beacon_record.rs | 6 +++--- .../repository/signed_beacon_repository.rs | 7 +------ 3 files changed, 10 insertions(+), 18 deletions(-) diff --git a/mithril-signer/src/database/query/signed_beacon/get_signed_beacon.rs b/mithril-signer/src/database/query/signed_beacon/get_signed_beacon.rs index 356616f3672..d96db2074d8 100644 --- a/mithril-signer/src/database/query/signed_beacon/get_signed_beacon.rs +++ b/mithril-signer/src/database/query/signed_beacon/get_signed_beacon.rs @@ -34,13 +34,10 @@ impl GetSignedBeaconQuery { let condition = match signed_entity_types { [] => WhereCondition::new("false", vec![]), [first, rest @ ..] => { - let mut condition = signed_entity_condition(first)?; - - for entity in rest { - condition = condition.or_where(signed_entity_condition(entity)?); - } - - condition + rest.iter() + .try_fold(signed_entity_condition(first)?, |condition, entity| { + StdResult::Ok(condition.or_where(signed_entity_condition(entity)?)) + })? } }; @@ -56,9 +53,9 @@ impl Query for GetSignedBeaconQuery { } fn get_definition(&self, condition: &str) -> String { - let aliases = SourceAlias::new(&[("{:signed_beacon:}", "b")]); + let aliases = SourceAlias::new(&[("{:signed_beacon:}", "signed_beacon")]); let projection = Self::Entity::get_projection().expand(aliases); - format!("select {projection} from signed_beacon as b where {condition} order by ROWID desc") + format!("select {projection} from signed_beacon where {condition} order by rowid desc") } } diff --git a/mithril-signer/src/database/record/signed_beacon_record.rs b/mithril-signer/src/database/record/signed_beacon_record.rs index 66ee73fd9e3..e660ed529de 100644 --- a/mithril-signer/src/database/record/signed_beacon_record.rs +++ b/mithril-signer/src/database/record/signed_beacon_record.rs @@ -86,13 +86,13 @@ impl SqLiteEntity for SignedBeaconRecord { let beacon_str = Hydrator::read_signed_entity_beacon_column(&row, 1); let signed_entity_type_id = usize::try_from(row.read::(2)).map_err(|e| { panic!( - "Integer field open_message.signed_entity_type_id cannot be turned into usize: {e}" + "Integer field signed_beacon.signed_entity_type_id cannot be turned into usize: {e}" ) })?; let initiated_at = &row.read::<&str, _>(3); let signed_at = &row.read::<&str, _>(4); - let open_message = Self { + let signed_beacon = Self { epoch: Epoch(epoch.try_into().map_err(|e| { HydrationError::InvalidData(format!( "Could not cast i64 ({epoch}) to u64. Error: '{e}'" @@ -111,7 +111,7 @@ impl SqLiteEntity for SignedBeaconRecord { })?.with_timezone(&Utc), }; - Ok(open_message) + Ok(signed_beacon) } fn get_projection() -> Projection { diff --git a/mithril-signer/src/database/repository/signed_beacon_repository.rs b/mithril-signer/src/database/repository/signed_beacon_repository.rs index c29c694cf4e..c3946865d20 100644 --- a/mithril-signer/src/database/repository/signed_beacon_repository.rs +++ b/mithril-signer/src/database/repository/signed_beacon_repository.rs @@ -56,12 +56,7 @@ impl SignedBeaconStore for SignedBeaconRepository { } async fn mark_beacon_as_signed(&self, entity: &BeaconToSign) -> StdResult<()> { - let record = SignedBeaconRecord { - epoch: entity.epoch, - signed_entity_type: entity.signed_entity_type.clone(), - initiated_at: entity.initiated_at, - signed_at: chrono::Utc::now(), - }; + let record = entity.clone().into(); let _ = self .connection .fetch_first(InsertSignedBeaconRecordQuery::one(record)?)?; From 8fdf36beab77a05aa424446f7d451e12355f197a Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Wed, 2 Oct 2024 17:17:15 +0200 Subject: [PATCH 138/274] refactor: make upkeep pruning tasks apply themself the retention limit Instead of making the upkeep service itself compute the threshold based on the limit. This design allow each task to use different limit if needed. --- .../repository/signed_beacon_repository.rs | 80 ++++++++++++++---- .../src/dependency_injection/builder.rs | 7 +- mithril-signer/src/runtime/runner.rs | 2 +- mithril-signer/src/services/upkeep_service.rs | 84 ++++--------------- .../test_extensions/state_machine_tester.rs | 3 +- 5 files changed, 86 insertions(+), 90 deletions(-) diff --git a/mithril-signer/src/database/repository/signed_beacon_repository.rs b/mithril-signer/src/database/repository/signed_beacon_repository.rs index c3946865d20..8e2dffe058e 100644 --- a/mithril-signer/src/database/repository/signed_beacon_repository.rs +++ b/mithril-signer/src/database/repository/signed_beacon_repository.rs @@ -15,12 +15,16 @@ use crate::services::{EpochPruningTask, SignedBeaconStore}; /// A [SignedBeaconStore] implementation using SQLite. pub struct SignedBeaconRepository { connection: Arc, + store_retention_limit: Option, } impl SignedBeaconRepository { /// Create a new instance of the `SignedBeaconRepository`. - pub fn new(connection: Arc) -> Self { - Self { connection } + pub fn new(connection: Arc, store_retention_limit: Option) -> Self { + Self { + connection, + store_retention_limit, + } } /// Get the last signed beacon. @@ -71,8 +75,14 @@ impl EpochPruningTask for SignedBeaconRepository { "Signed Beacon" } - async fn prune_below_epoch_threshold(&self, epoch_threshold: Epoch) -> StdResult<()> { - self.prune_below_epoch(epoch_threshold) + async fn prune(&self, current_epoch: Epoch) -> StdResult<()> { + match self + .store_retention_limit + .map(|limit| current_epoch - limit) + { + Some(threshold) if *threshold > 0 => self.prune_below_epoch(threshold), + _ => Ok(()), + } } } @@ -102,7 +112,7 @@ mod tests { #[test] fn get_last_stored_signed_beacon() { let connection = Arc::new(main_db_connection().unwrap()); - let repository = SignedBeaconRepository::new(connection.clone()); + let repository = SignedBeaconRepository::new(connection.clone(), None); let last_signed_beacon = repository.get_last().unwrap(); assert_eq!(None, last_signed_beacon); @@ -151,7 +161,7 @@ mod tests { #[tokio::test] async fn filter_out_nothing_if_nothing_was_previously_signed() { let connection = Arc::new(main_db_connection().unwrap()); - let repository = SignedBeaconRepository::new(connection.clone()); + let repository = SignedBeaconRepository::new(connection.clone(), None); let to_filter = all_signed_entity_type_for(&TimePoint::dummy()); let available_entities = repository @@ -165,7 +175,7 @@ mod tests { #[tokio::test] async fn filter_out_nothing_if_previously_signed_entities_doesnt_match_passed_entities() { let connection = Arc::new(main_db_connection().unwrap()); - let repository = SignedBeaconRepository::new(connection.clone()); + let repository = SignedBeaconRepository::new(connection.clone(), None); let time_point = TimePoint::dummy(); insert_signed_beacons( @@ -189,7 +199,7 @@ mod tests { #[tokio::test] async fn filter_out_everything_if_previously_signed_entities_match_all_passed_entities() { let connection = Arc::new(main_db_connection().unwrap()); - let repository = SignedBeaconRepository::new(connection.clone()); + let repository = SignedBeaconRepository::new(connection.clone(), None); let to_filter = all_signed_entity_type_for(&TimePoint::dummy()); insert_signed_beacons( @@ -210,7 +220,7 @@ mod tests { #[tokio::test] async fn filter_out_partially_if_some_previously_signed_entities_match_passed_entities() { let connection = Arc::new(main_db_connection().unwrap()); - let repository = SignedBeaconRepository::new(connection.clone()); + let repository = SignedBeaconRepository::new(connection.clone(), None); let time_point = TimePoint::dummy(); let signed_beacons = [ @@ -253,7 +263,7 @@ mod tests { #[tokio::test] async fn mark_beacon_as_signed() { let connection = Arc::new(main_db_connection().unwrap()); - let repository = SignedBeaconRepository::new(connection.clone()); + let repository = SignedBeaconRepository::new(connection.clone(), None); let beacon_to_sign = BeaconToSign { epoch: Epoch(13), @@ -278,10 +288,50 @@ mod tests { assert_eq!(beacon_to_sign, signed_beacon); } - #[test] - fn test_prune() { + #[tokio::test] + async fn test_dont_execute_pruning_tasks_if_no_retention_limit_set() { + let connection = Arc::new(main_db_connection().unwrap()); + let repository = SignedBeaconRepository::new(connection.clone(), None); + insert_signed_beacons( + &connection, + SignedBeaconRecord::fakes(&[( + Epoch(8), + vec![SignedEntityType::MithrilStakeDistribution(Epoch(8))], + )]), + ); + + EpochPruningTask::prune(&repository, Epoch(1000)) + .await + .unwrap(); + + let cursor = connection.fetch(GetSignedBeaconQuery::all()).unwrap(); + assert_eq!(1, cursor.count(),); + } + + #[tokio::test] + async fn test_dont_execute_pruning_tasks_if_current_epoch_minus_retention_limit_is_0() { let connection = Arc::new(main_db_connection().unwrap()); - let repository = SignedBeaconRepository::new(connection.clone()); + let repository = SignedBeaconRepository::new(connection.clone(), Some(10)); + insert_signed_beacons( + &connection, + SignedBeaconRecord::fakes(&[( + Epoch(8), + vec![SignedEntityType::MithrilStakeDistribution(Epoch(8))], + )]), + ); + + EpochPruningTask::prune(&repository, Epoch(9)) + .await + .unwrap(); + + let cursor = connection.fetch(GetSignedBeaconQuery::all()).unwrap(); + assert_eq!(1, cursor.count(),); + } + + #[tokio::test] + async fn test_prune_task_substract_set_retention_limit_to_given_epoch() { + let connection = Arc::new(main_db_connection().unwrap()); + let repository = SignedBeaconRepository::new(connection.clone(), Some(10)); insert_signed_beacons( &connection, SignedBeaconRecord::fakes(&[ @@ -299,7 +349,9 @@ mod tests { ]), ); - repository.prune_below_epoch(Epoch(8)).unwrap(); + EpochPruningTask::prune(&repository, Epoch(18)) + .await + .unwrap(); let signed_beacons: Vec = connection .fetch_collect(GetSignedBeaconQuery::all()) diff --git a/mithril-signer/src/dependency_injection/builder.rs b/mithril-signer/src/dependency_injection/builder.rs index ff28629d3ea..6ee7b5fbfed 100644 --- a/mithril-signer/src/dependency_injection/builder.rs +++ b/mithril-signer/src/dependency_injection/builder.rs @@ -347,14 +347,15 @@ impl<'a> DependenciesBuilder<'a> { slog_scope::logger(), Arc::new(preloader_activation), )); - let signed_beacon_repository = - Arc::new(SignedBeaconRepository::new(sqlite_connection.clone())); + let signed_beacon_repository = Arc::new(SignedBeaconRepository::new( + sqlite_connection.clone(), + self.config.store_retention_limit.map(|limit| limit as u64), + )); let upkeep_service = Arc::new(SignerUpkeepService::new( sqlite_connection.clone(), sqlite_connection_cardano_transaction_pool, signed_entity_type_lock.clone(), vec![signed_beacon_repository.clone()], - self.config.store_retention_limit.map(|limit| limit as u64), slog_scope::logger(), )); let certifier = Arc::new(SignerCertifierService::new( diff --git a/mithril-signer/src/runtime/runner.rs b/mithril-signer/src/runtime/runner.rs index 87347232ee8..1dbd5ecd27f 100644 --- a/mithril-signer/src/runtime/runner.rs +++ b/mithril-signer/src/runtime/runner.rs @@ -642,7 +642,7 @@ mod tests { let upkeep_service = Arc::new(MockUpkeepService::new()); let certifier = Arc::new(SignerCertifierService::new( ticker_service.clone(), - Arc::new(SignedBeaconRepository::new(sqlite_connection.clone())), + Arc::new(SignedBeaconRepository::new(sqlite_connection.clone(), None)), Arc::new(SignerSignedEntityConfigProvider::new( network, epoch_service.clone(), diff --git a/mithril-signer/src/services/upkeep_service.rs b/mithril-signer/src/services/upkeep_service.rs index 83449c485e2..1055ee59abd 100644 --- a/mithril-signer/src/services/upkeep_service.rs +++ b/mithril-signer/src/services/upkeep_service.rs @@ -33,8 +33,8 @@ pub trait EpochPruningTask: Send + Sync { /// Get the name of the data that will be pruned. fn pruned_data(&self) -> &'static str; - /// Prune the datasource below the given epoch threshold. - async fn prune_below_epoch_threshold(&self, epoch_threshold: Epoch) -> StdResult<()>; + /// Prune the datasource based on the given current epoch. + async fn prune(&self, current_epoch: Epoch) -> StdResult<()>; } /// Implementation of the upkeep service for the signer. @@ -46,7 +46,6 @@ pub struct SignerUpkeepService { cardano_tx_connection_pool: Arc, signed_entity_type_lock: Arc, pruning_tasks: Vec>, - store_retention_limit: Option, logger: Logger, } @@ -57,7 +56,6 @@ impl SignerUpkeepService { cardano_tx_connection_pool: Arc, signed_entity_type_lock: Arc, pruning_tasks: Vec>, - store_retention_limit: Option, logger: Logger, ) -> Self { Self { @@ -65,29 +63,20 @@ impl SignerUpkeepService { cardano_tx_connection_pool, signed_entity_type_lock, pruning_tasks, - store_retention_limit, logger, } } async fn execute_pruning_tasks(&self, current_epoch: Epoch) -> StdResult<()> { - match self - .store_retention_limit - .map(|limit| current_epoch - limit) - { - Some(threshold) if *threshold > 0 => { - for task in &self.pruning_tasks { - info!( - self.logger, "UpkeepService::Pruning stale data"; - "pruned_data" => task.pruned_data(), "below_epoch_threshold" => ?threshold - ); - - task.prune_below_epoch_threshold(threshold).await?; - } - Ok(()) - } - _ => Ok(()), + for task in &self.pruning_tasks { + info!( + self.logger, "UpkeepService::Pruning stale data"; + "pruned_data" => task.pruned_data(), "current_epoch" => ?current_epoch + ); + task.prune(current_epoch).await?; } + + Ok(()) } async fn upkeep_all_databases(&self) -> StdResult<()> { @@ -198,7 +187,6 @@ mod tests { )), Arc::new(SignedEntityTypeLock::default()), vec![], - None, TestLogger::file(&log_path), ); @@ -241,7 +229,6 @@ mod tests { Arc::new(SqliteConnectionPool::build(1, cardano_tx_db_connection).unwrap()), signed_entity_type_lock.clone(), vec![], - None, TestLogger::file(&log_path), ); @@ -265,15 +252,15 @@ mod tests { #[tokio::test] async fn test_execute_all_pruning_tasks() { let task1 = mock_epoch_pruning_task(|mock| { - mock.expect_prune_below_epoch_threshold() + mock.expect_prune() .once() - .with(eq(Epoch(4))) + .with(eq(Epoch(14))) .returning(|_| Ok(())); }); let task2 = mock_epoch_pruning_task(|mock| { - mock.expect_prune_below_epoch_threshold() + mock.expect_prune() .once() - .with(eq(Epoch(4))) + .with(eq(Epoch(14))) .returning(|_| Ok(())); }); @@ -282,52 +269,9 @@ mod tests { Arc::new(SqliteConnectionPool::build(1, cardano_tx_db_connection).unwrap()), Arc::new(SignedEntityTypeLock::default()), vec![task1, task2], - Some(10), TestLogger::stdout(), ); service.run(Epoch(14)).await.expect("Upkeep service failed"); } - - #[tokio::test] - async fn test_dont_execute_pruning_tasks_if_current_epoch_minus_retention_limit_is_0() { - let task = mock_epoch_pruning_task(|mock| { - mock.expect_prune_below_epoch_threshold() - .never() - .returning(|_| Ok(())); - }); - - let service = SignerUpkeepService::new( - Arc::new(main_db_connection().unwrap()), - Arc::new(SqliteConnectionPool::build(1, cardano_tx_db_connection).unwrap()), - Arc::new(SignedEntityTypeLock::default()), - vec![task], - Some(17), - TestLogger::stdout(), - ); - - service.run(Epoch(1)).await.expect("Upkeep service failed"); - service.run(Epoch(16)).await.expect("Upkeep service failed"); - service.run(Epoch(17)).await.expect("Upkeep service failed"); - } - - #[tokio::test] - async fn test_dont_execute_pruning_tasks_if_no_retention_limit_set() { - let task = mock_epoch_pruning_task(|mock| { - mock.expect_prune_below_epoch_threshold() - .never() - .returning(|_| Ok(())); - }); - - let service = SignerUpkeepService::new( - Arc::new(main_db_connection().unwrap()), - Arc::new(SqliteConnectionPool::build(1, cardano_tx_db_connection).unwrap()), - Arc::new(SignedEntityTypeLock::default()), - vec![task], - None, - TestLogger::stdout(), - ); - - service.run(Epoch(29)).await.expect("Upkeep service failed"); - } } diff --git a/mithril-signer/tests/test_extensions/state_machine_tester.rs b/mithril-signer/tests/test_extensions/state_machine_tester.rs index 919f2c7bea2..dd9ed8d8300 100644 --- a/mithril-signer/tests/test_extensions/state_machine_tester.rs +++ b/mithril-signer/tests/test_extensions/state_machine_tester.rs @@ -247,11 +247,10 @@ impl StateMachineTester { sqlite_connection_cardano_transaction_pool, signed_entity_type_lock.clone(), vec![], - None, slog_scope::logger(), )); let signed_beacon_repository = - Arc::new(SignedBeaconRepository::new(sqlite_connection.clone())); + Arc::new(SignedBeaconRepository::new(sqlite_connection.clone(), None)); let certifier = Arc::new(SignerCertifierService::new( ticker_service.clone(), signed_beacon_repository.clone(), From 70a5c6fb62c088601072b02e03f2aacdbcecb4c0 Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Wed, 2 Oct 2024 17:21:57 +0200 Subject: [PATCH 139/274] chore: bump crates versions * mithril-common from `0.5.61` to `0.5.62` * mithril-signer from `0.2.189` to `0.2.190` * mithril-relay from `0.2.23` to `0.2.24` * mithril-end-to-end from `0.4.31` to `0.4.32` --- Cargo.lock | 8 ++++---- mithril-common/Cargo.toml | 2 +- mithril-relay/Cargo.toml | 2 +- mithril-signer/Cargo.toml | 2 +- mithril-test-lab/mithril-end-to-end/Cargo.toml | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 07ed7c1a705..8b694bd3502 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3559,7 +3559,7 @@ dependencies = [ [[package]] name = "mithril-common" -version = "0.4.61" +version = "0.4.62" dependencies = [ "anyhow", "async-trait", @@ -3630,7 +3630,7 @@ dependencies = [ [[package]] name = "mithril-end-to-end" -version = "0.4.31" +version = "0.4.32" dependencies = [ "anyhow", "async-recursion", @@ -3679,7 +3679,7 @@ dependencies = [ [[package]] name = "mithril-relay" -version = "0.1.23" +version = "0.1.24" dependencies = [ "anyhow", "clap", @@ -3703,7 +3703,7 @@ dependencies = [ [[package]] name = "mithril-signer" -version = "0.2.189" +version = "0.2.190" dependencies = [ "anyhow", "async-trait", diff --git a/mithril-common/Cargo.toml b/mithril-common/Cargo.toml index 848967bdcae..16ceac43137 100644 --- a/mithril-common/Cargo.toml +++ b/mithril-common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-common" -version = "0.4.61" +version = "0.4.62" description = "Common types, interfaces, and utilities for Mithril nodes." authors = { workspace = true } edition = { workspace = true } diff --git a/mithril-relay/Cargo.toml b/mithril-relay/Cargo.toml index 28102e6a9f7..b64e576568b 100644 --- a/mithril-relay/Cargo.toml +++ b/mithril-relay/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-relay" -version = "0.1.23" +version = "0.1.24" description = "A Mithril relay" authors = { workspace = true } edition = { workspace = true } diff --git a/mithril-signer/Cargo.toml b/mithril-signer/Cargo.toml index 8332f8e749a..f15bcf5e109 100644 --- a/mithril-signer/Cargo.toml +++ b/mithril-signer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-signer" -version = "0.2.189" +version = "0.2.190" description = "A Mithril Signer" authors = { workspace = true } edition = { workspace = true } diff --git a/mithril-test-lab/mithril-end-to-end/Cargo.toml b/mithril-test-lab/mithril-end-to-end/Cargo.toml index 454e7ccaf7d..ebaa091182a 100644 --- a/mithril-test-lab/mithril-end-to-end/Cargo.toml +++ b/mithril-test-lab/mithril-end-to-end/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-end-to-end" -version = "0.4.31" +version = "0.4.32" authors = { workspace = true } edition = { workspace = true } documentation = { workspace = true } From 2cc3fd365bb7b31c052c447bb5d63a95d1ef8602 Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Wed, 2 Oct 2024 17:25:42 +0200 Subject: [PATCH 140/274] chore: update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0660cf0739d..66fbd52263a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,8 @@ As a minor extension, we have adopted a slightly different versioning convention - Refactor the builder of the protocol messages, and add support for protocol parameters and epoch parts. +- Signer compute what to sign independently of the aggregator. + - Crates versions: | Crate | Version | From c506bee94f0da279eee357f52f8e684f9d35841a Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Tue, 1 Oct 2024 15:13:59 +0200 Subject: [PATCH 141/274] refactor: remove all `pending_certificate` code from `mithril-signer` As the signer can now compute what to sign on its own. --- mithril-signer/src/lib.rs | 4 +- .../from_pending_certificate_message.rs | 44 ----- mithril-signer/src/message_adapters/mod.rs | 2 - .../src/services/aggregator_client.rs | 186 +----------------- .../test_extensions/certificate_handler.rs | 98 +-------- 5 files changed, 9 insertions(+), 325 deletions(-) delete mode 100644 mithril-signer/src/message_adapters/from_pending_certificate_message.rs diff --git a/mithril-signer/src/lib.rs b/mithril-signer/src/lib.rs index c5df36df3b3..3cb8dbe58d5 100644 --- a/mithril-signer/src/lib.rs +++ b/mithril-signer/src/lib.rs @@ -18,9 +18,7 @@ pub mod store; pub use configuration::{Configuration, DefaultConfiguration}; pub use entities::SignerEpochSettings; -pub use message_adapters::{ - FromEpochSettingsAdapter, FromPendingCertificateMessageAdapter, ToRegisterSignerMessageAdapter, -}; +pub use message_adapters::{FromEpochSettingsAdapter, ToRegisterSignerMessageAdapter}; pub use metrics::*; pub use runtime::*; diff --git a/mithril-signer/src/message_adapters/from_pending_certificate_message.rs b/mithril-signer/src/message_adapters/from_pending_certificate_message.rs deleted file mode 100644 index a9aecf62fae..00000000000 --- a/mithril-signer/src/message_adapters/from_pending_certificate_message.rs +++ /dev/null @@ -1,44 +0,0 @@ -#![allow(deprecated)] - -use mithril_common::{ - entities::CertificatePending, - messages::{CertificatePendingMessage, TryFromMessageAdapter}, - StdResult, -}; - -/// Adapter to turn [CertificatePendingMessage] instances into [CertificatePending]. -pub struct FromPendingCertificateMessageAdapter; - -impl TryFromMessageAdapter - for FromPendingCertificateMessageAdapter -{ - /// Adapter method - fn try_adapt(message: CertificatePendingMessage) -> StdResult { - let certificate = CertificatePending { - epoch: message.epoch, - signed_entity_type: message.signed_entity_type, - protocol_parameters: message.protocol_parameters, - next_protocol_parameters: message.next_protocol_parameters, - // This field is deprecated and should not be used by the Mithril signer. - signers: vec![], - // This field is deprecated and should not be used by the Mithril signer. - next_signers: vec![], - }; - - Ok(certificate) - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn adapt_ok() { - let message = CertificatePendingMessage::dummy(); - let epoch = message.epoch; - let certificate_pending = FromPendingCertificateMessageAdapter::try_adapt(message).unwrap(); - - assert_eq!(epoch, certificate_pending.epoch); - } -} diff --git a/mithril-signer/src/message_adapters/mod.rs b/mithril-signer/src/message_adapters/mod.rs index e504c593ba4..e3abab283dc 100644 --- a/mithril-signer/src/message_adapters/mod.rs +++ b/mithril-signer/src/message_adapters/mod.rs @@ -1,9 +1,7 @@ mod from_epoch_settings; -mod from_pending_certificate_message; mod to_register_signature_message; mod to_register_signer_message; pub use from_epoch_settings::FromEpochSettingsAdapter; -pub use from_pending_certificate_message::FromPendingCertificateMessageAdapter; pub use to_register_signature_message::ToRegisterSignatureMessageAdapter; pub use to_register_signer_message::ToRegisterSignerMessageAdapter; diff --git a/mithril-signer/src/services/aggregator_client.rs b/mithril-signer/src/services/aggregator_client.rs index 631d39158a6..3d88c2b1f75 100644 --- a/mithril-signer/src/services/aggregator_client.rs +++ b/mithril-signer/src/services/aggregator_client.rs @@ -7,20 +7,16 @@ use thiserror::Error; use mithril_common::{ api_version::APIVersionProvider, - entities::{ - CertificatePending, Epoch, ProtocolMessage, SignedEntityType, Signer, SingleSignatures, - }, + entities::{Epoch, ProtocolMessage, SignedEntityType, Signer, SingleSignatures}, messages::{ - AggregatorFeaturesMessage, CertificatePendingMessage, EpochSettingsMessage, - TryFromMessageAdapter, TryToMessageAdapter, + AggregatorFeaturesMessage, EpochSettingsMessage, TryFromMessageAdapter, TryToMessageAdapter, }, StdError, MITHRIL_API_VERSION_HEADER, MITHRIL_SIGNER_VERSION_HEADER, }; use crate::entities::SignerEpochSettings; use crate::message_adapters::{ - FromEpochSettingsAdapter, FromPendingCertificateMessageAdapter, - ToRegisterSignatureMessageAdapter, ToRegisterSignerMessageAdapter, + FromEpochSettingsAdapter, ToRegisterSignatureMessageAdapter, ToRegisterSignerMessageAdapter, }; /// Error structure for the Aggregator Client. @@ -80,11 +76,6 @@ pub trait AggregatorClient: Sync + Send { &self, ) -> Result, AggregatorClientError>; - /// Retrieves a pending certificate from the aggregator - async fn retrieve_pending_certificate( - &self, - ) -> Result, AggregatorClientError>; - /// Registers signer with the aggregator. async fn register_signer( &self, @@ -214,36 +205,6 @@ impl AggregatorClient for AggregatorHTTPClient { } } - async fn retrieve_pending_certificate( - &self, - ) -> Result, AggregatorClientError> { - debug!("Retrieve pending certificate"); - let url = format!("{}/certificate-pending", self.aggregator_endpoint); - let response = self - .prepare_request_builder(self.prepare_http_client()?.get(url.clone())) - .send() - .await; - - match response { - Ok(response) => match response.status() { - StatusCode::OK => match response.json::().await { - Ok(message) => Ok(Some( - FromPendingCertificateMessageAdapter::try_adapt(message) - .map_err(|err| AggregatorClientError::JsonParseFailed(anyhow!(err)))?, - )), - Err(err) => Err(AggregatorClientError::JsonParseFailed(anyhow!(err))), - }, - StatusCode::PRECONDITION_FAILED => Err(self.handle_api_error(&response)), - StatusCode::NO_CONTENT => Ok(None), - _ => Err(AggregatorClientError::RemoteServerTechnical(anyhow!( - "{}", - response.text().await.unwrap_or_default() - ))), - }, - Err(err) => Err(AggregatorClientError::RemoteServerUnreachable(anyhow!(err))), - } - } - async fn register_signer( &self, epoch: Epoch, @@ -344,16 +305,15 @@ impl AggregatorClient for AggregatorHTTPClient { #[cfg(test)] pub(crate) mod dumb { - use super::*; - use mithril_common::test_utils::fake_data; use tokio::sync::RwLock; + use super::*; + /// This aggregator client is intended to be used by test services. /// It actually does not communicate with an aggregator host but mimics this behavior. - /// It is driven by a Tester that controls the CertificatePending it can return and it can return its internal state for testing. + /// It is driven by a Tester that controls the data it can return, and it can return its internal state for testing. pub struct DumbAggregatorClient { epoch_settings: RwLock>, - certificate_pending: RwLock>, last_registered_signer: RwLock>, aggregator_features: RwLock, } @@ -363,7 +323,6 @@ pub(crate) mod dumb { pub fn new() -> Self { Self { epoch_settings: RwLock::new(None), - certificate_pending: RwLock::new(None), last_registered_signer: RwLock::new(None), aggregator_features: RwLock::new(AggregatorFeaturesMessage::dummy()), } @@ -375,18 +334,6 @@ pub(crate) mod dumb { *epoch_settings_writer = epoch_settings; } - /// this method pilots the certificate pending handler - /// calling this method unsets the last registered signer - pub async fn set_certificate_pending( - &self, - certificate_pending: Option, - ) { - let mut cert = self.certificate_pending.write().await; - *cert = certificate_pending; - let mut signer = self.last_registered_signer.write().await; - *signer = None; - } - /// Return the last signer that called with the `register` method. pub async fn get_last_registered_signer(&self) -> Option { self.last_registered_signer.read().await.clone() @@ -405,7 +352,6 @@ pub(crate) mod dumb { fn default() -> Self { Self { epoch_settings: RwLock::new(Some(SignerEpochSettings::dummy())), - certificate_pending: RwLock::new(Some(fake_data::certificate_pending())), last_registered_signer: RwLock::new(None), aggregator_features: RwLock::new(AggregatorFeaturesMessage::dummy()), } @@ -422,14 +368,6 @@ pub(crate) mod dumb { Ok(epoch_settings) } - async fn retrieve_pending_certificate( - &self, - ) -> Result, AggregatorClientError> { - let cert = self.certificate_pending.read().await.clone(); - - Ok(cert) - } - /// Registers signer with the aggregator async fn register_signer( &self, @@ -682,118 +620,6 @@ mod tests { ); } - #[tokio::test] - async fn test_certificate_pending_ok_200() { - let (server, config, api_version_provider) = setup_test(); - let pending_certificate_expected = CertificatePendingMessage::dummy(); - let _snapshots_mock = server.mock(|when, then| { - when.path("/certificate-pending"); - then.status(200) - .body(json!(pending_certificate_expected).to_string()); - }); - let certificate_handler = AggregatorHTTPClient::new( - config.aggregator_endpoint, - config.relay_endpoint, - Arc::new(api_version_provider), - None, - ); - let pending_certificate = certificate_handler.retrieve_pending_certificate().await; - pending_certificate.as_ref().expect("unexpected error"); - - assert_eq!( - FromPendingCertificateMessageAdapter::try_adapt(pending_certificate_expected).unwrap(), - pending_certificate.unwrap().unwrap() - ); - } - - #[tokio::test] - async fn test_certificate_pending_ko_412() { - let (server, config, api_version_provider) = setup_test(); - let _snapshots_mock = server.mock(|when, then| { - when.path("/certificate-pending"); - then.status(412) - .header(MITHRIL_API_VERSION_HEADER, "0.0.999"); - }); - let certificate_handler = AggregatorHTTPClient::new( - config.aggregator_endpoint, - config.relay_endpoint, - Arc::new(api_version_provider), - None, - ); - let error = certificate_handler - .retrieve_pending_certificate() - .await - .unwrap_err(); - - assert!(error.is_api_version_mismatch()); - } - - #[tokio::test] - async fn test_certificate_pending_ok_204() { - let (server, config, api_version_provider) = setup_test(); - let _snapshots_mock = server.mock(|when, then| { - when.path("/certificate-pending"); - then.status(204); - }); - let certificate_handler = AggregatorHTTPClient::new( - config.aggregator_endpoint, - config.relay_endpoint, - Arc::new(api_version_provider), - None, - ); - let pending_certificate = certificate_handler.retrieve_pending_certificate().await; - assert!(pending_certificate.expect("unexpected error").is_none()); - } - - #[tokio::test] - async fn test_certificate_pending_ko_500() { - let (server, config, api_version_provider) = setup_test(); - let _snapshots_mock = server.mock(|when, then| { - when.path("/certificate-pending"); - then.status(500).body("an error occurred"); - }); - let certificate_handler = AggregatorHTTPClient::new( - config.aggregator_endpoint, - config.relay_endpoint, - Arc::new(api_version_provider), - None, - ); - - match certificate_handler - .retrieve_pending_certificate() - .await - .unwrap_err() - { - AggregatorClientError::RemoteServerTechnical(_) => (), - e => panic!("Expected Aggregator::RemoteServerTechnical error, got '{e:?}'."), - }; - } - - #[tokio::test] - async fn test_pending_certificate_timeout() { - let (server, config, api_version_provider) = setup_test(); - let _snapshots_mock = server.mock(|when, then| { - when.path("/certificate-pending"); - then.delay(Duration::from_millis(200)); - }); - let certificate_handler = AggregatorHTTPClient::new( - config.aggregator_endpoint, - config.relay_endpoint, - Arc::new(api_version_provider), - Some(Duration::from_millis(50)), - ); - - let error = certificate_handler - .retrieve_pending_certificate() - .await - .expect_err("retrieve_pending_certificate should fail"); - - assert!( - matches!(error, AggregatorClientError::RemoteServerUnreachable(_)), - "unexpected error type: {error:?}" - ); - } - #[tokio::test] async fn test_register_signer_ok_201() { let epoch = Epoch(1); diff --git a/mithril-signer/tests/test_extensions/certificate_handler.rs b/mithril-signer/tests/test_extensions/certificate_handler.rs index f92962e8f61..862e93d324f 100644 --- a/mithril-signer/tests/test_extensions/certificate_handler.rs +++ b/mithril-signer/tests/test_extensions/certificate_handler.rs @@ -6,9 +6,8 @@ use tokio::sync::RwLock; use mithril_common::{ entities::{ - CardanoTransactionsSigningConfig, CertificatePending, Epoch, ProtocolMessage, - SignedEntityConfig, SignedEntityType, SignedEntityTypeDiscriminants, Signer, - SingleSignatures, TimePoint, + CardanoTransactionsSigningConfig, Epoch, ProtocolMessage, SignedEntityConfig, + SignedEntityType, SignedEntityTypeDiscriminants, Signer, SingleSignatures, TimePoint, }, messages::AggregatorFeaturesMessage, test_utils::fake_data, @@ -24,7 +23,6 @@ pub struct FakeAggregator { signed_entity_config: RwLock, registered_signers: RwLock>>, ticker_service: Arc, - current_certificate_pending_signed_entity: RwLock, withhold_epoch_settings: RwLock, } @@ -37,9 +35,6 @@ impl FakeAggregator { signed_entity_config: RwLock::new(signed_entity_config), registered_signers: RwLock::new(HashMap::new()), ticker_service, - current_certificate_pending_signed_entity: RwLock::new( - SignedEntityTypeDiscriminants::CardanoImmutableFilesFull, - ), withhold_epoch_settings: RwLock::new(true), } } @@ -135,32 +130,6 @@ impl AggregatorClient for FakeAggregator { } } - async fn retrieve_pending_certificate( - &self, - ) -> Result, AggregatorClientError> { - let store = self.registered_signers.read().await; - - if store.is_empty() { - return Ok(None); - } - - let current_signed_entity = *self.current_certificate_pending_signed_entity.read().await; - let signed_entity_config = self.signed_entity_config.read().await; - let time_point = self.get_time_point().await?; - let mut certificate_pending = CertificatePending { - epoch: time_point.epoch, - signed_entity_type: signed_entity_config - .time_point_to_signed_entity(current_signed_entity, &time_point) - .unwrap(), - ..fake_data::certificate_pending() - }; - - certificate_pending.signers = self.get_current_signers(&store).await?; - certificate_pending.next_signers = self.get_next_signers(&store).await?; - - Ok(Some(certificate_pending)) - } - /// Registers signer with the aggregator async fn register_signer( &self, @@ -317,69 +286,6 @@ mod tests { assert_eq!(1, epoch_settings.next_signers.len()); } - #[tokio::test] - async fn retrieve_pending_certificate() { - let (chain_observer, fake_aggregator) = init().await; - let epoch = chain_observer.get_current_epoch().await.unwrap().unwrap(); - let cert = fake_aggregator - .retrieve_pending_certificate() - .await - .expect("retrieving a certificate pending should not raise an error"); - - assert!( - cert.is_none(), - "aggregator client is empty => no pending certificate" - ); - - for signer in fake_data::signers(3) { - fake_aggregator - .register_signer(epoch.offset_to_recording_epoch(), &signer) - .await - .unwrap(); - } - - let cert = fake_aggregator - .retrieve_pending_certificate() - .await - .expect("retrieving a certificate pending should not raise an error") - .expect("we should get a pending certificate"); - - assert_eq!(0, cert.signers.len()); - assert_eq!(0, cert.next_signers.len()); - assert_eq!(1, cert.epoch); - - let epoch = chain_observer.next_epoch().await.unwrap(); - - let cert = fake_aggregator - .retrieve_pending_certificate() - .await - .expect("retrieving a certificate pending should not raise an error") - .expect("we should get a pending certificate"); - - assert_eq!(0, cert.signers.len()); - assert_eq!(3, cert.next_signers.len()); - assert_eq!(2, cert.epoch); - - for signer in fake_data::signers(2) { - fake_aggregator - .register_signer(epoch.offset_to_recording_epoch(), &signer) - .await - .unwrap(); - } - - chain_observer.next_epoch().await; - - let cert = fake_aggregator - .retrieve_pending_certificate() - .await - .expect("retrieving a certificate pending should not raise an error") - .expect("we should get a pending certificate"); - - assert_eq!(3, cert.signers.len()); - assert_eq!(2, cert.next_signers.len()); - assert_eq!(3, cert.epoch); - } - #[tokio::test] async fn retrieve_aggregator_features() { let (_chain_observer, fake_aggregator) = init().await; From 411f066c361135e317d16ded700ec01087a96c2e Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Tue, 1 Oct 2024 16:12:09 +0200 Subject: [PATCH 142/274] tests: remove reference to certificate pending in apispecs tests As they will be removed in the future --- mithril-common/src/test_utils/apispec.rs | 52 ++++++++++++++---------- 1 file changed, 31 insertions(+), 21 deletions(-) diff --git a/mithril-common/src/test_utils/apispec.rs b/mithril-common/src/test_utils/apispec.rs index 67f86265ec4..842ed9f325b 100644 --- a/mithril-common/src/test_utils/apispec.rs +++ b/mithril-common/src/test_utils/apispec.rs @@ -333,7 +333,7 @@ mod tests { use super::*; use crate::entities; - use crate::messages::{CertificatePendingMessage, SignerMessagePart}; + use crate::messages::{AggregatorFeaturesMessage, SignerMessagePart}; use crate::test_utils::{fake_data, TempDir}; fn build_empty_response(status_code: u16) -> Response { @@ -420,9 +420,19 @@ components: #[test] fn test_validate_a_response_without_body() { - APISpec::from_file(&APISpec::get_default_spec_file()) + let file = get_temp_openapi_filename("validate_a_response_without_body", line!()); + let paths = r#" + /empty-route: + get: + responses: + "204": + description: no pending certificate available + "#; + write_minimal_open_api_file("1.0.0", &file, paths, ""); + + APISpec::from_file(file.to_str().unwrap()) .method(Method::GET.as_str()) - .path("/certificate-pending") + .path("/empty-route") .validate_request(&Null) .unwrap() .validate_response(&build_empty_response(204)) @@ -433,12 +443,12 @@ components: fn test_validate_ok_when_request_without_body_and_expects_response() { APISpec::from_file(&APISpec::get_default_spec_file()) .method(Method::GET.as_str()) - .path("/certificate-pending") + .path("/") .validate_request(&Null) .unwrap() .validate_response(&build_json_response( 200, - CertificatePendingMessage::dummy(), + AggregatorFeaturesMessage::dummy(), )) .unwrap(); } @@ -480,7 +490,7 @@ components: let mut api_spec = APISpec::from_file(&APISpec::get_default_spec_file()); let result = api_spec .method(Method::GET.as_str()) - .path("/certificate-pending") + .path("/") .validate_request(&Null) .unwrap() .validate_status(&response, &StatusCode::OK); @@ -505,7 +515,7 @@ components: APISpec::from_file(&APISpec::get_default_spec_file()) .method(Method::GET.as_str()) - .path("/certificate-pending") + .path("/") .validate_request(&Null) .unwrap() .validate_status(&response, &StatusCode::INTERNAL_SERVER_ERROR) @@ -532,13 +542,13 @@ components: let mut api_spec = APISpec::from_file(&APISpec::get_default_spec_file()); let result = api_spec .method(Method::OPTIONS.as_str()) - .path("/certificate-pending") + .path("/certificates") .validate_response(&build_response(200, b"abcdefgh")); assert!(result.is_err()); assert_eq!( result.err(), - Some("Unmatched path and method: /certificate-pending OPTIONS".to_string()) + Some("Unmatched path and method: /certificates OPTIONS".to_string()) ); } #[test] @@ -546,7 +556,7 @@ components: let mut api_spec = APISpec::from_file(&APISpec::get_default_spec_file()); let result = api_spec .method(Method::GET.as_str()) - .path("/certificate-pending") + .path("/certificates") .validate_response(&build_empty_response(200)); assert!(result.is_err()); @@ -588,7 +598,7 @@ components: let mut api_spec = APISpec::from_file(&APISpec::get_default_spec_file()); let result = api_spec .method(Method::GET.as_str()) - .path("/certificate-pending") + .path("/certificates") .validate_request(&Null) .unwrap() .validate_response(&build_response(200, b"not a json")); @@ -602,7 +612,7 @@ components: fn test_validate_returns_errors_when_route_exists_but_does_not_expect_request_body() { assert!(APISpec::from_file(&APISpec::get_default_spec_file()) .method(Method::GET.as_str()) - .path("/certificate-pending") + .path("/certificates") .validate_request(&fake_data::beacon()) .is_err()); } @@ -620,7 +630,7 @@ components: let mut api_spec = APISpec::from_file(&APISpec::get_default_spec_file()); let result = api_spec .method(Method::GET.as_str()) - .path("/certificate-pending") + .path("/certificates") .content_type("whatever") .validate_request(&Null) .unwrap() @@ -629,7 +639,7 @@ components: assert!(result.is_err()); assert_eq!( result.err().unwrap().to_string(), - "Expected content type 'whatever' but spec is '{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/CertificatePendingMessage\"}}}'", + "Expected content type 'whatever' but spec is '{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/CertificateListMessage\"}}}'", ); } @@ -707,10 +717,10 @@ components: APISpec::verify_conformity( APISpec::get_all_spec_files(), Method::GET.as_str(), - "/certificate-pending", + "/", "application/json", &Null, - &build_json_response(200, CertificatePendingMessage::dummy()), + &build_json_response(200, AggregatorFeaturesMessage::dummy()), &StatusCode::OK, ) .unwrap() @@ -718,13 +728,13 @@ components: #[test] fn test_verify_conformity_with_non_expected_status_returns_error() { - let response = build_json_response(200, CertificatePendingMessage::dummy()); + let response = build_json_response(200, AggregatorFeaturesMessage::dummy()); let spec_file = APISpec::get_default_spec_file(); let result = APISpec::verify_conformity( vec![spec_file.clone()], Method::GET.as_str(), - "/certificate-pending", + "/", "application/json", &Null, &response, @@ -737,7 +747,7 @@ components: StatusCode::OK.as_u16() ); let error_message = format!( - "OpenAPI invalid response in {spec_file} on route /certificate-pending, reason: {error_reason}\nresponse: {response:#?}" + "OpenAPI invalid response in {spec_file} on route /, reason: {error_reason}\nresponse: {response:#?}" ); assert!(result.is_err()); assert_eq!(result.err().unwrap().to_string(), error_message); @@ -748,10 +758,10 @@ components: let result = APISpec::verify_conformity( vec![], Method::GET.as_str(), - "/certificate-pending", + "/", "application/json", &Null, - &build_json_response(200, CertificatePendingMessage::dummy()), + &build_json_response(200, AggregatorFeaturesMessage::dummy()), &StatusCode::OK, ); From 93d088928a8656a336414a67c123fa780c156b35 Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Tue, 1 Oct 2024 16:15:17 +0200 Subject: [PATCH 143/274] chore: deprecated `CertificatePendingMessage` in rust code --- .../src/message_adapters/to_certificate_pending_message.rs | 1 + mithril-common/src/messages/certificate_pending.rs | 5 +++++ mithril-common/src/messages/mod.rs | 1 + .../mithril-end-to-end/src/stress_test/wait.rs | 7 +++++-- 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/mithril-aggregator/src/message_adapters/to_certificate_pending_message.rs b/mithril-aggregator/src/message_adapters/to_certificate_pending_message.rs index adfe89748b8..b3c42e8b661 100644 --- a/mithril-aggregator/src/message_adapters/to_certificate_pending_message.rs +++ b/mithril-aggregator/src/message_adapters/to_certificate_pending_message.rs @@ -1,3 +1,4 @@ +#![allow(deprecated)] use mithril_common::entities::CardanoDbBeacon; use mithril_common::{ entities::{CertificatePending, SignedEntityType}, diff --git a/mithril-common/src/messages/certificate_pending.rs b/mithril-common/src/messages/certificate_pending.rs index 1d3c6cb6114..c9d217e3bfc 100644 --- a/mithril-common/src/messages/certificate_pending.rs +++ b/mithril-common/src/messages/certificate_pending.rs @@ -1,3 +1,4 @@ +#![allow(deprecated)] use serde::{Deserialize, Serialize}; use crate::entities::{CardanoDbBeacon, Epoch, ProtocolParameters, SignedEntityType}; @@ -5,6 +6,10 @@ use crate::messages::SignerMessagePart; /// Structure to transport [crate::entities::CertificatePending] data. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[deprecated( + since = "0.4.63", + note = "Exists only for backward-compatibility, will be removed in the future" +)] pub struct CertificatePendingMessage { /// Current Epoch pub epoch: Epoch, diff --git a/mithril-common/src/messages/mod.rs b/mithril-common/src/messages/mod.rs index 31a0f8ac1ac..7c0029f41a8 100644 --- a/mithril-common/src/messages/mod.rs +++ b/mithril-common/src/messages/mod.rs @@ -39,6 +39,7 @@ pub use certificate::CertificateMessage; pub use certificate_list::{ CertificateListItemMessage, CertificateListItemMessageMetadata, CertificateListMessage, }; +#[allow(deprecated)] pub use certificate_pending::CertificatePendingMessage; pub use epoch_settings::EpochSettingsMessage; pub use interface::*; diff --git a/mithril-test-lab/mithril-end-to-end/src/stress_test/wait.rs b/mithril-test-lab/mithril-end-to-end/src/stress_test/wait.rs index b387efc8d6a..3bfa130c202 100644 --- a/mithril-test-lab/mithril-end-to-end/src/stress_test/wait.rs +++ b/mithril-test-lab/mithril-end-to-end/src/stress_test/wait.rs @@ -9,8 +9,8 @@ use tokio::time::sleep; use mithril_common::{ entities::{Epoch, SignedEntityType}, messages::{ - CertificateListItemMessage, CertificatePendingMessage, EpochSettingsMessage, - MithrilStakeDistributionListItemMessage, SnapshotListItemMessage, + CertificateListItemMessage, EpochSettingsMessage, MithrilStakeDistributionListItemMessage, + SnapshotListItemMessage, }, StdResult, }; @@ -105,11 +105,14 @@ pub async fn for_epoch_settings_at_epoch( } /// Wait for pending certificate +#[allow(deprecated)] pub async fn for_pending_certificate( aggregator: &Aggregator, timeout: Duration, signed_entity_type: &SignedEntityType, ) -> StdResult<()> { + use mithril_common::messages::CertificatePendingMessage; + let url = &format!("{}/certificate-pending", aggregator.endpoint()); spin_while_waiting!( { From 2a5cd47eedb019ebbca09fcfaec6c3b4ebc9dc84 Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Tue, 1 Oct 2024 16:24:48 +0200 Subject: [PATCH 144/274] chore: deprecate `/certificate-pending` route in openapi --- openapi.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/openapi.yaml b/openapi.yaml index 18977d53176..e08fe782835 100644 --- a/openapi.yaml +++ b/openapi.yaml @@ -78,6 +78,7 @@ paths: /certificate-pending: get: summary: Get current pending certificate information + deprecated: true description: | Returns the information related to the current pending certificate: * protocol parameters, for current and next epoch (to setup cryptography) From 5b70057f4acbc952ef76b0fa2c459f73b2591e3e Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Wed, 2 Oct 2024 18:24:08 +0200 Subject: [PATCH 145/274] chore: bump crates and openapi versions * OpenApi from `0.1.31` to `0.1.32` * Mithril-aggregator from `0.5.72` to `0.5.73` * Mithril-signer from `0.2.190` to `0.2.191` * Mithril-common from `0.4.62` to `0.4.63` * Mithril-end-to-end from `0.4.32` to `0.4.33` --- Cargo.lock | 8 ++++---- mithril-aggregator/Cargo.toml | 2 +- mithril-common/Cargo.toml | 2 +- mithril-signer/Cargo.toml | 2 +- mithril-test-lab/mithril-end-to-end/Cargo.toml | 2 +- openapi.yaml | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8b694bd3502..d58310f02fb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3403,7 +3403,7 @@ dependencies = [ [[package]] name = "mithril-aggregator" -version = "0.5.72" +version = "0.5.73" dependencies = [ "anyhow", "async-trait", @@ -3559,7 +3559,7 @@ dependencies = [ [[package]] name = "mithril-common" -version = "0.4.62" +version = "0.4.63" dependencies = [ "anyhow", "async-trait", @@ -3630,7 +3630,7 @@ dependencies = [ [[package]] name = "mithril-end-to-end" -version = "0.4.32" +version = "0.4.33" dependencies = [ "anyhow", "async-recursion", @@ -3703,7 +3703,7 @@ dependencies = [ [[package]] name = "mithril-signer" -version = "0.2.190" +version = "0.2.191" dependencies = [ "anyhow", "async-trait", diff --git a/mithril-aggregator/Cargo.toml b/mithril-aggregator/Cargo.toml index 9cb07656cb8..9631a64e071 100644 --- a/mithril-aggregator/Cargo.toml +++ b/mithril-aggregator/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-aggregator" -version = "0.5.72" +version = "0.5.73" description = "A Mithril Aggregator server" authors = { workspace = true } edition = { workspace = true } diff --git a/mithril-common/Cargo.toml b/mithril-common/Cargo.toml index 16ceac43137..5c41b8a1269 100644 --- a/mithril-common/Cargo.toml +++ b/mithril-common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-common" -version = "0.4.62" +version = "0.4.63" description = "Common types, interfaces, and utilities for Mithril nodes." authors = { workspace = true } edition = { workspace = true } diff --git a/mithril-signer/Cargo.toml b/mithril-signer/Cargo.toml index f15bcf5e109..856d03b0200 100644 --- a/mithril-signer/Cargo.toml +++ b/mithril-signer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-signer" -version = "0.2.190" +version = "0.2.191" description = "A Mithril Signer" authors = { workspace = true } edition = { workspace = true } diff --git a/mithril-test-lab/mithril-end-to-end/Cargo.toml b/mithril-test-lab/mithril-end-to-end/Cargo.toml index ebaa091182a..ad558c6baa2 100644 --- a/mithril-test-lab/mithril-end-to-end/Cargo.toml +++ b/mithril-test-lab/mithril-end-to-end/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-end-to-end" -version = "0.4.32" +version = "0.4.33" authors = { workspace = true } edition = { workspace = true } documentation = { workspace = true } diff --git a/openapi.yaml b/openapi.yaml index e08fe782835..fa9ddf0a16d 100644 --- a/openapi.yaml +++ b/openapi.yaml @@ -4,7 +4,7 @@ info: # `mithril-common/src/lib.rs` file. If you plan to update it # here to reflect changes in the API, please also update the constant in the # Rust file. - version: 0.1.31 + version: 0.1.32 title: Mithril Aggregator Server description: | The REST API provided by a Mithril Aggregator Node in a Mithril network. From 5cef73cf210e3fa1820faeb6fab71f963973a54b Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Wed, 2 Oct 2024 18:27:13 +0200 Subject: [PATCH 146/274] chore: update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 66fbd52263a..ef26bd0776f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,8 @@ As a minor extension, we have adopted a slightly different versioning convention - Signer compute what to sign independently of the aggregator. +- Deprecate aggregator `/certificate-pending` route as the signer does not need it anymore. + - Crates versions: | Crate | Version | From 2ae06ab1a3535e21e89cd05f1b7f593dcec5ea61 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Mon, 30 Sep 2024 16:09:52 +0200 Subject: [PATCH 147/274] chore: remove Cardano '9.0' configurations in infra --- .../mainnet/cardano-node/alonzo-genesis.json | 196 - .../mainnet/cardano-node/byron-genesis.json | 14572 ---------------- .../9.0/mainnet/cardano-node/config-bp.json | 107 - .../9.0/mainnet/cardano-node/config.json | 107 - .../mainnet/cardano-node/shelley-genesis.json | 68 - .../9.0/mainnet/cardano-node/topology.json | 31 - .../preprod/cardano-node/alonzo-genesis.json | 196 - .../preprod/cardano-node/byron-genesis.json | 117 - .../9.0/preprod/cardano-node/config-bp.json | 106 - .../9.0/preprod/cardano-node/config.json | 106 - .../preprod/cardano-node/shelley-genesis.json | 72 - .../9.0/preprod/cardano-node/topology.json | 23 - .../preview/cardano-node/alonzo-genesis.json | 196 - .../preview/cardano-node/byron-genesis.json | 117 - .../9.0/preview/cardano-node/config-bp.json | 112 - .../9.0/preview/cardano-node/config.json | 112 - .../preview/cardano-node/shelley-genesis.json | 68 - .../9.0/preview/cardano-node/topology.json | 23 - .../cardano-node/alonzo-genesis.json | 188 - .../sanchonet/cardano-node/byron-genesis.json | 62 - .../9.0/sanchonet/cardano-node/config-bp.json | 114 - .../9.0/sanchonet/cardano-node/config.json | 114 - .../cardano-node/conway-genesis.json | 298 - .../cardano-node/shelley-genesis.json | 56 - .../9.0/sanchonet/cardano-node/topology.json | 23 - 25 files changed, 17184 deletions(-) delete mode 100644 mithril-infra/assets/docker/cardano/config/9.0/mainnet/cardano-node/alonzo-genesis.json delete mode 100644 mithril-infra/assets/docker/cardano/config/9.0/mainnet/cardano-node/byron-genesis.json delete mode 100644 mithril-infra/assets/docker/cardano/config/9.0/mainnet/cardano-node/config-bp.json delete mode 100644 mithril-infra/assets/docker/cardano/config/9.0/mainnet/cardano-node/config.json delete mode 100644 mithril-infra/assets/docker/cardano/config/9.0/mainnet/cardano-node/shelley-genesis.json delete mode 100644 mithril-infra/assets/docker/cardano/config/9.0/mainnet/cardano-node/topology.json delete mode 100644 mithril-infra/assets/docker/cardano/config/9.0/preprod/cardano-node/alonzo-genesis.json delete mode 100644 mithril-infra/assets/docker/cardano/config/9.0/preprod/cardano-node/byron-genesis.json delete mode 100644 mithril-infra/assets/docker/cardano/config/9.0/preprod/cardano-node/config-bp.json delete mode 100644 mithril-infra/assets/docker/cardano/config/9.0/preprod/cardano-node/config.json delete mode 100644 mithril-infra/assets/docker/cardano/config/9.0/preprod/cardano-node/shelley-genesis.json delete mode 100644 mithril-infra/assets/docker/cardano/config/9.0/preprod/cardano-node/topology.json delete mode 100644 mithril-infra/assets/docker/cardano/config/9.0/preview/cardano-node/alonzo-genesis.json delete mode 100644 mithril-infra/assets/docker/cardano/config/9.0/preview/cardano-node/byron-genesis.json delete mode 100644 mithril-infra/assets/docker/cardano/config/9.0/preview/cardano-node/config-bp.json delete mode 100644 mithril-infra/assets/docker/cardano/config/9.0/preview/cardano-node/config.json delete mode 100644 mithril-infra/assets/docker/cardano/config/9.0/preview/cardano-node/shelley-genesis.json delete mode 100644 mithril-infra/assets/docker/cardano/config/9.0/preview/cardano-node/topology.json delete mode 100644 mithril-infra/assets/docker/cardano/config/9.0/sanchonet/cardano-node/alonzo-genesis.json delete mode 100644 mithril-infra/assets/docker/cardano/config/9.0/sanchonet/cardano-node/byron-genesis.json delete mode 100644 mithril-infra/assets/docker/cardano/config/9.0/sanchonet/cardano-node/config-bp.json delete mode 100644 mithril-infra/assets/docker/cardano/config/9.0/sanchonet/cardano-node/config.json delete mode 100644 mithril-infra/assets/docker/cardano/config/9.0/sanchonet/cardano-node/conway-genesis.json delete mode 100644 mithril-infra/assets/docker/cardano/config/9.0/sanchonet/cardano-node/shelley-genesis.json delete mode 100644 mithril-infra/assets/docker/cardano/config/9.0/sanchonet/cardano-node/topology.json diff --git a/mithril-infra/assets/docker/cardano/config/9.0/mainnet/cardano-node/alonzo-genesis.json b/mithril-infra/assets/docker/cardano/config/9.0/mainnet/cardano-node/alonzo-genesis.json deleted file mode 100644 index 0fd90deeb7b..00000000000 --- a/mithril-infra/assets/docker/cardano/config/9.0/mainnet/cardano-node/alonzo-genesis.json +++ /dev/null @@ -1,196 +0,0 @@ -{ - "lovelacePerUTxOWord": 34482, - "executionPrices": { - "prSteps": - { - "numerator" : 721, - "denominator" : 10000000 - }, - "prMem": - { - "numerator" : 577, - "denominator" : 10000 - } - }, - "maxTxExUnits": { - "exUnitsMem": 10000000, - "exUnitsSteps": 10000000000 - }, - "maxBlockExUnits": { - "exUnitsMem": 50000000, - "exUnitsSteps": 40000000000 - }, - "maxValueSize": 5000, - "collateralPercentage": 150, - "maxCollateralInputs": 3, - "costModels": { - "PlutusV1": { - "sha2_256-memory-arguments": 4, - "equalsString-cpu-arguments-constant": 1000, - "cekDelayCost-exBudgetMemory": 100, - "lessThanEqualsByteString-cpu-arguments-intercept": 103599, - "divideInteger-memory-arguments-minimum": 1, - "appendByteString-cpu-arguments-slope": 621, - "blake2b-cpu-arguments-slope": 29175, - "iData-cpu-arguments": 150000, - "encodeUtf8-cpu-arguments-slope": 1000, - "unBData-cpu-arguments": 150000, - "multiplyInteger-cpu-arguments-intercept": 61516, - "cekConstCost-exBudgetMemory": 100, - "nullList-cpu-arguments": 150000, - "equalsString-cpu-arguments-intercept": 150000, - "trace-cpu-arguments": 150000, - "mkNilData-memory-arguments": 32, - "lengthOfByteString-cpu-arguments": 150000, - "cekBuiltinCost-exBudgetCPU": 29773, - "bData-cpu-arguments": 150000, - "subtractInteger-cpu-arguments-slope": 0, - "unIData-cpu-arguments": 150000, - "consByteString-memory-arguments-intercept": 0, - "divideInteger-memory-arguments-slope": 1, - "divideInteger-cpu-arguments-model-arguments-slope": 118, - "listData-cpu-arguments": 150000, - "headList-cpu-arguments": 150000, - "chooseData-memory-arguments": 32, - "equalsInteger-cpu-arguments-intercept": 136542, - "sha3_256-cpu-arguments-slope": 82363, - "sliceByteString-cpu-arguments-slope": 5000, - "unMapData-cpu-arguments": 150000, - "lessThanInteger-cpu-arguments-intercept": 179690, - "mkCons-cpu-arguments": 150000, - "appendString-memory-arguments-intercept": 0, - "modInteger-cpu-arguments-model-arguments-slope": 118, - "ifThenElse-cpu-arguments": 1, - "mkNilPairData-cpu-arguments": 150000, - "lessThanEqualsInteger-cpu-arguments-intercept": 145276, - "addInteger-memory-arguments-slope": 1, - "chooseList-memory-arguments": 32, - "constrData-memory-arguments": 32, - "decodeUtf8-cpu-arguments-intercept": 150000, - "equalsData-memory-arguments": 1, - "subtractInteger-memory-arguments-slope": 1, - "appendByteString-memory-arguments-intercept": 0, - "lengthOfByteString-memory-arguments": 4, - "headList-memory-arguments": 32, - "listData-memory-arguments": 32, - "consByteString-cpu-arguments-intercept": 150000, - "unIData-memory-arguments": 32, - "remainderInteger-memory-arguments-minimum": 1, - "bData-memory-arguments": 32, - "lessThanByteString-cpu-arguments-slope": 248, - "encodeUtf8-memory-arguments-intercept": 0, - "cekStartupCost-exBudgetCPU": 100, - "multiplyInteger-memory-arguments-intercept": 0, - "unListData-memory-arguments": 32, - "remainderInteger-cpu-arguments-model-arguments-slope": 118, - "cekVarCost-exBudgetCPU": 29773, - "remainderInteger-memory-arguments-slope": 1, - "cekForceCost-exBudgetCPU": 29773, - "sha2_256-cpu-arguments-slope": 29175, - "equalsInteger-memory-arguments": 1, - "indexByteString-memory-arguments": 1, - "addInteger-memory-arguments-intercept": 1, - "chooseUnit-cpu-arguments": 150000, - "sndPair-cpu-arguments": 150000, - "cekLamCost-exBudgetCPU": 29773, - "fstPair-cpu-arguments": 150000, - "quotientInteger-memory-arguments-minimum": 1, - "decodeUtf8-cpu-arguments-slope": 1000, - "lessThanInteger-memory-arguments": 1, - "lessThanEqualsInteger-cpu-arguments-slope": 1366, - "fstPair-memory-arguments": 32, - "modInteger-memory-arguments-intercept": 0, - "unConstrData-cpu-arguments": 150000, - "lessThanEqualsInteger-memory-arguments": 1, - "chooseUnit-memory-arguments": 32, - "sndPair-memory-arguments": 32, - "addInteger-cpu-arguments-intercept": 197209, - "decodeUtf8-memory-arguments-slope": 8, - "equalsData-cpu-arguments-intercept": 150000, - "mapData-cpu-arguments": 150000, - "mkPairData-cpu-arguments": 150000, - "quotientInteger-cpu-arguments-constant": 148000, - "consByteString-memory-arguments-slope": 1, - "cekVarCost-exBudgetMemory": 100, - "indexByteString-cpu-arguments": 150000, - "unListData-cpu-arguments": 150000, - "equalsInteger-cpu-arguments-slope": 1326, - "cekStartupCost-exBudgetMemory": 100, - "subtractInteger-cpu-arguments-intercept": 197209, - "divideInteger-cpu-arguments-model-arguments-intercept": 425507, - "divideInteger-memory-arguments-intercept": 0, - "cekForceCost-exBudgetMemory": 100, - "blake2b-cpu-arguments-intercept": 2477736, - "remainderInteger-cpu-arguments-constant": 148000, - "tailList-cpu-arguments": 150000, - "encodeUtf8-cpu-arguments-intercept": 150000, - "equalsString-cpu-arguments-slope": 1000, - "lessThanByteString-memory-arguments": 1, - "multiplyInteger-cpu-arguments-slope": 11218, - "appendByteString-cpu-arguments-intercept": 396231, - "lessThanEqualsByteString-cpu-arguments-slope": 248, - "modInteger-memory-arguments-slope": 1, - "addInteger-cpu-arguments-slope": 0, - "equalsData-cpu-arguments-slope": 10000, - "decodeUtf8-memory-arguments-intercept": 0, - "chooseList-cpu-arguments": 150000, - "constrData-cpu-arguments": 150000, - "equalsByteString-memory-arguments": 1, - "cekApplyCost-exBudgetCPU": 29773, - "quotientInteger-memory-arguments-slope": 1, - "verifySignature-cpu-arguments-intercept": 3345831, - "unMapData-memory-arguments": 32, - "mkCons-memory-arguments": 32, - "sliceByteString-memory-arguments-slope": 1, - "sha3_256-memory-arguments": 4, - "ifThenElse-memory-arguments": 1, - "mkNilPairData-memory-arguments": 32, - "equalsByteString-cpu-arguments-slope": 247, - "appendString-cpu-arguments-intercept": 150000, - "quotientInteger-cpu-arguments-model-arguments-slope": 118, - "cekApplyCost-exBudgetMemory": 100, - "equalsString-memory-arguments": 1, - "multiplyInteger-memory-arguments-slope": 1, - "cekBuiltinCost-exBudgetMemory": 100, - "remainderInteger-memory-arguments-intercept": 0, - "sha2_256-cpu-arguments-intercept": 2477736, - "remainderInteger-cpu-arguments-model-arguments-intercept": 425507, - "lessThanEqualsByteString-memory-arguments": 1, - "tailList-memory-arguments": 32, - "mkNilData-cpu-arguments": 150000, - "chooseData-cpu-arguments": 150000, - "unBData-memory-arguments": 32, - "blake2b-memory-arguments": 4, - "iData-memory-arguments": 32, - "nullList-memory-arguments": 32, - "cekDelayCost-exBudgetCPU": 29773, - "subtractInteger-memory-arguments-intercept": 1, - "lessThanByteString-cpu-arguments-intercept": 103599, - "consByteString-cpu-arguments-slope": 1000, - "appendByteString-memory-arguments-slope": 1, - "trace-memory-arguments": 32, - "divideInteger-cpu-arguments-constant": 148000, - "cekConstCost-exBudgetCPU": 29773, - "encodeUtf8-memory-arguments-slope": 8, - "quotientInteger-cpu-arguments-model-arguments-intercept": 425507, - "mapData-memory-arguments": 32, - "appendString-cpu-arguments-slope": 1000, - "modInteger-cpu-arguments-constant": 148000, - "verifySignature-cpu-arguments-slope": 1, - "unConstrData-memory-arguments": 32, - "quotientInteger-memory-arguments-intercept": 0, - "equalsByteString-cpu-arguments-constant": 150000, - "sliceByteString-memory-arguments-intercept": 0, - "mkPairData-memory-arguments": 32, - "equalsByteString-cpu-arguments-intercept": 112536, - "appendString-memory-arguments-slope": 1, - "lessThanInteger-cpu-arguments-slope": 497, - "modInteger-cpu-arguments-model-arguments-intercept": 425507, - "modInteger-memory-arguments-minimum": 1, - "sha3_256-cpu-arguments-intercept": 0, - "verifySignature-memory-arguments": 1, - "cekLamCost-exBudgetMemory": 100, - "sliceByteString-cpu-arguments-intercept": 150000 - } - } -} diff --git a/mithril-infra/assets/docker/cardano/config/9.0/mainnet/cardano-node/byron-genesis.json b/mithril-infra/assets/docker/cardano/config/9.0/mainnet/cardano-node/byron-genesis.json deleted file mode 100644 index 1215d5c58e3..00000000000 --- a/mithril-infra/assets/docker/cardano/config/9.0/mainnet/cardano-node/byron-genesis.json +++ /dev/null @@ -1,14572 +0,0 @@ -{ - "avvmDistr": { - "-0BJDi-gauylk4LptQTgjMeo7kY9lTCbZv12vwOSTZk=": "9999300000000", - "-0Np4pyTOWF26iXWVIvu6fhz9QupwWRS2hcCaOEYlw0=": "3760024000000", - "-0_pjw54ACGTrCsH3SXreedq-Cj9pFBcZDbxT9sXaqQ=": "411085000000", - "-0f2smLIQ8XMD0aEX6Hyea9x7lvsPpXkJNkIxWgu7WU=": "394923000000", - "-0fIGh1Lc5glmQRyy0EfBXOV8WabO5kSEVGYYrXBD0A=": "915796000000", - "-0zTwqKpgqj4_OgP3U4iKsU6JHoKOd9ieKtwKRB9OW8=": "381805000000", - "-13zumvoaX3Pz77eoXL7NorM-SExtpwV8yhfTRn-TM0=": "384931000000", - "-1RjsQWENpqAFT1WqdQ2KPNU1AOcU7ZcQpYOOejK5Ns=": "769178000000", - "-22xrm7vKzEixOc5F1oj3xeKMN_MH2y8O_u2TH9DePM=": "803076000000", - "-2RkpQozYiWQhIIsD0aCs0gf1P8bVgnnzwsFg8c8RP0=": "1153846000000", - "-2XZaPcXhltDmOf1hvzYfZg57lKhlHnOS8PikQEkUVI=": "385510000000", - "-2o3qNBbRmRlnNlnzch0PN0_r_E7mLsKgs5OGRa4dxg=": "576923000000", - "-38c7PmGiIDIfQGiuprXyeGtunN4aNFxE_jO6tUN0Ck=": "382394000000", - "-3NbDv8uTc-dty8f0AR6-Yb-qaIkCwSkajjyFsXf-YE=": "1644282000000", - "-3UvSWkXUfNxcStJuoOXxTnRtJy3jQI4sUi3vHjXC8s=": "2426053000000", - "-3hZBJcnLmZjYodAosDF0XnW_xbQ1S6KS0XB3Qluszg=": "395499000000", - "-459i1m513sgQONC2P1ZWbJOM2sF_O7XjHcQylDHXnw=": "757764000000", - "-52oZuYSkpLCwNe0pGn6CUo92vOr01Np05mCoJ2mNhI=": "1207271000000", - "-57Zs0tjj9n8p2pvfgzaLZrM8iD1ISbJvSzmdgQaNIA=": "949056000000", - "-5Pgq4y8c_F2IBgu8yORFPcRB2fFsYzvf1Wtm8Q7220=": "458682000000", - "-5aZc2WtY3EAyILQd4UBnTG_CeQXnjL-y_zFDRcPYok=": "451138000000", - "-6Ed7TmLl3T53GAOiqMysVmamtt7XT9ERdscqMsM7Po=": "2044027000000", - "-6lnl3HES9BH0W2atqUFdtJLYnqBk9HzrIytY-DP0c4=": "382394000000", - "-76g9IHNPdYkxYUcogzbRUCBOQPNAgjx64hOwUpg6rA=": "1140914000000", - "-7LttasrZ4U5Grz49xp5vs_I_JuQZgnENQJadzHxhdM=": "1158541000000", - "-8I3X8YPjI80iD0dGl2WOwS7CiXsPc4DcZa6HOhoxZY=": "442614000000", - "-8WiQLpEQ7st5Ty-t3Lqh2d5VVPcv9n2UNTlNATDvmk=": "810455000000", - "-8uHVBbQrouWvBujh8Y6Zrj_4cZPin_xHgrZX5sZKRY=": "377786000000", - "-9IMLpHDIWwxDcLREa1l0WmXTHrSqP-g8XKvWCD-GlI=": "1153846000000", - "-9SaB1MbA4w0GYig3RCbBFk683YIQSSZqdKaQQmLaW0=": "636363000000", - "-9jeQK3V4UGkIF-F9Du1DKIIryNPSiekVN2eGBfAXRo=": "383322000000", - "-9pQVNlbr8DOGuk4UN5j5ee7ykKJrYN5clnFacHXYyg=": "385209000000", - "-Adr_ZFBQfWsPiNyhBhMFoz1rdj5UcDPyj59xKNkymg=": "469310000000", - "-Bcfv2Bym8nD1-uyQCF7u-16WcTWGEdFjgTlEJheQtA=": "461437000000", - "-BdInt6tiK0cshy7Ft2mN5ChXoOeJNK32XYhWYuZy_E=": "845859000000", - "-Boy9bMaRnk98bM9V4CkTtFXr0mMNJ-D4Vof7pnWPtk=": "455259000000", - "-BvExFvyMtGeBo0-uETFW1lQcDVqV6vBMMQt-MzNHiU=": "614226000000", - "-ByAPVJKRz34uqT6aOUr556DKrriOBHVWlmd8TMS_LE=": "454353000000", - "-C13tNbi3TIwk7MxHXRht--Gpo41mqqzafwch_4yWsI=": "4110858000000", - "-CMnLkiTXdAueE9UuawYfx81hH42CWoAErQ4SwvcA2o=": "468121000000", - "-CajmmZSyVGT6MeZ5J3Mu-Cn7v5xquGpuAtKh5EHHmg=": "1386434000000", - "-Cjf5nznzh5isQyBsTmWUt8hhUiKtd9T5145WF9DqcA=": "1837100000000", - "-DNTu6MVdzsnvj5UVjs_KbRIRwO6BI2N52ywxDTQnKQ=": "411085000000", - "-DSMe6DVA_oyFe-qyP3_L2sjdUm7AdWfOX5ilA1hhig=": "629928000000", - "-DgrQM4ccRxzSDWO7OMCQ5T3LReFOUxUT2QcQ1MkQuo=": "417634000000", - "-DqAfPlMXKnsaF1HUKIlnyK9R_g5k14nrBBey6CSK_c=": "385506000000", - "-ECxhd-9YI6cAO9Qui9hVkwM-u_yejSnoXF-4CwknCs=": "462839000000", - "-EJ4223naAg5SF1o0RRqB33ygRNd-2CZPBgFd1fRZpU=": "453711000000", - "-EOX9EsDeqIpxFRsZbYpubuDp0l4IG-Q0-CSQjdeprk=": "596818000000", - "-EYGheGaBI3ihwwVpuspt7TVA47oYAYEvQTAhWh8PMs=": "3856868000000", - "-EcscOlGPyNoRtXyMPNbSLjf332RIl7SohFR4Fx8br0=": "794258000000", - "-Eot4a-P3RKYYdZwisLhe7iflHhy9H6JwCsizjT0UQE=": "8133362000000", - "-FZ3PRPS2BqUIqbmyAfWh1SRyZRgjcXCoDVPx0C7-8c=": "384510000000", - "-F__yowsCEyWmp02BhUAztFfjZzZszSyRsvQ_XYwLFk=": "1797820000000", - "-FjIgqcldrkp5S2GWjNE7XumyCvEKUvBIfG7vZZW2ts=": "470310000000", - "-FueSz1tUOStKg9scEDc78cQfviOSt4--kJPrCjoEGw=": "384615000000", - "-FvOnyMxLtOln4MIXuTTj6tHTRRHfI8ibcvoEtpCg4I=": "1370199000000", - "-GJfncbUujVP19QDUvg6qPMRkBMgsCO3fB0jP_BhiCA=": "504600000000", - "-GNMn-2WtrtR-y8I2nHJlaKP5w0cZA-eYZmXQ1JWTWs=": "407808000000", - "-HO2UlTWX4o-BevbOVjVqalMLzM5zyvg57qYV0OpY0E=": "378062000000", - "-HOMAY11JRk4ynuEwDSyd2qEWwo7ow2_YnHSGUwfgbY=": "1156521000000", - "-HQfBXE7CzceH4RDi2msI3LZVFeKTHAlb4PZoieKxmw=": "578654000000", - "-Hs_alaDNKILbu900VVWCB668P6mwPb6gCfwwL__ujQ=": "389491000000", - "-IF74wbnopLbsCKbTJXWTLxWKAd95pXDo_XVkmCyP3s=": "1153846000000", - "-ISvyVhKB4YzexhTVVubxioMTDyUEREDbpLburbPN4I=": "422497000000", - "-IpCxwog17mKCwmKbwmeL7SrEvbN5NEYCMFqiXnWkuA=": "656960000000", - "-IrG2LB7XYZRFgrwtYuocP-Y1tLIxvyr4wazSlFiPiE=": "3846139000000", - "-J3MRlfkY1tl69nJtkqvj-r6fWZFH3qfhcjTT2u_qnY=": "416901000000", - "-J7gm_kKqUqZtmLlmaUKcC5dcvCN4J6VD9a0rEfzRDw=": "751740000000", - "-JA0yu-q4zDpk_V4XTkjgwaz4CpDthT3tZBrlVviDts=": "928308000000", - "-JFJICblDvcgM0BOdvt1Clg2rd8s_J_gB89HO85jfEk=": "456934000000", - "-JjpHv5u1XNfwqpbRpc9eSLTiGCsAXh4-aMkgiCaQZY=": "1249999000000", - "-JpVWtQ0hs7VdfRSgt2kabwbWPIf5iOZk7CCWAZdYn4=": "547510000000", - "-K-TDTIY03Hd4dqQNlbuJpFwWFYj82Jx7oLqXq6D9_A=": "378257000000", - "-KcL4jUiU9w8VDRqReTAD28XMUkPoavGWeFXIVFbwTs=": "384615000000", - "-L1AV7tA6KCUImfWf1ycIKsXIC5iuMfxHlEY4_UWG50=": "384435000000", - "-LFPcL65Ax07wslU1YrtDRrWRjNG_Wu2awSFM3hlykY=": "959893000000", - "-LGgZ5yDlG-4Eo_9PPORRqhqJwtCF3K1NTG5wgW0j5s=": "451268000000", - "-MqgWZ2b34_JaRXh5CxZBolR5yfEf_A1SDzHit5XU_c=": "384333000000", - "-MtBIlw_11i8Z2jkOlJcOhFKiQ75gWVujcG9UjuDNb0=": "404792000000", - "-NKYDGQ_-7uV0kx2XRnFSyS9W1ufT5TBpSQJMi3dhzY=": "577513000000", - "-NRuiEmwX_NWeEbE8ar--RYMtBzRCnGNThnjEE2MEZk=": "7707247000000", - "-NdXEFH_lt8BraFwRhJ98AhjSGHXng6UDzU6rsLldQI=": "769230000000", - "-OAt2LO5GE5SjfMwdZccTntKb_FADaf6gY6d1F0w37o=": "451662000000", - "-OFNssNYmlmA1JlJOpAD9HnUbW0PM79kUsnoPKxP5Q8=": "1542774000000", - "-OKgS0uLMnfbCV58GcKV5weCaLoj_VY4kTwkswJNv0Y=": "458917000000", - "-P491zXs8NfXwH20cpNeuBhZevdmJSkwVmPXCMml_MI=": "378040000000", - "-P92NKX7VfINRJkW4-uWnFt2GIucRijfRv-SyT1GzAs=": "423370000000", - "-PYRHrir4cnPUMrOh53tJ72tdzwaASHuyubwaYN64ZM=": "3133656000000", - "-PqOXEBQ5cWfb9Y7wbRK8u4Z43LfMlNQJQcu1p2JvxQ=": "500484000000", - "-QTY-QSDpuLRL79SUWONTS3kKGQyAoMBuAfqceqtwNY=": "1447378000000", - "-QVUcJ3dpF6jnIv6yw1ujd1bq8QkXx_-52-AV4HYoyI=": "461906000000", - "-Qv0wk7R_f2TwD8MxPR5SHko0b0t4sRUFxJk1ag2OLo=": "1538461000000", - "-SMHdyGhZnm2h5wSmZ6e3Gm6QfmZXSlWhVMs-NIsr6I=": "3846153000000", - "-SUhoC58THcRgFkqMHxb6iQ9XMhWWDqyL_iUQPFZd3U=": "416666000000", - "-SVZjwxl-F3wIIArEu_PNCvAISx45afdxIuG4aU66A8=": "1069958000000", - "-T-SQS4JtAvgsuHnINhzt1dLnO2qc1B-OlCbj1kGkOU=": "1538461000000", - "-TAF4lNusdqohxX16p8tMm1_ghFcQV7rlrZ1rH-FT1k=": "5385693000000", - "-TL-awV1QRQbVQiNvTPBGDWZGn7rm8PH-IyuHFWqQqA=": "1156522000000", - "-TTH7YJVuihIrrjpRQFLtJUnLiF85OFxCaz8kdokSgs=": "769230000000", - "-TVmCHoHbA47uNBcPHYBH5PKXRaNw_OEuYIwyXxtSbY=": "386141000000", - "-TYqe_FzQzDOY7wV4fcJyEq_m9sjsojxPf-UL6fzSyM=": "412309000000", - "-Takwzp-jrURutL6WUkltSdgMpHjynZTT8cLA2bSrKM=": "381059000000", - "-U6KatOQW0Z06gBCB9ibYj86S2ERgf-_qOFKdFpo9ew=": "454545000000", - "-UIsyr9Sdd-bpeRqN-WGIXxK4-A5gKKZgE-FR9y3mgk=": "392418000000", - "-Udj-P7FovROyPfpU3LF4e47Skcddubvj_ROeA_byIs=": "378385000000", - "-UeBwObtQ_18wCUiU4agn2B1qJSJ1kIStGjvlb-i7v0=": "503282000000", - "-UqPSh_AZpO0Xr1A23hYDgDP-yapTznmiKbu1setr9Q=": "379457000000", - "-VNHYeD_DDShZwKTgdEin25zL6iKp7iTQ7fGnE362yU=": "423312000000", - "-VYzhkIqzjjIYM9OiiwoVUShWQSYQYb97FfMjzkIau0=": "461296000000", - "-Vk819DZwAfLOnfY-G5t0BtuZ47ksldvmUOTtLSeDEA=": "499842000000", - "-Vub0gjBndzvtyUEHGe8ghngHLkexA2sbBJVo18zhA4=": "19230769000000", - "-Vx8K1NEL1MGWJ6PDmW5nfMk-5N7cii-mE6TYD_Mxow=": "382394000000", - "-WDdsOP769ixukqkcBfaC9Q9XnB1oT0pRQiVfharfuA=": "391797000000", - "-WMD8vYs9bEJAgrxTfvLSs8LpcM8pJQNHzulEgTdgHE=": "420676000000", - "-WPrHo6HSppH0WKi0DFKSE1lLlC9XvEwiXLgkGhywYU=": "434339000000", - "-WYlVxJb1J1bswAi5o87ZzLeqCD1JatLLysM_2uudnk=": "376125000000", - "-WiROA4EjGCyEvjNKFSXUEmecM_t0iNoMlHA8dCW1s4=": "384615000000", - "-XBtok2pjLy-DW0evQKEE-PRID53yWH64hZvOwe3ArQ=": "3114842000000", - "-X_ADEtk3rito8rgJGcmm7X6oOUln3TuhDcShLD9R6c=": "356922000000", - "-XiLEbhL2sBFtX3oEhzuM8FqZx6-XMXWC2FFGJ8UuAA=": "384615000000", - "-Xlz3x-LDH-srD_zRhPiYcTVRT5GP_VocdRDP3bhX1c=": "4651238000000", - "-XmxXh9ggnZ-ZuwJnAo0xv7cV7hnqK2IIuHHZ-hh9X0=": "4134900000000", - "-XthbIXp7_BgFsnyOvSM3ysSJohabUiUAbOXwmdj3IU=": "2006912000000", - "-Y5l7aG9QMu9RYLZJY-GaT_Y70prLsoViUVeUav63AY=": "615127000000", - "-YCwhqhF3BAUD9xHo0VU9VTxraudP0LH71GEyaauWQY=": "376889000000", - "-YE-3PtA1jjWUMcUWca-M9m5kUjvV7V8UaojI5dYiZA=": "363764000000", - "-YNoC_Jb3t7h9-CkvcoKZkKpVZWHakXNkCZCS0HW0xw=": "416666000000", - "-YPi39MlVJo3hCI689EZ_q6MDvdSnaaQh3ye4uofRS0=": "766000000000", - "-YTOQ8XccegJloX043lGm3obgKmTHYV8ItXsfqt899Y=": "2258472000000", - "-YYThSgiue6kDlFkVvxUNxSAQjRs61YZzJfVt_RBA1I=": "1213773000000", - "-ZX0cjedu6gJK1GPQZRNRtYH__8CjvS0OGW-jo5RjIg=": "392088000000", - "-ZYT-8LQFd-KCyiwsCYUpZgQqe50EuMSOg-ZlK9PTUI=": "462146000000", - "-Zlia6vABTQYHYTlJlPa4_M2JYs1wUGea9gikhOaeek=": "846741000000", - "-_TWWRWWQiPiLnol4sp6040zjHd1vmWaZrF6Z5PGbic=": "416666000000", - "-_fOwPJkH1ImH3Io6qCU-diTb6TJCY7WfSP9o1kw9nY=": "385458000000", - "-_iDleiPeDlebgAIbvF57PkoNjTeHRvRYA_24WWozCw=": "1923051000000", - "-a1vg1mkxvjKbC1sZVtVH4BrK5xbOfNnB0C1GBgrYxs=": "532264000000", - "-aHoQsV2CAbORGGbRgUyTsfYUfs3PHteyvO58vFESqk=": "383030000000", - "-ajWKWBHtigm-GxIgSmX6eFHaVYayf-xaKUgFyzPgys=": "382410000000", - "-aqy3uhWt2h5AtLOpfMMjeqU2FebrqOjW0GcTY0RUVM=": "917574000000", - "-b9psqj05A3j2GGZtu5TJKyIu6eNUklkg8ZEkiXr_rc=": "10967430000000", - "-bAYVxIXqh8OBKDOw-7ov-GQxEexevxXv6do8m0OUxg=": "3127867000000", - "-bT-EO_KZxV9nZO3CrGCC6aaU2EuqSqRlBHpjKMVFbE=": "389258000000", - "-bf0EVD3NHR1IWVxvvcgl9OIIjHLCeB5yVRK6rMRgI0=": "385508000000", - "-bhbolbb2hz3e7UkOohWwMuM8pUkO4vD3qWjMFw4Css=": "384586000000", - "-bp0nmh4-UO9eUasCJtCButfbNlM_Be_qMYWZv3vHfE=": "385506000000", - "-buxtZS1zCBKu-dOq6JA76qen_28yxPTheiADHMGYtw=": "1623129000000", - "-bzuGB_0CQ81rMboYA_6Kl1Y3G2tU9aYkKYreioMof4=": "769230000000", - "-cKaRmR5IVA8isaauCO3rX3AzX7u4aIGYv5E3Xp8QHk=": "384615000000", - "-cSSaMNtLgxJ56Uu43zeG2pT5Iud99IAuVIrdu_mvzU=": "1156518000000", - "-cUm-XTN5HSlTBFHXvq1LWYaUv2RPzbXpv12R9jA46Q=": "382252000000", - "-dYU1Yf74gnbIh9YTqCsWdQIYIXJQF15xJXdkfF9O1o=": "10967430000000", - "-dmT4TFIQdHVkZrd3kztUiy5Tp1gxeelhzbpesjigZk=": "675873000000", - "-eWycxIB-dYugb-nKX6sLEHbjZexmoCB3ZSNAzA_GqQ=": "4233446000000", - "-exhMA6kU_GuQUYbjoI9YBY6QpMgBKNSWrYEpcYobXI=": "384615000000", - "-eyk5kfGU1BU3q0gl6naR1zKqmzBdN5HzEboY7ByVWo=": "1275769000000", - "-fNiXrTHuhWSlLBMUgmm1VgwCP0opU6-ducQ7e-7UX0=": "389421000000", - "-fX8g_B-MsfUzdlofHWMwkC0xMWgp1Tm_6r-06ZeCpQ=": "383098000000", - "-fdyLtiENRdHJHMr1UJagMmy82668j3nimvrq0Q6gfA=": "908890000000", - "-g-EoJ37hZ1MRUuwQxMpfFJWZuhgmzQm5eTsZgHmtZg=": "380654000000", - "-gAY5vwff08wqycphsz9AxZaSKTFJZfUzllEqtqbjuo=": "4615753000000", - "-gCJZphXJtIDBTkpHA_avig-AxSEcA-TsmelPHuf0Uk=": "385507000000", - "-gPGNVsPJq06kB5dWpke7VAG9dU5KbBz6dvGvkLlo9k=": "423531000000", - "-gT0hsH4uEpJRnEVoDbWwKmB4T6PZechsyapoGmbeMo=": "385510000000", - "-gVIDHo4Tmzyi0pJAQgjUvo3zD8U0K3ifpaVL1O8a9w=": "384615000000", - "-ghro6k2u5vICz_LTkenlOHUlcbxp4R-1eqZ4DQ8IHA=": "458561000000", - "-gu8Y9k89cKNRxmD4ysL2G6w2hm9UGbhca35LRW3_CE=": "2827874000000", - "-h5cBcZ8CA51pEekCFfhPnJYhOGoyZlVZV9C9BJSsOU=": "396483000000", - "-h5ns13Fke-i0IIsiZT7Q1E6r-KWqPniKJPmSFJNv2k=": "1927537000000", - "-hRDY9ZOgTcmgz2PFPXyPS69W97tA31RXO1q5uofOTA=": "2343896000000", - "-i5slmnSzdsA5ObjT09Nngt5OgUuL22boFCPKZLoa0k=": "3972506000000", - "-iEm0mBKzLF4q4VHDLFJ207069YB9RsYHdL6jnWaeUk=": "773076000000", - "-iIvXf00Upf6wZw2sSc8znPRzyRziA1XgB1GxXrLAkE=": "407469000000", - "-imjSrMrUjsFS7z8qNnNu9WYJfCByBPaCL5IioWCc1M=": "416666000000", - "-j-yyCl6C89et-N6buPug8AOeXehpNYrgSnFq-J7LhU=": "769230000000", - "-jNodyNBNHYEKWJtgmi1RFG9IfjBoDMZHaYx9UGnCwc=": "418855000000", - "-jYwbQ1X4FlnjlvTIBbRQmi2rjiomzxNSmUn2P0EbvM=": "524269000000", - "-k2iAO_P-HfKOJKKGggjpSbYJ8GAE-VD3fcL5iMvfoI=": "464030000000", - "-kAk-9-qP6ZGel0NVhPKltQpZDzE6cZW8wxvqsSPtd8=": "2073677000000", - "-kNUj3Jz1aQvy5HhgTTh2S-0LWGd5_WiHJ_B6rzZOKU=": "394212000000", - "-kf0O_ct2AnKRAydQLQyMXLK8CE1gN1_ObUuGFP5g_g=": "418059000000", - "-l6wDluzWSqOTP9Y3Utv6Hu8cm24VUpxPW0dQk6Mnu8=": "466263000000", - "-lGfrO3-fTSrWafnMoAIZ_rh1T-3Lwr35G7KTEprdZU=": "1241455000000", - "-lkURGj0aso3uHEhT5m-0UbY89vk0n2jPWY6NR1hEV0=": "1709389000000", - "-luq8EnOP0tfjyq8jb5_eYk0x1rgg2j-Crnuul_bTjQ=": "464104000000", - "-mNMSMuJNRhMprfY5_LZ1yq10E5P3ZPt_KExLCQanA0=": "1891939000000", - "-mNY55KrCnadNwQxF1WBSEJwrkbDOGyq1BH0m9OeEjE=": "1669230000000", - "-mWsfRjEHFjLpKNg5APtJaAk9C4qK_AFewpz6KKBVqA=": "923141000000", - "-mlRcS1vLufrJrMgM0ZaZ2GVndoGcE3Tv4nfdBZbprE=": "461940000000", - "-mrF1fwl_2AbrYuhLbIJTcrNVWDtaZ_46IXyIaGI6Ik=": "452328000000", - "-mr_-RpfD5jb6Wu3OwiTMuQ6F0pRqzmTsDQim5PId00=": "377348000000", - "-mrwD1TWy2mmUEwlegsE1Z5t-UnkcmmlMtQ57zz6qH0=": "455736000000", - "-mzjQl6me7EpTlO3xsvNLzY5IJA0y1LI09a5LWXu2yk=": "7646955000000", - "-nDECej_BXdrLKi8HKRHb-fSLPqv4Sh3-pQZSYSBEH0=": "399999000000", - "-nlREoCcy0qiqDzBl6gPDhdrl-6higJv_CzQj_TmvKc=": "2146763000000", - "-osqazsfH5SOEJhqRIt6vFiRJuJ256iXdZrVlasjnuo=": "377902000000", - "-pgHK3S9NqYgu3aXNGX0yY8E_KECyz1iSXXTj4xrKBY=": "417632000000", - "-pwPdVoyGOMtBOgyvFN2C_Atc8iquRcVfcTUJtCoeiQ=": "382993000000", - "-q2jz_oh4x_fArzilDHlsIcFMavi3h4yOf3Co_xcHlc=": "402668000000", - "-qGZRf7L9lxZ2NhWN5URxX4olzB39NN6-MS0mXpi6SE=": "411085000000", - "-qIoHCpXb4tWJ7by57hIeEbu0UbLCovUYdJe9M6-VjM=": "851273000000", - "-qjtBPQMAw1UvwTO-CHhR2GgzYZGSTmdyVUmzqns_AI=": "808240000000", - "-qynXC1d2VZRjlsOT5TJdQXFxz4TXGwJtbpaZkGt7jw=": "1935699000000", - "-rMUDFwXBwMIytF_eDBIAm4IFieSUmmT8TE5l8SCUL0=": "3169709000000", - "-rTTCPNg7zWEKXyjurO5MdFvEKN4bUGrAASAik3alO8=": "637183000000", - "-rm4sBs0BR44H_5r6th3WtzxXwlz_iCp2uLo7jQfds0=": "897327000000", - "-rvW-9QOC9i90bQT_VIikJaaUt-gfPIoHjJ7kMrmtb4=": "1154332000000", - "-s0TbB6VfvIAf2gvFwwIcE3RYjPJSmtsEJVitlPCzXA=": "417632000000", - "-sWMRArmjLSMcwVdwfk0ifntQeiDfDDkPLQkFHUG2f8=": "384615000000", - "-uBMJuWyBfoY0kz_i63zjYpv8tbYyfUCCCM_OOpazTs=": "386645000000", - "-uifsFDah5UWG1WQ6rb1996xoL3tQzT-h96EJbmhH4M=": "844393000000", - "-uinLc3IGRhMIgOhiICZKcAUxtQjyG92YnIDIso_kYg=": "384615000000", - "-uqFrFRQG9uZ2ZYNkB7UeIaGVLyMOpMBoHCAuD5gBxs=": "833333000000", - "-v3pIdKntmG3XMBRx48V2GYFirLos_Nz2kctEwnGNUQ=": "464950000000", - "-vLJzO27k1REMZsYHhHCyWQWfcNYKxDXI_kWCAqzUZo=": "1538461000000", - "-vmdT5TV_YWYtzXxZQZvGe8TCS1x5nyr5CKI-6uXrok=": "27372915000000", - "-voQUQWKeMlhHLiZTJEm_pHXtUjE4m56ACKRmhVxOkQ=": "407808000000", - "-wgxxoeWKhwni7e1LLQUwKG_3c4oOrs1SYXUxaRwc4M=": "1234817000000", - "-xg21V8_MXykBme2Ml8yxmVcx7Ye9ynmIIDnTO51aww=": "2084345000000", - "-xpGmReYEnTsPrZXZ3A8fkwdDtUqzPr6_Y-88Quzlyo=": "836132000000", - "-y1-0o-v3rNkfyi3bK3ISaXZgEIXRoQZI7XwAsoDO_Q=": "11614219000000", - "-yGdgKwUrpZpNEDEhkLPGjwnGQIzB7WuLg7YJUuAoBY=": "1219880000000", - "-yIf8LECe7RQLdNMdVBkcp7wTeepJeweu7lNDvYf-O0=": "1177005000000", - "-yOYoDbHNxV7RuZy0uw9-9hIalipRbIomtd98kwxFXE=": "769230000000", - "-yQPBo15t0mEhSDqGUQMPPRPj9caYKNZb0tCsCT9OPI=": "384615000000", - "-yU3D2luIiHM21do-YOQAbfQjfwhGpoHODUALsZEjE0=": "500025000000", - "-ywc8L-hmoUycXuupjQNx5OjUTXmfYgLGIYhAXFIn8o=": "1145412000000", - "-z5AQh3jrQG7xw98iPwulO_Fl7lSSTWhO5g4euvqPdY=": "409514000000", - "-zMl7MZtEQPsvxLX6Wa0_aB0c_WVq3MvwZHsO5xt5SA=": "455094000000", - "0-12_W55GENO3jvuyaOOqwj3hVG7hQQQBekfR4akvEI=": "498437000000", - "0-7ePxzgBD5uVit84g3WiRk7QTBco7RF8CtbAxt-yao=": "460673000000", - "0-BTM9-eNCrgovKlNrGojml106pTrY6FLGbosy6-5AQ=": "473265000000", - "0-MxsDKfH2-0PXxFFg3b_Y0PvKRlYXS0Y1Z287XrsK8=": "2083321000000", - "0-hePHz29F2BGUSYRj_XO8ejXS0W2owykacgWy-8t58=": "417633000000", - "0-wdwrBmBwWiBqQQg-XRFN_AyYDUsepB3BVdDCHJ5Uo=": "33574379000000", - "007eg58p79DrMoxlJe23K7fIvUc2895NgZcFM5CAqyk=": "894213000000", - "009WYw04-e0RZRPv4ieq6ZcBlp34zRUkNdJmAsQS_yo=": "811044000000", - "00NqpRdugwLlatNTn84kbBgb1SFRw1NEC7hsgiKM8g8=": "470437000000", - "00OlXW7ruuBu8_vaRWpkP7g6bAbUnn5M5OvaTXA-omE=": "1233257000000", - "00YHzBlHQjrHoZYOJSXJ-nv-ue24PsZYYWpRkhPYS2k=": "384615000000", - "00eeUMbSdmOpJlHEtJSatAXFjh23KlXydw1A3fjxm5w=": "385507000000", - "017Y6InCSUrXU01NbukGXnKNb_ZngegBqIaN--SwLgU=": "6474753000000", - "01VVNJqdkdD_eyxVZUvPTSN5hXoiTLbeJPDOuTbNzDo=": "1807692000000", - "02BU985sqhNGkTpNRLA9LHRuO3WoMzPGVGLtuWKq5wU=": "747044000000", - "02mzEGTld08KzkM12syeb9sLNuVdtBrpvCzCFH5R7n8=": "1153710000000", - "03vZH5vDNfoci0Wa8D34PgwImtQkt7gKUOpq4-urRto=": "769230000000", - "04US0D8w2MeuJLtsx9eeQ6jGeHwosV63mycV8Bgd9sQ=": "470322000000", - "05G2toPU5pcdzhkt8CmWPoGWWLFPxQ6vAIg9YcIELcA=": "405357000000", - "066USWeuOsfj-pa2EkbgasE89w_x6rAu2G5LUmam358=": "4229856000000", - "06Bv_JAtudpTBiTanMCEe95DyCYKuwjg8hmTamdOmsU=": "412862000000", - "06DjhIkCDGgg0tq1PPxysh9M6hGv_ohQxcK4aXqB7Kk=": "384296000000", - "06NWGmTKOyyCRCNAG250HMVwOhoeC_3FG-AYhZ3bwkU=": "417534000000", - "06RxpMoyZCqIHd-0qKaMF9mmhS0VFvMXr6fAT0C6aeU=": "1413610000000", - "06haH4PxOUSoTafAEMsgYeAzwuqn6kfJVlhWwUNJV7c=": "577371000000", - "06sbPc13ROapFn2Cpm2v_fJrbKUJqyIsFvs9YNmFOL8=": "421613000000", - "07-XXtxfuKoFYZH--okM2n0iMMHVs9QNVVeUIJzoIsk=": "901165000000", - "07Qyi5QBZUOmUjPSZSVJcERDA8lu8ggGbuP2XE0jb_4=": "383087000000", - "07Sd0YXzHi7CLNoGcnslBPepYlxGuTU4xOV2atv9u-Q=": "1270391000000", - "07gU6WykwcgpQ5zqbat0gLHGPShBvVFDNAwEZKGeDC4=": "13636363000000", - "08CvvTa4jLAZ492Xx1Lnp04wmh_1xBIzeGCkzJA0xh8=": "761923000000", - "08m_aS1mxqD_0tff9ZQXXbhwVJvzRmdyS9d_KOwXsoM=": "1910522000000", - "0925LEMJYvAoMa8125lYqZc-05rcspbXUyoW3gOmpbU=": "404257000000", - "09EBxzSPPP7pAju4mPb9utejN0w6OKTKSywML3xBW_M=": "384140000000", - "09HzZXqRgyUkumDPynF5l2JDhnze8-_xikEDNlSvRFs=": "4545454000000", - "09NjAAs1J6qaiR2lTaGpfqedwaB99McqdxyNbZQ5Q0g=": "384905000000", - "09_Wrw20rdkplEOjeuBPzK5eI-dgnEZkXrkzk0HwVY4=": "384594000000", - "09gm7IWcheLxKBxBQma6L7zYyf8Cg1odGj_2a4upXAM=": "1249999000000", - "0AHvALGZa89hciPOSekjBYlBYpReaLvQQTWQmDLmojs=": "416666000000", - "0APBEp2VDwYDPEElvf0rV7RgXz8pquVCnCRb1oF4pKU=": "467177000000", - "0AYElmtgjNCreOwUSHiKaPTVk90lkkau-fjqQiVwM38=": "3656053000000", - "0AaWw_J0hndvrHnoWJNpWRohrJjtvcQgkjoHwSgfNIc=": "456296000000", - "0AsxuMhSJWrFvDMLnTJyOqaEA3Ap-8xHrkaoGknzUw4=": "769230000000", - "0AwufJPFqVnl1KJwKPwRAJztpY3iB_O0CdC-i79JQYc=": "487145000000", - "0B-U847DO619nKAOrFjSyfC24u3SzPqyVQODFQIoBUA=": "1621217000000", - "0BNA2Cd22JXU4I_W33Sys-xK-GkxAzpkgBQGnZ6cYgQ=": "458501000000", - "0BYYWztlE7NgqYKZDEB9GoC5s44AKsu7QuifulxzwKA=": "381770000000", - "0BanZ9WGB9LUVtCDf4n2wveRHDv1s1yX0syMUdhzK8w=": "1921754000000", - "0Bde_I6cLPnRYkUiCZ6YrQTsSVVJvTIty-2fjRhipus=": "694535000000", - "0C9fvkZOu8bedPGi1vKrssngfdn-Lun0Zvr93xqFBWg=": "462839000000", - "0CBiYsBDHLCFfyQK-rlOKeTnm2iZruFGbWlmrcKffEk=": "459880000000", - "0CTMyAhe_tmsjOTFTM3kTzgIMPA-NCTzOYHBzBF8Xqo=": "4179451000000", - "0CWdFOYhvbUlKAKiZvSvGbvwZffY0LaUfi595RIqBhs=": "378486000000", - "0DAUiGsXdKipliyE-IvTiDbXgm3VNw5Gv7_cBT1cBbY=": "469121000000", - "0DliC5RWCLriXuczIarJDroe4P-ElcCxAJo0bkCBtpE=": "385507000000", - "0DqQiFOqWSWK5ezRRUlQa4qg6j9yys-G_YDjrzi-1HQ=": "1259935000000", - "0EO_YwqgU535S5iA9i7eESjrIyN6Q67PnTAo5Cy1pco=": "386511000000", - "0EjWdftD0ogRlfCMhe_TDUNkPNinkh_okOiVDOtPTYs=": "1154829000000", - "0EmSaEp5OP1LlXjKRjViFmk1X-5bN7zr3nVhR49FDvg=": "411085000000", - "0EnpZcbnL5IxOs-XPqAui9_yrjgBWRsQj-Xi6gxXeoY=": "1145409000000", - "0F8V7mzs7XjERKmMHy1JVLzScWA0eOpRI7cKCxVU7Zs=": "382394000000", - "0FAA_lXNzGYxCogwxgAyEiB7TTKAhH6LZqoR9WdC5NY=": "419159000000", - "0FDbLTI1dH429axu0CYoM7TQg37C0gTj0MBol6qz0V8=": "386029000000", - "0Fruyrcb3wadSLziEC9G6W8PgdP3PfixzWFv2z8Tmgs=": "3643417000000", - "0GUopHpt6YzKFWKd0UvAF1J2J80m0LgBBDtjF3ASXyQ=": "2579427000000", - "0GYg7qMXXeEAoyhnekOCKcCQ7oc7QvIzs7T81PievBo=": "714413000000", - "0H3GXeR9x79TIrQOqHLWPhQCQuTbbeoqMSuHiVYYXxQ=": "384422000000", - "0H3ue0eZ10D9OjwdzGg2xGkTPBQ0uyOs57tmPmjE_D4=": "390141000000", - "0HAhKCafvtdjUr3tvVMo0xrSCCeW04y4tuB3UaZSSbs=": "3749999000000", - "0HUJDbGT0MD82sUFo8dTvEFzpseeBzG1x7z1COJIl0E=": "4999999000000", - "0HWEkOFVufWQ42e8mHLdbiDOhqp9OFl36YDnwLZM-6M=": "631538000000", - "0H_p4tIT5SZW1W6LIiy3Ii9H2eXWL11F_PyyApMWKk0=": "417451000000", - "0HbX0cqnXZPpgUqLjMa9bNRzoYSr4h-3P83gHHsC1oY=": "465482000000", - "0HdQ-n1CtkaZGu4e9Mk6-LX5GOBJjba4ZXFZWFAI1Uw=": "763848000000", - "0Higj7bI7MHm6oRjobKOT7noUJOrHa_cq7pP2xBwVWc=": "462146000000", - "0Hq8XvslWtyohPNPIH7QVJc1UTWleJXSUEMxn3mwtVM=": "834069000000", - "0I-CdW6g6DsfkTzLWtcNQHd8wamhZF-UrwG6eFcZ3PY=": "421824000000", - "0I-aMkwIre5bN0ksV1sJXY4Mu7u7jn4RFuZDfBN82yA=": "382394000000", - "0I1mkl-w004G2N8uEa_CWQnH-TosX7cYoUgyM5A7784=": "3716937000000", - "0JBTB5MZahRad3Bj-6oMpzKx2qeQel72RmWe0zVrnBA=": "487972000000", - "0JBq55yVgEgXbP0byt53CLmzcvpI1Z4LIzlQ_N4vCaY=": "1999999000000", - "0JQ76gKHdh6tFGGLJ9awEOpfBpVf_5zX_rCFAb3_uhI=": "378319000000", - "0JpAqR3oGNaoyajWxSanEYZhSr5BJAtkHQBHiMRP4j4=": "382479000000", - "0KFTbVhx3AVHu9mNJ11BuCXdrH3khJryN0vWPc94rLU=": "2871493000000", - "0KTP1QNqnZzzYbU8CPQB7qycynHIDXhaq7r0GVf8ka8=": "390808000000", - "0KVd4Vb_0nMUn2_ya1fQoX38_XaPV2G_Uc_llz-P74g=": "386496000000", - "0KcKP7flbmra5lFmqy538CERc49LEflFvSwvHle0v-s=": "836695000000", - "0LHwtNio_-zL0WJxjsdD0xJnBNAxMzTZZ4Pu1JKR7cw=": "778513000000", - "0LOf_HTaYCZWL_CyBNs32xA-Vi0dgJSHGv70HeWvZB8=": "383695000000", - "0LaZH489KCS-c6szIZEmIcpbUB_-yhIaLPXNCaEdIik=": "768421000000", - "0Lgf_56wtmNv1oWfAc0aZIkrkEVTR7hII6GfiW5FU4U=": "1795352000000", - "0LvgXoUdIXaFOIcCV7eqkrCEfg7EZS8NooHtOnusW6Q=": "413725000000", - "0LxzdwAQAuTYI9hg-k-UNdP5_SSXRnA4kNSfi92MdvU=": "406295000000", - "0MAmGwJVXxcnmiTLPmmN_dPSHj0kvacq2NlKodWz74A=": "1095456000000", - "0MIXaCfXoEgj143A3k5hz2BWFWQLDPRniD2k2WKVS1w=": "388941000000", - "0M_vySTXbO8LqMH0hI3UsXDuSmUcq0XgeJj_HX4s7sg=": "1124351000000", - "0Mn3KUvmPIAO_qHl6E07gPTaumyNaVec4weQJ0cvj1s=": "473874000000", - "0N5vdu3iqxPz-Pk2YwZ_SfHQJpZqYclnIqmTdr2W0CA=": "557005000000", - "0NggPFZsuUBXNWbyEdJwwn3mkakWwZikZ79vW7lu25w=": "385507000000", - "0Nmh7iallOajEeWb8Ruv6Qmpj7qe0Whq5wj-LwGt1mQ=": "642211000000", - "0OR-6ArnwAPnwYPR__Y69TvZ5EVU4yyC4LA_5ECacG0=": "404418000000", - "0OR481eQv6VkzuHd4xKowFU1OA58exitA8INe38OB5k=": "1927598000000", - "0PC_WYhvklWjz4G2J4_d_bpJfzEqd2BlR5g4KbEnVUc=": "68681632000000", - "0PL_m7qZOoE7s9m6URLQc61DB8m7NzjY-afUr7Vwfqc=": "1218233000000", - "0PUvPPVSXjLC4Pf_x_E1TSV6rqkkXRY-tQcp1RWpUs0=": "2278000000000", - "0Pd0vJF_G32VJm6GehSlE5S57KYmYB1aiYMZDAXjtSg=": "1636022000000", - "0PlXTJEj5YNAWMb2T8MemFxUqJm9Uh99KxNJVmm9Tl0=": "576923000000", - "0PuWLu73F0d6EvJbTXs0cyjjqtLkJX8H5XNlXBdjlzU=": "461600000000", - "0Pxg7awkFscI1ipeZpATFsyjuReGtwz8UEyWpDpsCM0=": "988758000000", - "0Q1ZGpKDndRqJQfw1TMfWpFOpesYQYtwqxcrE3M-iPQ=": "416901000000", - "0QM-Q5Y5edJEGG2fiMAtBW8OsXL82ZEvloyBQZkJ9zc=": "2152907000000", - "0QRIhc7NUEA__VHbK-reFBDSfNJ6WjnPBXJK4LaBIEs=": "458341000000", - "0RFe-N0WX_DGHPtESWJ2clsRnW8oe1YdDrL5MoCVlAM=": "387400000000", - "0RrPSCkuTC1ZLlqPShcFoHYiJtULEkwZjUJvbwLM7OY=": "388559000000", - "0S8-LTKMIyzA6z-MqfelDTwxisdiBmWuNIT67os04Uo=": "384786000000", - "0SBNPphNq6DTrEIkfWNHo9UoZe_hZ79C_rPj7li0qWk=": "16603876000000", - "0SnPc0OILnmSrjgB6nkVjp6PUdhtdaB9Pam3Z7XbchQ=": "628365000000", - "0SoJM6NTjKTuY7p7cdVcqynxYCgiEojJIZWWPUPqgtM=": "769230000000", - "0StINytL0vTc64ti5nbd4CqTr72XOluG3NGweyBbYiM=": "2793076000000", - "0TQMAGow1KWTrvc-0-VnPKh5PybaYyMcwPh6oGikaDM=": "382114000000", - "0UAA_jSMIZN1YwXmhzPHP5_sMoWXIhdPWdwS9e1CdDA=": "1590450000000", - "0UOfAzusd8LxxJtnbQ8wqzgJhIvZXIomTYRUMqinQBg=": "1156515000000", - "0UlMqnM3z2pOnEseVtXxwrDdJYoHWhqqqQhhOnTKSgg=": "1020398000000", - "0UoQg8xS1tEBqZtvsafo4ZMK2eJEr08pknZ3ICBKSLU=": "1236380000000", - "0UsnWJDHZ8E_UCAEG_aH-2W76ofoWBAJTCEUfsMwXoA=": "1876373000000", - "0VINvweixYmx6nLWZ8bVSeRsMXiZeIiLQ2fc4UJOCXA=": "384615000000", - "0VIi8wtnlZgIe9YqxE8ax91nYG4NhyZsu95szX_9Jl0=": "6027988000000", - "0VKI1RAqUqrM1_cJmr75H7GWlmEaBBmgYEpEFBhS7A4=": "454318000000", - "0VSRGs-DlJWuKe6Z3ClsFYrXa_vxMGqMtRdyGL4cX_k=": "578111000000", - "0W1_87GKve4g8tblt4Cyst8k3YRqkP8lXRm5kzT9ZKQ=": "411085000000", - "0WAdBplqF9lUvUL2rCnzDH1eadWRLYTs4w3FmYoRxJ4=": "769230000000", - "0WBsGSD8wT1YY6mr9x2iLo_en1S0GoBSNqLTZ6pBqrU=": "7413340000000", - "0WFEHzX3d3B7W32thuDv3QpADQLHOUBJwFxWas-6Cx0=": "379770000000", - "0WKfQ1lPOtnxHcrCB83_3AP31cB0GMhfiAdqtK2Aelc=": "1370078000000", - "0WLl54c4lmO4Nv9HGcsMReTuGgu_qEFt2USLT0tntSs=": "1153846000000", - "0XORaxVkle4SF6lMatCcl5TssFijAqhcGxA5Zzuvdrk=": "833333000000", - "0YiCioCz99N5Q9adqTlSjoaG1E94hBgw3G2w20OUOE8=": "384615000000", - "0Z6mxXb45QYI4gHAwEaAd9NB5F1G8F7cX3Kn2ai-_qs=": "458632000000", - "0ZBysUo8D-ZZspGwOck5Osa9bZrref3rx94_8GjZmKY=": "411085000000", - "0_M-xZso32Or_dVwa68IB8sMNf3Zg4P2dGAr_Kirw38=": "769209000000", - "0_UPEXVmDoaV1yS2PZca9mxzsUOxIXS3yLfxypgUGAc=": "384615000000", - "0_lKQsi2TZUi4aqNryKEx77ufXfAKJ0K3g615WNw2SM=": "385445000000", - "0_o5SxHqthY6oB-eLjJ_cvdplLCbP50dw30QODVTCcQ=": "769230000000", - "0a6BTaOFaWLHlZXXAGTbeZaDpmG4_gkOawSnGJeAfvs=": "384348000000", - "0aB-CbxvfPKHNOrB5hRV86_t7lDMKWw-5qURG5wGf1Y=": "385505000000", - "0aI9DPgs_Rx6AUL1aoxPxMZcbf671AlenKD_H94vjqM=": "640326000000", - "0b7jaIPKPhM9P2wib5UCrjvjstqUJ0X9a3bb610hjw4=": "385505000000", - "0bA8SIX-NwyZdk3TOqjEEE4zMMZjjoErh5b8H9ggIIw=": "1849333000000", - "0bgpjlpPQtQdxJ8iT4cdp96zCA8rtOzjcQ0wphpe3a4=": "384615000000", - "0bvL8BhNHTczPwWy8a7SrUGYkV2ETJ5OTRI49Q35uMM=": "645652000000", - "0c3o6huH4gnXm23X74e3EFAF8ger9O842Bz1LzS1cQU=": "470031000000", - "0c6rk27QrojR0YSmSbVJNsyLoeg2E4YppcykozTZpW0=": "421993000000", - "0c81zbM_Own5BMK8ahXZNrjCmgXTF8k_tBDwEfOsx8w=": "4595379000000", - "0cAZzmtB2CUjlsMULb30YcBrocvK7VhQjUk--MyY2_Q=": "8333333000000", - "0cL2j_yGsDubwZUq4qZsW6Fvr0bQm91B7YjLYsOujdI=": "470557000000", - "0cr307qvQE23b3mAWw3qOtJRouMgAdPnCHtB2xY_FRA=": "652751000000", - "0cudu8jn8GbKhBg0Zxak7-PJSbQS92kWYk7zmqcMNj8=": "577713000000", - "0d_asT_KaAXb7xHia9YqnBfmZ2TIUJFZIKIVtyxhh7s=": "1249999000000", - "0eDURz5R-t_eHKZChVH7hoBRakrGPJwBKLOQezaSZSs=": "455600000000", - "0eLQJ5-0VzG9OGU1W4KsWFWtTWcXPpFs0XLhjMi8dok=": "1315762000000", - "0f5qrJkrW3aCLCHgI9zDl4-GoHFKNQbTi8Ey6XfgRE8=": "384615000000", - "0fDoD_3WUJzdTF2WQFRVIGnxq3PseVaE88CBM6MLl-0=": "462146000000", - "0fRP9GhzfCHD5ca5OslTsoG__qqTOj2tF2_f8zM6sgQ=": "3081242000000", - "0fwyiOqkGiOmahBfmxU8Ol9m-fyYY2U7D8kwj7Kngpk=": "2112809000000", - "0g1pRSNEI46J-jmV1INRQgtzXDjWzL3YE2xatfMzFxk=": "914046000000", - "0gAWBv8pC32xRQsSeCKt6Mr_YhwNbiGkwR9yt7fZfJA=": "2196466000000", - "0gJKlycxzR2Yu1clCVNIrCguoozSUw7ra2c7bPHb8XY=": "2066574000000", - "0gNUk-i5MjBc11WytXzYTto7iCmiCxC5LtMVVpAlPGQ=": "384615000000", - "0gRT0p7AFgYe27ccJil8bF32JTsuiJrAg6B9hL75RNw=": "770237000000", - "0hBnnd1CtdtGXnY_mzWIBkkdFGfcXiWPGitUZyeA8Yw=": "521367000000", - "0hJA7cm-0-GcN8P4Jnqsko30HlmHnY5dGCUatDP-upM=": "4088167000000", - "0hMoZSTpaQiFuvB3lxZX217WtrjkW1ZUzMZt11-AXTU=": "2276242000000", - "0hUFqsOMyNdpj4amOMHFipILudZV1NnjU2G1E3UailM=": "1892805000000", - "0hkiJFVyCTF02_neyMpmbjPlRY-TrKkSY_w02VCyNrE=": "462839000000", - "0hvE3yy6htxDZqtOvtP8O66D2mE-pXNbRLFaSmrB9lE=": "444868000000", - "0iRum94vhz-PgylO0u9uY_KbPx_iiX_N3DXKQjB-9P0=": "464042000000", - "0iUotZq614FRRI-6y5eV2maLBY1CQLpJ9jhOzqrbQjA=": "833333000000", - "0iu0dm-jlNDehIongh4GxSqpLvhKvW9M06wtM2Xd6Zk=": "462146000000", - "0jfTvJ0TUSeeRXzg3YlGtEyIl8s19nQOelpLV9aYzCw=": "1818164000000", - "0k34eEfGFM6SXz_8qA7IP6WZNHNao48m-GVsmaePDFs=": "769776000000", - "0kGlMelWQvwP-JFWKWscUyD20JKF1vQDsA-nb0L58yk=": "544708000000", - "0kg8PY-Fa4_4HoTEjQErtxni_4FcfXk1XDl1lBgGdh0=": "3850930000000", - "0kufDsJZoqEQTFfrPngbTiHnU-DY48-FYbXLmGtemjo=": "3269230000000", - "0mK58JAh3wr_MaFT9sFffD9KP0ANsgipuX9QoE90_Bs=": "7735398000000", - "0mXO7JQNOjGx7XCJyzauY7gsGdCnX6POwetuCg9m-pg=": "528258000000", - "0ml_9xRUERGsPZK9bqSrjZCPPxkvPiIzeQ-2qVubhXs=": "3021153000000", - "0myZsW8Wqmd-F_p6S5PeskFye6mRDtcXBH_zGOjMITY=": "3176464000000", - "0nJiv60iDOnUclRNvcaqx6pry69aXmVWr2zNAyFEuVU=": "423710000000", - "0oVIhQ2v-FtomutKuoLk0WHXI0m_oRxMFE9_u1lvU-I=": "3850523000000", - "0ojzceHCKFxsT7wVpqxnCZsx4ZNpIRDSu-qEhV7haAY=": "405846000000", - "0pWewcOILN6Os0P2v51UxmMkns5DlrvPf_1Jhw63R9g=": "38550673000000", - "0q54N-gIm-RA135pQ690vB_eV7w-IUH4yeOgsCn-qH4=": "385219000000", - "0q7KRdsPaNd5k76ArnDCLuh8BC7nXzhX9a4ovwOpIGw=": "769230000000", - "0qAQqUqoRYCDsM8XHlcoKhcTgYR33ZtDEHnryJrHu44=": "1338809000000", - "0qP5LYQyyWCGdTKrxD1LuYO1rhiRNd-8Ku4gpNo9clA=": "411085000000", - "0qjDZijSZ9SatqkSOJQoWqaDMGj8j0HVo6B987L3ejc=": "395728000000", - "0r2w9FDssoutoYxkO8TFBRyoXSOBQA4MdUC8xTB_oWI=": "385061000000", - "0rujLGccCG-v2Z3WOUNg0gmNtEa3LEyOsqq7fgZp3WI=": "458399000000", - "0s6EwNy_nI5lN3NUoR2fsd2CM3O1TNISUhO6-AvnaKo=": "1145301000000", - "0sDwYOyiMSJd5_ww8AgzPDzdEPrp4ed5Q25bWSXzK-s=": "473148000000", - "0sFflxVsZmlc38XABoev2gsm9upzATPeawjfDByT2qY=": "1240088000000", - "0t-7Xl7Pmh9y9BkXJyEkD7MajcVSijrg_3pdxznHMtw=": "1666666000000", - "0tKWl0yjiD5c4G4mVkYhxDOntXCix8oCLaorZPZLDoE=": "1786027000000", - "0tUSAcRzjRINgUISjVX6cqSokYu_dMjyLACcSM0zisM=": "1889005000000", - "0tdVof4Cm7FF7B-b_THCTIB920tXajRaXWTg_LjgNzI=": "452405000000", - "0u7joemr-g0xGr98YAKQU4tH9DveseWOfQaAUVeRZWE=": "970578000000", - "0uBiDSwfVWoctoRXhwbCyn4KWdE_8AGfWGs2OwVnbTM=": "383517000000", - "0uXEW45PZqlH0s2Jxb3M1KaZ2yUeAOLq4Dia29JytXk=": "4545454000000", - "0uatR8FrvsnMs4Eiq2w2iM13FWFDrayUNFvXv9tGaWQ=": "2353655000000", - "0utn4MzdzEq0ThycQHb9UV5Eosp-BT427mWf0rg4B8k=": "416689000000", - "0vTYId8BqHNlgpbCHqKMhBmTjNXxQSNUBVVbHZasmxU=": "500000000000", - "0vVhMiampe9Xpgw-xO9_zZCnITBSG037lm-tBfgfNeM=": "416666000000", - "0vv0v-NUlw37aAbHAd6hUDzpr4edKvmAuWKcHgduGgw=": "384847000000", - "0vxyS5JB_5edX8wfysiaY1X0azvQmu7HN7nvX1evoYE=": "387031000000", - "0w2MYLXCHEUmTbLdWp11hzMdizES39nHG-MZ8Z858jg=": "425632000000", - "0wLyaJAC-pDfjErrFYZu1gRjEdRoGGfamJCYt-BlSz4=": "385500000000", - "0wUE-6WFXZT_phOR8fK0cEDwRweskhfwfbqrnw6r_Eg=": "418059000000", - "0wgO9TOgQ8A-BentPxRI3FcBooYt31wAZvXE3ilJUd8=": "344781000000", - "0x3zzBdi0_JmOzE_-xMPoOE8bUFpl2-q4ttZ-wAjzMQ=": "1794474000000", - "0x52SY5jXWW1JJDPO1SRFIDTusHu13Mbp3j4sPAqU4M=": "1306211000000", - "0x66X4eBKwgYA5fKOcF9N1UG2wRAvsIr_tLADwKuwXY=": "415889000000", - "0xAS5J0ML_qcllppgjFN3Ah982iW1iNYSGCKbELv3PY=": "379845000000", - "0xMetOHwz30XrCwgaeyyKqBeSTyPZnsTotHeFnFlDlQ=": "2260814000000", - "0xWrc1a8GmC_-qpLAYLcWd07bas2l56ObVgzjNU71bI=": "776976000000", - "0xbcWySw1bJcij16R89ZsJ2Tnd1lHb33VXDRSe8gNp0=": "2099037000000", - "0xitiIWO-0cDVckTd108T5bBqI4E-J8kmGjOZHW2WS8=": "3938593000000", - "0y3mg8cHzj47DgXz55xRzuZd_I27iTmjoC9XWt8284g=": "811804000000", - "0y5faSKyKPz3GmwpNozQu5PT9-aApAohdDA4Z0551pk=": "918467000000", - "0yfGblyy-PMfv8tZkLkC_CkOU3Q6P4dMhokulqM2s0E=": "768219000000", - "0z49RfGCmCmieWe2XuTbM8gns20F536xKJuipYLZkGQ=": "456256000000", - "0zmnuHP6BnLlcO0_2I2yIY7QiJ3iAmPj5e6YnY3mg60=": "4594199000000", - "1-DY5ig4kF8l1iXJpadawi9Dj5zAW-UKFYRxnZwh-rk=": "454356000000", - "102rj_hZAgn1yHRMr3R5t2IF5dhMRp2gUR7g6DpaZGQ=": "385406000000", - "10_ZmqdKdUWIsfuZkB3-8oXYVZeupv-TuIOZhlLFpUw=": "500517000000", - "10tsX8gjVy5nNNBXpZcKH6Fr08JS7s2JOnGziznWMkg=": "426267000000", - "111yZH8uC4iP9c26UTon5rnoIcuSpjPooPdw9-WqRCc=": "704912000000", - "11U8FuibSLohNs3V6Mu4qNU88KHUB2EAghX2mgIPsmI=": "382544000000", - "11lEO4W-Z7G6Koi6fjIP3r-_TG8eGN42EpFDauOrGNI=": "1156517000000", - "11ykICxoLgGz5PaF2SGZxB9Cm88hez_X4bz_t0S4EfA=": "411085000000", - "12569ZCMConMS_VM3jUkXgfoYXatIP947H5sYmNY4XA=": "449655000000", - "12JZbjmpLVUnuKSxQH9VXS0UKlCt0cbXq53JipGS4oM=": "422196000000", - "12lEdQzCt0K5t4uCHN4Y9KLRh9UI1g3agPQuObMF1B4=": "417630000000", - "12ysBQ1D-3EP7O4O-6VcEcXmz99S0on8iPldOSAd7m8=": "2310726000000", - "13-uQJH5hVgyCXd6nLhcAIYSQ2TZnfJ8oYKTSD9Odwk=": "385506000000", - "13Db4A6tiRTUpF-V0VPlwLVZ3YFItl1yrpjAq-Q-PEw=": "384615000000", - "13L3bfmmLGyXK1w2kOcHtYkyaWnvXwweddX6jiJ2pw0=": "418050000000", - "13QaaTsMRXT6WyGzgEBHffA12YSZ5O8xv9Rh0q-fN3E=": "476399000000", - "13WiImCdBTD-9_JmGf8zuL_phUsm3EcFGGEbsqyP8zY=": "381805000000", - "13Z-9nI-mEWT4DCd130WVYZGTk8tLZiVUZO7J5rw7QE=": "18172524000000", - "140o1lWdbNSMTcBWckb7muLIHtbCrKeEKXSSr8umHoE=": "454397000000", - "14YY-aMC_VhMOMM7GAHXcmvSdqqcEvLJsUh4HkZK250=": "417630000000", - "14rjfqjLzeLpnu8GcwSkLQ-Tn7v356YOeqviUuLm4vs=": "933611000000", - "150XceyaXx3jCjocuXL1-Ln1kn1B2Q-Dfpbw-2klouA=": "7692307000000", - "157nXUyhYTcaqX3tnFBlyY0jlGIeHRDQSi-AfpmOhxg=": "998955000000", - "15OC5rco51wBNk9xsJ6IUqU5UdIfq5ZgaMc9lz14H7I=": "423370000000", - "15T9o8-cnk_ocrkS2upCwPRLqn8Tl4iyb1F9Se0AMEQ=": "833333000000", - "15XcnWBOo817xn-yH_JzWhLpuy6tTyLcTm7dEOvJrek=": "580130000000", - "15kWBZuyC3J1F0-kSAfXrNPyw1S0FiKlxuSjwVWsA4I=": "769230000000", - "15vJORlkCrEygB-vDX3vSq2EW9mph1sUf842QyD8ChM=": "38550619000000", - "165SWSOexpB7OUR06m6EKOplwg4fLVCYgeTKhek0IsA=": "444184000000", - "16AbeNsAI2xN79yqoCoo-NHZ5_d6YJvdMDOOyh4rccs=": "1018466000000", - "16PCFdbIAmwpnIKND-u8jLMMuVkWTFfY92lxqNbMm44=": "833802000000", - "16vH3HDlsR5dE_9tqKLhMpQDmJzCVadLCysgdcWFhZU=": "2320523000000", - "173AOamiMAYZbIbfKcfiK_yXTHNSJ0Ww_-KuGt71Tbc=": "457253000000", - "173grx7dvpxYWgn3RV1hsYDYjrKU5AxjPn6-t14nkc0=": "456195000000", - "17RjIG4zgNUQbcjzKvMVdSWEZ90xn5hxatiz8j7rwlI=": "4196402000000", - "17XOHgv66oHFPXLPbpVmxZ8ZNWpiJpw0zcfGVkdR8cU=": "1207892000000", - "17mcBhwJVpBAgbXQsTN63uLNmFYJ_CKOyG0OvqUv_JQ=": "381520000000", - "17ozuRLdxABg79DxOgCPGwHfPBhQF_6nC7wlz_7htOI=": "4032905000000", - "18TK6KDdEpONRw1Y-fVKshz1hjIVdyqJ8ZYz8raXmPQ=": "847338000000", - "19OJzpIICxxqfHtAVolg_w6-uOQTvBr8kXkAs73hPOg=": "384426000000", - "19P0ndqUAbWO_hOv1czmlEI1lxlksmU642JbUD-c-zA=": "416674000000", - "19WuSS3RFH1qPMxuy2-dETWTCAfHu70uF7aj_LcuVJs=": "380347000000", - "19gIIVIJ7LOj9PGjnMtPaultX9ygR0wlHAwt6xdNSCg=": "3749807000000", - "1A3y0AFWW4PYCWLMVW2nWALo6qXU5QNH2OhZj6IW2gM=": "470730000000", - "1A94o6KzPKoto2MCvDMYaWjC7HLwadNZCLkhD3D3NDs=": "3346153000000", - "1A9uozQSYS_NgEVj4r9pqxJxNv5coIwa8iopgT7-TIc=": "832782000000", - "1ACGEzApcQdNtY3TDqA9dek40E31rsc1yJf3taeN4ok=": "3697374000000", - "1AFJ08Ebp4P53uQaAYvP1Uewo1eW1RGw7J6bdWprXFI=": "1923622000000", - "1B4DBO-laG8GETgkvVvf5rSu6kX-LUZnULGDEQZyU4o=": "423669000000", - "1BDi9t0JnHXCuGuvNfKbXWiO0kEb5tfcXaRNJeZcX1k=": "384615000000", - "1BPExDeOXlHJFs42umoh6VTiwWV9Jwb4iLn3pfCjEOU=": "769230000000", - "1Bzh_GGHaYrm7ux-NnhAKCWpv3j6q5QsSq1a2GjfPjI=": "415384000000", - "1CU6hawwd-4Il4dYKqK3Tp93fhdQ8wJq89G3kB23lc0=": "421367000000", - "1CqR53fUXMMvn-FzIYsOlFNcnO9I4dx0aRRVDOZp41s=": "454527000000", - "1D8suFrTIB0LlvfwtTjNWsVXnlXuYPS5g4pQkW5Q5yc=": "416666000000", - "1DZpSzhAZS4hYAeHCdsP8ti9dlk6KZy9dUv-Y_onsAA=": "376972000000", - "1E-MOqny5opknoygpxbh4_gJGugdEgrFb74d62dIk7U=": "3842547000000", - "1E3f1ISsTA3G63WbNPnq1RZr5ybD3keFLlqKXL43PMI=": "2039461000000", - "1E7vF5vUFL-lPfQWFEjkTWxgRrCWAm1-jSwYnFTEeMU=": "414907000000", - "1E9HJV3BuTQingfu9E--7z1h8E5xtHyNjpmDmmAtCTM=": "1045454000000", - "1EnSCJVs2uU8sdp6b3h5g35ikXRNmpTg2_zcqqlbyH0=": "1896724000000", - "1Eq-LDYs58ANWNhMd3OrDpph9lYrXlzoOaVLiF_4_O0=": "2324977000000", - "1EsXtR3yov9uM32Fnqgggpk9PAhdIyvYwNhreOPU8DU=": "769230000000", - "1F7-ka7WerZktwLYEVyN7P9x4jev0mzp6dogqSlm_5U=": "1229039000000", - "1FUPHXG7uTml1ZnrI-NJr0kSgbvMsOR6xhCfEGq74qY=": "15390259000000", - "1F_dLK1yyeGFzL34pnYbk_W4mnGjKFu6d7W26DmdUQo=": "893556000000", - "1FbBC_99c1zMx28szyk7uYBuGBdWJqCdCrxkDw7wn8E=": "382479000000", - "1GE2E_jVSaQI6fw59-X7heAW3eVkw3q_LwOtucCrmUQ=": "384615000000", - "1GVl_PR4dAZ1Gr8skD0xc9aRVu3tzLAHIfuSZmMnJzw=": "6002535000000", - "1GXdpuxvqXVZCacYnkq-oOR7q3pTlF2sXcX-UJ0dItc=": "1226468000000", - "1G_l0MCzGwDC-B5Z5YtVuFJ8_8PNEV_4TljlpFaqjoc=": "390384000000", - "1GadH4_mkfJV2FtW5sS38Ps1Z-yvtrCd8IyFykZIaM8=": "462839000000", - "1GhfBuUI3rRq_c47OsAu9gL5DAeg9gev5qP2XOMlhKM=": "385118000000", - "1GlKUamfO64pR_nWd2CJMY6NjJVjeQPbtX5cODlup7E=": "3076923000000", - "1Gm09kAVbmewfRvragwaXEh9LjPlm2Cz5O6GQAilXEc=": "385506000000", - "1Gq9kWYlKC3WNeqT44GJ9HavsVbSGo9eJIH4v-gHPzc=": "455600000000", - "1Gs7rHFw99pGK7zKxIc0lvzXiX19E-fTN8LzZ8R2xf8=": "459449000000", - "1GvIgtbLHJupYMl4GO5YWzgL6XGq8LgV0dNnK_ivHDo=": "10416666000000", - "1H9vd9fK1OayCL31qe56u_Vf7Y0fhjac5WVwA7wgBk8=": "384615000000", - "1HcDmUBBf7kBXP_48BH0G9fk8mY1CHuGXrq602YK_vs=": "1225445000000", - "1Hemc1_cWRGMvaPvAaBlmLiho9bFp8knlCPUwkatGmc=": "2943730000000", - "1Hqmg4IMKUcZnuIMZETSLsGxsFKkU8PTH7B132fh0BE=": "391593000000", - "1I1qTRB1TFx-hUssB0mTxTNQKQwVv9S0V-pNzvIrb-Y=": "378879000000", - "1IXPVn3aYKg3uLhyGhTqgYFNDDWN6iUNHjCP1DXSRcY=": "412884000000", - "1IXXFEVWPrEYzOeGPnw67e-sIOn5OU76nbPGhbr-FEU=": "382394000000", - "1IeCa4omziguNeuTBXlrK9LwrK4nredJgZlUzmq76tU=": "16077180000000", - "1IksiK_iZRfoInDfOSalZMI4bzzyeITMOQXJr7B61AU=": "823294000000", - "1IqKr4jCoTyuzyZD0yAAk-Nm18HUV_AMmI38yC1ZoAM=": "416595000000", - "1IrKAPVJuwG_9NvIOAnI0FEa07yI8xjgFpLY1tJ0_SQ=": "468961000000", - "1IuvRRcAq4rrqiHCxUPNYpZvGCyJVvNeL2M48Q-QIqU=": "385596000000", - "1JBoNJSBIzzNO-RGuUffWhs8AiulUHliDUE6yKhfPLo=": "453978000000", - "1JWtjzK6kIusnr3_K3AEkjWslpt9HpufzdwgG8bsWYA=": "384615000000", - "1JcbOSz3rFH3LU8O7_kGG5ACTxGTmqKEo2tlbYgBLRU=": "423370000000", - "1JsLQaDSmE1Ja6gctPkxRLGN6x4hDj8RP9EfSuuyIic=": "384615000000", - "1KhdPVbEyq4LjEZsgWD_ykJl_b11FqxK73eLJPfjhGg=": "1411170000000", - "1KpKBL3hLvnldyvRV2zRs2KpE6VVmNW0Jy-69o42UWw=": "386590000000", - "1KytNGVAC6H8S7ubKa_wODyH3vLBRC6cjtYy93QaLis=": "411085000000", - "1L1PLJ4lmyLcLrYpGGkxIb15vR5ibF43uQ7cQtMZxIw=": "453900000000", - "1L6XguY0sXMGH52oi4nJC05YP9p1ZdggmYW_nJEgi-E=": "391797000000", - "1LEv0IHJ5EYEnQTaGsGwMWDFO0UmiR8wLjrNEkZuPEQ=": "449746000000", - "1LeT5Rqco7-0fwPiUcs-UbeuIX2pAqihYD1udKANQXc=": "447942000000", - "1M0CPyjJMWMNrqFQ-RTp4KZw60u8sIQlq4GinZSCgYc=": "385258000000", - "1M1MUTGdVcFhOr5Ph7gGGI38j9IG8XiQACUEKCu1tcA=": "383621000000", - "1M2PnmnTNop7k1woMV4RPtTLxIMSSbuPdVw1rZ7qi60=": "1263180000000", - "1M8LZMMSGlwspPg2yTnRBGJyq535D64CpWEYdXvhUqI=": "2278000000000", - "1MH-6GxV8DnFmMivt15Tl7rAPDE3YMwOg14MA_iX5ts=": "1854180000000", - "1MtebMg9lZk8yrz2jameKqYIUrncS5ZxrHd4GbCw69M=": "385507000000", - "1N400Hr6RshoObWNzSXitT2bqhrMSbHArgj6jLCij6s=": "3384615000000", - "1NCWQRtnSPkOdPVT597FOXfC1m_oX2JrS4VqBQizuzI=": "554966000000", - "1NVDw6GEEnLGTPn271uE9gayiVhFTOaQEwPFt0js91w=": "769515000000", - "1NkWuhRc-m34InhtqroKOJ3Mji-SrSrhCQH48c1k6bY=": "3011269000000", - "1Nm7W25lH9fErHLVuj-vKSdHUNRCM5qqLIr_pAsbC8o=": "385681000000", - "1Nms6vw52bGanmlzsWT3B5DQfZDwcxW7OvOP6BAe8dM=": "814797000000", - "1P8S9Z9qXfWTzqdy8dVNISZJdXOKX5zb_FtTPWZY9Z4=": "391797000000", - "1Pi970mDm-w91n1gDFNXufqShRJV5KwSWlR1_Ype2bw=": "949302000000", - "1PrOTV3QVxv0RXSkPGZ6Y6GlKG6iJ4slTZWKcdklKyg=": "654571000000", - "1Qa50-odz1rqW0VbE9WCKvGwl__21a286IHk-aX1aDo=": "3106180000000", - "1QsbdbTxDdOgKfeej4-RbbzV3kgANizMHBt0Vx5Aee4=": "1551986000000", - "1R2V5reyITJZvCN_NV1BFSiu3lt-68-xbWHStoT82P8=": "1156517000000", - "1R5ySGmZ8c5A9POEyG6Ke_HX7pnFLW9C-BfTwcZOVGM=": "463193000000", - "1RQUR6Jmzd9BvC3EwMebrp3P0XeBkx_bDwCgo5mER14=": "2310948000000", - "1RdByu4anZLI2QMamKSrTISTfEXKJPiTw3uHEMWv-3M=": "384267000000", - "1ScIefI6L9aOnfl__HmpesTovjJ7NNZ-5TJvZ3lamjY=": "472079000000", - "1SdFcWBFElxC4yEX5F8cjBRpDyttYyyc2gEZ9WnSyrQ=": "4459818000000", - "1SfB_VOMm33P4vAccLc9u_MDS_6S3TmBC6GXpC4yJ9I=": "774024000000", - "1ShEXRSDybq4xR25w9jj0RY37Yvx68YPOFSFx6i2Ik4=": "384139000000", - "1SuGRRmrm7R_gQcnSl1QnaZvW7jkGT-fdqstyu-BQxg=": "2026785000000", - "1TaavOdapD0kSBhIT5J12PUArKDtvILG2FHhO3dizh8=": "940229000000", - "1TcULa2zCFuHdf-WEs2XBHCv0_Oxwl3bumVkFbxH4Sg=": "377767000000", - "1URORtHqR7xFprU4OQnf0C5WscdTim7xkG_cZjUaYXs=": "448053000000", - "1V7HcJSztYE0xZK81K3Q9S7lNN8YEcW81N3oYyo8UtE=": "384615000000", - "1VMXGwDI8uGBLXC2IjKCXRjQpdZ0RyG8KrgDjZvOxao=": "457166000000", - "1V_x3ZoJZcwMqLP0y2qu1pXsVZc_XflTqhQvthPCGtI=": "1142307000000", - "1WbFjcABRwe9AoY049fNmT_ETEzUiEezI_rIOnCj4Fo=": "395728000000", - "1Wc8EXhygRWcGf1Ra3sfEFIUblx7jw56sIs5hqq06fs=": "4105900000000", - "1WhyCRCKKqGNo99MAMndw5-3tQEypeu4-InrVHGJuBc=": "384615000000", - "1WnXu0hkkt4ciHK9s0NhwEuv3HC6FWsI_HX_alAOhrc=": "384615000000", - "1Wsta50am594NVSI86JV9uaC2KTxaPwUO136WvRbBrs=": "576544000000", - "1XCBopBKGcLjSsUaZYhquda1zVC2ZUidlOwHgOi9DBM=": "386038000000", - "1XUb8fhaP9GjMN3W-JC65xuG07mB0k0BXUD8BWcAfRU=": "644862000000", - "1XYAeroZEy5M3a5vVpxyBWe4nTdlGBSOoAPVnfRwSdQ=": "1560830000000", - "1XZ9qeGdTFpTD0jyt4CyRjRQaWHL9M5TnwuNT6_mOpM=": "920745000000", - "1XbqywXXrt641r7E-ebxtT1_EMGMwMyaT5l8DeDn-sQ=": "1002693000000", - "1XyIMXm-rWrN7kznUe_A-Zx23FY0HAzk3RE-UKjwDIA=": "386521000000", - "1Y4JHIgAC-33VBn9YFEW4v-TLGwW9XSosxycEL5YXmk=": "1841308000000", - "1YBIo0jTX_T-02ofGte8lATMjaD3c29r7glDxJz9QCQ=": "1914723000000", - "1YdKoDnc-_czIdMyGJCGKbG7CBvWjY9ycGlCkWyUl8o=": "946530000000", - "1YfzYkph3DefDXd63MhKBBN3INYuuHrbO0tpsTa3xCA=": "9795454000000", - "1ZQge4InDWpjyCk5TLTDok2ZY0ugzyCXRFY0us5Ti7s=": "383122000000", - "1ZRJ--kO-JHkWupuKQ1W4vuG9yDm3lCM_VKSaq3CVx4=": "381439000000", - "1ZVB8JiH_6Un5hS69qvM2uEfHjAU2yDJvPLtUm3vXgI=": "1825913000000", - "1ZzULRK51rk2yoMNR4st5FfDd59kPd_nUxE5ImdjWsI=": "388604000000", - "1_40dblcEXII6Ns74QpmcfYZ--n--LFGmGaRRg49b-8=": "905988000000", - "1_dLRwBBmRyXTa8v9qPV2owOmM7Y_DZSytpOItnBNQY=": "3909243000000", - "1aYALPY-c_TYDV_ss5ITss2aWUSwjWXgZocbaMMcjlY=": "3846153000000", - "1aqPKNWojZDwleox_zjDu_EQLC49SFAz8KHykSyyA3Y=": "384615000000", - "1auiR7A51lft5SuJTIuLG_xvOoc7FcDp8Vegf8fbIBA=": "384029000000", - "1bCWAAjGW7ZDH2ldYojcJ5pW4wKas9cD8BdTgEbj9Dw=": "471356000000", - "1bltGKEpZggH7ajkzqCDbGlCWF3eeybyxuSXenEUhp8=": "412353000000", - "1bxdV3NbCxr_P1fZginXVVTWZUIPYxf9OsvvDfN6J0o=": "1153846000000", - "1cVTd02A8ZT_XdENENSeEBqBDUQ5qQKDGRV8_f2cBm0=": "384615000000", - "1dQNQlX2xM-QtLmjQCRvxsP2iCr13OROSq7NURY9NUA=": "411085000000", - "1dSXN8m3LFaZTAFo_M_VxFlnkUePSMy764KaNYyCRWA=": "4970847000000", - "1dknO_o2A2HIch1N6RR5AEovYN4Q6cMX0RYhDuf4MiQ=": "2457488000000", - "1dpkDQ-O-lA4eDXZ7FsBww0-0PaMXuhykVbDWtSLzEw=": "384346000000", - "1eoP2t86ac5wZddVqSlDmWXyf2s2O7Oz9sBlCT0tRm8=": "1814415000000", - "1eofA2fezmhwuFLPGPUTELdpqnq-_WCUNRvh6w4gywE=": "389132000000", - "1f928K74Lb_HAB2JfUnCz1JDMYNQ-JV4iKAP0_c69_Q=": "2081255000000", - "1fKmR02U8YxnAGLs40voxAILDMHK-hxJhZG3WDrh5dI=": "770849000000", - "1g96a4JwpHClnMND-tP9m3R5oXKq-ZToclmYQAVsEls=": "387009000000", - "1ggEVGbtjmwZBoQIr36FHc_rKw80P_3MvK_lLarOkFs=": "393313000000", - "1h7Rg4dB4hPc1bnM43xWP0pc_d7qc7Jp2Zu0h8pVBbs=": "384615000000", - "1hCdBlZNU_ZsIA5wQCE3Bg4d3TmNGr5UiVoffYtSTy8=": "384615000000", - "1hdayabV8uooLHB3r8UJRSSIC4j8WBl_kJ_6CjrbWU0=": "994866000000", - "1i1fUVKgTViYW6kh5ieYXRCw-SeBQJEcehADuIZy61M=": "384108000000", - "1i2HfUBnEIfsSTfa_v2F7uTsSTT9D37VglEpXvyWa6s=": "1380711000000", - "1iH6WrmE-rDG1Spq3KikXTbWPqIn6_nVEy9VqZC-Kp4=": "703891000000", - "1ibtRUH6fg9YmRsmj-NnmuR0MN9ObDwjWKUhbrpp0VM=": "1153846000000", - "1ipcHwvSJ4FruF6sNdROnyzgvAmK70sAq16k4B39BK8=": "1154237000000", - "1ivEYVd_QOY6IkdsLTF99Bc3w5rvFxYBangcWsDkw18=": "3846154000000", - "1jKd5gRKG4lITZg7gQ_vIjwErwFkbm4PIT0x344jYPQ=": "481940000000", - "1jUU9NullcYeZG3VzZgwL25LrubMO0NguzD0hcXMYiE=": "384615000000", - "1jgZptujRWN4fq3g4DIiVKdjme4GR6p3Ub8YqB6yqJ8=": "452076000000", - "1jo2MwqdLpDDp7WjXkxVxhrvorBSa_7G89clxckKcxU=": "564372000000", - "1jq1CZIhgC4jPf2U9d2aXr9oUt0sAyTBM-OTkfC8sys=": "395497000000", - "1l0XYNadeTHsQWO3PgCpQLvWXmcNm0JxWE8qgQrcYBg=": "385510000000", - "1l0gNl6DZBIDTGY4xAKXU4orgVz72tAdyK5CzVslgkk=": "385507000000", - "1lgS6Ks2nYrVr_STatn_lfrK-JM9ZoPthQKikH4eMO0=": "396485000000", - "1m0sMI5DTRYL0KdjeVIs-_NGHCMvNQ_qvapvdSqIUlY=": "456954000000", - "1m2OmubJJRbX7CmsXcX3dgEQnLX-1C2Z9aKYvck66nE=": "770278000000", - "1mmKnrbNj_ZMLh3ztyeSTOZszPEMTc1PO7OroRqZJ9M=": "963931000000", - "1n2KWdmdgIu-eAgeTdH4DCrapsrvEFwDLRZeleNy5uY=": "3846153000000", - "1n87vR2lo0gw0BhfNqGYo4sDbgfNi2_EWkb93xNkwkw=": "455600000000", - "1n9AV7EYoIJw0uCUCAbDadSed5I4lRP3Xxu1LNe_l2g=": "381767000000", - "1nDannpxfySJUxsFpqLwpblZlu3xCVhUBVQXV8VjBJQ=": "384078000000", - "1nPJHNNuOKCJsaseO53SbGJ0J6FwuQo8_stKeAg63iY=": "486218000000", - "1nQN154p5exgNcc7Myjqz1cR8v7j8-trYRcVFRM5A1Y=": "1874440000000", - "1nUPWQzKQXgRQPiyLmx5rqMGecALeSA0DjqZwHc2_Ps=": "549800000000", - "1ngRp_0vTuADGeW8n7EhabtFJJPijT2hjI8VL8kXzGA=": "452875000000", - "1nwokYh6vtvzuiqH6dYGqskNBZYeip5llpD9eko8J5k=": "1223425000000", - "1o2UvXRrCIX1prsws9h2tr6LBJyiLKoXEODOzsdu1iw=": "454545000000", - "1oX7qKLXPQW-kC1FY1upGS2DdTsD3tLSMr-k7K8j9rQ=": "384615000000", - "1oZzJPiaMPpKiwlK7Rd4QK78NAb9VVWywz1oExBLuLA=": "4520394000000", - "1ooXN4TKKWEpPgY15PID0DlHcjgGf5zGWdQ6sEdqxsg=": "5959200000000", - "1pL5DFDhvW-j-2elJrHlr8V-91c_XoxPbkZcxRtL9sI=": "393313000000", - "1pLHkLCo4Z84ZSyHYefIfFdkLM7O1A1hQYaGeqJCUDA=": "396485000000", - "1pZOEbZoA0BZkrMV-G-SjbgsItCihSN14YUX-9KS5sA=": "377648000000", - "1phyIbYY3ztNqk060uC6eqVNkmPmm-DL0IyMbEmXc1s=": "1154647000000", - "1puG0REbNgLTPelpOn1zMPR8bDvKvqDnrEXaSJGU3qE=": "582396000000", - "1q-PHztf-PQ_B9Mmz1BQRKoho282ccPPCONXjdHlbQs=": "384615000000", - "1q4IofOeiFDNG6wuUcgXVntp3jN06w6xnkPj8mLafT0=": "384615000000", - "1qDPJfwZyZ4P-5flUfnc29eQfHGR3qpBEmipvTUHSoQ=": "398415000000", - "1qrTuHX3bcBtNH7buMiXkKGOeWNS2rSVcIhup-6NGFM=": "1153846000000", - "1rTbs579V-8QmLRPJEMejwXusSM-nefF_9Lo5AA85GY=": "1879350000000", - "1rnAavKeKb1GJzV9riasRmV4WnN-aIkAWl23EpMgLIs=": "384535000000", - "1rqsOlMgSZD2PQMg9IuTJsAmeWO0nbJ9LFpO0Od-Rr8=": "382530000000", - "1rsBw82UWT0rjSr5aNxDTAohDQgyzJxAdqZu6lHBrsI=": "1819166000000", - "1sD9Bq4GyZUKEvwx1UAYwo27zfdE3MkK3x0okV9BkvI=": "384615000000", - "1sYxZrxnG5vQH-KQdxdGlkcx2OQInYNCyd7-Ik3uuZ8=": "772717000000", - "1t6Uq6fFesLGtAU7yOKIYYWTFW4GBZ0o2e-zezSVTJ0=": "428037000000", - "1tRv-f_Kjpm_dW-lOfyGwoXX1z5UTDO45MbqAHfiDAk=": "1173970000000", - "1tg98BjhW5KXnUexRKijDU-xyD9JuaSpfpJygdympgY=": "454545000000", - "1vFZsKS9iHWO_tS3JWXtvJTFN9zo1Nbofad2-NwCj5Y=": "385509000000", - "1vYcjTv_sT4HSKreIMceRp-ZFZNkXt3hNCn_Gyu75Z0=": "494279000000", - "1vkqQZ__-peL9nPOBA0V0Fh1EizA0JV5cht2CKssm-o=": "462839000000", - "1wCHQuc8gbIGmA9RMhO37IC5z2oTpgEW6krFy3Vk1x0=": "499117000000", - "1wJiPvefKH_pwQoTcRC9Ir5TZGZdJ88GCWCwP_V81XA=": "769230000000", - "1wkd9jrSwkL3BLZEfZHUDurVkFKxd0KH3ALhYdWk1pI=": "385101000000", - "1x0X8DruMEGCt_GjHHi1HKIBLap2q1bdVwT1QliQZA0=": "2018910000000", - "1xm1MRcCrgUeOu2Fs8wNGJR4-rNPvmSmEUwZsfqdsiY=": "384615000000", - "1xsVb_1h0bUQtWv3kHY0JCvvenC6Yrn93uwOyF_oCl8=": "496125000000", - "1yCSM0CepuT8fOJyVBYgsjv6K8NY0EqVL9sQl-7zfnE=": "1408049000000", - "1yVcPwO3p8LCmQ4XwDX1b7E40OmASayMVM66GvIJjZc=": "384615000000", - "1yXfoSXoLhA7h3bRfzBIc_DTcd0054vsBV4BA8hYo74=": "481721000000", - "1z4fadqGqvdbFVLkhLPBRG1XzZJNCgC-UwbKK1iwL2k=": "384615000000", - "1z9f4AThp4IVB51reoGeOwlw3y5i6aLmM4zvw3419KI=": "1692588000000", - "1zIPfBqhVEWBILUdX5I0lrEAiMhpNEUN5v47emGx7bc=": "1927554000000", - "1zOQL0QZpASUm6SFRLk51bSkoflBSCmKxLG_oLtSYDo=": "1173546000000", - "1zyVVebj43cmLGZqhGj4l83YAW8XX0Ho8ceo1Nx3Ecs=": "1388846000000", - "2-9rTkF1Vh6gdzR7zo_A0nK7MfNjTft_LUWf1cbEGFQ=": "4898895000000", - "2-q4GIpO-Ypl1AMsydPOTXOMsu3oXVylLMbVQXE0OD8=": "1908054000000", - "2-sZtL39BXHMONiL3u3CUjnIRDPvETChZHZzpgt_9Uk=": "465999000000", - "202-uRZ7dm9en3oug0CkWkxIapChZfGuynodIhrarq4=": "389663000000", - "206t5Bel8ZZ8yYVTvBDKRbUEU6iZvcXZCfuD-p06k28=": "382394000000", - "20EzQXRIhWlJk_sV6puu7eUQbuxL2kxzFcxO4YJElWw=": "4985679000000", - "20FL55lTSYWBbAwM1ifnfK16S8UPTQxOvtBeCxiXT-4=": "384615000000", - "20LbnHxcW9jdlKTt0GejZzPjz1wTwRvIBx21MWO1wME=": "538504000000", - "20iImQA27UPfTxKSh1InItxvvXJtm6At1IYVvlhrHIg=": "2231533000000", - "20ovbzs9Y9uazDxXKTJq9YxY_MpF_jLY7HRlCDR9GyY=": "1629942000000", - "20umbLJX1ta5gmw--aEmN82DBAMjeQXZrD2Q4nb4boc=": "769230000000", - "20x_gBkYpVAyFQu9pxvFc2ei8atpXxWu_fKVgoittu8=": "446718000000", - "216Hz6GIZ9F-Ta8gx76rwd4d5YAUO-C0B3Db4yg9yHo=": "4265892000000", - "21LyU5KcrLSvNy4mLTBFmtfenAoXhxwS6xQodsWJE0E=": "419807000000", - "21U4-4-3qf625ctGWHofDNVha9OH2AocUqQvHrxl_mE=": "833345000000", - "220Le8Ag6EyisLKo1_PxOw2_a2O4YmxrFhKEXVui2Io=": "4545454000000", - "22Hwf-8EsVy8liLkBcSldcb8Q3RN4-v_3XQNfp6Z0Q8=": "1691022000000", - "22M1wjDJ8ZV1Vc4R1wrYFHTg4VJ_XZLKVae-Kpy7q2Q=": "384615000000", - "230j0qbN_sJU3SJV9bpnn95VFk36h0wMzQ2jQZNkA7U=": "411085000000", - "23Bm3GauOT09w7QaHtvalELbdQmKB_UT0UlJZmjdtSk=": "462146000000", - "24QNvTvaUz3KMyEslWTJysXsvKXPjIMO0-aIKvt393Y=": "1249999000000", - "24sMGgoGAq7eDkg3RcbADm9MqDhNgngHqrsMG3Eu2hU=": "2181416000000", - "251CTY574FhcZOGDZpRSW-A4lunSWQ4yfsJQwFn0AB4=": "420356000000", - "259qkTPxerJzrJqFJk9Qg65ia4mkI9zYFaLENY2LJoA=": "462687000000", - "25CvIltOLs62vBoQb6VD0Pa3NhQT94JuJ1EH3l8kSYo=": "3601765000000", - "25hH2bSsXLLxGkQNB6VAnXzNrpeKycJrSZ1SwTWFbEM=": "1684160000000", - "25j12wFnIG6Q54MmZusFk6w3elJFXW7zDP-3CshpfQE=": "380184000000", - "25shZcQfCZyunFCiKgpfFbLsq2biuRUh6QDQbknaqDM=": "909090000000", - "265GqC9WmZeXPtF0TqAeDdhl14QMeimmj5_taUv1HI8=": "379611000000", - "26G7qYcjQ0THT3Oa1wKi-Fv3Fh3yoP48RWPVKLQLGu8=": "10231499000000", - "26l-aRn1X2Np_Dt04kk4ZAZvQwyAorGPc5diHzlTjs0=": "1921191000000", - "26ov9VsjVgXJJQvm-q75lwMX4MaDETDSOqx7dbLpNcc=": "379344000000", - "2786d5yzBSCyAXoe0hyZ35pwP-8Tch-vl9vS-ClTzZA=": "4621453000000", - "27SVE2ZOu8adn7NuYNX-zhYzYSzN9uYLf_EtW5BGIJE=": "2269531000000", - "27Tx9pNQycHxCvN24VE2S7uw1rw6E4Fni6Mtk9_4SWQ=": "382579000000", - "27UAleyPz0cj6ikrKiK29lyJffXqWsgjgOUkmloVCNw=": "696563000000", - "27YHKq28PY4C4P5pIo19Xu7sk01Ivp3ju2iy41vFdkE=": "3715456000000", - "28P-yQDmNAZ-rMUH7I32IwatkPtgwD3WeiaBYpVy8go=": "1817993000000", - "28PS7fAyx0LtEYJn0Hc2CWRW195tmV3n43Mlm1Vo6l4=": "2055429000000", - "29Abp9k5cRixpBTR8BEJuKZ3YdIB7ZAb5NTd_KTdT64=": "9614135000000", - "29jR8J20Go7X_McvxHb-6cutRiiCI4yk_3ygXyM5TNU=": "1927554000000", - "29k9t8j6cmNG6VF39UYr5lHbiY-ilnLVvwXZnnSf34c=": "541995000000", - "29rg6FpjCFxs4sUdp3LsI4ANCO5fmfFK2sLAuN-0ryo=": "4166666000000", - "29vZnW4hZLnczTlWac5I3Ne9GaLAbU9d05Cegbbloqw=": "1363445000000", - "2AEcnuDmp2EHASrSnP3PiW7tv6HNYuDDQ6x-njI0Cow=": "383927000000", - "2AKftTOn4stz4r9vZpVRcFtFbMXpm6RuQyXyrL6t3ao=": "3457087000000", - "2AhKIcS152UzG56MTnkYZo7ikaICaMISp2cOIhHLI4M=": "2329231000000", - "2AyU2GnCuQVsv7WMiZ_kRxQucReaugnLUqlj_XpzWj4=": "462160000000", - "2B6UHWpElmnOSI1I8gw3qZKcMNSR2zKf-P9xZfPnbEk=": "427562000000", - "2B7L_0mSIfi80R7h0dToWDwcWNJbPrD25wTuKwFaUTc=": "2083333000000", - "2BKh_iy5JAJwzEgfh4_J6KyoqTdpthf6aMcVL4dDqK8=": "385509000000", - "2BeONsvmyMTkbT2iD5p0nX2Qy1ZCHCU7ZIg6SvOOTsM=": "3846153000000", - "2BqgEXGLvKlxpJFdCBKeJr9uPNTh21TSoLOrCF6p7M0=": "504682000000", - "2C8hAFtZF7g8wMCbwcOLWyi10xRDHxctjThpBw87iD0=": "461649000000", - "2CJyobBcNokB7_AXgsxhM1NDQaoyu-W-VEF332j3kW4=": "382018000000", - "2CepDz5gw9hEDejBcw1BrtYWAi8vUNhAca-kEyXBXqI=": "378006000000", - "2CybYaKX5dVnJcfCSkA617J_BjusgnRuscjOcTqwcvA=": "300149999000000", - "2DGyeilp8GU_Xnq358fHa8HAGyaGK1AhLk65JPwdvCU=": "6572350000000", - "2DHVoNDykzDX0wTanfnDCSL31Ig_9WFZM93hVyfLLZ0=": "418488000000", - "2D_qz1qlGFJhRm1rsMLtq6ECSQMP4NzNFJjMOJKr9sI=": "3989751000000", - "2DbaJoMqUjn2DIX4RpQvrv_UBx_08f80MLQk9nzCZBU=": "416886000000", - "2DhgcwFEDK6o16xB6Lxfg25vj1ZQNnc7M6aM_Lb7_qw=": "382394000000", - "2DoWj2s_C_3fe-R1Q8VljGPlHFPec905IFbhUw7CTrA=": "3473683000000", - "2EOJdN8d4g_JjWA5d8QsKbfdYxdc4Tr1EJJzetY0fTE=": "370748000000", - "2EhfV5HzD8k14-bADkV5lKAfVTMGqVHdGTAwHTOJ_lA=": "384615000000", - "2F8ZXFeW8mzak-XoDMCNubc8HlCz3491s8wmmiPrl9E=": "833346000000", - "2FD3_wmEYkJ795UR315kS9yP3DQ-n5jsnTNCjTxDBho=": "384594000000", - "2FE3aaXwLiCK0oPd6EDYbtjv4KjUdXoJcMk9de7JS90=": "1567190000000", - "2FGGYJRByMwZwF-zRXZmgNPu23eauKqmaM9adxDhVmQ=": "389557000000", - "2FH-SR4UYJVgP8GUBsALTP5dQRJjK6gfh285yQ4btKk=": "482708000000", - "2FIVyE0nJQANd6_TSFMcyNTd0teTQ_-LPGYUjesvoUM=": "381805000000", - "2FLcyu1P9O3oJtPZHTrlI_R7FQFx8rn_HaAOWNTvuqE=": "14999999000000", - "2FPGG6kyilaN6RaPY9xD1GnN7t_DCn5NaxoQXYXm_Ls=": "1538461000000", - "2FZJJjvY9w5vAMiR4g1ILyr--HVQ3b-sosroGRPClTA=": "1144901000000", - "2GJyyH91R3njjszYskyq7vt4Jc662LZUFD6w301Jddg=": "384615000000", - "2Gc7xhjsFl23Gj4gCgRWKmbPliZKkim2Fuy1DgXH8hk=": "1005098000000", - "2Gg3TF-txEISKKKCS2s8eNtZs8L-IuRpP0GIVEtC6f0=": "3079376000000", - "2GnQu62Vbc4xdy4eWuODdsHmw0RBzg6QG14qP6Nadbk=": "384486000000", - "2GwYY1D8nTrzORVzjWhVjMkeEF2BmgbKG2410C3Zh5M=": "382639000000", - "2H0wY3m7olOrgn1kgojGl69vAR5H2B0brrN1juvnP7I=": "11516316000000", - "2H_vcNjHv_WiCQJBSzrtPDjKFIYwO0Vj92vrBUuzhow=": "946530000000", - "2Hp_U7OVMyInk4cc7FLt6FU0fW-VDv_7bNQDpa8c0Ps=": "565333000000", - "2IKBqTcfG76idEw8UIyMtGw5lgPn9jC0Anvmj55x00U=": "466374000000", - "2ItdebmhxEr2sewgIP8HHCTxJa8a2HoyK7pqbrTdNwM=": "567311000000", - "2IzzBs25XBct_kRM4XVUmkNggczR6-FOmSXs2VMzq8k=": "2083312000000", - "2JC1fGFPpUAmbKWwkKprHuvOsmI9nrHiJBbuQwi5sac=": "1418240000000", - "2JOfdH0pJp78WvCNeZQu8CDdz1VkxWSu6it59Hw83Ds=": "470553000000", - "2KETrixJ7ZZMT5v75-1KANV8fUCWXcI7fyaNGLaPyxY=": "458833000000", - "2KM278b23zjhlUo-BXYMW01k3Kw04VrzY2djprKorF8=": "416666000000", - "2KT2qENIN4VBD5icQNQAZcruswYiXWqZTO0uLObZoLU=": "1513688000000", - "2KUqLLAcBam6HT-cBsIbccrJ9RsPrjxNdEtNnK_doWg=": "4090909000000", - "2KdW7lo3leaEN2Uv_DlBHyb4ANhyNgJbN29uIYZJJRs=": "454545000000", - "2L58K3r-fKf3PsP8IDP1cpFHileK6R5PCsNqTnTtRYw=": "7929702000000", - "2LIGPpL34bC_YohIpHMoVs8RL44tGDnqvMBaxhQF0u0=": "386085000000", - "2LVYj23sS3AJevQVXR3P7sDo5l_xh73Wx4zMq-Njvgo=": "385506000000", - "2LvkcmS1H59yPSY-7i98tirCX8OXZZatVt3sVGsOfPo=": "812900000000", - "2LzG75qS47l51p5kxwPb2-eoUfObn6B8NLZMdRFjctY=": "933085000000", - "2M7l8O9RcNPEqe49redCzBD_mFCOPRajQTaZYyAdPTY=": "2045454000000", - "2MHiVJwhrBFixHAmeM73iOWz9tuDgpOI6mgu94nkIM8=": "6073601000000", - "2MioTXYPPYrOFxPTFyuzw_dLh00GbY7rLi_-LU7sqxw=": "63598711000000", - "2Mor-xZ6f8TW4mDT5x30LEUt0btkCEcGUmg_DE-SX08=": "3434615000000", - "2NVH15CQYqzJak3HP7x3YE9co8xwdzfJmqr0kC5euC0=": "1897899000000", - "2NYMLJzdGY3NxtLJFVXkPebbfHgqCVCCi1ofarAuucc=": "448728000000", - "2Nh2s7y_JRQZRyg1lPPQDxfFHwiB5ewIdpb9k7Hybv4=": "769230000000", - "2O6jUs5JkH2eGH1izTqOeDYnSt6HMhS7WJA6P2v3qUM=": "6222964000000", - "2O6qJYrugwWVREGjQ6zMa8zjRMxDdn2dT5ug2LKQ81s=": "1514244000000", - "2Oe933QKBS7Nor70ZHh8H2mytkeLhNN_TWSLyJWXV-c=": "578472000000", - "2OrovwiMAmGduruLFhtqTxFqHNN2X1Jia-5noGSHU8w=": "769230000000", - "2P5ycvs8mtfiVZ_LikIRkYQNDyjzN_yLPI2OkqiKo6E=": "417633000000", - "2P9c3WUlvPXnBi2oaH5AYoc7v3v0X5VcELXWNwDSq7E=": "2296140000000", - "2P9ou1xtHh0QbkilWZDhNiTf1-N7b6GtVAjIPG-OoLQ=": "382902000000", - "2PSp5FMMwYhLT1-iHnhEX5anbOXtTwWeRxm4do8ibZY=": "541640000000", - "2PVOtzFQzOPEhknHyLhPlQme7o2EDew3Krn1Lmb2rKk=": "644862000000", - "2Py94W_hQq6wzYoZBNokZlAg1c9Ga8G3m0Q-YrUZUVQ=": "384866000000", - "2Q5viNo2YljKQSBeJ22lAUgQOWygCO1hM7U07VURuuw=": "1112522000000", - "2QL4P_cYvrfDH7OzUVtGlYYwgd8TIZ37AAN6UshT5go=": "384615000000", - "2RArjiTf0J2vp_IKgweBsgfO2ntBFKH1yM6UCaUIefs=": "767200000000", - "2RK3ASTnVTN1wobnMAKa5D6Dem0G3fbPnsK22Hz5JvE=": "499999000000", - "2RO3y7oy0wKK2uIJD2tW5jWJwvVbcZcjEXX23R01tyI=": "2727272000000", - "2RoN3hFTsuKLGIUr07jXHq_WbfMrce0iJoNgzKGINls=": "1379634000000", - "2Rxqw4xyOnmkP_SBMfSpqJ0PUH7F-joxpLgOWff5WF0=": "378257000000", - "2S00bRecx_YYd4UKHi7pI16V7XiHcnFYvMUPbYM6OJc=": "833347000000", - "2TJ1_xDeCP0ahjeqPMBbzgTZudMSR1IpqWYAPoqR9RQ=": "416928000000", - "2TK1x6OfWQr_80Ll6nP-8MF4AxrABnRRFGJNtMWMaY0=": "1926411000000", - "2TvbwYMYjb3iO9EWq5uu0V8AUNxAHGkIT_tkWcffEmk=": "5416641000000", - "2Tw01BG9AK8S-WdFdqLbDsfAZOxg-MOntaJrdROzstA=": "576969000000", - "2Ty5Y4Q3I355DdKw3kO7I3gc_9O1WvWtA93E2MsPSwA=": "663720000000", - "2UA8QVcL2YuAi96jB2V8P671GDrxsVaJojL288Qlo48=": "446538000000", - "2UQoveVz1l5NrgwWDiGCTlL6NXQw8qi-1CORquZoeLw=": "1223399000000", - "2UgpRi8C9f93c6KQZ540VDk88Qsaz4I0q2YpkboimTU=": "461548000000", - "2UnY8VabF7fdvBMom3zXFbBuJ8PTvgLmfuUirm3fiZo=": "446829000000", - "2UqWDL8SIX0JOInxYS6XXaE3jFzpkXTRGevUfIf9PT8=": "392602000000", - "2W10hYaqbpqGylO9sO34SiQU49fcnEwBRn72Y0YqYGM=": "417636000000", - "2W7oyCAZz6N1ikusJDy7SJHUnkyWBgH65q2Z6TOxmLQ=": "378384000000", - "2WBZ90rD7g1zXKyiDNrREe0hcuikDNkLP-VtZ6QszO0=": "404548000000", - "2Wd2C2lM_R6LVkdYknPYe97vfLFZeGK-qS3TE9D55mE=": "1928377000000", - "2WnOen6GdupU7kJS4lSIf9DltnDl1EjZLrtWuaFnY28=": "1491806000000", - "2XEKzopgRsbfswJZHzu_A0L28jCocpa6AncbfkhBx-g=": "1195983000000", - "2XNgzwhDSftPX7VWjRkjsUlaeQPdF-lR5Q3jJXsIVdg=": "387745000000", - "2Xd73MIJgv4qzaHk-dfi5GOUywNS4FDxtmGhW3jZLEw=": "10679012000000", - "2XoKKsIA28WoJhQFPdzo7fkbGuvJ0dzpG-n2de9EVqg=": "3099639000000", - "2YUWuQwacGHJvD1y9UJy_GVDd8Dm0E0PwhSOFvpTjbU=": "541645000000", - "2YcguRsYshughkVQvte14hWZykJGte9ZvW6Rnwjz8GY=": "416666000000", - "2YhsmO4pckmaTxeflO58MnJxt0SYKQRK5zbhyaDx6eM=": "4162967000000", - "2ZxlRlcuWx7GuJNBVutFH1hJe-WTKgxvgIJj2_Yxmzg=": "3793274000000", - "2_2PzES4JTkataHYDSjrfSpVNytr1TH0GcSD6zcraeo=": "909284000000", - "2__Wn3vPjJ7-OortzQKlyKwmo9_vwlBW8-XMT10ARPw=": "378404000000", - "2_iXk1fnS5Nd-PvI7MjSg2Up89UekNcgyT0AQFBg6Y0=": "1254148000000", - "2aAS5E7pfuWd5ddUfMEMO0_C_FpbGXHyoWB971oHKv4=": "1923076000000", - "2a_i8kaQgRwXjF3OHnsm8R_kTai7IPyK_6XbBQpsxVw=": "2916666000000", - "2arezeLtTRTXTTOhWzqUUUKPeAeofh6tlTIfbYUxhgM=": "487889000000", - "2awXXZNhjCO5YgJXag4UtwSRG9fHVbMg3sCLQV2odlE=": "384615000000", - "2bCcht9XdZnLQmKoT31z-IBZlOkUBZstiQ82ct0rBn4=": "385505000000", - "2bZpIWK4Vi1WofVFREdBIHLLKnwHQgbZ3wzg0pmDbyY=": "498584000000", - "2b_aluTGVHFyzU-chUGqURM9x3TBmRNk-DoGzNWUqvY=": "367238000000", - "2bwXCTreJh9xStSQ7z4TAt-l5be3lfGg9gcFCPqU-Jg=": "384778000000", - "2cFLwbdetN9CpK8fBNJvWa3fcBEPdWwzQ1WgYw7btyE=": "381805000000", - "2cqRgXU2ofDHhdLma17zw44txmLsozJoLii9dSJPJ24=": "384615000000", - "2csV2NA5FUl_BzfG06XDyvt1ArURbVJwiT9oVrDsyk4=": "411085000000", - "2ddCOGdDTJsKnUGU1zfV7fodT9-m7KfSeQJcdfDSTSA=": "416710000000", - "2decU3DM3l0AZ30AyVRxD7Vn-dka0E8hmrH56y2T4eQ=": "643181000000", - "2dn48QJq_As_8tnOd0aoDueO5J6n5VPXObMlQmPba5g=": "422561000000", - "2e6HzsWCAsx2NdBJ298u7ob-07hKq8S4Wi9b99OQfJg=": "628290000000", - "2e6g8n8IbOwxF7eXzJFJ1gm3ZFPYND2zjwQu1rn6P4E=": "384237000000", - "2ehuQ3xw3X97JnT6UHx9KWzyeHI7RQKCHy0IKj7X_sk=": "385831000000", - "2f54a74WK5IuWnoGvAP0xvCtbZRhaqmGpJHKQRZBves=": "847318000000", - "2fOMnp935hZa1ereCvLehWkshGdua0CJkLy_zM57mMg=": "414764000000", - "2fgNQJWoi17M8X7fayKS-X7AutTM-24DBJIRW-xFpQE=": "460135000000", - "2g1y4AdNX20RNxY3NlrmM9q46fw-xALfIfu1ZxFGJnQ=": "4188555000000", - "2gBeZLBqJ5Vy-aYAhONoKCeR_DkYBaRGvQ_bm-15zp4=": "455367000000", - "2h9DZquyLoMeQlj4CdrsCVkd5z4HKEnkQwb0AHLe1Ds=": "769230000000", - "2hg4zyhwDO9GjBMcszc76yM4xg523sNGhzAc2g0J8_o=": "416731000000", - "2i6WQjqGJPO7SyLVbAYDxh9hA1jWbVSuNK3nu0AMf-c=": "382544000000", - "2iNC--2a2FAXpONFQMO632IZnwqsQjfI_vB-fMWz5Qo=": "378626000000", - "2iOiFQsmzmm2msmPYlnSJRihbx06aqKkA1beeUDAOJE=": "448575000000", - "2iZ57Sfm4zK9dGK4T0xY4tb-ai3FmexBBOY9KAwSZjQ=": "409074000000", - "2ismzo7D3zG0bFHhv2fhE6wwCNpIOFkNF4p0KVClvB4=": "384615000000", - "2iynvl_vpF2-zgYaGW0NGdNqUQtEv2JI0jfSCVlXoHs=": "3234369000000", - "2iz9cnB4pyEDtOM0Ii6N0PRjZuXnnXa2SfOdVTfHsas=": "384420000000", - "2j5NOzzWC_Vna9_K4do6Cxabacg_45fVtNs5I0T0hm0=": "385507000000", - "2j9RS9kjram4IUAxBwS7a6jmTOJfBEzeR0YTXCED31M=": "1090764000000", - "2jPonkUdFSy38e5ZOZo1-FMWFD13oJynBZ1MkR_WhxI=": "1000664000000", - "2jZxD1gZxdoOD-LRZxky_qeyLmJnL4TxdiFO8r2pFRc=": "1361677000000", - "2jpj2iYlonDlzXMtSP2IMsewu6z3StvKlPGdM0iCSmU=": "460892000000", - "2kNLz9QLRWd-8dXxonuuqpM0wqFHf_G45C2SyacNz-Q=": "458682000000", - "2kQgBPEFlAos7VNwwx4WWLXAkSA3bdpJFzM4m7VO9W0=": "377309000000", - "2kTvsqF27HcrW2N0i1MH6gGa3pJm3WDXjs4Ocxn9GCU=": "369372000000", - "2kUpvWZgwds8sAjwKEUdWwV20GNzki_bLKddyNp_xyg=": "396966000000", - "2knKGz3MQdCxQ0cJhtlDIz-eVl5mIuzHrc5xjVgvEFE=": "392672000000", - "2kxZg2E7cs3WyYmo4ItlTdP_KfEkqR0BCr7VzjoFi3g=": "383487000000", - "2lOaWYLVPSzJ6oJt01u6KEuOyXWm2YoFtD1yLsVNl50=": "468907000000", - "2lVC_qmmVZx1_aZIcVTJM3lOBoAb69TCw_tvcwkzSPk=": "3731974000000", - "2mAdtsETxBnl9EVbi4huq3X1tybe1IT1FIgFWiTTNZE=": "2315273000000", - "2mEtSGlfepUinlAh3PHgdHnRSJDKhHiWR8DvM28i6FM=": "1153846000000", - "2mgR6zqGQCcU3Ug8BxRBZm90VOwdZwp8JvcfK6IY1wM=": "416666000000", - "2n1UrbCoj3mhm6CQRQI6g9AZqC8j0iqp-7Opk7U2U9M=": "443644000000", - "2n2EaO74-h0G8pkPQ4tnxhWXj1oDHOgRzPS30nv65Tk=": "1967856000000", - "2nmAq00IfTR1bPiiW66Jv-GcCWg-W9EPrcTYwWw2-wM=": "2891573000000", - "2nrzujMdbzG9kDtiJWKz287w4qjdFoBewEUXrawyKZ8=": "385509000000", - "2oIwOX2XSyesxhRtfuj0LPou9KiheHfe0JSVrA3q-BE=": "3846153000000", - "2oMtJVFf7ebkhVs6cz8e81r5Z_pTeUscRX08TLpxttg=": "385505000000", - "2oQCi4ym0Vqp08-hZz_fdP032-EzkfGDya0AoOxIhGM=": "957198000000", - "2ogEk30mT-s2iHTkD7p9Zh87cE0W6AulMN4eFTGgTRU=": "412483000000", - "2ok8Jsc-lv0CJ-IwImRLqQef5Xw-Dgz4EUTr1nY2PEg=": "384615000000", - "2oltwK9DPJLvo-Zc8wlq93SVpZ63qqUwGNvH4AbhHVo=": "1363636000000", - "2pIOSKebeZsUBOjOyt_CnpeP9ZGm1YCJks44EUPTuQg=": "403850000000", - "2peshWmfMxhoLu2FF4dDTeqlRx27gUlXUjpBNuR9nc0=": "461538000000", - "2puBjQnkNHdKK2sWpvxVS4M5ZcaMfXHy2ohu9S7RQok=": "385510000000", - "2pyVSDztfTSLEb8Cur4AjD9_WHhqgm-nY5_robtNnE4=": "467432000000", - "2qpPsf5cijjLaB5ce8pBfGhlslootb78akr5K6dB0ds=": "1233257000000", - "2qqEJnWasD2vfYflXXVTGlEPRBH4jiLmbw8pTZean-0=": "759047000000", - "2qsDIDAHgM9WO1PRC5vq1a_H8tytjC1P4GceI4UeG9U=": "31249999000000", - "2rkD04_3yTR4F4xY8iHzrHqLgwItjktJ4P12BqSD610=": "845123000000", - "2rkczTYUgshgqke_5O4AJniBl-LGL7booY0KOt5-SOM=": "1152669000000", - "2rp2T-JUgUKZ_wZrCNuhtqAIyMCm46z2ytRdbpbNAac=": "461555000000", - "2rsCqkpJVBNa_FjYZPgBoqwnftFrhQUgrRBUGmGPjPA=": "17364085000000", - "2sIRwmaAIdlql_KZDeqXwT7qporgjh7t2XO0bdXum24=": "522197000000", - "2sSKtBGMTiih0D5eIxaiAl6rNbe_cOh0sAcHK8w1yZQ=": "1156096000000", - "2skb1Rp76_a4n1Lo0X3-mSBxmHrHALoAtlfuMg9MHug=": "457533000000", - "2t0OSm7axhiq2Upzo3ljR3dJRAhvIKBh_GfoGD4PJPo=": "771534000000", - "2t2WcEQu8-Eay1rWVmbIQlDKyJ13ETCyc5nZH_6dVMk=": "794931000000", - "2t6aHuYMle4fLWIV9M-9FzvlbKVu09UFNErlCTlnGis=": "4251645000000", - "2u95CvMrYnSnGnIKIU1sIbvu8tWI3cUS-vA7aXXzOPo=": "421678000000", - "2u9NvKbkO1AvJkRKwe781zvZRB5rCS6YGIHPIIDTIho=": "385506000000", - "2ub_Y5R8L29bn66xANxMAA665VlqBJVHPpLFPkzInn0=": "462839000000", - "2ucUgSV8HUImRN5SvTaFk08dzNTHh-U8gvLzRFUNkIQ=": "4747163000000", - "2ujt_McnTsl2n8Xr3ApR5C3DNylWY4MmdKaulLL6kkw=": "423370000000", - "2unFclhguw44IguzLX85Cq7Xsep9LIRNqTMPwBZd6rg=": "662231000000", - "2v639DbYfs6JxaXWuUcUr-Ua7pxSlNMP12UTqCjUIHk=": "1249999000000", - "2vA3s_CZQYbkiQ4fNPFjTyq1YzYInA_rHDZDhI0aZ7Q=": "4142350000000", - "2vYP9zohrcUqtkZgXXtrPauK4Vje1OkJ-xpzToDrYlc=": "5384760000000", - "2w49Nk9nN3mhKQqqZjex6U3JGxqMLLhCVw_LsCxG_eI=": "4220351000000", - "2w4rSJOKY9qMO6Tc34ySRYxyaml54AY6vudRZYacEsw=": "384615000000", - "2w6tu1sFHd7xU9OlfxO446Dx5J23DkJecT2nS3WVh-U=": "1863549000000", - "2w8WvesbiMGmceq_XncnS8w4pN22pA8ejO_fnimPsDE=": "10360975000000", - "2wThm4yNE_R4JraEW3qZBc0HA9HdPAmWM5z7TDBsSU0=": "390451000000", - "2wUPuBcaC9Yxix-jADmskRqvLIj5en8ePEqrnbWkERA=": "20320387000000", - "2witlyGa_Lwfpb1aNNqv-7J4L-nsS_01HLfQ3UAZz_Y=": "384078000000", - "2x03YsB_DuvOwiP-dSz7gvxDQ_dfZB4dikg3SNVs0U0=": "553876000000", - "2x8zq36zdm49JFFv0r9hJO3fv1CMStAHI1yin7xH4js=": "4984767000000", - "2xPC9kfHghwliQ0KPVR4Y_R_e4L0vI2Bva3ULoIhS5Q=": "2360091000000", - "2xS1SP3FqytEDprJZq8MKvz1ncsvFEEVQsSFZ-Mzg9U=": "2498909000000", - "2xSWFESuMx83d-SLJc5ZGcPw5kx8h4pRs7DIkyle_co=": "2538459000000", - "2xVgwg1IDDGkkJRHuLoWXeblnJ5WequqGOwSM9RSOlM=": "709122000000", - "2y05mAv4aTV7tktzkEz6MT2diKpzJLpA_AWknFBTwcQ=": "789241000000", - "2yQjkrWhxaT3ssHeSM0s_b6HzIxUwzihzM60ByT2-7M=": "899403000000", - "2yclZHsMfb5g65c-j4Ld780-656nAnXSXzZwTq9dOZA=": "1000380000000", - "2ydogZ0y8qmlFPU90U06aGbBgqacBQFw74HPyIrlpPA=": "768604000000", - "2yv7qyX5L54LB9SGW61ZydoicfwaxRuvPwuI257O5dg=": "471013000000", - "2zM-AR-znl4byuaP-3KR-mLfNttEo_KNSYLaUJpIDdo=": "416666000000", - "2zldThkuESzuHKm9Kf4B9i3177Xw4DW4u6KoqH_lNHA=": "381805000000", - "3-m2hknLbifSyb_gQnXm4baQPwgmI1Oj6WpYkUgZLEw=": "464236000000", - "30dow8AULOWn6TpSHzkLoRZZ4De82XI_bX1sxypDXPc=": "386167000000", - "31alTY3wDTsK7DbLinPwQ_3PYzGhKUa_DZvVMrrT2sY=": "1084654000000", - "31yrGa7071yLkIqnjMaKNfrqoOF331k5HpvrTiluwr0=": "419686000000", - "327U9SyhocZVtBcLi8Hrl10sRsIh3Wd2AHYVwKLIi2k=": "2272727000000", - "335aVdcXc2sx1KyJuj-m1rvRe5ttaygDFK2JAE1Dd6E=": "384615000000", - "335k4jVjGeYl9bvCswJhA6i5IlNNT-UioNwNaqAJG_I=": "2421851000000", - "33bOpjQd2nuMmmSOdvqmhiycLJpPrbUufHTrIGMWgPs=": "1625602000000", - "34DNe_1Gg5YsIdMhnHRJ2nKjcB23v9P17IPB3b-kYGA=": "2088725000000", - "34ZaY5oey11asM2Eb3kQIvZlXVmj0HdlsIIvhiosPb4=": "464615000000", - "34fgu3mNp2NXxX6vnZocvuWf9JSZhx8Ogaqft4lpn3g=": "2668204000000", - "34yYKVvcrdkNThvIGCVIMrGInRyGGFkGj-XEfVrgQSQ=": "448384000000", - "35l4OPBqzKuuvUdsArbrF34_uLEOeZ0MD3zNF0SdtSk=": "18806282000000", - "35l7oKxFsJ89boyrmWuf30YnbipusxcrdUTNVTscLUo=": "4166738000000", - "36Wm8M5bUE07ekumAOzzf8Rj2xmgFpFfuBGQ9iYTMtI=": "2350507000000", - "36afBD4MmSeSwF_IZCYGDKkGiVXdcgu2yf1z_bSR1NI=": "575897000000", - "36e7fH35wHn3FbDKEYKXm8E_C1xoNHFF_cHYU5qDjOA=": "1134053000000", - "37WMxyCEJNZaqVFkVnLJCapINE_5f-KI8K3v6-vNr5w=": "510407000000", - "37khMO9bLTbCyyx1ivE681uHBzvpJDsVLYOjEDZvOwo=": "412370000000", - "37xHJNpDNYbouUNgiPbQlyoFCds5w_K9aR89ytl2KdM=": "420060000000", - "38j8pH3AnyCtvpeeSELJ6PbNr0SGsMqgcfBWe4ao7wE=": "469837000000", - "392ahy1gUwI7cdAjWzvSZaWEF11XqoGYMzYY1b-LaGU=": "411085000000", - "39EUuNR2DkBy2RMJF_AynMZ0lFWtPs-KejyLiwztTNM=": "2366658000000", - "39irny7kSo-HroE0bC8QJV3hWbKreikRkxxwaQ5G9nQ=": "462251000000", - "3APafQEU8rbeRXUHD6G70GdooZEpY7KqNuufT1mVrn8=": "823132000000", - "3AwiNPzwmJwtA0UTSvsv7fmJkun-FHlD2W0zR0_OcNA=": "3796319000000", - "3B1eLX00sadJuuu2rMKy9uJdJD9tOne0Y1hRqm96Tp4=": "675093000000", - "3B8t6tLhU8oasNiRTmuXHmLyavquhwyydRvOcqQfVFU=": "454545000000", - "3BAx6N_wwE8YL0Qk7-PbFdtNJztBUszbWxgZpV_lBog=": "1156520000000", - "3CLjUgVhSru8VNOIVaNvsXv60ZEILJeU0CR1f80eL2k=": "3856992000000", - "3CR7PiPWzwtEXD5T85pUKdSPD5p1cNBhRTxixcl1KU4=": "1147463000000", - "3CVE2XHRd5tF-A1dtEHqIazbvbnmBBuBdfz8EhHn3DI=": "413478000000", - "3ClkQodHVhT4QAU9hGVZvZz2YFL5Pti0V_r4hzSMfJg=": "384615000000", - "3CpM5yflPUH6FL-DspyhdIC_ZEZ3AuIVuKMRweAxBg8=": "384615000000", - "3DHMufF5oIFoquL2j8Hu_BH9dxRxiOSJAtvLJDDfnLI=": "383275000000", - "3EWrHy0Z8_ZMjcFudhngapzhtTo0tHJGqgO0xF5BwVQ=": "453417000000", - "3F7jWd5Rbf4uBgi-eiSevjdGGRa907Xr0az5zRWwvZw=": "2158227000000", - "3FRPCYcdV8WnN_9EUAlgjkTSJeZc6_U5pxevKh4DLRo=": "417629000000", - "3GGaVYfvvpJD90UCmFeyNbcQn5KvtJtsm1hZUcIu2IE=": "845507000000", - "3GNl7Y2zaYTVWwT0AJXGsd7ETmFyqpqFQE_0l1KKKS8=": "1423076000000", - "3GYnV2byz0nIGKs2_P4pJ6_BXPJkVpsy7qyxqRsVFxQ=": "642211000000", - "3GgQOuRKjIti4T-mHokrrbtHk7D-mTXD4vD4Z3pZCoA=": "456016000000", - "3HUAiFq9m55CSf_05GdLmMtGTrWnK47_jdfQ7ipWa3o=": "7027878000000", - "3HVWjrDeWvEqveW1BMjkjPF_9AXAepmTZZRFf9uawOQ=": "384937000000", - "3I51cKFjgJgUPBNrwWvtF7kxJFGzrnUj_Hp88k7JffU=": "357724000000", - "3IWW1Nyrb6X5hbFmxiCDAd8KrZK3ERicVbL7yrTkPEk=": "385190000000", - "3J-Wp1PJhXug2bhn4pSNAhejTR3CAF824E4p8RV7r0k=": "501408000000", - "3JAZ6R6Q_64eH3QfzC0ivkBAwf6yihn6VoDsLv3bKGU=": "390743000000", - "3JCwfKAozMLUA7Sj2OWBTDrY_88-ip66nxVsZbABP9Q=": "379203000000", - "3JJ1OiBN-D2fWnzD1K-AZ4bB_hsghoX_8j2WWx24Mzg=": "415824000000", - "3Jdb8DWPy2eSmjZnZaKITIjQKEnD6Wl_l6Qtl7Nh0ZM=": "416666000000", - "3JfxxeXKeyQOBgxB6cLgZqQW3DH4e6Kcw5hTBXjhxWg=": "2535371000000", - "3JzvdLISv3D0XPDYTrWmURxh6dQFU4EE1idawOnE4GE=": "4090909000000", - "3K-zBRFp3ZFd357EqbTSC4baWN_xFWRjGszfJ5UftNU=": "456480000000", - "3KZ4QMuTY5mAmFgAoCfFhK3ihflsNz1dY77VMCUYCeg=": "4086177000000", - "3L8GS6RKLdHLIOmtYO9qlc5eJP25lrPq4iKqa1fmGBw=": "385232000000", - "3LEIOwoTHOyam0qi4LSUQdX6-LFk3tIDuxyJDvnqD_Y=": "384615000000", - "3LOAg2Q-Oy_01o4sCnY2EoTG1LSk_IB1qXVWg8Vf_70=": "492028000000", - "3LWmTsKg0BXZwXl8dA-Fjfj4lXlA8LDNMS-jKJUnkpE=": "457943000000", - "3M1HMATeFvYa0oxYBlPWcdIooYRiWn_JTamU-hlQIfU=": "459886000000", - "3MCLrQvBnKsoFyGZGZWxiZXgfIM2mnrJMZC3T8ijLlQ=": "576333000000", - "3MO-olxQplF8EUXXkYFqSPbUFmpjWOklKRvnZr5mTUE=": "1259432000000", - "3MYYlDZlaIDDcJ8h3kxUa2Y-o39lmfpwGjQD1OrgSXY=": "19230769000000", - "3MZUv4sWoDl25sfJs2AlrIK6Zp__92_sJ5-b6IWOZUs=": "459730000000", - "3NQw0b02oQ1uY1CUPfk_zuG9UvRgJxhjorcnnZjDnu4=": "419238000000", - "3Ncj9ld5S1aJJxRBn8P33O5y5TKP88OC0VmyOym64cA=": "495551000000", - "3NlCCvttkZxu9n1vuNxaM76bo4ULGEujZI2OHygEbic=": "829079000000", - "3No77ny229KVRl58jXSU33Jfqv62elo0V6t5DAb8jKE=": "385021000000", - "3OSnumjxiTcqywBokMkqUFAxB9nopsHJ8K9oeVTRNfc=": "511240000000", - "3OWFh7WyD2DNh7licXfl47GyWdX04S5qJZpUJvat93M=": "384615000000", - "3OnkWk0LT38i2sx61NOR3rVQgI5YOdNni_JDH0O2rsY=": "749999000000", - "3OqQiyNsaS1dbUOIZiiE4K_WQjEIDk9p4w7pTZNkxWo=": "1102144000000", - "3PLV0_YYCm8eq2G1yi0myJi1CbR9bLyY7kntatcqi7Y=": "384410000000", - "3PX5Teacth2iRcADFOudKnmQaV0CGfycKa9PA8IKmw8=": "384615000000", - "3PYtQNIzWIjeJ03jW5Wkns0yOtwONUWju6zd9gFigvc=": "925947000000", - "3PxX5TVckFralUfy5DuQ7fhQgyk9pB97BEDkZKEzMeA=": "499877000000", - "3Q4F4XE362oLrDkafC6x7b94VG-alWrUnmWvPF0Q0b8=": "378532000000", - "3QKAj7_IL8V6yWjQ-_AL_7XoAIwGYnw7-EpTM96wbKs=": "568497000000", - "3QSTG_KFVD7MARmI4lUnSgFFM7NukplVs4qQCZuYWHw=": "776725000000", - "3R0G-4T2O6XgzQBVMSdGsHxCO5qOBv15uLzX5OFm-Jo=": "384615000000", - "3RDVbusG1x3qLtsYpTngBvbP9fIFnJpmMrWKHB1bqZ0=": "383971000000", - "3RFJaf_WVAozKls_jn_PteYFBkb4gSaY9RbuwBSgGMQ=": "458759000000", - "3RdqCqOwXnyxGO17WrKB3wgUDI0BPEdMD-4eokGVSkY=": "1767181000000", - "3SEBhBnISK7n7J4NZR7pRL5B1l2XWPyfyHHDBv_whqU=": "384615000000", - "3SGCzF--JzGRRo7h1zofVEzwD49paBBh7po7hLbc8SM=": "423370000000", - "3TgVr5JlLTg11x3m889rETgzC-Eala7GdwUlbMYgUmk=": "379260000000", - "3TkWf6j9jlzUanz9i7x8ygLxP1EhRNzI1y9i24AtH14=": "3076923000000", - "3TwS4ohGXXy0qOqm0D4v7luFDNcTdjDJsIo0Pn2ar9w=": "384615000000", - "3V-XC21sVA50UnWJARLkjyfPJimZi3d5g8QIa7LcRjM=": "1252888000000", - "3VDtZq3viFpA-L-CdfiQx2zcjyB719n9-V0CSgioD9g=": "450857000000", - "3VG1e1q_H37THxUn-uAH2bM9SZRBp8vT9As3t1er6Gs=": "384615000000", - "3VLthC-mrQVCncTgab14woOXwMWW1eDM6ObxMhWX1HA=": "809747000000", - "3VRwOQc2Mm6-pZWhL30Mshn5IoIp5FgOsZp8mCCHTTc=": "462146000000", - "3VWzxFGyB7vOCTco7ihUuclo1QdQAK9Y2fwbpCkHgu8=": "391600000000", - "3VhLwI-bfU0_8nN4-JTc2xVSMa1MWUp1Chza-bgFZyE=": "940062000000", - "3W9HmhbzYd9tHTtCStoOysJJeXH4JZ5sz3oxYIF_DR8=": "1153826000000", - "3WXuFEGWITHpE0AZbJ8OHhBun4H24zOkQaAKFbHAwz8=": "383550000000", - "3WY8jczGNG1m0LXxXARJBtx6ci3h9CQSgh2DzKoLb5A=": "385101000000", - "3WZ_38ku98IyT3iRp16baKEh1N-cbGZKk50eMamJWMY=": "5167237000000", - "3WijePMEixlPuAgSS7phWv0xfeQCr_coUX9LDOPlPOI=": "6249999000000", - "3XP7EgWtfc9OBbrbpKULcHl1mUVfdE119UaKUjTiWXY=": "385587000000", - "3XYOQreyzPKMxIjFI46DqrUcaSKksYU25gujL9K6UZ4=": "849918000000", - "3XeV_jdQRsM9sHKEwRXWeB46MvCGRXMa2poSEz1MFls=": "385353000000", - "3YAVYisTH5vUzthnGBjwvRWijNePAvI8X25OOALFqUc=": "405574000000", - "3Ynh7uenBdxzAUTl8_YcL9c5udp7ebhs4yZlFdWgSe0=": "411085000000", - "3YxUPNGdBjrAi0BSz7BNFpwrdyTW6mXZQlMkpOr-0r0=": "383968000000", - "3ZOQbNCM4sWsbs9oJIH5ZCpkdWzdTlWC4OmgG9VkS8g=": "1927643000000", - "3ZUHMmA-IIc73DUsT_gDhuyINDg0sb37XMjYkg9M-k4=": "447147000000", - "3ZizcyqsHO50S_HfsGhYOxXZmJAs9RZoQsKWzCxOvQI=": "777285000000", - "3ZkFzd1N1MHTtcNa59XpixTonJEj46L7SHQNxCOampU=": "379344000000", - "3ZsyP8a1wrQoYEP_mL4jyCY0XOpkDTUCxHCVp3L-zvk=": "1740450000000", - "3_5kkeRf7excUqE903Fc9vPj5_Of8CsJw6D2y-4XET8=": "3329213000000", - "3_BMvEyV4jK-W6bsAqFpuXuEEJYivjSroe6KGuy9HEU=": "812162000000", - "3_M9VnUcaUt2jrlgz0jNyjZD6NtkKcM1OVWsA5VzGNY=": "464104000000", - "3_SxyPYlNKcIFtg-iY_wncQZDNtvP5bHU4hSgFl6dXk=": "1923076000000", - "3_fvKzF5uPcudV09gVEOZnhWR15ZnpFe-1RefeVz38o=": "3969884000000", - "3_tBpCQ3L-AUv-X1LYnKw3vf6r0INhdoK2gUyRgIayk=": "383910000000", - "3_z0f0G14e0IuYVxZJTIDgd03DN8YNALXoqAp8ewzyA=": "2188411000000", - "3a58GaMavFxhij51SQuXdjEjEy0ep1xmgKDrXBUSbLI=": "499999000000", - "3a9jkIeJSHNnXiqWDy43Ex4fL52oL2FmONuPwSopP70=": "833801000000", - "3a_LGXiWuU1lT4nSTe0nl_YLjHUx3byTayVSbQ6WN5w=": "832188000000", - "3aldA117o_58oT4hMR3qR-XISRbqimaLFpkjlTJg5n8=": "2079648000000", - "3bF5OEqPi4j9t28dXV6k984pHLqM4036ZBxUZpE2HjQ=": "406308000000", - "3bKiWVoPS-rERTJMbrQcwB_7NTN6kg1VJZGdFOgRXrM=": "1092612000000", - "3bYn6FhKZNmhyxalu7o_z8fKPzHCpBB_kBlLoAIhhYc=": "467430000000", - "3bz5amXJx3GG4nJIo7zRVPwE8p7kI7WOD7qmTFT-qpc=": "417100000000", - "3cPvLve2mDMCfTC_3f-5VI5Ob1H5nf6ZhziTN6LtiV0=": "667307000000", - "3cYInVFdzx8lN_sobCGZien6gFrBwcaFufThANFqRaI=": "382394000000", - "3ciHZgNLwnv7uxoidpzrplyooWHnlvXAjsZb6z_Ix8M=": "490580000000", - "3d3qUUp0s-K5X1U_p5s7K11dO-d-FKIRZPyO4RZdbP8=": "2535436000000", - "3dBKO97oY_Q2ahyRtPwaxUx5CvQG8rmkMawcwJu5Kbk=": "407808000000", - "3dRakwa7as29dk_uiDA9Jvknw1SPy66DrTeamS5qSxo=": "501334000000", - "3dUKdcKcR2GbxdeRLbIfKt2C0PYV9RC0s9-K3_pRjlA=": "385211000000", - "3dV2nlywUlOzdqDyYHyoksmU-27opn6aNgCDO-Vz31c=": "385409000000", - "3dbBC2gyp528rkZVLTIZSbRqMCPxP3Mymm7zev9MxbY=": "378310000000", - "3dbSZ3a3OfYhQLOL9x3Z95-OnWDxwIYf3kwnPG-pgbI=": "384615000000", - "3de8ZWLnRfc64SVKQk9Ozt6AMKhacguEO3D6Qvu8MEw=": "769230000000", - "3dfcjB8SlH51XSp4lbicH6M8CXMckUA0uZ5X8788u0k=": "642211000000", - "3dvNHDMUnppFx6Xg4iiXAxOJjZcrlOoLYNXnPS0Tzzs=": "337729000000", - "3f-YJI1fCr0WtUBIjQbhOu8xNip2zykECm-8F7xiPZc=": "382394000000", - "3fHTSK_Q8kZxucGBNZ2i5s2-SPe9u9-0qPer2b8Oxow=": "831279000000", - "3fZlVun8POMdOrYdpeXM6KzFrJqlJvo1FCj5N-BbqqA=": "1407437000000", - "3feNisDDA4bJBk3R0xyOo4er7KpQpRRiB1czyS3fGUQ=": "892303000000", - "3fnQBLOJDgbklLXUH9JxyIiIs_hZguVVw8j7u-NiFwA=": "384615000000", - "3ftQJ7uLCT4b-zo-28Ezj0ePpMeES0aHdJCPxUVnFJU=": "825729000000", - "3gJcUJW4ijPdTwmmicY6bk34qpHmf5y6_wMyA5iHjQo=": "7018037000000", - "3gN0SiYN7MhkxJmtIRFDyNlSxj2MtnrCOB46Zikh5i0=": "384615000000", - "3gWhs8a44njYm75UbW9xX1y7lTCkDWcKvxhN83eIF-Y=": "381805000000", - "3gpw_bXV824F23La6K5FIQRNcRXqbINTCBaC3gENvXc=": "377818000000", - "3gve4sk90vNC2oAowFgYwqSPzXeP3CIpJHO1mjJzW7Q=": "457058000000", - "3hNE5hHNJy7FHvUSrXRxzQazqpjQypbjdiASBgNQgFQ=": "499999000000", - "3hWWp9nHpjmrMHXxxz7rUAjALO-X7kPL8qhlHWXvBOA=": "382479000000", - "3i3NNuRl8vT-huxbtiBpBRAUKf0rkboaTP8V3RPmoqE=": "884603000000", - "3iZ0DCRPuuzjithkigpY75vssN06KfZjFDojwAqa7So=": "6538461000000", - "3iqBpu-AKnnxu5Ge0W1dds0fXaKmnTVU12hTm4luLUE=": "41666666000000", - "3iroGObmOl-VNmQa8U60tz2bPRWNODKmojH-TGtXkQU=": "1001199000000", - "3jQt7yUUWJoTzZX4-MEyqj58HB-udj6Fex7JBzu5ask=": "397332000000", - "3k3VNlsCU7XBY2nkCemL-TiORZMqIxG_lBgdU8aoVps=": "384859000000", - "3k5-Wiac-K1PeErghfN1jq-FjUAY6aQZyR6BKT2YEBU=": "413004000000", - "3k6s7iy4wvEJkXu3QEd-98UUUHUjHc1S72aAi41siJ8=": "565274000000", - "3k7t6NI2ytHYw0vCNgdJ33rcytuuc26sGuJD9sslO7I=": "417532000000", - "3kEYE7OOpeTzIecTappjvscnt7oX9ZovAxUlE9lwdgc=": "385400000000", - "3kbQkOY5adB0UdiH59JBeSSaN2ywA7xtMgQejgxqMY8=": "1153846000000", - "3kcV_mO6lY9WQ3OWNRufM9_Fs9SYQ9oLEFv9AQAhAfQ=": "385211000000", - "3kgmjUt9VsDpfPKFBknYKmmYgJLTnQxiM4jX1wRSvkc=": "491141000000", - "3khindHMak8ZSce0ndy4mqkqBWgGzD_XoWvMvAY-vQo=": "1923076000000", - "3komdGVlztEM436og_84nde0qBtLKrGDOCM0GV3juUo=": "384615000000", - "3kutrrYMkaz5o1iAaAO7Mp16dC806dQ02iT2Q576yeQ=": "455433000000", - "3lNsamJvg-qqt9za4ub2Nguww9lIJ4B9gii-flHG8AQ=": "1588569000000", - "3lbBGwc4Ay5-4JnNxI05A7zok6lXFw34vYcBJwBLT_c=": "460854000000", - "3lquaglzViBpUj3YKUUzR5fppruTygB3rfWhYKR3DBg=": "417630000000", - "3m2FD6c_HVRnBSpv8gMIwysgSwiEELh994hzTGh0tzc=": "384615000000", - "3m4hAsD2W02O0f32y4q-g4nx41cEuFdIl1HwZVRAMV4=": "384615000000", - "3mYnt5c_fFwf5awfuOgoRi9efIpYtWKhqq-Z3Oeytbo=": "3851914000000", - "3n33P65axc1Kxh0Lp-9ZFDwEBbchFyOuhdsSn3Mu1IU=": "1507392000000", - "3nNOmPNcuw0V2jxV4gUYZ7d93zcltc1TQVLpL0Zx4T0=": "1999999000000", - "3nVmCHXDK6lSAiSJLplPspJW3ahYWvTDl6WAR6AFb98=": "382899000000", - "3nxovtcfd3qlDZ79leNR8ywlHbel4MTj8FZcn75mLwY=": "381805000000", - "3oLrHtVVq4ULDUwBClm8TsxKKAM-b0xURYAk5o3pRHE=": "2073271000000", - "3oQ6QvwrM6smnlHkg3py94LxoKYqT6G7DWHxK5KmaNs=": "765153000000", - "3oe_Vg7yoUC8X8X6O5sX7YJQPEmsIxxLOzWBDaDkFIY=": "378404000000", - "3pYmDnmXSgx8VNpyq0eX7B5khHo2woKfHzwMbhZIjrw=": "1378448000000", - "3pjxHyy4T2OpIaTLUXXVuGky-xCxDI2qgIoMLtY2P1M=": "769230000000", - "3poVHaz8_rA0HjO57oT1GfFWs0FZY8m-_dAl6XSoTVY=": "769230000000", - "3proATcv-bVa5dnLuqaOrVCQCTInUcadZNEv4k5hjjE=": "1146117000000", - "3q8BiwNrRK3ihT5yP32pCNOLJ1i4QNZUAayhIsk-ZXs=": "501408000000", - "3qPDV75aS8SsS5_Z8UQHSXnwkBVOVjzTAMxFXTW4F58=": "382394000000", - "3qa3wc6pwiCJjZ693HE7S0OU0RvuDhMLqJWzwrripIM=": "8720702000000", - "3qdkXz4qUL3NT5IbcIESduc3_S3Lsk4T8A9mzYCeofY=": "459271000000", - "3qft18lyMiNL-TrSVxzBU3NcTz2QLbbkbBrrldM6rYk=": "866201000000", - "3rbKyryg6P8iBQocUGkNNK3vkNx6FtC74iJ5t_BV9yA=": "383965000000", - "3s2pulmXF3VxSTY6cYNHlPxBHbdl7f0IW1fg5pb2GZI=": "384615000000", - "3s7kJmrbD9gKU4N9aFLjiU0O-WUSrBPKZdEbdf3KiiA=": "1590909000000", - "3t6Krg-YkiYMuCJvEzdrIpN3eFWAlz2_a3xlITkCnlA=": "1600025000000", - "3tIQtSzS6HLOVdr7e56n8yNUEVMw-tIxNh6lKMNJMQ8=": "384615000000", - "3tMEwbkCQ1NMftUYggcnNTw786zFzH1GDbSIQSjOJVM=": "411085000000", - "3u-jFHirzu4JEWS1QiMW-K5w6t7G_rynJ2QQ_TJcHMU=": "846741000000", - "3u4cGgckiyDj3WSKx0cnE21NTjLOkybTCvCDD9JF7j4=": "455600000000", - "3uDGPZRRX5a-G7U-mnlAb3euC-KRCviPOkVm7FaB5dQ=": "640707000000", - "3uUC7bC18slOHyDyCD2i7X7VeJAxEjAmiYBP78fFMpE=": "826147000000", - "3uduUwnrW_LCs_lVrJ2LxDGFE_Fq32AoTh-1-_hFlbk=": "9102783000000", - "3ui5oH4LbzVH-3sZ-wohgz7ivV25TbTkUg14hfTmYtM=": "1365055000000", - "3ukQ1I2OlzIcLEFcaRb-fpr42CWvE4-HLN8DI5iEsPY=": "460784000000", - "3ul5-6TbAkoKfPpmDtizshaZswv7TMg2zsCienGdgdU=": "423370000000", - "3vSsobS9cANM09zufd86bHyw_PIQk1pqrL760RDzax8=": "1265548000000", - "3vYs0WSyhLQ6ZhWr2rXu260vxZT_l-tc5pIMEL-GHfo=": "385044000000", - "3vg3WaqRCi5OKFeVLH9pnHpPQCOnj-LVwrtfYrxwpaw=": "455059000000", - "3vub50Mu5hmBmX9TfCfWsXM9EW9SakgIv7Xt3dMRkkQ=": "384169000000", - "3vzDKXQKwM4z9Ps2pcjQ85h9bdN5r2-3NOocx8O7Fw4=": "384615000000", - "3wT0BOtisTwyqqd-vS07Mt4lx-f4fnbfbuhEniS5GbE=": "464704000000", - "3wTPt2Ypn_T6_GO5tUOXZr0lktQE-sjWzNLiC1SPfZU=": "462146000000", - "3yNldiM0YaghWHomfJ-PRfaV6mn3QE689q9-4zjA_Kg=": "930288000000", - "3yS8SPWk-rIYHxnHC4jDAfnriNn7n28lZD_wS3QEPus=": "912779000000", - "3yYUyRp2v3DsTHFsTvDGxTLJYBx21EkaeUw5rZJK1wk=": "385505000000", - "3yoc0UwkQZt7u53npFzTLi8cTNjrwOOyE7XXGbWMpEw=": "1155332000000", - "3z1y3drV9jKlPm6GOVwcn9EuJhfuiOYk3gHv58yYfts=": "384615000000", - "3zME1E51obBS_HmFLuCIn2q6F1urYkbxhLnk_-rvKqA=": "901165000000", - "3z_VE3hkBAmdfz3b2R7-tg1CodTL9ly0g_OAEUNsbRM=": "1003913000000", - "3zkZitmqeqUmhchM0sLvdZJ5M8YMxV-O4vxT78TFyLU=": "2556552000000", - "3zwvdgW3rDZH3GtuM--GW9Cwzm63hts1CdhdK3GoVeo=": "2499999000000", - "4-8H0MyWg7fVhhzIEoJvnRUWRVfRxi2rwS3SHtg3r3k=": "463042000000", - "4-chrXR7o2bUlUEBZfzwqav0R88TV6Cw739ywEpZf9I=": "10137101000000", - "4-teKLs7f8fcqNb-biiJy1F-Bj6sV1otCknoYtp3qpo=": "2293721000000", - "40X5ypcPpco9cz04q6Lf_aj4S0-GYGpUAqV6MevEFlg=": "6653846000000", - "40kmC8ldoPXicH6NYKi85bOCwSMni3KrCydwY7slGa8=": "381635000000", - "40ngmBJPsVCeh1UnTOIg2gpn2ikaEqurjnAnV49f0fU=": "393573000000", - "41GidyxKo3L1I0jdrpvoBcVNfgC9VlndaU4SkMt5ofw=": "459016000000", - "41N1ZV4gP2nK2mqVNU_acQvfnplQSdNpuPZWKfPOlXA=": "451339000000", - "41b8h6IkmflFo3f8BW-7Hrr42arpyDoBHGQQfDuNQJA=": "2283997000000", - "41mLBLeE3oZHhJZbrVW3BLa6a9VvNeVmfur_oH8S3xI=": "1153846000000", - "41vMuZaFFohvw272pDzFL1QkhvTTJbUuTKWIo_EQpPQ=": "462823000000", - "426GjgcvJagQJmFQ7a6se_xO5Fk-zAjAfMZw5QvwuI8=": "541666000000", - "42cNIw9LgyW2g4NTh5Tv61yA1dLafusmgTWC5LKvvjo=": "1947153000000", - "42fSVWZIEhAUeKFDUeFYuxC_XpiOO9mrdI2NGnPf2NY=": "1272135000000", - "43EEHlXvw5-fP9Ghk89xAtcG8xitrU9oKyudEvARlg8=": "380150000000", - "43Kxj6Ww0e5gJKT-O1E7DNi5yOfw6x2wNzf8hHflTm4=": "2053662000000", - "43ZZwuYJNVYyk0ZzLU9LBUzz9mr6puVPyoaStYGWSZo=": "452328000000", - "43hg2q40LxjSHhyz3MOy-jF9bi7FA-Gh1_EfxcZIKbw=": "1409754000000", - "43udv3Dau3F5hwDVUdlxh757_tmR1YTxUUupF2IcB54=": "453403000000", - "44Y5f8rSe-BosYZnnwVZqYjz9rxjw_FxOAcP80aYfTc=": "419856000000", - "44iTxEkk1Mx467MniMos9PN8UD3R4JyLe-LQ041cFWY=": "468609000000", - "44s6nva-N1dtomXQdJlOXRuaxBOttrlL7mlsTZcRe64=": "1666666000000", - "457LIsJbM9UUf7WS7zRfhg0FSK6Lj9Jm1HMv77b_5z4=": "1134931000000", - "45RjzAE03fMnFc9TWw4FHGi_ea7HivgWGGcUvSwCNM0=": "2344092000000", - "45V0YHyr-Swk24GgZdSLf6BrIzxNVuPqf2d9Aui0_XU=": "1361092000000", - "45tMidcAW_dl8GnPbKOoBHIHHxyMzPPWrkYO6u_q6Tg=": "385510000000", - "46JDjprAqyBFRF9dff1zNuPaw4GwaTrZkpcL4-MR-0s=": "7692307000000", - "46g6pcQOIHBkk0hbkUUM15jHM5JI0DrLUdsGQuX6TGs=": "1351520000000", - "46nuzWhFm-rdd4OouomMsgRdsnbZ4MWbDgPhtYf-zvQ=": "1153846000000", - "47ERxkkfQ4ML-MrVP5P1OWw-TQU3yqCDp6386eZGsXY=": "2310726000000", - "47zBO6GXgSld-rFczPkQzm4lYb-gWh1yIA5epoPLoyI=": "423370000000", - "48FK6HDZzRpWQfZfn1FQw-cgfQve-sjPqXT961OudqU=": "468903000000", - "48VnIead6saV41ESwfHS5nNrmFFvjoUiq9Crsw3eGu0=": "769230000000", - "48iZvnfvtxibZkfYTle2Tvtl2kJanFDvL5GyqIkGNvw=": "411085000000", - "498C3whB62vtCSG0jeZOgoxRMeDlw1_IP18DnR9kEEc=": "455600000000", - "49hK2XhN5KOvOh9-8gX9EJrn6Y3DaUc0onG-rRxQagE=": "660840000000", - "4AKRLbeFx2-iPdAGCwbmWD8gQiixaRkJDBkauar6hb0=": "385506000000", - "4AKTBT-8NtxgNJN5lrrm7T8PdxLDXkrLBQxyr4VhiRI=": "845123000000", - "4ATVBcmmKOCUk_L2AGvXKZr7MP0lgteKpC4yo_6To5Y=": "492802000000", - "4Ar-7s1LlIhxOjhSmo4a-uW_2g1dCSX6ptWM4iqn_YE=": "836307000000", - "4Ay5iJThjubdiXEInWqEy6_SqxwDTv9veZER2Vhth18=": "833321000000", - "4B1C-Zp4nj_G_hcVMrcmTRwPWYxd6NZTjGcJou1MH_s=": "3657595000000", - "4BAPjxdjzCs9yamXSMFRVDOcHcRxEV-tuqEXh8sYJig=": "384615000000", - "4BIRthuEfetaFW_7Hrm74I2HshUeZwWOK3-y7n9sGZQ=": "1999999000000", - "4BIVA9WxUH7_X89VXu7SamH4HgLuxTsWzNIvnTyThVQ=": "769230000000", - "4C0LmLaDb0ROo3o8XGx9zy2M9YSb81VCAASSqcCtTxg=": "415672000000", - "4C3u7pbIzBGr5eZmH3Llo-bIdWrOhRBIQYjTLGnD5PE=": "926273000000", - "4DeCHlI5jZiSukXGXXxH5zhY3YEai1kMEc9Y0MUTirg=": "2088168000000", - "4E04iLnxogaGV0Ec_TmCoD7WvXvNNJwuYSREscg2TBo=": "576923000000", - "4EG-Q6Wd24rKOGoINiTylfx63qUYTljPEssDed6JKp4=": "3855927000000", - "4F9n50cZt7JaBbMDNSsYnmaRyOf-z3nUOryevulTpDQ=": "826077000000", - "4FQyuUBGL-SN-iKog88vdLXwbAS-o8CS6VFWCxyP9ZA=": "4082823000000", - "4FZ_rs7J2qJ8fCrf-zkrmxKufmP2ZH1v-VMA2oO_vY0=": "407469000000", - "4GOJlRJWY4vxGIKXZkywqoUWZQvGO81w8xkaJx07Dmg=": "458618000000", - "4GRKowDRK-IKOOnpZvfWDddLkSUw1wg9U3DDDLhjR9s=": "909040000000", - "4GUgCZBmwvpJP-cGblVX07AX7EkfYIAmgiEWYeyCnk0=": "384615000000", - "4Ga_8GGSQzUfUJJ9a7CsIERorH3U6YJFGPXoisrD4Ug=": "3846153000000", - "4HDNSrvSuVZqhirioeK9MBMj7O2GJGZ5qjaYU5p-lsM=": "390482000000", - "4HRM6xriI9i5JQrWG6QLfbXiE0Inya6hYvC-l4myzm8=": "3855075000000", - "4HWqDpB3XLeiXtO0cZaCRKxz8zh8TC1bmTDg3DO16Vg=": "3500551000000", - "4Hd0uHAso1KTsXLzmzM_f1tNouxLgN3vB_RgfmcdMsw=": "2499999000000", - "4HdMU60rgXNqwY3rcIXFWQ4wybyapjTatVMiGprHja8=": "454468000000", - "4HqlFcDemiusLhWj7IGfykq4B1xz_ED9YoRyZyH03iY=": "385506000000", - "4HruFDPrVlQJSbFGLa8yyLPF2GwYd7r5fW1ZAugFOPY=": "416797000000", - "4IIe9ARv7Ozhpl11xF_GUh99ErofTpdAQJDcs1mKcyg=": "412701000000", - "4IMRn0vothqYDxxBJG8zol7E2SmB-N746K7NTHRouDk=": "384615000000", - "4IPYTiA5hAGZbkJGrOjZkVvbO3OaPfba2JlsqbUW8FU=": "1999970000000", - "4IYRwWLEMzCFViZPlJ4EtN7ey1VU5pCg081txlKhnH0=": "384759000000", - "4IhQFWGAKSWLhixxJoTH-mRjRNVr_aAn6lPFY5G_HFg=": "382195000000", - "4JGLPJGoOZL6kNCwSAn_prVJhphIfRKnczo6CPvhXpE=": "464838000000", - "4JopTioHhl8m2Kj3604pi-8oao7EuApcb8Qq6FCb5ik=": "452326000000", - "4K5JOg9oUO71utOqLFkbtQ4Qaa8SbqrjI0IxaGHKvws=": "461020000000", - "4KAhbCBPCDZqIFmTBEBBSiIkwM-yf-Usxqx5YOm6DOk=": "384615000000", - "4KB01ke7TFV876LSdfkBm74QYPtjYTybhWvfQePdVcc=": "1068628000000", - "4KNuAdcHveN8oA0limhX2mgDvhNlm3Jv5czM0HIdgPM=": "2083333000000", - "4KcxG29Yk-VYXpGKfeMM3En3_qOvioGivw14-LCVoMc=": "1156520000000", - "4L0Cc-pk6mDkx_6zqHHmOpqhLM1tyZX3egVvBDzNKVg=": "416672000000", - "4LTBjyTymsMbh7CNQuo2m5WoLhqdcpZyZ76_Ah5DqzQ=": "417637000000", - "4LcQJXbJEIEk7Y3sYCPt1IwTl3Z2YLtCqKu5OKeXz-E=": "416670000000", - "4MKeXnYwMKrsMGAPi-NJv27tk7sHRNhYv5rPCi_1NGg=": "1593881000000", - "4MfOkGbCIUgGl13xL0Am4TJaTjjJcAF4iwK-t9eSWD0=": "879999000000", - "4NEZEhAFocDARYZ1a4Ba2gQebzGG7hZymMowFH0ZZR4=": "833908000000", - "4NYfbRGLURNNW4cLRlBIgrOCWhDdf4FaiRntz-08vSg=": "378999000000", - "4NglYpFar5kPW_RC-XQqOuu63OSJMV-b3UfIuyYcw5U=": "1537788000000", - "4O4Tu9gAerrFWlZe4wMGN8hNmtU_I4wBmMYG5gkxAxA=": "941460000000", - "4OQPXOIt0ddcV2CaqbIf3nkY_XZnTGXUwngXkSVbOB0=": "5417900000000", - "4OgrS91vzj7ewwA3iOULpDR3WGN1pNErkyVdCnowj3Y=": "464104000000", - "4P-J9NCyfymQ6qMmn4VvO69fUw_MXJAaeb5whoE0QbM=": "416666000000", - "4P_zDMOsAS7F0NfbPyxo2SX1_T7vDKEx-PZBe2Nezv8=": "8375268000000", - "4QT-tdgJeZ4D6aRzGyrZjmKIubyxeNvDaEKiiB9_Wys=": "381454000000", - "4QwTg5z8s6ONn8e1ucNGkI63Fi6kjDN4_u6KQPg5L2Q=": "379344000000", - "4R_zgf6SG_gCHv6UTBry9zoWUGxwlbocn95Kd-bT_mY=": "384615000000", - "4SBPZtTRguovaDgBl2XP8cvUcEIDiYOVHaHXqah3oDQ=": "386596000000", - "4SCa2I3kN3KszyEdzFOk-kCm6oPMHvuIcEygPTXScsY=": "501271000000", - "4SvdEDxVCqz7YJTgH-6DANJRYXQ-9OXtMgBn2g__wGY=": "386088000000", - "4TQ6WXBo24RROOMwYKaxzdIYahfkD5eTcjsFsa_4wkU=": "468146000000", - "4ThVmvnnnvCWmw9UsBejtNg0JCdjBpXEtm4zL8pjACk=": "453157000000", - "4U26Gf26hoBP-3aVi84uRz5BoIR3q5YIsmR4i42AEP8=": "388261000000", - "4UKe5WkR8hMxbuTMsNmjbvZYF1b0UWhq6URn-Ktb8FM=": "1015511000000", - "4UMltCrpgGD9tMcH9WhqEJQ1jP1tJaTAeVmc2TqG0bY=": "4166666000000", - "4UeZ3BdWQVku71V62uw4RVH5eoY4VdMXrZ3N2u8AdpE=": "381436000000", - "4Uivfv4T_ObZkdmkkWhBMl9UIKPKXObSP_OctNuO9WI=": "454545000000", - "4VAF8MtTkTRkZhP-B8kf-eoSTXjGI9H3Zx7hFTCWm-I=": "804119000000", - "4VD5NqPM1Kj3HtgM7QRM_cVOhHq_q3DQTUqQKwgisBw=": "3636363000000", - "4VyvK9sN-llmorFf0hKKScJeYEX3zrNuhyA6igIWCSk=": "541592000000", - "4W3-MFRju1YUeIB1-N2KCND-5wsu6hj-ATssEc00Svw=": "450612000000", - "4W4KfSXKT8FXPR0wC7KRBO_lgRWkLUTx5mf_m-uLfQ0=": "2061090000000", - "4WS9t65CQkRjD8BWGP1_Z45BoeTpzta9bhrYn1PHD4c=": "407808000000", - "4Waj8yx2qQkioJHxwm5UjjahtYX4CZVxKMn0Fj6yXZA=": "463273000000", - "4WlgDsgtxLzJJJZ8TPfxXdUgNKUg9mNJz-dK7DB3EN4=": "381836000000", - "4WxGtFHvuzY0zEOzXmC4RJTROltSBMF52d23u4YztkI=": "769230000000", - "4X4Zs9YR0y_kQWvB7j_kLBu4vvOKklc6HdwkE1X2cXE=": "2063006000000", - "4XCpQWEHYpxacUa4lcSSDQn-PWavJlaVewZaePCDw2w=": "2499999000000", - "4XWLoQwBa_yBb-9SNEOFk_N92Q5qBbzPTXI1xhdP0-E=": "384615000000", - "4YSrikL4YJWN6hiMWJBIqaGcDc6LYup_DU8OKQ2wZZk=": "415341000000", - "4YmP6_MeqdWvBlA6vhVlmLZvOZj7bskpc89WD_eQbfM=": "909090000000", - "4ZCuwcOyLG6mWVGmJ0Lm-BfLH9OGnazG0a2R7aasHMQ=": "12727272000000", - "4ZXMfi2_iuGfQtomvPkEubaoieV-1zMao-geKXhqsC4=": "473874000000", - "4ZvrKONFTxytAWRAq_8GqV1EiT_QsX1Xr5LpZ1ly2GI=": "469945000000", - "4_9E_Do4aDC0mcru0h2yKEgHuk-sgLeEDXtVzNHkFyc=": "417450000000", - "4_c2bGDtHHNFk75aRnixcCu4tD-7DebxZkGz1LjIuvY=": "769230000000", - "4_epv4BqO2YWW8V7vImBRN5Ktrz1b_v8zkmqY4CfBXk=": "496344000000", - "4_t2TrsmzNj_1u0M-Uh8w4ZEIx-0fQqwfhF9CF45sAc=": "355007000000", - "4_u_pQXkehj4bJ9BdtEUD3WYL6ZFAHuQKOKAEXx_UdQ=": "1250021000000", - "4a3TctM6_0eiM448bZVU0BxC0aTvgHqu1nH43utdyfo=": "1003412000000", - "4a6G38PBIQ5ULyUNFBSM6RBtxpKLhj5ujGCiHHfnRQY=": "379344000000", - "4a7enQuj1Orfa_oqc-uu05VxRtdoH4ZiY-9RfcHJs_s=": "3946285000000", - "4aHS61rd_X_fcw9CJc2Zfw4VWj7Hu5HFFA6RhBSKM3M=": "5039945000000", - "4aJuUYiVJetM4XZQlw6lZ0ITT6aGEp-Sl04qIV0QzcY=": "458120000000", - "4aaZ9IB8cWWUBcXNF_yDJG8-PqgpWe59zIKMSUUd03Q=": "642211000000", - "4aqGsSre_Cl2CSFI7TTuYDuVlJjKMfe_oU80n9GG68A=": "3024046000000", - "4ayj6jgy3Ujo06cqB-CSVt17_EmOZpljRf1rvZrwyPM=": "385798000000", - "4b2At5HbHyM8xQUyA_yfwSg0-XEYAsG1rfQr7qT9dG4=": "384585000000", - "4bJBt-uWk4pTK0ey8HNKJBuGDZuh54KpGTMKVTNeM_o=": "464314000000", - "4bLQ5HL05yeNGp90iI5PuD7_R6IOr3JJffIyX1q3OIQ=": "471710000000", - "4bLSLoM9cQ1vxW2lwisDEn4DeWC87Xx7By99qsD8wH8=": "1916962000000", - "4bdzLxoLZvmKN8o5dLwpWUFZQzrw_1aS20Z3b5UBCvw=": "6115849000000", - "4bksW1Dr7Cz5MNbMXEYmgDB-OC-w1QhR7IpXOOyVXeA=": "781616000000", - "4c4Wsmky_VXGcQtuAsGlvKurTeVlz3QXPuPvi5O7aN0=": "383688000000", - "4cTyPbYRh5E9F-LJ2vMYZ8g-29RaDixeBSe95ykxXhs=": "1249999000000", - "4cXCiVC8boCAjDjsTGCz7GuSoRVGAacMr4PhEQx-Tns=": "450582000000", - "4d0PuMltJoqbAInl-vzIeFP3RV3euvskZYkycvWc_Hg=": "655097000000", - "4d8NJoDcIBMSm-qko51qiFoJ9KyR23w4oDZZ0w_-_oI=": "392247000000", - "4dv88aQgTSWAuOFuys4eaa_OECvYpZY2sxWyTSHACr8=": "405267000000", - "4e5CeprWlfJaN12JZSYlx6a14nb_yDyG1T0Va_8ERvI=": "11363636000000", - "4eel0dj1Lwbz1_98PCiVLomTH7mBL0nOscgFwucCSac=": "3108807000000", - "4ehKdBLgerB06f3r548qBYcuEPI1i3ZQY86S6t2ddnA=": "5040417000000", - "4ekROonGgkU31UsLvTWzdA24pAzkMfTi2JV3OSVEKXc=": "394620000000", - "4fw4cV1uHwaO9j2olbW69X9rUIqdtalF0wEpvJClBpE=": "413004000000", - "4gNvfDsGWz5RjWLhUa6HI0vpC_kYTzoAN5bxvb1Ci2c=": "385510000000", - "4gOUN9PsFVC6K31ZflswfHFkhu18wlc4NZPs-WxF7tg=": "384615000000", - "4gbAeyMVRKPl5b2vsi3_lB68RsPmOobmOs8RilEMUhI=": "769230000000", - "4ghetlMa0XtUQOwnDbxV_vTtDAfG_QkST2hMkQKjNwQ=": "411085000000", - "4hDyDszj1j9042iKobftKd6uk2u4T5S42-mDc3MvThA=": "899480000000", - "4hkcoivQAc0uGZM5IoOV4Jggp2SKOu7FlLT2TQcIAAA=": "3846730000000", - "4hm9DM-oalOZ9fCa-ovK6V3X-4Fvcq2FLQIdJIn6FDM=": "384615000000", - "4iTiMNqF1hg3iQbh67oMUsNG7jK1AU_CYIA2awiNcV0=": "8039675000000", - "4iglUbndPzmm0PJKPbcRVl79uxXZFpqhdVslXMjjcLI=": "841282000000", - "4j1Trb943Q7Y5jGHgzSye6RaO4_EBD9JORdDh_w7kbE=": "460013000000", - "4jDSPEDMryhMOp5gvbjMtLLAAf3TS8BMYgF3ZICXoNQ=": "366940000000", - "4jDbgGSPwMKEgAH23iaJl-y4pkNiSFm5Sj-udBgd0s4=": "1943752000000", - "4jInTToc1pLkHl2DTKaX7qyE4Y4QHICKjb9rMX2sdAo=": "416673000000", - "4jNQKMiuLVDrRuyBsAetoXPJlycUl07HOhrT3CQfqrc=": "648010000000", - "4jaczUQ3yiYZJCoOlPwQGIEP1tRegtsde0sy-0ucRn8=": "384567000000", - "4js9otVc2YGGbQYFdHOFiF0vLziztNjAoh3zfFL3rjM=": "380509000000", - "4khz9eqp1vV8lUEkPOjIUhPp851Y6RQ0Vf8uW6OSoBE=": "416650000000", - "4knxVo3ERs8e9iAACiHwi70itACiSjAIfUGx6z6LmWg=": "462839000000", - "4kwI3d8iYuBNmkkgmTt3GrEsmgFh-ffDY_Yqu-pFL3o=": "384615000000", - "4kzSiY552Y7yRr_5-XfjJZLKsR_0mav_OruZOtXoZbI=": "3762263000000", - "4lKNNGKg_jZVPc_KtRWH3uSk2IbvX9pggmLrgGsNUYU=": "5044821000000", - "4lL_vTPs9LhWzY1s1x2ewQKnwKAJk1tiQjYM1pAasHs=": "387084000000", - "4lNawmbKEdaCDtwnk3h0SOk3m8IIOfPgzncAqqM2Q-E=": "463277000000", - "4lOAFJ-ixMBWZbtTxeQcyXtr1s3wubNrrqjHv1l3-5Y=": "386715000000", - "4lf3lbOMsIaXGx6Qc20yOiNS7a8OGSXRtUhFzK1ZLpk=": "1920889000000", - "4lv8rZ0naGaoRlntJheLhQPpm6YZnS8trA-YMFaEnq4=": "4998900000000", - "4mETZdjx3Zsn_K646uDLT6rttXFL8HnJKqQPj2Asilw=": "3333333000000", - "4meO9MHoSIxgrgbkv68aEfpefr13tzAdYe_DTJFXRVw=": "454545000000", - "4n0mzPq_TGmN32WKo6553KFrZrrY8xY5a7y9-4Sn7KE=": "2647889000000", - "4n1WhSUH9uINViwgDIYB1W-1Ah7YMnnFC_6-vo83MyQ=": "1353661000000", - "4n4J8Zedo43u9dC-Hiozxz5UkhYXg6qQm8VPzoyY924=": "512979000000", - "4n9OUuSDH5V_PsVJMvK6spjMoH4vtiV4srO4svuh3kQ=": "1499486000000", - "4nH6BBliB-YAoAlAD11djgzrEUA2koRnzUauVeAFAa0=": "408142000000", - "4nMYvqj_P7v1Vms5Vl2m67bY-m6NaPHQ645d9_K2_Ow=": "444579000000", - "4nYMQo6IZ99xssX0HVmrLPCgedf4CFsv6QxU3RTrDCA=": "499999000000", - "4nyGW5WdQtYv0_uZT0KTPAwG75rvTdFKo5aewntysUc=": "385505000000", - "4oKa3BWJXtFIM_1C3E9SH62xv76MNmg7QwWmVls49bM=": "380912000000", - "4oNusLzTYPAa6p_P9GCxu2X2LIz8D4q-Hpg6i1t07Qg=": "566268000000", - "4oy5OUu3j9fRRdIQX-BthU45wEL9-OXcctY7W1qIEp0=": "3846153000000", - "4pHAE-ceReS7Ni0h_rT8vnugOxTFG0VM75WCNvuaoZs=": "654014000000", - "4pLBbd48kN37dUcGMIbkwLozuCCCJkbsID_CXnZlLc4=": "4240295000000", - "4pQGogyWPArGmM6AUXk0C1RG4LIjv0arzmsrj7Yar24=": "4156299000000", - "4pX7aRKWnFhZK3-OER_2amGzm2lPGTypDsYShTdxpr4=": "2055429000000", - "4pXKL6KhjfLK3IVjnzKO9rB_7VYm36Hz0pOVMkn-_Y8=": "462839000000", - "4piUHkh78BmBwHvP2bhg-39WDURR0SUQJbETFb2bd9Q=": "465068000000", - "4q2v1Wo1gt6b6HpDAF84UU9tcpbAqUhS3oq4M9uiwE0=": "384615000000", - "4qKmaQAIPGtPDOo-vS1ocVeDpZuI8kbMzywEc4qu9RU=": "422586000000", - "4qLWtD1apAnT6rh5M6De12b5OmiKWaGyhyBXFHHJ314=": "385506000000", - "4rB1pBxExusxtBLrnBPmINfnW6R4FSTigSFDeEpgwWk=": "3652531000000", - "4rQHdJUWm64w_2fYQBaffyDArjgfe6aiGtS7VkV5yhc=": "578358000000", - "4rfxg21yhoTvjN-Zq0aUjnoXS_dziIKwM5jrHNhzGpM=": "384615000000", - "4sGKCA2-7-MXkky0JNnlBdZBYnwtSDTfGG88D8hfstI=": "462193000000", - "4sO0Vmbo-crfe4XrIOkhjkhww7BObAf9Ox1R4_sgXVU=": "442970000000", - "4sgVoy_KAeTJea11vhKcML9A26Yh7d-PHPy4klLgavc=": "448906000000", - "4sjKVvV8eu9SivXQiCE3BqId9pXmp73T_ZHuquEJlyw=": "378557000000", - "4sn7VUki6dtslP6Z3YaZNXM-vuDDozK0TUzP4w54CkM=": "385023000000", - "4soXIfIU-3cidRAol_zXuIF0PB-uuOwnZaUxEAyXjn0=": "842308000000", - "4tKfU18mpgPqH9FjtAom_E-NS3K1WtKxPOKPs4Vq1KA=": "756034000000", - "4tRgehYX9v5zsy_xn5ddCPAoLYLUXFRmZgcoKx25LXE=": "1269230000000", - "4tXmgfDu5kzkGlk_mlhcm7X3eqsbe28W7bni2nogpHM=": "447062000000", - "4takVv_PBR5xTQBfEHazt9ed67CpJ2wcxQ4xmSQy8F0=": "3279075000000", - "4tvdMuw1FXpaLyZeIz0gDzO0Y9KZpnvGTfXC-6Y0Tw0=": "453003000000", - "4tw6-vDx_CN-zyjTX0UIrOw04V2-6OfPTniG2Kb-e5c=": "2185607000000", - "4tzfVDfzQ4AdLJC4SFn2IWWWRab0AViUWGpRmgbw03Y=": "462687000000", - "4uF6Rmiiv-I0Ls7OUuDe2IyisBhIcjKA5EyhHl-_jec=": "384615000000", - "4ubGdC9PeY79ZJXmTQlg4SX7ccc428f5USLKzgEM_x0=": "460532000000", - "4uwVfySmyeyTJ8Xclkd5O_UUxPXu2Xp70G3kRPqEQoc=": "953546000000", - "4v9QHkHs62OW0DEWKhEkrLCIKbc7V8GtvxWUyv8XaGI=": "386370000000", - "4w2o50P1rx-fBeSMCDDLe9yFToi5QA3VjDIeNG7ZwXo=": "1863636000000", - "4wFsVOYuCanccPR-rl5iXRRyKLQGRDz0TCxqgWo1grc=": "2113961000000", - "4wXOyaZcihdQwbEaBmL294fMThHbxXzrF_Nt9XzxUmk=": "963931000000", - "4wqmBOOX3TKgzwEcH1XffURahcIvmeFiTa4ts2RIOpM=": "3213303000000", - "4wv8x3HgWn-9lgW-UAOH6cCaJ6ucdQEkq3S3wfASw4w=": "4166666000000", - "4x4eyA0yBTHGLUz6niTCrY6hrHOoCsiipKqeZy-XQ3A=": "384615000000", - "4x9u-RBFqrVfqCP07KCbA2EdjLaCg6Jr3kv35lgvrAc=": "499999000000", - "4xA29YoO934zxCD12lUOrpSxMhT-dxF6JpW8VyNf0Ys=": "759857000000", - "4xZoNqxGtKlSGeu0uYyWkpAoWvAFKT5MPVuvsQIbkJw=": "576923000000", - "4xgeycg1QaP7pS-DRsWEaQP6cUtUNRV3vJwv3Ij7i5I=": "413603000000", - "4xn8FV3q9n3W24FZdjy7T8OOWfaYuyQaN4sAQHKo8jE=": "5860686000000", - "4y-mBjZ0KyHF2eR1vB4qj5ycBKMrWGTslLlqNo6A7pA=": "406044000000", - "4y1WOw-k4Q3p3rT_vSMv2R6AqqwQKyRMdzLOTJUlYsI=": "490856000000", - "4y3uDEIq_8oVg7nbwjq87ZH5dTIFZONQS2NZFIkkPmI=": "3231890000000", - "4y9yblEy9XuouRdjlGIS_AlAnMyrpXcw7wiaXEb52tw=": "4701673000000", - "4yJJjRMUwIbO8ZXx2GGCMC6tQ187L9TMhMAhC55oQ2I=": "618000000000", - "4yVcr7h5idRUKIixTcT14rYvPwygceZV1iM2ltsMH4Q=": "831666000000", - "4z7rFOh64K3dwupuWFV8zC5M8GcKIehYrSHR7Z6dngo=": "639573000000", - "4zwCZxJc9WsbjsSerb6GN5STC6QZvjcoDIarGmWe9MM=": "420521000000", - "4zyVMVPYhDoC5mxLshdh-V3EIaHgaKV27JEl7DBm78g=": "1396385000000", - "5-2BeUK7X3uE3wUGL1O8d13r24gbrNRepraK58FkZ-Q=": "1483906000000", - "5-Q5zdX7-3PQ4B2qw8p-0zdCtEo1dkKOOGuK-4Ec3R0=": "416666000000", - "5-WJ_AzhmXhLlESbbYxhn2MGo8Md8x9HFytY2gwasro=": "527235000000", - "50N-8Ozs6eWdgs8Z89bVP-YB4rJVQCPdHH0nb7N5Xno=": "499672000000", - "50bvflUqQdjiyWrdYNnftKpp74A2yWAnl4nQsf_vuo4=": "379344000000", - "50fPUJOPUyT4utx8diphhI7bnwkQyvmOsUboGyIgXVY=": "468567000000", - "51jumusOTt68J0EVuHDuFUuPbm4_bif9itwUNNMwpQI=": "385506000000", - "51kKQM2T6oBbHqal2Ow3kAI9yOcuiyLFRq_1A5KiY80=": "15257498000000", - "51ntS2EDv_ePXLSTNqfajA4WfchlucU-iCekNl88woU=": "380509000000", - "51xx3mwSu70dOABXedB47L5WScN22kHPc94k3Ru9in0=": "11367159000000", - "52FGzOJ5Rm8kVvZHL9E8p7LshW6ykSuIJbqyHS7_w7U=": "470730000000", - "52Fa3NkSQ0S8Gubp3VZ8Dv7m0mwlipt8Ybcj1f4YOtA=": "933085000000", - "52KVsSU1I_zRhJ2fPWu0a_rGLOD-te31nPlL0utmVq8=": "2088147000000", - "52l2EED0ftRr87ZPFGfnHCpxeqrRGIys5bFbaU4uM6k=": "4221969000000", - "538h5uP9VM7ulHezpIdkPIJw-DFaGmKDE32HUvbTJxc=": "417634000000", - "53I7v0iaikgYpHKLhZMv9cDqRUZ-MxMbLQnTfJ6CQco=": "1657692000000", - "53PMp7Rid9vAKGL6WwzeTIOCGj8y1cSshUVPR1nyZGI=": "8333333000000", - "53VOWtzCe9MiGgg7_mfu82SK6qHxxrUDzhCD1jAYhAk=": "2237657000000", - "53p5ALGelRMc4EPUejvo4MMH3qtqX5xcUcitc4F61D4=": "1171212000000", - "53pI2zXmfiY4X-JfAny-XZB5Yb8ONM159hluPVfA10Q=": "1615384000000", - "53q7AzhVGGHin47XXJw4j1j0OFhPF7u0RXVcY90gB6E=": "468409000000", - "54B_2Cqwk5tq49hozb-jy5NYjhWuO3ZMps07fExjxSM=": "1153820000000", - "54IxtEI2gchrYb8y7-U1DWdNDtp3vkkUxz_dfB7ONaE=": "450738000000", - "54h3B2koBfE0_kGwUYa6QTbO8xd79qNRaflvVe9kHt0=": "846741000000", - "54m8zI-7eyiVWPQDr2DrpIjmSt3hE-kezMDIhiQju7M=": "833347000000", - "54n2MKjI36cFamWd-LQmepZjEvVeR_9Cqr5foajIV0E=": "470703000000", - "54oSa2AppxqDnA_uMOyC8_q4zQOXBZz2T57pmsAaTTs=": "456483000000", - "54y3xWiusNr6KBk4dE8gZAN9VoYtWpa50jCuREUzkk8=": "1648056000000", - "551j-jShz6cGtepiRd9ulXZr1_9KCCxvVBpgY_2F0a0=": "1880124000000", - "551ksyOxaF1GmGDEJq3xmkEEdxoPdYBKztZhZEe6TWY=": "1234575000000", - "55CLCzwgQ49erRWuib6QOxeL2dI7t5CQvIhA_8oOnjM=": "2083333000000", - "55MVPMBdzWF-8aL7ZOD-7jjOO2EQTRYxGxQhbQrN9d8=": "928743000000", - "55_PxIWzSYhXFUecILRfryH9zfFg3z5-PfA1kuDgE4I=": "1136390000000", - "55eMRwgG4Qhq0wtmmZ4OkmOlVpDnVVezhZjt_z2YpJk=": "836879000000", - "55fGgl5sFEuPXMHcdGSUO3krGXo5EnH5vL1qZQZSGLQ=": "459107000000", - "56G0MP-s1VKay-HRjD0VMzwEsCZiTLDRSmf0Y3JkPr0=": "416673000000", - "57QvaTjyQ2BjyWmwGe6ITOekh2cFJ76Ye0dtkyAXXUs=": "764788000000", - "58aEDTqVyh5kcMj318gFK1JATtzbpLMAZfNrnd2ntRE=": "4052144000000", - "58nWu1H6ouTrqgGdl7Pk3R8QTWCwbx2-ijolgSE2rpk=": "509391000000", - "592WQRlmH_9gDgBn7c5f6TQXk8a5S30GJhYU4HfNB48=": "454545000000", - "594Lb0y6UdGxWZP-ForVz6Hpetkd3XS0bRGhqSLmOPo=": "413620000000", - "59MPcX4EELb-RFkcRp8fWiPBkaoJ6D7WRVxLx2r9oo8=": "492927000000", - "59VAYHl4nSgqvEeXrQpR2jvt94zNM24fPycQEgS97Ug=": "908582000000", - "59wqzoQWG0Ve8q1x-6RgGrSBa-x3n3s2znY2kqkEtZs=": "385509000000", - "5ACMIWg255D5PvmEYu3D-T89rYX8Whkw01HTzS4Ndn8=": "388634000000", - "5AaLNUHcoilYHIQUhC5Yvcan5WNRzZT7NW8Dx1FzBm0=": "2513483000000", - "5Ae_O6RUSBcG5Fy0YqkqJkDSFrI3JJduvdZGmjBTx7k=": "416666000000", - "5AqKGnPLifbnz8h8IlycOQencZJw0oKKEnN5Bzy2Y-A=": "1808430000000", - "5BB1NSJVbh57M0SGc2Rilr4OcrZHSj6w1631FBlOr_k=": "744414000000", - "5BmLGj253-deMJt-HOg9EBNB1P8oCr_8Qin9AoO0gpQ=": "495436000000", - "5BvWWuUiLC8Fvava62X3DbGPGLQLgP-oxAdh5KMHnhM=": "380585000000", - "5CBzjUiiEs-JNFqvaajcxTjPsQrCy1begElCGJ1CMNg=": "3494482000000", - "5CiTgi9pcgO5o2GjI-gDtT147lX0rovBlMqxC0ZSOLc=": "602309000000", - "5CtQj2YBsYbw5ezo3Ljh2Pv9NXoP95anKP2jFKUsBqI=": "518304000000", - "5D-p-yvvIfbWBw_MlQ10VXr-5k0riJqRlK21S7i-y04=": "663946000000", - "5DJja49SmowFWM-Dt7k5KviUjjNkc2wNZGc8veX2Sf0=": "390193000000", - "5DTJzCUH190tUXSEvA0gl8FW68WqMDVDavO3SBaH7m4=": "1326970000000", - "5Df-pDmWnpAH7VKrZR_GBkxfPyCwtCUV261O-eu8qaE=": "1136363000000", - "5DogGB3EVd_UyV53qmcJuPiDN0OCWzlh9KpCFJ_QC8s=": "466844000000", - "5ER_szKotpvSYEDmEr0dTVHNPDeiAPSPCRTAVgI9O-0=": "376837000000", - "5F4DoZF2d9QrvaYkZUR_gKH9AxnJpSrcNMwxjJCBmgE=": "517171000000", - "5Fe-wTiE9RVok7rV8OTpupzyXOEeVcGLLtWgw41LOn8=": "5767700000000", - "5FjMn5WwAxVr3zqqYKktDc3151Tbaou-6-kRsuuJOLc=": "2055429000000", - "5FsYsnwwTuUWevZfjE0bTHFaJ-eTknkb3tYsZoc2X1s=": "418474000000", - "5Geez9XMSq4vEdPmTRXYtYHrFUIDsBu_qLCeuM4gDz0=": "384615000000", - "5HOpqVT2KafuNM6ZcebTyZZjCMZhha0ZKhTiUjj_Fe8=": "455270000000", - "5HnS2w2ko0riRG3dnXFEM51uBzO7BYGQoH-qe2gj6T8=": "407469000000", - "5IGYdM2gzyyKgnYl58FCC9iosF1phnfjgcXikDJw8To=": "11863447000000", - "5IWTFdMxqz6v2TNmLv_JApJ45EKsDvMPofohoBVn3bo=": "418859000000", - "5IdtoSuhLQHgZYVSp3ghxhQBVz_RlNMvAjOe5Xl8jmA=": "979224000000", - "5ImDU5jAHCnn5xvJSb0MtCElwil3VuzSIBBZbqevdQg=": "833333000000", - "5Ine-ciZtlNssovfFT2JEQhcV7fqLnOBfDDVCLYXZm4=": "1548301000000", - "5Irs9LkbnIGEX-RakkJxCwIvjETE_oG1Mpo1yVpWOMQ=": "1156520000000", - "5JB0d6Klm4sfgKJduxPUzuSyVVOl_GVTiCP7The0ATs=": "748549000000", - "5JMAWBlf_r2Zo9_3yVaX4P9zP0_st1ysRn7YP3K7ab0=": "386742000000", - "5JUVsoeSkQnDiGVNKM8eK8Vk8FK83Hzpm7edkd4QZwE=": "834684000000", - "5K2Yh_hYEHouIZdpDvuhBqotImqHguXhkn-ocW45rx0=": "6923076000000", - "5KAUvrwys0VkuknnH1sLdh7NI8uYpU-KxmIdkxMniUo=": "457497000000", - "5KRMlLUsse7hO1iyHYNLprSkiMIksrMMlhb1_9mwCGg=": "416666000000", - "5KVFfsGjk74SjreGpAgXXOBZTi796C95ztk52ytt1v8=": "1780965000000", - "5KjRPyGp2OxFyz00_oD5nNLGpm2Ik9jmj9aJHug47so=": "1157097000000", - "5Kmq8tXfK7QAWSJuov9w2Gh24nsztCPVXwI7T_jyPuY=": "503666000000", - "5MPerddZ6cknT-VG0uHKiGCi0Orh0Y7mWn-m88ajyus=": "4090348000000", - "5MhqHw_2zpn77o04YJe1OlsdPvn8mwH3n2llLC4wFeg=": "1661790000000", - "5MqFTtxp7ISRlxthIBYQWga4YJrXEpRNp8xQdr5tMmE=": "1945789000000", - "5N6tv5_qnwP7ZaGtp_jbDWycx7UUYFUkSYnjtlDc8kI=": "405229000000", - "5NLrdWTjdHqpTSpVlZIrP_njdH0w-D1VT3Z_0SPku0c=": "411085000000", - "5NlJXjj2UYOaU7_7OSsikRviR7TA_NaLAXOG3UsirG8=": "7670228000000", - "5OX-0T7SpOvp1Nzv9RAvcElf7WSsol2g2EFruPNZVms=": "458215000000", - "5OhXQpodXqN5D3FyeQWcocWdkExVvpHR5fyo0SCkJRU=": "486909000000", - "5Opr67zJWJMpbCDzsmiUJxo9VRn2cxWNhMNcBskfr-Y=": "892908000000", - "5OtmJy5Jwblqw1xK3eqPir6tzpe8vpU7zOJngUMPVKs=": "459695000000", - "5PaKA_4O2jqLl4BfkyJnj1b3lWQUUvwtjz81SAFGlCU=": "451707000000", - "5Pj8wX-_GdhatcaaNj0PP19PuMhxAIZ7ZGlhuUxSE_Q=": "398878000000", - "5QGHWmj_sKTOLEkYQ_Lz7pURsDfrxrNA7bL0mkdvHNA=": "1886724000000", - "5QGUFsK4VGCEGPJbPe--DlVqjkIIVhLDIUkVBjCEtpU=": "384615000000", - "5QXrkmBmjvdXgdYGTBo8pzWxICMr34jkNtqIWddBmUk=": "404418000000", - "5Q_Tc3buGLKhFjJAl_55yCVoGP0LkHgLv-92evEQXYk=": "769230000000", - "5Qe_zEKPpEeZuVAwwNU1z2ADWRs5aYoyUsoW0z1Dam4=": "415930000000", - "5QryhO83LroRGMjknqCrhEP8hQ0uqd-L36I_Qh2D2ls=": "405229000000", - "5Qt-g2VcN88LlOEZ4esLbNUfri1ly_bUw4RZ8S5GK4o=": "501826000000", - "5R8AGpGfQqv21JZ0ntIpZsEJFHT0EHfWtfjMCcWP_Ag=": "422561000000", - "5RcN2y4X7BRrLy9sXvD5vHbnKh41wgVw4HBPJFSu1oo=": "3664830000000", - "5RhMK_lOrqkXyvAfZbw2skqDzkI3Hkb6u7EoPFaV8jU=": "12540222000000", - "5S-JsES4kRcCo00V-2BLXUEceFbNinjbcCQXUdA16No=": "384615000000", - "5S0wLbaMY2DzwcVmk6e4p7MV0r-sJlcp35yedvcCflQ=": "475200000000", - "5SAvkh3k1aGVI9QBYj7aChzvNdZX_kl-U76Q5dHFRR8=": "415901000000", - "5SKDp-waEeIlNO2FArGk2luirSKKy4RXn1aS5XYLXUs=": "4999999000000", - "5SRZp2Ut466FYKAJ1OmGK-QebCoR_OilPY_ZPRvggZA=": "4166666000000", - "5SlC5Q2BBd1En9SBY9yACwhYcrqzBubpSs7JiAx6UQc=": "403537000000", - "5T7wYN4M4uV5BpTEJUBV6Mp4ubWF2Mp0hnBYgO8v2HQ=": "376990000000", - "5T8LPbMG5eglLVTj5gGh8wGTdpNDwUlKImOjb9AdNwM=": "1223425000000", - "5TDeCMPjaoAFm-nZseg17X6YM4hDD3IZhKYQcKfBe34=": "2648196000000", - "5TtvkWlAbuZ4y5ZAQfLAz6QjaHetrqlWBTqjb0V4220=": "1920375000000", - "5UGiyEop2-TshvuaUGONSBugZpBtFW34C0afLqbzKNg=": "1149445000000", - "5UIy3WrRstH09xHU5tCUh7eDf3FtWUdA0E3aPCQAHQY=": "573248000000", - "5UR-gBIAGB__RitssnI_DY0Z6dqQz-k5B7hnHNOFhhw=": "1999999000000", - "5UUIrtBe7N3wyaWvJ-gB3ZlA18A0z_XaaBiGtNp_tFM=": "1153846000000", - "5V48uh3uVWB5_mUeLzcLUR48_UoCjhW72f4zEVj7li8=": "547325000000", - "5VNhRdMbBUVRB5soursO5sth6geq7G92MQvzoZojHu8=": "1951675000000", - "5Vv7kRgaI_Yr5IQ35zbFaIYu552bO4ru_y3pHGl2L5Y=": "9072781000000", - "5VzxpyJKodyakbTgaXFpb_CQv0x3L9b6YLIuBAge5ts=": "447988000000", - "5W4Z6eHHSMx-6J50yHT67ez3Ag5meb-eLnpdt-1kSOA=": "421385000000", - "5Wcl_mj-R9Knu-Pkw6MuzSLUj4kS3jXNpxPTJnZNUx0=": "381822000000", - "5WdbCRm5SiOe7uupz4N2TwkYSud3zG87blZntE53pDQ=": "2076031000000", - "5X-PgyJzSnPpLrEGMMW1eLEM_Vvw1Jp_tHNzRGGhSps=": "1309889000000", - "5X0XKw53E1NAFs87QYYsKIM--rPu30MJy7bRnhAv0Fc=": "763607000000", - "5XfFNnWcvL7gkFwDIKTffCRBpGl-ZJgcGq2obhPnTl4=": "381225000000", - "5XotKg1piHnJ0Y0MCkL0HTOpWCcg3YxJ83RpiLzGdCQ=": "387555000000", - "5Y_hOQquVgujebGZ-y9ALDltpP8nf-gs1pZvL-8Rryw=": "423344000000", - "5YheUr0WLdG4P4vdc-Us7hYeUvcyQQo5nSXWXFPRTrY=": "393313000000", - "5YtjaWMZKX77_KIkkhsOiIt74xdBGZHLPxx7pLzLusY=": "1159192000000", - "5Z5IEJfAeItzlaMtOJruFm-Hr7yG8fSq_EfOMDLO1uI=": "385505000000", - "5Z86RFlaZtfGVrHBqD7imuj6zcIT3ecPFyGViPIKv9s=": "2375886000000", - "5ZI8dniHQgyz1N_M6wQa4UDe5imEg_83a1IFmlkP6PI=": "500815000000", - "5ZK_hThNqMjifs7eBh1Y6HpZiaMWEfewvrhQthfiTKk=": "833301000000", - "5ZM7I8FRjnmrSYVqgg9gQb4KZ6yVxbXIJ7hyN5v-s38=": "385348000000", - "5_916eTA5uScrFcISwBGTahZHngf1tfamZR4G_jH1TY=": "384615000000", - "5_Qq1QgymmUEEhxrCNwGsFhP2DYuUN93199elSGhSy8=": "4062731000000", - "5_Wg2t1q_ewmPqP-Cd0xS_3jUx-CVM4JwS_-aFNh9TM=": "4459818000000", - "5a3EKEPsudi7WANt8etOfz4rSI4kLjPVf0-N52DggvU=": "384615000000", - "5azFKC_0J57RnyZhgeRmPVnu1Zr1JqiNRo1EcdunILI=": "384689000000", - "5bGLv5C4xitqswZPlPYEHC0iYJF02M7R1itN8jj3Ui4=": "520696000000", - "5bIavng9y-nDULU8D5BMyuxTMva2CpTTgcLoyyjqUxo=": "482124000000", - "5biHIYIZUUiBHjfeKFEVXZ33C5gtE8HkXMofryRENs8=": "3191094000000", - "5c7C_p8rusXjNvBSgrs2VJPJAPNS6QOKrPw44J7_oKI=": "1136166000000", - "5cLI_L3DY2vBY1kw1QbnOTKxQj0YVdSioWTK2GCUiz0=": "384619000000", - "5cn-osPTuN1B-8SUoY1PRclkqbm5FPqWgKKJLuQW0cc=": "380708000000", - "5cn7fHrxGuCzXD_pKbeSUVwBcH6mcVyt-M9Dwnm37DE=": "3461538000000", - "5cyYiqxmIAjyomSH6WJxS0_6pYUR50tyyObD_GNPh2I=": "417630000000", - "5dHE1P_XmKQHmq0U-fgwkU4e5LjBXhDhu6FVv6BzZcE=": "424835000000", - "5dUYPjjN7GG5cNltKZTko-vpwA8zyaKlRhtjRm71ZA4=": "2085406000000", - "5dcXSGOY0O1DbKR6wrXY-nQdTgtuVghr8YX9N-abZh8=": "384615000000", - "5eCtYpal2uBWMy5qImTe614xx6m7AAAvjRKyNMc3HMg=": "384920000000", - "5fLWD98d5F_yN44J_cVhJNNScxNYaWZ-k3yJD2oZIxo=": "477261000000", - "5fV9Hywb00IVkY4eR8Th8TkUxDjDTLEHGVesD44bhLk=": "10428213000000", - "5fvbGXTNOJzRo_Jl3IY2KI8pq7ykB6VHBUSmO8PdOK8=": "416666000000", - "5g6Msc9E2fwxcV0zGM7e8O1n68gu6_oirhW1eRFaoJg=": "416599000000", - "5h9roiWz4kC9dNQtlSIqh49Cz-EttdSiMxPtpjgeJCM=": "393573000000", - "5hZ7yzIWiOCWF4ChnfgtdRRhTkwDA2tOYfgSVJa6pxI=": "6489427000000", - "5hf4wU9sxo_8fi5f1l7Y7rcIgMOU90AzvZqlkSO-K-w=": "3846153000000", - "5hhM8Hp1tIdkT94ssEJy5j_P-IqxFghl7HTSNZvFZyk=": "3250619000000", - "5hj6Q6sUYcIq3IXjVxn10SZv6L89xeoVi-Hm9XU0F64=": "3685627000000", - "5iE0NYBLiNidIHyFQ4ujxRUgtM3prq_CdvRYfjMU5j8=": "1252902000000", - "5ip1UhQlUnM4VDRi0YOUmsYKfPcbgDhVbG0sU4mx0Dg=": "833333000000", - "5jC_NnJ_Bgsgy7gJmzFIW2R68z8VE5pGqL091cDY-YM=": "1979119000000", - "5jW6YWB03DC7t0hewZH9AK42ldDZfXhrnhcm-HDv7CQ=": "386297000000", - "5k3gtC7oUhqfPgeCc3fpGiaTK8W5wTKlnXBo-vEenXY=": "458982000000", - "5kAYnqEQ_RfBIGodod1LbKVUfOt6GUCY7lX2OBAx2G4=": "382749000000", - "5kqY-Cw1M0eFf__YjOXlZHB8oI1v2_uaKPSovSLazq0=": "3390170000000", - "5l1ghqbwjl0YftuvDsk5sO8qNR4kxOajl56xPWpWQI0=": "383997000000", - "5lUjuAvmu7jvQfKKZViNOCSE2pGcfUUauZ_arD18vRA=": "379928000000", - "5lj3HhrRNyqyF0kHWEcwY9zbpmByV5AP6j0hcY9OLkI=": "381805000000", - "5lk2aZHBw4kEYcN96mP_xxpqTkdizVqn-ao4GG1h8jY=": "384615000000", - "5m8IMmswR2HrEsh91TymreCQk5Km0GSkr31JPUp7c5M=": "755638000000", - "5mJOU_vRb543jgTXz_Ri-4NKyIlynMTk-EAWN6Vp_kA=": "385718000000", - "5mXpxUfs_bBHB_sjT4oAtkf_hux08DsMjOJE37AIyUY=": "8365622000000", - "5mb41yFKGuV3U9nYTM-U8ErwvEQA93mPHOXjTiBzKqs=": "454801000000", - "5msJTC4nvWSToF1okm7JhUjm4LZSpLyGhTwxNWKPHw8=": "123701030000000", - "5n2RjBiqcf1HCoN7B-gPdgS97KZAA73qP31jmIksrF0=": "462839000000", - "5nlIgMdias_Q6qfAl-1IIx79670LLV9W-d9yPvobBTk=": "627223000000", - "5o-ZCYIpAfj8r2gCTmoO6cNFOTBb3k9PRFGRaRl4gO8=": "3754082000000", - "5o5VensvZCJFl_-Qe_mKbrAhf4ZTobcmpS3jYOlUKKU=": "455519000000", - "5oeoT2W-7Hx8ZZ-yQvhojM8uxk4Wo-Wsl7U68mXjrsI=": "472233000000", - "5owTQHFPP-vChQgOF1KMinKfnx-Jcb73bfYv-YfNpaA=": "385506000000", - "5p0QXVAaSvoqVEYZFkTxGjT_uZppWef0EDPZUslAYSE=": "416666000000", - "5p5egbK0UXssOB0_JB6Br-cC9G18-2TtcwnY4D1I9nI=": "1153830000000", - "5pi2UkMWbnGce9ZnOMDIqikZaitbdtYH7wLewGgIjj4=": "1249999000000", - "5pyOR1zg3b74Pph1os9i85CUGv9XL-3e-a-QxwnDY1A=": "5390170000000", - "5qlmSEQA9SuPEd97zE2Q2TAi03cawTy0pO-Bd2zbnL0=": "9112001000000", - "5qqODm8IMzH58olaPF-LQiUOT5-h7AMhdrVCyNxmvOU=": "3321850000000", - "5sNcwe-DPLS0cxjxGGrkige2RQOmmnDNAaRWruPiE4A=": "1921580000000", - "5sa_y8IIdAr3GAawJthYHeGSnXA7jh_Wyxa9QZ7XfaQ=": "2035234000000", - "5sgvZioCX8M9gspjhWw3byU-d_7fG5mp4O0wD_p2O3s=": "456608000000", - "5sos_7WpDotkzkP_aiK3J3HDnEXs7qkO3n7kQHnT78g=": "444948000000", - "5tadmOoIYPI3qgjumSqZCjPj_WDYq0zbd0z2rQox0nA=": "378879000000", - "5tps-4Lb4DQUm3ZcBIJxoNK3-0EcSdC3tNJqwtmtghU=": "7708780000000", - "5u6CgxMzSk_yY-5jWv_QRVUbeBkoYslKaUtmIru706g=": "384090000000", - "5ucEgg1D121P314TNPICtZb8nPEECpX2wx7Z-hMvsp4=": "1923076000000", - "5v2YJ3DlirY1ci-R60R4pxF-1djljEYvQZwnTGy-lls=": "464620000000", - "5vEiwd8ShnDqwJd4i5UJFL9caHw6EfKBVlJHP89eQe0=": "4715112000000", - "5vG7R1veVVehPcfYaY1vs_IxapWZz3JdvO2BlShSSMI=": "452942000000", - "5vHE-BYgFIVvgnmX07DhkEHmcBuiCx0D5ko_JLpLNxw=": "417636000000", - "5vOpD1xnA75t6yZYrLvfwltACMDMYlVCj3ca64QOqB0=": "1890453000000", - "5vOuWHmLYzdop6VbHfAZp7o9ivkaka9oko6U31KIFFU=": "1153846000000", - "5vUMiWJmun3b3PWh9pqb2QkzhWca3CvPxThwoBTdzvw=": "411085000000", - "5vUPa_nj3N4TQKQRnvDVo2NtmS7IQKJPjG95GudVfqc=": "1905703000000", - "5vaWw7Gjy80amEj-FIcaRxaKItP4PW-bc3Q7dxK0ZeA=": "458309000000", - "5vdLan_9JcrZhC_guMQIUMiIpKkD-s5lsYpRxRkLVuQ=": "450496000000", - "5vh_C1yvahdfe40R5oqBpEXiDSGi5LmK5xJ921rwlbc=": "926058000000", - "5vv-KdHHMMvsYO4WeHA3GOd00hhbA703vcHf5qOY0N4=": "405846000000", - "5wDAyoUzn9byMEzcabilJ-SMshA8cu0WpNbm6zADw5w=": "416666000000", - "5wFiiZQcvv75WugSN_BMScdmWRjKffg6dd8FTZn6cvA=": "385510000000", - "5wK7m41lEtCh3rSC_CQRRlh4yJ_dW5u8MrKgy8cvdeY=": "416666000000", - "5wLWVb10_5Vd4tqf_KiOGShGJldql1gKSVkl2nNASKs=": "738915000000", - "5wzBIo9x9maRRqaUj2rOUt9HcXi5RF8FFII8kNyNbBI=": "415935000000", - "5xW6JEi7749mTWE4gsvvWX_dAUQibLuHemY2Sdf4qH0=": "828477000000", - "5xp1MHKbECybSD0DEPFXa3cinUeDOKmLw1WQRm_Jaq4=": "498372000000", - "5xqLyWIOfz6WuXIsxVtIWAEmg2KTQjfSj0JyU9WXU14=": "20063234000000", - "5xs-OezwOHb7u1XiDNpL7qDpFHAvhzZ0oIgswEYox-I=": "462097000000", - "5xwDsaIiNv8XgGlXDzzVeCRhE4CN29UyGn2ku9w36Eg=": "391797000000", - "5y9_F3I9d4QVIEbl714W5JvDlNsZkSP0v5zdNqE0N4k=": "411085000000", - "5z24LT3JlhvA7UAJ5CSZkynp52vWdQOJN8guN33eKho=": "4879942000000", - "5zLnMNdRY2I6_sDHeqWsLSEfi7sp7aoTMhfBNcDh8RM=": "380878000000", - "5zZ-JhswAaSH7uXXNfR6rMGWpJN6CfSwNBkAxBUR_U8=": "421793000000", - "6-JMHzDikHCKONTinVk4UWbmDJu07mPzl4pq-9J9cUM=": "12692175000000", - "6-_yVBASRKhq7VhYXsCoeXQiR2Q5brYGaZxrCYStpSM=": "419856000000", - "6-cSwBJ-Zk9elhaJn8LlQCHp6Yc027IGnp9Hfrr0H2E=": "2366352000000", - "6-qEq5fFhpBAdK-rbqjBJ-K7uYrdpIZgrGllE3lP_ZY=": "384615000000", - "605m3PwBD87GSgxeQAdBhGY8KWzxSWvnar60uJbeAlQ=": "481965000000", - "60JLKJFlxKs5SMFQ-KUCZNjokicriBvrcC2b42VjVK8=": "764836000000", - "60REJQOkFi4iTK21nldiZqJDMQcOIbftlaAGt9tDe18=": "486218000000", - "60YehnGT_BpX89K-2iB9peXv56dwpDh98kvctf_WwfI=": "384165000000", - "60gKdGPw3XJZjMF5MMhM_3P0usWExVpHwbu2Q2rfFTo=": "455391000000", - "60wG88pQW0bYf03jX9TqZ2YHeeghMZ4H5x_hNH4gp1g=": "817604000000", - "60yjp8S4kd4B_s_ouQ0XLZSxT1K8jwicu4o6-syhzes=": "383179000000", - "611lqFF8GYYRn0JuocJrfhfaAJziyZXr5aJJZbenfNc=": "469837000000", - "61Lj1qAjYPRv6Z7tlaCieYb8t8YVSZ2VBDNPe-zhqFE=": "1623378000000", - "61Nty9Ib2Yz22y_qpO5gQKma1OXSEU6hi1KD6BvGkrs=": "584712000000", - "61OPXyGfbKOSnzjuVRyod69KHh8WT5PI1PkgDLyx0tc=": "381436000000", - "61mP5ylf6707ipjBLhM95L6AbiF3hRu22SstOES1Tn4=": "2122230000000", - "61tjYrcCQDL-3xhnJYh7-yGN487C_vM1LIKngZXbSTU=": "826227000000", - "621adCWo6bmoEFgyyKbLyngw9xifGOmmZAqZvbDRV0w=": "375836000000", - "627Agi2yp2t7MIX8RfiC2MPabHmQrcNTJ0EQA9o97IU=": "984162000000", - "62_6Nuz_pC1SzJs1TynlzH6fJhshlL5LPQMg92aUZbQ=": "460892000000", - "63gpQfCaKhlg8Cd1mSWTWdlxmat1keXxPw2tc2YR1zM=": "1156520000000", - "64Fxs6YzRaTWr34Z6QynBjqUqfYlNyuVy84Gdq0EMxU=": "393732000000", - "64iXEjxpfyS0nJzS0-Ev2j130DgwFKjiuZU-ocbDw4A=": "490157000000", - "650BQ9CVx4bSkOHQdu63W9QVsKt49K-iejfPymGqJVc=": "5659777000000", - "65QwwkZsGenAx4R6bQpzwluWFx6cyIkGiepsg7BwB20=": "416646000000", - "65XDppVBcrkXti1EKR34kRRocyVMWdYHa5iden08rmQ=": "804067000000", - "65Xpfa8-rDAsvsLCmsDRQLym9LjQsLGLqpbnq8SlImQ=": "1974213000000", - "65ZE_Q8DFOfyXeETfpCbkl4BnPGXeP54PCOhZmIEraI=": "2253448000000", - "660iWq3djkAx6R_ga5w6Ulo_1i-fQB8TCOE5w5KbE2Y=": "377902000000", - "66Dici9SFDIfKjhej5uLu6bLdGouQlTNPYhzl-w6NkI=": "502779000000", - "68-llL48dD0bvlKCsIJ3l_8lTJzXkqF4ft-9Lb0IK5Y=": "462687000000", - "68e0lw_XlMeOKcmmij_OBANEyqQMntRbkz9wreMmLV4=": "1946496000000", - "68irk781uRmzi9PpmINXr06U8sx9Q4zIVaxPOulX7z4=": "2176024000000", - "68uU33Gs-RZWzmgOa17LYV7aHHkVuPHIFc0U6PQJONk=": "4173438000000", - "692A5K5EMr1Vy0DodLE57t6aoBCywMVf99lrCfVqMXA=": "677908000000", - "69ZqErNUFL6f9da7bWd235PqzfcYD8eqq3ZF0VauYV4=": "394154000000", - "69bLWX7DQ0x4rzKURzwbQ93YqM1NRIevp48QzVmau6s=": "997494000000", - "69gLMaYxBVehV2dq4Oaw5KVG7n5aVDhYv3nK1x3achU=": "2262442000000", - "69mjqQy3gj12zO6TYsdyx0o3T5RkdV4ODHy_0ymK4z4=": "378086000000", - "6A566IhGVMF4uBovmjo0rZ-7PaZLNhr926cB8JLyz2M=": "4197861000000", - "6B7MPMHM7FeKv9GWXiCObceHmGUXxnGrnYracVARmk4=": "381836000000", - "6Bfn91dsXfmu-n4wHSPZS3ShUEVhYPBQmHr-d5Elwio=": "1011286000000", - "6BiBSpAnd2vJBy56fs_2YlPKnXsew0_ca_h7WCWKuro=": "385505000000", - "6BzAJbV4R2zDAkqPJpJFeu4004kF5FVCWi2gXI3HJlI=": "2499446000000", - "6CRjMsgtPH2U-2R1lpr2uUS-43naDir8PH6X4j2V9oM=": "4110858000000", - "6Cgg8hyIS7rorqr0-3USQ19RKDU7_APiZ1C401I5D7U=": "3846153000000", - "6CpLn1cecygNgOhTeeRC1cCBi-4aMp-Vgxg2z_2Znqk=": "1153846000000", - "6CzitkkzqqSjjOy3MUarWu6bwSlxOF1XXIW0WbGZQb4=": "1083757000000", - "6D6Wow5IDaF39hivUmXkgqoIHinriIB_NhFNFJ_H11k=": "830439000000", - "6D7XKwtdbHuXic1105Kg-jU_pO7J_ZCtEWOizdyXBao=": "500385000000", - "6DITrNBEFC0rwzOuf38JNeL5Rpqcr-bj_SR6XoGYQCs=": "627506000000", - "6E4fcuvWjsLdjEpaufusZHUmdHxHfDhyDTL2gLfRImQ=": "459646000000", - "6E66R1C6FRVFhEIcgQjWXLSPX4IRdOMDgYILr1c8h7c=": "546532000000", - "6E83eZsljxcqO3vpYxVJxevjaYYzKL25oFDp5VWTp4A=": "391132000000", - "6EiJdKSb5IlifH5QC_lNh9fZGL-Ny9OH1qapqcL-Ieo=": "1968983000000", - "6EmbU8nGxKQy_Ws6_MePPGIMmesev12w9SeP2Q5w0p0=": "451406000000", - "6EoNKqbvoF13ZfoucMKlCNchtgIbw2SQLjfyYNakVZ0=": "384615000000", - "6EomJj70VHSSoamieb_93Xrk0nk452GsWzLnIh9BJZs=": "4072694000000", - "6FECLE59D6Nfcg2uyfpZCmL2JA_YL64U--2Kz_7bsec=": "2442525000000", - "6FEvB56kWhNV__7pTqfE7pwlJXxRXYM8ijI0HzyklkM=": "20348678000000", - "6F_0E_wLXft4NynaATh_sxipwp0y9plv2kf4HgHh9hE=": "2133408000000", - "6FaizCGffewY1c6FI4IdoWqjlM3sPQ4-a6gIxM4E_Uw=": "769230000000", - "6G0K1HVjpv3U0SEsY2riucnrzQDZsvo7uf0ehBQPEa4=": "1153529000000", - "6GDXJLecozzeXd3VK4JaJUEGu9eAe-LDIL74RDKee6g=": "457031000000", - "6GO75sYyLKkV5Gpz7VNFzEFrSBa6hHy22csmlazJT_g=": "642211000000", - "6GZtKPNDzSDe-xlT54susUZXJ3UkMEP8uMy4WPmzYVg=": "6041637000000", - "6Gg3QJL1D0Rj2_H9VIhDaiM9d6pt5Lf3phsv--PQvuw=": "406167000000", - "6GkoDiXJEDiz9W1K_J1bzkV_wrIRspJbmOb-K4a3SJA=": "1157284000000", - "6GmDa_2udnM-ou9n5MOSlHJpMibazpnOEM71n-5kIEQ=": "1050424000000", - "6H-6V24sN1oP0yacAlzpS_XKqSg-LGBPIhHj-WtVBss=": "417633000000", - "6HZ2eksN085QG13jAE4gAMBPO8-2iMfjnoqpF_DPb9o=": "1151917000000", - "6HZR_HoOa7v2Pds0hLe1WnVTwSBRZWlSWNbZKqcJv9Q=": "383069000000", - "6IAqU4gDaNFXKp66FXw96vU6PP478pSghJ1J4kW79Xk=": "4167006000000", - "6IUvBOASTgKTRUxx6x4JrIqAku_RjXOyhUPTcuOn9NA=": "412618000000", - "6IZFYEGHtJ-rK2oZEKSSAsKunQZKiHlnd0eddVAXQCI=": "625272000000", - "6IgdZCBo5V0UduyIncgqvgmlkXLxWf9gbnMWVCCkwgE=": "1132077000000", - "6JTS7-DQQ2ybppOUDcKEaMBpeg5Dti3DeWGc-4q69iM=": "1153846000000", - "6K24Eea8LRl3oRDFzMGMwNZswYcwAo_qcuyMaqorgCo=": "2320523000000", - "6KEbqVlPplTfXUoyJCXP3Ul-70MV9ksI965PDXT8KUQ=": "416673000000", - "6KoXqMsXDyVpesHwCgfVEIe9LTCVikx1iBzOh6NZqGo=": "902926000000", - "6MXqmUeab4Z8Q7WUf8KMUzEowz_N4-0KK3lZxWOiN3g=": "384688000000", - "6Mqo8RS80mx2kkQq2F1ac5MdKtkCe9rSV6ET7vWdhh8=": "756212000000", - "6Mt99wqpxvDUxqT2WCQleznjzYuQmRV-qPSRTibdu7Y=": "903715000000", - "6N44hUmjvRQJCD9XKPKlCOFe9TZTPGVd135Xj04Luv0=": "8249146000000", - "6NWIfksyzr1tJMPTX6ErxvCr7AkWnXWex80Tu7NNkgE=": "1818181000000", - "6O0OvssVyULS1REzHTpZ_hzguOOq8HhZqifD8HJb8rM=": "470699000000", - "6OkT-b3IUeyayngEi2vcON3Ns4fuSF_br1nsMeQW5tY=": "11337577000000", - "6OxOS5tAAmEVAZIv0At8W2uOwPQ0A0TdkQ48MMigSLc=": "32290884000000", - "6Oyokb5BqaDHbvfP9V1E2ZnOnMzCjarzBckWhmVZ5GU=": "761623000000", - "6PSRk_nA36u5BhqtKjO6ONlUoUeGMFL0JttSOyWKCkc=": "2469861000000", - "6PZ618joEPDhxPt5mOJu6QL3d4vsUFitD8a2wZQgCQk=": "2261852000000", - "6QDOhCQkWQQ6LrjVTWArWqXZRFgOb_eV0FlQ0CNCS3A=": "449980000000", - "6R-xZZS_nWYPByURdwdnx3ELXc_GEoYCtkdKyABN-ys=": "470446000000", - "6RB1p362cMP01OUbliBEW-GL8LqbcdGhDHnzcPVH6kg=": "411085000000", - "6RFUgTGonXRJ2pxUWJmXStvUBMnBr7g0yPkH2rVWizc=": "11678653000000", - "6RFlPqPf_MK8cbVJaQVYjVSMRiXAyyHBMU12AKcr9V0=": "394620000000", - "6RKc0bdQ1_SndR3dqFbI1O-_PZHm_lkustS1wpbRgbA=": "455383000000", - "6RprqeKdz-jEr02jNdxvkP1ZTPtpum3oe10TsJ6CboA=": "5014959000000", - "6SIKPnQc3U5ftrWTIpLx7qyQ98W8Y04U_OrihFBh1nw=": "454545000000", - "6SM6_3E3e8FNg3He8at-glBha1rEFSgSd4tt9-DXCmY=": "411085000000", - "6SOCFyYPAiGkzciGkWH3oZjfrXlc07JrfrnqhByiTuk=": "769230000000", - "6SbJf74DyP_biWP96b8DpdGsGuwKxBsEOgFmIql0hv4=": "417361000000", - "6TDIocNpw9L5CPcwiOsEGHMiC_RiszPgaBvqq9K1fnI=": "382737000000", - "6TEJbJpjBSmiMw1qXw0Lea604FKsUn8BGY3iI_Joy2Q=": "1374653000000", - "6TVWPc55m5joLTwgqMfRfcSP9BlJHGtPQ_IpDMbkEfk=": "417636000000", - "6TfqiYd8rriG2in96b8JLh5DwuotMqNni8uV5W6W9yo=": "4196757000000", - "6Tmx4P1ix3TtYgS_7kd4nQcyU4t0gkCKFr9PWsnjHJc=": "382544000000", - "6USxz5Zmlz0zGTidnocRod56cwNVxvoCgLFuWBrCOMg=": "775861000000", - "6UdDMKFugBXko9IjY86DkOB6LboQbnoL2lCe2NhJPxU=": "450738000000", - "6Utx86R5Zwq7CwMNSyvW4zsshHZogo05Vki7zNq078A=": "450953000000", - "6Uvo2BpjFsX439VsFNE1hDJKW-bOvUMg97t0NH4gDv0=": "458632000000", - "6Uy6hUHPlULDE7Jr1hzb03NVEvuy2KzbpY2LYpgRsgU=": "416181000000", - "6V6Zvz2rgq-emA7zxNu-Gxbx6vyzvbSIV8uOLPRQZ-E=": "480183000000", - "6VEECgLFseiZhuMw0LwPYGXlfWTH9JZwPOYtFpjAN54=": "1927533000000", - "6VHWCDBjRW12QYivRnY38qTInKW59XexxGLRCbrcYKQ=": "576923000000", - "6VJoOP1wsMIBRCG5w-YJH9zGsMriwGdgzgpaeurSdLM=": "918273000000", - "6VSox4FEdddKL3CVOLoTmrvlIIbV9050MCKgU-XwFck=": "769230000000", - "6VgKGtyKLRfzqPI3mtOhm3eJOkvuIM4kVAvcYy50l0E=": "458016000000", - "6W7Hoel3Da3u3K5HCY5YyKg2e5rWu-64zits_y9-m18=": "752625000000", - "6WITdmo8H1eypZ8lnrALUd80D5FDC9haKKtZaUCxdx4=": "384617000000", - "6WUug2fgRx5fXkePD7-w1_1RkrSEeLrMflEr65V_Bcg=": "769230000000", - "6Wis-pbfXrlw9u3EO1fryVy6CNceceWlwX9JfCrA_lo=": "350959000000", - "6YJDjKOZsLgvvbuUJU0VUNH8szYNS9Z3cl1puJR6bpY=": "500786000000", - "6YZ30C1NRCW1TbVW3cP2n65MpgoF82Dd5u9CS5VQubw=": "377810000000", - "6Zc5T_137gzAr-Ok9YtLbzTu9hz3p-5FJrjbfpYPLAQ=": "2086531000000", - "6ZxhS9VhhAiAMrO-A6_xdPQ6UGw3pKpyN1be5JLhhT0=": "383170000000", - "6_1O3NqJH6bG1TZJM3orMVP5JRH1w9YILGckk6y6Fbc=": "9164805000000", - "6_PpsBoM2vrbhe9mM4qFkfU3mA-vin_6WHkiPfBxXto=": "384517000000", - "6_jVgvn02A2r9jDDhrNL77by5oTyVQNLCONmlZiWxOM=": "2318726000000", - "6_xdjbOaL-gaWrx73wDrF_iSpysp76hqKkURXcdx4lo=": "770052000000", - "6bYpOz3L5brkLr_z2j408rJLXTHW4TC6kgFrBH3k4Ic=": "411085000000", - "6bkCszFdFlm_o_QFXJ_olQU68xVvMD9jQ519xlTghDw=": "384615000000", - "6btSaCphcO5VpStYUEQV4eIaJ-Da2JAoacnHfn7efyk=": "1173884000000", - "6cBhME67X82hcBsQhXYHdw3FIzkSgU5i5jpAp5AGKkE=": "1927554000000", - "6cCEHk7CKt0OUDOyqlsDkyfULQojVB17qKDC0y3H-JU=": "386133000000", - "6ceZg0zEe39B_-GITw0lYR12euxK5X-PF2jECjlrm2k=": "2115384000000", - "6cjYrB1Yq2-24Vurtvl182qdCNuzmafbDwWDPt4BxTE=": "412229000000", - "6clUe3aEQoMqRFvhmXjsGRC8SyufQ9-6uIGc4Yterl4=": "423368000000", - "6cpged-wB-DpYXB0jzqZj0-5vmLgGn8J1olYd8uLWf4=": "789328000000", - "6dtAhr62kDO6d1in04PrqEgVebs7V_zTDmpNqgglD4o=": "384615000000", - "6dx1jWre9BZVF7rDwkWlCoj4kv3M8YlxDPPsmEO6AyE=": "416666000000", - "6e7hGt6HTSGred8vJAkODyxB2c5TBF1RVQbBGA3HXBs=": "795454000000", - "6e9rWB2tHYfq2T4fOsOaDeg-ogQ75qsGEcTzAw616Ko=": "384615000000", - "6eAir4PD23spijwvZBKg9PtRcuaHdlkTcM-R5tu3q1Q=": "1249543000000", - "6eKVDXbjsgJ1bFEzUVA4aELm_9RwZAgrdkIZUwneXuo=": "417364000000", - "6ephxxYkQn0ar2MloGsHsRxQH7P11WFOYOWF1pTKsvU=": "384615000000", - "6f9eA13xFPd-6rnr09EsMJWeGLJX9-itG_q11FCjxmQ=": "492944000000", - "6fHgWItxe-llnrU_w7SzMPuxTy63v5G3h_34ckfVkXM=": "384615000000", - "6fQue2RvtvUS15Nyn1J44WArwKX82k-5GUL2Y7HPZDI=": "1927537000000", - "6foRjFps1zzUQj_Lj-cJZNwu9oPXXaVIib0njqS0Qwc=": "411568000000", - "6fqefQvafaicZMkZAT2ieXkQrHd55oZRkgCUS6GqB9Y=": "383497000000", - "6frlHxbjSyB8SDWkezKDRnGyH4ZAcJ5tfRxxAeni5os=": "651266000000", - "6ft1e7MJPI3XmQOFfZq9o-Q8Us_j9euv-F-YeH3kWxA=": "463394000000", - "6g-6iJ472Xph2B-o1I_OW_b362Dmq06mNrotuKSlJus=": "692307000000", - "6gOQQA2h1dGvUf_or1MubK8dmNt0GWuB_EvAyaydL0M=": "410211000000", - "6gu0goWD8shK_KQB6rapMLatmA2jTNSeo_yuYqRHpyk=": "466384000000", - "6hUPGyO1LINPH3CRNWqmqso9zgNq3BLDG-X5nzTFhZ4=": "384615000000", - "6hX4l4Mdvj49fwZvHj6RgD6iJkn10NBjx5zV1hBuVQk=": "382870000000", - "6hzsG4muQwhQBjf5gsnGiliRlo8RgJKTu82HEtjxpgA=": "464104000000", - "6i64t9iMuM6JYdO5eKTI5bDDq7GrH-UpxhVKcbB_LFM=": "5267998000000", - "6iXm6baXqtOGr1vvgdIz5dyYTksq01AlPDHErvH9VWg=": "576923000000", - "6jDl_Lal8QZ7g9IlyXNF4S4cP42Q_AvXBAd1KNj50lg=": "911480000000", - "6jbKQyTOjhGrFaSCwnMAvhF6ArV2uRsHvhZHD4Ru-sQ=": "4031982000000", - "6jg4niJhJPivawNC6d5L8un0fqBxbvmjEuZJ1oV9l70=": "5028864000000", - "6jlh9Il7cnrzKXvtX7oAjlXy6ztHoIBCFJud5TPqzZc=": "453401000000", - "6jrnTWDjJcuR3CvryDFIYBRX5nEG1Lh_FamUcC48u9w=": "928209000000", - "6k3KuU48x6RjA8ymtVLkjzam7Tfrl1AR1KNTvPkktPw=": "769230000000", - "6k6dBjI0LJTreJGrKP75ntPdIX0afL_5ZxtiH-hI8I8=": "469949000000", - "6kH0qFIRjk6H2zK_7HRhzsTwj9FL33MaWO9_GATbh40=": "1001940000000", - "6kQrnaHD8412pknG5AmSra61grujYTLyf3iUQGOVSXE=": "769230000000", - "6kZJFgmQsxKduGq0qwuWyT7_n8ZEnTISMbWdb5uhAQY=": "3846153000000", - "6l8jEFh4yMv9rqGEp_VXqmSzXnr9PchK-SaFLeGofhA=": "883836000000", - "6lHLmOLsSeNEWZa5C2CcdfZSiG4lm6dMY0rYC_MFsZc=": "455125000000", - "6lJpc6JeWQpS5beXwOuDXsgkc1BCCRsePFzqgVWb5-o=": "1923076000000", - "6lwCpo5l__tsdrt7jaH5rLQdpdmVUsTS_00DpeVk2mw=": "454433000000", - "6murL0u5FLDH_grSp4okFMptI4jbrQxCcuxHFk2Qzo4=": "382059000000", - "6mzJx-_acci7qMPeuSfNq5bKFFOGlsSxn_pslfcy4MA=": "384684000000", - "6nJP_gigghHO4lFFtF4VoRLMInT5NRc0VR5mdULIEfE=": "5769230000000", - "6nrTi_upPzH39sDoRI8EnbUgCKzBu47-JFtgLRrJQmA=": "385510000000", - "6o93ul-xZLP5qXL_Wwe-v985-bNQWK1Esq2oR0r0KPE=": "1653216000000", - "6oF7TVRcQjBqaULusJABQKIfnJgEiWFCdaX9mOl57PY=": "746411000000", - "6oPTzkaLessyL2UojRWGuBolkCRTXh0HaxFjoEtA_M0=": "458402000000", - "6oY-10TVAKdk86LB103qWoSfkzu-rjTKglpdm3F5P9Y=": "2017332000000", - "6pq2sqEwBTiLsgSXJC1IwOTbNJw-lFSV_LDNHtdoAmE=": "1951054000000", - "6qZIxIZk-NfpvO0JJI1L7oVpeSV07G6u2kuVg21NlqY=": "385506000000", - "6rRCWGamm3vi0WQ6RIt2tArR81nrWY1Sj_uwozqRChE=": "3845053000000", - "6rhP12f0xGsl-6xdEgTSm4truYRGJY1EJptU-sAvvXk=": "384615000000", - "6rnb9ji1NduhNh6XQRUjwE8jjOUJOkXv_9JMDE9LmDw=": "458120000000", - "6rsoMj-vIzSK5GJ6GLOutNrremVzH8z-dobeuMo_T2w=": "1257695000000", - "6sThHmzPx7UeRMVS3q_7jDdvdPM6Ua8_sRD0Tx8Y4uw=": "2487538000000", - "6sZat-45e-0kT4dLdkAptkRnZgRFy6w0EJUWG4RcfGE=": "3081988000000", - "6sorQg4bXz6vr6Hyjus74bI_1UEG1-vTJJ74cP9sVAM=": "3999999000000", - "6srKgUszxDgepuWyvCDMY0WoKLmcVR-bXncD7F3ttRM=": "5104948000000", - "6tB7ajKhR9u58uer349_bXV81z-ZNchc29EwwJqJE1I=": "462146000000", - "6tX7etIRqhVk_qqX72MuDiKKxTuG8xN2hzLfaXsVGAY=": "385506000000", - "6tx8Ys2HuR3Yn_F64Lc4p-PLCeJeVb3VSYcS9PKl-mQ=": "5005400000000", - "6uLQMJ0QZLHgdgL6ulTpr27UjTw6sq6xwy9vp8F6_6M=": "4637772000000", - "6uLXX52042Fgazc34m8R9ikKPE75PFDFcntdQSeArbA=": "712965000000", - "6u_AzXaQUOI0mDVBr2w1AGxzvAifR238A0DvdqZo1rw=": "382479000000", - "6vVfEKLarGSbXKWC7i5XmSNNXvgwapiR0b0It0p2aOk=": "391132000000", - "6vbhQewTEwiY46ytfMHGSthxW0o7dqas5T4sH4V2US0=": "464230000000", - "6vjFFgBLTHjmLAHeC8TuDVM3vkOXJFvTu9-zGe_o92s=": "763562000000", - "6vmE8fojS25ThmnubKn8_AS2NMpSP_KLMPARVkDr4ew=": "792906000000", - "6vqMcyxmV8RDwOxNnaZD70gB68H8sCHF0KMugY8kQtk=": "929128000000", - "6vw5OTUBEUdz0NUGvY3D3pGMBEwLYP8WGHfV74yW_s8=": "7059074000000", - "6w69CWKaJmSuDtdKPeYvG-Fj0jp22tGl6okkNZiQrCA=": "934564000000", - "6wFqXwJ4Y5BlmdgjGoO5etCzVepnJOYQ-nGudJHHh5k=": "2301482000000", - "6xiW8paEth5jAc3CBTbEAKLFgssZim47Pf4XCUVzbrs=": "1924734000000", - "6xvi1eO2U-1m9KaP2rWHixmla8n9s3Q4XUPFGOZlBbU=": "407808000000", - "6yEnPUeGAetBHZjywOnhh31fXtnqI7NeqQ3CrBKVALA=": "428293000000", - "6yFKRNK-HgiCAPyGBbqEWB7KTzxOOIJToDNPw-OcWOA=": "845123000000", - "6yKjnFMhJ26M-Kv9kdNBc0ay9To2mYDb1UNQ6u-Qm6U=": "769261000000", - "6z1yFQCdCsDde9HSiMBcwItwNVjbf_s4oGiF3wW7nfM=": "385505000000", - "6zMekL9IwIsRQlBPUF5eHrWplw5mhUABtSEgItt67mY=": "384036000000", - "6zWVBRT_1GRMSUivlYnGTIsVoxt0iwFDe5VPgTnEaSg=": "472248000000", - "6zbj6c8Js_WKjfVqsbW46leXpUxGY7tAFnL1tgZoqUg=": "930618000000", - "6zgjhbkuzlkEea_rvDHve-UtR-4eObOckM8ny8oARv4=": "522041000000", - "6ztSwQxxMZgrVyNCkrWwMafLDPOFwBg6Suxkoyz6mN8=": "1345596000000", - "7-MD4qWGciu0E349CXngaw5LqNqBQJLJf4dBQDQhnAI=": "405229000000", - "7-gMkihjfJqMjlIXqwrKUOQ7MD95GwS8kvpFqlpY-48=": "385508000000", - "70RUwtUF4WenubLQKw4FtHFe_6wkXLo5-zqswPg3blo=": "407560000000", - "70gruJmHJNhOXgiVNz3AhgyCvUvtxqCdjHwU14yD6rg=": "1522622000000", - "70y8egMZmMWChMOKN0_ZlihpNro-wRLiGeWLKnfe2Rg=": "473265000000", - "7146B1BOLfk0bG5fd6liuJMHPOPb4-8qmgxz-R7zctQ=": "769230000000", - "71UEV-XHNbmWbHAuU0gu9i0mrtSruB1oK_uhz-vLVtI=": "411085000000", - "727aSRt-0qBJElv6JwEdB-ns-4eEffkcEhQAOB_oPNA=": "384615000000", - "728zuduabdIVibvXP_LA1DfY-7l-2LDZdtZwLfC2rbM=": "448797000000", - "72drDjFrTcTzgr9NvxpPvrMHuK690xFO_bHtkKvLx9w=": "807833000000", - "72f8-FHRgLG4gXsRkcuZKDwHoB-W-6DYne8zQ8u4EYs=": "385510000000", - "73AmzW52_CcBJ6eC3B7Ij3Fam1Xqw_miZboNtrblO_g=": "384661000000", - "73TMHy-6nt0ZQq7qNcWZapKL-Jbg-JtZcSUnEtgcpRY=": "385505000000", - "73emYR1lToRvS2R3yGWijfldMxhkYjYPdhMmIT1poZk=": "1878876000000", - "74G22EEyH5UPOCS3gQ9U1nZudPnss-derKr_C1ytB44=": "1238186000000", - "753OveEX0nsmYYxL4DO9SpbJsNYKueJXMy8SlaQorrc=": "563336000000", - "75Bg4nQl8f-WK6XKMfbrHQffSFa_URKmjd6o-39icMA=": "454545000000", - "75Ftpxwwgt0rCRSUK7UdZ11837dV3QnoQgL9B4VeS1I=": "769250000000", - "75SFGLE0c_wZFiZ6VoRnKgoYar4J_aruamOyrZgN9Ss=": "376645000000", - "75WyA60Pf0gs0y3w4N8VHVph_dBC42HrpjjBYlIkO9I=": "378821000000", - "75y51aXiVhW0shL6VVaSDINGNSptI9P-SYq25x3-Yjo=": "655097000000", - "76GwiPYxL0tUvAGJdifkepN9M0CAUvNTFnPvuBtAYzo=": "384615000000", - "76jbnYcM9c--jcxJ08fdF2IORBvoUiY93jdOu_sGXx4=": "449742000000", - "76tMJ_RIaWcrybre9cJMgzvcMT23s8qa2HF9KocAxI8=": "1002799000000", - "76wkQKHj66Cblz7ddXllSC1gEHSRcxxkvxz1LjCD1hA=": "845357000000", - "77cYlpZCeD89Qwcn4e8b-qswUDMYWCdwD3tPT1UilfA=": "385510000000", - "77f54qCn1EFt0C09hJjbHoi1dKod75iFglB_2UtTLUI=": "457480000000", - "77rf2IlnkcDgWAuOXasp2P8UgNeThUCkclmvcJI4BAs=": "454545000000", - "77tJGN9F0bMh2erZdy2vaNEL235UJY1RpGoBH5FZcYo=": "912584000000", - "77t_kFCSNlP7-PLfyGgeDFaDX4Z_AE5fAXjXPCHiYJY=": "1637992000000", - "77zfOhRm491B07lxGGKZXKagzoDGtPdJJQ09NAXBye0=": "4156385000000", - "78jezzxvy1j6uPoyKRMt9xol4yOo4HJMQm1GjsKEbfc=": "9608394000000", - "78qF4u8_vFMbPpclKsbTYJFpSZmFde0L6ihPZsvmC0M=": "415906000000", - "78tYlBwGo5Q2v4Km6eddQjBA4gTsJyteX_WIBfXkY5M=": "377583000000", - "79r4y-VnDuC8FQkYIaid3WbmpfX3BOwaE2funM_PJ68=": "454547000000", - "7Aja1N216E1kplJbn3U-VpdDKFOeFFJkqoXySCdNwNE=": "823211000000", - "7B3Z9b88vLPeDleSVwdn12LEHjhaoH5d2WvED6E4-Ss=": "1156817000000", - "7BCtT2_kD-AMtonMD7NtG_z9a17PE5XC15wtBd4A478=": "3846153000000", - "7BtqJk7-V-gpdA55-d8g8jBH_S2sKmya26gPn-PvMxE=": "1926802000000", - "7CDNJoGKhuyaT4ONlkWx98L-DwZ0ZXnI2R3OgIiW6rk=": "416666000000", - "7CDtbENLdeiAEdAhAvD3gduozOlq5Gv3xJr3pTkdzWY=": "1150599000000", - "7CSCi8HRorJUEwzoT5h_yKlZel1mHIThQfdxqmEmbBo=": "385528000000", - "7CuPyTuOhZ1cVgysiTWJkzq4iKBYWKc7EuOwezWFWZ0=": "2265787000000", - "7DDdVhUFxs-lL4EhzDyJ7nrpfuSExIGsIFndl7rMPlQ=": "557477000000", - "7DE7lt6JyQ_RkK5w2Tsva-KLbwnF3WX100Dm802a9Ak=": "382476000000", - "7Dk9ihsCN4jR6ng6Ac0-MN0LHogkA3VrT7N1pbgEsyo=": "961525000000", - "7Dt2_sIlje8ZZ3Ib3OKpVDRRfSOL7xjiI5R-efTvMQM=": "390975000000", - "7E9B-AqJDcYF9gMlfqInlpuPqP3SA__rOAxsAMBde9Y=": "499880000000", - "7EA7t2mb6q4FJUVErK6TZj7yn1JcGm0PkTd04ehpMPw=": "383887000000", - "7EE8aB7a-lr2pN4zXmcPP1wwkxYUVk4YibDaxSQ5frM=": "384849000000", - "7EqTXodnkqLeabwDl5ISPhTJQX5O93TmJSKogOB3cKg=": "384615000000", - "7F6CuuremUArcOnhllxJE8PWXaKJc8cRgmS-Br2jNtg=": "1147439000000", - "7FAg3YtgrlR5zBMcdP1wUw8CrLCOJ2HkO7_ot_bftvw=": "924911000000", - "7FTFDLeTDEhutvwiNyCBfYc0sgtoHSvPqM3Y4V8pgQU=": "2082341000000", - "7FcbwNXqAOxG5aG-XkbluTcfgBSUHl89dms0Cngy7oI=": "382394000000", - "7FfW6LfD2IhyEoKGVQglPJ_FoYPAlKnpu3G5vVlPmjY=": "10961522000000", - "7G5CxJKsOupxYvIG9lDF8xG2E1e6x9L5yElHQux4LWw=": "378821000000", - "7GarNxLCPZzXRFMj0rX1OXq9V3Lc1IhkwcgyLO34G48=": "441049000000", - "7Gq4MRcZnqx9btB5qc8DxhPk6thGaAfUtKM_iLFqjuk=": "1153846000000", - "7HQPQgLa1R-mB1IoQFlQGihs51Zf4fO1O1nv7SPdasc=": "769103000000", - "7Hcjr9PP6E8bTnXm9Cxqm0xF12cIVrP-5rWRCg2TAM0=": "1542961000000", - "7IHqdX8y8EcqrgnqlDgIxKLYYzmdfwu23Mll5jRapI8=": "926808000000", - "7Ih5G6KzQWLrPDatnuflTdnGBtBv5zJTo94Oc-gvFek=": "416744000000", - "7IwutpZRCY5ibojRPr1EbStvpmrgYJqXIIdaQT_VK1A=": "383902000000", - "7JUv5veg5hx_4zIlByEdQOvemq7REF050LdL7tlvTy8=": "5163446000000", - "7KAIsgj90u8Q206WfAzZ4ISfMM1WcxGJNHPXT0XLUis=": "389386000000", - "7KQwEPWCa9k3TJGyP6g6GlTkKjMS-d1jwTB1WvBKgRU=": "10963305000000", - "7KUAuv3OOMFKurwBx2jqpAZ6-a59fmv5iqXVMjT86g0=": "823211000000", - "7KYI37IE21jnYoZX-6WxiVt1_tPFbECoBMuM4BGW9kU=": "1539573000000", - "7LUY9Th-UiIEAeoWciDpyyg80mLMJQjgvO9FW76T8PY=": "2310726000000", - "7LlIEZpAz3gmTio1Qn0Eo0mpHsP3wOBZi3e22bIz3io=": "385505000000", - "7LzF02ktlHdTVm3_NnfV0f9dzVZCR6O6i_4HWkYrSuo=": "8195048000000", - "7LzbxVPj9S0Zw7nvjuJykAhpSQty8Ku1PSj9eJv6Rmc=": "555632000000", - "7M1ZhM2_oPZV4kSOGFl8_unbcyOSKVs3KYn8pXN-Ofs=": "454545000000", - "7MUl2pvpAVq29PTIllYuNL2sQnZVYjAD3pD7RVzbjcA=": "3758700000000", - "7MhZAjKAquvEO0xzkIYkWBYB9odm6mpT6y0QKk_GiFg=": "458870000000", - "7N2xrv6o-ZR3O1hleEQajZzXU5iM9Aqh3rLLFM_t1Q0=": "4230769000000", - "7NbA4RR1vom1YPAWhboWtKOhIC4nC1ue8Gte__EOtYc=": "445981000000", - "7NmnaKyucyLO_ywUgnjL1B9BgAo5wr6RuB9XKBY6-e0=": "465927000000", - "7NyJumkPAJz8RW8shR9NaU-ka9pIiNtC_6pdVV8zEzI=": "412863000000", - "7ORaCE4JyMavEcwo4wt6RX5Ybbsx7B1sRJpQCRdHADw=": "768663000000", - "7OfPHxxXTmNvRVLudpIqazttXzJPCQFDDbl4L8HOt30=": "4966614000000", - "7OfsvZIWogZDlAe65bAEeXj_QS6bdCQKZA6NA1Fzl74=": "1156517000000", - "7OiNVu8PQw53NVxUPqBSsBvzL6oI9giuFzshoHz_158=": "506074000000", - "7OinsoSZj-ifnaIQs-EPCos7ozoP_CIyJZdE3oR4drA=": "1927533000000", - "7OnvqExesJOBY_yjAfgkPzJEBHgFKDLbROLuBkst2XI=": "448254000000", - "7OunLbkd_BnLBQtcuDOdelAQkXn02hM7gu2YGBNfq4Y=": "833332000000", - "7OywLp-mAm-aHrPrM6xpYo0crlPzMfKy0hFWO6DhQpQ=": "449960000000", - "7P085GRG99WxoX-I08cPW8D5uyIf7ZvBBs2p0tY-niI=": "384615000000", - "7P68_xpqfGgrlcceZm1j1L0qFRgYyXqY4Utkxc0vOEc=": "385508000000", - "7P8oR6JG8fGSDIDabOwVd9AgbzSiQ4SLasrIYY5Ua5Y=": "7936637000000", - "7PT-036oFBYIMpj3kn-5HaBElGSF9-EPSM4l4i8_B8c=": "3307692000000", - "7QG0pWgNjTKRE6AOXfzqZK2jgjXdTpc3A78CLypuwGY=": "384615000000", - "7QOk2jT-R9TQScRVDrvXfLDIHaHRqZMf76kvzb88xOc=": "4621453000000", - "7RNb7LusJ0Dk51gX89J3x3V278X4P1XeN4mOO0CAX1Y=": "983706000000", - "7RYRDszwooGHt3mJOA7NYlC8cVfxLT6MFyAB1VYHY0U=": "502779000000", - "7Rpi1Lb5NJL07YBdLPKSyjZmAfelmKsjIlXzjQFBQCw=": "384723000000", - "7RzXZcDjaZgeWVBI6IiNSU2EbHl5olSgFcobWgR67G0=": "1855209000000", - "7SkOXhxZY3D0MqV7efJrZw6KW3q6WQ3ifPGRnuwpitc=": "634433000000", - "7SzaBU5ta_P4g1loijfRz1w0a52Gtjq_hFs74OJHnb0=": "4166666000000", - "7T8lEmYXWFYxeAWEdcrbgqRlYzuBOOYe4nR7RUhPDLI=": "381677000000", - "7TFZ7U52td-doBAPlZp55BvYShwHY9ZwbT0VpDuQYdM=": "409481000000", - "7TTAezUTBIfBvobk-YlnSlIwHMTFwGWRLB3kQjkZnCM=": "385283000000", - "7Te-233rfJf8ytLZDmyuni1VM_k_dlJFS-xvkBUMTrI=": "8355256000000", - "7Te52MHiL2Jl5jJ7yJwtFn-3zcrKSGqfmosNpiofEys=": "832900000000", - "7Ttf6dS64Q3UXR4Fe3vtv6I1XhvyT-ARX1oM2jnEQk8=": "563879000000", - "7TvUggrJ093yEF83SVXWmS65qVZ-8TAevJn5IA_Vjyk=": "385505000000", - "7U4VIu_XFPWiag0abNkrlu23tO1OFAhKajpLzL0l5GQ=": "385506000000", - "7UGJaNHYmp1DTd1h4Ha-wXFoBa7GhYX8BAykaQ0W3Y4=": "459858000000", - "7UKzQyfMkozfmT7FaXKKROKplAENXhOcUuShCL1XH7A=": "762587000000", - "7Ull0rHHQAAjT_FaV8_-c0jM95gbVqubOIFATuKxSOo=": "385561000000", - "7Up7MbEE2Hnf_0IekDK4hpQJDfgefIisvgjk2dtV9Sc=": "18892272000000", - "7UyHPMdlmQ7ulpqghWUDPRr1bPZkwCuVXoxAdVjYjwQ=": "385507000000", - "7VENKwFaqs3FSZ0wMS5NOL4wwhbGm4qZPWK6oybDqvs=": "382414000000", - "7VEZ4Ooyig27WI0XFOWFURxulpyclDE4qCbfjjf3B3M=": "839951000000", - "7VUGFtJW3KkQNWo61WuJkRodyYP0Ub7YC8s8Fn2mHto=": "825650000000", - "7VUzizA5-t4oUtpwafUKVaiF64hgYimuvLFWd4ra9g8=": "2069885000000", - "7Vk1X7qvm8sLsbrgyGh7uyYuBtQPoq9OtfHb8Lv55FA=": "1374530000000", - "7VscnfnTlVtUZvRIYI9IGnrunkidhmxdd5f3BQlCiko=": "388604000000", - "7WKwjmgi_ik_Wce5QvxAb7jCVxtLQVjfSa2XX0-b2ok=": "3846153000000", - "7W_bBJEVm7h6QWvmTbH0MClGLRghVBYqQuVR2afSNq8=": "815308000000", - "7XUmn6eQdnPa6ASAkqqUOlIxvhD0cIOI1P-Kdm2503U=": "1911972000000", - "7XXyLGWVlHsFeRQIthD8ClwfQXAvjMpvCM2MPqYKiWk=": "579410000000", - "7XeSFYIhGpX0vXXl5iZgN8zb7E6OV2VywKP0PTk4xWE=": "3706663000000", - "7Y9KfQM0RrEjuxTTpZQN49wB-kPkrUty1Y3ReZEMpTI=": "427689000000", - "7YCJ6HY3Y23fb7nNSijiHWuPFZYtYDACYa0DaZrGdr4=": "39637569000000", - "7YHLsxOdQFMsr4Qqh2l4FETbFd-QD8nFf3Zvmpw5GO4=": "416666000000", - "7YoiJY_WqruyZPI9OEQWkpILOy6Xk5IlN-aY4RpFmBY=": "451418000000", - "7YuXPu_xsWKsizijDQCRKr_1Ed5rmRYzQPlKqSXn5rA=": "7710117000000", - "7ZQr0WW6Fl1km1hj5qA6WUuAKFMo1fwDfgDiKaPj1ME=": "1252906000000", - "7_IhStc_48TYpV-hGhr5dh7uXYdhEGQDSPuWh2uwR7s=": "424962000000", - "7__JHOopW5yGbEP0sABVI1kPl7qYdXFtCCFMGvudMpo=": "567004000000", - "7_vBA6e1Ic3QMxT6EEov9eDS19LVN6-qZfuhI_9BRUk=": "465100000000", - "7a-JaeWFSyY9SP2liR6b5jTJ9hX_YomepztSNG_i74s=": "464881000000", - "7a7KmcIF2EKy1yDKXSb6L47zh6ucIv5nvMDuveIh8GM=": "753439000000", - "7aMm7xaHQu3iyyz8ER-V5FgkZpeK2AJ3ehdE330aEjk=": "384615000000", - "7aUNBUzS28Jv3E_gmBOJTW2cX7-FjqRTxxSZbu4gRu4=": "636148000000", - "7awc59E_E1PpL0DyGhew3mUUGx3EKbP7H_8OwwNCfYE=": "750896000000", - "7bNJ-8vg9ua7dqsCpHtrqbjmN8U2jSGs1A1JJesfP-w=": "3076923000000", - "7bXfiXbGSTQO3m4rZRA6udDWTiLrFqxlmdNX3N-qAXU=": "476850000000", - "7bal8XQdw_WkyJYE1ffeVUZf5jCTbixfBGqgWx5_vAg=": "384203000000", - "7bl3_moJU3OvE97LJIT3F8T4cCNd0Jts9mlLfAG2yHg=": "15083913000000", - "7c1sppNLQYk8bJ3421xuib_dxQGG4S1E1cYJjPe-94I=": "538236000000", - "7cEaXj2j7KWv3kXg966Lo7dq5lxlEugULUYp-B2XRRY=": "769230000000", - "7cWOipFtdf1Dvi4IZXScP2G3RiUhazZwCXaLFc9rbT4=": "929753000000", - "7cXp-0OddnUHaZqmmn8bPjA8P2n8dDIrE1SOPv2exEY=": "385506000000", - "7cepx5TGTGbGjV1T2ZTDffdPzEg2lHuSMLtzcRqUF68=": "411085000000", - "7ci7urCWeRfAN1VigNz_cIwJv7LoqOmdlH2_1_zwYVc=": "451503000000", - "7dBik3ambCjbpGZvbnKAmcdpD0wLJQQOb290ZLMesKk=": "384615000000", - "7dPKjarxmcFnJIoayz7Qxbv3AmRdXOozsBALon4vgsU=": "351391000000", - "7eHQ9Z4GgvIexzEYXCeh453ZaOa3a4AnJ25CFI87UGE=": "407109000000", - "7eUQ7xLoA4WMftayW4jN0-n3RNwNMck6EpVZUD_RKQc=": "7700887000000", - "7eVgDy6DOCALOZgSQerGHdH4Bh32ARvC1lA1dAQxwEQ=": "2072984000000", - "7ey6zaN9abOKBFTRa3IA--sZmzs39CKmhCsnYG109M4=": "566600000000", - "7f9R7w-a3Lslj1U2-sJ8iRra0RGe-zn1q1YKP7vqpAg=": "1923076000000", - "7fMgLdcUty1RJykNVlThVbc8v8jeb5xL7vf1Oz0h4d4=": "462363000000", - "7fXov90lOXyasbK5kx1C14tnOlOpI4wyhQXPgKD_W6Y=": "554186000000", - "7frUSDgtkw0C0D2NLG4KLyf4AhHDe0yWzKkvX4g95o4=": "1247142000000", - "7g3miEpOEZbznPSdFG0Wu5Ap_n2UmmL3wvRZ5s8AhT0=": "8363441000000", - "7hjh6orZbzHgBujrnzBnou3NvTUL4cFu4aEChylf6qQ=": "1411432000000", - "7hmGWW7ZetNLvIKVWKfTTtFXWmHAi67SAPiyyGlGCGc=": "3698977000000", - "7iFM1zz2-W5a0Ju2BdVkAeqSX7Lxj4NIgzqOgIkthoQ=": "763008000000", - "7iOAWQdORjbG6cu4LvwFanK0SeSVvXmamjxHDVvYHks=": "384615000000", - "7iyhh-AFgQvlzoStIQgVa_XnMqOLgMqxqSKg1LyUiSo=": "3613957000000", - "7j5873lYP4_-e4fhdmgB7yMfw75Kw2qo6sVgxGE2lQg=": "413603000000", - "7jDp0SQkmKsqZskwb-uBH93t0nwNxr5-8U7ITlqvPLQ=": "449698000000", - "7jNg4ECnN162dLaWUaj9tcKkItP6vXTIavxM85mwMm4=": "769230000000", - "7jR7VrjJdOwSggZoMpx_cAGNW93bn6Ty7172nYFtQmg=": "1175093000000", - "7kE-jpOJBUZHMpx_p2VzphxYuZqkoGfhjD8qe2j-PpI=": "1858257000000", - "7kIHlcJrfa1DbN4T-95-lVUXp3pNveXpICZ4X8xdAWI=": "384615000000", - "7kJZEuDrp3LQc68h7v2EOfnX6E9cYc2rELHz8Y-obWg=": "422561000000", - "7kKj8nlb_kbryoWPYI-sHNQonu_iqasIkRXiS8RTWAg=": "1223425000000", - "7kNznzbqHZHsnY8f_4VjpSKekervPC2pikU3s03ONpU=": "399936000000", - "7kOKARa3BXUz6t9BwulZfVnHbIX1GWbTf9EmWEOrFKs=": "794429000000", - "7kV2X4qrHDijJVYxE-SMS_EmY1fhoYN7A80MRDgDMDY=": "1173675000000", - "7keOEnIBg01IWxSyW5s2TkZqySwA56Z6eNv7tlCitp0=": "387365000000", - "7knhYasdr7yxMEI-_hSkddc8o4JpYumsA5QRPiBgXxQ=": "386543000000", - "7l0DwWsMv3H1k_RW2Lr7Q7w-0P8e2_SK2gnguyfIPPo=": "384615000000", - "7lbyN3MuZc7z6ArMFdmQTMofccN_nHPSM1O1MtbZvWI=": "411886000000", - "7mfwdm_uD9AZVIMqvn1Yv9mPKNuO2gGfbnvJegLJZEw=": "713270000000", - "7mrTcFX28NyJlSITrrX-53dnx98c9HVJO3R1zCL3Pf8=": "409034000000", - "7n1uFuL1DIf9rwZ1MZSmBFeOUNLsMr6K5GpSowSd6T8=": "385347000000", - "7n9Qy4t4B6ju77nXcWguacdL7taEkOiWnUhXg12mqqc=": "466963000000", - "7nIxPj0WsEZJkpQE7OZo2A16WuLRDC69kSaq2x_nvQQ=": "417632000000", - "7nOMRaEOTHBJ1Or4FjkO_o-SsO2j5sY5T7NjsmEDN4M=": "414551000000", - "7ndOMdroWHndNINy-62_HkQI-8VrDQ7mTqMqQJV3kHg=": "3057692000000", - "7o3qnyvywcvC41t_thwnUTQ0LXD_0E5GqhWk15efCwk=": "52548324000000", - "7o7D5wEtRmWTSz8HXwXUz8sZMz9eHG63Lj1LQK3u1og=": "1346153000000", - "7oLc8d6nIUsX2_dVwsApsbmgonpKNo95RmjyJuJO_24=": "449085000000", - "7oW1bnUrIw1fkWshGGFDMOeeEmrwxThQKVPT2LNUx78=": "424269000000", - "7okB9Yv5ZkJdjrVCg2_PP3Ls9RgqCOLHGoPas3iPlzs=": "4106294000000", - "7orgGp5_7nAqfuoQYnb_ejFZvaKowKMKVFUS-OBshTk=": "418280000000", - "7p3NZ8dWnaX79IKNMHXnGsKf23UW9ZwMEWheoaM_JkM=": "384489000000", - "7p7dEmrOjaP8yfM8VKq550d7mSMy_2p-LiqldxrRVjU=": "378272000000", - "7pdRyCRrMiZ3V8jhfFtqhxSpyhqBghiAp9h42h3WSW8=": "454545000000", - "7qDcn0kncwMxvPtBD7zrVzhXsk5eN9J-7ve9q-hmKow=": "407808000000", - "7qti15B_OoeKkgjDOTR1bGnla8AfgM0xnOrt77SMwuQ=": "6715384000000", - "7rEVD_ZBSlU_2RLEQ6Pher3xYqy0nh8635CG8AA-aEY=": "15751710000000", - "7rEsCWhlnVEu4J0JlP76mqZ2p8SB9JtnBsLbj8r2_nE=": "1758461000000", - "7rR0kaM9mQ2a6ik7410AISKZKHRDx4vRphe6d58G1J8=": "383296000000", - "7rgTsubF6Y-LhBt_SLz2_mbckyAwUUO1zoi7z3SWJIc=": "429119000000", - "7rhXZi1FC6oWDDAur0ltIpfzO1a26lEWzht_w9i8X6Q=": "1391600000000", - "7rrBkhCp_LIu7oz5Ax1SgJ9QxCuQjR23GI8myLKJZ8o=": "764788000000", - "7s0Cxp9xqYo6zZ0NjGTUMbUohhaZ5iYBgvBBziS-S_M=": "1484383000000", - "7s3cKdXHYzbqTbBXxOCa1LaPZox_n8FeNSPPiiXuyxk=": "1629150000000", - "7sNtlqG51l-QQ1Iw0HR0j9nSYosHw2nsYX98kPAPZzg=": "375287000000", - "7sfwf9FhI6kaN6Qhr-cM2uIjd2OnZkbngNn1TRNSt2I=": "4911925000000", - "7t46zREcq4xXFTGjLv5ldr_Sy4k3N2of_YFJcJ8u3Ks=": "1363636000000", - "7tQe4Ykg0x8nnHmEZqhfLuxCaiotLj-GJVBeHL95BY4=": "1923076000000", - "7tf7NPA5LzKZdUWZ6QKyq8OWIYKTnJExa6Udyg6bjBo=": "404066000000", - "7uMJCiYxhbaL9qoCZQ8szRryCAIKX-KGh8de1nMXWa0=": "385510000000", - "7uheoJWwB9nErjw7vVTd9lJ0G-ueSmtw_jmuaDINycg=": "4582577000000", - "7ul4Gs2jwh3vXRfWF3lwRAqKdFiyait8SY0xtRdV5lg=": "1355119000000", - "7vbfaOWm_E5K7VX5B40ZxhM0VunkgT2DFxa_2fTrGLM=": "673529000000", - "7vs23t_uYmgY6X1lCnEIO_8UJDlEu4XoUxQ_YSUMsOs=": "412618000000", - "7wH0ph-m8nmZ7f0UG0imWYK3JyD-dLVxDJwNNFwIpbc=": "459886000000", - "7wJXYlvH-Sc5ulZYd5vN_kn2j0FkxZgqLPTNzkaxvO4=": "4689799000000", - "7wkV3dQ7_VZCcYpBDsMR5khprF6DaMOUY_4qA5RA3xE=": "417636000000", - "7wu3rQDPqArSVsML_46VuKyCYMppsfloS8DiJCZBP9c=": "455320000000", - "7xLxgUM9JVVaVWwtKfJYVuZmADOtzU6V3fAEHK5srTQ=": "384610000000", - "7xgRrZD4d1zDQgTbDNujzSMxOuKa-EmV4brSPVzL4-A=": "602785000000", - "7xq2o8_TwbrAdA9RI31Db8jbGPMsh95jqPYjUDBLBYo=": "1885233000000", - "7y7OE-Yz5IGHwEARiX9XyVU8T3svHdD7iAKFg47XLro=": "384338000000", - "7yAvBo1nWhLsBGGKO7ZpgthidOHyL23xafEBsbZjlEc=": "1410174000000", - "7yDAFXsdJn4DHQaoUiOqY7Vk8uwAuI2Jvs9EZkHjJ1Y=": "783595000000", - "7zWVQBJFyE7krUvCJFXjY3yNMohL3LaAc6KAUOnGavY=": "657881000000", - "7zm_KDsYYN7Wm3gW0egjAUwPCTHPr1xk7C10_HStnsM=": "1183411000000", - "7zn3BNWBVA9rW0u9xqJgoHuDwo1-l2fW_Gb1Yfwq0t4=": "385510000000", - "7zsFIpDOeAZxEP4H5bpLNV2OjOXRt5Cu_5wMOz_t_9E=": "12649356000000", - "7zv8GiYM4j9oCVf_0GhCs51wlA1Qu6GB6JBYtCoyOlI=": "769230000000", - "7zwBKdVrTKHV6x998QQuPk3D1iKACYji7ywB9LHpaBI=": "1263115000000", - "7zyr8ro3RuwnQvwMdv2pyqHkXMM4VVBfCr9SFnX6oCA=": "384610000000", - "8-DJ9PAyAgVbHukZhCjfOXqzV-2chr9ca15siL5N6H4=": "2031176000000", - "8-KREcHxzZPlh09CkNNcfI3Xk55mNLDfuszUMuKaVfM=": "469905000000", - "8-aUlpvucanHA4Z0VDCShjCIaPybKTSxdzCS5l62Mcg=": "576923000000", - "8-eo6t6mL9YbAGl2zUc0AzpuogK0mIwQg6G_hHk1C4o=": "4000000000000", - "8-ptmDXQDW7aBIWCEeF0b_k72iIiI6xatuwBEGdB64M=": "411085000000", - "80e3teWjBmbGOXuOj4yl6IFfa51fXJr1sPm2IQrXXWc=": "490605000000", - "80yx6QrDXD0agNihzAfwmLeRKUVXWJRES2Tl2_9Px6Q=": "578548000000", - "81-Q1-ElMgJmWm2R-F-pDiJt-1pgFftAUIHTwSfD44w=": "769230000000", - "81AxeO-Z8eCs4QV0xRfV6_dtYMoV0Wkap-atqM50Zak=": "1264425000000", - "81WX_pQW7T8cQQHt0tBBPlCmtSeHAJcs1g6n7h56oC8=": "1136549000000", - "81iZ1FuhH0qonXdfqwsDLxGLwfF3DPkjJZYKnmCau1s=": "1629615000000", - "829Sbu00b6breSlf0QCGt_suDL9mBKa0Ir5pG8ezmTY=": "385506000000", - "82QPRW_4XHStSjrBvWh3_wVkN-MZdEYnkOu6RR2g41I=": "378633000000", - "82XAtjFyVQc2t64BjB5vFsa1JjGrh3xnMg3Dgn9SBGA=": "383990000000", - "82XecpT96fYCqbuGaC_8B52kmxas4Pq8Pbyn1iBXkYw=": "482124000000", - "82_g5DqwboLFWDaN0KVizgFp9gMbmutwxSAb6hhVIc4=": "4544264000000", - "82ib4L49IjHCsSfxfcfpKEKrpuKSjFjD2n1qk2aZjjg=": "917964000000", - "82urgaZKr7R-hhqOVSmc8z5uMJeornJgYWw0StQDabs=": "502530000000", - "82zPFrzSf9p-d8eaAZUFeFA5zs_40WSPj-NWrkQ4Gq4=": "1538461000000", - "83C3eT5tLupp3h_J6HjHm4b2G7RSjmHtt_EGJbqbip0=": "377685000000", - "848aKlVXhEKnSeqXQxjBLwL9RKNeOxIKS4fa1L6S7D0=": "463106000000", - "84I2gDgxzDHTWPcTWbWeI2fpoQn2jb3DdwFQwNdisHM=": "451333000000", - "84sIX3QbMqjKnxpCS2iNAhyt_vZhU1xmvdt2jsKMuCw=": "1686538000000", - "85MMHEwzWG9j8KuE8la1z8gHBM_4XQEBDXawdghZqvc=": "1617207000000", - "85qkAAX9ijUZMgM6kqA0SlgZs4n9SCP5CC1fOu0D4Go=": "417632000000", - "85wwhUsWC6FX6PJrETygxNbbUHaiQ13OgFYscjnL7AM=": "1831153000000", - "863WWf3t2nJKaiRpBYe4f1nv-lsIUbGhEYoNCkYPbWk=": "384615000000", - "86B6mMurOOK7FOdj_31unxfMSkzE4lGiukBY6bIv06M=": "1153846000000", - "86KhiG-p-fE8YBBGKRYKQJVVXna_IYPOTv_IULSP9Sw=": "383887000000", - "86MGsQ5S2UVnRphLTE6EIZgsOlUg3abCigkP4phYRe8=": "833333000000", - "86sBBC_eeWirvxw-PjYJhWfEh_8WI8aPfGNLu7Rdhxg=": "1382775000000", - "872SVsX5Km7tbqeaxwQmD5C1oKM957BszDjbNWAZ8jE=": "18806282000000", - "87aMhvCxaR_GWzvI8l60F5g3uBRjZ8NkX9rMVB6ODVk=": "1153846000000", - "88FOQffCPA9n-RJn8LQik3x9-Pcdm_NIJZCABUDM-mo=": "1366800000000", - "88I-DHGmUhA7eAtssQbeiCK_V3d818pvGtFn8SWEptQ=": "1235656000000", - "88eXtQzbPOb_zquCv66rvZMs9JyMpG4YcWRZF3WNTl8=": "1512689000000", - "88fzTS4FEqDiG3KR8GSY1nR5AH4e3vJGK_7goMsmIOI=": "1153846000000", - "8934Jdv4YY5Go2nttd535XxkJE5_gQUf5FZN7ravK3s=": "463989000000", - "89L68KIeT6zCB88s_xSTTnbD3B2EPoB-PtU7bmLQBrU=": "388098000000", - "89RRDr803ISHIJcsgieXY6ARy3Ka8VuK9Jb5gApaSNA=": "384615000000", - "8A6ZONH4mTZvIodJmSBqb4DqzRqJyXaxiUSjkSKebUI=": "1504440000000", - "8AN9uApZwk2lM9JQLD0DjwJU7bUxd9ywjnRflvsBhik=": "1798622000000", - "8AQ6kBeD7EzpLGRk1DVvipwK7V32uNlOOhLtHgoFPgE=": "751903000000", - "8Acmu3tkBJ_cHTzRoPRQzlr_R1nmfWYBzpJOsGLbkr4=": "454545000000", - "8AlbcQenBZFmmXNrpEkxsqz8VVvTp_FPE92-Ydmtnh4=": "3849177000000", - "8B645z4UwgvOSjVAf_4SqiclHWOFzqnaFmDDMog85n8=": "374878000000", - "8BRe925vIjM7hRN45XwY9K7xPA-wduqVpdg_1xzCTtA=": "442970000000", - "8BawCKQNo8CqJwSk-uFgzt2K8IHwAKjgSpOdeR4ZD6E=": "1545426000000", - "8BmRf50B3d8AATJXWtAXIerSuaPa5ex7jaFTglUNV9g=": "466670000000", - "8Bt894Lxgg24J8Am7MKOsneLmctZZC1R-sLH6KMAxJc=": "408021000000", - "8CJlF4Y1taf86P8tKcCbqt3Ei67uIykrOB-Pm-0b-Es=": "908970000000", - "8CLQsQZQdggQCIoN8Ogy8KudPdM4mxuO1EcIFib2W3c=": "1146913000000", - "8Ca4XP1dRKPsBsG78w8UJeN66jjtjmd_qiL4C4dYdpw=": "1152653000000", - "8DEw0wkO5CsZvTMGPBOlEA1WaujIdG3XutCkGdBODYk=": "384615000000", - "8Dfmsy_o7NBkc5g-AEuvOiRbCgI7rjGjMB0WCiO4clI=": "833931000000", - "8E_oyJVKEAT_gEMha_FdmQuLFMn61gzDlC1DFAW0mBE=": "4230049000000", - "8EqVJiSEZsw38cpZIazA-ZoB3o9rdxmfWzRs1rSw5hM=": "769230000000", - "8EuZ8yVwmOYCcfL6hurvY4ieqlKKTuqfefQFQyGtc2w=": "383646000000", - "8F7lLkk-KyaV8eEUEdxyIjrWI_5dD_HDpgirFgoXtLo=": "1218180000000", - "8FMR2TGSJ9koX-4AM66s4_TnypC8dy0rADdRgPiadBo=": "455104000000", - "8FiEg8lqEyDzjGJsK7rPD60_uQRmZzXQIKkhHDbdVAc=": "415629000000", - "8FmNeiVqjMBIPrFlD71GZzmT78IvZRyWU_v8ZUJbHfk=": "3749999000000", - "8G-e6Kl2aoqOwWyG0N16ZIyPUtPBFjkjI-95P_15yuQ=": "809605000000", - "8G3W8_j5ko_HGV9spBFXXlm36kK9u8rwEscRFi4ZK4A=": "392386000000", - "8GDL0KRp42pAHvNcBDwY4JyU7FpMa0TfVvCEWyb0Dio=": "384904000000", - "8GVyBi-1MgKFkco8IY4DS-3spo57Vxs7fD1_u_-Gji8=": "841202000000", - "8GpIMkHUC7ndZfyp078BWKMBck6MRvRf459PC5wSEhY=": "461263000000", - "8GpNeLsEquvaKSPt83L6ForUYxV4YMK-FHEDxYQsqrw=": "456733000000", - "8HB4PTeTsdWuMHgEQbr7jIGYcpxLeYmPJqt7K1VCj4s=": "1538461000000", - "8H_jtBLqYVNPY4on2CVyAEDE77xDn2UNJC6pJWf2tXw=": "1664838000000", - "8HqarpNozzMdbqkN50_7Y3IYXop9k_TfsbuT51FSbRM=": "832943000000", - "8IEbALsu5KgwrQAZpgeo9uenzWNMi_OAMBU1fezjBLI=": "577509000000", - "8IXiewlYcBSYvXYt5qQvY-DcYE-89MdYqd_2Ns5VBLo=": "1010897000000", - "8Ih-tGy03qkKQ0grvHsCgoSA7rKm8FHoPjq1AwlltBA=": "927599000000", - "8JCKrSMg2y15CpVFz8VeQCZWA0Ih0zWINHFiZp8sVs0=": "385507000000", - "8Jts60iH3YfxgNVrXDkfNMqr5cFdC9ITIyPltfJgf-I=": "2093639000000", - "8JxHbU8rxEwx-SDu47DrqJk4XjYcXEGykAeT1B6oztE=": "454545000000", - "8K-JNoCdE_z15kFUIwuCywG7EsI40P1zGztv5kgh244=": "1249999000000", - "8K02kNlJUQbs2hSZaPuvxMIoul3ypIyQB-97Fm11gNU=": "385507000000", - "8KqtDqcIyPDax_OElWvoF_qnPmVHk4ho3bzdy4rpiTs=": "1038461000000", - "8Ks9XxCRbOeupHSdCiQImRTshEqsNslB35WSQ1gn7hk=": "380259000000", - "8L2WXPolfZIwogmencihu7QYHkvSPC7uhk4whSEB9hM=": "379344000000", - "8LDeVf0Jkx5q3T5deeTERlfoznxX51jCAfVlKESWHtI=": "387993000000", - "8LOvtZiVFKNrM4LmIQXrfeVlpMSbclISHHehJu178_g=": "383462000000", - "8LU_n4Uy4B649RsEifDmdxVZv0bTF3fmKGtf2ZBRMAc=": "413819000000", - "8Li_mryUxL-5jHYfAS2CIPRKqzboif-O437dBMOFBGc=": "448838000000", - "8NRaBKFIOKvBtYym7Z4s7UXqhA_joZOA3AVPieHJcQE=": "449705000000", - "8NprQHlqifiZXBjvfuoOs01mxUrTtq33prb3zOUf7Ic=": "2499999000000", - "8O-b8_LHwiTmwq8PQMpfYj0S8fz1vcSSpFDX4TnC0FI=": "416901000000", - "8OTgMdtMmhRf9pLc0JQRCcjXAR4u3kw5UmJkRjw1LQk=": "407609000000", - "8Oh8NVhfF2_ucI45HDJPdOlaf4S89uwxrpmImGrYc2w=": "382168000000", - "8OrIYG0dXY0qYEuG5VB1ODY0X1Kbo3B8MAQ-6IaQBs8=": "456716000000", - "8OwVEgwawFZemaLMuMVP1ImJi5-BHYd8U1qqyz9QPUU=": "409110000000", - "8PN1PMKPQaFNvYeF7_gnz8XHErb-xoT34gckFYr_sak=": "466317000000", - "8Pex8Yqb9fetKS0bflKvh-Od_EHQvKHpTGAICVFGac4=": "422196000000", - "8Q271lf6mjoV1QPmdwe7ejWK2K6FHdEvDhLExXOL1wY=": "464104000000", - "8Q2JMm2-0rnul-PMsmeOC2J9KG9FhNtdKIUlHfTLIPw=": "454545000000", - "8Q6ta7614qbBYJ9pAMIahgbLOPIYN1ayVJtdpgvKMQc=": "738114000000", - "8QYdYU3BwDPOaTP2YjBHvTCRfFrT7Z1jiOdDn8ATvRo=": "384962000000", - "8RNUbMFUofyzAdluov_hV_m7sKRZxgFk0cxNY_GgTxs=": "7693892000000", - "8RQQbaa9N8d_uBaiMdJdRzuobZ9fLKjhOfi2JbPYhyE=": "459730000000", - "8RVnLTMHLPloYWhQIpgLNbua7KnCXNm4muRYZqe0s2I=": "413641000000", - "8RYuUTUFsaUDNpoQGdOxfQu0Z2J8KeysXl5DLMEXDQ0=": "384615000000", - "8SAAQ8H0Go1SRoCA9YkI2xEa5jKSGsIwUvogX2MIwKw=": "3708331000000", - "8SOy6I-FKnJ15W6QHZm4a00hPc15GK333Z_oJgGj51Y=": "519230000000", - "8SQUplFXkdsMvK7AoxK7BMtJml2boM92BpTYECK8eOQ=": "416666000000", - "8SjJg9S5mr9TRGjYuAawwc0R2VLXuQRiSGnaLY2N6-k=": "455901000000", - "8Sw_MUJNhW13-EsFE68ii1sQd6uydndx0ESx3QY4OEk=": "384615000000", - "8T0O0io95QO2epDxlRdfEFau3CjbtAnTj_FADX9OEUg=": "1619405000000", - "8TZEfR8n35NKO1u2jvtEin2rnaUbCcvQ-VTAm1HjRIg=": "385506000000", - "8TZMHGwuiXZApfsM29-rR_Df27RuF0-5YqIZmQLd6Bc=": "1059313000000", - "8TaZVz9L9TWJlqk5Fw_naWNob--MT83_NJqgtqacabg=": "1538461000000", - "8UJs0S_JR3BJZwnCA2uT8RHwgUvtDHGkmpORzn40Jv8=": "408021000000", - "8VJtmoQpwm0eW3uNGgdaX12mx8Q340c6oevcLf7RoSg=": "4173180000000", - "8VJuuzCvchX7rEVsB1yGvv0F4-xnvp4F_UacMDOe8-Y=": "458561000000", - "8VNuvN8Y7TmzHllY34wgr4RbPabvHOwb5N9VbbYAHB8=": "1179939000000", - "8VQZrvSGrcITWdwCTwSZkFcgRPEPO3H_grESb6M18kI=": "489072000000", - "8VZp6xTZ5u8N4nv9Cn386Z2Ow_Et1uTYtlOOj6d5uHQ=": "417973000000", - "8WI8KG2KU1zoQ1wzcN2hQvKrACTeJpl7FsZxUTzrldQ=": "464954000000", - "8WOO5h2emV2i7TV1nSAuuZbbqhS_v7TUMEE5XKi3bts=": "534521000000", - "8WUmprcBP8cdhyG8MHH5A6xt2EGnVXOeVI7OQf9hcf0=": "455147000000", - "8WWfei29Igl1OTv8sgrfQPlzGl34tJHKefSt_Qbg-IU=": "454256000000", - "8WptqcK5D0y2sJaGFRqVrKsqJ24BTpZT2VaZSN0BRzA=": "473175000000", - "8WrE63bAsAfacaiMS93bk5CvT60uXt1nMDZC2xqUWY8=": "1386679000000", - "8XH-WqLofvktDqggGYjP51s3d9C8VHkI_8lOwl0PQao=": "762090000000", - "8XNyqLfTVsZM-mD6VzFpQ6lRMgmv7pF8bUDuwv_wwT0=": "478213000000", - "8XUIHmo050FFKol91MXMQ_Pz89KBRZL7FqOe_Jlun-w=": "850718000000", - "8Xj57odvQtH1Ouh8ysUxxHrlelCn-7v8B71SHVjR6CQ=": "615384000000", - "8YnKqLz9ug9CGJH676XLEa9BSvnUfGmT81m05aHEM88=": "3998913000000", - "8Yy4ykCe8TBdxEKLp3cKe32aaSAlIX1VFOhy5VNZjV4=": "19106566000000", - "8Z5eM14IDu_nvL8BclZToSEUt3lO5Q6Zk2B9Xauwwis=": "18181818000000", - "8Z_WAHgokeePLIfEV_ppALlwmmIU9XyfjaxD8REeIXc=": "423370000000", - "8ZbdTjKy485Y71YifxdZXogV_582kid9RGZGjPnCuGI=": "2309906000000", - "8ZkJRSF3KMJgumvQt7ULmOlIEvAwxWORVgzzxj3bg2E=": "391797000000", - "8ZuH4doQTL9jNO-I0DekiBl6CVv_418InuvjTFUBn1k=": "917959000000", - "8_GF9X0NnmYLJ1Wg_EetbUVRlIVTcAV0Ko0-TXDBzzA=": "384615000000", - "8_eqqSxsl2Mcj793o-sc0wg7dNxVrIf7WIW6dcZbRJM=": "1909473000000", - "8_ia8ZHyQDDBxRMC_0AItDg6Z6uaZA_6g0avdMrud9c=": "462687000000", - "8apT47P87mCxtNYfmXHmXqc5BkQuEo_sAJN7Tel48DM=": "21153846000000", - "8bHahp27MxDkQjYM4G-uJpPGjthspXFS_VYfHqvu-5I=": "2050934000000", - "8b_kZOFKmkMzIVi3fDzVYTZjdrX101yWREfBUPsMSbc=": "384207000000", - "8cB0t-kXpDiOjjMbyPD8YCLRpMlOMkWN5jnzd5bQRfE=": "833133000000", - "8cB9q4H10eyQFCvSGyfbtpGMlcXBza0oDMrnbJHHCCo=": "1233257000000", - "8d211zHducycIrwMsqxMX4iEg_ofy0nRMwJmTc5kPro=": "772255000000", - "8dc48d73Q5BBQ0ac8K9fTSEGebb9O7LZNcnhX9ThqYw=": "1233257000000", - "8e9DLpgtpm14l-zUBidm_cbhr0XY7AfBRfcMNz7Iibc=": "1610749000000", - "8eeUtsOfDEl5BEc-zQgjSDY2w4u7i42SHEUynId79jc=": "385507000000", - "8fr8A8GWWQx7-woLfrwq4DVGKO64JjxQa-5cXfkFD_A=": "999999000000", - "8fxNh_Tv0-p4SM6Wkfg_VdXWfCA64mALvYaPSafg9Ko=": "442970000000", - "8gda4XqX_-tIcfJHtgg40xJ407JR3wBvbRDAeOSKKfc=": "457258000000", - "8gldakuvm2lpjBmQkBjdtjwPr0b3KVBqCzDMP6lbJpE=": "377902000000", - "8go6RFxN3iVCnEMM90qZJoorVYFlY_3S5nkuTM7RuK8=": "384803000000", - "8hCmrCTH9dyaVIdfgO6Q2MWXTRVjjy9fZDrLWLZpReU=": "385447000000", - "8hgHozk2Vl2kBnjeKu7_4seewkwlHyyvhIfIcqvcqmw=": "1999999000000", - "8hh0lCz8C8rLK7pbVNoA9m2BK9AB5B3WQ7_WCQNS2uc=": "1075092000000", - "8hneeHZzLuhDZynzrJPbKevuiYN7RksLLJEYvZyyJwc=": "385994000000", - "8iSux4b5KmBk0Hj96q02JnRcQFMqeOaZ0dhHNbZ2oMM=": "446674000000", - "8imL2fyJPDyh0acN74ShAx45sRTWzRsk02XUb8A-5Qw=": "917081000000", - "8imsp7reipLAJyQAQVHraLzCnOz_bswT9sDarbri8Ak=": "910936000000", - "8j6i5UZHcb3EcnlnTHtaoMmDdMt3FyEyLjS1KqNy66M=": "385510000000", - "8j7Jx3OcPBAKI8ESukRVfaQtmAWNBQv--viujazMjHA=": "378883000000", - "8jHOU_U9gLy0ZVpeu8Tpg-R7HFRJZVyb7CFnkPaIw60=": "3888630000000", - "8jTAyjNXSJr1WAKRBkZfY9wk5RI9K5zxqmVIQh-TY1U=": "384615000000", - "8jUy0CiTJcyfsL8yzjjydjlq2nOxQ7ryNjn9dLdfyQc=": "388601000000", - "8kCRP20M1h3YY7pg1r86lSpKom9r1NIksJCQ3CDuTFA=": "389363000000", - "8kMUP1F7yn8TFvlYpBhEKyGCPrXfwWlj5fAly8IC5XI=": "392009000000", - "8kRezFvL5im1yURJkji-TggrlZqpc__G81IkajT5AXw=": "1497015000000", - "8kSyYRrtCGkR8cqM76pyd_uib27EZspauBSMfTZ8pS4=": "3703832000000", - "8kTV5Odm-ZZYp2PMqao_zoMysIyvAyeg_TWus098cGc=": "463340000000", - "8l8AzdqtMih6riMBKN0D9UYxp3J4WetPq_3BuEh2bEc=": "416872000000", - "8lTdpTDasrgDV6t8p8iw8yGPQNRN4YRNsFCfqKHSGZY=": "469809000000", - "8mEhsYd69XCf4AAz0OG6YxRdYmqbOPNwpyvq0HTcxeE=": "2470847000000", - "8mIVNrGJH32uy5nYILlhV2Y2YfOeF7JnYAm8jN500po=": "2258325000000", - "8mbb0Yd3OgCjoofE6EF0C3XregWZ6fDUlZMMpWIrnhw=": "385015000000", - "8n8SrZ8BUpe4ggQt9wcJC_63JkdU-0RlfgeocUh3wjY=": "453324000000", - "8nB5GvhLItaSbfObd4Hu11-ikEecEe0NW5ULy73M-jc=": "3782064000000", - "8nFo2F1YFGyM1Aepoyb7-fKzUSZwQlCnObdkIDyUspI=": "384615000000", - "8nPOZabVsgydcrfrpgfOatVmQxMq1CbDqs79V6Ncgmc=": "768472000000", - "8nY-TBH8hUgX6iobhqGA0linP8E44TUWwFVdyIq2BtE=": "540154000000", - "8ny-MUs0ral5avaBhLvdbccvBRkTvDiRy93cZBPmHno=": "7083333000000", - "8o79QgfOvoWwb4pELkMZp2HbrDejyYKkOaDeRPXYsDc=": "4083028000000", - "8oPtKQOKBE7x1ZVxNp3A9jqVxJ1tk6uzSRpCwWZMjk4=": "390464000000", - "8oVvksToKRds6IQh7hviXdROvsw_8ymhR1MAvSs24t0=": "416092000000", - "8oYopQvkq8M8gPbBGXa1LeBxVF7k3m-LsLdAjcl7JoM=": "379573000000", - "8o_d9Y6C4eS8H3ycoyCcs2eejXBZXirkGGiBif04Rog=": "376837000000", - "8p7C28wOT-jzYeGFlZmLqGU2SF0GSr5WFiW7ulgpDr8=": "1149576000000", - "8pAuJWvszlkcl4ATqxblUKY8q9wEDFnA43cualC5aAM=": "3692307000000", - "8pgVgW-0WEpYugbdalVFqa-a7hyJ_DUwBPvhTsAiZWE=": "836269000000", - "8prGaEOmrsdvLLodoGC-6Aichy9mJ5NhS4aiby30Ei4=": "368358000000", - "8ptqMYQn9Yt9Fd-WBWtQkCoodfyh0djfJX5wewWKHP0=": "415097000000", - "8pwi-xY5gFJagQBPPvbWDt_lMXmnSfXYZyEJ32TraHk=": "653846000000", - "8r0l_puLnlu9K0icbIxSmJ5oftMS1nTnNFhs3KVmkns=": "493568000000", - "8rhJdP3s852I8EStQutKHDlLm5yky3AQC2ME_37qe68=": "763402000000", - "8sN5c7onv54oYpeps8ZIXPVmKBSkgnNpzRnjYTgd13Q=": "384615000000", - "8szUSfF4WPWLZ-G2_1ik1ueZqj7R-X3hETfEwF0t4Q0=": "2500655000000", - "8t1m8KfICEL5bAh8Kz51MLoUQrerctr9MutxC4pKUIo=": "416680000000", - "8t38kIeC6UPx-FDnB0M0QcAiBozXKsJpRAf2kobu3fE=": "7710133000000", - "8ubMGNIuJ98bEoIERrlYBqH0Hhdj3MB89ocAmyrA9ZE=": "10310871000000", - "8usX0oPDehYsHMH-Zt0LAnpRhPLCJgPD7KUeFzU6vtE=": "3748797000000", - "8vDMg6ja50CVSW9aSIOFJaiy2yROaRWKXDrSLKiDReE=": "416666000000", - "8vOTR9Undd0cxs1CxKtork6Km_2K1Zjo-OTYiW2ozLI=": "1411432000000", - "8vaTPJkjZsp8gkHL5Qz0LrOT6-xJ-vEJbOH7QHXj1Yo=": "385510000000", - "8viBuq4xMHlhmsM8oM25NBQXbqZWNB6s9MfvH7e39BU=": "1885751000000", - "8vpfxAYOIu3ODzwEpES6XF2UYzz7BVTCJ6P5XnMQXYU=": "384615000000", - "8w95bOwiFEqO2cJleLARZ8fNo2-0OTAxeWp-u1EjQ3E=": "4178095000000", - "8wCmocyiJIOJwe3D8gH59jEBhGxgDZYUrt5wwyeeIXI=": "455600000000", - "8wS5z7zwFPQ-PsimHUymVBV9sFXWLgICWrve7goVcyc=": "411085000000", - "8wgCKVgCpAe4B5Mx7Ej6qL-ydbpp39DfTxDnqM0zzk4=": "4999999000000", - "8wibeG5TJBrqnMbcjEAD-MGBVlmdpmH_Uoi124Ujd-M=": "769230000000", - "8x2jYE0Gss9KHaozv7VvR00xLyQLKiyu0sVpyOT54Jg=": "843026000000", - "8xN50I04_iXFTy2em42ulDCZBfD3DkOR2dn4ixLgSPE=": "426044000000", - "8y7QbPHuUq-PeiLypdg-ZnFXWmgNGFE2V_o7ewJNz_4=": "1142034000000", - "8ydMs7eOf7W1D2T6z3U0xjCOt9LJNlXuk4xEPEgmmMc=": "569023000000", - "8z6CCLnWZznPp5eOB8ADa__04c6DBTGB55CQmK_mscg=": "459734000000", - "8zvgXR2WhE_NJFDWC6PWuKJBKVyPv89MTCm5VFMIER8=": "443320000000", - "9-0meLiWCKObNuhpR-QUl-aMvJ_EGlUHxIAsEeVIMrI=": "2084212000000", - "9-GkNA6NXelqevtwfWRN3trj0WjV8udiMD61Z1DIR4Q=": "4842257000000", - "9-lZnsYE1EM6lWZCsir3-r2Ho_deT7ymfUgCMyYc0zw=": "1470112000000", - "904r1sfmlxAL8lM-_aX1WecHlF4-o7-RPQ22ER-6YDM=": "378561000000", - "90DOrAPfhrTPuGnPuWHJDYI6mgQyltHH8hTVtVV_Jjo=": "919641000000", - "90Ghfo53Qu9Wm3a9WgYRfR18Cnky2ukkmDa5NlfkuP4=": "1702537000000", - "90oxIU-DajqVlsB9CUsJU3xHSegw9vP8p0vLgFkcX5g=": "385507000000", - "90siLMgK-43_ukz2jMMJEGG_1haf8Tlg190ddm_fg4o=": "453846000000", - "912fcXZG-kuLgW-Qhsp6Ztl0aI7M9U-cqP305N1a_oU=": "19075369000000", - "91Blz2M1zBX3nyyoYcrlZ1z9AsECMWhUcqfE2uulUuI=": "379745000000", - "91RDU0kJkPiqfXluDdhuE1Z-qblfDhCp98JetSf_C7g=": "15384403000000", - "929WIZLnBcj845oJ9pFIEr0COAoYhlpoDr38OBVegZw=": "769230000000", - "92LvZ3AvfoE6vrmDBpm7Jm5gZ9EWfXlMYliA501ljIU=": "757224000000", - "92LzhKjPl0AtIoCVNRrST1n9_1r7JCrhZDWxbAA3tpA=": "771398000000", - "92PdWRXXE4Z2LlULzgCOZts9DTV_InxxL2bfY63f8B4=": "884615000000", - "92QkYtWDTkg8hQa99HJpA_Ae16nfRUOKyXkG6y0aW28=": "2498821000000", - "92dBUfjgnx_EIAkT9uxbXFYRRHNPT-Bv0tDA3o1gQoc=": "527602000000", - "92fQevOgGOjMMzGAxF4SNp4pRwExBxJDpcGu9xNK1IE=": "2949097000000", - "92h_vy24_s5thoPBMPZcy9_tpxmqgOv5T4mUjgrVBlM=": "454400000000", - "92v0SIJEUa2KzOqcmPdKoVOPBQi6qjfLyWjwF3Thtzs=": "446725000000", - "93LxRf9GBUizIZSM5iptn5L95Pc8QOathRj8w9cYgO8=": "2641169000000", - "943oNs1RJxYIwzxW44v5QxU1w1ZH3OzsUEJhnsu6Zc8=": "771256000000", - "94HpjTAFVz79efyzP0hM6VB-TxOgWgRSOvlS-kJJYrM=": "542611000000", - "94NREtIXAa9ap9bfTMWgwWjl5uW6mE0NrMspb2VPN5s=": "1976252000000", - "94SwfcdyBHeQBNC4HJ30WFJQzJLCYyp0l6ICLklGMCM=": "3878668000000", - "94fJpgSlXf2KL7n6CghM3mKeSiccTfLTfEdqzh0KKaI=": "982646000000", - "94lUATdjBkHV4oy7N2wgfpkQn7hp_asj2I32sF4iFmE=": "4004256000000", - "94pexQgd7PRiUMOGiv3M0-SZsdxNUE0nH7t-7KYDf-c=": "1046014000000", - "94vm1_jk8d_9SMq_mKp80RwwB5HngJ77dPDNacDep8E=": "1679638000000", - "96QABHyUJWBenaLMfS3q1VZ2cDsi3VEHYAaw4608AWk=": "472737000000", - "96sZCnpxQW55i6fEBzWr6zXSDsvbFGlMFiRhU_Nwlw0=": "846028000000", - "972lSvQm1mMel5FSkAwofQ93P13RLnzXxz_ZIMAQXHk=": "407808000000", - "97CwX9WNMBxJ_kPH1W_CeLmj_r5wZXRVB7MPvLR_VHw=": "792970000000", - "97o5HgNcNMs2DEcnLZncTbtbNJq7vLDO0P8TwQIX7ys=": "384615000000", - "97wNsvxoTMF_hc2SPlK680QfUOFIZvmaUwam30_CdI8=": "384615000000", - "97wRKNVE6AO8DEzd1Ox5sZmzRNiUoVkdjKfqi6ZAlsY=": "386318000000", - "98Ii6jKY3jzs5NjXrPWk7YFIMWo18C7-wTmSWWxBFUY=": "385510000000", - "98RJxlgHhStxkT5P0iiRusdJgoMer8KbBbErEX7aXBs=": "555406000000", - "98_kCAm-1aRdT0zSndyVfxNebv4CQWJkl6Fl_01XUgc=": "809005000000", - "98s5Of9QFOEM9jw0TS8MQTGxDee9VV6GzBdvdyoZl0U=": "457900000000", - "99Jn-QynKSKQ7DjDrC-L1FUrP3gGJZtkHVk143VPjGA=": "384615000000", - "99Ym9sTX6aDmpcn1FqilYVN4w9LgEAkl3zEhjY59VOU=": "1315376000000", - "99ZZOs86ZhhjZBwAwU9Z-0ni5mYQ86JTDvK-TqQnn3k=": "390880000000", - "9AJMW6ecvUa-sNPljngVytTxj55KadvASjXDqA7II-U=": "3846153000000", - "9ArJ2z2SaxyTw0pcEh1OSlFrFZUpYQCVTez5fKhle5c=": "800743000000", - "9Aw5Vs-VrQRmmocGr8M7q6M8u5Eakj5wMHV3QKsImHw=": "4479603000000", - "9BeayqFX4XayeIi7q1v-rsSokb_SxaX6k0j50nPDmUQ=": "413135000000", - "9BepV3nTF4n-aG9ffeb1dyITLZobWKZSu0awtUtk_7g=": "537298000000", - "9BiX5JomI8wcR_Ol88bTvJ44hPeyIHY7RvZJM0Dwobw=": "1636307000000", - "9BnQhgzKxBQrnD3igGYw5NP9h0FmfEdhe7_PoB-tpAc=": "384664000000", - "9BseeHsfPlEgSKcivX3wqG0ClZbnmWdZ9nDcb8XsAcc=": "1769518000000", - "9C5zydcIPsx3wJw_lv_C-_OScT_ACOfyK__HqlMING8=": "363462000000", - "9CGs55aNryA4nBPnd8oN-a6BAMuSJkOU6pXm9J2-q3M=": "445981000000", - "9C_z_JaZJiXLZDi_1hufgUsuEnaTfIxZBbyWQkbr6xs=": "4036125000000", - "9CdIYEvj76rrH3tB8zndyWLTJyNi9nc7j9wgdLBrG70=": "1041239000000", - "9CetBoJAJnia9nEVY5lZtbgHL4k22L1_MFNM_uyuFas=": "1386434000000", - "9D3nH6zzMeCDiTBpZny5DFI2352RY31H5R1ME9Cp8UM=": "384615000000", - "9DH_pve6eQG_0vFPtb-5ws447lqI4n8VwNwNgGQFEzE=": "458682000000", - "9Dco-APF8W2LCc-vrdKQyB8y_dpeHd9CcCKkWwkmBRk=": "4072337000000", - "9De0KakI_kicnflXUQyQE6WLBfZmpVN6X9E_1qsdVOc=": "382083000000", - "9E4hVsYvHQ2XrnStQReUiVlRKyQ0FOhG_Kxf2zqbIVU=": "909090000000", - "9EHfcwXH0ULIiojBIxlcQFqkPNO8hKadvqTiTC_8qT4=": "691196000000", - "9ELji81elneDa0uYK2SqagbcLaa51c9mrVwwbcNZAO4=": "416779000000", - "9EifCooTrx-qxBU1gQMWz_h4Psb8N2yQZkX1z90-ONg=": "6447884000000", - "9ErDWktgg4ufskRsiG4xYWvD_W-muGhiwG2MZq1SL3Q=": "390816000000", - "9FKp14xmmk_Z612e2KByodgYN-Guvk4VeM-OD5dAgwk=": "3893163000000", - "9FUw6CcDh-vTo7xCKzHJao5a9SjiSGoQ6KayZSXcLls=": "1156520000000", - "9FbHtL7CImm9-cLkaahSLjIWmzl2WonHKVDxA4RbCjo=": "384615000000", - "9Fey-HxaROzazJXQlGcs3ZeFzWPsrv5iezS5QcNgEuI=": "556960000000", - "9FvNZQl24DrKZNxsWjaegjCcfg7qM8OwJd3abPR6TYU=": "749999000000", - "9G9KVHlUih5rAd-3ZavFbjVUK95-ayIqM6cDgCIChPg=": "769230000000", - "9GdYlwdwCGILmHicU_5_Q2tXveh3OZW1wL4Iq8ZMABE=": "385509000000", - "9H4SZkx1oNZf57AAKq97A_rsBGBk1PwkhTq80vRk4fU=": "412784000000", - "9H6tNQGW4Ytce2JO-Cxar4uRjB_zAkHpXt2GA_p0jCA=": "383269000000", - "9HGaCuwUULXYX4B7pEHlzfABnWtGnGdLJm5gTCFNu8A=": "1828384000000", - "9HNEmoBW2s6C9uW6YNIvsCuC1JvgSTcLL8FKNq6roNY=": "526188000000", - "9HOXH9KXeH6eWWx6yzkdU1KfImz8q40fp0wydzCMpF0=": "490505000000", - "9I5FrxdHfPpmL8SxTOGd2-KXjf_4nVxgypfgqA3UwZs=": "388549000000", - "9I7pcOv03U61LnAP7A6muVDdNwe65SZkudaMmKJRyAY=": "411045000000", - "9I8uXj5Y-XRY--4EqLuq5a3ytXcVZel7DGla4XFL8A4=": "462155000000", - "9J7XQhUCUrI-nZodCy1Q-a4q2_dkKvbblZuKTs0lIJM=": "1483568000000", - "9J86ifcDNVA7Zz6TtkSw3j4YYNIkmexg1ZjYzIP62SU=": "390935000000", - "9JhyAPQs9FHYm4eCLs3Qd-9p_WmJQLZSz5P2BTrC890=": "788388000000", - "9JmRY18Rm8EW30TWnye5zfkPfWoG2BmBYxHfIjFn8ZI=": "1424064000000", - "9JoAu4S73CGUO88_DT-C3O01uqpgjqlsrm6LSWsWamo=": "462839000000", - "9JsOz7fhPfEuMeXwUtrFia2wnWdoac8jOrzfWPK09ig=": "6538461000000", - "9KAYglb5aDym9Wac39H8c0eIQr-2Gm0ZKEqmf-14E-s=": "465700000000", - "9KG1pUeZoE8IXU2xEH4Zae3gvYnRPv5QxIyOkM2QQWk=": "464533000000", - "9KwJc8nzIrlh3KcQj1ZSfmA0mJhgwawaI2LXZBI67fc=": "833347000000", - "9LCfCH8SCDYFtZpIwW3zt4xL1o1fhTUTV41GIJ04M5Q=": "419891000000", - "9LMfGQADEKoVVAWubxMicqs01ZiVirxt3Jg5mIvYMQg=": "1319281000000", - "9Ln-DQBinirbgYw1KxOGqZmL2R58ShRTrBDqwgmOiso=": "409116000000", - "9MAAxI0OcHsUZCodQ1lhAFsrAhtVPolDq-Sc6B9RZHk=": "1153846000000", - "9MFqLdzh0MqrsBrZChXEtURAqPpcS2CN-wiEf8JYCaA=": "808371000000", - "9ML7oqt435-o0KPuzEI7nPJx0UntybRQEoabmciksXs=": "8292539000000", - "9MRvLRsCaFHp8kFnLyyc9W7ST1ksDxE_ZZSi6Ybep8g=": "1722765000000", - "9MlxzcoGa-s7Hdw1q0FPvFdcbSpbxS6jIrWbQFiGxXA=": "2735903000000", - "9MwKMby7GSMkicTCS8ZXPhK56pkzx5N1xomNC4hruxg=": "902748000000", - "9NbzSyAl8z7-LHqKRtC75XtbxiYhLIUWvyojd2CV9jA=": "976053000000", - "9O9ftcVyomXiP65UGllKEYnB2USuvVmitC8LDVTcy2M=": "769230000000", - "9P828qFI9styarhLZeWIw_KjHI9Az2JOvHr1MQDRuT8=": "522041000000", - "9PEqttbj7ZwR32RmMq06AlLmS9rDRCpH4qu5Nm4p8M4=": "1153846000000", - "9PObfPFfnJ714m4uO_Hre9FlBQ90DEDqxhR4uBKCTCQ=": "384615000000", - "9Peb2wstXja0namg7eW41XeFe6tbYqJMtDPfVwc1Vyk=": "455777000000", - "9PieNrYv53OCvV35jGTS0sFiQTzKwLPEzCfOTuwt0Cg=": "395499000000", - "9PxCpfaTr5HIaOAJzpHRXJX2q0Nadod_skfTIj0ezjs=": "422554000000", - "9Q-V1-8HdhCPbff2YXYiGqwLr8jsS_au4r_JjpYZyxk=": "1155075000000", - "9QIXGQZnfTAgwzNhX6RZi5rbI2Y4ImOppQkjnIrc05I=": "916024000000", - "9Qk9ddn8vfiOY-6UPAoPHGSonT9AD_-qCApyaXlCDTc=": "458962000000", - "9RUpaD8V2xZGYPyp-lEJHd6Pkrzw1ZnliV2fxy5HlmE=": "376816000000", - "9R_0A7hcKwpCv6E37eKCvbDwrHuflOipX63K_kk0jZQ=": "1250021000000", - "9SLNQSOWlaODvQeQa8UUP-UnpKv3ulw8Lzzqvfe9cRg=": "413226000000", - "9SpJAEQ4Vfh-kNNVITRUQWmWrfPnmqVhyiqQfTSrKB4=": "520293000000", - "9SqH4oXKcczjt2ae_V18XLDu8S9mi5fKBNOa1oAjpWs=": "499999000000", - "9TFKVd0NrSlucW53qPi-oxvFqaxT6BvkmsNOftBBaFs=": "1041084000000", - "9TGqOrbhwaWwAgbKT46xXQ0PSeB6DaMOAsErdNH7nZI=": "416673000000", - "9TaespNoUf0iD2Z421luIbBd2tVG5kZw_n3Ni6HvsQw=": "6249999000000", - "9Tr7BfPlCug9JaLqTQJ64OOxNL3xnzy-FSt70vxU1ug=": "374298000000", - "9UDNFpBmEhvc3e_REdpVWhQD-9eQdr172tTGGB9V1H4=": "616224000000", - "9VODr3f3kx5nA22Mx4FPnUmwmASVHG7Cytpm46go0Bw=": "470553000000", - "9VPmUPHQDttkgGI_2LOG6jf73TBYg9ZSeqA4Dqwnx9Q=": "19230769000000", - "9Wh6rVSJ9i1tbuvOr_P2xjfUlvFGoKdAV1VG5FT_gDc=": "384615000000", - "9Wi6A4JaxB87qeNzdVVvbZOGEWfwPIpdOsx6LVasVSo=": "4658103000000", - "9WigTaPrSJ854InryYTCOTLDeUvpT2nna6XLkXF8fZY=": "1391315000000", - "9WmuxCD3d8fubjNrqq8QxkuxPGkpOdWZKvT4IZXVHOY=": "381360000000", - "9Wv1j3oH6iocJzBcvvmh9npqkKl1CgRm3uIxsE-yYVo=": "554116000000", - "9X975cPUUf586JjOl_vl7duQd0WT5o9Iq4WjS_YVIgo=": "775269000000", - "9XcrEq0KILqAVMp-mVagEb5uH2CBanxzbbr4OKN-yQ0=": "1159720000000", - "9Yt8JvT_hkkM9BhokQEHLnaaEMmNsCknv51YHFqlAeU=": "447070000000", - "9Z00_RQ8VmyQsuFYpO9wvqcWvE4jmRrKrA43nY4NBCo=": "379344000000", - "9Z22MRi60KLdznRw1r_o8YYlKEGgB6b_2oXpEtbo6ag=": "385021000000", - "9Z5mZH2M9BhdGNiTAiomQhfS4GnNib0hvhvdJSAWNcI=": "384615000000", - "9ZLS9b2ct0vuM4u_HKQvv2EY8ABsh_HfT9ssJ-Jbbwo=": "412344000000", - "9ZnCECt53o0hCMMabOwmp1IT4QmGAxIE1G5lnFaDFmE=": "423004000000", - "9_SG_vC-fi4Ny6zXOzORv6Lxj28wMmZnW7pjb9JDtA8=": "488247000000", - "9_VPrAwiCmIGEHlM5dUid5ety2lFZ7kAX4_0bBS2yVY=": "1814806000000", - "9_wA2httZxKr8XZPqbVWaLhSFahRem9Yy2Z60BXZlt4=": "832608000000", - "9_z5BAw4QxRVMadJ9Nmr0t129DhLeF8ta7oOPfNqDV0=": "769230000000", - "9a0XcXxqD9U6KMdxj3cc_Z5xJkPMobKH7aZJvMB5nJk=": "384615000000", - "9a5Xu_nbOEtq_jWKFmdJR3M3F4HNHwEtrjGpaDmxMjY=": "565128000000", - "9abv-pkaTH3nPX-Jn6euoibr4_Fa2EZnFCPnMU-E4JQ=": "448838000000", - "9alMnMNfGIkoYJ4KsQ-WDuC2CHw9ZBs-IenS2BRiPVc=": "23090727000000", - "9auZ3Y1DRZ8tocsOBhkSK4-N6bSdPcZF9k-blO1ir1Y=": "385209000000", - "9b2VM94rPfzfxwBd15kWbILM2PQgQn4fEImuv3sYPZY=": "379528000000", - "9bHHlzuSSV0xEBM_8eB2lsAYA_0UREKSYECSgPm02V0=": "6616834000000", - "9c6Pi-q7kEXvJ8FFDc9o42IXjmCffe0BS5hBfKfnOCA=": "415288000000", - "9cFpgU1EcNi8oaC4nEVjGZbQ0abfbouALH2zwf0g59g=": "391797000000", - "9cQG99FcZ7z2-ePI_ts8UMOD-Z37eFhQXCLWmQKlJtc=": "3855075000000", - "9cQkCQeyNf-g6WD8bLamTi_6JxfFSII3uqWi5y1hfVE=": "461906000000", - "9cxwpo_SgEY6mYxNeBelG2mSBqFn6S2_V-SSax8qfhA=": "464300000000", - "9dBY_og10aSV_X8i2jFl0OdgRMMXt7-sm9Ltog7414w=": "654571000000", - "9dCrX7C9Fq2G6hyYpZFEKFmYrTG2fq4zB_UKiB3Ev_M=": "825081000000", - "9dT7_xMWzPfW7yFkZH1RlKJxlgLtjvoOgJgzPtabqH0=": "1236310000000", - "9diHqKm5AvwhX9BMUi7v_26eXr8A6Rv46aWQYnPtwbg=": "1076870000000", - "9e3kA4A1RRvKj4GWDWVVU-ohtQERgKLlRgnUM6c5wZQ=": "3307499000000", - "9eFiUTRBvRiwxBhyq0w6RzY_ArKWJyIAgSRaGVZwkWg=": "416666000000", - "9eZNitLjIEWUNQ8TOswwxs-N_XmhxFxfiBkH-vFowIc=": "463601000000", - "9edCtPkIRZjFZsnj5CMeWkm9yVZj7KRNT0B6EzEJ49Q=": "1560352000000", - "9ej5yFyi3SqwX0NwqP3XRn6tPfO4Zl3q9XE4_ZPYPt0=": "410736000000", - "9gDZ7VB9vbgcn_gmogViMnkTbE69s4_JJ9YAWyy3sRA=": "1153846000000", - "9gQXOlCVdDz3jl48z4T3JLgoaEFU9Sc1mU6RdllgNmM=": "415558000000", - "9gTyoEMpaO5-uXTcC26hEea8INaeawOvHr7sVDUq21c=": "381024000000", - "9gVq_jGBI8J6YNhVLS7v5yMlD4VCjfYC3dmOBba_QjI=": "7709733000000", - "9gpYetiQURY96zlkI4Q-IAjccE6RzgQiY-Q0HKFRvMA=": "1641905000000", - "9hWdB97WPt3bn-3JRA6Cxhi0cmyD67i6Afmx6MaasWE=": "382514000000", - "9i3HsH_i04krZysuu_dxeR-SN3LQnZ_Du9JLj6Ucn8c=": "887108000000", - "9i7LKIQwaZ4pls_wrrVF2y1RLZMwIaTkxqtmK1d42to=": "384280000000", - "9iM5yA3GcQ5Ffxptsa_9DLPvN3MePydHw7cd7NJTVrQ=": "473692000000", - "9iq8aEzxOPUG6w-D9oKHwrG-oor3_VMgy6U4F5k9jiM=": "460628000000", - "9isrLqPuoGG0pIUFaeQZrNrw2IptVVLJ69jOmbAHYu4=": "464131000000", - "9iw09Q6W2mTvbXgFk2PIY3BfO29zKvGBJpzR9W-i5zc=": "460570000000", - "9j909yHfJwYDyAqMNB6IavvZeZYHwuevsrgl_5gEI-g=": "1924896000000", - "9kP1Lx3Q-zBWBpAuHoLcocm9pxUgcPC1qkXvOT-gRnc=": "9613800000000", - "9kPfWNKKSSGtAJA41tELB3HT_O-fY8hyDAhBdWpNBqs=": "2038402000000", - "9l-VntE-ARJRi_quLk4pX1zVPaF6beBv93Ya66uuiWk=": "838484000000", - "9lI_-jhyIisvUxFstLpYP39IdwXYW-YeVEqh5wYGVfU=": "381943000000", - "9lP92339yHZKXDgFa3sFuTy0t28iyOQMLpyw1IPsJKk=": "4166666000000", - "9lq6ZyQ4S3VlKY90PkiTejoRW3GL6TCqCRXrlsl6sRs=": "1156518000000", - "9mKOjYtmftBqwrF3k5t-RwLck76OBjGIseftqTT4IB4=": "636148000000", - "9mLfh_rbnIMgs8GuSb9OtLZ77Ov-bAVJuKZK_D6MJnM=": "501009000000", - "9mbsEbdQa-HITvkY0pAQYwgQ2EVm2jDtQGwZuwR6dXQ=": "9384823000000", - "9monSapZLe7UXQ9_qHDNX-saX4nPd4fiMhH6XSkEJjk=": "384615000000", - "9n0jK5xBYW3acvu5xthMsEG1NlTpv0hCrmhc-CamGZQ=": "2060071000000", - "9nHO8rWEb9LcMeSWK62Wk5K9W8PRKriB_qm95d407M0=": "3270534000000", - "9nqORhZ2xuuMpzMIV9GbTcTOI9NM9iL7P8wtFkdIdYc=": "393573000000", - "9o9gLcUvULAtMgc_7ebHCWQ8JQIDA5temWJ63nG8nIw=": "1628076000000", - "9oNHvehDr-09rSLEn2bXmz61q7THyoDGRBlfjYcUfnQ=": "386403000000", - "9oPDI-ctbOHVET-xKRfjXfQtSxhDrmfeVcFILVyFyIM=": "642281000000", - "9pRBiPursA8-Tz_OPlXN1jYkf6zqwIkm2c2CQAb6tjY=": "416673000000", - "9pRqrXOdfy9otA4SvOF7Ld9T-VWbcUv6yHzNCjbBFF8=": "9242907000000", - "9pa0DKbvhKccW2n8U75YgPfaI_geKXvKk9Ld3kf1rGk=": "459796000000", - "9pcHcy8RpUiNLVjis3rgzZNL7zZsJFBF6heLUoMyDPQ=": "2322958000000", - "9pew5pNojK3Y7KZq-4k5Pbu8D6k2rh1xyq_Lkc0siGs=": "3007688000000", - "9ppRZKzwFApDp6BoaDdnB6ZuXTWBJfSzQ4k5fx2ogvk=": "909346000000", - "9pxpEz3TNrwPoG9bm0p7QdE_ePfIivJ4CswPOGa7hFQ=": "385505000000", - "9qDktB2AEnA0tRarLOa38H0kVhUVbzj-01sJ9jemw_Y=": "463498000000", - "9qNPFcA6MVtzEvSfAEHVLj_RlubqHL9dILNIfEPDous=": "419744000000", - "9qPM0lhW92wDMsJm7s_lDWY16rJzxJ1_4QaPM6LDyOc=": "893077000000", - "9qfuULLySI5AqdU01r3eHdM4qtC99hhESWxQMpLf7nQ=": "4225953000000", - "9sqrscokIL3DW9Sj-HXszVJHUySnS5HS-ilh3fM6Lw0=": "4706592000000", - "9sz95hcXM9AhWm468k3d8BgVo27AaQkYoyvaNtrBnJ8=": "829274000000", - "9thzRcW4ccNA0UCzsOEc3yOkaWT7ADKQ0d7QccAzQEo=": "391889000000", - "9u25q4Gug1KQqGRUHXf07PF5i4UxMK8-OW1le4Qt3rQ=": "384615000000", - "9ubp3RsuO_Jt6ct09reuUdVpihVyij9R70Bu1HtjuSo=": "665793000000", - "9vFBZsxvbOOU_nBk5eSFOYj1oDQgTl_nCq22hhFhGbY=": "454545000000", - "9vZ7Ml9W5CvCtQefVGS0GL7U1o9CWjCgH6MWDzO6jco=": "3200845000000", - "9vefvUEyJfSynRhmm7uFtZI9wAVuPzEgRK9qEHD2paE=": "385395000000", - "9vlU3vtcm-3aTdWXZZatzTmDGHUYF7XvZKc9gdaDSWw=": "1223425000000", - "9wEIEI7Kpk6i-GcoIqi1Yjpw6Zd_n2UI8SfRpbwnzS8=": "1225974000000", - "9wTnZ_3RmoGVXTRDMyC3Z-R9G5zswt9zif9Tm4pkg0Y=": "384615000000", - "9waT0YUsI59a-POUUIVwHF88fHadoOJ4zFnArQ5UeFI=": "961538000000", - "9wchZqrjAE-wBO7nDmR86dHHGnMbk7YTy8WOaJ16J-Y=": "374878000000", - "9wwObo0lynHomKltnDR-gTgScBV4M2mhlw-dvvD7neE=": "769230000000", - "9xZCc7UxN_5oA7SjXb3uCKoi41RoR713FCBc70PJaro=": "928736000000", - "9xjnoss-vX3mnfW9wzYnMfqPA0FAhwlNgQHgy9sQiAQ=": "453157000000", - "9y9fRcLjQS0dZ-raf9nsKA73SF7wLUcVwPMZ-dLMhWY=": "5547883000000", - "9yHrhR7eAJExnWsZxxYYI39tRsf3hV1fBGdZlnwTZ3s=": "384615000000", - "9yKZVhefKmz8w631161c1FZSIqzomJ_jf6QfgGCA7fI=": "1900892000000", - "9ySz4tV2w_BxqgM4k29QINHdB9ptjglQyOluq9Sb29A=": "759747000000", - "9yTF8J5BslelL7C9_lWqIl7jQ7lL1-xqT7EgG_7ok8I=": "384615000000", - "9zSsq1R9SWjIsaW9qJAysHQ57ZNs5D3agn-AGtDE4-U=": "916278000000", - "9zuYMSHSaQVKQIjNkZW97h8ClVO1WbS2Gr_jOQonC94=": "8275718000000", - "A-IaED43itsNNucVAIRBbi9yxAklziq3QnLX1n3sx1I=": "382210000000", - "A0GbekloVof-oZXbSpM9Uf4RnwtLpVVil4KpDwbYaw0=": "1219316000000", - "A0XkSOzinA3y5JOp1-qso8VjhXJPS9AAeRviypCw0nc=": "390465000000", - "A0oOjgSxOBQK9oS4ElgFvdLJQslSEMr_Bhc_C88Ax5Q=": "384615000000", - "A0qwRUxmJ1dDNujnw5gA8-3Uig627yN9-NvZaFj5__4=": "2886817000000", - "A0sO2Jtwp4eW4x1Xzw2VUmeDXrQjAYXH2HrCRFdZoOY=": "381802000000", - "A0vM6O0TBil9_uR1gyKaed-XPJBKZe-9kdnLsunEtFA=": "384615000000", - "A12L-isZ6t1__keVx1-RzXNW8obWpGxKdeseV291tHQ=": "604892000000", - "A1LS2e3os4tzjkQMVBJZorLuehXCtQhZpZL8iCdqCE8=": "2773636000000", - "A1mkQpQkSBMQHrStgB2l7jAYSKXkEDpuyBfTs3prJPY=": "384615000000", - "A2Eo6KNHMI2hdikRazSTveIIwUcFF0vCrWiLcctSTFo=": "378257000000", - "A2N-vEMKYPfi6IsCxPAahL_zjDjgls8ZIr_407-JieA=": "463190000000", - "A2Y31MNXKvi13Hd14ZQLolV_REkYcdPMqBqT8rN4meE=": "417632000000", - "A3E3rI9br5sm1R2CoZs3FtnVJ4LWGl2Z-07Jn8gcE3U=": "6134615000000", - "A3tMUjPBJEy1s2_z0ImGRmSk_Oh8DCm5H8zYZgvl0O4=": "1923076000000", - "A43T-z-NPXa38YjWbrIE6nLdzXhA4jtoMXntnkWUXVQ=": "764788000000", - "A4cdi8nPbSyw4CpTsgMV7ph_Z8E-OriEIixZ8i30ic8=": "3296032000000", - "A4yJej6KjPNYS86mKcZH8z6svG688Iy-4Al__VFFBAQ=": "1358221000000", - "A5iSZ3s4cKIemGw_WonVJgWkvMLVF53GeqaPTnqcccw=": "33204281000000", - "A6Sw1jXuP2Y8O3EXk5F1T1pbfS9DlbI02HbcR1GjoOo=": "450223000000", - "A6Yo45JJbnSorSczU7voPJ-SLyjwrkHzyIcmpoHneKE=": "1900892000000", - "A6Z662cq_yo5p5sXxi2fopVYVKJ3xSFIgOaMtX3iaC0=": "385509000000", - "A6a8r36yso4yhMb8cYTPqhq0kW5HBAiBNrYrc-NH5ww=": "769230000000", - "A7AnPNPR7pqB7iRwJp-NxCFaUK0fiOkwciDtNBGo1Xw=": "2499956000000", - "A7BdnMmbxmTENoaLFGcUkja1CIJYZrX1UFbyH8rM0w8=": "385040000000", - "A7DWv-6fiQSqb2ZgKNfYc9JHZIbZoWYEW3pU4QUfnRQ=": "776759000000", - "A8NgO32ciHCUJkqTc76DbsbrjRAxJxsg43V--5tYul4=": "3999999000000", - "A8UKfBcmPwqr97UoRkfcOy2oiw5lXuUvrWbmpN4vhDw=": "9811199000000", - "A8uY9Gt5lrgveS0iH5qfcVKNsIGMBNsbn1S_WbXWW30=": "492798000000", - "A94wNxLeRY90Lh0NtS2lBqB17xwRKRVB2PWmq1oG7dY=": "4201021000000", - "A981Y8WFFlzQJQDw_dfIijVSvoElDAxjqLrQ0MW1aFE=": "403846000000", - "A9QV-IVbvLmamb2SRW_4gZRqU-eBbzxOwkfdf6iLkmI=": "441063000000", - "A9qPG3MsgbxaZHWRg7U_At49p8RN5d3yiKpS2IWH00M=": "2476818000000", - "AA5RbhQD0hddULU3lUvaUYuVVuvYKkH783a059KdfqM=": "390975000000", - "AAG3vJwTzCcL0zp2-1yfI-mn_7haYvSYJln2xR_aBS8=": "538861000000", - "AAlsMagn6lX6FTg45J6Xa8wZs9g7p3bByg_hcL41OEE=": "1153846000000", - "AAyYagWu1mMRO2W5GQ3zoN0VwdQMv02UqBj87nIwwFE=": "455585000000", - "ABDDLH6JeScraMAd4vdMmbCeHQoJ9JAE00_jVgda0UA=": "384573000000", - "ACaVXpn3a_TcPHUo86VBogZm91TH25aPTG81B1cZHGk=": "378507000000", - "ACyWHbNFqfCPtubImyFr-LGBMeUH9v1DvcndWNtk4XI=": "499999000000", - "ADqjR00LYVta6pPm7cgZsuBU5jqgSpbYN4fzr6fBJ1c=": "411085000000", - "AE9YIAfvVIHQRUKwqgWwDw5RqrnX_ahPofK-LobXJm8=": "456350000000", - "AEIG8n-91DjRBy58sYTcY6bjr2ly8lZmHaA8AnorAtA=": "2500833000000", - "AEL2oKOqxS-sm8aq26qOD1enUS5fpVIUVGK0hY8Rx5M=": "384567000000", - "AEgjySjAeRO_0T8ZnfdPuCFuNdxF7dczJ2kyIZORlPE=": "2609588000000", - "AFHG9Fsie24WTYTIIMZtNzAWgvb5PnMc-WZq2Nk70dA=": "452425000000", - "AFQO4nTye6MqK8bS2oUeZZcId90z77pRfu5UqP6S7MU=": "351713000000", - "AFjLO0Bpqi7Qziq_jgh6s0uazZNx5lc-Dglk5ny3lBw=": "7472644000000", - "AGBqucHtIGWTSRPAFRegadJLbcpIp8vJt32PtSkM0WE=": "901105000000", - "AGIiv8X4qHke0bg8wDHViLiz9S_tQbEmyJ2hflNDCTk=": "382736000000", - "AGrd4WxVGUNFo5rMuqNCfYZMSDCYt4DUzpYPGwn_Amw=": "500919000000", - "AGz5-xtBphY8yoE7ix2j_0EXK__CumgfsHPRvEjmWww=": "462355000000", - "AHOvofjSu_g5OJni4MZ8vF7NmwLKbFArRTiE8phRGYc=": "391257000000", - "AHftrWcx9oIf6a0SKBeRUCgT0wYApAEcxcZFfsUM9z4=": "7692307000000", - "AIMdMsLVq-Kb4TnSUNmmXsc0QabEHCMecHD3nGJ04nQ=": "469217000000", - "AIxOxDDkz2ijdxkSLH0uBRcbRXBsXiEs8LabIUAmqZI=": "383233000000", - "AJ1_BGQXLk3y20MRsFSmA3l91lyU92HH3xUeUJuvV-E=": "384735000000", - "AK0T-d0l2zjpnNDxCpp420Pk72N83ASXN4pJy_f4usA=": "380005000000", - "AKLG4-ZnLGAAEMIJJa8PSaeIvf5ThZ0P8zxmvCEFCRU=": "416901000000", - "AKxSLMk498KINY5bZSI0XUHqYXZGYmYtv3oyy8x_Muk=": "385506000000", - "AKyN62A5G4xHEHhZ-d35X-X5woDGXUb637NiOtmvU5Q=": "500305000000", - "AL1oYQG5lwt7Xdnc87w4yEswfFvGgRURF5SiFjGX5pg=": "379329000000", - "AL42M9OmtNADMLdkhwEPM4H2wSrScsAvYFMyaRr-jCw=": "470773000000", - "ALTDC-Y4Pypi8gy3hfWBPPVQtuLVGh7msqpK5fOKgT8=": "377802000000", - "AM6tz_qWRKraIsfmAtxGXaj_ggxLyuJp1ihF93WQiXE=": "386888000000", - "AMLd0ZljogyMKzHg8VP2W1Tx1HbWrdsqP-7hZCTrdAs=": "2323289000000", - "AMbpONnAECq2fD7ZRBFCcmm6Hr8Z43OdYlPCR5pVu0k=": "1136692000000", - "AMcIGPxNzpCcNQhUrcRCwVx0SfTiumNV1wT8TqPVgEE=": "922611000000", - "AN4zW6udRPONEsWATRhEImIjDj7VksTaQJHKXzGugjs=": "384057000000", - "AN5OV3nUF-d6XWBfoJc5HnJ_oX3JAhmDBzGzcMVZMtw=": "455600000000", - "AN7mreLGb546zpHUnYmFeKVT5PJlCQbqD4ihVy0gC0s=": "467580000000", - "AN8nyyYZalhTe3zEUjRlzyqOIooS3EN2U-ZJIYYtTFM=": "464193000000", - "ANExpOgCcIN70aS4oGtmY0On2q0__pojkuv_mxs4ZeI=": "1926223000000", - "ANUDtNxGfoX9Fzjo_5lpaEzulejk4Va4dfUAuQBolok=": "764788000000", - "ANZCBTIZg0JIeXyg8RXnF31T9u3Ec_pH2IUFGnUvkmc=": "8312599000000", - "AO8wi11xxUbqCucNj7YpBsLYPQMiDdUmASyiORuzbUs=": "697408000000", - "AOOk4MOSJFtrznbXfgP7vb0slGMVMsZiHYkywBS4VD4=": "1538461000000", - "AOoUj3Er9K9vX2Ppr6WTjYeOb2unPUof3KdCFdu2M2g=": "3200845000000", - "AOxjfKL2D4pqQ2VK2BOg64R_c7GUWIMQxTTTZGwxeVM=": "597896000000", - "AP288SESug2ZSRDYGYiy_9Ck6kmgK93zdun_xKj1Z1U=": "412542000000", - "APE3-9rdAX4zkOp5a29Yh-1hSTC5_7xb0QgqSQAjnpw=": "907420000000", - "APoxni0T0xBD1JhAzdkJZcOxhrCokQDhweOt7Yy8f2k=": "387025000000", - "AQRmXCOzkG5LLK9QyvEYv4HiTrRH3dBAm1sv49AfUl0=": "715399000000", - "ARIjY6GHXVOcmRDSJBehmH7oI8Liq5BbSLWFIPBM2Mk=": "1219342000000", - "ARSiRdGNGFFkIoDxEPYH3SRDVy0Zg00xoTlEIGL7QVU=": "764676000000", - "ARxPCbv1n7fvoFksXSnXi29zKHh2RtQKStGMiahnBn4=": "6538461000000", - "AS5BU7t2yIEo04mkCQQlGdbT79X1VjGwIn7RqbKR0os=": "380723000000", - "ASRsrCyF0aYqoq46VGaJrP0DzXi8JGgZJq68aL3PZE4=": "906637000000", - "AT9KM5UATBqPJP_4mPGJmLYauJJqaset8PfjnpTkGxs=": "1249500000000", - "ATLsoSdshy6aNMEa3sVTPJIRMQRLUR3ao_bwZzlCPmo=": "833323000000", - "ATYajDz9uXx_cdMTcxPSPo8evF--GtA2zfOW1qpDqv0=": "909090000000", - "ATbWHKol0Z8vaZu81OMBNJxcCWkuGpiEUKhJWTt_MgE=": "471199000000", - "AUIL9yljW_rJzPnJzwmUv0zNAqVhW_jTsjTrGN6V2tg=": "459379000000", - "AUh0J0p-d9mfX2iSZXPVcnQCsIADJDHkC3MyPxbfYMU=": "459656000000", - "AUvFMhqaNCaRwkibWDcO-3MY1TvuiUCE5KPm0enszys=": "383700000000", - "AV-Gz6XkdWfgO2X7bhHGdr9dJJw6BTcI6gve_wezTf0=": "1526537000000", - "AVhOwqjrbcjvtWbjvnjjKIQ5Z_E3xSQh_ltTi8hT_bA=": "1126941000000", - "AVqnsAVWKPTKu3JqRqQpEPI22R-TH57i0HdNFbXS8_w=": "2285706000000", - "AW5RBWejhUtM4u0jJDah4Jx5nQnGr8jH83sQFatts8o=": "381437000000", - "AW92QewvVgFnjF3Abyar4sAAZRlA4KjuyfHyNa8jmgs=": "1243022000000", - "AWRnJmUmwHkwVnzIX5AP4JXhC0_4rCzEcoaaNzAIbJQ=": "1548420000000", - "AWYlvAEaWiRvXjAt0-7Ximgunpe1HHjp7HBULrNF5CU=": "385510000000", - "AWb_7n6lWKKLxF3emdPOPr2iAVfaGMGzuc5nzfqSPFc=": "756683000000", - "AWhBuxowjrQoUrPIbpIpqldw3p4saHvKO91RhcSFVUk=": "1125610000000", - "AWlVHrW0vI1rbXh7wMfgr26hLlBJV53D5oUN1JQ5TL8=": "7692307000000", - "AWlrde6K0KE6et1u1_xnAgszgQAsVKaNt2ldi7JMc-M=": "384615000000", - "AX_Zz4GHnwIug6qsodDtnAeemk9xFzwMjA1qJ92iOtM=": "3969178000000", - "AYUDhV-hCgkPf5XUZor6GnmwHcC36Ccdro3Mc4SkASg=": "5901881000000", - "AYdrXa6jo_IlfbTU2LEJ4YY3HM7wnjGQqYgDLtyMjBk=": "2088153000000", - "AZ-AoUnnbbW1FaLmzlCAUnzJzOB9_tod354aoJ83_AQ=": "394620000000", - "AZqq7IKGvB0UuVJVg-wbX8NQQStSFYwPyrl3F6ltVsA=": "454817000000", - "A_WFTnWio7NZoV37EN0a7PrhrM1-eOkJCFMnyRZWi_0=": "769600000000", - "A_eLO5FCMAOkkfVBjPqjvp95GcXjbsnWUsNmDtPwdzw=": "413274000000", - "A_pBEtkjlASV3wonbrpq1VFMdWCzShHHHAekoyYjtsI=": "848360000000", - "Aa4RRLi9VghySdLeNXN7OcPmA1RwQTuQa4H933JZwhE=": "11544307000000", - "Aa6v9PX_aCM3e3JEMseqV4hZ6MzB3MRjWF1t60pVimk=": "670041000000", - "AaBMimky8VlEezNjP4Mz9zAgZYwcyh6f4J_jKdhdMNk=": "5384526000000", - "AaMLrw65BQXSUQxCHyY8RHWpqxhCJzBWKCiilOMyPMY=": "415279000000", - "AaXawgDiHoib4-8zE_Xw-64NYGdR6-PpHt8Hbw8wObM=": "1261259000000", - "AaboZfy5oslrcBkDs3OqyHSUcUacuR8mSf-DOqgthDI=": "1155751000000", - "AbWimy--lhNHaUYt-tWquRXVz-dbW8Fb0YSjDc-PqnE=": "999999000000", - "AbtJpgO9uO643nsG-MCNEgHs2NLeXSJBq0FWUjOUNaM=": "452120000000", - "AcQlVhgYy4xMiTIIUu1A99UzaN2sKCE0ZNqa6LWuJWs=": "454545000000", - "AckzZJ3owKwsGbq49ix3lCuM44E_QixDDt3P8Gm9-Yg=": "769251000000", - "AcpxmB8qjN9zAnSi_jHwt0Ko5Ei5bea8L9M-NRTsTj8=": "393034000000", - "Acr5O8PujI-ctLqJmwECKGzOQ3SO7Vw--w7kKs5yqD4=": "478948000000", - "Ad-OSpV0H7bkLDhALSFy5_bAslLSdQoBuoL11vX-kT4=": "1385834000000", - "AdA6qy9-CnR3R_1SEjeuobJ2Z9E8_VBdb1l5jLpifO0=": "385506000000", - "AdoTC-YEf3PZAqqylQe3IXmb2b50fh82NOrCrYstzk8=": "377629000000", - "Advg2yl7Mq0GpIT2xNX1XBSMpioRPD2Nhg8-O3WL8FY=": "1504630000000", - "AdxZUZwpOq1xZB6D7mxZHM-Eih69CkundOpiaFlan1c=": "385507000000", - "Ae38hD80YS6bCMs5O1xM9s9w_q5iMbagwHTD4_CRPlg=": "2118552000000", - "Ae7VrwIYRzeysI0slO73FH_Jj5YInJ5afzZyC-Pm1EM=": "469809000000", - "AePF8Ax0A5cdodUXh1jh9QOQDKkwYvXWE5hzB1gdvbY=": "1999999000000", - "AetQj7VykadZeCz-HAIEHM56VkYnPzOygW_G_7VezI4=": "3863186000000", - "AeyolU_P8ThU8R8yCnws_iaz6iX6bimRdaHLhfyhVs4=": "461538000000", - "AfIi4kf64a6Qp6Z--2OGvEpEd2ioxQAs7xBjbjRKaQs=": "1000549000000", - "AfJ20rOPSM15ATRDoNr8moePLNX1bCqXhwgaeOJq2lc=": "385211000000", - "AfVPJDs0cqz8ONhrAuBiOsSCbg27N0uFmdzeduaHcV4=": "417633000000", - "Afhs5tPFPqDr2EnvPWWDUVTQBnEYaM2rFpl4tEdq3R0=": "1923076000000", - "Afn_IsjkSpaahJAdvg5znN82mtU3Q2hHPk08yusNv-Q=": "2279638000000", - "AgecowsJH19pZWAVH5JdljHsKy6gwQhhRLn-CO5p5Cw=": "381282000000", - "Agn-CNr7bxf65CF34wNSlYjW1Qsp8MKrlX9yBTN86sM=": "2055429000000", - "Ah2ctraRlQ0aG1aDx8vwKxBsZkhcFoAmylT1xAhn6dQ=": "422561000000", - "AhIwFCNhEzD6lR9FVWBXjAj-O_iKHXHruxTJlsJ7J0Y=": "1838066000000", - "AhYMdK7OiL4CgTChT6gvOB0vmeE-xMIS7po_dJ6ZGnY=": "381805000000", - "Aha-JJoLqpeuoXDs8C4-x7S4O6_fNaEF9w5FCTQ7ouU=": "1514448000000", - "Ahie81faMPVS-qbIDrQqdPdN7IRgL1-kv18knX_Y6jY=": "383178000000", - "Ai36erV3A0W7FGcUZjRjTdcW5sqv-nYcgrboUoSAf2g=": "617122000000", - "Ai6zTQz4fmoVKYUC8FTHMUlm3RP8JS7mfdUTBFTSIRs=": "383558000000", - "Ai7aYgbkYqb4Ny-Zj9t31RQWFkwRDc61bB4dzAOSXvc=": "772795000000", - "AiBnPKuZ2KRURXc53dvaHNSmU4KZVfjb-9NMJjomvic=": "465118000000", - "AiCxyqCOXl_J_DY_n5uMBUADNRpImNR-e48KntPe8sk=": "384615000000", - "Aif9tEOnr7xl8jkl_FHQK_Dl1QYgP5NqACxTwsjKwaM=": "382471000000", - "AinjrfQUmwG6Ga2_03EMm0FvR1VjAfy4g8RHJeGJzaM=": "1362114000000", - "AjGB27_UDBzsn1dUP0n2S6wQXWzFo47Xg7fftPNDLwc=": "385507000000", - "AjgaRSYeo0xjR1lieBnnVFCs4qdhpEFw5SkbUflFf-E=": "480295000000", - "AkC5vpa-RdCzpUYAuK3oYptPKKwGMmkuD-wsUoqtkVw=": "3999999000000", - "AkdMr5jsjCj-LNnga3DegMpFK6WSb1jp6gGiFdx7ER0=": "4032556000000", - "Akn2mUyHasJ8s4P1PheZzr9m0whdsZ_y5pie__eaqrw=": "873076000000", - "AlMIYAiW13q9EZFDg9bJbcF64gH2VxA4m8dl_uwv8xQ=": "391493000000", - "AlzagOg3TtaWuHccl__s5jXmabqOMMyYssPbry2AKcg=": "384306000000", - "Am1GGq365UXVvr1yLhM3YzSbI0_cvlAdsFPDalIekdQ=": "384615000000", - "Am3qC4LE8PcGIqoHXFpFyctwyth8DJoCh4GFuAM3MvA=": "391841000000", - "AmDCQ1oxH-HlyeS7CIrnRcEpcwr-6K3lm5KWCVUGrbk=": "385528000000", - "AmEAPevY0yEDZeb-0VHspEeb5m3w9ckEiT4_jR7JmhA=": "466580000000", - "AmMz8F7XZClRViKw62SwFacl4wIZApeh9WVhnfnPKEU=": "1578823000000", - "AmVHujYkbOjJYeUzrf4bPLjj3hkfsx9ZIlzI6JDDQsI=": "387499000000", - "AmvLl801EwOKFY8STcR73h5RJ2Bk5s3fi4sKi6wiKww=": "427712000000", - "An-E1qiKqxSsTngjq8zON1AcTlEnarFckJPWgvvwss4=": "459689000000", - "An5adov4FM93U0UTGG7Q43Rn4TaJiNBlojxKp9UD1jI=": "460990000000", - "AnsLKlrKwBC-W1hHhopDSH-FggMIWmNaPa6LXkgvjx8=": "6478774000000", - "AoMM321wwnHr5nJfBAApbquKtUbW4dUVmbtEVS5YFCQ=": "684830000000", - "AoQk9dsISNrjQ390HwJAy1evLoBBfUJhatG4YB2bcVg=": "2046556000000", - "AogK78_I74VdyQunRZLdgdqh9Z4nMGHDND1FIEjJ96A=": "464470000000", - "AoyZFQ83AN1d3bd__CG1Ohlfpf5495C05cnj8R8bhSM=": "926215000000", - "ApNbKpkJBqu1H6t-da536dydpjWzceQwgMACTYAfS0Y=": "849795000000", - "Aq0uSR62UcwpPT-CpAlH9kJogcXRyIZ99CEnGvnmO9E=": "2055429000000", - "AqI2cuA5Rjafuo1pmmItEPNwcjWrHfcgbkG_AYG9okE=": "384615000000", - "Aqs4vL2PJ6KYxNyAo9xVqDky1-HhtoItEKX8blnfPKI=": "504545000000", - "Aqva0IsLbRGANDyoekLDCxHjiVAbFXH4tHc3ryvQGJc=": "464104000000", - "AqwNajgqEpBc20ZUKSbl6BEk6Jyt0gV9bHlxsrqS-kA=": "457053000000", - "AqyHr9LrOMPD53o0ynr8_ebIc1siZ_7RRIKP_WkGr5A=": "576923000000", - "Ar9_MrH4lvo1DqtTo6H615JSj5K2V9i2VVc9iDzeLd8=": "849732000000", - "AsPj15TTsgkYbU0_T1TZkynZSj5HFEOE1GRYTW0e91k=": "5042296000000", - "Ash3leApd1p1sBpo6Jmsp_x2J7NY1rOhH59jNZrYzAg=": "2011756000000", - "Askh_mWKxfYJUfdh0_mKctK3NfJX_uh5tlh_j2-u24c=": "777878000000", - "At6Fvcia7dsGkS6iBFUCn584IRHag24-2UQtItUziQQ=": "384615000000", - "AtEAMxhbtnoLL_7BgY8zr_rilmqalJQB3d-v_YjYUKo=": "384580000000", - "AtVeQAE0iN62JhetONLSHyKSEhp-2WSUQyNHKfqXCWs=": "1923076000000", - "AtkYYcbs1lq9_AUlhXf8O4Aj2yWB8fvibbvxehTdAJQ=": "1927545000000", - "Au5WQM2c4w1LPvAAmHetlDqdnniOov2V9j_sXYEk8Ec=": "3846153000000", - "AuGQtZw0UoSR2Tf1CyUP2gIswnkUfwxSjGX9-07m7SY=": "384615000000", - "Av5eAp70sIHOH9br9EXLXPZru3XH2-7a83gicd8gDCA=": "412505000000", - "AvyfJXumfLY57bI6Ar6yiFX_Z3y2v56GjkJLTSVxOEM=": "385505000000", - "AwKZ0o8SvS8slN-TJQWxXUxNPot_vpW2s6qS6D-VFmQ=": "1249999000000", - "AxGnupbEMskmVknrUTfJaEuDJzDB2LbA5qlv0WaXbpM=": "769230000000", - "AxgfqHD2hDJmA_uPmNiGHYyLRtdu_F5l6URR9PQgS4s=": "384615000000", - "Axhqt0P_D9L_RrvhBAueQlZHoYp6mAS6inUbg-n37D4=": "384615000000", - "AxkloToxS1TJIHdh4QGLBPosNd2wzT-rP9iEmCoHeqI=": "510841000000", - "AxnLhweA5x3LFkUBUZLMktt5Qu9vWxcklTlyQlW5BwU=": "411969000000", - "AySod4_PYPUEflexb8uOBI7JCFFmcei8vtsV2G0v_0A=": "413846000000", - "AyY88K0RzBnk9vCxM-7Prp9UEJdQioUjX_1W4CPA_J0=": "5926824000000", - "AysMuwbbFEbvz7hoctwYgWQUr4vh1W4QtiR3p692DZo=": "416666000000", - "AyvH8mJ5Mwo45qC6f2udeWmSb3XsF33_bIXoRrYo_iQ=": "384615000000", - "AyxG5IHNEbcdq0s4L2_TX0ntIUUfFnhV9fSELG_G4pQ=": "2034292000000", - "Az6Oaclv1q0SDTGV_gZ4XAw8Q0nyMGhMyi1dgKWcwCw=": "411085000000", - "AzGookv2lY7fC_G5PG5zEo4SwjO2MMX7qneBEXHtEHE=": "4225618000000", - "B-BbJtJSvl-RM4rNia7fHH8MIEKoJYscpr9KLXVrXG8=": "384048000000", - "B-vVRYr80vnR4LGScgsTSc7GRbLur7ApAXuhjm1Yrlo=": "496282000000", - "B-yNA2dMy1QKgrxujKByfYcoISoTasAG72gabUFlPdg=": "410047000000", - "B00Xu2ChwZ1g5tLAa_prN-rrhogosHqV5i_I4mDGKQo=": "11538461000000", - "B05GhAzBk2sirXdPRx8F8XRbrgs73B6VYLenYkIDp68=": "1178432000000", - "B0XGPPlvFfIQ3iXiSjtI8qbeaXRKG4nOGG3yGrpBTXA=": "3734902000000", - "B0ZDY9e9vyHQRXhM6aM1wjEtBB3hXS4GllonbylV7tw=": "384615000000", - "B0iYBoM7KgwWb1kmCZIt1--zZz53yUEqg7DOjUSGYeI=": "3831778000000", - "B1f87PpFI3CSXS8nyQWdKhQukRAAWE6BqJFW3tX2iwk=": "761824000000", - "B1o1F2sZ3l4j3PC1hTkdDUs4PJ_gKGgff3EoSDQim4w=": "416652000000", - "B1wBx9h3hd9NjWXZEsft-JallG881kWvSWYr_9WkOJo=": "954086000000", - "B279Si55b94CdSmxzaI5hUn6J4mcB-s_l3xKY1rUWa0=": "809021000000", - "B27teBBlrC-ynWRfhgpuPFS7G-t3VcPOUE3LwNo6R9E=": "385509000000", - "B33ytm_bcX40VyK-6168wltqG7n_kiR6Hhm1Re0xWEo=": "3855074000000", - "B44IzDurH8SCLojNfRjI77jkBEBcDJwoOIQPXmNwaQY=": "413030000000", - "B45L1-IN-wAS-R_wl2BTGdzMHZiD34lPuHJCH3vDQkc=": "382130000000", - "B48myFKxLwLisuIgeAaMpYfbrjm56cRav_98Zw-xmy4=": "385506000000", - "B4Bg-AWzceORR9yAP_1KPMHRLdKSQDmQBI5Q87T71cA=": "455600000000", - "B4WIg9D6OIkmTpVSKRa6L89NKA9uSJC0LlIV0qLLlMo=": "387073000000", - "B4j7xyz_F4dOXdrl8vyXG_q6NOFn_bwZoSOocImjgyY=": "384418000000", - "B4lQP4jwVW7JgC2xn7eN614X30l1ltWBZgGwJuHU2iY=": "5384599000000", - "B5BRUdWjb4gAkyqe3aa6LXGbUjLzzHHcu3DcofuRILE=": "416666000000", - "B5WBwTaRBzS47bWi1dANrAXhqWQDNPok2PFQg6kAyzw=": "4999999000000", - "B5_59t0jtlohx8bsYLEaGH92mEFTWdC5GmKSBhR89LE=": "2734973000000", - "B6NxpMWdGJ7KQ1bHXx4JQSSE5mfm-7MlR3gQF9zH758=": "3256987000000", - "B6v53zwna4O7wTziFa2D5RO53yWN7M51ZDwHJshYMqE=": "4545454000000", - "B7CuqGFAeQbuOOSX5vCce8A0XDnSgqVQWCjs2W_gnF4=": "468609000000", - "B7OFiKwYllIvvpAbaUNHL3RfjnO_piWmtsbDReAhfbk=": "996490000000", - "B7kZKAPWhBSwwkcAkLycdhfEAgMF_q63Av_IMIs_2kE=": "385506000000", - "B85nWdMm92qo7oYI0qhctrdXIC5xYbcgik61ELuY2Tk=": "1705504000000", - "B8ULXieKJlhXI5Y1kx6_tiyz_zcnvUh2L-xg3OgvHBM=": "908871000000", - "B8aI5fAAlUOy5nD141--7OsU-BeBcnENw8ik2W37xr0=": "452367000000", - "B8aoxyO0xLhuy1a1LiAn2AriP8vcGkPTOb2bA1hh3Oc=": "478213000000", - "B8czyv-f39yLt2eRFTA4Fo1VduX-Xc1PULCzia5TAMs=": "768362000000", - "B8qGhOIuZuSXzUHvPkZ8OQH-EGnEM65UWHqBFTtccvI=": "416666000000", - "B9HQuVzcK7tvB7EfPDKdPSGaMEDsTCCV96CZgUGK0ss=": "1156517000000", - "B9zjzYbxOmq8sWBS6ydSdHVAvn9LdiluTHfX9aHJbGs=": "769148000000", - "BA6sqVacdjzaUHQ3i4CEAnOVYAx5M4aQdM3FTs37zfs=": "731894000000", - "BAkg5oUGtXhKtcJJKmpzXRljSbMBg7xFzZ2dMs0xFA4=": "394154000000", - "BB11rkpMHNZQlEhP2hdC-plk7D_rxE6o1-Kj1ii50YE=": "374246000000", - "BB_1LMB0NsYvASFZRbAKdLv4nfwccZdGi_DEOx6YMk0=": "385236000000", - "BBdHWC54Q1rLolysvpqbxbR8UB5TJR1aqNH669QJ8TY=": "4598872000000", - "BC6dFkVCrlQO0pPqMMtSLOvyYcPvT_5_SUxfmfFAgR4=": "574786000000", - "BCPzrvD0bbaxUckUYMDJNBdZvjAwHsF9mP5nkGaIw0k=": "634347000000", - "BCtjkhFqCEI9_kXNlQ0aECB1KOJDmG9MTNIac_iWCq0=": "1153053000000", - "BCvFrkW38_c6BmP1jngpQ44bVuC0sLcwn_pPMfr-cGU=": "407560000000", - "BDIL89cWkLx_xnR_WJsbFuLO3mwy7NMSari6FbDt2V8=": "2083333000000", - "BDKzchVcqDECcvMREuMXqwjjx8n_D-EbXVKpMjQn1RM=": "2646555000000", - "BDMblh2CfXc7fy34UNZ2zYUTnOimf9FsjoOJwckRAag=": "499999000000", - "BDaurAxSa02tGFvK1xO7ClJK2zwGtgdVO4_NxcYDU-s=": "458095000000", - "BDmjsdUsOfjWhjF8B51h8oXH0edeMuNgezgxmCOFVOA=": "384615000000", - "BE26hIsBPiRLbfsxaTRTR1C4aQFrbMWd3QVM2FhWgac=": "455600000000", - "BEKeZ2ZMnCoScNC5oxxUgjz4Z8IBkekpC4kGPSD-bb4=": "1341169000000", - "BEeQkvlI0e5JnrpRc67ddPw3Pk8wkr9E8OuYIEI2FCc=": "826222000000", - "BEgVLkJtXmeSHtT5qrJIwn2zbm_byigufiGHUivCCnQ=": "1893060000000", - "BF1650_AIVzg8KQ-2cm_DBjzlbKOglrS1wWUjdIRhu4=": "4044787000000", - "BFJYL5nxyZ0wzlj-fenYHhFBfGD_RyIYhqDdJeh6t9Q=": "445981000000", - "BFMMrf-bD77UOyG4g0IBNC5gBi7XKvRELpGENYdpsY0=": "384589000000", - "BFTCXECK9Zo0C4eu8KxpNZQHfJlhaxOGZoJdylS0mUE=": "769230000000", - "BFiikw36gghnXWhnKU_bbndLV5TCE2ZUziZeqD7T2hQ=": "4467894000000", - "BG2UuI8lV0LFzJk-fCI4MdVk1w-IFbMNbB55gFABvtE=": "499999000000", - "BG5DeJW37_DYQ-wKsD9qLw8J75PJhmiJYKqt-2sFS5w=": "451653000000", - "BGHlHJeOuDg9SyuKSQCUpicsjhdydjrS6v1Agg9l6To=": "600081000000", - "BGmuPjvGlyC1vTOl3JoZfqnnETdVZIs0MX1cWI-0sMM=": "769723000000", - "BHhAwZKOqg8i6JjEgAtGKPZYPoHaH2xDGworNYKwAtg=": "459734000000", - "BHnXJEAISkBwZ5HZ_OmkmMlN_A_z6205Re9L22nTs4Y=": "384615000000", - "BHnvrHxiHtRnH9q8Kirc9-3DbFYDhNCer6MDlQ_m5N4=": "901081000000", - "BHr6AgnA4BlUimWGQELis3xHaRuGm1IuQMTAoBUM3FI=": "2958333000000", - "BI4AYsWxhh7UvyHk95ROKLgWrEVjnj6PgcWKKtcCAlk=": "446815000000", - "BI8ZlFs6I8vy7fAGX252frErf6jtEHUs-hZYpiFIeR8=": "1538461000000", - "BIekyQaWtxLE1x5WL-a2BAF4Xtnzx3y3dPPSv-6yAdg=": "420680000000", - "BJ3UE5FnXLr3_UgAG_LpAk2nMNzFzT6tgi0UZMf8-mo=": "569966000000", - "BJ5i0QB_Tzwii3SFkEd3bqjeh6au6GGZ3lnDHj6lfgI=": "1642956000000", - "BJKatsl1VREaO5z-ZELYVBWzoBRNlSinKypUBD1p3BE=": "954279000000", - "BJOzKdouSslGEcrViws38vn42MLXT7frmg4mknyL7Fw=": "384611000000", - "BJe9PhQYNQPVTOko3ABUhpVgt94Bv7pgLELmQVqf8Ew=": "384968000000", - "BJgsqS8SZZ9YJ0zIMDl-5tzVWYuKpBwFv94jwCSjRUk=": "419044000000", - "BKFeEAjjt3H-d7-WQKQl9LK8ebo15ZeIpChhZicjR8Y=": "384615000000", - "BLNC2cgYJoILust5UdLAHp2kIHz-emWZMxdUghhvk6o=": "780792000000", - "BM1vJaHmrFMOphKXx5QI1l3TkyybexHdgAxfmhfFosw=": "495905000000", - "BMFu4sIgU0od0RGXyGyj3jIMQN6e4lUEDNRoCjaHJn8=": "453601000000", - "BMK90DOx12A9ud4XCG0QUpCOjcN6zeIjtvI9h2x_OCk=": "477575000000", - "BMOHS60IWu-jCYNJ4RUeXINXitgUjdVp-blg4wX7rqg=": "385006000000", - "BMhnuqy5E9WeM6nagjKxAEn-kajZ8wDkw4O6hT8M21Y=": "2307692000000", - "BMtmr4B0ycU8rFtZ6gDT3_x2e7TPvNZVGPcKW9meCPo=": "418315000000", - "BN0XRZZ_uGQJZcpGcMIOeQWMc2_nbL2Mn3yM7qeOiAk=": "468609000000", - "BNDbrSowtYYqiUnlUej8cgZp4iTiqPQ1dkVzfYTKFas=": "1564646000000", - "BNO8NtWPMz3_dbRaQJr2hmBZvbMVZgr3HBpFqoe7G1M=": "451707000000", - "BNfhYHeZxMlsWqqmsjZLsoZHb-pU1RGtkumCPCbzW10=": "387983000000", - "BO6GlIMmSu3pNaI-egLYwIm5uml-xDWRblO_GUW9r8s=": "24836441000000", - "BOghlMXv-nkg0rohbks8ZwEafYIHeeooJ5sSP7qEv88=": "384615000000", - "BP6z60TleSnnU6O8HW3gncELqwqzlfobEDMsdIjwYJc=": "418720000000", - "BPXf2l91VKX4TjkyMbCkqvo2Ts38KTcLy9R1l9O_Dl4=": "1362391000000", - "BQ16flQoHvGkcJxCFmde4WIT63XCl-P3vHjs-ommkbs=": "1153846000000", - "BQRnQ6-MIWkV0trGo7v17uyDC7KtS1ef_XKi6WqwXeA=": "685838000000", - "BROyWs6vjJdLHkBdYA_mK5N3b3wni1Cq7DzMcNoBJSY=": "452559000000", - "BRcPybbEC-ZpvoA5wVoOXxOMXgmvvf2PCxKxEljVbXE=": "462050000000", - "BSEOV-1Iet4E-51ADOxjxAwCTy4pjvPk7HPY9AmM5bk=": "4153721000000", - "BSIbH-7_au1hLEPQJsjkGcbViT_Pb1BatDplQMyCnvs=": "387931000000", - "BTGurva-Gj1ylHtgGta4S9ySY0RLJ2Z2DHzSNQB56JQ=": "378341000000", - "BTXunUwQu71TLiL0vQtUKAx9aiQeP8uhv3eM3ESIUXc=": "385506000000", - "BTXwmSUFN5_-UG7-uiJMZU-EWBJO2MBXo-9IGWnAmh0=": "909090000000", - "BTiFERYptPds5LJehcgYesvcIK7ixWajJITzKJno6GU=": "499999000000", - "BTmXMbF2OYr37II_4YyCvM03UG_Ckax8NNTT46YVB3E=": "402470000000", - "BU8Gp01mqhud3d33mwMs4PdjcerJRRG0s9BbWux3U2A=": "431835000000", - "BUJ_ZOV4Nj5jaEDBl9liFlAhvHXeXT3nqheVE9eLSHI=": "384300000000", - "BV-sNFYR3dJPAjpPNtmDFqyVlQ4ZFlclhneCSi1O7Ls=": "384280000000", - "BVh70qVb3uZTqtoMyTmZIEoVfJA3yzNAGHkeoQS8PIc=": "465068000000", - "BVsa8dMKC-edM32pxLRso93WUKfzcr9EJ8RBsfOeeXQ=": "2001906000000", - "BVstmki57VJztohf2RxF6u4ZSyx7XRvANWW_-5ypLJw=": "766000000000", - "BVum0RdgL7oVgmXWEfJ8ozCOyu0yqnZJFmJMcvznvVI=": "1193504000000", - "BWAOFtZiliwx3Q28nIc1EoJHuyQZ8vMd1ebDRMdOG5w=": "1386178000000", - "BWnKf6aBRnlWYhNYKl-uduxuEQFe6YIwFalxNff9YfY=": "5827699000000", - "BXNRR5HbG5SYCaD12lmTamTxDev1w5Vp2I0omZoo9Qs=": "416666000000", - "BY8leAzzRx3SuMRRluQARFT5K8bd8SkElPE0Gw6M5NI=": "754689000000", - "BYD99DZFeJo-M355zdjXBHxpk5ScP4DnRFDJuB9tdrU=": "3771567000000", - "BZnKB09tKKv3lXIPdHEmCud83vTOIKs-Pc9XzJMQV2M=": "455600000000", - "BZuekv6g2fOivrtzp_heLiEh3V8cAUiebIBmGVGlLU0=": "502605000000", - "BZxDQLqGsEgFwCAiDfD5ylOAZRnRx_W3nitzwaDFNr8=": "446550000000", - "B_9EI7YmTMF-MwI5p_UjdOZLCxp6xGP253yJh6_fvKk=": "380005000000", - "B_iXg5po4MthG08EqOrcD9Ok6QK5qVdc-f8AGTN1Tkc=": "653846000000", - "B_lqK96DNUxAjtHVWFft9QBzJG6r0BoWVWLXtfK7gT4=": "458479000000", - "B_vRgSIsuhCEtshw1Z54r_HZu2bz8aaEBsfm3gqj2OE=": "413620000000", - "Ba2Z4nAOQ3dKCvn2OGUH2NO3Kdai1KKko7tIh3NtyPs=": "483147000000", - "BaOVZAKk6ohiRYUvTRJzwW5xv9iHAyG3IRWJxtkj2g8=": "384615000000", - "BaWSAsl6GzSLeTgI1RWNCGVympXo345gR4ubVmKE3b4=": "384615000000", - "BajcJOH-T4fL9hr-oRMlw9gcrPIeC3l1UddCawxRktE=": "411085000000", - "BbMpr_3TFtmOGVov5bDsN_k-E5xytaQI-ph_IqgM7P8=": "380551000000", - "Bbemom8tgMCVcZnrsiFXUiq8zikCu02uAE7JWC6xMW4=": "544660000000", - "Bc6mtZ-l7Da1lemPP-G2kfl5PSOaMZFgaOlST8t7O1s=": "385697000000", - "BcDfybI_qjQfBByLXPjs7q0go0k0nau0B7OVgrTw2Ec=": "417630000000", - "BcEs8n6eS5oI90yTnOX1epqWCOapsDsB2Os3QFPhnZg=": "454519000000", - "BcN15yKgDLCMpSW9v41fgWfzEBHHTay8FJo2tNRfWqo=": "1635808000000", - "Bce6amtA5qM4EyN6-KK9cE0EafBds6Cyo1GaTUewHXg=": "763781000000", - "BdPLdGGWRUiYDt9Tu5LyLjZq32-ciF32DxC6b9V8_iI=": "447924000000", - "BdWDl8pEdwhp2sALBKPuGO9ntAp6cknSrk2k4iOIM7Y=": "488964000000", - "Be9sGfV3fRoowDdsogulNRWh_pUMyCGNNYy44308klU=": "935034000000", - "BeDmHxkz4MmAw20ofLqF2mumMb3Da6NJ8i2Vtvr0wTg=": "13807924000000", - "BeZA5TzzlQTFPMtGYgXsyg1kvMFwJHsCxIpRFIrTxuA=": "404548000000", - "Beg1H_lFr1U3pP3Wat5ByR_D5SXx2J16q4Hkrlb2b_o=": "524709000000", - "Bf08Du8X6_9vJP_7fw-8SWmO88Jy-vvjkjno2EkQgZY=": "447840000000", - "BfCKmGmvyXZPFJVcw5XZPMsfN6VWcplJKFu1LtI1Ok8=": "416609000000", - "BfcmrGMXYsOHroflZm11j5ggSbRjbCbGdnjeTOLaDUM=": "379344000000", - "BggNCclEpc_OCyIrARO0qrqmhxuNF_TaqajJCUjalfc=": "8824989000000", - "BgnQHuyk8xU3QDB8FyX2nz3ZYXyso2RrWx4qcYuGdLg=": "650090000000", - "Bgvj7rCuZVsLCzoWwu8wJr_PpOyNvdvVGYNgFQUlX7U=": "5013093000000", - "BjQWnxAiLBmvfa8ewAO4aTDbBYeQF_fDsL_75C_Rkxg=": "4166666000000", - "BjuUlYyRLkCw_RmLfMuGpLhnF4owxkCuq8VeTdlr_C4=": "3844114000000", - "Bk-981u1yMOemA7GzJvgzHG_5hQd41aEYywNjqOScXg=": "3773793000000", - "BkHN7O8OiIJLbytJKnUou2rs12LJYPCgqzSPlrQUZPg=": "468862000000", - "BkQrJeQUXLyYzNEyUk3H29jNs6xj4ljlEH_ov09BjSA=": "3415866000000", - "BkslPxW4pW6SCe4KAn0z3YKU8oIvSs1pz9WfjnKnia0=": "455600000000", - "BlJsN-W55cHHg-ilQGr2-nCiO1xt1CwnGr8HQN-NqtU=": "635315000000", - "BlXkOpcK4M7xMaq8pTVoMWAcFJvmXTIYs_4bKzyObjY=": "384169000000", - "BmJeVfPDb5VAmjD0nhNiCOQk_P-qpUTWgRJABZkN7H4=": "467018000000", - "BmX-4pWdfH4XkJB5NLv2pd-knePecji4MVxhlmzsRI0=": "389081000000", - "Bmc7QCBef7AQSLyw4ZcXdPuXVZPcaxz1PTkWnOMEwOY=": "384615000000", - "BmrU-q_Zb6VeUI0KBbK1BhAF1llRDAvY10r08Eq5SSg=": "454791000000", - "BmslHRiJSzM3MJc1uz1Yd5UorpXsvYWqXkK3jJhG518=": "769323000000", - "Bn2i4ialYfPX2Plqs0uYqM3MoZHnGKj9YHstw1TpHNQ=": "1376357000000", - "Bn8EKcF7c7bzZ7htpUHnVuKt_NjDRvAYB71aZgAIdd4=": "378341000000", - "BnLFaXf0ryswg46KW46TGjJ1is5OQUh1V8iXqBFV61o=": "2281729000000", - "BnhZJgyQDP_z5irTXF3zKgvjmXHJb9UyYUuE8HfBwgQ=": "1923076000000", - "BniW6rN1E6rx_dcPQIQLAqGUV65F-l3quM11bIbpAf0=": "943995000000", - "Bo68-QvgvCrBbrZnNsefFVSqAoBciGSo3Sa_1HhK67g=": "455600000000", - "BoRux2k-6kRf1t5kJai2EwLZXIRHV6oRHvsfgYcASws=": "678830000000", - "BoaO7GUJYZKsBjBga7lfWSnZHI63C42yiN5LByiRZJM=": "407808000000", - "BooltBmNR-y5GN7Sc5F8oNmCG1-U_u_bnj0of9BB-Wk=": "450623000000", - "BotcA72X2b6NkKvBA3Da9x5XwKYwFQV-wyLQAMYNDsg=": "386056000000", - "BqVbqb93_5xszfmMZgl6Hyuq1A2-0Uyv8OOu12eyXyc=": "385156000000", - "BqacTxaW4hXizPpVB6R3w4LX4cjlAuxApGAaL5QpuSI=": "657794000000", - "BqbnWcD2bZ376V_E9WlsopvnjPwn68csU8ZZWUOiHyI=": "1471209000000", - "Bqh2e3rtHrL9y7NZK4h9preftTx6wXKLd78Tdf17LR0=": "385733000000", - "BqzFBScG6grO09XQf3TSoMSe1ZHevdSlU8ReVHQqgx8=": "2005371000000", - "BrHyxvY9A3Brl6ik_p-JKXI1i_-HgiNS63u7jVssesw=": "385506000000", - "BrleRnmN_4FawspXuQq9GbijskEnYd3E8bcmnDDBmSw=": "62363921000000", - "Bs0t16AXcAuCDEsTak-ffaNNJQ69beQR4h_j5lhQuc0=": "454539000000", - "BsLJ4FjEKYBv4bAKyPCM9-kSd9Ok18UqobbJVjSxZvg=": "7689721000000", - "BscCaySqUIZlbQocQPInfsj1QXRpu17AFX-ZoJc6neU=": "2778826000000", - "BsdQo5TUz2KUpMUk4kwmBNbiNjwehbarzk1wr8td9jw=": "830677000000", - "BsopJZT1YDNXwK7zalgAIgw6pPWSMWMxUUxuBUsiVlU=": "1132129000000", - "BuDKs10o_B3MspaToeXa1KGa0Mnpa0nXLtUWtycEOKI=": "408021000000", - "BuQnJ4lQNc7r-3Bah2tD873ZhBz-d-CEKeTXb4ziKYU=": "908788000000", - "BuRxa6230iWjQ7EqgLhXY1W6yl4ZvruETxruKZdes_M=": "530454000000", - "BuXmbOIS3lHzLoL7kVlaxWJ2bg67J5OBILQBAT2POko=": "924180000000", - "Bud72aNmAk14CGPLr_ueEJ4Il0ApgSQLO3iN_47xHH4=": "2031249000000", - "Bukt8Qc7AkziDjVvpa0jCl_jjgy6KmliLZhAKvExK38=": "919719000000", - "BumItmQil760LO-ISo5IU225ze7nV2Ww4To0v0ZPpVc=": "466267000000", - "BvLKXgUhxz16Q7yLAVdVKbHly_vobFFb2HMr0Cdboe8=": "384615000000", - "BvNs0KhyVceDCD9i-al2xOe9ytyUB8gDcBVD-I0SrSY=": "910115000000", - "BvShD45mgjTyVcT88gAxJeHU-aYTZFEjhwuMLVFtdCA=": "4595189000000", - "BvefTcLyq1dlyDsQkRzONV86AJaTEBINyVEMICveNJQ=": "1927530000000", - "BwoESCHGPs7UUypWVtKQu0jhblqDfNEcumQ5p9psIwc=": "460830000000", - "Bx0Fb6YIhi8s6_sIasXsB_1jKEH2sJe2gl8SStvJDkY=": "866680000000", - "Bx8qLb-63NPVz6xXd7iV4WqKwzUmuxwkEtQEW3x6a7A=": "385509000000", - "BxRT62tnZ1DZN2DwlKRFk-UKFFGxlfUNxtiOZZM_7iM=": "635659000000", - "Bz1CqglgdzWio5swh9aGbfg9t0F-GFKtA5rmNArojTY=": "499999000000", - "Bz9LWS5YjH6520Q3LkZpUIixATlpgY_zowE39shsXIA=": "384744000000", - "BzNH7I-vxlWIl98zpZO6dnswf1n88W41nQJr6-SPMHk=": "382104000000", - "C-PCPaFeKyTaYa9ile3ze6_YzsHx4rQr7g9kK31ooz8=": "846153000000", - "C-Y4gAG8QIjfLmafVedDat7RN_2ykcdHOrcT7NEaDqw=": "4155005000000", - "C018Nf4gXAbSa3KqebOIuzzH7-K7J8DjddnvOroD8fk=": "384636000000", - "C061p3gykdLDeKXdYqEtDtcjnicQHQQYlZT3xpbWT78=": "1923076000000", - "C0_qIFmsavxj1s0unKPhAb4zdUp0pdm74EUFA-j3QQs=": "1156543000000", - "C0ofQTz-Q4oM2CvJgD1TAeXJf3SMmkMz8H3pLMqTig0=": "768895000000", - "C1JqdkfkwY7EthpEBPsUZ2HvYcLgO78Sy0L9WW9rN-Y=": "377935000000", - "C1LtUK4k5yGlMlo7LVi5s0__x_V0tq8yy8c8Jmh1pKA=": "5061836000000", - "C1Lv1f01lxml0-kHtGdHggCFsNZvubWP3t5Wl_HKZfA=": "1153846000000", - "C1RuVVt7lXRuDgXU18tEypY7XB0sldeRymhNTZrpSk4=": "2283357000000", - "C1txP4KdZYpem2RQ8Ml0Hwu2T9uAq__eobUYBHA10g0=": "384615000000", - "C2-aFGjQpcoYaSXZGXQlJxzpVxGJZaJwai9Xwc6zDDM=": "455125000000", - "C2H6QFK7QUBvM6ner3-dKhLVOILCFKvAm4rDQ9cF2lM=": "1923076000000", - "C2WA-Gpp8YD2d7J-SrnZTkmAQQH-285fGdQJiJuojL0=": "411085000000", - "C3JKPfT_e52VD6JPPCcxblDX9uvjnYIXEJFPhOD5Hzo=": "384615000000", - "C3NhoBOs3ATd9rPQq62TtfyVguU9shues9kqcJrP820=": "403480000000", - "C3f0YZOYIWBB5VnWUjZbFDPsYDRxyAG0XfQgnIyyaXY=": "404478000000", - "C3njtIuk3VviDrKzcUYC1x6LRwmbeJvQ_iXRBdSccaY=": "4170148000000", - "C4Aa8drVLDQUlrmNYLB9igiKy30-VpX5ldKmQQ_2Lqc=": "384615000000", - "C4WUt-MFLjLssgtP_sJO-RXBxab58Yw1Lv1yeqjC4oM=": "404829000000", - "C4nlnovGBg1_LwLzfRyfGRdyuV-KyGaOLtTCADDoOi4=": "454545000000", - "C5-_9T3faZT9kD4tmGWCVBeogJr2fAlSfZugWojBfiQ=": "383305000000", - "C5FiNcjn0Hb48h7Zu3oTY598By7vB-WUyqIET-UbHmI=": "471931000000", - "C5Lnokpc-xeCEFtgkmDLPdBijwaKSA3eu-fV4zolDXc=": "411085000000", - "C5d-UOjjsavnlzYoiQDYObK9tUJPg-_vtTbMSKUeJes=": "385505000000", - "C60tGW05atStdX5OJjz19-ve8EsD8XnRMrks3YW920s=": "3846153000000", - "C67e6z2E5lMLszEr8THyZsi0OaXyXEhwf0QcTOazzqI=": "382394000000", - "C6BRimi9-4lORBxik2oy6xge4yxePsyTUlU0vw2ro4A=": "770892000000", - "C6Og4fOt94LGbMZUHr116tEXeyng4moynNzElNdmSQU=": "2265787000000", - "C6pjn9WS_0dJfmJ2nsbivk9laTUo4hdI8AnnnhzDFf4=": "3490384000000", - "C720e1xTo17rsqmJFYKf9a7kfd_lKNSfBx3FNw74IuQ=": "1132743000000", - "C721WuLBkZwUZ1KNLRzBm_jIGbYTmz3HYA9Pzxge-2k=": "1153451000000", - "C75AjFT5A2MCXwOtLahgMBqLRDQ1Wf8YZAOKa-MQRdY=": "377597000000", - "C7ArVMJt3VDj-cSN4M0HLzBuKDeabs5jeIp3Xn1J1qY=": "583426000000", - "C7Gha_utOVkgxLVbDWTuIrqhc5XvrYoYaHUYTLmNNr0=": "382479000000", - "C7HIIrUsnS_yhXgdYgwWYIba9nVVeM2aoN94-zHIibw=": "382394000000", - "C7ozAFM7mFIL56RtfMDx4P0iXXadkl1QhSrYJ6B4498=": "1249971000000", - "C7rnQ3IXMwChgAFYZaeB0pkiXkNayThrqz3QRrxWhhE=": "446222000000", - "C87rFpCQiCcsLfQDlrmctw3B7Q2kR7QL0Ur6sjosoNA=": "384929000000", - "C8D3saeiob-Qh_gWMJyuGSw1zSNqzgpcWDMTgvLEdxc=": "2526900000000", - "C8nT9nxbIHpKG-pU0fCAkH0aaKrCkqNMKuOKE870CH8=": "536334000000", - "C8xpZmXQ0KQSoWUuY6oSgH6fmPY-7dYmp961R_KW-Mc=": "463566000000", - "C9gxiFbjjISJ5efo10li1Y72apY7oWTb0lP_Dp2mowA=": "445784000000", - "CA1Er3diog4Nm1yAqM4k1XGGHTkCu2PQtKFELFk1wJk=": "385155000000", - "CAUZppdbjLSwrtVlV4aQdz7RJdj0OqFFaQF1O4fovi4=": "494918000000", - "CAbv-hGNT34G8z3UCIF2sXdgAGztBGqipMGyT3-ApDE=": "2157676000000", - "CAvzjrSsOFghebwMbVF57Y1OwtBiazPG62wiqdQD_ec=": "15961538000000", - "CB3xoaWcyRYQg6ED3n5sEXCk4lomltrro3Bbyo-Ik5I=": "1585940000000", - "CBXTWPAwkTp298p7cZnWwODUJYe7JDAaiEKhVb9P3MA=": "1628967000000", - "CBhRMQ2RJMFH3cQqKt_89X5Ykhf2rbY37TVXRisrlSY=": "1393724000000", - "CBjDkl-wHGUWFbGK4tRrVDsJerHAQSCgQUFd05vQgnE=": "1538692000000", - "CC-H0y178xJZeqP9XrsbfMb6NzrGJdiueV8zqoCK-q4=": "2120701000000", - "CCLyJ7TEVuVsOoFcQ7zpKsg-EVQQv_GJ5BMo56itmhg=": "412863000000", - "CCauTC3hgENI_BuCIcpNJxdH5PMKPPfivgocIxEjdI8=": "384620000000", - "CCkbOSmKuwZucAL_Mu1kFZ1ofnhThRJ3c4xd6bY2z0M=": "679285000000", - "CDEWQZ9DDKmAz4bEJELANRh2H6iTz78I7Dmlt2aCxKU=": "784991000000", - "CDaYM_UrfZZDvinRsu_pPXZDFOkN7USde9eMIxJ0Su8=": "1362399000000", - "CDoKZgukoN7eYcovWKjWLSTwx-ZmVMwHpKTMlT7VYc8=": "927202000000", - "CE9Nws2s8gO2lm5eDmgdfD146aCW038qNrL0B3cHFtY=": "462501000000", - "CEQ3s_33ybNlFgIWumf58u-G46esLqjc1TwASHolyoc=": "10011451000000", - "CEXOPsmnhWYq1MwH5zfH1LVgxfxEtVOLcFbmBCawsCA=": "3087634000000", - "CFZLaMKIgcYXTNuMgRQT6twbpufo0ebWx6WTpNLjOqY=": "454814000000", - "CFqYaAzKyiqYI8cqXsHEIu-ggtVvjzmztjYU40cPniQ=": "1344756000000", - "CFxGeSi3CR91Fmp9q2NcjWWjuWZWQV_i6iJoAzwoL8A=": "415455000000", - "CG0jp6rRtmCdXJZXkRP5acWVl3V_58KLjKQsLaaxlGw=": "987431000000", - "CGt0EtHkmCAr_EQN8sS2uZYAzltdIzsPrriF3-de6bM=": "769230000000", - "CHGI09gRMQIFiYVZDnbikSrkhqp6hEJYkOrtXgTnnvk=": "7724149000000", - "CHRzIpvUUwLrGwFJTUHXHU5PDk4c5ZmZ2Si6lb3Tf38=": "464725000000", - "CHTufqaWQqioj7mCnHMz1e1jFcre0k9xLSkehOhMhrs=": "470310000000", - "CHcoyFbJevlPmWzzcpUw9yLpyj855m-upw6KoVkWf90=": "750791000000", - "CHwBTPEmoQc7oMULnD2DrZecngo6use-cfjLf6JURJA=": "469318000000", - "CIFuvsSKW9VFQiOtr4R-Mwy9JplOsniNyjcLeXIm_pc=": "469310000000", - "CIlxI9QPp0r1hyaH6p9I9Rurpvqk2GhKxsXVDXr2qwc=": "384615000000", - "CJ2yDyY94mAwljEFiaWLQrQuILL2qY67bO5GxVrJI_4=": "838851000000", - "CJZrXBjJv4-J_nfgrMJPKikcLoEuCs-_78K76_2mdUg=": "416666000000", - "CK6FncWLnqmCJt5I7-jFKejwnL3rRmvXQMRp1aKcLwg=": "833333000000", - "CKcOZjPjNQeqeCO2TE36WRcIJz0G-0aJl4axu5U89Bk=": "417635000000", - "CKcc9WktZQ8nVWP53qr1rQCoDeROWTUsOopYslLR0c0=": "384615000000", - "CLGN72YSesWw6eZ1KozLdImtsm5d4z16s2UlIizt__o=": "1518159000000", - "CLxhm-nGYOh-vBiaCbSfQx3jWoZ8uQaoAJ_KpDbvcs8=": "25058823000000", - "CM1gVWGd2FNMm2L9fUHSqQG4jw0CLX3AvPXZi4M1shE=": "769230000000", - "CMD_N89BvHa98RfACa6fOCCRnfBvNuzZxRPBdNU_1NA=": "385510000000", - "CMIhMxJwpU_JYZ7i51h3ZtUDbF0rGDKr-stW1DU7eQQ=": "413111000000", - "CML31azQDGhg1-zG-pUCQzuzw7urhXTqMn8oyT4gV44=": "415629000000", - "CMN3P9VstnFlmoCPoN2wViPTeOBmSIJl2a9vYVQliEo=": "1243972000000", - "CMgdEkXx0j9v0__Rg1cSAriUlapcCfeFsMQ9cI_Pots=": "455600000000", - "CMh9F-W577fGkpTSk8ZYUt8qpjYtW_pk33Mdv8FVIfg=": "1900423000000", - "CN7ohaALdrwpGdETnWtdTKAvIP-XpbmoQcSMt6ltXmw=": "384528000000", - "CNXq353ttdsf3nRO0_aVVmB3oNy4M718lEd_qf0SOi4=": "5106472000000", - "CNY2jPBuD4uT-F4NQ09l8XPVmA2yY_MAGNYcn-GjlRc=": "417637000000", - "CNayZ3prFZjYi9jsN74LBsAy1duTIDZSslh9LMf7RTQ=": "7150878000000", - "CNbRo1w-5vkzKTpChcqPkxT4UotJe6aAAVlrss1KkBE=": "394931000000", - "CNgPtMc_J9ldaopzT7PdBBH8atdlL9xldv6qKXlvgRM=": "595529000000", - "CO2DZV_hdz_jI-ZjGD5Qh_zc6coF5YM2Sunx563XeeI=": "415629000000", - "COPloVMWGHzv4WHSUpi-jVrNeS2HF6Mh36Oz2mSF2Jc=": "417630000000", - "COTyBHuEm0xC8oUrYPTUOo3mBjtMvdmw3Pzv8CI59MA=": "3126892000000", - "CO_kX__T7e5poD5NcehX-yExq_VYHY8a83p0x3DIqnU=": "377664000000", - "COcGOtED1k67VcugNVrwlsyoKaRFOEh7ky1Og1hQGLE=": "2045400000000", - "COqiEXJhlc76f_ixCHsdjrFEOz13gUysiXMSi7Sxhc8=": "723862000000", - "COta9-1xQ_fdtpqMK1yWMHaM-CzvI0z41klTAGLZ4Pk=": "379733000000", - "CPM5G7P6n-7llVl_BrW9UAfELwZP7CKscKkyI5bS6VU=": "385509000000", - "CPRlAFMfMpzv-gqK7zJd4uPDkgv9Z4hd0di5NDV_MWo=": "3843801000000", - "CPXPzECE0FgoBnYtLoEQ4LUfeL4UzFnNmfijqHLRbzE=": "377921000000", - "CQBo4stXyv6y-hAIsLlMJWAgUI-zhiTQsbFLAHPepMw=": "1508246000000", - "CQddAZmIy6ZHBsoWGZl1VDdjrLxpr3Sq80iE_bUYrPo=": "6403114000000", - "CRKBMhcHfPr2_7g0TfsU_MWeFG41KXm0NqFJAJIOLfY=": "11576436000000", - "CRkRUhOFfxVKSwqC8FDWkth7_0lyMjMqmzrkZ9W6VRQ=": "466696000000", - "CRyww_7YJb3J0N75S9yv1Yb20CNs0XnJpGiubf76NMs=": "1153846000000", - "CS8mThnRpeLfif6OKnOc3Lk4VX5dpmvtR7efJgnaOTM=": "528498000000", - "CSDM5MeAKWZ7NA8ZeoqGIalrUgJ6KKgs1EQSqc4Ylrc=": "416642000000", - "CSaTZnDM16Fe9XjcHNhGA4-RlVHioKxA_emKtAayx5w=": "416666000000", - "CTV-YKFurL8_NOAxWRFWL1y0I9_EvTVSDI1t-B5qjko=": "1534959000000", - "CTyxMKz3adzhskOxmXSG2kDLgD1b1Am73Ua1I2aZzpo=": "12886774000000", - "CUmQ-7qRcmYi1Dj3Piq6sOLw9DA16A5tA6BzFuIy_iA=": "642211000000", - "CUyVMEYopspFFJrvN9KFx2x_lGbUDSqo-zNV16u8Yvo=": "384429000000", - "CVMI0XXbGnaUBRhdFnXlavQ5_wtWBus1f5BQXuyIK_E=": "411085000000", - "CVMlw5ECmciSObie2eThxaqa3B5_LsLvow-KA3n1ajc=": "1153448000000", - "CVOOhocE_xZXF43jIHzrO7rkedoBRvqUZolSWpWtqmo=": "385510000000", - "CVWudS2H_ASTWymw2i5OhxBDZB9cTQyHRg_LTM8q6Z8=": "1252908000000", - "CVi1Fu7lSMHqS8D7yFRIl1RnLxZh6xa01ojX4zbOnls=": "1933021000000", - "CVsGCPnhhgVLcW_ldP3JZkBLN_5sqRxvm-ePxT_Y2Is=": "385506000000", - "CVxXLTDFz6OtqWSK6dmfy8kC_whwcJ5qcr73A5MSyGg=": "4047143000000", - "CWG2UOI0Bv8YYAwFxpq7KYXu8epVxlVWdzR5s70mm1E=": "379564000000", - "CWfY4kwIwNsDsD2SIRbIJ2SeFl5QC4IWMsRuf_LSnj8=": "482124000000", - "CWnN0b7BSuFUg5Vs1UAGGwZAIn9W9QRu553tssE2kAk=": "462169000000", - "CX1Sa6PxGjaAL9orBLs4yPWsY-msUzTYeTUPCLku5XY=": "3290656000000", - "CXhhkJwZ9olzu6U-ARAyc3yIwOLg3F8FurR_ZcDTBdM=": "385507000000", - "CYiypnmPfs1IqUOMdr-67uHxyZ4RLxbbNJ9o9p4uEFw=": "416901000000", - "CZ-MkT1bgw_qIVjU-x_wB_VklzCAO6lkCn3Hv6NceTo=": "456369000000", - "CZ4tW7SnRNMT7JgB3fThug6nnvR542yE0R9wDTO0N20=": "2537000000000", - "CZhyYoCvrV6zl40lBgyvpA0FFkf1IIPfL9BK-ORzteU=": "416886000000", - "CZwY_rqc_UBZfIUaY2mBURA1sx4UBhg5RPGcQMnW2y0=": "416539000000", - "C_1o4VJa2-xMtD95SbLuL7otdpCxJKNbk_meRJ0FzmE=": "411851000000", - "C_T380Uy3p_3j_aqdtq3vqo1LiOxpOc0mu-eKgTe26I=": "385498000000", - "C_fh4CkwKQA4aWButKNGjYTodL8nEMYWZGBe4C1loio=": "384597000000", - "CaA7qqy-brY1EgJFiwpqVjGTJwoddrciy_g8-NK6xDQ=": "1709797000000", - "CaGPQTGKwZtbpqWC6qdyHkMJ9bb3euyBjWhNFA8vS3g=": "453599000000", - "CaICHKHRw--wrUpBbU7800V6896sGA27KNLa9Yr6foI=": "1360527000000", - "CaRdqtPeWzbj544N6S0uoSuAYNNMObfhJZCshpVC2Os=": "468191000000", - "CabU4bfIbghnn5KSR3FBG7miFKyMPxWfY9A5zFOAvAY=": "384523000000", - "CbRqJ8e5GY8ztrlxIfNKDYjfTlW785THsZw3duXAioA=": "385233000000", - "CcAGwYWjnTwkriKpKomDEyaUjwoeyRvVHOJ-Q8J3CiA=": "464564000000", - "CcGQuOWbUiOfo2gLtEagkW82qmgXti-_gBQ0nVwbfto=": "4621865000000", - "CcLb7j6P4N1uDh21eaIXmYsLl5fiEyWUV_c5VMbgDoc=": "379260000000", - "CcgyWdvM3v1hI39n9EEFLJBPPsQ18gFKq41QvwbjUZ8=": "2022393000000", - "CciHjzpl5br2NBPGk0Dif3D7SsZA_02EWG35WBeOFok=": "938409000000", - "CcyO7t6q5zRcKGWd3hQZgOFm-ZvpzXaQS6M1MD7pxhE=": "767795000000", - "Ce3CPucqFQIlU1DJ48s8vtCJIHJ5a2wlMEa1jagM_6M=": "472515000000", - "CeJ3AvYTClefM2mxL_hj9gzQkls1ruGgsVfMuw08yv0=": "384615000000", - "CeL5DwiW3rZY8KeCz51OB2qsthjWVsXun8Ie3wtIY6U=": "1922285000000", - "CeoUNIOYMHFXcARkkcJN8IN7YvAOnS7s8x6AcmwjF8A=": "463315000000", - "CevmfINaf6Hqf4BDYjPqkmgR0LdLFqgrZvd7xo80l1c=": "458892000000", - "CfQB_ANcpk9vkb8C-QXvQ1iMbhAm7y8HBAUXiBxaPWk=": "466401000000", - "CfSjy05Iq3hCS3ZUjND5XMF6QuRMMMylbCR83J6SHWA=": "446162000000", - "CfX3f02MMzRea1JDZEoSvmocPZqoj5HBqSCYt0L9X2g=": "9615384000000", - "Cg33SPYSNo3vF8a8Xm4QBoBKGytM4Rzwyf5tpyeW51k=": "417636000000", - "CgWuXq3xpijDVxEIj_6moy0Qbke34wYysN2C6G2SHZ0=": "1923076000000", - "ChASfqIG5NyQMQFee-PC-IbXRoaKPFCzocF_uq83Rho=": "4621453000000", - "ChTiSA51Y3EB7DoI0qqjco5GrtmVeoZFsABUTpT3c_0=": "1216071000000", - "Ch_UgdnJd_nQ4nDNUeLrqPYI3s96w6gSQ5JqGpkthig=": "417632000000", - "CibDBoxokc3Sp5jgUrgK2g5GY9WTDNemmdBFAtKOSIE=": "447704000000", - "CkERQGI3T5n_9nn6bmO7G7P7j19NeGVrxqzvpVL2lFs=": "385802000000", - "CkMy8-AkDHLTrpsyFDOUw6ohN4hifT6XiEOqXT7Ruoc=": "1134645000000", - "CkNOPOqHrek1OD3WdmB86TrJU04y7NByWeEqxSD930Y=": "770237000000", - "Cl-qBf6tcMzzZ-KP9ds-sIz2iypSLTNbbHx5VLWufps=": "3846153000000", - "ClKbL4ZiPvDVYqQNHT2KcF_I8Wq8qWzcG0MhigjT6lY=": "1154944000000", - "ClSDSlagJSlO30EJ8tl5gC0weQ8Tm6jWzvEGFa2VgZ8=": "770994000000", - "ClTY_Xq5xSAseWRjtRlUtCfNQ1kWi4jYZiKzxn1_EII=": "384615000000", - "Cm98WdlCcKypfLtE01BYEUpnudVqsDz3mTTDy66DQOE=": "3951000000000", - "Cm99tcVF09CzQ5MDxZykMBtTNyuJEKVb7SlyTpBvijE=": "1716633000000", - "CmfLkv5e-gv1E-SD2yO51dQXkM905muzRzzjMsLa3zk=": "417634000000", - "Cmj3L9TQp-OFt5gW61KpwP03A-BcnvvirRetLSaf2XU=": "1999999000000", - "Cmqh9Z0J2zaZGmdAM9WjwEeFPLGM3_NPioRODCrReKE=": "1244326000000", - "CmsaEA9H1_EZGSmdmDsEB01bAFqGBs8dNKDt77Te5zA=": "385213000000", - "Cn2jJAmzvbV60z8g1YTuAzjpK3S6IB9vzkcX3Egt1bM=": "473773000000", - "CnUFQcEBlQkCaPDFJIHBzE27P5NhT_zYnbNdA73cgUQ=": "390975000000", - "CngD0UHcOLMOQKByfFJtVCz7XvZvDJrjomPSvBLSPV0=": "385282000000", - "CnvXK-cjwKVaum36Fnct1XEZRzU_pAPDpWy1k7oWGG4=": "384615000000", - "CoUnkM8F3qTh6yMdBmgGlCVEzEWGwNu4FxbrnPzRSO8=": "455860000000", - "Cp08FlgR3DHZbLqau1P-OowrZO7ijDp9CHTHrtWWEi4=": "501215000000", - "CpdMg8_kEzFc4aDwO1PeQ7ZLyY_ZuX8WaYoMim2fHFQ=": "14918175000000", - "Cq6FL2zYPMgtRCxXbMbVv3ESIwByD8bj0NHo0DiFYHE=": "544598000000", - "CqnTlgSnlq9CdQoUWNB5WQlP4EDaV3NPOjYbStY3yV8=": "3915019000000", - "Cqok0AodH-VX1Um9ZbjH2yS9zLDeDrtj2Ru95tKcpv0=": "4134783000000", - "CqsffbJHelXkJkse6JTeSDp5rPrJ749mPg0779tGxgM=": "467842000000", - "Cquf9AXQFF5FfZDhhX6ybuxxSpDmoG8KN2S6veOIUYo=": "461801000000", - "Cr6XleQGXKNFZvnBmLQXrQEk07NBrVXyRG466t0e1Yo=": "739639000000", - "Cr8B5ikAQZ6so2qf60J-B6Iv6j73MDKDwDEGtAaQlV8=": "3806533000000", - "CrJ3vN0BRVjpqt_VlIvrqOpS2OspytWbKUVpVdLvw-o=": "386372000000", - "CrX_1Gt9o5C2jOzBnZYqU6uAG5y-LyH5CZiSS6dz1EI=": "384615000000", - "CrjWuljrhF8MOvZdsQGW4zV2GudfurCr8ihZeiDxZ-A=": "385505000000", - "CroL3MeQ2Zt0fvZN25I4LrnqYsbIoHOO3Ca2hBnfIx4=": "1153877000000", - "CrphTWb_tyQOKTZ9aB9oH8lyT3TuHulB4YJ85EJ54NY=": "2244367000000", - "Crr_Cbae6gvh6y1AaobSD9kK4Btgui72PMQv8KWd7hs=": "481102000000", - "CrtvZn026ozZHQbWdaXASX0BThhnomzFYPj4M0IXICc=": "384615000000", - "CryunwxkvVJ8qR9zaUYlFjgId251I0Xi_Md2qsLLDCg=": "384615000000", - "Cs_mUotyuMQ0GnLaA_iQ4O1dl8yeVMXj3P6beLtmGyk=": "414244000000", - "Cso86rX_E4Niq2CywgqL8vF9m8NX3fPwJdaLY9f72rk=": "384615000000", - "Ct9J2MniSD2DYYR-lb9G1UcEEttOro_uOCQyo3WaU2s=": "914107000000", - "CtJoyWIpzGtvSJ78XT3EC-yPUtKVRXWtvSqcmF1xfbI=": "762188000000", - "CtK_2sR-XKdC7dkct3IsKh8E3DnZJz-MhOBtXyOv6Rg=": "412344000000", - "CtXbA2C7wGXGYlrHzZhDr4GGOfbP7AJa3Dh08Cb8LME=": "3838212000000", - "CtZfIJp0ARvlJ-aYFNG4vHtzx8Mfw6sjIPmW8WVdT2Y=": "468054000000", - "CtlFiCwW74pJllM18P1UM4RwhAMgx8VvlnaaClEndyQ=": "378786000000", - "CtmcV7dd-9iW-g2W-jL5iTEHA24OvumCXQU68hKnQ1Y=": "384615000000", - "CtraNQkspKYWEUSZDJn_uSLEBeIHEvxXwdw8xIVat34=": "22274129000000", - "Cu-cy-Hg6ArtJD9Xk5ccpWLRcEJeMWyM6RkEmWbeh8g=": "975076000000", - "Cu2eWXa0oalk_1Q4dFcURLWWZ3k1yLVZtmogXI4iFNM=": "833604000000", - "Cu3TOYs7mlt0sQsksJP3ksy90YfYUj4zrsQZunxi-Uw=": "459419000000", - "Cu6WvmSnabRTlWxFbbm_8uAVi8UloFcppeyJIvq9f04=": "382479000000", - "CuGnQFbK_K3XyqB-EyV2i5YrckRIjB1Aba55sgrNNug=": "415629000000", - "CuN7wMsoNDSFbstzd0LSXcU1el3NU6AVk0ckfXsRr_E=": "384615000000", - "CusvQPQiuuelecRmDOAUTfmk8O3MPCxEQMZhByc-tvY=": "7692307000000", - "Cusx-fsVDU0gq24emk2h-LQRyMkAV9HEwh1k-tc0NRk=": "384592000000", - "CutQnkF5KuXv-ynI94NU-XIMyYEnmsnZ6wjDle9BG_w=": "9999999000000", - "Cuu4vXNT8Pv6vhsHjHePiEsgDCCreZHSMM_5SC-EvK0=": "786039000000", - "CuwfwnCFBHi38QaYi1hs01ru7N0RAPLiJgX-d9KGE94=": "470734000000", - "Cv0FNXbuO6YSiKyZgIZCK2rl8Dy_LFtB1VVUT2Mdzfw=": "460896000000", - "Cv3itz9dau-66UgfPbApIAlKP13hy7oTNEFHDMZH5qw=": "384615000000", - "CvxKLgFWgtdQvWD4iVOWTj-wShqKTfO0APYsgJDPfm4=": "1666666000000", - "Cw4egO4jyWH2T6yQ7O5L5ko27ZRJRlNgEp1JcFRHm0o=": "337729000000", - "CwoAe2q8pZY-IxYji1-1z1b5xkuLrLXuZZd1LGUWhmQ=": "384615000000", - "Cx9og0uvG1cWCa4Fz7d0Y8ixSP4fQQ6yAMTBCc93Rpk=": "12500218000000", - "CxAnRVXXMsbZxRZAWfgGqU9Ub1v-arGb9umVC3p1NA4=": "6229065000000", - "CxGMoH_aDAnKba03SoJm0e8xTM9AeAgWr1Fyt_6fu8E=": "840198000000", - "CxOA7y-hMyk-plvSvfIaDiBy8qM2WfJo6gfrR8gzcdo=": "486218000000", - "CyBuOHQD_VEvFLFov-5VyopOZY3RF8ky9MRdGmali20=": "769301000000", - "CyCrp668Dg67WdJybOawfi8OEXxgqQZr9MP5zNMnaqg=": "407808000000", - "CyU883orkayN8G-1kdqsLzhOx-4V3UcwcLbjoVkLjKE=": "5224707000000", - "CyXMQZr6rTX6PS7kls8cqgGIvuAToMLgqKnpDXxRL9M=": "499999000000", - "Cyfb7BWA4glOrQdFE9fiIP2mjf9fejqWfGiGgbTdS8c=": "454445000000", - "CzcVYWz4kgfPyYTAui6iR_t9EVez1wvd34ZOX2a-53M=": "6601337000000", - "D-BQjUl0UYmGYx_yw4yXzCUXab_D64ijokJ70Jt4bXE=": "384615000000", - "D-KAmxqZWemMDV_aANfI40AjytCrgl-hOxUy1yX7OTQ=": "470310000000", - "D-ScXFY8N9nunqpc12TfmSawgu3T6IU47jfWKBSGELM=": "422985000000", - "D-U89KYrZ5voZxXyBQEgQFPWZ5WGOe4Ene84NYmnkN4=": "6342433000000", - "D-hi9QEFroS61vjav_bVUSMT28B89klF08aTp-fQm3g=": "411085000000", - "D08Ng0Ud1LmHMzgrfFBL-CIvAbDFfvEBpJlaumk68rs=": "456871000000", - "D09VD4F_WJ4Fk0xo2pb6nSW39HUQ1e9qPqqDJ21OswA=": "833333000000", - "D0GbfoEYIBRH65yk2Eyd4Tyb1jRsjb1bzVQdNjguslA=": "1875032000000", - "D0QLehrjr-CU76ktWEPAxyTknFw-mlWelnADvqklfzc=": "1668377000000", - "D0YetdWPoYNKpdQzH75LNWqvIwBaSdMVweis3O22N84=": "416666000000", - "D0hOJPxJxC4w8KgeSpd-K9gp3RNOU_LdFbsL_jQtNCc=": "19204662000000", - "D1Zbtlm_H_mlRiH0DETrOBLUZBrq6vi7PG3pN3lH1IA=": "383334000000", - "D1g5JGIfxgQAXLR7Pyye2GpF26DYFu8KdeN26bcN_u8=": "3871431000000", - "D2_raZPjd4Q5-hDkHnOzDA6jqe0_zj-nR0YbKchFP7E=": "1538461000000", - "D2bBcAHwfEtoIzImqIUO-2_AW9STn81V8iGsOewfpio=": "389592000000", - "D2eSsizX_uNxyVtKhhaw29yrTnmxwHFiawoA8-meN3A=": "1911972000000", - "D2j9D75GS2FgBpCv1bIKXsyzQyUSCWA1B6ZlLeckGq8=": "452207000000", - "D2lmCvRayUAT5NFVJmMN223rYLdUJ6CJYjgIY4e4kfk=": "416586000000", - "D2t6lWEV47g3PADfb3sVLbR5YAGCV_l695aLzW8e4CM=": "1366800000000", - "D3D9VPkkmljVU4VCb2riEvXX-dLLpuoZRtE9pQ33syw=": "378257000000", - "D3FKOWnJWeCERoK16tzpJ7PWeFwn5yz4d7e4V3-bxTI=": "1377927000000", - "D3_kISHkmFQu47hKSaUzEl3HhIu6FvUxXiidd-FAIIQ=": "653305000000", - "D4LWN01tZ_rUiaIHpYc2Yxd1h3G2t9--0NldzdLx8vk=": "456230000000", - "D4MJc6F9XbZ-PMoVfH05l40DCWqE_r_9aEZdYXAhjIM=": "384976000000", - "D4XLZdBgi89ba8nZcXiB1JGZY1EVLKxS7KtmX0V-_Qc=": "382921000000", - "D4d1hIcehwFNytoz-O8e0CgTlcBjv81ODZHsPa6BTlA=": "604517000000", - "D5AVzHcrQ9JDJDyi_D3NmnlgSkX_UXj1FfZTKWFHzBU=": "2938270000000", - "D5DADrB0d66ggXPZiPZJbfwM-h5n45LGp2SeL5VJXyw=": "10905923000000", - "D5FRAWIRnSuH41jysNBGwgI1cPjcZDemuqdMpFlppNg=": "1271008000000", - "D5FcZL4DGphChmkf3iTDEIjqXOp5tTqYbA31CLbfJeE=": "464809000000", - "D6-Ee2xDZXhftlOUtKUEEZozMiN2nJt1CbJ0U3yQB-M=": "455270000000", - "D63SwdTp4eJvrqIP-aueJdlUkQHH-LW9FrVTKiXHRCM=": "464615000000", - "D7-yl0K-qCQqWHLtkVMLZ_FfMI2HyG8HnZ8za7F-i9s=": "385346000000", - "D7K-svV7S006Kh5Vdwt6v3MqJvgcJe0VJ2vfKIze3tY=": "448349000000", - "D7SOgD5guYF-s5QB96vprMbr-YvP9WFRtcvK36lP100=": "890658000000", - "D8STWHFzvWX9J0SDvQwANe2SaRf_nSv1B3TTsHvAhdw=": "571094000000", - "D9_BqUsLHoxCVv8-x_t0JCSp5bld1QJT8ULtDywukCY=": "839786000000", - "D9pP1gXke86rrKwkOgQAJvHlTmnn1PlK845SfhnxQsA=": "384615000000", - "DA3G_eEgJmj49_zoqZXdSZ4nnHoSc2H3-Z_GzwSIUew=": "1923076000000", - "DASzUAAXImIocIfUf4PVzEc9YMlozLwXndgGSiSM-oY=": "8395929000000", - "DAoprt808JJ5yR7Uc41U5uUJE4hss8jtvGYzUhHu8v0=": "417630000000", - "DApDkDsA3-vxtMaVSZ10vWDSBx0OmEI3qgYlJ8YbSjk=": "3725796000000", - "DAzLZ_RGUEXM-cfksHieXrF4ynlC2FuWT1vYirU0eng=": "384615000000", - "DB6LehcwTNeuPTKQwi1ZPz6UYCCkyTNEBBZQBnJGkUA=": "385896000000", - "DBMBbdTVZW7Xc3NVOUfNV2gASFHbgPKsOoFJe-pSaZ0=": "7919291000000", - "DBdimkWZWGqEHOMAcohJmr7Ac76et2tYfh04Cfk33e8=": "455125000000", - "DDZqchjODzw6bLTz_5tVKZTduYAwXJKDgCIwYk6juuI=": "460510000000", - "DDdYaxO_-49nhX-8EdOD11lv22izPQIt0_feUynyz6E=": "384615000000", - "DDhLhbcIHhGnhasSD8nnGehCj7RdiDkqjUXk_bDP_gw=": "411085000000", - "DDhcpQeMClSYN11ZV5cCGASNuXhCI6qCiVLLhe38CBo=": "14141960000000", - "DEMP5_pFKYbLcCADluIeeWyXwk81eqs12eOLD4HIp7s=": "1590814000000", - "DE__DW0z6o7pEa8poJmH58bcAVydMCrUK3oyKNwpRYo=": "385624000000", - "DEb3NLKP0hqjIaZjAxFZ432X7FxPxDd5QPNdr7nAZdo=": "4156911000000", - "DEpcnvzuk4_9YwxNvlD0gkzgxQjPGt0y18lGZeIO4Kg=": "384615000000", - "DEsmEAvZYZx1C6gSG-55O7W_JTb0EF03vfOLu9IHHp0=": "786889000000", - "DEwCzaW9jqEBuVqalEO5jrdqE9ugtVvrGqBs2KIFUoE=": "416666000000", - "DEzU0X4-0MoLUZ_6HLfjMoVB_tCiy9xSm_kwgsyssPI=": "458201000000", - "DFKsCIju6icRHVnYBI6vISTmh-DHVT3KqTB-fPrLuBM=": "456480000000", - "DFLHajikSB9lTlZfMDfgWvTuqesxrUX1a-qQfaMSU5g=": "834098000000", - "DFb8zE76zhKkBTAhtzNhu2G-fbo9bK1nt5St0Hozkj4=": "390649000000", - "DFlaM3H5Mg89IjNsF35NQrW7FF7fHltCAQFarL8Tl7c=": "824269000000", - "DGFuomwkeXGUSqj5hzG4Af5M4A8M_Z_zNO7kQuK8ksw=": "416666000000", - "DGM1cam_Vb8TJgf5nZERd-pJRblv4QM4Ri16c4TrHn4=": "544142000000", - "DGh_9rfw1Bkvd0t6ec6JtE3f3QqEvQVDmrwGNIt1-K0=": "405357000000", - "DGugB5XdhWvouHzRs8zPbzZtHH53CHjxFpL_ToQHXYU=": "769640000000", - "DH9pntwoPw2oBZNIIZ6bRY9YU9lAfZO34hUlGoUw3lQ=": "23824672000000", - "DHDl9jv8qG7xIsq4DsJM9-kChLUfH0FO0P8gPAWbnjk=": "463799000000", - "DHtTH0XO6jY4I_RVNOwtN13Lgwp0ZePbF3NUPYtznZE=": "459548000000", - "DIIBX_x2-Fn2yV3bU4wJ8BL2haN8nMp9czdtQoc7NxQ=": "2719958000000", - "DIJYJstF98zuZ8xqXksE80ZoIE8kpISzcgG_5rojHSU=": "387318000000", - "DIPkBUzVP3hKZfRH6aZ2qrmi6kyq8z4LGQ6qoYsdKGk=": "6951318000000", - "DIukDZENQ_4P9KIfVapekabdDmWh5o34dnAdhh-JciE=": "3893699000000", - "DIyxvCNYtgxnnixYan9fiVaTTppiNTTkJ671FAYOAcA=": "455189000000", - "DJU9LiiqWd1uHIA1DsAQAaD7x8S5Vv3isohERTx5ZaI=": "7492698000000", - "DJbCGCkk73IbbeenoNdg-jeABxBPdu8pXMQQweOmotI=": "378090000000", - "DJesYT3UMtHnv0P8VP2vQBd0YhH521uXJzS26ImtU3A=": "473265000000", - "DJjYDSK6Kcn7g_d_Z3qZYrwTxrxji6xdpSUaypAJ8nU=": "393764000000", - "DJk4G_znF0DrSUO-8GHMWgitbChep2Ivs0aWttUcjaM=": "407469000000", - "DJmXbuCkrNzN9A2LSpfUkQFtZaN_WAQROBu1Cshyo5w=": "384615000000", - "DKHWo9yrWcLGKF3Yka9_aIKwTq7HXMJA3Xxpl858p54=": "3461538000000", - "DK_mv89d_kMEoTLVlXIpDw7vVvH5Q9tjiRo57VO_kco=": "470513000000", - "DKncHTS5Xlm1q22cVRNjqy33GDTLv5Ud0YgXTmdYPx0=": "386318000000", - "DKsNZvWNRoVbR4wIVAM2XE3IQ8vyPeE1Q8oRtraauiM=": "805092000000", - "DLF-V90Zs-aMnIIkng9k_zg5fUSgTYSX9ZSekH8sMWw=": "846005000000", - "DMddSCajoQxfQMWuTRWlmc1TsPDrQ-nDHPnpraZzx78=": "577376000000", - "DMgD-6sKhA4pDJKxDlGSQTnSx660uDVx2FqR-BNjKxY=": "382942000000", - "DMmsIJ6Oq8E6BkpLvuOVn0LOzME3xa6YLDomjdoRaJQ=": "3315748000000", - "DN1T4rLrHAImmKhdUytmKnT_74WA7FcaxUTmdtjrV7k=": "357399000000", - "DNRzbBW5cgudHNOumaPTRR3WmY-mSDo0JgF2TfXTET8=": "2310726000000", - "DNifjgLQpPE34FnuBRCVBtp8-dZL1AgBFI0K9dsybhs=": "382705000000", - "DNjnyZCflpjVSDQ3oI-jfINdvu7qwtWVrWaQQFGjEiI=": "411085000000", - "DNk1x0aDmeyOM8Uwt0biK1Wftg7ktSqEf8YrsY-3GPI=": "417633000000", - "DNngvH7eUKa6-3_F-DNBmOcNq6HgB5wQURm6IXQUNOQ=": "385510000000", - "DNz07zJjuD51WhNaSC3sOACZiLMBBi-HCoKdyJB2RXE=": "3846153000000", - "DO4_ut8AHpgaPTI2OX44kdMEZTGoebQ3TYLXm7thOUw=": "377603000000", - "DOZ6Gon7GIoT4lv6twXtlSFos2ZZ8PYxlWVccvNwFHQ=": "1204545000000", - "DOnD2qrUFGoaCo31VX5VxAyOm1-ZTN79aoqPZjEBtjs=": "385510000000", - "DOyGrS4FD_vgBeNHSHYNVuniqhnsj3RWEF1KCzG3Uww=": "382370000000", - "DOyuT0TS8_6SFRgr9N86CIQF6z5d_lWtZ_qyDmcSWok=": "460374000000", - "DPCKl1k3H7XnJQ0v6MX-KYtfkR1LDYiTgpuZY33OrpE=": "3780374000000", - "DPZFwTSFLMFCljuPpNQYK02h--ctGsXir6ib6uTDUZ4=": "465772000000", - "DPhGPvDUmydIm-rbX_ARRe8YcE2N7iLBBin9cs3OR2U=": "3214090000000", - "DPpIgVPek4RsHkdrinfp-O48Ow2NVjTfWZFJEhvlDMw=": "445422000000", - "DQgWBYPLjaIhB5ublX3uoc8c69uK6G8jWNzqYTSXHng=": "454397000000", - "DRF7mqxeoIll-NaLCwJjqA2UoABs7G1JscGyOSFRWwU=": "566237000000", - "DRQHdq2Yq0qsZGNB9DinM03DAkW4GLon0AkPcXgIFnI=": "25027196000000", - "DS1GhokiQfATudnQe5wjUGA5pUbm8FW3GMZSaUNpJ-E=": "384615000000", - "DSiHoe_1coU0PAVwbqMc-ZHS4dO_3aRImGHRsPNTKsE=": "908272000000", - "DSw2OciR0brd6QGnRSTKKX3le8nAw1-VYGecMuwSRsQ=": "585466000000", - "DTFvDr4TeQdRKeRnwJ09YjYiwxcelLddUb2esyZtET4=": "2653707000000", - "DTV5n_1zRYzTxTwNhggDcTvwCx1f18cVsmNP9E-R-LQ=": "1144904000000", - "DTdUJxXPdoTJxObOAtaDx9MM927Bn4T7HL_EZPYsfIs=": "11353591000000", - "DTdzHiSBhLaNaAVOeKANlHtDa4HtPN9W1VZcubtPCA4=": "6116428000000", - "DUOLBZL8h2JPpDoGJG-WyZEfQhCFpzVajbuHOk6kgSE=": "513814000000", - "DUaqzBKEGqN4gMNaoNmN0p2zn_TfahX2rfI5_uGepk0=": "2079182000000", - "DUfwx08O7hcDXVpQR-zQACLZhRAsugKiHjtItgBiYdk=": "465946000000", - "DUrztOc803XrhChSdpNaNst_GicTpHIAaks49bH6Obk=": "634303000000", - "DVByeq5cJ8yJ-hyuSJk7VVsuTfpKEL0HiLSqoM_klSQ=": "3855075000000", - "DVIH2rHMSijYgp87apgO0oOTarARkfgP5QFF9KedgTA=": "417630000000", - "DVf5EBRytuB4qWwDrtFTxgn-z0t0XUEMOzYvGuBMDsw=": "1939462000000", - "DVgVQ3se4kQssq59g70Q2TLPodvQ0XkxEx8fr7w_eOM=": "377309000000", - "DVxhPkCzxXOxCxh_tQJsCggs_tppvmqKX2O_0_CY81k=": "385429000000", - "DWFL7Yge1MNhFlmupK2ZzO6T76hjWKWuNStpYnqIgCQ=": "416464000000", - "DWi1hc7oJOKMZFABpn_cch2hnUn2oQ4GpWEqa8gts14=": "384615000000", - "DWqVdqdLbQsyEGEJnteKQ87QiUBvwTauRZhA6iK17eg=": "464279000000", - "DX4FEckA0KOVdsjd3JH0fm-yiqKXAYWxFewurlnxjxY=": "844393000000", - "DXAYextuJkAnlLPbGWmqLQkubIIgXVmr0Y5wXQpGSj8=": "581632000000", - "DYLBcZ0E_FoJMek1FEc28Ram59Zx7FG2KS9YocUwYjQ=": "386596000000", - "DYOKlCEl4OT2-lGXUCJWl-bE6xjHSqMG2-7d68PkvnQ=": "384615000000", - "DYPH4hMJZXURwFfhxdnQEh7T-cyCPnzn6iKZCxOKMko=": "385040000000", - "DYarJFyyLoKphI49YxR76AOwY5ovCnEjOzkWd9Op-Is=": "529201000000", - "DYmajSayECap7yZ47r0VHSNVsDLL7-WxboFyDZ9ROxA=": "385506000000", - "DZdknuBz05nfI3Id6Y1rDVtPcEWGoLcGBQuEbdnIpXI=": "383313000000", - "DZdnSJ876RZ_bHmzVVPHlZTIcRUd8uUGci15kpYlZQk=": "384546000000", - "D_T1UNij_pRqHnTvr18lwiETydXfiHkJehFMXDT63Q8=": "384778000000", - "D_eFcLZvaX0m3Pgg2NXNvPy3SkqYGYy11Q16VmhCpGg=": "417004000000", - "D_wMyw4an1SWm8ZQMXBW9-zo0MWmlr1S21sAm_9Ui3Q=": "378206000000", - "Da0uYlKE42319y-1UCIPpYYGP0bHB2quQbKWggKv0BY=": "6153846000000", - "DaWr8NXZc9njUu9DjJFerOL3eO9q-fV5hTZNJ7Sste0=": "1083333000000", - "Dat67BiYXI2xp321y8FohvnFwaTIAIpPxGj3M_jWjy4=": "4240295000000", - "Day-w1LoSgx7bmEIKfEtGwq-0XGn5vs2YHJYp4jWu3c=": "1388066000000", - "DayjQjqpk-ZpjogWXobak5G4Je3ok26eS_f3rZEsZeA=": "1902211000000", - "Dazso9CQeLeUXKVS3NVdI9P5FXhB25kfWPPWlUrd4pE=": "398808000000", - "DbHr6nfRKxzraKdlF8sFTul_3oHoYNrZJYiZHVBxErI=": "1008023000000", - "DbqomI2R3wXqr7El93941b3Wu43_5kvQ12JVPmykg64=": "1145412000000", - "Dc6x9Dv9w81VNpGU8QTrsKncLq4G54ffHnANLf9VDVg=": "381601000000", - "DcAcQoAGNdsaKFtMDM_O3tqE7U09zpydkkcLzmOvdWQ=": "3325057000000", - "DcAtQkYFupWyigOBf8vbHnkWgW7uFgRfgvU-oebKF_8=": "2022675000000", - "DcBuJ5CGVpriV41rUJO0kpFnVP6lsxB781Xm0QrZ8E8=": "464825000000", - "DcNpqIGTodA8cpnT_n11aKTf9ALT5Ir7aWKvAUXtUt0=": "384615000000", - "DcV-sKj-NoCXSSUt2srOdtdDoA8pRaTaj09KUGwvu0I=": "602076000000", - "DcXRFmQCTOoFrzDEZZXLHCddIK-ehljh_x8sXMv0hMc=": "384615000000", - "DcZwn7bVT9uhUvnf7hkEu43iJw1782sB0TPKrqyaP0g=": "457488000000", - "Dcr8JMWPG9GYRmV4mIgm_hIQrIML03w8KOaxXyFqWfk=": "2063036000000", - "DdtNK8dYQlwC8zUJv5HCieEpR9RCZx53FlHPAgtzJ9g=": "568618000000", - "Dekhj2yg5FiJyaePIzsC7xfuYGirnhwliN-p0wlG4do=": "458333000000", - "Df57Z7Mh3Sgunc8h523ezjLjdbbaFCf1CG3JFhEnJo0=": "115384615000000", - "Df8MG1uULjV-DNsDT0X8BcgBmjKr1aG0gTH3JJP5LL0=": "2535371000000", - "DfiI28E0eCuHnMDkwDGCsze1AAKjfvSqis5JZ71_GEY=": "945454000000", - "Dg6iJrHyXCNAivFHcL95lXXWep4WWbu__-c645c6A28=": "504175000000", - "DgZ69jfL8fHRNfXDCw1gyHIHabf6l_Wy_tph-N8kOZk=": "3844849000000", - "Dhgjvph8OVeHSB9NjGWLtBfMNEwN5OZ8Gv8K0NrUt2w=": "384615000000", - "DiPz9qMQgaRlJZnIIIpeB3zC8ckANz1pAEPjGbOI1kI=": "444502000000", - "DixEX6Wm5GMyqBspwjEOsIG6POLb4CB21Eyv1A9fTOE=": "3842046000000", - "Dj2LnrncwNT5yHUUJsmnWFZ0VUbKrV6Yzjw2TCb08qs=": "816612000000", - "DjVCB-6wwA75mqcsfiAlzW0VdnDEJUr_fZ-P1qxTk20=": "576134000000", - "Djbgpk6WjMltLpS4xtV93FoZ76vsd9bJiZwT2JvlhJ4=": "460520000000", - "DjdzGsa4YG47-rQgH_zGRzZcH-N8waCU0hpaT1-V6_8=": "390975000000", - "DkBHI6G1SMwx1KkJml7DklgPM50ORgePLPNhMOBdGTg=": "385505000000", - "DkFI0v89qF4LoPr7yFIDQKG-fRwRt5PY_LOwYDQPJLA=": "3846153000000", - "DkIMeZDQPXH6oiR5KbGUSaF-kfsgHOTO5FNaOdIzfwg=": "451300000000", - "DkQQdQTbZxi5GMsOMozT9hPL8iKUpaY5j5rfJXi8igI=": "781153000000", - "Dkc5OnlPNNaYsCBm5vyNxjl6RMbfpdFMXE8O0CpyUL4=": "453495000000", - "DlUKhE3lqygBcy7j4Cdynv_blTHgrzU0YtbuYJt6eZA=": "385507000000", - "DlXN-NgGNCO_3Ca-vBBXnu4knvMIb6VdalbiP6SKob8=": "1156517000000", - "DlqqpaHB219YudzNqBMtPU3tyBAUq9b4HnDaQ4RD6yM=": "390451000000", - "DltbcXEF4lINO094-RLVxGA1xQg28WbJajzKwq4kIGU=": "454545000000", - "Dlx0Nm5KqbC5cNv4b7fGor4-gdDMETixfChgtyVhAd0=": "378723000000", - "Dm-TC8F9Axt4c-f149gBsGVTMpuk8zaQkZiBWczYDDg=": "1584858000000", - "Dm9gEvEHW6rC6PFGEM49gVMZOZw6yKtGbFBiGtXT5yY=": "481090000000", - "DmY3zNxj5aOMaPdQmRh9rO-XGK0JsItoL_CgGLs_Apo=": "842892000000", - "DmvyE1dtNT7pqcv8IZhJofVnCct4HoEmiMvipOkOiPc=": "1930893000000", - "DnFAJC6qjNwnBEdqhAmAO9COu6FLBBnYcxuhFzVlGUo=": "893821000000", - "DoHK9-Bu8MxT6_Vkmy2Pug-3_AS5qhgTIdNZUzOX99E=": "1923076000000", - "DoamC8nI3z8LezIIxWwHKCtZYOe9Lywgiki5OmjY8-c=": "462839000000", - "DodRsDMHUTB3fyQKT2IbrGHhPXDdgzX1T2QrBUJtcY8=": "698747000000", - "DorWeMH8MIBBUn80gYLnbx42VrtY0N6voj6GjWOhsrE=": "963617000000", - "Dp0e3SxRGK0yMu_sa5YK7LdX29VnTp_oHSfYogenpBo=": "407469000000", - "DpK5Ns1lwK0YwzgY4iWKU52gs1Wq2fLdXhft_E033PM=": "454044000000", - "DqM9pCN7FVuU4c1oKvOJvxCEkzppUFi0X07oM8MK3Fs=": "383038000000", - "DqMwu23SYkw3T4BwT5xDAoYq1gJVu_5bRBQK29qjETA=": "384615000000", - "DqVMNMbVGkLh9dp24T5q9hI9u_tCO3K1PyqowN_1wR8=": "407808000000", - "DqViZA3asI95qfj-h-KywVc-itZNKe4wOtcRrD0iRGw=": "387363000000", - "DqfUFKbj1j5qI3A13cnVr1sN01ezPopeB0SJ9LoYRvs=": "384615000000", - "DqfdL-wWX9CU-7VJqXEqYJmXhiiVtfAKCT1_2jAFzo0=": "634303000000", - "Dqg5kPRPMdg5O-juLkIcsmAQ5joeTgGXW6woLLb4RaA=": "382195000000", - "Drh6C6fcRb0cAwY5CaRW5O3b4pL5xUu19DFSSvoESVM=": "833310000000", - "DrhTwyPvdbH1WTh704twvq7DmVOWp2IAGmCyEePLunI=": "474970000000", - "DriJxZNIbQsE30AOHlB1Cv0RdCOqLcGKbmVXZjpLdFI=": "3816094000000", - "DsUowPCbs9Yn1A0ioi47CnyU7aO8JdGBj6GfBcuyozM=": "1616280000000", - "DtBD6Ky7rCXOo4KIPzh87r_lAkCfuC0rQomL03wdCd0=": "1923076000000", - "DtEROjENj8DbX35IgTk7rYCAgpJsc48u_hDeY2tqWSc=": "377410000000", - "DuFEbZ4EWI0umqH8G97CJNQu7fNQbbQoWu2NVk5KyP4=": "769230000000", - "DuaSmG8yxO1gzD2MCJ7Li-G20IZWMcfpXBy4VsDuaBA=": "991749000000", - "Dufm04wYY6Pl7fxxfmINMb7J96y473GgZqvPeLmuRxk=": "1669591000000", - "DukQEgQOvAES0Ht3g5x9oicWI99hOondmSZFqh0VCiY=": "1538461000000", - "Dv5YDdOyW4aE3Ju9pNeCCi88XHvYx3MW-sgKUdJJg70=": "379528000000", - "DvBLvHJBaGwXW-CHiq0RMfek0fgC7YCFmpSHXH3ETYk=": "416667000000", - "Dw853moL2pvqI10uQ3KH8cNE1unt2gTvQLH315lN0L8=": "449338000000", - "DwQ16bWGmC1jduYzF8hCWM8ZL0cxQHefmGZHaz4TkN8=": "615384000000", - "DwgSTv87eAWb1zVoftKafFIH1obUg0W8dSnpD6XgKXY=": "435686000000", - "DxQT2vjJzbxRyoV1NsjY8H4eQ74sbgz9OzISt3tdYVI=": "438645000000", - "DxQlVammVbW_N_u8r65lUodk5FviOl1_ogL_rZ5gW24=": "463051000000", - "DyEdrkQb3qGEpt8ltMJbQZm9m5srkpMqMULeQNyfaGs=": "1154790000000", - "Dyn6kHIN2zOxjAMl9JMbpMF01t6my_HGnyvO3bTjfB8=": "1135836000000", - "Dz29gocmorhB42IQPY68SOr2PeW2EkKDOhbTkap7TlE=": "7710149000000", - "DzqgWYMTEMmKHI1QWvhYJLoFQ8TFlh4NWkZ0D3cRuCQ=": "3588947000000", - "DzrO-O3lVdJYMpgkoPRPIRJqdWqtzmMTcxKsDALeYBk=": "4089833000000", - "E-7n4PiqUlSenWo5V8F47dyTTUXeO91a-8qgTmEOdZw=": "906393000000", - "E-g_B9o4afdOmRQjB781MlfEsqZ38nDKEz1Bq5lhUKQ=": "908507000000", - "E-v3d6QibVlPYcFf4bIhy200avWyU3yc0-xqT6BgVxU=": "1245451000000", - "E00P-umgwoHytFSbqZ8uAQCQ9d_3f3BRtAnCC4mbtjo=": "1153846000000", - "E1CfCoaSRhI7hsXkRYPuiTNn0G-5kK682Ocror9PEcE=": "385509000000", - "E1Dw-5Lnsno1off5I9I8Xuh_AnSphQw2DajEz2yjNBE=": "404752000000", - "E1HRE7M-YSDDHNaeqs9CRXVornMCbqJyCNckvtj_ytw=": "1914924000000", - "E1JZbvdOGZ2SFCAVJ35faUCUi_vS0f42V1P50C_k0eQ=": "4999999000000", - "E1kkC3Vs17EyGgbJoxmocNKSTwMAb51Pf4Tt3s8YFeA=": "767832000000", - "E1nseud3O6QVcXL6YtC-RHP_2hBTS5UfR8Rg7HcWIFk=": "462568000000", - "E226oM6-U-lbeCEOugRdtr4bsxaHVwv2O1EMp7Et8yk=": "448705000000", - "E2nyYnK2Lvkn1_uVH5XjgW-FMko5FwzJf5w3qrBIqeU=": "6447081000000", - "E3_Pv6BqEOPWkwbJW9ngyTFmoK9ku1RwKd6Y7ZUgibc=": "384615000000", - "E3eoZdNtPMf6kv-_0ThAueo4CUsvVtWVzbwyZRRN6Ak=": "385510000000", - "E3y--1Mt8_R19PEOUC2NYoXtDmRH_JVYvoWXV3mMXro=": "8954449000000", - "E4H1X5rE_KL67fpHtEgag7UdpJ-YfZ9nmxGbq4TL25k=": "384828000000", - "E4jTLHtCJsY-_dBZBUzDQ8MMTzDwgvob83MrvqTNERs=": "384615000000", - "E4vD4LFZKuNg0HxYBO-IibOJXQZp31g2XTRqsfFHOAI=": "383809000000", - "E5N5cEHEq5JXMJKOvEVyJNfjqPlVcrO76FSbKwkkv1Q=": "4838522000000", - "E5TwJrG6Z0AowZtTW0n4w8V66Bx_rGQTEYyXtfBpRh0=": "422561000000", - "E5WXgrN0b14ERkkvO_QFonK6SWBv0z4HB6pj29-WsTA=": "458561000000", - "E5ikdQ7zJ-r3dKLsMES4DU6WMXavTRekT5AepVPiKFI=": "464007000000", - "E5kejaYvIn0OUlVnz_gOTvI4NDjH3tf2DGSd5W_cKzA=": "385767000000", - "E5x3zMNohc9y8XvypYYh-_83jz-asa-xAZ2gieUxt-U=": "3279075000000", - "E6-fD2HlkClYRpqx8U9_qbFgr0bSMnFkGo45ZtAOuIc=": "779596000000", - "E7gaSOnx1ULWoD-6xfWw79dqWBhW-OESTyPnl1fKLd4=": "487972000000", - "E7kZ00cjzw4VOyxH_UlE67t3_qAk9BPhjIkShF4Rh0U=": "380827000000", - "E7vvQuZ8kR7hUmS1BiUK2JZMjrDO3qX26P45Q-n840E=": "463777000000", - "E7xRrkz4btwZ9WVi_hdRWNonOAZxplSygnTFYOFIgfQ=": "582693000000", - "E87wozN67m-fOYCwOjcS1e82YtvYZ68lUrAUNfFBNo8=": "384615000000", - "E8FLNGnnQmAxotGNIgWdelXYdJ2RQjO8WqxVlbjFi84=": "456250000000", - "E8NdopVh7TkdELVOVB-PIIAxAcQUZaqX3drUgIFVx-I=": "502242000000", - "E8q4YXXkadW9JAvg6Ybsoh_WHtK-17XqHBxI_0SNhlQ=": "2083366000000", - "E8r9WTHScIBYMSLhJw3x-owG8DlMzU8FJZyK0N5LB44=": "1823935000000", - "E9FApO6uRskKzE50j54KLgMBI1A1NhdxcyQOhHAlxps=": "385849000000", - "E9G5I_J3l9oG4JHBhWfe0HrZhJTAODTlp6tAY8SSzhw=": "413461000000", - "E9hPv_BU9w-JXzfpXsBUIbmsUGrdHgbHR9ipSXcq5fY=": "1889934000000", - "E9mmkG54QG48yP5GUesBNmQ--O8LslBmgAH22yfZ8BE=": "982646000000", - "E9tduEkbe4XrsFbebkqqKKgrGQ-5fqE2eneznK3VRQM=": "437206000000", - "EBHJ447ZEMec0KkSrNi12TpQL-uaH57gbJpxmEZlAs8=": "3972150000000", - "EBb0bV3IPwWLEbdwTkwT2PRxCtMrXerpc-uJCq0ZGAM=": "5167907000000", - "EBiQFKLLYJRT7m8uwyS0I_A4riUtOeynKqhy6nADQK4=": "1215072000000", - "EBms5AUZPQfzfshJ7PQ9bT3jnk9wdMPfJ-xYUTAkpUw=": "1156521000000", - "ECkhJ6ulxPiIA0QG9EEr6ZFDNOLByI0dmJ8MeaX8xMA=": "382394000000", - "ECnWUA9-NEmvNE8gDqrgth8rzcsTxyTD-vx8Eb8BxfA=": "465638000000", - "ED8EhmpQYPZARCl4WkPVaKhI2jt-wWFTQWhBntibXXY=": "378137000000", - "EDeB5WyNz-FSVabATNxbRFJotvLkz5jp0ZBXbVjXbUI=": "1324305000000", - "EE8uoG0HzxQ_fKh_GNli3xsqp02n3fIEflVKDjLYTP8=": "2087646000000", - "EECmrjc-DlJ_8LEHtvWitxw2rhgSKqpANpnmNCzHphg=": "454929000000", - "EESGnONr41yKFxa8OaTf-Fu8thOl6rKrxKS5_Cby0as=": "407808000000", - "EESZiuDSmF5iXyEHdbx1a8OABH1mgFvbb5yoebAqiPg=": "433628000000", - "EEVVidYauW3uKFoy5AsDY6hLoj1SninHf77A-adlqlo=": "384773000000", - "EEXst8X3Src9rsegH7BPDnBbyRWaBwlh7CWb-GX-6xM=": "384619000000", - "EEe5EoBT28trde3K7AS1bhrPphEZLxsK6w2R9a3oEhs=": "1153846000000", - "EEj4IFK0bjk19nxZtqwGRp5Uq0mLHjMIxkZv84MrZcI=": "82024819000000", - "EFAiu9NnMuLHxdNTCNytq92DpdIkuHfylYr0Zg69nI4=": "455600000000", - "EFcP8reSsmyWjQtafUzxxBUldAnK-VjMHONJBcSWj_w=": "9545081000000", - "EFerIh4OYD4PDM0F2RtKuetTWnxL9VxQIdmr_-67guI=": "1156532000000", - "EFfKv9JWZLAocW-9Tm2KmOT0V1olYTg6rxMr78Ct8yc=": "1153846000000", - "EFnSaLUL4HOgQzcQOEF10EwORc_GmmEUm97Uz0gd1uA=": "833333000000", - "EFxbjitpjdNcIl0zLb7wwjNzOPaoP8GGSofpNYGuN8s=": "384244000000", - "EG3M2IP7GVd-_UfgeP7uVJNA2wO3PbHY9n1KIZk3f74=": "634303000000", - "EG4a6W4d8ZDauxpyUIXLMAEQLxU2_Kv_Tm5E9lsM4VY=": "415629000000", - "EGGeKPoPnXNdbfgv7qzlWmblRYiQiAlp02K4YjjESmg=": "781986000000", - "EGHTORlBbEuaxapaBFHotbJ3QjTxM_Bw9cYNF1HPg8A=": "629178000000", - "EGI3YtvevjkFhIu34COLmoegqN_NrZz_pjAkJ8jI7Ic=": "1493608000000", - "EGJ_tubzFLNRuZuvzkGUpn5tfLKe4UsB-j6zp8iY6co=": "2272735000000", - "EGQTn1d3ysLSuhfrOhHYQcHvGfLOC0Mt_LJt8-1fiRI=": "362295000000", - "EGbVJ4rtq8zoJletOGqVoJKEEO282EAG_6kH-y7_oys=": "1124310000000", - "EGi6bK9WWgP-1wP51EsQWPaGh_fMRfPJUV1eOtIbWOM=": "1250000000000", - "EH-NYsqA1i5EKY8Up_JjfgqX0x_ByTkKWVOrDUGA04s=": "769230000000", - "EH7A0yvTNki5vYyzb0zE_if3_ExGU39aaeAY8bAz8mU=": "2832900000000", - "EHFq14tcSNxr0DV1-UeojgtNZDBMUx3v52PNrehmLbA=": "377403000000", - "EHUfoVJIQqOo_r4WHGtXCvsQmRFlx0tBYlrx7cURzBw=": "385814000000", - "EHqpFfIciwTnbH4fNEbEgAPfzWr-9Dl09JhyeqXpUFs=": "383228000000", - "EIMembtc_H_dPP6RLS5EnrHoKgN-RoAoClmHJ6QOsk8=": "462841000000", - "EIPFSpF_gYrPjTT3iDDPyqITIom71SXCBDijVH2_41s=": "377132000000", - "EIe5PO4t6xUn7qNiFift7sedhKaJOFYqbicVPhgA5x4=": "476923000000", - "EIrX8h4535GXzJG6I67gMbpL5WvJFSN29oqUCJc3WJE=": "4078086000000", - "EJ-jVs4EKio8LAHVnrJFHam77bDmKm2sW55zzEAEpWo=": "945909000000", - "EJAKoZQrEmBDAvyC4JBdnzSty1RropA6Ko5FPZqr_PE=": "416666000000", - "EJHUxhO55hywn-ZkKIA4U3iKR9XNRxQtvvrG4nRyTyQ=": "499999000000", - "EJIl90jVKrp8avYxf7nw3wDcttSghQLb9x_FC-QaO2M=": "451219000000", - "EJsLV2hp7PZw5lT2KIUpD61g6coBjDZZtFSPg4C2Uig=": "412207000000", - "EJz-SuskLa99hiSW-qEo9e3aAK_8T6zK8zrFMZktS3Y=": "766272000000", - "EK7x3848bD2n2EiF_IKUn0EI-SVRRjALH8QL2J6L61A=": "384668000000", - "EKcQ3wisTj1Q-_UVnnRLeLt05Aju4eXuf4VzxIfK7g8=": "377041000000", - "EKyoBPsxsMg5VeBfJu7bu86WaMXNz2HrtVE6kodKt1k=": "2692307000000", - "EL8iarNhLYF1E1hwA55KvAjOAS1B3ne971bRiSVXyOM=": "109831430000000", - "ELg5lC-Mb1swdhmVPndUJ-FOxVshXG-c2p5gS-c5X4Y=": "384615000000", - "EM1RvXfzz_ZUVCSNsflk9Kvu-IZLzOh09TVNvNmXmGI=": "4862057000000", - "EM2UHJm1c2aVHDL73724xzUpsziJVPvZuRkZ4S93jrI=": "1929316000000", - "EMuf3Zn29YlWQ0FpZjxBuGKsPvhsbwILKG2Xgy2ftUQ=": "1153846000000", - "EN70DUIJw6QBp8otVEYy6YUlCY6zY1c0k-HVzZB55Eg=": "389461000000", - "EN9Yp4iiB3daLzHChWX4Y64peLSUW5Nm3TOy8V8_l-w=": "769230000000", - "ENIVAekkC72HdhJpFxd78MgjT9gW04EQOYw9A8lvEzU=": "8266621000000", - "ENQUfJ_PrgNRhNzi1oOn2FDvhouh_i5xuL2LOjHen70=": "401769000000", - "ENSIrRsooLPpFQgl6k0nozAipyQ8b6ZVjp4hiV_ZU2U=": "769177000000", - "EOSTZ7DEC77Et0ArPUA2N89Q9mkvfUez9kWDyq0HtYs=": "2107038000000", - "EOg_subamXJvubNEAQvHFu9fZ4Lr_lKc8Lt16MpBROM=": "448471000000", - "EOkQj0nRryDom09q3d3GRf3UZR_5mQ6F_aNsIFq7Scs=": "411085000000", - "EOksMmHfTF7mrxHRSs_epV4yLwN_REpJmTheBWggs30=": "382394000000", - "EOljRHr9_15BFobTa7b1epNM5uyN0YVEO1t5F0m5wDo=": "3310792000000", - "EOsvls3RSJrl2BCQFOBhEYVrpYTxFph-nkKR1Wg9Bxo=": "904760000000", - "EPUwWG4w7TpB1C212uGI4q5bGNvIKUWA1AN43F6F2Fs=": "384805000000", - "EPbjGr-WsI4FMS8jIGZui70kcdLHXHmTKsHxidi6h9w=": "384888000000", - "EPj9enXvqWDnIZVoHYaCdsHXj3_UJL91B9K3mxkRL2w=": "1539193000000", - "EPmFCB98PTFhI7433ujKEZI28_fJlUNliODjA57EsmA=": "423370000000", - "EPv0Z3T2IwVFY3Yc2CgQL72WUac480MznSvZqzpqPs8=": "2473572000000", - "EQdCrK4oFn2WnKYIHyD4b4GcogmIYF7QgRkZp-o-r6I=": "757718000000", - "EQjQWH2fLuN-jDUBjNAMGnJ2Y_DhsVp-DMCSKIO6nxY=": "466325000000", - "ER2NAMpzjtxv0b6WUSfxAloIWtJcnn7DUHPbXiOIHVk=": "1230993000000", - "ERCrjWMEW_jfQxXDx0EVmlImVrLqKBB4hFpmOAkUItE=": "1811506000000", - "ERDrX6PYYYnc4BRRggq0oPiAHP0x-rDBiPYYJrA3y3M=": "417567000000", - "ERNIMWL5Yk_jhftAcFvjL1F02P7URTMgdauhazBnN8Y=": "4225981000000", - "ERXgZqcKjlqnmKhnht7v6pwxn1I_nrL4mfqvRbP08_w=": "1115373000000", - "ERsge9PW0IYS6jO8iKXNMeBmNpuEjXXRIw5IWn0cUqg=": "2769215000000", - "ES080W-tSmzRSOinpIgDV5B2r8nNA2nQRjJMytrRLic=": "1851597000000", - "ESMkPQfRHX9eVFrnN1_Hc8TY5tC_kWjSbKjjOxQaXB4=": "3461538000000", - "ETC5ShCm-FdazoAKa3fLl9OVMA_s8olmlkIqUYyRIs4=": "999999000000", - "ETgXAULMmIB3TciIcPTvA4fBtV-C12clUlY2dInwJ-Y=": "1197549000000", - "EU8TIvHCe8oWP0K6B8zncvqKNenEApDqMMUUeZOW64Q=": "1161322000000", - "EUDXGbz-Tkl2l-wKDNRHtce6B6FWqJpNtt79PTpdqms=": "1813846000000", - "EUNCGm5c23sJKjUlU9RozmigeoUrRBmoVeTnQ7hbRZ8=": "2095353000000", - "EUngcq-vZHjE86ZcFRK3T30HjidN9mb0JpPVkf14qJQ=": "827797000000", - "EV0QJ8IIJcHhBk2RZ1qSrPTBfjGtfx4z-fMTGijgxNQ=": "384326000000", - "EV378f2sBRKHXEnYIf6S7pwRgL2DwOKlIQtqkECzETg=": "540664000000", - "EWQ8LtugqDufnB5UhXLGCykn5aKCFUu6McwaPhWWhKU=": "503900000000", - "EWaPxG9_tM6FIsbxsGXGZQgX145y1VPS_Q_LfbKwBXE=": "511993000000", - "EWvaJzHMvdh0cpIJ6_uxwBvfzUFLydSpgMoGL_WLe64=": "384615000000", - "EXPoGU0_N4kZ63-R-jiupoQ_FgRGCboOHEV-t7_EXc8=": "809967000000", - "EXWk5rBE2bpYOblZ1Lc-EDU2xL2bPeUMtse8Z77zt6U=": "460577000000", - "EXo3NgD-19XYsUwbNf3rZR5QMbrk5YhIGt3Ke76FkwI=": "1446111000000", - "EXpaEXj1-LhHbt7N-ep5EcH9doHaRrudHT28yCDwf90=": "1233257000000", - "EXzH0YlEg-3iB1sMZ2a6qoFYKYSSRUMkvfnzKtyuwoM=": "385507000000", - "EYDUWIwwOpln4uLT22oGF0rssdH8kX684DVV3Ol06XA=": "681322000000", - "EYDvGrxLWrRdGRucYcRsf4RG3HLpwC-urIfJa04DH-c=": "499999000000", - "EYLn-1nmvRNYto9hgEW7YlsKqB4LBSfLIrBiSwPKDgs=": "384615000000", - "EYR2mjS9VyejTIy_wZ8EyTfvUDttopHD6OIg1vrrraY=": "414989000000", - "EYgxjNMOTfriOUmF1rT6Qpew9K6DvhZWMYk8U_gIjpM=": "556588000000", - "EZ6BEL4MUoRttVsmqVqSW4-CCL767Mn0fwoDjvF-voM=": "943502000000", - "EZJue7ZnwMllxbKl9Mz4ZrTHB1YyknQn4NRSJ4xUJug=": "816447000000", - "EZi9vYJR9OF_3kbKM8qxg2E6tpj7JM8om1oDoBvdlLo=": "1366519000000", - "EZmqFN_CP-asz-rP83zH8DpLSIL_-fm6J9_zAVs0Tfc=": "382394000000", - "E_a8zWREbJbKynvvxzXnEsjKULcNj5PMEsHv1CWPksw=": "537835000000", - "E_yyh6LFe06RdSBD_WYwhc1DOIRsNJWD7IpA7zMMkZY=": "2026785000000", - "EaCv_j3cTFTjeG1znvW2US2BB_4_qj-Y9TX_iYg_Z30=": "780149000000", - "EaKoebsEfkxQJT4ZKHIJPSlmus-xY6_91VA9js3sUOM=": "463986000000", - "EaTNxGqudKYrYm4N_3mVnP97G6JpwvPrw2wbIPq4Bt4=": "384615000000", - "EaUtaHfkOb3HAy4eDAuRkq1agwcj6QNERdoPjl6AAcM=": "382286000000", - "Eaf_lMPoLiTUqAKBGA6XWJ6wd8c3JoL2RnD1r3QYd_0=": "1011073000000", - "EbDbidTwto0QiAvXqqW4nmK660gHa9ukCfKCq1eG9Tc=": "385528000000", - "EbNBx2Dmcmgrw-wPiAct2Wl5-XetVk_b4guRGOaajlI=": "1363636000000", - "EbVdVx1DcgNA-98-yQLXNhoFTsa4BpXP0-8b50FH7TI=": "769230000000", - "EcZA8P2W0oQbQsA0MOGNqsYvM11l7EQJt7hQcg8S0eo=": "687337000000", - "Ecd4N5QGLTXmYQ4145oITsD2AKQYF-yWRcccIimzvdc=": "451495000000", - "Ed0fOQpmMt_C_JSao-YjeDVmfB-KeP7xYYknnYz5Kbo=": "416596000000", - "EdXQNQtqYwi9PZw98zwFOLLeax4TYD40vCS-yF_apLA=": "382479000000", - "Edplx1I2o94NI8BX3Y4TWul_SrpcK-aA_dFMWPH0wSY=": "384615000000", - "Ee7Z5c-uozjSOhTvqWxJEJFxHyFO6q0ycQu_WZxqJBE=": "846736000000", - "EeBZao80zMlVlX5hgpyPtWwgZEV4X9qHuvqeg0_hJ74=": "469310000000", - "EeXGJZIM0AMWKEJYn_Xp4nQAgHIf1nCOHY4ovkThTS0=": "385449000000", - "Ef3-Ihx1mcaD6dkrEuoPjLttda4DWchqHkYqD378HnI=": "1088100000000", - "EfesCNVz3zEDAtQqO62seAYHSnHOspsoDpxU9WnTftg=": "3515654000000", - "Eg3R-liPsuMoz-X6vgNaI5uTrJg-SP8C1qwvg8xnynY=": "33340780000000", - "Eg5nif0vSJFGjQfFxU5EiqlejrVrkHpe9zYz_aTCJOQ=": "1782823000000", - "EggmjPi6GlVmX9nV39HsZlPXYebGRWUE31HrPMnQILU=": "810714000000", - "Egl6w4Sd7toVtEa1TBpSZI3cIYAbNeqNv_IwZ72Q0YM=": "477484000000", - "Eh276pyQcdLV7aYnLqB8nDWtAEGAtM0Og33dNIOYIRo=": "490530000000", - "EhF5Z3e2ezc4WDvoQU5wMmQgifhFwKUGdbAgx0QAugU=": "458519000000", - "EhXXA38kgDiH3Aa2eVNNAkaQgBRjCVPCTRiSxcKO1a8=": "2115128000000", - "Ehq5w9pV_q0LfhQapc3EwPyFYs-svEBRPIMhKoZRfaQ=": "383981000000", - "Ei4i_LnB2FKg2Ggrx9iZNaGmgTTWu46BlFnNuIB-UwA=": "384615000000", - "EiDi4AVcUDn6I00gSmQosdu2v442nq8uwKGASfICri4=": "582408000000", - "EiSWi6KktZHNTN6RLsMWXeFfCdd_Scb6FB8sgCMpIg0=": "422017000000", - "EicCcotEDdlT0RKZkMvHH7VblgpMsMgAVYeDRoagBnk=": "462146000000", - "Eil0A6rya7ZMnIZSiRVk_tPRoaJFixteXZtuJc6kN4k=": "462146000000", - "EioWDwFn7YHicGC3PJeQP_I6kgV_2UqtWJzTMb4PmZw=": "2247279000000", - "EixC533FQmIie9j69no0XTaEDLp4RDBhpcBWEXUfXUw=": "2100881000000", - "Ej-nZRq-zkcOKvvTfjuqI_56cEO7_uPYl4obMdfiCno=": "769250000000", - "EjEu25CkeGYnXCWJ-2oTqPLa37R6amTsY2HVsG881WI=": "1329548000000", - "EjLSGqx9-FVuJRB2Bih8L6Bu65xSQvqU7MrxkIZ4SQ0=": "1890453000000", - "EjP31mcZhuxvw6STL76KsRmFMQ95N3ZrVl573xhf3z4=": "421019000000", - "EjTViJ0xT7CLhIu3njEQRcBd1r2GtOaP53kMrY4pMjw=": "580473000000", - "EjsN2D42_uqnMlaugxi4FOJATYx2gtKfg8EohmXvhkk=": "673581000000", - "Ek9TDUisWnyr7DzuWJUYx7SepXjBaIaGRcTBAqRW0B8=": "3845575000000", - "EkShPtsbM8tVXPi4uEwpMvNVrSvXly9lAnlVaX9iSDo=": "2258488000000", - "EkTR9PctTxebtTUJQ9ryQPUvXLmDbofq0EE2WxrGHNQ=": "3115384000000", - "Ek_queVYuOLqD75M0Vap1UTt45Wo0TfX23NZ7e38dRs=": "1567190000000", - "EkaPsB86ZYms-Aak1MQbn6KIYUJA2ElhFUQkrnl7AkU=": "520273000000", - "El-GBlAifUUc0s-HCCHx9Ft64XHTTk1iw5DMKJDYaDw=": "554133000000", - "El0l_2MnSf-iAiqxT2l0cZn9rP5DYW95eONAtHs5lDI=": "1159208000000", - "El9KIp5yaI9x7vdmqy0PLkXZrbRFjXZ0HhgjlXHGR44=": "752984000000", - "EmY_QBdiuup3FcdTvnD-ZjeLJRSvHIJzIDP0pPIvG40=": "1538447000000", - "EmeuyTupJM6L59ko1bWvffonRDwXDZGCgy0EL5qSYuk=": "3846153000000", - "EmpF1qf04jOIoACyoRWZ05TkT38a7eYAb3-b5mJ9RSE=": "5011093000000", - "EmqNuoQiYJ__bCYLwlHKwZwjU436-5ruXYl0FRgqbcQ=": "1061538000000", - "EmvIFZhyT5Jfly31y1mXnDstG4mB-57OlvZzY49ETbw=": "2250164000000", - "En2p4DGa7wEZjIFxLGnh3LoalfKWmIRSHTOIXird55I=": "473295000000", - "En7u7SkYKylUKVKgbyKxv7KBaqrvUYK31vFAVKY6no4=": "3855050000000", - "EnResQMT6ZUQ4q42LyQyM6sREAM79s5tALPNzsTx2CU=": "3715598000000", - "EnujeCVDr7Fg1Am0qaCcojFew4cHHVr6J1PZYIMTFkA=": "418720000000", - "EoAx2ccOmvwK-mt-AXPOK8C7Jyq0Kc5XGUIHe9ljg3I=": "1940588000000", - "EoKSAtAd-BLZaq7Clo27Lk4r7HMT8zbBnPONF00RmI4=": "446505000000", - "EoVqMn0jwkpelGi4gP5hxlofaG8DRf5_u7pUsFBggw4=": "3344230000000", - "Ep1OAVYXmGBcnkGfHb8xQnzFmK0LClEEekiqoBKokNk=": "416466000000", - "Ep_zPdWa_OYSTuTL1PJyY4KJSZlv2tM7xcYHhpKa0BE=": "5034151000000", - "EpyGb3ls5eOWQHSUJYbmAObvXfz1rAj3Z6hv7xfiWJE=": "2114114000000", - "Epyh0XJFiC-If291Ym59MF8tj8_lm7D98b-SAKSH5TM=": "1753839000000", - "Eq1j_ZULWQjKswLEJ6B-DE_1Y_QIGA9oYdcBL66lhYE=": "769230000000", - "EqITMWbJD5IRArbaNDaQAft5Uo47Kb_wsvfX44PXbqk=": "417615000000", - "EqRhb39XMATrQ-jnc_SCEM1Tbe8vjdDc4wDc87lgddE=": "377783000000", - "EqV70FLsOQTvCccXBurVlDZRr7i0m-oCGsdT9JcqnIc=": "377514000000", - "EqW_3EkjrNW1ysjjZYDJqmGJrGfPgM4gWVguxCvTbV0=": "416650000000", - "Eqg9KA9m57Kyb4lDqyNky287zSCapF7kFLcMhVwTkf8=": "384615000000", - "Eqvr52FMzSDNgsSY-Na76t2f6JBEUGkTUT8CdjqFDc8=": "396153000000", - "Eqwnb4O7udIHjQFgQLnyg1fOnnblfWkN5FtvbiwXqTk=": "2045454000000", - "Eqzt5PzyjystIC0ayu9dYo2D4d2TuLdvaX1MgEaLO1o=": "9553283000000", - "ErKAwyeiiE99oYW7GiTBv2_1xVc408_7NFL8C5Kz3C0=": "1153846000000", - "Erh9QYXs0Y_YUOYyd8WyuNqqyCS6Qon62GGQ5WTZgdY=": "840121000000", - "ErimeGrpUqB0j1svAlBbeiZ_9JIoVakOkIt-UXjtIs0=": "416595000000", - "ErjPpLqyXGMeZaXK2qDEvnowC-MI7WxC3y2Aoa4A4wE=": "384708000000", - "EsWYiXkKmx4u7CDKlvQAtilJ3IOqtWIFqXlmz_unW8U=": "596153000000", - "Et0MzooUGCEFrh9tX1uoSODSSXTWVGCn8kEHgdWgZVQ=": "769230000000", - "EtIbbVv4Jzh1osqss4Rbc-3Le02KNkhxQ5CEtk0F4Nw=": "460851000000", - "EtQa5Jy3BbC4F08rsvqxMw2vfW4ryaY8evKMPk5yELM=": "590909000000", - "Ethbwv5asr1NCgaf92WWPU94-QSHKSJ4kEjxhHlsUgc=": "418089000000", - "Eti5jinAC_mcuzHwGsjhzXHE2RsQcFiXs4_whLeMr5w=": "569245000000", - "EtqdlbQGYwGeMyCHHgzMgh10jinKfxwReaKgsWqIwRU=": "416707000000", - "EtuNFMDJyp-eQ5DXb1CNH7ToubqSOXmx8MVr-EApnbg=": "384615000000", - "EtvMEgv_BQeLTg3g1T24Vp9tYji3Ur3dPoDq3SHbOiE=": "1233257000000", - "Etz3cfJf_x_e4opYaMO_3AQ7Q4JNwkKRCy9w-dMhaBM=": "385509000000", - "Euc9fHR9OZDdNovfqJNcY30_UJMqp6kFql2V2bpwqRM=": "927069000000", - "EupbdtpMc5nrzJqv1fDzcQFRxg9KG3nCvQW6WvgMn58=": "384615000000", - "EvGGWISrQ8Yr3m8hFEMBc5lBBZItC83z0vxkxpYgIDk=": "513844000000", - "Ev_em2uC4oyMa2TheNiweHMoB03LcDcvBbvZs5UhC4M=": "382479000000", - "EvqfFyvsvn2MfPP-PZiFFY5xkQBvJxDdBQd2njiiUXE=": "3281719000000", - "EwHUzrN1vYTRwfdK7n9-yzfTB5IrZ2ZrCd3BlL6dxOM=": "418855000000", - "EwSwVaY81vxMLr30xgfONxZGbJwCWBYo6-A--X5J7zQ=": "809670000000", - "EwWT_8TTJ7ViYYn101ChL7IZkpoDhVKSD46k9zOILHQ=": "384615000000", - "EwfkZM27cU95QHP3LSDB5JjujzdV6af18Y5MwHiSOdU=": "5579815000000", - "EwnNX7uk3gjEivbFlgfHzRAkk7c0AEXnTKn0WLZptlE=": "455871000000", - "Ewt4LeO0BmP1OPL414Z2XRsk2K8cNcSGRbXES6Y862o=": "413113000000", - "ExAjrsc-qMRRORb7uD9y80OHzBbd_lC5J37aqLkkPIQ=": "384615000000", - "ExHm5uhCPV4UF-mH1Cqhs5bPH3aku1sJYPOvUbc5ZGA=": "801500000000", - "ExQrwQpndAG6kiEsmJY-ohEnF14dC3BloAuWLs_oORQ=": "416666000000", - "ExYG1IKIZd_s7QhD-d6oIefNzJB1DdbSgxY8oFcp4Tg=": "454545000000", - "ExpgMaXwTb-TASf-ISTkofx8B2cv_vlgXdUO3LoyME0=": "450939000000", - "Ey0ZS7idTvECGsLlHgGSjWfdjl78fgcsyk6j7_QBM-8=": "628658000000", - "EyDX3_uziBDUplS4tM8UPNxeGhSf8r-1YRcLqbXcAtQ=": "382394000000", - "EyUP3DTobrO9RfozLMaQsVJUyxw8eT96h6jP4qvS9IA=": "1923076000000", - "EyV9MTlJglai3EOXJfJx5zUnV5oQHtOU0wOcyy0xuVU=": "769230000000", - "EyfzWF7i5sVVyAyXzs0wMMdRJXBWhBKEFG8qgh_esMg=": "384615000000", - "EyijIKjOeOrrxCPeb_XSOzzzdPPtAIB8hFnFiQkvU9o=": "5447665000000", - "EyyA1Y2wFY95nSwyBp5C4CgRuhEhJIFAwhwTH-mX3xc=": "384615000000", - "EzGZWuOq58iJLZnsYQcPLDpmnHoT4WpqNdbzfdp47k4=": "928476000000", - "EzHBa6SkBp4Xzurn-HoRpFyy41Oi7prJF1bzGXjutX0=": "385298000000", - "EzbYQwwGVCNai7YAJcm3vVnM_xlRIs5_DtHAZ3UJLMg=": "447840000000", - "Ezj8kaDdHqMHbmJsWTHIYhmOkadl-rGFuZDFK8_O-8I=": "455600000000", - "F-3K0tv3__01Z8akoXN8N5_1KUyjk7R61gn1dMRH8CE=": "417629000000", - "F-OdNxzr4I7LKKGJVmjRK78F7Tt17bsg_wAuzxz_XqQ=": "462472000000", - "F-j9RTGsvnwukFJfXgCOpGn8dQc5hDLQyuBqMU5Z-tI=": "381820000000", - "F-nd6Rw0A9HHLw41ICN6YPItR5nNEvVcR4yNvGVT6_Q=": "384615000000", - "F0JJ1T8up9SUUF1VHNqbSTG75oG4GuxlggveWWk4gG0=": "454587000000", - "F0NokflqgkHTkAIXG9iqVAPzGoZdBHnlf3ZJWoLbE2k=": "419408000000", - "F0Tkf_XVS1iB-0MtFZWZFvmRoA9UZ_Vg-tiUXFpewbk=": "1497755000000", - "F0vWaxEKsiAV3P5unToCy-2pPmPKDi5cKH-w_P8tcLk=": "603420000000", - "F1FD14kAyVjJc_TPhgwSl5fcQCWapkPj5U3n0jjzNPc=": "1892005000000", - "F1RvGiFFVewtN1qi2X0EMJWxxi4QNP20G2pFX7HB1Kw=": "386353000000", - "F1aivDKPTXghAIfpyAwhPcMBF8JnBRP7s6pfHFYsdqE=": "9166666000000", - "F1iI-6QjiCQvZC7D8F7ijM7ICMoqBhZgK-Y28HZ0OYY=": "385510000000", - "F322zgbsA1IVg45c6ysrRyBG2KMT5wuep1oombkshoo=": "942227000000", - "F3ch_qQa7SeSHSCP4Kt9H0xBEUaHkYfaAyV_3lDY_qM=": "3856992000000", - "F41iQduNp1nmGLwsht9-6W6p0tS-WoTsKRh0eVFyDM4=": "389371000000", - "F4JQ2UW7ha1dE3Ygi5EiNFPcoh8GoR-NEgCYSnHbbOM=": "936818000000", - "F4zbwG2kvPZmF9kJ3HLrB9N_kpOnvCzgYGVzBKMtp64=": "383841000000", - "F58gQnGYJY4FaH80JfXrKCUgIe4MAGwKOC4bGjKbkJc=": "384835000000", - "F5B7toB2PzflsvOyVAUVwDjLii765BaYyXiSZtDn7hM=": "893063000000", - "F5Q5L3to1UZJAUnqRv6UGQHTHwmufOT5doZwH5Se_O0=": "7525672000000", - "F5ler2bHsbbzasEwaKophQjy_Xp3hdGocROtHrl3Pkk=": "500247000000", - "F5q_gfXVdu7serm4aki1mPR9Jo69MRZYpxXzFoXqwpQ=": "3823480000000", - "F6TI3t44UIgLizSYDFZP_mtrePc3OOdkoGsEuSbB4VI=": "384615000000", - "F6Wxm4vnTj3q4t5NJ1PqDHxYr34YWa0sW3ZGV1fIkn0=": "4327157000000", - "F6Z6MLCN-wboAjl87bJw59mWfgNbyJUVoYYxZvhDF8Y=": "482708000000", - "F6dilim2xu0kMQCPOaORkVv9bVMFMyl-E5RQrZZ3XkM=": "2497874000000", - "F6yws16HjNHbZDvEOB5VJbVbn8PGGo8UsqNIxaQ12k8=": "2334900000000", - "F7MediaM22Y_eAqMw05cCWUAVT1PUcqkhL-H3bZ_DO8=": "3653846000000", - "F7v41OHoAe4vMaIUHNiurKoGLmA_clBaats7rD8dLRs=": "767884000000", - "F817pW2PpKLNGGwbbJV_jZq7Z8WNddr8NyjQsR7nlrU=": "384678000000", - "F8CCjsa3Xldp_2aCmeIK_XRbOuGVaSh2ARU336bCfRI=": "378104000000", - "F96GL2K818jg8LEPPpxj7KquVqhzoaSybfvzYvHhMvo=": "462160000000", - "F9jFmV3QRxRuemdNODrBwAVFZglaz8TeR1dZGU5XtoM=": "453192000000", - "F9orRUUL5OulA8-mYeVYsTp1PeS-H2qcgDI8Gv3nfQ8=": "487972000000", - "F9s4JQu2OkKlbqXGASeDsXrXrjqcQrtfRHX-pwSxc6k=": "3754722000000", - "FB6Mbpe9jOl8TBEyPtIiiNtxI7zJig4nOmqC5aKQmBs=": "833858000000", - "FBaLRU3bA1ZTbgMsO5kJuoCmvqLv7EHpsYxq1I4Jm9U=": "384615000000", - "FBcv7ZUiAv8nGY5N22bSJhlzkIpC7Ou-eDwmPdnqvHg=": "465095000000", - "FC78Rmvv-FEpYjWaQJ0fj5Dffw2ezlqV0eQutGjx9J8=": "748109000000", - "FCJGh-DUnLC4PTEDruxmX-0U2mXVCBf3yh4J_t3JB_w=": "407808000000", - "FD5ylj3ewxsqLWFr3tAFeiYpwnw7jZknU8JZwVrrinY=": "4006658000000", - "FDF3L5I2bA2HZF-8_IxsDT5EK9cC-lo4pAiRXTIz6vI=": "377548000000", - "FE4LmUTCrQwtyQKKBPLNO5Y3WGRGaL-CvJ7yB1whHQ0=": "384615000000", - "FEhoCz0Puy7qJrU2VJPlSytxGPJ-V4D2tJzTLUTzoAw=": "391600000000", - "FF-vx5HqowbPpEaUseM-XkDbxC_0aUbcDepgFlS5b28=": "433820000000", - "FFQ-iQ1RFZaSS5eso6HIWrrHD8y67auT8XM4O5y2qrc=": "4095970000000", - "FFmeGr5aj9fBWsDt0J18CN7Zf2UKQCZCbXPYbPSBjEU=": "1637581000000", - "FFup4VehFRaQvpaNmJIR9YU2TY1LfjbGc3EBN5MotLk=": "2237337000000", - "FG31uBP8bqZiC3beL96rfLtVXo9NVlpB8M_2M09kZ2M=": "411085000000", - "FGF-wGQHVOxdGtN7QIMlVal7IupMSjByuT1ztIZZ_wI=": "773103000000", - "FGMywFSUhhOqhI2SzPmkvfU9Eu7Hj3Un0nAB59DRI38=": "384446000000", - "FGUVR5IGurlRolQf_nbs0LlP7vs22squopWncVGH9lk=": "464091000000", - "FGfZv86XEmenIu5KWnFgfxa8c2obwFrbhlntaEePvxc=": "384615000000", - "FGy_DCRf4iIKP7BwvH1FnMgt-GGHgKF8r2paI2pQM_0=": "416666000000", - "FH-BuOfnym-8qY1PQJ4-wTRGRTnaUZaAD3WXNkXW8YA=": "1927533000000", - "FHNL714aF7_9-SDC3Tr8c_XRe5mpcO55DrDkUaol9vM=": "911518000000", - "FHP5yNCn1xtamCUnc6kGjuaBlsw63c3gfo1vtgSZHDs=": "769230000000", - "FIORNRyQvxQa3mMqbndW12LfsgYpv2dMvSYvanxAEHE=": "833757000000", - "FIVZcSgJB8dWGnu9pDJKkrjAK5PjBX8dfrU-Ixokq7I=": "1346153000000", - "FIXIGNE2XwdplFPO4G0tHXVLRKCS7pRQp0rODi5jECw=": "804008000000", - "FIdVYJ-y2vy9k9DMIYYtoJrIbnPfyxCLtS6DJMJMWo0=": "753630000000", - "FIeEFTMGI_XM55o3Hnhac-T4QSnaa0Y43uPdGWSeMHA=": "411041000000", - "FIu7AI52CryigRCI0-e9-TRZ2BIN5nBW7bvmU5643g8=": "384615000000", - "FJ-E46NA-ygnMYXUT0nNxxl0tJrU6m7f_7fW_z7OOgM=": "6570771000000", - "FJ0KZTyzO1y2SjEs-7eMB7XbBdncnQzXvjcYkn8Wocs=": "504754000000", - "FJ9K4rsfhGHyGsvXqEYPoz3pi55CCpe5oHeSqqPAl84=": "39590251000000", - "FJH1uBpcTv0C6Ecfz1glg3BZpKlSXU4tGTkKmQNnEwI=": "385510000000", - "FJmRJl5QHXLY68sMwC64wvXFsnCPlOQcpd1Y_F-uWKw=": "378488000000", - "FKObZK_VtIc1Qv7Hp5i4iieX2N0__ASbXHADYRkn0vw=": "769130000000", - "FKarwd77fjHtDO73SKFjU_MELl0LY04F56HP7WjGgtA=": "384999000000", - "FKbK2zTPKvfdYVVThiUTnpM5eb-6Fhk28ownHUoGchU=": "384615000000", - "FKrODsVMkY8BR9iQY0NJJOAevoL5GK6Qd_FN9HXBlW4=": "411613000000", - "FKzl4YHTmj3CNZTnfOeZBaiSYSFDScNdn679fWWzql8=": "648010000000", - "FLNTCXXZEmZkv66vXTAEnmNEFbHZtaeardaeVg27t1w=": "5005317000000", - "FLWGFYXCpED0uDIg1d9B1Q8DV3WyqwNTGAthzjcYB10=": "1156517000000", - "FLc55gIRordJ6BaYpKLUUKChDfWitDV8jlGuTLvOK1o=": "378090000000", - "FM7yUqL9S3c_H95B41qiOfxTp_BG7i5SFxfVxFIllUQ=": "498645000000", - "FMKnCeEjK2rW0oZ-xrA5LyZcX3kyoShliUXRSUDvy94=": "389500000000", - "FMby_LV2qg01l20to32qxC6cXYTchFZvY7oGOx7oDzo=": "1233257000000", - "FN-N-4gMb2w7UBG0O8tqkTyqMGMpFZ-x3e60W69Y7VI=": "1478846000000", - "FNRkDPzAr87NVaiW0iWAm0gu4MVXrFwl0b5Mde9_cPo=": "750727000000", - "FO-iBwUP6fAlN1_Ylo_5NWy5k5xWolqgNv7EtSDCe-w=": "2610663000000", - "FO5dN12ArN7H9HiisbHRZv8uQQHWnN0vYfvRpStTD4w=": "458136000000", - "FOeP2iZKyiJ_udAo4xb3r0lWyi-rpu1eqoEOSZ4jYcY=": "417630000000", - "FP7sSjsBGrd9O4FkDB5PHshRZgBEbd1Ip5qrdVX6bAo=": "3751727000000", - "FPFs_CedSgMq4-UUXwPr2Aak0EMnX2F0I0rGYEOCii4=": "840121000000", - "FPcFS2zpPmTWragKE-GErCJcEUS7aDieTPEtlEiM3nY=": "797258000000", - "FPhnhUbFMdU0aaoe31HiY9YAM3iQ9kJ5R_8KKOnNtQQ=": "449742000000", - "FPmFhpJJYMIh9l0dTqNVpAcupsxiidDZQvKAoJzJN_M=": "455167000000", - "FPsYgGQR_GjETuNLZj1EOX_lCHolYT8Z6sRCgSKr5d4=": "448492000000", - "FQ-VsbuD2y2y8Vo9w0S4KK5SCKhaZAqoh3EdU4H2CoM=": "1967263000000", - "FQBpOv5wQ3eJTiin1nhjMPPVMKiqE1XnMq0LkAZytts=": "455014000000", - "FQHBQ7dIPxfJsxziXekdDPMdueXF01QB_Q8tPLNyiHc=": "384850000000", - "FQSYap8ETQ4rR3M5onyMgKjGlAJndn7mmsk7VXM6iw4=": "411085000000", - "FRIFLigxYrU1rSUIqiHeYuy8PaAedBzM92rxhB-jc-I=": "1813104000000", - "FRk-CIsoJe9HTPCjlTvI2PWa0egtI7Dvxxd1G0bBKfE=": "909090000000", - "FSHCNRjTL3bJnM5hWKYnYQ3aipux_HsXAHx9ahJQ1rU=": "1923863000000", - "FSevIXNlpRDCvC1oQ7cnIKm03qari2QUFGXmdXHjPlg=": "547451000000", - "FSkAvV0GkdSA1utEqhTsgsF83FILKk2CzKSKIaihBx0=": "1249999000000", - "FTFy_VEjdPCZcl4uVVR4dDkdC3PsSnJZttVtcxSbWKQ=": "1039479000000", - "FTelF3MceG8ZLhHYHTAyhUnS8O2v7UpWo2VkkdphPQQ=": "1930305000000", - "FU9T1X92sAod9aRjmXlo3gYs2SO3WG7YKx9oHxOaAog=": "4964912000000", - "FV2e9gHXxxQ3EibM81LUNiy4ps2Mb_bRrBL98a9YS9Q=": "382011000000", - "FVC0qqB0vfxxJRFJPrlg8unbALLAmfyk8cMAeBwhIPI=": "459969000000", - "FVGvMntQaeRaTchNHlkSDbw0MQffVbNpUsZEDE_xGaw=": "1864409000000", - "FWGJzGOCOnvZy7G4h8IV_IFs_09JY9yrW4oiHZQYrJE=": "381839000000", - "FWQgSmYi9FAO-56c-HUGXqGdB6QEE9Yh3xNVzcS5Pvo=": "426375000000", - "FWX7JMXNt1rdw8DaT2DhqCrSzkBB_AIS9FpeJ0KfYn8=": "417846000000", - "FWmJ0_1W-bj4VkEWXmt5rZ9Rcx0oKH5-5ZOZrxFtPdQ=": "473228000000", - "FXAMJPFwSR6vqjs6bsUuTbxeUtU-myshbobRDrkFuKA=": "423370000000", - "FXQUBFLWHjVv-ul-11MwJ0Qz6_aplCLBbOhf9HAgJSw=": "1666666000000", - "FXqDILmL2T8SrNNziqSunHA4u2ubyzyXSHNtvPuU68o=": "385506000000", - "FZjLQLf9DYjucH-t6VrG6IpwdsvyW9U6sxBtC3C6dZk=": "391659000000", - "F_2brH8Gcpp1vq3cVoJ5Qzk0MlHWWwvzngdVwyBzKqw=": "454545000000", - "F_GnB6FAjhVs_flPlCseV-rU155Vjs6g6IicK-mh6wM=": "456812000000", - "F_OwPzTIVIdBFKr_CdrGU5o3PLPuozf10m-1GRO6B7E=": "5769230000000", - "F_utVSWb05sNineVa8SKOK2RjAriutBIjeOH0R7Bvoo=": "384615000000", - "Fa5PMjDETcSLQE0D2fr1kE8aMHnglbONmCgcbqEOWTo=": "384615000000", - "Fa6o6hyLJh6ASA7eYhcHlyO4k7KcPXuNArr8dx5zQfg=": "909090000000", - "FaE5ED151lNMLW1zGFHD2BxNPVakWwGHaEF7wHrBsEA=": "413740000000", - "FalgQKBsxDRVEmkKDt6s7r-WpBcxhGFfs6_I7ADmeTU=": "406308000000", - "FbSijDe6WvbG9oQl2DfAnM0JH-QuDY1MBmcJ7AYmnmI=": "381360000000", - "FbbQ6kGbH_aL6F8Ze7oD26Dhb3G1Eq6gnkaX7xgG1qI=": "423262000000", - "FbjXXzvlbjAPQbmMe2Vpe-JMGA5vFP1H0ZbDOeVtFEk=": "542442000000", - "FbyYUGRRJcqHXkjyVABaiHnROrZb78umVjcJCa0-_l8=": "473331000000", - "Fc69_asNW0KItbWS9Q8mI3l9RnoTBsPMwEHHMnWcgv4=": "1144048000000", - "FceMRU25aZ5YwCgZF3UGef_Si4rh8LK5mjQ3mXYR4hM=": "417423000000", - "Fd-dko18YsdMEMulej8IKA3xsZAw-wa-LtihTcAWc8c=": "447411000000", - "Fd5H0eGoTjo0yqL5w5Jz8-bYM4gdVqNUGPVJ0Y4s2Jk=": "8461538000000", - "FdVoO4ruTPaE_mDpOkrQ_KvOxkzfOz3B9TZwSVqOqUQ=": "769230000000", - "Fe-4GSAMB31QC3rTfiqCRbS3QMP9jOHb3JYG3mI3gnw=": "2071066000000", - "Fe6L00xPPDZNFrNbAzv25LpO9T2C9cjtMsURP74Z3XU=": "465144000000", - "FeCeKwVznodPYQxx67M4ngo3JZLmmzR0S5crPNECDUQ=": "416351000000", - "Fea0RQ7yI0q-8GpCs4yNFvF16RrBCxf0SUEbUyElH6Y=": "385528000000", - "FegJ5_pjSW1Uz9qlt28uN6aDm_4ScTRY7fqMQmvPLSw=": "480295000000", - "Fex8G3_-C0UdkJnipzW7FxPOIFz37pVJA5_hyDa7VVs=": "912956000000", - "FfO_Mro_IAmrGkHgbIw_X4YnrJoq4w_PC-Ohem7w-Ak=": "846736000000", - "FfcgnCc9OM6Vz3eSfnygiEWDI0Xc1Y-RCnwbLrAVDfE=": "453414000000", - "FgDB-IuZk9yDm3G-Hayt2z7UNRnFj2B110dzilZI-yk=": "769230000000", - "FgsAOP3RBwmddG-aMu3oPt-AZppFhX9Fqc-Bzut4z_A=": "2436983000000", - "FhLhkxchxAcHmfFYnUAbUFb51g6pZ-8caCz-Wd5nMII=": "382943000000", - "FhQUOnWVmF-WalARPTWVoCLS7fDczKQU5SDUIqKwf6c=": "644862000000", - "FhRhXNTrvqg-FuDJNQXZwb-msZEm4abciwdffTbm54E=": "384314000000", - "FjQdxlyg7_dU52LdTh5aoa3GOMZm7ChXtt6Jmwriufc=": "763607000000", - "FjeMcwctO4rtfHGCXTbnbs9ALEv-9oAvd5m9LLokZlw=": "654571000000", - "FjeQj8YSDp5HaY5yHI0PFo8PedEK-JranmPsuXnWHo8=": "423710000000", - "Fk0nVDkGiyhyZFISG6E7-NwklRO3mwp--WCLCl6Kn6o=": "895163000000", - "Fkb8bgpj50vkuQXSyy18xD_uP2P1sohRWlZ5EGneoqs=": "562499000000", - "Fknyf5Q9lgU9_ChXBwqppHLES1b7ztAEDRlvvve1LHM=": "1265782000000", - "FktSEiYdLElPVqDXrXVI3nto7nuQLvkfYsgbXLoiyB0=": "1655352000000", - "Fkvn_-XkAI-kGoSYlswwSQXtFrr1hTgW-tzj3HSyDvY=": "1386434000000", - "Fl1AIib2-QW_5B0Et2pPTYLmdoaiJ5sKdOJPFE15Cm8=": "2322934000000", - "Fl1CZSvP3pm3Q7Yb_VWMJtsUHxVaf0pRBCklKu63RK4=": "407233000000", - "FmDtwRnkKkFsHhfSVoImTTvCkcag10LQkOhwzWhLbiM=": "456476000000", - "FmWYTSrBowZrA51U1WQwjdjiu41rZON8jWDe1IyJls8=": "387559000000", - "FmYbbW_0nI7c72UPSdKaqDWak_kwkYPwDoLHxNFSHIA=": "391673000000", - "FmdABC1oU1GrQmMi-G9WXuBLGaBw_Vcd6PntWbT9Cmw=": "379344000000", - "FnTyN0ykaiuwPkYQrCOSQ0VhR1zsSI0gJipzXrPj1dY=": "389217000000", - "Fnoqp1HL5YBCdMmDcw1HmmT-P9ndbnNwYfxo5bt3p_w=": "986817000000", - "FoVI5ZOfGa-xBwL7reZLp2joGVSG6UEPJM7Ck83EoDM=": "450657000000", - "Foatc0b4DLycyjWEHrZVxynTniQDNyRxy-QWlzJ90A4=": "6730769000000", - "FpM1o5qNDPELRj7TsJDgg1_NC9OX9p8r9pAdyO6RG4o=": "16449426000000", - "FplW6NFtu0ZGFiVhi3Kctxywy7iDXLMH9P_1lJImqVo=": "450392000000", - "Fq4u8-v1sj2lf5W5IlLOHuSpx3CJXXiRH7gJgRpApyI=": "3896800000000", - "FqjddAv0ZqupGourv4GM7wMmY8aLRHAA6dLEDenbObM=": "421855000000", - "Fqq9xRRKhCUpk4PYTXfrvF4sNTQ6QPGf73usc4BOy7A=": "382479000000", - "FqzbAIZ6jYFEPlqv0Irl_kUj9yqCOPNT1KMdszPKIvw=": "357996000000", - "Fr0wlF8o6G1DlQT0x-SetvFWw7cEimeD245P6grQKxU=": "384545000000", - "FrAmWPkurqMEy2auFZHUwrJ1CuOUNT_ytQGnixMcfN4=": "406805000000", - "Fs-6nSUen7gb8REgmyEywaaO3e7_uNOU-bTaYthG9d0=": "13653449000000", - "FsG2zmXECpxDFGYiDLRp6V8S3I_8DpTppcZQZE3aRkw=": "3599634000000", - "FsS2Dgegy3-n_hYEvbSNf6RT4NbDUTDCCgHJgnzdJLw=": "16778374000000", - "FtEGkiKjiFT5JlplXUydNYMnAeVTrvgfmEuSX18y2Ok=": "457970000000", - "FtGN0ucJFo7VdBblsF2E34buaTbSbSI8ic3MdsUQHZc=": "454545000000", - "Fu7u-3s_mHpT9J1rfya5VnKlqL4DXfW6cXT73c9VlsM=": "769339000000", - "Fu7xc6ihY8L4nmKPhr3GRRizUH76P_mdpsbdJ-zQCOs=": "932527000000", - "FuCUuqeTZ3MkG0Higrcq4PWHdlR0Xx-3FG-irBZOGQE=": "470390000000", - "FuIQ1oQpFGYtLngitrJ07dDdvB2etm5vqRk2M3LrbcQ=": "385507000000", - "FuPm0kXMYVbvfhvRclRCXslAvKgVjbEQ-9pQfMTBxbY=": "7924235000000", - "Fun3ECwiE89W1oDb_zTKak65EAiy308tVmxg6pSviQ8=": "1223425000000", - "FvMz0S3eUiEHFRVXUbSeZx7VLFgnweXzTmBvucrvzjU=": "384106000000", - "FvSTZwYewYroeQvqkuH0ng6NerD4AghoxyijUxx0uEk=": "12599323000000", - "FvV47aa3b-zICWTYsIh69zogrFqD3hzPrMjYA02roiQ=": "406640000000", - "FvZvD9jQEx3AXFQS89oh2OlCEpBj27isQemunktSec0=": "455728000000", - "Fvdoi_mbyndKtF7WcqYLyD8mMVhEfaWv0YezgNKt6N8=": "18749999000000", - "FvfOkBSCCKYP1Z-B9bpxaUSDyJE_FC_kFuMH8eJ43PE=": "6653846000000", - "Fw3Ox_Xl3X1EU0rx2eERJp3M-yJ1p3DlFAAeh5eGnFU=": "1128540000000", - "Fw75L62XpOUdRh4vJiPhg9Z2e1bYXz8LIJYC4VhaGtg=": "393240000000", - "Fw8N_FRTQtB6Wm4O0EG55dO0jL287lToDsMVq_V2wDs=": "385507000000", - "FwdIw80dqOddURoh2b4nVuShN2KGEfPuNTQOVstRL1g=": "827094000000", - "FxgeAjbzxZiVLctZ8y6fRMwkwKXy3sYlUTg2Km0sdco=": "386978000000", - "Fxqv0LwSRIT5r_mAhRSuE7qA7CVa_5rciBPxYCDp7SE=": "4070461000000", - "Fxs0gRKyMhFnzGyWBYT7721lIR8Ek3d8Vu1j2akmXQc=": "3214264000000", - "Fxwucbw2rHmNKVYuBuvO5o_9om4McjX2FdclV8vISK0=": "377272000000", - "FyKdhxXy7Ixlxguufvd0KHIDM2eHwYp2Hz99G9q-kSc=": "5000299000000", - "Fz-d1M0NbZEkZN5AXXp2VBHZvBxCac3MJk1kKJsD1Hk=": "634433000000", - "FzAPUIT-puYhhmvQUWbpT_w_NA5ZnsaqSgu4UHmAAmc=": "3235350000000", - "FzC-A7pjJQmK8yAGgXcuLLCqHGNTKrcEDDJxj936u7w=": "451692000000", - "FzI9fnb0UIrMs-Hn0hGMz9_xWSR61HmdwhmxWnQCT-8=": "1859734000000", - "FzRAfKeM-b6df7nCgDQzm1I-OS_7QzC0MCswtMRenE4=": "446166000000", - "G-LkpqfrKmRwNyFN_GiQKauQhgUbX0bNYaRWMi_dn4k=": "405848000000", - "G-aXoF8Q2DooxceJPt_750jEQkb4fUxJYFfUAuI6zl4=": "385614000000", - "G0I9EPVRdDaHKa5j5PDc7vqcp71IZNLBJwzUvmhTrX0=": "1156518000000", - "G0Tw5mKZd6vEWujkx0_6RHpd0cxfcNdMV91DeP6cfTw=": "4593684000000", - "G0lEdEOknnFddp3_shum7A3J_eJcB40x_4EWcaEdVcI=": "3664096000000", - "G0qh95E2EXYQQhCctCFSgzGgCiwUJD5Oy8tkm4IrktY=": "909872000000", - "G11DayhiUdP0nX-vzz5rPyQMLEBPYN5s4y1NSOnEvvA=": "462476000000", - "G2-KD2CmTH2Gt_vgI8E4ZnwBr-WliDqWsB09hGLwOSM=": "2316299000000", - "G25Xgyt9qzTtALJijWBAw9IYxG9YlZVUm2tpHhNLZWA=": "780282000000", - "G2LsRAb-HcIhZC59gYI-slO_nrLdyfBmV3t2bpYS0RE=": "384615000000", - "G2anV00Ho9mA5epJAY_gsCzV-T1jMk-QcZvOV_PAkTQ=": "388842000000", - "G344eccOtYB3E9nKW88biQRXlgIIfvqYmIkHdHrd-qQ=": "691338000000", - "G3LsI2FTTRIs9GTmEsiAvWQC373P-VT2bJUaQlJhqqU=": "931276000000", - "G3QnSS1j7zRTfGe7O5MW7QVTOX3DNZShDSXVQV7dVKE=": "2919265000000", - "G3Rrn4VG41huwXyrx5fRiGOJvNGLyHKmLHpeBe4Cevk=": "825384000000", - "G3l7E2DX21neW8lAXukT9y6p6I7K9YzjjyXyb2ZO_Ng=": "518627000000", - "G4CCS4Twt2gAiMmuBpIa7Fvl08PA60R94Pa1DamjJ9E=": "3976506000000", - "G4VAuUownQ-fwFVXRFc00aRL-Y9Uj3ECXZfVYa7jjMk=": "894531000000", - "G4f0GqQhWgVhCC3wH9ruVXewKuTAPQ-AjJ8sJDrqqI0=": "833333000000", - "G4ux7WK-FAo-9BG38440h-myWobg_svUd6_N7NChwig=": "416662000000", - "G52YqjXarLVJmGBxoSS6XNhOjnzQNnLPNhIZWYl3OyA=": "384615000000", - "G58McO9PNH5Rdi42pBABcGLm6elqoSqYptnuCTSvoIM=": "384615000000", - "G5KT7Nfax76PPE-kxfph0V-mXshd_s67XgDdCIvQBvM=": "4023868000000", - "G6PSGn33ovaRUQWYX8nBKec9g4zEiIS7i-K8kYPPKiE=": "386372000000", - "G72NVML-SENxb_dJzKX2NSenP7iM1gLkwQE9UcA7m-Y=": "385528000000", - "G7OIA_WFuIiTab2tB2kbViRk9xeglKqBQBe72Rnc0VE=": "454031000000", - "G7R8vgaEr_U_78hnNMBE0DwYQYjrhip6cqCSC9-LR2U=": "769230000000", - "G7_JIjrwRfmF17sVZbxf6ApMw5XC1G6YbFQEIsbA8uc=": "767159000000", - "G7hurtkvH_5Tkskj-p655WV3YQ6opJ0PralVVycsVww=": "450040000000", - "G7zYgp2knXefi1rBrr7Aa90t7dLKvGpYifOm0YbfNgQ=": "381805000000", - "G8JhGaQOjoqkOCmuvkNsasakiiU32hnJ7TvdB9XXq0g=": "582471000000", - "G8LNhrS23gt7vBdgjyXuc8J1EirCSaQ7u19zfAD-Kxs=": "3646531000000", - "G8Uan9esg4GRBoJU2553CCbl5efAQkhc8m85SgcFODA=": "377667000000", - "G8XPQgiGY1c-QXyuSFmVxR7Ggawpr_ewLxaHZYfPMX4=": "400435000000", - "G8boOoZvy-_9KUCc9d5q2Ffk0QdkpzXqzO0_pTeMZnM=": "413738000000", - "G8gbz1G5DBC2kaLdsrXoY-YTHZARbAzSk2Wr2DDn4OI=": "416753000000", - "G8se4T41apOLtnyP7bQzNS9jen7U-jRLPwYLBpUKMow=": "3846251000000", - "G9-vYfpF8fTMtVDK-kYLQCB4p0egAGJb3d7h9k-qHNk=": "387561000000", - "G91CfQ_wdt_WtKRFmxjkkdeWoD6hTwnWFH850g23Rcg=": "393443000000", - "G91ao5O0mpBw2I_EBAZmoJXfBF2A2WifH9M4QMPpUEo=": "481965000000", - "G98grCrFhZJaWROUp_Nos2n7fnrWAn3h48OZhfuPEBo=": "382226000000", - "G9A5c8n5FXsrSfofKoxwI8PyTbqEF5ZRkuILwr9KumM=": "415350000000", - "G9lvoCJhtW_CMOvkOzh8-z4MAkL22zuwysTl0b4Bsqo=": "1252901000000", - "GA6GK9zHWPWMkQFGjkV3L2zZVF-oL_uNA7yEzGa2Te4=": "384615000000", - "GA9E9oBB01PI04ptqZexv4HZ7Tsrz55nx3sIP3fd9sI=": "2255279000000", - "GAOoTgKxRbBxjrCDiu1S6RxDFC0Lop40fk9smYhlcgQ=": "769230000000", - "GATExbZ-b0wErsu7yrK5t7__FsCVfpQgSQ1z4YLO7r4=": "469885000000", - "GAZhcJ0hD8oYGcXlYdqpPBTKGZ7QzqRvQXkEPj1CII8=": "416071000000", - "GAbqPZG_XyRFQDyg0D8txUU4ykcCwjPeNXa9Zk-7xfs=": "690652000000", - "GAjAF-WXiTlLfwIMmIee3KNVI4O5uutLonribqZIP7o=": "453003000000", - "GB0Je8fWMiLLKAULHvI85F7yhcykHYSopm90LhdKmT8=": "379329000000", - "GBH5bKVCKXkYrPO7QBQa59p0jWvzyeOeiWGgGXhoBaI=": "1159416000000", - "GBKRBj0-tzpCjY1b0ApoXqgtPyh2GzjmnI_qHydOSkU=": "6289089000000", - "GBXT9sI4ozlo3PGdg-WrDz2k1qRFzyiHF9yp1Jscv74=": "3760252000000", - "GChNHcSRUsE_dinYV0iRBlj_xui8dZ5KAQvCijNnvuc=": "4999999000000", - "GD0xe4Utf6-T8BBuOQGyvezon3Ly8gkHM4WbhvbKp-E=": "416666000000", - "GDRJBWd_BIpk4tua84NPGT-tzca510GdsTVh3NXG_TY=": "1872772000000", - "GEWRS1gCQV6zVqec6YXijrklMnQdINpW8pxhwuts9Sg=": "834537000000", - "GEyH72hmM5VfW49vC2QUDiwJpPZREIOpgC-V6a2fia4=": "384615000000", - "GF87SGtXgMilRzu1pBIJMiu6APaEo3imQk_XAHozMhE=": "2018416000000", - "GG1BydE_RUYtmUGZ_WwKfNm9dhZAACTEgWy75rbm5hY=": "769230000000", - "GGInUc7lO_wNLAwhAm9ZJRKOm25HVb0rHUd7s6zoHSk=": "1846153000000", - "GGbU0JpOQVGbqCLqlWEU-LKz0x7D5yFlCiO5KGvKetU=": "407808000000", - "GGnac2LXn-Zoacu0OHlnJczJIZTE3eOdpLtOMNHX8j4=": "521709000000", - "GIPnGJHVvv-9oFgcSHBLOZgFgmGPzCMNYdgN4S_CI88=": "473001000000", - "GIPyTfWveLFik-a5km1F7HaQHVZk8Y_ykIY5zEIfk_I=": "383550000000", - "GIy6sNiWTOdgtfamWgfhdcnu9kjfsWG0vRmLqJfsSNY=": "364116000000", - "GJ6GerJLJdW04l9KBSJLQeY5Wunv8ToS4xhNETcL3Aw=": "381802000000", - "GJ9hgf8zgTcw2D29jvy0B7wWu4zNfpgirWaRAnS1u90=": "377845000000", - "GJAYkOqar75PYlEL1lrqDKpkRmihjtGc831xtT21WYk=": "416666000000", - "GJX8-437NvsbPd_5BGOBsuoTTjffE-ssl6M6522Dpas=": "381497000000", - "GJZhrhprtaLRl1RTn7WmoKCXzDpKn3OJdnKfB6HH5Mk=": "384452000000", - "GJjLr1hqqGO8Q9rEZKoPB0bwi0Xrw1aWO11TuBSUof4=": "384079000000", - "GL6wnwq5bilr6LXR3j8OVwHeDoR0wJE9uyHmoNF7vXY=": "411085000000", - "GLKBAxlE3zQ4VRowqFPdWaPNTnKOAVAI_kjEzYeMyj4=": "458399000000", - "GLUek0eZDkA_XMXLkdr5Jx31hfZUewXbEd72WX3uTUQ=": "818181000000", - "GLtdTV89RpaKah5qrJ_VpKF6eML3n4-S47U0zcJjZ4g=": "832946000000", - "GMFfIVJdU0_1tOWq6pY4Nn_h9MuS7S6fY3MJDvworBY=": "2590872000000", - "GMh9EN1aatmaH9fKfY9TfQ8NAzQGfDaLIzTWS6UU_9U=": "386870000000", - "GN68CChjq2jh-tKjqbSfHqVe0mlpys4bYH6DlCj8YM0=": "833333000000", - "GNEfZX-xIoA1cTZeb_4lP6Ab4JU52MF0aM-UzoAydZ8=": "384242000000", - "GNdSrZkJPcpOWph7Z0GIqLX4T_bLqIVSo7UYfu3_JRo=": "384976000000", - "GO80aAv26FECHw6ToDAEbMv87b_6Gq9lfLoGWJc_ggU=": "2157676000000", - "GOcNI-KQfK3LstODHCzyr0EPjmsvzRG2s-pdfxtEX7w=": "421134000000", - "GP6oDZX9LsLSxoQwCgipm9ivycv4PoT_9Ysv26c0noU=": "2272727000000", - "GP7vIrFLQmTK-0ya_7V2tWwF876XwMLP2O4yHycb2c4=": "1191644000000", - "GPrEfpWqmzIMitTREjsnaxo9YrntnIQN23VX5h0SuNU=": "480520000000", - "GQ0fXd205BV5A7JNB64GTQ5pp891CSxibDiMcvpn2G0=": "384372000000", - "GQ96YFIG-CXAbY4OELUUkVKGZ6in2HLf6UxHefuJ0Co=": "4149998000000", - "GQNqMQEU5-kLg60k6naZhQ-HzbkCZ8ESULiB0Cabnok=": "382720000000", - "GR6XcYp4fdmsUTyv5IodxxbpJoAz2CpdQ5umPwSNZxc=": "7692307000000", - "GRKcpUNSz1I2Y0RQv9OXPRsOeFpzMotKD63Okn2e5KI=": "1538461000000", - "GRV-ucwcV5qAUDEppr15965sKTnVaZ7jpUF7Zicbv4c=": "4553672000000", - "GRYWu-1hryeBNUXhDCG3srpZh6wuAYIR4qPM1ZE82RU=": "379928000000", - "GRmgKcIFWPy1pKSOV-qmQ7PJOjSUwwac7npsYyZvWNI=": "1156520000000", - "GSEMo4gaack-Kef6AhEDdIH-HQGbqwza3A7xW_DnD0I=": "504461000000", - "GSelTIY6SBoVHiqG3yK6_AMo0WYBq6s5PmWjxyie5Lo=": "1862771000000", - "GSh4GBVSgUJZrKIIIZRbvFKG_ZjgNM0X_nslDgHIIiQ=": "408021000000", - "GSzFBH2y7XUhwvf-28jgxa7j_oq1eXJzoE-jRm4hSOk=": "883752000000", - "GTUnA_Grln1QbedAYVPmKJHUafHqiQ-nKzSW57aw-uU=": "473366000000", - "GTfJH23WtlS0ABIcjHX9q39JTfNsFK_Kj8yz74q3Z3k=": "464704000000", - "GTnZlSWEXtE3bWdnz5BGzk__JuFRipFOLdtU-XeoOE8=": "762293000000", - "GTuoDHyFuVh-Bkn-WMzmb_wI6lgO8jhiEAQLsk4CdJM=": "12243737000000", - "GUiOfmuAcFvjRofr-dfAzsjeUUfEhDnhyp5o9d-aFCg=": "381805000000", - "GV-aR7cSL9Zk6iEEwpDRzg-KEzKHLF5NBCPn3ud6p_c=": "501897000000", - "GVKoiEluG5i5Heag0c6h39ot9NYEFkvo7B41C2uYdLU=": "4024342000000", - "GVQZbdgt-4MpuTuld8TjqDQIwsFZe-gxWbzzXp8K_is=": "417630000000", - "GVcrsIoajV7MgwP30_BpWsU69ANrqjKnrcNtd6a8F_k=": "504471000000", - "GW103odc5FGSDSNJjUS_q1F5gqatJVfCYJtT5M8jOYk=": "386608000000", - "GW1HJSF-SmSLRAmdP-wWjDLDNlsX_p4QkFk2Z_ZHNLs=": "470073000000", - "GWHcLwX67S0Beacs8kvqIwV09GLO_IghzinSG9DIiQs=": "482633000000", - "GX8kxuf6nFNx-SS7v88bLvNv4tZBZQ_sm06ib9hKHRk=": "2253376000000", - "GXEqpSj8ACsr8DMhdPV2iZ_ipK2nsUbqLsKVf7OGE_E=": "384615000000", - "GXZK0FRmSrDT2Mt34Bi5L-1OgUaHaoBKiATny5PCjm8=": "384615000000", - "GYSJmvEI1SkJnrEXYdgwHDKn5i4jWDDeAWtdXVYUgSw=": "465309000000", - "GYSjHgg97qJo2qFVK4VdAdgf6pMFR3695dBV8FzQzuY=": "4516088000000", - "GYT8j1DRwu4667ZBQSwjVc0swLykOlRr0yE5PI0yaAw=": "1153846000000", - "GYX7Nb6-dxfcLcaidNqQ5YkTlJQJyyWUyxZnbI-I04A=": "405846000000", - "GY_Uubh1kurHJf81A77N6ur8JtjLq4rNoJalXAsJDlQ=": "454545000000", - "GYj7253qmuahEzg3suqRxKQ0DFgupZPaU3YS49khNvM=": "1249999000000", - "GYmxDqv96B224EHzGwOQmV3NPxaLjMErmgm6YAsXvBo=": "544142000000", - "GYv12w5NyPje0dfVDxNONivx_CyshWrdcbSZN2Te7Lc=": "4627463000000", - "GZ2Xjl1p6iSwOef5mMmgcSBTIRoYcAP9vkKxOGbQGTM=": "1625868000000", - "GZ9reXVBvO5hBM37eqESfitnM9zcgkad54S5-WoGCKE=": "457277000000", - "GZJ0SjU91_dQsofWsS7Tyr9ZidHMYukd6WSsydbGzjQ=": "2045374000000", - "GZe-q1PdoMedazEowVCQ4o445pvx3G__aIRK2tWUSJI=": "385507000000", - "GZevXO7a5fu0JspsLHthczNwyXgKjRY5NST62tj5MT4=": "769230000000", - "GZmKlrlhU4TKvLYVQr0K9wyUbrRryNRvdopy-zs2xtE=": "4866611000000", - "GZzBFgH4yhBaBIX4BhpdMGSyXTgQKwwgJb2TD3om040=": "858310000000", - "G_HLG5rzvx_ALU3valsYT7mSU3cQYAteEoMHlEOCFYw=": "1538461000000", - "G_RHCPCGBAo5CUrQLfBp8iuWAqd8bNF-MuXP9gA16lo=": "469846000000", - "G_SvirTkML8oOMUhq2nlxLNVrJmMrtAbUFFYEwHxI4o=": "381836000000", - "G_Va11qAI9LougucogH8FIXZnI8brJzpspvX9QpALFA=": "424715000000", - "GacbYJij3l_FWQBWOJbO4n6Y758dSgp5SE2VGezOpuA=": "461801000000", - "GbTKKFQZMOhYzJoUYn2vyDkGBwWTvJEfRqJXS4NsiN8=": "406308000000", - "Gbb4k_q9doHFOzn37aYk-bsjMOznv1tMrOKr2cKCHaU=": "421993000000", - "Gbg7gAtxCX3UAml9p34cBIVV3K57_6vS1RHlffKWzRE=": "380716000000", - "GcWaktxM4_RIJ9ya8FgDS-_R6X7um9wMB59ae83JrA0=": "1233257000000", - "GcfwRDmhNyTvHTbBGL7D4Emr2wtgK3MOjGhSADAn8wc=": "19894257000000", - "GcmlRJM7UW3ki3IwkYyW_WTcGc-aIpoxODdbzwYpqxo=": "455600000000", - "Gcps1T3uYpcxPyo_MoNOW7JbTyOqPP0rGDgOjpqGYZw=": "416501000000", - "GdaC7-Taf_yx807CHEn6p97nsjeBYEdKub4B9Cj_Z14=": "3763933000000", - "Gdo_3Av2C70_PtzpMQJIRPlT-AnU5uavUiPVqySIoGg=": "28578454000000", - "GdyMIz3D7SC9YUa6qJ8m-4GBfgJ1Ltz_Z1S6kwy8gkY=": "1924102000000", - "GdzO1HwItqXBC4QdrgI-hUjXTEtPDe0sbWDHjiQtOr4=": "454231000000", - "GeAS3cuRYenf8sVqu8o56Q-nOKnVUTAKc7o30EdDCKc=": "469310000000", - "GeNTBiJWfThSQv9rIdCUSVhK2JwpOp_t5krzCkDbTYs=": "384615000000", - "GeSj82pYY25MH3vJYeBSr2IALiODAkXbJR1Pd3r4eGQ=": "543209000000", - "GeV-J6ygUKuCKt4AbGaIl2jdUMOFhnsS7qC6fkC67gg=": "376944000000", - "Gf6RxKllO_VDXHxoc73a2hPNpCkBLH6I3xCKpYJbWU0=": "727272000000", - "GfGw7MDu2EWSZS2C0M8awyiMPhz7dw9o6mdoxABsz08=": "1223425000000", - "GfZJ3dP8GI4KxPn5F95g1JDIhZcB-b6Iq0KimztiuVc=": "456230000000", - "Gfzs7JYTHtbHFvqs4kCQ4zZHbpkbtNtEVupgccScBhc=": "932184000000", - "GgJLmTMT-ukd0UcoMEXPn6wdltI2JznAx1JNQ2_yrxU=": "4166666000000", - "GgSF-_sMUFV3HfygmcPx9ffNriDCl0XN0CeYyTgP3Xc=": "2304270000000", - "GgeqhEkgSslcIrYra0-V6B3Ew9LdzaRX9SIX-CYOvnU=": "464104000000", - "Gh1Kicf4ypvNnmBFl656_Jm7zgJimNYClYRtLJIx0HA=": "7710216000000", - "GhAZ6GLWi6hWYJORVx10TF5eDPfqjUD_LaibPFggYs8=": "2074744000000", - "Ghy_ydlyEWPve7-zCcZoFAmxFo-5vK6Us-1QkmvCpSc=": "38461538000000", - "GjCzU3W4Z9IYfrLWPki8e757FbB0R8XzmnrJnyJo7sQ=": "1382564000000", - "GjJCAR9XvUSdworS1UMOOmyNJhmVVFEyKJAfiYgEIdQ=": "382394000000", - "GjRPcvYJzziXXTT3sS6aLHcokwiq--iio7kxZRZi44s=": "1893120000000", - "GjZYRgXcMlur36Jwzy45pZxuz3qBC09XzSSwlUgdh64=": "407692000000", - "GkAkPTavuKPtq3IwTMagf0Xp6lzhLM0uTbKUeHfc-sE=": "382394000000", - "GkGh3vCQYZVmXZGIuwYJ0fcCTP_pLIN0sk5dAdbohaE=": "3846153000000", - "GkUQuW9blvyhuN81GJFOZwkzirnctEjGcueH53gJ8DA=": "911024000000", - "GlXkci1IFB1vtIJEdZkUf4VKpP6hie6msnrrUYJNLsw=": "1880792000000", - "Gl_jccj7t7lIRgDU2fKQVppai5N2op6KJyM8CA3blj0=": "500286000000", - "Gln7iaMWJluVxe7C-dMJTfsDuV30NzFGelEff7gSsUY=": "908755000000", - "Glu59I45xWNEG-KmNcD14oiqyKA_hdG6rMxZVN0tso4=": "423710000000", - "GlwsvjUEIOeubG4jC9VrtYu61nvoBLiKbXqY0hnBQzo=": "4110858000000", - "Glwt4yQ_aenARYOuDuXVbT6D-P8RVfWcuXW_JX8RQOk=": "525627000000", - "GmXsgbBgVnd9r0Spe5rum0rVJd7O3ZNPWybJylNwbhM=": "383818000000", - "GmwIfouCB532uwIewZasDzRMH3xixDt0E8JsTxawITg=": "4633507000000", - "Gn4zPw6CFsaKa9shDJad7f4MRiSkC-aSWBH5vnBLeR0=": "499999000000", - "GnAaNYbrD9dPtDw-7S6e7xb2aIU4rtIiCi82hk9qU2Y=": "824028000000", - "GnuwpvBFzGJPSFJZCyLUvUF8317VdxEo6kidrJyZlS8=": "3982292000000", - "GnyC_av05GR6W9DkNu-1wGdEZD_PQ1OHj9OZWjs2FUc=": "367173000000", - "Go-C4sm8EDwCoo16GX0HvOUKx6X0L8B5v4j4QBk89es=": "3378050000000", - "Go9nMRmMchOFJ75PHyDRfAuTmp1xhIiiKexWHy35EWI=": "852806000000", - "GoaYAQpCJiOjt9ZgWpCDwpZz2Wlj-39xGawvWvI94jo=": "1927533000000", - "GokJdWXYxo9vapug2C3fcvE19NgRB6Mhb-5WZKsi4WU=": "383980000000", - "Goqw4D8yurMO9KdbPCCHPB9tKjtGAtwebJRDvhxzZ7c=": "1139749000000", - "GpU-N7lTWvaMYV6niPL7rtIFgDz6dxn1S0e7EzHYCYY=": "461152000000", - "GqDHuApiti6Gyz3nZNFG1wKC9GfI3Y_X84GAr09lP2M=": "741784000000", - "GqPi5rhegDhQYDmhlGL6d2y1iPzIhkeuch4HPwHL25M=": "451355000000", - "GqZwcFZpczmitsEB3viz3ytCTlKlMLrfVFO6B552hKU=": "839717000000", - "GqjphsluSOXeq8y0pIcVee-kybKnYFt1AlyCEDbxrAQ=": "462146000000", - "Gqxk1KO3xARSr0hhPJ0gNXmzZ-c3o2VrJ9xbryJHKo8=": "466542000000", - "GrDcG2kLI-JkP6gkHQQZlkclGZnDYybIz3BZyKfUF8I=": "1919473000000", - "GrSBEVqXHhag4Qz1u8nMpoBIA3EnBh0PdBWP9yu0fDA=": "385011000000", - "GrqatzZT-fQSlxES5LoN3OTYDIeERrTNtfSF9awUicg=": "909090000000", - "GsTuAviHRQD8oUiMEsVzDBXM7mJhZ57jbhW7U5_8zI4=": "833321000000", - "Gs_Lym2ZgTYAEWp5beNWdl-aM_nVct0h_zv6yDh5lBc=": "384583000000", - "GsatSlwUKGocQGUZeQILj8jbSVPDYYCQi9GpOryUNvg=": "706351000000", - "Gsj5PalDKBEtra32c-M51yV0YI8sM7fiWFima1W1Lyg=": "1684921000000", - "GthvJarzDcYqjlMFLmJKbl3QZLpSm-i-KcfnF80MA5E=": "958399000000", - "GuKLrJWCmG9nhqxnclyKdaKE2vhf2XpeTTzceqn42bQ=": "388357000000", - "Gv54fnPFpi69uE6zXi11kaMwu53KohwzSZYXVLTae-Q=": "906947000000", - "Gwu0N7D-TB57xB8r_ftW6RY4hGqHd2PDAVkhpxZAlss=": "378034000000", - "Gx9TE5PbsvP5iNVac2lB7XD5B-_ghPeWSqAj-uqEjxw=": "1715429000000", - "GxC9IIDrfu7wZUhjkjzdMpF7r3xFf8iLccVB9tm4HJM=": "451739000000", - "GxHhDcgOv5CmTI1aJIN3Sicx0Sn4gH9f0jShklGAvsU=": "1621596000000", - "Gy23stwiGXaZNhDwQCjevjRqE0F_S4VGKvhZFv1p1fM=": "1941362000000", - "GyBgU4LnAhk29RUgneBGuyk51oModFhIXD9xt-2wTQ4=": "1578238000000", - "GyILg7bvplFLv8Q5CZr88aLKW9piXG14u7Xgc0I142g=": "3137080000000", - "Gyvu88zV47bJV-3TbTdM6KbIb-gkdYTIS4PM_RTdgpE=": "413977000000", - "GzK1ltYxs-gG0gHCes0CvVl_aZm2Ut_ZGBMOWr3jOfw=": "380485000000", - "H--EBNOh0GKhP7UifjfPkOVNp9uZSSHAHFq66wthNRU=": "2272735000000", - "H-ysyhIEGxuyv-qiA6xnjJkc0ILE-_HQwTS1YEPYqFY=": "387033000000", - "H0IOMld3nupjA7xYyH29iOdenkmk-IcDfHgF_M_n7_4=": "579779000000", - "H0K1UbatI0QxqhTkcyzIlhJlvl1IG3C1eMLIKB38hEA=": "1153846000000", - "H0aufDSDD5_1KbgB8jwEkt7TvAdty3LuG20V_IFPXYA=": "2365055000000", - "H0qkGmy22ZMeLCeXCSlyeZ44H0HKE4aahpeIgS6ivEY=": "598486000000", - "H1tPurwNnQmJrPO8JWQXZ175K7CSJkKfIGlx2az_sxM=": "385507000000", - "H2VaNm0HKCAbfk0nvIcvoLfXCrvLsQeLYN-QktHqkUM=": "414775000000", - "H2Y1RU9PpsJ_Y9OxZxJKJD35PQR5h5oC_2yL6C13ylI=": "453915000000", - "H2hSBxVd2w-xCwD1g0AgJL1Bogo6aYvoXv0WrpaTrvc=": "417635000000", - "H2ogJunSoajxaNMIGQDqeT-7wTNYfq5IMg-XpZTt0Pk=": "2260550000000", - "H2tLE92A8DrdvUThpH8VbZVgiBC249fwDa2PjUATZRs=": "416666000000", - "H3at72BJYkO0KlEyxFap_h66UvLu-9sVd7LmcGnon_M=": "1146000000000", - "H3eTVQej-7qavO5EgxbDTdkMGzW5kOC4R09uXMH2qvs=": "413140000000", - "H3g02gXuYM7YRwRO24TrUQ1e0nqvgUuk2tHTabcPyto=": "419521000000", - "H46rQqijsd_hjBb1XWOAnYhiRMxGi2allSBnrcTSyYc=": "409116000000", - "H4SOMgq_wSgMbCI165aNcm-NpUQ3Ib-NpTEUdUL-iA4=": "384242000000", - "H4XASU7ooEGIJ8zrPtvNPdS-G5vdF0JwvB-1mRYoAdw=": "1843554000000", - "H4dDMsqF9fsBXPs2eRtN5-YTXXEFr1GQZiGbYIxZy3M=": "417632000000", - "H5DHgrdRacRv_Rq3j9wToDe-qi7u97BidAffDtqjVX8=": "384615000000", - "H5LJip0aFyD-aR8J8iDkAKuRLmo4avKuYHt-nrGf9TA=": "522085000000", - "H5iPSKKDA3qxNt1ZmeBnLJs7mDlyR3PNb3Yp9wTxYKY=": "1374999000000", - "H6F6qYtOQiIB0vBwRxMVC12MIq6N0s8jL6_-mlSeiMY=": "1667446000000", - "H6HBASs_j9GWnpopORkoCzvtIRgiC5e3LAL6lLEtggo=": "855068000000", - "H6Z6pFUa_jhYP3qdH8FIGJvp721qvyhKrUo68r6-Obc=": "453974000000", - "H6tto94oiBx7AA2avgsMY74OY9wkWR3F2X4rjYgQ5V0=": "1672715000000", - "H77eRa1UzpvgSXpxiZOFfgnWNnDcJNWOzcZpKz3Ltd0=": "1538461000000", - "H783yR1VIxaGeHuZio3f8FVd5F_nLwCBARe-Zm2PJ7k=": "769230000000", - "H7HlpP1A5CafXj9vZKO7_AIBcf6AhklPPWudc1bnD5g=": "388083000000", - "H7K6umURIEUCXSn6gS97d3Ze66VY6OmQty-k7WmPnMM=": "386930000000", - "H7PL3CsrnFaKvY4LKgcEUDaNltpIS3BIrQuDHtCrwsE=": "4999999000000", - "H7f-Zf1zngK4jYY26-tzWFTABeshdykrEUFhmrd-l5c=": "655281000000", - "H7ousnUXdrjIOD51_gbWDjWd94mS06DMrfLY16aplP8=": "498982000000", - "H86X7JKH19xm7JwhGIN35rV3PIP8pvd_HixuPDKVxew=": "379717000000", - "H8Udv1UIXEQLV8Scs23q1kZqoAPmDTKdQTILVaJ_liY=": "1159720000000", - "H8b4PBH9fAz0GOgAywmbwebbfANm8R1J05fkfWoRLPA=": "384392000000", - "H8vANviEsYGm6b0k0EZ149BcGje4oXAJ4fEALiGV934=": "1249172000000", - "H99kAPyrh6va591JT15n2uNFmZ6n65QaWN7Q7VV1IRY=": "1156515000000", - "H9H13Ycfd7HXLlcY5x0AzL96k9xkqO1A0tSP03Fgv_A=": "379344000000", - "H9lKabRuLn8F-UUB0dTRxHk_PdmBVmJE0vDjWwW1Uns=": "909090000000", - "H9qh7A_OjmkDrdsNq6eRLuZC-0eaIztvHFKPrY2S3Vw=": "3708500000000", - "HA8lkE1yLk_-i9pSbfO5lp2lRXRWPUGbmRR3Cu8BZe8=": "45246040000000", - "HAmo-urF7jgGSfZgsjZAsHtwilwWGi12Cu828NYm4vs=": "404104000000", - "HApjw9E2sVgldFHMWV7amvclFTlGlpzsCPY4g5EApWU=": "920074000000", - "HBfCQD6wjgYfNp1axVKZC9ED-cdCs0fEK5fM-u3cdz0=": "384615000000", - "HBiNgL_VRpmtCKKsijdPxrESgqb3Ga35uTGXs65Yqd4=": "466091000000", - "HBrTL58JZKiPQ9kgX4V1SubB7IQjoz9e5zulhDvvW-Y=": "1213634000000", - "HCOSRyKANHwHP-cZfUYcCY1xsnEtYzm2SiCJ2xVCJeo=": "3395389000000", - "HCjwIn3OJyhHAl4QNvB_-g_LrvbMc3tnk_hf-1_NuQo=": "384047000000", - "HCmZCDlsn3DbVi7bQwwM9iCmQ6jMVPw2PdGV1H_p-Hc=": "3878592000000", - "HD6HN9fGUMwdKK86ynd5SbhZmVoHhcxI-Lvvmc5EL2M=": "411085000000", - "HDEc1KdUQQX6rICC32t_E6T3viLskvpsH4myn_ys8YE=": "463640000000", - "HDLQjvnkhXlCkbtb-9X32KcM-pm8ku3Diicnf6Pk6Jk=": "1340123000000", - "HFJud-dNakBboJXg_BT1cEoCZ8DWWQ0156bhI47Uapc=": "412397000000", - "HFNW2ZirFj8UG8hZsRH5K16WKQoEuJV2qVjV-VJ4g0s=": "416848000000", - "HFSXtbP_MGozYSnWg6-L4y24OP9Y8qEgYs7kIGZaCdY=": "1233257000000", - "HFwxnaY9Q9SEZasj-ycOFOuxRbWuDfIygu-U9grI1lQ=": "411085000000", - "HG-oRy5aXkp4jhuT6KyAj-kat4W4qupuOsNE6eCH2dc=": "500889000000", - "HH1f6-j7U7pForTDJn4m5SGagLyGjSsb_pT56DxZXjA=": "5028076000000", - "HH44FsUh4E_he2CjpB4iIzg1D7AqWLFq33OOCIYkGEM=": "1147839000000", - "HH9deiUZIuSHq22qUAoImJiX-VAXq8h8OFXO-3JzoRk=": "473265000000", - "HHoBeJTektP1iDnYXBmbtYhk0W9yVwZ2w7xRCRgN3_M=": "1143132000000", - "HIRam9gekEaosGS_Me_ZbStruJoa0mbEe8ilO73gj-U=": "381582000000", - "HIvguyGq9bZeiNVImnOi_1ZU6xfGZQdBRsZccu_9760=": "383670000000", - "HJQCucD3wP09e823nbp9-Xx-F_4_M0o4jeamMHLCd9Y=": "406865000000", - "HJpfXcnKzCinm0IyKuQpTFFwNJlVHYA8EznqbWRLOyw=": "8493455000000", - "HJzeEMI1-9DwzmKuOVwQ5lr5zTjNXF0MbChl9FfLp5E=": "1982473000000", - "HKBJdOhxodSLbN1xN7WUcABZcZoToo24HRBtUZGe3p4=": "4613929000000", - "HKdOT37FHg9Dy-APyaf0IkQSuHUsTvoQbWDBpV3vlC4=": "422561000000", - "HKk8FvnGCOR_z6h42zX1guRm9zj-OPF8vMgbHCYl4jQ=": "886640000000", - "HL6E_jF7N21eBa-UQrWZKVSX-UuP64FdBSQN-A8xp3M=": "1153846000000", - "HL6K4g1nW7xtKfamhRvDyr5kWWo-PxOOJ1Hct01hQV8=": "393037000000", - "HLDbu-6oUivyle5DZaULN--05d-ftQIwKnMAHQ7OpI8=": "812897000000", - "HLbK_xXgZ6CYxrD6FBmjJjL1l8a3fFZrKCH-v-U2Hqo=": "384615000000", - "HM0cK9AuLV79QJXG2QYcNzyMw3p_7JS0a8WxmEJ8B_M=": "4980606000000", - "HMMTpeb-9JDn94A7UsS4g2VIxFGXWGvGLGbrIJq0qPM=": "384508000000", - "HMqd8Bm7PCaoVjWX5S0I8NCdEiB15y4ZvNeRO3Vk8_g=": "1826049000000", - "HMrZhBnSGkIAwTxqODg8PWiV_jyDUfvaFjSs_rdaenI=": "377567000000", - "HNCywbagVOWHDPOmeE6CwC14_1zujD6dBfxZVahJzxk=": "7711649000000", - "HNQM87O0E0bJ80UuonThNWqScCxMzCeAZTm1mZCywFA=": "411085000000", - "HNb67SxByleQKs1Q1VfcerE8Hp_5eq1hQ8lQgwDqzRg=": "385506000000", - "HNiKfXSUTKrBP4IZW_YEa5grW86lB0sGEpgFz3TTdh8=": "756642000000", - "HNycnbx174CjU2l4udyo0oUzMShUvRlR-Ta2kVRzlBw=": "9136328000000", - "HO9gtWP3rJw5PDK0cZ4IdZDgphD30_ODP_ftIUNftH0=": "470553000000", - "HOP2blbk2m6rwmAl08Cv36Q-RcM8QbQd2A3kGKfcv5o=": "783595000000", - "HQ2GmZRXqVCrw5-NclOI6qtawfEEPPdbjJPblxnqJ7Q=": "500352000000", - "HQ5OnhOsDObjzu4yCgkf7m39bcYFf20i6EiMrTUSp7E=": "1135024000000", - "HQAGdVApMdCEIPNUEM_c0FBsWTIuZ4BXHFPAE179RmM=": "384787000000", - "HQW50czGz1bBhPCz1cCs60nYZ3WiPsOh_6DB3p4v0ok=": "778136000000", - "HQpXFTxj7LRQVenaaROnrPe-QQBV4VN24k9HQSbWww4=": "1217572000000", - "HRWYYBVI4ymTVPOlf1labbBetRtw3TZ66c9ZaCbUeog=": "407808000000", - "HRhQfk1da1mvefGoAiQKVgsw61LxmNZ83v-FLTvlJcQ=": "1814349000000", - "HRplOUIMuB-kLXgYcLsM5g8PPXSSZ3n9OV3qPNaVpsc=": "12499999000000", - "HSQL78rocRCSOYCfsn5V9mUMou_0uZtM7hFSnn-m0eM=": "455597000000", - "HSbIGJFuCqip42vAV4oUv6igxseurQfPJKo_rCGu1uc=": "388246000000", - "HSj1wuM3WMU4KlZtQh4V7Em227fjEzNdgUf-3vtSFSw=": "1153846000000", - "HT9Sk6juVnBtJEEUXNdNO32Pwzr4IKzP1KnIKBRP9pE=": "385117000000", - "HTsuyFhXldo85_HtUpxdi1SHwzm0iw_JrnafpY3mUiI=": "3158373000000", - "HU3jLgeMv5G_eWMNRmJdQAl2Rq7k4MnhRinhcg1HgAU=": "4170805000000", - "HUUkAROimpbkCkYGOvB1Px2cj1fi5XvOVpHzfjsZJXk=": "385715000000", - "HUf2g5NpekWLhEtjgPTeQhHWh2YunoGtxPU5DaUy2_s=": "411085000000", - "HUgvOvpLijjYG22lNBiit30qRlFwPtxAOWhdcfhqYNg=": "462839000000", - "HUoUgV_fFXjaX50bPCll1JL0XhxR7tdu1NgBQtG1x_k=": "385507000000", - "HUzWc21wgQn-Z3xgrB-TA9pKexe7WFNL9O9TOaHgzJc=": "1153936000000", - "HV0aV66-5i5ORUQflYxpYpPWWS0WIkTcw0cAWV5Ouus=": "654166000000", - "HV4HXLge5Ha_t9abWzwgLj_knrf4n4Esnga81Ekf-qI=": "399446000000", - "HVgYlgXjyE3dRXRT7zZ6w254SVDt18RikSLTopRs1qU=": "1002567000000", - "HW7YLoA8F0v69xZgEdJRhkXpubkhPIKHn1_8T_-z43A=": "4349692000000", - "HW9Afw5Sr8Ow8XJSnGLFLTc1cpZhvPM1IeLsD9TRAYc=": "2495859000000", - "HWF_0yboeqR3GuifYdwrZc9pfKzAiqjbmvql0hpZ5W0=": "5954284000000", - "HWGh0-q2vSBCGG6eOFTsblWqRg6PpD7GyG60vejmIjg=": "492802000000", - "HWbVg0rswzFZQRsAUgKIqNMxPgzIt4O4Xzrdxp9iRzo=": "416632000000", - "HWrkGMxGyTcZFVkzXFn5-FeRHjrvSL7BHyjmRQKPPXs=": "455600000000", - "HWyXpaFHsJVvSXiToAZtLY0TaqjQ_3EhyOnzN0k9-B8=": "2441712000000", - "HWzN8W_myU3UyKJ0ateSc-zgsJSos5s-uu7BcQzCacc=": "450857000000", - "HXIYGSrdBpa2BgLQh9dKBKZH62gAIjuxZTuK62RchDQ=": "384615000000", - "HXp7yyucubzG6cXc_5dubJhVoUcKssD1gKaZ99GNypQ=": "629375000000", - "HYFNfMlOLdlHlEqzs1u_Qo42nL-_t9D-2eAxcahEUtQ=": "1373149000000", - "HYRCaDBfj9Oj5AbAjqIC-ID97MgY-RVDm8pMu0cDtCs=": "419362000000", - "HY_xMhr2CJ0d9fh45gVlKKpW36QB96kvT9suOCI-CZw=": "452957000000", - "HYq5dje9BJ-5vTvNk_GJK1k84xDOJu8TC5Tu1eB470w=": "4999999000000", - "HZCKFgN6bXytZcDC5ADhLRhvVMnV3ii5Rn_K58dBezM=": "833346000000", - "HZKoQJmIlj47Y-JGW5kYvzFpxZeAXf5Mdt-IXgvGPZ8=": "475303000000", - "HZQC6U-6YjxGZJ3GPZWBXt-jO5iwyUyyjJIIR3Dblkk=": "384615000000", - "H_-vO-N5JJqU544aZ0cRYDI57l5fdgTFlRIDUwWtcV8=": "382805000000", - "H_ccpGmMnPfixCpa9aI7UQ2qj6z89wnSF198OcNt-eQ=": "456369000000", - "H_gsTWnpfhjIaFTadfrIYzfIVQ0xvPP_iZKC-yGGTGQ=": "1249999000000", - "H_ou03IwDQ-aSosUANH-_XGQuqH-Yk1U5KjZIxPS0NI=": "909090000000", - "Ha7KwGeTCAXrhw51RGjsVZxaX3878lowW3tiW_bWag4=": "388676000000", - "HaBdw63Te_bj_9ofVl74UzBck0hRQsBQXyc3CdY8et8=": "385506000000", - "HaUtusy-K7D5hpwun72AQlGjNHBQ2kIzxPjt3QZRV6w=": "456818000000", - "HaWj7FrPY226am8x3NE18FqDyFN84aKGUOXnPSL1jTs=": "454340000000", - "Hbeyc4PShsLvrWmSUvepFFHHNHs7QS83TzrUzi0YXA0=": "1990037000000", - "HcFwh3ZBo4TMhlbtkoJZz6qTCm5vpjksQp_U-2M06qI=": "404829000000", - "HcecG7uOO9PhJp1gMHBAvxmjyGkDbhuvCgWxWojfW44=": "751149000000", - "Hd1WcfSDXd9-n5opdiXvFpEGVhkjbaXIlzGV_ThwLjM=": "670374000000", - "HdF3-8057jQ6G7qc4NKg1Ey2ntTCkUaLX8pNT5VIvQs=": "989124000000", - "Hd_fJDgvu-47LC9Bb9S6CzxO4aIvTWsXwz-nEET0Ks4=": "2005096000000", - "HdfL93tV1trH5k1uBuFLcbULi1MYv3XDLrG9X2Pxgik=": "463053000000", - "HdwvCVi3XD4U46aRA9r7xWLy2BJfO8Q_BwEQdHSt8xs=": "398329000000", - "HdxwqcUamLcB4sJfzaeo8ZLPceJExYbf-1Vgcr5qlHk=": "384773000000", - "He-z4fxvs-ZmN9HuzUTnewYY1rkndEMVTiqb_Vat2Zc=": "1386434000000", - "He1fBbLw6kMsHRLJ2cvm2qp-5B9TJuM7wMe9SagXS_A=": "3849069000000", - "HeDWxYqUUhkqpt-W6hhVJTyOeXywPFYIP2eaSqNVN6U=": "3849006000000", - "HeTh9WJlFP7Jd_VxHNPufT1mzD7S2sVcV2lsuzb6HHw=": "4027719000000", - "Hf9LA3l6zHkEI8QB7MyaxjWAFB9TiSZK9YHyAnl0Hmk=": "431414000000", - "HfH3A-V5TxszP6Nv4F1jry7JXeam2NoJ8Re0Thf2P2k=": "408128000000", - "HfKu-3xeAVhS0RjmjxJxFRBNFJE27dMxUPSADyC0xAo=": "417631000000", - "HfZ_sIE9MQ0sHq-c0jIo_eYY8Wx7tFIhHyWJyTaqOUo=": "425636000000", - "HfbfwuU6l2dvf0i1HSXeK2jysbvWMk12L2bAqMIbOjs=": "429275000000", - "HgFzAIuz5uAyoXPclpho_7MEyp7cDt_J3uCE25_iw84=": "615384000000", - "HgJ8M2zDscB6bRXC4lMzMSJ2eMvDBUpw1AHeYdJd7cY=": "387467000000", - "HgL7EGHvmWNp8n2QUrLFv-ILRuswqACbkTwM2HRDQOU=": "384686000000", - "Hga111aeWCCrE2XmweZy2VROvvqUZPB1ufN1o_kI8w4=": "411085000000", - "HhJATWtX4FdAqweiXamUW_vpxR5Jy-uaG10VMuIP7xY=": "381319000000", - "Hhb05B2hRDk3pA-8p0E1nLkuxH5ZSkTnlmxXKFCDusE=": "763607000000", - "Hhz_k8W8Us2H8LUjNRDHDDyYtKqvDbYEf6s5-DeEcAY=": "416666000000", - "HiFo56STeyw-HyBlwkPs4Zyw85YawGKHIKfic_MYyms=": "382750000000", - "HiIWKe80dXJz5kGvi7-q4r004KyYkmKWhmj9POfKIHg=": "387727000000", - "HiOfYPQbnDKhtkrA1UP7JkobWgcc1FMk1IyhAo7R0ew=": "921463000000", - "Hil4e0Qf6ONp8bZoqp5oFslpJVN9EUuPmicy1hHK1OI=": "405218000000", - "HiqAgBJgITbLlswt28_CBpyxX3po9CoVZZPK_tdPBiQ=": "6435900000000", - "Hiu1VRDrg4vqiuW5o_XeunFyJN7HGPgF_PfsU1mNC0I=": "2487759000000", - "HiyffU5EkqOJqP9GcI29NmfSrgRWGV61NjG7VDC6cfs=": "454545000000", - "Hj5MvXV1GLJP537Lnh6Dz9EccDm6Y0moXZ84E0CQZOk=": "403213000000", - "HjMZ7knMEKtfZNU9j5UIhvZlrSpWnT6nV-lS9F9YRhU=": "4615323000000", - "HjfWKutcE7NuO590dkvrUGKPOTxw7Bg_7SwN8A2d1lo=": "384615000000", - "Hjl1OacHrhr9-_BqRbnVZyE83txJTk8leRZp0j7OlCY=": "635659000000", - "Hk7Vv8ZHQaKaMhbIXeZ5dCPUiu4zs0acJyoomUe4V9k=": "384615000000", - "Hke3NvnrnT586blZCMnQLWU0TkSNHAwc2oARUDx6XBc=": "1322112000000", - "Hkj-MbVnuQ6nsW7GsvraSc2aOB4HbJ69RWHYYp7RcXk=": "465854000000", - "HknX9eTW483W2Q1c0Eikl-8tSi-o_KtWSRQoLUNE-mE=": "423370000000", - "HlHPGP-HNw-2gwcgt5Hkdl1eFG41AJVFF3H90gotAIE=": "1564625000000", - "HlldK-B3LUl0C0AlwQxpAbcuCN8PqLgO5VxvOPaQEgY=": "760591000000", - "HmjwJJW-1QEih-6cpxljDopQRy4YbjMwBbC3Vgfk1tA=": "501411000000", - "Hms4Eo5lQBVULVZEADKLadXEy__r3VRPcCLrnY_Ep6o=": "378006000000", - "HmyjdV2zoMwkfoWgcn9RMz2gqk6dqisWBSVwe548hNY=": "692307000000", - "Hno-N8-4H35C34m2IPS1T31E4TW_VQzn-2SJqm_fNr8=": "12600500000000", - "HoOb89Jyny_H0kfLAt9RsdWVQfldet1VGZdHKK_YQMQ=": "1153557000000", - "HoTYStJIE89Uo9Jl-XM79OkU4HtGPpNZcPnaHW43GUA=": "416802000000", - "HodgaXxaYVAf47d2PC8M0ZDxT5pUa0pGl74ks_qnJhI=": "463594000000", - "HozpxVOtsIWm8jasxsDtUkqteC9v3U5zJHEtSwrm0-8=": "666114000000", - "HpIYjgHbvHXM06GldaZAYzi3hXlue-LwUF1oq1QDh_0=": "405197000000", - "HpNTSCa2vW2vfjBx6ZdS-al64uQt2MduTrA3iH4u9FM=": "351471000000", - "HpQTfklAl381AivNQfKC8o3-w0J89yRjMTc8nuFKiw4=": "715494000000", - "HqCkL6UELVKCQSV73ULbJJrDTZaIZs8tMDR1zGFczpM=": "466542000000", - "HqERO1sXyqqlKZhPuyy4jEziVGio246fyXzg-CxRYLQ=": "2272727000000", - "HqFdzZLLJmBUA8-Dcn5d_A-qlD5R2uNPvaWYX-aWD-I=": "450965000000", - "HqR9lAfFookvQ4-xP3hlUKHUnn8creIi90GCt3fgXkM=": "1839281000000", - "HqYga8kXPlZg8UUaxxrtM0oAsaTW_HEvP5nq9uYJ_6s=": "578522000000", - "Hqgd4pJdxyZT9GawxP8g48Y0P0Zs8aeFUy6KbIGaUR8=": "1567272000000", - "HqpxsPdvp20a_kVFjzZj2FEieVoIshiWi6OZBXbwBNc=": "384615000000", - "HqstOTqTziFWn1NX8PzbfMctPfJoYaDNBePtoGbAA1Y=": "424045000000", - "Hr9JUW9GQAWBmBm5BSQUd-7HzYB91xZcalYg-c9si68=": "384615000000", - "Hr_QWbc_60kQLmQJprCvtH7w3J2hWgDeu4HDj4XzqSc=": "560165000000", - "HrvDsMjt1Jhff54id7yat8HUrve12CQ59qObz3Vbvk8=": "769104000000", - "HsN00PIFGvuZ5NOkC8Wy5npZUzsj4WQmVoi47EzuDok=": "407233000000", - "HtQNrFyXQgNGjJ75RIYh0XfSbn11r9ZCHggHm4-KlMU=": "378319000000", - "HtiwVvWRE0AGXVqGcU_HgwLH2KiJ7loLt1qjFJ3x3Gw=": "681199000000", - "HtuJHyH6cXyMV2PTOdXDktgW8dM4Rd5pja6vvAW3hx8=": "11578327000000", - "Hun3D9gSCWpnZBeg0gKi5rbIz6Dd4nrDIJvUrPidUKM=": "377868000000", - "Huy5X194CZqa9xjvSJvsMwcIogGCu9wFk3CY7EmEDDY=": "1908173000000", - "HvWW9DbHumEkQvnqemR27kN3dts0UFGWZ6OYewBsn9E=": "379344000000", - "HvYq4YzitW7VocHKfCZHbcV70CSfQjObimqVqD6Xi3U=": "366327000000", - "Hvo_UgMGwNbOpKJTnwhMb1HwZ8drOAO48JRTCt8vEdw=": "895161000000", - "HvqpEFMqJHLpzWYY--KlPU-ZS6fS45G1Mr1BiwazZ2Q=": "3846153000000", - "Hw4kfYTJHPwwIU-pcqvWTXraGMBlAeK5AC91RFTaZE4=": "1536806000000", - "HwIqkmAwk2Ooc77FXjbdcjvZY67MIJCbSAgSfHgz08Q=": "769128000000", - "HwTE5dMilSmhKGfo38QnHF9DINMMZf1Fq_obFnFGlsQ=": "1156532000000", - "HwUA-R9yhuHjbTBOO-__XQ9RW79kQLTyD2XcJ5Pti4Q=": "415861000000", - "Hw_0gIo3k0G3XuxkXzQHrq2MnbDmRZzsaiY9yv2xTR0=": "433628000000", - "HwvLBXZFFCUPqoslZAOxDe432bRDiUxu4AAaVoW_KBk=": "1126724000000", - "HwvVU7778HKSn4I7bu1v-97MiPAXl2Gt49q27-44xIA=": "387414000000", - "HxCKk2_QMqvNh0s7zExl5ymdp6AZ1OGahZFCwpNS-WM=": "1134771000000", - "Hxa2bs3Ygl7P49jdFs4NVej7Eiun8cjH2vEUIOWD4SQ=": "390084000000", - "HxlyxeSLrk-xe19GQNI-1JoguOC22t1os78Xb8ILjmc=": "2102612000000", - "HxseceJSUwUJquUxBxky0g825SwwbOdAWyM-HITDBbc=": "392981000000", - "Hy6D76MK15JGzIKpRCgC-JSxO-V3j3aY5kX5PGhnVyE=": "459512000000", - "HyNzSM28OdsywGBPBvqkawlhBQ7bkDn8EeKG4tqyu0c=": "441977000000", - "HyfHfLS8qMLhdbTjX1KudyXTegSnY__F6z4GPaOFUl8=": "454545000000", - "HzLaBga3ECpBEqnqrMBgq_H8tLth_rQIfVWlhSLdUdo=": "662348000000", - "Hzgisylk8Lgyuahx9dzn1KMu_4nFrcRaPBAnCBVLGF4=": "2422627000000", - "I-6IudnQPJOeMjlD3O9-Q3EU5D_UWkCo8o5pcNGlBHA=": "908730000000", - "I-FI9CKF36oHIOL8pFv4bfi9f1HEMHSJViA1Qli7H4Q=": "1590909000000", - "I-_qvfCEwF2dKNnlc4VS_pxMYJu8tp8niZTEAPs3nBc=": "459136000000", - "I0SFhixMM5hf5JIYqU4A2fQoeusL8ykidX_2DMblGZE=": "1540895000000", - "I0uXfJzfWjD8DBcih45ZqEgPAd2NUNfSboF-G0ssOmc=": "1153846000000", - "I1kVHq_8dqgpYq5CkRGLxzTOySbsSLCdIXhs7wMXAzU=": "624999000000", - "I1krJqsN77kCkCWnz2RryHFrnXYxPArw0tPjLNG-_no=": "376906000000", - "I1xWN_4YQ_forBUfKuKbWAbhGsq6c-JT5HghSn3bx7E=": "1673658000000", - "I2LAFFy94pOI7ODzlX2iVkhMu7H7W4_t9N0CP-l7SJg=": "351050000000", - "I2SjH6GDVthBZK3MlU7wtWU55VG6d7GC3Uaa6Pxy378=": "1751443000000", - "I2XdeLuOcO9Tzb8aIpikWpERYevPbNQPf5cuCXdNjYI=": "1927537000000", - "I3TkKXCRFSw25qxSlo3J3n5gjFZoSHd2LOXvfloKbaE=": "833333000000", - "I3VsvQjM-Qc8tWvVgzkqg4BlislW3MGbuMj6365IT0s=": "393359000000", - "I3qvnk35ALeF0LLR4OdZFU1GFtFMGm38azPFgfUa5cg=": "423370000000", - "I44ST6MRGNhtUwiDsT0ROPY8IgkEr_WqjnYSTkOfK-I=": "454545000000", - "I4BHblyRlCPoyFei18LObg0UIFAkGo0qbzz1T_2GGdQ=": "615577000000", - "I4H1wine60fiO8JmRFB_RSRJSL9sJajlFbhbNSYF03E=": "5728648000000", - "I4dzQYTD5vO4SGPfN13YJWHt6PfdF1QLb_NOr6x3Fcw=": "2084122000000", - "I4idcVzsARhYhU2A0AEPrj7DVay4ksh88uRNXiSqpeo=": "492388000000", - "I4wQbgEuJt5R6WAGntUuff3OFbkeXmKhvMrRe6Br7lU=": "382410000000", - "I54Glvclkg2TQLCLHSeOp2QlnuVdGYuv8O0m4DHUQbI=": "454162000000", - "I5VLqGKtnaJ-SJMUu2FsQ3ZBVvHSgX3LGJnp3rGepKw=": "416673000000", - "I5bjwEuso25oE_IcciXvMvoSi-PLYtULVMKLFCxlN84=": "9611674000000", - "I5e-dIkHIrN4YPkYWdqrjENjWzl43aOTO_6U3JMsmX4=": "456839000000", - "I61OG02ad7UDogerkmLfZhgn4iJ67NIS7lGtYRomCk4=": "5008092000000", - "I64ZC0KSzC1GpIycAldu_pYUitVB4q38wzsx6QqabiQ=": "961538000000", - "I6DL0gVX2ONVJ7cVbl9Ibo16rox94sZEK50DAGU9Y0w=": "900960000000", - "I6KrsS_Sob8QuruJs81-uwZ4sgVW7e5z80O-xc6L2_s=": "409453000000", - "I6Pa4yMeEInoxBDiiJI_SbAi_NxLmfYjHT1mgJTOnUc=": "615895000000", - "I6SGXjnbCJ5rQISvaglRQTUzXNAiRByBPPyyqEs1YHk=": "906955000000", - "I6YJXv4AbAbvB8DSaqD8Jcar7aKDSQjBdfqUpzksmgc=": "385510000000", - "I6_LCFy3NwwZiEk6r3fN5dsV9MbUyArLnFLGqC-wVIo=": "20083904000000", - "I6mlqpqr-c2BWMolwPK-5cAMP1fAH0gaQ54hxC-DFYs=": "384615000000", - "I6mo9uTmdfTM0mk0UhFnGZYpys3cq3Sg5vMK65w2giI=": "783595000000", - "I73HvhjO7Id8XzllDGUXghFaCpQ2hQniYzknXUrrmaE=": "750896000000", - "I740M5_Bw9CdQX2ABvdy4NH2hl-omNIRUyukNBC6TYw=": "454545000000", - "I7Wh1yiq0s0alFc_-m9kc4VKJ9RVn46tB2-gtvqnh1E=": "5664988000000", - "I7YiKvFrxeCO9vpeo4tB-i5BBuYm5gMosDxbm9XBTe8=": "818220000000", - "I7tENbkHnos3p_wPILic0K0W74VZj2LdEcjKo2MkpS8=": "491921000000", - "I89PIDWvA9Yo8VvyH9fXlBXxOxQuDVT2qXnEDVMvrgI=": "1363636000000", - "I8NgMB15lyIrb52hNH6pKTmLZ20V_prDlqAG4IBw9wg=": "1730091000000", - "I98fRcVQNttlW34Famai95d6UYp5MQMm3U7pFVileWs=": "411085000000", - "I9GVLBHntgBTi2T7dllktn2hiKrUnf-ZwChjqZh8mNg=": "1879627000000", - "IA_XM06SITHzXy4c8q0KU0l5zrfxJelSNlxyxoziVik=": "384649000000", - "IAnkglXALzKL3fgcLC1HoAhDe1VGxKX4nQoLZaY2PqQ=": "2246710000000", - "IAxh5oKNQSJ6YgD9gcx2NJudbcU0_uJyhXBRHQNn-c4=": "758694000000", - "IBGHhLSJ-FJdTNCOFomvJI-90nfiz2PEOJBHdrClCn4=": "2636176000000", - "IBMCVam22QJPc0Go0FSYFLkaYtLsNPdgpOpL-kbiZag=": "1139862000000", - "IBtHgsAAW2Pk8IK1GeSHErSjjVmKZ2GVtwDmG_T_OKo=": "384615000000", - "IC-h9zVdvMl_gEe3x5rDs_Qk2G2QeeNSxkkvnUhioSo=": "583604000000", - "IC8fZFVGmWYxtBQRKzUbBSEsHgyyHzo1ONFQeYUUVRA=": "502779000000", - "ICAyQdXMi2AmapDmHm7FiLutLaFxfJyNPm-znmCDlAg=": "385136000000", - "ICIAWzWrGlzrxzyCBs45NKauSWssotVCFQtbCo-mduE=": "763439000000", - "ICcRpdBqhYworl_E3X4BuwiF-_hHONDJ3TVwM4ETWaE=": "418059000000", - "ICgCl4lKwAkY5Y93MgwX9TxZ-7Lg5zx1Z9VTLlSfm8U=": "388637000000", - "ICtU954XvDCPGKiIGJxDlUP8577zBQ-2CwFn0Z5ZxyE=": "833347000000", - "IE5BmZLMLf_81d6uYdAF8_aOSPAeDfvPE5ogSjqljhs=": "684778000000", - "IE9iFH4Dh3nyhIkbrb_r8RzKGVG5TxTJY6K4kqa-VWA=": "419695000000", - "IEAxX6w_jTlqnKTXSXR7J69EvVoJwjm-JJRLh8Q2RNs=": "390817000000", - "IEeBq07mzfA1jVBqmSNZ9eXbFvDT-WJLuXVfN-ks41A=": "416666000000", - "IEiU7aCSfvrY2cZ1X9Z9TzyLMmyE6nZ5UYZ3hjpla2k=": "2545614000000", - "IEx7hmJ0x0Nl3PsP3rEl3ckMnuJGi-lSCrRyRh9J1Hw=": "463745000000", - "IFHGSh5z7kPFKBeWCcsf1XpnQbfo3CtQrfKxOjQs-8s=": "453319000000", - "IFv9mfeoszwLGZB0D6B3ssypvjobdKFiDnt7WlscvtY=": "2037685000000", - "IG6ltPe3eT5avOm7PTJlvJLT8KggyWu6G7Y8V5Fy44g=": "383592000000", - "IGCcNsd5mhkww4gBaxjJl80K3DWLZ60MwUyUQpO8SDo=": "771834000000", - "IGOSgCFzVcjpJdPGoTvOS1EWC7fBvdTC1qlz53606vQ=": "416699000000", - "IGc04CwIB6097MOifDo9CeQBhOPlMxofnxGVEucOKVA=": "388594000000", - "IGxjbR8_HLjJpwGjZQaZflcCesuqMHKmX0FYLeuDEro=": "384615000000", - "IGyKtX_tdHJ4l69lAcgIudpF7d_cZZWcYnUpZGFQv1E=": "696661000000", - "IHZp9G-MWhrcCuKiLo1kHKq3TztmLVOrn0lU6mEFkA8=": "385834000000", - "IHfP44vuhc8PmXiiPF2l0K21K9kyjNppYBblaQ-5uUk=": "2085246000000", - "II34TcDLD1pPl3Ul3fmhNKIw1703FRuVavVA8LtL-zU=": "407121000000", - "IImnPzmoWHK8zOJ_FATHl8JeUuUlXNTyHZ8DcID2rrk=": "1923076000000", - "IJKWWrDurjrvw7JXDQ96EnvSX2NRTgnG3iqzqfZILbA=": "1355296000000", - "IJXRjP7Fiu1zDihZzET2bMpfQbmWZ-HgKc48t5wcOxw=": "381635000000", - "IJjhB5VWlsM8mLvST-515l-ycyVlmQaFiwJd2ec_tfY=": "1516406000000", - "IKGJ7xQzwMgcOisSftrYs6MGiIZBKhI8uwEmDyQgFL0=": "394336000000", - "IKKMYwuho0Re6U7fwvhCAQhhkhbZXvyT3RCv3rcG8dY=": "425004000000", - "IKdUqp--LtLXw7tXrUKHIfQGaJ-Q08GECvBxzJ04c2U=": "544142000000", - "IKwTvQ9KRDFuURWid4OQOzhY5diWm3p8HwBhVmnKwjQ=": "384615000000", - "ILSXASFimJ0mnHkg0vlze0hJr3LMracEmVUhUr2L-wU=": "2739611000000", - "IMPWsHcmOYXcRBjAOsjgUq8xTDtb_UnelxLAuOobsEc=": "769230000000", - "IMW52F_AWZVriSjqTEzvd4pW6Si3nELQO-KpyZ1i-7E=": "384615000000", - "IMZf9DZJygtV_xzz8snpENteEhY8e0rBW7Ebv7lXY_c=": "4507754000000", - "IMfqJ9gw9YAf0KSLImqiMzNE_OP84XImlU4W8yOxdqM=": "384615000000", - "IN-PENfqWh-EsZpr5yZyupktL1Zaiz8gAov3pNoFxqs=": "385505000000", - "IN8a9NpZIDvMyGvhX4eHzP84DMMQM-ajQuj2Cu3Hqnw=": "470370000000", - "INGs9Sg5V_ndgzlO8v0IRqGosiX1vynnmuHzBE-eOwU=": "1249983000000", - "IN_nOlcHNMXQELnFy0fv6DLW96BwxR9hdb0b4NYA2zc=": "1249999000000", - "INsFWTps3eeKFsJgZX-ODO6fIaDIrOIv0P2k8kBhcG0=": "1269928000000", - "INzGjf1WR9nguuZkHC53syJJR04UumDKq0ipsQ94Tlg=": "385507000000", - "IOnzA_cVx7EpTabQKUyxHjl6AAVjQgtXAHrml9kTAY0=": "648033000000", - "IQ_3tf-vg3XjpFoNiFEceU8nCDqN48vaJ09TQUEy_-o=": "3783416000000", - "IQ_KTcKEEBwYu_aJmD1nySt95wNazC-hXUYabXB4ZhE=": "2069592000000", - "IQgifeMzACoQK6j3mSoUJsLbnM7LhvJqrI-wM4aYB1c=": "411085000000", - "IQqhZyhbEub86Fwzb7HSDB14f1wmNt56iLI41zI4Y30=": "464666000000", - "IQwRHN2NjyWIZLrIQIxVzti2Swir4x1VyriftFKqGhI=": "421446000000", - "IRAMwx6r3H1GWx3DH8sNKe0zsiZkG7zF5HaeR-Or5QQ=": "2038461000000", - "IRMl9Bqm2XqR6Go-78eDI94uZKkJS6k8TlYGAwmPyGk=": "416666000000", - "IRumBL3A8d4I2l8enoG3RIayBMJMZR7HigR2Zoj_1vM=": "384564000000", - "IRwqkFopaAyDayT7U29iRrRcu5SJOnBoa8IaMpsVjbo=": "1628513000000", - "ISFE3IE6wJg2Fz_SZBRMs5CqzArFzhKPU0kPAJQkf7Q=": "384604000000", - "ISirBdyLGPIxAOOg427e3f-MrV1CGP0ozvyqI5rdQEU=": "634433000000", - "ISu-H2v2_fZZLMKJIdJQyNSK7_E7xdNefml3MU72CNc=": "397332000000", - "ITYUXM-Fu1jLE1I6X-cSH7pHAjXLBW_2XZslvSmPtE0=": "381476000000", - "ITadb377bMnZyWWfXgX1FDp4Tl5gT2xo_n9tgNB9MU0=": "387632000000", - "ITvbS6YA2QwrARIru6r8UPhgSr1b_qzV-8LoqdW8bM8=": "384615000000", - "IUScUbZzHtRSHukaGZflfRDvf1lK6tBdg_mTeYldKn4=": "452076000000", - "IUlIdp8tjmt_3qv6ZoD8-3aNnTSvFhhCNMNP7fdefPM=": "1141815000000", - "IUws2i9Y5LegazZPrQ--lb7Z6aZSoBEejSGRAWKYkBU=": "830494000000", - "IV-JZxgeEDIXkjnr70es2dzSYRyGiq9dM-_ghTtQQJw=": "378137000000", - "IVDPR4VttxPXbudCY_E-RoNoQs0kYNqfyiBWOgQIRtc=": "380846000000", - "IVFNtlyGNjzyTkUxdjmfHQqlSFWbNHMtP_TXajWJxxQ=": "452425000000", - "IVYWIOsxcT_mzMpeTUICkcUN5-1_ehhWFDzcq0P9GcU=": "1691557000000", - "IVnO62CTIeE06SofOaepm7oLM63xiIiqLGUoOQu2_eg=": "381466000000", - "IWX-rrfeWY884QPvu7CQ1LsaQPX5xMtbkjbTnOW337U=": "416666000000", - "IWf5jABTs1PudxEy9fJCGzvHaM7LThJEkb_5r8lFEs8=": "7692307000000", - "IWm57UN9G4Ztpz2dlo4Q4_EjwVLy-QspurfctvDnYIQ=": "906393000000", - "IX9AV1UXvhKrqgVSWFvZ0wDEBAZwZyr3WjZ_Uspk-zI=": "395125000000", - "IXLwl9QCTW_8NmpFEsNH6Vw1g3C_LnaFFoN2PtPU5OY=": "1877873000000", - "IXSML5P96fBYukh0CYtbYt_T5nX9c_Pbcs0CNgEYuP4=": "378426000000", - "IXU-jH1EjmsJij1cKsgi-6XASrtIAZkMQj7vvGeEQm0=": "411085000000", - "IXWD8f5-yO4jeScdFmkc1Mzy5Af1k4YQS0Prv_GmnnI=": "763607000000", - "IXsceKE3o0zTEtNGp_GL3mIrljQxvTULhRvknPl6rkQ=": "10158750000000", - "IY2blZQhQloTs6SacOWo57BPweDwV34RGrAvudyg5a8=": "378614000000", - "IY6WYYprU9haSC_KKssixZXtOI35DvqijfwT7oyUB_g=": "445610000000", - "IY8R42UnVdvrRoGbvK2aE9zZK2ljFMat_-tk5Yxcx28=": "3862170000000", - "IYQK2kflfCqj1Ul6ep0hg0NV5-ZckHjYyAjjd9Ldesc=": "403850000000", - "IYu3R6J3rUItbS9CSTMMWyo_CfdZfOqWetYJctQSFBs=": "644301000000", - "IZVp-ZdJXPhOtp0_4bp92sSnHVzcdZhnd_fAl8Wegqg=": "2020476000000", - "IZg9ICrG65BfuS8gsQqmdxmGqjBBjYcf1mMzpdQRkxg=": "384620000000", - "IZpet8PEsL_luOi5lim8fAIGFaFL5u7j6GIv1-nyLkY=": "1538461000000", - "I_5wNWVrXfHJbNwRcOm4_ddtAJG1MbG2NIyCk2mfBxw=": "805584000000", - "I_8V_hntQUXcOmGzbxhustCTRG1X2dzRU2TMNLVPZW8=": "2276558000000", - "I_yKg3xYvQ0-RkO2AWoqektfum6_GdUEmMWXCgtukFg=": "3846153000000", - "IaADipSRdOQO4g6M6lw4j-ZgSd2eum8hoeTMt5i06tw=": "910712000000", - "Iazl_lctLi13R8tDDBuAdVRu5VFn5WUt9wsqA5h_2XA=": "462839000000", - "IbD3HQGetR5QdqDLKVvyLO1ZVaK-F5Hwl5ztGQRd-PE=": "385508000000", - "IbK6XD3cjUrZF07vrzx_8f0fPFsx5GFBHc7MQiahWGU=": "2067697000000", - "IbLShGcO1IIv_D3tz9Dolvosb-VZpXXqXITkGt99VtM=": "1233257000000", - "IbZFduVpOGPvEAJrRZrVSIC37gApes2UJaEC9Oy11NY=": "416673000000", - "IcamujT4tGZlrk4jKw9I7SN4srOY3dQubn1scJc9mA4=": "383865000000", - "Icbmsph4KeCleUaDXObYX9GdrSqkJz8D_dRj221ld9U=": "6328727000000", - "IdVrVlYtMlBXjdO7OKW-vrmFcqUgVndLDNo_MjV9LEY=": "498408000000", - "IdilLefLmMec35XMOsjqDSibUfftvaTKSOgCbTpm_oQ=": "415988000000", - "IdwFPTxgIwYmRL4U0vxkYkWNLb3wFdrRxRulM4jPoMY=": "1410471000000", - "IeGWKVgcVxdBbi2vA5l6BeEcQRcgv0_YV8DoEo0hUZQ=": "4710307000000", - "IeKJgCXhQdPbvrBh8EBE_Jj7TEWwv__hdUkeaOMgQSE=": "3085593000000", - "IeVQo_KL5L8sIjlBCoHD7pdUlQTQXUTGtRfsGi_VEvg=": "4156209000000", - "IekuvWQb9b2eL5M2kkPzAOzINOoO52qwPcSAQQmQyqY=": "413562000000", - "IfEaYj_AOQMdfDq97utw4sR0do8p5jZQh-4PYtogDmE=": "458333000000", - "IfHXefoQy8SvwACe8-kZdZdY3ByzbHT7Tbrk1-jPcvw=": "384615000000", - "IfV4HtCT7vrhwwKbbwb2z6Ex3o_HO4VxT8PKgeIqcZA=": "381839000000", - "IfXPj5YvkP_w2hkFlRkvyY2dbSu0GBuz086EUCkiFPM=": "499999000000", - "IfrbiEGrTuhMBkEHZcXj1L1vc8HTwudHCFUOcMPVrC4=": "378010000000", - "IfviWrrkMGZsi4MoijPZ520A4syZjfGlK9GXCNGA4JY=": "794692000000", - "IgIKrWJGBzTtc3j19pYczfmpsy-kl5reFpFO6rTTPGM=": "383985000000", - "IgJ_U2S7QyhFVcR_-UBunk4U_WFv0vN35SjCfS5rdUM=": "5206939000000", - "IgNigPFhXNudZFzPlX8t_atvxWQI_ARCuqHILb1XMKM=": "1250944000000", - "IgfJNIq0NWj0C-XsRoPPwsyMeL3npsr5jFOS8mA1yrw=": "469349000000", - "IgoL_dzEyG1ElJtjyVYlf_KsIRLLaOW0dsxng3NcIQg=": "2501202000000", - "IgsrwyeyonmOL3gyyF4PzYfKTtEMSMQAcY-_kz729t0=": "469468000000", - "Ih9u-l-IJKPrsDQVAh66Fs9DSeVt6yh4GFIVEcJzoRg=": "416666000000", - "IhAkaQY56fFV866foeTHdrxr04u30kWTlqSn-4bPGuo=": "4417691000000", - "Ii8ptdJojhllbbO-qCHbDDX9JKBS_ZsIVm4YKKkqAqA=": "423081000000", - "IiCtt01JU9gx1cgF5sEpgBF6YVZxJ6ToU60BQzYau24=": "1588664000000", - "IiHZ0oPMi8t_AJ18PXdHuj_A8evphDumKsEJrKVVzKg=": "502393000000", - "Ij-84F7kbel6H3skvpyjKsyvQVgh16TtmsWWefO7L_k=": "1941362000000", - "IjLBuR7KJivJ6XznpsrXUNS-ybwLV4mCX7WB3XorVJw=": "736348000000", - "IjoKhtfGJgP362-FOZKZl1F904SusBpaJbfgbHhCnoQ=": "467438000000", - "IksZDGI4wPXGL5GrL0YsBIdN9P5AIkOoj1AIUBYBYJQ=": "463789000000", - "IkzR9_7bwYIp8IWO4tkEZe4cmNUj6u8htdHQIktVjBA=": "298474000000", - "IlDEsrdjtRHsJnMaEhm9YHfKs0tchbN0gzuaBGyRivU=": "419845000000", - "IlGjuW14g8hmOr65ZN2uWcIPVtQCqoQjZy206LdjZgU=": "377783000000", - "IlUbJo27kP-2ujshBKoD_cGeFd5CI1Cx5P6n1B5gTF0=": "757315000000", - "IldvflRDaup8E-BNmRZBId8-Vo6kGgWa-1PR7mukDp4=": "387257000000", - "IlqcetpWSkx87pOmWgeq4Hx9nvCNC4shJN_K9TRnC5U=": "4621453000000", - "Im-DfCvkINGOms_LLYo7Z8ei_O59XQDSWpn1-TsCWaI=": "411085000000", - "ImI1PRqT1-yIUc9Rnk_SYeqec2K1w4ZIpLco0e-hej8=": "4571314000000", - "ImL0NVRS1VNpOK3Z_QbegK6QGGFa5kqr1LoyfVHgvDE=": "566977000000", - "ImPa71u1yV18bFnws1j9ufq-dcyuVPNnLkyjnk7uulo=": "385505000000", - "ImUneXxockPOtvNyJSeT7V80GXuu-BGImtcQa_WdUXY=": "421476000000", - "Imfia-pJKwLuSlFTDVsXkED1Cg-ySE65_xq8IIJ7SXw=": "377408000000", - "Imnc9TYWkYNDNcxmyuIi1EQT05omh7Kys3ZcdZBcZ4I=": "1136363000000", - "InL_P3tvi0RlK-2kHWByinegxhXwUPfHuIsVYfPQjTU=": "423004000000", - "Io02iWCk0uG83EtvpIQHtkL9pFTyqgzLNBT9qAStC4c=": "828710000000", - "IoBYpmGW9RdJVz5xPXjsBD3H07UlbFBBCuQmVGAzXlI=": "415629000000", - "IoSj0I_S-Oy6PLXeyfVLtmtAWBGByce511MmMWE29hs=": "507053000000", - "Io_NcIDDhsgmRJya10hF1rzh3bTV4UdA6wPg3BOrKaQ=": "3846153000000", - "IoxLA5-tnmpckfe8q5mkh4Y29rR-phm0qDvaq_ql1HM=": "2672504000000", - "IozOGFSj7qUmQEUvrp-7LjQPNjLXDW5GTQkRjlPm2vc=": "2307692000000", - "IpL0a0BMFqBWLpOtMbmDSsmSvnmVcpJ1_gA8kji2MYg=": "417629000000", - "IpoHDbFCOei21nY08LFk3pMHuLM-BMmzFROef_av9iA=": "8401934000000", - "Iq5YvnvXmxhr9DAWqGsIiSySwMxb00q-hvuLEA2UBRE=": "473265000000", - "IqNxwTWFVQuCev49mO8PUphbIoATR8QFExaSSTjXPJs=": "384615000000", - "Iqq59uQvKjnwimG1cSk-VKSvsGYO_jOb1GfZONPoKNM=": "411085000000", - "IquH4FgCX1eQwInwoK1WLYOQ9IAyS0_p1GzUjWxhJpQ=": "432644000000", - "Ir5yO1Bi5sOo3FQUjRAVDTx9t52AW_fF7_xUtd9fEFw=": "3846153000000", - "IrF9Gq0rlDS_3yiqAleebn3hWiWaEd8RVlriepe8WRg=": "2270245000000", - "IrPcuUp17RQ6BQg5bB_f_7B-ufBnJzSEMyRpDLhUeBM=": "817169000000", - "IrZO5BI6hBK7i8r0UxVJYy5nY213ne56yRymu-yZ3iI=": "464704000000", - "IrwzQgOLsk7VmpUtOTHZzqzfD9_1ZnaWYk_yPiqHci0=": "385505000000", - "Is6Br4ovJ7vggYTPnVrbKjAjdUgm_i_3ZbC3wfRuvx4=": "386541000000", - "IsBNkWFvLURrdIEy7xFNOcF6Nzd82cUvqQ5lS-1VLJM=": "458460000000", - "IsZL2pC_SrUg3hPqdZ2HPcne95QYwQwP6TRHQxIAz3Y=": "3466848000000", - "ItS7IXJFDm5jAaTN6diHHMTqMg_qmS0x_CAKnwpJIxg=": "382396000000", - "It_GQAsF7vsOH35-viWA4w81G1tpYv0LIs0vf76A5w4=": "602997000000", - "Itr9LT5m0VwmDmO5JAE8LChrCmVSK94yNsP-ld4Qcfo=": "1619500000000", - "IuOsQE-97GHj_lRUA9gBakrxM_0kOdpuYfQ4I4Dubn8=": "407808000000", - "IuVaMbl5JSItF061RYfr6cRQMWxhPXQY36CM3dMKNx0=": "4012794000000", - "IvDOcM3AEhp6CokGTZ6xSNkqqcFNMwz9jWnUIq0Jvfk=": "416666000000", - "IvFDS4YuBKBVtaIrIr54Jdqyd0jgfBPaZbEFwpr8pj0=": "1190856000000", - "IvVSWuflSdWt0EGeS0NdyXTUzI1MXJwUSfCUVM1LDQs=": "4175068000000", - "Ivh37o-ffSOJ4EmhfXP6RYKmSJWUrMq_v-zj5Xr9FGY=": "1222508000000", - "Ivzi1uVuPNzTa0ucIc2yPuXR465Td1i-7rCqdrApb8k=": "384615000000", - "Iw-9Qlm46XxFK3FGhX05R4b0qj_5DpLcrrKtX1RxL_g=": "491199000000", - "IwCGAAYNRaX6q8NgHqBnYOjqh9e0q7WC0Zy5SgaMvzk=": "3252778000000", - "Iw_TPgkqH25asiXc6H1lVBcHwZ0VKI7xlObIsRVNlPQ=": "384615000000", - "IwiFUuLRvXH0Cnf8wvFOki5ubqUDYcAcpakbvZdR5GY=": "384615000000", - "Ix3GZpPhhfb9VgSeahexHFiPw7AkACzHbJKDxws4MKo=": "385507000000", - "IxAbipgwjDb6S57ma3tuPHK9w5JKcUWsEBHsWzw4yvY=": "1153846000000", - "IxQUN2BiIDmmig3ZVyToWvFS2yQVyDBB4JWLt7VTW78=": "1250021000000", - "IxW9Y0ElbVCd9NiKhPdzlKOAajlHMsHc-5d9Csl5VkY=": "416666000000", - "Ixj3aih0vuTBt0lV1WRrwIWZUns8MXfzMjSa5bo5uUI=": "679157000000", - "IxseYG2_o4W-ljv3pqfaKOrRN9mIHLrnMnB2SM53Qjs=": "831263000000", - "Ixv5H3pyG2JstP_uSsO8r-hMC3STJuuEBvS27gAD-hc=": "461259000000", - "Iy219Wluw2MThbgO53s6_yzddL7DAHHHiOxhbwjRmBw=": "381836000000", - "IyAfO8YiUh7OtJA_lpTLjPoTU7RGHAeD-cPhIUjNn-k=": "388025000000", - "Iyewu1PczxlpCOMv5qDKFjgv9bswewQY_rA1Q-mPO0Y=": "466898000000", - "IyuJ6E33n8iUvd0hRPjFI-rKfnmwyfV_Nh5glOWb_RM=": "422196000000", - "Iz-QBfrb3KOOOd31c0jhO59haPT42YUA6G5ODhBZyAE=": "912791000000", - "IzCK1FzgHNQztllLF_JbuuoCaw8RtPsZK7Rwl9BogwY=": "381767000000", - "IzRguX98AUaKvuzPpqyKcHupFODbMmRiCuvYVpmsK04=": "473331000000", - "Izgm2WGeCnoUsh3vjni6dGzObU106oxGNALaoSqjfYY=": "465509000000", - "J-4kOT-Y4ybjyxlIdIjRwXY1N9ygyv6uOyC9YRjAKN0=": "499278000000", - "J-dJ13hcbJRWpM8YFX5_n4AIolDrCKcPjois2385Cvo=": "8221717000000", - "J-xCnLYZmYJUpM1LG5Al-_Ogd1dLxFRj-6PWbIGlhkM=": "385029000000", - "J02z7b1IQtHDpYy9O4UTqqXnC8zgQwLnGpBzGGh2AmA=": "8431026000000", - "J05PlmFNKH-rgOoIM-N1P1oKewqq0iWBgZ-jXl31d4Y=": "379928000000", - "J0ByhgHkWxPelnZbOxlA19Tsia1yyTwVYiF1i3TjaXY=": "5878654000000", - "J0eAplX8T5-QcmiXe2GIJTqIs3ADe4m4VqWsZevRLuw=": "499999000000", - "J1rLn1HlLWx_z7PWhvjtP6s3wZStg7RUqxQ5fQW5CrI=": "461153000000", - "J1taqJEZedbCpJoRrfa7FsgTjc1gtIEqP49AnDL0GGE=": "377509000000", - "J2ImgA-J0fVBDcCT5QfwBuwrgdwCTbq2O--O3gJQXUk=": "1881780000000", - "J2JkAF6l9VVavNIaQwt9Gfi8jF47efaa6DRSwMv8Wsc=": "462146000000", - "J2M9dChW85uIk65z2x5Zp6CdlbUuiYgX9wmEM1AJFg0=": "832394000000", - "J2RBm1sXmKeXW0MpNXW30By8S7YS1oUuESV_N3mnOVM=": "453928000000", - "J2bFSCyHPiswM6NRFt1p5R2qn4lN3TIx8HR8RZfCPLo=": "1154066000000", - "J2ssEMctYPfG1yzdApC5j5IYKbBGySo07bjRmc9k4Fo=": "2107971000000", - "J372_412xFSEYqVC9o0oLm0PZLDhsECiuBiA7ekbhKk=": "417589000000", - "J3EX3xqmH86149vPUFLsjUmCbflPjSk4ykMEZtdpVp0=": "384615000000", - "J3dggt0a5VOk1ljZ6lYREa_3E6xCGth8iVVLLxbDwxQ=": "460655000000", - "J41mPVhPkwoODy9laXQt-1kLZU-peFN4l2fK89tek3k=": "415672000000", - "J49qlQF3_5R2kz68ZBjSzvIDznkhYFBVaM1sPYoK2tQ=": "499094000000", - "J4gDhuknTT_E3QfgCkUTBDqIR2FVwYFMLeiMK33db1s=": "8355605000000", - "J5CvsPb-4TA3SdtKa9RhGQZQHzDQVtqHR77zyvB7Abw=": "379928000000", - "J63Q0rIotgdfdWGjhBs1Gqd3fjiCPlwVDd0wC2mLKSY=": "705863000000", - "J6KaEoKBS9ZfQ-nyTMteASKU16DAhJnrUY0hodRz41s=": "379476000000", - "J6qMLDpUr-Rsx0YnNMp801287585fX9ksoEqWgfZFjA=": "468609000000", - "J6roJ2Jd_p-jcJYaN9eAhUTv63CzTOm9aw_ozUe6V2g=": "477575000000", - "J6wwncHgTSMGNw4UR4tTyAClBN4thgr7rI13zBK66DE=": "398415000000", - "J74K_j-tWlM8pgbOXjLiTP4txxr93HyBFuHNGq3XBlo=": "391381000000", - "J7IUSw3f9vwPInbAKABpRBUTT-jLhL-s-RCjkg1r8gU=": "4122971000000", - "J7iSSpfNQ6YpcuBYFLqa6_t0rRv1NXR0Vl8eNmZ_0qg=": "383357000000", - "J8CLDGv77fYxdRmjFfrIKl6n79EVdLWe7lCvrcKD_hU=": "783595000000", - "J8Mi1OXta6CI6OICbk40axL_dul62XEgPuUDVtqVlLs=": "384615000000", - "J8an4oPEp_t6s54EKGbgtpGaIB5WukjawBVP2mk5CJ0=": "379873000000", - "J8qUbBrv5usChHIJYGf7IibNHh8F3eNb2558u9bTedg=": "453414000000", - "J8qWDfVC7bBVpWz3AdkY2ZTS8GFGkR9rJc58byXqquU=": "409119000000", - "J8tfxSDzdNRlDq6cJxgEK0FOx9OEs2hku2ALwixCFyI=": "384615000000", - "J9NQUt7_w3I9hRNGR5sPAQL_v0M6PEWIEvd1pi5KPx0=": "1270111000000", - "J9a5QsD_yNN4Pr8-MHTv6LV3biA7AV5RjBjtVfvK_GA=": "6101161000000", - "J9dUhxvr1-0w0Wz7OazIf0XQ8t7YWad9iz87N7sO7_U=": "769230000000", - "JA6cXeAITV1ubztt41l6XPjfka1tkiFZgdbwUKWihHQ=": "472453000000", - "JA8gMjrMQBrWgMWCDyLahZxZ3l4OMIioPmWfn3wZ_Nw=": "378633000000", - "JAJlR3Dj9_wLIySimqG2NTl4QnjlJpI-jllyAN88CC8=": "379260000000", - "JAnCZLLP1zwiQzIcgznui5A02d49KPRGYLGH-oba1No=": "386742000000", - "JBa3JQJXH93pJKZca2VmrQP-6JALVPrwSkVlCosZtE0=": "384615000000", - "JBlvoHHhYxVhjhsrgdHGrCWxsiNhCEVY_Q7WX2EfnoM=": "424550000000", - "JCGzKmhun82rjtqTJ0V3rlM0rL43cxCSQVYMyjHykvY=": "384615000000", - "JCb6NPFM5m8H823q_WcB88BkoVkVVTMwP1gsHV3vpR0=": "384837000000", - "JCfupfcgpY54-BygCBLO0k73vghSohQH8TDLkPcQprE=": "413111000000", - "JCgrHkAH8lZ-RhNUfkiwR8-JnHPStQVqBrX0SGwr0ho=": "463308000000", - "JD6BIg9YGkxg3yGw-dcXeLjQWSFuTIN6Bnmqg_LvBrA=": "1134645000000", - "JD6gef5P3qKqd1GVAtbgV0iuA9OEzjpuJ02O4kRSxxU=": "756683000000", - "JDSxssRfMtSixHMHkJu6DJhBW_jJ5iMPCv5rPjhxyJs=": "417630000000", - "JD_tx6QbPOOtcHKXiRsZyViX6zaYb5h1ewrfYcGHTCk=": "597871000000", - "JDjmKM7TnV75H2mCKYXsG0vZU-aIBhRNToSZqDp6jhI=": "1511381000000", - "JDmSiCIVbVxnIC0utL3tU5exNgfHgm8R42bMtO8huIM=": "462146000000", - "JEA9KwHWv7GRiNTvsXZEOIAsCJlkct4tz9y38bIsIb0=": "411085000000", - "JEBLL2n1MBO90n0L0aKxFjKvmgICY4aD4KY1Ask-_-c=": "19284960000000", - "JEGg_8Y1Z0ooZ4zW_b8o2KKyzIv9YO4FM1RKvu-e1Kc=": "1492839000000", - "JESCnsGdbRKuo4shN_5LStKQ5zk9TD6na9NouFKt-I4=": "2696702000000", - "JEUOJ1OiCG8ay2elNekqXiKc9YZLEA0FLhUrYVVbSU0=": "790441000000", - "JEwpdvN9DedI4TT6qdA95KmK0oCRJzJtrzRgfDOa5Uo=": "8076923000000", - "JFNzBvsUL7fDjwxoZOtiEJoPF-UhVyPwIHGpmBLki1k=": "836357000000", - "JFzQfucmETe1D0aT1WRgmBLSKowk8SWSXiSycPD6f3c=": "1421186000000", - "JG5121CBzIgdvfDyPrJvcxEq8Wzqbw6Xit5vuY1VLOg=": "384615000000", - "JGHo7vuWH2oaTZgT2uij-E4-pxfwuuu3vXf14n3BkAU=": "3798442000000", - "JGLgiISYFpeJb36sfNTNKZfmWblcaVYbXJGtUzMOEK4=": "770890000000", - "JGPAM7lJDsiwZ98jobzay2YayZdpKVc62TBKx8BYUYA=": "417634000000", - "JGW18YwtziK-JQjYT-qT2CNZD25NkcoDveP4Jo8YJb4=": "394154000000", - "JGWmX3ZPJMIABZRW8VPkYmZTNUj0IOLd-bLtYCzqPTw=": "1346153000000", - "JGcNVA2auvJ9RO9AGEpD8NZtsyB075bIKRE2cwSicV8=": "3846150000000", - "JGvSh79MKkDPr5K1VxB72B5io-CwWV5K36K9nFRJ67w=": "456843000000", - "JHDmv4pmk_tGFUfs64DHr3pAo6uw7KsRXugJquRWdRM=": "416408000000", - "JHYOaerbdBoqHTuPDH42EwG0ds_pQF8-1ctpcSW5epA=": "384615000000", - "JHa_tH8-Bmvys_p7pDIFV8w-vaoCwJE3dOXIoTe4UX0=": "499791000000", - "JHbS_mJSZoeyDEbvwqyuh9QQ2GrOAI464J2TaQ4ztC0=": "3412149000000", - "JHzNaLgQV4GZJUahPCsdlNjrSD-178cmUG-S1SXRtvw=": "455600000000", - "JI2ku4e00hQNHIPtZKQwppNMGj5JaO1FQCfZSzBBglI=": "2097400000000", - "JIEc5L97yJvuOTODJtQR9xDUiwvQjC_XfNxoiIzMGxI=": "482124000000", - "JIS5-8rlEUJHA2HAPamVvUnk53aAawicimeZOVNuHyU=": "377792000000", - "JIWm4XoSL8Zmb_46SRhHPBgbFbeFlA41RV2ksyDNvJw=": "1153846000000", - "JIjC_TWGGDZUFIjOmjOai0w89yFfeWj8DJRXogp8aCs=": "385509000000", - "JIvIrG5BYdVjOBfNg9TnJqoszmj12atsOUni03dVV6U=": "842892000000", - "JIwz_CYywUpTQgv0OsTnbkCA2MdrsjUbEqZatqudCjE=": "2083333000000", - "JJF_RH1AR8GQKuIRY7NQvaaQNrDjpd_nrxgXHevshP8=": "784295000000", - "JJ_de4ALAf8Y38eslCTu8SroOMkMHObbGNDYE_3Vo_E=": "1623129000000", - "JJc-cVrPzMwJWBIPTpc_fp8g9BW1V8CrSXPBqciokpE=": "1839994000000", - "JJy-JGxjv3F1pdWxdd-cBqo1PctUj37WUNYG_vEm4kg=": "3223643000000", - "JKBZ6HZF5gpCMY0UuMmxVPgImTgoJa2sUrdsY_YpJzc=": "384615000000", - "JKq2oFzVq-bRkdSSOgjzjwHs-uojhFWw4PGpmwdAoTE=": "921977000000", - "JLmM_RuL1rYXVxk1WA5T4XZq3cvjiLFoKhfDo_4V6lA=": "482708000000", - "JLubX1T0e7-ZNmw6Oh7xVN9CYvCbMwiZt1RdYPCexCg=": "385509000000", - "JMUqbjRlTU-dRWqMNbiiRpe_ryLJAjxOqFNc3xVMPP4=": "724718000000", - "JMisz-iZmLc7-cnRX39DskZiWqT_PVuhRerci_6E5Lk=": "458584000000", - "JMlJ6zuG3rbYpaYmLI9WQtIkA4IbM8rlkprA0DZuFdw=": "384604000000", - "JMrf1ix7MyFw8dpxX8YUtnj439CsIYR_CinROo5xMIw=": "2081777000000", - "JNDn06ugLYj-7GqwxI-VRe1k1zBO4sTXSigfF3HVI78=": "384075000000", - "JNkKU2K0VTV3vrMnLbONxt2NXjHlm8aigN8VZQOFGYE=": "2730885000000", - "JOVuop0-8cYHV29Xf3dKDj61qIvnMwngVaxMxFwy93c=": "7500174000000", - "JOrXdR2AYMKlNJuyTZrkFgpkO9NyaLeVKOneFP5P9B0=": "473848000000", - "JPFtuyr-1_EuASw4zXQqvaQzFpD7r4ZdXjX7nuJvzh0=": "388083000000", - "JQEdS3CyKppVTrX68bRka-BWXqIFSqVJhfnnTr-EQG8=": "411085000000", - "JQdv1Z54qmZd22pSFqPZXonCPvTzosA9uP3xIx2HL8I=": "390712000000", - "JQtWAwkRawlsv6TiBYGRZh_uTkWBPKfy6A3Shp4QmhU=": "2337612000000", - "JQyl79AECqnk-QkISoIwE0WKdQP01XGJ8xSZNBt-38Q=": "1779314000000", - "JRDqxRovkzL67FHP8pAbGKryi_KaFKR5OG3jnYuXtXg=": "404548000000", - "JREPQkrK1dPZM-EGQq4fVVVR2K2ir0HAXytv4ImFjpw=": "769230000000", - "JRZxRkQdZmNZ2pOmGZ7LozKMhlFBLdwSPXhst2NZpkk=": "501244000000", - "JS9QGtxdKzwQO0nevX09X6D8k9g7hoW3zCT3GA3gObI=": "18514524000000", - "JSA0zC0P2Zo2w1a_35na9CWGHgEJNd-Ixk5p1x1lkQY=": "1145412000000", - "JSYYTD0jmrm9SuV-_YU17h3sp1fSqAngt-tDJJ8VGEw=": "470057000000", - "JSlBRRjH8e9-cJXGD2kLDNF9qzQEENV81WYFRGdRQfE=": "2272727000000", - "JTAWImvbca-h3nXf5qzPqCI7GS0PFGZ-U657gbazjNU=": "385387000000", - "JTW-yitxn6WHfTqWhtRDsGvcs8Dsz0KzWXE_CTBoPPk=": "2088168000000", - "JTahk5Mrc5mJ_nJVkKRDx9cTAHTGOzpKhLY96Fnm290=": "4512680000000", - "JTb3pLAbbKckjXPlgdn0mpYNgWVn4Twswexthj-GJtM=": "378341000000", - "JTtiKKKi7UqqqsAwXy3w7HtiQ3GnwxiW1odHHlUYjiI=": "459069000000", - "JUP9sPMDJ5YhAhFg2azfTXJsdkPNnfd2-Sf8Czq_aCA=": "378743000000", - "JUkvyWAf0LwdgqIjUibjKPQArlVIMU9aM5RhAhPKrRY=": "1683671000000", - "JUp4bYZBfDOd0v5dkirq5yeoVfCXHinJaHJDn2JEL6w=": "417630000000", - "JV17pGUJ4TmmlYTl4z1tzKxtVAIf6PgsGW0G8VpjrqE=": "815121000000", - "JV1RNsQna4i7qtfpUy7gY_y-4vwcP4n71LuepWncEqc=": "499624000000", - "JV1exvMsYlcIy7Y1mDkSuwCxo-vwpXfy-GNE6T6OxMU=": "385507000000", - "JVL5D0Lkr39RAIOr6TSJR9L8CoLxrsk8zd6YnnHpwLc=": "387115000000", - "JVbA2Jlu-EGg2VthSv99duUw5z1iM3er7vWqW7eo2IA=": "482124000000", - "JWWwm1TB4Mzr7wlmGL0dQgiSVdxLq2no0TrwsdFBClU=": "463042000000", - "JWbhotw8jBP71kWWToHcvqj2WhAXA1HGepGUWSZVJQE=": "1922080000000", - "JWmkYvRnmLSR58T7Ls3zl1pUkVPkmd054SeJLKuGJMY=": "384615000000", - "JWzEdHRUx0EsqShrrKtZp1AC_6sZCkhMI6SpU-pKnUM=": "1537170000000", - "JX34s-aT6_1yjEr-jwkkN3Yhnzf1ukrsKPuuvfpXpX4=": "378404000000", - "JXmOOcjiKviwqElCGq0XIhqbe5x0ZVED_DQ-NDi2NCk=": "772667000000", - "JXnsfJH6dNamHKxUdmOr88Y7vFnlsOTyzY_m-8wYV0U=": "1535870000000", - "JXpyhIpT79hgO4CIw8kgkvagAO0NvOhja27rHm2jDsA=": "461822000000", - "JY11JnxyRILF5tPzLuORMMLSa9MlxgjRJV1qFaVz39A=": "713191000000", - "JY8_GwmdGLTLzzYHgF8uaZRMtMbYgBqpqNC-8XgzEUs=": "412344000000", - "JYVe7Zd-Js6HbYFVew_e0Q-pJ579fBoqhOQErppnlvU=": "11538461000000", - "JZ-ZBxl__fnRFLjCEXzWlMDWv0cy4Rw49cj_FUxUhjM=": "3267297000000", - "JZqxpy8SI1QJxkaNSE67uRpOyBEfXWHG6M9k4ZOOBVc=": "1258303000000", - "JZzw6aW2IikwdQ-QRyevObf2IWX3cXo_JfL0e27dNKY=": "1510595000000", - "J_afQ0duO26Ya_AIQMR4hJGXTNOndosmZ-rb019xwR8=": "4487590000000", - "JaCZa46xZlRK7k3JEp3diuuvDoY0e8yglwFG5TYx3Mo=": "721753000000", - "JaEi8ymsp34bodOFV9aY1yszvOqlBbBSc2fDIgjDk9U=": "2129615000000", - "JaJ1Pknlcm6jkjN6voMb0cu52Txxkr0Ngl3XgVSS2Ws=": "458012000000", - "JaQXcVu7p8AKINNuFES7U1nIrS7EbqR20nkWdJs4xwQ=": "2025945000000", - "Jaj-7rvMfFHGEMrkDU-FsT-l36SIJtZGiPYHMw1QAZA=": "732498000000", - "JaoDbxwhRl7B9S1_s41dFgogEszb3zLoIiCCZehmw30=": "405357000000", - "Jap-z1seVj1vfX0kuAotOZJVu7C222NQ08D4Y4-gxt0=": "838388000000", - "JbKozeh4T_cLSXY5Y5Dufx42rvDPHcgVkgTxjw5mjcI=": "690971000000", - "Jbe08Ea4osT1vlmRJUhX2aKixukbp9K8UjwqltmncKY=": "385190000000", - "Jc4fmBaPAGd4896dlzTbUdSjUjrOtlGUZvx7NoUl2DE=": "384885000000", - "JchMw63M8aXqJgwP4xGPLFqwwCbFHwE1T-lmR-r4Sho=": "1089197000000", - "Je6365ozrXE51XLlc_F_CWSNVnth9z8P_8yj6RLI9_c=": "460586000000", - "JeFZFG62Sb-55z4qTTRvtU-G6oU_VhL9vvU4Evzg6yE=": "3855050000000", - "JeRFzcYyQ0fNQ24C4GAZ1CL9pZnqI5onRRRa9YVHP0E=": "5507947000000", - "JeSKUq3zzjiiGdJeYjxQrGBxJzc5PWJzSzsMa_AA1fY=": "834903000000", - "Jfhnm40YODptGc5yw54-9mEA83jyllhAmUeo8YuxXj8=": "457150000000", - "JfxZ9KxFaKhhM3-WDyXRibMa4J_6y8g4syRt1Aovw8Y=": "541666000000", - "JgG1iPY6P2BU4gve0mdmRWE1yu9aib5haSp5Z1Dve3o=": "385505000000", - "JgOtP9-uvcZcAT_IRknKIY70cSSyr4tCdZSMcNvQ7r8=": "469173000000", - "Jg_j4kfUxQP-u4a0MVdWoe34j1wGdnKneVB7gey7Qvg=": "405357000000", - "JggjQW9LIgeEPqScBwOFn1n2AtCX06t-ViFMkT_umC0=": "389973000000", - "JgiMwxVMVPbsmzSIDHNVbN_AXHwScPGR_fhJDLYlQPc=": "459228000000", - "Jh21N4jpiLSDZHaHf3OiSvnSalEb62hdmIKTN_-GaMY=": "730755000000", - "Jh4MMb2yPjOhMynlpHQoLaWmsYJ1bxTfFzUEQW7Pt_o=": "383662000000", - "Ji61jUxRRxFlkh5ybPpWgyaQmiR3OpuOL6Y-SYAQMlI=": "385697000000", - "JiiXp9xyq2eUHRRvhIVQIfQQmj-LVRp1SC4XUEmTjjw=": "3999999000000", - "JixaCOxaxf1eRFHDUZuCeZtd6TT0QxarQ6TpESgkz5M=": "384615000000", - "Jj1jsXmmRNXc9WVGkawGb-RRhddyfcYjUmcSNM0bdx0=": "447938000000", - "Jj1yzayNxAk4rfLoInKBvIxPyeknhRvjYKet5dnIdkI=": "501776000000", - "JjkgHS9-ZkLo5VLHY9l9Y-bFcR6TvLWfWms4pZw-RC8=": "1348026000000", - "JlOubNdynh1X7ZTN6BdtiXrka9lo6f92y3eXycQb3cw=": "1696834000000", - "JluZ6BbESTHhItTmJcwOCaIez3CiC2uzPqUn1LZnmok=": "454545000000", - "JmfM2ZGvFdHC-S-pXPMaMYWujVWwkUcBBrPydTiA3RI=": "942307000000", - "JmkZYEZJSAoiN2fe2nEaPqkfYbmTPD0WCEn-qwDozfI=": "2021749000000", - "Jmy-wYbznH461Qqi9QBcouJl7V2fjjSfg2jEUAOHiqI=": "391797000000", - "Jn1mFctqHr4SMdnryuxi0PrlFL5T7G2wDTYFavE_JuA=": "385559000000", - "JnBIiNlOU48vgKKWZ3pXSl8UKDH7NW6NTTyVn0caX_8=": "390238000000", - "JnJUBrsyWgthJ79OVY20hxI17WjH0JvfPCvqiepSEWk=": "7692307000000", - "JoGz9szMSMyOY5F9Pf5cdFmFCQZzREKCzu8IozNTYXA=": "385505000000", - "JoJR4aJJTUfcxnH04_1eFUa8m9g_XsZ--htvwEGtcLI=": "571845000000", - "Jp0Ji-zCM-6Q73kRlMiYsEPg3zKHx_N4RYXVcl2xu5A=": "5833306000000", - "Jp3lHGnyzKoeL-6NvJbPgYMBZW2nns1lx3ak-gJF78k=": "2081275000000", - "JpBIuUQ20C6KeiPKynj7H27lv2BnsljvNI1j8XKQ4h8=": "2088182000000", - "JpNX0MDCTF83R8sGJp5T6TyGe_dN4cnhivJXYt3XSnc=": "462889000000", - "JpSudFUdqIbDZyHXrJGMyHQildjhAG-wlNwjhdiqD5U=": "3773452000000", - "JqTYMEkuLXPSMnbscJy3iQJQBPmIbRsIIfneNFgqNS4=": "424920000000", - "JqfgiVeVjhaqmuYqiWwoxx_S1SaRwoqQRz8-dfVstX8=": "384878000000", - "Jr6bNjSpa31Vhw68QmILNzzvYJKkkJwOtFig_P4yikE=": "578548000000", - "JrX8aZcMZWnQIO922ck_VK1P9_Y8QJcWBp-Pa_8UPds=": "5006075000000", - "JsKbUIgOsM6pLTicGxDVs5jUPPNfXRFzjxS5c80LIcs=": "1041660000000", - "JsXNCVsdnlowhZpThyIK5db2MGzWA9x-oksnpObj9Gk=": "455743000000", - "JsbMMiSnwU_ThVkg4GSBeqTlhQkIsGOeTw7vkuJhxyc=": "1923148000000", - "JsmDARh7S-qezdnhdrEbdLtfejo3xpJcpN9k9VIH_eA=": "414997000000", - "JtfU1aYLI96W6ZH4_--CFJu40qI_Pw-KBlEYRDnw3d4=": "1692307000000", - "JtoG24dKcnN58KJGLZL-udstVimNhupueDdNpRdyRYM=": "386077000000", - "Jtr731I0AlD_SLms2pvQledrWG7yHugSY696vTTQjeo=": "385507000000", - "Ju5TjXr6DoeYVWPC6_Ja7QV7-94IB7Tg1TCSnQvyUnU=": "384615000000", - "Ju9XH74j3k9Jli9rNZ2f-e5imX-jUJZU372W3wdAXi8=": "459590000000", - "JuAmtMbHOYZGeI-GhazluuZpHKQzMAQEuwfa0WIHR84=": "376805000000", - "JuCcrbtw3U0sklVJ1MGoNYLIguaikqRYVjPEY8yTHQM=": "911799000000", - "JuLfxyItWKWe3-y18nv8PXc-VEf18KzN56uJ-JxpC0M=": "405229000000", - "JuSN-0P56J57kI-rE-JpnI2wS31GJXJa1o3AGOxyCD0=": "382717000000", - "JuTOmYIci-a0_eVyVahYQyxw3at7aVtXPqqJw6mgaGE=": "384878000000", - "Juj08xdyc72IQxM9-SZygjge-JgZUO7oF2UysqHoMgk=": "22871716000000", - "Jul33G6NwHQ46GZd9nq-qtA6Hd9HjiOwFDZtfEAl7fc=": "1927547000000", - "JuxKmittEpTEmAWoaLAfROWQ_vbHwCKZ8WTrUNrSwag=": "454545000000", - "JvMacH673a3njqNodP2toot6wY2ieHKP9qTLcq6RMbg=": "465122000000", - "JvUlXuIT3zkX_qITQvEM99IVBlvruvUBSWVlDkZwKV4=": "384769000000", - "JvcsW23BxhyBCR7Me0Yp5ZkrZTy_oTNnfAtEKmbDxgg=": "385506000000", - "JvhPzOTYgB0BT60dx_bKR54vZizWFiuQTDoLejs3y4w=": "455249000000", - "JwUDIpaGHXhRtjVOlpp4ahQ-OIEadPO-AwNBNyLaeUA=": "4559898000000", - "Jwj-1f_mdvad0xCEZdWvFjwl_EvU9k8Kj3701bJE7co=": "459646000000", - "Jwy2w-dnH8pc_cBbjBEB4WJ2baVXyX1jx5PHeE-qdic=": "4166666000000", - "Jx5YKaLadI_SmQU82smZzG0AyTqyOkZg4U1llQjo8sI=": "386305000000", - "Jx6P17Bsy_RwGbMhFJBCHx8hZsor5P-a3-EE3aGfddI=": "961538000000", - "JxWjJucvlm6bhHHu9cIhtL7za8F1ZJ-0Jf0X_XwF2WU=": "384615000000", - "JxpErdJvhwQvQgHSrf4g7wNbw_oehiok4oeE5jEM0sA=": "499999000000", - "JxsvQb5WJNIFgqrqVuqdd9OaNoi7P-9VQWeuV2Z9ZEM=": "5370060000000", - "Jxz_plEsq5PcWx8-mNqSUTa3Wra9JnqSZA8Zf5BbG3k=": "1198869000000", - "Jy3l3DjwIyMsd9acEdLcH18og6yGj5Tv0LVuIqiKORI=": "760571000000", - "JyBMCpeK_BJyhCtSOdgjfAH4ykW4_zweWBwY_VdUNtE=": "18500000000000", - "JyXJrfuPpemUy-Vfl65KAmFrV3GZIdFihP5mhAwh9pg=": "567449000000", - "JyqO4wo9Xz5eb-mq_1cdaOLivgAF8zXLXt6U1oFIwWE=": "450689000000", - "JyxZ1BMVDP_cR75qW84vu-0sj_--GzkmXGZ5J3OdIyw=": "444887000000", - "JzWZbydPJp4H6BZheSiPI8Mv-TyUhxhIWVqbPaZEbyw=": "976492000000", - "Jzs055k_qwHS5bw6QDxXI0hwJbq5E-dDTxDqqOx3jko=": "909877000000", - "JzvdKvp9cbezGb1sbr7KlSv2863QUo_7bQqI7tTRoN8=": "376125000000", - "K-IdVosSTgi4TuN564wIiqJoL-l-d_iSFf40Gy56QPY=": "416666000000", - "K-JB_3UAPgNt4zL0deKf4jCQPoIFRn4jIB-UejVJqGA=": "1249999000000", - "K-QSaYAYs2MnWDNR0AwoJqB91aOe6ILNN-cMwa8vQ2k=": "1659200000000", - "K-Yvxs2_07mV_Nv4wcYED_jbo8Bar5DI8Yp_2lybi5Q=": "385510000000", - "K16AaUs6p2CD_dBJdUgI4pdnGGlM9TXoo4VLfyRIWwE=": "381805000000", - "K1E8H8r7i1VUSZl1LLMb_jzjK17uAxA1tnFdSoeOj9I=": "1221746000000", - "K2Ck1ml_EvHJQ5rtvNY1U57XBUEz_zXDym31JfmWjSA=": "1534635000000", - "K2KEmHFxhx9bnfBKJ3Zc3xMN2FbwM-P-9B-Hcxnb7f4=": "1244967000000", - "K2aTcUQ54Q1ijhHmwRLurlOS6mjwxqRW2BumZ15dems=": "4461107000000", - "K2lHf7V6GzwJ2Cnbb2GsAx9vlpWBUFOTSvrptcJBuDs=": "1154647000000", - "K2sNxlKPVrf0jUE2HfAV_lqU3Vb4mWLJwr4HZ936QO8=": "385506000000", - "K2ytMQuzCD1hIf18fLhdzZZWp5di2Qh5qqhbn-xHXZc=": "385506000000", - "K3gFnjqS2xf45XCiMGwDQ4tOLNE5mZnwLsZJCisZLZU=": "416666000000", - "K4-Sob3R3WIBg34PjcCazBlzqUQOu0AodZHD44s2rcw=": "3831356000000", - "K46cO-xDYDCq7wNsDOxPnL9HsmZnrAwA3SP0-zHG6kE=": "7692098000000", - "K46yOQnRY6sLyyfE8pxNEChPShtDDlnDSEWsPMk7vVU=": "391701000000", - "K5GU7vILVi6xwRJ_8bhjHo8_0We-p-NXGK5_gAaOqH4=": "456369000000", - "K5McJ2viovUWs595WBj0tDxcDbgp87dspaQIbOlaZos=": "453760000000", - "K5fppx1K_4nIMGAjUZZdRUl8xBoPAi3V_el8bDuNB0A=": "3539830000000", - "K69wYbIotTPQ2aewdGqkptoPPJLfXKXnCyJTKTZFWCc=": "2225295000000", - "K6SrAPBo4t5pcNI2VkNQ3Qq_SjHT5KJVZZTAw8fpr0U=": "1923076000000", - "K6urZENgWWlLyN-ksCYNdlV_WIMggHCDWmMoXGdfd2o=": "423076000000", - "K7i8GXcuuigg7pOFFiin4TbKWnlq_mGXcNRhGBijAFA=": "417637000000", - "K7j9-D31xpE9BfiHsOgLbmiH3F4ccd6r_JMUwyz6L14=": "458333000000", - "K8Ft1ytQQv5gdWzAGWUzqtB0kmunF3hqnOxUXUq3t1c=": "657041000000", - "K8XFEaEDAw76K5L0dpbbRe9gm6m8wUkREe3xSIyAQxc=": "489847000000", - "K8m0iqvQfWNzdValrjlppWV2dFX3BUQbkY1PhmWbe8k=": "482269000000", - "K9rEVOD6ttFv5WoGj01Depr-oGyAtRzUAp0h1049UDc=": "2305117000000", - "KA6s_0z4YjGEPLRLNKkfgfwSr8N_MInuqZ_TcR6gGeM=": "502779000000", - "KA88KDh-wRKRwN6Ko_NDSvi8Uit77oQGcgSQjEF2TRk=": "467149000000", - "KAH6qSotdNKcbWeK4mf6OEuHDO0eZASGtAD5c-tg97g=": "457200000000", - "KAip4JbGB1JGhBJSFP5679lDWugFNRnpi_FQu0OxQuU=": "382394000000", - "KAixrst_AlC_0zUOFfvVH8bfobkTRh3Hs6PzhdiyrCI=": "577623000000", - "KB4pdVAdqeztgx5R9gnO4YJKOHqZ-0c7-Hx1yIEZ-EQ=": "491734000000", - "KBDJdcNJVHwmXrrBgmokpA0pVe7f-33CRqDzfO4BYtU=": "500099000000", - "KBHUPaMW_LKaRF0PAvylFmbZhW9651FjWTGBjcVv4i4=": "1033670000000", - "KBW0ZGnwcyZJNMa_yNgAhpBHxnuPLoNVkMpUCwflEPY=": "2567811000000", - "KBaMQzlJm7ECrIfA0bz_Q8K3icQek_cHbiYMLjhcmng=": "415999000000", - "KCPloTAYJL4rFnhF5JamX9uPAgRQEvFmZzGe3pIe5E0=": "384615000000", - "KCS2852VjwBqaQ0f-Mf1dJacg503oGDiWQzEOxuQj7Q=": "3496875000000", - "KCbTtWL3o8zgt_NzAhmvroJa_q8v6xVUdQMbyMGnRwA=": "466799000000", - "KCcN_TQXoR_M2tA_5EShQu4VsJXIv65uoIDIxg3lCP8=": "390901000000", - "KCcuhgUeWMhGro715l3hdezs-wtKg1GuhLOAT8TJ7cQ=": "390743000000", - "KCspfhgyYTTqZYwz9QQbUg1VROI66L1eTuzV4l3VDrM=": "385507000000", - "KDAEkZA0Thl0YT7Z0coq9Da-9AGniL-LuuZl814xhc0=": "961538000000", - "KDEs5q414Fy7t6suQtD5nRLpNmuL2tINqdZBDRJY2pU=": "103431730000000", - "KDJhJAy0dTZWZ53dmfT87IoCbgm7fmha8ch3pYYsjOM=": "530056000000", - "KDSG5PLqUJi7X5ieUwcE1fgCv08jcI9ACFidpxxSGW8=": "414831000000", - "KDoIQbAU6XcPZbc2eMYpReCtkW5JiTG0dmidDQr84ks=": "1249999000000", - "KDwAgXSaDD99NPVmE6pedqt9vzzXBQIoVIi_zpFv2jc=": "961538000000", - "KE7NGbq8742N4xm4CcEXwaHlNaoPBd2StxLIzk-Fthw=": "426919000000", - "KESZvAZsyV3xqVYdlMTGh1rUMNQvw6X5Kr09qbzxjmc=": "680724000000", - "KEid--EUXZwnA9RRIEdhuSo1JKA7EeMCS6hFldkBOJo=": "384615000000", - "KF2xVFBz5-Z0Fd_eEAKZC9wy8Drox-BKhuXmXzUVBFg=": "385350000000", - "KF6EedcX1LIFCjSnKB4rgCIJ0srHV9PAOG4C9K8I3Cs=": "447177000000", - "KFP3p7OR9vuRoqhPcHDNoHgApjbFxQTryXTnrQUFJck=": "385510000000", - "KGeyr_c6cCnFk5lmUdHp9VFYkUlwIOq-lGsjuywEl60=": "387815000000", - "KH3BL8yGVs_oAtvbmnnSNd148YjK5G5wowJM_Qt3kiI=": "3846153000000", - "KH77z4_QZ7T0G1NnaoTSyPh9fJnBhYjIOLQkqWJ_7Hs=": "454708000000", - "KHgTQHJpR9beZbgb5Rnu9DQ1Tr43X_GHQ2jWC8X_XVg=": "385507000000", - "KHyboQzGtfVp6PBdH7elrSihFAVcvDvgfzPhfNhyrFQ=": "411085000000", - "KIYdhoBx93u9D-DVZlwsrbXtYAU0tmNbp9JAi5z5FQ0=": "4233705000000", - "KJ1WIZcPRmlxFBHrss0OsApJj_92v_v2jV1e1WKe9_g=": "381436000000", - "KJ23KbhRiKH2hezbfyXKzEI_Y1WaiFnVLjzgAJ1Nb9Q=": "384615000000", - "KJJ1YtvtVZ6gOZK6KKxXXDSAvfPea5jGov5x90j_rLE=": "1515670000000", - "KJP6ulpNfjKvIqGXJV7s-UQyXe4r3eU-YdQg36dsEcc=": "1282693000000", - "KJQ2xdhQ77Bb7TQq9FUIq76lLBppRcNoU7myLelVfWA=": "3278835000000", - "KJS_M42ow1QdG5WFgC2gg0hfLezujfikr-IHk7zNDIc=": "3812860000000", - "KJvaVYYO2Yyj6cdoKZroD9VGa8CBg4W3Gey-Hq61MWg=": "4173313000000", - "KJxJTdetZU172ukdkJfDKIdYBE9hTyGJGiD4Z6-tr6g=": "833333000000", - "KKYF3UHi8mdWu0uhefKTl6JZ3NSCvVXHYZdNpdOUJN0=": "404478000000", - "KKyQcqHumAeHBZG6wLmpQV1RxqevvB-HZi4PHhWdF5Q=": "2337074000000", - "KL8pTzKuWB33jvAgzQ80EIoIM7ZVfLDI_daw2JHju4A=": "384615000000", - "KLMkyeSckwj51BzrUIamG32sRV_eBlPCJA58i6y1lVc=": "464111000000", - "KLwvfr3REbst2wy6h1VkNMj7JzMye5VazWXNum2s8XQ=": "385800000000", - "KM0OXk8lkkjZEpFvuxXTXx93BnMZMM_5j8qit7SgXm4=": "19028823000000", - "KMCCWfeT8DI93PD2SNyOzI_3LnACOojtPwzS6aItMrs=": "384615000000", - "KMWKb7ph7V_-tJTjOnq6PcU0s0nqauvh1in4uuoUuok=": "405846000000", - "KMxNe7J3ShcGQUEx_NsykJ03uXdcTEzU8xxlM6uuxW4=": "1905685000000", - "KNP8etG8XI1njpKl_EB_8xr0AwF9SF5gAsiwRZmIfg0=": "578548000000", - "KNd39ZcT0Fecrdpvqfi8aMv0T7jMkUaRTWKYQT_WGPc=": "1187125000000", - "KNjz7hsmcFiTjIaOiMYkG-ulXa7vpMYYoRG-DUneR4s=": "768419000000", - "KNpHDIQPL9DSwDiR5eEF5KR1_lwNSUtyLMIy_V_cnVA=": "771151000000", - "KO48-MjR-GDnQRvsSRjWac8yFoyeKtM7PLh6X89HkO8=": "833333000000", - "KOLnULirrMIH8dIBNbGedcx6-T_AIHvngwe464dJ81k=": "28636363000000", - "KP-yuiepMrU8dHDwQn_5D_9TsWijR69Y65e5fdldvH0=": "1219925000000", - "KPHI0s8j8X1A41ZEyKkjLlhC3RfAHA1acB61r6a28Oo=": "682587000000", - "KQ77d3E0pM6prQ33Z3LnKcM_ZkAOdRea9m04gwMY8hk=": "378561000000", - "KQSjbu4i3poxSwbmovFyHwhL0dc5gKspsMfcQy7D8vY=": "393598000000", - "KQdWY3WnXR8K-jVzzJ54hpBU-spGODGLBSJgBkmBVZE=": "454004000000", - "KQgYHNiKGqIA60Hoa8EEk0LY2GwdYhN0f5lIhIoAWIE=": "1181217000000", - "KQrPOa22EKRsgWAfJFfehgqkZAkm1gt-ypBFdbuIZCw=": "840617000000", - "KQyk6nQodDvmh5Xe3g785xMd34WXrwPfwl7x73eHhrc=": "1730110000000", - "KRawR0aIGgAMn-JHnwHOLZS6wK4QMyT0kqEBvBYDmm0=": "769230000000", - "KRgv_Yf0pzGKJRXPkP6eoD505AzWSlUdW1fq8MRf-6U=": "1249780000000", - "KRncOv04k1HOuN3kJUsf6Y6NM8enjWOPfg3_RJfqB4w=": "1927537000000", - "KRpxhzj0xOPnP-caN3ob8KffxudKRaPS3LvpaRb8r2c=": "3846153000000", - "KSIoTO3ttzM3PEzaZZnfnXdNPdg4KA94-pnDMvnh-bk=": "767524000000", - "KScgGopW8p7B8GTwD22hc2IdsMjtUsDSSMJ_OHHjYh4=": "384615000000", - "KSlTxd2rRVusy3DoJho2AMLpq9UFtledh9GuE1Offrg=": "499999000000", - "KSp1nLY4G-_F_pAx27098hbkW_Hyg2ARbHkeod062KQ=": "462839000000", - "KTCMFw6_lHC83NUNMgKlmoxRSyRB5ox0uO2PlH7oEPQ=": "416666000000", - "KTEkUlTC_u7JCfIYB4Hjt-tQkb0YpowA7tfEZtlCs48=": "384615000000", - "KTxILYqEX9ajo36cMJOl0I9rUAz4XAZptfGaCzD06Bo=": "4730769000000", - "KUB02ayzt9uJodkIqjTpn_UhNsA77GGgVS5RkoJwaHY=": "381938000000", - "KUeF0Qk2M9uQXsD18JLz5CLsam2znFKIUELHuKbZ5tY=": "381566000000", - "KUt3aMV9bJzvAVwraf6NvfCyYIjw3pbn8pKNamTyQQU=": "416666000000", - "KUzqeU2GvWIgJNKbWXPAQt2pFRsZ5zwFqigFiJlVe4E=": "692860000000", - "KV1Rcwqw0HEpwn4CV8YGQQGBrIosZIuXppHtFHWyD7k=": "2817861000000", - "KVN9YLnszmT2Isyw9WNgidvrw3hwN9RXiBJym09ojjM=": "866755000000", - "KVhgDm-VtpGnhc6eI-8eAm-cQ4DudqQznNWc6b87aKw=": "4230769000000", - "KW0fwaIdzwChjDZvXS2cmIv58iV8NHPnsxO53FDFc54=": "1684891000000", - "KWYrUyPjxUQXtocXfkQSPPpGQSAEpIWXjxIzldYwpg4=": "454743000000", - "KWymtyquins5JNyHzk_NYuGdLYX_xSIysbRVO-HKfLQ=": "386296000000", - "KX4oo7RJJqejyV_IpXFWzqumFYEdbfpoZoDvTH6s7I8=": "694666000000", - "KX8Vc00sZdjzT2ik3UM2Jffg-gUhatw0iNLME9MokD4=": "457766000000", - "KXDbi0ONu0obOpa7iVbCm7CNUvsqOYYx8Qh99RRad-c=": "412463000000", - "KYNi8tR4abUksGHWbjwj9N4Lg2A00M6Mk0gzt8G3sUM=": "944522000000", - "KYPQyjADUkxDTKTHrPjyaFefsQyL7YlIJOqK4b34Icg=": "1671920000000", - "KYXmoSbeE4EvbjRWpsWk43mB9nzuabE7glhboJGZErU=": "482124000000", - "KYgdcHrC03FqGHuqgLIQDOO8b5QHuOY9xT-7BMyUMfo=": "384615000000", - "KZVoF0J4Tub-Kz5o-GpeYqK-0e7h1qjqaBAx70Werc0=": "385137000000", - "K_UV2b62OHTAtGLxsVQ51CLqOifJco4--THWvzaoWmc=": "396931000000", - "K_lB62kLmXYFPqfjj1WCpsofYhQMEsT5anCljn-tTs8=": "1818181000000", - "Ka0wisAqUrFYHrYI73G0QJPIc3l6iUeC9BE1BCzR0go=": "1655674000000", - "KakKIcVJUWEKopNz-6epDFZxF_q4MWk20L_Idqm1GOc=": "839770000000", - "Kb1p3fFEOCLy91yOkF7ZmejJmgiX66p9ZbBdtaOKEWg=": "382394000000", - "KbGjzt_Hoia6dESRDFgv1kYGTPEGcZNGXqGewLOrU4I=": "938839000000", - "KbIcZKfbU44RRf7hwVfK6t_OFkmzr7Lts7WmMv6ybDQ=": "539898000000", - "KbpuVYX-O50uk9ygRwACQYyd1mR9Am4xpL5scgXGGDU=": "749999000000", - "Kc-PfKlLyyugU8DJC7xX7AX_FhagoTh1y6W_-GNLp4g=": "453674000000", - "Kc-cmGtvF4W_lSX6mvGBo7g1CNuSVxngfzcCExGBmWo=": "763607000000", - "Kc0qvm-518eSkn2SKVu89vhJ1uEerYTOy9h0Lck5bPs=": "411609000000", - "Kc2sMWK-JzP14Jwe8iPkMl6iJB-0wYzOqFe8bSX_TJE=": "774052000000", - "Kc3oZglCUp55p5QPfRJE3UtPA-xR41GsMtMtT1rDve8=": "387186000000", - "KcN8GP-cjlz54J7YtdG9qe6uMXn_ji3dG89daKeLb1o=": "385506000000", - "KcQVEjRK92LwnpH4ecMo-hcHNRyiN_63RPcbrdJoerc=": "838273000000", - "KctMuB3PC-aNmNA0_f5OYNcMXpJt3aR26f2su44n1T8=": "384615000000", - "KdWPoxP7UhaXiK3jRuCayvMn1HMjAzuKQP_vUuHx4oo=": "352326000000", - "KeEFsnbKk0FoNKSzNR7D47UirJAOgi7XUICtGS-0Tos=": "390207000000", - "Kf9AhbVoW3UNZ03yg0NvoXR_c5HItZQiHIjDbthLJcw=": "409110000000", - "KfFA1SJ3HD9yU48kPl-niAZI_SzBzMk2XKKT1R-_SqQ=": "909090000000", - "Kfngm-A2_sletTReKVGejhG5eQENnMWRY7vrG4X6Jo0=": "1005354000000", - "Kfo-tpl5ewaodfDo6wlEaDmCR_7ncrwfjG7xvk-muqs=": "7500131000000", - "KgQE3uuFr8AHbk01NUpJbg0UfXMXmPE_yjv3C_TIigE=": "381802000000", - "KgWmfPM-LbUOzRiTpKV4WhdKWP9LLzgQ6R6bQqoAlUM=": "1521370000000", - "KgixXUFrAoBheNghc0BX7dais_htchQ020_OjgSNSSA=": "384615000000", - "KgkepPQzwx-MCqXsKW-4Mhj3zkxqoSRx_fLdfdYdD_Q=": "5958333000000", - "Kh2MkIC9aZ4au9mcQVaPzY2LZOm0sxdtTChoeviRE8w=": "425503000000", - "KhF1mokp_zPLXEklsq_oMfdc4WAA_d9agkrqO73P4J0=": "470730000000", - "KhFCaCLeVkjs1bk5nsLCvzbAbf3FMSSqQLpIKvuvrks=": "928601000000", - "KhX_1OE1xFxxrXro364PTgeXj5LNAnt5hhacrvrpXfk=": "451134000000", - "KhckLsw3mFGDw8XBIxcBnehxJ1uEVDrJtwvINHarvS4=": "454545000000", - "KhfXM4n3gwX2XE7Das7M6QlNFM-5NjdrtKmhst32g2k=": "385507000000", - "KhgaufrUlHQ74bCEC4ecr22lC9FBR9tSJty1LxSKk-w=": "833146000000", - "KhzVTSMlkRlwC6p3GEf4c-b9jSDMjR0LhsH3P8uxXwk=": "1927537000000", - "KiFbHwp9yJt6YWPC8TELrdu4XAu_1WIMP_KOH3wffKA=": "4152980000000", - "KiM0Ct9huUVbc83GRywqbCANWeak77q-6bZ3SkvqQoM=": "447934000000", - "KiROG__Uxr6Qc1mJfkXOXgLP9Q2ZuLji52ZSnwpf9gQ=": "358755000000", - "KiejVbwxTBIB8pTLveanoO97L1YAtQ7iugeYzSoi3QI=": "1366800000000", - "KifjxOjikcvto5Uae6qjbH-hCPUQYRESw0t0ZOc7EZ8=": "378341000000", - "Kj9LVBdYRNNLrRKVk0QNgi7-0eM9V-iL0FV7RNsddYA=": "384615000000", - "KjPAjYu2EFQY7QPpqFPMCJjO09IX0hYAIRT-jEbmnYc=": "743064000000", - "KjbYzXd9B_fsEuRYuCmB8qjzA9NiAdVtlcqD753wniA=": "771012000000", - "KkFL2f7TME2Uw6BtWW7zWy9g4rHWiAWOPpFWDxCqovQ=": "1004789000000", - "Kkbxv15M8QvE8ld-5twlW3cTvLoybWKR2QIDQW0ptXc=": "769230000000", - "KklzW0GyseRNv3CP3U-89KHB0L0xpq4CjVFcZWnkWuE=": "569773000000", - "KkotPVUDQc1I7D-zfUQCfFkst9R3p6vqc_tczMXcPRQ=": "1999999000000", - "KkuOvfM4PGV66ayD658OoEM9nAxXjjuDSmRQX98CC50=": "384615000000", - "KlE9WO4OnOz6hWPJh8PwtlsCNeyS_QEbRJgnHJvHics=": "383959000000", - "KlWpii3ILSmkbM4uESDrt5KW9b5fa8vg1PET-bjlxsA=": "457341000000", - "KlaGL_q0SNllr9pLOJjejrFo_bgIDOPsVFt_pFBQ14E=": "456909000000", - "Klv2FxEtUk00n0-EL9DowK69LvBS-Adqwxnaj7B6PKw=": "4669772000000", - "Km24zwkf8XA1QL7nrgy0GQ-66te8gWApos4gMKu8Tno=": "747699000000", - "Km2vfBBkhG9uXwawAwLBPNpQ6L5NkoqXXZuxqnB1388=": "379260000000", - "KmAJcjCD184NhiUGaiZPEFdb0uRTLxEKOUSKRL4qDMI=": "417634000000", - "KnoouJuV4n5h0R9e2ku7bW1uTFGbhybtGZkWfECRLP0=": "417633000000", - "KnsyBCP8jjYpGSzTILJD3XII5VJY1is61dL9iyehdm4=": "653742000000", - "KntnDOgpjZI_yOgJPXzKIYLsQoRZN1UwpDZeoQWqJIc=": "3417516000000", - "KnyfopmMnzZ6Cwh6UeSvJ0S2WndVxWP7WZOs1WGird0=": "3249005000000", - "Knyyy1TOfEMvUqieWGSOIZf6TvVFkhEDHDDE2gQ3U5E=": "451018000000", - "Ko-FnP8gcvfR88f-n46YDuvnbuwbpf9bPcYKz3xUIR0=": "14970560000000", - "Ko8wzUMqGLuSgT4chcgGcpwnoLyEZQNjompTJ91_PQM=": "461718000000", - "Koelv1AHuS8SmLOBXEvVCxwmoXpZsLGHdBxkLyU4RC4=": "3832056000000", - "KpEH4aZuPev4i3ptPia6PmbSPBknHmNvSIEVzEoAFxA=": "384496000000", - "KpJNEfqjTlNXU93lKK9G1Bdlsbg0xFu0cC2lWYEUXhM=": "1180485000000", - "Kpv9Lehg_AvKP5BhxUNFS9z9NPQqOm7biZvQROgg49o=": "1252892000000", - "Kq4pD14dk8288o4dETVpUVgbjinlKRADy7W18zrJtYs=": "627016000000", - "Kr3Aso5zgZlMfJj7hqWSma2C20tfEyV3_MEakS07UzE=": "3898137000000", - "Kr99LtaCv4Y2lpHDrJQNgwVL3Ee9hDxVyWAAZ6P2tSs=": "132113541000000", - "KrDnDAqP09mAwsdZ9nwlTg1tHqWD-34kMxIwfjvUONo=": "384615000000", - "Krg-dqjzv2eoTxEmXdlRY6QnWPZDz0i-IeaiLMfmJqQ=": "385510000000", - "Kriika6Rp632CsTI5_vEyJSeUISqEQjsN-SWOVHLGss=": "1076923000000", - "KrzNmCFW9EhNM1w61AZFsNGsjA_W2TtzMbjGWXV9Zj0=": "449007000000", - "Ks10khIXqoC3SzT2gSvtmmCS7xDZrR2Jp4sCMuyyWOw=": "390649000000", - "KsaCaGR9BrATKrgvIdOwioqTvZM34B9D4j_ZvmF6iGA=": "989334000000", - "KsdadUZsh0twy5rSnxAk1hUsefN11k5KWry12T95JS8=": "416723000000", - "KsmJXbErau89kNHaSjEgwVg_cua0FuStUwBBCznCRSY=": "7710150000000", - "Ksz1nZJs6Y7z019Sd6arbPdaWGJJkkuCNjgO-sAfYa8=": "794665000000", - "Ktm6XP6YPZutpWWcCueAOXXTdgWRt2Pz1CMdy8nx5Ts=": "424120000000", - "Ktol1K0bTsP3ifNep3qWE4mcp0uVbOXA5HSdIOXNsYQ=": "932180000000", - "Ku3VEBNDDj1kOLAAI0X86sBYMwrqK8BxpChXjCWmoqw=": "833333000000", - "KuYS0kRa-NvqmI1urQOVPkYhrj8Q64M5wWWxfyCu9sA=": "925374000000", - "KuhQdEpBjD9sjv1k348nD7a4gDJ9oaCwnRMIF_Z8yk4=": "764768000000", - "KuntYiuOemRHr1EUBtbv8774LrgnIBwsKeyLUoCJvhs=": "769230000000", - "Kv8aIceizwTs216VAkVJjIsrPv2kjNqVHfXONB4oO7A=": "4175192000000", - "Kvgrc6qROCkTP8i-c8AM3GlGp_JhRSKZkwLYlJh3xwY=": "384615000000", - "Kwkdpu_mpA7spNx70cYgsPmZ9tGdi2hS_Nrcs7Axv7Q=": "4592645000000", - "Kwt-u0AZNAcBSskQO0DOpgG8r2i9xSSNFsyvAaj53aA=": "1529468000000", - "Kx6FvSLWBAG-kAoqyKCr1q4eI8otPWwChXJ0Q9_t5IE=": "59336443000000", - "Kx72warQWYAtylxVHLkeWYYNswWyzI4rm2Nmqfk9MO4=": "512979000000", - "KxLqcW5jrF-CuorVEMk-QHr839bBNwZKN4coiq8jqvo=": "422328000000", - "KxSKLpY2YPkav_hwAAe4uV7EAGIsoZ3SNZdFr2LLTOg=": "453059000000", - "Ky42pmua_XuxA6z-m7L1Jms5fSpwygZVL0YMOYnPI9I=": "4155440000000", - "KyC-nXug36Uj-L1rGgeQ_1qYF4La7V5xKNjYPubrF3U=": "922292000000", - "KypirK5luqTiFQHF1_F-uQl1rPLfBfk-1bHeHXrdUg0=": "1794036000000", - "KyqtvVWy_55tDzwmg1SvQWY0QUikHOPzsgBwkfcD0uk=": "3852488000000", - "KywoDepRRPTHC9mCEsAoGhQoBsn4iFFibdQS0kuh7F4=": "1897049000000", - "Kz5zp9dF6HADUbudwrRywOu_NT4OsKUrnw2z9FpPvL0=": "1949879000000", - "Kz79E520k1qm2CCxP4PkdJXIU7mt0nWltJy3gwRjRzU=": "385507000000", - "KzN2MNNtwhgocim2K7wqOWeZIY2i4ZcBuaYvGiK680U=": "958891000000", - "KzfCExBou2xLySqBPkqAAVk8GSdstVRXJiOU-CgXugo=": "483333000000", - "KzyLHbifwrqvOwoh-38PNlGZ1KUQ3qWU5-NE5S4rx1A=": "2055429000000", - "L-4YOUpkjfG1wm2J6WWZqcCnAVoyL7_WiDKnKgOCT0M=": "958256000000", - "L-FIO8Jw_JAkQ5Nm-1oU_kp6-YgSpbAUtlKPXWn8IA8=": "457804000000", - "L-RZw0eawAuv1UXwH1raEi_7Smw50sgpE3yFU8Ye8rE=": "363493000000", - "L-f2Y-AyF8QfEk8x0axEzSpyUllgIGB-4FuY07-fBgA=": "33176173000000", - "L-ieW6TKeO6HrGYlNRbveaA4QFuHvG8EVxDCePm63O0=": "407808000000", - "L-kZ-QTDHr4fAXTDoSCQyPd4sUtdZxRjgHAPcoj4IwI=": "451268000000", - "L0NACyqfUXpsHVr1bVhZbTq8faX5pcmJT62zCaqVXFU=": "2712925000000", - "L0TaXDdmHg1ANwdBq24m83UjMP2arS_6huOYCzr610E=": "628794000000", - "L11OkA-dJicDTifGLdImvkdZO0s0AupQONtMzxf4hi4=": "650869000000", - "L16kfgxgsMtfkMLEBWiAa_ZCmWB7r0bFAyGx7WFgfmw=": "3813588000000", - "L1CYHi0qJ8Jr_cFWRIBQ6HV_f631NOVRSP9SyUbftig=": "2272638000000", - "L1IztYhYiGfN83j7pFijRH5RaxW7suJuR-iUrLjrpok=": "443773000000", - "L1SAMnXuI6fTFewV8n-FtWNLadxBd0Fx62u67HIva3Y=": "459419000000", - "L1XWWEsx0kbzq6Bb3k0dTYpdE15t26L9jhvz7mf1Kk0=": "451756000000", - "L1gjK3K1cQNtcaB3-Cl0L2Wt2vAQIZtLYjnLE4kSKO4=": "385505000000", - "L1wfgsz1qZSEqkUKTd2M2oiMZSPeQ8H17d-Q4nlj2YY=": "7529253000000", - "L1xLr9_AqYQ0XCIPffVuLOx9gnCNqm9h5vmXvi0K6dE=": "385510000000", - "L26hhuABWb-p3xTVeoiCuuVMOqW3YsdTNBJ9LSBTu3M=": "1156519000000", - "L2X3VbEc7eikbyRAiUYQHqBVEEfB3MmfiZLVW3qymU8=": "1135024000000", - "L2evAkWadiU-8CzeRA784RfXKrdbwBVnGy0MZIHcTFc=": "579369000000", - "L3GCn4fpNorOwKaDp7jdyf4fphetDJbur0evGmdi20g=": "509711000000", - "L3qXqIIrFF3_wU85Ke425XjeQ8oHf2bGnRxLs_L1wWA=": "76651905000000", - "L3u4yJCjSOswZxV8-7aN3MaJbd81D0MNwdSoVP5iecU=": "1134899000000", - "L3zxXMMRN2Mi6qoqQ1tvyOHeqZgnNsNnjGaMfJqiUmk=": "2273889000000", - "L40fJb676-kIzbgrT-NVXaePR5UtHE9ZnujXXpkLHws=": "3841471000000", - "L4CGf4hhs9v0AdEk6VLvOGpCsRuSJ2NqGCbytaAbZwM=": "1257609000000", - "L4XU2CNcnAz1efjNhR_-xqO2mZlY6zGwA263vRD0CXA=": "374288000000", - "L4dZHx9Sj6JG2aEoB1ckJitaIthP9v0D-Am-2Yq_q5c=": "411085000000", - "L5IUFXPVY5sfA0Q_CT_PG26c3M71kNchKxl1ZMBE-6Y=": "10014866000000", - "L5LD-Kxa3eJE_isVbkbNtuQEnfNzfu9STh_iyv9LTaw=": "5014953000000", - "L5NqRwifIjwjroMqx-d7DhAqfGeVCUMoIldQX3GPdmw=": "4999999000000", - "L5Ud9ZPmAfU9GOd9NSK6AVA4gRVXc4skpoo-ukEzfYM=": "3840705000000", - "L68HFHygmwXhF0Y16KRLD7Pca6vicwWTp4JD0y9tKr4=": "384615000000", - "L6Aas0ROpsoDG7QhKcS5FolTnUZ-Ycba2gM-XAeC8ew=": "961856000000", - "L6FxUKCDis64KDFWDeCFzRFV5bh1Eg7jp3gx47S_9O8=": "1305000000000", - "L6dBxCA0K_WkwgbcjTp1DeYe5vxGeKvg4c7QqJ1gxmo=": "2006003000000", - "L7AuAYp71a2seOx0zhGVWepodYU7Vvfb21CJYB_5328=": "382394000000", - "L7U3QkVTjSo8vqsaE43i8fh81vAj5Q3MU3sBxJaOYys=": "1807692000000", - "L7Zxuw3Yuggq3xarpr0yq8YNTag61rYv09BjkCzxCes=": "3852392000000", - "L7gtxqGTh14Ei_UbzMMENK9XiLuGiZH1ri1HrWHhMPo=": "519230000000", - "L7pZFqTE_1q5OCYyZH3EeiW4UPmFl9VQKXc1w1lRHBs=": "384567000000", - "L8WJzuixAihnW6_iX7fEd8WLDG0Yb-B6lC3syrH32Us=": "1728109000000", - "L8dHcGXawJ2O5AeiX5DOvbn-6joj9cGvc-FF4SJ0VBs=": "948553000000", - "L95d5t0N_FgYzSvcVlleWOJfPmzA-pQvGaFb2hMy3-4=": "450573000000", - "L9DMZQyUdU4NpP8Zuyaz-qpTDJ1j6cKpMe39mqU1lYY=": "481282000000", - "L9S6xA3hrwK3TiS_6z4E0iftVavcNSlwqTe2kwlfkcA=": "6624205000000", - "L9Yajey5dihK4xc-3cFhw6UXxfCTK4sKmrX1oRW-vm8=": "455506000000", - "L9a2nb33yB2HKZJClfNAyOV_GI0TTl_bMwTEjOHQZdY=": "2356327000000", - "L9euMSCJjq4vzHKZ-nL8kYr0r_m9pZdIoGWvoK_G8CA=": "823136000000", - "L9p-UyBeT6Z2_SNdDb5CfyZfHIZxUKHqMMZ2n1aOuyI=": "384615000000", - "LA-t_UffpX6J5l6bppyPIwYZCK3gkZ7r59hlSR6U9TY=": "4166666000000", - "LACjvTpkIT4XZq-FKIq2gFvm9qbRn-Dx-J2UT6N4efQ=": "1156519000000", - "LAX1pruZfUvnVG6Z9dnU7kXucA3KgL5XjtYXm27X42o=": "2084505000000", - "LB8F-JnDV8JQTuHzy6_dIV0FDCtPLvLsnIZUrcEnTnY=": "427562000000", - "LB8gh19HSfP4HF_3eXwry5pLC7nDPeMHWnpuS9-4M5E=": "496283000000", - "LBPSj2XWmAUnapkMn5X2C2fVtWHX45Bm-Nhc6vpXLhE=": "1240189000000", - "LBm3sfcprhk9fYAYM1qntr4n4Il9OeCkZVcc2iRvnmI=": "378633000000", - "LC4oQhOYj22PtDy5MUVqBkCibSY-0aQIaAAYKcuUXNA=": "472079000000", - "LCA8bLH-8kD1psvc5xqnPPK4f7wCtWvAwgbVXXeh3Bc=": "383201000000", - "LCwrot39gZS4szGWQWrGc0xF2NvAFVStAlYlbmqA-3A=": "920881000000", - "LD-e8eMck1ICIQlpxXhJZWXUZC4m5G67RsRJMBdI8eM=": "388085000000", - "LDMTYY7ynFx3KrHgH6iR74GhkDfDb5qzj4vBVDBfgdc=": "383005000000", - "LEMU64HcjpSVVcC3T8VksHswoKuN5VC3FC8jhDNZ_vY=": "1153846000000", - "LEVWZdpmjFiUKw8K7owbnnyItw3Jmo38fz1UObVL3NY=": "415384000000", - "LF1WFpL7TrNOHLMsxU90V6DozhoIA9dig5wHxBcEYhY=": "912797000000", - "LFgLeiWH3aN9OmsRl1_PtnRGxczY29N3c-4PDcv_eHU=": "384571000000", - "LGKYPeNfbwll3yUMb_vYOT4o4-DnuC6N-XPi7IKDeWs=": "1156518000000", - "LGot8huAvLwlIM4pg0ZnJME-YozOxScNMBEFQkPVVAg=": "451255000000", - "LGxq9rn-OpyvzNj4XBhMJ47mVITNXhzTM2KJ5JWWoFA=": "2084322000000", - "LHFbq_c5B3nESfYFUWg6mlD0ldgf_iLW9xMF-cg0mYw=": "816101000000", - "LHMoiNd-TRqpZ-Eyos2jsZtT8dZW0GJ1ehpTHEaVb3g=": "952183000000", - "LHUhY-bv1oiUeARmHdXSTPFo7gsgxXMViOzFePdFdUE=": "383204000000", - "LHWT3Luheki0qxUdYiGhJuK0srwNCSYXHKQ4VM1thpQ=": "384615000000", - "LHr5fQ0UVujn5CJU28Yr5cj-bOGIsjZ5kIb3LkUT8JY=": "874765000000", - "LIGGC14jMBVJHekm3rrSOw5ZU1eeq5n7aA_8stMMOf4=": "462687000000", - "LIOzjdXbz7C0-Y5sYD5mQltVwBIkS8v3GEFruoYVegc=": "3741282000000", - "LIXaifBiSYpy52n6nSGJ3mFTXGEV8d0QbjevZD6GKoU=": "385500000000", - "LIZj-CDL_0vnA0xDnm-d6WiFwJYBI4XqOid62hDjvSs=": "385506000000", - "LIaVzvgql2ld9fNDu6VhdFYMb_90vBxypHDDixSHwK4=": "764026000000", - "LIxtq0xYIZJRx1DKGQWoNT3fQ31AiZWyknqmqWxb8qI=": "4705862000000", - "LJE-EGWZd83xd7pev5INYLU8YGZ4He1xif8R96hBwTM=": "999209000000", - "LJGPxPfQBG5w46vJa-AQ3mm18gD6B3LxrPNPAsBLkhY=": "3978718000000", - "LJbY3YWf60yZjYeBL8prE-YZWccDs6_7lGCcolNeIFQ=": "627808000000", - "LJux9W9OPQxKmVR2fdFORvMYQ28heoA9d9mHQbbUuSI=": "403850000000", - "LKCZugSkvdGPYlNQvtpjwbmOoB6selMwIpJxpIKILiM=": "769220000000", - "LKZf1y86hHrfjGl07AkDMe-Ef4LDbcEcLWCXvbCU1AY=": "385543000000", - "LL-7ZuCfUF1bJx4sWj5XmJrOt2GaypHxv8jZMevVvVI=": "5001474000000", - "LLAMUN1zj4SDQ1tf-xYdYx_w-PYctIeH8ChJh0J6AOI=": "384615000000", - "LLJFWKyIljccEseEp-ZCb1doYq5rF-svJbh4jPrlS4Q=": "384127000000", - "LMCaNxxfLkU3QZH7g6EzUFLvXuszqa-FC-9EyYb16Z4=": "1999999000000", - "LMrEOqJIMv5uV90WQ3LsrKR_TRE-UhQAK44nzl6a0U8=": "1923076000000", - "LNElmYBz0JnLEVFnqGUlzS0SePQYOjkGuuZtplrXuqU=": "454545000000", - "LNLsROUjI-jwh45NKZdfPJYhoQinQ6YOl1mDJPmqhsA=": "385614000000", - "LNOiUvxcxIFZuWP0ZoPk-Oc-nH5xDI_8q3OJhEtWae0=": "390437000000", - "LNs6662TMtlG3-knzPn1i0dReG6CW474__nYIlnoQ_4=": "384615000000", - "LO1Ln0lkMy6heQnhqoMjhHOP9_K2_V2txg8sOAV3kWs=": "694056000000", - "LOZUpKFNHvdI4CHxNxWV4KTTSTGFi-Yxkv1QDo1X4jQ=": "1155259000000", - "LPOPtG0vU8qp46ZLPQ0YNJYfoW1BpgMrkvEYNx1SgqY=": "3783416000000", - "LQET1lC8cTfffCMYNQ3C36awgRT7mSWCyJx0_rWKYNQ=": "460408000000", - "LQM63cOkg5ICWhO1bzO42iQJo8t5--ayssykJUo8tP8=": "1138034000000", - "LQP0xDUAP-ttnAbBXGNhU0ubM49NMskzCKLpvQ6ffKc=": "991445000000", - "LRMa3qmyqbj8xH2H0d8OqaNAiWb9dOiE4dNHhmNbRqI=": "2307692000000", - "LRnn3LeTqfeiDDFi17VtcfYn4D06TmoZr1V2a5pFDAQ=": "385507000000", - "LS0tXqta-Iia64nE9ThFbC1vToQtxp8cDhaeFPpbxyw=": "908798000000", - "LSIUWG7v5uwlExPjtTah97ULSzCcf7urKYxxMsim2_w=": "601993000000", - "LSxL3LjwnuSp6o-VmjccwjMeIa1UVgrrcgyPx5TdXug=": "4125716000000", - "LU0hax9O94DVsdXzNW3B1dL9G7R7QqpJuNElpj1YdBg=": "384615000000", - "LUbyuxIVaPqtck1R4dksdmKptUlyj6VxhCsGBbrA9UI=": "418855000000", - "LVQAXKJe4fu-ZhwWzeczVZAqsZEv2-_yFMK-uJEksmo=": "1729341000000", - "LVXR2uefj5X8AQ7NiWrX9_42noRiXWS-fUy4XoADE6o=": "457090000000", - "LVeMKZNM9owbXr_8_X_sSqu6hM5qJ2PMXn86ocHWjP4=": "12831666000000", - "LVg_RpB5CWpCYd9KzBpZI7fh6Gf5QDme4Hk0j5FM3KQ=": "1366800000000", - "LVpvo2T3RqSGQgGDKYwi9-N2suMeofKlQ-2uPTYSGbo=": "384615000000", - "LVyOBU2c69tkbTD6ZszrcHlWGSGzeAcUK2t0hjACscY=": "374830000000", - "LWCI-i7tqYf_HslaGgm_-8SDz7uzQOmAXcsb1H4Sm60=": "384615000000", - "LWNyJCA2fmVe4ZCPUlJF4aADes1thqnyuENuRTeO0W0=": "379260000000", - "LWYl_wFwgT7_MdIOF-yet40Fa2oDGWyDJgasmPnaIT8=": "377468000000", - "LWZEjzvBGQiZQLmD8Nvk7UhH42c6_GhHCPDmaWpOV7k=": "1156520000000", - "LWzeT4DMrzkSHdUs5YypZMlIoLK3ftGmS42xmTXxKtY=": "2066100000000", - "LX3kmTytSVcmzgUKw0u5SD1DF_OjlHa58of8l9omJmU=": "384615000000", - "LXKeLZE7iA4chnDQfnA3H5h5nFGPgUmNfzAy-ZOGSys=": "1954545000000", - "LYQlreSDStwsKWH2DtchKr9iEmnoBRMFxAuWE1vYdjM=": "2105796000000", - "LYUppaMa3tR6L2lNKmItUp2-e-cZdRJvXPzd4nkAzf4=": "1156517000000", - "LYnkbhEeKrtrXjromN-X4RagKTmieEj7eozrVH0cJ8s=": "8333478000000", - "LZD_U2OO6K_sCnv72TtfXOSqeZ0xUwqquTrN7QuDXkY=": "2081900000000", - "LZwBxRcH70tpmjmEp-0Hmo7m0lc5qY7D0cvQZzI0rJI=": "1917704000000", - "L_4Vlzu3aBXIIg4Km4IW5zHXRwYZyyBULc7E6Uk9DQ0=": "754069000000", - "L_BgwU1TC0Zr9uyfTC7TyFimccahi1RG_7vCCvh5YJo=": "464300000000", - "L_GAikZhrc3YyGX6w_W1PFYSYuYoDivU7gkAnC3AGiw=": "469944000000", - "L_GuOtT9wJx1xE4d7pGIqcjxAMREf0kXRU0eNnOANcU=": "9544996000000", - "L_VhxNNjO1bBPkPTRXal8a2GJ2WcV4M59iiZC1wF0fc=": "395545000000", - "L_gkAY5bp5L8s4y79dMlWth8RibzTaPyzNBTQS_egIc=": "416666000000", - "L_q4nTEpcx0OMGiDlIsZCNxT9HfHqldCUsKb2HuqtQA=": "576725000000", - "La9pbjgi0mZ842qJO-d4JygbRu3QzsElchF5cr1OiiM=": "411085000000", - "LaEvJPmyxXxoIVibrRUv-oFctkjrhXAvi4WzJyYZP0o=": "457641000000", - "LaIHCpjI1F27qp_oqAmOeyJxVVmFG-LXCHZcqO9XtLg=": "2478561000000", - "Lb8ETaKSVZr-ipY51bwAg40qT3koxeuBv3UH5RQxZLc=": "473848000000", - "LbFpYZ1CEdh7wRZ7kko8cgiXLc5MWv241ftb9xsiFNE=": "499256000000", - "Lba4PQFHbeNZ-rfpLL8nXZoxXik4exnR67OAgTNLNOk=": "491847000000", - "Lbom-f5n9mu-fT8HrVaZEC9Ve7xgP_4HTNc9aeyaEQc=": "417643000000", - "Lbxuv8JLUifXKrajjmEiCyvEJ7v-cFwfKJ-n-ITrw4Y=": "892610000000", - "Lc2jbw98Cfj0qCXpxSU024Kcd7QX7gor2uKl-KOGcPI=": "379122000000", - "LcEiFQvJkSSoR8hvbxFDGaW0IvtKeBQIc3SYjh47CME=": "1964761000000", - "LcGuE_gtwc1xbMlzYShkXl-WlyYuu10KPDlXqUPuSwY=": "461154000000", - "Lcg1rO55XpJDdD1JknZ09NovgdWbVmCt1gwwPSSOqfI=": "1864361000000", - "LcoE-FnAFHTuUFrTezU8g_twqRQ4LkPpTwhPYdOnyTA=": "5517798000000", - "LcqCLwQjc6LDDDCqEYOxyAPEwcjwIrN37aaKB_EdbFY=": "2496630000000", - "LdCGqA9M-e_qvgeNrkKImRQM9YIpJnQNoLfBl0bXRhM=": "1368914000000", - "LdMzQsDlpIneN9KBVovL4m8deSYgaAAszYhMSqrDoh8=": "1250020000000", - "LdoagcD7RdNT2zajAPmqNPdW-hIEGchnwNQX_1Oan0o=": "732661000000", - "LdqwqOzvJLqYfhWiQQtT16InqpU6nJHvlGRCNP0pXmw=": "1999999000000", - "Lduc9mlmE9_LdGF74G3RXsLJy331HbHgG9Nl_2VAIg8=": "1153873000000", - "Le8xUNGg98tkTGJZrZ9OTcTIcLeiIDjPECbJpjn2JDI=": "763607000000", - "LeY5YMm__NxV4pcgvOX-PcZj3-qJBueGirHvw1PVAxQ=": "390037000000", - "LeaFg1ZP1rJqNdGVA7LklMTal4x-MW1eQhNYm8yhDOc=": "1217065000000", - "LfT6843HmBPicnExlMLcbQx1uyMzmSNwlMsKxeBTFdg=": "415817000000", - "LfhLYeY_gKGL4jFTwUBVuIHGE5TrMc04rfupSzJ0zCE=": "1923076000000", - "LfndX3clXTayDbUjrxncRUoPrW2S7DqPJOjvCgb7SkI=": "23588100000000", - "LgMWm-rMv2F5cHiZSVxsbVzoud6XcHNFy2JxO9kZtfY=": "471532000000", - "Lg_ZKuu2hKKFZ27KyBFzpmVM2JoZcJYYrl8daMjG9C0=": "30421226000000", - "LhS8p-1p5OZF0aKcGYFAWBQeQMQ1u-LGKk1VAkAp_XQ=": "1145066000000", - "Lh_BhmkeLmSq_W_g9TdE40VUNkw60mkZj5-JBwthTNA=": "3846153000000", - "LhoYumJm-42It3yLSNj7p17Px3iWkgHDfSOkDrkAvUE=": "462146000000", - "Li4jlFgnIYP7ZHhPx74hmxIUog09q7aSQ5DYuPQpEuw=": "419408000000", - "LibmBCAyqg7UvCtl6Mei_ip7-Fyb_tJgoT3VyaT3Z5E=": "544175000000", - "LimbPqy0ruC0ARh_kLJf3SmgbFYUuPyUZO_EZsgbIqg=": "407808000000", - "Lj1-M7UnetCiSdbm_0gtCkqqmrHPnW-2wJb3rf9Nn9g=": "383485000000", - "Lj_CXYYI-PsHE_zNTQv887qpjEGw5VndOsVdcHu1m0g=": "377384000000", - "LjfcIlLBZuH4oN9JSF3EtDY8231cleaxook2APJ1M9I=": "1249999000000", - "LjkQRtmz0TXgrWmDVKDGtEvk62CcLgWhCrko_C7l0xg=": "1346153000000", - "LkDi3w9ks-OyM5watlh5XY_WbGluyayrJvnOCzWewlU=": "416901000000", - "Lk_4UJwjxEWbhVPyymG4sDkd6tHNDjnC1PhBzJBq8yE=": "396485000000", - "LktDXNPcbHAXSteyCtF4i6qtwq1-pjBuJ1IwWVvdmrg=": "384615000000", - "LkwtMk_VGuTbgB72RCoXjk02fBCzso_ZqfUurSmwNcw=": "419858000000", - "Ll-ZXIJDbeZKlZ_gDSQE0YNCKV0eafjh00T1axgjUk4=": "926626000000", - "Ll0b10r0s04nLp5gZXcZQXkxKfIBf1KY9Ul6N6LssEc=": "416666000000", - "Ll1kTdvjb6ZdFlmAXdr_xITY1rmGOygvNVY0bK-QFc4=": "1481723000000", - "LlXPcFfjgOsshDJ5m3ZIXeGhkv2dc8grE02_NKT2G3c=": "772250000000", - "LlbOiY9Y1JKtgzkJnnMntbVcAPZmWhojUSUFF6yrHLQ=": "1151841000000", - "LlcRjYnHSE2aTAhXs6RcuOptsbvSJcJeJhySI6KMqBY=": "453003000000", - "Lm4L7LtjHwP39motM6youzGYzsySoSv9IvCU8cW-Jcc=": "762357000000", - "Lm54Mzs3R1w-lqgYkiykSN1_nQf929C867o1kbFfHPU=": "416666000000", - "Lm5kj1Cy1Fwg_NZvWj1ki-C9BkkOuWE9WbnE1q9A0Ew=": "384615000000", - "Lm8XH7EB2Jyadmw8ypzAAZyGuVuJjt7lu94fYvdiTgE=": "1133078000000", - "LmGee7uLzsaHMc1qqYhwG09SnBpKcfAVYwiMg-sTMoc=": "394920000000", - "LmIHrRIx5fRl7NO2ZZl_IJ_VLhcBXPr1_4U0CXuVngY=": "445221000000", - "LmY_qx2CCdcXkkAvGAAeQG2JHVb6Z2H0w3xzeH09hs8=": "378510000000", - "Lm_epTMAFNIwtUYVupW7_y2GzWQiqyrnQcdzl_WInH0=": "3778454000000", - "LmpS7kMfY-Zr3dz46xSuzN7EGT0B4zZeORL1GdqsyjA=": "3214019000000", - "Lmr9KySpZ_NMK6oLCIZLyUuH0u3LMk4Qsd3fplxEe6M=": "597849000000", - "LmrQA7aTfTL44AhU4bf5kbmAxvYjCZOHeQElo1cEcPI=": "31830185000000", - "Ln-y7SocUO7bi0aOKusUlJOb2ndN3IrgxA7QFlIpE6Y=": "771545000000", - "Ln0yNPqw9BCfvpcl2e-oQyCbjcnBsQb_l3kT_x-bN-g=": "12540324000000", - "Ln70J4optuc5Eu0m5_YAKbNpMMKcq3K6Saj4lxmhMEI=": "846689000000", - "LnCDGz8JXrLkGFU0h7pTOieSi531GtdIkIFpM6_pUks=": "408128000000", - "LnVl7YwaTlprQ0wtjSvD4lVT0dujXxtzpdxxOLnZ35I=": "414900000000", - "LnehWSU7azjKkCnHPu0oKuq_Kr1WaFDqAqe7j41sLhQ=": "383327000000", - "Lnzs25hayRYsq3SdP8WDDPDUgtOCcaim8v-tsym45c8=": "5980679000000", - "LoLnmM2ThNiG4zlMDyhmxgwNWsrJWHqnlkmC4_iC_wU=": "1480210000000", - "LoZjFbKmslMadLaZm4qUOhi944PIpkrTlQ0Zv9wltng=": "2916654000000", - "LolNKXK9dmmz3urM6bWrUO7-U-q6y0fswrBC6FMbE5w=": "1971966000000", - "Lon4aDrj9LF18INJrJVZDahyIxEE3-E0n7YT1DxWsEM=": "1538461000000", - "LqEagH7nfN80hmVCDo6_ZgEjWQ5Jv3KM1lpjTztwRIc=": "4005161000000", - "LqI4G34OzM-OzmPI5ddr7uohd3dqYP1KJADqO-IzkgI=": "617574000000", - "Lr49X0gfCygVtfFVYl6ydndS4m8g2ci0bfTmoAmlW1s=": "411768000000", - "LrBllDwiuwVwVhXrThWQXEtixSMvj7dXmn1u8TFERYE=": "915299000000", - "LrRitSvJpLW0EgAIjcCbV2KV0sLr4NCWwr4xjLPJHK4=": "417532000000", - "Ls-jutoRcDu_85aYn92xocbvrvazuMtLLB9bzbARHoA=": "1818181000000", - "Lsx0zDXeb6PopuHaR4v26aj0zqDyUbs0sRBDk6LMJ_w=": "1076134000000", - "Lsyy-zptF3d2AC0TKvsWWSij4Jv5SbOal5TuAFZqF_Y=": "1162096000000", - "Lt6vk9nMFrbrAmncPhFu0qEs5NpCS7HCL0kypCy793s=": "15609474000000", - "LtNokDAIGoPBznOzo5lEo-AXDKe7Zlf_e9-ZsmkCExc=": "381802000000", - "LtbOw4bpQ9Pfo4ou3TFYpjDmb_E3Ui8_A_wIQhofyrg=": "2055996000000", - "LtcPD-VcFFOWMLOj_0GB2fFny2MdduXHDs3WocA2VyQ=": "421246000000", - "LtpFwvW7O458o2K9XpK37ZTnVyw4eFte3-n8MBeT5EE=": "454280000000", - "Lu5DBl-0rqAvK49iOb87TlfQW0xMmQCvb9_igouSuvI=": "847358000000", - "LuA0gnXnnInH1Js8DWdyazK0ApBKzBg3-6A86B-0O5U=": "411085000000", - "Luw-cWmlHmQHOf0WXMNU9JcQ0oHmRpDG8JsTQ1sPcck=": "4594475000000", - "Lv0iOW-_BbAZhRtyAmk5I_YcTVeqpjglcuMz_v5P2Vo=": "909090000000", - "Lv2a0lFORHV6lfdkWqIluquWMnuH-30zh51EMMgz_Go=": "468409000000", - "Lv6FbZsNUs9oJl4WlY8hyZVX-suwisKSwXyvS-qgViY=": "4166666000000", - "LvjS2OeD7e9THjbY1AewixSrlvCepD73HrkAhtP9HKM=": "384995000000", - "LvpXosiJUjhC31ZDUOav_naWM65eQtZTiOQMSgoACCI=": "1145321000000", - "LvvwZDyGz6lQ2I0IbWWqqtQ-QrnXxlnE99G9PjxRVA0=": "371139000000", - "LwD2Vo6Yfa0sHotZqYjlPoH50xVx5z4-rxpULHGJmf0=": "3949471000000", - "LwYNSbh8FLdPwpPOjrauYcLGj5tzzg-_FVB5BZQkMVg=": "7598572000000", - "LwhAe2SEXVstTor_a40EyPkhq3DHHyIBax4nqYtqF2U=": "768095000000", - "LwswUUqieT4ap4fu02gGmRHWXrXnpqEcn-TEaz5dpPA=": "361111000000", - "Lx4QRXKrRSRXF1vO5TwDBZ_Y1pwpXZPB9n7ZVFO_2EY=": "418267000000", - "LxkT2Fwb8I75vheVn1qjwONFRLL-hEdYVUJ9DM4yQyw=": "3461538000000", - "LyScQ2vuYku2rpTF38VjABrERHYl3L3JfHSXWJFXezY=": "422442000000", - "Lz30-d4jMOAuiYVyw28MIKKl9cVoaMtt8GloVAKhFTc=": "1388621000000", - "Lz3fkQSwFSQZLp7jclN_5t5z5-lBI_n-wQAA8wKX3DA=": "385507000000", - "Lz4dTCDxMDxklNdt5UT-me3b925rHfvTcZ7t_nxXaeo=": "923076000000", - "LzPIn8nUOzffRP75hCtAd9M5EiQvii-PsKi0MOt_ATQ=": "416702000000", - "Lzhp4F7mmPkqcsKckQbj4rCro6DIiPl1T77T77mxmEg=": "384217000000", - "LziqPCInaj4vWTx9rtUrivrmQWjv7V5TlY4WwBiuQuw=": "446308000000", - "M-qeytbwPACk_iV0OPI3XUA3l13LjGnsV1tAS3XSuUs=": "3269230000000", - "M0GEcDpyexg22a5DfBB7vnUklrHflrJ6XKoNknjy8CA=": "41380876000000", - "M0PQ6MBpR5mTckprhiPOlDAzdU_O3F1h90C12zoLBTY=": "384615000000", - "M0RarDeHm6XJP_6zwUPJmLtojNJ0d58eZZWx6u0ZfAc=": "3969319000000", - "M0XNKQvGvaWM3Y-dDmOYxcLSp6MtIyoOt_kHlwVsucQ=": "1998608000000", - "M0xSxQeJOcyHfmYQVDBydV-fALFPgiEXTx_YK3akGKs=": "925700000000", - "M14VClJ1SW4LjtkIV6MsUL2Ibi_Jeh9JayyzV8jrjN4=": "384897000000", - "M1F03hQRemKkhmWH8f321yZ64KIiWMupaDzdO_0ewQ0=": "2346153000000", - "M1fI-etrftZYgcgHRhtSdbrIpwBmNW3r9Hq9C5mAx8g=": "384659000000", - "M1fZptaXFOEPM-hnCKmsEZlVmihJGlkFgo08t7ocsZc=": "1520514000000", - "M1h2sD3BArceGwWJp9NLhLude0tSdAplYmgcBE9Fwe0=": "497000000000", - "M1k0o20lBWCPjRE7SzjxlqaRbH9_1K3TmYUVFfr1CTM=": "387856000000", - "M2Fndeuhb0labrgm2MKVXVYGGOGt4WWO_u2wdGOWj7E=": "4044787000000", - "M2JnL_GRgSVhieHuclm3lG54NF9Z762YL1mKWweGzIU=": "832329000000", - "M2Lzp5e4AFt5rrl1C_d6_ayyYMoJ6VWrzCbqKN2uPVc=": "1258824000000", - "M2wrSxz_b7i3RdtpOHxwEjcRTF9llMfC9g4Ek4xFDjc=": "388046000000", - "M3cfd7ZUsQA8y_yW2Xfhd-d_QRd5-knzenYAq8GHdAI=": "457736000000", - "M3uHqDYp6eJ1091s5GXZWPx7VU5B57a1i-bSSKTefzo=": "4116070000000", - "M4VctQoD_EqotzlIxybnQ7j8gHLQurkVIVf80HCwYh8=": "585762000000", - "M5A5n1tFKusCLc89D403Q6uTi6Fmi6jlh-AXhX3TP_8=": "463022000000", - "M5Ca8rBy4M85Vv99y_QaC9B2OHeDzADtslPrfszHjbs=": "1154683000000", - "M5J8slap1h-pX7tsFPpL91Ri7zyNaD47K_ObQ9gpfOA=": "417537000000", - "M5pDXE76cH7vTWk1R6eX5ai7x167WNWFn9hnnlJn0OA=": "771504000000", - "M64xCBwVqC7XPvHnJ37nNMDpcSAlJjguCO8LAViz8g0=": "424673000000", - "M6ZQzuHfTQ10K3DiSUPQ-_1tbvoT7JJ-ZdqZXaWilv8=": "376125000000", - "M6iaJCWOpEX2bPIgiAbZmusnqUsVSDRA27fv8mjhgxo=": "3897184000000", - "M6wpV_UjtG1QBW8mAPL4dbkhnuI2334XOSJ9ki61wIg=": "422561000000", - "M73xcRP_hDdMacphLVqqG-hog9W_6It-5Jn2B7e3cfs=": "385509000000", - "M7E64UAX4Cvlx1nTPR_nsMSCOulFsnmk1-NfdiJOE_0=": "384176000000", - "M7P7Pp4WMvIxl40tXk9RexNmHclfrJF7LzbduCEMN8o=": "575314000000", - "M7cTSHc1iK4_n0_eXWDzZy-QgST_4kPY68OrgkqBms0=": "2055429000000", - "M7mEs4Vmcv2k6FAZ2CJ5TPXX7_7SNbE_MCW02kBk508=": "385506000000", - "M7wIcVvXf_FX6A8qOp9FgD74ggcyPqUkEJl0mAaY56I=": "4166666000000", - "M8I9MwtIRexLvsgjYoMDYQRKJ05LsQf3SrH591UYB9A=": "2032018000000", - "M8Ik6BUeoDoeAcyTIPNJjLtpH_T0YQACM9AGnPR3sXo=": "470447000000", - "M8OjPs8OluNBHeTprzqbrFnIp0MQy1ds0LvTmBeXRZM=": "462839000000", - "M8myfTNBXmTHzQKrz3JirT1H6crJH5Ita2WbZZvojVc=": "708353000000", - "M8o9jGdgY4sMUaoDLe0zyRS-tN9C1maemU99vB6up1Q=": "926541000000", - "M9EKQzxN_vi4Q_i67UKx81NII4fMVlwrmj0ocAbUaAE=": "379329000000", - "M9Tfg6dH4WluPHBNVJt6scgp_rywkW6PJevvkskoiWM=": "656536000000", - "M9qpAkt0Tuql-jzRNrARHX3nStd-skYtfYBQLXnuNOw=": "1936759000000", - "MA11lebCvCOeOni7sF2AXw02GA2HeGMytaToyVLWihM=": "385510000000", - "MAekJw07XmyxnZqD7CgVtmyx43y48k-mrMriQlGbWAA=": "452618000000", - "MAl9dsLnO1rpbbNWy7DSBJaoFITBwMVnhNRVd7NMRvM=": "1216806000000", - "MAzqtK-FiwSlOLjsMNPu-0xZPBVd0l5sCG1ou_ZpcnI=": "2271161000000", - "MB4Dovwi5P3MYDnIlvQlPavUgmyhPeujkhyeeIxbXi4=": "422569000000", - "MBMaygou2-i3uD-oguo3yFGco3d35J0pyGqhpm71oHY=": "383974000000", - "MCCYmtsU1q735AqYuXhctmMsBBnsKDSBUK8ThohQBsI=": "2690159000000", - "MCOKPQQ-_5BN7f-LAa77hD8HhOacSM76o1kHc_JwVoQ=": "447570000000", - "MCWuTrN7DZm5Ygu-S55uJG64o0a2j4fFWgUqNf6W2_w=": "426875000000", - "MCebgep1WmVhm8-LQZH97JhR-q0hggTS-dDG3mgp63Q=": "385458000000", - "MCoFh3rRLOylDMV86InHYNYhxgwOvpgYM8pWB4uvK2A=": "1999999000000", - "MCrIWngR-myK8S9MkfHu7-7feTc-aaEVInR1FVJNols=": "1631179000000", - "MCsrds0CERIsF_gFnO6-ysNQarMvoPaEVmSASbM9GvM=": "767319000000", - "MCzbBx35mKzaartSYSeDKbAQkloIYEh3bYO19ElUK6o=": "456915000000", - "MD75s3CbhwiOw4M2L-zjjhV2HofJblIgh7KmfFDY8YU=": "417635000000", - "MDeTs5s1oMFXNvfHr712r_FOkeUoaI3okpnlYRveyZg=": "387233000000", - "MDh7xYI7dqtSqeBm6dlgCv9rBy7cLG5zDJFOQVkrzvg=": "467397000000", - "MDpn9urpwfcUkOD_RG-iDCqPi3bEtDcmNyj9yub7Zyc=": "2017632000000", - "MDu-1iYwMEDU4kTM9PPuLSH4a9DWU9Mgp-m7sGvlklU=": "469152000000", - "ME3FEiG3byZTz1qByoJEZ3c8Bbb2j7VyV7aLA4LL38k=": "2307692000000", - "MG4Pk7hcTGsh0DoSIifN6w5e1Z1Oh9F89GIwJKq0f5Y=": "914491000000", - "MGLZ7pd8_Ov1cIvG1QQo7S3k8D-ItJ93_spaon4dERM=": "1047135000000", - "MGVrgYAlgt9hoc6MPsR8Mtt5O9fU9v3yy7sGibzTSVw=": "455901000000", - "MHVwzkllgROtMzDLppb5EgrXoVuf-KpuJeUBZ2Wbx-E=": "500070000000", - "MHX4cEDVhkKKQiAO-v0nbe1tb-9qb71qh-ZQX7nsYGI=": "385510000000", - "MHuNko8RnS7QdaDLalzLIwFaYb0a2I-5cmR2uCJPqoQ=": "381802000000", - "MIcX49-azjCJ5whA-WU2EZCtw2SoP7hDlt0UASvMYzE=": "769230000000", - "MIxg0WhaSvPpl3Xn3Z2qqHUy8ah_MuYOlMcEazX9deM=": "1153846000000", - "MJCqT_AP6xWYMY4z_YVTD30VFhqpf17uGwuKF3GaHMU=": "810236000000", - "MJKTdN8BLD9Fj_l-DiY-mmbWnawInA56-c3DFmE_Jec=": "385510000000", - "MK7-acsWWTWeHF1sf9gmce5r-RnmY6whpme4LKuetOo=": "2528271000000", - "MKGd4VUhHCK5CuZ46noE7BSMViHI2XwBp8TCjEYkEx0=": "426338000000", - "MKRZ-ZZ2PiRIsbje_jWIxaVSTCuoes_UOj5KKmjT26k=": "463103000000", - "MKhkW-JT_UUc2aJ2qpESxqj_1IgYtyfHaNHUmWWjg3Y=": "384604000000", - "MKl8cKNm_yj_XW6kUYzg0Rtpb__U5_dDs-Rd_asDL7E=": "589857000000", - "MLfLhH6RetgMOPFwIsZHSdL8S0JLsrbj567HJ1yn__U=": "1923076000000", - "MMLabYuiURwHgCI-c2X21AjJ7xWKtQ4YvStFRRCFABM=": "1538461000000", - "MMV-70hhQ5U5xA4eIclu_dEH1XQFQGG_zZ044O84qGI=": "1997972000000", - "MMjtryCjCoOkWFi28zWqRSmHTSZ4F2mTwzUPtdR1Gt4=": "2083333000000", - "MMn2tRvAchItACPow0F89nJ0wuBAjbxkXnygnLIWm7M=": "500274000000", - "MMnRa2uHsrzuU23HrILm7peuoZYCFo7LcVFGnyRFSmo=": "453042000000", - "MNKb73g25V_p5QQZK6KyUAwSz5jrdCML8AJkNncndRA=": "462146000000", - "MNdZLnWLLnlAbS_30XOZjrJlZHrQ2l5WfMhTQd5tWvg=": "767487000000", - "MNpMuvl7KGJQ4qIkSNDja3PTuu2tntCdthSItGNYF9o=": "1542290000000", - "MOCOzmaRxxNmsdVXMl70ISBS3F8nbl4dQ0maxlfa7LA=": "3334016000000", - "MOh1kMrW5uDXrrMbqUGPq4DADiGBmi7ktbJNoVXKjNg=": "2305133000000", - "MOlTIR67kihbwoAsvZJ061UBi2kC0t_IAStWt-PPfHk=": "383158000000", - "MPBABNGbtLrvMFdF2arWy3Y0dReBCTkbVYq3xjkRmzA=": "384615000000", - "MPZr1XesAef5jgn21LQDp6wZaalCiYGT732UFEcClds=": "769230000000", - "MQ3GkU6s_TraOAEwWjY06m52u8B7Pu83anfRI8Cilq0=": "467517000000", - "MQ8udTqIukhcJyudmR9yo19dF0ypNtwAL8aS83Oy1g4=": "4166638000000", - "MQhR3lT-fmNdGsRC8Idz0G_VnOktrSpJk764Bp55J1Y=": "2743534000000", - "MQnQ-QI4zpuPohD-IGv1LjtswdU3IGXMYz8Oe7_hALY=": "576923000000", - "MQzG1OvUmrtrXcAEE5JSp9Ov_fIMNBrjyJ7v3M_Rhng=": "3846153000000", - "MR5FV-Spod4I6H1SJCU-aYVeuAmGXz81-qtiX6FcINI=": "998371000000", - "MRJji47obsLGFkq-CZxxC-sKiMZzPN-0npgxylrrPWg=": "378880000000", - "MRpbGS88HLTn6AQOvIS47Btycj7vb2Sr1-1E8e1zKT0=": "405030000000", - "MS8_hYODPYrzTmppk2f8j7XC0PagjwdeMRFQVoeumtc=": "1927554000000", - "MSjqcFHts4e_U-bmqpmqpm0B7DHsjR-BiDnR_ptShC8=": "411768000000", - "MTKrsse7XY4dzz4GetGWVXPhpL8ju1BM2kYTuKdR47g=": "4246727000000", - "MU01LXsvsCzFPiYO8ewSb368PVezi_2lE7zoQM2Uur4=": "1538461000000", - "MU1jn9k_7p2L-WauD9HS8khoz8F_Gi0_CA-PaSHzqCA=": "6219730000000", - "MV-WeNvOpH8qvlBvdZUhZW7QZBP8fCHwFb85JUS-f0M=": "1249999000000", - "MV8hlpMjKrvXYMwWi2f7Km8t6aXTnqt3gbN5dM_hVu8=": "1666666000000", - "MVMgaQEjy1VWe1lh1z6K-QW2CXyfE0ofOgi4JHmbcDI=": "1241159000000", - "MVQ14artiT9Zs3lBzyVrvuAsHGmVZSJ_UWEeOxZrymE=": "384615000000", - "MVue4HeoJPOYAQbZd2XujoFDxruSgY2KCVhd99J6f44=": "2213262000000", - "MWBBezMCcy5S_Dmfrou4Ze3P3RdDDGNZ5xuI87Rbmn0=": "829261000000", - "MWEqbERC4WViAcLzaC1KXcciggg9fBzOaj4lHeUv6vg=": "1970805000000", - "MWW7DUAKG4Ls7wpq384YXjpHvHR6UqN2uCpA8j69EyE=": "421193000000", - "MWY8RORPyRx4wXzeTYiFq1OuI_NOA729uZOTDRkGTdw=": "565461000000", - "MWeCkmblmz9IyIrr8PVIZdBW4BQegrxcN8puHFaHnSE=": "384996000000", - "MWiBChjSCjnC_oZo4-SczUNw1eQvG-gxlisNDInXulE=": "460759000000", - "MXQ961gXm9PZRULUgTCiQnSZE7Nf7TUlUZltxBAktAY=": "2371003000000", - "MXoFokuV3pyTv2AZgFVBl-IqhLkCYV3jMqLGkCMDZ3k=": "5553258000000", - "MYQuwKKGlyTpzOiGJDDCYr_232aBldD2_xLW3RiJRyQ=": "384615000000", - "MYnlUAlbXSpKK64I-c3SxGsLQgSIAsMd_UZeebfdV1Y=": "1153846000000", - "MZ14if__ch-qd7OjrGAxwXdVRTVaTNCCULzuY9xMiIk=": "10704106000000", - "MZHzPFGFwIDkSaQtIazhJRpYaJpumll008rVPjfaah0=": "6153846000000", - "MZz2PTYYCYj2BfjbIfaLY1b0vLxPA2JvAu28WHyhzZM=": "377887000000", - "M_5XpLTfv-OIKeSi_UVDuOMQ0yebVDsTGCFxwBH-4OI=": "385506000000", - "M_Luz98UzU402QvkCpmSPyp-LH1prhzUF4W5VQKpsXk=": "558321000000", - "M_lEFsjCOA3wwZ2Q5v0rNRAwbtnBx0Xb7-HTC-02tqc=": "544598000000", - "M_m31vK32vHCtODRcw530SNwo1LrIZ3Ca8OX9SSYyS4=": "462146000000", - "Ma8nS3XG6NARGTO6da-grfQUNIaNIgQngrmIAL9flY0=": "1153846000000", - "MaQGc0Qpu6rtw8cxsBdbYAZaVHZPfYoSJHYa4tVPSBI=": "1921659000000", - "MaSu_JKENBX6KFDcWhCLohKnVAcfy0YXTSTNygy6m9A=": "2300127000000", - "MaY62EH_eZ5HDIBUL5AlucFaUTqH306ClQ55XtrWuko=": "384618000000", - "MahciuEJEuKvEE9pqdO6yKE_0cVwDZhdEf7MY9lYobk=": "2499999000000", - "MapPuQ5-G-W8m_wiNON6eLn4PLYPrPHP9gkmN-oWp0I=": "404440000000", - "Mb14Qs-CIEjWLWfCjnG6nXxqvV5mYXJlWrHDhYLGkYI=": "3253909000000", - "MbGvPD-z5kzChWNHjnXWf7VzL9pLQCtiCbJ1eBsLmGs=": "4520695000000", - "MbNoWAfJz1kxPfxQKenxUc2UrvEU64SiS_iQPwkpblc=": "4166673000000", - "MbU5JQkpT9TUa1_vpO__itScgY-07p4UDB6tWmmpP5s=": "406820000000", - "Mbu4_zdK_WZ1NdtVqWTPpLiJaJRJUDbqYfFrfT5ddTs=": "400250000000", - "McBlS7WJAGx7e6X89XQz-8Y_NGN1y3Qvq9gEXozQfuE=": "454545000000", - "McsFNhsb2LdEpuvwBz2nUOtdlIkRQOjTibEgcya6Rbg=": "376747000000", - "MdFigxeL3TiZ_xHdKWI1dYGv5UlC40JxjvyIaQGKGF4=": "1005656000000", - "MdOf9MQc7B6stSNSynxObU_YK5SxkCZHztmguLb6Rds=": "453801000000", - "Mdc0lOq95YIWvpjLows80fcZ8OvRxMKs4RjhFj0eKOg=": "3846153000000", - "MdeV7ZS80JIBz7gUmCPP5ICrOcnU0stbYzA6rEOEXk4=": "832966000000", - "Mdn1_gfpeLG7QXHqwL_1tP8QGiZR2hRSv2-u8scvE88=": "383601000000", - "MeD5hj8Vdh9sLbzZCX6wSysKjGjd6Og6Q-fYWPoMFk4=": "462638000000", - "MeGV0Ssae4dCbT9mXDdsO3ZrptKK4rI-Gu81LbwBTOs=": "384615000000", - "MehuE7PKbJgcmMyaRb5jSTKU4PORiq4KXMcVm75DpX4=": "1723270000000", - "Mf2tEIAFyfNZ3w6HQWHB8_V6zR5dQr-GfCzxj_wgHyA=": "385510000000", - "MfF_k8lUrsQMMp7SpwBDvCcblXf9LyALcClTzfeaE5s=": "3962018000000", - "MfPbZdhycEOuPbKkMoa3eJq6Qhx0KPnlpNBZlRTfQqo=": "942578000000", - "MfxLKTDXjZWBe5nv2FIWYq6IS3Ur1liIHdfVhU-96sg=": "454116000000", - "Mgg0b37QNJ8Azu4yriTrc9RZ2pbgBM3Lettgjncqk1g=": "418865000000", - "Mh-yPc0yVYVUbx3hzC4h5o09Juc5bR5y074cw99zAxE=": "450738000000", - "MhNw4XI39zYEvlS7N-5cRq7TUwU6ZLnte7mmNaKZnm0=": "3641740000000", - "MhP4RMVT3d528PRUy3YxpWQZSRJa8IGtMXL5OUYvVp8=": "1250703000000", - "MiLNQqLaZy7_aNsuZ6ABVIU0CpJphYObPDUis9aagjg=": "455980000000", - "MiNQOiN7979exSfymO0nWf0Dqc4qu6uvF5LsNJahAAw=": "999999000000", - "MiYw_8LQqURR88LMPDaBirqwl1dz2oGFJqEVyOFgaGY=": "769230000000", - "MiZ8BPUmYVirgbzcgv7iV6Fan_g1BMrWDFHs-FPFqMg=": "400988000000", - "MikhX9j6gaMp6aB365LolFovXJIs01GzYlGAnATg-QM=": "473001000000", - "Mj2xrk3zkKwivEQvRZuFyluOGoLHwXjscLpZvLewsbQ=": "501144000000", - "Mk1FJ7nhnUwZ7ppa8AkoPd_zOf6Ol_1Vj9Vyco5rzio=": "384248000000", - "Mk67PcOzt3R4E5YSPW9wC99vuocI3TKNMmlPsT0OyR0=": "763672000000", - "MkeB6EF7AZ2C0szGE5JCYHFZDfyRKhBQMppbvdVkZtw=": "455261000000", - "Ml9mqnuK9u9VS21YD07E0mtzJNqKnYa6qllplQzjux8=": "447044000000", - "MlL45YjrQQ-snTz8n2feMVRXawwINe2vm3X_yCWyL1s=": "2307755000000", - "Mld9pT0BKE76EX7DRBqE7ipkeHyM959km-SoR6d8Rts=": "6041640000000", - "MlkMCg0uWh3d4MImxx1NbyWNVZ4wqCrunwTw-1gnhQU=": "2323501000000", - "MmK6EWlJOqmoc3MDe9fsL2xxfQnD_qF-u5RnEqbagjE=": "2565560000000", - "MmbklapY0shZYAXqB9O42-5He3ThYAQJ0DsAL6b8OxI=": "5384615000000", - "MmiIYXjsqGdDp6jdgqWeXIkklEVeNsNONT5CRh29cuI=": "4179751000000", - "MoBVUzj-_hFafr-b2jY4d-Faj1DvkPhhlVkWegxZavI=": "1478428000000", - "MpAaLWWqJGXo_WfFOUN7nCHA0Qu7XIgiYW6XINBZXN8=": "4230769000000", - "MpINi-n0PPhQXloFU6IWHZ8Xlc4zgJ8fU_o6rhBKvZs=": "385508000000", - "MpngsHkUfA511BGkLolYP55XnsjeDQS7tQVZF5KAiVI=": "448027000000", - "MqHRHnVHDqtNV__B9iRxYD_y142ofsoXcHAXW9ma0EI=": "456529000000", - "MqssR_RMC1iiBNH5riyahXhFSXtkJepBg61WuBbsFeQ=": "1378190000000", - "MrCUj1j9w6_Z3xflkM5LtRc5WA_-gBPonKPwDNZq33A=": "972231000000", - "MrQhtxbS9cFMhX_fl6NNH_TI3xN4ObauKwQLDubSHNU=": "906221000000", - "Mrp_kwMO9n5XoihMBr6_M_Qkn0I9Q7utOX17btbr1E0=": "2026136000000", - "Mt5OAVqAawP-OTAQjqnMVQWrqKTz-t0Td3XcmNT00OQ=": "411085000000", - "Mt6dZ_rszOC3JM6icUVLfUovHi7AEfu-XfFPRgh5OGQ=": "378717000000", - "MtBe_JOGkgPt_AB_ezYeJM3LF_ZQVf3vhP4xES3cJEg=": "1620910000000", - "MtEDKobUs8YBUh_pIlR1rBnEbwhH3sf6MOk1Q9tBjNQ=": "454138000000", - "MtcA_rBa8MXyLalEBbox5Uo8d3u1UZLIAHyTcvg8E3Q=": "456193000000", - "Mu0BbzEX4MmKkLcSfsHRXa55O94MoJA7ho45o3knRCA=": "2916362000000", - "MuCV5Ec3qf0C666dJ20vv6vRk-NpwDXt3VOAmqC2XGY=": "379260000000", - "MuPlj5rn0tSeEbZrN2iI8ENiyBCQTrMSJ2de5maVhI8=": "43339829000000", - "Mutep7fz4IHpNS1eHXnQRPJOmciz9ql1QJF9IAt4XBY=": "781381495000000", - "MuzA_ByXGhtn4DSF_IJpPz1wQN9rkTExalvIWTYFPuI=": "769230000000", - "MvVwtDrtEZl90a7xHgmGhwTaHMshbwcXGXlqO1J9hB0=": "410252000000", - "MvsJHQWe334GjBQ1PGY768lWrY7jV0sVCM6thqz5e9c=": "384615000000", - "Mw11qiB7Ze4eg7PyArwJkdJc66X95dKe4BjVQkoMtjc=": "455600000000", - "Mw9WytWVToZhP6bG3s_yX4Sbs01whVCGRLp2nvBiHi8=": "692307000000", - "MwNh3AxNCxNkDt1kdoo1y9fFxWscMfUsiP7du-dLzrc=": "1207455000000", - "MwVAtoFhqihEPIs-7THaEdA5nj25X5Jja9daFFPm7lM=": "1249999000000", - "MxB8neoK9Hd0FjrSRbiCRRK5luRlxjTjC0q7jBLz-pQ=": "460483000000", - "MxMqZd-_AS6P549pCTZQHe9u9DqAlyxGpcbvfnkN_3I=": "2695757000000", - "MxQoGmu0Ln5ZCPfz4Qasup1pEemJJyqy9a0bH28_eYY=": "2065000000000", - "MxbH0uVEkmpsBBzZeyofvy79a5kfmO0bmozmbkXer-s=": "1995381000000", - "MxgiIO4RAH9T1qdvRGA9YG6WYkjNo2qS6fb29H9on-E=": "460816000000", - "MxlTORr-graLY2tHPnLwHI73laO_pOhmCRLUmo3SOOc=": "457027000000", - "Mxw6KPxI1McJkWHRI0QZqV5311rrvMwVWo0ZX1DzYcA=": "3846153000000", - "Myo7bgXkGZcgDcNFbSOFYnI5SlqCeaKB813NdmekRNI=": "1153846000000", - "Myp31sAPrcXT9hrNfr6P565EKa6myaCaHF-Mki17a7c=": "604086000000", - "MyznASw8yWD5cGJ7PFCDDRD4e5A4HdcbUEi_94UEtXI=": "2088182000000", - "MzDd_OUL6wISAoc2Tj2tUj55L71-pehfum6s3FrL2-A=": "499999000000", - "MzcCutGaeQv55pDqoMlqKeJxuoWqpZSque8cONFS_wM=": "488462000000", - "N-DndZzOfadk-_TP7FbOP8hOs8-hO85j5E0QUfILmVA=": "1236262000000", - "N-Fhwc--8sdYQemK4YhdK-Q2d38DMTvoxqaeRhONwKE=": "416666000000", - "N-JJ98cz6D2GoBdll1LqPxBvAeItQv2YIAR9hcbu9zc=": "384615000000", - "N-UKbrmU0Rz8A80uLWUdtB4i0OAjHwEEKbNi9O2q34o=": "495740000000", - "N-_yq03hxiRjLPn7l1I8eoIoxy-NWrwe7fQShnTDH9k=": "379344000000", - "N-q9DA28CsrQ49-l67ot7g88kwg31S6DGA17j7AR1mA=": "455367000000", - "N0N8QNNYOweDLbCnb7b0-E_h9uEsIAOTbaFQWDmUX8o=": "16660133000000", - "N0QrwwmxupzXOXrYrZFO1Bm7dspTjRZXUEB-2gno9FQ=": "384615000000", - "N1E6zVpjsafuS2A4XN_53NN2w7Xg0MNIZGyH7QaMt_4=": "909090000000", - "N1GJppKEB1tpO_3IcJsiPV97yFSBu312dO4FS8QtVPc=": "415231000000", - "N1GYUv3lOTNhtGM8VbSorT5cLCBq0nFOuGaifV52Lk0=": "387280000000", - "N1us1tT_7_4x0fuW1WZvoPFUki2PGYsj3Nr_Ig_2X4o=": "391885000000", - "N22pmIqspTmSX6U7afLxr9Dl90B6N8MX9d9dJdACGow=": "5391834000000", - "N28xJXlJ4Jq7Ex83DNhbUFO5lQJPyULx2prvXh6ZhOg=": "3861978000000", - "N2J_X-cAi5OUfbudr4JkyC7UI1dpIY9hlxR9Cn5k5iM=": "1517650000000", - "N2gaCeZGCA5PuG4hx8Sf33DIsQl-TxK1HuddcH-UMV4=": "2088168000000", - "N2nMXaC4SbFEF08OgJvjsaZkUdTYv9yetmwyCCTG14Q=": "577089000000", - "N3OqymzG8OvLC_qLr0MFmuSmAC82K4U6uUNS5V4IGFA=": "16889531000000", - "N3vFUF1QrHhL2TfqOndTQ2twdorc9-a8wGbQllkF9yo=": "392385000000", - "N474EbswAR9WCMpDtoQAWhYFFWq9aPCz13WTAQ_PiaY=": "2482581000000", - "N4DWdRCaTVyupQRna2xFOdx2JOwtTy08mEipELMfuVs=": "5766272000000", - "N4GE3-a4olGZsZwDYg-MexIodOkXhgXLoPUuynpD6g0=": "4624898000000", - "N4WVSvfKUitlSjUT_FUxyxf0ER4UmOdAFBaZ57W7LU0=": "642211000000", - "N4YAOMA1FP0HaGJaM2iB92PpP-YN-fKg6EjCKodUJrM=": "462839000000", - "N4gEc06k_75wCGiJXHbGiKS7zCVFKLkwBTgSr1SdAq8=": "615384000000", - "N5CSOYZUPsgl3CCiw3llOGCYp_aQZxGY4gV5SStKTcA=": "407808000000", - "N5UpAk0UqNETqqvVGB6CDHwIdiLLgMhaw9U_388-bN0=": "1131929000000", - "N5ZpYX46MhY0unJOUGWqvPNpATGNSoPfXTjE-oAQUtQ=": "1550277000000", - "N5aEMCv-2IBhg5Ww01dWv-AnfE0Bp-A49c6rILOopwc=": "470605000000", - "N5pHeJ-bBPyF3PkL0-rCO9O-ATtbRouPz3L2vT4ojk4=": "4132262000000", - "N6Rm30GqRiloqDuq6iQMpXAslo0gd0SCwRzWLwF8Q5s=": "404016000000", - "N6cQKexHgJNw1UfH_QOkry_sOS_-nSP7rKUY8t4MXWI=": "833333000000", - "N6ih5p9-mkVUgTPnPA4nsFR0OfIlK5kDttUpklcAoN4=": "33799323000000", - "N6lKPUMkZKrmMKC1ZIzGGBPPZHC8LSqtOeiM23hluGM=": "515113000000", - "N6yQKQJB_q4nQ_cN332gmCwb16oS0z6RSRBnlD-zzYE=": "3787469000000", - "N74MQovXnWn35Xs259bKsH2EXQ84ZT4b2quRu2FH2hU=": "3633155000000", - "N7M5u9C1M8_b3DZ5YRUrQDXgs7VxTzd6dhj639ClB3k=": "686722000000", - "N7QdIZExbcsJlIBxFA7PLlpvBfKW3wtqeA7zLSaONE4=": "493827000000", - "N7hU_zhLj0d4W7QaDFlT5u3ivzlLw6iR7LuVkTnlIfA=": "4903266000000", - "N7pyHMRo3T2D0JwQenKR70qvXhjTfjnCcCc_W7xO_bs=": "384946000000", - "N7zDldRXp6JAISyvH41jjZ9r5vtrBKK_SMxPwnv4Ihs=": "1763423000000", - "N8Zs4XZbkmaDy-IqNo6Gy7BMNykj2_qIuwcgZVsHDPM=": "1153846000000", - "N8eF54ar5dI-GlP-CyGjMRfkcgGMht9ZCupJKZQJhtY=": "4953917000000", - "N8nXdnnTzocEHEYdnn6dBFfr2pBpFPwHYU73gPzaKA0=": "1119367000000", - "N99dI46WQwNWA8MSypoGm7JWDFXgdGfJxL6v10cnrMg=": "492798000000", - "N9LefuLKivW_At6C_iuMidWRBFvMSkgF7zSlJcJu9mM=": "416901000000", - "N9SJGNMP7cnvT-O4cal2GMnVm9ShKNGPrtHZdT2Zj8Y=": "1642415000000", - "N9X7yAf-9Rp4bjal2NtgXdnCrfSMuGPnY_uN7vKxbhM=": "377191000000", - "N9ZtleTV-QYsdZa1jxyMR3M9q3LbP0NBHnyAXxVgFVE=": "530056000000", - "N9k3lBcGirj8cI3-ShOQXLHRJ7O2fV3LjMuqspB0c6I=": "15999872000000", - "NAG97quC_yXTonijIb5A8lmpuyWLY2j4_rQ0x_CEONc=": "1132129000000", - "NB9zWtN5oKfT8K6OlYn9GlrOB3agzGc1zSud_liHCSY=": "768894000000", - "NBQ6ortS-uCgVtfFjtxz0xEbEznNTagcmYUSZ4o9kAg=": "384615000000", - "NBST6p-wgx75T6gVUkSQiWNHzZfIQmev-lcamPp7Pe4=": "3776928000000", - "NBUALN1Ryevmd16lU61eL_h7rd0UMdnyFOMPIZAeN9E=": "366402000000", - "NCpZJojx-mhZQ2UgovMoaIpMI8uFCU8SvwavnX5vLpQ=": "537684000000", - "NCquiUzKtR0YQoxxJ9re-RCIlxaLsHbk0v8vxajoHsE=": "454485000000", - "NDTEnpzckI_V6A9CqaIk57VzbRdOPIuUe950EAch0kw=": "2337370000000", - "NDjQ8t-fV-i5Y3QAoSas-a5-4DhgHwWFaMjwDu0C1Ts=": "1955916000000", - "NE5G78dgVzA-aYC0ZpgQynKNns1EcTOrQDa5Z2wsl-E=": "422196000000", - "NE694zaDMyo1IKiJuQ9cxpV6Sctne2eFWggWxOVEV48=": "1923076000000", - "NFFGUYxQ6h0h4nkHyq6qCVLG8hnn1_g8TzjLxXhKIm4=": "458399000000", - "NG1s0q6SBBbgopfhVUpifSrHzsKeg_q0VodVXJyaes4=": "769230000000", - "NGVwGVY124YLizcovX4Z74CaUV7ZSGI94ip_YA-VhhE=": "385506000000", - "NGZcP4P6r8Q6uYcPPx4MbNfjTwzuSerxmVl3iE2--vc=": "378614000000", - "NHWU8vvo2to5GDAbzRZ6Z5janOp4XPFYyL1OV5NfpUg=": "1249999000000", - "NHfFoV9OY5m7_hdtsWfkA22GAOxy31e4oLFtJ6gVfts=": "385506000000", - "NIac6Sz4Y87cCEO7E3R4gQdot5nmYp0_ljLtc7Hdgbs=": "382765000000", - "NIfH8vzi3Xijh-534baF44T2m5g0gcA_AuvIZ6kQkCc=": "1904794000000", - "NJIF7YQGwFNy-82Enlb2DClbXzZAwpzmu4EdW14fYZI=": "5769589000000", - "NJaV1zMNmF4L38nOHiK9TT4mdgfmaVuwwThPQ0QfTOw=": "4151312000000", - "NJuitMYjEtUUP79ovXdYZ3wtDu_rTwGwxO-95d0a6lI=": "470202000000", - "NK6jKyymvGkOrYPUBF7yLXUyO_eL9Os0jAWoY6qGN8E=": "2332946000000", - "NKKa3Dg9qSoEzrh0xxA5MLfGRRfswqkadmaBE-NdT3w=": "389230000000", - "NL6eLimC1dUPE_sDASln8zqscrZ1Kz7kwZRD1d1BESo=": "1698694000000", - "NLSBof0FCzjjn8NJ2lWM1gg58YqHjWFFCZ2BsWDpBoQ=": "460196000000", - "NLZUpRmweRlyzQURj-vylg1Y86WtAMUx1UpcyD0bcjs=": "385690000000", - "NM848D2V0JqccV_5zkOCwyK3lEkJK0_k48PObu5w-T8=": "1154003000000", - "NNUKqCTu9wJCFHfGd-nkfwgunzKbn_5LKMPGprE3PWw=": "684445000000", - "NOOictPYyKM3XQ2rkXHKf7LE11pbPx6FRMIlIVgB6l4=": "385035000000", - "NOQ7_D5q3dSSQYMRip794nIsjNYeN2KW0013uDw-E9Q=": "4854617000000", - "NOVogrx1ZLmJJiJnzqRdPGS1Kf_S2GFqXNnJETA0DhU=": "377901000000", - "NOZVdeVFnHFWdDA5D87I6gaIrVTu7jiP18xaaji_3Bo=": "384615000000", - "NObw_V5Hdp14NROiW0PKLQ6JRpiHhL_f4X1yIKFRkJk=": "376971000000", - "NOn7EEQQ3TPVZy-89wQTOg2cs3HCnKAocjcOvcwp7Ao=": "25000168000000", - "NPEeYgd4s07sJpdtRbKwWPiDTbnhuFay5eayU0DPYM0=": "353298000000", - "NPNGlcgrN7yx3jK3iMo8BmPkkdCZ1cFyxOwtlMMnV6I=": "384615000000", - "NPxTke7OLBFwWBB1l6dRpg-nISmZ6hnO5MaUrVDXh2s=": "10683461000000", - "NQ7F5ztE0G_5f56YVP3Ce7LY8Qyt0WOGz9ftpZnBXxM=": "973754000000", - "NQBsEOLkLnKBdzf3TQKHQ9UFz2Id3xqCZuNCgJiViwM=": "930249000000", - "NQDINJWEHs2dhh-PCrRPSkHT6ZPhvBBZMEM0Pf8lRCg=": "1223425000000", - "NQMgOSwABct2NF0zVzC-ESOpDsZq42QabgFFMXJMbiA=": "480325000000", - "NQXVuuYqc56tYOQpnbYBegPblK69le9xm9rYRcRatQE=": "388604000000", - "NSDjEYIATapaOTZtrEZ0cyu5YaW63HhwN89hD9iJ0uE=": "417635000000", - "NSOB2Px59gMb6EtwHPfrnF0Bm6O0YlZDe0EeBwQfb20=": "520220000000", - "NSrvyteU4v7UVif1q6KHJhEHKR-JsAd3HxtxpG_nKBQ=": "769171000000", - "NT9KmOnBuB5hRcRslSQ9dlWfBj4bTvhUPQFpka-p-n4=": "2316163000000", - "NTBBpGaeYblpJo_aIWtTHBGgp_d9i3NW_j6bTJRt16k=": "388114000000", - "NTGq_pdGMQGKAiMvqy4ws1eJh4sF6akywCXLU9UEM0A=": "545429000000", - "NTmJ1ohyD7-TgQBjtlirJ9F1YyHXb-2TU6hgX9qdTzQ=": "385509000000", - "NUFfGbFheEexd79OvtM0tC22ayOgXWkKPLWvGiyobRw=": "2611637000000", - "NUYGY0ErUV6nKF-RP_A5w0jEgYrDPtykCUXRxTMF180=": "656903000000", - "NUheG4NTNB1JR-QQu1AR0WDwAbuRfrzXvvq2EoT_iaY=": "493696000000", - "NV1n7bJMaadDwe0fi1__xWHHtFHlohBuiqpoFuphPNI=": "509737000000", - "NVS3CsTy2DOtod_ma6jDb0EqAe2qwvUdiQvAHSkWAk4=": "1807692000000", - "NVnYI_q0gZPKqSC4ePKLAkDcX5ez7EjXHUMJ2WzmU4Q=": "3233699000000", - "NVw_Bu-PhvnlTr__7J5-wVnWqqeRycIBxepp4tW3Ahk=": "384070000000", - "NW4Z8b0znXcSJ2ZDNOLtxDNBbKmCwQu2_yYnY1fvI4Q=": "411085000000", - "NW4i9JEbNBgHJlc-3FNuQnI086zW-jwZdxo_fGoQubM=": "2088177000000", - "NWhviTSMT9JUKaZCGtrsmzYR0_vrUEIoSr_P32FptP4=": "446388000000", - "NWkKHkZ1kNNnnN8IHqzndGmeCYZrAKRzuh8hU019HP8=": "3264165000000", - "NXEJH9L6-ctf9vy2rSkPsMVpW3I7pc5k43R5IvFAcAk=": "624393000000", - "NXoHqMVs3rv8PfSeyv4QOOUilm3f2YHIYLb7gtHcTkQ=": "2059257000000", - "NXtSgpTQVyXMPaLOnkugc6MBMc-mJHbbwn0lDDqAz-w=": "416224000000", - "NYVK8eLEx4oNch3aDTB89yY3kBfnyh_91x9zlDccVdI=": "383258000000", - "NYc0A0TrDrrcz8X81srQ_If3_xtowYtiY0n-gsVGDZI=": "1924888000000", - "NYdmQmjP5KF8az1p3RvA1wY6-L8RlyvQq404_j10hn4=": "1041666000000", - "NYr6SGSPizTHAEMHqMtcuDxvh6zPEaJFM0pkiLzV3F4=": "384551000000", - "NZVfR8gH49vvOKk4LL64czQib-7ZY2bz7K_InnA0jDA=": "4694684000000", - "NZtYY24bO82zILTfQCK5SrWmBgbHl899UPFj7wSnR6w=": "1859815000000", - "N_KpK2YwcS0YjPve8tJzy3U2gbcjogcaCbN3pG1aX7o=": "389790000000", - "N_XQ7KBc63FNj9axvU1hYKIeq40SY86tsq6dQhZuZog=": "902412000000", - "Na-s8ZCW9Dy8LcQ6FDb47tMWF2AgthbtlbZ-ImU5CdI=": "453469000000", - "NaLGPdZH_pY38luhJEidCAVCZylJW6GsGWW4DhMa0cc=": "423076000000", - "Naay1v9CEpQi7NmSaK1J4xyYfz2Ng4WK_9YleI0UpRs=": "449443000000", - "NbP5bXm-GwWfdfna0MoxIPyGWvTXFJXo8pacSCvTyN4=": "378259000000", - "NbWIUDiyH_SVRVCBiYSmPYn-1whXxNmRugOc52i7uME=": "2083333000000", - "NbX-epnN9XU8Cv4UhzwLS657-8T2IvcIc7uQmnNQoHE=": "2820045000000", - "NbaetFKT0VG4vbBokgn-7E_9hdWQoskzhpWuwMMWxW4=": "527177000000", - "Nbu7sp7CrcoQ1SLLnwpc7EwX5yWnit8yo6hgHrNYhM8=": "1267309000000", - "Nc4EQIVtBxlHceRU4B0gLK9MoZyAp6ld9V2XixjRAHw=": "453318000000", - "NcJ0C8DmelI9wWQ_3q8g7EMvKziE65LNtJlBpAegSjE=": "461538000000", - "NcovRNYjaYsVoZET2nUTnbu3jyxd2U7F1CIjQ6w1nFQ=": "4557211000000", - "Ncxhwp1YqQibCy1r_SwhcVmvzDy9z2K_zTaiACzTwrg=": "507660000000", - "Nd9_vte3fifZszUv5Yn9xnGpVKt8M4rOeo0GFTL7v0I=": "992423000000", - "NdH13wLiLrJrsYkcMQlFoiXn5OPZRgY5jXE1tRD78Aw=": "1785049000000", - "NdKkueCrgg2LYER6_NeFf1aZx0FPmrxL-NnmLyR2q9w=": "587190000000", - "NdTW-w6jYqUEpoqobEk79uV9d-2ZpoJ5-HbAF-UW_8k=": "769358000000", - "NdW2CiNOi30TYT-5Diei7QXrb36Yva86mqYDy80KzkI=": "415399000000", - "NdbjboQ4bOHr3-csQWuU7AjUxps2uNMoKLtXcmOpQ0w=": "403063000000", - "NddKr45JS2wqC9fC2tRHvm3sAFncW4poJjz41FSqbPI=": "1141815000000", - "NeP_nrVKqJ_9vUzxJiUCH4_-WAj9zJS3MTRR97UFB3I=": "455781000000", - "NeedjSVvIYkMvurNpNRHnbzSY_9xmsV_e7B6Fi1HzAY=": "1134771000000", - "NemIu95fq9XYqrDyMvtJDwog5A5ZLBKz4KJjXxBVPho=": "3471292000000", - "NerAic0iMBqhHgbnuICUgVVenOjRd7yAEj_2uzIvJfo=": "769230000000", - "Nf6EeG7mAp-nTlj-spCG5H5afMX9HgmG6JBsupuGFr0=": "4079015000000", - "NfC5RFtRxUeFuoMDt35HJaFnFLJaBwu4UKyLnJuzlTg=": "384966000000", - "NfJgld6fXejchrbVUZ7hYgwDLD4Xaag9_xvifZwM6d0=": "456259000000", - "NfRt48IriI82UJdiaGctC0UQSpOJWRVg-wpvvZ-xFcU=": "450924000000", - "NgHvDG4tftZ3_DMttHfWgj2yaUA1uihBBA8PBrOY8UM=": "999190000000", - "NgS5ptEUlR4603XQRDTsoUss8kYTZXjmpNEzGYmq0GY=": "1963689000000", - "Ngn8lqkoIBar0ykuhK93GaVj8hGoHu9EvbW1Dp4xCIk=": "4037983000000", - "NgwGQYBMThZlx5T9Ejo2On2kVPOByRYmibmVML14m3o=": "467059000000", - "Nh10_kjkomAYXEBC7TzKwQkkGxde21Lksu2J4kyPhQI=": "500675000000", - "NiLZx2D5lQHshFVXda5wzL07dbjxhfta6bgN8d5wnsw=": "6249999000000", - "NiOY1hlEP2DQNJOshgxVn32YKsrXcs3zHEiLNoULOtI=": "448509000000", - "NiUjN5G-5eYaBDiVRbbJKV092SzIhpRuf430srU7uYw=": "416175000000", - "NiVaK9EC3hEVdgtUU5Pwepps4xQfeekzc2dT3bQLHr0=": "417948000000", - "Nj0FoDyHAckhOGHW9w_eSED5uegclt5NvwpKuY27kqw=": "377448000000", - "NjKx8NHFdPrQ96fDTsInA3DwVpI1PW06gTloOr_nsmI=": "385423000000", - "NjTfDG-1OLxz-Ao9hISHNsXIMPUf9m710VzRF5jFA5c=": "1233257000000", - "NjtpanEwLBuIyYgbZx9J6_7lET1W8htLV1_sUW_ng28=": "384615000000", - "Nkfg0JlYkXqkd7efZAJfCi7UdIetSjfz7Jp_lAZOk5A=": "380858000000", - "NkgteyAcBDY-Z4itDieY5F89Y4YDrRNs97J71sCCsTg=": "768005000000", - "Nkq-JRPuZCR4qXW2eUTIDCIb5DRMjBK-NJl8AIzOBYk=": "385152000000", - "NlOvxpaxs4jV-_jCHZG0CfDquDlrczpOao7QEaCWzRo=": "384615000000", - "NlTFg1zj9ekvIJMdRHxwCpWEReyn1FSk3QCvYRFEX6k=": "462146000000", - "NlqxUXWA_oDO00C766s7lSt9dQag7-BfL5RglIfQ-Dw=": "1918144000000", - "Nlt43UR_v8wC9WWu9jFI6B64KGM5Z0T61mFnzqPUdmg=": "384615000000", - "NlyRsshc2j64w_YRWTl7gLNU-tsDwpS5OUpbzUx9BZg=": "385506000000", - "Nm6oTE0-SgREKFGb2gPQmUk3GkhMaEUL6u5uej1jgAc=": "2266350000000", - "NmD9KuPkO6CjwQnQnIgaLuJerEsKRpu9ZQHr0UcHXwI=": "818220000000", - "NmJTHsLyE5OYSz-MewP14brFBY5Dogv17IovssvVCl0=": "1388070000000", - "NmkB5KccZ5sKOIxQFSZfb3UpTm7lXhw9XavpmhqE_yw=": "453243000000", - "Nmtjv_fQi7KlOIYYUQmqfWaOIgrnl3UqOoHD3llwxtU=": "469885000000", - "NnD-1gCOw2fbqX6q1NK8zzMaJzQpvdnJrPmjfHRFvNE=": "385507000000", - "NnEPFOxvcdzKtn9K15KFxFst8ubE4pNEqcUV3sTBntk=": "445583000000", - "NnUXZAmJXB6Pj0IJst5vXq0YfAoi6r4N9KalSRBQ7c8=": "384615000000", - "Nnr3-XvGachdN5U0_NHlHPFk4o8_7Mi_zyRxemfDIMc=": "381338000000", - "No4201ygxochPCQUOq6m7q4pFNEAHOyn2WsneIiCUr4=": "767610000000", - "NoUBsOH4lPyLVjIosnCZZcLPyWXNgE8HN9wFLarIAvo=": "2292284000000", - "NoWpGf8xyEg4PH0KOaykip70w-hnurTrJqZbAm0Fjko=": "763672000000", - "NoeTaxodxnsuL-3RwJvi3rBta20L4Af8bAHBmnrwyYA=": "1237753000000", - "NpUJZmEf5jvGGOQ_zRZP-ZGSJLFvmHAig_tEA7xpSI4=": "1223425000000", - "NpbORBCiWFI5Htm2D5eMC9i5uI0qQw4xcRKCMbcJo80=": "379928000000", - "NqSvkJSAeyCSKtasWe7_Y2ujHjGnibRutu22e6fWiqk=": "2083333000000", - "NqV9Fjb0MJ8aYNrGDvq9XAXzNC2NuMlYngcW4cJbYW4=": "453196000000", - "NqVmJV31I8jjhNu1pRi5D4-PXRSuft3FIeEkTcTjAEE=": "1499999000000", - "NqXfFOS8mIA7OtGuRaqi15wEPqwTpfa5RMH0rryXE6s=": "384069000000", - "NqZWt56WbraiOyW5cWxfTXxlOhaAAClQTRH5MUfATq0=": "1375110000000", - "NqdAHcubPeo361HI4IGVHOgjj1t6ISB5ejMqW_QpRIo=": "1702174000000", - "NqdujHnOxExH1CqgruwJ0sl_3xPYI4eM_W6u3L2U8ac=": "6517451000000", - "Nr6fdwC7Ks0VuMHSdnaUnPfOsrAiagAeG3oBKBrVeQg=": "944207000000", - "Nr89y6ldZ50blgSDTWmrcNhwGiHohwI7z4rDul_HqvQ=": "461214000000", - "NrP7ehuV3jbidNaDbp2zpg-JDtLBH-gh_ZEcc5DBy48=": "1852170000000", - "NrfhKRH-CJn99vVsjMOSwF0pPRm9lvyE0WWerDdsKU0=": "1927483000000", - "Nrqh_NyjCj34hV0ddB5VQnlqlvWrTgeHjQxSRxEqWvE=": "384615000000", - "NsgTZZIhXClflHCxBRBYykqK23plQTXSH5h8Z_rE56A=": "948095000000", - "NsttzGCxIErbSQb7k0iAKC45gmLR77-mUwJAcIHxeBU=": "8086220000000", - "Nt5vdwMv-0EtL0ynEFASXo8CCwjdstRLCVwOd80HmKc=": "417532000000", - "NtOCHy3DnqGxcGH__QdVf6dGOm2DJdYi-iPbmadc0cI=": "7710150000000", - "NthWjzRClx7Bvnckc7f3GsAIrxsbP45h17vNk67Qx7A=": "1233257000000", - "NtzUyBrzdtUfV5xFqbc9BM975cOqzP1lSMPkGYrAWPk=": "389704000000", - "NuhN3OVtwjEBZb-BUyfFidjX4NK58vLkhYkgIvRw-6E=": "379344000000", - "Num45XX4u6b_uOfWPXI-BuJcEI715BYSHfPDlhjSN70=": "377767000000", - "NusUOdwxWYhDXfas19P80LDv4dREV1zp2Gn5rTPOqtM=": "567916000000", - "NvK0Hq1Iq_qquFDR9qI0o1qo7Nxh-3baOnDQJ9jY_Bs=": "470437000000", - "Nvh5Ssd99pynKpF4hdBivBkzqzKk_xV3lddVJmL0ELY=": "607840000000", - "NvxUVuY_V9JgFAztOTc15BNmi4mZEc12F3XX5-OpdGw=": "407808000000", - "Nw-llzLwtQhw_tr0sG-jFz7k-ekA1s6hFtx_zmfwyxY=": "459285000000", - "Nw3RvG1TJQfXr0_-RTiuCNHTUA4NMoTO4zxjaBbHJ5I=": "4623043000000", - "NwGxY2KYHMUY4XoenYYX788FovcqOMIpEpn53HEEir4=": "388620000000", - "NwaXCCB9RJUksiDfYcr9APHWnC0NYiYYslUQiOdIy6o=": "396485000000", - "Nwi8-3WaqBp5PvA0lt48ntIA2JR2WLN6WVRwV3_V9ns=": "1461538000000", - "NxWORhXfG53hsGodo4eJfNrTSqV7AFueQOll1TQ3ENY=": "457943000000", - "Nxbs_FjFxB3A_IcoL76UNbwbBwquwLpOhmk-SoEfXuw=": "412817000000", - "NxczPLEQ6ETwgxMdonYexPPqvIszAIuI6VdN7jotfhE=": "1150959000000", - "NxgbEIpVt4AHtPzSCzRi9EWDFw6z42lOJJQ7pf4zgnM=": "1700304000000", - "NxnFFwEa2a8KUt1mkhCqCzBtj2xM0L91nAA8qGzMHpA=": "899999000000", - "NxySjy-D7Qt0HOx7Y2AMj4Lm4fadzM2kR1j4JjNndO0=": "768140000000", - "Ny0veKxsbjRwOCraMCuGwbSny-lluhimh_ujYVhoCLU=": "1818181000000", - "Ny1i58ICthu3VTCdlr6WRLNPgNrM3HlsksLBmYxiQJ8=": "769554000000", - "NyYBRJQOoHFDtdvJeuQxgAo9f8X9KJ0VzWW3DzhI9bk=": "464447000000", - "NyaSgkpdN3X4vvKaUMsLZ6Tz4N48jqW2-E3CfoTWOOI=": "385506000000", - "NyqvE7Tvkfu3GAknj_O7Mfd1AOZkyoQU5ZMTHlf9huU=": "488247000000", - "Nyrha4kdgtrUzmm4VcY1TjuGfv9UrH1MqFU3LbQIzL0=": "413869000000", - "NyvIpDFXQ5h_A1VV6HYipnz1UfBWGvP1RqW78p-yu9w=": "4110858000000", - "Nz5PydiIiR5fL-MVD_mdicsnbA3bWh4IflpTLxRz2qQ=": "951762000000", - "O-RJX8mdEYh0zj19613bNml9uI1KuGewncGDZv4Q34g=": "388439000000", - "O07-rvOvPrdUrcWm9Y9n4jj7v_4C0JBZ_X9OenBnkB4=": "1358328000000", - "O0nVZPB8bu7dzsP2L_HaTrBQTqh6Ew-EcNLgdE2T7MQ=": "384448000000", - "O0tZ0Z7HFuDy4lTDOvE6or3YP7Y5DNbNq50O7H8Vbgw=": "453908000000", - "O1RdQL7WHi891xfPcNy-yGGzjUxFdhvHhs9VOo1CrtY=": "420522000000", - "O1a7-HtQGpmM9nIjOa5_SFbgj6ecDOCQtwf_tJ0q7rg=": "385509000000", - "O1idKf4SRk8IYOHe0cXHy0qCaOpMHT2Hz_xNsrhu-PA=": "389459000000", - "O2XibmbtCU0sYt2CPX8g4QXzwN70aMJx8sqp8cZvVws=": "393443000000", - "O2ZyKaHMHSCUWnvwOu7_9lu5or5fUJsHtdnjQ2IGsEg=": "385343000000", - "O2f0YBD2G191LwXGtaGkyh7GAoYMSAIKZQHwYCX7Vsc=": "395565000000", - "O30vab5EysTCZ0jCkByj_5Cc0b-SQ2uKmo_uJ96exVQ=": "384615000000", - "O33NhyXzFl0vgnNUvFPX9kxzcm6nZwKn3bPJUNMwdOA=": "768909000000", - "O3fVmcHKkGlGEe-g7pSeUbAixcswRM-5ARxlzi4-gRU=": "1321326000000", - "O3ibdSNKvUg8vPVGylCBsWa4fDHSLWy3PMrFxe1AvC8=": "416666000000", - "O41uTAHDaDixmSYIwOPyja7lpBswZqxKNkdKNtfEqA0=": "456063000000", - "O4UE4wsL6IqUpkzBgA6ECS3r3ipwR8-LHn_wlYcET34=": "915968000000", - "O4tsNEoEUEjtiZ9X8d5Cd-N-mgWCyiJNCC6vtf7UN9I=": "468609000000", - "O5CdyFV-AjKsgp1jn6NsBs8_x77yQ2kALF7smR6ZEWg=": "422561000000", - "O5GTHmLkIusp8jOehT2Xi03me1cLOFdgcYCx8Mnr_0k=": "759857000000", - "O5KQZS0w2tqA9nV9IfmMQQLAIMFSkN3aJJ1dSHW1PYY=": "1325740000000", - "O5RWAPRpLSi8_crOSOPXaqar-BWSEnaVZwIxE005pC0=": "771600000000", - "O5TN30m78Dar9t8EojhubpU4C7LzImQ4DNiW1HB-zhI=": "4556000000000", - "O5Vl0hlzWQDLbuCAkb5r5M4K8rI5BMkchVBOu3cwwLo=": "1114431000000", - "O5_3BC7q02vQLxqHVYIz6foE8-Z6m8GEZMRt8CzGYgg=": "460333000000", - "O5tkpEA1tklZ90bV-t2ljHz8bKiyTRJrewYaI2P68K8=": "568614000000", - "O5uTjni1TKtiEsn05L04TA6sPDjbHN7myA4GyIZ8sZ8=": "455367000000", - "O6uQzB8e_98Tv78mn9eNvvIU9HdOni1QM0rgJ2TOHDE=": "402050000000", - "O6vNYbz6hRIShzKWecHlp10jb8ua98camXxzGIBaIxU=": "382911000000", - "O77Td-nDPx1qHoI38zBsir47-8rpeLaQ2D9VNZpJAEs=": "473001000000", - "O7FDcqjBLMVnKQMc4ag36eIsBn4WALZJNGzAW5KXJ_k=": "404710000000", - "O7bT_4FugKN2iubb8iFF9o7GRmAtaIUQVE2YYuc_tZY=": "378561000000", - "O7qmhJH7195XlnJfYufExWRO60asT0gdCoJ70fpHNeU=": "760671000000", - "O83_Tr-8rVeC2cJXdSHdZwbdLX5Isrjiuk3PlL9o_LQ=": "416735000000", - "O8FcMD44WjwI2HVde_41H7N53lwl13D4OA42pT_deE8=": "845123000000", - "O8YrhFqciH1J7E8nU4K5BhezKxyLu1XTPAPmfXAwr9E=": "390201000000", - "O8lynEGnnxGUCpma6EHbHXre4YuWYjKVKHh92pPYVJs=": "378310000000", - "O93S0as5J2gHkxNMdCBKFYN0M15EsoWvm-HKiJhJ9qw=": "467679000000", - "O9IA6YLEWvGR8XMbdKNDxDOBLkfjMHpnZ9P5wLtQPgk=": "358360000000", - "O9PqYg2Sw17bMkt5RNWQbqHbcge5bjWqfKhfXKEhHBo=": "2278000000000", - "O9b61jQ9vPW8_CqrFShdMOk2tJqKLs8liFEg5MesU9U=": "2083333000000", - "OAMNbXWz6cFx-h_yGDdWiiGQZGP31e4frqPmzCTvQPc=": "2095949000000", - "OB7-kbQRl6eRV4mRWpLUaMowcngGXggshgxW-fLSSCU=": "916992000000", - "OBHdKOpJN1Mh4ecHExEbY42gSfbnnmzridpHB_35cTg=": "414045000000", - "OBNnGuzBMHGBLXSq4zS1gJN0klX99M0vnc9SlUEeb6o=": "642362000000", - "OBV9V2ABJDtatEyKNQwHMV8gPqL1b1rQ0ShuGEw_EDA=": "1000639000000", - "OBWaZjHVhS_VpdhCAJV9CAmP5SHL-X9EEbTfM3NO2Xc=": "42670994000000", - "OBZlUAFwpoU-MSSMwuck3oemqhz1QY98BS_x6saCI5E=": "5003432000000", - "OBo3P6ZQ_dSFvn1M23mdSwS2QvzvjdDyt7jX_eETLvs=": "614506000000", - "OBrm-Mks5-PFAKgIk8ub8HvDe_mQgthE6OzOJMUBYSY=": "405197000000", - "OD-4lQDm4J2UIpITTXbHaLU0xumhefOAAPp6vCIsdnE=": "3076923000000", - "ODIcB0q0dkEEZR-mdzVGif2_dqEYvZB_KwkX23BeeCM=": "1222844000000", - "OEA-_5mKvIOU9YbcbI3kPGOGIwFer-wHogKtgAJ7u1w=": "384948000000", - "OEIGrX4gdIQCn8Bh23I67_Mcc9liCvxpH-SfrRiB93w=": "469318000000", - "OEdYPewCIY9jsIYALexWCZ-UmIb4ZCunu8CqLyHFEJY=": "491921000000", - "OEeZUX3GU1Brl4SiGBvFRCTOjFTm_sOCOmIbKTfWaw8=": "1298495000000", - "OEoYio0Lj6QdTT8m5_rCARryNfMH5k4koLr3MlJzZV8=": "1924509000000", - "OEv27JNseXf8NO8UQ99T7VWxBORgMqRmPCD9drSqYF8=": "451187000000", - "OF-sveQkyMntCiUoWuHnuaP1Q60uJEmxhBk2xvKobXU=": "384615000000", - "OF0vaqBuC3I5dFWtjk-fdKT-gwKdsni_FbI5B57f0WU=": "10811627000000", - "OFLVrsaPEIumAv3YaQg5ujILNSINGwqBa0eud45uurM=": "382251000000", - "OFQTl9CS-aOzI4m4V132GUBLz6Avj9SYsdVM7bW7jPE=": "384615000000", - "OFeSHOttFw8uZFE_ZApVWy8YVzzTS-wv_lXU_Et5Mgo=": "11215384000000", - "OG2cUrLQaUNGInG-PC81viipq-PmZpJnlPHSB51xaRE=": "4174903000000", - "OGH7qPPwjRhEhZnTSXkw34YU_42zF4EuH0kv1QsMako=": "36756230000000", - "OH-XzgxvYyAZKVQrazix9gLrYlbAED3jCxfmcEgLnd8=": "1154100000000", - "OHqAt2dMb_HJozvbbd2Dx8vnvn2PBp2cHN3fdQuXjeg=": "2301352000000", - "OHyKRNXWKa4Ggq5W2BAMVAmbtN1VuVV5Xu8TuOyeCyk=": "846153000000", - "OIRticQDKySVwqTN7NwqDDgtGTDkbhCtnemVdbSSldg=": "893487000000", - "OIyTW6qugIRdSsaxPYm-gdd04J7nBpzVEplmpNzyvpE=": "416690000000", - "OIzEkk6IF7hAjoPUuJk3TCoyGnZqkQX-DqjmrcOZ8ug=": "1071804000000", - "OJ8axwGIeE9uPZjKY72B6kUc_IDtWrul3wdoYQvnals=": "378576000000", - "OJAB88scFDuoda62gwXbwa183vq4LCsxJSsz2z3nD58=": "909090000000", - "OK3hNHfOxkwYrjVxdHvMmmS9qYnI9fHgnq5UMQu44IQ=": "28675033000000", - "OK_7SQZJWd0lMnikSttiR27-01D0WfnjA8TKGuORUKk=": "384777000000", - "OM2xVGPSgURMAzinOWf0TIjoOHNQooCSgTWQW_cIqdc=": "463749000000", - "OMbmxxaxxchZwHmeT2l0SXJMVvlrxJYPzcQWOYcfiX0=": "4173798000000", - "ON1j3GKUWcLQryQ0qAAHKlsSIpEjlcOHazdZGFt1bMw=": "1156074000000", - "ON4UfMJxinGBlURABbOJqDkiq6s45fl5StVM4jgembU=": "449217000000", - "ON4asaW5hYpwLWdcd2pMnb3ydZdtE2vls5Letj5rurg=": "450738000000", - "ONoJkR3IUAIhBVKY7KkngGq3E0ETxjqG7CLfR232aJ0=": "382394000000", - "ONs6RWruVmBgZE--wxRrQDU8v_0MjqA_6VQV2OZaOu8=": "379742000000", - "OOQ760z-aO0Seu50n9Q2P5B4Zqq3zrW-7o1G8-hAn0k=": "384615000000", - "OOVtta4pV3GEGY8S8ktdx4mmviVr0fLOe1Z2jLepi-A=": "391797000000", - "OOXxL87v8N8iXER6oT6Uyjxo0jPg4ze8DX9z7VECgW4=": "416421000000", - "OOfkEbPseuWISRC71KisVrMNR3aNCPFQM-VyzPnR7ew=": "4624111000000", - "OP9j7Xf9sZiPCjSDZWgiis6oN1YaaUqu6k521LESRHI=": "1352556000000", - "OPQpcM2rybPC_r2C3-H-NLc1ZVau7HPeTLuLr86lug4=": "3769230000000", - "OPTE6b_pU1Hl6I5U7FkHoYwxalGL2--LdBX7Ze1WEG4=": "570411000000", - "OQ9O-4mIyTuw55CFKWIHdILM5zObOua9iPAQyoO-bow=": "462839000000", - "OQUcEcEYtUVnnnKLgpvNQNVjkaqnJcSr4zNzklyqM6o=": "452733000000", - "OQWqbJl2JH2mDaJTnjaeaKY4Rr3HV1boH5d2-dThNuI=": "1154586000000", - "OQc6qsN-ljVgZ8IMIz0ut8xKi3YH3braHAUxiRt_H5M=": "377698000000", - "OQsDVoWxFQiOZTmAdGQhxypqBnXapv9FoLdZvd84xT4=": "414989000000", - "OQwFmuEfUPCFBctb1nEVJDk7hq6OSNZ28wsSTPHoYK4=": "769230000000", - "OQzLEy6v1GPj7dMqJoNW7nnCwJ-CquluGAaQXYbkVJw=": "1889091000000", - "ORXcbCwULUN5YfRD1PU1PwEEBIE_j4Gr-pw0Zq_ZY_8=": "1666666000000", - "ORnS6rjWXX8YpGpIhydzGAX3ZtwUXjvSKQUwf_2pzjQ=": "808957000000", - "ORp55lLcefeC86FO7dDQwX1LzPQiiU5Jv5pJPNnn-Gc=": "8443938000000", - "ORvidGG7Dqe3LvSFnuxU9rlJCJ88qnwP7ZGTSHBfhMQ=": "1632692000000", - "OSIu0NY1-zJ5NzyK1uG-ML-Btec5k3xfa8BymNoiZbs=": "576923000000", - "OSVtDWEGfU-GTIhDKcVe-tT7RU4f8s7bk67uOywoPjw=": "1000867000000", - "OSemKrwecvBcrnjs7LN8bhi3IolQXDOB6qm-cU-Y-qo=": "419168000000", - "OT6To5Ayqh7yArvimcPr9i4GEsgIviUiPNCCWnQB0dU=": "1540815000000", - "OTRjKw9lu8dxZXuPqRl9SKMpCEz6mYh3q6Bit8n4yoQ=": "460521000000", - "OTRy9kOK3u_w9Ub5afE0RTJncB4rojy_RJmqoOxj_2s=": "390237000000", - "OTS7NeMyUoWMTcBJyPdqh-RzfP4Eihe0JPi0WwdVygw=": "352834000000", - "OTTk94X5jj0RNUfKsuGiJVLxQDxKwZYG8gUx-p2ZbK0=": "499707000000", - "OU47BjVpTZXzfkjySA8usz2GxlLe3oBGtE66B48S_Yo=": "385506000000", - "OUM69uBnDEuPSGh7y31WtZvJyngfVn1B-IrylUQ7k8M=": "499993000000", - "OV0OlBsRqPdHRL0glyYU6PY0z2MBcRNoSyTewQBBaV0=": "460799000000", - "OVKqz3QnMUoPFaeSM_C986hr397LLfDwD11soAqGrXU=": "416673000000", - "OVLCqOTvkN2sNQxxMP-eqPBb4Hi-FzUSjLrV1-u8Hdg=": "774652000000", - "OVqXWMgoVFqRrt0-FuY0jzrvvd4ve2Cgb_uU0MHu_6I=": "4075159000000", - "OVs-T9ciD8S30_VRf4ZKFmUPKg8k9JJsus95Fcfl_-A=": "417702000000", - "OVyFmAp186bM4pSmgBPEOMF4zNccrOkjyI2RRYFWmq8=": "384615000000", - "OXm9wUgDix0wl5bA3ft2PqsnetN2qnRf9igXakwHMz0=": "983735000000", - "OXpyoWfxqSasGB1Do01yNXiZYc5BCi_pnmoKxBZR_CU=": "3124994000000", - "OY34jFVmmr8Ut8t7KK4QpC8jTwpHpP78WCWZcXVR6Ug=": "1156515000000", - "OY88hVMNtlRvs6ZnqKyVhGaPSehHXVx3dpV_qT2WKDQ=": "823294000000", - "OYi3-uQw_sTlDRNTu5foHh1sp4ZVe-N7XDsylanI_Hs=": "929128000000", - "OZ3BVbT5EY9156A6iEiNRF1amUftWQ2LDzwLyzBYeV8=": "3738539000000", - "OZYvBWjAmpRkyPRgT0-IEAtM-BzrpzJrmGYxfbBCS9g=": "813685000000", - "OZg8_2i6ZLgVk3Pcch3dM4frWjrTr_qIZiXKkgpu6AI=": "384938000000", - "OZquXLi4ph_2Yl29IJsV-INFpAF5cqh4HKA211T8BSQ=": "474857000000", - "OZwWyqaYCxlYcB3rBaTuO5zUCerZyZmq3Ovs1-xhhYM=": "666450000000", - "O_68bUTh0NfDUzns3xF69JXmOUsUySTf8TTrHGkVz3E=": "751186000000", - "O_LeaGK3lnE5s_19Zqz3v0iYK2ei7vCE4fAOsiG_BgE=": "387357000000", - "O_Q5ZmUQyjoGcEwkkyOapTFa3c_yc54O1xSSIlrMIM4=": "576923000000", - "O_v0-q_lRzxIDmJzFtka67SFKIcHrgUxom9FIoD5c6s=": "1145281000000", - "OaXNNx_015t9dN4IcIV3VkQrz_ulaPgbXFhMBAB7yjM=": "2247792000000", - "ObIiPFGAjANv5nCazZU5sq9LQUrVgL_9fLehkjexYWs=": "540456000000", - "Obp6HoproD1J4jOc4uzBpRe_pBQi9DciYOErUdhsM5Q=": "396989000000", - "ObrW3V8Zg4Axzltl5VCFLOUZ1ZyBoB-as8LSxjyBE9w=": "3413596000000", - "ObzE_IwS0qLonrHGYg7KL92QJKFhQvz-H7z1F_3jzQQ=": "416595000000", - "OcJ5o8ZZyB7YFdovnhrKPnp04Av5edggdIaCRlKP6HY=": "1363636000000", - "OcQ_EEAiJDoJHmB7R4crbF-_WnjQs1cToOI-RoNoPX0=": "452205000000", - "OcbKwgjOJpspmCg0hC0SWLQ4P8WF4aZP5SXG1Ddn8cE=": "386715000000", - "OcbnXbhxjwMFIOiYAGQPrTa9F72AB2HR3GBXcFYSQfM=": "1538461000000", - "OceI5lAOBnuJamh7jhNp0KluffhA90wikVwjp2PkBck=": "384615000000", - "OcggPCNqKItaQxfST-5jKw0oIewgSIYoDjtgN4dNRdc=": "15909090000000", - "Od2oTwGvvuUvdm36OEj8Ank7phCRLqEUj1hBgrnzcuM=": "909090000000", - "OdHwM3_np5UL9q5qPryGRefM20JrL80StSW-72eXJxc=": "5339950000000", - "OdtoK7pkvoxO6FKPBl9zW6K1JvnZhmV2vzXkrQIrM_M=": "392000000000", - "OdxXD-K6DRM5UuGujFJMdWoZSVaFWiu2M8ln6PixaEI=": "416901000000", - "OdxdMRdV2cOFiF-TVtQBjGZ95zNRI59MI6-F8k6RXZE=": "929128000000", - "OeOnzI6Xpx7pO57JZ51NsPVkFgrMWIC74Y_ApMGi7tU=": "471193000000", - "OeXr2uQY8Fl3hbGQx4jPLtqWkWQmpcWv1EN1l2eZXzU=": "384958000000", - "Oel6227DEMMprC0TJ2sA4umB2jo9MrRmnPkP1JSIUyM=": "377078000000", - "Of0Y3wmf0JU9jI9skCv3ghZ4m1cT2hxUeNRKWpar-w8=": "40624200000000", - "Of60pUvNEc3GLErVlKBUCtVLmkA2epkauO_gi2t8Mfk=": "1874999000000", - "OfAbgAFFaiRw0QlbJp8lkZV6atzOolpPpuoLZ-KppPg=": "2055429000000", - "OfYCxpDP_6cLlSGyIcXINaBs3OojsJtWVP9YU3V7Lmw=": "382544000000", - "OfmlouF4Ea4xYMreQUwzGcTtzeVzgZ4bEgWkzsrwr-Q=": "1267743000000", - "OfmvFBOQnjDlT-TxzQB7-pWO6oiVGBu1Ui9jgATNGWU=": "1537224000000", - "OgJSxo4-vPhIKHT-i084uRnnn7rLktnLhx9jmuRInzo=": "3533627000000", - "OgMWvujyrFW0t2eMx4ys4kDqsbjsNQNcv0BYF2o1n2c=": "455600000000", - "OgXdBspR2qBSKa-qLZ5wF33Jig7775i4uiBkD5iZp_k=": "767781000000", - "OgZT3gz5xSSgt_GBUY12QZ-uxg4lnm7ycg3Iya3YQsM=": "459420000000", - "OhKYnlgRENM2MxwYrgFENG5fpKnRQvI3LiCg18tjlnQ=": "385506000000", - "Ohbir7uTh3gHTZPAWP5_8nmrhhp0ScCaiqOjwXjEPc0=": "378037000000", - "OhoFladLgmcYsDr0CCPx-QmqWnqcEKMmgQOZTIk2wFg=": "1923076000000", - "OhqLfPfnXcrUAcWF6K3gUYHIO7Zy7a5nMcanNjx1NWY=": "3130983000000", - "Ohx7V32tPoADmQpeEfKA4ZagB-YT5d96S2beuIJEqUA=": "413516000000", - "OijWHdUpHIxCbSOy0EVqBFT676YD_yYVisqSJeVZNyE=": "417637000000", - "OiqO9l5Npd4v8DImALAEEzOyfzrUqK4lOjXHQDik4co=": "390103000000", - "Oj2T6-gPS611Br2tUNtlACnB4GXoFb7NND5hXAjFauM=": "698766000000", - "OjTxauCTmi8n23ZvlFu_xBO4C762v2-4HzdCh1lniT8=": "1153846000000", - "OjbBq2IYv5Kem0uwjuPdwBw-3uAytCAJtwxtE7xbvoY=": "842624000000", - "OjhbjD-jMPwdIqrmDOZfIhh5OoZZ4AQjiGPepH6h1bE=": "1927537000000", - "OjspnDldjQdOVQH_dRjubsDV1y-1pHvqsngkyzoeN7c=": "448299000000", - "OkHzj019qks6L-_jM9RAv1obBdsk16HG3DMq51jU4-0=": "384162000000", - "OkJh0RCeuVowuJH3oCknDDmlq-Zrn9PmXOhvE9YYTic=": "3926510000000", - "OkKOx3JWLCqE09MATie5ReHDxUapfdyTfQ90af1baoM=": "412214000000", - "OkhfvNWutPmheEBVQo9wDoEj61ZZF_hfTuXFpzTL3jI=": "908685000000", - "OlANqYsB7KV9Iyrzd23vyCquQjwg701TFg4w_V1gKZU=": "1157231000000", - "Om-a8YOOrWh_Mzh9iHO7f_NiHNR1tIFxE86weNcbw_w=": "455927000000", - "OmW0kLe1-K9FakWsUq3HpmCqFyHPgqgs8InH3guQ_FA=": "411085000000", - "On6MMgqHzgi-yd1tlWhVBAn_tiewHvCHm33RscZjztU=": "385505000000", - "OnBtylRjYPwrL_BBOYL36PDh-WGrGAi8tOklhuJ7XhA=": "454545000000", - "OnlxIjIDLpunmuC477d4jzrH7CKM49DhtzPeTaGD3o8=": "16538461000000", - "OoNMGKioFGwZALogXVlg5kl8zMjCXRW5DCZzN04ZqnI=": "2074563000000", - "OoZ-83c0-d_Jg6wD7i0JNX1Tc3pLjtKK9nzrTEDcWfQ=": "1743183000000", - "Op9lOXRcEJ-8uFvlgawooiTE31Id1-t46BLVIPH838Y=": "384615000000", - "OphlH5ObX-JZUFHoP7UHlm-m0S_397VDAc7HIBLVQvg=": "383557000000", - "Opmx3POtosZq_r5IOcI4Nl0we25RYLKVe5jmq6328gk=": "391885000000", - "Opnf1_-vxL4hhFCB40MYsBx1VIZ08ytW-sATVJTNzbY=": "4984087000000", - "OprOCODEigXSTZ53R5kqpUbqFvLGZDTQ9YMQOTaauT0=": "412720000000", - "OpwBRr89spPdg-zAYMG9_LF0Bs3bEWbvGUFE9GAkbE4=": "501235000000", - "Oq-cOjSsKykQWLTZ1wAIGDfDkveNDywuSF7w7qnGTo4=": "771145000000", - "OrPD8m0VvUAdXLFHs2okjRub1vIR5A8ISRrnuDRtZq4=": "384615000000", - "OsRF8plVPTsxg-coGBlduF21JVdGNvTKG2GydQSZVXc=": "384615000000", - "OsdZCzWll1rFvGECjLYc68r6fiIul7xb8NBjQ-j85VI=": "3838930000000", - "OtDLrK8o99BgNr05OIA5gYj7g-GElqKRtUDW1dS6D54=": "391797000000", - "OtsSE8B4PxX3OTTW-SMP0lcdMBTDUVwc5vGOTqy01Oc=": "470856000000", - "Ou-7xw-JRQQ8YumrZp5UZXkZ2a1PX6mhksmbshqsoAo=": "519272000000", - "OuE-mn1jFkzQCcGh60GpRxbMpZNj94iAHLX8xuRQGiw=": "961538000000", - "OuL7FWeLRxipI1UWn5WdDDeWYuuS-F7MHE2bypAWOuQ=": "1650176000000", - "OuSGPUEiRkSVUNUe6UENr4juvyB7FAOoiyl7c-l4vKE=": "1905227000000", - "OuYX7soqSMyE0mN4cKO8UJVJ5L2Z0s4pY5oDMOwIXH4=": "2093237000000", - "OubqGBVRX0VGxJ3rg1orwl2ZjV0OWh4aBliJM_rjt7w=": "1057692000000", - "Ov4WkS2Yv41Q6jkahZ9dbub7udMJTY_-SDlDwY9zuBI=": "384057000000", - "OvLdBsNrMS1mCIhJBtnyX2QZArTcYjKGhUrbQpWDteA=": "2500027000000", - "Ovokvhls1-X1tluEK5EymbaTefrLucgPnJ8N3bCqRE0=": "3795956000000", - "OvvepSCE2Optm6xWslqp_lsGlgG54BtcYiSPXsxbMk0=": "2463927000000", - "OwRebX6U4W2yHRu0ZXFNWJBo9I3an1Ntr1u3PnkoxiQ=": "423370000000", - "Ox2Y-zrnS7QTPMMDWQlppRGLjLWpfhKgNxZVKA2giiY=": "385506000000", - "OxRwkfK4SXSy0OAU2aplYe-1oS3_0ijvXlde79E9UyI=": "376209000000", - "OxgxmCfNKjb9IaHUO5mnmqWpjYN38VtZkHByHW4ogIg=": "379260000000", - "Oxyl6o787OTq9Wa4tMg37oe7YxRYG9BkkTa7Hd1Q_b0=": "426403000000", - "Oy4ZdqMw-5xcjDLcdDv104JQvlc2U8nDWuxgOubFP3o=": "385528000000", - "Oy5qY41enNBG389sPMfaXVDLbU5dPBInkK7pnlPDXdY=": "400057000000", - "Oy96eUaCYHi9KqGBHJaj3Pr-EAxAp8WH_3CjV10Uz1o=": "5769230000000", - "OyBnkGP4bi7BHHeZkyk7XqO8Tv668N81PuqlOa6Yvzw=": "640455000000", - "OyNMQvycfRk3VTa8pyodtFYpQILLcMre_kEHgBk18AU=": "1818181000000", - "OyQLYRBleqn5LDkivcaTbzQUyeRYwkjn8L-opO556-E=": "1156519000000", - "Oyq5_a8jzlegv0gKuc_k1UG2eUyljw_fPgG2OEpsTfY=": "451943000000", - "Oz4oDe5mVrfSw_SV6BFtCy0UWBIho3mJU92M4xso5p0=": "399476000000", - "OztuQreGcSKuspO4ybht_i5Lz6TasiB_GCF0k2uQOaQ=": "3856307000000", - "OzxzRB8pT8ETpJbzEGixEy5xNzYJOtjf-Pl0q7XKBq0=": "885940000000", - "P-qrAqLqHQ_m0xNdiaQcieXjb0nESjHe2k6qlyS0gyw=": "382930000000", - "P04FgWYeEvhA6zlD6yfWI7rHszj3zGzUrnOWHLp8nTY=": "3824448000000", - "P0ES8zQ7eCpFIeefQrVFwG1cMpzgvZ5OgGhAj1694w8=": "1923076000000", - "P0HwEveYn28wDaBQ_wlgJ05GLLJZhDj46r24k5Gkx48=": "384573000000", - "P0KeeQD_W2teno-b1wTZkScHhtwKRRSirQXfFfO_LVo=": "14620000000000", - "P0N3M8bnqGy-w1V4fyjRVV5lPkEUgDFh8l7ck1lx350=": "386600000000", - "P0O1o1AeNQ2QfuMLpfqY5wIRlKGOQKZ0E7LbdhH1DuE=": "463498000000", - "P0sVkOvxfYigM9RWxGgvuYH-T3c_WznkrJSQ2W2bMdg=": "380527000000", - "P1O8pBTZI6O8puHEUi-4Jw0yyqMlg5z1ICbBNVcGI6E=": "2001345000000", - "P1b6M5EmVsnvoja9icIloWx1n87AxO5Zw4ROIebewPw=": "384153000000", - "P1jTweqI5cyH-dhmvMqyVwio-eC_1mo7LLd5bJXMFiM=": "769230000000", - "P2MlPgzDiFDmT_M4qnwiToRLE3ecDaNJp9rHvCBALUs=": "1153846000000", - "P2v1wIFQ3IscjWoUmUy7FqSGGOIcWN_e8G40g5Z3L-Y=": "7692307000000", - "P3kRagAIB-G7r7M8pdwNza4-GFMn-1mV8qBi_UokrPg=": "832691000000", - "P4ATi8XpiRi4y0HXawp4OEyteye35s7PrEqwKZpoAJs=": "460776000000", - "P4Nn1xMso3yX-iwn7VswMqdMZxGulFvlugQOL36KF-c=": "386546000000", - "P5ZvhIYVdbUNW9jCHaec3-2OwQsbaKfeSrjxNa276Uk=": "499999000000", - "P5rvgMIX3lAazPkFEN5O21lCOlAS5qgHW-EWrfmDFP0=": "575059000000", - "P5uU6h1s4Bv7wuk-_E9xstndvtEJZ7pKCi-Q272M4_s=": "999999000000", - "P6-xKF3Thq77xkZ8gTlor32aOb6KpTPcow1yQJif59A=": "833347000000", - "P68on3cg-AkHjcBDqtMuDFwRwoA_JaXVPnTbCS_dD5E=": "465144000000", - "P6mxQORbvQJZCiOl0s3qs9tWIq2cg-EQCHcvuG8p8JQ=": "461179000000", - "P6n6aqXK_9_BHI5ynctqXJbAikZlk-k1k1H2AMEM4fI=": "1366800000000", - "P6wB2hb4nELeKE5PND1xuvBjwhkOwo-gGb7ynoyfH7E=": "416901000000", - "P6zWwPir1DNF7iIObXS8JR8rmXjLSXZOQ6aYLqhPKjQ=": "407469000000", - "P76nC9QhChPCKP2FARMS_eWO-2Xk39WK-e7rHf-kw2Y=": "407692000000", - "P7KUGMaa6DtWJRzD8YQlEnfbborel-nveVxeo_2fbhI=": "8352615000000", - "P7P04DMg_HdIFFeBCqvEph2LEPZXPgLtv-NK0EOEX94=": "785636000000", - "P7QqAqD_q3xuM3fcsOq6Timdqh_r8gfhbaUabj4wY3I=": "1156522000000", - "P8dWGTQRzdTx7bmp3aYd0-2J-QsGwYI65Drldx5pOaA=": "384615000000", - "P8noZtvPjnKDzBR047vAeKr_regQhpDCZCM4Eoycjho=": "382691000000", - "P8w5N71S1a0UTA4Tiv965A6tGk8nTtju-pU3nMcC2Zk=": "2224621000000", - "P9F5HTq56Mk5NIAeeqywy-nlFnaDR0hsAxDFXn5nFHA=": "1145509000000", - "P9JIH3mLumZDTbF4TH9uEbAj4qGFuNrQvs6W6yNnfX4=": "597896000000", - "P9ioFspolkvURcVBmDBKmF4zjSBs9LSy7iTnAU8ZSgc=": "454642000000", - "P9vFSad-M4EZlZzFoLXdXhQoFxu2yiKCYrMCFNHEL6c=": "464704000000", - "PA5SJpWSeq5NoJgqboUbC2mLpgzjGtLCBB9cW8Nd-cQ=": "784228000000", - "PANVgEVkeeDNY5BeUvYGwxn724mgPpoD938QWy1D7FA=": "847697000000", - "PAuK-DbcsJGf04yItaaIaCejbwjJKyDrqbN-qHgFMIY=": "391029000000", - "PAzYA0hznPb0mgrruQCnPrT0plp2vPztWUjTeALU480=": "2083333000000", - "PB10VpKLMBR0_BLTOOu-HbC3JK-bIyijFlN2I-ax1Xw=": "1499999000000", - "PB1eduSDhB9WxnOybBje3VdLIHfc4zs0dZdvk1MSQw4=": "384615000000", - "PBCDZZ3MOGN5tHOL7fEojwbbyKzPF7ubKiufIA6c5-o=": "769230000000", - "PBSVwypyUcq7WZI8sP2i7KfcKZ-NaHFO6kCBudZQ_UM=": "422561000000", - "PB__X2Xu2eMGWAx6hy1cOuMmFWDbJ2OmxucP7-b0gGk=": "669573000000", - "PC6FMrkk2xwq5b6mkfzi9oHYLc7fj1WzdiUQ419QWdQ=": "3702172000000", - "PCAkWXd9HiCTWFVAod5XMlEQ_OMMBMBTzEKsCytIu84=": "455600000000", - "PCIL26GRgGP9N4DcYp8psIdi1JZmVfn09TYQjIXfZjI=": "4580108000000", - "PCRofGYI_9Ym9QJ2ZGwotjRkXw7HuXMgeuiC0JX7zuM=": "387216000000", - "PCTO6SnXi9mYNlRl9beoxWT5CJjT5D8Z8UpkyOGE8tg=": "4556000000000", - "PCZTXoXpBQZYDSQWKhycgmZSKSVGi6_WZuJpmMtb0zE=": "1851774000000", - "PCkQjJDBvKtXZAhP669Me2myn94wb3hv1-j6t-cjEO0=": "385671000000", - "PDNTl_ny-lw_ugVhh2gmdyJ1bbIHiSkbFIZscjh-ZCM=": "603846000000", - "PDmJGv16Kf-AW6NPa8F1DvA8b_3fXXhK39dq9yVj_nM=": "999999000000", - "PE76We48i-qUANptvhflnceE4OZvRSF-iiJlP61a-QA=": "1153846000000", - "PE9zBHuUmoP-gAdo-VBvaXnMHBq47WmjLqmo9sCG0ec=": "460168000000", - "PECoOX_noSJ87ryS_iLsp-bM8r9y7OVVN6n3z93Ehc4=": "423074000000", - "PEpZ8ANEuCcZCINAjIzp6af4tZ1-0ET_VO7dpEdAQag=": "3845571000000", - "PFkUgwPihZJ37f0dcptnHspc3erYcNi4IfFOqMpo5mE=": "399604000000", - "PFrmiQe722FM2JfPz_k3bsWJPwEL0l69TKEkvh_CWrA=": "1519714000000", - "PGNIK7hnVRvl-3i_WND3tmu_e2AtWLtChPqsMkz360k=": "1153846000000", - "PGoQuxuUKL7oUHFZAbL4VTAaPVPVk1n_Vx0Yn3Ds3tY=": "771600000000", - "PGqjmw7BvaGcqaWa_n5axQNua0bmTqyQEmWGGqEBdN0=": "2003307000000", - "PHO26FbFrg7MojWLRpTSQub_O_NrR6-7rjFDx_kLDZk=": "2641305000000", - "PHQK-LbvFhzkwuUxGSFieyP5JjRA1qA5QIeq94wtO6o=": "386960000000", - "PIDhjGRzodUPX8Qz4EKldieMMgwkuhoM69iGs4MAvUc=": "461649000000", - "PIUtO9d11kZ5s37FkbZe74IQEc_YvFC38NwyYATSRqk=": "1671760000000", - "PI_IkEPC_XKmRRu7LnREwTW9TRQ3V-OkMdwVeeN5LVo=": "1959916000000", - "PK9a8hK9W8N4DtQnzdeNQ9r5lAM0KxJbNQyZ8Ab8p0E=": "488082000000", - "PLS1gd389tC1siokxyCDWEeKu_oW4JQvSTyMUwVfQGM=": "385506000000", - "PLUSlM4ezYy2vNBSmDoORTlPcgaiiL2CT-FADyab068=": "465144000000", - "PLcVxrMDQ0qzUbj6bPfz0csZ41Cp5fKWpWQMWauzEzA=": "648033000000", - "PLdXNFg5zJyGlV-zotmYOQ8Qg4QFDXD-66l0R1Az3ew=": "3741282000000", - "PLj_B1nAkP4Hpo4m_v1SFVELD0A5ynqaoMxPrGEKVn8=": "493696000000", - "PNP5kVsiivpwEeMybyfunLJFlkl-wFdn9C65OkgVv3k=": "379344000000", - "PNUDIwDHiUiRfeWy8QNypMN6s_Ik5wvOsrboDH6ylDU=": "499865000000", - "PNhB4otDzAS2hXVza1OCkf2K0xQtYvbMulVcQf0ChjY=": "464872000000", - "PO4pZVWZ7y9YKzRPQZidon_6ng4XBVl0szsoqS-VFUw=": "5651783000000", - "POA-pueWYFiBlUBu2LAYihuKqgeBmVDIcPWn_24a6wY=": "923712000000", - "POQdaL547lUyW2mh_MsJ-NDBv2D_gbUUfeaLycxmAvc=": "357939000000", - "POVdSSSTs0JqZ9ATfHQ0iljkgPoNE7Zlw_HS9I5JJJ4=": "422696000000", - "POZou8zoFvEKCtLefWJewQKchK5F8Ki2v0O6SEpHfcY=": "389613000000", - "POc7R2ZTS1gxH8_RaUdx7SmoSUin5BJXLDsi2lIy_A4=": "580014000000", - "POla7poy94Z00B4en-2WYTg1Mggf_lI0OcowlUpg1QA=": "453050000000", - "PP-HKWstDSwolO_2HqZIhcPH0hjekzJ9Z0o9uFdE6fs=": "736923000000", - "PP2gqIvbTg1dlGQOzVe-a0KZTX1WWcxEaEyEpmIBwI4=": "685447000000", - "PPD2yCbyiT2tutr_O2tgg5ZDx74yN_X0zcX8mMUCemc=": "1923076000000", - "PPQqEXkdLXUw10WMoamfOTrjDwrHW4Gx94MkdAfGKiU=": "384615000000", - "PPT21sWo8wsGrrkgP72DuHwflRP3-103JgRw5HCJYTQ=": "3708922000000", - "PPlTLPP9Bh8yA09vHq3EA98QKzig9cOxU4SmiyaruJ8=": "780474000000", - "PPtZreXh3SpdjlEAt0wmk5Krg7BAQzP7dGM0jbmnNXQ=": "7408501000000", - "PR2N-9ePNuLFF6CkiR2FXPsBDkp4-uH70n3EsWfvpNY=": "384615000000", - "PR7aPtQGuBpJp__xfN3h_Tr7xnNsTcFxH48n9nFshHk=": "686236000000", - "PRlfkWsiGDdQcdTbKyvJDeJJR3GI5b-Vrtq2QxNT0C0=": "419459000000", - "PRss9QX9KYCX54mrkjkbvUFr7Im2FTr3CFvYTI64PqM=": "20921509000000", - "PSHifqpQhuLV4B3JsbG63jMH6n39zqCGC_CHkhrdVgU=": "5007593000000", - "PT1Nss6vxHMICfcnz1b149iQLxjyyXqYQ04VvJo-zPY=": "1250022000000", - "PTr4_pRc-K_1NVSQmsxYV4vD7_GtGWmUZoGmBBsB1-8=": "481965000000", - "PU4zyzih97w4RPMa9rapLyvIg6sMQvq4ze0h6wYl_24=": "407469000000", - "PU5yY9_SuwL5OwfdVQJly56LnCR-twklXY8AnvVkUW0=": "530021000000", - "PVC_meLi3XCsQB2g_obrhAHAsmrmQKakVyFzDhTLbH0=": "384624000000", - "PWfLuPjurg551fYMUxRoHQJNjnq2oG7rpsf9uzTaA-Q=": "1963173000000", - "PX5L8V09nYBPP_ikLkf9RJopfcwJdxug_tQfRvBs8og=": "385509000000", - "PXOmffrXkVIQmyYxVz6WzxmDiUnj3f-QObor2b4DlL8=": "831835000000", - "PXWqzkKwX3yRaDZaceEubkRhRIpW52elRu4Gg7LIJHo=": "384615000000", - "PXcS8rjo2fXFjI3fuym_-1ztmsS6blYFTn-oXAWC_lw=": "769230000000", - "PXosCLFmcSWB9KO_m5hi78SZF2ab4uPweSsAt6190h4=": "390340000000", - "PXql-raY8pryCHHxEJTtsxPepNn5n3d0cez2soxPTd0=": "905070000000", - "PXvB_QlqwVcBK2svMCW6N-gQ0N1dThExol4LO3fDkIE=": "385670000000", - "PXxR4sUiPtY0MQL40WeQoMiLek1TSte_66K0yikCjCY=": "384680000000", - "PY2kReDQhUKa88Hn3yBIHgROeZDEq2KgTdMkGN5zIlE=": "1557767000000", - "PY3xrngfsE1kzkd3svgrn5XtKHyr3T9nzb9D_UoiGN0=": "499999000000", - "PY6hKQtlxqjk43bhX1f_PHdEc8eL2Zq7JSTORhdQLkw=": "384615000000", - "PY6nzWO5XQv11ULQnDxNpj-bHcMV9KibEMUa6kR9jXE=": "519014000000", - "PYHUZo-5s0iEP4GjydIh97eE3iiJJ2e5sCuqVkWdmIw=": "385507000000", - "PYNzCwvW_llEE_OnO0mhlQv5enBsvakb3bDp96fYW_g=": "377378000000", - "PYUOZDDmQ3J2Vr4A7nQz8IgzPRmAmFYDe2ppu0QZa6w=": "464533000000", - "PYdnX85_2DIQnajIeLP9WbyjnTihyI_wOM-DO9R1hoY=": "671450000000", - "PYgqd7wkJqT3zfwwePM4BuVdsrinXZYqYToxc9PNKLA=": "458281000000", - "PZLXbpmASDPPLmevuiAVyZfO739xa-2xiUhywz7EDRA=": "1249999000000", - "PZ_REi5YqO29eremRxHRF5crRl-cvfU103mCussB_ls=": "423370000000", - "PZa3HIOEyXPFJSEQghJSxNW_d_Z0ypkCzfQr3mP1FUs=": "471164000000", - "P_RhBn38gHfsnxF7DaPncohHpIVPf1WNSm0FD0FEySQ=": "2307692000000", - "P_cz8HxOZL5AoQ3-GrhfudUuDv7wNs4a_QwG0lIc3vY=": "384605000000", - "P_mWgYCiusMHz74oSlA1PD2Lp5ws2SptRAdxg8n1uJI=": "1931762000000", - "P_oRf9tmFKhLTbIf-vbCq-0fXEXQgbq4QeQ4CMssFJg=": "1249999000000", - "Pa4gmfmvepyQ_QngC1SgSR71ZuiBGtc215cCRbo9B8Q=": "415629000000", - "PaXOHU_jpBzRT-F3nDAlMeUWHkbZsIR0KRdcDazRrlE=": "379307000000", - "PaYRWk4IKeRSx-Etz-dnmVzY6YMY_Wtdn3qPfVSO-6U=": "3705556000000", - "PaoskbcBx4bU1XDDiGo7Q8yNJPoMA0R7lqkiuYi1nGY=": "897817000000", - "PaqB2QWKW_Pv2q3r2HAcdP2ysXXerY9D9o0OXertRwo=": "916545000000", - "PayWrxt-6HuwOENIS5jwhZiOTCOjU8RWuPh-OyWWAp8=": "384615000000", - "Pb4jcY5qjXd0lo8WyrTwQkymQAQMcLXuIMLkSQH7QyA=": "6910574000000", - "PbB7ludVoOUO2Zjl3crKGFfzZAnOUoPq61HIdCFgfSY=": "461538000000", - "PbkAc6V001nYNLzvUgIhxZZ9rWAULqpVYb6B5_NX3yA=": "1666666000000", - "Pbrso7GAVQ3oGt8FrQpI8V7e_wtGzxwy7CDKbXbYKv8=": "521954000000", - "Pbsbh2Y1dFxeeTAKnYmOi5XqHJbyNwq3gRmr3jfwMX8=": "766875000000", - "PbtkFsfIb2v6px-Wq8liVm382pA0cp8qGtF2FiJXB44=": "384615000000", - "PbxNvjsQ6zo3OqplK9HDXZfPMzSPqeoei5kc3YpNPVs=": "407808000000", - "PcPqJSQDn0FQzagnU5KZpqNkpjR_JzNchlCwraSjtqo=": "831431000000", - "PcTblxFYIaGrFVVHZkkzKxW9YROpy0pd7rZTs0q3KJY=": "464111000000", - "PchzOCW9HAQ6dS8HwlgijcUIDAscOFF6KHgNSFXXJ7o=": "384615000000", - "Pd2oc1Ba9Oh-xl0jBCNnM-MoAGhdE-8IGRn1JER1-zs=": "1153360000000", - "PfZxH6UPd8FV4sG7-TSP-WFLAHJgHusi2wRLXksy9l8=": "16724874000000", - "Pg0zZqQ6A7-4n-GZ0DP008wQ7e_Nb8_0VooF28EqKf8=": "384615000000", - "PgYUrQ6uqxaP8lctumEgVPmQE2JgRwTWrlbmWPgRZfA=": "490217000000", - "Ph4xr6d1hs2-WcceYNIv5r2Z0AK2qyVwPQ39l-zU3q8=": "1666666000000", - "PhJrHhPcFMY8HO7sA1nG1GsDrWrR4S4DRu2fad8f8Oc=": "810313000000", - "PhKpkKr8qchebpcQxzqKOgeg1F8wSpEgMKAVQsMEH6A=": "925649000000", - "Phu0Iq6jr-RP2ZIiy6G3RF6sMdYkoYoyEF0NyG0bU54=": "4049792000000", - "Pi6QxmCZ7pOmCiGb4xzoA1iWC1-w98T9PDphvaclptA=": "576923000000", - "PiAxp7NoV6JzxYRTVI5_do1p8YJueKj0GMKGIs0h-cA=": "1923076000000", - "PiRdc2ugvzz-gJOePs62LM1Z5700MhPmRJYw8Pslkag=": "384615000000", - "PiTFVdlJDU7g1ll8Z8ebM7RFDRmBTZE1ptOuHHaV-uo=": "543723000000", - "PjDN-Yp_35DIhdqO-faLmMR8WG0YKLX_Vt3a8OLXAl0=": "2499999000000", - "PjKgd4gtTiOxWKkFHG6rzbDKjBz84thinIjfdW1fGU4=": "1563772000000", - "PjYoLfB91yWKXAm5-fQPrp7NI3vahw1vKi-7-PnVJQg=": "384615000000", - "Pjq2BjBsNtbDXYktUx0Yb1D7fTEo4Xj8AgOIradCvBk=": "980769000000", - "PjxNTT2MNu_Bd77I2HX3_ET5Fxkaj0tFEejikdGBFXE=": "1682449000000", - "Pk5YAUSA3Z_-lxB6t2iOgjdri2QZ7xlIPXdzxAZCMOM=": "906315000000", - "PkTcvTJSSDind96R9njZ6Jcgnbi589t3VpDv0I9lN-8=": "927494000000", - "PkYPvajYPBuK5k9jWui95WKyCm-4v0W8rLL5wCG0eYY=": "457937000000", - "Pko98dlyFZ-MYIidcy1c4f93n44AvqrcUOqJ_TlFumY=": "384615000000", - "PlggJSCkQN0cB2CVgdIecse6PbRdUUrjQ5OrupmYaYc=": "624999000000", - "PlsQmPFe96ScdpUTbHXUkWSlYjYBXqn2j8fyzjKUjC0=": "932182000000", - "PmHa-JIEq-242etdom_fpFF1bEl9gLusAHIWG_DjyUw=": "375039000000", - "PmLwfX5xb3GBjNv6In85f4AKXFRua-_CwbLGjSEImSQ=": "381805000000", - "PmS5DH4ar4fYshQEUjlcE-JRBQmkwDEA96ExRRr8ZGI=": "2308449000000", - "Pmb9KD5wEkl4p1vEdUuODxyEfFcZxfyTPsQA8MwoXgo=": "3212791000000", - "Pmye5z_LaLiq6ELYmCn5vN3KLCxPGGDZFz1yBu3YJk4=": "384615000000", - "PnAAEQb9X3JOzn60cNhRN2L0Pb36HMkoU8H2ueOsUCQ=": "1240120000000", - "PnBQismEgwa3YrN_iDIym2vvcX1JFewl-pG24f6kxNc=": "378671000000", - "PnRyaPYpp5oiFuaaiRACRTqoq6f8oX1y6QVIC40jkKM=": "385505000000", - "PnbDMkGU9iQghGnmNBz22cDYjRTtvVGRYUQDXCqWpXA=": "386822000000", - "Po4h8kmaeq2QYiRAfMxH2j-x4464X56ykovHy0BjJfM=": "3635578000000", - "PoYK4DD1J0iQpi0zE2DXs5vxNDwGgbGPoJVvxp06GPU=": "1923076000000", - "Poq9BLzbgmeVNA1C7MHtEHCDo01Vu7K9QvMIC9gzVV0=": "458605000000", - "Pp7a17B2rmuLR1j7Wu55dpzAgNAJf7pAOS0osxTHoy8=": "27046818000000", - "PpbGxNWCs9hcTMVWGRjEtMm6hEMVbgVOPtZt-xacLcY=": "1174139000000", - "PqHtj16LrkkWBs2TbJHkiHRRk_TSow4E6y0zCJXvVLY=": "75692998000000", - "PqIGFv2vjI7Yi_EK2iEM3oD4r2jMdcZmelE7h6bQpME=": "438298000000", - "PqVQTIzxjKg8_TyoZGK5YRNF1rWsqZQeohmDEoq0TX8=": "1215692000000", - "PqcxnpjYWNoXCtFHJj8FqoFboT7ybMhIuOxznRJW6gc=": "3269413000000", - "PqhlbUL5esyxUtV8C5VDgjLZQAqjT2PHonA08AEhV30=": "408021000000", - "Pqoth_5wOkU2c3KOx_AItpp0K1-oEXwGcqHyi3480nA=": "379874000000", - "PqrTIwL5QJAXBf1-YqFHo1OiMjT6Pdm82dQiP9-MXZQ=": "384615000000", - "Pr28L-y0w7U0jlxUq2oNDdbMN6LGZAXrmwX9mvfRBGY=": "4946121000000", - "Prk-H5KXAdNkHlKhY08WZsVhofB5e93rFuqdOakUMP8=": "408021000000", - "PslmF0VT6DcoJsYvDSQjwaJ7m8JDIcOofQAqOZlpSrU=": "727307000000", - "Psn7_2_7sIhHDYmUYJyO_rWZPzjfTdP-YAawPgNebo0=": "393566000000", - "PtKsxLl-iV_ViuojXLcCaG_IBYhgP2uGaHPPHUjSLjM=": "384652000000", - "Ptb5iJOkrZhw8Qee7vnFz1b59I197xPAoGF1zoyFnpQ=": "379344000000", - "Pv1Wym28Tq1QdkB3tX3hY33W1HjOuVjW9skFP-Et10w=": "1170317000000", - "PvoUHQTtmMP-GA02oALf-qd9rTQXjWlJQQWWVO97T8Y=": "769230000000", - "PvxtOk2kd3jKre3C0Km6b8FB5CvGGDo3ayE8voxPw-c=": "384615000000", - "PwXsfrtGwWM17OJMArUg57q98wJ2Gka9AZex0_SiKu8=": "769230000000", - "Pwuq0YLJX5mWhmObfAUvAMP8_-M-95w71lZdjJP_zw8=": "769230000000", - "PxD7iClbtPnZZ0Ol3qLi89d2MM_hHqHJVrOFHVNXyUE=": "449629000000", - "Pxn4kYtNBxQzLhuCo3WU0fSa_aB3gyaH6XhfUXKfdWY=": "416673000000", - "Py4BHbEP2U62RqcaxxfMJ_toQ9y5UufhKaf8LJOsXRM=": "382908000000", - "Py8hLDqujqlzp4dL5Ocra64RRgXQ52she854lutL15g=": "772727000000", - "PySF4V0neH0bhCFVls15xutFziTE-cK4Rh8z2m2DC-Y=": "1135328000000", - "PyzoMjb2GnevgwKckzpYz81v0I8H9qcPquc0wTGRnTU=": "2314527000000", - "Pz87T9hgdMGgGeIHJ3rBnbNBauhv9BbWDdm2w_qE0B8=": "448211000000", - "PzB8gehN5mKQxghUMeNFVEbGW-qdurrNZ-oMjPxzzMY=": "789863000000", - "PzD7H5Lmeq_UIkWTfhO-G9rJahIhXaFXSH07rpDUmnU=": "963653000000", - "PzLSgVGy-JUDCUw4Ab5vOXrh7D8mDMZ1eUxBGcOOOiU=": "381805000000", - "PzN2XNU5Q3jx3L89blCAjBTtmZzKXSX3XUBJLcPNM1E=": "4591751000000", - "PzYwW3nZnustHDNcEbXACt-SW-XX8G1c6MnurPMsm8k=": "416666000000", - "Pz_4jL2l8UvBU1tlcSvDFAGLePrEruXAHdoj89iFgec=": "462146000000", - "PzecvS7jFPtIpfl3EppV-aegq2ZR_k5BdyRg61lLdPk=": "1223040000000", - "Q-EsiB8zTSTR8HawMe_xA0sKggZVJ5P-SjtHOFIZj-w=": "384615000000", - "Q-YavYsAY4cMeBnSgIkcqd4AuoVS0qS4rl4yjxCfI2A=": "19525416000000", - "Q01C0pEofBJQAIPTFQN22I8RcT9MDRyGqfLD1cB_Rkw=": "8272291000000", - "Q0CPSIvxVVJ7K9SPRBOohzL9C1H9UVaq4XUE4QSUVDs=": "599999000000", - "Q0nu8hnsRL8s0vkpMd1V9EZURq_MnJG7MiP61mcjnhQ=": "446994000000", - "Q0x-c3zp1KiVKwbnvK_Oq4pHxk9Mm2MhU9JR6V-7kZI=": "385507000000", - "Q1CIYr9AYCa6MEHkYRue9X0g1pLyxZBT3AUvbQU702s=": "451715000000", - "Q2KxiCkyYAwY2vbP_9zZeDP5k8Pq32wtBpdsc_NUykE=": "384817000000", - "Q2p156xmcOM3wBTw74olpRZRloDvBABFee8aoESDbgw=": "378733000000", - "Q2z1IgsETWYV4j4p7npiTnIIzaE36mskx9Z36aDANMk=": "954279000000", - "Q3DM1BlKhDDevXu1RIqsDVZZKZjxuF4SnN__ULXS5OA=": "2431133000000", - "Q4FRb72VJ6TQLQcjHslBo2aZNE0a0exFKFVahdTrJQo=": "384615000000", - "Q4KSuqmlYCtZ7NP5zxI_RsrZ9lTVy7p2NNWovdszlyQ=": "424796000000", - "Q4Lmf9naV2hlqb7FNkHiye2_fTlhz323_8n8VPp_0i8=": "825800000000", - "Q4WW7LkhVYPEC4V2Rj4TcgGEmO4g2owz4SJnR2B36Bk=": "1634235000000", - "Q4dff9sb5xmPbLL64pNeUn5Dtu3CBVopR0yI3YtceOw=": "755298000000", - "Q4tHH3jAYsBJfrOTT3lPSjt0lUVI30vZ5qUznUXu4Tk=": "808861000000", - "Q5-rFfxzeafmIvtZvt2L2Aoph7LZbg4c0rYQL5lJMjw=": "385213000000", - "Q5DRBbh2XR38bHQGEKszNDfFihq1gKbw23XTqbQuaeg=": "1563902000000", - "Q5ITl71mYr52NgIcnXlc1b9yJKWJedreEL5czU_yYms=": "417635000000", - "Q5N0Zu8U-r-ol2pZao3jErVvTsqRLhXCH_dBqOjVT6U=": "423370000000", - "Q5W_st5kWjMNoyfj1F6GZVWZepAYAMAHKFdpNhhPRfw=": "465433000000", - "Q5k_Nw-1BlH3ue-7FOmrGxS01bc8ZCkb3_XJQYAHme0=": "384615000000", - "Q5minQaY3aj5pZNo9KXoO7kBdhWB8SvAQtoW4au4kCk=": "1154347000000", - "Q5twgDofNEe9ZHu8NEIZuoXvuu7xDicJjAzT_FIP__c=": "384615000000", - "Q5uGS3RQ-iFWGpPiuGuW_RrUTQTfG9uMG4sWQphzdRk=": "520498000000", - "Q5xJo7d49_KAY-U3y4toO2sS00pr6uJ6mTMm6vEXBb0=": "2691889000000", - "Q63HozVtPoS-96_QrkGMatWs8mSt9DiV7O5fa92rPY0=": "769230000000", - "Q6PuxRN0JkickIgngAJwQczIN4wD1ITkUUSBaaKlVBQ=": "1153861000000", - "Q6RPaxa0fuwkWtoEJN-sanEljIAPxiHSDR9OvWhaDCE=": "404793000000", - "Q6ge0F8EbgkOfbitdDgQgawcvE0J6sc1anvY4DrIqBw=": "1158675000000", - "Q6ruqlmlVUd5ZLvPBWsO2A5HOkHf8bCqCb_sk-l_by8=": "385616000000", - "Q75I-zUi97IBEXtUCOsKqFsoyBV48tbKFI-cKbUWNS4=": "1783986000000", - "Q7PFhVXjGHBmh-y7woftCpMO9mskVCnI0K82jJJILew=": "382479000000", - "Q7UxWfJMdXxVD9Rv2LfTZNRFMIuPZTAXv95OXkaQB2k=": "538461000000", - "Q7d2AJjfguR4-U5Z7Sqvz6Z0uW779lb7COZdrmMo63M=": "615384000000", - "Q83P6mTIBkwTpdHpGSJ9kTMHT6vVmmoIeAYlHo7Dm3A=": "736918000000", - "Q8fJhb-CkwLCmYO0c_i9IjjjOF_qfj5IhPo-RyA-eb8=": "2763868000000", - "Q8oRQRGyhUqgs8hFOe8mPDpOXRnOQEZGGB85tJUjsR4=": "470195000000", - "Q9NVg9nF28AFq6Gx3Nn6W6ymitykApUmyZe2aeBE5xU=": "416313000000", - "Q9WW4oBrFCzVW5-uA_tF19LswRlV5QPMNwSonQlYXb0=": "4999999000000", - "Q9ZL4iSRfV6zG5GTS1fDyqMDFo7MPQqmarFruOy3PT8=": "577374000000", - "Q9h3IdzBbzNx75PPhBb283NxtsSTpAdeSUXMYD7fVo8=": "2238665000000", - "Q9voV92uIyMAeJO0uL4UcwyQioUFpUdsV6GHBShg7Uo=": "2745809000000", - "Q9ziatUq7qx8yH6r5cl04CX264GR8YsQ1yu0JClxkmo=": "452482000000", - "QA925D48wnZjo7MCJoIJ5IBTJBJJF7jkWnyjbs1vVa0=": "424303000000", - "QAe_-KNff8iedSamQbTQ0qn0cdlt1VjzusABtyh7O4c=": "386201000000", - "QAfKYqiiyakE8BtBl45uLKuXZtCl1uiEgBM70BD4rwA=": "1249999000000", - "QAksYHI_AAwa0B_uUry9TNB9SiBnK9jJcbDm8A_FlZs=": "1939039000000", - "QBy4vcFha_riw55h8nNY8ZhnXd2MpEldq2G2tG4A2-w=": "6509909000000", - "QCHmMtGxAcqpqgRUCZr0ZtGEE5cbnBHI15V_zOyV-Ts=": "1091328000000", - "QCwZ4wmH06YcJRzChAmi8RIeQjjCdmocWRmwVF6Qwbs=": "463315000000", - "QCzIrApA7zGRjVhZiqcBFRko38Za_CrMT7lXSgbnKIg=": "1365066000000", - "QD0bjpxHmzyQaHQEp7S_sBxCnCeLtKoinIGMie475jw=": "1425355000000", - "QDAknd0347ErtbzXtDnTF8yIDg7MifZgLBUSrtmAgJ4=": "769230000000", - "QDcPvR545bo8U5GmEH0OgRkxF6P7WKeHmdG0zxBO2lk=": "381695000000", - "QDyApdDYVUxVoOuantajiueOOsEv77HXYUp7bOABCTY=": "2053518000000", - "QEkFUAoqKPrlNog_G6lGF7OchmWy7sRVC0-whNT-u-0=": "3846153000000", - "QEnmhO-Au9Xe_bglmqQTnrGedkcjCfJQY7kGZ0PHAXk=": "1153902000000", - "QEq9sfI5eOgNmG0cMeYIgaaKtpkCA6CviUAuzL2Xv3g=": "1156517000000", - "QEyHradRj3QDr2s1C8sHE0F8HG0pB9aOZwjnUMFtG0U=": "384615000000", - "QFm5ZT0RJUwxELQoY8SH-zjlEO6ptRbuBk9rv-k3JBY=": "1157097000000", - "QGB9F-DzX0kyj28vm9mU_fLb6OQDY4MbHjolYKbH5g4=": "8658632000000", - "QGjSme7EfsHwiJwwe1si8cItmhpqOw5tKeHPqSncwb4=": "472009000000", - "QGk2P2cFImHFJdUxL6aKiN9IkQdmyFyvILWzAAKSWjk=": "378037000000", - "QGoLLULwJ3LQr1a5h9sGrhel-4tdlQTvlLT_uHC_KvU=": "2110842000000", - "QGtPs8pjIoWutUOwtvtpx0CnRKDBXNWfVYj5gh_cbYI=": "385508000000", - "QH3nXwzcr-W1bhocWsf3NBvOa8FS6nICAb70MmuG4Rw=": "463498000000", - "QHdJIe21D6Dxn4RYjwt_yDWh0U9hXz4s43YCGg10lMU=": "542473000000", - "QHoizjXFLA-8w9sAWUt-AEi7i_yWmwnQ-3TRC3dQQlk=": "1157186000000", - "QI1ZwCLV250s32zSO2u54vG9h5gLdQFKp6sP6xtXhK4=": "404383000000", - "QI2Utg3TPRNe-O98259-w7yYxyIM2o-nsH6Rt-Vk0nM=": "1933203000000", - "QIAWiuJxFm-5j4t6-KVFYpFBYl1DK2b7nuX7jxlXdQ8=": "768779000000", - "QIN4tiWerNnm-HFCdEFWRAqsgktSnS198EWKUrSxivs=": "5052659000000", - "QIpXl7m9pE3WaCnaVJwX56J0ajPcb4X41r6QFAHAb0o=": "470159000000", - "QJ6vY3qYXme9tYbRf0t0J93H9OzrYntcOGrswJ85Vnk=": "378257000000", - "QJMcH5_g-CERliQjS-WRqKI77MQ6No-g3ELWjVGtjzM=": "454545000000", - "QK9eGlmcqG8_GeK6Qyf3Kf_XJOLQ_TBBP7zDw-T8KS0=": "469988000000", - "QKn9oF6enKoMlHhZ2qQflzkX1TF9gU-xNXWD0fFZAFg=": "347931000000", - "QKvEnWkQtH4fX3RZ4OuEyi27M66u710_Jp_oKhrmSdc=": "384615000000", - "QLN5CeFXkkMtwz6ypFwgDwAJZhyXP_Ysx8O5Sv_EEPA=": "1355269000000", - "QLlS8Fn-ErjdtWIahOYm011xpxbr5pPH4RBACWpJvds=": "565887000000", - "QMkpqcgpMdoGkmhm4Pih-xi1X4eVsM1o-8J5yJi6PrQ=": "1156691000000", - "QMl94oiQoT4aXJnKTitZlvvziOaaHAUGnndnF-0_PYI=": "470398000000", - "QN62KJ0riLRwOaSCIqcp76H9cufvo_YD-VqK7_dok9E=": "4173180000000", - "QNy07XybmQwLiJugjM3ffbNpIpsmJaGl1Mj9ypmDFXg=": "2448515000000", - "QO82NsjuoSEixKOmOELkiqeDWHLejPHP5Qwt1XRkNyQ=": "3846153000000", - "QOHjvJjtCN3n1egPMQqen3qdctw1CqU60Y2FTOTfYfQ=": "769230000000", - "QOeZQtpR7oKAYKPZlpamFv_9tdcB2ay7KcIPw-lX5xk=": "1877100000000", - "QPeOoCGZODZZdkpGKhOxTs5qVBXjn6L-kkM_r9FxxKw=": "1923525000000", - "QPhEjX_KoGnL_9YjqMqCsi5oZ9l5026FokC2tmM46IM=": "498796000000", - "QQ9_CwxFAJWLpcKg6FbTQJphXyU_qLaGvQ0VD2MucGs=": "3830304000000", - "QQMmsxvnGHUMeVDgRq69USDCdQI_dMOuzhZJPa6vfxI=": "384615000000", - "QQQB6l5RBK27wF5nX9oOtWLySeWAZNX1s97MHAo-PQ4=": "1026763000000", - "QQrQly1e7UtwIMRS6hwgv1p1roGQBon6O-sFLcag2QE=": "461494000000", - "QQrfdsvswyBWMM3MgI7GqEDjslTFKbLYoc76SCjaANc=": "630445000000", - "QQtjbIyecsP7hHZk47uRgJuGq8yb8lsghkWX0LIHGfM=": "1818304000000", - "QQuGTQNO6nPNN6SnOvDzbPQihf-x-3jyJ7kAGvvv6WQ=": "411085000000", - "QS2tOX7FXyPrQhYz0Nkz4yP8nbhzxDDEyQ3KmKCecyk=": "4564202000000", - "QS6XkwqHH11ZIXg2Tio93b7Osb8ddmNN03yS5ngW0hs=": "386848000000", - "QS7VsAWTD5-aDQF8bXZzWsx2u0YiuFY8q285KOf-jeY=": "385505000000", - "QSWT_aAbPD8Hvl9zYyhkybYyKMcRwd2N42KkWD1-K9s=": "840252000000", - "QS_0e0o4Dxkr6l_5fJp36mS5DvNwnKH1XpbD_PFJMAw=": "847570000000", - "QTAlupNx_m2OUfxXMjF2_ghbL1ZC7A5o2CQReTkIUYU=": "446149000000", - "QTEn2ms3n_oRc6yDktQRUHzZlx0Anw4aQHutNfqOMLE=": "385035000000", - "QTI8mae1wZOaxhsLIC3at_j32rJz2k_MNp8TXl0rBjM=": "1156521000000", - "QTVcvUcNGcaSTspf6USu-f4x3v2szb3koC5dvf6o07Y=": "5084148000000", - "QTW3b_nZqwxAiDX2UPnaqgbupHsUnL6zmeJTAVyf0HY=": "399661000000", - "QUIhEWpb5S0YkYO8FTC6eao1fJc-v5wOtQrHsUDhnSI=": "1153846000000", - "QUi7iqIPEtBF0VyNneAQue_urxJb4_WLuZ7MQcQW7w4=": "384615000000", - "QUkurRE6AY5s9vHqifKhdPKvziA8W9pNorKpEaVX-yw=": "3315000000000", - "QVWoGC065SYbY_A_qMUJPrV5rkX4CNgTYboecqUjAy0=": "4011797000000", - "QWUtQHqtLBEFcXgUiQv6DkfB-z-flixWDbiLc5iX7qE=": "385528000000", - "QWXzSgljcCWPSFOEWC-T4OPvbKVEzKpLMkP5sj6BcQ8=": "390680000000", - "QWlhkg6IOMB6Hqv2RwF5oZdGqcq1-qZHnhjSUYUfLFc=": "817526000000", - "QXFMFPbWHtB4x4BH1eHPBXG19f0bkAjoBIaiTkD-6W4=": "673076000000", - "QXM6b7XmHdl3E4N1yb46381JMqCl6sYQIdWxFtI00nU=": "769251000000", - "QXVV8bfUMswiXpQ_GbR6HyhzBjozkgjWvzfiISvAHbc=": "2079887000000", - "QY3iVkpy_b_vPRsuTG4sxMN-0nwLCwiDO305gOA6hoc=": "411085000000", - "QYDo8HSzmHY6yYDz2fZkkCIlFVUFdEIMYZ6You863q4=": "460237000000", - "QYHjqA0HnqI98naT9W1F13Nor6KQUdC_vYhVPS7RNEQ=": "416666000000", - "QYpnUc8v1PgKzZ2kN-ZsFojFNymRt9dbDl81W7Vl9Cw=": "1538455000000", - "QZC48rsOfuk49QPQ8j0JCwXCLX1UsLgeipiAgExa5Z8=": "384210000000", - "QZMjs5hRz8OsFloTArj7W83nS44azgVtwGSZWN3yOjc=": "10152826000000", - "QZROBp8915awQ05wA6NRLT3XGhYKtYN-B9v4ZLantHE=": "381739000000", - "QZhB4SyBqFmPaaEa9IeDup33Vcm-02RIWFmdclDEAxg=": "385506000000", - "QZw9hs4q_qXhw9xn2_Y4k6wKnxnD6Vd2wCu2C87JCJs=": "412510000000", - "Q_3Gs-x9Pi7YaeRGOW5ejWjMSfwHZP20j8AgLv0JSu8=": "818181000000", - "Q_unI2aV9KEYRf_o1GVuCXCm1vIl2tPeEzTzLy5vGaQ=": "455209000000", - "QaZRrR8Wr0b02oLzRiU528UigBbphaKX91DCoaC515c=": "2314802000000", - "QayT9rnupSo8m5KUZs993Opp9O2wZxCWP874MCRdKBo=": "919448000000", - "Qb1V7Au6Z0g0BiNwJ3y3DjvTUUmWP6GAzxULyZP-NcM=": "391797000000", - "Qb3zb549_ri0ce_JvbTvcCP3poJgCihCk7AFtdrV9h0=": "1527214000000", - "QbJyjC54gzRVYKvXht-tj7Wh2rwzcOXemF_7IhRmFRE=": "411085000000", - "QbYO1303dzl7zQWhgdcvIDPR1pTquGPXWPCfOcncPU4=": "5085255000000", - "Qb_L8yDQWNs7TzyeTV3udraxm-WmxZlLSOIjejMwtoU=": "448700000000", - "Qc_ijAqc3v8f_gfYSY4onT1GDCVHsTLvSkVrDabaooE=": "384615000000", - "QdGKmS_yEd_QNnaQ0jgedW86ssznPyNjqx0QBNoaSEs=": "417821000000", - "QdJa35asC15xNdSQkkIsMMETfXbSevsNqyg_23O48_U=": "385506000000", - "QdMpxgZcb42lnmV_mPIu4rDGtnqvJqV3lO6EUBIgXQQ=": "525796000000", - "QdN8-zfrzMZMU7poYEOJjBFL9JFHfPh-ssaj-yePeF8=": "500384000000", - "QdO8vPbpyXa-WwH-_P6iaFy932Q33OVKQh1qFL4hKRA=": "846548000000", - "Qe8TPRohhmZ4BYSZIcCgAhmeUY22AeK5pWbSukx_T5w=": "462307000000", - "Qf2wQpUe_mkob0C3fHjis1D6BeDG2HjsNMC1zay4HGk=": "715769000000", - "QfvqCDTk21DmmsFPPWoyK9MxqfsLY03GBswmKTTqlcU=": "384615000000", - "QgBtv3zuj53MdKRBZWftXkqReQNNOSGCO60lCQq90_o=": "656573000000", - "Qghjm-2Ri2ejynSfiDFVURXr7MVhCw-dpVsdFGfBiMQ=": "791091000000", - "Qgzw0wg9GNIchrPDOI43ndI9-hUcuKoR1f_XsDNh5eY=": "1458630000000", - "Qh9FyqbbStLu_IEqXhtz3RxoM2YpkUXGKYopqDzPkGQ=": "4427090000000", - "QhanBVR9OYD40NCG4PPr1W4G2zgXBew69YZT0VopUIY=": "921463000000", - "QhnxGTJwXbrAFgHvgT3IgnnsAxq3-yHsAB6fbjpXmuY=": "619957000000", - "Qi0xQmRw4FLUIsYA5KEh3EObEJIIm80UZcYPizgOYrE=": "1963813000000", - "QiRCFLg-g0-jpYlhJgL6wnu6MYXsZo7ZG5hcEEJ-kQw=": "384615000000", - "QiWSDVTgErhXPSE5f_Kq84YIa12fwxsxWHwHajdpLzE=": "2068413000000", - "QiYX1_gZTpo_cuxnm6OapKD1cVT9BVDwAgGCZwBiFGs=": "12135311000000", - "Qid-LCxzjBFiVENT4ArigGxJBstuk6ioWlq57ATnKs0=": "448100000000", - "QiiMYc6lihw-gaUJzatMKY9dpNmV9Qb3ql0GqeKHCNw=": "385326000000", - "QjIIrlzJpVgf9U0AxQx8pke96u9Bdrno65xoI2Mr6KA=": "447427000000", - "QjNFIL790sFZbifwenXrLrRSX7cuLDBjdCHrZ6wG1dQ=": "424550000000", - "Qjm0JvluS6arCV8JGYkzDlBv98rRg3pBUoYpQFk6m7I=": "1155627000000", - "QjoUY-jdVqUUpoJIBjmWW6TZXUKTcwqW-uZ6FRhdS4I=": "1821728000000", - "QjySddH0sadRdtfVEnvdbLPMC53xyHuY-Yv76kOojfs=": "3999999000000", - "Qk8WHA0ZPxingm6riF3xyOi0A8hABWtu0W2qhBNbBBc=": "384615000000", - "QkGv4aSTufij93EhtB6CHmGshEmRlNHEj0txDVqeZ_0=": "388807000000", - "QkJL2t1BmCj9eOpX-1qGGzlimycTRZNgVj9CYTPdXAc=": "481965000000", - "QkVu_h8lxMjkSHzcDz98RcGXqSdFvRK6QdF7eiUS8rY=": "455585000000", - "QlLgkPX1AFf9gwIVm1hPrnBe_RGOg1YeNUbTmR7NkVM=": "3846153000000", - "Qmk4LKU9O57GQI0QI70KDYOOG--qFphnq0VP0nCwehE=": "1905132000000", - "QmqHlRIxYLQZvrudyvxztO5XiNgqcMfIOcjB05Gn3zg=": "469764000000", - "Qms_43ZB6MG-SahnWVj9FRX8fsL8H2en6uYdbzAp7a8=": "9415350000000", - "Qno2CXhPFfKF2eK9WIAPJlm2Fc7bnJ3O-sP75NpNFUc=": "411085000000", - "QoUKp1U1KCek6w8wkkggWIkXsGqDu4X4vJe_ncaVjbs=": "384615000000", - "QpG9IOP34nMJfuUF7wiN24z1EDms2Wo1cyeYsL5gIcs=": "464404000000", - "QpHTPkKTfWDbFTqq8ebV28zBVOG8iYF-emvqnUykfrs=": "1155184000000", - "QpNKMgkRlZEzEJ43IT8EhMchDfYL2wprhsTu9BtOZvM=": "874999000000", - "QqBeTfuvyWZTRiJ9Sk0fucRrS8U49mzn9NaLpIvMSoY=": "413740000000", - "Qr15T7LtIOrhieovVzJH-Z_hig4NqYTXUU7NBQqff30=": "1145412000000", - "QrCOmXUiwcqYH1aPYvQRd60OJcCvrDfrI7_nfsNA09A=": "2500044000000", - "QrFszzx4nXAeOyTPyVV3wQNF5pHR6I7uAgiMt_80AfI=": "384615000000", - "Qr_at2R6ncjAJvYLoizMOCV3VFBf4X4766DS66favnY=": "896027000000", - "Qrs_w9QMWKtAWE7By08FmuhMztgzGY2t8JugqkJWxTk=": "769230000000", - "Qs6WfRfBhUFoTEmER3bGPQDshslCUsmbHK6hUMr2afM=": "534979000000", - "QsG6SmMOWsjOumyWop2XWW2jatCaPrPO7g_F2PP2ZKI=": "464587000000", - "QsqswXBRSnoaGMUjWd-HFN1tqQrTL06FI4WQCO5zmKE=": "2110984000000", - "Qsydinb2qqZTBrwUXxQ0baPx3LnAyDnzrBP01Anaqco=": "3683678000000", - "Qt2U8BL1xlCKpq93o0OnB_TY1jPLQBcFixG6ZDrFiNs=": "833347000000", - "QtDcWC_pWnf7AgmaqMsBD5EVhsOP_1CRk_urkdftNWE=": "403504000000", - "QtH4CkG8DZQotbLFZ8qmGgpZ3x5UAi-haMsOHZ98WVY=": "454984000000", - "Qu2zFm2nG3fUJbSJ3mwduSAUdJf_6ynycQ0DR3LrOkM=": "378028000000", - "Qu8YtXNnvwQ6XLHhL6kChH3Aw7vIpct4zczwxpjJyaA=": "1096110000000", - "Qugo1lJxbX639OQ80gcw-oTJwuqLoO5vuCaYCAhX49k=": "413111000000", - "QusPdkIlywGF2_yjuvRnJxVaz5UL1-p3alrRh76zMDs=": "951750000000", - "QvPdykn0R9p8t-6iSWN1SU8BMmJDrx1yerhk1wyFFuE=": "19999999000000", - "Qv_Yvv86IU_T6cJZB61mcs6sraFcfZ7YmbXxnvhCEks=": "393804000000", - "Qvomd49ad3S3nq6F2t1KKywe-QwGRM2AhIop_BmmZFk=": "895083000000", - "QvsinjIIo84jjBD_MlWWu3HL3Zdz8-laY876_bJhtBI=": "385994000000", - "Qw82hLzk0Rgzh5clvFzW3_v5qrFXVdURfWudtf9QTBo=": "3855056000000", - "QwAtUF8V56ZzcerDef1gAwKN60YiEJptN_rpK4FS3Us=": "4135387000000", - "QwMUcByMEFLAahQp1uR6MaWcPNMTuVJDAr_7G2WiUH4=": "594774000000", - "Qwr4IOaqGjW82FnOe2mZZvU0PNfT8knydXgRKT4SZJo=": "376360000000", - "QwyVrS2vR5s8c6yarN9VcHlBbRAGqDTePRclrdUqD2A=": "395497000000", - "QwzwynpKzCRkr69GcACWGnIVYhfAZAgrTIVhDnJGSi8=": "1083267000000", - "QxT3F-24HT-KxZ-J77ghh8F_ar-RtuHgVoiToPzMhYQ=": "463541000000", - "Qxg-8DVWVKtI4TLKbGlYLMubEUbYV9I-brMZfQ-VvVA=": "2518691000000", - "Qxmyt4ymG_cNJiPbr7_8T57q-FhH3tgKKC8U5H74zm8=": "2503701000000", - "Qxzs4qerwxydD5ZQ9sEmQ4AHUqRd_f36Vj6uK453EFs=": "18181818000000", - "QyGb6LL3_wd4PiWBZUUWjAw4A3QCS1FwNlnUGrRK_hc=": "1223425000000", - "QyT_wkQEXuUh5XdYyhlQeQrcrEp1yeBiAV_K5yrgCmE=": "387002000000", - "Qy__N9ybATogFPS7b0FQxWX5sxWsz82lR_sKCR1k6Rw=": "384220000000", - "Qyl8FO33k_CX72T-Jt6GC0-78jYY-XKY9PmJBJRh7DY=": "11631977000000", - "QyoQL4xQ9CzGIbuL-0xd_q-H823hUxm7HkybPgfR2D4=": "384615000000", - "QzLEEgWFPccFH5m3Me4H5Rxmqvt4jWK30b5rqRqVp6M=": "987362000000", - "QzLnZzpCTHMooe-bN9LU1ET62L4cMNB56pez3_C3U9E=": "425251000000", - "QzTacGKSL3KhendoF-bKz6bTOOq20kAQE3MsigejpAA=": "377511000000", - "QzawOkxm3c-BG8xPI-R_3d8x34HWF1cc6vrsNoOFZes=": "455125000000", - "R-CRU69Evsguij3zPhv_19O_t0QmV4WGWFmuqm4AjiY=": "382444000000", - "R-Pmn2Zgx2WCfeZxD5fVq_fobTWuLiIM-pYxJRXB_WI=": "502779000000", - "R-hHq172oUZDLmxI0oIbYQIj4gqQbf9GW2kRM_qnuOA=": "7856488000000", - "R-pPqjx81in-zQXQDPDR9r5agVMpJoQ3GxfkR9a56Ck=": "833333000000", - "R1mu8ThSdZMLE5uCW4H7HT8VIRBYNPjKusxaUNAlxgE=": "5526816000000", - "R1y41TbyLe5abNyGAP4ofbxugN7vmzcR0X10cSZ0prQ=": "1156522000000", - "R23cNA7V-skDVQ0zT1V95tcLjU3sXGKm70M3f1Pg6i0=": "2257489000000", - "R2F_B7TWrAXeUrUr9ykJ-en9GnRvE6h-_kZw_Qxmgok=": "384896000000", - "R3P6FtVXHdkGbqypvKpPAuMhqJuGmLqTaQQ1eNxH_04=": "385510000000", - "R3WMbJ9X_ZeC0ypgqQDuPDjruC6jKxD-HSUndB632Sc=": "579114000000", - "R3sREFBsb1T1os8ii4LbwKmc0Wo50djZ7qqThNxbfJo=": "442798000000", - "R3tHa7BvmF2hHb4zsuK0-h0esinxMSPEEJ83NnHgjRQ=": "383481000000", - "R3tTUpd6IMxQ5mZTlczbJpwkrIb47OLLirQYRi2oTvE=": "7558248000000", - "R3yaYdPUY0xhvkoQw-LovTAf8xhs9LbgQgwFfa6fad0=": "407218000000", - "R43jSnxV4merUsLvhqva1zgoRqLnNiyezG5XMYnsifQ=": "461263000000", - "R4AGO9KxsDX7ocrrjkfpGUeFRn1Sys2U03aOyIjPt9M=": "1366800000000", - "R4IrffjF02XMbJdJ440Ywgi0AEp7Vn7BaQmHcnOGj-w=": "544338000000", - "R4M-VhUK-e6j9hc4I_aWHFj30EuDDd7GQCN0GEIBx9s=": "832842000000", - "R4xXzuJGojrCPcPtAfIsmPl7HPIJTrugEePjEnq9WY0=": "383748000000", - "R59_OyOqNlvqOcbYYo8Obl_YK9QZ4ZvPcWfozFihYlA=": "1739003000000", - "R5XENhNHsrXsyJVPHY0HnczgdjF3sdlx96k9V2CLMHM=": "2005898000000", - "R5f6izQwHl-JsqZppR8-RRDDAOmFo4WYEzOt8OlCau0=": "384711000000", - "R60RdeB7YNUov4x1ZpsgFEd-RbZ-U1KIk1a1UrDqtWk=": "5845283000000", - "R6FUhgemVCTdafaysFoUcQXz4TT-9e2YP2-W_yzWX3w=": "462444000000", - "R6MhG7iQPDNeT6qmL-3nUnDEzaZ_hh5J3xFoyNfNdqM=": "395499000000", - "R6zs4bwJDHIwaC-m2fLVQmBb6w00Qros04TAgt4xrkY=": "501124000000", - "R72EjM50yiQqfGKEVDsCvwWaF0-lWonkYhCLdr0vY5g=": "3076923000000", - "R7GU_YuGLQENAdFPG0X8ERDf38Fk1mqmTwKQuWNFMFI=": "416666000000", - "R7Iyq9Eh5MVRkZ0TJILxuENdq0-N2xRnegcCBpYlroU=": "384761000000", - "R7gT2tCzE2znuD3dvqfgpdaIob8vScM7ZPXsV9KX9-M=": "484353000000", - "R7kDJ_AdTswFkFhrw8NJKsDTqfqJJIUmWkWHtQBSlL4=": "2083325000000", - "R7yf-Q-180Iln-y-PwV34sbiddkc0gWpxWNwwKHpLas=": "7662968000000", - "R7zSJzB_IO0A6ty-BcCvv-uH34F2pue_4zbnInj5AGY=": "465485000000", - "R81bFhWfxe_hUJAAasOO7mJR2pFX5Uk39yKK8mXhM0U=": "3089470000000", - "R8K1OrckCGTO_Hx4d3TIjN6NpMTc6yGnhRjmIplNKy4=": "416666000000", - "R8NNTXQWW9tZdYb2KMSt7DgVJds_NqR4aFneH0TJuhM=": "2279092000000", - "R9EMxzMyXjjFCsOV0TQL2W7bUDrK7QOY3327WenBWpM=": "384615000000", - "R9Gsk8ZizUo9DaorRc_5orRznCkddTpEWoHhlhu9kBA=": "1150660000000", - "R9QGyU35BlUHIrZJdoFkbGtugiLh3bDtZuamFqWIBpQ=": "384615000000", - "RANcjC4-K3UtKdWvj3BYJyTyaZ4IvbhXd6wObOfYlTg=": "469310000000", - "RAd-3T3Gn064XSGLlAywehJODUGPBsIQnaE2mywduiA=": "471973000000", - "RAw3W8tMXSUF05esarFtPSQ_E2UrApkTRXAOYXyVE9Q=": "769230000000", - "RBZxaRPZARkw9mklFjC28UcsTKqJHxiNgxeWwmDKeBs=": "926781000000", - "RBokAuTr7wa0UwBsA1Hreyadw-hL9_TFP01kuDQXLOw=": "1182915000000", - "RByrkidwCds99qhGq_JMpUQTn9sH-C5r94pRhKW1rkQ=": "386395000000", - "RC4crfAXWLeJmQpyxderMamcyjlfd1WV4tPmZ8idJCI=": "571924000000", - "RC6Yc5bwlM7ytCl4lK4Hi5vp4TgQ4Ort1i2MeHezf6E=": "1244477000000", - "RCFxygtO82qYK5l7n8EgG31lCkjh5p9K1Km61pyg0fQ=": "653846000000", - "RCSM5415-ummBnLy_aKp7NkzhC8cWMzaj4xH36y1Y3Q=": "504195000000", - "RCl2K7nqJWqEnAulFe_aok7jFdXcgq6QA3S-swcz_wI=": "416654000000", - "RCv-DwAUk9dxsbCo8rBb0j413Q9YK9KAc9dKFiTLVmg=": "384615000000", - "RDbP1QxEwx8DiblxxMaX81_gV3hH2TOny1hIGjmxXRw=": "454190000000", - "RDlHBBci5L6Yc-Le1mHFocdl8mTdt7qdfwkgUPswmnE=": "2055429000000", - "RDuyu5eIx-yq-Lyu8JmTZ0LcKpsvXeJhvPrKqX0iumc=": "423368000000", - "REcaLIdBnzi4IXVRKK9TnyxIv83jOcgOWVebrLfhBBE=": "381805000000", - "RFFMzYd2Bt41SEMq200IL_ij5rzY7syLBBOizPKcP4c=": "3076923000000", - "RGuUZL3S1I_pC7BmbF1765OKhCxF8p4jBpJbAMS7Lj4=": "422516000000", - "RGyhaJO0AbLRMzUAQn7Lvd_ZBQ9JxanKk2Jo3vIhA4o=": "1923076000000", - "RGzitilzsIAnbfDm1Rv9-gURJJCzqlnfmQCvCsFgU1I=": "384083000000", - "RHXj_RbfzUhSNRYvdoNWq-Q4pw1iMkBYGUxqMgkf6Ho=": "1927431000000", - "RHbh_62P-oRN4kdP253aHv-1tGYu5DLgJCK0inVUXkQ=": "384926000000", - "RHetzSOKs58F8PUP4UWXMdc6g8Ev4HCqgiJdltF_ldY=": "1252904000000", - "RHptWRYU2EMggy-AE-PGVIhNo7zwCfnQFQOF-mW5Z5Y=": "1918603000000", - "RI07SHPU3JGOWZm440z-dmg8xETXBlUQTROB6hMCDXA=": "8781915000000", - "RI4Eo828mhN7vJIBDN2iA61vsQwPvH_0aIUxJuZuwqU=": "963915000000", - "RI8bBMm89K6WKjvm3sACbEi8D_XZFgK2M34TdosCKI8=": "455600000000", - "RIL9KzPamrXUA7NxyzbTAbFZPd1HCh4zJvBSdRiAqFU=": "1152836000000", - "RILTh41x4NONT8zaAJCaLiTDV02iXfwcM5kKY0vMLEQ=": "769230000000", - "RIlkflcMFfBATIZpH0XKVNJxvWdVg3eBCFGNCtWA3AM=": "757421000000", - "RIrBE0AHxRQjlp3FyJdKOtEL6fDG6HQNSceCsPctY1Q=": "381767000000", - "RJ539QXUKbMwu1hXxq1CJJ-7rdiEeXIlliksYOe-N9I=": "454545000000", - "RJPb3nhEa_H614N3jkoRj9uRgzMIRIg7tsJVZXqmeB8=": "462476000000", - "RJTWYnAMJJl85FO5ebZO8n1nXyb9UnUR0oDsipFi_IE=": "2000008000000", - "RJasZRosZ-Tyvhk4wOQRy7CXXIeAYE1E8ztCnyZE7ho=": "384615000000", - "RK5gxa3n-7TFB2v9xvl8QD0bgJ0xMsWH1Jdk50IiKKo=": "1249999000000", - "RKS119TXxDY6nqdi98dP-ztzij2jcafsotvuVFxYcY8=": "3838963000000", - "RKSP2rWvEoo3MuDfPP6nSDzXVjniyIaSju3fuE_ZEu4=": "411085000000", - "RKSXA5-LNQTeOrdB9XMpCQfQ_BhL9zU95BccBzgy0eQ=": "378310000000", - "RKXZ11bhUG8CMTy1Ibd36TYb0nwEc5OASAarIPERrGw=": "423029000000", - "RKnlJBgD9weZ2qE_vvr39doLYky6WSAbc4Ir4jgtY-k=": "1791666000000", - "RL9RcJW0o5eG68K90F8a1VfAucE9kX3aAp6AlJ7GNNY=": "379637000000", - "RMBVYvlAHDPrTPqyDRmjrDhY6-7wSfCONsUURltY3qc=": "384721000000", - "RMmtMWUzmXoRWAXpc73_9yG7Mp_VqTcD_WktlJiQtU8=": "4166737000000", - "RMpclTrGALZxQMjPHaflXZ1G23GS5FUoVmlcGqeoZZo=": "783770000000", - "RMyEBdnPiUS8upevSSTpy02Qmwkehw8pNOUudNuOvmM=": "3863636000000", - "RN80UJse4NjC1GLdsOnMPOJBOEYh8GLlMHEG3gcZKGo=": "1153846000000", - "RNAR2_-ETiZc-p2y6J8ssNvXGPwWh1LP2P7bLV4FSjw=": "2085392000000", - "RNAmFrGQjQgaopmnor49EZxOCr2jlEoS_CpyRVW4_aI=": "378037000000", - "RNHnXgM2cvGvQhyf5-ZOXMz_35xJI83hKq16gY1EM0M=": "999986000000", - "RNXDtiAzapXF0xZYO0E6r54BY4KYif9Eq7w1GptKgiA=": "384233000000", - "RNjlOA5A-Xvjv4AoX7Vljyh2t9yL605zF3v9B8aeQFc=": "3855058000000", - "ROJwh9jZhWczdzUi8buNTEE8-rYLIBeypLFjQm5NrIU=": "407808000000", - "ROV4fP-CXYC0gBI_Og12CTgxHvnOBjgaDY4iV6NFydM=": "666671000000", - "ROg4cETbowbd68i5Hse4-_n6m-cLDmNXfP8XmuAQJHk=": "379260000000", - "RPJ_gKIf2LMjMrC0Stb3SeUPnuUvJOsjxnJ8xdfX5us=": "416408000000", - "RPLtXDKPvmzwEyKL0mpKTB6hmRLFAOlst0osBThwmvg=": "469310000000", - "RPNLpoZUeKhYBYcCoYxleBHDH4l4JeqiqZfjtfNyqdE=": "462846000000", - "RPq3M9LGx3vkvoa-6eUbDtuwdLKf26NtMT87F_GuLXM=": "3845637000000", - "RPqtvfiLpx6IxrqeCCIyEQdsDtCjL_-t95ilS141Tyw=": "454545000000", - "RPv82bG8CxK1TDhchAD8Pnb7lJAx-ExW4f34vqzwKyo=": "1643009000000", - "RPyw-JLyl1UZRJ8PcEDDn_MFE-rXHM5BK8ssogpV0Gc=": "384615000000", - "RQ8KAnTk0pP7U0oulYCaBAXQpvekVZeGQq6DFmlqB3k=": "431630000000", - "RQQOePjT8XS3O0WhO1PLAj6EM4Ueh4f7wl_Yklp79w8=": "385496000000", - "RQcQitHZkvESWDAvSmE1k5AwdtpnD-p7MNwuH5ekqy8=": "495053000000", - "RQgTidj_lXb5sXPKhWjiqLi7uKxVGvGEuLydDA5XmdY=": "3459698000000", - "RQrSaL2fdAGFWQtSg7Y7qNpOwBR_0_904fZtzEEWPS8=": "1363636000000", - "RRBfR8SL4RwGaeBrSa4o-Au8mhys6MjkHhCwCoXVQwk=": "959200000000", - "RRHVD_IWz53HAqP3mTfmA-mm2TrOa3ULXWO7pVjm-9w=": "388825000000", - "RRIvA4iidKkkcDUbeYNRwxcOqVjKqoQktOgkxm3LdlQ=": "1237916000000", - "RRsR9jtJxney0D0c1_uTqic68rUjS1Yqzloqg6JNjRk=": "378325000000", - "RSPWHNtMAG60CIx_91HnZCReldhAtTICgIFq7kjTXjE=": "3144030000000", - "RSR0OD5fUUdNVx-_m1vol6xhEfiMIJU8ZRRdNU3AnUo=": "999999000000", - "RSjfa3YxGCnfUo9Xso-bZW7EgDi9xHcs9kXmxMxLqCg=": "11352035000000", - "RSoyn_030NjutXTQmMUB5aIi_TIZnHwbVjRI_hZug9Y=": "578495000000", - "RTKKqyU1wKIkX05cv14Lbm5IKf2txqGcDa3fWv7ZlT8=": "385506000000", - "RTdl7qoHYIM16o7W8uNvSBVWUmoL05pNXs5CGALDonw=": "1543339000000", - "RTh1IF3ESpyk70RNP_5pCXF6rU58GJV-ZlS5X-XS4Go=": "401923000000", - "RTsaScCdFctd1GeLYkSt8AQsy6N0oCtqUZBdmVIlvEY=": "1310055000000", - "RTvbwfDV6CVilLbqiy3jDKHIvA0ZO_vwus7o4a4B-h0=": "670490000000", - "RUtwEMI4GWM0HQGux-mLA0o4jT6a_A7TmWYZ-L1Uop0=": "386154000000", - "RVDZhMAg9Df96o6ogqwhWNkJaxaqnJPpVwWmL1E17fI=": "381852000000", - "RVFOvMuL9dFesnppvtV-lZ6JXuyukx1YSGmJBd-aMSs=": "1153846000000", - "RVeyWWeN9j_5X-EeekmRS57QgY_rVyPhNioK_FkTEmY=": "19230769000000", - "RVp2y7NL4V6yQYhiJ9BKBcMYIuF7Js-3hpxcxmZHR4g=": "469361000000", - "RW6aDuwvDJ2QNZe01WJCOsgUkhgw8OXoUM-wyIrMT2A=": "2414012000000", - "RXPnST_DoqbKiDXi76noyvzWXavcN2Wpkf3Cxlvn8nA=": "13624735000000", - "RXQq-3GEX0YULoMeHaH5uKWsUXGZHCt6SQAZsZI6eSE=": "408021000000", - "RXZ8wmaw-814GEXOnlhEdJPqOa808hyrdJrXNgTD6lA=": "458262000000", - "RY20OuSE0MVgb_2O3HhkKr0yFJ6lY511xMzEk9-7qkw=": "754137000000", - "RYWisl8nTmCbR-vbwiCyxtUdwHGaIlgR9DGcFVnoKJg=": "829683000000", - "RYoFTFE9H1XPOVxVQXav7a5jaxjq7B0iWcun7wL1H-c=": "379260000000", - "RZ4ioaiyG5nnmFWz6EGomd31THksw_3aURvS5rz9UA0=": "417633000000", - "RZjY9869H3bOCkhwdGh1fAUoEt8eOcZu4PoVOEfpoTU=": "473351000000", - "R_-Hc3xGUmHjd5Zu-SGjQRhPyxOyDzf4Lygi_uMarUI=": "384615000000", - "R_4xV_cY2Pn8kmE1sVlVIwfYhs7EPItPpZPvloWLLkM=": "392307000000", - "R_SqlCRQms_N6fGoHbr8Ey3_Px9cjdnMjgnbrzrYSQM=": "379443000000", - "R_q-pw-cFkhC26EfOFdhaSwO8Gpw_JBcMDW8zy-ulYo=": "2041119000000", - "Ra0WhG4Hq0QHDSHA1RDfC4B6iFrji1ipRXKPIS4X3RI=": "384615000000", - "Ra7Q_m9cMKM7A43iXWhgrMX3wnWJFpanJC1P6Ow21M0=": "2257883000000", - "RaG6Yo_TOkdSki33BOIY6cZsGs25eC9z9nu6uauY6kQ=": "5647260000000", - "RaTka_y8t8E7oH8ED2gz0ZhPCesSrKeykiusDrPhw74=": "832306000000", - "Rad0D8IZDmf4bG4uX0eaj8DGdkx41UapYccm8kfvhFw=": "377899000000", - "RapdSfHgUYf_Eam__LE5_xtybyalh5QmYymNJJfR4tg=": "3076923000000", - "Rb06xDNOGBIquL6g1LHSkoFhuCKIQp_uHpIJvP0wN-0=": "500530000000", - "Rb2mYE_siMM2rfO6YPdPkO-PR6Fjdk0ssx__bwgXSAI=": "1185774000000", - "Rb6ys1Y5lfcYQx7w3In5E8Qnw6DJqPbuXJiSar_yX6I=": "1584441000000", - "Rb7DXtAbKHWgmim0tD-YFoF6FKMQo1N04KWd8_nFeZ8=": "384615000000", - "RbByC4ffGqqUTD5MAh3baSN_Km3EY-rcA-1tKP5QYKw=": "410102000000", - "RbHrP055vtRdLg9v7PF8Oequ8zndYZ82lgUyyrqfvdE=": "452996000000", - "RbLIGtHyJIruk_xA5YMC6nmsFXrzIqfFAe6sBleqcUE=": "4634669000000", - "RbUe6sywrXc3IaQR0I3-ZCRRBiUCxip3ZdoyltW8WkQ=": "8257274000000", - "RbsdxzapnRbPgAehK-fXFc_JnZ9iUQg-Mue_pVSlUKQ=": "463633000000", - "RcQtl_KGRKHL24rQTL_Dg3R-jCCEVWvRKwWGKbO2gis=": "451376000000", - "RcWNGfXW-53buhND1zVOfRVfBYNpUCc_h5mfFhRROb8=": "462594000000", - "Rd1sGPOQRSKwgnT33R7CdesItiPNp_Z1yEpwBZgtNkU=": "384615000000", - "Rd2ex2xCKk1RfxOWEXguL1blkmf6T-yIu6VicwTWhFI=": "1511678000000", - "Rd76ZLURONs7NO7W3fn_fP_N3MkfJ2oEQeoMtTDG_3M=": "445057000000", - "RdHjt4hPq5jNJ6L8usopyvfGYSsxJ8bmN6qBqdFfRDE=": "385506000000", - "RdMTwK6wtxHhFoXbBNa1Nu8BZb7Fj99EiGOk0lUaiTc=": "1163889000000", - "RdNPUxatjU6CEUUJ3Ab00QGJmA4NLtcdagODGKbT9kE=": "539034000000", - "RdtrQqISRtF17EzdYn4TuQk4YXRnqQpdfuY7sh_CyUo=": "389644000000", - "ReD_H-SC3Mx9H2mLxScp57u3DUnMQiGap9QkosF20zw=": "2605189000000", - "ReHsoMsKXJ8alNyKXwUbnmDqOVEFRZsoJAxVZpaxfLE=": "1156527000000", - "ReL8XepsqkIUDmLbH-LWJLE2pRmjgDxwJvlzScfNdn0=": "1249999000000", - "Re_aBcF_zKRDnFPc5peU3RVs7qyYJhk_HrKSj2Q-ZbI=": "752847000000", - "ReetscE98gUhkI2Bqi-DZ0BN2SH9--s2V8RC7p6DMdY=": "2350717000000", - "RekF8Vy6NuXCBKY4PgDkjcz2oMYL7rUUiuxkGTK5kIM=": "458787000000", - "Rf5bFvvk-rRmAZ8CTwJ4eOVUF7M_B7-ADPTSyvTPT-Y=": "577489000000", - "RfFBBZ3WoRCFDRbFtFDPtHpWYw-kP06oc2ODN_5u89s=": "405544000000", - "RfzKoLEss7NsoSp7blMj-IxSKmfEw5OAmUPEgtX1HGM=": "448013000000", - "RgctIXF6pbMYHedHE7Jb9L5tb3daOdfFaYo-S_SSb-4=": "376209000000", - "RgvHJSKSdJt5NIysfnH6mYIL3X-xAYtflL6PnL60z9A=": "1666692000000", - "RhLJfig-9d5jREzeSROLtjbThmZ308Xc80zO0edvCQ0=": "457092000000", - "RhOWPqNFIXc3ZvMr1EzFIeFRqEH3rNpT1hKrjBrk34E=": "1212374000000", - "RhflQZWPyXAr8PoNZWhVzA9rvcySdlfCX4VrgO_FfNw=": "7065697000000", - "RhzHxwZ4LTwmhmBv1Ltmymv5Zb3ww3oT8VZ3LmgkFUw=": "482159000000", - "Ri2H7o7mWBNlbMvGSBujk_GiVnN9B_EcU6vpzoIqHQ8=": "606718000000", - "RiJV_Ri3hjgvxIZab_D8id6k4Th5B1sozBw86kCMpZw=": "379702000000", - "RiP0pGY2mqYHPuTECu6m_dKWbbgkaEEZx3eQeh8Ehzo=": "379928000000", - "RioaiSsAsD2aGSXsSQfSiQg4QJoOTzuxUuuY0n_3hYU=": "416657000000", - "Rj1O9VOHtly7fRl0PlYCkihIB7Y_mDTex4Nf-SdLKc8=": "3543821000000", - "Rj2bSF-jhPQhW_eV6MLVoWsk7nMdiatBo_bxj5831vo=": "7625356000000", - "Rj2kmbZF4cDxQmxMMM2C4W8c6JHgPW64PTSYcd5v37I=": "4166666000000", - "RjL4n2gzFPOShVj8WPo0nLgeq8J4bNHjRN0lnzQKlO4=": "423370000000", - "RjaWt1K8bm9-1ttjHgpG8WL7fzI4wDz-_X-wwtC38lE=": "2082051000000", - "RjgjGHFw82TX1Cm_as1XACdAWunzo3yNmBPtI0Ix0E4=": "944707000000", - "Rk9V-KHNTgzF9t9ey78YygRWSaOw2dXn2fM8Pg5BYqI=": "762594000000", - "RlEVK_D5Z5AWMzMQgmnoaOfkYoA7IEAhjur_Gkgeouo=": "1156527000000", - "RlOJ_umS_23zyf_YduPSBgrgMUk8VhJqVj5-aX3B-gY=": "383839000000", - "RmF_pRNqbXindukl3i8ktWgFFC8gOkq9FgANFLCTcbM=": "382643000000", - "RmOEi4ARK2X_ofIWMLPFfYG7hJoFGcsCy-RisCR6wkc=": "1666666000000", - "Rmx5zW5gKHuFYmLxVi_v2yMMv57aH64hWxnR0Dl-yW4=": "421678000000", - "RnMLu0MhMmaY0KS4iy1Alq0o14tTNJGRikMvnsXiXbY=": "384615000000", - "Rnee0-3CE6HAKDqJ8Ur6bmiKugziVXQKFclNgDgByVQ=": "1539800000000", - "RnivcSQhSLtBSNvhWxFv-0pLspVTZ2-bajzCfwFCmts=": "424045000000", - "RnoWvXAEPyiBERlGefrci0yWg6yYlgncLriQ0q5S0l8=": "747774000000", - "RnvxL-Kqh-02qCBJySOGBhB1EwcpIAHylVp8kjcp10Y=": "385510000000", - "RoGY2Vtim5FmalS3GD2omk-fiysQ0DCceSVNDEiy4uk=": "993700000000", - "RoeN3VL5hQbWOTS7AsXdTvlaimDo3vhqeIQSBlET1d8=": "1153846000000", - "RouKHhuhMAAYqHVWnjinG2fdXWprRYGAshwHN-12PgE=": "468799000000", - "RovkpzQs0RHLvPeFO-z-oqBqSAxOQs27-3oXMMx9Qqo=": "833333000000", - "RoyoAii5q6eCTbaHFlXqAefeKFugzcRE93HzMT5kZaQ=": "461263000000", - "RpVIrsjoYqEdC5fftF4Bl1e9vkKXQl7kYx02oAmeeVo=": "1639193000000", - "RpYPCivbDBbLrRh_2gdUUprArZwXf494SnyL-xUMquM=": "938936000000", - "Rq-_oWBkh0v6hF5NsWZTcWWg4IiuUrIVbFZMs46iO-Q=": "380694000000", - "RqPvQj1iRG_-i3n8inxmMclgOTpWkxX2L_GxdMmfFV4=": "7536094000000", - "Rqs2pYrFAF-ONthWPfZP-UqiKnCRmQWs16Is8enAQ2k=": "462769000000", - "RqvHRqwBUTXjBGh53W6t-n612A1Abb23oKI5hAaoQN4=": "469721000000", - "Rr5UXe9oUxlBPJy0NNWOXONgpFSlaPp6QUOR7hzT94M=": "499644000000", - "RrGoycfE5_P7u62cH1gpDlzI79P20vcoOy5fOgvT6mw=": "13196957000000", - "RrdcIkNTgtYmWPb1MyfbC_2RLi1aMyzKbZsUsEmeAmg=": "1527107000000", - "Rs1J-epOza3DhOr5oB0HJpOi5Xplydx8mDnmIHV4kDA=": "6822094000000", - "RsAkswTLv3T54SGQhNB7vcwlZLYBilrCYW1TrQClnts=": "576923000000", - "RsQDUCY2aerROmcGfWxxzBBlMKGBowlN7AjL3WzQZ_g=": "3333794000000", - "RsTiykkSizS-qD1WPscFXEYps95J8dJxH69FIiMGe1w=": "1711414000000", - "RsdSRYy8KV2PHAdznF1J9MTmbDbL_yWkjzN5L0_SDfE=": "388741000000", - "RsmTymC-PcpeB2izyzairYt128ZTwW_880jSbicqzS8=": "2960992000000", - "Rss3yu3cZRVdSrIHhZ7xgIZ8B3KJ0Xg29i__8zBGdKg=": "416666000000", - "RssPoLVzCY_gr_k_JaIXqCfIuKA_VOhsQVTQGgUsd2Y=": "5499999000000", - "RsxJcaQ8vowTR3zNP4z1JixWQ5qAWrWZODN6cXE2cLw=": "413918000000", - "RszrD-YPuyJnZT_DvVvtpbcIMRTBjz7sabNSyYH8D7s=": "625607000000", - "RtGJEvaOct-buKYzsEZuRluu1-X0wBH_GZ05ek_5L6c=": "2116852000000", - "RtrB9B5onQUIqf8ajPY8p3mHnD19eFXfwsxy5oycA7g=": "451665000000", - "RuGOFuW74HyH1BtqIfUIjEbBX5dU3TzIvt_aPY0fQJ0=": "1959542000000", - "RuSb0mdnO4o9LnHEwxRqe-8Cv9JXHW8DJ9NaSvLZKEA=": "9583333000000", - "RuXMmac5l2VmM7tgtgcSkTeKjHJ3_1_BGKdOzG5T8_Q=": "1249996000000", - "RuZIg_sxUzRNPMkbxJjxeULZXQJHVgI361sGi70FJYQ=": "1153846000000", - "RufdE3AJ6ewWBZK1m6ZZYVmGgx86xuOigo01J-Ckut8=": "1503082000000", - "RukMNPnnjJzfuQEFOlqdYPAbiRQUq1NVq0N3Gv-qj64=": "2884615000000", - "Rv-LWuTGui7RE0xM43kxGxGeTIZgzrc2CYIBfUmrAwo=": "769875000000", - "Rv2Jf-Xo1WSMjJHNkgBqdP4Y6ZmMKItkMoTjTVY-NXc=": "691282000000", - "RvBHUmuoFa4Po3LJ9Zr-_IN-35qIiWusJCf8meCO5AE=": "1181818000000", - "RvN9yBrewC6Y7Bzo6ja9UMNSzXVxEQJgDcCUk-P69q8=": "3846303000000", - "RvRU4sNYlwJygSeK-RQk1qSg6CSNRoZyLtbE4Lt87K0=": "2119079000000", - "Rw5rwjd1fMCzRSVgFbujcpjWgny7lMliKNsHjU0xYfk=": "416666000000", - "RwI_kryXneCZNjXxSoL2IUe8jPbtIRV_AQQT96Zy54E=": "419896000000", - "RwLfj__6ql_RIWZFi43jXDYxxOAJEbZvO-DLvJEVaXU=": "384102000000", - "RwbLFeYEYlkPT5BZvzhswT7XHtTIDdJHuaqBabkZvsc=": "384857000000", - "RwswrX5XxHszWr0MTjoRFoiCtktKSGFTr1BnWw1ODqo=": "903215000000", - "RxZd18W1w9Gam_JYe0zuRMBGQ1e-ijrefePL7wVVtGo=": "1717960000000", - "RxnZiMwU24q-4GroJYEg-asN3Gzp7akLjDRiQ64csIY=": "3170756000000", - "Ry2PXqTXExSlh2aiAsRjgBOPt_tzF0bGhu2T7UuGzJo=": "536051000000", - "Ry6NILQbeV1Ziwx_YZgGstU_jMyTADnMWmiQXQlRo3c=": "576923000000", - "Ryjm9ll4vQ6r1IOixFlHEqxM5sKK7CpnwS6zhKElJKc=": "925700000000", - "RzhoXMjaW-y6vobjiuBRWnHOoBzqyROimQI7fvUky0g=": "18718945000000", - "S-8L1PXUbIpJMDnaCCcWeTb0b0nAtENWhJoJpdBJnCA=": "416457000000", - "S-OBsqPqwYJr-SeOmc3FLwtNKvFVfGTP0utILPfLenE=": "384968000000", - "S-b0ln2XSoDYqNrjEjMEncxc9fxnBRJmomimWAClmQc=": "1498023000000", - "S-ctmChWWZH7s1aFvfwPs3dI3s0EF34XgwOMOecWvJ0=": "1909351000000", - "S-nCVegj54OvunNHLqEiqVhCN3jg5VEiCDR_fYFmYWU=": "1323257000000", - "S0NYnasj9Km8ZWo-lQobQKDoBl1_kCzqqkzznXnVCj4=": "451587000000", - "S1mapzX78qDWpWbwLm-QwrW4vNwsZMfLIZB2ivPQiKk=": "455947000000", - "S2e31-TG8nmVr5ZoaVj3SYNJf820_65zuNimIjnvsF4=": "1158159000000", - "S393a0OGNnJw3fIPWvAoXXOmd_oz9Xgqgq8JyqVmL4s=": "446307000000", - "S3PGGF9wjEtpxmGznM0prK7-JchLP0B0a86k7XSv6pk=": "379928000000", - "S3uhluGDYt-iaNUR4B1s9ERCqO0SEkCMHTut5s3b6wA=": "454545000000", - "S4QjXJzUsK20c9a2Ew_hYZSKuGCpHUNaxYQor18CdkY=": "1284422000000", - "S4uyB2TyV9KgF05k6-RrA-YaNhv1M5IlKt375hc2nYM=": "461582000000", - "S5-MD8Gk7uWe0pT54D-bSXvFkyhryuPydJfXpSlo_rE=": "1693339000000", - "S5DQf4wevKGviZEnif31QkO-xitBmIqV_6ygw_NP65c=": "11418556000000", - "S5IMApUqxFFWe2vAtozrtxzPZ-twRZ0zp7oqn8mAA4w=": "379554000000", - "S5Vb9b3vKom2xknBrN3nao-7dzLufJa5R6-XrorY6UQ=": "384615000000", - "S5rV8X5X9aD55JMFd_ldYf99AIsI3x-GqT_D2vUGDfs=": "416666000000", - "S5wcU5oeYlaubR5hsNRJA3McledQFpcYxJqgE3dG1Es=": "4164620000000", - "S6Vg9-JBfWgwXR6SdA3zt7bg_m4QxPuEcbyxAXeNdgo=": "1158173000000", - "S6_g4Yv6J-Lg-8VAfP-1V8Arznj7A2OCm-jvuD0ENtc=": "422920000000", - "S6kGClNFdu67yEBj2ZMOkDBihDTeVzmXNTk768bVieY=": "469479000000", - "S6v8tfvgxKJZWZUDcOkS_af5f6p6U8NRjMNzTM5Z3zw=": "385592000000", - "S7UnLPeGqFUbck5Hk1nQOH_00u6gSs13l5uXFyE9-c4=": "416666000000", - "S7a57lXdLuTq4rhbK4Nh93DYzclVPazTECWdXftMLhE=": "491921000000", - "S7kroOl2lSo2LAK-RstGHDkOCmYtALwTfur9Nsu-NAs=": "381955000000", - "S8kcZZ09nZkIf8DSZ-lRpH1I5hOwMJzXGk0-1CFO8xo=": "3855061000000", - "S8lISPtZUenif-6E5xChIiyAAh7VIL7TXtk6-0wdlFQ=": "1249999000000", - "S8znTlj_h02nhtDPfZxDNlP_4_UxzoDBxJC8BttLvug=": "425047000000", - "S9LypbwfTzDGE4rnkxb8xj45NA1D-S1_UzeoBItXPN0=": "503635000000", - "S9SY2fDCGLqZFhUOSJn8Jyqk7LfvpMyAbnPS6OAkCno=": "1923076000000", - "SAXjDcOkhLJrkKuSTSHUHaF5387H6_ej_AC3hc8kQpc=": "969731000000", - "SAgAMaQ_cq3-PPDNGeWxF0uAh6-53tsajH-3mEyNVFM=": "478235000000", - "SBM-RLMf5PN0fRpzwvPhh-mOEsCjU_C2Rosp73M2f60=": "382444000000", - "SBUxk8f7HaG020NLVwcQJzfyVG81_YqtLf-mdEFfwwM=": "2278000000000", - "SBjiV20yNJqleUrFkIlNpSmx4_EqixgvIrnRKHK9xQo=": "1153846000000", - "SBqR-8sWAffqxlyVn2ND45ypdyvk9ysjpcOB0tYUpC8=": "384615000000", - "SBxfzo-iktlmLhF3qr2uTA2_bw6Q0lL0zJBCBrVSC-Y=": "417630000000", - "SBzlA4EJMogJvaayTxysWUMjmO4hg3SfEBejG8CUrGQ=": "385506000000", - "SC1oxoONFJSzCQYkKV5D666MDmZYs4qLFED2NGCBycs=": "412863000000", - "SC9Lrqxp0dXf4OlYqDsd5orz16SXUC109cTMV0f4ZjI=": "1154301000000", - "SCdK2teYxBZXcliZd5SQv0bPqQwVZplpbTAr5qrjTOY=": "454545000000", - "SCjdOpt78eYMTiieDb9OVV_wO-fRxYaFRtOYHGWexNQ=": "590909000000", - "SD0owfmmxevzusPGDawnxx_tbxLSbgUUqW1YZS3hsQE=": "2316575000000", - "SD3y8p7ZTdZ59Pt1o_4JmwlVT4rvJnuQx2a-8Kji4tM=": "365288000000", - "SEHATOIcLlWQ-W-Kba496bh-ue-zsShVbC52LxK11MU=": "499999000000", - "SEOa_dJRei7xoWzEXLHvyKw49ah3rr9E__ZaFhbmvlg=": "381635000000", - "SETH13KQPyJp4h35dERESTbNoYufij7dbJVg-DQywDY=": "419771000000", - "SEUw2pZquBv0KTSAF43t65FDrCZUHwFu8_P2x_2vNXU=": "1153557000000", - "SEd2zKqyjB5nRohWThJFVtQRgZA4cePL-7FswdR7swY=": "462622000000", - "SEiUwPNDayWIT7SDYlSlENKe7yuzkVpXtiL_fTQTNYc=": "384615000000", - "SEnPusaX8C0jMMnkziYiY1VyYCR1_T3HakNjyGpvZ1E=": "1231084000000", - "SEzouXQPvB2c-V3s462B7zAgZy6RhVgTl_4LxzLKg-s=": "771545000000", - "SF6ApVoTClkO33Lo4BCgDuMqQX_YpNqeWLBTHr2xfAY=": "1224063000000", - "SF7SFjV0nwi5S1UvlTUmGLaj5tuNsrEc9RR-0OlgbQg=": "385161000000", - "SFhzQEHE7gJB7hEGWtPiJmF0EFCRsCkmzL58MaCI8eA=": "384615000000", - "SFobBn4yJaSao9oXuoSFlS9fkf5gNGkGq9IVzmH7Nv0=": "814467000000", - "SGOs54WsWRwJtvWFwklQq-bzMfmORAVtzrvYN1dxNfI=": "416901000000", - "SGPpL5FG2hauNp82w0xSOojlG6brxXXiPK4ZIhcyW_E=": "7574320000000", - "SHXT7cfSXtZCZEhz7fO1aeZZyDY63RXsbvjamsw-LMQ=": "377647000000", - "SHdDfl35Au4dEbNs6o0sGAKKtjh45lHkm-cwBRkfbL4=": "1854250000000", - "SId9smuIQ7AyKVaTMz7K3ybfEQtqJpToyxxXSq1uvZA=": "384615000000", - "SIhoDS28UhzZKw4_S7KVJzSehWxw1n5Gfpov8xtatCE=": "488631000000", - "SIu6xYAFzc16O_uwbcmZycNmfASh8p7dOZQFzUGt08Y=": "416666000000", - "SIxO749JZa-aBP4Jo8It99mOdVo-vCfuF97teSfsSUs=": "388630000000", - "SJ-2LwFq2l6CAn9cM9icmC4S7hxgDKyYHQ4iZh1COcg=": "825727000000", - "SJB7jDsJx38JSZ8YwziMzvfyI9wIaOPHQOFUfqPf8V8=": "2378394000000", - "SJC2dPFeEi6nQc75AUUvSN6_Ta5ISSmEP2EXWKjzw_k=": "1538461000000", - "SJqAzlttrAsVafVCfPIePD5oRAH7Fw8CrdCSweTrEMM=": "551784000000", - "SKGxvqEjIqb7BdOAKvAXYzzKaeShZNdVmbeFO4yYjoA=": "3855075000000", - "SKMww6YDcCiHCPa2RG6_GuFHaRQpOjZOocTM5jt_URY=": "453003000000", - "SKRcrEI7Jrm6fzRNgdXNtYaEgpcslAsKNzwaE5sHVvs=": "416375000000", - "SK_UTdJKo0pFm2A_2mpDoLT87DpZoRyua4XDZ28HTtc=": "454770000000", - "SKy0F1SOKivWOYVZD8WdiuBDg6lWT_qb1G28WaR6jl8=": "384615000000", - "SL3Dkg_QYbNOOmK1d33quOU8ZsAvKONMTgg96BOnKIw=": "527355000000", - "SL5q3i8TLQ9OT1tefkExSyoMsu9q4cRVJVhdwQDVF3s=": "2033473000000", - "SLY6corUjrPSoFzuFyvXhieKcVvOlpqM_Q0RaFve9Yc=": "19999999000000", - "SLpCdY8c0USC1y6SZhCSKb8Njy4uqMXzMCJxAIBX6EI=": "811241000000", - "SMTYHonmJFd2C7sG9uHwWKMRJWM47_nfhBPPH6tcftA=": "384615000000", - "SN48CL0ipLJqj9t90gQybMrgR7vWe6_lLUONcRgnzI8=": "393135000000", - "SNYxdl27Jd9DCLjmOeMDs2ChYeUIkTKcbX56Zj62jPg=": "413102000000", - "SNvPyFixXJJtl9UVOFrP-ifA6JoW78-40omR4fdjoyk=": "8333333000000", - "SO1I3m1TiUHXe-_Yvd64ufBhNUq9IBd_ZFnz2lAdUGg=": "2308247000000", - "SOHQrdasUfV_CLtFFuBhGFdKuvqa3SMkI-mGrZUpqlk=": "5346066000000", - "SOHpfNNM6QsH9JzX2VZcIIMCf-7O5ezUEvuGu7Y3ux4=": "833333000000", - "SON44kwXMFMiLvSPKGAWo8u6EeKoE7MPQc_t7fqMOMI=": "464615000000", - "SOYPO1TPUVgwuqom6eL8vQlev9bFIoaRz2kR3YPYK_I=": "974999000000", - "SOf2eJHZUL1FBM9QUifY2fpGijHkApxdFsTl6OQPMl8=": "914995000000", - "SP2kFP4-e72opfe8Ti3Ie2NFBPItFyvPKZrffdDHM6U=": "576923000000", - "SP_HXqzVpLe9KCwKzNEm2ORpttLqiNp081qj_o3NyT8=": "2083506000000", - "SQ2WyXc3nt7cmNf_H_Yro-JCMffedmQzT8PZMmuEnEg=": "2055429000000", - "SQPu_2ragxI0cBb7OufRVhVr6RDWzi_lwN_anZadYww=": "769228000000", - "SQrbNnwV8KGCH6w1-nYJ1nrWZ2Z4LI6ai5Sivli702M=": "1795352000000", - "SR0Erq_-YcXCUuFSnMdutB8oIXiwbTnkee7DNtvmycc=": "470660000000", - "SR5i5Pgxq9WBi5t_B5WuJa7EyF9Jz5nlQHDwAEZsrlM=": "381968000000", - "SR8iFaucpV_t8E4ARPlMgc5CSQCXRBbqPEmLTNa5SHA=": "1601188000000", - "SRBkRxAhzUMEYBQor6L_p3rABJRhmLoHmx-vSTGtngc=": "2468422000000", - "SRC9_K8LXqftMPub2HTh8QDgeCD8Hvup2bBXf7vxL3U=": "1666666000000", - "SREOCLByEbRy1cjYFw_4ziu186YKXO41mFiDElbQ_os=": "378341000000", - "SRdgxucTP6JAr-Bn5Xq1LB-OjQvngLhjk4U8TNi-nd4=": "481965000000", - "SRirPGAzVM0pXreoA-kQpcWkKuyocCohmARBn4QF5js=": "390715000000", - "SS10fhh5bCIJbZOlmP5d5H-9fSF-7KRxYgot_yXRewk=": "2786400000000", - "SS5gMDXm82dGbPvthoZuWjiyKb9uBEmOkYbtMOs4wF8=": "442614000000", - "SSE-5jIia0sCkh4V_69CalNJ42VLslB_5J1LiOVhNK4=": "468609000000", - "STHkhYrq9FHhtzxj8sPnQcs9a_8_Wiw2TZ1bVBI-LEI=": "407808000000", - "STzoWvvrxuo1YagYNJyl08hC7vpzpIy3S6YUAnXKh88=": "381162000000", - "SULtXteObtvWcoKFhFnuWW4HkYtfMLML3d8QJpBMR04=": "455600000000", - "SV1IAsDeRDjAHLweK8aPkUbkgGLCeeEq_maCwas1INw=": "1005398000000", - "SVDTSsAarkvqtoE4upotH-awC2mSvUvzK4nVEnMRFBo=": "1156522000000", - "SVcOS4WfLRX-G0fYScTovPhtZ78exuuB6gocA4oTIqc=": "462947000000", - "SW26NqH0kxmAL7zkkz1uesoPCNqmQfcaHkVO7AigO8Q=": "380017000000", - "SWLSQA3jjs-r2EJIPJm-6F1P4BzawyeBgouK_LCiiU8=": "11538461000000", - "SWd7STwuDbOjYL615DCrWLeBa-qDbvAZCbGwCeWPlSA=": "383845000000", - "SWp98e4XlBuoMGdB7DJxJFCrRa5QgTtMT0TtEjYcK0Y=": "1157114000000", - "SWrwEh9DoH1dx13JwU-PfOukIfceV8sSo6qn-38-ngE=": "769230000000", - "SWtfXDEGBJIzDA_32DQ8C3J1ruAHsufWN_T7nOBHTRs=": "541666000000", - "SWwBciGhBrr-XGNeAl-8VUeEg31tNpys_f_NG2eXJ_Y=": "708786000000", - "SXDSIu-cOXldDYcYkC_pTUKCjV9GJQG2M57lOno1X0Q=": "411085000000", - "SXF68KE9J6wz6pEnYC_QNO0RDpu431pfPL92RaZPP_E=": "454545000000", - "SXXyMvm1WYC20SA_WE_6IH2Iq6RewLljh0PSAFJ037I=": "465500000000", - "SXaSbUDB7y2RKrpAOIrjnDoE7pXvbYwfe5Sax9tFoVs=": "376126000000", - "SXgyNvX6A2O0Lkl6fQ_MAReNemKJ2oMgVkOa-4syNgg=": "2682599000000", - "SXkHZzKDXEVKqwZgHqWBCdEcvSofje3sCj586r_cIRg=": "381436000000", - "SXqKaW8pG5_31LTs_b6CuVoxntEZJf7TB4lLOqgrhc0=": "916791000000", - "SXscA6SWWN16z1ajEftH_onMjXecSLVcH_CPez4IHng=": "457143000000", - "SYHmw0Vus5LmajHBjst_iNQIlO5rLX8tWjY676N3Zpc=": "394450000000", - "SYHomSsFJYORA3Doe8kL7oArDaMm6S3S4Xoda7WL-mI=": "4999999000000", - "SYLUbxj0XyzE84Ry8QkUwFw7gJtr4DP9DU6X_6VdzvU=": "4166666000000", - "SZycf1ci5wco64o3nB2isB9lmp4L5-8KCiLosN_mFv8=": "3818029000000", - "S_-f6kkMSd5Tsy3u39S7c_VkHqhVcwP3Qn8wqcPAG64=": "383038000000", - "S_F35fMJv8zJF7TUMf8GnO-1gJZFpuSW5S92_QqA1-k=": "462146000000", - "S__-79RLU7aloCum87ZSiBsiq9o1SaXRnN7LNGHRApw=": "9090909000000", - "S_cba5gwft68yQu98gcpYy3Cg8FU8lajR063mVwFqME=": "763604000000", - "S_s7hDCHRG5EhWJMs87RKfUSBofBIzKva0Bkn1CkLTI=": "763454000000", - "Sa92SIGl9mOxs-SZl9mfhs8rMDoMd4E_qVbUpaGxyvw=": "412863000000", - "SaOJHqgoZb3pll5C7-ruO9ftLRuJl5_i5AQ-EkORPJ0=": "1923901000000", - "SaeiUO9q_hjeyzvqfj3gfIxyMNl7t2CMWvItV5OPOrg=": "4851270000000", - "Sb2zVSy-0_wBIUNm54SYeNnwKq9M9aurNeqsbuSfv5Y=": "393613000000", - "Sb83wwAp5A6-Qr-6PhBVmroaJkc0CGMy9ThvgYekrm0=": "919641000000", - "SbTe4S3AatRavUOVdwG3SoJuA-PaDe9Kc7xlVeI7G2M=": "384615000000", - "SbekJnuNShOJfnOnS-ejFBqupUm0ykP0L-NstcPNk5s=": "390817000000", - "Sbg4XPXO-4YS5KOmSoB8WQMbgcebEZP1QZ3ZmJ5bTBc=": "384615000000", - "Sc3LamjzwO1kWIpVf4CsoTnqfqLMB947wOHfySk3Www=": "30394289000000", - "ScStA8bWjUMePmgUxO-sMm0IvCxtikFJikoJt798VIk=": "7787692000000", - "ScqyvCJrJPae9fxxM4Xm1C_VqR2nOTdg5-5Lq9Ijxb8=": "488979000000", - "SdHFcEoCVXWfOw_N4hw4hKoeLwuX9pjcqdQDPVbGKI0=": "384615000000", - "Sdhw3we1EJxMSCwrsjOmU5ztca-fYB948Gvvvpjh1mc=": "563425000000", - "SdrMM3ZPE57n0GVxLwz6UzL6BHMlJNekzjVFqP3e2Qk=": "461318000000", - "Se2DDiWNR5fccPu1Vc21rgct6EKpnPT8LEk8cvgZBTU=": "508044000000", - "Se2V4LLEeMfBe6eoJTKCW7mh7Tjd8NN2gZZx5byd0bs=": "763672000000", - "SeEsx_A96SibtdbFRuHsJkHh3-d1_0D7mzJTtpl6wNM=": "413291000000", - "Seke0F479gO1Qqlpv22BA_iYDbZsJTnBvd3SBCKmKVU=": "464240000000", - "SepAee8641SionvN0XI08zchn01ZnvUsbxsepHz3Olc=": "385211000000", - "SezutLfrz8UpYlK6TZFvh169w_H-HKTSEB1OZylc2LU=": "3672319000000", - "SfCawiPd7qQ4FeathOoGkc1LzGNk6p9PkUphwRb3Hn4=": "1156522000000", - "SfQ5IsI_Xf_U-IwOIbWcRXIZIupqpdF4YbrmXluhbsU=": "459754000000", - "SfWrraXfCzZ03fiULK6Yso3xW-sTSbObRbaFH6TKLs4=": "2333242000000", - "Sfbp9zRqC7UAnnPV_XXYmcjJwo_5A0xW4Rsd1uTPLyo=": "374871000000", - "SfyDGxT8Z8Wo8ppt1YNf9PWawabzyukN3wpnlT7YIS0=": "8081479000000", - "Sg53UUTuq19VxtmcG2uFJPE4fKFPTXt1w6mdrKxYa0s=": "424835000000", - "Sg6Xn-96TqDHmlK_9YGJrdYElrZo5itfQv3K8vIh-9c=": "1884682000000", - "SgBQTwwO7aS5isf8I3SOnaNu20QyZeUGR32N7Em2Dec=": "993351000000", - "SgbuNV8naRT-Ja-B8Hrudnl80xxGDnt7qhgrza0MP0c=": "924915000000", - "ShG4B424QcVFj2CHh-nVrxUhsPczPxEwf4F5HfHddJM=": "1153908000000", - "ShOSZgKko_L8jvMjqzpAg5dPnY16IyhgsaXm5_bZiTY=": "769273000000", - "ShrydpxpKv3f_rwf5AgG0Ju9DkCJUt6MPgiUqWXw2PY=": "411085000000", - "Si2527JIqNY5eTX7duExg_SR_PH_aIWzSJCyf_U3hYI=": "422143000000", - "SiFTk2ajpV_bsFq4euExsSeeOcIWscJENFBVSorFen4=": "384610000000", - "SiJ7j2N8DKg2_lu_1KjsnHE40eK2OteWBCrdBhcX_aw=": "1375988000000", - "SieioJVAE4o_vtUeVnH9tjbjT5t3JhRziTKLeN5ALSs=": "1997119000000", - "Siq0b_ueIzkBlD1MsXL_n-4kJeP4vCjtpfmPk6_KoM0=": "1869521000000", - "SiqWeLmhbxJ6MpEW0rxtGF31E_Ld5QoOX8kpcEWRA8E=": "384615000000", - "Sj-7Vj4ALX82fHot2mXy3hXbYy8Yk1xJAZcZlBtv6UE=": "462944000000", - "SjcoeXgFQtll96fk3sNIJELZ3KI5OIXGMWdS0O-cUlc=": "566195000000", - "SkHmbI235hA-ICOpTDlC9ru1Z2PB3jQNXwEkACOJ-7w=": "411851000000", - "SkN-Bd3Y1M3YrpOj57YRdX0Mqyrznbp-PSPmxO8t7f8=": "379290000000", - "SkWrNTHRcsZ67JYvK7S4dKoZ8Z7tXNJ7QBlaZhjrxqs=": "471779000000", - "Skjmx8LCVfbDVtNLf-YKxhbepeZwHmGb464OJkE20oI=": "3223241000000", - "SkycvWDyhCVhkzN58gJI6LavUxGigf57Ilani1UlewA=": "766939000000", - "SkzsuupgYLnQRBVVBBZTQLB0kh5ra8tI3qinFKyfMQA=": "1389046000000", - "Sl2KaiqxnwXIKw1069iDBq0NwOb2oGEyzOW_Lk4xhIc=": "384618000000", - "SlLRKTsXpgewimE9Xvbyli8F4Rxz1mPy-u512kSQkMU=": "384615000000", - "SlLbV2j8bT5bBa1oZDb9MiVinF8abVpOXqNNRvg3Os0=": "385507000000", - "Sm2fFY0HS6H2SXxbbnJ7fVgR2b6ooD7esg2hwE-jPDE=": "392518000000", - "Smehw-zt0u8MYX21SyFhiO5iYyb679ZwKA6sl7wkfos=": "425047000000", - "Smn6skFXLIDt46iAPtNR2kl_UsjUTUsut_soeJhmhaI=": "834385000000", - "SnSgYUpzYrO9dwSOL2-sj8x52fT-ImHEYwrJXuGbFiU=": "654571000000", - "SnoeSLatwZJBLSwpBEesKgwMfeblVXb330EKL3XRK2Y=": "385510000000", - "SnxmDLuDGgsgWujR_SjiAg9smMshJniER495YiBYB7E=": "406044000000", - "SoFBh6PZKBmmJiZciGNiVL6wTY9yiDj3YwVAlU8V7-4=": "1730769000000", - "Sp0PnnbLZfx0ZRKEsJVkHOPoGQhLy7OnYNJjMS_VAZU=": "4035050000000", - "SpW_3VHHQk_Xw2JJdjpTdYtqG8faLLpMpzbSKYxUADo=": "451831000000", - "SpjFLgObPsf6rCVAm6S5hTCg8RGceJAuSQO5dgiBgL4=": "3867538000000", - "SpsuY6TqqBLNQM5x9EfqDHfI4r9GcKF-jcc45_IQloQ=": "2272727000000", - "Spv5nIIn-mNYMg5Rw2GR6n9BzDYjd3DXBhjy-gEs9Hg=": "1627125000000", - "SpxPtjF3n2G6_Z5Sup1aGJwqGVfVtOhXvUsJuCc_gYc=": "407530000000", - "Sq6xbDK1t9W5yqac3gBig95P3eidhQyMhRDHxjcYbsM=": "384615000000", - "Sq8Czmgadg9TBfTHn8Yru3853Z1DQOgdvP8X9KaqBVw=": "400371000000", - "Sqk-Or1dD4h7LwKoqnTOwyxcj9Blkss3IvSC-ImC7jI=": "1810402000000", - "Sr-P56tYWzjhQz5EEmBTPSAxaJl6_llUWLUftnftDuc=": "420060000000", - "Sr0y4S9hQwQAsOLv4OrJkHexM71WDYusHJIf_b7EwMs=": "412607000000", - "Sr3XoShMXuwEfD_Nrm955quW-h6oJl8wzSnsEIjxRyw=": "385506000000", - "SrUCxZU9nLBPgoVVzyuPaLyunRyXVdPRRLJas6WJ7wQ=": "419891000000", - "SsTCC-xPJaZKkgN6DOijdJ3y0fdtv4PIIh57qwrCmcw=": "1818668000000", - "SscR14U68T8frSf5cGBTyWp7cF-PzFzt_Y5sQqXjCV4=": "2022393000000", - "SslGIXxY_9YIZXLK-KmqFcII8WuZ0bYB7bVe0LA0olI=": "385509000000", - "SsmbXRaDrIora4SgAuwwYs71FmXL-j1v9wzZ_iz9j0s=": "383803000000", - "St9Vp20fdYQf9uzwg-AaUFNayxSvRMadYo9A5dgSt1o=": "2349530000000", - "StZc6SjtEb0p_SjAM_62BBzsTDPaDsyjq83ZWoS0-5E=": "382394000000", - "StjNAmV6SccOqX_OGTqckFXY460fXGIfd8d8qMDMMMo=": "538461000000", - "SuAUuPih7_3v6YTs-3an2WtmplZ8oD87rBRR7YeHeKU=": "788465000000", - "SuL30-reb-Dma5b_CBqeuCpRecp1nKUHw_j0I9DdBiA=": "454545000000", - "SuMBkqF86MAbJHC7X48gEw7Uh8QyF5RnANZKCxa1ZIY=": "384615000000", - "SuUjFg21Ew-nDaJYEV_8ab0UzhwkOalAT1OZXzaSuOE=": "748973000000", - "SuqQIuXRFURBlVC80_-qgwxz86QjAAF1TJK2Cv8Sqoo=": "3068830000000", - "SuzzCotbNN7Bp8_qaruKWA2iBtBn91GrH_zbazvacjI=": "437313000000", - "Sv5xcRKGb42zFdWeEET2tnKydrstnV7WdJn0zqylU9E=": "2070658000000", - "SvCzuh95gKFmG3rYfzbop5qA3LA44T2LK2_Eg9vM84o=": "469837000000", - "SvDQuSfXjderGAlemeTLXVkYqsdRs4IIWJaasjdom_Y=": "891648000000", - "SvniVKHvZ9tEv3QcbqeEj1gWu2nxyWx0RToQBh6Jpjk=": "384615000000", - "Swhbu3vYHsLS2OaCAz4OTQTFtTe9I49JWiMsV6WzrSU=": "1954356000000", - "Sx97Qfv3FGJc8TqCTymtPhAraiTAqW9OfAVP029JYDU=": "463511000000", - "SxZ-J-zDwdxOipY5Vwaq7NmNU_bzEhoz980cyk5H9kw=": "384768000000", - "SxmIBE95wG1goT4t9VuEecGkaOL64R5H8vSWcfjnnd8=": "384615000000", - "SxstyLEeun2n1YZtUjpqzjV0RZ1BL2MDTo9upiTh_38=": "5206939000000", - "Syi594y-C61133g-JPdczOmV5KE8k4pCqvLin4-9nLY=": "377692000000", - "SzDsyBATgcGBQ5vxhmkOZ4zNoM6hHEqAaBXeJq9Uedk=": "456456000000", - "SzPdb9zhWj7EP0DMnxrlZigfLdeGb9aVHzYnWVQTFZQ=": "454545000000", - "SzjIjBmKbpAmoE_vthrTL01-Dv0nQIlKEkvwVMhnfl4=": "1262181000000", - "T-7FHyBuWHSxw0YIouvGlHYWoT4jjqTuNt4l4vgRpdo=": "1132037000000", - "T-tpeDxcaOR_QeVE3kQ0twz3-Z2EZyD6McfrIZD2Nno=": "416408000000", - "T-xoObUayimBzNjqTPoequcCEnxreorNF2qtNvvcJCM=": "756514000000", - "T0OtqLc3zTy5ML-_JNlL37Gk-C-Moi5u8syzUYM6u8g=": "1344548000000", - "T0S6TodznUScowsmpJshRJffkk3IOJteC7PSjp9vHZk=": "469809000000", - "T0njmdpQTaW8Adtjpet7m5c5CJbcd3kkQVEVtc1IsaE=": "389386000000", - "T1N8huyrkkzSRveUDhuLJToAlTeIAI1xFG1_hg51KjI=": "425020000000", - "T22PtI5dTIaNj2JwaDzVUjefwwer6HEPoEMyfN6CNO8=": "1802002000000", - "T2E1wKTHWipHYJgQcnhKnjzDfn9E_nJ9psThbwxyqGc=": "964248000000", - "T2UL3fSb86S-VQvmw7ypuVs5D10jKOQxlbZeHTKEYXE=": "379603000000", - "T2fY7GkK2OkBi99tzZ9xf2gDsx5xENF0rgcWorgyQcs=": "469310000000", - "T2jzWwZF4yUAiP5zHUwlxZcR7otazbTtAT78cFdpQbM=": "673851000000", - "T2lfKndwHJTM9YEZWeCqaGaZnhM3eaD-ax4FFsnajE4=": "3846153000000", - "T30Bltb5MJh1YjWIN0cibLv73SylZptXuTMCAA3Ohqc=": "385168000000", - "T3afCTFRGM83pdsATRl_w-ZNLlExVZAFW4i1D1fFbIw=": "419075000000", - "T3d4i_7opknr_tvzzIR3raoHYq6DGFZLYJDQWRjH0-A=": "389613000000", - "T4k76HmpAf3TI4ysRBgAISJHffMsWjdqnB5s0Xcuvy4=": "458783000000", - "T4lHcC4fpOvGxmlI_YZyyrSjGGAhEtEpBRa9iCbVqLE=": "443380000000", - "T5byI90XFRWcHuMv3bjHY-91D_adEDFnmgfPLujE0cg=": "833802000000", - "T5p0OewwVDxDNgtlMiXcu8oLTkCF287NP7UjjoX2s_U=": "411085000000", - "T65clehjcmIz3jARlRsilCSmVep7JbpbXvTF1XrBXew=": "2839748000000", - "T66zwB2XM2a4PdHlrhZp0Q4FzJGz-AYDgSegiSZWSAg=": "418363000000", - "T6CuFMnQIiokXOvvSZfh74wcr8kqKumdU2uF_W2xNKI=": "492195000000", - "T6NGythQxTkm3glSrymftn1T5Mt6P1FnglyilVDuOdk=": "790995000000", - "T6X6KOVumlbOvt6P3wQzfPQH4i8_u9E0aInT1O1KdKo=": "2084206000000", - "T6_NIh-0SBBHhyCRiePPnDvE2wONneL0F5oN0mzd-Jw=": "559333000000", - "T6qmSLu4aelssncDsijhgdQgMLEVpDxsDkth-tZ1AUU=": "4054666000000", - "T6renS-C-bg5kqHfes8pyPRMplbBm00u4wcvclbL3NQ=": "1905640000000", - "T764T77DcfaAQ2piwU9ycCxXPF3pFYotNCO2xbJdJ-o=": "385508000000", - "T7BpesNfYvpduGPoCG94y1Es8nVHCV_wC1XPWcBSTg4=": "1513028000000", - "T80mbIDuB28I3kbkLjeSWwH5YuDgvJHLuIO9ro7U57A=": "1153846000000", - "T8OAfF9wDFD0zP9gy_DDuZbgFjE6ECNwvnvKZ1H8dWc=": "3880835000000", - "T8VsZHeS13XDf0q9Evop3-Lm-HEJQ4YYm9RvLwcJXCY=": "920027000000", - "T8_KAJpk2BRrfTWZeRcko-h3T3buNpoU0MSBuL5ign0=": "459318000000", - "T9CJOFLI_3fPIPqNn_bqMOAk8oBKp0KSwN-y5tvh4Jc=": "984391000000", - "T9PRHLHeXIu1FzjPL_9ofs-i7Avn6YDHS2e9V0QuzsA=": "1156532000000", - "T9TMTIJYoaKPrIv2b8OhIbbbRDtVWwfufO35L8eEHlk=": "1769230000000", - "T9iYpvU1dFRcPPGni8TIYWz-IUUvM3HQF_kMfAO6m3I=": "5825252000000", - "T9tIg_QPi5N-uKfDGq9X5ZkLOS1PptCUk0QGrrLpf68=": "1179159000000", - "TAAdCyOZMZ8wbZHaJRD-fgcYEOub1YYWLBhVGDjXpH8=": "1213320000000", - "TABpAcemRZeX3kAEfy6swsiT479YArwopjYiKal4pQk=": "486218000000", - "TAFe7JvMscTmjIrlNyvJ4Rn0dKn1IfToVZIcjbVH_NY=": "430743000000", - "TAPAuWMw2_1NVOFG8Lq3D0Uts1wkUJyBqgEb74Vqaos=": "1512876000000", - "TAg_6xHgYMIdjXi22XIEqxpRaN4wVqAfTWvd0wylWdE=": "405229000000", - "TB0SoUOlcGl2QpmaJh27rB4mzPxTouHbb5zOFl3TMJM=": "446613000000", - "TBHN5sGSA8vlYimejlEcgqIuGQ8h0M3uYnIkhAZo-1M=": "407808000000", - "TBLOKjaCZcspaiooOxOF2ufC0jxrsHbNheUvZTyHMf0=": "2501233000000", - "TBRpluY-Px7T2oFyHbXICVUEM21I1wVGdi62vEghG60=": "914067000000", - "TBVV5neWlX-oioJhvnSYqEqiRZc445_QuMXb2iALHtk=": "808497000000", - "TCGdGpa21vGwkNMD6PqPVb_DCju8ZngXcg_ckR1UEsA=": "538468000000", - "TCH-5PRDg3ZZSEpmn8yXMAJxoUi-qXIe_xYyOM88WUg=": "411085000000", - "TCNWv1UY7SZRk0r9OuT04fuf65hmimvaBcZZSxc1l0U=": "499391000000", - "TCQ4oVEJrDyFJUnMlLmXp3sVRzCTtJDPDV2zB7gWt2c=": "2073542000000", - "TCUHETQtgQOTjFVRH8bGbJgmZIHQGsQM9-sf8edWCQY=": "1734809000000", - "TCYhdCPnPJmGFCJYY-kq236oqDxcFM1HW7y0J30tQKo=": "706137000000", - "TCfxhwIVKJnDuG21nU6hFVCZ_itRm6qUfM7_QwDrfUU=": "2018426000000", - "TDKS3-VypXcEQzolkzO7IOgdzrkz86t1QDla6mzDXjQ=": "760231000000", - "TDM4Fvn7dGy7FEOXAJqfm--QBJxppgdahlJvQlP5eAU=": "385935000000", - "TECtaxiOU08pafigBGcvzj_swMuAVn3Nd1Yjk-LUrc0=": "386715000000", - "TERbjd7zY06DplCsk9egnQiYKfUQXT6s9eYaJnOYeCw=": "449746000000", - "TElZX_DlesuI3FuXC8asLyMEWQV5oNkDHFrCquSUU70=": "454038000000", - "TErBbf3sAbp2TPq7KZ2fe1KmH2Egu5tH8vPVU2R4FqQ=": "863973000000", - "TG1-OucRXFcgExTvx09RMK_qahotAEw1-C-_6n1HRsM=": "453652000000", - "TGK2WuotpDIUeFsyzkSjmj84A-Z4s35P1zKpGBn0LPw=": "403061000000", - "TGNRIbs23iGtwuLO4i4s19BryENXN908HaIw9bF-6Jg=": "428186000000", - "TGRsfM7elqh_k3iHV5GRZWYJN38oPAMiQINtCwzhywc=": "917293000000", - "TGpLzcS40OdUoMr0wKypL0YDdI6mcYr20mSdogLpZR0=": "440082000000", - "TGz4zOCmVM60YBnyALFWC0ss2oeaKf93DHJP_q3ARb8=": "456999000000", - "TH8jrbRRBDM2VZsnZSPwSAaJ1sfJW0zyd-ztxKJ03fY=": "460237000000", - "THBBi_4s-D5R2P45o_LsvJOULgeJNplfY0I05WnRl4E=": "11518601000000", - "THgoJhH7jpCPT_i_vaehohUjJXiB4cXn3ibDxPnhS6I=": "6102241000000", - "TIGywxkuA3q-gGhc8-t_Vl0hDuDZK20Jcdg7igNXloU=": "1159335000000", - "TIIMUqcXmZttm_k_Nlx0GkaLMzkzniLpybH9XdiLWSw=": "455600000000", - "TIbWJghinnJC7eQ0T2CYB3uz2J6rx-7ChDdEo_BCsPk=": "456386000000", - "TJaeS5vBwNH3p65qKCn11-0faH0-jN6WPi4IA-VY9Ho=": "411085000000", - "TJddBmAc5_KfeHQSRUMd2wRYI-zxCc3Z2Q-wp_wCEV0=": "384615000000", - "TJlUYglMrWn4GzpGz62OAiKAoeKTO7gInGXoZZ-t9vk=": "1153846000000", - "TK37LIzo_18Vav-B6Iriv9-88eXcJKRGzw3xtWhnQO8=": "416666000000", - "TK3_qEuI1j5SLvgdO-J0eyvopyPrNDNdUgReItfO-7g=": "1804233000000", - "TK5eo4OPXZZAv4W0lOP2KMR2pgGUlcpp6cKHlMJhGv0=": "385528000000", - "TKCu2zNR1s45jCq84YBtzlZfAEQb9yXfb3skmf_yW6U=": "407808000000", - "TKMpqi-rnNOgLbO4KRJ_BRIRExh911wZBl3PSgnW-kg=": "2499999000000", - "TKmfNptUOju83EtZl7PZbd2X4hTz-wi8RCRlwqLopeY=": "2099037000000", - "TL3--gU-l_QAr9r76txahFQR_eTMKalM_q_Lun7Lorw=": "455600000000", - "TLAA2MCzFTCN0ztmb0tx6Qt_jWWeojCOoBnu1nLxiUE=": "385830000000", - "TLS9DVv2aeZumLtsvxBqcrgbfcU5cnRvxN4-QnW4BYg=": "4071284000000", - "TLV5FutKSANrgq97LDiqQwZEmmzRTl7ZHEugsZvpSoQ=": "4562692000000", - "TLVAl4Quy56qUGHoOnEhYlxLh4ergrffbNTlNiGa9Xg=": "385505000000", - "TLnETExs0lEyGXPogZZUQ8-Us1E_SJ0310IE-ze4pgQ=": "384615000000", - "TLzWCkmM_fLTF8acdMM1cOQ1XolK_vT5IyR8ZLRv2xU=": "496799000000", - "TM3kjCKbA3awYjqV69ft-rpq2v5lWejHUEimP0MNUI4=": "1999999000000", - "TM5J4gTOcIBvGAIA1aiGrXDS3btTK-J6vPW6ahkJVoQ=": "383455000000", - "TMIq1ZSdC9dPgNBbRD8wewIUpo_tk0T3RlKknLXtazg=": "461553000000", - "TMXKg7vDH7TDBaitGRT6cZD4_iJRdp_DxnsvGFtz3G4=": "411085000000", - "TMXvkzRiQ4dh_XBa2iQIexHziCGZRJ88Zeye9q5UkT0=": "769178000000", - "TMeEHjWcE5IhVG8NrLL7xv6Dy7i4qeOkkBjNmbYH4Ss=": "384609000000", - "TMgZKzIJn26vvSLboh3L2YMIqK0_xbpqhvv1fKKkGZI=": "390917000000", - "TMkHwQ6tCduoiD60qeK_L7iZfVdIAdV228pJrkaeBeA=": "31859306000000", - "TMsQODyiz9YaMKAAqvjP9oxJDyTP6xxhTkKq5l46KIk=": "454397000000", - "TN4bUGuZwyecUXypke_OdFIlwM7a0jwEv97mAcoISsY=": "1153846000000", - "TNMCCSP0hqtH2V2hQXsHuWjwdmlK1DBWyy58cxcEh_w=": "2095522000000", - "TNxrpEy5MyfyZkjzlJguAmolJvAAzk43Sj3MxnhM11Q=": "8926955000000", - "TOR-0aZ03nd6q1pntimhhR8qjlojFgElZX26vCBcKLI=": "454527000000", - "TOlegdxhkrZsbBMtfL5HBg29_MuhbNwdoBa8-L7V4PQ=": "390975000000", - "TPA7-VD-ULaRoMmT44uJtRvCNefKhC-a_lX3md55Gpo=": "940062000000", - "TPSrjxo6_DDfpbSPivjzIO7JmUw0_QnRSJBXnGT_x5o=": "4678221000000", - "TPaPDoDJWBzSwgj26rLcEgAdwtfZiIJTnwlKZ9s7ekk=": "382394000000", - "TPdLdEkRsxs0aW7h5GCac6j5x-D-fuFynND6KJlAKBQ=": "385506000000", - "TQFhMfOzYBiRzVCxwG-S9nvkea5rMWkc2iCNWhijd3A=": "1694716000000", - "TR2zSFCV5rieZAHdZZBRDlIzZLdU-Mz3qM9SQwSCmp8=": "769230000000", - "TRKZn2kraJ6T7uFqH5cn-u5egjR2Dai_Awwll8XHK_E=": "4110858000000", - "TRazpLJba89NscDYCVcpc90GVPhL7ACcwumOAch8Ecs=": "385507000000", - "TRfhibhiQPGFrFqdUqvdKzY7ZnVUYXurN_Yxqa4fQB0=": "4926913000000", - "TRggNI27HawKHYahmKvSBu6dB9KfBDhp9kCSUVvGSl4=": "769230000000", - "TS9-HkUu_ckUYQWDwgECdPUSNYVSBAyhT8lRDjwf_40=": "463270000000", - "TSGqwsxceBwLeR--QtiAPX7JQeEVob_EwevaqDJLqGw=": "1927537000000", - "TSbNqxF-Pus1N9Y6JCJ2NwmkfYIskGGNtVpviijL_kQ=": "1078431000000", - "TSw5S27VCGc1hAB0Q6f1YU8m9B22vSoV-IAzciTRtXM=": "455600000000", - "TT2lLlm1bIlfqBY_ukjr_T28fferrj1TgoVXcTDRco0=": "3846153000000", - "TTFOTAi3HiO7ns-j7aRBeqs5i_ysaqobSzQb81CJ7a8=": "393015000000", - "TTIIXyTalJN5aC7o4n7QV0RgdVL1kFmQS-EC3O5N6Qo=": "404981000000", - "TTRysw-M3YBzft4IjSK-PzQJXrHvx_1uGvLZNYxTE5s=": "2307692000000", - "TTaz0s1a-7FlcYoEXfAY9zQ86PLz_IkIrP8kKzmPHoE=": "1890031000000", - "TTp4oUQSur1USwkRfS7oOkumUjqBnRwDMERzsHUt44I=": "382296000000", - "TTqgIKgyd6jccZ6JSVp5Eg_L5RuzWpVd-IZktY9peSg=": "1249999000000", - "TUOsQYnNyu84Ieq8wAv9isT7k4WYeSBykv1kpva1Xhw=": "385507000000", - "TUe9bETsMnKCXXmAqGa0_tRCEdba36VI-8eztan4rzQ=": "455249000000", - "TUnCHzmoynclcFE1SONUUsnSKFqQciUvag9MdWCfIZg=": "1153846000000", - "TVmMoaviUhsywKP9NNTBYlqkcwnaQN-I518APE5zPGQ=": "1368707000000", - "TVr-HcsGDQHdUC1Obirryfkx_1zlz00HKZZcSx9U30g=": "384631000000", - "TW6-1ICdwUPYpp_DiDfMTcLMM-zA-h8s9nJOgsJOaOQ=": "500320000000", - "TW9CO5ppLbwpVNih1DCVcm42ZT_o2XLRWvkUYlHedBw=": "3846153000000", - "TWfO52DjZQh1MfsaYhe0RJ7ij9XAfG7PUf-btKINmXw=": "454545000000", - "TWgDMqd3RmzuC1-MlKQ84sJlKZZphvaiOF74bHWCcHg=": "2280979000000", - "TWjrFzQ54CN8Rub-Z3UFU5wc2CZMAKKoeb1oweL9bRA=": "385507000000", - "TWqf_OA1kTwzOSuAEVL0z8M3ihOZ85m3QnE8Qt9LZVA=": "473265000000", - "TXC-rEpYEmWqm07xT91823rjKK3pnkvRRdWhb62_XJw=": "1666678000000", - "TXDkgGHNB8NDDGuLngAIpkkfze8noDVH9bYQpNExrKs=": "498593000000", - "TXZEy2ijIIvt-ajyMef0u-idEqULSxCsAs2SjM8jSCs=": "41614042000000", - "TXgFpsIhDeDdFl4tkl8JOcA_mUy5t8jEFrhtk3Nl95w=": "416666000000", - "TXo_uT-RUtvbYa1evHBxxLu88CaerlllQxBJfsmfeOQ=": "1384615000000", - "TXxKUWAP4OQLZ7ix07gyhySk6g5Yzqgy9bHmGT0qXqU=": "403542000000", - "TYoQZqGeogsN_wpnt3im96q-XJfyTLGp1qVsLNETYSg=": "934115000000", - "TZ4h06LVN7ZKCp_Vr5ES_LZ1l-hWIUnKaW4SkPnqpK0=": "386611000000", - "TZqihr6MrkfU7NPAD8UkV1hcCW_wS2iGq5V70FRplu4=": "769240000000", - "T_aw65OLTwI71NzjiWu70ElgFlYQ9aGaoILHo0FAUlQ=": "372058000000", - "T_jCquv7xNAVlMNk7U0Bj4KvGM7j-Vms4fJbm0fowgs=": "396483000000", - "T_oMfotTlayTfjx3wwr-5VetYckc6I81PyVDs7KhnOU=": "381635000000", - "T_w1cqc2BKSKm-mesketmzqP6R6R2Clnk5NB1a58wjY=": "769230000000", - "T_z0BzUwIgntcVNd3qxIH240RDwbron3QoXlbVX7UlM=": "3624999000000", - "TaXNwZgAipw1ucIqaBPOS_scemtyCfnDSL5lLAHEF8U=": "2275404000000", - "TabuOZ_QzmYaFJQH3kUqM354UMLdrZERVqw3B9GXMQo=": "12517503000000", - "TapJIqDfoJ_wQVRcKayGzb6GDrAhd6vmKHuv2D_8eSw=": "12741935000000", - "Tazv4VeCzbyDpnJHoqgOv7HNbtRn_9ZZbeoeaClKEF4=": "4540416000000", - "Tb4VcNV32tcVTfjV3YHYfocxipxYJP4EijYT2eaXNdo=": "669358000000", - "TbDi5FuV1ZImz-HVY_raPsGvl6uWet130W4oVmt_x7o=": "692307000000", - "TbPkwRuOeNpW7j7qsevK_KtJjpMYgiq7dSV7m8pGAWY=": "378341000000", - "TblZaN-wNTpMNnNFgxCrKZ3_miawPY-rJMFRZ7Pbm3M=": "584259000000", - "Tc4V9So2DnG7I9faUsZKi3xqWP8sc5OzSwU2DcmFhEI=": "5384615000000", - "TdAPvZ-TOWuJTJLn-QcoD639bxmQwaE6xrKVjf-CnPs=": "880291000000", - "TdbYO9Kq9MdHRCuKPg6TV0yX4ZXsrWhNs2tKBxeSLvI=": "384774000000", - "Tdy2vwOq1dr2JSBjaatgM_HXAjFy-hjEoPTYVCs_wMQ=": "384615000000", - "TfF4fLtpKQmZi6TTaW4I3e4DE8kcphTdU-ONkPFTy-M=": "1345378000000", - "TfHE1imi6jlCoIVeAEmeW3vqAn5vl31dR7OCRKyiTqY=": "834557000000", - "TfIAKjurwuoUXu42RB15mpvkO58kBOYsJvRk3ip1x04=": "1942665000000", - "TfTktDgH-CYrDdDIGUsJfgz2IgOqeFn9ZaAfbrXaloY=": "3690073000000", - "TfcOiG5gPH1wgEWjTsBXq9u8Ebq3Q6q_bj-OSnRghog=": "902536000000", - "TfemwpPbJnR1ReH8-jv02HzBLJjFjJVbxfATw6bbeNQ=": "467604000000", - "Tflu5ymmGQ1o2YFlaTShuj7IgIKsLHPI4FLPvqTiwzU=": "390962000000", - "TfmumusYXlp0Kjmg_v2JdZfCd54sWMkv0bfXD6hGj7c=": "385506000000", - "TgAFIwYGh0zoSS1kXobf7GyapsLIY3C8di8kMMt97WU=": "5192307000000", - "TgENOTxjPLyyFKGRkhAPvt7csvO8m4Kyr9AJnhvQZ2w=": "347570000000", - "TgUdRokk5FS225QFuAKWWF45aBEY24rs78Ou0IP2250=": "1812786000000", - "TgZPpsPpN81yhqyOVzHe6X-eXy4SBtXBe302xO3E5h4=": "2304657000000", - "TgxQjc-m-jO2mkIW9IoblXR4lu_gA6EC-5g1N-wr7Cw=": "1958327000000", - "ThGiNF3XW6T9MMp6-PiKWsioVNG2F_pBVhr_hONXq-A=": "487145000000", - "ThJHUyehjUTEhNmNXvXq2h1EUmzNHMUnPOFJ6Y1FiC0=": "1156518000000", - "ThJK63hC3PzGrjTCGMh81hRT6pGwG6EIeZf1awg7xss=": "2083333000000", - "ThWGOlrbzyDfVSdK-xkBrFoTMCJ2CJWEN-5LlDudA40=": "457208000000", - "Ths7rST014wnSAHwWzdnKKVOO7TaGizyc4ThEveEKSA=": "423634000000", - "TiXYTKPwfP_wrCOx5YRMaGK5LFTgD0uf0NXTZUtUncg=": "814938000000", - "TiY-JMyarKL1pnf3slEmBGQ_jZ6kpoI62QWpA6du8Ak=": "799838000000", - "Tie5eeUqZ8itfQ3hvTjb2w2oH8ktAhtlUVvNc0jjI0I=": "416659000000", - "TirNJLKIbGMtLwTGDoM0BDcZoZ0HGHUhWs9rjjTCPTk=": "2499999000000", - "Tis0xPKLTGxeCYn4FyhuHhZ2mWxsQVMz9fa70lK1mpE=": "384615000000", - "Tj36rUXIV4UwS8HbpLuDbvPhQi-LR2s0wCpqW2CK6YM=": "1146117000000", - "TjFSaK_3XIypDVaedg8aTQweNOn-05ZR_TTJrwm0HRY=": "1538461000000", - "TjeFQTXO9aXvGmkgqDWQYqnXTi3Fcqhmo2ZpWBo0wz8=": "499999000000", - "Tk527G7837xfz06MUhsUF7aI9gI2l0qB9kLIiGv0lfw=": "1019742000000", - "TkCte70SVji_uRCqpiiO3w2fAIOvGQHbUmbWaIb5XuY=": "2080471000000", - "TkJZ2MlfCe7dLOv3KoUCHwZZGH9mZ-FOk3CH9vsW5UU=": "455059000000", - "Tkz9wDqnYGsPId3VAsxgfi6S-MhozqrFZDS7_yMcrv8=": "378866000000", - "Tl48tUyN4Ilv3bl33PJoxHXhvb9B5-3FCLx8kzikTxY=": "453243000000", - "Tm3qBB25Jq64rqlCRsZnXhHbpOolTL6y4EbSmfnnzkM=": "388432000000", - "TmXPZgMpG-J5ZfYokmKRf4nEKYC598zukJeX8XkN_1I=": "411809000000", - "TmjMzGVL58Bb8qdgbHBn431-M4nWaoW5xZ8E-ta7VFU=": "411085000000", - "TmpfuhZeroRreQGdJda8tksLHL-8vqO0JMkhZh3O9WQ=": "424242000000", - "Tn059KJmqshzlCu252fyoSPC263U1B1jcM45WxQdoLU=": "381721000000", - "TnM8so2H0Ye5EBxR3HErCRMmrdL6JlLLSrLP_DyrrlE=": "3846153000000", - "TnN08zqxSJ--wf919NA-8i21xMtdg3NMXwAr6shLk5Y=": "3843882000000", - "To6Q3J5iUOL_KCmFFHDCFVKIcGEP0881p2mejZN_ndY=": "7507276000000", - "ToCO8Z_t4xNqfw8d47YUUH_dYbHujnzz116DDSo-n7c=": "384615000000", - "TpOMiNp2-bZTZVfgCezfTamieB2n0sk9hmWO2l-KvPI=": "10694999000000", - "TpXeiLOMShVcGXTUOJRCuP92EMqZjXyF7mYY3EB3k1w=": "452040000000", - "TpYi5tGrYo8M9vh2k2o10sU52I4Z8bv5O5tBbon46xc=": "511505000000", - "TpzcVzVtiBR0Y3IXthyc1tvdVR4N3b57Yg6L7Y8xZyk=": "411085000000", - "TqQd0PYrucACHeAAsiQNJjg1VCTIzgx_omji7ICU-ZA=": "358831000000", - "TqYkqfYDjymw6xYZjGfUZdxMT4E_pKk4-TZNjPFlOyg=": "2606663000000", - "Tr2r4ivZCwbPvPzi_8WKRp7PHTAG3MgJFXyjdjv8hoA=": "407808000000", - "TrYdxvJCfN9UIh5zORmv25D5ivU4_SPPHvrBEX0JAFE=": "384615000000", - "TrwmhaqJAEuw1GF3Y2vkYi7u5F9JXu4oNxmzrl_O9ko=": "4176371000000", - "TsMAQPZ1TWxodeVKjsZnu8n7MZanaD4gW3FnWPJ8Pcw=": "769340000000", - "TsMwVWyHVtHZKVSm1_BpHjGqZUn9kfsALu-BOEnqTJ4=": "385508000000", - "TsNT6fsflfNcwK3ZB4ezjmKqHpYEhQAPlpJUk5OKVr8=": "9596153000000", - "Tt7NhQ3g0ja5z2H5bENDNbKbXY-jA2Jjy2-SfiVGN2w=": "425284000000", - "TtGEuEyO49kCcMWQrna_ecvhLBSMqBFMiRf7qyNm7LA=": "2318461000000", - "TtIYdgTmxM1WlxICEeNafaaRDo0gw6Lplfyb1fiXpIE=": "384615000000", - "TtKFj8ZleQUvm48hAEI6MVMx-EiEzmeI5iXEbnMUad4=": "3611667000000", - "TtNQSJWvVE1ffzS1Kw9iSrkmqSFjafULN8p9Qy-dlS8=": "384615000000", - "TuZg5qwILprTrtRjSGR2dKzQ11rIIr0GK-DTTV4oZNQ=": "383553000000", - "TuwLcZ9jdalgTCsBi2Lqj_QoN0T9XZQb9tvcA274aJM=": "3501716000000", - "Tv8yfH30faV5FWQo9cUBI8JXtfzyQwEKoA-vcET6o2A=": "5245509000000", - "TvBJrJ57eL2wql43o__0EoURS_l8MWHcOCnTUrYubWU=": "27820754000000", - "TvIbdM-UTXnHvVBKtISRBM1dg-1aRXU9pBXWUUt0DZ0=": "8352730000000", - "Tvdn9qC545LHGrOcjbicYpo-VsHUQ19YANEnSZcegpM=": "1246889000000", - "TwKy9rhgDYrmApEYYIno0_-f5Axbtg_n4EzwWU5jTyc=": "421951000000", - "TwLSJCOGr_UhQGLJj8wW_VC_RJqGjiF42UK7eyfGSIk=": "19651356000000", - "TxP0IWtj_qIFcEMp2n3zZR5M70LbeG5DGzrZ30fxbTc=": "946002000000", - "Tx_123dwWpxnSz7alHsfMItnM22dwrm6bXd5EaewTig=": "416901000000", - "TxrSSY32j3E9kpoIQQLutxAM92BmVg_QCJMVDHs37Jk=": "1389724000000", - "TxubSzw31e_Quw-K47mh7T8jjhRuyDwyF73iRstdIx0=": "14013443000000", - "TxzB4X2FF3doaISiN8gmNB1lq3_Te3bK53fno-QKt3k=": "3749999000000", - "TyFaA88F5gxUzMOTyEvAvuBI7no5ZSz5zt4E3VdHpBU=": "1692307000000", - "TyVYP3JJivSRcZz5h1cEyjCCVCRvq_IlHmViKBgdkaw=": "624999000000", - "TyaI7Ng8u29ZlUD6uXEvh_dfRloyMsuJ3lUahb1D6YQ=": "460489000000", - "TzD74Ktw8ZZ2Cn6hHD5OF25RNJWRm5UV7p6vkdBdiBM=": "3796506000000", - "TzMnK_-pS2G70ee48PS8AknZCVmSRolYyOLOqw0PPc4=": "416782000000", - "TzSKG5rOvHNbiDk2QwtKdOhKglADzUlopQun9DhsXp4=": "1858257000000", - "TzV5qr3ItJh0sEduXfDMWgp6mUdccfWRZOF8XIukvhI=": "384615000000", - "U-ApjSkJAdX-o8C4b202LDZX1L8IDu1CG1jYG6_jhmM=": "2090990000000", - "U-C7mTdjLbnD4fZXNYQdlnINpMp8mobnfvdWNdX_1LQ=": "906947000000", - "U-V8AyFMmfdgF5hJKSv0mjUBkxsaEseDJ3wPiFgM12Q=": "455196000000", - "U-ZK_bQFkUOy7d3-4hPXuAwoOel1_AY0YCU33MCHd6k=": "419727000000", - "U-kBbgpn0xQ1gIuLjSLq2tzyYyD6VF-VddUhY0q3DuU=": "422027000000", - "U-kqUeIB6UlbCEQ8KqGa7dzcdNZg622qha6NDtBug5Q=": "377916000000", - "U-mU9Oc6nzsLqDnF-Wk1FM5YFNINhyqfHutwiAKRYpY=": "9112001000000", - "U-tf7JDx_9iJEQkQPGXwTQdsdN89iRVuhhTH6IB6QiE=": "384615000000", - "U-udo7yDUs4JVhv0RI5iA7975ralHx0uOdNf_kyl6e8=": "3843061000000", - "U1BolbcOnnP4qOco1HZbcNzHIF0LuQLqHlRXkJT9eIE=": "3127183000000", - "U1Q5fiZuGtYRVqldMke_NSIEgi42ioMeP5jjE23iFSo=": "423370000000", - "U1bQpxzcraxj3mSG4N1Na5gf20PNDoPrURrKXZ0ghdQ=": "384605000000", - "U1m6fh8_9BiNlv9_S82utLX0euV8t5fsBdWJBphLl2s=": "359692000000", - "U1oyR6oXzBLIxPkWwo3CyxiHSdiO50iH60KNDq87H5o=": "422592000000", - "U23-yrdWCMjj0sHJMYQPsFZiZCD95V3h4zQiEd5ZzV8=": "769230000000", - "U32kC_-UAKT2HxvvEQ-YNIHdKpf5wV0UkMa4lAxn4nA=": "498912000000", - "U3EPcB_dIRlChCMpfgPS09yCNgM9X8TzNV86l7BaKVE=": "384615000000", - "U3TTYGvzo19gdM4b14kHMkvg3_ftO9XqzaX4Mk_8mfw=": "1154183000000", - "U3y9DfojeXsjvticKIty3CPYYmTmThn7HRHliWESu3c=": "382536000000", - "U47--PZg2UNiL5ghkz4UInGs8xGALTiqzaiq0RKwCuE=": "416559000000", - "U4EekdnUAG3ZwHfLSXzGB5pnRfgV-_FZ3vFmTcmXVoA=": "1362069000000", - "U4tEG1D05OVAO22uTVEYjEFWkUfz3mTHli8vujPGUf8=": "385507000000", - "U5EClb9NthAmHXZ9bTN3URkFmTdZeuqKNl9vkfij0j0=": "448357000000", - "U5i4_5PbaTrtYg3fcPmVnWQHoQ5XKDwfJkHwEvYOzCM=": "4166666000000", - "U60OU-E3UzM2T86Hl2M6BaKG65DIZ8tnzJpNGNVsnWc=": "2499999000000", - "U66Q4DYTf7um5E4p9BBps8IAQaTmgMmxU9uMEQT0x_0=": "463146000000", - "U6Evr-GCSW6S37Aqe3983IKylPAkZi18UXx2-70H6HA=": "422350000000", - "U6gsAeqJ4EVeydeAgKTHmoZBuTI5EeO6UgYYC2w_XsQ=": "405229000000", - "U6kZx2h1xa9xIcgzkEsxr8-OkgT-9JDu2Rw3ZCAwimo=": "4635586000000", - "U6o_5jQbpU3nCymCjiuCFPll7NHvErkSKa9hz1WchIc=": "426923000000", - "U6tyH3EXzAKLxi1k4Hxt_1Tw_ciYip_5Ctu1tiynl5w=": "676408000000", - "U7Qx7OtqL0XWYDEJLHBg4dvbJHUKOoMDWpreY_Id4Z8=": "418059000000", - "U7bPLCINdK34nPTZjLeBYqbYlHvWn9b7sJSuO9iIf4I=": "380620000000", - "U7kiTbLrHJldcsWhv1pmqZSEvh8zrWuCA2Z22yVmiUw=": "385465000000", - "U81PJlM7gN3rcM2_wtr-EQk2oJzmKRVv_rTP3liadok=": "448101000000", - "U8F_Vq-p3Wc3I6hl-Fnd5UHxY9aS9b4Pd6V7femC0Bw=": "2136365000000", - "U8kZtcez5UIJvGUv3_38lwJE3koECmCsedHx9356JGk=": "833333000000", - "U8zi8IdMF0IFdt6tDCOSaim_gYKztf9mmrNNlxRbG7E=": "378257000000", - "U9Ar94IjW0V9Hr0LG_-56vvqROfK1OZRgE3hEleG2Cs=": "384615000000", - "U9FDY9sDaO31kJMZjkLlV_Lnm4gaLtDVWQO4pXmqNGs=": "769230000000", - "U9FrGqie_gAoV338QbtzXlE7M2HiosvBqNdcYMEP8uE=": "386099000000", - "U9Wv1AYXiGYhijS2bHN8SSSf7y_qqwd-GXSZdA6JaOk=": "889356000000", - "U9tYPgsgslUc9yEdf7xO6eOfzDYc18TH6b4pRBCthbw=": "19459198000000", - "UAfZnLJmkyhTHXoVojEiCaKVHIHMuCNDYl845ANDEOE=": "383695000000", - "UAnPCDBXq4pdxvFBztPb-wWFQ0QZaQR9ZD2MKIQ8gEk=": "1525894000000", - "UBJ0rudgvvF_FjZUuA02VgbcmJrCX8vp-mNU1dXQxLg=": "3465711000000", - "UBUuQLPmgVlYOZXPCKft35k3XppQCBe0U_7xf2rBROI=": "1639504000000", - "UBr6cf1OyVApXs6rFpYGumvDetD9tA0ZX6rOogXXde4=": "385895000000", - "UBx3kGsbw_MsOgfRzfxUeCZXgQPNbvFm13B8Kcgs0l4=": "648410000000", - "UBxk1DxGsJQM7gFMeiz3E3dLcPMpuIDyEka9P6asNEI=": "8461538000000", - "UBznrkHjH12BDxeeVDLAgaxaf-SQd01hRL4UX8kgmgk=": "769230000000", - "UC7oEYIhQOY5w38IKJQ9PVZ503ffgPAXaxPaU0TX9yA=": "2525808000000", - "UC99c0JOorWmt_sYDJkIwl9UPTl0G7dTBt_S-Y45NGE=": "1388517000000", - "UCXyiE1VCh8ixc6It83RidO1AgOhHM9RXiYkldhqkH4=": "771858000000", - "UCtIIEP73loE7_mstCVhABWVr_NTnbnVTuRu9rXzUuc=": "388874000000", - "UD131Wik6o4uSKxlhSCx22JGNe4Um54SIe9xq0E65xg=": "384615000000", - "UDBfAXPnbbmUxhrwHubNjJP_lN8N3fR7SFhkFCz5KlQ=": "440291000000", - "UEObN3UtABFC9M3Kzxeji70_CS3CO2aZvET4fu0ocC4=": "384410000000", - "UEQasmuatkRdj-D07FaTdYdCJYXaMNOHqGKLpggeVn4=": "1879855000000", - "UF1XzRHoQszjPlbw_D6oou87gdJz3caoeYKBAtGNMl0=": "383553000000", - "UFCTgP4kA6BAyOuEDf3ys79dJUi58Z9_uK7CrOwaANM=": "384615000000", - "UFf4jme_qzaFG6nZmyvkcAAbFapYkFqbdI9Ah4sDQ8c=": "4169223000000", - "UFtcny72NXE-yFnAZ8yxnnKl7xfSLv5191-2T_7XHN4=": "2087534000000", - "UGFuCzOKpEINMyTMy-O3N1cebFFWdZHGmTmPZQVI5j0=": "1923076000000", - "UGOB-NpCIY1oh597EnnoKX5SoCYZp6F_tIcqCBlCDfc=": "1366800000000", - "UGRxY3izmR8tbWvaEHP2VO6-e-1ytXTQgH1fYctThHo=": "526076000000", - "UGWsXU87r-ak_Ji8dyeftgO_6oLx2hMLvWBvYvq5nBQ=": "414989000000", - "UGqooaqLEl_8ejZI99aq-AgaXBu8MF_je6-0bAylgrY=": "416666000000", - "UHGPafr_gmCTMMnx_qLrLYKlfNeXdeWLU-4RTEQYCmI=": "1377894000000", - "UHPtzukC0xli3-0KGBqhpKsa2WbIWIMptqHicFjHcn0=": "576915000000", - "UHQfcJ23rRwDbtGLK-EvKr_c_7gsaPHiYJ0f2PiZcA8=": "2267876000000", - "UHmgAYDEExgWrOX_Y8Kj6jiXalsuB2kwhV48XVYVCuI=": "413620000000", - "UI8o2d0WSrT9u_e0M6f6Mr5ikeKjxqHuN7YP3wLVtNc=": "4173355000000", - "UIl_eeJg06OcfYvsSSaossxvgIZK1FIVlITZM4XSkmQ=": "499999000000", - "UIrQXyxe_pSJVb190dye4jE_ozAYfyvNfq4Yk_obFxw=": "4178790000000", - "UJGXUNFlyrByr9DWfZdUZ_8HWG2kCNMg6oXGaLaw2CI=": "459419000000", - "UJG_vL-9KGKK1uFabTNXyV7bWAOkS7pwcIdvkGBfIHg=": "384261000000", - "UKGAfCmJ0epL0dZsFrdtCeljm_oc5T1AQa2Ih6sO8Dk=": "416666000000", - "UKfRR4z-mG8Awqe7ip1lN7MbcVXwoq95FqbAHlNA0Fs=": "1250011000000", - "ULAsEqaQYfgENPsu38C7-IKxz2x4pwhJ7SNEtc1-kpE=": "385509000000", - "ULIxaNOHDEGdpHCCqTrnW4dZOLMIdYg2r7X0UnHBGHw=": "457355000000", - "ULRImLaeJcmV122wzvHaiHyJUJBWMX-LeXbbtfdrV_w=": "417094000000", - "ULTU8mIkTDs7b4vnp7MXqzI3XaF09NlTi3Ivghq1LMM=": "411085000000", - "ULlJUnRfQpmTJffDF6rY7oXyxBU6Gs6RH4XvZuK7eCE=": "769230000000", - "UM3BTA_b4ylBDlEZSqJe2EmnNlwYLaXGerNmKrqpUS0=": "767106000000", - "UMIT7svYzWpQ6A71K_mye_MwJELKm0sO43DeSqB5lCs=": "4138988000000", - "UMpk2P45eBJn92I1dsD3Mldsj3Qz-T59_vqj8nwC--0=": "5461524000000", - "UMwoNfKzwvnny-gvr4wInOSbz--mRL_jfRxZyiw1uFo=": "1366800000000", - "UN3QJg99rJ-X4ZqRELOnaKGdqlnxP2MLKMofm-0ZNgs=": "18512971000000", - "UNa4tmgtiqn1EJv63kJxHNQMcGp6x17LoW6KSoCgOow=": "1882921000000", - "UNxdnw8JhKyVfE7VpluzSeYKsydG1K6KJndcf4oY2Sw=": "385507000000", - "UOB0S3_CjujM5pItyIO8F4VLpsUCoOejKmOjkDYF2sY=": "488631000000", - "UOKQWiWZ-eQW9ZvC43dxw8a6xv-TdiOHKkmtAcdHd1U=": "397332000000", - "UOU701FT6as5TlRHtFcBOjKjyIPMChK4fvYv5MdzZtc=": "381635000000", - "UPFjLXP2BY5c6BRQq8uhx643TEo70rAaZCu-3P-kjUY=": "831117000000", - "UPezFePS8RcCtCLkQk34TvSogOcpnoQE4-eHYlKy-kQ=": "458778000000", - "UPliZE9pXrr5g3Eo9nf7ny52xMy8ti8uF17QTzM9PiM=": "454545000000", - "UPr9eyY_YGY8wPSlnYD_qahi65_aQa8rcgZs46VTRZs=": "469811000000", - "UQ5r452MxiINSZOMnCCUt3vpfJ4I9m8ocHs-yqwbVOc=": "504260000000", - "UQR4pQ9BnOt5n_VU5QLFZY_JfVQuu7I6nfDH-01okFE=": "7123151000000", - "UQjBpyP69K_VPQW1DyNSuWuOKtzOojiuHOFl3rV3vD8=": "1922723000000", - "UQkO0vTOWEZczIn41dpvkCsaQIUhH6b8wji07d0oeRg=": "1350779000000", - "UQpIvEAy5H_WnaqgHYN7Yxr0xpCe04hCkX2KFEikeUw=": "385528000000", - "URoFmSd7XxTl3hOBgQD_fBbJn8qwC7r9Pxn9W0LeLkk=": "4572549000000", - "URyI9_0aJ9qnTRqBPwiM7FtzBy6nGpR-FHoEJt0w-yI=": "3621396000000", - "USZor7AVPy-L1hzfnn5lvLvQsUhcvI52nstgFg_MDtg=": "2291929000000", - "USe0WqRtvJmW2MFXMMlKCUV197OVnoEtYmMSwlY6PIc=": "454543000000", - "USnpHBzAL8hwYQVa-Up8q_kTQe4cpUzuC9ZPHbSI6Sg=": "451760000000", - "USp_k8JFXk2n1FLEga_pRaWp-Rrs8tJ4um7D1WRvs5o=": "385510000000", - "USy2FxkD_VFa8inVXM6srHIMMVa1ikSy0ajTxz2qkBU=": "471937000000", - "UT_5vQpKi2QmkwjhrHZmbfhlMJD_JZiQ0GXILYGw55Q=": "1256564000000", - "UUS2I2ZquT8oPjRzf5VZo0qOleqYC2dr3haNAzJcgYY=": "416666000000", - "UV4GuyJarqKezZ9nR5UNvnQOLwVTss7W05_ck5WbwKU=": "384072000000", - "UV7MNYcZYAuyPSfyQ-XKWwCjRfU959wyFuW5_47Jlpw=": "12499999000000", - "UVexFudrSs2huhmsc7w-DKGAxaFgJ9WTB7pxscQlWCg=": "393019000000", - "UVhxOReZEBd2UfFzNSBnA7iqCoXDpqi2uakEI-i7gDc=": "2537908000000", - "UVpdmkh2aZxyX-gUpyBqrboHNaxuv01F4HjQCjkJ8Rg=": "385505000000", - "UVwKGtwUQnXXkhhieqUfqRfg5_znPsfoewOgWJB2d_4=": "383488000000", - "UW6dNMA51YL-5bCqcZKGR7kjekW1rCSSjWbxHWdtiyE=": "603447000000", - "UWMidlyTryZu6K8jewJ52OKOxhP4E6v69VZjBdqGCPw=": "424007000000", - "UWV5ivveaZsI6fxWZJ6cxSWjsFRHZ_Hl8dj4DlfJ1K8=": "425636000000", - "UWokLLCiuk1IDLTguz_EmBCSAaC1twBWWOoZBtRrT9E=": "1374999000000", - "UWt1BpiRL3_dq2Rf0PE2VvgGH7A_QDsDjxfnnFe4hAo=": "384615000000", - "UXYcJwh_P2tEI29d4U8Jk1O2vp-ljhM9T3d2whUUJ1o=": "466466000000", - "UXi3JAz8AtFNKxFYk7kBQ7bmifdove_EZreLP-VoXsc=": "1877283000000", - "UXrX0RT6kxMEqRywKI8tTrgpoCWOETASbHPv_LKj8UQ=": "402407000000", - "UXs15pTWYivwGEMdX1-gm_fBVRdB-wFTQOMAgYh4Y18=": "1233257000000", - "UXyui-KdOIOaACRWw54EPFFcRdbMOb0CBN1z2nZ11zk=": "456774000000", - "UYG9AwyE2FUxIE9kfFZcfvK-YJaf3sfyPosEYM0tZZM=": "619999000000", - "UYa5o1EH3DiJm2csZ_UEMajqojKaXtkpbVRFxkE5zAI=": "538266000000", - "UYbTazWQqjAgXH6RfzHbtYEdfZIWjxDtC0w-OOAOVyg=": "908051000000", - "UZr1aJUeDSci_uUC1bcvt-Q3eI4IUKt2Rzqu-y_dpRI=": "1270111000000", - "U_XPwnaRV-yz2exy6g2QfU_hKz4xsDo4iz4Eb60y16w=": "381767000000", - "U_dS7NDtBhAsVCBCwvejwUdLm0ROieBPpvchfwKP5ZY=": "3758700000000", - "Ua7MEer5P2isZ7bcJKYuYB1NdnVaZ2OAZJ5JANI2js4=": "950594000000", - "UaIDTTQX-2N2_IdWoecn2fUUOQlpQfk653SsUJhjyUc=": "692307000000", - "UaO2fFbXIBJvbpi_w6vQ6pSQ5un5KGj9aDlnGMa27fM=": "769180000000", - "UaPcoot8cKL0jD9aZ7-rNq4skBQb1F9qbLpwcNLJbs8=": "384615000000", - "UaRf8xjX12klxL_FEk5b4MBE_5oHcn2DRNBEXhKHQg4=": "585471000000", - "UalOboKAIvlykSCpaj8sW_w3U0QvF9r2-qt041PALZQ=": "771572000000", - "UbxLFovID639IPmwnjpXfMTvhQn7qU04GmIvLZsNzTg=": "768328000000", - "UcI57xyZjqlsf0EzfdUGc_kip6tcKuQCk_ToXDLwuWc=": "384615000000", - "UcQ4KZ7GmZkPeuk7idzAPG2X8bUUVD4x7whl6Lot-9I=": "384615000000", - "UckCINfSt89JKQYO4FwEIEH7WyrvQigtfOVEMhkOIjs=": "482124000000", - "Ucu1xUGg1egZh0hyXefdrV2fFSdwwjgPZQOVdxiGFEo=": "376736000000", - "UdR8dO-j5-boTtP579DSjBmLRp0Pk6rnTbuxEHPAOFs=": "1688787000000", - "UeM81E7DaaMQZwa7UPH_U-hZ4fY7Ea_QzmmgnD43FSE=": "2037666000000", - "UeZjQnt6ofx9QGtKgfe1_ndKYFT-lxBn2DfvWNpAHPY=": "463193000000", - "UenTYf2tZNoNsMEEqaXLknE6DAxbvaDWGj7CpJRJeg0=": "5551585000000", - "Uf60d9vWEUswjwdulTk3HNM8OmqbUwR6BQ7sQfYKpPI=": "384254000000", - "UfDEQXj7MFAjXzp8w-oTJmfi_k8kyAiY5vo7wgTUhVk=": "1013718000000", - "UfWYS8z8aGLG3gPE-S4Mz0s7lorPpbVAfpaVAUbLjUc=": "769230000000", - "UfwGdXU7H57pPm3yW-giVTh6oYvpioFIECGCnWoHvaI=": "641599000000", - "Ug4E4RnnN-_-STvrgvpl5eOXRcZzSDPWyYDJ8JYABvw=": "4144089000000", - "UgOLMcjiCBTTD_CiRTOz0gumSizqq_DNiljGMBhDJgc=": "648774000000", - "UhOyvN6Z-CLbhSTv7S7EDwteyNu8OJOZGvWoFJwdhTs=": "524432000000", - "UhQHcLHF1heoSIOvh2-OAkaP6flfz1BjJY7pfasRYRk=": "1476346000000", - "Uhe0IrL-z-Oaj93uErWh3SPT_sO3Ksi1QTiEKhqPeAo=": "385224000000", - "UhobtaCiy_OeaoT7XwYOOZU8iMwHmtRoT7z2w--5fJA=": "411085000000", - "UhrZDeJ_zqC3hXdGdkPhkndN2XDboI0axpwb1cfFSCQ=": "1994427000000", - "UiZg38W52wbB5qvE2jszF5fAL9rXbGFj9HxXApa8y_w=": "696009000000", - "UimSuJ61qadOcP8I74X1ieap18YbbbwPtqoBTbZ35ug=": "390975000000", - "Uinq1-5bwSYn1nMGDTfNdOCrbTJ3vy4QhKxm4VZ_uyE=": "567449000000", - "UiqsBvYggGax5EjEYIm0PaogChtYKixs4wHhyHIUMh8=": "384594000000", - "UjN5wFnOnmgcoj2yrwi2cZKioVe5nEzJ_yLOQ82AK30=": "392734000000", - "UjvkmC0QodF5VGKXXPqfpluiAWEawgOAHDWCW6DBWoI=": "1366800000000", - "Uk5Ag_J9R7e0ycD69AcB-LRihv7FF4X3Lbt0LGCDiKA=": "423370000000", - "UkELCV7nB7ME-QKA2SOT9LXhlI6s7AhKhHWuIa8ZTCs=": "498758000000", - "UkhSGIeOPl4OIMel1VJITDhFlRPfOhNMgohhfUj1mz0=": "654299000000", - "UkxEhLoyKWd3BraUK0aR1dtTlAS1NdXbydeAVwK9rXI=": "7565566000000", - "Ul8KxFM5r4yHJLVmP6M7NWhoB8bDawDUkXvX5do_CVU=": "576875000000", - "Ul9WD0EeYfRL0Qi5_BueEFMZ5n3AY-o3xcoz9FvSCFc=": "897549000000", - "UlECYtyQQiaEqg8aDNi8LpDtPWHxrjfJzBkCRQiJ2UI=": "460445000000", - "UlKR8geVktv9uOVmNgVDW6XawaqfhYZQZCxxGHAlCWM=": "379946000000", - "UlLXlH4-vn3R5Ntt0yQ23oomBJwyQqBizVtDkovHlWU=": "384615000000", - "UlsDKwT13fy8F5TQbjC5YoWX_DKzIWyZf4LU7tVrVew=": "384904000000", - "UmLCj7fni2acIEGfx3GoXOc__KbQn47tE7d8MiDab4s=": "1625155000000", - "UmZz49dcQNO2A37p5u8QCiT9Tvb-6EWaSK85sgZDQ90=": "452774000000", - "UmerpKDkIIbMPmSI7oaCEWTrt4UlT_0CVg9pYGnHeRw=": "383934000000", - "UmpMxfTakxVW-M7KPUSYgTNR_p-kI6u9L1_Rq6VeE94=": "380818000000", - "Un2Sg1b8ER2tp7xqO0-6yLMozkGv41Yxcz5v6NgWJw8=": "384615000000", - "UnEcouWj1WbwID15gwNjFWtoGCt2qojw3MqNfnegOL0=": "1156518000000", - "UnS36TzBc8i-WcXbbgqUJT3mA6WdU1yK1vMAK5eSp0A=": "2202734000000", - "UnlEegD823CuiDppuF2ZYDQHKBUyI3gBVzgBaGb10Ek=": "384615000000", - "UnpYWojCNwlL-xFqeuswmQm61As9a_-UnxXQqrzLInU=": "792307000000", - "Uofa7B__dfE_xYrsCo6KdcCkOwRVqdzhGZdMbxiM_wY=": "384615000000", - "UosWcvOgJGkSkMA93o49393X1GUFDitGC5CTYOIpHRU=": "393267000000", - "UpRSDH1l9eNgnqC87AYjj4t1q6_cYYsFQvHLEa05HAY=": "895446000000", - "UpYNCwBrEN6KdzvmVspLgl8vJkY0_7jzWHLX2idAN4g=": "766331000000", - "UpnfoJ9j_5s0SfenyVbsTe4QoQAGcH7uHS3OW3NoKtQ=": "1162716000000", - "Uq0gOD26i_QhKTy5CHTGM_SVeyffTV6Ir2dMFgyMLIo=": "1168375000000", - "Uq5he1MvlXBQtZ_RBWm7HwQBT81KJDqE9U9lYvv6rFo=": "3922333000000", - "UqV2sKYRtt3kU1pT-C-TBpNm2_-5Eg4xzy7KsYYK4wE=": "382133000000", - "UqpC_eVYbfKHOGvhjf54NzYXS9Z06aGgYRwAVCmkRpE=": "384615000000", - "UrLElx-uANsHREL7FYN3ROnL6586f53z4q7ENaUeFv8=": "384615000000", - "UrdSyfcQ-1RMCUTGFaUjFwe454M0QX16PqqFehIqoFo=": "3376960000000", - "Urrcwjcdkg4q7KoxFLZfooGeFCJm40u3eS8YoY_PK1Y=": "424482000000", - "UsCsFOn2hYBKo6PJ3KnEQC-1syuxhtirn6ox4KAqZYU=": "1897701000000", - "UssiuSdvQ3c7HJDXPd0OY_QYuZ0d2MgK60oe-HCx70E=": "16184524000000", - "Ut0bWaYMskNOMBboFmRDD_gRt0IvPJgzUGjpluYIQS8=": "684400000000", - "Uu2fvVv4eK76iquHC5pB8In-rgQmdYTEs6FjJah0Eck=": "4015222000000", - "Uu8PN-jbWKGw_XL7vVCx8THf-EcvD3dKJ3Cdd-F5imA=": "388604000000", - "UuEsj0TasmnaTVv0FWVIIfbjocDgXEQCc95Azvz8ELU=": "469318000000", - "UungguQNcXdPIR4CZOdTVmjlgSxP5gP3FF-b8-MQS6c=": "1624340000000", - "Uv-KXzmy09Y78ZPfToRulwWdQiJ9q0PVGhDXycJH2gE=": "384615000000", - "Uv6QEYRzoSVrgG364DvqPrbRtHl3Gccw-egUJDGUejg=": "2637613000000", - "UvSamsvJBb16b0P5R5tQQ-h8asMocI5J_wFGBKfcQ-g=": "4125973000000", - "UvqLdydhvEOf7wvtsuqY3P1ghgDP94S1K4Xn5gvmY5c=": "447058000000", - "Uvrcirha-kqIjm817FmNEIjWxAG5b1uLkrj6rWc_8W8=": "1168884000000", - "UwmQL41I9PbQ1ijB_tX256QadbCtrYmXbTRm4GXdwMg=": "472840000000", - "Ux5ZzJLEXHFcy25I37v145dQuP0pnmzUDPvoA0xn4VU=": "384615000000", - "Uxeo4eThs22ZnEeErK4glsYKOy1nBFS8C_5856qhE6k=": "766127000000", - "UyXDGNanq_Vtf6JJRDcWuNAK7j2sMjL--OuzUbLDp9s=": "460524000000", - "Uye4TIpIN6WS2QxKk0liz7tiAH2VwG7i86iSXpkBBA8=": "387690000000", - "UzF_WmtwJxG_V0iXfoWZXF91Qsy-_xAmcb3szQBy6-g=": "384615000000", - "V-0clivnAZjG2mONS2bsvMYkD9xy0JGU0QyPAHUsM28=": "417633000000", - "V-34dJ660H2PJ68BHwoH0bss8gaCoFg2TgfmQ-KD-t4=": "380298000000", - "V-T4luwSEroZoFz7uHcoDe_zG_xOotxB3elmY2AdVnE=": "4166666000000", - "V0GnWJ4nqOGKGYaVUyBmsCwGXtHThV_zQUpoyhECRlI=": "3852918000000", - "V0JN8VOf_uh0Eq2MeASM5q32-g3tNmbuBFsAiGO-XtY=": "863636000000", - "V0QBiqQ2jPfOnA0HENLe6_d8NsJgDxL9QK-gMOoe6fA=": "456369000000", - "V0_ePGxPFRvkOcc661zUr0x80QOVnG2ssXl2ycHCFn0=": "462320000000", - "V0j8taZ1lOVnQe19KUV5NcFwv8DKe8KtChOvMzYDCB0=": "18823942000000", - "V1HkJKyISwoAwBXcSBuwaFH0u3ec26qPX44AjCrVOAo=": "1144901000000", - "V1MZfUEaefyg5NRj1fZHj_PCoxRR_OQcComs7tSPErU=": "2499999000000", - "V1OttW6si4X0lx2dTF4ARg92fMoOwseEqZ4mulBAfxo=": "379260000000", - "V1PPps-4rPhg-tmV_i05rAS49nspeUrM-VrpciLver4=": "1131929000000", - "V1Y_NMPqF-SzKoIZ7c126JU1gzX2iiaMHUp_JxwQuy8=": "385507000000", - "V2CRf-XeQjoqHU7s7eMb0FcNuOmgi13BqpAcAPSNhRs=": "823859000000", - "V2HzKow0u9iygL8Xs7e_5vR1YuCm98t7c46U5uHX5kg=": "388356000000", - "V2nAeIhH3TVMAG6E-SSKkRoWW7_B7QewyBQOchJse08=": "395497000000", - "V2pLCt0dg5m_G5Ax6JWzBVZop7LSgmdq17oHb4OIwzI=": "770235000000", - "V4fupqoRPcL0JJBq8VlwMo7kyIowdKKyVw-vcJ57gVE=": "2733493000000", - "V4qvyItx90VkTbFfCdXWE6G373v81D6tmo2TodLQIts=": "844355000000", - "V4v2RITsoVmkGabE1HIHZFTLUtOeW3AbBJYoGAKh8b0=": "385507000000", - "V5QNzcTJt92zxV-0Y43Z4MuIN200Ff7TBcFtUtBJ7M8=": "532504000000", - "V5lq7S64SwYbrRovZ1sgJpI3TOoA8g2RMreN56efmPc=": "4001949000000", - "V60tT8okfc1NqUSAUVjEMT7bk9PF6LUXtHC3EG0GgF0=": "379260000000", - "V65b2tKex7ytUXulbmtliqlUkiSxbZbYlMcKri9hSO0=": "414989000000", - "V662FKausvBA10BVS23yh1ZPS9xAKqgztocO_QRp4Vc=": "3776928000000", - "V6I3NrQCTl9ftHJqkScD3kMtQf2EyFIRSP8mpNc532s=": "462146000000", - "V6NTlvTg_iYfPskJQU9VTkGXfG_wSDsEz3-ZP_Iec-o=": "828916000000", - "V7illMrqEblDCE8GkRcucZ6K19r0ijhAseVBZc7IpbY=": "625021000000", - "V7ivIZ7ZFVKQNRsTm-CAfDRVIsbJVbrlFWaf3ize0-4=": "500521000000", - "V7qx7GQc8--wluCB9QK09jNXbQNRykl_7FYsEyEiRMQ=": "384384000000", - "V87FwywvzcGAagF9eYlhEvEqW-FPfp_e1rfF_sn5qbE=": "416666000000", - "V8ICBz1alfmR13PpibVb_JLWi7S8YXG5WlR-Nubby3M=": "1212042000000", - "V8K8GBYhsEQz26IyoD1GZpE2o2imXroUkcIN6WDu1Dw=": "470553000000", - "V8cPHdnZGvzu8ihkJP1Te6tsvcS1_HMV3tioiCq0YO8=": "423284000000", - "V8kJgPPaiy8tsv0jDfnQaXq0W4qjjfLn04gg06faH4U=": "3254676000000", - "V8oHwA5ce3XTWSV4u3agxK2ZdFqaXNjhllusv1GpK0A=": "755057000000", - "V8orGFFBg1V6S7h5UVqSK60D4XRMv_EenWHSynTkq08=": "703293000000", - "V9HzFhdhDYP5vtPSIwwsBQWMM8fsSxXqn_2vgLw0Mgs=": "411085000000", - "VA29kemGQ2BlaQsjkdQjeoVA_kWqAq1VVuXMCnQKB1g=": "4166666000000", - "VA3TOblhncl3U9fFt6o0XhahF2TIkVJuJ_tV2z0ds18=": "404714000000", - "VAQF3wq2NSmtjy2pD2Ot94LT09mrLN1eNt1gE_2yhEM=": "416673000000", - "VAUouEmPlR7nkmtXd8rmPY_3BAmtYzCQ-3bRtXUxCG4=": "1892615000000", - "VAeFxP4OexxJlXqpux2t069_M31Wq4UIpOWp6zfLWY8=": "384631000000", - "VAjxE44_TxdRmXuKYzFYhd5GTx_KfPLnP1VP0CizJDw=": "385505000000", - "VB5VS7Cpgu4MVt56_8kF2Mh7Fz6caGtp9CoYKxGZjCo=": "1759925000000", - "VBPaQE23jt8pylNVb4CA0ch_GX4Jigd7ZF3s-4iCoIk=": "382479000000", - "VButF9IwYLzNl8kMbnjweeL3i9c0hZOEqnOWmPL1p3c=": "4090348000000", - "VC67fmh3QWHz-vX63QZg1E2E29eZUP8LZZOPsQ6rK54=": "1629719000000", - "VCGzAYNE5g2ngMRBWHWP5a5Ujfc4TGgr3l7ShvqLL4M=": "387617000000", - "VCRU9k9NoUgkHPaEbCt2xyWZ_WF0zLCvW9jfYHXbv_4=": "2692307000000", - "VCWfYnMzFsFkjGrKf3E2akx_qYPtHrRjHqveVvEk8B8=": "416666000000", - "VC_gzn4nPg5X8waVIgHCwHyu9wuG1Xvhrjv1Bm2GzyI=": "416666000000", - "VCfMx9Efojx0rQdHZ-Xx0PExace2ldbVRs5SFqcvf5E=": "416673000000", - "VCunRNkqjAHYj7gAYmrM9iSSipfQTBoEfyVZpVNY6OM=": "384615000000", - "VD76_Li8Dxt5p6ebQBz6vqc6YsozImAmIDfg55_Bstg=": "405229000000", - "VDCzgO97TtKOSg2OY7tqBI3IVIhftuierkXt2Zse9g8=": "906558000000", - "VDDHOGsFF2mcCzhiIGY8plLkKwky2056Ogb5mH6Culo=": "454545000000", - "VDKUZsmDX2NdycVudx7MA2xW5AnFhVVhiv76ADLEbQ0=": "769230000000", - "VDjPkj1G2WOzSTZYPYwHtecgoUaEDLASt9cR7rK-dtE=": "626923000000", - "VEXIrgHU30tsAZ3XLxR5crWClxqSWkIu72BztM3Y-k0=": "423177000000", - "VEXUk9om-gdAiInhVyn4-22Si7fSUX7CpYXqSlxzLQc=": "38550901000000", - "VEYLoODg8Aq_KUCE7XRRbCamIFQnW_dY3SmBKFFINZ0=": "769230000000", - "VE_8btwna7tnYW0LStu7Q1d042uiRy-cggz_LuS9n58=": "415631000000", - "VEoOUJxBoNguKpMNlbX80cldF7PMMzGV7ZxW_wssUPs=": "382165000000", - "VErRMAhhcBby25mm4Za_3XlGIMviv1iVgv_l7kz1pN4=": "383733000000", - "VFcr9N79rU7UxDNTXL9Bwoa-PUAZTMRpfQd10sxGz_c=": "2556525000000", - "VFeeCgp_8Y_UR4vfq10rrYtT5dO8UJNXk7a8u5evsX0=": "713625000000", - "VFqz34HIoPTWFeZh6Js6Jjx4k1AKM3h4h6JJoWPdEPs=": "454545000000", - "VIOFAc6YBzU8q6zjmzI-bl3FJNh7ukZv8tUi52DrcbY=": "846741000000", - "VIlh40RlCyiMjfBatu5p7-5Wd-n2P-zQXiT5nR50GFM=": "416666000000", - "VIm7xLMxUq9fnOv3-bnC-vT8R7TGN__sugvtwW0CI68=": "1249754000000", - "VIrLxIzZSIORDMpTB0R5hcjA9Fbe8-YLTg70FbtNdMI=": "416666000000", - "VJ8iv3KEknFpNDpTRUysZy9QrT8eYv9fL6de3jJVACY=": "382483000000", - "VJE62GLzb6KYq9Ihi9GRIr9hdWkEbviQ94iBJ0Tw9FM=": "1927528000000", - "VJXpdiF5oNpXciAAyJW0yWf6lwPeBBWJ7r4GdvR0YWM=": "499999000000", - "VKBL1KuxeRH5tEtOXaP6rT2AU9ZMGTCInFPOJM0hmaw=": "983799000000", - "VKNXIjNZ7U_wkNYRqTXc7BbpWOJacONNN0JTPRHNNgM=": "769882000000", - "VKPOvvpdaiIWor1Bsw0NhTCP8fr9Zid_iXXYC414oLs=": "1153846000000", - "VKrpxm_1d2a1OWXWIoZCeu732QbEduU_XDf7GvO8WbE=": "454545000000", - "VLTt4f3zcFZkIgaPuau_bWIzFi9l3FaLWGE44w64hHQ=": "385507000000", - "VLZcWMmMe0b0vcKU_Uej4gZaXP2zNVdJywXoYKfWC2c=": "4026000000000", - "VLjnNw0QW2-glgprpmOOHmB06Nz_y8s3I60bI-RKYU0=": "1196011000000", - "VLoKsrRTv-x7Sj_ODDBZuKlgpzT-pQIbq7rUnSQ10UY=": "385507000000", - "VMVx5mmDHQfIDUa8KUNHaOZW9gi2mUA8ykHzKdOo1v4=": "1038990000000", - "VMWp4lGy7hRq8VRhuF8kL5pQpFSrqMrcIg6o9uqN3pY=": "1923076000000", - "VMfwud07--Y0akmNiC1PMEc6cDFiUr9evbcOAipIRNc=": "894454000000", - "VMhwfn9tQzsDob77J2fEJYpC9o5_6B2P0WCNuc2xkvM=": "810455000000", - "VNHMEYkwTLj6fQqGMf8YcWJ9LukG_5Pub1AQQ_veC5A=": "588869000000", - "VNcwQDRKvTh18P8-pnhEeuD2lMWaRnGui-4J7o9mEQI=": "462146000000", - "VNrNzUTmEyGjiNyJnU5WAIrdQ11d9Q3Ce9j4oEEpj7I=": "1156520000000", - "VNvgmRSnbwiC3rpVgY55n32osZSMCI19Iw6bB92Mlv0=": "541376000000", - "VOYbxqutKqmhScXnoi-6yQzNqgVWQJ5cGeiHtq3cgp0=": "385153000000", - "VOd_r2jZO51AY6N2aFn_05udoucnTdIh0imXBZ-ezoA=": "385507000000", - "VP0iXlwL0CMW9cp8Ikfpa3OSM8FdNK-I-1S1qiL4_O8=": "383197000000", - "VPNRTSEzn_9woKyiv9NNyGNUalJUcW2ds3lx9l6v-jY=": "407469000000", - "VPRQnHZoLYia5pEDdCBnnQ2pYMNXrUprVqzyGfvBsso=": "32338450000000", - "VQ_2xE-KbTPRurVBnBeKXKkbxRl98r_Rup-U-0clykg=": "692307000000", - "VQk47Uh4IQ2FRMsIBf7B0StB8ezfvs35jKwwuGIwAj0=": "536047000000", - "VQmQUeI4YU8E1hLPDfeMHIBczCAX5K310avt456Q0sw=": "1153846000000", - "VQuO8-ClHyllv4ErCUxRt1X2UgvHkFOI-4cJyUx2y_0=": "384615000000", - "VR5V3M5isTXEzzjWlOzT19rqBOcEr2A_Y5OJ4QM5C3o=": "1134504000000", - "VRS_UyY917URHvqFEScbj3TTeYMcNMb4I3uEfuMhCEA=": "384615000000", - "VRgWysN5Y0syI6eM4UI6tb3jKgs9sFxWRadpnMHJ2ow=": "381632000000", - "VSszP2oX_65-d38RaZMGYTmxYewUZU6wuGuFZDjO9oc=": "423679000000", - "VTAh2byHmhkgXSgKi4vsavXnZSLShlzqq0U7WBW99BU=": "468923000000", - "VTfA7d1N3Kai8t9sSUYfDcwYYB5L3Qxmh-YLRrASvec=": "415629000000", - "VTiuICQtcQk0BACaMO9RPaQiX107e9Ed45Vej3GgQuU=": "458982000000", - "VTj26JAn5rwZljfdT_ObNqsQdehtCoZTaPPBmS-D0J8=": "387216000000", - "VTjsVgDorijHesX5KGdjlKrPNULpargBp6FqWayOOLI=": "499907000000", - "VUStFS2yZ9HQ4oMaVyPQAP9CULH36OzJsWi0_L3bqJ4=": "731217000000", - "VUbR7rYmgHmHQPwNZt3ziSlgZCz3BLrRLO0OOETOp0s=": "385510000000", - "VVOqXCM3rDgDHULSm3C10kGOWiPEqcC6L2S1nQr9iN0=": "453981000000", - "VVc9Xsjz03JhobwrcbfZwleB8Se93NhijB2vghizfew=": "378090000000", - "VW43NkFhlkaX-Lg1JBbGioylEG5jEpDUKAAyUi1Qkwo=": "3790313000000", - "VW9vsmGVwjmRe_HPtSqwz8DW0LPpAYUmB6_rW-6-DK0=": "498093000000", - "VWCcuYnbgLn_1ldMuXqmKRbnMmFs6yuk3akCmpqUAs8=": "765925000000", - "VWjOAWSJxxoG8Cmo-qo_JI83Hc4x-EUziCb4Syw4XV8=": "382394000000", - "VXfEgNlbVPn60ZqAtnqfq-C5DQTV4fqJ-awicX_WuT4=": "459105000000", - "VXjDsXD2KGSPYTgWBqLhcYBMZ7evuep6W6Sy2zuvLWo=": "4165782000000", - "VY6F-N8mhCMNQHOrsqnWRU_fwpFAd8AQozJtnQPPI0M=": "468609000000", - "VYCaBTI9fc6VKAsXvey5UvWMJQosudmMhXkS_8QS7jk=": "647762000000", - "VYefOPMl6fCjl9Oj9VFCA5ptUdVC0xuXxE5s6c9oZEU=": "458262000000", - "VYs6R2fifcneLKez_jF2RNvGdmF57kygKnImhNpj-1I=": "1935352000000", - "VZGtO6SDD1pLG3kcxhcuBcihcBOo4dnLQk6D9LozgA0=": "393616000000", - "VZNcblkgKpXvJpUcB8DzYKG25fB5pudN6eOsezRsSFs=": "4524370000000", - "VZwtDfqc0AwyhVz5MnmOlPBdlT5usy1Ws8g-wZEy_Po=": "576923000000", - "V_6MgG5LTWuXw-pPmnJOuLizZM4RSpC3QpX7x3VxJtk=": "545058000000", - "V_9K4y_OW3PpT2EgCPqJaSzN_SP2R8AdaVcbah5hhYQ=": "556085000000", - "V_wfW8SybcNCNRWRxVNbcz327bJYKoGzpk5DBYZ4ZyA=": "769230000000", - "V_yhXKRPFWrId-oZe4DuoVFeUrzAnCG4d34uQTlT96M=": "384615000000", - "Va8h43_7VKvQ8lCCJTqy3rcLvirhr0EgdiUp-MxkfvM=": "384615000000", - "VaADK-9KyRcwdLHZOFLEfh6LFyXs40-hwinIuNzyxO8=": "384615000000", - "VaJF58mIIj49zaYGzq8bnt5svpJ6knE9FbtnZD2gBJw=": "384615000000", - "VacXUG8owWVPIg16z6pYDlEl55OKNK8DbAFfC9G5JmA=": "1153846000000", - "Vb9EK9J-8kOnjiXrdu56niFgdysOV87UhtWjEeimp0s=": "1153856000000", - "VbRm-9QYqgm_kLzMh7v7KNONxEsqWhUu9mBaSoeivEk=": "7472057000000", - "Vbv_ovtDQu-mLNMxeFpCvpl9pH8VV2EDrZAN7pscwlA=": "367830000000", - "VczgcH9djg5CuhJz1bwmoujDpbMwtwjrKWh9M8dAHmU=": "385209000000", - "VdMI0qkgAOwvyLV-M7siItl-yJxCMlJ5aQ3EvtZxt8I=": "5012427000000", - "VdTCWvwv9WBj66zsPanKM9aUI87fLaGCjJOiqomUD8Q=": "384615000000", - "Ve4hcumLK6dC7EzHaMlf_b2AfXvq_-HWnbmzUXuDKUY=": "462622000000", - "VeEhWEfSRKO0ixxhOkzF8oKkSUyNuWeo5X5ZN8nGGMg=": "383472000000", - "VeFiIGssicbWkILdTR9p0oaJ9V9_NjoBzvtyZvx51KE=": "488135000000", - "VeKafH2qUZVHjMR1Mz9sTrJaUTagE7qvN4mD6NquFwA=": "583638000000", - "VeSjbM5blJtqiJhtIqw8FvCSvQazmBctLoBgrjSeN6k=": "524553000000", - "VeTNCbPzZzloM8raKM8rEpjwvzZIDGy3qbzlAAR18n0=": "416666000000", - "VeUzwQAeEnlB7B6Pt58opoI8F3yN6tRpPGToQm3EbP4=": "2391335000000", - "VevaOv6OmqTsxCjJVeC7decML-kgdFjPydTuJrnpuyI=": "384478000000", - "VfTtvKMS2pVYCJvPKo47jf9weXNGbrvu9lWj_a5Iu5U=": "423339000000", - "Vg6qonh4roFT9fDBMpKuR8sGwyVrbjHE214kVS0eipM=": "384615000000", - "VgTP0jLLgu0IVnxjvYXVZBJS1ojCt0x8TT0DGWo1mSo=": "4233446000000", - "VgljlxV4AOiCmIZt2smyGKrA6BX1wECnOQi3vwJEEyQ=": "378010000000", - "VhBp6oabPmsgu1xH_gNgdM92-TK6eeSaZ60wVwDmZfE=": "767923000000", - "VhEpsbpRESo-cBs3VeP-rXSEttwcgqFNhBF_3A-FbG0=": "495359000000", - "VhprsdGm9T26eSIh9UV53Wscp8usoYqFL8edjnrdWjU=": "451014000000", - "Vi7uRsxhBEoWSuNCgbKFR189l9vv1w59QPsZfkzvenc=": "374878000000", - "VipgzVFfe3R90HBD0jGnM28Ay9KLS6CJIoBLWXUoTtw=": "390530000000", - "ViyhxlrApci-YLg4wqWgZwZ0o8aOxxcLPzsTLdcPwU8=": "416424000000", - "VjKVQuy9IkqeRsm6ZbKkDcYl4SCEvyuOxqE_vDfQ4W4=": "414405000000", - "VjQE5btFaBZTYO4VR2H6tTOkuyLvdhlNtjPs4p3ZAkI=": "380589000000", - "VjR3SRiaCMw7YsTXfRe0xP2NuqcWL0JqDsXyagYtJ5o=": "2114239000000", - "VkCiLZhFvVOPbNnx8ljRo5MKSjaz99o0HKgK-rwzPig=": "916545000000", - "VkYAkBWkXSrtKOD05EWoeIWf4N_I___XnHX9fNt0fAA=": "4000000000000", - "Vkxthl0snzwfrYkK6SUBP0IR66uEAtuXh4w0MBY2IYY=": "3846153000000", - "Vl6hWSdUIrVXFS7xQ3eFY4XKu6PsGRkjOlVl4Czu8zs=": "381635000000", - "VlMcQqMbYM9xJT8sV928e4RRQVqNJtxrKqM0pKZAw0U=": "636539000000", - "Vm45eSvBAUvbasbI2n3QRTiuNJBo3Vl2Zv1az5sTkMQ=": "3780062000000", - "Vm8pILX5aiRhaIRc4siggVOJeDK3BxjAA8bZl_IiITc=": "1272563000000", - "VmOhDNYKjkHyk0n3SV84zBthZ3_eZNKioFn9MlGU40E=": "1387699000000", - "VmbalpuL74YnamLzt7YLKev2Kv0cdi10-LCXyLhlz7U=": "504754000000", - "VmxND21U5_GKDkNT0BVgfctVyV-bbYgcJsdxX7VTfwo=": "3749635000000", - "VnBN9v-0xK8bwNBp4a_KhkjoSoEW7LRSFWZcn8ameXg=": "460124000000", - "VnbllZzl-7cYJYXb7PrRbnXH-DWGETNI7dN5HXMfeDE=": "3257127000000", - "VoK-u_Hr2DAsMEyh3zlUfUWsuw29JuVn7T2fhdr6UhY=": "451223000000", - "Vocq1Tc9DDmLO6dulClmsG0KV1-GCAxk9sghDX0LNTU=": "1153846000000", - "Voe0Ngsh4xTMzp9Hgu3mOAvPsJPnZnDzmSao65FOBfM=": "768403000000", - "VofAcw4heZOBCU1qsy5ZWQL2LjCsdKHF7N6I2oAxhuQ=": "5105896000000", - "VognYDX3FXTymjyXHlF9fyo18TytM5dm2QlZTZq8ulI=": "1353804000000", - "Vojt9k8VsWWJdbdcBzeT6akBwCFULGHrYSnmdb0VfgA=": "535855000000", - "VoqiF3-MztTMlSojormw-o-cbUbaB_Hn0Y4oqIU35qg=": "4999999000000", - "VotCLnEXYktCTuFAHucL71NBq4tWKXmP9xXESKz0_UU=": "355204000000", - "Vp8ILp7pZkmIE7EmtRBnxm6jjoE943bx0j5qUk5fyJg=": "1105945000000", - "VpQDPbu3uMMp21fpltjNOTFePOoLhPnM-YUL-Lm2rJo=": "12223836000000", - "VpaxSCe75RWuuma8nqT_aBo2zb-F7iS2XoKl5UsKuI0=": "453196000000", - "VpdA1nz9iPYN0tWXA5YTM2i1Ye3M-8iNdeEbuEuemf8=": "384095000000", - "VpkVwTFZcxDd9Um7fW_HkwCBuwy_Ne2wtsv5M7bIRHg=": "1252906000000", - "VpybMOheqSHVkJsUnIwpU0Dk4LFr7O6szNxhOA9amRA=": "384615000000", - "VqY5OtjbKKUMfdi_y_WoIpEc5dhND9bG0vWRoNcE-CA=": "2259668000000", - "Vr-5WozkVuy-9LRt2wWlV5w5__8-slnw-tRyRROOfQc=": "2296901000000", - "VrNDKXl_iTXfGjk3eqp2KOKc9Pw_6GrqmbFI1Z5OKTg=": "1317145000000", - "VsJV0fJyXfF2fFpMpJh0yR_FWiAW18fkPMB4eI9TJaE=": "10416666000000", - "VsOLLNp8q56grZO4wjzIL_rpOLH4DW8e_fKLRA9jdNo=": "460896000000", - "VsOxPC0vwAah8mhaMUyrgDWMsnoPzh_GqOaTLugPJ1M=": "1580672000000", - "VsSTaOOd6Jr24JUvN3n3ENDYaLkshRS5deaBB39K0N8=": "1349423000000", - "Vsbcl-kuioZGulu7K9EgV4RbXOiAOarMtYTwFCzubp8=": "9350347000000", - "VsdLLVdikrZQ-kF-GF7HfL2m4BZMED4MszAokFy4k-A=": "385509000000", - "VtIqgyVVUH7bOBmiRpXTiN85H54XQOaCuZ-NGgO67u4=": "681818000000", - "VuTBhZHg_BlyGStawM_7osq1JUAuBjXl36LQ4HCveUQ=": "384615000000", - "Vv0BsZnN_Wqtw6Ocx8keARuu2H6A9Slt2T9olza4R0M=": "507660000000", - "VvCGxL6C4OMQBo7Z7lCGFZjM7624kkctqxWf9z71A_A=": "830923000000", - "Vv_Pwng5kzRD_O6-cZQUrsb_yG4xzLhI0c0DkIaaNNM=": "1542685000000", - "Vw4x4reMyzqu7RFbshAnbOC2I3NTYpnmMb7baC5YhfE=": "404758000000", - "Vw5DGwJgxSlLvJzO4HmlzKvMwJ_Fp4ZlV7AZt_cgG1Q=": "384615000000", - "Vw6hdc_hYpUFaA6mV5mMtTwNrvALV2lefMG4uH2mob8=": "446985000000", - "VwHmhh0xrJSAKmH25dJg2_zWy_G0G_2yaBgj7qI2oyg=": "576463000000", - "VwLeaJWttREkqBrGHt2OFwItq1LQmw5xdGr8rzSBlaU=": "810167000000", - "VwTytg60lrBDzSIr3367NY3kWvKNEkBsJYOIdSpiDTE=": "749999000000", - "VwVSGJD6yYGK_R1K33JJZQzCcrVxUrYwhdxoi6uPUgw=": "417636000000", - "VwisY3JyXnorSx8GK3N3VMLqG5VYJ5zfg5aWjGlitNE=": "414775000000", - "Vxbff8sxE8fG3qkIYyBHARcnfmlaFI_5jP3K0QtIYv0=": "462701000000", - "Vxk5nbiGtSItoObAcHGhi79I_0OmqYGtTqPyZmpdMQI=": "1513705000000", - "VyJSS696Iy6osOXT4SO5IXx9RDbjeMxSoEtDw_V7Arc=": "628328000000", - "VyXggLzXGNebpTb8-eGqOgPVq_oJN_lSLPLYQDUxQEI=": "653846000000", - "VzRQxPpWrn4F-6Pr8lkXx9DFI_4LFbhYKLm9gbhjwQY=": "769230000000", - "W-194H8a3TarKLAqzXtSfZX0a5O3ehmzbmvRRtAMNN8=": "1923076000000", - "W-2N2lGQ0aORw0-zYTa5a6CgjSqvmrQF2Ad_ms8FWeI=": "378611000000", - "W-4HLFYHh3iHoOrQZov3z7OCJztfaQkoBReiY2rvlDM=": "2096364000000", - "W-MkF99n3s8fquqTC7Y2Ld9AlhhdxVpGqSAjs5Qh8zw=": "18858682000000", - "W-fwfBnpfAeU7q1IVv-JeMszytmZ_qflHt-nXSH6rpE=": "8860783000000", - "W-pPiB1JzaGfbPcqwJ8i1lPDxYJ_NPSjRDKJze60JWU=": "5177637000000", - "W0baKn9Dsqrl-7adI0EC4b2CUYUnX2XkrmRPEjKTMt0=": "4246350000000", - "W11GDLlpd0297a7VwudpWaL6bsVVV0Q82X0MG-PMMjI=": "3681201000000", - "W1FSyQq_A_h6gk6W7-bjgrpOhYmagOYsM8m-xzRYm1c=": "788081000000", - "W1NL3cXix6-UzOgCyjnlDMIPknj2MaMXYJSedCrVO44=": "3410403000000", - "W1W0ZoQmGyerpp-qnEgsU0K8_y_w_BhtP6ApkD4K218=": "3640467000000", - "W1tM5589c53iKf5xEsW3zMkga0bY5OAHfcs9q6oCJPs=": "379203000000", - "W212sDMsjIPkG9lfKvtBS6sAuLrDZ3me_F9X1dpMFS8=": "384615000000", - "W21S5eiG-VGSQk_WLiAkaea_HxlY92hYJ9ekC2cDWVY=": "816925000000", - "W2GR7RllRvB2FT9sgZmTmcjfPt9sRSw3RtnKUqnxQYQ=": "384277000000", - "W2Orv4Ix1TN14DHULEq2KRLxiJH_gHA_u1Vh7qQE4uI=": "11348994000000", - "W2nOPMvBSXoKKo-9Nmsm9hUcmOJAHMMb_6Rw_eTRaXc=": "384695000000", - "W39gqN9Ll0VPEIScBkF_zQBXqcK9SbsAfuOLHt5meqY=": "378206000000", - "W3H5OInGhj3qp988eptD-AJ6l1YIplaaf68pcVAThbo=": "395499000000", - "W3LwUgaxcK8ismbFvEkAP62QSP7iWRFcS7F7dxZ3-bQ=": "4233705000000", - "W3kHQVClOhXxrrDERSQxozzS0QPXCBa5EQ7zZH-HFlg=": "3846041000000", - "W42eLMpAvyNbWx9k4zLjxcXdBCHe7TyKS5HME55mKfQ=": "6350849000000", - "W4EJ7ZCghB2tPxdrilF7s1zEb8qBas6UgWsZCR9pl-Y=": "384615000000", - "W4n7MC46gWMCcCVoawsvshHbRWhMIpp_C7QeMMWIbYA=": "413226000000", - "W4rNMQSlbejKIyYPZ6XlY3ahiG9yEroxghK8luwxjYw=": "385509000000", - "W4xkZlamglgpDgXSeVXaWK9JZl33opHtq-7UdybfKoA=": "6869158000000", - "W5OFa3poTHGe24kOD18ImLtV-nH9MO3BFiKN-MYV9Ng=": "384615000000", - "W5ccPpppiMQVzbKSIiveqO5PvOmei1ZXl7plqSY4DBw=": "6533662000000", - "W5isIuR5eoe3MXX3wVe5VcWiyQPh4-mwuOBJpgnHeQc=": "3846153000000", - "W5mMoEm76ncaPHCoSP6Z__FAeacevy11JhP2r5T3Fbc=": "7097544000000", - "W6B85uoflOgBlbRQNnCOurr6ebqQaK0rRq1zEzi1X3E=": "384315000000", - "W6D4JaOAVpx2uqxvgq2KnFV-l5keSh1PKndYtOPBozs=": "2278000000000", - "W6DC5D8O6HiKKYUJmRfrho8ie0KeBbh8rcTuZYJKDzE=": "384782000000", - "W6dPtPIOygv0PDYvlh756R-u0qnUPfjC89nqROKwgik=": "2026079000000", - "W6kU61hFyA7jbOvAVmAWtfFNFN_f5Znw0YR3Q57pkcE=": "381767000000", - "W6nnkNp8mNeyQ7DYyaH5MkFji0cbwO-XB-_XgBZkQRE=": "1499999000000", - "W6wkLGkpQXvBpZInrFsxaVAEj9q82bGmjw-44zzFFjw=": "421393000000", - "W7OipwQOkMWzwpUE7R5J_BIGnLAz0133vwy8RdvHZhA=": "405357000000", - "W7PMxZ9w5s0u7CfqqeUTolS1NtVUaBbGg168FuuUgLU=": "903178000000", - "W7ft1dBYdixkwW11bnLYwO69c-hbi0qb7OUAR-8jusw=": "6278889000000", - "W7ikjo5iQFJxX-iI8W8gSIukzbPdL287E2MBXCW7lsg=": "457885000000", - "W7sWYbwpWkxHLVe3qbn4y3JooNkP0cHafFvpOJHOT4c=": "1693482000000", - "W7vmbmI0zOuBYVD7EIWHwIduO6IQe_OOn-Yq1SUwap4=": "1038461000000", - "W893D6qaXwFElU1Wht6Yll2PbOkYtluaIFx6MDPKPw0=": "7529372000000", - "W8u5Hl6v3ZHwjoRwf_X2_l_NC-0vJHN1aCUP4EvldTc=": "1522339000000", - "W8yIGTOwSi_5d6hLuBzq12aq1k_K32TNs7HYs3MmICI=": "462984000000", - "W9OGyPNLaQOvviEVXG76ZadLzS27NUi2-kgJ8BjCQ7w=": "1925698000000", - "W9WFl3xk9hCCN3bO6MsBYvLJaaaUk7TXq3bNLkqhznc=": "454275000000", - "W9fHucoM5TOinfAzMm5pdHF1t7yAAfaT2eM1zCRNDZo=": "379260000000", - "W9fgQJP2lwanUCT_0G-rwdV-m0IX0pODyb9X-wQdlFk=": "616791000000", - "W9m2v-TQXC8uI_H1L34UB21LNyoX8bdEtZLX8K3BHoE=": "473848000000", - "W9tsPAVL0kguHaQz8Dbh1o9O_qotaCgGtuHpUqGK5d4=": "407808000000", - "WAESGn9NVU73JvXYe7LqgnNpla1kE_GfEFSVV1VR8_E=": "459921000000", - "WBS5OiVRsSVpxvWEnXoAc2U8gBPzh0MLB5c-el4e7Ho=": "3806212000000", - "WBaGgGszv19xd20pvCh6eRvd3PqH3XKDJMxlWy6gXYg=": "381635000000", - "WBpoWm7npEtvjR_NSzx27GIJ_y4tA9TppPCTdn20BKQ=": "384615000000", - "WBt1i79dKssTvCMZoHr_YXKkwIu9NY5WSX0Lblsh0ew=": "379203000000", - "WCBnt3od_cEecAGnTlLimYhH_78HkaGc7vQ7G3nmJjw=": "470116000000", - "WCOyUvnfHbcmCwgffKPLRt9HaO0t-I8mTW4wmXhQLdc=": "463439000000", - "WCewwfVakHAJCCcRFZT5kCxuQY0M5C7qYI4jYvBFiNQ=": "384615000000", - "WDCOkQxq5higjKJ021kl8fyBjMWXNfwmlwKVOo6SfmE=": "416666000000", - "WDMa4kgLXuTOGWyFnqJW79tjGlpceasXt0WQUixfER4=": "576923000000", - "WDbJJV_iMEh3t172D8UT7Z3MGQ-mt1-Ruk8TpaU4Xjk=": "1942114000000", - "WDhP2Ub_QukcLpRxuH-Bt7lVtu5uY5gX97SEnR7nOBQ=": "376454000000", - "WDnRNr24zQmkHNJp6W1_34BoprCYo9hy8bVkG05GprQ=": "576930000000", - "WEka3b3N3SYXLy9i67Uc7Ea8_NnPKZPXewgGTxdZ7Pg=": "1538461000000", - "WF41GlKLegYstBFVvCkJzhi-Yyr-mGfbCaSOo1Ad0AQ=": "4166666000000", - "WFKX5GwyoOn1Xp1crOztuCZW6mVe3mBCtTfmJ_uPLkw=": "17003535000000", - "WFiIonu8rIH8s2tKb93P4caQUcWutSqvCwUwXhuOpt4=": "751952000000", - "WG8rQo9SpE_h2vwyVFPL-5qcD2hmZ_QjRbP80ZkKzC0=": "383695000000", - "WGZ73u0AsL_yYxYJb41rpynvcefq5NIvUZYsVBmEIZw=": "500251000000", - "WGkc-RjZqFWNXM3A2E_EYYCD7cXeVd5wnq-kvDUc8IY=": "765373000000", - "WGsmuCEmNbtXzyixWM7JVHJry-jG758KPTsVKybPMqA=": "384063000000", - "WGzT21p0UjGdOFnKprpEWjrzSRqgXtpJpYA6_dYHZn8=": "453282000000", - "WH0GD6EzokjSt7uDsSai81qXIgYtrdn5z7uMOEgT7Mw=": "833979000000", - "WHdGqiZonCJzG8gsSEqcSG4ocsS0TfbrJPgJyObxul8=": "386418000000", - "WHtW1wX0m14TRx9L39KkKlo9IKcycnc415tU1CvZUuU=": "769230000000", - "WIAwrc4M0nZ8xkeitxy4O_JQEQ7Uh_6rS5uUjFY2MEw=": "377539000000", - "WIIpdqYe88MO80mh1PaCcSuxSOOCU6IAjuNVgRco138=": "381805000000", - "WIh1Ra8qkwOosEY_V6fow-TJZn_V43Ud3xiAdq2oRHg=": "384615000000", - "WJ6yg11l8y7sQS904Ql31UgMX3nsMrc7aPEJf0cU1f0=": "1156532000000", - "WJRBtNkp8KTic3P6_tSrCMlzGM1bIV1s3qaVOU9A0CM=": "10909090000000", - "WJXhtHFo1yhlXAU5QGHv_XxMHyzBVe-OdSri4T6SFQ0=": "462320000000", - "WJbKalGocxK5QsyUvJ4STepEZp9RMaldQBTyDUfDLGk=": "7740041000000", - "WJizNHjHIpqG26qy3mmWUJvJ4MIqHz97gfVEjkDfe1Y=": "460532000000", - "WKU9Dgpyd3HjExtTccQMuMAeO-hEe_DNjo1fcNvegzs=": "832869000000", - "WKVwEW1N4V221SzIxJJX3I_eTD0OjDwJ22pOOWsU_GI=": "423339000000", - "WKcaOLTKsulUzoQa4JidWWnSVk_gNKQTApBzLgyMSbM=": "497906000000", - "WKnpZMF1FDLYQLMdYHNF2_G7tc8JBYZnbA9O-eXauqs=": "18460519000000", - "WL-0pRn1PIQsKiD8G5usiuhvmFBoyaK_7hV7G2vMH7U=": "768527000000", - "WLDGVKmwgPvNZxTtN_lVxoHB6CS6WEOM1HdTkCXxO40=": "779722000000", - "WLaMiHgfwlw3WYhhRN_4pVrusp8bQ_0a_NhOWmoylxA=": "931449000000", - "WLdB8EIgDyhlBpSlIlBN5CnLMteIWCjOIzVB7-tDOuk=": "387062000000", - "WLiALQ59D0mb0s2_FvmUzl3x68VpXoql40vK5L3F3-4=": "570653000000", - "WM20DecQ1YayFsMV3ithPNDWzyPOAdIyzBydW1fZNiY=": "24356165000000", - "WM6hGwUA8s6JrvY9a9aroCABEQpDNi4sabQ16Wl5Jw8=": "385507000000", - "WMdkWL9sWYqozJHnqPjmTtmVF6yKPVTxfbKwW0VQ9E0=": "834965000000", - "WNC_oH2AkZyqxisZ8CPI5VPsFm2ul0k1o0pZbFQwFfs=": "4356972000000", - "WNGbYsyVuJdmk67YcPntPdJPz6kZh8etVncjKDlS3fg=": "1958333000000", - "WNJ2LOIYpRHIPiit18aW1oMMBZQLHKVGo5iLmNLELik=": "3999999000000", - "WNQzbnsum8b5D1WAHchA_F4Un30OmhWuGXz1Fu1mcYQ=": "469693000000", - "WNWkWS8GvXiqokIJrxG9SgBzh8Ne2oJ1F11lWGyTEI0=": "9401467000000", - "WNa-5fGEIhgLwxihP0DqJQfRMRN4B2o71W-QfX0h8Lo=": "418405000000", - "WNb3_S7H6EtwnfISv2R71MxdyhTPh-QPYRJWSL4BUl8=": "458897000000", - "WNdBlF8c5uJIkt8mhLeMEigwHiCobrH18XmUGyla2A0=": "1919945000000", - "WNirKNJh6v6mZMapH7iLvsvNQTkdDf-MzBGQuggfnMs=": "2081444000000", - "WOAyFtwABE2iUYDXkq2BGNudT9PJR7HPCdwle82Jr9I=": "769230000000", - "WODdwBIVYpGzDxa7QjU5LuBmcSPu455B3rmPg3cMvFw=": "473331000000", - "WO_PzzD1mfu-GPkMuDlrTmrB5ODDU0fV_8VUAYtGIwg=": "453998000000", - "WPpy_lFybh1-msOMmddCj8EkdAO0VW7LhxfzdahHxnI=": "385446000000", - "WPvNGiG-yYCaPbZkf4Rf0otA8RDspH1lpr69YZ9E0pA=": "1155974000000", - "WPyQfFOo-3F3UowK9f_ITZTOU1aI1NC2fixXTixtxTs=": "460910000000", - "WQ4G60CI0mCrR9nmPwATwvhChvyMwpupLYm-um1IBEk=": "1962122000000", - "WQNdc6NwbGA37kQYUMdFyCqk_OfCD6MbbnGRSrskXOk=": "15254845000000", - "WQTM4bQzYvVT4hxms9VF4ZLalQ7N0SYCdA8O4iY44HI=": "2007966000000", - "WQWwxp5xp-Nz4yYKgV9ml2sd0m0RhYcOe5DFVxbq5uM=": "645826000000", - "WQdXA_tXReeH4gj6qeS7Ve224oWefbO1K_p1VbO6bzo=": "3790675000000", - "WR39qA49oFOSnSQVANzSt7dmG6H0EOWgi_7OROVUm44=": "649822000000", - "WRRog3gd6tb3otq47F6irP4DLyVnDDEavlWDsCMcSVU=": "3282012000000", - "WSF6YrAx41wscRWJ0kZxSq3qfBVM234txoYWoKvaRuc=": "764788000000", - "WSid9kVZlZW8aITBIKrHTlT_WIL48HqS9v-w-oGsdrI=": "1173056000000", - "WStEhhKnA8BARPf8j7L3erCC_zePBevCdSunmpgHxlg=": "919047000000", - "WStfPgKcGhdzzpsQFmnAZzlJZFELWPQM1IHxXgL1OiA=": "385739000000", - "WU3oXVX9hbw_1t5H_wqSvXXLQBTvESXiW2hs5DXuZKI=": "499678000000", - "WUPFb1XsaB89SrRBg1BmwYLGYFvOolOIbh3J5zol-aM=": "7888266000000", - "WUVmGDUE7466I6kjstj1NK3CozLxWs9ozxDs0C78Vj4=": "800786000000", - "WUm5RWnd4i5s1Eq1Jvg6aanVlZC6x8ubTPVCjPWEjXo=": "463799000000", - "WVTln6w-sYQ11Hu84TQRo-asJjjrfC_OGS8G4jOsWhE=": "422561000000", - "WVlKZ3Awm1GZmiPNO-6Tt9KOdbzw55GH2vTgijCcsOk=": "422123000000", - "WVwwtyfsarlQVopdyicDfPgcMVIKCmThIbAtHhslrvY=": "411085000000", - "WW8fz3OXNiOGGk-J4DTRwp6NSqW8dDVm38_yYrDCQGA=": "422775000000", - "WWB54oAswl1vvYNZp7hLVo__4iaYvdv8J6BUhonisK4=": "769230000000", - "WWWSVuaKPFzW4YrBVjTeGmgiRasx2uM1NiJnbpZjmIw=": "670537000000", - "WXMhUCdsz1oUsbkmSS42x6sYa4Zbxh2VC8HWMEq9Mgk=": "388753000000", - "WXmzFOvBvFOi2t2VHaUVLdh4CIwrp7RF5WXWTvPlRDE=": "1233257000000", - "WXw5FluWr1qQXjm77jYuWXKROPwpJOze-RboH2eioMA=": "5197759000000", - "WYJx_Z_cxysF_7Xp-saaG7n84rSyZ7d4WeGv6ETUXqs=": "384615000000", - "WYa4KcLcSC1Y3rIN9mN6CRzFlgveefAEGZapoEAswcw=": "386166000000", - "WYgsWb24HC6HsXBVla2f4ahrpnWgHBClpXX9veZk3Zs=": "2080042000000", - "WZ-wqeyTmov38Q66_FPsgYUqwoXzz9C_18V3eEXZ-4U=": "1223899000000", - "WZHHg7pEqnP97FGg5homdLdV7UqFbovEnqTvll0S-5E=": "384615000000", - "WZLJQFP0gK21G-PTVM8ZG0CY8LoU3WqXM-N0BJIA3lQ=": "457566000000", - "WZUS4LTYIQtdAF8XXDxWwp0D4kU2WBYLwOyks-iUPUk=": "1923076000000", - "W_0ptmndgwIIQUdrQ26x1Nb2x5L3G70tNtK6IpWD5DY=": "381805000000", - "W_RpnO94M4pf2Q9yw5ZY1a_hE-LDapLxfcQdjJJWeWc=": "770269000000", - "W_Tteg8jn1k7vTeNNfJcR7HbAPEK5tWghHhbOM7glI4=": "3784043000000", - "W_ZMi8L4ZKtQauN0LHeo8cQDyL6ZVVWjzXAH8Pi58CQ=": "1224063000000", - "W_rxpiElzvcUQvjaGeUlTcUveKHWz8_h6h4BGWKoAHI=": "466657000000", - "Wa33tWLyFcC3kS12SEfMQD6O2YQnT61Smjftw6LWC0M=": "763607000000", - "WaWg-Ml9OmCJkDKxRcPei2_UUJAMy7QlQOSRtMg56WE=": "416901000000", - "WaX3RQv9TZTiw92gJ1kZC5_vqIHLVPsjb9eWCMffvo4=": "457716000000", - "Waww0mdTVLqd8seF6kuanElHlhcj6cUMTwPA8M4lnzk=": "379260000000", - "WbGxxQ9C2PlUR3Ti-_ZlFIpjeObcMyc2QBuaIaCpoqM=": "1249999000000", - "WbKiu_y_V7L6Xxxl7RLRHltka7GVj9IUg2hdulk_V7g=": "840121000000", - "WbQETrhsuTzmxA0exGPjN_XciYs1c7-d7rhf78cDqZo=": "450738000000", - "WbuLVevIlsNfTa3RRDkcqk7IyrJjVyr-P8s76MBEiCc=": "377664000000", - "WcOH_bG_bF9ZWAGf2pwnMhC9MXPPx69Mt_KLtQOOx_g=": "443320000000", - "WcdewEtzA4HrFuX-NVvVbKKuTeIFSANDsysuBz0haUc=": "678037000000", - "WcmSRqGWSy7XWzlMVXar4pWftZ-ILo54shpg8M__vaM=": "384615000000", - "WdHUIqdu5Fl_YfoQrEl3kEVx7JFe-OlzUMPvRvUPpUA=": "2083333000000", - "We9tPPUVk_XG4475b89KDwAtK_a3tKeELOmZK22Uty0=": "716860000000", - "WeDghlSkK5Jw-2W48-fYng8ctueKR79rjmt6vJu34jc=": "2096295000000", - "WebPFAxKXLUEJy7pOqVt0Q43jjZyaGqbCc8ux_Q-vVw=": "458395000000", - "Wfm7zRnL9tkxhKjC-NYdF4KLuhvS5g7bWX5uQu_CE8Q=": "909090000000", - "Wfp-ZKvldlkN6Y8g4ERsijQbSChNjggC46ZEYHuR7kQ=": "538461000000", - "WgA7ltHD1V9qDWgHBfGLZzw_5LEe9CNmsEFBqqBaKU4=": "2643898000000", - "WgLmZQg-fimhBsRlMLK8mLYL4ZNrOJwjFXzZnUkn5I4=": "385029000000", - "WgeVi56qFx3jSaZ02vUvR_puQ004mxabOg2I-W2Fspo=": "411085000000", - "Wh1AICRSdL8rjvVrGJ-QW617OaXgR54R2TPuYhheFQ0=": "519272000000", - "WhDQLWA61NTfyTA0GiPo7d0U525OxPQHW3u5JAiBWXM=": "1076886000000", - "WhdWMqvvFfgT2jqDyJLXCe0qeiT7Hw1nHmLPDNdvw54=": "9997917000000", - "Wi2GI4oq1eTqxK5RLa0zFL_-nfagFo2PgUkPmQW6iNQ=": "426656000000", - "WiPSI_w8W3LmsstHHNcA1zIRsDmc3Ov9GuMM_6nTly8=": "9982090000000", - "WiS1kCRkDFrAyUoFF98K2Wql0XzLomqx2zAAj51We-0=": "2039043000000", - "WighIHw_Jc2f1LWdR6HdrGVd7LK546Yh-oR8pajx8sk=": "388390000000", - "Wj6NRh18oy0TVNRN7Ij7logTugTYg5wohnt5zldDym8=": "8332394000000", - "Wj6spWww959wif5DdMIOf_NZtcWuCUb_a_2DZVUYa6E=": "703792000000", - "WjWdsdq6-4o0Duula23AckRypK9R8bl9cMtGWn8NWs8=": "820114000000", - "WjjtRT4HSmSPdlq4_IIwYTSwR99pfzR7I4vBJYtu8ps=": "728205000000", - "WjqIYRPkN0NbJnbIjrp8OogtfcWuUQBboRKmzfjqrio=": "463424000000", - "Wjr0f4kk-hKmv539OVIPJSez83RMlMHk74p7hN5LheE=": "489572000000", - "WkAhtiFFsY1iv10W1r7Xu6g3HtLeFzMjg6yb4L6VYKM=": "20833690000000", - "WkEEUBGRM_TGvGbbs3gPAEZwP08dmSM2XMJrGiNGF6E=": "393772000000", - "WkZCIF4B8XgH3zPH2obgELXE1Iu5vPBcu95S5WorAcE=": "906584000000", - "WlH1hRqJh_YZOz9RWrMmbkG5N4B6ZBn3Epq6sJnKf7c=": "750896000000", - "Wl_FOA2C0GBwEmwkdHIOhj6luptrJlG8lQqmQGfQxhU=": "933815000000", - "Wl_bKHVBkIT_iP57le5_SxuN_NKaleooaEYNZOY0r48=": "1792816000000", - "WllmUWldiV9PMnEDqOMfdNSrH7pvr6PStwuY7mKcDZM=": "2507224000000", - "Wm7GKn_nATTInc_xotmyJGL0hs7kE1jjqctqUTvrCz8=": "381331000000", - "WnI3c1q3sECfBwLw9KWbeb2nUTbXQZouIUo4IqIs654=": "1133483000000", - "WnMsWg07W_8vkG-Fy6VmeiWKmcZPuOsFAgy7aeRUp7I=": "625026000000", - "WnbqpPz0Pluzvj2nWx4nVNN45dj-W_JZVsFktENVQkE=": "385022000000", - "WndPemv7hFqjezI45hzKUVfonpFUhLTs9Fm_F1XaCRA=": "6387139000000", - "WneTry5MrkCawa-_DGPcBWqDJMZthOsTe7NtKZqCftM=": "3846153000000", - "WnkwKa1KP16iMuEhPlk5XEK8cPMgvWxLfEKIdap6Z6Y=": "384615000000", - "Wo08suoBQU-Or2g7oLOhyJD3rsO4WargiqWWckxF6Dg=": "462839000000", - "WoOvoW9f5fO_sYFkt9ElVjMULCWCMi_nK9DI514z8-I=": "385211000000", - "WofUFAhod4xCs_S1Wa7YD_E_0S0exYHJcl-iIDW5x7g=": "1270111000000", - "WogayZXNDCgkw8nkiPHYvHpqJH_4uRGM0qoXMVQusnw=": "378445000000", - "WpIHFMQuQ0MPNoh8TpgXvLEPGRP8aw-OQgex8sOvpj4=": "416666000000", - "WpM9ge3RvGblUzqvY83wxa_O_aoEaPjluDbk1_CyWvo=": "576129000000", - "WpQ1_KkYNR-BQGIyB1US_JK9Vbr_JKdS5XoSSG9AkWE=": "416666000000", - "WpgH39A2RXEwjmElmlluWGBXH1urIuKyLYTMyfP5oug=": "759898000000", - "Wpqz_mrYTXiD3zmA7eOG_rQvGVV5IPkpHmcbspi-xaA=": "502207000000", - "WpxyaMIOKFlL-y4pqdFu_kVsJ_sAIhWpyudN24pdpJ4=": "772470000000", - "WpzS3tctBfPBQ1pTfKDZg4VFv5GnkI4z05ITfQEv91c=": "455600000000", - "WqYKtDGrhfhaB1e9uHrjY6Q30HNb9KK6grLJrFopNnY=": "11538461000000", - "WqeKXELvgdWCbA7PnsWzsq02jd-6cq62qWe7UfF8pXU=": "2256916000000", - "WqgFAopd6zeVUG_x-jd1h5RNhntXyCb_YgbDiZklQew=": "384615000000", - "Wqrp0deFCuef3HrI6Ur5bT1HL5jLibORgQaShzjLJgE=": "417606000000", - "Wqx6j1K-QBy2cxENgXo7EGrheKMMu4wD8W2IusvOGkc=": "900604000000", - "Wr8X03TtxbeD2xZzh2lzdDd-TP-7emf36LPd1idbTHk=": "384615000000", - "WrHwe5g8vHotHrV3XCzFPriQjA07ESS_32Wv5TWAczA=": "8333475000000", - "WrRVfq_DhaR-rhxmGst1daziUiX7Kap27ZbSquVttBo=": "3730718000000", - "WrWhjfk4r803JOJeOEZcu8Ob9lySmaZHW8-WCwx210Y=": "3266355000000", - "Wraa2Sf0S8_kr3TaWCt68aZ4ls5O6eRUsBbCA5Z86Tw=": "455600000000", - "Ws1IweOZpqiQXz_ogOaHVmGykRhEmYRlOUK52Nn7Dyk=": "386517000000", - "Ws4oNxYTVLqKv5cNfEHrMySYYbccdrtnq7VEfooAFrk=": "406308000000", - "WsHN_QFClzO2eZsTLXUZJfDSMxiiG2mIpNCgS0Pm1Lg=": "384615000000", - "WsMzDSu28fkV3JwS693MnFwQO8IEG-9FqUXF6eAvZAA=": "1894212000000", - "WsS-ud1GAmn5oWzoXxqOcgXojNxbdgWtp8uJb76Wkzg=": "3846153000000", - "WtBOFAmL9CXWARQe_b1t-d8Pq-zXUNVJ7FzxNP6MvA0=": "4698375000000", - "Wtjdt5l_n3_ObEfb7KcT-eoz4ts2Rccs3h6oIPKY_KE=": "384954000000", - "WtxY7aUHW9_zWdO-OhD_zw7hfYC9mzA5nIMz26Nbqi4=": "938807000000", - "Wu731yDjmHXrQNVwV2YKyykPFDjwecxS7JXbF2zN8eI=": "3269230000000", - "Wusnf827Eyue5KUrXmcGtC-0Ez1Yck9hkTA1MW-5nf8=": "453900000000", - "WvOvJdFE1GPyzqdOnwnVDwokF06iZEKlT-y2Q--xrf0=": "1924973000000", - "WvZaEfMr9-gyCU1mTFHT8XgjKDBp5LwCCKytZf0WDfc=": "385614000000", - "Wvm3gzP3EFBGDdcAtzztBi9SEgMtta3a0mNO0mjjmEY=": "758689000000", - "WvtAOfLvFq42QFGOyhrs0OxAN4Hg7K-buIjtcd34D5M=": "384615000000", - "WvuI0AMa2IlNkar46rD5mYfyfYPW9sqitGW2XOWUMv8=": "2692307000000", - "WvvvqtfE6egJq5IBozMiiu5zY1eZuXrUdEF_sfyGol0=": "419975000000", - "WwHCb2TuMkeNoi2jA1vtxbHPrgzFmw1YyL3nGzq2mOw=": "769230000000", - "WwmkL88TSc6XfatpSjDQaGHRulUYzXcCg0JJIPSyXdc=": "381436000000", - "Wx-Wy7Hbp02HVLBey8oa22UlxGDVYmhuWV54sWIqS0M=": "454933000000", - "Wx63L5vIeWvTZAXO1OZnasgSbdN0WXPjoDVQjmzLjGw=": "378341000000", - "WxQ74dhQjyiRO69hTeUd3hTmqzPorlSA2RA1p-QyOTE=": "815527000000", - "Wxo7CBnm8gV835KlK6aCwCJF42W7HB4LF79_PrIWLhc=": "411085000000", - "WxszYfNG_2BVVKzpyKqy_5c6dLASVgrf4plXMKHCcdo=": "390975000000", - "WyDlCGtXFxSZ9w6V2TB6HewNFMfkrEGrrgsF7tBfNsU=": "384470000000", - "WyO-H9K5_gHI9OQ33bK2g9mLbMeq0bY_5b7q32IN7B0=": "385506000000", - "Wyqpc_ZEoyT73pCWDF414yXLSHIDX5gu7QsrY0VBkcY=": "893011000000", - "WyxGbT3Jg5XfQ6hFBwQeCGCoLODEFSIzJSB8RXxE8q0=": "469837000000", - "WzCt5-gvC8FUjYXO0KmNNfqtJ58ixe0GP6r8XHWK97I=": "388317000000", - "WzQXjldKs8rh1SDWhk8gtnB7eoFoBOehDtrFByivNcw=": "437624000000", - "WzyJQYQp3UYUFdK4NrzvDWBlSpkuwxV5H46Bv-JuR3Q=": "454742000000", - "X-fhH-yKPtYmxGyUqzZkFhQkk8nLThlqFUF-eroJ_cg=": "768842000000", - "X05XvTlV1Ivj7avWvsTajaqpeQGFurWDeyJmnvQWT4U=": "384615000000", - "X0LBlDjIZ1qQP7lM-BrQih4kTNemBwpfyaaofGOzhdE=": "464322000000", - "X1BzLtRxX8KWPaMPQotkSNF6hfvZgfbcK8EHYtKHt80=": "1233257000000", - "X1D0y5Fq_Lnc5xY41e0K5b91LBvbacU6tQCnzW1Z2ag=": "1156532000000", - "X1jgdZcJzAy01mXS1jLHnGoXN0CUirwTaqezuwDpJzI=": "4999999000000", - "X2iHvay2eFPg2bu0qOQFwxU2P76muqdNdU-hFOMkXsQ=": "381360000000", - "X325izdclTaCmSYlnVQrs_wMkOfVvcq8f4rIhdDsUkw=": "384615000000", - "X3GFos6dMe8r9sEgYBxqrEO_brDJSMxGDreh6kr0dNw=": "384615000000", - "X4235DRkMKkv1MXWbkuhD0dyQLxP0-nUMnwN3RlaxkQ=": "811058000000", - "X44LYXAscldZoFDtqp8zZ0DbL-Hvr3EWO21Nrj5ioF8=": "461142000000", - "X4ZqUlwKKP8I1KQsaoEtmVd5diaVDeTtXLLfhz_6ZDw=": "769230000000", - "X4ztG3MReqOp0IZom33YnT3e11r1fa-dgFJdm2kDyy4=": "424045000000", - "X5-g-W0xmxPzxsQGRQc41t1DBOQ-8jA-e2vZdDh2cFM=": "3307692000000", - "X5eH_Tq9JSjZ2q-vSJbksdkhumqgiU24H3WpCwZu8v0=": "1924295000000", - "X5ijfwSHfcRSCQFyme_sYD5qAWkCqetYzIyYJqhllI4=": "770570000000", - "X5rXdtp6nblelaOjgxag1NvLr17AQ8IkyQIg8SylVJE=": "624994000000", - "X6NOy8n_lgwEvWWsitgcWpdnGbdBqgkj0Bjr5lE1-Hk=": "463541000000", - "X6WZGDBkodkV2xqhZnaek4L-zWZuFWNGNqt413jV4yA=": "413151000000", - "X6YwT9RPK08j3LxRuw4XhxqwUqbQ4QKVW6K_uwTcvq4=": "546711000000", - "X6k8FIPdmt0Q8y-Ei3VG4c3NOT6wwE1ZWuASDnbdZfY=": "470776000000", - "X6nVk3SPb489fCptSK4lVLAwgtWsDzzNSrg4atFBKcs=": "386511000000", - "X789vxPO1gSnX7KFme7Cl1XGhGe57dDhiI2KYZx41eA=": "384615000000", - "X7IS_2xms9vLHtpEN0eYZ0U8Kr6YVpYvPx9IHuL1Xok=": "10390341000000", - "X8CzINkFCF1GkV4N9BG_4D9wh4J8asjTg3sh9RHETic=": "409116000000", - "X8FzmDTrPOmWS7dDsPr_9IVZ4alNMcgH9pPlwDvFKRo=": "1253906000000", - "X8Q5x8tNqVbMUTh3j8MqZ67ci3c691BvIyHWjC75kD8=": "463105000000", - "X8Rxsm4nf-NqsqkkkQ94kyg2dcHK5l6QZBlUoXQuIfc=": "8633081000000", - "X8qcKQfI_DuwbKynKd4yHx57O0Vnm1iocND3ZjlEZeo=": "9456573000000", - "X8w-n-xeZtxbueEhIO0JX1HbOoCiie_JLWk-jpzpzPk=": "422561000000", - "X99Nh5Tk7JKY92rDW5g3mw_-oZuxrlyNGOsOHIxV0r0=": "385035000000", - "X9oapjrq0ebR-Qp1XKRheor_ujkkWyWX58DNhZycYbg=": "454545000000", - "XAcgE-vRjgCOMy17V43ObpUx0ELANucz91RscctWymc=": "486218000000", - "XAoHkyJboKVehiFiqjXtdXw6_Cc4mJNGvtBZF3PGnVA=": "463219000000", - "XAxUJJ_bes9H8uy5J982Jbhf4PrYdfPuy5JRM_lKxhk=": "451775000000", - "XB8_6xPeWE-kgl6LkGNbvSwviJmoIrCXAg7t1lQZ9J4=": "1730769000000", - "XBnGW-jFaPj4rt4xr1Ns042LM64h8LFa2-ju23NXOhM=": "382846000000", - "XBodoADkDJ-34DCWOPhibhs9xrU-tN2ooCp_92AAdY8=": "384615000000", - "XBu4duje9gEC_N6Ikhivoa3Mj-1OvLivE0ivCoVhQOo=": "379260000000", - "XCB47VvvKOSrsyEFX-8oEcyOVvL5TojrnXq6iGyZ0xY=": "3907299000000", - "XCCBUwbfsYqHcsUU6a0uOE5FJQ9ayJd4m_U48Xw68SE=": "384615000000", - "XCMGBzPmWyrSM1dAuylAGoVXjwQMBa21JSpCezVi0AE=": "491110000000", - "XDRE88uW7QihwPqfCfPW0hgCzBKK8DpU0KTT10UtNLI=": "610287000000", - "XDbdYTlqF78DJ0UgWqfVS8HJm4bWs03dBcVN2ivGxBw=": "13265105000000", - "XDctqw8n28plMc_rgkZu7yATTbNiYLOeXpUKFnKlGvs=": "463541000000", - "XDqFHX1e4oCZxH_d3W9V_4ixvAuilsDFk5repBt8X0c=": "910488000000", - "XDsGKPQqVB3Lfb6hIjIJ-xW2-oevIXne-BtL1JKjoDY=": "22495688000000", - "XE3idGoHDRnj87wYe8raIyyYywHOvU00fUtAgIc63ZU=": "4999999000000", - "XF-wcZC5DTLIlXCIaaYDQ_4KxzHfD3XHVeHRXf_NhaI=": "385505000000", - "XFR8muMoBfHL1M_sHtoh2W8pnKhtgE-OucYueJliaks=": "8304015000000", - "XFd3d_FlU5IGx0iZtbsct37WYNAEfc2M-kMkqJUBf-g=": "384615000000", - "XFeRGMKMuddwZebJnawPihFqaE21o0uN2n4jkY1ar5U=": "406308000000", - "XFphAOngJ51S76h07k9DQhontuCsPEd-729UGqkwQ8A=": "769230000000", - "XFs_1_sx3Re4cuDsbNqzGdpttV2_wjMJ264CjGyE3eY=": "381454000000", - "XG8_XDsy8TtXuH8q4mcrOqo4DKY-M2oaU4ivLfO04Mw=": "380585000000", - "XGKBq43fKOr7Ma_750QOJoqfc97_HN2-5rrQuLgAm0M=": "762391000000", - "XGX45J8IoGYcXoGjCvYk8T0fRPlwNRPj_H8pY6AyCVQ=": "384615000000", - "XGbOhiz4aTrq_3ZJW5Jo6ZIeHBkuwp-jxk8Zue3OZ0w=": "764865000000", - "XH2PlnTVrXntt7ESoQOYSDBstGEPnpB3XpkKNNebnEA=": "380708000000", - "XHF4ZmtyJ_0OdEaouDbpoz6I7q92HbAstpcODtE9n_c=": "470531000000", - "XHIiLDG2URHa_FbW-qS5M7lNifeVQJbMzkZRNLFBE58=": "384615000000", - "XI3ppFwALJos9efei13DR_tm2a11k2zDLit-PmTKRis=": "384615000000", - "XIKpzxJbz_iCrwNjGZlZkGcJhDW9OIMMJv7VpSj3Ecg=": "825277000000", - "XIkQORhusOteZrCtGuoRjiySjOVNv9CXgsGadMBNxFQ=": "384615000000", - "XJ8K6EkcLwMBpRMnWVnRbjF-8jvhVP0LFT2S3HNNZVM=": "385973000000", - "XJTcFm5GVRjHKS85kT4hJxm3Fm71KwoD71-XrjRRLfw=": "391797000000", - "XKHYkOGTDILWxiPtES1w9jal2bCTOG7q9kmbj0jQKMY=": "2744663000000", - "XLGzz5vazvioudxTXIS23PQT6LN96rT2GGjDJLG6Kps=": "1250143000000", - "XLX1wlj3ZjROg583JrZaLR-7RET1BMWnFg9RskvRF3E=": "408021000000", - "XLci1zPaBT2VOBarLEXbWQxsTFJ2-xC9rrlCs4qiA2I=": "504471000000", - "XLlrSGMRE2wJa33sD0jLjrQT4jRTsx0WWfWOo06AUTY=": "748071000000", - "XM-lxJAcxPlUN8EdU7Oj7OCYgIPdPNqaLgvtxoKCQ4s=": "385506000000", - "XM4C337Ir8FR8EWTxtya5QlVaHBv_dsMOz_8JkXHzic=": "384615000000", - "XM6hEtAso2RGJkYVsZXSW9gxLW2nve7Xb_9zyyndiS4=": "1140748000000", - "XMTU1fPUSfDvKnZofOnjIbz7B3pcShmj3OZcJX_u-rQ=": "404875000000", - "XMZLqI9GatOtNNgFgjN_Jjv3i_ryHkfWlUBYbb_TdGQ=": "488082000000", - "XN0hnz4tspi0w58TX354Mgl0rlYRmur8fJmKrvdft4M=": "769230000000", - "XNQLnfWw_w6gsPozL68rP24Dr1lNlw6Z_8KDoo96pic=": "3505846000000", - "XNSYxyxJD--XYnBm2upANVDcMB6uBbcAf7ZmotCsKKM=": "1923076000000", - "XNWk-9LX0F-3rP9gcxHI3rftUlxhBhWMr2KE2m8XEMo=": "542774000000", - "XOfDcCwBz-anvpWxka2VQLp_hnH8ehn9lSDbQPJWfW8=": "674647000000", - "XPVH9mk5haNmLI1pl434FxtjfvwM7KPduGFqbABpvU0=": "1692731000000", - "XPcp4wysi2ZKrWcE9DOwWcF8cO74TqnL8_BoCBbiUWw=": "384615000000", - "XPiBwUQKOD4O_OYuTg630XMpNKZR9_qXUtH_SUoDCHw=": "416812000000", - "XPiXlEK9ptA1bi-MNYdBRiLu73jjcAEkEBHtEFD_abA=": "830923000000", - "XPjxmqrW0yTXnP4UA5nAZnDcaqXtfXWe7stSOVnHnqo=": "385506000000", - "XPzM-4K6Kj7sXNpAe535e3swQoUSE3EjtcQUV_gwXNI=": "961538000000", - "XQYSp25ltuFHfN_oftdN4TrlRlTwdVlEqaBbHjHzcGk=": "488135000000", - "XR3GbjHSHDwXMJYLp6sUteZWNpJzg7C52Yfpq1YbKTc=": "544715000000", - "XR7-_R3vGtH6NLg1fSZc7EMHcOkrN_WDjTtQLFawIEM=": "385528000000", - "XRr9Q_DWkvEuGkrZ4_Ofina9OxPs-uDJeT16EqwZsfc=": "810534000000", - "XRsU9vKCZwh0_7gpeHyTGxnlh7VdlD5x-YRfAJ88f9s=": "1256322000000", - "XS8qgs4y9U7kFwjXMeJPvvEAXYu2UzuiF4gD5qksR2I=": "392009000000", - "XSID9zCPztTykT1uJt2myg-8Y03bWRA_Rcc3cVNVJic=": "913466000000", - "XT-h1FE9u8x1pwF7Pgu-2Z3IUjqIbMey7U-V1xthTIg=": "1509204000000", - "XTfCCqdHsYRJck1nL1FvUFbOPOheEXnDgHcXr0pL_VA=": "4216365000000", - "XTnTDtxLRuJ4vKWq3WkwfziFc7LHQVvWry0ioTmgFfU=": "755958000000", - "XUAvK1EOdoeUk_onBKS3nIQ6MzajLrjOfYE1zcj9f44=": "463498000000", - "XUQSrGdUttHBe9IcozVtNdcGjYxH2c4Gc7M1TC3XcBw=": "10761363000000", - "XUZXS5Wsipp9oGw_EGzXf0lun7cx7sOzJsqk9Jfzntg=": "453057000000", - "XUeHrykZIwPnsFqPh6N2D2VuDem0EyuC4mf_epfZr88=": "2010962000000", - "XUf4TNvKjvZIaH7MygRFmZTyBYJfvAKSVryg77Qg8T0=": "416666000000", - "XUmTPJv2Z_Cv4CK7lxjuE8pf0d11269WjQQ_VZUvPYY=": "5093279000000", - "XUmh1gWsbj3FpFsAcTA1ZMfy6P71VthMYNuLdr-0dP8=": "385507000000", - "XVSerRJAAJZHOKmQJDnowm3pBZd_FmBNb5C3hqAxgbU=": "1927863000000", - "XW32ydK49a767MqxOrdEdMeXk0Uh2xLg3ZShDhz5Bic=": "385562000000", - "XWfdDvZHupMRXaSUkkuKY1ABV5PVEuSHjiEMWHiwmGM=": "1902568000000", - "XWvEyFvKgxsoJlUGd4-1UPgupQqebrpxx1hd9nNdxuA=": "414412000000", - "XXKefCAFIpsPi8SbeiMU7e9gsEeGJw53FgrG_U0MBA8=": "384604000000", - "XXPMOV2MtTdHMKaw7bt5sFBJ9vD2-CPsRUsr0eDi-_g=": "416666000000", - "XX_hubX3OWmKX5fonMzOKnr8bh59tOO734OkC8efDHk=": "30694729000000", - "XXfX_EiK2tSLP6vgP6xqAX6paT7uosen2NB1I95eW40=": "422216000000", - "XXmoB41_3OV5OGRoJzjwYEfujb6M3ida_GS1xI0y-IA=": "461319000000", - "XXstwwnZMLta_S-R8TcI-luLfEa5hu1mDYF--Bs0Sj8=": "415629000000", - "XY7PGIC8sIyIEOoIvmnKYU5pZD-KCF2BiJd-a_VBbY4=": "384678000000", - "XYJ8AxcXrJgXGik3dH2HC51bZJuy_EWNlGX4i5Rorlk=": "471839000000", - "XYTlTyd_M_vVPcxmVNLZlHc1ND12bVOzrOQOdTwsmDQ=": "758689000000", - "XYXITAHNwAk3IdodCDwr4or0C9onjXKE8wwFtJ0jRQk=": "461858000000", - "XYn5mSH79QMXVVQvSvTmPkSerw-ER22Op1s1Vsyivqg=": "1153846000000", - "XYqIvR2FxiDzSmWBAjD7Cu8SrdGq7WiR3_6MKZPNz_M=": "384615000000", - "XYsV_3r0PfwFVVDXc3pWql4kqFAmMB4KTEc8Ktb5DyY=": "1538461000000", - "XYskcn8ZPWW8ER6aR_R3It3UtZqSY4IcufJu_hk80Cc=": "416392000000", - "XZuh-mqDjd26uO3mwBPdFjU4vnowDC1grKXFvtmgmxw=": "1249999000000", - "XZvNMOFPi2p_Gkx3dQ8HzRtlKKjK_YxdfCzyRXrFKcg=": "464104000000", - "X_GMbVCreCmZ1t1mXIO9_K3PZ64P4jFTf70xD6akjO0=": "454586000000", - "X_NxWrUF_o3O6xslGX-XW_2IxEWYHky_Wrbf3PsI8C4=": "454318000000", - "X_RiGekxy7tV2Qo0-T5ej1eeRkONPJZNZWvbj6OkC6M=": "422561000000", - "X_al8y4vJ1LQPOu9Jha_JHY1KGO7DRw14PqRX5eGWh8=": "5833333000000", - "X_oYDjfD4zRrHrQDQfeyH3lGhl95_GsK-Q4qWbD5CwA=": "1363636000000", - "X_wtVYoJWNwaZGkA1n3KzaLq0FuMUT6HKWtbCpHjQMg=": "388549000000", - "XaFxIfjJi2Od5yy-SQ9khmYbdsQPJJ1k5kWHrMRayns=": "1250021000000", - "XapHDT2oOuEDYEbJSf0hwRATeZyODcd3W4q8eBRZOzc=": "424881000000", - "XawGQGM2VFiI5dX_Isgvdi3NK4eH5gSw53JpavOOt74=": "465433000000", - "XbLkanw6yRcrRTDihGm4oTnqb5B-j1DWDWPD0JILufM=": "1135800000000", - "Xbg6NNL2yq1c29POHu9qs7rh2xe_ruAOmLoSvtWT808=": "2918028000000", - "XbjMjRXB36tluNCDwXPhBguaExUnCuuxNPG8Y6GrC3Q=": "378385000000", - "Xc0Gy6VwOd40WfIeb2LNrdm-RmI3Paq6D2ZLh1FM8FE=": "384615000000", - "XcONWYuWr4uRpdCNhsBSw97q6TqJomEFGPVgDskazxU=": "384321000000", - "XcjeKDNf9CLpw6vE4hdwwTYddjURdcFv7edAolnoZqY=": "961538000000", - "Xck_1M2CzSupoiczGGo0A2QtNBIHJ8RDdeztgVPFn9A=": "451456000000", - "XdHqmOCQpNpt6fAuhZW3FVc5CacV1VXPT8lDr0ptceA=": "1153846000000", - "Xd_OZ_cDJwk-gX5wO0bmqHmfmD652jnQocbU82HDGQk=": "516817000000", - "Xdjb3dgzqFkTEW9af6Op8X7XY3w5s2l51Zsl0kWCY1E=": "384615000000", - "XeDlsfaXbeYdztIVPZ8A_Q0OlYZdGoG_RkZ6bSWiSOE=": "783778000000", - "Xf3EOMT431LQCqbKQ63dUi-5A3fbb3E7_RCIkaAmT_U=": "384615000000", - "XfLswIP9rwMrbo9FEnsrRC-WXS0s7OLcAEx_GtolNUs=": "2666580000000", - "XfNGiDAHBnw_ht6QtAqtc2QYcCsr4wlyCK7N0tBiY2E=": "769230000000", - "XfkNRDN49vk-g7YLWWtwjQOXhfqjZ8wFdb800McjF10=": "2299194000000", - "XfwzvHxFirn-0Xuf3dS6Jpiiq2CKTALCmgKBLm9dt84=": "6748433000000", - "Xg12XhcB4B5rrIxTjR1Zh7I-WcvnF1cFOmfhrzsmF7Y=": "461365000000", - "XgDDylNAa-wmA03B0FKcVtalZuMJVhkYdjZlWnBgMso=": "964248000000", - "XgXXAIuHpQjnwyE34IX2y-4h-zRqHEFKhbu6f2Cqlj0=": "385198000000", - "XgeTQdm5e4uT9bQBGfxJWRiOo_PYaOLGQ3Zk5VDsF4E=": "1373975000000", - "Xhg4CHzND453k__AiiuY_BDU6uy6mKdJQHbrg_VYUXc=": "1249999000000", - "Xi-vAwgHiukcTyjDu2S3AScMBpWvRrc6X3nxkRXmD2I=": "492837000000", - "XiJATGly7wkwzL32nl49Ya1du_Pk5ds4IAa7YfukAcU=": "651381000000", - "XitpJZvmvMO7q8bsKJhwKyL2FMvw9PFHAkucSWJXdgA=": "659188000000", - "Xj6f4sWOQQdpx-cjP7Ey8VqTEGnNaFdW5CO7-kqfoP4=": "578548000000", - "XjEHU0CNcOZuowVorrUSTnUm4jDLFKZPC6SUn9eUTtw=": "384902000000", - "XjZrpfQbv5rSYuOnAt50moAc-UVG-nsZjgMXjQEoJSA=": "13636363000000", - "XjeK7WVOyUAUsNKbKWAy1QSuGfSQE3orVsZ5GeACJKs=": "615384000000", - "XjolIrVeTMqZH9mWfeWHm4J2h54JGvZnBpWD5oaHgsc=": "473331000000", - "Xk8MkUx1MK6ZEk7vpk5xmKFg8IpAC5V488OLY4DvhLA=": "384615000000", - "XlWp-z6Dyiubmp_jyA0BXDqdC_3B4VqakfcjYgoxYPw=": "385505000000", - "XlgxKye1cxCk6twuXMsUZb9Jg5Jex5K3dzxNDbGEgSQ=": "441769000000", - "Xlsm5JoE0f64nPjwh5wT4RXyPe_UhE2ZlfJZ8wlNrbo=": "385047000000", - "Xm-2jd9JYeNf80ADxhOnsn9zZpYSii55IImOBR378oQ=": "381976000000", - "Xm-GBglQ-_EnA64A_7y4R46eOhifTDLd0JkEMrZCqDA=": "422561000000", - "Xm-VTrbREkplcbKn50tg11vk9sLmp7MosCRN6m_PJqw=": "1043281000000", - "XmFclIg-OnHFcF7-BUgelLMxFm7iC-KHzbL4hypGCFA=": "384615000000", - "XmLvWYCed0uuT3A-QbVEDfIQ5WaT7dcH30ttO63z7Z4=": "624999000000", - "Xm_MngK57sL7U3O3qul7iuPBcUwMqLeSdavVX6fxjEA=": "376837000000", - "XmpNWItsG4rrMCALgIihK5gj2H3wtSX4yW_Ev9oQN7o=": "450259000000", - "XmwwKQyG_IhNI1Z5koz07ub2B-MJP759IlsNYLI7F4E=": "1228050000000", - "XmzpK-P0IAvofPMp_Ve4w6sUFVTJQGBp8h3xhFE9N18=": "1153846000000", - "Xn9gjb3UbDwNMCAfLN16Yt7_ZLwBV_FGAO12Fn7z24A=": "763538000000", - "XnG6tyWWwUfGz6spW1qrCvapOxuIF1xr2QWS07h8-uU=": "893914000000", - "Xnbh6KRoK0QgkfmZougJKviaqMmEhosfG_SMdaOFQuE=": "1633257000000", - "Xo6UU_Yea9ywLwNkqsqDmijkmvn_AN6EIze08a0psg0=": "455402000000", - "XokmTMdPOU1z5pTWtU0YuKUZdA4UeJwLINdSFGTk-jU=": "384217000000", - "Xol5inh3nCy_U0-k79qhwXLBE28dw9Gy4T85TyyeOOc=": "377328000000", - "XotzrMqSthA58qnYhTxLTzzU-xUu-Ux60XYT7wt7bQA=": "384615000000", - "XpHKgirAapzg5zzMGyFACzGSfNGanqTmKDyKaQ1Cud8=": "419408000000", - "XppnQxEkNeRWQIRM-1c6CbACAwaMyY3qCnAfYcya7PI=": "449601000000", - "Xprn6ORHGEAHAugi8ghlL5Wv3M5X7pzznk9AW2vF-CE=": "385505000000", - "XqNBFYWxbW5ynRFer69b5fp75f4rh-VnZhG6Xv_gqDA=": "650761000000", - "XqO5-PYoBJQQM2xJN94eaUBxyqnb1CIJZq96Ia_4zc4=": "1030769000000", - "XqrQ4gEwFxQU6n4iIH7QGA1mX3ysc3nvnOZ5jS_skcE=": "3076923000000", - "Xrfkdb3x-9JKc1OwCQfrq_RvkT07iijY5JVsW6NoxdU=": "416666000000", - "Xs0u5Fednuw8y-IuV2I42DwV46psLJkFNLqksp_3zeE=": "384615000000", - "XsCMIKdNjQmsy8n-2WK2MtOeBPetv7baIdC4GGcV_2k=": "385229000000", - "XsMB1-bEIRVW6OkiGiKNrZDMQIsnpf4wfJvUyD1oL80=": "424923000000", - "XsUCtszAuPPRe3tk5DGzmnHU1vJybJc-R6i6bqNkv3I=": "909724000000", - "XsWOJcgNiAceUqiyG9WyxBZJ0d6JyxKBT-zxYoKSouU=": "384211000000", - "XsZGDtJctTc1R30LZedyFLEs5WA2Udpue9X9qJ1vQic=": "902469000000", - "XsjqZTAH60H6z2fq6KyK9Mj1T6FYdvH_sLNzttbTIuY=": "447983000000", - "XspJl2sd7heS-dkaYweSmAy8JS8mkEHu35wEGY5k07c=": "1648076000000", - "XssplbTgD5JTZAt509FgJPGDIbeXa9b9iIsxQU4oEwM=": "385505000000", - "Xst-FwT28Ua-wH1mSHsppRalRgVaWzwnZ8LLxHG1wtM=": "469825000000", - "XtZenXQ7BtGRJZKgqEEIV0IRvGAy7JwC3nMRhoNFCZM=": "416666000000", - "XtvyCpAcFnAOziEcHCXSC-D_-RjCA5-O4bnZOe8yYM4=": "385725000000", - "XvT7nmrGQps_8VLOVACydn1t2kdvyUUGlK1mQ9Gs6cI=": "1394356000000", - "Xvj3IsB-X4ml244pwKt-oW-1QZ3WP0ud7wpFJ75ARvs=": "390037000000", - "XvlKKEv3wdxxrIVSroTYdoirJ8q-suyWYaaWzYZ-FRY=": "4110858000000", - "XwQmbkw5Ga5k3mMMRaYLdppazA_V0p9oanqjmzVLP1w=": "2499999000000", - "XwVRUSVQUickCHPx0QYqf56BrGNX1v1wOyL5p7u3TV0=": "413365000000", - "XwZktDSL_wTT6vWWYY-bXcRA2_gVw8hCCIBnQbqoeaE=": "830439000000", - "XweJ3XyfXn4TZLXUseoYRKiVvgcuQ3XY5cVT1UnHtrw=": "1182197000000", - "XwkMnu9-OuNr2YYIVt66CDJhknSqMxV_rUFhcs_ICvI=": "1076916000000", - "Xx5TDyyjVVo1UB2ryS70WYTEyDubk2lo8VeoUp8dy8I=": "453082000000", - "XxBdo2t4JOpc8v1VzwBLvHtfzSvLAsdZYhsP9NMU2xc=": "387390000000", - "XxI3EUE1UIAadQjZw429TatjhJ5bcbjgJu11O2IGGus=": "389386000000", - "XxYqFhqCL__K9Qf_yMxrAmVv3WXHhr-gJn5QNK0NCDo=": "385506000000", - "XyLQTq7ZW-TU426fX16v1t_jcDHJw7inljCgw-2Sl6A=": "469988000000", - "XyYRLFhypzuSAGWtLl24jHZrvb9pBUGsONBzdVUP8I0=": "1667623000000", - "XyeQ-_D8KxFkf6uHTLPB-osxQF8Av4ZuCYG5cxp3EtQ=": "416666000000", - "XykE8XsXNLj4ucSrORf0pANTHf7rOriDSefpojWgWO8=": "415962000000", - "Xz--fEZaT0379Uz-sx04tc_BVBHGhFFt_bg2nE9BjfY=": "8690445000000", - "XzOeUpDOtYyz-P8k6NJYjSr_ieNFvl30YmmGAc0oFTk=": "384857000000", - "XzaT0ZoXM3EbNm7ya5zOinZop3GBQ7yN-qXF7VPfZVo=": "807630000000", - "Y-UWUu1UJti5nNgfhVwXwALNBaQ8_SbwvsUMJcURzr4=": "7443555000000", - "Y-bZvNahb6UVoIao_Pc43HT5D_AsWeJ2Xzrl3ARr8Lk=": "769230000000", - "Y-jIOMVAJ6BxzwObOXKv-YxP49i-Z4Y1LnlpLVT7siQ=": "536514000000", - "Y0-xNKac_2tF9wQIbmFshkSGTbCY_VBgbKKgyM7KNkc=": "2429028000000", - "Y0N_Hg6YIO0NXzzkJh8hBHFxEZDeuUMreXUHnCj7vGg=": "356788000000", - "Y0rDeK_LBPplV8nq5wjP_chOMR4PpGv0KjuEnIKBNrg=": "384615000000", - "Y15NoFJDnFiCKUo-i_BxMun2ULfwVBK00370YzY48gY=": "2691671000000", - "Y16kH_Ha73Q20f5AP-5oSDVNyZUAhrbf23oArX4wDgU=": "538444000000", - "Y2D-x15mQdgmAmlJqqlFRFmT1K7pP43pZpKs0vVgVtk=": "2533181000000", - "Y2KqRLf746rXGzMCG167vOzkerXhHQiMylNFb8IxV8c=": "390632000000", - "Y2MmmB7zVx731Vv3dyZhZPDsGnGb4LLaoc_jzrnBEps=": "496210000000", - "Y2VR6oJJlIIvDfBZbKvjA9IHllaIYFfJTeJEoUFFvrA=": "1153933000000", - "Y2jk2rsER26XieOft1vQTHuJ9AkbQzT-E1R2ZyDHznc=": "452341000000", - "Y2m41FadnfZiFRyC4xf10HiaK9nzs9iKg1Jg4MaV8oI=": "769307000000", - "Y2wKKp0bjFhktr9nymNKURtTIi_7cIkEsSbtqhOqLCQ=": "905988000000", - "Y3IDHnNAPTiuIzbUp9aayxibS5fyD5tyItOzVI8fEMA=": "769230000000", - "Y3It8ScSqW7JC5RR3gV73oiwKTpr5_JDsWndjpUkWt4=": "452104000000", - "Y3Ow5cxPrb5iJ4O9S6_YL6mVku9SZz54BGea6E4MbKs=": "10266024000000", - "Y3cVL8O3eZbj3poT1qOfUrq0bi9ecDOS39OQyP4r3pY=": "448838000000", - "Y3i_MzyQS3adBT9_GxwnC3o3Iu4JcjKt-rLCxXuEL70=": "1927525000000", - "Y3omyJD67YDSk8ywFSOC3aJpMFMnwUiAMiIrNp8zFq4=": "4098572000000", - "Y4bTRLqXR6OAL70gljF2JMIsh0yo2bOEhjv_TsbnJRU=": "384150000000", - "Y5AZfS0SVsBujqyinAZFtu-vQBjclCOFhHzqw4h5er8=": "407808000000", - "Y5fvkAPzkQMOhC8SZvB7YhZ9wVMEeEBQKMbcyVXSu7A=": "1636685000000", - "Y6DrnrBBeyLnO7olbilkp1fZJO5wPASdcNZExgSiYDQ=": "467231000000", - "Y6qM6VDH8jYTPwDxFX-hRrCOXK9VFkiM_AdT7FsV9DY=": "456319000000", - "Y75OQbZ4E9cC7tWn5pYmck_ECfAZnyh_gpL5OBWj1iw=": "455781000000", - "Y7JssOpppvAQN-J8LQEPBsXLKi_oDanPt6IU99mBI1w=": "454545000000", - "Y7Odt5T1iW3w6OCzhi3tvBo3yGICBkBEbFZuGSzf_Yk=": "2384394000000", - "Y7SSIv12_-W7Q6-heCaM7xjizLAs8JNaC1cIF30FsuY=": "470310000000", - "Y7_wFNjAcJDfuzMh8lDj97a1Cq9Jg6Ud5RnhKQ0vdP8=": "2257489000000", - "Y8-tLNc-tcHM8GQU4b53x5_w234xvgzJT3APGvTz6VA=": "1391513000000", - "Y82d5_ObOlyfQilEyKlhxy2S6G6J3k2_K3NXJpiDKDo=": "921144000000", - "Y89-r-ShAtnsUr6ZXqi85yr7pYu9XUXzTU4wJiT483Y=": "416666000000", - "Y8DXRQ24U9K5pxV2Qf24Rv4ymDhUtB_MefcDOF3pG8k=": "482124000000", - "Y8esuuIDRFsF-pfKerv_d-VTC5oJqOMATTuS92LbE1E=": "3807115000000", - "Y8fnrogG-YmshrWDuFZy9MEInMiBekYzv0LVqWrwORI=": "384112000000", - "Y8isxoyxC6xOPqk7KZcXMcjDJrdcmlcKoTF575idSbg=": "924820000000", - "Y8mJVctjzHmAKSXvW9k1ye2mqRlHXdKMo7Ef38sOVE4=": "462146000000", - "Y8tIJNL0_Cno8-KpAqwp_URGpEwZey20b3TrwnhMP88=": "384730000000", - "Y8vpCyjfi6GP0mSj7mYjVyS9ahSfUHC_HcEySJi6nc4=": "1666666000000", - "Y9-5ffRdlGFhLwquxQkhPAnI1w4meXE0ViI2HBHgP_A=": "385506000000", - "Y965E0FJ1NrIh4aFiKN7eK8Y01J5_C_DkMPmErBpCyw=": "755840000000", - "Y9FO3sX5eQqkjx9xKX9Xez6D0PWSAj7Y7LEsvEWTung=": "389421000000", - "Y9N90XIiy4fwtEH5H_72wgxcw6eOdPBhyIGYMI_rcPo=": "903496000000", - "Y9jS7qCsDAZTPJzZrHsBxmuG09zy958DDIfrmnX-n48=": "1818181000000", - "Y9rHBn3ScoTHL2ZquD4V0EE_PfLYgP2mbvABMfrXzMs=": "7256371000000", - "YALJTnYZx0Z74wFFKSDncOxq-hH5zjb9ri6oaL-5nIE=": "453736000000", - "YAqIR302j6Cm2ybKixzfPnqIq2sY1rfeac4C0m38Bok=": "385660000000", - "YBJpXtkNmnpjCwJ7xfqCNWpr1JQEOOUdK75Fair9-us=": "384111000000", - "YBROB_Bi1L38zT8y3Zn4xLGjZjCU7sm7I3hhgy3g0BA=": "1157593000000", - "YBb8LIROExvwk4wIrWpEsnEJ_9lHGRUdJFS8MOEkMrM=": "385506000000", - "YBnYWmgyKKLmG0FWteltYpCLw7aFra6-KQhx_xS2qFI=": "385189000000", - "YBx-wivf1f00JAYxsy34DswLXStgTk-bPOaHuXi-Afk=": "465433000000", - "YC-u0SuSdcDoAL-hBMTtr_UmCKfp8yjmLMMQBTFvsO4=": "353298000000", - "YCF2EnAhuHJv_LqURPXokrchtmWkSPUDBntbvFx0VwM=": "387115000000", - "YCInagu9D0ukKTWi0WRRY1YZqQDsWuWtH5k5Szpk09Q=": "1538987000000", - "YD8kW33G2uXY7aNL6esw2zB6wzyG_VXitsb3VAM4mf4=": "378561000000", - "YDAEtAPf31kBoN7PFemjBKOOhW4x8u9sjdsw_Q0-Zo4=": "1248097000000", - "YDMFiYe8Tl6Nepkot7eFlKXx4MnmHX4XwxWLudMAReM=": "2264332000000", - "YDSX5nkgPPJklaBuP_vFF6Wi-_oG8MJSECN6z3dLjgU=": "1908094000000", - "YE6bhzblzkfM-Kn5vv9Sr6aOkhj20CFefcgFzBYzw-I=": "2140514000000", - "YEWimCzUfu7Wl4IRh9meGI4b4o1bSfqKTqiPPhor2H8=": "764788000000", - "YEpsVTQrHw3RUbkp98d2Ljkn2jfH-W8UUafrK3a-USI=": "4174124000000", - "YErFxPMPYtQ_L7WYSxay-Bf2dTe2tB4SMDlb11IYzYw=": "488135000000", - "YFAPf7EXMil0IgXyAqSZa64tyN93xdydfsY1mBLXGzM=": "1159720000000", - "YFN-kYiK6xoGVoJNqpr9j8Rt7JH8zsnFZIdcRskNisw=": "1338544000000", - "YFbgc_4aVHnsl82FrTP8aXYpKYPiOUivb2mi4GMKeEw=": "457648000000", - "YFc6PeCdkkF-Cp93IqIiQdqwjSbr0HiaW0fzEbgiYuc=": "1750556000000", - "YFlI4krFRxGc-3DkgGoBr0ttW8C4pfESCXr8UDjlzFg=": "444665000000", - "YFrB79t1teMAws5wcLRwnHcBqOG1S5xR5dLUhq66B-g=": "1179588000000", - "YGHplh3TBAP-vjTQnObh0vNSfVHrfhidKjwQIQaxgLU=": "1131764000000", - "YGXGckBEr7mr0PAUqY_-UsX36fZDXvZPeqe6dwq3DJQ=": "381294000000", - "YGZ1sYFDOR9q9On_aQpOxylWN6ZKwWDrMe8rdnTzDTE=": "922309000000", - "YGhB38xHTqtG9t5bQLjyLf_NwJRKMJQTpa6vHw1LhJ8=": "2730761000000", - "YH-0Wu-4o84U-Q0mjt7UH8VU5RKB5-xxkNULFaI_Fv0=": "1161063000000", - "YHWW4i7kA2s8Gm5X3W43A1IP_3RdWLTbzhVPVEqLSI4=": "920582000000", - "YHZSg9kJ24B3ipQlcJ9kf-dKzvaazwTA1pzYO_Hwkxk=": "19236309000000", - "YHz582Ui9Rx8eCXCiTfMSIcmmBxtK4BZWk_LzLa2LO4=": "384160000000", - "YI-uSNOtyERr7f891mvD-rh5tB67uFkOV3ztgKL37Rk=": "384869000000", - "YIPvDxg7U-OADX9M-zs02zVFmwtRumU5iQcX9xHRQoc=": "416666000000", - "YIcLPUPh_g5X4CDaMU_2XyIlwIDbuq4rKDJjLq9375Y=": "584874000000", - "YIlJ3i0poWpWDbxwIfgQei4Zs861lfewLDniq4of-ng=": "411085000000", - "YJ0JZLn0A4z-e00HYPjR62hN7BX5EUByNwC0gFXxyOU=": "755868000000", - "YK0ILVE2xZx3xnLjvhVDaz6nHtkmmk_1XdC1SxQRtNk=": "504754000000", - "YKEB2jt8ho2qHgqk_-Al7kz7aQhTEOu9baBZUh1J4go=": "381632000000", - "YKOmTtmy5DHLmcCGZAv4o-fyWXnL2geBDp5zeFARhYM=": "1144304000000", - "YKsI_3zUgQXEdTlu3Z_Oe_fDiHNtSkj5iRcK5UVTdc0=": "1156517000000", - "YLFYoWTMl994KpGFvHYzY_HHsWA6sLv-xzwRhbhZEp4=": "384615000000", - "YLGNYS9sgA5cFks6IJpBTTy5GyUcYgTQtKQXsZXNX2w=": "398095000000", - "YLIm2KMM0z698GoukQwlF3BFojqk5TdizLPoPqpjCnM=": "393570000000", - "YLYIMLRGpTw4-hsfO_xCIeJ7ZZNXHY3YxEu3Zjgl3i4=": "2290886000000", - "YLut5lsqb_3qUrV2wvshYAc1p6kBCLe64JR2vjZFJLc=": "1956801000000", - "YM-VBD7bsxkwuv_nBCtteX6mYkRnq1LvBnlYVCIOx80=": "4007241000000", - "YM0dwRLSTA7JhaWYLWtHu-k3dhMqd5iKncP0YaRYy7Y=": "1142450000000", - "YMP-uGDKCBaR-EGR4ojWIhsMgpSq-X-nDMkZsN6fGXk=": "462146000000", - "YMtjwkru0z_AWibvoNnFUjAP_bMUGjZO9LcUgBgznxI=": "386288000000", - "YMtoDkNK9a81QltKpcmDGxfLoghEvwbyQRdEZZyjOPs=": "374327000000", - "YMzlv0r-HAK2XW75H5GpS8HG1y1Jpplz12srpVO3pz4=": "384741000000", - "YN1Ev6OqpJg-tgnV7h7ssy7PZt8h4S14ZajCnDK4K84=": "383644000000", - "YN6uBaGLMT0mrCR2X-kiauZF1O7ZipTqSSMqCFqxWvg=": "1175518000000", - "YNltTC3n7qMnMNfBPxCM5cN25Qaus97JCB1XOCceYoQ=": "1927528000000", - "YNm8_z-KODPymuBZaFDz6H2tOXdDRTVyQWJ1VOEN1xE=": "1573782000000", - "YO2X-eodNEl0Glx2sXd9d_BPAHoxJBxXJoN23EQBEK4=": "2274081000000", - "YOw6FQIYoBKPjQVzSD-6MAAFzR8S92Xu5KYcsfxq_9I=": "1250021000000", - "YP7iaoblMPrD17Vt0GCz0rWJ4VsND1c7FJS8nmZPydY=": "416673000000", - "YPSufEqfCysSVoy2FzwT8nzENs-FTkcKHp4dLvJL768=": "760231000000", - "YQ0ga_SS4E5-VkLKak7q-mvqP_vt8xm_9MKQvVRCC2I=": "384615000000", - "YQ6LUaPxZwl5FJwrtCRj1FYAm7LQ0xCEf_d5UOer5Do=": "426403000000", - "YQJnE_wN9Lv2hfKOB_8yHJSoHO9sjPagWSsEEqcLDFk=": "1164850000000", - "YQk9BORKWKwaekHBYiKsZMlLNjLbLG_wrEGcD9kJAJk=": "453783000000", - "YR6qR25qYfJ-PbKidYJw8A6_hc1kfalNEXZZPKigitY=": "390053000000", - "YRGVsPjkK-ba2OkzgkhYo8TqMxgaJA2TrYzyJEOEWOM=": "906627000000", - "YROUFsrSkz6dy7NzZUb3EvoKpJWYbYCcXjtLWs7-4r8=": "1363636000000", - "YSAeNOtwflVsXFTsZMLCLY8-wKB4EAYI_bdMDntZD-M=": "383903000000", - "YSDJZr2x1TV4kEDGZLH3x6-IJhesPxCmPnAk9TK2WWg=": "1374041000000", - "YSR2n4V5jTfmLHQky5U49v-iX1pPSvg_Sad0s5DCQaw=": "16197770000000", - "YSYaqKGgWLtEyD9hEOK7QZMBoo-JxFQ_S8migx1CFmc=": "777529000000", - "YTEjVrSxN4IJJNAISinruA8d1kqDkBr6VrVsdsKQqM0=": "379542000000", - "YTk_IqXaIFyi8LpD723uu1Jx5GWBdzt8OCSghdalarI=": "404015000000", - "YTmm-vscsR_BoUICWMPTHgVjMxgO0vr2GfLHaM4qENk=": "473331000000", - "YTp6WxeNUzUmiMlXAOJFB_cuqvqNjJ3QYyx7Ei6qQYQ=": "4581801000000", - "YUMy68WpfnMEjn5FCNdSm35qvbDTokNUsXyxmYfyhyU=": "385510000000", - "YUrf0mNyzZ_RiOveNNPjrfeGw-e99iYikfTcDdcWm1I=": "1822359000000", - "YV7_oEPqqWluBL1upqAW6sw-ULaGxpab0moArbFi6II=": "1542796000000", - "YVIxEscFQw6S1r0cyTOdRbucvl_FOP_ZKUiX1lPaZcc=": "1309889000000", - "YVPts7Cni5Jc3MuUazvPljFAjYBUnPx9nGOr83AT6BE=": "832223000000", - "YVzC3OYrVHjC-dpfGPXHi5aDh8aXkmt5iu06YP5dIQU=": "767594000000", - "YWe-WUodmInM26D_8zGFx4MmSKVlpecY5W7agQdCbnk=": "461555000000", - "YWmZmxCN-LGgLMY_2bXK-Ih3i_Vf5puPvKDyg-q9ilU=": "781016000000", - "YX3sY8AJNiR057GQvIG87zbPtlO65jSdgOPcNDkgLzM=": "385614000000", - "YXJS593RO5TG4YRktfnEgkm6JCmGhGop6Dd0eUspi7E=": "379260000000", - "YXKusZ31RUgLHRoUPjGG6OdPia7TdZTacFwHt78SXIE=": "759269000000", - "YXSsyKqSgsm0fbW1c2oUCLG5bpEbhHvpzt1XOSqcMSA=": "381839000000", - "YXoyzfLLeQQ_kbIav-QoOTGChipQ9iQ7H3qC0c2rqW0=": "3933873000000", - "YXuHB582zP8UwKWIckomjzF8F_kHkB8rwyULOGtU3qw=": "1153846000000", - "YYLAkf-vmn5cLlBEXNP_D3TehKvlchO8e_q8HA7tf70=": "1923886000000", - "YYkkQTLW0R9zK-OtN6EwJHPWiBqf6DGTdMi8Sia4SGk=": "2055429000000", - "YYryv6-5SYfbL1DNcHHrILdmdjfctTDQ5Iqxt5a_yuc=": "385505000000", - "YYslhjq4N37vJBB7ZOuIZXIg20IHOhQ7kVkVSBj2Frw=": "3461538000000", - "YYyVvXPhliYi8mOgdptJof0H55QEQ9cuBmf_ZRa1Rcw=": "1788788000000", - "YZ2TX5y2VwUWZTkcVJ4CJQbk7fqH9gQAAVLG9GXCv68=": "465048000000", - "YZG4MF500Fg-jn_9P3jmF9iHfOTw28iMLVYEZqcpHjM=": "850425000000", - "Y_3eh7KJW12tlykjJ-k2PxCIWBEVZC37Dwvt_ezn7PA=": "502779000000", - "Y_bI_ARmoW4VGMYO51R-5JeJT44HCeEnbDpC0G7q50o=": "410399000000", - "Y_u03_jxP9k4kQ9SYACGgdV-3OLJaCz6YlTcyN3eE0Q=": "902833000000", - "Y_xzKTxyNGD_LkPvhKpKej1TksmS4URs0M9ia4rJW6U=": "411085000000", - "Y_yzz2X7Y2nZXf9oHTHQUuFQ108T6u9Pphavyu4W7N8=": "503175000000", - "Ya3JJBDsaUHztBPsWlZc6mRlXsGwij05s40Yan58NHM=": "488979000000", - "YaSiLHSgbx0D6yJ8ea2ny8tHga55LOO2p5kP8aCIsAw=": "384652000000", - "YaWV6iM7tVxm7FWUlJQ8msL5PTXdMMlp1prBamTCQSg=": "379260000000", - "YaXGwW6Eqm-D6t2Gnb86SqNmuX-CfqBhFyDZdF1Nhfk=": "3846153000000", - "YadRJ64fHDBHhDLub4DWt1-4qr1vQq_tSMIACeriChU=": "617118000000", - "YailsVASrtCWqig-LJSciBBi-LyKw_H8Yi5kltQLeQ0=": "384941000000", - "Yb2ebHtK2sOIF4H9naghzpEce6zV4dpYmh42-7zkqUI=": "384615000000", - "Yb8dmUoCDIbvmJwsYT8rHGQDrv2pvskp0puV1LZDLAM=": "384892000000", - "YbFkqmtkNOmyboUe8JuMp-cfwSu87wT70cnZkPnPU3c=": "386931000000", - "Ybej4u_Pw-TkjqwfKJ-ezuHn7K-P0FP7VHYOakqM0Wo=": "727405000000", - "YbwQCruXuvmSzGFJlf5CegeaBXn4qaYC4eXECmJx0co=": "467234000000", - "YcFxmF0nd4ZPgwNSfg0nK-huTMQb8Xytjy_uET0Ky30=": "425255000000", - "Yca-zpI52p5Q7LKJXLBHgdEjVM7y8vdh7LMsaFCJeAs=": "383289000000", - "YdCtYQBfifEZKpv5Wwl6IStF0Sg6ckUDF33RcoTLtVA=": "420514000000", - "Yd_PUk6dSLv4ZIulRTl0vtR1zT5yD-Fo2R-pK_3poig=": "4565201000000", - "YdtbhgZKlkmbJtdlJPT8mHBNXXmSaIM_RY6bgJm6qyQ=": "380589000000", - "Ye5ZZw8_nDgsP7AhScO9N38SCt28NOkPad4mE6bsx6k=": "1817940000000", - "Yec2kZguWYuWBS8NWZZAxuSFe5dWJzCdwGhGnV-OWfU=": "946002000000", - "Yf3EIi6cfSyAKoI0F7rORuUDmGYSuC-0MPHXNoh8ajQ=": "1153846000000", - "Yf3infdgnXSDKZ1Nui7bDZgXr0wDnKYDlJBbAgTg_tM=": "472009000000", - "YfEGBR_jzR3NbwQdf7E5RSyd2a-Bf4tftVCXFnNEC_Q=": "463498000000", - "YfKRNL0Ww2zH6jP1rNvZMpbH7_3Ii8sUxKuUm6mQXiw=": "457740000000", - "YfRIrSbecOraQ0QsCgNFbdg7M7hxUM4WHn8EiMlNgFM=": "459850000000", - "Yg9vla_3xigIc5Z4Fd5bMD7aTxVMnioP41riEl-T898=": "925648000000", - "YgYatIM1awJc8Z11ybOHgpH-dx38GSoPkdKCrX3dR_U=": "763244000000", - "YgcVb6AbhSuL319MqbVIeS-FSeBld_vGKuADNYxG0N4=": "388478000000", - "YgyQrBG7UvfvPglfB79u1iG23UBo_GfSuKZ6IpMP-KA=": "1153846000000", - "Yh7OOw-6nQaDItM6BNTMoL6RpwzNzHFSEYHYSf07JSM=": "18181818000000", - "YhRDaZSgJM3JqNhNh2UP5BChNQz_53PGydZdDEQ0Ivg=": "1923076000000", - "Yi1YWg5Fh7A8tE5cnY2NzMMyIqLVm0BpXUVp4eyJvr4=": "2060882000000", - "Yi5OhlOpSonpxtLF2qxFfJhsyYYAGMKO24bQnp4JymE=": "411594000000", - "Yi5e-91zvwq7CY4KADvqZRXZ_q0GHTACJkli4U6xEr8=": "377309000000", - "Yi9277KC6ScJvxfOzdERcL_ztt8JDdJ2-Ds-K3WW10E=": "701782000000", - "Yihg-PmPcaWKLa3Fi9yVOucIlrbEjlUr1uTggr5IjEg=": "384615000000", - "YizRbNgPZuOKu6Ajk83slFEYoAFpGyMaG50bJgKvFCE=": "454370000000", - "YjKHewZsMdqj46Yw5qDHnDioOtanDrQnd8_Fy-p5hZc=": "1155274000000", - "YjKLRvr-vDtD4dBr-T-8yiUaQAR5wQZ5prh0MYZBUb4=": "424548000000", - "YjPWVqUTnlheRtq2orO5jakpTSRmLkbmibxpafCU4jI=": "450738000000", - "YjqnHeE0S5RPIvecfpQK-gJnosU8vOhci6xLXjtx5vA=": "416408000000", - "YjundBNjd5K9C7OqNlDOVFhYv7tpLUrJEdfFHnSPops=": "555325000000", - "YjzDBbzdypjyKcALtAEkPEHk5n2yc0nxrDG-OC5j0tI=": "384615000000", - "Yk8Nh_JuYxwipQdyy4y2mQDKRJjLYcg-wKBC_HUWBR0=": "3181164000000", - "Yke2APhhAym_StYtKGxcRpNsSPH7AlefKxPyfX6MX_c=": "770374000000", - "YkfvuvwJ96Ukr8Yv_NZ-N5dtiaNBsrMXKfqEL-imFfA=": "411085000000", - "YkrVirsmP9iKHoS8NKoTcySsjRdYbllfIhI0CQG6K7s=": "833333000000", - "Yl1ttqrEQulC0OvB2n9GJE8LdMcU9G8-c46pGUQ0gcQ=": "460952000000", - "YlFdBCXh0Xc8o6kG0tAEWM7hG1fHg1w0AqSZzDQvqeQ=": "498366000000", - "YlHNLPGDCSOZfW1g764t5NaN4SdAQK9izN_BYJ1hk00=": "838319000000", - "Ylifj8NaJNCYpPrYmvykcNUq5Zcz_QdRJihNEBU1CrY=": "1274301000000", - "Ylu064XqRcretcPzzkaHidtef2bHPelJLYSFMR5wK88=": "407469000000", - "YlzKRahI2oo4LE8pT4ERO6KMOnNnZP9pHWTp1kGKfPI=": "464104000000", - "Ym6nrZdRuDMy7f0t3JV3v6z1KefBtGEt9uAouvoSnGY=": "462839000000", - "YmWtEQVfq7kqvjnf3xSsGUhNNAvHYR_Wzxzudcy4mMs=": "3287659000000", - "Ymj9nnUxGkgvdBq_Lh1RYzD_ylm_ojcA_pk45-2Qg5c=": "3923076000000", - "Yna-22gAsU__qLsrbgwIlcedYzIUiG-OteHxP_yzqPY=": "5994080000000", - "Ynazj7OkinKlqLxCXYG1QlDFPSD12HTxwpwZEL-iSw8=": "8021760000000", - "YncJFdanzdXrFeexViNe7BWIDxKRgh_v0bAulnwdjdc=": "912339000000", - "YncRMQNXvADmljlA7e4vRFjGXIr2QTGSFrZDXuL-spA=": "454545000000", - "YnhGfelWeN_T-zCHhI1FoWnow8e8uM9SiWjDym8Vsis=": "422561000000", - "YnwAvFBRCxZCry5hTQndGzKlGKry5kMN2kbZyPOOp08=": "390816000000", - "YoaQeCfTRnjnE12Fjf7a49QAMmD0eoq06cC1VegWjMA=": "653846000000", - "YobJ3KDcRueyphVSgNG56PJ_tChMxwZLOdsSOehGmO8=": "384615000000", - "Yof1waUTPZINDnGJm8muHBs11VNjC2OAeewtLS9MqVc=": "1528743000000", - "YofuJgZojTlTyM1d90CTpaDtpIo0mtmg2Hg47vwx5yQ=": "820209000000", - "YoiPYds_uYTBopi3p_Kuni7-vb__BvKs_1mt2uSeWTE=": "1916873000000", - "YomUvu3vqzEXQaYL7yDvtXbYQAxS23Gx-6Hr4w-SRwg=": "1673648000000", - "Yp2WipxdLZ2MO9DN_mPMRnpB7XdsNIisFAusCF9ig58=": "384615000000", - "YpTSROiEZztEp43LLiNnNMLIm-cFLfSaDS1UgTs3IaQ=": "574775000000", - "Yq1YT6cY55E2iqNtxqkH9CPZjqYXKzcpaRd9tovUIx0=": "383334000000", - "YqNdFzryCrmM_E_uvSrr-P5SCNO_Q6nVVC3IGUuA1jg=": "424045000000", - "Yqf17e8DQxVNuze7_MgWghIFUoa_VT1YZ1l4BrZaGqQ=": "833333000000", - "Yr6tLxqP9_dNSA16bt50ewkpcrMDl3vbK5GjSeh1Cvs=": "4147477000000", - "YrLhaguZTy6-Kev96RO5lQSJ1456D5ODh3PDHb2zdt0=": "501408000000", - "YrPaZFSMwF63fahb-bGcGDXIpQ_rMkEWHPYU-zXRFTc=": "1931896000000", - "Yrk4m5jqGKdmazS4V7hysKpSp9YBgXYMhzFg1ZomhsI=": "769230000000", - "Ys92nqDppM0cpqFtfnKMZRObgKLZuKyYvcTzg9eh4zc=": "438461000000", - "YsYCdMK7JuZ1juIYfu0T8QN8fboq-nlKvUljeUmO090=": "386039000000", - "YseSgdGxUSprsU2MqIs927WPjd__5QcX4taw-DUY9Jo=": "776238000000", - "YsxFpb4wuAAP6q0qhDL3GWmSnvLAqeuWyaz3n9xoaQc=": "500070000000", - "Yt3AX9009PJx80OPN9gZLlJAFcsEbh9hg6Rvz8ZWycs=": "1136363000000", - "YtH2nhbvL8EFKgjrWxQUdlSHJACmiuTFE-wB26op8E4=": "485133000000", - "Yt_ZimiD0HbXRdvfoP5F3Vb1FLW2TAbHOu8GKOagOII=": "2031023000000", - "Yta7SHkhW7LE-Ci-CMLoLdouMCkn52Wh18q_Ljrbhoo=": "1004528000000", - "Ytj32jXyjyh0mkb52IdgiBb2r5bIQBErkZf4IlHkqkw=": "13772727000000", - "YuJDLRoUQPO2R-Dz90A-8-O90LmMPP0wfIC2mxH-tzI=": "416673000000", - "YuTwJz6ziH6xTVWyTIxObv25gTGJp0O4gdFlLSbUVd0=": "460148000000", - "YvN0WnAv2ceAwC5mOrK6T4W0eOh8RFaALZ92NFsIzk8=": "384615000000", - "YvQ00jw7SvdSKCS22Kob-hoyuP2eQ_U_yHlV-C0eUII=": "385505000000", - "YvW-00qCVZZ30C6x4TexYxPj7DPhTLsBc6acEIEULgM=": "446347000000", - "Yvd9yePNbBSC44JsuRcIxun__QyIa-riZmWQIJ43YvQ=": "385507000000", - "YvgnyeVpEYiRKVkrCcn2zus7Poblr_DZzH-IOCibsO4=": "385507000000", - "YwCz1AfDS-GE5DdzAqf8lSsiW6H24FeSzd3DH21oLks=": "1153846000000", - "YwdSzcuVVP1tDkXpdckQVjN3ekXqW8fAGOkV9TGJP_w=": "395728000000", - "YwfJ_KvTf4nl_-I49RYeYZyJlcOxL5CoPeltowZE1b4=": "454353000000", - "YwulYIlos1EW1DgA83E7-VuugEgqyz3IqkgWsVXmgbs=": "390993000000", - "YxDLgRObU3VfTR2a3iZLd-Z03IXY1OQUBwo-sBTYOOY=": "769230000000", - "YxElsSEyXk4JIbekebeJHuI1qEQfyvaPuovsLbuQiE8=": "385507000000", - "YxsUZ7FisLB_G1-xhPTBF--Td1KGXJwF83LVJ9K60nY=": "1728662000000", - "YyEHf8AJvxJrHR_PhVHqmtWauo5RMXsDCkXBZVrFpWk=": "400371000000", - "YyIjTkvRUYWNNW7yYNMPGzyDImTx6RLoZSjczwWmPHQ=": "468609000000", - "YylMccquKep66ZSMvt0PoVkJD-bPMPHWjkdGID9b-44=": "384615000000", - "Yza9nVOduML85DVhlUlYozkYZiOzM0yU-bCzRSXSdqA=": "460586000000", - "Z-So0_hDTy_2CeyrTJZfNqXdpDvqJoXQ8AxfZ6L2JQ0=": "454545000000", - "Z-o-e2W-QjP6JWozlOLjHVdoCJibA-UpLtmsW5Zl42Y=": "769230000000", - "Z0ULeSuEB9ojst8hmvnqPUrV0kUHpwTJOuU_3XwUK5U=": "1366800000000", - "Z0VydTjnNmBSQWrVvjXPcHcQd9EJrYNqTYrj4GHnsjg=": "397332000000", - "Z0oRVmqvt8ZTnK1qQ1RHfF-8u7JYnMbMkPUgpfJALY8=": "1927545000000", - "Z1DrHtdiAMdKrHeXwTBfFn-rZ_oYdQw89-QSwqLGLrU=": "769777000000", - "Z1rwUemOEKz5b9aAnNzRx_9kApFNAjB_rg10itdSn0U=": "3842983000000", - "Z22AkOEBFxMfRN7UJxQuqPJaCXIs97sXMA35OS8gcjw=": "384029000000", - "Z2C2eerE6n8ZCM1Ec7zoMJxTTd-T4_TLabeGHZE3N38=": "1415034000000", - "Z2DA0wFKUMw_IsyjZvq6jCRIucju5lxHdYBZhCI-u8k=": "383370000000", - "Z2LoWjhQOKXxHNCPjZ0-e_Z8YMQDMhDnX9Xrf_gcLiI=": "756302000000", - "Z2OPzLm2TQqbLGBpcQ7jA6iSqXJog3PTcSleyz3-7hI=": "391132000000", - "Z36c_tzeZCLXTQOF9-rCOOohfFZbh5hmrQU0qF_N9i4=": "2318813000000", - "Z37022BPoVhKEpmNsl02QBLf6cGVxhROTPpM0wN6UtA=": "415455000000", - "Z3BOfdLrIMPmEikXbRHPkA0Dq7Vl_yNLzCo5gfBLzNM=": "1924454000000", - "Z3DPUHO5A1LCWIb9xPy-tRaDYOH9a8QPGNPkv4QeKhw=": "909090000000", - "Z3ZvfbtIwGyXGIH4feQFyKIi9qqlLwvQipLsIo5uMlg=": "458877000000", - "Z3cGZyEbHFSxQ_LCJ7MP_tkemfykpPz-Q-CGTYpyMik=": "833333000000", - "Z3o0a5liOvhWXSLgtIIQBcjJDQN8OaRd5U_kV0x2cz8=": "447942000000", - "Z4xy6u_gmaHhhqI3cwT8HB9il47OXBHyn2T5zydUenw=": "362194000000", - "Z6kv4ZTqKveD_H6u_UWsBaiAALj5tCk5atdkTIqMbCU=": "2020141000000", - "Z6v5tOHHv06vaxfhUCf3TUvkxReOG9AevPNaczty71A=": "3848827000000", - "Z7aPtNu702r5vTQWkohvA3VhR7zgF443aVUwNkatDMk=": "648033000000", - "Z7jJ52IP1FJ-Z2PUJ6uhPN_iMPfb4dnmoNUtT1d_Azs=": "7433031000000", - "Z8-BEfZRBxtS_VtqXcyDfQL3-mi5Oc93shZRqqz2MRs=": "1083291000000", - "Z80pwhDSSDrTW3hRzYFpbcD5_iIMwBOxb5Qenta6_90=": "1110651000000", - "Z89KV_pfnU0mHzvT8lrsCfN-0gq_-mctlv4wlD7i_cA=": "501104000000", - "Z8PE7cgv7W0Y0J5xhLgoepyYknH6Nafd3a1wHYCZPl8=": "1239855000000", - "Z8U_bPgvWkT0PZWoB8S_k35HAQsSRvmee5M0yndyJNY=": "381714000000", - "Z8Zjdo3A_-NOFZox0Yik3abIG9h8XKtnkNjkgjyHY1c=": "381805000000", - "Z9-jhWY28qLjrXiauvhfHf2QLfrxX0XmAUX9DF3wwRg=": "1603820000000", - "Z9ldzynVH-HcGDz9U92lSX9DYr8s7G_QSwhxGEDMwDk=": "384615000000", - "Z9viiUTPaz6wPCqN2wXVvFKCto0Stc7DpRxXR2DoIIQ=": "796003000000", - "ZA0YqLs9Hlkhs1UfbyHzrw8JHreSLdgjEskZXzdwH1s=": "384615000000", - "ZA4NcNTyBkmb0M5TkGFKnMuOSwOn_12W1-FGs-_eevg=": "461538000000", - "ZA95N3gT5B69ggBPVIDJz5TQMTkRkxJO9GeUO2oqdSA=": "411851000000", - "ZAKhscOpH-H6rQbZNQXH9k0332GD21EKygT-6t58u1Y=": "692307000000", - "ZAP3PpybjfQ1lnF1GliNYAnOGmdrw02el1cvdE2PzF4=": "382737000000", - "ZAWmTU69h9SjZ82JrQGhPixOGJKzq3rRhH_d-M4IP9Y=": "1823608000000", - "ZApQIejdBKFFAR9fihTAYKsLH2l0HbyJd38jA0C826U=": "390680000000", - "ZApd0rispXs47dhPVHW_509ig3N5eO0S_xXnk1rlXro=": "3050505000000", - "ZAzb0eCYJMgoUnqsbNRZvbPdTeukv8Kwo4eDmWCK26U=": "452035000000", - "ZB3UUoWxovSIiA6ceshxZMsc8vUzXtZsm_ZP2Gs4mzU=": "417190000000", - "ZBQceMaf7MYxbrclvRfCckQZ8YZBbMxgUo-6aVSOzrQ=": "1168447000000", - "ZBbQ1KS9vsXbxj3rMDadzr9Mm0r2NbUOVnPOk0LiLz8=": "2083333000000", - "ZBhKGvaGFCCPi0Ob95o0_I-vPpiHgnDUTE5A3CRQK5o=": "464300000000", - "ZC19mtkS4XcFhTS00g3GbeWnBj7C6StIL8FEUtcgaGE=": "400371000000", - "ZCLl8FhR_KfGMyqGGoG21ViXb5OIsfPRpZooxgm0ekc=": "2499999000000", - "ZCRHlykhr94rfYDc9ecEA86U-2umNDTZAWD3eanIz_c=": "420518000000", - "ZDBGMPOC23TA2VV9kHilVjq4mKC9_TmO5p_TnYNowMw=": "408960000000", - "ZDK9NZcvUTJKIusfJYvKsdNv_Lt8LrEmbZhMOK71LOU=": "454545000000", - "ZDlUFmZJR--uOW4sm5FIiM7jv16PIaWsji6m94prPAk=": "384615000000", - "ZE0J6k8tHU04kWRFht5fySvPH7c1d83iN62YNkNlnDg=": "3242898000000", - "ZEIBmGF_fyMK7r-yAu6T8ouqgCrY9Cu1UZmgqwfhL8Q=": "491516000000", - "ZF5nvlh4K2WPtaYo6yiUgqxk5je3-DdJ-0SWM_EkM1Y=": "3856992000000", - "ZFQ7HXYEusvzffAZHYDDo0eTBpX8f74y2nw6NT84NEY=": "35426417000000", - "ZFVLsUEl1ZKeEot3Qyz7xwozY03d1ubycxrSXJbLA64=": "407469000000", - "ZFatSHUOZPFUQFYr4XdYgBz4QhIZU6eXgTvMUwfrYQA=": "642211000000", - "ZGT505s--gjVyGfLYvOqhRLJFVeXauhfIouSmdi9uD0=": "379354000000", - "ZGwak7FilKJGXQekIIlAqjQCmY_LS2vDQPAywtZrlXE=": "2084176000000", - "ZH4hDQa6Y58xxFe0Xm_n9IF5hoTXy5f6_R4Pz5kQL1c=": "381439000000", - "ZH8Ug4dyoOGxdpznUK67ERtNGoUpgkeIZEo4B5Fr-sQ=": "893416000000", - "ZHJF199Pk2eW3z5nLY-q9ecVwxOG7gzZ18bqVeSDbec=": "12499999000000", - "ZHOblNBwp4qB33KFa1p-8alW8aV-om9UdlAkvWhobJc=": "656013000000", - "ZHgbpnMiPxQXwwyKbfrUrzuDauMFc0Zviv2HlaEjmhs=": "411085000000", - "ZI-SKIZDjKEeEFY0Th_jM-Wxc188m63aFa9MSH2xchw=": "384615000000", - "ZI65q6I4c0Rx15N1ZaKIA89vh_SzvA_mO4WwUVaizfM=": "424426000000", - "ZIEDhumDdeNsd2xCL5sNqbtKa5fx3bzepuyQ57Wz500=": "454556000000", - "ZIExOYMoPdD4VheeW3l-YyUG7MG8pBO6Cp1LpW0ccXM=": "21200014000000", - "ZIXKaA_GxFLH9cC087Z5EgyFXzXSQ-y-xyQg6lnyX-4=": "1131938000000", - "ZIgj57JhHkaT5bH7YVT1mSyLlaT_XtYmv_vZ_IDz-sc=": "411085000000", - "ZIiVakPvi0oNbAETB_5jTYjIrzHBdFvdKMwUkHylfkw=": "385935000000", - "ZIkGQNOr0MIrxbVFojj1kSy6NR45yweBbQ29LZqWREg=": "769523000000", - "ZJEfx6_zi-j6a4WxwzN2LB5LnVxfebKqyPCZzp8fBYM=": "422561000000", - "ZJVkkEAbXgAxBaHANEfK27uVstbBW8VF0fB4ZZnTOGg=": "378611000000", - "ZJcsizcsbnkABGPsOjdiJC0ZeeA2VPCNsqczyul-AGk=": "399403000000", - "ZJk97XaaCS3MjlPjFlZlscLWboq35gybw3nvB_2FV64=": "1536921000000", - "ZKnAjuqh8gNmqu3sBpAG1FftHpHWs7XUIEH22U-hKII=": "384615000000", - "ZL0AA8pE8VZdTW-urugKY6o4JZnDFLezQdu0yHgl_XQ=": "1912992000000", - "ZL7s5Dy4wGUMeGzvi3d4IhoaIitElEZ7DzzbadN0uZg=": "420518000000", - "ZLHrR4A007xZE8j-kgL0PyXcii2jBK4US4qZXbQd4a0=": "384283000000", - "ZLM4OPn5ydR1aoWkmxzYQ9XY-nwM7c9ljwbYWIcG6HE=": "465040000000", - "ZLUio5YYclIG2TkvXBgg9LoQrSQ1ZDInGsFYMKVoHWw=": "388711000000", - "ZLam7GpptCBuTJoxjRo7RjtJ_NxWhF5Df_vPtAN2nXk=": "1238455000000", - "ZLvm6A5Do9ESQz2oBEJnZCihXSy2zrd7Wn1vT8nKaIA=": "454419000000", - "ZM8Ocf-Y71UFKm3QFg_U36Wi41MN5IyvIr6XubhMhzk=": "767441000000", - "ZMENYGv3asNPIFhBHf7rhwKuFSyJ6oSe6CaEwe-wFS4=": "576923000000", - "ZMEnLN4rCptMDyKb0GxjfUiEzOai1hqps_7z3-28wlc=": "3231245000000", - "ZMgMbxE_Xm6F2aanj04nGNlN_5eVW5FLJBU-KMogBlI=": "393806000000", - "ZMtJqeTouKSwmDY9sBSkSpQKlYjvkrC-7Xeh0kg_DT4=": "384346000000", - "ZN-dZbuKK8loBDzTkXw60d20FHG0P-h-oELji89DO10=": "844467000000", - "ZNHLye0JyeALe6Zsk-inauwa03siZrOfbXXOaoM_xUk=": "455600000000", - "ZNf8MWE0AAUflV7WAGC_EobuMeWSGBhNz0apK5y30Lo=": "598669000000", - "ZNwGJoDGk0CCEUsMThU7sVkGdPg4WynU-whZ71JeXwk=": "411085000000", - "ZO4HsYOwnp701r5DFs2dg3uvwhH32-GtZlIlbkxQBng=": "1948064000000", - "ZOB66UvxxJ0CvykFKJFoPai6TUVx6ARoa0FmxDJsF5Q=": "2011452000000", - "ZOFj463h6ZGrcNV2Q_Ox3lEI_SxAu-nBZnrZlIfTDyM=": "2172727000000", - "ZOStdQnHI_DqlZw0GPZFiUSYG9uKEr-P0tX8ayBG1OI=": "2298980000000", - "ZOx2r1lpt0T9ltwT8INoCrdHVD162ejZGQFfXRp7oho=": "1153846000000", - "ZPBsbXo5tPRldQ4iqKuw0cPwNGqjc-yN5tfEQ5gXU9E=": "5504976000000", - "ZPc_cyTjeHfLanxWhNxfEoRW-neu6Lk36JZyU4wAnJc=": "457658000000", - "ZPprmSndoK_ucNlztjfPhSN2CCfvb33OL94JPefGCHc=": "1877873000000", - "ZPq4FcbkAmxPu-gw0ukd-qpYmk1qJJiLRN49mFJoyOA=": "1159980000000", - "ZPwYE-MrXOo-MAxewd2xtNU_QXMN8pBRCRI5SSY1hCs=": "2843187000000", - "ZPyG0Z3ydnLu05jaPMDQi3Xce2Ec58KGPN8otMapwP8=": "486218000000", - "ZQcOsqynpFqLFip_XnIFuSuk37b-XBR01K1g7a5a8Tw=": "1258176000000", - "ZRWhrWjWYU8yHrO94pC0EhOETfZ0rb-mDgYO1W-4Qj8=": "384585000000", - "ZS-EOkGvEs-mwPm7DddoD59RqHzspA3Vnxr19GcIqdI=": "2358835000000", - "ZS2kQlvjLksR6nuKc3YTMfBwAJ68nlRx_NykkbTXdEc=": "416735000000", - "ZSkSm511WQplP1UFr-Qq_e1HPISeYq2X6Qzk67QPgPs=": "1662519000000", - "ZSpjZJam9eUPkcNswOwRX3yf2JhMnN8b4l2WSvf9GvY=": "566845000000", - "ZT3tuPlctWz2MijRLT7Ce5pG_ZRobjmCGXdpcfS2Od0=": "793337000000", - "ZTCkUcwQn9c3DYzRKMGCs9dW_wvvftM4Zi6wbsJ5Iy0=": "893658000000", - "ZTaeVLkEaDBfJiGH2ZeW73C3t88-8hBBsPp94wPqThw=": "5384592000000", - "ZTbALmkFNs_ixoQ5YDAoMIbBY1-Ca7KJ82gK5sPuvC0=": "7497594000000", - "ZTeIzNas8_HfuEj8ST4SxORcxJy5H2HsUzYYbxS3MvE=": "920286000000", - "ZTqcqz0LNsyFz4WWRZd8LIqC_P6Z5SZWSQjRv_2qLc4=": "2499999000000", - "ZU-E6_4XuXekwJc6itCgzZXhzL6Cm5hM6DpwACZZAXQ=": "387034000000", - "ZU4b6gxFD45FzfAMWfFY4mj0R6h19Y58et_uHvy8fnk=": "385507000000", - "ZUCrPtXz6AMpItpEkodX5Buz_S3_dA8lzsnPiEjPq90=": "1885207000000", - "ZUKRitarKyqV-t69EcBSuh-1VPjPW0qHpafdd0L_hkw=": "1223425000000", - "ZUiW9g6s26BXTFzyFDR5Xtco-e1oE_1c2OOdl1Sx5Yo=": "383217000000", - "ZV2P0yBQpBCUp9I-rE77yE_YjtvYcxDnTBAGz7U5WmI=": "5769230000000", - "ZV2cDqRgyeQYXezWB09s7q9D8Ot7K898Es-Q3_gn0dQ=": "1107326000000", - "ZVVwXIBwJ3UQfgqahrMdSHafFN8rVry3PARflqr6mNU=": "3937565000000", - "ZVsNvRhTdcAWEKuHNsYoGi06GJ5xAtNGMXaf1Jh4Utw=": "385507000000", - "ZVzJkvTFvM8bDD8m4dZJS0OFPH5XmyDYgKUGB8KjM1s=": "832413000000", - "ZW-ll-Mw69mPMIq0AIhMF9Du-h6-56uVMGvMEmUO7Sc=": "384615000000", - "ZWhsctR2fcVC616eNxBllEghOr_EEKzYXMW3lObBy7I=": "1924105000000", - "ZX8ONHFhGGcUX8MV0aJp76z0Nf9xFeEeJ577L3KNzKA=": "455341000000", - "ZXLTyOpbCa63OoGJ2KTOpOU2r14mbSMpPOzrFNTNItA=": "758537000000", - "ZXN1elzLbi4uj8SqJ5OUIXQCYJuppAW98_vPiC0yacQ=": "448320000000", - "ZXhQade2KDht4amr2r4rX432XsGSaG8SGTh8GpNVfOI=": "411085000000", - "ZXm-EVHfSZadvKpEC1k8YoxC2Jjs7iW7Ndwvwt4sOXg=": "413362000000", - "ZY0Q_WF9eSltuVlc_B-ACh_SfqZDPKh5Ovm28bIUkcQ=": "1115658000000", - "ZYIT2LBmXXMl8MuR4g1eFibxyerGsrqys2RSzIdzojg=": "384615000000", - "ZYJ0m-PhKuyK3xGzjhk3PpEhjp4LjO395KfXpuposHA=": "421446000000", - "ZYwwdluKC66Zw45LWgx7dEtBL2RKz3HxdOLF4Ivzz-U=": "545215000000", - "ZZmQgWB2FGUYzt5d7abWj48cOkLmpo0FhQoz6xO3LSE=": "1135024000000", - "ZZsKAg1J4vlmms0Q2ekF4op5Vj0Poa_oSEwQirLJQP8=": "491921000000", - "Z_z0AxIirfFOIuCZ7kro4pi5fSsEs8yxmsJMeuARn18=": "386204000000", - "Za9xl9iOSv-P7TLOgW8hVSAWOm7cE6ayoL8L6M0kts4=": "473265000000", - "ZaLE7ai9aU5vITKskX2YJCwrta45WuC_cfrhFurUp04=": "390743000000", - "ZaPZOV20dSABCt2KB18Rgpou_VtmaZ8pgMs6xDNUw9k=": "415629000000", - "ZayyeDDscfOUXPwTHGAwco9cKDzwBuiE5tKpeDJ_Tz4=": "385654000000", - "ZbR4hSD41jtM-iHCMp7rgUyFYmxwxfd2scjjdbmljyI=": "411526000000", - "Zbms98ERFFPfijfOD7IhWcRPKHYuyeHkrZ83tkiwQx0=": "9090909000000", - "ZcD0ue7Mo2RNMcQSg5s_DQ-p9yaRIAzJdyCU-8b7o7Y=": "767719000000", - "ZcSAsG9EKhJiN7dl3OGgxFrA1przA8Sus_xkroNJSo0=": "4199496000000", - "ZcrB7Uaj9G5etleL6s3i8dXLJxzDSDUSPSB6N2Nww-M=": "385665000000", - "ZdJoN4Y6rLi5ApexSunoO4fMGeitvkXpNPNquQrWadk=": "452511000000", - "ZdbfrO8D3Qo_n2e5ZkrzTB8liyduVHN_104gziEcbi8=": "395497000000", - "ZdcS18aQ8KekvK8xoLRFi4DpJRhJnttO2Ybtd_o9Gnc=": "1666666000000", - "ZdxSYu8o2sg3SGN5CWVoPu3GbXHVE0pWXdWuqqNKejo=": "426259000000", - "Ze9lmReI5tV8RSvPSnUE80qD-Wf3coa_vCq3j6hG6kU=": "382394000000", - "ZeUXhCw1E_mPCWaERTl3ahTPS37nrBkwOBd6Hbse5TA=": "769230000000", - "Zek5eC3p8CxMJq3MLwHJ3qh3DDKbXWuvptyfckj4E-Q=": "783778000000", - "ZfUaE6A2QF3-BJ9wWjpqXHAOzdaTiSwJ3WZTuhE8yJI=": "457702000000", - "ZfmWQ3vNoXsCQHmrQfYhz6UWtA_1T3PXmGzNN97oG-0=": "8333333000000", - "ZfmxHWa6-DQ0ARL3Pam8wnG4cix-wN2RQ_kXPYZ4xuQ=": "1522049000000", - "Zfx630P1UcVrTLI0FnoAqnoHku9AdeQUo2crmJ2iQrM=": "383714000000", - "ZgMHTocwK8sZPtpkcMgha4lVuBlBR55IkYaPJVhv0CI=": "468121000000", - "ZgWgg3ZMn9ufa7GOf8aoLE-ZkFgdRxxmTvlsxDbD5SY=": "446532000000", - "Zgxf3DNSuxGF1OJyFMJ9P2ES1URIu5dsTlTXwwwzaaM=": "384615000000", - "ZhPZ8FfcSqpnBMI772nxmrYGbfneMiaZK407egfWmuI=": "11538461000000", - "Zhi0An7Am4zLtNX-VwFOHS5f2WJx582q2GQd2f4WbDA=": "1241228000000", - "ZhiBImtqTrKcnR1mP2tsvgtKaxganc70Em2JnoV5ab8=": "449142000000", - "ZhmT6RUgFiel5I_HJfuqLqb6EdKowJ0TW-u1fYLgQTo=": "384615000000", - "ZiKJVTqd3bZW0rwh0B264lxcVxPvaVpy68hmFkZ3h64=": "453003000000", - "ZiPA0EUyfTyMn52b5otwCZJ7fx331EM1kqzcJwMQ6sY=": "473001000000", - "ZiVpBobo3g962hemtKb14ZOgYVjsW9iUxhOIGeSjbIk=": "384615000000", - "Zig9ESM3QIipJW5R30dJH9Qf9Co9OPRLtukCoWtSZSI=": "381632000000", - "Zim4VfPpu6Ki4ImGxm5AqhwO_IJJspRZ6SF7iQ0xZ7g=": "849693000000", - "ZisFK6CMMpcdvDGfJf7L_zEbEwv2AQGuDAvihXRKMN8=": "519045000000", - "ZiyEOS0mF_TPQBfLroqEZvt_z36sXuAfXeh7ivtvXrU=": "384615000000", - "ZizNhdc83Ii4E3lu5fJ4STIzOYeVJCm5RXemkcQPdrw=": "529201000000", - "ZjVMtE0gcdFJ3qSV2R-1x8c95jQkTg_mI-5dwhw1ya0=": "375432000000", - "ZjpE50ClKwIJRqHMhjtGKoDikHCmcNUEsQ3nGXak41w=": "3855089000000", - "ZjtSBSVv5gOlD11xUHRFLhTGlJ80MsxrAgngHQLQjkw=": "500251000000", - "Zk1FTU8_vsomZlh-GZxiRhUWLXb0DOEhy3ezCdagxsQ=": "1924269000000", - "ZkAimJNDnRHwMEEqx1fZ4_yphgR63rsqw5RI-WMwdPw=": "385510000000", - "ZkPuHGyueCQLF-bPOIngyGvzU7pklkps39lnlOguw1g=": "1428104000000", - "ZkTelfA60UzJJ_jdtTzU9REujL_PRVmFHeJxmZtJGBo=": "457433000000", - "ZkWaO6tRjlTOM83dKTs1KBx-h8uBgdve2enPPPK3x_c=": "1128954000000", - "ZkaRDbof9okcQ6vn3C3e0yD_2FyO6bsRjWxhgLcYT_A=": "454545000000", - "ZksfamwUdgyULohluIAK1IFTkeEyS8wv7mINHmgO2rY=": "767182000000", - "Zl3GEaiTZRpatJXX0Erudgfr63CqRlOBN-gPc8IUc8A=": "33808627000000", - "Zlguqgygb0PaK75EJqZ4CXlg7BeiZKuxgPGWUb0KrKc=": "412542000000", - "Zm0FvrBYYnPQXMFYhApy9I5BGtfkqifqVzjB9CfQD_k=": "452367000000", - "Zm5LN6Hsxzn0jMzDzt0GQKPyQOo7XYcsJ5UDNMLBg_M=": "1150899000000", - "ZndLOJ_CNXFauaZ35kbREXG-1U-Sut3YcVuNE0MH7QY=": "416375000000", - "ZntksQLAtK4zK7KH2WvxCfdbrjvdZ8oNu9rJj1bEpZg=": "2074375000000", - "ZojDb4tPn51kCd9Nl9OsBOivrmCUdcDRvmSWemz-SS8=": "1514867000000", - "ZqJr-2RggJKtupOjYR0I00-3O2wu_x5zeKrpEBXe6Xg=": "423370000000", - "ZqL0PL4iGkyJscTKEnuHBQ9qWsGrsJmmtB78X9mWQZY=": "468609000000", - "ZqesYHJP4pijBC4yhs81v1YOJyaJLHXeKNPemO5IwfQ=": "1156515000000", - "ZqrvJXvzC026jVup3rrzggjM-8bLdrxY9cKCTtS9HEs=": "415461000000", - "ZrM9K2aiBzfrDFzVRaKQE19jkwaKP2yuGmt-s6Xmycw=": "761132000000", - "Zs3YUJZHpoeg8Eho9DjCSM8zEu5RHHCLPqRm5rGmYvw=": "385447000000", - "Zs9re3GXjR5Tw35OoKkB9e8RbztWU7x-Dr6_MaYW69E=": "452425000000", - "ZsDOSIAmqc-S9_xzKywzKuwTZYDK1AtZENHeeIxVnTY=": "416666000000", - "ZsFFKxdfBaUX71i4b4iaubhYZ-VNfj5GD8xmmiJvl9k=": "812815000000", - "ZsRGqiWonaqW6f7aaZgS2V_3QoyNs8WpwDsFoAeejT0=": "417193000000", - "ZsbgpP7p097uUpTtwT25FQR1UXGixckicqbeL19zWpE=": "351050000000", - "Zscw8VJb8Q6PyOPtqK5FrmxG0LupV1tHaAribcpyuZ4=": "416666000000", - "ZsqVnIZ3cJso_enWwgoVAWGncXVA57dgODVcrAXHABI=": "885599000000", - "ZstxHXxX5S085Wra7iU65Gp1ufBoC_Fke3ojAzUgctg=": "769230000000", - "ZtgUsKFX8qkb560COoHC4RF6ZcNKrQOlL3cJmyjmBKw=": "1344890000000", - "ZuFSIgy0ySswJ4ijOt1Ae15jVT_xnWT2J8T3YqfH7Eo=": "2138004000000", - "Zug194TULQ5p-RuaeY7D7xpd6KeUwf2WHPSnkGNmZ6U=": "385988000000", - "ZvDu0NUOM5sJlx83uWtcrRcPsASuoD2BLFGDrTn6cEk=": "385505000000", - "ZwYyZmXsXokmaV5g0lzYgwPSklHHoEe9sNXCx0Q1d3Q=": "6810765000000", - "ZwwXOQCekzsi7B24bzw1UiaKPy0BrzgYmUgi0gMCiQI=": "384615000000", - "Zx8WMvWzulI6sxTW45LTSEoi5liNFFqTRLxLIi5fkgU=": "932527000000", - "ZxGUret8qb0RGFvwylL0V8_pZ_FfPo6sIs18IlgX8sU=": "1373076000000", - "ZxtUYyL79tDrxLuUS-qVEFCmuRt-KZECpfsIxgvOk2g=": "684383000000", - "Zy4-C0-LkEZ8-OtF-UG5z1tIhHA3PCxozHr9mW0L8Uo=": "803304000000", - "ZyDvTqEehDHa1pd0smn8hDRUovmZS_ZS6NHxLbsRL10=": "1386434000000", - "ZyJOp_ycUPRNlE-5f9oVdcGDxkFv4nLXmkocqcJDi-A=": "2313319000000", - "ZyntTAAGS9IhPtqv9ZZSUJyJcllAztZo6W5Hr2zgTSA=": "2307692000000", - "Zz1aeRV7H7fw2c1MjRQvteh2D9a2USAUz1VzDxfX2FU=": "385560000000", - "ZzXm4aLAdvk5bY8WK6f_g-g789-phpVjQr_d3wRMwvk=": "3619297000000", - "ZzrpiRZicrdp5i7BDmvAu9ete_Xper1-yUWz7HntEH8=": "655989000000", - "_-WfDPjqRfz7keo62TINfPDHVaWbjSUBBw_uNhoMpVw=": "384615000000", - "_-j4hakzTB137yQjhnfcMsVI--kkzzAt9i6TxSDwJTM=": "409116000000", - "_-zD4z9ldJelc6Hq3BKD0pW5ImIMUFTL_apkrdR36Vo=": "832476000000", - "_0bziZJZOLf1UAVyereUk_tcW-YX-PLhLOn3ro9hCbI=": "576923000000", - "_0ozMzYd1_ToDCFSaW8GihEG-ORLFUUVp4IPt-6wI74=": "500245000000", - "_0ro1Po3gdGLCyE_sTMXPbGY_KHy6d_HhevZUHvwXSg=": "385528000000", - "_14tMf2p2ZWhHI-ECrNJCM5QXOHrdQsX28kL2b2tzzQ=": "4000320000000", - "_1Nf14OqO-AywUySg6W-yRiPB9usBEsJTpKsjjo3YiM=": "3346153000000", - "_1akFj3OKfylN83anKweZPWySOUN7S1VCONAZiSRQy8=": "509585000000", - "_1bZpUd7zzdlPRy8o4mntYnFQMDKMchnHPhUYsAHN44=": "768499000000", - "_1jcPsXS2v_ZL-fD4YGG39fn0WAiinaH1OPBhXkQtT0=": "3765029000000", - "_1rMCsZtdxYJYmrnDLFQBLFz-7oM_Gh9e6OTLkD6qEI=": "384615000000", - "_1uf_FKG-bHPn0eqaH__BukyL1K9G4I7rqh56A8WlTM=": "453442000000", - "_29QCx0TMOxTknJnGA0ASGA_SoCCcOnXMitLOmsTujs=": "1346514000000", - "_2DLfBsi7CjtpNlXiPdBxyeRjaRrMw68071MuWFNCJE=": "1502755000000", - "_30Jo_KSi1lB3crjS2KTBV2NkCb74PhFMUVYvXFe5QE=": "4166666000000", - "_3H6Fh2QXyw6iRMYWebX7gbxnFduek_3JiAq-LoS9QU=": "3537639000000", - "_3V8znMHU_fOEf5XhYj3g7H51Wljoj8f_-FRA3XIW0I=": "1470728000000", - "_46_Py4W3HgGZWmg7a12kDr-7f8InYp6OjQnGvcwB5A=": "1153846000000", - "_4C9c-40LGYLYaR_E_stpCYLAxWRskJJ3f_RdXjU2Jw=": "753677000000", - "_4HMIXcpW7sZNEkZ69oHYMErGYWlsFHjXXhS3CkFjwQ=": "1538461000000", - "_4IAjfTdEHoRsCEUZQHDugLlFZmqoRPpHV2Tw16lexE=": "4557554000000", - "_4SSRg3bKI_yo4IeaPnW2m0G4kZyccZ5zk9m5Nh0Kss=": "418563000000", - "_4WEvESV4beX8_3d4OPD4q_dqXlqTdj04E5PUH6ruOQ=": "7637772000000", - "_4kRGfQHxYYq_ittf2BB5nEKHSKyR-aF93a3CYl_RO4=": "384615000000", - "_4yYvQn2CCthb9rvxydIb-uRePVM6DT9d1vDPS7EWYc=": "405176000000", - "_5SUKlmAdEn4xREtf8yMBm94hte6uQnPru8H2rNceT0=": "3855066000000", - "_5hUqT0FHDjTrRjBeirTa0orgbOChp129b9Hz4JXZCI=": "378072000000", - "_6B5fVoHDO7nxnqjHiNhdWl6z8mWontiWbDqpPfmlE0=": "416666000000", - "_6FwBELgShGoj4mRbtHQnUMfY3e9h3faCFfvg9l1wu0=": "409514000000", - "_774QtgKF97u41dHdh4j0Y-bP9a3lYbsGxP-dgkyrUA=": "1156522000000", - "_7IkNH94ka3hZrZGtb-QwoJ1nPh6H27SbftyG7kinaU=": "384853000000", - "_7UGLlX-wB6DSCO-pAwDna-qKlv0i9t3D4dkIYFl3A0=": "974536000000", - "_7fftVJZX-RllflsK9T7u5CkoCZ2Barqwo4eJi3Q0Hs=": "711953000000", - "_7lfxCsnleihao9uGP2LsU4mSdtGo85O-nwLALgcYdI=": "424045000000", - "_89qboVJPXIgR4C6ujTuJfJ_4_khzH5swhj1rs-UMqY=": "3551044000000", - "_8lWnZoEHYKDrJGtkxRBw0wqITZZkE-NsE7EQpCyIIA=": "780370000000", - "_8odS-Hega0uaJrSOr6IeRNccC68Khad31aBFg3bWxM=": "1249999000000", - "_9RQicprlWnIHbH2HzZXE9N6BeZmjpskSQwRoUZDMZ4=": "4176337000000", - "_9eZaUBn00to7Vyh2L0nppU7Jk_fZYMabfcOgtl3Y88=": "384615000000", - "_9r8scnUACHbddaBahmdyBeaGENGammZGP4X9bVkj_4=": "2272727000000", - "_ADnofHfdho0z75rSVtuxNZjMjCaFOnaSPR7NZd1wiI=": "572959000000", - "_AYiW1gA15U_CY5ZIsSa4J_pgPFAFcyrbV6CXV-JR58=": "454545000000", - "_BIS9VY_4LyzrVviWU7ATjGkagC1sY4vzeFje8Ccsyw=": "3841471000000", - "_BXX7vkRRpMILVF0PG0TvmG4m9c9crs_pxIve50ZOec=": "460910000000", - "_BnBYWKoj0Ay67hthMuEE4mbMyL2lIOzdIi0GtyFYUY=": "631981000000", - "_BwypGIhGKkOjbVWd5FkM2jeKjWW9QAZaiYoh7ALui4=": "381226000000", - "_C2Y1cZ3tbjNtnSYIxoU1wi5RiwqBAuJxXJgJvod3JU=": "385509000000", - "_C3kr51POnFNxpNBFJbpIQ72Nvs8n73EiTFsEBPnbNM=": "455091000000", - "_CMoJG54qAHc-hS7I7GCfw9VUvkgl9VDDmjcwN1mpFA=": "412014000000", - "_CcUn8G7gkjMrlr1Hc3RY-tOrCQlsSaHvHx2tVA-NZ4=": "3889408000000", - "_CeBMQat2F1D1PzfRESJVKmDTiJ_NAE2tQXOXr3S7HM=": "627726000000", - "_CiaSFXfcEeHUw1EwGUeby3Z7b5qn_y7j-8DBOhje1M=": "1365475000000", - "_D9l59nOq6d5byY69MjpbQVuzRY-QwyUeYJ5rwoJk2w=": "384037000000", - "_DDdobve0nM327Pq87Ue6W_dLSUlrPCKySUU7Yn0ugE=": "389081000000", - "_DH1B402x921JB5hFmQWu5QgEyw-C7Jo0usJbjYb2mU=": "379072000000", - "_DIphE7a5ZA62ngAg61Q7L1Lq3pc8eIQErppGZ_3HJ4=": "447389000000", - "_DW5vI9t7zN6gyFisVfiHROM1wqT6EYYGoNw0IRZ6-M=": "962891000000", - "_Ds0BLHmI2EBSSKjY-kjRGIz-TQQkvzMspQe-P8WvLk=": "416710000000", - "_Dwme_cvSzJI33NuFoaOtskj07nAtEInzaTC6Feu34c=": "675760000000", - "_Ebu9xObZC-Lpxxo13eW44axBlfdE1XDEzoMLvOGP9g=": "2303657000000", - "_FQgynxnLBxNKfyv2fzS49jNlSPKK5aSqES_AK6TT8E=": "909512000000", - "_FpzfFsUfo_P3FyVGF3ekLs5u2Bng6kGfILCHFTGxA8=": "378065000000", - "_FuJwd5wGucN3HDvnPzaShLamf2kiw1uuFmTfTeKCd0=": "492307000000", - "_GK53ACQp95Ly0dOscAyYYnn4DhtUJUtm_KAZ9eD3DM=": "385510000000", - "_GapdJMXHA1tlRGRhJ1n07KhAr4uSPAA1fqULWVT18E=": "1249228000000", - "_H20BHHTv6bbRAlcDNJBAI0kntpMAyz3u48JDT-_Pjc=": "1153846000000", - "_H3Xn3_4OkqqGmEHKp23a2ru5bl5vnJCIIIs3cgDw0E=": "390689000000", - "_H9bt8aplMzHgJbtIMB9eppT4fNlKP1_XjwICXMc_oI=": "449029000000", - "_HbhGiFT6kyQjJ_CXGjkwsmTvTvRVR1cCV2GCV9i6Ow=": "385877000000", - "_Hw1fp7aUjuQwD3w6xFnepPQzWeRFSmbKmGIhbV-w9s=": "385509000000", - "_I5kGdFGyFGSVaD4_2hotkk5MM02HmxNpM0tF-jHCHI=": "810436000000", - "_IH6f60r8udn0eIHzJ5qAPc8jX10CAXXAs39UliqZVQ=": "393313000000", - "_JFD1qdDP2tqn1VX_QkytK9-td-VvQWourOQrVjjblo=": "1927537000000", - "_J_A8dndW_ZTR8cYdagRUq1BwiLMRKVTuqZogyw4src=": "386715000000", - "_JtRHmDTJYvVAKCUYcFSQbd2Ma71n7kzCaOlgpeaIqI=": "1538433000000", - "_K2Hb-5t0s0k63RgbHtjINA02A8NK4e3HdRBE4Coau0=": "414392000000", - "_KRYu7x-q8_-WT7BmKGzgPH9Q6j0jqLQ12EthpBDu5g=": "1446372000000", - "_M9SPCGQL8_6oPFARwZ6e_silK2el_YoHIR4nV7GEJA=": "906721000000", - "_Mf07gvabAhHKFA11Oct_q2SISAEWzEg8z4Zm_hTYrQ=": "769230000000", - "_Nf2_s5dQHRwXAgoKEZPhp8FnFnOnxDl9YA9FOYYcDo=": "1153814000000", - "_OSnvXxisMgElCS_jMvNf5a8xgmkG3mNR-IPeId5W6o=": "1238591000000", - "_Opb48bGCUvZhkebOQ1uC7ywRyF-C3EYoe7As5O7Oc8=": "413877000000", - "_PCO9FG2bEXN2fTgINljeyhMREadjK1fJLSF_CRP93s=": "379260000000", - "_PFcZp2P7h90fX_ZypCNxHVwJU20Z3eqMjK6bWE-oWg=": "4122992000000", - "_PKBzqcblsJTw_q7Vt208h_-uSatkpu3M32T2aPI91Q=": "377579000000", - "_PNhs8JQl35cCmiKilXUpk2-y1U-1RvbjqPuyRLtfsM=": "1412228000000", - "_PRwYatfMhutM-yrbzOfZJLcjSfcmodP5HlOzPMkZz0=": "411085000000", - "_PloH7v9PbGF5XRK4PnuJ3B4P-Gg0oL7oDkUNC-Fxwo=": "455367000000", - "_Pm3Uoa5R92fXvjdx9siY1ckxqjdKgY_hjfSK8D1eqQ=": "384615000000", - "_QTj6d4R_5Gn-6tIkg0sY0jtYCOt7pbKYvd-KOD6H64=": "470553000000", - "_QpO9pbqfDCFuAHTjgtD9Fg_-dWCoI8OJ8SiUdU6AVg=": "488979000000", - "_QtBe7KOIV5k9E1adkUWjelwLtfVaaGLUGQKKtAp1fs=": "416666000000", - "_RGTpIICrLRzBm39ujFZhmbdPh_Za_FJssR0pS6vgag=": "411085000000", - "_RGomn3FXvFXIE5hb-w8HMlvuK0QJKnO-1xTw55mSog=": "384615000000", - "_RIhKUig8ek4XsFInkse8_pAYzqP0O2yhj-554lZQoA=": "2637613000000", - "_RNwk6pfUVXxxMMBT88UoCY_mo94J-S9GYyqsFkHqCM=": "413111000000", - "_RRI4fF9d1Qrmyipc4_-AXGz-GrTZ3HkkjWIDgC_7Bg=": "625028000000", - "_Rh5cBtPz0qlLcIiwx_yDKTBWyQfQWiTfvqz-zj0QVA=": "368100000000", - "_SLEZoVDdwA18neheJbarxWNL4LKOyJqahX-vXqI9UQ=": "460259000000", - "_SMJJLzqupw-WVHt_nwspjS7cmGsOjL9aoL4RQARTc8=": "9727081000000", - "_SMmVyrkzVK_bKw-TppgUC9PpRTvNvC7NhiNrGvhTBE=": "384615000000", - "_SUEmt_OeWDHv3JW5-JBxFK1JE3Ku5kT_9rmQTSgbDc=": "445391000000", - "_SWuaFuOmQFCI1EQDYGz9qxw1AUcXqt3iaNFhr13HWU=": "382394000000", - "_T912hEJxmsy-d3QWygE72VMsJMOOoRtNn6QC8KdBGs=": "1186326000000", - "_TCfnWRuKM46ENcsj7kwL2VJu3NeEAquw8diV-xC5q8=": "464025000000", - "_Tb8m-YJGR70PlF1qAjsKw_IZpVfkOWbH3P5S63nlEc=": "1923076000000", - "_TrfOTBdB5wLX8JVBfnU_DVWUTiHKnyUvtlIkStmMzM=": "407469000000", - "_Tv3iUevLKBX0M8IF3p030NA7Qn5KcxbJjayP5HKud0=": "1221386000000", - "_TwEDW4TRE734bkLQ10mUhZ1ovMS-ItLKxtDQFKzOAs=": "384615000000", - "_UHoHyfC8qEYX7cNN6j2jduNXhlAcFbdGQKuI98VbrY=": "583333000000", - "_UQiZ5LZ4TbpvEA5b5ksT4Gz0PywRnn8c-e3Lx0usxE=": "3846153000000", - "_UStkXqcIReg-Em5WNmmFLx4AngI69lGcNJHYYE9gN8=": "405552000000", - "_UeogrpwL5mTAVjhghq2MSL868TGrDfXvOnmeEkODoU=": "4044705000000", - "_UnRUf5JSBAqsBheGqttHWn3J6ovvh0QjdzKxq7gVQo=": "417125000000", - "_VMFSFPXntMYCy46wv-mnJKKjSMvGtURed-mP5UAEFM=": "586733000000", - "_VTP6-CyUIXVFNU0nCQACxZNoqIKkiP-hF-gvuIK-3c=": "769230000000", - "_VinpyynvR0w3z7TMV3_qgikpuJvvRxL1R1FQrf2koU=": "2107971000000", - "_WcODzm3akjOpB7is__64Dv_v9q2n8r4xHDUMc3HNNM=": "386582000000", - "_Ww8BHgi0wHSlX6g3dKCF7g5g0MLkckLuXxIaM0agxc=": "7692307000000", - "_X_S1a4Skm7L2VdJLQdDbetD50u65dQp77W0ofDAi6c=": "875430000000", - "_XdKZPg6m4czqGL-VHKrqGsF1GEMWrrAZz7eZLX6Vo0=": "768082000000", - "_XpVlSWWsw1glp1wCvV7xtmMSporTblRoB4Hmp8B18o=": "379260000000", - "_Y6EQjulNF5oUy-J9zArC5LtKW2vvYgAmaiQaEF74FU=": "4244886000000", - "_Y6yIm4awBROMsVFVLwUihGSb5-ZpsOZUB2NwIwfJXU=": "385189000000", - "_YKLFmK_s8hkoXUX2U_yajFBzujm07dC-NZfGHxqY_A=": "416627000000", - "_Yl-dTuTe7NUTbTnEBHuY4NrGzy2Fq4Epob05S7qsAc=": "6525968000000", - "_ZOceiUQtesGuMktHwd7_G9xSfzSr7ZctfjD_AsC9lg=": "1186493000000", - "_ZWNaQBhjkV06Z3-8ZmaivQnZcj6MhpSX8kJiZbunx0=": "417636000000", - "_ZWxwRUb5wERAm9dDzIje7UybzzrVlVMFbATEhooPYY=": "463216000000", - "__-RaaV53ar_uD1pD9flug7CL7Q5wBDWj4eyfS0QPKU=": "385509000000", - "__Kuedlwv4KqKGS5dAsmPCjBbjwyb4GG1E_BUabrV2Y=": "1923076000000", - "_a5uriaw9fNiChZlpA48QGmdPNscdTpON5up-Ty6_Io=": "405301000000", - "_aJByCJbtsRHWygxEiev9ocoh9hEEwObV4BnznPQ6d0=": "384742000000", - "_aS4tSGomgYp1CGNFYfF-Kmbqwz6uPRTtvoy1c9x0iM=": "423370000000", - "_asoHzSrE04ovwup2zJY43Dtfd6jugtOrszYX2n7bRI=": "2027186000000", - "_b1ZqxCGxutD7lGp820fQo9OWIDAXzecNg0-sCiJ0n4=": "1923076000000", - "_b9Bg85dOho2PJyMiBvgpMITIqkEmJkFACOUR62Zl3I=": "615663000000", - "_bNvwH_ELsvqAKOK1h1LsswBIGlPGLWA5ZrzAH5c7no=": "376529000000", - "_bWXYpAit31eZIcSOIW4mOcE-fwVNncRRD1cHpH6OVM=": "473176000000", - "_bj5dYXJEWI_wWD7mpB5I2fuEYxLKt-ZlKkB8sd1U4Q=": "384615000000", - "_brgpZrtqjDwlZKp4BXjHubF5nehC2sdwVgi7UbhOPQ=": "384615000000", - "_cHMryw39wQAzVqfo2PsAilrooOLqzMB4L6TZLP0-q0=": "4555960000000", - "_cZEnbvB26qzIb9Qz58ad7vtTuylFJ-8KB0Ka65wB8A=": "577878000000", - "_chYkbV3UC5WT4n5A5IQhdR2tvArxWdMBfvIiVWUprM=": "1135742000000", - "_choaAf55QbDbFYu3ZC_1jHIzYA17qPBvZBbVRYiGQA=": "500748000000", - "_ci8oxsRV2F4pRP5sNIbOeajzdEdcb5JqZR4iRCFq5c=": "1708326000000", - "_cxeEvEuQXU3oQSYhUwjM4qK4N6iRCdPfwy8xDeDczk=": "2373505000000", - "_d0xGUPticpYI6OG9sBVQlQdDIzGOGj4D5vF6lNjDVo=": "386318000000", - "_dbWnqaxzGjZV173sEwqnvYpMofvwnncCBJGLZnAd-Q=": "384615000000", - "_dkLAPzFbkhQwfhTl5G4W0brOddpc274RzmNNue31NE=": "576923000000", - "_dpZc_t80LaX29J53Lhet8D2k1fRCpeYcyItlXqZ5cQ=": "665212000000", - "_dv3sb_cxbWAtVMWl-o4L6gIZJWWhwM99K6UaFrtloE=": "488135000000", - "_eJIkmMvUhsoAbM4GCgAJWeLKLHhwTBJDiu7n-gm6dM=": "1927537000000", - "_eNG2HOLiSqt6_Ksw-Z_puHFZZPYK4UFONo8A_Wx7bE=": "1689607000000", - "_eSWwW16VPI6PlggHpAQHThXepWubHWM4R52wq5xnTE=": "458982000000", - "_eWVcVnEiEudKvKtdQaaD3Yjfneb6x0RJlg9OsMBmNM=": "457943000000", - "_fQ8F9bbDvkCWoVcGBKls6YZfZyT5AOh88-01M13Y9U=": "1156045000000", - "_fmE4hOkJvcdJbwZWDmx9qpTMJvobVxmE4HQq74QbfA=": "3846153000000", - "_fyd0pDFO5SwZhSUpiYL2AINcKAnw73JZmKdYStKW0s=": "378456000000", - "_g3WoC0_-pKCF37GK_zcTAC-Egrtdj3u7bPtU4nN8TU=": "495027000000", - "_gbgpL5F6DLFOgF3_CirXr5CFEjQV7ELzqA_nSQIhNs=": "1162240000000", - "_gc0SpvtURLx6xbupbu86NkxbX9CQi9sMKZvcycAtqQ=": "4992433000000", - "_gjoVXO8DHJXOPS-yA2AxQTLuTKN9o1uf5RSGKnrQow=": "454906000000", - "_hCJGGHYiZBXP8cfujU_DIxE8a_6BIAuQ0WOocCgZ-g=": "450384000000", - "_hHzYTL-CfDQwkVLDD43t0jjClNaQJc1KQQt-EXFQR0=": "384615000000", - "_hJF6Q68MaYJYYtwNlwBo8hmdGidhcJ1SVUqOT2Nq6I=": "453414000000", - "_iqmxz4FZ7o3D3Jcruxq3WrcMgk0WCiIsIjPU0m1cwY=": "384499000000", - "_j3FKZaGB2XZxamj6Fw4qkMOLGDebMbHJ772ZVaaEtM=": "469468000000", - "_jGlOtmX4mlgSIvqTFS8oFS4QPrKfaJCjpoP-IS1SB4=": "4036313000000", - "_jLf9IqTglGamy_uJhP3H46nB437vAq54GbuWSVA4Kg=": "4847358000000", - "_jb2IhQAtZlbAyAX4w13PZ2dSV3RZgwe1d2YOG4CFxc=": "371766000000", - "_kKOMRck7JeXz3cvcTSJDrRQOn0BzRzphVtaSArr4uY=": "462146000000", - "_kjpsHqjkWxYmp6_VTKQXfOTXNdBqxWkiOM2wzN_kl4=": "361016000000", - "_l1WsDvB-p8ASjeT0LV1LXsl34jVxgKReP9zFy7I7-o=": "577137000000", - "_m2vn2PD_s3kDCo92_moF6q5jCKBOJNynFEYFV_arBg=": "457167000000", - "_mDkdsF3sJtynqmR4i4XZpHlbBjhoBDXrHjpAyf4A40=": "396009000000", - "_maSUWNP33H7BeJV10x-JSOk6nIvn5D50x0xE2SP234=": "454545000000", - "_n1HAgLhyFV2quqXbETOrT5MwaVTEJY45wP_Z6vm7Yc=": "453764000000", - "_n_zvRofrswZubchiXRYbOqWk6KOAEFiNc9Srrj2v1c=": "7499999000000", - "_nw6UjzIUQxlviyaVq2-RjC5PMUFjSith84kZi7f-DY=": "403851000000", - "_oa0ruoZ4Q9ULDwhl977KIAy0-22Z-dYpCtYDPu3lwk=": "768677000000", - "_oggJlX3sS_WJNouAeDopwcnRMUhhV6bj7ZQNaiBCtY=": "2490036000000", - "_p3Y26RKW1tlz9ygdX7o8rOwVWxDhcpKxxz0tSA_Avc=": "846282000000", - "_pLhhgxUXMuUmfWU8NCudNtXKfFa6THrjpS0d8JBH1o=": "2498919000000", - "_pY38l9CabUUBkRW2zUXqkfrFAfIh2zmS2hrN82xnoE=": "384107000000", - "_pf5O41xhT2mplQWILVQkC585Jq-45vUZmO9oGHmTIs=": "1002486000000", - "_pl6t3AmtD_1cb31VkzNl40P_FEERTeEGqmdly-yuEk=": "388750000000", - "_pm6Xvemt3WTiTsoIGHquXYqA1pAb3MN6ylhAid3Sfg=": "417636000000", - "_q013uKG8aHh3IhvaR-GXwuz8mDfKxF632mld4PBDjk=": "385939000000", - "_q16aVUOCri3dWHIlPYFK5tRx2YPEv5Ap0O2YqXgGzs=": "385509000000", - "_q1YWfnjQmXu1XKcKL1gpi2i3_6dZbBt_iH8M_Is9yA=": "7710100000000", - "_q7RcVqLTznNFyPLl4t1n211OtJ_99_JcLpmZ6DsdPM=": "3358461000000", - "_q8kwQWK73tyiNjHDNHtVtFhpqxyrULPplXbbhYfkPo=": "432503000000", - "_qGC3EeE-QL-PnIAvp1V5Q3SEEOca4wR4fc9A-QKEk4=": "913841000000", - "_qN05raCFW5CRIbWEYyUXbM9DdQf_ML3VLrFoG2C4Pg=": "7710189000000", - "_qU_fSrEz0q8q38gkLSW35hx-UgKsrS5H9H4zvDyVF0=": "417633000000", - "_qUvCi7aVqL040lEhHT_ZIl9SAk_eLvtqin4mLbChiA=": "1153846000000", - "_r0WRk9klIvECtJ4YuGfsjHec5jMhcfXpkV1UuuuXRE=": "379554000000", - "_r3oZyy89ckoswk_71K7JdHcNEDaTTP8SqaAt2TNaDE=": "769128000000", - "_rxAr2P6N5LJ1mmOx1tTK_YuXIK0hnq7MAOFgUM6XjE=": "3102907000000", - "_s4ygMuUw8Bq3_SdcJNJAy8kWqLbi5lRsbB_LGUrtUQ=": "1999999000000", - "_sOa_iJQi0HDx9mTco1SxPaB9p17qdmsmxfijikm1MI=": "1666666000000", - "_sv19wjLq2ioDewqIQYNd6JREElHAP9iME9imkPVdEc=": "483530000000", - "_tCjRazoTtkDUWdg9M0IvTOoSDt71ZjRBumcds3OE8k=": "385507000000", - "_tNYetF_0Nr8ylpcyFuJs1v9hwhRq--GrKL1Er2uhGw=": "385509000000", - "_uOV6JvaJMu2q3CS5Fa51BqtJXJnVSobAFUgHYNCsfA=": "992250000000", - "_un02SpUFMaBUtYNjrDz380lblWJqdq1SwkLGmBwNc8=": "473001000000", - "_uthydUpbBjj6174MgbQr3UHmZW2UyZbaZaQq64zuW0=": "384615000000", - "_vPWl3pTjN-pSL5fYERgyFdOrynlFWgahS1eYoC-9KU=": "452525000000", - "_voHBvq-QAa2z1cqkrOHfzpRpxHqiXWfHMBRsbJs8fg=": "758689000000", - "_vsa_jiZjYgEHDhVIkSuOwMU5x_0fmbg_jkhgWA9Fms=": "412211000000", - "_vvfAFCnnEX-dPQW-XnuczBsIxJd4oeKLKGWSBWKas4=": "3175347000000", - "_wREz9NcuXMp6VewRyRcbZLgdbzsCXEFdnxnu9S3Xrs=": "387856000000", - "_wpEA2QZ0Y8cmbarRQa1577xj7jIoi0iz9R5ZOVPFu4=": "705402000000", - "_wzpR9E0Gl30ZJBryJGdCvBEQLmrnSxRLxRvE-rrKoI=": "1144901000000", - "_xIC3ZjQcJAQU_MmvozvSxMJJ8kyWutNK3VTggETdw0=": "1894410000000", - "_xLMwo29Cm6Jxhqf0GM3583m5v5SYHMANNZaWkuLD0w=": "7702727000000", - "_xcjXcEsJpCBbUabwcRZK3nB7Rxp7UAldddbplOErkQ=": "385507000000", - "_xliW-IucAk3YQRta-B58E58ID7tNQVUywYE-uUOBEs=": "1666312000000", - "_xqxWJo53KKNOg9kTrpj5Jp088-8KzFntyHuxE5qufY=": "464701000000", - "_xu05xWhlO4mUQ1nu0338VFWA-GVexPxk2mJPzlJbgA=": "5919994000000", - "_xuBuOXpnEhk5bD6SkgQKiETuXTq28cPhhJ1zr1-FT8=": "4213690000000", - "_xvw7YtmveVOy6vORArEntN-DL-vX1GzDLElQYbmVJ0=": "567919000000", - "_yMsZ7GcqR4HOR6PLQ7SPuhtRdPRMx3F9s9g-FeND0U=": "1927541000000", - "_yeEeV_1j2BGrDivi3IBMSbVzPF7GsaXhBY6s1sNdAk=": "769230000000", - "_ynjVfJ3Qbw4PZnMz8jeIuvyRedAHaCbYAkVZQt6g2k=": "2865012000000", - "_ypxyu7L_yJ_njTiLvuStVIN86St09cSa6z-u4Ahiq8=": "384615000000", - "_ywJocL2SmXywW3SihidkrhLEl46U0CNhTTGspqHa_Q=": "833333000000", - "_zTISlp_IxO0mhXEXXOdK79pr9stFSAADSe99z8w3Ks=": "2030639000000", - "_zVUQCEcK4r3z-bBL7Qn3Dv0Fwwm-8NZdNzMsGjjzzw=": "470734000000", - "_zXIJuXQUfkd3D2w1k5fx-rkPCIVeIpCc51T_WOjlYM=": "2459941000000", - "_zpx-OTJ9NivsWHgY3Gphu-9-nj2YabU4TTnrTD4YWA=": "3855061000000", - "a-ZhNMX3GEHw-_AaxCAzP-G8rSzq6lSwfc6TcoDP2JY=": "1224962000000", - "a-fZxyp8K4mE7Ul3wankwzgB7Gcc4vOqKp0QY-3KepA=": "384468000000", - "a00Zmm5QS-89VE-vQ2GENdCgbm_QJ4gtW5XdLVEJd4g=": "394923000000", - "a1tPA53U41YyuxILNSrEOQA0-1_fRliGhS3eNTj5Jqk=": "417630000000", - "a2-OPP9fUIGuVmwWcWFFKAnPNeb7Ry7dvJvUNAtiK1c=": "385510000000", - "a2OPnYNjB1iance6lmuZgZJrGYHIHVuSqV_U4bV3M-k=": "1145412000000", - "a2bOjYr8zTXIOhnMnHC8QDU2an_JT7fYj6X6NhzmE4w=": "384615000000", - "a2rOVYgR9791Ml94a1PYxjcokbK9sR4WWoNnoHyEbl4=": "926789000000", - "a33uyJ2Ugpqb8Tl-ZqPuQM74ulqr8MnAO-HdmqBoFEQ=": "1058856000000", - "a3T8BOztHwiIHtk0hF6k7YvZKjsL8feo37RbkH34Res=": "461437000000", - "a3X-S7gV-MmTl327klOSDGTD2nG0KgaSL0eBxLRX6PI=": "455600000000", - "a3bz-wTzplzriYy8L3qLa595XHTvmIbzheGeNwiDlDw=": "763735000000", - "a4OZqwNY1IzfWYHVYnxqT1FAGhxoBAX7KAVww0MEjBA=": "385507000000", - "a4OlCEMExpxzw8J4kW9Up3tT2DF2BnFYDpxWZJliRbM=": "416700000000", - "a4dIXSZ18v9GUVKbNTKCjxhJiOU6h49qZbcElgn_m3A=": "756620000000", - "a4onaamBE_QTDUIz6YRuFJo2JGVWEEZL_uB0Pmjb_MQ=": "416662000000", - "a4xCkbqsFuYJjnuh20qfXu_6uVK5OUjn2EFvWjMCqXs=": "461318000000", - "a5V4pf8O3n_TJaIINdTTIzsDA7CHm9VReGWkmC1prQU=": "4972182000000", - "a5e33MK0yelph2Ri8bTXXQog3tsLUQw_wufLQzRY2KM=": "452437000000", - "a5fNyhMb9LrDscViDFNonejwlR_i_ZSb0S-k1WaqjBs=": "423464000000", - "a5oj1KJTJ5UCAFpwsujeXI4u4sU5TxZkmg2XS2YOlVI=": "385510000000", - "a5uhM4ji461AhtCkZmnvPO8thDQx3S0X3-weDVq3RCM=": "911490000000", - "a6HX5npNFr8GlL0dfmH9ayIHTmsoEWGdwDcbXzt7I0I=": "416666000000", - "a6TcpKAjk9m0aF_Ka2Dm2vv5jG6Gp7zFuaRsprgbkSI=": "374928000000", - "a6fG3SBAXZaVVc96KcdesnqNjXQYPZIR2i0hvk7yrhE=": "911212000000", - "a6hrm06tHNUWSUFr5slantl0jdMNQmYRTqDIljkk0Ec=": "412455000000", - "a6i80loqMtZamErnpVaJd1hq_oIpyrxxvkyfsiEpNwU=": "384615000000", - "a7JUnmTkCO6oPcGXDUUEVzLezGQnl75X3uywfUNA31E=": "11861633000000", - "a7k7j3dJv29bzUTrk9PNAPbplrKbq2yjEMT9bmQ1Ks4=": "708333000000", - "a7y3QUv9RZo4JXTHaLLbfxPY5TJe49QZbN1IgBhUyj4=": "2692307000000", - "a834aPDzr_rFjXoLVGqqArD_NDxUmp-1E8dD2xnHQPM=": "832250000000", - "a8YHtt7BREnQbbZUBGTR-iIhNeFLIzRlrrL8ujdwu_U=": "447339000000", - "a8gwpp8akLxoN0oDNj4tOy1bt_0wnc9HfJYNnrwOqMM=": "1538461000000", - "a8nDNCQJzItV1XuEQwBIU5CAlbMatk6zeiAArDZI9DU=": "6153846000000", - "a8pr7FarmP-LNAsksxtRjmCPJDEuN0GJD6ylT3e4FFg=": "466696000000", - "a8sPaNFoh0fIIHJhxMe-HrAiySz5LJ5lUyBHCYgDC6c=": "1612263000000", - "a8wgZWC7ISxC6iWyPAzTvlaI65Nkwy74DEIR2XRvT_s=": "457745000000", - "a8xuf5b0JVL1iJfGh5Txk4ETDcNE7fXqoZSsbuqDxrs=": "385109000000", - "a8zurQfbO5Xsm7UhPCmx_xoH1BxBTQtNPj_nObcQgKA=": "1233257000000", - "a93nBUiYakQpqEwM9-piHyW0txWwQSeqUwCvFi7bvmg=": "446629000000", - "a95JR0ZUsYkhioYZUXxwg9hNhAqzN_NVkuutX9ElpQQ=": "384615000000", - "a9ZC6oxCoS4UoHpMo21TPMjo9WPRc8A4mUuhW159Hb0=": "850858000000", - "a9bSkBLR3YyLvE7H0uY9K94Hh9PZ2WnRw0fJWkRjTsw=": "833333000000", - "a9eOcgNIBhmuw5axiDn07Kf5GWiP3RRI2kM6KAnbhlE=": "1267685000000", - "aAFOypdj8hscRkpuZEnjKDe9Q4SE2SZ0Lp5ivhwfBHA=": "399800000000", - "aAuw-Eo-YT3jUzqUSb4KQYA94l2GIzBdDuljPxxkris=": "458538000000", - "aCjLxNvC901Gf9-e4qcM_QfAFa7DOAOm3LP4gODVe34=": "384615000000", - "aClpWtu9BAvtHgZ89ZSIe-qR3TVuDic00Hqec8cnpv0=": "8140575000000", - "aDLO9eZtMrR2fFZVa75rQT1tdMzSzC7Km_Dp8suMAMM=": "5725818000000", - "aDfjW3lfADKzLtsPeiS85ZTB4t0uTS5iORxUp02BHUU=": "384615000000", - "aDvnmTGouXzFakXbYW46Zr3rHNM9BgMI5qkZsqJUrns=": "1923076000000", - "aFY363NiexBTVeA8ObLBDgsZ5M89bkipHDm_N9ayAFA=": "392983000000", - "aGDHtKV4EF70BVv3imOg5uyKGxUk3Iu4-c3X-oX8fCU=": "384144000000", - "aGECCGeUjVBMNUUYV_u4k70xiMhLmZh2osmSYUUUBwA=": "384610000000", - "aGUb4Lu2r3PgRq_X_9d4xsRUdQrno46sCoWcwnZkeDI=": "1923076000000", - "aIDOqFb4gaRFnFgqe-SA48BMtN09xwIDQTgxippKXi4=": "1893165000000", - "aIH8bHFJZ4JgxmVDejyEvNlF5TjM0xkE6RSn8ZfHCsc=": "2471079000000", - "aII-iJKugOoXwvCUNmHJXrixU1R_wj3sMz35h4yVgUk=": "8405484000000", - "aJ3fCySBuJsR6nu6u0IEc7UNFXYSnlJ00xi6iSrl_L4=": "683851000000", - "aJZF4Jh27MoGoCw7sD3rSHd515MmuaRfZOouPQ7H9Iw=": "4961614000000", - "aK2bgwINVoMtW0rY_sdGvPF4jVWTExstKu-s7T18T44=": "1182478000000", - "aKYJ6S6d7Dju5Z8ezo4EwDh7dzbRdjgiCgJ76_LJj7w=": "20734424000000", - "aLq5Jn1SCGpuhoWzUj81nUqi7RiH_GJq7sO-SgIDjJU=": "431414000000", - "aMLw4vS_Dj2rz7ucFsoN8kBg4CnNI_0NbL6RiYa9Lc0=": "468818000000", - "aMzxIdDgWOdQHF42CIhB0BQzfnF7hTNWgoHu5UaXM-k=": "1153846000000", - "aN4QWTT2ORUITwMdF2WewVQSiOFv_gsck0jkWggmV8I=": "482645000000", - "aNDbH0ayeSTt8LfIjBjOwr8dsDvnRS0oFEQLwVqb__U=": "3041663000000", - "aNQjDZJzE33KZNEt-jOV_ruizQy4MS5QpPlHSxEGvd8=": "482269000000", - "aNilfiQmSvprBKeoqlCOMDdw15fLPlonuaNH4mmV4Hk=": "384615000000", - "aNjHZ8mY__jAvdvbW29DDjjqj_Jdkx5IwawtvzPgaBc=": "462687000000", - "aNoEUcAa5cwYs2vDq764ExkrrlDUbhQOe05ILyAjojc=": "1406400000000", - "aOPjqv6aSZlt6qQKUT29JRBFlTznKYHJgLKwApjUczA=": "1927530000000", - "aP-CL2XrJ0LnqvD9P7E8ZQ5Ib8dZVCIRfJwpGG-7ZR8=": "406843000000", - "aPDu9wHmLdKVZEisOvhoCMeOohs1kjuFhIMlYOfkZS0=": "5769230000000", - "aPryZwLrnMSXTtBHWIVW7HQ-3v81IH4wvZ-YRIaGUzU=": "452425000000", - "aQFH0B9fKrKalBu64Fs7ykIKyPuVnBXVG8U3b0nM6lU=": "4599140000000", - "aQm-dS_j3PNQS8SvZBYZyvsdBPDApdpe8yxh2sifF08=": "451562000000", - "aQq6lD3ywSdKi7qLo0MwGR6qs1u6f0md0K9bUobXaBA=": "375634000000", - "aQtC_Uy6meuCiN0JSUEsyZ1njEjQPv7K9vAAzGTCRCo=": "454984000000", - "aRt9bbOpMmRKGoKaqT1XBdrBis11y2vkDisdR9-09Co=": "397291000000", - "aTEP6dL__lfgUeLNZW173e-6Subi-n3Tiat0b7-r6oM=": "1840418000000", - "aTMRwpiWNkd0vTklHixL-9uTVc7uufsBpt9K6F9_Bwo=": "691604000000", - "aTTnYUy-cVyQkx2FyT0Q_F1PmcIsBeWgi45rtfaS3Vk=": "576923000000", - "aTzHzKayMKP_2J-nWeJe3XFZwwz4UJUr18Y943mEAxE=": "383684000000", - "aU7D2P_GHtj2r_hxEOKDzFL-m6UC3gjEHrBce-AcAwg=": "391429000000", - "aUEp86u4mPIhtiFJB5bhdBFbT_kn8gv19Gf8LyeT4S4=": "384735000000", - "aUToS8k7Sc8Q-sj-Ve1FUZGlPoy-UvZ1weyX_wWExtc=": "2094619000000", - "aUduS_8iQHoWFjZONRi7kFHI16Ur41LjL91yy3ASDD4=": "384615000000", - "aVFeN66fy6xVsPzI-8pldnv9TA6TmL8rhqpD842C5gM=": "449794000000", - "aVXZyxiwCTLHWqI5qwuslKogzpu8E-Kc_bjLUpizlpA=": "455332000000", - "aVd36xWjDRF427qTHi4xHMZnISyAQGC_ZV6-4g65o-c=": "388750000000", - "aVqZ4n6fsulO7Ss4bmJrRs4jQ3EQkm7Aaaqs8Weacw0=": "42499875000000", - "aWOhKYLrsN1V09FhxLpGJxeS4LJ1iyu8Ak5YaYDHHVA=": "470586000000", - "aWnZ-coeek2UmmN-1cWDZPR1Ed5JCwaJRDSfCiW-7jI=": "917721000000", - "aWsvMn_hw7ZQn0zynE-ro_Bz1KgJ2wBTUFkJuE5KvFk=": "455823000000", - "aX8NdPz3c0iwi6knkKuZEEulDL4-hMFF82C8LGLBtk8=": "464889000000", - "aX9NGrJEMZsohnn3vOXAI0xvc0ugn_njydU3CTktqNw=": "5590909000000", - "aXDvgcZqGrkFMhR4pXMoFVyR7okwTh16UkuSzc9cnJ8=": "4544046000000", - "aXkSInGIWH9MBcGI_vcET8awfCCyE9gjzUZO8z5f5yo=": "1538180000000", - "aXuDcfZ5mqLx1MzwyU_5_BoHCezljO6Ui0zwvc1U_F4=": "1843840000000", - "aYA0lZVYkI4liu8ZVcJ0NMo-MBHUgaVWMKaBv8JVpKM=": "384615000000", - "aYhRHahCpGoRiqIVAC2d-JgMEbi-iLmx50vVv9AGE1A=": "460884000000", - "aZ0UgYWO0F72R2L0eCnHltVuGs89KCtvaX_yD-as5cc=": "417633000000", - "aZzvbSWz99DxgtVD255EDLkhz1rcau04RnQFKuCb3cw=": "903577000000", - "a_4jn-2Oqh-baxALuHRRAUKir-Bv1wmBTvQF_VrnsYQ=": "384615000000", - "a_EtgOTJ5VjZi2xMkdY_aFfXdNb6ZG9bYVQVONMPYLc=": "384615000000", - "a_jtAMxfMfuquKn_7iuuVSXauR-01TutefIYAvJpDIE=": "2690478000000", - "aaDiTEQXhZRRkmn7UE_9BEvCFNI5aaiWuynOZImR-ow=": "1713789000000", - "aa_m8eSUU-aa47QgoNE79HlNI3sPFmYAna4ymCDX5d4=": "20833333000000", - "ab8J3POqDRRY5bgMcy9XLUwZlcs846tmbViRht2peuk=": "768612000000", - "abKoyoV3ryCvY8NMO4X9LyaWBL2oSo4_45bmKRa02BM=": "642698000000", - "abnyIpdjQdp8thkDQHrbFHtVS7fhEF2kmyz6UDGXYYU=": "416673000000", - "acCd4cBlUaWbYo4jV-drLC6k6YNYucHfhb5vW57f_k0=": "447145000000", - "acTBH3ZAoF4merlZeoEIvVJJewrbAC21W4flbNJsZgw=": "363041000000", - "acdDAVYS55_Dr6-I_WnJIGeYgtQU4b9pImvc62NorJQ=": "768696000000", - "acf611Gtde5MqKQU-65vYE9hCX9_II5NS5kgWAbtOS8=": "769230000000", - "acsmjcJHh4-p4sfex_jU_Wr8ZLcFRJhhQ7LLBaM8CxE=": "1620921000000", - "acuDKeqFFNbsEp6Vx1NYBvmSSKTbdMue4o3abnGHDSk=": "2994020000000", - "adTGFzOL6V4w-pCcwDnfma575LppHxQekxurp2ifRE0=": "501408000000", - "adXqi4RWkWiQnBNaLHEte3WcZ_-HDyiAEGNZtlD13sw=": "582168000000", - "addnAsl2RvVRVvR3Hjs3Hm4aHexCT4jKiZVrD9d8_PA=": "3990137000000", - "ade7wmf5-SV0dn7jagq-UuEWvn5tfCdOFy53HQ1UmR0=": "455644000000", - "adrYiLOSSVY-BRQUazw5QibLxccw43nmQCVI9znOMjY=": "3855287000000", - "aeDPnDFW1zXf_ZmJq_fKbtltvXGEMdovhV5-sJMfhSc=": "384106000000", - "aeoMqI1Tt9a1C_jnTfJA1rbHbGj0Cxd89S9BanGt2S4=": "1947297000000", - "afEwg6agPwellAeL8YMs5bLvZccWOxNEqApjwOJ73is=": "385606000000", - "afJohWdQ3tksIkY-AEm5PD-Hp8WEotN-I7ygqvqVVhM=": "833333000000", - "afVyMcAZ4x2mLQvXtC2Tv5abDT3NBg-D14Q75pX4FFI=": "919217000000", - "afnMJ1cskqiooa8c0pq3_Pu6c8hYp2w4wTNjB_mVf0Q=": "904565000000", - "ag0vFtneW5W-G2wmiFVvBFag_8I-zGvU5faIPRAtxH0=": "1539786000000", - "ag2dHQEuQBlyyuzEGZajMyAe_-7ShNJz5eb-FUFXPII=": "384615000000", - "agEhrvF4f8p-xbBHJmwmwURmBFwyf-x5exf8-bkIt9o=": "1586521000000", - "agRpkdA2ECJBlPqwcKnKancs6351shoZnhySY7oWQNc=": "552637000000", - "agWekXQFv9k44JsH_BU9UJ971C4T5q-FXwGE9r42OBY=": "379344000000", - "agg5Ygr6gszcsAqgO8nLY-ZZNm_AeqClMeaQ9rSR7FU=": "377429000000", - "ahhv3gEXr3UfnOTLCy3yYXlaJ3TfSr9GnCrJNV0x4Us=": "411085000000", - "ahm67ah2GW3kwuB6dvufHR5ut1OLXyjQTd7c8LdSEJA=": "878255000000", - "ai-L4p-w5UN3QlDqaYink5iAmA3x77rf-30D80QkHL4=": "379260000000", - "ai09Sz_XjsvyMtBSxJc73IPE7wOq83wFlFmwaxjO-e4=": "490314000000", - "aiLLCIttsunp3ruDVEfe91iU5ZuoMl7f_a8zR3NIyLg=": "463031000000", - "aip4jgGilQK_4VNa0liovvvI5V0luQMltsz9D69ZNPM=": "445420000000", - "aiqvISSfne5jMTV_-BLLV-1ARC9Z38GJl16tMfwY1bM=": "499999000000", - "ajDHElyYmHUf_tloCAQOGFqROkzj9EEtdeKqI6iLDDo=": "983716000000", - "ajMYSV8W1JO48ZXkV900qhPqyyRJzYtxtziHHuySUYc=": "762463000000", - "ajQ39y87m_tzIV9LkZXZMhizuV2jtwRr0DvhGCY7nEE=": "396485000000", - "ajY3WfUtlswbQrhjUQc9PYxWCHs0R2ODHki3N0zcOs0=": "1864908000000", - "ajqIs9vyI9aYorqGma0xTS0ktbhexgA39VKP6AiX6Bw=": "462687000000", - "ak1DJDWydCmgkhiY01iJNBTgBIB0TaZGTqU7ebA-hrs=": "455600000000", - "akf898hSl43P0W7mptoF24k-Oy_1lQWwPpzWzSrSq-8=": "1134962000000", - "akv0UXv6SZ_ZkRcUTapeqGxQ9Ea9lfwO8JoLlMT5weg=": "1538461000000", - "alQUZ4vzcynJLqU-QRiTcbxto3T--fAIuYu_cJDSQPA=": "445868000000", - "alh_hOph7xF4Ff5Ta9avqREMswsxneWg_bboMMg1RxQ=": "377583000000", - "aloVJUHsNKrgeem9-ijZEWbXNZP2mo5fj9-5BWk25wo=": "385505000000", - "amLY5udveMQggLYh_jSjjd2p66qhHIHDxNDJLDUBg6M=": "384470000000", - "amsBbISFcuN0g2_slHmIWRymjZoJi_XwX7P5wb1ZFgA=": "384615000000", - "an6-sfRjmOVMQNVihhJuGVVPZylgoMFG58ltCLE5D3U=": "462146000000", - "anGMNLvv4WST7o5dU6_sTFWPTiJmHuf9KqPviqDyJ5c=": "2003050000000", - "anePWsfawBpO4YQGWeNx9T_l-LwnxrqXr5ukOEpZ564=": "632056000000", - "anubiZjI3BGlXn1rQV9ebqaZcGcQPUJv_LsjCqVkf3E=": "2351989000000", - "ao0zLbazQBPnFRVL-ZtKgBaA53ZjQ5YDJKJypwv3Zc4=": "1582565000000", - "aoBR5j27SGBCcu-q8sW-qDYVbVL2Fs-hRIyRIK7y_Co=": "1582183000000", - "aoL1b06cLpzVl4Cnb058YKevWididSWMovdQboabidk=": "750005000000", - "aoULo3RD_CHOr08NK0BY_z9jvHc5gEnUus33sbXouA0=": "451625000000", - "aofY5FhXBCKZKKd7VyDdoXUD_cghCaWa0hUU7fbs-kw=": "4156299000000", - "apEKIqQBH7b2aR2CfeYnVb4-9LSu1ODTry1bwZmN5I8=": "905885000000", - "aq78BMMOVhxc1cpfpf5v2uCmcaTgnmBuw_A3pnj7GUU=": "501612000000", - "aqTYRaayrsAHJfcCmCoknHmPIl65M3_L8U5wgm3RVWA=": "404018000000", - "aqaBjlgQYQeFg0AxW37A5dZrg0nRDldx456asPUaFoc=": "1965519000000", - "aqwDx_40wPPzz_Y7SL1gDDwZk0KBj_jDNWsMkNWJtfA=": "469821000000", - "aqwz1Ge4JTflUIiHje80NdI1qQ7QEI3Ld-R-gakNYxU=": "448467000000", - "ar-coH51DuQt650wJ1wGLdqc5Ghh_v7oCWVcYYCQv94=": "2309098000000", - "ar8NkqzV4YwR5ke5Qj8E5kiWuhjmHcSIPPts3065Tb0=": "461181000000", - "arSpKYQwwx5_RSafYHxWg3F2JJTQn2gbFf1XZc_y09Q=": "384615000000", - "areFMEcsvbuPJPtaLc-mVHkcI3YClr-8H2e8p0ESdn8=": "386015000000", - "as2qjrgY5XldaEccz2Y1GsG61Z9sl4FwE5T45yoQ-A0=": "865384000000", - "as8iZX3nYq9zWUl5OTiAUc2ZLCriW6TYKmOydHevxB8=": "924573000000", - "asHPzjlzod6JifwywBv4OeTDBwaRLp9ynk6UXtVOeXI=": "381436000000", - "asMKiqBEhoHHYRfou-d68mEaPa_bJg5oBkpA7oCfFjc=": "466579000000", - "ashlftqk9ssmCBApZ7FKo43iPVc1KVWKhY61ti3EGL8=": "1135633000000", - "ast1TVup7r-jZcM101LU7fnxAE1cczasEIUmcUX0u-Q=": "499999000000", - "at5npiVPO8kgrmPqbl8GJzK6BJ2RyWPtjA4v5NcnkK0=": "2000659000000", - "atIdEEei6UnjRgJS-wx4KEIyGbsnFO1FeJGauKwqbUE=": "454727000000", - "au-wVOzdWNqLeIU-kd3sP2JBq-JMhm6lpmN5N-bprGE=": "3818371000000", - "av1BCXATNONCK-gmZhQKmQRa9z6lgwCgxfrmETQ3_BA=": "364846000000", - "avAol-WT7OZ5X0IvbxnTULjp8vqTJpmQjraYhRzlgVA=": "1156518000000", - "avqCDek5qgZqCLWwm9fJGiZV9pcJzAiA2iIrSezD5q8=": "4230769000000", - "awlzaeJNEbcMcveqecJafMQyrX0ZkRPYrQDzdSXC1gw=": "3118321000000", - "ax0DqfCgUHG3IMU3YscSg2vU2dWcsn5aaDiAG8ioy9s=": "909986000000", - "axLygEV3ktZ-bz_Qrl_5mKcHcFZMcjpj57FlSD1fCjY=": "833333000000", - "axRwNNLjSBcY8zwYdWSKID3qNe_ZK4ctck4d0yoEPvg=": "385512000000", - "ay-2bi4XEKiayY8qfWiYeidTh4-7B-wXe6ZUI3iv5Cw=": "3141572000000", - "aygjMWmMc8c4cO5dAN9a9-RSO3x7bpsuv7E-NGDOYXA=": "379260000000", - "ayljCfpOU9KZxI5RVFfziTl3r70TFl2hbngcjmYsRoI=": "21923051000000", - "azLog1EXv7o_K0q_zB5wVtuGJgKXHi8XFoYeJQ7DHbI=": "769230000000", - "azV_n3RWVRiCZY5-yt1UU35p9A7pt1DdZklyc7yhQWc=": "416666000000", - "azdgk4ztvO-qgcWeURXn-bpozAiQzF6UYfA9j4Pc1sA=": "390537000000", - "azhnIQZQTFzQaTPCIrYrvLAS-SoUhADr80L9Jk4CZls=": "384615000000", - "azvNgS5FfgpSkH9qTIEjmggEu1jKI7lsrdJ9pjTWiA8=": "1156518000000", - "b--sLVKwh51dIs6QMHL5SD7TISuflsUzvNqxeazHoQk=": "383704000000", - "b-3-bjVQgTJeLiCe9k7SCbh7YtxlKn0tjzkg7d_R8w4=": "959931000000", - "b-TlfKWJpu_CUsHh5D8tXJiojnvfvZkS_l3R_IPTaxI=": "467359000000", - "b-jC_eEVt0tdArsuHAJhYplu8887_rJxzqqS9uu_lFc=": "824436000000", - "b-oCdtwq_h1l-UVLC2REg_c5-7vaqxJQiDMVyOHuAJc=": "514411000000", - "b-tUEwSIWYMcZ6DkGD9k6sE6U0LsWFa_9R24xXJTVfI=": "698459000000", - "b05YNBKS4zbf6n64Z14_5FuYMXFkSll7YqcAex4EZWk=": "477243000000", - "b0HUxIh_oe_usOtwTtITqlEtOnAGlCAMyKsnjzptzNE=": "383088000000", - "b0fTdQDLSDiFol3b7ttih2eT_B1bOmNxhCAlDqZWKjk=": "383304000000", - "b1MOlaiae-BnQCjK3i0O6WhKkEEE5hTYzpZyfMvuvUc=": "833333000000", - "b1bNkEKEa6Boy-MPSbQKZwaEGQbfUvtBkJSfppZMLxo=": "377777000000", - "b1w0k4TfPa-RkCbPRTy4o-JjmLFjh7w1Ko9zpjDC8Gw=": "384312000000", - "b20FS3_FzE4j4iIlhmFu6FAi7SFCtlKmQVvAHhTJE1M=": "1230769000000", - "b29jl2pdf302EwL8bgimXDS1ckcPPaFX-Pv15xAb2Xo=": "3461538000000", - "b2TH8-ZmFkICBi2ve7KHd9WhPj6ZleMleSZb9bqzeFs=": "384615000000", - "b3EH99N5KZFC7uYS70XCB-XuUwsg2NrYusZyE_Le_2U=": "416652000000", - "b3Ly0m7SjubPpd8ZSL6kqGU-ezOS_cw9TtStpAmBACI=": "383334000000", - "b3xhMnqHiSWbu9Ze6JgzRIE2E6X2YA9w1pL-3G5IDhM=": "387491000000", - "b40muYyDpJW4EbxvUHuJkRdJ05d0Fk2QxwXgKLH8mYk=": "2837260000000", - "b4MyTL_WLc7smDzBZTFjGzQza1Jyc8WhDuBNbEccHfs=": "4706588000000", - "b4Y8X89vCy9er3MUka8iUt2pjxSaPqIOpz7zvCgM2ds=": "933844000000", - "b4o1TBXnxVqlfIA3m66wSGKC-ZwIm_BN8dqnZzV-6jU=": "4658845000000", - "b5eJLGhbgqlNuflo8ka_je8FdLvzC1jiFrSqD_3-41E=": "1245367000000", - "b5jY5Dv3oUYqp3dBwMIyjCPt702ZxXS5oRPBaaqdWNw=": "970681000000", - "b5tCFFVnrIUYP_cq1TC7jjnt1G4yCmz3Q4SUbjgfBB8=": "926872000000", - "b63h63DOpUdYmMka51gl72F93ivSkEOLJS644CDKnKQ=": "391797000000", - "b7WWAZoqaQ6SJmf3yIj6HvJRF_sFl0bcSvlZg-eEuHA=": "376125000000", - "b7fLNpe0Cnr33_GX4l0O-0VMHUK9PkFcYzwWXzCj3C4=": "9999999000000", - "b7vEJ3RTIrM7Rd2XbNMyXSkbKaaiDzrNHRoJxw1OnQA=": "1538461000000", - "b7vLywp_BWvGWWrsjJQaNIe81PNduX-i-tL1T23JK0E=": "377413000000", - "b83XeBgq-039jPfZPCp8yE30A8xkYlXNvZ2b4U5zRK8=": "12841132000000", - "b9CXQRrzZiwwF8bEdxJAY944ax8TUJd39prJLjx4OwM=": "458127000000", - "b9HJwVLwvevzViqTOeYaGN2XVKkbLCZZ5OiNA-vjOfg=": "567512000000", - "b9TMH7f8eBvBbdo3wuPxVCkNoLGw3KoOjB-PNKB72y0=": "461555000000", - "b9k4Jt_S26ztta3Ulmp9rKhAubYaEMI2_lZkZbdz9NM=": "451962000000", - "b9xRlA8pcZiMh-OUiU3DkAjXw7j5BvQ561mYIEGFXlU=": "3853851000000", - "bAUbLCMcknTKRkaTadyZMHGOLBW5rCzo2k836SSx8M4=": "1233257000000", - "bB-pyVyPHBuBQQM0bQMjBw_S7kihB87NJe2Z2k-kuPU=": "689346000000", - "bB1J9iEHJUDIUSQMNHmKa4TOXqHrrV08w0p9WoMQ_6U=": "758520000000", - "bBICoTfqBBHR9I9nBQzmACxQE_tAtieDsAAmsnO-eUE=": "1928496000000", - "bBc2zy9lpOOkbv0SBHJOdfDmULOnAzC7zzNr2viZR-o=": "407819000000", - "bBjg4LNwxkxFMh27CCaTmvGofdmg09zMQ4FrVO_aJII=": "1933361000000", - "bBrVtzvaqB2KyV3__DvKFhtae7OBjgDigW8Uzadr6So=": "1819642000000", - "bCBFJrRoIw5lo5KyGk--cwOfkhjBYXhwJnPwNDPqVv4=": "1129228000000", - "bCKJyfmEqhIs61JDYi1i8vJ1kqaFh2H54Vmfr8L9fNg=": "384615000000", - "bCVzL4SPslpcRw4Jnj6KEeQr2GHZitPJd_IyG0XcoHk=": "460109000000", - "bD9ezIDcloA7HSnvlL8gTsuTO2jnOtEzgafUxRjmJEQ=": "833333000000", - "bDrVFaNkCYGWi7ChhT6OVtztZBXjl2rWT0MORr2T1CM=": "863636000000", - "bE7jw1drUX1lS0VX_NetGhPzkCr8P76wLhNjCj_vUQE=": "382598000000", - "bEh8g9q0UCaIA1vGLMZ8pJSp0IWID0z2dwIzF0M2F-A=": "389386000000", - "bEr4ESDHCOIOteY9z0I73hPEYUU_FqFCvUB1ir54WHM=": "920141000000", - "bFrD31cD8r4MnenYCBgeFOxFxhpadyT2UzQOY-MRMbI=": "416901000000", - "bGC8NP6TUx-8sU0pTgvE9Qyd7cvHPR3g6RzFUFCD65M=": "1591079000000", - "bGD8rN_tDuGYuzr0-4wu65GXLyrs8Xw14lHz5L5143o=": "1923076000000", - "bGRVQX_BrCn01gcEcsa7Ue-uLmZ0uWFAOTVZU9CBY4o=": "384615000000", - "bGzUBETpWzDWQBuFjir-DbfAX7dnpKAci01N7ppSDE0=": "4544361000000", - "bH1c0dedMTHLkB1AvN_EFH1oMz0JVH1GTI9of4nBbcQ=": "1295840000000", - "bH43T9vbXkSqRGsus4PNGd8xOBsliZUpIPzwXIRKRdY=": "462146000000", - "bHX9b64_zwggqa6H174qfljSVbBqdJix8_2GOOcl2GI=": "471140000000", - "bHXD6z5N83eoBJGAUbG6hOSARVZ_wC77-CuavhZgihw=": "4038653000000", - "bHa4QCvq05-TOOQQkRF4CS0bYlI4U6NC6dhRfIqNh1M=": "385510000000", - "bIrLDck5gSht-Jyx-86sNksSeUxhE1-1dYRf-0bPhps=": "4524251000000", - "bJEHV5JWcClpnqR4p8BhUhEZSz35Vb_yQToywpX4d-M=": "2307692000000", - "bJTtbgwdMOb4yG7c18jOHtFgM_DFXx49kpOLppy18xw=": "377445000000", - "bK0jelHc_ixGbvyDQd7o5gM72Cw7mwKGIub8Pkgc_AI=": "771465000000", - "bLmZ8FtvO1AQV3p-_gQtjpVWKnPQ7181OLQ1EriusLQ=": "461801000000", - "bMBbMX6ZpSXJHaG2ttuW_adI1wplAKyLIxppYUmKKkk=": "470730000000", - "bMbMRCv-Cqmg8xwNLUIK17LjS7KhgwYRMueAreMfDLo=": "1249999000000", - "bMpB3gdvll4IezhNxLYO6WT0rqa2_4uUYUnWshyKTAk=": "455600000000", - "bN0cWIcuvEwSQD547Uj77G97kMj1RiafjClJMUQjKOM=": "991814000000", - "bN60CkN-HXlP1g7Bj4EHGfF9J5bG7UNAOOEth3Ns6Ig=": "3846153000000", - "bNE70MKRUY8tunBz5ZpexqAR0LIh72xiPPe1fgoTajI=": "1363636000000", - "bNJnJcn_pCrhLReY-TKxHMtJO550v18i4e8dSb54jzs=": "929867000000", - "bNN1kTVOfcxaQ0SYxF__q7uarK-9kB7mguyVrOZwtWA=": "382080000000", - "bNVEiuKLfbXc6ppSxRzkRc1sLZ4OmVlav_jVuKDcZuE=": "4166422000000", - "bNtOdmniFl4ttQm2VdjDZ_AG7sb559S5TaMRk4u5U0c=": "1002872000000", - "bOhQgJvRE8PqeTNybzWzL4YeRazZEpqOo2nV_yz_8EY=": "1860834000000", - "bPS43bYkriPwjvhDRv5jCULHvR0XSsyJ6xIalHtgN2k=": "1370057000000", - "bPslLXQA22THyoCktTb47TUWZW_NTa9Ufn61Br2dYqA=": "384615000000", - "bQGC41RGZEU-QYf4d6Jbvc-Rlsg43uVWJmKo6kB4a54=": "493511000000", - "bQTCCKQ2XxNbMm0b_Mj4lDQJWfw69a94wS1iT8MvOf8=": "449069000000", - "bR1-VtUpo9DScxoDd7331SXIATe13bUsf4URQC_zIVQ=": "1048150000000", - "bRCMkWNclg6L1Jb3MWN6jmlNmf7Hk6ZfB43WLb8AKSg=": "2500084000000", - "bRUROcoJP7FfLqGey8n9YpS_kvYQsA3kUp1LqGmRNLc=": "2020986000000", - "bRh7d9ARkr-h71R-E6r-jFro9Bbgpwl2MKIGSeiqZwE=": "455600000000", - "bSQBLBD2aPebYwzaGmxEcAw4dYC92tqIrRdGYb15rvs=": "1154982000000", - "bShqKNfOkOx3bYcHgcFJyiFjbbt_Q9fKqRYW6p6Yxf8=": "427942000000", - "bTBNeUxNqj2Am-Q0XZTSbsZCKMfmJQJFZ1PdwlyrqrA=": "385697000000", - "bTMpnxrkXTqRxsPez67boK1W_3D6x_WVKmFS9_rYgHE=": "898541000000", - "bUmcB_zCGhSKNF-JqrFXJ64iSVdnLESi8LBvQb22gUI=": "657307000000", - "bV5kTpYqmACcwcZvsAh--jnJGFCA-MZrCOCUG-b007k=": "2323542000000", - "bVO5F30rkBgzDXwUtz65Z6OrJXMyW53zwwjLKt-BDJk=": "384615000000", - "bVtrBOwSkghYzMXfEionPvFGDUVCEfrPmXubuYSR-74=": "761210000000", - "bVv6BIu2v3C2WOLsh8ZbeDKZSf06nAsCyCJYg_PiWdM=": "462839000000", - "bVxB2XMdOO4eTivU2QUkwRFudjre3xw3bYzMC-tEIyA=": "1134645000000", - "bWNDYDQaPA7wqZakV9d7MUKN6U36y_SL2zkAu2gVs5g=": "386331000000", - "bWX7cT0KD_Rz_iT7Y5YvqV1CjK0vZfpaGk7lfuqZOOU=": "635052000000", - "bWatF0n67Aj50YsskxtrcUN3DwCEHJpTkm3lmriouuc=": "396485000000", - "bWjlsjabMSi6DZDg3hjJKYoAw47KRqDsXTStvIeLWDU=": "419398000000", - "bWmwi1-MdK6jsCgXm9UALrv1Qc4T78UWnGabuwv8dnE=": "392602000000", - "bWy1szmjnBWSm7k7rUWF2EtYR-GOrmVeXGBLr6xAplQ=": "385509000000", - "bX8Fgf5gFYYpZylCe9TJ8tX7zt9f6vnmJxQRoohapKs=": "381635000000", - "bXEkGoOky16e5NYPI0oe0AuKbko8ZH4JRQrgHfd_vSU=": "1327728000000", - "bXYCmikMMXWGOuHok_ACegBy82vObkWdASrqS1kRyYs=": "462146000000", - "bXnf9VMcOINBeOsUs1mQiaDvYOmLERalMO-YZwm8mgM=": "416679000000", - "bYRPrZTrldUqzGyhBt8ryI14uBgJM51JQ4jb2i3szHM=": "1258081000000", - "bYvDhCFnAPqSEsHzigI4viWCcy0AQKGh_llPlaq2FFg=": "12692307000000", - "bZ-yrPCdNyaHApi8ipmb9D9mZera7NI5IKF9KatAsAQ=": "585762000000", - "bZI5Nz9QYex6_ZcOT2GcyVOznfyfaGoqIdbVH9BfppQ=": "385510000000", - "bZMebfO0Ca4MKvUG2Rjv_Fm4QH8Hd5IXi-K6goMhSW0=": "4110858000000", - "bZdG5K6M23I5wQoCDhYw0MrLKWZ3sJJTCUi4g6upJaw=": "454545000000", - "bZjI032s6sGnbQ2m_KmnwyQ19x3s5tLciEdanHr0MyE=": "384594000000", - "bZyMc_XVw6s8Rdm6OTQ4UXksVOCYHjtmn2CBEfi87iA=": "768894000000", - "b_3YZA9KxgXXTcitf5MHr9AslJIfOV6NoBecKsELgPg=": "416406000000", - "b_PxUdX7rsXy6HOovjTm4RjHYIKuYMtwY7wx0dTEZGo=": "522729000000", - "b_XZlw0LuC7FbwwsAC2CLF8XyEHFSU2kWTJG9Ya9PKM=": "453994000000", - "b_myy5JtDvXAuJoLOxg6MrWwDO7p0vnGPZS_T4ig21Y=": "464433000000", - "b_q5YCq6tnqYsAuXl_xYvWwn9QiswABWewCxyCYbahw=": "384615000000", - "baruKqNsVvlt3Ekyb0NIE97htFd7JylmWLeeCIoMamg=": "2236945000000", - "bau_xxBFtFBs5g6V_03QcWlc6MbsyEDMYq1qAqWHi6o=": "466267000000", - "bb2HUmBot5QGWbAOueWipYnas2zY8MWuHOPAgXAoosM=": "1893165000000", - "bbQQgG7dLDeuFUpJ5cC_plpXjTVGJ4sIVvACCnzsyf4=": "7302392000000", - "bbXyajJLwglKRaR9xqWoZL5-LcrC8bhEnzFxuuz2fVU=": "624999000000", - "bc2NzSVRAcd57K-OdK6Fh7_EaSlw4M0pHoM2SBTUm8Q=": "610717000000", - "bcPr_Esd2isRC8pwHUsxReWGu5uYs0oC9ey6aq8U7Kc=": "414122000000", - "bcWPls0-QvBenQ-jrWwnS0iJnb7X3DHhsn6l2LZX-J4=": "416388000000", - "bciJeS8MaEQ_8VbCkoMWvv07AUBQloCdWNCI7iz6feg=": "2214450000000", - "bdSx3M1gfohcSODC7WFPjMe1ATc03mUW9JsveBh975k=": "771018000000", - "bdTbFLPj9yvu8H1cjj6zN8EqRvN6Izwq-YMygolugKY=": "393359000000", - "bdmzLys5IyeL_0hlY9JP2vjkNKcZHnrjm6VvPOVZZ6c=": "22727272000000", - "bdtZI4vp-jfn0FATae7RkA9zV9SPu--Hv0egxA7A5Kc=": "4914836000000", - "bdt_glIANt7SdhdFoepS5E5_vDJQGjnknksO3_02i7o=": "813983000000", - "be59pLDr6Ens7KKcIJ4Eqb9PJH55Ffd5P4CiUzfmUB4=": "7409796000000", - "beS0-PmHJLnwMWPNREAGLRnIXKkBDH2xvmzf1rOSVx8=": "420060000000", - "bea_NnDI11LBqLjLZNTo7jyIpyA_neKWxAUxFEaYLew=": "4999999000000", - "bfBIoudbraZ4HVzIIIqQaa0RAp6Bx5cpHp1eRJyk_Uc=": "576688000000", - "bfUob5EBcCyMgWN71dyU5uEfFp1_tkYr4tnVGMBw4Ls=": "384615000000", - "bfYBvIVx0J0qJf_yR9rWZtCzBJ4UQKAvhf0n3eER1y0=": "3239873000000", - "bgBgms4bjkTNqNReGh-ArVa75We2bl7O9-zEuZdLojI=": "454545000000", - "bgEvyZuDHVWpwjow03a4B26156HyAKNU2rqwQOXOzWM=": "2307692000000", - "bgISkuEFo8AfUF5tvn1JWzPK5aTX6IFdXfYYTptbUJ4=": "417828000000", - "bgJAq-sA9Becq08eGCFw9rv2gUpN5m2s1f-RRGVdcb4=": "416378000000", - "bgzyPT5biORtmEr5sZHsifJNP9ARw19ckcBRRbbhdn0=": "8418627000000", - "bhjht8bhnw4ozvmjERBrCn6UlDHB_lkHb5PhzGQOxNE=": "468567000000", - "bhw1Tui1wXLsW_N5RCvp2p-2SNMgi2jZKuvXuaHZiew=": "389519000000", - "bi-y14egF-2rbAU0S3YxardrTtF8uRlT4cWc5vFleV8=": "384546000000", - "bidvJmupDEFRCT8RTYePf4G6QJrjB5dAIMnCbBRyfGU=": "381635000000", - "bjA0Mc6y-IYIaDUwEK6WMgpudP--sS6QRmAYaeHydYg=": "1432027000000", - "bjKUCLfCCZIl_6xy-PEKs9yBzDhmL2CmKYWCFQ4SUZA=": "445710000000", - "bjO_eJvLHRAu9NpuOb5vCIjC4U07kQjmtYaRGwLDkRI=": "454545000000", - "bjdYET8wSpDO7S30bMISevgCHcgqI7jOt2Uz4NtRpdw=": "1927533000000", - "bjeWss31mE-sArZ2W2eECtp83Q8fiX2TwJZ98U5SLQw=": "1252911000000", - "bkKXfkhbjkM4MwZRpcwXw0OmRukwMr_eJ3dGhGEATW4=": "3786121000000", - "bkPERF11RUsbbiGmTujf8RMvJra-NCBZ_kVuzK6zgVs=": "498966000000", - "bkTHBNhUHz3JywOouuk_zaZO_6L-HOf8dQBXWll4c1c=": "4166666000000", - "bka8g9SrWDdNuWWs6rWLo7mpyJHZ0Qm9fX8xYlQA1hw=": "619295000000", - "bkaqV-FQ3kN__VIAXMvnghnPNjPCl_o0uCmpaAGrHI0=": "1110651000000", - "blE3EBDJObcvhC1iG0nmFQpEWeetou_apk0vamqZcDk=": "384164000000", - "blvcCtJjFwwFQE_HU6dzo-sE2UzJzP9rWMO7QnNcTvM=": "458915000000", - "bm-NF_jqY7vCNUa_MbxsEmCaZWXgpPVUV5AUEqmjMBs=": "384615000000", - "bm4jQCvfzYP7eQqBITTiPiclApgW28zkJrVb-132aiQ=": "1270594000000", - "bmGAp8LuXxmMHvwg6rgdWBvOLHmldn2AnzVKQbkC20Y=": "455261000000", - "bmYqSbTlqodJxtr3L0-Fa2YeWyzp1AVG06OqDTGwJNQ=": "10564046000000", - "bn-FsdKtwhlhc3XSRJKNHH0rSDFSXugc5XzJguv3o98=": "1527211000000", - "bo3Z6ODK6ZTboN_GpObee_5Errk589w17tjRMUqogqM=": "836115000000", - "boCdDAirZ3wMe5IjVH0V7gFkhtl09qJatrx0jo-oSVQ=": "381767000000", - "boHqNUchYxNlhd-UhyRdkytLtCCtGjh9EI_8r7sKnAk=": "2619215000000", - "boJntfuftwemS8fiDrnHk8ph7TFLTFjpjIsvYRn3Ss8=": "940481000000", - "boQJQeEVmLto8xfvshHQ0Rum-OvmLu5s-VCh3xYWwIw=": "446505000000", - "boQiPVoG7Wnjo0yJfi6URjoaj4mNfRE2WYBrZxoJwac=": "1610251000000", - "bpo33aGSYdFX9D5OizBehVUf46e7ywODR9qicVlXLGA=": "1927537000000", - "bq0n3N1QHtDQws7ltG4Citf9t2Qoj_pz9Jvey5BR9Cg=": "417630000000", - "bqN_ZFehoxaVziPnkGoA3ZRxfanG4KJfEbboNZR3Ybw=": "389456000000", - "bqZeNCk1hzizZw1oUzU4YVgcg5HlN5h8NfsH0DY7fho=": "463851000000", - "bqpAI-51KSP6Bx5GO4umgqubv4rrC7TekiMYHfzRUuU=": "378119000000", - "bqszxE3Z5eXHZEAz8L91vYiWdSdvy7yS4RZvt4OR3K4=": "454545000000", - "brYHyiX5zcUVKwAQ7os9jF4Yc-7nxUB8tlRQna3_ovk=": "456871000000", - "bsRWI1cbsyIT6RgHx-lbTccYDks51TRWFZpFoHYdmR4=": "3892295000000", - "bsVoXOqp5Jl0GKYKaD2vNujpr4c64C2H-rL1keL6NJo=": "384697000000", - "bsuxMKnu_pf2_fgleZXcWfiMPjvZk8mFII3WyrAsmuw=": "385506000000", - "bt3MSYSZDjpXvvkIJAKgqt_XQABYnyMyr6rUu9t7Uag=": "379026000000", - "btsyYN3a6T-gVP0v26oS3vrxFH1ynFBzFRt2GB5WWX4=": "384615000000", - "btv764wD02GnPEgvp0it5a-kYEwSOdQeNQSsroBAJnE=": "1153846000000", - "bv6BKQT2t8WgV4MHwr1tLLOcsi_f5Et0RObq_JMXU90=": "385507000000", - "bvKawGzyMU4gNK3nur9yKlZX_jvbasXdqgbGABJZjI0=": "770515000000", - "bvSLOrP31y9iaME80YKbky5cIgpPBu-Sr0Ipq6I1JJI=": "850858000000", - "bw5lXUbT0zbLGSE-X2uSLoc7jNw4FTIkH0eTanODbPc=": "1577584000000", - "bwLyWVexF54xdicIiLmmPlY516ZS4P0uJA0wDhny1-A=": "384917000000", - "bwsBofxCStPTdmFnCWnqswFTnaDyHQVtnvQlSri_s7g=": "417632000000", - "bwtKfHdt_goSp9NU2Nh8081I1BG8dL6aPQIA5beeL6E=": "383276000000", - "bwyKxb-HQ46dl6p1RrJYjpjkcfkKUfyZdZwjjxNExFg=": "775784000000", - "bxSeWp5Bx3QkqCK1UkCZVt0wAOAwY6jhnxzRJ8mttT8=": "6530295000000", - "bx_Xw9DnLrTulEi87OYMvk4dj3GM4fmmFbTyzYxvX9w=": "909090000000", - "bxsG9njMziIjdh3ofUsqptvvgOjLcWw1l76ctDXV2NY=": "482124000000", - "by3pMzyF3VElCQ5FgFgGdxzsjjOiTkU0HhgLvQXNzeM=": "404440000000", - "byPDdN8G8-f6HivqvhtH9mvC9t1g6mnrGVNZfKw8tjg=": "3499999000000", - "byk6GzqqEw9VrQmwjGjflnB1G1k4hPxl0kKXoqglq9w=": "574117000000", - "bynXsRL7InUFNteYk8EyyJkkkZ7LNj13hV_VZ4CL3wo=": "454545000000", - "byw4d73-ZzKQT9-fkcz5FLXx_s0dFUkKUFZ4MyPzlZw=": "416666000000", - "bz1EZxrl9YuFOOJyuqcp6ZoahoVE-ZtGLM7cae7VjaY=": "449742000000", - "bz4x4OOHX-5u7K_nZl_Yq6LM_USD4MjENNuGiKyt9V4=": "1029922000000", - "bzWrA16dasFjqzKK2MfwuRahY0o3oIzQAo2hGuTrZl4=": "666996000000", - "bzXZfnaatG61fvsFfqcoZLZbgxwDgtNUzd0mhjx-u_w=": "389386000000", - "bz_9w830VYYzWdKhNu8yCcBLCyNf1SzF8oFSWupNkaY=": "6950000000000", - "bzjKI3MrGBdgqucohUUJR5H4QVDR8v4WABnbyD0mzNM=": "694148000000", - "bzpqQx18Di0fVnziZ_VjaNHFAlkvxHmhkQFw3K7E2mQ=": "620628000000", - "c-P35FVaPw-ow5LxCW6iRGVlFw3e06tGinkdWVtp2bg=": "832469000000", - "c-eAhJLs0YNnUzbVaothfTOHQTHHuvK2Vt9RiS6sMC8=": "384404000000", - "c0iOndNctMbGfuqoXglGfSoF0VhhRFjX0x65na0wWW4=": "427562000000", - "c0vJuVVwOAEiq6F3oRHiUmjhlUvFZ41ah_uLZpmsMZw=": "3389755000000", - "c1jE3XV_n-wwVIsze75Toa45UVOLty9w_UupTk29Tkk=": "1402592000000", - "c1mwOnYgmC7RLXBHVo8TGBGE2p424CLaW7YA9tawRbo=": "1648384000000", - "c2I83Na5Mo07BE9YCblU00YMAy0Y9Y7m21RN6r8IcyY=": "540689000000", - "c2SYp9qxsPn87JaBBg0rwrMrSqw8h8dalvEKsXVaTgE=": "378259000000", - "c2rq_6ooitCvVoJFNH3Qb7fNP0_t9qO3lKmdlariBpU=": "386905000000", - "c31jJFCSt_CFEV-qclDN7Y8t90dqeVQZI10uav3Y580=": "407808000000", - "c3Ny4qF-SV-vm753gL0eKj9ufVYucaXNUHTIYF2ezyw=": "576923000000", - "c3iQ72ktr2kfkNstQ8s9Ucw2-wYy8Ug9Ql5aKbMpND0=": "456871000000", - "c3jZpR92Jm8IiK_jnVnrem76082zCp1AJ0AvtueFDhk=": "1040445000000", - "c3uzxxv9gdmZIf1-gf-wyRO7DRCejNWctDKPKjqKXLk=": "447731000000", - "c4-3Ytwg-xydjq8yjEQm8hcx8z0EAJzxMXPwqLOj1LA=": "392555000000", - "c58_WD9F-OrhPDuLFklSmmovzbdPUwAXapoPlmzIiWo=": "447389000000", - "c5CqQpXnhQnPZGi_8whHz3G-gP4NiP5_eGJntgHsujE=": "455334000000", - "c5ndrBKGMrzB1iDTcKuGva98W_bl-hm_H9lj-uP7JwA=": "832706000000", - "c64CZ8MbnCaiV3Ikwb5TPdHPl8OVLVoekCoAVV6FIWI=": "389683000000", - "c6FbLkjSNAx7hHn8p2VCZ9TJRBfqDBZv8n8F0FxLmYo=": "992611000000", - "c6ZsOi4sDLX1xW0kYTibFYlnkBQk2MsViu7RtoidhCQ=": "384615000000", - "c7-eydg4QWI0SYhc5a0TWCaqFNRAu4pFgZ1BQmf-6H0=": "454545000000", - "c74NbfnkFqOMQixiQTiDouisZ5iBfvITXx2XduO99Is=": "4455661000000", - "c7CWajEu_MUXrnDmo7GfeLZqGNKfCdtheEawhw057Jc=": "4046457000000", - "c7DDzO8GgIRJpPR7XzGe6hzcSDDSvQc53NabRKnTqn0=": "4531139000000", - "c7DMgaejjEjHgl6vRZax-SmyZe0PdY2x8E7zXkAYADI=": "384615000000", - "c7G6LSVBv7t-dh3tJyzJulOJqTptLUQcjWkpjwYcH1U=": "448509000000", - "c88wMPI4dqYTRlnhxwpvoXFSTs5yeLJpIx13wUuY35E=": "452992000000", - "c8T0J5woLjiqARi1Lf5Wf-q6YAXVa2xlbpGON-r7cNw=": "447924000000", - "c8cBYJLEfvsi9yR5XQJwZ8eA34sCAte818pDVOPZ2ao=": "767729000000", - "c9724C_k7JmPabJXz8C1pNaJZ5T7rLq1dpfera7XOro=": "578548000000", - "c9TBJOlJ-H7XO4MaEBaqJPhhW8ub_H5_TogX1XFR7Jo=": "559859000000", - "c9W29KQpy83SUfGf4tHB2FGMXVhcs4b3NIBJ0BA_y8o=": "4615384000000", - "c9m1Ue12CVzukSgMraEmr3VepA_v51KNAbwD5wpuq48=": "769230000000", - "cA4dO_g4CBfZK7CwABTrir8gl2VdGM_3G8upHonvGoQ=": "383954000000", - "cACU6V2UuBRPtq3Jzw6AQfK_XfmCcN-IFBMFKCS4p4Q=": "1252909000000", - "cAhxRNys7trUPd3Xh_HcS1WULGhD8bVPoR0lhTj-1es=": "773626000000", - "cAiTRfkfwlDltVUSccQfhbI1ZJgczqtw4a6KU0C4zyI=": "5148166000000", - "cB7IiWbvburnzUO3i5WIHrNdRjmvo64y0pE0UtM-QTk=": "1040230000000", - "cB_k3TumJnDJ-wdNO2nSc2GpZfXYkqjG-kpMNSLz1oI=": "385506000000", - "cBzWFbeZFWD4jgdxB2tW-8f7i0nQK3m85avGAoNe5Vs=": "1519244000000", - "cC8Hxb9HZSEfj1fMdx23lxKuEgGVs5jIGHIztZUIWto=": "4233102000000", - "cCI_rAyey-qIdDqQM5Qmcu8bpCLSK_LjIiwt6zj35xY=": "384448000000", - "cCIrKsk6K03m3-vyS5pBxGdskJg0aBGDr-Smg3EPNIo=": "1164230000000", - "cCT1w4QhIR3IbnjGVzuNMol6nY1qOu5xXb--N4QCEdY=": "391908000000", - "cCWsNLaAuTDBboTXcR9CMJZGKOjuwWKpC6CUZkS8V6c=": "419947000000", - "cCbp5NB3uQ0VOmDAZ8REiw5x0ZoXgiAlyqXT1StP3dw=": "4230769000000", - "cDTHaP0fYbMMpsH0_UWDindJqX1MaFaV-kZlccyHOyc=": "358616000000", - "cDcQzyoYRMkeBcdtKB1m-h-ViJAijNfYmmyAgCRLPik=": "385505000000", - "cDfesYSGVSOOygX9NJMmiX-92SnLh6qlKc0VUAfqBBc=": "454545000000", - "cE-P5YLPuVTksfnkaJLMu6BitfIj2QltEim5u8Z-RYM=": "1818181000000", - "cEdXEGM-bcpjD06n-4QpMr1Td15EUUAcgVaevla34zY=": "951091000000", - "cEmF9cWzFgY9sQz2sFlwnDPEMzoAPWUhMCP2nXsRbZU=": "384615000000", - "cEoVffcCV3aJbjwSBla8yPIO7w3jERlZWzvFUx4K3EI=": "384615000000", - "cFA4qOSA1Z2EE2tpbIL1ETnuhR2uTSFmo-zZo24I_OE=": "411085000000", - "cFSRzL5euDXiLof-fLcps0jv-dGxn5CUbNaVy_6SGoQ=": "412344000000", - "cFSciCFnRBcwCMLZLx7kb_YMyEttvVvgs-gAp1b6ARA=": "1348316000000", - "cG1CymSKz0hTB_Aq3YcHQttE3vhNumVAOMls4E9llkk=": "385510000000", - "cGHGy41AwlOga1Duak4JlubF4etqnI4DUsSP9VmlVGs=": "416375000000", - "cGJRPp9o-gO831UChpOrZbStsi_IyU_7uZXP3cS5qR8=": "435218000000", - "cGb1QA-tEXVwi94EEeB5eqKEpzg4WeJfqA6BtqhjWUk=": "385510000000", - "cHZRfYjMy6vnQ_vb-3qPEg-pdasCA7Me6kZSLfxp_EE=": "426338000000", - "cHrR1xsFuKarAgkLWpbFwUGxX3jjctcQBwXh-QT0DVs=": "1134899000000", - "cI766mN-pgJtoPio7EbvKKIzjCtnmPY0egig8Y_qylg=": "452205000000", - "cId14E0GkzTW0DVW6J4P8fT2Xf-YN39T_b-BDs79oCo=": "1618405000000", - "cIjKi-sA-cNbRgNJjgz1FtXFG7dIPEBMc0Ob2Cc4Uhw=": "812088000000", - "cIleNN9_4VTGvXO8rE-o-ShnbEjznUF1QQoHLoRkALM=": "654867000000", - "cIqZO59Hx-cLSo6wXrCiUoLXIe1uSmrXAf2a75cgLGI=": "473001000000", - "cIxy-LRaOwRK9p9vxKvrn8xN1jyWZNbXEWx3pgDGMwY=": "9807692000000", - "cJ1ARyA_IP5gpzpJNAUM4ctbWflLzWpUAjK3mI2O9eA=": "773142000000", - "cJ3QeeTjTGO9YCemF0TsRutjrxIrrs6ps4XZMVPtuGQ=": "385510000000", - "cJ6nia2RMT3ss7J8cYG4QcFSZQhpprAECDrnyadt5ww=": "422561000000", - "cJEK5_jhcI92FJcXYUyXjfyqxEuXW5wKI5jrwkr7PtE=": "4987289000000", - "cJmpgAo7G_xOKgPzW0vr-1AxTbrhmGKIzp5HW1PdyPA=": "1153846000000", - "cJurlWpvNvksdMACpdhOceehDTyPZChc2BYQeiQV-B4=": "578577000000", - "cJzSPwWQ7p2Z7JCtg1QHICIDjCOdSfATAiVOpxea8I8=": "447431000000", - "cKDiZvrGBAiknS82UVuCoxxpVmtuNsdCqDpS-VEgRUw=": "755604000000", - "cK_EnTTaccgt1vuwItkyFOBES-u9rIbSdwkj2pQyuHE=": "11418283000000", - "cK_xXNfwWy2jKOyH1BliFmf9wjxV804cKU7EkajS3KU=": "390037000000", - "cKz_4p3JT77fHWfP7cwI0hzBHlh8KenTagQAy-FMc5U=": "391838000000", - "cLShi-0DU4jcb6Jk_YeyHyJoizHCq5Zohn8gyRyOKrQ=": "1927537000000", - "cLZ2zH0EJDQTrMYcxaURwA4Xem6WeNlroDGX1OMkCyA=": "4211121000000", - "cLZQH9HoC-GxbF2doema1RSNAiCT1HWdSaIUSxOEUtc=": "915299000000", - "cM2sPZ-gFnEoj8h1gnOLBJWs8av2JtL4r1q0dbj81yw=": "10955826000000", - "cM6bXR5476JUtZ82AY01jW1r-vXFsAh7kiDFdOh5wUc=": "977958000000", - "cMBwE07ZJhRpheKa7tO_aI52fhxiVeRwMWCbsp6N7Z4=": "384615000000", - "cMLhNlXdvrSepVEmF45MAXl1L84s_Cxbivot2qHZD40=": "1156527000000", - "cMbHcdV4IONqjzh0xehXfXe8DC3RMhSEldhzGEt0uiI=": "461801000000", - "cMfdzkAY4Yc3Uu63neocewc7xc00gPSR4gEjzipeGSs=": "1340053000000", - "cMlnUyt5tc1ZOC7gK_Cfldrc534DXy_NIBEXzYL6SlQ=": "769230000000", - "cNPw0Abkqx51iaiztGpsTQEzYhQTFkFCbJD8jZmCfaQ=": "454545000000", - "cNRICc1gcsgIfyz7CgFAt9xQ3Vxicg0JoPaKo4qn5Ao=": "394368000000", - "cO9-9-nBXZP8PVK8qUwzm51KiuQl_H9vym6Y0Qtj1PQ=": "388235000000", - "cOA7yJ802dWLtGEJ50zVIO205Nbe163RPyVpZypdJHo=": "416666000000", - "cOF98Ev1ivHh_GeS8_2sWvSX-ypixfoTq5Za0re9aws=": "454674000000", - "cOd3ugxPEb657cd5ELel7PG10Oy6hMexRL2cAnGnbTE=": "391885000000", - "cOhjfe1xs1VP0B1_hhZj4QKeBQQzmsQWM3QkFlcp_AI=": "384615000000", - "cOtCdvROdTpo7WRsQ8tn16eH02MAUEz19VeNFxa9qek=": "453243000000", - "cOxwpOZrFEL8DaPcwzBRpIJPIVmz9ymvC4ky2x8Xk3Q=": "387305000000", - "cPDvzf-COcA6ryHOqtJev1lWGYfHdoxyxGVbTuz7Gvw=": "762090000000", - "cPKUHxD4YwzQg7QCdyIFsA4jhnPOi593mfTcmNzxu5o=": "453414000000", - "cPQgRXX-GqILRD5BDFGL4epZ7LevFqfctFyTaShYBJs=": "413490000000", - "cQ_V-VABuz4Hb2ml4p9NxXm4XKSx7gkz_vHv91k-VWE=": "384615000000", - "cQfDWvTfHLHBSkqrPuG8XHg5Vq54_CtL0LWLTOo7Ymw=": "578780000000", - "cRTIORqs8JQ175ixgJUA830PZpx2L9oWL7IM5m3LOD4=": "470734000000", - "cRxklk3hhzVJysd6-fDyWZIPAJ4Qk7RZKe4UCTR6_uo=": "382394000000", - "cSJS9AXGBHBlDO_XIeJ9hKXPxvZmRj0g0hpDm6R-Bfg=": "456641000000", - "cSJg-dkO0PXs7RpxcWKJ8k-842gi-4LtVuPlL3OdQmo=": "384418000000", - "cST1diIh4Gnq1h7Pz3OB7VOsDdF_TKYLsPvV05uHyWM=": "801909000000", - "cSXri5IUbBgtGtlTk9sM4BVrZBbzmv9eUM_sb6hkO_I=": "384747000000", - "cSa7qNp9TtNfX6MAilAEnvuBKTnwAevsjNTOYOPxDcU=": "499999000000", - "cSil6QC4TB4zxbDcdzW1W0ZsWxe8V-eH8FMFgCIqu0k=": "384197000000", - "cSmPjNIpCqbBAPZJvPitanzBqWZWqYRAdFZmOw8b-lQ=": "385536000000", - "cStmrpicw88nZcccHDPa5dAG-TMytKxa_rvC56zajF4=": "384615000000", - "cTAabMCBmMoiWGdfEKsF45FwrzJOoM0z8TdBJSFgfV4=": "1895893000000", - "cTJ90PRSO4vbg0hFfOt_5gPrtjf-UhGANdTxTjUkJuU=": "423747000000", - "cTPGPnIksc6eRTUI444q2jEHogbfhfunQ6toX1PXdv0=": "384394000000", - "cTRskmOOEbiPvRQDNNfW3L97G7XAqUu6mWWV8_HO3IM=": "379260000000", - "cTVDxeS0LfCup2VN4Eo6HHboQ40pNYKyymNS8VRNWxs=": "405229000000", - "cUXEGlhiWuh-pHMe1xH-dXWLkaserAlGSV0r5BuBWa4=": "404872000000", - "cVKYk15eiY6og4PWHyxCoTs4b4xFGAX3Px3-WDf8Hgk=": "7246363000000", - "cVqdOGEnrOFAtcL5ns9GC6OtGE1Exvh_U4SSfWq6fRw=": "376837000000", - "cXhcBgEeBDq9IYMPkZa2QwVpcVF0zqukj6_IFxxXs4g=": "3338246000000", - "cXjXEwDfusBkOG373R8rhtFhoBuSuatbqnIUzbhatKY=": "3261924000000", - "cYBdNBmvJdNJlE6JqNVuoU8chUfkN7qUaYBZrIUq4tI=": "810714000000", - "cYTcrtztWEtWrBdribVThNfGmIkJydM-2Al3rtzTegc=": "4041708000000", - "cYUysGzOjN9VBzcR8w9JmPOcMSSC9Q_YeUpNxTANUxc=": "412863000000", - "cYkQE5I1UsZXlRm0PcW871mQyT0Sb46IC2YhXO4P1OI=": "461538000000", - "cYtODpfm0oloz3HMNESnUv9z63RncMm2SIVMD9mfDZw=": "1219560000000", - "cZ1ZBV7pQ9QBM0MEdkB8mPPPrk7wR_kuDnYEUxPjoYw=": "1886896000000", - "cZ_-97e27-dptZvhgtEZg83PjdRh-AOYbCqV_MrjQ1c=": "1538460000000", - "cZaKdSNkkX7LnSIOiYecmI2xSuREzsh9lHapq-Rppf8=": "384615000000", - "cZbUbuuiftTPmRCvnQVHtvNfA08uJdf3qmvCJBx2Omc=": "416666000000", - "c_J_Wy0i5HCNptrB2QkepTghPIQtWG_trBmnUxXs_3Y=": "1986705000000", - "c_vLbu16LEFZ7xU2aUkXmlc90chGlD5HLeUaILuLsWA=": "458399000000", - "c_voi_fg2jds2wAGJbXktcvC674l5N1wFsPPZJVlNMc=": "416337000000", - "ca1R-zSBgLCkrUtsgfsCzHOvEwV1VcD7gaG9TpZFSSQ=": "488135000000", - "ca5Ve15zVtMVZk33fvQ9DF8SByjvR2jV_prgXotZT7A=": "1926036000000", - "cawIPW11Cmong-9tz_9JuD2vlH5hCuFqMPBbYJFe8kU=": "385505000000", - "cb25dyHY4go_00qVpL-PfOPSZPp6rkVn2Zyv-Wi-NTs=": "2083369000000", - "cbHxFOuiDgSKWZVSwQ_gbTpB2WSZ46UZXjJZAKUYzrE=": "1384615000000", - "cbIDuqgDZAkBk9GSXMiaqHXo2Vv-CsMEeGs6Xv8tyqQ=": "416666000000", - "cbiccUhdXj_UXR3fDt_XMb4Un8TRIN1fcclCgvdekk0=": "446305000000", - "cckG13j-uGme4h6UYLhGsCaurWaSe-SmrOydM1_A0PY=": "3704261000000", - "ccmDYdUg34RZoBHMJt3G5h9QGX_RWAuVInd_E_ChA5c=": "384914000000", - "cdHSIvAC4nt3bGY93wj7J1A2kiOtcIql0y_bQH_g3Og=": "411085000000", - "cdKmuxZyauI1rklZdf2iGi3FapPOqcaGzCvFFFHQFyY=": "1510771000000", - "cdQkMd0JFCds7Hq0QOdiuPVuS1Jdh1VFZRg_rQet0pQ=": "384650000000", - "cdXYt_f8sFdxCpRAN4v2FMO_JBjbexFdyVBCGPTYylQ=": "777326000000", - "cdrVDbnzS9CTIu47QYOvn4IL92gCtWbMF5n6-rEDQcQ=": "2082843000000", - "ceRKzDWYXNCLGbFOhumgrCXB0R0lykSKBftYsBLKNvY=": "416666000000", - "ceU8UjpuuT6JzhM_botGWC1KOH6e8V0Drb-W0inJKk8=": "455526000000", - "cf6ZzfW58xqpw2FpJWwodBMGEIh6HbqTl1kpWNw2GCU=": "411085000000", - "cf9q6EgsuM2B2ebjp7sxUqljyppWHqUzhYQ33h1uxpg=": "455600000000", - "cfnL9Iys31_DG6aHFmBbUkegDXOxQMxjaLzLyeNXF8w=": "384615000000", - "cg5d8-KaqX08SGNxNN4BBYjJcBIX2bpevAgZQ0Uw-2U=": "1386434000000", - "cg7i2nUxwDLj6FAygaV2CgCAMWDwUMnBulLtkwzIL84=": "1354961000000", - "cghRvD1b6-8nYz8Pdmb_8OoKiNbXpVkBmdnGR4pLk8I=": "1390719000000", - "cgic1uCzFFDAYN7yzLmxRUca-UD_RDFiH7J-pCkEAY8=": "1047238000000", - "chd1LBc8BeOTiJrjriwrL8_tYNXJD98Lll0myd1xKio=": "464142000000", - "chjM-UoVD-Sg23XHOXXwf0B5z1Bt_9ksv09zRwyVjxY=": "7692295000000", - "chqDiQqHhZI9tuAa5t5whdtsb8sqV4oD7Yo3rLsR3sk=": "1603846000000", - "ci1L1m44l4B94AtvRkYDe1FhGPjqjx_Gt3T_0jsyz_o=": "1816809000000", - "ciLipkTScYQowhoH9dsI5VSEdXc0CvhC8Fl6_JefIXU=": "4008888000000", - "ciQZuoO6G5QzjWRbx9Wpnk_WjGiPchMZ2MxIcB6JHkw=": "417995000000", - "cj608nlRx2veSEnjxHJQRcNuXrndOC7PugPB9cde1lc=": "1361329000000", - "cj8HGK5tJwfeA45aGEs1sRYitXHeL3bE2q3F3pKW3mU=": "416666000000", - "cjCB6hCIncZpwJirJDoSMGk-qgU4cQnG44zPjTAc0Q0=": "2350290000000", - "cjGr8Ph3DU87g9VWm2jt52cOe2aVJ7kLhltDKclhw4M=": "411085000000", - "cjt2WrenxQtyzjCaWgAD08QdwmQbcyTKmVQBb5IPy4o=": "2534944000000", - "ck8-3V7eKiX8az0y4PCIizLSr7lMWaS2ogsMjFvx5V4=": "385506000000", - "ckMZk4eUIwHX9v21GD_jO_CIcK-mpjKK41VY1CU_Vtg=": "1153697000000", - "ckSblMPSDfsN7bJyZJUET4Kut9Xmfh0u0SOCDxNQq2g=": "385217000000", - "ckdcrg-dZ7kAa8bLB-ihXUs3QkcuhEkFQ4r607RofcQ=": "416666000000", - "cl2PNFf-4WjHtXhv1RtnaFk19vpq1O8V7pyUIdxtDQ0=": "406524000000", - "cl96UzejvX8kZB_MSCgTCChsXEvznJdd8HGYvHEDqNg=": "462320000000", - "clJ4_5ZoAA5R1a0Gg_JF1zfqPsqMJbxcWtXGyTvyRnk=": "1187125000000", - "clLpNsuKkNBWcpd4TAf-cZpcAczMMvRG_GhR0jQufSE=": "464970000000", - "clnyPFSSlc0HKH5jGdYkpOE89pjc6lB85SUV2Ry8vYQ=": "378341000000", - "cm0x-V5k9GuSU7-cdXUDgsWbzUcduv-85LhUekj7EFQ=": "2597869000000", - "cmCrSE8t_JlBPpwb76f0shHRFw4u_ZiTc0EbhHXJc7M=": "405357000000", - "cn7iviZqDIBlrdSN4OtibqEg86jzuzz2CcTRMRr5rfo=": "4843535000000", - "cnFjjpX45M_Gf2srRse0xcx8ODcq-OUP1Zz7frMbdi4=": "3300463000000", - "cnWyD35f3qXoBroO6cJMsZH7e3drf6PAzurQF4k6-Fw=": "455600000000", - "coBK1o7ybmIDC9Q1ZTcHexT2PmvKkO8n0reVLYLyCBg=": "1153846000000", - "coPL4BvdyqXmZNaSmfYgyJdhHl21PPzIclVrCR6IjAU=": "906799000000", - "coXam77n8s05MG9s1HfaIBNrVuDx-AlqeI94ThsTbJY=": "384902000000", - "cp0ZH3tANk_Vdr2-_fuUAyO7rCuKRVgi0A3weCEe_4s=": "1000909000000", - "cp91OAYvHQbMEGh44XKLwmugtYDK6xY1FyCgF4kr1Js=": "1150951000000", - "cpqG8icikf2CiA6vgxBLtn-eCRNX0z_eoIrkTL_sEPc=": "454545000000", - "cpzdxU8rFCRrzB1V8AcAK-9PbdLgkNWDGyzyoDyAX7Q=": "833333000000", - "cqB7bfvArG5iyUZa1Edae3iQJeI7k6-7EjKCrUOVfsU=": "456456000000", - "cqJn723Qxfwh_b02_avubJCOK2-oVH5mWe8iIgBknC0=": "3866403000000", - "cqUPK2dwuWL9v7mvz-bb54UcCYFpFVhYGpAfkuuRnjI=": "407808000000", - "cr5CPimWXDS4Kac541gDPLpttNLSPOyFBXZ0XjUqh80=": "38461538000000", - "crOFgas3Du0g_B93SpmxTLvLGzoqTwNxp1ka_2QqSKQ=": "576923000000", - "crzj2iSSJEW0lwNL8IJnV4S6EeEWuU3Q3IEgTlU9y84=": "657193000000", - "csK69ZYyQRQKKXmMmHgQMh2nWMKVZUhqbyA6vhtKFBY=": "386007000000", - "cse8E15Sj1UwHbTfgPVojCGOC8INvKp-EnN-N6Tv44U=": "844512000000", - "csszxZdSKyrcapWJJFoQSkN5cfREFHzzCUpsc1cG3Gs=": "707118000000", - "ctVK3U-VJN8KLsLZWXRl8zuaF6SJrugpkqcg7jxIa-s=": "463498000000", - "ctfn8BsZA8EZhuWmHTdyjvXQt0kkw6G1ev4wMz7lEOA=": "833362000000", - "ctkWOJE5Wr4fnLO3ipzyHHSS-syxgDQZxt2pN8hDuCE=": "771596000000", - "ctptnXZiIzhu_xVU4vs77_W2i6gNw-sHlQgHJARM8NE=": "417636000000", - "ctv366oZC6IW_4EyfLvaBZIpgHauOIdcIxgARjuEWhg=": "417635000000", - "cu0Dqm6Nhbj1aSwv66Xx78MgilkHKsVCqGVjV6TIb1Q=": "3793222000000", - "cu16B_1g43CVOZnT5mw2Nzs3gGcNRkTp5d-990cbZ2g=": "458396000000", - "cuDaicQW8Vmy_mBEzlpAUmwokVjBEkyxo6xVLzNV80U=": "384615000000", - "cuHu10qeCozZIr-VEucYLv35IUERbI_iePI1EhpTw-w=": "456276000000", - "cuz03qVirEEFKMeGEgYElpJWJDY_m3S7acGML9szudg=": "769230000000", - "cv2Xq78RMMShQib73oyDMh7RIn8RBO1D5Cy8eCiRYn8=": "1153846000000", - "cvI_aIQgzJd1iU-v39kV31B1yzuDdNApV8TyU56gV7M=": "384615000000", - "cx_dzODhcqNs5chyhy5E21SIQgh6Zorb_lKkg1IJJr4=": "2402477000000", - "cxc1UEMcK9K-00AbpEkxabIWxUdk55aktNEqaqPikCE=": "4545454000000", - "cxtGqRzAEPeTCaltoVNJWq7ymTy5LFNuB3ccgw20eh0=": "2460763000000", - "cxwwtN8A7JnADf8turcl8OJ6I8xXgIFVdpvbus85NZQ=": "1539317000000", - "cy8Rj7iXszsREbx05qYk01n8OJBPc323-AvvywSz8hk=": "453775000000", - "cyI0X5wr-LhH5Jx7gUB09rbBRJYnVPhaDAYXCxi7a7Y=": "391652000000", - "cydgvttcYcfvAHrdbxx6unB8aRmC92P83a8SrorC9fc=": "535554000000", - "cyp_-vICP525vRLMothjE9gxcumyGkuwukDWPrSzpyI=": "925646000000", - "czWS8krYhl7g56YcJjUCh7cnTWnzwXRggbilTLu4kyE=": "9999999000000", - "czY1YEHMe5fYKh3y7MFrjwHZj3Iq5VEaIWHtu0EjRZM=": "458722000000", - "czlL5QfwQ2SIDgPPlaytdtikkdeIswCsTqpXnJtT0qE=": "582847000000", - "d-1ikxJyO1nkrGDzLlBk-LHe8Cgzlr0dhrMY_fTNLxM=": "551691000000", - "d-4EaXV58Pc0dtSiU546etnRg92Qw0yUkAU2OjX_mas=": "1153873000000", - "d-hHRTKRaO9Ngu4g2mabrzYkNV9Ik0SoI7g9bCH4qlg=": "454700000000", - "d-qQQhpbRxi7gP2rsGntOaVLol0zBVTiFv2KsS3d140=": "1923127000000", - "d0CHKKy86WXox-8q9RbptiZnKTxv04Eo-LTYPxMYKCA=": "624999000000", - "d0Xx-NaBCsn2ZoCFdrCZy5l7Q64lC6-b20aPeh0WvaQ=": "385213000000", - "d0eaQm1zMP-8YpF9KEOuovpGAGwdmhLB6X4Unq_Ioo0=": "385505000000", - "d0v8cPLZRxwmCe15uSuTvoL47sStUIc2FdG60y3zEzI=": "392256000000", - "d1i_wM6j2QyCRtGYkgAUJhGYy9QVTjC2pzkC-mWYN3I=": "3848827000000", - "d1y8roaeY9Tvk41XZiG0gPaugJP7hzLsu_zzhsLbuZY=": "460079000000", - "d2Ie08ll075hQB4gPfpkJ7xvGoUOyJoev3GimjrRm0s=": "7710150000000", - "d2bNKkWP-7F-goM0D3qqbqcKI6Mwq4MinWU3ZBGLLFY=": "1536741000000", - "d2brz7y8eV1zGRspvWV0SWHdgqAdFliN_ruzncC9kOw=": "889412000000", - "d2dyRNETyKK0yjnynB04yWcBR0HsQKvFCahrgdhkebU=": "763604000000", - "d2sUqJiiJCfttQsNrZ8v9m4GW17_PPWHFfOTd7REsoU=": "378711000000", - "d3rqufQZGUECAf_PfulczhdCKfcFE9zUhd-8L0kG83Q=": "13479303000000", - "d4rpwXcAT6C3GETcquOIFz6wHuuuHj4AD93g8evSxZA=": "416666000000", - "d5EPZeWi4_sJIZgVVDdnx-kAFQD9F0UliKDuKTBYMgQ=": "587214000000", - "d5oinrwY864rPLf-mstBc35R9XsZTHDkzpKQGNvRWnE=": "4999999000000", - "d5vajVdA7qQhbkLVZ_X2tLT2TYy4LsJkvdjDAWl5cF8=": "407046000000", - "d6q4OZMHxdLVJuMI95PGojKATsT0SkDlgMLpy0jUeb8=": "381805000000", - "d77uQBeUCKZYXCbccJ_hszSaZkWjhnZ4yjPiBb7ZY5M=": "1674750000000", - "d7C6SHredoPLX75T3HIeMdT29CwjEPnZbGXd41dDha4=": "391941000000", - "d7x5ZVq-AJBf6FJDL8lq5fZIbwvuD09k3BfPg_U7890=": "5039049000000", - "d80qZsBhJjKDfzYCIw8u9P30tJscFx6HuC-fvZABdJU=": "384625000000", - "d8C6qqPfxRNukXcsGxfe_s_bDcLq8hFiF94M1x8Kcuk=": "1513084000000", - "d8GXBsfQTIGm_ZKBYktDuwNrZZNbrgSYzlGpq3kia1g=": "3601212000000", - "d8JXr8HHtquuXlyMVLPVXf0Xdi4nzsr4HKHTJKImy2E=": "1999999000000", - "d9Je-gElfCbqA1dSzCuy6VvaV24BXWqvu3iI6uTr3qE=": "384615000000", - "d9lFmoq5D6434sWUi7OjA020Vi-vwCSN8839Od4JpA4=": "1485645000000", - "d9ofPJcjsgKQ9qKTtEAY-nEysdATHFCwpKPu09R-6l4=": "384615000000", - "dA06DUcGPIhmo90tD4e1IGdPIzym5dCUhGFEu6tjgw4=": "460945000000", - "dA6rL-3t_otWAADVmaG7xcP9XGjphoPUzzOAYlixcJM=": "385448000000", - "dAEMGAbp5p98Id5eS6OSpjyZquH7FF2FCY0FQic3vic=": "417632000000", - "dAZ9BVxKXXImivfc8-15AbKXfIPOw5i45MSTWUIEXMY=": "385461000000", - "dAjEAvEpPUSnVizKu6Z_gy63sW6kLDwpyZ8kYU4VGyg=": "417634000000", - "dB2j9vLzKLf10ugMLAITHsTSKbojg8oHvUnJi-xEmZU=": "3823944000000", - "dBGLONY0-ylYO03yZpD8MEbkDN2l6UEyMgR6KOqa4qE=": "766709000000", - "dCDll99E-mWJ7d7dXsSNUYuEI2NAD1Pk9CY3PMz2la0=": "9999999000000", - "dCFf3fkPwe-IYwaKVjiaF0TwrlY7Lk7sStwNKcNx4Aw=": "815756000000", - "dCd57eky8LakgKaT19OdZAJcslWXUjqUeYR-lVWAtQo=": "773261000000", - "dDRjkkk1vgZxjIJmAgaQugqRd3mIf0m157Dvt66rn34=": "384644000000", - "dDVD-zjJpHJ8byWqmdlPHKs2XIzpkjlg5ncK-Gf0fPc=": "818786000000", - "dDWWI0yl4U5YVpd5dYl63zwNMz4Fr2KOayNZc-82HFk=": "386293000000", - "dDWhvLyQObK44yBwMT109_uRGS7BfYIebj6FUjzzAHA=": "694827000000", - "dDfWvwYcnfAT_0OQoahCxOjDnWCnMHmSqt_xnlBeBvY=": "4178535000000", - "dDxOhJUgV3ojfm58-g8jivsEkVVLgXz8xgXznvNe0zQ=": "1810877000000", - "dEEd2_3Hnb2dy7EFuCL8fT2Puodcw_W82XSv7CAYt8U=": "384486000000", - "dEw_TBo5ifWa_PSM5YCVl1ndCvPqCI8AANF6XK04ih8=": "457058000000", - "dEzAvJOROtCm6bEVEBAknqwtCB_iY7CdciwiUzgEd4o=": "385315000000", - "dF8UeXtqaxEH8zsirUToHFXgWAroJ9z-eusHXLyYko8=": "417236000000", - "dFrST_0ifIsJtsNzkZwr62m7XKTyoZtNaI2kZhUl7Zo=": "466216000000", - "dFtRA2etI-FmNX0SgTXVpPp-uDHTR103oMS5kEkWd0c=": "523748000000", - "dG-XG-RLOke2sU1spN4T32Zmn4tpqbPEZvV1Pmg5V2A=": "959422000000", - "dGGgS47brVvdckYkewX5GflfkFLlYB3VAhCmTRNaC3c=": "5080974000000", - "dGZH9SuLnRZTrQ-DP85DPvHGedgkOsXWZggQ6WnuZTY=": "411085000000", - "dGpPPFzq0_5eMcp7HOMsjLvhD0Dd0nITcGqQJV6AiDU=": "416666000000", - "dH6VBHvJb3pe69-9wtvsLv6DPuqcu-EGXzFm-eYuybw=": "2275234000000", - "dHb-FI72QqzcYdjOniZrLAC8VJcZjkINTX2LEgF-rGM=": "417612000000", - "dHdwswCVVNCSvjvV19ZeGOMWsD4H7uiw6P8mY3iFbgE=": "445020000000", - "dHnAEHO0wfIhgmV32oe_NPRNmQlIXGN75C36DKX3k1o=": "3854759000000", - "dHyUXNKjGJxq-Q0WDZknGy1i9Gr5gn98AuNYDhsd3yU=": "385011000000", - "dJ4Si95BIdfcogWx_KeBk6yOj7onq65yDixd6oK0yMU=": "3846153000000", - "dJ67Dedu-b_uE6jmITnUlCf6XS0xy8o5gh0jFvEpUa0=": "4230432000000", - "dJP38NQhtyFVGMwgqDJnMBx1OXJyO9tYuqw3QvN5L-E=": "385507000000", - "dJTJzeQYa2iGWzaSRkHlmgbTxgetB0UpG8JjwW1LeUY=": "1538461000000", - "dJUiWtr075F3JqOVENZpgHXGgk4kP0pyg62H7nnJbD8=": "391344000000", - "dK2VspiK9itOXOHmIkVcZr83Zu2Krjl5w0my2YFBT_I=": "576923000000", - "dKBUWetLv7b1GJd0MV8AtEPn-QR8gZ5v7e4sNRw2a0A=": "385507000000", - "dKB_jtF0mZ7nVOgmGvgNGN_HAvUuP6FTZ2dRZv_zz-E=": "384615000000", - "dKQB5vVxZY12dhf_E4PWvu_q7OF6RqLWqrpLY6bl3es=": "462839000000", - "dKwa85D7CHyAOtp-tod0RQqe5a1zKTFVQ0sYCPF1Rik=": "1891305000000", - "dLGGwCRLMjxRlFnvcemlSUT0aTAhukEsXxZhtxv5_58=": "5992795000000", - "dLMpkKC_Moj6SPViRE880LC8uUekk44KXRDJYuiAs_c=": "384615000000", - "dLerEc_8Zs_1S_c-lvcZf8BqTMW6O-FT-kEOAO3Vsns=": "384615000000", - "dMAl1ZvQ9x7lpU7E3R_PFfb9FHKg3yNq80iz82M2IBk=": "473771000000", - "dMWUhdmP8bkkj7bgzo6201fsNSYa7qCx-5EM7ye_TpE=": "4557606000000", - "dM_Ujo3BdrbJ2aV8BWyz7E3CD6nZEOURuF_hzVeLPsY=": "770472000000", - "dNaVBXj3Kl4y_fCYXYAF_q9VyTZQ0wjnG_r2dEMFi4Q=": "405229000000", - "dNxjsgphghtHgTESKqfoLD8TSQaKPPMwL1WEBI7xYYU=": "1927537000000", - "dO3QPB_I5h1Rd9DyABeXkpWfwX0KH88U_KQ-m7LVdNw=": "416666000000", - "dO5qtTxK2J8yCy04bkRGdLZN9vhuMEJY1tvHERxqlBY=": "5018032000000", - "dP-FD0-lDyKW-CB0x6dg8BZX7HcBVxrhxsTqLtnUBMc=": "577910000000", - "dPNTP-XHE5E34pF8Ou63PIENY90YPH9ilHeglg7aucs=": "363764000000", - "dPYbgbz8Uwh_zKWbAIjq0RZ_JUp2GGHzMOYWXcfZjiY=": "384615000000", - "dPmmT4FvzEyJjOoPEavgtTWlAHllCG41demnUQ_eegc=": "7462662000000", - "dQLA7d2jp-ojApYeL41TSqRotezoP7xXS-B8qWuTe8c=": "390985000000", - "dQvyjyk_E4F2SRyRWNgrJcAT6E1Tbp3Eyxje4bUFow0=": "454547000000", - "dR9g5VTLGdqEFSQ4kaifGAX-TsEpJho2puSzP9YSAD4=": "416710000000", - "dRAp-lOTacaFpWFsb-twCR6CekhAxgWVAYoqioSkT78=": "1152108000000", - "dRCzBkcc0cWERhmnV4ZuYzdFkvyTUPI0cDB8rMZOZlo=": "404995000000", - "dRkR4u721uk-O9iOwWJwBSkJlytjZez3v7K5S4fRxBw=": "417148000000", - "dSG5Uu1I2B0tpOOft-3TCxMXDGCHxWlQWo1WE-cmlyk=": "384615000000", - "dSIVxOporvEzy7-_Um9ki5gAu--_bEtShxyZacHUy9M=": "811696000000", - "dSMDi98DGctkgZdtK3gcPbKP6zE1PdpH8F2dQf3j5Ug=": "391885000000", - "dSRPOG3D69_Hq7MdAiRLDE55yxYBOp-q-ON7148QAHU=": "873483000000", - "dSmN-6RuGnopT_DgNA8hTIkfiYHhGmNVky1Sm87UHXg=": "929409000000", - "dSuemjDCeUDy8KR83e1uknTCB2d3zGNNUuhKZj0IZWk=": "462146000000", - "dTKlbBFaWauY6-4T-GJtwdpd-gxX9iMvJNjWqh55WOI=": "9112001000000", - "dTrhLiid1jM5-JxJX3f0_0saPFJGxB4UkRvExCWsv-k=": "3398840000000", - "dTsvBkUKohcSHEU-YnR-LJbIpM7G0ImIetV0b_2yy1o=": "640829000000", - "dUUvk19Ol_CpGlg-ohwrPpUU1hazexOpK8MMkEPSryE=": "384590000000", - "dUyDheIMMsNX9AyyJd7OZtT29oDObdzJ2Va0Y2wlshQ=": "416901000000", - "dVaiKPJpYtVXLsuFwCF3l_IpH-qbBY9JtdquPjEk8hM=": "622689000000", - "dWC7F25QP8a0mglmac8rRjPkrDZp-nZSyEwM12WUBtc=": "1869436000000", - "dWVdcwiZWWIhx6Ey7ZzTlWBAadQEmjXx0MYLzeV6Zuk=": "470671000000", - "dX2ikFJNiP2JOOD5yAVGjpoShk-FkFLqYIYniSoTj5w=": "393321000000", - "dXPjTjifgilpIP_8O1N4nV4ioOvYmy3tmkkuNqjjd4o=": "1818138000000", - "dXvxrBPkH2_GsWIFEkdsfG28h0Z818CeXDw27_V3AAk=": "454911000000", - "dYDL1XCMzuz1BT_uy4HG8fqNdfyMURqfU5e2ndpoQk0=": "4845850000000", - "dYK0mUASs-BYv_gAXvi74Rl5AYwZnwNIzjCocniLULs=": "450084000000", - "dYxtvCW6UOsJ0b2uYwXjRvpQwdNu402fmRXPOwU9CvM=": "1836164000000", - "dZO9UZ022prBL6rWm6nInEkm2kHm6rjrqy8RfFYxtjM=": "384157000000", - "dZoMTBGeKInkwcrF8covxtbCqgFAmWA55huZTodEfZM=": "1350623000000", - "d_RGvKa4DeEjwL38SbgxydTusCgTz6OUx2rkZiUBrf8=": "388656000000", - "d_bvaFO07DoJuQFWluO5gjQVEbDXlqdcA7hT7CBLDuc=": "418228000000", - "d_jBk19BB2EvHwrgfZxGdUgmwBo3o6GBtgfH4-NS18g=": "3873318000000", - "d_pzt2wnsGFSWTD1J_LYzy65XMUIexEOi5I-qMFuqvg=": "471997000000", - "da2Tp1hsdNn9z6rc66_602igSa4Tv00dWL9Y32TSHgg=": "417630000000", - "daTQhwl3Yd9aqxOA3Nk4Yyp8Q4riDIe-Qij1xe5rSZI=": "409514000000", - "dbLEgX8fApB2S5OiXipWZOeAzUFFNCWQd5ZvY5dDz-Q=": "754435000000", - "dbWXCCIgdCH5BdBAH1dNoR37BJwd5NR2Cncd8IqSYwg=": "411085000000", - "dcnFA1OIaubODtl8oXf_gnPjmTLG8ZfeBKvoSGSgFAk=": "12641071000000", - "ddE_gOljpJiNH_Hz32zCRhNeOuA5Sc1VAwFM-BZOrOk=": "384615000000", - "ddXixeIZ6RUmdnlg9yl_OWnXJ7uZPj4AHoavD8kZeXg=": "3852230000000", - "ddrlHbnW8ocNAjfDX5-lydqAbHYgvMaPqe3lz9QUTPQ=": "1538461000000", - "ddxOBuiosvHCWWAnut6Tc5ohpqN7BDI1x5VvQ0hznwc=": "454045000000", - "de2nzBBgivyN3yIZtArDc7VusHfcvjZGc9exXdDm8Z0=": "395071000000", - "de82028IYt7Cphj2WAeXaWCQC-VDS3ODAhB21_W64O0=": "391797000000", - "deHrv0efmcsnfUB2e6erHf_uQXkzOjXyNlgwpG2EeuU=": "385506000000", - "deqQnyuHDiJDkPorDSHeE8c7gO7NyMBznBbmmkjpwY8=": "7176552000000", - "dfLsuiqyHyhKPgnC6snP1-VZzPOZXOdl0UChBsH3eYY=": "745903000000", - "dgXTKnyaNDBj1l1qyJvydsUPkDUAOrQH6-u_mAzgtb8=": "893077000000", - "dgwxL2M-I2RzafAE9il-ZGlGwIgQRhHdF0D0UOgAT-w=": "393240000000", - "dhKF_F5fBqo7xNEwa16QJ9ZzN7IWwL9ldIFVl7V1et0=": "416716000000", - "dhunfMfPXW6JAkdKZrt0TEPywf17aOovfYwP86e2y40=": "3987100000000", - "di5gszLHQldtCEK7ldwX7gm2mQi23y8UKanOdsgc4WA=": "6853812000000", - "diI2BcoSI5lqMONQfQdIQsUIqHn8uKPYINJk7szLCGM=": "385311000000", - "diLgyWN3Xo_jJ3p2uQJTXhewBN83tptiKmI4wtvND_I=": "384615000000", - "diOeSegwKFyf2DRk7SCXWam5jBqWjcmflZ-AntenMnk=": "384620000000", - "dilNlEsiUiE2bXFGyhqEIrcx9WhJkLzc_Rqf7amcBsU=": "755466000000", - "djBVKxvIo145JxNpQqT--0uxFmTkhoaKuK1dNZD3Dg8=": "386671000000", - "djSg1yC8GAtcZ30-IaHXJQm3dR-pWWvmCMRymfx242c=": "3636363000000", - "djYBRw0_dIS88Kd8xp1yIN83q1DgAspHTXrD9zoSCcQ=": "830037000000", - "djv95_F51mw7U_XdEoJotZfWn956-fjQsVo61QckM1E=": "452875000000", - "djzWPVvdMzesxKnkEgbMmcz_AGi3GqLA5gWM3-x4pkU=": "1249361000000", - "dk9PRw4nbD35fxy46SfQ72JP3JBWNhmCJw5HAdqTVKA=": "557485000000", - "dlSHe_HTeaWYfDdWAOLqlpOw8yzt_8GNzq4BQ6oykEU=": "423710000000", - "dlXOP-fEAseSl14oROZuP7MQN9xo8N9xCGSN5LEgS2Y=": "416901000000", - "dltaEbS3wV9DPcxWMGh_kl-7L4y2aeh5Avxv7y9N6h4=": "926997000000", - "dm41C_BAv-LkALSh_xD4G7zno90lyPLlzEZYXI_JIS4=": "385506000000", - "dmAZETcDUadna3cppxYc-z5GUG6EyDSFHaXQcFBdzV8=": "384615000000", - "dmaEqHDTREIGpVMhULQOH4FlFATd8Z4W5BfwDEwlISk=": "4990354000000", - "dmeIGJvqBeAgwD76ZlSasL9LP0qmBd6YVnxLJUfNNtY=": "467059000000", - "dmj51vuPaMDJ8xZCZMTY28YXHfeBtg76pJBBZKEedSA=": "384458000000", - "dmuNDSXLfnj1uMIyZJ1UT5oEQxV4c49FPL2Pp3fTSSI=": "903313000000", - "dnSNco6PHTTNzB0k4sKpGyEjMa1yFBbCmKRELDiTQHU=": "384615000000", - "dnyXLsmPoBKsZvR_rM8SilMn8HjUiDUkQA1ILDKhsOI=": "384615000000", - "do1psB1ShUKbxG1o-NpHiBiFZMxcGEbKBH6UaH5NuSE=": "492195000000", - "doHvaajs_4a2RXo70U44Wa1V5XtkIHqLU00X-YLaJLc=": "984913000000", - "doJU-09WUoCXkf7GqutPtvzzBBY60-cJ-Rt7sXGNt_0=": "422031000000", - "doebYimAErezoZcf5edG86A5SsLxL_493fKsq6OQsgY=": "465433000000", - "dogJ25WY2d1gfCLyx6WQP6Smg3Y_3zg4ZX3SsTvvsXI=": "1363636000000", - "doj0cQOYEylpazpkGgZuQ_eR5rLJlGYo0hq6DkP5Gr8=": "384615000000", - "dolWf5vXwQwTyrNeywodvOM2TrbxkNIVplynG-IrtHI=": "1153846000000", - "dooUlerQwGbKOdjW-2vYaIu9HxrZn8cC50_bnyMjLpc=": "499712000000", - "doqjHNgJsOUyxaxJpqbaT3yWekmy3FriPG0qi3ma7LY=": "1134645000000", - "dos6V3ljb3nJWR4cm45tbtG5CJa6GdrXAJGwbxJ4lFs=": "1929357000000", - "dpHmv2xSFCLz3_UZcJwecXnXRmZmb_WdV4ZstWqzTBc=": "2039043000000", - "dpIg7_VTKus0FQeicNrbOIOzQrHcfABYDgWWlOw_SWk=": "499999000000", - "dpTC9k4oSM_ewfuhsauzVm3_GY6tVHZo8DvCE2kbdJ0=": "755400000000", - "dpUIr9RkGzTeCJcV4flW_9Mo6b7UXL5R8VMI-9YcETc=": "1153846000000", - "dpvLvrL_52chh-DQsbCHgcFrosO8WnjRF05XUW_CagE=": "388283000000", - "dq6IhiMUFxC1I3-Ew_ek6f4ppem52KQo3CNl1L5Yc1c=": "454445000000", - "dqMzSVMV0BHfYMHJdgKPKW9GDznpy9Cc3gqyZuPhkLA=": "903846000000", - "dqNUT0BR1_6JNo_QU2lAJiZoOvjRx8l_fQVSMNMA5RU=": "457150000000", - "dq_NU6QtCS3CX2fZnW8xtUefjZZUII7F5wfnkArl1Vg=": "1958331000000", - "dqe6D2z0l4fNMygelW_lEKPYZKathbBQgaqA30Ldudc=": "417630000000", - "dr5TW31_nBiCG0STjF-f-p5tbk2yrUHs0X_NSCA6v4A=": "916666000000", - "drW2wcbyWD1JAfru4w_kWr-RNQckg89qqdkqNitPqlc=": "1647916000000", - "ds3Hta_-KHTuQ--DtlnvpgqUMLN0KfZw3_0AFozPBLU=": "1250187000000", - "dsCZ3SD5Md5pjqFjeU4W8coqJgXjhL7R53TTrwz9IRA=": "384615000000", - "dsdciqm77SQl2Zx--u-NEo2zrXX2usT5kY2X-a2t0u4=": "850844000000", - "dtLDvHY7KnbgLFkpq_jyBWsKnRtILqwcwI1L-NbI4wg=": "455055000000", - "dtPMGrsBl2q0LrJQEeVLNtU4G93T1jwRbpjNMfEQDLk=": "1156532000000", - "dtQ6X_Q96_EKx3lAMB9Z8_idY9zOK-epcuthR2YRxQg=": "409514000000", - "du5cYYxoHL1s2Cmjx6oLMeDWI-bTe-7HH1bI7ZJy5JU=": "385261000000", - "duM12vpdWDQ9zR5Hv9ZRWispoUVpMN-eAKiTpma5i-A=": "1482586000000", - "duObPmzvithMyw5azzefiM_r04SmMgJbhQiaL32eKOM=": "384704000000", - "dujf9GKAo4CVojPE5x2tnCCufM1SQL1PXeYkVqJOvNA=": "928827000000", - "dunFChPB6e-qS2oXgHkIGKEeYiZfa7Z6e9GLk51LXdg=": "422196000000", - "duvmFROkatICSB4jRFDNDFGdoXbBklrR9xXoO10oERo=": "384615000000", - "dvJYPkoAyTyfVV5Wtw9qKbWnW9HZbKi5M7QR1JELu-0=": "760241000000", - "dvpEoXQNHInqzqP3S9ShI_fN09PRq1qY9ueKgMpir9k=": "4197514000000", - "dw2ySo8Ixri38U8T8YDtF-X2FRI9QViejf0dkIvq43o=": "1140340000000", - "dwD95tK9l-yvQRUe-xqqLKaGTt002iO4wSd3NLnHH9s=": "3860719000000", - "dwFJkDrKlANIWnc2hvW2RU0e1S5oJge3F3BVR0oWIFs=": "470605000000", - "dwNflKlngNav4UZKO-y2gtxSG6R_nX37AyNIrZdvqII=": "551600000000", - "dwSRJ8miYifCl8CSqiRvyTPfYF0nhr204DiA3sI4lz8=": "458402000000", - "dwVDJVajSbt1RPGTWEVfhKYK2OEQnDtAOCE-ByR-8Bk=": "1538440000000", - "dwfaatzxe41AlNjLmVnMx6fLw8gNC64dlKES4Aih7Vo=": "4166739000000", - "dwsTRCqrOee9p3ja1E6z0Whr-YVbxA_zcqGbTd-kXhM=": "376814000000", - "dxLw1M0J5Z2U7n0G_zMyDDJP6zaxWToud-AQ7inkoCk=": "448399000000", - "dyVUBzL0VvfM6iO5BRJeNxAvqyHKoDedGlaTG-Q6g_Y=": "384615000000", - "dz8vXhOH5i7fYl9g89xxby8aEkTGYfgXACjuDfep-rQ=": "354711000000", - "dzGmwLNHC3I-xqrd1ofiuq3ILiFliyQ65Sod67WSyRI=": "383553000000", - "dzcOPKSHwnvBxrxk6rm-MkMe3BgWS4WNW2VoeKNZiRU=": "384369000000", - "dzdY9BeVHZ8qYx-VPLaB0Qr9b9xv19KXZ0dhoOJ7m1I=": "383560000000", - "dzmPnbz1Td6OUP6z0E91Ja2WBHZjbNpSEiNo3xNJHhg=": "384615000000", - "dzy199_Tjf2MghQoGsaNzwABv2VIP65IChX8B6dJ2YU=": "4163967000000", - "e-0R6NMTseBjDSShNs_DWxY_Pd9SdAitey4cLyToy7I=": "33581585000000", - "e-YbWfzQHjYKAK4JvAsh35gcZ2FZbPTrycBM_KbCTkk=": "926545000000", - "e-bvgBPaZAVkHgGB-enU0Kma_i2s7LOYgAEYS7YPFZk=": "414408000000", - "e-cAwcPokdu_yg6Cxyhz9VRc6aldOB8jfokpfHpd4Fo=": "384630000000", - "e-o4_99PvjfBZ3QQKPFVL2Abu8aynH4CmgDhHJ1t8vQ=": "384210000000", - "e-qWcdjaxXi1KvsxDPYeCEq2qFnh7h5E_E7hA9KkwZk=": "457143000000", - "e04rOKcfvium03XtdxFHtKle6eyUYJP46Zz7ZoNEb44=": "686479000000", - "e0cBzlSMIDm3rJyL-5W-ahDsxefLQA9RqxEAshAIazE=": "769230000000", - "e0eRLKoJh6a-FG4G5OnIS3clwVOcBgggBCyI16o_L7w=": "430694000000", - "e1-1efZPh1oRBEcpqyD3xgCbTmWIrc9agD6yi7P25z4=": "2323524000000", - "e19395zjH90_uibNAOo8Y3p9hGIyww39zIvceqHGVvA=": "1156518000000", - "e1AM6Bo6jK71ec-wce-zUl4sQZ1hEs922Jk3zRIpJEQ=": "939115000000", - "e1MF-dbJ7xKP7t3Oun98TI9Btc5hbPwHfzKf47ZDnKo=": "1391917000000", - "e1b8nNgiOx-B0TxM3Z9R4tLK8FYd3_QMclGJzvUn_Bs=": "406366000000", - "e1eQST_w4MBWvPfbQRhibemrRgEbBflvGCmfGuPf3xA=": "376731000000", - "e2OB45Ps3ZK0odzxzbaQ2dOXZjMyFwWuaOGQq61tX6s=": "384615000000", - "e2Z7egq2xq376HGz97yZAH1peCGs0vYzvC5DJwTBAJU=": "386455000000", - "e2lNbWEK_98J0RMC79y4-KHX_kXar_1JBQ-KhLIM2kM=": "1716291000000", - "e2ucPidO9nhwq_3DQF3SYntK165EtNKrp1fnQZSDhJA=": "4936566000000", - "e2yW78ILtQRRY-N8dhQrVnGH1KGFZxVrTSRQMkQ0HRg=": "366604000000", - "e31w2sRnXzw2YQI54w2q239dayve3PxJpxx9tzJORU4=": "453414000000", - "e32BXIMRFFV70hIYrvTFcLW4ydDrD3gD1qGo0jWj0cU=": "462058000000", - "e3BqwnpF4m0x60qTO33a0HTS2HsDB09-2ngcS12lt5Y=": "409116000000", - "e3CfV8SMOCjNKAYPNYJJVT3nBip23YMR-0-7_cIBSwI=": "410163000000", - "e3ZpAWmUH8GWmLEDpiGd1ka_ctdebkqtzhMBQi4cvII=": "384615000000", - "e3mRY4swGTBSD9odGEumiv__1D9Sr9KSOcEOf4cNIDU=": "384615000000", - "e4A6pEv2oIPlzwacxCNm_Pmg3uzfKoepVDsapFnrBwQ=": "7365643000000", - "e4BcPYQCJjglz70cEShDW8YbbtzOI6zF0eEuIOX8dOM=": "384608000000", - "e4Ed2RL9PnP8pav6lMAEMqDjqlh5H3tmNV4BkifQ86E=": "1382699000000", - "e53d5R17_w-3fqyNCV4GUelsBvq4nZ2xBmW4N1riZeM=": "8999908000000", - "e67KKNYbHaLxcDxHOiTz3jaJRHiez0XA3oQ0tlmyt00=": "377652000000", - "e6n6DTZT0_eWiijcGo8wDDKuZ_9LX3-A3VvAG4BCDfY=": "1389506000000", - "e6qc2jXsWBmZV6xQo1AV-zmO09QjKTW9759SiXXzyoo=": "930449000000", - "e6tGIZBWiGeMNu03duJU5bfONtW4WwdLSDXSe1ZZwJQ=": "527256000000", - "e73jrT5QQqM_nqOucI8Wf9KLbrBtM2N_rs3qhQ7wXfA=": "633636000000", - "e7Czbgx9ctu5gRViroLJhg8XOAAICahXh8aOj6ZS894=": "447259000000", - "e7Ydq14emR56UTCqkKRBH1kt_LC-W9v4czvx00H-Y_8=": "482105000000", - "e8Bw5JxeJ6y0kZv9iSMVutMf0H4woAagxt1nZ8ZaqlM=": "384615000000", - "e9CJ_by-njp_vb1FZ6BVXri78bBFO8yvqNnbF-Dfpss=": "500233000000", - "e9D8p43qthu6oDPZnwUi_a8zDKIzLy5-HibPEot7gQE=": "1141169000000", - "e9T6YCvCxYC4drLEgHlFhETDMPySWt7ZTrqQ1bmUADc=": "2499999000000", - "e9YgdKfD3Ynh6BCZuVETERC50aGy0kliFD8jD2TjOdc=": "387421000000", - "e9_xIOExVLBmQxxOPAG3hZHh2DhBtxWiRW_bphVl-tU=": "384615000000", - "eABgbKH4jP03LCv5U_kLqJXljVah4Ndk6MhnJtwfVa8=": "453414000000", - "eAcy6yc5YSZCIyyZzbZOYK2K_Fsj0-ro4nrhTmDNv34=": "3419609000000", - "eAnV6EG1zsgf6KevtGkkBVFiMuI6mov3NxeVjbti_rs=": "384615000000", - "eAv8PTA85rQt3W2Qp6c9xmFeMI27rpucBSby19DrvXM=": "780021000000", - "eAwRTwFt-bklOgq8ZBsRtxiCKTYL9M4FPKRcR4YIYO8=": "464619000000", - "eBKi2FfL0YZGfLObH2P5RGN2PBKiEPHYb2uirbEws98=": "499999000000", - "eBLttMJ1FfXJw_SMhqkYoCBFDzKbySmO04fRE-M0TfE=": "5776548000000", - "eBeEnM6k-gwloswzhTWaRaASMKVlN3z_UMQ0XVAS4JY=": "534637000000", - "eBllineFZw54g5AUqXiSpu4l_lAn7dmUSvgO0NJLd94=": "468903000000", - "eBxwB3mwL8Mq6p-INYWRKFk8zQzdYkTHhZUHQBsEgGA=": "463799000000", - "eC0zJjjo8X4F2Kn8ObFeZPYxNfNBcJQwjvnKZNqGVQs=": "385506000000", - "eCZ_RLmg3Auqq-mofwPMIN_zF0dtkBlXQkurd-vdaEo=": "1923356000000", - "eCke1G6eKs3vYnd7tKVUZ1bD_vNdKgqqpwbqqAcstZg=": "2101673000000", - "eCya3dpbQPjyvGLGNPzqYDwO5Sd-ZJzBvjCEa_3AFGY=": "3092375000000", - "eEAFZBQ8dzUrG2WiLYV3mvRbFX4N8kcLcpY5u5nsiMw=": "378341000000", - "eEN4-aFRVQWpM5vobzqvcAzwQiXVRYNxPL18y8JG87Q=": "416941000000", - "eEUGFqtFz3FzVncORIXf6TM2UmVGLa5EtNqbz8DF5gw=": "4422815000000", - "eEYczppAjj5qkyyF9Jipnh1HsUq0bTlbjgypJWYdyps=": "366801000000", - "eFFjEHwzdtpYLfL416nMpL4bLPFpNqxO7HaDFJpvyXU=": "1159980000000", - "eFPCfQhExMBXSWStRDm0atj2vDjzKM07A1sVIQQ4NxY=": "1252904000000", - "eFfdEOzStx4cQav870CtTi0fBlQpICizmg8vftzBrGI=": "413834000000", - "eG3zAEjTphgduzxGFDweVz0VuYdvhOorY6iIl_cfXJ4=": "391618000000", - "eGJ-E_5pkSouXmQIMLcgaGkDpK21unggw_SpcACsG88=": "382394000000", - "eGkx1VrcZxoR0Dh_930eWWQICg7R24rO7kn8u_Wj8Tg=": "1246712000000", - "eGlJ8D8VFtrjl7LAARCEBR5c-ki40Fjebzw9ki7RGX0=": "736322000000", - "eH9JQUJ_wY-LIuyyXIPw84DQSsUpHjKgWc3bZ4TEcOE=": "1978680000000", - "eHNfRQ-0YJ7B-4YP34TIKbKTQYp6nmWhWfuphLGNpmY=": "1956077000000", - "eHln1j8SmjO-OtfShQ-wW72DVxZlFDs2FJNFet59f6w=": "3482281000000", - "eHwrdL-wAWK9zfpMbhdRpOVh2DJDcZu0vD9wQnd93tE=": "399142000000", - "eHytJ8Ok6bB8YfIuU1i0e6Zy--Fk4sIadBkeE2_BpNU=": "451719000000", - "eIHrAexAA7EnMttmpTphJNPIE_KCxW9b0EJAbarDV3s=": "384615000000", - "eIi7uHYvQQWCu8Qc4NJE7em5UynlA7G3nyFx76jYU5M=": "6398726000000", - "eJBiwOzkKToCRNSycyC0irvxJaCC2wkwW0N_b5rPCiU=": "6167335000000", - "eJIZ4EG4nJyR7D4kHs9X7l0njeoHSVvyMAmj0Ze7nzs=": "918840000000", - "eJKp6bs_SmsyFxlfaAQ6V8BJ_ty9GXVls6RGZmxvWlY=": "384615000000", - "eJOMFczKmPWwpYrgXYRfBF0f9iMRlpaOIhMLjKKbeaY=": "480295000000", - "eJPIL8uMlg1uhU66kpMQ3nNv3Q28ROh-0FMI4J9T4mQ=": "1153469000000", - "eJU3vzuY4C2WPMn8fjXgV9A5wAtQtIBqUFvGbqLLWOQ=": "385507000000", - "eJZa441mT2LD5RGWxfPnaGp5D2qE6fRG5XJR4zzuRwc=": "2083313000000", - "eK8v6F_eEzbixl-NixFXf6i4oPTP7QAOKJsz9IJn0e4=": "454356000000", - "eKHfIxje5P926ilE4j2uWIRGocO256Mr1rTAYeiwt0I=": "385725000000", - "eKOgiQlmLC5vOdqTosDegFk1JlWhinCpVOlOyc9ntt8=": "386318000000", - "eKcOAA5B2S6wsiGJqKXW7FlfmYcbrnOirxJg87U3qNw=": "377379000000", - "eLWHShdbzKRwbrpqzm0ebIzbKoEELqXIZXkhO_EoGw4=": "384673000000", - "eLqP9k4v_SwYYd1Bu6YqqaSz0Lsw7a2NqFVQ9zYBLOA=": "1666666000000", - "eLt076A2jgEa4Bb0EFYIw958mFrR-gBcVolhzHFajX4=": "1640805000000", - "eM-RIl6VXofIGcl78d1so0fofu_1qJMGdNvko5MZM-g=": "406351000000", - "eML_ng9ehNWe8oj2BMI76gq52lb9EYKeLWaR-O1n5u4=": "1153846000000", - "eMmmKHq-NybTqh4t6HfiVp-Hgs6UscaGnduBmjA5Cdk=": "418099000000", - "eMrKquJYw4AEezSzS62OjKf7nAQOABtuZ5Z4LZvXV9k=": "1264783000000", - "eMz3sWz0p22BuUjt-3Ak4eEM5kB2Za7MKOpdYk1AGms=": "1513905000000", - "eNdpzESjD3b9rf6zYpsQxHsejUTT9SWmI1Ie2w0g6yE=": "1166569000000", - "eNlaloZWo2Lt7GKef1CuvbZc5EjrX5rZtozZl5kpLL4=": "416673000000", - "eO0Ino1h-6ePD-NBIwH2cH4Jge00zD_GiMbhVXbwBP0=": "576923000000", - "eOMALZJeyJXeAj4Yc_bJzboq5uwsAB_il-P_jLjIBjs=": "384615000000", - "eOQfSmoPslr5R6n8XMpVXAd-N5siCWFA5NVkvMT3FuA=": "384615000000", - "eOvqN1mjv1js7B3du7u9jT8uKydf6pNdcDEAUxh05tw=": "384615000000", - "ePFBOeXUmCS3GptbOyo6q5yjogShEGYFP-GP_PAPXuM=": "416666000000", - "ePzR2L_8F3wYsS2I4q850VxgutXSKOlknKM6hW_NDPI=": "3357692000000", - "eQBGHSC0iGZUZYTSkPoJDptl3pxEav9HaEefBilOsxI=": "461153000000", - "eQHxbMKiz2eadPGSlaiAMVZItSAQrhVIqg6xjDK-LKM=": "457494000000", - "eQVkLs9ijnXL3K-bGziPQuWCX7UrWMy5BNW_W74o3nw=": "384615000000", - "eQkOrjlPV5grWGhscZ9GqGTDQbfiXokrv0KEB2_v9ZA=": "1153861000000", - "eR_CqZrzeStV6-wX8TJ-WsWpP64gnrzSuTPeB7VG30o=": "576923000000", - "eRbdfkZ4VslRH4RKlD7na89muFHXfx6GBoDjTLMWxBg=": "1178180000000", - "eSnJOCGvkdXoHD-Z4CvQryWZ1xPKuGN2OM-8rJ3yJhU=": "1666650000000", - "eT7kKFEhiImymrvJ03JW_rpTXNelEpUxRt3DME3p0c4=": "384615000000", - "eTWaXxwmgt7EFPFRSdcnO_fDAo64w9UcAmw-G6_57Ng=": "2254165000000", - "eTZOm_5rE1PIKadyuIAOSJfPrqJJWoD4BfSXKyh-tFc=": "4470559000000", - "eU3YQI4GOHRANQykdgxvbypmfpTNNYniy4CPC8tMJeA=": "1923076000000", - "eUmBtExQequO-XhvYBjR1Y6NM7mXKeCO_rv_f7AVpw8=": "499795000000", - "eV0s5_lhZc1NhuZd_SVA3koWiXH261DM49PVAe_KpuA=": "384615000000", - "eVF6bK7IywyhA7ztEYzYVpMqOPtptUzzcu2OC8z-O1s=": "446583000000", - "eVUWRvgomVqoJpIa6NBreZEjOXoE0ADfn-9mSfihI38=": "452413000000", - "eVtm4pu7AEQvITQmoMTsEqZgte1YouKWDaHH298LnbM=": "15769230000000", - "eX4cNw-TrbVQpau8mAYNkh_OHGJxOG9JcZLII_vl8iM=": "1368801000000", - "eYJFvHiDCNa7lg_D6f80Bn8JWdbO9weqUDUv-niGFQc=": "384615000000", - "eYnJhdgbZSFudt8hacC43PB791qGvIn36O5xHDHIFHo=": "385509000000", - "eZ6SJq3zwZU6V_taxs1rBMwSev3FypGvqs4JJ-Ieuno=": "386432000000", - "eZAhW_EgE7IIhnqmU6tj-LInDHEvG1o9Zqosjd_Q560=": "462839000000", - "eZO9GC99Z6mA_9GlM8-g96uz7MNoTot0mtFLYq-aHg0=": "381727000000", - "eZUgVk3ykhknT0Cfa3sOT0MTbenVKg0TgoF0_YwsVv4=": "457619000000", - "eZUjw3NbUysMh--t13KdJBTGKdFqiqGwbfSmljQexrQ=": "385108000000", - "eZZuGS3EAY-xkB4P-pXPE9VhN7FqpXJnVGgeJPutHIE=": "391410000000", - "e_C2AHGLaNMdHx1DyPPhMsv5mE67srrHpCv60tgq51c=": "453585000000", - "e_GZiP3wIeQK690pTXJgqIPu1kztRyJISet16mo8zGA=": "3041508000000", - "e_Un4YpvgbnVpJm_RNkWiiSqUBbE_R4MyNSq0Fx28ag=": "769557000000", - "eb6SzzSEscW19INQRreOftAOR03_CMTcSl2ccTEASkc=": "382983000000", - "ebB5mOS4yBKjrA1hT5rt-oeWk2kzhXpKnFKW7C8SmuE=": "954172000000", - "ebN-LU8boR8lrRxbFvrqasmUuqdAbofZiC745CV3VJI=": "416666000000", - "eblz2DY0RM89WuYsashjiRl2eh-dH8kqfqNd78wPIK4=": "530497000000", - "ebzd-jUpLtRVeva7fG1sJA9DHOfzduI3hTdovLOs8KA=": "384615000000", - "ec0xKJdhcDZl_pCmtWmiFOcLFwfiK3_9HK-CZDrXJFM=": "382302000000", - "ecDt97K-qJd7j-3Gmd4UESqC5UJuePbMs-ifHU8NXNE=": "4890586000000", - "ecNgIkZktO5y8amZzac8IdCAB2T0wkKzcqs9RQNTQwI=": "382479000000", - "ecVuYLnRUgxpASvGqTY62LHTiquPg3Z_ajoBbmkeTe0=": "384615000000", - "ecbsPk5TKq4bLy5ANiNa5syeM_B4QQWYPF8NceAJgj8=": "1159720000000", - "echgLa02aoNp1Pygv5lb4tbz0bjJ3uoRT3OV_Jcl2xk=": "538028000000", - "ecrOcv_ZizqZqUZc7SG3FRoJkiqMHoCpNT5NKzr_hyM=": "2088168000000", - "ecujt-LmRjLJLHsMkP6NbXjNNfRSIwtrYa7OWNd73zs=": "460854000000", - "eczomRGKFJb0NVkM1BrDty0YVpZsmwhAosoJWKT33yw=": "385506000000", - "edJkjXi2AJcbWoT-Z52EMMkWgb_8RAnJ3wuMJk10Ii8=": "400250000000", - "edQTIUkbCiMGlnK0T-dq3F8Xg8VUkCc5j5HsOvVNxtA=": "384615000000", - "ee84HaKdf-C0rPRuSWc_0FXgjdDqmzmd7M4pc4X6W_4=": "462771000000", - "eeE49LUZu_Xy0M1oPAyFR8vFulzCsPzbgl_FZKeBnFM=": "385507000000", - "eeWDKIdLzFkcl8vMVwSgLTNEG6Uw5t9xQKTxezrdc7w=": "455600000000", - "eecBd1l07Vb2iCUPOaQz1uWhOWanqlFajPBnfHfhl7g=": "388394000000", - "efVl8blFiNKDKopu64diPyPd4_pZWyIPtDafl2fA4Ow=": "377652000000", - "eft63b_KoxKviLRtwU5xeDUkJEQf0hRUeyWGdjgs-K4=": "769171000000", - "eh41IvTY3palGTJWmJlijin7ZK-H-c8oyEUxAQRQXoY=": "1923076000000", - "ehKMD6POZPV_1fQ-6r06Uo7nDHT9_eWn4ulcUYRVNZQ=": "458818000000", - "ehOKDqaG-LeBh9NEGEV6WPL_jvzMOPgeYh1Yd3T8hkE=": "395497000000", - "ehamT93hhVLUUnuH9OSeS0LNk3Umdp3-jdk8eaBX1O4=": "461047000000", - "ehzH7cWdxKg5i0GMsEdR3hDeqvxdNjBzopLlFpVCtfg=": "833348000000", - "ei2ORwgDRviA6Xob4tQyjQKQVRi0j_-qaz-MI7eMtVw=": "461303000000", - "eiGYidly2G31UX3xuQWs4ZsfTelZN1FTKAthyebTuUo=": "456684000000", - "eioCHwHy2xDMzckhgkGxSYcCtqsr_lLVObFkWh9i_SU=": "833348000000", - "eisD3bMF0I8DpHNyfKMvVVLBfosz356kkybMZOnDaIg=": "387020000000", - "ejW0yBDqK6UMZWbZqUdPlyToktBTZxQa7u8ZOFel31c=": "501244000000", - "ej_n1m8VEdaGjWBYxNaT4KSmmzbEXMMfdfRsHksHG38=": "3846153000000", - "ejoYIDG4E086wyGEuMCvpq-Wo0b1B8znPiZqX8Wm6OI=": "416666000000", - "ejoppR-z6GxoXsv3Je9ZVmTO3o1iwU55WjtuDFigsGI=": "845123000000", - "ekScC6KEub3x7_NiVRqUSRzBWZFWi4uPdtGocALbFMM=": "668914000000", - "el1OTg2Dacf5wd7g2F1NN0oqbQj7aOglGGQsBo21fDE=": "769764000000", - "el1b4KNHRaE_CeavZPz1oQxuvjGB3rViBqRIfBXtIsA=": "384615000000", - "el3y1oE2bQ9AuimMUOUu8A4cQyI60V9MLRoQyYEGPyc=": "999999000000", - "el8mYNjp6zjWkssxyBoTuDAgSxgrj-t-CQ4xKXDkedQ=": "2056000000000", - "elFMpDTnzh6LJ9aDMmAL85AclmonTUo62j_AGoSB-KU=": "11016896000000", - "elJprKE_q7iTcme5KJCNUh5gYefaZLqrZ3jdh1K8oAE=": "3264034000000", - "elZAb5P415_BIvsH-xdJAcc-FdRzUBJnKmjH1nlf4nA=": "844474000000", - "elZzwQ8EoI4tLTCxOm0WeowWoGLhFhcjv8VmLZJu8NY=": "383965000000", - "em9UijfWxfwUzpXvvcFATQvUWGbdJ03fnwSxvKLnp-E=": "1175392000000", - "emDY69GLDrGGkUb4s4sdk7BfbJGRVV12P0HMIi3GbIQ=": "1918713000000", - "emV1k01FQp9elsd76jarj4c0QFmW-q6OPUT5CYoQ-os=": "4850249000000", - "en4FKDyFMwy2gUxgUVmGLFBBVawK8AQSTChDcvrNExk=": "377344000000", - "en4gdjkdhpDKGaii5E8ShvL_7_DJm7I9Lvnm8wY_eYM=": "3588442000000", - "en57wElW_hlUwPzdvXWpOA_daxWBclNvpM5J00-WP4k=": "3904888000000", - "enLZD_JsmFFjGhsw2NNo7Yh6XIMGvWq6-1tgCbjsCR8=": "464300000000", - "en_kcZkCDIAvIPCuM151-uiRIgdzUordVq9PbqR6zJI=": "5002813000000", - "enixS1BrsoACpwrV7z062b2oCx6UuZGc3VNap7zMYmA=": "2349048000000", - "enu6Y189kYh5GUiSJEdczqI-r68S9UlPBA87k5lZnQ4=": "384615000000", - "eo1P2_ldK4XDzRdjDRj5ogA0IBgJTkkQ0L5cV9Tjddw=": "384866000000", - "eo1luEYTnaCFMQiufiLsw2A7QGu_8ZKiDxLPamys9yM=": "1999174000000", - "eoCa_6E49uow1DyZL6DPaxueJRlaRmXLJzHDDsaMadM=": "562406000000", - "eoR74-fzvfCQPXv_1GCLgwIB_yASxyq9cP2tM9h9T18=": "2080561000000", - "eoXxhbd7v3GtUrmRyd-w5IPOyYTAMqHDiLRFs3o0zag=": "469479000000", - "eoY4sna48p30Pkp-U5FULoDsvJkNq9jEjg8BHRFwNuI=": "387261000000", - "eon6eL_DPO_pJznE20cl6MtwSybI_zMeJ_gWcz2Ziy0=": "1923076000000", - "eoq_uXKKS1wz3j9lpLG6jTRyLfbGdMpmT6YJ6Jy_5M0=": "595574000000", - "eoqr3J27mjDIhaVZGZ1wK7jcjF_z--GuraAoHipey1E=": "378404000000", - "eozMyRqL36WdpkYqINrt3NJYftd21ScRsJf3Ad5JaGs=": "496297000000", - "epNKDu-nAyGZxJgOC2qSIVYbAmHdE6ImitmWl24PfeM=": "451653000000", - "ept-ZqrB26kcp93jMj9zGw4iDJo6NDdjndxBeEYoIWg=": "383550000000", - "epwRFYth9xl8XCC8GCdhFPJDNmyRSa7w-6xWc5U4byU=": "384211000000", - "eqrnIOJNbJjGkM9mUAPbuXcr8S1_KzqR9gTiULhLEqg=": "4630426000000", - "er9tZZ6X6pm_UO7waANKmnOkqvlCU-d2L3YmvGtyVjo=": "1702120000000", - "erHSiuGfpsrgFdMYz3bL7IgT9ESGOtEUsZCBnlYF8HY=": "682427000000", - "erIrzbvYpappIPqO1YN9XMycWupDQoKUf18ji8ij0yk=": "3540305000000", - "er_v5SLvzhgRIcWB1eapNmoyy3QmVCqYisYBu-4_T9A=": "533495000000", - "esQvKtuJy8FWXMS0pfXNCcd9M40t-IGVCVGntw3fPXI=": "769230000000", - "esaLiTrr5z3BXPnJb16toWkpLRBgh8R_FnsLbzSCvwM=": "385252000000", - "escr-D-kg83YmiSBibfR6Q-7sQXW5pXJ8s-VQLNQmBc=": "101363636000000", - "esmpbMTvXwv2rhZ0FLVP-q7arYUOySQXE4aaEJWsTiQ=": "383338000000", - "esq-sTF9oostKX_3Kt6rEfFk5wRyO6foxqm1aiG7MRU=": "1148124000000", - "etBmxa-PHFlwSBA3znze6XmP0lWNy9xrTVrxG_uSuXw=": "385510000000", - "etLRTngUtbuj2pbPRwW5E4coduPD_k-K3PNWARHU8dY=": "2417654000000", - "etnMuWlcT-Vfy1dmmH8zNV4TAnnshSoW6GXTOSJQknE=": "1330594000000", - "eu6uTe8PZD6W_snaMCHn6z_lRkLZZqnMvhmFFBl1kfg=": "945669000000", - "eu9c-aTlcoUbrb62ub1Yi_zL9wYEI5XYvaXKoimFQkc=": "2350155000000", - "eulzYFYNSxALipO13YJ62A5zent0p3DmwtHq7mmN-Cw=": "455600000000", - "eumzllYIlsaptvZpdkU7JzF22v-Zh1R8fb9Wr1B1lzw=": "610405000000", - "evtxKeNNZ4EGDQVl3QthhzQhJkYyHKydhPVm1WfNXZM=": "4166666000000", - "ewkeynvCEXgzFOwSAVdLHywY2ghmQkiYnIckm241EhE=": "786413000000", - "ewr4XG-0YkR7UWp3Pp4R3n6fXAKQiwES2ZBgwDfuuhc=": "469739000000", - "exMN5ZhBRyM8wVqhg0fNWN0foBW7_baUzx5saYcZyFs=": "385510000000", - "exT_te2nAwvBzZIhnyiC4ktkHA7EszVi_wiVXQfvEX0=": "384615000000", - "exxbPUOTjjjd0Dm_xP-a1ceFg4IDBnnuHcIJqyhFZKg=": "1181818000000", - "ey3fyaF9MCeEdf6ukePVlomTtHVgdeONevvL_h9WK-Y=": "2314250000000", - "eyLsPuPUNCsjVeWiji5OQSwcJjnN7P2jWAhD869IgoA=": "454545000000", - "eyYFRqoitlcOY6UO8ODJ0IzVF8m0tXnBRKykskmJKYg=": "384615000000", - "eycRdNldZlb6UXeIH78Jrvp3IoyQEdegeSlCkJQY-gY=": "1119486000000", - "eydr_orztwFI6lHF1cKQXzpBgwjv15REM8tVdYRgmVE=": "389414000000", - "eyxNcv8G7eD3oxRppIQe9E3Uj7Fc38scad9AJowU260=": "3855083000000", - "ezCyqZFpc9I7id7yVMycQx5kAkrg1DyRmfDKtHBO8kM=": "384615000000", - "f-9Y8qXQOWD4v-xABbX1BhZuOuVkgDwmZHIe8VyDSA0=": "466542000000", - "f0Cq8U0q193deKG4nV6MDc9PTXWFRKUdPBS0d1EyuUw=": "385506000000", - "f0xPoZyjtinuX2ktBZ-LUHbct8skHxrgzXQjp3f7JEA=": "568601000000", - "f1B40SlgzGga1sOmZcHPuLFQ0l18M8Jume2OBmpiNBY=": "388478000000", - "f1VM4VFobNnJrmtPrypbqd6pXY0LAUPWsHBd41K7_OY=": "473265000000", - "f2ZMKDV1oZmqkJ59tI9ux9Ac_WQr8WnYjz0kef6mpDk=": "1000017000000", - "f2gXuB8tUFaOMq9CgpLG0AZLgFowE7i-5-wxVzN2q-M=": "453393000000", - "f2yHTzN8D5-F2rBWYYxEgyBIARv6vD7vnpXCoUZOp_0=": "452790000000", - "f3fzAiNphTiXuQVHi1Jyxo42_jRDWy8yIv5ymNWPyR0=": "576923000000", - "f4VYkOJ2qmkXIqOeqSUvCrtIhEpHwgSQQb60gDWP7Vw=": "462146000000", - "f4fIbPHVemsr8xN2urmkghf2g-Aews-rXVLeM7Z5k-0=": "454088000000", - "f4lBAePKrZfSGo3wKIVfLBF4izbqZF-d-1xGLTljqh0=": "446181000000", - "f5EglovKv4aHeI2Io-d7gYWgWjhh4UF3QrP2Uzw53rU=": "2016540000000", - "f5LVL06iIVbtT3FLa_RqsGVumlDhm-u30yM5SCgVt-Y=": "384615000000", - "f5YReoPH9n-hx5HhVhIA_rKR8koGUQ4YArnpNZHOSUA=": "378404000000", - "f6cKIk1RKvp8dsK0n3oFVPHaGALQMnQkINoLQa5BVwU=": "412211000000", - "f6pzuzgWkCUJRlsAkNH9YJJTSGbkAaWCp3kC1qAHTNU=": "1923050000000", - "f6tcWeFWuGGkVRHnxfrAZL09e6rq-wpu5N7mxMizyiQ=": "417633000000", - "f798VUoU7EqXcA8WhrWYDfXes1SPTiLZ00M6B6QJ2Yg=": "833333000000", - "f7A9yjOUubo6Py9L5GziyebEeU-9XStAIWEvQdAU_9M=": "2295482000000", - "f7XkxCO5xjKYyNkd_VsXfEkBcJb0LxnWFguIgGZgDp0=": "1581798000000", - "f7mbnyWH7qjCxGTpZReDDO_lCYLUi4M9tnNhAykIKNg=": "471919000000", - "f84qTWaSjc6K2qi1NBDumYH5I34ZGF7hT2abxI9Lthk=": "391305000000", - "f8UlfgfunLWK-JNjHUYpoOQeus-elDDNni6NjrrNa0U=": "4776060000000", - "f8Xp-R5EqPgIGo47Yv6RuCLutZB0Ui6_kfs8kstNaCE=": "598422000000", - "f8YD-NfUQ2hJlwyOmf_2OxgCUvqL1PlRZ8E3utZwznY=": "2250164000000", - "f8gv1a0v9JsFM9CCOLTVbsqvyLUTxYZXFegwg_hVauM=": "838332000000", - "f8qPg3nvIGcjePCDvMVlZkI2Nm1e6-AtBBl8-Q6lT5k=": "416666000000", - "f95YsHQVeCTMq_D5FXGr1Dsq92zVRXXs6ZNr2eV5ebc=": "1090764000000", - "f9I7XqsdSQ40cO87704VkOwaEJ0IZoY9KOR26FS56tc=": "418280000000", - "fAUF8AAyW639Wx6mi4GPMgVq84g_3F0uOaGBM0kNews=": "3076923000000", - "fAd-pDG8BQvEbBwCvoAg3wB6hM544OtL2O7UaaLqnGU=": "381591000000", - "fAj1YzT6xh3sFsiyD4DqNFEv8VR1C0xlRo6ONZ8KsWQ=": "1156522000000", - "fAjdpBylvkZvmW32S4QzOPLiKh6vtyVdTF7S8_kpggo=": "408021000000", - "fApWemOnPumnBddWESWNSEX_xoIVnZCAo4q4IIFKrrI=": "1923076000000", - "fAza0vft-LnM3kbHatiM-Q4pSXJbE4CQV_4_oZwyEcI=": "833901000000", - "fBMegoDW7k8hoIA0HB2vlrWg6wSLS1RoSo3hO0oDydk=": "454545000000", - "fBNBGQx0fJWuVdOClDmoillrGGb1xGiEuLaHY5INXdU=": "763607000000", - "fBtLA4snAG7xh2YActnBD4HL63bcr_vqH4NGTrdDXi8=": "458399000000", - "fCGMcFTYfqrS6I7nt2hpwdkxvUIuzc-GPI5dhrgeGv0=": "394336000000", - "fD0OgYM3Win9RwOgBwHrjiY20_3gmATmNSTtd2uqji8=": "3855075000000", - "fDGrHMeD5WsPskBcjqKgcth_IRNKhgtB5_kwullW20M=": "464365000000", - "fDJP_Lz0vnjcPalsyeLJYzIeNfxw2xKYoJqzGh-FGoQ=": "1927537000000", - "fDWz-hLghO9YxcglrC6NMk02n18s3HiXKW7MdGwAvaI=": "2645073000000", - "fDXQYSQniUkXoQKKfOO9IPLlPX8_Mww2L9UP_z6fm0I=": "911964000000", - "fDfikulEsXITpZjFvI-XFJZOFsVMlTj-6UIBo0VxmYk=": "1233257000000", - "fE1ejbPGxwdEjIlS78Bn9UHsEocC4xCe-rmhs1IomrE=": "2082775000000", - "fEJ3JyzcRKQSUqazbmA98GxPgfPVvonf7xydFc0_EY4=": "416666000000", - "fEK70XKGUj4y8a7zjbKFwuWxxeD8YU2NjslH6APDeZs=": "385509000000", - "fFW3qNZZp9Xv9ad3x7Aj2Dv129V8TNQdkrXMEgarGyA=": "387850000000", - "fFbXHPz31UV1NIrPitQg_UTG8mmYOzIF38oimB1rC4g=": "392600000000", - "fFflRp57BvsPuARmTax65VCkit3zpSX87v_p6F5dW9E=": "669690000000", - "fG91xbeR76xMaw_FYWSRk05_J8KhGCE6lRN71CWb6Ds=": "4627198000000", - "fGCFx5XuwEp0VYXzKiJRWwU435IrZi7M_hGloDhKREE=": "770867000000", - "fGXSww6BnqoICfGQnvjQP8cwK940PLIF_-9KyIINfwY=": "924302000000", - "fH3oVWedggwO9ytFOMTeujSXrPCDYKwNSMOEbyzLXNI=": "405225000000", - "fHWW13jX9bI8PBTgFltFpQo_A6djj12XNYWoJl4zEVU=": "457134000000", - "fHrNR49w-AHQmnKXQfcq2K9KHRNYHwIM30k_WpOryAA=": "385507000000", - "fI7GVjMgZJm9KK7AjJ-ypqEuqynZojGY7hCjm_BKszw=": "483750000000", - "fIi_7MwOswrXbDK1iRKbRurNqu-nCm9sk0sW949hjjk=": "3184807000000", - "fIlztTSTivcVAmIOBE6VrDHkt3N-p1c5esWxcFch-Lg=": "470605000000", - "fIqWo2rw0KmMOSGtadiddc5PkUecuOELcvlNjH3bXd8=": "1923076000000", - "fIvX8qpUA_U9wZfOZ_InZ9TJ8nKtHDDCdagIADAaarI=": "419190000000", - "fIx4FSEoy15TlLf8Bk0a-hsQQIVw-MpkrEHGee6cDhc=": "9999999000000", - "fIyBvMq2MtAiKSy3c7gArGmlNt4RvkztbYAVCK67_M4=": "912806000000", - "fJBHZ_n4FDMl9-WuJ8kO_AugJqhOHhmPmQntZAGKEPI=": "382297000000", - "fJWJvs4uAcK-Bvw8UZSzvWqcX9IA63bSSNcYf94FD04=": "4727509000000", - "fJd-y5wS4JpBqhhmL7LvhnL3b3BxtemhAAZt0Bn1MNE=": "1156518000000", - "fJpPLuVu8lFHLMwVnBCeLg6Q1Wy85mhWtgQidBLmdao=": "392121000000", - "fKANIY1EIjn14GCXu3iv_okoCzJbQtcVgEQxDHa1Wvg=": "384164000000", - "fKWczLbhtlAE7FbeD27zAxlymPWMSRqg84Fd8W4vim4=": "3846153000000", - "fKyYAK662pbzlrKmQjW1AH4eS68jCjjHka7t6bERgSM=": "454640000000", - "fLCs5kjR9pSsLeXHy50Luwx32l3cwXonCX5_33DP0hg=": "1923076000000", - "fLb50xVQCMybTKW-_cBBksX3hLdWb0u2mbzF_-UBv68=": "769230000000", - "fMZIrWx7j0sn6Dd7TLdRUO3_d10xHuBknS5BScV-mX0=": "464704000000", - "fMaroAwg_UphB2vb9ABbP4hCFGpOX4BBEkKe93uD-u0=": "384615000000", - "fMhEU-0J8YkN-rVj3r5_vLJ-cfsE4orW4sVdSKiXIOU=": "386022000000", - "fMncLAPYpfKpKCLCWkAml4CY6cExj5Tkd-Zr4OxjY_o=": "1153846000000", - "fMxw1ikrMOxEqiYFyTN0uhdcMRZ6SelHhBtOHhkGlww=": "423181000000", - "fND9S-O83kJUSsti13l-YBWyHmOQSr0OPODNf0dh-t4=": "379068000000", - "fNLFkcI1pOIbR-ZsjSazS9Daa0SMRykucbt0pY9yBaA=": "632834000000", - "fNR7WrVt-LSM8z632jXvp8SC7mTfYuHXjUvYcqjaVds=": "555410000000", - "fNdKEmoFf8ebZ6IxYv9FkQzo0L2JOZa6xqCneGKm-Nc=": "454354000000", - "fNqpMCAXS7A70J94qpaRQfE0ykzwRWWBUvpckDohfqM=": "5384615000000", - "fNxqLPBSDcYNf6-7L4fJjNLMApLpC7f47KpVzIwi5C8=": "821056000000", - "fP1AnAgY5tsA9RFDVEdAveD1spSUsKyJspJx_FPAcHs=": "411085000000", - "fPfX95Ug7kGcwHo0vkVA3FZGf5nTlQgBipJ0cKbhge0=": "2029545000000", - "fQF8dvHPzEpU_ks7CchZ1rmFHZu-OXJ9nGLzEQj0s48=": "4623902000000", - "fQxk7q479bTK_KpWkXKJmRVJtNtdv9nytkTl6PIsfzU=": "8329509000000", - "fRB8e5JlR_qsQIOBZximW2CWek2G77GCcABlpWgzk9g=": "769230000000", - "fRFXC66BaqxxhC1-YhOpapVAxUNpfzRyLDgVoQwy0VA=": "411085000000", - "fR_LAurbqfMqcHjKJNKHa366jU01C6X6Zoh-vr2ULPY=": "2157071000000", - "fR_WyyUC71_GmhMYXZ5jO3ZSX2XLvp9a-V4-kd4qEr4=": "366808000000", - "fRay2iegJZ2pYQakbSYLWkpDCRPg_VPpBp7T7p62p1M=": "454565000000", - "fRi259Qy82yFS1FVZgdzAcxto0fdt7KiR9sSjr8nJuc=": "440433000000", - "fS-ia_zI_8_enG0N3EbZJSZaTWSRBOCrLm52iIX_uAw=": "1153846000000", - "fSGv1wcL39NqpQZQp5fUwSZDjWTv3qcuqzare_a6QLc=": "692307000000", - "fSOQXDS6eWwJYzgXIxY9dl8kCII886jeT6EsYOzFUK8=": "494934000000", - "fShtAk-vlNZyydW06XtJT6z39vS1Fi5WzSmaU-0-_Dc=": "390440000000", - "fTVskVPNwAzmhQFMhzduTwkR7ULP-JhT21EgxXC666M=": "380221000000", - "fTiNLT9bjFz5k_ATCxF4HynvJQf-2bARpHbBllZk_pM=": "384620000000", - "fU66Zgp2NHt_TthkCRAjUCmIsIZuzAHm8LvbQAXatx0=": "383937000000", - "fU7kJcLoj29gJkrpbuOa2jmG-Qu2RbNAPQZpHBI-NYk=": "424379000000", - "fUHV0AIMXMBZqnSyBty7FWVgAudm2ZL57OQWe8n4bbI=": "454666000000", - "fUNS-0rbER-vKvBhb1M3R5hBkCqQhjgDdtXB69ql1KA=": "383194000000", - "fUUKBcC31gpVPJEpfjQ3RZV19HZ22p_0NtmKK4rMLlg=": "464933000000", - "fU_W977Pf2AhmGhJee3KSC9LqZ4A_-xzGrEsHtwJm3Y=": "754692000000", - "fUafCXs41tyJrSCBILJ7AF11LrrpKHYyD4l2f7s_6RM=": "1646440000000", - "fUblnTII3DiRKxLwayMHHf3OpaR_66EU0e36pQ8NbqI=": "929409000000", - "fUfO7i91GfkQzz0mGRtTvg7rPZlFKZiLMCbKBQSIVyQ=": "909090000000", - "fUiy4ENDamsWKR7U_hNej8LSJ4KO9tp8D6xNX_61U10=": "563651000000", - "fUp7vfsi6sFpidt0fvZVw48XNV2o3B7vsvIMK9IjH-0=": "3845830000000", - "fUrX3JxsD_UaQ7a4WfKZ7uI4-Y3sG318O9ufOhv5uxc=": "464007000000", - "fV1WT-Nk-PtdhCT24OgaYtHb1XqOhpNPMRuUZlVAZYk=": "633131000000", - "fVEqtVZ0wR8vk-cY9omYo4n9_LxfKPTOtyWxZmTNpK4=": "2780505000000", - "fVvkcX8oGZq59pm2VH4JNQH1rw3GNA5VxsvihuzixCA=": "3254576000000", - "fXTull3-XWpJY-4m9Por3Yc-DzEoMpCmnf_zlzs32w0=": "416666000000", - "fY7bSZN3Wh3JsjdmKc7S_L3iJizytC3Sn4V65_1RhqU=": "381436000000", - "fYcoc94AHiAcmrgO4e3Iut-nTFgOiyjrMMChODiEpj8=": "427219000000", - "fYgNZh7wOZ-5fZvxbvEYspkNKxzRYzdM5CfBGy3zc4o=": "1010700000000", - "fYp8v0YASBr4hEd4ddfXVkMMr4zPforAQSLKpGcpnVI=": "1544676000000", - "fZCyebWSgOEDcowt1aRSQ4kX2Px2QTur7xhedi4pW6E=": "385507000000", - "fZFSG2DgZEOs6jyHdgCiGELmAApxJi9Lfx6maAw4w3E=": "2083333000000", - "f_8Da19LlhCBkwipf8C_HmiIRSsxf-WY_vpnQM0_LW4=": "416347000000", - "f_Abo_rzUeB2Wbnol5JtRWE1HgLtxxV_eTEVadKJRfo=": "411085000000", - "f_RWvhJvsUjZxq8U8TiDatBYfiULJqeapW1S8iLTZQ0=": "391797000000", - "f_h_Kc0VTAv4EFgYyvsxVxk3dqg0YpbjjDdYjWmmLE8=": "814741000000", - "f_s6TDNJHHtWxnhjHnt9Gq8yCQkY4V4w-JCqf1chdoE=": "378551000000", - "fa06BBdEm2BlJNKnMFC4EGB1GbZOpcgtVa0gAhuwG5k=": "392336000000", - "faKAvQ4CCNHlypY-8zOQEbkKj91MXtD4BeQWMIiB5xs=": "383648000000", - "faQEvQjtcXPvjXy-Tmij5U1aOoHN3kHpSJILkNpB2AQ=": "1130445000000", - "faQfZLALkIziUIvplBDbG8lcozma5GA3KWtWUpBJBps=": "385510000000", - "faxfyGIFZpq1HeVIR-UHOZP7AqOhOjpvVnBLxa2jC34=": "359186000000", - "fbElgrhvH__eb7LNzUptuY752zAUnpOD1oZbWoxWJ-g=": "2556346000000", - "fba_HeBhaHR__qkLMVRVje5pbfA4kyvUPcxDVqZo_yQ=": "416923000000", - "fbbU8ed6ulHzBZvh1-VYYXsRMe6XSO0xFrxADs24fsU=": "384682000000", - "fc2VJj-WpMLbZKgidgUYkcHBa6OC3LYFKA_r4qqcc6k=": "2310726000000", - "fcGY8ZRZyp3jmVBH5wgOJ1q3wuw51SZxN35bqAuHV3o=": "460089000000", - "fcLMDiPQrmXU_pY8tLvFCUmj6kXIIIx8gEJudyOqee8=": "769230000000", - "fcYedxGDpD5NSKt1fZLVFd_EOxID2OGNGDS_-A1ILfk=": "563609000000", - "fcywjJNztWppcYrUQ2hqvkvfGvWkueu85G7rLdzhdYc=": "384615000000", - "fd9PnqQfck_7sIbhn_2DCqbL__IV5nqh1O6KRZs39xY=": "416666000000", - "fdHW3OggWlBTj5cvKurLwUr5-U_ksnK-xGbjENeAPq0=": "378341000000", - "fdPpQAvhDvRmNRAuhCV54ty9NQAKykOGckjmIFU_RtI=": "715542000000", - "fdwCs0oo79ET9-UVbiXEtzfyIFisL62FkMCGB-RFLWo=": "3684914000000", - "fe5jVYoXKKMPkqzOudiMU7mGKD3adQdIpnnSQ2CsnJs=": "385507000000", - "feSTr8xWansj-8y73qSV_R1oFOHvTinGzPZW9w_Fbpk=": "381632000000", - "ff-MuMRjD9B2wp6Qb080jG-wq_9WWuTCrFC9ksCnH9E=": "384615000000", - "ffPMLdJXks8Vsk7kxc93vZBiVTLfOa6BJ7Pr8kuixs0=": "826009000000", - "ffgB5p3mTbIQK_gUC-F7U49MyUSdY91FrNJaGY-UgHQ=": "395533000000", - "ffr48ATW6PTMNdbBx4m99-ey5KOXidHYb0WGfDumwzA=": "393828000000", - "fg-VkEhz1UEDjDRgwthkeLKrZF9HTGZ4J5mRx3XjS_g=": "552381000000", - "fg9MhDln_KNgowzFwT3iiN80NE0gAW3N2qcbqNC-9NM=": "384657000000", - "fgJdX6FnZviXCNKemwqOkgTV38OnMP2NmF4DLskeq2E=": "4994400000000", - "fh4ap9p4BOdvFeJAm9cHq2xW3ZysJaRQqgk5-9-hCTQ=": "499999000000", - "fh6Ge2yy5QEyArIOq2KKe6244LlTFKDK_yNsc1HnNcI=": "385858000000", - "fhO91i2w3n_abayyjLUakgG__C3GHH5JCdLqXDllAB8=": "635907000000", - "fiSSuxlHtx_1oUsUwttq2aR6PGazfJs9ksdMzM_Ldqs=": "409110000000", - "figTuH_rotXLph9QquOw_IqbYQEmZPhcJfT-ppvVduM=": "1248608000000", - "fioGipc1NYv9_TTAPlDEmcOlHFW5zsxL--VALDSSOEg=": "1681512000000", - "fjWNMSN0_OI1YCzBOKx1Xldc7kYUhPqqmDMqVbyqNnA=": "386081000000", - "fk8LZSQGOHkwWnE7oNQ9Lf1HbAQpK2CcWLsVwf1UPfE=": "2305724000000", - "fk9GVvdQSodskK4iWpDaqV6K1kincaLRIhvdiMQNb6I=": "938409000000", - "fl2dx3lEb5-5QehgjXmRNp3gVTqM3sIMoXhw9wx51Hs=": "390005000000", - "fl90zT5ZDF-AJZjqxuwHWmlOFwhHyhURI5iNEgrwvUU=": "384615000000", - "flV15y49bvO0bzzdOlL0l0bq86sP9OSfhF8Rwb58Stc=": "465485000000", - "flrcKp5mVN3d92cKwLQ6Ufxg3KUWnYsnnRuzJmZSKxw=": "385507000000", - "flyehCTVaOK36BqjLwIn1yXJNUfLvvQeku0TGS7d6cE=": "8230509000000", - "flzIDh3N-j4EOO_92ho0p7nmCF5HTgC3CyDR_LflpzY=": "454545000000", - "fm3TfR9cXP_YchK5FozzKytfcD356nOAfMmcxi7UzMs=": "961538000000", - "fnaosx4Qp-2GLz35hR7QhVpqNwpLUmF-k3MMXt189yI=": "4826419000000", - "foR6X0cZQdS7ghfPj88RnABK2VJ_6ZMpKDdIkQQhrRs=": "424269000000", - "foU8guNxaidZNdkybuvY28sVYthKEj5XSab4uuo9tME=": "773053000000", - "fojzDYbmTxiJM4h-M1xumeaYAi5rFltq4cBJbQWu_8g=": "2543962000000", - "fpPBrAwmaDU-7qmmku7yBW46KS1gDKuot3F-cXzxDNg=": "3750129000000", - "fpakXa3ca6F0lIOtpbUTC6gsz2q-BrOvZKw6E7jgeX4=": "450244000000", - "fppJIkOp7Fhde5AWuYTacFO49Z6cqlMK6eOAVdIJGQ4=": "451255000000", - "fpqzWyzwv6O1PVSicv-d6B4a4tiFKcETObCxS3x-Dmc=": "20833333000000", - "fptBWhCh4ddpQ7YHAK4soD5B9viWQw_2CTLL6882-Ss=": "1154247000000", - "fq9a6M0ki1jCxxgtwA4QHH-Qm985IGa24AyX70mstaw=": "909132000000", - "fqSi2YjIrW-vnRR7c1lNfiZOmKm1_lLoAvBkTM4Oglo=": "755466000000", - "fqiVtaNSn2J6But4m7zOdEOwL1YuNtBE2MgKaurHAYA=": "384734000000", - "fqmgWL7UeBFkGjRy6taf12xaA_lXP40Z44DMog9pVVg=": "388753000000", - "fqtZkf70f9bSTRvMBmK5df21g8d230V7gtAgqN-TRJI=": "425284000000", - "fr0K6LVx8901WWegtYf4Jlv4B3RTSdvcXgFsEzx14xM=": "384489000000", - "frOuBBQ-RhSwE-Vw7CuHldJHncR86yZUD5yxQXEqxLU=": "2471600000000", - "frUIXiHGMoZynK5pAw47ftyEGH2LkMlD0e_96UUr__s=": "1927533000000", - "frZbkFaA8AItHkPHqu7heAtQznfDojYN2k-MoCaNJhk=": "382394000000", - "frkd_7aOCG1-sLEacZDzx2AwyMrybyuh22FKkPe36Gs=": "769230000000", - "frmKEYeGW6nT9vA-gTwwjmaAmnhthb18lIqLjDrIrcU=": "1727686000000", - "frxxRvbILF8E4t74OSSSch8SqCNHoj1JoUSbNfkMDt0=": "384615000000", - "fsQxbOqOGufUsB-9rF_vBO95llFBBz_LVVlNkwG-UZ8=": "899480000000", - "ft7v1yQIvg3_1R3O4W85jmE4EveYdZkdQyROLJW--R8=": "499226000000", - "ftHjF0Mr5osEXspoAwJdPwzhYi07aG_YHGUqQzQI5ug=": "1940207000000", - "fu2S36x5yix-It92PBEiRzt6f9WvJf-kze-dMxKtzQE=": "456404000000", - "fuVfWkZbTAkhM3ZO0dgRzqZowVx3d-cGYyp5syD8gfA=": "1999999000000", - "fugmdzaqNCkKuPOrPV4cvpD265K8GMYjf2Uge79c3mI=": "425039000000", - "fuoTr4G_G9QThTwD-iWKn5nTvb3K68IaSpjxrqvpmD0=": "3108168000000", - "fuqOek4DD7-AaKVcA4NSRxCec9xtAQ78pCzbuQpLVjI=": "2083333000000", - "fvG_WIV8rdd0h96bH2LLil0G__p2VQl6qV7DfRqrVYY=": "358811000000", - "fvNF85HoWUY1OJeak9UpIQVXRBTJyJYW7gwyk697Meo=": "391257000000", - "fvtb1vTAW4hS4OOYRZAoNvvMVii0Ur-GARbzy0zhINg=": "453867000000", - "fw1aHDyXXHbdeeS9vgiGdvVoCIXGiiN-cn_ERjxFBFc=": "437499000000", - "fwGWiVIPgO5z2qyus7wyAc72qRiB-0gB6GzQ_2fQ6no=": "2310726000000", - "fwIVMZz04axGlQC7ecLhIhyVWzUmA44vmhQxx6MJk8A=": "422561000000", - "fx-MAtfSSQUAMK92nHXTZLx9kKQGcZMaTn-3O0Zk564=": "378319000000", - "fxEiLBrP3j3ytX4Y6DrydWQSvNxYDRNijajkJq6NWl0=": "1526806000000", - "fxHW4mF2JbR0tSU6qYJ6JxVu0LFNFt_GT0KgqLu9v-0=": "546103000000", - "fyD2RWDnIeZ2l6RZFqNsplf0_IeQBAWfFMIec1wQIeY=": "934718000000", - "fyHpaakteySn-9PMspHaVxmTpCHkC0AX2IL_STbKAMc=": "378090000000", - "fyPhtAB0mdxosGUF3v_RteD5J6vhVNlKNcopSSAPE_Y=": "454545000000", - "fyQxJtJo1NwrusnDIP-yTQBUSX350wPfrMJaK_tE-ok=": "417635000000", - "fzHN3ZQNOQ2EKnsHhabQIePu1a3qiiqe1mpombd9pSI=": "638477000000", - "g-IKojY8NVTbOvLdUgVlXOygQf8cay5rYs7WYowC7LU=": "377706000000", - "g-Mu4TU4r89mfAdWlVrLJgWnLPgSgTo6oLisnmxlMDA=": "1727932000000", - "g-jl9J-hprN_EUO6gW7BF4yBdkVT9ltXI7nDaezTAiY=": "492890000000", - "g-nMVOMafoDkgRmX11hzFuAbcxOBsnbGgvTR3eaksXY=": "452482000000", - "g0zRPrCtV0Fnk_z1HRz93aI-0ohgcYnqDYkOqhPkocI=": "465802000000", - "g0zl2az4docciIoiwzACu1V7gyL5CwzeksKngh5aLqk=": "1153846000000", - "g1EDybulTKJzNaJJD1Q-Kh6c4FCt3BC05ucEK_IbuXw=": "1843376000000", - "g1VxPqhibUd3ufaIDIKBwZqNGqBTdpZfeTWH252Xrqs=": "394336000000", - "g1q40yY_xRSaVB9TvKNCW04If45i9lZjHVK-xMSmhik=": "384615000000", - "g1rKHg6-6_ePe7qBn6KA5M2moLSXXeCYwhUKIYNSn5Y=": "3840937000000", - "g1rlgXHMRx2AsP9Ztnoza-PSx0CUPPjxd6BkisTePzk=": "396483000000", - "g227Ohgf2qjZBlU7-l1IpSRuAZ-jR-ArcQgIATy7h8I=": "1402573000000", - "g2akTiGxhhciyu9rQtefn5q9oElx7gzqwWlJCkTVbdU=": "3999999000000", - "g2eArKWYc5dsbTpXUMKc9TYJoxnldBZxP-UJc-tJP9E=": "1156527000000", - "g2sY9LaP_ciI1iY8NYblpSZJB5bOL2Yz5HUkZ1UsK7s=": "380301000000", - "g3DB6_pfCB-JhczslOMx2bWjZWRIhzNybUCQCRwGZgs=": "384615000000", - "g3L8SKW17wNbv6saTU22sgLqWeDITziFePl2H-Wn0ng=": "1408464000000", - "g3mbvEpgYBYMz4-62dKCtgkb6cGH65cFXCm6-cWB9RY=": "498450000000", - "g3txya2gja18XkUfWwPoJA2BS98j0yJYT7do78RT9-k=": "385506000000", - "g43qWBa7FlG83RUZ-Csd4ERArFw99RJDkjPMoyVhWb0=": "1982897000000", - "g4N3_9ERSmYSF8uE5r0SLrx5v3Pxh1WV9fDa_D_cmv4=": "385134000000", - "g4T11j0B5eRVljoSLitrngxT5xhunIK3sv6hEsJvpL4=": "2083333000000", - "g4i5i4cuMbm2JCaDf2h-txaOWBMKNi_pRgBFjDGGI20=": "3191136000000", - "g5HLmSTiiCkEz8tj-tqaiecrVZpfRlhzd5xIgO4moJY=": "763607000000", - "g5Hcm6BSTfRA87_6V7ehb1ne1n9qEyR_ssH74-5M8No=": "449697000000", - "g5LNofzi-6RTN_6rMBmX0MK9UmH4OD4CM3OXV7DcC_g=": "469739000000", - "g5UYweychQyI3b679JE1pcAEJBOP6r5wQ-zhxUelJGE=": "459695000000", - "g5_HTk39lsBQQvDuViXIT8NQHf1L7omS5mcaZzKzn7U=": "389258000000", - "g63YaMIkAuDmml0Mp8ooW-KvxwoRpUyzbBGnLU-ASbY=": "773477000000", - "g6HlF6kZSTTHZKf-E2YNO-oIFM1_6elkMrWCxxW1s2M=": "12035017000000", - "g6jvMprltF4W9BrLVMt94r_N05WtMF9wFajCPNtkSYI=": "404829000000", - "g8PuJptf6nKrix8KsUXdDeTjsaK7aGikxnV09yZWfQk=": "384615000000", - "g9NOsWB8PLgBjb7nBnLl9VKd4TWNOk3EvrC0bCiISNo=": "455600000000", - "g9w88U4YFh6vCUCyumSu5GofT6rHIZ567BD391GxvTY=": "7411094000000", - "gAMWxkaALEqMQw0SMcm13LXLdzsNf_UCK9XIBOejLq0=": "1946962000000", - "gB24yrfm_44O7nj2D0xiRsIgGglLPbStSnVEmwnOMEs=": "460976000000", - "gBOWz8K3W2P872HZzjD7HdWRocjbrzN0u3sLYmJuI_U=": "997197000000", - "gBPyrWTquOQJl3QIHq2WRVfL2ztLWIW5LK2XTVX1tpk=": "3962571000000", - "gBWAjnUc34rDQ_CdJaUvlmT2DPk3lqcnHV7fYwXx0HA=": "381802000000", - "gBmH4y-q3BYs8Sz0PWx4-XGNRB2xQlsS9yfxvbaLzZo=": "415384000000", - "gCcDLoKdpJHd78rOEuAmGVwIvY1ZTwgHxtw-GCU4lCw=": "994230000000", - "gCsfCKb3ddyW4lgQIUQaeUTKbuPtBDumWn42iIL3Zxk=": "1669362000000", - "gDdl8BwpAphMAb8YIpW-WPMjwOrXSwyTVP6k9rlqKZ8=": "2319943000000", - "gDjXue8vTKiNumUHqOrHttsS8oBarmUx8wA0-fZLUDU=": "384615000000", - "gDziMTJOmLMSLpS2ch4iUrZhb7-Fu59DWhEKae_Qt7s=": "4228231000000", - "gF06YmaHjoVHzdnttmiaANC_C4p25crDfuXE0TgApws=": "3084192000000", - "gF2OnQDFjd8JqiGMWwQDAFA1QW_IxnZsx-qiQgrWs7g=": "384717000000", - "gFUimjSlMV4fyeINgR5HQwHz3ts_QpiRDug3VSRLfQU=": "457943000000", - "gFbKPWrEgWsIP32G6qPli5H_nL47ydXEsco8eZ99l3M=": "396483000000", - "gFhqq8uA2UvaRaQrhvPX12UZidTlP6FYpFyIh29XfR8=": "1152811000000", - "gFkQZujbsTZRbQneCQ4JtB9Kml-zfeI-vvVT-s3bsXA=": "384625000000", - "gGQavdgK_0N4Wd2WY7HpQtpL3Wq087MnlQAiQikAzG0=": "4995144000000", - "gGhoIvJknlYTM3kkfePoIH3eiWwb1oufol4-PNJCJiU=": "1263920000000", - "gGlazXsCdub4o3DThSQXIVSuPsI5bAlB9Flt8JFMuME=": "1138584000000", - "gGuHEoaoCaA4JZgEDNUeVA8Nn1xWQbyvbTIGm371pA0=": "452112000000", - "gHE8GEIwoH4_dWqUfM6Ve6-DB9m1bvDteDXl1Tv-Bl8=": "384615000000", - "gI1Ui96vVBtAHmDhNh9z1rVKypYbphL2C_GwNkXfCjo=": "526112000000", - "gI5g6u1gn5H41-QkQh6dD1VYeGT0kBojEM5xk3mxQRE=": "384615000000", - "gI5yNwnF3NswexgffgYIfBY5iy7o55ngeesTGxBykBE=": "1156515000000", - "gIIXSgCPK_jfvwcAbH93XFI60p34ejRjes6_K5iAL2M=": "601290000000", - "gILJ3kDEbzzrHeXZQpnWFuEpmXVtwXC4Sb9l1VSBesg=": "1249999000000", - "gITqV7JV9jrBsrb_9cS3HSCPFgx5N8CXhcO9YXW4nzU=": "456351000000", - "gIZLWWC8kUbyZMdaW9MtCzp0AhJztS87suq27ixmdHc=": "985015000000", - "gIb6Fd_7qD8Wz_c7_znts30QsTlfBtok09xKXTtfOJM=": "383598000000", - "gIz5E99M31_PwaamdnzaLFYRn7C8PkKXsYpEHxSI0ho=": "1249999000000", - "gIz_Sma4MdcBzKLKb2NsmzqNMyYhyBZrejAut4TPn9Q=": "18995908000000", - "gJ-2W-uR5rZB8zcfb1HgFeSyOw9YR6yFrHXZOYyevxA=": "1235184000000", - "gJ1hgjwuVPAECjllPAptZHbKY86uRUnGhOLbDRCp_L4=": "384852000000", - "gJE8eN1xR1NTj_3-yVEnXmT14RYFi-LKKasTa4TQxTg=": "21140751000000", - "gJzmUXk6GfvsoMFpgScnhY4BauBE7Et5ps3P3xiqg8I=": "2774998000000", - "gK-g1Bt5Qp6TTndzKXYgdOpvFUVlUyVKgQy2VkPXYnY=": "457604000000", - "gK7w_QoUfCX4sgnT-YKppWxuR-DhPfGG2caccEjDcnc=": "388807000000", - "gKkTRyACiTj3_KWffAAbRqgr-qLBg_4h2rtBJNj820g=": "1887367000000", - "gKx6LMbOuQAkM_8wVxmx6uM0wZlNBt7q2BCGZfJzrWw=": "385209000000", - "gKxoSe-GyugRs6wU8UkBKd8ZOvKoyTTVzKCK4kkLJYc=": "385528000000", - "gL5MCNarlh2RszZu5yYz_5lHM0EAk03m5fxGDh5Dl4E=": "396485000000", - "gL8ADvdTbfk1l3nAUk6HhFWoN4X7PMqT7ZbqmIzU_Ns=": "384615000000", - "gLsVMIawmKKm2X5rsHBu2Je-iu59N0_rLmOXShCTEYo=": "2083333000000", - "gMQBuxjtF12HyphbRu4eb3gI5FhTtmFahy9HrbbZdzU=": "10416666000000", - "gMh17WO8FZ69h95Ex4A3w_SGHLS99MbKEN9HEs9w8pg=": "1923076000000", - "gN15EsuQFG4tf_9K-M_h93Q6Izfr2B8TY3udgtsS3io=": "769230000000", - "gN5536v95HG2YtKR54c86EtEZjER9W6O1gh4mQM8ZdY=": "515470000000", - "gN6oY_KUEiqibrsHzk7iCxOf4b-X9tJG1iaAma5GQI8=": "668861000000", - "gNNH7lsE4yHZptrmnMudCtQBdWvRutlwBodUH87JrLA=": "7685073000000", - "gN_yJ2eS6g7FogjbRYQiynb22tY_soXqhRfSzmsKuWM=": "392748000000", - "gNcYjNqq2GKJmCH9xXc96BIGwZoefQHINu_J3VtbrHc=": "413869000000", - "gO76rfNL48V3UEDzYt1-gFK3Gt8QDCJPPuSZIMK1JI8=": "512851000000", - "gOQscPdT4S3fHQV4animRUShT2X702MPZkWaekhHexQ=": "1937083000000", - "gO_n7no5JRVVQsAePeZGvXlEnLQEMCe2YYYxw9IOI8k=": "1681818000000", - "gPIql7yjAoy36JUDBFa6avUQWQZBl1K77jgwtR6QCDI=": "413274000000", - "gPJZ5jQ_7lzuJ3wiXvHFj909AGl1WjBY3lcqj-Dz-yM=": "753919000000", - "gPSiwaCc74YZWnpfAtL2MLlsC1bCjeEbhriW6NQ5UvQ=": "576907000000", - "gP_HpMEY8Vjh-xigJSYgeA9Rn2D-uLBnEW6HZeauxlg=": "523764000000", - "gPdIsZ0D8DxdS2qM7tCycF94uGYDaSFL5sKaSMGY9wY=": "1233257000000", - "gPqH7Urw0bktkzb8wYgMJo7NUXnPAGG9dy7NJB5YnFY=": "424045000000", - "gPu88Hd-XoP613X1At2wuX5iRDYtxTbByu-iyEYP6R4=": "1252898000000", - "gPwsA2ZFT3nzCG3rQK4mKBw0FDG_Fq2DztRU_yrQRPA=": "1921073000000", - "gQ0mdOVvTme2dfQCzzUeFhbkmb5Pl0ysLGxryZz6wFo=": "469310000000", - "gQ2ujfWcXrJOWJ5Rh5cr6dBBZP2WhojA8ISN1tbX9YI=": "793877000000", - "gQ8IGO1iqmjNiLioz7lGRyu5orhgv6A_7rZS23UoV0w=": "452120000000", - "gQ_NlxYSJKSR-4F7VfepfeMs4ZMJiN1oMCQBEK4l7Gk=": "2088163000000", - "gQcuFr2YgPr50xe76DWRBOqI_mJcBFSogBhzo1siL60=": "499999000000", - "gRuej4RbZJ1MJl3UUAUGjbgcAnNxV1VbuPah8RDHUzw=": "417280000000", - "gRv78joiOEvc6uFubsL_eDTda-zwsnbAPPDjYxEwthc=": "2499999000000", - "gS9X1GtszSWLawioeT1sCfTTRxosulvWnEXFO401l-E=": "1154052000000", - "gSAE6JV0muifNptQ-eBLV8QzY4dA-wLNHKpV6RZf8xg=": "1385142000000", - "gSGxlZxKlKsJEFu1zuxYZoIvUbgJhamNf5gE8UvsTjc=": "355133000000", - "gSYf2V8ZoBWz3INB86u6LYXNR2X78P-yfvMgQGEWnzM=": "1888241000000", - "gSqVlJSfvp7Kptds_OJigqWTPVsGIV7sp86cHGb-92w=": "2278000000000", - "gSzJ9fpgHStsMsGH4MH1JyIvVFiqJPbCWkk2YmKPMy8=": "390880000000", - "gTqcBEyX7wNzYTsLGT3eNnYlLvKQajvJZ9E9JXA-qQ4=": "753674000000", - "gUK7NVUvZvoCMqq2dXHGtE-nBmyiaskTty52wCY0A-U=": "448728000000", - "gUU_K1g6yyxbb7ipSAJ4Ep6pxpQnZuxwV9583Bc9qOM=": "384615000000", - "gUgpYcvx6VWuxGAP4U0bbg_lPPwQnBBu0-hTsVSNBAw=": "385155000000", - "gUhf4iRvLpD3oPovQXBuVJ0OGbFAa9BVx3vm2DHsCtU=": "391797000000", - "gUj2A6LcosDiYoPbnd8k7f1LapRBgdCwoU36W9ZatKQ=": "1514898000000", - "gVd_GLIc3zn52QLEIijZGjyUC6RbggdX40Jl9FriBCw=": "468609000000", - "gWmVLRwRmEkTX8I6rTk3qMO_FXfOwJVxxw3vkZfqWs4=": "1128745000000", - "gXpFm-ijnkEfE3e4r72vQcpfJ9fPx5pXo6NI6mFwnLs=": "55777482000000", - "gXyA5Y4e3WAYh1E4Bmct_CCILAoYioE7g2swizCfWnk=": "462146000000", - "gZIfcRECJk0dPuypUA_Fnez_A4ju1fn5rFIdxFpxk8g=": "405357000000", - "gZrMOo5LP8d5ID-oYKhUHUqL3dvHzQzphxEydIsURUc=": "385506000000", - "gZtvgi2DPDz_ygujYFJIxM11ORFwrBJ6-AEU3AJmJ60=": "4507424000000", - "g_KvJR3n3kgXjVnJGr-_tRf13kFISa_w8es0U_MZ4UQ=": "385506000000", - "g_arpp3mp-vQ5zx1itJRzRiWlQubTJv_xtnpfcHCclc=": "384615000000", - "g_bjfAZABWIKnDEkfK64bQ6OfpexJpzNSHZTLui9-3U=": "488247000000", - "g_cNTZRRWQBcR6wsamMgtBK9iTz_6pzGlT9hx_oHcWM=": "385507000000", - "g_kBP_FHAzZdluWYuPDOKW1ZMHh-YenULNuT7--nyxc=": "1666666000000", - "g_uZbAziLPmo2MnacpW0mSo2_-bpuiAJDPz6Ji-6eyw=": "453695000000", - "gaJGJDXurPKxzkKXFZmDWoA2uxza4kssFRO0B5tJZdM=": "384615000000", - "gai-Q5LLl7LXjDrQJ12QQcaa3O7jMqdMdPeIn_TdP-4=": "448891000000", - "gb1mBVOgA4gfnNPr6BrC3eCrwrNoCCYulU9Pqx6aH-I=": "845123000000", - "gb9gBWw4C3LVo3KkyXSbaQ3wp_u9ZMXWI9La3peq6h8=": "5097317000000", - "gbDE_qQNkfaDKIw1pcFBF0omCAOc3NxxRqrAL2VBUj8=": "3855061000000", - "gbcAQNptoRPE8afiA5B4R1-H8PEa_hk58ZMFd-IiA_k=": "452098000000", - "gbdRNpoqGfL1R093P42PSxfC3sGwpPIS2vMirggTV0Y=": "384615000000", - "gcL2zzwpKg9tpBDHO3V2QgdkhjD40igJEbirK34SG9M=": "767243000000", - "gcgOw1tgxpRuUS_vVifhOPb-D4utqe-j3b_GajpGfIs=": "18676081000000", - "gd9lpt86Y_oCdaLOD162TcGAfzr6qEqPzLn66qMSisI=": "411085000000", - "gdKH8xKxZ9QsTgzi0BNznHC7N6pNIXPvKoZ2utxWqBM=": "1923723000000", - "gdL4khbRV2za12DIGIru9tINoc26qey0njZP_0A2vl8=": "385510000000", - "gdtvxxFZts-sh3MJXGWICsrUxttwiSxTA0LmDZgRAO4=": "390975000000", - "geF_C7UPYy4wSgpR5uh3lcSJhEh2fL-vZXi4g8Z8sTY=": "636308000000", - "gegr_fa5V_TYHc0LlSWcTG-OFht9kbYfd1eYgyHIa4I=": "391618000000", - "gf06RD7V3nAQZoHaYQoit9euzaPCzYunk-Ec9x2YqcI=": "11445415000000", - "gfTfrDD4m5obXFoEV0CxmtF_Z1Bj1JkALw_BKhJPavU=": "1625454000000", - "gfbHYo8H38EzB8_IFyQ36tQXz5FR5vo3FJY8v3puWJY=": "458299000000", - "gfjnoBGodymFRO3vqWV_T0T-XplABOUkYwdqSaaKKfE=": "413869000000", - "gg7klEytq3cD3fZLcQSm_kfBqkJmD05wAfB-jgJfhDs=": "3900434000000", - "gg8nDoCToNr80cT9bWo94oltJs-l7_G0GEQo8NSLqac=": "3846153000000", - "ggBJIiJ-kHQS_iqhqdB0nKNoSa2oC-MNB-RvbB0bqaw=": "1248895000000", - "ggezZiG9NXEkrm09Qgum7TwCmwURQSgZ-YngZH6cfgE=": "781361000000", - "ghqcQJD7MhCy04wQrzKG3fQW0wUr8LfT2fSMaS92k3E=": "3275559000000", - "giN1TRfWPrndDgn6P62F1XlKeJK9GyqkMFLF5veS2PI=": "452324000000", - "giVzUqqsh8xogJNG266T83BA9IqGUkjVTE3TaTCY9cU=": "459906000000", - "giYc14yzEFDIywVBlHWM_3qH0adchyVrAMbr3SPGv9U=": "909665000000", - "gj2IO9UwZEtNIl4EEjErov5rB5f9GLg0usihanYOeao=": "380858000000", - "gjQBStOUc4KAgC3vNuBuTkPNyyKJNIcfrlxHxD92SY0=": "1398457000000", - "gjeHGpJ8skduupXdpSfzqZr3icDRb29of7s11QNfn9Y=": "1156527000000", - "gjrfuT_qcCWSuhrZ35nLrRt_p6mQiebfi12t9_Y70E4=": "876495000000", - "gkAFkuhtGnkd-sV-Li6ti1FthAWYmpwcfk03e9fbihE=": "1536823000000", - "gkCKQGj0bfDzVGz6z4YRRkrzbuf2ktbycBzeIoGInvU=": "455600000000", - "gkFYZlQKrcggyt7ENmUQVZGCTluvx-JoB-LZvDOdvFM=": "394530000000", - "gkNcIdNUzcZ_2EpzvVNT7hm6ZVMRc-I6rJvqRZTzpGs=": "455209000000", - "gkP7s-l9_jl1Sz6Ozb-075JvEYK0lGuFMb7LFTV483s=": "411085000000", - "gkh7wnB1PS-CVxIKDQqWWCceDbp_k5khDHL8h70xdmA=": "420448000000", - "gl23JN9wIwQnVRhJ8q8taztCYO2hZQhReA8EjzFViHE=": "386791000000", - "glInNff1qUQnR1C-mCdpddbQvzzPSZf1kNO41r4yQ7s=": "2311393000000", - "glT7snSYHd144bqC4TZNX98ZqrGqpeQveKrFo0ewAtk=": "7677019000000", - "glV2oQzyixqAixHSr29-KCd6f9FOAPhDDYBlRBqOW1U=": "4001626000000", - "glX27zSLkKgGMp0au7rfZKkozxxfov-0XuYFWcy9a6I=": "1156518000000", - "gli4D7OgHyF_i6rkcbXXm50541tj4LAkUmuQ1Ik9rdA=": "390005000000", - "gljY9ZKIaI130-tylD3hOP_DddO4mXd3iMFEv0ou_uI=": "1666666000000", - "gm2xBkipPkm1ZLi9DaceeBjHzPLRUKNRlMymesyouAo=": "771796000000", - "gmBjlQy8L_oUyc8G5IP7R_vhyRCqYQdroTopR99U3YA=": "3846153000000", - "gmQYP4h2ZeUJRb-b4Hu4omTjlRo-Jey-MJye3ISDRXU=": "655115000000", - "gmzxV4O9gW07Kf8QNE1ba-yALfuhlxcDERXR-TuUdfQ=": "405357000000", - "gn85IYIManIBFh4B3evTEuwnt1seu6jQ95xsz6tcGDM=": "421689000000", - "gn8kk5igGSHHjGNp36UUpBnafK6010ridZ_JRfG1M8E=": "4092499000000", - "gnGvxAA5jjoFv0xSBFIwifJym5reGHlKYKMMfboFaMo=": "457429000000", - "gnT9rSEr1B6AyUrR71YpbKgDK2k9gezU_KQX9qfSBPE=": "378257000000", - "gnVMhBsK9fBqhGsEvnyxFAHhxh3pE8ddw1FebLZuuCM=": "379344000000", - "gnoZk2b0XtwfByLfysEhwvt_N80LmWAikiGHw_wVS8Y=": "385506000000", - "gns3g57CI__9QVR0YSZ9aJ9MTq1pA1Y0B86qQzkfIe4=": "1166169000000", - "gny0geF8DvaF59sSEALWmHn5dHpjuGyMuqDbMYTCd7Q=": "768353000000", - "go1B32DkYUSB4DGQRhjHJOz7zJSUByhxjY4P74WJZvo=": "382394000000", - "go3fo8AzZWGZrtOm616XSJ_uzVcQTpxj02L3U69YC8Y=": "2291892000000", - "go4pVdfETpIxS3WNdmN8ZURUY2F-aagKl4oiHJR6aK0=": "2902912000000", - "goR2iDwQ_Rq19zA4zLGjQKqbDb4Vne6i8dc7WCYZXQ4=": "462146000000", - "gowx21WBrjwq6JRVjvbQBhuOk3sk8C6LrvAf86zTGmE=": "652140000000", - "gpAaXaXzvrQs_FlXqH6Xh9EcSocPzQNpQfv6HvUl_RU=": "2500079000000", - "gpcDU2lT0x8kaVlX4XHekUCppaXhCL6RNDfJj7iyPfg=": "4649536000000", - "gpeP40Yk7tO1gZVPMoo7CJ3lQsG6fujxLG5BkON3eu4=": "2662571000000", - "gpnohvdTl8PS344Z3SKuPI02oAWdEEZEX0Ehu3JU_pc=": "501273000000", - "gptm8I2xL2V15E4UAeZmq_eivjQIHwz32Hw0oSU2bDU=": "401949000000", - "gqI6SzPJZWN9oEwtnQ5LjAYvJqG6YAde34_GfSehg8Y=": "459858000000", - "gqaga9JB4Xdfxoc0h3vyyl1Yg_n_FB9q6pznDbgT7Ww=": "1249999000000", - "grYV7v2HDP_wxYpEf3r6_8IFCA_7AULet5TpLefM60M=": "1388590000000", - "gsE4lOyuGmR62n_4MWxaFRryuyqVcBYpF13uzp42w7Q=": "384615000000", - "gsuBzRj8JVjeDBsLYGP8agp8j-g2JKiN4s_JwRGqVxI=": "899364000000", - "gszZ6Tg5E1QRucuXkBKYkTTuGLlmPAG1RDFNZFGiUZI=": "385103000000", - "gszvjfboSBy0cBtuyrjIivWeLW0Y-ftT64l80fl1eLc=": "763848000000", - "guLCHQu0ztH2djeG2XIJp0MpQjYoZMa5X-45aYBncfM=": "385510000000", - "gul73ECrPneqJLbRBnaU6I8rsgxCFEjpSzppAk3B-WM=": "379260000000", - "guqVGyJ1paOl_JHtt82WR8WLJjfbl692vJGoCWOMfgA=": "455695000000", - "gv-mtRQQuFl5NsxFlNbGmNJvrr3oad-xksH3KwRKjNs=": "384615000000", - "gv2meQM_VESeNtR3Hm7UCU8P8GuoAFT0LFKO1TXWdxg=": "1928235000000", - "gv4BFVrHXUxR2z9wlodWOj-Q753ZJ5L5XxhQAH5P4ik=": "898058000000", - "gv5BSnBTLJkWgmggiKIIrk6Z5BcHp4hjX6kYMaWN0Dc=": "1927530000000", - "gv6iCJ0MqjKOgYej3dpSJGK7Q12HneGqNkkZutbj4yg=": "497477000000", - "gvCwyQAQyWzmzLMxoLH9ESPuZfPxrKLk5o_Oc65Z2Zc=": "10353080000000", - "gvEaRqioR7l6ZibmetII3VBRmiLMYDBe0mi4awgbctc=": "1153813000000", - "gvrtDcRU-kdJ4H1BdrnZ2okgoT3EOw7Hxnh0BL4oeHw=": "4327157000000", - "gxLYYI0llgAgZxdGZcn9WlW5bT5aIf-GJ2n0gnTBGkU=": "4176337000000", - "gxLzvmydBhsqLwKOAI51TAZoenv3DdEDDnj9a3b_19k=": "447495000000", - "gxWBNO2qcFazNQsUtPL-iWFVvZtPj8S3OBbUmaNyi0M=": "449326000000", - "gxghDTwomyKY6MXQuXG9_ztnB8eI3pnEeo6SOyPWg8M=": "382394000000", - "gy4B4qZavN01qruqElckg99qq2YP2F_O1Ayos5Z9gkg=": "1874999000000", - "gyJEjoyqOBkuMbtQGo69Rx0FTUC2fsnT-S2o5r94TU8=": "3090467000000", - "gyuwvw5IfU9EBbxb0szf7H3L1ryI5HmNVS-0Hs7TzGU=": "385507000000", - "gzITQqfeyyX7f0BvwtKH5GJRDYyacU585tO9YpL0twU=": "961443000000", - "gzdEMz1HhgcxK2j1tSo-XI1k8WOuPu17GlFK29eLCDU=": "450416000000", - "gzrrssrUMJvsfFwtTBKH_FmKKmWpk_OkaFu1vyOznpo=": "1823621000000", - "gzu5tB4rvG-FuxRmefz_JULzhiFNjHzoNbQT2pNv9G0=": "387829000000", - "h-7--ZnQhnGP4h_Hdzrt25xGtn6Ye-0K61pocbONRkM=": "783595000000", - "h-AhXX_HtngnVckr1nwXpV-zB3J1rdMUfz8j24oW_Fs=": "381802000000", - "h-buGcUoZwg4g8D-1SfEqd82O3IS_x2tlTXono-D6Vs=": "455337000000", - "h-xwl0yg4Aq8zrSumKi_sZ4JhXlpW8gKTwtj-h7vgq4=": "1233257000000", - "h0-pXxaKNCbq0tjiri7bFJ1nR9DCVuYD49Bj_rpo5Z8=": "4285609000000", - "h04KcVJLvLkkD6axU3Ym265eWtrM_1Om0be9wfny5Ow=": "384615000000", - "h0NMLKH3vq8VPuRX1QIwe4eah__X8nAZH8xPjy8HZOg=": "411085000000", - "h0sCkj7iptAgm3BE-F3APB1nYaaRe9L5WTJh0q6VMuo=": "2692307000000", - "h1LB-HSvXnXT067nvno9PH6QPn3Hd8qSEr9xhw9h6G8=": "406450000000", - "h1f6Xt0iha7zsigHpPPqC2czOiqSx00TspqRVSussQ8=": "684819000000", - "h1w2ESaVVEHmaVgCatlNtDrtt0vPIHIZMy1L7Kd4YQ4=": "848090000000", - "h2MVm4YAyqqFskfawflcrKlR7eeUodJ27TL1shuidPk=": "416666000000", - "h2cw3PYlNCsDlkbrfSmJyERQQ74OTahg3F-ZhxON_mc=": "446543000000", - "h2mtd6Yuaq3uzvc5sFvZ2LCNB8m6Vvhr7Ek_3HKDdHo=": "4782670000000", - "h3Iakb-JDSHU2khGP1ntYtAoa3NeE5BCp7nuaxts7us=": "1215684000000", - "h4JJUm299De0esMwDVZjg-7VVpKU9dJgM2YEmmn9CJE=": "909090000000", - "h4btlBuxFMj1XOF3YsI_CPSE8sX_stunGd7yBPORikA=": "2134438000000", - "h4iLxkaPnb7qhAQMZikgjAqj4oOMfxR5Imi7NHJgLoQ=": "460037000000", - "h4vM8q-pN_cTarkGOP8QLXXOf8oGI4KcA6hPIdK0Nio=": "416741000000", - "h5XTnID5k6z8NaKi9yifHKdaOCo5MOUJPxD1qG75oo4=": "453986000000", - "h5dNDuoSlIJBEwVSEPEa_ZY7A-rCA5HQszro_T1w_sU=": "384615000000", - "h5pLm9Bg10f0bNSCTbkNjoFFKi0Ytc7oEdbtQu7QxFs=": "451219000000", - "h5xOAzKqNEBqIO0o4XrlSkplP33bcij6w4P0Q2h1YgI=": "1411928000000", - "h62tGWh0YWwR-uAMCQdfGtt0JIrx6rwYUIc--oiXrq8=": "385507000000", - "h66EDP5pX0O4KKrqggjaeiS_2WrKRisDQADS_qMVt0w=": "416666000000", - "h6gF4lWCqnZzbLHuU0oI3CuD33wAlgChTz0ZvFzbwaM=": "431068000000", - "h6nu8cLVvNvPrENI19HYKMoNiRSMW6yezMBc9pUO5xQ=": "1153846000000", - "h75qhUaDN7-DJGa6xJBiv3PjMphyfFrUUvZrd7WqvJk=": "3226008000000", - "h7Xou4oWLQcNSWnohFE8ASXBOLTCYn6HxqcD9Tt4Qic=": "382251000000", - "h7XvlEE-fB67JMXVoCxeiynmtE8szol0hBN2d9WeNns=": "4933599000000", - "h7Ys1csTYuPSQuuYj-meWmq1oi1ZOnOobHpRor8wj2U=": "500674000000", - "h7eIp5pXszqSoRu6mEV4UJ22irHrtRRA-nXKg_bTcD8=": "408223000000", - "h7eVr8jcg-QmV7KHNxo46vSEQQ2ckfDsDlTRhuBtjho=": "384615000000", - "h7offVpF9lS_f3B8A3mUEc2VDH4r5aEgmKcuo6dobOQ=": "1926725000000", - "h8PzZ22-HcT0PlWV__LGydAqJUE9QSMz6vEUzLG8LxQ=": "384006000000", - "h8Sffwm1gpSuxfBTU4ZN2Lyw48dIzRFu8f3ZB5hheOI=": "1388517000000", - "h8di47ZzTuZpAnZ5jSncsU6x5jkH9eB7_UFNWE8gyAM=": "456716000000", - "h8fq99yVgYMge0t74btIGcykekNYnpmnA2J413BNjeI=": "833333000000", - "h8m5uJ4bAONqTmYYIKFjDJvSdiY5pzy2BqvJjRDa94M=": "379736000000", - "h8mlNPGtQOA0Gx2lQaiBEUkmh9k9tDXVX6dpJr2m4Xg=": "4711993000000", - "h8vQUtOrOfUqsCmzy6XLB0BOfzkXv8vVcoYRWpFL1Lw=": "1649378000000", - "h9b-JAIlMojMJ_zj42EPijAQ7dqjtX2zXPO7GbzWnrc=": "377006000000", - "h9cLcuJR9Zdfkm42IEqZtTsW1OPmtwbEpLXRpCGHhO4=": "4017553000000", - "h9sNmVI0hc6mE8ipf9P7roCv9Q_h_XYTIU3XQTyG4uw=": "384749000000", - "hA0Cq2HPKsU_n7ILkuEudIxbukNCuln8lMQKyy1mR6Y=": "946530000000", - "hA5XQpR5WMVsqjpH4RbxbdJ_BA1FfEKIp5FflGp46eY=": "386998000000", - "hAOTUqL52TwgI6J0q5u53P_TJZB7ya5K5-P6VILhhRw=": "549999000000", - "hAed0ZfVa6LklQhqQT5FC2uTC3Rc41taTIORDz7s-y0=": "941460000000", - "hAofcwDb-0M1N0bM0TW3A1C4S1QaRj0rz5GmxCrvRXQ=": "8231377000000", - "hBc89IiHue-loO1-h-8GuOQUmC3ubVkDVh-3Z2z9NeI=": "2065661000000", - "hBg4H8DwGC5m79BspudCiuxzlvBowfpjI_4Vdo9V0Qo=": "451989000000", - "hC-5MRaeCvHVLE3WAp0SRKc3RrlhGj64ZHIqOVVV1X4=": "769230000000", - "hC0vlhmDzr3pSCgvhvH9lFpt-4byVHZ_IiHejfWYw18=": "2058033000000", - "hCXQUZZ6LG20OiKJ2W2Aui4MDq1J1h5mS-684uvFA-4=": "501500000000", - "hD5rh6XrJv4RgG3ZspHuahMa7Ub_oA0leFubh1ShKkE=": "453420000000", - "hE1DdVrfOIzRp8Ofpi1LQyevzN7jNoMKW0kpe3jr4aI=": "1340993000000", - "hE1m3Iayyiodl_Lgk1hUfmbx_HomWajU9lvi8n0aMsU=": "417352000000", - "hE3-4udlPK1r4Rw4P6CrZqk0_cK5jFSrHSW93sFeLmg=": "384615000000", - "hERhSWEWOZdBOjaWrkaRFaiWGpgvpnyPlEMiWKBhRyc=": "488247000000", - "hEqC7e6ExFmjROqrx8srHulcMRECJ6Ha9qAnFPwIojA=": "382412000000", - "hEtD5Ln4fDOI3bActI_SC3EhAQzTF8l85GMi3tBu6bI=": "1156518000000", - "hExzT6w2QmVrO4_xOGYYP-FT3s198pFneHUgRzayJ70=": "817479000000", - "hG1eXYX68zC6wKRNq5--S65TCc0UR1Xi9r3_ay4ntgk=": "5792272000000", - "hGFQl5NapkpyxnjV0YxR752EJFdRfQ3tChtG1yuZ0Bo=": "454586000000", - "hGP9z8yCvk_ukyuZGY-A1wS0hImaqFzs44xg5imUsQ0=": "385507000000", - "hGkdIGFKiCLDUxD5BJ1v0jaSAQTuCH2mjPvsXqPU-uM=": "737739000000", - "hGmggVZ9CA39kOK_z5lHjYOy5RaE-K-G2MpXczPsFVw=": "384615000000", - "hGndAM8NNlieWEIYs44PPWNf61zNnjGHndFFz9aAhaI=": "1053227000000", - "hGpeCYEMlQF2JQcqMsVxrdilD-Kg7jQ77ZTfYn4dj8k=": "384857000000", - "hHdJG0mRnTlCrf6VAo568gbJAbD1KuN-p9N5LC36_I8=": "461858000000", - "hHdOiQmOqGM59Pgp6UWramejni0JgobkU96aT9riRyk=": "384615000000", - "hHz3d6AEmPD9m9d1uSNRtzcgFzApI_iMHPYh7j1mq5k=": "385528000000", - "hIbLokrZk0US53k_-pXdgt4Tuj684I1veY5gGQlQc2I=": "384615000000", - "hJ-oVNj0KQgf7vVDnM08dDqQ6s8Ukd0D-CVbV0qqQpM=": "623076000000", - "hJ0N3_MQBZp4XfUf3OwFO1Bd8LFRdw4FUP2VQDLpCBA=": "381802000000", - "hJWaKduIErDBBc_H1RG6_HUW2cAzGTDnE4kYBEapq_c=": "1558011000000", - "hJrsuyhT-Kly6qyyInhmC7Jj-3OcYG42_fWujDiGqsc=": "826222000000", - "hK15JntOlByT7xGgcWrfiOIJoUpbz8yvrld0p5tePPM=": "1386434000000", - "hKFrT4Uu4AwWfVGPFxOFjnfK0UD6xPBJuWkkecUXS2Y=": "766914000000", - "hKJr8A9VJhdGEriV3B52a-sSp-awZ1JB5vVLp5MDDYU=": "385473000000", - "hKUXkoxIQC1nnwhfwu5ZZXbAZFh4EIwKEvppISPMbao=": "460374000000", - "hKhwKdUXbq_LRl1tXmWzoepOyRS8G3rEoOBbFaZHsLY=": "1364611000000", - "hL1nG-FOgb1-QatUQ4QATaEJDY5iTAVDfg38Q4D01Bg=": "1627705000000", - "hLPwfRMtyO_u_vgnk4iVthxOTQRwE2kvCgULifPIvLE=": "10552980000000", - "hLS9SK7-rZwvRIvc3HcoGA-xOVxfcEkZDkiHVwX6Fd4=": "1940588000000", - "hLdwn1pHGgkjyEorTC9XwVpzf1ai7dBbneGGPCE8D_o=": "4167939000000", - "hLnO8YyDgLkyzeR35o20FJ2RGEmixutS6ms4RjUODNY=": "1377392000000", - "hM-IQRufQNaoMublQR3CkHkLDRX6IivYNxR_BONmZy4=": "41666666000000", - "hMGV13NU93LwWGUQ8kVuTTaF5HKhv64kEmShqAQBUpk=": "407808000000", - "hMQZzBMXAoBmkzv0PeWRpJLK_Q83-hwBaU2DEUm5FuU=": "4221020000000", - "hN3Uh7AAlw4wbXxpDS95ybJpJss-Z5k_4g9tXPfA2nk=": "381767000000", - "hN85Qi1_KRZFB2Q3Fm4451-6_fQvN5F9o6VjjK8rd-I=": "1901426000000", - "hNo3T-3f6uTYob9y_nbqOB97fqc0jM4L1t-wpux8Wg8=": "719127000000", - "hO8jvsP6Q7iKq_SGthmUOtsq4J3P_CtVLXXdXlvINSs=": "408021000000", - "hOatb6zrdNFyKNQ4rjlGAs9c_iWit_IZIrthRQVX9s4=": "578358000000", - "hOszjXwHJnnqry7tdmBInMqPNq-sHTAsiaSI7dtZ7ls=": "390141000000", - "hOtCUT0Fsk5CTyQpz1gR0QnfTnapjwHVfv8m1Dso1sA=": "455879000000", - "hP-iiUTph2KcsLYPqTCMN_cjfSaN1Hdyce0skZsg4hU=": "385155000000", - "hP6nYgOFoR9vnvFFIrH5GYN3RE5M-Av_fbOf53abUD4=": "501234000000", - "hPPmGxzxUb8kJYAUSptbLysvlQYyYa1gT9dwEA240X0=": "385606000000", - "hQChtd6-LzRDJnMVyuD7VsQjEv3e_1H-cz1EIPKOG14=": "2068256000000", - "hQVAXb-HvwtNeMun-ckWTp2cMfQw08I40uppix2IKJI=": "453003000000", - "hR13wXw0f22oullU3ecrgEsgmApqITBFsywlcQAtmwU=": "404011000000", - "hR7BYkSVxHTzsa4ctwJDmS4DXKfTPoYml-NxrVd21H8=": "416666000000", - "hRB0uJYExfs2pIResLCqcrANwWk5SUam2-XRbWoaS2s=": "389411000000", - "hRj1GDnehqB0iOZdchIH3Nf-Ce6rgLmqsBW4HjG4FBM=": "384615000000", - "hRshxhuc_cwFPgLjZ-tgIB4feqO0e2HBkUfbLzhug88=": "384615000000", - "hRya-7p7rh4UUtc0HiG2PWx9iEiJ87SR5UDXMw3hSlw=": "385146000000", - "hSAmjKuHAqBLrrpNveNqiRFXE7K2TiaGxu7MYEhOmT4=": "384808000000", - "hSGP2c-SAIAOdm3Puvp0tVFU8A2SRhoj6MGcov6esig=": "1543356000000", - "hSIPg1_QPU7Tv_cz8yLCOpRj0nWkxw3j1AIOBhD7lJs=": "428023000000", - "hT9lvUCABzhLFqEH1wtR5duA5WDy3xCgzE2NGNnWhnk=": "446658000000", - "hTLeuJLk0ZwF0L5ruz88WVe-tRMVBe3ueHMRAR7WCew=": "454545000000", - "hTapbSm3q6DfGpPC22Lg3n9myVeEMiUVahTi7ToNBxA=": "1363636000000", - "hU1B28IpPae8kLsHc8VJV9LZWTGbkvi5SOo3AQqyzxw=": "1365374000000", - "hU82Ho8uOCiu7XtgG3qKJucogei90Bri4DJviR4yZuA=": "383422000000", - "hVJSFW1mfQMcntsHsWHjvM1ANn2AKO-MNLTROpfxqLw=": "384615000000", - "hVkw0820tv50-OzLccFN06hHORh9BY_2NwfJzLr8UaM=": "1269294000000", - "hW9V7gb5F6r0aVnKBjiAvDaEwdKbBJsElm2fG4koI1s=": "384563000000", - "hX9la72rkuZdXrGmQKBpZTetmg5KNnmz8EwjE4j7hIo=": "1339521000000", - "hXQiZJ6YM_v-ArXPaJMzNZTPtqtNMHVYqBlxgvN9n-k=": "384284000000", - "hY4LwS-JFcyc0wI8nI0Icv2YFpfl8nZik1AEhsYrK58=": "384489000000", - "hYBD8rySHA8sybkPQhSp3brs_saQHpfg9SFmjDJjU1g=": "397332000000", - "hZLwSO5ymIn1Tuym5gsu4mCLZjOSd-SjCUs-uK48JzM=": "2884615000000", - "h_J8Ca0xBUQy5Nzvho1g9ydCGPnklPhDENitqwGRz1A=": "417744000000", - "ha0Wt3rzoGIh1gZ4_vAyHVIPii7HGY3VCA4X8KNR8Mw=": "550159000000", - "haRzE6-UdLuxjm3ABdmQgCvNOQZG8pddcG6v2e0pUL0=": "836365000000", - "hadwCiPF7BFz7Je4Po-ItAsySICOv48TtJXdYslXCzU=": "376159000000", - "haooU8er3NCmHmo34cdM_v2f2GLHpMu_RWmdujI44CI=": "450042000000", - "haotuIA0GT-ILm6SzBi0sILV4wNWK8UzICtso3cwVY8=": "1075671000000", - "hapORzs29FyfzeTvt0wHSFYvRxlS3Hz16M8DEfraRgo=": "2088229000000", - "hbNwM2KHnjiv1z1sme7oGSM--WafRcOSi7pTkmqr1FA=": "18470349000000", - "hbkec9eKy_2vbBsN-16R5feNhlpEB7ROupEeDkzWEL0=": "499999000000", - "hcFJwG7IRyX75FzEfiALP2AR4RN2hsGPrwLqNAfGjKg=": "758333000000", - "hcTe93PRx9dKhsRlboVyFanfU345gadWPj-mNWWWD5g=": "458901000000", - "hdY0Vjm_Ehfp-EfBAazwPpP1E4c1YiBf6nRZWtcrkTg=": "500702000000", - "hd_rTChq167jdlShjpQ601PoRTfR5-sbcEgM707sXvo=": "625195000000", - "hdtlmJ0qkGi177aKDJcfUbZcJFuGZoL8tMPD6hf6BG4=": "769323000000", - "he0GWGTsHyXCvRTCA2w2l0FRPsEEhp835GKkinW_a88=": "454334000000", - "hePJvtCKSBju4vwJfWa9HYkc2OEKkq4y2SlxywWNM9E=": "3844080000000", - "heugvmUUPTpXhpMYMxCMljtr8LHzuxFR-p_TzP6vRZ4=": "6621492000000", - "hf0a7RrHnlcCaez4l4uAYLMfoUyQYun2jo1dR1jJLUE=": "939847000000", - "hf7gELbJ64GfVKXxSc5lDhWek5aVK_Vz33TduSb9Ntg=": "502779000000", - "hfLgv5SxbceVQhwqVx6UKav9Qz5tGKQZtR195bFQiPY=": "3855074000000", - "hfMbPyoXFxy1vmiJP9XBjLEIHfa_fLlMLidad09u4Ko=": "433628000000", - "hfNWx-IMTgeJRR43c4VAk3EwHP_k5utlv4geZmSejk8=": "423470000000", - "hfXqzp4dgq7ZExnWyfbsB1txYn6hYIqMPLUDGZlXEdc=": "1552795000000", - "hfnFt4wHQRcp8MlRG77ZDC20pHJATv8Dqh9fT4w9dfM=": "381642000000", - "hg5nLu725IxSmbB4WDQbAJscrm_maX0mIcyvs0Goa5Q=": "833333000000", - "hgBMJaRClF6vKSx_fASxCXpsZ98empLmo_6HdTDiFAY=": "454983000000", - "hgFd9b-VzWw8iQBNFPJSt4KQzN3bJJJki3ZLsy9Hkeg=": "417634000000", - "hgPxvkEVA0Y6cYdPTVWBvWBb3ILtiF77PpL0rTT4DZc=": "416673000000", - "hhAtDJJdxYiAaZdUny7H6c7XfWqYVBdQy6FHjeG6U5g=": "625195000000", - "hh_ZyXo2-CEMilylDbIhq6DIMkwKxfVfROGyqo7-VOY=": "11441444000000", - "hi0QVkYU8znWiUpAYAFGoFlatXkgi4cvk-NgPwf65DE=": "1542446000000", - "hi2LbWQIiNVep1tApcLRyWjujXZ14vB4kXj9fWGK12g=": "7775625000000", - "hiADtMHxbWAZfvlruWOsWgRTfQNPNyHEYXwvFeRKOu8=": "504260000000", - "hiO_cGDAQa654dl2ydqWVS1WWQWR8t7TdIpGEXJN6Hk=": "814467000000", - "hiWl8a1x9GsRf3mk-Fx5A2FSzjrLqnvCMs9ctDrZ4vk=": "10255703000000", - "hiXwHIDZ3n0dgl_xnbLBfewWLifyhV7bAFaTScGcc0M=": "435610000000", - "hiYfbolsSwAGkuTQIbQ5gEs_NAWAQB2yfZEtSn8yIM0=": "391797000000", - "hicJTdyCpoQ1Vo4mPFz0lfOiVeUdOQABLAnTFjNdttE=": "422775000000", - "hiqpvxJTH541WikoRL6nawcQQjyLMvu5UGUd53CpEWk=": "460976000000", - "hj1khGrt0LJrzyMyrcdlzHrdOLdxY-01GkESQhQcRho=": "9099144000000", - "hjRLogkd8mai9AQbnWJnsQdidDeW9W14g2Yd6xN1MGQ=": "489140000000", - "hjUYlfxcKp4nGloHgUiucFUBZy0PIa5DLDQnV-262Ek=": "384615000000", - "hjePGewNuo2Xf3b2RF3Q6mnl2QGn1oljNwYD9_Sppa8=": "384615000000", - "hjgda5U1VCncq5kR2vy2lzVakdErI1MfSSoEiOTCrB4=": "3635533000000", - "hjklmALeEVbQSJJlhLQyfx7mFcqLZLrMwL0jpBGZGrI=": "1265746000000", - "hjziL_JLM7VVSQ-_T2HW4iGkaDuiUDjmLfU6SAU7h2c=": "384615000000", - "hk5zT238k_gGkTedxJg2UqCrlfgFXd26O4CBDeEg0Hw=": "758689000000", - "hk_TdnZjrvLp6gT3X45_eWfvNJe2ODOnweFPAruGNlQ=": "514411000000", - "hl1wjlTby8a_8Oq7oy65jOzmj3yDOsNeB4sWYCIUwG0=": "769230000000", - "hl2q5vWxs0qt61CJAAawcB1vUHoo1Form4omSFn0sLs=": "24871719000000", - "hlxfAH0d_4iq_d5vuMgrftKjjqW1LiM2Fg6lGrirz3s=": "840967000000", - "hm4iqzqGcqzmBIxK_FOamLhGYDFU3Dks4lwck29WyjI=": "1682949000000", - "hmAM3435-y4yyohzogZzLP6gY6A5e7jzv-wdDtIb-l8=": "1250664000000", - "hmNVtuM8cu2ZVvMAVB2ylmgaH9Avm68_Qu90ch8CClc=": "454545000000", - "hmQSZHIotiXZFxAp753yTS-eAdnZSxP0BawJcSfjBf0=": "455003000000", - "hmpeuMjNq_pOWvi889-nbStaKnnywP9J_lHeOQOFPGs=": "390818000000", - "hn8kk2q_MuBV_vmT9Nocx8as_J5BXELFATvmAacZZRA=": "470139000000", - "hnHWYI8YyBg942dxFSoMfV8-uwLOFhWQK0kVmQAvgEU=": "833660000000", - "hnKmAChW0b_k-AlHZBp2yuRG6PRUvCrvdTbymQa68Mg=": "2250753000000", - "hnhUjLnLmzzdNTK2eAwLfWRo3jdY4TfgyFnpH4gaaXs=": "5706009000000", - "hoFZ0GjGac9Tb4gU4MYfwOybFJ_dZxxvQScnVXzWWNM=": "1223425000000", - "hoTu4_ptq_ngpcvmDOk5lixMBz04OhOpk5uqt1XK0Uw=": "385428000000", - "hoUNxX7iETPq3VD-itcH8hSbmH5BTi9ac5za4oFyNrA=": "5384613000000", - "hogQkKHXZ6vYTFO1_r5H1Uzcq0dvK9smtld54zSVSjA=": "407808000000", - "hp7EIHnyzwP3ak5m7LHW_tWDrsJzH9YDM3ZyaKM_CfY=": "413226000000", - "hpXKgypjVrOR2oiO3LxYLEub702RFTrsBHV09XjwDcI=": "1258135000000", - "hpmhQH7l2eIOlp6SjBXSYjIoGluQwgnYP9xVvX-gucU=": "1274767000000", - "hqF1Q6yjY1VxPcEZfRX3yxDVqtUorqwS00vQ7TniRao=": "380708000000", - "hqQSS575v1YFJlky76AdYbcxlVlQATcYNIlqRszn4kE=": "461992000000", - "hqQbPAOY7BEiKEh7AfE1jNh2U0Y-WKUrn3NwiF7a9Zk=": "469528000000", - "hqTInFAPt53mzU-aQedNg9aRos0Y-MUyMxRyVyYi37k=": "384625000000", - "hqUVxevvaik8ku8XOgXq7XHZtAgrYgVnwupWgr9RLX8=": "411367000000", - "hqluxGzvawzBOg1_CKRDtn4ZR4GBBUaVmQ-Jp_hqqG4=": "378257000000", - "hr4s_mZbkosPaOrttL4nSWsx-PRe-bIU0ImYLfMCzTE=": "473331000000", - "hsJ5o-QdgiCJPdQkW7MUN6Cj1tchxquoGu-Onn58pVU=": "466900000000", - "hsRwPqMaV4GPDtzNjnkYxCDN4FEUUPyezffrLiCQzmE=": "4193243000000", - "ht33wNW5h8jUzSSzgz5QPv1dKYG4m1WZ1RGyk9dmNK4=": "378966000000", - "ht5VFKhZqZgOxe79905CYihYmntEnYmqI4l46zpnHvo=": "999999000000", - "htc0EOtLdUHBbxgulL_gkhvOCLxXCEgW8yJukTxcJZE=": "377410000000", - "hu-FWSm0nH_22nEApGEENgJ__B-nz7QYcIc_c9iP-7c=": "417634000000", - "hu7oTTDfr046L1fo-ON7NzQ2TEPC5kjBPLpE1HLbl3w=": "814467000000", - "huGfZdG2pHKANoDc9hQ5PdvF8y5Ls5K6J6YS1BUamns=": "383483000000", - "huS5a9q94OzDqg2QxKcS_0QZqpcKetDdXGYOHnFWZrI=": "910118000000", - "huUSjYMW8wXmOrGarU6QqYznyhqTZHy3I6Whmo9Vjx0=": "384615000000", - "huqZc_cLKbn6EATcYeRPZi-0U7_HbLHC-9Z5sEMTeLY=": "521654000000", - "hutoPC2qeOBgr0mH_yfKAV9rOMYI0g9kxO5XJi0lnX0=": "961538000000", - "hvOKcJUJWeHoSbB5enk1v2n-tpB3ShDOb6YtofAVjfo=": "417637000000", - "hvR0Idz9fmKCL5XZ9fjgW-ieAryk9-NnoOOTCOzKsLw=": "411085000000", - "hwFjNsazTN6byDwGbeDKKuhBhk3Jm8L4BnyAt8onfG8=": "416666000000", - "hwLc2vz6g4f5AthIG4GzW7YQOGRiCEc2ry-zAdjXcEY=": "909090000000", - "hwUS5NugciabR-_QSY92FwiEiRgS-Zx1ZWmCTLp2VEc=": "384615000000", - "hwZW23i7ocDTLxPSYB9aWlc62XK9BQ81xa_XiZEiO3I=": "417520000000", - "hwhvYXWNmRsJjLAY3VM2VHB3NOAEWFBduPZepVsZE0c=": "384549000000", - "hwxxM-sEyWwJQJG3ZJJvUguT3ZRjPEOQ8spisctjmU8=": "4076446000000", - "hx1CfgxelmPBnTWB_D5c-XOuNaNQWUCvXybxFxfxaio=": "564372000000", - "hx4uuJrqpIn1onrueA3b45EZH82wH8jBAkREbMmqbUc=": "452201000000", - "hxLbr2XeekJNat-X8RNVvWFTburRlHZd27EAvoDrqzA=": "755163000000", - "hxUeOKTQmAFPqPrFoqR1RcKEH2K2hanvyYRlWyevbqw=": "753800000000", - "hxh1X_jgayj1EqlHN0rpKE5GSaNIM3-hG9SPILFkNT4=": "417630000000", - "hyoi7FBx4I6PfYRXeG5NU-Cn1lNeOxIY0_tYZYOLHLw=": "830545000000", - "hzRn1nIaGdrMMTY-B93jOzGXxFaftGDjCvy9k3z9iw8=": "769568000000", - "hz_Iha5c0LEob-AXQwAg-_LJd5JVxhfw6wK13wFOD0U=": "415396000000", - "hzb43TKR9se3GzxEV7ZR7ZecL-zUUbpgZ6_VX_ItFQU=": "427219000000", - "hzhVdK1mY8CbYeRGxtnad26RlCrSYfCm33e6iSCqOLI=": "1923076000000", - "i-Mk3ic4FRS4WoFm2BUKSyt_zqDo40Z-JojUh5RqZZA=": "384468000000", - "i-OPmizQe2Mo7WVmIleHKiRqMzDcShIM6FmXTCG_ZEg=": "406407000000", - "i-WolX6-J5Mca0SYFic28YC1JThBR6_U9591XIJ8djU=": "535669000000", - "i0-aSVhQ0oXYm9XlZd_eW53kPnZ5pQTakt98XuB_JYY=": "4127055000000", - "i05XaECllXpHTpydJ2B3Hphb2kxBkV90yjJ2EwYm4HM=": "459763000000", - "i0a6dDbjW6k8RM8cyeMhgBHaZuni5eTzP4PNUFO_cUw=": "417633000000", - "i0rE7tqHFfkMnSxxNkUZA2mZhviBriEIKYsCMTJHdtc=": "411085000000", - "i0tS72M_C2llEm4Os_xZpnZlEEakcMqdYlad4ML_ngk=": "383664000000", - "i0xZH-_xjZgBVt0VqTvN8pKL-a39k1wMio6N0b0n4ao=": "407808000000", - "i0ydsnrgPCPhLygWt6vL14Dv6pzF0Wkb4r_j7PUNl8Y=": "385765000000", - "i1JMbJaradPT2snt-wT0m34WmeutOFdTvnx67OtwY0k=": "460975000000", - "i1PUmxoWGPITPr5tukVwWgZv-_oFvYM0PYL5N0bPyRI=": "417633000000", - "i1bzGPVGrFo-4hzCCU0jW0qbIJqFxc-U-Yid33wvIyw=": "378257000000", - "i1mDDffU7Hzk-gSR12DOP28QFj17IymuH-76dO9Yn_U=": "20454545000000", - "i2MZkIb271AQfsaquaOBouT3B2v2MkhS1ag0yHw8sQk=": "1156520000000", - "i2dZ5S3MeLOXFmJlsRyaIrF2xCxavodLlcYOs3PJuj0=": "380592000000", - "i2mSqzNgRw-qCoRpMhqPFsmFe0d4dP34a1KEqUsle9I=": "4540814000000", - "i3CI2Dk5_RSkdZM0pDl7akq2FIv6agekjCfBxfznJWk=": "384615000000", - "i3JvagpNT-53x0pf0RuIjwe1OJJfs5UMkSYsvfYmEA8=": "416650000000", - "i3WLXc7qju-KZ6q1JjcPcL2Bm9dFvTt77xhFj7QYIS8=": "1852184000000", - "i3tQ_2IKqjtuUTDn7hkZuWXR8PO7dGxXJfFOJhiNcvU=": "1264105000000", - "i4LoUfcm58Tr8hPTh6_ZiGkOle-coYEK5Pv7ZRuEK4I=": "626993000000", - "i4h0h38QrFdUTgaoBk2suBc4KQyDUSRELU8YsVn5xAw=": "385510000000", - "i50P-90iyO1wIIUZlwjjpww55CKltAuWuPuYc2i3PGA=": "771294000000", - "i5U_uAfCd3ZXpSxtMbwboSbz7N9ZM0A_O_yxXWlmkNY=": "911828000000", - "i5i34hAsZmAU44PXF48zSuWKF32UKjGx52U6p9N-f8A=": "525148000000", - "i69ynw0rJE0gHTLBhxXpuhlQnP4VJHSafgqIacvXsG4=": "426445000000", - "i6Ap0DDQVca4t8i7Lqyj-vTtdwhThaim_k1I3l5Y-5M=": "1366168000000", - "i6GgipeUJEuXIRJzvC9GhD-DI_N00TvzEbbteGxajok=": "4156629000000", - "i6bsKaikbFH3oMptoCl1wnwpcvxRkY4eAOrO7y0rpnc=": "384615000000", - "i6wPcQdMNlqHJUUck_uo3aZ2tC96Nhhi31CbKrF24lg=": "1796276000000", - "i7DZUysnjl-w_-3aAObV46BuGM4oAZyBGbTxvWN96u4=": "459691000000", - "i7FDHDTjCBBsytCtE87wJHsmVbv1ZA1uJW-qzjlRaRs=": "445833000000", - "i7Gr1V3gzkxV3YVWWE82JJIaM6es3v-EnLxXDHeko_E=": "615384000000", - "i7Jlb3gWzFV8YCBNOA-zNCHdAd-cZpf60yfqucnDp3Y=": "676405000000", - "i7Te5CGc5BawPt44shkcdarwyepFk97nrVUL3oC-6Jw=": "385506000000", - "i7f55L0Q25WOGW8RqDJm7M6l1zXRpQ4Fddyio10D20U=": "416666000000", - "i7zQLVX1x4BUMjDRbi8LGQjMDqqKTNmAO5D4qlKl7IM=": "450740000000", - "i8fwhqrajXaB_y9HKilY6xvb-RYX-Twr4CxV17JbM9E=": "384662000000", - "i8jxr2rJ8hxEIg4te9-8kP5TuFJ_M9j-ARK94rx2rZE=": "509391000000", - "i94H3klR-q92_YrgrkmPnzGJ4tc1rfeMB3ePrV0eV2s=": "488082000000", - "i9cpWRqulXUWbb8nesM3in-lrSLSsaha8giRowP3mNo=": "2264968000000", - "i9jgs1BzGZ9P7_Du5tathsjKsPTstNrkVfOFg9OnnX4=": "924096000000", - "i9uw69Q4qOQClJMhGpjiMiV4GmYXuu2AkaLeyMt2tb4=": "1666666000000", - "iA2H4bo36gAB60h6yClQ2933wp9BJPjitBuASHlx2dA=": "1846153000000", - "iAM0pI7F12bM1xEgFSCsYGYu0PgyQpqqNklQNvkWdFA=": "3461538000000", - "iAOL_Ta02bQwpq4tcMitwKvIf_fyQoucGP_GisR-Suc=": "385507000000", - "iAhHU1i8ZI4bLqPaqiKBV5vRUkSzdbF_1Aw9OqPh4F0=": "1530596000000", - "iBgWp8_7vMqi9LCAkQLMg_N7-909sAX-3RWbl0XiGHQ=": "766243000000", - "iBkMUGWGkHWV0WY3mnSWghkzawVAxSyZC6BfyQ8O3ZU=": "455125000000", - "iBzw40gCI2C2d0h1r_k3Wo3nlkNBHWURrmPETpWhdRk=": "385506000000", - "iC0TU4gWPfrvO9DLAzH5fiVVjXeBFxaJwurYukieDTg=": "1345520000000", - "iC0ndPPB4XOn0r6lM3qQs6SUnnEyqwk4IK58jAay5DU=": "3636363000000", - "iC7XClKot1DX5pOFnbnsMmF6zOJW02dD0JygpPeLbYY=": "1699813000000", - "iD6BEXAE2QDJ47hNPvFHiJlc8s6RLSgXosuhduBsUsY=": "2247106000000", - "iD7BrDmbt1CNmDFAEB7LL7QBdzfgSlq3qbiCkoJDnLc=": "431036000000", - "iDDbw-k7K-1mTIrDPkqzC_QDtk3SpdhL658S4-WBD5g=": "2091578000000", - "iDeMrmt8rQ6trOSUj3hIo0wpxNjOddHjUXZ0nfam4Tw=": "384615000000", - "iDtDBA__kIe-y25b59eTf_obOJDOF0ucnZo7HE8J4Yw=": "384615000000", - "iEeT8v9d3C50el5af_RFZd0XQTHHkN4mGQFeuE64lYw=": "380680000000", - "iEmKzAXjEJC783scR0Dej_qK_fOEKlAmyoarosWssx4=": "527355000000", - "iF9rMc80Htbva44qcvse-3XILyUrMFYPnlxU75AZF3k=": "9615384000000", - "iFTNvOtyLYEQAp-UsYsRjs7LXf2TovSg2JF_C1Hu2aI=": "721678000000", - "iGMb6ZU_JkpnDuSyGmKgP9LF-mQL02L5vyBUuPqdE7M=": "384902000000", - "iGX7SC5FaBuyXAM7bQgDkuiMgF1ZeK9zNoQbf9fbjE8=": "379742000000", - "iGXnHuQH-sSk6BVUb2KdvlmD9PJJ1Kpq6UpaZCYQwIg=": "3760918000000", - "iGkQcvN0AT5nUbnFfW_2s5umaTsI6ILP33bvzv7DsmQ=": "1785662000000", - "iHDN3xWlQbfOFRkBGScBqOo10r0Kh_IVcHwSBCYlIaw=": "538461000000", - "iHMxOIqslN-zY8fbUwD9ltl7Wm9Nu3bWbLTs-RPMzec=": "1153846000000", - "iHowFHTBJhvoFiuQ6oLTWWCEDdh5a0KI-o1AvanHf4o=": "827359000000", - "iIOdofLoCwAVPXtz1hjrYJkvdv_IJlc3PGJcRP55q70=": "2083333000000", - "iIV2FC-gPv0fqEvHxoCgdP7WC1MTfWnGagmEUrMcu0M=": "384594000000", - "iIhswykF06wzNi_zQBPcVRl8Ed7wRKV5Byc9c6FvSig=": "708345000000", - "iIiJSRggwpPphGYCIInKr3-tPVzd0h3RhyqqdGzDpL4=": "910663000000", - "iIrytJ7pStMyn354TMLm7KnEQXFwq0wPzUnstUhNE1k=": "378341000000", - "iJ9Xn-U2BHKyR4J495Ktmhp_13JIiTZJ81K0M0Jvf7Q=": "1160206000000", - "iJIyDUde1EMYveaAnaY8tIC6P1zFUcEfBhNy7vtyRQM=": "384615000000", - "iJWdRg9f0t6nDkwL0qcCbKMTa1wFsXrvx_HwBlaIDoQ=": "499999000000", - "iJeszr-u418ycH9WbQS4hOcQzGGvQacTJMNNrSq-ltU=": "411085000000", - "iJltEouz_q2C_4TAfp1hFDJCbYdvObm7tiDsOUhpVKI=": "841353000000", - "iJzpMEA-9PrfM-0jDVMHfDb6MVVeiHIBH5Xa3h-zFqQ=": "385509000000", - "iK3trhOgmvjlwvucqqoRQAFRqMx98mVcdojgjXFErkw=": "407560000000", - "iK8aHzl9mgtWEXEi393FOyqd8VsB_3Srj4pYhdzCfhQ=": "417321000000", - "iKFhwWrNIRs7VomKhOd1k4OUUUKtOFewjfqsz-Znk9c=": "4103649000000", - "iKFpnGxNcThkzPGJlU0kUlT8Eg5Hh1KGSITY--Y2S2Q=": "3750064000000", - "iKWx_B72X25xQ2rt42WEJ9VXqn83zHuBu5otwYkMxf8=": "634433000000", - "iKlAPa0UfVk7Qk18YpWsk9PaEsi00odHagaH5u1EEaU=": "698546000000", - "iKse4CbamRWhAq-K4CCgGj5q3tI2-Dsy-qZixxwQ37E=": "2607326000000", - "iL47V2TvI517VExEySS3iERz-uXURcl_VaEqRBpniNY=": "1216178000000", - "iL5TGa7AfTtU0VRaV1A_SuQJ9KQZAqvz4X3lPyqaIUE=": "927845000000", - "iLeH73ZyfJOQ40vaiu50j5Q3y_Sj52TrsUf7oPTe0kQ=": "448013000000", - "iM4y9x2M1feUJ0Tn1lpnrckjn2_z0oRPIZ6M_hVFlbo=": "767923000000", - "iMH-dm2cx3sH64V5JljTERuqtTz1JBr4ohYAc107WVg=": "1153846000000", - "iMYXFaAYb8udPzAQehHjmzK9ppUvsMOQ5AlkVsfhuMk=": "655666000000", - "iNq1DBanDxA8lp7X16rnegfqhM08qGql-8hQ7LTLD08=": "1923076000000", - "iNwOCHeC_zG_VjhRpXBWpelkzVioqOq7cfw6cJb0tsc=": "1366800000000", - "iO06AwsX8skZA7_rc52PDgKhX25qK_fISKHMt2gCFJg=": "625865000000", - "iOW3zYznmzipMG-5k_PYzbwn4kGI---M2wE1fdvsvts=": "1744517000000", - "iOmso9NWk-MXkECGYWJabO33jHyybiXorMfPNSAzkgc=": "416666000000", - "iOnVa6hLfZBli8tTF-lh8OcC0Sepy3SFFaMbFHPjZJ8=": "384615000000", - "iPEuCkxIFUhcD_ygoghK_L9krK5-5covg1xKrLkhJLU=": "1363636000000", - "iPIh-S5kGgQUXAbDIzCH3qaK9TbP-gZo9CquRhrG9tQ=": "457943000000", - "iPN7-43ayucyRz3pLc4T8jKN4417oaBCLsAkwqejLQo=": "452326000000", - "iP_M7K952tSDkBA_JnxpvSOUY9j6CyUkWfBsKXdENmE=": "4641046000000", - "iPe0MZjS6vQqTpJ-ZhZ62heo_aGRwYnBQFfq8MCOo_c=": "390652000000", - "iPj69J1M7tMquwTIwRNHtIGtYg33HXBTci6f2pI7qwI=": "577336000000", - "iPq31m2peW_maRSjgaa1lwKfJK75Vq-EZ2EHrv9SC7E=": "381511000000", - "iQNGoZkQKcpBctGe0mRCN9YHFmpPNuRKjNOS3K5vv-o=": "770322000000", - "iQN_7t6z5aRko9AeZ03Qdh53rWC3zjf5SlPGy62Wl9o=": "4036499000000", - "iQRh4zISoTKvYjE0Nr_XwEgYfQewC2e5sKJyW6PkoMQ=": "2331291000000", - "iQzXwSDuCHX8mf27e9EzeNKk5Oy5w7AewpEKJvbpAh0=": "1810373000000", - "iRCyGz5JVVGNtuCJv4uPsgwcct2FOs47WqwiLWs0QCU=": "384615000000", - "iRvxlYZ5b32fmHy3OvA6vgDn2esv2Tnt0H2VlzDsY3c=": "386072000000", - "iRw4I4FS9B8xxXqudiSX-X11L7wTJsv0rHRrlVh2cHA=": "405357000000", - "iS-ujUGkGdvXw9PtVmY0TVlEC6ekLOr4bJYtmLyiFWc=": "684554000000", - "iSAwqdN-OJWxbtLL74fJTnMeZovy3PQPi9XHSovlQak=": "817248000000", - "iSKplB2qFrJd34ewjIgGozyPJbwyrLgiIK-xmCOt_5o=": "499999000000", - "iSYQePPRePNjrqRCzOmGYdJYI8iH_ctFFswwqp17b7Y=": "473265000000", - "iSxG747fE1E6F6SaVgwQ3Bn7bxLjOHozbbqvwTMnjMo=": "404052000000", - "iT9fRzR8PCoppILyH-26GCxlR-aZrL5mXessktGqohQ=": "954279000000", - "iTKOtaGNO6x74vl96RpjYoEQCNPzdbJ-l7T91JF_BxA=": "441016000000", - "iU0bMwkOlMW1UGRhQnGvQx3NBieCyNHwhk8qdEm0J8s=": "418116000000", - "iU3IKRqYrKNumWMAeW19EASUxFR8aeR0ISaCS2Dwz8g=": "806082000000", - "iUwdeJylPPWBwuKNrDocj-BgopQoc_IcL4TYAORR5DU=": "403846000000", - "iUx3ir7g4KqpMIoY2rDqJURXfey9nBjBw865Q7khb0A=": "1923076000000", - "iV2CgMWgxrBohixm_U4AMeZnhJNwGkhjT0EU4k5GBn8=": "454870000000", - "iWTb2kCwFWlK8HJS7Pr7nr5-MOHKJ5wxb8fXMBhsEQ8=": "703790000000", - "iW_YBdPXa0FI8RVEjICh7J59nxP5cVqWIiDinO2TFM4=": "1538461000000", - "iWiCPWDj4ITKi6ywVm1CcsOEe9T8Sfs6nYR257md6SM=": "654409000000", - "iXZE6Z1mpgk3knnnLFqvP-MMymB0vDVgLPC0D_S8LM0=": "408946000000", - "iXdQW7p8HTz9_FThCnDEncbogC_rHqiHF6lfWqcAO8c=": "461637000000", - "iYAlxEu75Erehv0k5rPeAawmigWPlPBSwx6yjm2hqcA=": "427562000000", - "iYPLZOqpMWBBQ1MvLzep0BUKZVY5V03FZmD3dRZ53SY=": "387297000000", - "iYdo5Q9t1cbyf8RkVk1wciosBsZGwtjA9rhmjimsIqg=": "1270111000000", - "iYhO-qUMQeS6SWaGO9xsoqI57hjM5xasbxEBv4FupUY=": "1348751000000", - "iZMX4fXcBfT_xgtQjf4MNC0MdsNfQYOLKSfxgdmbgJg=": "411085000000", - "iZNtWQPUuo2Dx4HwezOscLntiZmmKIUjMr8HHjynOSg=": "2088168000000", - "i_bB0-3GQP5FFQoonjlz4j4Y9JDh-YPa2DPudhY1ud0=": "835687000000", - "i_tXkdwMpINLO-bE2SjYPGDLXC16BM84f94ldr4deR0=": "381436000000", - "i_zMzkdWvrIl17xqLsx--O9iiSOh3wbRDJa6MqvpfQ8=": "4924450000000", - "ia4DJtJmHJaCo3FrtyHfkT6snWNpsawckS8rq5RxbCc=": "382394000000", - "iaHjIGSNca9YPaIhfTbgOM9exP5-pxjikDFbwbpBHn4=": "899999000000", - "iaLpgQEWknH-9lDUj5ToYOYhCQ_Sa21qBU0Fu_J-ojg=": "1119864000000", - "iaRZGFmWa8LLLZWcl8kn8Suu8VUbfe1-1ZikeuM4KLI=": "416360000000", - "iaVpe4XLBq31urdsZeYwoHf0IkJleaUAf7bR7NUgDls=": "390797000000", - "ibUqyo9gqQlEJGr1gGvs-oNOodHk-4qUVfQxrQYYq04=": "3974651000000", - "ibdgaAVjmZTIfSm-jEYGOx5-O0Wb0RweBi26j5SVkKk=": "699519000000", - "ibmUNKpv9NAm2Ms1syb_VHKJdMEjMgR-QdgGWHpBR0o=": "464300000000", - "ibwYufirBpPgKLh3rR_DTI5zin7Dy1ZUxro31NWvJng=": "417183000000", - "ibypyVJsxoGSPL2ATJ4UZewaYzOv0PhT713r-hH-aJ4=": "404710000000", - "icCBkd85lYXYPxvAczaGM2c98oGLY1P61cPzTnjRg0Y=": "6059271000000", - "icy4DFhztjkT27SJSYEfUp7BYfBJLEuMoLufKa_wTrs=": "385505000000", - "idPaB87qVMegJjLQfoN3MaAbstXBOrVoqSgAUjtzgSc=": "385624000000", - "idgjKjK2FlBoexP5iZNNGLlg3_rnS1MPS7MRXv4P6iE=": "583342000000", - "ido39-smx8mjycmGyDtJqEBU3TLGnaZZeFCGEAQ_dF4=": "416666000000", - "iduz70NXOtWHSK1Suxq8MrftdptxvdibYVRRzlvUhnA=": "445242000000", - "ieWCVuf70sitViK4G2EwMOa4FF4sBL9ySJPSPhJE0-Q=": "1923919000000", - "ie_QYfMoPqb--D8c8FDO92XStQOs-LrGolMltx3nYT0=": "6206072000000", - "ieqUsuDrzFxNSyByKQchi1nwBsPQ3rLr2DvoW8bUjic=": "1217819000000", - "ieqkEIzdXwIA_kkbyAGP0MuVOS1MkidEm7n2dLrzBtA=": "384966000000", - "ieyvbzz88-ZyG2enG7Lou-kDozKltCT-ckTLTI2dOUA=": "384002000000", - "ifa_UqqwY2bKAZp1G8Xaff0M0IHwbB1bpvp7UTVlyyM=": "769230000000", - "ifni6kaRlcWb2q9-6P3PRxUJmh5FKmE0FtZl5Q2gFTY=": "384615000000", - "ig4bEuWto1NZi_sRJcTY6rS2icAGnUe3q6Jyl2E6L6k=": "417630000000", - "ig8ZR0YPdkJozhT9q9bNsLdm7ZmtNx7jd9hPaf-rOlQ=": "927024000000", - "igEB9LpcUCBpm_SZ1XsvnZxjXtZRf-Kz6ZWXkE5gZkw=": "893416000000", - "igwqnxB7dnZZnuE2R5yphtMcyhJmk-2T0jy_g5J8_uw=": "1538065000000", - "ihV9d2sD9dWNu_qRk2Lgbts9umTNKuogK-bz7nHpLfo=": "1999999000000", - "ihlEj7eEgRLloAAqqnx3rEhvD9oIjyqvDKF3Quw7z-Q=": "834551000000", - "ihwB58gAGGdUNVH1lzWoH8fn-8hUnB_NOeqS2vYPBAg=": "386307000000", - "iiOf-kVZBm-dFVQWolD7jFp_8vltPiM2wVTnakCA4pk=": "466696000000", - "ije4fJoB0wUoOqHN2u-D_B4rXTq2HiLOGpMlJrzJ2kY=": "2272727000000", - "ikayGEtJQ-LXtFL7GrjzXOybhnJhExxUGt4euH-P5-k=": "384615000000", - "il6ypB-pVzmdQZ9rqN7VuAxXgjKv4gR4zXwzEP9gx8U=": "384615000000", - "il9gy2qw6o_Q3aYjmW5yLUHSDBMjxibTy2tEbAt3IIc=": "2080891000000", - "ilc_NuIPRDRtS5hw37wvgTazc94ctWwthBaZxIwkh0k=": "7401508000000", - "im-WFemvgHOLa1dHzn1Gx2_hAmXdck5F5ALlXcpPBIA=": "380723000000", - "imFFI2ByGsJlTAB0w6EYIKfacZ9DpSMMX1d8Lq6u4SA=": "833333000000", - "imZ4wUD6IGFHxkOg-Tn91_6Y1UkmE3GIOHLyGUPk_4k=": "1906882000000", - "imrrFqBFu6_1kIJUIXQuaHpP-ueRiTNarfN2cZvXZ3c=": "383038000000", - "imyHNwiA2rClXRih88lyUBjBpyZ3EimzNFwvCrG3yMA=": "769230000000", - "in-wOuwRT7vp-ZD7PB7O76q_eFGZchjQq-N61wdMA8w=": "31304422000000", - "incnq6kySmBycSYO7p6p7DGoHItOt2oCAAa7uiQbC8c=": "384615000000", - "infJs_uKmRIXtF7tQ-O5cuOsoz6MPW5rcwaCT77MHw0=": "491644000000", - "ing-yQ83RWTH4FBZv_hmPQzzrTBDVACla-Qvmviwa6U=": "423181000000", - "ingq3s5inDikllan85eDbUJK-kjgo7tgDezrWeEC-Ds=": "775861000000", - "ioAw__z916cY-q0RYoLDlig38VfEelZbBoF3NL4ePfE=": "449494000000", - "iohATOzPteelADwfn-xYAwjRj5pJ6zzdew2caoAxuEU=": "1970100000000", - "ip2vCHaNiRgrvJ5FFfylUIDjm9hm86pddbyTnn-R5UY=": "5058771000000", - "ipCng6z8CzqYlWACuyPqiJx0dF803m4pH39t6NmPmFQ=": "452205000000", - "ipKoo01ulTDlG3BPSKtMj2znd3Rb0SjjPKSncoJF658=": "3855074000000", - "ipgcvNvzW_2AfpyKUyOf9HQ_BaK8XZpEPAabYcd0dko=": "568525000000", - "ipiPq_jsbXQlEUR1Pu_taAAoIEd1I4Hx4QKQAKlU6WM=": "443461000000", - "ipiTnagCutaLKHIVW2kHUowZXiKVFPcxVKjH8o9hvRQ=": "980769000000", - "ipyHSd1B8LmrZatOZG95XXA_H-2yWb978T2g4u35tUs=": "384615000000", - "iqKWkDrApx7yd9gTl1vq2hIJ_lF94fyolC6LA_Rz7OE=": "752690000000", - "iqdova3Ra01jCBsdk_QOfajfA688rX0-cxsujGIQK4M=": "384615000000", - "iqfE8EBP8wg6Vp9DN_4OeKHi5l2hMQqCRs7hhp5hcXU=": "417633000000", - "iql3g5Gz6h67eYLHpdRbVPtEQfAHjnG2-e2RY0nV_cs=": "769230000000", - "iqmZKUMaMhXz9J68PEgUyAdd5bXj7clB8RenhC4bCOI=": "455541000000", - "iqqxXjc_9csna1cdJM8AUGxMgEAIXP8T0Xr4kGUs59Y=": "1369803000000", - "ir89N8A_1LPn14bjIdKmd3yh02c4pStoqCGzIrHKMg8=": "502410000000", - "ir9DKyDs5eSL7p2IOozNGGP9nRrqUhzzxAuOwmmapl0=": "576923000000", - "ir_Iti8wa7vuephi5RNdhFcM--Kv49WsPa2dQBI4vvw=": "833333000000", - "irg77pLcRzaaRSBN0dO6PYRmEQLCtCq8M5D5-0MV2PM=": "769230000000", - "is2mmidYiT4KWV8m0yZlrRQXiUI75mbAehNVgQ4_mxI=": "1794036000000", - "isJDl5n7tASDJCfbCUjAB2ShHdRj58bA7oz8cxy0F2Y=": "397163000000", - "ishk5VoL0vxmoj8SScfcmtUQ1JXTaYHM7uMrU94vGYA=": "804203000000", - "it2yyGN8gZDryjlVCqd4ISxkq2jLAM09QxROCh-wLNA=": "2557048000000", - "ith72gKknufoW4zx37nn5VIWV-EQLxG9m0WuknkfcI4=": "447619000000", - "iuHubZWNFKwRmI_ezHeP2OR7HbRAX2H-Q1OsSLUyTs8=": "500469000000", - "iuML8MRSKQ_zbiSPC9gojHqv9awq6hPkL0lWCh9FT7A=": "2313404000000", - "iuedPCDeeoxN0RUGV-tOw3ah0hxa53EjmGsb4q84pQE=": "422557000000", - "iuls9Gk-4Oj9ug2z2_Ux-Isvkxkso-_Ar3MT5ZczUZ4=": "379344000000", - "ivG96YYFvx8BtjH8cVzVRnWZhdDj_pxLprzL8jGqqpg=": "393310000000", - "ivH3VDw7wqrBj5cIYyuTPMt7WljsKFijGcsV_eNL7ZM=": "384615000000", - "ivKVpp1XZkjBQMebNa_qMcWb7sMG0A4mMxli9JNoHUs=": "417634000000", - "iv_FSl2jk96V4jgF2UXBwcQOd71r0-OWIxahe4hXtgI=": "8333358000000", - "ivgypb4Bd7jQrGvFEC3qJJJER2Z46c6jNTIcbwGn_cA=": "385614000000", - "iviKLTkdnBgmiZTX_NZo3SNWyoEGpG4JkawsGs6ZP9I=": "1233257000000", - "ivi_umyR_xpoh8pJS9cqYbNpJapG9wMlOpL6LzK-0vE=": "416666000000", - "iw7g3Oh6Zk8cm_LdkH8u370hvbAkvZCKiWpfyAF6lJU=": "673076000000", - "ixR3yC3HJ5I2OXmUWJ219se9lFJ94YEuGFFiT6SwJ1M=": "3144581000000", - "ixWyjwES2hSwqQ6nkSZdryM4B3Gm2tBDrBft78wsxvY=": "454545000000", - "ixlptnU7MSmCMyDDApTy1Z0YIxR2lMm-0rQl9-MEnIQ=": "390103000000", - "iy0NWzpniPk4VEZ5Xp_H0iJ_tLUdGFGdoqqE0EP472o=": "1952190000000", - "iy3tLxYUOrme2Vm1d8oQVK7O4Hh-256mnJQTIjkFHLc=": "1150707000000", - "iy5errqlJgU4je78IRw2isw9qRKzR54FiM-4Oc7k0Rg=": "1923076000000", - "iyUYnrC-qKMpOamX7-TbLYYJWRsQ5f2BMJe2HaovNCI=": "1140491000000", - "iyfeyn4wlhgVea-4Cj07QB53F9TplpUEoFb9XswI_4Y=": "2083368000000", - "iyr5qSUZH3zyc_W_7FnJb77TIKNPx5wfnKpMzfu0B94=": "378814000000", - "iywWWc--1OZgNvX5eEiXEQAvm9-Tzt0--9EJG3clHI8=": "1538461000000", - "iz0Dm1fqB8dYMJbIYbxrjiRPTJn9Lw_EnKf1nKr-ouI=": "377072000000", - "izD3NS99_tJE1qHoi73CUuPkTIrQdODYMnqBG4X0N2A=": "390237000000", - "j-IdMOTlnXw_reBM2C2fEo_uEtiMkwrtqXJUuRv2oMA=": "435589000000", - "j-aRgPTOIYx8YCG3hHYVGrMOySjvXE8sXfFinnq3S-Q=": "835901000000", - "j-xU5S9WjaNojCB0R09WZRSu6685C9s8HmJRAbqIj78=": "813336000000", - "j01wWB1xcOWSqt4YgmWdkA4NdVqXoRmYG36COB5BCuI=": "759112000000", - "j079Y4EZ1N_I4cAvOdzgh6R67cZZMcUT_fHdK-DFcK4=": "4162757000000", - "j0L5oSd7nG_zpw5wKe8j7Fpw4IJVc5hOpo7Ldy3ENck=": "1233257000000", - "j0Xcgl7MC_S0W6Rb753ZJ0HU_3WSjCSU2CGKLLDlg0Y=": "460558000000", - "j0bQLJxCmV-HN6qIjjDg7nkV2pps4fGUaIPoVvJ0wfU=": "414523000000", - "j0dz_JNXCmFiO4Tds40hgS3O4_F_3wkWw27Ie2SbSuI=": "424816000000", - "j0y0QXPzkZpzy3A0-2cNe_fH5Vp5zuKuqmZYc_lYjso=": "382864000000", - "j1YxNrG9sPK3VuldnJG6FGnNxw9Kwx4wnETOjD0tcv0=": "1575006000000", - "j1pRFH46w9bPoQnnYD-aZB-drgnwAJZTUV9Dfz1gDJI=": "688777000000", - "j1u7UsawqPGOSWWxQUaowhombSm639kci-huz91fpOg=": "385506000000", - "j1xDFA7raxZxFMHYPZ0bNCMHMMc7qi2tUiobTwswFiQ=": "6086363000000", - "j22bcYOQDcKiVafjvE6-Vwz_sf3j8Br-X-kSCUxPlDQ=": "501661000000", - "j2NxwLU1z-KF7W2IqqQ9iFsHqF7TjlUxPDsYnva8LLE=": "384615000000", - "j2R_gr9_5FRjBp82ztQHrrrh_w-AtH2k9C2JAWzKMLg=": "776635000000", - "j2fKMc8ARA82O7_WaH5p2fPRHYqKDQWTXMX8Dw2ynkI=": "3846153000000", - "j2tmFDFfloKd66XqBsZU_fGjmP85ludrlpBiWdF1gfQ=": "389217000000", - "j3Kjmff1GKc88iy8gvNxQN-6SrvcCS_26BYg8HlzTtQ=": "689017000000", - "j3Tn_5rq7Ykfy0WC5XbfW59VdPqT89EHmRyBROmEFLk=": "414523000000", - "j3XxNXVhbhaCseuuQG7S1vqhutFVSgf1e7bIr2HDzW8=": "743893000000", - "j3YQKWbNHYfx-p3e7ZAlfkPqVGweMSHXrsLRLOdUWow=": "4999999000000", - "j3vVy8TGGNvXgcQN8OTBtgbkQoTki17F06ymXJ_uPk0=": "416666000000", - "j45G9NhuCWzm2W0NTi1KD6FpHp8ME8vJGuJsKdyHkhw=": "2265091000000", - "j4Jo15-L6Jd4w7co8sfQb6Wu9Jl9JILD3w8yw4qxvQ0=": "455402000000", - "j5-cEsvRGSOgy59_q4KPYsHpwvrRZ4UBU9Aoeozjcl4=": "384356000000", - "j5htNx41aRTfp185boErQPUImla6fBo2yMObjgf9zO4=": "517171000000", - "j6G7JNIXnsuM17bArdMk_xWzLWwhnUGyZDajIPzS3J0=": "1923076000000", - "j6XvYDF9-ZygqEj3KJ9jQ-IgOvuGp4ocN2KeG38AJgs=": "384615000000", - "j6Y_pOqSK1lLURo8-_-VVyt1zSJlaTYwbC6lyg6S1Ok=": "411085000000", - "j6_mKsAOe6Lu1UoFcYcqzsy0qXOUy4I0ItlwZAQ20fw=": "2500042000000", - "j6zp0yEX7q8OjAC4e6EkZggIG6y6qs5r1AEasmU-wOg=": "1153846000000", - "j712PcsvW-ZbjHJR60ZnyBbySZkqZjfIIqElvHltrdU=": "384813000000", - "j7CKoMrwTauSUOdel1_g7sQoeBCo-4bd-3ckgvO39qc=": "499096000000", - "j7XfpGhd6c8wszSMBEHJJqatxyyu12QV-iClQBHiBzE=": "641556000000", - "j7wLDIUfWa-wcITo1e7oXrLEcE4Zpj3c71lbzYpywEM=": "1817180000000", - "j8lxrZO7iIFgJ4m7K6Rxfz5PxJ5d03lQ43ChYzzQ5iE=": "578190000000", - "j8pw3V9c5QXLHBvADofxKnD_AkhzqsIRVnM9iUeuGjc=": "1777883000000", - "j9CogT495qSwI3trTSx5OHMGQbaiYmIOGTF1YTobnCc=": "909090000000", - "j9PReNCcPjlvoDyRBf17uZY8ftPCYkwWo3QooF3RhrA=": "1233690000000", - "jBRokocSFoeu6XjZevKC7ThwK4VDR66rUMGCmEY7n48=": "378257000000", - "jCMnz76PuCK4kzhi5brw8Aa0qVdcVMwKuI2eX00wEjU=": "1510256000000", - "jCnYODVpw3XSTdFIcyp4mkdvf5QmktPgAd7bqCkEw0c=": "968105000000", - "jDBpBwbPpYtd6xXmupPW7WGBs3aFXe8QrqPf5zmi-nE=": "451418000000", - "jDJnuUHIQadMDfS66IdM4hvy_PIiUM4UZOhX_Z47sco=": "12993543000000", - "jDVxOnSZquuKU22yc7CT-i0B44fCiErelj2FkkqdWTQ=": "4166739000000", - "jDfvE3ze88dgV6uQVEEmcx6K60nap2b-s8DS0mIkCbA=": "408021000000", - "jE35AKIJBoun-PAOS82uXwK90ggbF_wjGhDHd5rc1G0=": "9795194000000", - "jE9J3ZCtkqcsOFi2HyZGzrn74vTdbynrj7uHRYOyiBk=": "384759000000", - "jEIqrATkowz7mT5f2p3yrxxwycEqiSNLHAIlvklQAsw=": "8333241000000", - "jESCrGzMDP7QwMydNnkpQXQuBjdgBhFCoDrmhiCq8z8=": "3831545000000", - "jEa4CqQTR5-XMw_xcBXSj893aP9Wqq2UevlBHzywDm8=": "407808000000", - "jEmh5XT4AYNmDZBSG5HKkyZRnPSMHc2QGIRPKI8P0AI=": "451935000000", - "jFSvaTCKXMU2O-2aU7K6Zj8e2ZZ1W0p0Wa62H7L6oHY=": "379667000000", - "jFfuI4_v6w_zkBlqWqvDv48vOR06XSwaxXbOs96IIu8=": "1411758000000", - "jFsHxnveizJrDTXOsKcSQepX9a8Z3iyi5_wMu_52sG8=": "576923000000", - "jG0KTljL3uKOH_rdnuNOg41XCmJe0BUV4nQ-dltBUGg=": "455234000000", - "jGau6-u2IL9feJbARzwBnepmD-AgE5RKSYebj5hkDb0=": "385507000000", - "jH-2kjoJo1PVGy32J5NOZVuatisq_4FGv5gOjxLAeTA=": "770637000000", - "jH04_EG4nLWmV4ZspGffC9sie4COmqBcMtMRY5bmibE=": "400250000000", - "jH9v5DIdUkycSqMqKIwWmNss3LVtmUmRM6D5owmctPc=": "446818000000", - "jHTAUUQOaZegjFMaI_flYyj3UR6d7Ac7WUi9a3JRNZE=": "501408000000", - "jHcJEbd5ZGl-gfhXBvhLo2WY0LUhGfev_dpyN4XU7Hg=": "2940501000000", - "jHeA5ruA6cBnEMlWj3PO-a0lfgZfkauAr6gwsqf0hwY=": "4166666000000", - "jIPqjlTofyW_hbfHWu9U9n33bL-P9_JveBb0KIf5Go4=": "844090000000", - "jIZJDYjIt4tm5aYYsygUw0bCYN-mbWUHsKLEvXtXPig=": "454340000000", - "jIsDtWe7ZFCSTSkxOinpgUkGlXk8eRtdP3Nbrr1yYVg=": "387334000000", - "jJlzBuZpTy_Y-YojvzS6Ll0E43HCAmW1w1qTH2jtBD8=": "411003000000", - "jJqEl-dwmfgLyhJOsomYaDF2Es5Wg0qbJEnLeaOKgcM=": "405225000000", - "jJuD_UCKRhXS4q37PDriZY0BV1gpT-KsMq8OvOyno0Q=": "413368000000", - "jKE-R1nJBG9Lyh-l6iJhXwBS9xVyOmzDiBvVnejQzbc=": "460037000000", - "jKRq63i37aB8PnkkM1WNaskufqijzXsnMz95wQhm39c=": "2500007000000", - "jKTlMeVeSMY2Csiax3Ynsy5PQzqV2rRnM7uuqAGE_XU=": "4138490000000", - "jKnTe1f17gs_QYkCLJNn582cuqqfq8Zefeh26ketuX8=": "1923076000000", - "jLliB9h-H-ZoU6e295QZnY1muFj9FBSCcbY5iqpt6h4=": "385211000000", - "jLvvTZcrAu6nONOGlTj-LUBbB3hWuKRQY0eh2lKyMxs=": "18407115000000", - "jLzeUkpOnw441nT-zAY9cgpTV6aZ8VD-7ubiBmA_Eys=": "2692307000000", - "jM1DejbxeOFSR2AyX5Yn_racN6zOLkOJp1Cxv2wdqXA=": "7694886000000", - "jM1RxRJJppBzNDxwJxLxDoglyxMMzeRIWTYu6DUEOJQ=": "921133000000", - "jMmb_aDP8RzKvVHSm5zHRripipKMbCEP6ECTf-jABOU=": "390437000000", - "jMs68vCCPIkh-o2SybihPv65A_QT67vz32hKK06lWaY=": "451748000000", - "jMsmonVTt6UBtzL-lQISM6qiiRcFxGjxbDvBnHdi_mY=": "780916000000", - "jN2LzJ99qXs71Jn5CSTFjbLhf6Gc5aIpt9wZSy18_-g=": "739583000000", - "jN6FwUAei4F8ICFCocTWWNm2k7pY7DtRwmuiKZ6r7VA=": "1588458000000", - "jNPnSquRI9yExNf7HTciXE4UIH82G2EjsA_gAcwzC1k=": "382686000000", - "jNXwE2JcamR2PIJqPCZAC5LEDSFqQgOHJi3uCBPr6NU=": "3855074000000", - "jNhmHquf-yiJbp-eGGakWIelHsWWSssXLUiCDvWi_zs=": "807019000000", - "jNiHV4PflY62xnwywXIHbvlQiHg_22Cs5P4QxMVcHz0=": "454501000000", - "jNkD_0JpeuSgf8VG2NxhRfch5TKX4dMDdcIFn0jsTTg=": "384615000000", - "jO-aUhMsjSN2cHo9rrJe7_i3guMii0BOmPzORN_khZs=": "4123464000000", - "jO32sWRqtGsAMATJY5jvzRG7pUhtX6RairoQP2LWp9s=": "387988000000", - "jO8ZdcSX7UfSsiguAMuXfcZhIGkM7GcRUHRoqPy-tnQ=": "940620000000", - "jOdlyUR48B0f2cf2JYQJPG6HkfEEFS61h2DtwD7wKlw=": "829237000000", - "jP-hZnGM6LPgR2Bi-8_LpItEzK_yrYpUTHCUa2VgYec=": "1607875000000", - "jP5ajAIDmxapzKWG1mvvvMdwxxRG_owKUxA4hjuvy94=": "500422000000", - "jPB1RqG8uWPxaVBrBI-SA82TChoodT2LysSnQdR6_LM=": "458244000000", - "jPCpHBXhZA3AalgaQvCCtlR8Ub0vlLseaT1SyRSVjCA=": "455600000000", - "jPP77MpKWMk5hXf_XYcMfqqxzGFLZiXYKDPhpGWrDCQ=": "1927545000000", - "jPbVxkE5owVFiGI0TPNXdJ2jVydtSeZUF-bVWg4UkeQ=": "385510000000", - "jQ05cs1W2mOvbSS7MvctkhKCWkaBPYXYI9xjHlE4QCk=": "867257000000", - "jQ32LedxfU_MeetoDNUBsmXXqgWkmua8gWlLcVoEwX0=": "383203000000", - "jQl_xraiZp2feEq-WT9mYZAkI0N8F08Yx1qea6GB174=": "419094000000", - "jRZ_2Tey6ta7onw1qS31TFSFRUxKznEPCsASR5diDIg=": "3682333000000", - "jRjTwNHa5y2iYLl0UkaCY9QsRREt3Pk1w6zC0G_cfS4=": "384903000000", - "jRjlTytG8jZvYzgN60nSA8JuabCnCKJkQBIyjBRqrk8=": "463042000000", - "jSc0K5bWkh7gkiEt0818kFDQ0G8csOnv4L9OQXETDXM=": "1871509000000", - "jTApKSgxuGqfRidlNoRF6IxPBAo6ohr6OCcMyrGkSsg=": "454916000000", - "jTF-QtKEHdCTO5clGrDfvnmmi49guqHOAFVbYaI9wF0=": "488247000000", - "jTPoAYmP64aiKDSMmYM2XZIH4rqrikpiHaIGIE1X8XU=": "8201193000000", - "jTp1cO0fjTmUDavuh6sX5ron-3mfqhLzERefu7jwq2s=": "500041000000", - "jUT6EVoutsClw6P93jg9vxamdwdxX_eoZy69L66t5sw=": "464525000000", - "jUbAbXemguU95D4o2UQTG0HZ9AQSTP-c75YPZKpfwiY=": "378257000000", - "jVJU5sC1pMNjujOiFm2HpCWN_0vC_K6rn2SEaTFjuNQ=": "459482000000", - "jVLI3_5XHDMcoox3fx9ysqB6J4SLIM_tHIY9ncO9f8E=": "1363636000000", - "jVP8k02Bt6yg4bWBPKL6hSa0cKVkMQMfVGAk2FgVr-Y=": "5202028000000", - "jV_n12JEmG2aAuZnYoQwAx2In-TR-a8XAczru81tJ5I=": "1927554000000", - "jVxw2ROPPvxnzEgOdRoV9pq_yPMHD_0M-ql9-gvnhcU=": "1154647000000", - "jWbD0Z1piLcOjm9j3hETurUA6TLAkM9iDEscgxXmGms=": "2308421000000", - "jWrVryKJFpjlrFcp_6RY-51Ez2jumXic2QWULLHOSu8=": "444665000000", - "jWwcYc225UuopeguWazLKt1C4bKH19mbwdKu0cwxRwc=": "961538000000", - "jXX86r1_0qiocuMxABQEcK0fIs50J84O8R_Xssccm9c=": "416666000000", - "jYG4O5r2fmNnMs-G6DU0qMMza7hi1Q4c7orM6CcndHY=": "467124000000", - "jYXIv5H00ztPOXv3B3Ck4RoasKGDCU03csFVqmd-7x0=": "454689000000", - "jYdQiorYfrUUgljE5Mc5ryDx1Cobp-RlwPBlYhIFu-w=": "891569000000", - "jYimaFTxrbx-oHhFsxPUUn6C9fxenOIdacjHG77XnaU=": "13755642000000", - "jZKO8GuWaml9EVgrfh-3SsUlA7yFCuwPgBLZ3aYFQBc=": "1536544000000", - "jZvRg7zSOcXW1HJUc8RcPYgYd9HVEpvDWOKjJrhpzjw=": "407564000000", - "j_kSkf00zOEccIvqz-cJMKcUgPpJ2MHEg8gu60CZiHw=": "821937000000", - "jaMbujVbXAHMiucfqYSr6iU2NHGz1sAPUuufgtp17IM=": "3848873000000", - "jajmMl5nbPPOJHRWZR8zaShjjvemCdI5DfShlN1kn9E=": "907494000000", - "javvoRF0F4R_4Eoet0VeaxhT33M0KMxjgb_Y9OayStU=": "4583316000000", - "jaybImNWln_quwN3xb9wUHFZOlfd2sErHrpoIYXSW10=": "1156522000000", - "jbcAWWWj2Bozm2IeaNUmtHzdvO51jhaZNGVA5TwxM54=": "1865265000000", - "jbn1f9mMQpJJFLbwQ-UZ4TgIAOyj3ymiA07fr4Lbw-E=": "2040105000000", - "jbnM8IYjLbhf_yMQoMbRkPi8k6geaL0w2kiuS9WxqRc=": "379873000000", - "jbwaLQ_Sx4PkdwH5pUZxzbfl4v264prxIVS-JXWCBQg=": "451823000000", - "jc0IS540sY7KHy5LWgi726Ab2HHsIoAKB4xhcoqtvWE=": "758618000000", - "jcT8szFEhFBtrw1zsYeSU1SVKl_GnoHfB1mgjfyutUI=": "2004151000000", - "jcTFWvzOmF8EYEtCUvrusopEfrnuvj9nnoLRd1sR1Ig=": "454545000000", - "jcg5d7e3y8GfGgjShczeg-9UoVT82jg5rOKi2gFkbD4=": "11945664000000", - "jd1U0bhzBz3lV93fNoBRvVxGtseJemq-S9wqRAb9xbI=": "411085000000", - "jdVQkgD3yqb06VP3gMWOlvR_6jju5xpLN3UZUoJISGA=": "851273000000", - "jdWTbDfKIBiLrtOP-aFKyRQKbQQh1JFCfyDhJtReAjk=": "6701451000000", - "jdcM74pJ8HWrhjoxNf9FaKkQ4f54gFWZcLgmvHzt4rk=": "1927554000000", - "jdd5ldd51VYrcZS57QBZEBWmw1O1NZGIewPsMpeOsDI=": "16923076000000", - "jdwQmwBI3HDCGRPG935EV7hmtv7fot2xw_mdLJEgKIk=": "416666000000", - "jeaiSEHcJwXf-QWL9yA-7E89iAUjcqtFdEXZmQCT5ZI=": "1955916000000", - "jecnr9vh98Ej7XQlcCwp5L-4Pz-ZSyYAAi127N_kCds=": "457978000000", - "jej501QgzFjRJTIgo81Zy5gLfQXWMHLv9M_cn5NeTVU=": "411085000000", - "jerjElrTPIDYintM7iTXiesgwi-_g50ZgE70Xoq1dKQ=": "383054000000", - "jf4o4sabEuLJcS_q2GlhbIifYqyx-xG60OE54rG_V-g=": "446388000000", - "jfHs3OC6JpJ4pdtHdePkpV1XvkkO3DoJ2ANd_IchQXc=": "582141000000", - "jfSe4ECd12EsVShFutb5tzx7jpG4L4ty7LaoAnSyKVM=": "380958000000", - "jgFaMnnMDVKVUepn6X8BNIJgOuFOOAXxjxS00m7YeTc=": "770406000000", - "jglUT1GgOeIIt8QtqzcgmKnal94MqPid4WPr80KpUP4=": "3228393000000", - "jhI_00-PN0fyt_Tx5tXXo4sLWz35EJCr0q6LeAL10Og=": "385510000000", - "jhiixUidiBi_pCVe9_QE2kfBbjHlLXNyGwSQkqUOmIo=": "622675000000", - "jhn1XiVzU72cOf-dRqDGd9bQ9zr5ZTxZLNHj_bmQqEg=": "3750233000000", - "jiAMJSROjwHw2gCpS5IEWsH2RadxaijuBDDZsdPI1Go=": "465692000000", - "jj3PG98TNi4x3ubIrgNxUhjcxCYn5d9CKbfzxlXL2_A=": "464564000000", - "jk8iO-aalnmVlo9cc5lYKokk7nf8gbPGSKsXbBuGsos=": "462146000000", - "jkNACTUgutMYIuByF5_BCEJURILDf1Jh_SSalWzeVFY=": "449246000000", - "jkTli1kb_vekxItQxRfvWBj0dxxvD54uNKi5h-2M6xI=": "383990000000", - "jkc_cldnWZp_rITleTBTLfJN1YfleMcTNLT9MXxdxqM=": "590909000000", - "jkuSMOAIxUZw7-YGl0M43i3poniWXLrRiWRMbj99Fq0=": "385506000000", - "jkwky4h2xA726Ynw1E3COMC3Iijm6X06mZDGPTuk7oQ=": "384360000000", - "jlNb-gXhRPzklxFW0RBjJonGEohB8OAYROYnC1LKIKc=": "507587000000", - "jlVJpMYc9x6FkSBAZXh-HMrfeRmx75J1u8QhOfbFFPU=": "833333000000", - "jlsGgO2dn1g_FFG7twNYsJBkLRzu8FBAKUwLzyVrZPY=": "386615000000", - "jlwumGOYZxF2RzDPUnbqsBuhQoBO1IbUDYFaY0gtZag=": "342652000000", - "jm1-vDeZ1uFsM6o7Y0bhP14n7vnQdV9_z3F3dqLo88Y=": "383848000000", - "jmbsg0dK_4_J_-GKelAHi55N0YYxIdW6h-xLu9tgPnI=": "384370000000", - "jmfiFQZvmojpFzl3-1wA8MFUZvMvqE3nkzOxSbdoRlM=": "407609000000", - "jnA0CKsX7nBJ74fY3JuRhsuf3Fc_Q0OuvyG3iXBKOFM=": "414092000000", - "jnOxKL-YQFVqZWYEoMaF1g0YKxFob0Inkh3V8CS0w_I=": "982065000000", - "jnTGA8QGy8G9aO1LcoR4dCOWgaZC_CD8UvBgXlF6Mac=": "3498394000000", - "jnq5s6n8F22IBllsKB17XdDj4TAaHV5WbBkmVmQ-fJk=": "384615000000", - "jo-74AYtEGIjHI099tG95RSAhXC52TGcKBvmpc-gRRI=": "378717000000", - "jo0cjwKk1JtmBwjiTsRg3wm6puk0YJOWINNDXAQCYCg=": "3923424000000", - "joMVrjxzk1JQYWoqd7vojG75QBBzpdtNkRioO2XYwIc=": "565199000000", - "joRrI4A0I0wA26xgRTNJSjbOBMsO22DVQfXvZtDsFFM=": "635529000000", - "joUgPVNAvNd9DYwg6O3BZNTnNKKOWU2g4TX3vpoOYKM=": "5464090000000", - "jobZUT70CBJrSBAkFVWHJZl5Ko4ngwp9gduoNQtdJhE=": "446947000000", - "jopjP9nwC8Pme25q1xOXyZxsGUhRqxedHk2UOshoJhc=": "769230000000", - "jpGB0K-bvNik6LZpuSmd5zjl-Hd1FgAe6dB_V9e5src=": "762905000000", - "jpNcxv4ugG_l55sSvTF1B7azZjcl0eaV3PzwZGGNEoU=": "4731808000000", - "jphXKbT3QT-uvkNJ9Fbclvue2fP1ykfF1J8STveXZqQ=": "3283811000000", - "jpyZd5h1UeLYlDhVoigJd9PsswyJ8VpZ2sR4WVkZZzg=": "22729454000000", - "jqc-YpxS-ddLELyqu1LINDrnbIVVXjS5umBtYd8xtLM=": "499999000000", - "jrFUxlY-mu4SLRt2abOmGAIKrPCFdpJSlnbeNAxONQY=": "2889028000000", - "jrJv08b_KGMKdOA4YQVFEY_Om5pN9XVfoN7AowXiQgs=": "480769000000", - "jrjLmtrzYuWtC-FKFWhBfeEpl-6kvIENY15Dt8UeK5o=": "485340000000", - "js0sZZDDjNBGpGn2rxO6qebBnDIEpQLWaF0i9WOo1mA=": "3855074000000", - "js1s9HtvDLU7o4b0ORk-vNpOgfUGLqlicfMTdwMVEHM=": "1504838000000", - "jsFskUABbzbt1TRvXk5UPSjPLEhxugM0NpM-fIjvoMY=": "767992000000", - "jsGHQ0ugFzCKzX_8ro8n0U4yUkeKjY68WtaF1CgUR4M=": "769144000000", - "jsGjs-7xMFUH6htSyvKnCE-B1QYyZxmX7v1e6wI2mD4=": "384615000000", - "jsISsxt11j-Abbz5USkPATVqsXoifVESNtdbj8Vk8IM=": "20937335000000", - "jsMMK8cVUeqjMyuTVJ5-xUNfH8CJTgoX-dlO7vEfKhQ=": "769230000000", - "jsPcigJOOIBUsCOKvdPOQvx90ZC2X_F3G5LTPugkLKE=": "460976000000", - "jsQBQoE1oW1UJDT_LjTiWGc05oNtl1K1jnzlq2Nmxss=": "411085000000", - "jsSQtQHuV7_--teJoj4xfvbcFGgXro_Al1v3L7aw7CA=": "467654000000", - "jsVG_9EVAly6gKkjNatZDpKSDr8nLX6RY9uFywLQCn8=": "382899000000", - "js_D3eH-ZQz2UObJ6W1xwV5h2GTgfsKopmK835vciNc=": "6699951000000", - "jt4yIyR1QfsCkeEF_Vga1EecFBPxOZgPvYuxo0lydsk=": "459420000000", - "jtLR5LRFCZVwKw49-VVed-CycfdI3e0Ay4_LfD072b0=": "1923076000000", - "jtlwEEO8HO4fR8nKcg0ktlgDchsSSYmvDq69nWmlszU=": "514382000000", - "ju_Vw9epMKVmLye9FxOnMguwRKjyHq-F9VnHxBPpxi4=": "470143000000", - "jumIhQJcPOHd69KFQTBvozu8xRs3d7Bh8wI6HfsstzQ=": "479574000000", - "juw1AVkr9o7zU2Fl3TVEH0taTA6dlk_RtnpCi8UGwo4=": "1149292000000", - "juy15jX0P3IRJ9e1KPuE8nGx7RNGzOCNZDYZk4f-LeM=": "384615000000", - "jvVSr8EslzkPPSV5LTa_SOmf9INjD0Qj2b_QZuEyM5I=": "385505000000", - "jvl44OF-zdN2ogRlLR7eVM2rg61MR4srxz1l9cFutI0=": "391797000000", - "jw-PrJwwVo9csOq1QxSS9Ap-pCSsVBsfP88oiwvW8LY=": "425636000000", - "jwCudwqMiFcefXyM4UQkv26qMR_Z-teGIlEt_iMyPRw=": "385505000000", - "jxIov4mnGAwPeovemhpSgzMwJzmh-Lc0jwshA9mbfyk=": "1366800000000", - "jxadAmaS21d966gUd6GIzMc3S5HbZ1HKsA5kRTkaopU=": "908511000000", - "jyl-hxu5ZXj4Z_wZYewNnhLJGODHy2_caLWFlBczkVY=": "459850000000", - "jyuZk50wRB8tNf7rPnlm36Lwx9VwtIU9KL3tS1vR2JU=": "3284615000000", - "jzARdNzjmm20E-8b4Xcugc4duLibqOKopZUd0BRLT7E=": "385211000000", - "jzSyxXKXZz-s4n9dAZVmpF80omz3fFZry-afeywDCqs=": "2478666000000", - "jzsW2a5fWvsYVU0Eq4F2Bxw6-Yc7r8_2GV1HE96FecA=": "1927529000000", - "k-5RWKBY8AupFBZoe4orHVLP1e9ssCBuiJtEuDNoc0g=": "1923076000000", - "k-E7-sybN5nyp4NPiXbdVOZvRN1MJYryZMHi8c_opdw=": "416673000000", - "k-ISNF7OL5aKebXEV2SoULfPvoCAigcNxJhnl2EmHeg=": "766000000000", - "k-SWwmW9Iwzjj8XzE99RQfgvxH45BdxUlI-PQdWefBE=": "385136000000", - "k-j9l-SgohW0I5fHh5N79vE0frN_DD6IA0OvjVEut5o=": "578409000000", - "k-nVqoIevCq0Ax3ZrickEyS5quFEU1xLK7MsZpT2boc=": "384635000000", - "k0INK7dDiLSG3T9HNvR0IB4_lZIm_WzWD9eD5ds2Ecc=": "383810000000", - "k0MrLscAjtVUGPqCuHWWCrBywx-TWy3VQ8SmZqnQr7Q=": "4891849000000", - "k0R6DK_kw6jEsqJhNQmBHKSXV3ckRJ0FDLUn162WQp4=": "1923076000000", - "k0wUnigl3UiH4FjU0PmRjO55TQMFU26uSYdmGGipD0s=": "423370000000", - "k1XOnaeUffhIeZ52fjvYSevJen3pgeOhiUiuIH9Sd7U=": "457174000000", - "k1cTR0tbLgikjXxf78slqvlKzBn_GxwHqqyYc1OF_r4=": "384128000000", - "k21xPuGgPOYW1tSrLpp6V4lIRdp5_uTknx3E4QKx3Y8=": "451381000000", - "k2GNiG9jK3RTjcAFq_3tbj1vcqaMIHR0ndSnmedpgz8=": "3405325000000", - "k2Gd2zFrk6bpGrWYxkM2zWSDvbjrkok1q6gtBp0JMvg=": "385492000000", - "k2Kzda1u3NDPTO3-pqiKQdCFaqm-dW32TTmaZ60WXMg=": "3643426000000", - "k2uAG27slUPJNDCabeHLbZbh2Fy7H_u3RX2NJBvSUc0=": "385505000000", - "k2yTA5uilLuaJLlz13aEpsyJItMQPip68WN67g0ewHs=": "384615000000", - "k3JzRNpPlXfNGd4vANZkEPP_VKWNoleI5bjoNhxwtlc=": "6224837000000", - "k3SXviDslEJub4IDak-P0GeeVL-ZSKXVnQZlEPJLtPc=": "3360792000000", - "k3jCjsMII8m-nO0qx2JtwZuBNdJvQBlj5CFyXHS_v9s=": "423368000000", - "k4FMO1F4dOzrYTuWWDc77F2_yp0uj2KlfEfIhRs7kcE=": "416666000000", - "k4uxCZ-ePuJcICsXKy2A_QqxrBfbteD_riE9blzOpdY=": "472496000000", - "k54QPaNmcLfOFI-9Ml1aCH30uvCtT43MsZm-PS7ZCL4=": "393573000000", - "k5SXEtWGgwK9mUtC4ZsNmI4APxaftBUhkj2RuW1d8L0=": "1560955000000", - "k5UKmM2CxpAWsxUwhudLfcmAAskoH-pAXj0BA2vsJlY=": "1128143000000", - "k5YbWCXv6N1W_yRdvFtkRxB8TIg8Uhf0C4DuMJwOAfU=": "389799000000", - "k5kCSYtFbERDEObFJFUqTEy2ImTnnPbEV9m5svmTm3o=": "4022018000000", - "k5xGRl2KHtONIymqSHLmCuPoIz4H2LShjO7sbmgf8y8=": "1153864000000", - "k61u-dfksXBRlQx5a1Esvjo58XTEShd8VYyOHrdcYdo=": "451869000000", - "k63TKXs_RRtLiqgN3rNrTHCx8DPTaQUoWZuwaGJI6zg=": "2083333000000", - "k6Gv_PgdppxfzNBT1lkMV-jnIIyzJok0d6_sXXJeBbY=": "2470761000000", - "k6XthLw4EtvGz3ulYOtkHZUudZjc1T1isL5hBw8xBlY=": "510548000000", - "k7AL-FOu6OrTywEh_sjsLpGOQgl4AIC7Rq8BuqGVmgU=": "2064435000000", - "k7EFxAZRty8nVD7rscpP2z5hQUalA2XHp9LeogYnQQE=": "458901000000", - "k7E_tcqdpnDRL2PxnysskhmUntFgzLHWxBxKGhdKg8Q=": "463786000000", - "k7FXGC96L19qR2-ZoFDIpOUcrDUFtS7pgSHrHr7dvic=": "385644000000", - "k7NjlMQj8Su4rLN-RDF2Bvn08vYwL4_ziMvYPtFRw1c=": "462628000000", - "k7P0Ikn7-7AZzglonvMa0E9dvpgQ8x_EIq405l64hjo=": "902075000000", - "k7djA1UykUBO4uTZWzCfcUi9wsa9mOsQddnpLY8ZiK0=": "5769204000000", - "k7hbFe80ibJ2jntee28ay0vw8K6EXsv2PSmad8xA5ak=": "384615000000", - "k7lV3GFmQAogPYWCrGWtpN1LwCfeO9D-DX8Xe9DFCEk=": "411085000000", - "k8X368ujKBDdkAyLOqciQlcTlH7FDP6wz3Ep4hqHJ_U=": "411085000000", - "k8iV9OFVxJR_qpMOwjWY7E4ilX_vUTBDD9crcRxiK3w=": "21984855000000", - "k8pxUHyIVkjZKbKGMn0S-i1AX5barIR_VHSA7imyQ3U=": "465692000000", - "k9VnW3mhyvLdPl2PvZR6HMTM7F2nzTU4FG9W473v_2o=": "769230000000", - "k9djO2gn9kFWORK9AfbkiPhD7KtgrQHZyme3xHCl804=": "771450000000", - "k9k1PjCRGC82JVWYLVMs5JLJvj_dNELPgpt58VNVv3g=": "8247981000000", - "k9k214QywpJBx7uNHp0duE6N_ld5oNvbLFJj13fo1Gc=": "3839630000000", - "k9k5QGdb2a8pR-j3QEHtNf-eCCj8Vo-7O8F4Px9F3eg=": "1553090000000", - "kA-oQorePZUAVhaLXHs7cFkOxcQbJ4Uwi131AXavyS4=": "384615000000", - "kAGMMsMf6TxSoWkarn-BIfAN4rcRt4q5iCuP0vSfA2A=": "383454000000", - "kAiZS8ZSEtYrpnUvvr8t0-PafhAZMg-tdNwt1yhMUBo=": "384930000000", - "kB0eNh5ZxGqBYpMEA-bwSCsjznYqBNo9FrZpJ5hIGhE=": "377818000000", - "kCSKUbp5MN1-3XCE1qQgZZYar0yuHLaLIyZ92xTQhKc=": "446263000000", - "kDAf6UIKJoNx0o4tT-SKVlApDCwTlunZKnctEwKNkpw=": "384615000000", - "kDGz_CVTAQNkfx6KX0AuMpIunALB9tYuABBoyts3Zl0=": "407469000000", - "kDRCHCKvX79BAG82K271SMLTgI2vlEJgt_qvwiEWDH4=": "4654118000000", - "kElfoRt6396VqyD-o8o2lbfwWdiJG2u02J848YS159Q=": "1634615000000", - "kF2BxrqbGqdHLOhidN3zwfXa6vFb2aU-3dQ8h1Xm0xs=": "454545000000", - "kFI8Q7s1Z7hWeaLie8zGAY5nOjmT9Wz4nxhHm46tdFI=": "1233257000000", - "kFVVWEDyH77j8Wt5dWY6yOPeQJlP-VqEilpA9ex3dPg=": "2630297000000", - "kFhdWp8oi_UAIOeTBHBOxNmOiL-Y1xAX9g9pUR1xKGE=": "2496524000000", - "kG3g2bHPGbIhVELgtz8pPyKI_ECPUnrI4A-YiqOdjVA=": "917138000000", - "kG68IAq2PhFG39ZKS9txFtDNumQREnLTvb97zea3Ruo=": "4567182000000", - "kGDmsAhLFI_x1RAnZKr7M7tA5gZa_zBtgCnQuXjRo6s=": "1346135000000", - "kGKYO0QpPqouZCpEose0JbX_XaqQPa2naJs7qllv_3c=": "4145511000000", - "kHMPoS2tiJZtu5XoKY4h2p8HYiRY-MrnU78l8KHkg6w=": "377692000000", - "kICrJ7IuHIxdP8kZ96rUZOrqZaZd3t9avRE2tiOmCa8=": "1349235000000", - "kIYRHrykX-mVSOOdDn8tl4u0OX9xl1-sz5lfZH_bvsU=": "1157097000000", - "kIchqTKTL2APmQ_WFrvpZAjopHjC_jjWWEL6zb2BaXs=": "1923076000000", - "kJQS7gVUpJj1wNXu2IO2_ZG99XyZQcLq5_L8-N9Mm-s=": "929316000000", - "kK6q7QC_1LsKWZz8m3Go9JMC6dyLt4HtT2frO97BZpc=": "576725000000", - "kKGlZT1mmRnoOYZMAmgZPUGSN86HRREt9pgWPcylnj4=": "769230000000", - "kKc0oYEvAqexUlm3zEkAhAFPVYEaOcWOqbZO1rqwK9s=": "2645417000000", - "kKxAJTnf3Nbpt1R7fTdo1V209_WEyNp1aGIKXmUSBzU=": "2055429000000", - "kL536XzPQeek8DH7sDeb8k47bAeVeF67rALmEbWPtgA=": "385505000000", - "kL5NQQxPVYZtfLb6wU1ayyDrMF09VBZLPBOZpTbdCSg=": "499982000000", - "kLKQSC9odvgf_z6rM45dCTVBrOVSwxKU2bx6QB5juxw=": "2268104000000", - "kLjtsdVB-oYR0g5OhKn15hud2eAqYkT1zxXY3eW-guM=": "1315545000000", - "kLntdWHwpBoMVUIxETTzPXyNHOmQIkA2uuz9A45H94I=": "3764833000000", - "kLuOmS53h24ELibfQLZGYB3xEu12iwbilODjx6Cepb4=": "568618000000", - "kMDNdVkkGWl8OrWvSorFTR9HMDvdnO7HZzE9B0xD9fE=": "446725000000", - "kMDOCGFmE8r_aAv3BTbEYTbARZuBJpzBSww5REfCVrg=": "1874111000000", - "kMIgyPhCy_u6WtgW1uf_5SI3VGfAeOi--zm_4bGYXcM=": "384201000000", - "kMNkPur_AkZu5QJpbwWcYAPeFVll4OMEoqJnq3zvOnU=": "384615000000", - "kMm16vrr5jnS-s7I9Y_cUrN_FqJXWfolwgZZRppVFjY=": "392602000000", - "kMo4xJltoYXAM_iohlP-Jyy0k8-0gTyaSEZ9esKbfVE=": "451692000000", - "kN6enEMcQdno4dFGpyi0_xzMWWzMgF5sm7GNNK8ZLk4=": "603076000000", - "kNCnzhkz2aUCiUA7itF9rNTQWihYpUdXqdHr6fkx5jc=": "387561000000", - "kNHpzkqxmyNLfJ7_Kqw6j3n-7KQVv3YLf22cm4Fp-oc=": "393464000000", - "kNdRA4WGJnaBwMDUpECrba-NWffkobfg3LcEVuEp7so=": "1565026000000", - "kP5NANK7gecFZAmIKkxpO9LWKUFlzd11Vm_SO9IbifM=": "399090000000", - "kPFV7dQ0G3r5RaFKzeuhfMsfzXnTeU1DKggXrW9oPA4=": "59999882000000", - "kPIP-JTYJqey2e3wl8cFw2H_VJOTnWlQOKGW9K2jHI8=": "411085000000", - "kPMGZS9niOQoWWD9m0mwqSLA0ePd3_BTE3ambYz48Eo=": "25814549000000", - "kPSf5Xq9AsvEgFFK1hqPbfZmLz0oAYUw72ftwNzyEes=": "400219000000", - "kQ0wBFmzZskU7C0z07Hoj6ph32XtgTlGABe7v3_jqYQ=": "384615000000", - "kQnCCiWMCxyzomABUmMyGIK1FXyGW2SPUl9EvXsUdzk=": "481155000000", - "kR-kNoB5Wws6qlVL7aonvyYhqfmMg9uPaPITTPpCZlw=": "589958000000", - "kRCMRne5c_obPmkU7nR3XAnygqxATaQl1KSj64G0EUM=": "384615000000", - "kRp9YMAyLSa1-tvqWTlxB9sdJUgghd1mSEDswA6Il7o=": "383024000000", - "kS8D-Jk2yGLKWW-sTmihSfeZ6pzw89HyruRJJiUI9so=": "2688818000000", - "kS9k7NP3SPVZlU1AVa5hmJBDQwMElk042rgDYeSo8rY=": "1126941000000", - "kSbIqKhOggzstvkHEmCKsWQFbQ123AqHVvSxGun6zVk=": "464300000000", - "kSvZvqvh8Tdi5Gx_aWzjkokqo3dsISrUjID-hdWxzuo=": "459483000000", - "kTI4zzg6NgDTNL7NRhn1Tn2lZQTwo7WBz707LvdcF4I=": "458448000000", - "kTJvteAJw0jkAPEkzeIZ5JPRK6mAyXJ2xO4CbaY_xHY=": "454445000000", - "kTPg3MnDMlwkJn_QRuMZYRLaJhZ_2Us1QKvB_FmSWUU=": "459633000000", - "kTQotLDFzFC3Lu2Ls2foSfOWHb-TeXkQ4RgK6j3hQMw=": "1538461000000", - "kTZtN52BPGbTwGJn41c-gR9AMn1rW9Zbq5fZiK7idwU=": "912391000000", - "kTx_kDsfnESgUcYByDBcCoteEIdAaVWANahXoutSPxo=": "1057318000000", - "kU5sGPI4y6f5kZuc5Dy9OuGWQ81wywG2RS1fK9_ae78=": "378727000000", - "kUK65rPX-zNHwsvuBEuyR0AmXdCZXMVtxzv01dtF2ec=": "382394000000", - "kUd9uWha4XC-eBK6G22WFNNFI8uzvENHMp-0xbLJVlE=": "384463000000", - "kUdiFBVCASBmolk1ehp-cxSW0Ww3N2iLa-b_77wMZFY=": "445866000000", - "kV8OBtZsQKtxlYmZQUG6pniSwMSCVqgNQZfkWpbLtZA=": "2117587000000", - "kV99Bun9q3dn-f4Mi7ikiThQiX-OKtHXSjP3TwFIzLc=": "417144000000", - "kVCfdeYnbyv2j9PS59sx4cslS0zZP5LhXKUvFnXdC-E=": "833333000000", - "kVGWfXwm2P2ZWs4ZZL-ja2qDt0raSYnk2_Wu8rCBN-E=": "1309889000000", - "kVIHQ2h0p0JnrLn4QcXAiIFZrvXszKdltU9Vf9CAWQU=": "384007000000", - "kVMfek9zChdkJiP5jJGvh5S1wEQPab7ijQQVlkm2rBA=": "463604000000", - "kVXa-fwvLSN6D38W__wJGz7emAWeSiMHOQpDVZ6exfQ=": "826822000000", - "kW6pfPmyRSDvWk-fo0tV3h0EhxefXl8ug8X932vc1F0=": "1510326000000", - "kWPmRYBGRZcrvXu3DWu6ofhmSoq8o1NKqaCiopEUomg=": "576923000000", - "kWv3FSd-d_gb3YEUr6aYEg6SHZd8BdCdTr17ktfZdTo=": "448457000000", - "kX642aMaJD4P55wwKrQNZYbX1MF9W7noJvLCbKuSKB0=": "1076547000000", - "kXCoxDcoKLoPQJ4wZiu3SmhY2LcE2QJH_kYSjvr3k1M=": "385023000000", - "kXTKuTtrzr_w9GI-nv-KHMDjg_khw0MTTXfx-H5Iz14=": "452141000000", - "kXsStJ-Fgkx8xKvisvlfBTo04TA3KeKmLR8QXzXYv_Y=": "1156522000000", - "kXuHzc_D0hrWB8L1zdAw24YoBEa06l0GreqhnBumoM4=": "390053000000", - "kYA0ZrJTo9a9Vm6F92M2GU2Kp9_Rq7zu4syXjCliirU=": "452702000000", - "kYKsQYUek_oWgMjq2fczHWl1l8u_keM4lVRapuhIp8Y=": "11456160000000", - "kYZVcug-fWAmta-2Y-UTKQaDS1ytsxwzQno8S1hZWXw=": "2492381000000", - "kYcHjUhjC-IfYkQFCi9E4oL6bAm3HZyYLtmLHM61Go8=": "415304000000", - "kYvbrRpiyAqUDvllfb7WKSbXekdsZWckdEdRSVx3Jvc=": "384467000000", - "kZFCWCkLSIeZljkNTTwklLmHvyIQvijvJ5A52QP6UiI=": "11177388000000", - "kZguKcGCsau2Av-au30aNj-MmAh77AzAal5-5sVbP_Q=": "456296000000", - "kZiEBik6NnwPte74-utwcCpFmT5SOMu0PVkqatr4ZL0=": "469410000000", - "kZwizWuecsfjjmgjJFFET2c-MXuwC8SXOIDBXl3zAOU=": "4545454000000", - "k_7WWRkHQ9ljZ8aC5SmsyvmmXKGcs0OpnVLrYLOhXv8=": "1338461000000", - "kaZYyKE3kwlwIkVmDGKjScrEsSpYLMvdWOviVHo-9bE=": "564312000000", - "kaaTDOh6z8VCqTVdJZjMw8rEz6qAcbeANroxDpixHGI=": "941657000000", - "kaeyivdFUNe36Ks4v-uMFml7qU6OyDu8cW_Nv3IAcNw=": "12504173000000", - "kb0DlIo6lOxeoi-xhe-o9V6KB8pNALSpOd9FI2yCAUM=": "454545000000", - "kb0V4yScq-4llmFPvwwHTrUyFZ0EGRXeUsnDB3TmYtg=": "769406000000", - "kb8j-VsmvRagXVUztzeLhXdsSq5nvhkjzmyQtLE1oZs=": "454081000000", - "kbrHRa9jOzc7gZeum4gjFGGd7QcPhILC_fBqT-gTiAM=": "895307000000", - "kc6KP649yGRt2c41kEgi7jkUgStH4iRHCZOifkmRPU0=": "3846153000000", - "kc8s_a1z2pHm_smXBhBhaLgFjLYu8pmHXvhSFrwg4yQ=": "1563737000000", - "kcC_7IceNHQN_zuHlzrjdtU9ojsC1KqMqROpvsAdfUM=": "6622434000000", - "kcqHEhEKBQVGex3Vk6XcP0i-cdywwSOt0NAeWRv5cxk=": "2499999000000", - "kcrOGpZLx92W1y1VPPdj_iFTYkNuBTbaXBlm6hxBgY0=": "376909000000", - "kd83pjiS8zDl1Teh7SdODm40JBv4nifliYEZsjPcsVE=": "1498560000000", - "kdEoXeTFsQ8Igqt7haev50PfFuFmd0O8iC2DqX9SPR8=": "636359000000", - "kdJm5BVsYZJVBujaPjTj9-Yf2tZk508vjPuRw1SxnnM=": "384615000000", - "kd_-YQkfqkuf8CZpSRi-fOPCzzw_figV9GCrs4YQHTo=": "384615000000", - "kdjCCcghx7uKGUDA2auOwdoJDGDmP1M3btJWkV1CTcI=": "384930000000", - "kdjj8frivBHGnLCpY_tCTiqGzzEQnnPRenXXqjkYffk=": "827107000000", - "keMk-4lYFj07VHBdKupkY7_jy_7SDyGBd8bQI4s3wWQ=": "413329000000", - "keVICKCgzGdg6teIXwlHrUDC3QrwmH5dVd9OwYhsJAw=": "3854604000000", - "kef87pl4M_9TeGlLXfPsrGWkY9y9zYQT-VvGppmVOcw=": "416666000000", - "kesmdlkDO-bVPEzva-fI4yXNkonDz3y6SapWPfQGPrs=": "3786118000000", - "kf7HdnYQtOJA6u_7haiatnYslvNGik7VLdtGfG62KBQ=": "456031000000", - "kfGE2zxWfPENXJm9-ApQ2WeEfqS4qw1IoQBqW9MvWNc=": "834651000000", - "kfWnf3V8r3AvXdvVrYp9AQb4NgYlLCio6R_j40XTFRY=": "768095000000", - "kfXxelKEB-OLy20AxNJrBTBMFoXaTsxfWeMxRPNCgfo=": "462146000000", - "kgEfFGS9e_9REzcZ6JDtlqaaNYqcssE6ahlT6yZBukQ=": "769230000000", - "kgWhDAcPkG_9oMuosp5llgudS0S7VP-jTOhTelo3shc=": "769230000000", - "kh-XQhe6n9LKmQ7nmKZDzGZ11dGfbrB0u7iqai5JQGU=": "1156517000000", - "khBI8HzTexTL6GLdUa23xNcUp-3mI1gNcV3ygwjWCDg=": "1250021000000", - "khosdJxYLzcQOQw2W8Px3C6_W7yPIolFu0nI-Lh2dNA=": "384644000000", - "kiHfJbpTiE1BUehqmyOxQ1qtm1N-h33ft4e4VrhcG7Y=": "574999000000", - "kiTBkqaW_H_PEZDNWKAqAEkbKd-3ca4vxCvBJDCV-HA=": "416965000000", - "kijgaU1PNVaHsiOHSIZ33zokBCITN5brzxeo-ux_Vgw=": "451703000000", - "kixZnNEkM5GcCkR_6QVQvvz4fCMiZdfJ_BAuCrMFOe8=": "464539000000", - "kk4AvFyj_mgMgPcFRf95TJk-pP0TtxEHYBeeYzgYLSs=": "573591000000", - "kk8SKbESXi8PGmlbcevMrAKDYmP3FH4D7WWdJWRZAD0=": "452039000000", - "kkOGAQREhVBsGvV1Ucu_MZ1PQ7X9mqZtDRoMmUCOw50=": "1153846000000", - "kkjbtrsm8X780Wu5l2DIfCVfdsro1rM69kRXydNBJ2Y=": "416541000000", - "klYGkszPhEnF0_v-WgQIp-e84kqRUTPlcYv_Sm6I-iQ=": "1504502000000", - "klb0QP7ooi5F040PBaBncoagvxnz8wxg7dFP37y1YC8=": "453122000000", - "kluOAlsbiS6rQya4pbB_XTa3VGQppBAyLmXWAXsBQhw=": "12491437000000", - "kmBkvzgP_LW5qlgNB8zvmrwVvxsjFlv-HHvJtOyHlOU=": "1585715000000", - "kmQpaV1eJbRGyw-AbZnOxEodZV5nFRA797_2QeHsHdk=": "1662156000000", - "kmyeBNeBvxbtjM0QN9bA18WCfvpcXTsmupu0UJgsvRQ=": "4147755000000", - "kofylcPm0KHn_xxGduUUoa4ogUnCTQxFxbAE8eIXo9E=": "455600000000", - "kolvmb_w2MFBfCpnYKyNPVS5ugdLcxuuVwSEOwQHOeE=": "384615000000", - "kpINp7-iBF5Y5yN31vAQkZCtEwXvu2MEmVR35WvgiIw=": "753599000000", - "kpdMKEcGlUbv3LbrLTwo3W4IKD-yIoS84admo6Nmg0Q=": "2253834000000", - "kpdoIbOvD1N8sRcHSLygrnh_JvU5trkGhoMUJs7Eg2Q=": "2074563000000", - "kplTNgbF94asm6u-FPxR8bmT83BdsLsDowUOBQ-nTyM=": "460608000000", - "kpoNc1q-AWJpVjisn5jEqOaNuQnaYjgWRfqlmC3jvL8=": "738915000000", - "kppwkHZLklCGArHrX8v61ZZyQ2Lhz1kfad8IdLMeHI8=": "379260000000", - "kpsmuDx4oaRwAjL3JXZ0fU0iWF5uOFmI7Hw7VFewkx4=": "1632420000000", - "kqAuvS4fz8JX_3T4fRPnNP9PO7zpPhPbmNwLLMinik4=": "460816000000", - "kqB8s0B_mLfwz7dL-jFjFuT2dmWBFdrkt-xwPL8h2DQ=": "417682000000", - "kqHGRR71wCGOS0ZuiY_n9pUp-D0hQejAnSHIicLVDJk=": "2064715000000", - "kqK810nlZ0OsizXHxeP70nGX8MtVg5LeouWxeUGPRmA=": "412006000000", - "kqOqzd0JtQ7YFTlNHHboTVRv8huSUxZ17ZFrbi1uTzA=": "377449000000", - "kqRhsHDtTTHTGwV4xXFBCLvxube6mHF3XBY8BrYMo1o=": "131406876000000", - "kr2oxspUNEWXWl4ni0BzAXHmsxY3pPhbTQMf22JixHY=": "783595000000", - "krLxGzD8S1WQQYXgTaaPI9MXTozWQwyzvx5DfVSKziQ=": "383195000000", - "krSPT-AwYq5n2de6hgNFN0NFRboWFj3iZWhyy6oTJEs=": "385278000000", - "kscEEAsT-dQbq6ttSkfqOx9lMsToIasd5UkFuKf8FKQ=": "458460000000", - "ktWk1Nj014HAadIJpVRKyVgoopWnISgl_Cp4QnvZpm4=": "502036000000", - "kt_dZF4gRRRXLNohzeiRmfKWf2XKwhuYr_k-IMldbvs=": "3299346000000", - "ktmWPIvtp5uuVBB2s_onlgfWOE7ho99xc_jp7SD3aoA=": "378460000000", - "ktpvab-QlLMyzZMAWJTRfQHuYPZLSxpkiiDx3QVvx48=": "416666000000", - "ktxjo_nXgBCww-HxXSa0iV3ajFMvEx6YZ0FcpjamAIQ=": "462146000000", - "ku2Ft4z_oalTjio5LTdc9Y_IELNxTGt9iMmVbj9ZN38=": "758520000000", - "kuPAOKC_tjmFdUt3GZ-RFqMXGElyZ6QIR4R__Qx_BLs=": "455600000000", - "kv_qQJ6kxnhfwAdODuv-WM0HB7nxT0WLnoNW_-q6g0w=": "453414000000", - "kvjOuIQpZnaPUy1B2kuEkY9bRbyq3VM2JEWIcPHU2Sk=": "384615000000", - "kvnlZPGGbXrS7QVTZv739O3025LeEudEoOGCuj8jYjw=": "411969000000", - "kvxHM2b_AQnSShGRbrFUg2WaOYxRG3qF39LuXt1etDc=": "962145000000", - "kw2yhhmVRi5tNW3PSIhP1tWVbEGqzoQ_Y24MicPUG2Q=": "394212000000", - "kwC80ZMcVBf7BiaC2uS3s26L18yI1_pr3r7l-W2ieF0=": "454676000000", - "kwDOaY-Pr407I5KtcY4o8aH6n0ZopVgGfrE19yUSdNI=": "1256161000000", - "kwPxl14TY0JOFL9g9FC96fF5wICuN8z9IdCQ594H3n8=": "454918000000", - "kyD5k4M1bFeCoty2IvBoBqqhvpTc5MS7g-yE08LggYE=": "1727387000000", - "ky_DED-MVFM5Q87L6P0Gk-aTyRz7xIm_Ml89R-ZwSOA=": "809727000000", - "kymEdAL93K_tO7bIBWTPXNDyLBgYHDob8iFq6_IDH3o=": "3511224000000", - "kzBh7OTiv8VK1eB-NNF6QaEJf-BzLmOYiqi5MJkuGC8=": "384615000000", - "kz_UD2BktdRrEPK8-vno7DXY2IOrGauzFy15zFFWv6U=": "906631000000", - "kzvcqX_PMbwHh2ak5xP7C6HrX2uk73tSW_WtAJ_rftk=": "454822000000", - "l-6hy2Vqgt-lp-W6hZJykWBlvB9yNse4UBY4DCpQzuM=": "1097648000000", - "l-nm-xqZHFF0lVAZAPXigX0y09jDWLmqOh2BkZWWORY=": "380240000000", - "l-p8jqYBdyBQeVyGRvxchHYU5AnljTgt9XhiDZMM9Rw=": "376914000000", - "l-zz4eDcvhdT-Q6K25ur37N-2eQIRh3aXe3W3GsQAus=": "380963000000", - "l0CegYkBXxd7rO0AZ-_TEoDgl-wxUQ-ZJw4TWRtf69I=": "807692000000", - "l0L6nyqLoqNv4ah0rW2zpJnegcYVKZEkB9VhjcLy7V4=": "756009000000", - "l1EWwhY69q-WeH1kDpxQVGG0EcsiviCX6AG55poO95A=": "33363135000000", - "l1Uyt7x62bX5RaEi9TwMv7Tuk3PBWuOHQwjVbAEn7FY=": "382536000000", - "l1ibb7LGwQxbSVFt0B3WoSkjUV6Vqh4w9LgUJunjAoM=": "1950355000000", - "l1mfieQJ3cSN1Ez2VLRn9LbjKuKj9_sY3xAuaJ1g8AU=": "4649411000000", - "l23wSB7lKHG-xSZMdPJvi1hasz8jZ8vOcJ2qzYMHEpE=": "384619000000", - "l2QgB5lsV8P2nZbTr0DB--rDyMPNh4NLl4qdBvPLksI=": "382706000000", - "l2s5Zy0MZs8bjo-qBsvviQGK6_x3-Wgy0DpOrLyKdIs=": "763544000000", - "l31yGbiPV-9DsgIVZH8Yf5nk1-BZuQX1j9szkitACbs=": "730769000000", - "l3W07TsY9v77I2yFsUEugBfIXFQ2AbE0TqJH9UK-PS8=": "992495000000", - "l3avGAPfal9l_xK4ZKW8jBo9JzywfdIQS9BpXDVqPLA=": "577623000000", - "l40FT0u4Xtftl8iY7fvmZmZpv8rDs_6ebVV2CqO3drA=": "1923076000000", - "l418qP0XBM8kv5pRzXbpPZSEEeo3Nigxj6gHe08FSiA=": "1932076000000", - "l4fVO0MTRZtplv-owBYjP8XKMKZkke3QlVshhGbNyZk=": "384615000000", - "l5CFb-2yo9idR_VliZo5FhQCYLh65g4XvG9_9UjGwo8=": "1022102000000", - "l5Ly-xi2-AGPnXQwQ3BK2QL0SG3gjgblHcGOsZ1y6r0=": "1893589000000", - "l5kqnTDTDx5zks1vbpXzztdaaoyy4JuRQfxX3ATLRhA=": "538461000000", - "l5oXH48MZb3VRteemPwnHrp7-mC1cwPkCidLyANNAR4=": "423009000000", - "l5vCdY75m03c_0jWDEvPLuCbQOYy4W23dtzKm8cK5mw=": "1604419000000", - "l6-NqdbYyLqHIxBa-WwiOpwJWlirz_E-3ZkrlV_CJWY=": "384615000000", - "l6arHKMuU1AKoLguA6ewQviqNCkXubWSwDEDsDNhATE=": "386570000000", - "l6lcMsgY1PHMorg7Y27q_HVM6IUA6zdW5rRbv8IgpOE=": "1957181000000", - "l7Gl1OsPbB0JgNZ3D_4o0TQ5trQZ_lHR1omZC-jRck0=": "917325000000", - "l8H2aT39c5TqkBHnnRLrXtOFhUksCtGBAOUJsedYzgI=": "384615000000", - "l8YoCXVMxIECKGVgSoqLw35AjqccDx1NPngkOYcMOCo=": "2304273000000", - "l9AfCitT8Om-L-K_Fapz3YDFVwb4rZrU-MGIFXObJ7k=": "769230000000", - "l9EOGMvmBpNwz9U2e1gi1czqQS9VY7vTbu1Xido4mwo=": "417946000000", - "l9QypYycWf88_ShCspmkHgDwGDchTYorsZUEZILCgJc=": "363321000000", - "l9kR6fTF6h8f9WJhmVEkzYIii2DOX4_3ZFrU_YU4dEk=": "756272000000", - "l9oEhbYetohfZGQaDFleL7nqEyOgH8Ylz8U52wHzVIg=": "690560000000", - "lAWjl_-u28-LeaetxqVNUqPr6h6cBOJcNBvWAO8EpmM=": "1153846000000", - "lB5K0Yp4J8qqK4PDhN5bmfIZIuXjidc033p8veCLPMg=": "452078000000", - "lBDv-C4rmmXKz-6vwexOPaiBhEn7ywlzDufYIDxHebo=": "1666779000000", - "lBLYvQpqqC2733k7bS-rDj0q7OeEz9pMW7cg7TdLgSg=": "874658000000", - "lBRM_bbkYPMV8EVhU_cBnBmkLqVAn25-LeXjN1Xxj8Q=": "422196000000", - "lBa8SQ5ZjWpTmmTE7u-sRB87AQHxKz5vRQAJnXPQCQk=": "1923076000000", - "lBjeZNDXYQVq1SAVVqqUR4tQAB7D9xhtBEflWjlQ_cg=": "424754000000", - "lC7vml0Qa8lZsALyMWCduN20lypUK9bgzquOAf1qPro=": "411085000000", - "lCRWtNQQW9fO4aiMym9NtIQZDfGgUJo21EnS3uRSuek=": "446263000000", - "lCS9xgVRIyoCRfC0CSXpcNolFdWyM8cOXD-R_5FLwcM=": "425251000000", - "lCd520cMb5mDbVNaqULWnCdF-p8Y_i8FH4_O2XyJuIM=": "761210000000", - "lCkzQOL4f_cwYTR4ZJXd-NdSzoWkasFNeUXw20cxvt4=": "384615000000", - "lD3qG9KhhMNo_ylDDfYa0wdNu-D13L61KLIpLdS_8uc=": "1920465000000", - "lDm4_fdFLfAUS-vpQgLbxBckZ8y7Xub7yJsakHZv83w=": "1248575000000", - "lDr4O_b50gUldzxcUl9JAMFo2VzyVZwYMaTcoyiYR_I=": "526112000000", - "lDuyqyOngdLXS1dd8s_fTk5MeKqnBnSSgolxeiOOh08=": "1923077000000", - "lE2i91WE34EVCrW87X-Lt8XXfXV3bHQvEEwbrCK6ruk=": "737416000000", - "lE5ZAqbckTsMDHLpptyvve4oAsC6-wQXFBZcb3SF4Eo=": "19943220000000", - "lEPxyIvxAkUKH9hN6FQdaMmz8dDqEyV3-NBchpIVDZc=": "576797000000", - "lEm-hLw5AxoT3sOovap_338CwNNpmvMS8NMoi4ADa5g=": "2100510000000", - "lEpzeryqM1LxRFBC73OCZcqsob1YtvsnOpAf841d7XY=": "458659000000", - "lF3eNfFxnAVDI9hDlzLPCsqPnYAw9zGuptrrSyxi_no=": "753674000000", - "lF5uVHSPplraCVJ3L20fR3e9oy6LdWsSxw71uSoB9Es=": "12499980000000", - "lFbTIv-dqsokHYPJh_KBI56eaFCKmedRp76kYlRjU_U=": "11152559000000", - "lFl3H2blNm0jHrpgZQ9D03bZLkofvCxy03M5uj8kcvI=": "1249999000000", - "lFuDzo2vh6UEMmrr-MmCvIbIqD8H3kTkT82oGkYjC3c=": "418144000000", - "lHLyypqb6umMTk2ubVitdwyFOq_g0gIeh9-osBj0r64=": "974536000000", - "lHbsZ4EWlJYkZOx5v4WdgzLLo6BObwTeBLn6yjCvDXE=": "385505000000", - "lIAq18xP5LYzboM-PKtRiQcm-0pOgzjv_qAOo6PBqFI=": "454859000000", - "lIOSSGN2vX-xBHkMifNEmZoRKDLXP-7W7Ki9sjrQ-nY=": "989645000000", - "lIShfPUywSW3r7lsxTmaCdeQh-B9Butf5517BwEhBSA=": "381802000000", - "lIivRuDqw-rv4y5BmR0uX0Na-SYwAGqIbra0fn1TcMQ=": "1590909000000", - "lJ47Fo1OEPWjr-MpazAtrfLt5pTeUlxwL-g7ZWGYZfw=": "1400084000000", - "lJGK3S4WIXOPflXEgjqZmI_z5ZWdCPSB4co_YjfESqs=": "468409000000", - "lJJmGpwNpAnbpH9HcMeQxbpKrXc9-GM8dyR6jW89zIs=": "1923076000000", - "lJNDwzJPbEXaRoJSAGfI8mkVsvIdk4fV6fNKpSlppU8=": "8217726000000", - "lJhpLvp13Q2EVYwaieep0NJksR41qkj1z1nMqoAewNI=": "1927547000000", - "lJlu-p3CsNnPE7y80HLFNATUGmmVqhDA9WiqifkuYMY=": "1818181000000", - "lK1O6Yz7O_E07K9VerQtxK_ac0QcX2gzFizcgnUd6kc=": "574033000000", - "lKFGVh5ol4_GmsLS508nhArN3YdNtsMjHt2xyT50u4I=": "386742000000", - "lKI1IlIKX8ij0Pd0UVTxYAyJ32TsDaryMcIFz2MMbHI=": "13612251000000", - "lKbO5dOS355pzspaeR3tPdmqtb4HbLZvxsjhdmNRMgc=": "417632000000", - "lKlUuD7j0X5HL9zKYrOotsf9Ugj1zxQRQV-SztswB-M=": "789200000000", - "lKsjdxj-Excd0K_J2nByD0mMVqGVx9ckfODngbXC_8o=": "389674000000", - "lL-VKA2FbNX2QKZ51yzRkYyKxRQ8DfbhB9IhaBEaXX8=": "938409000000", - "lL0cwK5TxCf-LzADL0XtLpX47wNXJa2aLeli-0xGr6U=": "380827000000", - "lL6jC2OyNR1hisF9Auk4LgtrCQ1rFndIrURtcvCO20M=": "782982000000", - "lLSGgo8CQ2VqhTT_U7vHk4u2AFcMyBUfiKg96k59rDg=": "411085000000", - "lLlxMCE06h80_Dhi0_FL8-QPTMNWgeIMagnveLKXL-8=": "928209000000", - "lMZK9hUYuGyfZwCHfx-HX2JVFxBg2WLzmVkHp6phTDE=": "1919579000000", - "lMb_CGjWL3HPR4DyE6mRwqgjhe6leTYQ_eU1JyYcSLw=": "1041666000000", - "lMjurq0i0FWlX2tfGpIPrcTr3jyHpUyQiZCx1Mu-VD4=": "458824000000", - "lMnMOWJK92rZsvkyBbphEeiQiA1AqCBbSBzdiK0zvhA=": "5808250000000", - "lN8x9PkGW7BC7uKuutPEjv0lfMbP7IDxHzMqtMhEeX0=": "369692000000", - "lNgyZfBqls_9zg82ZBCx2wLuIgwnhNUghGl9X1dbwIw=": "916606000000", - "lO5q04fPJqhT-lLfd1cqJ8BKE-Od5GiYjJKQmJ64VrA=": "4012039000000", - "lObmHirGeIksSpMXbD5TF-Uusb3Cvw0VBcyJA60QgKY=": "908900000000", - "lOgUyLYV1DUMalhHR9-_xa5CGu-0auzCUW2k5nXJw64=": "405574000000", - "lOy6wmM3VjEiKuJ1Efdx-i1mbVuzNBI2I1jmjWEoljs=": "384615000000", - "lP1bVmnxf0iX0hnN0jaUTX24DxdvHBiRtjaB31usQyU=": "387962000000", - "lP8fAFK-GOrjI91_M1m5LfGL_Ld-5Em8aQbHUoEfwOs=": "12534407000000", - "lQKDaIFeA5nMdtzVH8ri3Sd3kbg6TBw74nwpFwJI9-s=": "384615000000", - "lQiWWqpvBCrGN5VgWUfy7eh8b1QFhjwUwMzsdtzMO-Q=": "381358000000", - "lR5F2udAQ_tXQVmqPWRE9nBeyDoeZJR7DgXdTwqZSyI=": "385507000000", - "lRTIk7oIHN3451u7mJUNyh_zCbsyjBitrku_AwE7jP0=": "2914576000000", - "lRemjSEjNviTuMGJ_GXuVJL7YY317AAVptCMzsp3XT0=": "655115000000", - "lRfZKssadtVQBzjf0tlpMbnteW7LtbZKI8UcbuUGY9Y=": "386574000000", - "lSg23sGvzui1iqgxrX8WU88l82VbZs30uX9M3TJkL9w=": "418392000000", - "lSndEBKcA8HtGWJd0yE-VPtJ8OrmXF69BQqmHKbhbis=": "455600000000", - "lSs1AJAZdgtHZ8fyOZtVW1fIPDUMmvbh_Z7RtRwF9Nc=": "3072335000000", - "lSuPdNOC4wo3HFy86kaIv_fUV13XuSvofsm_SRDBbDo=": "3751654000000", - "lTbymFrDofrDurAMXQfCA9l-U2ikFGoPei7D-RpLmrk=": "380694000000", - "lU38M8Ud8ICR7r6ZlI0WH3C68RoFmbmmyNMGloWfHO0=": "464104000000", - "lULmLoHpp_XGuJ_p6kzjYkhpB1bnKN9ubfIGL8uN3RY=": "423100000000", - "lUWKz3ia9i6VMPgeYH1R2FGNjKe12IzHSHSuqP-g8kQ=": "381713000000", - "lUuUK26ZXN90ftSHzXy66pbFijYnjOG6pUKqLFl9PEg=": "2045419000000", - "lV3pWvZtAasPH3axGtoGREdlig3vHT7UI76Pw_UkeAM=": "848090000000", - "lVCBBBhb0ruEY7kNtr3U0p5RSEEyPQHl8sbxkEzyv8U=": "377733000000", - "lVa4GhtVapmbC9e20IVASlxRWdFpNvZ-1ttPiE-KyKM=": "380459000000", - "lVnfG23UylltJqVofuZ2Ny-l20RfrsJXUxP5XDS30Zo=": "457943000000", - "lW1g9I08Veoy1wsRGHAUE_J7U886drV_rgWOa3J3-Q0=": "418744000000", - "lWGK6QtSuSqI8OZUIbGDy9kRTlRq52opG_r4VWKpIVc=": "6807692000000", - "lWK4xL32OJFtC6LJIQp40iP1CnMlNSTHce594XjZFuw=": "913369000000", - "lWM1XhZcJ9Pr4QtgTHqIXHqBjjTfvt1wG3OnkoobhWQ=": "458333000000", - "lWQiy7xzGtOMFIbuNja8s9DbTnDVCOMO-2uK7lmAGrg=": "384615000000", - "lWShnMC3PJLgSUsg9-5vtcIjDXOxEOt35mwAC_fdOak=": "922769000000", - "lWclMOcAxFVA5GtsH0HNsdgCgIy4czh2tezLp-iX0pE=": "1169544000000", - "lWgQ3TJDPEmlF7EDkRBKLXE6zaSfwgWNy6CxUZHaR1M=": "11670991000000", - "lX8DmWI3lD8cWGuwgbCyqbAm-Y4PVr6vRY8VH4xHHXc=": "1350917000000", - "lXJ9R4EBFSTqs9QQBQaxLZ4TmZYsPC8XJ7zmtyi9hXc=": "4563165000000", - "lXWnu3oXgReTIMxeyGS9ssJYFvJYdsIY-ws6FVYcQu8=": "662654000000", - "lXeYI3vI0HO_cLo__MzsrMyiI8XGoQ7thNMmn2ToEnw=": "831345000000", - "lXlHRzyCAgUubWMSMYm87TyVJhnYSyiWT_fOSHtxZco=": "3845984000000", - "lYb81Un7MLS25IZ2wy7Ao0p7M1zyL9tJwurlpkD2qgg=": "381733000000", - "lYc7Qb3sDQJ1z6t0i6P2DElC94jlWynU0Zs7O0CMqYE=": "1068461000000", - "lZckaTXN_aWOf5JPE8BVEJRZLn3HGl-EKvBabNMipdQ=": "2260197000000", - "l_0WwkeGzUMRQ_woTDEbshAm7aWxGK6KTmYhtCxhjjs=": "3598284000000", - "l_FcriAgKvUr81EkJDsJgOTkTH0ENRd2zq1GfGE4XhY=": "769230000000", - "l_MeK5_Q5K5I_ia9fufOGUb6rkG1zRt7hWEI0UhxHKE=": "452053000000", - "l_O6v-ZpWXQ15yAfGYBy-vAliGGdkn6cWxkUWSaRgEk=": "502887000000", - "l_cFXcCNgrScOuzJDymCuBilzmjKA9yb4BAsAWiypuE=": "813489000000", - "l_zCzL-P-tYNxEMBYzhUOarGxOQn05DfI9qAk3ExqhU=": "460843000000", - "la17B0xW3AxeXAapAGs1zZCEnZ_99j1793atpi3SZ0w=": "417399000000", - "laA9dnXTfbNK7Jghl5oEHLWex1vthUax-1Yy-ukiWo8=": "405229000000", - "laJC8OKiMwfOI3bbNEEvjOXHzfRmoDdPAUkzsZuzp4o=": "1667418000000", - "laNGueXa4w0NKmKWow3SA7ZCEmcgqCKxTZhvE02fElo=": "385506000000", - "lakHLKe7Ocubbus-GkN-F0OgHbFqdnKFQ2dqjeJe9OQ=": "353346000000", - "lb0yxpACAU4Y4Y8W7tpMgOXJaPxLSxVEcTJP02I763s=": "1919526000000", - "lb1Ts88YBrPrqhSBKMyGTePpswmTAr-5zHt375mIH0E=": "467411000000", - "lb5DlfLUcf8sPq-Vyk72GU-h3Ao8me0EREqHMhfTzRE=": "454545000000", - "lcxfs4-jhm_2kMhXRRMHHJHU0YF_hyvrNtMJmczQoqk=": "461906000000", - "ldNEGI25UrkQnMABvAfFgv9t04CWOdYdc57y8SJ3c_Q=": "1135997000000", - "le-XesWn_dDWPqU_UOQt9m1tSx01BpfByHv0J75ToZs=": "466427000000", - "le0nKdP6PRzauxZ-6MBvhDkhaFrNUcAAnyUEyBNJrXE=": "1573078000000", - "leGuhvWCcuhEj1T9HM8n0tsgarSClFB-ntEPpapi6Fk=": "390915000000", - "leJg8GF5HSFj3RFTGvr9VS2I8zwIPgRo6HvzWmS6LtU=": "411658000000", - "lePSNm1iqGZo_lnSmhWpkgGoetD7AyGNY_JQ9EZ8VHg=": "837433000000", - "leYJ0H2lnZBrIPmlBG25w9BjM0VyggJmi4kOniErzgg=": "391132000000", - "le_uFUoxfv7kIvYbSFnXiIA75fLPhUojTngeGlvP2_g=": "458561000000", - "lfifVFhSSbJQJZJtv7MSMhGvQj2SVw4oUAM-2F3O3y0=": "384573000000", - "lfoFx0SzzcaGlOmBNSgShC-EngaPhweByDi9ycGXs7E=": "1925660000000", - "lg6kAukcRP8U1FwFtbKXkd7GAcXNYaluNPSSEIPbOfE=": "839774000000", - "lgBF5rNSQGNiG0YrhLPp1wQGYICORbWKUdHETHaAp40=": "19615384000000", - "lgKWSK5jiDrwJFTwTfwE0QQ6Qh-RFllrT7jzvLTrYFM=": "499999000000", - "lgS9L5kPUCjxLdeM33YsU8vbPRkF0L7qnyzYBXRhVsw=": "1023073000000", - "lgSyNOpMej9Qr31JQ8T0QfZazMhtxcW39A8TVMQW4r4=": "12426286000000", - "lgTGS2wgCmaAYjYqN8H3baB9UX_7MTtqrLAAGSCjcZA=": "390743000000", - "lgZSP2l2d18d_K7Q7TmRSg0_ahPjbIAPsakNH-VfoS8=": "46175710000000", - "lgeoybJx5oZeQW0AXIt2mhJOHErhzSAKcmxp6T0B5R0=": "1524230000000", - "lgnZYhm3VyjNDHOrrYhrtJ1dkk_YlyBURs5pPknQ-uc=": "386127000000", - "lhJ7QLT_Y0SJJwyP2ckDLrzAOa8FZ9RAKfZ9bclcOrk=": "455600000000", - "lhRgJWW02OvEo8Q0qOUAjuNpcArTVjDJUBB2O4PdYsw=": "3846593000000", - "lhSpUbRRhuxvI1sCnZ0YZh9AFIqJmfFDBx3JvUpCaxU=": "2281847000000", - "lhnemCSKTfPnu5NhFES9aOYHipQ6ODB2fu_ElI7xJlA=": "379187000000", - "liF6v3oWKsEV_G4Y9rtD6pN18xF0BaoYV1QnJNLYvEk=": "654771000000", - "liSus5PJ0cpcMMxxmnkS-9XGg8m_KawWpX4C5ZM5RTQ=": "396565000000", - "li_fWK3aZc7d8XcrUQLMVSN50pMyBxhXYwj7bSB_IAU=": "388584000000", - "lj-GUupjlC9fcCG_NeM-dmQaHC3O8nmgDLw3GS8U7K8=": "423368000000", - "ljUa7cwanKzkmtnovN7TrSqaUcwvwQL81vRdio1ws2U=": "2055429000000", - "ljh6Q9MMXJb6pfJQv8L4nAlMl64DQBpZBa1ccRtB5_0=": "764813000000", - "ljvIrhPVos0Z0Tjo4K_9zerSkPupIm5rV2344HkjZ8A=": "376160000000", - "ljweoY2tBb1FVlR4mGrAOnbv_mbJ1WUVk_lrfldsmis=": "386516000000", - "lkRPHX2eyf4rr1z9JuigSrZlNTOpRBdtJ4Hbk8N4RR8=": "385509000000", - "lkRn0yNCi-xoskAnCmK2uj9k9LUzmgREV45JX5xpLV4=": "833333000000", - "lkcaja6aiM78WIBCzflSUX1mpLMhcftb16NfchqCxYo=": "458272000000", - "lkhLZnegNVv4lTJWwj2Jsq2-kEczOGUkSidx-d7cjkQ=": "395499000000", - "lkhiZQkJrqHvDGW-qpFjdKezf4yhdxNByP8tMa7bcvg=": "2505718000000", - "lkl-f6HqlCnwoCfxy2QZtYPzlgGECRLqVLlfEPkCk6A=": "2871626000000", - "lkqH6fissefHP1Lok0R1tZybC_VKZZLRsdBUMQbph00=": "416673000000", - "lkyt9ukDWzt8AueOWU8yJO2tOldAp367iqH9kgqRDLg=": "381802000000", - "llbGA0lJC2cZHk17NOCCgnem4oTi3CZVet-vYl6epX0=": "421947000000", - "llgknX2H8hglIdzQ7GJv5busJb2p2vzhYLEmoQeZwZw=": "379260000000", - "llqU1WQWI9PQEAfgtaV5QbuugnY6beNDMCRc9ezZZ2A=": "421142000000", - "llwEHNpIcGgTVi_X0wYamXBuq0iUEIuVJ8zxKCyHNXg=": "2290833000000", - "lm5nDsjIKufrMKjlDyL4hFNaUtMYnTWqwfNrGEeOMZw=": "4595160000000", - "lmSnROyfI2dNMR5Q4-4RcLa92FvVFrjgrcSMMzvBvNU=": "2047011000000", - "lma1GUz3uONBWWPT0JYCIzXcRGEfEFJLidUugTO3QWo=": "405883000000", - "lmnzIVM7seeyxlO6BLq_TXID-bHTTsE4v3sV-LjkgXE=": "411085000000", - "lmt5_Jq6jNiZhkJCOwRqcbakmAScfiHgb3OCwRmC95k=": "384615000000", - "ln-F-S7cYpSzhvDWbjIflRHEcPfnEuQx5gJc6crDaQA=": "462839000000", - "ln5WlbEfCkaDJDL8iq4s6mYe0kFHq3pZoOXEtZavaoY=": "455014000000", - "lnIRh-_SIEvFV2PzCSclRjHzowSJPXRb92IIoD1IgUA=": "821478000000", - "lnM5Z-NRluj4DcYGrs3o72zsnu1sgOXSvXMHVj2J3dA=": "412097000000", - "lndtJBBxF6Tn8LbMXcYXk2mKzy_ERg8sKMyzI7PsCjc=": "1922298000000", - "lng9I6F63Y5ac8EeHwTOAlWs6T3_HxXe1QYCJejOnn4=": "636148000000", - "lniP4uBjyhKH-0l_fVzhdna2vkRKalERMxdaW5mS53s=": "384615000000", - "loMepoLpdmZGKCYvHgwjm7_R-OHFT5DKTu7KkuDZLK8=": "420229000000", - "loVKM0-z664rLYcloBO-FkWnbE1p2oaWkZhtK4tqd_w=": "908423000000", - "loc1Z53ZE4QFOV6XogzEALgjFvyu7oSnGDer-j4W_-I=": "3790675000000", - "loeWHVpW627tsEA6O400vHf9V2Wyr_6ohdo3OwzQ3eU=": "769948000000", - "lopKpgLa2KAlHnHWNthXLspH0relWQEAN3kzLksPLww=": "412863000000", - "losQml5sK-ocfzjXJtvJ9wM8JtiiN3YBmnFD1zvhjWk=": "1823779000000", - "lozILO--tKcmWPHm9qr7lLP7rg5zXBUPrfVoOdAzVcg=": "416666000000", - "lp6qyKsMcd6Y9I2M3CxzcdqfgA93SRmLmpos0DElKkA=": "1496282000000", - "lpNRsAIX_o1Jq2gPOYynDqNCQubZCco60p0aJLIB6fE=": "769230000000", - "lpiN91XoBSekQO_vmEfwtLohv5iJ4rnxbOAPYEleHj4=": "416541000000", - "lq1E4vwqFLdY0rGha7Krix0itmhWbGDB6Sg5EZKoP64=": "470069000000", - "lqFPfnV02rQuyohiYbYEwdgfaorJOqCdmwufHQXVs8c=": "833802000000", - "lqNv51aybfa3YyAuWamL1ie8B2HJiubX07Ma37xGfg0=": "462771000000", - "lqWTgZdWeTwyZlUX_9LgE8aoITNFg2xkjg-SZlDz9H0=": "504212000000", - "lqzlTiAUkKIqqEcr_vJpDXxfXbpk_MCUaLRE3PrWQ_g=": "2083333000000", - "lr-sET1l2kwk17NtgHlinU4kBHKMNwwGHEhfS843Jyc=": "769230000000", - "lrK7qRmRCqF8q-kjPsZ6CANR4s_IWkKGU8RZYxuNNOY=": "383334000000", - "lrNUmJN-XFl4aNGg075ECwOaNQ5iIukFUYjyHlrbNQk=": "1400084000000", - "lrPW3kIU4OEIEvFJ_1eOf4IhvdCfqji-8Crf9mfNQjM=": "416666000000", - "lsC1VZc7BclOlwfNh6IeNEQ0CIReJkBJ1txFOAMyhug=": "397332000000", - "lsCYC2OPq5j5WoRHLxEqxbhdXjG9cpuFEDoI447nDMI=": "384615000000", - "lsZzQwdRWz_jSA6rgy6rqIQ8p-omYWlJtZzPedehv7M=": "616234000000", - "lscydBE-wvV2PRotSgDokpY7qtuIteEnQ5Sq2Oy01fc=": "623247000000", - "lsp9kz_zgAb0uxE8e_GeM7pUiqlUzhUu-kOljwWEdC8=": "1153846000000", - "lsqWgX3QC6Cb9XfZbJOxwjKJZrpjopqmr50szdzCmaE=": "763096000000", - "lst1Y2mJsjnQdMCTqPlB5N576k3wCVWj-6ttBuMogjI=": "464564000000", - "lstVl8M9Fi9XOGsC9QJ1q1pZLynmtAWCSLtT4OGllqc=": "369226000000", - "lsu3cgJmB2HPszdLW7n1ey9dDCy1eDCgSvLUmdCHF5E=": "390975000000", - "ltgk7yTm9cVyTNC69AfQrn6Az9qIDKTcOfZ6wsTdPbE=": "458576000000", - "lu_WozHQvU9OYLCfb9Atcf0SE-OhFEmn1EaBs6s3Wew=": "4146001000000", - "lug42L-OXC2pzFPtHDVQyKApyFocmYGU_UvXPeD64xY=": "915384000000", - "luoeQvZkneljeZMZdjMtRtA3_JnxUWU2UpvitLHat4M=": "3855050000000", - "luuMp6VfJ_wwHSfK7zJHJxAT8mZ36O4EuiyU4I0vQMI=": "381802000000", - "lvMXmGsZwLSxJtDv9SRYKYq3jiECUtN85dhLJiy8fpo=": "461997000000", - "lvQzZ723xL2sbfspytOvvBma63K5BEZFiCFa_KxRe7w=": "764908000000", - "lwBxZTIerePRQCcWr480oCXpS3_lrzgl5qJnAqAnR38=": "4103819000000", - "lwi6xVTl7VyONh14GQsTeh5LfwgOhsbHMVCzc0XUa18=": "412158000000", - "lwulF_D0shnS4ZRMWKezlg0-pi8Dfpc6wf4KyP4yQUQ=": "472752000000", - "lxVCdliD0sEvpnzK02MfyOKcwQJptuDnrdA4uAyZjm4=": "501408000000", - "lxbpj8x7QxT6hjYL64jhWKbYQi2bm3D-jEnMlmxB3mo=": "457217000000", - "ly-XULXjv8HRFezWhewLH6_7tH7WgeXPUSqXuXobyoU=": "3846153000000", - "lyshBiEDISgekI0Iz2Y_rv80yUJAYI1zw40MSUIgkYA=": "384605000000", - "m-18WZ2Xgwx6GvZ96cp_yYINYmufIKyjLDoneUD8KYY=": "3818547000000", - "m-47c2F0zAR9wIz-PkSx_wSvxp_QB9MlFwaK9KaOLgU=": "1210755000000", - "m-JT-747_M9cM0Dvu0JONkP9Hhl9tLrcEuy-A6CQT1Y=": "512979000000", - "m-gBO6xSS0oQiZqLSs3jdhNKwg1YsaHFD2gN2t5J9cw=": "458900000000", - "m0FGN4YVdKAMUsU8dWQ_6ws8j0NK0OCmvhZptU_ndjU=": "769377000000", - "m1IineF4NHtVLO6EBoXwWtctrxkTa6H7qaju8Wbpz2c=": "384615000000", - "m1WVE4ImAmvFDicIP6paLtrIWDQMHfEgNvRbru_RAjs=": "783770000000", - "m1_NA6V-2WnL2HLU-W0vVvndf7NYrzVz4OPNcJXpqa8=": "406044000000", - "m22HbYZV2dGKFqOdHGrL1GsH4mjWBGmdS9wS8CZu-D8=": "2689707000000", - "m26Dp_H1pkslvo0A0ybqREa-yF9mNChht91VOnQQcJY=": "473692000000", - "m2MIpUqWMTQJwK9F4LnaNstGh4BjMy2L2GDHpsuCAPA=": "3846153000000", - "m2Qoa0hyrstX6gafnbTq6CAtT96sYo76-jx6HuEYbrM=": "771530000000", - "m2YPlDHuEOGU-4w9gKwsRLIps5535hf59qaapIoLtL4=": "2236541000000", - "m2cX_Nd6z4rqOGKI73oH1I4fcn6akAh7XwCAD2Ih2yU=": "787901000000", - "m2kntoXSwocPAwVD0S9fMaKeoNjVdUmBFFEKrLaOe_M=": "384940000000", - "m32DEub1pYACeTxatoB6Jq_ByACV3BATcgXy3se1rBM=": "415629000000", - "m35w-w31sXQINSsifX_SechxsfRjaVIpbKyOFji6EEw=": "3672993000000", - "m3F4grjeNm9sRm3GiB1W_28EJ_RG4xCF1iDoLoQll0o=": "823917000000", - "m3MA-J5MfCbVqUNjriX56JWWa9v5zN-Mvu8vasuHWFM=": "385510000000", - "m3Xs9-e92-c_-9Z1-uhh3OSq4z-C4Ry-em57MNKijvc=": "1511881000000", - "m3_QfTyr5OQJK-lZKyWxIAkrQ1g2eE6ewhsF6Ps2mJI=": "416666000000", - "m3ilYbM8RegDBxBF5_fCwzMbcVYkKEVyo7RajFPUDDA=": "383900000000", - "m46SskEqC2J6WTgtkL2yjcaiPnDP8I8lgDOFOLztqm4=": "833321000000", - "m47dIBXMuzFhhGiPWhgSj6LPUOkcK5WfFs7Evz69GiI=": "522085000000", - "m4CPqNTv0jNJah-05c3Q2pg3bL5Cu_LY9YUoezJN_hA=": "423370000000", - "m4N1XE_7QUdcxJb2-alW-yFXs0FL4nHKvTpclKER90s=": "1011286000000", - "m50K3IFgi9FgWA4U1LIoMZg5IFL1JHtV0niR6GxzTe8=": "2339165000000", - "m51cGbNXko5k2RxxgpOZ5ZIvOWzY09yjjIadlk6eOSc=": "341647000000", - "m56-14V8Q6KAsh4ER4fePvMfVumVRxSzOM88LtOXaso=": "378520000000", - "m5FZXqoM1BhV6E4PsbghaypA2ExVz_MKzL_FJ8JbEmE=": "2050546000000", - "m5LyYDGxWNVOJuSSx_B9beRk2mhHHqX00J18ZRD3pmk=": "384615000000", - "m5NjBaEQFfLvXVNd-r1U6YqZwPgMhnyxFSqI1IIFME0=": "460094000000", - "m5QtJ9RCJcxSCRZ6q1ZXIwr8CPvBmykxiQatAZ6sIGs=": "26089543000000", - "m5qn1t1-I1bXuPJ3uFujAvCcjrkB37Cc7cuct18aZLE=": "386004000000", - "m5qpXGXfEsU4MEU14Zbx_FcjfrXPyRSu_eXU-p04Htk=": "3275834000000", - "m5rZGd9Z-osb5bonc2ojSXBdhGgIrEorkhqCwjyWjik=": "1079388000000", - "m5yKz10HSjTfGC7ARvxfpopEYxiL03RaPRLHb6zdB5M=": "583285000000", - "m8TWzsrokqnJSJbxb4Cr2kSNETVJ3co6IpI8m3F3ZwE=": "416666000000", - "m8gSwimnejWbmQpUAEWyK_Te3LpCaB9WV_T4E4_8x5s=": "379203000000", - "m91KqK__EJUezCaTzysGO-flC1jJ9kW_uW4ACZFJJ9k=": "384073000000", - "m9Qh0TJzNMr8tV-xZpRGxPAzN_OzBQiPP0zNIzXECYs=": "416901000000", - "m9WW7WA7INuWjJlNQokxaPL_1hL2bnSfkSxYwQGENcI=": "378310000000", - "mAGF1CqpFmt-OysBPNoPMEm01EUL8HInsqroTD3efS8=": "451268000000", - "mAHi85xAJY0sjGeKZ0oPGdbAtRWt7giCGwSj8ElLymQ=": "1588075000000", - "mAZDVYX1Fj-L-RJCmIsnqOlWHgNyUBmF7j4DtFJw104=": "411085000000", - "mAfkIzj5c2mm8XXufMK9TcP5FKzOFcFmM-L72m0hgM4=": "1871600000000", - "mB11uO0N8FSlLfTtWcXPMyGclCHjFNyiZ_JRPntNfdU=": "937959000000", - "mB5tfDeGQt7RNwZccjM-Am73eaVwPnDIUpmPAwqcm9I=": "385509000000", - "mB9YtY9wBL02ul1nxJiL160emiy75X3v16clZquli00=": "843390000000", - "mBjvvKC11ghQMp-x2P2rx1ty-F0TgLbjPYtihfYRjss=": "473265000000", - "mBnISzw6JLP-JfCVt-BrEXnPbIVx866BBimeLK7QhH4=": "1814912000000", - "mCBucKU6C9EseH2t2Sh7xStjXwFYmnjji8G35QEgCY0=": "453516000000", - "mCCsQobTa-aFHPdSRpeuawYQPGUT4juTQRJyASfgGjQ=": "384615000000", - "mCf8LGCcLHxZWfuGw-pErCF_nht0S75uzNLl_JRLXcg=": "420557000000", - "mChmQMUUHymrhI2d6abD4W6QZVNfjRKj1tJg7aKdGF8=": "376106000000", - "mCxxEG2lxV893fQz9dp5lyw21EKRjsP_CxVfrffyz74=": "777293000000", - "mCzdG7fdy3XOL8PkJ75RQS3eLwqoNJHIq-IiditvuDk=": "488979000000", - "mD2E6LeS_J3SgMcvK25lP6ZBXmJJGfikpvpQ6GGTCpw=": "4199461000000", - "mDFML0qTYnhwu0DL8Xbftd3KZdwpkLLPe6s_W2I2BSs=": "454957000000", - "mDS7EIXO9bf_Svr60UmqfnKOD5t9o1prft2W_JhFTMg=": "1154089000000", - "mDcL59nrYfrUcyFqnnSsccarY3QppXtofSLUR8RRiTg=": "1801716000000", - "mEW7SrsoL4xNad3s4CdxLwEy6fqMhSC3TE-vdnK4ISo=": "2426784000000", - "mEnPiJH4EJrWc6jZAk8BtZcMCwzEq5ASo1sRLjieA-c=": "2686614000000", - "mEofn6670tdeI9VXjhz3KxtrhZc2rdnu2YjEu0MJvLc=": "384615000000", - "mFIs0gM-GXf8M9UKROAnPF-gyJWmi9r5KG6rYsIjdhI=": "7853878000000", - "mFNm4S9tf9sUQgZhOrfzb6M9h-Vjok-bavaBed-TovQ=": "4222380000000", - "mFbssXXocZ12E-G5TWyGRyK7L6qWl-PJe481CGdGdEE=": "403063000000", - "mG46pzHXa_mw8JAm6-IOO9B6tfDv7TtUHeLjDOyPEKQ=": "16284615000000", - "mGKbrqL3KzxEsqeJdOfN0i7zotxDb7vx8qXcfr-zVyE=": "549503000000", - "mGk-R1S2aOKnR2fcYiFhG6nHekvbzAdK1wz-SYDkNRE=": "2248931000000", - "mH2xrLYveZ-DjSvyE0f5qmr1M3PQhxoxbmEC8Ld4dDU=": "385507000000", - "mHXJ1KMjI0vAMk63yIMWS_LMIiWkRjU9fYhmYtT6e-Y=": "1599999000000", - "mHoJDhrGqrqqXx8nGwb9ZE1_34BI-fHJCLzgzVHkugk=": "385590000000", - "mHp-l5b1czZt30pfMfchdcn_qIuJo0UIxXgGHDn3Tqs=": "749999000000", - "mHsF-YpiARBiaZuXw40HMaoAoS07EC2YqfRfdYZ7ptw=": "385505000000", - "mI19GeAZhCPFKNY8Eq1WTs0_3Ow2N1U0lOAa8F2Em3M=": "460429000000", - "mIRCQ2syZ2yvIBYFmRQ-hdYqt8BM8pBUFdGaS5DAQ8I=": "769230000000", - "mIYsJrdnH0WScbsM2ROlQeVh_AzIB3VQ2s08vtfVKCI=": "7497594000000", - "mIfCUn9jCudYd71OzOrfXH00zb5EVDTc8G7326yJHP8=": "1432835000000", - "mIkTxkXqiMkzF12NR-uqRgKJ-nGbwpSUxcZ_aEO4rv4=": "767698000000", - "mJ9AgndSHo5G6pQWKs0gMjPUjJGj_cfx6bjmNZJkRrQ=": "416666000000", - "mJDMA79zpuSZQN0H_Ia5WLR31g5QN2RJrlLiPc3fFJU=": "356097000000", - "mJQdYSk1yPQH7g35jA52l0tWLNTEi7gwFansBjnb1LI=": "768094000000", - "mJhq8HxdKd91E45XHqYmf1CxXLaB2e8nQd27AohH92g=": "916402000000", - "mJq7keloXOfAqTd3LHXd84HLDwYa_4LOXBOTXpFoNmI=": "391797000000", - "mKH5wemJ94o5qg0T-TYpVmDxnSD3pxZA0zegrLaGyhY=": "405357000000", - "mL-LgJc2zvAqS4sX8I_jekHcz9Jm0oJ7vSQrRuBF52c=": "385509000000", - "mL1_hi_bZ4CZkUB6Y7jBRqf8RAdXMGmbFLf29xO0aZ4=": "576923000000", - "mLryScNSg0wIqH4pJ7GmtOjzevlrIgs3_Rz6bC4iUok=": "384615000000", - "mLs3wN9LD4ymo6h87V8qd3mV6q_kLGvivq95hqu8mfI=": "2083333000000", - "mMKN2YcGylVo_ZjdP6gFroIvNW5QuaRMRIad8FnP6i4=": "769230000000", - "mMZJ1hqO4ovUqCtEiZzT6WDEz6GKnzsXaRJLcEkA4gA=": "381839000000", - "mN3tseZbV_EMl39FlFNTfkx8DboOIo7TJDu5kM7QSqw=": "3747274000000", - "mNKa0gsMoObwP8oG6RiSF9HTYOwL4D8f82U8JwauoDY=": "1908842000000", - "mNqklwBEtNAZtnvqYLwKUBsdBFh5ZT-DgEb2yxugNrI=": "1923787000000", - "mOJ-P5oSN2kJxxDmdKDAU9bXl8eVhawm4BnEqphq4j0=": "403691000000", - "mOWpLlupRGBkq2uyKE_7q1fCNXgutdjlttMyb3f2osI=": "452533000000", - "mOe2b_st49f3aq4tp2I1NpsXDWREZn4zl4cRohkVE4U=": "764788000000", - "mOr6FPZmxIqhXvBydGHGu_dI3ZkDV-9ewbmrjcKlLbg=": "636269000000", - "mPDg3EK5pXUmLjnUhdoYqmlzYEZ9NE6-eb0mN1k6O5k=": "689563000000", - "mPLl2beT9Gt8RdeFbWjyGJpowHa_Ztw7f4XhpAoC86A=": "455600000000", - "mPN1xj3GbEjHmDAJ9o-0fEYyL99i6A0dy0lQCSmVINc=": "461144000000", - "mQMb54bD9UokI19LhSaZrHhov3rtUhvEP1y8-2JjQjY=": "385505000000", - "mQTL2Qjxrz2e79xeL0NuSbJGsIT3xSS_jQ52-9FzQww=": "687952000000", - "mQl7xDRCc4_6TVBSRZq_8zORqHmo0mugWy8YGzkJUjw=": "416652000000", - "mQmBHh0tz9vTtobpKa68mxbyEKVoJXyNeuOULS3yEkE=": "405846000000", - "mR6_l2fnqtG3pICx8YVDCaYdfc2pMOxK2a92OiXmlFk=": "3846153000000", - "mSJHv-PBhe2_Vy42IkJVvQKN9JpBRKx8DRx8Fc5IvOk=": "454445000000", - "mSo3jCIzrvc5WevACW_ty4dIOq_VcYKiQ8aYp_SHuMA=": "383148000000", - "mTNlA8JBHATxfkKC98l9YJfUk_9x3OJ76WO_fwvtQhM=": "529179000000", - "mTawaguepq5nU9slRhp6xSO-ra2NqDzeJeVaPFlN1aA=": "1144095000000", - "mTp0w5n011DQTlCS-QwSYx5OE-3UtvwQAzD_MLHiTlk=": "448226000000", - "mTryuzArR5mxxaFMUXiEFoa56wv4nIIGQbORHPPDoVY=": "452201000000", - "mU2oio2bpfoMWGMq97eFKmhE8rVNdTVdz1wnXIDhFPo=": "409546000000", - "mU2pPc-FFM1HqMUaAfh6n_OwXdQY4wJUrdUYgs9Akv8=": "391327000000", - "mU89a_G8CKtuZ6YigkwbUVgBTuaqNxnVMq0zJPeEE3o=": "385514000000", - "mU8fjAkGGZLwdn0xTO-lo1bN6exxpw7FUWB-kIddjYw=": "769230000000", - "mUD-mP3LKgbt8WdmYg0TxY11UNxLIOG92XZYdyQDggY=": "451898000000", - "mUY_p6EPE5RWF8ZhMJTznw5I0Cw8Bb5RhaDLbvaCRm4=": "4166812000000", - "mUcPkjy9pDMdXsmHpffxQV1n4QpXc0pMGfRfTf-HZJg=": "469404000000", - "mV1HSPJzlUxhGzTScsWO_Ma7ImCzkJjQ0CYTq-9gaXw=": "588911000000", - "mVIDfWmx1ZT2dC3Q_wAIZLuPgLh2IhvrRblwJGwtl_0=": "805082000000", - "mVvtj2RKdXIPYe3vC4g_OIrAc-K-sF0JMPG824fRY0Q=": "2756294000000", - "mW0SALbc3LtTeC-6zdvYe1pFumWwU5Sz93jvp0RwKTM=": "1889005000000", - "mW7jsg_RT8nPCT0suJD4iqHhQvBOemBLucVqQXVP8kw=": "4727509000000", - "mW9sKyWi3b6rcnKJCjEK0LgvzcMg0xPOT4rHToDvZ1A=": "2059114000000", - "mWbD7UgzunSCLCrcRzf8kJ87UJDOE1KRyBhzHVdb-K0=": "455600000000", - "mWbRBMlWe76Kc4QvVqaJxk1Exa2brEjHb0dR2SWjhKI=": "1331790000000", - "mX4WyArrWsAMv2ZiB9uoX_aWBWFnRvLSxrH7IkjkTuI=": "385123000000", - "mX4muZ-5S5RN-kM00YALudGrNTmEZAUaFdJphlfGPfg=": "564314000000", - "mY4iDqST0XEENStuHAmARb172WXaCNfBjjEXsFrNiIk=": "451692000000", - "mYQtWxyhfXEUA6OFE0RG_0HTm0KixlZI22O2-wcJi3Y=": "378006000000", - "mYddrhVfwmUmRINMla37OqRaG3nCRNRB8YV7ntDYMx0=": "656619000000", - "mYkd6Ft0lFiuvfJvq2U1m9CqZxNpbDjQKbNe3Q0wOkQ=": "1043831000000", - "mYpPnKHVYOejpNed6h9ezZKWcp_9DA2nFeb6gueGVVk=": "6637952000000", - "mYv1TnQLr5f_tKk3hm7NT85eEGxqerUuhYXq9CU-pco=": "1951354000000", - "mZ8dZVeB6hvMDVCvP0MXOIKZzgiHlL3cTNt3WZuIPT0=": "1156517000000", - "mZAN3mywAydrwGapMG_7dTqlbOBke6bvre9gEwT2y20=": "2925713000000", - "mZFfcglV5GWSzr3Czh6ONJDP3sc5mWhzckgLZrJen14=": "910115000000", - "mZZ0EMvQz31cYLbVPUr6KCqqeQtYb51k1yHzbJ3d_Ck=": "378310000000", - "m_CemrTZdfFgRJPfbD3w77gQIAPnUI1dN6iLOxpI8Po=": "769105000000", - "m_I4MjN8iEAt2Pdub25LkXYpS3mhCyVMla1bJv2SWsc=": "1157258000000", - "m_aycUWot5aaVWjUJqsdvfuXeGzFpes6iYcvbQTXej4=": "3322285000000", - "m_dAjr4fF1j0W9QEAhqRzefQDWuQmbIEfyJffBs7J1Y=": "820377000000", - "ma35NI3Xxw5-M4FRmgCKsPF464AZnPa5UqokdAzyyKE=": "471203000000", - "maMElOMSsIvPCMRdpnDJcuXiu0AIlWpbQfPoXqWET48=": "2021862000000", - "manV64y5J2-PVegaWw-lhW-nMtoai8eUnrAO4ioCojw=": "762930000000", - "mayXYaFLihS-vwU--6kF-a8YJ868EgjWYssltbcVscI=": "767693000000", - "mb5_5Jfw2feVGG6WfxVS3KEAKLh28p7IVyv-VNkD-JQ=": "384531000000", - "mbOKmMAslqbQb4m5UBGHHRvEsek8Y78RavEZ84VXUB0=": "454342000000", - "mbnoGif2yb6uPN_Fw1xcREU5sqm7yHmG4qsEy3BK4aY=": "455600000000", - "mbubnbLEaUFnqotZ7sLg7m4A1vcW5zw-T2TBjhB5cBw=": "4694039000000", - "mcn0rhMfLfyVneosRFwF-w81T7xnjlajNsLlkuJGvM0=": "1153846000000", - "mcrwiC50qEyKPfwYJl33Wde78ZYA5c3hktHCULDvqbI=": "4571675000000", - "mdOIXAMNAAZxCbePsbqTGV5IjE9Yktr7py1XGidRMy0=": "391005000000", - "md_2cPlyST-tiuORQjD-VWX8oXGwlktmmy1vvYC5Lbc=": "2062284000000", - "mdeiVPnc1LXpUFP3ZAsmKyNcLYK6Rx2uNP0WTmO14LQ=": "383241000000", - "mdnfBFudgYvkMrGTqOhHUMfjcVVnT75r8-U5OpqOOlk=": "1923076000000", - "mdtnpMQjGdlRMBAbXmpsLdE5xMHFmgRm9jFuYs-FOuk=": "768373000000", - "meGSD-O_IBkXjjaMhoA_ed8cd3L_aMvcTCal17sC_No=": "449698000000", - "meinkGOI726zLW0e42Cr_oYAEi4bfGX1VJh3dU0HYHc=": "616749000000", - "mf-JRoXVGiDHST0wLKnBwvUAkvOSc4MSLmCTeVt1qkc=": "1590488000000", - "mf5HKG9Bsp1q5bnBym7dWM6VzkOBXpbbKVpMrQSRfOs=": "420691000000", - "mff7KGqq37nkBbV5R3W3QSNxDFUsXxWVAGE3yXzf4Qc=": "907772000000", - "mfyOygTJ_JhUgn7sc5IEGwB6eZV-xZDtzdKT_EkzydU=": "3852131000000", - "mg6yH14HOM8QeoFU27vZG3NkzQExW7em50IFFru-M5E=": "414813000000", - "mgB_7AZ3f0El0D3iEnKbxzTARVTDNvN-TrrOIBgbLMs=": "393877000000", - "mgHa1GHY0CGPTjSbYyJSxL9CAvu6nQap4RhjxvqBEAA=": "389613000000", - "mgJ_V00WWpAovQdyzJ0n5qW0GRzZlyk8PYCYdbv4O8A=": "2483049000000", - "mgKFerxsm2v-dDbknK5GNZxAvx5L6EXVKTUJuwum1r8=": "548770000000", - "mh-GakteTXXKtnXkf64dzzYbQxtcVFEjxpAi0rgVDxw=": "416775000000", - "mh2Pc1kxjqlFIqUZFnpI-pxpqu-E-WxQSj3Qmmg3Y5c=": "384615000000", - "mhF84pchbreXcduIjLB8SFeLFCXkC22ft3dRWk-DKsI=": "462146000000", - "mhF8BvjRiFQsoF90a5lYP5C2JbmFY3XR42ODdJWOwHk=": "1978982000000", - "mho2rc_UDVCukABfbkR0_Q3hrjnE3dBSthg6oTqvffk=": "416644000000", - "mi47c09qIRju2uiycNOGOgAPONYX4P13I5NBP50U1d0=": "463795000000", - "mih0JKWMKFjcGn00UXd9grVcwdZZsNpZprUTcaQIXfg=": "452356000000", - "mjBJyNZFT1L_2nAha1La1fxdss29uSsByIhurDQBudE=": "3104469000000", - "mjLwVw3spA6VkShQRkfj4mtAlgc5kCtlBj0QN7c4d0I=": "1154123000000", - "mjg9HMYAdzLxSXf7_ViNry6XKK-95d-OZr0nXB7uBGk=": "2088168000000", - "mjk_9YxybiFE27z-uGGnX-O_iqk_HFP79xdJlyOTPSI=": "423531000000", - "mjqGbV9ee2AEMv0X_LRHWno2r_U_X4Xe438K2BjwEiQ=": "412781000000", - "mjs6v-uoi3YszqHFIyaynoJ8L6pDDLP-XLJ-7WGZIl0=": "462839000000", - "mk92M9tnhM6m5AkAkVD5J3gsj7w1sftSka3Q5UGDthU=": "1130571000000", - "mkBmSMysxymVCD82qLx9Ijbj9JcmimWCn_eIRtnEfio=": "4621453000000", - "mkECt2JyzXNsM81N1jfjob9yxQqhAJxCCVfrp9WfQBg=": "4545454000000", - "mkRfuwWwLsh55HIlms2OQWerajFCJd39wmFxhfmCxE4=": "1133655000000", - "mka5Rk6tjLmwx973vg-_eAt3a3DiaxwTG5tO8QZkb9w=": "1890021000000", - "mkjVBbjTj19Hgl9kOic7WOtxBkNCaT7jmVcPQw_nmnQ=": "454648000000", - "mlJGC_id23C30WLNdjuiIT2Y6jDyUB5c5qrLNFgi8wk=": "383629000000", - "mlK2zRwnHh_oDXU3TA8cxGCofQqGxrmkO9marF5Z7iE=": "530710000000", - "mlXy_1minPsUgPuj2_kzZCLep0a8Lrq8l33g1cUeEhE=": "804129000000", - "mm_LVotFzFrja6zx13NHD9qmmGsHgO05vf_1dJQJjY8=": "416666000000", - "mmpPJAz8I1OFFl_IBrqhws1xFYUa2RX4tZxRf0FF0KI=": "411085000000", - "mmq6hu4hFOPhnyc3ESladICRBnSbPklsv6qmmLVl5B4=": "769230000000", - "mn40GZfihdNrFOgfRmaRga3uO61sY4oqsGkIztAmB9s=": "454850000000", - "mnlwNLgSqmAgYrCULZVRZL-5559wJ1VxNb3hTqtKWF4=": "917122000000", - "moPaFD-iQuXXsthkD48aU-9o3feoBUpvqCxCZsKdfXk=": "2083333000000", - "moZIbMdvE-U-_eTQUGbSte0Z4vRseh8TZOlIPnvvfu0=": "385506000000", - "motcSPBj5Obdl7nhAw-X7y0fswZvCDWsJUbMSyDHntE=": "836874000000", - "mpFbmf7OTH8KwhpX_7mb9K0GN2wPhnD4wRfPIV7thmc=": "385510000000", - "mpNCs1pb22tskrUAs4w9e2Y0PNwqTmYe9siChTzI1YI=": "2271830000000", - "mpY6B7Se3gzRJUxHmUAOxRgKv8eClKzyOTi0A3pdhXg=": "463541000000", - "mpbhBhpW-dubvKqYalGlZo36DplG42rf3TK_1-kaDpI=": "576725000000", - "mpdTbdSXEnk7RNhUeq4nHQRzMgx9rZVmn_SC4fn0iIw=": "384615000000", - "mpwKpm8QUIXgn76DoSIIj0Lj7KsbpU0O9FBzp1zNeYc=": "4373636000000", - "mqJJIuhENTDAKj5zMWaqJ5s_DckKoaJ4GBgcUvQCblI=": "461611000000", - "mqrx6OFioFPj3eP99wgejPqNwEQ9aOZNL4QUDvm3WYQ=": "416696000000", - "mqz10ph7q3zfPT-YaWPHsAFQkAxj6_16pg93YdUIEs8=": "468837000000", - "mrl1Gh02H4Mr6y3rFI9rVEKYAWIkLwPaOb0YzPvolU0=": "463431000000", - "ms8cXARz--7NmOYPclmHKZohsbFq98mLaf-Tz_1rUis=": "454545000000", - "ms91bZ9AjzmXGG3cDgfMYQfadAC7B_OrSFWgmrZiFAs=": "3384196000000", - "msLKqjQsPc3jyZMDwAFEhTbxzjQt3pQXhTdwaSc6hfU=": "397128000000", - "msffStEwaWlYGR8QleFa-L2XjqaRQo7tQMObBTg6-oM=": "833333000000", - "mssn4zCWq0CzZV2aoMOEVOAkRdH5xJtxkJtogloTPxk=": "387826000000", - "mt5hSOiaivAoWeSy-_7pNBMmLykVkyGO9v92Xu-kKzQ=": "1153846000000", - "mtJQTG4Bvil_WQPTzJnsHfMWxE1rHeUR3Zxso0XtMWY=": "1156517000000", - "mtVOVWXPCzQ4bVYFpYtYhU8vRq3Fpjm9ir3QDCO0ZIQ=": "1156522000000", - "mtvKCkDQhVhHJ0palVlhvpszLeffT-3abSRuNpfmLi8=": "384615000000", - "mu1Qcgq4Ky28iLJW6T5rVKcqGpnMpSMSDOlLRatXMSI=": "597896000000", - "mud8Dq1HkjnG5D6MWNmpDGhVcDBFXK1kA3_3s2yYsn0=": "1319281000000", - "mupGrpsL0IjmDufIo3QPiD8iTxhzrJLtZMf_GstHtcs=": "760671000000", - "mutYCtARCxVTFhpcQ_U38MFuix2QD5fWgwNUZzKqtkE=": "2960113000000", - "mv8uNF-q7I_9wPH22eIfcSJ8kFUY6lctQ714J1BvkiM=": "411085000000", - "mwHnOXJmFHlfESMqvj1Nx2_EFK_1HOmXdxq6G1wEAWE=": "385507000000", - "mwbQqOALhOaP4FtUL9-0oPoIGZcgQL7nhcGLHEWaj6I=": "1562722000000", - "mwf3tTydxdaYqRQNn1gOVcyV_SnM8OdQq4d8d6vHpnw=": "470073000000", - "mwwJ789jTf5BPGOogUK0VZ6sSCfJBvhzQTsSS5UuibQ=": "455600000000", - "mwzptpqgB-FWBssXoS4CCOfRwiCPw-9KlfwwnFd7zkA=": "4078086000000", - "mxkPAvh-7VYAMQypvkHbYpFRTIGE-Slz_0rFu1qMbn0=": "1959914000000", - "mxvK-qWqmnzS8XacHRh86hCTyvkPWVv4e7ZTF3JYwr4=": "5093279000000", - "myDIWTXxTQEyLzZ1v9lnsLJBoWTSLXOCnasd4Ueeev0=": "408203000000", - "myL46QthZroD8CNkx_EMD_OMFVKX9ovBy8-Wm2nSos0=": "842892000000", - "mySVSuEqhV8RacpQ2qiccD-mQb02s__C58eGRqzJ-hI=": "3412615000000", - "mylObiuruthbLh5bBiJ_HGrOkgLulThJPRRou9ZvUVc=": "383204000000", - "myoxUsEtHlxZxcKdc5DdKPcTmg0gCpJm5BRG4N_c_U8=": "423076000000", - "myxAeNxkJJh8HXAugOcRccBNKdBLjFo1ylOzCy3os0c=": "469349000000", - "mzG3Gw2fWHucXYQ94O_3qXk7KI5P2UXXdwifMS8ubYM=": "1158619000000", - "mzHp38U7zEobRoqKAInpwDJ5K2a5748LghFx_HEJdbI=": "3530288000000", - "mzILaU3_aANOCkAn9mYVg2VVsDB4XjoeGcfJ7r2gDiI=": "427093000000", - "mzkqowINuebLx2hnlxi4bxqzSSb-czDCRGzQzsMH8HE=": "470856000000", - "n-Pi1NntvPDxbY4q6_IYaQr0IQBXb8IeT8OEmw9BJp8=": "3695416000000", - "n-Yla2kLk7t1PGyT494ItvOileO6_fyOmMZtdk1Gb7w=": "4087632000000", - "n-pR8A0dz8FrHSYFm0SpVqEOABXYX86rZgAs_FUed3U=": "385509000000", - "n-zlTxJEVD-YfJfckohNwc9JhuFIAggoda9D_8c7Cbw=": "1370999000000", - "n0REofvOH2f3huSRzUuUlucQLnh-Q3S-8YKQKbpHr1o=": "1153815000000", - "n1M8qja-qyZbhHvvDCJhB091OTmXtfa4beK04x7g3qo=": "3190592000000", - "n1OTyyjLf3IQS5JYcep76d4yeBg1lfFfEa4aZBbPMk8=": "387996000000", - "n1Uc7gAyiBFHspT7JbK3MJLt6Chhm4k5wPm2F1W3QkQ=": "466620000000", - "n1XumIFTsOFILVvGa3zItfNXVZ0nKwjSBraPHdedFHg=": "2061902000000", - "n24xRzGOJHh26zGmpYsOm3x-NWbkmeCfM_aHqUt5yVA=": "384615000000", - "n2AECb63-PJTCWlK7soUswbRb4rdgWkuCV2DbubpRZ4=": "1179356000000", - "n2Id0oTNYLL8P1hC7jO0-iGGNXGcupNcqPs3ksRiHMo=": "416901000000", - "n2ZyK2jKKuq71oWai5AxgdSk7251yaM7mxJy6OH4nLc=": "381805000000", - "n3JoTgCVx4JGq15LeVnZ6zpLseNhh7UgfvvhaRtaQUc=": "1354095000000", - "n3bJFIJD6g5SDuDpAiseaJDpyL2CZiLK-3orzOWKQv4=": "416666000000", - "n4Axi3QEOka7fTLKMsQaZK79HVPkNZB0Npfu14f6cQE=": "448425000000", - "n4VzGSkd-OrbJGvZHRnykA2w8y3y2P-z7wzio2qNjII=": "464950000000", - "n5-d-UyT0_pak1deCKSvyaQUlZL6ubZ6wE2cTDkukwc=": "3033046000000", - "n51Xo11tW-ibbL-AOwadL67IEomsLPzXEdRQeVMOPoI=": "833300000000", - "n57EutK4VB1Zx2BOWmle3sRTan3QPvADkGofUpFHApc=": "462784000000", - "n58HBg4e1QWdWPcihgac6YweUgcJUgLgwWglEO0U7yU=": "378995000000", - "n5KgWA2GqhGEjwS6ZK3JqV-pOdFnUzhRhdHXruh9zpo=": "1556113000000", - "n5hRj1emq4DF-8wW-kZo0RNmsMTiMynCTP94D60rPpQ=": "454545000000", - "n5on8xtjzf3Zv9_s3HpsQE3go_GvLnw0xzR4VgPnets=": "1642956000000", - "n5wG6WIvTCS34mj1MHdRPy0ZG9Yf4kOwsKSzWkV8nhY=": "385258000000", - "n6rjUSixgLu2mYqJqZiG_ZNdWGzmuZ_1msdXBA3Y2bo=": "569876000000", - "n6wWqbL2NHkZIIb3dtqJJoG7yavbCVvDYDC1Z9hTDaw=": "456239000000", - "n7Gz667w4Wk_2VrTMEOWDOCj6OqFzmSQUmlEtoomN10=": "404814000000", - "n7YczjTGc2wp-C9Z328h4s5d8Wn_CUliQqkb2kGjkqc=": "380428000000", - "n7t89-orOrNnKPI38BOEkAZREUJUajDxM1NSz8nEIVI=": "826828000000", - "n7vsqQffx1Eo3jVTWxQTr9afFiBcKsofD9n9oOD2Uvs=": "384615000000", - "n8E0heLGtBD4TYYYlvchcU1GoXYRwnTAgVcpRY0GqlU=": "4011344000000", - "n8NVfGqOpEkSYuP-r2qQlK_01LcfEPiXEDeO7xoHkUA=": "1156528000000", - "n8XPd-u3c7pIR7-RFetafQDIIK7sHNeBuFk8OqXSy54=": "814902000000", - "n8_fUhmdZxJwyv6B_xBRjnST8p3iFByVI7QXAP0W0G8=": "1063461000000", - "n8dATQOGJks-xwwOnUpnBSSaENGxinWe1vWAWi-iEKo=": "450062000000", - "n9GQ2qXx6jTQufAA2-B-AXPFdM3AeM0J1kmP4UFqhXU=": "2306691000000", - "n9VEEaC3yqK8VGF12qpGlNvNTQDsmL4AcUGSNQoVFJs=": "2055429000000", - "n9ivAUZcsGWmrJBR_ZNAgRH5ZveaQl92ZtzLfqBKGQk=": "3656282000000", - "n9pvX3bc2XPLXEzQW_qsIgAip9kcI0ydMLF97vNaMbk=": "469468000000", - "n9rFbhLy1BIyWvJ9xX_vupGZFO7fJ9hR6q6fKmEH_SU=": "385213000000", - "nAYq5_iMLNzrsjvXp1mMYOSWtCz1ex9nreef4C-uzTM=": "2406412000000", - "nAZdrJiJFwFoWwg0x_CYXLUasNJqFOGB2QUZ-4hVoSw=": "420128000000", - "nAqXEejkdEZ7irxMsS4o2BpzQN-5Vq1Q4smiImBNg_g=": "378341000000", - "nBGYOEjpevTJSAvLQTLMSD4EISCK6Mt6V0pNdIINWOE=": "3372600000000", - "nCHpS8Ou7ozQ3XVBB3zq7kwrqOoY8k3z6SS-L5mWkFQ=": "418546000000", - "nCUFAzEXdXOZZnPch79IQzYZCsgCVzAxzxdGOmrTMNA=": "500797000000", - "nCWQRuFaTvDUQfV-l2L56bKAV-HAzCa5gdI6XFKZYNQ=": "384615000000", - "nDFGkVYtO73yZb4QgXUaSdcvAAL7inSjUm-SvKD7ZFg=": "384615000000", - "nDFXLHp1r8NmPzbYa0uqvalHtYP3uxFUsZVBMk5uLwc=": "657692000000", - "nDrlBWVOxcX-r0e3SS1yhfOfzwgEjjBZJmbXyZzgh_k=": "385731000000", - "nE7Sblq0muflgULiZFZec9R9A0iw0gH3mhsFOuaPzEQ=": "8228306000000", - "nEBDbibz0QIID2s7qp7sA239MXKufIDSqdzunVcYjlI=": "984770000000", - "nEJjEGMaPF5Ico8jM8C40Zphs6PPloiEEkVmyEx9JIM=": "1378448000000", - "nEJpxIQzHaSyMAnLPw-2bwekk7TLDfarxUfktEYSJxk=": "446388000000", - "nEZiLu--LCjAMt_V35fhL0AYWz2kN2SFZiwe-MQ4cIY=": "988740000000", - "nEuJsi-Z19fxdFHxl25u9xaxrYVK3L52t-wQP9UhjcI=": "385510000000", - "nEw32OCvmc3zDKXZ6SpAC6wewUwZ9qMB4HaiTLrvDqI=": "3915443000000", - "nFIjzP4179_y4pijoV_VTLd6f6VGRZ9ZuJdkn6NnmWY=": "422471000000", - "nFTTqGxQ6Gu-SkdDPzxST-1Tc9yMWRjXyRE1m6XraBc=": "463761000000", - "nGkMTxecl74V_tDKrrPZmRRe5ksWopLF9_yt_UGs2lM=": "734514000000", - "nHCX9KyRccbfpTzbfUrPA1T4-Aesty20fg93_3rthe0=": "391797000000", - "nHLO41LvnNvLOIgaN0f80hXehF7pJN4_zLiATBpm1mE=": "4621453000000", - "nHNrr-RKdcbGeWzpdUmv2ZDmTK-ND3t--S81F88x-Pg=": "384615000000", - "nHugt0olAEr69Ued6uupcjZse2WkCmwSnZS619iDwc8=": "454756000000", - "nI42LJkscl6RKYQA_iTfMXg9O7XWodZ-l42eRR-BSq4=": "833331000000", - "nI674zIXYBo5OUGvZsis961Ntxy4brbMYTU6n4RlArk=": "831312000000", - "nIqCuAKDxC_NF0pG4gwc9K5Cy_Z7FZhpoQTJKAIugnU=": "385506000000", - "nJ57DlmQ9iOfsO2Wu7OCtw8R4iVg6prP0B1-zZ1XChY=": "20646899000000", - "nJAHwgaarEZBY35WbB-bjZjJT7nwmUHwUmk7rynX5H8=": "7394562000000", - "nJuro8km3GINK75zSwmMdYkBgyaojUjPNlf1DKnQOi4=": "1154123000000", - "nJusAbgocBtcf6KVG2UD-XgZMMa9j6rHM3NBdiS5Vio=": "7972680000000", - "nK4IyAnl5stL_t7SN2qOG-2r-IYv3cy0HCu5pyHdGhY=": "377987000000", - "nK8lF0nMHMulQzoPnoLgYibUOtuSTN8nV3dP848IZYU=": "380208000000", - "nKPMIXzjCLP2XneV8SW0_bf-VCYugae_EBbFBRPhxlk=": "769230000000", - "nKXRJRMFRa_BP0taUffbHnT0SUlhouuBVuSeSuBt5D8=": "2692307000000", - "nKkOs_lplqZUCiOelqzLKH9SFd_tJyAKt0BfpqB74x0=": "5188649000000", - "nL3jDVpKy7XeLwZ88ExNb58oVGCb23VMicQXrrUSH44=": "385507000000", - "nLjJMU_jKqljg-kMjzpt9_Mbxx2i0PTLftGMZEcHrGw=": "378611000000", - "nMQO1DQzVOH_EMMZEhNDHhRGrmxpjMN30wZQcUzUUeM=": "1134971000000", - "nMS_SFlyxgxmAXS6FHsg1q0HZoZDLL6EVF7AaRFnsRw=": "2022201000000", - "nMSrLPCg8SHXa3FFH7k3cPkFWqFbLTlmymbOQcM806M=": "769428000000", - "nMcuuci8Bv9J0e6FQ25H2bmvA55Eu6see7bdVAHbsGA=": "480295000000", - "nMhyCONYfHkFFnyWFeKefmz_ErwwLKN1w_5ISlEjOtc=": "1349526000000", - "nMl8NGErV73fObeuCdbavFlnxvLRMdxWtPEyuEv0UVY=": "385506000000", - "nP4Pq7OXt2KDJFhJqM4Wh3D73kaB7_STGFhz8wa51n0=": "384615000000", - "nPBb2aMn6tXtMuaRIxCHEsXAYsekQJ8H567Vr-ooisQ=": "4091726000000", - "nPEPt-mNULMwF259hbpcUilpc6Z-opiJ9CNJDnCLHj4=": "1666666000000", - "nPa1w4752ZDGJJQ8_m9b8hZiRlA_KRGfiqNdaTTH-yU=": "384615000000", - "nPq4I6p-IvK_Vfh1xlJm6FsiOlLSaXGsUI_dDjLGgGg=": "469402000000", - "nPs7CfLtaYBvhY8MEqpq2zxao8oTSnrOAevlE1QUeMA=": "914050000000", - "nQTLiixqimskzXRI4ZrmZ3kOpMIwl7KuebKSrkHu9ZY=": "1893589000000", - "nRRffEOcNsW5upD5ienlyl0aCbjrVtnhiPO9OETR71E=": "412158000000", - "nS1Cwvbdvezk_-gCw37tshm2SIMrK70q2kbwDP8YFvA=": "411851000000", - "nS6fOQRIPD1xiZfolHKGAGGkX-4qhTCR1ppTx14LvtA=": "384615000000", - "nSH-5lTRKH9owzYrgCTLLLe7gg_0CvDXlYV_Z2LwwJ0=": "1242008000000", - "nT1LZSr8loWTbeAfxcQ3tdv7gjNj7rkZDjhI9PyPNP4=": "768464000000", - "nT3fZF7IMR4vRxHwwQmHAftPjKh730DWiFWe06Z7InE=": "1923076000000", - "nT3vmIMU7IuskNvqWJlhDkhbzXuUYuiFPzns4vFtgbM=": "1344514000000", - "nTETbPHTEhaqESyQq16lmEj1sxm5CQzHBm0Afpe9yRk=": "384615000000", - "nTIXq7j74YR-LpmNiUvyl2twBm-j-TeY8lfKdRM6nzA=": "1923076000000", - "nTQF-oVysVxE6HC0lC3LWbXFiqZdYVYCf0MOtKGvamI=": "384615000000", - "nTu9zh8YJ0M_OicASjkUYSoVLWKJt3Aa3xPgXHvGy8Q=": "1152202000000", - "nUYbvpgO_O4XqX4HAlmc-97s1GWT5OA2Nvf-5bLVxKM=": "384388000000", - "nUdQdr5FEN1Y96I7GFV1QJh1gN2FtCCkWV9lgji7qhU=": "556279000000", - "nV7I0wY_yuH_6FGyTe3gNLwEMy-DFBD4gzk4J2kTmyE=": "1228523000000", - "nVD2PVNktz1yf0nRp4fTfOXCbjBU_X2jPcyvw8FtYyE=": "910164000000", - "nVKmWLM4hPQiInBO2NlyJu2dWgOsF0UPvCeAhz2wvsU=": "500251000000", - "nVn9ZdeA52KlOQac9UhHBuimPJd5qEElwSi-BW7rA-Q=": "970681000000", - "nW-T8lm04J7qahM4FSDLbxsM4wj2BRo0FCUnEWBpEBY=": "391885000000", - "nW8bo6vQDY6K2OBWgs56wgFj7gTarYlAbzO1G2UGtls=": "1404078000000", - "nWFM0guMOx3EPcY97Mpe88VtEAHFrAro_lOXIWLeDP8=": "598794000000", - "nWU18ahYNpH5Gbz5kcl1IzK9kLXig0fPu596jEXsjfM=": "384758000000", - "nWa3ovlw4fw2HYa2bkFbmbLGgXIGJgzFBvPaDpVDPkc=": "415288000000", - "nWe0YGYUyt34_SmSHzHJh402FZ4h00oaL_RkJQGH6UE=": "473265000000", - "nWvPls-RFsJwwWyN8WvyEnnBADHOBXNpwBZ18-eagT0=": "375634000000", - "nXFXUEyxh1EZnEYFZP6CUlGWt5KZr8fFe9z4AoebMKg=": "389097000000", - "nYsi_SY_fVINxjVOF5DlYjtXZRk2JPEPah0FWxqHVCQ=": "358004000000", - "nZQ6-XPUYVqIo5En7b9klheghnvL-JwrbsowN8tBSd8=": "384615000000", - "nZX1aAYQchlrNXTug_LYtmKlsE-nZH4UwZ4mMGWayt8=": "420022000000", - "nZfasyWHptzc3i9DYwZIdxBCq9H70x07mDzn-rHkM-w=": "471941000000", - "nZrgfMf1b9ZO4GrDHkOasHsymvLKksDn7VcGqCeZXCw=": "772105000000", - "n_qgmKiLh7QNtaFJEl12rGfzAwDLCWcEkYyTpQOm69Y=": "511839000000", - "na5xB7dbKUYStuz3RSo_Kq50ONgdKZRQeWBG0JZ1Y9Y=": "466152000000", - "naZFzVXYPVZ_EWfCC9T15tMNyz00npKvKgDk24ceWMA=": "454643000000", - "naczSSaNfO4aY_EF5bpfzMfaYDbnM6tr8XR4AiO_Tlo=": "575059000000", - "naeq0jFejWS4WpuKeUqtvbYS6SaX1h8p9s0W9wLWhzU=": "612877000000", - "nau2kGzMQoxThjuHa5GubHApkoVGvjHv74JlCad-CXs=": "3722997000000", - "nb5bKaN_f6sxUNJpkjlfxuuXNhv9AYExkeLeXYdqb9A=": "2083366000000", - "nbIbbVN5ye5Jph3pOjORxNPQj3cTQVOY-jJ0oFwFAkk=": "384615000000", - "nbmkLIFYTQPaCXPdaZMsuvxSBfnBF4SrBwu4-0k_94g=": "384958000000", - "nbppL8VTf2TiMTpt0RvE__D8OoTrobzi59xSIvNEc70=": "1180412000000", - "nc-t5R_soP0y0SgNU0iS26xAZ0VAV4MEXsOk-fcxjcc=": "384615000000", - "ncVx-dqAglvSjSl1g8l0pI4xeVUF6fLqR2mW7SJapGM=": "1866440000000", - "ncmpIdepRY72NSNZzZl7wrUm4lKyJr-S2PcSJkz_0w8=": "384268000000", - "ncr99HR0MIt8JTgAnKRtEaDUDAwhWW0X_qAT6Cbe9Go=": "457013000000", - "ncw5G4KNYfeNFMgJGGd6y0rkJtJ5RW5JeZVpo7SaauM=": "597458000000", - "nd-HuJBfhzRcaUXQ4AJspWJKleNS1_LRRQJ3p8F0NrU=": "384599000000", - "ndPef-CicbcNCVuVWJGfIDGN2QldJI85tTwnjqQOi6g=": "460776000000", - "ndejaC2FuKrfVxMvnWdHdMIzRtKOegxkCYxAKWGYrAQ=": "1923076000000", - "ndfEYOi9rlwGHnuaXsDCbqqqt42mtc5bK1IAy4XdGco=": "804803000000", - "ndv-UP6gmAGgYOVJlPozulZHTNjbsPdn1X2RcjwL5Fs=": "3986462000000", - "ne2amiESMWCvFy8--2crfCdMqbnqygCX10ptkBnQnfY=": "452515000000", - "neT3DWPiFE3D3gmfonee0Lpw7PsJHOvz21OTmv99V_s=": "355692000000", - "neVISdAB3q-zhnaNBvfGqjL_X8ldQmJ6k2UGiOdx-94=": "459292000000", - "nenwBpNlqmnTY1q6qZBK82hL_CPo-LjcZW-vISQ7h7U=": "384615000000", - "neu2Pnl9P97JAZf0p4ZrWty1oJcT0TbSUROEbt0MGUA=": "385510000000", - "nf2QB96kOBZISdKDGB2G2PvwfS9lYZhZpQNZQqz7Ykg=": "450381000000", - "nfwYiUDIoZIQaBZItt0kn3bOgpfm1XIftzuNsGNvQJ0=": "407226000000", - "ng6tKZBZqAtbS5sPEk7syKfdIMb9G1XPwPt-HSnlOK0=": "384615000000", - "ngD7Coz4i0P6OROCBdU1wISVWpUtzWHDy0ZPf9Qu7cA=": "818220000000", - "ngOvS4ZQ4BU8LAYUzliHHlmE0VTOkN7SREXbug7HsZw=": "484181000000", - "nh-wdbIzYaTFSs2_y98cGwFrynZ2NTNc-JMM9nP6H60=": "450975000000", - "nh3QbOmRU7hrikg4Sw4s8ao8mhZC7FM8GrUdYXdxGSY=": "1009888000000", - "nhGC1HYB_gTaV2l5505k29uaaDsCwpXleisoIZpUmx4=": "452223000000", - "nhXQcsP8ZmXAyvywPCOGWs6QNcOzY6QyKbrD8mbTeRk=": "909090000000", - "nhbMrAZojkKY05mhOK15goBPtF61nvJAT4RB04bl8LI=": "379354000000", - "nhhAEHX3bjUlvpnvLBLON4Lx6VEo-nj1pAPrpRb4I44=": "416335000000", - "niBZUcu65cjd7YWnYYfppc5EWKOEVMwK0gRJdSLb-Sc=": "1363636000000", - "niE_8htF9_ugaaxeL9L2gXW7W5NmTdu6fs3XDNMaBGc=": "384732000000", - "niJdOo-i4XkHL5VbclqugHV_IcWMlBp92QIDhy4CJaA=": "421370000000", - "niVKlaVcr8ROjUw323mjk8RRHv3F2bP8r6RbtvkGdTg=": "563636000000", - "nicwV4wiVxvYYhG9T6pfy1GtL9FtgOHIzspRCZpZpsg=": "541749000000", - "nig_mOWJ26piZSZIPNGqQ4TjIcJ2LHlPwIdnwnK890A=": "380610000000", - "nislBGlpXccMPAXMRNoiR4KzDDonIAQVI2VpWH-3VUs=": "1170708000000", - "njNN6FaeppyRGmKF_k0e9-WDYhK5VzFpqc5b4cqWrAw=": "384615000000", - "nkRcr2KkmOGKgJyBbpO6ahQuYJX3pVzC2XycYd6Be40=": "377783000000", - "nl-6yp6FDpCV9M6QMqMvshhKRKZPZW9ZW_ZeJiq3N7A=": "470198000000", - "nlVN4CRlRS4pwvJZiitkShDJeSZfCjxthlQ4_Nx6RJs=": "423762000000", - "nlzPF0jVKoU14sCHRJCF38cXcXdeLwJIiRPmjHVqZek=": "637540000000", - "nmP0BH7q4h6E-e8m7nSP8_bp9MWgGQmPOv7rCaY059M=": "3294336000000", - "nmPseYbc8FXMYdAzJBPiW1oqfAy-uIk92Ht95IZTUvY=": "416644000000", - "nn5YJ1UqeGNG-9BncvtAqNMIa8fhf6-ZmvUxx8IFbug=": "3846153000000", - "nnRnDA4sxkaeLNs1Xpv5vSFgunggj0nJFvHKWrnGcFQ=": "384807000000", - "no--KahJpAgpCaLaMjqS9j-TK9ObjPq4Zv_qamqiFjM=": "3846153000000", - "noPt0IKKYVbOA5mdiZhIbETFB65294RTHny3IInBFWo=": "416650000000", - "noqIYpv8uTnKNJeFlPy9txVdniJ65K3w5Rsfh9zzsm0=": "470865000000", - "noywNZ176YKClP7t-D50ycnCKWAb42tvUkLPJmilUcE=": "450246000000", - "npHJzFPKD6VqivcrEInU2hSi2qpbpA3pd2zf3oMZ6qs=": "1978468000000", - "npO-O4Umq70cL_5OC17D7FbodDayVPhn39zDYd5iV8s=": "930524000000", - "npSveHuFhKIA_FH0qUj4exctSrQS3XjP3htdcybKICs=": "3755173000000", - "npnnvsHuqsrVWQtW8YioF3qDfd6iPI4V8AhuMsFxjog=": "1270412000000", - "npuCMhpOg6lkl6V8LLi1S4eiIXTAWHCW3bCOABvlRC8=": "1211627000000", - "nq520Xt6rlvhrYQeU_DcM2JNdmX6jiEVFqzrdDzCygs=": "462785000000", - "nqH68t1GCL83C313pSKE0zHnCkuEFjX7CxoUAYcKMow=": "500019000000", - "nqW1HaZUBjgaHyy_-Ol4KjEVN_Y13qJXdgbtsHMupkk=": "769230000000", - "nqx96JzXn3kSxRMwtYKptGEcQ2ApD3RXXCrfYdU8Q3Q=": "1373518000000", - "nrJ957PYfEoMPF5sDohh0k-omcwyHNzKHkFgogRmxT4=": "1223425000000", - "nrOiGzEOMcMfyrX8umzOSIHAf9Iawtl7j8tWXAgCzoE=": "454332000000", - "nrRhn8NFY7BRhLGniBU98NDKpaVBw3jbWfQkmxRlkbs=": "1149765000000", - "nra37ch0h0P6lcdK2QVPz8isLuRzrO8FE4xqrSz66eg=": "1891285000000", - "nrablJoaFYG53IqXcJOTfFyXVM95hrukUMTG7Yw3Cdw=": "8846153000000", - "nrloerwMGBXNpWwg5MCD6B0_RhOXJ4QD9_SmcChqucI=": "1153846000000", - "nro6VFkUw3-d2DXeePAZYtd6l3bRcoOUDZ_40HktW_A=": "384629000000", - "nrunXZpmKWCDPV3mQsVvqcPOLtOXd0UboNLT283TBg4=": "1927530000000", - "nsTWMki78C93-5mheP1nqhcP15viaOIE8vHPe6ajwpQ=": "1249999000000", - "nscJJi35EK5qBNbMfq7171OmFqPtjJJoLQNUj0GNAqw=": "411085000000", - "nsosUD52l5qV760n6vJFx0KXH9TVOO3A2vT1kdb60LM=": "3856657000000", - "nsrZ1vs4-bdoXbl0lJPnJ6nYq2ZGWzpOv_oAxRjkcSk=": "385528000000", - "nt6y11EfmgVBzwnyxnHnjIwnRugiIIQPYwYe9z8bqJ8=": "720996000000", - "ntDvR2jGopm38ti8V1JEHmCPYNApKEFIsX_mEWMmWnA=": "420440000000", - "ntVBKfT_SfDQY5FJb1bkzFjUPbdR0d4j1bJ3Bocb-L8=": "4166666000000", - "ntpl2sn0YBY2T94EiZuT8YjrPZu4i2z9uAZ5LBO49ts=": "1252906000000", - "nuOwI9io0TCbk68yrQkOT2tyoMLXkt2CZFTkB6zvK3E=": "15923229000000", - "nuRdUDlDdoRtrmwCQsY6VjyD_8AWr0O5Kd_mMx0kn1g=": "1538461000000", - "nufJgV1YOtVWmcXR2YkGDLN0RlpSJGl_-d8f4_vjjNs=": "384564000000", - "nupvnuKJqmQ6PqhGQrI5-ZTx6WCfvpBkqIg4taO1fx0=": "449892000000", - "nuvQIMTx8I7lwyKhcuNQ354CXiJVWWNjmM4sonmAoP0=": "384615000000", - "nvk6lDsjIvmKae_AJm-kP9brCvIEiR9-dlm5P0Pvgow=": "8160016000000", - "nw3dp78sObe6_gyuG5sglbqkAaJX2uPQiRxijCSLwrY=": "812088000000", - "nwcfWshuPz7T4UKV78n0hfucQIpHHAANcx7cLcN2zVI=": "1153846000000", - "nx4sTcskQMqaR-6t_HJbg3HwKrGLoCfE0_BkKcwTqrY=": "1153846000000", - "nyAKlXl60kE3vsSifwMA37K11IPmx2ICxerQQjb7fz0=": "384631000000", - "nyAOK_Y6rlgNPOkn7hTLLfYvEELMtjRyK322t92yQoE=": "467359000000", - "nyVcw-4y1ot1M_uZqezxfMzsKu37igZZc-VoaOWF-s8=": "389459000000", - "nyqLAIfrPgerMO1O7ndGRIOd2yDm7b62NuZ3mV9DnrM=": "1827146000000", - "nyvB8LpUddo90QxHRicQfb2dh7sDCQyfi-mhmZgC2bI=": "384615000000", - "nyxIdmw8J2IwdhzEervVTRYxf01ooA8AJZC7yqImFww=": "377786000000", - "nyzJoGtHS5ldudgJX71iRNy0VVADGe9Lj5c452ze93M=": "405357000000", - "nz2T53gwbypGaX18GfCLWFd2B6Yu7KBmH3fKBbNK7PE=": "521440000000", - "nz6OctAS3vTpfkTbfhK8YlcbJ7_zsUQgAo5yLdSYF8w=": "768904000000", - "nzB-3MjsEmnSrjrhnPSbo1KHXpCpXaNlQguIB3j_8UE=": "416520000000", - "nzGdGLCyK7VPpnUgl3918XfzX4EoR-W0sxJ_AG6TXKA=": "1363636000000", - "nzGoS_h_PxABA3kb7U2LUVzp3qVZvpSrrzECXx9xIzM=": "391957000000", - "nzVhY4eTUGY8Lol3nD_yfX3hYsuBBs9IU9bF-tVrc3g=": "2784601000000", - "nzh0fKmasCkYggRx0tKrEOAjt-SaaDNmh8oinwr8NZk=": "1238591000000", - "o-2WOGOInXzVSA-3Kl40BCtk7WBtu-v41VNCzzisWmg=": "384615000000", - "o-B7MYhCKdFdirgW4oyFWrnIqgYlq6uB9OpfmgfeUb0=": "2156572000000", - "o-BEpjCyf2-kByaMjlUY90ilWadYmAZj3dwlKVHNVFw=": "415420000000", - "o-ni7SNUVP1VfvnhQ189teXiXNcESUPitnqNlCcjimE=": "904621000000", - "o-umfD_N2o9lLKncRbUk5OZVbY05ZkJvaQznfLWILLU=": "525893000000", - "o0CSzFdFgVbFsaPiOjqnaVMjcLoQP-v5BzaZpscEJfA=": "923455000000", - "o0E_ZKq8upuZ-Ul924MqBESbRDo5-6NO0TPWoDdMHQY=": "385506000000", - "o0JrPq4o9NHbdt5aU_EPKqFp8sBZgWcOPvgk4tmK30I=": "422187000000", - "o0P2VIUfBNqRf-5gdjclStOkvqI95YYhmQIvodstu6M=": "2043414000000", - "o0QhlvUiWMio97F_10lbYqQCpDYreNBGBX_yMrdOS2Y=": "2083333000000", - "o0SyYqhbU2ku-cHFK53epnmVZX-tM8awWTqdVyKCfU4=": "384679000000", - "o1_LkpEgrfqZndWLeiu9yKaLuH6xAGlbRL5GFYUu89k=": "384615000000", - "o1jiWJI_MmBta7CfeyNl9ZJ28lwwpXJnExEGGK3oNUI=": "576551000000", - "o1lBzOj33u8Pu_4F5vH-tx8fukB1p1uHLxGXiMCTaLU=": "66714570000000", - "o2BQVxPLCPoNSUfpsww7k8-xNQfMtJYFyhlAn6ML4FQ=": "463231000000", - "o2HDjvl0XCgXpsAaIiGcDLM8hQEQD8FEHJZtTkKT1h0=": "677152000000", - "o397Qbo2arXbPyq1KPgnDxRp48Mt4rG8jlNJvJfxSzc=": "1538461000000", - "o3CtLvCcdnbrXj2_Xekhsi95X049dk00c8IA0Om-sZc=": "411085000000", - "o3aCHUJA0bvFSlDqo18QDWKzXhKdSLNh-weKNftk3Hk=": "482434000000", - "o3kFTD2taU2QJXBSI0E1-0JQ0dwiqXPzzMT-1vwc6l8=": "771280000000", - "o3xnVwwoLQm4SavoEhuaXIYnkqf-BCycUEs_8a3jOAo=": "382765000000", - "o48fhWOY6EIJQoNho-4b_ruZKBWnxI1f3M0QAHfZOFg=": "381802000000", - "o4TDLGcjK518GgZ0qdV_O3uoCeiuIZZV8eAx-yX2lLo=": "417633000000", - "o4qbxPt_Y91YluxSMEQrB2xwnUxj4iCz2WBnPlRoizg=": "417636000000", - "o50CSPyvqytKEtQw9Vv1lftUmnVJcUXf7YIoSkohA7I=": "385507000000", - "o57CiaWZVsRmvajakO7asGilD6qmIkMKHJ5FYnXrjuM=": "8346824000000", - "o5yDdpgHEov4mgzC61lO3_mss5CUs2CBf2D9k0hik00=": "1156476000000", - "o67JsRBvtoEflA-CbcBd38iNlOyafzGLq3V0HwcXUgc=": "773687000000", - "o6Lw5KCv7uT7fHOq5fj2dCUQ3SzEQGUVgymFig2LVak=": "453890000000", - "o6ZK8D-x-SLRGkG6qdxjq7jRCprcnlGdtZShqfGLDzg=": "635499000000", - "o6_dOtvdeyQllNPa_SObTLzafN99GMfCwUplLIT5pws=": "406180000000", - "o7gW2phIed_JiBTBG5OxMl8uhvMhZOArB88r6osQMuY=": "847421000000", - "o7yOIuV3coTNKwigISjKnvb3JdED2KLTADyAS_26OWs=": "7692307000000", - "o82HfaUiqb2giO1LgxfRw7fZcNkXTevKbe4QGIN_Ilw=": "378010000000", - "o9TOCNcpuLS6gVV8W9iWNOafaqLr61_gu3VTfK-8OzM=": "464662000000", - "oA5-1P4PI9DSFUtbg5kkQG5x9CYbCYc2mJ1ErlGlqg4=": "1927537000000", - "oAN5AnIdtbI5WOmoDkMoijaJwIsSo7KE7CuyaWPWRJA=": "642211000000", - "oAqfuHAevJuWp4G6AmN68uOQW-ryv3UJKmuc-BBWL74=": "381802000000", - "oB-IGWPe3xIx5jYd1tuEacO5MqVGwQHQ9SC5Aup8mBo=": "5602054000000", - "oB3RhSf0bvf2O6TSkWD4rk6Qsd0pPsiDv1C0fKZrD0o=": "836250000000", - "oB6z165a-ySgCRHh561qvTxsFT3Lr7DSBAr95y_Cod4=": "3364965000000", - "oB9_GR7_mJ--FypLZ3euf6Ctkp6S6Y8Mj5wmM5ItbaE=": "455600000000", - "oBYiLMCP1PRu11ZneKUeqUr9gtIzzkKA5EUAj4m9fP8=": "390237000000", - "oBkIXC0uFF-G8QR3T_sMhSr4SbFZqZKNt2TBerARkZg=": "461906000000", - "oBxMnDW97dWQQ2ZHsXsu7UB3YSol3NGgHV61HcnxWVM=": "994130000000", - "oCA74wQxl7IzFXxk5l0zmXxX_2oY3Ri7nKai4wOX8bc=": "1168476000000", - "oCImTwrHOJraPxAuO3hBBkB9Jg3YqE0PrKk-9ABvuiM=": "454200000000", - "oCROVsptepFndrEIF_wJTi6ZKUAPi7aFnzNaEeOZkd0=": "11580614000000", - "oCcZomkUB6QwNPXCY0HpSIcolRA-lllveb8Xjq9u_3c=": "4448085000000", - "oCqa0Ai_bMLjMLOhR_EvkrhBh7TX4qao_7iLYs0CBIw=": "411609000000", - "oCvpQef_yDLPg-Qx5JYwR5ZtFKT0Z3MymYg3q1D_CI8=": "1382564000000", - "oDCXB7ACjVx0GN_BBGpzOsVLp6qKIO-OCwnDTXnBkMQ=": "384604000000", - "oDD4L6R5E7GhNogxNxunUtqOOuxbNknggX3cajB6sJU=": "385510000000", - "oDFjVlNdkrdSztKJAhTbpnq15Z9xhFXtzqU8kOUODRs=": "1153846000000", - "oDHNT2B-FJ90ruNC7ohUlniNKuaJH1ba0W4mQSK8-8M=": "837715000000", - "oDT-iW5dDQ9ys9SU-SI1UfY7jrTkSxhDtm664Z5XxO8=": "416843000000", - "oDjayLbupl37yRdHBCcVWr8yhr3mNpa4KXReJWhw1Wk=": "731483000000", - "oDjlXE-l3YQVbaUBIokJJmHuydZubog-sVpT2Qz0Xpo=": "3625572000000", - "oDlMA3thWsYda_4ilA_ZGG5wzTZo2H0vevJmsSpjTto=": "2386333000000", - "oDpLWKOMtWiMjTsq3toCkIcBIe0x7_vbsXCC_pR3pA8=": "1518159000000", - "oDtAcz4Pr53m5QOc8ZiA7tEpOCJO-pliLvJz7jFNh5E=": "1459835000000", - "oDvcm6__90uUDdJNgMk8qKaijQ5DV8c25uTD3L5OxS4=": "462146000000", - "oE1Ivt2XlQiC3ODtgO5jUFUO8ywKniZP5SBQUIgxWQs=": "454545000000", - "oEKyJTynNpwmgCZL5eLI-P8F4QGmUQ5zrqtxEt1m_PI=": "384210000000", - "oEhbhO0wZ7MGde_O1NJ9adYOCsPD5kN-G9ILX15trJc=": "455600000000", - "oEzmXgcNqYEjmsDiPj-A06sRDom03zmbmXBmZtSg1hg=": "750335000000", - "oF4KwEK20qLgvyvm65JoWzfMmD_UhgdhuutLl4H4TGk=": "751952000000", - "oFAgdceQtxifShHwVtTfJteeEsxCiOT7Q1z9oFJQTxw=": "449205000000", - "oFTGajkZpbYCMB0M9rYzSBKr7HRBOgHBaJzSAjrHank=": "4241329000000", - "oFa5cWKlJxate3LdVEl4OfLkF10LRh_KFCtEJV1WmA0=": "416666000000", - "oFf7HRr8jIGVn5qu25znsuol5UoZ4PYTioEuDBIxsNQ=": "389217000000", - "oFuMYXnPPwU6go6S-SxQGI-lyKXza_AkibOxAg8NwJo=": "449482000000", - "oG2EAx4emMO3cHmuT2CE_iRnUMzrdsV55prZWsJoLqc=": "385506000000", - "oGDHstIwBUICm1zhu9Y_8lqSyE33ASaO-1-pTTR6ZQQ=": "6249999000000", - "oGvvo0793rmOqMcJ8yolbnCT6lZpvhNuwPwvV5UwFIU=": "460976000000", - "oGwu_6IqzUlgL9o5Er2tela3T9Rxyj-xgjTP_XJDtvU=": "3843897000000", - "oHPBhb832I9Fi87fsBBgQFuTqWUyyhb4SGjJ5SIQfJk=": "411085000000", - "oH_quCEUb1NkkfjmndwCBA0-nVDE1M-H0Sl2zm0rHhI=": "1927530000000", - "oHysuYIdK1JgXj5qiA7b4Dm34CSglj-vjb7TohajEa0=": "384615000000", - "oItXQoUm-6N3KNNFoIK_V50EpnUA8s50J3Q7LAsWuWM=": "961538000000", - "oJAPsQ-Prb68-hP3xe9UBRS-OzmutMovhA14r0nCeuQ=": "467593000000", - "oJGSlNK9xCGKsDyiNUwOl2XX41PAPf8pEkkgbSMZUWI=": "769230000000", - "oJT7KFQ9kmKWzA5_r30Fc8g5ZwvYe9rjmu8Cp75NVbQ=": "446710000000", - "oJc28DbaUHsazHfk8N6knxMEtZOdFpp6T3vCioagt_Y=": "926090000000", - "oJk-x2_DD4o-e8UVEoc4lHQEUu6EuXbgi2sCZ_Nz4RA=": "4196174000000", - "oKQ3QxaoPC18NA9Q4bUXQFEhVF6wEB5WVpz2HSYMlQo=": "384615000000", - "oL3X8MrNjCJGKCW2DWHBxyLkeXUc4V2O1hQigsb4VSw=": "385510000000", - "oLH34BaS0h6iq9qto7-aV7tJxYfu0Unq88getpxIZkg=": "385011000000", - "oLPbnYoDWNca7EvIE8Tk9Q3nZjGR9MwtAErM-tXq0BI=": "377835000000", - "oLu3O8l3gTIGntZntZiaM1OjuhfB8f2sokw2NJ3a9EY=": "416901000000", - "oLze3smcytjSdDIL98bVRww9HmcCV1otXdTHpLxnH4M=": "382394000000", - "oM48ERIm-aXG73zV0yVV7ybUupdmYlmzzm-Ty49NQbs=": "384072000000", - "oMHoMA5jxL-hg1vAVvShzdvIN5UgBYNGoFP3Ka9Jyg0=": "1131929000000", - "oMeTkOB81mrr5yukEgL7B_69S7GULtqZHFrPN4YV71g=": "416666000000", - "oMo6tUj6UXU08ivIEoliTgeG0bpLPlnkjjemb-y1psI=": "2291666000000", - "oMuWvgh5tllLPkKIrxFFTRhWuhbS0WyvvydrWLTfdC8=": "4999999000000", - "oN49Gw18Ukh6dwyY0SUjM0uw_GUbWjNtj6Wz87GHosE=": "925701000000", - "oNP5XWcn87tKg49xX4dirnFRqVrsvMBpCTBEEKJONWc=": "426403000000", - "oNibVP-ZZ503G8fC2B9gVTbA8pICS7WpoZgBvfbsWX0=": "465212000000", - "oNxTWg0lnCNNpULHF3KRucnGwDciTgI0VHPrgSsuoCQ=": "2022352000000", - "oO-3PnPioiNttXoryWYzBJfcTed7Dw87yyiOp8zElpU=": "460237000000", - "oO5F2g5rr9vTu5vA9pTtzaS4mN9jYznLSkO8vrsEd2Y=": "416673000000", - "oOA-H5lErO2oKC7UXJLwvmzwXtqfFSTF_lv8Ah0KpaA=": "2083368000000", - "oOruxuTh3Q8ppbaHGALGPItgbzqiln4XuK7EIT6MBlg=": "578497000000", - "oPIk1ZGjFjHoFceuHO3ZWFlySwtGDAHM5qpKIPF6SOc=": "420684000000", - "oQBfS80B7-EEQYf9-LyQURZVKKKsgqkwnuIZNhR9J94=": "420060000000", - "oQanRqMvwSDbml7omKPCustBIIFx2PJx85Ufd-VWUJ0=": "454545000000", - "oQo7KlI8o4fxyd7uF8s0xZNPa4PDW-ipRN0JNMyJ5eA=": "550726000000", - "oR4tVp7PsrgmUYyC0tvAB2syuOHIcIMFtcH_XjI_gMM=": "384766000000", - "oRZS7HlDmscM-zNvrcygNqHJeAIlg4wN7Zx5Adv0dEE=": "5146256000000", - "oSMLCHwVsERetSlPMx4CZBqQ_-XIecZ7GuXG8ptLQTE=": "442725000000", - "oT6h9DMf5VHFTXVffsW6ve2ZFVEeXhPNdsZEFbU-H8k=": "384615000000", - "oTTW0SsJSTrGVHy82cCPUKV0GOxWGx5Mv2oKf3x62io=": "1175323000000", - "oTknRh_FH5f5Wm97V8WfaRpZjsBmZZgfTogufo5Z2pw=": "454545000000", - "oULDr5IO24hpb4ZxJStspQKPRMylXQHNzsWKlaiVWVs=": "1233257000000", - "oUWmdg1Q9Z6dDkgPFTBYTcgOAkCZ9QV4cqhbleqIlh4=": "384615000000", - "oUc3U0x9z5yhKUmM5rT2XPLm7W4U7xBrCsQSU4Y82g8=": "385510000000", - "oUiKSN3sOe7dUnE9XOQkCNMCytn0mO-LKhbqgsfD8J4=": "386379000000", - "oUilW5iyLQgUfVcHnDlNHGnAIe5bRbaNB3GOzijLBp0=": "455600000000", - "oUqjLFIU-vUsYUuhncPSpXauNi2iE1d4eLnkNZOTOJk=": "458017000000", - "oVuJm354IkPY1bptoHTN6Q3Zs4FtYzrhWD7zhFgRk_U=": "927766000000", - "oX9wRF0fzvel9oqVG-5FWiMXWiX4NAIpmn0HEGPPORE=": "909090000000", - "oXM1pZfZTVvNmeXjObuFyckGYqmQmQL5J3Pzgiy8GbY=": "381162000000", - "oYJXrvsIe01W25T32IW-aWr3vKt_cmZ12qwmBklbPZY=": "3716515000000", - "oYOL37hzF0MU9eEIDC6ggxyoj1bhIL0OQuborp73oTw=": "382790000000", - "oYeI1I8DwX5fp4_rchR02c0Vb8SUAtTUEuba5QLRkZE=": "417634000000", - "oYzZ6H9B5QAzaw023ND69mzG-snSOFz47jV8ygA7cwA=": "437313000000", - "oZcDDEqV7uM6ZRrfOrqCRuftSGoY0XpAG5-z7sRtPJo=": "413437000000", - "o_2W6TLY4Z6CjjNfXG0Am7CahHUp0VMOg3xHixVv_l8=": "424673000000", - "o_fJIFFbnfEJwj6U1QfWwj-QA99PRKOHGOU_na1hHcA=": "1173549000000", - "o_m_zFEF6G66YztGkOsGRMVAP6xAsN9dP8kDiYSD_sg=": "384615000000", - "oatFSNHyGLaottbGKTDWnCeiN7s_5DT7F5jgB7JtTtA=": "452582000000", - "obYXE_FPEgqa9ULpnRiZNOphmCYUgwgvQvQAuOmeFSY=": "1156517000000", - "obZqsPU_lADjeSrk2TX_i7Dn3K6bpJRJfHtlv3dg_l4=": "761824000000", - "obdGGb97oHQmhjqWZpvcfZ6lxaaZIA2n878NBhlHWQY=": "1133655000000", - "obzSLb7_rHPwEHDz3iCk8qF6ZoFnGzS8cDQHMmb2OvY=": "422561000000", - "oc8zf2VcaK2T5BqHIiBal9HJk8Uin4O1fgNOH1GmY0I=": "545454000000", - "ocJbhUy5_RZM5SUNxa5hPlfSPlrK6EUbxrxONFOLiNg=": "456934000000", - "ocVQkQcWZUp2EykJw63wCSIbwZwH92DYKaJ0S3Ywwkw=": "384081000000", - "odLBMZpq4LlY8xSRCJNnvgYdWOFYLS7EGQzZYq5a3K4=": "1366800000000", - "odLeAgGu8XSwrSnULCh48hVq6Gw_ws4_o2rASpIssnY=": "381635000000", - "odw6qZDHxAPHUsAn9hkZJilDYxsOTZKWrHxlySKGj80=": "1501455000000", - "oeHdKyns2CAXci1_z8cA_sQTukKPsSbyYUT3ib7m7Xo=": "455600000000", - "oeUM-xro-i-Rf4wErmeAU8LxNqCeoyA7ZLW76hjNwrw=": "1511572000000", - "oeVWZ-T0-kklBD9H9JAobRH9HRDCJnnC20mlxv4wpmw=": "406076000000", - "oekiQQUBAe4nxlodUgOVOQ8kx_bkfoGWT2whxfSeGQw=": "539145000000", - "oeyEIHKNKHSIEtWFyfJUzh3Vu6ObhHiNC8lbUjhryO8=": "769230000000", - "of98OSzvKzJzPOi5n6yRM_VNYK6XE9vL1iYLixqhjso=": "464662000000", - "ofmRWOMJzwLLJOAJaU6Nf0z2OKNpXAr9UNFHv69ef-k=": "769328000000", - "ogBLr05_d31YA1oaZQyW3y9dYImfTrXcgcpFcgvlfhw=": "649553000000", - "ogU3vfhr7rm6zE07z3onuQitMOP0rpscprpkI0_wBrs=": "491000000000", - "ogWzuKskmFahrznbGpJqIf_4QolU0GoqOKZ0Ir5KYLw=": "445981000000", - "oghklyXfsJvXb8SVepLYwk6gSYg507GMsOwTCFd-PeE=": "385505000000", - "ogwdMkYLcYrzBJUjcFBZ71iHapKSGBDW-1xCXZvGBU4=": "389764000000", - "oh-Dhc-0qVtPXTbmNzcjXx9aKFsQEga1-BH9Zz8Jh58=": "379344000000", - "oh2M72MbciUo2rVc-xJDKoBfFYfdUfkY-Dar7jaORgo=": "385505000000", - "oh4DZRU8vU6M_9OTnCvollL06LuWgRyj9FdR1_He4pc=": "1272135000000", - "oh6IUs2I-DXERsVlqOZeRW-ggMAqVsurLgvdWm68LQo=": "912134000000", - "oh90ayVTj4uhUyUh2kEPb6wyCJsCvXNQ7neH9JYsgwo=": "524269000000", - "ohLxJJxn1FlTPg9eHPASwyxuXpNSuMtZvoOv84-_bTo=": "386127000000", - "ohTlIkx8l3CjNK_xZyNPa3jnKaeVnp1XfQAKZA3XeR4=": "915384000000", - "ohsBvHOKku0TR48CrxOCH4KFKb63fqnfjnruBb5cYik=": "454526000000", - "ohvOnmWOA9KSg4Ee6UTmUT2B1H1v5YYtzXtYHbCMRbk=": "384615000000", - "oi-2FlMjOPpAGCUYBDDcLnTJZGLD5ItZtahkM-IdVjU=": "1365166000000", - "oiJfxgD1_e9QaPVAdQudiCBIXBdBJd2KN0qrUGIgUT0=": "385510000000", - "oi_qXjkQx3jA1pSPEe8CnDt-jox7UOdkCdfFC0f7RPM=": "6760769000000", - "oidLSccLPYDepdIHk3rIP2L-04u4yrSMUN2lUFMHAl4=": "1363820000000", - "ojBQpXKNq83Som2ZwTXD54ujtewGBVnG5jTnrs32TrU=": "2020895000000", - "ojE0dFhDa6yR3jnySLrrTSdR4uE6weJtGd08P-701hg=": "385510000000", - "ojT9zXFTR6znTF3YflS1SGJyaouJ6ozUluccC1bubqc=": "382896000000", - "ojoy0Jzyg9eqe8lstiCFv2ptfyrLluWMOQaavFStrWQ=": "492397000000", - "okGaWzKJKe-1YMYKI9H7x1X1QyW_sOJI3UaQ5-cuxWw=": "379507000000", - "okU9WjRwsRFy3cYV74349ukPMIQZRxV__fig1VzbMjs=": "1946775000000", - "okfZebvaVhnzcXfbdelK1TcCh8XSlcstWEwWa_RbVNM=": "411085000000", - "okimhLUbpIpHk0V3XmaPCK32rW8SHNYmpdTk9NUdSSU=": "381786000000", - "olHoXQR2gDNfVYYTMtQ2OenDx7nLYqiUtiBSfeFTMdQ=": "384615000000", - "oleTG9tZQjuERAfAX4elfteHyzIasQLCLHqOlrzItTQ=": "463436000000", - "omBrMEvc1iDyLPf6dN32OJwFEVXUTI5_MCAuFNN7hHM=": "416666000000", - "omRMTtF1Gfm_0owl2tHfp4ZjhjxWmfUDiRv31DhR3b4=": "883538000000", - "om_BsLRMOLJG6-2CAofnQ2MOhuVj3a8jkcW4lkJoB0s=": "384064000000", - "omzSAvphABknPE_JXMfrJ-FU-uLEgWlcTkKDz34Xjt4=": "3467029000000", - "on7z6JJUMj7tAM9zmFnzZYpgAO7Opxc1cJ3NuCanj9Q=": "1153846000000", - "onBDT30qDtmSWrwvq85qesiGgIP6eWhDeGKBIXEiMvE=": "416666000000", - "onG6F9WhKYbkaDb_JVTWldXjcx9jFQGqKr1_UpzCTL4=": "840040000000", - "onIf0C2c0dSbVycWZwb9UM2FZwrC5cGOqypn4n-ZDNo=": "562130000000", - "oo4NsTdsaK8PRvICvA4mU050-ZQizHhTCkFPHVQk6hE=": "404478000000", - "oo61LMBWXp1MsUKYNt9u-b6aQVFUS8aUWBWBp7x85gQ=": "488979000000", - "ooBgy2fZ6aZMjNx24aBYOcfDEGh_1_gTku1m0mkDt9g=": "1388596000000", - "ooqT4Et11xEZdCAOtmILa3hIh-SIfOTMfbfGPBqcNWU=": "2140520000000", - "ooyoRZ3w2FQGIACl5H9PNy3qwfga9I7j4MArSKNeei0=": "395497000000", - "opAdEqEENbp96_VAOzr4EUAnXimfFz--ZqkSuPaH6XA=": "448672000000", - "opD0kS_O79bdCtFs03Szcoa0m6OCRC7oH-fkB32ZMBc=": "401242000000", - "oq-umyNXp-ZG6o0FH11d1WDiChXgbCOzwHwumWzCHXE=": "1925957000000", - "oq4o95IsR5q8l0Twvibybjj1sIl_U8_rGQQ3bEb3ZdQ=": "877562000000", - "oq6D2TVfOjCXNkwj6U3nwkt5e5XCknGH_onmSHevke0=": "1132435000000", - "oqaCa8so2ypkQHsR32FAd7NGQHvAqNdEBwT5BSsg5FU=": "391727000000", - "oqnQq-0TrsDkgWSfrZBaZUNO39smaJKlHwk-NLHIA8w=": "961538000000", - "or3VfsAcp4ImGG0OJQUit8lFPcUvtMlp-i2WSk6f41s=": "3369487000000", - "oramp5t1Rsn2zpjiLLih7KwD93_xi-YXJsdxoyKRCV8=": "416666000000", - "oroc15V4ggtTRLsOUdZPxPTAkiBmyZTFZAkdT9z5tTs=": "350161000000", - "osKGNAmzlpdAgQHdsxR8D0VAiVvDSi0Z9hypIOeM0h0=": "3115384000000", - "osPibaY5Ak-S_2Jg_7VNX91E6XP6hmS5vuuWtU0TJ5s=": "411085000000", - "oskOYDMPsdA-d1RfF4OImtwMKiLTiknrcmRZrTrzmI8=": "1200353000000", - "osodPt7HnWuq5e5-fO3JSEzn0jx6Sq8T-AJ71kN7wJM=": "9265709000000", - "ot6gbJktWEv93qFOqXF6JbtYhblDlbPYvKfsSwv9mrY=": "453003000000", - "otohupPjupqY_YQgLzLC_IjxiTdnhNVdN3oPrGTR-W0=": "400511000000", - "ou1XtWyI9YT-_22Phgfe2GQoGsgU9Vw3uCUibh6SB14=": "457382000000", - "ou4jDLm1pz_kyNJa8qe_jDQbsJiWytGmeQq5pkrI2FQ=": "390141000000", - "ouWUfeW6pzmfbsF_yjsVfwu6PBw2QtuVzy6_l7MxsNU=": "753418000000", - "ouebqZrhKqK6y_51GJek3uKiWYSQ4pQFSU_S2yLqWeA=": "84885536000000", - "ow_mHT2pO94dnKuyz09XEL5Wf46U2Hu6DkDC3jvEKdY=": "1859377000000", - "owq-ffMcletwlGQdFUVmihUszyje3i13HfVzpTi5_cE=": "492195000000", - "oxAGe5HU41ivml12hORK-6PoBEWu3BKg77odTLf9SxY=": "3210998000000", - "oxF2lLwpWjUWybAxwl2LLUwoj6J_-3jUOqZdzJeJ-Ao=": "10680589000000", - "oxW5Na9vWAvxTwE2MOMFkrneDM_d0nFFAdg5L9NZSWA=": "1233333000000", - "oxk73cUEJTlKEmNDWviCOKodGLSh3QecSABKFxWYbr8=": "5272870000000", - "oxlmBpZmrkkdY760jFHtScpmuIFNKt10a0GY2MHhSmI=": "397332000000", - "oxmhNWTOrWbJfy8rp92iUv5hEKUUIAvHZbRZOuX1lTo=": "8288346000000", - "oxxlu59cMb9g6OwNJgwXPrRweYLNfMgiEfA0ftFelwc=": "404628000000", - "oz1pFyMrw6LUgtlnvmvAC080Kq-EgWGk5aPKy1BvFLA=": "1153846000000", - "oz6LyWKVFLmzcfrohytVjwYWJXzIx-IAVxY63eOaDVE=": "12429705000000", - "ozO3VskDy15HN5mzlCiRR9ZvlBqCTpBO88Ggud13zEI=": "464300000000", - "ozoDTcKXI5ZZELs5l-fs2cNCfdillZpnRbtuXhCAKio=": "381836000000", - "oztJ5NTbJ1IJop1I5g6Ae92nUgVB_Bn41kaL_RjOwng=": "1233257000000", - "ozzjTNEYrQEKKjDxYZnhzD65GHqyzDzM1lkg8dNN4dQ=": "1553041000000", - "p-FxxQ5dAv6HenSftLLEajHpkAriFiZk7GaNclQ03YU=": "7566832000000", - "p-IrPUxPCAskptB2G4H8TyI0JoBIm_mpBb_r_Ecp7B4=": "386353000000", - "p-Lea72S79RmR8auOxvlHft1c8uXkwh4_lhBjZo4doY=": "754619000000", - "p-SoARk8zcAFj82k0NdvAQZhm7NOaTz5XQPBV9r_mZA=": "411085000000", - "p-fftC9j6Mj1WA5kmXdylwdOMNd9zwrW7pJwF0mlo3w=": "461156000000", - "p0HZtlofYv5YUHSHfz520bsEFKss5nhQy3T7pSj23zI=": "3707972000000", - "p0RF-FbLTXkqIzqsHtl7MiNppah0LCQ5J_yX-KWmLvg=": "379203000000", - "p10C7AOdXMRYRVXisCs_5CktBDCbgfOPGGx6tKoQOu8=": "448254000000", - "p16R9zmV7DZ7qpmL5ednU-qAyUI8MbKn-nO5iNXKAxU=": "3888630000000", - "p16dC_9p9TEj6PljmMnV76O1JlFvcSZ9lhtjmBtwcHQ=": "384615000000", - "p1BdL_H_yfBqfvwKn-LrCRuoD2MGuMjgQ4xqVG06Rl8=": "453157000000", - "p1O7oMCb4IcVAYp-PllkT1HXz99Dpp7MtthSerJP1OM=": "1538461000000", - "p1ScJOYvVZcOAE4j55hcx3_sbcAkCpNxQMCTmxDROmU=": "2352765000000", - "p1m1_6bmxHSnyUzg9MLgjQcnz3byaRw1Vw2f_8PMH_8=": "576384000000", - "p2cW1daDNuEN8NuuwUTEwBvn6UDaF1V1ZxTNXGws7Sw=": "716993000000", - "p2fgymTBrLZ9-DoLebXG-f6a3UVVlA9_ac_bkPWr0IQ=": "3968602000000", - "p2jsL3RH8e_kXjzc6JmD_BgOUa0d24xrYBcwfs96zN8=": "384615000000", - "p3EM3akrKixbuxTddHiP-6r2_4Fucl4hOEK725ltAEA=": "1815718000000", - "p3HIizxd6TgcVuthXERxpjPL_a_Fh058pulwgFYZJYg=": "386248000000", - "p3NeWGwEdKd3J-qZktTzZZHrq-GYOjhVWl-Flcx06A0=": "525780000000", - "p3OU8nO9cGgfOXh_Vw9F3Q0N5OIuelYIsFw32jsrn-8=": "4176295000000", - "p3mC-AHiisYS8giiu5VDXTyS8KqIksxjG5IOJxDWCkA=": "1136494000000", - "p3prpnh-PdjyTGu9J4UJCnghjVpYf2BRWs2CommxROk=": "458982000000", - "p43bHg0C21L6B8QkkEGjatQ9gdAFkuiohsMqdx5eSVE=": "1765241000000", - "p46arSIo_QB0X301T6Wga8fYFkOjdvaluyMnzJkETvw=": "967244000000", - "p4r7g1wZm-NFUzey-TCAbU34IHPYEpiWH0IdupcDd8g=": "384615000000", - "p503r89JJ8x_r-HOr2S4JlGVwNx8vQbT4KD98d3Zgf8=": "455125000000", - "p5RJIrVHboveH0NR9EvxxOnpVm6mQI47FArJ7SWQ928=": "1538461000000", - "p5VEg4KeybblWw0vrEo7vLdSi37E7wgdpg9730jr2ng=": "658754000000", - "p5dnz-gL8UR759w0dJ_HaIDl0ADMNSjfDp4u2VPn95c=": "416029000000", - "p5myrRtjcoHz5VSj7mNcoCmvIhB_7F4ghl5aH6p2Sgg=": "387383000000", - "p6JCn20sDd0cby-JLOEghEpz9VXLqg-D0BJaQBQjFko=": "384615000000", - "p6Q0lCi9Q3unQEEY5xjDMiJ93YV_J0h7NVR993sDMLY=": "425032000000", - "p7-yWJ1YkaK00H2nrAccGPaA--jtC1MfDkSDCZJFAEA=": "384615000000", - "p8Lg8zuslKmAYO6QoBVZ6ze306whSMw-ZH-sQj0hOu0=": "1147383000000", - "p8tgKi159XvL3xyOMhEpXCKZlYHphAaJcLCQGv12_YE=": "3706439000000", - "p9hnNbtoHO3ngInLntvTWXIo7yixryAZaSbN2QkFo3o=": "500256000000", - "pAgH1_e8JYSdQjhgr4_qXDk4HdQmL6RW58wpVoZ0zOc=": "2110984000000", - "pAkp2OJ4xIQ9XnrsfdYqIK8MzR0tJf-KIzvWX5fzQ9Y=": "384615000000", - "pAnMfyM8JqmKJf-U5-QkLqJ9oWUVY1C34_SjD7mz0jc=": "2317110000000", - "pBBRma15JEonKKhyD38GcLdzz_LzUugLjGJh67lW-3o=": "769230000000", - "pBPE_LPoMNBgUyKwnpxvae40GGIBdVcjoMgzRaESNL0=": "682426000000", - "pC8Pn9h8nBKMMGwznZCaIEfXcCAi_HYO1Se1KaHqJCI=": "3912515000000", - "pCA4en7VzZIZHukHNZr31EtNXIakayrrJdUtYFOd8eM=": "2198076000000", - "pCpgEPzptzMv-yZSK5yh_g9Bl-e-JAidV7GqCnqi-qI=": "4115343000000", - "pCqrck_qrm6icO0qRp4K-pjMN2x0Q0AofKhJh7ZSCNg=": "384577000000", - "pCw0DcwV6WPyYLpz22d_TU_hE-QzPMGXUiV7_xTeQus=": "1156518000000", - "pDFvEs_xHdrIhPlQTvqfXICGp6ZonzQ4kurQxLGF0Zk=": "769230000000", - "pDIhy7kJnIB1e5Qan0lCtqGf9t-gl9Asos0w3HH9tyk=": "383939000000", - "pDMmiNKOAuP4w9cBbphhN1t-R_X-nDbNvGmSpyxuqeg=": "385261000000", - "pDVZyxJ0Q81aK2Ddk2kw-BK-t-50HbsbVwi6S_XCS5Q=": "392243000000", - "pDw3KVsqOSQ6qXxXWVIvEBZ9cphl2_G8B0WvrsU7zDA=": "1158838000000", - "pEqMeQTsXTi4wrdtMxonYbobphLPXswyixmEdjjlC20=": "450825000000", - "pFVlVGW8qDGFyssB2PW_MB-yYAxdKAcLV-3LyKPRGTg=": "757122000000", - "pFiX6g6PME-hnCrmSvA3cHy6DWohnQRJXUZZKaGXEvY=": "382338000000", - "pGG6-X_Ep68bFSgwLr_jkOTI0i1nP0DRYfxET0OS52I=": "469487000000", - "pGR7sG-Xzq2BfufT9O6OnSaTBEYgJSeYT7ipBOi0C20=": "676021000000", - "pGRWgI1upoy8kidFjv3dcigL6twbYpakkMCGsTIaMmA=": "385506000000", - "pGSGorPx1214E3bFleEa-64PDhnrFvfgMHIx1mmJlmY=": "4245191000000", - "pHhHgZmshGw3i1h1teaQo5-w3tAqZKPnuwfvgVp50SY=": "769230000000", - "pHxoge5V5KKFNDHVTygW_T-eVxEihS7nxf52DQ7hjdY=": "11610510000000", - "pIAx4xVXO-19DRPUOJvckblKkjYLnq_ho1SPEs9_TEs=": "3855067000000", - "pIJSTjkjhU7ak6GogAnHIJy-c1_DGplSITxDldTyxSI=": "416666000000", - "pJ6OdDDUOVCw8CJm1sIPkp5fHNEwaOV46lxpPZ3G460=": "386111000000", - "pJqCZzcnhn2IrbbwptFyjVT6PhZIGBfJA0CBAs8TofM=": "382344000000", - "pJqJBGdDKVA7P3UOzLbeWsALFDaw2c1lNlde1JmlWcU=": "769776000000", - "pKXHSyCUja0FuEjzS3iNi1D9xOmC6cLPS5Y0FRgQmwQ=": "833333000000", - "pKgneUqUbXnP4Jk3btvat7bJGF9vM9Yn70AdlbWk1ok=": "759620000000", - "pKrgRsyPfF85RNkRtZxNbyMNqw0ZFvRkHQuYEzaGLj8=": "390286000000", - "pLQ5oCgPi3upTQqHxgFWdjBA_b24EA95gLHNBy6AS2c=": "2310726000000", - "pLfxG_rrGovF8cOR9yOsaPOrQ-WIzU4Ieki6GXwSMfk=": "487972000000", - "pLy_9nqZL0GJFtxx9ukyLVEU4G2GMnJhnV12q7PfbLY=": "1889920000000", - "pM8Nk_8_uE61eJ9YV6AIY798y4xMtuLDoJDKPVgDXI4=": "460487000000", - "pMF_BWSbn5E9s7hR6sBsa74m_RDHR6lsVkcg2uIXrRU=": "391001000000", - "pMHuZ0blyEPRHUo8BziUPdwewvOwlvgDx55c-rnN26Y=": "411085000000", - "pN09GnYhoMvynvQN51n-uXpp_z3zjKabFNMs1_KRaqA=": "2824797000000", - "pNX5E6ocjGtOKmlldpA40ishOOtN7XqAhUV7zmzcyaU=": "384615000000", - "pNbO3_cJaHouyqktCHmMJQHfs2l152DTLiIHKXiUCZc=": "2289694000000", - "pNfubbipvZ6-wMR8xDGh5TciP6t2YyHkB0Kph5S1ypY=": "1921418000000", - "pO2ZDQV9W98u4sOGpInKoHzAgQ-bhfY_HJDf9t9CzuQ=": "381436000000", - "pO5MUWoSTCKffTAuQujmyHGwvA7XgKDA4QZPeN2zPvo=": "2321821000000", - "pOATWJn0KZJz-waT2EXIATVyN1hfRP1FSLyTEw3lDgs=": "384615000000", - "pORnBjo_fdaXTGN7LYlgeSTOdXzSM84Oixi6pPhac5U=": "4037662000000", - "pOWJnu5kVaATX3WdlJ-3W_eZDkrPovlR8caV4cLtn_4=": "642211000000", - "pOqURm0fBlBaa2GkcjqQYOIrLMN8aLI0YHLMCU3u98M=": "830205000000", - "pOz4F_mBkHgiI2uTuF9vvxSZMH3lZzmy-J68O9T_HSk=": "985784000000", - "pPrKuvxDqTk0gjcFoF7E8nNgA90zhSF_R5WNP1iG28M=": "459911000000", - "pQGW5OroDRypbGZE3cWB4O8VtIGOIhMEUvAXDaScBgY=": "4233446000000", - "pQZBIA69dflDYyRnVZF0BmQpAEyCKsbOOWodazoritk=": "22727272000000", - "pRJaUIKpJxG7UslGTlQEudggkFHjLMPn-uz5hffH6I0=": "4730014000000", - "pRdCgjA63bDzKrZdCjn3ZQ4JC0j4r4eMAHwDLxlKEm8=": "4176307000000", - "pRdz_qRCr1IayWqf12cs6AGz3Rg5b30D7eK9Mxbl1Nc=": "4147755000000", - "pSM9rRADCRU--uQFWopKY0w0whqq2Gvkh9yhkjGGHxc=": "557501000000", - "pSg85rM6Wpl0SJKPwHNMuZi1yD3eNfM9NCnIcZ151kM=": "1363636000000", - "pTa-e4ACnNPr6K-Anil4piOB6kVeZ4q09h8-HN8tcMs=": "657517000000", - "pTojwVdo6IS0VB_SRxSw-1bKG05Bzfo9F9BVPfjL9dU=": "387796000000", - "pU-jgm49g_P7FOGhZbAMmqr5na5dS6Xk-ZIbbdUm4W4=": "415404000000", - "pU9xI2hg1h5QPrhW9wMHkJfUlGOfZY3Z-4pGabBWFvM=": "682960000000", - "pUPRNmtu5NvJX9BlcUyu_lEWYz4dH4kyEm0exn8gumA=": "1153184000000", - "pUu3c2sc4F62E_eiXv5wI0eEpn6k4EXYLgHr6zF74m8=": "416673000000", - "pV76FiG_xPsWx55gPxYy4z84JmTgeHGfvkMt3_hGV8E=": "470601000000", - "pVBqDvjRFSW7jGWqYthV_L182pLEo5-gp2Sa_5QYcIw=": "1923076000000", - "pVV2U-PM9St8RmdiknUk9S5uslT940S6RKEYYn0S09M=": "385507000000", - "pVczM5JicloDMeUWDkDeo5avAu-LXegsZTMGnsm4wrk=": "485068000000", - "pVtvogR5ADRiZ4gqYOpHA94hvCtW04s8A28JCa45xL8=": "2387875000000", - "pW61iGhs6NEMFAY6_wxILa2fFn3Tfo13IdER5rKAI58=": "382899000000", - "pWBd2J4kMH4rCPSGAUG1bdQwIeK8S2ZjGml69P62iEs=": "416666000000", - "pX4NFBgIEuUpb5rL3UcBZnmE1GVbDdn9Bus0j2OiwjA=": "448869000000", - "pXBVdkY2GsTf7MHOsxelRsvaN0Z7I3sC0LpEEK5aqFg=": "3842547000000", - "pXGqsKLRgNUVlkbX7YEny4RP9qIXiN77RFuOcGydp4E=": "1408709000000", - "pXaCKpj0N7zFKKhuymwzQZC05CgvXJ8MgIubJKUJLVo=": "426403000000", - "pXibtdlGExwLEPeRfepQTwcNrwrWKHi5KkhT8GcpwkA=": "1451675000000", - "pY77YzMGboG5KAy7jKI4prlRduX36tZHTV43hQ9GjvA=": "520076000000", - "pYSJEHVyNOnG9iB2EJJ44WRjEPe-7Fi3rxHcrirx0Zw=": "1250130000000", - "pYir8Id0m-xt95StpPN15yejYvE6W2T58gni94Lk3i8=": "449667000000", - "pYqB-6P9cgjnWBhdVky6T4hmE_GKop5SR27IF1C7nIo=": "3670892000000", - "pZ2Qqj7f-RaAd4BmoS6TkWCfIvIpFOlKQSA_bZCVgcg=": "511764000000", - "pZZUy5N0pGF_w6PvPEbZqBSa6UxD5hOhyuPElvns3cQ=": "407808000000", - "pZte3cEQ98qdueGRGDLEjAhJ22kD_1QmKi02EFdsM2c=": "385614000000", - "p_0_GVlz_FfDtml9IiLkDQK0m4zIgrCx8qeYshQX3Og=": "404755000000", - "p_9DSAZu4_IS3OiajGch_HhbzexMXjFWjn16WomCgw4=": "2719179000000", - "p_NGBun8HKI6nm1Eikh8XzdouhnuTkLoKZT5SCAmlqo=": "1687254000000", - "p_bSrm7u0AkFjBIt3JWxQm9Reh_L2Gvktgco6ovyOF8=": "750727000000", - "pa2BYEd9YLfIGXtxL_2RNkD438VO4IkSr-w-77-fzNk=": "766913000000", - "pa997PtipfCuR9XlE9tJqV213oc74tFyAwp5JmUg7wY=": "924724000000", - "paOq1_QpbSmz4RNixTGeJZPAvz3KeHLBb3X6wc9SuMI=": "466150000000", - "paP_y837FdwHvyfYxbNKw1-WdciZD6OILYQrWTuaxrk=": "3288011000000", - "paTEioi7eDXjOdjpe1jaQV3NXvaNZid5eCqAijcpXlo=": "391132000000", - "paXQuSaIcUfQX5XM9fwU_lKl3mHbLiqkQF9DkXFrgb8=": "384357000000", - "pb6tICwlMkp7kQ299zl_1wrLCxzgbnXoUbtV1delmos=": "381802000000", - "pbVdcUlonpXb5JGix8aGzmuRUm2qaKMIjBuhoJt5ICM=": "4686346000000", - "pbqNqQ-gCARMbvsi-OYBd8ed-FRbJ31OowtlwwdKZbQ=": "462146000000", - "pcHnZLYbGF4KFp6HRa0P2GMOVMYT_lWfM7q0ms3oJJ4=": "385671000000", - "pcLkL3ndHx9Vj3vs9pOjHD27-3Z9vxx9tf2nVYdplQw=": "454545000000", - "pd30EQpdhvgO0e765ZwZHTzmNUYQVaNubkpfMsitOII=": "382667000000", - "pdH_hJAB35jBVMkxIsMqobSAMLP1C_J51XoJ6tIXMGo=": "384615000000", - "pdRr3X8qpz7mg-G2999UOS78sqLod3sRQzB1zv7__QY=": "384641000000", - "pd_T0-NSbOyYAJ8W6CnkxoGeIdMGxY_FzNCTzNepnuM=": "921904000000", - "peHSHwLEXq0X9u8xTgmav4CzS6sQ_PB6d4S9RnRraDQ=": "411085000000", - "pf5QUqAoXMl8rCaU_LWg5dCIHU1LchTiOyetCCoVFoI=": "415629000000", - "pfG5Hmu9JPhKFQEZ5ZiG1-_qB_pZZ--D4GEU6WEWS7E=": "1254545000000", - "pfL2YHbWOBRJyhMv8k-XX_UmrgK2sLwCH0MiGGmYcCk=": "507660000000", - "pfh27ZLFmqGfZcX0c8BLDXKVswBRQc_6PR2DSm2Ds_8=": "2307692000000", - "pg3TuHM3M087uQtpQNYu9j2Sd0Tth2puiWS-eAWubMk=": "769137000000", - "pgEEswff7AzBO6uQJFcWUm7FPxPDVRCdWHfoPrKYiPc=": "3700966000000", - "pgJVjxGBFzdbMcDL-wSiIgw5ZLV72pnBoSm1Mv7qGR4=": "452464000000", - "pgMpcxiSe7Upg_PrM-yvE1YdsUjQt-9K63k6LIg8wT4=": "524709000000", - "pgTcsEiUtjKXMNO8g_eBLSODYwdUDXDrr9DN18bDQjw=": "385505000000", - "pg_iWJLzwJTt9P06UFH2HMTbaClH3tiIYRTq-fdB86I=": "1538461000000", - "pgwz32J-fiHD5zSvvjTlG1XiN0pXvJOBs774h8tEodM=": "385507000000", - "pgzuAL-40a4qhSyA41Y_Rfb9hGGKQ_6JVczeyagYRfo=": "2654493000000", - "ph0fdqriJj4Z5SOS8oh_YFsYxEk_f20TKOGVkzgnJkY=": "1693482000000", - "phY9Vn6sa5G2LKhOH0RPHju6ldAH9c25SsQjOVfNVhI=": "1138610000000", - "phloADDd5Ud5nrk67Vbo_Xhohd05ZtzIraRsAaldSeU=": "455600000000", - "phxW_43fB4j7zXC2gwSePnigZo58KRBwzsOrougvTxU=": "1275273000000", - "pi0wg_VgbG3MBdriWkNMh-_2LgMZ92hLb1lDUEf9W5A=": "384615000000", - "piAqGfwsSYjktifzd46_S_YtMyZB3r4WPAdH0q6rX1A=": "469988000000", - "piXzZBsxs3ouScwcPU-yd98kJhjZAewbjQ4MkHW0irM=": "1538461000000", - "piwTm5hnf2WOgnCfg98mNaC6Ci5fqMh8vE-bG_y1WWc=": "1337186000000", - "pj-Yw8JTnFP3nlzZwVB4x9z86JzUXIdHGM2nrKkQWq0=": "378310000000", - "pkMkbMGKNIBx8XovmPzgM0b3iRNCu0kcPrhaZWTrwQo=": "1538461000000", - "pkSLI2Hr3xt9aJ_pslT-SIcqkuY7eXG5Ekl1ADtnNoc=": "767923000000", - "pkZG5oUmcAJ3nmULN7sD1GVetKBSzMJ4K8Oeq2f5fg0=": "4545454000000", - "pkfaeDAHTWJK78VLHhq_609r63fnhlkD3TPQybUb8w0=": "2055429000000", - "pkwBi3_08H6ufboaPWUqiljttsPtpbDc756icpNuwsQ=": "928285000000", - "pl-KfVsSWCGZRtg3dmtRKvue9BAP_Or81rDuHLnBrK0=": "925700000000", - "pl1g6C_wIKQdZERaw9eiDd9b6dVm0GlQP1uX0QBUiaY=": "508538000000", - "pl2haxOyr2NkPQZmgjjDrPtXTQWXx8Dl875gyjlfxw4=": "2469861000000", - "pl9N629VBzRbdteFV2JL3DpyWb1ij2LeHohS6Gz5DOk=": "1041666000000", - "plI6eZ-ui6V_7lkdiKeyFzx1tCjhnxyZ_45cw7EwbnY=": "378172000000", - "plNQ63cjpGodH8wzwcQIA6ENe11MOwB6Dqs2uORlR90=": "906006000000", - "plPUjpJYi5dhFbyP94t3rPTLcdlhQqh9t7m21b1WGrE=": "378849000000", - "plqX_BUSkM9zHM3QqrPDmHNsN_Mgc14z9DMRgRgWbHg=": "384615000000", - "pmBn22eTx9cs4fefr0xMmD_rYULA-C2WaT7YdENc4Hw=": "411085000000", - "ppXjWH2VOaxh5bk_5X7OV59BPb1ZUNKKtrQAUh28LAM=": "2116140000000", - "ppxtdmggelD0rybKDro7pguOb7XX4WpGokf6FkKxKCM=": "500384000000", - "pqGtRbxCnQTR7RwFVSWLJxEWxxMLXPy0rc4-T5Cxje0=": "1349104000000", - "pqH80wS_d_ybzVXkgrtZ8XAvMzpW2vG4x5ic9KnO8GM=": "460854000000", - "pqa_pi6vuemZZSvix1REMOGCSvEDMMJNt2skX_GnQ0w=": "4253981000000", - "pr8julHNU9x2HJBGXqrTUydYz_DXCLUeSSyIOTJlEC0=": "454909000000", - "prCBHhgq6fVGbKy8Mztfk5jWc4Vco3Diao0lRWrY01E=": "384615000000", - "prT3UVfD0-BCyqbWBSyCCOMZobtUbTs47G6m-iWEy2s=": "419895000000", - "prjV3PmUykgCQheuQjCv44nYlQDoFxr_H1DQl2U3NqM=": "1153846000000", - "pryftLEjsAKtQsYVN8grfaQdhQXJ9UxuF5Jz5ObIytw=": "1156532000000", - "ps04WtX3qK1DBBqteNutF--QpZa29n4NA-eKeqgddW4=": "1157881000000", - "psCgAalV5syUJmFC0jaASENtHJZksHNJbainuz_sfdw=": "1923076000000", - "psvyGHF48oHg2cwiEzHNBXXzDGwD_Ns9K5dwpK8rjBc=": "1390187000000", - "ptU8sgHGNsBhBmZRiQeRWGsWMjvw535WDYDf6rL6deM=": "4176365000000", - "ptZbzQZOnBlq2IHlZQEzJUTej5SbrpLtYYCm8id_Y9g=": "413437000000", - "puLcBTbiSFUaHIBWK-L-jaaoy706VeM1NFvBBLXGI7M=": "678830000000", - "puxbCoICJT6_qH1FN_hjhXNBIg8WNxNU4bBfoT9bj6M=": "2059457000000", - "pvAAohrHODKNBLpIn-SRIixSFG2xKjxFNeZ68P9BGy4=": "1156518000000", - "pvKHdCGqcncG5ERNXaDyDHnghU8vBjGpmkRt563XDAo=": "377448000000", - "pvgc0yvPWblm9N4LC44g1020tXgvZUwcYnjHPDmrdwg=": "454545000000", - "pvtSlsQlojLNrOUlxOzAwG7h6dIVN12Z5Lt6HGmMWG4=": "417633000000", - "pwXpr7-_7_EsmPzunDmK2LJPdg5YNYIc4bxcYda_R1E=": "779369000000", - "pwocHkDZZdgco4T_iBnDDV7Dbne6APpm1jvjVjYv8yI=": "1153182000000", - "pwvw4gzRoowPXCcFiTVssSnm8z27mz8-0DW73RnZunU=": "585396000000", - "pxYBA1synrC35McvowSfw7Ccf6vqIFPxZR2XAbDehgc=": "846153000000", - "pxYvYtBJzPt_ADKt7TFUJrFOKidU09Uu1aBBCayjQsg=": "576923000000", - "pxnm_UzZLavv5dnUkM7ceBYrxJfo2MSH7e5UXTplnik=": "519376000000", - "pyR2NWkQi8rOs2ATCJI788qOYD_XNpC59jXTf2Ubv4k=": "384524000000", - "pygL5Uq3zwfafkxLodAJJ5EaIUQgbUEev2cpKPw1wkU=": "1001241000000", - "pynGH9NL5q7NCx1rFj4X1rb9x2lfFH2UrXo6xzsOynQ=": "898300000000", - "pynYdVdfNLgjAc5EqVnnULD3h91L1ouazleES_wfo3g=": "766272000000", - "pz1uRCKJK6c9Ifv6e49uMA5jCP-w367FJp3sDevX4eg=": "769230000000", - "pzFriIID6Wni_EHDRo3COlqRxHm_N8BVPWhnnnQc4t8=": "389217000000", - "pzHRVXdQVPiixWhAXp8Dsf48t1nSpd8DRL4L-SreLuE=": "410625000000", - "pzKCy-KPEMNYh51a308kR4dUTukYMJieGqsO8CRf_SM=": "379230000000", - "pzMnR2o66HWEN8H8s-Jskl3UD-CxhsSni2pFGliqRd4=": "769230000000", - "pzXApkjWn2HTLQNfmVtaWVAk_pkjER2E0rCvfLFfbtg=": "385770000000", - "pzpFgbhUwl-nIZyPb8NDAfeFVMSvYN3v92o1XGoh7u0=": "2344096000000", - "q-Ol6waSXdxPfm4wl-S7iroQFPvhMV_tknFAXkB3Ue4=": "390141000000", - "q-iUNgn33ZppmCIdy0peh6NPU2QowhlpGdwaULL8hx4=": "1537111000000", - "q-uM4C1UT1m-gsin5noNNUuDolgUtzq9lWrbjnHwX90=": "1265685000000", - "q0aZtLKeTgSK4DOowaSpBIfyElhhSbBfdrb2DYCbNwE=": "385507000000", - "q0kAaYKJlp7SiPOph8eZbipKQJiiTQbK6fJhZNoIFvM=": "378404000000", - "q17E_e6ceE3deqBGqrntu04K5G0O0dUocSLzQiU94MI=": "3846153000000", - "q1CHna7DjORwgUe2nadhCbLFX3LrOFVG5qUTaYspfYs=": "455125000000", - "q1NWRD2LE7TyHOS6EqaDG2ZYX1i5BLRcNSWx-_qEmJ4=": "385507000000", - "q1UddLxBpVUZCj9ye9cLOH_7GBmGPLtM5UoJ_OgicMk=": "455600000000", - "q1gHo8MhLlkZaHsMnNukjiiRb8TuIM47HORS3QPOMzc=": "418059000000", - "q1zZdzXou6HkBfRTPpyFDi6KwzDvPoO3jXWaubM8x5k=": "658869000000", - "q2-g8A7fagvDG9v0tm6aANL_1cRYh0mWDfSIs2FZMzU=": "4150966000000", - "q2JTvLvoDlhXM4aka6EEsN7_-8rtUDTT201RVlw2AV4=": "457150000000", - "q2TS74FTUnvECKdrk8mQuVOqA_q6TkbkgWSfFRPQgMg=": "384615000000", - "q3XeZSnKmfJEBnT4VivKde2vrb3Ju-Ez9SCupM3VA0E=": "455600000000", - "q3lK5QXTNvjfbw2AGRrm0Xxh1GCmQffUXS1dHs_mNVw=": "473331000000", - "q4GG-WkYxMqIlBFulSw9NOiKTAkyMz422u0RCY8T7To=": "458561000000", - "q4ou30RchQy4bQwB3PYHlz1bvfqDKJ6wHpFwYC7YNi4=": "763672000000", - "q4rqSQaoNMDT2IY-LQWVXRIvyz7S1x9chKj-IT4Y56Q=": "450033000000", - "q4ybFkPknvL_6UuZBlTPWKSjoq-o4PvuGmVQN0NjIUM=": "1153846000000", - "q50OH3QpzGx1vfgZBvySK0DA8sgv7Ifw640UPjsXVi0=": "1154640000000", - "q6CpE_kI_Tu-XHHl_O_MWGZLD2k_7lhwCNt4x99W6Ys=": "449726000000", - "q6IpdhlvtEEueTAzy3ODz38rgygBsiJx6Ue3YP3jw6w=": "454545000000", - "q6R07QPUTsL_losg8D10szZ3I6kknLiA7KU2IcVImkI=": "991666000000", - "q7H4-ZucBowbD5jvzpJ0k6SHNkvKA1G2tm-4hYTBumE=": "460854000000", - "q7_j1H17ywM6co-tcxMXaQxTujL9PV36itxJ5EpIJSw=": "454700000000", - "q7vNG97HMr37oABmrhIPMEY7iXCL_i-ZHcFFlqCRqFw=": "833349000000", - "q81wfSrZM_FIx94i91QwcR1yEVe69pWXQ93Z7pxZSoY=": "454545000000", - "q8HnkWGYdRk2yG-lneNateMMCmEBCeVL8D2cgWV7vPA=": "397332000000", - "q8a49RrL4Ku_KMP79Z6GUs4vJ8oFHKYmYf4wK0SsVP8=": "463152000000", - "q8p4VyW0ChcyFGF07WpC1bIHpQTcKJbzsQb9N816-sk=": "2041119000000", - "q94ba5Rqaj2fJHZZ7jbb-AjWudK43HPLreyTtDfbmRg=": "1153765000000", - "q99HEfXcMXI5835zHqZyytoTvi7zq3RcIMgaGOloNb4=": "383014000000", - "q9FeUeKyGIDGxI0tjHj-hL5aueSiYNxmbYDBfULf-rA=": "2083333000000", - "q9_RY4Jxm_BnaD5Rrk4IgJh74bvK-QNrNMxgRzURzdo=": "416673000000", - "q9fv--ad-cqR1QHhupZDG4U3-E-_tDTCmvPLekQbH2I=": "816083000000", - "q9qK_4qm4Gfn5ALsffMtF6QQrJT7U5KFvZ0DABMWimk=": "554039000000", - "qAMmdGtgoEmyIztRpsiKZwedmDf4ZTgnC5qxgtNJ1rg=": "7682181000000", - "qB-Io6QgbStkEuqFxOjiqenKrk4KKVX6PYUL3PxAEo4=": "460608000000", - "qBE3x2ZHTFsHFWMbkfUiRTTJs4UAc6v6189LTPpjVAw=": "33315847000000", - "qBK9ZMC3Vi5nwPzBL0_Oja19d5bAAhFmHFCPdSwr_zE=": "469811000000", - "qB_LWDvRrxUaDMWu8JYnosWa14xTWR6eC7KQvLKaXb8=": "584259000000", - "qBcdpRWPYmTaxRpjo7B1jm_nA96YGSV00MKGc7n0sbg=": "424465000000", - "qByJMWS2f7xlqZeIfdQYaP9clZKZKQJqpS9v1iVLTk0=": "4555854000000", - "qCCaIP-P1HSX5L1x598jsl8uFYOtP_3WiDo2QdA8C1A=": "3612316000000", - "qCGF7lkkRZz0kH_GrzjxYCIwU4wUJ9fbOTMH-e5PgD4=": "2089305000000", - "qCIftt36bCUSpqnpeO01lKPHSTufoGuZsVAZ52gPHF8=": "12278012000000", - "qD6agiNkdLf33hVk0bwDY65effuDucOQM8ta9xaEIRk=": "833943000000", - "qD7k3Dc_XdB0iIzWGVPPgtUgSVq0WZnlGE5zW8jWeY8=": "755094000000", - "qDfmHoe4_kfwTNTEz7UsZ4Na8ImcLtwpjsoQERDtmaA=": "453442000000", - "qDueV_hFXBtPTyLB_AJqERKqAV7BeQhVMfM-YiRURXA=": "629001000000", - "qE8DdcznfGd-HOqQ5SA3sMt4R5qB-LWTHLSDSxU6gFE=": "5157569000000", - "qEjTMNAbI9lyPPrSjuj-WqQ_MLq7SqWJrYfzT_arQog=": "462743000000", - "qEptC8xUP9jAZoJpTiIRXzRw0SkRFjmh0cAubienb8U=": "469811000000", - "qFMV-hWB2ks4RC_Ut0h6uYmxGh_zRAyqooJJheQhDSY=": "388750000000", - "qFYm8PTZHXs5tKVnURNz-vqecXdeDekkRKckWU8IJqw=": "909090000000", - "qFaAyJ1Y_2VpnkKBVxpPo5OlY6G-dwqNLSqV6oXr6Ls=": "385505000000", - "qFctS43-YWeaDQ6DLWoEHhbaph03wcFsOzPiYnK3dt4=": "1365086000000", - "qFmemZbdy70MFrLpcjKOdVRoZEmCwzmnI2HJTIEpir0=": "465040000000", - "qFtEwQwQOeflAk961Qsbdy0AyHpJsUOB3WdU9HfuTi0=": "9947939000000", - "qG1NvwdSdhl-GlLyniN2EXRJFwZtbdpDQR8fF_P1VLU=": "385510000000", - "qGlC5eZ7i0AEAaTqrrdWuosrDBM2tmZddixyIllhTq4=": "378592000000", - "qGx8KA_AA9ZiZuoP9y9I41VcE7Rc9F9BsM8mUS5Hoi0=": "390975000000", - "qHFw9BygCia5UPLhuQ9SH9rI1s7_tTYRQg6gywtrMyA=": "769230000000", - "qHb4VnIjuqjZqPPDQg3SslZ6RX038v84vD2-bREbVa8=": "388566000000", - "qI1ur6erU8DfL2YcWDRJfHQ-ECrixaFbgKNdB7sfzTc=": "890119000000", - "qI450C7p75ATTau293ogxhMWAMChiHRvifuD56WQUKA=": "1377378000000", - "qIJCuFrpPBpZpQlOHnn8-F2qf0c11aRX8GVwqNqqj9s=": "407808000000", - "qIvKO9sC2YdtIc0YYBskCEj30TVhQYCC3ynUWqcPOkE=": "2018954000000", - "qJYPIYnF-VOQm6xWoRqHSjI8FAxyhtnEWKN35AoRxwM=": "23392175000000", - "qJ_5qXiUghSDBsiP0C_NNEbMkriPI77kHmDbtQqYmZM=": "461856000000", - "qJc0dOAMcwxWrOuxYvWlcd_o6DQtWe9mS3-ghoiziME=": "455600000000", - "qJiaVCTHmiS-jwh0ae1mDGYtnb9Drv2Q6IRkFOFFhwc=": "810075000000", - "qJofa4fCE0VuHHMmGmgoJIYgH0gHZK0BVHN8SpR4ImM=": "417134000000", - "qJqLzlBtTOWzyehhzJGxXcZ-q9LHIVn-F3v60lUglwk=": "3805127000000", - "qJySBEHgkBQpQqz_vuMZNQ8wdspsGDK8X_4iIAyHN6I=": "1881489000000", - "qK3b7rEnQ5CBVzBAOffvop0NSJ_UeEqblKEN6W30zZo=": "1136363000000", - "qKUfSqNJJ13LUtD9c11cCFY7C2Txi9_3W778EnMJ1dc=": "456104000000", - "qKhFkfz_O6PrFhC7pd96U3AYvmwh-NagF-r6SanWiKQ=": "2499999000000", - "qKugZ_Rh3LdqU3enAjse0sZC-r9ipW9YVxI_PuEnwQk=": "1393853000000", - "qL2zLd3deQAnG9lFlczkk5vn9emZXER1W7tGDYkMemI=": "9624191000000", - "qM1CR5DqVwL1kuK9v7MorX-82-0VTNKIjJkO4A28LK8=": "407609000000", - "qMD3SC89IM3PEF2Uu2iwTTMDomOhAy9vIWrC_JbyNZc=": "927791000000", - "qMlbwQtUfJQbQA5jqV1xpLeK7GoNZY3uKhdrJOjCz1U=": "384832000000", - "qN28fQSDOp7hKVDDJXc_1UnjsjLkoUOX4Nj10NS1MAk=": "1128091000000", - "qNexIrp3gjKo-7yZIXW7v76lkEdR7_JbIrpgjoldS9w=": "454617000000", - "qNtdgS42tCTiJZPQXSLQFJeosYN5XSZZyRkvCYNmzSo=": "935730000000", - "qO0FBTUSnQi85ergkbez-K1wwp6Cm1tSlqkI4g-g0_w=": "385505000000", - "qON0cF9-rPqQeHQr3YYbB60pxM_hH2Sde3uKQ34n9SE=": "1586139000000", - "qOx-o1lo1FWyuiHJimw6lfOLD1boiiyiqSKA-Oui920=": "34592056000000", - "qPMEik8nTucNqqJY94UGsfV_0EOf5PLdp5asdTYF9jo=": "764453000000", - "qPe9YzH9kzNtUmwbjWLgnvYOAsFq6zF6_Yyv1hOVTI0=": "469837000000", - "qPq5eRCh6NyNj28zjUIM-gk59ZVW6k-h6XzEzNd-af0=": "458711000000", - "qPylZ6jRW1S-XXCbp-uGk-eIKFKtel_5Ny-GtE8l4v0=": "451287000000", - "qQAjggJYjcf42YL1Z9xvE_VusuoVVxwvNBZxzPRt7S4=": "379344000000", - "qQT2u6_4H1VV76ZSP39X0pkqtQWOqSS3uw38kvLonKQ=": "1286892000000", - "qQaUzo3jbqSY0gzrOvnBPfsOyzHj4aakGz1qVBszCIg=": "911463000000", - "qQcZ68XyUaVf8qQcXx5gGyHc-57hp6dfdPFFtBAtmSo=": "415629000000", - "qQlv-suAyrAwR0FIHm_dvR-_gLsv3lfL9QkGWJKO7l4=": "422859000000", - "qRlp26QTf0_ElErbhviQoo5Jrgvco0EBf7UkZUuLhv8=": "999999000000", - "qRnAUyV0XjUYGYtSqO3ly5kv4nYQnXOyAh3-G-33DLs=": "3846153000000", - "qSFgtoK8Ub9smDMgRJhG76Wf-17gPKdfYUNqWAy10E8=": "4267500000000", - "qSdtKzo5teNlGL1I9VGZBgeQpgiVTHnVL4kHbOxRTfc=": "389964000000", - "qTY696oaKDAJrL21guUnLCxkYXCDwCKkERWKxHqz7GE=": "996689000000", - "qTb0YLo_Xd5RwTwEDJTE1_0sUVpCeHRhJLs-qn2WU9Y=": "1461538000000", - "qTtLyhlasAl3rokBmbB1wyzOriggD08ROaSF8oi1raE=": "576923000000", - "qU8Uq7j4xR8hEWwkaBaPe7Cix9oA9Y3wzsI0jYV-3y4=": "16666666000000", - "qUB9vdwvGGOFep6_ITUdOt8gNwp3rioZ3nj3rWuiysY=": "2552040000000", - "qUGmSeY6WNOa5fiy0qNzNfMpYrmzOsMwfypUVwDFTds=": "2070049000000", - "qUIO9zxR8v_sba-G8nKBIqVUP14OIbPC4EBg_GkGceA=": "381140000000", - "qUVCkOIFIJ83UZkh7w_W1ySSQJ0JNuvKS4LsPbbi_o4=": "385508000000", - "qV471TnVwWbKBsz-0UPULsfy5ENTZ49hPTlmqFbUH9U=": "755015000000", - "qVQ9OFoDCISWlpDUyZXXY9BANFxVqX3KH5mooB7fRn4=": "9081628000000", - "qVoIzpYMjbGOV5Qc2JEhlTAnAsYPPUUtYbh-k1mLZjA=": "1402137000000", - "qWlZ7Qhuvu_2Whk_8an22rbFfhpFAZeuM0pn9X-PvnI=": "403061000000", - "qWxtE1Ehe7_tVNpHY0TlpO5otOn4flQow3VhWrOE6fM=": "1874999000000", - "qX1cB2WImTW-ly5uOuDhRXqdr_tJnwQGx1Va-_nWYRg=": "454547000000", - "qXWZyoI2ElRfpXlH9oAMB6r7_gO8MKc3g5rmljQ_0u8=": "419072000000", - "qXb5xG1_rG5OmICFbgzipggyrDBwWAwZCg7F4lmqKDo=": "499999000000", - "qY-KFBnQKkejbTm1I8a_hXpZW7Si1Q0QqYkd5OYL1eU=": "2055429000000", - "qY3Gmbn9JRWmYoxXZBLbbk0mRKhnx271Rm1o4NJnWxU=": "808033000000", - "qY7OPxgXEFwjYbUu-pepkwT0qaDve4RJaGTSTfMjm2c=": "384615000000", - "qY7jSG1w5Tc8hQ3EylDz6S0zksZfXJxm4n5F5Ub5o1o=": "382406000000", - "qY8HAzFYX89wimLgqC5v8vODjaxZag7I8B5hrJMuKKI=": "1852931000000", - "qY_o97hs6lQpRJGpIhqapa3zJuRlDEcRTRrNKRKshP8=": "4154615000000", - "qYgW7cE-y338hqYntFKVOHVuGmrwEn1dbXBbmiWAh-g=": "472287000000", - "qYjK-SPkqXSyFPiGjXYH-cziPg6XY1rQcVYZOGCY1GY=": "451307000000", - "qZfxJIAQzA1baNKFOAfAbUZUL9oI6ErOBYETF9Nus2s=": "2936704000000", - "q_1ieVlMDySOWCmEZQPokxlsTTXX0-e3HDtM4EMU1SQ=": "452802000000", - "q_2Q5NDw_zlna-52lhIUo8Qyn9h1OvWi80U1SvVrT0U=": "4846536000000", - "q_MzLlpqe3vrVd8Ph2GTQx76guR6NA71Srw_YByPBrE=": "1925909000000", - "q_THHRf6KpqIrkHGDcYpLkOXsnurro4Lw7IpFK_fHSA=": "4520394000000", - "q_jV6nmHHrQqoatyGwclj7ub9I1mVJ-zzx6vtwJagaM=": "759041000000", - "q_thfny8GqURzlvXOocPj7GFsyjW9Fz7P8moIGgv5WY=": "384565000000", - "q_u9qhLcla_W-tcqrbJvn1n-tdPrRtvWPKxiA87QuXs=": "393135000000", - "qb6_rL8PKD_DVHiBmECZjj_tmaAHQg6bvSwvNIQcBkc=": "423374000000", - "qbUQS8nHTnSenGc3L7VxmEHdxedqVeAjeI8JVDS39Mc=": "488025000000", - "qbmNdk3EROyAtuisQBzl6E42RDw-aH2typ7Kg3Y6b-w=": "784894000000", - "qcqVNohiHbSkjuImmngbLFUwbmOQvdGq3pp8YnL38Us=": "1721419000000", - "qcwzUdoPb-Wa7BndKw6-pTxr3PswYsZVYRgCbc3c0Zw=": "411448000000", - "qd7VjZPYETpcw3UAIYcKCfeNQF517fvj6WHUJU4Oe7s=": "10060660000000", - "qd9rylSBpvYs2qYqwzbOSSbA1LWLPy6h-XxNk3KhTkU=": "1257478000000", - "qdXJ1hj4tPSxsg147nm0exEbMuOjqSnbok9BMQ6hidI=": "6677723000000", - "qdXtuAmhtcGxvV3a4wNo763Umuwk-5ygos69yVgbYKo=": "1383627000000", - "qd_ZGCu5xV2Wu-mxML3f-S5H2ZGgP9KMDVYcSCmt-Lc=": "658219000000", - "qe1NvTKQVIfVMx7lhhTGH9dmQWpu2m4GWynBSBaMa_8=": "384615000000", - "qe3tA6Ebe2xqgjG8x2ARYtqXyZDIkEsiGfCdVQwCksI=": "833333000000", - "qeUsKUAGmCDQhuMLy4FDa_Vtei6Ku9BMBxAb8GfI5VQ=": "411085000000", - "qeVHZDWS_bxr0bqg-NAy3D6-eVvM2tQTNYcttYIocN4=": "381839000000", - "qf1cQ-_TNfiFuXc25tjpKLPWdyu_9UbdhPyOOTXBiX8=": "1457773000000", - "qfHAJbDiw8o6_c3ciBQLSMzE2-xBbAMy3yzZMhgdMPI=": "4157594000000", - "qfJ_FdGSzfkIqBAKVNV6KK_2ZfTp7Nm4vJp7YmMUcO0=": "3846153000000", - "qf_u-1dPudplp8OlGBQBFHzGolQkb2heDmXj6NW7TpA=": "4076923000000", - "qgdvFdEYsQrN8yYsJ1dkGlxct0xDxNOS49asr_IQKCo=": "899685000000", - "qheBkLz9rFltG9rSGNc64fsE67fNZzTXAdMwn5xej28=": "2083333000000", - "qhkqa-fMHiCqC1n3uFBKrQK8j_h8dLJuGkIAb8X5DuU=": "928092000000", - "qi-IzFHoSCFe2_UZ8N_Rl4PWsNHlxK1bTN1P3CYvs4Y=": "462352000000", - "qit1WpxlfSFdrrvY9FUWBQr0WZScHF1zlEQDexmHqEo=": "1412171000000", - "qjF6W-ehKYfFZkOAOGg06RHdArstkyKmGf__lfIbC9U=": "834393000000", - "qjMgFl2fDL_-qmjLEvURfA4v94pD6Ikd6GG89FoFSAo=": "833347000000", - "qjN18Hrx33zDjbejkn4nXPeSuBCHx1_SlHTXCSoUsMc=": "9425788000000", - "qj_W49XNHiGcdoJmco2Z6fOlGDha5itTWFHvUXQ4nAQ=": "381770000000", - "qjwLl1NPoJ1MRQp-Ukl3uJd-2JflsCYg4vTnvzF0TAo=": "423055000000", - "qkX6dp-f-SzWXp6cZ21xCeHdGW4nuBo1cmv9CJNVM8Y=": "399564000000", - "qkiCHmQUSO8ryVpEcUQIQlvjjnuBVajq0DCPZnEIHMs=": "753621000000", - "qkp_xJjOPXjV7cOxlIr2Zt6a2iieL8wf3wkmDpT1exA=": "385510000000", - "ql5XEQoA8MoCDxWcUY5Me3R4Dykgtf2UsYWVvjWp_Nw=": "411201000000", - "qlPaKRuvECVR3r69jFmBVBgLHZScO7k94eo6dJqy_WE=": "383228000000", - "qlVtwn5gptqrOK9aOtk7p-YF6ZRz0NfyQDQtTsbuFeI=": "1361868000000", - "qlYSs-ahCZosY5fdZNiUZTBNvnqk51wAu01TrMLU1ok=": "473265000000", - "qlZ580lZ2OEhXoL7s2ZrmP3SWkquPYAVHSy-jREoODU=": "586129000000", - "qluQEajn96aiu5y7GjwxgJY6rpkYsg_HgBhEwWwtifo=": "453379000000", - "qlwOkSQgpthnxVwgG8pqItBOuq3Z5z4_sRD7UHceM98=": "466315000000", - "qm05ZTPrjM9Lus2ujJLMq54dhpVkkbL7ZyswKgeEC1I=": "384615000000", - "qm0p0yfw9_w5snm4AQ0tNrqESCDh61vwZ5GnsnceNYc=": "379241000000", - "qm940No01vE2CoIrzn4GvElG4eEHzsiJwIYRv5j5gpo=": "416666000000", - "qmKWzRp9r2jU7n7K22Nh4t-jtipynjZkG2J2KGdrjlA=": "763247000000", - "qmejzZx4X-X7QZ9NVoNgR8cBsdjk0ITUWVI5KEO7O6s=": "459502000000", - "qmsg-09ES3MofvUq6Bz7Pf30W_pRJ3uU1fWJCU4VqSc=": "501408000000", - "qn7EkPI2b0gF8wwizDkLiO0Sdd-8EGDDhklL64WL8W8=": "463837000000", - "qnXWMDtNRAeTwg2wRlOfYGDDkmzSXf_NIGqMt999sVI=": "479215000000", - "qnmxppvpgv6aGldZT5l2r67nEp12fGbO05ltqJTBV0A=": "390411000000", - "qnqOAjcUQ2wf90Rq_uqfbqonHXF26sRnVw34hxfKatA=": "786616000000", - "qoKjkRwJC-6ptytBLBr1m4efd4LkrDdQ1guA-mVgWuE=": "501385000000", - "qoNsjb-MnfX6gQ3yywH7nwqobt_N3urPm6YAZ19oFhU=": "11599855000000", - "qodjyKASZayq4nIlakCJDvEFqGNGXhil_vJO1xpTuMs=": "3439984000000", - "qovcM12fXmdVRvw7T4w11x0wSDdvoDls7mPG0KZ7MM8=": "385528000000", - "qp72ucEko3m-sOFPn6j1IqLddMuVbC0_AvlgC-VEaWM=": "416666000000", - "qpRXFGTRPOr6TCkWj_pa2UkwPObdBxtJ7ROn9e1SWOk=": "3701614000000", - "qpSoiA7uQyxHcrvYVr2ZAhkQxZHNcXJtBMZj2Wiwe58=": "4579438000000", - "qqqrlrRqsRI5g5IKlQTsm2ql5MYgWVIH3iYYcrbv4yM=": "1195909000000", - "qqtCj-owigKtlfeOLf6FGAeFMcCKLsazXW1Z-5KgPIw=": "464757000000", - "qrMS11W7y4_Z7bhnqnX3bepJN5gur-qmGNgZ2Hq2ZF4=": "1364008000000", - "qrPidhjtNJ2MF0oRZMO3u2vKXqf6oLhddx6fMmnZBpQ=": "460066000000", - "qrZ3PxR4rOeSGN9-uuncO0q9KAvA3b6zedvC4y4Vf8U=": "449029000000", - "qrcl6eqM5n19PZpI8C9f2x6VIf2hDjEgYPbrChJiQNs=": "907032000000", - "qsBBqYUmJcBbXBhUBJKR3B1j0ot8KsV7BUdCcp0-r5c=": "1858140000000", - "qslni957hlb7MChu_rSUQzjx7ewB8z4O-j67E0cZfzc=": "4149387000000", - "qswWckUMN5V6COzn0L09OmET_JgGa8y1U8ko_HC22kU=": "416666000000", - "qt9677rXV03lIRZNdJwv48mMHgWgYFH_9SbXjjYfexw=": "1251868000000", - "qtBFeA1fFdFbyDifVLcSyWGQnYOV97Zm11gnR72cfeg=": "411085000000", - "qtLgAACGCGeoRvhkp4pL8DRR76d6ZPUtCF8jaWRYeeY=": "379344000000", - "qu2-keFrex0IuXWbwEAGo1dMz9mhXZEUMMD-vGm78JA=": "408533000000", - "qu73t6IX0lC_ZVHJodIznm8WFk_j-1LwjkrUEBKFUKk=": "384032000000", - "quCL5le_OetbhgnD_hjNVUnwhCx3kiEIxXu6kz8ktpE=": "451692000000", - "quFY0hGJ7t-kul_zaRGJvzlsPkoaY3lAlIr47S85N2k=": "572707000000", - "quPb6ni6q4OmvKcjBPWEXgR1hgccR3r7ZSZEt1a-KZo=": "8333333000000", - "qu_VfioEvYryFZd3IWZhebJgEDJvvXKr7TvhYKCN8gc=": "3297987000000", - "qv75YbG0_Z7sc03lZ4xEl1ae0FypOaQCaBoWcXD5Y50=": "4565083000000", - "qvB-Vy96sU_Yoif08UWMqEcHoDNkemjdQz5co6Lyi64=": "1083094000000", - "qvff_I6o5Ar_vwm5tx913NlAc6uAMiKaFDayTPRaB9Y=": "457943000000", - "qvi4kZ_uFDhidslrgtu0-ohuWtOP585Ee7PvhuXNOoc=": "552445000000", - "qw2125ZWe4YldnMRtbX3b4Nnbo3SN8lgslk9ne84TEE=": "1806216000000", - "qwl3MsHnftHtn-rgnNMI4FRetBPbmTWcDqQGnG3M4yA=": "1363636000000", - "qx9sZ9_s3fLVUFpCWA00qmR9Y7VQn5Xr2YHBRPqHQRk=": "384945000000", - "qxLXlC0ZBTX9YaPNSs2b1lPJZfZFdeBTwYP9GGprCmw=": "1952189000000", - "qxWDlQcg6s6cePKZDzd5CROH1qlM6b6vO55nsBaWynE=": "452992000000", - "qxddNj79bE9waOPVhhI7zgJi8Ze3HO3I7UYeDStCGDw=": "785002000000", - "qxlr3A3Whw7QIwoqsypIjr4U4AIJr-SHSgwxO6c8FPk=": "975157000000", - "qy1TMsgP2VkgtHGmqKupVC-B90VsiIjstQ0Y5Q2_WeI=": "404478000000", - "qz160yxarxLRDFZmzWDhcrXx9oDgXmj7fv2cNGLkNI4=": "10454545000000", - "qz6W6EgIlUtBha3bA8yzo_heTR3A6gfZHei3JSwGiyo=": "768695000000", - "qzpeVoqdUce7qr9_OKLXINPgZWrImZD8Li-eKEvglUY=": "579056000000", - "r-xhv7T7Z2FLlk3tNFxJlPROXd4GYIAhkw6kCdmmuCM=": "6550435000000", - "r05EVa9wYSuiYL7vH-UkZkLa5bVe-O3aGsdU2QCmPa0=": "1644524000000", - "r09oR0YjFS92sRaMZ1WkcYCRaJtTIlhJeRO10l5qtBo=": "463099000000", - "r0JZjJ_DTfmZqZkBX1dN2lkJA8N6jJIZqEKMzWAyQ-0=": "382394000000", - "r0Wpzs4AKWc1AU4Zj3jdBQkr4-iUcvH1Z6rqs7rInfg=": "917710000000", - "r0fUnHUXJPIZeSazYZpefWs6XdSPWj3IAjSvb1g-UCU=": "463665000000", - "r1eTAJ9I5T4IYFtOcXvyv-9oBJrssTpl7y4hQljqBXo=": "384343000000", - "r1n8ZZAiBBlQAPrSqyj2svzBwVPWDFKH7Z9YoDsi2Js=": "834556000000", - "r1oen6ko8KusLdeOGT5b58Yy7R97Rv3JFCzcDgJwSq8=": "424758000000", - "r2Gn751DmjZcOL3FKt4Iry7YQkQNJEGrXBLqXERza30=": "2267514000000", - "r2PoxjqxRjFJeDTivPD4ur_HaI_MFUjdXp-ZpeHWllc=": "769230000000", - "r4_VpK-Upk6D_y2_FQ7Q0hXOkdpQCNs9bFihwf2fqOo=": "2909090000000", - "r4_gzQaIfO3affJwKOxNMEXyLW-pBxPaU6YLBgY4pTU=": "1236867000000", - "r5BMg0ovFHGhZGhWGL_2oM_z1ku0KOZuUHcEZGLTUaY=": "1842458000000", - "r5Dryhy8TAPjhB2WzV_HLNN3lDufa6lCcEc9ALD0XUI=": "810428000000", - "r6Zb2fKEhp-HElDFRdPNbDd-4DDiLlZhCSTP1wt4YR4=": "421370000000", - "r6i9g4WLeRQ5A0pLP0W6gPZywn85mB-Bx7aUhfC70cI=": "407469000000", - "r6jKQFDFe8fYzUlJcuCkvN5eLdVDfCRrxthTETORcNY=": "1371815000000", - "r6mogDtJ950dv8MqzxMoVQqBoDR11GBKXDtdPA3i4Rk=": "417632000000", - "r6pJP1glaAvnVvHilz1ZK-115H7sNsqDNQbodYxDgSM=": "457014000000", - "r72ZD4ef-BzxKJHucELrkg9bDJN1ONjZYDOiaGWoGIc=": "7568023000000", - "r764ZjjELAzNv52Dh3by2L9r86wIOfae9P9k6Ebwo1c=": "1947974000000", - "r7goFfGD14l65HwfRPCQ-tgaA9nStAU1YF8j7ceBt2Q=": "87373125000000", - "r7mAE6XNaNZXy0Juahyx-8E7F3I_9F8ZPVD6bAEgXKo=": "1363636000000", - "r8-oGsJiM2wzGqf9JCUc8ag2t1q98Ve06npiYo4z2Rs=": "385505000000", - "r960G1L0P6PApTJqMkSiqW8XMxv8uQyEmSRpf_4N-NM=": "625698000000", - "r9PLrwXDuhoQUlpiY3LqK87kL-XoED9ZOsuYWW62kAM=": "384619000000", - "r9U7iGSbJ7al6r0o-ewMueo81cJ5AEAW39RM-qQ5mnA=": "2310726000000", - "r9_Azymw-hD4AaH8ZNXeCH2kCHFV0a1k2NvnevtB1BI=": "500960000000", - "rA-UfU3qbbKop4yo9V7rE0dmS6Bxm_drv_9LTbccNmM=": "1309650000000", - "rA6YZ5xb1vqugmjpNeAKspoIkEuB9zelEWfKxQuj-ZE=": "769209000000", - "rAATObmUJWZyHE4ngX-UXH2NnbQQsp0bCekFdeXCzUk=": "577459000000", - "rADtc4CfY7FklgEQHfN2Kur8K00zI2KW0qcnHUlf5tc=": "614756000000", - "rAJUA6yjrWNzc2Zv0NVOrpaLsOcdtIQmfwZmXPw0Lws=": "411085000000", - "rAy70R0q9cbRyx_19uDAAtZ_2WUMPRsOKCm0qVRHYTU=": "457529000000", - "rBScmzycdYmoFuOpwvjD7s38Quu_nR1OaybKQaQjd2g=": "591202000000", - "rBc1mY_2rIjhTWsWW9SmRMYHHn5GpmCpR3JKyqXQaT8=": "393313000000", - "rBjlyK1uchRcf6NdmjxdejjAT5It6E_4gD6cg3Dj8Q4=": "380811000000", - "rBphXET7cD_r3oaM2jkQeXtKMZ5dmAojVlFTMMhBSLI=": "2916659000000", - "rCVXyHbE1Ud9hcXActSdZdCA02nPE3UxYu0kmEpdVmk=": "942307000000", - "rCWDPayl2dlZnQZfJ6bNb363caCHyK7rYIs8WH-XZl4=": "989074000000", - "rCb1_U7ezyIfJaRh2rqjGazJjiuCl4GLBVi1Nqh_UDk=": "1739719000000", - "rCf-Vi8_c2nrKRIXkGv2WbHMj8wPKtjQtAG_hqon3Dw=": "530057000000", - "rCgWDGuzWkptmKvPZgHGPuAwDzJy62qF8Pg4fAS4FPI=": "384615000000", - "rCmj9S4qh4tGwHOnM0YUJQiztpVVF9A1auBh5W5jrGU=": "834035000000", - "rDzoYwOez2_rKbXuWb_DDCMwLTfo5PSNsvIBKao9KaM=": "767961000000", - "rE-8VdYASkPq63uYby4bb60VKSV349nUWCKlqCnqr-8=": "725589000000", - "rE47dLx7lWJlD7fKmklvGCcqxQT2TBh3_VVZpmNDpk0=": "1230823000000", - "rE4Fn4MDR2TdlXlrW9JAn0sFAD3q48eu94x6pkN9XRo=": "1001538000000", - "rEQetUtkkaagfkpkblF9vaxvC7co_7bv-82DCaVoKG8=": "749759000000", - "rE_5vqLwRgjeAD5J1CET5cFKy7aZKSjn0AvI9Ttboxs=": "846153000000", - "rEzkxrkWHlxrC9w8Ej9s9rDI35oyFXELHM3VmosDO0g=": "452450000000", - "rF00KwOI7tkizdlSNgz42JcUvXU2pzoJY9l0P1t5yV4=": "382394000000", - "rF49gt1XU3lVBlz7ACxOZ1z3DzHAKMjwQw7G-JlT6S0=": "2379170000000", - "rGMau_omDaAapUbdxAzQtblLuw2PApo2yx2c_2B19Rs=": "468609000000", - "rGsTUetLe5NfimE7XlG1l8iH_joqwC3NWtVty97R_OM=": "416673000000", - "rH-qB2DdesEvCpOh5k3FN6BFK6yvSURs4wWuTrIQQsY=": "1684885000000", - "rH2qDmpzb-9AxmB5orvNnJZYfxbpc9TrFCaCYj9JbO8=": "2083169000000", - "rHXRp36cGvvTJJofrOsifVihpPhyP3mvWqmnPEG1A4E=": "417149000000", - "rHYEvmV-TvH0uPQky9Erxv5zcB2eBWF_vgELR7MkaZY=": "634433000000", - "rHdOY1HHwRFWUL5yC_AP6n9vChOnY5vxrU3ZujfqtaI=": "483147000000", - "rI04LqkwArR9YkqQKsmpC4kJwKofy5ct9G-0rRadXYg=": "385505000000", - "rIGMAvufyO4evswSPiXAv1sHAd0JquH2Y6CsVt1yKIA=": "1392516000000", - "rIIwt6ouwaNpjRFDZwy_wRhEus8IgUOVu--wFU4pQpo=": "395497000000", - "rINeawlhXzJzE9ntkzZHmA1pBUUM5uvpZQVO1RA7HJI=": "3844869000000", - "rJ4XAg17G9HjD3Bvf4lsc3EESVQ2Se2BzpOMVTgAdag=": "21900149000000", - "rJFxjEhDWfqYRNCHrYGNfbaGvIcuQg1ayNJ9qZcZu1w=": "411969000000", - "rJPxNeLLsy6mOaXI4MYuNzyQ0WlgUSnkMCBHs-SKfNs=": "1874439000000", - "rJow4us0ODTEEU-HnqKlTaoVtgvS5ggjUnFgCH4ASwI=": "1269606000000", - "rKCgWPc9qr1w39SmnXuZyFf-nsBXcohZKmx3CguH-yk=": "771961000000", - "rKFQNkwgM0DZxZ-_cL6zwnM-NMIx93KfFA3WDLarpYA=": "1156520000000", - "rK_SkN5WkQOtwFUPBZetkKrnde4Oev1ckXVXX55J_sM=": "383228000000", - "rKtAYpLoYROm4kqbCtlqwy0rhTn2RnTz4W8Y-VwVtsQ=": "790998000000", - "rLC2CuYtsluBjV6IZSunzaVttt99v4GvLtym3KYm5V8=": "1252901000000", - "rLEHot9Gzs80kW0ke_W3boNXcftS8Q_7hn7ukM2Z0bk=": "3846153000000", - "rLYXBJxw1Kg67E3RpfEfzw3AOp4OdQEZ1l23ZooRlCQ=": "385505000000", - "rLZk9YqhygoS96y1qBxiIQ5K4OR73hxevnSy9_2uoVk=": "1418627000000", - "rLlx6vZUl8qKTH4heBEA2Eky6Uw9oq1blG2zSizgYBE=": "554324000000", - "rLzkiIePYlNMiWXfs6r8h0VMCDwSSqP67aa6vQtFDuE=": "383197000000", - "rMNAubrlu3slkkazhklBbopkyowyTwBJmAgQNHwJ05U=": "376837000000", - "rMjarbPZdrauNuT_IFQc6xeF5d5avj61wDHUajLdf7o=": "847421000000", - "rMxlDvRcE05gMFX5Z5P6rQY7Bq9zZI2p6vRu0j6vZAU=": "416666000000", - "rNP0jb06A9L0oN9pJxQq1Mo_pkuFuxLdq6CCdi2ySJw=": "1548420000000", - "rNl7iOWzosmgDl_-sHkuzKmbRimAQ9XObxy3n06sRdU=": "1156519000000", - "rO-pMn4PZB42ov0r43fIZxZH51V0BM3Nn0b04g2omeI=": "4166666000000", - "rO3WFK6WHnx7RsXVsNRQzZBURD6It_mMt74tqbMproA=": "776245000000", - "rP05kTrlZ9XQjDFpo0TfRuBMbWMzzUeFWNpTIfAKvJQ=": "384593000000", - "rPKkvWlZTUJh8UviL3qURuA8kRWjARWC7Ql6Atmme7U=": "446725000000", - "rPM86Wv84W8YESwJ7IDx55jOAVWpsBKRbG-rBUfHiLo=": "1376653000000", - "rPT8sp9vujz1JXZMW4DHawDQW_RN9FzKpJlcvQD98D4=": "770335000000", - "rPWTfDS4Y0_d1QHs6mQQ_EeL-yDI5vAp3vSnMjnF4AM=": "384615000000", - "rPrxJsdLMPuJBm8PCO49qxpSFxG_ateVOiuNZI6BIlM=": "8339611000000", - "rQQvKIyGoO6faNk21_R46RzorLpG0OEcuTFhhu5IVIw=": "2080650000000", - "rQpgjM4UyR4N9QqHKv8DGvT_vhlbDLffZIaZCFRXOFg=": "376125000000", - "rQqyUy-IvSuUb0axTehroPYo3hcXo2b9Y4ccH__S2ps=": "381767000000", - "rRq9h1zqB9V1NyEqyEzngCKWOtZJdvpWtdPRiIELNh4=": "1223425000000", - "rRv7NYKTpiDhY8To1QA7QYV08dcZA7aBlszkaU5nKXA=": "21071538000000", - "rSKzrQ7cb1m4yDsB-Vyi4L68HqbcXLRrDX1oQaHCPGI=": "2916637000000", - "rSMHl7y22Eg7c81dTAZRXpZD37JbTDZI3cTHSpfymsc=": "385435000000", - "rSRlrDILeinFjNAdKBXXdtgiNleC5jszos_bC9s2s4Y=": "384813000000", - "rShNt6R_gFvtcemhHlQkPwxzzhbkHsQG5tFDzTECSwo=": "3793448000000", - "rSsVD1D3fiRjTk0CxG2AupZxw5lYkKgy87vnUj2P2bQ=": "451521000000", - "rTSu4Wq8PHi6ix-LtrCt0q5b7njzRBN2UBSh9PyZAqs=": "416666000000", - "rTY4P6Uf4ZKw6qAykJnasnJp-4DDzfSk4QBh6vhu3uM=": "385505000000", - "rTmSMvlq36fFIj9v-J3ljxxSetwGTv6PzuoJe5-xzDs=": "463398000000", - "rTmVwrrd5U_nz6Ci_Egm1dUd9_7hizBv5EZgQjtuD7Q=": "2316509000000", - "rULSIcwMiwQ0jS5CRoLd0PKoAvPORBiPD2njBJ8lq9M=": "500210000000", - "rUSCmUN7wdAcNfxBqagAV-BNr2l6EY2-4E_VGKidPuA=": "1002567000000", - "rUUH5FCZtiCdquYH1QBVRyiaQc0ln-_QwXp7ctE7ggQ=": "917239000000", - "rUzHeQCTzqVFGMVaw3tQ5h24oljxEdYayZyUxzaxIvM=": "351858000000", - "rV9zkhZF-8wHNGOhzEyYvH6aZX0cIkOFs9RwjX6cbtc=": "1873637000000", - "rVQYO3I6Ng12ATZOI36AolJX3xw1_fOGrNA1gpGg24Q=": "384615000000", - "rVQuc61YLNhgcIbPPhdNBbmYXLpYX445bxUx92nKo90=": "834184000000", - "rVhVv0dbc_xfcj8NdW-AV8l0wbuaX2ypGCO1Vy0ycnI=": "4038461000000", - "rWDQc_Nwgo7lW1f5t6TeQtxfCxqKjZIvryCtlS2FZs0=": "384244000000", - "rWGXh0Vf0euDrAK9IB9dsadX91sMgxKXxQXJjekftW0=": "2499999000000", - "rWbc9EsZV-9d4Ks2sIm40NtA5-DCGVbMs-A-lQZuBWA=": "4582599000000", - "rWmmMC5FdcBYZWdoGfAUR29BoGfRf_ofNj9ftDOtaik=": "1822400000000", - "rXH-jWzCOLx9XnPpVk9CAXB-qsvdCbVzr1dHfY8XEZM=": "385731000000", - "rXJaPaR_Rv2pyPNQIJTe53nvzo7ERJjlmov_UE0BbPk=": "1223425000000", - "rXgzAT0Tni2uVwYFtNvQyQ97wuU9eIvSyHGV5759Kf0=": "861307000000", - "rY0EB7r8ib-M6VEzD_fkqvzWnGnPLG_gW3dKcbT0e2s=": "419607000000", - "rY8x8Zh93tIJANgRwNgNwKyRU738xnIX9kv4glzjo7I=": "2485046000000", - "rYe-xIWBcWhc5j4DtZ6Gejl22IxaGiHtI0bQIelJ4DU=": "1156520000000", - "rZ2UKDRgxcqv95CRn5CEj8b7McS8iUU6oddehDpR-8o=": "971226000000", - "rZ9AIaj9vSjHWC20-n8R7Ii7XfgNMvvDyryZ3xM22CA=": "416901000000", - "rZLvShBWW05jR2R5-WLS7Q-Jji0jBZj2vOWXZBzfjEk=": "378507000000", - "rZSYQpPu1oPp-WrlHlUP8BuZ7L90BoTjjQSgoZK-AW8=": "3539775000000", - "rZlluypr4_4dABK5r81Wk-qkBgSBTJMIaWEZdoMLeYk=": "455103000000", - "r_-kPxfhP23pJyGIVvSF9ERlbVmF1nij75R70kcouwk=": "384615000000", - "r__wEaTeBg9nSbr9rr5-GQ55-Kbpe4BVamgwtWhNvDs=": "2692307000000", - "r_aRD6_6W3kxpQPO5b1gHXGdep6yTwww1AM-NHW-m3c=": "1918404000000", - "ra579ixwg0deHCy91u3BkYDfzP1mdJV7f--nuy9QQBc=": "15961753000000", - "raRGplaXz7Gxv83cflZ7tpAIKv_jMbakjOO-_7iYNHs=": "413111000000", - "rab7nlH5eggUDOiGEk_yI9v662eg888_LFgC3A-hkJc=": "384615000000", - "ratuvPcsXoWr8WOl-6BW0wwq98-1iHPJ7U-gpV5cGt8=": "385188000000", - "rb-Sa_L1dY-1iNSeLDOWOf0Vt0cpkcFurO2flzJP4do=": "454401000000", - "rbQVhdKvDSgqhR9Ej8-ykQ0MtvHxHl7iAanZrXGxL7A=": "4230769000000", - "rbTTW20RwxCPMiS4GtbOV3t4u08JJ_-WT_MS7-O58RA=": "384615000000", - "rbmo8xFV-XY00uTquibd4Dplexho3ckKVCEjL7fS1YQ=": "672689000000", - "rbnLUv_-3e64XNtpVsqwA1AKdxfU4DpwTDLfIa7xDQk=": "6590534000000", - "rc3BqTzQMdCYknx2MVVmTICt-W-SD62MXZV5hldKxZo=": "384250000000", - "rcJb3JelWO6QlgWrT5j5qlZVeEyoCTFS-IoUlLCZ420=": "3855061000000", - "rcSKFpvIqoU2HMKDEfyjshGH6FoP9ii6Prd3gLLU0FU=": "378257000000", - "rcYnwH1PUBgRDoDD_6Uk5RjkrwawfBV7l7t5NsvLEyc=": "461649000000", - "rcskFdBaBPdX4M4gyCCJIrGuk9gMMaVw1MYeoBIYKkM=": "736060000000", - "rcvXcKflqGRcgNkYdGLm_tSehkUrfAUVQ8p4TpOEEQI=": "417501000000", - "rdLq-jzv5Fi8-GB-5AebwpaIHjwxNiGG9R6hFMqSDXU=": "465044000000", - "rdtmdkhoktxscy60BvqGoEex-qtC3kZsDel4dzgcgE8=": "377242000000", - "rdxvmU0TZhdbUKixBQw2SVGPJN6wBgaB-ya_Ok4Fh-k=": "388728000000", - "re5H3eSL7U1NR6M0xQ3BRLqjz8NpmOrB2-O-JjEY1hs=": "909312000000", - "reXoJ9UjPj8utpPeJyHJqewxmqjtvmyfJTBBMHI1TnM=": "430653000000", - "refWOfgbuPp6_FQkW04jRHQszRYg6w_sT67q5Y2w2vg=": "384615000000", - "reg2aoBcX-7T4O26-kd01PuntzOEAuh3TyPXZnkNfLg=": "416666000000", - "rehGgW2pu5Dmk3bigwZy65qVVaW0Zchm5ctdu165-7o=": "378257000000", - "reiJVPAMTREnPfNkD9pzN0pQZ_Zsr6o0mmz_B0sP1Fc=": "383021000000", - "relsNezwXwvV1tOBLgl1kWMq68BJ828c9DS-QeZUdQE=": "30352916000000", - "rewFi8_GvX_tSoSwOpdOF27AZgJ2dwRa646pnSgYY6Q=": "416666000000", - "rf07FEfOop5YuKcousnN1YeoIETsydaJLhXCGkuLP7Q=": "1422218000000", - "rfKJGNhLQgcEy9kKR9oP9zofMzG3gzwWwJBNDgX87so=": "417529000000", - "rfLcvlULtF4f1DQvoEN7caE48kA5gAn_FQinjUgJiCU=": "461649000000", - "rfUPGB9YjqyKpPHY0fk5W78esKi51dkxNLECn-7a7hU=": "7662809000000", - "rg45DG0mXXLkMZSyFHQL4eHFcQ_cT7ZtywpMN0LqJ54=": "3303953000000", - "rgX1B-t-wD4uoQXVUy29UvChqMAZaBHQ69LYXm1DlSM=": "790998000000", - "rgetgbKz_Ex3QVZkYAJQhHx9IXebIIARMnnYDJuZWJs=": "826486000000", - "rhIbAidqc1rx16hxsAd7op1dlHD8Cq3tSEJuPPk330o=": "922143000000", - "rhIeecthHcr6S7pDUk2-oVUpvFkquoVTro4sgBkltrI=": "379344000000", - "rhb7dityRhloHVpRphXl52kjYdOTFYKsNdck4uKuEMg=": "1134175000000", - "ricfwNoyl4G_qX48EV-jGJB6tH4esiLTskfm2ZeIjF8=": "2087040000000", - "rilyuS4enO09XfOLQeqCOlEFdnZaJpjZB3x8BRIFafU=": "385506000000", - "rjWluRI4KwDjIvPyjAl7hmTVQxLSl8Tofe53ldnnxw4=": "455600000000", - "rjYU15IJ2a6Zr8oLqtYUu4pmovc6-pjJ4Bij7b8J_IU=": "460310000000", - "rjhUlRF8-KiWrFNloT36h-oDDzWmUsvdKCmfyu1pZkE=": "384973000000", - "rjiRwsvn41dnBRvUtWx4CPzFV8_GvoqYA1GoXa6qFpU=": "457058000000", - "rjzddDN6f4r9dWQ3bxwe4CzvIlv0HY-iNMNObwtCU5c=": "385506000000", - "rk05z5-sFblpwM1ZoV_nZvjLJd2CoEpkGA_8xN885mk=": "378072000000", - "rkbiZTw37FsdG-d9ljBR6-46YjvIuI79v_uKkaQMYjo=": "632565000000", - "rkf4_p6LRc2fCfG8gQ7Lr0dmJ7WIyzMh5pgC67LH8d0=": "385400000000", - "rl97wz1UuwX7Bbk1Aju1VaXfC-G5RV01HFAgTsc8boE=": "1216563000000", - "rlGiNRZM_r76Z2RCKxTZ-CoPvMHzev-3Zhm_O0Yq0D0=": "496855000000", - "rlRJ8jiw6ywOnrG8TxzlfqxiAqCKylwZponf4gPKUgM=": "1538461000000", - "rlWrMICHmxurfXQzZuqWs80zhiK7y3eQZ5cYnSaeAsE=": "469404000000", - "rlZ_e5cSOBDbSIZ3tv0g01PFIb3mjePjl5g5FACTyb4=": "385505000000", - "rlwZ0AiIjMTnqsNU_KWCDbA8BSQoMcOjcKF3rJQm4j0=": "1378107000000", - "rmp26U4Uw8PHk-iLZZukm-3ZIQnCjk962znPtp5VlIc=": "1204617000000", - "rmyk5FXYL1RdzxSY5GAEjpvlHj1C8eh29uTF3sMw8Vo=": "4997932000000", - "rnI_v23HGXUuOl7sLZ0Qd9zTEaEELhqL3gbg2oInA-M=": "3199956000000", - "rnSjQz0aJV4zEyNreN1tC9IrpeyC1s0OyxfobQu3BhA=": "961538000000", - "rnc11Q8yIOl61LTrGTkSKo2sRGU79g8XVRhV4XUnfoY=": "388347000000", - "ro4KCX6o6aeOofECPPmSEEyEycSCBMdNc2f_K2ZpB1A=": "418120000000", - "roC_M4Wpy4xZyjriChvR08tBWSGOP-dUuCF4RmKzipo=": "386320000000", - "roNePgaZTY6pynK-FhlMQOG9p2hja-cEFsiGMWi-_Ew=": "994805000000", - "ronEX6qjaF5BI1zU5odm88c5ihInatthEbYUuokDz2E=": "385506000000", - "rox_OyW4GXXHQdMdPadRp5-bbtSBXzdXHdjSh9ghOIs=": "452943000000", - "rpS6NjTZFlYGcesbe-eAwgY8ILxFfOHeAIPZ-6d0rgA=": "463799000000", - "rqQs9N6hZXq-ac2-pEwaohwoxpVRSEab_DGl2ErliII=": "7483384000000", - "rqfn_NZb24IiTXGpR7BeTCS3R0zsReHTFpXhwGEAMtc=": "454545000000", - "rqspG0dZaXqXcypKKHhOxwa6d15Dw0R2IGaZ2b_5-ps=": "3921237000000", - "rqveLamNMSCfdZIFeoTQARjpgkUGlyNahM4SDNvUTk0=": "492405000000", - "rrpoMfPKY6cYXTJ5a1JIxhebkeujSMb8NO7iDiIt7_4=": "639417000000", - "rsAUdPYBezXrxY_iUTtPw-5Bgw39QDINxZ4quDHHe-U=": "455526000000", - "rsSdA5uGAZcS2ZwQZUh9t2qQIMNflZy0Pjp8HEdDVN0=": "817307000000", - "rsX0ymnRRNsmkxiPhYIif9QHFDGi41bCt7FVa3uonxU=": "455367000000", - "rsf4C3wXTm4JM40EzMVCNvDbSxmlkcI0gQXopQ2VOmo=": "416666000000", - "rt2LjgquVq5PDTGiLA9pkS4pY8FVHLYFgmSCYYidVx0=": "1615367000000", - "rt8ypDF-GpsKx0fC7529RO1kbzM0GzEf7X2JqDpL-vE=": "380585000000", - "rtvgqgE0L9GC6vU_zjJ3gjTIU33UMDjoDqmUKG5LtGw=": "4834423000000", - "ru-hQ5sISHTzCH8fFJ9LYAOmtst56WV5qctsz9JVA3A=": "415901000000", - "ru4WjOX_Dbb2hLe4IakRabwq9phwX28ksy25n3RTriY=": "576923000000", - "rv3Pe95b7h9qWk0PmuMoLE5xdUYn3g5ivCXFeAAFA3c=": "384600000000", - "rvGqId8PM9ON676P_VzQKSeSd5qEhxrtNoFqs63rhew=": "3414222000000", - "rvNho-rJmTrnklZWuLbTaLEZFwL434vhd1l3g3hDjCM=": "6249999000000", - "rvZsQsnyh-jRJosL6bgUGQrASznvsifq2WhYlZ9NWVw=": "632091000000", - "rvf7OsxQWkV11jZ80wRcZqc1_mO4znQ4Eb-kbY0ODJw=": "787528000000", - "rwOQsgESA3NbWT9jSr_7p2lia385KVm-iodwzVpLH24=": "396305000000", - "rw_ZQ4bcsybHMl5MOuq3EsCazox_vFFklBka87tzCTA=": "1785662000000", - "rx1IWbdvLX-Vu2uANB2Y1WiVzDyENbaXCH2UyO-qfco=": "843817000000", - "rxEsNIeL6wqYbIgwG4Qxy9ORgX_nLq4dfP-xcpnktwM=": "3749999000000", - "rxcOX7FAbYzTT2CsPemHLJxPfxcRZmDKFzPMWHFrSy4=": "572250000000", - "rxofZ9KiogyNQc_R1nJd21oRdNqP6qCLQyYel9ARd4Q=": "406107000000", - "rxsxj4RZ6hQQWPtozwWJ_yBhUfpzk81CndiP2h8gFgA=": "476420000000", - "rxvToRa8DI7wUF0yoI1TmSKASoY8evBFslPop6NQZiY=": "384615000000", - "ry6kAxpMLFsQbaZFa8fFiSBkQ0PinGCjZ317MMEwVDM=": "608069000000", - "ry8Cq8YzQTk5-lAmWuGOrw_XhSeFX3BaDO0qtGPV80c=": "538461000000", - "ryGWpq6VlT7rFby2a5ajx_s-IES1HNqlfhwfdpMxGo4=": "1321302000000", - "ryNzRliSw5GQA3doUJIwrdq60shLmDug3LXvelClPt8=": "384615000000", - "ryTXb9ixTfJ0gifhtIANfvE7IWa-Jo9g-KpHroFCQXg=": "464322000000", - "rydFfVh_VV87VQCiiZ7n5la9YNWNoWOfG4eYKBEJ1mc=": "567136000000", - "ryetfvip4SUnxBFbjQqW74tLhBX0PVz_Oe5RP90fjbA=": "1100384000000", - "rz6oQFvdWUtyF-RdutokG4hKIaF0KJ_8V8LjAYBVluE=": "499999000000", - "rzLXxmnyvjcDS965f8WOCQaFUESYLmFMTxYg20z0IYo=": "473228000000", - "rza52Iy_F1pb-XhQWQPzNYO30jUXenq1WAxdceTGdAw=": "381567000000", - "rznwG6aD_qbzyj8kV_DjuUIRD-NODmTXUyRTFyL1jZA=": "19041970000000", - "rzsgq7sSeZ_VaKGDMM0MUPugJ9AIyhQth_qZgt2lHcU=": "385475000000", - "s-1nukFlVXfAb6gtdU1vBIUASmZxVEM_ly4805qppIE=": "467972000000", - "s-_BEi46207th3yrjWu6xpBLrrFtA3H_p4ykPkdafJ0=": "929233000000", - "s-bTClKvEhZPj23JJPFUjAdoSXqw_ZNrQyZnysNEOoo=": "422815000000", - "s-fvBM-ImS5iT-LiAyNkisdqRh9aRXAxJZn01KbLl-4=": "763868000000", - "s-ljWB9nlY1hTjcId7gI4iR0ETTcDAGx2ak85blTMpc=": "764832000000", - "s1Q6kxHHeju-FOcgw37pkVGTSPFqWTNsNajbVTVsYyI=": "808957000000", - "s1U-738Ktinbb6aAqiaLGuDASomJm4PsjCLNDzGMe4Y=": "416408000000", - "s1amqFg5JacBI-4BhEIQs79SJQyAdI5GSeocj1su9v4=": "448728000000", - "s1o_lVOItwL_8HbR4oT1WA3SJv7pSslYdJgIeBRCDPg=": "447576000000", - "s1zEems_2aGQ36JPtt9PGvpbrmUBTn7z-fGygiXO2g8=": "1249999000000", - "s1znhzDUSUZME3szyjx92I8rPUr0Tujufoi-g15rEfE=": "4969390000000", - "s2BxlYdX_GZ272WPi1Av9fg06QhUogfp4voKPkkOwt4=": "897065000000", - "s2LUTjCodFS68cxVlPD1zJI-JQLK8jd5gyIKhBgzlPs=": "845123000000", - "s2X5tFvs9OO1okGi4AB4t-2OItI2GfE2F_LLO-V0g6M=": "5651183000000", - "s2ZDveGmNXI_mezEWPy6_aw396oAUXkWvic_z7-vGOg=": "385078000000", - "s2zRpRrLvpchVo3rQvD1FLsChYgyI1a6UEQOjLXTWw0=": "2098228000000", - "s3LLA6XR95k3X4I-Kvbsh1MSLz1XPj6HvY-__lPODb8=": "456504000000", - "s3luQYd8HfSMMw9-xW4f5_hUo3yEKEUdz7TtrOmYqJk=": "603092000000", - "s4EMkg4WyXIIr29_oirs8cD6dPBJVzZENw8a6Jed1z0=": "769845000000", - "s4VjrLnXZLpyoG6tCj3VtjrlOgR2S4Y1g0p7lb_wQqo=": "419937000000", - "s4bO0OWJNJa0f6ZMQfssWsDToHK-AxZrRPn2BIBfonA=": "1854461000000", - "s4dY-1ie5zB7YOKhba_uWiRVGtw6rxP3C4Rlt8TgI7M=": "380112000000", - "s4elD0eFTy5MkUCpvKM6Aa8Z7d4Y3rzBAZgHhVS3Sx0=": "5297616000000", - "s5SUjZxruB_DbErbSiRtg7XyJAYHwQb2GTU5r4SBiQU=": "379928000000", - "s5r3C4Z00A5TaZWXsItzDh08fVNApsPEpjMzS_LkyK4=": "416673000000", - "s60Tof21Jqfv9ynLcU6s8_tTTVQNwnRXUPcIyvBqYWg=": "561854000000", - "s6NU4LEkVqJLwaNPX8ax_HOA-qRfV1yuJUzq8968XUo=": "642698000000", - "s6Wh7wv3w5kv7-ocEo2SgSgblIycML3i2WMOMugaSPQ=": "576635000000", - "s6bGY2h6YuV7SLIgrQT7kmVnbKKy55AFs_0TaLEfHGk=": "2059257000000", - "s6pWTu9oBMuQQ7mBFccnyR5I5iOrm9kr35j6DITzfnM=": "6030655000000", - "s7-9z6ae81TYK0cFQ9ldUtzlOpZlAFch2Tgnm3SmZIk=": "547656000000", - "s76O19pWeVSBwvCZ6HGtx6pkzTLelhZumdtCO8g7kwc=": "378106000000", - "s7Hylh721ZxXsl6Q81J29yOTikTIah975PI_VGZDJsk=": "1177351000000", - "s7l2J79y46Z6U_rBncuO33rgcInqjA_79-GWfk-B0W0=": "473848000000", - "s8Ch5v5O1Df9jxcMyjd_EKLDtmZ8x68SaJccJ-4GQaw=": "3003846000000", - "s8JOTyUczE0-mCKUL7Zo3Wvy5dNUplyx4KBQBGZLojo=": "420145000000", - "s90L-2ns7rSmFMR2vgvuYU_6pJRiEJNreHMbd0Z_YfQ=": "410399000000", - "s98FEYfhRW8nXxxtaX1X9g2yImfGW---3EbpUcFqy1k=": "383532000000", - "s9WRaqCEheTRAOb9KcSofTZ-7Mybn0AGD82y1E_9PUM=": "2070226000000", - "sAA6p24brSJG1TFNlJic5KANNeEZx5NPC_exEDlfJO8=": "4542327000000", - "sATZq6IuPbWfh4zYIKbfzYzH8TmHTQdM4hl4YNcW9zA=": "469809000000", - "sAzEh_mn_PR4e3DVcRal8N4PScOx1Z3aOq_68YL_G8s=": "393313000000", - "sB-oSbrW1OgNHw-AfbBbihkKouuGlYce-RC-gtqCRFc=": "452708000000", - "sB8IZpBYUeVId-xIvEmpPcwekGDSEG78uPG9pnPQLyc=": "373603000000", - "sBJx9wzjXmVa1VFEsvUzZwa9eXtDTqZmnkUWGNPn6AU=": "386406000000", - "sBUHP-Sg3Y0EEeHbm8-3yNIkxa3xeMxnf6vUEWgl7Vk=": "384982000000", - "sBaMRV3exR3LDY8gZn8qpU1a2HTm_Lkg5fOaaUnXB0c=": "2291642000000", - "sCwV-eq7QuZk-WJNtR3VoutGD7fWo351URG9tAuu3hk=": "384615000000", - "sD9SOxMH5VNlAgmtU0diQwzXEBrbtPQ-PhGC-sXz6Sc=": "966294000000", - "sD_-Eue8RyqnXmIzu4XuLGjMIsHuPsTYAuxIXxOpYlc=": "506181000000", - "sDu3DYr7eZaa4er4We3xUiS3Be6-8IeaEZio4aXtwRA=": "1365145000000", - "sEeclrmLaaA51Ga5ZPxtmXyIuUg60HeN0ukPiHCsF_g=": "2499999000000", - "sEsnOuRrNx_duJRRzHMEEx9GL6GU4FMRblAiR6rMUU0=": "1249999000000", - "sFFFuUbc36osVdhugKesCHivwgWCti72sDVYiw58-As=": "1916510000000", - "sFKwUo6Q9gnXugUi9ePKWZ95KlxfV4633jd4vH2wOxE=": "385507000000", - "sFc5rqO07gnhgbffolvUyBA9l3XKoPICAl1Snz9Y0PA=": "463156000000", - "sG-ceg0f8lMVYiNV2csKhVmdHUoaPDyR11hViaK76d8=": "845123000000", - "sGWtCmxuO6E9jGQR_9tXMfPab017qu55ynyPJkIpbrg=": "1230219000000", - "sGjjfYvLhNCw0AgmqfIV4YVu7FKiZ-oPOS7zlISTTVw=": "3380298000000", - "sHICjWrF38w_gax0fYdmxyslhHFqcHCulM5CLY58K2U=": "384615000000", - "sHYvFaJfm-hJmzrNC23DssIFXE_zYXybUl2U3sydwqA=": "411085000000", - "sI7tOv1FrMXxLe7IFr7SDDWgvmi2cozxqrV7WntfxkI=": "454566000000", - "sICY1rwf2kzlZsS4jaU90fGhdbXebfvxFrwxoLjJSKY=": "1969135000000", - "sIFY6tcrmEfv9jEmHgpcx-6pZzYdg_VoXnCxY0aWw5U=": "1888319000000", - "sIREmPRjBjzFbWyXEZEA7qthe-OZKi01s_TxiYWH2AI=": "384615000000", - "sIgiCY6uS3uw7ct2wDULShvAgL-KU3CR5BeVP957SeY=": "4644913000000", - "sJZvRJPClHaqVPbHONbWwukzdJ4oKUXrz_zrS24mRLs=": "454545000000", - "sJkaI6HmivYdmwKMG5mQSsFNrEfJuZRYhDH0qrjXOlE=": "8930873000000", - "sJlOSuJQ0ZuZ_q846CBkJUflpP5F5lg2psO9FOISr1E=": "1835405000000", - "sJwotMi2yx0uBpD4F49FhiyParvf6JPXNnThlbo206M=": "2307692000000", - "sK4h-qaPEU5uhh9VGtWNk_0agyeSpKXB4so87whpBb8=": "384615000000", - "sK8cANImf7cE4KA1A4mrFSGiKsbaQ59vO8JAbyd9Y4o=": "20001042000000", - "sKcm6tDvCODpi51CbmAdT_2VnXBklOxkq6rPwULvKzg=": "384615000000", - "sKgHDFMtjneyVdzk0p5Oa9IfbbrmPAfpl9lDq1rrJkQ=": "456266000000", - "sLHTwI-NTeFWVSqanVjVZci_gFwEVR8CYciZBHT2NJQ=": "492802000000", - "sLJjKkB_W6AdRtyO3hFkLhUUA7cccO0Hdgs4gN67omI=": "7000421000000", - "sM5dqo8Qmc1V5FmyrfOcFMWgSxtneg--KVsrbhbEQs8=": "412635000000", - "sMdXcIBi4xdcrvnNj0Wol59qawOUES9CFr44ntpMFow=": "385507000000", - "sMyghyVHIBt_9fQv18CehPrsL83vLqd7mQU04b5bvHg=": "1513770000000", - "sN1q_N9-_ARMD4ifM2khdYB-nHrmi3aWFP_8JGqYnro=": "1666695000000", - "sN_72NnJ8eCuEJrDCXbAbUSWwoa4nVmSh-cODB-LxZU=": "8333333000000", - "sNzQ_LxmRMWEEXJCknRKdUOYgcljThjmI6oXWiHJSEw=": "384615000000", - "sO3olhUNKsugvQkTU_oYBnIiPSwMCeoQFjMVp5Zrj0E=": "1896014000000", - "sOA96cRAoNbapYZ1R-HCdxkGbju3GE5jl0KPOz322Gk=": "481965000000", - "sOFcxGzKuhncvCSu2nQoUsRCkbEjAoGLoIER5UZKgLk=": "8333333000000", - "sOK4nfVriZQIOIq5p8vMA27UimuDPTdr2nVBmsyZLws=": "416666000000", - "sOQGIvCGDRYlM6U1XsCWpindkXEW8a_ZycHK9wq8kMc=": "381632000000", - "sOj1mn6jabEQOb9yV49XBa-eXFETncIE2Hb8IoK8hDQ=": "416666000000", - "sOr2DTQmAMbRNVRtioeObVaQJA7N3P1uzGjHsbKaMEE=": "975129000000", - "sOsQI8Y4-MwihAH8J92f-XWWj4To3EoXz26OMKVQ9AM=": "840116000000", - "sP3RFNDQtrpz0RA3AKKop4ZyAozIsYK_VINiqJwYFDo=": "1261419000000", - "sPWemmRjgsurnfHTNthsy3fCVim0PY10Ihg_Semxv_8=": "769230000000", - "sPZvVyI5wjLuobKkve9BKmcbM3ocB9SY0GBbwSPhahE=": "385602000000", - "sPnhRUIp-LzDAf7ZugXESIJy9rfJSCwSZhRYon4QW3M=": "416833000000", - "sQ2d15BmBU2P97JOFsqhsc8Hi4T7a2V1UI3XVLKfAw0=": "380862000000", - "sQ8Ab5TDBtorohFY6mU8OfZB_FNJHrW3m8TFSGK0-ZU=": "378755000000", - "sQMrmYUzTjgHTASpaDpG38IkJaZI38IZZ1wvNhoKY0U=": "2681980000000", - "sRI1oXejH-xCx3CTf7KshE5w182NaeaPwHfnOoJNN-w=": "1999999000000", - "sRJuYKzWHsn2PHysJQya3nnbdablfrWcrNp4YoWbRuI=": "4642118000000", - "sRPN7oF8BWlN8VYtsVwdvgxEyuztmNb0LcEO8PTuES0=": "4165243000000", - "sRlAqOFbhC2g2xna8kCQHkbYuCTtFL2xrjn31vQfyd4=": "769230000000", - "sRm1AdrkoxvP3vIJGzPTeQvWtESaT8RmL6t0Nyttzoc=": "552876000000", - "sRtMqylT_PJn-OS3H3dAMvny0Fv3liBejV5p3QIw2v0=": "385449000000", - "sS2cnfkaxMaldNT-fZPrUhyUDF9l4WyswZ0q_l3frG8=": "454545000000", - "sS7c9_lkNLp9VcDqeLdiZBrdn7os6YMsONovv6K20bU=": "1927547000000", - "sSGeYHYf_xNJ3RfkQDrvYcAuLxXH88nfBK2ldU9oBEQ=": "384897000000", - "sSiC9GntOOltzg0-QL_nu0NWHotsujPIpL_KQITF-3M=": "1350098000000", - "sSwuQRtpytR_a44hcV3Obp3um15TzcWJS4wNShDH1Ks=": "780319000000", - "sTS7iLcwYFe5-u6-JcBDAgieqFace8gr-uXwKNjEkLM=": "1153846000000", - "sTniNkQlM72NuXc2tYQU5yhApccW2ymfrTMQ6X18Jlg=": "417634000000", - "sTq_fbHatHEwNO555FTOXt3D3rZUAY_dYqGbqCPE8VI=": "14352168000000", - "sUWRIU6auFTBT8yG4Z23JDDO_F9lHBiIxSXuua565uM=": "384615000000", - "sUak-5WYj9NfP_LdqmgKJVVFzze-zgkQCq203fZxYC4=": "1902052000000", - "sUoo80obs8yRowUt5nDkoM-Cx-ANFhn1-N7M7vblOIs=": "763268000000", - "sUuVZNCEPIwP09YCu95ElHGU3Hc_uPxV130kTymVcOg=": "384615000000", - "sVXP2kGu5JRK9AoZsjfNxeF-JKjd0vqWl9KpQNm-3r4=": "386320000000", - "sVvDBz5pWwyI4xXWhfhsAC59s97UWLx6w2he2PLeR9Q=": "7692307000000", - "sWCJ1Wt76nO_5wQThCdv3m3Es5KIOY2KdyTyFiLT9vc=": "501413000000", - "sWCThyIHjWIOLX_4QY99VYeNI29obSmUIxyz93UT4d0=": "462472000000", - "sWMZIqWNx67zlr0ZIM94L2K_OvUUmRmp6LfFFUMRCJE=": "385507000000", - "sXZOp0uHXs3jhHTEamwCIYXoyBOxdiCVn-mW7NtZE4Y=": "378037000000", - "sXq-iHDLPwwq-smBkb1HQYlQa8tzBkZjRQGuo6jUfSs=": "770133000000", - "sYMNrCJPwT0DHE1WThaS8LOgkkY885QFBgWRT8Jm5qA=": "385352000000", - "sYVkE3gwj6R-BvpeyKftpHbxdeSNGcVFDtDLqJGNeqI=": "538466000000", - "sYlpa-dpgEGtPWF8fN1GYtFu1RB4vWPGSGPHY4eWHaQ=": "1999999000000", - "sZ5WdfkUX4rR-OwMZwCQsgaGs2cofU2reAW8eLaodpk=": "473001000000", - "sZYRhL1X_DhN_kaCG-7ekjb6R_8YUg9HuEjAvYpQJqw=": "1409664000000", - "sZkgMid1_1Vw91VJlGdsNdLBmQoASZ8WNdsceFqw42U=": "441769000000", - "s_JV7tdN9CS91uvyIZ6S6WvBKUFtHT02ibJWQklVHwY=": "1945234000000", - "s_eyaqwTpy7U6bjnY1X4thokqXvSyOZR8RIo74c7uZ4=": "769230000000", - "saFqX5JPQgqBxjStIsoXYhICOkyX01CgIyHYlxRZoNE=": "446505000000", - "saYvG6IonKPNbhctHfEjApBZvD-5ci-2z7PoR4GHxT4=": "415177000000", - "saa-MqiRLQDZ44rQPqTjBibWtu7klXmgGV230ppERbc=": "838464000000", - "sbOYcIWm2HpvYD0Gam1R5mM9kvcYgXbWrfYsBvlhIUE=": "2552557000000", - "sb_T-cb3V7D6mli-Z4ZrVyUIraCYiD9bnXa6uSRmcNQ=": "1265782000000", - "sbm68Ob7_hV9ffzh9kGOYcG_IDRJWi2DiPUjIHPRxBE=": "1255127000000", - "sc2EF1PmA-JpBHD9cAzPl19Fyo3bHxTBZlqYF8VZji8=": "5642445000000", - "sckTMjt9yHjL2Mv56hysQ1LdKbfZV3vsULlaV_CUP48=": "1075604000000", - "sd7aa7vD9lPbAKksLmUzVqKIv6IYtHb8xks_wFtzQE4=": "1091616000000", - "sdJEXW-dWXJJXOLhQKlvXx9gOnEp1BlGkcU_INrxwoA=": "364677000000", - "sdN0stq2uoIjRRB0m2zktTzGi48XR_-n8TrjHT2rIpI=": "456871000000", - "sdV79VMW8Sf7p6D7IwB3r2-kSUiJyhIVwJ41V8baQ-g=": "379658000000", - "sdl1TECCdXjp1Uo0uSdzR7ZKRTVzqwnM44Ct59ErWg8=": "385510000000", - "seUPrBMo_6RdNSo9rUHlk65WmbNK3pIwZIjspF8VyYI=": "384917000000", - "seuSJOEhbk1A5Dco2479hBiCh3tk5McFgahzBoIKwls=": "3535329000000", - "sf04SwcGsMUs_FMBjZHrq9EBq1yA2qbRFQQjs7dCRk0=": "933373000000", - "sf46_647e5I9IXMB8-TvlMxCqKgihtojL5Jufz-QmfQ=": "384615000000", - "sfCEf6PrgRle3T1HCeVevt0mgRcxD6qAjvS1uY2_n6o=": "8278633000000", - "sgRaie0wKDIwJhjVUwf9xzOI7fwwDqKuGx0K7S54OdA=": "384615000000", - "sgpwqQLOvEQO96BAwxSlreKTSW4otadTIVKTJ4_5qmg=": "1896623000000", - "shIevgNhqx9fo-ssUhOP6tm8-aAXtILbhX7IsyaPJjk=": "385506000000", - "shRMGSnSADKG-UZINCJ8m8cGm0qhPvhENwtJBj-eDLc=": "1272807000000", - "sh_EPuP4ta4CKI3sLpSWjaqJmL5YJXr2_Pl8SmNhUQw=": "5769230000000", - "shi7t0UIFZoEE7PRQ1hjLRm0VIi_W6gSGXksZ5ENo7E=": "1441965000000", - "shoKUUaPDJtqZhUey4h0qUyvqAmf4o5ccI9ksNEnhvo=": "18759196000000", - "shoe3-GisevS_ie8qCa4eoALVZKxDWue1QB85LP_tiY=": "948076000000", - "siNCYKoq5-T9ZD9O01cnwX-Z7TMH4xzq_nlTQyyNeYo=": "458773000000", - "siQDWUVxNxfgsY8uEM60jxHfbKc5AwqwI2w7yGmkD7c=": "770833000000", - "si_JL5ozoS0o3LYqbHh_YUjBTOAr1TINHn73iUTuSao=": "4974180000000", - "sigZsNMIxqXMcLPbhP8iSDzL7ofh00cGErXOxFSOb-E=": "381902000000", - "sjA2fYlFlUAis8FZAVY9tZ0JF1OQqgTr8P7iDkZ6KWM=": "411085000000", - "sjS77dmceaVx4ANVx_cTr3hPHIXLQ1aO9ZwznGnCo_Y=": "418507000000", - "sjgN8nWXO9PT26a5_y7NFXsNXg5FufyHcSwnYwbAuP0=": "395499000000", - "skXjaLCvymoz6NwioAlSgaBGaPpcQVcgXF_7ltlYDoM=": "412985000000", - "skd9HAVw7xV9FkXBB67GdoaYK56sXbX2MfGb0eNI6CA=": "384603000000", - "skkvw77_vacNfkv_G1FY2NaNxYX2YgnyF3DHn1t2dcI=": "899685000000", - "slJqDtgbcSmE-SdAu2tvHAtAEPiuYPql0E3iVjKhGFU=": "754827000000", - "slZt6pj88TrBM94t5JTx5Lik6HKByRnGv2csq6QEc6A=": "481721000000", - "slg_ky52bQTgRn5En-YZaShG-TQpyCxKs57nnbLjgq0=": "756920000000", - "slstSBCAJQU5TLooV8MCkLbiMm_CVVSc1ocU64R005E=": "14226081000000", - "sm2t-DQAIz8blh3v1NTWSsjOE8hK2ZS5G_nIOtPzhto=": "378561000000", - "sn3x8uwSYwVC2PaaJYkYo_tLFcwSfWSrW1lNai_9AOM=": "384615000000", - "snd4KH9_zlPCNE8P_WGdHGpoOl6c4JfrnutzK_Dh02A=": "1215564000000", - "sneKJOCsAFh0gX_CO6w0OEt6UVOGxeqSYNIon0VTqPI=": "769230000000", - "soGmT4wocpf9XsCiDVNhNjuSF1miT6LnsN811x2BUg4=": "19230769000000", - "soRmWwU-MncrzxWwMhgWEPPRmH7XxcrWl_d2Y_LPOzw=": "458399000000", - "soXhQZKqdAY5aMCyz7xPXKPY9H3H-9TtrB6AuVIAhfc=": "777978000000", - "sp5fc--hCA6F74IDEYO34sAeQ1aTL2_ATF-UBhk7cCM=": "385509000000", - "spY701tzSvgruElAY_ZHXarmHoYZNe5-kk0SmhrUMbw=": "7907134000000", - "spuQANiLqs-n_a4omLUtPayozo3LqWJFiancF6lmcEk=": "411085000000", - "sqCEhkKIwHeqGIKyT2cH8LGuO7cFj-KSKrKDlVuYRKw=": "1563266000000", - "sqOeY3saoFhJt205dImisxX_Pka0qNBeMI6ZSvB6BKw=": "2730743000000", - "sqYzyOnT76RKUOcpcZqPiR5L7ebvpSM86txEilwdUmI=": "1820233000000", - "sr-32NyMg8LJQHu7UQpUtcfUYk6CXMCHHuMQ1b7dzfk=": "1254201000000", - "srL1KSkjc8-5ousiQzKlASx9YXRvl-2AWYYWWmUrQnc=": "384615000000", - "srVPl8i6vWhkTpTADMr6PTkqBzG3q2uB1v7qYWHMzhI=": "4616309000000", - "sreXp0J0c6vH9pu1H5ZqRTq3NKCotMF38HT1A4n2NIQ=": "384615000000", - "srjiSK7qJGywOP7cwiUZHckcSKoQm6w-Y1Z3gwDoCOE=": "384615000000", - "ss-aKryx5pMdASSHvaAmvDScC8hDrgMy-09GD-e7pvo=": "379344000000", - "ssVTmz5fW1mxILcVKDbgO8MyrdnbmzQSD4u9Z6ARinc=": "816665000000", - "ssjGFmezuNZs0zuYH8C2uC-NkBm3bRg38I7vzUv9qB8=": "1927528000000", - "ssqrCdf_XttWDBL6QOFB0TtxJTlfhZ-S45YgiOIAzLs=": "842738000000", - "st9J8hOUQaoyx3KLN8RBz5KGaerc2E1FCFnykcb569E=": "385506000000", - "stDzhcvGKZ7DxPszaTN_a4QXbzFs_nNq2Ir2bT6GJ-8=": "492798000000", - "stHZDZAVthGMphyj3bOv4vVnqbzZdBlHDv5ky5BGOVA=": "498155000000", - "stNp-5XYif_DToy6mCxdFMPZ12NDhukgGFPrqC6lKIY=": "476807000000", - "stRTjpLdJOkUmcpYMzKQ-IpY_7SUXhatKL1qbO_btaI=": "384316000000", - "suDTEY5KhRZy1i7pqSmFR3_HOGlp1eQ8ALPgqlb3ihg=": "2460380000000", - "suMw2EYLeR0Bv1bX7c29t3GJ5-kbmrYXyT58jM1Kzmk=": "387132000000", - "suNrCvTTG_AfHE-PztJbrehrNuTvIfo8V4yPN5mdWW4=": "384615000000", - "sumabiRyY2jP_5C94j7ovAzJds99tRs9hZCByAvMIic=": "1078535000000", - "susSnA_b6ehlCxYJFr2oB_IZ7xkZ49DYpLVI6bUeHEM=": "1538461000000", - "sv1Ud9Hb57SgU4DoKilAmXSAxqarofRoKOTxk6l50N0=": "3570765000000", - "svEYcpNMXLUgom5-jv8z3u5yPE36Q9i2vEKkSw1E2Is=": "1371823000000", - "svJADPc16w3kA_QbpBOKrI4-1Mqx71Bgj1uPmwKC9HE=": "805513000000", - "svMdviTXJOsMPWISEisqasYZfBEjSxWg-RpXtjvIohI=": "754692000000", - "svfgdD4M5HJBoQ52tyuruNpZxXt_T1zcmrpBRXzBAfU=": "416372000000", - "swxRpqUN8muOZttYbToY0FiNjI8p4jhED5X3zUoaVKc=": "407808000000", - "sx7a9Xi1P_1ZWc81go_gD5QtR0nnCW9TUvV8NRDIDjs=": "384615000000", - "sxHWbUnxk_ibGSOEXryN1nJBjcfpJsr-Kr8SAdWmSXc=": "1156517000000", - "sxYiq2e_85tI0tkPp_cYJFk7NsCYIwub51qRx0WjgMo=": "4621453000000", - "sxf-owQnLGJOcoIZD9Gsn8bKpwm_nsyg26rV4nccxXg=": "384615000000", - "sxvpTQlit2TE9kuuwV-62KOJ6S09LYm0UHJKP3VFsYY=": "414989000000", - "sy7spEdbL1prZmBAhYvGwKnkylmGXHGcgBQEDb6vl2E=": "954279000000", - "syO2JoAwsRMK5mJPirt6U1dvcDuR6OPZsZNMS8hmuik=": "1173076000000", - "syWOvDseYNAfb2AUMq-OrKEtdSbEPjrNhe1XyBwdpIc=": "20656748000000", - "sz5AEZPNTXkaPkcjjaFdkXWKoknTHWt9jxgZ-hkiFkY=": "1295513000000", - "t-2Fo-qJq7ruhFu27X2UQ3WQFtuzdqB0mxm5PNpNhRY=": "416821000000", - "t-3F-8Y1M-kMFdt8Nn7EaOwdpC8ufDazxV8imu0vmyY=": "549999000000", - "t-Rh_TECfmPLwukxiMpJtNvHn78cBFVjowGGi-YpLg4=": "384615000000", - "t-V5VLNruig54nzqwnBwJidOThKnFny5DqftChi2ex0=": "448709000000", - "t-bGrV_CLjuiCZuDz7Cc1qXFEC67uI2kBRZXhqyNcLk=": "4166666000000", - "t-kccfbIHM1gWttIwm0_S2W0lh4lodQoL319EC_rl3g=": "2429760000000", - "t-tVLoW5dmUR-oS3AiyHhvy0NtBNK6Y9IpNv2pk4vBo=": "1666666000000", - "t02IZwqFGrKfF6kb5B_GOAiDvs9gaT4T6Bq7tf5OKdM=": "1155808000000", - "t02iGrrePJl3D6gIuHyYd42QiJE6O53CeEC5ZQa23eA=": "384615000000", - "t0AtjUMNkYyqUdDYnr8r1DYEegMtcpT7ZPDNCdnCiqw=": "580031000000", - "t0JSg3iRNxfEJbMptmcmSWB2ytbvpEKRIObjDsi_Lp8=": "385506000000", - "t0JhhX34QoRyJ0PQmsGhmhrRTRfU0boYVAGG7x8qefs=": "4706045000000", - "t1N_HdrGlJ--mUrmeQflIruyQ3TMLN0mF1OkDQkl7kM=": "2065023000000", - "t1peh3lCuXBBmeUKkoU80959JX2TUW1KwdpUyNLsfKM=": "2055429000000", - "t1wZIu7HvpuVO_6A2LnR7oAyeZNZjsgjER_4JZLJLQU=": "476900000000", - "t2Bj9x2ZP-z1NDHM7s6kOCXNubi8YaWXqdV9KX6n9LI=": "1326989000000", - "t2RzoMvBeb88uYnyqhf-oR1L5Abx49paMBQkauUrX7A=": "769220000000", - "t2bLWS1_6nqTrP2EmvNYbrlVDLKF4LQ2FuhDe5pfE80=": "454809000000", - "t2dITZgx4xRC0r6ZDuwQMI_1uvJuaEkcxOubTqfAtsw=": "2019163000000", - "t33YPmTYGZDkR-Pt2H_XHQ1DQulPuuMyflLnpoJ-iCg=": "1170401000000", - "t3UQ8LExF7NiFSVjT6Uek-_8yxg7s9EwwE5fCGp33q4=": "487145000000", - "t3XRQr2I6MRgcbppmo4fJHhXjMNUy3aYm8A1cWSJf_o=": "459927000000", - "t3sUu72PM_GiRVC7m6LGti15lGiTtqHF39nyIo9gXFM=": "412986000000", - "t43ZNT9G1BE9KZWiXGCVMNsgc6evm-xUWVcS7S0TA9M=": "422561000000", - "t49Imw5NET4Lo6TX4_5SOlIwUgpWijsZ5U0lS3qxJc4=": "760905000000", - "t4KEMb7fYiy9zIRGNla-qp5UmSbCnYKZ9sU0EIK99dQ=": "407808000000", - "t4iVptLIidRSAXusq3uXe8aGdJTiMfkqPMbmEIzZO8k=": "380342000000", - "t4y6kF-_bl8br5KfCF8J1Q6KS9lbTe6C8wDInUDbhTU=": "1539919000000", - "t59uS1fzDh3lO13mxUDb4XZdLFrD0ifGst3-ikhG9no=": "449342000000", - "t5dTuiU-bPXnVJYayUKMplspreD45NUlKOiUOtnW-BI=": "385505000000", - "t67H4PboWn2ClTLE_w9fxjGo_HSCKRay8nWJ25SHafM=": "833333000000", - "t6c2u05U3cMDTk_qe1xHpjexjsdDLllszR8CtuPKRts=": "447655000000", - "t6psLZ6quv_e6pOE-mRmGbxJR8P7YYZ4goFPpfzRMgA=": "382410000000", - "t8IlJ5YGRQf_L1SIQhqnXzsmnHhRSbv6PMwCU2y05SM=": "694498000000", - "t8kt7MGgSN8pXalXcrpXtFpwK0BJzeybags3ieIwnCk=": "448054000000", - "t9Be65DXNZsg0K7GSZFLPIyLbdjuR-wAZiwIkxj7ESI=": "389898000000", - "t9C3HK1G8idq7tq24uNzzQWePnQRgZN4c8xrxl4VxSY=": "4279139000000", - "t9DL6x4QVR6fwLWTqTGlWXbpgk5xzqCacXR5O0ahyIo=": "483147000000", - "t9I29EvRDVi0KQxk9aubm7AUtr_jAnqutLzuL5yC0HI=": "753807000000", - "t9QGYKbwY10Il2ujvaquEl3FE4z6pwKF1ny5w2X-fW8=": "405197000000", - "t9SyOnSnd9QHtw-oj3H701hLpVCps5CPCuZ8AsV7nws=": "384620000000", - "t9cqAAc1ovhrVoTUQoHHr8fBbhE1vdBXbQJeEyrqg4I=": "5000004000000", - "t9laqBZ0MczhAmS_q70Pczkn5LdApFwOWUGuT-wjpuw=": "3756941000000", - "tA-YzExiQFmjEZ8y3jufd9Y0igWBKe83CkHHWaq319g=": "1407087000000", - "tAOxMDwXPafl4ziiPIEQkORXB_Ou7ADkr8PrZAwShTo=": "1596707000000", - "tAXcadh1GceAfpH1uQpdQWFouGzhcQtX7J0XI-bgLpA=": "3830209000000", - "tAbJbuuEixH1rdjbu_XcnZtyGFbHFTmDEk4aHAcKyFc=": "769230000000", - "tAz2rQCNYufObZFhtR0IDDBH_6ulyg940TqBz8_Exzk=": "385509000000", - "tB4SdfQeCKEiKqpY_yAVdoAjzR10s6UkG2yd_oQtbp4=": "2080352000000", - "tBMKtclnpNtDvZ9aQFaYRWdvDtEbAVRK7nO10vzYnzY=": "1813007000000", - "tBNUdtI6GVKroRDDieTLSbI96jXQWQjmV5ANGPiSz9c=": "3153846000000", - "tBeadB2nA5nvZdYdHfNHQWRd17t9gsRa5LshOteYExI=": "460674000000", - "tBpd0NhJmLvv1Wm_v_wTuUIJVAeR0twPrQNR_CatDuw=": "3434710000000", - "tCH8EGjDZ-1jvU-0I-ZlFUBw54o_VTLSR75TSy0M3X4=": "838319000000", - "tCz66PousVV4VwNqH0hXIDXvC1T3YfOWQQuNLKZJidk=": "411085000000", - "tDEjWCR4AOvX9vIDVlOH-Ndk_CjphDN4CEBYvSxSggI=": "3755832000000", - "tDtgFGT7ukzgeiNlfhqXWYp1PByanrxLGIuJ55mpmj4=": "2083333000000", - "tE4knI-5Wmrs1YlumgR0czdRk3lZsncDjBKdWkv5HuU=": "2972578000000", - "tEFx2x5i66--pQmXW9SDTqtI1oFf8Xpd4qIUJA71fVE=": "600093000000", - "tETabr5D2o2drl4EbtjV6tk2EjupQhqKlBDzEVqBiy8=": "453157000000", - "tEqpvPCJD-4B9cLaUoeiJ6DTA2xdRaWtT_Dzn4uT6hY=": "769657000000", - "tEsGt9cLk74YHcYvfRXT61rhLNKYrIwKri-6q_RfTm4=": "393443000000", - "tF2nekmpYiz0jBx65sUmnjPNVKB1KOUpe2HmJyeebok=": "384615000000", - "tFDA8q8gPyj14Kk7MR1c6j15_Hc7-8tPHEs8ykziC7s=": "423076000000", - "tFO5TbgWSWLs_fRX0VLcaSfq-20yipVTMg8OYuai4xU=": "1033428000000", - "tFcLRoXabFei9mQDT74971CCRxChsKzRnHqttP7ow7M=": "1588569000000", - "tFrqv1w4BSQ4v41dznUyWZhr-hafEk9EYJyu0v_q7Sg=": "837715000000", - "tFsAD4KloOshR1yUHHH59o16tPqyZ-zCsJbvXMJKn5E=": "765331000000", - "tFsVZCYg5mhjnTlyCMpHbdLAAt12HvdeDOMMwPQIxkE=": "384615000000", - "tGBqCuBElR_aNq1xADnLLDQB2CVIG8KSv6zoEfRBeRM=": "1731970000000", - "tGHBOxfh3OXWD9QwnPy-uK_VdK3UcyIoZ76n4MlbO7o=": "400541000000", - "tH1fWmRn5rEjB0bm-B3VXVvetl6Xd2x4T0Lszk6hxfE=": "494865000000", - "tH8-fxMFNyaJE8Wm0CwQMIZGBoT-u-xK79bkEjiiRoQ=": "3855108000000", - "tHaNFWS07fkczltBwbQqoNJFFNMUVTR7sp5Hu2Chf1M=": "420807000000", - "tHpYSsGWAWWglSQkxbCC60Msn6CaZe-23qAK89B6Y8o=": "4166666000000", - "tI7vYFIO1VZAPKIkZLytzctizas4NMu6gMDu3vD6NG0=": "816256000000", - "tI8w_IOO6i-oQcPNkYXnA-p2ED6vQvSPL-oX3dnGNgU=": "1923474000000", - "tIFLz0ialFlHUOuFxRwIzKf4QwVTxp8_EwGMOo0rkVA=": "625107000000", - "tIYOEO8Z8zRku93fDQvKl0wkyL_P7m4WyKisi-Kqz9k=": "456531000000", - "tIzbpbGifnFlY3K7XgQTSS8c3zHmNd-5yFIgH9yNmSA=": "1156517000000", - "tJQtS06uzfG-j6V55ima18Oi2iPlNtm4OcW6KIshIOY=": "464564000000", - "tJUhIbatDjM6NnAZm7xIR7rUt3VoZusHkn753bs0Chc=": "384615000000", - "tJW27xDNwCHn9W9SFF3gd6E_JqmJcPB_WIYiHWyP-cg=": "384615000000", - "tJ_s69rwh1vk6UMFW8MwftUd3kw9xE2v2M6E-X_NSt8=": "465122000000", - "tJd-XTeSZHwwttJbhmNvPizsiVR1LUOAPyuMbOs8-lo=": "16340487000000", - "tJgxKg3Fw3m7-i4YM3SffA6uHwKO2bwnserKo4_h3wg=": "834320000000", - "tJwo7bKcTD0C3LI_vp56OvmerGQnQMBZkgS6HgiU0Y4=": "458982000000", - "tKZFcBDzV6Qxqy-cEzv_fDHBQ00w_0_k2Q14FnB3FRA=": "504026000000", - "tKhq295QIIjYBd9VSGnpLBs3D7HadpFGBU0FxupUOTk=": "919762000000", - "tKiX4AEIaT-gtWDCWK47euPIxkIplo13rsSCT0Auo4k=": "459121000000", - "tKqPOUuynQJqO5ClivwnJO9UmnIfbvqA-K76NBHsUT4=": "384615000000", - "tLSFxJzR8jxaScWQe_WZnNYmBv8YIfBufGRRAGy8FvU=": "384615000000", - "tLgNjo525GQ2ex_ZKm6pUow77a9aW86adNUBCEpDxx4=": "1923076000000", - "tM8MJi6paTZ6caXCXK8P2ZCRWNCxAaESAjINZSqobXs=": "1280769000000", - "tME0oQ_6UnnQJlW9Pz71i-ZQisSa6jLt8XX1DUbLqIM=": "1670225000000", - "tMQyyQjw4Uw5oY5OemCRIl1nJCKQqBBZC8ucCCHvGTk=": "478846000000", - "tMW-Qv9T8reMV4m_yuOj4DxgDIMSb-ZJVhFbDN4rQz4=": "5015511000000", - "tMyTMiMPd_bH6e1i1XV4AgoedNi9JlFsEWwEgKbJbg0=": "454545000000", - "tO9t-JhYAswtaXgsKe_AnNga2tBxjV8jIj7VMHzeKLc=": "452447000000", - "tOKXqNvTtE25LiWgRiyuXF8R_3x6AOCggzof7d0xpqs=": "769230000000", - "tP2tUkiBCs_gI-Nc_IVOc6O9-vsstWwU0BXRcK-5a5E=": "1154373000000", - "tPQcjeqUhXSmQPxmlCC2ubrWdyAnL3BRbk1Wh-hY5T8=": "1153846000000", - "tPm2nLGI0C_kNblxb-qHBv9OU79kcP59btIHYNlZZK0=": "417633000000", - "tPnc70cI5lKsChcZahjzbtifhHlATpBUhbBywAgTdi4=": "384685000000", - "tPndxc0omEnwdmEqpo20kC4q6FdCXwAEd_FetKzM2tI=": "384615000000", - "tQGV13Cl_I4DvjYCLXB2ChAxgmxOHTu2TSDTcHAUn-U=": "545454000000", - "tQMbyS32YgAhwvQ9wfpionGFD4OJGP2AsaOKoyxaqU8=": "751149000000", - "tQ_f77c1CKjto59lA4YycGO9DhaoJsckwIPRw5Phkys=": "1923720000000", - "tRH83t74zPZUEbXMZw7vxhcJyn2j6OMbc0EKuCgc-TQ=": "455600000000", - "tRINHaqjV1c2eT6yta9y8W8yCNKkIin0LJNNC4Di3hg=": "462834000000", - "tRZlHKPzWgfu5SAtZZioNfykUdfokiKp8FEaYJdCtj8=": "763268000000", - "tRf28vRqtKHPj0E3CCGnM-C7QoFpScS-kWfGRX3bx58=": "389707000000", - "tRjz9BH6G_OWeNJUaOVS9p8GURbXCpZSIlvV4E5UR18=": "384581000000", - "tS00om-RXpKTU3fUDeKlk4lrOUJB1IWMS76jI1ye6vw=": "4176307000000", - "tS3YMkw69_YFBxB8AEnCi553bna_pngOLNXnt9cTduQ=": "1610036000000", - "tSDbW34jqQG-28nQDqKIkGrDplSRhaUMSVr8SbOa3SU=": "461346000000", - "tSRzYNwngaODGQvjjdHwXbGCIuYVBvJvdv_MpdTaqLw=": "1927537000000", - "tSom1-7hCksICUYztzd4CW1FhdpRCxTAQVGIyB0Vdlc=": "393570000000", - "tT4FPOXyLkdWUwXrZ75CXpKIkYy5FEoiv2zOmNilir4=": "3286540000000", - "tTHll4vF6k_eczXGmwkj6WqZRCP2G15PZVPVI4omnks=": "565868000000", - "tTcrSmOo_C89lpuxZeljLRIDylMfRzDWS-9Un0B1lSk=": "2083113000000", - "tTrpv-8iwNbnpCAh6gxOrO05vNmCDCHMnLVSGTWCpdw=": "3855091000000", - "tU2A-74kJZg62_8bSRtQk__dJSkqWo2u_TgQrcLSJ9I=": "384615000000", - "tU3D6oETUCAHBW3EgqL_Vz-4g_2Zbcm-ekaPxPANWZc=": "1928334000000", - "tUj3gVBNk7Ts_5_Fdf2l6DAu97X4Ek4ZyWJyhbTkBkY=": "416666000000", - "tUjnt1mkXktX2L6plbvpDS-tY-LsHkaBNh8a7_GgVjA=": "780415000000", - "tUqVDN9slVI9WWj1bFkPCrgAJxUMuK9cLe_qchBO8xs=": "457772000000", - "tVEpbAqHxeameorP6AfvQVixPIpj7t6lmG9WMBHFXh4=": "1979159000000", - "tVNYvyz7vFdQ_dHxXRiGcTqjNo5nXt06J6A6S1uFLGs=": "474410000000", - "tVR7v42z6RQ5KheD0uKeTw1tj_Ju_BCIIbWLedLjeQA=": "6369354000000", - "tVzS8DC0yRpTKFc4LPxzFVWh3tvBaY39v3v60iXHvQ8=": "650269000000", - "tW1SZ5hQGqVRkT_j-YALBYVGhg0EhTs166dxOlasGnY=": "1999999000000", - "tW3Kkyw6h-SlVoE6_ykDjHpCsyt5CZSYouTIWPMTebU=": "774224000000", - "tXjjYMfct1NrOESrUXs9JfQObjjB8ztcDTXW2xw5Kbo=": "839813000000", - "tYLjem6Mpptgvdw6aVjTSU8qaqcOuww6ziDz2T6USnQ=": "394270000000", - "tYm5XjzUJzP59nC34D9Eok4b157ogjrNsNAvjO29OwI=": "384615000000", - "tYwZt3wxlWbv436ipTvWmgoeaahvwHeTaLt5eJUGKug=": "753018000000", - "tZCsgiMBB6-hG3GT9Raa-eav1GJ7quF74UQ-qiIbjJw=": "384987000000", - "tZGPYARAhEPG3eq414ax3b8uDkg-8XisF8-wZN2GhKk=": "3269230000000", - "tZe4m8byNwoxiJj80SF1pWRhiiBl6kwN1I7RthLzB78=": "421597000000", - "t_2nvCJTLN16m_WkjPLnzcwtH1qlC46hBKS3jHrfhns=": "961538000000", - "t_GU_tmzeN2fMKNikL-lge3i6N0nyZg0W02U9JTN5JI=": "1152721000000", - "t_SD577sSQTkgeLWbmKipzU7THUJfEYAuDsQ68r8ge0=": "411085000000", - "t_oxw78KdH3qxCIYhx0TSsVHR3xJjuEUv2yjp2mV-sY=": "411085000000", - "t_tCUCvUgxTBkgKcByAnOvaQLG_UcJLeHRxCwOi0_XI=": "1934863000000", - "ta9D_Wo6AaRzqFyEp_ybI9KRw60VBVq1-kaCAojPp-o=": "3269230000000", - "tar7xdNC8GbyvqegJ-yAZ5wfNW_DKl-2Dd255Hld-Kk=": "3147817000000", - "tb200HdDFbKCJKUc1AUkoi1T08G2EMBJOzxY81XaGWI=": "458877000000", - "tbJRgXFBrzOWLHjkh8CccUyAQYFMa2D3JEn1cUBmXoU=": "1879350000000", - "tbSigNcvM0wwa7Ha74l-ygfipI5Kx3_wBg2XIxnxSQ0=": "769301000000", - "tbZPLkm57GIHxFAM5KA-QwCXf1US8wLmjcP-JUd0sK0=": "1156522000000", - "tc8wJvM24qkJoZTp2G3O9GvsgiS16lj6lJ1kUHdDVvE=": "462050000000", - "tc8zBSdcFv_66-aFawiEG6bGgGeU4hfkMj1RSm7DbmM=": "384615000000", - "tcCKKimLBKfQrjXY1_XW29FchMRn_a3PJAbmFlIyCZI=": "450697000000", - "tctkmCzZiEbCaYLUHXHwNb_ThEENZhrO0ihN0MYFlkc=": "4586347000000", - "tdaWDeXHqW1DWGeKUE01tqtstOXxwitqkY2NraV6JTw=": "384615000000", - "tdmzFOW4RxRCxfdfgnLrkedVLWSZoNtvqloGDZ4MJfU=": "385506000000", - "te-QsJHog6_lbYaCeZitTQhyxh7Ps4YmxSm7v--HmWk=": "417633000000", - "te7Owco_qtw5va_X7M1biRrRfO1wy-Ck2mziuW4toJo=": "384971000000", - "teak5i_IKklOSkJzOMTMoa_mpajYd6hR_ncGL1EgBi8=": "1053419000000", - "tezAKSKE3-MqYsRhXs-bZY5HTvx8uDz5cJFWRsDOkI8=": "415629000000", - "tf2NJuZs6ga3oBH1LgX6IwNrBOO0md1zQ-fhmIqgJzE=": "384615000000", - "tf2iO4FjTNmAtDp2HFhVXQaRppvNG_2qAGQYhLelBLU=": "384458000000", - "tfu-zg9Hkk4g9xRmnQ5JuR2iH0zuATmqWrHB_UJ1o-o=": "13076909000000", - "tfxge1HbpJXV6ykWzJij61KeibZNMnslIhQtG1ViQyY=": "463071000000", - "tgJ2RVgk7xIabzlqXcdgz4n2ZkE63NCn_lQJaEgP-KU=": "2692307000000", - "tgWi4I0E59zCfofYQzRnhIx2csr3SeGb2PiH4_dCrRc=": "416673000000", - "tgXX7Wl0cEjkeASlknENOMS02NsnmF-GCBNLGIiyHVs=": "391019000000", - "tgbrYlUKWdU-ZsUpoACU_PGCxr5ibc88_C38DqME7-A=": "377783000000", - "tgkzQUH1FZrZb5IfaeXKp-lpxoCgG6-Yw_6vSn1pTI8=": "574106000000", - "tgoKaBRdoZ9cqcJUvph-wOrjEvRBzWoj3oWxUW6ypIY=": "454545000000", - "tgqwR7f5lxayIoQXXZPIPizGQQpOixobtWttUt_h5Vw=": "1388517000000", - "tgxiJIHXzhaqNXNGyQrkE4bUqa8Dx09FGW2F59P3dME=": "453157000000", - "th8z8obl0EjEJi1o5WNnbUHbWIKxldn_jAzPlJIHVwc=": "1363636000000", - "thGEwr3hHzoE5Y6ouIuZY2fjDEu6wBIDs_PKW5x7R_Q=": "453157000000", - "thNm4om9ZpzUb3Q4eYgdAHjLnr8jHxZL9BZ_MLoXQ6w=": "624999000000", - "thUJvJQ-AGj12QyHpBM-T5QAJojDDRoPYd7UelvNU98=": "1923076000000", - "thWSh1wftircClwOjgDN8IkkOfMyLdZDZTY_ranAYBg=": "422561000000", - "thafLXWeBxlCYcN3hITBL-lbWXIrgVmTMEgcXJNfTfI=": "394351000000", - "thnlIxwjLpYZe5t6kyBeu3cmg5NMckbxL5hWBh4VEs0=": "1260181000000", - "tiGewftLaMciI1rI4PhF-uoajuy_6ZDI5YmNXK59QEk=": "911191000000", - "tiX3vA2T62XY7BBojcDVJBTvTVdSbulMkuZbjp6e6mA=": "446615000000", - "tj5zvGwwD2Kp100BMkhF5-Ym3GYJVIveL8otI8tZqgg=": "385505000000", - "tjL8u-f0I5J90yfbPOGZLwk5lvsEVcXmnRvWmp3HnFU=": "384615000000", - "tjRk50ar1Z8D7Cu2Txo5jnEjI9dKrH8JKXIY1mHNAIo=": "939231000000", - "tjiN3DY8MAvXqN2WGB0HHiKrh3HaijIR2__TX4CnXmo=": "473265000000", - "tjuPYYocikq17QJckkq7jv6e7fsdI9PyFF_GF8xz1YY=": "482456000000", - "tkWYK4Ii4BLrOLkPUNFV3pwDx4aLPFfY5yMF5ip9Mr4=": "458634000000", - "tkXXevD6YLkM5DmJEhYjS0lTuUtKWcPDpIk9bdX4JI8=": "694030000000", - "tkYgAxPVNfIBJx0bhAEEIlb9xoAABLj9pHcJi6L8Xxk=": "411085000000", - "tlSSKdQ7dnLAmdTHmKd-slq--GXsjPyw-BAa_yq4-aQ=": "825733000000", - "tmCIy3cjB-Ft_7Z04dKWU7ZtytQ7AtC3zLFr52c4pdQ=": "7497594000000", - "tmM8KarNsRL6GZR9440Ba7CjiZSGsRAUWSX5N-71S18=": "383253000000", - "tmNn09X33nOvKRQkPKYk4NVaKRPMv_1mLrc1UPT98AQ=": "463390000000", - "tmf1fX4rpGOy6ZMBFDUge5zV93dYlgxLRiZZv27EbjU=": "2916658000000", - "tmn0Ml4h-yOz60BzCZg9mhniq_ouFVIdBsKcvU_A0Os=": "1666666000000", - "tmpI5xt1ej1aJuL42p3E8jnJ2HJZJEU9oeWb2tVDyp0=": "2041005000000", - "tnHmdhWND9LAlAGOK3zbKSwo_DOzGbsPAlLeC32DlGw=": "499178000000", - "tnMDFqViDzJ7hOksEnTv98rT2rPS3xNpD5d2dqgA31M=": "393446000000", - "tnZtT9PvWGoU0Jp5eWi7fVIHPrIUEQnwDEqFoHFFl38=": "470350000000", - "tnmcWmaRWBMX-JDh8vn8H4IurmqXEOz8_1P028sbEFg=": "455931000000", - "tnreBL9agVLI78gSWKGbhLb5mxOXpsb1xh-V0nYveH8=": "384615000000", - "toY_9IxOHLpwM8grnY8K8J6EwE597WtMambv0VLqLfQ=": "3926771000000", - "tofBgP-5XgGpv4ZZAHZIKmEnQVosDj7lIit2yGan-kM=": "464004000000", - "tooDz9aPOfOjxsbcDzfT-jbBD9VFZHUGs909Buz_rl4=": "391798000000", - "tpSr8gPlft4rDFsNJc09AAwMA34hQKrivoY5U4WjOnQ=": "384021000000", - "tpVZ9kCNEvpe4gS-rh42C9GWC-oBOQ75ZY48XceOGqE=": "3077798000000", - "tq8qKU4yu-mOP8-WiiWcCxh_AejCfGt_qn0_0Z8MNZE=": "453712000000", - "tqLOMOyeE2P_xamKhyrEM3k11sPJD4y_ihy2DyCABHI=": "736579000000", - "tqVcAuR25-aqa-gkVxOnnSwsFJRZI5m-JMMd4ikFfdo=": "385508000000", - "tqk4ZrpbsVEvjoSxMlp1m35Yn_T6DHH9tvvD5Gjr3n8=": "946663000000", - "tqoT-GQKjcoCY5_KM0OM9OFjvjS7PpDEoO_OtQbdCyE=": "826798000000", - "tqy_x4U0OlJ_ZEbZMygmawHbIdsW6ehAz655pBd95RQ=": "384615000000", - "tr5N7HluYhXAGEM7W9gWRZoazUj71B4mjs0MdcJKNN4=": "2615479000000", - "trWmFnrMz_FXceilra0bi2LqtBtzXY3i0yhZ9AxCIOM=": "1666666000000", - "trcJp7lUbGYHT3E6pjlmydQYaFiCnkOX2I_ogrsTSJw=": "2275476000000", - "trdNwgy3syk2eMp_Fney3qq2om-BtZ1OSfEwBVNnED4=": "454485000000", - "trtoIGh3owIUU2VXiEHPNOMJNnsKMQocZHpnv6KPhq0=": "384615000000", - "tsAOH3GTsz74BT4J-HZD9piyJ2H8rky8UMzZDnDfFMo=": "469837000000", - "tsE2wHpSg0KmA5pF_EwYhgC4B5f1XW4ZIy7XLuEiZ5w=": "1047200000000", - "tsNtblO_875P2nYX5fTyQtVNd1Kk-hrkBDB6MYWVGbA=": "424673000000", - "tsZJ28XbRQTcVWvCEBPgWJmxrL5bDUEEs5H9guV-MMg=": "454137000000", - "tso-3uMm_f6pQ3myCSYEQ2Ikua_3LG8HUnHhg91C0iY=": "384615000000", - "tsqgDoGiu8hETbF8Mo0TfBa3srwamMRk67REJFkgI8g=": "416666000000", - "ttEyMTKV2U34yiGPF5nDNn_HkIv7l12wBbomfeYhGME=": "447986000000", - "ttQupvLn7HxHKFEy0K1vjFhJ98nsgc881IXRK4qhTBg=": "455141000000", - "ttShAZ8z3fYC4iBjgNkmtf029cYrMIalhL1cdNAPQ_M=": "1673017000000", - "ttWpGCVWMeDElp3mutMAShfEu0qf7TDZop_Vf-UOXi0=": "4423077000000", - "ttbli94UGIUHVT4EkU9FWAtV3FFSt6TPpcYoQdTVelg=": "1364610000000", - "tteozbIjEKWkmUx3sQd7CTYJzl9DpjyLwUdutohc4U4=": "384615000000", - "tthENwk-7bwcsm1PqDxCc6GbIQ124ISn8PVKUHuAsR8=": "778301000000", - "ttnv_lt2VsWmMCY-MXaa1EkMhTA1mH9FHStRaa7O9w0=": "1249989000000", - "ttw2hHZDwO3garzNcnNNF0nd8BM87GBuXpY-h42QX90=": "445981000000", - "tuPi-6ngTAAG9DKgrb61wYUkSeJxL5_cPOIpt1p4D4U=": "1381273000000", - "tueBIrSuWTeWmbSH-cSOUQUI6a1DCWj0iuugW3JPWRI=": "908983000000", - "tuiAIIP4RIkigFWmzvd56d0KlGE4cSUcSqxv46Gwclw=": "534999000000", - "tvYKnfRIDZrkt9--thOcF5VnpJ6-8TWdoFZshSWcono=": "1135024000000", - "tvcp_ZTScUMapB2XNZ9ecJZmOxF7GLtx7x3dZBWu1bE=": "1144901000000", - "tvjufxW-yLRfKDJThUd2CmhFQGbgWq9zAbAFlOCfjvM=": "4673517000000", - "tvnTHpMDA35JLsuTk5ds0ah-FOW3EVrRqzoD2H_-v_M=": "1152797000000", - "twDYEOUZcKlB_PrSN7LY5OH68_smgaZDYLWWWjrbdYM=": "1927537000000", - "twfDA1CLhOD7z0Q39ueLvSFKxpEhXnVqW2ai4nYsglg=": "7809166000000", - "tx52pXBD7fFDfa_uCzo5SudbPeCQnzhJ1FQPhenV04E=": "457611000000", - "txEt5q_XIx1G0-w2fYbIeXkJ69qYzaBITPra5wGvhwk=": "457043000000", - "txRQns5qNgPMdoXzBydIMscdkUqqMA8efR4wIq3TYjU=": "831259000000", - "tzSRsoSdnuKv-71kMyCSEpZXHs7A7mEcb0ve_GdOsn4=": "1533218000000", - "tzwWWO_40qHbB-81r8MNQUaZs-JZbPBHdhLFIRXH9N0=": "376747000000", - "tzz7uR4sPUZrpZohLkmXccGlacAh-xTcE6omKKbq9xQ=": "454494000000", - "u-Caf-D9wEKwvN6nKKPMc1XgGxHMEEUvBbMZJ4bJcZc=": "384615000000", - "u0-ukJ_swyBQcdlt_9qDTk7StScLrBB9f4fEQRwEk2w=": "2009477000000", - "u0JUQTH7jm5f13W7_QoYDj_aWlyHLtl2ekmht4XBCno=": "385510000000", - "u0STy-9-LOKcqCShFwLREMz0tRneJ0ZfvBvm5FOK9jo=": "384917000000", - "u0bZ8mue9G19sh9PhnoIwDGrD3jZW1i8Pt958g2Suzc=": "465700000000", - "u0btALD87ql2hiolhxPwUDcP7StWBBVOKphDAbbElyY=": "925501000000", - "u0cEh1n__X-vYOQ4r6DVjgbhlB1JhYfeBmWEG1-MLW4=": "499999000000", - "u1kLn2lUKCixMGzKZz2_gnGK6uHyZUkbiyVdtaFA4JA=": "7692307000000", - "u1uwqRBietyHcE0xMU1JJCGtJCY1g9F0LdYcyf5LvxU=": "1155246000000", - "u2HYQUJxE7cUQVmYEj_rfEcdege1OTOyDT7uLRDAM9o=": "384615000000", - "u2Sqjz_t_qmQLBaApLka_hZx54MLKsbCz63c3e1PhT4=": "1252892000000", - "u2W37_ypwHYUAlXAafmK4L4t9Cqaed7eCy_veRgX240=": "505255000000", - "u2gJ1rf-BS3W1wRcGSWoc3SVBl78HL9NojTbmR23bm0=": "384615000000", - "u2qVizENdgXO6S15YCTYNBAPqPqxhc-dzwDtHsfY7Vc=": "423669000000", - "u3-lGz4AYul1QJYW-D5ErgqEOa0mYOTO-JN-HMilB2s=": "384615000000", - "u360SbY6PWkZyad8hMh5uzmYOfn5Sy9RD6KahgQIAOY=": "1252908000000", - "u3WUg3jhD9IROiEYwrysTTf6f51yEiOFFC7gMxE60DU=": "1153846000000", - "u3jzU5VhQogloO03ho4_DWWxsjwgf5yICwTEv_6AkKA=": "4349302000000", - "u4HhJNYLerThiCM2zSZuRe6Pc-fVqJa0gtn6bdVTeIE=": "394347000000", - "u4mGBrNJKVXJ9XV1X_PlI7CRiWiRmPAXEr3pD0v1f64=": "385134000000", - "u56v4pXibTeCM_TrQdS-EdGpweEzCguDmW1Ly9zpp5A=": "4084824000000", - "u5FbAJmxEVryIvJEkgc-N7AMbsFPkZkfj_Nbq8YGXgo=": "385506000000", - "u5FlIVyXcyYynTeTB-ciaFKLgx3J2TR4JaWtLC8D0Bs=": "769652000000", - "u5OhQqwLwj4oQ7QRXGJbBcS2X-h7bZ-BBuGbfj8Ds1Q=": "3845693000000", - "u5P5gDF2UeF4V4YKlCLbj6y8uou50WdZeAZQ0-xvc4c=": "417630000000", - "u5Pj_0BzNh5g-m4xYRSdaWMBWvmmYzHvzO9SAJx0dxU=": "1352005000000", - "u5U-5MzuCwOOy7k49YwQ2EicJmguQvohaiAN04XPEZs=": "458356000000", - "u5a7_hC5Fgd7bBa-B12KLHtqeSwmWd9O_XEpEBJBADs=": "967404000000", - "u5o8sA1kbGhB9G0bHQ2s7mdVC_zPAuZMHYMIfeJ1_ks=": "2307692000000", - "u5qQFxkj69oeLyjGmKKjHczFx5P4lxmqTMWMVkCGmeo=": "2115384000000", - "u5ySHPWeSeRMoyYrY7XcBNz9aP-0Z78qTd1MxgWkyoo=": "769230000000", - "u6KtD3eZDIY8CuzaWYsRf0RVh238j8bmc9MNgobpD4o=": "8213696000000", - "u6Zvw8hhFpdr_rQGLATTSYK-SmQw0SLsbLPeQmX8w9c=": "398808000000", - "u6u_nGgBDk45MbLY5Uybo6pLlXV0Ra4AvUeRooc0Jqk=": "812736000000", - "u74L_QTu7-1iqHD7x0bPKYrK1ai-OcwYX2pJAXh29jY=": "1153846000000", - "u7WoclanxRaTEUOPoK4ksbnKfo7U-Ze9ZxpvQmaI2v8=": "768695000000", - "u860_C4kmWRf5fI1F0rxNe7wE3c-xGPbMimyvRgsDww=": "473064000000", - "u8ImuUsQol03bDs2q2JXz2Cc47dcTi7IIz1-e1i7-Fo=": "16258427000000", - "u8ca7bcpO8y9mn0ZvazaLkUjaRliNYqCc0Ae-LMMO-g=": "572713000000", - "u91lWrkZ3uNpwpBLhRapYir6OIKSnxjY9vPALqFjMTQ=": "1538461000000", - "u988DjmQTK02MO8cRoAHkGbY-ruQYNy7jDDF0gVjgFo=": "452989000000", - "u9BQn9bLCvNT6aNrOshz52BvoSTJhRsiP1k40a0pyrY=": "413520000000", - "u9szVgNRpbbLIB8Itx0qyVq3ka_NdhjpZEZ8t-FdvDg=": "416666000000", - "uA-WShqRpF2hJ4MaLo4b4771ZhVBWCWfXAjpWZpoYUM=": "3750742000000", - "uAD7QvOhKruZp9nWXINf4XHMLAHc72lFNzJVChG5tXQ=": "470730000000", - "uAOupYTBopp_bVBGwsoDAyCiVcNpgFlQYSCBokJwz0I=": "459394000000", - "uAzNSBTDDmGOEpidLWONf0Xk9GQGemD8p8d1s4I3x-Q=": "464757000000", - "uB-p3PWg1Ptb8GfpCL4JC77mWo5i-fTbNtnh2q4iw10=": "1380996000000", - "uB31dXTnt1nhKQRH4yH1F0WRXTwqDUNSFdV1jlgkmjE=": "416666000000", - "uBK-cgU_DUFLuRGDHVLeD1KTZezzkNkEOU49J1bntb4=": "767923000000", - "uBNWPukr_cbohtwEhOHiMJlh3mBlez3vHa3xaS9QDYI=": "388361000000", - "uB_wFw53Qk05O1NgMrJZQu_PHTMLnW0XzdeQL4GT9Dk=": "408041000000", - "uC-GPK0OjZg7VdrznRUwKkjTaU2OfxFj8GEUgn1CjsA=": "381805000000", - "uCJ6fIpgdILBDdcFa2iVaUbY-IR7YHSvXLaPRacQafk=": "763268000000", - "uCuF_Y1vpJxVd-4_qhaktkyAyZZX-at9LXVW3_Fe9es=": "453599000000", - "uCzz6LIk98OfYmPOqhz10HUegk9GIXzabAqNEDEACDs=": "449266000000", - "uD03PwV6OORosD0csyNF8cFCXNOTMWo-ogUeeqACirI=": "673076000000", - "uDNspK-oSBnLly5QCACWdtD1OnRpguccBwXzvb4z2xg=": "1233257000000", - "uDRmvS1XXp8I4Y8ZW3foDA32ynBHqCsJdKwr9vhOAf8=": "384697000000", - "uDSEVK4R-x1alwu41xuUK1fSRox7G3Hdt_hu8bNjEyQ=": "1249999000000", - "uDkHNQNdE7zhUmaM2jNd1HxL5Zu0elL54fhQ0ym1tYs=": "4259727000000", - "uEDkFpLLaCCwZe7dOoTqcpc1Z1f5EcRBheyaCvGATY4=": "19285060000000", - "uEOZJPOpQRQka3WJfHti8pwRjwi7maVqlZ9G1QtQOF0=": "446606000000", - "uElJMM3huf2O_q1BquAwcbpGXC2ekpK_1SMjow3xhc0=": "384615000000", - "uEsjuocemP2vseiIDsx4tJ466Yh37MJL9Si-qs6O3rw=": "535979000000", - "uFAoYj3MeA5BGGrXnQOhkMnVjVOhNIm36YXGXpQ_cIQ=": "378257000000", - "uFJddm906q2_HkxE4iZGZT0Z1cfbpt5efasCKnu01aE=": "636269000000", - "uFiyrqTagtLMuf8sOhkbfyV0fdBk-jvoMfYUTRsVkR8=": "806633000000", - "uFtPIhwOLFJwR-tSM3ZukIYOwp3n_Ffy8d4HLV3dp_Q=": "1252898000000", - "uG6cL9ue5XRdBYTxpCzR0vtLaN5FBv3E1suymlbzLeU=": "1252909000000", - "uGINGwD3YISbuq53pLHpev7O48iL5Knqm-0j-zHJJwA=": "830439000000", - "uGya-BH6ltOLgeeZMWbuQ2LPvZ10Fgf3WLM3aPvsh40=": "499999000000", - "uHGTHiDBCmsAaRZR8r3WY9oTYfzWVaCoE8PZ1q1IuZY=": "390053000000", - "uHzQUy1YxBbEiRelYyILEOzxfkY2EdkfKThWj4Uhaa4=": "469809000000", - "uI2rRC-12kjAz7sbn5rPDG4YA3lFvCCkfX_u5WEpBNI=": "903970000000", - "uI2zlRgLuwS9tDm32K8Y6Qy33LbOOgaZdT18INhLIEI=": "385505000000", - "uJJMSoCQEJa_R-aoFMaPZrDSd8zfbpRDqnozp8xAle8=": "336883000000", - "uK5BpiHVvGEIp6okbIH4idznrZEJhXU5nWjzoqkKuLk=": "470493000000", - "uKME42N1JWg2MHntr2Z8RmxXGoxpMcC6K6VnOS7EuTk=": "519249000000", - "uKW9v0UuRrJQHKtpGhllfDU2LjtRjqla9qKM3xG09k4=": "396485000000", - "uKZXSJvx139fJXnfCl8ZNm1sK24vcCqJMcDQboIXLek=": "634303000000", - "uKxPmWGkt4WwmwTsU5jvINrb9WhCQo0d46bH1JX6PnE=": "3306869000000", - "uKzPiCb5zCHLDR2nZ815fx0gTYiNMWSbq1X2u-eppA8=": "393191000000", - "uL5HKS5W-L2OyVTBdkFq_WSv_o8GDn2LQWcqKX0fjK4=": "384296000000", - "uLJXd6VLEFDe2MHry-wpd0NHF3mcH6bfhHWEK3kR4e8=": "1346185000000", - "uLS_fhuc93nN-v7NJlNMem2fKOWp39haqe5Wm3eUGfg=": "416666000000", - "uLXHbifovu6XXpF7hrRzPW7sI6LZo6fUxLiv6AQQ9js=": "454486000000", - "uLnxMYsyEeVff41_LavIjfeNPcyLexFPz2Nfw1Vj_ws=": "384615000000", - "uMHJl4Q1Wp0iBKh_i-zCw1D52F_HLCFW4shY-gz5Tmc=": "460987000000", - "uMU9MpbbVEc03n-rWOztA846yWKTHmv-O26TCSPIkbw=": "472905000000", - "uMbv85ziq9ghgSriwW8cdv_6tLtokaCPR66OepFcCgM=": "385509000000", - "uNBJylxA3ALRnVdE8VXdUySdOgeaU3knZ-Z-LfmTbhU=": "384066000000", - "uNLp_NyTEgFlA4qxBDg-2Sy5jUy6MjIY_rRepKS-Apo=": "1241607000000", - "uOFYkpFGIcEfgZLjpe2f31D8fkwKDErSMG3caJ3N5tg=": "411944000000", - "uOgxa2bFVUXHEOBIiQ2pR0JAeKkYxvhT7w7v_xvFOEc=": "450789000000", - "uPhI0wkP10QMmj15XpP68BaH_pmHIpsRcTX3-vI-OSI=": "384615000000", - "uPwYBfOS0jv-PY518j-LNMFwg6WQa37kvzRgtvxJFeY=": "458722000000", - "uQ-IbXSsBQf3j6RjjL2wu1AZWoZaG-QT0C9ZIRKb4t4=": "1156518000000", - "uQ1Rq0ow2c9z7LljLEKuH9aEv3-tFFqieXMOkvyftL8=": "1666692000000", - "uQ3emwq0Ehbgs1MO1TZbO_nKwboVunr18xMghKvx4OE=": "699569000000", - "uQiH1DaZRcUpxgH_YaaU5zTeNSg_pvoLkmELB3tZMiE=": "414951000000", - "uR4GXKRqzV21OmyGWgFSwNNOuzlMAPC-b9QleDtsrXA=": "383760000000", - "uRF2aCkrfLwl8etRLO4Xj2voUjGBvcscXvXuz8xO-jo=": "11356472000000", - "uRTDbxoXUqJ9ZkSOq0GR0TxRuXMwvwNkBWg2RuXPsuI=": "472515000000", - "uR_Ouwj7c7tyIjuvyLcRNW5vvy-af-KgUR81GojHUYE=": "444560000000", - "uRg231DtzhQQqGMhlNhSrnZZZzZ2E3CVCKJ4zu5-TfE=": "420514000000", - "uRkyr0-XqcSMVabc4pL42jrsZhWmzvYiZf-UF1GT2-8=": "385505000000", - "uSHG59YeEqpU29zKQ0u2omugEJSx40dr3MH_AkryFyY=": "381836000000", - "uScYeiBidjDTO5Mwms7OCn5NBmjezXkUjCXFxbEADhU=": "1841763000000", - "uSoWQ-XgwvJlYrWCLhXDgM4JwJeyfrNPfwwrwuo-Bd0=": "576923000000", - "uSs2sWE8yJJqzpUGsiyGgUUSTXYLwnAdsUoi58TcK6U=": "3749999000000", - "uSswHa7IDrehX-zV5LJq5urjkboN8gpabeJbMNyXq8Q=": "455327000000", - "uT60S7nroW0qoUKoQvmyTvjLeBkiRuXTi_83XkUWGZE=": "384070000000", - "uTL7ZdjFawgyV9LHJFE-aPC1U79tvwYcOPR9aLF2yPY=": "392996000000", - "uTnx0XxY4bIeLbWrrFO1ZTI5weGBPDJDotnyGDXsneo=": "391550000000", - "uUn7QIw29ABQ3qtVmTRi0mkQ-DQXH-STufPgzwnIPcQ=": "416679000000", - "uV56adJrDCEjyfcX40RoyNJVIpV43BZNMs3tNxadpiw=": "384615000000", - "uVb45WlYKXDqpVE3jtWR630nHP-qnaNL6_81-g3wLgk=": "6518282000000", - "uVwMsCxstuvRBpTG2RK67bo03kPLiE63DE6RdcwsKAQ=": "386369000000", - "uW5VMAr01En3VT0_CUP2JT7DmSvvy4tyXhBd7Bf7mvU=": "383030000000", - "uWplQ36wnVm6FhpNjqYnE7U14Iutv4R-qvg7SWX66Wk=": "3808272000000", - "uWxuAaPi4QevAzx7e47ue1-5wA0gpwDtsBh6MOu5iZY=": "384615000000", - "uX2bRjCQnfmHb8ILeEfJ_HUNe31GR_wdM24P0034zGg=": "470198000000", - "uXTpCl-PNoi_UX325Hf0L9Uo7jxtRqnpS58NKXjoxPk=": "416666000000", - "uXdannK96wsnBMoY7K3daq8MMasg9-N1qi3EZj_Ke8c=": "457896000000", - "uYHDXwE4vvyau1tW7BVnk2zLbwYy2eCoKxJZtTyg6w0=": "2407430000000", - "uYKgYwl4gI3b3f0FZnLlqwXZ0paBisajR5h7pA-6LeQ=": "6054573000000", - "uYr-ovhQWVOePH6MmLE1ybyDAk9X12_Xc3ZNeUKvgdw=": "376833000000", - "uZ4W18jaFZkbvjH83ZvCeWUG9EnUJmPy-PyBrDVDv5U=": "3076923000000", - "uZBcbyNmNZmlrv1yvWQhwjK7zEfg7TYDBEXV2f38iGQ=": "22629879000000", - "uZEdY7QbrukXZPwhBme32GhdBoq0ncZEDTya1uc-f2A=": "465642000000", - "uZKoqkSlXsrcSkiAV_LUZ2MtzAxQAxF2DnrTS2tuwTg=": "385219000000", - "u__D97IoSuapdqUXUtKZlecekAZIsvfczfYKA7nFN_g=": "515384000000", - "u_xrtduWo2BB-UcYGq4jkEKHeO_x7qAw9-FaGZFamGc=": "4176295000000", - "uaXRfuS4hhekDzVISbebs8HHePLZbUev1BJXdVhwytE=": "1513350000000", - "ub7RVxXX5JgTFf_9UQoMoRHr7tm-elfu3sUubn7VJCM=": "445280000000", - "ub9qWeE6vYkhIgPnRJfHvFq0SsqS2afiP9tPwJPDrp8=": "410048000000", - "ubZEuwibyhb3z2-ceqXWkadhiFF4wbB93Ul4KKOAOe4=": "450369000000", - "ubiyqt6GnXM9aSVK-h0BFzjAUwp0013C_mLv1Ap0sEs=": "3714283000000", - "ublFok_CBJ6Za8X7vf4DDueM-aZWGsBhA3wQ7K3thgA=": "392939000000", - "ucJy2Razdk04H4ql7pk_4vnlrRkJfe0nI74g3bGonKo=": "839770000000", - "ucOY5l7LuolidjvnCyj3zTp738sNHeYLNnCUSPlHQEw=": "384446000000", - "ucOtnrT14WO2pU2Om4Fnvxf19bUvhhS2Sl5rUja3hJc=": "13620024000000", - "ucPDfZKf4DlbQ-SN4WS-40VFA9SpCQ2kR0qT-A4Oqbo=": "354711000000", - "udO33KOdDAWyM8wEAdhU2Vxxgp9zPnvcZA7kMM1ApCA=": "384040000000", - "udTepGrbAGwVwVB4_7rUKqgBnMuHwN0CI6Ple8ujiKw=": "833347000000", - "uexZ-9aic1cRDNcymqcI8WZzgfvcpbdmodhLX3XQY7Y=": "384615000000", - "uf6dAA2frj7p-CkQymp9fpquYEL7Esw85iW-ugVsQLA=": "576923000000", - "ufKQZuO72LbW1uozFR8VewZJJK09Eyafu2Po1oQ5_DM=": "379414000000", - "ufOjx6GdP3t3lRGiCt1CwO7JdPH8TttM4ojPwrj_LOo=": "377410000000", - "ufe_QHIUYTfaJ724fTY1wcajvSdxStDsnky48rtSo3I=": "417634000000", - "ufg7GZYGtdkgFtGBFeGgU_LjFb1aIi4pV3sdcsXhMEQ=": "464564000000", - "ufwHRT0QFyfLZWvjJmoPi_PClgKexTgARZCKMXeUK-A=": "458174000000", - "ug7Jps7TJz6pHR9IOAPkvo5v0zEpj-a_3GZLUcIO7sY=": "449253000000", - "ugPALjf8sGGnFJ5GX8wSKb-QUGRfW2hg_EKZTP7BrWM=": "1156522000000", - "ugrIPJAXnT7aE2-9Sv9wGqgHzMSNledYUdbsP82WVF8=": "769230000000", - "uhCBqX9SIrqjwhwe-zGwRJ2APxt90bhgLfZmlLLGk2c=": "910115000000", - "uhcJQv38aK2MhBQLJTwyQcJ1giv5HEqH1HvjgWHPlzA=": "787448000000", - "uheY7nuY3AeCasR_05qJD3oBNQWno4VNZypZxy7Ee3o=": "1645346000000", - "uhov4CLU-Kd6dDM0LTfnMkS4XA-Nd4iNzL7v8b1DaxQ=": "441666000000", - "uhpz4Dc-Sphcaywql0gxeSA4BiKGb4y9Fkhm8a-xV6E=": "1730769000000", - "ui1lt2c3nwRA-Z3lSqmhKGRYzINocgSe46pLlFZQ6Gg=": "659188000000", - "ui55jlsHyFh9MsEl62UYMoCdl4X_3NmEvORuHpBkqJ4=": "3338945000000", - "uiEULbLaiqtqvYeCZMD9357B8S_zz3GjAF3Be8uO2wQ=": "576923000000", - "uiPPg2u1ztJ-8ZLguDK4meK1KgDQ2kjWHjwdjRcOpjc=": "384570000000", - "uiR6NmqFpPSRQLkT0_CBWC_e736kwHtajhgoAi-2qFc=": "16249119000000", - "uiTPXt4__Tn308pj-9F5t0aiV6lzhhOqQppr2AwwFzo=": "1167539000000", - "uilPs_OJZWMyO18C4HlX4kVMsiWxnjcVVDl8lbnC1K0=": "384615000000", - "ujAXHbBr7RJ3K--5oOjkdFM4hd9Nh_mUMxhCFluvpDA=": "413426000000", - "ujLCHMnnLrKbNfW_qu-3kMg3LDTrD-zUnJRyVfNg26M=": "422196000000", - "ujQaFDnZ2A__rNdhTj2cjPY7krOs5TLlrhseqnMh9Ro=": "500006000000", - "uk4y6STxmmJVpg65-Q7hHgP4JbCT_GtkkjGt_cThkaE=": "1840889000000", - "ukgtFiykaL9o88XnwTIi6dhmAKwtUokvR0tb1hiWHEg=": "3782064000000", - "ul24CtfqE6n5N8Q6lr6uoKGaJaAkLcUx7t-nlhX6eUk=": "491921000000", - "ul3itLKsXBNPxb02erPYLYOPAWNEHlJdUVrluOIOZLM=": "378460000000", - "um17rGHVnoqFbCRDnvdVUEcDQhdaHL1nP7KT2MUw4G0=": "2344906000000", - "umQHLk-zhgdDTlenA2v9EEqsm0lJGXfq8ZW50NEhjsY=": "1927551000000", - "umXnKrahJ5TsuvPQCgqE2S1x0BjffHwAdSiU5jGf8tI=": "453638000000", - "umfSZQ_Ygvfl4fRBVwnorS9PEqPTPm5-23vRu8Aao5o=": "961538000000", - "un1n3cvDrvCBB1fdwgc9vaFyeaxICz1aO52QcImLfBE=": "770215000000", - "ungOsBaSo5o9tw0CcdjVRd0XQcxLgqP25PhjUc6VfBU=": "833347000000", - "uoOWDTeUVQHiSKnh0zrA9O83bKXQP5NCTrf931X7m6M=": "38537276000000", - "uojb6KF-U_3vk-b7x7WuDH42y5aEAaUVMftqN3ewMgw=": "384615000000", - "upD17VYhAcaHZHN3UUmI_dmI5biTfP1Jkf4kVqXYZtc=": "385507000000", - "upYLfTxFCGIAfCKoDsOmkip-8AQ_nZkIz4XqnOHAdnI=": "482872000000", - "up_xGKqkrNgyQuHtY673nZkUz1IJklOuwtK2M_ZQ7ic=": "7930076000000", - "uqC0Zlj9DDp4Oj6bdzPXrjon_oV7hkIzCd1QGaCmcpQ=": "7499999000000", - "uqkcEp8Z0ATtQP82vxWcdB9IEZyGsmeF4eliiY6mypQ=": "451350000000", - "urbI1TPEgYT1syuUFZcdEXbZpkAORncYrKpeq_8cvM4=": "416666000000", - "uru-PN89QpcJR4ps0fCDNXfctFXX09dX2nyXrWMCaLo=": "416901000000", - "uryBxPH6-L6pej5VR6IFEyJFAcG9yT11fB3-4Eq6FiU=": "411969000000", - "uskZF2aFTsoEjrbd45OjNiiq5DRlNbNfQ-oYGvO8Vs4=": "641074000000", - "uswEEnKHOg1qEAr4bKa2Bu4MlYzV04U9O6ZZAyiOdoU=": "4009090000000", - "utmubS1-hlpoY6qxepV-Xk0K4kBDvxGURf3MTQIn8Lc=": "1923076000000", - "utoQpWoFedpw9zt7ayFNzGr0Vlrsjy--VC0tRc4lejg=": "1871299000000", - "uuYF-959WmdtgLLA4iq5iYhLQcQh7Y_J3GbuMBKjkAo=": "416666000000", - "uulfeqeWEM5lCniOAryEMjhA6wSNjbVrPxt9wQa21fg=": "384615000000", - "uuoqq3mXV_A7HEqYM_l13uu_rC2vULE7sEQmrTqU6Pk=": "695350000000", - "uuq4tHx8BI9dFzIyaaPQV5eL3ahVgSLIoo3srAdQiY4=": "384615000000", - "uvoN5ij1SaMM_PVhTvWa_4H0YrRhRnJ3awDygIYB1xw=": "461180000000", - "uvuvfUU4FwCwzaKG3FfViWyGhU_xn2SlNbCpKFxisB4=": "3076923000000", - "uvvXeni9hrtpOnVkSQxQiYGDDNLK66SuJ-xbMj1y8L4=": "1866939000000", - "uwEBoJv2VcM-0VN84W1uW0bGnJ-qGwZtfw3XYK2ExjI=": "419234000000", - "uwTmizZNGIN0ip82dOST0Gj5_KxxF71mjQIozSMKCLg=": "3333333000000", - "uwiUs5PFm-4xXujBzdhGoKCpyjUg5q4RCZLryHPogdU=": "395125000000", - "uwmTRpk6qlQq_YgstgyhJ-rYpehxEFMzk_2N6aUVtnI=": "384615000000", - "uwo_Dl1NEwKalGco-dpCDRJoCy5MszlD7rpmwzDwSBE=": "454092000000", - "uwwSSeSNZfM7FjIn00Bq7aUJGVJJ1aTV1WL9Ly770s4=": "456067000000", - "ux-TvBOgQLtWd3fUUIqpi65rEloj3b9BX6tIbHr_q3U=": "416809000000", - "uxCaVbZg6qMBlCBSl0wO0w8AUghAQUHxOiEb_QV9EAU=": "540071000000", - "uy5DKeekqEQ-clEP0dz7xmiO5P_iT2ihbU4I5ZfpzUg=": "635600000000", - "uywe6KUs7dP3ufohCXAw3WYeGWLgk3aViwCE06acOGc=": "385505000000", - "uz2MpLsjhRsw5t-xBUtDwt21akwZ7Zwzs5cKRZqgAVQ=": "954228000000", - "uz2uNgqJFQg8ZJQV8JokdisRvGga75sspZQtCIktBJA=": "1264105000000", - "uzVMTM6-RL8fr35jBp0pcZL_T5rNNunzd_xKB3FNGbo=": "1793255000000", - "uzibMTWuSo-1S6ZSIWTTllNUBsuocF7w8FXFzC24Cys=": "4999999000000", - "uzqhfjutcyRNbXxAeHLFCvivChaZnU3PdV1osIfMGZs=": "384615000000", - "v-_PLcLJn2QYS2Jbp0N6ls2H2DM9nUU1Uc9LZ2a5nII=": "11207119000000", - "v-sE3Za8VJbIbkZSOtkTwewFl-D25bwEd8Bdmyjxjtc=": "470605000000", - "v-zu_REv6c2cZNqfTdoaT1DRcXFkivH9isn5Xk5bw1g=": "539687000000", - "v06xIHeUXbRvCcp3PVcXWQloaBszaQ8scJI2FMisJXQ=": "3472000000000", - "v0F9IEeZwVxhI0UHn43Yjw41a_Nhb4wmyLQU0wxkfUA=": "1505148000000", - "v1hWWi4SIc7cTNma6JSqGh65T1Tgjet8xc4pmUtJnaA=": "1363636000000", - "v1oJizOICi8lmgXFzOCXZvMiqbfrQVF5DiJ1PARnqZg=": "1128677000000", - "v22n8JIQ3ZM-DNHMCjJdg-R_k49xS-oLghlQN5_1J20=": "769230000000", - "v27EC80gNWi6BkWRKOY0uDrZZDpmD6HSCf7Jydm1K1A=": "454545000000", - "v3EhgTnXJat_52FoPVAJot3FZuWwDRwM8V0Skqf2ISo=": "1361946000000", - "v3EzrXoJrg-SCb1c3BZPDBCVli0TpM8vf8ITGjViRdc=": "411085000000", - "v3HvKJ2vSgT44iW4qechH5zeQf0o3gdjg3yWzDSVm_U=": "409778000000", - "v3ln6Tqet0dmqwM3tpKqb1UPhGGK3V1Unj-kzqRbybM=": "554737000000", - "v4MAD54DzDrIxr-vNfPaDfYLlbNd2Z0jj0kl0w0JGkw=": "385507000000", - "v4ibvaOmgAMeBdd5VGf38FPhtzMLmGL1xMY2W2qjXP8=": "764698000000", - "v52ZDMDaxiwQt3YnLV44d2_xxOZ2rvayAa1yTPr5xuE=": "499999000000", - "v53tRXiQyxbpF7ggxB4qm382oks04GiJY9mqyaCSIRs=": "462286000000", - "v5QzrqaMiw9Ics31VNThO5vARpYZtYBN-ZtRgyuJ0Ek=": "1741351000000", - "v66hRX1iB4YLfkiLnPSn2nOJNbFWldMhZ-s6FQ_00WQ=": "9891607000000", - "v6VLRktJSRyh0nHgsSTDVj3U2AkUUGT9FPt9hYRgOkU=": "416666000000", - "v6py_wTxOunJhW6HWWUmD_Be0MFb2IHEWk-6oj-sWfk=": "492307000000", - "v70rF_-UT94pdsoxAR4A6Vw_q2co-OlexWXFjmqmF9w=": "18181818000000", - "v7C9SKh7MivNfbWn4zmcv-mcKQTDqg_B1VWlp0R8MN0=": "769230000000", - "v7HVPoeNzUmjb0ADjQqn9ZN7qoxhK2mHR1bxAm59XqY=": "4999999000000", - "v7Skq36UX9Ypo3LVjrvwr4dwPj1PrsedlOpRtpJVfHs=": "624999000000", - "v86r37TE8jrPi3Mp1CwpfAZVqPSDWdXPqBMpGvANuyU=": "384313000000", - "v8GTbon7ICTSAGtX3W4cuzH5cTgrr1p1HWZBq8kdJdw=": "461649000000", - "v8KTI3eokxZlSFIoIK_femmOB09Gc80haUsDZKqRxN8=": "407808000000", - "v8PENhMJk33nB250RPBXMCTkbG0Hf3I-_7nQqbddNtU=": "1249999000000", - "v8qNfz7wgvRKwXgeHJPqJpirYSIWyaxjs701Lr5xg0c=": "406308000000", - "v8ukR1VotHNVGGtXpxPHqoLcxbA0lojHIdnh5j6mYuA=": "411085000000", - "v8uoSRn7MLpqQgiUy2R_vd4jR_KzYMu8M4kUIR3ptAw=": "501207000000", - "v993c7lQV2eHb7cKmIAgC8767SuZd0S_gVMDQUYBQcI=": "458340000000", - "v9FAgrdIxMs4VF3qfYXgdTpfcmvADw88d5lE73eIsVI=": "384615000000", - "v9RghEHCX0-_R0fp2JTfb2BZk1kXZxQA-2-FKZT-SZ4=": "459977000000", - "v9TapadujaMxnaV0x6bNgfBCQ9buNMCQ2pX_Mxm7KrQ=": "377647000000", - "v9UyQXaata3MQV2l0P2aBXLduyTmYm7Rbw_onIFB8NI=": "458716000000", - "v9Xhyi0ga3g9Iay9KCVo4yWClhmVwuUGAkchzmyoORo=": "387226000000", - "vA6_cn5BdPqqhgPbBSRiawHGiDkrM6PFMZAJTbpuafo=": "385506000000", - "vAF1CGDzWf83m1SMnX35-iNqFIPCfDXAxgrNiRW7PXg=": "392676000000", - "vAetCNwZNoYEp4K1owbEgvF2yhrdPjQkSm_oX-HC_7g=": "464997000000", - "vAs4ASFCgOFApkDkc7bN7ZF0bvP6w1JFFQPsplVbtKA=": "465876000000", - "vBW4zgqU1-vfhNJkDqyfb8dLZueJWI_hVRkY2CyHvsE=": "7499999000000", - "vBYJzsaQllNLadOmmiTHh31mqIbH6JzsrphMvsFcEe8=": "471887000000", - "vBbJzMTbikeoLxQCadHvEvsGUC0hsMTZSINMyff__uQ=": "1249999000000", - "vC5qoc7qaRzBnDFQ8WrFwtG3EjIyuWKk4bJNPd_hbto=": "387796000000", - "vCFIiV_yL7C-564eaBHFLoq0G4snRJ8DH3XzMLPKX8M=": "454400000000", - "vCO4u3wRZd0UP4fcVRexvBMUe_xKXOO9CGbBExsY3Y4=": "417631000000", - "vCbG4LoaNR0LLE9h-4gnm7r1Vp_rz3GY8iB-yI0uwBQ=": "384615000000", - "vCbXR4t5UNI5c1ajWjI9vLO2di8RCCI4VfZwmFxAq6U=": "460237000000", - "vCz4YSIsGb_N9-3iHalcEUEjWmDAk_Y-5VgMK-rylS0=": "838516000000", - "vECT3dcLV7EpEeUc_ZW9MN6xMHnUyRlpPi3g2ZXYC-g=": "1151408000000", - "vEkFD071vf3qjb1VUM7Ow8JoUyCYikEMaevb6SkJKHU=": "4036903000000", - "vF9fVEzWJMNSS_JxmDoP2mLSs_N2M3HpEUILlIS6GtE=": "385509000000", - "vFWMfm03C_XvDgh1yJh2IQx_BBRtZqGdEC9_9ctI-Dw=": "4626613000000", - "vGXYSsmyMN8kYFkOlwrsX2o-x0NZhiIXIMih_w39tkM=": "827201000000", - "vHSZRRpSKcMPbSnW5N01gYLhGKZmBNaqZSzlVKaWcbU=": "504003000000", - "vHqZsn135Nz9_xevuyjScANBD57yIpUsSKEGLrc_UFM=": "461906000000", - "vI5kFPn6wl2-Om_flr7whSMH6wsJyNlUKWwVdgJBuuw=": "447095000000", - "vIRZMSOPiKVlH3VsGa0AhTLyWtYsj_An5I1kGjURzkQ=": "381802000000", - "vJ8i6uO-p-s2s8-6qgZHs2hstPiQ0A6PqwuK_KTdU_U=": "420623000000", - "vJCLW03uif5mO9z9DZOJp8DTlEiAimlxy1VC6FFACEI=": "406668000000", - "vJJQG2CO03JSGQ1b9jNzZHTYEEPcp7UsOcrtAm0ffG0=": "656788000000", - "vKUQka5jaDPIQLQYu23GR7LhPLnKeZWrfd7KJQI3m3c=": "507660000000", - "vKiB6Ant4y672bUfjxAvasHHnoygN_xn-qWOcuuZgYU=": "385510000000", - "vKjPkzgE0BsExsjOSnhJfS5YWQ_9sczkXNhsTb1Pavk=": "376209000000", - "vKsREJcbPEy5k2e8DVqe8VaZRQcrHHbz-P49aBGipkw=": "354912000000", - "vKx_cLLW0YDOSWhGvBOjd4nS3yizjzLDYHohVup6imA=": "909090000000", - "vL5aWurjOWyf24FCW_4NZtE8d32pT_hGHXATqEKMeNw=": "2057170000000", - "vLMzz0mQMcCCeuRHzo3h7YSNe2F4IIobO1_ARLpy3d0=": "455303000000", - "vLUc0zCQ5PyeyIlNTMg_I7sjfeltMuZfilJye-V5P7I=": "384615000000", - "vLoL_bLQ-vG4blbiXNPYh2KXG6uOZpiIyPAfRp3uMbc=": "902683000000", - "vLpO4s3gkvVjlpdcN1-wAVDjRU8AatMnyWfJTNuzB1g=": "1364904000000", - "vM9x3cYKJtv7mePG2ijLSfidVsW-LQ_Fa9IfxLbQqQg=": "2917262000000", - "vMWsRWmalFACov7nRehqsBYM4wxkuKAg1KPC3J_1Qi8=": "384505000000", - "vMXZ4SoSO1Xj_WdIOPSpQVZnwq5C4edILItwCS7bRr4=": "783595000000", - "vMjYnm46KtgzykPgHCh49VcVm0o7rM9PQhiZ71-yPzI=": "2064318000000", - "vMsRcMVqadmBLJP1aBzEYXasUeS5iOgsbakVVDsZ5SM=": "461998000000", - "vMsYL4zVGWO0WWw71cf85uMM8JQqxPKm2pKG2zcczIM=": "3846153000000", - "vN2MK5XAaYpF2wnTZl4kdoFm95GLo3hHVzHo5TSZfCc=": "456067000000", - "vN9NtUCL6YOIfeofK_qbChTo3wPora3WuiTkrQPAz2U=": "1927533000000", - "vNI8MOaZL8CNvLee_QjkU9_HIMD3y7XzS24HtrKpvao=": "796097000000", - "vNOV_QdMIBoyGzpNwi_7wBcnm8PTfHuXpo_mFfVNoEo=": "613636000000", - "vNRR0Og7Syr7tbgU0Eb2ag_DRYqiogtZRddLfLNC5Yk=": "1732491000000", - "vN_u8QJXrT-kAu6JK7m-On8Vsl5ULlOSNrvadewcXmQ=": "768007000000", - "vO3TgVwgk3nAkH0tjebjX2G-YRUME3A8yDgCo5DkpZM=": "8467411000000", - "vOvkuuEXQczDaHJ9mPTegYHgpjC3jWQ8y9_7Vt1cncM=": "5384613000000", - "vPDLWmGcGIe9QPof8ruNxblgZaGLLGhR2bx0f1Zu0RA=": "769230000000", - "vPT9PW9xBz2-kLaXMWRNMvm_tB86ZIdQKRWq7j_r4Uo=": "1007069000000", - "vPXqesbrKVhy4AbsKKWc-YJMKypqcl3GR5_dav1t6Hw=": "384615000000", - "vPauoM_V0TL0Z1ht4eirRneK5P-oRnIhaxmp4EB9IPg=": "416792000000", - "vQ0hQlyfQv1jxhFaqPeIw-lvwbCIsSn24cdTU8cxE8U=": "833333000000", - "vQODivoZuDNyUZcNl3GGbowPvZ4dHUGDlLHfYqPMM3o=": "2020135000000", - "vQRk7VkFVRojLdNUF4PTJTPKMudSLu-paA-R0YHFhyk=": "415426000000", - "vQRwQRhPhDK38FecM38aNvI8Bau4ryK0a0IhsFhL3wY=": "456104000000", - "vQp3ChfWoyaOMUyZE4rP7PGwGx3quIVPVJnrED9QOJI=": "446197000000", - "vR0fGKf-Bu8xOJo77dwRaTNLhP8b9z2C314TstgFrJA=": "4621453000000", - "vR6sIHLK-LbyVaY0TXwyUfzSKbSG7rFX8qHk-oOd_0A=": "382755000000", - "vRBPaTHvtiQ8-oH8UG88f0O6BjSUoemb7-keiIk3eiA=": "1039074000000", - "vRRZshFmtNoHHyaf5OU9evo9DoTT520pvYTAGYO1Uck=": "420291000000", - "vSjo29gZa9HWmh2MEdxxvOwEpyjIi6Vcphpxw8ZJrjY=": "12500217000000", - "vTAUC4gVrx3jFzbc72bg_uBOLzQazhpGiO9s070Zonw=": "451044000000", - "vTritZVdp5NoLG95MEzKsdmo6Reo8w6Hldm3xUKMF1I=": "934718000000", - "vTs-ceZ32hciYkCgYgJ6zi8RKpRn24inqsxyIKX38ls=": "2304083000000", - "vTuimvJV6Xx7gsVRq6BKMH-UVGLyfxDgpAO6UMVG9xk=": "1882865000000", - "vTvl2gUVztaGUXK39DpKyRi-95xkpDE8ptm_qIUmcUM=": "384447000000", - "vU00dBMogm__yXtkLxYqN6OBoJPjjZHQUH6nSfG5GbY=": "466456000000", - "vUAglSiiX7YnpWVuYubXLFnJL6rC-lU7-5DiJi7C5Do=": "385507000000", - "vUS8SZC3ktbhG4xuOvhe9JHQBlJS0FmXTJoXC6FeNuo=": "593934000000", - "vV8lbXTWVT5ektJALnLmWr18DXggHjN7TFUEUl7hU34=": "384615000000", - "vV9F1kKKsllmN8SprY-t2LvzrSHTiwxTrqTEpyLYGus=": "384649000000", - "vVAm6XNB0CQNlCkHl4DF1Izu7kvU29Y2-YhcZlpfOd0=": "472288000000", - "vVZ4IHEUTjDX3TNzpA0IP2QlNl8kpEHSMYTYJLvDCHI=": "6248133000000", - "vVjaO1ddVoXUzLtgkx9fTkkVBnltAWgj_wUlAGzzGF0=": "767905000000", - "vW7xprFclM23z09HzBxFQy4QEoEYxfOIZD5HfdqkcqU=": "2272727000000", - "vWK525RCFhldBBDeh2LttQ0_qEiDbwnvjuS1dGZe0FI=": "410399000000", - "vWdMyQ2lYPjGtjq05V5mrl5Pb04qohnQx4vvjL497Fg=": "623649000000", - "vWhKqGMyx4gV1MBexZ_jCMHPU350Xs1A-5g15qYlRPg=": "19246500000000", - "vXd7XGcuFA7Nd51Sutj6g0Jh0nHEzOpnSYf9QHfvYJ0=": "385507000000", - "vXwvyqzeoV6yp5o3iMFZmxJLLcrmn43C9iiKdOz4E3k=": "384615000000", - "vYURTeyJHM6TtSLSt9Z9TS9dYIFRb0IAzLDdBv5xU4c=": "3817675000000", - "vYZlUnYsOZGuIKFiDdMOPz0dIEjW2o9yGDG1O8sIhsI=": "458982000000", - "vZJCmNBWWHOcfBPuoYdJUVUN6M38UM-ID8rVkgWjqFQ=": "460896000000", - "v_4k7OPXpapuLqA0q1PvIDmMorfRcj8hqpt2eE0U5Bc=": "1366800000000", - "v_O5kaNgY65taVfLstSi0ctv6Hv9S779nbi7zv-S48Q=": "458399000000", - "vaT5ecsIdGK28EuvKGNq-EaWP2uW9RPqfH_psVHrfhU=": "384714000000", - "vai-AlIJyJG2nqdQaZa_rivWPAW30YVU_7lLKQuRfjo=": "416666000000", - "vaocbfT6_Z3HwYi2p2X2XUTNkXM29UsBuUgTL3o0qOg=": "387464000000", - "vaq5g2JEmg6eTN4cTPsZ-kNgdPNYi1gWvGjH0JdqzIQ=": "385229000000", - "vau19RFk3AhsCDkpotsBgA5E1LCsDBVnLCmdCVNoI9I=": "2505818000000", - "vayjHU7Hnk3I4gx29ZBR7jqc_OlIzBKbvLT_5w3Kl9k=": "769346000000", - "vbTu1G7zOAeOcbLvthuPm-F0UdYXiqXmj7_12JbkrYg=": "1153846000000", - "vbU2oFSj4irdMmXzkS8NpxNZ09-5FuMQU0QUnCby33M=": "2392932000000", - "vbUKCK0YbAz9ti5nUMsgp7YL8IazghU1pHZf9umCkn8=": "1215264000000", - "vboeCDe6jjMtB7omrIH9Iub5rLcAZTn7U0FuI-SFgqk=": "384615000000", - "vbqG75sq2hr9XNjAUo0R8Ixspd9oyMxaUVjSbq8wISc=": "2114959000000", - "vcqb9pb33jQf1-OfPzRzKZK8mvg2agbYYSwClCEztoM=": "1819478000000", - "vcrt_6m-i7YVRzTaC0I_emUn3QEsPS5iIKWIjLtWE-k=": "385507000000", - "vd0DF_4jyGiWrbiy4qRPcs2FIjatVGCZJlxX4ul2dzE=": "408304000000", - "vdZ1MWO_zEeQfa8Jr-kUCTpu-uR8AQJmyEXAl6Vxn0Q=": "464459000000", - "vdeoFDo9iG7dWdlnIYatflvTkULpAcor8C_nExyiGPc=": "384615000000", - "veCtTQygOAryRxtYuwINKxeUaiUqhhikdL9u1t45bmQ=": "1223425000000", - "veNgKQhxXMIbzEISKiNbmL4pHxdFX1ImGpNXeyc7Iv4=": "416666000000", - "veVdxEBsU46Eze98mCmdg7Cig8lZ_aPc-QmNe7gxrFg=": "465433000000", - "veZ77a7Ubo0HAE0bDthNVWcLjKICrFfa1zN3HDUDgxY=": "909090000000", - "vejEEBUY5sZL7gnHJiUIo0FprEhvsMkW0svxExFMwEU=": "4044402000000", - "vejLnZ6coMxQnssU7SqkVwoxzxgRdLMO8_Rh_oKpD6s=": "389414000000", - "vfMzboyhWCD88flnzy1IUu0zVUKQIiECPYccXsF_Nzo=": "20452092000000", - "vfNZ2ZIAaiHAPtGa4RSDIxYHMHRdy5XDralIDywOkvs=": "390606000000", - "vfS3gyin7X-_jRccV0wIElsO5FZMBZIjZbAeW1cGdn4=": "1900132000000", - "vfxsy0iXO6fzzpDSvWXs8afVxYZCSLNi-47Mg3HYTN8=": "384314000000", - "vg2tr_fGkMcgXQkm352Q9T4sDlwGXE9A_MvxYkM-nvU=": "451910000000", - "vgY7g4EWnicTbFoglWw9UocROEX_3TQZGF3d3-4dCEQ=": "770221000000", - "vgn934yJcjfjaksDtIeT-1M_PEHMW-9xA-17q6pywGY=": "407808000000", - "vh4o19m03XKwryYu4HQ8cCqz_aMwZ21YaewKq_L90NA=": "385505000000", - "vhHRfCmRrMmI9bgTN3fkq7U2JTd_Yu9EGI59lX5X8X4=": "384615000000", - "vhcupkR-nSb5VBdeLO5q4EmHoH2ldNE7P4P9nkqy_aQ=": "7486720000000", - "vhnryQZ9fdV-Yxr-yPKJ1P6uTeEe0iWJEVXMsdHY2zo=": "382394000000", - "vhtvGJ9grMr8DnU7WBCM9BF7RhBu_7BLC_mGZUi_Njg=": "417634000000", - "viWXUcG0V272lrOnu4qGqwC_aE6vH3rvOzVdyHs9Fyc=": "455337000000", - "vj6PoNLJ04goXWdo116Gn8P6_yP_ZxM3lGFOhOerERk=": "4233705000000", - "vj7L661h6J2j1L-ynKgmjQfLRsa-NaZqvO0z8REo1lM=": "2017111000000", - "vj9qk7-b9zbpSxxY1ghRP8tuGxmBJ4o2diRtI6KnwQc=": "1789326000000", - "vjhLO02K4ZUGdmscaVAmUxgtP5EKkfD2D_sVVmijOrY=": "413732000000", - "vjxQgkFg2RprRRa06XiwopLC6xJDh-f_48VwyckYV84=": "3635881000000", - "vjyyk_LO_IwxbrcCs8nCIaQidKHUUqJ_XIiEmPPYe3U=": "926068000000", - "vk53SNivCuiWEoj29IdvN20XBBnnyjJ1J4NpyBcgVGM=": "649928000000", - "vkXEK2GAyfJD2Ya5Jr6seUIk4jyNhdFrch86WV50pfU=": "1134771000000", - "vkmHqtVVmdxCcNsEGBCTKP2TobFz2HrBfapa2MGmjZE=": "422558000000", - "vkwgmeZDqn8zkfDX1EO-4_Uek5Snlev-i65PnYP7Pco=": "939231000000", - "vlMKAVjh2x2CmXV4uaELzYrYEr6VdCh6Iq1T4A9zuas=": "3076923000000", - "vm327F5DJaKj6SQ5trEkh8FtUf7hOZVONAn26kiSoQM=": "12499999000000", - "vmZ5338U0dLUuXcshAhytGRPlhp877INChsENxgIt-o=": "384615000000", - "vmZ8WMcflInDn4nR1WrzSMXH8JnnGxeh8zjOhm0iXxM=": "385505000000", - "vnII0QeEeEedrUc7AiZoW8xu38dXdBNBUQP6ZWKhFbM=": "833333000000", - "vo6j0qguY9xKc71PK-B33P2SAxVASUMv7lEbVT21eZE=": "1540046000000", - "voHZ6rr4ls2yTJ-M_JBjDZ5El_g5v9C199-jloQAP6I=": "1039481000000", - "voPzBNbDFugB7Viv4XD63Roxt-IrqbUwD9dW-v96d2o=": "833333000000", - "vodhGXP8DDiq4AxVyL33IPxQ50dg7OZUoEAajTcnwj4=": "1156518000000", - "vohrB-L9A_feYXsz8TKNIDpkRXz3k1JgpX1fPeEOgRE=": "649467000000", - "vorRDdYnjxcDJrTE7dmIyCdD7JXiDl9Ua4aJ8MOfpQE=": "388461000000", - "vp9KuGsu8VTZ6X6hZodFmTAge81dDDk0TOJPHk-9bBQ=": "449522000000", - "vpEhZGsWw8w9RFF1DFKqOSnGoJZ9ONL71hbFIRU46uw=": "2916666000000", - "vpH8IuUUMHTp3WEdeXc66K3UVkYRtmInI1KBthhWvMk=": "377391000000", - "vpKSOkawmIeRmQSAD96rHxAwypuMlGnAmdCHEZ6Q7j0=": "379138000000", - "vpbnHv8zaxtYLClC4D1TlfWDWXm2DySuXmt6ob9uTn4=": "418546000000", - "vqBn6RLFekS-pgLfN4JLrXeXAjP3fwsJsfnMjMgKPcQ=": "756639000000", - "vrKVL7lgNCNlFzhw8b1G_e-N0wSkz7an7ijeEOQxa4c=": "3846153000000", - "vrKmW9UkxPovt5i6spKB7Jom9aUSdO-cuSF6iPHENck=": "483442000000", - "vs1EmMlXaBfXpAv8lA6UEGXyZlB8_F2ty_9J98kdrS8=": "767422000000", - "vs8OSYfGxlMJgUJhPgpSRAX8EgqtxIDDIvcTG2sH8SQ=": "420768000000", - "vsBdJg2fzrO5ka1dOVyOPEdKMNJXRxxVu-O4z_Qc7do=": "786938000000", - "vsC1PcM8iA8I2s2WOznHMPYrEhMT3M2ExZbiQnJ2yB8=": "636235000000", - "vsk2T1CWGuh_sshwThnmjRzNwbflQB4xzvJuJ1L2qPM=": "394620000000", - "vswLZE6ZXb5rY7WY3HPcFY1eJhqK8DB-DV5_uewOgmM=": "421678000000", - "vtLIp5czwHu-GgfnUoxFyGgXkoQJOetRkjJedfDQdWg=": "764799000000", - "vtdR8uvK71QMeEGDayX8aaJcwhXAH12lodFqhK-wdV4=": "462687000000", - "vu8001_OeEFB0vkAnhXTQzMZX-VpZGXP_jH9nmUhBcY=": "458176000000", - "vuAbY3dppqJkve9SzA4vhTleIG2AeXNklzD8zHXMSuk=": "12136055000000", - "vv7sgxdlqhtjK8n44sCKIrUkCxblgoQKsv9-NKEa7jI=": "384615000000", - "vvFNzLexWhZy4n6-MkDTZT9xZg9lb9NT91Vt2te2FNo=": "1354022000000", - "vvOq5dcsqzpYVJo99dMFMU9sMuj8H4j78rXM7SW7pQI=": "450406000000", - "vvR5sv9v6YHec522pn0VnJAnxfMK-VP_GvFfNeGY1Qw=": "4551250000000", - "vvfRVfjINpH2EW4g-1RDHGbGOhXalTBTq5Hnd2uvwDI=": "388549000000", - "vw-VNUVaIRwbXUj7ICqFDYqYIGO2nSDqa-OjwfYl2aw=": "384615000000", - "vwN78QJlnFSSw4eWiRy1cn3gVaQQ2LICUPG9ywTMLT4=": "844724000000", - "vwSZusp1P1dJSN5B-0zz3zLdFbbFUqvKm4lC-LJrVVk=": "408021000000", - "vwWGccPc0kT5w7bFw6tzbIPU9lb8-D1KzDxy23wtybM=": "2088168000000", - "vwZ4TZLsflSw5UENW8v7HYneOFEwX6kMnitR0s4lKPY=": "390778000000", - "vxIWkm-KUnDgry2mB0GYFYM8M1O20l_hUpmQ63FB0yM=": "460013000000", - "vxRX4i6ysT4zaP1cHXEued6SBXN1DcIhhb1tevmVwGM=": "3737207000000", - "vxlMmKtZ5g2UPIR21IPfafSj2yuFutd8W29R1y3hMLM=": "411085000000", - "vxnuX8IsCZ8QmuModOQjSLDRC8iQ9GDHxRuVw7BY1hM=": "1924371000000", - "vyC80bqymvZzoo_0OjUnKKya3GTGsgdqdUpX2E7Yc_k=": "377921000000", - "vyEIwToIiklG8zV58l5EbZyfwnf30M371ysXxHHMkkQ=": "386486000000", - "vzD-SvxrIwO8U1C1nYRnUzcV1OhbKRlNf4PU_e_bIkQ=": "3773099000000", - "vzJHLygg8NcgbVo36sfpdqmAjWVBqavnAHd29y_EnzM=": "767421000000", - "vztQmrnLA5ValxT83DU1t7uhbyxBKiAP_uTr9aG3jGQ=": "2269455000000", - "w-Uschb9yua1rKz0RHQFab9NFyMVGA2sFYz9sKOaDvQ=": "382687000000", - "w-YVgq4qgBDIXcgXlihm2zJmbFI_ZOiM74Vhgsj0PXI=": "384615000000", - "w-iJJDHUwAoOucJp7cwPgWAHeRmheEVQrExdeqVQff8=": "906471000000", - "w-jYZxGD6c6lKcLQ50QEk1H2J97XaCX7OF2JsJynwqM=": "383807000000", - "w-zm3Beg0x8Knv6N2_OjzM11ppHblU1_7X_h52ekwIQ=": "1344010000000", - "w0VcEiI93DoHuWYhKGv6VvRBWlGsPa1KCQvZsB5Cxis=": "1628608000000", - "w0iNvZyv0U-spQEQDxvMD_48bKJr3edwvRfKj-Gl6WQ=": "4061679000000", - "w0rSdSf_WmHg2gWo7LR13j3GCYDMVBR4N6wTM0KVKmI=": "384462000000", - "w1NpICpvPNwzMT9ZOD96rG6kJLZqH-cfZU89H4v4sPM=": "1524239000000", - "w1ffopg3noN-5-A9wha3oMc1xN-HI7aGEaXlia_GpDA=": "382838000000", - "w1nKNJQVEt0IdLQ7i_mpcO8XyCVOZ-tg5LPEohR4n8o=": "9975689000000", - "w28yBQYuP0lfvbgaOGoFrWSpqTAmTfwxhSjVeYX75HI=": "480803000000", - "w2TYQ_cOHFtScO4GZlmvWK6XQgF_rxR1Qi7f1WJ1yaU=": "3689236000000", - "w2roeHtR5pTaiXLQzBrV5IEG9UQ9ir44dqmVOlwsg6A=": "455600000000", - "w3DYeN0f6VQjtAC5BrrJScJpx1_1Kp6YeCXS9BOOhGs=": "542615000000", - "w4tbKFTHKdR6zZzDOoiEZU_YpSBkfpqBV3vUmHAZKlk=": "460976000000", - "w5fV5qrldEYUYsT3-U0rj97Ms7vv--RYUj1Av8enEag=": "566370000000", - "w6GiYUNv1fBVZT9x6ptMK3m0amEpYspIuPNjZ3FT3_A=": "385506000000", - "w6LAJ5TcHfBRcTAEGQyQvn3IMF8ZeUMiEvunpCSDaLI=": "995850000000", - "w6Xf9W5Zg1SHhZPBwreGq1GfAQ6xDDTYrLmQgCI_Auo=": "3612119000000", - "w6Z-KZAsAzTiXbMgMnuffjoCV4fayhvGup-YdkERhIY=": "407808000000", - "w6g66FkJy3e0ZKXtNwPPd9LbhjFJybeeQrikNVk3FKg=": "385510000000", - "w6ykyz80S7jUERHATfryL_5GfuDXrrssrUsj5bHiKcg=": "910115000000", - "w7jJjVHNT3XgC-rCtbmyCZheQmKxnTcJdGDOlRHcP6s=": "417698000000", - "w86DXxd_bb3G-_b-7sSZQG0FCv45KaiqJnzRuOi6apw=": "378833000000", - "w8r8wLloGoihekxMRX64js25LNw-7-g4QRdr4uhH6R0=": "1666666000000", - "w8z-NXZUwGI9ZUFMOl0idkO11MkSDlF074YgXC-8epA=": "2000126000000", - "w90EdqNBFn-DcohHQUg9dRgRv_TlIFRl5hcJsQSV2EA=": "385721000000", - "w9GNcIMYPWwfUdcuGFbAwLbCh-ZicwmmuhyZZfuW74s=": "615115000000", - "w9HB_litkqbxdbq5452ALVVLlUP2riXEvjE6CLImsKY=": "4166666000000", - "wA4XdLL-RK_0yudkomObIXaGfqTeXSkJKMQZv5QiK3s=": "3179993000000", - "wADICQyOkwRngt9fZbbzg6HKuesqkpTJunr5ZSnmmQc=": "757357000000", - "wAlXqzF9ACuHnk5kb9JMsjXPZT7MF0QkfU5boAYbzNk=": "7390122000000", - "wArleRuKvytH5mkrEReIPB--SPUEpd2IXuJtThZBxcE=": "2090909000000", - "wB1NYUYhmGLiTIvq4vhGyTCz3dAr7HTn_qRtblWhFkc=": "385252000000", - "wBRiz-s6KXzmTts5NT-cCLwmA68iJjfVT7NckiPwdJM=": "15384615000000", - "wBTw9XQGapYGjt6N61oWafgs2bF5k4xKeFZcHBuTtBo=": "420102000000", - "wBYHjou35Wrt2Zrz_Lp4_qjgfJMjZ_btFB2wu3GLIRI=": "455600000000", - "wBzkCl6iwuCsHdTzmodXxMBbTi2XvDTqwMH80kkd0RY=": "545274000000", - "wC5JFM4lN3SpmIXzwCbsW0Cj3Y9hmUp4TEBG4WIaDhI=": "457680000000", - "wCe7zvMDJwf7ERhwXOlul5hhvid_FjxP4qkI3eeiNDk=": "417630000000", - "wCe9NMu-C41fo8taTi9DqpRu2shvEK3QgUkkh25CJNY=": "565687000000", - "wE4QoihIs33kX1BJugP63hh_pWgnI4e4cvOblpP-C_0=": "569159000000", - "wEENJ0S6om_WzX-iak5H-GZYhTZ9P7VR2zwXawrCACs=": "929867000000", - "wEheCG6ky-3NxbeIRDGvU3NGb8jSKnfXqIzm4T23EBg=": "385413000000", - "wF-bZjNF5srwrf8_cWx2C6VPYLAMye4ZwwAq2nT3JwE=": "455600000000", - "wFGNqFmZw7jQObMhX8sswGK7TlWwzyMmDo0Nb-XAjNA=": "449601000000", - "wFTyR0dsLrv4tigbgUwizHF5ILPHmA7rPRxceZpm0TA=": "368565000000", - "wF_eyYPzoKt6OH5y-4wfBntTjcmEvwPG96VwfGm90J4=": "1905619000000", - "wGHikFwao54GNa7olG8gBDySA-3F0ah9f6xvGRnBflw=": "465433000000", - "wGJ2uMs7clxhSKgIDaVpOeMSkrJmWQ1hzM2Nd1PPRO4=": "384615000000", - "wGeauzCNjL-qcDtoY_gjBF7GDjizOtPudhzAphALL9o=": "3846153000000", - "wGsNp1C-QUwOp5Ybu05Qh7wX4MWTIXWbxLzOkrixo80=": "385228000000", - "wGyhau_Aa0cXYaBllybTmplHmsFDJAofChX5HLua7N8=": "2004111000000", - "wHbUtDqiuIY8GjvPQDxuCcf8kXJzE1Js1FGFIykWRy0=": "385018000000", - "wI0m1kzK2-t27SVhThNR_HEwpjRQa4mYoJ0eH2_SpgQ=": "376889000000", - "wI8v31xBzlVrs3fAjQP4IyYT_h8z-qw-_PSwwPMHZ94=": "768095000000", - "wIE8RoqKSB7R2Q4iosktPBRHONPnnMCLxNT6e4Oqw2s=": "4137837000000", - "wIs1N7NvwMUC6TUO5qQFtIXVtygnJUnHwgWeOmYx6Gs=": "900447000000", - "wJ0JqNZ93xm1zchxPxz8aoH2Omj-ZymqBo78bxtWcgI=": "20330855000000", - "wJA7IhHZzABVN-h2KbWn_0Li2XoYhpCb9s7p4ndRgcQ=": "499999000000", - "wJB-I4YoIve9KipAwE1h2dT4Bf_16WdHJHu8xcv3SwY=": "453645000000", - "wJE6B_rEk3oDpPxW8Q-wQcZkqUmRkVVfFVkUnhHy_Ps=": "384298000000", - "wJeNrZrIH6neVuQZBTPQxZja32e6OtAhQHlU6V2In9A=": "691925000000", - "wJpG5B0awJfJh-AmVThH0o08hRSAzT0EC1Dl7Ykz-Q4=": "377736000000", - "wK8wWAfcqH2QK9BJOJ8_0jL74WXEY0z651ASHeWyHlc=": "417273000000", - "wKE5w79t_0touAlqUuO1se_x8qXYmCDNEWUzGoTmgBQ=": "1922224000000", - "wKNIslI16Bjq1_ckI9s7VIomphZwR14Aojj5PcghOl0=": "4976836000000", - "wKYmQdEwcV-2B8RGq5UJUO6_FfR3uzntYDjYIYM500A=": "384635000000", - "wKhFLeBY-EXpefxS_tVR471Y_-9FMeVx6F8Ldo5J69U=": "4199066000000", - "wKovxO-MHHxjtmJdFaBjjqlB4nBInyoRkKVMKIGypf0=": "384615000000", - "wL6FAXRKqU3TYlFrdBX0GgSGK87wEb1SqCNeTkapy8c=": "1250909000000", - "wLP5IbFBmSKJcyYP-Z-QrfRUIP8a1Eexa1B4YIpFkO4=": "377309000000", - "wLRJATMaRkdZoc6Psi3vteB57WHC32mM9oPmMsyTnEY=": "416666000000", - "wLb8FQ2TBzj-WOUgKu5IYbBysg5zrCDVvwOqib3hbHg=": "381767000000", - "wM690P4swPsndI9XH7ui_C9O2ZGPUVe1gwEb00Dc4uA=": "377583000000", - "wMDbHcXONWc0H0KSI-_52qZU4pYk6iE3192BrLFo0vk=": "827107000000", - "wMG7c9kaESgegXb6x64MAA-gIlxPNlFkapxjxZSkQUg=": "382429000000", - "wMqj2ZzoyRs2sNwcJlVtTv4DBcI_cQNzkM--83ZaKbo=": "383982000000", - "wMygECfwUCdlIOqf7xYq7-jT6_4tupz20HGDJkmPLX8=": "719263000000", - "wNJLM5C2oY1v14_ErFT3TziYBkpiDP7UP4LiMb4Y-X0=": "459483000000", - "wNurUnEwvCdgj6ayLr3QdT-wymXTd8rdALsvgZ2_UMA=": "378103000000", - "wNzPrf3hFC5yKc_ZlYl8CaYrIRrziV4ibC7e2PAYeFc=": "3823944000000", - "wO5k5YwMnTCT333QTc3xGnfkN8skCrYSYlQSXvvOQPc=": "464494000000", - "wO_meyM0AatpQauzq7Y0fPHVHyPW4gonM0kCUIBhm2Q=": "383695000000", - "wOgdcXzDfpiPSqJGBz_r4jd_xbYDFbJ1_KLdsR_B4-A=": "385509000000", - "wOqmJJXUreKUUuDJrEry3qRhU4fSXvaCA1S0ronzJ0o=": "768472000000", - "wP1fDaVIJOQRJ0Eore-ixuynGVKi8i-nOm3R5qQtU7c=": "383598000000", - "wPBN072YvgrZ4SP06CMim6CjOA5TBkKBTzggZkLJInY=": "843188000000", - "wRN4xd6IquWh4DipuIDsH2fq9Ht1sDSkqpClLcXWcN4=": "381767000000", - "wRT0LmqRO19jBSpPrIUSw7NHuSuq8zsow1BE203tfXg=": "384565000000", - "wRg2xWFcY2n9kPTKf1cRFLtUccIa2XU-Dr--E8mBX0A=": "3027209000000", - "wRu3NMMRID4WMv7FAmkATO0pKD7NeFvtPy3yKPALuSU=": "414531000000", - "wSF7lk_e970R3e4mvpxyOAbBa8nhrM_TgUMfavT0Mb0=": "419377000000", - "wSrHS5aVes-nnm36wpfiLT0dsT9vpyUnk5KR6fNt98A=": "415461000000", - "wTBJJ7JYEhQNpM2iykMQSW7RwEaAlSN-mHbVe4EQgr8=": "769230000000", - "wTcLCZsHwjsRhHJh7XTXDlpOzedT57c_TchKfb77sO8=": "382986000000", - "wTdJU8PR3vv8zWbRq7ynaX9Rr2ddTKe2XLj3splEk8A=": "434104000000", - "wTxuQlb6BxtIaHRzFP2XEOScwEAMkORxNTUzamOnSjI=": "2500138000000", - "wUpYVROz1_E22TgguIBf2Gc6Vr_LNgzC7qJ0uQTVO8Y=": "384615000000", - "wUxiAKR6u-gmtQYRkpbAZB1QF7YNra1jxSZr3_gC2ik=": "6923076000000", - "wVEcX233rRIV8JqhSoRjkbzokXGvBZPTcysMfE-nX6Y=": "16801246000000", - "wVFbaCsj2yP2_GGj9TdiQCbWxqS8yEdNAz5GLc3pfRw=": "3846153000000", - "wVb9uC_w-WbOE1JcaGARvZCb8aS9Udxz-O2ObnyGEq8=": "417633000000", - "wVoPpsp3useZma2fkdUPIwd4mnh2zYacrKKcO9VECMc=": "769268000000", - "wW7Hn-qe1nKryVsTpL5h6iloNqOC6T5BpAF08GJtapo=": "464954000000", - "wW8u3vm7JN74eM4-KqDGQQP8cy8kekvgZht-JoMKnEU=": "1667395000000", - "wWTtB_iaFNlvGvQjAV7HRt4B3l1FcMivoIH3POhmjf0=": "451615000000", - "wX9Tb7q2bp1XansFwp5_gq6roYTf5Hnc--UDNnOK8z0=": "386478000000", - "wX_clppyLAoBcWrUHV1ogRv1sdP2_FgsmlfY2xIEyHs=": "385505000000", - "wX_k8hZwCtD3bkvM1k376ffFLZNl6zKq3bINabCvOyQ=": "496321000000", - "wXfiVJwbc6pvkJKgib2Nnx-k_C6cMk9mPL1uE2BfoLI=": "501408000000", - "wXmMTV9OWPfwVo3-_oeZCpBqk0aE5-4t6-xT7lefdCE=": "1666666000000", - "wXo-_1MOxt-DfoOltje91ltZrRmpTfG9IGY8oxANxyk=": "417630000000", - "wXwRVwzpl57X6McAZsVzs-NlWOBuJTVUyBHt-_QjKIg=": "769230000000", - "wY5fPFcR4O-PafZR4Wb7L7RKiyD_SPcfws-rVPReqRI=": "1346300000000", - "wYXSQXeiTQXO1mV7Z84UBoh0wTQaFTMoZMOVi6CSuMQ=": "611538000000", - "wYsmGSQFbyxKgoeL7yQukIE2eax0-iDaUkEdkUzNzEg=": "385507000000", - "wZ8tGRwfiHOkDag4dcE3cHhGJLdLQQQy7XP0iON6wys=": "383695000000", - "wZcRKhg9Sx-j9zgJUFWu_KXvLnSwmOuckWpUCCaCFAo=": "384800000000", - "wZqs_LtdxvXmU4f5yIAJ4nNLoSwyk4FWCaLU39cqx2U=": "454545000000", - "w_7cTx6VHi-u9VERW2tz0GnoZjOdFp9RBbQewIrFivI=": "1543796000000", - "w_nNxPkx9UQeOsY1gFN-xxqq29QrHrf7ruhGsFM1xIw=": "1099272000000", - "wafjYcRJ2EndSofTxubbzGZNaVdylwmkWpHmSG1U4kI=": "1818181000000", - "waiO6HcETrtLfy4sHE7Fjt1zPlrC9OQZHsEwD3U3UL8=": "1103408000000", - "wammpxMzNN9FbU8m2RnOcRndrOrBVRwCTf2w5F3JRtc=": "758127000000", - "wauGChMKXGZx7O7pgQTeS9HRK8jIFThnBAryMf0yfts=": "525148000000", - "waz2AY3fO0M_7oB0LbUy0ehtw8-gzQXcuo09hK4YNu8=": "920593000000", - "wbkPTdVooP7vrVvX-r9czWZCRQf2tLeyYfGN9HJUqOY=": "11246391000000", - "wbtEV5xY70LFw1OqDTzFO3IKSrxNVB9IBoN7tMNObPs=": "3857004000000", - "wc139uotzWvMY0ZDtD-M6VHchCt_pruaB0AKDseupE8=": "1153846000000", - "wcSykPjLJgy00nLTV5FNK1Flky71f7zsKykwvljsbv0=": "1144989000000", - "wcytCamBO8pYmm414Ag5IH_ra3wie8rnB-aqoP2H2fE=": "384615000000", - "wczPci9Hv5bNBzK8xyULt1RZEyXEI0he19gMxNX5sZ0=": "406201000000", - "wd2sGx7Fb_QS3vuINp9JPTDp1HFbLCM4mNjx7Vn7RV0=": "1992081000000", - "wdAWxLRo7Zgp3lOjL7yOp5K_maq6Rdpg8A6SkbYPC3E=": "381802000000", - "wdvuDMAlCVBpFoSiak_fWfRd7pyFKLZkvEWwxa2jkMA=": "1617675000000", - "we-B1u0l-Zxre5sgAIbz8_L7V0OmBi3K7RqWygG1oTE=": "3088086000000", - "we26zwDocBFqvfeuqW4YCNHW-ttl23BCmknG4Idk5bU=": "459233000000", - "we2W5WX8_fJ8G_yHQsTwsqo2fRsYeHxr6B1BHIX29EE=": "929867000000", - "we9K4a6TAaKKj_UNVkgVSlDZcpeOk-XPmgvCAp8iDOI=": "794665000000", - "weYx4x9UgzjKA3cJyzz8KMAu_3gT2rw-R_5PQIFD7Qw=": "411085000000", - "wfEWhrpnjGqW3dWsU0sgDmPXoqmdvaYgBiUu53ZJufo=": "764208000000", - "wfr2AEvexWXE9oExO12ELvq3DLCod1CDNr5R8E3O5W4=": "419895000000", - "wgPa5SbXpl3ABbtwj9HUlzWfq4QKycnyt2zb33W7TiE=": "481282000000", - "wgcn_WGJnu8aOnGyQwfdSNtEvLTYf0dhvmW8AnuBzQE=": "4624446000000", - "wgjCpmPK-B_Jcrws-V5_6cWQ2HAgMdUllsfy94vJStA=": "385505000000", - "wh6zcu2xUjBYcFfsZCMlEpBjb6sDEBQli7tJNwzX1-8=": "393464000000", - "wi1h71ZIVCebyfITDH7AIbZcgIUv78LApe8niM2E7eo=": "419895000000", - "wi2JXgxe9fAPe3BbeYXvM3iAyVrkPQ7mGVkEBj1f-kM=": "3461438000000", - "wiJ7BsVyyGIL-THtruN3lJZTok7GUSIfbBhtsPvIL8U=": "417634000000", - "wiUOQcVBu0U6-kXL_JDJIAFoH0GkKdiU0WNWmDGrY9M=": "412214000000", - "wil3Oc38iAXjvC9eL-a_JJOxSnI40dEoNCZLA4p2zKo=": "462694000000", - "wip_q0paHRnXVY1nPp-_NjdfYdVOAwbHC58yMDZWUzo=": "836714000000", - "wjCAs_w9LUMjfPTQhye4lFUm9fVLPugzRaUyp5ZTqW4=": "1153846000000", - "wjamkr30KzB-MBKTbUeXxdl3Qy1RKfSmmlAoxj-zv4Q=": "764959000000", - "wjyci98FE4KoDWBZfEEqogRxdOhPIITbJN99Qdo2jYw=": "451044000000", - "wk2TWuINvR-EXUEqMy5kPaN-AQ1kDkKKeOT0JrM36No=": "1031661000000", - "wkFYr0QQQBv55je3Bc49qAHPgFy4NtPEroTEw4vkUqY=": "1111728000000", - "wkt0EXrjlR1DkKnBVC2_0qesT68B9t3UAy7s3nWsHSg=": "1698686000000", - "wlVfYVcWDtU_BXQGYlRpfyvC3f_GwjCLr0afHPeStek=": "5769230000000", - "wlWN43tEnU0YsGks2AhwWVSA02xTEeb1GRz3C7KHNNk=": "5203820000000", - "wm3MlW_DB9i-rnd9bPCulxKFaStHP7WI5t7ZyUwASM4=": "3584225000000", - "wm4cM3bILgxmx7z3OLoNctrDbcfGX16KawEiggPeQ5A=": "384619000000", - "wm5nPynRkzlFrg7tUe-XDIS-T6VYU9piZue3Xa6pb0Q=": "378325000000", - "wmEFcHkkcKzvN8E-8KPnOzaG8Sz-Yokqmks2o9iPKN0=": "411085000000", - "wmUvTFLEZBYNW5WhuTgQPRFOYa9ILrKEcsK-OiJ8P0A=": "351621000000", - "wmZ5XZ47LFvSUPB-K_f4uuE_kki12U-pvBM9zZ-X9sU=": "383031000000", - "wnGT8QUhrMcTpvD5PhBSYpIZcfGMta7582GjTDWyO5s=": "385510000000", - "wnpC28_v0m-RUEw9_Rg18bl-eI_oqJsbiC5ygf40qes=": "384463000000", - "wopFPU5xRH3BXnn4NPXWDrevjjpjTzrvZw1OftgWlVE=": "1810183000000", - "wotXOB7Kz4BNx2fjjbTFh1m2GgoNhHEiz9k6uhlHVFA=": "985999000000", - "woyau5HhdX1vcA47OjxxwYKFRjsN2TfG_3WV7lao1SU=": "36618750000000", - "wp7KNaMqxEtheUN0e6vtzx9EDNBxCgHPWcCvaQXps14=": "411302000000", - "wpb_Zea7nd5f2X99mVmIuQpaSAj_CC1SZJY4BRGzkuE=": "769230000000", - "wpgr6R-lS6wfSY5q9qMrmgiDPeb238a2a2eLzTHX2f0=": "4167600000000", - "wq3smeq5pLU107L2gfCWHSB7IKImzCS6XY84lnZrANQ=": "560831000000", - "wq4yrrSF2q1nr6nVDj3eEXpsyTuydK_eFBt-QKYGKYM=": "470741000000", - "wrN7Lfnni-17Bn1TblqwigWQSsjXm72ukX_s0hwk3eA=": "4176362000000", - "wrNrsuBRUAC0RJAttVU7vS05fh9NMwuvmajTJg-Ztos=": "810455000000", - "wribKolGVIaNfkBYnWoD43TIjdBTu9tn6kdR-XuZLtA=": "427217000000", - "ws3HNXgmNaAh09ra9Fc3vbBS8R3lAxs9I0thpSSV-jk=": "453525000000", - "wsu8V94UtHS2Z12uHSqLGQKB0WBfRa-ESly1uBZK5Xg=": "424839000000", - "wt5tLFR_t_OUVt9tMbY5QJyiw45cBnxYnQtt7Vhbgm0=": "384483000000", - "wtIRsUr_Qe6rWroRXv9XojAI39FOY9ukjIomTHRXT6E=": "1155230000000", - "wuwRaSj3AqA6eujyU5L7g3GDDce-XKfeiPYuVIv8meQ=": "1927530000000", - "wv7HihTBwQsNGaut8gvbMe9RjJH7pzgh9x1gJmegrTU=": "5195368000000", - "wvV4-G2MVQycmZLA0goIyG-TfGwOpV7BeUiZ5rPzl5c=": "3501723000000", - "wvdlacfpUhybBaY_sIRG-II4v7Qbtef5LcXFGQGp7KU=": "2349118000000", - "wwKq8EHgD9jNkflukF0rb-lnnsL_BrVtLpeOPuEV04w=": "2083333000000", - "ww_YM3PKTlm3faa4nK13PUkxG0Q2CLUoulaWPdcoSds=": "925600000000", - "wwcWNj6X9OlLJILvb4hMdsjybyZiS18kThFgMvOr2l0=": "650269000000", - "wxKMzXJzUer0z2ph1aPt1--M5dQswkBCO5EnDRkTbBY=": "849347000000", - "wxk6Fnk2SCrCsS6Rc8eFNI9mg2tRwYnjIkWh3oWmbhU=": "385510000000", - "wxrEOWHrafrWtXlzBGilgvqei-V3vmqTuCbypMckgsA=": "833685000000", - "wy250VafF5fjHzwqD4dLnTnaGttu39NRqIBnd1JNLpA=": "1011764000000", - "wyE4kz0w2mnqzLB4uTGRwSJFf-R8sWi0-vSU3CSomLg=": "419232000000", - "wyQ_na_9Y8aMS9K9hL2PtES6prVxbk9lbqNR-gUdiJ8=": "940059000000", - "wyr871d6fwpg2c8JiuN_2QpDm35i4ZsuwZ8P5ioKPTs=": "382437000000", - "wzYquSAKvIRa-IweypN6D45D1AWzXl4tW555T-Dl4PE=": "3263177000000", - "wzbWuwx9yK8jF9AY3BH1CTAs5NuhErNGzPZJ7ULQP0w=": "453414000000", - "wzgyYjUcGzdFSWEmvjWFGFIUND0Nkr95iP2KcU8nL04=": "409643000000", - "wzhHUYLFtNQWQVWmbzjsmElzBaJjapt-z4Vyio-bEiQ=": "412871000000", - "wznvme6SU2HQ4CLlSdv0T2WbKDKB5780QcFTdCv69k4=": "7715309000000", - "x-9Ie1z_Yh4kPyhNrp0ef0FRDyHBZ_WDssLafQiPee8=": "16161357000000", - "x-SDg5MOcjlgBZg8U48iqgGIiewz0qo6eLATZ44uuXw=": "391727000000", - "x-mx1__4YeBVJY_X3jYANsIYSTPzBHw4bPAxUFzCaFM=": "757222000000", - "x-wzstcxeM0ZLyDxKttwitXNcOTnsj86wcxWheIIfy4=": "3814101000000", - "x0Ryjfxq3PEnaImbyWuAnE5HltChwrzxRqeSftaWSDc=": "1917793000000", - "x0gf7dO0FK2bF6LM8yZyQ3H-5kkkMnCthuU9kc91bT4=": "526095000000", - "x0guzq0bSIGUat-zUP_TYH7zaQFYNFCbI11U1f4O23U=": "384615000000", - "x0uLDyXCgvaKAMahKY83AFIZTXJcN-8ob4Y0xbfEwnE=": "1923076000000", - "x15MiFQXH2xpJHmxnw0hZyxQA_rYFNyOZHPzPqGXKc0=": "391257000000", - "x1dT14B1M9MKlYPCgpUAuOgEsYvSdhIcUp1uPLaegbQ=": "8329259000000", - "x28PAU1SmLvjC-h8gOANoRm784pXWEUmQiHYNAV-Tbk=": "439348000000", - "x2A5o-71RwktcERUiLVf2pPP-3gf2V72jomSM97ndUY=": "415672000000", - "x3GHAoIx97PoHIA2qBP06lDq3x-nsM65TCk39Y7am-Q=": "384615000000", - "x3TYQhUguLJe1PfIFhTgYBYbAx3M2e3VumTy8JTNH9A=": "361573000000", - "x3X7kxVG37WipTdAULTLtAC0RL3HqexmhKdlcXC5nvo=": "384615000000", - "x3g4hLQLwAdEK_yAl-615x-QBD85CqlGkovUqlXcFGo=": "376187000000", - "x47-htnJNJ9hcnohhC4Mf76RarfCD7B1dDkBu0Zqk1E=": "767139000000", - "x48dOJ93Mizoi1lon17wXJlk6-MKgbRGxZsjf9jkPL4=": "1499804000000", - "x4Xz_SFlgXxYymIm9COtaW09CSQSGX4mUsFPbT4Ajgg=": "384615000000", - "x5857Scm920b_cYXSTur0hu2xM_liTn_AI5jd4vRKtI=": "22613713000000", - "x5G1b6BoAGklP0qNXuHIRQQEdbG9emdfoM03k39n6fs=": "416901000000", - "x5SUNx9HQBa3N5yhRiMVBhx0d35d0pCet7SedV33ZzU=": "6042914000000", - "x5YoSdiLExhMkCu94_fs2JD5I5dmfmnNxMV-mnTQCno=": "673872000000", - "x5k1ZcT8yn4mgpPuQhVwqRYaATdyTAu1Gp1OELKhtiw=": "966884000000", - "x5qEYV_Yz9up7NfBvhLU7NvxFtyqrRnV3-_YKHS64UQ=": "382282000000", - "x6cpOCzgx__uBHBX3wuvLHJ5ixq05Sl3E28waI24mm0=": "415742000000", - "x6f3--NYwsoOaRrYHzKn8hujxfGSTf2vRJRWpuKncMU=": "4229869000000", - "x72g7AK-9x8pdFJmDuD89oBmIpXObTOlZQ34sb1R_2I=": "3766933000000", - "x75y_S63nmIF3LknaphHcn4UY0u9js3MrtjpyfBDnP4=": "25781943000000", - "x7H4cvv8L7ZkGGcUYmeAerp3PVasUd9yZsRYpPC_beU=": "3846153000000", - "x7mhPI5dey_qdhyehvt5HW6E5C7_eAtX_40Z5rG8B6U=": "1572568000000", - "x8JwB8dJuU3jfwOckM7IOh3avb3IXpYAIgTVU0ap_-M=": "384615000000", - "x8acd_nc8d6s3wi_EK5FoR1FBjnjSGor8aRyYviXUBs=": "858310000000", - "x8j4ACxTfZD9mrCPNPWnnXMOpAadKCy3q4nLxJGuRZ4=": "384615000000", - "x8l72UskKK8BvQmBdN-I_-qpugEEkLm8DhO0qrDThOo=": "4231684000000", - "x8pYfK_zDE4ybDU7IwzuT94OXdz5AyWS-laxymfKyss=": "4562969000000", - "x9-zUVeu6cEcgGP5PoYJToX1_lkY0uAWc-ekwe6M8u0=": "384615000000", - "x92MnCl8RiNtmn5h3-UDzJ5QcSQsB1rEnB6fuTtC-14=": "354326000000", - "x9DphxioOKWo2m5zW4BSDvLFxEUIfZE1l7APWcmbrPA=": "499352000000", - "x9Xq7A-n5yRQMW_SlOLGrIp2s_eA1nh3FSQNTWGBcVQ=": "406884000000", - "x9cSvwjZsnRy2R6ENO4I2jdVD5QZx2Fatr_GagywGuY=": "12690742000000", - "x9gDZ6WSu6JJESkCigRstaaNWFXxhuyHqIOzRi40Cwg=": "499999000000", - "x9rQTdcKKYI9hN1wDn17z_i2fjYkboP_4wvpOdR60ow=": "767169000000", - "xAIXRQvdLrQuVi0Aq_E0bqQMNDdwmxAQjdZToajjRpg=": "780611000000", - "xAuJkR0Wgf_OyNf7vAZ__vceKoL1n7RO7w5tn8j399M=": "384615000000", - "xB-17CxYLiBNr_iyoqdLYeP5VgmDzvfY_LXrs_vic-I=": "38461538000000", - "xB00KsINJyWBnFfNKlyro5-apvZEtBgGoclG-4QGCGk=": "459490000000", - "xB3HHIw_gs0OTDZYcYXlLcQlP8DXDibmoxqSY9lAzQE=": "463041000000", - "xBQVVAy7Oct4DCJ0qxyBHmZU2Wqtt1opXJWMbcAdu-w=": "833333000000", - "xBfKAQFjBRcAXscudnJ2NDGVa2YqWJEUpqh3xpLj6I0=": "414596000000", - "xBgopoKET9SjWK6opVIi7_wPaXxE9M---8M8NYl-BY4=": "412211000000", - "xDAlDWEcBRWqVygsGabwuZ6bGuZHqjrQMNYYRo-6mGw=": "482872000000", - "xDBIG2wRYCj7hTn1qJwsOJxRDXzJMMy0hqVrNXkvu-4=": "20881827000000", - "xDFPvs848qFvVzziRcHAF2ldjHwY535Z0UUI5W8eq-U=": "385507000000", - "xDOCMVwpWBp7Pv7qnfNxqaB_KyVoEZw34HxCEm6bDxA=": "763848000000", - "xDSH5U35xWGJZ5ZubtKn5q7KlwpvqLHa-qOd4AtXPAM=": "556934000000", - "xDTVcjDANy0xVfrwEjnhcuylrfuDbEgSG-_ZCEFXkMM=": "384615000000", - "xDWp9jo4DmDjaWXJ3K-_fg-zMp2GY5cI9Q6Vktg7Is4=": "469468000000", - "xDY13FjMyhTM-xomsqxX6_dzvaEuDILN3jbfIFD5-oo=": "1136384000000", - "xDYHpBA4trR0tB34vpViHbL13TYBfC_ZLa1hu8KNxz4=": "422561000000", - "xDiS2YE2FdSOKpPAHs9tfW_Bzrz-thvEOKEt4Au57Eg=": "384615000000", - "xDuKcTcu7u18tNTTd1OyFJy8-TUcxHSyW_B_WlGDvu0=": "376979000000", - "xDxXHNexgJdsWuiUjlsGsUsHij4eoowt1clqJUEO0NU=": "384692000000", - "xEMwOruM4tqC9WQ7KJAjgi1jsZ7EL4Q8bcO6ihlgYsk=": "2559199000000", - "xEc1dmiPtT5-DdiSpyMfn6XebA06Q-pxFz-Yb_76V0U=": "430694000000", - "xEdbMBCY6pr4kxi17QakCfemZwo8RMG8XDJy6WfQEzQ=": "396376000000", - "xEki9qEWNIMqV-3Wlt8PPSZhEt9AbtXGX0AA_ioGFQY=": "829551000000", - "xF26wOQerj0LuVdFmFnPiwaKLHVShhbtBwNWU1wY8TM=": "411085000000", - "xF8dEGjIsaQWORtuYPfynob-iCRIHk4DfDLotXCso98=": "384041000000", - "xFBBFP3HTc6g0hcViCoP8Cyyz_2Ql_LHwA_9fNgGLkw=": "454242000000", - "xFBHhC9oqXdTW5nWeFReB41OWXya9Go1WFLdn_jK4Lc=": "1920404000000", - "xFGQv5TD62LS0uvvVKgUhqfngRlCQLDV01YO-uRsiL0=": "769230000000", - "xFn2frNoSAYqsV-cpdQYGqnI2b97RICeaWYSKKNr_IQ=": "902999000000", - "xFt35IO4-Bp4JMBA5VzcWLAYPC64MHkOk9NM3xFDIgo=": "387131000000", - "xH7oMpw52v17NxGwCxRDJ4B7KDFkW4Sr7oEkAT-YhYI=": "1528665000000", - "xHW6J13OntUuVhmFUW-6mAmUASSz5SjGyoNVr1dUglA=": "461654000000", - "xICuJuU-9TKvcEgIdwA3M47pcWAHNOWmvErf8hNfJVU=": "385506000000", - "xIEfDWuRsMW9rm2DEDieiWk9LQr_vomzsldlZPrTCH0=": "417384000000", - "xINUjtTfKBf3HKjqdb3FWK_RBf3AS9IjXIF-ncAXkgY=": "462821000000", - "xJN0X0HA7SIxvcZLvsPd8r4FnfrGEWgtKlKla_OQKRY=": "384774000000", - "xJfLRWsvbNDTkzMh1uY46RGbINENWQLQFwZSYj3N5yY=": "704796000000", - "xKRdgevnF2FW32ojBOcYnTy5VP4fR0fNsO2dlW7sg-0=": "502779000000", - "xL14BvzUrbSD8-ainhJnaPwpe8YdiE2vR-QA5vLEvZE=": "384615000000", - "xLBFFydku5NlK6XQytdlQaUPXCa3l5ksgQ-c5_8F3SE=": "1156522000000", - "xLDnMoQczQ-DKrZ2sn7x6-6ynojUlfoQBoKsyvg2er0=": "643269000000", - "xLUyHyJanD6pA7eERldYcvwQTdUlD-w6C7GDUesUnDU=": "393108000000", - "xLZckKsXYrJXkInnwv3Xjbdsy-yoRdFws1JXgvdSBww=": "384615000000", - "xLfub-cYovfRJNDHvu3WCLGiAROYjGdOBdyJXdtu13c=": "4154883000000", - "xMADYxChYwW828V1-SPVx0ejE1sfLBUUcMyKRFcfhmk=": "3127059000000", - "xMIPKKf9IiCsEQX9uGnAt4_jiCbZo4ym8u1CPllyJiQ=": "470031000000", - "xMXBJGG8a3wIIuFijxZiAuyLfX7gVomLS3sNgUCIHL8=": "384615000000", - "xMmcuqiYch6yrX9GY87cafPL87csjpHrmasfppyXoBE=": "383160000000", - "xNq_L2fuu8RP7a25fGCFPRjGnt41SpoqFSNBsDd0fuo=": "421308000000", - "xOF4AMoldA0kuxLEI99wF0kRoUvtOjcO4X2Mb40geSQ=": "378140000000", - "xOgGw9NC5XkPIwQCgTVrWodlQmOfV15agPy1Lppbd4s=": "2083479000000", - "xOkdn05qsdyy5p6haDJ9x9gK7bw__wF0cwF7c3jbOxI=": "753217000000", - "xP-1dsPTwGEVtMmgwVeoSLtE9w-PMaWSbfsFBdyNfI4=": "470368000000", - "xPZOJYNxiCNvsGcILaYgD2On5bHyGLNBeGhxcnJubxs=": "361173000000", - "xP_KLSQY5scsGrGmox3sEurpcVch7ARAoBO9BOpWMLk=": "3333333000000", - "xP_r3F50Q9E_CNqpkYlFC0gwP3RdkFA-zV-YXOE8vrs=": "1777958000000", - "xP_wYQJA17ozIKFQLJjLEHP7j79UIzkD1W9M8iAgKys=": "1645215000000", - "xPkcwGXX-MtMM7O2yTNl_cuES2CNehneYHFa0Ap5ACw=": "786965000000", - "xPnyX1mPy8KajxKEeHu689Kdbx77KG5N9S8TxIlOu6M=": "1918873000000", - "xQ3NpPBJWl0bTe3WO_mny3OwhqDCw-xtX9hmIeJ-fxM=": "382506000000", - "xQECCCDh8I6REM6VQ-t7fwvQezJ5Kcja1bU6f8JQ69U=": "2916666000000", - "xQcezAH1fSY2VAUmSxl7IhBT4TOPnzafFiBB6YMYyIs=": "416666000000", - "xQjdm9KCMFuHD6H2EZoQMjs761GcyMKgZqIW8ROc-9c=": "771530000000", - "xR0GIwf7_7EgQITDGeizLUHsZQNEPU0Sp487OPXbhw8=": "964539000000", - "xRMhhJpllbipC-Q_STQ2OuLoF_qEIYjgnUOKztmJ8N0=": "3979208000000", - "xRPonO8UcxIZwee0NPUn7ngE8jkdswowPD2UxnlNLfc=": "1153846000000", - "xRSipzguNdm9rYyxUfU07UivGJQFQn89XXjo2XywYIU=": "1131804000000", - "xRSrnMHsHm8MtQ5SilqLc3phWAqccY1jIvCejnjq7Nc=": "356716000000", - "xRVh3wmAXizN1lrjf9sF3eAEjlUNW1yIPhIQNoY0S8o=": "384615000000", - "xRaCY_7FNXYFznBupXNYZmsCMUXuaKbK5s9notHYmFc=": "394212000000", - "xRrR50G_nmnv0_nCfaQzRfEcCstPaQ8uOyiPNJsjTbc=": "1126724000000", - "xSFE6mcL-TMDGMvVIsE7QNkBTdqQbCackg1ua5QZHkE=": "2311154000000", - "xSWLwFEtiv7LizPiHm3EFSW6jGTAquX6f7Ke2a7jC1o=": "449099000000", - "xSps_14p4MrgY_2hbDhwO3gJWOVfXJ-Yv3IR6E7YHlk=": "384451000000", - "xSsFm9wxXra5GXlcaF8KqHGNFXtN-63M9YiWgouQjRc=": "1154815000000", - "xTAW8jFDRBSg8obQNv6Q_evWEphpYrjyAvtN14iVoNY=": "912739000000", - "xTFjlurHk_aw5f-Zq67p0D7ZL5Yw5udtOcBRLs_vcNE=": "481282000000", - "xTQr1kiulplFZyIsOOUTZo6-J0oZmgKP1ooeaCltLdo=": "1136363000000", - "xTwGFsO7o42G_mwrzOGrEPpWS2UQZutmIlU27F2f1HE=": "2306306000000", - "xTzdWTdrjMAx1qsVkwPDW9bzJgbzDVKlk9UB7U0lsYo=": "538461000000", - "xU_tpmIhwmopvKRUMY1cdyPMcUAE4cXRIRNEgr7jQQE=": "1186497000000", - "xUjgnWv9BM4elrc87TdT6f2324xeNLmauSRMYQLF0c4=": "981674000000", - "xVLrAVIuR64qZlxG-oJ3FphJz-n52IGm89fCKFagUb4=": "389443000000", - "xVYjNmCsPJI0ABY0d82HByQ9C6U_pZYuugSqHxkDKGE=": "823211000000", - "xVYnQFimkYLjemtYxFfz0_54hXmgaUPeqpuH03Q9QCk=": "384084000000", - "xWxe1zYLEvmavsAu84escGyv3IBKLud_jKBrQ_GW4cE=": "1153846000000", - "xY0tUUzduioKaLdRkHDCTWF7yCGbmmgaHncmIkattPg=": "2307692000000", - "xYfrY12STKtul-OajOWjr8YQpiLYGjyIwBn-P26or7A=": "2604038000000", - "xYiMZPg1CduO6ILJD8g2Iur2600NGJ68-QyUolgRNV4=": "492028000000", - "xYtu_ENmwg0ZGmxae0UZBvx-e5yatvIwJW9lqh8amPM=": "460366000000", - "xYtza-enOxLQQWsu4Rn1FOw05hBETjOYdePhkx4Wpjc=": "394336000000", - "xYvthzFixyXTOy-Pzuf8rGzyPjFIgvXb-R8gv13aGL0=": "6435418000000", - "xZ27G4bk-nxg7-OvSCwfBBqMT_NBqsi4PV2YRV3f-fo=": "416884000000", - "xZ9HKLCLmsmlYSFPNImhPg7cnNKJIlYfy4GptRATU3U=": "469837000000", - "xZKTizazIRD42z-9ZAIXgWd11FhQ8FNLyNfa0D7Sq4I=": "454558000000", - "xZymcNqYf-gva0619VS_tgl4sF8nkxQE1QYzbVDnNHQ=": "457736000000", - "x_Q-uc_DsJugfidFlsqAa2JiBWad9ppqLJ6z5RTshw0=": "3777401000000", - "x_RuOmYnmm6L6MfLwDTfqqSPQ48umlVZDmRRvKY44TI=": "386615000000", - "xa1Ueb9Jf9Ds-ykrRRDVxShyTuSydH_L-rMGQFsER-s=": "418859000000", - "xaITeL_LlETPkIFPNRZSRzADDsfMX-B9G27O66iYlx0=": "1884612000000", - "xaNwbM5PEvJpLQ7A99uH_STGPntUQ7F0R_aIgz89Qxg=": "52815370000000", - "xaoePq-kaH0MD-YN75dUuLQLHHRsuYP5NC2KdMo5Mck=": "1393048000000", - "xb8ktbgIkaZQtaxydBlA0uH7xGhaFzkErxx_FxjfaQU=": "460559000000", - "xbpKTbuAz23AIUU8f7dH5bRMs8fEGcWXjsye3com9e4=": "473001000000", - "xbsTLeHzUhR7wCgfAw3S5STant3QLGIYvpVeRattPs8=": "392695000000", - "xbuySoProKx1AZyomPw3fejzzjGbJtGBQhHi3AargOE=": "1923495000000", - "xc8wQ4vx1WXpf4e193DZy3qHqBtTJ6YU1fE70eIclUw=": "34321730000000", - "xciuvAT1rtMHVWXj4a0BnIoHjqecLsZm6BXk96lMJ9w=": "473692000000", - "xcwEuzqqI1_aXSENfglMQYIp38n8Q6mUnk77AodOddc=": "31249999000000", - "xd3elMeolhMiLIq_E_xrAiXvqGHONiU7FcqYc6OgsBA=": "383653000000", - "xdFMOFeI6quWcBZff7kYWc2LgWki7PxVrBVASRQ9o5g=": "2272727000000", - "xdckNnvrQD3oWfkydaME_iSKAJVN5avD8CR2tYDmtOU=": "379970000000", - "xe9H0P17kF34hZ6aGWaCMwkQjQuYok77FlShbh-IN2Y=": "470034000000", - "xeEh99EpzNZmt-wjHeWgpbmQYA_SyPv6tW4YMd_Omd4=": "402004000000", - "xeYg04ZNWRyqwwAfAh-jGuIL2sSYLyZxoENs1uuHrQk=": "442128000000", - "xeZvuwPuFdzGxqz6ONTlwKCI4G7xSWgHWze6tt3jP8Y=": "457651000000", - "xfGWa0ghVCZiHlQd4L5IHf9rTIHUuFwr8HrNUmeZPFA=": "462839000000", - "xfIQ4DQOOM7UWBY7tGfddi4urWRp13whnjXAWkyETpk=": "527648000000", - "xfaxS3CqJIxWmlnBlLWFBKq5bLA7sEjdpq2-bEU-Snk=": "419319000000", - "xfiHj3ixzGdHx1OSzWJA7_2QFPWBKAe0bS0zMrXNN58=": "1538461000000", - "xg5fYqyapidTS5P5TQhrkZxrluO6M9apFxNMh4hYobE=": "384274000000", - "xgLUnxniAqaLDNFYSPgYdFudBiqXVg_ipECcV5eJd3k=": "384615000000", - "xga8IBtMzjOg1f47A1kDahJBocZDf1_jhz_iQgwSuIM=": "453082000000", - "xgiKNhC6qgTH16Z2Hmk8aL0vhyTrvlMlPpX4Hen_l_M=": "404478000000", - "xgkQdm5rKePUQFNkhBDpTSSBS_vWl1lAZkXjKRVIePU=": "376163000000", - "xgvPz8l8vaTsieFkir9TP8ApmSTS5oDDMMTIr6z-PzA=": "469837000000", - "xh-xTiCSZdkwBYv73WoQP2MvCp0q4oWSMrIQv6G7JSQ=": "393904000000", - "xhCVK3vSgga2asPO9ITiMqmT0fr-5N3Yoptc05NYGGA=": "750997000000", - "xhClS1X_tMoN6WshoV9LpAW0JMg2-y_rDNL9XQFVNc4=": "418737000000", - "xhPLXhqDHw-68eXWvD8pT7mvtxzSLuMXB8txWlof_Kw=": "1540006000000", - "xhPNgsqNju7pFVqfVBX6T9oQA586mBNfrxRWG8jSxHQ=": "384615000000", - "xhaE1KlSk89caNff_tJu6ukS7VhzRCNj-mDTJDhD_z8=": "385007000000", - "xhf0x7kK5IARTjx-dt8Bd9ectgVarR7eK1VSMYsKuBw=": "4200605000000", - "xhgu7saE2F4bZiXWqH9Kv0LmdCCSmf17wpxde6uWAfw=": "769230000000", - "xiXlqxuYFfX_a_nXRTZZ7184JtpewArprGPpbobaN9w=": "2278048000000", - "xidxl7FRT3MT6gfcSiBQQiEEevE-tmKqc-jr2zUeGt8=": "383558000000", - "xifp57g7AUQdjqMIGhRzh4t7BUgDZ5BUfK6PLf7tSRg=": "1154647000000", - "xj59unCgpHGftTiEC-y3VzuXMZkC7nLW7uwRYQgLv9I=": "424269000000", - "xjNE_qpoNA9REsIuhJ1Q0DmsNMjVrqDB_5jVcas-Fvs=": "417632000000", - "xjXk6m0c3GuuvQSNpUly3GgfoUAAeT0zYpOZb3YsiVU=": "3842827000000", - "xk3o0xoev6l0OMLH7WjOfklcIDD0g1kP-CWR-P-wr-o=": "847212000000", - "xkBCd1_f-KSLhcAIYCJfcPeUeJn-XTzbFPzYIom0aFY=": "19230750000000", - "xkJu1C2NRDft0zE-pTIR2W9vJtJMyUaAHMItssEUjgI=": "386214000000", - "xkKORoUPKlyDzw5Vn5FFYsaVgATYzOVC4XtoRPinyjw=": "384501000000", - "xkRjjIA9WXjHSK6WFtJUpCCiSCsDWO6T9cjYAq67eJk=": "416666000000", - "xl-UR5MewBy7qMmfulunSyzXjr9E9xoLgcf10_QxrZE=": "419271000000", - "xl4GljbVqxU5DoDy4Cd2vLLAuZbhCJXBY_HLCREv-4g=": "384615000000", - "xlEhMXCz-UamxbV6INH-7sfWAwSYThTiqdfeCDKzU-c=": "384483000000", - "xlZbrKwJGlStGNb8ub2M5ARUknEv4P0eSiw_EYowOAM=": "460821000000", - "xliT4n9s4mRqlUHV3yLt_qTdompoZaAOGPM2ru9RCQ4=": "817363000000", - "xlis7zT3Yl0VlhtCFNrnT3FIdXwf-vfxRVXH6tyAEPE=": "455600000000", - "xluHpwvx1_tWChRLQim9pf6dDjkDyuHelgsGgPa_i6k=": "455266000000", - "xmZ3Hm5Usp0TXbv7FYjIfgMxlNM_S1soC9II8yzSMbk=": "384615000000", - "xnJvTnKDfyE2ufJXq10YvYnKvWCvKGq9rCnOK6NLHrc=": "1668981000000", - "xndgljbFaOZlp1jGtSQmr9i7UFCloFpVBEUT79gFPno=": "453132000000", - "xnlOnYJpJB0aaLOiZCbRoQItF2wUKM8dqHyF9RjEixM=": "454545000000", - "xoBnMdXPZP1UlRSqCEsuVTDBjz1dUAk9juEqXpQ7kA4=": "569308000000", - "xoYLPkK0fQVMcjo7YYR_mLVjxuJX7GkafUm_5OjXWs0=": "1002212000000", - "xodIg7eFrLLjg8nzgrB_dCoi5xDzafRiUBVw7XwKHgw=": "382080000000", - "xon59mzAeft2Ib5p-Oi_DmQtBlZLBu0AjOrdG_K_ViY=": "752339000000", - "xoo0NPglqKeuXJ-0cifQbJ04ZhwlyvTNA2IUREnodgU=": "620572000000", - "xp45lqxT5ca9dqWDRYfal9GNlQI5qEiAPpw1qliEFNk=": "1156522000000", - "xpC25l3jmNW5RyQHoF7pB6UBqBSjbjs1l9XpBvD94ns=": "778772000000", - "xpOqytx8C93k609TjZnK9nT73v_vnBMYbk6VhYou6oY=": "4211455000000", - "xpeI1e79GVVNomJM5MAy9wmwUzSPfAim249mDiCzC_c=": "378078000000", - "xqAVuFz-Xo4JqkA6uRZWK4roYEk9XSrTOAHH0Ud8UCY=": "3907499000000", - "xqgJG-C39WXfTq2wMReIje4EvPeVKHQz0oQBPSiCt20=": "417633000000", - "xrGnhlBU_M-y9nDVzJlDJ05ub45fPoHaANQRb5NykUc=": "384615000000", - "xrJozIhuz3qRxPZRQEoqhPJ_vAugAsQbA-DDA5ww1X0=": "2300826000000", - "xrl2DYVByeEvh3X-g5MITIsFpTENhmpcRGNadiFoV0c=": "2689377000000", - "xrrJuYLrt3BZSCX6dgaKzuCNbjewuKZMRfryc-YOO1E=": "499999000000", - "xs6xCDsZK2IFtZT0pdhGIcuB6Cj82Xr1qRNMaJRdqyY=": "1247328000000", - "xsEggtp4qnhI8BFkhUM62-eO7hnxv_1-zAtADowJst4=": "695642000000", - "xsQeTJl4AL50HqtT3OnW2Oe1trlX7SXqvzktZGY2xKw=": "384751000000", - "xsRYzR8t_VWUVDXfyw3tt7uJ7S8bMVcs2-G0twGE5yE=": "477107000000", - "xsiMgc-F5_lwGjTh11Wmde9AlcubZvVdCKgle7pxd2w=": "414775000000", - "xszTtw6avjPqm0IPHFUsu_TAAArlLPpWlhEeTvmUeTo=": "385506000000", - "xtHRYZG_2OPZb_fkp5sO52XxfiPQyc2pkBFd5YRC76Y=": "384615000000", - "xtHXuZq7s52eVZeDJLVxId8Ho_lisLPX-KwtWkA5WuQ=": "1269762000000", - "xtkW_8CyM1f3hjBaaHMp_GiYebONOTWZ4Hai2fzrj4M=": "462839000000", - "xu8HwG87CH71XBx1qUkPU2fi7PfUSTAJKVXncFI1dLI=": "12577847000000", - "xuFXVMFDjzZabZVN2xrl9qjGCnFmEMG09Ir5HRRXMC8=": "425636000000", - "xvTaBqUcmZD2hBq10SlIhL0E08zf8WQWOP7Jp_NAr68=": "407808000000", - "xvjtl2pRXIX7LN4xYcOHGlxLKmTykx_wj3DXDiTcejc=": "1153121000000", - "xwNP8i8qnH9DNAOW-SFo_TMGTEl2OabWUun_G_fQmHg=": "2001661000000", - "xx-jAnRWDNIt48GQXOxhWQrb3dUlI1GJuZj5dKcujR4=": "470605000000", - "xxPCgj230kONZe2oOspL0P9LSr3htSlbDgNsj2wmxSU=": "781016000000", - "xxPCsnoJKTdgbFhKebv-jKT-OZ3pYgTTw9RoTT-JKgE=": "976078000000", - "xxppattN3Jva0ovJ3GwEjHqV8U5QU8BwJvbm2cRM_-o=": "1997136000000", - "xxsi5UhccD6XVcRjatqWLc33cAl0MmJ205ww0HXnMdw=": "384615000000", - "xy3rIZTx_VRYinRdc_piuaL-3WQjOB2Pf8n2Rop7MPQ=": "384615000000", - "xyDP4zi5nIeGGuMK4I_olKT-qJnF1iDLgnwyVffIS-E=": "454234000000", - "xysVWHvFAeLzuOB9yQYxlnbPuw6-ZDUTn1fQouhTCoU=": "942597000000", - "xyx4POE5SggVK_Te1CUYRrryXpug4Pvnnr5_TLQkDrU=": "424816000000", - "xyyL2jeiAUUFVWw00WboKWO-E9aT67yZNFBPSthAO-4=": "381454000000", - "xz6DupV5v5TIlGvGRzTBIk_2KeVrAWpzVJdj5RFbJvA=": "2062284000000", - "y-9XmE1es-MI4bVH1v7H_DJmtyaKSJEqL7klzQa74IU=": "423004000000", - "y-UgS7AVshq3Evg6mjWNKz-XLw7QLCSp8AJDG1MdbhY=": "455600000000", - "y-WPF8eD1h0IIyUdEpPhRy6fuzXV1322Pu-4MXrTNek=": "1155348000000", - "y-XFSnJAhPA9K0PxBbbCUvV-W6_OY2TkUoz1d_-6sQ8=": "500445000000", - "y-l_ASLh9pG6hWgZvpBGb11zsmAKewGwOzFKOuW0K0Y=": "924724000000", - "y04uSb7PcKGBu7XK0Bb2vdReToUU23sq8L7VjqZ2pG4=": "454061000000", - "y09hmq-tsPXBZ50QIE6pXWJ9C3U4-LgRA_CGzk8JbWU=": "406607000000", - "y0JP_GbcMKkSLHvfm-n0Qv5yl_Tc7atuAyBswUDXv34=": "406449000000", - "y1MIQ1ntDpTo21to0dBH9nE92zcc2UFAaLkevQStxDI=": "3855058000000", - "y1N5oXlAWVI3CksUA9wgTrcbeB_7kMan7vDsvTmSEeo=": "626852000000", - "y1PomsekHBW7-BTs00r0bsGIp23gDzCWMjgBBWkuCWQ=": "464371000000", - "y1TzGriIZft-sdNMRc7r0ujcqVaX5-5u2e-bEzyRPSY=": "23417975000000", - "y1dTTM1Xjk4z0sdQnKfxd3ueEt-yGjL0H4n6tmcHXSI=": "411085000000", - "y1pULWmJyYYUEdlJDuh3otdhPbTDUJkf5Dgqzzeq_o4=": "926541000000", - "y2EBtKi-7wIdSxairdSQdom6nh52r9z77GkSE713gyA=": "543101000000", - "y3dCwcsWBjV8soFHzfwTBH_g2sFD4ecJgzsvX4HofXE=": "2077904000000", - "y3fE6aNvZpLPTDqefuwUN0nyWR15xNcNQumCuCM4I2U=": "384120000000", - "y45m6ZZgGT6n-eGWtqG41A3jct2ZYRBbJnkiCqJLp8M=": "647352000000", - "y4XNjEF4I9Ep3Quf22i4DZagpf5KQ1Rhr4OmLWscHQk=": "415842000000", - "y4bdU9QL-KwGlGsEm_bBM3n_D4l6C3Ln4aBFvAzbBmM=": "415389000000", - "y4tejZt09y31x_6XtH47t0QNvNGViiFdIY_ugJq9Di0=": "770269000000", - "y59JS-paJ3u8Hb0iK-uIh1PTmQXDdniZS-jXJJnVCgQ=": "384786000000", - "y5OzJu-_GNiSJHlmGoejd1mhNPraGAe6GOSOVfSjTsk=": "909090000000", - "y5fbvhl7nSjujaFN5uA-e064Vk7fzzv29hORRM8Q-5M=": "384615000000", - "y5whyW0x2TA67Jb2a7A0qrnHqiWGEOy67Puv_Xf_6wY=": "825277000000", - "y6lqGtX88vsbNB39GUqkhyUT5pJtLVRyiPtZThh-UKU=": "492314000000", - "y6p1DjzPdrRv9E7y-wjbLYfwKsmp4Lh2O63JrfqJgw0=": "384615000000", - "y6uiJ1mXcgxxTjEJomWKe83HuBnUT8TwobcVqDCW7kg=": "377783000000", - "y79IOx-uFjAqLImbwfoHB0EmRNOMImN1ay4YDeLyAMA=": "464089000000", - "y7Ers14pnq4Mqt9LKiwblZd9J1syBXd6q-LKKZ3C-8U=": "379558000000", - "y7NcDYyvnI-pLA0YahA9nvqdCVxtDUBC21NQit8znUk=": "385505000000", - "y7Vl04nbvi2k6V_ei1BG2R04EmWhi__n3dNJBZysrbE=": "20831130000000", - "y7cPyPv97_1HlUyKkTuZIDKDjz-AdnimQLaA1WxrWJw=": "1872083000000", - "y7gdsH1EfGAYxAe0WbIvzSdgBqMmC3TX_Fm5stvl6ME=": "461801000000", - "y87ltmpBcl-_Wpp1y_Z6V880ea1qqaSKA4rRon93POg=": "416666000000", - "y8AXu3iv-i8-3Gnk_-cEtbpPA_9EgZWys0uWGDbVlYM=": "452992000000", - "y8MjVwzRmnkkdNGHfpG5cYfL_hKDxIdTMp253xZChVc=": "1751233000000", - "y8ovn__EPAgGkXIRG8JSkjyI1x7nkpyNWdV9ztHcARs=": "3626457000000", - "y8uhBciFtjBKrmbQwyxIXhLeIYV2rh8ykL5QXMfBO0Y=": "384631000000", - "y8x4Uqg5Ba-QHHhq6KyNe6_hpI7Qdjf3sET9tA0tXYI=": "769230000000", - "y8zkbBoUhzz5FKVDcrQwUmTHquC7gUWpqDajxrwbgeU=": "384615000000", - "y9IUZZjT5GkNbyoUN_P_amHzdmMckIf-Im_G5LHxeDs=": "460442000000", - "y9TR29rWh-W5ytYF7KgzYio9QOrCguIVmAzWlE1S2Vw=": "2310823000000", - "y9Vh-vfFviQIeuyhIGaBdX8N5X9d1UqbEUvuTwwp7ik=": "1168476000000", - "y9aajAQsiGK1kNz3vkVM1cyZTC6nuJFomNUbjzh2zfc=": "458460000000", - "yANmP8tcJRIopKmM_xzDeUoKE6w9EMkVkgIV8pnhJ_w=": "545837000000", - "yAabJj81NKXcdwI-ThHQ0eFbUVPIEATndI0MsWRMBA4=": "385509000000", - "yAlmSd6ewlcMBbspuZX0UisRycRNcNbVa0Z7Yz1Go4A=": "465712000000", - "yAtK7IDrAWZXvMOFC6ebL_7tbP_H8vKYSL4glW2ilhc=": "382394000000", - "yAy7YBddzyMzOCaMf0ghDE8t7z03U-0BBYVO_4v0FKs=": "6396061000000", - "yB3smVL8nv2tCTNvqVI_DjHagATNZHP4CcJ50dPcNgg=": "1484507000000", - "yBYJe17WRYwNKgUyOCWbet37a236Wkh8_U7jRCV0EQ0=": "3557016000000", - "yBbUGjEU6L2x3kECLQbHlj7NC8HeKe7IHDvWtd-CEV4=": "384615000000", - "yBbs_Zdi97aZtjhaDnMAMxhUqYXTC_CsANZ8Fk2iIIo=": "458314000000", - "yBzEh8PUFrIF48-jV7j4oNR_G85aJ9ZhcyMnZt7wwIE=": "376889000000", - "yCshPvQnbod8xXr7jHRSnmc6upKXix9g-VGGOHEzcic=": "878096000000", - "yCwBq4EXiVtzUjGg1kvH6EkRgLYBuDiwI4A3Ac76sZQ=": "384425000000", - "yD7YZ83VexPBRgejqDV6BqwGc59uSLjVYnNb8EzmyOs=": "1510256000000", - "yDCqUM-HuUfgzehANhWCIBQGl8PpzLKX7q6lcMd2j4M=": "415819000000", - "yDKArBTg9EuUOGRUhM2eQ_wSRd_vbmuHVs9UQo_WLRQ=": "11990846000000", - "yDOGV8aajNAEMlObK4QxhTnZp7Hmre41uPfavtF0QxY=": "385507000000", - "yDjqNjsdeBQQMI_KqE_bsh3GmzlfGRP8yMlV7Fz2N-Y=": "4603727000000", - "yE3SdNLQoAMhDpzLyvE3FvR0VkJCDGZnXxbZVjcpbO4=": "574968000000", - "yESrBcjvPeqgINx4zJbubY9LLXX0WX-RgiEFJ4zPF_U=": "389441000000", - "yEwQqfbs78rdsQKk6n1bwsrVfUm5sqoFtGtMtohHHNo=": "1030769000000", - "yEzqEUDtbjo3JLMKZWKFQ3sObzg3Lz9pq4dJdoGhh_o=": "379928000000", - "yFOTycJiZOzjX_RcO_uEGch1XG9JFY1dHuPQ-pq_Ghw=": "720740000000", - "yFU5DjAPnwGJKp5GIug7JzxEIZ8ARC9FDVpkM1lCSy4=": "7692240000000", - "yFWMTlX8gF_2DpZ4JJkNkJcnh_yKq2kdwbbe49q1deo=": "386498000000", - "yFuRtSDPC1desSuwB9nP4-viADuIO9Yd4mtY05LYAtM=": "3659444000000", - "yFuyTCmdzsHxdVzZtHdFXr3zoYoJmW8AOgmefkvHKlo=": "448838000000", - "yGPqN1fQ395ncLf1Z5BeksmRyluvlmkvMDG2oJJsAHY=": "769230000000", - "yGn3dVV-uMh5veluUX0r2p-CwmlXhECC_n9cyEFA5KE=": "382394000000", - "yGtJF-kdq3UjSbky4p0JjjYUlWentIXQG4pJhTOIbL0=": "850155000000", - "yGzFjdyb2DUTXzaQM_EElhOEAIbs43_cwUOoXOOCpfs=": "385962000000", - "yH55o7xgC35wN6ElxVb3atd5IMc8Q2A77qBizHuZhKo=": "388354000000", - "yHPwxPwwvtqxS8t-U_i2rF3mbNL3yKc1UAhKTuADmbU=": "791457000000", - "yHQJxrke2gcx_tCsDniAA7HjKa6rscEcowWc_rrqahw=": "377851000000", - "yIXCsC-tBZ3r_V65VsLNXyUE1kzPsxMiztzsT-nxbz8=": "573591000000", - "yIlCtOjQXAed2MUWjhG4GaVK4vK4WiNA3jkFoxKUUEE=": "838750000000", - "yItCS0iuhmRSwTpnaP8I5mqIZHB9Q_XdeXcDjFz6NIk=": "419023000000", - "yIyzynH8oRkkTY-5qhhZzcV8jv9I4rOY_W7mcEKAacY=": "454721000000", - "yJEQ9zQQVWM_YxG31YHUF18pSxsLJQAK3NV4TEMr6FY=": "1814771000000", - "yJUPIGsBKT5i6WGcInCMx7dAixCBKik6CxvfE69o5tw=": "394118000000", - "yJe2vVtNqv2GVTbrrt-At0EGVG67gRJmp-Af2JYTn50=": "624999000000", - "yJeBwV2x5jv8NQDmJ2IYDeIi94n6D4WbBA9vfqUxk0k=": "391885000000", - "yJi1mf5Li_FWlz8xUrQwiNEBHmZ9hL5J4ttkDGnnTAs=": "417087000000", - "yJlgrsBVg42fCsRI-9PfduI9n2Ap2Peud8Q7CG1Yk-w=": "2692307000000", - "yKA1OMPbxjb_TtoUD1HhgVr4uRaF_BQH7bTM7vi45mk=": "385742000000", - "yKADEDgyVEBbsRTRCU-flnLwi49Fmpxiigmj35r01rE=": "532838000000", - "yKk0MZZMfsAZgXxeN7WQ3sWKFXO6-wC6ArM3uYWqPBU=": "1370847000000", - "yKoJfxFOAoK4aDR_8lCgFECIygwhoz_3pylEqNB1wr4=": "2131613000000", - "yKq6OFz2pIwGW-F8JHlIs8qDSnf3503dkT01izJtMDY=": "460412000000", - "yLYmxDspelx51dn4snNC68XPlLfcqCpZpiB03JrTUu8=": "509711000000", - "yLdE5J8NIhmS0UDKv2xLUnQf6Wq7v_O80Mw2z4HRwu8=": "2892744000000", - "yLuS1M2ngqIneS5TbcJNwQkdXL889a4i_sseWvGG1eg=": "1244967000000", - "yMsqHhTiBp0kTUxQlY2E6C-HKRmh0H4sjqqHoR5WHek=": "2494023000000", - "yNAuUyh_E-Uy9HFzOe8awcwKJhwGWHgKvV1uxVx8Www=": "1355115000000", - "yNdNzaXcM2sKt4oSEBGB-Q_mcVcYpU-3CVnbgmHxqGA=": "1538461000000", - "yNi5FOf1rl6Zfyn_7OCzk7Vt2YWn-5N60HyAQc2iAS4=": "387951000000", - "yNkpUlQbNlT98cOvb1-_I-GrKTuv_KmzCkOX4W9KCeI=": "416645000000", - "yO7LZ_wKccI-VrURCHyKURJtxCYE0Z1mASwitS8WY6M=": "396483000000", - "yOmbN12o7tywj19fh7udZ40DicFUQfzUahsvKfLi-ek=": "1256379000000", - "yP8CKgs4CaQW_gOprhRmJKkVqfqFmU6QjmknRK0Ys9k=": "386922000000", - "yPO-NuhPunKS2jW3lUnqZ3-7UTVwJERCP6IB2up76dI=": "380577000000", - "yPkkZku0NQHI-EnrwQwTFAf2L93iYL9-xJ9Pr4hvAXk=": "384615000000", - "yQ7mRW85EjQKhOa_Y4oCsQpQntTqkBlJYCoz3fTGpLo=": "383032000000", - "yQJ7UG65K4klEx-dw7nzrcHWQjMK1QIm9OUF9GtrKGU=": "403990000000", - "yQdcEK6UEH1ORDLkU5ABDFUri3T6L5pkD5dzSzcJtc8=": "539157000000", - "yQhZXrlLIoqjrh2-70veckJx7GAzsPSSlNxotA54k28=": "384615000000", - "yQkfsi5sKUgWNTE7QGUF0BqKHvvP-thMbo2OYxcpXxQ=": "384440000000", - "yQuDDB5LKh13Btxcfyu2SjDtA_Mtvi3toDD-9ZaH014=": "391797000000", - "yRDRZFtlGHWygIhMMHJUDaER7dsJ9BY1MMDOE2-tPoo=": "3665193000000", - "yRLR22tjdWexSa_c1lARtIVb5un_qS2ws_TjMA7D_SI=": "1215696000000", - "yRYNzLq2E_ui7X4tpXXO6_uq4GkGTGTMMws7TBHlP1Y=": "384684000000", - "yS9oBJ7QxznrCPg9zmQg9gsnI_LkbFDoL4APxuIW5zY=": "451463000000", - "ySSpOGkNt3gM1M7tj6Lmqto3eYRM3kJpknA47dw9c-0=": "412344000000", - "ySV8BIZA5Bqh2e-JrRny6DoexzEruWPWRfOgo-KeNSs=": "504754000000", - "ySYpm169mJDjw1Xb2PRTqveDRH9K5s4TEU4EbuWp-xc=": "384615000000", - "yShcDKxrqZ5TfJqECIinVS6Blp3QzXPWb8J2Y0eOHL4=": "453777000000", - "yTKNsrfHVZf3YbEmyBR6Pg6yIs85ksa57YUuui8rcuQ=": "501244000000", - "yTSVZXI4iHd4W5kNrkO2sz9AENon8iuER4EiwW3cYPg=": "420891000000", - "yTodf0FngmI6w0JexGIe_Lc2kfmAWoygMiFkzqGUWRM=": "1923076000000", - "yUAtXs7LHVfUEDexSnDxmVt-th19El9BQJXrClLqlkE=": "411085000000", - "yUFrwFFIaDf0LH1ZIhKOJFxYjx37TEqHcdFZKmX_-ik=": "772360000000", - "yUnWjcG37xT74elD1UJnzfUtcvWxWB3MwinYaDOuJPw=": "447986000000", - "yUpremD0VmUhdSaOeTKdCKwz09dvJhUt0eWGK66Yf20=": "384643000000", - "yV8gfjalTas0_JDpYt-EPd7-qUFDQjPEs6K5NpcldBI=": "1874739000000", - "yVIFZsMXEQyh2y5P3rwtwYiOUPJBsyxBVRP8CqqI14k=": "446108000000", - "yVNv3YUjzBH95ub45oAOBSaUjC1e5amVey9Mp-PRSPs=": "2027818000000", - "yVxRxYuS-h_6FGX8xOtnEsms8EgjdOQtYbv-bcPw61A=": "499850000000", - "yWGFl8fXZjbzKVblA2jNEvV2XAlK9cqfwAfd06LJO_k=": "1363426000000", - "yWOe81eS0kFAdXJNNAtsa0gloODgie5G9dqHAF0XoUc=": "384968000000", - "yWtmDlwYAmNDy9Xc3_S-k4YMiTmw54m_OaXOGz593zc=": "384606000000", - "yWuEqgJv4jWRdTYRuDJVK8OwYkTfUSbyTaCu2NqdbEg=": "391885000000", - "yXrHwVPpXhrjtP90VCFpBFPh1DTmdABZVwgtjEZRQTc=": "384615000000", - "yYX6oT9YHLXpT8u6se6yca-xysH5mE4l1A12TS5MoTc=": "378642000000", - "yYXqI-ixxGEXJAWOqs86sg3PY0yy7v-AFo6i4uGhtD0=": "4166739000000", - "yYx4MujwT85_H3tJ4ArXwJ9MiAIL0FqN6hhRI9IJiDg=": "384615000000", - "yZ9Rqjbz9dtzQd0vL1NqV9SQtjkY6GsKJ3_CGjKx9u8=": "421893000000", - "yZBSPWfQMFft22U-cWry-5p9iDSbkgx_dHVNphd4w6k=": "14834001000000", - "yZExyaxSA8gnx4YT79odzqaGAxGqYrMmRReqmx4ZhaE=": "447623000000", - "yZKYROQRvHHKOCiJkDvSYLV-w38KQ5zVNK6iV4obcIM=": "385509000000", - "yZpSVHxGm54IlzePUOJVd8a1SMbbXBGY3NAbuggj3jQ=": "1853931000000", - "y_671TpYOBMXKBLc3UC3w7lh7GouHjw-A3WrjBXVfgU=": "391132000000", - "y_FFsZLkko5hEEp4xotucQBYq5LHluJy9heSKcOJcpk=": "939592000000", - "y_KnNYNQyUhTc38KNWgvcWNEoSujJKVdDdBF-bAMtPs=": "927599000000", - "y_k6CRlGMl3yL7o86wxOwtovbiCiZBOKiYv8yuc5jN8=": "465692000000", - "yaNF-TUOX_Rbhj3pb_S_JXQaQ5gqyf3-0yzbA6HncVk=": "4525676000000", - "yaf9eyQ_WDZbIhXN5yPWk8pFTmZlR5TPFuMslSlOY38=": "18511345000000", - "ybDmccWvnWok8h5OKDn1bhKUcfqskLPaVnr9c94Xcm4=": "1925338000000", - "ybWLF5QSxzmJqLBp4LenlolfIPByqVrXsKtccTrnQSo=": "382924000000", - "ybZVEW7WzUpvBUOW8yxt_3Y2uwELPgI2n429apb4rPE=": "1249999000000", - "ycABGQycCiClcQCcTGk7KGKB0jB_VJlAqnaMAfJt1ns=": "756683000000", - "ycEmYvblXLHZgl1cA9bJ6LwFq1-MxFC2sRNIeXn8IZU=": "457218000000", - "ycN4n2Z_lsHGVBb9PP4HsM9FGMVTRDblSN_Ck3Aw49k=": "451268000000", - "ycew06XdCM7D9UGZaJH6H780GHP6lpMVul1H_XYkCkk=": "1625289000000", - "ydQ8khmulz_OgFtNrJb-0HyCFw6Ym0NNhYhrC2JVYlA=": "999999000000", - "ydVTBCL4YFHeH_-a3WPqebdOyj3oA6WP4wq6JKuNk6I=": "383311000000", - "ye3Zs88ayn9Ehshsd7Irpf_vO9qemeDVoweOylPGWRw=": "794665000000", - "ye78NgUbdUeTpB2iyO-R3F3DtfHfMdK6fpsMAOCeOqs=": "390975000000", - "yetA7Ye2X20PQhA5cCDZ_e7xbDSme2YDWhleuHVQFck=": "771848000000", - "yf5MtPV7qRTgwjeTvnW9dvlsBqgTdJGoBSusSb7zhkM=": "1146953000000", - "ygj1bj7MBmw5DnWwYJtLYJVK4_AKj4Cp4qdFR3qWbGc=": "387002000000", - "yhMU0pgplsBo9uNZb-MXlZBY0Z9ITcRgr6rd0XsVtMs=": "654208000000", - "yhMW5uaWFDaSnzasaOjNMYYzIgHinWSS0XDRkcVlT4g=": "999999000000", - "yhaKYgmhjKiF8ffU7y9SwSW_z1KVDKvStdggEIiw-TA=": "2810769000000", - "yhsprow7cQWOaVnDWSC7CoWuEsol6PaHmmlosT9NDXM=": "384136000000", - "yiI0v8xJww3k-6pb20ckLDoncmFIhLomjaoen8rb5Ac=": "769230000000", - "yiUTf2D_vTYc6D-Gh716tFK6QcU-557-fixdUHw5imc=": "384615000000", - "yi_EveQGObesJmj2cLn6KkFMUd2zt42b8Lv71P4wWSA=": "19679282000000", - "yiepuPiyy-boxiM1va2hbJmvYYhCQ5axosEtK0X2kj4=": "1236871000000", - "yj8RWNW1tq3Z9NgjhesYbtz02o0gf1P3WjV3skzDAp0=": "1659943000000", - "yjDGzFkid9lYaKY79q3LKkeNDM240Dfs65FoTnybIu4=": "631324000000", - "yjMY9uQ_9LFEQZySyGs4xO1mEFqiKvA9NWcpvyUkgiE=": "927494000000", - "yjXSYDGTilKE5ICDTWPhl29YZpZGEVAvph4fy2v7vbQ=": "381808000000", - "yjYUoCLUgT7m5c_qlsXeTw3LspqR1nDaH5MIA-s9LLg=": "384576000000", - "yjdGapCwEP-zVGu1lHCIXjIHb2IZl4d0UEVnwNPBGZs=": "452437000000", - "yjdegmHmHtwigKu_RHx0HAdrIjJsyndPJ-82OGeCdEw=": "377545000000", - "yjebzp9QoyuoPcuTN3XdrXYIWcUtT-dk709krctTzzA=": "3148396000000", - "yjfhgQoKcrzgyKWkHu0Kgb4ofgWBKA57y35xF6BBzrY=": "963009000000", - "yk18irRXd_cjTHd71pfnDfNv2fUm_2znc9j4GRdu7l4=": "385528000000", - "ykArJdngrF0VLiiyk8LV-bxAkm_cYSGwVnMcnSU0Z2w=": "385507000000", - "ykDVpNvfa5RR37iUQLTm2ET4ZPiqISR28U6MMshjuHM=": "613139000000", - "ykoPODIvO6s_Sn9TsxKSJ3yrrShROcEo9F28oEG4Pyk=": "384910000000", - "ylBJNBt3qL9g5KVpcy45_BuzAuJctCEFLvTgUl8YNak=": "384615000000", - "yla8S_6rMnq3Xw7Hdq6tQvuGtAyt5l0O1KAtfUm0djE=": "384615000000", - "ymB_8d8E8zCMqThttCR0uSe5_sp96NRUUatI3VKhhG4=": "384615000000", - "ymeDGkZBayC2qvGcN9fFXMzQg_VVwalFteCZbibMJZo=": "456239000000", - "ympYWOmqabJJyuzt2lwhuXuniEm-ttazhOLN59cn7h4=": "878930000000", - "ymtbPlOvOr7XTnoiMY_e_UCvqXMYMjPj2dI7YS1NZl4=": "416901000000", - "ynIQBzzivqaC-F8lSWky3hTRDWYLJiVNpVophvJLp9o=": "560817000000", - "ynJHhvqALxIeFi_xAilGD07HEnDMRmBh2h_4L3G0NGs=": "411085000000", - "ynKOCGc0jNtrFFbOxVQidmnlCN74HxNU5Gb9u4cH5KU=": "454754000000", - "ynKb9Cm5a74MVCX33Sjlt-X1pUIY1UKZRkrUrKQ5GuU=": "938699000000", - "ynaxSCJKHa4yyWWNT02AsSrn3szWwBu1KbrTDy2qUsc=": "385875000000", - "yne6ufy8bKusCv9QBhYzEN0ohxteSuF26S68NYQIDbc=": "385505000000", - "ynoKrESwvCHoIAd0XY5NcAlaHHvScVToFxaDODHBm2Y=": "384615000000", - "ynpumGaI993j9QbiEdLpTE3BsZx7ydyjhremcYnbz0s=": "3418461000000", - "yo-y79acaeU-Pl1-d46d08amaE_t32_vhm03r7asymc=": "10539219000000", - "yoK1MaNigLh1JQNhhwtgiFJEqWDWEj6zGfZXmg9LX4A=": "566237000000", - "yoUJKHOdahXqyTBIKh3j1aQMsrCawhSQCPEG416FAWo=": "849347000000", - "yofOWKEoTsW4SP34rHD-cJzcHshR5HoQV8D1uVNAn94=": "407808000000", - "yp3gtXE9JK9fDUJRGJqg5fSDy_SER0a2Qbn2hbrP4kE=": "2291421000000", - "ypAmMxGCoWlatbWybIOuZiStIGq6uZNN8qVbvnmNZ0o=": "2727076000000", - "ypKpzAJOgo8EqGwc1ACXEkOf5JDIZwdyBpga9qdIo7o=": "384615000000", - "ypMK-Mo0cr-9cFcz9K_hcY9A5xV1aPwC6MSD27a_LIA=": "2116961000000", - "ypmPYkrBu5IH6EgG7-4NnrPJnc_cCW9QB4Z0I2lo_J8=": "385507000000", - "ypxtPagGDEBKHO-5Tg-YSe_GttOm3Vau2CeU3Y-W980=": "458858000000", - "ypzK4q5yWFaV3qlEtUkE3bOTRE1vQ3QtOOTT9IgN4tI=": "4167106000000", - "yqxtwTf1uR2tTCLkyJzA1rM24V1vyrE8HpTohKq4lKk=": "384615000000", - "yrqE2MIPOgOuzXH_fL9si3jrURCVr4zKpQcc8-uDfeM=": "501408000000", - "ys5iHPAZOmhAhmsO58xJ4HWlbfMwsCW7gFspyFv5HgQ=": "1001564000000", - "ysXj5jJF_9K_HnMXRXdRoETINt0yG5XX4Cenfz-rmb8=": "395497000000", - "ytBy6WPVpvncyfUI43HgbpXE3VSFPI7sSCdr87uUswc=": "384615000000", - "ytsMGVPBb1AE0jQeNDlQQPSgMqOrhDyMRH9Bfc3RlZg=": "788862000000", - "ytwE8WKSC1AizTOXYcYq3CVMU4GeMxgNXbjuYWLS7uU=": "384615000000", - "ytwXzKtqrkGxlzvb_SlgE9BV-nExUK_Al-i6OjSgAlQ=": "385506000000", - "yu5Y90RGr2gCORRvnpTUAqBXWE01gJEApqpfnQUYFbY=": "1153846000000", - "yuCNY-lk7dINlCjY-CzO3hLGF_ZDVX-DAXvQzcTBE4A=": "624575000000", - "yuUBWgLDAxCTAjVAk_v_l7b9dGGoJiCYaaIt6omcG_0=": "449217000000", - "yuxOHt7z_yRDJwDWXp567xvEDqdZVpKOnImG0nQ397U=": "2056822000000", - "yvB0ZYQgVqq7mYiSXq9TVd9_-vtXJYrwkTIgMJ6yHSA=": "781507000000", - "yvK7DfdU5uT9pv351Zw6HQUWeHZTn8VAZ78IBFS-n5k=": "417377000000", - "yvYjFyVKZgURuJmbmHKw90T4yg97Y_g-qUoD-xP0vYU=": "422117000000", - "yvfuaIdo1ntUs-gNBdNW6HHpCpOAr5l2KWmcmFlntKQ=": "944381000000", - "yvisXhhS8J6oaHBc8phpYuJkTxYf-5nE24j321DLBBM=": "385506000000", - "yvzrQKem1eeyTFEoPZON4Ahx0fuAjTpB3k7o9P8irso=": "390166000000", - "ywEyaxT9N8Oblj3l0NTjcU7iUozrAZbSGf_a-Uylvs8=": "454876000000", - "ywZ-Wo3FUSo2SiXnclP4k4evyHzO159KwfsxfUJvMXo=": "413846000000", - "ywbRWRI446OhZUBTt9X8wfnF9gcMR7zP1UQ1V8eDUNs=": "416666000000", - "ywkDwh2nTXMYTlTPvmrI52l4FshPJccWE2rRInUjB0Q=": "1208590000000", - "yxKeDXuMZX-xdWLXJ9Uqr3mSWZh6XUhRq-H5O5XHR-s=": "379323000000", - "yxQd0yb3H-8nExYPMAuThkV7C3lA211K4OMaXDmjX84=": "413226000000", - "yxmcd8X3VK-UmbxJ0uN2HqgLhCKiVWZ7mrtGa6u9pYc=": "385018000000", - "yxz8gQ4PofbbIO6tHCVh3-TJJdNKKdejvaK1LeUjUyo=": "576923000000", - "yy2MBVoLVps7LOijsv_zWG6ANg-j_Y-DXYip7kIkErs=": "384615000000", - "yzH2aYKTcN-m2oVGmGNfw2XC383qj3WdmO6LpZ1MCJM=": "996153000000", - "yzmcOQGmKXysJwbf1fdJhecQ-U2Ek2s8FrdjMeCAtxs=": "452840000000", - "z--C2pBcwXsKQ2r0ORBTylqNQP0CAH8HM94MEISKlok=": "1361814000000", - "z-31ffaqXuGbDMlutnlRgfsxhKslwGgFY4Paw1XQ8OI=": "403612000000", - "z-A6cm0c56lRvCqsoRZS9jCeZjhZG0fcQD_q19UHYUI=": "380051000000", - "z-ClkikibRlqDEliaSv1na2FlxQxF2ODjOjANghdqik=": "3846153000000", - "z-HLuXv0TsTnbrR1NlI6Esz6BxTRoiSosL3ELpo7BFU=": "445980000000", - "z-M2aS1D0SG_UKq3XRJ6Lj8W-xbBLNChmUJcw8-WnZ0=": "390067000000", - "z-PfeK14EZS9YBA6f6qrn6A2d7ZSMbxB8qQHDA1S6Tw=": "463777000000", - "z-QCBBbEdQjYo-3nAPHVt75k1udd12TAzpV5psXYReU=": "409355000000", - "z09WKMy9O9L3iQ1wluZb3mB_ccR7wUvunwodSD9MwT4=": "384844000000", - "z0Lg0qGZrk4QaD6yTFLtAJoclTkBRIdGg6Z_qXqkdNM=": "407808000000", - "z0WNgk7cbFL50_aWnJlGJlXoCgDak-l_Z4kgWOT0AjA=": "509391000000", - "z0Z0JEJEAxUCNzLGGtcbPnnlDxspA_iYPuoIrTyS-N0=": "3635773000000", - "z0o6IBomDQvLQCdENZFk4e8d-7U2cQfliQq395AVB-E=": "455600000000", - "z1K6tI-KsM8b6725JLlgHoh2IqeshN5_L-yxhF2OVkg=": "383796000000", - "z1RYXv3JlVGqpkbsffXos40olZwshANY7-IEwawzPuc=": "921789000000", - "z1guvwpJ9SLBWyM7XAbcjRVy5MCXhpQrHllb5Epj3KY=": "3957753000000", - "z1zmmfSoA3pkoonVLud0sJWFaQ6v0bVVgpidcAZZvwA=": "967054000000", - "z4kvaTP-4oKfWzSXdtdHjOnd2b_wdYYfyyv4TXqJ1Ac=": "380513000000", - "z5JODKY30QuXrt6U22XIixs2NVrqZZqGLrQZXBMoHp4=": "1363636000000", - "z5gUhoZSTOOHWbA8luc8guBGsR_yJYGUQiqoaPvOMZU=": "384453000000", - "z6PpYZfo8Qr0LLi9Sa6UQIxx9ULtapOqcZ0IL7flYCI=": "384159000000", - "z6QRwlRBIVpWBxX0YmP5nYpNRv-2TJwf72tJ7Yoy4h8=": "3653846000000", - "z7w-LQgZVLWOUiy6wtoSgnaqliw2s-eFlFiOmOt2144=": "463498000000", - "z8HUwyr5tb6o7tzkIZoSBb903CPUsk2fFhOBQF9ymgg=": "3347842000000", - "z9JsQDeXs4fOcUGV1-yUq99RV0BlLSK_wCjQnxYZBg4=": "378341000000", - "z9dA0XVHS-XCBMvHlHCqlj1SwB8zkWmhkCPxUJ2thYY=": "512565000000", - "z9qs_vx9yV8w9_D3ozK9CTETr2AVwfODKeW9pjHn3C8=": "3994400000000", - "zAFPTvyDRrAJV1U53sJ1YjEdro2ZX-dTpyr7YsDo5dY=": "563045000000", - "zAfdMhon31zf-XdYi2I5yebNcDrKu_183YziOtM-NA4=": "411085000000", - "zAv1A3HhijeCLpjg0O4kL192R1gJzD_X3K8VazaIj8c=": "3023506000000", - "zBTkmsvtDDQ-5OD26iFuVdqsvLzRcL9QCbsOa7wxYcc=": "454545000000", - "zC72MXQbGCl_DIdstCNcDZGDfXACLD7q_dD7b-IfOXE=": "462848000000", - "zCMqwAQduCV1hh9q_2KPePJJ228xa41CZ8OEwDDqOeY=": "386475000000", - "zCZyerP-jBY8TO0XmhtcNFHM9_5vf5L-hirM_yHSePo=": "740539000000", - "zCimJ2Ofs8dc8Gyb0Xe53LhgV0wv0xYj7Q9nCztmWsM=": "381123000000", - "zCopeLMokh5aDn5REXLIbqvYW8wPqkQx7TQOUOtj-Ho=": "385506000000", - "zDGZjZ7AqdbBdxb1oPn0G3BBKUAcNslVmIt_VylWoaY=": "379344000000", - "zDP28dkHgZjAF7gQ2ujkuYLbRkn1feMCqGj2JgI-ZDU=": "383595000000", - "zDzvuwXNy_Aa9Dw8tPzu-eg-cHV-sHS7-E-Ptt5rZ10=": "833333000000", - "zE3WcrMCu8eN444HRCaX665utvxJsWfX2CKoNu-af1Q=": "416673000000", - "zE56EfVAvv0XekVyBDGh2Iz1QT6X38YxlcBYO20hqa0=": "1773135000000", - "zEVe1Ppcr5XB0LQiCr-ylS10ou2DEPrprk6E3QhRCik=": "786892000000", - "zEmpBly0iS7MEys2ld7XRkjMMx5DdrnF7rknq5UN1XQ=": "858107000000", - "zF4bVnDoKjiblzkaWqE5Xk05vIGGTu_uy5abkhQ9qPE=": "814467000000", - "zFOvs0a_kKPN3RtesRae4UmgQzW8JrEon-aRl5reNOY=": "454325000000", - "zGCBnbMnfdbPYqXKTx01rSnLtuGnUgoMDlgnjkMt_Dk=": "11185669000000", - "zGVcAqCVLv0MLWrntLw1QUzO1O04Rh_Y8olbCaIDz7w=": "977958000000", - "zGeubC5m-iQCS2E5fXp0y92BX_XefneCJYu6n3mdm2E=": "411085000000", - "zGidMcW9tq2m2N4VPtsL7LPe0eDENMhxRNV-M0XT5ds=": "1161490000000", - "zIgC8htxraDQ0uCgV9nMGecXjCY-jP8vzVwMCkYNHy0=": "896928000000", - "zIhdIw7z5CQT3_realfnrPQ01iisHkm9iNwRn1x3hp4=": "412297000000", - "zItatTDv11zJ08YMeE-AWAX5fNnLCspnq0k9Dd8EOS8=": "403504000000", - "zJO4ggWhlH5SmT7VsyxKjdAoGTXjeHL-4t-0BiNZxTY=": "411085000000", - "zJRJM_DllKuBZEdkgANo3ZjnXHDG8ks6fSRfUmm5ebs=": "384680000000", - "zJcbd8ttZtdADd7SZyvoby4Kqm8zQseB8CSmMEcyCyI=": "2307692000000", - "zJmd8wyg5xHegzU3IumKsAUlTW-KctsOId4Z8Qt_8fs=": "384615000000", - "zK8m968_hK7RvPnhf9j_LY7BBSsESr8r3FuFlz8E3Gc=": "385509000000", - "zKWsyoo5wP8-RNMs8UHqY78TBH64lzKS5GDSu5Nv9wE=": "923602000000", - "zKpNK7ffok7FSFPBc25LQudoriCgg54yY9p4aPGHjD0=": "848090000000", - "zL4XNmB08thkmGNZm2rYlxTw93kHLmufrXkEt_LsuuU=": "3730039000000", - "zLHgwwBCqSh1sb0bZ2TfDd6-4jmOojkZQIvt_YdP2GA=": "1524935000000", - "zLla2jeJAj3VQYnmxYOd39JcxsJ6SlogdaKZds_SIj4=": "769230000000", - "zLqfOtaErOdhmXYMjTcyd9rDfghMfLfBXIKKOh_RQO8=": "16083693000000", - "zMDavWV50Q-mhDlm-ZgbYNJCKdtsHGdZb0tPH23lsDg=": "385510000000", - "zMKbEIk00e2rgjJ47BWvmPEMoE1dg2BW7usifXpn6og=": "1053269000000", - "zMQpR8u2lGbdWGfIRlCBgEMIqvRl0jE4b_EgaMdWK6M=": "425400000000", - "zMVvGR3CMbbVW8zO5243P7yK9BM482YrbXNh-eSm2Zo=": "381454000000", - "zMct16gT1fZQgMW3lqZtZp0hGKHLccueWda3TT0VHnI=": "455600000000", - "zMofaDZ7_vXAOiOJbtzVJc3jlyU6_UtKBTo26sqKhXM=": "505769000000", - "zMyMjpLbXz9EAqNtUtZAbWYpCsiOEwj4P7Dck7AuTqg=": "421927000000", - "zNZFJvSpVdAA9oa24cHt92gmOboBnWV7VMf6E7fZcGc=": "378746000000", - "zNpKczQkK-ZG5vgcnGAIatzwt2TqJDkq-6fSPJJO8CE=": "1858257000000", - "zO-4mZIuBmOrOfxYUtw61f6dzOClGkGxH1Yl7U2fNKA=": "776995000000", - "zO0je0bUStJtLWI7xjkyC8ZysctywvD-1sh1y5ckC6I=": "455614000000", - "zOBcJoQPGOaGLeUv2pejqd0XCoeXNzODG5MenJ-5eNM=": "384615000000", - "zOU_7KE6uFIUxgl1sWWNMIm-KqBXhgaNTJcFeUPIelc=": "769230000000", - "zOh6RclsM3z420VPD9Lz9WC3DDJvc_hMTKQfof5D_Jw=": "395806000000", - "zP6q8NKgSmAWVUVylc3DvcCEldNYK1fMp0aRJjfc6UI=": "384615000000", - "zPc1DZ_qKQGFBfznQeu6Pw0zoKUeQAJmZQqcClfYSHo=": "11783276000000", - "zPcEyWq50pLNj4-flCriauhPtObNU3L16LfqZaXzBKE=": "767539000000", - "zPh-eW4-T0T8RwTPyyaXxCFRAGcu3udlCioJP-qHCm4=": "457547000000", - "zQEek6N0BDlnkBf7AmHmCo5i7LquM8vPPdSJZ_VhBt0=": "12863625000000", - "zQSoFVNn5T6ROHYBqE-2PC8rOWXDOcfqbMNjG0RfjV8=": "385507000000", - "zQsaQ5viY1WwSrXFf4pM8DTKWypoxdrcMV7XXWM46SM=": "1252904000000", - "zR8N8MRaidCF-5i2I2O0B9-KqstFnp-pBHVk-9w3AQQ=": "450550000000", - "zRsoQa7DH_itob91R2O4SB3Lzzwv1QSOKnue_1dgbgI=": "999999000000", - "zRzAWeAnPiRMrSCzOLIzpTfhnv88joFWM1ipGiefZso=": "384724000000", - "zSTFwdsn-uHmpVhb1RYlJyZwJ0ijpIYPDRaONEYWgps=": "466541000000", - "zSZFtoTn8EsI3HlcnzYBJ5W2DK2AfZ5CdeEk_dE7RwU=": "769230000000", - "zSbn9ydCPAP5bMrUvxd78u70iVg4cWCwMMs-j938TtQ=": "461649000000", - "zSpMbHHkwUbNLYtH_GpMUhqu8m5eqyNDvUYRFeKyCjU=": "416666000000", - "zSrZEX1ZhAqMG6mJoIBAauo-rTPGDDinNbxfz74SgIM=": "385528000000", - "zT-QhhyZWEULaM2xzL3VSsWm7R0AfRKmJnrLFPmv0Xw=": "404478000000", - "zTNTR5eMJiENofFEESA3UeWY3ZgJ9KzRTym3jw1UI0M=": "385313000000", - "zTSV1NsdtrhFKbHX3PUrKjYXoucYqjDpFyi9N2z9iD4=": "2502164000000", - "zTWPjxW5rqykolLNcIwHCVdJSp45UR_SUA20e6Md-Gk=": "1031755000000", - "zTZ-COKEjkVw0p5gbBdyt6LeO_J61YHme9twiUM8Q78=": "469479000000", - "zTfw-7o_laruNl9tEX-2UeTW5Z42Xr-2ZBKxzmEStno=": "384615000000", - "zThcBx_BNe2GevnqHIekXZMyoGnD0SVZ2_8ayuavZjA=": "2155341000000", - "zUSakz0ehMqQVCqix3TU1mRNSHkV_MwbuPXSu8gJ1Kc=": "18393959000000", - "zUqxsvFz3PNePa3I5oOaQNIVuTUpfYJBBsJvUc9O2OM=": "5578077000000", - "zUsuNi4otxLx9FnuT_wOVYj-s42OnSSwi5mpB_06eco=": "381436000000", - "zV8XXzrhvWnmvUCX_Y5cJU2v6w2OnHe5Frp3co8ZjXM=": "1594707000000", - "zVKvHX9F3n9r6GgqwdgWhn9dOD3uFp_dxNMeOR1CmyY=": "769230000000", - "zVVvRML_ua-CRxPGWx3i2zcTBEVYamELY0F653xvCGU=": "411085000000", - "zWQ69PbSR_Xounc0yfwlGkbJadiqa4Qbx4o8_MHKgr8=": "946002000000", - "zWc1Rb_kZQYZKbFSNcfXcIh8r2ooV7Mhz9vfTD6rrdk=": "417636000000", - "zWiEDxyLY6-HsnuTKsn3t69cJ7X5tJdX-3CJkL2dDig=": "463270000000", - "zWtHHcGPv6l5zviclEZRuNAdlcd6I8XoCA3LoxzPjRA=": "385507000000", - "zWxhzdIo6tEFTHYXCjhx8IBSJNcnNMmGPaUH0Z9EytQ=": "1223425000000", - "zX8Kv8rNe2D0lUuULSgzt9MHPGPcE96hWHdUdIjcv5Q=": "414392000000", - "zXtOoYZduk2RPyRwty1Vv56GmsoGTX35Zxcp4QR6mSU=": "2132069000000", - "zYQ934WnCaST8X8AqY-79Xd6lsuDA_9aqW77793H498=": "384615000000", - "zYaEouoCZ5JjU3z4giqx4GkCysiPD1VRhj5gTIXafrc=": "6188061000000", - "zYqafhVNFUId3AKTXlWSHIAl5GxamJgjH4WiiEwIsFc=": "416666000000", - "zZDX3MbWHA5FcBPv0rP_xU6AzyTTGbakDUvHK-sqWm4=": "38550673000000", - "zZKDXQ4NVI-ZHvfswZOq4Cd8glKTcNOmJiGhNOhen08=": "462008000000", - "zZdd3PzVnk0J187Q-I-zvDP0gU8II2MmV-Q6YiHhsPY=": "473549000000", - "zZz-Q2G-EGXC6TbV4ako-zTDRNZdBavW41sIlcOyIPA=": "455367000000", - "z_aQ5QM-n2q4erm5_asd-yziCsrqStgEGrqhfwZidBY=": "1500000000000", - "z_c1El61QbCirK1YG9W7A4AMzZU5DYz3sRtVm6bbM_g=": "833348000000", - "z_jcXyK4qopp2xXgoPSDZM1_cTUxi2nRMoD5WrX1Fno=": "391797000000", - "z_vzR80eG_iECydIinfQRHjY3AENepfDD7uvqE2sXmk=": "902349000000", - "zaLNSOKoviFWSm8S7Dnmf405YpcPPUj9HB2si6uANXg=": "385202000000", - "zaRjDggHaMIWkEiyic8shSaYDKnK9yUBdPhW_Ak3rlY=": "3786121000000", - "za_NtMGkoEosbVIhKAmeVJTVDsci02aqe2jMXeJJV6Y=": "1946776000000", - "zaeKFGRrGeehmQCfcrQph7wY9N4a9Ae6EQgSnvqIRUA=": "454821000000", - "zaltOVsgwT3lVzygQx0e18K_AJUsWOw-h-EcQVfIJgo=": "644862000000", - "zamKiES1QM0lFQuTkVC9cSBwQO3woX9HoLMWlM0W4X4=": "769230000000", - "zawLat69tbES56wVZuqoECBx_yjpLe0IUZm_3oCFRNo=": "902995000000", - "zbWb1wch7W8aZYkPqDlCwwmZ-QNmp2QiX8ifQD-EwqU=": "500128000000", - "zbaE-MA5SiYznllr6YhflOvC-AKrqCM5k2OBNUYS5LQ=": "469837000000", - "zbvdyCPwqtccOwuQ5HrRFiu1XOO2B-EHXb6yW4lUlU8=": "2691112000000", - "zdIb51-eZljqpfYArIc8L1gb3zDjf-27tCzhjILwTIs=": "2479005000000", - "zdTxDJLT-pKRTqESoyEQV1EuOAvXbV0oaaCQz9ODLyo=": "377984000000", - "zdlZKq42I5ZP75lm7Col7mHHppkZite3YvTNlwL22e8=": "382597000000", - "zdpPXvVoHWG7z70zKrNLqTeOL2n1Cz-kE1O61AVrMDc=": "1250960000000", - "zduPyrEL1zaciu5Em8_OtcJSiY_gkU6tHBW9hG-Baj0=": "492721000000", - "ze2N-SpxBZEDbNqzuTYsJ8Untp9Y4uHdkhrtI9itMKc=": "909090000000", - "zeo5MK0Z1yAV4zHIj9gCW3SIUolbQDywOsEWqbsXG6E=": "809430000000", - "zf9MGcMPJOu1tssh720BtzFgAyNImPdZkrSXsNhH6MU=": "908792000000", - "zfH7Rn5eGTV6oGLFJm8Tor33SGp1YTa37aMvgx7lKmg=": "384615000000", - "zfm4JqdKVxmTB5tpKsILhcklo19AVoyfz7zJz2_aJ4s=": "421707000000", - "zg2ThTDufJ3NKAIW17M3DuPLsP_1VejNL9TeEf6VQsA=": "7488651000000", - "zgWSY8FF6tFZDPs7ABroXkIg2I3zyIuu4sQ0uWdQbYM=": "448254000000", - "zgX1L6SgM4oFQGb0p-YBx3m1J7oQ-1PH3OA6cyGne8A=": "384615000000", - "zg_t8iIRTVsJ39Cm1gEctOJFo-nHqjpx9DpQ6ljb83M=": "755181000000", - "zget-0kJ4euyVKzKNeG1K9hj7rlxO6UVNjSGIgE8yzw=": "472515000000", - "zgrxPAkBTngK8y76yxEnRI-36liFL_6aE7QzNXI6bWk=": "417334000000", - "zh6vhLSQA93tQe52Dl7mAUCncZJ7vjwT5c3xQfGLyPw=": "390883000000", - "zhGqP0j1h6sENYbg4428wwmIh-TfAl7nI0bvHEYIBOs=": "1695548000000", - "zhJAesO8i3uP_mzbzfJYxQ79OWgKna-A5hwCGpr3xHY=": "384647000000", - "zhP0rXS1bfa0aINM9X5wHNBBHrQmyjSsQDDQ7TIK1Ig=": "499999000000", - "zhPGUbOoLbBFRbx57lKrQF6aUdxTvP4x09ooAzxlfEQ=": "378341000000", - "zhm3KvzxTeHjrljODAxO7o7-S7z7GVFKoAt6saXMjk8=": "499999000000", - "zhqnNVlTnf2WbPvv_-InSxMM3VhJ8zZ-n87CVi6LOC8=": "465243000000", - "zhsYm3yPCFqCyVbrBTR1Eu_1JatQmapSUmHQRQZ5kqM=": "449694000000", - "zhxVuHkNEuOmYDX15CoTKHdz9bZkMvOZ8vW4CHP-wsw=": "381463000000", - "ziV0W9bkeuhX8ziF1lGCbaFubhfeASs0RUsMzCLZPvI=": "920270000000", - "zij8zKgKbfu2fFBt2O7RKXShCHOQ0jx4bURnuFH13zg=": "463216000000", - "zikSXM7RTG1JGUxymU03PZZBMsja0a2qICZ6EseEDgg=": "395545000000", - "ziyxJXH0jA3WESq2wadCAo6Iax6Eh9iGOfENxL1Zhvs=": "9401467000000", - "zjEisKZt9BUZwKJmYCrw9yGD6CmlxSrlSZmZqoBG4oY=": "384343000000", - "zjR5tq7YjHcIJ7zWwYeYHB1q3_9MetCOTGeD0urgC_0=": "384615000000", - "zjaf_0nU-5B6JpkNLQLuzxZ1nlzHRQrGpUqxwywL508=": "1160302000000", - "zjl2jylM0p763uHxETWWzpjsURKHEVCFfwTeIwuBqvE=": "928628000000", - "zjpgTLhWfkLO42gZOWRHN77x4rxhMnbhwUmQLHeJJ8E=": "412218000000", - "zkO2XzvvF6WzVotUzRCvG65zfj-U8yQ4Lxj7Fiu1HMw=": "463392000000", - "zkPQBMSzAIKK592U2ZiEWiqOG8yJCJc4DNnqS7yLi-w=": "1362714000000", - "zkZ3ddU8ZcRukyd81BL6Wc1QTYUUMY7-VudsBTtrStU=": "1129467000000", - "zkZXxSn_x1i-J3Bz0X3UIGM22Qib_iZrTq_pXpoNvgE=": "383849000000", - "zkgMsOOlVlbE6ohld4xeverXhycJbYA0j_M4COe-Zig=": "466680000000", - "zl8ZQpnSNPiRwiw5fCfDVMBCPJ3ZFwj2WGbGt9rMoSY=": "964607000000", - "zlFU6Uo_UK_NTlmYtQAFKPlPAlqp--Rw1fWTCDo1ldI=": "385505000000", - "zlK6ci6E3CNu7A8HYqui8k-svj0ZsMwZokAJA0HLf-g=": "2026785000000", - "zlKDnRhXe4MJbX493uCu--HpVYL3jpR5jiZEtyNqmWI=": "411085000000", - "zlv81k2JPm_0qzNj8VMWwQT9K0CXF5PvLKNJKzY2bBM=": "2269230000000", - "zm23Max18aVCQK-q2G7IovtKjHCGEF93mp6MJP0wI6M=": "379928000000", - "zm4YXEHIQvigi3dSmcgE2IKied6ODCwPw0GvB7PK05w=": "521500000000", - "zm8FOR9QklyxgJykzWMwIisrlTj8BtDBJpOYTfbwxwA=": "490222000000", - "zmtMXs6drSJppvTDwJNfEYettg0DyRmRc4ENfm-HWhU=": "1248759000000", - "znELWWP27AcIn9Edc4SBxglWw-DXV_5M7HOWjRHQ0nE=": "5052235000000", - "znQUMVvM58PqtWVZ_onMpDWd2T7gpL85oOOCq6JLqhE=": "384715000000", - "zoK9Ob6-tEhXrt7yqMq6unX3qJkuqk6PUxLGpCNC_rs=": "903330000000", - "zoa55Jhgx68HZBNv5JxH36sUyyuEwc3OLjG8AMB2l4g=": "2305747000000", - "zodcU8ZqgCPnQTFkXYIK1HVXLZRCysveqBNpk9NtFOE=": "835584000000", - "zoiuLn11RjX5dO8VogjZqnnk4KykRF-Dtz0QC0ObnN4=": "1242307000000", - "zoks631qqgol79Yyg3JmI6a2yDWiR-rcuA8iKVgX8Cw=": "454433000000", - "zp2mnN8y-_xX5sh_1ZxD-KW_aMSw-KbE07OrQ-gB_jQ=": "40021142000000", - "zp8a50tyr3qynF-npJY5eDJZtPO4RnLFN1I9jcRl5zs=": "1030246000000", - "zqMtIAi0d_8R---m37Ts_D_PrvpA970dFbUF9EOJiyU=": "375593000000", - "zqq4Av3qFkUernvteiMNxvVb8XhWyIOLxi6a0usFNss=": "384749000000", - "zr69u0Jb00PdCMywJe1z5o3654tIlytU_PN1YehaUfE=": "459182000000", - "zrBL5i9opUMkImOH8t61yGjFW71dNd_INmasul2Xwoc=": "1351257000000", - "zrBjOSI4TTA3unNykXwGBb8cTvpNMZ5mTu4iK6F3_oE=": "384615000000", - "zreo0vRPd3rD_wX0IvBtqJkPpBpoOHz9_dSnJMrYpoA=": "413111000000", - "zrlJ-3jauFECjBs9hPNKWoe_wMAA90PxQ-zVqZCayZA=": "380413000000", - "zro5tQR5qp1G6UbJYUzFmJpnyjsw4-QqyLdXoHtn4Tw=": "3755395000000", - "zs2gu4O4sRURaOLm-bLxp67iAs27kI2ap0Nk8hJLXok=": "769241000000", - "zsAYeKaqvdR9qCO_bFPEbiYL3viZCsyl1ZZ1ubHtyUA=": "385507000000", - "zsEqTzDud3L5dJ-rL_bGon7D-x0kzgjUg5mLHYd8W40=": "405357000000", - "ztBjWNL9hV2yp1uvxsWR7taUJi6S1TDJxx6d34XgUS0=": "765466000000", - "zu5hQ6XaOHk-UGbb4zGfoPI69pbW7mbFTlwzS5uO_As=": "451018000000", - "zu8BGw2Icdw5Y4437a3Y1GcA_H84pJviUQbmKGQLAj4=": "446353000000", - "zuW54Rhpv2XDgDhlbHEjiRFnl95HU3buvnWcP8FFsoI=": "417632000000", - "zub0I3Je8X6nIB-5hzebDoTC37-KAbz2lt8qn1FESMc=": "1475532000000", - "zuse_l4u5b6g75GVDJiciqUIsVOAUL_400Adhq30sbc=": "6747307000000", - "zvTS-QkaNEMvws-zN18vtQrDogs592nPbTsvDO-6VsE=": "2059661000000", - "zvaKjINz8CFKNkyq-cZGXQtn_iyg4EjY_7abK-LyN5k=": "351985000000", - "zvdlh2hRABrqx8TV5uNA6JggS4b5lWb-u9cvaOEzgyM=": "763472000000", - "zw0YHGV2lMF7_tiFQIl_mDrwXTg1v7xFihBjHnW0JQQ=": "3177607000000", - "zw_iD-vbatNkBN6K_3LEuf0hOa-2d_YAjDzwqjdEfHE=": "8184351000000", - "zwsZLONiMOEH1DkTqTs59bt8emqB0OF907Y5EaJr4so=": "391429000000", - "zxgYuwWddc-6HMOU8xT6BG7C4znTf6IQ2aBz3b9UfuA=": "810432000000", - "zxtBAhluYR0AU-6k4ItOvqygRCc2JO9ww7S0MHRpAbM=": "386020000000", - "zxxoLQ8pZGyqAMywrFgzmCjYPkhSwnPXIYlot6z9xc4=": "1123552000000", - "zy95aaJwOIME8PyBSvTzcN-cSkiDdpzb8bCtBV-senU=": "2055429000000", - "zyhwJzvkyIAFnr6_H6by-p2m_y1befbo6De7RNE9UWw=": "812990000000", - "zzLMmvC_FLPkEKdxF18RKKD1oUiNHijOCY7whztL-60=": "444868000000", - "zzSg0APQsBqgiYqd9RmQXHdMQGB0ELxcNf63Gw150lA=": "451750000000", - "zzYGnA1j5ZrDq3u5MI_ZyjrZ4HohcqIEgaAhVH_-c7g=": "384618000000", - "zzk-mHcdo_-fLCmHq72qwAMmV6D8E9dWsYOc_N3HAGs=": "472670000000", - "EXIqdPNaKsWCjLdhv_SpveI4DAEfzs7fu9I-aJDlxtE=": "1000000", - "pso9BlSESUlBOJsWoyMTQ6KQu_5If1lM-JXxcWQZCcw=": "1000000", - "NmpL-2uBZj9Ud0aKtQ94FxyOynm0EyqFAie9umf02sw=": "1000000", - "fMywKku2XZPn0hHgopz5TPq_IH_K8DQPTgBcyc9lPmQ=": "1000000", - "JYlnKiCl03Xiyu0fsNMKJcFlyqg29RNL5EyrCPxqP3U=": "1000000", - "Bo0Z_sEDsvgN-c4eL-j23HCjP_wbV5BZzIrTe6U6tM4=": "1000000", - "6YgMsJxoljXccOBra7JWVTF5sXF_oJRtPgQUOE8i1rU=": "1000000", - "OA__yy1yzQhFvQsmF_g7OiwqRBxKqNqrc4INnGV5xO4=": "1000000", - "pkPmUH8TZznveB6AP_tiVy_6mcJXv2OAZou6ZDukc78=": "1000000", - "QvmpvWW0RwLIXIIvw0T70RGPWFcfvf0zfLl8A-w6fpE=": "1000000", - "QZfhl9Oym32ivExdgOuv7ib1TUweYArl2VNmc2OSJR8=": "1000000", - "VYxFlcyJaBYBzCPu-D4ExUbRA6EpIHvckK8iXhPqcZ8=": "1000000", - "hP-oIkn7cEB4igep_5QCH9EDSGmRJDuIZrqis6JEw9g=": "1000000", - "VbFEhy8Ek4KJ0XTDv4vIXP9AJZ_HLfReVxHgWStCKM4=": "1000000", - "MgKJC2PPMwRxJV_he5Hdjjgk7Krs-doH6wfmX4Pr7xU=": "1000000", - "LO8KVvlkwROmupn6k1ZAilsLhnCxeCQh-IGDZZKV4pI=": "1000000", - "p6vAS4YpCICHYELeOq8qWNw5dWgkj_a5z7dd-fvRxLc=": "1000000", - "nQPPWXu2nL0_hngiiqavfbBedKa8kgci61Zju2J4xck=": "1000000", - "QK5z1Nso4FSDkksI6WntCuEn_r2iZWkPDdiHEXtmVu8=": "1000000", - "W4N7IecQ6SFusvCyBLkvMKeCD6fwgm3w6F3WLcG_uPE=": "1000000", - "qDymZoQEifqdn1rVNefg_eAQEwLJdCGhf-0tl4tJzCE=": "1000000", - "YROeciz8Tl5A736dQvfeQ6xG7tDFDrlmWXqApzdvyJc=": "1000000", - "0hFpatOL2r61YPcvBEpmixqfHGOIOiOcZxpc-cdiCqg=": "1000000", - "Q2sB1G7-N_dmOARf8rJDJEIuoYx_2suwHfQC4IEbd6A=": "1000000", - "wi2fHknao4J5kXB0I8RHLTNYzUzUn_AhF410JHNQx58=": "1000000", - "F5E4zk90Yar9UXPuox7hbK-o2GDL4GsJ3mSE7YyjGl0=": "1000000", - "7VPY13iXRE9IgVzeJZXuD--aVO4-Bis6y9_ao2SM7vw=": "1000000", - "NxW59jOreWgj2EhMRlCnwBsw37Bl8E7C4nVBjdHpHeA=": "1000000", - "RU4zCzbmU7MCTrehA3umBJB1C5hXNzU6udUsr_vsmFg=": "1000000", - "1dHNY7AZK6aXqrSySMOvf0vpaqF97B-Wz-Qj28tq2bQ=": "1000000", - "IVC_8MGyKQ5T9abq_ts2QMcw2-_2pAGPrpLIZd3qXhY=": "1000000", - "mioy3pImzdfsdydUVvlPaobm4WutTvbjle45rxhQfpQ=": "1000000", - "vnmHmYkv7FTEw0Vowh8wtojnBxUfTjtkHSTfpKKW7-4=": "1000000", - "deo7O26FMunxtf99KPvFMk4xMdnwrwwAnCF2YEnnwhU=": "1000000", - "Xi4H63FKXJ7h6AvYY4GD_woP6fMcpqkOXhvpJjnR9dQ=": "1000000", - "ANxzBDedix7vRsQ-CZB3nPkpXeGsv9NwFbauKx1GPi4=": "1000000", - "X7F8wzhUJpq5G-Mg9zdNYXrraiqP_gSP-TakiK-1XJg=": "1000000", - "O-QDlWiya5w6bWL9LaxZvUIMZr3SB_vQGdronVPqz34=": "1000000", - "UkC0OBumnDpyN7yTonJABJVoHcE0e57gUBiBD5m7mPc=": "1000000", - "I8os_IpCAAqXWUh-J8CVWdgO7sXmbcSq0Vx_gHE1Kys=": "1000000", - "kan8Y7-_nw4VKfcGM3VkDHs5CHRu8OwrdyaULM9p8bI=": "1000000", - "-QdRHkfh5v-fGJs1RzL8o2gYlKjA_DI3jPsZE4drwGg=": "1000000", - "1bNRW-8El-C6tjT2oTaC6XJsndWe-_0Jf_NitqgjmC4=": "1000000", - "4nJkiLu9eGI-o9LQliDuzNFZXZ2BQF1ddXNSet-TRuY=": "1000000", - "QlTiTDViEdXVFVI1v86D1GIQYxf-kM71TfGLgD1_N4o=": "1000000", - "yZBmdBIHwqkTHSa5s-jr261Twn1MeAHqWhRiNhrzbo0=": "1000000", - "QG3eombzAhT27zR1osK6P5V1jS_IuyP6-eNhQRaKFN4=": "1000000", - "VrwLb3ZgcE6rVs2GjtPKGfK7D8JgkMnrZiJ5k0lZTsc=": "1000000", - "1YHjK7gTM9RKXqp2Lq4BSdm2Dfv2u1CXjYSqTh8_bBA=": "1000000", - "3S5lNAgDi77UmxFOdDUszQerXE3phnpgdWWhQQGjZJY=": "1000000", - "84LIweGTSRwPaJXFDkW3NRvw1pN30T0nx2vryABo8wQ=": "1000000", - "V9QrQ2x55Ig20rLaE2XSd0ym5WNUU2256XfmV6DxtEg=": "1000000", - "kTlkGYuWa8kv6bQabhkMFIXhc_mq8hYnBwTGJWj5Ltc=": "1000000", - "XmjoesNh6oRqfSxpOE4ksdt5T1wGXA9Kzt2PM37Z-_4=": "1000000", - "aAOJsRGygvJghSpdt_PBHZhq5Xr0--9j0esEWUC6C6w=": "1000000", - "YhtX5DY9y_4rz6UipJtBqVNPl49fNZCU3CCYj8FZJ_I=": "1000000", - "EdZ3DVwtHL8SWs66EE9Q1Z2G1BsWA3O5H9apSnqSfGo=": "1000000", - "NOdT1zT9G7jkDgo1fYs57kS7ZgJ4LZSUuBHoOVdmy7c=": "1000000", - "yhMtPSw5m2HN90XPEIglt-M3jkIog2juvgmg2cthUvQ=": "1000000", - "5T12MntOlbsYH9AO86QtxP5R0O7zM7jjW3UFKlbAzCw=": "1000000", - "E86nSQfWqnzHKEm1MQirIDT8bHeOtX0SpXAnmICQI-U=": "1000000", - "GBmgESXOoDvkDRDaMLaPOPh5CslfVm02CjpaORkq-Dk=": "1000000", - "y55NmCPK9Y66znWCPAR2S4ULjs0O1b16kY3FJ50e3M8=": "1000000", - "gqcvfQ8zA_W-DIMyz0aeDyoZlCMwL9yy0_sUcx_Vhrc=": "1000000", - "bglzb5blhne2oU5fKacQFb4tk_GlWQkSBw_d-rKi6Ss=": "1000000", - "Tgb-ZbIAKIQjIxbmiOMPXI0FBYGTjOfDxhZWfhHGNyo=": "1000000", - "kETCIDB0PVn7T0Vuu6UeWRH2TPbABaKs7IN0yZTWRew=": "1000000", - "YWh3KTsWM8OCi-URndhaS82wpvhF0b25Ztx_vX2wTRg=": "1000000", - "eKEZetRMwX98ft4haziaVXvNc98TNAAFcKU8OPVfFpE=": "1000000", - "BXj0WV7eFikLEC7PCU_1XcMe0onv6prvDyO83HxkjWo=": "1000000", - "h8B6u9Ygj7VflikkWywJ-ZByWmEb9UuChiVVTTqeItA=": "1000000", - "19p3eJjO_LNe7UKxiQZ8bMR0TawemHk8djhIoeReiAE=": "1000000", - "K0IMfSF9_OoLbkCW-DPrwlcKCmKAK8l915rgcKOrT_s=": "1000000", - "GHmzOwF6Awdfc8r5oa-F40HGmOcha602DfbeiBH8fn4=": "1000000", - "AI-MuWYFSy59YCDh1C5Igj3dBMRMzEDKoO7qEZ0dQg8=": "1000000", - "jnV8RwX_ROa_jkjX_kUHZRhGbHb_5NAvOshdPqRyENc=": "1000000", - "-vZRkzjIbGn9UdcD5oGJiKnGiKHmZ0wso8DWMEyrS7M=": "1000000", - "R7tu8GLKHSsfsfGzI_DaAWsBrrgRYejj8liPYXtnyok=": "1000000", - "sOnErK3Adm5gqJcUAP_Er6vEbJzlltvZh_VbK4P9eao=": "1000000", - "HvrJwjO0EarxcFDccS-SXoO3H9-lmBnQuyvvIwe-R4s=": "1000000", - "dcbpvBiy-vrrPpnMbrpPg4tq1kWllf-aS4OhvzXTuGo=": "1000000", - "Va1CHNfKouuj1wd5KYy3qredBCcKFbF0cXu1qU5He7g=": "1000000", - "2T91AlqwjTou3RLy6KsUjaXfgrdqRmBCpQB1xDynhnQ=": "1000000", - "CiGGvRaHdSRD6fkmz6PnUiGeai8PbH0XiDuKH27te_k=": "1000000", - "qsipweUQqHJO0gMxR7c6a8vgQmztlAz7_PeMa0Mn_Mc=": "1000000", - "wSR4D2pnUvevLB688yFq_i58QeB3-g-Rs_FQKHvNBpE=": "1000000", - "u_KpiOfRLfUVNr-hKKk_R30MlazM7IkCRykd0fSwrPA=": "1000000", - "a0cNhiexJphG6-byQMbXUv6Sc2ia8XEyqR_hfSM0MyA=": "1000000", - "Lb3itXes6IKXaT5hhNxHo85hq9p3jXmHHnvAvUKtde4=": "1000000", - "0WDV35rP20S2Kgiq1ZT8t3u-MMwIhYB-SpFLY-TMYIc=": "1000000", - "S5AETIobCjtm-wGz41qctRYClISKtVm5WQl5Mt_s_sM=": "1000000", - "ufdpN0pr0XSX6zM6TFLIbqbmCKjl5mOFMmRwzVWd2Wk=": "1000000", - "jlrtJFiEaWBwqscKn0trbdF57cJG0gWwWSy77zfksz4=": "1000000", - "jAve37urJqEwgwBRL_sbIg8GjuE_dhKvsHbCLeP7dkE=": "1000000", - "rmRhP2qqwDrIowGDWaLIt1cUXhT26qdUrM6Cfk2_noU=": "1000000", - "GAEWYvFCgYR_REWE0rMzz0bttgZbQAffI5nrg9C1BrE=": "1000000", - "50OTwx-p9ZxFbqUI4debpIPX5dbUquAR_Ze8XTTwpOo=": "1000000", - "TZnMXsbBiRpIMVdWB3GhFEY9kqUw34_WTgP2j1cd6bc=": "1000000", - "iZrqDRzDc0LUtcyedAFBlZnIuWcfOuhFnw0mLm0Pfuc=": "1000000", - "reC2xKbUqVou_9pA0oHhrL8V93VPO43sUF5jCSyU8kM=": "1000000", - "URVk8FxX6Ik9z-Cub09oOxMkp6FwNq27kJUXbjJnfsQ=": "2463071701000000", - "ocEVzr7ctJ3NyCWj_356QsTyINKoJlwCCAgKFGPjvqg=": "2074165643000000", - "5Y1_PK90x1jCNzzQwthIt0RGT7E3PAPwDI-tbHN39l8=": "648176763000000" - }, - "blockVersionData": { - "heavyDelThd": "300000000000", - "maxBlockSize": "2000000", - "maxHeaderSize": "2000000", - "maxProposalSize": "700", - "maxTxSize": "4096", - "mpcThd": "20000000000000", - "scriptVersion": 0, - "slotDuration": "20000", - "softforkRule": { - "initThd": "900000000000000", - "minThd": "600000000000000", - "thdDecrement": "50000000000000" - }, - "txFeePolicy": { - "multiplier": "43946000000", - "summand": "155381000000000" - }, - "unlockStakeEpoch": "18446744073709551615", - "updateImplicit": "10000", - "updateProposalThd": "100000000000000", - "updateVoteThd": "1000000000000" - }, - "ftsSeed": "76617361206f7061736120736b6f766f726f64612047677572646120626f726f64612070726f766f6461", - "protocolConsts": { - "k": 2160, - "protocolMagic": 764824073, - "vssMaxTTL": 6, - "vssMinTTL": 2 - }, - "startTime": 1506203091, - "bootStakeholders": { - "1deb82908402c7ee3efeb16f369d97fba316ee621d09b32b8969e54b": 1, - "65904a89e6d0e5f881513d1736945e051b76f095eca138ee869d543d": 1, - "5411c7bf87c252609831a337a713e4859668cba7bba70a9c3ef7c398": 1, - - "6c9e14978b9d6629b8703f4f25e9df6ed4814b930b8403b0d45350ea": 1, - "43011479a595b300e0726910d0b602ffcdd20466a3b8ceeacd3fbc26": 1, - - "5071d8802ddd05c59f4db907bd1749e82e6242caf6512b20a8368fcf": 1, - "af2800c124e599d6dec188a75f8bfde397ebb778163a18240371f2d1": 1 - }, - "heavyDelegation": { - "1deb82908402c7ee3efeb16f369d97fba316ee621d09b32b8969e54b":{"cert":"c8b39f094dc00608acb2d20ff274cb3e0c022ccb0ce558ea7c1a2d3a32cd54b42cc30d32406bcfbb7f2f86d05d2032848be15b178e3ad776f8b1bc56a671400d","delegatePk":"6MA6A8Cy3b6kGVyvOfQeZp99JR7PIh+7LydcCl1+BdGQ3MJG9WyOM6wANwZuL2ZN2qmF6lKECCZDMI3eT1v+3w==","issuerPk":"UHMxYf2vtsjLb64OJb35VVEFs2eO+wjxd1uekN5PXHe8yM7/+NkBHLJ4so/dyG2bqwmWVtd6eFbHYZEIy/ZXUg==","omega":0}, - "65904a89e6d0e5f881513d1736945e051b76f095eca138ee869d543d":{"cert":"552741f728196e62f218047b944b24ce4d374300d04b9b281426f55aa000d53ded66989ad5ea0908e6ff6492001ff18ece6c7040a934060759e9ae09863bf203","delegatePk":"X93u2t4nFNbbL54RBHQ9LY2Bjs3cMG4XYQjbFMqt1EG0V9WEDGD4hAuZyPeMKQriKdT4Qx5ni6elRcNWB7lN2w==","issuerPk":"C9sfXvPZlAN1k/ImYlXxNKVkZYuy34FLO5zvuW2jT6nIiFkchbdw/TZybV89mRxmiCiv/Hu+CHL9aZE25mTZ2A==","omega":0}, - "5411c7bf87c252609831a337a713e4859668cba7bba70a9c3ef7c398":{"cert":"c946fd596bdb31949aa435390de19a549c9698cad1813e34ff2431bc06190188188f4e84001380713e3f916c7526096e7c4855904bff40385007b81e1e657d0e","delegatePk":"i1Mgdin5ow5LIBUETzN8AXNavmckPBlHDJ2ujHtzJ5gJiHufQg1vcO4enVDBYFKHjlRLZctdRL1pF1ayhM2Cmw==","issuerPk":"mm+jQ8jGw23ho1Vv60Eb/fhwjVr4jehibQ/Gv6Tuu22Zq4PZDWZTGtkSLT+ctLydBbJkSGclMqaNp5b5MoQx/Q==","omega":0}, - - "6c9e14978b9d6629b8703f4f25e9df6ed4814b930b8403b0d45350ea":{"cert":"8ab43e904b06e799c1817c5ced4f3a7bbe15cdbf422dea9d2d5dc2c6105ce2f4d4c71e5d4779f6c44b770a133636109949e1f7786acb5a732bcdea0470fea406","delegatePk":"8U9xLcYA15MFLUhC1QzvpOZYhOps+DcHB564zjAu/IXa6SLV6zg40rkXhPBIJNJnZ7+2W9NqNudP7EbQnZiFjQ==","issuerPk":"JlZuhvxrmxd8hIDidbKxErVz9tBz+d7qU7jZnE7ZdrM1srOELw44AAHwkLySPKqWke2RFeKG2pQh4nRcesyH8Q==","omega":0}, - "43011479a595b300e0726910d0b602ffcdd20466a3b8ceeacd3fbc26":{"cert":"cf6ddc111545f61c2442b68bd7864ea952c428d145438948ef48a4af7e3f49b175564007685be5ae3c9ece0ab27de09721db0cb63aa67dc081a9f82d7e84210d","delegatePk":"kYDYGOac2ZfjRmPEGKZIwHby4ZzUGU5IbhWdhYC8bNqBNERAxq0OUwb9A1vvkoHaXY+9OPWfWI9wgQFu5hET0g==","issuerPk":"0pZchpkBIxeYxdAtOfyip5qkfD6FSSG1hVyC/RRwiRUX4fp3FlXsjK0T7PblcZrcU5L8BX4XA9X1gzEeg3Ri8Q==","omega":0}, - - "5071d8802ddd05c59f4db907bd1749e82e6242caf6512b20a8368fcf":{"cert":"496b29b5c57e8ac7cffc6e8b5e40b3d260e407ad4d09792decb0a22d54da7f8828265688a18aa1a5c76d9e7477a5f4a650501409fdcd3855b300fd2e2bc3c605","delegatePk":"icKfjErye3rMvliXR4IBNOu6ocrzzpSScKPQx9z9VBsd7zJtLvDbeANByeJh8EiQze7x+cmfbZC47cp9PPwJiA==","issuerPk":"mTqPBW0tPlCwrGATnxDfj4Ej1ffEgXtA2sK13YqpSoLoU2gy5jEt38B4fXtTEMgVZVraT9vPaxIpfURY7Mwt+w==","omega":0}, - "af2800c124e599d6dec188a75f8bfde397ebb778163a18240371f2d1":{"cert":"e03e62f083df5576360e60a32e22bbb07b3c8df4fcab8079f1d6f61af3954d242ba8a06516c395939f24096f3df14e103a7d9c2b80a68a9363cf1f27c7a4e307","delegatePk":"YSYalbdhPua/IGfa13twNJcpsMUNV7wc8w3g20oec6iF0AVK98I/xsN5GdukHGAqV+LQ+TKaeVS4ZzONb7LJRQ==","issuerPk":"G8l6L+AsKXiAzo7P2Zf+TB7AnuEP7u6faGdgFmsFKB1ig0aP/ZO+ywyVbM3dZC35sSRMkVkRGF+kk1X28iv6uQ==","omega":0} - }, - "nonAvvmBalances": {}, - "vssCerts": { - "6bef444609d6e336cb1fe1daba278918dbc5768e6754c2945dd8d25c":{"expiryEpoch":5,"signature":"2d96e4d4a4c506cc5762128b814ffb20afb97d30eb976334cd241a3935bd155ea1d68772b0903bde4584470359206769d83fa2ce55f56a1027ec3c52cb5e8703","signingKey":"6MA6A8Cy3b6kGVyvOfQeZp99JR7PIh+7LydcCl1+BdGQ3MJG9WyOM6wANwZuL2ZN2qmF6lKECCZDMI3eT1v+3w==","vssKey":"WCED6k6ArqOnhQtfNRg0FSCxWmAtocZcyV33AdjMotjGwxI="}, - "eb649333a196ecb024a4a5919d3ce86084014136fd3e884e52ecd057":{"expiryEpoch":5,"signature":"0b115a39935ce6008a4bbad0377f35463fd3510e282186ba43492768a02eb000bd4d3bc50799a24c53879ff2f2587179e797ee1c312acaf107cba67f91cb280b","signingKey":"X93u2t4nFNbbL54RBHQ9LY2Bjs3cMG4XYQjbFMqt1EG0V9WEDGD4hAuZyPeMKQriKdT4Qx5ni6elRcNWB7lN2w==","vssKey":"WCECS11PWxybUHKY2hHmBgm/zYaR2YsqsH+f3uPOp2ydz/E="}, - "5ffca3a329599727e39a7472c5270e54cf59a27b74306cc9f7fd0f5e":{"expiryEpoch":5,"signature":"6cc8d84dd55b41efcf46c4b3086da1fb60c938182b4b66657650839d9fac1e2194a8253dc6d5c107ac0e9e714d1364fff9d2114eae07363d9937ee1d92b69c06","signingKey":"i1Mgdin5ow5LIBUETzN8AXNavmckPBlHDJ2ujHtzJ5gJiHufQg1vcO4enVDBYFKHjlRLZctdRL1pF1ayhM2Cmw==","vssKey":"WCEDca27BxibVjQoA1QJaWx4gAE2MUB0lHfb6jJ3iorXD7s="}, - "ce1e50f578d3043dc78d8777f5723cc7b6ca512d8cdbe8a09aafc9c3":{"expiryEpoch":5,"signature":"2b830f1a79d2baca791a90c3784d74ec9f00267efac5ccd3cd7082b854234f411c237b59f34736933ba626fadc87fd6b2114c44486de692892d7401343990e01","signingKey":"8U9xLcYA15MFLUhC1QzvpOZYhOps+DcHB564zjAu/IXa6SLV6zg40rkXhPBIJNJnZ7+2W9NqNudP7EbQnZiFjQ==","vssKey":"WCECs1+lg8Lsm15FxfY8bhGyRuwe8yOaSH0wwSajLRYeW/s="}, - "0efd6f3b2849d5baf25b3e2bf2d46f88427b4e455fc3dc43f57819c5":{"expiryEpoch":5,"signature":"d381d32a18cd12a1c6ff87da0229c9a5b998fd093ac29f5d932bfc918e7dbc6e1dc292a36c46a3e129c5b1ef661124361426b443480534ff51dacc82bf4b630f","signingKey":"kYDYGOac2ZfjRmPEGKZIwHby4ZzUGU5IbhWdhYC8bNqBNERAxq0OUwb9A1vvkoHaXY+9OPWfWI9wgQFu5hET0g==","vssKey":"WCECgow+hJK+BxjNx0gIYrap+onUsRocObQEVzvJsdj68vw="}, - "1040655f58d5bf2be1c06f983abf66c7f01d28c239f27648a0c73e5d":{"expiryEpoch":5,"signature":"b02e89abb183da7c871bca87a563d38356b44f403348b6a5f24ee4459335290d980db69a6482455aae231a9880defe2fd4212272c4b2ea3da8744a8ba750440a","signingKey":"icKfjErye3rMvliXR4IBNOu6ocrzzpSScKPQx9z9VBsd7zJtLvDbeANByeJh8EiQze7x+cmfbZC47cp9PPwJiA==","vssKey":"WCECQoZjWJSu/6R74CC0ueh7cXmR0sasmTuCqf8X0BtAQ4o="}, - "1fa56ba63cff50d124b6af42f33b245a30fcd1b0170d7704b0b201c7":{"expiryEpoch":5,"signature":"7bb244c4fa1499021b0f2d36515a1f288a33cf00f1b88b57626998b439dcfb03ad88a7bc93101e4d83cdc75329799fbb2ccb28a7212a3e49737b06287d09b00c","signingKey":"YSYalbdhPua/IGfa13twNJcpsMUNV7wc8w3g20oec6iF0AVK98I/xsN5GdukHGAqV+LQ+TKaeVS4ZzONb7LJRQ==","vssKey":"WCECNXeQRqiTZSPDDyeRJ3gl/QzYMLLtNH0yN+XOl17pu8Y="} - } -} diff --git a/mithril-infra/assets/docker/cardano/config/9.0/mainnet/cardano-node/config-bp.json b/mithril-infra/assets/docker/cardano/config/9.0/mainnet/cardano-node/config-bp.json deleted file mode 100644 index 9985ee94122..00000000000 --- a/mithril-infra/assets/docker/cardano/config/9.0/mainnet/cardano-node/config-bp.json +++ /dev/null @@ -1,107 +0,0 @@ -{ - "AlonzoGenesisFile": "alonzo-genesis.json", - "AlonzoGenesisHash": "7e94a15f55d1e82d10f09203fa1d40f8eede58fd8066542cf6566008068ed874", - "ByronGenesisFile": "byron-genesis.json", - "ByronGenesisHash": "5f20df933584822601f9e3f8c024eb5eb252fe8cefb24d1317dc3d432e940ebb", - "EnableP2P": true, - "LastKnownBlockVersion-Alt": 0, - "LastKnownBlockVersion-Major": 3, - "LastKnownBlockVersion-Minor": 0, - "MaxKnownMajorProtocolVersion": 2, - "MinNodeVersion": "8.12.0", - "PeerSharing": false, - "Protocol": "Cardano", - "RequiresNetworkMagic": "RequiresNoMagic", - "ShelleyGenesisFile": "shelley-genesis.json", - "ShelleyGenesisHash": "1a3be38bcbb7911969283716ad7aa550250226b76a61fc51cc9a9a35d9276d81", - "TargetNumberOfActivePeers": 20, - "TargetNumberOfEstablishedPeers": 50, - "TargetNumberOfKnownPeers": 100, - "TargetNumberOfRootPeers": 100, - "TraceAcceptPolicy": true, - "TraceBlockFetchClient": false, - "TraceBlockFetchDecisions": false, - "TraceBlockFetchProtocol": false, - "TraceBlockFetchProtocolSerialised": false, - "TraceBlockFetchServer": false, - "TraceChainDb": true, - "TraceChainSyncBlockServer": false, - "TraceChainSyncClient": false, - "TraceChainSyncHeaderServer": false, - "TraceChainSyncProtocol": false, - "TraceConnectionManager": true, - "TraceDNSResolver": true, - "TraceDNSSubscription": true, - "TraceDiffusionInitialization": true, - "TraceErrorPolicy": true, - "TraceForge": true, - "TraceHandshake": true, - "TraceInboundGovernor": true, - "TraceIpSubscription": true, - "TraceLedgerPeers": true, - "TraceLocalChainSyncProtocol": false, - "TraceLocalConnectionManager": true, - "TraceLocalErrorPolicy": true, - "TraceLocalHandshake": true, - "TraceLocalRootPeers": true, - "TraceLocalTxSubmissionProtocol": false, - "TraceLocalTxSubmissionServer": false, - "TraceMempool": false, - "TraceMux": false, - "TracePeerSelection": true, - "TracePeerSelectionActions": true, - "TracePublicRootPeers": true, - "TraceServer": true, - "TraceTxInbound": false, - "TraceTxOutbound": false, - "TraceTxSubmissionProtocol": false, - "TracingVerbosity": "NormalVerbosity", - "TurnOnLogMetrics": true, - "TurnOnLogging": true, - "defaultBackends": [ - "KatipBK" - ], - "defaultScribes": [ - [ - "StdoutSK", - "stdout" - ] - ], - "hasEKG": 12788, - "hasPrometheus": [ - "127.0.0.1", - 12798 - ], - "minSeverity": "Info", - "options": { - "mapBackends": { - "cardano.node.metrics": [ - "EKGViewBK" - ], - "cardano.node.resources": [ - "EKGViewBK" - ] - }, - "mapSubtrace": { - "cardano.node.metrics": { - "subtrace": "Neutral" - } - } - }, - "rotation": { - "rpKeepFilesNum": 10, - "rpLogLimitBytes": 5000000, - "rpMaxAgeHours": 24 - }, - "setupBackends": [ - "KatipBK" - ], - "setupScribes": [ - { - "scFormat": "ScText", - "scKind": "StdoutSK", - "scName": "stdout", - "scRotation": null - } - ] -} diff --git a/mithril-infra/assets/docker/cardano/config/9.0/mainnet/cardano-node/config.json b/mithril-infra/assets/docker/cardano/config/9.0/mainnet/cardano-node/config.json deleted file mode 100644 index dade1c2848f..00000000000 --- a/mithril-infra/assets/docker/cardano/config/9.0/mainnet/cardano-node/config.json +++ /dev/null @@ -1,107 +0,0 @@ -{ - "AlonzoGenesisFile": "alonzo-genesis.json", - "AlonzoGenesisHash": "7e94a15f55d1e82d10f09203fa1d40f8eede58fd8066542cf6566008068ed874", - "ByronGenesisFile": "byron-genesis.json", - "ByronGenesisHash": "5f20df933584822601f9e3f8c024eb5eb252fe8cefb24d1317dc3d432e940ebb", - "EnableP2P": true, - "LastKnownBlockVersion-Alt": 0, - "LastKnownBlockVersion-Major": 3, - "LastKnownBlockVersion-Minor": 0, - "MaxKnownMajorProtocolVersion": 2, - "MinNodeVersion": "8.12.0", - "PeerSharing": true, - "Protocol": "Cardano", - "RequiresNetworkMagic": "RequiresNoMagic", - "ShelleyGenesisFile": "shelley-genesis.json", - "ShelleyGenesisHash": "1a3be38bcbb7911969283716ad7aa550250226b76a61fc51cc9a9a35d9276d81", - "TargetNumberOfActivePeers": 20, - "TargetNumberOfEstablishedPeers": 50, - "TargetNumberOfKnownPeers": 150, - "TargetNumberOfRootPeers": 60, - "TraceAcceptPolicy": true, - "TraceBlockFetchClient": false, - "TraceBlockFetchDecisions": false, - "TraceBlockFetchProtocol": false, - "TraceBlockFetchProtocolSerialised": false, - "TraceBlockFetchServer": false, - "TraceChainDb": true, - "TraceChainSyncBlockServer": false, - "TraceChainSyncClient": false, - "TraceChainSyncHeaderServer": false, - "TraceChainSyncProtocol": false, - "TraceConnectionManager": true, - "TraceDNSResolver": true, - "TraceDNSSubscription": true, - "TraceDiffusionInitialization": true, - "TraceErrorPolicy": true, - "TraceForge": true, - "TraceHandshake": true, - "TraceInboundGovernor": true, - "TraceIpSubscription": true, - "TraceLedgerPeers": true, - "TraceLocalChainSyncProtocol": false, - "TraceLocalConnectionManager": true, - "TraceLocalErrorPolicy": true, - "TraceLocalHandshake": true, - "TraceLocalRootPeers": true, - "TraceLocalTxSubmissionProtocol": false, - "TraceLocalTxSubmissionServer": false, - "TraceMempool": false, - "TraceMux": false, - "TracePeerSelection": true, - "TracePeerSelectionActions": true, - "TracePublicRootPeers": true, - "TraceServer": true, - "TraceTxInbound": false, - "TraceTxOutbound": false, - "TraceTxSubmissionProtocol": false, - "TracingVerbosity": "NormalVerbosity", - "TurnOnLogMetrics": true, - "TurnOnLogging": true, - "defaultBackends": [ - "KatipBK" - ], - "defaultScribes": [ - [ - "StdoutSK", - "stdout" - ] - ], - "hasEKG": 12788, - "hasPrometheus": [ - "127.0.0.1", - 12798 - ], - "minSeverity": "Info", - "options": { - "mapBackends": { - "cardano.node.metrics": [ - "EKGViewBK" - ], - "cardano.node.resources": [ - "EKGViewBK" - ] - }, - "mapSubtrace": { - "cardano.node.metrics": { - "subtrace": "Neutral" - } - } - }, - "rotation": { - "rpKeepFilesNum": 10, - "rpLogLimitBytes": 5000000, - "rpMaxAgeHours": 24 - }, - "setupBackends": [ - "KatipBK" - ], - "setupScribes": [ - { - "scFormat": "ScText", - "scKind": "StdoutSK", - "scName": "stdout", - "scRotation": null - } - ] -} diff --git a/mithril-infra/assets/docker/cardano/config/9.0/mainnet/cardano-node/shelley-genesis.json b/mithril-infra/assets/docker/cardano/config/9.0/mainnet/cardano-node/shelley-genesis.json deleted file mode 100644 index e8cc20dc2cc..00000000000 --- a/mithril-infra/assets/docker/cardano/config/9.0/mainnet/cardano-node/shelley-genesis.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "activeSlotsCoeff": 0.05, - "protocolParams": { - "protocolVersion": { - "minor": 0, - "major": 2 - }, - "decentralisationParam": 1, - "eMax": 18, - "extraEntropy": { - "tag": "NeutralNonce" - }, - "maxTxSize": 16384, - "maxBlockBodySize": 65536, - "maxBlockHeaderSize": 1100, - "minFeeA": 44, - "minFeeB": 155381, - "minUTxOValue": 1000000, - "poolDeposit": 500000000, - "minPoolCost": 340000000, - "keyDeposit": 2000000, - "nOpt": 150, - "rho": 0.003, - "tau": 0.20, - "a0": 0.3 - }, - "genDelegs": { - "ad5463153dc3d24b9ff133e46136028bdc1edbb897f5a7cf1b37950c": { - "delegate": "d9e5c76ad5ee778960804094a389f0b546b5c2b140a62f8ec43ea54d", - "vrf": "64fa87e8b29a5b7bfbd6795677e3e878c505bc4a3649485d366b50abadec92d7" - }, - "b9547b8a57656539a8d9bc42c008e38d9c8bd9c8adbb1e73ad529497": { - "delegate": "855d6fc1e54274e331e34478eeac8d060b0b90c1f9e8a2b01167c048", - "vrf": "66d5167a1f426bd1adcc8bbf4b88c280d38c148d135cb41e3f5a39f948ad7fcc" - }, - "60baee25cbc90047e83fd01e1e57dc0b06d3d0cb150d0ab40bbfead1": { - "delegate": "7f72a1826ae3b279782ab2bc582d0d2958de65bd86b2c4f82d8ba956", - "vrf": "c0546d9aa5740afd569d3c2d9c412595cd60822bb6d9a4e8ce6c43d12bd0f674" - }, - "f7b341c14cd58fca4195a9b278cce1ef402dc0e06deb77e543cd1757": { - "delegate": "69ae12f9e45c0c9122356c8e624b1fbbed6c22a2e3b4358cf0cb5011", - "vrf": "6394a632af51a32768a6f12dac3485d9c0712d0b54e3f389f355385762a478f2" - }, - "162f94554ac8c225383a2248c245659eda870eaa82d0ef25fc7dcd82": { - "delegate": "4485708022839a7b9b8b639a939c85ec0ed6999b5b6dc651b03c43f6", - "vrf": "aba81e764b71006c515986bf7b37a72fbb5554f78e6775f08e384dbd572a4b32" - }, - "2075a095b3c844a29c24317a94a643ab8e22d54a3a3a72a420260af6": { - "delegate": "6535db26347283990a252313a7903a45e3526ec25ddba381c071b25b", - "vrf": "fcaca997b8105bd860876348fc2c6e68b13607f9bbd23515cd2193b555d267af" - }, - "268cfc0b89e910ead22e0ade91493d8212f53f3e2164b2e4bef0819b": { - "delegate": "1d4f2e1fda43070d71bb22a5522f86943c7c18aeb4fa47a362c27e23", - "vrf": "63ef48bc5355f3e7973100c371d6a095251c80ceb40559f4750aa7014a6fb6db" - } - }, - "updateQuorum": 5, - "networkId": "Mainnet", - "initialFunds": {}, - "maxLovelaceSupply": 45000000000000000, - "networkMagic": 764824073, - "epochLength": 432000, - "systemStart": "2017-09-23T21:44:51Z", - "slotsPerKESPeriod": 129600, - "slotLength": 1, - "maxKESEvolutions": 62, - "securityParam": 2160 -} diff --git a/mithril-infra/assets/docker/cardano/config/9.0/mainnet/cardano-node/topology.json b/mithril-infra/assets/docker/cardano/config/9.0/mainnet/cardano-node/topology.json deleted file mode 100644 index 0a91fd2274a..00000000000 --- a/mithril-infra/assets/docker/cardano/config/9.0/mainnet/cardano-node/topology.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "bootstrapPeers": [ - { - "address": "backbone.cardano.iog.io", - "port": 3001 - }, - { - "address": "backbone.mainnet.emurgornd.com", - "port": 3001 - }, - { - "address": "backbone.mainnet.cardanofoundation.org", - "port": 3001 - } - ], - "localRoots": [ - { - "accessPoints": [], - "advertise": false, - "trustable": false, - "valency": 1 - } - ], - "publicRoots": [ - { - "accessPoints": [], - "advertise": false - } - ], - "useLedgerAfterSlot": 116812831 -} diff --git a/mithril-infra/assets/docker/cardano/config/9.0/preprod/cardano-node/alonzo-genesis.json b/mithril-infra/assets/docker/cardano/config/9.0/preprod/cardano-node/alonzo-genesis.json deleted file mode 100644 index 0fd90deeb7b..00000000000 --- a/mithril-infra/assets/docker/cardano/config/9.0/preprod/cardano-node/alonzo-genesis.json +++ /dev/null @@ -1,196 +0,0 @@ -{ - "lovelacePerUTxOWord": 34482, - "executionPrices": { - "prSteps": - { - "numerator" : 721, - "denominator" : 10000000 - }, - "prMem": - { - "numerator" : 577, - "denominator" : 10000 - } - }, - "maxTxExUnits": { - "exUnitsMem": 10000000, - "exUnitsSteps": 10000000000 - }, - "maxBlockExUnits": { - "exUnitsMem": 50000000, - "exUnitsSteps": 40000000000 - }, - "maxValueSize": 5000, - "collateralPercentage": 150, - "maxCollateralInputs": 3, - "costModels": { - "PlutusV1": { - "sha2_256-memory-arguments": 4, - "equalsString-cpu-arguments-constant": 1000, - "cekDelayCost-exBudgetMemory": 100, - "lessThanEqualsByteString-cpu-arguments-intercept": 103599, - "divideInteger-memory-arguments-minimum": 1, - "appendByteString-cpu-arguments-slope": 621, - "blake2b-cpu-arguments-slope": 29175, - "iData-cpu-arguments": 150000, - "encodeUtf8-cpu-arguments-slope": 1000, - "unBData-cpu-arguments": 150000, - "multiplyInteger-cpu-arguments-intercept": 61516, - "cekConstCost-exBudgetMemory": 100, - "nullList-cpu-arguments": 150000, - "equalsString-cpu-arguments-intercept": 150000, - "trace-cpu-arguments": 150000, - "mkNilData-memory-arguments": 32, - "lengthOfByteString-cpu-arguments": 150000, - "cekBuiltinCost-exBudgetCPU": 29773, - "bData-cpu-arguments": 150000, - "subtractInteger-cpu-arguments-slope": 0, - "unIData-cpu-arguments": 150000, - "consByteString-memory-arguments-intercept": 0, - "divideInteger-memory-arguments-slope": 1, - "divideInteger-cpu-arguments-model-arguments-slope": 118, - "listData-cpu-arguments": 150000, - "headList-cpu-arguments": 150000, - "chooseData-memory-arguments": 32, - "equalsInteger-cpu-arguments-intercept": 136542, - "sha3_256-cpu-arguments-slope": 82363, - "sliceByteString-cpu-arguments-slope": 5000, - "unMapData-cpu-arguments": 150000, - "lessThanInteger-cpu-arguments-intercept": 179690, - "mkCons-cpu-arguments": 150000, - "appendString-memory-arguments-intercept": 0, - "modInteger-cpu-arguments-model-arguments-slope": 118, - "ifThenElse-cpu-arguments": 1, - "mkNilPairData-cpu-arguments": 150000, - "lessThanEqualsInteger-cpu-arguments-intercept": 145276, - "addInteger-memory-arguments-slope": 1, - "chooseList-memory-arguments": 32, - "constrData-memory-arguments": 32, - "decodeUtf8-cpu-arguments-intercept": 150000, - "equalsData-memory-arguments": 1, - "subtractInteger-memory-arguments-slope": 1, - "appendByteString-memory-arguments-intercept": 0, - "lengthOfByteString-memory-arguments": 4, - "headList-memory-arguments": 32, - "listData-memory-arguments": 32, - "consByteString-cpu-arguments-intercept": 150000, - "unIData-memory-arguments": 32, - "remainderInteger-memory-arguments-minimum": 1, - "bData-memory-arguments": 32, - "lessThanByteString-cpu-arguments-slope": 248, - "encodeUtf8-memory-arguments-intercept": 0, - "cekStartupCost-exBudgetCPU": 100, - "multiplyInteger-memory-arguments-intercept": 0, - "unListData-memory-arguments": 32, - "remainderInteger-cpu-arguments-model-arguments-slope": 118, - "cekVarCost-exBudgetCPU": 29773, - "remainderInteger-memory-arguments-slope": 1, - "cekForceCost-exBudgetCPU": 29773, - "sha2_256-cpu-arguments-slope": 29175, - "equalsInteger-memory-arguments": 1, - "indexByteString-memory-arguments": 1, - "addInteger-memory-arguments-intercept": 1, - "chooseUnit-cpu-arguments": 150000, - "sndPair-cpu-arguments": 150000, - "cekLamCost-exBudgetCPU": 29773, - "fstPair-cpu-arguments": 150000, - "quotientInteger-memory-arguments-minimum": 1, - "decodeUtf8-cpu-arguments-slope": 1000, - "lessThanInteger-memory-arguments": 1, - "lessThanEqualsInteger-cpu-arguments-slope": 1366, - "fstPair-memory-arguments": 32, - "modInteger-memory-arguments-intercept": 0, - "unConstrData-cpu-arguments": 150000, - "lessThanEqualsInteger-memory-arguments": 1, - "chooseUnit-memory-arguments": 32, - "sndPair-memory-arguments": 32, - "addInteger-cpu-arguments-intercept": 197209, - "decodeUtf8-memory-arguments-slope": 8, - "equalsData-cpu-arguments-intercept": 150000, - "mapData-cpu-arguments": 150000, - "mkPairData-cpu-arguments": 150000, - "quotientInteger-cpu-arguments-constant": 148000, - "consByteString-memory-arguments-slope": 1, - "cekVarCost-exBudgetMemory": 100, - "indexByteString-cpu-arguments": 150000, - "unListData-cpu-arguments": 150000, - "equalsInteger-cpu-arguments-slope": 1326, - "cekStartupCost-exBudgetMemory": 100, - "subtractInteger-cpu-arguments-intercept": 197209, - "divideInteger-cpu-arguments-model-arguments-intercept": 425507, - "divideInteger-memory-arguments-intercept": 0, - "cekForceCost-exBudgetMemory": 100, - "blake2b-cpu-arguments-intercept": 2477736, - "remainderInteger-cpu-arguments-constant": 148000, - "tailList-cpu-arguments": 150000, - "encodeUtf8-cpu-arguments-intercept": 150000, - "equalsString-cpu-arguments-slope": 1000, - "lessThanByteString-memory-arguments": 1, - "multiplyInteger-cpu-arguments-slope": 11218, - "appendByteString-cpu-arguments-intercept": 396231, - "lessThanEqualsByteString-cpu-arguments-slope": 248, - "modInteger-memory-arguments-slope": 1, - "addInteger-cpu-arguments-slope": 0, - "equalsData-cpu-arguments-slope": 10000, - "decodeUtf8-memory-arguments-intercept": 0, - "chooseList-cpu-arguments": 150000, - "constrData-cpu-arguments": 150000, - "equalsByteString-memory-arguments": 1, - "cekApplyCost-exBudgetCPU": 29773, - "quotientInteger-memory-arguments-slope": 1, - "verifySignature-cpu-arguments-intercept": 3345831, - "unMapData-memory-arguments": 32, - "mkCons-memory-arguments": 32, - "sliceByteString-memory-arguments-slope": 1, - "sha3_256-memory-arguments": 4, - "ifThenElse-memory-arguments": 1, - "mkNilPairData-memory-arguments": 32, - "equalsByteString-cpu-arguments-slope": 247, - "appendString-cpu-arguments-intercept": 150000, - "quotientInteger-cpu-arguments-model-arguments-slope": 118, - "cekApplyCost-exBudgetMemory": 100, - "equalsString-memory-arguments": 1, - "multiplyInteger-memory-arguments-slope": 1, - "cekBuiltinCost-exBudgetMemory": 100, - "remainderInteger-memory-arguments-intercept": 0, - "sha2_256-cpu-arguments-intercept": 2477736, - "remainderInteger-cpu-arguments-model-arguments-intercept": 425507, - "lessThanEqualsByteString-memory-arguments": 1, - "tailList-memory-arguments": 32, - "mkNilData-cpu-arguments": 150000, - "chooseData-cpu-arguments": 150000, - "unBData-memory-arguments": 32, - "blake2b-memory-arguments": 4, - "iData-memory-arguments": 32, - "nullList-memory-arguments": 32, - "cekDelayCost-exBudgetCPU": 29773, - "subtractInteger-memory-arguments-intercept": 1, - "lessThanByteString-cpu-arguments-intercept": 103599, - "consByteString-cpu-arguments-slope": 1000, - "appendByteString-memory-arguments-slope": 1, - "trace-memory-arguments": 32, - "divideInteger-cpu-arguments-constant": 148000, - "cekConstCost-exBudgetCPU": 29773, - "encodeUtf8-memory-arguments-slope": 8, - "quotientInteger-cpu-arguments-model-arguments-intercept": 425507, - "mapData-memory-arguments": 32, - "appendString-cpu-arguments-slope": 1000, - "modInteger-cpu-arguments-constant": 148000, - "verifySignature-cpu-arguments-slope": 1, - "unConstrData-memory-arguments": 32, - "quotientInteger-memory-arguments-intercept": 0, - "equalsByteString-cpu-arguments-constant": 150000, - "sliceByteString-memory-arguments-intercept": 0, - "mkPairData-memory-arguments": 32, - "equalsByteString-cpu-arguments-intercept": 112536, - "appendString-memory-arguments-slope": 1, - "lessThanInteger-cpu-arguments-slope": 497, - "modInteger-cpu-arguments-model-arguments-intercept": 425507, - "modInteger-memory-arguments-minimum": 1, - "sha3_256-cpu-arguments-intercept": 0, - "verifySignature-memory-arguments": 1, - "cekLamCost-exBudgetMemory": 100, - "sliceByteString-cpu-arguments-intercept": 150000 - } - } -} diff --git a/mithril-infra/assets/docker/cardano/config/9.0/preprod/cardano-node/byron-genesis.json b/mithril-infra/assets/docker/cardano/config/9.0/preprod/cardano-node/byron-genesis.json deleted file mode 100644 index 23425788693..00000000000 --- a/mithril-infra/assets/docker/cardano/config/9.0/preprod/cardano-node/byron-genesis.json +++ /dev/null @@ -1,117 +0,0 @@ -{ "bootStakeholders": - { "05d1c10e4bf3cdd4de54712531c53be75a1609b25f396ffbbe5becf1": 1 - , "3bf1193b19be416283b8c0516d2f8b80939ffccb1c9b05946f54c83a": 1 - , "7bdd769bd872e8e6336c23f1e566c19a96e72137174b891fad9f4b99": 1 - , "9ddc1e29c59df0ddd9347fe8b8a736d247f286414684eddc02885348": 1 - , "a118c0d2737c8a77c0d982a0d299bc42614cea4e0c23614ba24a05ca": 1 - , "b0b2df3c9cf4dfe2ae04409913b3c3125509acbbfa0722449570aaeb": 1 - , "e0a65f21229e44c2bf6eec5b14e2775003b674ae53de18d22814346a": 1 - } -, "heavyDelegation": - { "05d1c10e4bf3cdd4de54712531c53be75a1609b25f396ffbbe5becf1": - { "omega": 0 - , "issuerPk": - "UFsjehyxQAIMxEL25RxqD0itM0RCdzWprVt1W+zopM5b7U9ru9AMr/zf9lAjWaFlNOpRgrrbz7r5tRbt8wUmSg==" - , "delegatePk": - "iwlg0jS9pn1SQyxdGiasor+1uaCflm2Vkqe/DHKKHs2EDqxcP+in7doCSnQDttN3BZkIKLNUgzKj+FAiHCCYvw==" - , "cert": - "633fc347138ee155d038b9d1040ee1e45cea5b1e8627046c95f7fe4ba949b0569437962568eadef9d49e22becbf30192425c008d10e03004612633dbc307340b" - } - , "3bf1193b19be416283b8c0516d2f8b80939ffccb1c9b05946f54c83a": - { "omega": 0 - , "issuerPk": - "pAIACMG6WCa4mz0tVoeekLXYuWkdxk/rgDuZ/x7ugh3CvEuhpGf2LRRRWilaGdraH1sCbnuMCmAHrBTbPDFmxA==" - , "delegatePk": - "0ajebKqP2bF1xZhi7N1avNBHe4S4Kg5S+uzGs8hRAKR1IW/7ZOp0U3AhQFuzKLD3BuSq1xV3leMWeBzKEg2slg==" - , "cert": - "eb5c4d76c7bfca2ab790a76f7dc4c6d9f7d0956d4af3b8c649804ef98beeb138d8916982c9142747b7a07e69f52b2c3776d64a7d74494e0f72eefaebf6bf5d07" - } - , "7bdd769bd872e8e6336c23f1e566c19a96e72137174b891fad9f4b99": - { "omega": 0 - , "issuerPk": - "P7JjeSPHjexNW5MsCaySrURaqV2gCgXttEe0CgfFnVZFGHaS9A4xEUrQ83VTLPjk+HV0Di19DjQ+DhS1M6Mf7A==" - , "delegatePk": - "jvMgwt9mVKYYjEXpxjnApoa/WoZSlVh9OZ3+sF/nSrZ5YaaWsmjIvOyTcrxzqpsTZewAez36BTnqwA0VSjFRjA==" - , "cert": - "9ef9f0e5ca23cd9365ec7a23f1b2d159da0d58e0242cb817c3bc946ba1c9e3629f1976f09a88370247bbc458c810d21a889e3ff6dd189ceea784bc9ab6dc9b0a" - } - , "9ddc1e29c59df0ddd9347fe8b8a736d247f286414684eddc02885348": - { "omega": 0 - , "issuerPk": - "Xro6BbV6hMh3RTZnst4ABhtQ2vr83YPXoLfQ8JWeunvvcuudGBQvLeqwVfGXrBWoMOOKroFV48ygfSEq2xhREA==" - , "delegatePk": - "mq5iXU0VvLNzPUIOBk8c0zjzhuCvBJ/NQrRVpp0orTZkg9F3uiuAG0E24NZmLl6eCiTyyAoOeNTCNbTAjyAfTA==" - , "cert": - "939dcfe5555ee661b9db5d817a70d5c3fa9d1d97c2ae5849696d915606b530f7e9edda5d02a01e61524a766f9c356084616ba058a3de70ea51bf29cd187a5f07" - } - , "a118c0d2737c8a77c0d982a0d299bc42614cea4e0c23614ba24a05ca": - { "omega": 0 - , "issuerPk": - "eqAAtu1X79MxCSa/i/RSApLGsnhDYqLJLu93f3wSzR5/M7calZS8DHFrAtJgzYbkg9nwKF1HQQ8bO/1LOJ9O4w==" - , "delegatePk": - "lCuzqqsPZEK5BrZbpt2/eWnKpmLZCWiSYhGj1WUy8R2OjLStw/UDT7xiV/pbEIZoncfQJN9yJqpQH8KOui0fYw==" - , "cert": - "b96ad354a6989df5de8d0888414843736d0a4a6626a1e595e8785a70b10a38eb4632159aabf84959983e8852fd4d390eba6c423fac8ea117913cec46353bd90e" - } - , "b0b2df3c9cf4dfe2ae04409913b3c3125509acbbfa0722449570aaeb": - { "omega": 0 - , "issuerPk": - "Y+Vaj0IaMeq0+oWjQr5hiEl4Ek+cWsKq7mufTO4wue2R6A6AMlqEDIV7vYsd3NZWomG5DGcwSAw2Ev1Mz26LIA==" - , "delegatePk": - "YYtiXfMN5TiV/ynno3cNylbC/wZtSqBaaXGQXe7O9tu33RDqH5F15Sk+reyXvxaxZ683mns+1K8DLNB7mezB6g==" - , "cert": - "ca38e688e759183b57d08ca6568248b91c8ddd81e56d0d31c3f3a26eca35754387c5f301ef017dafae453a93757d39a0e2d326ebe59cf31d5c1b22fc8616ac00" - } - , "e0a65f21229e44c2bf6eec5b14e2775003b674ae53de18d22814346a": - { "omega": 0 - , "issuerPk": - "vynbl3q/BFvwehgMzpp3NoWOuN5RwDUYCbNop0RR0jlEXomgPOrlXCwMTrwrI8Dcfzq5q1fK/1hOfv9IwDMPAA==" - , "delegatePk": - "1N1ppBBxvC3I5kqX9L1jeVJM4MK2ZXKAQ6Bn400+IYr4mh4zTYciCsTJTyvY8IKIBBEcT3GYW6ZlaYy7XbY5kg==" - , "cert": - "82b10bbea2dd80441315230354e3e4af0ac87d02c9e6424fc9432be21a6183c81555d3a1b373566aef7a8065a126d57c42629be780becc61bc1b8f3ce5b5170d" - } - } -, "startTime": 1654041600 -, "nonAvvmBalances": - { "FHnt4NL7yPXhCzCHVywZLqVsvwuG3HvwmjKXQJBrXh3h2aigv6uxkePbpzRNV8q": - "0" - , "FHnt4NL7yPXuJGViM3KwSPwrwECD9q5vNetX3QJDYRWgiX3RHi5i5VV32dnETDK": - "0" - , "FHnt4NL7yPXuYUxBF33VX5dZMBDAab2kvSNLRzCskvuKNCSDknzrQvKeQhGUw5a": - "30000000000000000" - , "FHnt4NL7yPY8exfnuJ8ACyoU7xCN93tKXSv357UrTp1nddGbkWxJpQfrt62xYFX": - "0" - , "FHnt4NL7yPYFpVcAXZADrKdsqCAFvcRFYkTcqkn2guGmj8akQMiMVjhSUECvD1F": - "0" - , "FHnt4NL7yPYH2vP2FLEfH2pt3K6meM7fgtjRiLBidaqpP5ogPzxLNsZy68e1KdW": - "0" - , "FHnt4NL7yPYHrcxPtPufYYFWLhqvHGnZ5NFSz2KZpWQgSq4VLsUgWnkEmfUtd1E": - "0" - , "FHnt4NL7yPYJiN5Y8VsQr6LP6YgN51BHBPegNjVwKkq6AooCkbTpfZ2bqkVkfXU": - "0" - } -, "blockVersionData": - { "scriptVersion": 0 - , "slotDuration": "20000" - , "maxBlockSize": "2000000" - , "maxHeaderSize": "2000000" - , "maxTxSize": "4096" - , "maxProposalSize": "700" - , "mpcThd": "20000000000000" - , "heavyDelThd": "300000000000" - , "updateVoteThd": "1000000000000" - , "updateProposalThd": "100000000000000" - , "updateImplicit": "10000" - , "softforkRule": - { "initThd": "900000000000000" - , "minThd": "600000000000000" - , "thdDecrement": "50000000000000" - } - , "txFeePolicy": - { "summand": "155381000000000" , "multiplier": "43946000000" } - , "unlockStakeEpoch": "18446744073709551615" - } -, "protocolConsts": { "k": 2160 , "protocolMagic": 1 } -, "avvmDistr": {} -} \ No newline at end of file diff --git a/mithril-infra/assets/docker/cardano/config/9.0/preprod/cardano-node/config-bp.json b/mithril-infra/assets/docker/cardano/config/9.0/preprod/cardano-node/config-bp.json deleted file mode 100644 index 29cb19a06d4..00000000000 --- a/mithril-infra/assets/docker/cardano/config/9.0/preprod/cardano-node/config-bp.json +++ /dev/null @@ -1,106 +0,0 @@ -{ - "AlonzoGenesisFile": "alonzo-genesis.json", - "AlonzoGenesisHash": "7e94a15f55d1e82d10f09203fa1d40f8eede58fd8066542cf6566008068ed874", - "ByronGenesisFile": "byron-genesis.json", - "ByronGenesisHash": "d4b8de7a11d929a323373cbab6c1a9bdc931beffff11db111cf9d57356ee1937", - "EnableP2P": true, - "LastKnownBlockVersion-Alt": 0, - "LastKnownBlockVersion-Major": 2, - "LastKnownBlockVersion-Minor": 0, - "MinNodeVersion": "8.12.0", - "PeerSharing": false, - "Protocol": "Cardano", - "RequiresNetworkMagic": "RequiresMagic", - "ShelleyGenesisFile": "shelley-genesis.json", - "ShelleyGenesisHash": "162d29c4e1cf6b8a84f2d692e67a3ac6bc7851bc3e6e4afe64d15778bed8bd86", - "TargetNumberOfActivePeers": 20, - "TargetNumberOfEstablishedPeers": 50, - "TargetNumberOfKnownPeers": 100, - "TargetNumberOfRootPeers": 100, - "TraceAcceptPolicy": true, - "TraceBlockFetchClient": false, - "TraceBlockFetchDecisions": false, - "TraceBlockFetchProtocol": false, - "TraceBlockFetchProtocolSerialised": false, - "TraceBlockFetchServer": false, - "TraceChainDb": true, - "TraceChainSyncBlockServer": false, - "TraceChainSyncClient": false, - "TraceChainSyncHeaderServer": false, - "TraceChainSyncProtocol": false, - "TraceConnectionManager": true, - "TraceDNSResolver": true, - "TraceDNSSubscription": true, - "TraceDiffusionInitialization": true, - "TraceErrorPolicy": true, - "TraceForge": true, - "TraceHandshake": true, - "TraceInboundGovernor": true, - "TraceIpSubscription": true, - "TraceLedgerPeers": true, - "TraceLocalChainSyncProtocol": false, - "TraceLocalConnectionManager": true, - "TraceLocalErrorPolicy": true, - "TraceLocalHandshake": true, - "TraceLocalRootPeers": true, - "TraceLocalTxSubmissionProtocol": false, - "TraceLocalTxSubmissionServer": false, - "TraceMempool": true, - "TraceMux": false, - "TracePeerSelection": true, - "TracePeerSelectionActions": true, - "TracePublicRootPeers": true, - "TraceServer": true, - "TraceTxInbound": false, - "TraceTxOutbound": false, - "TraceTxSubmissionProtocol": false, - "TracingVerbosity": "NormalVerbosity", - "TurnOnLogMetrics": true, - "TurnOnLogging": true, - "defaultBackends": [ - "KatipBK" - ], - "defaultScribes": [ - [ - "StdoutSK", - "stdout" - ] - ], - "hasEKG": 12788, - "hasPrometheus": [ - "127.0.0.1", - 12798 - ], - "minSeverity": "Info", - "options": { - "mapBackends": { - "cardano.node.metrics": [ - "EKGViewBK" - ], - "cardano.node.resources": [ - "EKGViewBK" - ] - }, - "mapSubtrace": { - "cardano.node.metrics": { - "subtrace": "Neutral" - } - } - }, - "rotation": { - "rpKeepFilesNum": 10, - "rpLogLimitBytes": 5000000, - "rpMaxAgeHours": 24 - }, - "setupBackends": [ - "KatipBK" - ], - "setupScribes": [ - { - "scFormat": "ScText", - "scKind": "StdoutSK", - "scName": "stdout", - "scRotation": null - } - ] -} diff --git a/mithril-infra/assets/docker/cardano/config/9.0/preprod/cardano-node/config.json b/mithril-infra/assets/docker/cardano/config/9.0/preprod/cardano-node/config.json deleted file mode 100644 index ec2b280c407..00000000000 --- a/mithril-infra/assets/docker/cardano/config/9.0/preprod/cardano-node/config.json +++ /dev/null @@ -1,106 +0,0 @@ -{ - "AlonzoGenesisFile": "alonzo-genesis.json", - "AlonzoGenesisHash": "7e94a15f55d1e82d10f09203fa1d40f8eede58fd8066542cf6566008068ed874", - "ByronGenesisFile": "byron-genesis.json", - "ByronGenesisHash": "d4b8de7a11d929a323373cbab6c1a9bdc931beffff11db111cf9d57356ee1937", - "EnableP2P": true, - "LastKnownBlockVersion-Alt": 0, - "LastKnownBlockVersion-Major": 2, - "LastKnownBlockVersion-Minor": 0, - "MinNodeVersion": "8.12.0", - "PeerSharing": true, - "Protocol": "Cardano", - "RequiresNetworkMagic": "RequiresMagic", - "ShelleyGenesisFile": "shelley-genesis.json", - "ShelleyGenesisHash": "162d29c4e1cf6b8a84f2d692e67a3ac6bc7851bc3e6e4afe64d15778bed8bd86", - "TargetNumberOfActivePeers": 20, - "TargetNumberOfEstablishedPeers": 50, - "TargetNumberOfKnownPeers": 150, - "TargetNumberOfRootPeers": 60, - "TraceAcceptPolicy": true, - "TraceBlockFetchClient": false, - "TraceBlockFetchDecisions": false, - "TraceBlockFetchProtocol": false, - "TraceBlockFetchProtocolSerialised": false, - "TraceBlockFetchServer": false, - "TraceChainDb": true, - "TraceChainSyncBlockServer": false, - "TraceChainSyncClient": false, - "TraceChainSyncHeaderServer": false, - "TraceChainSyncProtocol": false, - "TraceConnectionManager": true, - "TraceDNSResolver": true, - "TraceDNSSubscription": true, - "TraceDiffusionInitialization": true, - "TraceErrorPolicy": true, - "TraceForge": true, - "TraceHandshake": true, - "TraceInboundGovernor": true, - "TraceIpSubscription": true, - "TraceLedgerPeers": true, - "TraceLocalChainSyncProtocol": false, - "TraceLocalConnectionManager": true, - "TraceLocalErrorPolicy": true, - "TraceLocalHandshake": true, - "TraceLocalRootPeers": true, - "TraceLocalTxSubmissionProtocol": false, - "TraceLocalTxSubmissionServer": false, - "TraceMempool": true, - "TraceMux": false, - "TracePeerSelection": true, - "TracePeerSelectionActions": true, - "TracePublicRootPeers": true, - "TraceServer": true, - "TraceTxInbound": false, - "TraceTxOutbound": false, - "TraceTxSubmissionProtocol": false, - "TracingVerbosity": "NormalVerbosity", - "TurnOnLogMetrics": true, - "TurnOnLogging": true, - "defaultBackends": [ - "KatipBK" - ], - "defaultScribes": [ - [ - "StdoutSK", - "stdout" - ] - ], - "hasEKG": 12788, - "hasPrometheus": [ - "127.0.0.1", - 12798 - ], - "minSeverity": "Info", - "options": { - "mapBackends": { - "cardano.node.metrics": [ - "EKGViewBK" - ], - "cardano.node.resources": [ - "EKGViewBK" - ] - }, - "mapSubtrace": { - "cardano.node.metrics": { - "subtrace": "Neutral" - } - } - }, - "rotation": { - "rpKeepFilesNum": 10, - "rpLogLimitBytes": 5000000, - "rpMaxAgeHours": 24 - }, - "setupBackends": [ - "KatipBK" - ], - "setupScribes": [ - { - "scFormat": "ScText", - "scKind": "StdoutSK", - "scName": "stdout", - "scRotation": null - } - ] -} diff --git a/mithril-infra/assets/docker/cardano/config/9.0/preprod/cardano-node/shelley-genesis.json b/mithril-infra/assets/docker/cardano/config/9.0/preprod/cardano-node/shelley-genesis.json deleted file mode 100644 index 24862eb838a..00000000000 --- a/mithril-infra/assets/docker/cardano/config/9.0/preprod/cardano-node/shelley-genesis.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "activeSlotsCoeff": 0.05, - "epochLength": 432000, - "genDelegs": { - "637f2e950b0fd8f8e3e811c5fbeb19e411e7a2bf37272b84b29c1a0b": { - "delegate": "aae9293510344ddd636364c2673e34e03e79e3eefa8dbaa70e326f7d", - "vrf": "227116365af2ed943f1a8b5e6557bfaa34996f1578eec667a5e2b361c51e4ce7" - }, - "8a4b77c4f534f8b8cc6f269e5ebb7ba77fa63a476e50e05e66d7051c": { - "delegate": "d15422b2e8b60e500a82a8f4ceaa98b04e55a0171d1125f6c58f8758", - "vrf": "0ada6c25d62db5e1e35d3df727635afa943b9e8a123ab83785e2281605b09ce2" - }, - "b00470cd193d67aac47c373602fccd4195aad3002c169b5570de1126": { - "delegate": "b3b539e9e7ed1b32fbf778bf2ebf0a6b9f980eac90ac86623d11881a", - "vrf": "0ff0ce9b820376e51c03b27877cd08f8ba40318f1a9f85a3db0b60dd03f71a7a" - }, - "b260ffdb6eba541fcf18601923457307647dce807851b9d19da133ab": { - "delegate": "7c64eb868b4ef566391a321c85323f41d2b95480d7ce56ad2abcb022", - "vrf": "7fb22abd39d550c9a022ec8104648a26240a9ff9c88b8b89a6e20d393c03098e" - }, - "ced1599fd821a39593e00592e5292bdc1437ae0f7af388ef5257344a": { - "delegate": "de7ca985023cf892f4de7f5f1d0a7181668884752d9ebb9e96c95059", - "vrf": "c301b7fc4d1b57fb60841bcec5e3d2db89602e5285801e522fce3790987b1124" - }, - "dd2a7d71a05bed11db61555ba4c658cb1ce06c8024193d064f2a66ae": { - "delegate": "1e113c218899ee7807f4028071d0e108fc790dade9fd1a0d0b0701ee", - "vrf": "faf2702aa4893c877c622ab22dfeaf1d0c8aab98b837fe2bf667314f0d043822" - }, - "f3b9e74f7d0f24d2314ea5dfbca94b65b2059d1ff94d97436b82d5b4": { - "delegate": "fd637b08cc379ef7b99c83b416458fcda8a01a606041779331008fb9", - "vrf": "37f2ea7c843a688159ddc2c38a2f997ab465150164a9136dca69564714b73268" - } - }, - "initialFunds": {}, - "maxKESEvolutions": 62, - "maxLovelaceSupply": 45000000000000000, - "networkId": "Testnet", - "networkMagic": 1, - "protocolParams": { - "protocolVersion": { - "minor": 0, - "major": 2 - }, - "decentralisationParam": 1, - "eMax": 18, - "extraEntropy": { - "tag": "NeutralNonce" - }, - "maxTxSize": 16384, - "maxBlockBodySize": 65536, - "maxBlockHeaderSize": 1100, - "minFeeA": 44, - "minFeeB": 155381, - "minUTxOValue": 1000000, - "poolDeposit": 500000000, - "minPoolCost": 340000000, - "keyDeposit": 2000000, - "nOpt": 150, - "rho": 0.003, - "tau": 0.20, - "a0": 0.3 - }, - "securityParam": 2160, - "slotLength": 1, - "slotsPerKESPeriod": 129600, - "staking": { - "pools": {}, - "stake": {} - }, - "systemStart": "2022-06-01T00:00:00Z", - "updateQuorum": 5 -} diff --git a/mithril-infra/assets/docker/cardano/config/9.0/preprod/cardano-node/topology.json b/mithril-infra/assets/docker/cardano/config/9.0/preprod/cardano-node/topology.json deleted file mode 100644 index 9faac371406..00000000000 --- a/mithril-infra/assets/docker/cardano/config/9.0/preprod/cardano-node/topology.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "bootstrapPeers": [ - { - "address": "preprod-node.play.dev.cardano.org", - "port": 3001 - } - ], - "localRoots": [ - { - "accessPoints": [], - "advertise": false, - "trustable": false, - "valency": 1 - } - ], - "publicRoots": [ - { - "accessPoints": [], - "advertise": false - } - ], - "useLedgerAfterSlot": 52358331 -} diff --git a/mithril-infra/assets/docker/cardano/config/9.0/preview/cardano-node/alonzo-genesis.json b/mithril-infra/assets/docker/cardano/config/9.0/preview/cardano-node/alonzo-genesis.json deleted file mode 100644 index 0fd90deeb7b..00000000000 --- a/mithril-infra/assets/docker/cardano/config/9.0/preview/cardano-node/alonzo-genesis.json +++ /dev/null @@ -1,196 +0,0 @@ -{ - "lovelacePerUTxOWord": 34482, - "executionPrices": { - "prSteps": - { - "numerator" : 721, - "denominator" : 10000000 - }, - "prMem": - { - "numerator" : 577, - "denominator" : 10000 - } - }, - "maxTxExUnits": { - "exUnitsMem": 10000000, - "exUnitsSteps": 10000000000 - }, - "maxBlockExUnits": { - "exUnitsMem": 50000000, - "exUnitsSteps": 40000000000 - }, - "maxValueSize": 5000, - "collateralPercentage": 150, - "maxCollateralInputs": 3, - "costModels": { - "PlutusV1": { - "sha2_256-memory-arguments": 4, - "equalsString-cpu-arguments-constant": 1000, - "cekDelayCost-exBudgetMemory": 100, - "lessThanEqualsByteString-cpu-arguments-intercept": 103599, - "divideInteger-memory-arguments-minimum": 1, - "appendByteString-cpu-arguments-slope": 621, - "blake2b-cpu-arguments-slope": 29175, - "iData-cpu-arguments": 150000, - "encodeUtf8-cpu-arguments-slope": 1000, - "unBData-cpu-arguments": 150000, - "multiplyInteger-cpu-arguments-intercept": 61516, - "cekConstCost-exBudgetMemory": 100, - "nullList-cpu-arguments": 150000, - "equalsString-cpu-arguments-intercept": 150000, - "trace-cpu-arguments": 150000, - "mkNilData-memory-arguments": 32, - "lengthOfByteString-cpu-arguments": 150000, - "cekBuiltinCost-exBudgetCPU": 29773, - "bData-cpu-arguments": 150000, - "subtractInteger-cpu-arguments-slope": 0, - "unIData-cpu-arguments": 150000, - "consByteString-memory-arguments-intercept": 0, - "divideInteger-memory-arguments-slope": 1, - "divideInteger-cpu-arguments-model-arguments-slope": 118, - "listData-cpu-arguments": 150000, - "headList-cpu-arguments": 150000, - "chooseData-memory-arguments": 32, - "equalsInteger-cpu-arguments-intercept": 136542, - "sha3_256-cpu-arguments-slope": 82363, - "sliceByteString-cpu-arguments-slope": 5000, - "unMapData-cpu-arguments": 150000, - "lessThanInteger-cpu-arguments-intercept": 179690, - "mkCons-cpu-arguments": 150000, - "appendString-memory-arguments-intercept": 0, - "modInteger-cpu-arguments-model-arguments-slope": 118, - "ifThenElse-cpu-arguments": 1, - "mkNilPairData-cpu-arguments": 150000, - "lessThanEqualsInteger-cpu-arguments-intercept": 145276, - "addInteger-memory-arguments-slope": 1, - "chooseList-memory-arguments": 32, - "constrData-memory-arguments": 32, - "decodeUtf8-cpu-arguments-intercept": 150000, - "equalsData-memory-arguments": 1, - "subtractInteger-memory-arguments-slope": 1, - "appendByteString-memory-arguments-intercept": 0, - "lengthOfByteString-memory-arguments": 4, - "headList-memory-arguments": 32, - "listData-memory-arguments": 32, - "consByteString-cpu-arguments-intercept": 150000, - "unIData-memory-arguments": 32, - "remainderInteger-memory-arguments-minimum": 1, - "bData-memory-arguments": 32, - "lessThanByteString-cpu-arguments-slope": 248, - "encodeUtf8-memory-arguments-intercept": 0, - "cekStartupCost-exBudgetCPU": 100, - "multiplyInteger-memory-arguments-intercept": 0, - "unListData-memory-arguments": 32, - "remainderInteger-cpu-arguments-model-arguments-slope": 118, - "cekVarCost-exBudgetCPU": 29773, - "remainderInteger-memory-arguments-slope": 1, - "cekForceCost-exBudgetCPU": 29773, - "sha2_256-cpu-arguments-slope": 29175, - "equalsInteger-memory-arguments": 1, - "indexByteString-memory-arguments": 1, - "addInteger-memory-arguments-intercept": 1, - "chooseUnit-cpu-arguments": 150000, - "sndPair-cpu-arguments": 150000, - "cekLamCost-exBudgetCPU": 29773, - "fstPair-cpu-arguments": 150000, - "quotientInteger-memory-arguments-minimum": 1, - "decodeUtf8-cpu-arguments-slope": 1000, - "lessThanInteger-memory-arguments": 1, - "lessThanEqualsInteger-cpu-arguments-slope": 1366, - "fstPair-memory-arguments": 32, - "modInteger-memory-arguments-intercept": 0, - "unConstrData-cpu-arguments": 150000, - "lessThanEqualsInteger-memory-arguments": 1, - "chooseUnit-memory-arguments": 32, - "sndPair-memory-arguments": 32, - "addInteger-cpu-arguments-intercept": 197209, - "decodeUtf8-memory-arguments-slope": 8, - "equalsData-cpu-arguments-intercept": 150000, - "mapData-cpu-arguments": 150000, - "mkPairData-cpu-arguments": 150000, - "quotientInteger-cpu-arguments-constant": 148000, - "consByteString-memory-arguments-slope": 1, - "cekVarCost-exBudgetMemory": 100, - "indexByteString-cpu-arguments": 150000, - "unListData-cpu-arguments": 150000, - "equalsInteger-cpu-arguments-slope": 1326, - "cekStartupCost-exBudgetMemory": 100, - "subtractInteger-cpu-arguments-intercept": 197209, - "divideInteger-cpu-arguments-model-arguments-intercept": 425507, - "divideInteger-memory-arguments-intercept": 0, - "cekForceCost-exBudgetMemory": 100, - "blake2b-cpu-arguments-intercept": 2477736, - "remainderInteger-cpu-arguments-constant": 148000, - "tailList-cpu-arguments": 150000, - "encodeUtf8-cpu-arguments-intercept": 150000, - "equalsString-cpu-arguments-slope": 1000, - "lessThanByteString-memory-arguments": 1, - "multiplyInteger-cpu-arguments-slope": 11218, - "appendByteString-cpu-arguments-intercept": 396231, - "lessThanEqualsByteString-cpu-arguments-slope": 248, - "modInteger-memory-arguments-slope": 1, - "addInteger-cpu-arguments-slope": 0, - "equalsData-cpu-arguments-slope": 10000, - "decodeUtf8-memory-arguments-intercept": 0, - "chooseList-cpu-arguments": 150000, - "constrData-cpu-arguments": 150000, - "equalsByteString-memory-arguments": 1, - "cekApplyCost-exBudgetCPU": 29773, - "quotientInteger-memory-arguments-slope": 1, - "verifySignature-cpu-arguments-intercept": 3345831, - "unMapData-memory-arguments": 32, - "mkCons-memory-arguments": 32, - "sliceByteString-memory-arguments-slope": 1, - "sha3_256-memory-arguments": 4, - "ifThenElse-memory-arguments": 1, - "mkNilPairData-memory-arguments": 32, - "equalsByteString-cpu-arguments-slope": 247, - "appendString-cpu-arguments-intercept": 150000, - "quotientInteger-cpu-arguments-model-arguments-slope": 118, - "cekApplyCost-exBudgetMemory": 100, - "equalsString-memory-arguments": 1, - "multiplyInteger-memory-arguments-slope": 1, - "cekBuiltinCost-exBudgetMemory": 100, - "remainderInteger-memory-arguments-intercept": 0, - "sha2_256-cpu-arguments-intercept": 2477736, - "remainderInteger-cpu-arguments-model-arguments-intercept": 425507, - "lessThanEqualsByteString-memory-arguments": 1, - "tailList-memory-arguments": 32, - "mkNilData-cpu-arguments": 150000, - "chooseData-cpu-arguments": 150000, - "unBData-memory-arguments": 32, - "blake2b-memory-arguments": 4, - "iData-memory-arguments": 32, - "nullList-memory-arguments": 32, - "cekDelayCost-exBudgetCPU": 29773, - "subtractInteger-memory-arguments-intercept": 1, - "lessThanByteString-cpu-arguments-intercept": 103599, - "consByteString-cpu-arguments-slope": 1000, - "appendByteString-memory-arguments-slope": 1, - "trace-memory-arguments": 32, - "divideInteger-cpu-arguments-constant": 148000, - "cekConstCost-exBudgetCPU": 29773, - "encodeUtf8-memory-arguments-slope": 8, - "quotientInteger-cpu-arguments-model-arguments-intercept": 425507, - "mapData-memory-arguments": 32, - "appendString-cpu-arguments-slope": 1000, - "modInteger-cpu-arguments-constant": 148000, - "verifySignature-cpu-arguments-slope": 1, - "unConstrData-memory-arguments": 32, - "quotientInteger-memory-arguments-intercept": 0, - "equalsByteString-cpu-arguments-constant": 150000, - "sliceByteString-memory-arguments-intercept": 0, - "mkPairData-memory-arguments": 32, - "equalsByteString-cpu-arguments-intercept": 112536, - "appendString-memory-arguments-slope": 1, - "lessThanInteger-cpu-arguments-slope": 497, - "modInteger-cpu-arguments-model-arguments-intercept": 425507, - "modInteger-memory-arguments-minimum": 1, - "sha3_256-cpu-arguments-intercept": 0, - "verifySignature-memory-arguments": 1, - "cekLamCost-exBudgetMemory": 100, - "sliceByteString-cpu-arguments-intercept": 150000 - } - } -} diff --git a/mithril-infra/assets/docker/cardano/config/9.0/preview/cardano-node/byron-genesis.json b/mithril-infra/assets/docker/cardano/config/9.0/preview/cardano-node/byron-genesis.json deleted file mode 100644 index 99b58458400..00000000000 --- a/mithril-infra/assets/docker/cardano/config/9.0/preview/cardano-node/byron-genesis.json +++ /dev/null @@ -1,117 +0,0 @@ -{ "bootStakeholders": - { "021e737009040bf7f1e7b1bcc148f29d748d4a6b561902c95e4a9f36": 1 - , "0bc82ced9544980b9ffe7f64b1538bbda6804a5cc32c8035485e184b": 1 - , "18ed9844deef98cf9ba8b39791dede0538d2d2fa79bf67ef37dcc826": 1 - , "66cfa84ad0ee5ca8586244c8393007cf3d9622d77cfa03fd4f35065b": 1 - , "76c4d6c68c0ef81ae364411a84e52ce66089ed006ca29adfc0227901": 1 - , "8cc6b89fec65cc83d34b7bab2e6494db631d8476a86625767dd0c2a0": 1 - , "e90060fdc085ac9f63cdb3b32ba1d84e0f7eb98561687b213b4c8770": 1 - } -, "heavyDelegation": - { "021e737009040bf7f1e7b1bcc148f29d748d4a6b561902c95e4a9f36": - { "omega": 0 - , "issuerPk": - "6hSFCotivD08t02n43RMiaF9LzwtYVrFMu/WX6ShfEsxfdXFL5Y6c+DwHSZOCywU0RJz5er2icIO03UytC9NTg==" - , "delegatePk": - "JEnSVQTPGriTx1+lAMkKhCNsMBDNPGw+NiEvNPh4ui6IdvxrO+WkQPTy5U865XB4VFvi/zb7d+H1bilnztQNBg==" - , "cert": - "558952d17442e8cc73f0c7dd606e329b38ed2ec0c1f83fe2567d28b21ef2223d2d23640cd0531f75832b50e519631c48643fcfaa7168851645dce07b90d87f0e" - } - , "0bc82ced9544980b9ffe7f64b1538bbda6804a5cc32c8035485e184b": - { "omega": 0 - , "issuerPk": - "MJ7IskKU8GKk0Eeg3zhfSOK1DDVXOMHD2V/zhEpODUtL9YB0Y7sXnbZfg3+Df05hskP5Jz+dZvdC6DH/dP9jmQ==" - , "delegatePk": - "hwO7NJL7LfAk5e/QG61FKcdORoK60tvprE3063Muh4EQKrWA6l7t23B2GziK8D0hRO0j5W1Gzpn8WW69XLIlKA==" - , "cert": - "2bccf50d0c3cbb03dd29cfba817e8ba615db3d7722b41b264ad08722e548cfe83d069b29d13e490823d7519ecdd9940ea49573f6027056c4bd58da1adf75020e" - } - , "18ed9844deef98cf9ba8b39791dede0538d2d2fa79bf67ef37dcc826": - { "omega": 0 - , "issuerPk": - "pXbW4Jak8maeuWiosvrurykKnqDSHswUjroonSDS3fTnWS+BKe+vjT4zZJNKhQ33KbagiHVJ5CJUNggfsCtG2g==" - , "delegatePk": - "rbJAZp3kWCUvp8dnLR6qsgpGU+qKAFow4NHYKWiKCkfm1qFCFONob50N1IbNWCGWAhg38ZPTvBazTasjsfj6yQ==" - , "cert": - "89e1638e31fd3d402cecb897ba773d8c2c11c2d3cff2462b266e21461539b1a4fe8fb528e159b9af473799b51e49aa5b5816a88f10c484aa7cef7ad12850830a" - } - , "66cfa84ad0ee5ca8586244c8393007cf3d9622d77cfa03fd4f35065b": - { "omega": 0 - , "issuerPk": - "/LGZjmmcAMRisP7Rf454GM2QUKgj2aAyqE+iQo2PIEhcistFOlT+idtbLTceZAnQcwwPJDtTcNi+EnPQyscZOg==" - , "delegatePk": - "rinFUiKKCPPFY0ULEKn1SPRgLVmOS3jdTXDtrxK6VI1I11G3uBS1Olxi0mQSN3kf+B3hm/xHkuUDVNaSXNiBeQ==" - , "cert": - "3e7f30bb68c5bc4d23c2a730ac154a188a1fd45aac3f438efd380303171443d2ca4f50e5a1ff66b40ae3da64697f2599956ae06c21b73fa828b8c0dc9fb27302" - } - , "76c4d6c68c0ef81ae364411a84e52ce66089ed006ca29adfc0227901": - { "omega": 0 - , "issuerPk": - "9EE85tTLdSSR4T1Xoy6n9wr6jlbavCdfp9oQKusskO3DSSyNqRYS7QzYQ96j/WnphUey63082YkKijMfF9A4eA==" - , "delegatePk": - "dvyHDkXg8LFtb0K6Sitl8OGSEZPvfCVQYLDR6Au6t6/ROvlerMKQ8uri4fG7hQQzbHKtdKWgv94t+zuFJTQ1fw==" - , "cert": - "5ec0ed46ae7e575bdb089f1bceca3b2689b13a7162fe08578fe60ba64607fffaa507412a97652c3c81cc0ef93ff404cf809a628ae19faba1a035fca0505c1d04" - } - , "8cc6b89fec65cc83d34b7bab2e6494db631d8476a86625767dd0c2a0": - { "omega": 0 - , "issuerPk": - "Hr5S5PAxf9HSB4FzmtZzaFcXrNrctrI5XUrDrnCkOUTX6rhbtOMkXU3sWVDOvU6LNSSr3/Ws2+iCYZIr7LmTWg==" - , "delegatePk": - "FaLH2b5H/XS31YRnm98N6fP4Etx6m+GbniVAXMwOp8KhYXPKBJBsX/EjIy3pSkvRBhGCjsycB0yrDxWMi5ZsIQ==" - , "cert": - "10f06304cceb42071605ebba67b308c7568e5e6fe0d773c58f7e8c13bc8d8a340f70a4fd5e1b4a1c1db1de5c7646802bbc929d6c82d7adb8a77cb6ad77eac50a" - } - , "e90060fdc085ac9f63cdb3b32ba1d84e0f7eb98561687b213b4c8770": - { "omega": 0 - , "issuerPk": - "B2R+VXzy3c8bxncdOpQ2Z/tblxRNQO8AXQ0OsJDQvZYnLeGQcLD78kyYLpi3nfuS4SfnLar23NV4yiEVwaw+Yw==" - , "delegatePk": - "nACHGIBacymrKwn07iW/a5ZKJCPZ2cKQqeXw3ivR7WOYVUuufWhZlCoUTZ7rtBqoDaexblUQwkC7hA7AmNA3FA==" - , "cert": - "b5440daa05f7fae557df46e4f1b7c5802b86f465daad1137e315abf6e72f1c877207276abb8dcba86e18e42d39b34c2f0fa82ba2919944cdc8e2e5264baa450b" - } - } -, "startTime": 1666656000 -, "nonAvvmBalances": - { "FHnt4NL7yPXjpZtYj1YUiX9QYYUZGXDT9gA2PJXQFkTSMx3EgawXK5BUrCHdhe2": - "0" - , "FHnt4NL7yPXk7D87qAWEmfnL7wSQ9AzBU2mjZt3eM48NSCbygxgzAU6vCGiRZEW": - "0" - , "FHnt4NL7yPXpazQsTdJ3Gp1twQUo4N5rrgGbRNSzchjchPiApc1k4CvqDMcdd7H": - "0" - , "FHnt4NL7yPXtNo1wLCLZyGTMfAvB14h8onafiYkM7B69ZwvGgXeUyQWfi7FPrif": - "0" - , "FHnt4NL7yPXtmi4mAjD43V3NB3shDs1gCuHNcMLPsRWjaw1b2yRV2xad8S8V6aq": - "0" - , "FHnt4NL7yPXvDWHa8bVs73UEUdJd64VxWXSFNqetECtYfTd9TtJguJ14Lu3feth": - "30000000000000000" - , "FHnt4NL7yPXvNSRpCYydjRr7koQCrsTtkovk5uYMimgqMJX2DyrEEBqiXaTd8rG": - "0" - , "FHnt4NL7yPY9rTvdsCeyRnsbzp4bN7XdmAZeU5PzA1qR2asYmN6CsdxJw4YoDjG": - "0" - } -, "blockVersionData": - { "scriptVersion": 0 - , "slotDuration": "20000" - , "maxBlockSize": "2000000" - , "maxHeaderSize": "2000000" - , "maxTxSize": "4096" - , "maxProposalSize": "700" - , "mpcThd": "20000000000000" - , "heavyDelThd": "300000000000" - , "updateVoteThd": "1000000000000" - , "updateProposalThd": "100000000000000" - , "updateImplicit": "10000" - , "softforkRule": - { "initThd": "900000000000000" - , "minThd": "600000000000000" - , "thdDecrement": "50000000000000" - } - , "txFeePolicy": - { "summand": "155381000000000" , "multiplier": "43946000000" } - , "unlockStakeEpoch": "18446744073709551615" - } -, "protocolConsts": { "k": 432 , "protocolMagic": 2 } -, "avvmDistr": {} -} diff --git a/mithril-infra/assets/docker/cardano/config/9.0/preview/cardano-node/config-bp.json b/mithril-infra/assets/docker/cardano/config/9.0/preview/cardano-node/config-bp.json deleted file mode 100644 index ac9cfcadc89..00000000000 --- a/mithril-infra/assets/docker/cardano/config/9.0/preview/cardano-node/config-bp.json +++ /dev/null @@ -1,112 +0,0 @@ -{ - "AlonzoGenesisFile": "alonzo-genesis.json", - "AlonzoGenesisHash": "7e94a15f55d1e82d10f09203fa1d40f8eede58fd8066542cf6566008068ed874", - "ByronGenesisFile": "byron-genesis.json", - "ByronGenesisHash": "83de1d7302569ad56cf9139a41e2e11346d4cb4a31c00142557b6ab3fa550761", - "EnableP2P": true, - "ExperimentalHardForksEnabled": false, - "ExperimentalProtocolsEnabled": false, - "LastKnownBlockVersion-Alt": 0, - "LastKnownBlockVersion-Major": 3, - "LastKnownBlockVersion-Minor": 1, - "MinNodeVersion": "8.12.0", - "PeerSharing": false, - "Protocol": "Cardano", - "RequiresNetworkMagic": "RequiresMagic", - "ShelleyGenesisFile": "shelley-genesis.json", - "ShelleyGenesisHash": "363498d1024f84bb39d3fa9593ce391483cb40d479b87233f868d6e57c3a400d", - "TargetNumberOfActivePeers": 20, - "TargetNumberOfEstablishedPeers": 50, - "TargetNumberOfKnownPeers": 100, - "TargetNumberOfRootPeers": 100, - "TestAllegraHardForkAtEpoch": 0, - "TestAlonzoHardForkAtEpoch": 0, - "TestMaryHardForkAtEpoch": 0, - "TestShelleyHardForkAtEpoch": 0, - "TraceAcceptPolicy": true, - "TraceBlockFetchClient": false, - "TraceBlockFetchDecisions": false, - "TraceBlockFetchProtocol": false, - "TraceBlockFetchProtocolSerialised": false, - "TraceBlockFetchServer": false, - "TraceChainDb": true, - "TraceChainSyncBlockServer": false, - "TraceChainSyncClient": false, - "TraceChainSyncHeaderServer": false, - "TraceChainSyncProtocol": false, - "TraceConnectionManager": true, - "TraceDNSResolver": true, - "TraceDNSSubscription": true, - "TraceDiffusionInitialization": true, - "TraceErrorPolicy": true, - "TraceForge": true, - "TraceHandshake": true, - "TraceInboundGovernor": true, - "TraceIpSubscription": true, - "TraceLedgerPeers": true, - "TraceLocalChainSyncProtocol": false, - "TraceLocalConnectionManager": true, - "TraceLocalErrorPolicy": true, - "TraceLocalHandshake": true, - "TraceLocalRootPeers": true, - "TraceLocalTxSubmissionProtocol": false, - "TraceLocalTxSubmissionServer": false, - "TraceMempool": true, - "TraceMux": false, - "TracePeerSelection": true, - "TracePeerSelectionActions": true, - "TracePublicRootPeers": true, - "TraceServer": true, - "TraceTxInbound": false, - "TraceTxOutbound": false, - "TraceTxSubmissionProtocol": false, - "TracingVerbosity": "NormalVerbosity", - "TurnOnLogMetrics": true, - "TurnOnLogging": true, - "defaultBackends": [ - "KatipBK" - ], - "defaultScribes": [ - [ - "StdoutSK", - "stdout" - ] - ], - "hasEKG": 12788, - "hasPrometheus": [ - "127.0.0.1", - 12798 - ], - "minSeverity": "Info", - "options": { - "mapBackends": { - "cardano.node.metrics": [ - "EKGViewBK" - ], - "cardano.node.resources": [ - "EKGViewBK" - ] - }, - "mapSubtrace": { - "cardano.node.metrics": { - "subtrace": "Neutral" - } - } - }, - "rotation": { - "rpKeepFilesNum": 10, - "rpLogLimitBytes": 5000000, - "rpMaxAgeHours": 24 - }, - "setupBackends": [ - "KatipBK" - ], - "setupScribes": [ - { - "scFormat": "ScText", - "scKind": "StdoutSK", - "scName": "stdout", - "scRotation": null - } - ] -} diff --git a/mithril-infra/assets/docker/cardano/config/9.0/preview/cardano-node/config.json b/mithril-infra/assets/docker/cardano/config/9.0/preview/cardano-node/config.json deleted file mode 100644 index 14a2834b7ad..00000000000 --- a/mithril-infra/assets/docker/cardano/config/9.0/preview/cardano-node/config.json +++ /dev/null @@ -1,112 +0,0 @@ -{ - "AlonzoGenesisFile": "alonzo-genesis.json", - "AlonzoGenesisHash": "7e94a15f55d1e82d10f09203fa1d40f8eede58fd8066542cf6566008068ed874", - "ByronGenesisFile": "byron-genesis.json", - "ByronGenesisHash": "83de1d7302569ad56cf9139a41e2e11346d4cb4a31c00142557b6ab3fa550761", - "EnableP2P": true, - "ExperimentalHardForksEnabled": false, - "ExperimentalProtocolsEnabled": false, - "LastKnownBlockVersion-Alt": 0, - "LastKnownBlockVersion-Major": 3, - "LastKnownBlockVersion-Minor": 1, - "MinNodeVersion": "8.12.0", - "PeerSharing": true, - "Protocol": "Cardano", - "RequiresNetworkMagic": "RequiresMagic", - "ShelleyGenesisFile": "shelley-genesis.json", - "ShelleyGenesisHash": "363498d1024f84bb39d3fa9593ce391483cb40d479b87233f868d6e57c3a400d", - "TargetNumberOfActivePeers": 20, - "TargetNumberOfEstablishedPeers": 50, - "TargetNumberOfKnownPeers": 150, - "TargetNumberOfRootPeers": 60, - "TestAllegraHardForkAtEpoch": 0, - "TestAlonzoHardForkAtEpoch": 0, - "TestMaryHardForkAtEpoch": 0, - "TestShelleyHardForkAtEpoch": 0, - "TraceAcceptPolicy": true, - "TraceBlockFetchClient": false, - "TraceBlockFetchDecisions": false, - "TraceBlockFetchProtocol": false, - "TraceBlockFetchProtocolSerialised": false, - "TraceBlockFetchServer": false, - "TraceChainDb": true, - "TraceChainSyncBlockServer": false, - "TraceChainSyncClient": false, - "TraceChainSyncHeaderServer": false, - "TraceChainSyncProtocol": false, - "TraceConnectionManager": true, - "TraceDNSResolver": true, - "TraceDNSSubscription": true, - "TraceDiffusionInitialization": true, - "TraceErrorPolicy": true, - "TraceForge": true, - "TraceHandshake": true, - "TraceInboundGovernor": true, - "TraceIpSubscription": true, - "TraceLedgerPeers": true, - "TraceLocalChainSyncProtocol": false, - "TraceLocalConnectionManager": true, - "TraceLocalErrorPolicy": true, - "TraceLocalHandshake": true, - "TraceLocalRootPeers": true, - "TraceLocalTxSubmissionProtocol": false, - "TraceLocalTxSubmissionServer": false, - "TraceMempool": true, - "TraceMux": false, - "TracePeerSelection": true, - "TracePeerSelectionActions": true, - "TracePublicRootPeers": true, - "TraceServer": true, - "TraceTxInbound": false, - "TraceTxOutbound": false, - "TraceTxSubmissionProtocol": false, - "TracingVerbosity": "NormalVerbosity", - "TurnOnLogMetrics": true, - "TurnOnLogging": true, - "defaultBackends": [ - "KatipBK" - ], - "defaultScribes": [ - [ - "StdoutSK", - "stdout" - ] - ], - "hasEKG": 12788, - "hasPrometheus": [ - "127.0.0.1", - 12798 - ], - "minSeverity": "Info", - "options": { - "mapBackends": { - "cardano.node.metrics": [ - "EKGViewBK" - ], - "cardano.node.resources": [ - "EKGViewBK" - ] - }, - "mapSubtrace": { - "cardano.node.metrics": { - "subtrace": "Neutral" - } - } - }, - "rotation": { - "rpKeepFilesNum": 10, - "rpLogLimitBytes": 5000000, - "rpMaxAgeHours": 24 - }, - "setupBackends": [ - "KatipBK" - ], - "setupScribes": [ - { - "scFormat": "ScText", - "scKind": "StdoutSK", - "scName": "stdout", - "scRotation": null - } - ] -} diff --git a/mithril-infra/assets/docker/cardano/config/9.0/preview/cardano-node/shelley-genesis.json b/mithril-infra/assets/docker/cardano/config/9.0/preview/cardano-node/shelley-genesis.json deleted file mode 100644 index 20abba3fb1b..00000000000 --- a/mithril-infra/assets/docker/cardano/config/9.0/preview/cardano-node/shelley-genesis.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "activeSlotsCoeff": 0.05, - "epochLength": 86400, - "genDelegs": { - "12b0f443d02861948a0fce9541916b014e8402984c7b83ad70a834ce": { - "delegate": "7c54a168c731f2f44ced620f3cca7c2bd90731cab223d5167aa994e6", - "vrf": "62d546a35e1be66a2b06e29558ef33f4222f1c466adbb59b52d800964d4e60ec" - }, - "3df542796a64e399b60c74acfbdb5afa1e114532fa36b46d6368ef3a": { - "delegate": "c44bc2f3cc7e98c0f227aa399e4035c33c0d775a0985875fff488e20", - "vrf": "4f9d334decadff6eba258b2df8ae1f02580a2628bce47ae7d957e1acd3f42a3c" - }, - "93fd5083ff20e7ab5570948831730073143bea5a5d5539852ed45889": { - "delegate": "82a02922f10105566b70366b07c758c8134fa91b3d8ae697dfa5e8e0", - "vrf": "8a57e94a9b4c65ec575f35d41edb1df399fa30fdf10775389f5d1ef670ca3f9f" - }, - "a86cab3ea72eabb2e8aafbbf4abbd2ba5bdfd04eea26a39b126a78e4": { - "delegate": "10257f6d3bae913514bdc96c9170b3166bf6838cca95736b0e418426", - "vrf": "1b54aad6b013145a0fc74bb5c2aa368ebaf3999e88637d78e09706d0cc29874a" - }, - "b799804a28885bd49c0e1b99d8b3b26de0fac17a5cf651ecf0c872f0": { - "delegate": "ebe606e22d932d51be2c1ce87e7d7e4c9a7d1f7df4a5535c29e23d22", - "vrf": "b3fc06a1f8ee69ff23185d9af453503be8b15b2652e1f9fb7c3ded6797a2d6f9" - }, - "d125812d6ab973a2c152a0525b7fd32d36ff13555a427966a9cac9b1": { - "delegate": "e302198135fb5b00bfe0b9b5623426f7cf03179ab7ba75f945d5b79b", - "vrf": "b45ca2ed95f92248fa0322ce1fc9f815a5a5aa2f21f1adc2c42c4dccfc7ba631" - }, - "ef27651990a26449a40767d5e06cdef1670a3f3ff4b951d385b51787": { - "delegate": "0e0b11e80d958732e587585d30978d683a061831d1b753878f549d05", - "vrf": "b860ec844f6cd476c4fabb4aa1ca72d5c74d82f3835aed3c9515a35b6e048719" - } - }, - "initialFunds": {}, - "maxKESEvolutions": 62, - "maxLovelaceSupply": 45000000000000000, - "networkId": "Testnet", - "networkMagic": 2, - "protocolParams": { - "protocolVersion": { - "minor": 0, - "major": 6 - }, - "decentralisationParam": 1, - "eMax": 18, - "extraEntropy": { - "tag": "NeutralNonce" - }, - "maxTxSize": 16384, - "maxBlockBodySize": 65536, - "maxBlockHeaderSize": 1100, - "minFeeA": 44, - "minFeeB": 155381, - "minUTxOValue": 1000000, - "poolDeposit": 500000000, - "minPoolCost": 340000000, - "keyDeposit": 2000000, - "nOpt": 150, - "rho": 0.003, - "tau": 0.20, - "a0": 0.3 - }, - "securityParam": 432, - "slotLength": 1, - "slotsPerKESPeriod": 129600, - "systemStart": "2022-10-25T00:00:00Z", - "updateQuorum": 5 -} diff --git a/mithril-infra/assets/docker/cardano/config/9.0/preview/cardano-node/topology.json b/mithril-infra/assets/docker/cardano/config/9.0/preview/cardano-node/topology.json deleted file mode 100644 index 3028448484d..00000000000 --- a/mithril-infra/assets/docker/cardano/config/9.0/preview/cardano-node/topology.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "bootstrapPeers": [ - { - "address": "preview-node.play.dev.cardano.org", - "port": 3001 - } - ], - "localRoots": [ - { - "accessPoints": [], - "advertise": false, - "trustable": false, - "valency": 1 - } - ], - "publicRoots": [ - { - "accessPoints": [], - "advertise": false - } - ], - "useLedgerAfterSlot": 41385503 -} diff --git a/mithril-infra/assets/docker/cardano/config/9.0/sanchonet/cardano-node/alonzo-genesis.json b/mithril-infra/assets/docker/cardano/config/9.0/sanchonet/cardano-node/alonzo-genesis.json deleted file mode 100644 index de05d3d9e46..00000000000 --- a/mithril-infra/assets/docker/cardano/config/9.0/sanchonet/cardano-node/alonzo-genesis.json +++ /dev/null @@ -1,188 +0,0 @@ -{ - "collateralPercentage": 150, - "costModels": { - "PlutusV1": [ - 197209, - 0, - 1, - 1, - 396231, - 621, - 0, - 1, - 150000, - 1000, - 0, - 1, - 150000, - 32, - 2477736, - 29175, - 4, - 29773, - 100, - 29773, - 100, - 29773, - 100, - 29773, - 100, - 29773, - 100, - 29773, - 100, - 100, - 100, - 29773, - 100, - 150000, - 32, - 150000, - 32, - 150000, - 32, - 150000, - 1000, - 0, - 1, - 150000, - 32, - 150000, - 1000, - 0, - 8, - 148000, - 425507, - 118, - 0, - 1, - 1, - 150000, - 1000, - 0, - 8, - 150000, - 112536, - 247, - 1, - 150000, - 10000, - 1, - 136542, - 1326, - 1, - 1000, - 150000, - 1000, - 1, - 150000, - 32, - 150000, - 32, - 150000, - 32, - 1, - 1, - 150000, - 1, - 150000, - 4, - 103599, - 248, - 1, - 103599, - 248, - 1, - 145276, - 1366, - 1, - 179690, - 497, - 1, - 150000, - 32, - 150000, - 32, - 150000, - 32, - 150000, - 32, - 150000, - 32, - 150000, - 32, - 148000, - 425507, - 118, - 0, - 1, - 1, - 61516, - 11218, - 0, - 1, - 150000, - 32, - 148000, - 425507, - 118, - 0, - 1, - 1, - 148000, - 425507, - 118, - 0, - 1, - 1, - 2477736, - 29175, - 4, - 0, - 82363, - 4, - 150000, - 5000, - 0, - 1, - 150000, - 32, - 197209, - 0, - 1, - 1, - 150000, - 32, - 150000, - 32, - 150000, - 32, - 150000, - 32, - 150000, - 32, - 150000, - 32, - 150000, - 32, - 3345831, - 1, - 1 - ] - }, - "executionPrices": { - "prMem": 5.77e-2, - "prSteps": 7.21e-5 - }, - "lovelacePerUTxOWord": 34482, - "maxBlockExUnits": { - "exUnitsMem": 50000000, - "exUnitsSteps": 40000000000 - }, - "maxCollateralInputs": 3, - "maxTxExUnits": { - "exUnitsMem": 10000000, - "exUnitsSteps": 10000000000 - }, - "maxValueSize": 5000 -} \ No newline at end of file diff --git a/mithril-infra/assets/docker/cardano/config/9.0/sanchonet/cardano-node/byron-genesis.json b/mithril-infra/assets/docker/cardano/config/9.0/sanchonet/cardano-node/byron-genesis.json deleted file mode 100644 index f0c29c655b7..00000000000 --- a/mithril-infra/assets/docker/cardano/config/9.0/sanchonet/cardano-node/byron-genesis.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "avvmDistr": {}, - "blockVersionData": { - "heavyDelThd": "300000000000", - "maxBlockSize": "2000000", - "maxHeaderSize": "2000000", - "maxProposalSize": "700", - "maxTxSize": "4096", - "mpcThd": "20000000000000", - "scriptVersion": 0, - "slotDuration": "20000", - "softforkRule": { - "initThd": "900000000000000", - "minThd": "600000000000000", - "thdDecrement": "50000000000000" - }, - "txFeePolicy": { - "multiplier": "43946000000", - "summand": "155381000000000" - }, - "unlockStakeEpoch": "18446744073709551615", - "updateImplicit": "10000", - "updateProposalThd": "100000000000000", - "updateVoteThd": "1000000000000" - }, - "bootStakeholders": { - "318488dc356f6034104804b2cb6a2dcc055202491386fb0d5af7c3ba": 1, - "3a3c2ffaf066c8f211a1bdfd844f767ac453b1d94915e725c5867467": 1, - "3ae8eabb4e0626cea0ba38d8303d59514dae9c307d93bad3d259e4a9": 1 - }, - "heavyDelegation": { - "318488dc356f6034104804b2cb6a2dcc055202491386fb0d5af7c3ba": { - "cert": "b80e06679023284236df3464dc6aab3f56f23cb721d5943c59632ac77004f76ae415b6d291606c7194509e1fefa0c8341eed269bd0e0e1433302b00912a4230c", - "delegatePk": "9ELoyHN4GVtXrFzAJZApAVjrhwftqEFVoDXl9ebtTwpe/lG4b5ZkgH3DqwHE1hNJFRsnYs4zYzMmdbnoR7lfUA==", - "issuerPk": "MHFL9SqIV6KuXSAvp08jHBRtHwNsDJMsCxbmXLorSbfLAORg7waqVL8NEaKU3Lb0FBIX5sHVC21i1M/c0jrnlA==", - "omega": 0 - }, - "3a3c2ffaf066c8f211a1bdfd844f767ac453b1d94915e725c5867467": { - "cert": "ce91b8e35b67de2236fa79b353d1c4ebd97ad4b4cc89056a1acfc217ece8e91fbffc4bf44604a96a1064c9997f6cd39b81284aadfac752056eafc6b5996a6509", - "delegatePk": "Grpf6iTqd9aWc3QWvfthNv2l8Pp0X2tKpoIoPn0+Dy1+ow60UTu9i1j4KPjp1uzrnM4JoUcmkCGF507fPagO8w==", - "issuerPk": "1FPA7qSOPVDlNZoQAuoB2dnm+tKI5td6+BO5sJ2rswVxuS6S6sjBFVfVz/VXfKTcEt/AKyffgzWXAtPCnhC1jw==", - "omega": 0 - }, - "3ae8eabb4e0626cea0ba38d8303d59514dae9c307d93bad3d259e4a9": { - "cert": "908dd25262598050d60cb24928a7059fea3726a1dd7764645edab654d3b4e37ba69acd4841454f70f0f643305ede0ef66dc0ea9747a2387da05d2af77963f30a", - "delegatePk": "1zYduiReianx6HJHgQqtira7XY6M/Ol4tFj/O7TzTLcNfgazJm8pq5y6HAANwl91iL1pDZuIgFjzI+2i1Z6y2Q==", - "issuerPk": "Pgj3IyTJDyxr+t5fcMuM3aPtyNCxOo4T9sr78BNbgWBGwlTGo0P6UtzNLyqloLsH8V6Lv6kYMdWELAiEyfCpkw==", - "omega": 0 - } - }, - "nonAvvmBalances": { - "FHnt4NL7yPXqn7xha3WB99wYLxAc1FhceD3D1pQWaCthk9RYB46aGb6Tbq2KxV5": "0", - "FHnt4NL7yPXwj8m191s48v1RZtQqA2sVHpamzStuXTuAnzYUSR6hRPqhYmW3MY4": "0", - "FHnt4NL7yPXzVZ5xexcb7rWqCYWuFU7y6Pp4tLTiv6txhDcpQ2m7AFGMirsi1F1": "30000000000000000", - "FHnt4NL7yPY27r794z4UiYJ3RwezucDRLX94Pzy6mYPNUNWboB71S9xUm2WEDrv": "0" - }, - "protocolConsts": { - "k": 432, - "protocolMagic": 4 - }, - "startTime": 1686789000 -} diff --git a/mithril-infra/assets/docker/cardano/config/9.0/sanchonet/cardano-node/config-bp.json b/mithril-infra/assets/docker/cardano/config/9.0/sanchonet/cardano-node/config-bp.json deleted file mode 100644 index 74a55d0f7c8..00000000000 --- a/mithril-infra/assets/docker/cardano/config/9.0/sanchonet/cardano-node/config-bp.json +++ /dev/null @@ -1,114 +0,0 @@ -{ - "AlonzoGenesisFile": "alonzo-genesis.json", - "AlonzoGenesisHash": "8bedcaea62107d8a79ed5293b0027b3f8706a4bc2422f33380cb1fd01c6fa6ec", - "ByronGenesisFile": "byron-genesis.json", - "ByronGenesisHash": "785eb88427e136378a15b0a152a8bfbeec7a611529ccda29c43a1e60ffb48eaa", - "ConwayGenesisFile": "conway-genesis.json", - "ConwayGenesisHash": "e85ee5b7af8ca5c273c20746c9f994aef1a72a79c38b4eea230817e7e66c0741", - "EnableP2P": true, - "ExperimentalHardForksEnabled": true, - "ExperimentalProtocolsEnabled": true, - "LastKnownBlockVersion-Alt": 0, - "LastKnownBlockVersion-Major": 3, - "LastKnownBlockVersion-Minor": 1, - "MinNodeVersion": "8.12.0", - "PeerSharing": false, - "Protocol": "Cardano", - "RequiresNetworkMagic": "RequiresMagic", - "ShelleyGenesisFile": "shelley-genesis.json", - "ShelleyGenesisHash": "f94457ec45a0c6773057a529533cf7ccf746cb44dabd56ae970e1dbfb55bfdb2", - "TargetNumberOfActivePeers": 20, - "TargetNumberOfEstablishedPeers": 50, - "TargetNumberOfKnownPeers": 100, - "TargetNumberOfRootPeers": 100, - "TestAllegraHardForkAtEpoch": 0, - "TestAlonzoHardForkAtEpoch": 0, - "TestMaryHardForkAtEpoch": 0, - "TestShelleyHardForkAtEpoch": 0, - "TraceAcceptPolicy": true, - "TraceBlockFetchClient": false, - "TraceBlockFetchDecisions": false, - "TraceBlockFetchProtocol": false, - "TraceBlockFetchProtocolSerialised": false, - "TraceBlockFetchServer": false, - "TraceChainDb": true, - "TraceChainSyncBlockServer": false, - "TraceChainSyncClient": false, - "TraceChainSyncHeaderServer": false, - "TraceChainSyncProtocol": false, - "TraceConnectionManager": true, - "TraceDNSResolver": true, - "TraceDNSSubscription": true, - "TraceDiffusionInitialization": true, - "TraceErrorPolicy": true, - "TraceForge": true, - "TraceHandshake": true, - "TraceInboundGovernor": true, - "TraceIpSubscription": true, - "TraceLedgerPeers": true, - "TraceLocalChainSyncProtocol": false, - "TraceLocalConnectionManager": true, - "TraceLocalErrorPolicy": true, - "TraceLocalHandshake": true, - "TraceLocalRootPeers": true, - "TraceLocalTxSubmissionProtocol": false, - "TraceLocalTxSubmissionServer": false, - "TraceMempool": true, - "TraceMux": false, - "TracePeerSelection": true, - "TracePeerSelectionActions": true, - "TracePublicRootPeers": true, - "TraceServer": true, - "TraceTxInbound": false, - "TraceTxOutbound": false, - "TraceTxSubmissionProtocol": false, - "TracingVerbosity": "NormalVerbosity", - "TurnOnLogMetrics": true, - "TurnOnLogging": true, - "defaultBackends": [ - "KatipBK" - ], - "defaultScribes": [ - [ - "StdoutSK", - "stdout" - ] - ], - "hasEKG": 12788, - "hasPrometheus": [ - "127.0.0.1", - 12798 - ], - "minSeverity": "Info", - "options": { - "mapBackends": { - "cardano.node.metrics": [ - "EKGViewBK" - ], - "cardano.node.resources": [ - "EKGViewBK" - ] - }, - "mapSubtrace": { - "cardano.node.metrics": { - "subtrace": "Neutral" - } - } - }, - "rotation": { - "rpKeepFilesNum": 10, - "rpLogLimitBytes": 5000000, - "rpMaxAgeHours": 24 - }, - "setupBackends": [ - "KatipBK" - ], - "setupScribes": [ - { - "scFormat": "ScText", - "scKind": "StdoutSK", - "scName": "stdout", - "scRotation": null - } - ] -} diff --git a/mithril-infra/assets/docker/cardano/config/9.0/sanchonet/cardano-node/config.json b/mithril-infra/assets/docker/cardano/config/9.0/sanchonet/cardano-node/config.json deleted file mode 100644 index 638bb250c48..00000000000 --- a/mithril-infra/assets/docker/cardano/config/9.0/sanchonet/cardano-node/config.json +++ /dev/null @@ -1,114 +0,0 @@ -{ - "AlonzoGenesisFile": "alonzo-genesis.json", - "AlonzoGenesisHash": "8bedcaea62107d8a79ed5293b0027b3f8706a4bc2422f33380cb1fd01c6fa6ec", - "ByronGenesisFile": "byron-genesis.json", - "ByronGenesisHash": "785eb88427e136378a15b0a152a8bfbeec7a611529ccda29c43a1e60ffb48eaa", - "ConwayGenesisFile": "conway-genesis.json", - "ConwayGenesisHash": "e85ee5b7af8ca5c273c20746c9f994aef1a72a79c38b4eea230817e7e66c0741", - "EnableP2P": true, - "ExperimentalHardForksEnabled": true, - "ExperimentalProtocolsEnabled": true, - "LastKnownBlockVersion-Alt": 0, - "LastKnownBlockVersion-Major": 3, - "LastKnownBlockVersion-Minor": 1, - "MinNodeVersion": "8.12.0", - "PeerSharing": true, - "Protocol": "Cardano", - "RequiresNetworkMagic": "RequiresMagic", - "ShelleyGenesisFile": "shelley-genesis.json", - "ShelleyGenesisHash": "f94457ec45a0c6773057a529533cf7ccf746cb44dabd56ae970e1dbfb55bfdb2", - "TargetNumberOfActivePeers": 20, - "TargetNumberOfEstablishedPeers": 50, - "TargetNumberOfKnownPeers": 150, - "TargetNumberOfRootPeers": 60, - "TestAllegraHardForkAtEpoch": 0, - "TestAlonzoHardForkAtEpoch": 0, - "TestMaryHardForkAtEpoch": 0, - "TestShelleyHardForkAtEpoch": 0, - "TraceAcceptPolicy": true, - "TraceBlockFetchClient": false, - "TraceBlockFetchDecisions": false, - "TraceBlockFetchProtocol": false, - "TraceBlockFetchProtocolSerialised": false, - "TraceBlockFetchServer": false, - "TraceChainDb": true, - "TraceChainSyncBlockServer": false, - "TraceChainSyncClient": false, - "TraceChainSyncHeaderServer": false, - "TraceChainSyncProtocol": false, - "TraceConnectionManager": true, - "TraceDNSResolver": true, - "TraceDNSSubscription": true, - "TraceDiffusionInitialization": true, - "TraceErrorPolicy": true, - "TraceForge": true, - "TraceHandshake": true, - "TraceInboundGovernor": true, - "TraceIpSubscription": true, - "TraceLedgerPeers": true, - "TraceLocalChainSyncProtocol": false, - "TraceLocalConnectionManager": true, - "TraceLocalErrorPolicy": true, - "TraceLocalHandshake": true, - "TraceLocalRootPeers": true, - "TraceLocalTxSubmissionProtocol": false, - "TraceLocalTxSubmissionServer": false, - "TraceMempool": true, - "TraceMux": false, - "TracePeerSelection": true, - "TracePeerSelectionActions": true, - "TracePublicRootPeers": true, - "TraceServer": true, - "TraceTxInbound": false, - "TraceTxOutbound": false, - "TraceTxSubmissionProtocol": false, - "TracingVerbosity": "NormalVerbosity", - "TurnOnLogMetrics": true, - "TurnOnLogging": true, - "defaultBackends": [ - "KatipBK" - ], - "defaultScribes": [ - [ - "StdoutSK", - "stdout" - ] - ], - "hasEKG": 12788, - "hasPrometheus": [ - "127.0.0.1", - 12798 - ], - "minSeverity": "Info", - "options": { - "mapBackends": { - "cardano.node.metrics": [ - "EKGViewBK" - ], - "cardano.node.resources": [ - "EKGViewBK" - ] - }, - "mapSubtrace": { - "cardano.node.metrics": { - "subtrace": "Neutral" - } - } - }, - "rotation": { - "rpKeepFilesNum": 10, - "rpLogLimitBytes": 5000000, - "rpMaxAgeHours": 24 - }, - "setupBackends": [ - "KatipBK" - ], - "setupScribes": [ - { - "scFormat": "ScText", - "scKind": "StdoutSK", - "scName": "stdout", - "scRotation": null - } - ] -} diff --git a/mithril-infra/assets/docker/cardano/config/9.0/sanchonet/cardano-node/conway-genesis.json b/mithril-infra/assets/docker/cardano/config/9.0/sanchonet/cardano-node/conway-genesis.json deleted file mode 100644 index 81b2f4b7deb..00000000000 --- a/mithril-infra/assets/docker/cardano/config/9.0/sanchonet/cardano-node/conway-genesis.json +++ /dev/null @@ -1,298 +0,0 @@ -{ - "poolVotingThresholds": { - "committeeNormal": 0.65, - "committeeNoConfidence": 0.65, - "hardForkInitiation": 0.51, - "motionNoConfidence": 0.6, - "ppSecurityGroup": 0.6 - }, - "dRepVotingThresholds": { - "motionNoConfidence": 0.67, - "committeeNormal": 0.67, - "committeeNoConfidence": 0.65, - "updateToConstitution": 0.75, - "hardForkInitiation": 0.6, - "ppNetworkGroup": 0.67, - "ppEconomicGroup": 0.67, - "ppTechnicalGroup": 0.67, - "ppGovGroup": 0.75, - "treasuryWithdrawal": 0.67 - }, - "committeeMinSize": 5, - "committeeMaxTermLength": 146, - "govActionLifetime": 14, - "govActionDeposit": 100000000000, - "dRepDeposit": 500000000, - "dRepActivity": 20, - "minFeeRefScriptCostPerByte": 15, - "plutusV3CostModel": [ - 100788, - 420, - 1, - 1, - 1000, - 173, - 0, - 1, - 1000, - 59957, - 4, - 1, - 11183, - 32, - 201305, - 8356, - 4, - 16000, - 100, - 16000, - 100, - 16000, - 100, - 16000, - 100, - 16000, - 100, - 16000, - 100, - 100, - 100, - 16000, - 100, - 94375, - 32, - 132994, - 32, - 61462, - 4, - 72010, - 178, - 0, - 1, - 22151, - 32, - 91189, - 769, - 4, - 2, - 85848, - 123203, - 7305, - -900, - 1716, - 549, - 57, - 85848, - 0, - 1, - 1, - 1000, - 42921, - 4, - 2, - 24548, - 29498, - 38, - 1, - 898148, - 27279, - 1, - 51775, - 558, - 1, - 39184, - 1000, - 60594, - 1, - 141895, - 32, - 83150, - 32, - 15299, - 32, - 76049, - 1, - 13169, - 4, - 22100, - 10, - 28999, - 74, - 1, - 28999, - 74, - 1, - 43285, - 552, - 1, - 44749, - 541, - 1, - 33852, - 32, - 68246, - 32, - 72362, - 32, - 7243, - 32, - 7391, - 32, - 11546, - 32, - 85848, - 123203, - 7305, - -900, - 1716, - 549, - 57, - 85848, - 0, - 1, - 90434, - 519, - 0, - 1, - 74433, - 32, - 85848, - 123203, - 7305, - -900, - 1716, - 549, - 57, - 85848, - 0, - 1, - 1, - 85848, - 123203, - 7305, - -900, - 1716, - 549, - 57, - 85848, - 0, - 1, - 955506, - 213312, - 0, - 2, - 270652, - 22588, - 4, - 1457325, - 64566, - 4, - 20467, - 1, - 4, - 0, - 141992, - 32, - 100788, - 420, - 1, - 1, - 81663, - 32, - 59498, - 32, - 20142, - 32, - 24588, - 32, - 20744, - 32, - 25933, - 32, - 24623, - 32, - 43053543, - 10, - 53384111, - 14333, - 10, - 43574283, - 26308, - 10, - 16000, - 100, - 16000, - 100, - 962335, - 18, - 2780678, - 6, - 442008, - 1, - 52538055, - 3756, - 18, - 267929, - 18, - 76433006, - 8868, - 18, - 52948122, - 18, - 1995836, - 36, - 3227919, - 12, - 901022, - 1, - 166917843, - 4307, - 36, - 284546, - 36, - 158221314, - 26549, - 36, - 74698472, - 36, - 333849714, - 1, - 254006273, - 72, - 2174038, - 72, - 2261318, - 64571, - 4, - 207616, - 8310, - 4, - 1293828, - 28716, - 63, - 0, - 1, - 1006041, - 43623, - 251, - 0, - 1 - ], - "constitution": { - "anchor": { - "url": "ipfs://QmQq5hWDNzvDR1ForEktAHrdCQmfSL2u5yctNpzDwoSBu4", - "dataHash": "23b43bebac48a4acc39e578715aa06635d6d900fa3ea7441dfffd6e43b914f7b" - }, - "script": "edcd84c10e36ae810dc50847477083069db796219b39ccde790484e0" - }, - "committee": { - "members": { - "scriptHash-7ceede7d6a89e006408e6b7c6acb3dd094b3f6817e43b4a36d01535b": 500, - "scriptHash-6095e643ea6f1cccb6e463ec34349026b3a48621aac5d512655ab1bf": 500, - "scriptHash-27999ed757d6dac217471ae61d69b1b067b8b240d9e3ff36eb66b5d0": 500, - "scriptHash-87f867a31c0f81360d4d7dcddb6b025ba8383db9bf77a2af7797799d": 500, - "scriptHash-a19a7ba1caede8f3ab3e5e2a928b3798d7d011af18fbd577f7aeb0ec": 500 - }, - "threshold": 0.67 - } -} diff --git a/mithril-infra/assets/docker/cardano/config/9.0/sanchonet/cardano-node/shelley-genesis.json b/mithril-infra/assets/docker/cardano/config/9.0/sanchonet/cardano-node/shelley-genesis.json deleted file mode 100644 index 544585999ef..00000000000 --- a/mithril-infra/assets/docker/cardano/config/9.0/sanchonet/cardano-node/shelley-genesis.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "activeSlotsCoeff": 5.0e-2, - "epochLength": 86400, - "genDelegs": { - "c1ad22cabb342cbb83ce3859708232f4945ccb669e9b5f932cffc0ed": { - "delegate": "405357b552c397e81f73dcb5a0da0828fe29610bd25197d86130df34", - "vrf": "458215df6c07abc66e80082caa7a189dc2f4995ad4b4b5f09481a55d8d0692d2" - }, - "c264bca994a3a5deee5a1d9b92a3d7e9d6cbdb81f2f6989bb7f7b437": { - "delegate": "d9d9d0f0e1f25c4af4d80cb2d62878b611d8b3a8e1ef548d01f246d7", - "vrf": "624f1bf3b2f978e0c95644f26228b307d7acca7fc7eb3d88fb6f107e0aa1198c" - }, - "d4bf7eb45b72dffa5ac33d5c902fe409e4e611f2e9a52fb0d09784c3": { - "delegate": "806eb0c17d9b0fe6d99acbabe7be76ef72bf9de96c5b58435e50837f", - "vrf": "57e52289207a7128c29e0b7e96a02c731a961a5944329b363bed751ad8f377ee" - } - }, - "initialFunds": {}, - "maxKESEvolutions": 62, - "maxLovelaceSupply": 45000000000000000, - "networkId": "Testnet", - "networkMagic": 4, - "protocolParams": { - "a0": 0.3, - "decentralisationParam": 1.0, - "eMax": 18, - "extraEntropy": { - "tag": "NeutralNonce" - }, - "keyDeposit": 2000000, - "maxBlockBodySize": 65536, - "maxBlockHeaderSize": 1100, - "maxTxSize": 16384, - "minFeeA": 44, - "minFeeB": 155381, - "minPoolCost": 340000000, - "minUTxOValue": 1000000, - "nOpt": 150, - "poolDeposit": 500000000, - "protocolVersion": { - "major": 6, - "minor": 0 - }, - "rho": 3.0e-3, - "tau": 0.2 - }, - "securityParam": 432, - "slotLength": 1, - "slotsPerKESPeriod": 129600, - "staking": { - "pools": {}, - "stake": {} - }, - "systemStart": "2023-06-15T00:30:00Z", - "updateQuorum": 3 -} \ No newline at end of file diff --git a/mithril-infra/assets/docker/cardano/config/9.0/sanchonet/cardano-node/topology.json b/mithril-infra/assets/docker/cardano/config/9.0/sanchonet/cardano-node/topology.json deleted file mode 100644 index 101e1e4a639..00000000000 --- a/mithril-infra/assets/docker/cardano/config/9.0/sanchonet/cardano-node/topology.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "bootstrapPeers": [ - { - "address": "sanchonet-node.play.dev.cardano.org", - "port": 3001 - } - ], - "localRoots": [ - { - "accessPoints": [], - "advertise": false, - "trustable": false, - "valency": 1 - } - ], - "publicRoots": [ - { - "accessPoints": [], - "advertise": false - } - ], - "useLedgerAfterSlot": 33695977 -} From 70ac615f415cf7d311c79915a5e10e1255f4ef5c Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Mon, 30 Sep 2024 16:42:04 +0200 Subject: [PATCH 148/274] feat: create Cardano node '9.2' configurations in infra --- .../mainnet/cardano-node/alonzo-genesis.json | 196 + .../mainnet/cardano-node/byron-genesis.json | 14572 ++++++++++++++++ .../9.2/mainnet/cardano-node/config-bp.json | 109 + .../9.2/mainnet/cardano-node/config.json | 109 + .../mainnet/cardano-node/conway-genesis.json | 303 + .../mainnet/cardano-node/shelley-genesis.json | 68 + .../9.2/mainnet/cardano-node/topology.json | 31 + .../preprod/cardano-node/alonzo-genesis.json | 196 + .../preprod/cardano-node/byron-genesis.json | 117 + .../9.2/preprod/cardano-node/config-bp.json | 108 + .../9.2/preprod/cardano-node/config.json | 108 + .../preprod/cardano-node/conway-genesis.json | 303 + .../preprod/cardano-node/shelley-genesis.json | 72 + .../9.2/preprod/cardano-node/topology.json | 23 + .../preview/cardano-node/alonzo-genesis.json | 196 + .../preview/cardano-node/byron-genesis.json | 117 + .../9.2/preview/cardano-node/config-bp.json | 114 + .../9.2/preview/cardano-node/config.json | 114 + .../preview/cardano-node/conway-genesis.json | 297 + .../preview/cardano-node/shelley-genesis.json | 68 + .../9.2/preview/cardano-node/topology.json | 23 + .../cardano-node/alonzo-genesis.json | 188 + .../sanchonet/cardano-node/byron-genesis.json | 62 + .../9.2/sanchonet/cardano-node/config-bp.json | 114 + .../9.2/sanchonet/cardano-node/config.json | 114 + .../cardano-node/conway-genesis.json | 298 + .../cardano-node/shelley-genesis.json | 56 + .../9.2/sanchonet/cardano-node/topology.json | 23 + 28 files changed, 18099 insertions(+) create mode 100644 mithril-infra/assets/docker/cardano/config/9.2/mainnet/cardano-node/alonzo-genesis.json create mode 100644 mithril-infra/assets/docker/cardano/config/9.2/mainnet/cardano-node/byron-genesis.json create mode 100644 mithril-infra/assets/docker/cardano/config/9.2/mainnet/cardano-node/config-bp.json create mode 100644 mithril-infra/assets/docker/cardano/config/9.2/mainnet/cardano-node/config.json create mode 100644 mithril-infra/assets/docker/cardano/config/9.2/mainnet/cardano-node/conway-genesis.json create mode 100644 mithril-infra/assets/docker/cardano/config/9.2/mainnet/cardano-node/shelley-genesis.json create mode 100644 mithril-infra/assets/docker/cardano/config/9.2/mainnet/cardano-node/topology.json create mode 100644 mithril-infra/assets/docker/cardano/config/9.2/preprod/cardano-node/alonzo-genesis.json create mode 100644 mithril-infra/assets/docker/cardano/config/9.2/preprod/cardano-node/byron-genesis.json create mode 100644 mithril-infra/assets/docker/cardano/config/9.2/preprod/cardano-node/config-bp.json create mode 100644 mithril-infra/assets/docker/cardano/config/9.2/preprod/cardano-node/config.json create mode 100644 mithril-infra/assets/docker/cardano/config/9.2/preprod/cardano-node/conway-genesis.json create mode 100644 mithril-infra/assets/docker/cardano/config/9.2/preprod/cardano-node/shelley-genesis.json create mode 100644 mithril-infra/assets/docker/cardano/config/9.2/preprod/cardano-node/topology.json create mode 100644 mithril-infra/assets/docker/cardano/config/9.2/preview/cardano-node/alonzo-genesis.json create mode 100644 mithril-infra/assets/docker/cardano/config/9.2/preview/cardano-node/byron-genesis.json create mode 100644 mithril-infra/assets/docker/cardano/config/9.2/preview/cardano-node/config-bp.json create mode 100644 mithril-infra/assets/docker/cardano/config/9.2/preview/cardano-node/config.json create mode 100644 mithril-infra/assets/docker/cardano/config/9.2/preview/cardano-node/conway-genesis.json create mode 100644 mithril-infra/assets/docker/cardano/config/9.2/preview/cardano-node/shelley-genesis.json create mode 100644 mithril-infra/assets/docker/cardano/config/9.2/preview/cardano-node/topology.json create mode 100644 mithril-infra/assets/docker/cardano/config/9.2/sanchonet/cardano-node/alonzo-genesis.json create mode 100644 mithril-infra/assets/docker/cardano/config/9.2/sanchonet/cardano-node/byron-genesis.json create mode 100644 mithril-infra/assets/docker/cardano/config/9.2/sanchonet/cardano-node/config-bp.json create mode 100644 mithril-infra/assets/docker/cardano/config/9.2/sanchonet/cardano-node/config.json create mode 100644 mithril-infra/assets/docker/cardano/config/9.2/sanchonet/cardano-node/conway-genesis.json create mode 100644 mithril-infra/assets/docker/cardano/config/9.2/sanchonet/cardano-node/shelley-genesis.json create mode 100644 mithril-infra/assets/docker/cardano/config/9.2/sanchonet/cardano-node/topology.json diff --git a/mithril-infra/assets/docker/cardano/config/9.2/mainnet/cardano-node/alonzo-genesis.json b/mithril-infra/assets/docker/cardano/config/9.2/mainnet/cardano-node/alonzo-genesis.json new file mode 100644 index 00000000000..0fd90deeb7b --- /dev/null +++ b/mithril-infra/assets/docker/cardano/config/9.2/mainnet/cardano-node/alonzo-genesis.json @@ -0,0 +1,196 @@ +{ + "lovelacePerUTxOWord": 34482, + "executionPrices": { + "prSteps": + { + "numerator" : 721, + "denominator" : 10000000 + }, + "prMem": + { + "numerator" : 577, + "denominator" : 10000 + } + }, + "maxTxExUnits": { + "exUnitsMem": 10000000, + "exUnitsSteps": 10000000000 + }, + "maxBlockExUnits": { + "exUnitsMem": 50000000, + "exUnitsSteps": 40000000000 + }, + "maxValueSize": 5000, + "collateralPercentage": 150, + "maxCollateralInputs": 3, + "costModels": { + "PlutusV1": { + "sha2_256-memory-arguments": 4, + "equalsString-cpu-arguments-constant": 1000, + "cekDelayCost-exBudgetMemory": 100, + "lessThanEqualsByteString-cpu-arguments-intercept": 103599, + "divideInteger-memory-arguments-minimum": 1, + "appendByteString-cpu-arguments-slope": 621, + "blake2b-cpu-arguments-slope": 29175, + "iData-cpu-arguments": 150000, + "encodeUtf8-cpu-arguments-slope": 1000, + "unBData-cpu-arguments": 150000, + "multiplyInteger-cpu-arguments-intercept": 61516, + "cekConstCost-exBudgetMemory": 100, + "nullList-cpu-arguments": 150000, + "equalsString-cpu-arguments-intercept": 150000, + "trace-cpu-arguments": 150000, + "mkNilData-memory-arguments": 32, + "lengthOfByteString-cpu-arguments": 150000, + "cekBuiltinCost-exBudgetCPU": 29773, + "bData-cpu-arguments": 150000, + "subtractInteger-cpu-arguments-slope": 0, + "unIData-cpu-arguments": 150000, + "consByteString-memory-arguments-intercept": 0, + "divideInteger-memory-arguments-slope": 1, + "divideInteger-cpu-arguments-model-arguments-slope": 118, + "listData-cpu-arguments": 150000, + "headList-cpu-arguments": 150000, + "chooseData-memory-arguments": 32, + "equalsInteger-cpu-arguments-intercept": 136542, + "sha3_256-cpu-arguments-slope": 82363, + "sliceByteString-cpu-arguments-slope": 5000, + "unMapData-cpu-arguments": 150000, + "lessThanInteger-cpu-arguments-intercept": 179690, + "mkCons-cpu-arguments": 150000, + "appendString-memory-arguments-intercept": 0, + "modInteger-cpu-arguments-model-arguments-slope": 118, + "ifThenElse-cpu-arguments": 1, + "mkNilPairData-cpu-arguments": 150000, + "lessThanEqualsInteger-cpu-arguments-intercept": 145276, + "addInteger-memory-arguments-slope": 1, + "chooseList-memory-arguments": 32, + "constrData-memory-arguments": 32, + "decodeUtf8-cpu-arguments-intercept": 150000, + "equalsData-memory-arguments": 1, + "subtractInteger-memory-arguments-slope": 1, + "appendByteString-memory-arguments-intercept": 0, + "lengthOfByteString-memory-arguments": 4, + "headList-memory-arguments": 32, + "listData-memory-arguments": 32, + "consByteString-cpu-arguments-intercept": 150000, + "unIData-memory-arguments": 32, + "remainderInteger-memory-arguments-minimum": 1, + "bData-memory-arguments": 32, + "lessThanByteString-cpu-arguments-slope": 248, + "encodeUtf8-memory-arguments-intercept": 0, + "cekStartupCost-exBudgetCPU": 100, + "multiplyInteger-memory-arguments-intercept": 0, + "unListData-memory-arguments": 32, + "remainderInteger-cpu-arguments-model-arguments-slope": 118, + "cekVarCost-exBudgetCPU": 29773, + "remainderInteger-memory-arguments-slope": 1, + "cekForceCost-exBudgetCPU": 29773, + "sha2_256-cpu-arguments-slope": 29175, + "equalsInteger-memory-arguments": 1, + "indexByteString-memory-arguments": 1, + "addInteger-memory-arguments-intercept": 1, + "chooseUnit-cpu-arguments": 150000, + "sndPair-cpu-arguments": 150000, + "cekLamCost-exBudgetCPU": 29773, + "fstPair-cpu-arguments": 150000, + "quotientInteger-memory-arguments-minimum": 1, + "decodeUtf8-cpu-arguments-slope": 1000, + "lessThanInteger-memory-arguments": 1, + "lessThanEqualsInteger-cpu-arguments-slope": 1366, + "fstPair-memory-arguments": 32, + "modInteger-memory-arguments-intercept": 0, + "unConstrData-cpu-arguments": 150000, + "lessThanEqualsInteger-memory-arguments": 1, + "chooseUnit-memory-arguments": 32, + "sndPair-memory-arguments": 32, + "addInteger-cpu-arguments-intercept": 197209, + "decodeUtf8-memory-arguments-slope": 8, + "equalsData-cpu-arguments-intercept": 150000, + "mapData-cpu-arguments": 150000, + "mkPairData-cpu-arguments": 150000, + "quotientInteger-cpu-arguments-constant": 148000, + "consByteString-memory-arguments-slope": 1, + "cekVarCost-exBudgetMemory": 100, + "indexByteString-cpu-arguments": 150000, + "unListData-cpu-arguments": 150000, + "equalsInteger-cpu-arguments-slope": 1326, + "cekStartupCost-exBudgetMemory": 100, + "subtractInteger-cpu-arguments-intercept": 197209, + "divideInteger-cpu-arguments-model-arguments-intercept": 425507, + "divideInteger-memory-arguments-intercept": 0, + "cekForceCost-exBudgetMemory": 100, + "blake2b-cpu-arguments-intercept": 2477736, + "remainderInteger-cpu-arguments-constant": 148000, + "tailList-cpu-arguments": 150000, + "encodeUtf8-cpu-arguments-intercept": 150000, + "equalsString-cpu-arguments-slope": 1000, + "lessThanByteString-memory-arguments": 1, + "multiplyInteger-cpu-arguments-slope": 11218, + "appendByteString-cpu-arguments-intercept": 396231, + "lessThanEqualsByteString-cpu-arguments-slope": 248, + "modInteger-memory-arguments-slope": 1, + "addInteger-cpu-arguments-slope": 0, + "equalsData-cpu-arguments-slope": 10000, + "decodeUtf8-memory-arguments-intercept": 0, + "chooseList-cpu-arguments": 150000, + "constrData-cpu-arguments": 150000, + "equalsByteString-memory-arguments": 1, + "cekApplyCost-exBudgetCPU": 29773, + "quotientInteger-memory-arguments-slope": 1, + "verifySignature-cpu-arguments-intercept": 3345831, + "unMapData-memory-arguments": 32, + "mkCons-memory-arguments": 32, + "sliceByteString-memory-arguments-slope": 1, + "sha3_256-memory-arguments": 4, + "ifThenElse-memory-arguments": 1, + "mkNilPairData-memory-arguments": 32, + "equalsByteString-cpu-arguments-slope": 247, + "appendString-cpu-arguments-intercept": 150000, + "quotientInteger-cpu-arguments-model-arguments-slope": 118, + "cekApplyCost-exBudgetMemory": 100, + "equalsString-memory-arguments": 1, + "multiplyInteger-memory-arguments-slope": 1, + "cekBuiltinCost-exBudgetMemory": 100, + "remainderInteger-memory-arguments-intercept": 0, + "sha2_256-cpu-arguments-intercept": 2477736, + "remainderInteger-cpu-arguments-model-arguments-intercept": 425507, + "lessThanEqualsByteString-memory-arguments": 1, + "tailList-memory-arguments": 32, + "mkNilData-cpu-arguments": 150000, + "chooseData-cpu-arguments": 150000, + "unBData-memory-arguments": 32, + "blake2b-memory-arguments": 4, + "iData-memory-arguments": 32, + "nullList-memory-arguments": 32, + "cekDelayCost-exBudgetCPU": 29773, + "subtractInteger-memory-arguments-intercept": 1, + "lessThanByteString-cpu-arguments-intercept": 103599, + "consByteString-cpu-arguments-slope": 1000, + "appendByteString-memory-arguments-slope": 1, + "trace-memory-arguments": 32, + "divideInteger-cpu-arguments-constant": 148000, + "cekConstCost-exBudgetCPU": 29773, + "encodeUtf8-memory-arguments-slope": 8, + "quotientInteger-cpu-arguments-model-arguments-intercept": 425507, + "mapData-memory-arguments": 32, + "appendString-cpu-arguments-slope": 1000, + "modInteger-cpu-arguments-constant": 148000, + "verifySignature-cpu-arguments-slope": 1, + "unConstrData-memory-arguments": 32, + "quotientInteger-memory-arguments-intercept": 0, + "equalsByteString-cpu-arguments-constant": 150000, + "sliceByteString-memory-arguments-intercept": 0, + "mkPairData-memory-arguments": 32, + "equalsByteString-cpu-arguments-intercept": 112536, + "appendString-memory-arguments-slope": 1, + "lessThanInteger-cpu-arguments-slope": 497, + "modInteger-cpu-arguments-model-arguments-intercept": 425507, + "modInteger-memory-arguments-minimum": 1, + "sha3_256-cpu-arguments-intercept": 0, + "verifySignature-memory-arguments": 1, + "cekLamCost-exBudgetMemory": 100, + "sliceByteString-cpu-arguments-intercept": 150000 + } + } +} diff --git a/mithril-infra/assets/docker/cardano/config/9.2/mainnet/cardano-node/byron-genesis.json b/mithril-infra/assets/docker/cardano/config/9.2/mainnet/cardano-node/byron-genesis.json new file mode 100644 index 00000000000..1215d5c58e3 --- /dev/null +++ b/mithril-infra/assets/docker/cardano/config/9.2/mainnet/cardano-node/byron-genesis.json @@ -0,0 +1,14572 @@ +{ + "avvmDistr": { + "-0BJDi-gauylk4LptQTgjMeo7kY9lTCbZv12vwOSTZk=": "9999300000000", + "-0Np4pyTOWF26iXWVIvu6fhz9QupwWRS2hcCaOEYlw0=": "3760024000000", + "-0_pjw54ACGTrCsH3SXreedq-Cj9pFBcZDbxT9sXaqQ=": "411085000000", + "-0f2smLIQ8XMD0aEX6Hyea9x7lvsPpXkJNkIxWgu7WU=": "394923000000", + "-0fIGh1Lc5glmQRyy0EfBXOV8WabO5kSEVGYYrXBD0A=": "915796000000", + "-0zTwqKpgqj4_OgP3U4iKsU6JHoKOd9ieKtwKRB9OW8=": "381805000000", + "-13zumvoaX3Pz77eoXL7NorM-SExtpwV8yhfTRn-TM0=": "384931000000", + "-1RjsQWENpqAFT1WqdQ2KPNU1AOcU7ZcQpYOOejK5Ns=": "769178000000", + "-22xrm7vKzEixOc5F1oj3xeKMN_MH2y8O_u2TH9DePM=": "803076000000", + "-2RkpQozYiWQhIIsD0aCs0gf1P8bVgnnzwsFg8c8RP0=": "1153846000000", + "-2XZaPcXhltDmOf1hvzYfZg57lKhlHnOS8PikQEkUVI=": "385510000000", + "-2o3qNBbRmRlnNlnzch0PN0_r_E7mLsKgs5OGRa4dxg=": "576923000000", + "-38c7PmGiIDIfQGiuprXyeGtunN4aNFxE_jO6tUN0Ck=": "382394000000", + "-3NbDv8uTc-dty8f0AR6-Yb-qaIkCwSkajjyFsXf-YE=": "1644282000000", + "-3UvSWkXUfNxcStJuoOXxTnRtJy3jQI4sUi3vHjXC8s=": "2426053000000", + "-3hZBJcnLmZjYodAosDF0XnW_xbQ1S6KS0XB3Qluszg=": "395499000000", + "-459i1m513sgQONC2P1ZWbJOM2sF_O7XjHcQylDHXnw=": "757764000000", + "-52oZuYSkpLCwNe0pGn6CUo92vOr01Np05mCoJ2mNhI=": "1207271000000", + "-57Zs0tjj9n8p2pvfgzaLZrM8iD1ISbJvSzmdgQaNIA=": "949056000000", + "-5Pgq4y8c_F2IBgu8yORFPcRB2fFsYzvf1Wtm8Q7220=": "458682000000", + "-5aZc2WtY3EAyILQd4UBnTG_CeQXnjL-y_zFDRcPYok=": "451138000000", + "-6Ed7TmLl3T53GAOiqMysVmamtt7XT9ERdscqMsM7Po=": "2044027000000", + "-6lnl3HES9BH0W2atqUFdtJLYnqBk9HzrIytY-DP0c4=": "382394000000", + "-76g9IHNPdYkxYUcogzbRUCBOQPNAgjx64hOwUpg6rA=": "1140914000000", + "-7LttasrZ4U5Grz49xp5vs_I_JuQZgnENQJadzHxhdM=": "1158541000000", + "-8I3X8YPjI80iD0dGl2WOwS7CiXsPc4DcZa6HOhoxZY=": "442614000000", + "-8WiQLpEQ7st5Ty-t3Lqh2d5VVPcv9n2UNTlNATDvmk=": "810455000000", + "-8uHVBbQrouWvBujh8Y6Zrj_4cZPin_xHgrZX5sZKRY=": "377786000000", + "-9IMLpHDIWwxDcLREa1l0WmXTHrSqP-g8XKvWCD-GlI=": "1153846000000", + "-9SaB1MbA4w0GYig3RCbBFk683YIQSSZqdKaQQmLaW0=": "636363000000", + "-9jeQK3V4UGkIF-F9Du1DKIIryNPSiekVN2eGBfAXRo=": "383322000000", + "-9pQVNlbr8DOGuk4UN5j5ee7ykKJrYN5clnFacHXYyg=": "385209000000", + "-Adr_ZFBQfWsPiNyhBhMFoz1rdj5UcDPyj59xKNkymg=": "469310000000", + "-Bcfv2Bym8nD1-uyQCF7u-16WcTWGEdFjgTlEJheQtA=": "461437000000", + "-BdInt6tiK0cshy7Ft2mN5ChXoOeJNK32XYhWYuZy_E=": "845859000000", + "-Boy9bMaRnk98bM9V4CkTtFXr0mMNJ-D4Vof7pnWPtk=": "455259000000", + "-BvExFvyMtGeBo0-uETFW1lQcDVqV6vBMMQt-MzNHiU=": "614226000000", + "-ByAPVJKRz34uqT6aOUr556DKrriOBHVWlmd8TMS_LE=": "454353000000", + "-C13tNbi3TIwk7MxHXRht--Gpo41mqqzafwch_4yWsI=": "4110858000000", + "-CMnLkiTXdAueE9UuawYfx81hH42CWoAErQ4SwvcA2o=": "468121000000", + "-CajmmZSyVGT6MeZ5J3Mu-Cn7v5xquGpuAtKh5EHHmg=": "1386434000000", + "-Cjf5nznzh5isQyBsTmWUt8hhUiKtd9T5145WF9DqcA=": "1837100000000", + "-DNTu6MVdzsnvj5UVjs_KbRIRwO6BI2N52ywxDTQnKQ=": "411085000000", + "-DSMe6DVA_oyFe-qyP3_L2sjdUm7AdWfOX5ilA1hhig=": "629928000000", + "-DgrQM4ccRxzSDWO7OMCQ5T3LReFOUxUT2QcQ1MkQuo=": "417634000000", + "-DqAfPlMXKnsaF1HUKIlnyK9R_g5k14nrBBey6CSK_c=": "385506000000", + "-ECxhd-9YI6cAO9Qui9hVkwM-u_yejSnoXF-4CwknCs=": "462839000000", + "-EJ4223naAg5SF1o0RRqB33ygRNd-2CZPBgFd1fRZpU=": "453711000000", + "-EOX9EsDeqIpxFRsZbYpubuDp0l4IG-Q0-CSQjdeprk=": "596818000000", + "-EYGheGaBI3ihwwVpuspt7TVA47oYAYEvQTAhWh8PMs=": "3856868000000", + "-EcscOlGPyNoRtXyMPNbSLjf332RIl7SohFR4Fx8br0=": "794258000000", + "-Eot4a-P3RKYYdZwisLhe7iflHhy9H6JwCsizjT0UQE=": "8133362000000", + "-FZ3PRPS2BqUIqbmyAfWh1SRyZRgjcXCoDVPx0C7-8c=": "384510000000", + "-F__yowsCEyWmp02BhUAztFfjZzZszSyRsvQ_XYwLFk=": "1797820000000", + "-FjIgqcldrkp5S2GWjNE7XumyCvEKUvBIfG7vZZW2ts=": "470310000000", + "-FueSz1tUOStKg9scEDc78cQfviOSt4--kJPrCjoEGw=": "384615000000", + "-FvOnyMxLtOln4MIXuTTj6tHTRRHfI8ibcvoEtpCg4I=": "1370199000000", + "-GJfncbUujVP19QDUvg6qPMRkBMgsCO3fB0jP_BhiCA=": "504600000000", + "-GNMn-2WtrtR-y8I2nHJlaKP5w0cZA-eYZmXQ1JWTWs=": "407808000000", + "-HO2UlTWX4o-BevbOVjVqalMLzM5zyvg57qYV0OpY0E=": "378062000000", + "-HOMAY11JRk4ynuEwDSyd2qEWwo7ow2_YnHSGUwfgbY=": "1156521000000", + "-HQfBXE7CzceH4RDi2msI3LZVFeKTHAlb4PZoieKxmw=": "578654000000", + "-Hs_alaDNKILbu900VVWCB668P6mwPb6gCfwwL__ujQ=": "389491000000", + "-IF74wbnopLbsCKbTJXWTLxWKAd95pXDo_XVkmCyP3s=": "1153846000000", + "-ISvyVhKB4YzexhTVVubxioMTDyUEREDbpLburbPN4I=": "422497000000", + "-IpCxwog17mKCwmKbwmeL7SrEvbN5NEYCMFqiXnWkuA=": "656960000000", + "-IrG2LB7XYZRFgrwtYuocP-Y1tLIxvyr4wazSlFiPiE=": "3846139000000", + "-J3MRlfkY1tl69nJtkqvj-r6fWZFH3qfhcjTT2u_qnY=": "416901000000", + "-J7gm_kKqUqZtmLlmaUKcC5dcvCN4J6VD9a0rEfzRDw=": "751740000000", + "-JA0yu-q4zDpk_V4XTkjgwaz4CpDthT3tZBrlVviDts=": "928308000000", + "-JFJICblDvcgM0BOdvt1Clg2rd8s_J_gB89HO85jfEk=": "456934000000", + "-JjpHv5u1XNfwqpbRpc9eSLTiGCsAXh4-aMkgiCaQZY=": "1249999000000", + "-JpVWtQ0hs7VdfRSgt2kabwbWPIf5iOZk7CCWAZdYn4=": "547510000000", + "-K-TDTIY03Hd4dqQNlbuJpFwWFYj82Jx7oLqXq6D9_A=": "378257000000", + "-KcL4jUiU9w8VDRqReTAD28XMUkPoavGWeFXIVFbwTs=": "384615000000", + "-L1AV7tA6KCUImfWf1ycIKsXIC5iuMfxHlEY4_UWG50=": "384435000000", + "-LFPcL65Ax07wslU1YrtDRrWRjNG_Wu2awSFM3hlykY=": "959893000000", + "-LGgZ5yDlG-4Eo_9PPORRqhqJwtCF3K1NTG5wgW0j5s=": "451268000000", + "-MqgWZ2b34_JaRXh5CxZBolR5yfEf_A1SDzHit5XU_c=": "384333000000", + "-MtBIlw_11i8Z2jkOlJcOhFKiQ75gWVujcG9UjuDNb0=": "404792000000", + "-NKYDGQ_-7uV0kx2XRnFSyS9W1ufT5TBpSQJMi3dhzY=": "577513000000", + "-NRuiEmwX_NWeEbE8ar--RYMtBzRCnGNThnjEE2MEZk=": "7707247000000", + "-NdXEFH_lt8BraFwRhJ98AhjSGHXng6UDzU6rsLldQI=": "769230000000", + "-OAt2LO5GE5SjfMwdZccTntKb_FADaf6gY6d1F0w37o=": "451662000000", + "-OFNssNYmlmA1JlJOpAD9HnUbW0PM79kUsnoPKxP5Q8=": "1542774000000", + "-OKgS0uLMnfbCV58GcKV5weCaLoj_VY4kTwkswJNv0Y=": "458917000000", + "-P491zXs8NfXwH20cpNeuBhZevdmJSkwVmPXCMml_MI=": "378040000000", + "-P92NKX7VfINRJkW4-uWnFt2GIucRijfRv-SyT1GzAs=": "423370000000", + "-PYRHrir4cnPUMrOh53tJ72tdzwaASHuyubwaYN64ZM=": "3133656000000", + "-PqOXEBQ5cWfb9Y7wbRK8u4Z43LfMlNQJQcu1p2JvxQ=": "500484000000", + "-QTY-QSDpuLRL79SUWONTS3kKGQyAoMBuAfqceqtwNY=": "1447378000000", + "-QVUcJ3dpF6jnIv6yw1ujd1bq8QkXx_-52-AV4HYoyI=": "461906000000", + "-Qv0wk7R_f2TwD8MxPR5SHko0b0t4sRUFxJk1ag2OLo=": "1538461000000", + "-SMHdyGhZnm2h5wSmZ6e3Gm6QfmZXSlWhVMs-NIsr6I=": "3846153000000", + "-SUhoC58THcRgFkqMHxb6iQ9XMhWWDqyL_iUQPFZd3U=": "416666000000", + "-SVZjwxl-F3wIIArEu_PNCvAISx45afdxIuG4aU66A8=": "1069958000000", + "-T-SQS4JtAvgsuHnINhzt1dLnO2qc1B-OlCbj1kGkOU=": "1538461000000", + "-TAF4lNusdqohxX16p8tMm1_ghFcQV7rlrZ1rH-FT1k=": "5385693000000", + "-TL-awV1QRQbVQiNvTPBGDWZGn7rm8PH-IyuHFWqQqA=": "1156522000000", + "-TTH7YJVuihIrrjpRQFLtJUnLiF85OFxCaz8kdokSgs=": "769230000000", + "-TVmCHoHbA47uNBcPHYBH5PKXRaNw_OEuYIwyXxtSbY=": "386141000000", + "-TYqe_FzQzDOY7wV4fcJyEq_m9sjsojxPf-UL6fzSyM=": "412309000000", + "-Takwzp-jrURutL6WUkltSdgMpHjynZTT8cLA2bSrKM=": "381059000000", + "-U6KatOQW0Z06gBCB9ibYj86S2ERgf-_qOFKdFpo9ew=": "454545000000", + "-UIsyr9Sdd-bpeRqN-WGIXxK4-A5gKKZgE-FR9y3mgk=": "392418000000", + "-Udj-P7FovROyPfpU3LF4e47Skcddubvj_ROeA_byIs=": "378385000000", + "-UeBwObtQ_18wCUiU4agn2B1qJSJ1kIStGjvlb-i7v0=": "503282000000", + "-UqPSh_AZpO0Xr1A23hYDgDP-yapTznmiKbu1setr9Q=": "379457000000", + "-VNHYeD_DDShZwKTgdEin25zL6iKp7iTQ7fGnE362yU=": "423312000000", + "-VYzhkIqzjjIYM9OiiwoVUShWQSYQYb97FfMjzkIau0=": "461296000000", + "-Vk819DZwAfLOnfY-G5t0BtuZ47ksldvmUOTtLSeDEA=": "499842000000", + "-Vub0gjBndzvtyUEHGe8ghngHLkexA2sbBJVo18zhA4=": "19230769000000", + "-Vx8K1NEL1MGWJ6PDmW5nfMk-5N7cii-mE6TYD_Mxow=": "382394000000", + "-WDdsOP769ixukqkcBfaC9Q9XnB1oT0pRQiVfharfuA=": "391797000000", + "-WMD8vYs9bEJAgrxTfvLSs8LpcM8pJQNHzulEgTdgHE=": "420676000000", + "-WPrHo6HSppH0WKi0DFKSE1lLlC9XvEwiXLgkGhywYU=": "434339000000", + "-WYlVxJb1J1bswAi5o87ZzLeqCD1JatLLysM_2uudnk=": "376125000000", + "-WiROA4EjGCyEvjNKFSXUEmecM_t0iNoMlHA8dCW1s4=": "384615000000", + "-XBtok2pjLy-DW0evQKEE-PRID53yWH64hZvOwe3ArQ=": "3114842000000", + "-X_ADEtk3rito8rgJGcmm7X6oOUln3TuhDcShLD9R6c=": "356922000000", + "-XiLEbhL2sBFtX3oEhzuM8FqZx6-XMXWC2FFGJ8UuAA=": "384615000000", + "-Xlz3x-LDH-srD_zRhPiYcTVRT5GP_VocdRDP3bhX1c=": "4651238000000", + "-XmxXh9ggnZ-ZuwJnAo0xv7cV7hnqK2IIuHHZ-hh9X0=": "4134900000000", + "-XthbIXp7_BgFsnyOvSM3ysSJohabUiUAbOXwmdj3IU=": "2006912000000", + "-Y5l7aG9QMu9RYLZJY-GaT_Y70prLsoViUVeUav63AY=": "615127000000", + "-YCwhqhF3BAUD9xHo0VU9VTxraudP0LH71GEyaauWQY=": "376889000000", + "-YE-3PtA1jjWUMcUWca-M9m5kUjvV7V8UaojI5dYiZA=": "363764000000", + "-YNoC_Jb3t7h9-CkvcoKZkKpVZWHakXNkCZCS0HW0xw=": "416666000000", + "-YPi39MlVJo3hCI689EZ_q6MDvdSnaaQh3ye4uofRS0=": "766000000000", + "-YTOQ8XccegJloX043lGm3obgKmTHYV8ItXsfqt899Y=": "2258472000000", + "-YYThSgiue6kDlFkVvxUNxSAQjRs61YZzJfVt_RBA1I=": "1213773000000", + "-ZX0cjedu6gJK1GPQZRNRtYH__8CjvS0OGW-jo5RjIg=": "392088000000", + "-ZYT-8LQFd-KCyiwsCYUpZgQqe50EuMSOg-ZlK9PTUI=": "462146000000", + "-Zlia6vABTQYHYTlJlPa4_M2JYs1wUGea9gikhOaeek=": "846741000000", + "-_TWWRWWQiPiLnol4sp6040zjHd1vmWaZrF6Z5PGbic=": "416666000000", + "-_fOwPJkH1ImH3Io6qCU-diTb6TJCY7WfSP9o1kw9nY=": "385458000000", + "-_iDleiPeDlebgAIbvF57PkoNjTeHRvRYA_24WWozCw=": "1923051000000", + "-a1vg1mkxvjKbC1sZVtVH4BrK5xbOfNnB0C1GBgrYxs=": "532264000000", + "-aHoQsV2CAbORGGbRgUyTsfYUfs3PHteyvO58vFESqk=": "383030000000", + "-ajWKWBHtigm-GxIgSmX6eFHaVYayf-xaKUgFyzPgys=": "382410000000", + "-aqy3uhWt2h5AtLOpfMMjeqU2FebrqOjW0GcTY0RUVM=": "917574000000", + "-b9psqj05A3j2GGZtu5TJKyIu6eNUklkg8ZEkiXr_rc=": "10967430000000", + "-bAYVxIXqh8OBKDOw-7ov-GQxEexevxXv6do8m0OUxg=": "3127867000000", + "-bT-EO_KZxV9nZO3CrGCC6aaU2EuqSqRlBHpjKMVFbE=": "389258000000", + "-bf0EVD3NHR1IWVxvvcgl9OIIjHLCeB5yVRK6rMRgI0=": "385508000000", + "-bhbolbb2hz3e7UkOohWwMuM8pUkO4vD3qWjMFw4Css=": "384586000000", + "-bp0nmh4-UO9eUasCJtCButfbNlM_Be_qMYWZv3vHfE=": "385506000000", + "-buxtZS1zCBKu-dOq6JA76qen_28yxPTheiADHMGYtw=": "1623129000000", + "-bzuGB_0CQ81rMboYA_6Kl1Y3G2tU9aYkKYreioMof4=": "769230000000", + "-cKaRmR5IVA8isaauCO3rX3AzX7u4aIGYv5E3Xp8QHk=": "384615000000", + "-cSSaMNtLgxJ56Uu43zeG2pT5Iud99IAuVIrdu_mvzU=": "1156518000000", + "-cUm-XTN5HSlTBFHXvq1LWYaUv2RPzbXpv12R9jA46Q=": "382252000000", + "-dYU1Yf74gnbIh9YTqCsWdQIYIXJQF15xJXdkfF9O1o=": "10967430000000", + "-dmT4TFIQdHVkZrd3kztUiy5Tp1gxeelhzbpesjigZk=": "675873000000", + "-eWycxIB-dYugb-nKX6sLEHbjZexmoCB3ZSNAzA_GqQ=": "4233446000000", + "-exhMA6kU_GuQUYbjoI9YBY6QpMgBKNSWrYEpcYobXI=": "384615000000", + "-eyk5kfGU1BU3q0gl6naR1zKqmzBdN5HzEboY7ByVWo=": "1275769000000", + "-fNiXrTHuhWSlLBMUgmm1VgwCP0opU6-ducQ7e-7UX0=": "389421000000", + "-fX8g_B-MsfUzdlofHWMwkC0xMWgp1Tm_6r-06ZeCpQ=": "383098000000", + "-fdyLtiENRdHJHMr1UJagMmy82668j3nimvrq0Q6gfA=": "908890000000", + "-g-EoJ37hZ1MRUuwQxMpfFJWZuhgmzQm5eTsZgHmtZg=": "380654000000", + "-gAY5vwff08wqycphsz9AxZaSKTFJZfUzllEqtqbjuo=": "4615753000000", + "-gCJZphXJtIDBTkpHA_avig-AxSEcA-TsmelPHuf0Uk=": "385507000000", + "-gPGNVsPJq06kB5dWpke7VAG9dU5KbBz6dvGvkLlo9k=": "423531000000", + "-gT0hsH4uEpJRnEVoDbWwKmB4T6PZechsyapoGmbeMo=": "385510000000", + "-gVIDHo4Tmzyi0pJAQgjUvo3zD8U0K3ifpaVL1O8a9w=": "384615000000", + "-ghro6k2u5vICz_LTkenlOHUlcbxp4R-1eqZ4DQ8IHA=": "458561000000", + "-gu8Y9k89cKNRxmD4ysL2G6w2hm9UGbhca35LRW3_CE=": "2827874000000", + "-h5cBcZ8CA51pEekCFfhPnJYhOGoyZlVZV9C9BJSsOU=": "396483000000", + "-h5ns13Fke-i0IIsiZT7Q1E6r-KWqPniKJPmSFJNv2k=": "1927537000000", + "-hRDY9ZOgTcmgz2PFPXyPS69W97tA31RXO1q5uofOTA=": "2343896000000", + "-i5slmnSzdsA5ObjT09Nngt5OgUuL22boFCPKZLoa0k=": "3972506000000", + "-iEm0mBKzLF4q4VHDLFJ207069YB9RsYHdL6jnWaeUk=": "773076000000", + "-iIvXf00Upf6wZw2sSc8znPRzyRziA1XgB1GxXrLAkE=": "407469000000", + "-imjSrMrUjsFS7z8qNnNu9WYJfCByBPaCL5IioWCc1M=": "416666000000", + "-j-yyCl6C89et-N6buPug8AOeXehpNYrgSnFq-J7LhU=": "769230000000", + "-jNodyNBNHYEKWJtgmi1RFG9IfjBoDMZHaYx9UGnCwc=": "418855000000", + "-jYwbQ1X4FlnjlvTIBbRQmi2rjiomzxNSmUn2P0EbvM=": "524269000000", + "-k2iAO_P-HfKOJKKGggjpSbYJ8GAE-VD3fcL5iMvfoI=": "464030000000", + "-kAk-9-qP6ZGel0NVhPKltQpZDzE6cZW8wxvqsSPtd8=": "2073677000000", + "-kNUj3Jz1aQvy5HhgTTh2S-0LWGd5_WiHJ_B6rzZOKU=": "394212000000", + "-kf0O_ct2AnKRAydQLQyMXLK8CE1gN1_ObUuGFP5g_g=": "418059000000", + "-l6wDluzWSqOTP9Y3Utv6Hu8cm24VUpxPW0dQk6Mnu8=": "466263000000", + "-lGfrO3-fTSrWafnMoAIZ_rh1T-3Lwr35G7KTEprdZU=": "1241455000000", + "-lkURGj0aso3uHEhT5m-0UbY89vk0n2jPWY6NR1hEV0=": "1709389000000", + "-luq8EnOP0tfjyq8jb5_eYk0x1rgg2j-Crnuul_bTjQ=": "464104000000", + "-mNMSMuJNRhMprfY5_LZ1yq10E5P3ZPt_KExLCQanA0=": "1891939000000", + "-mNY55KrCnadNwQxF1WBSEJwrkbDOGyq1BH0m9OeEjE=": "1669230000000", + "-mWsfRjEHFjLpKNg5APtJaAk9C4qK_AFewpz6KKBVqA=": "923141000000", + "-mlRcS1vLufrJrMgM0ZaZ2GVndoGcE3Tv4nfdBZbprE=": "461940000000", + "-mrF1fwl_2AbrYuhLbIJTcrNVWDtaZ_46IXyIaGI6Ik=": "452328000000", + "-mr_-RpfD5jb6Wu3OwiTMuQ6F0pRqzmTsDQim5PId00=": "377348000000", + "-mrwD1TWy2mmUEwlegsE1Z5t-UnkcmmlMtQ57zz6qH0=": "455736000000", + "-mzjQl6me7EpTlO3xsvNLzY5IJA0y1LI09a5LWXu2yk=": "7646955000000", + "-nDECej_BXdrLKi8HKRHb-fSLPqv4Sh3-pQZSYSBEH0=": "399999000000", + "-nlREoCcy0qiqDzBl6gPDhdrl-6higJv_CzQj_TmvKc=": "2146763000000", + "-osqazsfH5SOEJhqRIt6vFiRJuJ256iXdZrVlasjnuo=": "377902000000", + "-pgHK3S9NqYgu3aXNGX0yY8E_KECyz1iSXXTj4xrKBY=": "417632000000", + "-pwPdVoyGOMtBOgyvFN2C_Atc8iquRcVfcTUJtCoeiQ=": "382993000000", + "-q2jz_oh4x_fArzilDHlsIcFMavi3h4yOf3Co_xcHlc=": "402668000000", + "-qGZRf7L9lxZ2NhWN5URxX4olzB39NN6-MS0mXpi6SE=": "411085000000", + "-qIoHCpXb4tWJ7by57hIeEbu0UbLCovUYdJe9M6-VjM=": "851273000000", + "-qjtBPQMAw1UvwTO-CHhR2GgzYZGSTmdyVUmzqns_AI=": "808240000000", + "-qynXC1d2VZRjlsOT5TJdQXFxz4TXGwJtbpaZkGt7jw=": "1935699000000", + "-rMUDFwXBwMIytF_eDBIAm4IFieSUmmT8TE5l8SCUL0=": "3169709000000", + "-rTTCPNg7zWEKXyjurO5MdFvEKN4bUGrAASAik3alO8=": "637183000000", + "-rm4sBs0BR44H_5r6th3WtzxXwlz_iCp2uLo7jQfds0=": "897327000000", + "-rvW-9QOC9i90bQT_VIikJaaUt-gfPIoHjJ7kMrmtb4=": "1154332000000", + "-s0TbB6VfvIAf2gvFwwIcE3RYjPJSmtsEJVitlPCzXA=": "417632000000", + "-sWMRArmjLSMcwVdwfk0ifntQeiDfDDkPLQkFHUG2f8=": "384615000000", + "-uBMJuWyBfoY0kz_i63zjYpv8tbYyfUCCCM_OOpazTs=": "386645000000", + "-uifsFDah5UWG1WQ6rb1996xoL3tQzT-h96EJbmhH4M=": "844393000000", + "-uinLc3IGRhMIgOhiICZKcAUxtQjyG92YnIDIso_kYg=": "384615000000", + "-uqFrFRQG9uZ2ZYNkB7UeIaGVLyMOpMBoHCAuD5gBxs=": "833333000000", + "-v3pIdKntmG3XMBRx48V2GYFirLos_Nz2kctEwnGNUQ=": "464950000000", + "-vLJzO27k1REMZsYHhHCyWQWfcNYKxDXI_kWCAqzUZo=": "1538461000000", + "-vmdT5TV_YWYtzXxZQZvGe8TCS1x5nyr5CKI-6uXrok=": "27372915000000", + "-voQUQWKeMlhHLiZTJEm_pHXtUjE4m56ACKRmhVxOkQ=": "407808000000", + "-wgxxoeWKhwni7e1LLQUwKG_3c4oOrs1SYXUxaRwc4M=": "1234817000000", + "-xg21V8_MXykBme2Ml8yxmVcx7Ye9ynmIIDnTO51aww=": "2084345000000", + "-xpGmReYEnTsPrZXZ3A8fkwdDtUqzPr6_Y-88Quzlyo=": "836132000000", + "-y1-0o-v3rNkfyi3bK3ISaXZgEIXRoQZI7XwAsoDO_Q=": "11614219000000", + "-yGdgKwUrpZpNEDEhkLPGjwnGQIzB7WuLg7YJUuAoBY=": "1219880000000", + "-yIf8LECe7RQLdNMdVBkcp7wTeepJeweu7lNDvYf-O0=": "1177005000000", + "-yOYoDbHNxV7RuZy0uw9-9hIalipRbIomtd98kwxFXE=": "769230000000", + "-yQPBo15t0mEhSDqGUQMPPRPj9caYKNZb0tCsCT9OPI=": "384615000000", + "-yU3D2luIiHM21do-YOQAbfQjfwhGpoHODUALsZEjE0=": "500025000000", + "-ywc8L-hmoUycXuupjQNx5OjUTXmfYgLGIYhAXFIn8o=": "1145412000000", + "-z5AQh3jrQG7xw98iPwulO_Fl7lSSTWhO5g4euvqPdY=": "409514000000", + "-zMl7MZtEQPsvxLX6Wa0_aB0c_WVq3MvwZHsO5xt5SA=": "455094000000", + "0-12_W55GENO3jvuyaOOqwj3hVG7hQQQBekfR4akvEI=": "498437000000", + "0-7ePxzgBD5uVit84g3WiRk7QTBco7RF8CtbAxt-yao=": "460673000000", + "0-BTM9-eNCrgovKlNrGojml106pTrY6FLGbosy6-5AQ=": "473265000000", + "0-MxsDKfH2-0PXxFFg3b_Y0PvKRlYXS0Y1Z287XrsK8=": "2083321000000", + "0-hePHz29F2BGUSYRj_XO8ejXS0W2owykacgWy-8t58=": "417633000000", + "0-wdwrBmBwWiBqQQg-XRFN_AyYDUsepB3BVdDCHJ5Uo=": "33574379000000", + "007eg58p79DrMoxlJe23K7fIvUc2895NgZcFM5CAqyk=": "894213000000", + "009WYw04-e0RZRPv4ieq6ZcBlp34zRUkNdJmAsQS_yo=": "811044000000", + "00NqpRdugwLlatNTn84kbBgb1SFRw1NEC7hsgiKM8g8=": "470437000000", + "00OlXW7ruuBu8_vaRWpkP7g6bAbUnn5M5OvaTXA-omE=": "1233257000000", + "00YHzBlHQjrHoZYOJSXJ-nv-ue24PsZYYWpRkhPYS2k=": "384615000000", + "00eeUMbSdmOpJlHEtJSatAXFjh23KlXydw1A3fjxm5w=": "385507000000", + "017Y6InCSUrXU01NbukGXnKNb_ZngegBqIaN--SwLgU=": "6474753000000", + "01VVNJqdkdD_eyxVZUvPTSN5hXoiTLbeJPDOuTbNzDo=": "1807692000000", + "02BU985sqhNGkTpNRLA9LHRuO3WoMzPGVGLtuWKq5wU=": "747044000000", + "02mzEGTld08KzkM12syeb9sLNuVdtBrpvCzCFH5R7n8=": "1153710000000", + "03vZH5vDNfoci0Wa8D34PgwImtQkt7gKUOpq4-urRto=": "769230000000", + "04US0D8w2MeuJLtsx9eeQ6jGeHwosV63mycV8Bgd9sQ=": "470322000000", + "05G2toPU5pcdzhkt8CmWPoGWWLFPxQ6vAIg9YcIELcA=": "405357000000", + "066USWeuOsfj-pa2EkbgasE89w_x6rAu2G5LUmam358=": "4229856000000", + "06Bv_JAtudpTBiTanMCEe95DyCYKuwjg8hmTamdOmsU=": "412862000000", + "06DjhIkCDGgg0tq1PPxysh9M6hGv_ohQxcK4aXqB7Kk=": "384296000000", + "06NWGmTKOyyCRCNAG250HMVwOhoeC_3FG-AYhZ3bwkU=": "417534000000", + "06RxpMoyZCqIHd-0qKaMF9mmhS0VFvMXr6fAT0C6aeU=": "1413610000000", + "06haH4PxOUSoTafAEMsgYeAzwuqn6kfJVlhWwUNJV7c=": "577371000000", + "06sbPc13ROapFn2Cpm2v_fJrbKUJqyIsFvs9YNmFOL8=": "421613000000", + "07-XXtxfuKoFYZH--okM2n0iMMHVs9QNVVeUIJzoIsk=": "901165000000", + "07Qyi5QBZUOmUjPSZSVJcERDA8lu8ggGbuP2XE0jb_4=": "383087000000", + "07Sd0YXzHi7CLNoGcnslBPepYlxGuTU4xOV2atv9u-Q=": "1270391000000", + "07gU6WykwcgpQ5zqbat0gLHGPShBvVFDNAwEZKGeDC4=": "13636363000000", + "08CvvTa4jLAZ492Xx1Lnp04wmh_1xBIzeGCkzJA0xh8=": "761923000000", + "08m_aS1mxqD_0tff9ZQXXbhwVJvzRmdyS9d_KOwXsoM=": "1910522000000", + "0925LEMJYvAoMa8125lYqZc-05rcspbXUyoW3gOmpbU=": "404257000000", + "09EBxzSPPP7pAju4mPb9utejN0w6OKTKSywML3xBW_M=": "384140000000", + "09HzZXqRgyUkumDPynF5l2JDhnze8-_xikEDNlSvRFs=": "4545454000000", + "09NjAAs1J6qaiR2lTaGpfqedwaB99McqdxyNbZQ5Q0g=": "384905000000", + "09_Wrw20rdkplEOjeuBPzK5eI-dgnEZkXrkzk0HwVY4=": "384594000000", + "09gm7IWcheLxKBxBQma6L7zYyf8Cg1odGj_2a4upXAM=": "1249999000000", + "0AHvALGZa89hciPOSekjBYlBYpReaLvQQTWQmDLmojs=": "416666000000", + "0APBEp2VDwYDPEElvf0rV7RgXz8pquVCnCRb1oF4pKU=": "467177000000", + "0AYElmtgjNCreOwUSHiKaPTVk90lkkau-fjqQiVwM38=": "3656053000000", + "0AaWw_J0hndvrHnoWJNpWRohrJjtvcQgkjoHwSgfNIc=": "456296000000", + "0AsxuMhSJWrFvDMLnTJyOqaEA3Ap-8xHrkaoGknzUw4=": "769230000000", + "0AwufJPFqVnl1KJwKPwRAJztpY3iB_O0CdC-i79JQYc=": "487145000000", + "0B-U847DO619nKAOrFjSyfC24u3SzPqyVQODFQIoBUA=": "1621217000000", + "0BNA2Cd22JXU4I_W33Sys-xK-GkxAzpkgBQGnZ6cYgQ=": "458501000000", + "0BYYWztlE7NgqYKZDEB9GoC5s44AKsu7QuifulxzwKA=": "381770000000", + "0BanZ9WGB9LUVtCDf4n2wveRHDv1s1yX0syMUdhzK8w=": "1921754000000", + "0Bde_I6cLPnRYkUiCZ6YrQTsSVVJvTIty-2fjRhipus=": "694535000000", + "0C9fvkZOu8bedPGi1vKrssngfdn-Lun0Zvr93xqFBWg=": "462839000000", + "0CBiYsBDHLCFfyQK-rlOKeTnm2iZruFGbWlmrcKffEk=": "459880000000", + "0CTMyAhe_tmsjOTFTM3kTzgIMPA-NCTzOYHBzBF8Xqo=": "4179451000000", + "0CWdFOYhvbUlKAKiZvSvGbvwZffY0LaUfi595RIqBhs=": "378486000000", + "0DAUiGsXdKipliyE-IvTiDbXgm3VNw5Gv7_cBT1cBbY=": "469121000000", + "0DliC5RWCLriXuczIarJDroe4P-ElcCxAJo0bkCBtpE=": "385507000000", + "0DqQiFOqWSWK5ezRRUlQa4qg6j9yys-G_YDjrzi-1HQ=": "1259935000000", + "0EO_YwqgU535S5iA9i7eESjrIyN6Q67PnTAo5Cy1pco=": "386511000000", + "0EjWdftD0ogRlfCMhe_TDUNkPNinkh_okOiVDOtPTYs=": "1154829000000", + "0EmSaEp5OP1LlXjKRjViFmk1X-5bN7zr3nVhR49FDvg=": "411085000000", + "0EnpZcbnL5IxOs-XPqAui9_yrjgBWRsQj-Xi6gxXeoY=": "1145409000000", + "0F8V7mzs7XjERKmMHy1JVLzScWA0eOpRI7cKCxVU7Zs=": "382394000000", + "0FAA_lXNzGYxCogwxgAyEiB7TTKAhH6LZqoR9WdC5NY=": "419159000000", + "0FDbLTI1dH429axu0CYoM7TQg37C0gTj0MBol6qz0V8=": "386029000000", + "0Fruyrcb3wadSLziEC9G6W8PgdP3PfixzWFv2z8Tmgs=": "3643417000000", + "0GUopHpt6YzKFWKd0UvAF1J2J80m0LgBBDtjF3ASXyQ=": "2579427000000", + "0GYg7qMXXeEAoyhnekOCKcCQ7oc7QvIzs7T81PievBo=": "714413000000", + "0H3GXeR9x79TIrQOqHLWPhQCQuTbbeoqMSuHiVYYXxQ=": "384422000000", + "0H3ue0eZ10D9OjwdzGg2xGkTPBQ0uyOs57tmPmjE_D4=": "390141000000", + "0HAhKCafvtdjUr3tvVMo0xrSCCeW04y4tuB3UaZSSbs=": "3749999000000", + "0HUJDbGT0MD82sUFo8dTvEFzpseeBzG1x7z1COJIl0E=": "4999999000000", + "0HWEkOFVufWQ42e8mHLdbiDOhqp9OFl36YDnwLZM-6M=": "631538000000", + "0H_p4tIT5SZW1W6LIiy3Ii9H2eXWL11F_PyyApMWKk0=": "417451000000", + "0HbX0cqnXZPpgUqLjMa9bNRzoYSr4h-3P83gHHsC1oY=": "465482000000", + "0HdQ-n1CtkaZGu4e9Mk6-LX5GOBJjba4ZXFZWFAI1Uw=": "763848000000", + "0Higj7bI7MHm6oRjobKOT7noUJOrHa_cq7pP2xBwVWc=": "462146000000", + "0Hq8XvslWtyohPNPIH7QVJc1UTWleJXSUEMxn3mwtVM=": "834069000000", + "0I-CdW6g6DsfkTzLWtcNQHd8wamhZF-UrwG6eFcZ3PY=": "421824000000", + "0I-aMkwIre5bN0ksV1sJXY4Mu7u7jn4RFuZDfBN82yA=": "382394000000", + "0I1mkl-w004G2N8uEa_CWQnH-TosX7cYoUgyM5A7784=": "3716937000000", + "0JBTB5MZahRad3Bj-6oMpzKx2qeQel72RmWe0zVrnBA=": "487972000000", + "0JBq55yVgEgXbP0byt53CLmzcvpI1Z4LIzlQ_N4vCaY=": "1999999000000", + "0JQ76gKHdh6tFGGLJ9awEOpfBpVf_5zX_rCFAb3_uhI=": "378319000000", + "0JpAqR3oGNaoyajWxSanEYZhSr5BJAtkHQBHiMRP4j4=": "382479000000", + "0KFTbVhx3AVHu9mNJ11BuCXdrH3khJryN0vWPc94rLU=": "2871493000000", + "0KTP1QNqnZzzYbU8CPQB7qycynHIDXhaq7r0GVf8ka8=": "390808000000", + "0KVd4Vb_0nMUn2_ya1fQoX38_XaPV2G_Uc_llz-P74g=": "386496000000", + "0KcKP7flbmra5lFmqy538CERc49LEflFvSwvHle0v-s=": "836695000000", + "0LHwtNio_-zL0WJxjsdD0xJnBNAxMzTZZ4Pu1JKR7cw=": "778513000000", + "0LOf_HTaYCZWL_CyBNs32xA-Vi0dgJSHGv70HeWvZB8=": "383695000000", + "0LaZH489KCS-c6szIZEmIcpbUB_-yhIaLPXNCaEdIik=": "768421000000", + "0Lgf_56wtmNv1oWfAc0aZIkrkEVTR7hII6GfiW5FU4U=": "1795352000000", + "0LvgXoUdIXaFOIcCV7eqkrCEfg7EZS8NooHtOnusW6Q=": "413725000000", + "0LxzdwAQAuTYI9hg-k-UNdP5_SSXRnA4kNSfi92MdvU=": "406295000000", + "0MAmGwJVXxcnmiTLPmmN_dPSHj0kvacq2NlKodWz74A=": "1095456000000", + "0MIXaCfXoEgj143A3k5hz2BWFWQLDPRniD2k2WKVS1w=": "388941000000", + "0M_vySTXbO8LqMH0hI3UsXDuSmUcq0XgeJj_HX4s7sg=": "1124351000000", + "0Mn3KUvmPIAO_qHl6E07gPTaumyNaVec4weQJ0cvj1s=": "473874000000", + "0N5vdu3iqxPz-Pk2YwZ_SfHQJpZqYclnIqmTdr2W0CA=": "557005000000", + "0NggPFZsuUBXNWbyEdJwwn3mkakWwZikZ79vW7lu25w=": "385507000000", + "0Nmh7iallOajEeWb8Ruv6Qmpj7qe0Whq5wj-LwGt1mQ=": "642211000000", + "0OR-6ArnwAPnwYPR__Y69TvZ5EVU4yyC4LA_5ECacG0=": "404418000000", + "0OR481eQv6VkzuHd4xKowFU1OA58exitA8INe38OB5k=": "1927598000000", + "0PC_WYhvklWjz4G2J4_d_bpJfzEqd2BlR5g4KbEnVUc=": "68681632000000", + "0PL_m7qZOoE7s9m6URLQc61DB8m7NzjY-afUr7Vwfqc=": "1218233000000", + "0PUvPPVSXjLC4Pf_x_E1TSV6rqkkXRY-tQcp1RWpUs0=": "2278000000000", + "0Pd0vJF_G32VJm6GehSlE5S57KYmYB1aiYMZDAXjtSg=": "1636022000000", + "0PlXTJEj5YNAWMb2T8MemFxUqJm9Uh99KxNJVmm9Tl0=": "576923000000", + "0PuWLu73F0d6EvJbTXs0cyjjqtLkJX8H5XNlXBdjlzU=": "461600000000", + "0Pxg7awkFscI1ipeZpATFsyjuReGtwz8UEyWpDpsCM0=": "988758000000", + "0Q1ZGpKDndRqJQfw1TMfWpFOpesYQYtwqxcrE3M-iPQ=": "416901000000", + "0QM-Q5Y5edJEGG2fiMAtBW8OsXL82ZEvloyBQZkJ9zc=": "2152907000000", + "0QRIhc7NUEA__VHbK-reFBDSfNJ6WjnPBXJK4LaBIEs=": "458341000000", + "0RFe-N0WX_DGHPtESWJ2clsRnW8oe1YdDrL5MoCVlAM=": "387400000000", + "0RrPSCkuTC1ZLlqPShcFoHYiJtULEkwZjUJvbwLM7OY=": "388559000000", + "0S8-LTKMIyzA6z-MqfelDTwxisdiBmWuNIT67os04Uo=": "384786000000", + "0SBNPphNq6DTrEIkfWNHo9UoZe_hZ79C_rPj7li0qWk=": "16603876000000", + "0SnPc0OILnmSrjgB6nkVjp6PUdhtdaB9Pam3Z7XbchQ=": "628365000000", + "0SoJM6NTjKTuY7p7cdVcqynxYCgiEojJIZWWPUPqgtM=": "769230000000", + "0StINytL0vTc64ti5nbd4CqTr72XOluG3NGweyBbYiM=": "2793076000000", + "0TQMAGow1KWTrvc-0-VnPKh5PybaYyMcwPh6oGikaDM=": "382114000000", + "0UAA_jSMIZN1YwXmhzPHP5_sMoWXIhdPWdwS9e1CdDA=": "1590450000000", + "0UOfAzusd8LxxJtnbQ8wqzgJhIvZXIomTYRUMqinQBg=": "1156515000000", + "0UlMqnM3z2pOnEseVtXxwrDdJYoHWhqqqQhhOnTKSgg=": "1020398000000", + "0UoQg8xS1tEBqZtvsafo4ZMK2eJEr08pknZ3ICBKSLU=": "1236380000000", + "0UsnWJDHZ8E_UCAEG_aH-2W76ofoWBAJTCEUfsMwXoA=": "1876373000000", + "0VINvweixYmx6nLWZ8bVSeRsMXiZeIiLQ2fc4UJOCXA=": "384615000000", + "0VIi8wtnlZgIe9YqxE8ax91nYG4NhyZsu95szX_9Jl0=": "6027988000000", + "0VKI1RAqUqrM1_cJmr75H7GWlmEaBBmgYEpEFBhS7A4=": "454318000000", + "0VSRGs-DlJWuKe6Z3ClsFYrXa_vxMGqMtRdyGL4cX_k=": "578111000000", + "0W1_87GKve4g8tblt4Cyst8k3YRqkP8lXRm5kzT9ZKQ=": "411085000000", + "0WAdBplqF9lUvUL2rCnzDH1eadWRLYTs4w3FmYoRxJ4=": "769230000000", + "0WBsGSD8wT1YY6mr9x2iLo_en1S0GoBSNqLTZ6pBqrU=": "7413340000000", + "0WFEHzX3d3B7W32thuDv3QpADQLHOUBJwFxWas-6Cx0=": "379770000000", + "0WKfQ1lPOtnxHcrCB83_3AP31cB0GMhfiAdqtK2Aelc=": "1370078000000", + "0WLl54c4lmO4Nv9HGcsMReTuGgu_qEFt2USLT0tntSs=": "1153846000000", + "0XORaxVkle4SF6lMatCcl5TssFijAqhcGxA5Zzuvdrk=": "833333000000", + "0YiCioCz99N5Q9adqTlSjoaG1E94hBgw3G2w20OUOE8=": "384615000000", + "0Z6mxXb45QYI4gHAwEaAd9NB5F1G8F7cX3Kn2ai-_qs=": "458632000000", + "0ZBysUo8D-ZZspGwOck5Osa9bZrref3rx94_8GjZmKY=": "411085000000", + "0_M-xZso32Or_dVwa68IB8sMNf3Zg4P2dGAr_Kirw38=": "769209000000", + "0_UPEXVmDoaV1yS2PZca9mxzsUOxIXS3yLfxypgUGAc=": "384615000000", + "0_lKQsi2TZUi4aqNryKEx77ufXfAKJ0K3g615WNw2SM=": "385445000000", + "0_o5SxHqthY6oB-eLjJ_cvdplLCbP50dw30QODVTCcQ=": "769230000000", + "0a6BTaOFaWLHlZXXAGTbeZaDpmG4_gkOawSnGJeAfvs=": "384348000000", + "0aB-CbxvfPKHNOrB5hRV86_t7lDMKWw-5qURG5wGf1Y=": "385505000000", + "0aI9DPgs_Rx6AUL1aoxPxMZcbf671AlenKD_H94vjqM=": "640326000000", + "0b7jaIPKPhM9P2wib5UCrjvjstqUJ0X9a3bb610hjw4=": "385505000000", + "0bA8SIX-NwyZdk3TOqjEEE4zMMZjjoErh5b8H9ggIIw=": "1849333000000", + "0bgpjlpPQtQdxJ8iT4cdp96zCA8rtOzjcQ0wphpe3a4=": "384615000000", + "0bvL8BhNHTczPwWy8a7SrUGYkV2ETJ5OTRI49Q35uMM=": "645652000000", + "0c3o6huH4gnXm23X74e3EFAF8ger9O842Bz1LzS1cQU=": "470031000000", + "0c6rk27QrojR0YSmSbVJNsyLoeg2E4YppcykozTZpW0=": "421993000000", + "0c81zbM_Own5BMK8ahXZNrjCmgXTF8k_tBDwEfOsx8w=": "4595379000000", + "0cAZzmtB2CUjlsMULb30YcBrocvK7VhQjUk--MyY2_Q=": "8333333000000", + "0cL2j_yGsDubwZUq4qZsW6Fvr0bQm91B7YjLYsOujdI=": "470557000000", + "0cr307qvQE23b3mAWw3qOtJRouMgAdPnCHtB2xY_FRA=": "652751000000", + "0cudu8jn8GbKhBg0Zxak7-PJSbQS92kWYk7zmqcMNj8=": "577713000000", + "0d_asT_KaAXb7xHia9YqnBfmZ2TIUJFZIKIVtyxhh7s=": "1249999000000", + "0eDURz5R-t_eHKZChVH7hoBRakrGPJwBKLOQezaSZSs=": "455600000000", + "0eLQJ5-0VzG9OGU1W4KsWFWtTWcXPpFs0XLhjMi8dok=": "1315762000000", + "0f5qrJkrW3aCLCHgI9zDl4-GoHFKNQbTi8Ey6XfgRE8=": "384615000000", + "0fDoD_3WUJzdTF2WQFRVIGnxq3PseVaE88CBM6MLl-0=": "462146000000", + "0fRP9GhzfCHD5ca5OslTsoG__qqTOj2tF2_f8zM6sgQ=": "3081242000000", + "0fwyiOqkGiOmahBfmxU8Ol9m-fyYY2U7D8kwj7Kngpk=": "2112809000000", + "0g1pRSNEI46J-jmV1INRQgtzXDjWzL3YE2xatfMzFxk=": "914046000000", + "0gAWBv8pC32xRQsSeCKt6Mr_YhwNbiGkwR9yt7fZfJA=": "2196466000000", + "0gJKlycxzR2Yu1clCVNIrCguoozSUw7ra2c7bPHb8XY=": "2066574000000", + "0gNUk-i5MjBc11WytXzYTto7iCmiCxC5LtMVVpAlPGQ=": "384615000000", + "0gRT0p7AFgYe27ccJil8bF32JTsuiJrAg6B9hL75RNw=": "770237000000", + "0hBnnd1CtdtGXnY_mzWIBkkdFGfcXiWPGitUZyeA8Yw=": "521367000000", + "0hJA7cm-0-GcN8P4Jnqsko30HlmHnY5dGCUatDP-upM=": "4088167000000", + "0hMoZSTpaQiFuvB3lxZX217WtrjkW1ZUzMZt11-AXTU=": "2276242000000", + "0hUFqsOMyNdpj4amOMHFipILudZV1NnjU2G1E3UailM=": "1892805000000", + "0hkiJFVyCTF02_neyMpmbjPlRY-TrKkSY_w02VCyNrE=": "462839000000", + "0hvE3yy6htxDZqtOvtP8O66D2mE-pXNbRLFaSmrB9lE=": "444868000000", + "0iRum94vhz-PgylO0u9uY_KbPx_iiX_N3DXKQjB-9P0=": "464042000000", + "0iUotZq614FRRI-6y5eV2maLBY1CQLpJ9jhOzqrbQjA=": "833333000000", + "0iu0dm-jlNDehIongh4GxSqpLvhKvW9M06wtM2Xd6Zk=": "462146000000", + "0jfTvJ0TUSeeRXzg3YlGtEyIl8s19nQOelpLV9aYzCw=": "1818164000000", + "0k34eEfGFM6SXz_8qA7IP6WZNHNao48m-GVsmaePDFs=": "769776000000", + "0kGlMelWQvwP-JFWKWscUyD20JKF1vQDsA-nb0L58yk=": "544708000000", + "0kg8PY-Fa4_4HoTEjQErtxni_4FcfXk1XDl1lBgGdh0=": "3850930000000", + "0kufDsJZoqEQTFfrPngbTiHnU-DY48-FYbXLmGtemjo=": "3269230000000", + "0mK58JAh3wr_MaFT9sFffD9KP0ANsgipuX9QoE90_Bs=": "7735398000000", + "0mXO7JQNOjGx7XCJyzauY7gsGdCnX6POwetuCg9m-pg=": "528258000000", + "0ml_9xRUERGsPZK9bqSrjZCPPxkvPiIzeQ-2qVubhXs=": "3021153000000", + "0myZsW8Wqmd-F_p6S5PeskFye6mRDtcXBH_zGOjMITY=": "3176464000000", + "0nJiv60iDOnUclRNvcaqx6pry69aXmVWr2zNAyFEuVU=": "423710000000", + "0oVIhQ2v-FtomutKuoLk0WHXI0m_oRxMFE9_u1lvU-I=": "3850523000000", + "0ojzceHCKFxsT7wVpqxnCZsx4ZNpIRDSu-qEhV7haAY=": "405846000000", + "0pWewcOILN6Os0P2v51UxmMkns5DlrvPf_1Jhw63R9g=": "38550673000000", + "0q54N-gIm-RA135pQ690vB_eV7w-IUH4yeOgsCn-qH4=": "385219000000", + "0q7KRdsPaNd5k76ArnDCLuh8BC7nXzhX9a4ovwOpIGw=": "769230000000", + "0qAQqUqoRYCDsM8XHlcoKhcTgYR33ZtDEHnryJrHu44=": "1338809000000", + "0qP5LYQyyWCGdTKrxD1LuYO1rhiRNd-8Ku4gpNo9clA=": "411085000000", + "0qjDZijSZ9SatqkSOJQoWqaDMGj8j0HVo6B987L3ejc=": "395728000000", + "0r2w9FDssoutoYxkO8TFBRyoXSOBQA4MdUC8xTB_oWI=": "385061000000", + "0rujLGccCG-v2Z3WOUNg0gmNtEa3LEyOsqq7fgZp3WI=": "458399000000", + "0s6EwNy_nI5lN3NUoR2fsd2CM3O1TNISUhO6-AvnaKo=": "1145301000000", + "0sDwYOyiMSJd5_ww8AgzPDzdEPrp4ed5Q25bWSXzK-s=": "473148000000", + "0sFflxVsZmlc38XABoev2gsm9upzATPeawjfDByT2qY=": "1240088000000", + "0t-7Xl7Pmh9y9BkXJyEkD7MajcVSijrg_3pdxznHMtw=": "1666666000000", + "0tKWl0yjiD5c4G4mVkYhxDOntXCix8oCLaorZPZLDoE=": "1786027000000", + "0tUSAcRzjRINgUISjVX6cqSokYu_dMjyLACcSM0zisM=": "1889005000000", + "0tdVof4Cm7FF7B-b_THCTIB920tXajRaXWTg_LjgNzI=": "452405000000", + "0u7joemr-g0xGr98YAKQU4tH9DveseWOfQaAUVeRZWE=": "970578000000", + "0uBiDSwfVWoctoRXhwbCyn4KWdE_8AGfWGs2OwVnbTM=": "383517000000", + "0uXEW45PZqlH0s2Jxb3M1KaZ2yUeAOLq4Dia29JytXk=": "4545454000000", + "0uatR8FrvsnMs4Eiq2w2iM13FWFDrayUNFvXv9tGaWQ=": "2353655000000", + "0utn4MzdzEq0ThycQHb9UV5Eosp-BT427mWf0rg4B8k=": "416689000000", + "0vTYId8BqHNlgpbCHqKMhBmTjNXxQSNUBVVbHZasmxU=": "500000000000", + "0vVhMiampe9Xpgw-xO9_zZCnITBSG037lm-tBfgfNeM=": "416666000000", + "0vv0v-NUlw37aAbHAd6hUDzpr4edKvmAuWKcHgduGgw=": "384847000000", + "0vxyS5JB_5edX8wfysiaY1X0azvQmu7HN7nvX1evoYE=": "387031000000", + "0w2MYLXCHEUmTbLdWp11hzMdizES39nHG-MZ8Z858jg=": "425632000000", + "0wLyaJAC-pDfjErrFYZu1gRjEdRoGGfamJCYt-BlSz4=": "385500000000", + "0wUE-6WFXZT_phOR8fK0cEDwRweskhfwfbqrnw6r_Eg=": "418059000000", + "0wgO9TOgQ8A-BentPxRI3FcBooYt31wAZvXE3ilJUd8=": "344781000000", + "0x3zzBdi0_JmOzE_-xMPoOE8bUFpl2-q4ttZ-wAjzMQ=": "1794474000000", + "0x52SY5jXWW1JJDPO1SRFIDTusHu13Mbp3j4sPAqU4M=": "1306211000000", + "0x66X4eBKwgYA5fKOcF9N1UG2wRAvsIr_tLADwKuwXY=": "415889000000", + "0xAS5J0ML_qcllppgjFN3Ah982iW1iNYSGCKbELv3PY=": "379845000000", + "0xMetOHwz30XrCwgaeyyKqBeSTyPZnsTotHeFnFlDlQ=": "2260814000000", + "0xWrc1a8GmC_-qpLAYLcWd07bas2l56ObVgzjNU71bI=": "776976000000", + "0xbcWySw1bJcij16R89ZsJ2Tnd1lHb33VXDRSe8gNp0=": "2099037000000", + "0xitiIWO-0cDVckTd108T5bBqI4E-J8kmGjOZHW2WS8=": "3938593000000", + "0y3mg8cHzj47DgXz55xRzuZd_I27iTmjoC9XWt8284g=": "811804000000", + "0y5faSKyKPz3GmwpNozQu5PT9-aApAohdDA4Z0551pk=": "918467000000", + "0yfGblyy-PMfv8tZkLkC_CkOU3Q6P4dMhokulqM2s0E=": "768219000000", + "0z49RfGCmCmieWe2XuTbM8gns20F536xKJuipYLZkGQ=": "456256000000", + "0zmnuHP6BnLlcO0_2I2yIY7QiJ3iAmPj5e6YnY3mg60=": "4594199000000", + "1-DY5ig4kF8l1iXJpadawi9Dj5zAW-UKFYRxnZwh-rk=": "454356000000", + "102rj_hZAgn1yHRMr3R5t2IF5dhMRp2gUR7g6DpaZGQ=": "385406000000", + "10_ZmqdKdUWIsfuZkB3-8oXYVZeupv-TuIOZhlLFpUw=": "500517000000", + "10tsX8gjVy5nNNBXpZcKH6Fr08JS7s2JOnGziznWMkg=": "426267000000", + "111yZH8uC4iP9c26UTon5rnoIcuSpjPooPdw9-WqRCc=": "704912000000", + "11U8FuibSLohNs3V6Mu4qNU88KHUB2EAghX2mgIPsmI=": "382544000000", + "11lEO4W-Z7G6Koi6fjIP3r-_TG8eGN42EpFDauOrGNI=": "1156517000000", + "11ykICxoLgGz5PaF2SGZxB9Cm88hez_X4bz_t0S4EfA=": "411085000000", + "12569ZCMConMS_VM3jUkXgfoYXatIP947H5sYmNY4XA=": "449655000000", + "12JZbjmpLVUnuKSxQH9VXS0UKlCt0cbXq53JipGS4oM=": "422196000000", + "12lEdQzCt0K5t4uCHN4Y9KLRh9UI1g3agPQuObMF1B4=": "417630000000", + "12ysBQ1D-3EP7O4O-6VcEcXmz99S0on8iPldOSAd7m8=": "2310726000000", + "13-uQJH5hVgyCXd6nLhcAIYSQ2TZnfJ8oYKTSD9Odwk=": "385506000000", + "13Db4A6tiRTUpF-V0VPlwLVZ3YFItl1yrpjAq-Q-PEw=": "384615000000", + "13L3bfmmLGyXK1w2kOcHtYkyaWnvXwweddX6jiJ2pw0=": "418050000000", + "13QaaTsMRXT6WyGzgEBHffA12YSZ5O8xv9Rh0q-fN3E=": "476399000000", + "13WiImCdBTD-9_JmGf8zuL_phUsm3EcFGGEbsqyP8zY=": "381805000000", + "13Z-9nI-mEWT4DCd130WVYZGTk8tLZiVUZO7J5rw7QE=": "18172524000000", + "140o1lWdbNSMTcBWckb7muLIHtbCrKeEKXSSr8umHoE=": "454397000000", + "14YY-aMC_VhMOMM7GAHXcmvSdqqcEvLJsUh4HkZK250=": "417630000000", + "14rjfqjLzeLpnu8GcwSkLQ-Tn7v356YOeqviUuLm4vs=": "933611000000", + "150XceyaXx3jCjocuXL1-Ln1kn1B2Q-Dfpbw-2klouA=": "7692307000000", + "157nXUyhYTcaqX3tnFBlyY0jlGIeHRDQSi-AfpmOhxg=": "998955000000", + "15OC5rco51wBNk9xsJ6IUqU5UdIfq5ZgaMc9lz14H7I=": "423370000000", + "15T9o8-cnk_ocrkS2upCwPRLqn8Tl4iyb1F9Se0AMEQ=": "833333000000", + "15XcnWBOo817xn-yH_JzWhLpuy6tTyLcTm7dEOvJrek=": "580130000000", + "15kWBZuyC3J1F0-kSAfXrNPyw1S0FiKlxuSjwVWsA4I=": "769230000000", + "15vJORlkCrEygB-vDX3vSq2EW9mph1sUf842QyD8ChM=": "38550619000000", + "165SWSOexpB7OUR06m6EKOplwg4fLVCYgeTKhek0IsA=": "444184000000", + "16AbeNsAI2xN79yqoCoo-NHZ5_d6YJvdMDOOyh4rccs=": "1018466000000", + "16PCFdbIAmwpnIKND-u8jLMMuVkWTFfY92lxqNbMm44=": "833802000000", + "16vH3HDlsR5dE_9tqKLhMpQDmJzCVadLCysgdcWFhZU=": "2320523000000", + "173AOamiMAYZbIbfKcfiK_yXTHNSJ0Ww_-KuGt71Tbc=": "457253000000", + "173grx7dvpxYWgn3RV1hsYDYjrKU5AxjPn6-t14nkc0=": "456195000000", + "17RjIG4zgNUQbcjzKvMVdSWEZ90xn5hxatiz8j7rwlI=": "4196402000000", + "17XOHgv66oHFPXLPbpVmxZ8ZNWpiJpw0zcfGVkdR8cU=": "1207892000000", + "17mcBhwJVpBAgbXQsTN63uLNmFYJ_CKOyG0OvqUv_JQ=": "381520000000", + "17ozuRLdxABg79DxOgCPGwHfPBhQF_6nC7wlz_7htOI=": "4032905000000", + "18TK6KDdEpONRw1Y-fVKshz1hjIVdyqJ8ZYz8raXmPQ=": "847338000000", + "19OJzpIICxxqfHtAVolg_w6-uOQTvBr8kXkAs73hPOg=": "384426000000", + "19P0ndqUAbWO_hOv1czmlEI1lxlksmU642JbUD-c-zA=": "416674000000", + "19WuSS3RFH1qPMxuy2-dETWTCAfHu70uF7aj_LcuVJs=": "380347000000", + "19gIIVIJ7LOj9PGjnMtPaultX9ygR0wlHAwt6xdNSCg=": "3749807000000", + "1A3y0AFWW4PYCWLMVW2nWALo6qXU5QNH2OhZj6IW2gM=": "470730000000", + "1A94o6KzPKoto2MCvDMYaWjC7HLwadNZCLkhD3D3NDs=": "3346153000000", + "1A9uozQSYS_NgEVj4r9pqxJxNv5coIwa8iopgT7-TIc=": "832782000000", + "1ACGEzApcQdNtY3TDqA9dek40E31rsc1yJf3taeN4ok=": "3697374000000", + "1AFJ08Ebp4P53uQaAYvP1Uewo1eW1RGw7J6bdWprXFI=": "1923622000000", + "1B4DBO-laG8GETgkvVvf5rSu6kX-LUZnULGDEQZyU4o=": "423669000000", + "1BDi9t0JnHXCuGuvNfKbXWiO0kEb5tfcXaRNJeZcX1k=": "384615000000", + "1BPExDeOXlHJFs42umoh6VTiwWV9Jwb4iLn3pfCjEOU=": "769230000000", + "1Bzh_GGHaYrm7ux-NnhAKCWpv3j6q5QsSq1a2GjfPjI=": "415384000000", + "1CU6hawwd-4Il4dYKqK3Tp93fhdQ8wJq89G3kB23lc0=": "421367000000", + "1CqR53fUXMMvn-FzIYsOlFNcnO9I4dx0aRRVDOZp41s=": "454527000000", + "1D8suFrTIB0LlvfwtTjNWsVXnlXuYPS5g4pQkW5Q5yc=": "416666000000", + "1DZpSzhAZS4hYAeHCdsP8ti9dlk6KZy9dUv-Y_onsAA=": "376972000000", + "1E-MOqny5opknoygpxbh4_gJGugdEgrFb74d62dIk7U=": "3842547000000", + "1E3f1ISsTA3G63WbNPnq1RZr5ybD3keFLlqKXL43PMI=": "2039461000000", + "1E7vF5vUFL-lPfQWFEjkTWxgRrCWAm1-jSwYnFTEeMU=": "414907000000", + "1E9HJV3BuTQingfu9E--7z1h8E5xtHyNjpmDmmAtCTM=": "1045454000000", + "1EnSCJVs2uU8sdp6b3h5g35ikXRNmpTg2_zcqqlbyH0=": "1896724000000", + "1Eq-LDYs58ANWNhMd3OrDpph9lYrXlzoOaVLiF_4_O0=": "2324977000000", + "1EsXtR3yov9uM32Fnqgggpk9PAhdIyvYwNhreOPU8DU=": "769230000000", + "1F7-ka7WerZktwLYEVyN7P9x4jev0mzp6dogqSlm_5U=": "1229039000000", + "1FUPHXG7uTml1ZnrI-NJr0kSgbvMsOR6xhCfEGq74qY=": "15390259000000", + "1F_dLK1yyeGFzL34pnYbk_W4mnGjKFu6d7W26DmdUQo=": "893556000000", + "1FbBC_99c1zMx28szyk7uYBuGBdWJqCdCrxkDw7wn8E=": "382479000000", + "1GE2E_jVSaQI6fw59-X7heAW3eVkw3q_LwOtucCrmUQ=": "384615000000", + "1GVl_PR4dAZ1Gr8skD0xc9aRVu3tzLAHIfuSZmMnJzw=": "6002535000000", + "1GXdpuxvqXVZCacYnkq-oOR7q3pTlF2sXcX-UJ0dItc=": "1226468000000", + "1G_l0MCzGwDC-B5Z5YtVuFJ8_8PNEV_4TljlpFaqjoc=": "390384000000", + "1GadH4_mkfJV2FtW5sS38Ps1Z-yvtrCd8IyFykZIaM8=": "462839000000", + "1GhfBuUI3rRq_c47OsAu9gL5DAeg9gev5qP2XOMlhKM=": "385118000000", + "1GlKUamfO64pR_nWd2CJMY6NjJVjeQPbtX5cODlup7E=": "3076923000000", + "1Gm09kAVbmewfRvragwaXEh9LjPlm2Cz5O6GQAilXEc=": "385506000000", + "1Gq9kWYlKC3WNeqT44GJ9HavsVbSGo9eJIH4v-gHPzc=": "455600000000", + "1Gs7rHFw99pGK7zKxIc0lvzXiX19E-fTN8LzZ8R2xf8=": "459449000000", + "1GvIgtbLHJupYMl4GO5YWzgL6XGq8LgV0dNnK_ivHDo=": "10416666000000", + "1H9vd9fK1OayCL31qe56u_Vf7Y0fhjac5WVwA7wgBk8=": "384615000000", + "1HcDmUBBf7kBXP_48BH0G9fk8mY1CHuGXrq602YK_vs=": "1225445000000", + "1Hemc1_cWRGMvaPvAaBlmLiho9bFp8knlCPUwkatGmc=": "2943730000000", + "1Hqmg4IMKUcZnuIMZETSLsGxsFKkU8PTH7B132fh0BE=": "391593000000", + "1I1qTRB1TFx-hUssB0mTxTNQKQwVv9S0V-pNzvIrb-Y=": "378879000000", + "1IXPVn3aYKg3uLhyGhTqgYFNDDWN6iUNHjCP1DXSRcY=": "412884000000", + "1IXXFEVWPrEYzOeGPnw67e-sIOn5OU76nbPGhbr-FEU=": "382394000000", + "1IeCa4omziguNeuTBXlrK9LwrK4nredJgZlUzmq76tU=": "16077180000000", + "1IksiK_iZRfoInDfOSalZMI4bzzyeITMOQXJr7B61AU=": "823294000000", + "1IqKr4jCoTyuzyZD0yAAk-Nm18HUV_AMmI38yC1ZoAM=": "416595000000", + "1IrKAPVJuwG_9NvIOAnI0FEa07yI8xjgFpLY1tJ0_SQ=": "468961000000", + "1IuvRRcAq4rrqiHCxUPNYpZvGCyJVvNeL2M48Q-QIqU=": "385596000000", + "1JBoNJSBIzzNO-RGuUffWhs8AiulUHliDUE6yKhfPLo=": "453978000000", + "1JWtjzK6kIusnr3_K3AEkjWslpt9HpufzdwgG8bsWYA=": "384615000000", + "1JcbOSz3rFH3LU8O7_kGG5ACTxGTmqKEo2tlbYgBLRU=": "423370000000", + "1JsLQaDSmE1Ja6gctPkxRLGN6x4hDj8RP9EfSuuyIic=": "384615000000", + "1KhdPVbEyq4LjEZsgWD_ykJl_b11FqxK73eLJPfjhGg=": "1411170000000", + "1KpKBL3hLvnldyvRV2zRs2KpE6VVmNW0Jy-69o42UWw=": "386590000000", + "1KytNGVAC6H8S7ubKa_wODyH3vLBRC6cjtYy93QaLis=": "411085000000", + "1L1PLJ4lmyLcLrYpGGkxIb15vR5ibF43uQ7cQtMZxIw=": "453900000000", + "1L6XguY0sXMGH52oi4nJC05YP9p1ZdggmYW_nJEgi-E=": "391797000000", + "1LEv0IHJ5EYEnQTaGsGwMWDFO0UmiR8wLjrNEkZuPEQ=": "449746000000", + "1LeT5Rqco7-0fwPiUcs-UbeuIX2pAqihYD1udKANQXc=": "447942000000", + "1M0CPyjJMWMNrqFQ-RTp4KZw60u8sIQlq4GinZSCgYc=": "385258000000", + "1M1MUTGdVcFhOr5Ph7gGGI38j9IG8XiQACUEKCu1tcA=": "383621000000", + "1M2PnmnTNop7k1woMV4RPtTLxIMSSbuPdVw1rZ7qi60=": "1263180000000", + "1M8LZMMSGlwspPg2yTnRBGJyq535D64CpWEYdXvhUqI=": "2278000000000", + "1MH-6GxV8DnFmMivt15Tl7rAPDE3YMwOg14MA_iX5ts=": "1854180000000", + "1MtebMg9lZk8yrz2jameKqYIUrncS5ZxrHd4GbCw69M=": "385507000000", + "1N400Hr6RshoObWNzSXitT2bqhrMSbHArgj6jLCij6s=": "3384615000000", + "1NCWQRtnSPkOdPVT597FOXfC1m_oX2JrS4VqBQizuzI=": "554966000000", + "1NVDw6GEEnLGTPn271uE9gayiVhFTOaQEwPFt0js91w=": "769515000000", + "1NkWuhRc-m34InhtqroKOJ3Mji-SrSrhCQH48c1k6bY=": "3011269000000", + "1Nm7W25lH9fErHLVuj-vKSdHUNRCM5qqLIr_pAsbC8o=": "385681000000", + "1Nms6vw52bGanmlzsWT3B5DQfZDwcxW7OvOP6BAe8dM=": "814797000000", + "1P8S9Z9qXfWTzqdy8dVNISZJdXOKX5zb_FtTPWZY9Z4=": "391797000000", + "1Pi970mDm-w91n1gDFNXufqShRJV5KwSWlR1_Ype2bw=": "949302000000", + "1PrOTV3QVxv0RXSkPGZ6Y6GlKG6iJ4slTZWKcdklKyg=": "654571000000", + "1Qa50-odz1rqW0VbE9WCKvGwl__21a286IHk-aX1aDo=": "3106180000000", + "1QsbdbTxDdOgKfeej4-RbbzV3kgANizMHBt0Vx5Aee4=": "1551986000000", + "1R2V5reyITJZvCN_NV1BFSiu3lt-68-xbWHStoT82P8=": "1156517000000", + "1R5ySGmZ8c5A9POEyG6Ke_HX7pnFLW9C-BfTwcZOVGM=": "463193000000", + "1RQUR6Jmzd9BvC3EwMebrp3P0XeBkx_bDwCgo5mER14=": "2310948000000", + "1RdByu4anZLI2QMamKSrTISTfEXKJPiTw3uHEMWv-3M=": "384267000000", + "1ScIefI6L9aOnfl__HmpesTovjJ7NNZ-5TJvZ3lamjY=": "472079000000", + "1SdFcWBFElxC4yEX5F8cjBRpDyttYyyc2gEZ9WnSyrQ=": "4459818000000", + "1SfB_VOMm33P4vAccLc9u_MDS_6S3TmBC6GXpC4yJ9I=": "774024000000", + "1ShEXRSDybq4xR25w9jj0RY37Yvx68YPOFSFx6i2Ik4=": "384139000000", + "1SuGRRmrm7R_gQcnSl1QnaZvW7jkGT-fdqstyu-BQxg=": "2026785000000", + "1TaavOdapD0kSBhIT5J12PUArKDtvILG2FHhO3dizh8=": "940229000000", + "1TcULa2zCFuHdf-WEs2XBHCv0_Oxwl3bumVkFbxH4Sg=": "377767000000", + "1URORtHqR7xFprU4OQnf0C5WscdTim7xkG_cZjUaYXs=": "448053000000", + "1V7HcJSztYE0xZK81K3Q9S7lNN8YEcW81N3oYyo8UtE=": "384615000000", + "1VMXGwDI8uGBLXC2IjKCXRjQpdZ0RyG8KrgDjZvOxao=": "457166000000", + "1V_x3ZoJZcwMqLP0y2qu1pXsVZc_XflTqhQvthPCGtI=": "1142307000000", + "1WbFjcABRwe9AoY049fNmT_ETEzUiEezI_rIOnCj4Fo=": "395728000000", + "1Wc8EXhygRWcGf1Ra3sfEFIUblx7jw56sIs5hqq06fs=": "4105900000000", + "1WhyCRCKKqGNo99MAMndw5-3tQEypeu4-InrVHGJuBc=": "384615000000", + "1WnXu0hkkt4ciHK9s0NhwEuv3HC6FWsI_HX_alAOhrc=": "384615000000", + "1Wsta50am594NVSI86JV9uaC2KTxaPwUO136WvRbBrs=": "576544000000", + "1XCBopBKGcLjSsUaZYhquda1zVC2ZUidlOwHgOi9DBM=": "386038000000", + "1XUb8fhaP9GjMN3W-JC65xuG07mB0k0BXUD8BWcAfRU=": "644862000000", + "1XYAeroZEy5M3a5vVpxyBWe4nTdlGBSOoAPVnfRwSdQ=": "1560830000000", + "1XZ9qeGdTFpTD0jyt4CyRjRQaWHL9M5TnwuNT6_mOpM=": "920745000000", + "1XbqywXXrt641r7E-ebxtT1_EMGMwMyaT5l8DeDn-sQ=": "1002693000000", + "1XyIMXm-rWrN7kznUe_A-Zx23FY0HAzk3RE-UKjwDIA=": "386521000000", + "1Y4JHIgAC-33VBn9YFEW4v-TLGwW9XSosxycEL5YXmk=": "1841308000000", + "1YBIo0jTX_T-02ofGte8lATMjaD3c29r7glDxJz9QCQ=": "1914723000000", + "1YdKoDnc-_czIdMyGJCGKbG7CBvWjY9ycGlCkWyUl8o=": "946530000000", + "1YfzYkph3DefDXd63MhKBBN3INYuuHrbO0tpsTa3xCA=": "9795454000000", + "1ZQge4InDWpjyCk5TLTDok2ZY0ugzyCXRFY0us5Ti7s=": "383122000000", + "1ZRJ--kO-JHkWupuKQ1W4vuG9yDm3lCM_VKSaq3CVx4=": "381439000000", + "1ZVB8JiH_6Un5hS69qvM2uEfHjAU2yDJvPLtUm3vXgI=": "1825913000000", + "1ZzULRK51rk2yoMNR4st5FfDd59kPd_nUxE5ImdjWsI=": "388604000000", + "1_40dblcEXII6Ns74QpmcfYZ--n--LFGmGaRRg49b-8=": "905988000000", + "1_dLRwBBmRyXTa8v9qPV2owOmM7Y_DZSytpOItnBNQY=": "3909243000000", + "1aYALPY-c_TYDV_ss5ITss2aWUSwjWXgZocbaMMcjlY=": "3846153000000", + "1aqPKNWojZDwleox_zjDu_EQLC49SFAz8KHykSyyA3Y=": "384615000000", + "1auiR7A51lft5SuJTIuLG_xvOoc7FcDp8Vegf8fbIBA=": "384029000000", + "1bCWAAjGW7ZDH2ldYojcJ5pW4wKas9cD8BdTgEbj9Dw=": "471356000000", + "1bltGKEpZggH7ajkzqCDbGlCWF3eeybyxuSXenEUhp8=": "412353000000", + "1bxdV3NbCxr_P1fZginXVVTWZUIPYxf9OsvvDfN6J0o=": "1153846000000", + "1cVTd02A8ZT_XdENENSeEBqBDUQ5qQKDGRV8_f2cBm0=": "384615000000", + "1dQNQlX2xM-QtLmjQCRvxsP2iCr13OROSq7NURY9NUA=": "411085000000", + "1dSXN8m3LFaZTAFo_M_VxFlnkUePSMy764KaNYyCRWA=": "4970847000000", + "1dknO_o2A2HIch1N6RR5AEovYN4Q6cMX0RYhDuf4MiQ=": "2457488000000", + "1dpkDQ-O-lA4eDXZ7FsBww0-0PaMXuhykVbDWtSLzEw=": "384346000000", + "1eoP2t86ac5wZddVqSlDmWXyf2s2O7Oz9sBlCT0tRm8=": "1814415000000", + "1eofA2fezmhwuFLPGPUTELdpqnq-_WCUNRvh6w4gywE=": "389132000000", + "1f928K74Lb_HAB2JfUnCz1JDMYNQ-JV4iKAP0_c69_Q=": "2081255000000", + "1fKmR02U8YxnAGLs40voxAILDMHK-hxJhZG3WDrh5dI=": "770849000000", + "1g96a4JwpHClnMND-tP9m3R5oXKq-ZToclmYQAVsEls=": "387009000000", + "1ggEVGbtjmwZBoQIr36FHc_rKw80P_3MvK_lLarOkFs=": "393313000000", + "1h7Rg4dB4hPc1bnM43xWP0pc_d7qc7Jp2Zu0h8pVBbs=": "384615000000", + "1hCdBlZNU_ZsIA5wQCE3Bg4d3TmNGr5UiVoffYtSTy8=": "384615000000", + "1hdayabV8uooLHB3r8UJRSSIC4j8WBl_kJ_6CjrbWU0=": "994866000000", + "1i1fUVKgTViYW6kh5ieYXRCw-SeBQJEcehADuIZy61M=": "384108000000", + "1i2HfUBnEIfsSTfa_v2F7uTsSTT9D37VglEpXvyWa6s=": "1380711000000", + "1iH6WrmE-rDG1Spq3KikXTbWPqIn6_nVEy9VqZC-Kp4=": "703891000000", + "1ibtRUH6fg9YmRsmj-NnmuR0MN9ObDwjWKUhbrpp0VM=": "1153846000000", + "1ipcHwvSJ4FruF6sNdROnyzgvAmK70sAq16k4B39BK8=": "1154237000000", + "1ivEYVd_QOY6IkdsLTF99Bc3w5rvFxYBangcWsDkw18=": "3846154000000", + "1jKd5gRKG4lITZg7gQ_vIjwErwFkbm4PIT0x344jYPQ=": "481940000000", + "1jUU9NullcYeZG3VzZgwL25LrubMO0NguzD0hcXMYiE=": "384615000000", + "1jgZptujRWN4fq3g4DIiVKdjme4GR6p3Ub8YqB6yqJ8=": "452076000000", + "1jo2MwqdLpDDp7WjXkxVxhrvorBSa_7G89clxckKcxU=": "564372000000", + "1jq1CZIhgC4jPf2U9d2aXr9oUt0sAyTBM-OTkfC8sys=": "395497000000", + "1l0XYNadeTHsQWO3PgCpQLvWXmcNm0JxWE8qgQrcYBg=": "385510000000", + "1l0gNl6DZBIDTGY4xAKXU4orgVz72tAdyK5CzVslgkk=": "385507000000", + "1lgS6Ks2nYrVr_STatn_lfrK-JM9ZoPthQKikH4eMO0=": "396485000000", + "1m0sMI5DTRYL0KdjeVIs-_NGHCMvNQ_qvapvdSqIUlY=": "456954000000", + "1m2OmubJJRbX7CmsXcX3dgEQnLX-1C2Z9aKYvck66nE=": "770278000000", + "1mmKnrbNj_ZMLh3ztyeSTOZszPEMTc1PO7OroRqZJ9M=": "963931000000", + "1n2KWdmdgIu-eAgeTdH4DCrapsrvEFwDLRZeleNy5uY=": "3846153000000", + "1n87vR2lo0gw0BhfNqGYo4sDbgfNi2_EWkb93xNkwkw=": "455600000000", + "1n9AV7EYoIJw0uCUCAbDadSed5I4lRP3Xxu1LNe_l2g=": "381767000000", + "1nDannpxfySJUxsFpqLwpblZlu3xCVhUBVQXV8VjBJQ=": "384078000000", + "1nPJHNNuOKCJsaseO53SbGJ0J6FwuQo8_stKeAg63iY=": "486218000000", + "1nQN154p5exgNcc7Myjqz1cR8v7j8-trYRcVFRM5A1Y=": "1874440000000", + "1nUPWQzKQXgRQPiyLmx5rqMGecALeSA0DjqZwHc2_Ps=": "549800000000", + "1ngRp_0vTuADGeW8n7EhabtFJJPijT2hjI8VL8kXzGA=": "452875000000", + "1nwokYh6vtvzuiqH6dYGqskNBZYeip5llpD9eko8J5k=": "1223425000000", + "1o2UvXRrCIX1prsws9h2tr6LBJyiLKoXEODOzsdu1iw=": "454545000000", + "1oX7qKLXPQW-kC1FY1upGS2DdTsD3tLSMr-k7K8j9rQ=": "384615000000", + "1oZzJPiaMPpKiwlK7Rd4QK78NAb9VVWywz1oExBLuLA=": "4520394000000", + "1ooXN4TKKWEpPgY15PID0DlHcjgGf5zGWdQ6sEdqxsg=": "5959200000000", + "1pL5DFDhvW-j-2elJrHlr8V-91c_XoxPbkZcxRtL9sI=": "393313000000", + "1pLHkLCo4Z84ZSyHYefIfFdkLM7O1A1hQYaGeqJCUDA=": "396485000000", + "1pZOEbZoA0BZkrMV-G-SjbgsItCihSN14YUX-9KS5sA=": "377648000000", + "1phyIbYY3ztNqk060uC6eqVNkmPmm-DL0IyMbEmXc1s=": "1154647000000", + "1puG0REbNgLTPelpOn1zMPR8bDvKvqDnrEXaSJGU3qE=": "582396000000", + "1q-PHztf-PQ_B9Mmz1BQRKoho282ccPPCONXjdHlbQs=": "384615000000", + "1q4IofOeiFDNG6wuUcgXVntp3jN06w6xnkPj8mLafT0=": "384615000000", + "1qDPJfwZyZ4P-5flUfnc29eQfHGR3qpBEmipvTUHSoQ=": "398415000000", + "1qrTuHX3bcBtNH7buMiXkKGOeWNS2rSVcIhup-6NGFM=": "1153846000000", + "1rTbs579V-8QmLRPJEMejwXusSM-nefF_9Lo5AA85GY=": "1879350000000", + "1rnAavKeKb1GJzV9riasRmV4WnN-aIkAWl23EpMgLIs=": "384535000000", + "1rqsOlMgSZD2PQMg9IuTJsAmeWO0nbJ9LFpO0Od-Rr8=": "382530000000", + "1rsBw82UWT0rjSr5aNxDTAohDQgyzJxAdqZu6lHBrsI=": "1819166000000", + "1sD9Bq4GyZUKEvwx1UAYwo27zfdE3MkK3x0okV9BkvI=": "384615000000", + "1sYxZrxnG5vQH-KQdxdGlkcx2OQInYNCyd7-Ik3uuZ8=": "772717000000", + "1t6Uq6fFesLGtAU7yOKIYYWTFW4GBZ0o2e-zezSVTJ0=": "428037000000", + "1tRv-f_Kjpm_dW-lOfyGwoXX1z5UTDO45MbqAHfiDAk=": "1173970000000", + "1tg98BjhW5KXnUexRKijDU-xyD9JuaSpfpJygdympgY=": "454545000000", + "1vFZsKS9iHWO_tS3JWXtvJTFN9zo1Nbofad2-NwCj5Y=": "385509000000", + "1vYcjTv_sT4HSKreIMceRp-ZFZNkXt3hNCn_Gyu75Z0=": "494279000000", + "1vkqQZ__-peL9nPOBA0V0Fh1EizA0JV5cht2CKssm-o=": "462839000000", + "1wCHQuc8gbIGmA9RMhO37IC5z2oTpgEW6krFy3Vk1x0=": "499117000000", + "1wJiPvefKH_pwQoTcRC9Ir5TZGZdJ88GCWCwP_V81XA=": "769230000000", + "1wkd9jrSwkL3BLZEfZHUDurVkFKxd0KH3ALhYdWk1pI=": "385101000000", + "1x0X8DruMEGCt_GjHHi1HKIBLap2q1bdVwT1QliQZA0=": "2018910000000", + "1xm1MRcCrgUeOu2Fs8wNGJR4-rNPvmSmEUwZsfqdsiY=": "384615000000", + "1xsVb_1h0bUQtWv3kHY0JCvvenC6Yrn93uwOyF_oCl8=": "496125000000", + "1yCSM0CepuT8fOJyVBYgsjv6K8NY0EqVL9sQl-7zfnE=": "1408049000000", + "1yVcPwO3p8LCmQ4XwDX1b7E40OmASayMVM66GvIJjZc=": "384615000000", + "1yXfoSXoLhA7h3bRfzBIc_DTcd0054vsBV4BA8hYo74=": "481721000000", + "1z4fadqGqvdbFVLkhLPBRG1XzZJNCgC-UwbKK1iwL2k=": "384615000000", + "1z9f4AThp4IVB51reoGeOwlw3y5i6aLmM4zvw3419KI=": "1692588000000", + "1zIPfBqhVEWBILUdX5I0lrEAiMhpNEUN5v47emGx7bc=": "1927554000000", + "1zOQL0QZpASUm6SFRLk51bSkoflBSCmKxLG_oLtSYDo=": "1173546000000", + "1zyVVebj43cmLGZqhGj4l83YAW8XX0Ho8ceo1Nx3Ecs=": "1388846000000", + "2-9rTkF1Vh6gdzR7zo_A0nK7MfNjTft_LUWf1cbEGFQ=": "4898895000000", + "2-q4GIpO-Ypl1AMsydPOTXOMsu3oXVylLMbVQXE0OD8=": "1908054000000", + "2-sZtL39BXHMONiL3u3CUjnIRDPvETChZHZzpgt_9Uk=": "465999000000", + "202-uRZ7dm9en3oug0CkWkxIapChZfGuynodIhrarq4=": "389663000000", + "206t5Bel8ZZ8yYVTvBDKRbUEU6iZvcXZCfuD-p06k28=": "382394000000", + "20EzQXRIhWlJk_sV6puu7eUQbuxL2kxzFcxO4YJElWw=": "4985679000000", + "20FL55lTSYWBbAwM1ifnfK16S8UPTQxOvtBeCxiXT-4=": "384615000000", + "20LbnHxcW9jdlKTt0GejZzPjz1wTwRvIBx21MWO1wME=": "538504000000", + "20iImQA27UPfTxKSh1InItxvvXJtm6At1IYVvlhrHIg=": "2231533000000", + "20ovbzs9Y9uazDxXKTJq9YxY_MpF_jLY7HRlCDR9GyY=": "1629942000000", + "20umbLJX1ta5gmw--aEmN82DBAMjeQXZrD2Q4nb4boc=": "769230000000", + "20x_gBkYpVAyFQu9pxvFc2ei8atpXxWu_fKVgoittu8=": "446718000000", + "216Hz6GIZ9F-Ta8gx76rwd4d5YAUO-C0B3Db4yg9yHo=": "4265892000000", + "21LyU5KcrLSvNy4mLTBFmtfenAoXhxwS6xQodsWJE0E=": "419807000000", + "21U4-4-3qf625ctGWHofDNVha9OH2AocUqQvHrxl_mE=": "833345000000", + "220Le8Ag6EyisLKo1_PxOw2_a2O4YmxrFhKEXVui2Io=": "4545454000000", + "22Hwf-8EsVy8liLkBcSldcb8Q3RN4-v_3XQNfp6Z0Q8=": "1691022000000", + "22M1wjDJ8ZV1Vc4R1wrYFHTg4VJ_XZLKVae-Kpy7q2Q=": "384615000000", + "230j0qbN_sJU3SJV9bpnn95VFk36h0wMzQ2jQZNkA7U=": "411085000000", + "23Bm3GauOT09w7QaHtvalELbdQmKB_UT0UlJZmjdtSk=": "462146000000", + "24QNvTvaUz3KMyEslWTJysXsvKXPjIMO0-aIKvt393Y=": "1249999000000", + "24sMGgoGAq7eDkg3RcbADm9MqDhNgngHqrsMG3Eu2hU=": "2181416000000", + "251CTY574FhcZOGDZpRSW-A4lunSWQ4yfsJQwFn0AB4=": "420356000000", + "259qkTPxerJzrJqFJk9Qg65ia4mkI9zYFaLENY2LJoA=": "462687000000", + "25CvIltOLs62vBoQb6VD0Pa3NhQT94JuJ1EH3l8kSYo=": "3601765000000", + "25hH2bSsXLLxGkQNB6VAnXzNrpeKycJrSZ1SwTWFbEM=": "1684160000000", + "25j12wFnIG6Q54MmZusFk6w3elJFXW7zDP-3CshpfQE=": "380184000000", + "25shZcQfCZyunFCiKgpfFbLsq2biuRUh6QDQbknaqDM=": "909090000000", + "265GqC9WmZeXPtF0TqAeDdhl14QMeimmj5_taUv1HI8=": "379611000000", + "26G7qYcjQ0THT3Oa1wKi-Fv3Fh3yoP48RWPVKLQLGu8=": "10231499000000", + "26l-aRn1X2Np_Dt04kk4ZAZvQwyAorGPc5diHzlTjs0=": "1921191000000", + "26ov9VsjVgXJJQvm-q75lwMX4MaDETDSOqx7dbLpNcc=": "379344000000", + "2786d5yzBSCyAXoe0hyZ35pwP-8Tch-vl9vS-ClTzZA=": "4621453000000", + "27SVE2ZOu8adn7NuYNX-zhYzYSzN9uYLf_EtW5BGIJE=": "2269531000000", + "27Tx9pNQycHxCvN24VE2S7uw1rw6E4Fni6Mtk9_4SWQ=": "382579000000", + "27UAleyPz0cj6ikrKiK29lyJffXqWsgjgOUkmloVCNw=": "696563000000", + "27YHKq28PY4C4P5pIo19Xu7sk01Ivp3ju2iy41vFdkE=": "3715456000000", + "28P-yQDmNAZ-rMUH7I32IwatkPtgwD3WeiaBYpVy8go=": "1817993000000", + "28PS7fAyx0LtEYJn0Hc2CWRW195tmV3n43Mlm1Vo6l4=": "2055429000000", + "29Abp9k5cRixpBTR8BEJuKZ3YdIB7ZAb5NTd_KTdT64=": "9614135000000", + "29jR8J20Go7X_McvxHb-6cutRiiCI4yk_3ygXyM5TNU=": "1927554000000", + "29k9t8j6cmNG6VF39UYr5lHbiY-ilnLVvwXZnnSf34c=": "541995000000", + "29rg6FpjCFxs4sUdp3LsI4ANCO5fmfFK2sLAuN-0ryo=": "4166666000000", + "29vZnW4hZLnczTlWac5I3Ne9GaLAbU9d05Cegbbloqw=": "1363445000000", + "2AEcnuDmp2EHASrSnP3PiW7tv6HNYuDDQ6x-njI0Cow=": "383927000000", + "2AKftTOn4stz4r9vZpVRcFtFbMXpm6RuQyXyrL6t3ao=": "3457087000000", + "2AhKIcS152UzG56MTnkYZo7ikaICaMISp2cOIhHLI4M=": "2329231000000", + "2AyU2GnCuQVsv7WMiZ_kRxQucReaugnLUqlj_XpzWj4=": "462160000000", + "2B6UHWpElmnOSI1I8gw3qZKcMNSR2zKf-P9xZfPnbEk=": "427562000000", + "2B7L_0mSIfi80R7h0dToWDwcWNJbPrD25wTuKwFaUTc=": "2083333000000", + "2BKh_iy5JAJwzEgfh4_J6KyoqTdpthf6aMcVL4dDqK8=": "385509000000", + "2BeONsvmyMTkbT2iD5p0nX2Qy1ZCHCU7ZIg6SvOOTsM=": "3846153000000", + "2BqgEXGLvKlxpJFdCBKeJr9uPNTh21TSoLOrCF6p7M0=": "504682000000", + "2C8hAFtZF7g8wMCbwcOLWyi10xRDHxctjThpBw87iD0=": "461649000000", + "2CJyobBcNokB7_AXgsxhM1NDQaoyu-W-VEF332j3kW4=": "382018000000", + "2CepDz5gw9hEDejBcw1BrtYWAi8vUNhAca-kEyXBXqI=": "378006000000", + "2CybYaKX5dVnJcfCSkA617J_BjusgnRuscjOcTqwcvA=": "300149999000000", + "2DGyeilp8GU_Xnq358fHa8HAGyaGK1AhLk65JPwdvCU=": "6572350000000", + "2DHVoNDykzDX0wTanfnDCSL31Ig_9WFZM93hVyfLLZ0=": "418488000000", + "2D_qz1qlGFJhRm1rsMLtq6ECSQMP4NzNFJjMOJKr9sI=": "3989751000000", + "2DbaJoMqUjn2DIX4RpQvrv_UBx_08f80MLQk9nzCZBU=": "416886000000", + "2DhgcwFEDK6o16xB6Lxfg25vj1ZQNnc7M6aM_Lb7_qw=": "382394000000", + "2DoWj2s_C_3fe-R1Q8VljGPlHFPec905IFbhUw7CTrA=": "3473683000000", + "2EOJdN8d4g_JjWA5d8QsKbfdYxdc4Tr1EJJzetY0fTE=": "370748000000", + "2EhfV5HzD8k14-bADkV5lKAfVTMGqVHdGTAwHTOJ_lA=": "384615000000", + "2F8ZXFeW8mzak-XoDMCNubc8HlCz3491s8wmmiPrl9E=": "833346000000", + "2FD3_wmEYkJ795UR315kS9yP3DQ-n5jsnTNCjTxDBho=": "384594000000", + "2FE3aaXwLiCK0oPd6EDYbtjv4KjUdXoJcMk9de7JS90=": "1567190000000", + "2FGGYJRByMwZwF-zRXZmgNPu23eauKqmaM9adxDhVmQ=": "389557000000", + "2FH-SR4UYJVgP8GUBsALTP5dQRJjK6gfh285yQ4btKk=": "482708000000", + "2FIVyE0nJQANd6_TSFMcyNTd0teTQ_-LPGYUjesvoUM=": "381805000000", + "2FLcyu1P9O3oJtPZHTrlI_R7FQFx8rn_HaAOWNTvuqE=": "14999999000000", + "2FPGG6kyilaN6RaPY9xD1GnN7t_DCn5NaxoQXYXm_Ls=": "1538461000000", + "2FZJJjvY9w5vAMiR4g1ILyr--HVQ3b-sosroGRPClTA=": "1144901000000", + "2GJyyH91R3njjszYskyq7vt4Jc662LZUFD6w301Jddg=": "384615000000", + "2Gc7xhjsFl23Gj4gCgRWKmbPliZKkim2Fuy1DgXH8hk=": "1005098000000", + "2Gg3TF-txEISKKKCS2s8eNtZs8L-IuRpP0GIVEtC6f0=": "3079376000000", + "2GnQu62Vbc4xdy4eWuODdsHmw0RBzg6QG14qP6Nadbk=": "384486000000", + "2GwYY1D8nTrzORVzjWhVjMkeEF2BmgbKG2410C3Zh5M=": "382639000000", + "2H0wY3m7olOrgn1kgojGl69vAR5H2B0brrN1juvnP7I=": "11516316000000", + "2H_vcNjHv_WiCQJBSzrtPDjKFIYwO0Vj92vrBUuzhow=": "946530000000", + "2Hp_U7OVMyInk4cc7FLt6FU0fW-VDv_7bNQDpa8c0Ps=": "565333000000", + "2IKBqTcfG76idEw8UIyMtGw5lgPn9jC0Anvmj55x00U=": "466374000000", + "2ItdebmhxEr2sewgIP8HHCTxJa8a2HoyK7pqbrTdNwM=": "567311000000", + "2IzzBs25XBct_kRM4XVUmkNggczR6-FOmSXs2VMzq8k=": "2083312000000", + "2JC1fGFPpUAmbKWwkKprHuvOsmI9nrHiJBbuQwi5sac=": "1418240000000", + "2JOfdH0pJp78WvCNeZQu8CDdz1VkxWSu6it59Hw83Ds=": "470553000000", + "2KETrixJ7ZZMT5v75-1KANV8fUCWXcI7fyaNGLaPyxY=": "458833000000", + "2KM278b23zjhlUo-BXYMW01k3Kw04VrzY2djprKorF8=": "416666000000", + "2KT2qENIN4VBD5icQNQAZcruswYiXWqZTO0uLObZoLU=": "1513688000000", + "2KUqLLAcBam6HT-cBsIbccrJ9RsPrjxNdEtNnK_doWg=": "4090909000000", + "2KdW7lo3leaEN2Uv_DlBHyb4ANhyNgJbN29uIYZJJRs=": "454545000000", + "2L58K3r-fKf3PsP8IDP1cpFHileK6R5PCsNqTnTtRYw=": "7929702000000", + "2LIGPpL34bC_YohIpHMoVs8RL44tGDnqvMBaxhQF0u0=": "386085000000", + "2LVYj23sS3AJevQVXR3P7sDo5l_xh73Wx4zMq-Njvgo=": "385506000000", + "2LvkcmS1H59yPSY-7i98tirCX8OXZZatVt3sVGsOfPo=": "812900000000", + "2LzG75qS47l51p5kxwPb2-eoUfObn6B8NLZMdRFjctY=": "933085000000", + "2M7l8O9RcNPEqe49redCzBD_mFCOPRajQTaZYyAdPTY=": "2045454000000", + "2MHiVJwhrBFixHAmeM73iOWz9tuDgpOI6mgu94nkIM8=": "6073601000000", + "2MioTXYPPYrOFxPTFyuzw_dLh00GbY7rLi_-LU7sqxw=": "63598711000000", + "2Mor-xZ6f8TW4mDT5x30LEUt0btkCEcGUmg_DE-SX08=": "3434615000000", + "2NVH15CQYqzJak3HP7x3YE9co8xwdzfJmqr0kC5euC0=": "1897899000000", + "2NYMLJzdGY3NxtLJFVXkPebbfHgqCVCCi1ofarAuucc=": "448728000000", + "2Nh2s7y_JRQZRyg1lPPQDxfFHwiB5ewIdpb9k7Hybv4=": "769230000000", + "2O6jUs5JkH2eGH1izTqOeDYnSt6HMhS7WJA6P2v3qUM=": "6222964000000", + "2O6qJYrugwWVREGjQ6zMa8zjRMxDdn2dT5ug2LKQ81s=": "1514244000000", + "2Oe933QKBS7Nor70ZHh8H2mytkeLhNN_TWSLyJWXV-c=": "578472000000", + "2OrovwiMAmGduruLFhtqTxFqHNN2X1Jia-5noGSHU8w=": "769230000000", + "2P5ycvs8mtfiVZ_LikIRkYQNDyjzN_yLPI2OkqiKo6E=": "417633000000", + "2P9c3WUlvPXnBi2oaH5AYoc7v3v0X5VcELXWNwDSq7E=": "2296140000000", + "2P9ou1xtHh0QbkilWZDhNiTf1-N7b6GtVAjIPG-OoLQ=": "382902000000", + "2PSp5FMMwYhLT1-iHnhEX5anbOXtTwWeRxm4do8ibZY=": "541640000000", + "2PVOtzFQzOPEhknHyLhPlQme7o2EDew3Krn1Lmb2rKk=": "644862000000", + "2Py94W_hQq6wzYoZBNokZlAg1c9Ga8G3m0Q-YrUZUVQ=": "384866000000", + "2Q5viNo2YljKQSBeJ22lAUgQOWygCO1hM7U07VURuuw=": "1112522000000", + "2QL4P_cYvrfDH7OzUVtGlYYwgd8TIZ37AAN6UshT5go=": "384615000000", + "2RArjiTf0J2vp_IKgweBsgfO2ntBFKH1yM6UCaUIefs=": "767200000000", + "2RK3ASTnVTN1wobnMAKa5D6Dem0G3fbPnsK22Hz5JvE=": "499999000000", + "2RO3y7oy0wKK2uIJD2tW5jWJwvVbcZcjEXX23R01tyI=": "2727272000000", + "2RoN3hFTsuKLGIUr07jXHq_WbfMrce0iJoNgzKGINls=": "1379634000000", + "2Rxqw4xyOnmkP_SBMfSpqJ0PUH7F-joxpLgOWff5WF0=": "378257000000", + "2S00bRecx_YYd4UKHi7pI16V7XiHcnFYvMUPbYM6OJc=": "833347000000", + "2TJ1_xDeCP0ahjeqPMBbzgTZudMSR1IpqWYAPoqR9RQ=": "416928000000", + "2TK1x6OfWQr_80Ll6nP-8MF4AxrABnRRFGJNtMWMaY0=": "1926411000000", + "2TvbwYMYjb3iO9EWq5uu0V8AUNxAHGkIT_tkWcffEmk=": "5416641000000", + "2Tw01BG9AK8S-WdFdqLbDsfAZOxg-MOntaJrdROzstA=": "576969000000", + "2Ty5Y4Q3I355DdKw3kO7I3gc_9O1WvWtA93E2MsPSwA=": "663720000000", + "2UA8QVcL2YuAi96jB2V8P671GDrxsVaJojL288Qlo48=": "446538000000", + "2UQoveVz1l5NrgwWDiGCTlL6NXQw8qi-1CORquZoeLw=": "1223399000000", + "2UgpRi8C9f93c6KQZ540VDk88Qsaz4I0q2YpkboimTU=": "461548000000", + "2UnY8VabF7fdvBMom3zXFbBuJ8PTvgLmfuUirm3fiZo=": "446829000000", + "2UqWDL8SIX0JOInxYS6XXaE3jFzpkXTRGevUfIf9PT8=": "392602000000", + "2W10hYaqbpqGylO9sO34SiQU49fcnEwBRn72Y0YqYGM=": "417636000000", + "2W7oyCAZz6N1ikusJDy7SJHUnkyWBgH65q2Z6TOxmLQ=": "378384000000", + "2WBZ90rD7g1zXKyiDNrREe0hcuikDNkLP-VtZ6QszO0=": "404548000000", + "2Wd2C2lM_R6LVkdYknPYe97vfLFZeGK-qS3TE9D55mE=": "1928377000000", + "2WnOen6GdupU7kJS4lSIf9DltnDl1EjZLrtWuaFnY28=": "1491806000000", + "2XEKzopgRsbfswJZHzu_A0L28jCocpa6AncbfkhBx-g=": "1195983000000", + "2XNgzwhDSftPX7VWjRkjsUlaeQPdF-lR5Q3jJXsIVdg=": "387745000000", + "2Xd73MIJgv4qzaHk-dfi5GOUywNS4FDxtmGhW3jZLEw=": "10679012000000", + "2XoKKsIA28WoJhQFPdzo7fkbGuvJ0dzpG-n2de9EVqg=": "3099639000000", + "2YUWuQwacGHJvD1y9UJy_GVDd8Dm0E0PwhSOFvpTjbU=": "541645000000", + "2YcguRsYshughkVQvte14hWZykJGte9ZvW6Rnwjz8GY=": "416666000000", + "2YhsmO4pckmaTxeflO58MnJxt0SYKQRK5zbhyaDx6eM=": "4162967000000", + "2ZxlRlcuWx7GuJNBVutFH1hJe-WTKgxvgIJj2_Yxmzg=": "3793274000000", + "2_2PzES4JTkataHYDSjrfSpVNytr1TH0GcSD6zcraeo=": "909284000000", + "2__Wn3vPjJ7-OortzQKlyKwmo9_vwlBW8-XMT10ARPw=": "378404000000", + "2_iXk1fnS5Nd-PvI7MjSg2Up89UekNcgyT0AQFBg6Y0=": "1254148000000", + "2aAS5E7pfuWd5ddUfMEMO0_C_FpbGXHyoWB971oHKv4=": "1923076000000", + "2a_i8kaQgRwXjF3OHnsm8R_kTai7IPyK_6XbBQpsxVw=": "2916666000000", + "2arezeLtTRTXTTOhWzqUUUKPeAeofh6tlTIfbYUxhgM=": "487889000000", + "2awXXZNhjCO5YgJXag4UtwSRG9fHVbMg3sCLQV2odlE=": "384615000000", + "2bCcht9XdZnLQmKoT31z-IBZlOkUBZstiQ82ct0rBn4=": "385505000000", + "2bZpIWK4Vi1WofVFREdBIHLLKnwHQgbZ3wzg0pmDbyY=": "498584000000", + "2b_aluTGVHFyzU-chUGqURM9x3TBmRNk-DoGzNWUqvY=": "367238000000", + "2bwXCTreJh9xStSQ7z4TAt-l5be3lfGg9gcFCPqU-Jg=": "384778000000", + "2cFLwbdetN9CpK8fBNJvWa3fcBEPdWwzQ1WgYw7btyE=": "381805000000", + "2cqRgXU2ofDHhdLma17zw44txmLsozJoLii9dSJPJ24=": "384615000000", + "2csV2NA5FUl_BzfG06XDyvt1ArURbVJwiT9oVrDsyk4=": "411085000000", + "2ddCOGdDTJsKnUGU1zfV7fodT9-m7KfSeQJcdfDSTSA=": "416710000000", + "2decU3DM3l0AZ30AyVRxD7Vn-dka0E8hmrH56y2T4eQ=": "643181000000", + "2dn48QJq_As_8tnOd0aoDueO5J6n5VPXObMlQmPba5g=": "422561000000", + "2e6HzsWCAsx2NdBJ298u7ob-07hKq8S4Wi9b99OQfJg=": "628290000000", + "2e6g8n8IbOwxF7eXzJFJ1gm3ZFPYND2zjwQu1rn6P4E=": "384237000000", + "2ehuQ3xw3X97JnT6UHx9KWzyeHI7RQKCHy0IKj7X_sk=": "385831000000", + "2f54a74WK5IuWnoGvAP0xvCtbZRhaqmGpJHKQRZBves=": "847318000000", + "2fOMnp935hZa1ereCvLehWkshGdua0CJkLy_zM57mMg=": "414764000000", + "2fgNQJWoi17M8X7fayKS-X7AutTM-24DBJIRW-xFpQE=": "460135000000", + "2g1y4AdNX20RNxY3NlrmM9q46fw-xALfIfu1ZxFGJnQ=": "4188555000000", + "2gBeZLBqJ5Vy-aYAhONoKCeR_DkYBaRGvQ_bm-15zp4=": "455367000000", + "2h9DZquyLoMeQlj4CdrsCVkd5z4HKEnkQwb0AHLe1Ds=": "769230000000", + "2hg4zyhwDO9GjBMcszc76yM4xg523sNGhzAc2g0J8_o=": "416731000000", + "2i6WQjqGJPO7SyLVbAYDxh9hA1jWbVSuNK3nu0AMf-c=": "382544000000", + "2iNC--2a2FAXpONFQMO632IZnwqsQjfI_vB-fMWz5Qo=": "378626000000", + "2iOiFQsmzmm2msmPYlnSJRihbx06aqKkA1beeUDAOJE=": "448575000000", + "2iZ57Sfm4zK9dGK4T0xY4tb-ai3FmexBBOY9KAwSZjQ=": "409074000000", + "2ismzo7D3zG0bFHhv2fhE6wwCNpIOFkNF4p0KVClvB4=": "384615000000", + "2iynvl_vpF2-zgYaGW0NGdNqUQtEv2JI0jfSCVlXoHs=": "3234369000000", + "2iz9cnB4pyEDtOM0Ii6N0PRjZuXnnXa2SfOdVTfHsas=": "384420000000", + "2j5NOzzWC_Vna9_K4do6Cxabacg_45fVtNs5I0T0hm0=": "385507000000", + "2j9RS9kjram4IUAxBwS7a6jmTOJfBEzeR0YTXCED31M=": "1090764000000", + "2jPonkUdFSy38e5ZOZo1-FMWFD13oJynBZ1MkR_WhxI=": "1000664000000", + "2jZxD1gZxdoOD-LRZxky_qeyLmJnL4TxdiFO8r2pFRc=": "1361677000000", + "2jpj2iYlonDlzXMtSP2IMsewu6z3StvKlPGdM0iCSmU=": "460892000000", + "2kNLz9QLRWd-8dXxonuuqpM0wqFHf_G45C2SyacNz-Q=": "458682000000", + "2kQgBPEFlAos7VNwwx4WWLXAkSA3bdpJFzM4m7VO9W0=": "377309000000", + "2kTvsqF27HcrW2N0i1MH6gGa3pJm3WDXjs4Ocxn9GCU=": "369372000000", + "2kUpvWZgwds8sAjwKEUdWwV20GNzki_bLKddyNp_xyg=": "396966000000", + "2knKGz3MQdCxQ0cJhtlDIz-eVl5mIuzHrc5xjVgvEFE=": "392672000000", + "2kxZg2E7cs3WyYmo4ItlTdP_KfEkqR0BCr7VzjoFi3g=": "383487000000", + "2lOaWYLVPSzJ6oJt01u6KEuOyXWm2YoFtD1yLsVNl50=": "468907000000", + "2lVC_qmmVZx1_aZIcVTJM3lOBoAb69TCw_tvcwkzSPk=": "3731974000000", + "2mAdtsETxBnl9EVbi4huq3X1tybe1IT1FIgFWiTTNZE=": "2315273000000", + "2mEtSGlfepUinlAh3PHgdHnRSJDKhHiWR8DvM28i6FM=": "1153846000000", + "2mgR6zqGQCcU3Ug8BxRBZm90VOwdZwp8JvcfK6IY1wM=": "416666000000", + "2n1UrbCoj3mhm6CQRQI6g9AZqC8j0iqp-7Opk7U2U9M=": "443644000000", + "2n2EaO74-h0G8pkPQ4tnxhWXj1oDHOgRzPS30nv65Tk=": "1967856000000", + "2nmAq00IfTR1bPiiW66Jv-GcCWg-W9EPrcTYwWw2-wM=": "2891573000000", + "2nrzujMdbzG9kDtiJWKz287w4qjdFoBewEUXrawyKZ8=": "385509000000", + "2oIwOX2XSyesxhRtfuj0LPou9KiheHfe0JSVrA3q-BE=": "3846153000000", + "2oMtJVFf7ebkhVs6cz8e81r5Z_pTeUscRX08TLpxttg=": "385505000000", + "2oQCi4ym0Vqp08-hZz_fdP032-EzkfGDya0AoOxIhGM=": "957198000000", + "2ogEk30mT-s2iHTkD7p9Zh87cE0W6AulMN4eFTGgTRU=": "412483000000", + "2ok8Jsc-lv0CJ-IwImRLqQef5Xw-Dgz4EUTr1nY2PEg=": "384615000000", + "2oltwK9DPJLvo-Zc8wlq93SVpZ63qqUwGNvH4AbhHVo=": "1363636000000", + "2pIOSKebeZsUBOjOyt_CnpeP9ZGm1YCJks44EUPTuQg=": "403850000000", + "2peshWmfMxhoLu2FF4dDTeqlRx27gUlXUjpBNuR9nc0=": "461538000000", + "2puBjQnkNHdKK2sWpvxVS4M5ZcaMfXHy2ohu9S7RQok=": "385510000000", + "2pyVSDztfTSLEb8Cur4AjD9_WHhqgm-nY5_robtNnE4=": "467432000000", + "2qpPsf5cijjLaB5ce8pBfGhlslootb78akr5K6dB0ds=": "1233257000000", + "2qqEJnWasD2vfYflXXVTGlEPRBH4jiLmbw8pTZean-0=": "759047000000", + "2qsDIDAHgM9WO1PRC5vq1a_H8tytjC1P4GceI4UeG9U=": "31249999000000", + "2rkD04_3yTR4F4xY8iHzrHqLgwItjktJ4P12BqSD610=": "845123000000", + "2rkczTYUgshgqke_5O4AJniBl-LGL7booY0KOt5-SOM=": "1152669000000", + "2rp2T-JUgUKZ_wZrCNuhtqAIyMCm46z2ytRdbpbNAac=": "461555000000", + "2rsCqkpJVBNa_FjYZPgBoqwnftFrhQUgrRBUGmGPjPA=": "17364085000000", + "2sIRwmaAIdlql_KZDeqXwT7qporgjh7t2XO0bdXum24=": "522197000000", + "2sSKtBGMTiih0D5eIxaiAl6rNbe_cOh0sAcHK8w1yZQ=": "1156096000000", + "2skb1Rp76_a4n1Lo0X3-mSBxmHrHALoAtlfuMg9MHug=": "457533000000", + "2t0OSm7axhiq2Upzo3ljR3dJRAhvIKBh_GfoGD4PJPo=": "771534000000", + "2t2WcEQu8-Eay1rWVmbIQlDKyJ13ETCyc5nZH_6dVMk=": "794931000000", + "2t6aHuYMle4fLWIV9M-9FzvlbKVu09UFNErlCTlnGis=": "4251645000000", + "2u95CvMrYnSnGnIKIU1sIbvu8tWI3cUS-vA7aXXzOPo=": "421678000000", + "2u9NvKbkO1AvJkRKwe781zvZRB5rCS6YGIHPIIDTIho=": "385506000000", + "2ub_Y5R8L29bn66xANxMAA665VlqBJVHPpLFPkzInn0=": "462839000000", + "2ucUgSV8HUImRN5SvTaFk08dzNTHh-U8gvLzRFUNkIQ=": "4747163000000", + "2ujt_McnTsl2n8Xr3ApR5C3DNylWY4MmdKaulLL6kkw=": "423370000000", + "2unFclhguw44IguzLX85Cq7Xsep9LIRNqTMPwBZd6rg=": "662231000000", + "2v639DbYfs6JxaXWuUcUr-Ua7pxSlNMP12UTqCjUIHk=": "1249999000000", + "2vA3s_CZQYbkiQ4fNPFjTyq1YzYInA_rHDZDhI0aZ7Q=": "4142350000000", + "2vYP9zohrcUqtkZgXXtrPauK4Vje1OkJ-xpzToDrYlc=": "5384760000000", + "2w49Nk9nN3mhKQqqZjex6U3JGxqMLLhCVw_LsCxG_eI=": "4220351000000", + "2w4rSJOKY9qMO6Tc34ySRYxyaml54AY6vudRZYacEsw=": "384615000000", + "2w6tu1sFHd7xU9OlfxO446Dx5J23DkJecT2nS3WVh-U=": "1863549000000", + "2w8WvesbiMGmceq_XncnS8w4pN22pA8ejO_fnimPsDE=": "10360975000000", + "2wThm4yNE_R4JraEW3qZBc0HA9HdPAmWM5z7TDBsSU0=": "390451000000", + "2wUPuBcaC9Yxix-jADmskRqvLIj5en8ePEqrnbWkERA=": "20320387000000", + "2witlyGa_Lwfpb1aNNqv-7J4L-nsS_01HLfQ3UAZz_Y=": "384078000000", + "2x03YsB_DuvOwiP-dSz7gvxDQ_dfZB4dikg3SNVs0U0=": "553876000000", + "2x8zq36zdm49JFFv0r9hJO3fv1CMStAHI1yin7xH4js=": "4984767000000", + "2xPC9kfHghwliQ0KPVR4Y_R_e4L0vI2Bva3ULoIhS5Q=": "2360091000000", + "2xS1SP3FqytEDprJZq8MKvz1ncsvFEEVQsSFZ-Mzg9U=": "2498909000000", + "2xSWFESuMx83d-SLJc5ZGcPw5kx8h4pRs7DIkyle_co=": "2538459000000", + "2xVgwg1IDDGkkJRHuLoWXeblnJ5WequqGOwSM9RSOlM=": "709122000000", + "2y05mAv4aTV7tktzkEz6MT2diKpzJLpA_AWknFBTwcQ=": "789241000000", + "2yQjkrWhxaT3ssHeSM0s_b6HzIxUwzihzM60ByT2-7M=": "899403000000", + "2yclZHsMfb5g65c-j4Ld780-656nAnXSXzZwTq9dOZA=": "1000380000000", + "2ydogZ0y8qmlFPU90U06aGbBgqacBQFw74HPyIrlpPA=": "768604000000", + "2yv7qyX5L54LB9SGW61ZydoicfwaxRuvPwuI257O5dg=": "471013000000", + "2zM-AR-znl4byuaP-3KR-mLfNttEo_KNSYLaUJpIDdo=": "416666000000", + "2zldThkuESzuHKm9Kf4B9i3177Xw4DW4u6KoqH_lNHA=": "381805000000", + "3-m2hknLbifSyb_gQnXm4baQPwgmI1Oj6WpYkUgZLEw=": "464236000000", + "30dow8AULOWn6TpSHzkLoRZZ4De82XI_bX1sxypDXPc=": "386167000000", + "31alTY3wDTsK7DbLinPwQ_3PYzGhKUa_DZvVMrrT2sY=": "1084654000000", + "31yrGa7071yLkIqnjMaKNfrqoOF331k5HpvrTiluwr0=": "419686000000", + "327U9SyhocZVtBcLi8Hrl10sRsIh3Wd2AHYVwKLIi2k=": "2272727000000", + "335aVdcXc2sx1KyJuj-m1rvRe5ttaygDFK2JAE1Dd6E=": "384615000000", + "335k4jVjGeYl9bvCswJhA6i5IlNNT-UioNwNaqAJG_I=": "2421851000000", + "33bOpjQd2nuMmmSOdvqmhiycLJpPrbUufHTrIGMWgPs=": "1625602000000", + "34DNe_1Gg5YsIdMhnHRJ2nKjcB23v9P17IPB3b-kYGA=": "2088725000000", + "34ZaY5oey11asM2Eb3kQIvZlXVmj0HdlsIIvhiosPb4=": "464615000000", + "34fgu3mNp2NXxX6vnZocvuWf9JSZhx8Ogaqft4lpn3g=": "2668204000000", + "34yYKVvcrdkNThvIGCVIMrGInRyGGFkGj-XEfVrgQSQ=": "448384000000", + "35l4OPBqzKuuvUdsArbrF34_uLEOeZ0MD3zNF0SdtSk=": "18806282000000", + "35l7oKxFsJ89boyrmWuf30YnbipusxcrdUTNVTscLUo=": "4166738000000", + "36Wm8M5bUE07ekumAOzzf8Rj2xmgFpFfuBGQ9iYTMtI=": "2350507000000", + "36afBD4MmSeSwF_IZCYGDKkGiVXdcgu2yf1z_bSR1NI=": "575897000000", + "36e7fH35wHn3FbDKEYKXm8E_C1xoNHFF_cHYU5qDjOA=": "1134053000000", + "37WMxyCEJNZaqVFkVnLJCapINE_5f-KI8K3v6-vNr5w=": "510407000000", + "37khMO9bLTbCyyx1ivE681uHBzvpJDsVLYOjEDZvOwo=": "412370000000", + "37xHJNpDNYbouUNgiPbQlyoFCds5w_K9aR89ytl2KdM=": "420060000000", + "38j8pH3AnyCtvpeeSELJ6PbNr0SGsMqgcfBWe4ao7wE=": "469837000000", + "392ahy1gUwI7cdAjWzvSZaWEF11XqoGYMzYY1b-LaGU=": "411085000000", + "39EUuNR2DkBy2RMJF_AynMZ0lFWtPs-KejyLiwztTNM=": "2366658000000", + "39irny7kSo-HroE0bC8QJV3hWbKreikRkxxwaQ5G9nQ=": "462251000000", + "3APafQEU8rbeRXUHD6G70GdooZEpY7KqNuufT1mVrn8=": "823132000000", + "3AwiNPzwmJwtA0UTSvsv7fmJkun-FHlD2W0zR0_OcNA=": "3796319000000", + "3B1eLX00sadJuuu2rMKy9uJdJD9tOne0Y1hRqm96Tp4=": "675093000000", + "3B8t6tLhU8oasNiRTmuXHmLyavquhwyydRvOcqQfVFU=": "454545000000", + "3BAx6N_wwE8YL0Qk7-PbFdtNJztBUszbWxgZpV_lBog=": "1156520000000", + "3CLjUgVhSru8VNOIVaNvsXv60ZEILJeU0CR1f80eL2k=": "3856992000000", + "3CR7PiPWzwtEXD5T85pUKdSPD5p1cNBhRTxixcl1KU4=": "1147463000000", + "3CVE2XHRd5tF-A1dtEHqIazbvbnmBBuBdfz8EhHn3DI=": "413478000000", + "3ClkQodHVhT4QAU9hGVZvZz2YFL5Pti0V_r4hzSMfJg=": "384615000000", + "3CpM5yflPUH6FL-DspyhdIC_ZEZ3AuIVuKMRweAxBg8=": "384615000000", + "3DHMufF5oIFoquL2j8Hu_BH9dxRxiOSJAtvLJDDfnLI=": "383275000000", + "3EWrHy0Z8_ZMjcFudhngapzhtTo0tHJGqgO0xF5BwVQ=": "453417000000", + "3F7jWd5Rbf4uBgi-eiSevjdGGRa907Xr0az5zRWwvZw=": "2158227000000", + "3FRPCYcdV8WnN_9EUAlgjkTSJeZc6_U5pxevKh4DLRo=": "417629000000", + "3GGaVYfvvpJD90UCmFeyNbcQn5KvtJtsm1hZUcIu2IE=": "845507000000", + "3GNl7Y2zaYTVWwT0AJXGsd7ETmFyqpqFQE_0l1KKKS8=": "1423076000000", + "3GYnV2byz0nIGKs2_P4pJ6_BXPJkVpsy7qyxqRsVFxQ=": "642211000000", + "3GgQOuRKjIti4T-mHokrrbtHk7D-mTXD4vD4Z3pZCoA=": "456016000000", + "3HUAiFq9m55CSf_05GdLmMtGTrWnK47_jdfQ7ipWa3o=": "7027878000000", + "3HVWjrDeWvEqveW1BMjkjPF_9AXAepmTZZRFf9uawOQ=": "384937000000", + "3I51cKFjgJgUPBNrwWvtF7kxJFGzrnUj_Hp88k7JffU=": "357724000000", + "3IWW1Nyrb6X5hbFmxiCDAd8KrZK3ERicVbL7yrTkPEk=": "385190000000", + "3J-Wp1PJhXug2bhn4pSNAhejTR3CAF824E4p8RV7r0k=": "501408000000", + "3JAZ6R6Q_64eH3QfzC0ivkBAwf6yihn6VoDsLv3bKGU=": "390743000000", + "3JCwfKAozMLUA7Sj2OWBTDrY_88-ip66nxVsZbABP9Q=": "379203000000", + "3JJ1OiBN-D2fWnzD1K-AZ4bB_hsghoX_8j2WWx24Mzg=": "415824000000", + "3Jdb8DWPy2eSmjZnZaKITIjQKEnD6Wl_l6Qtl7Nh0ZM=": "416666000000", + "3JfxxeXKeyQOBgxB6cLgZqQW3DH4e6Kcw5hTBXjhxWg=": "2535371000000", + "3JzvdLISv3D0XPDYTrWmURxh6dQFU4EE1idawOnE4GE=": "4090909000000", + "3K-zBRFp3ZFd357EqbTSC4baWN_xFWRjGszfJ5UftNU=": "456480000000", + "3KZ4QMuTY5mAmFgAoCfFhK3ihflsNz1dY77VMCUYCeg=": "4086177000000", + "3L8GS6RKLdHLIOmtYO9qlc5eJP25lrPq4iKqa1fmGBw=": "385232000000", + "3LEIOwoTHOyam0qi4LSUQdX6-LFk3tIDuxyJDvnqD_Y=": "384615000000", + "3LOAg2Q-Oy_01o4sCnY2EoTG1LSk_IB1qXVWg8Vf_70=": "492028000000", + "3LWmTsKg0BXZwXl8dA-Fjfj4lXlA8LDNMS-jKJUnkpE=": "457943000000", + "3M1HMATeFvYa0oxYBlPWcdIooYRiWn_JTamU-hlQIfU=": "459886000000", + "3MCLrQvBnKsoFyGZGZWxiZXgfIM2mnrJMZC3T8ijLlQ=": "576333000000", + "3MO-olxQplF8EUXXkYFqSPbUFmpjWOklKRvnZr5mTUE=": "1259432000000", + "3MYYlDZlaIDDcJ8h3kxUa2Y-o39lmfpwGjQD1OrgSXY=": "19230769000000", + "3MZUv4sWoDl25sfJs2AlrIK6Zp__92_sJ5-b6IWOZUs=": "459730000000", + "3NQw0b02oQ1uY1CUPfk_zuG9UvRgJxhjorcnnZjDnu4=": "419238000000", + "3Ncj9ld5S1aJJxRBn8P33O5y5TKP88OC0VmyOym64cA=": "495551000000", + "3NlCCvttkZxu9n1vuNxaM76bo4ULGEujZI2OHygEbic=": "829079000000", + "3No77ny229KVRl58jXSU33Jfqv62elo0V6t5DAb8jKE=": "385021000000", + "3OSnumjxiTcqywBokMkqUFAxB9nopsHJ8K9oeVTRNfc=": "511240000000", + "3OWFh7WyD2DNh7licXfl47GyWdX04S5qJZpUJvat93M=": "384615000000", + "3OnkWk0LT38i2sx61NOR3rVQgI5YOdNni_JDH0O2rsY=": "749999000000", + "3OqQiyNsaS1dbUOIZiiE4K_WQjEIDk9p4w7pTZNkxWo=": "1102144000000", + "3PLV0_YYCm8eq2G1yi0myJi1CbR9bLyY7kntatcqi7Y=": "384410000000", + "3PX5Teacth2iRcADFOudKnmQaV0CGfycKa9PA8IKmw8=": "384615000000", + "3PYtQNIzWIjeJ03jW5Wkns0yOtwONUWju6zd9gFigvc=": "925947000000", + "3PxX5TVckFralUfy5DuQ7fhQgyk9pB97BEDkZKEzMeA=": "499877000000", + "3Q4F4XE362oLrDkafC6x7b94VG-alWrUnmWvPF0Q0b8=": "378532000000", + "3QKAj7_IL8V6yWjQ-_AL_7XoAIwGYnw7-EpTM96wbKs=": "568497000000", + "3QSTG_KFVD7MARmI4lUnSgFFM7NukplVs4qQCZuYWHw=": "776725000000", + "3R0G-4T2O6XgzQBVMSdGsHxCO5qOBv15uLzX5OFm-Jo=": "384615000000", + "3RDVbusG1x3qLtsYpTngBvbP9fIFnJpmMrWKHB1bqZ0=": "383971000000", + "3RFJaf_WVAozKls_jn_PteYFBkb4gSaY9RbuwBSgGMQ=": "458759000000", + "3RdqCqOwXnyxGO17WrKB3wgUDI0BPEdMD-4eokGVSkY=": "1767181000000", + "3SEBhBnISK7n7J4NZR7pRL5B1l2XWPyfyHHDBv_whqU=": "384615000000", + "3SGCzF--JzGRRo7h1zofVEzwD49paBBh7po7hLbc8SM=": "423370000000", + "3TgVr5JlLTg11x3m889rETgzC-Eala7GdwUlbMYgUmk=": "379260000000", + "3TkWf6j9jlzUanz9i7x8ygLxP1EhRNzI1y9i24AtH14=": "3076923000000", + "3TwS4ohGXXy0qOqm0D4v7luFDNcTdjDJsIo0Pn2ar9w=": "384615000000", + "3V-XC21sVA50UnWJARLkjyfPJimZi3d5g8QIa7LcRjM=": "1252888000000", + "3VDtZq3viFpA-L-CdfiQx2zcjyB719n9-V0CSgioD9g=": "450857000000", + "3VG1e1q_H37THxUn-uAH2bM9SZRBp8vT9As3t1er6Gs=": "384615000000", + "3VLthC-mrQVCncTgab14woOXwMWW1eDM6ObxMhWX1HA=": "809747000000", + "3VRwOQc2Mm6-pZWhL30Mshn5IoIp5FgOsZp8mCCHTTc=": "462146000000", + "3VWzxFGyB7vOCTco7ihUuclo1QdQAK9Y2fwbpCkHgu8=": "391600000000", + "3VhLwI-bfU0_8nN4-JTc2xVSMa1MWUp1Chza-bgFZyE=": "940062000000", + "3W9HmhbzYd9tHTtCStoOysJJeXH4JZ5sz3oxYIF_DR8=": "1153826000000", + "3WXuFEGWITHpE0AZbJ8OHhBun4H24zOkQaAKFbHAwz8=": "383550000000", + "3WY8jczGNG1m0LXxXARJBtx6ci3h9CQSgh2DzKoLb5A=": "385101000000", + "3WZ_38ku98IyT3iRp16baKEh1N-cbGZKk50eMamJWMY=": "5167237000000", + "3WijePMEixlPuAgSS7phWv0xfeQCr_coUX9LDOPlPOI=": "6249999000000", + "3XP7EgWtfc9OBbrbpKULcHl1mUVfdE119UaKUjTiWXY=": "385587000000", + "3XYOQreyzPKMxIjFI46DqrUcaSKksYU25gujL9K6UZ4=": "849918000000", + "3XeV_jdQRsM9sHKEwRXWeB46MvCGRXMa2poSEz1MFls=": "385353000000", + "3YAVYisTH5vUzthnGBjwvRWijNePAvI8X25OOALFqUc=": "405574000000", + "3Ynh7uenBdxzAUTl8_YcL9c5udp7ebhs4yZlFdWgSe0=": "411085000000", + "3YxUPNGdBjrAi0BSz7BNFpwrdyTW6mXZQlMkpOr-0r0=": "383968000000", + "3ZOQbNCM4sWsbs9oJIH5ZCpkdWzdTlWC4OmgG9VkS8g=": "1927643000000", + "3ZUHMmA-IIc73DUsT_gDhuyINDg0sb37XMjYkg9M-k4=": "447147000000", + "3ZizcyqsHO50S_HfsGhYOxXZmJAs9RZoQsKWzCxOvQI=": "777285000000", + "3ZkFzd1N1MHTtcNa59XpixTonJEj46L7SHQNxCOampU=": "379344000000", + "3ZsyP8a1wrQoYEP_mL4jyCY0XOpkDTUCxHCVp3L-zvk=": "1740450000000", + "3_5kkeRf7excUqE903Fc9vPj5_Of8CsJw6D2y-4XET8=": "3329213000000", + "3_BMvEyV4jK-W6bsAqFpuXuEEJYivjSroe6KGuy9HEU=": "812162000000", + "3_M9VnUcaUt2jrlgz0jNyjZD6NtkKcM1OVWsA5VzGNY=": "464104000000", + "3_SxyPYlNKcIFtg-iY_wncQZDNtvP5bHU4hSgFl6dXk=": "1923076000000", + "3_fvKzF5uPcudV09gVEOZnhWR15ZnpFe-1RefeVz38o=": "3969884000000", + "3_tBpCQ3L-AUv-X1LYnKw3vf6r0INhdoK2gUyRgIayk=": "383910000000", + "3_z0f0G14e0IuYVxZJTIDgd03DN8YNALXoqAp8ewzyA=": "2188411000000", + "3a58GaMavFxhij51SQuXdjEjEy0ep1xmgKDrXBUSbLI=": "499999000000", + "3a9jkIeJSHNnXiqWDy43Ex4fL52oL2FmONuPwSopP70=": "833801000000", + "3a_LGXiWuU1lT4nSTe0nl_YLjHUx3byTayVSbQ6WN5w=": "832188000000", + "3aldA117o_58oT4hMR3qR-XISRbqimaLFpkjlTJg5n8=": "2079648000000", + "3bF5OEqPi4j9t28dXV6k984pHLqM4036ZBxUZpE2HjQ=": "406308000000", + "3bKiWVoPS-rERTJMbrQcwB_7NTN6kg1VJZGdFOgRXrM=": "1092612000000", + "3bYn6FhKZNmhyxalu7o_z8fKPzHCpBB_kBlLoAIhhYc=": "467430000000", + "3bz5amXJx3GG4nJIo7zRVPwE8p7kI7WOD7qmTFT-qpc=": "417100000000", + "3cPvLve2mDMCfTC_3f-5VI5Ob1H5nf6ZhziTN6LtiV0=": "667307000000", + "3cYInVFdzx8lN_sobCGZien6gFrBwcaFufThANFqRaI=": "382394000000", + "3ciHZgNLwnv7uxoidpzrplyooWHnlvXAjsZb6z_Ix8M=": "490580000000", + "3d3qUUp0s-K5X1U_p5s7K11dO-d-FKIRZPyO4RZdbP8=": "2535436000000", + "3dBKO97oY_Q2ahyRtPwaxUx5CvQG8rmkMawcwJu5Kbk=": "407808000000", + "3dRakwa7as29dk_uiDA9Jvknw1SPy66DrTeamS5qSxo=": "501334000000", + "3dUKdcKcR2GbxdeRLbIfKt2C0PYV9RC0s9-K3_pRjlA=": "385211000000", + "3dV2nlywUlOzdqDyYHyoksmU-27opn6aNgCDO-Vz31c=": "385409000000", + "3dbBC2gyp528rkZVLTIZSbRqMCPxP3Mymm7zev9MxbY=": "378310000000", + "3dbSZ3a3OfYhQLOL9x3Z95-OnWDxwIYf3kwnPG-pgbI=": "384615000000", + "3de8ZWLnRfc64SVKQk9Ozt6AMKhacguEO3D6Qvu8MEw=": "769230000000", + "3dfcjB8SlH51XSp4lbicH6M8CXMckUA0uZ5X8788u0k=": "642211000000", + "3dvNHDMUnppFx6Xg4iiXAxOJjZcrlOoLYNXnPS0Tzzs=": "337729000000", + "3f-YJI1fCr0WtUBIjQbhOu8xNip2zykECm-8F7xiPZc=": "382394000000", + "3fHTSK_Q8kZxucGBNZ2i5s2-SPe9u9-0qPer2b8Oxow=": "831279000000", + "3fZlVun8POMdOrYdpeXM6KzFrJqlJvo1FCj5N-BbqqA=": "1407437000000", + "3feNisDDA4bJBk3R0xyOo4er7KpQpRRiB1czyS3fGUQ=": "892303000000", + "3fnQBLOJDgbklLXUH9JxyIiIs_hZguVVw8j7u-NiFwA=": "384615000000", + "3ftQJ7uLCT4b-zo-28Ezj0ePpMeES0aHdJCPxUVnFJU=": "825729000000", + "3gJcUJW4ijPdTwmmicY6bk34qpHmf5y6_wMyA5iHjQo=": "7018037000000", + "3gN0SiYN7MhkxJmtIRFDyNlSxj2MtnrCOB46Zikh5i0=": "384615000000", + "3gWhs8a44njYm75UbW9xX1y7lTCkDWcKvxhN83eIF-Y=": "381805000000", + "3gpw_bXV824F23La6K5FIQRNcRXqbINTCBaC3gENvXc=": "377818000000", + "3gve4sk90vNC2oAowFgYwqSPzXeP3CIpJHO1mjJzW7Q=": "457058000000", + "3hNE5hHNJy7FHvUSrXRxzQazqpjQypbjdiASBgNQgFQ=": "499999000000", + "3hWWp9nHpjmrMHXxxz7rUAjALO-X7kPL8qhlHWXvBOA=": "382479000000", + "3i3NNuRl8vT-huxbtiBpBRAUKf0rkboaTP8V3RPmoqE=": "884603000000", + "3iZ0DCRPuuzjithkigpY75vssN06KfZjFDojwAqa7So=": "6538461000000", + "3iqBpu-AKnnxu5Ge0W1dds0fXaKmnTVU12hTm4luLUE=": "41666666000000", + "3iroGObmOl-VNmQa8U60tz2bPRWNODKmojH-TGtXkQU=": "1001199000000", + "3jQt7yUUWJoTzZX4-MEyqj58HB-udj6Fex7JBzu5ask=": "397332000000", + "3k3VNlsCU7XBY2nkCemL-TiORZMqIxG_lBgdU8aoVps=": "384859000000", + "3k5-Wiac-K1PeErghfN1jq-FjUAY6aQZyR6BKT2YEBU=": "413004000000", + "3k6s7iy4wvEJkXu3QEd-98UUUHUjHc1S72aAi41siJ8=": "565274000000", + "3k7t6NI2ytHYw0vCNgdJ33rcytuuc26sGuJD9sslO7I=": "417532000000", + "3kEYE7OOpeTzIecTappjvscnt7oX9ZovAxUlE9lwdgc=": "385400000000", + "3kbQkOY5adB0UdiH59JBeSSaN2ywA7xtMgQejgxqMY8=": "1153846000000", + "3kcV_mO6lY9WQ3OWNRufM9_Fs9SYQ9oLEFv9AQAhAfQ=": "385211000000", + "3kgmjUt9VsDpfPKFBknYKmmYgJLTnQxiM4jX1wRSvkc=": "491141000000", + "3khindHMak8ZSce0ndy4mqkqBWgGzD_XoWvMvAY-vQo=": "1923076000000", + "3komdGVlztEM436og_84nde0qBtLKrGDOCM0GV3juUo=": "384615000000", + "3kutrrYMkaz5o1iAaAO7Mp16dC806dQ02iT2Q576yeQ=": "455433000000", + "3lNsamJvg-qqt9za4ub2Nguww9lIJ4B9gii-flHG8AQ=": "1588569000000", + "3lbBGwc4Ay5-4JnNxI05A7zok6lXFw34vYcBJwBLT_c=": "460854000000", + "3lquaglzViBpUj3YKUUzR5fppruTygB3rfWhYKR3DBg=": "417630000000", + "3m2FD6c_HVRnBSpv8gMIwysgSwiEELh994hzTGh0tzc=": "384615000000", + "3m4hAsD2W02O0f32y4q-g4nx41cEuFdIl1HwZVRAMV4=": "384615000000", + "3mYnt5c_fFwf5awfuOgoRi9efIpYtWKhqq-Z3Oeytbo=": "3851914000000", + "3n33P65axc1Kxh0Lp-9ZFDwEBbchFyOuhdsSn3Mu1IU=": "1507392000000", + "3nNOmPNcuw0V2jxV4gUYZ7d93zcltc1TQVLpL0Zx4T0=": "1999999000000", + "3nVmCHXDK6lSAiSJLplPspJW3ahYWvTDl6WAR6AFb98=": "382899000000", + "3nxovtcfd3qlDZ79leNR8ywlHbel4MTj8FZcn75mLwY=": "381805000000", + "3oLrHtVVq4ULDUwBClm8TsxKKAM-b0xURYAk5o3pRHE=": "2073271000000", + "3oQ6QvwrM6smnlHkg3py94LxoKYqT6G7DWHxK5KmaNs=": "765153000000", + "3oe_Vg7yoUC8X8X6O5sX7YJQPEmsIxxLOzWBDaDkFIY=": "378404000000", + "3pYmDnmXSgx8VNpyq0eX7B5khHo2woKfHzwMbhZIjrw=": "1378448000000", + "3pjxHyy4T2OpIaTLUXXVuGky-xCxDI2qgIoMLtY2P1M=": "769230000000", + "3poVHaz8_rA0HjO57oT1GfFWs0FZY8m-_dAl6XSoTVY=": "769230000000", + "3proATcv-bVa5dnLuqaOrVCQCTInUcadZNEv4k5hjjE=": "1146117000000", + "3q8BiwNrRK3ihT5yP32pCNOLJ1i4QNZUAayhIsk-ZXs=": "501408000000", + "3qPDV75aS8SsS5_Z8UQHSXnwkBVOVjzTAMxFXTW4F58=": "382394000000", + "3qa3wc6pwiCJjZ693HE7S0OU0RvuDhMLqJWzwrripIM=": "8720702000000", + "3qdkXz4qUL3NT5IbcIESduc3_S3Lsk4T8A9mzYCeofY=": "459271000000", + "3qft18lyMiNL-TrSVxzBU3NcTz2QLbbkbBrrldM6rYk=": "866201000000", + "3rbKyryg6P8iBQocUGkNNK3vkNx6FtC74iJ5t_BV9yA=": "383965000000", + "3s2pulmXF3VxSTY6cYNHlPxBHbdl7f0IW1fg5pb2GZI=": "384615000000", + "3s7kJmrbD9gKU4N9aFLjiU0O-WUSrBPKZdEbdf3KiiA=": "1590909000000", + "3t6Krg-YkiYMuCJvEzdrIpN3eFWAlz2_a3xlITkCnlA=": "1600025000000", + "3tIQtSzS6HLOVdr7e56n8yNUEVMw-tIxNh6lKMNJMQ8=": "384615000000", + "3tMEwbkCQ1NMftUYggcnNTw786zFzH1GDbSIQSjOJVM=": "411085000000", + "3u-jFHirzu4JEWS1QiMW-K5w6t7G_rynJ2QQ_TJcHMU=": "846741000000", + "3u4cGgckiyDj3WSKx0cnE21NTjLOkybTCvCDD9JF7j4=": "455600000000", + "3uDGPZRRX5a-G7U-mnlAb3euC-KRCviPOkVm7FaB5dQ=": "640707000000", + "3uUC7bC18slOHyDyCD2i7X7VeJAxEjAmiYBP78fFMpE=": "826147000000", + "3uduUwnrW_LCs_lVrJ2LxDGFE_Fq32AoTh-1-_hFlbk=": "9102783000000", + "3ui5oH4LbzVH-3sZ-wohgz7ivV25TbTkUg14hfTmYtM=": "1365055000000", + "3ukQ1I2OlzIcLEFcaRb-fpr42CWvE4-HLN8DI5iEsPY=": "460784000000", + "3ul5-6TbAkoKfPpmDtizshaZswv7TMg2zsCienGdgdU=": "423370000000", + "3vSsobS9cANM09zufd86bHyw_PIQk1pqrL760RDzax8=": "1265548000000", + "3vYs0WSyhLQ6ZhWr2rXu260vxZT_l-tc5pIMEL-GHfo=": "385044000000", + "3vg3WaqRCi5OKFeVLH9pnHpPQCOnj-LVwrtfYrxwpaw=": "455059000000", + "3vub50Mu5hmBmX9TfCfWsXM9EW9SakgIv7Xt3dMRkkQ=": "384169000000", + "3vzDKXQKwM4z9Ps2pcjQ85h9bdN5r2-3NOocx8O7Fw4=": "384615000000", + "3wT0BOtisTwyqqd-vS07Mt4lx-f4fnbfbuhEniS5GbE=": "464704000000", + "3wTPt2Ypn_T6_GO5tUOXZr0lktQE-sjWzNLiC1SPfZU=": "462146000000", + "3yNldiM0YaghWHomfJ-PRfaV6mn3QE689q9-4zjA_Kg=": "930288000000", + "3yS8SPWk-rIYHxnHC4jDAfnriNn7n28lZD_wS3QEPus=": "912779000000", + "3yYUyRp2v3DsTHFsTvDGxTLJYBx21EkaeUw5rZJK1wk=": "385505000000", + "3yoc0UwkQZt7u53npFzTLi8cTNjrwOOyE7XXGbWMpEw=": "1155332000000", + "3z1y3drV9jKlPm6GOVwcn9EuJhfuiOYk3gHv58yYfts=": "384615000000", + "3zME1E51obBS_HmFLuCIn2q6F1urYkbxhLnk_-rvKqA=": "901165000000", + "3z_VE3hkBAmdfz3b2R7-tg1CodTL9ly0g_OAEUNsbRM=": "1003913000000", + "3zkZitmqeqUmhchM0sLvdZJ5M8YMxV-O4vxT78TFyLU=": "2556552000000", + "3zwvdgW3rDZH3GtuM--GW9Cwzm63hts1CdhdK3GoVeo=": "2499999000000", + "4-8H0MyWg7fVhhzIEoJvnRUWRVfRxi2rwS3SHtg3r3k=": "463042000000", + "4-chrXR7o2bUlUEBZfzwqav0R88TV6Cw739ywEpZf9I=": "10137101000000", + "4-teKLs7f8fcqNb-biiJy1F-Bj6sV1otCknoYtp3qpo=": "2293721000000", + "40X5ypcPpco9cz04q6Lf_aj4S0-GYGpUAqV6MevEFlg=": "6653846000000", + "40kmC8ldoPXicH6NYKi85bOCwSMni3KrCydwY7slGa8=": "381635000000", + "40ngmBJPsVCeh1UnTOIg2gpn2ikaEqurjnAnV49f0fU=": "393573000000", + "41GidyxKo3L1I0jdrpvoBcVNfgC9VlndaU4SkMt5ofw=": "459016000000", + "41N1ZV4gP2nK2mqVNU_acQvfnplQSdNpuPZWKfPOlXA=": "451339000000", + "41b8h6IkmflFo3f8BW-7Hrr42arpyDoBHGQQfDuNQJA=": "2283997000000", + "41mLBLeE3oZHhJZbrVW3BLa6a9VvNeVmfur_oH8S3xI=": "1153846000000", + "41vMuZaFFohvw272pDzFL1QkhvTTJbUuTKWIo_EQpPQ=": "462823000000", + "426GjgcvJagQJmFQ7a6se_xO5Fk-zAjAfMZw5QvwuI8=": "541666000000", + "42cNIw9LgyW2g4NTh5Tv61yA1dLafusmgTWC5LKvvjo=": "1947153000000", + "42fSVWZIEhAUeKFDUeFYuxC_XpiOO9mrdI2NGnPf2NY=": "1272135000000", + "43EEHlXvw5-fP9Ghk89xAtcG8xitrU9oKyudEvARlg8=": "380150000000", + "43Kxj6Ww0e5gJKT-O1E7DNi5yOfw6x2wNzf8hHflTm4=": "2053662000000", + "43ZZwuYJNVYyk0ZzLU9LBUzz9mr6puVPyoaStYGWSZo=": "452328000000", + "43hg2q40LxjSHhyz3MOy-jF9bi7FA-Gh1_EfxcZIKbw=": "1409754000000", + "43udv3Dau3F5hwDVUdlxh757_tmR1YTxUUupF2IcB54=": "453403000000", + "44Y5f8rSe-BosYZnnwVZqYjz9rxjw_FxOAcP80aYfTc=": "419856000000", + "44iTxEkk1Mx467MniMos9PN8UD3R4JyLe-LQ041cFWY=": "468609000000", + "44s6nva-N1dtomXQdJlOXRuaxBOttrlL7mlsTZcRe64=": "1666666000000", + "457LIsJbM9UUf7WS7zRfhg0FSK6Lj9Jm1HMv77b_5z4=": "1134931000000", + "45RjzAE03fMnFc9TWw4FHGi_ea7HivgWGGcUvSwCNM0=": "2344092000000", + "45V0YHyr-Swk24GgZdSLf6BrIzxNVuPqf2d9Aui0_XU=": "1361092000000", + "45tMidcAW_dl8GnPbKOoBHIHHxyMzPPWrkYO6u_q6Tg=": "385510000000", + "46JDjprAqyBFRF9dff1zNuPaw4GwaTrZkpcL4-MR-0s=": "7692307000000", + "46g6pcQOIHBkk0hbkUUM15jHM5JI0DrLUdsGQuX6TGs=": "1351520000000", + "46nuzWhFm-rdd4OouomMsgRdsnbZ4MWbDgPhtYf-zvQ=": "1153846000000", + "47ERxkkfQ4ML-MrVP5P1OWw-TQU3yqCDp6386eZGsXY=": "2310726000000", + "47zBO6GXgSld-rFczPkQzm4lYb-gWh1yIA5epoPLoyI=": "423370000000", + "48FK6HDZzRpWQfZfn1FQw-cgfQve-sjPqXT961OudqU=": "468903000000", + "48VnIead6saV41ESwfHS5nNrmFFvjoUiq9Crsw3eGu0=": "769230000000", + "48iZvnfvtxibZkfYTle2Tvtl2kJanFDvL5GyqIkGNvw=": "411085000000", + "498C3whB62vtCSG0jeZOgoxRMeDlw1_IP18DnR9kEEc=": "455600000000", + "49hK2XhN5KOvOh9-8gX9EJrn6Y3DaUc0onG-rRxQagE=": "660840000000", + "4AKRLbeFx2-iPdAGCwbmWD8gQiixaRkJDBkauar6hb0=": "385506000000", + "4AKTBT-8NtxgNJN5lrrm7T8PdxLDXkrLBQxyr4VhiRI=": "845123000000", + "4ATVBcmmKOCUk_L2AGvXKZr7MP0lgteKpC4yo_6To5Y=": "492802000000", + "4Ar-7s1LlIhxOjhSmo4a-uW_2g1dCSX6ptWM4iqn_YE=": "836307000000", + "4Ay5iJThjubdiXEInWqEy6_SqxwDTv9veZER2Vhth18=": "833321000000", + "4B1C-Zp4nj_G_hcVMrcmTRwPWYxd6NZTjGcJou1MH_s=": "3657595000000", + "4BAPjxdjzCs9yamXSMFRVDOcHcRxEV-tuqEXh8sYJig=": "384615000000", + "4BIRthuEfetaFW_7Hrm74I2HshUeZwWOK3-y7n9sGZQ=": "1999999000000", + "4BIVA9WxUH7_X89VXu7SamH4HgLuxTsWzNIvnTyThVQ=": "769230000000", + "4C0LmLaDb0ROo3o8XGx9zy2M9YSb81VCAASSqcCtTxg=": "415672000000", + "4C3u7pbIzBGr5eZmH3Llo-bIdWrOhRBIQYjTLGnD5PE=": "926273000000", + "4DeCHlI5jZiSukXGXXxH5zhY3YEai1kMEc9Y0MUTirg=": "2088168000000", + "4E04iLnxogaGV0Ec_TmCoD7WvXvNNJwuYSREscg2TBo=": "576923000000", + "4EG-Q6Wd24rKOGoINiTylfx63qUYTljPEssDed6JKp4=": "3855927000000", + "4F9n50cZt7JaBbMDNSsYnmaRyOf-z3nUOryevulTpDQ=": "826077000000", + "4FQyuUBGL-SN-iKog88vdLXwbAS-o8CS6VFWCxyP9ZA=": "4082823000000", + "4FZ_rs7J2qJ8fCrf-zkrmxKufmP2ZH1v-VMA2oO_vY0=": "407469000000", + "4GOJlRJWY4vxGIKXZkywqoUWZQvGO81w8xkaJx07Dmg=": "458618000000", + "4GRKowDRK-IKOOnpZvfWDddLkSUw1wg9U3DDDLhjR9s=": "909040000000", + "4GUgCZBmwvpJP-cGblVX07AX7EkfYIAmgiEWYeyCnk0=": "384615000000", + "4Ga_8GGSQzUfUJJ9a7CsIERorH3U6YJFGPXoisrD4Ug=": "3846153000000", + "4HDNSrvSuVZqhirioeK9MBMj7O2GJGZ5qjaYU5p-lsM=": "390482000000", + "4HRM6xriI9i5JQrWG6QLfbXiE0Inya6hYvC-l4myzm8=": "3855075000000", + "4HWqDpB3XLeiXtO0cZaCRKxz8zh8TC1bmTDg3DO16Vg=": "3500551000000", + "4Hd0uHAso1KTsXLzmzM_f1tNouxLgN3vB_RgfmcdMsw=": "2499999000000", + "4HdMU60rgXNqwY3rcIXFWQ4wybyapjTatVMiGprHja8=": "454468000000", + "4HqlFcDemiusLhWj7IGfykq4B1xz_ED9YoRyZyH03iY=": "385506000000", + "4HruFDPrVlQJSbFGLa8yyLPF2GwYd7r5fW1ZAugFOPY=": "416797000000", + "4IIe9ARv7Ozhpl11xF_GUh99ErofTpdAQJDcs1mKcyg=": "412701000000", + "4IMRn0vothqYDxxBJG8zol7E2SmB-N746K7NTHRouDk=": "384615000000", + "4IPYTiA5hAGZbkJGrOjZkVvbO3OaPfba2JlsqbUW8FU=": "1999970000000", + "4IYRwWLEMzCFViZPlJ4EtN7ey1VU5pCg081txlKhnH0=": "384759000000", + "4IhQFWGAKSWLhixxJoTH-mRjRNVr_aAn6lPFY5G_HFg=": "382195000000", + "4JGLPJGoOZL6kNCwSAn_prVJhphIfRKnczo6CPvhXpE=": "464838000000", + "4JopTioHhl8m2Kj3604pi-8oao7EuApcb8Qq6FCb5ik=": "452326000000", + "4K5JOg9oUO71utOqLFkbtQ4Qaa8SbqrjI0IxaGHKvws=": "461020000000", + "4KAhbCBPCDZqIFmTBEBBSiIkwM-yf-Usxqx5YOm6DOk=": "384615000000", + "4KB01ke7TFV876LSdfkBm74QYPtjYTybhWvfQePdVcc=": "1068628000000", + "4KNuAdcHveN8oA0limhX2mgDvhNlm3Jv5czM0HIdgPM=": "2083333000000", + "4KcxG29Yk-VYXpGKfeMM3En3_qOvioGivw14-LCVoMc=": "1156520000000", + "4L0Cc-pk6mDkx_6zqHHmOpqhLM1tyZX3egVvBDzNKVg=": "416672000000", + "4LTBjyTymsMbh7CNQuo2m5WoLhqdcpZyZ76_Ah5DqzQ=": "417637000000", + "4LcQJXbJEIEk7Y3sYCPt1IwTl3Z2YLtCqKu5OKeXz-E=": "416670000000", + "4MKeXnYwMKrsMGAPi-NJv27tk7sHRNhYv5rPCi_1NGg=": "1593881000000", + "4MfOkGbCIUgGl13xL0Am4TJaTjjJcAF4iwK-t9eSWD0=": "879999000000", + "4NEZEhAFocDARYZ1a4Ba2gQebzGG7hZymMowFH0ZZR4=": "833908000000", + "4NYfbRGLURNNW4cLRlBIgrOCWhDdf4FaiRntz-08vSg=": "378999000000", + "4NglYpFar5kPW_RC-XQqOuu63OSJMV-b3UfIuyYcw5U=": "1537788000000", + "4O4Tu9gAerrFWlZe4wMGN8hNmtU_I4wBmMYG5gkxAxA=": "941460000000", + "4OQPXOIt0ddcV2CaqbIf3nkY_XZnTGXUwngXkSVbOB0=": "5417900000000", + "4OgrS91vzj7ewwA3iOULpDR3WGN1pNErkyVdCnowj3Y=": "464104000000", + "4P-J9NCyfymQ6qMmn4VvO69fUw_MXJAaeb5whoE0QbM=": "416666000000", + "4P_zDMOsAS7F0NfbPyxo2SX1_T7vDKEx-PZBe2Nezv8=": "8375268000000", + "4QT-tdgJeZ4D6aRzGyrZjmKIubyxeNvDaEKiiB9_Wys=": "381454000000", + "4QwTg5z8s6ONn8e1ucNGkI63Fi6kjDN4_u6KQPg5L2Q=": "379344000000", + "4R_zgf6SG_gCHv6UTBry9zoWUGxwlbocn95Kd-bT_mY=": "384615000000", + "4SBPZtTRguovaDgBl2XP8cvUcEIDiYOVHaHXqah3oDQ=": "386596000000", + "4SCa2I3kN3KszyEdzFOk-kCm6oPMHvuIcEygPTXScsY=": "501271000000", + "4SvdEDxVCqz7YJTgH-6DANJRYXQ-9OXtMgBn2g__wGY=": "386088000000", + "4TQ6WXBo24RROOMwYKaxzdIYahfkD5eTcjsFsa_4wkU=": "468146000000", + "4ThVmvnnnvCWmw9UsBejtNg0JCdjBpXEtm4zL8pjACk=": "453157000000", + "4U26Gf26hoBP-3aVi84uRz5BoIR3q5YIsmR4i42AEP8=": "388261000000", + "4UKe5WkR8hMxbuTMsNmjbvZYF1b0UWhq6URn-Ktb8FM=": "1015511000000", + "4UMltCrpgGD9tMcH9WhqEJQ1jP1tJaTAeVmc2TqG0bY=": "4166666000000", + "4UeZ3BdWQVku71V62uw4RVH5eoY4VdMXrZ3N2u8AdpE=": "381436000000", + "4Uivfv4T_ObZkdmkkWhBMl9UIKPKXObSP_OctNuO9WI=": "454545000000", + "4VAF8MtTkTRkZhP-B8kf-eoSTXjGI9H3Zx7hFTCWm-I=": "804119000000", + "4VD5NqPM1Kj3HtgM7QRM_cVOhHq_q3DQTUqQKwgisBw=": "3636363000000", + "4VyvK9sN-llmorFf0hKKScJeYEX3zrNuhyA6igIWCSk=": "541592000000", + "4W3-MFRju1YUeIB1-N2KCND-5wsu6hj-ATssEc00Svw=": "450612000000", + "4W4KfSXKT8FXPR0wC7KRBO_lgRWkLUTx5mf_m-uLfQ0=": "2061090000000", + "4WS9t65CQkRjD8BWGP1_Z45BoeTpzta9bhrYn1PHD4c=": "407808000000", + "4Waj8yx2qQkioJHxwm5UjjahtYX4CZVxKMn0Fj6yXZA=": "463273000000", + "4WlgDsgtxLzJJJZ8TPfxXdUgNKUg9mNJz-dK7DB3EN4=": "381836000000", + "4WxGtFHvuzY0zEOzXmC4RJTROltSBMF52d23u4YztkI=": "769230000000", + "4X4Zs9YR0y_kQWvB7j_kLBu4vvOKklc6HdwkE1X2cXE=": "2063006000000", + "4XCpQWEHYpxacUa4lcSSDQn-PWavJlaVewZaePCDw2w=": "2499999000000", + "4XWLoQwBa_yBb-9SNEOFk_N92Q5qBbzPTXI1xhdP0-E=": "384615000000", + "4YSrikL4YJWN6hiMWJBIqaGcDc6LYup_DU8OKQ2wZZk=": "415341000000", + "4YmP6_MeqdWvBlA6vhVlmLZvOZj7bskpc89WD_eQbfM=": "909090000000", + "4ZCuwcOyLG6mWVGmJ0Lm-BfLH9OGnazG0a2R7aasHMQ=": "12727272000000", + "4ZXMfi2_iuGfQtomvPkEubaoieV-1zMao-geKXhqsC4=": "473874000000", + "4ZvrKONFTxytAWRAq_8GqV1EiT_QsX1Xr5LpZ1ly2GI=": "469945000000", + "4_9E_Do4aDC0mcru0h2yKEgHuk-sgLeEDXtVzNHkFyc=": "417450000000", + "4_c2bGDtHHNFk75aRnixcCu4tD-7DebxZkGz1LjIuvY=": "769230000000", + "4_epv4BqO2YWW8V7vImBRN5Ktrz1b_v8zkmqY4CfBXk=": "496344000000", + "4_t2TrsmzNj_1u0M-Uh8w4ZEIx-0fQqwfhF9CF45sAc=": "355007000000", + "4_u_pQXkehj4bJ9BdtEUD3WYL6ZFAHuQKOKAEXx_UdQ=": "1250021000000", + "4a3TctM6_0eiM448bZVU0BxC0aTvgHqu1nH43utdyfo=": "1003412000000", + "4a6G38PBIQ5ULyUNFBSM6RBtxpKLhj5ujGCiHHfnRQY=": "379344000000", + "4a7enQuj1Orfa_oqc-uu05VxRtdoH4ZiY-9RfcHJs_s=": "3946285000000", + "4aHS61rd_X_fcw9CJc2Zfw4VWj7Hu5HFFA6RhBSKM3M=": "5039945000000", + "4aJuUYiVJetM4XZQlw6lZ0ITT6aGEp-Sl04qIV0QzcY=": "458120000000", + "4aaZ9IB8cWWUBcXNF_yDJG8-PqgpWe59zIKMSUUd03Q=": "642211000000", + "4aqGsSre_Cl2CSFI7TTuYDuVlJjKMfe_oU80n9GG68A=": "3024046000000", + "4ayj6jgy3Ujo06cqB-CSVt17_EmOZpljRf1rvZrwyPM=": "385798000000", + "4b2At5HbHyM8xQUyA_yfwSg0-XEYAsG1rfQr7qT9dG4=": "384585000000", + "4bJBt-uWk4pTK0ey8HNKJBuGDZuh54KpGTMKVTNeM_o=": "464314000000", + "4bLQ5HL05yeNGp90iI5PuD7_R6IOr3JJffIyX1q3OIQ=": "471710000000", + "4bLSLoM9cQ1vxW2lwisDEn4DeWC87Xx7By99qsD8wH8=": "1916962000000", + "4bdzLxoLZvmKN8o5dLwpWUFZQzrw_1aS20Z3b5UBCvw=": "6115849000000", + "4bksW1Dr7Cz5MNbMXEYmgDB-OC-w1QhR7IpXOOyVXeA=": "781616000000", + "4c4Wsmky_VXGcQtuAsGlvKurTeVlz3QXPuPvi5O7aN0=": "383688000000", + "4cTyPbYRh5E9F-LJ2vMYZ8g-29RaDixeBSe95ykxXhs=": "1249999000000", + "4cXCiVC8boCAjDjsTGCz7GuSoRVGAacMr4PhEQx-Tns=": "450582000000", + "4d0PuMltJoqbAInl-vzIeFP3RV3euvskZYkycvWc_Hg=": "655097000000", + "4d8NJoDcIBMSm-qko51qiFoJ9KyR23w4oDZZ0w_-_oI=": "392247000000", + "4dv88aQgTSWAuOFuys4eaa_OECvYpZY2sxWyTSHACr8=": "405267000000", + "4e5CeprWlfJaN12JZSYlx6a14nb_yDyG1T0Va_8ERvI=": "11363636000000", + "4eel0dj1Lwbz1_98PCiVLomTH7mBL0nOscgFwucCSac=": "3108807000000", + "4ehKdBLgerB06f3r548qBYcuEPI1i3ZQY86S6t2ddnA=": "5040417000000", + "4ekROonGgkU31UsLvTWzdA24pAzkMfTi2JV3OSVEKXc=": "394620000000", + "4fw4cV1uHwaO9j2olbW69X9rUIqdtalF0wEpvJClBpE=": "413004000000", + "4gNvfDsGWz5RjWLhUa6HI0vpC_kYTzoAN5bxvb1Ci2c=": "385510000000", + "4gOUN9PsFVC6K31ZflswfHFkhu18wlc4NZPs-WxF7tg=": "384615000000", + "4gbAeyMVRKPl5b2vsi3_lB68RsPmOobmOs8RilEMUhI=": "769230000000", + "4ghetlMa0XtUQOwnDbxV_vTtDAfG_QkST2hMkQKjNwQ=": "411085000000", + "4hDyDszj1j9042iKobftKd6uk2u4T5S42-mDc3MvThA=": "899480000000", + "4hkcoivQAc0uGZM5IoOV4Jggp2SKOu7FlLT2TQcIAAA=": "3846730000000", + "4hm9DM-oalOZ9fCa-ovK6V3X-4Fvcq2FLQIdJIn6FDM=": "384615000000", + "4iTiMNqF1hg3iQbh67oMUsNG7jK1AU_CYIA2awiNcV0=": "8039675000000", + "4iglUbndPzmm0PJKPbcRVl79uxXZFpqhdVslXMjjcLI=": "841282000000", + "4j1Trb943Q7Y5jGHgzSye6RaO4_EBD9JORdDh_w7kbE=": "460013000000", + "4jDSPEDMryhMOp5gvbjMtLLAAf3TS8BMYgF3ZICXoNQ=": "366940000000", + "4jDbgGSPwMKEgAH23iaJl-y4pkNiSFm5Sj-udBgd0s4=": "1943752000000", + "4jInTToc1pLkHl2DTKaX7qyE4Y4QHICKjb9rMX2sdAo=": "416673000000", + "4jNQKMiuLVDrRuyBsAetoXPJlycUl07HOhrT3CQfqrc=": "648010000000", + "4jaczUQ3yiYZJCoOlPwQGIEP1tRegtsde0sy-0ucRn8=": "384567000000", + "4js9otVc2YGGbQYFdHOFiF0vLziztNjAoh3zfFL3rjM=": "380509000000", + "4khz9eqp1vV8lUEkPOjIUhPp851Y6RQ0Vf8uW6OSoBE=": "416650000000", + "4knxVo3ERs8e9iAACiHwi70itACiSjAIfUGx6z6LmWg=": "462839000000", + "4kwI3d8iYuBNmkkgmTt3GrEsmgFh-ffDY_Yqu-pFL3o=": "384615000000", + "4kzSiY552Y7yRr_5-XfjJZLKsR_0mav_OruZOtXoZbI=": "3762263000000", + "4lKNNGKg_jZVPc_KtRWH3uSk2IbvX9pggmLrgGsNUYU=": "5044821000000", + "4lL_vTPs9LhWzY1s1x2ewQKnwKAJk1tiQjYM1pAasHs=": "387084000000", + "4lNawmbKEdaCDtwnk3h0SOk3m8IIOfPgzncAqqM2Q-E=": "463277000000", + "4lOAFJ-ixMBWZbtTxeQcyXtr1s3wubNrrqjHv1l3-5Y=": "386715000000", + "4lf3lbOMsIaXGx6Qc20yOiNS7a8OGSXRtUhFzK1ZLpk=": "1920889000000", + "4lv8rZ0naGaoRlntJheLhQPpm6YZnS8trA-YMFaEnq4=": "4998900000000", + "4mETZdjx3Zsn_K646uDLT6rttXFL8HnJKqQPj2Asilw=": "3333333000000", + "4meO9MHoSIxgrgbkv68aEfpefr13tzAdYe_DTJFXRVw=": "454545000000", + "4n0mzPq_TGmN32WKo6553KFrZrrY8xY5a7y9-4Sn7KE=": "2647889000000", + "4n1WhSUH9uINViwgDIYB1W-1Ah7YMnnFC_6-vo83MyQ=": "1353661000000", + "4n4J8Zedo43u9dC-Hiozxz5UkhYXg6qQm8VPzoyY924=": "512979000000", + "4n9OUuSDH5V_PsVJMvK6spjMoH4vtiV4srO4svuh3kQ=": "1499486000000", + "4nH6BBliB-YAoAlAD11djgzrEUA2koRnzUauVeAFAa0=": "408142000000", + "4nMYvqj_P7v1Vms5Vl2m67bY-m6NaPHQ645d9_K2_Ow=": "444579000000", + "4nYMQo6IZ99xssX0HVmrLPCgedf4CFsv6QxU3RTrDCA=": "499999000000", + "4nyGW5WdQtYv0_uZT0KTPAwG75rvTdFKo5aewntysUc=": "385505000000", + "4oKa3BWJXtFIM_1C3E9SH62xv76MNmg7QwWmVls49bM=": "380912000000", + "4oNusLzTYPAa6p_P9GCxu2X2LIz8D4q-Hpg6i1t07Qg=": "566268000000", + "4oy5OUu3j9fRRdIQX-BthU45wEL9-OXcctY7W1qIEp0=": "3846153000000", + "4pHAE-ceReS7Ni0h_rT8vnugOxTFG0VM75WCNvuaoZs=": "654014000000", + "4pLBbd48kN37dUcGMIbkwLozuCCCJkbsID_CXnZlLc4=": "4240295000000", + "4pQGogyWPArGmM6AUXk0C1RG4LIjv0arzmsrj7Yar24=": "4156299000000", + "4pX7aRKWnFhZK3-OER_2amGzm2lPGTypDsYShTdxpr4=": "2055429000000", + "4pXKL6KhjfLK3IVjnzKO9rB_7VYm36Hz0pOVMkn-_Y8=": "462839000000", + "4piUHkh78BmBwHvP2bhg-39WDURR0SUQJbETFb2bd9Q=": "465068000000", + "4q2v1Wo1gt6b6HpDAF84UU9tcpbAqUhS3oq4M9uiwE0=": "384615000000", + "4qKmaQAIPGtPDOo-vS1ocVeDpZuI8kbMzywEc4qu9RU=": "422586000000", + "4qLWtD1apAnT6rh5M6De12b5OmiKWaGyhyBXFHHJ314=": "385506000000", + "4rB1pBxExusxtBLrnBPmINfnW6R4FSTigSFDeEpgwWk=": "3652531000000", + "4rQHdJUWm64w_2fYQBaffyDArjgfe6aiGtS7VkV5yhc=": "578358000000", + "4rfxg21yhoTvjN-Zq0aUjnoXS_dziIKwM5jrHNhzGpM=": "384615000000", + "4sGKCA2-7-MXkky0JNnlBdZBYnwtSDTfGG88D8hfstI=": "462193000000", + "4sO0Vmbo-crfe4XrIOkhjkhww7BObAf9Ox1R4_sgXVU=": "442970000000", + "4sgVoy_KAeTJea11vhKcML9A26Yh7d-PHPy4klLgavc=": "448906000000", + "4sjKVvV8eu9SivXQiCE3BqId9pXmp73T_ZHuquEJlyw=": "378557000000", + "4sn7VUki6dtslP6Z3YaZNXM-vuDDozK0TUzP4w54CkM=": "385023000000", + "4soXIfIU-3cidRAol_zXuIF0PB-uuOwnZaUxEAyXjn0=": "842308000000", + "4tKfU18mpgPqH9FjtAom_E-NS3K1WtKxPOKPs4Vq1KA=": "756034000000", + "4tRgehYX9v5zsy_xn5ddCPAoLYLUXFRmZgcoKx25LXE=": "1269230000000", + "4tXmgfDu5kzkGlk_mlhcm7X3eqsbe28W7bni2nogpHM=": "447062000000", + "4takVv_PBR5xTQBfEHazt9ed67CpJ2wcxQ4xmSQy8F0=": "3279075000000", + "4tvdMuw1FXpaLyZeIz0gDzO0Y9KZpnvGTfXC-6Y0Tw0=": "453003000000", + "4tw6-vDx_CN-zyjTX0UIrOw04V2-6OfPTniG2Kb-e5c=": "2185607000000", + "4tzfVDfzQ4AdLJC4SFn2IWWWRab0AViUWGpRmgbw03Y=": "462687000000", + "4uF6Rmiiv-I0Ls7OUuDe2IyisBhIcjKA5EyhHl-_jec=": "384615000000", + "4ubGdC9PeY79ZJXmTQlg4SX7ccc428f5USLKzgEM_x0=": "460532000000", + "4uwVfySmyeyTJ8Xclkd5O_UUxPXu2Xp70G3kRPqEQoc=": "953546000000", + "4v9QHkHs62OW0DEWKhEkrLCIKbc7V8GtvxWUyv8XaGI=": "386370000000", + "4w2o50P1rx-fBeSMCDDLe9yFToi5QA3VjDIeNG7ZwXo=": "1863636000000", + "4wFsVOYuCanccPR-rl5iXRRyKLQGRDz0TCxqgWo1grc=": "2113961000000", + "4wXOyaZcihdQwbEaBmL294fMThHbxXzrF_Nt9XzxUmk=": "963931000000", + "4wqmBOOX3TKgzwEcH1XffURahcIvmeFiTa4ts2RIOpM=": "3213303000000", + "4wv8x3HgWn-9lgW-UAOH6cCaJ6ucdQEkq3S3wfASw4w=": "4166666000000", + "4x4eyA0yBTHGLUz6niTCrY6hrHOoCsiipKqeZy-XQ3A=": "384615000000", + "4x9u-RBFqrVfqCP07KCbA2EdjLaCg6Jr3kv35lgvrAc=": "499999000000", + "4xA29YoO934zxCD12lUOrpSxMhT-dxF6JpW8VyNf0Ys=": "759857000000", + "4xZoNqxGtKlSGeu0uYyWkpAoWvAFKT5MPVuvsQIbkJw=": "576923000000", + "4xgeycg1QaP7pS-DRsWEaQP6cUtUNRV3vJwv3Ij7i5I=": "413603000000", + "4xn8FV3q9n3W24FZdjy7T8OOWfaYuyQaN4sAQHKo8jE=": "5860686000000", + "4y-mBjZ0KyHF2eR1vB4qj5ycBKMrWGTslLlqNo6A7pA=": "406044000000", + "4y1WOw-k4Q3p3rT_vSMv2R6AqqwQKyRMdzLOTJUlYsI=": "490856000000", + "4y3uDEIq_8oVg7nbwjq87ZH5dTIFZONQS2NZFIkkPmI=": "3231890000000", + "4y9yblEy9XuouRdjlGIS_AlAnMyrpXcw7wiaXEb52tw=": "4701673000000", + "4yJJjRMUwIbO8ZXx2GGCMC6tQ187L9TMhMAhC55oQ2I=": "618000000000", + "4yVcr7h5idRUKIixTcT14rYvPwygceZV1iM2ltsMH4Q=": "831666000000", + "4z7rFOh64K3dwupuWFV8zC5M8GcKIehYrSHR7Z6dngo=": "639573000000", + "4zwCZxJc9WsbjsSerb6GN5STC6QZvjcoDIarGmWe9MM=": "420521000000", + "4zyVMVPYhDoC5mxLshdh-V3EIaHgaKV27JEl7DBm78g=": "1396385000000", + "5-2BeUK7X3uE3wUGL1O8d13r24gbrNRepraK58FkZ-Q=": "1483906000000", + "5-Q5zdX7-3PQ4B2qw8p-0zdCtEo1dkKOOGuK-4Ec3R0=": "416666000000", + "5-WJ_AzhmXhLlESbbYxhn2MGo8Md8x9HFytY2gwasro=": "527235000000", + "50N-8Ozs6eWdgs8Z89bVP-YB4rJVQCPdHH0nb7N5Xno=": "499672000000", + "50bvflUqQdjiyWrdYNnftKpp74A2yWAnl4nQsf_vuo4=": "379344000000", + "50fPUJOPUyT4utx8diphhI7bnwkQyvmOsUboGyIgXVY=": "468567000000", + "51jumusOTt68J0EVuHDuFUuPbm4_bif9itwUNNMwpQI=": "385506000000", + "51kKQM2T6oBbHqal2Ow3kAI9yOcuiyLFRq_1A5KiY80=": "15257498000000", + "51ntS2EDv_ePXLSTNqfajA4WfchlucU-iCekNl88woU=": "380509000000", + "51xx3mwSu70dOABXedB47L5WScN22kHPc94k3Ru9in0=": "11367159000000", + "52FGzOJ5Rm8kVvZHL9E8p7LshW6ykSuIJbqyHS7_w7U=": "470730000000", + "52Fa3NkSQ0S8Gubp3VZ8Dv7m0mwlipt8Ybcj1f4YOtA=": "933085000000", + "52KVsSU1I_zRhJ2fPWu0a_rGLOD-te31nPlL0utmVq8=": "2088147000000", + "52l2EED0ftRr87ZPFGfnHCpxeqrRGIys5bFbaU4uM6k=": "4221969000000", + "538h5uP9VM7ulHezpIdkPIJw-DFaGmKDE32HUvbTJxc=": "417634000000", + "53I7v0iaikgYpHKLhZMv9cDqRUZ-MxMbLQnTfJ6CQco=": "1657692000000", + "53PMp7Rid9vAKGL6WwzeTIOCGj8y1cSshUVPR1nyZGI=": "8333333000000", + "53VOWtzCe9MiGgg7_mfu82SK6qHxxrUDzhCD1jAYhAk=": "2237657000000", + "53p5ALGelRMc4EPUejvo4MMH3qtqX5xcUcitc4F61D4=": "1171212000000", + "53pI2zXmfiY4X-JfAny-XZB5Yb8ONM159hluPVfA10Q=": "1615384000000", + "53q7AzhVGGHin47XXJw4j1j0OFhPF7u0RXVcY90gB6E=": "468409000000", + "54B_2Cqwk5tq49hozb-jy5NYjhWuO3ZMps07fExjxSM=": "1153820000000", + "54IxtEI2gchrYb8y7-U1DWdNDtp3vkkUxz_dfB7ONaE=": "450738000000", + "54h3B2koBfE0_kGwUYa6QTbO8xd79qNRaflvVe9kHt0=": "846741000000", + "54m8zI-7eyiVWPQDr2DrpIjmSt3hE-kezMDIhiQju7M=": "833347000000", + "54n2MKjI36cFamWd-LQmepZjEvVeR_9Cqr5foajIV0E=": "470703000000", + "54oSa2AppxqDnA_uMOyC8_q4zQOXBZz2T57pmsAaTTs=": "456483000000", + "54y3xWiusNr6KBk4dE8gZAN9VoYtWpa50jCuREUzkk8=": "1648056000000", + "551j-jShz6cGtepiRd9ulXZr1_9KCCxvVBpgY_2F0a0=": "1880124000000", + "551ksyOxaF1GmGDEJq3xmkEEdxoPdYBKztZhZEe6TWY=": "1234575000000", + "55CLCzwgQ49erRWuib6QOxeL2dI7t5CQvIhA_8oOnjM=": "2083333000000", + "55MVPMBdzWF-8aL7ZOD-7jjOO2EQTRYxGxQhbQrN9d8=": "928743000000", + "55_PxIWzSYhXFUecILRfryH9zfFg3z5-PfA1kuDgE4I=": "1136390000000", + "55eMRwgG4Qhq0wtmmZ4OkmOlVpDnVVezhZjt_z2YpJk=": "836879000000", + "55fGgl5sFEuPXMHcdGSUO3krGXo5EnH5vL1qZQZSGLQ=": "459107000000", + "56G0MP-s1VKay-HRjD0VMzwEsCZiTLDRSmf0Y3JkPr0=": "416673000000", + "57QvaTjyQ2BjyWmwGe6ITOekh2cFJ76Ye0dtkyAXXUs=": "764788000000", + "58aEDTqVyh5kcMj318gFK1JATtzbpLMAZfNrnd2ntRE=": "4052144000000", + "58nWu1H6ouTrqgGdl7Pk3R8QTWCwbx2-ijolgSE2rpk=": "509391000000", + "592WQRlmH_9gDgBn7c5f6TQXk8a5S30GJhYU4HfNB48=": "454545000000", + "594Lb0y6UdGxWZP-ForVz6Hpetkd3XS0bRGhqSLmOPo=": "413620000000", + "59MPcX4EELb-RFkcRp8fWiPBkaoJ6D7WRVxLx2r9oo8=": "492927000000", + "59VAYHl4nSgqvEeXrQpR2jvt94zNM24fPycQEgS97Ug=": "908582000000", + "59wqzoQWG0Ve8q1x-6RgGrSBa-x3n3s2znY2kqkEtZs=": "385509000000", + "5ACMIWg255D5PvmEYu3D-T89rYX8Whkw01HTzS4Ndn8=": "388634000000", + "5AaLNUHcoilYHIQUhC5Yvcan5WNRzZT7NW8Dx1FzBm0=": "2513483000000", + "5Ae_O6RUSBcG5Fy0YqkqJkDSFrI3JJduvdZGmjBTx7k=": "416666000000", + "5AqKGnPLifbnz8h8IlycOQencZJw0oKKEnN5Bzy2Y-A=": "1808430000000", + "5BB1NSJVbh57M0SGc2Rilr4OcrZHSj6w1631FBlOr_k=": "744414000000", + "5BmLGj253-deMJt-HOg9EBNB1P8oCr_8Qin9AoO0gpQ=": "495436000000", + "5BvWWuUiLC8Fvava62X3DbGPGLQLgP-oxAdh5KMHnhM=": "380585000000", + "5CBzjUiiEs-JNFqvaajcxTjPsQrCy1begElCGJ1CMNg=": "3494482000000", + "5CiTgi9pcgO5o2GjI-gDtT147lX0rovBlMqxC0ZSOLc=": "602309000000", + "5CtQj2YBsYbw5ezo3Ljh2Pv9NXoP95anKP2jFKUsBqI=": "518304000000", + "5D-p-yvvIfbWBw_MlQ10VXr-5k0riJqRlK21S7i-y04=": "663946000000", + "5DJja49SmowFWM-Dt7k5KviUjjNkc2wNZGc8veX2Sf0=": "390193000000", + "5DTJzCUH190tUXSEvA0gl8FW68WqMDVDavO3SBaH7m4=": "1326970000000", + "5Df-pDmWnpAH7VKrZR_GBkxfPyCwtCUV261O-eu8qaE=": "1136363000000", + "5DogGB3EVd_UyV53qmcJuPiDN0OCWzlh9KpCFJ_QC8s=": "466844000000", + "5ER_szKotpvSYEDmEr0dTVHNPDeiAPSPCRTAVgI9O-0=": "376837000000", + "5F4DoZF2d9QrvaYkZUR_gKH9AxnJpSrcNMwxjJCBmgE=": "517171000000", + "5Fe-wTiE9RVok7rV8OTpupzyXOEeVcGLLtWgw41LOn8=": "5767700000000", + "5FjMn5WwAxVr3zqqYKktDc3151Tbaou-6-kRsuuJOLc=": "2055429000000", + "5FsYsnwwTuUWevZfjE0bTHFaJ-eTknkb3tYsZoc2X1s=": "418474000000", + "5Geez9XMSq4vEdPmTRXYtYHrFUIDsBu_qLCeuM4gDz0=": "384615000000", + "5HOpqVT2KafuNM6ZcebTyZZjCMZhha0ZKhTiUjj_Fe8=": "455270000000", + "5HnS2w2ko0riRG3dnXFEM51uBzO7BYGQoH-qe2gj6T8=": "407469000000", + "5IGYdM2gzyyKgnYl58FCC9iosF1phnfjgcXikDJw8To=": "11863447000000", + "5IWTFdMxqz6v2TNmLv_JApJ45EKsDvMPofohoBVn3bo=": "418859000000", + "5IdtoSuhLQHgZYVSp3ghxhQBVz_RlNMvAjOe5Xl8jmA=": "979224000000", + "5ImDU5jAHCnn5xvJSb0MtCElwil3VuzSIBBZbqevdQg=": "833333000000", + "5Ine-ciZtlNssovfFT2JEQhcV7fqLnOBfDDVCLYXZm4=": "1548301000000", + "5Irs9LkbnIGEX-RakkJxCwIvjETE_oG1Mpo1yVpWOMQ=": "1156520000000", + "5JB0d6Klm4sfgKJduxPUzuSyVVOl_GVTiCP7The0ATs=": "748549000000", + "5JMAWBlf_r2Zo9_3yVaX4P9zP0_st1ysRn7YP3K7ab0=": "386742000000", + "5JUVsoeSkQnDiGVNKM8eK8Vk8FK83Hzpm7edkd4QZwE=": "834684000000", + "5K2Yh_hYEHouIZdpDvuhBqotImqHguXhkn-ocW45rx0=": "6923076000000", + "5KAUvrwys0VkuknnH1sLdh7NI8uYpU-KxmIdkxMniUo=": "457497000000", + "5KRMlLUsse7hO1iyHYNLprSkiMIksrMMlhb1_9mwCGg=": "416666000000", + "5KVFfsGjk74SjreGpAgXXOBZTi796C95ztk52ytt1v8=": "1780965000000", + "5KjRPyGp2OxFyz00_oD5nNLGpm2Ik9jmj9aJHug47so=": "1157097000000", + "5Kmq8tXfK7QAWSJuov9w2Gh24nsztCPVXwI7T_jyPuY=": "503666000000", + "5MPerddZ6cknT-VG0uHKiGCi0Orh0Y7mWn-m88ajyus=": "4090348000000", + "5MhqHw_2zpn77o04YJe1OlsdPvn8mwH3n2llLC4wFeg=": "1661790000000", + "5MqFTtxp7ISRlxthIBYQWga4YJrXEpRNp8xQdr5tMmE=": "1945789000000", + "5N6tv5_qnwP7ZaGtp_jbDWycx7UUYFUkSYnjtlDc8kI=": "405229000000", + "5NLrdWTjdHqpTSpVlZIrP_njdH0w-D1VT3Z_0SPku0c=": "411085000000", + "5NlJXjj2UYOaU7_7OSsikRviR7TA_NaLAXOG3UsirG8=": "7670228000000", + "5OX-0T7SpOvp1Nzv9RAvcElf7WSsol2g2EFruPNZVms=": "458215000000", + "5OhXQpodXqN5D3FyeQWcocWdkExVvpHR5fyo0SCkJRU=": "486909000000", + "5Opr67zJWJMpbCDzsmiUJxo9VRn2cxWNhMNcBskfr-Y=": "892908000000", + "5OtmJy5Jwblqw1xK3eqPir6tzpe8vpU7zOJngUMPVKs=": "459695000000", + "5PaKA_4O2jqLl4BfkyJnj1b3lWQUUvwtjz81SAFGlCU=": "451707000000", + "5Pj8wX-_GdhatcaaNj0PP19PuMhxAIZ7ZGlhuUxSE_Q=": "398878000000", + "5QGHWmj_sKTOLEkYQ_Lz7pURsDfrxrNA7bL0mkdvHNA=": "1886724000000", + "5QGUFsK4VGCEGPJbPe--DlVqjkIIVhLDIUkVBjCEtpU=": "384615000000", + "5QXrkmBmjvdXgdYGTBo8pzWxICMr34jkNtqIWddBmUk=": "404418000000", + "5Q_Tc3buGLKhFjJAl_55yCVoGP0LkHgLv-92evEQXYk=": "769230000000", + "5Qe_zEKPpEeZuVAwwNU1z2ADWRs5aYoyUsoW0z1Dam4=": "415930000000", + "5QryhO83LroRGMjknqCrhEP8hQ0uqd-L36I_Qh2D2ls=": "405229000000", + "5Qt-g2VcN88LlOEZ4esLbNUfri1ly_bUw4RZ8S5GK4o=": "501826000000", + "5R8AGpGfQqv21JZ0ntIpZsEJFHT0EHfWtfjMCcWP_Ag=": "422561000000", + "5RcN2y4X7BRrLy9sXvD5vHbnKh41wgVw4HBPJFSu1oo=": "3664830000000", + "5RhMK_lOrqkXyvAfZbw2skqDzkI3Hkb6u7EoPFaV8jU=": "12540222000000", + "5S-JsES4kRcCo00V-2BLXUEceFbNinjbcCQXUdA16No=": "384615000000", + "5S0wLbaMY2DzwcVmk6e4p7MV0r-sJlcp35yedvcCflQ=": "475200000000", + "5SAvkh3k1aGVI9QBYj7aChzvNdZX_kl-U76Q5dHFRR8=": "415901000000", + "5SKDp-waEeIlNO2FArGk2luirSKKy4RXn1aS5XYLXUs=": "4999999000000", + "5SRZp2Ut466FYKAJ1OmGK-QebCoR_OilPY_ZPRvggZA=": "4166666000000", + "5SlC5Q2BBd1En9SBY9yACwhYcrqzBubpSs7JiAx6UQc=": "403537000000", + "5T7wYN4M4uV5BpTEJUBV6Mp4ubWF2Mp0hnBYgO8v2HQ=": "376990000000", + "5T8LPbMG5eglLVTj5gGh8wGTdpNDwUlKImOjb9AdNwM=": "1223425000000", + "5TDeCMPjaoAFm-nZseg17X6YM4hDD3IZhKYQcKfBe34=": "2648196000000", + "5TtvkWlAbuZ4y5ZAQfLAz6QjaHetrqlWBTqjb0V4220=": "1920375000000", + "5UGiyEop2-TshvuaUGONSBugZpBtFW34C0afLqbzKNg=": "1149445000000", + "5UIy3WrRstH09xHU5tCUh7eDf3FtWUdA0E3aPCQAHQY=": "573248000000", + "5UR-gBIAGB__RitssnI_DY0Z6dqQz-k5B7hnHNOFhhw=": "1999999000000", + "5UUIrtBe7N3wyaWvJ-gB3ZlA18A0z_XaaBiGtNp_tFM=": "1153846000000", + "5V48uh3uVWB5_mUeLzcLUR48_UoCjhW72f4zEVj7li8=": "547325000000", + "5VNhRdMbBUVRB5soursO5sth6geq7G92MQvzoZojHu8=": "1951675000000", + "5Vv7kRgaI_Yr5IQ35zbFaIYu552bO4ru_y3pHGl2L5Y=": "9072781000000", + "5VzxpyJKodyakbTgaXFpb_CQv0x3L9b6YLIuBAge5ts=": "447988000000", + "5W4Z6eHHSMx-6J50yHT67ez3Ag5meb-eLnpdt-1kSOA=": "421385000000", + "5Wcl_mj-R9Knu-Pkw6MuzSLUj4kS3jXNpxPTJnZNUx0=": "381822000000", + "5WdbCRm5SiOe7uupz4N2TwkYSud3zG87blZntE53pDQ=": "2076031000000", + "5X-PgyJzSnPpLrEGMMW1eLEM_Vvw1Jp_tHNzRGGhSps=": "1309889000000", + "5X0XKw53E1NAFs87QYYsKIM--rPu30MJy7bRnhAv0Fc=": "763607000000", + "5XfFNnWcvL7gkFwDIKTffCRBpGl-ZJgcGq2obhPnTl4=": "381225000000", + "5XotKg1piHnJ0Y0MCkL0HTOpWCcg3YxJ83RpiLzGdCQ=": "387555000000", + "5Y_hOQquVgujebGZ-y9ALDltpP8nf-gs1pZvL-8Rryw=": "423344000000", + "5YheUr0WLdG4P4vdc-Us7hYeUvcyQQo5nSXWXFPRTrY=": "393313000000", + "5YtjaWMZKX77_KIkkhsOiIt74xdBGZHLPxx7pLzLusY=": "1159192000000", + "5Z5IEJfAeItzlaMtOJruFm-Hr7yG8fSq_EfOMDLO1uI=": "385505000000", + "5Z86RFlaZtfGVrHBqD7imuj6zcIT3ecPFyGViPIKv9s=": "2375886000000", + "5ZI8dniHQgyz1N_M6wQa4UDe5imEg_83a1IFmlkP6PI=": "500815000000", + "5ZK_hThNqMjifs7eBh1Y6HpZiaMWEfewvrhQthfiTKk=": "833301000000", + "5ZM7I8FRjnmrSYVqgg9gQb4KZ6yVxbXIJ7hyN5v-s38=": "385348000000", + "5_916eTA5uScrFcISwBGTahZHngf1tfamZR4G_jH1TY=": "384615000000", + "5_Qq1QgymmUEEhxrCNwGsFhP2DYuUN93199elSGhSy8=": "4062731000000", + "5_Wg2t1q_ewmPqP-Cd0xS_3jUx-CVM4JwS_-aFNh9TM=": "4459818000000", + "5a3EKEPsudi7WANt8etOfz4rSI4kLjPVf0-N52DggvU=": "384615000000", + "5azFKC_0J57RnyZhgeRmPVnu1Zr1JqiNRo1EcdunILI=": "384689000000", + "5bGLv5C4xitqswZPlPYEHC0iYJF02M7R1itN8jj3Ui4=": "520696000000", + "5bIavng9y-nDULU8D5BMyuxTMva2CpTTgcLoyyjqUxo=": "482124000000", + "5biHIYIZUUiBHjfeKFEVXZ33C5gtE8HkXMofryRENs8=": "3191094000000", + "5c7C_p8rusXjNvBSgrs2VJPJAPNS6QOKrPw44J7_oKI=": "1136166000000", + "5cLI_L3DY2vBY1kw1QbnOTKxQj0YVdSioWTK2GCUiz0=": "384619000000", + "5cn-osPTuN1B-8SUoY1PRclkqbm5FPqWgKKJLuQW0cc=": "380708000000", + "5cn7fHrxGuCzXD_pKbeSUVwBcH6mcVyt-M9Dwnm37DE=": "3461538000000", + "5cyYiqxmIAjyomSH6WJxS0_6pYUR50tyyObD_GNPh2I=": "417630000000", + "5dHE1P_XmKQHmq0U-fgwkU4e5LjBXhDhu6FVv6BzZcE=": "424835000000", + "5dUYPjjN7GG5cNltKZTko-vpwA8zyaKlRhtjRm71ZA4=": "2085406000000", + "5dcXSGOY0O1DbKR6wrXY-nQdTgtuVghr8YX9N-abZh8=": "384615000000", + "5eCtYpal2uBWMy5qImTe614xx6m7AAAvjRKyNMc3HMg=": "384920000000", + "5fLWD98d5F_yN44J_cVhJNNScxNYaWZ-k3yJD2oZIxo=": "477261000000", + "5fV9Hywb00IVkY4eR8Th8TkUxDjDTLEHGVesD44bhLk=": "10428213000000", + "5fvbGXTNOJzRo_Jl3IY2KI8pq7ykB6VHBUSmO8PdOK8=": "416666000000", + "5g6Msc9E2fwxcV0zGM7e8O1n68gu6_oirhW1eRFaoJg=": "416599000000", + "5h9roiWz4kC9dNQtlSIqh49Cz-EttdSiMxPtpjgeJCM=": "393573000000", + "5hZ7yzIWiOCWF4ChnfgtdRRhTkwDA2tOYfgSVJa6pxI=": "6489427000000", + "5hf4wU9sxo_8fi5f1l7Y7rcIgMOU90AzvZqlkSO-K-w=": "3846153000000", + "5hhM8Hp1tIdkT94ssEJy5j_P-IqxFghl7HTSNZvFZyk=": "3250619000000", + "5hj6Q6sUYcIq3IXjVxn10SZv6L89xeoVi-Hm9XU0F64=": "3685627000000", + "5iE0NYBLiNidIHyFQ4ujxRUgtM3prq_CdvRYfjMU5j8=": "1252902000000", + "5ip1UhQlUnM4VDRi0YOUmsYKfPcbgDhVbG0sU4mx0Dg=": "833333000000", + "5jC_NnJ_Bgsgy7gJmzFIW2R68z8VE5pGqL091cDY-YM=": "1979119000000", + "5jW6YWB03DC7t0hewZH9AK42ldDZfXhrnhcm-HDv7CQ=": "386297000000", + "5k3gtC7oUhqfPgeCc3fpGiaTK8W5wTKlnXBo-vEenXY=": "458982000000", + "5kAYnqEQ_RfBIGodod1LbKVUfOt6GUCY7lX2OBAx2G4=": "382749000000", + "5kqY-Cw1M0eFf__YjOXlZHB8oI1v2_uaKPSovSLazq0=": "3390170000000", + "5l1ghqbwjl0YftuvDsk5sO8qNR4kxOajl56xPWpWQI0=": "383997000000", + "5lUjuAvmu7jvQfKKZViNOCSE2pGcfUUauZ_arD18vRA=": "379928000000", + "5lj3HhrRNyqyF0kHWEcwY9zbpmByV5AP6j0hcY9OLkI=": "381805000000", + "5lk2aZHBw4kEYcN96mP_xxpqTkdizVqn-ao4GG1h8jY=": "384615000000", + "5m8IMmswR2HrEsh91TymreCQk5Km0GSkr31JPUp7c5M=": "755638000000", + "5mJOU_vRb543jgTXz_Ri-4NKyIlynMTk-EAWN6Vp_kA=": "385718000000", + "5mXpxUfs_bBHB_sjT4oAtkf_hux08DsMjOJE37AIyUY=": "8365622000000", + "5mb41yFKGuV3U9nYTM-U8ErwvEQA93mPHOXjTiBzKqs=": "454801000000", + "5msJTC4nvWSToF1okm7JhUjm4LZSpLyGhTwxNWKPHw8=": "123701030000000", + "5n2RjBiqcf1HCoN7B-gPdgS97KZAA73qP31jmIksrF0=": "462839000000", + "5nlIgMdias_Q6qfAl-1IIx79670LLV9W-d9yPvobBTk=": "627223000000", + "5o-ZCYIpAfj8r2gCTmoO6cNFOTBb3k9PRFGRaRl4gO8=": "3754082000000", + "5o5VensvZCJFl_-Qe_mKbrAhf4ZTobcmpS3jYOlUKKU=": "455519000000", + "5oeoT2W-7Hx8ZZ-yQvhojM8uxk4Wo-Wsl7U68mXjrsI=": "472233000000", + "5owTQHFPP-vChQgOF1KMinKfnx-Jcb73bfYv-YfNpaA=": "385506000000", + "5p0QXVAaSvoqVEYZFkTxGjT_uZppWef0EDPZUslAYSE=": "416666000000", + "5p5egbK0UXssOB0_JB6Br-cC9G18-2TtcwnY4D1I9nI=": "1153830000000", + "5pi2UkMWbnGce9ZnOMDIqikZaitbdtYH7wLewGgIjj4=": "1249999000000", + "5pyOR1zg3b74Pph1os9i85CUGv9XL-3e-a-QxwnDY1A=": "5390170000000", + "5qlmSEQA9SuPEd97zE2Q2TAi03cawTy0pO-Bd2zbnL0=": "9112001000000", + "5qqODm8IMzH58olaPF-LQiUOT5-h7AMhdrVCyNxmvOU=": "3321850000000", + "5sNcwe-DPLS0cxjxGGrkige2RQOmmnDNAaRWruPiE4A=": "1921580000000", + "5sa_y8IIdAr3GAawJthYHeGSnXA7jh_Wyxa9QZ7XfaQ=": "2035234000000", + "5sgvZioCX8M9gspjhWw3byU-d_7fG5mp4O0wD_p2O3s=": "456608000000", + "5sos_7WpDotkzkP_aiK3J3HDnEXs7qkO3n7kQHnT78g=": "444948000000", + "5tadmOoIYPI3qgjumSqZCjPj_WDYq0zbd0z2rQox0nA=": "378879000000", + "5tps-4Lb4DQUm3ZcBIJxoNK3-0EcSdC3tNJqwtmtghU=": "7708780000000", + "5u6CgxMzSk_yY-5jWv_QRVUbeBkoYslKaUtmIru706g=": "384090000000", + "5ucEgg1D121P314TNPICtZb8nPEECpX2wx7Z-hMvsp4=": "1923076000000", + "5v2YJ3DlirY1ci-R60R4pxF-1djljEYvQZwnTGy-lls=": "464620000000", + "5vEiwd8ShnDqwJd4i5UJFL9caHw6EfKBVlJHP89eQe0=": "4715112000000", + "5vG7R1veVVehPcfYaY1vs_IxapWZz3JdvO2BlShSSMI=": "452942000000", + "5vHE-BYgFIVvgnmX07DhkEHmcBuiCx0D5ko_JLpLNxw=": "417636000000", + "5vOpD1xnA75t6yZYrLvfwltACMDMYlVCj3ca64QOqB0=": "1890453000000", + "5vOuWHmLYzdop6VbHfAZp7o9ivkaka9oko6U31KIFFU=": "1153846000000", + "5vUMiWJmun3b3PWh9pqb2QkzhWca3CvPxThwoBTdzvw=": "411085000000", + "5vUPa_nj3N4TQKQRnvDVo2NtmS7IQKJPjG95GudVfqc=": "1905703000000", + "5vaWw7Gjy80amEj-FIcaRxaKItP4PW-bc3Q7dxK0ZeA=": "458309000000", + "5vdLan_9JcrZhC_guMQIUMiIpKkD-s5lsYpRxRkLVuQ=": "450496000000", + "5vh_C1yvahdfe40R5oqBpEXiDSGi5LmK5xJ921rwlbc=": "926058000000", + "5vv-KdHHMMvsYO4WeHA3GOd00hhbA703vcHf5qOY0N4=": "405846000000", + "5wDAyoUzn9byMEzcabilJ-SMshA8cu0WpNbm6zADw5w=": "416666000000", + "5wFiiZQcvv75WugSN_BMScdmWRjKffg6dd8FTZn6cvA=": "385510000000", + "5wK7m41lEtCh3rSC_CQRRlh4yJ_dW5u8MrKgy8cvdeY=": "416666000000", + "5wLWVb10_5Vd4tqf_KiOGShGJldql1gKSVkl2nNASKs=": "738915000000", + "5wzBIo9x9maRRqaUj2rOUt9HcXi5RF8FFII8kNyNbBI=": "415935000000", + "5xW6JEi7749mTWE4gsvvWX_dAUQibLuHemY2Sdf4qH0=": "828477000000", + "5xp1MHKbECybSD0DEPFXa3cinUeDOKmLw1WQRm_Jaq4=": "498372000000", + "5xqLyWIOfz6WuXIsxVtIWAEmg2KTQjfSj0JyU9WXU14=": "20063234000000", + "5xs-OezwOHb7u1XiDNpL7qDpFHAvhzZ0oIgswEYox-I=": "462097000000", + "5xwDsaIiNv8XgGlXDzzVeCRhE4CN29UyGn2ku9w36Eg=": "391797000000", + "5y9_F3I9d4QVIEbl714W5JvDlNsZkSP0v5zdNqE0N4k=": "411085000000", + "5z24LT3JlhvA7UAJ5CSZkynp52vWdQOJN8guN33eKho=": "4879942000000", + "5zLnMNdRY2I6_sDHeqWsLSEfi7sp7aoTMhfBNcDh8RM=": "380878000000", + "5zZ-JhswAaSH7uXXNfR6rMGWpJN6CfSwNBkAxBUR_U8=": "421793000000", + "6-JMHzDikHCKONTinVk4UWbmDJu07mPzl4pq-9J9cUM=": "12692175000000", + "6-_yVBASRKhq7VhYXsCoeXQiR2Q5brYGaZxrCYStpSM=": "419856000000", + "6-cSwBJ-Zk9elhaJn8LlQCHp6Yc027IGnp9Hfrr0H2E=": "2366352000000", + "6-qEq5fFhpBAdK-rbqjBJ-K7uYrdpIZgrGllE3lP_ZY=": "384615000000", + "605m3PwBD87GSgxeQAdBhGY8KWzxSWvnar60uJbeAlQ=": "481965000000", + "60JLKJFlxKs5SMFQ-KUCZNjokicriBvrcC2b42VjVK8=": "764836000000", + "60REJQOkFi4iTK21nldiZqJDMQcOIbftlaAGt9tDe18=": "486218000000", + "60YehnGT_BpX89K-2iB9peXv56dwpDh98kvctf_WwfI=": "384165000000", + "60gKdGPw3XJZjMF5MMhM_3P0usWExVpHwbu2Q2rfFTo=": "455391000000", + "60wG88pQW0bYf03jX9TqZ2YHeeghMZ4H5x_hNH4gp1g=": "817604000000", + "60yjp8S4kd4B_s_ouQ0XLZSxT1K8jwicu4o6-syhzes=": "383179000000", + "611lqFF8GYYRn0JuocJrfhfaAJziyZXr5aJJZbenfNc=": "469837000000", + "61Lj1qAjYPRv6Z7tlaCieYb8t8YVSZ2VBDNPe-zhqFE=": "1623378000000", + "61Nty9Ib2Yz22y_qpO5gQKma1OXSEU6hi1KD6BvGkrs=": "584712000000", + "61OPXyGfbKOSnzjuVRyod69KHh8WT5PI1PkgDLyx0tc=": "381436000000", + "61mP5ylf6707ipjBLhM95L6AbiF3hRu22SstOES1Tn4=": "2122230000000", + "61tjYrcCQDL-3xhnJYh7-yGN487C_vM1LIKngZXbSTU=": "826227000000", + "621adCWo6bmoEFgyyKbLyngw9xifGOmmZAqZvbDRV0w=": "375836000000", + "627Agi2yp2t7MIX8RfiC2MPabHmQrcNTJ0EQA9o97IU=": "984162000000", + "62_6Nuz_pC1SzJs1TynlzH6fJhshlL5LPQMg92aUZbQ=": "460892000000", + "63gpQfCaKhlg8Cd1mSWTWdlxmat1keXxPw2tc2YR1zM=": "1156520000000", + "64Fxs6YzRaTWr34Z6QynBjqUqfYlNyuVy84Gdq0EMxU=": "393732000000", + "64iXEjxpfyS0nJzS0-Ev2j130DgwFKjiuZU-ocbDw4A=": "490157000000", + "650BQ9CVx4bSkOHQdu63W9QVsKt49K-iejfPymGqJVc=": "5659777000000", + "65QwwkZsGenAx4R6bQpzwluWFx6cyIkGiepsg7BwB20=": "416646000000", + "65XDppVBcrkXti1EKR34kRRocyVMWdYHa5iden08rmQ=": "804067000000", + "65Xpfa8-rDAsvsLCmsDRQLym9LjQsLGLqpbnq8SlImQ=": "1974213000000", + "65ZE_Q8DFOfyXeETfpCbkl4BnPGXeP54PCOhZmIEraI=": "2253448000000", + "660iWq3djkAx6R_ga5w6Ulo_1i-fQB8TCOE5w5KbE2Y=": "377902000000", + "66Dici9SFDIfKjhej5uLu6bLdGouQlTNPYhzl-w6NkI=": "502779000000", + "68-llL48dD0bvlKCsIJ3l_8lTJzXkqF4ft-9Lb0IK5Y=": "462687000000", + "68e0lw_XlMeOKcmmij_OBANEyqQMntRbkz9wreMmLV4=": "1946496000000", + "68irk781uRmzi9PpmINXr06U8sx9Q4zIVaxPOulX7z4=": "2176024000000", + "68uU33Gs-RZWzmgOa17LYV7aHHkVuPHIFc0U6PQJONk=": "4173438000000", + "692A5K5EMr1Vy0DodLE57t6aoBCywMVf99lrCfVqMXA=": "677908000000", + "69ZqErNUFL6f9da7bWd235PqzfcYD8eqq3ZF0VauYV4=": "394154000000", + "69bLWX7DQ0x4rzKURzwbQ93YqM1NRIevp48QzVmau6s=": "997494000000", + "69gLMaYxBVehV2dq4Oaw5KVG7n5aVDhYv3nK1x3achU=": "2262442000000", + "69mjqQy3gj12zO6TYsdyx0o3T5RkdV4ODHy_0ymK4z4=": "378086000000", + "6A566IhGVMF4uBovmjo0rZ-7PaZLNhr926cB8JLyz2M=": "4197861000000", + "6B7MPMHM7FeKv9GWXiCObceHmGUXxnGrnYracVARmk4=": "381836000000", + "6Bfn91dsXfmu-n4wHSPZS3ShUEVhYPBQmHr-d5Elwio=": "1011286000000", + "6BiBSpAnd2vJBy56fs_2YlPKnXsew0_ca_h7WCWKuro=": "385505000000", + "6BzAJbV4R2zDAkqPJpJFeu4004kF5FVCWi2gXI3HJlI=": "2499446000000", + "6CRjMsgtPH2U-2R1lpr2uUS-43naDir8PH6X4j2V9oM=": "4110858000000", + "6Cgg8hyIS7rorqr0-3USQ19RKDU7_APiZ1C401I5D7U=": "3846153000000", + "6CpLn1cecygNgOhTeeRC1cCBi-4aMp-Vgxg2z_2Znqk=": "1153846000000", + "6CzitkkzqqSjjOy3MUarWu6bwSlxOF1XXIW0WbGZQb4=": "1083757000000", + "6D6Wow5IDaF39hivUmXkgqoIHinriIB_NhFNFJ_H11k=": "830439000000", + "6D7XKwtdbHuXic1105Kg-jU_pO7J_ZCtEWOizdyXBao=": "500385000000", + "6DITrNBEFC0rwzOuf38JNeL5Rpqcr-bj_SR6XoGYQCs=": "627506000000", + "6E4fcuvWjsLdjEpaufusZHUmdHxHfDhyDTL2gLfRImQ=": "459646000000", + "6E66R1C6FRVFhEIcgQjWXLSPX4IRdOMDgYILr1c8h7c=": "546532000000", + "6E83eZsljxcqO3vpYxVJxevjaYYzKL25oFDp5VWTp4A=": "391132000000", + "6EiJdKSb5IlifH5QC_lNh9fZGL-Ny9OH1qapqcL-Ieo=": "1968983000000", + "6EmbU8nGxKQy_Ws6_MePPGIMmesev12w9SeP2Q5w0p0=": "451406000000", + "6EoNKqbvoF13ZfoucMKlCNchtgIbw2SQLjfyYNakVZ0=": "384615000000", + "6EomJj70VHSSoamieb_93Xrk0nk452GsWzLnIh9BJZs=": "4072694000000", + "6FECLE59D6Nfcg2uyfpZCmL2JA_YL64U--2Kz_7bsec=": "2442525000000", + "6FEvB56kWhNV__7pTqfE7pwlJXxRXYM8ijI0HzyklkM=": "20348678000000", + "6F_0E_wLXft4NynaATh_sxipwp0y9plv2kf4HgHh9hE=": "2133408000000", + "6FaizCGffewY1c6FI4IdoWqjlM3sPQ4-a6gIxM4E_Uw=": "769230000000", + "6G0K1HVjpv3U0SEsY2riucnrzQDZsvo7uf0ehBQPEa4=": "1153529000000", + "6GDXJLecozzeXd3VK4JaJUEGu9eAe-LDIL74RDKee6g=": "457031000000", + "6GO75sYyLKkV5Gpz7VNFzEFrSBa6hHy22csmlazJT_g=": "642211000000", + "6GZtKPNDzSDe-xlT54susUZXJ3UkMEP8uMy4WPmzYVg=": "6041637000000", + "6Gg3QJL1D0Rj2_H9VIhDaiM9d6pt5Lf3phsv--PQvuw=": "406167000000", + "6GkoDiXJEDiz9W1K_J1bzkV_wrIRspJbmOb-K4a3SJA=": "1157284000000", + "6GmDa_2udnM-ou9n5MOSlHJpMibazpnOEM71n-5kIEQ=": "1050424000000", + "6H-6V24sN1oP0yacAlzpS_XKqSg-LGBPIhHj-WtVBss=": "417633000000", + "6HZ2eksN085QG13jAE4gAMBPO8-2iMfjnoqpF_DPb9o=": "1151917000000", + "6HZR_HoOa7v2Pds0hLe1WnVTwSBRZWlSWNbZKqcJv9Q=": "383069000000", + "6IAqU4gDaNFXKp66FXw96vU6PP478pSghJ1J4kW79Xk=": "4167006000000", + "6IUvBOASTgKTRUxx6x4JrIqAku_RjXOyhUPTcuOn9NA=": "412618000000", + "6IZFYEGHtJ-rK2oZEKSSAsKunQZKiHlnd0eddVAXQCI=": "625272000000", + "6IgdZCBo5V0UduyIncgqvgmlkXLxWf9gbnMWVCCkwgE=": "1132077000000", + "6JTS7-DQQ2ybppOUDcKEaMBpeg5Dti3DeWGc-4q69iM=": "1153846000000", + "6K24Eea8LRl3oRDFzMGMwNZswYcwAo_qcuyMaqorgCo=": "2320523000000", + "6KEbqVlPplTfXUoyJCXP3Ul-70MV9ksI965PDXT8KUQ=": "416673000000", + "6KoXqMsXDyVpesHwCgfVEIe9LTCVikx1iBzOh6NZqGo=": "902926000000", + "6MXqmUeab4Z8Q7WUf8KMUzEowz_N4-0KK3lZxWOiN3g=": "384688000000", + "6Mqo8RS80mx2kkQq2F1ac5MdKtkCe9rSV6ET7vWdhh8=": "756212000000", + "6Mt99wqpxvDUxqT2WCQleznjzYuQmRV-qPSRTibdu7Y=": "903715000000", + "6N44hUmjvRQJCD9XKPKlCOFe9TZTPGVd135Xj04Luv0=": "8249146000000", + "6NWIfksyzr1tJMPTX6ErxvCr7AkWnXWex80Tu7NNkgE=": "1818181000000", + "6O0OvssVyULS1REzHTpZ_hzguOOq8HhZqifD8HJb8rM=": "470699000000", + "6OkT-b3IUeyayngEi2vcON3Ns4fuSF_br1nsMeQW5tY=": "11337577000000", + "6OxOS5tAAmEVAZIv0At8W2uOwPQ0A0TdkQ48MMigSLc=": "32290884000000", + "6Oyokb5BqaDHbvfP9V1E2ZnOnMzCjarzBckWhmVZ5GU=": "761623000000", + "6PSRk_nA36u5BhqtKjO6ONlUoUeGMFL0JttSOyWKCkc=": "2469861000000", + "6PZ618joEPDhxPt5mOJu6QL3d4vsUFitD8a2wZQgCQk=": "2261852000000", + "6QDOhCQkWQQ6LrjVTWArWqXZRFgOb_eV0FlQ0CNCS3A=": "449980000000", + "6R-xZZS_nWYPByURdwdnx3ELXc_GEoYCtkdKyABN-ys=": "470446000000", + "6RB1p362cMP01OUbliBEW-GL8LqbcdGhDHnzcPVH6kg=": "411085000000", + "6RFUgTGonXRJ2pxUWJmXStvUBMnBr7g0yPkH2rVWizc=": "11678653000000", + "6RFlPqPf_MK8cbVJaQVYjVSMRiXAyyHBMU12AKcr9V0=": "394620000000", + "6RKc0bdQ1_SndR3dqFbI1O-_PZHm_lkustS1wpbRgbA=": "455383000000", + "6RprqeKdz-jEr02jNdxvkP1ZTPtpum3oe10TsJ6CboA=": "5014959000000", + "6SIKPnQc3U5ftrWTIpLx7qyQ98W8Y04U_OrihFBh1nw=": "454545000000", + "6SM6_3E3e8FNg3He8at-glBha1rEFSgSd4tt9-DXCmY=": "411085000000", + "6SOCFyYPAiGkzciGkWH3oZjfrXlc07JrfrnqhByiTuk=": "769230000000", + "6SbJf74DyP_biWP96b8DpdGsGuwKxBsEOgFmIql0hv4=": "417361000000", + "6TDIocNpw9L5CPcwiOsEGHMiC_RiszPgaBvqq9K1fnI=": "382737000000", + "6TEJbJpjBSmiMw1qXw0Lea604FKsUn8BGY3iI_Joy2Q=": "1374653000000", + "6TVWPc55m5joLTwgqMfRfcSP9BlJHGtPQ_IpDMbkEfk=": "417636000000", + "6TfqiYd8rriG2in96b8JLh5DwuotMqNni8uV5W6W9yo=": "4196757000000", + "6Tmx4P1ix3TtYgS_7kd4nQcyU4t0gkCKFr9PWsnjHJc=": "382544000000", + "6USxz5Zmlz0zGTidnocRod56cwNVxvoCgLFuWBrCOMg=": "775861000000", + "6UdDMKFugBXko9IjY86DkOB6LboQbnoL2lCe2NhJPxU=": "450738000000", + "6Utx86R5Zwq7CwMNSyvW4zsshHZogo05Vki7zNq078A=": "450953000000", + "6Uvo2BpjFsX439VsFNE1hDJKW-bOvUMg97t0NH4gDv0=": "458632000000", + "6Uy6hUHPlULDE7Jr1hzb03NVEvuy2KzbpY2LYpgRsgU=": "416181000000", + "6V6Zvz2rgq-emA7zxNu-Gxbx6vyzvbSIV8uOLPRQZ-E=": "480183000000", + "6VEECgLFseiZhuMw0LwPYGXlfWTH9JZwPOYtFpjAN54=": "1927533000000", + "6VHWCDBjRW12QYivRnY38qTInKW59XexxGLRCbrcYKQ=": "576923000000", + "6VJoOP1wsMIBRCG5w-YJH9zGsMriwGdgzgpaeurSdLM=": "918273000000", + "6VSox4FEdddKL3CVOLoTmrvlIIbV9050MCKgU-XwFck=": "769230000000", + "6VgKGtyKLRfzqPI3mtOhm3eJOkvuIM4kVAvcYy50l0E=": "458016000000", + "6W7Hoel3Da3u3K5HCY5YyKg2e5rWu-64zits_y9-m18=": "752625000000", + "6WITdmo8H1eypZ8lnrALUd80D5FDC9haKKtZaUCxdx4=": "384617000000", + "6WUug2fgRx5fXkePD7-w1_1RkrSEeLrMflEr65V_Bcg=": "769230000000", + "6Wis-pbfXrlw9u3EO1fryVy6CNceceWlwX9JfCrA_lo=": "350959000000", + "6YJDjKOZsLgvvbuUJU0VUNH8szYNS9Z3cl1puJR6bpY=": "500786000000", + "6YZ30C1NRCW1TbVW3cP2n65MpgoF82Dd5u9CS5VQubw=": "377810000000", + "6Zc5T_137gzAr-Ok9YtLbzTu9hz3p-5FJrjbfpYPLAQ=": "2086531000000", + "6ZxhS9VhhAiAMrO-A6_xdPQ6UGw3pKpyN1be5JLhhT0=": "383170000000", + "6_1O3NqJH6bG1TZJM3orMVP5JRH1w9YILGckk6y6Fbc=": "9164805000000", + "6_PpsBoM2vrbhe9mM4qFkfU3mA-vin_6WHkiPfBxXto=": "384517000000", + "6_jVgvn02A2r9jDDhrNL77by5oTyVQNLCONmlZiWxOM=": "2318726000000", + "6_xdjbOaL-gaWrx73wDrF_iSpysp76hqKkURXcdx4lo=": "770052000000", + "6bYpOz3L5brkLr_z2j408rJLXTHW4TC6kgFrBH3k4Ic=": "411085000000", + "6bkCszFdFlm_o_QFXJ_olQU68xVvMD9jQ519xlTghDw=": "384615000000", + "6btSaCphcO5VpStYUEQV4eIaJ-Da2JAoacnHfn7efyk=": "1173884000000", + "6cBhME67X82hcBsQhXYHdw3FIzkSgU5i5jpAp5AGKkE=": "1927554000000", + "6cCEHk7CKt0OUDOyqlsDkyfULQojVB17qKDC0y3H-JU=": "386133000000", + "6ceZg0zEe39B_-GITw0lYR12euxK5X-PF2jECjlrm2k=": "2115384000000", + "6cjYrB1Yq2-24Vurtvl182qdCNuzmafbDwWDPt4BxTE=": "412229000000", + "6clUe3aEQoMqRFvhmXjsGRC8SyufQ9-6uIGc4Yterl4=": "423368000000", + "6cpged-wB-DpYXB0jzqZj0-5vmLgGn8J1olYd8uLWf4=": "789328000000", + "6dtAhr62kDO6d1in04PrqEgVebs7V_zTDmpNqgglD4o=": "384615000000", + "6dx1jWre9BZVF7rDwkWlCoj4kv3M8YlxDPPsmEO6AyE=": "416666000000", + "6e7hGt6HTSGred8vJAkODyxB2c5TBF1RVQbBGA3HXBs=": "795454000000", + "6e9rWB2tHYfq2T4fOsOaDeg-ogQ75qsGEcTzAw616Ko=": "384615000000", + "6eAir4PD23spijwvZBKg9PtRcuaHdlkTcM-R5tu3q1Q=": "1249543000000", + "6eKVDXbjsgJ1bFEzUVA4aELm_9RwZAgrdkIZUwneXuo=": "417364000000", + "6ephxxYkQn0ar2MloGsHsRxQH7P11WFOYOWF1pTKsvU=": "384615000000", + "6f9eA13xFPd-6rnr09EsMJWeGLJX9-itG_q11FCjxmQ=": "492944000000", + "6fHgWItxe-llnrU_w7SzMPuxTy63v5G3h_34ckfVkXM=": "384615000000", + "6fQue2RvtvUS15Nyn1J44WArwKX82k-5GUL2Y7HPZDI=": "1927537000000", + "6foRjFps1zzUQj_Lj-cJZNwu9oPXXaVIib0njqS0Qwc=": "411568000000", + "6fqefQvafaicZMkZAT2ieXkQrHd55oZRkgCUS6GqB9Y=": "383497000000", + "6frlHxbjSyB8SDWkezKDRnGyH4ZAcJ5tfRxxAeni5os=": "651266000000", + "6ft1e7MJPI3XmQOFfZq9o-Q8Us_j9euv-F-YeH3kWxA=": "463394000000", + "6g-6iJ472Xph2B-o1I_OW_b362Dmq06mNrotuKSlJus=": "692307000000", + "6gOQQA2h1dGvUf_or1MubK8dmNt0GWuB_EvAyaydL0M=": "410211000000", + "6gu0goWD8shK_KQB6rapMLatmA2jTNSeo_yuYqRHpyk=": "466384000000", + "6hUPGyO1LINPH3CRNWqmqso9zgNq3BLDG-X5nzTFhZ4=": "384615000000", + "6hX4l4Mdvj49fwZvHj6RgD6iJkn10NBjx5zV1hBuVQk=": "382870000000", + "6hzsG4muQwhQBjf5gsnGiliRlo8RgJKTu82HEtjxpgA=": "464104000000", + "6i64t9iMuM6JYdO5eKTI5bDDq7GrH-UpxhVKcbB_LFM=": "5267998000000", + "6iXm6baXqtOGr1vvgdIz5dyYTksq01AlPDHErvH9VWg=": "576923000000", + "6jDl_Lal8QZ7g9IlyXNF4S4cP42Q_AvXBAd1KNj50lg=": "911480000000", + "6jbKQyTOjhGrFaSCwnMAvhF6ArV2uRsHvhZHD4Ru-sQ=": "4031982000000", + "6jg4niJhJPivawNC6d5L8un0fqBxbvmjEuZJ1oV9l70=": "5028864000000", + "6jlh9Il7cnrzKXvtX7oAjlXy6ztHoIBCFJud5TPqzZc=": "453401000000", + "6jrnTWDjJcuR3CvryDFIYBRX5nEG1Lh_FamUcC48u9w=": "928209000000", + "6k3KuU48x6RjA8ymtVLkjzam7Tfrl1AR1KNTvPkktPw=": "769230000000", + "6k6dBjI0LJTreJGrKP75ntPdIX0afL_5ZxtiH-hI8I8=": "469949000000", + "6kH0qFIRjk6H2zK_7HRhzsTwj9FL33MaWO9_GATbh40=": "1001940000000", + "6kQrnaHD8412pknG5AmSra61grujYTLyf3iUQGOVSXE=": "769230000000", + "6kZJFgmQsxKduGq0qwuWyT7_n8ZEnTISMbWdb5uhAQY=": "3846153000000", + "6l8jEFh4yMv9rqGEp_VXqmSzXnr9PchK-SaFLeGofhA=": "883836000000", + "6lHLmOLsSeNEWZa5C2CcdfZSiG4lm6dMY0rYC_MFsZc=": "455125000000", + "6lJpc6JeWQpS5beXwOuDXsgkc1BCCRsePFzqgVWb5-o=": "1923076000000", + "6lwCpo5l__tsdrt7jaH5rLQdpdmVUsTS_00DpeVk2mw=": "454433000000", + "6murL0u5FLDH_grSp4okFMptI4jbrQxCcuxHFk2Qzo4=": "382059000000", + "6mzJx-_acci7qMPeuSfNq5bKFFOGlsSxn_pslfcy4MA=": "384684000000", + "6nJP_gigghHO4lFFtF4VoRLMInT5NRc0VR5mdULIEfE=": "5769230000000", + "6nrTi_upPzH39sDoRI8EnbUgCKzBu47-JFtgLRrJQmA=": "385510000000", + "6o93ul-xZLP5qXL_Wwe-v985-bNQWK1Esq2oR0r0KPE=": "1653216000000", + "6oF7TVRcQjBqaULusJABQKIfnJgEiWFCdaX9mOl57PY=": "746411000000", + "6oPTzkaLessyL2UojRWGuBolkCRTXh0HaxFjoEtA_M0=": "458402000000", + "6oY-10TVAKdk86LB103qWoSfkzu-rjTKglpdm3F5P9Y=": "2017332000000", + "6pq2sqEwBTiLsgSXJC1IwOTbNJw-lFSV_LDNHtdoAmE=": "1951054000000", + "6qZIxIZk-NfpvO0JJI1L7oVpeSV07G6u2kuVg21NlqY=": "385506000000", + "6rRCWGamm3vi0WQ6RIt2tArR81nrWY1Sj_uwozqRChE=": "3845053000000", + "6rhP12f0xGsl-6xdEgTSm4truYRGJY1EJptU-sAvvXk=": "384615000000", + "6rnb9ji1NduhNh6XQRUjwE8jjOUJOkXv_9JMDE9LmDw=": "458120000000", + "6rsoMj-vIzSK5GJ6GLOutNrremVzH8z-dobeuMo_T2w=": "1257695000000", + "6sThHmzPx7UeRMVS3q_7jDdvdPM6Ua8_sRD0Tx8Y4uw=": "2487538000000", + "6sZat-45e-0kT4dLdkAptkRnZgRFy6w0EJUWG4RcfGE=": "3081988000000", + "6sorQg4bXz6vr6Hyjus74bI_1UEG1-vTJJ74cP9sVAM=": "3999999000000", + "6srKgUszxDgepuWyvCDMY0WoKLmcVR-bXncD7F3ttRM=": "5104948000000", + "6tB7ajKhR9u58uer349_bXV81z-ZNchc29EwwJqJE1I=": "462146000000", + "6tX7etIRqhVk_qqX72MuDiKKxTuG8xN2hzLfaXsVGAY=": "385506000000", + "6tx8Ys2HuR3Yn_F64Lc4p-PLCeJeVb3VSYcS9PKl-mQ=": "5005400000000", + "6uLQMJ0QZLHgdgL6ulTpr27UjTw6sq6xwy9vp8F6_6M=": "4637772000000", + "6uLXX52042Fgazc34m8R9ikKPE75PFDFcntdQSeArbA=": "712965000000", + "6u_AzXaQUOI0mDVBr2w1AGxzvAifR238A0DvdqZo1rw=": "382479000000", + "6vVfEKLarGSbXKWC7i5XmSNNXvgwapiR0b0It0p2aOk=": "391132000000", + "6vbhQewTEwiY46ytfMHGSthxW0o7dqas5T4sH4V2US0=": "464230000000", + "6vjFFgBLTHjmLAHeC8TuDVM3vkOXJFvTu9-zGe_o92s=": "763562000000", + "6vmE8fojS25ThmnubKn8_AS2NMpSP_KLMPARVkDr4ew=": "792906000000", + "6vqMcyxmV8RDwOxNnaZD70gB68H8sCHF0KMugY8kQtk=": "929128000000", + "6vw5OTUBEUdz0NUGvY3D3pGMBEwLYP8WGHfV74yW_s8=": "7059074000000", + "6w69CWKaJmSuDtdKPeYvG-Fj0jp22tGl6okkNZiQrCA=": "934564000000", + "6wFqXwJ4Y5BlmdgjGoO5etCzVepnJOYQ-nGudJHHh5k=": "2301482000000", + "6xiW8paEth5jAc3CBTbEAKLFgssZim47Pf4XCUVzbrs=": "1924734000000", + "6xvi1eO2U-1m9KaP2rWHixmla8n9s3Q4XUPFGOZlBbU=": "407808000000", + "6yEnPUeGAetBHZjywOnhh31fXtnqI7NeqQ3CrBKVALA=": "428293000000", + "6yFKRNK-HgiCAPyGBbqEWB7KTzxOOIJToDNPw-OcWOA=": "845123000000", + "6yKjnFMhJ26M-Kv9kdNBc0ay9To2mYDb1UNQ6u-Qm6U=": "769261000000", + "6z1yFQCdCsDde9HSiMBcwItwNVjbf_s4oGiF3wW7nfM=": "385505000000", + "6zMekL9IwIsRQlBPUF5eHrWplw5mhUABtSEgItt67mY=": "384036000000", + "6zWVBRT_1GRMSUivlYnGTIsVoxt0iwFDe5VPgTnEaSg=": "472248000000", + "6zbj6c8Js_WKjfVqsbW46leXpUxGY7tAFnL1tgZoqUg=": "930618000000", + "6zgjhbkuzlkEea_rvDHve-UtR-4eObOckM8ny8oARv4=": "522041000000", + "6ztSwQxxMZgrVyNCkrWwMafLDPOFwBg6Suxkoyz6mN8=": "1345596000000", + "7-MD4qWGciu0E349CXngaw5LqNqBQJLJf4dBQDQhnAI=": "405229000000", + "7-gMkihjfJqMjlIXqwrKUOQ7MD95GwS8kvpFqlpY-48=": "385508000000", + "70RUwtUF4WenubLQKw4FtHFe_6wkXLo5-zqswPg3blo=": "407560000000", + "70gruJmHJNhOXgiVNz3AhgyCvUvtxqCdjHwU14yD6rg=": "1522622000000", + "70y8egMZmMWChMOKN0_ZlihpNro-wRLiGeWLKnfe2Rg=": "473265000000", + "7146B1BOLfk0bG5fd6liuJMHPOPb4-8qmgxz-R7zctQ=": "769230000000", + "71UEV-XHNbmWbHAuU0gu9i0mrtSruB1oK_uhz-vLVtI=": "411085000000", + "727aSRt-0qBJElv6JwEdB-ns-4eEffkcEhQAOB_oPNA=": "384615000000", + "728zuduabdIVibvXP_LA1DfY-7l-2LDZdtZwLfC2rbM=": "448797000000", + "72drDjFrTcTzgr9NvxpPvrMHuK690xFO_bHtkKvLx9w=": "807833000000", + "72f8-FHRgLG4gXsRkcuZKDwHoB-W-6DYne8zQ8u4EYs=": "385510000000", + "73AmzW52_CcBJ6eC3B7Ij3Fam1Xqw_miZboNtrblO_g=": "384661000000", + "73TMHy-6nt0ZQq7qNcWZapKL-Jbg-JtZcSUnEtgcpRY=": "385505000000", + "73emYR1lToRvS2R3yGWijfldMxhkYjYPdhMmIT1poZk=": "1878876000000", + "74G22EEyH5UPOCS3gQ9U1nZudPnss-derKr_C1ytB44=": "1238186000000", + "753OveEX0nsmYYxL4DO9SpbJsNYKueJXMy8SlaQorrc=": "563336000000", + "75Bg4nQl8f-WK6XKMfbrHQffSFa_URKmjd6o-39icMA=": "454545000000", + "75Ftpxwwgt0rCRSUK7UdZ11837dV3QnoQgL9B4VeS1I=": "769250000000", + "75SFGLE0c_wZFiZ6VoRnKgoYar4J_aruamOyrZgN9Ss=": "376645000000", + "75WyA60Pf0gs0y3w4N8VHVph_dBC42HrpjjBYlIkO9I=": "378821000000", + "75y51aXiVhW0shL6VVaSDINGNSptI9P-SYq25x3-Yjo=": "655097000000", + "76GwiPYxL0tUvAGJdifkepN9M0CAUvNTFnPvuBtAYzo=": "384615000000", + "76jbnYcM9c--jcxJ08fdF2IORBvoUiY93jdOu_sGXx4=": "449742000000", + "76tMJ_RIaWcrybre9cJMgzvcMT23s8qa2HF9KocAxI8=": "1002799000000", + "76wkQKHj66Cblz7ddXllSC1gEHSRcxxkvxz1LjCD1hA=": "845357000000", + "77cYlpZCeD89Qwcn4e8b-qswUDMYWCdwD3tPT1UilfA=": "385510000000", + "77f54qCn1EFt0C09hJjbHoi1dKod75iFglB_2UtTLUI=": "457480000000", + "77rf2IlnkcDgWAuOXasp2P8UgNeThUCkclmvcJI4BAs=": "454545000000", + "77tJGN9F0bMh2erZdy2vaNEL235UJY1RpGoBH5FZcYo=": "912584000000", + "77t_kFCSNlP7-PLfyGgeDFaDX4Z_AE5fAXjXPCHiYJY=": "1637992000000", + "77zfOhRm491B07lxGGKZXKagzoDGtPdJJQ09NAXBye0=": "4156385000000", + "78jezzxvy1j6uPoyKRMt9xol4yOo4HJMQm1GjsKEbfc=": "9608394000000", + "78qF4u8_vFMbPpclKsbTYJFpSZmFde0L6ihPZsvmC0M=": "415906000000", + "78tYlBwGo5Q2v4Km6eddQjBA4gTsJyteX_WIBfXkY5M=": "377583000000", + "79r4y-VnDuC8FQkYIaid3WbmpfX3BOwaE2funM_PJ68=": "454547000000", + "7Aja1N216E1kplJbn3U-VpdDKFOeFFJkqoXySCdNwNE=": "823211000000", + "7B3Z9b88vLPeDleSVwdn12LEHjhaoH5d2WvED6E4-Ss=": "1156817000000", + "7BCtT2_kD-AMtonMD7NtG_z9a17PE5XC15wtBd4A478=": "3846153000000", + "7BtqJk7-V-gpdA55-d8g8jBH_S2sKmya26gPn-PvMxE=": "1926802000000", + "7CDNJoGKhuyaT4ONlkWx98L-DwZ0ZXnI2R3OgIiW6rk=": "416666000000", + "7CDtbENLdeiAEdAhAvD3gduozOlq5Gv3xJr3pTkdzWY=": "1150599000000", + "7CSCi8HRorJUEwzoT5h_yKlZel1mHIThQfdxqmEmbBo=": "385528000000", + "7CuPyTuOhZ1cVgysiTWJkzq4iKBYWKc7EuOwezWFWZ0=": "2265787000000", + "7DDdVhUFxs-lL4EhzDyJ7nrpfuSExIGsIFndl7rMPlQ=": "557477000000", + "7DE7lt6JyQ_RkK5w2Tsva-KLbwnF3WX100Dm802a9Ak=": "382476000000", + "7Dk9ihsCN4jR6ng6Ac0-MN0LHogkA3VrT7N1pbgEsyo=": "961525000000", + "7Dt2_sIlje8ZZ3Ib3OKpVDRRfSOL7xjiI5R-efTvMQM=": "390975000000", + "7E9B-AqJDcYF9gMlfqInlpuPqP3SA__rOAxsAMBde9Y=": "499880000000", + "7EA7t2mb6q4FJUVErK6TZj7yn1JcGm0PkTd04ehpMPw=": "383887000000", + "7EE8aB7a-lr2pN4zXmcPP1wwkxYUVk4YibDaxSQ5frM=": "384849000000", + "7EqTXodnkqLeabwDl5ISPhTJQX5O93TmJSKogOB3cKg=": "384615000000", + "7F6CuuremUArcOnhllxJE8PWXaKJc8cRgmS-Br2jNtg=": "1147439000000", + "7FAg3YtgrlR5zBMcdP1wUw8CrLCOJ2HkO7_ot_bftvw=": "924911000000", + "7FTFDLeTDEhutvwiNyCBfYc0sgtoHSvPqM3Y4V8pgQU=": "2082341000000", + "7FcbwNXqAOxG5aG-XkbluTcfgBSUHl89dms0Cngy7oI=": "382394000000", + "7FfW6LfD2IhyEoKGVQglPJ_FoYPAlKnpu3G5vVlPmjY=": "10961522000000", + "7G5CxJKsOupxYvIG9lDF8xG2E1e6x9L5yElHQux4LWw=": "378821000000", + "7GarNxLCPZzXRFMj0rX1OXq9V3Lc1IhkwcgyLO34G48=": "441049000000", + "7Gq4MRcZnqx9btB5qc8DxhPk6thGaAfUtKM_iLFqjuk=": "1153846000000", + "7HQPQgLa1R-mB1IoQFlQGihs51Zf4fO1O1nv7SPdasc=": "769103000000", + "7Hcjr9PP6E8bTnXm9Cxqm0xF12cIVrP-5rWRCg2TAM0=": "1542961000000", + "7IHqdX8y8EcqrgnqlDgIxKLYYzmdfwu23Mll5jRapI8=": "926808000000", + "7Ih5G6KzQWLrPDatnuflTdnGBtBv5zJTo94Oc-gvFek=": "416744000000", + "7IwutpZRCY5ibojRPr1EbStvpmrgYJqXIIdaQT_VK1A=": "383902000000", + "7JUv5veg5hx_4zIlByEdQOvemq7REF050LdL7tlvTy8=": "5163446000000", + "7KAIsgj90u8Q206WfAzZ4ISfMM1WcxGJNHPXT0XLUis=": "389386000000", + "7KQwEPWCa9k3TJGyP6g6GlTkKjMS-d1jwTB1WvBKgRU=": "10963305000000", + "7KUAuv3OOMFKurwBx2jqpAZ6-a59fmv5iqXVMjT86g0=": "823211000000", + "7KYI37IE21jnYoZX-6WxiVt1_tPFbECoBMuM4BGW9kU=": "1539573000000", + "7LUY9Th-UiIEAeoWciDpyyg80mLMJQjgvO9FW76T8PY=": "2310726000000", + "7LlIEZpAz3gmTio1Qn0Eo0mpHsP3wOBZi3e22bIz3io=": "385505000000", + "7LzF02ktlHdTVm3_NnfV0f9dzVZCR6O6i_4HWkYrSuo=": "8195048000000", + "7LzbxVPj9S0Zw7nvjuJykAhpSQty8Ku1PSj9eJv6Rmc=": "555632000000", + "7M1ZhM2_oPZV4kSOGFl8_unbcyOSKVs3KYn8pXN-Ofs=": "454545000000", + "7MUl2pvpAVq29PTIllYuNL2sQnZVYjAD3pD7RVzbjcA=": "3758700000000", + "7MhZAjKAquvEO0xzkIYkWBYB9odm6mpT6y0QKk_GiFg=": "458870000000", + "7N2xrv6o-ZR3O1hleEQajZzXU5iM9Aqh3rLLFM_t1Q0=": "4230769000000", + "7NbA4RR1vom1YPAWhboWtKOhIC4nC1ue8Gte__EOtYc=": "445981000000", + "7NmnaKyucyLO_ywUgnjL1B9BgAo5wr6RuB9XKBY6-e0=": "465927000000", + "7NyJumkPAJz8RW8shR9NaU-ka9pIiNtC_6pdVV8zEzI=": "412863000000", + "7ORaCE4JyMavEcwo4wt6RX5Ybbsx7B1sRJpQCRdHADw=": "768663000000", + "7OfPHxxXTmNvRVLudpIqazttXzJPCQFDDbl4L8HOt30=": "4966614000000", + "7OfsvZIWogZDlAe65bAEeXj_QS6bdCQKZA6NA1Fzl74=": "1156517000000", + "7OiNVu8PQw53NVxUPqBSsBvzL6oI9giuFzshoHz_158=": "506074000000", + "7OinsoSZj-ifnaIQs-EPCos7ozoP_CIyJZdE3oR4drA=": "1927533000000", + "7OnvqExesJOBY_yjAfgkPzJEBHgFKDLbROLuBkst2XI=": "448254000000", + "7OunLbkd_BnLBQtcuDOdelAQkXn02hM7gu2YGBNfq4Y=": "833332000000", + "7OywLp-mAm-aHrPrM6xpYo0crlPzMfKy0hFWO6DhQpQ=": "449960000000", + "7P085GRG99WxoX-I08cPW8D5uyIf7ZvBBs2p0tY-niI=": "384615000000", + "7P68_xpqfGgrlcceZm1j1L0qFRgYyXqY4Utkxc0vOEc=": "385508000000", + "7P8oR6JG8fGSDIDabOwVd9AgbzSiQ4SLasrIYY5Ua5Y=": "7936637000000", + "7PT-036oFBYIMpj3kn-5HaBElGSF9-EPSM4l4i8_B8c=": "3307692000000", + "7QG0pWgNjTKRE6AOXfzqZK2jgjXdTpc3A78CLypuwGY=": "384615000000", + "7QOk2jT-R9TQScRVDrvXfLDIHaHRqZMf76kvzb88xOc=": "4621453000000", + "7RNb7LusJ0Dk51gX89J3x3V278X4P1XeN4mOO0CAX1Y=": "983706000000", + "7RYRDszwooGHt3mJOA7NYlC8cVfxLT6MFyAB1VYHY0U=": "502779000000", + "7Rpi1Lb5NJL07YBdLPKSyjZmAfelmKsjIlXzjQFBQCw=": "384723000000", + "7RzXZcDjaZgeWVBI6IiNSU2EbHl5olSgFcobWgR67G0=": "1855209000000", + "7SkOXhxZY3D0MqV7efJrZw6KW3q6WQ3ifPGRnuwpitc=": "634433000000", + "7SzaBU5ta_P4g1loijfRz1w0a52Gtjq_hFs74OJHnb0=": "4166666000000", + "7T8lEmYXWFYxeAWEdcrbgqRlYzuBOOYe4nR7RUhPDLI=": "381677000000", + "7TFZ7U52td-doBAPlZp55BvYShwHY9ZwbT0VpDuQYdM=": "409481000000", + "7TTAezUTBIfBvobk-YlnSlIwHMTFwGWRLB3kQjkZnCM=": "385283000000", + "7Te-233rfJf8ytLZDmyuni1VM_k_dlJFS-xvkBUMTrI=": "8355256000000", + "7Te52MHiL2Jl5jJ7yJwtFn-3zcrKSGqfmosNpiofEys=": "832900000000", + "7Ttf6dS64Q3UXR4Fe3vtv6I1XhvyT-ARX1oM2jnEQk8=": "563879000000", + "7TvUggrJ093yEF83SVXWmS65qVZ-8TAevJn5IA_Vjyk=": "385505000000", + "7U4VIu_XFPWiag0abNkrlu23tO1OFAhKajpLzL0l5GQ=": "385506000000", + "7UGJaNHYmp1DTd1h4Ha-wXFoBa7GhYX8BAykaQ0W3Y4=": "459858000000", + "7UKzQyfMkozfmT7FaXKKROKplAENXhOcUuShCL1XH7A=": "762587000000", + "7Ull0rHHQAAjT_FaV8_-c0jM95gbVqubOIFATuKxSOo=": "385561000000", + "7Up7MbEE2Hnf_0IekDK4hpQJDfgefIisvgjk2dtV9Sc=": "18892272000000", + "7UyHPMdlmQ7ulpqghWUDPRr1bPZkwCuVXoxAdVjYjwQ=": "385507000000", + "7VENKwFaqs3FSZ0wMS5NOL4wwhbGm4qZPWK6oybDqvs=": "382414000000", + "7VEZ4Ooyig27WI0XFOWFURxulpyclDE4qCbfjjf3B3M=": "839951000000", + "7VUGFtJW3KkQNWo61WuJkRodyYP0Ub7YC8s8Fn2mHto=": "825650000000", + "7VUzizA5-t4oUtpwafUKVaiF64hgYimuvLFWd4ra9g8=": "2069885000000", + "7Vk1X7qvm8sLsbrgyGh7uyYuBtQPoq9OtfHb8Lv55FA=": "1374530000000", + "7VscnfnTlVtUZvRIYI9IGnrunkidhmxdd5f3BQlCiko=": "388604000000", + "7WKwjmgi_ik_Wce5QvxAb7jCVxtLQVjfSa2XX0-b2ok=": "3846153000000", + "7W_bBJEVm7h6QWvmTbH0MClGLRghVBYqQuVR2afSNq8=": "815308000000", + "7XUmn6eQdnPa6ASAkqqUOlIxvhD0cIOI1P-Kdm2503U=": "1911972000000", + "7XXyLGWVlHsFeRQIthD8ClwfQXAvjMpvCM2MPqYKiWk=": "579410000000", + "7XeSFYIhGpX0vXXl5iZgN8zb7E6OV2VywKP0PTk4xWE=": "3706663000000", + "7Y9KfQM0RrEjuxTTpZQN49wB-kPkrUty1Y3ReZEMpTI=": "427689000000", + "7YCJ6HY3Y23fb7nNSijiHWuPFZYtYDACYa0DaZrGdr4=": "39637569000000", + "7YHLsxOdQFMsr4Qqh2l4FETbFd-QD8nFf3Zvmpw5GO4=": "416666000000", + "7YoiJY_WqruyZPI9OEQWkpILOy6Xk5IlN-aY4RpFmBY=": "451418000000", + "7YuXPu_xsWKsizijDQCRKr_1Ed5rmRYzQPlKqSXn5rA=": "7710117000000", + "7ZQr0WW6Fl1km1hj5qA6WUuAKFMo1fwDfgDiKaPj1ME=": "1252906000000", + "7_IhStc_48TYpV-hGhr5dh7uXYdhEGQDSPuWh2uwR7s=": "424962000000", + "7__JHOopW5yGbEP0sABVI1kPl7qYdXFtCCFMGvudMpo=": "567004000000", + "7_vBA6e1Ic3QMxT6EEov9eDS19LVN6-qZfuhI_9BRUk=": "465100000000", + "7a-JaeWFSyY9SP2liR6b5jTJ9hX_YomepztSNG_i74s=": "464881000000", + "7a7KmcIF2EKy1yDKXSb6L47zh6ucIv5nvMDuveIh8GM=": "753439000000", + "7aMm7xaHQu3iyyz8ER-V5FgkZpeK2AJ3ehdE330aEjk=": "384615000000", + "7aUNBUzS28Jv3E_gmBOJTW2cX7-FjqRTxxSZbu4gRu4=": "636148000000", + "7awc59E_E1PpL0DyGhew3mUUGx3EKbP7H_8OwwNCfYE=": "750896000000", + "7bNJ-8vg9ua7dqsCpHtrqbjmN8U2jSGs1A1JJesfP-w=": "3076923000000", + "7bXfiXbGSTQO3m4rZRA6udDWTiLrFqxlmdNX3N-qAXU=": "476850000000", + "7bal8XQdw_WkyJYE1ffeVUZf5jCTbixfBGqgWx5_vAg=": "384203000000", + "7bl3_moJU3OvE97LJIT3F8T4cCNd0Jts9mlLfAG2yHg=": "15083913000000", + "7c1sppNLQYk8bJ3421xuib_dxQGG4S1E1cYJjPe-94I=": "538236000000", + "7cEaXj2j7KWv3kXg966Lo7dq5lxlEugULUYp-B2XRRY=": "769230000000", + "7cWOipFtdf1Dvi4IZXScP2G3RiUhazZwCXaLFc9rbT4=": "929753000000", + "7cXp-0OddnUHaZqmmn8bPjA8P2n8dDIrE1SOPv2exEY=": "385506000000", + "7cepx5TGTGbGjV1T2ZTDffdPzEg2lHuSMLtzcRqUF68=": "411085000000", + "7ci7urCWeRfAN1VigNz_cIwJv7LoqOmdlH2_1_zwYVc=": "451503000000", + "7dBik3ambCjbpGZvbnKAmcdpD0wLJQQOb290ZLMesKk=": "384615000000", + "7dPKjarxmcFnJIoayz7Qxbv3AmRdXOozsBALon4vgsU=": "351391000000", + "7eHQ9Z4GgvIexzEYXCeh453ZaOa3a4AnJ25CFI87UGE=": "407109000000", + "7eUQ7xLoA4WMftayW4jN0-n3RNwNMck6EpVZUD_RKQc=": "7700887000000", + "7eVgDy6DOCALOZgSQerGHdH4Bh32ARvC1lA1dAQxwEQ=": "2072984000000", + "7ey6zaN9abOKBFTRa3IA--sZmzs39CKmhCsnYG109M4=": "566600000000", + "7f9R7w-a3Lslj1U2-sJ8iRra0RGe-zn1q1YKP7vqpAg=": "1923076000000", + "7fMgLdcUty1RJykNVlThVbc8v8jeb5xL7vf1Oz0h4d4=": "462363000000", + "7fXov90lOXyasbK5kx1C14tnOlOpI4wyhQXPgKD_W6Y=": "554186000000", + "7frUSDgtkw0C0D2NLG4KLyf4AhHDe0yWzKkvX4g95o4=": "1247142000000", + "7g3miEpOEZbznPSdFG0Wu5Ap_n2UmmL3wvRZ5s8AhT0=": "8363441000000", + "7hjh6orZbzHgBujrnzBnou3NvTUL4cFu4aEChylf6qQ=": "1411432000000", + "7hmGWW7ZetNLvIKVWKfTTtFXWmHAi67SAPiyyGlGCGc=": "3698977000000", + "7iFM1zz2-W5a0Ju2BdVkAeqSX7Lxj4NIgzqOgIkthoQ=": "763008000000", + "7iOAWQdORjbG6cu4LvwFanK0SeSVvXmamjxHDVvYHks=": "384615000000", + "7iyhh-AFgQvlzoStIQgVa_XnMqOLgMqxqSKg1LyUiSo=": "3613957000000", + "7j5873lYP4_-e4fhdmgB7yMfw75Kw2qo6sVgxGE2lQg=": "413603000000", + "7jDp0SQkmKsqZskwb-uBH93t0nwNxr5-8U7ITlqvPLQ=": "449698000000", + "7jNg4ECnN162dLaWUaj9tcKkItP6vXTIavxM85mwMm4=": "769230000000", + "7jR7VrjJdOwSggZoMpx_cAGNW93bn6Ty7172nYFtQmg=": "1175093000000", + "7kE-jpOJBUZHMpx_p2VzphxYuZqkoGfhjD8qe2j-PpI=": "1858257000000", + "7kIHlcJrfa1DbN4T-95-lVUXp3pNveXpICZ4X8xdAWI=": "384615000000", + "7kJZEuDrp3LQc68h7v2EOfnX6E9cYc2rELHz8Y-obWg=": "422561000000", + "7kKj8nlb_kbryoWPYI-sHNQonu_iqasIkRXiS8RTWAg=": "1223425000000", + "7kNznzbqHZHsnY8f_4VjpSKekervPC2pikU3s03ONpU=": "399936000000", + "7kOKARa3BXUz6t9BwulZfVnHbIX1GWbTf9EmWEOrFKs=": "794429000000", + "7kV2X4qrHDijJVYxE-SMS_EmY1fhoYN7A80MRDgDMDY=": "1173675000000", + "7keOEnIBg01IWxSyW5s2TkZqySwA56Z6eNv7tlCitp0=": "387365000000", + "7knhYasdr7yxMEI-_hSkddc8o4JpYumsA5QRPiBgXxQ=": "386543000000", + "7l0DwWsMv3H1k_RW2Lr7Q7w-0P8e2_SK2gnguyfIPPo=": "384615000000", + "7lbyN3MuZc7z6ArMFdmQTMofccN_nHPSM1O1MtbZvWI=": "411886000000", + "7mfwdm_uD9AZVIMqvn1Yv9mPKNuO2gGfbnvJegLJZEw=": "713270000000", + "7mrTcFX28NyJlSITrrX-53dnx98c9HVJO3R1zCL3Pf8=": "409034000000", + "7n1uFuL1DIf9rwZ1MZSmBFeOUNLsMr6K5GpSowSd6T8=": "385347000000", + "7n9Qy4t4B6ju77nXcWguacdL7taEkOiWnUhXg12mqqc=": "466963000000", + "7nIxPj0WsEZJkpQE7OZo2A16WuLRDC69kSaq2x_nvQQ=": "417632000000", + "7nOMRaEOTHBJ1Or4FjkO_o-SsO2j5sY5T7NjsmEDN4M=": "414551000000", + "7ndOMdroWHndNINy-62_HkQI-8VrDQ7mTqMqQJV3kHg=": "3057692000000", + "7o3qnyvywcvC41t_thwnUTQ0LXD_0E5GqhWk15efCwk=": "52548324000000", + "7o7D5wEtRmWTSz8HXwXUz8sZMz9eHG63Lj1LQK3u1og=": "1346153000000", + "7oLc8d6nIUsX2_dVwsApsbmgonpKNo95RmjyJuJO_24=": "449085000000", + "7oW1bnUrIw1fkWshGGFDMOeeEmrwxThQKVPT2LNUx78=": "424269000000", + "7okB9Yv5ZkJdjrVCg2_PP3Ls9RgqCOLHGoPas3iPlzs=": "4106294000000", + "7orgGp5_7nAqfuoQYnb_ejFZvaKowKMKVFUS-OBshTk=": "418280000000", + "7p3NZ8dWnaX79IKNMHXnGsKf23UW9ZwMEWheoaM_JkM=": "384489000000", + "7p7dEmrOjaP8yfM8VKq550d7mSMy_2p-LiqldxrRVjU=": "378272000000", + "7pdRyCRrMiZ3V8jhfFtqhxSpyhqBghiAp9h42h3WSW8=": "454545000000", + "7qDcn0kncwMxvPtBD7zrVzhXsk5eN9J-7ve9q-hmKow=": "407808000000", + "7qti15B_OoeKkgjDOTR1bGnla8AfgM0xnOrt77SMwuQ=": "6715384000000", + "7rEVD_ZBSlU_2RLEQ6Pher3xYqy0nh8635CG8AA-aEY=": "15751710000000", + "7rEsCWhlnVEu4J0JlP76mqZ2p8SB9JtnBsLbj8r2_nE=": "1758461000000", + "7rR0kaM9mQ2a6ik7410AISKZKHRDx4vRphe6d58G1J8=": "383296000000", + "7rgTsubF6Y-LhBt_SLz2_mbckyAwUUO1zoi7z3SWJIc=": "429119000000", + "7rhXZi1FC6oWDDAur0ltIpfzO1a26lEWzht_w9i8X6Q=": "1391600000000", + "7rrBkhCp_LIu7oz5Ax1SgJ9QxCuQjR23GI8myLKJZ8o=": "764788000000", + "7s0Cxp9xqYo6zZ0NjGTUMbUohhaZ5iYBgvBBziS-S_M=": "1484383000000", + "7s3cKdXHYzbqTbBXxOCa1LaPZox_n8FeNSPPiiXuyxk=": "1629150000000", + "7sNtlqG51l-QQ1Iw0HR0j9nSYosHw2nsYX98kPAPZzg=": "375287000000", + "7sfwf9FhI6kaN6Qhr-cM2uIjd2OnZkbngNn1TRNSt2I=": "4911925000000", + "7t46zREcq4xXFTGjLv5ldr_Sy4k3N2of_YFJcJ8u3Ks=": "1363636000000", + "7tQe4Ykg0x8nnHmEZqhfLuxCaiotLj-GJVBeHL95BY4=": "1923076000000", + "7tf7NPA5LzKZdUWZ6QKyq8OWIYKTnJExa6Udyg6bjBo=": "404066000000", + "7uMJCiYxhbaL9qoCZQ8szRryCAIKX-KGh8de1nMXWa0=": "385510000000", + "7uheoJWwB9nErjw7vVTd9lJ0G-ueSmtw_jmuaDINycg=": "4582577000000", + "7ul4Gs2jwh3vXRfWF3lwRAqKdFiyait8SY0xtRdV5lg=": "1355119000000", + "7vbfaOWm_E5K7VX5B40ZxhM0VunkgT2DFxa_2fTrGLM=": "673529000000", + "7vs23t_uYmgY6X1lCnEIO_8UJDlEu4XoUxQ_YSUMsOs=": "412618000000", + "7wH0ph-m8nmZ7f0UG0imWYK3JyD-dLVxDJwNNFwIpbc=": "459886000000", + "7wJXYlvH-Sc5ulZYd5vN_kn2j0FkxZgqLPTNzkaxvO4=": "4689799000000", + "7wkV3dQ7_VZCcYpBDsMR5khprF6DaMOUY_4qA5RA3xE=": "417636000000", + "7wu3rQDPqArSVsML_46VuKyCYMppsfloS8DiJCZBP9c=": "455320000000", + "7xLxgUM9JVVaVWwtKfJYVuZmADOtzU6V3fAEHK5srTQ=": "384610000000", + "7xgRrZD4d1zDQgTbDNujzSMxOuKa-EmV4brSPVzL4-A=": "602785000000", + "7xq2o8_TwbrAdA9RI31Db8jbGPMsh95jqPYjUDBLBYo=": "1885233000000", + "7y7OE-Yz5IGHwEARiX9XyVU8T3svHdD7iAKFg47XLro=": "384338000000", + "7yAvBo1nWhLsBGGKO7ZpgthidOHyL23xafEBsbZjlEc=": "1410174000000", + "7yDAFXsdJn4DHQaoUiOqY7Vk8uwAuI2Jvs9EZkHjJ1Y=": "783595000000", + "7zWVQBJFyE7krUvCJFXjY3yNMohL3LaAc6KAUOnGavY=": "657881000000", + "7zm_KDsYYN7Wm3gW0egjAUwPCTHPr1xk7C10_HStnsM=": "1183411000000", + "7zn3BNWBVA9rW0u9xqJgoHuDwo1-l2fW_Gb1Yfwq0t4=": "385510000000", + "7zsFIpDOeAZxEP4H5bpLNV2OjOXRt5Cu_5wMOz_t_9E=": "12649356000000", + "7zv8GiYM4j9oCVf_0GhCs51wlA1Qu6GB6JBYtCoyOlI=": "769230000000", + "7zwBKdVrTKHV6x998QQuPk3D1iKACYji7ywB9LHpaBI=": "1263115000000", + "7zyr8ro3RuwnQvwMdv2pyqHkXMM4VVBfCr9SFnX6oCA=": "384610000000", + "8-DJ9PAyAgVbHukZhCjfOXqzV-2chr9ca15siL5N6H4=": "2031176000000", + "8-KREcHxzZPlh09CkNNcfI3Xk55mNLDfuszUMuKaVfM=": "469905000000", + "8-aUlpvucanHA4Z0VDCShjCIaPybKTSxdzCS5l62Mcg=": "576923000000", + "8-eo6t6mL9YbAGl2zUc0AzpuogK0mIwQg6G_hHk1C4o=": "4000000000000", + "8-ptmDXQDW7aBIWCEeF0b_k72iIiI6xatuwBEGdB64M=": "411085000000", + "80e3teWjBmbGOXuOj4yl6IFfa51fXJr1sPm2IQrXXWc=": "490605000000", + "80yx6QrDXD0agNihzAfwmLeRKUVXWJRES2Tl2_9Px6Q=": "578548000000", + "81-Q1-ElMgJmWm2R-F-pDiJt-1pgFftAUIHTwSfD44w=": "769230000000", + "81AxeO-Z8eCs4QV0xRfV6_dtYMoV0Wkap-atqM50Zak=": "1264425000000", + "81WX_pQW7T8cQQHt0tBBPlCmtSeHAJcs1g6n7h56oC8=": "1136549000000", + "81iZ1FuhH0qonXdfqwsDLxGLwfF3DPkjJZYKnmCau1s=": "1629615000000", + "829Sbu00b6breSlf0QCGt_suDL9mBKa0Ir5pG8ezmTY=": "385506000000", + "82QPRW_4XHStSjrBvWh3_wVkN-MZdEYnkOu6RR2g41I=": "378633000000", + "82XAtjFyVQc2t64BjB5vFsa1JjGrh3xnMg3Dgn9SBGA=": "383990000000", + "82XecpT96fYCqbuGaC_8B52kmxas4Pq8Pbyn1iBXkYw=": "482124000000", + "82_g5DqwboLFWDaN0KVizgFp9gMbmutwxSAb6hhVIc4=": "4544264000000", + "82ib4L49IjHCsSfxfcfpKEKrpuKSjFjD2n1qk2aZjjg=": "917964000000", + "82urgaZKr7R-hhqOVSmc8z5uMJeornJgYWw0StQDabs=": "502530000000", + "82zPFrzSf9p-d8eaAZUFeFA5zs_40WSPj-NWrkQ4Gq4=": "1538461000000", + "83C3eT5tLupp3h_J6HjHm4b2G7RSjmHtt_EGJbqbip0=": "377685000000", + "848aKlVXhEKnSeqXQxjBLwL9RKNeOxIKS4fa1L6S7D0=": "463106000000", + "84I2gDgxzDHTWPcTWbWeI2fpoQn2jb3DdwFQwNdisHM=": "451333000000", + "84sIX3QbMqjKnxpCS2iNAhyt_vZhU1xmvdt2jsKMuCw=": "1686538000000", + "85MMHEwzWG9j8KuE8la1z8gHBM_4XQEBDXawdghZqvc=": "1617207000000", + "85qkAAX9ijUZMgM6kqA0SlgZs4n9SCP5CC1fOu0D4Go=": "417632000000", + "85wwhUsWC6FX6PJrETygxNbbUHaiQ13OgFYscjnL7AM=": "1831153000000", + "863WWf3t2nJKaiRpBYe4f1nv-lsIUbGhEYoNCkYPbWk=": "384615000000", + "86B6mMurOOK7FOdj_31unxfMSkzE4lGiukBY6bIv06M=": "1153846000000", + "86KhiG-p-fE8YBBGKRYKQJVVXna_IYPOTv_IULSP9Sw=": "383887000000", + "86MGsQ5S2UVnRphLTE6EIZgsOlUg3abCigkP4phYRe8=": "833333000000", + "86sBBC_eeWirvxw-PjYJhWfEh_8WI8aPfGNLu7Rdhxg=": "1382775000000", + "872SVsX5Km7tbqeaxwQmD5C1oKM957BszDjbNWAZ8jE=": "18806282000000", + "87aMhvCxaR_GWzvI8l60F5g3uBRjZ8NkX9rMVB6ODVk=": "1153846000000", + "88FOQffCPA9n-RJn8LQik3x9-Pcdm_NIJZCABUDM-mo=": "1366800000000", + "88I-DHGmUhA7eAtssQbeiCK_V3d818pvGtFn8SWEptQ=": "1235656000000", + "88eXtQzbPOb_zquCv66rvZMs9JyMpG4YcWRZF3WNTl8=": "1512689000000", + "88fzTS4FEqDiG3KR8GSY1nR5AH4e3vJGK_7goMsmIOI=": "1153846000000", + "8934Jdv4YY5Go2nttd535XxkJE5_gQUf5FZN7ravK3s=": "463989000000", + "89L68KIeT6zCB88s_xSTTnbD3B2EPoB-PtU7bmLQBrU=": "388098000000", + "89RRDr803ISHIJcsgieXY6ARy3Ka8VuK9Jb5gApaSNA=": "384615000000", + "8A6ZONH4mTZvIodJmSBqb4DqzRqJyXaxiUSjkSKebUI=": "1504440000000", + "8AN9uApZwk2lM9JQLD0DjwJU7bUxd9ywjnRflvsBhik=": "1798622000000", + "8AQ6kBeD7EzpLGRk1DVvipwK7V32uNlOOhLtHgoFPgE=": "751903000000", + "8Acmu3tkBJ_cHTzRoPRQzlr_R1nmfWYBzpJOsGLbkr4=": "454545000000", + "8AlbcQenBZFmmXNrpEkxsqz8VVvTp_FPE92-Ydmtnh4=": "3849177000000", + "8B645z4UwgvOSjVAf_4SqiclHWOFzqnaFmDDMog85n8=": "374878000000", + "8BRe925vIjM7hRN45XwY9K7xPA-wduqVpdg_1xzCTtA=": "442970000000", + "8BawCKQNo8CqJwSk-uFgzt2K8IHwAKjgSpOdeR4ZD6E=": "1545426000000", + "8BmRf50B3d8AATJXWtAXIerSuaPa5ex7jaFTglUNV9g=": "466670000000", + "8Bt894Lxgg24J8Am7MKOsneLmctZZC1R-sLH6KMAxJc=": "408021000000", + "8CJlF4Y1taf86P8tKcCbqt3Ei67uIykrOB-Pm-0b-Es=": "908970000000", + "8CLQsQZQdggQCIoN8Ogy8KudPdM4mxuO1EcIFib2W3c=": "1146913000000", + "8Ca4XP1dRKPsBsG78w8UJeN66jjtjmd_qiL4C4dYdpw=": "1152653000000", + "8DEw0wkO5CsZvTMGPBOlEA1WaujIdG3XutCkGdBODYk=": "384615000000", + "8Dfmsy_o7NBkc5g-AEuvOiRbCgI7rjGjMB0WCiO4clI=": "833931000000", + "8E_oyJVKEAT_gEMha_FdmQuLFMn61gzDlC1DFAW0mBE=": "4230049000000", + "8EqVJiSEZsw38cpZIazA-ZoB3o9rdxmfWzRs1rSw5hM=": "769230000000", + "8EuZ8yVwmOYCcfL6hurvY4ieqlKKTuqfefQFQyGtc2w=": "383646000000", + "8F7lLkk-KyaV8eEUEdxyIjrWI_5dD_HDpgirFgoXtLo=": "1218180000000", + "8FMR2TGSJ9koX-4AM66s4_TnypC8dy0rADdRgPiadBo=": "455104000000", + "8FiEg8lqEyDzjGJsK7rPD60_uQRmZzXQIKkhHDbdVAc=": "415629000000", + "8FmNeiVqjMBIPrFlD71GZzmT78IvZRyWU_v8ZUJbHfk=": "3749999000000", + "8G-e6Kl2aoqOwWyG0N16ZIyPUtPBFjkjI-95P_15yuQ=": "809605000000", + "8G3W8_j5ko_HGV9spBFXXlm36kK9u8rwEscRFi4ZK4A=": "392386000000", + "8GDL0KRp42pAHvNcBDwY4JyU7FpMa0TfVvCEWyb0Dio=": "384904000000", + "8GVyBi-1MgKFkco8IY4DS-3spo57Vxs7fD1_u_-Gji8=": "841202000000", + "8GpIMkHUC7ndZfyp078BWKMBck6MRvRf459PC5wSEhY=": "461263000000", + "8GpNeLsEquvaKSPt83L6ForUYxV4YMK-FHEDxYQsqrw=": "456733000000", + "8HB4PTeTsdWuMHgEQbr7jIGYcpxLeYmPJqt7K1VCj4s=": "1538461000000", + "8H_jtBLqYVNPY4on2CVyAEDE77xDn2UNJC6pJWf2tXw=": "1664838000000", + "8HqarpNozzMdbqkN50_7Y3IYXop9k_TfsbuT51FSbRM=": "832943000000", + "8IEbALsu5KgwrQAZpgeo9uenzWNMi_OAMBU1fezjBLI=": "577509000000", + "8IXiewlYcBSYvXYt5qQvY-DcYE-89MdYqd_2Ns5VBLo=": "1010897000000", + "8Ih-tGy03qkKQ0grvHsCgoSA7rKm8FHoPjq1AwlltBA=": "927599000000", + "8JCKrSMg2y15CpVFz8VeQCZWA0Ih0zWINHFiZp8sVs0=": "385507000000", + "8Jts60iH3YfxgNVrXDkfNMqr5cFdC9ITIyPltfJgf-I=": "2093639000000", + "8JxHbU8rxEwx-SDu47DrqJk4XjYcXEGykAeT1B6oztE=": "454545000000", + "8K-JNoCdE_z15kFUIwuCywG7EsI40P1zGztv5kgh244=": "1249999000000", + "8K02kNlJUQbs2hSZaPuvxMIoul3ypIyQB-97Fm11gNU=": "385507000000", + "8KqtDqcIyPDax_OElWvoF_qnPmVHk4ho3bzdy4rpiTs=": "1038461000000", + "8Ks9XxCRbOeupHSdCiQImRTshEqsNslB35WSQ1gn7hk=": "380259000000", + "8L2WXPolfZIwogmencihu7QYHkvSPC7uhk4whSEB9hM=": "379344000000", + "8LDeVf0Jkx5q3T5deeTERlfoznxX51jCAfVlKESWHtI=": "387993000000", + "8LOvtZiVFKNrM4LmIQXrfeVlpMSbclISHHehJu178_g=": "383462000000", + "8LU_n4Uy4B649RsEifDmdxVZv0bTF3fmKGtf2ZBRMAc=": "413819000000", + "8Li_mryUxL-5jHYfAS2CIPRKqzboif-O437dBMOFBGc=": "448838000000", + "8NRaBKFIOKvBtYym7Z4s7UXqhA_joZOA3AVPieHJcQE=": "449705000000", + "8NprQHlqifiZXBjvfuoOs01mxUrTtq33prb3zOUf7Ic=": "2499999000000", + "8O-b8_LHwiTmwq8PQMpfYj0S8fz1vcSSpFDX4TnC0FI=": "416901000000", + "8OTgMdtMmhRf9pLc0JQRCcjXAR4u3kw5UmJkRjw1LQk=": "407609000000", + "8Oh8NVhfF2_ucI45HDJPdOlaf4S89uwxrpmImGrYc2w=": "382168000000", + "8OrIYG0dXY0qYEuG5VB1ODY0X1Kbo3B8MAQ-6IaQBs8=": "456716000000", + "8OwVEgwawFZemaLMuMVP1ImJi5-BHYd8U1qqyz9QPUU=": "409110000000", + "8PN1PMKPQaFNvYeF7_gnz8XHErb-xoT34gckFYr_sak=": "466317000000", + "8Pex8Yqb9fetKS0bflKvh-Od_EHQvKHpTGAICVFGac4=": "422196000000", + "8Q271lf6mjoV1QPmdwe7ejWK2K6FHdEvDhLExXOL1wY=": "464104000000", + "8Q2JMm2-0rnul-PMsmeOC2J9KG9FhNtdKIUlHfTLIPw=": "454545000000", + "8Q6ta7614qbBYJ9pAMIahgbLOPIYN1ayVJtdpgvKMQc=": "738114000000", + "8QYdYU3BwDPOaTP2YjBHvTCRfFrT7Z1jiOdDn8ATvRo=": "384962000000", + "8RNUbMFUofyzAdluov_hV_m7sKRZxgFk0cxNY_GgTxs=": "7693892000000", + "8RQQbaa9N8d_uBaiMdJdRzuobZ9fLKjhOfi2JbPYhyE=": "459730000000", + "8RVnLTMHLPloYWhQIpgLNbua7KnCXNm4muRYZqe0s2I=": "413641000000", + "8RYuUTUFsaUDNpoQGdOxfQu0Z2J8KeysXl5DLMEXDQ0=": "384615000000", + "8SAAQ8H0Go1SRoCA9YkI2xEa5jKSGsIwUvogX2MIwKw=": "3708331000000", + "8SOy6I-FKnJ15W6QHZm4a00hPc15GK333Z_oJgGj51Y=": "519230000000", + "8SQUplFXkdsMvK7AoxK7BMtJml2boM92BpTYECK8eOQ=": "416666000000", + "8SjJg9S5mr9TRGjYuAawwc0R2VLXuQRiSGnaLY2N6-k=": "455901000000", + "8Sw_MUJNhW13-EsFE68ii1sQd6uydndx0ESx3QY4OEk=": "384615000000", + "8T0O0io95QO2epDxlRdfEFau3CjbtAnTj_FADX9OEUg=": "1619405000000", + "8TZEfR8n35NKO1u2jvtEin2rnaUbCcvQ-VTAm1HjRIg=": "385506000000", + "8TZMHGwuiXZApfsM29-rR_Df27RuF0-5YqIZmQLd6Bc=": "1059313000000", + "8TaZVz9L9TWJlqk5Fw_naWNob--MT83_NJqgtqacabg=": "1538461000000", + "8UJs0S_JR3BJZwnCA2uT8RHwgUvtDHGkmpORzn40Jv8=": "408021000000", + "8VJtmoQpwm0eW3uNGgdaX12mx8Q340c6oevcLf7RoSg=": "4173180000000", + "8VJuuzCvchX7rEVsB1yGvv0F4-xnvp4F_UacMDOe8-Y=": "458561000000", + "8VNuvN8Y7TmzHllY34wgr4RbPabvHOwb5N9VbbYAHB8=": "1179939000000", + "8VQZrvSGrcITWdwCTwSZkFcgRPEPO3H_grESb6M18kI=": "489072000000", + "8VZp6xTZ5u8N4nv9Cn386Z2Ow_Et1uTYtlOOj6d5uHQ=": "417973000000", + "8WI8KG2KU1zoQ1wzcN2hQvKrACTeJpl7FsZxUTzrldQ=": "464954000000", + "8WOO5h2emV2i7TV1nSAuuZbbqhS_v7TUMEE5XKi3bts=": "534521000000", + "8WUmprcBP8cdhyG8MHH5A6xt2EGnVXOeVI7OQf9hcf0=": "455147000000", + "8WWfei29Igl1OTv8sgrfQPlzGl34tJHKefSt_Qbg-IU=": "454256000000", + "8WptqcK5D0y2sJaGFRqVrKsqJ24BTpZT2VaZSN0BRzA=": "473175000000", + "8WrE63bAsAfacaiMS93bk5CvT60uXt1nMDZC2xqUWY8=": "1386679000000", + "8XH-WqLofvktDqggGYjP51s3d9C8VHkI_8lOwl0PQao=": "762090000000", + "8XNyqLfTVsZM-mD6VzFpQ6lRMgmv7pF8bUDuwv_wwT0=": "478213000000", + "8XUIHmo050FFKol91MXMQ_Pz89KBRZL7FqOe_Jlun-w=": "850718000000", + "8Xj57odvQtH1Ouh8ysUxxHrlelCn-7v8B71SHVjR6CQ=": "615384000000", + "8YnKqLz9ug9CGJH676XLEa9BSvnUfGmT81m05aHEM88=": "3998913000000", + "8Yy4ykCe8TBdxEKLp3cKe32aaSAlIX1VFOhy5VNZjV4=": "19106566000000", + "8Z5eM14IDu_nvL8BclZToSEUt3lO5Q6Zk2B9Xauwwis=": "18181818000000", + "8Z_WAHgokeePLIfEV_ppALlwmmIU9XyfjaxD8REeIXc=": "423370000000", + "8ZbdTjKy485Y71YifxdZXogV_582kid9RGZGjPnCuGI=": "2309906000000", + "8ZkJRSF3KMJgumvQt7ULmOlIEvAwxWORVgzzxj3bg2E=": "391797000000", + "8ZuH4doQTL9jNO-I0DekiBl6CVv_418InuvjTFUBn1k=": "917959000000", + "8_GF9X0NnmYLJ1Wg_EetbUVRlIVTcAV0Ko0-TXDBzzA=": "384615000000", + "8_eqqSxsl2Mcj793o-sc0wg7dNxVrIf7WIW6dcZbRJM=": "1909473000000", + "8_ia8ZHyQDDBxRMC_0AItDg6Z6uaZA_6g0avdMrud9c=": "462687000000", + "8apT47P87mCxtNYfmXHmXqc5BkQuEo_sAJN7Tel48DM=": "21153846000000", + "8bHahp27MxDkQjYM4G-uJpPGjthspXFS_VYfHqvu-5I=": "2050934000000", + "8b_kZOFKmkMzIVi3fDzVYTZjdrX101yWREfBUPsMSbc=": "384207000000", + "8cB0t-kXpDiOjjMbyPD8YCLRpMlOMkWN5jnzd5bQRfE=": "833133000000", + "8cB9q4H10eyQFCvSGyfbtpGMlcXBza0oDMrnbJHHCCo=": "1233257000000", + "8d211zHducycIrwMsqxMX4iEg_ofy0nRMwJmTc5kPro=": "772255000000", + "8dc48d73Q5BBQ0ac8K9fTSEGebb9O7LZNcnhX9ThqYw=": "1233257000000", + "8e9DLpgtpm14l-zUBidm_cbhr0XY7AfBRfcMNz7Iibc=": "1610749000000", + "8eeUtsOfDEl5BEc-zQgjSDY2w4u7i42SHEUynId79jc=": "385507000000", + "8fr8A8GWWQx7-woLfrwq4DVGKO64JjxQa-5cXfkFD_A=": "999999000000", + "8fxNh_Tv0-p4SM6Wkfg_VdXWfCA64mALvYaPSafg9Ko=": "442970000000", + "8gda4XqX_-tIcfJHtgg40xJ407JR3wBvbRDAeOSKKfc=": "457258000000", + "8gldakuvm2lpjBmQkBjdtjwPr0b3KVBqCzDMP6lbJpE=": "377902000000", + "8go6RFxN3iVCnEMM90qZJoorVYFlY_3S5nkuTM7RuK8=": "384803000000", + "8hCmrCTH9dyaVIdfgO6Q2MWXTRVjjy9fZDrLWLZpReU=": "385447000000", + "8hgHozk2Vl2kBnjeKu7_4seewkwlHyyvhIfIcqvcqmw=": "1999999000000", + "8hh0lCz8C8rLK7pbVNoA9m2BK9AB5B3WQ7_WCQNS2uc=": "1075092000000", + "8hneeHZzLuhDZynzrJPbKevuiYN7RksLLJEYvZyyJwc=": "385994000000", + "8iSux4b5KmBk0Hj96q02JnRcQFMqeOaZ0dhHNbZ2oMM=": "446674000000", + "8imL2fyJPDyh0acN74ShAx45sRTWzRsk02XUb8A-5Qw=": "917081000000", + "8imsp7reipLAJyQAQVHraLzCnOz_bswT9sDarbri8Ak=": "910936000000", + "8j6i5UZHcb3EcnlnTHtaoMmDdMt3FyEyLjS1KqNy66M=": "385510000000", + "8j7Jx3OcPBAKI8ESukRVfaQtmAWNBQv--viujazMjHA=": "378883000000", + "8jHOU_U9gLy0ZVpeu8Tpg-R7HFRJZVyb7CFnkPaIw60=": "3888630000000", + "8jTAyjNXSJr1WAKRBkZfY9wk5RI9K5zxqmVIQh-TY1U=": "384615000000", + "8jUy0CiTJcyfsL8yzjjydjlq2nOxQ7ryNjn9dLdfyQc=": "388601000000", + "8kCRP20M1h3YY7pg1r86lSpKom9r1NIksJCQ3CDuTFA=": "389363000000", + "8kMUP1F7yn8TFvlYpBhEKyGCPrXfwWlj5fAly8IC5XI=": "392009000000", + "8kRezFvL5im1yURJkji-TggrlZqpc__G81IkajT5AXw=": "1497015000000", + "8kSyYRrtCGkR8cqM76pyd_uib27EZspauBSMfTZ8pS4=": "3703832000000", + "8kTV5Odm-ZZYp2PMqao_zoMysIyvAyeg_TWus098cGc=": "463340000000", + "8l8AzdqtMih6riMBKN0D9UYxp3J4WetPq_3BuEh2bEc=": "416872000000", + "8lTdpTDasrgDV6t8p8iw8yGPQNRN4YRNsFCfqKHSGZY=": "469809000000", + "8mEhsYd69XCf4AAz0OG6YxRdYmqbOPNwpyvq0HTcxeE=": "2470847000000", + "8mIVNrGJH32uy5nYILlhV2Y2YfOeF7JnYAm8jN500po=": "2258325000000", + "8mbb0Yd3OgCjoofE6EF0C3XregWZ6fDUlZMMpWIrnhw=": "385015000000", + "8n8SrZ8BUpe4ggQt9wcJC_63JkdU-0RlfgeocUh3wjY=": "453324000000", + "8nB5GvhLItaSbfObd4Hu11-ikEecEe0NW5ULy73M-jc=": "3782064000000", + "8nFo2F1YFGyM1Aepoyb7-fKzUSZwQlCnObdkIDyUspI=": "384615000000", + "8nPOZabVsgydcrfrpgfOatVmQxMq1CbDqs79V6Ncgmc=": "768472000000", + "8nY-TBH8hUgX6iobhqGA0linP8E44TUWwFVdyIq2BtE=": "540154000000", + "8ny-MUs0ral5avaBhLvdbccvBRkTvDiRy93cZBPmHno=": "7083333000000", + "8o79QgfOvoWwb4pELkMZp2HbrDejyYKkOaDeRPXYsDc=": "4083028000000", + "8oPtKQOKBE7x1ZVxNp3A9jqVxJ1tk6uzSRpCwWZMjk4=": "390464000000", + "8oVvksToKRds6IQh7hviXdROvsw_8ymhR1MAvSs24t0=": "416092000000", + "8oYopQvkq8M8gPbBGXa1LeBxVF7k3m-LsLdAjcl7JoM=": "379573000000", + "8o_d9Y6C4eS8H3ycoyCcs2eejXBZXirkGGiBif04Rog=": "376837000000", + "8p7C28wOT-jzYeGFlZmLqGU2SF0GSr5WFiW7ulgpDr8=": "1149576000000", + "8pAuJWvszlkcl4ATqxblUKY8q9wEDFnA43cualC5aAM=": "3692307000000", + "8pgVgW-0WEpYugbdalVFqa-a7hyJ_DUwBPvhTsAiZWE=": "836269000000", + "8prGaEOmrsdvLLodoGC-6Aichy9mJ5NhS4aiby30Ei4=": "368358000000", + "8ptqMYQn9Yt9Fd-WBWtQkCoodfyh0djfJX5wewWKHP0=": "415097000000", + "8pwi-xY5gFJagQBPPvbWDt_lMXmnSfXYZyEJ32TraHk=": "653846000000", + "8r0l_puLnlu9K0icbIxSmJ5oftMS1nTnNFhs3KVmkns=": "493568000000", + "8rhJdP3s852I8EStQutKHDlLm5yky3AQC2ME_37qe68=": "763402000000", + "8sN5c7onv54oYpeps8ZIXPVmKBSkgnNpzRnjYTgd13Q=": "384615000000", + "8szUSfF4WPWLZ-G2_1ik1ueZqj7R-X3hETfEwF0t4Q0=": "2500655000000", + "8t1m8KfICEL5bAh8Kz51MLoUQrerctr9MutxC4pKUIo=": "416680000000", + "8t38kIeC6UPx-FDnB0M0QcAiBozXKsJpRAf2kobu3fE=": "7710133000000", + "8ubMGNIuJ98bEoIERrlYBqH0Hhdj3MB89ocAmyrA9ZE=": "10310871000000", + "8usX0oPDehYsHMH-Zt0LAnpRhPLCJgPD7KUeFzU6vtE=": "3748797000000", + "8vDMg6ja50CVSW9aSIOFJaiy2yROaRWKXDrSLKiDReE=": "416666000000", + "8vOTR9Undd0cxs1CxKtork6Km_2K1Zjo-OTYiW2ozLI=": "1411432000000", + "8vaTPJkjZsp8gkHL5Qz0LrOT6-xJ-vEJbOH7QHXj1Yo=": "385510000000", + "8viBuq4xMHlhmsM8oM25NBQXbqZWNB6s9MfvH7e39BU=": "1885751000000", + "8vpfxAYOIu3ODzwEpES6XF2UYzz7BVTCJ6P5XnMQXYU=": "384615000000", + "8w95bOwiFEqO2cJleLARZ8fNo2-0OTAxeWp-u1EjQ3E=": "4178095000000", + "8wCmocyiJIOJwe3D8gH59jEBhGxgDZYUrt5wwyeeIXI=": "455600000000", + "8wS5z7zwFPQ-PsimHUymVBV9sFXWLgICWrve7goVcyc=": "411085000000", + "8wgCKVgCpAe4B5Mx7Ej6qL-ydbpp39DfTxDnqM0zzk4=": "4999999000000", + "8wibeG5TJBrqnMbcjEAD-MGBVlmdpmH_Uoi124Ujd-M=": "769230000000", + "8x2jYE0Gss9KHaozv7VvR00xLyQLKiyu0sVpyOT54Jg=": "843026000000", + "8xN50I04_iXFTy2em42ulDCZBfD3DkOR2dn4ixLgSPE=": "426044000000", + "8y7QbPHuUq-PeiLypdg-ZnFXWmgNGFE2V_o7ewJNz_4=": "1142034000000", + "8ydMs7eOf7W1D2T6z3U0xjCOt9LJNlXuk4xEPEgmmMc=": "569023000000", + "8z6CCLnWZznPp5eOB8ADa__04c6DBTGB55CQmK_mscg=": "459734000000", + "8zvgXR2WhE_NJFDWC6PWuKJBKVyPv89MTCm5VFMIER8=": "443320000000", + "9-0meLiWCKObNuhpR-QUl-aMvJ_EGlUHxIAsEeVIMrI=": "2084212000000", + "9-GkNA6NXelqevtwfWRN3trj0WjV8udiMD61Z1DIR4Q=": "4842257000000", + "9-lZnsYE1EM6lWZCsir3-r2Ho_deT7ymfUgCMyYc0zw=": "1470112000000", + "904r1sfmlxAL8lM-_aX1WecHlF4-o7-RPQ22ER-6YDM=": "378561000000", + "90DOrAPfhrTPuGnPuWHJDYI6mgQyltHH8hTVtVV_Jjo=": "919641000000", + "90Ghfo53Qu9Wm3a9WgYRfR18Cnky2ukkmDa5NlfkuP4=": "1702537000000", + "90oxIU-DajqVlsB9CUsJU3xHSegw9vP8p0vLgFkcX5g=": "385507000000", + "90siLMgK-43_ukz2jMMJEGG_1haf8Tlg190ddm_fg4o=": "453846000000", + "912fcXZG-kuLgW-Qhsp6Ztl0aI7M9U-cqP305N1a_oU=": "19075369000000", + "91Blz2M1zBX3nyyoYcrlZ1z9AsECMWhUcqfE2uulUuI=": "379745000000", + "91RDU0kJkPiqfXluDdhuE1Z-qblfDhCp98JetSf_C7g=": "15384403000000", + "929WIZLnBcj845oJ9pFIEr0COAoYhlpoDr38OBVegZw=": "769230000000", + "92LvZ3AvfoE6vrmDBpm7Jm5gZ9EWfXlMYliA501ljIU=": "757224000000", + "92LzhKjPl0AtIoCVNRrST1n9_1r7JCrhZDWxbAA3tpA=": "771398000000", + "92PdWRXXE4Z2LlULzgCOZts9DTV_InxxL2bfY63f8B4=": "884615000000", + "92QkYtWDTkg8hQa99HJpA_Ae16nfRUOKyXkG6y0aW28=": "2498821000000", + "92dBUfjgnx_EIAkT9uxbXFYRRHNPT-Bv0tDA3o1gQoc=": "527602000000", + "92fQevOgGOjMMzGAxF4SNp4pRwExBxJDpcGu9xNK1IE=": "2949097000000", + "92h_vy24_s5thoPBMPZcy9_tpxmqgOv5T4mUjgrVBlM=": "454400000000", + "92v0SIJEUa2KzOqcmPdKoVOPBQi6qjfLyWjwF3Thtzs=": "446725000000", + "93LxRf9GBUizIZSM5iptn5L95Pc8QOathRj8w9cYgO8=": "2641169000000", + "943oNs1RJxYIwzxW44v5QxU1w1ZH3OzsUEJhnsu6Zc8=": "771256000000", + "94HpjTAFVz79efyzP0hM6VB-TxOgWgRSOvlS-kJJYrM=": "542611000000", + "94NREtIXAa9ap9bfTMWgwWjl5uW6mE0NrMspb2VPN5s=": "1976252000000", + "94SwfcdyBHeQBNC4HJ30WFJQzJLCYyp0l6ICLklGMCM=": "3878668000000", + "94fJpgSlXf2KL7n6CghM3mKeSiccTfLTfEdqzh0KKaI=": "982646000000", + "94lUATdjBkHV4oy7N2wgfpkQn7hp_asj2I32sF4iFmE=": "4004256000000", + "94pexQgd7PRiUMOGiv3M0-SZsdxNUE0nH7t-7KYDf-c=": "1046014000000", + "94vm1_jk8d_9SMq_mKp80RwwB5HngJ77dPDNacDep8E=": "1679638000000", + "96QABHyUJWBenaLMfS3q1VZ2cDsi3VEHYAaw4608AWk=": "472737000000", + "96sZCnpxQW55i6fEBzWr6zXSDsvbFGlMFiRhU_Nwlw0=": "846028000000", + "972lSvQm1mMel5FSkAwofQ93P13RLnzXxz_ZIMAQXHk=": "407808000000", + "97CwX9WNMBxJ_kPH1W_CeLmj_r5wZXRVB7MPvLR_VHw=": "792970000000", + "97o5HgNcNMs2DEcnLZncTbtbNJq7vLDO0P8TwQIX7ys=": "384615000000", + "97wNsvxoTMF_hc2SPlK680QfUOFIZvmaUwam30_CdI8=": "384615000000", + "97wRKNVE6AO8DEzd1Ox5sZmzRNiUoVkdjKfqi6ZAlsY=": "386318000000", + "98Ii6jKY3jzs5NjXrPWk7YFIMWo18C7-wTmSWWxBFUY=": "385510000000", + "98RJxlgHhStxkT5P0iiRusdJgoMer8KbBbErEX7aXBs=": "555406000000", + "98_kCAm-1aRdT0zSndyVfxNebv4CQWJkl6Fl_01XUgc=": "809005000000", + "98s5Of9QFOEM9jw0TS8MQTGxDee9VV6GzBdvdyoZl0U=": "457900000000", + "99Jn-QynKSKQ7DjDrC-L1FUrP3gGJZtkHVk143VPjGA=": "384615000000", + "99Ym9sTX6aDmpcn1FqilYVN4w9LgEAkl3zEhjY59VOU=": "1315376000000", + "99ZZOs86ZhhjZBwAwU9Z-0ni5mYQ86JTDvK-TqQnn3k=": "390880000000", + "9AJMW6ecvUa-sNPljngVytTxj55KadvASjXDqA7II-U=": "3846153000000", + "9ArJ2z2SaxyTw0pcEh1OSlFrFZUpYQCVTez5fKhle5c=": "800743000000", + "9Aw5Vs-VrQRmmocGr8M7q6M8u5Eakj5wMHV3QKsImHw=": "4479603000000", + "9BeayqFX4XayeIi7q1v-rsSokb_SxaX6k0j50nPDmUQ=": "413135000000", + "9BepV3nTF4n-aG9ffeb1dyITLZobWKZSu0awtUtk_7g=": "537298000000", + "9BiX5JomI8wcR_Ol88bTvJ44hPeyIHY7RvZJM0Dwobw=": "1636307000000", + "9BnQhgzKxBQrnD3igGYw5NP9h0FmfEdhe7_PoB-tpAc=": "384664000000", + "9BseeHsfPlEgSKcivX3wqG0ClZbnmWdZ9nDcb8XsAcc=": "1769518000000", + "9C5zydcIPsx3wJw_lv_C-_OScT_ACOfyK__HqlMING8=": "363462000000", + "9CGs55aNryA4nBPnd8oN-a6BAMuSJkOU6pXm9J2-q3M=": "445981000000", + "9C_z_JaZJiXLZDi_1hufgUsuEnaTfIxZBbyWQkbr6xs=": "4036125000000", + "9CdIYEvj76rrH3tB8zndyWLTJyNi9nc7j9wgdLBrG70=": "1041239000000", + "9CetBoJAJnia9nEVY5lZtbgHL4k22L1_MFNM_uyuFas=": "1386434000000", + "9D3nH6zzMeCDiTBpZny5DFI2352RY31H5R1ME9Cp8UM=": "384615000000", + "9DH_pve6eQG_0vFPtb-5ws447lqI4n8VwNwNgGQFEzE=": "458682000000", + "9Dco-APF8W2LCc-vrdKQyB8y_dpeHd9CcCKkWwkmBRk=": "4072337000000", + "9De0KakI_kicnflXUQyQE6WLBfZmpVN6X9E_1qsdVOc=": "382083000000", + "9E4hVsYvHQ2XrnStQReUiVlRKyQ0FOhG_Kxf2zqbIVU=": "909090000000", + "9EHfcwXH0ULIiojBIxlcQFqkPNO8hKadvqTiTC_8qT4=": "691196000000", + "9ELji81elneDa0uYK2SqagbcLaa51c9mrVwwbcNZAO4=": "416779000000", + "9EifCooTrx-qxBU1gQMWz_h4Psb8N2yQZkX1z90-ONg=": "6447884000000", + "9ErDWktgg4ufskRsiG4xYWvD_W-muGhiwG2MZq1SL3Q=": "390816000000", + "9FKp14xmmk_Z612e2KByodgYN-Guvk4VeM-OD5dAgwk=": "3893163000000", + "9FUw6CcDh-vTo7xCKzHJao5a9SjiSGoQ6KayZSXcLls=": "1156520000000", + "9FbHtL7CImm9-cLkaahSLjIWmzl2WonHKVDxA4RbCjo=": "384615000000", + "9Fey-HxaROzazJXQlGcs3ZeFzWPsrv5iezS5QcNgEuI=": "556960000000", + "9FvNZQl24DrKZNxsWjaegjCcfg7qM8OwJd3abPR6TYU=": "749999000000", + "9G9KVHlUih5rAd-3ZavFbjVUK95-ayIqM6cDgCIChPg=": "769230000000", + "9GdYlwdwCGILmHicU_5_Q2tXveh3OZW1wL4Iq8ZMABE=": "385509000000", + "9H4SZkx1oNZf57AAKq97A_rsBGBk1PwkhTq80vRk4fU=": "412784000000", + "9H6tNQGW4Ytce2JO-Cxar4uRjB_zAkHpXt2GA_p0jCA=": "383269000000", + "9HGaCuwUULXYX4B7pEHlzfABnWtGnGdLJm5gTCFNu8A=": "1828384000000", + "9HNEmoBW2s6C9uW6YNIvsCuC1JvgSTcLL8FKNq6roNY=": "526188000000", + "9HOXH9KXeH6eWWx6yzkdU1KfImz8q40fp0wydzCMpF0=": "490505000000", + "9I5FrxdHfPpmL8SxTOGd2-KXjf_4nVxgypfgqA3UwZs=": "388549000000", + "9I7pcOv03U61LnAP7A6muVDdNwe65SZkudaMmKJRyAY=": "411045000000", + "9I8uXj5Y-XRY--4EqLuq5a3ytXcVZel7DGla4XFL8A4=": "462155000000", + "9J7XQhUCUrI-nZodCy1Q-a4q2_dkKvbblZuKTs0lIJM=": "1483568000000", + "9J86ifcDNVA7Zz6TtkSw3j4YYNIkmexg1ZjYzIP62SU=": "390935000000", + "9JhyAPQs9FHYm4eCLs3Qd-9p_WmJQLZSz5P2BTrC890=": "788388000000", + "9JmRY18Rm8EW30TWnye5zfkPfWoG2BmBYxHfIjFn8ZI=": "1424064000000", + "9JoAu4S73CGUO88_DT-C3O01uqpgjqlsrm6LSWsWamo=": "462839000000", + "9JsOz7fhPfEuMeXwUtrFia2wnWdoac8jOrzfWPK09ig=": "6538461000000", + "9KAYglb5aDym9Wac39H8c0eIQr-2Gm0ZKEqmf-14E-s=": "465700000000", + "9KG1pUeZoE8IXU2xEH4Zae3gvYnRPv5QxIyOkM2QQWk=": "464533000000", + "9KwJc8nzIrlh3KcQj1ZSfmA0mJhgwawaI2LXZBI67fc=": "833347000000", + "9LCfCH8SCDYFtZpIwW3zt4xL1o1fhTUTV41GIJ04M5Q=": "419891000000", + "9LMfGQADEKoVVAWubxMicqs01ZiVirxt3Jg5mIvYMQg=": "1319281000000", + "9Ln-DQBinirbgYw1KxOGqZmL2R58ShRTrBDqwgmOiso=": "409116000000", + "9MAAxI0OcHsUZCodQ1lhAFsrAhtVPolDq-Sc6B9RZHk=": "1153846000000", + "9MFqLdzh0MqrsBrZChXEtURAqPpcS2CN-wiEf8JYCaA=": "808371000000", + "9ML7oqt435-o0KPuzEI7nPJx0UntybRQEoabmciksXs=": "8292539000000", + "9MRvLRsCaFHp8kFnLyyc9W7ST1ksDxE_ZZSi6Ybep8g=": "1722765000000", + "9MlxzcoGa-s7Hdw1q0FPvFdcbSpbxS6jIrWbQFiGxXA=": "2735903000000", + "9MwKMby7GSMkicTCS8ZXPhK56pkzx5N1xomNC4hruxg=": "902748000000", + "9NbzSyAl8z7-LHqKRtC75XtbxiYhLIUWvyojd2CV9jA=": "976053000000", + "9O9ftcVyomXiP65UGllKEYnB2USuvVmitC8LDVTcy2M=": "769230000000", + "9P828qFI9styarhLZeWIw_KjHI9Az2JOvHr1MQDRuT8=": "522041000000", + "9PEqttbj7ZwR32RmMq06AlLmS9rDRCpH4qu5Nm4p8M4=": "1153846000000", + "9PObfPFfnJ714m4uO_Hre9FlBQ90DEDqxhR4uBKCTCQ=": "384615000000", + "9Peb2wstXja0namg7eW41XeFe6tbYqJMtDPfVwc1Vyk=": "455777000000", + "9PieNrYv53OCvV35jGTS0sFiQTzKwLPEzCfOTuwt0Cg=": "395499000000", + "9PxCpfaTr5HIaOAJzpHRXJX2q0Nadod_skfTIj0ezjs=": "422554000000", + "9Q-V1-8HdhCPbff2YXYiGqwLr8jsS_au4r_JjpYZyxk=": "1155075000000", + "9QIXGQZnfTAgwzNhX6RZi5rbI2Y4ImOppQkjnIrc05I=": "916024000000", + "9Qk9ddn8vfiOY-6UPAoPHGSonT9AD_-qCApyaXlCDTc=": "458962000000", + "9RUpaD8V2xZGYPyp-lEJHd6Pkrzw1ZnliV2fxy5HlmE=": "376816000000", + "9R_0A7hcKwpCv6E37eKCvbDwrHuflOipX63K_kk0jZQ=": "1250021000000", + "9SLNQSOWlaODvQeQa8UUP-UnpKv3ulw8Lzzqvfe9cRg=": "413226000000", + "9SpJAEQ4Vfh-kNNVITRUQWmWrfPnmqVhyiqQfTSrKB4=": "520293000000", + "9SqH4oXKcczjt2ae_V18XLDu8S9mi5fKBNOa1oAjpWs=": "499999000000", + "9TFKVd0NrSlucW53qPi-oxvFqaxT6BvkmsNOftBBaFs=": "1041084000000", + "9TGqOrbhwaWwAgbKT46xXQ0PSeB6DaMOAsErdNH7nZI=": "416673000000", + "9TaespNoUf0iD2Z421luIbBd2tVG5kZw_n3Ni6HvsQw=": "6249999000000", + "9Tr7BfPlCug9JaLqTQJ64OOxNL3xnzy-FSt70vxU1ug=": "374298000000", + "9UDNFpBmEhvc3e_REdpVWhQD-9eQdr172tTGGB9V1H4=": "616224000000", + "9VODr3f3kx5nA22Mx4FPnUmwmASVHG7Cytpm46go0Bw=": "470553000000", + "9VPmUPHQDttkgGI_2LOG6jf73TBYg9ZSeqA4Dqwnx9Q=": "19230769000000", + "9Wh6rVSJ9i1tbuvOr_P2xjfUlvFGoKdAV1VG5FT_gDc=": "384615000000", + "9Wi6A4JaxB87qeNzdVVvbZOGEWfwPIpdOsx6LVasVSo=": "4658103000000", + "9WigTaPrSJ854InryYTCOTLDeUvpT2nna6XLkXF8fZY=": "1391315000000", + "9WmuxCD3d8fubjNrqq8QxkuxPGkpOdWZKvT4IZXVHOY=": "381360000000", + "9Wv1j3oH6iocJzBcvvmh9npqkKl1CgRm3uIxsE-yYVo=": "554116000000", + "9X975cPUUf586JjOl_vl7duQd0WT5o9Iq4WjS_YVIgo=": "775269000000", + "9XcrEq0KILqAVMp-mVagEb5uH2CBanxzbbr4OKN-yQ0=": "1159720000000", + "9Yt8JvT_hkkM9BhokQEHLnaaEMmNsCknv51YHFqlAeU=": "447070000000", + "9Z00_RQ8VmyQsuFYpO9wvqcWvE4jmRrKrA43nY4NBCo=": "379344000000", + "9Z22MRi60KLdznRw1r_o8YYlKEGgB6b_2oXpEtbo6ag=": "385021000000", + "9Z5mZH2M9BhdGNiTAiomQhfS4GnNib0hvhvdJSAWNcI=": "384615000000", + "9ZLS9b2ct0vuM4u_HKQvv2EY8ABsh_HfT9ssJ-Jbbwo=": "412344000000", + "9ZnCECt53o0hCMMabOwmp1IT4QmGAxIE1G5lnFaDFmE=": "423004000000", + "9_SG_vC-fi4Ny6zXOzORv6Lxj28wMmZnW7pjb9JDtA8=": "488247000000", + "9_VPrAwiCmIGEHlM5dUid5ety2lFZ7kAX4_0bBS2yVY=": "1814806000000", + "9_wA2httZxKr8XZPqbVWaLhSFahRem9Yy2Z60BXZlt4=": "832608000000", + "9_z5BAw4QxRVMadJ9Nmr0t129DhLeF8ta7oOPfNqDV0=": "769230000000", + "9a0XcXxqD9U6KMdxj3cc_Z5xJkPMobKH7aZJvMB5nJk=": "384615000000", + "9a5Xu_nbOEtq_jWKFmdJR3M3F4HNHwEtrjGpaDmxMjY=": "565128000000", + "9abv-pkaTH3nPX-Jn6euoibr4_Fa2EZnFCPnMU-E4JQ=": "448838000000", + "9alMnMNfGIkoYJ4KsQ-WDuC2CHw9ZBs-IenS2BRiPVc=": "23090727000000", + "9auZ3Y1DRZ8tocsOBhkSK4-N6bSdPcZF9k-blO1ir1Y=": "385209000000", + "9b2VM94rPfzfxwBd15kWbILM2PQgQn4fEImuv3sYPZY=": "379528000000", + "9bHHlzuSSV0xEBM_8eB2lsAYA_0UREKSYECSgPm02V0=": "6616834000000", + "9c6Pi-q7kEXvJ8FFDc9o42IXjmCffe0BS5hBfKfnOCA=": "415288000000", + "9cFpgU1EcNi8oaC4nEVjGZbQ0abfbouALH2zwf0g59g=": "391797000000", + "9cQG99FcZ7z2-ePI_ts8UMOD-Z37eFhQXCLWmQKlJtc=": "3855075000000", + "9cQkCQeyNf-g6WD8bLamTi_6JxfFSII3uqWi5y1hfVE=": "461906000000", + "9cxwpo_SgEY6mYxNeBelG2mSBqFn6S2_V-SSax8qfhA=": "464300000000", + "9dBY_og10aSV_X8i2jFl0OdgRMMXt7-sm9Ltog7414w=": "654571000000", + "9dCrX7C9Fq2G6hyYpZFEKFmYrTG2fq4zB_UKiB3Ev_M=": "825081000000", + "9dT7_xMWzPfW7yFkZH1RlKJxlgLtjvoOgJgzPtabqH0=": "1236310000000", + "9diHqKm5AvwhX9BMUi7v_26eXr8A6Rv46aWQYnPtwbg=": "1076870000000", + "9e3kA4A1RRvKj4GWDWVVU-ohtQERgKLlRgnUM6c5wZQ=": "3307499000000", + "9eFiUTRBvRiwxBhyq0w6RzY_ArKWJyIAgSRaGVZwkWg=": "416666000000", + "9eZNitLjIEWUNQ8TOswwxs-N_XmhxFxfiBkH-vFowIc=": "463601000000", + "9edCtPkIRZjFZsnj5CMeWkm9yVZj7KRNT0B6EzEJ49Q=": "1560352000000", + "9ej5yFyi3SqwX0NwqP3XRn6tPfO4Zl3q9XE4_ZPYPt0=": "410736000000", + "9gDZ7VB9vbgcn_gmogViMnkTbE69s4_JJ9YAWyy3sRA=": "1153846000000", + "9gQXOlCVdDz3jl48z4T3JLgoaEFU9Sc1mU6RdllgNmM=": "415558000000", + "9gTyoEMpaO5-uXTcC26hEea8INaeawOvHr7sVDUq21c=": "381024000000", + "9gVq_jGBI8J6YNhVLS7v5yMlD4VCjfYC3dmOBba_QjI=": "7709733000000", + "9gpYetiQURY96zlkI4Q-IAjccE6RzgQiY-Q0HKFRvMA=": "1641905000000", + "9hWdB97WPt3bn-3JRA6Cxhi0cmyD67i6Afmx6MaasWE=": "382514000000", + "9i3HsH_i04krZysuu_dxeR-SN3LQnZ_Du9JLj6Ucn8c=": "887108000000", + "9i7LKIQwaZ4pls_wrrVF2y1RLZMwIaTkxqtmK1d42to=": "384280000000", + "9iM5yA3GcQ5Ffxptsa_9DLPvN3MePydHw7cd7NJTVrQ=": "473692000000", + "9iq8aEzxOPUG6w-D9oKHwrG-oor3_VMgy6U4F5k9jiM=": "460628000000", + "9isrLqPuoGG0pIUFaeQZrNrw2IptVVLJ69jOmbAHYu4=": "464131000000", + "9iw09Q6W2mTvbXgFk2PIY3BfO29zKvGBJpzR9W-i5zc=": "460570000000", + "9j909yHfJwYDyAqMNB6IavvZeZYHwuevsrgl_5gEI-g=": "1924896000000", + "9kP1Lx3Q-zBWBpAuHoLcocm9pxUgcPC1qkXvOT-gRnc=": "9613800000000", + "9kPfWNKKSSGtAJA41tELB3HT_O-fY8hyDAhBdWpNBqs=": "2038402000000", + "9l-VntE-ARJRi_quLk4pX1zVPaF6beBv93Ya66uuiWk=": "838484000000", + "9lI_-jhyIisvUxFstLpYP39IdwXYW-YeVEqh5wYGVfU=": "381943000000", + "9lP92339yHZKXDgFa3sFuTy0t28iyOQMLpyw1IPsJKk=": "4166666000000", + "9lq6ZyQ4S3VlKY90PkiTejoRW3GL6TCqCRXrlsl6sRs=": "1156518000000", + "9mKOjYtmftBqwrF3k5t-RwLck76OBjGIseftqTT4IB4=": "636148000000", + "9mLfh_rbnIMgs8GuSb9OtLZ77Ov-bAVJuKZK_D6MJnM=": "501009000000", + "9mbsEbdQa-HITvkY0pAQYwgQ2EVm2jDtQGwZuwR6dXQ=": "9384823000000", + "9monSapZLe7UXQ9_qHDNX-saX4nPd4fiMhH6XSkEJjk=": "384615000000", + "9n0jK5xBYW3acvu5xthMsEG1NlTpv0hCrmhc-CamGZQ=": "2060071000000", + "9nHO8rWEb9LcMeSWK62Wk5K9W8PRKriB_qm95d407M0=": "3270534000000", + "9nqORhZ2xuuMpzMIV9GbTcTOI9NM9iL7P8wtFkdIdYc=": "393573000000", + "9o9gLcUvULAtMgc_7ebHCWQ8JQIDA5temWJ63nG8nIw=": "1628076000000", + "9oNHvehDr-09rSLEn2bXmz61q7THyoDGRBlfjYcUfnQ=": "386403000000", + "9oPDI-ctbOHVET-xKRfjXfQtSxhDrmfeVcFILVyFyIM=": "642281000000", + "9pRBiPursA8-Tz_OPlXN1jYkf6zqwIkm2c2CQAb6tjY=": "416673000000", + "9pRqrXOdfy9otA4SvOF7Ld9T-VWbcUv6yHzNCjbBFF8=": "9242907000000", + "9pa0DKbvhKccW2n8U75YgPfaI_geKXvKk9Ld3kf1rGk=": "459796000000", + "9pcHcy8RpUiNLVjis3rgzZNL7zZsJFBF6heLUoMyDPQ=": "2322958000000", + "9pew5pNojK3Y7KZq-4k5Pbu8D6k2rh1xyq_Lkc0siGs=": "3007688000000", + "9ppRZKzwFApDp6BoaDdnB6ZuXTWBJfSzQ4k5fx2ogvk=": "909346000000", + "9pxpEz3TNrwPoG9bm0p7QdE_ePfIivJ4CswPOGa7hFQ=": "385505000000", + "9qDktB2AEnA0tRarLOa38H0kVhUVbzj-01sJ9jemw_Y=": "463498000000", + "9qNPFcA6MVtzEvSfAEHVLj_RlubqHL9dILNIfEPDous=": "419744000000", + "9qPM0lhW92wDMsJm7s_lDWY16rJzxJ1_4QaPM6LDyOc=": "893077000000", + "9qfuULLySI5AqdU01r3eHdM4qtC99hhESWxQMpLf7nQ=": "4225953000000", + "9sqrscokIL3DW9Sj-HXszVJHUySnS5HS-ilh3fM6Lw0=": "4706592000000", + "9sz95hcXM9AhWm468k3d8BgVo27AaQkYoyvaNtrBnJ8=": "829274000000", + "9thzRcW4ccNA0UCzsOEc3yOkaWT7ADKQ0d7QccAzQEo=": "391889000000", + "9u25q4Gug1KQqGRUHXf07PF5i4UxMK8-OW1le4Qt3rQ=": "384615000000", + "9ubp3RsuO_Jt6ct09reuUdVpihVyij9R70Bu1HtjuSo=": "665793000000", + "9vFBZsxvbOOU_nBk5eSFOYj1oDQgTl_nCq22hhFhGbY=": "454545000000", + "9vZ7Ml9W5CvCtQefVGS0GL7U1o9CWjCgH6MWDzO6jco=": "3200845000000", + "9vefvUEyJfSynRhmm7uFtZI9wAVuPzEgRK9qEHD2paE=": "385395000000", + "9vlU3vtcm-3aTdWXZZatzTmDGHUYF7XvZKc9gdaDSWw=": "1223425000000", + "9wEIEI7Kpk6i-GcoIqi1Yjpw6Zd_n2UI8SfRpbwnzS8=": "1225974000000", + "9wTnZ_3RmoGVXTRDMyC3Z-R9G5zswt9zif9Tm4pkg0Y=": "384615000000", + "9waT0YUsI59a-POUUIVwHF88fHadoOJ4zFnArQ5UeFI=": "961538000000", + "9wchZqrjAE-wBO7nDmR86dHHGnMbk7YTy8WOaJ16J-Y=": "374878000000", + "9wwObo0lynHomKltnDR-gTgScBV4M2mhlw-dvvD7neE=": "769230000000", + "9xZCc7UxN_5oA7SjXb3uCKoi41RoR713FCBc70PJaro=": "928736000000", + "9xjnoss-vX3mnfW9wzYnMfqPA0FAhwlNgQHgy9sQiAQ=": "453157000000", + "9y9fRcLjQS0dZ-raf9nsKA73SF7wLUcVwPMZ-dLMhWY=": "5547883000000", + "9yHrhR7eAJExnWsZxxYYI39tRsf3hV1fBGdZlnwTZ3s=": "384615000000", + "9yKZVhefKmz8w631161c1FZSIqzomJ_jf6QfgGCA7fI=": "1900892000000", + "9ySz4tV2w_BxqgM4k29QINHdB9ptjglQyOluq9Sb29A=": "759747000000", + "9yTF8J5BslelL7C9_lWqIl7jQ7lL1-xqT7EgG_7ok8I=": "384615000000", + "9zSsq1R9SWjIsaW9qJAysHQ57ZNs5D3agn-AGtDE4-U=": "916278000000", + "9zuYMSHSaQVKQIjNkZW97h8ClVO1WbS2Gr_jOQonC94=": "8275718000000", + "A-IaED43itsNNucVAIRBbi9yxAklziq3QnLX1n3sx1I=": "382210000000", + "A0GbekloVof-oZXbSpM9Uf4RnwtLpVVil4KpDwbYaw0=": "1219316000000", + "A0XkSOzinA3y5JOp1-qso8VjhXJPS9AAeRviypCw0nc=": "390465000000", + "A0oOjgSxOBQK9oS4ElgFvdLJQslSEMr_Bhc_C88Ax5Q=": "384615000000", + "A0qwRUxmJ1dDNujnw5gA8-3Uig627yN9-NvZaFj5__4=": "2886817000000", + "A0sO2Jtwp4eW4x1Xzw2VUmeDXrQjAYXH2HrCRFdZoOY=": "381802000000", + "A0vM6O0TBil9_uR1gyKaed-XPJBKZe-9kdnLsunEtFA=": "384615000000", + "A12L-isZ6t1__keVx1-RzXNW8obWpGxKdeseV291tHQ=": "604892000000", + "A1LS2e3os4tzjkQMVBJZorLuehXCtQhZpZL8iCdqCE8=": "2773636000000", + "A1mkQpQkSBMQHrStgB2l7jAYSKXkEDpuyBfTs3prJPY=": "384615000000", + "A2Eo6KNHMI2hdikRazSTveIIwUcFF0vCrWiLcctSTFo=": "378257000000", + "A2N-vEMKYPfi6IsCxPAahL_zjDjgls8ZIr_407-JieA=": "463190000000", + "A2Y31MNXKvi13Hd14ZQLolV_REkYcdPMqBqT8rN4meE=": "417632000000", + "A3E3rI9br5sm1R2CoZs3FtnVJ4LWGl2Z-07Jn8gcE3U=": "6134615000000", + "A3tMUjPBJEy1s2_z0ImGRmSk_Oh8DCm5H8zYZgvl0O4=": "1923076000000", + "A43T-z-NPXa38YjWbrIE6nLdzXhA4jtoMXntnkWUXVQ=": "764788000000", + "A4cdi8nPbSyw4CpTsgMV7ph_Z8E-OriEIixZ8i30ic8=": "3296032000000", + "A4yJej6KjPNYS86mKcZH8z6svG688Iy-4Al__VFFBAQ=": "1358221000000", + "A5iSZ3s4cKIemGw_WonVJgWkvMLVF53GeqaPTnqcccw=": "33204281000000", + "A6Sw1jXuP2Y8O3EXk5F1T1pbfS9DlbI02HbcR1GjoOo=": "450223000000", + "A6Yo45JJbnSorSczU7voPJ-SLyjwrkHzyIcmpoHneKE=": "1900892000000", + "A6Z662cq_yo5p5sXxi2fopVYVKJ3xSFIgOaMtX3iaC0=": "385509000000", + "A6a8r36yso4yhMb8cYTPqhq0kW5HBAiBNrYrc-NH5ww=": "769230000000", + "A7AnPNPR7pqB7iRwJp-NxCFaUK0fiOkwciDtNBGo1Xw=": "2499956000000", + "A7BdnMmbxmTENoaLFGcUkja1CIJYZrX1UFbyH8rM0w8=": "385040000000", + "A7DWv-6fiQSqb2ZgKNfYc9JHZIbZoWYEW3pU4QUfnRQ=": "776759000000", + "A8NgO32ciHCUJkqTc76DbsbrjRAxJxsg43V--5tYul4=": "3999999000000", + "A8UKfBcmPwqr97UoRkfcOy2oiw5lXuUvrWbmpN4vhDw=": "9811199000000", + "A8uY9Gt5lrgveS0iH5qfcVKNsIGMBNsbn1S_WbXWW30=": "492798000000", + "A94wNxLeRY90Lh0NtS2lBqB17xwRKRVB2PWmq1oG7dY=": "4201021000000", + "A981Y8WFFlzQJQDw_dfIijVSvoElDAxjqLrQ0MW1aFE=": "403846000000", + "A9QV-IVbvLmamb2SRW_4gZRqU-eBbzxOwkfdf6iLkmI=": "441063000000", + "A9qPG3MsgbxaZHWRg7U_At49p8RN5d3yiKpS2IWH00M=": "2476818000000", + "AA5RbhQD0hddULU3lUvaUYuVVuvYKkH783a059KdfqM=": "390975000000", + "AAG3vJwTzCcL0zp2-1yfI-mn_7haYvSYJln2xR_aBS8=": "538861000000", + "AAlsMagn6lX6FTg45J6Xa8wZs9g7p3bByg_hcL41OEE=": "1153846000000", + "AAyYagWu1mMRO2W5GQ3zoN0VwdQMv02UqBj87nIwwFE=": "455585000000", + "ABDDLH6JeScraMAd4vdMmbCeHQoJ9JAE00_jVgda0UA=": "384573000000", + "ACaVXpn3a_TcPHUo86VBogZm91TH25aPTG81B1cZHGk=": "378507000000", + "ACyWHbNFqfCPtubImyFr-LGBMeUH9v1DvcndWNtk4XI=": "499999000000", + "ADqjR00LYVta6pPm7cgZsuBU5jqgSpbYN4fzr6fBJ1c=": "411085000000", + "AE9YIAfvVIHQRUKwqgWwDw5RqrnX_ahPofK-LobXJm8=": "456350000000", + "AEIG8n-91DjRBy58sYTcY6bjr2ly8lZmHaA8AnorAtA=": "2500833000000", + "AEL2oKOqxS-sm8aq26qOD1enUS5fpVIUVGK0hY8Rx5M=": "384567000000", + "AEgjySjAeRO_0T8ZnfdPuCFuNdxF7dczJ2kyIZORlPE=": "2609588000000", + "AFHG9Fsie24WTYTIIMZtNzAWgvb5PnMc-WZq2Nk70dA=": "452425000000", + "AFQO4nTye6MqK8bS2oUeZZcId90z77pRfu5UqP6S7MU=": "351713000000", + "AFjLO0Bpqi7Qziq_jgh6s0uazZNx5lc-Dglk5ny3lBw=": "7472644000000", + "AGBqucHtIGWTSRPAFRegadJLbcpIp8vJt32PtSkM0WE=": "901105000000", + "AGIiv8X4qHke0bg8wDHViLiz9S_tQbEmyJ2hflNDCTk=": "382736000000", + "AGrd4WxVGUNFo5rMuqNCfYZMSDCYt4DUzpYPGwn_Amw=": "500919000000", + "AGz5-xtBphY8yoE7ix2j_0EXK__CumgfsHPRvEjmWww=": "462355000000", + "AHOvofjSu_g5OJni4MZ8vF7NmwLKbFArRTiE8phRGYc=": "391257000000", + "AHftrWcx9oIf6a0SKBeRUCgT0wYApAEcxcZFfsUM9z4=": "7692307000000", + "AIMdMsLVq-Kb4TnSUNmmXsc0QabEHCMecHD3nGJ04nQ=": "469217000000", + "AIxOxDDkz2ijdxkSLH0uBRcbRXBsXiEs8LabIUAmqZI=": "383233000000", + "AJ1_BGQXLk3y20MRsFSmA3l91lyU92HH3xUeUJuvV-E=": "384735000000", + "AK0T-d0l2zjpnNDxCpp420Pk72N83ASXN4pJy_f4usA=": "380005000000", + "AKLG4-ZnLGAAEMIJJa8PSaeIvf5ThZ0P8zxmvCEFCRU=": "416901000000", + "AKxSLMk498KINY5bZSI0XUHqYXZGYmYtv3oyy8x_Muk=": "385506000000", + "AKyN62A5G4xHEHhZ-d35X-X5woDGXUb637NiOtmvU5Q=": "500305000000", + "AL1oYQG5lwt7Xdnc87w4yEswfFvGgRURF5SiFjGX5pg=": "379329000000", + "AL42M9OmtNADMLdkhwEPM4H2wSrScsAvYFMyaRr-jCw=": "470773000000", + "ALTDC-Y4Pypi8gy3hfWBPPVQtuLVGh7msqpK5fOKgT8=": "377802000000", + "AM6tz_qWRKraIsfmAtxGXaj_ggxLyuJp1ihF93WQiXE=": "386888000000", + "AMLd0ZljogyMKzHg8VP2W1Tx1HbWrdsqP-7hZCTrdAs=": "2323289000000", + "AMbpONnAECq2fD7ZRBFCcmm6Hr8Z43OdYlPCR5pVu0k=": "1136692000000", + "AMcIGPxNzpCcNQhUrcRCwVx0SfTiumNV1wT8TqPVgEE=": "922611000000", + "AN4zW6udRPONEsWATRhEImIjDj7VksTaQJHKXzGugjs=": "384057000000", + "AN5OV3nUF-d6XWBfoJc5HnJ_oX3JAhmDBzGzcMVZMtw=": "455600000000", + "AN7mreLGb546zpHUnYmFeKVT5PJlCQbqD4ihVy0gC0s=": "467580000000", + "AN8nyyYZalhTe3zEUjRlzyqOIooS3EN2U-ZJIYYtTFM=": "464193000000", + "ANExpOgCcIN70aS4oGtmY0On2q0__pojkuv_mxs4ZeI=": "1926223000000", + "ANUDtNxGfoX9Fzjo_5lpaEzulejk4Va4dfUAuQBolok=": "764788000000", + "ANZCBTIZg0JIeXyg8RXnF31T9u3Ec_pH2IUFGnUvkmc=": "8312599000000", + "AO8wi11xxUbqCucNj7YpBsLYPQMiDdUmASyiORuzbUs=": "697408000000", + "AOOk4MOSJFtrznbXfgP7vb0slGMVMsZiHYkywBS4VD4=": "1538461000000", + "AOoUj3Er9K9vX2Ppr6WTjYeOb2unPUof3KdCFdu2M2g=": "3200845000000", + "AOxjfKL2D4pqQ2VK2BOg64R_c7GUWIMQxTTTZGwxeVM=": "597896000000", + "AP288SESug2ZSRDYGYiy_9Ck6kmgK93zdun_xKj1Z1U=": "412542000000", + "APE3-9rdAX4zkOp5a29Yh-1hSTC5_7xb0QgqSQAjnpw=": "907420000000", + "APoxni0T0xBD1JhAzdkJZcOxhrCokQDhweOt7Yy8f2k=": "387025000000", + "AQRmXCOzkG5LLK9QyvEYv4HiTrRH3dBAm1sv49AfUl0=": "715399000000", + "ARIjY6GHXVOcmRDSJBehmH7oI8Liq5BbSLWFIPBM2Mk=": "1219342000000", + "ARSiRdGNGFFkIoDxEPYH3SRDVy0Zg00xoTlEIGL7QVU=": "764676000000", + "ARxPCbv1n7fvoFksXSnXi29zKHh2RtQKStGMiahnBn4=": "6538461000000", + "AS5BU7t2yIEo04mkCQQlGdbT79X1VjGwIn7RqbKR0os=": "380723000000", + "ASRsrCyF0aYqoq46VGaJrP0DzXi8JGgZJq68aL3PZE4=": "906637000000", + "AT9KM5UATBqPJP_4mPGJmLYauJJqaset8PfjnpTkGxs=": "1249500000000", + "ATLsoSdshy6aNMEa3sVTPJIRMQRLUR3ao_bwZzlCPmo=": "833323000000", + "ATYajDz9uXx_cdMTcxPSPo8evF--GtA2zfOW1qpDqv0=": "909090000000", + "ATbWHKol0Z8vaZu81OMBNJxcCWkuGpiEUKhJWTt_MgE=": "471199000000", + "AUIL9yljW_rJzPnJzwmUv0zNAqVhW_jTsjTrGN6V2tg=": "459379000000", + "AUh0J0p-d9mfX2iSZXPVcnQCsIADJDHkC3MyPxbfYMU=": "459656000000", + "AUvFMhqaNCaRwkibWDcO-3MY1TvuiUCE5KPm0enszys=": "383700000000", + "AV-Gz6XkdWfgO2X7bhHGdr9dJJw6BTcI6gve_wezTf0=": "1526537000000", + "AVhOwqjrbcjvtWbjvnjjKIQ5Z_E3xSQh_ltTi8hT_bA=": "1126941000000", + "AVqnsAVWKPTKu3JqRqQpEPI22R-TH57i0HdNFbXS8_w=": "2285706000000", + "AW5RBWejhUtM4u0jJDah4Jx5nQnGr8jH83sQFatts8o=": "381437000000", + "AW92QewvVgFnjF3Abyar4sAAZRlA4KjuyfHyNa8jmgs=": "1243022000000", + "AWRnJmUmwHkwVnzIX5AP4JXhC0_4rCzEcoaaNzAIbJQ=": "1548420000000", + "AWYlvAEaWiRvXjAt0-7Ximgunpe1HHjp7HBULrNF5CU=": "385510000000", + "AWb_7n6lWKKLxF3emdPOPr2iAVfaGMGzuc5nzfqSPFc=": "756683000000", + "AWhBuxowjrQoUrPIbpIpqldw3p4saHvKO91RhcSFVUk=": "1125610000000", + "AWlVHrW0vI1rbXh7wMfgr26hLlBJV53D5oUN1JQ5TL8=": "7692307000000", + "AWlrde6K0KE6et1u1_xnAgszgQAsVKaNt2ldi7JMc-M=": "384615000000", + "AX_Zz4GHnwIug6qsodDtnAeemk9xFzwMjA1qJ92iOtM=": "3969178000000", + "AYUDhV-hCgkPf5XUZor6GnmwHcC36Ccdro3Mc4SkASg=": "5901881000000", + "AYdrXa6jo_IlfbTU2LEJ4YY3HM7wnjGQqYgDLtyMjBk=": "2088153000000", + "AZ-AoUnnbbW1FaLmzlCAUnzJzOB9_tod354aoJ83_AQ=": "394620000000", + "AZqq7IKGvB0UuVJVg-wbX8NQQStSFYwPyrl3F6ltVsA=": "454817000000", + "A_WFTnWio7NZoV37EN0a7PrhrM1-eOkJCFMnyRZWi_0=": "769600000000", + "A_eLO5FCMAOkkfVBjPqjvp95GcXjbsnWUsNmDtPwdzw=": "413274000000", + "A_pBEtkjlASV3wonbrpq1VFMdWCzShHHHAekoyYjtsI=": "848360000000", + "Aa4RRLi9VghySdLeNXN7OcPmA1RwQTuQa4H933JZwhE=": "11544307000000", + "Aa6v9PX_aCM3e3JEMseqV4hZ6MzB3MRjWF1t60pVimk=": "670041000000", + "AaBMimky8VlEezNjP4Mz9zAgZYwcyh6f4J_jKdhdMNk=": "5384526000000", + "AaMLrw65BQXSUQxCHyY8RHWpqxhCJzBWKCiilOMyPMY=": "415279000000", + "AaXawgDiHoib4-8zE_Xw-64NYGdR6-PpHt8Hbw8wObM=": "1261259000000", + "AaboZfy5oslrcBkDs3OqyHSUcUacuR8mSf-DOqgthDI=": "1155751000000", + "AbWimy--lhNHaUYt-tWquRXVz-dbW8Fb0YSjDc-PqnE=": "999999000000", + "AbtJpgO9uO643nsG-MCNEgHs2NLeXSJBq0FWUjOUNaM=": "452120000000", + "AcQlVhgYy4xMiTIIUu1A99UzaN2sKCE0ZNqa6LWuJWs=": "454545000000", + "AckzZJ3owKwsGbq49ix3lCuM44E_QixDDt3P8Gm9-Yg=": "769251000000", + "AcpxmB8qjN9zAnSi_jHwt0Ko5Ei5bea8L9M-NRTsTj8=": "393034000000", + "Acr5O8PujI-ctLqJmwECKGzOQ3SO7Vw--w7kKs5yqD4=": "478948000000", + "Ad-OSpV0H7bkLDhALSFy5_bAslLSdQoBuoL11vX-kT4=": "1385834000000", + "AdA6qy9-CnR3R_1SEjeuobJ2Z9E8_VBdb1l5jLpifO0=": "385506000000", + "AdoTC-YEf3PZAqqylQe3IXmb2b50fh82NOrCrYstzk8=": "377629000000", + "Advg2yl7Mq0GpIT2xNX1XBSMpioRPD2Nhg8-O3WL8FY=": "1504630000000", + "AdxZUZwpOq1xZB6D7mxZHM-Eih69CkundOpiaFlan1c=": "385507000000", + "Ae38hD80YS6bCMs5O1xM9s9w_q5iMbagwHTD4_CRPlg=": "2118552000000", + "Ae7VrwIYRzeysI0slO73FH_Jj5YInJ5afzZyC-Pm1EM=": "469809000000", + "AePF8Ax0A5cdodUXh1jh9QOQDKkwYvXWE5hzB1gdvbY=": "1999999000000", + "AetQj7VykadZeCz-HAIEHM56VkYnPzOygW_G_7VezI4=": "3863186000000", + "AeyolU_P8ThU8R8yCnws_iaz6iX6bimRdaHLhfyhVs4=": "461538000000", + "AfIi4kf64a6Qp6Z--2OGvEpEd2ioxQAs7xBjbjRKaQs=": "1000549000000", + "AfJ20rOPSM15ATRDoNr8moePLNX1bCqXhwgaeOJq2lc=": "385211000000", + "AfVPJDs0cqz8ONhrAuBiOsSCbg27N0uFmdzeduaHcV4=": "417633000000", + "Afhs5tPFPqDr2EnvPWWDUVTQBnEYaM2rFpl4tEdq3R0=": "1923076000000", + "Afn_IsjkSpaahJAdvg5znN82mtU3Q2hHPk08yusNv-Q=": "2279638000000", + "AgecowsJH19pZWAVH5JdljHsKy6gwQhhRLn-CO5p5Cw=": "381282000000", + "Agn-CNr7bxf65CF34wNSlYjW1Qsp8MKrlX9yBTN86sM=": "2055429000000", + "Ah2ctraRlQ0aG1aDx8vwKxBsZkhcFoAmylT1xAhn6dQ=": "422561000000", + "AhIwFCNhEzD6lR9FVWBXjAj-O_iKHXHruxTJlsJ7J0Y=": "1838066000000", + "AhYMdK7OiL4CgTChT6gvOB0vmeE-xMIS7po_dJ6ZGnY=": "381805000000", + "Aha-JJoLqpeuoXDs8C4-x7S4O6_fNaEF9w5FCTQ7ouU=": "1514448000000", + "Ahie81faMPVS-qbIDrQqdPdN7IRgL1-kv18knX_Y6jY=": "383178000000", + "Ai36erV3A0W7FGcUZjRjTdcW5sqv-nYcgrboUoSAf2g=": "617122000000", + "Ai6zTQz4fmoVKYUC8FTHMUlm3RP8JS7mfdUTBFTSIRs=": "383558000000", + "Ai7aYgbkYqb4Ny-Zj9t31RQWFkwRDc61bB4dzAOSXvc=": "772795000000", + "AiBnPKuZ2KRURXc53dvaHNSmU4KZVfjb-9NMJjomvic=": "465118000000", + "AiCxyqCOXl_J_DY_n5uMBUADNRpImNR-e48KntPe8sk=": "384615000000", + "Aif9tEOnr7xl8jkl_FHQK_Dl1QYgP5NqACxTwsjKwaM=": "382471000000", + "AinjrfQUmwG6Ga2_03EMm0FvR1VjAfy4g8RHJeGJzaM=": "1362114000000", + "AjGB27_UDBzsn1dUP0n2S6wQXWzFo47Xg7fftPNDLwc=": "385507000000", + "AjgaRSYeo0xjR1lieBnnVFCs4qdhpEFw5SkbUflFf-E=": "480295000000", + "AkC5vpa-RdCzpUYAuK3oYptPKKwGMmkuD-wsUoqtkVw=": "3999999000000", + "AkdMr5jsjCj-LNnga3DegMpFK6WSb1jp6gGiFdx7ER0=": "4032556000000", + "Akn2mUyHasJ8s4P1PheZzr9m0whdsZ_y5pie__eaqrw=": "873076000000", + "AlMIYAiW13q9EZFDg9bJbcF64gH2VxA4m8dl_uwv8xQ=": "391493000000", + "AlzagOg3TtaWuHccl__s5jXmabqOMMyYssPbry2AKcg=": "384306000000", + "Am1GGq365UXVvr1yLhM3YzSbI0_cvlAdsFPDalIekdQ=": "384615000000", + "Am3qC4LE8PcGIqoHXFpFyctwyth8DJoCh4GFuAM3MvA=": "391841000000", + "AmDCQ1oxH-HlyeS7CIrnRcEpcwr-6K3lm5KWCVUGrbk=": "385528000000", + "AmEAPevY0yEDZeb-0VHspEeb5m3w9ckEiT4_jR7JmhA=": "466580000000", + "AmMz8F7XZClRViKw62SwFacl4wIZApeh9WVhnfnPKEU=": "1578823000000", + "AmVHujYkbOjJYeUzrf4bPLjj3hkfsx9ZIlzI6JDDQsI=": "387499000000", + "AmvLl801EwOKFY8STcR73h5RJ2Bk5s3fi4sKi6wiKww=": "427712000000", + "An-E1qiKqxSsTngjq8zON1AcTlEnarFckJPWgvvwss4=": "459689000000", + "An5adov4FM93U0UTGG7Q43Rn4TaJiNBlojxKp9UD1jI=": "460990000000", + "AnsLKlrKwBC-W1hHhopDSH-FggMIWmNaPa6LXkgvjx8=": "6478774000000", + "AoMM321wwnHr5nJfBAApbquKtUbW4dUVmbtEVS5YFCQ=": "684830000000", + "AoQk9dsISNrjQ390HwJAy1evLoBBfUJhatG4YB2bcVg=": "2046556000000", + "AogK78_I74VdyQunRZLdgdqh9Z4nMGHDND1FIEjJ96A=": "464470000000", + "AoyZFQ83AN1d3bd__CG1Ohlfpf5495C05cnj8R8bhSM=": "926215000000", + "ApNbKpkJBqu1H6t-da536dydpjWzceQwgMACTYAfS0Y=": "849795000000", + "Aq0uSR62UcwpPT-CpAlH9kJogcXRyIZ99CEnGvnmO9E=": "2055429000000", + "AqI2cuA5Rjafuo1pmmItEPNwcjWrHfcgbkG_AYG9okE=": "384615000000", + "Aqs4vL2PJ6KYxNyAo9xVqDky1-HhtoItEKX8blnfPKI=": "504545000000", + "Aqva0IsLbRGANDyoekLDCxHjiVAbFXH4tHc3ryvQGJc=": "464104000000", + "AqwNajgqEpBc20ZUKSbl6BEk6Jyt0gV9bHlxsrqS-kA=": "457053000000", + "AqyHr9LrOMPD53o0ynr8_ebIc1siZ_7RRIKP_WkGr5A=": "576923000000", + "Ar9_MrH4lvo1DqtTo6H615JSj5K2V9i2VVc9iDzeLd8=": "849732000000", + "AsPj15TTsgkYbU0_T1TZkynZSj5HFEOE1GRYTW0e91k=": "5042296000000", + "Ash3leApd1p1sBpo6Jmsp_x2J7NY1rOhH59jNZrYzAg=": "2011756000000", + "Askh_mWKxfYJUfdh0_mKctK3NfJX_uh5tlh_j2-u24c=": "777878000000", + "At6Fvcia7dsGkS6iBFUCn584IRHag24-2UQtItUziQQ=": "384615000000", + "AtEAMxhbtnoLL_7BgY8zr_rilmqalJQB3d-v_YjYUKo=": "384580000000", + "AtVeQAE0iN62JhetONLSHyKSEhp-2WSUQyNHKfqXCWs=": "1923076000000", + "AtkYYcbs1lq9_AUlhXf8O4Aj2yWB8fvibbvxehTdAJQ=": "1927545000000", + "Au5WQM2c4w1LPvAAmHetlDqdnniOov2V9j_sXYEk8Ec=": "3846153000000", + "AuGQtZw0UoSR2Tf1CyUP2gIswnkUfwxSjGX9-07m7SY=": "384615000000", + "Av5eAp70sIHOH9br9EXLXPZru3XH2-7a83gicd8gDCA=": "412505000000", + "AvyfJXumfLY57bI6Ar6yiFX_Z3y2v56GjkJLTSVxOEM=": "385505000000", + "AwKZ0o8SvS8slN-TJQWxXUxNPot_vpW2s6qS6D-VFmQ=": "1249999000000", + "AxGnupbEMskmVknrUTfJaEuDJzDB2LbA5qlv0WaXbpM=": "769230000000", + "AxgfqHD2hDJmA_uPmNiGHYyLRtdu_F5l6URR9PQgS4s=": "384615000000", + "Axhqt0P_D9L_RrvhBAueQlZHoYp6mAS6inUbg-n37D4=": "384615000000", + "AxkloToxS1TJIHdh4QGLBPosNd2wzT-rP9iEmCoHeqI=": "510841000000", + "AxnLhweA5x3LFkUBUZLMktt5Qu9vWxcklTlyQlW5BwU=": "411969000000", + "AySod4_PYPUEflexb8uOBI7JCFFmcei8vtsV2G0v_0A=": "413846000000", + "AyY88K0RzBnk9vCxM-7Prp9UEJdQioUjX_1W4CPA_J0=": "5926824000000", + "AysMuwbbFEbvz7hoctwYgWQUr4vh1W4QtiR3p692DZo=": "416666000000", + "AyvH8mJ5Mwo45qC6f2udeWmSb3XsF33_bIXoRrYo_iQ=": "384615000000", + "AyxG5IHNEbcdq0s4L2_TX0ntIUUfFnhV9fSELG_G4pQ=": "2034292000000", + "Az6Oaclv1q0SDTGV_gZ4XAw8Q0nyMGhMyi1dgKWcwCw=": "411085000000", + "AzGookv2lY7fC_G5PG5zEo4SwjO2MMX7qneBEXHtEHE=": "4225618000000", + "B-BbJtJSvl-RM4rNia7fHH8MIEKoJYscpr9KLXVrXG8=": "384048000000", + "B-vVRYr80vnR4LGScgsTSc7GRbLur7ApAXuhjm1Yrlo=": "496282000000", + "B-yNA2dMy1QKgrxujKByfYcoISoTasAG72gabUFlPdg=": "410047000000", + "B00Xu2ChwZ1g5tLAa_prN-rrhogosHqV5i_I4mDGKQo=": "11538461000000", + "B05GhAzBk2sirXdPRx8F8XRbrgs73B6VYLenYkIDp68=": "1178432000000", + "B0XGPPlvFfIQ3iXiSjtI8qbeaXRKG4nOGG3yGrpBTXA=": "3734902000000", + "B0ZDY9e9vyHQRXhM6aM1wjEtBB3hXS4GllonbylV7tw=": "384615000000", + "B0iYBoM7KgwWb1kmCZIt1--zZz53yUEqg7DOjUSGYeI=": "3831778000000", + "B1f87PpFI3CSXS8nyQWdKhQukRAAWE6BqJFW3tX2iwk=": "761824000000", + "B1o1F2sZ3l4j3PC1hTkdDUs4PJ_gKGgff3EoSDQim4w=": "416652000000", + "B1wBx9h3hd9NjWXZEsft-JallG881kWvSWYr_9WkOJo=": "954086000000", + "B279Si55b94CdSmxzaI5hUn6J4mcB-s_l3xKY1rUWa0=": "809021000000", + "B27teBBlrC-ynWRfhgpuPFS7G-t3VcPOUE3LwNo6R9E=": "385509000000", + "B33ytm_bcX40VyK-6168wltqG7n_kiR6Hhm1Re0xWEo=": "3855074000000", + "B44IzDurH8SCLojNfRjI77jkBEBcDJwoOIQPXmNwaQY=": "413030000000", + "B45L1-IN-wAS-R_wl2BTGdzMHZiD34lPuHJCH3vDQkc=": "382130000000", + "B48myFKxLwLisuIgeAaMpYfbrjm56cRav_98Zw-xmy4=": "385506000000", + "B4Bg-AWzceORR9yAP_1KPMHRLdKSQDmQBI5Q87T71cA=": "455600000000", + "B4WIg9D6OIkmTpVSKRa6L89NKA9uSJC0LlIV0qLLlMo=": "387073000000", + "B4j7xyz_F4dOXdrl8vyXG_q6NOFn_bwZoSOocImjgyY=": "384418000000", + "B4lQP4jwVW7JgC2xn7eN614X30l1ltWBZgGwJuHU2iY=": "5384599000000", + "B5BRUdWjb4gAkyqe3aa6LXGbUjLzzHHcu3DcofuRILE=": "416666000000", + "B5WBwTaRBzS47bWi1dANrAXhqWQDNPok2PFQg6kAyzw=": "4999999000000", + "B5_59t0jtlohx8bsYLEaGH92mEFTWdC5GmKSBhR89LE=": "2734973000000", + "B6NxpMWdGJ7KQ1bHXx4JQSSE5mfm-7MlR3gQF9zH758=": "3256987000000", + "B6v53zwna4O7wTziFa2D5RO53yWN7M51ZDwHJshYMqE=": "4545454000000", + "B7CuqGFAeQbuOOSX5vCce8A0XDnSgqVQWCjs2W_gnF4=": "468609000000", + "B7OFiKwYllIvvpAbaUNHL3RfjnO_piWmtsbDReAhfbk=": "996490000000", + "B7kZKAPWhBSwwkcAkLycdhfEAgMF_q63Av_IMIs_2kE=": "385506000000", + "B85nWdMm92qo7oYI0qhctrdXIC5xYbcgik61ELuY2Tk=": "1705504000000", + "B8ULXieKJlhXI5Y1kx6_tiyz_zcnvUh2L-xg3OgvHBM=": "908871000000", + "B8aI5fAAlUOy5nD141--7OsU-BeBcnENw8ik2W37xr0=": "452367000000", + "B8aoxyO0xLhuy1a1LiAn2AriP8vcGkPTOb2bA1hh3Oc=": "478213000000", + "B8czyv-f39yLt2eRFTA4Fo1VduX-Xc1PULCzia5TAMs=": "768362000000", + "B8qGhOIuZuSXzUHvPkZ8OQH-EGnEM65UWHqBFTtccvI=": "416666000000", + "B9HQuVzcK7tvB7EfPDKdPSGaMEDsTCCV96CZgUGK0ss=": "1156517000000", + "B9zjzYbxOmq8sWBS6ydSdHVAvn9LdiluTHfX9aHJbGs=": "769148000000", + "BA6sqVacdjzaUHQ3i4CEAnOVYAx5M4aQdM3FTs37zfs=": "731894000000", + "BAkg5oUGtXhKtcJJKmpzXRljSbMBg7xFzZ2dMs0xFA4=": "394154000000", + "BB11rkpMHNZQlEhP2hdC-plk7D_rxE6o1-Kj1ii50YE=": "374246000000", + "BB_1LMB0NsYvASFZRbAKdLv4nfwccZdGi_DEOx6YMk0=": "385236000000", + "BBdHWC54Q1rLolysvpqbxbR8UB5TJR1aqNH669QJ8TY=": "4598872000000", + "BC6dFkVCrlQO0pPqMMtSLOvyYcPvT_5_SUxfmfFAgR4=": "574786000000", + "BCPzrvD0bbaxUckUYMDJNBdZvjAwHsF9mP5nkGaIw0k=": "634347000000", + "BCtjkhFqCEI9_kXNlQ0aECB1KOJDmG9MTNIac_iWCq0=": "1153053000000", + "BCvFrkW38_c6BmP1jngpQ44bVuC0sLcwn_pPMfr-cGU=": "407560000000", + "BDIL89cWkLx_xnR_WJsbFuLO3mwy7NMSari6FbDt2V8=": "2083333000000", + "BDKzchVcqDECcvMREuMXqwjjx8n_D-EbXVKpMjQn1RM=": "2646555000000", + "BDMblh2CfXc7fy34UNZ2zYUTnOimf9FsjoOJwckRAag=": "499999000000", + "BDaurAxSa02tGFvK1xO7ClJK2zwGtgdVO4_NxcYDU-s=": "458095000000", + "BDmjsdUsOfjWhjF8B51h8oXH0edeMuNgezgxmCOFVOA=": "384615000000", + "BE26hIsBPiRLbfsxaTRTR1C4aQFrbMWd3QVM2FhWgac=": "455600000000", + "BEKeZ2ZMnCoScNC5oxxUgjz4Z8IBkekpC4kGPSD-bb4=": "1341169000000", + "BEeQkvlI0e5JnrpRc67ddPw3Pk8wkr9E8OuYIEI2FCc=": "826222000000", + "BEgVLkJtXmeSHtT5qrJIwn2zbm_byigufiGHUivCCnQ=": "1893060000000", + "BF1650_AIVzg8KQ-2cm_DBjzlbKOglrS1wWUjdIRhu4=": "4044787000000", + "BFJYL5nxyZ0wzlj-fenYHhFBfGD_RyIYhqDdJeh6t9Q=": "445981000000", + "BFMMrf-bD77UOyG4g0IBNC5gBi7XKvRELpGENYdpsY0=": "384589000000", + "BFTCXECK9Zo0C4eu8KxpNZQHfJlhaxOGZoJdylS0mUE=": "769230000000", + "BFiikw36gghnXWhnKU_bbndLV5TCE2ZUziZeqD7T2hQ=": "4467894000000", + "BG2UuI8lV0LFzJk-fCI4MdVk1w-IFbMNbB55gFABvtE=": "499999000000", + "BG5DeJW37_DYQ-wKsD9qLw8J75PJhmiJYKqt-2sFS5w=": "451653000000", + "BGHlHJeOuDg9SyuKSQCUpicsjhdydjrS6v1Agg9l6To=": "600081000000", + "BGmuPjvGlyC1vTOl3JoZfqnnETdVZIs0MX1cWI-0sMM=": "769723000000", + "BHhAwZKOqg8i6JjEgAtGKPZYPoHaH2xDGworNYKwAtg=": "459734000000", + "BHnXJEAISkBwZ5HZ_OmkmMlN_A_z6205Re9L22nTs4Y=": "384615000000", + "BHnvrHxiHtRnH9q8Kirc9-3DbFYDhNCer6MDlQ_m5N4=": "901081000000", + "BHr6AgnA4BlUimWGQELis3xHaRuGm1IuQMTAoBUM3FI=": "2958333000000", + "BI4AYsWxhh7UvyHk95ROKLgWrEVjnj6PgcWKKtcCAlk=": "446815000000", + "BI8ZlFs6I8vy7fAGX252frErf6jtEHUs-hZYpiFIeR8=": "1538461000000", + "BIekyQaWtxLE1x5WL-a2BAF4Xtnzx3y3dPPSv-6yAdg=": "420680000000", + "BJ3UE5FnXLr3_UgAG_LpAk2nMNzFzT6tgi0UZMf8-mo=": "569966000000", + "BJ5i0QB_Tzwii3SFkEd3bqjeh6au6GGZ3lnDHj6lfgI=": "1642956000000", + "BJKatsl1VREaO5z-ZELYVBWzoBRNlSinKypUBD1p3BE=": "954279000000", + "BJOzKdouSslGEcrViws38vn42MLXT7frmg4mknyL7Fw=": "384611000000", + "BJe9PhQYNQPVTOko3ABUhpVgt94Bv7pgLELmQVqf8Ew=": "384968000000", + "BJgsqS8SZZ9YJ0zIMDl-5tzVWYuKpBwFv94jwCSjRUk=": "419044000000", + "BKFeEAjjt3H-d7-WQKQl9LK8ebo15ZeIpChhZicjR8Y=": "384615000000", + "BLNC2cgYJoILust5UdLAHp2kIHz-emWZMxdUghhvk6o=": "780792000000", + "BM1vJaHmrFMOphKXx5QI1l3TkyybexHdgAxfmhfFosw=": "495905000000", + "BMFu4sIgU0od0RGXyGyj3jIMQN6e4lUEDNRoCjaHJn8=": "453601000000", + "BMK90DOx12A9ud4XCG0QUpCOjcN6zeIjtvI9h2x_OCk=": "477575000000", + "BMOHS60IWu-jCYNJ4RUeXINXitgUjdVp-blg4wX7rqg=": "385006000000", + "BMhnuqy5E9WeM6nagjKxAEn-kajZ8wDkw4O6hT8M21Y=": "2307692000000", + "BMtmr4B0ycU8rFtZ6gDT3_x2e7TPvNZVGPcKW9meCPo=": "418315000000", + "BN0XRZZ_uGQJZcpGcMIOeQWMc2_nbL2Mn3yM7qeOiAk=": "468609000000", + "BNDbrSowtYYqiUnlUej8cgZp4iTiqPQ1dkVzfYTKFas=": "1564646000000", + "BNO8NtWPMz3_dbRaQJr2hmBZvbMVZgr3HBpFqoe7G1M=": "451707000000", + "BNfhYHeZxMlsWqqmsjZLsoZHb-pU1RGtkumCPCbzW10=": "387983000000", + "BO6GlIMmSu3pNaI-egLYwIm5uml-xDWRblO_GUW9r8s=": "24836441000000", + "BOghlMXv-nkg0rohbks8ZwEafYIHeeooJ5sSP7qEv88=": "384615000000", + "BP6z60TleSnnU6O8HW3gncELqwqzlfobEDMsdIjwYJc=": "418720000000", + "BPXf2l91VKX4TjkyMbCkqvo2Ts38KTcLy9R1l9O_Dl4=": "1362391000000", + "BQ16flQoHvGkcJxCFmde4WIT63XCl-P3vHjs-ommkbs=": "1153846000000", + "BQRnQ6-MIWkV0trGo7v17uyDC7KtS1ef_XKi6WqwXeA=": "685838000000", + "BROyWs6vjJdLHkBdYA_mK5N3b3wni1Cq7DzMcNoBJSY=": "452559000000", + "BRcPybbEC-ZpvoA5wVoOXxOMXgmvvf2PCxKxEljVbXE=": "462050000000", + "BSEOV-1Iet4E-51ADOxjxAwCTy4pjvPk7HPY9AmM5bk=": "4153721000000", + "BSIbH-7_au1hLEPQJsjkGcbViT_Pb1BatDplQMyCnvs=": "387931000000", + "BTGurva-Gj1ylHtgGta4S9ySY0RLJ2Z2DHzSNQB56JQ=": "378341000000", + "BTXunUwQu71TLiL0vQtUKAx9aiQeP8uhv3eM3ESIUXc=": "385506000000", + "BTXwmSUFN5_-UG7-uiJMZU-EWBJO2MBXo-9IGWnAmh0=": "909090000000", + "BTiFERYptPds5LJehcgYesvcIK7ixWajJITzKJno6GU=": "499999000000", + "BTmXMbF2OYr37II_4YyCvM03UG_Ckax8NNTT46YVB3E=": "402470000000", + "BU8Gp01mqhud3d33mwMs4PdjcerJRRG0s9BbWux3U2A=": "431835000000", + "BUJ_ZOV4Nj5jaEDBl9liFlAhvHXeXT3nqheVE9eLSHI=": "384300000000", + "BV-sNFYR3dJPAjpPNtmDFqyVlQ4ZFlclhneCSi1O7Ls=": "384280000000", + "BVh70qVb3uZTqtoMyTmZIEoVfJA3yzNAGHkeoQS8PIc=": "465068000000", + "BVsa8dMKC-edM32pxLRso93WUKfzcr9EJ8RBsfOeeXQ=": "2001906000000", + "BVstmki57VJztohf2RxF6u4ZSyx7XRvANWW_-5ypLJw=": "766000000000", + "BVum0RdgL7oVgmXWEfJ8ozCOyu0yqnZJFmJMcvznvVI=": "1193504000000", + "BWAOFtZiliwx3Q28nIc1EoJHuyQZ8vMd1ebDRMdOG5w=": "1386178000000", + "BWnKf6aBRnlWYhNYKl-uduxuEQFe6YIwFalxNff9YfY=": "5827699000000", + "BXNRR5HbG5SYCaD12lmTamTxDev1w5Vp2I0omZoo9Qs=": "416666000000", + "BY8leAzzRx3SuMRRluQARFT5K8bd8SkElPE0Gw6M5NI=": "754689000000", + "BYD99DZFeJo-M355zdjXBHxpk5ScP4DnRFDJuB9tdrU=": "3771567000000", + "BZnKB09tKKv3lXIPdHEmCud83vTOIKs-Pc9XzJMQV2M=": "455600000000", + "BZuekv6g2fOivrtzp_heLiEh3V8cAUiebIBmGVGlLU0=": "502605000000", + "BZxDQLqGsEgFwCAiDfD5ylOAZRnRx_W3nitzwaDFNr8=": "446550000000", + "B_9EI7YmTMF-MwI5p_UjdOZLCxp6xGP253yJh6_fvKk=": "380005000000", + "B_iXg5po4MthG08EqOrcD9Ok6QK5qVdc-f8AGTN1Tkc=": "653846000000", + "B_lqK96DNUxAjtHVWFft9QBzJG6r0BoWVWLXtfK7gT4=": "458479000000", + "B_vRgSIsuhCEtshw1Z54r_HZu2bz8aaEBsfm3gqj2OE=": "413620000000", + "Ba2Z4nAOQ3dKCvn2OGUH2NO3Kdai1KKko7tIh3NtyPs=": "483147000000", + "BaOVZAKk6ohiRYUvTRJzwW5xv9iHAyG3IRWJxtkj2g8=": "384615000000", + "BaWSAsl6GzSLeTgI1RWNCGVympXo345gR4ubVmKE3b4=": "384615000000", + "BajcJOH-T4fL9hr-oRMlw9gcrPIeC3l1UddCawxRktE=": "411085000000", + "BbMpr_3TFtmOGVov5bDsN_k-E5xytaQI-ph_IqgM7P8=": "380551000000", + "Bbemom8tgMCVcZnrsiFXUiq8zikCu02uAE7JWC6xMW4=": "544660000000", + "Bc6mtZ-l7Da1lemPP-G2kfl5PSOaMZFgaOlST8t7O1s=": "385697000000", + "BcDfybI_qjQfBByLXPjs7q0go0k0nau0B7OVgrTw2Ec=": "417630000000", + "BcEs8n6eS5oI90yTnOX1epqWCOapsDsB2Os3QFPhnZg=": "454519000000", + "BcN15yKgDLCMpSW9v41fgWfzEBHHTay8FJo2tNRfWqo=": "1635808000000", + "Bce6amtA5qM4EyN6-KK9cE0EafBds6Cyo1GaTUewHXg=": "763781000000", + "BdPLdGGWRUiYDt9Tu5LyLjZq32-ciF32DxC6b9V8_iI=": "447924000000", + "BdWDl8pEdwhp2sALBKPuGO9ntAp6cknSrk2k4iOIM7Y=": "488964000000", + "Be9sGfV3fRoowDdsogulNRWh_pUMyCGNNYy44308klU=": "935034000000", + "BeDmHxkz4MmAw20ofLqF2mumMb3Da6NJ8i2Vtvr0wTg=": "13807924000000", + "BeZA5TzzlQTFPMtGYgXsyg1kvMFwJHsCxIpRFIrTxuA=": "404548000000", + "Beg1H_lFr1U3pP3Wat5ByR_D5SXx2J16q4Hkrlb2b_o=": "524709000000", + "Bf08Du8X6_9vJP_7fw-8SWmO88Jy-vvjkjno2EkQgZY=": "447840000000", + "BfCKmGmvyXZPFJVcw5XZPMsfN6VWcplJKFu1LtI1Ok8=": "416609000000", + "BfcmrGMXYsOHroflZm11j5ggSbRjbCbGdnjeTOLaDUM=": "379344000000", + "BggNCclEpc_OCyIrARO0qrqmhxuNF_TaqajJCUjalfc=": "8824989000000", + "BgnQHuyk8xU3QDB8FyX2nz3ZYXyso2RrWx4qcYuGdLg=": "650090000000", + "Bgvj7rCuZVsLCzoWwu8wJr_PpOyNvdvVGYNgFQUlX7U=": "5013093000000", + "BjQWnxAiLBmvfa8ewAO4aTDbBYeQF_fDsL_75C_Rkxg=": "4166666000000", + "BjuUlYyRLkCw_RmLfMuGpLhnF4owxkCuq8VeTdlr_C4=": "3844114000000", + "Bk-981u1yMOemA7GzJvgzHG_5hQd41aEYywNjqOScXg=": "3773793000000", + "BkHN7O8OiIJLbytJKnUou2rs12LJYPCgqzSPlrQUZPg=": "468862000000", + "BkQrJeQUXLyYzNEyUk3H29jNs6xj4ljlEH_ov09BjSA=": "3415866000000", + "BkslPxW4pW6SCe4KAn0z3YKU8oIvSs1pz9WfjnKnia0=": "455600000000", + "BlJsN-W55cHHg-ilQGr2-nCiO1xt1CwnGr8HQN-NqtU=": "635315000000", + "BlXkOpcK4M7xMaq8pTVoMWAcFJvmXTIYs_4bKzyObjY=": "384169000000", + "BmJeVfPDb5VAmjD0nhNiCOQk_P-qpUTWgRJABZkN7H4=": "467018000000", + "BmX-4pWdfH4XkJB5NLv2pd-knePecji4MVxhlmzsRI0=": "389081000000", + "Bmc7QCBef7AQSLyw4ZcXdPuXVZPcaxz1PTkWnOMEwOY=": "384615000000", + "BmrU-q_Zb6VeUI0KBbK1BhAF1llRDAvY10r08Eq5SSg=": "454791000000", + "BmslHRiJSzM3MJc1uz1Yd5UorpXsvYWqXkK3jJhG518=": "769323000000", + "Bn2i4ialYfPX2Plqs0uYqM3MoZHnGKj9YHstw1TpHNQ=": "1376357000000", + "Bn8EKcF7c7bzZ7htpUHnVuKt_NjDRvAYB71aZgAIdd4=": "378341000000", + "BnLFaXf0ryswg46KW46TGjJ1is5OQUh1V8iXqBFV61o=": "2281729000000", + "BnhZJgyQDP_z5irTXF3zKgvjmXHJb9UyYUuE8HfBwgQ=": "1923076000000", + "BniW6rN1E6rx_dcPQIQLAqGUV65F-l3quM11bIbpAf0=": "943995000000", + "Bo68-QvgvCrBbrZnNsefFVSqAoBciGSo3Sa_1HhK67g=": "455600000000", + "BoRux2k-6kRf1t5kJai2EwLZXIRHV6oRHvsfgYcASws=": "678830000000", + "BoaO7GUJYZKsBjBga7lfWSnZHI63C42yiN5LByiRZJM=": "407808000000", + "BooltBmNR-y5GN7Sc5F8oNmCG1-U_u_bnj0of9BB-Wk=": "450623000000", + "BotcA72X2b6NkKvBA3Da9x5XwKYwFQV-wyLQAMYNDsg=": "386056000000", + "BqVbqb93_5xszfmMZgl6Hyuq1A2-0Uyv8OOu12eyXyc=": "385156000000", + "BqacTxaW4hXizPpVB6R3w4LX4cjlAuxApGAaL5QpuSI=": "657794000000", + "BqbnWcD2bZ376V_E9WlsopvnjPwn68csU8ZZWUOiHyI=": "1471209000000", + "Bqh2e3rtHrL9y7NZK4h9preftTx6wXKLd78Tdf17LR0=": "385733000000", + "BqzFBScG6grO09XQf3TSoMSe1ZHevdSlU8ReVHQqgx8=": "2005371000000", + "BrHyxvY9A3Brl6ik_p-JKXI1i_-HgiNS63u7jVssesw=": "385506000000", + "BrleRnmN_4FawspXuQq9GbijskEnYd3E8bcmnDDBmSw=": "62363921000000", + "Bs0t16AXcAuCDEsTak-ffaNNJQ69beQR4h_j5lhQuc0=": "454539000000", + "BsLJ4FjEKYBv4bAKyPCM9-kSd9Ok18UqobbJVjSxZvg=": "7689721000000", + "BscCaySqUIZlbQocQPInfsj1QXRpu17AFX-ZoJc6neU=": "2778826000000", + "BsdQo5TUz2KUpMUk4kwmBNbiNjwehbarzk1wr8td9jw=": "830677000000", + "BsopJZT1YDNXwK7zalgAIgw6pPWSMWMxUUxuBUsiVlU=": "1132129000000", + "BuDKs10o_B3MspaToeXa1KGa0Mnpa0nXLtUWtycEOKI=": "408021000000", + "BuQnJ4lQNc7r-3Bah2tD873ZhBz-d-CEKeTXb4ziKYU=": "908788000000", + "BuRxa6230iWjQ7EqgLhXY1W6yl4ZvruETxruKZdes_M=": "530454000000", + "BuXmbOIS3lHzLoL7kVlaxWJ2bg67J5OBILQBAT2POko=": "924180000000", + "Bud72aNmAk14CGPLr_ueEJ4Il0ApgSQLO3iN_47xHH4=": "2031249000000", + "Bukt8Qc7AkziDjVvpa0jCl_jjgy6KmliLZhAKvExK38=": "919719000000", + "BumItmQil760LO-ISo5IU225ze7nV2Ww4To0v0ZPpVc=": "466267000000", + "BvLKXgUhxz16Q7yLAVdVKbHly_vobFFb2HMr0Cdboe8=": "384615000000", + "BvNs0KhyVceDCD9i-al2xOe9ytyUB8gDcBVD-I0SrSY=": "910115000000", + "BvShD45mgjTyVcT88gAxJeHU-aYTZFEjhwuMLVFtdCA=": "4595189000000", + "BvefTcLyq1dlyDsQkRzONV86AJaTEBINyVEMICveNJQ=": "1927530000000", + "BwoESCHGPs7UUypWVtKQu0jhblqDfNEcumQ5p9psIwc=": "460830000000", + "Bx0Fb6YIhi8s6_sIasXsB_1jKEH2sJe2gl8SStvJDkY=": "866680000000", + "Bx8qLb-63NPVz6xXd7iV4WqKwzUmuxwkEtQEW3x6a7A=": "385509000000", + "BxRT62tnZ1DZN2DwlKRFk-UKFFGxlfUNxtiOZZM_7iM=": "635659000000", + "Bz1CqglgdzWio5swh9aGbfg9t0F-GFKtA5rmNArojTY=": "499999000000", + "Bz9LWS5YjH6520Q3LkZpUIixATlpgY_zowE39shsXIA=": "384744000000", + "BzNH7I-vxlWIl98zpZO6dnswf1n88W41nQJr6-SPMHk=": "382104000000", + "C-PCPaFeKyTaYa9ile3ze6_YzsHx4rQr7g9kK31ooz8=": "846153000000", + "C-Y4gAG8QIjfLmafVedDat7RN_2ykcdHOrcT7NEaDqw=": "4155005000000", + "C018Nf4gXAbSa3KqebOIuzzH7-K7J8DjddnvOroD8fk=": "384636000000", + "C061p3gykdLDeKXdYqEtDtcjnicQHQQYlZT3xpbWT78=": "1923076000000", + "C0_qIFmsavxj1s0unKPhAb4zdUp0pdm74EUFA-j3QQs=": "1156543000000", + "C0ofQTz-Q4oM2CvJgD1TAeXJf3SMmkMz8H3pLMqTig0=": "768895000000", + "C1JqdkfkwY7EthpEBPsUZ2HvYcLgO78Sy0L9WW9rN-Y=": "377935000000", + "C1LtUK4k5yGlMlo7LVi5s0__x_V0tq8yy8c8Jmh1pKA=": "5061836000000", + "C1Lv1f01lxml0-kHtGdHggCFsNZvubWP3t5Wl_HKZfA=": "1153846000000", + "C1RuVVt7lXRuDgXU18tEypY7XB0sldeRymhNTZrpSk4=": "2283357000000", + "C1txP4KdZYpem2RQ8Ml0Hwu2T9uAq__eobUYBHA10g0=": "384615000000", + "C2-aFGjQpcoYaSXZGXQlJxzpVxGJZaJwai9Xwc6zDDM=": "455125000000", + "C2H6QFK7QUBvM6ner3-dKhLVOILCFKvAm4rDQ9cF2lM=": "1923076000000", + "C2WA-Gpp8YD2d7J-SrnZTkmAQQH-285fGdQJiJuojL0=": "411085000000", + "C3JKPfT_e52VD6JPPCcxblDX9uvjnYIXEJFPhOD5Hzo=": "384615000000", + "C3NhoBOs3ATd9rPQq62TtfyVguU9shues9kqcJrP820=": "403480000000", + "C3f0YZOYIWBB5VnWUjZbFDPsYDRxyAG0XfQgnIyyaXY=": "404478000000", + "C3njtIuk3VviDrKzcUYC1x6LRwmbeJvQ_iXRBdSccaY=": "4170148000000", + "C4Aa8drVLDQUlrmNYLB9igiKy30-VpX5ldKmQQ_2Lqc=": "384615000000", + "C4WUt-MFLjLssgtP_sJO-RXBxab58Yw1Lv1yeqjC4oM=": "404829000000", + "C4nlnovGBg1_LwLzfRyfGRdyuV-KyGaOLtTCADDoOi4=": "454545000000", + "C5-_9T3faZT9kD4tmGWCVBeogJr2fAlSfZugWojBfiQ=": "383305000000", + "C5FiNcjn0Hb48h7Zu3oTY598By7vB-WUyqIET-UbHmI=": "471931000000", + "C5Lnokpc-xeCEFtgkmDLPdBijwaKSA3eu-fV4zolDXc=": "411085000000", + "C5d-UOjjsavnlzYoiQDYObK9tUJPg-_vtTbMSKUeJes=": "385505000000", + "C60tGW05atStdX5OJjz19-ve8EsD8XnRMrks3YW920s=": "3846153000000", + "C67e6z2E5lMLszEr8THyZsi0OaXyXEhwf0QcTOazzqI=": "382394000000", + "C6BRimi9-4lORBxik2oy6xge4yxePsyTUlU0vw2ro4A=": "770892000000", + "C6Og4fOt94LGbMZUHr116tEXeyng4moynNzElNdmSQU=": "2265787000000", + "C6pjn9WS_0dJfmJ2nsbivk9laTUo4hdI8AnnnhzDFf4=": "3490384000000", + "C720e1xTo17rsqmJFYKf9a7kfd_lKNSfBx3FNw74IuQ=": "1132743000000", + "C721WuLBkZwUZ1KNLRzBm_jIGbYTmz3HYA9Pzxge-2k=": "1153451000000", + "C75AjFT5A2MCXwOtLahgMBqLRDQ1Wf8YZAOKa-MQRdY=": "377597000000", + "C7ArVMJt3VDj-cSN4M0HLzBuKDeabs5jeIp3Xn1J1qY=": "583426000000", + "C7Gha_utOVkgxLVbDWTuIrqhc5XvrYoYaHUYTLmNNr0=": "382479000000", + "C7HIIrUsnS_yhXgdYgwWYIba9nVVeM2aoN94-zHIibw=": "382394000000", + "C7ozAFM7mFIL56RtfMDx4P0iXXadkl1QhSrYJ6B4498=": "1249971000000", + "C7rnQ3IXMwChgAFYZaeB0pkiXkNayThrqz3QRrxWhhE=": "446222000000", + "C87rFpCQiCcsLfQDlrmctw3B7Q2kR7QL0Ur6sjosoNA=": "384929000000", + "C8D3saeiob-Qh_gWMJyuGSw1zSNqzgpcWDMTgvLEdxc=": "2526900000000", + "C8nT9nxbIHpKG-pU0fCAkH0aaKrCkqNMKuOKE870CH8=": "536334000000", + "C8xpZmXQ0KQSoWUuY6oSgH6fmPY-7dYmp961R_KW-Mc=": "463566000000", + "C9gxiFbjjISJ5efo10li1Y72apY7oWTb0lP_Dp2mowA=": "445784000000", + "CA1Er3diog4Nm1yAqM4k1XGGHTkCu2PQtKFELFk1wJk=": "385155000000", + "CAUZppdbjLSwrtVlV4aQdz7RJdj0OqFFaQF1O4fovi4=": "494918000000", + "CAbv-hGNT34G8z3UCIF2sXdgAGztBGqipMGyT3-ApDE=": "2157676000000", + "CAvzjrSsOFghebwMbVF57Y1OwtBiazPG62wiqdQD_ec=": "15961538000000", + "CB3xoaWcyRYQg6ED3n5sEXCk4lomltrro3Bbyo-Ik5I=": "1585940000000", + "CBXTWPAwkTp298p7cZnWwODUJYe7JDAaiEKhVb9P3MA=": "1628967000000", + "CBhRMQ2RJMFH3cQqKt_89X5Ykhf2rbY37TVXRisrlSY=": "1393724000000", + "CBjDkl-wHGUWFbGK4tRrVDsJerHAQSCgQUFd05vQgnE=": "1538692000000", + "CC-H0y178xJZeqP9XrsbfMb6NzrGJdiueV8zqoCK-q4=": "2120701000000", + "CCLyJ7TEVuVsOoFcQ7zpKsg-EVQQv_GJ5BMo56itmhg=": "412863000000", + "CCauTC3hgENI_BuCIcpNJxdH5PMKPPfivgocIxEjdI8=": "384620000000", + "CCkbOSmKuwZucAL_Mu1kFZ1ofnhThRJ3c4xd6bY2z0M=": "679285000000", + "CDEWQZ9DDKmAz4bEJELANRh2H6iTz78I7Dmlt2aCxKU=": "784991000000", + "CDaYM_UrfZZDvinRsu_pPXZDFOkN7USde9eMIxJ0Su8=": "1362399000000", + "CDoKZgukoN7eYcovWKjWLSTwx-ZmVMwHpKTMlT7VYc8=": "927202000000", + "CE9Nws2s8gO2lm5eDmgdfD146aCW038qNrL0B3cHFtY=": "462501000000", + "CEQ3s_33ybNlFgIWumf58u-G46esLqjc1TwASHolyoc=": "10011451000000", + "CEXOPsmnhWYq1MwH5zfH1LVgxfxEtVOLcFbmBCawsCA=": "3087634000000", + "CFZLaMKIgcYXTNuMgRQT6twbpufo0ebWx6WTpNLjOqY=": "454814000000", + "CFqYaAzKyiqYI8cqXsHEIu-ggtVvjzmztjYU40cPniQ=": "1344756000000", + "CFxGeSi3CR91Fmp9q2NcjWWjuWZWQV_i6iJoAzwoL8A=": "415455000000", + "CG0jp6rRtmCdXJZXkRP5acWVl3V_58KLjKQsLaaxlGw=": "987431000000", + "CGt0EtHkmCAr_EQN8sS2uZYAzltdIzsPrriF3-de6bM=": "769230000000", + "CHGI09gRMQIFiYVZDnbikSrkhqp6hEJYkOrtXgTnnvk=": "7724149000000", + "CHRzIpvUUwLrGwFJTUHXHU5PDk4c5ZmZ2Si6lb3Tf38=": "464725000000", + "CHTufqaWQqioj7mCnHMz1e1jFcre0k9xLSkehOhMhrs=": "470310000000", + "CHcoyFbJevlPmWzzcpUw9yLpyj855m-upw6KoVkWf90=": "750791000000", + "CHwBTPEmoQc7oMULnD2DrZecngo6use-cfjLf6JURJA=": "469318000000", + "CIFuvsSKW9VFQiOtr4R-Mwy9JplOsniNyjcLeXIm_pc=": "469310000000", + "CIlxI9QPp0r1hyaH6p9I9Rurpvqk2GhKxsXVDXr2qwc=": "384615000000", + "CJ2yDyY94mAwljEFiaWLQrQuILL2qY67bO5GxVrJI_4=": "838851000000", + "CJZrXBjJv4-J_nfgrMJPKikcLoEuCs-_78K76_2mdUg=": "416666000000", + "CK6FncWLnqmCJt5I7-jFKejwnL3rRmvXQMRp1aKcLwg=": "833333000000", + "CKcOZjPjNQeqeCO2TE36WRcIJz0G-0aJl4axu5U89Bk=": "417635000000", + "CKcc9WktZQ8nVWP53qr1rQCoDeROWTUsOopYslLR0c0=": "384615000000", + "CLGN72YSesWw6eZ1KozLdImtsm5d4z16s2UlIizt__o=": "1518159000000", + "CLxhm-nGYOh-vBiaCbSfQx3jWoZ8uQaoAJ_KpDbvcs8=": "25058823000000", + "CM1gVWGd2FNMm2L9fUHSqQG4jw0CLX3AvPXZi4M1shE=": "769230000000", + "CMD_N89BvHa98RfACa6fOCCRnfBvNuzZxRPBdNU_1NA=": "385510000000", + "CMIhMxJwpU_JYZ7i51h3ZtUDbF0rGDKr-stW1DU7eQQ=": "413111000000", + "CML31azQDGhg1-zG-pUCQzuzw7urhXTqMn8oyT4gV44=": "415629000000", + "CMN3P9VstnFlmoCPoN2wViPTeOBmSIJl2a9vYVQliEo=": "1243972000000", + "CMgdEkXx0j9v0__Rg1cSAriUlapcCfeFsMQ9cI_Pots=": "455600000000", + "CMh9F-W577fGkpTSk8ZYUt8qpjYtW_pk33Mdv8FVIfg=": "1900423000000", + "CN7ohaALdrwpGdETnWtdTKAvIP-XpbmoQcSMt6ltXmw=": "384528000000", + "CNXq353ttdsf3nRO0_aVVmB3oNy4M718lEd_qf0SOi4=": "5106472000000", + "CNY2jPBuD4uT-F4NQ09l8XPVmA2yY_MAGNYcn-GjlRc=": "417637000000", + "CNayZ3prFZjYi9jsN74LBsAy1duTIDZSslh9LMf7RTQ=": "7150878000000", + "CNbRo1w-5vkzKTpChcqPkxT4UotJe6aAAVlrss1KkBE=": "394931000000", + "CNgPtMc_J9ldaopzT7PdBBH8atdlL9xldv6qKXlvgRM=": "595529000000", + "CO2DZV_hdz_jI-ZjGD5Qh_zc6coF5YM2Sunx563XeeI=": "415629000000", + "COPloVMWGHzv4WHSUpi-jVrNeS2HF6Mh36Oz2mSF2Jc=": "417630000000", + "COTyBHuEm0xC8oUrYPTUOo3mBjtMvdmw3Pzv8CI59MA=": "3126892000000", + "CO_kX__T7e5poD5NcehX-yExq_VYHY8a83p0x3DIqnU=": "377664000000", + "COcGOtED1k67VcugNVrwlsyoKaRFOEh7ky1Og1hQGLE=": "2045400000000", + "COqiEXJhlc76f_ixCHsdjrFEOz13gUysiXMSi7Sxhc8=": "723862000000", + "COta9-1xQ_fdtpqMK1yWMHaM-CzvI0z41klTAGLZ4Pk=": "379733000000", + "CPM5G7P6n-7llVl_BrW9UAfELwZP7CKscKkyI5bS6VU=": "385509000000", + "CPRlAFMfMpzv-gqK7zJd4uPDkgv9Z4hd0di5NDV_MWo=": "3843801000000", + "CPXPzECE0FgoBnYtLoEQ4LUfeL4UzFnNmfijqHLRbzE=": "377921000000", + "CQBo4stXyv6y-hAIsLlMJWAgUI-zhiTQsbFLAHPepMw=": "1508246000000", + "CQddAZmIy6ZHBsoWGZl1VDdjrLxpr3Sq80iE_bUYrPo=": "6403114000000", + "CRKBMhcHfPr2_7g0TfsU_MWeFG41KXm0NqFJAJIOLfY=": "11576436000000", + "CRkRUhOFfxVKSwqC8FDWkth7_0lyMjMqmzrkZ9W6VRQ=": "466696000000", + "CRyww_7YJb3J0N75S9yv1Yb20CNs0XnJpGiubf76NMs=": "1153846000000", + "CS8mThnRpeLfif6OKnOc3Lk4VX5dpmvtR7efJgnaOTM=": "528498000000", + "CSDM5MeAKWZ7NA8ZeoqGIalrUgJ6KKgs1EQSqc4Ylrc=": "416642000000", + "CSaTZnDM16Fe9XjcHNhGA4-RlVHioKxA_emKtAayx5w=": "416666000000", + "CTV-YKFurL8_NOAxWRFWL1y0I9_EvTVSDI1t-B5qjko=": "1534959000000", + "CTyxMKz3adzhskOxmXSG2kDLgD1b1Am73Ua1I2aZzpo=": "12886774000000", + "CUmQ-7qRcmYi1Dj3Piq6sOLw9DA16A5tA6BzFuIy_iA=": "642211000000", + "CUyVMEYopspFFJrvN9KFx2x_lGbUDSqo-zNV16u8Yvo=": "384429000000", + "CVMI0XXbGnaUBRhdFnXlavQ5_wtWBus1f5BQXuyIK_E=": "411085000000", + "CVMlw5ECmciSObie2eThxaqa3B5_LsLvow-KA3n1ajc=": "1153448000000", + "CVOOhocE_xZXF43jIHzrO7rkedoBRvqUZolSWpWtqmo=": "385510000000", + "CVWudS2H_ASTWymw2i5OhxBDZB9cTQyHRg_LTM8q6Z8=": "1252908000000", + "CVi1Fu7lSMHqS8D7yFRIl1RnLxZh6xa01ojX4zbOnls=": "1933021000000", + "CVsGCPnhhgVLcW_ldP3JZkBLN_5sqRxvm-ePxT_Y2Is=": "385506000000", + "CVxXLTDFz6OtqWSK6dmfy8kC_whwcJ5qcr73A5MSyGg=": "4047143000000", + "CWG2UOI0Bv8YYAwFxpq7KYXu8epVxlVWdzR5s70mm1E=": "379564000000", + "CWfY4kwIwNsDsD2SIRbIJ2SeFl5QC4IWMsRuf_LSnj8=": "482124000000", + "CWnN0b7BSuFUg5Vs1UAGGwZAIn9W9QRu553tssE2kAk=": "462169000000", + "CX1Sa6PxGjaAL9orBLs4yPWsY-msUzTYeTUPCLku5XY=": "3290656000000", + "CXhhkJwZ9olzu6U-ARAyc3yIwOLg3F8FurR_ZcDTBdM=": "385507000000", + "CYiypnmPfs1IqUOMdr-67uHxyZ4RLxbbNJ9o9p4uEFw=": "416901000000", + "CZ-MkT1bgw_qIVjU-x_wB_VklzCAO6lkCn3Hv6NceTo=": "456369000000", + "CZ4tW7SnRNMT7JgB3fThug6nnvR542yE0R9wDTO0N20=": "2537000000000", + "CZhyYoCvrV6zl40lBgyvpA0FFkf1IIPfL9BK-ORzteU=": "416886000000", + "CZwY_rqc_UBZfIUaY2mBURA1sx4UBhg5RPGcQMnW2y0=": "416539000000", + "C_1o4VJa2-xMtD95SbLuL7otdpCxJKNbk_meRJ0FzmE=": "411851000000", + "C_T380Uy3p_3j_aqdtq3vqo1LiOxpOc0mu-eKgTe26I=": "385498000000", + "C_fh4CkwKQA4aWButKNGjYTodL8nEMYWZGBe4C1loio=": "384597000000", + "CaA7qqy-brY1EgJFiwpqVjGTJwoddrciy_g8-NK6xDQ=": "1709797000000", + "CaGPQTGKwZtbpqWC6qdyHkMJ9bb3euyBjWhNFA8vS3g=": "453599000000", + "CaICHKHRw--wrUpBbU7800V6896sGA27KNLa9Yr6foI=": "1360527000000", + "CaRdqtPeWzbj544N6S0uoSuAYNNMObfhJZCshpVC2Os=": "468191000000", + "CabU4bfIbghnn5KSR3FBG7miFKyMPxWfY9A5zFOAvAY=": "384523000000", + "CbRqJ8e5GY8ztrlxIfNKDYjfTlW785THsZw3duXAioA=": "385233000000", + "CcAGwYWjnTwkriKpKomDEyaUjwoeyRvVHOJ-Q8J3CiA=": "464564000000", + "CcGQuOWbUiOfo2gLtEagkW82qmgXti-_gBQ0nVwbfto=": "4621865000000", + "CcLb7j6P4N1uDh21eaIXmYsLl5fiEyWUV_c5VMbgDoc=": "379260000000", + "CcgyWdvM3v1hI39n9EEFLJBPPsQ18gFKq41QvwbjUZ8=": "2022393000000", + "CciHjzpl5br2NBPGk0Dif3D7SsZA_02EWG35WBeOFok=": "938409000000", + "CcyO7t6q5zRcKGWd3hQZgOFm-ZvpzXaQS6M1MD7pxhE=": "767795000000", + "Ce3CPucqFQIlU1DJ48s8vtCJIHJ5a2wlMEa1jagM_6M=": "472515000000", + "CeJ3AvYTClefM2mxL_hj9gzQkls1ruGgsVfMuw08yv0=": "384615000000", + "CeL5DwiW3rZY8KeCz51OB2qsthjWVsXun8Ie3wtIY6U=": "1922285000000", + "CeoUNIOYMHFXcARkkcJN8IN7YvAOnS7s8x6AcmwjF8A=": "463315000000", + "CevmfINaf6Hqf4BDYjPqkmgR0LdLFqgrZvd7xo80l1c=": "458892000000", + "CfQB_ANcpk9vkb8C-QXvQ1iMbhAm7y8HBAUXiBxaPWk=": "466401000000", + "CfSjy05Iq3hCS3ZUjND5XMF6QuRMMMylbCR83J6SHWA=": "446162000000", + "CfX3f02MMzRea1JDZEoSvmocPZqoj5HBqSCYt0L9X2g=": "9615384000000", + "Cg33SPYSNo3vF8a8Xm4QBoBKGytM4Rzwyf5tpyeW51k=": "417636000000", + "CgWuXq3xpijDVxEIj_6moy0Qbke34wYysN2C6G2SHZ0=": "1923076000000", + "ChASfqIG5NyQMQFee-PC-IbXRoaKPFCzocF_uq83Rho=": "4621453000000", + "ChTiSA51Y3EB7DoI0qqjco5GrtmVeoZFsABUTpT3c_0=": "1216071000000", + "Ch_UgdnJd_nQ4nDNUeLrqPYI3s96w6gSQ5JqGpkthig=": "417632000000", + "CibDBoxokc3Sp5jgUrgK2g5GY9WTDNemmdBFAtKOSIE=": "447704000000", + "CkERQGI3T5n_9nn6bmO7G7P7j19NeGVrxqzvpVL2lFs=": "385802000000", + "CkMy8-AkDHLTrpsyFDOUw6ohN4hifT6XiEOqXT7Ruoc=": "1134645000000", + "CkNOPOqHrek1OD3WdmB86TrJU04y7NByWeEqxSD930Y=": "770237000000", + "Cl-qBf6tcMzzZ-KP9ds-sIz2iypSLTNbbHx5VLWufps=": "3846153000000", + "ClKbL4ZiPvDVYqQNHT2KcF_I8Wq8qWzcG0MhigjT6lY=": "1154944000000", + "ClSDSlagJSlO30EJ8tl5gC0weQ8Tm6jWzvEGFa2VgZ8=": "770994000000", + "ClTY_Xq5xSAseWRjtRlUtCfNQ1kWi4jYZiKzxn1_EII=": "384615000000", + "Cm98WdlCcKypfLtE01BYEUpnudVqsDz3mTTDy66DQOE=": "3951000000000", + "Cm99tcVF09CzQ5MDxZykMBtTNyuJEKVb7SlyTpBvijE=": "1716633000000", + "CmfLkv5e-gv1E-SD2yO51dQXkM905muzRzzjMsLa3zk=": "417634000000", + "Cmj3L9TQp-OFt5gW61KpwP03A-BcnvvirRetLSaf2XU=": "1999999000000", + "Cmqh9Z0J2zaZGmdAM9WjwEeFPLGM3_NPioRODCrReKE=": "1244326000000", + "CmsaEA9H1_EZGSmdmDsEB01bAFqGBs8dNKDt77Te5zA=": "385213000000", + "Cn2jJAmzvbV60z8g1YTuAzjpK3S6IB9vzkcX3Egt1bM=": "473773000000", + "CnUFQcEBlQkCaPDFJIHBzE27P5NhT_zYnbNdA73cgUQ=": "390975000000", + "CngD0UHcOLMOQKByfFJtVCz7XvZvDJrjomPSvBLSPV0=": "385282000000", + "CnvXK-cjwKVaum36Fnct1XEZRzU_pAPDpWy1k7oWGG4=": "384615000000", + "CoUnkM8F3qTh6yMdBmgGlCVEzEWGwNu4FxbrnPzRSO8=": "455860000000", + "Cp08FlgR3DHZbLqau1P-OowrZO7ijDp9CHTHrtWWEi4=": "501215000000", + "CpdMg8_kEzFc4aDwO1PeQ7ZLyY_ZuX8WaYoMim2fHFQ=": "14918175000000", + "Cq6FL2zYPMgtRCxXbMbVv3ESIwByD8bj0NHo0DiFYHE=": "544598000000", + "CqnTlgSnlq9CdQoUWNB5WQlP4EDaV3NPOjYbStY3yV8=": "3915019000000", + "Cqok0AodH-VX1Um9ZbjH2yS9zLDeDrtj2Ru95tKcpv0=": "4134783000000", + "CqsffbJHelXkJkse6JTeSDp5rPrJ749mPg0779tGxgM=": "467842000000", + "Cquf9AXQFF5FfZDhhX6ybuxxSpDmoG8KN2S6veOIUYo=": "461801000000", + "Cr6XleQGXKNFZvnBmLQXrQEk07NBrVXyRG466t0e1Yo=": "739639000000", + "Cr8B5ikAQZ6so2qf60J-B6Iv6j73MDKDwDEGtAaQlV8=": "3806533000000", + "CrJ3vN0BRVjpqt_VlIvrqOpS2OspytWbKUVpVdLvw-o=": "386372000000", + "CrX_1Gt9o5C2jOzBnZYqU6uAG5y-LyH5CZiSS6dz1EI=": "384615000000", + "CrjWuljrhF8MOvZdsQGW4zV2GudfurCr8ihZeiDxZ-A=": "385505000000", + "CroL3MeQ2Zt0fvZN25I4LrnqYsbIoHOO3Ca2hBnfIx4=": "1153877000000", + "CrphTWb_tyQOKTZ9aB9oH8lyT3TuHulB4YJ85EJ54NY=": "2244367000000", + "Crr_Cbae6gvh6y1AaobSD9kK4Btgui72PMQv8KWd7hs=": "481102000000", + "CrtvZn026ozZHQbWdaXASX0BThhnomzFYPj4M0IXICc=": "384615000000", + "CryunwxkvVJ8qR9zaUYlFjgId251I0Xi_Md2qsLLDCg=": "384615000000", + "Cs_mUotyuMQ0GnLaA_iQ4O1dl8yeVMXj3P6beLtmGyk=": "414244000000", + "Cso86rX_E4Niq2CywgqL8vF9m8NX3fPwJdaLY9f72rk=": "384615000000", + "Ct9J2MniSD2DYYR-lb9G1UcEEttOro_uOCQyo3WaU2s=": "914107000000", + "CtJoyWIpzGtvSJ78XT3EC-yPUtKVRXWtvSqcmF1xfbI=": "762188000000", + "CtK_2sR-XKdC7dkct3IsKh8E3DnZJz-MhOBtXyOv6Rg=": "412344000000", + "CtXbA2C7wGXGYlrHzZhDr4GGOfbP7AJa3Dh08Cb8LME=": "3838212000000", + "CtZfIJp0ARvlJ-aYFNG4vHtzx8Mfw6sjIPmW8WVdT2Y=": "468054000000", + "CtlFiCwW74pJllM18P1UM4RwhAMgx8VvlnaaClEndyQ=": "378786000000", + "CtmcV7dd-9iW-g2W-jL5iTEHA24OvumCXQU68hKnQ1Y=": "384615000000", + "CtraNQkspKYWEUSZDJn_uSLEBeIHEvxXwdw8xIVat34=": "22274129000000", + "Cu-cy-Hg6ArtJD9Xk5ccpWLRcEJeMWyM6RkEmWbeh8g=": "975076000000", + "Cu2eWXa0oalk_1Q4dFcURLWWZ3k1yLVZtmogXI4iFNM=": "833604000000", + "Cu3TOYs7mlt0sQsksJP3ksy90YfYUj4zrsQZunxi-Uw=": "459419000000", + "Cu6WvmSnabRTlWxFbbm_8uAVi8UloFcppeyJIvq9f04=": "382479000000", + "CuGnQFbK_K3XyqB-EyV2i5YrckRIjB1Aba55sgrNNug=": "415629000000", + "CuN7wMsoNDSFbstzd0LSXcU1el3NU6AVk0ckfXsRr_E=": "384615000000", + "CusvQPQiuuelecRmDOAUTfmk8O3MPCxEQMZhByc-tvY=": "7692307000000", + "Cusx-fsVDU0gq24emk2h-LQRyMkAV9HEwh1k-tc0NRk=": "384592000000", + "CutQnkF5KuXv-ynI94NU-XIMyYEnmsnZ6wjDle9BG_w=": "9999999000000", + "Cuu4vXNT8Pv6vhsHjHePiEsgDCCreZHSMM_5SC-EvK0=": "786039000000", + "CuwfwnCFBHi38QaYi1hs01ru7N0RAPLiJgX-d9KGE94=": "470734000000", + "Cv0FNXbuO6YSiKyZgIZCK2rl8Dy_LFtB1VVUT2Mdzfw=": "460896000000", + "Cv3itz9dau-66UgfPbApIAlKP13hy7oTNEFHDMZH5qw=": "384615000000", + "CvxKLgFWgtdQvWD4iVOWTj-wShqKTfO0APYsgJDPfm4=": "1666666000000", + "Cw4egO4jyWH2T6yQ7O5L5ko27ZRJRlNgEp1JcFRHm0o=": "337729000000", + "CwoAe2q8pZY-IxYji1-1z1b5xkuLrLXuZZd1LGUWhmQ=": "384615000000", + "Cx9og0uvG1cWCa4Fz7d0Y8ixSP4fQQ6yAMTBCc93Rpk=": "12500218000000", + "CxAnRVXXMsbZxRZAWfgGqU9Ub1v-arGb9umVC3p1NA4=": "6229065000000", + "CxGMoH_aDAnKba03SoJm0e8xTM9AeAgWr1Fyt_6fu8E=": "840198000000", + "CxOA7y-hMyk-plvSvfIaDiBy8qM2WfJo6gfrR8gzcdo=": "486218000000", + "CyBuOHQD_VEvFLFov-5VyopOZY3RF8ky9MRdGmali20=": "769301000000", + "CyCrp668Dg67WdJybOawfi8OEXxgqQZr9MP5zNMnaqg=": "407808000000", + "CyU883orkayN8G-1kdqsLzhOx-4V3UcwcLbjoVkLjKE=": "5224707000000", + "CyXMQZr6rTX6PS7kls8cqgGIvuAToMLgqKnpDXxRL9M=": "499999000000", + "Cyfb7BWA4glOrQdFE9fiIP2mjf9fejqWfGiGgbTdS8c=": "454445000000", + "CzcVYWz4kgfPyYTAui6iR_t9EVez1wvd34ZOX2a-53M=": "6601337000000", + "D-BQjUl0UYmGYx_yw4yXzCUXab_D64ijokJ70Jt4bXE=": "384615000000", + "D-KAmxqZWemMDV_aANfI40AjytCrgl-hOxUy1yX7OTQ=": "470310000000", + "D-ScXFY8N9nunqpc12TfmSawgu3T6IU47jfWKBSGELM=": "422985000000", + "D-U89KYrZ5voZxXyBQEgQFPWZ5WGOe4Ene84NYmnkN4=": "6342433000000", + "D-hi9QEFroS61vjav_bVUSMT28B89klF08aTp-fQm3g=": "411085000000", + "D08Ng0Ud1LmHMzgrfFBL-CIvAbDFfvEBpJlaumk68rs=": "456871000000", + "D09VD4F_WJ4Fk0xo2pb6nSW39HUQ1e9qPqqDJ21OswA=": "833333000000", + "D0GbfoEYIBRH65yk2Eyd4Tyb1jRsjb1bzVQdNjguslA=": "1875032000000", + "D0QLehrjr-CU76ktWEPAxyTknFw-mlWelnADvqklfzc=": "1668377000000", + "D0YetdWPoYNKpdQzH75LNWqvIwBaSdMVweis3O22N84=": "416666000000", + "D0hOJPxJxC4w8KgeSpd-K9gp3RNOU_LdFbsL_jQtNCc=": "19204662000000", + "D1Zbtlm_H_mlRiH0DETrOBLUZBrq6vi7PG3pN3lH1IA=": "383334000000", + "D1g5JGIfxgQAXLR7Pyye2GpF26DYFu8KdeN26bcN_u8=": "3871431000000", + "D2_raZPjd4Q5-hDkHnOzDA6jqe0_zj-nR0YbKchFP7E=": "1538461000000", + "D2bBcAHwfEtoIzImqIUO-2_AW9STn81V8iGsOewfpio=": "389592000000", + "D2eSsizX_uNxyVtKhhaw29yrTnmxwHFiawoA8-meN3A=": "1911972000000", + "D2j9D75GS2FgBpCv1bIKXsyzQyUSCWA1B6ZlLeckGq8=": "452207000000", + "D2lmCvRayUAT5NFVJmMN223rYLdUJ6CJYjgIY4e4kfk=": "416586000000", + "D2t6lWEV47g3PADfb3sVLbR5YAGCV_l695aLzW8e4CM=": "1366800000000", + "D3D9VPkkmljVU4VCb2riEvXX-dLLpuoZRtE9pQ33syw=": "378257000000", + "D3FKOWnJWeCERoK16tzpJ7PWeFwn5yz4d7e4V3-bxTI=": "1377927000000", + "D3_kISHkmFQu47hKSaUzEl3HhIu6FvUxXiidd-FAIIQ=": "653305000000", + "D4LWN01tZ_rUiaIHpYc2Yxd1h3G2t9--0NldzdLx8vk=": "456230000000", + "D4MJc6F9XbZ-PMoVfH05l40DCWqE_r_9aEZdYXAhjIM=": "384976000000", + "D4XLZdBgi89ba8nZcXiB1JGZY1EVLKxS7KtmX0V-_Qc=": "382921000000", + "D4d1hIcehwFNytoz-O8e0CgTlcBjv81ODZHsPa6BTlA=": "604517000000", + "D5AVzHcrQ9JDJDyi_D3NmnlgSkX_UXj1FfZTKWFHzBU=": "2938270000000", + "D5DADrB0d66ggXPZiPZJbfwM-h5n45LGp2SeL5VJXyw=": "10905923000000", + "D5FRAWIRnSuH41jysNBGwgI1cPjcZDemuqdMpFlppNg=": "1271008000000", + "D5FcZL4DGphChmkf3iTDEIjqXOp5tTqYbA31CLbfJeE=": "464809000000", + "D6-Ee2xDZXhftlOUtKUEEZozMiN2nJt1CbJ0U3yQB-M=": "455270000000", + "D63SwdTp4eJvrqIP-aueJdlUkQHH-LW9FrVTKiXHRCM=": "464615000000", + "D7-yl0K-qCQqWHLtkVMLZ_FfMI2HyG8HnZ8za7F-i9s=": "385346000000", + "D7K-svV7S006Kh5Vdwt6v3MqJvgcJe0VJ2vfKIze3tY=": "448349000000", + "D7SOgD5guYF-s5QB96vprMbr-YvP9WFRtcvK36lP100=": "890658000000", + "D8STWHFzvWX9J0SDvQwANe2SaRf_nSv1B3TTsHvAhdw=": "571094000000", + "D9_BqUsLHoxCVv8-x_t0JCSp5bld1QJT8ULtDywukCY=": "839786000000", + "D9pP1gXke86rrKwkOgQAJvHlTmnn1PlK845SfhnxQsA=": "384615000000", + "DA3G_eEgJmj49_zoqZXdSZ4nnHoSc2H3-Z_GzwSIUew=": "1923076000000", + "DASzUAAXImIocIfUf4PVzEc9YMlozLwXndgGSiSM-oY=": "8395929000000", + "DAoprt808JJ5yR7Uc41U5uUJE4hss8jtvGYzUhHu8v0=": "417630000000", + "DApDkDsA3-vxtMaVSZ10vWDSBx0OmEI3qgYlJ8YbSjk=": "3725796000000", + "DAzLZ_RGUEXM-cfksHieXrF4ynlC2FuWT1vYirU0eng=": "384615000000", + "DB6LehcwTNeuPTKQwi1ZPz6UYCCkyTNEBBZQBnJGkUA=": "385896000000", + "DBMBbdTVZW7Xc3NVOUfNV2gASFHbgPKsOoFJe-pSaZ0=": "7919291000000", + "DBdimkWZWGqEHOMAcohJmr7Ac76et2tYfh04Cfk33e8=": "455125000000", + "DDZqchjODzw6bLTz_5tVKZTduYAwXJKDgCIwYk6juuI=": "460510000000", + "DDdYaxO_-49nhX-8EdOD11lv22izPQIt0_feUynyz6E=": "384615000000", + "DDhLhbcIHhGnhasSD8nnGehCj7RdiDkqjUXk_bDP_gw=": "411085000000", + "DDhcpQeMClSYN11ZV5cCGASNuXhCI6qCiVLLhe38CBo=": "14141960000000", + "DEMP5_pFKYbLcCADluIeeWyXwk81eqs12eOLD4HIp7s=": "1590814000000", + "DE__DW0z6o7pEa8poJmH58bcAVydMCrUK3oyKNwpRYo=": "385624000000", + "DEb3NLKP0hqjIaZjAxFZ432X7FxPxDd5QPNdr7nAZdo=": "4156911000000", + "DEpcnvzuk4_9YwxNvlD0gkzgxQjPGt0y18lGZeIO4Kg=": "384615000000", + "DEsmEAvZYZx1C6gSG-55O7W_JTb0EF03vfOLu9IHHp0=": "786889000000", + "DEwCzaW9jqEBuVqalEO5jrdqE9ugtVvrGqBs2KIFUoE=": "416666000000", + "DEzU0X4-0MoLUZ_6HLfjMoVB_tCiy9xSm_kwgsyssPI=": "458201000000", + "DFKsCIju6icRHVnYBI6vISTmh-DHVT3KqTB-fPrLuBM=": "456480000000", + "DFLHajikSB9lTlZfMDfgWvTuqesxrUX1a-qQfaMSU5g=": "834098000000", + "DFb8zE76zhKkBTAhtzNhu2G-fbo9bK1nt5St0Hozkj4=": "390649000000", + "DFlaM3H5Mg89IjNsF35NQrW7FF7fHltCAQFarL8Tl7c=": "824269000000", + "DGFuomwkeXGUSqj5hzG4Af5M4A8M_Z_zNO7kQuK8ksw=": "416666000000", + "DGM1cam_Vb8TJgf5nZERd-pJRblv4QM4Ri16c4TrHn4=": "544142000000", + "DGh_9rfw1Bkvd0t6ec6JtE3f3QqEvQVDmrwGNIt1-K0=": "405357000000", + "DGugB5XdhWvouHzRs8zPbzZtHH53CHjxFpL_ToQHXYU=": "769640000000", + "DH9pntwoPw2oBZNIIZ6bRY9YU9lAfZO34hUlGoUw3lQ=": "23824672000000", + "DHDl9jv8qG7xIsq4DsJM9-kChLUfH0FO0P8gPAWbnjk=": "463799000000", + "DHtTH0XO6jY4I_RVNOwtN13Lgwp0ZePbF3NUPYtznZE=": "459548000000", + "DIIBX_x2-Fn2yV3bU4wJ8BL2haN8nMp9czdtQoc7NxQ=": "2719958000000", + "DIJYJstF98zuZ8xqXksE80ZoIE8kpISzcgG_5rojHSU=": "387318000000", + "DIPkBUzVP3hKZfRH6aZ2qrmi6kyq8z4LGQ6qoYsdKGk=": "6951318000000", + "DIukDZENQ_4P9KIfVapekabdDmWh5o34dnAdhh-JciE=": "3893699000000", + "DIyxvCNYtgxnnixYan9fiVaTTppiNTTkJ671FAYOAcA=": "455189000000", + "DJU9LiiqWd1uHIA1DsAQAaD7x8S5Vv3isohERTx5ZaI=": "7492698000000", + "DJbCGCkk73IbbeenoNdg-jeABxBPdu8pXMQQweOmotI=": "378090000000", + "DJesYT3UMtHnv0P8VP2vQBd0YhH521uXJzS26ImtU3A=": "473265000000", + "DJjYDSK6Kcn7g_d_Z3qZYrwTxrxji6xdpSUaypAJ8nU=": "393764000000", + "DJk4G_znF0DrSUO-8GHMWgitbChep2Ivs0aWttUcjaM=": "407469000000", + "DJmXbuCkrNzN9A2LSpfUkQFtZaN_WAQROBu1Cshyo5w=": "384615000000", + "DKHWo9yrWcLGKF3Yka9_aIKwTq7HXMJA3Xxpl858p54=": "3461538000000", + "DK_mv89d_kMEoTLVlXIpDw7vVvH5Q9tjiRo57VO_kco=": "470513000000", + "DKncHTS5Xlm1q22cVRNjqy33GDTLv5Ud0YgXTmdYPx0=": "386318000000", + "DKsNZvWNRoVbR4wIVAM2XE3IQ8vyPeE1Q8oRtraauiM=": "805092000000", + "DLF-V90Zs-aMnIIkng9k_zg5fUSgTYSX9ZSekH8sMWw=": "846005000000", + "DMddSCajoQxfQMWuTRWlmc1TsPDrQ-nDHPnpraZzx78=": "577376000000", + "DMgD-6sKhA4pDJKxDlGSQTnSx660uDVx2FqR-BNjKxY=": "382942000000", + "DMmsIJ6Oq8E6BkpLvuOVn0LOzME3xa6YLDomjdoRaJQ=": "3315748000000", + "DN1T4rLrHAImmKhdUytmKnT_74WA7FcaxUTmdtjrV7k=": "357399000000", + "DNRzbBW5cgudHNOumaPTRR3WmY-mSDo0JgF2TfXTET8=": "2310726000000", + "DNifjgLQpPE34FnuBRCVBtp8-dZL1AgBFI0K9dsybhs=": "382705000000", + "DNjnyZCflpjVSDQ3oI-jfINdvu7qwtWVrWaQQFGjEiI=": "411085000000", + "DNk1x0aDmeyOM8Uwt0biK1Wftg7ktSqEf8YrsY-3GPI=": "417633000000", + "DNngvH7eUKa6-3_F-DNBmOcNq6HgB5wQURm6IXQUNOQ=": "385510000000", + "DNz07zJjuD51WhNaSC3sOACZiLMBBi-HCoKdyJB2RXE=": "3846153000000", + "DO4_ut8AHpgaPTI2OX44kdMEZTGoebQ3TYLXm7thOUw=": "377603000000", + "DOZ6Gon7GIoT4lv6twXtlSFos2ZZ8PYxlWVccvNwFHQ=": "1204545000000", + "DOnD2qrUFGoaCo31VX5VxAyOm1-ZTN79aoqPZjEBtjs=": "385510000000", + "DOyGrS4FD_vgBeNHSHYNVuniqhnsj3RWEF1KCzG3Uww=": "382370000000", + "DOyuT0TS8_6SFRgr9N86CIQF6z5d_lWtZ_qyDmcSWok=": "460374000000", + "DPCKl1k3H7XnJQ0v6MX-KYtfkR1LDYiTgpuZY33OrpE=": "3780374000000", + "DPZFwTSFLMFCljuPpNQYK02h--ctGsXir6ib6uTDUZ4=": "465772000000", + "DPhGPvDUmydIm-rbX_ARRe8YcE2N7iLBBin9cs3OR2U=": "3214090000000", + "DPpIgVPek4RsHkdrinfp-O48Ow2NVjTfWZFJEhvlDMw=": "445422000000", + "DQgWBYPLjaIhB5ublX3uoc8c69uK6G8jWNzqYTSXHng=": "454397000000", + "DRF7mqxeoIll-NaLCwJjqA2UoABs7G1JscGyOSFRWwU=": "566237000000", + "DRQHdq2Yq0qsZGNB9DinM03DAkW4GLon0AkPcXgIFnI=": "25027196000000", + "DS1GhokiQfATudnQe5wjUGA5pUbm8FW3GMZSaUNpJ-E=": "384615000000", + "DSiHoe_1coU0PAVwbqMc-ZHS4dO_3aRImGHRsPNTKsE=": "908272000000", + "DSw2OciR0brd6QGnRSTKKX3le8nAw1-VYGecMuwSRsQ=": "585466000000", + "DTFvDr4TeQdRKeRnwJ09YjYiwxcelLddUb2esyZtET4=": "2653707000000", + "DTV5n_1zRYzTxTwNhggDcTvwCx1f18cVsmNP9E-R-LQ=": "1144904000000", + "DTdUJxXPdoTJxObOAtaDx9MM927Bn4T7HL_EZPYsfIs=": "11353591000000", + "DTdzHiSBhLaNaAVOeKANlHtDa4HtPN9W1VZcubtPCA4=": "6116428000000", + "DUOLBZL8h2JPpDoGJG-WyZEfQhCFpzVajbuHOk6kgSE=": "513814000000", + "DUaqzBKEGqN4gMNaoNmN0p2zn_TfahX2rfI5_uGepk0=": "2079182000000", + "DUfwx08O7hcDXVpQR-zQACLZhRAsugKiHjtItgBiYdk=": "465946000000", + "DUrztOc803XrhChSdpNaNst_GicTpHIAaks49bH6Obk=": "634303000000", + "DVByeq5cJ8yJ-hyuSJk7VVsuTfpKEL0HiLSqoM_klSQ=": "3855075000000", + "DVIH2rHMSijYgp87apgO0oOTarARkfgP5QFF9KedgTA=": "417630000000", + "DVf5EBRytuB4qWwDrtFTxgn-z0t0XUEMOzYvGuBMDsw=": "1939462000000", + "DVgVQ3se4kQssq59g70Q2TLPodvQ0XkxEx8fr7w_eOM=": "377309000000", + "DVxhPkCzxXOxCxh_tQJsCggs_tppvmqKX2O_0_CY81k=": "385429000000", + "DWFL7Yge1MNhFlmupK2ZzO6T76hjWKWuNStpYnqIgCQ=": "416464000000", + "DWi1hc7oJOKMZFABpn_cch2hnUn2oQ4GpWEqa8gts14=": "384615000000", + "DWqVdqdLbQsyEGEJnteKQ87QiUBvwTauRZhA6iK17eg=": "464279000000", + "DX4FEckA0KOVdsjd3JH0fm-yiqKXAYWxFewurlnxjxY=": "844393000000", + "DXAYextuJkAnlLPbGWmqLQkubIIgXVmr0Y5wXQpGSj8=": "581632000000", + "DYLBcZ0E_FoJMek1FEc28Ram59Zx7FG2KS9YocUwYjQ=": "386596000000", + "DYOKlCEl4OT2-lGXUCJWl-bE6xjHSqMG2-7d68PkvnQ=": "384615000000", + "DYPH4hMJZXURwFfhxdnQEh7T-cyCPnzn6iKZCxOKMko=": "385040000000", + "DYarJFyyLoKphI49YxR76AOwY5ovCnEjOzkWd9Op-Is=": "529201000000", + "DYmajSayECap7yZ47r0VHSNVsDLL7-WxboFyDZ9ROxA=": "385506000000", + "DZdknuBz05nfI3Id6Y1rDVtPcEWGoLcGBQuEbdnIpXI=": "383313000000", + "DZdnSJ876RZ_bHmzVVPHlZTIcRUd8uUGci15kpYlZQk=": "384546000000", + "D_T1UNij_pRqHnTvr18lwiETydXfiHkJehFMXDT63Q8=": "384778000000", + "D_eFcLZvaX0m3Pgg2NXNvPy3SkqYGYy11Q16VmhCpGg=": "417004000000", + "D_wMyw4an1SWm8ZQMXBW9-zo0MWmlr1S21sAm_9Ui3Q=": "378206000000", + "Da0uYlKE42319y-1UCIPpYYGP0bHB2quQbKWggKv0BY=": "6153846000000", + "DaWr8NXZc9njUu9DjJFerOL3eO9q-fV5hTZNJ7Sste0=": "1083333000000", + "Dat67BiYXI2xp321y8FohvnFwaTIAIpPxGj3M_jWjy4=": "4240295000000", + "Day-w1LoSgx7bmEIKfEtGwq-0XGn5vs2YHJYp4jWu3c=": "1388066000000", + "DayjQjqpk-ZpjogWXobak5G4Je3ok26eS_f3rZEsZeA=": "1902211000000", + "Dazso9CQeLeUXKVS3NVdI9P5FXhB25kfWPPWlUrd4pE=": "398808000000", + "DbHr6nfRKxzraKdlF8sFTul_3oHoYNrZJYiZHVBxErI=": "1008023000000", + "DbqomI2R3wXqr7El93941b3Wu43_5kvQ12JVPmykg64=": "1145412000000", + "Dc6x9Dv9w81VNpGU8QTrsKncLq4G54ffHnANLf9VDVg=": "381601000000", + "DcAcQoAGNdsaKFtMDM_O3tqE7U09zpydkkcLzmOvdWQ=": "3325057000000", + "DcAtQkYFupWyigOBf8vbHnkWgW7uFgRfgvU-oebKF_8=": "2022675000000", + "DcBuJ5CGVpriV41rUJO0kpFnVP6lsxB781Xm0QrZ8E8=": "464825000000", + "DcNpqIGTodA8cpnT_n11aKTf9ALT5Ir7aWKvAUXtUt0=": "384615000000", + "DcV-sKj-NoCXSSUt2srOdtdDoA8pRaTaj09KUGwvu0I=": "602076000000", + "DcXRFmQCTOoFrzDEZZXLHCddIK-ehljh_x8sXMv0hMc=": "384615000000", + "DcZwn7bVT9uhUvnf7hkEu43iJw1782sB0TPKrqyaP0g=": "457488000000", + "Dcr8JMWPG9GYRmV4mIgm_hIQrIML03w8KOaxXyFqWfk=": "2063036000000", + "DdtNK8dYQlwC8zUJv5HCieEpR9RCZx53FlHPAgtzJ9g=": "568618000000", + "Dekhj2yg5FiJyaePIzsC7xfuYGirnhwliN-p0wlG4do=": "458333000000", + "Df57Z7Mh3Sgunc8h523ezjLjdbbaFCf1CG3JFhEnJo0=": "115384615000000", + "Df8MG1uULjV-DNsDT0X8BcgBmjKr1aG0gTH3JJP5LL0=": "2535371000000", + "DfiI28E0eCuHnMDkwDGCsze1AAKjfvSqis5JZ71_GEY=": "945454000000", + "Dg6iJrHyXCNAivFHcL95lXXWep4WWbu__-c645c6A28=": "504175000000", + "DgZ69jfL8fHRNfXDCw1gyHIHabf6l_Wy_tph-N8kOZk=": "3844849000000", + "Dhgjvph8OVeHSB9NjGWLtBfMNEwN5OZ8Gv8K0NrUt2w=": "384615000000", + "DiPz9qMQgaRlJZnIIIpeB3zC8ckANz1pAEPjGbOI1kI=": "444502000000", + "DixEX6Wm5GMyqBspwjEOsIG6POLb4CB21Eyv1A9fTOE=": "3842046000000", + "Dj2LnrncwNT5yHUUJsmnWFZ0VUbKrV6Yzjw2TCb08qs=": "816612000000", + "DjVCB-6wwA75mqcsfiAlzW0VdnDEJUr_fZ-P1qxTk20=": "576134000000", + "Djbgpk6WjMltLpS4xtV93FoZ76vsd9bJiZwT2JvlhJ4=": "460520000000", + "DjdzGsa4YG47-rQgH_zGRzZcH-N8waCU0hpaT1-V6_8=": "390975000000", + "DkBHI6G1SMwx1KkJml7DklgPM50ORgePLPNhMOBdGTg=": "385505000000", + "DkFI0v89qF4LoPr7yFIDQKG-fRwRt5PY_LOwYDQPJLA=": "3846153000000", + "DkIMeZDQPXH6oiR5KbGUSaF-kfsgHOTO5FNaOdIzfwg=": "451300000000", + "DkQQdQTbZxi5GMsOMozT9hPL8iKUpaY5j5rfJXi8igI=": "781153000000", + "Dkc5OnlPNNaYsCBm5vyNxjl6RMbfpdFMXE8O0CpyUL4=": "453495000000", + "DlUKhE3lqygBcy7j4Cdynv_blTHgrzU0YtbuYJt6eZA=": "385507000000", + "DlXN-NgGNCO_3Ca-vBBXnu4knvMIb6VdalbiP6SKob8=": "1156517000000", + "DlqqpaHB219YudzNqBMtPU3tyBAUq9b4HnDaQ4RD6yM=": "390451000000", + "DltbcXEF4lINO094-RLVxGA1xQg28WbJajzKwq4kIGU=": "454545000000", + "Dlx0Nm5KqbC5cNv4b7fGor4-gdDMETixfChgtyVhAd0=": "378723000000", + "Dm-TC8F9Axt4c-f149gBsGVTMpuk8zaQkZiBWczYDDg=": "1584858000000", + "Dm9gEvEHW6rC6PFGEM49gVMZOZw6yKtGbFBiGtXT5yY=": "481090000000", + "DmY3zNxj5aOMaPdQmRh9rO-XGK0JsItoL_CgGLs_Apo=": "842892000000", + "DmvyE1dtNT7pqcv8IZhJofVnCct4HoEmiMvipOkOiPc=": "1930893000000", + "DnFAJC6qjNwnBEdqhAmAO9COu6FLBBnYcxuhFzVlGUo=": "893821000000", + "DoHK9-Bu8MxT6_Vkmy2Pug-3_AS5qhgTIdNZUzOX99E=": "1923076000000", + "DoamC8nI3z8LezIIxWwHKCtZYOe9Lywgiki5OmjY8-c=": "462839000000", + "DodRsDMHUTB3fyQKT2IbrGHhPXDdgzX1T2QrBUJtcY8=": "698747000000", + "DorWeMH8MIBBUn80gYLnbx42VrtY0N6voj6GjWOhsrE=": "963617000000", + "Dp0e3SxRGK0yMu_sa5YK7LdX29VnTp_oHSfYogenpBo=": "407469000000", + "DpK5Ns1lwK0YwzgY4iWKU52gs1Wq2fLdXhft_E033PM=": "454044000000", + "DqM9pCN7FVuU4c1oKvOJvxCEkzppUFi0X07oM8MK3Fs=": "383038000000", + "DqMwu23SYkw3T4BwT5xDAoYq1gJVu_5bRBQK29qjETA=": "384615000000", + "DqVMNMbVGkLh9dp24T5q9hI9u_tCO3K1PyqowN_1wR8=": "407808000000", + "DqViZA3asI95qfj-h-KywVc-itZNKe4wOtcRrD0iRGw=": "387363000000", + "DqfUFKbj1j5qI3A13cnVr1sN01ezPopeB0SJ9LoYRvs=": "384615000000", + "DqfdL-wWX9CU-7VJqXEqYJmXhiiVtfAKCT1_2jAFzo0=": "634303000000", + "Dqg5kPRPMdg5O-juLkIcsmAQ5joeTgGXW6woLLb4RaA=": "382195000000", + "Drh6C6fcRb0cAwY5CaRW5O3b4pL5xUu19DFSSvoESVM=": "833310000000", + "DrhTwyPvdbH1WTh704twvq7DmVOWp2IAGmCyEePLunI=": "474970000000", + "DriJxZNIbQsE30AOHlB1Cv0RdCOqLcGKbmVXZjpLdFI=": "3816094000000", + "DsUowPCbs9Yn1A0ioi47CnyU7aO8JdGBj6GfBcuyozM=": "1616280000000", + "DtBD6Ky7rCXOo4KIPzh87r_lAkCfuC0rQomL03wdCd0=": "1923076000000", + "DtEROjENj8DbX35IgTk7rYCAgpJsc48u_hDeY2tqWSc=": "377410000000", + "DuFEbZ4EWI0umqH8G97CJNQu7fNQbbQoWu2NVk5KyP4=": "769230000000", + "DuaSmG8yxO1gzD2MCJ7Li-G20IZWMcfpXBy4VsDuaBA=": "991749000000", + "Dufm04wYY6Pl7fxxfmINMb7J96y473GgZqvPeLmuRxk=": "1669591000000", + "DukQEgQOvAES0Ht3g5x9oicWI99hOondmSZFqh0VCiY=": "1538461000000", + "Dv5YDdOyW4aE3Ju9pNeCCi88XHvYx3MW-sgKUdJJg70=": "379528000000", + "DvBLvHJBaGwXW-CHiq0RMfek0fgC7YCFmpSHXH3ETYk=": "416667000000", + "Dw853moL2pvqI10uQ3KH8cNE1unt2gTvQLH315lN0L8=": "449338000000", + "DwQ16bWGmC1jduYzF8hCWM8ZL0cxQHefmGZHaz4TkN8=": "615384000000", + "DwgSTv87eAWb1zVoftKafFIH1obUg0W8dSnpD6XgKXY=": "435686000000", + "DxQT2vjJzbxRyoV1NsjY8H4eQ74sbgz9OzISt3tdYVI=": "438645000000", + "DxQlVammVbW_N_u8r65lUodk5FviOl1_ogL_rZ5gW24=": "463051000000", + "DyEdrkQb3qGEpt8ltMJbQZm9m5srkpMqMULeQNyfaGs=": "1154790000000", + "Dyn6kHIN2zOxjAMl9JMbpMF01t6my_HGnyvO3bTjfB8=": "1135836000000", + "Dz29gocmorhB42IQPY68SOr2PeW2EkKDOhbTkap7TlE=": "7710149000000", + "DzqgWYMTEMmKHI1QWvhYJLoFQ8TFlh4NWkZ0D3cRuCQ=": "3588947000000", + "DzrO-O3lVdJYMpgkoPRPIRJqdWqtzmMTcxKsDALeYBk=": "4089833000000", + "E-7n4PiqUlSenWo5V8F47dyTTUXeO91a-8qgTmEOdZw=": "906393000000", + "E-g_B9o4afdOmRQjB781MlfEsqZ38nDKEz1Bq5lhUKQ=": "908507000000", + "E-v3d6QibVlPYcFf4bIhy200avWyU3yc0-xqT6BgVxU=": "1245451000000", + "E00P-umgwoHytFSbqZ8uAQCQ9d_3f3BRtAnCC4mbtjo=": "1153846000000", + "E1CfCoaSRhI7hsXkRYPuiTNn0G-5kK682Ocror9PEcE=": "385509000000", + "E1Dw-5Lnsno1off5I9I8Xuh_AnSphQw2DajEz2yjNBE=": "404752000000", + "E1HRE7M-YSDDHNaeqs9CRXVornMCbqJyCNckvtj_ytw=": "1914924000000", + "E1JZbvdOGZ2SFCAVJ35faUCUi_vS0f42V1P50C_k0eQ=": "4999999000000", + "E1kkC3Vs17EyGgbJoxmocNKSTwMAb51Pf4Tt3s8YFeA=": "767832000000", + "E1nseud3O6QVcXL6YtC-RHP_2hBTS5UfR8Rg7HcWIFk=": "462568000000", + "E226oM6-U-lbeCEOugRdtr4bsxaHVwv2O1EMp7Et8yk=": "448705000000", + "E2nyYnK2Lvkn1_uVH5XjgW-FMko5FwzJf5w3qrBIqeU=": "6447081000000", + "E3_Pv6BqEOPWkwbJW9ngyTFmoK9ku1RwKd6Y7ZUgibc=": "384615000000", + "E3eoZdNtPMf6kv-_0ThAueo4CUsvVtWVzbwyZRRN6Ak=": "385510000000", + "E3y--1Mt8_R19PEOUC2NYoXtDmRH_JVYvoWXV3mMXro=": "8954449000000", + "E4H1X5rE_KL67fpHtEgag7UdpJ-YfZ9nmxGbq4TL25k=": "384828000000", + "E4jTLHtCJsY-_dBZBUzDQ8MMTzDwgvob83MrvqTNERs=": "384615000000", + "E4vD4LFZKuNg0HxYBO-IibOJXQZp31g2XTRqsfFHOAI=": "383809000000", + "E5N5cEHEq5JXMJKOvEVyJNfjqPlVcrO76FSbKwkkv1Q=": "4838522000000", + "E5TwJrG6Z0AowZtTW0n4w8V66Bx_rGQTEYyXtfBpRh0=": "422561000000", + "E5WXgrN0b14ERkkvO_QFonK6SWBv0z4HB6pj29-WsTA=": "458561000000", + "E5ikdQ7zJ-r3dKLsMES4DU6WMXavTRekT5AepVPiKFI=": "464007000000", + "E5kejaYvIn0OUlVnz_gOTvI4NDjH3tf2DGSd5W_cKzA=": "385767000000", + "E5x3zMNohc9y8XvypYYh-_83jz-asa-xAZ2gieUxt-U=": "3279075000000", + "E6-fD2HlkClYRpqx8U9_qbFgr0bSMnFkGo45ZtAOuIc=": "779596000000", + "E7gaSOnx1ULWoD-6xfWw79dqWBhW-OESTyPnl1fKLd4=": "487972000000", + "E7kZ00cjzw4VOyxH_UlE67t3_qAk9BPhjIkShF4Rh0U=": "380827000000", + "E7vvQuZ8kR7hUmS1BiUK2JZMjrDO3qX26P45Q-n840E=": "463777000000", + "E7xRrkz4btwZ9WVi_hdRWNonOAZxplSygnTFYOFIgfQ=": "582693000000", + "E87wozN67m-fOYCwOjcS1e82YtvYZ68lUrAUNfFBNo8=": "384615000000", + "E8FLNGnnQmAxotGNIgWdelXYdJ2RQjO8WqxVlbjFi84=": "456250000000", + "E8NdopVh7TkdELVOVB-PIIAxAcQUZaqX3drUgIFVx-I=": "502242000000", + "E8q4YXXkadW9JAvg6Ybsoh_WHtK-17XqHBxI_0SNhlQ=": "2083366000000", + "E8r9WTHScIBYMSLhJw3x-owG8DlMzU8FJZyK0N5LB44=": "1823935000000", + "E9FApO6uRskKzE50j54KLgMBI1A1NhdxcyQOhHAlxps=": "385849000000", + "E9G5I_J3l9oG4JHBhWfe0HrZhJTAODTlp6tAY8SSzhw=": "413461000000", + "E9hPv_BU9w-JXzfpXsBUIbmsUGrdHgbHR9ipSXcq5fY=": "1889934000000", + "E9mmkG54QG48yP5GUesBNmQ--O8LslBmgAH22yfZ8BE=": "982646000000", + "E9tduEkbe4XrsFbebkqqKKgrGQ-5fqE2eneznK3VRQM=": "437206000000", + "EBHJ447ZEMec0KkSrNi12TpQL-uaH57gbJpxmEZlAs8=": "3972150000000", + "EBb0bV3IPwWLEbdwTkwT2PRxCtMrXerpc-uJCq0ZGAM=": "5167907000000", + "EBiQFKLLYJRT7m8uwyS0I_A4riUtOeynKqhy6nADQK4=": "1215072000000", + "EBms5AUZPQfzfshJ7PQ9bT3jnk9wdMPfJ-xYUTAkpUw=": "1156521000000", + "ECkhJ6ulxPiIA0QG9EEr6ZFDNOLByI0dmJ8MeaX8xMA=": "382394000000", + "ECnWUA9-NEmvNE8gDqrgth8rzcsTxyTD-vx8Eb8BxfA=": "465638000000", + "ED8EhmpQYPZARCl4WkPVaKhI2jt-wWFTQWhBntibXXY=": "378137000000", + "EDeB5WyNz-FSVabATNxbRFJotvLkz5jp0ZBXbVjXbUI=": "1324305000000", + "EE8uoG0HzxQ_fKh_GNli3xsqp02n3fIEflVKDjLYTP8=": "2087646000000", + "EECmrjc-DlJ_8LEHtvWitxw2rhgSKqpANpnmNCzHphg=": "454929000000", + "EESGnONr41yKFxa8OaTf-Fu8thOl6rKrxKS5_Cby0as=": "407808000000", + "EESZiuDSmF5iXyEHdbx1a8OABH1mgFvbb5yoebAqiPg=": "433628000000", + "EEVVidYauW3uKFoy5AsDY6hLoj1SninHf77A-adlqlo=": "384773000000", + "EEXst8X3Src9rsegH7BPDnBbyRWaBwlh7CWb-GX-6xM=": "384619000000", + "EEe5EoBT28trde3K7AS1bhrPphEZLxsK6w2R9a3oEhs=": "1153846000000", + "EEj4IFK0bjk19nxZtqwGRp5Uq0mLHjMIxkZv84MrZcI=": "82024819000000", + "EFAiu9NnMuLHxdNTCNytq92DpdIkuHfylYr0Zg69nI4=": "455600000000", + "EFcP8reSsmyWjQtafUzxxBUldAnK-VjMHONJBcSWj_w=": "9545081000000", + "EFerIh4OYD4PDM0F2RtKuetTWnxL9VxQIdmr_-67guI=": "1156532000000", + "EFfKv9JWZLAocW-9Tm2KmOT0V1olYTg6rxMr78Ct8yc=": "1153846000000", + "EFnSaLUL4HOgQzcQOEF10EwORc_GmmEUm97Uz0gd1uA=": "833333000000", + "EFxbjitpjdNcIl0zLb7wwjNzOPaoP8GGSofpNYGuN8s=": "384244000000", + "EG3M2IP7GVd-_UfgeP7uVJNA2wO3PbHY9n1KIZk3f74=": "634303000000", + "EG4a6W4d8ZDauxpyUIXLMAEQLxU2_Kv_Tm5E9lsM4VY=": "415629000000", + "EGGeKPoPnXNdbfgv7qzlWmblRYiQiAlp02K4YjjESmg=": "781986000000", + "EGHTORlBbEuaxapaBFHotbJ3QjTxM_Bw9cYNF1HPg8A=": "629178000000", + "EGI3YtvevjkFhIu34COLmoegqN_NrZz_pjAkJ8jI7Ic=": "1493608000000", + "EGJ_tubzFLNRuZuvzkGUpn5tfLKe4UsB-j6zp8iY6co=": "2272735000000", + "EGQTn1d3ysLSuhfrOhHYQcHvGfLOC0Mt_LJt8-1fiRI=": "362295000000", + "EGbVJ4rtq8zoJletOGqVoJKEEO282EAG_6kH-y7_oys=": "1124310000000", + "EGi6bK9WWgP-1wP51EsQWPaGh_fMRfPJUV1eOtIbWOM=": "1250000000000", + "EH-NYsqA1i5EKY8Up_JjfgqX0x_ByTkKWVOrDUGA04s=": "769230000000", + "EH7A0yvTNki5vYyzb0zE_if3_ExGU39aaeAY8bAz8mU=": "2832900000000", + "EHFq14tcSNxr0DV1-UeojgtNZDBMUx3v52PNrehmLbA=": "377403000000", + "EHUfoVJIQqOo_r4WHGtXCvsQmRFlx0tBYlrx7cURzBw=": "385814000000", + "EHqpFfIciwTnbH4fNEbEgAPfzWr-9Dl09JhyeqXpUFs=": "383228000000", + "EIMembtc_H_dPP6RLS5EnrHoKgN-RoAoClmHJ6QOsk8=": "462841000000", + "EIPFSpF_gYrPjTT3iDDPyqITIom71SXCBDijVH2_41s=": "377132000000", + "EIe5PO4t6xUn7qNiFift7sedhKaJOFYqbicVPhgA5x4=": "476923000000", + "EIrX8h4535GXzJG6I67gMbpL5WvJFSN29oqUCJc3WJE=": "4078086000000", + "EJ-jVs4EKio8LAHVnrJFHam77bDmKm2sW55zzEAEpWo=": "945909000000", + "EJAKoZQrEmBDAvyC4JBdnzSty1RropA6Ko5FPZqr_PE=": "416666000000", + "EJHUxhO55hywn-ZkKIA4U3iKR9XNRxQtvvrG4nRyTyQ=": "499999000000", + "EJIl90jVKrp8avYxf7nw3wDcttSghQLb9x_FC-QaO2M=": "451219000000", + "EJsLV2hp7PZw5lT2KIUpD61g6coBjDZZtFSPg4C2Uig=": "412207000000", + "EJz-SuskLa99hiSW-qEo9e3aAK_8T6zK8zrFMZktS3Y=": "766272000000", + "EK7x3848bD2n2EiF_IKUn0EI-SVRRjALH8QL2J6L61A=": "384668000000", + "EKcQ3wisTj1Q-_UVnnRLeLt05Aju4eXuf4VzxIfK7g8=": "377041000000", + "EKyoBPsxsMg5VeBfJu7bu86WaMXNz2HrtVE6kodKt1k=": "2692307000000", + "EL8iarNhLYF1E1hwA55KvAjOAS1B3ne971bRiSVXyOM=": "109831430000000", + "ELg5lC-Mb1swdhmVPndUJ-FOxVshXG-c2p5gS-c5X4Y=": "384615000000", + "EM1RvXfzz_ZUVCSNsflk9Kvu-IZLzOh09TVNvNmXmGI=": "4862057000000", + "EM2UHJm1c2aVHDL73724xzUpsziJVPvZuRkZ4S93jrI=": "1929316000000", + "EMuf3Zn29YlWQ0FpZjxBuGKsPvhsbwILKG2Xgy2ftUQ=": "1153846000000", + "EN70DUIJw6QBp8otVEYy6YUlCY6zY1c0k-HVzZB55Eg=": "389461000000", + "EN9Yp4iiB3daLzHChWX4Y64peLSUW5Nm3TOy8V8_l-w=": "769230000000", + "ENIVAekkC72HdhJpFxd78MgjT9gW04EQOYw9A8lvEzU=": "8266621000000", + "ENQUfJ_PrgNRhNzi1oOn2FDvhouh_i5xuL2LOjHen70=": "401769000000", + "ENSIrRsooLPpFQgl6k0nozAipyQ8b6ZVjp4hiV_ZU2U=": "769177000000", + "EOSTZ7DEC77Et0ArPUA2N89Q9mkvfUez9kWDyq0HtYs=": "2107038000000", + "EOg_subamXJvubNEAQvHFu9fZ4Lr_lKc8Lt16MpBROM=": "448471000000", + "EOkQj0nRryDom09q3d3GRf3UZR_5mQ6F_aNsIFq7Scs=": "411085000000", + "EOksMmHfTF7mrxHRSs_epV4yLwN_REpJmTheBWggs30=": "382394000000", + "EOljRHr9_15BFobTa7b1epNM5uyN0YVEO1t5F0m5wDo=": "3310792000000", + "EOsvls3RSJrl2BCQFOBhEYVrpYTxFph-nkKR1Wg9Bxo=": "904760000000", + "EPUwWG4w7TpB1C212uGI4q5bGNvIKUWA1AN43F6F2Fs=": "384805000000", + "EPbjGr-WsI4FMS8jIGZui70kcdLHXHmTKsHxidi6h9w=": "384888000000", + "EPj9enXvqWDnIZVoHYaCdsHXj3_UJL91B9K3mxkRL2w=": "1539193000000", + "EPmFCB98PTFhI7433ujKEZI28_fJlUNliODjA57EsmA=": "423370000000", + "EPv0Z3T2IwVFY3Yc2CgQL72WUac480MznSvZqzpqPs8=": "2473572000000", + "EQdCrK4oFn2WnKYIHyD4b4GcogmIYF7QgRkZp-o-r6I=": "757718000000", + "EQjQWH2fLuN-jDUBjNAMGnJ2Y_DhsVp-DMCSKIO6nxY=": "466325000000", + "ER2NAMpzjtxv0b6WUSfxAloIWtJcnn7DUHPbXiOIHVk=": "1230993000000", + "ERCrjWMEW_jfQxXDx0EVmlImVrLqKBB4hFpmOAkUItE=": "1811506000000", + "ERDrX6PYYYnc4BRRggq0oPiAHP0x-rDBiPYYJrA3y3M=": "417567000000", + "ERNIMWL5Yk_jhftAcFvjL1F02P7URTMgdauhazBnN8Y=": "4225981000000", + "ERXgZqcKjlqnmKhnht7v6pwxn1I_nrL4mfqvRbP08_w=": "1115373000000", + "ERsge9PW0IYS6jO8iKXNMeBmNpuEjXXRIw5IWn0cUqg=": "2769215000000", + "ES080W-tSmzRSOinpIgDV5B2r8nNA2nQRjJMytrRLic=": "1851597000000", + "ESMkPQfRHX9eVFrnN1_Hc8TY5tC_kWjSbKjjOxQaXB4=": "3461538000000", + "ETC5ShCm-FdazoAKa3fLl9OVMA_s8olmlkIqUYyRIs4=": "999999000000", + "ETgXAULMmIB3TciIcPTvA4fBtV-C12clUlY2dInwJ-Y=": "1197549000000", + "EU8TIvHCe8oWP0K6B8zncvqKNenEApDqMMUUeZOW64Q=": "1161322000000", + "EUDXGbz-Tkl2l-wKDNRHtce6B6FWqJpNtt79PTpdqms=": "1813846000000", + "EUNCGm5c23sJKjUlU9RozmigeoUrRBmoVeTnQ7hbRZ8=": "2095353000000", + "EUngcq-vZHjE86ZcFRK3T30HjidN9mb0JpPVkf14qJQ=": "827797000000", + "EV0QJ8IIJcHhBk2RZ1qSrPTBfjGtfx4z-fMTGijgxNQ=": "384326000000", + "EV378f2sBRKHXEnYIf6S7pwRgL2DwOKlIQtqkECzETg=": "540664000000", + "EWQ8LtugqDufnB5UhXLGCykn5aKCFUu6McwaPhWWhKU=": "503900000000", + "EWaPxG9_tM6FIsbxsGXGZQgX145y1VPS_Q_LfbKwBXE=": "511993000000", + "EWvaJzHMvdh0cpIJ6_uxwBvfzUFLydSpgMoGL_WLe64=": "384615000000", + "EXPoGU0_N4kZ63-R-jiupoQ_FgRGCboOHEV-t7_EXc8=": "809967000000", + "EXWk5rBE2bpYOblZ1Lc-EDU2xL2bPeUMtse8Z77zt6U=": "460577000000", + "EXo3NgD-19XYsUwbNf3rZR5QMbrk5YhIGt3Ke76FkwI=": "1446111000000", + "EXpaEXj1-LhHbt7N-ep5EcH9doHaRrudHT28yCDwf90=": "1233257000000", + "EXzH0YlEg-3iB1sMZ2a6qoFYKYSSRUMkvfnzKtyuwoM=": "385507000000", + "EYDUWIwwOpln4uLT22oGF0rssdH8kX684DVV3Ol06XA=": "681322000000", + "EYDvGrxLWrRdGRucYcRsf4RG3HLpwC-urIfJa04DH-c=": "499999000000", + "EYLn-1nmvRNYto9hgEW7YlsKqB4LBSfLIrBiSwPKDgs=": "384615000000", + "EYR2mjS9VyejTIy_wZ8EyTfvUDttopHD6OIg1vrrraY=": "414989000000", + "EYgxjNMOTfriOUmF1rT6Qpew9K6DvhZWMYk8U_gIjpM=": "556588000000", + "EZ6BEL4MUoRttVsmqVqSW4-CCL767Mn0fwoDjvF-voM=": "943502000000", + "EZJue7ZnwMllxbKl9Mz4ZrTHB1YyknQn4NRSJ4xUJug=": "816447000000", + "EZi9vYJR9OF_3kbKM8qxg2E6tpj7JM8om1oDoBvdlLo=": "1366519000000", + "EZmqFN_CP-asz-rP83zH8DpLSIL_-fm6J9_zAVs0Tfc=": "382394000000", + "E_a8zWREbJbKynvvxzXnEsjKULcNj5PMEsHv1CWPksw=": "537835000000", + "E_yyh6LFe06RdSBD_WYwhc1DOIRsNJWD7IpA7zMMkZY=": "2026785000000", + "EaCv_j3cTFTjeG1znvW2US2BB_4_qj-Y9TX_iYg_Z30=": "780149000000", + "EaKoebsEfkxQJT4ZKHIJPSlmus-xY6_91VA9js3sUOM=": "463986000000", + "EaTNxGqudKYrYm4N_3mVnP97G6JpwvPrw2wbIPq4Bt4=": "384615000000", + "EaUtaHfkOb3HAy4eDAuRkq1agwcj6QNERdoPjl6AAcM=": "382286000000", + "Eaf_lMPoLiTUqAKBGA6XWJ6wd8c3JoL2RnD1r3QYd_0=": "1011073000000", + "EbDbidTwto0QiAvXqqW4nmK660gHa9ukCfKCq1eG9Tc=": "385528000000", + "EbNBx2Dmcmgrw-wPiAct2Wl5-XetVk_b4guRGOaajlI=": "1363636000000", + "EbVdVx1DcgNA-98-yQLXNhoFTsa4BpXP0-8b50FH7TI=": "769230000000", + "EcZA8P2W0oQbQsA0MOGNqsYvM11l7EQJt7hQcg8S0eo=": "687337000000", + "Ecd4N5QGLTXmYQ4145oITsD2AKQYF-yWRcccIimzvdc=": "451495000000", + "Ed0fOQpmMt_C_JSao-YjeDVmfB-KeP7xYYknnYz5Kbo=": "416596000000", + "EdXQNQtqYwi9PZw98zwFOLLeax4TYD40vCS-yF_apLA=": "382479000000", + "Edplx1I2o94NI8BX3Y4TWul_SrpcK-aA_dFMWPH0wSY=": "384615000000", + "Ee7Z5c-uozjSOhTvqWxJEJFxHyFO6q0ycQu_WZxqJBE=": "846736000000", + "EeBZao80zMlVlX5hgpyPtWwgZEV4X9qHuvqeg0_hJ74=": "469310000000", + "EeXGJZIM0AMWKEJYn_Xp4nQAgHIf1nCOHY4ovkThTS0=": "385449000000", + "Ef3-Ihx1mcaD6dkrEuoPjLttda4DWchqHkYqD378HnI=": "1088100000000", + "EfesCNVz3zEDAtQqO62seAYHSnHOspsoDpxU9WnTftg=": "3515654000000", + "Eg3R-liPsuMoz-X6vgNaI5uTrJg-SP8C1qwvg8xnynY=": "33340780000000", + "Eg5nif0vSJFGjQfFxU5EiqlejrVrkHpe9zYz_aTCJOQ=": "1782823000000", + "EggmjPi6GlVmX9nV39HsZlPXYebGRWUE31HrPMnQILU=": "810714000000", + "Egl6w4Sd7toVtEa1TBpSZI3cIYAbNeqNv_IwZ72Q0YM=": "477484000000", + "Eh276pyQcdLV7aYnLqB8nDWtAEGAtM0Og33dNIOYIRo=": "490530000000", + "EhF5Z3e2ezc4WDvoQU5wMmQgifhFwKUGdbAgx0QAugU=": "458519000000", + "EhXXA38kgDiH3Aa2eVNNAkaQgBRjCVPCTRiSxcKO1a8=": "2115128000000", + "Ehq5w9pV_q0LfhQapc3EwPyFYs-svEBRPIMhKoZRfaQ=": "383981000000", + "Ei4i_LnB2FKg2Ggrx9iZNaGmgTTWu46BlFnNuIB-UwA=": "384615000000", + "EiDi4AVcUDn6I00gSmQosdu2v442nq8uwKGASfICri4=": "582408000000", + "EiSWi6KktZHNTN6RLsMWXeFfCdd_Scb6FB8sgCMpIg0=": "422017000000", + "EicCcotEDdlT0RKZkMvHH7VblgpMsMgAVYeDRoagBnk=": "462146000000", + "Eil0A6rya7ZMnIZSiRVk_tPRoaJFixteXZtuJc6kN4k=": "462146000000", + "EioWDwFn7YHicGC3PJeQP_I6kgV_2UqtWJzTMb4PmZw=": "2247279000000", + "EixC533FQmIie9j69no0XTaEDLp4RDBhpcBWEXUfXUw=": "2100881000000", + "Ej-nZRq-zkcOKvvTfjuqI_56cEO7_uPYl4obMdfiCno=": "769250000000", + "EjEu25CkeGYnXCWJ-2oTqPLa37R6amTsY2HVsG881WI=": "1329548000000", + "EjLSGqx9-FVuJRB2Bih8L6Bu65xSQvqU7MrxkIZ4SQ0=": "1890453000000", + "EjP31mcZhuxvw6STL76KsRmFMQ95N3ZrVl573xhf3z4=": "421019000000", + "EjTViJ0xT7CLhIu3njEQRcBd1r2GtOaP53kMrY4pMjw=": "580473000000", + "EjsN2D42_uqnMlaugxi4FOJATYx2gtKfg8EohmXvhkk=": "673581000000", + "Ek9TDUisWnyr7DzuWJUYx7SepXjBaIaGRcTBAqRW0B8=": "3845575000000", + "EkShPtsbM8tVXPi4uEwpMvNVrSvXly9lAnlVaX9iSDo=": "2258488000000", + "EkTR9PctTxebtTUJQ9ryQPUvXLmDbofq0EE2WxrGHNQ=": "3115384000000", + "Ek_queVYuOLqD75M0Vap1UTt45Wo0TfX23NZ7e38dRs=": "1567190000000", + "EkaPsB86ZYms-Aak1MQbn6KIYUJA2ElhFUQkrnl7AkU=": "520273000000", + "El-GBlAifUUc0s-HCCHx9Ft64XHTTk1iw5DMKJDYaDw=": "554133000000", + "El0l_2MnSf-iAiqxT2l0cZn9rP5DYW95eONAtHs5lDI=": "1159208000000", + "El9KIp5yaI9x7vdmqy0PLkXZrbRFjXZ0HhgjlXHGR44=": "752984000000", + "EmY_QBdiuup3FcdTvnD-ZjeLJRSvHIJzIDP0pPIvG40=": "1538447000000", + "EmeuyTupJM6L59ko1bWvffonRDwXDZGCgy0EL5qSYuk=": "3846153000000", + "EmpF1qf04jOIoACyoRWZ05TkT38a7eYAb3-b5mJ9RSE=": "5011093000000", + "EmqNuoQiYJ__bCYLwlHKwZwjU436-5ruXYl0FRgqbcQ=": "1061538000000", + "EmvIFZhyT5Jfly31y1mXnDstG4mB-57OlvZzY49ETbw=": "2250164000000", + "En2p4DGa7wEZjIFxLGnh3LoalfKWmIRSHTOIXird55I=": "473295000000", + "En7u7SkYKylUKVKgbyKxv7KBaqrvUYK31vFAVKY6no4=": "3855050000000", + "EnResQMT6ZUQ4q42LyQyM6sREAM79s5tALPNzsTx2CU=": "3715598000000", + "EnujeCVDr7Fg1Am0qaCcojFew4cHHVr6J1PZYIMTFkA=": "418720000000", + "EoAx2ccOmvwK-mt-AXPOK8C7Jyq0Kc5XGUIHe9ljg3I=": "1940588000000", + "EoKSAtAd-BLZaq7Clo27Lk4r7HMT8zbBnPONF00RmI4=": "446505000000", + "EoVqMn0jwkpelGi4gP5hxlofaG8DRf5_u7pUsFBggw4=": "3344230000000", + "Ep1OAVYXmGBcnkGfHb8xQnzFmK0LClEEekiqoBKokNk=": "416466000000", + "Ep_zPdWa_OYSTuTL1PJyY4KJSZlv2tM7xcYHhpKa0BE=": "5034151000000", + "EpyGb3ls5eOWQHSUJYbmAObvXfz1rAj3Z6hv7xfiWJE=": "2114114000000", + "Epyh0XJFiC-If291Ym59MF8tj8_lm7D98b-SAKSH5TM=": "1753839000000", + "Eq1j_ZULWQjKswLEJ6B-DE_1Y_QIGA9oYdcBL66lhYE=": "769230000000", + "EqITMWbJD5IRArbaNDaQAft5Uo47Kb_wsvfX44PXbqk=": "417615000000", + "EqRhb39XMATrQ-jnc_SCEM1Tbe8vjdDc4wDc87lgddE=": "377783000000", + "EqV70FLsOQTvCccXBurVlDZRr7i0m-oCGsdT9JcqnIc=": "377514000000", + "EqW_3EkjrNW1ysjjZYDJqmGJrGfPgM4gWVguxCvTbV0=": "416650000000", + "Eqg9KA9m57Kyb4lDqyNky287zSCapF7kFLcMhVwTkf8=": "384615000000", + "Eqvr52FMzSDNgsSY-Na76t2f6JBEUGkTUT8CdjqFDc8=": "396153000000", + "Eqwnb4O7udIHjQFgQLnyg1fOnnblfWkN5FtvbiwXqTk=": "2045454000000", + "Eqzt5PzyjystIC0ayu9dYo2D4d2TuLdvaX1MgEaLO1o=": "9553283000000", + "ErKAwyeiiE99oYW7GiTBv2_1xVc408_7NFL8C5Kz3C0=": "1153846000000", + "Erh9QYXs0Y_YUOYyd8WyuNqqyCS6Qon62GGQ5WTZgdY=": "840121000000", + "ErimeGrpUqB0j1svAlBbeiZ_9JIoVakOkIt-UXjtIs0=": "416595000000", + "ErjPpLqyXGMeZaXK2qDEvnowC-MI7WxC3y2Aoa4A4wE=": "384708000000", + "EsWYiXkKmx4u7CDKlvQAtilJ3IOqtWIFqXlmz_unW8U=": "596153000000", + "Et0MzooUGCEFrh9tX1uoSODSSXTWVGCn8kEHgdWgZVQ=": "769230000000", + "EtIbbVv4Jzh1osqss4Rbc-3Le02KNkhxQ5CEtk0F4Nw=": "460851000000", + "EtQa5Jy3BbC4F08rsvqxMw2vfW4ryaY8evKMPk5yELM=": "590909000000", + "Ethbwv5asr1NCgaf92WWPU94-QSHKSJ4kEjxhHlsUgc=": "418089000000", + "Eti5jinAC_mcuzHwGsjhzXHE2RsQcFiXs4_whLeMr5w=": "569245000000", + "EtqdlbQGYwGeMyCHHgzMgh10jinKfxwReaKgsWqIwRU=": "416707000000", + "EtuNFMDJyp-eQ5DXb1CNH7ToubqSOXmx8MVr-EApnbg=": "384615000000", + "EtvMEgv_BQeLTg3g1T24Vp9tYji3Ur3dPoDq3SHbOiE=": "1233257000000", + "Etz3cfJf_x_e4opYaMO_3AQ7Q4JNwkKRCy9w-dMhaBM=": "385509000000", + "Euc9fHR9OZDdNovfqJNcY30_UJMqp6kFql2V2bpwqRM=": "927069000000", + "EupbdtpMc5nrzJqv1fDzcQFRxg9KG3nCvQW6WvgMn58=": "384615000000", + "EvGGWISrQ8Yr3m8hFEMBc5lBBZItC83z0vxkxpYgIDk=": "513844000000", + "Ev_em2uC4oyMa2TheNiweHMoB03LcDcvBbvZs5UhC4M=": "382479000000", + "EvqfFyvsvn2MfPP-PZiFFY5xkQBvJxDdBQd2njiiUXE=": "3281719000000", + "EwHUzrN1vYTRwfdK7n9-yzfTB5IrZ2ZrCd3BlL6dxOM=": "418855000000", + "EwSwVaY81vxMLr30xgfONxZGbJwCWBYo6-A--X5J7zQ=": "809670000000", + "EwWT_8TTJ7ViYYn101ChL7IZkpoDhVKSD46k9zOILHQ=": "384615000000", + "EwfkZM27cU95QHP3LSDB5JjujzdV6af18Y5MwHiSOdU=": "5579815000000", + "EwnNX7uk3gjEivbFlgfHzRAkk7c0AEXnTKn0WLZptlE=": "455871000000", + "Ewt4LeO0BmP1OPL414Z2XRsk2K8cNcSGRbXES6Y862o=": "413113000000", + "ExAjrsc-qMRRORb7uD9y80OHzBbd_lC5J37aqLkkPIQ=": "384615000000", + "ExHm5uhCPV4UF-mH1Cqhs5bPH3aku1sJYPOvUbc5ZGA=": "801500000000", + "ExQrwQpndAG6kiEsmJY-ohEnF14dC3BloAuWLs_oORQ=": "416666000000", + "ExYG1IKIZd_s7QhD-d6oIefNzJB1DdbSgxY8oFcp4Tg=": "454545000000", + "ExpgMaXwTb-TASf-ISTkofx8B2cv_vlgXdUO3LoyME0=": "450939000000", + "Ey0ZS7idTvECGsLlHgGSjWfdjl78fgcsyk6j7_QBM-8=": "628658000000", + "EyDX3_uziBDUplS4tM8UPNxeGhSf8r-1YRcLqbXcAtQ=": "382394000000", + "EyUP3DTobrO9RfozLMaQsVJUyxw8eT96h6jP4qvS9IA=": "1923076000000", + "EyV9MTlJglai3EOXJfJx5zUnV5oQHtOU0wOcyy0xuVU=": "769230000000", + "EyfzWF7i5sVVyAyXzs0wMMdRJXBWhBKEFG8qgh_esMg=": "384615000000", + "EyijIKjOeOrrxCPeb_XSOzzzdPPtAIB8hFnFiQkvU9o=": "5447665000000", + "EyyA1Y2wFY95nSwyBp5C4CgRuhEhJIFAwhwTH-mX3xc=": "384615000000", + "EzGZWuOq58iJLZnsYQcPLDpmnHoT4WpqNdbzfdp47k4=": "928476000000", + "EzHBa6SkBp4Xzurn-HoRpFyy41Oi7prJF1bzGXjutX0=": "385298000000", + "EzbYQwwGVCNai7YAJcm3vVnM_xlRIs5_DtHAZ3UJLMg=": "447840000000", + "Ezj8kaDdHqMHbmJsWTHIYhmOkadl-rGFuZDFK8_O-8I=": "455600000000", + "F-3K0tv3__01Z8akoXN8N5_1KUyjk7R61gn1dMRH8CE=": "417629000000", + "F-OdNxzr4I7LKKGJVmjRK78F7Tt17bsg_wAuzxz_XqQ=": "462472000000", + "F-j9RTGsvnwukFJfXgCOpGn8dQc5hDLQyuBqMU5Z-tI=": "381820000000", + "F-nd6Rw0A9HHLw41ICN6YPItR5nNEvVcR4yNvGVT6_Q=": "384615000000", + "F0JJ1T8up9SUUF1VHNqbSTG75oG4GuxlggveWWk4gG0=": "454587000000", + "F0NokflqgkHTkAIXG9iqVAPzGoZdBHnlf3ZJWoLbE2k=": "419408000000", + "F0Tkf_XVS1iB-0MtFZWZFvmRoA9UZ_Vg-tiUXFpewbk=": "1497755000000", + "F0vWaxEKsiAV3P5unToCy-2pPmPKDi5cKH-w_P8tcLk=": "603420000000", + "F1FD14kAyVjJc_TPhgwSl5fcQCWapkPj5U3n0jjzNPc=": "1892005000000", + "F1RvGiFFVewtN1qi2X0EMJWxxi4QNP20G2pFX7HB1Kw=": "386353000000", + "F1aivDKPTXghAIfpyAwhPcMBF8JnBRP7s6pfHFYsdqE=": "9166666000000", + "F1iI-6QjiCQvZC7D8F7ijM7ICMoqBhZgK-Y28HZ0OYY=": "385510000000", + "F322zgbsA1IVg45c6ysrRyBG2KMT5wuep1oombkshoo=": "942227000000", + "F3ch_qQa7SeSHSCP4Kt9H0xBEUaHkYfaAyV_3lDY_qM=": "3856992000000", + "F41iQduNp1nmGLwsht9-6W6p0tS-WoTsKRh0eVFyDM4=": "389371000000", + "F4JQ2UW7ha1dE3Ygi5EiNFPcoh8GoR-NEgCYSnHbbOM=": "936818000000", + "F4zbwG2kvPZmF9kJ3HLrB9N_kpOnvCzgYGVzBKMtp64=": "383841000000", + "F58gQnGYJY4FaH80JfXrKCUgIe4MAGwKOC4bGjKbkJc=": "384835000000", + "F5B7toB2PzflsvOyVAUVwDjLii765BaYyXiSZtDn7hM=": "893063000000", + "F5Q5L3to1UZJAUnqRv6UGQHTHwmufOT5doZwH5Se_O0=": "7525672000000", + "F5ler2bHsbbzasEwaKophQjy_Xp3hdGocROtHrl3Pkk=": "500247000000", + "F5q_gfXVdu7serm4aki1mPR9Jo69MRZYpxXzFoXqwpQ=": "3823480000000", + "F6TI3t44UIgLizSYDFZP_mtrePc3OOdkoGsEuSbB4VI=": "384615000000", + "F6Wxm4vnTj3q4t5NJ1PqDHxYr34YWa0sW3ZGV1fIkn0=": "4327157000000", + "F6Z6MLCN-wboAjl87bJw59mWfgNbyJUVoYYxZvhDF8Y=": "482708000000", + "F6dilim2xu0kMQCPOaORkVv9bVMFMyl-E5RQrZZ3XkM=": "2497874000000", + "F6yws16HjNHbZDvEOB5VJbVbn8PGGo8UsqNIxaQ12k8=": "2334900000000", + "F7MediaM22Y_eAqMw05cCWUAVT1PUcqkhL-H3bZ_DO8=": "3653846000000", + "F7v41OHoAe4vMaIUHNiurKoGLmA_clBaats7rD8dLRs=": "767884000000", + "F817pW2PpKLNGGwbbJV_jZq7Z8WNddr8NyjQsR7nlrU=": "384678000000", + "F8CCjsa3Xldp_2aCmeIK_XRbOuGVaSh2ARU336bCfRI=": "378104000000", + "F96GL2K818jg8LEPPpxj7KquVqhzoaSybfvzYvHhMvo=": "462160000000", + "F9jFmV3QRxRuemdNODrBwAVFZglaz8TeR1dZGU5XtoM=": "453192000000", + "F9orRUUL5OulA8-mYeVYsTp1PeS-H2qcgDI8Gv3nfQ8=": "487972000000", + "F9s4JQu2OkKlbqXGASeDsXrXrjqcQrtfRHX-pwSxc6k=": "3754722000000", + "FB6Mbpe9jOl8TBEyPtIiiNtxI7zJig4nOmqC5aKQmBs=": "833858000000", + "FBaLRU3bA1ZTbgMsO5kJuoCmvqLv7EHpsYxq1I4Jm9U=": "384615000000", + "FBcv7ZUiAv8nGY5N22bSJhlzkIpC7Ou-eDwmPdnqvHg=": "465095000000", + "FC78Rmvv-FEpYjWaQJ0fj5Dffw2ezlqV0eQutGjx9J8=": "748109000000", + "FCJGh-DUnLC4PTEDruxmX-0U2mXVCBf3yh4J_t3JB_w=": "407808000000", + "FD5ylj3ewxsqLWFr3tAFeiYpwnw7jZknU8JZwVrrinY=": "4006658000000", + "FDF3L5I2bA2HZF-8_IxsDT5EK9cC-lo4pAiRXTIz6vI=": "377548000000", + "FE4LmUTCrQwtyQKKBPLNO5Y3WGRGaL-CvJ7yB1whHQ0=": "384615000000", + "FEhoCz0Puy7qJrU2VJPlSytxGPJ-V4D2tJzTLUTzoAw=": "391600000000", + "FF-vx5HqowbPpEaUseM-XkDbxC_0aUbcDepgFlS5b28=": "433820000000", + "FFQ-iQ1RFZaSS5eso6HIWrrHD8y67auT8XM4O5y2qrc=": "4095970000000", + "FFmeGr5aj9fBWsDt0J18CN7Zf2UKQCZCbXPYbPSBjEU=": "1637581000000", + "FFup4VehFRaQvpaNmJIR9YU2TY1LfjbGc3EBN5MotLk=": "2237337000000", + "FG31uBP8bqZiC3beL96rfLtVXo9NVlpB8M_2M09kZ2M=": "411085000000", + "FGF-wGQHVOxdGtN7QIMlVal7IupMSjByuT1ztIZZ_wI=": "773103000000", + "FGMywFSUhhOqhI2SzPmkvfU9Eu7Hj3Un0nAB59DRI38=": "384446000000", + "FGUVR5IGurlRolQf_nbs0LlP7vs22squopWncVGH9lk=": "464091000000", + "FGfZv86XEmenIu5KWnFgfxa8c2obwFrbhlntaEePvxc=": "384615000000", + "FGy_DCRf4iIKP7BwvH1FnMgt-GGHgKF8r2paI2pQM_0=": "416666000000", + "FH-BuOfnym-8qY1PQJ4-wTRGRTnaUZaAD3WXNkXW8YA=": "1927533000000", + "FHNL714aF7_9-SDC3Tr8c_XRe5mpcO55DrDkUaol9vM=": "911518000000", + "FHP5yNCn1xtamCUnc6kGjuaBlsw63c3gfo1vtgSZHDs=": "769230000000", + "FIORNRyQvxQa3mMqbndW12LfsgYpv2dMvSYvanxAEHE=": "833757000000", + "FIVZcSgJB8dWGnu9pDJKkrjAK5PjBX8dfrU-Ixokq7I=": "1346153000000", + "FIXIGNE2XwdplFPO4G0tHXVLRKCS7pRQp0rODi5jECw=": "804008000000", + "FIdVYJ-y2vy9k9DMIYYtoJrIbnPfyxCLtS6DJMJMWo0=": "753630000000", + "FIeEFTMGI_XM55o3Hnhac-T4QSnaa0Y43uPdGWSeMHA=": "411041000000", + "FIu7AI52CryigRCI0-e9-TRZ2BIN5nBW7bvmU5643g8=": "384615000000", + "FJ-E46NA-ygnMYXUT0nNxxl0tJrU6m7f_7fW_z7OOgM=": "6570771000000", + "FJ0KZTyzO1y2SjEs-7eMB7XbBdncnQzXvjcYkn8Wocs=": "504754000000", + "FJ9K4rsfhGHyGsvXqEYPoz3pi55CCpe5oHeSqqPAl84=": "39590251000000", + "FJH1uBpcTv0C6Ecfz1glg3BZpKlSXU4tGTkKmQNnEwI=": "385510000000", + "FJmRJl5QHXLY68sMwC64wvXFsnCPlOQcpd1Y_F-uWKw=": "378488000000", + "FKObZK_VtIc1Qv7Hp5i4iieX2N0__ASbXHADYRkn0vw=": "769130000000", + "FKarwd77fjHtDO73SKFjU_MELl0LY04F56HP7WjGgtA=": "384999000000", + "FKbK2zTPKvfdYVVThiUTnpM5eb-6Fhk28ownHUoGchU=": "384615000000", + "FKrODsVMkY8BR9iQY0NJJOAevoL5GK6Qd_FN9HXBlW4=": "411613000000", + "FKzl4YHTmj3CNZTnfOeZBaiSYSFDScNdn679fWWzql8=": "648010000000", + "FLNTCXXZEmZkv66vXTAEnmNEFbHZtaeardaeVg27t1w=": "5005317000000", + "FLWGFYXCpED0uDIg1d9B1Q8DV3WyqwNTGAthzjcYB10=": "1156517000000", + "FLc55gIRordJ6BaYpKLUUKChDfWitDV8jlGuTLvOK1o=": "378090000000", + "FM7yUqL9S3c_H95B41qiOfxTp_BG7i5SFxfVxFIllUQ=": "498645000000", + "FMKnCeEjK2rW0oZ-xrA5LyZcX3kyoShliUXRSUDvy94=": "389500000000", + "FMby_LV2qg01l20to32qxC6cXYTchFZvY7oGOx7oDzo=": "1233257000000", + "FN-N-4gMb2w7UBG0O8tqkTyqMGMpFZ-x3e60W69Y7VI=": "1478846000000", + "FNRkDPzAr87NVaiW0iWAm0gu4MVXrFwl0b5Mde9_cPo=": "750727000000", + "FO-iBwUP6fAlN1_Ylo_5NWy5k5xWolqgNv7EtSDCe-w=": "2610663000000", + "FO5dN12ArN7H9HiisbHRZv8uQQHWnN0vYfvRpStTD4w=": "458136000000", + "FOeP2iZKyiJ_udAo4xb3r0lWyi-rpu1eqoEOSZ4jYcY=": "417630000000", + "FP7sSjsBGrd9O4FkDB5PHshRZgBEbd1Ip5qrdVX6bAo=": "3751727000000", + "FPFs_CedSgMq4-UUXwPr2Aak0EMnX2F0I0rGYEOCii4=": "840121000000", + "FPcFS2zpPmTWragKE-GErCJcEUS7aDieTPEtlEiM3nY=": "797258000000", + "FPhnhUbFMdU0aaoe31HiY9YAM3iQ9kJ5R_8KKOnNtQQ=": "449742000000", + "FPmFhpJJYMIh9l0dTqNVpAcupsxiidDZQvKAoJzJN_M=": "455167000000", + "FPsYgGQR_GjETuNLZj1EOX_lCHolYT8Z6sRCgSKr5d4=": "448492000000", + "FQ-VsbuD2y2y8Vo9w0S4KK5SCKhaZAqoh3EdU4H2CoM=": "1967263000000", + "FQBpOv5wQ3eJTiin1nhjMPPVMKiqE1XnMq0LkAZytts=": "455014000000", + "FQHBQ7dIPxfJsxziXekdDPMdueXF01QB_Q8tPLNyiHc=": "384850000000", + "FQSYap8ETQ4rR3M5onyMgKjGlAJndn7mmsk7VXM6iw4=": "411085000000", + "FRIFLigxYrU1rSUIqiHeYuy8PaAedBzM92rxhB-jc-I=": "1813104000000", + "FRk-CIsoJe9HTPCjlTvI2PWa0egtI7Dvxxd1G0bBKfE=": "909090000000", + "FSHCNRjTL3bJnM5hWKYnYQ3aipux_HsXAHx9ahJQ1rU=": "1923863000000", + "FSevIXNlpRDCvC1oQ7cnIKm03qari2QUFGXmdXHjPlg=": "547451000000", + "FSkAvV0GkdSA1utEqhTsgsF83FILKk2CzKSKIaihBx0=": "1249999000000", + "FTFy_VEjdPCZcl4uVVR4dDkdC3PsSnJZttVtcxSbWKQ=": "1039479000000", + "FTelF3MceG8ZLhHYHTAyhUnS8O2v7UpWo2VkkdphPQQ=": "1930305000000", + "FU9T1X92sAod9aRjmXlo3gYs2SO3WG7YKx9oHxOaAog=": "4964912000000", + "FV2e9gHXxxQ3EibM81LUNiy4ps2Mb_bRrBL98a9YS9Q=": "382011000000", + "FVC0qqB0vfxxJRFJPrlg8unbALLAmfyk8cMAeBwhIPI=": "459969000000", + "FVGvMntQaeRaTchNHlkSDbw0MQffVbNpUsZEDE_xGaw=": "1864409000000", + "FWGJzGOCOnvZy7G4h8IV_IFs_09JY9yrW4oiHZQYrJE=": "381839000000", + "FWQgSmYi9FAO-56c-HUGXqGdB6QEE9Yh3xNVzcS5Pvo=": "426375000000", + "FWX7JMXNt1rdw8DaT2DhqCrSzkBB_AIS9FpeJ0KfYn8=": "417846000000", + "FWmJ0_1W-bj4VkEWXmt5rZ9Rcx0oKH5-5ZOZrxFtPdQ=": "473228000000", + "FXAMJPFwSR6vqjs6bsUuTbxeUtU-myshbobRDrkFuKA=": "423370000000", + "FXQUBFLWHjVv-ul-11MwJ0Qz6_aplCLBbOhf9HAgJSw=": "1666666000000", + "FXqDILmL2T8SrNNziqSunHA4u2ubyzyXSHNtvPuU68o=": "385506000000", + "FZjLQLf9DYjucH-t6VrG6IpwdsvyW9U6sxBtC3C6dZk=": "391659000000", + "F_2brH8Gcpp1vq3cVoJ5Qzk0MlHWWwvzngdVwyBzKqw=": "454545000000", + "F_GnB6FAjhVs_flPlCseV-rU155Vjs6g6IicK-mh6wM=": "456812000000", + "F_OwPzTIVIdBFKr_CdrGU5o3PLPuozf10m-1GRO6B7E=": "5769230000000", + "F_utVSWb05sNineVa8SKOK2RjAriutBIjeOH0R7Bvoo=": "384615000000", + "Fa5PMjDETcSLQE0D2fr1kE8aMHnglbONmCgcbqEOWTo=": "384615000000", + "Fa6o6hyLJh6ASA7eYhcHlyO4k7KcPXuNArr8dx5zQfg=": "909090000000", + "FaE5ED151lNMLW1zGFHD2BxNPVakWwGHaEF7wHrBsEA=": "413740000000", + "FalgQKBsxDRVEmkKDt6s7r-WpBcxhGFfs6_I7ADmeTU=": "406308000000", + "FbSijDe6WvbG9oQl2DfAnM0JH-QuDY1MBmcJ7AYmnmI=": "381360000000", + "FbbQ6kGbH_aL6F8Ze7oD26Dhb3G1Eq6gnkaX7xgG1qI=": "423262000000", + "FbjXXzvlbjAPQbmMe2Vpe-JMGA5vFP1H0ZbDOeVtFEk=": "542442000000", + "FbyYUGRRJcqHXkjyVABaiHnROrZb78umVjcJCa0-_l8=": "473331000000", + "Fc69_asNW0KItbWS9Q8mI3l9RnoTBsPMwEHHMnWcgv4=": "1144048000000", + "FceMRU25aZ5YwCgZF3UGef_Si4rh8LK5mjQ3mXYR4hM=": "417423000000", + "Fd-dko18YsdMEMulej8IKA3xsZAw-wa-LtihTcAWc8c=": "447411000000", + "Fd5H0eGoTjo0yqL5w5Jz8-bYM4gdVqNUGPVJ0Y4s2Jk=": "8461538000000", + "FdVoO4ruTPaE_mDpOkrQ_KvOxkzfOz3B9TZwSVqOqUQ=": "769230000000", + "Fe-4GSAMB31QC3rTfiqCRbS3QMP9jOHb3JYG3mI3gnw=": "2071066000000", + "Fe6L00xPPDZNFrNbAzv25LpO9T2C9cjtMsURP74Z3XU=": "465144000000", + "FeCeKwVznodPYQxx67M4ngo3JZLmmzR0S5crPNECDUQ=": "416351000000", + "Fea0RQ7yI0q-8GpCs4yNFvF16RrBCxf0SUEbUyElH6Y=": "385528000000", + "FegJ5_pjSW1Uz9qlt28uN6aDm_4ScTRY7fqMQmvPLSw=": "480295000000", + "Fex8G3_-C0UdkJnipzW7FxPOIFz37pVJA5_hyDa7VVs=": "912956000000", + "FfO_Mro_IAmrGkHgbIw_X4YnrJoq4w_PC-Ohem7w-Ak=": "846736000000", + "FfcgnCc9OM6Vz3eSfnygiEWDI0Xc1Y-RCnwbLrAVDfE=": "453414000000", + "FgDB-IuZk9yDm3G-Hayt2z7UNRnFj2B110dzilZI-yk=": "769230000000", + "FgsAOP3RBwmddG-aMu3oPt-AZppFhX9Fqc-Bzut4z_A=": "2436983000000", + "FhLhkxchxAcHmfFYnUAbUFb51g6pZ-8caCz-Wd5nMII=": "382943000000", + "FhQUOnWVmF-WalARPTWVoCLS7fDczKQU5SDUIqKwf6c=": "644862000000", + "FhRhXNTrvqg-FuDJNQXZwb-msZEm4abciwdffTbm54E=": "384314000000", + "FjQdxlyg7_dU52LdTh5aoa3GOMZm7ChXtt6Jmwriufc=": "763607000000", + "FjeMcwctO4rtfHGCXTbnbs9ALEv-9oAvd5m9LLokZlw=": "654571000000", + "FjeQj8YSDp5HaY5yHI0PFo8PedEK-JranmPsuXnWHo8=": "423710000000", + "Fk0nVDkGiyhyZFISG6E7-NwklRO3mwp--WCLCl6Kn6o=": "895163000000", + "Fkb8bgpj50vkuQXSyy18xD_uP2P1sohRWlZ5EGneoqs=": "562499000000", + "Fknyf5Q9lgU9_ChXBwqppHLES1b7ztAEDRlvvve1LHM=": "1265782000000", + "FktSEiYdLElPVqDXrXVI3nto7nuQLvkfYsgbXLoiyB0=": "1655352000000", + "Fkvn_-XkAI-kGoSYlswwSQXtFrr1hTgW-tzj3HSyDvY=": "1386434000000", + "Fl1AIib2-QW_5B0Et2pPTYLmdoaiJ5sKdOJPFE15Cm8=": "2322934000000", + "Fl1CZSvP3pm3Q7Yb_VWMJtsUHxVaf0pRBCklKu63RK4=": "407233000000", + "FmDtwRnkKkFsHhfSVoImTTvCkcag10LQkOhwzWhLbiM=": "456476000000", + "FmWYTSrBowZrA51U1WQwjdjiu41rZON8jWDe1IyJls8=": "387559000000", + "FmYbbW_0nI7c72UPSdKaqDWak_kwkYPwDoLHxNFSHIA=": "391673000000", + "FmdABC1oU1GrQmMi-G9WXuBLGaBw_Vcd6PntWbT9Cmw=": "379344000000", + "FnTyN0ykaiuwPkYQrCOSQ0VhR1zsSI0gJipzXrPj1dY=": "389217000000", + "Fnoqp1HL5YBCdMmDcw1HmmT-P9ndbnNwYfxo5bt3p_w=": "986817000000", + "FoVI5ZOfGa-xBwL7reZLp2joGVSG6UEPJM7Ck83EoDM=": "450657000000", + "Foatc0b4DLycyjWEHrZVxynTniQDNyRxy-QWlzJ90A4=": "6730769000000", + "FpM1o5qNDPELRj7TsJDgg1_NC9OX9p8r9pAdyO6RG4o=": "16449426000000", + "FplW6NFtu0ZGFiVhi3Kctxywy7iDXLMH9P_1lJImqVo=": "450392000000", + "Fq4u8-v1sj2lf5W5IlLOHuSpx3CJXXiRH7gJgRpApyI=": "3896800000000", + "FqjddAv0ZqupGourv4GM7wMmY8aLRHAA6dLEDenbObM=": "421855000000", + "Fqq9xRRKhCUpk4PYTXfrvF4sNTQ6QPGf73usc4BOy7A=": "382479000000", + "FqzbAIZ6jYFEPlqv0Irl_kUj9yqCOPNT1KMdszPKIvw=": "357996000000", + "Fr0wlF8o6G1DlQT0x-SetvFWw7cEimeD245P6grQKxU=": "384545000000", + "FrAmWPkurqMEy2auFZHUwrJ1CuOUNT_ytQGnixMcfN4=": "406805000000", + "Fs-6nSUen7gb8REgmyEywaaO3e7_uNOU-bTaYthG9d0=": "13653449000000", + "FsG2zmXECpxDFGYiDLRp6V8S3I_8DpTppcZQZE3aRkw=": "3599634000000", + "FsS2Dgegy3-n_hYEvbSNf6RT4NbDUTDCCgHJgnzdJLw=": "16778374000000", + "FtEGkiKjiFT5JlplXUydNYMnAeVTrvgfmEuSX18y2Ok=": "457970000000", + "FtGN0ucJFo7VdBblsF2E34buaTbSbSI8ic3MdsUQHZc=": "454545000000", + "Fu7u-3s_mHpT9J1rfya5VnKlqL4DXfW6cXT73c9VlsM=": "769339000000", + "Fu7xc6ihY8L4nmKPhr3GRRizUH76P_mdpsbdJ-zQCOs=": "932527000000", + "FuCUuqeTZ3MkG0Higrcq4PWHdlR0Xx-3FG-irBZOGQE=": "470390000000", + "FuIQ1oQpFGYtLngitrJ07dDdvB2etm5vqRk2M3LrbcQ=": "385507000000", + "FuPm0kXMYVbvfhvRclRCXslAvKgVjbEQ-9pQfMTBxbY=": "7924235000000", + "Fun3ECwiE89W1oDb_zTKak65EAiy308tVmxg6pSviQ8=": "1223425000000", + "FvMz0S3eUiEHFRVXUbSeZx7VLFgnweXzTmBvucrvzjU=": "384106000000", + "FvSTZwYewYroeQvqkuH0ng6NerD4AghoxyijUxx0uEk=": "12599323000000", + "FvV47aa3b-zICWTYsIh69zogrFqD3hzPrMjYA02roiQ=": "406640000000", + "FvZvD9jQEx3AXFQS89oh2OlCEpBj27isQemunktSec0=": "455728000000", + "Fvdoi_mbyndKtF7WcqYLyD8mMVhEfaWv0YezgNKt6N8=": "18749999000000", + "FvfOkBSCCKYP1Z-B9bpxaUSDyJE_FC_kFuMH8eJ43PE=": "6653846000000", + "Fw3Ox_Xl3X1EU0rx2eERJp3M-yJ1p3DlFAAeh5eGnFU=": "1128540000000", + "Fw75L62XpOUdRh4vJiPhg9Z2e1bYXz8LIJYC4VhaGtg=": "393240000000", + "Fw8N_FRTQtB6Wm4O0EG55dO0jL287lToDsMVq_V2wDs=": "385507000000", + "FwdIw80dqOddURoh2b4nVuShN2KGEfPuNTQOVstRL1g=": "827094000000", + "FxgeAjbzxZiVLctZ8y6fRMwkwKXy3sYlUTg2Km0sdco=": "386978000000", + "Fxqv0LwSRIT5r_mAhRSuE7qA7CVa_5rciBPxYCDp7SE=": "4070461000000", + "Fxs0gRKyMhFnzGyWBYT7721lIR8Ek3d8Vu1j2akmXQc=": "3214264000000", + "Fxwucbw2rHmNKVYuBuvO5o_9om4McjX2FdclV8vISK0=": "377272000000", + "FyKdhxXy7Ixlxguufvd0KHIDM2eHwYp2Hz99G9q-kSc=": "5000299000000", + "Fz-d1M0NbZEkZN5AXXp2VBHZvBxCac3MJk1kKJsD1Hk=": "634433000000", + "FzAPUIT-puYhhmvQUWbpT_w_NA5ZnsaqSgu4UHmAAmc=": "3235350000000", + "FzC-A7pjJQmK8yAGgXcuLLCqHGNTKrcEDDJxj936u7w=": "451692000000", + "FzI9fnb0UIrMs-Hn0hGMz9_xWSR61HmdwhmxWnQCT-8=": "1859734000000", + "FzRAfKeM-b6df7nCgDQzm1I-OS_7QzC0MCswtMRenE4=": "446166000000", + "G-LkpqfrKmRwNyFN_GiQKauQhgUbX0bNYaRWMi_dn4k=": "405848000000", + "G-aXoF8Q2DooxceJPt_750jEQkb4fUxJYFfUAuI6zl4=": "385614000000", + "G0I9EPVRdDaHKa5j5PDc7vqcp71IZNLBJwzUvmhTrX0=": "1156518000000", + "G0Tw5mKZd6vEWujkx0_6RHpd0cxfcNdMV91DeP6cfTw=": "4593684000000", + "G0lEdEOknnFddp3_shum7A3J_eJcB40x_4EWcaEdVcI=": "3664096000000", + "G0qh95E2EXYQQhCctCFSgzGgCiwUJD5Oy8tkm4IrktY=": "909872000000", + "G11DayhiUdP0nX-vzz5rPyQMLEBPYN5s4y1NSOnEvvA=": "462476000000", + "G2-KD2CmTH2Gt_vgI8E4ZnwBr-WliDqWsB09hGLwOSM=": "2316299000000", + "G25Xgyt9qzTtALJijWBAw9IYxG9YlZVUm2tpHhNLZWA=": "780282000000", + "G2LsRAb-HcIhZC59gYI-slO_nrLdyfBmV3t2bpYS0RE=": "384615000000", + "G2anV00Ho9mA5epJAY_gsCzV-T1jMk-QcZvOV_PAkTQ=": "388842000000", + "G344eccOtYB3E9nKW88biQRXlgIIfvqYmIkHdHrd-qQ=": "691338000000", + "G3LsI2FTTRIs9GTmEsiAvWQC373P-VT2bJUaQlJhqqU=": "931276000000", + "G3QnSS1j7zRTfGe7O5MW7QVTOX3DNZShDSXVQV7dVKE=": "2919265000000", + "G3Rrn4VG41huwXyrx5fRiGOJvNGLyHKmLHpeBe4Cevk=": "825384000000", + "G3l7E2DX21neW8lAXukT9y6p6I7K9YzjjyXyb2ZO_Ng=": "518627000000", + "G4CCS4Twt2gAiMmuBpIa7Fvl08PA60R94Pa1DamjJ9E=": "3976506000000", + "G4VAuUownQ-fwFVXRFc00aRL-Y9Uj3ECXZfVYa7jjMk=": "894531000000", + "G4f0GqQhWgVhCC3wH9ruVXewKuTAPQ-AjJ8sJDrqqI0=": "833333000000", + "G4ux7WK-FAo-9BG38440h-myWobg_svUd6_N7NChwig=": "416662000000", + "G52YqjXarLVJmGBxoSS6XNhOjnzQNnLPNhIZWYl3OyA=": "384615000000", + "G58McO9PNH5Rdi42pBABcGLm6elqoSqYptnuCTSvoIM=": "384615000000", + "G5KT7Nfax76PPE-kxfph0V-mXshd_s67XgDdCIvQBvM=": "4023868000000", + "G6PSGn33ovaRUQWYX8nBKec9g4zEiIS7i-K8kYPPKiE=": "386372000000", + "G72NVML-SENxb_dJzKX2NSenP7iM1gLkwQE9UcA7m-Y=": "385528000000", + "G7OIA_WFuIiTab2tB2kbViRk9xeglKqBQBe72Rnc0VE=": "454031000000", + "G7R8vgaEr_U_78hnNMBE0DwYQYjrhip6cqCSC9-LR2U=": "769230000000", + "G7_JIjrwRfmF17sVZbxf6ApMw5XC1G6YbFQEIsbA8uc=": "767159000000", + "G7hurtkvH_5Tkskj-p655WV3YQ6opJ0PralVVycsVww=": "450040000000", + "G7zYgp2knXefi1rBrr7Aa90t7dLKvGpYifOm0YbfNgQ=": "381805000000", + "G8JhGaQOjoqkOCmuvkNsasakiiU32hnJ7TvdB9XXq0g=": "582471000000", + "G8LNhrS23gt7vBdgjyXuc8J1EirCSaQ7u19zfAD-Kxs=": "3646531000000", + "G8Uan9esg4GRBoJU2553CCbl5efAQkhc8m85SgcFODA=": "377667000000", + "G8XPQgiGY1c-QXyuSFmVxR7Ggawpr_ewLxaHZYfPMX4=": "400435000000", + "G8boOoZvy-_9KUCc9d5q2Ffk0QdkpzXqzO0_pTeMZnM=": "413738000000", + "G8gbz1G5DBC2kaLdsrXoY-YTHZARbAzSk2Wr2DDn4OI=": "416753000000", + "G8se4T41apOLtnyP7bQzNS9jen7U-jRLPwYLBpUKMow=": "3846251000000", + "G9-vYfpF8fTMtVDK-kYLQCB4p0egAGJb3d7h9k-qHNk=": "387561000000", + "G91CfQ_wdt_WtKRFmxjkkdeWoD6hTwnWFH850g23Rcg=": "393443000000", + "G91ao5O0mpBw2I_EBAZmoJXfBF2A2WifH9M4QMPpUEo=": "481965000000", + "G98grCrFhZJaWROUp_Nos2n7fnrWAn3h48OZhfuPEBo=": "382226000000", + "G9A5c8n5FXsrSfofKoxwI8PyTbqEF5ZRkuILwr9KumM=": "415350000000", + "G9lvoCJhtW_CMOvkOzh8-z4MAkL22zuwysTl0b4Bsqo=": "1252901000000", + "GA6GK9zHWPWMkQFGjkV3L2zZVF-oL_uNA7yEzGa2Te4=": "384615000000", + "GA9E9oBB01PI04ptqZexv4HZ7Tsrz55nx3sIP3fd9sI=": "2255279000000", + "GAOoTgKxRbBxjrCDiu1S6RxDFC0Lop40fk9smYhlcgQ=": "769230000000", + "GATExbZ-b0wErsu7yrK5t7__FsCVfpQgSQ1z4YLO7r4=": "469885000000", + "GAZhcJ0hD8oYGcXlYdqpPBTKGZ7QzqRvQXkEPj1CII8=": "416071000000", + "GAbqPZG_XyRFQDyg0D8txUU4ykcCwjPeNXa9Zk-7xfs=": "690652000000", + "GAjAF-WXiTlLfwIMmIee3KNVI4O5uutLonribqZIP7o=": "453003000000", + "GB0Je8fWMiLLKAULHvI85F7yhcykHYSopm90LhdKmT8=": "379329000000", + "GBH5bKVCKXkYrPO7QBQa59p0jWvzyeOeiWGgGXhoBaI=": "1159416000000", + "GBKRBj0-tzpCjY1b0ApoXqgtPyh2GzjmnI_qHydOSkU=": "6289089000000", + "GBXT9sI4ozlo3PGdg-WrDz2k1qRFzyiHF9yp1Jscv74=": "3760252000000", + "GChNHcSRUsE_dinYV0iRBlj_xui8dZ5KAQvCijNnvuc=": "4999999000000", + "GD0xe4Utf6-T8BBuOQGyvezon3Ly8gkHM4WbhvbKp-E=": "416666000000", + "GDRJBWd_BIpk4tua84NPGT-tzca510GdsTVh3NXG_TY=": "1872772000000", + "GEWRS1gCQV6zVqec6YXijrklMnQdINpW8pxhwuts9Sg=": "834537000000", + "GEyH72hmM5VfW49vC2QUDiwJpPZREIOpgC-V6a2fia4=": "384615000000", + "GF87SGtXgMilRzu1pBIJMiu6APaEo3imQk_XAHozMhE=": "2018416000000", + "GG1BydE_RUYtmUGZ_WwKfNm9dhZAACTEgWy75rbm5hY=": "769230000000", + "GGInUc7lO_wNLAwhAm9ZJRKOm25HVb0rHUd7s6zoHSk=": "1846153000000", + "GGbU0JpOQVGbqCLqlWEU-LKz0x7D5yFlCiO5KGvKetU=": "407808000000", + "GGnac2LXn-Zoacu0OHlnJczJIZTE3eOdpLtOMNHX8j4=": "521709000000", + "GIPnGJHVvv-9oFgcSHBLOZgFgmGPzCMNYdgN4S_CI88=": "473001000000", + "GIPyTfWveLFik-a5km1F7HaQHVZk8Y_ykIY5zEIfk_I=": "383550000000", + "GIy6sNiWTOdgtfamWgfhdcnu9kjfsWG0vRmLqJfsSNY=": "364116000000", + "GJ6GerJLJdW04l9KBSJLQeY5Wunv8ToS4xhNETcL3Aw=": "381802000000", + "GJ9hgf8zgTcw2D29jvy0B7wWu4zNfpgirWaRAnS1u90=": "377845000000", + "GJAYkOqar75PYlEL1lrqDKpkRmihjtGc831xtT21WYk=": "416666000000", + "GJX8-437NvsbPd_5BGOBsuoTTjffE-ssl6M6522Dpas=": "381497000000", + "GJZhrhprtaLRl1RTn7WmoKCXzDpKn3OJdnKfB6HH5Mk=": "384452000000", + "GJjLr1hqqGO8Q9rEZKoPB0bwi0Xrw1aWO11TuBSUof4=": "384079000000", + "GL6wnwq5bilr6LXR3j8OVwHeDoR0wJE9uyHmoNF7vXY=": "411085000000", + "GLKBAxlE3zQ4VRowqFPdWaPNTnKOAVAI_kjEzYeMyj4=": "458399000000", + "GLUek0eZDkA_XMXLkdr5Jx31hfZUewXbEd72WX3uTUQ=": "818181000000", + "GLtdTV89RpaKah5qrJ_VpKF6eML3n4-S47U0zcJjZ4g=": "832946000000", + "GMFfIVJdU0_1tOWq6pY4Nn_h9MuS7S6fY3MJDvworBY=": "2590872000000", + "GMh9EN1aatmaH9fKfY9TfQ8NAzQGfDaLIzTWS6UU_9U=": "386870000000", + "GN68CChjq2jh-tKjqbSfHqVe0mlpys4bYH6DlCj8YM0=": "833333000000", + "GNEfZX-xIoA1cTZeb_4lP6Ab4JU52MF0aM-UzoAydZ8=": "384242000000", + "GNdSrZkJPcpOWph7Z0GIqLX4T_bLqIVSo7UYfu3_JRo=": "384976000000", + "GO80aAv26FECHw6ToDAEbMv87b_6Gq9lfLoGWJc_ggU=": "2157676000000", + "GOcNI-KQfK3LstODHCzyr0EPjmsvzRG2s-pdfxtEX7w=": "421134000000", + "GP6oDZX9LsLSxoQwCgipm9ivycv4PoT_9Ysv26c0noU=": "2272727000000", + "GP7vIrFLQmTK-0ya_7V2tWwF876XwMLP2O4yHycb2c4=": "1191644000000", + "GPrEfpWqmzIMitTREjsnaxo9YrntnIQN23VX5h0SuNU=": "480520000000", + "GQ0fXd205BV5A7JNB64GTQ5pp891CSxibDiMcvpn2G0=": "384372000000", + "GQ96YFIG-CXAbY4OELUUkVKGZ6in2HLf6UxHefuJ0Co=": "4149998000000", + "GQNqMQEU5-kLg60k6naZhQ-HzbkCZ8ESULiB0Cabnok=": "382720000000", + "GR6XcYp4fdmsUTyv5IodxxbpJoAz2CpdQ5umPwSNZxc=": "7692307000000", + "GRKcpUNSz1I2Y0RQv9OXPRsOeFpzMotKD63Okn2e5KI=": "1538461000000", + "GRV-ucwcV5qAUDEppr15965sKTnVaZ7jpUF7Zicbv4c=": "4553672000000", + "GRYWu-1hryeBNUXhDCG3srpZh6wuAYIR4qPM1ZE82RU=": "379928000000", + "GRmgKcIFWPy1pKSOV-qmQ7PJOjSUwwac7npsYyZvWNI=": "1156520000000", + "GSEMo4gaack-Kef6AhEDdIH-HQGbqwza3A7xW_DnD0I=": "504461000000", + "GSelTIY6SBoVHiqG3yK6_AMo0WYBq6s5PmWjxyie5Lo=": "1862771000000", + "GSh4GBVSgUJZrKIIIZRbvFKG_ZjgNM0X_nslDgHIIiQ=": "408021000000", + "GSzFBH2y7XUhwvf-28jgxa7j_oq1eXJzoE-jRm4hSOk=": "883752000000", + "GTUnA_Grln1QbedAYVPmKJHUafHqiQ-nKzSW57aw-uU=": "473366000000", + "GTfJH23WtlS0ABIcjHX9q39JTfNsFK_Kj8yz74q3Z3k=": "464704000000", + "GTnZlSWEXtE3bWdnz5BGzk__JuFRipFOLdtU-XeoOE8=": "762293000000", + "GTuoDHyFuVh-Bkn-WMzmb_wI6lgO8jhiEAQLsk4CdJM=": "12243737000000", + "GUiOfmuAcFvjRofr-dfAzsjeUUfEhDnhyp5o9d-aFCg=": "381805000000", + "GV-aR7cSL9Zk6iEEwpDRzg-KEzKHLF5NBCPn3ud6p_c=": "501897000000", + "GVKoiEluG5i5Heag0c6h39ot9NYEFkvo7B41C2uYdLU=": "4024342000000", + "GVQZbdgt-4MpuTuld8TjqDQIwsFZe-gxWbzzXp8K_is=": "417630000000", + "GVcrsIoajV7MgwP30_BpWsU69ANrqjKnrcNtd6a8F_k=": "504471000000", + "GW103odc5FGSDSNJjUS_q1F5gqatJVfCYJtT5M8jOYk=": "386608000000", + "GW1HJSF-SmSLRAmdP-wWjDLDNlsX_p4QkFk2Z_ZHNLs=": "470073000000", + "GWHcLwX67S0Beacs8kvqIwV09GLO_IghzinSG9DIiQs=": "482633000000", + "GX8kxuf6nFNx-SS7v88bLvNv4tZBZQ_sm06ib9hKHRk=": "2253376000000", + "GXEqpSj8ACsr8DMhdPV2iZ_ipK2nsUbqLsKVf7OGE_E=": "384615000000", + "GXZK0FRmSrDT2Mt34Bi5L-1OgUaHaoBKiATny5PCjm8=": "384615000000", + "GYSJmvEI1SkJnrEXYdgwHDKn5i4jWDDeAWtdXVYUgSw=": "465309000000", + "GYSjHgg97qJo2qFVK4VdAdgf6pMFR3695dBV8FzQzuY=": "4516088000000", + "GYT8j1DRwu4667ZBQSwjVc0swLykOlRr0yE5PI0yaAw=": "1153846000000", + "GYX7Nb6-dxfcLcaidNqQ5YkTlJQJyyWUyxZnbI-I04A=": "405846000000", + "GY_Uubh1kurHJf81A77N6ur8JtjLq4rNoJalXAsJDlQ=": "454545000000", + "GYj7253qmuahEzg3suqRxKQ0DFgupZPaU3YS49khNvM=": "1249999000000", + "GYmxDqv96B224EHzGwOQmV3NPxaLjMErmgm6YAsXvBo=": "544142000000", + "GYv12w5NyPje0dfVDxNONivx_CyshWrdcbSZN2Te7Lc=": "4627463000000", + "GZ2Xjl1p6iSwOef5mMmgcSBTIRoYcAP9vkKxOGbQGTM=": "1625868000000", + "GZ9reXVBvO5hBM37eqESfitnM9zcgkad54S5-WoGCKE=": "457277000000", + "GZJ0SjU91_dQsofWsS7Tyr9ZidHMYukd6WSsydbGzjQ=": "2045374000000", + "GZe-q1PdoMedazEowVCQ4o445pvx3G__aIRK2tWUSJI=": "385507000000", + "GZevXO7a5fu0JspsLHthczNwyXgKjRY5NST62tj5MT4=": "769230000000", + "GZmKlrlhU4TKvLYVQr0K9wyUbrRryNRvdopy-zs2xtE=": "4866611000000", + "GZzBFgH4yhBaBIX4BhpdMGSyXTgQKwwgJb2TD3om040=": "858310000000", + "G_HLG5rzvx_ALU3valsYT7mSU3cQYAteEoMHlEOCFYw=": "1538461000000", + "G_RHCPCGBAo5CUrQLfBp8iuWAqd8bNF-MuXP9gA16lo=": "469846000000", + "G_SvirTkML8oOMUhq2nlxLNVrJmMrtAbUFFYEwHxI4o=": "381836000000", + "G_Va11qAI9LougucogH8FIXZnI8brJzpspvX9QpALFA=": "424715000000", + "GacbYJij3l_FWQBWOJbO4n6Y758dSgp5SE2VGezOpuA=": "461801000000", + "GbTKKFQZMOhYzJoUYn2vyDkGBwWTvJEfRqJXS4NsiN8=": "406308000000", + "Gbb4k_q9doHFOzn37aYk-bsjMOznv1tMrOKr2cKCHaU=": "421993000000", + "Gbg7gAtxCX3UAml9p34cBIVV3K57_6vS1RHlffKWzRE=": "380716000000", + "GcWaktxM4_RIJ9ya8FgDS-_R6X7um9wMB59ae83JrA0=": "1233257000000", + "GcfwRDmhNyTvHTbBGL7D4Emr2wtgK3MOjGhSADAn8wc=": "19894257000000", + "GcmlRJM7UW3ki3IwkYyW_WTcGc-aIpoxODdbzwYpqxo=": "455600000000", + "Gcps1T3uYpcxPyo_MoNOW7JbTyOqPP0rGDgOjpqGYZw=": "416501000000", + "GdaC7-Taf_yx807CHEn6p97nsjeBYEdKub4B9Cj_Z14=": "3763933000000", + "Gdo_3Av2C70_PtzpMQJIRPlT-AnU5uavUiPVqySIoGg=": "28578454000000", + "GdyMIz3D7SC9YUa6qJ8m-4GBfgJ1Ltz_Z1S6kwy8gkY=": "1924102000000", + "GdzO1HwItqXBC4QdrgI-hUjXTEtPDe0sbWDHjiQtOr4=": "454231000000", + "GeAS3cuRYenf8sVqu8o56Q-nOKnVUTAKc7o30EdDCKc=": "469310000000", + "GeNTBiJWfThSQv9rIdCUSVhK2JwpOp_t5krzCkDbTYs=": "384615000000", + "GeSj82pYY25MH3vJYeBSr2IALiODAkXbJR1Pd3r4eGQ=": "543209000000", + "GeV-J6ygUKuCKt4AbGaIl2jdUMOFhnsS7qC6fkC67gg=": "376944000000", + "Gf6RxKllO_VDXHxoc73a2hPNpCkBLH6I3xCKpYJbWU0=": "727272000000", + "GfGw7MDu2EWSZS2C0M8awyiMPhz7dw9o6mdoxABsz08=": "1223425000000", + "GfZJ3dP8GI4KxPn5F95g1JDIhZcB-b6Iq0KimztiuVc=": "456230000000", + "Gfzs7JYTHtbHFvqs4kCQ4zZHbpkbtNtEVupgccScBhc=": "932184000000", + "GgJLmTMT-ukd0UcoMEXPn6wdltI2JznAx1JNQ2_yrxU=": "4166666000000", + "GgSF-_sMUFV3HfygmcPx9ffNriDCl0XN0CeYyTgP3Xc=": "2304270000000", + "GgeqhEkgSslcIrYra0-V6B3Ew9LdzaRX9SIX-CYOvnU=": "464104000000", + "Gh1Kicf4ypvNnmBFl656_Jm7zgJimNYClYRtLJIx0HA=": "7710216000000", + "GhAZ6GLWi6hWYJORVx10TF5eDPfqjUD_LaibPFggYs8=": "2074744000000", + "Ghy_ydlyEWPve7-zCcZoFAmxFo-5vK6Us-1QkmvCpSc=": "38461538000000", + "GjCzU3W4Z9IYfrLWPki8e757FbB0R8XzmnrJnyJo7sQ=": "1382564000000", + "GjJCAR9XvUSdworS1UMOOmyNJhmVVFEyKJAfiYgEIdQ=": "382394000000", + "GjRPcvYJzziXXTT3sS6aLHcokwiq--iio7kxZRZi44s=": "1893120000000", + "GjZYRgXcMlur36Jwzy45pZxuz3qBC09XzSSwlUgdh64=": "407692000000", + "GkAkPTavuKPtq3IwTMagf0Xp6lzhLM0uTbKUeHfc-sE=": "382394000000", + "GkGh3vCQYZVmXZGIuwYJ0fcCTP_pLIN0sk5dAdbohaE=": "3846153000000", + "GkUQuW9blvyhuN81GJFOZwkzirnctEjGcueH53gJ8DA=": "911024000000", + "GlXkci1IFB1vtIJEdZkUf4VKpP6hie6msnrrUYJNLsw=": "1880792000000", + "Gl_jccj7t7lIRgDU2fKQVppai5N2op6KJyM8CA3blj0=": "500286000000", + "Gln7iaMWJluVxe7C-dMJTfsDuV30NzFGelEff7gSsUY=": "908755000000", + "Glu59I45xWNEG-KmNcD14oiqyKA_hdG6rMxZVN0tso4=": "423710000000", + "GlwsvjUEIOeubG4jC9VrtYu61nvoBLiKbXqY0hnBQzo=": "4110858000000", + "Glwt4yQ_aenARYOuDuXVbT6D-P8RVfWcuXW_JX8RQOk=": "525627000000", + "GmXsgbBgVnd9r0Spe5rum0rVJd7O3ZNPWybJylNwbhM=": "383818000000", + "GmwIfouCB532uwIewZasDzRMH3xixDt0E8JsTxawITg=": "4633507000000", + "Gn4zPw6CFsaKa9shDJad7f4MRiSkC-aSWBH5vnBLeR0=": "499999000000", + "GnAaNYbrD9dPtDw-7S6e7xb2aIU4rtIiCi82hk9qU2Y=": "824028000000", + "GnuwpvBFzGJPSFJZCyLUvUF8317VdxEo6kidrJyZlS8=": "3982292000000", + "GnyC_av05GR6W9DkNu-1wGdEZD_PQ1OHj9OZWjs2FUc=": "367173000000", + "Go-C4sm8EDwCoo16GX0HvOUKx6X0L8B5v4j4QBk89es=": "3378050000000", + "Go9nMRmMchOFJ75PHyDRfAuTmp1xhIiiKexWHy35EWI=": "852806000000", + "GoaYAQpCJiOjt9ZgWpCDwpZz2Wlj-39xGawvWvI94jo=": "1927533000000", + "GokJdWXYxo9vapug2C3fcvE19NgRB6Mhb-5WZKsi4WU=": "383980000000", + "Goqw4D8yurMO9KdbPCCHPB9tKjtGAtwebJRDvhxzZ7c=": "1139749000000", + "GpU-N7lTWvaMYV6niPL7rtIFgDz6dxn1S0e7EzHYCYY=": "461152000000", + "GqDHuApiti6Gyz3nZNFG1wKC9GfI3Y_X84GAr09lP2M=": "741784000000", + "GqPi5rhegDhQYDmhlGL6d2y1iPzIhkeuch4HPwHL25M=": "451355000000", + "GqZwcFZpczmitsEB3viz3ytCTlKlMLrfVFO6B552hKU=": "839717000000", + "GqjphsluSOXeq8y0pIcVee-kybKnYFt1AlyCEDbxrAQ=": "462146000000", + "Gqxk1KO3xARSr0hhPJ0gNXmzZ-c3o2VrJ9xbryJHKo8=": "466542000000", + "GrDcG2kLI-JkP6gkHQQZlkclGZnDYybIz3BZyKfUF8I=": "1919473000000", + "GrSBEVqXHhag4Qz1u8nMpoBIA3EnBh0PdBWP9yu0fDA=": "385011000000", + "GrqatzZT-fQSlxES5LoN3OTYDIeERrTNtfSF9awUicg=": "909090000000", + "GsTuAviHRQD8oUiMEsVzDBXM7mJhZ57jbhW7U5_8zI4=": "833321000000", + "Gs_Lym2ZgTYAEWp5beNWdl-aM_nVct0h_zv6yDh5lBc=": "384583000000", + "GsatSlwUKGocQGUZeQILj8jbSVPDYYCQi9GpOryUNvg=": "706351000000", + "Gsj5PalDKBEtra32c-M51yV0YI8sM7fiWFima1W1Lyg=": "1684921000000", + "GthvJarzDcYqjlMFLmJKbl3QZLpSm-i-KcfnF80MA5E=": "958399000000", + "GuKLrJWCmG9nhqxnclyKdaKE2vhf2XpeTTzceqn42bQ=": "388357000000", + "Gv54fnPFpi69uE6zXi11kaMwu53KohwzSZYXVLTae-Q=": "906947000000", + "Gwu0N7D-TB57xB8r_ftW6RY4hGqHd2PDAVkhpxZAlss=": "378034000000", + "Gx9TE5PbsvP5iNVac2lB7XD5B-_ghPeWSqAj-uqEjxw=": "1715429000000", + "GxC9IIDrfu7wZUhjkjzdMpF7r3xFf8iLccVB9tm4HJM=": "451739000000", + "GxHhDcgOv5CmTI1aJIN3Sicx0Sn4gH9f0jShklGAvsU=": "1621596000000", + "Gy23stwiGXaZNhDwQCjevjRqE0F_S4VGKvhZFv1p1fM=": "1941362000000", + "GyBgU4LnAhk29RUgneBGuyk51oModFhIXD9xt-2wTQ4=": "1578238000000", + "GyILg7bvplFLv8Q5CZr88aLKW9piXG14u7Xgc0I142g=": "3137080000000", + "Gyvu88zV47bJV-3TbTdM6KbIb-gkdYTIS4PM_RTdgpE=": "413977000000", + "GzK1ltYxs-gG0gHCes0CvVl_aZm2Ut_ZGBMOWr3jOfw=": "380485000000", + "H--EBNOh0GKhP7UifjfPkOVNp9uZSSHAHFq66wthNRU=": "2272735000000", + "H-ysyhIEGxuyv-qiA6xnjJkc0ILE-_HQwTS1YEPYqFY=": "387033000000", + "H0IOMld3nupjA7xYyH29iOdenkmk-IcDfHgF_M_n7_4=": "579779000000", + "H0K1UbatI0QxqhTkcyzIlhJlvl1IG3C1eMLIKB38hEA=": "1153846000000", + "H0aufDSDD5_1KbgB8jwEkt7TvAdty3LuG20V_IFPXYA=": "2365055000000", + "H0qkGmy22ZMeLCeXCSlyeZ44H0HKE4aahpeIgS6ivEY=": "598486000000", + "H1tPurwNnQmJrPO8JWQXZ175K7CSJkKfIGlx2az_sxM=": "385507000000", + "H2VaNm0HKCAbfk0nvIcvoLfXCrvLsQeLYN-QktHqkUM=": "414775000000", + "H2Y1RU9PpsJ_Y9OxZxJKJD35PQR5h5oC_2yL6C13ylI=": "453915000000", + "H2hSBxVd2w-xCwD1g0AgJL1Bogo6aYvoXv0WrpaTrvc=": "417635000000", + "H2ogJunSoajxaNMIGQDqeT-7wTNYfq5IMg-XpZTt0Pk=": "2260550000000", + "H2tLE92A8DrdvUThpH8VbZVgiBC249fwDa2PjUATZRs=": "416666000000", + "H3at72BJYkO0KlEyxFap_h66UvLu-9sVd7LmcGnon_M=": "1146000000000", + "H3eTVQej-7qavO5EgxbDTdkMGzW5kOC4R09uXMH2qvs=": "413140000000", + "H3g02gXuYM7YRwRO24TrUQ1e0nqvgUuk2tHTabcPyto=": "419521000000", + "H46rQqijsd_hjBb1XWOAnYhiRMxGi2allSBnrcTSyYc=": "409116000000", + "H4SOMgq_wSgMbCI165aNcm-NpUQ3Ib-NpTEUdUL-iA4=": "384242000000", + "H4XASU7ooEGIJ8zrPtvNPdS-G5vdF0JwvB-1mRYoAdw=": "1843554000000", + "H4dDMsqF9fsBXPs2eRtN5-YTXXEFr1GQZiGbYIxZy3M=": "417632000000", + "H5DHgrdRacRv_Rq3j9wToDe-qi7u97BidAffDtqjVX8=": "384615000000", + "H5LJip0aFyD-aR8J8iDkAKuRLmo4avKuYHt-nrGf9TA=": "522085000000", + "H5iPSKKDA3qxNt1ZmeBnLJs7mDlyR3PNb3Yp9wTxYKY=": "1374999000000", + "H6F6qYtOQiIB0vBwRxMVC12MIq6N0s8jL6_-mlSeiMY=": "1667446000000", + "H6HBASs_j9GWnpopORkoCzvtIRgiC5e3LAL6lLEtggo=": "855068000000", + "H6Z6pFUa_jhYP3qdH8FIGJvp721qvyhKrUo68r6-Obc=": "453974000000", + "H6tto94oiBx7AA2avgsMY74OY9wkWR3F2X4rjYgQ5V0=": "1672715000000", + "H77eRa1UzpvgSXpxiZOFfgnWNnDcJNWOzcZpKz3Ltd0=": "1538461000000", + "H783yR1VIxaGeHuZio3f8FVd5F_nLwCBARe-Zm2PJ7k=": "769230000000", + "H7HlpP1A5CafXj9vZKO7_AIBcf6AhklPPWudc1bnD5g=": "388083000000", + "H7K6umURIEUCXSn6gS97d3Ze66VY6OmQty-k7WmPnMM=": "386930000000", + "H7PL3CsrnFaKvY4LKgcEUDaNltpIS3BIrQuDHtCrwsE=": "4999999000000", + "H7f-Zf1zngK4jYY26-tzWFTABeshdykrEUFhmrd-l5c=": "655281000000", + "H7ousnUXdrjIOD51_gbWDjWd94mS06DMrfLY16aplP8=": "498982000000", + "H86X7JKH19xm7JwhGIN35rV3PIP8pvd_HixuPDKVxew=": "379717000000", + "H8Udv1UIXEQLV8Scs23q1kZqoAPmDTKdQTILVaJ_liY=": "1159720000000", + "H8b4PBH9fAz0GOgAywmbwebbfANm8R1J05fkfWoRLPA=": "384392000000", + "H8vANviEsYGm6b0k0EZ149BcGje4oXAJ4fEALiGV934=": "1249172000000", + "H99kAPyrh6va591JT15n2uNFmZ6n65QaWN7Q7VV1IRY=": "1156515000000", + "H9H13Ycfd7HXLlcY5x0AzL96k9xkqO1A0tSP03Fgv_A=": "379344000000", + "H9lKabRuLn8F-UUB0dTRxHk_PdmBVmJE0vDjWwW1Uns=": "909090000000", + "H9qh7A_OjmkDrdsNq6eRLuZC-0eaIztvHFKPrY2S3Vw=": "3708500000000", + "HA8lkE1yLk_-i9pSbfO5lp2lRXRWPUGbmRR3Cu8BZe8=": "45246040000000", + "HAmo-urF7jgGSfZgsjZAsHtwilwWGi12Cu828NYm4vs=": "404104000000", + "HApjw9E2sVgldFHMWV7amvclFTlGlpzsCPY4g5EApWU=": "920074000000", + "HBfCQD6wjgYfNp1axVKZC9ED-cdCs0fEK5fM-u3cdz0=": "384615000000", + "HBiNgL_VRpmtCKKsijdPxrESgqb3Ga35uTGXs65Yqd4=": "466091000000", + "HBrTL58JZKiPQ9kgX4V1SubB7IQjoz9e5zulhDvvW-Y=": "1213634000000", + "HCOSRyKANHwHP-cZfUYcCY1xsnEtYzm2SiCJ2xVCJeo=": "3395389000000", + "HCjwIn3OJyhHAl4QNvB_-g_LrvbMc3tnk_hf-1_NuQo=": "384047000000", + "HCmZCDlsn3DbVi7bQwwM9iCmQ6jMVPw2PdGV1H_p-Hc=": "3878592000000", + "HD6HN9fGUMwdKK86ynd5SbhZmVoHhcxI-Lvvmc5EL2M=": "411085000000", + "HDEc1KdUQQX6rICC32t_E6T3viLskvpsH4myn_ys8YE=": "463640000000", + "HDLQjvnkhXlCkbtb-9X32KcM-pm8ku3Diicnf6Pk6Jk=": "1340123000000", + "HFJud-dNakBboJXg_BT1cEoCZ8DWWQ0156bhI47Uapc=": "412397000000", + "HFNW2ZirFj8UG8hZsRH5K16WKQoEuJV2qVjV-VJ4g0s=": "416848000000", + "HFSXtbP_MGozYSnWg6-L4y24OP9Y8qEgYs7kIGZaCdY=": "1233257000000", + "HFwxnaY9Q9SEZasj-ycOFOuxRbWuDfIygu-U9grI1lQ=": "411085000000", + "HG-oRy5aXkp4jhuT6KyAj-kat4W4qupuOsNE6eCH2dc=": "500889000000", + "HH1f6-j7U7pForTDJn4m5SGagLyGjSsb_pT56DxZXjA=": "5028076000000", + "HH44FsUh4E_he2CjpB4iIzg1D7AqWLFq33OOCIYkGEM=": "1147839000000", + "HH9deiUZIuSHq22qUAoImJiX-VAXq8h8OFXO-3JzoRk=": "473265000000", + "HHoBeJTektP1iDnYXBmbtYhk0W9yVwZ2w7xRCRgN3_M=": "1143132000000", + "HIRam9gekEaosGS_Me_ZbStruJoa0mbEe8ilO73gj-U=": "381582000000", + "HIvguyGq9bZeiNVImnOi_1ZU6xfGZQdBRsZccu_9760=": "383670000000", + "HJQCucD3wP09e823nbp9-Xx-F_4_M0o4jeamMHLCd9Y=": "406865000000", + "HJpfXcnKzCinm0IyKuQpTFFwNJlVHYA8EznqbWRLOyw=": "8493455000000", + "HJzeEMI1-9DwzmKuOVwQ5lr5zTjNXF0MbChl9FfLp5E=": "1982473000000", + "HKBJdOhxodSLbN1xN7WUcABZcZoToo24HRBtUZGe3p4=": "4613929000000", + "HKdOT37FHg9Dy-APyaf0IkQSuHUsTvoQbWDBpV3vlC4=": "422561000000", + "HKk8FvnGCOR_z6h42zX1guRm9zj-OPF8vMgbHCYl4jQ=": "886640000000", + "HL6E_jF7N21eBa-UQrWZKVSX-UuP64FdBSQN-A8xp3M=": "1153846000000", + "HL6K4g1nW7xtKfamhRvDyr5kWWo-PxOOJ1Hct01hQV8=": "393037000000", + "HLDbu-6oUivyle5DZaULN--05d-ftQIwKnMAHQ7OpI8=": "812897000000", + "HLbK_xXgZ6CYxrD6FBmjJjL1l8a3fFZrKCH-v-U2Hqo=": "384615000000", + "HM0cK9AuLV79QJXG2QYcNzyMw3p_7JS0a8WxmEJ8B_M=": "4980606000000", + "HMMTpeb-9JDn94A7UsS4g2VIxFGXWGvGLGbrIJq0qPM=": "384508000000", + "HMqd8Bm7PCaoVjWX5S0I8NCdEiB15y4ZvNeRO3Vk8_g=": "1826049000000", + "HMrZhBnSGkIAwTxqODg8PWiV_jyDUfvaFjSs_rdaenI=": "377567000000", + "HNCywbagVOWHDPOmeE6CwC14_1zujD6dBfxZVahJzxk=": "7711649000000", + "HNQM87O0E0bJ80UuonThNWqScCxMzCeAZTm1mZCywFA=": "411085000000", + "HNb67SxByleQKs1Q1VfcerE8Hp_5eq1hQ8lQgwDqzRg=": "385506000000", + "HNiKfXSUTKrBP4IZW_YEa5grW86lB0sGEpgFz3TTdh8=": "756642000000", + "HNycnbx174CjU2l4udyo0oUzMShUvRlR-Ta2kVRzlBw=": "9136328000000", + "HO9gtWP3rJw5PDK0cZ4IdZDgphD30_ODP_ftIUNftH0=": "470553000000", + "HOP2blbk2m6rwmAl08Cv36Q-RcM8QbQd2A3kGKfcv5o=": "783595000000", + "HQ2GmZRXqVCrw5-NclOI6qtawfEEPPdbjJPblxnqJ7Q=": "500352000000", + "HQ5OnhOsDObjzu4yCgkf7m39bcYFf20i6EiMrTUSp7E=": "1135024000000", + "HQAGdVApMdCEIPNUEM_c0FBsWTIuZ4BXHFPAE179RmM=": "384787000000", + "HQW50czGz1bBhPCz1cCs60nYZ3WiPsOh_6DB3p4v0ok=": "778136000000", + "HQpXFTxj7LRQVenaaROnrPe-QQBV4VN24k9HQSbWww4=": "1217572000000", + "HRWYYBVI4ymTVPOlf1labbBetRtw3TZ66c9ZaCbUeog=": "407808000000", + "HRhQfk1da1mvefGoAiQKVgsw61LxmNZ83v-FLTvlJcQ=": "1814349000000", + "HRplOUIMuB-kLXgYcLsM5g8PPXSSZ3n9OV3qPNaVpsc=": "12499999000000", + "HSQL78rocRCSOYCfsn5V9mUMou_0uZtM7hFSnn-m0eM=": "455597000000", + "HSbIGJFuCqip42vAV4oUv6igxseurQfPJKo_rCGu1uc=": "388246000000", + "HSj1wuM3WMU4KlZtQh4V7Em227fjEzNdgUf-3vtSFSw=": "1153846000000", + "HT9Sk6juVnBtJEEUXNdNO32Pwzr4IKzP1KnIKBRP9pE=": "385117000000", + "HTsuyFhXldo85_HtUpxdi1SHwzm0iw_JrnafpY3mUiI=": "3158373000000", + "HU3jLgeMv5G_eWMNRmJdQAl2Rq7k4MnhRinhcg1HgAU=": "4170805000000", + "HUUkAROimpbkCkYGOvB1Px2cj1fi5XvOVpHzfjsZJXk=": "385715000000", + "HUf2g5NpekWLhEtjgPTeQhHWh2YunoGtxPU5DaUy2_s=": "411085000000", + "HUgvOvpLijjYG22lNBiit30qRlFwPtxAOWhdcfhqYNg=": "462839000000", + "HUoUgV_fFXjaX50bPCll1JL0XhxR7tdu1NgBQtG1x_k=": "385507000000", + "HUzWc21wgQn-Z3xgrB-TA9pKexe7WFNL9O9TOaHgzJc=": "1153936000000", + "HV0aV66-5i5ORUQflYxpYpPWWS0WIkTcw0cAWV5Ouus=": "654166000000", + "HV4HXLge5Ha_t9abWzwgLj_knrf4n4Esnga81Ekf-qI=": "399446000000", + "HVgYlgXjyE3dRXRT7zZ6w254SVDt18RikSLTopRs1qU=": "1002567000000", + "HW7YLoA8F0v69xZgEdJRhkXpubkhPIKHn1_8T_-z43A=": "4349692000000", + "HW9Afw5Sr8Ow8XJSnGLFLTc1cpZhvPM1IeLsD9TRAYc=": "2495859000000", + "HWF_0yboeqR3GuifYdwrZc9pfKzAiqjbmvql0hpZ5W0=": "5954284000000", + "HWGh0-q2vSBCGG6eOFTsblWqRg6PpD7GyG60vejmIjg=": "492802000000", + "HWbVg0rswzFZQRsAUgKIqNMxPgzIt4O4Xzrdxp9iRzo=": "416632000000", + "HWrkGMxGyTcZFVkzXFn5-FeRHjrvSL7BHyjmRQKPPXs=": "455600000000", + "HWyXpaFHsJVvSXiToAZtLY0TaqjQ_3EhyOnzN0k9-B8=": "2441712000000", + "HWzN8W_myU3UyKJ0ateSc-zgsJSos5s-uu7BcQzCacc=": "450857000000", + "HXIYGSrdBpa2BgLQh9dKBKZH62gAIjuxZTuK62RchDQ=": "384615000000", + "HXp7yyucubzG6cXc_5dubJhVoUcKssD1gKaZ99GNypQ=": "629375000000", + "HYFNfMlOLdlHlEqzs1u_Qo42nL-_t9D-2eAxcahEUtQ=": "1373149000000", + "HYRCaDBfj9Oj5AbAjqIC-ID97MgY-RVDm8pMu0cDtCs=": "419362000000", + "HY_xMhr2CJ0d9fh45gVlKKpW36QB96kvT9suOCI-CZw=": "452957000000", + "HYq5dje9BJ-5vTvNk_GJK1k84xDOJu8TC5Tu1eB470w=": "4999999000000", + "HZCKFgN6bXytZcDC5ADhLRhvVMnV3ii5Rn_K58dBezM=": "833346000000", + "HZKoQJmIlj47Y-JGW5kYvzFpxZeAXf5Mdt-IXgvGPZ8=": "475303000000", + "HZQC6U-6YjxGZJ3GPZWBXt-jO5iwyUyyjJIIR3Dblkk=": "384615000000", + "H_-vO-N5JJqU544aZ0cRYDI57l5fdgTFlRIDUwWtcV8=": "382805000000", + "H_ccpGmMnPfixCpa9aI7UQ2qj6z89wnSF198OcNt-eQ=": "456369000000", + "H_gsTWnpfhjIaFTadfrIYzfIVQ0xvPP_iZKC-yGGTGQ=": "1249999000000", + "H_ou03IwDQ-aSosUANH-_XGQuqH-Yk1U5KjZIxPS0NI=": "909090000000", + "Ha7KwGeTCAXrhw51RGjsVZxaX3878lowW3tiW_bWag4=": "388676000000", + "HaBdw63Te_bj_9ofVl74UzBck0hRQsBQXyc3CdY8et8=": "385506000000", + "HaUtusy-K7D5hpwun72AQlGjNHBQ2kIzxPjt3QZRV6w=": "456818000000", + "HaWj7FrPY226am8x3NE18FqDyFN84aKGUOXnPSL1jTs=": "454340000000", + "Hbeyc4PShsLvrWmSUvepFFHHNHs7QS83TzrUzi0YXA0=": "1990037000000", + "HcFwh3ZBo4TMhlbtkoJZz6qTCm5vpjksQp_U-2M06qI=": "404829000000", + "HcecG7uOO9PhJp1gMHBAvxmjyGkDbhuvCgWxWojfW44=": "751149000000", + "Hd1WcfSDXd9-n5opdiXvFpEGVhkjbaXIlzGV_ThwLjM=": "670374000000", + "HdF3-8057jQ6G7qc4NKg1Ey2ntTCkUaLX8pNT5VIvQs=": "989124000000", + "Hd_fJDgvu-47LC9Bb9S6CzxO4aIvTWsXwz-nEET0Ks4=": "2005096000000", + "HdfL93tV1trH5k1uBuFLcbULi1MYv3XDLrG9X2Pxgik=": "463053000000", + "HdwvCVi3XD4U46aRA9r7xWLy2BJfO8Q_BwEQdHSt8xs=": "398329000000", + "HdxwqcUamLcB4sJfzaeo8ZLPceJExYbf-1Vgcr5qlHk=": "384773000000", + "He-z4fxvs-ZmN9HuzUTnewYY1rkndEMVTiqb_Vat2Zc=": "1386434000000", + "He1fBbLw6kMsHRLJ2cvm2qp-5B9TJuM7wMe9SagXS_A=": "3849069000000", + "HeDWxYqUUhkqpt-W6hhVJTyOeXywPFYIP2eaSqNVN6U=": "3849006000000", + "HeTh9WJlFP7Jd_VxHNPufT1mzD7S2sVcV2lsuzb6HHw=": "4027719000000", + "Hf9LA3l6zHkEI8QB7MyaxjWAFB9TiSZK9YHyAnl0Hmk=": "431414000000", + "HfH3A-V5TxszP6Nv4F1jry7JXeam2NoJ8Re0Thf2P2k=": "408128000000", + "HfKu-3xeAVhS0RjmjxJxFRBNFJE27dMxUPSADyC0xAo=": "417631000000", + "HfZ_sIE9MQ0sHq-c0jIo_eYY8Wx7tFIhHyWJyTaqOUo=": "425636000000", + "HfbfwuU6l2dvf0i1HSXeK2jysbvWMk12L2bAqMIbOjs=": "429275000000", + "HgFzAIuz5uAyoXPclpho_7MEyp7cDt_J3uCE25_iw84=": "615384000000", + "HgJ8M2zDscB6bRXC4lMzMSJ2eMvDBUpw1AHeYdJd7cY=": "387467000000", + "HgL7EGHvmWNp8n2QUrLFv-ILRuswqACbkTwM2HRDQOU=": "384686000000", + "Hga111aeWCCrE2XmweZy2VROvvqUZPB1ufN1o_kI8w4=": "411085000000", + "HhJATWtX4FdAqweiXamUW_vpxR5Jy-uaG10VMuIP7xY=": "381319000000", + "Hhb05B2hRDk3pA-8p0E1nLkuxH5ZSkTnlmxXKFCDusE=": "763607000000", + "Hhz_k8W8Us2H8LUjNRDHDDyYtKqvDbYEf6s5-DeEcAY=": "416666000000", + "HiFo56STeyw-HyBlwkPs4Zyw85YawGKHIKfic_MYyms=": "382750000000", + "HiIWKe80dXJz5kGvi7-q4r004KyYkmKWhmj9POfKIHg=": "387727000000", + "HiOfYPQbnDKhtkrA1UP7JkobWgcc1FMk1IyhAo7R0ew=": "921463000000", + "Hil4e0Qf6ONp8bZoqp5oFslpJVN9EUuPmicy1hHK1OI=": "405218000000", + "HiqAgBJgITbLlswt28_CBpyxX3po9CoVZZPK_tdPBiQ=": "6435900000000", + "Hiu1VRDrg4vqiuW5o_XeunFyJN7HGPgF_PfsU1mNC0I=": "2487759000000", + "HiyffU5EkqOJqP9GcI29NmfSrgRWGV61NjG7VDC6cfs=": "454545000000", + "Hj5MvXV1GLJP537Lnh6Dz9EccDm6Y0moXZ84E0CQZOk=": "403213000000", + "HjMZ7knMEKtfZNU9j5UIhvZlrSpWnT6nV-lS9F9YRhU=": "4615323000000", + "HjfWKutcE7NuO590dkvrUGKPOTxw7Bg_7SwN8A2d1lo=": "384615000000", + "Hjl1OacHrhr9-_BqRbnVZyE83txJTk8leRZp0j7OlCY=": "635659000000", + "Hk7Vv8ZHQaKaMhbIXeZ5dCPUiu4zs0acJyoomUe4V9k=": "384615000000", + "Hke3NvnrnT586blZCMnQLWU0TkSNHAwc2oARUDx6XBc=": "1322112000000", + "Hkj-MbVnuQ6nsW7GsvraSc2aOB4HbJ69RWHYYp7RcXk=": "465854000000", + "HknX9eTW483W2Q1c0Eikl-8tSi-o_KtWSRQoLUNE-mE=": "423370000000", + "HlHPGP-HNw-2gwcgt5Hkdl1eFG41AJVFF3H90gotAIE=": "1564625000000", + "HlldK-B3LUl0C0AlwQxpAbcuCN8PqLgO5VxvOPaQEgY=": "760591000000", + "HmjwJJW-1QEih-6cpxljDopQRy4YbjMwBbC3Vgfk1tA=": "501411000000", + "Hms4Eo5lQBVULVZEADKLadXEy__r3VRPcCLrnY_Ep6o=": "378006000000", + "HmyjdV2zoMwkfoWgcn9RMz2gqk6dqisWBSVwe548hNY=": "692307000000", + "Hno-N8-4H35C34m2IPS1T31E4TW_VQzn-2SJqm_fNr8=": "12600500000000", + "HoOb89Jyny_H0kfLAt9RsdWVQfldet1VGZdHKK_YQMQ=": "1153557000000", + "HoTYStJIE89Uo9Jl-XM79OkU4HtGPpNZcPnaHW43GUA=": "416802000000", + "HodgaXxaYVAf47d2PC8M0ZDxT5pUa0pGl74ks_qnJhI=": "463594000000", + "HozpxVOtsIWm8jasxsDtUkqteC9v3U5zJHEtSwrm0-8=": "666114000000", + "HpIYjgHbvHXM06GldaZAYzi3hXlue-LwUF1oq1QDh_0=": "405197000000", + "HpNTSCa2vW2vfjBx6ZdS-al64uQt2MduTrA3iH4u9FM=": "351471000000", + "HpQTfklAl381AivNQfKC8o3-w0J89yRjMTc8nuFKiw4=": "715494000000", + "HqCkL6UELVKCQSV73ULbJJrDTZaIZs8tMDR1zGFczpM=": "466542000000", + "HqERO1sXyqqlKZhPuyy4jEziVGio246fyXzg-CxRYLQ=": "2272727000000", + "HqFdzZLLJmBUA8-Dcn5d_A-qlD5R2uNPvaWYX-aWD-I=": "450965000000", + "HqR9lAfFookvQ4-xP3hlUKHUnn8creIi90GCt3fgXkM=": "1839281000000", + "HqYga8kXPlZg8UUaxxrtM0oAsaTW_HEvP5nq9uYJ_6s=": "578522000000", + "Hqgd4pJdxyZT9GawxP8g48Y0P0Zs8aeFUy6KbIGaUR8=": "1567272000000", + "HqpxsPdvp20a_kVFjzZj2FEieVoIshiWi6OZBXbwBNc=": "384615000000", + "HqstOTqTziFWn1NX8PzbfMctPfJoYaDNBePtoGbAA1Y=": "424045000000", + "Hr9JUW9GQAWBmBm5BSQUd-7HzYB91xZcalYg-c9si68=": "384615000000", + "Hr_QWbc_60kQLmQJprCvtH7w3J2hWgDeu4HDj4XzqSc=": "560165000000", + "HrvDsMjt1Jhff54id7yat8HUrve12CQ59qObz3Vbvk8=": "769104000000", + "HsN00PIFGvuZ5NOkC8Wy5npZUzsj4WQmVoi47EzuDok=": "407233000000", + "HtQNrFyXQgNGjJ75RIYh0XfSbn11r9ZCHggHm4-KlMU=": "378319000000", + "HtiwVvWRE0AGXVqGcU_HgwLH2KiJ7loLt1qjFJ3x3Gw=": "681199000000", + "HtuJHyH6cXyMV2PTOdXDktgW8dM4Rd5pja6vvAW3hx8=": "11578327000000", + "Hun3D9gSCWpnZBeg0gKi5rbIz6Dd4nrDIJvUrPidUKM=": "377868000000", + "Huy5X194CZqa9xjvSJvsMwcIogGCu9wFk3CY7EmEDDY=": "1908173000000", + "HvWW9DbHumEkQvnqemR27kN3dts0UFGWZ6OYewBsn9E=": "379344000000", + "HvYq4YzitW7VocHKfCZHbcV70CSfQjObimqVqD6Xi3U=": "366327000000", + "Hvo_UgMGwNbOpKJTnwhMb1HwZ8drOAO48JRTCt8vEdw=": "895161000000", + "HvqpEFMqJHLpzWYY--KlPU-ZS6fS45G1Mr1BiwazZ2Q=": "3846153000000", + "Hw4kfYTJHPwwIU-pcqvWTXraGMBlAeK5AC91RFTaZE4=": "1536806000000", + "HwIqkmAwk2Ooc77FXjbdcjvZY67MIJCbSAgSfHgz08Q=": "769128000000", + "HwTE5dMilSmhKGfo38QnHF9DINMMZf1Fq_obFnFGlsQ=": "1156532000000", + "HwUA-R9yhuHjbTBOO-__XQ9RW79kQLTyD2XcJ5Pti4Q=": "415861000000", + "Hw_0gIo3k0G3XuxkXzQHrq2MnbDmRZzsaiY9yv2xTR0=": "433628000000", + "HwvLBXZFFCUPqoslZAOxDe432bRDiUxu4AAaVoW_KBk=": "1126724000000", + "HwvVU7778HKSn4I7bu1v-97MiPAXl2Gt49q27-44xIA=": "387414000000", + "HxCKk2_QMqvNh0s7zExl5ymdp6AZ1OGahZFCwpNS-WM=": "1134771000000", + "Hxa2bs3Ygl7P49jdFs4NVej7Eiun8cjH2vEUIOWD4SQ=": "390084000000", + "HxlyxeSLrk-xe19GQNI-1JoguOC22t1os78Xb8ILjmc=": "2102612000000", + "HxseceJSUwUJquUxBxky0g825SwwbOdAWyM-HITDBbc=": "392981000000", + "Hy6D76MK15JGzIKpRCgC-JSxO-V3j3aY5kX5PGhnVyE=": "459512000000", + "HyNzSM28OdsywGBPBvqkawlhBQ7bkDn8EeKG4tqyu0c=": "441977000000", + "HyfHfLS8qMLhdbTjX1KudyXTegSnY__F6z4GPaOFUl8=": "454545000000", + "HzLaBga3ECpBEqnqrMBgq_H8tLth_rQIfVWlhSLdUdo=": "662348000000", + "Hzgisylk8Lgyuahx9dzn1KMu_4nFrcRaPBAnCBVLGF4=": "2422627000000", + "I-6IudnQPJOeMjlD3O9-Q3EU5D_UWkCo8o5pcNGlBHA=": "908730000000", + "I-FI9CKF36oHIOL8pFv4bfi9f1HEMHSJViA1Qli7H4Q=": "1590909000000", + "I-_qvfCEwF2dKNnlc4VS_pxMYJu8tp8niZTEAPs3nBc=": "459136000000", + "I0SFhixMM5hf5JIYqU4A2fQoeusL8ykidX_2DMblGZE=": "1540895000000", + "I0uXfJzfWjD8DBcih45ZqEgPAd2NUNfSboF-G0ssOmc=": "1153846000000", + "I1kVHq_8dqgpYq5CkRGLxzTOySbsSLCdIXhs7wMXAzU=": "624999000000", + "I1krJqsN77kCkCWnz2RryHFrnXYxPArw0tPjLNG-_no=": "376906000000", + "I1xWN_4YQ_forBUfKuKbWAbhGsq6c-JT5HghSn3bx7E=": "1673658000000", + "I2LAFFy94pOI7ODzlX2iVkhMu7H7W4_t9N0CP-l7SJg=": "351050000000", + "I2SjH6GDVthBZK3MlU7wtWU55VG6d7GC3Uaa6Pxy378=": "1751443000000", + "I2XdeLuOcO9Tzb8aIpikWpERYevPbNQPf5cuCXdNjYI=": "1927537000000", + "I3TkKXCRFSw25qxSlo3J3n5gjFZoSHd2LOXvfloKbaE=": "833333000000", + "I3VsvQjM-Qc8tWvVgzkqg4BlislW3MGbuMj6365IT0s=": "393359000000", + "I3qvnk35ALeF0LLR4OdZFU1GFtFMGm38azPFgfUa5cg=": "423370000000", + "I44ST6MRGNhtUwiDsT0ROPY8IgkEr_WqjnYSTkOfK-I=": "454545000000", + "I4BHblyRlCPoyFei18LObg0UIFAkGo0qbzz1T_2GGdQ=": "615577000000", + "I4H1wine60fiO8JmRFB_RSRJSL9sJajlFbhbNSYF03E=": "5728648000000", + "I4dzQYTD5vO4SGPfN13YJWHt6PfdF1QLb_NOr6x3Fcw=": "2084122000000", + "I4idcVzsARhYhU2A0AEPrj7DVay4ksh88uRNXiSqpeo=": "492388000000", + "I4wQbgEuJt5R6WAGntUuff3OFbkeXmKhvMrRe6Br7lU=": "382410000000", + "I54Glvclkg2TQLCLHSeOp2QlnuVdGYuv8O0m4DHUQbI=": "454162000000", + "I5VLqGKtnaJ-SJMUu2FsQ3ZBVvHSgX3LGJnp3rGepKw=": "416673000000", + "I5bjwEuso25oE_IcciXvMvoSi-PLYtULVMKLFCxlN84=": "9611674000000", + "I5e-dIkHIrN4YPkYWdqrjENjWzl43aOTO_6U3JMsmX4=": "456839000000", + "I61OG02ad7UDogerkmLfZhgn4iJ67NIS7lGtYRomCk4=": "5008092000000", + "I64ZC0KSzC1GpIycAldu_pYUitVB4q38wzsx6QqabiQ=": "961538000000", + "I6DL0gVX2ONVJ7cVbl9Ibo16rox94sZEK50DAGU9Y0w=": "900960000000", + "I6KrsS_Sob8QuruJs81-uwZ4sgVW7e5z80O-xc6L2_s=": "409453000000", + "I6Pa4yMeEInoxBDiiJI_SbAi_NxLmfYjHT1mgJTOnUc=": "615895000000", + "I6SGXjnbCJ5rQISvaglRQTUzXNAiRByBPPyyqEs1YHk=": "906955000000", + "I6YJXv4AbAbvB8DSaqD8Jcar7aKDSQjBdfqUpzksmgc=": "385510000000", + "I6_LCFy3NwwZiEk6r3fN5dsV9MbUyArLnFLGqC-wVIo=": "20083904000000", + "I6mlqpqr-c2BWMolwPK-5cAMP1fAH0gaQ54hxC-DFYs=": "384615000000", + "I6mo9uTmdfTM0mk0UhFnGZYpys3cq3Sg5vMK65w2giI=": "783595000000", + "I73HvhjO7Id8XzllDGUXghFaCpQ2hQniYzknXUrrmaE=": "750896000000", + "I740M5_Bw9CdQX2ABvdy4NH2hl-omNIRUyukNBC6TYw=": "454545000000", + "I7Wh1yiq0s0alFc_-m9kc4VKJ9RVn46tB2-gtvqnh1E=": "5664988000000", + "I7YiKvFrxeCO9vpeo4tB-i5BBuYm5gMosDxbm9XBTe8=": "818220000000", + "I7tENbkHnos3p_wPILic0K0W74VZj2LdEcjKo2MkpS8=": "491921000000", + "I89PIDWvA9Yo8VvyH9fXlBXxOxQuDVT2qXnEDVMvrgI=": "1363636000000", + "I8NgMB15lyIrb52hNH6pKTmLZ20V_prDlqAG4IBw9wg=": "1730091000000", + "I98fRcVQNttlW34Famai95d6UYp5MQMm3U7pFVileWs=": "411085000000", + "I9GVLBHntgBTi2T7dllktn2hiKrUnf-ZwChjqZh8mNg=": "1879627000000", + "IA_XM06SITHzXy4c8q0KU0l5zrfxJelSNlxyxoziVik=": "384649000000", + "IAnkglXALzKL3fgcLC1HoAhDe1VGxKX4nQoLZaY2PqQ=": "2246710000000", + "IAxh5oKNQSJ6YgD9gcx2NJudbcU0_uJyhXBRHQNn-c4=": "758694000000", + "IBGHhLSJ-FJdTNCOFomvJI-90nfiz2PEOJBHdrClCn4=": "2636176000000", + "IBMCVam22QJPc0Go0FSYFLkaYtLsNPdgpOpL-kbiZag=": "1139862000000", + "IBtHgsAAW2Pk8IK1GeSHErSjjVmKZ2GVtwDmG_T_OKo=": "384615000000", + "IC-h9zVdvMl_gEe3x5rDs_Qk2G2QeeNSxkkvnUhioSo=": "583604000000", + "IC8fZFVGmWYxtBQRKzUbBSEsHgyyHzo1ONFQeYUUVRA=": "502779000000", + "ICAyQdXMi2AmapDmHm7FiLutLaFxfJyNPm-znmCDlAg=": "385136000000", + "ICIAWzWrGlzrxzyCBs45NKauSWssotVCFQtbCo-mduE=": "763439000000", + "ICcRpdBqhYworl_E3X4BuwiF-_hHONDJ3TVwM4ETWaE=": "418059000000", + "ICgCl4lKwAkY5Y93MgwX9TxZ-7Lg5zx1Z9VTLlSfm8U=": "388637000000", + "ICtU954XvDCPGKiIGJxDlUP8577zBQ-2CwFn0Z5ZxyE=": "833347000000", + "IE5BmZLMLf_81d6uYdAF8_aOSPAeDfvPE5ogSjqljhs=": "684778000000", + "IE9iFH4Dh3nyhIkbrb_r8RzKGVG5TxTJY6K4kqa-VWA=": "419695000000", + "IEAxX6w_jTlqnKTXSXR7J69EvVoJwjm-JJRLh8Q2RNs=": "390817000000", + "IEeBq07mzfA1jVBqmSNZ9eXbFvDT-WJLuXVfN-ks41A=": "416666000000", + "IEiU7aCSfvrY2cZ1X9Z9TzyLMmyE6nZ5UYZ3hjpla2k=": "2545614000000", + "IEx7hmJ0x0Nl3PsP3rEl3ckMnuJGi-lSCrRyRh9J1Hw=": "463745000000", + "IFHGSh5z7kPFKBeWCcsf1XpnQbfo3CtQrfKxOjQs-8s=": "453319000000", + "IFv9mfeoszwLGZB0D6B3ssypvjobdKFiDnt7WlscvtY=": "2037685000000", + "IG6ltPe3eT5avOm7PTJlvJLT8KggyWu6G7Y8V5Fy44g=": "383592000000", + "IGCcNsd5mhkww4gBaxjJl80K3DWLZ60MwUyUQpO8SDo=": "771834000000", + "IGOSgCFzVcjpJdPGoTvOS1EWC7fBvdTC1qlz53606vQ=": "416699000000", + "IGc04CwIB6097MOifDo9CeQBhOPlMxofnxGVEucOKVA=": "388594000000", + "IGxjbR8_HLjJpwGjZQaZflcCesuqMHKmX0FYLeuDEro=": "384615000000", + "IGyKtX_tdHJ4l69lAcgIudpF7d_cZZWcYnUpZGFQv1E=": "696661000000", + "IHZp9G-MWhrcCuKiLo1kHKq3TztmLVOrn0lU6mEFkA8=": "385834000000", + "IHfP44vuhc8PmXiiPF2l0K21K9kyjNppYBblaQ-5uUk=": "2085246000000", + "II34TcDLD1pPl3Ul3fmhNKIw1703FRuVavVA8LtL-zU=": "407121000000", + "IImnPzmoWHK8zOJ_FATHl8JeUuUlXNTyHZ8DcID2rrk=": "1923076000000", + "IJKWWrDurjrvw7JXDQ96EnvSX2NRTgnG3iqzqfZILbA=": "1355296000000", + "IJXRjP7Fiu1zDihZzET2bMpfQbmWZ-HgKc48t5wcOxw=": "381635000000", + "IJjhB5VWlsM8mLvST-515l-ycyVlmQaFiwJd2ec_tfY=": "1516406000000", + "IKGJ7xQzwMgcOisSftrYs6MGiIZBKhI8uwEmDyQgFL0=": "394336000000", + "IKKMYwuho0Re6U7fwvhCAQhhkhbZXvyT3RCv3rcG8dY=": "425004000000", + "IKdUqp--LtLXw7tXrUKHIfQGaJ-Q08GECvBxzJ04c2U=": "544142000000", + "IKwTvQ9KRDFuURWid4OQOzhY5diWm3p8HwBhVmnKwjQ=": "384615000000", + "ILSXASFimJ0mnHkg0vlze0hJr3LMracEmVUhUr2L-wU=": "2739611000000", + "IMPWsHcmOYXcRBjAOsjgUq8xTDtb_UnelxLAuOobsEc=": "769230000000", + "IMW52F_AWZVriSjqTEzvd4pW6Si3nELQO-KpyZ1i-7E=": "384615000000", + "IMZf9DZJygtV_xzz8snpENteEhY8e0rBW7Ebv7lXY_c=": "4507754000000", + "IMfqJ9gw9YAf0KSLImqiMzNE_OP84XImlU4W8yOxdqM=": "384615000000", + "IN-PENfqWh-EsZpr5yZyupktL1Zaiz8gAov3pNoFxqs=": "385505000000", + "IN8a9NpZIDvMyGvhX4eHzP84DMMQM-ajQuj2Cu3Hqnw=": "470370000000", + "INGs9Sg5V_ndgzlO8v0IRqGosiX1vynnmuHzBE-eOwU=": "1249983000000", + "IN_nOlcHNMXQELnFy0fv6DLW96BwxR9hdb0b4NYA2zc=": "1249999000000", + "INsFWTps3eeKFsJgZX-ODO6fIaDIrOIv0P2k8kBhcG0=": "1269928000000", + "INzGjf1WR9nguuZkHC53syJJR04UumDKq0ipsQ94Tlg=": "385507000000", + "IOnzA_cVx7EpTabQKUyxHjl6AAVjQgtXAHrml9kTAY0=": "648033000000", + "IQ_3tf-vg3XjpFoNiFEceU8nCDqN48vaJ09TQUEy_-o=": "3783416000000", + "IQ_KTcKEEBwYu_aJmD1nySt95wNazC-hXUYabXB4ZhE=": "2069592000000", + "IQgifeMzACoQK6j3mSoUJsLbnM7LhvJqrI-wM4aYB1c=": "411085000000", + "IQqhZyhbEub86Fwzb7HSDB14f1wmNt56iLI41zI4Y30=": "464666000000", + "IQwRHN2NjyWIZLrIQIxVzti2Swir4x1VyriftFKqGhI=": "421446000000", + "IRAMwx6r3H1GWx3DH8sNKe0zsiZkG7zF5HaeR-Or5QQ=": "2038461000000", + "IRMl9Bqm2XqR6Go-78eDI94uZKkJS6k8TlYGAwmPyGk=": "416666000000", + "IRumBL3A8d4I2l8enoG3RIayBMJMZR7HigR2Zoj_1vM=": "384564000000", + "IRwqkFopaAyDayT7U29iRrRcu5SJOnBoa8IaMpsVjbo=": "1628513000000", + "ISFE3IE6wJg2Fz_SZBRMs5CqzArFzhKPU0kPAJQkf7Q=": "384604000000", + "ISirBdyLGPIxAOOg427e3f-MrV1CGP0ozvyqI5rdQEU=": "634433000000", + "ISu-H2v2_fZZLMKJIdJQyNSK7_E7xdNefml3MU72CNc=": "397332000000", + "ITYUXM-Fu1jLE1I6X-cSH7pHAjXLBW_2XZslvSmPtE0=": "381476000000", + "ITadb377bMnZyWWfXgX1FDp4Tl5gT2xo_n9tgNB9MU0=": "387632000000", + "ITvbS6YA2QwrARIru6r8UPhgSr1b_qzV-8LoqdW8bM8=": "384615000000", + "IUScUbZzHtRSHukaGZflfRDvf1lK6tBdg_mTeYldKn4=": "452076000000", + "IUlIdp8tjmt_3qv6ZoD8-3aNnTSvFhhCNMNP7fdefPM=": "1141815000000", + "IUws2i9Y5LegazZPrQ--lb7Z6aZSoBEejSGRAWKYkBU=": "830494000000", + "IV-JZxgeEDIXkjnr70es2dzSYRyGiq9dM-_ghTtQQJw=": "378137000000", + "IVDPR4VttxPXbudCY_E-RoNoQs0kYNqfyiBWOgQIRtc=": "380846000000", + "IVFNtlyGNjzyTkUxdjmfHQqlSFWbNHMtP_TXajWJxxQ=": "452425000000", + "IVYWIOsxcT_mzMpeTUICkcUN5-1_ehhWFDzcq0P9GcU=": "1691557000000", + "IVnO62CTIeE06SofOaepm7oLM63xiIiqLGUoOQu2_eg=": "381466000000", + "IWX-rrfeWY884QPvu7CQ1LsaQPX5xMtbkjbTnOW337U=": "416666000000", + "IWf5jABTs1PudxEy9fJCGzvHaM7LThJEkb_5r8lFEs8=": "7692307000000", + "IWm57UN9G4Ztpz2dlo4Q4_EjwVLy-QspurfctvDnYIQ=": "906393000000", + "IX9AV1UXvhKrqgVSWFvZ0wDEBAZwZyr3WjZ_Uspk-zI=": "395125000000", + "IXLwl9QCTW_8NmpFEsNH6Vw1g3C_LnaFFoN2PtPU5OY=": "1877873000000", + "IXSML5P96fBYukh0CYtbYt_T5nX9c_Pbcs0CNgEYuP4=": "378426000000", + "IXU-jH1EjmsJij1cKsgi-6XASrtIAZkMQj7vvGeEQm0=": "411085000000", + "IXWD8f5-yO4jeScdFmkc1Mzy5Af1k4YQS0Prv_GmnnI=": "763607000000", + "IXsceKE3o0zTEtNGp_GL3mIrljQxvTULhRvknPl6rkQ=": "10158750000000", + "IY2blZQhQloTs6SacOWo57BPweDwV34RGrAvudyg5a8=": "378614000000", + "IY6WYYprU9haSC_KKssixZXtOI35DvqijfwT7oyUB_g=": "445610000000", + "IY8R42UnVdvrRoGbvK2aE9zZK2ljFMat_-tk5Yxcx28=": "3862170000000", + "IYQK2kflfCqj1Ul6ep0hg0NV5-ZckHjYyAjjd9Ldesc=": "403850000000", + "IYu3R6J3rUItbS9CSTMMWyo_CfdZfOqWetYJctQSFBs=": "644301000000", + "IZVp-ZdJXPhOtp0_4bp92sSnHVzcdZhnd_fAl8Wegqg=": "2020476000000", + "IZg9ICrG65BfuS8gsQqmdxmGqjBBjYcf1mMzpdQRkxg=": "384620000000", + "IZpet8PEsL_luOi5lim8fAIGFaFL5u7j6GIv1-nyLkY=": "1538461000000", + "I_5wNWVrXfHJbNwRcOm4_ddtAJG1MbG2NIyCk2mfBxw=": "805584000000", + "I_8V_hntQUXcOmGzbxhustCTRG1X2dzRU2TMNLVPZW8=": "2276558000000", + "I_yKg3xYvQ0-RkO2AWoqektfum6_GdUEmMWXCgtukFg=": "3846153000000", + "IaADipSRdOQO4g6M6lw4j-ZgSd2eum8hoeTMt5i06tw=": "910712000000", + "Iazl_lctLi13R8tDDBuAdVRu5VFn5WUt9wsqA5h_2XA=": "462839000000", + "IbD3HQGetR5QdqDLKVvyLO1ZVaK-F5Hwl5ztGQRd-PE=": "385508000000", + "IbK6XD3cjUrZF07vrzx_8f0fPFsx5GFBHc7MQiahWGU=": "2067697000000", + "IbLShGcO1IIv_D3tz9Dolvosb-VZpXXqXITkGt99VtM=": "1233257000000", + "IbZFduVpOGPvEAJrRZrVSIC37gApes2UJaEC9Oy11NY=": "416673000000", + "IcamujT4tGZlrk4jKw9I7SN4srOY3dQubn1scJc9mA4=": "383865000000", + "Icbmsph4KeCleUaDXObYX9GdrSqkJz8D_dRj221ld9U=": "6328727000000", + "IdVrVlYtMlBXjdO7OKW-vrmFcqUgVndLDNo_MjV9LEY=": "498408000000", + "IdilLefLmMec35XMOsjqDSibUfftvaTKSOgCbTpm_oQ=": "415988000000", + "IdwFPTxgIwYmRL4U0vxkYkWNLb3wFdrRxRulM4jPoMY=": "1410471000000", + "IeGWKVgcVxdBbi2vA5l6BeEcQRcgv0_YV8DoEo0hUZQ=": "4710307000000", + "IeKJgCXhQdPbvrBh8EBE_Jj7TEWwv__hdUkeaOMgQSE=": "3085593000000", + "IeVQo_KL5L8sIjlBCoHD7pdUlQTQXUTGtRfsGi_VEvg=": "4156209000000", + "IekuvWQb9b2eL5M2kkPzAOzINOoO52qwPcSAQQmQyqY=": "413562000000", + "IfEaYj_AOQMdfDq97utw4sR0do8p5jZQh-4PYtogDmE=": "458333000000", + "IfHXefoQy8SvwACe8-kZdZdY3ByzbHT7Tbrk1-jPcvw=": "384615000000", + "IfV4HtCT7vrhwwKbbwb2z6Ex3o_HO4VxT8PKgeIqcZA=": "381839000000", + "IfXPj5YvkP_w2hkFlRkvyY2dbSu0GBuz086EUCkiFPM=": "499999000000", + "IfrbiEGrTuhMBkEHZcXj1L1vc8HTwudHCFUOcMPVrC4=": "378010000000", + "IfviWrrkMGZsi4MoijPZ520A4syZjfGlK9GXCNGA4JY=": "794692000000", + "IgIKrWJGBzTtc3j19pYczfmpsy-kl5reFpFO6rTTPGM=": "383985000000", + "IgJ_U2S7QyhFVcR_-UBunk4U_WFv0vN35SjCfS5rdUM=": "5206939000000", + "IgNigPFhXNudZFzPlX8t_atvxWQI_ARCuqHILb1XMKM=": "1250944000000", + "IgfJNIq0NWj0C-XsRoPPwsyMeL3npsr5jFOS8mA1yrw=": "469349000000", + "IgoL_dzEyG1ElJtjyVYlf_KsIRLLaOW0dsxng3NcIQg=": "2501202000000", + "IgsrwyeyonmOL3gyyF4PzYfKTtEMSMQAcY-_kz729t0=": "469468000000", + "Ih9u-l-IJKPrsDQVAh66Fs9DSeVt6yh4GFIVEcJzoRg=": "416666000000", + "IhAkaQY56fFV866foeTHdrxr04u30kWTlqSn-4bPGuo=": "4417691000000", + "Ii8ptdJojhllbbO-qCHbDDX9JKBS_ZsIVm4YKKkqAqA=": "423081000000", + "IiCtt01JU9gx1cgF5sEpgBF6YVZxJ6ToU60BQzYau24=": "1588664000000", + "IiHZ0oPMi8t_AJ18PXdHuj_A8evphDumKsEJrKVVzKg=": "502393000000", + "Ij-84F7kbel6H3skvpyjKsyvQVgh16TtmsWWefO7L_k=": "1941362000000", + "IjLBuR7KJivJ6XznpsrXUNS-ybwLV4mCX7WB3XorVJw=": "736348000000", + "IjoKhtfGJgP362-FOZKZl1F904SusBpaJbfgbHhCnoQ=": "467438000000", + "IksZDGI4wPXGL5GrL0YsBIdN9P5AIkOoj1AIUBYBYJQ=": "463789000000", + "IkzR9_7bwYIp8IWO4tkEZe4cmNUj6u8htdHQIktVjBA=": "298474000000", + "IlDEsrdjtRHsJnMaEhm9YHfKs0tchbN0gzuaBGyRivU=": "419845000000", + "IlGjuW14g8hmOr65ZN2uWcIPVtQCqoQjZy206LdjZgU=": "377783000000", + "IlUbJo27kP-2ujshBKoD_cGeFd5CI1Cx5P6n1B5gTF0=": "757315000000", + "IldvflRDaup8E-BNmRZBId8-Vo6kGgWa-1PR7mukDp4=": "387257000000", + "IlqcetpWSkx87pOmWgeq4Hx9nvCNC4shJN_K9TRnC5U=": "4621453000000", + "Im-DfCvkINGOms_LLYo7Z8ei_O59XQDSWpn1-TsCWaI=": "411085000000", + "ImI1PRqT1-yIUc9Rnk_SYeqec2K1w4ZIpLco0e-hej8=": "4571314000000", + "ImL0NVRS1VNpOK3Z_QbegK6QGGFa5kqr1LoyfVHgvDE=": "566977000000", + "ImPa71u1yV18bFnws1j9ufq-dcyuVPNnLkyjnk7uulo=": "385505000000", + "ImUneXxockPOtvNyJSeT7V80GXuu-BGImtcQa_WdUXY=": "421476000000", + "Imfia-pJKwLuSlFTDVsXkED1Cg-ySE65_xq8IIJ7SXw=": "377408000000", + "Imnc9TYWkYNDNcxmyuIi1EQT05omh7Kys3ZcdZBcZ4I=": "1136363000000", + "InL_P3tvi0RlK-2kHWByinegxhXwUPfHuIsVYfPQjTU=": "423004000000", + "Io02iWCk0uG83EtvpIQHtkL9pFTyqgzLNBT9qAStC4c=": "828710000000", + "IoBYpmGW9RdJVz5xPXjsBD3H07UlbFBBCuQmVGAzXlI=": "415629000000", + "IoSj0I_S-Oy6PLXeyfVLtmtAWBGByce511MmMWE29hs=": "507053000000", + "Io_NcIDDhsgmRJya10hF1rzh3bTV4UdA6wPg3BOrKaQ=": "3846153000000", + "IoxLA5-tnmpckfe8q5mkh4Y29rR-phm0qDvaq_ql1HM=": "2672504000000", + "IozOGFSj7qUmQEUvrp-7LjQPNjLXDW5GTQkRjlPm2vc=": "2307692000000", + "IpL0a0BMFqBWLpOtMbmDSsmSvnmVcpJ1_gA8kji2MYg=": "417629000000", + "IpoHDbFCOei21nY08LFk3pMHuLM-BMmzFROef_av9iA=": "8401934000000", + "Iq5YvnvXmxhr9DAWqGsIiSySwMxb00q-hvuLEA2UBRE=": "473265000000", + "IqNxwTWFVQuCev49mO8PUphbIoATR8QFExaSSTjXPJs=": "384615000000", + "Iqq59uQvKjnwimG1cSk-VKSvsGYO_jOb1GfZONPoKNM=": "411085000000", + "IquH4FgCX1eQwInwoK1WLYOQ9IAyS0_p1GzUjWxhJpQ=": "432644000000", + "Ir5yO1Bi5sOo3FQUjRAVDTx9t52AW_fF7_xUtd9fEFw=": "3846153000000", + "IrF9Gq0rlDS_3yiqAleebn3hWiWaEd8RVlriepe8WRg=": "2270245000000", + "IrPcuUp17RQ6BQg5bB_f_7B-ufBnJzSEMyRpDLhUeBM=": "817169000000", + "IrZO5BI6hBK7i8r0UxVJYy5nY213ne56yRymu-yZ3iI=": "464704000000", + "IrwzQgOLsk7VmpUtOTHZzqzfD9_1ZnaWYk_yPiqHci0=": "385505000000", + "Is6Br4ovJ7vggYTPnVrbKjAjdUgm_i_3ZbC3wfRuvx4=": "386541000000", + "IsBNkWFvLURrdIEy7xFNOcF6Nzd82cUvqQ5lS-1VLJM=": "458460000000", + "IsZL2pC_SrUg3hPqdZ2HPcne95QYwQwP6TRHQxIAz3Y=": "3466848000000", + "ItS7IXJFDm5jAaTN6diHHMTqMg_qmS0x_CAKnwpJIxg=": "382396000000", + "It_GQAsF7vsOH35-viWA4w81G1tpYv0LIs0vf76A5w4=": "602997000000", + "Itr9LT5m0VwmDmO5JAE8LChrCmVSK94yNsP-ld4Qcfo=": "1619500000000", + "IuOsQE-97GHj_lRUA9gBakrxM_0kOdpuYfQ4I4Dubn8=": "407808000000", + "IuVaMbl5JSItF061RYfr6cRQMWxhPXQY36CM3dMKNx0=": "4012794000000", + "IvDOcM3AEhp6CokGTZ6xSNkqqcFNMwz9jWnUIq0Jvfk=": "416666000000", + "IvFDS4YuBKBVtaIrIr54Jdqyd0jgfBPaZbEFwpr8pj0=": "1190856000000", + "IvVSWuflSdWt0EGeS0NdyXTUzI1MXJwUSfCUVM1LDQs=": "4175068000000", + "Ivh37o-ffSOJ4EmhfXP6RYKmSJWUrMq_v-zj5Xr9FGY=": "1222508000000", + "Ivzi1uVuPNzTa0ucIc2yPuXR465Td1i-7rCqdrApb8k=": "384615000000", + "Iw-9Qlm46XxFK3FGhX05R4b0qj_5DpLcrrKtX1RxL_g=": "491199000000", + "IwCGAAYNRaX6q8NgHqBnYOjqh9e0q7WC0Zy5SgaMvzk=": "3252778000000", + "Iw_TPgkqH25asiXc6H1lVBcHwZ0VKI7xlObIsRVNlPQ=": "384615000000", + "IwiFUuLRvXH0Cnf8wvFOki5ubqUDYcAcpakbvZdR5GY=": "384615000000", + "Ix3GZpPhhfb9VgSeahexHFiPw7AkACzHbJKDxws4MKo=": "385507000000", + "IxAbipgwjDb6S57ma3tuPHK9w5JKcUWsEBHsWzw4yvY=": "1153846000000", + "IxQUN2BiIDmmig3ZVyToWvFS2yQVyDBB4JWLt7VTW78=": "1250021000000", + "IxW9Y0ElbVCd9NiKhPdzlKOAajlHMsHc-5d9Csl5VkY=": "416666000000", + "Ixj3aih0vuTBt0lV1WRrwIWZUns8MXfzMjSa5bo5uUI=": "679157000000", + "IxseYG2_o4W-ljv3pqfaKOrRN9mIHLrnMnB2SM53Qjs=": "831263000000", + "Ixv5H3pyG2JstP_uSsO8r-hMC3STJuuEBvS27gAD-hc=": "461259000000", + "Iy219Wluw2MThbgO53s6_yzddL7DAHHHiOxhbwjRmBw=": "381836000000", + "IyAfO8YiUh7OtJA_lpTLjPoTU7RGHAeD-cPhIUjNn-k=": "388025000000", + "Iyewu1PczxlpCOMv5qDKFjgv9bswewQY_rA1Q-mPO0Y=": "466898000000", + "IyuJ6E33n8iUvd0hRPjFI-rKfnmwyfV_Nh5glOWb_RM=": "422196000000", + "Iz-QBfrb3KOOOd31c0jhO59haPT42YUA6G5ODhBZyAE=": "912791000000", + "IzCK1FzgHNQztllLF_JbuuoCaw8RtPsZK7Rwl9BogwY=": "381767000000", + "IzRguX98AUaKvuzPpqyKcHupFODbMmRiCuvYVpmsK04=": "473331000000", + "Izgm2WGeCnoUsh3vjni6dGzObU106oxGNALaoSqjfYY=": "465509000000", + "J-4kOT-Y4ybjyxlIdIjRwXY1N9ygyv6uOyC9YRjAKN0=": "499278000000", + "J-dJ13hcbJRWpM8YFX5_n4AIolDrCKcPjois2385Cvo=": "8221717000000", + "J-xCnLYZmYJUpM1LG5Al-_Ogd1dLxFRj-6PWbIGlhkM=": "385029000000", + "J02z7b1IQtHDpYy9O4UTqqXnC8zgQwLnGpBzGGh2AmA=": "8431026000000", + "J05PlmFNKH-rgOoIM-N1P1oKewqq0iWBgZ-jXl31d4Y=": "379928000000", + "J0ByhgHkWxPelnZbOxlA19Tsia1yyTwVYiF1i3TjaXY=": "5878654000000", + "J0eAplX8T5-QcmiXe2GIJTqIs3ADe4m4VqWsZevRLuw=": "499999000000", + "J1rLn1HlLWx_z7PWhvjtP6s3wZStg7RUqxQ5fQW5CrI=": "461153000000", + "J1taqJEZedbCpJoRrfa7FsgTjc1gtIEqP49AnDL0GGE=": "377509000000", + "J2ImgA-J0fVBDcCT5QfwBuwrgdwCTbq2O--O3gJQXUk=": "1881780000000", + "J2JkAF6l9VVavNIaQwt9Gfi8jF47efaa6DRSwMv8Wsc=": "462146000000", + "J2M9dChW85uIk65z2x5Zp6CdlbUuiYgX9wmEM1AJFg0=": "832394000000", + "J2RBm1sXmKeXW0MpNXW30By8S7YS1oUuESV_N3mnOVM=": "453928000000", + "J2bFSCyHPiswM6NRFt1p5R2qn4lN3TIx8HR8RZfCPLo=": "1154066000000", + "J2ssEMctYPfG1yzdApC5j5IYKbBGySo07bjRmc9k4Fo=": "2107971000000", + "J372_412xFSEYqVC9o0oLm0PZLDhsECiuBiA7ekbhKk=": "417589000000", + "J3EX3xqmH86149vPUFLsjUmCbflPjSk4ykMEZtdpVp0=": "384615000000", + "J3dggt0a5VOk1ljZ6lYREa_3E6xCGth8iVVLLxbDwxQ=": "460655000000", + "J41mPVhPkwoODy9laXQt-1kLZU-peFN4l2fK89tek3k=": "415672000000", + "J49qlQF3_5R2kz68ZBjSzvIDznkhYFBVaM1sPYoK2tQ=": "499094000000", + "J4gDhuknTT_E3QfgCkUTBDqIR2FVwYFMLeiMK33db1s=": "8355605000000", + "J5CvsPb-4TA3SdtKa9RhGQZQHzDQVtqHR77zyvB7Abw=": "379928000000", + "J63Q0rIotgdfdWGjhBs1Gqd3fjiCPlwVDd0wC2mLKSY=": "705863000000", + "J6KaEoKBS9ZfQ-nyTMteASKU16DAhJnrUY0hodRz41s=": "379476000000", + "J6qMLDpUr-Rsx0YnNMp801287585fX9ksoEqWgfZFjA=": "468609000000", + "J6roJ2Jd_p-jcJYaN9eAhUTv63CzTOm9aw_ozUe6V2g=": "477575000000", + "J6wwncHgTSMGNw4UR4tTyAClBN4thgr7rI13zBK66DE=": "398415000000", + "J74K_j-tWlM8pgbOXjLiTP4txxr93HyBFuHNGq3XBlo=": "391381000000", + "J7IUSw3f9vwPInbAKABpRBUTT-jLhL-s-RCjkg1r8gU=": "4122971000000", + "J7iSSpfNQ6YpcuBYFLqa6_t0rRv1NXR0Vl8eNmZ_0qg=": "383357000000", + "J8CLDGv77fYxdRmjFfrIKl6n79EVdLWe7lCvrcKD_hU=": "783595000000", + "J8Mi1OXta6CI6OICbk40axL_dul62XEgPuUDVtqVlLs=": "384615000000", + "J8an4oPEp_t6s54EKGbgtpGaIB5WukjawBVP2mk5CJ0=": "379873000000", + "J8qUbBrv5usChHIJYGf7IibNHh8F3eNb2558u9bTedg=": "453414000000", + "J8qWDfVC7bBVpWz3AdkY2ZTS8GFGkR9rJc58byXqquU=": "409119000000", + "J8tfxSDzdNRlDq6cJxgEK0FOx9OEs2hku2ALwixCFyI=": "384615000000", + "J9NQUt7_w3I9hRNGR5sPAQL_v0M6PEWIEvd1pi5KPx0=": "1270111000000", + "J9a5QsD_yNN4Pr8-MHTv6LV3biA7AV5RjBjtVfvK_GA=": "6101161000000", + "J9dUhxvr1-0w0Wz7OazIf0XQ8t7YWad9iz87N7sO7_U=": "769230000000", + "JA6cXeAITV1ubztt41l6XPjfka1tkiFZgdbwUKWihHQ=": "472453000000", + "JA8gMjrMQBrWgMWCDyLahZxZ3l4OMIioPmWfn3wZ_Nw=": "378633000000", + "JAJlR3Dj9_wLIySimqG2NTl4QnjlJpI-jllyAN88CC8=": "379260000000", + "JAnCZLLP1zwiQzIcgznui5A02d49KPRGYLGH-oba1No=": "386742000000", + "JBa3JQJXH93pJKZca2VmrQP-6JALVPrwSkVlCosZtE0=": "384615000000", + "JBlvoHHhYxVhjhsrgdHGrCWxsiNhCEVY_Q7WX2EfnoM=": "424550000000", + "JCGzKmhun82rjtqTJ0V3rlM0rL43cxCSQVYMyjHykvY=": "384615000000", + "JCb6NPFM5m8H823q_WcB88BkoVkVVTMwP1gsHV3vpR0=": "384837000000", + "JCfupfcgpY54-BygCBLO0k73vghSohQH8TDLkPcQprE=": "413111000000", + "JCgrHkAH8lZ-RhNUfkiwR8-JnHPStQVqBrX0SGwr0ho=": "463308000000", + "JD6BIg9YGkxg3yGw-dcXeLjQWSFuTIN6Bnmqg_LvBrA=": "1134645000000", + "JD6gef5P3qKqd1GVAtbgV0iuA9OEzjpuJ02O4kRSxxU=": "756683000000", + "JDSxssRfMtSixHMHkJu6DJhBW_jJ5iMPCv5rPjhxyJs=": "417630000000", + "JD_tx6QbPOOtcHKXiRsZyViX6zaYb5h1ewrfYcGHTCk=": "597871000000", + "JDjmKM7TnV75H2mCKYXsG0vZU-aIBhRNToSZqDp6jhI=": "1511381000000", + "JDmSiCIVbVxnIC0utL3tU5exNgfHgm8R42bMtO8huIM=": "462146000000", + "JEA9KwHWv7GRiNTvsXZEOIAsCJlkct4tz9y38bIsIb0=": "411085000000", + "JEBLL2n1MBO90n0L0aKxFjKvmgICY4aD4KY1Ask-_-c=": "19284960000000", + "JEGg_8Y1Z0ooZ4zW_b8o2KKyzIv9YO4FM1RKvu-e1Kc=": "1492839000000", + "JESCnsGdbRKuo4shN_5LStKQ5zk9TD6na9NouFKt-I4=": "2696702000000", + "JEUOJ1OiCG8ay2elNekqXiKc9YZLEA0FLhUrYVVbSU0=": "790441000000", + "JEwpdvN9DedI4TT6qdA95KmK0oCRJzJtrzRgfDOa5Uo=": "8076923000000", + "JFNzBvsUL7fDjwxoZOtiEJoPF-UhVyPwIHGpmBLki1k=": "836357000000", + "JFzQfucmETe1D0aT1WRgmBLSKowk8SWSXiSycPD6f3c=": "1421186000000", + "JG5121CBzIgdvfDyPrJvcxEq8Wzqbw6Xit5vuY1VLOg=": "384615000000", + "JGHo7vuWH2oaTZgT2uij-E4-pxfwuuu3vXf14n3BkAU=": "3798442000000", + "JGLgiISYFpeJb36sfNTNKZfmWblcaVYbXJGtUzMOEK4=": "770890000000", + "JGPAM7lJDsiwZ98jobzay2YayZdpKVc62TBKx8BYUYA=": "417634000000", + "JGW18YwtziK-JQjYT-qT2CNZD25NkcoDveP4Jo8YJb4=": "394154000000", + "JGWmX3ZPJMIABZRW8VPkYmZTNUj0IOLd-bLtYCzqPTw=": "1346153000000", + "JGcNVA2auvJ9RO9AGEpD8NZtsyB075bIKRE2cwSicV8=": "3846150000000", + "JGvSh79MKkDPr5K1VxB72B5io-CwWV5K36K9nFRJ67w=": "456843000000", + "JHDmv4pmk_tGFUfs64DHr3pAo6uw7KsRXugJquRWdRM=": "416408000000", + "JHYOaerbdBoqHTuPDH42EwG0ds_pQF8-1ctpcSW5epA=": "384615000000", + "JHa_tH8-Bmvys_p7pDIFV8w-vaoCwJE3dOXIoTe4UX0=": "499791000000", + "JHbS_mJSZoeyDEbvwqyuh9QQ2GrOAI464J2TaQ4ztC0=": "3412149000000", + "JHzNaLgQV4GZJUahPCsdlNjrSD-178cmUG-S1SXRtvw=": "455600000000", + "JI2ku4e00hQNHIPtZKQwppNMGj5JaO1FQCfZSzBBglI=": "2097400000000", + "JIEc5L97yJvuOTODJtQR9xDUiwvQjC_XfNxoiIzMGxI=": "482124000000", + "JIS5-8rlEUJHA2HAPamVvUnk53aAawicimeZOVNuHyU=": "377792000000", + "JIWm4XoSL8Zmb_46SRhHPBgbFbeFlA41RV2ksyDNvJw=": "1153846000000", + "JIjC_TWGGDZUFIjOmjOai0w89yFfeWj8DJRXogp8aCs=": "385509000000", + "JIvIrG5BYdVjOBfNg9TnJqoszmj12atsOUni03dVV6U=": "842892000000", + "JIwz_CYywUpTQgv0OsTnbkCA2MdrsjUbEqZatqudCjE=": "2083333000000", + "JJF_RH1AR8GQKuIRY7NQvaaQNrDjpd_nrxgXHevshP8=": "784295000000", + "JJ_de4ALAf8Y38eslCTu8SroOMkMHObbGNDYE_3Vo_E=": "1623129000000", + "JJc-cVrPzMwJWBIPTpc_fp8g9BW1V8CrSXPBqciokpE=": "1839994000000", + "JJy-JGxjv3F1pdWxdd-cBqo1PctUj37WUNYG_vEm4kg=": "3223643000000", + "JKBZ6HZF5gpCMY0UuMmxVPgImTgoJa2sUrdsY_YpJzc=": "384615000000", + "JKq2oFzVq-bRkdSSOgjzjwHs-uojhFWw4PGpmwdAoTE=": "921977000000", + "JLmM_RuL1rYXVxk1WA5T4XZq3cvjiLFoKhfDo_4V6lA=": "482708000000", + "JLubX1T0e7-ZNmw6Oh7xVN9CYvCbMwiZt1RdYPCexCg=": "385509000000", + "JMUqbjRlTU-dRWqMNbiiRpe_ryLJAjxOqFNc3xVMPP4=": "724718000000", + "JMisz-iZmLc7-cnRX39DskZiWqT_PVuhRerci_6E5Lk=": "458584000000", + "JMlJ6zuG3rbYpaYmLI9WQtIkA4IbM8rlkprA0DZuFdw=": "384604000000", + "JMrf1ix7MyFw8dpxX8YUtnj439CsIYR_CinROo5xMIw=": "2081777000000", + "JNDn06ugLYj-7GqwxI-VRe1k1zBO4sTXSigfF3HVI78=": "384075000000", + "JNkKU2K0VTV3vrMnLbONxt2NXjHlm8aigN8VZQOFGYE=": "2730885000000", + "JOVuop0-8cYHV29Xf3dKDj61qIvnMwngVaxMxFwy93c=": "7500174000000", + "JOrXdR2AYMKlNJuyTZrkFgpkO9NyaLeVKOneFP5P9B0=": "473848000000", + "JPFtuyr-1_EuASw4zXQqvaQzFpD7r4ZdXjX7nuJvzh0=": "388083000000", + "JQEdS3CyKppVTrX68bRka-BWXqIFSqVJhfnnTr-EQG8=": "411085000000", + "JQdv1Z54qmZd22pSFqPZXonCPvTzosA9uP3xIx2HL8I=": "390712000000", + "JQtWAwkRawlsv6TiBYGRZh_uTkWBPKfy6A3Shp4QmhU=": "2337612000000", + "JQyl79AECqnk-QkISoIwE0WKdQP01XGJ8xSZNBt-38Q=": "1779314000000", + "JRDqxRovkzL67FHP8pAbGKryi_KaFKR5OG3jnYuXtXg=": "404548000000", + "JREPQkrK1dPZM-EGQq4fVVVR2K2ir0HAXytv4ImFjpw=": "769230000000", + "JRZxRkQdZmNZ2pOmGZ7LozKMhlFBLdwSPXhst2NZpkk=": "501244000000", + "JS9QGtxdKzwQO0nevX09X6D8k9g7hoW3zCT3GA3gObI=": "18514524000000", + "JSA0zC0P2Zo2w1a_35na9CWGHgEJNd-Ixk5p1x1lkQY=": "1145412000000", + "JSYYTD0jmrm9SuV-_YU17h3sp1fSqAngt-tDJJ8VGEw=": "470057000000", + "JSlBRRjH8e9-cJXGD2kLDNF9qzQEENV81WYFRGdRQfE=": "2272727000000", + "JTAWImvbca-h3nXf5qzPqCI7GS0PFGZ-U657gbazjNU=": "385387000000", + "JTW-yitxn6WHfTqWhtRDsGvcs8Dsz0KzWXE_CTBoPPk=": "2088168000000", + "JTahk5Mrc5mJ_nJVkKRDx9cTAHTGOzpKhLY96Fnm290=": "4512680000000", + "JTb3pLAbbKckjXPlgdn0mpYNgWVn4Twswexthj-GJtM=": "378341000000", + "JTtiKKKi7UqqqsAwXy3w7HtiQ3GnwxiW1odHHlUYjiI=": "459069000000", + "JUP9sPMDJ5YhAhFg2azfTXJsdkPNnfd2-Sf8Czq_aCA=": "378743000000", + "JUkvyWAf0LwdgqIjUibjKPQArlVIMU9aM5RhAhPKrRY=": "1683671000000", + "JUp4bYZBfDOd0v5dkirq5yeoVfCXHinJaHJDn2JEL6w=": "417630000000", + "JV17pGUJ4TmmlYTl4z1tzKxtVAIf6PgsGW0G8VpjrqE=": "815121000000", + "JV1RNsQna4i7qtfpUy7gY_y-4vwcP4n71LuepWncEqc=": "499624000000", + "JV1exvMsYlcIy7Y1mDkSuwCxo-vwpXfy-GNE6T6OxMU=": "385507000000", + "JVL5D0Lkr39RAIOr6TSJR9L8CoLxrsk8zd6YnnHpwLc=": "387115000000", + "JVbA2Jlu-EGg2VthSv99duUw5z1iM3er7vWqW7eo2IA=": "482124000000", + "JWWwm1TB4Mzr7wlmGL0dQgiSVdxLq2no0TrwsdFBClU=": "463042000000", + "JWbhotw8jBP71kWWToHcvqj2WhAXA1HGepGUWSZVJQE=": "1922080000000", + "JWmkYvRnmLSR58T7Ls3zl1pUkVPkmd054SeJLKuGJMY=": "384615000000", + "JWzEdHRUx0EsqShrrKtZp1AC_6sZCkhMI6SpU-pKnUM=": "1537170000000", + "JX34s-aT6_1yjEr-jwkkN3Yhnzf1ukrsKPuuvfpXpX4=": "378404000000", + "JXmOOcjiKviwqElCGq0XIhqbe5x0ZVED_DQ-NDi2NCk=": "772667000000", + "JXnsfJH6dNamHKxUdmOr88Y7vFnlsOTyzY_m-8wYV0U=": "1535870000000", + "JXpyhIpT79hgO4CIw8kgkvagAO0NvOhja27rHm2jDsA=": "461822000000", + "JY11JnxyRILF5tPzLuORMMLSa9MlxgjRJV1qFaVz39A=": "713191000000", + "JY8_GwmdGLTLzzYHgF8uaZRMtMbYgBqpqNC-8XgzEUs=": "412344000000", + "JYVe7Zd-Js6HbYFVew_e0Q-pJ579fBoqhOQErppnlvU=": "11538461000000", + "JZ-ZBxl__fnRFLjCEXzWlMDWv0cy4Rw49cj_FUxUhjM=": "3267297000000", + "JZqxpy8SI1QJxkaNSE67uRpOyBEfXWHG6M9k4ZOOBVc=": "1258303000000", + "JZzw6aW2IikwdQ-QRyevObf2IWX3cXo_JfL0e27dNKY=": "1510595000000", + "J_afQ0duO26Ya_AIQMR4hJGXTNOndosmZ-rb019xwR8=": "4487590000000", + "JaCZa46xZlRK7k3JEp3diuuvDoY0e8yglwFG5TYx3Mo=": "721753000000", + "JaEi8ymsp34bodOFV9aY1yszvOqlBbBSc2fDIgjDk9U=": "2129615000000", + "JaJ1Pknlcm6jkjN6voMb0cu52Txxkr0Ngl3XgVSS2Ws=": "458012000000", + "JaQXcVu7p8AKINNuFES7U1nIrS7EbqR20nkWdJs4xwQ=": "2025945000000", + "Jaj-7rvMfFHGEMrkDU-FsT-l36SIJtZGiPYHMw1QAZA=": "732498000000", + "JaoDbxwhRl7B9S1_s41dFgogEszb3zLoIiCCZehmw30=": "405357000000", + "Jap-z1seVj1vfX0kuAotOZJVu7C222NQ08D4Y4-gxt0=": "838388000000", + "JbKozeh4T_cLSXY5Y5Dufx42rvDPHcgVkgTxjw5mjcI=": "690971000000", + "Jbe08Ea4osT1vlmRJUhX2aKixukbp9K8UjwqltmncKY=": "385190000000", + "Jc4fmBaPAGd4896dlzTbUdSjUjrOtlGUZvx7NoUl2DE=": "384885000000", + "JchMw63M8aXqJgwP4xGPLFqwwCbFHwE1T-lmR-r4Sho=": "1089197000000", + "Je6365ozrXE51XLlc_F_CWSNVnth9z8P_8yj6RLI9_c=": "460586000000", + "JeFZFG62Sb-55z4qTTRvtU-G6oU_VhL9vvU4Evzg6yE=": "3855050000000", + "JeRFzcYyQ0fNQ24C4GAZ1CL9pZnqI5onRRRa9YVHP0E=": "5507947000000", + "JeSKUq3zzjiiGdJeYjxQrGBxJzc5PWJzSzsMa_AA1fY=": "834903000000", + "Jfhnm40YODptGc5yw54-9mEA83jyllhAmUeo8YuxXj8=": "457150000000", + "JfxZ9KxFaKhhM3-WDyXRibMa4J_6y8g4syRt1Aovw8Y=": "541666000000", + "JgG1iPY6P2BU4gve0mdmRWE1yu9aib5haSp5Z1Dve3o=": "385505000000", + "JgOtP9-uvcZcAT_IRknKIY70cSSyr4tCdZSMcNvQ7r8=": "469173000000", + "Jg_j4kfUxQP-u4a0MVdWoe34j1wGdnKneVB7gey7Qvg=": "405357000000", + "JggjQW9LIgeEPqScBwOFn1n2AtCX06t-ViFMkT_umC0=": "389973000000", + "JgiMwxVMVPbsmzSIDHNVbN_AXHwScPGR_fhJDLYlQPc=": "459228000000", + "Jh21N4jpiLSDZHaHf3OiSvnSalEb62hdmIKTN_-GaMY=": "730755000000", + "Jh4MMb2yPjOhMynlpHQoLaWmsYJ1bxTfFzUEQW7Pt_o=": "383662000000", + "Ji61jUxRRxFlkh5ybPpWgyaQmiR3OpuOL6Y-SYAQMlI=": "385697000000", + "JiiXp9xyq2eUHRRvhIVQIfQQmj-LVRp1SC4XUEmTjjw=": "3999999000000", + "JixaCOxaxf1eRFHDUZuCeZtd6TT0QxarQ6TpESgkz5M=": "384615000000", + "Jj1jsXmmRNXc9WVGkawGb-RRhddyfcYjUmcSNM0bdx0=": "447938000000", + "Jj1yzayNxAk4rfLoInKBvIxPyeknhRvjYKet5dnIdkI=": "501776000000", + "JjkgHS9-ZkLo5VLHY9l9Y-bFcR6TvLWfWms4pZw-RC8=": "1348026000000", + "JlOubNdynh1X7ZTN6BdtiXrka9lo6f92y3eXycQb3cw=": "1696834000000", + "JluZ6BbESTHhItTmJcwOCaIez3CiC2uzPqUn1LZnmok=": "454545000000", + "JmfM2ZGvFdHC-S-pXPMaMYWujVWwkUcBBrPydTiA3RI=": "942307000000", + "JmkZYEZJSAoiN2fe2nEaPqkfYbmTPD0WCEn-qwDozfI=": "2021749000000", + "Jmy-wYbznH461Qqi9QBcouJl7V2fjjSfg2jEUAOHiqI=": "391797000000", + "Jn1mFctqHr4SMdnryuxi0PrlFL5T7G2wDTYFavE_JuA=": "385559000000", + "JnBIiNlOU48vgKKWZ3pXSl8UKDH7NW6NTTyVn0caX_8=": "390238000000", + "JnJUBrsyWgthJ79OVY20hxI17WjH0JvfPCvqiepSEWk=": "7692307000000", + "JoGz9szMSMyOY5F9Pf5cdFmFCQZzREKCzu8IozNTYXA=": "385505000000", + "JoJR4aJJTUfcxnH04_1eFUa8m9g_XsZ--htvwEGtcLI=": "571845000000", + "Jp0Ji-zCM-6Q73kRlMiYsEPg3zKHx_N4RYXVcl2xu5A=": "5833306000000", + "Jp3lHGnyzKoeL-6NvJbPgYMBZW2nns1lx3ak-gJF78k=": "2081275000000", + "JpBIuUQ20C6KeiPKynj7H27lv2BnsljvNI1j8XKQ4h8=": "2088182000000", + "JpNX0MDCTF83R8sGJp5T6TyGe_dN4cnhivJXYt3XSnc=": "462889000000", + "JpSudFUdqIbDZyHXrJGMyHQildjhAG-wlNwjhdiqD5U=": "3773452000000", + "JqTYMEkuLXPSMnbscJy3iQJQBPmIbRsIIfneNFgqNS4=": "424920000000", + "JqfgiVeVjhaqmuYqiWwoxx_S1SaRwoqQRz8-dfVstX8=": "384878000000", + "Jr6bNjSpa31Vhw68QmILNzzvYJKkkJwOtFig_P4yikE=": "578548000000", + "JrX8aZcMZWnQIO922ck_VK1P9_Y8QJcWBp-Pa_8UPds=": "5006075000000", + "JsKbUIgOsM6pLTicGxDVs5jUPPNfXRFzjxS5c80LIcs=": "1041660000000", + "JsXNCVsdnlowhZpThyIK5db2MGzWA9x-oksnpObj9Gk=": "455743000000", + "JsbMMiSnwU_ThVkg4GSBeqTlhQkIsGOeTw7vkuJhxyc=": "1923148000000", + "JsmDARh7S-qezdnhdrEbdLtfejo3xpJcpN9k9VIH_eA=": "414997000000", + "JtfU1aYLI96W6ZH4_--CFJu40qI_Pw-KBlEYRDnw3d4=": "1692307000000", + "JtoG24dKcnN58KJGLZL-udstVimNhupueDdNpRdyRYM=": "386077000000", + "Jtr731I0AlD_SLms2pvQledrWG7yHugSY696vTTQjeo=": "385507000000", + "Ju5TjXr6DoeYVWPC6_Ja7QV7-94IB7Tg1TCSnQvyUnU=": "384615000000", + "Ju9XH74j3k9Jli9rNZ2f-e5imX-jUJZU372W3wdAXi8=": "459590000000", + "JuAmtMbHOYZGeI-GhazluuZpHKQzMAQEuwfa0WIHR84=": "376805000000", + "JuCcrbtw3U0sklVJ1MGoNYLIguaikqRYVjPEY8yTHQM=": "911799000000", + "JuLfxyItWKWe3-y18nv8PXc-VEf18KzN56uJ-JxpC0M=": "405229000000", + "JuSN-0P56J57kI-rE-JpnI2wS31GJXJa1o3AGOxyCD0=": "382717000000", + "JuTOmYIci-a0_eVyVahYQyxw3at7aVtXPqqJw6mgaGE=": "384878000000", + "Juj08xdyc72IQxM9-SZygjge-JgZUO7oF2UysqHoMgk=": "22871716000000", + "Jul33G6NwHQ46GZd9nq-qtA6Hd9HjiOwFDZtfEAl7fc=": "1927547000000", + "JuxKmittEpTEmAWoaLAfROWQ_vbHwCKZ8WTrUNrSwag=": "454545000000", + "JvMacH673a3njqNodP2toot6wY2ieHKP9qTLcq6RMbg=": "465122000000", + "JvUlXuIT3zkX_qITQvEM99IVBlvruvUBSWVlDkZwKV4=": "384769000000", + "JvcsW23BxhyBCR7Me0Yp5ZkrZTy_oTNnfAtEKmbDxgg=": "385506000000", + "JvhPzOTYgB0BT60dx_bKR54vZizWFiuQTDoLejs3y4w=": "455249000000", + "JwUDIpaGHXhRtjVOlpp4ahQ-OIEadPO-AwNBNyLaeUA=": "4559898000000", + "Jwj-1f_mdvad0xCEZdWvFjwl_EvU9k8Kj3701bJE7co=": "459646000000", + "Jwy2w-dnH8pc_cBbjBEB4WJ2baVXyX1jx5PHeE-qdic=": "4166666000000", + "Jx5YKaLadI_SmQU82smZzG0AyTqyOkZg4U1llQjo8sI=": "386305000000", + "Jx6P17Bsy_RwGbMhFJBCHx8hZsor5P-a3-EE3aGfddI=": "961538000000", + "JxWjJucvlm6bhHHu9cIhtL7za8F1ZJ-0Jf0X_XwF2WU=": "384615000000", + "JxpErdJvhwQvQgHSrf4g7wNbw_oehiok4oeE5jEM0sA=": "499999000000", + "JxsvQb5WJNIFgqrqVuqdd9OaNoi7P-9VQWeuV2Z9ZEM=": "5370060000000", + "Jxz_plEsq5PcWx8-mNqSUTa3Wra9JnqSZA8Zf5BbG3k=": "1198869000000", + "Jy3l3DjwIyMsd9acEdLcH18og6yGj5Tv0LVuIqiKORI=": "760571000000", + "JyBMCpeK_BJyhCtSOdgjfAH4ykW4_zweWBwY_VdUNtE=": "18500000000000", + "JyXJrfuPpemUy-Vfl65KAmFrV3GZIdFihP5mhAwh9pg=": "567449000000", + "JyqO4wo9Xz5eb-mq_1cdaOLivgAF8zXLXt6U1oFIwWE=": "450689000000", + "JyxZ1BMVDP_cR75qW84vu-0sj_--GzkmXGZ5J3OdIyw=": "444887000000", + "JzWZbydPJp4H6BZheSiPI8Mv-TyUhxhIWVqbPaZEbyw=": "976492000000", + "Jzs055k_qwHS5bw6QDxXI0hwJbq5E-dDTxDqqOx3jko=": "909877000000", + "JzvdKvp9cbezGb1sbr7KlSv2863QUo_7bQqI7tTRoN8=": "376125000000", + "K-IdVosSTgi4TuN564wIiqJoL-l-d_iSFf40Gy56QPY=": "416666000000", + "K-JB_3UAPgNt4zL0deKf4jCQPoIFRn4jIB-UejVJqGA=": "1249999000000", + "K-QSaYAYs2MnWDNR0AwoJqB91aOe6ILNN-cMwa8vQ2k=": "1659200000000", + "K-Yvxs2_07mV_Nv4wcYED_jbo8Bar5DI8Yp_2lybi5Q=": "385510000000", + "K16AaUs6p2CD_dBJdUgI4pdnGGlM9TXoo4VLfyRIWwE=": "381805000000", + "K1E8H8r7i1VUSZl1LLMb_jzjK17uAxA1tnFdSoeOj9I=": "1221746000000", + "K2Ck1ml_EvHJQ5rtvNY1U57XBUEz_zXDym31JfmWjSA=": "1534635000000", + "K2KEmHFxhx9bnfBKJ3Zc3xMN2FbwM-P-9B-Hcxnb7f4=": "1244967000000", + "K2aTcUQ54Q1ijhHmwRLurlOS6mjwxqRW2BumZ15dems=": "4461107000000", + "K2lHf7V6GzwJ2Cnbb2GsAx9vlpWBUFOTSvrptcJBuDs=": "1154647000000", + "K2sNxlKPVrf0jUE2HfAV_lqU3Vb4mWLJwr4HZ936QO8=": "385506000000", + "K2ytMQuzCD1hIf18fLhdzZZWp5di2Qh5qqhbn-xHXZc=": "385506000000", + "K3gFnjqS2xf45XCiMGwDQ4tOLNE5mZnwLsZJCisZLZU=": "416666000000", + "K4-Sob3R3WIBg34PjcCazBlzqUQOu0AodZHD44s2rcw=": "3831356000000", + "K46cO-xDYDCq7wNsDOxPnL9HsmZnrAwA3SP0-zHG6kE=": "7692098000000", + "K46yOQnRY6sLyyfE8pxNEChPShtDDlnDSEWsPMk7vVU=": "391701000000", + "K5GU7vILVi6xwRJ_8bhjHo8_0We-p-NXGK5_gAaOqH4=": "456369000000", + "K5McJ2viovUWs595WBj0tDxcDbgp87dspaQIbOlaZos=": "453760000000", + "K5fppx1K_4nIMGAjUZZdRUl8xBoPAi3V_el8bDuNB0A=": "3539830000000", + "K69wYbIotTPQ2aewdGqkptoPPJLfXKXnCyJTKTZFWCc=": "2225295000000", + "K6SrAPBo4t5pcNI2VkNQ3Qq_SjHT5KJVZZTAw8fpr0U=": "1923076000000", + "K6urZENgWWlLyN-ksCYNdlV_WIMggHCDWmMoXGdfd2o=": "423076000000", + "K7i8GXcuuigg7pOFFiin4TbKWnlq_mGXcNRhGBijAFA=": "417637000000", + "K7j9-D31xpE9BfiHsOgLbmiH3F4ccd6r_JMUwyz6L14=": "458333000000", + "K8Ft1ytQQv5gdWzAGWUzqtB0kmunF3hqnOxUXUq3t1c=": "657041000000", + "K8XFEaEDAw76K5L0dpbbRe9gm6m8wUkREe3xSIyAQxc=": "489847000000", + "K8m0iqvQfWNzdValrjlppWV2dFX3BUQbkY1PhmWbe8k=": "482269000000", + "K9rEVOD6ttFv5WoGj01Depr-oGyAtRzUAp0h1049UDc=": "2305117000000", + "KA6s_0z4YjGEPLRLNKkfgfwSr8N_MInuqZ_TcR6gGeM=": "502779000000", + "KA88KDh-wRKRwN6Ko_NDSvi8Uit77oQGcgSQjEF2TRk=": "467149000000", + "KAH6qSotdNKcbWeK4mf6OEuHDO0eZASGtAD5c-tg97g=": "457200000000", + "KAip4JbGB1JGhBJSFP5679lDWugFNRnpi_FQu0OxQuU=": "382394000000", + "KAixrst_AlC_0zUOFfvVH8bfobkTRh3Hs6PzhdiyrCI=": "577623000000", + "KB4pdVAdqeztgx5R9gnO4YJKOHqZ-0c7-Hx1yIEZ-EQ=": "491734000000", + "KBDJdcNJVHwmXrrBgmokpA0pVe7f-33CRqDzfO4BYtU=": "500099000000", + "KBHUPaMW_LKaRF0PAvylFmbZhW9651FjWTGBjcVv4i4=": "1033670000000", + "KBW0ZGnwcyZJNMa_yNgAhpBHxnuPLoNVkMpUCwflEPY=": "2567811000000", + "KBaMQzlJm7ECrIfA0bz_Q8K3icQek_cHbiYMLjhcmng=": "415999000000", + "KCPloTAYJL4rFnhF5JamX9uPAgRQEvFmZzGe3pIe5E0=": "384615000000", + "KCS2852VjwBqaQ0f-Mf1dJacg503oGDiWQzEOxuQj7Q=": "3496875000000", + "KCbTtWL3o8zgt_NzAhmvroJa_q8v6xVUdQMbyMGnRwA=": "466799000000", + "KCcN_TQXoR_M2tA_5EShQu4VsJXIv65uoIDIxg3lCP8=": "390901000000", + "KCcuhgUeWMhGro715l3hdezs-wtKg1GuhLOAT8TJ7cQ=": "390743000000", + "KCspfhgyYTTqZYwz9QQbUg1VROI66L1eTuzV4l3VDrM=": "385507000000", + "KDAEkZA0Thl0YT7Z0coq9Da-9AGniL-LuuZl814xhc0=": "961538000000", + "KDEs5q414Fy7t6suQtD5nRLpNmuL2tINqdZBDRJY2pU=": "103431730000000", + "KDJhJAy0dTZWZ53dmfT87IoCbgm7fmha8ch3pYYsjOM=": "530056000000", + "KDSG5PLqUJi7X5ieUwcE1fgCv08jcI9ACFidpxxSGW8=": "414831000000", + "KDoIQbAU6XcPZbc2eMYpReCtkW5JiTG0dmidDQr84ks=": "1249999000000", + "KDwAgXSaDD99NPVmE6pedqt9vzzXBQIoVIi_zpFv2jc=": "961538000000", + "KE7NGbq8742N4xm4CcEXwaHlNaoPBd2StxLIzk-Fthw=": "426919000000", + "KESZvAZsyV3xqVYdlMTGh1rUMNQvw6X5Kr09qbzxjmc=": "680724000000", + "KEid--EUXZwnA9RRIEdhuSo1JKA7EeMCS6hFldkBOJo=": "384615000000", + "KF2xVFBz5-Z0Fd_eEAKZC9wy8Drox-BKhuXmXzUVBFg=": "385350000000", + "KF6EedcX1LIFCjSnKB4rgCIJ0srHV9PAOG4C9K8I3Cs=": "447177000000", + "KFP3p7OR9vuRoqhPcHDNoHgApjbFxQTryXTnrQUFJck=": "385510000000", + "KGeyr_c6cCnFk5lmUdHp9VFYkUlwIOq-lGsjuywEl60=": "387815000000", + "KH3BL8yGVs_oAtvbmnnSNd148YjK5G5wowJM_Qt3kiI=": "3846153000000", + "KH77z4_QZ7T0G1NnaoTSyPh9fJnBhYjIOLQkqWJ_7Hs=": "454708000000", + "KHgTQHJpR9beZbgb5Rnu9DQ1Tr43X_GHQ2jWC8X_XVg=": "385507000000", + "KHyboQzGtfVp6PBdH7elrSihFAVcvDvgfzPhfNhyrFQ=": "411085000000", + "KIYdhoBx93u9D-DVZlwsrbXtYAU0tmNbp9JAi5z5FQ0=": "4233705000000", + "KJ1WIZcPRmlxFBHrss0OsApJj_92v_v2jV1e1WKe9_g=": "381436000000", + "KJ23KbhRiKH2hezbfyXKzEI_Y1WaiFnVLjzgAJ1Nb9Q=": "384615000000", + "KJJ1YtvtVZ6gOZK6KKxXXDSAvfPea5jGov5x90j_rLE=": "1515670000000", + "KJP6ulpNfjKvIqGXJV7s-UQyXe4r3eU-YdQg36dsEcc=": "1282693000000", + "KJQ2xdhQ77Bb7TQq9FUIq76lLBppRcNoU7myLelVfWA=": "3278835000000", + "KJS_M42ow1QdG5WFgC2gg0hfLezujfikr-IHk7zNDIc=": "3812860000000", + "KJvaVYYO2Yyj6cdoKZroD9VGa8CBg4W3Gey-Hq61MWg=": "4173313000000", + "KJxJTdetZU172ukdkJfDKIdYBE9hTyGJGiD4Z6-tr6g=": "833333000000", + "KKYF3UHi8mdWu0uhefKTl6JZ3NSCvVXHYZdNpdOUJN0=": "404478000000", + "KKyQcqHumAeHBZG6wLmpQV1RxqevvB-HZi4PHhWdF5Q=": "2337074000000", + "KL8pTzKuWB33jvAgzQ80EIoIM7ZVfLDI_daw2JHju4A=": "384615000000", + "KLMkyeSckwj51BzrUIamG32sRV_eBlPCJA58i6y1lVc=": "464111000000", + "KLwvfr3REbst2wy6h1VkNMj7JzMye5VazWXNum2s8XQ=": "385800000000", + "KM0OXk8lkkjZEpFvuxXTXx93BnMZMM_5j8qit7SgXm4=": "19028823000000", + "KMCCWfeT8DI93PD2SNyOzI_3LnACOojtPwzS6aItMrs=": "384615000000", + "KMWKb7ph7V_-tJTjOnq6PcU0s0nqauvh1in4uuoUuok=": "405846000000", + "KMxNe7J3ShcGQUEx_NsykJ03uXdcTEzU8xxlM6uuxW4=": "1905685000000", + "KNP8etG8XI1njpKl_EB_8xr0AwF9SF5gAsiwRZmIfg0=": "578548000000", + "KNd39ZcT0Fecrdpvqfi8aMv0T7jMkUaRTWKYQT_WGPc=": "1187125000000", + "KNjz7hsmcFiTjIaOiMYkG-ulXa7vpMYYoRG-DUneR4s=": "768419000000", + "KNpHDIQPL9DSwDiR5eEF5KR1_lwNSUtyLMIy_V_cnVA=": "771151000000", + "KO48-MjR-GDnQRvsSRjWac8yFoyeKtM7PLh6X89HkO8=": "833333000000", + "KOLnULirrMIH8dIBNbGedcx6-T_AIHvngwe464dJ81k=": "28636363000000", + "KP-yuiepMrU8dHDwQn_5D_9TsWijR69Y65e5fdldvH0=": "1219925000000", + "KPHI0s8j8X1A41ZEyKkjLlhC3RfAHA1acB61r6a28Oo=": "682587000000", + "KQ77d3E0pM6prQ33Z3LnKcM_ZkAOdRea9m04gwMY8hk=": "378561000000", + "KQSjbu4i3poxSwbmovFyHwhL0dc5gKspsMfcQy7D8vY=": "393598000000", + "KQdWY3WnXR8K-jVzzJ54hpBU-spGODGLBSJgBkmBVZE=": "454004000000", + "KQgYHNiKGqIA60Hoa8EEk0LY2GwdYhN0f5lIhIoAWIE=": "1181217000000", + "KQrPOa22EKRsgWAfJFfehgqkZAkm1gt-ypBFdbuIZCw=": "840617000000", + "KQyk6nQodDvmh5Xe3g785xMd34WXrwPfwl7x73eHhrc=": "1730110000000", + "KRawR0aIGgAMn-JHnwHOLZS6wK4QMyT0kqEBvBYDmm0=": "769230000000", + "KRgv_Yf0pzGKJRXPkP6eoD505AzWSlUdW1fq8MRf-6U=": "1249780000000", + "KRncOv04k1HOuN3kJUsf6Y6NM8enjWOPfg3_RJfqB4w=": "1927537000000", + "KRpxhzj0xOPnP-caN3ob8KffxudKRaPS3LvpaRb8r2c=": "3846153000000", + "KSIoTO3ttzM3PEzaZZnfnXdNPdg4KA94-pnDMvnh-bk=": "767524000000", + "KScgGopW8p7B8GTwD22hc2IdsMjtUsDSSMJ_OHHjYh4=": "384615000000", + "KSlTxd2rRVusy3DoJho2AMLpq9UFtledh9GuE1Offrg=": "499999000000", + "KSp1nLY4G-_F_pAx27098hbkW_Hyg2ARbHkeod062KQ=": "462839000000", + "KTCMFw6_lHC83NUNMgKlmoxRSyRB5ox0uO2PlH7oEPQ=": "416666000000", + "KTEkUlTC_u7JCfIYB4Hjt-tQkb0YpowA7tfEZtlCs48=": "384615000000", + "KTxILYqEX9ajo36cMJOl0I9rUAz4XAZptfGaCzD06Bo=": "4730769000000", + "KUB02ayzt9uJodkIqjTpn_UhNsA77GGgVS5RkoJwaHY=": "381938000000", + "KUeF0Qk2M9uQXsD18JLz5CLsam2znFKIUELHuKbZ5tY=": "381566000000", + "KUt3aMV9bJzvAVwraf6NvfCyYIjw3pbn8pKNamTyQQU=": "416666000000", + "KUzqeU2GvWIgJNKbWXPAQt2pFRsZ5zwFqigFiJlVe4E=": "692860000000", + "KV1Rcwqw0HEpwn4CV8YGQQGBrIosZIuXppHtFHWyD7k=": "2817861000000", + "KVN9YLnszmT2Isyw9WNgidvrw3hwN9RXiBJym09ojjM=": "866755000000", + "KVhgDm-VtpGnhc6eI-8eAm-cQ4DudqQznNWc6b87aKw=": "4230769000000", + "KW0fwaIdzwChjDZvXS2cmIv58iV8NHPnsxO53FDFc54=": "1684891000000", + "KWYrUyPjxUQXtocXfkQSPPpGQSAEpIWXjxIzldYwpg4=": "454743000000", + "KWymtyquins5JNyHzk_NYuGdLYX_xSIysbRVO-HKfLQ=": "386296000000", + "KX4oo7RJJqejyV_IpXFWzqumFYEdbfpoZoDvTH6s7I8=": "694666000000", + "KX8Vc00sZdjzT2ik3UM2Jffg-gUhatw0iNLME9MokD4=": "457766000000", + "KXDbi0ONu0obOpa7iVbCm7CNUvsqOYYx8Qh99RRad-c=": "412463000000", + "KYNi8tR4abUksGHWbjwj9N4Lg2A00M6Mk0gzt8G3sUM=": "944522000000", + "KYPQyjADUkxDTKTHrPjyaFefsQyL7YlIJOqK4b34Icg=": "1671920000000", + "KYXmoSbeE4EvbjRWpsWk43mB9nzuabE7glhboJGZErU=": "482124000000", + "KYgdcHrC03FqGHuqgLIQDOO8b5QHuOY9xT-7BMyUMfo=": "384615000000", + "KZVoF0J4Tub-Kz5o-GpeYqK-0e7h1qjqaBAx70Werc0=": "385137000000", + "K_UV2b62OHTAtGLxsVQ51CLqOifJco4--THWvzaoWmc=": "396931000000", + "K_lB62kLmXYFPqfjj1WCpsofYhQMEsT5anCljn-tTs8=": "1818181000000", + "Ka0wisAqUrFYHrYI73G0QJPIc3l6iUeC9BE1BCzR0go=": "1655674000000", + "KakKIcVJUWEKopNz-6epDFZxF_q4MWk20L_Idqm1GOc=": "839770000000", + "Kb1p3fFEOCLy91yOkF7ZmejJmgiX66p9ZbBdtaOKEWg=": "382394000000", + "KbGjzt_Hoia6dESRDFgv1kYGTPEGcZNGXqGewLOrU4I=": "938839000000", + "KbIcZKfbU44RRf7hwVfK6t_OFkmzr7Lts7WmMv6ybDQ=": "539898000000", + "KbpuVYX-O50uk9ygRwACQYyd1mR9Am4xpL5scgXGGDU=": "749999000000", + "Kc-PfKlLyyugU8DJC7xX7AX_FhagoTh1y6W_-GNLp4g=": "453674000000", + "Kc-cmGtvF4W_lSX6mvGBo7g1CNuSVxngfzcCExGBmWo=": "763607000000", + "Kc0qvm-518eSkn2SKVu89vhJ1uEerYTOy9h0Lck5bPs=": "411609000000", + "Kc2sMWK-JzP14Jwe8iPkMl6iJB-0wYzOqFe8bSX_TJE=": "774052000000", + "Kc3oZglCUp55p5QPfRJE3UtPA-xR41GsMtMtT1rDve8=": "387186000000", + "KcN8GP-cjlz54J7YtdG9qe6uMXn_ji3dG89daKeLb1o=": "385506000000", + "KcQVEjRK92LwnpH4ecMo-hcHNRyiN_63RPcbrdJoerc=": "838273000000", + "KctMuB3PC-aNmNA0_f5OYNcMXpJt3aR26f2su44n1T8=": "384615000000", + "KdWPoxP7UhaXiK3jRuCayvMn1HMjAzuKQP_vUuHx4oo=": "352326000000", + "KeEFsnbKk0FoNKSzNR7D47UirJAOgi7XUICtGS-0Tos=": "390207000000", + "Kf9AhbVoW3UNZ03yg0NvoXR_c5HItZQiHIjDbthLJcw=": "409110000000", + "KfFA1SJ3HD9yU48kPl-niAZI_SzBzMk2XKKT1R-_SqQ=": "909090000000", + "Kfngm-A2_sletTReKVGejhG5eQENnMWRY7vrG4X6Jo0=": "1005354000000", + "Kfo-tpl5ewaodfDo6wlEaDmCR_7ncrwfjG7xvk-muqs=": "7500131000000", + "KgQE3uuFr8AHbk01NUpJbg0UfXMXmPE_yjv3C_TIigE=": "381802000000", + "KgWmfPM-LbUOzRiTpKV4WhdKWP9LLzgQ6R6bQqoAlUM=": "1521370000000", + "KgixXUFrAoBheNghc0BX7dais_htchQ020_OjgSNSSA=": "384615000000", + "KgkepPQzwx-MCqXsKW-4Mhj3zkxqoSRx_fLdfdYdD_Q=": "5958333000000", + "Kh2MkIC9aZ4au9mcQVaPzY2LZOm0sxdtTChoeviRE8w=": "425503000000", + "KhF1mokp_zPLXEklsq_oMfdc4WAA_d9agkrqO73P4J0=": "470730000000", + "KhFCaCLeVkjs1bk5nsLCvzbAbf3FMSSqQLpIKvuvrks=": "928601000000", + "KhX_1OE1xFxxrXro364PTgeXj5LNAnt5hhacrvrpXfk=": "451134000000", + "KhckLsw3mFGDw8XBIxcBnehxJ1uEVDrJtwvINHarvS4=": "454545000000", + "KhfXM4n3gwX2XE7Das7M6QlNFM-5NjdrtKmhst32g2k=": "385507000000", + "KhgaufrUlHQ74bCEC4ecr22lC9FBR9tSJty1LxSKk-w=": "833146000000", + "KhzVTSMlkRlwC6p3GEf4c-b9jSDMjR0LhsH3P8uxXwk=": "1927537000000", + "KiFbHwp9yJt6YWPC8TELrdu4XAu_1WIMP_KOH3wffKA=": "4152980000000", + "KiM0Ct9huUVbc83GRywqbCANWeak77q-6bZ3SkvqQoM=": "447934000000", + "KiROG__Uxr6Qc1mJfkXOXgLP9Q2ZuLji52ZSnwpf9gQ=": "358755000000", + "KiejVbwxTBIB8pTLveanoO97L1YAtQ7iugeYzSoi3QI=": "1366800000000", + "KifjxOjikcvto5Uae6qjbH-hCPUQYRESw0t0ZOc7EZ8=": "378341000000", + "Kj9LVBdYRNNLrRKVk0QNgi7-0eM9V-iL0FV7RNsddYA=": "384615000000", + "KjPAjYu2EFQY7QPpqFPMCJjO09IX0hYAIRT-jEbmnYc=": "743064000000", + "KjbYzXd9B_fsEuRYuCmB8qjzA9NiAdVtlcqD753wniA=": "771012000000", + "KkFL2f7TME2Uw6BtWW7zWy9g4rHWiAWOPpFWDxCqovQ=": "1004789000000", + "Kkbxv15M8QvE8ld-5twlW3cTvLoybWKR2QIDQW0ptXc=": "769230000000", + "KklzW0GyseRNv3CP3U-89KHB0L0xpq4CjVFcZWnkWuE=": "569773000000", + "KkotPVUDQc1I7D-zfUQCfFkst9R3p6vqc_tczMXcPRQ=": "1999999000000", + "KkuOvfM4PGV66ayD658OoEM9nAxXjjuDSmRQX98CC50=": "384615000000", + "KlE9WO4OnOz6hWPJh8PwtlsCNeyS_QEbRJgnHJvHics=": "383959000000", + "KlWpii3ILSmkbM4uESDrt5KW9b5fa8vg1PET-bjlxsA=": "457341000000", + "KlaGL_q0SNllr9pLOJjejrFo_bgIDOPsVFt_pFBQ14E=": "456909000000", + "Klv2FxEtUk00n0-EL9DowK69LvBS-Adqwxnaj7B6PKw=": "4669772000000", + "Km24zwkf8XA1QL7nrgy0GQ-66te8gWApos4gMKu8Tno=": "747699000000", + "Km2vfBBkhG9uXwawAwLBPNpQ6L5NkoqXXZuxqnB1388=": "379260000000", + "KmAJcjCD184NhiUGaiZPEFdb0uRTLxEKOUSKRL4qDMI=": "417634000000", + "KnoouJuV4n5h0R9e2ku7bW1uTFGbhybtGZkWfECRLP0=": "417633000000", + "KnsyBCP8jjYpGSzTILJD3XII5VJY1is61dL9iyehdm4=": "653742000000", + "KntnDOgpjZI_yOgJPXzKIYLsQoRZN1UwpDZeoQWqJIc=": "3417516000000", + "KnyfopmMnzZ6Cwh6UeSvJ0S2WndVxWP7WZOs1WGird0=": "3249005000000", + "Knyyy1TOfEMvUqieWGSOIZf6TvVFkhEDHDDE2gQ3U5E=": "451018000000", + "Ko-FnP8gcvfR88f-n46YDuvnbuwbpf9bPcYKz3xUIR0=": "14970560000000", + "Ko8wzUMqGLuSgT4chcgGcpwnoLyEZQNjompTJ91_PQM=": "461718000000", + "Koelv1AHuS8SmLOBXEvVCxwmoXpZsLGHdBxkLyU4RC4=": "3832056000000", + "KpEH4aZuPev4i3ptPia6PmbSPBknHmNvSIEVzEoAFxA=": "384496000000", + "KpJNEfqjTlNXU93lKK9G1Bdlsbg0xFu0cC2lWYEUXhM=": "1180485000000", + "Kpv9Lehg_AvKP5BhxUNFS9z9NPQqOm7biZvQROgg49o=": "1252892000000", + "Kq4pD14dk8288o4dETVpUVgbjinlKRADy7W18zrJtYs=": "627016000000", + "Kr3Aso5zgZlMfJj7hqWSma2C20tfEyV3_MEakS07UzE=": "3898137000000", + "Kr99LtaCv4Y2lpHDrJQNgwVL3Ee9hDxVyWAAZ6P2tSs=": "132113541000000", + "KrDnDAqP09mAwsdZ9nwlTg1tHqWD-34kMxIwfjvUONo=": "384615000000", + "Krg-dqjzv2eoTxEmXdlRY6QnWPZDz0i-IeaiLMfmJqQ=": "385510000000", + "Kriika6Rp632CsTI5_vEyJSeUISqEQjsN-SWOVHLGss=": "1076923000000", + "KrzNmCFW9EhNM1w61AZFsNGsjA_W2TtzMbjGWXV9Zj0=": "449007000000", + "Ks10khIXqoC3SzT2gSvtmmCS7xDZrR2Jp4sCMuyyWOw=": "390649000000", + "KsaCaGR9BrATKrgvIdOwioqTvZM34B9D4j_ZvmF6iGA=": "989334000000", + "KsdadUZsh0twy5rSnxAk1hUsefN11k5KWry12T95JS8=": "416723000000", + "KsmJXbErau89kNHaSjEgwVg_cua0FuStUwBBCznCRSY=": "7710150000000", + "Ksz1nZJs6Y7z019Sd6arbPdaWGJJkkuCNjgO-sAfYa8=": "794665000000", + "Ktm6XP6YPZutpWWcCueAOXXTdgWRt2Pz1CMdy8nx5Ts=": "424120000000", + "Ktol1K0bTsP3ifNep3qWE4mcp0uVbOXA5HSdIOXNsYQ=": "932180000000", + "Ku3VEBNDDj1kOLAAI0X86sBYMwrqK8BxpChXjCWmoqw=": "833333000000", + "KuYS0kRa-NvqmI1urQOVPkYhrj8Q64M5wWWxfyCu9sA=": "925374000000", + "KuhQdEpBjD9sjv1k348nD7a4gDJ9oaCwnRMIF_Z8yk4=": "764768000000", + "KuntYiuOemRHr1EUBtbv8774LrgnIBwsKeyLUoCJvhs=": "769230000000", + "Kv8aIceizwTs216VAkVJjIsrPv2kjNqVHfXONB4oO7A=": "4175192000000", + "Kvgrc6qROCkTP8i-c8AM3GlGp_JhRSKZkwLYlJh3xwY=": "384615000000", + "Kwkdpu_mpA7spNx70cYgsPmZ9tGdi2hS_Nrcs7Axv7Q=": "4592645000000", + "Kwt-u0AZNAcBSskQO0DOpgG8r2i9xSSNFsyvAaj53aA=": "1529468000000", + "Kx6FvSLWBAG-kAoqyKCr1q4eI8otPWwChXJ0Q9_t5IE=": "59336443000000", + "Kx72warQWYAtylxVHLkeWYYNswWyzI4rm2Nmqfk9MO4=": "512979000000", + "KxLqcW5jrF-CuorVEMk-QHr839bBNwZKN4coiq8jqvo=": "422328000000", + "KxSKLpY2YPkav_hwAAe4uV7EAGIsoZ3SNZdFr2LLTOg=": "453059000000", + "Ky42pmua_XuxA6z-m7L1Jms5fSpwygZVL0YMOYnPI9I=": "4155440000000", + "KyC-nXug36Uj-L1rGgeQ_1qYF4La7V5xKNjYPubrF3U=": "922292000000", + "KypirK5luqTiFQHF1_F-uQl1rPLfBfk-1bHeHXrdUg0=": "1794036000000", + "KyqtvVWy_55tDzwmg1SvQWY0QUikHOPzsgBwkfcD0uk=": "3852488000000", + "KywoDepRRPTHC9mCEsAoGhQoBsn4iFFibdQS0kuh7F4=": "1897049000000", + "Kz5zp9dF6HADUbudwrRywOu_NT4OsKUrnw2z9FpPvL0=": "1949879000000", + "Kz79E520k1qm2CCxP4PkdJXIU7mt0nWltJy3gwRjRzU=": "385507000000", + "KzN2MNNtwhgocim2K7wqOWeZIY2i4ZcBuaYvGiK680U=": "958891000000", + "KzfCExBou2xLySqBPkqAAVk8GSdstVRXJiOU-CgXugo=": "483333000000", + "KzyLHbifwrqvOwoh-38PNlGZ1KUQ3qWU5-NE5S4rx1A=": "2055429000000", + "L-4YOUpkjfG1wm2J6WWZqcCnAVoyL7_WiDKnKgOCT0M=": "958256000000", + "L-FIO8Jw_JAkQ5Nm-1oU_kp6-YgSpbAUtlKPXWn8IA8=": "457804000000", + "L-RZw0eawAuv1UXwH1raEi_7Smw50sgpE3yFU8Ye8rE=": "363493000000", + "L-f2Y-AyF8QfEk8x0axEzSpyUllgIGB-4FuY07-fBgA=": "33176173000000", + "L-ieW6TKeO6HrGYlNRbveaA4QFuHvG8EVxDCePm63O0=": "407808000000", + "L-kZ-QTDHr4fAXTDoSCQyPd4sUtdZxRjgHAPcoj4IwI=": "451268000000", + "L0NACyqfUXpsHVr1bVhZbTq8faX5pcmJT62zCaqVXFU=": "2712925000000", + "L0TaXDdmHg1ANwdBq24m83UjMP2arS_6huOYCzr610E=": "628794000000", + "L11OkA-dJicDTifGLdImvkdZO0s0AupQONtMzxf4hi4=": "650869000000", + "L16kfgxgsMtfkMLEBWiAa_ZCmWB7r0bFAyGx7WFgfmw=": "3813588000000", + "L1CYHi0qJ8Jr_cFWRIBQ6HV_f631NOVRSP9SyUbftig=": "2272638000000", + "L1IztYhYiGfN83j7pFijRH5RaxW7suJuR-iUrLjrpok=": "443773000000", + "L1SAMnXuI6fTFewV8n-FtWNLadxBd0Fx62u67HIva3Y=": "459419000000", + "L1XWWEsx0kbzq6Bb3k0dTYpdE15t26L9jhvz7mf1Kk0=": "451756000000", + "L1gjK3K1cQNtcaB3-Cl0L2Wt2vAQIZtLYjnLE4kSKO4=": "385505000000", + "L1wfgsz1qZSEqkUKTd2M2oiMZSPeQ8H17d-Q4nlj2YY=": "7529253000000", + "L1xLr9_AqYQ0XCIPffVuLOx9gnCNqm9h5vmXvi0K6dE=": "385510000000", + "L26hhuABWb-p3xTVeoiCuuVMOqW3YsdTNBJ9LSBTu3M=": "1156519000000", + "L2X3VbEc7eikbyRAiUYQHqBVEEfB3MmfiZLVW3qymU8=": "1135024000000", + "L2evAkWadiU-8CzeRA784RfXKrdbwBVnGy0MZIHcTFc=": "579369000000", + "L3GCn4fpNorOwKaDp7jdyf4fphetDJbur0evGmdi20g=": "509711000000", + "L3qXqIIrFF3_wU85Ke425XjeQ8oHf2bGnRxLs_L1wWA=": "76651905000000", + "L3u4yJCjSOswZxV8-7aN3MaJbd81D0MNwdSoVP5iecU=": "1134899000000", + "L3zxXMMRN2Mi6qoqQ1tvyOHeqZgnNsNnjGaMfJqiUmk=": "2273889000000", + "L40fJb676-kIzbgrT-NVXaePR5UtHE9ZnujXXpkLHws=": "3841471000000", + "L4CGf4hhs9v0AdEk6VLvOGpCsRuSJ2NqGCbytaAbZwM=": "1257609000000", + "L4XU2CNcnAz1efjNhR_-xqO2mZlY6zGwA263vRD0CXA=": "374288000000", + "L4dZHx9Sj6JG2aEoB1ckJitaIthP9v0D-Am-2Yq_q5c=": "411085000000", + "L5IUFXPVY5sfA0Q_CT_PG26c3M71kNchKxl1ZMBE-6Y=": "10014866000000", + "L5LD-Kxa3eJE_isVbkbNtuQEnfNzfu9STh_iyv9LTaw=": "5014953000000", + "L5NqRwifIjwjroMqx-d7DhAqfGeVCUMoIldQX3GPdmw=": "4999999000000", + "L5Ud9ZPmAfU9GOd9NSK6AVA4gRVXc4skpoo-ukEzfYM=": "3840705000000", + "L68HFHygmwXhF0Y16KRLD7Pca6vicwWTp4JD0y9tKr4=": "384615000000", + "L6Aas0ROpsoDG7QhKcS5FolTnUZ-Ycba2gM-XAeC8ew=": "961856000000", + "L6FxUKCDis64KDFWDeCFzRFV5bh1Eg7jp3gx47S_9O8=": "1305000000000", + "L6dBxCA0K_WkwgbcjTp1DeYe5vxGeKvg4c7QqJ1gxmo=": "2006003000000", + "L7AuAYp71a2seOx0zhGVWepodYU7Vvfb21CJYB_5328=": "382394000000", + "L7U3QkVTjSo8vqsaE43i8fh81vAj5Q3MU3sBxJaOYys=": "1807692000000", + "L7Zxuw3Yuggq3xarpr0yq8YNTag61rYv09BjkCzxCes=": "3852392000000", + "L7gtxqGTh14Ei_UbzMMENK9XiLuGiZH1ri1HrWHhMPo=": "519230000000", + "L7pZFqTE_1q5OCYyZH3EeiW4UPmFl9VQKXc1w1lRHBs=": "384567000000", + "L8WJzuixAihnW6_iX7fEd8WLDG0Yb-B6lC3syrH32Us=": "1728109000000", + "L8dHcGXawJ2O5AeiX5DOvbn-6joj9cGvc-FF4SJ0VBs=": "948553000000", + "L95d5t0N_FgYzSvcVlleWOJfPmzA-pQvGaFb2hMy3-4=": "450573000000", + "L9DMZQyUdU4NpP8Zuyaz-qpTDJ1j6cKpMe39mqU1lYY=": "481282000000", + "L9S6xA3hrwK3TiS_6z4E0iftVavcNSlwqTe2kwlfkcA=": "6624205000000", + "L9Yajey5dihK4xc-3cFhw6UXxfCTK4sKmrX1oRW-vm8=": "455506000000", + "L9a2nb33yB2HKZJClfNAyOV_GI0TTl_bMwTEjOHQZdY=": "2356327000000", + "L9euMSCJjq4vzHKZ-nL8kYr0r_m9pZdIoGWvoK_G8CA=": "823136000000", + "L9p-UyBeT6Z2_SNdDb5CfyZfHIZxUKHqMMZ2n1aOuyI=": "384615000000", + "LA-t_UffpX6J5l6bppyPIwYZCK3gkZ7r59hlSR6U9TY=": "4166666000000", + "LACjvTpkIT4XZq-FKIq2gFvm9qbRn-Dx-J2UT6N4efQ=": "1156519000000", + "LAX1pruZfUvnVG6Z9dnU7kXucA3KgL5XjtYXm27X42o=": "2084505000000", + "LB8F-JnDV8JQTuHzy6_dIV0FDCtPLvLsnIZUrcEnTnY=": "427562000000", + "LB8gh19HSfP4HF_3eXwry5pLC7nDPeMHWnpuS9-4M5E=": "496283000000", + "LBPSj2XWmAUnapkMn5X2C2fVtWHX45Bm-Nhc6vpXLhE=": "1240189000000", + "LBm3sfcprhk9fYAYM1qntr4n4Il9OeCkZVcc2iRvnmI=": "378633000000", + "LC4oQhOYj22PtDy5MUVqBkCibSY-0aQIaAAYKcuUXNA=": "472079000000", + "LCA8bLH-8kD1psvc5xqnPPK4f7wCtWvAwgbVXXeh3Bc=": "383201000000", + "LCwrot39gZS4szGWQWrGc0xF2NvAFVStAlYlbmqA-3A=": "920881000000", + "LD-e8eMck1ICIQlpxXhJZWXUZC4m5G67RsRJMBdI8eM=": "388085000000", + "LDMTYY7ynFx3KrHgH6iR74GhkDfDb5qzj4vBVDBfgdc=": "383005000000", + "LEMU64HcjpSVVcC3T8VksHswoKuN5VC3FC8jhDNZ_vY=": "1153846000000", + "LEVWZdpmjFiUKw8K7owbnnyItw3Jmo38fz1UObVL3NY=": "415384000000", + "LF1WFpL7TrNOHLMsxU90V6DozhoIA9dig5wHxBcEYhY=": "912797000000", + "LFgLeiWH3aN9OmsRl1_PtnRGxczY29N3c-4PDcv_eHU=": "384571000000", + "LGKYPeNfbwll3yUMb_vYOT4o4-DnuC6N-XPi7IKDeWs=": "1156518000000", + "LGot8huAvLwlIM4pg0ZnJME-YozOxScNMBEFQkPVVAg=": "451255000000", + "LGxq9rn-OpyvzNj4XBhMJ47mVITNXhzTM2KJ5JWWoFA=": "2084322000000", + "LHFbq_c5B3nESfYFUWg6mlD0ldgf_iLW9xMF-cg0mYw=": "816101000000", + "LHMoiNd-TRqpZ-Eyos2jsZtT8dZW0GJ1ehpTHEaVb3g=": "952183000000", + "LHUhY-bv1oiUeARmHdXSTPFo7gsgxXMViOzFePdFdUE=": "383204000000", + "LHWT3Luheki0qxUdYiGhJuK0srwNCSYXHKQ4VM1thpQ=": "384615000000", + "LHr5fQ0UVujn5CJU28Yr5cj-bOGIsjZ5kIb3LkUT8JY=": "874765000000", + "LIGGC14jMBVJHekm3rrSOw5ZU1eeq5n7aA_8stMMOf4=": "462687000000", + "LIOzjdXbz7C0-Y5sYD5mQltVwBIkS8v3GEFruoYVegc=": "3741282000000", + "LIXaifBiSYpy52n6nSGJ3mFTXGEV8d0QbjevZD6GKoU=": "385500000000", + "LIZj-CDL_0vnA0xDnm-d6WiFwJYBI4XqOid62hDjvSs=": "385506000000", + "LIaVzvgql2ld9fNDu6VhdFYMb_90vBxypHDDixSHwK4=": "764026000000", + "LIxtq0xYIZJRx1DKGQWoNT3fQ31AiZWyknqmqWxb8qI=": "4705862000000", + "LJE-EGWZd83xd7pev5INYLU8YGZ4He1xif8R96hBwTM=": "999209000000", + "LJGPxPfQBG5w46vJa-AQ3mm18gD6B3LxrPNPAsBLkhY=": "3978718000000", + "LJbY3YWf60yZjYeBL8prE-YZWccDs6_7lGCcolNeIFQ=": "627808000000", + "LJux9W9OPQxKmVR2fdFORvMYQ28heoA9d9mHQbbUuSI=": "403850000000", + "LKCZugSkvdGPYlNQvtpjwbmOoB6selMwIpJxpIKILiM=": "769220000000", + "LKZf1y86hHrfjGl07AkDMe-Ef4LDbcEcLWCXvbCU1AY=": "385543000000", + "LL-7ZuCfUF1bJx4sWj5XmJrOt2GaypHxv8jZMevVvVI=": "5001474000000", + "LLAMUN1zj4SDQ1tf-xYdYx_w-PYctIeH8ChJh0J6AOI=": "384615000000", + "LLJFWKyIljccEseEp-ZCb1doYq5rF-svJbh4jPrlS4Q=": "384127000000", + "LMCaNxxfLkU3QZH7g6EzUFLvXuszqa-FC-9EyYb16Z4=": "1999999000000", + "LMrEOqJIMv5uV90WQ3LsrKR_TRE-UhQAK44nzl6a0U8=": "1923076000000", + "LNElmYBz0JnLEVFnqGUlzS0SePQYOjkGuuZtplrXuqU=": "454545000000", + "LNLsROUjI-jwh45NKZdfPJYhoQinQ6YOl1mDJPmqhsA=": "385614000000", + "LNOiUvxcxIFZuWP0ZoPk-Oc-nH5xDI_8q3OJhEtWae0=": "390437000000", + "LNs6662TMtlG3-knzPn1i0dReG6CW474__nYIlnoQ_4=": "384615000000", + "LO1Ln0lkMy6heQnhqoMjhHOP9_K2_V2txg8sOAV3kWs=": "694056000000", + "LOZUpKFNHvdI4CHxNxWV4KTTSTGFi-Yxkv1QDo1X4jQ=": "1155259000000", + "LPOPtG0vU8qp46ZLPQ0YNJYfoW1BpgMrkvEYNx1SgqY=": "3783416000000", + "LQET1lC8cTfffCMYNQ3C36awgRT7mSWCyJx0_rWKYNQ=": "460408000000", + "LQM63cOkg5ICWhO1bzO42iQJo8t5--ayssykJUo8tP8=": "1138034000000", + "LQP0xDUAP-ttnAbBXGNhU0ubM49NMskzCKLpvQ6ffKc=": "991445000000", + "LRMa3qmyqbj8xH2H0d8OqaNAiWb9dOiE4dNHhmNbRqI=": "2307692000000", + "LRnn3LeTqfeiDDFi17VtcfYn4D06TmoZr1V2a5pFDAQ=": "385507000000", + "LS0tXqta-Iia64nE9ThFbC1vToQtxp8cDhaeFPpbxyw=": "908798000000", + "LSIUWG7v5uwlExPjtTah97ULSzCcf7urKYxxMsim2_w=": "601993000000", + "LSxL3LjwnuSp6o-VmjccwjMeIa1UVgrrcgyPx5TdXug=": "4125716000000", + "LU0hax9O94DVsdXzNW3B1dL9G7R7QqpJuNElpj1YdBg=": "384615000000", + "LUbyuxIVaPqtck1R4dksdmKptUlyj6VxhCsGBbrA9UI=": "418855000000", + "LVQAXKJe4fu-ZhwWzeczVZAqsZEv2-_yFMK-uJEksmo=": "1729341000000", + "LVXR2uefj5X8AQ7NiWrX9_42noRiXWS-fUy4XoADE6o=": "457090000000", + "LVeMKZNM9owbXr_8_X_sSqu6hM5qJ2PMXn86ocHWjP4=": "12831666000000", + "LVg_RpB5CWpCYd9KzBpZI7fh6Gf5QDme4Hk0j5FM3KQ=": "1366800000000", + "LVpvo2T3RqSGQgGDKYwi9-N2suMeofKlQ-2uPTYSGbo=": "384615000000", + "LVyOBU2c69tkbTD6ZszrcHlWGSGzeAcUK2t0hjACscY=": "374830000000", + "LWCI-i7tqYf_HslaGgm_-8SDz7uzQOmAXcsb1H4Sm60=": "384615000000", + "LWNyJCA2fmVe4ZCPUlJF4aADes1thqnyuENuRTeO0W0=": "379260000000", + "LWYl_wFwgT7_MdIOF-yet40Fa2oDGWyDJgasmPnaIT8=": "377468000000", + "LWZEjzvBGQiZQLmD8Nvk7UhH42c6_GhHCPDmaWpOV7k=": "1156520000000", + "LWzeT4DMrzkSHdUs5YypZMlIoLK3ftGmS42xmTXxKtY=": "2066100000000", + "LX3kmTytSVcmzgUKw0u5SD1DF_OjlHa58of8l9omJmU=": "384615000000", + "LXKeLZE7iA4chnDQfnA3H5h5nFGPgUmNfzAy-ZOGSys=": "1954545000000", + "LYQlreSDStwsKWH2DtchKr9iEmnoBRMFxAuWE1vYdjM=": "2105796000000", + "LYUppaMa3tR6L2lNKmItUp2-e-cZdRJvXPzd4nkAzf4=": "1156517000000", + "LYnkbhEeKrtrXjromN-X4RagKTmieEj7eozrVH0cJ8s=": "8333478000000", + "LZD_U2OO6K_sCnv72TtfXOSqeZ0xUwqquTrN7QuDXkY=": "2081900000000", + "LZwBxRcH70tpmjmEp-0Hmo7m0lc5qY7D0cvQZzI0rJI=": "1917704000000", + "L_4Vlzu3aBXIIg4Km4IW5zHXRwYZyyBULc7E6Uk9DQ0=": "754069000000", + "L_BgwU1TC0Zr9uyfTC7TyFimccahi1RG_7vCCvh5YJo=": "464300000000", + "L_GAikZhrc3YyGX6w_W1PFYSYuYoDivU7gkAnC3AGiw=": "469944000000", + "L_GuOtT9wJx1xE4d7pGIqcjxAMREf0kXRU0eNnOANcU=": "9544996000000", + "L_VhxNNjO1bBPkPTRXal8a2GJ2WcV4M59iiZC1wF0fc=": "395545000000", + "L_gkAY5bp5L8s4y79dMlWth8RibzTaPyzNBTQS_egIc=": "416666000000", + "L_q4nTEpcx0OMGiDlIsZCNxT9HfHqldCUsKb2HuqtQA=": "576725000000", + "La9pbjgi0mZ842qJO-d4JygbRu3QzsElchF5cr1OiiM=": "411085000000", + "LaEvJPmyxXxoIVibrRUv-oFctkjrhXAvi4WzJyYZP0o=": "457641000000", + "LaIHCpjI1F27qp_oqAmOeyJxVVmFG-LXCHZcqO9XtLg=": "2478561000000", + "Lb8ETaKSVZr-ipY51bwAg40qT3koxeuBv3UH5RQxZLc=": "473848000000", + "LbFpYZ1CEdh7wRZ7kko8cgiXLc5MWv241ftb9xsiFNE=": "499256000000", + "Lba4PQFHbeNZ-rfpLL8nXZoxXik4exnR67OAgTNLNOk=": "491847000000", + "Lbom-f5n9mu-fT8HrVaZEC9Ve7xgP_4HTNc9aeyaEQc=": "417643000000", + "Lbxuv8JLUifXKrajjmEiCyvEJ7v-cFwfKJ-n-ITrw4Y=": "892610000000", + "Lc2jbw98Cfj0qCXpxSU024Kcd7QX7gor2uKl-KOGcPI=": "379122000000", + "LcEiFQvJkSSoR8hvbxFDGaW0IvtKeBQIc3SYjh47CME=": "1964761000000", + "LcGuE_gtwc1xbMlzYShkXl-WlyYuu10KPDlXqUPuSwY=": "461154000000", + "Lcg1rO55XpJDdD1JknZ09NovgdWbVmCt1gwwPSSOqfI=": "1864361000000", + "LcoE-FnAFHTuUFrTezU8g_twqRQ4LkPpTwhPYdOnyTA=": "5517798000000", + "LcqCLwQjc6LDDDCqEYOxyAPEwcjwIrN37aaKB_EdbFY=": "2496630000000", + "LdCGqA9M-e_qvgeNrkKImRQM9YIpJnQNoLfBl0bXRhM=": "1368914000000", + "LdMzQsDlpIneN9KBVovL4m8deSYgaAAszYhMSqrDoh8=": "1250020000000", + "LdoagcD7RdNT2zajAPmqNPdW-hIEGchnwNQX_1Oan0o=": "732661000000", + "LdqwqOzvJLqYfhWiQQtT16InqpU6nJHvlGRCNP0pXmw=": "1999999000000", + "Lduc9mlmE9_LdGF74G3RXsLJy331HbHgG9Nl_2VAIg8=": "1153873000000", + "Le8xUNGg98tkTGJZrZ9OTcTIcLeiIDjPECbJpjn2JDI=": "763607000000", + "LeY5YMm__NxV4pcgvOX-PcZj3-qJBueGirHvw1PVAxQ=": "390037000000", + "LeaFg1ZP1rJqNdGVA7LklMTal4x-MW1eQhNYm8yhDOc=": "1217065000000", + "LfT6843HmBPicnExlMLcbQx1uyMzmSNwlMsKxeBTFdg=": "415817000000", + "LfhLYeY_gKGL4jFTwUBVuIHGE5TrMc04rfupSzJ0zCE=": "1923076000000", + "LfndX3clXTayDbUjrxncRUoPrW2S7DqPJOjvCgb7SkI=": "23588100000000", + "LgMWm-rMv2F5cHiZSVxsbVzoud6XcHNFy2JxO9kZtfY=": "471532000000", + "Lg_ZKuu2hKKFZ27KyBFzpmVM2JoZcJYYrl8daMjG9C0=": "30421226000000", + "LhS8p-1p5OZF0aKcGYFAWBQeQMQ1u-LGKk1VAkAp_XQ=": "1145066000000", + "Lh_BhmkeLmSq_W_g9TdE40VUNkw60mkZj5-JBwthTNA=": "3846153000000", + "LhoYumJm-42It3yLSNj7p17Px3iWkgHDfSOkDrkAvUE=": "462146000000", + "Li4jlFgnIYP7ZHhPx74hmxIUog09q7aSQ5DYuPQpEuw=": "419408000000", + "LibmBCAyqg7UvCtl6Mei_ip7-Fyb_tJgoT3VyaT3Z5E=": "544175000000", + "LimbPqy0ruC0ARh_kLJf3SmgbFYUuPyUZO_EZsgbIqg=": "407808000000", + "Lj1-M7UnetCiSdbm_0gtCkqqmrHPnW-2wJb3rf9Nn9g=": "383485000000", + "Lj_CXYYI-PsHE_zNTQv887qpjEGw5VndOsVdcHu1m0g=": "377384000000", + "LjfcIlLBZuH4oN9JSF3EtDY8231cleaxook2APJ1M9I=": "1249999000000", + "LjkQRtmz0TXgrWmDVKDGtEvk62CcLgWhCrko_C7l0xg=": "1346153000000", + "LkDi3w9ks-OyM5watlh5XY_WbGluyayrJvnOCzWewlU=": "416901000000", + "Lk_4UJwjxEWbhVPyymG4sDkd6tHNDjnC1PhBzJBq8yE=": "396485000000", + "LktDXNPcbHAXSteyCtF4i6qtwq1-pjBuJ1IwWVvdmrg=": "384615000000", + "LkwtMk_VGuTbgB72RCoXjk02fBCzso_ZqfUurSmwNcw=": "419858000000", + "Ll-ZXIJDbeZKlZ_gDSQE0YNCKV0eafjh00T1axgjUk4=": "926626000000", + "Ll0b10r0s04nLp5gZXcZQXkxKfIBf1KY9Ul6N6LssEc=": "416666000000", + "Ll1kTdvjb6ZdFlmAXdr_xITY1rmGOygvNVY0bK-QFc4=": "1481723000000", + "LlXPcFfjgOsshDJ5m3ZIXeGhkv2dc8grE02_NKT2G3c=": "772250000000", + "LlbOiY9Y1JKtgzkJnnMntbVcAPZmWhojUSUFF6yrHLQ=": "1151841000000", + "LlcRjYnHSE2aTAhXs6RcuOptsbvSJcJeJhySI6KMqBY=": "453003000000", + "Lm4L7LtjHwP39motM6youzGYzsySoSv9IvCU8cW-Jcc=": "762357000000", + "Lm54Mzs3R1w-lqgYkiykSN1_nQf929C867o1kbFfHPU=": "416666000000", + "Lm5kj1Cy1Fwg_NZvWj1ki-C9BkkOuWE9WbnE1q9A0Ew=": "384615000000", + "Lm8XH7EB2Jyadmw8ypzAAZyGuVuJjt7lu94fYvdiTgE=": "1133078000000", + "LmGee7uLzsaHMc1qqYhwG09SnBpKcfAVYwiMg-sTMoc=": "394920000000", + "LmIHrRIx5fRl7NO2ZZl_IJ_VLhcBXPr1_4U0CXuVngY=": "445221000000", + "LmY_qx2CCdcXkkAvGAAeQG2JHVb6Z2H0w3xzeH09hs8=": "378510000000", + "Lm_epTMAFNIwtUYVupW7_y2GzWQiqyrnQcdzl_WInH0=": "3778454000000", + "LmpS7kMfY-Zr3dz46xSuzN7EGT0B4zZeORL1GdqsyjA=": "3214019000000", + "Lmr9KySpZ_NMK6oLCIZLyUuH0u3LMk4Qsd3fplxEe6M=": "597849000000", + "LmrQA7aTfTL44AhU4bf5kbmAxvYjCZOHeQElo1cEcPI=": "31830185000000", + "Ln-y7SocUO7bi0aOKusUlJOb2ndN3IrgxA7QFlIpE6Y=": "771545000000", + "Ln0yNPqw9BCfvpcl2e-oQyCbjcnBsQb_l3kT_x-bN-g=": "12540324000000", + "Ln70J4optuc5Eu0m5_YAKbNpMMKcq3K6Saj4lxmhMEI=": "846689000000", + "LnCDGz8JXrLkGFU0h7pTOieSi531GtdIkIFpM6_pUks=": "408128000000", + "LnVl7YwaTlprQ0wtjSvD4lVT0dujXxtzpdxxOLnZ35I=": "414900000000", + "LnehWSU7azjKkCnHPu0oKuq_Kr1WaFDqAqe7j41sLhQ=": "383327000000", + "Lnzs25hayRYsq3SdP8WDDPDUgtOCcaim8v-tsym45c8=": "5980679000000", + "LoLnmM2ThNiG4zlMDyhmxgwNWsrJWHqnlkmC4_iC_wU=": "1480210000000", + "LoZjFbKmslMadLaZm4qUOhi944PIpkrTlQ0Zv9wltng=": "2916654000000", + "LolNKXK9dmmz3urM6bWrUO7-U-q6y0fswrBC6FMbE5w=": "1971966000000", + "Lon4aDrj9LF18INJrJVZDahyIxEE3-E0n7YT1DxWsEM=": "1538461000000", + "LqEagH7nfN80hmVCDo6_ZgEjWQ5Jv3KM1lpjTztwRIc=": "4005161000000", + "LqI4G34OzM-OzmPI5ddr7uohd3dqYP1KJADqO-IzkgI=": "617574000000", + "Lr49X0gfCygVtfFVYl6ydndS4m8g2ci0bfTmoAmlW1s=": "411768000000", + "LrBllDwiuwVwVhXrThWQXEtixSMvj7dXmn1u8TFERYE=": "915299000000", + "LrRitSvJpLW0EgAIjcCbV2KV0sLr4NCWwr4xjLPJHK4=": "417532000000", + "Ls-jutoRcDu_85aYn92xocbvrvazuMtLLB9bzbARHoA=": "1818181000000", + "Lsx0zDXeb6PopuHaR4v26aj0zqDyUbs0sRBDk6LMJ_w=": "1076134000000", + "Lsyy-zptF3d2AC0TKvsWWSij4Jv5SbOal5TuAFZqF_Y=": "1162096000000", + "Lt6vk9nMFrbrAmncPhFu0qEs5NpCS7HCL0kypCy793s=": "15609474000000", + "LtNokDAIGoPBznOzo5lEo-AXDKe7Zlf_e9-ZsmkCExc=": "381802000000", + "LtbOw4bpQ9Pfo4ou3TFYpjDmb_E3Ui8_A_wIQhofyrg=": "2055996000000", + "LtcPD-VcFFOWMLOj_0GB2fFny2MdduXHDs3WocA2VyQ=": "421246000000", + "LtpFwvW7O458o2K9XpK37ZTnVyw4eFte3-n8MBeT5EE=": "454280000000", + "Lu5DBl-0rqAvK49iOb87TlfQW0xMmQCvb9_igouSuvI=": "847358000000", + "LuA0gnXnnInH1Js8DWdyazK0ApBKzBg3-6A86B-0O5U=": "411085000000", + "Luw-cWmlHmQHOf0WXMNU9JcQ0oHmRpDG8JsTQ1sPcck=": "4594475000000", + "Lv0iOW-_BbAZhRtyAmk5I_YcTVeqpjglcuMz_v5P2Vo=": "909090000000", + "Lv2a0lFORHV6lfdkWqIluquWMnuH-30zh51EMMgz_Go=": "468409000000", + "Lv6FbZsNUs9oJl4WlY8hyZVX-suwisKSwXyvS-qgViY=": "4166666000000", + "LvjS2OeD7e9THjbY1AewixSrlvCepD73HrkAhtP9HKM=": "384995000000", + "LvpXosiJUjhC31ZDUOav_naWM65eQtZTiOQMSgoACCI=": "1145321000000", + "LvvwZDyGz6lQ2I0IbWWqqtQ-QrnXxlnE99G9PjxRVA0=": "371139000000", + "LwD2Vo6Yfa0sHotZqYjlPoH50xVx5z4-rxpULHGJmf0=": "3949471000000", + "LwYNSbh8FLdPwpPOjrauYcLGj5tzzg-_FVB5BZQkMVg=": "7598572000000", + "LwhAe2SEXVstTor_a40EyPkhq3DHHyIBax4nqYtqF2U=": "768095000000", + "LwswUUqieT4ap4fu02gGmRHWXrXnpqEcn-TEaz5dpPA=": "361111000000", + "Lx4QRXKrRSRXF1vO5TwDBZ_Y1pwpXZPB9n7ZVFO_2EY=": "418267000000", + "LxkT2Fwb8I75vheVn1qjwONFRLL-hEdYVUJ9DM4yQyw=": "3461538000000", + "LyScQ2vuYku2rpTF38VjABrERHYl3L3JfHSXWJFXezY=": "422442000000", + "Lz30-d4jMOAuiYVyw28MIKKl9cVoaMtt8GloVAKhFTc=": "1388621000000", + "Lz3fkQSwFSQZLp7jclN_5t5z5-lBI_n-wQAA8wKX3DA=": "385507000000", + "Lz4dTCDxMDxklNdt5UT-me3b925rHfvTcZ7t_nxXaeo=": "923076000000", + "LzPIn8nUOzffRP75hCtAd9M5EiQvii-PsKi0MOt_ATQ=": "416702000000", + "Lzhp4F7mmPkqcsKckQbj4rCro6DIiPl1T77T77mxmEg=": "384217000000", + "LziqPCInaj4vWTx9rtUrivrmQWjv7V5TlY4WwBiuQuw=": "446308000000", + "M-qeytbwPACk_iV0OPI3XUA3l13LjGnsV1tAS3XSuUs=": "3269230000000", + "M0GEcDpyexg22a5DfBB7vnUklrHflrJ6XKoNknjy8CA=": "41380876000000", + "M0PQ6MBpR5mTckprhiPOlDAzdU_O3F1h90C12zoLBTY=": "384615000000", + "M0RarDeHm6XJP_6zwUPJmLtojNJ0d58eZZWx6u0ZfAc=": "3969319000000", + "M0XNKQvGvaWM3Y-dDmOYxcLSp6MtIyoOt_kHlwVsucQ=": "1998608000000", + "M0xSxQeJOcyHfmYQVDBydV-fALFPgiEXTx_YK3akGKs=": "925700000000", + "M14VClJ1SW4LjtkIV6MsUL2Ibi_Jeh9JayyzV8jrjN4=": "384897000000", + "M1F03hQRemKkhmWH8f321yZ64KIiWMupaDzdO_0ewQ0=": "2346153000000", + "M1fI-etrftZYgcgHRhtSdbrIpwBmNW3r9Hq9C5mAx8g=": "384659000000", + "M1fZptaXFOEPM-hnCKmsEZlVmihJGlkFgo08t7ocsZc=": "1520514000000", + "M1h2sD3BArceGwWJp9NLhLude0tSdAplYmgcBE9Fwe0=": "497000000000", + "M1k0o20lBWCPjRE7SzjxlqaRbH9_1K3TmYUVFfr1CTM=": "387856000000", + "M2Fndeuhb0labrgm2MKVXVYGGOGt4WWO_u2wdGOWj7E=": "4044787000000", + "M2JnL_GRgSVhieHuclm3lG54NF9Z762YL1mKWweGzIU=": "832329000000", + "M2Lzp5e4AFt5rrl1C_d6_ayyYMoJ6VWrzCbqKN2uPVc=": "1258824000000", + "M2wrSxz_b7i3RdtpOHxwEjcRTF9llMfC9g4Ek4xFDjc=": "388046000000", + "M3cfd7ZUsQA8y_yW2Xfhd-d_QRd5-knzenYAq8GHdAI=": "457736000000", + "M3uHqDYp6eJ1091s5GXZWPx7VU5B57a1i-bSSKTefzo=": "4116070000000", + "M4VctQoD_EqotzlIxybnQ7j8gHLQurkVIVf80HCwYh8=": "585762000000", + "M5A5n1tFKusCLc89D403Q6uTi6Fmi6jlh-AXhX3TP_8=": "463022000000", + "M5Ca8rBy4M85Vv99y_QaC9B2OHeDzADtslPrfszHjbs=": "1154683000000", + "M5J8slap1h-pX7tsFPpL91Ri7zyNaD47K_ObQ9gpfOA=": "417537000000", + "M5pDXE76cH7vTWk1R6eX5ai7x167WNWFn9hnnlJn0OA=": "771504000000", + "M64xCBwVqC7XPvHnJ37nNMDpcSAlJjguCO8LAViz8g0=": "424673000000", + "M6ZQzuHfTQ10K3DiSUPQ-_1tbvoT7JJ-ZdqZXaWilv8=": "376125000000", + "M6iaJCWOpEX2bPIgiAbZmusnqUsVSDRA27fv8mjhgxo=": "3897184000000", + "M6wpV_UjtG1QBW8mAPL4dbkhnuI2334XOSJ9ki61wIg=": "422561000000", + "M73xcRP_hDdMacphLVqqG-hog9W_6It-5Jn2B7e3cfs=": "385509000000", + "M7E64UAX4Cvlx1nTPR_nsMSCOulFsnmk1-NfdiJOE_0=": "384176000000", + "M7P7Pp4WMvIxl40tXk9RexNmHclfrJF7LzbduCEMN8o=": "575314000000", + "M7cTSHc1iK4_n0_eXWDzZy-QgST_4kPY68OrgkqBms0=": "2055429000000", + "M7mEs4Vmcv2k6FAZ2CJ5TPXX7_7SNbE_MCW02kBk508=": "385506000000", + "M7wIcVvXf_FX6A8qOp9FgD74ggcyPqUkEJl0mAaY56I=": "4166666000000", + "M8I9MwtIRexLvsgjYoMDYQRKJ05LsQf3SrH591UYB9A=": "2032018000000", + "M8Ik6BUeoDoeAcyTIPNJjLtpH_T0YQACM9AGnPR3sXo=": "470447000000", + "M8OjPs8OluNBHeTprzqbrFnIp0MQy1ds0LvTmBeXRZM=": "462839000000", + "M8myfTNBXmTHzQKrz3JirT1H6crJH5Ita2WbZZvojVc=": "708353000000", + "M8o9jGdgY4sMUaoDLe0zyRS-tN9C1maemU99vB6up1Q=": "926541000000", + "M9EKQzxN_vi4Q_i67UKx81NII4fMVlwrmj0ocAbUaAE=": "379329000000", + "M9Tfg6dH4WluPHBNVJt6scgp_rywkW6PJevvkskoiWM=": "656536000000", + "M9qpAkt0Tuql-jzRNrARHX3nStd-skYtfYBQLXnuNOw=": "1936759000000", + "MA11lebCvCOeOni7sF2AXw02GA2HeGMytaToyVLWihM=": "385510000000", + "MAekJw07XmyxnZqD7CgVtmyx43y48k-mrMriQlGbWAA=": "452618000000", + "MAl9dsLnO1rpbbNWy7DSBJaoFITBwMVnhNRVd7NMRvM=": "1216806000000", + "MAzqtK-FiwSlOLjsMNPu-0xZPBVd0l5sCG1ou_ZpcnI=": "2271161000000", + "MB4Dovwi5P3MYDnIlvQlPavUgmyhPeujkhyeeIxbXi4=": "422569000000", + "MBMaygou2-i3uD-oguo3yFGco3d35J0pyGqhpm71oHY=": "383974000000", + "MCCYmtsU1q735AqYuXhctmMsBBnsKDSBUK8ThohQBsI=": "2690159000000", + "MCOKPQQ-_5BN7f-LAa77hD8HhOacSM76o1kHc_JwVoQ=": "447570000000", + "MCWuTrN7DZm5Ygu-S55uJG64o0a2j4fFWgUqNf6W2_w=": "426875000000", + "MCebgep1WmVhm8-LQZH97JhR-q0hggTS-dDG3mgp63Q=": "385458000000", + "MCoFh3rRLOylDMV86InHYNYhxgwOvpgYM8pWB4uvK2A=": "1999999000000", + "MCrIWngR-myK8S9MkfHu7-7feTc-aaEVInR1FVJNols=": "1631179000000", + "MCsrds0CERIsF_gFnO6-ysNQarMvoPaEVmSASbM9GvM=": "767319000000", + "MCzbBx35mKzaartSYSeDKbAQkloIYEh3bYO19ElUK6o=": "456915000000", + "MD75s3CbhwiOw4M2L-zjjhV2HofJblIgh7KmfFDY8YU=": "417635000000", + "MDeTs5s1oMFXNvfHr712r_FOkeUoaI3okpnlYRveyZg=": "387233000000", + "MDh7xYI7dqtSqeBm6dlgCv9rBy7cLG5zDJFOQVkrzvg=": "467397000000", + "MDpn9urpwfcUkOD_RG-iDCqPi3bEtDcmNyj9yub7Zyc=": "2017632000000", + "MDu-1iYwMEDU4kTM9PPuLSH4a9DWU9Mgp-m7sGvlklU=": "469152000000", + "ME3FEiG3byZTz1qByoJEZ3c8Bbb2j7VyV7aLA4LL38k=": "2307692000000", + "MG4Pk7hcTGsh0DoSIifN6w5e1Z1Oh9F89GIwJKq0f5Y=": "914491000000", + "MGLZ7pd8_Ov1cIvG1QQo7S3k8D-ItJ93_spaon4dERM=": "1047135000000", + "MGVrgYAlgt9hoc6MPsR8Mtt5O9fU9v3yy7sGibzTSVw=": "455901000000", + "MHVwzkllgROtMzDLppb5EgrXoVuf-KpuJeUBZ2Wbx-E=": "500070000000", + "MHX4cEDVhkKKQiAO-v0nbe1tb-9qb71qh-ZQX7nsYGI=": "385510000000", + "MHuNko8RnS7QdaDLalzLIwFaYb0a2I-5cmR2uCJPqoQ=": "381802000000", + "MIcX49-azjCJ5whA-WU2EZCtw2SoP7hDlt0UASvMYzE=": "769230000000", + "MIxg0WhaSvPpl3Xn3Z2qqHUy8ah_MuYOlMcEazX9deM=": "1153846000000", + "MJCqT_AP6xWYMY4z_YVTD30VFhqpf17uGwuKF3GaHMU=": "810236000000", + "MJKTdN8BLD9Fj_l-DiY-mmbWnawInA56-c3DFmE_Jec=": "385510000000", + "MK7-acsWWTWeHF1sf9gmce5r-RnmY6whpme4LKuetOo=": "2528271000000", + "MKGd4VUhHCK5CuZ46noE7BSMViHI2XwBp8TCjEYkEx0=": "426338000000", + "MKRZ-ZZ2PiRIsbje_jWIxaVSTCuoes_UOj5KKmjT26k=": "463103000000", + "MKhkW-JT_UUc2aJ2qpESxqj_1IgYtyfHaNHUmWWjg3Y=": "384604000000", + "MKl8cKNm_yj_XW6kUYzg0Rtpb__U5_dDs-Rd_asDL7E=": "589857000000", + "MLfLhH6RetgMOPFwIsZHSdL8S0JLsrbj567HJ1yn__U=": "1923076000000", + "MMLabYuiURwHgCI-c2X21AjJ7xWKtQ4YvStFRRCFABM=": "1538461000000", + "MMV-70hhQ5U5xA4eIclu_dEH1XQFQGG_zZ044O84qGI=": "1997972000000", + "MMjtryCjCoOkWFi28zWqRSmHTSZ4F2mTwzUPtdR1Gt4=": "2083333000000", + "MMn2tRvAchItACPow0F89nJ0wuBAjbxkXnygnLIWm7M=": "500274000000", + "MMnRa2uHsrzuU23HrILm7peuoZYCFo7LcVFGnyRFSmo=": "453042000000", + "MNKb73g25V_p5QQZK6KyUAwSz5jrdCML8AJkNncndRA=": "462146000000", + "MNdZLnWLLnlAbS_30XOZjrJlZHrQ2l5WfMhTQd5tWvg=": "767487000000", + "MNpMuvl7KGJQ4qIkSNDja3PTuu2tntCdthSItGNYF9o=": "1542290000000", + "MOCOzmaRxxNmsdVXMl70ISBS3F8nbl4dQ0maxlfa7LA=": "3334016000000", + "MOh1kMrW5uDXrrMbqUGPq4DADiGBmi7ktbJNoVXKjNg=": "2305133000000", + "MOlTIR67kihbwoAsvZJ061UBi2kC0t_IAStWt-PPfHk=": "383158000000", + "MPBABNGbtLrvMFdF2arWy3Y0dReBCTkbVYq3xjkRmzA=": "384615000000", + "MPZr1XesAef5jgn21LQDp6wZaalCiYGT732UFEcClds=": "769230000000", + "MQ3GkU6s_TraOAEwWjY06m52u8B7Pu83anfRI8Cilq0=": "467517000000", + "MQ8udTqIukhcJyudmR9yo19dF0ypNtwAL8aS83Oy1g4=": "4166638000000", + "MQhR3lT-fmNdGsRC8Idz0G_VnOktrSpJk764Bp55J1Y=": "2743534000000", + "MQnQ-QI4zpuPohD-IGv1LjtswdU3IGXMYz8Oe7_hALY=": "576923000000", + "MQzG1OvUmrtrXcAEE5JSp9Ov_fIMNBrjyJ7v3M_Rhng=": "3846153000000", + "MR5FV-Spod4I6H1SJCU-aYVeuAmGXz81-qtiX6FcINI=": "998371000000", + "MRJji47obsLGFkq-CZxxC-sKiMZzPN-0npgxylrrPWg=": "378880000000", + "MRpbGS88HLTn6AQOvIS47Btycj7vb2Sr1-1E8e1zKT0=": "405030000000", + "MS8_hYODPYrzTmppk2f8j7XC0PagjwdeMRFQVoeumtc=": "1927554000000", + "MSjqcFHts4e_U-bmqpmqpm0B7DHsjR-BiDnR_ptShC8=": "411768000000", + "MTKrsse7XY4dzz4GetGWVXPhpL8ju1BM2kYTuKdR47g=": "4246727000000", + "MU01LXsvsCzFPiYO8ewSb368PVezi_2lE7zoQM2Uur4=": "1538461000000", + "MU1jn9k_7p2L-WauD9HS8khoz8F_Gi0_CA-PaSHzqCA=": "6219730000000", + "MV-WeNvOpH8qvlBvdZUhZW7QZBP8fCHwFb85JUS-f0M=": "1249999000000", + "MV8hlpMjKrvXYMwWi2f7Km8t6aXTnqt3gbN5dM_hVu8=": "1666666000000", + "MVMgaQEjy1VWe1lh1z6K-QW2CXyfE0ofOgi4JHmbcDI=": "1241159000000", + "MVQ14artiT9Zs3lBzyVrvuAsHGmVZSJ_UWEeOxZrymE=": "384615000000", + "MVue4HeoJPOYAQbZd2XujoFDxruSgY2KCVhd99J6f44=": "2213262000000", + "MWBBezMCcy5S_Dmfrou4Ze3P3RdDDGNZ5xuI87Rbmn0=": "829261000000", + "MWEqbERC4WViAcLzaC1KXcciggg9fBzOaj4lHeUv6vg=": "1970805000000", + "MWW7DUAKG4Ls7wpq384YXjpHvHR6UqN2uCpA8j69EyE=": "421193000000", + "MWY8RORPyRx4wXzeTYiFq1OuI_NOA729uZOTDRkGTdw=": "565461000000", + "MWeCkmblmz9IyIrr8PVIZdBW4BQegrxcN8puHFaHnSE=": "384996000000", + "MWiBChjSCjnC_oZo4-SczUNw1eQvG-gxlisNDInXulE=": "460759000000", + "MXQ961gXm9PZRULUgTCiQnSZE7Nf7TUlUZltxBAktAY=": "2371003000000", + "MXoFokuV3pyTv2AZgFVBl-IqhLkCYV3jMqLGkCMDZ3k=": "5553258000000", + "MYQuwKKGlyTpzOiGJDDCYr_232aBldD2_xLW3RiJRyQ=": "384615000000", + "MYnlUAlbXSpKK64I-c3SxGsLQgSIAsMd_UZeebfdV1Y=": "1153846000000", + "MZ14if__ch-qd7OjrGAxwXdVRTVaTNCCULzuY9xMiIk=": "10704106000000", + "MZHzPFGFwIDkSaQtIazhJRpYaJpumll008rVPjfaah0=": "6153846000000", + "MZz2PTYYCYj2BfjbIfaLY1b0vLxPA2JvAu28WHyhzZM=": "377887000000", + "M_5XpLTfv-OIKeSi_UVDuOMQ0yebVDsTGCFxwBH-4OI=": "385506000000", + "M_Luz98UzU402QvkCpmSPyp-LH1prhzUF4W5VQKpsXk=": "558321000000", + "M_lEFsjCOA3wwZ2Q5v0rNRAwbtnBx0Xb7-HTC-02tqc=": "544598000000", + "M_m31vK32vHCtODRcw530SNwo1LrIZ3Ca8OX9SSYyS4=": "462146000000", + "Ma8nS3XG6NARGTO6da-grfQUNIaNIgQngrmIAL9flY0=": "1153846000000", + "MaQGc0Qpu6rtw8cxsBdbYAZaVHZPfYoSJHYa4tVPSBI=": "1921659000000", + "MaSu_JKENBX6KFDcWhCLohKnVAcfy0YXTSTNygy6m9A=": "2300127000000", + "MaY62EH_eZ5HDIBUL5AlucFaUTqH306ClQ55XtrWuko=": "384618000000", + "MahciuEJEuKvEE9pqdO6yKE_0cVwDZhdEf7MY9lYobk=": "2499999000000", + "MapPuQ5-G-W8m_wiNON6eLn4PLYPrPHP9gkmN-oWp0I=": "404440000000", + "Mb14Qs-CIEjWLWfCjnG6nXxqvV5mYXJlWrHDhYLGkYI=": "3253909000000", + "MbGvPD-z5kzChWNHjnXWf7VzL9pLQCtiCbJ1eBsLmGs=": "4520695000000", + "MbNoWAfJz1kxPfxQKenxUc2UrvEU64SiS_iQPwkpblc=": "4166673000000", + "MbU5JQkpT9TUa1_vpO__itScgY-07p4UDB6tWmmpP5s=": "406820000000", + "Mbu4_zdK_WZ1NdtVqWTPpLiJaJRJUDbqYfFrfT5ddTs=": "400250000000", + "McBlS7WJAGx7e6X89XQz-8Y_NGN1y3Qvq9gEXozQfuE=": "454545000000", + "McsFNhsb2LdEpuvwBz2nUOtdlIkRQOjTibEgcya6Rbg=": "376747000000", + "MdFigxeL3TiZ_xHdKWI1dYGv5UlC40JxjvyIaQGKGF4=": "1005656000000", + "MdOf9MQc7B6stSNSynxObU_YK5SxkCZHztmguLb6Rds=": "453801000000", + "Mdc0lOq95YIWvpjLows80fcZ8OvRxMKs4RjhFj0eKOg=": "3846153000000", + "MdeV7ZS80JIBz7gUmCPP5ICrOcnU0stbYzA6rEOEXk4=": "832966000000", + "Mdn1_gfpeLG7QXHqwL_1tP8QGiZR2hRSv2-u8scvE88=": "383601000000", + "MeD5hj8Vdh9sLbzZCX6wSysKjGjd6Og6Q-fYWPoMFk4=": "462638000000", + "MeGV0Ssae4dCbT9mXDdsO3ZrptKK4rI-Gu81LbwBTOs=": "384615000000", + "MehuE7PKbJgcmMyaRb5jSTKU4PORiq4KXMcVm75DpX4=": "1723270000000", + "Mf2tEIAFyfNZ3w6HQWHB8_V6zR5dQr-GfCzxj_wgHyA=": "385510000000", + "MfF_k8lUrsQMMp7SpwBDvCcblXf9LyALcClTzfeaE5s=": "3962018000000", + "MfPbZdhycEOuPbKkMoa3eJq6Qhx0KPnlpNBZlRTfQqo=": "942578000000", + "MfxLKTDXjZWBe5nv2FIWYq6IS3Ur1liIHdfVhU-96sg=": "454116000000", + "Mgg0b37QNJ8Azu4yriTrc9RZ2pbgBM3Lettgjncqk1g=": "418865000000", + "Mh-yPc0yVYVUbx3hzC4h5o09Juc5bR5y074cw99zAxE=": "450738000000", + "MhNw4XI39zYEvlS7N-5cRq7TUwU6ZLnte7mmNaKZnm0=": "3641740000000", + "MhP4RMVT3d528PRUy3YxpWQZSRJa8IGtMXL5OUYvVp8=": "1250703000000", + "MiLNQqLaZy7_aNsuZ6ABVIU0CpJphYObPDUis9aagjg=": "455980000000", + "MiNQOiN7979exSfymO0nWf0Dqc4qu6uvF5LsNJahAAw=": "999999000000", + "MiYw_8LQqURR88LMPDaBirqwl1dz2oGFJqEVyOFgaGY=": "769230000000", + "MiZ8BPUmYVirgbzcgv7iV6Fan_g1BMrWDFHs-FPFqMg=": "400988000000", + "MikhX9j6gaMp6aB365LolFovXJIs01GzYlGAnATg-QM=": "473001000000", + "Mj2xrk3zkKwivEQvRZuFyluOGoLHwXjscLpZvLewsbQ=": "501144000000", + "Mk1FJ7nhnUwZ7ppa8AkoPd_zOf6Ol_1Vj9Vyco5rzio=": "384248000000", + "Mk67PcOzt3R4E5YSPW9wC99vuocI3TKNMmlPsT0OyR0=": "763672000000", + "MkeB6EF7AZ2C0szGE5JCYHFZDfyRKhBQMppbvdVkZtw=": "455261000000", + "Ml9mqnuK9u9VS21YD07E0mtzJNqKnYa6qllplQzjux8=": "447044000000", + "MlL45YjrQQ-snTz8n2feMVRXawwINe2vm3X_yCWyL1s=": "2307755000000", + "Mld9pT0BKE76EX7DRBqE7ipkeHyM959km-SoR6d8Rts=": "6041640000000", + "MlkMCg0uWh3d4MImxx1NbyWNVZ4wqCrunwTw-1gnhQU=": "2323501000000", + "MmK6EWlJOqmoc3MDe9fsL2xxfQnD_qF-u5RnEqbagjE=": "2565560000000", + "MmbklapY0shZYAXqB9O42-5He3ThYAQJ0DsAL6b8OxI=": "5384615000000", + "MmiIYXjsqGdDp6jdgqWeXIkklEVeNsNONT5CRh29cuI=": "4179751000000", + "MoBVUzj-_hFafr-b2jY4d-Faj1DvkPhhlVkWegxZavI=": "1478428000000", + "MpAaLWWqJGXo_WfFOUN7nCHA0Qu7XIgiYW6XINBZXN8=": "4230769000000", + "MpINi-n0PPhQXloFU6IWHZ8Xlc4zgJ8fU_o6rhBKvZs=": "385508000000", + "MpngsHkUfA511BGkLolYP55XnsjeDQS7tQVZF5KAiVI=": "448027000000", + "MqHRHnVHDqtNV__B9iRxYD_y142ofsoXcHAXW9ma0EI=": "456529000000", + "MqssR_RMC1iiBNH5riyahXhFSXtkJepBg61WuBbsFeQ=": "1378190000000", + "MrCUj1j9w6_Z3xflkM5LtRc5WA_-gBPonKPwDNZq33A=": "972231000000", + "MrQhtxbS9cFMhX_fl6NNH_TI3xN4ObauKwQLDubSHNU=": "906221000000", + "Mrp_kwMO9n5XoihMBr6_M_Qkn0I9Q7utOX17btbr1E0=": "2026136000000", + "Mt5OAVqAawP-OTAQjqnMVQWrqKTz-t0Td3XcmNT00OQ=": "411085000000", + "Mt6dZ_rszOC3JM6icUVLfUovHi7AEfu-XfFPRgh5OGQ=": "378717000000", + "MtBe_JOGkgPt_AB_ezYeJM3LF_ZQVf3vhP4xES3cJEg=": "1620910000000", + "MtEDKobUs8YBUh_pIlR1rBnEbwhH3sf6MOk1Q9tBjNQ=": "454138000000", + "MtcA_rBa8MXyLalEBbox5Uo8d3u1UZLIAHyTcvg8E3Q=": "456193000000", + "Mu0BbzEX4MmKkLcSfsHRXa55O94MoJA7ho45o3knRCA=": "2916362000000", + "MuCV5Ec3qf0C666dJ20vv6vRk-NpwDXt3VOAmqC2XGY=": "379260000000", + "MuPlj5rn0tSeEbZrN2iI8ENiyBCQTrMSJ2de5maVhI8=": "43339829000000", + "Mutep7fz4IHpNS1eHXnQRPJOmciz9ql1QJF9IAt4XBY=": "781381495000000", + "MuzA_ByXGhtn4DSF_IJpPz1wQN9rkTExalvIWTYFPuI=": "769230000000", + "MvVwtDrtEZl90a7xHgmGhwTaHMshbwcXGXlqO1J9hB0=": "410252000000", + "MvsJHQWe334GjBQ1PGY768lWrY7jV0sVCM6thqz5e9c=": "384615000000", + "Mw11qiB7Ze4eg7PyArwJkdJc66X95dKe4BjVQkoMtjc=": "455600000000", + "Mw9WytWVToZhP6bG3s_yX4Sbs01whVCGRLp2nvBiHi8=": "692307000000", + "MwNh3AxNCxNkDt1kdoo1y9fFxWscMfUsiP7du-dLzrc=": "1207455000000", + "MwVAtoFhqihEPIs-7THaEdA5nj25X5Jja9daFFPm7lM=": "1249999000000", + "MxB8neoK9Hd0FjrSRbiCRRK5luRlxjTjC0q7jBLz-pQ=": "460483000000", + "MxMqZd-_AS6P549pCTZQHe9u9DqAlyxGpcbvfnkN_3I=": "2695757000000", + "MxQoGmu0Ln5ZCPfz4Qasup1pEemJJyqy9a0bH28_eYY=": "2065000000000", + "MxbH0uVEkmpsBBzZeyofvy79a5kfmO0bmozmbkXer-s=": "1995381000000", + "MxgiIO4RAH9T1qdvRGA9YG6WYkjNo2qS6fb29H9on-E=": "460816000000", + "MxlTORr-graLY2tHPnLwHI73laO_pOhmCRLUmo3SOOc=": "457027000000", + "Mxw6KPxI1McJkWHRI0QZqV5311rrvMwVWo0ZX1DzYcA=": "3846153000000", + "Myo7bgXkGZcgDcNFbSOFYnI5SlqCeaKB813NdmekRNI=": "1153846000000", + "Myp31sAPrcXT9hrNfr6P565EKa6myaCaHF-Mki17a7c=": "604086000000", + "MyznASw8yWD5cGJ7PFCDDRD4e5A4HdcbUEi_94UEtXI=": "2088182000000", + "MzDd_OUL6wISAoc2Tj2tUj55L71-pehfum6s3FrL2-A=": "499999000000", + "MzcCutGaeQv55pDqoMlqKeJxuoWqpZSque8cONFS_wM=": "488462000000", + "N-DndZzOfadk-_TP7FbOP8hOs8-hO85j5E0QUfILmVA=": "1236262000000", + "N-Fhwc--8sdYQemK4YhdK-Q2d38DMTvoxqaeRhONwKE=": "416666000000", + "N-JJ98cz6D2GoBdll1LqPxBvAeItQv2YIAR9hcbu9zc=": "384615000000", + "N-UKbrmU0Rz8A80uLWUdtB4i0OAjHwEEKbNi9O2q34o=": "495740000000", + "N-_yq03hxiRjLPn7l1I8eoIoxy-NWrwe7fQShnTDH9k=": "379344000000", + "N-q9DA28CsrQ49-l67ot7g88kwg31S6DGA17j7AR1mA=": "455367000000", + "N0N8QNNYOweDLbCnb7b0-E_h9uEsIAOTbaFQWDmUX8o=": "16660133000000", + "N0QrwwmxupzXOXrYrZFO1Bm7dspTjRZXUEB-2gno9FQ=": "384615000000", + "N1E6zVpjsafuS2A4XN_53NN2w7Xg0MNIZGyH7QaMt_4=": "909090000000", + "N1GJppKEB1tpO_3IcJsiPV97yFSBu312dO4FS8QtVPc=": "415231000000", + "N1GYUv3lOTNhtGM8VbSorT5cLCBq0nFOuGaifV52Lk0=": "387280000000", + "N1us1tT_7_4x0fuW1WZvoPFUki2PGYsj3Nr_Ig_2X4o=": "391885000000", + "N22pmIqspTmSX6U7afLxr9Dl90B6N8MX9d9dJdACGow=": "5391834000000", + "N28xJXlJ4Jq7Ex83DNhbUFO5lQJPyULx2prvXh6ZhOg=": "3861978000000", + "N2J_X-cAi5OUfbudr4JkyC7UI1dpIY9hlxR9Cn5k5iM=": "1517650000000", + "N2gaCeZGCA5PuG4hx8Sf33DIsQl-TxK1HuddcH-UMV4=": "2088168000000", + "N2nMXaC4SbFEF08OgJvjsaZkUdTYv9yetmwyCCTG14Q=": "577089000000", + "N3OqymzG8OvLC_qLr0MFmuSmAC82K4U6uUNS5V4IGFA=": "16889531000000", + "N3vFUF1QrHhL2TfqOndTQ2twdorc9-a8wGbQllkF9yo=": "392385000000", + "N474EbswAR9WCMpDtoQAWhYFFWq9aPCz13WTAQ_PiaY=": "2482581000000", + "N4DWdRCaTVyupQRna2xFOdx2JOwtTy08mEipELMfuVs=": "5766272000000", + "N4GE3-a4olGZsZwDYg-MexIodOkXhgXLoPUuynpD6g0=": "4624898000000", + "N4WVSvfKUitlSjUT_FUxyxf0ER4UmOdAFBaZ57W7LU0=": "642211000000", + "N4YAOMA1FP0HaGJaM2iB92PpP-YN-fKg6EjCKodUJrM=": "462839000000", + "N4gEc06k_75wCGiJXHbGiKS7zCVFKLkwBTgSr1SdAq8=": "615384000000", + "N5CSOYZUPsgl3CCiw3llOGCYp_aQZxGY4gV5SStKTcA=": "407808000000", + "N5UpAk0UqNETqqvVGB6CDHwIdiLLgMhaw9U_388-bN0=": "1131929000000", + "N5ZpYX46MhY0unJOUGWqvPNpATGNSoPfXTjE-oAQUtQ=": "1550277000000", + "N5aEMCv-2IBhg5Ww01dWv-AnfE0Bp-A49c6rILOopwc=": "470605000000", + "N5pHeJ-bBPyF3PkL0-rCO9O-ATtbRouPz3L2vT4ojk4=": "4132262000000", + "N6Rm30GqRiloqDuq6iQMpXAslo0gd0SCwRzWLwF8Q5s=": "404016000000", + "N6cQKexHgJNw1UfH_QOkry_sOS_-nSP7rKUY8t4MXWI=": "833333000000", + "N6ih5p9-mkVUgTPnPA4nsFR0OfIlK5kDttUpklcAoN4=": "33799323000000", + "N6lKPUMkZKrmMKC1ZIzGGBPPZHC8LSqtOeiM23hluGM=": "515113000000", + "N6yQKQJB_q4nQ_cN332gmCwb16oS0z6RSRBnlD-zzYE=": "3787469000000", + "N74MQovXnWn35Xs259bKsH2EXQ84ZT4b2quRu2FH2hU=": "3633155000000", + "N7M5u9C1M8_b3DZ5YRUrQDXgs7VxTzd6dhj639ClB3k=": "686722000000", + "N7QdIZExbcsJlIBxFA7PLlpvBfKW3wtqeA7zLSaONE4=": "493827000000", + "N7hU_zhLj0d4W7QaDFlT5u3ivzlLw6iR7LuVkTnlIfA=": "4903266000000", + "N7pyHMRo3T2D0JwQenKR70qvXhjTfjnCcCc_W7xO_bs=": "384946000000", + "N7zDldRXp6JAISyvH41jjZ9r5vtrBKK_SMxPwnv4Ihs=": "1763423000000", + "N8Zs4XZbkmaDy-IqNo6Gy7BMNykj2_qIuwcgZVsHDPM=": "1153846000000", + "N8eF54ar5dI-GlP-CyGjMRfkcgGMht9ZCupJKZQJhtY=": "4953917000000", + "N8nXdnnTzocEHEYdnn6dBFfr2pBpFPwHYU73gPzaKA0=": "1119367000000", + "N99dI46WQwNWA8MSypoGm7JWDFXgdGfJxL6v10cnrMg=": "492798000000", + "N9LefuLKivW_At6C_iuMidWRBFvMSkgF7zSlJcJu9mM=": "416901000000", + "N9SJGNMP7cnvT-O4cal2GMnVm9ShKNGPrtHZdT2Zj8Y=": "1642415000000", + "N9X7yAf-9Rp4bjal2NtgXdnCrfSMuGPnY_uN7vKxbhM=": "377191000000", + "N9ZtleTV-QYsdZa1jxyMR3M9q3LbP0NBHnyAXxVgFVE=": "530056000000", + "N9k3lBcGirj8cI3-ShOQXLHRJ7O2fV3LjMuqspB0c6I=": "15999872000000", + "NAG97quC_yXTonijIb5A8lmpuyWLY2j4_rQ0x_CEONc=": "1132129000000", + "NB9zWtN5oKfT8K6OlYn9GlrOB3agzGc1zSud_liHCSY=": "768894000000", + "NBQ6ortS-uCgVtfFjtxz0xEbEznNTagcmYUSZ4o9kAg=": "384615000000", + "NBST6p-wgx75T6gVUkSQiWNHzZfIQmev-lcamPp7Pe4=": "3776928000000", + "NBUALN1Ryevmd16lU61eL_h7rd0UMdnyFOMPIZAeN9E=": "366402000000", + "NCpZJojx-mhZQ2UgovMoaIpMI8uFCU8SvwavnX5vLpQ=": "537684000000", + "NCquiUzKtR0YQoxxJ9re-RCIlxaLsHbk0v8vxajoHsE=": "454485000000", + "NDTEnpzckI_V6A9CqaIk57VzbRdOPIuUe950EAch0kw=": "2337370000000", + "NDjQ8t-fV-i5Y3QAoSas-a5-4DhgHwWFaMjwDu0C1Ts=": "1955916000000", + "NE5G78dgVzA-aYC0ZpgQynKNns1EcTOrQDa5Z2wsl-E=": "422196000000", + "NE694zaDMyo1IKiJuQ9cxpV6Sctne2eFWggWxOVEV48=": "1923076000000", + "NFFGUYxQ6h0h4nkHyq6qCVLG8hnn1_g8TzjLxXhKIm4=": "458399000000", + "NG1s0q6SBBbgopfhVUpifSrHzsKeg_q0VodVXJyaes4=": "769230000000", + "NGVwGVY124YLizcovX4Z74CaUV7ZSGI94ip_YA-VhhE=": "385506000000", + "NGZcP4P6r8Q6uYcPPx4MbNfjTwzuSerxmVl3iE2--vc=": "378614000000", + "NHWU8vvo2to5GDAbzRZ6Z5janOp4XPFYyL1OV5NfpUg=": "1249999000000", + "NHfFoV9OY5m7_hdtsWfkA22GAOxy31e4oLFtJ6gVfts=": "385506000000", + "NIac6Sz4Y87cCEO7E3R4gQdot5nmYp0_ljLtc7Hdgbs=": "382765000000", + "NIfH8vzi3Xijh-534baF44T2m5g0gcA_AuvIZ6kQkCc=": "1904794000000", + "NJIF7YQGwFNy-82Enlb2DClbXzZAwpzmu4EdW14fYZI=": "5769589000000", + "NJaV1zMNmF4L38nOHiK9TT4mdgfmaVuwwThPQ0QfTOw=": "4151312000000", + "NJuitMYjEtUUP79ovXdYZ3wtDu_rTwGwxO-95d0a6lI=": "470202000000", + "NK6jKyymvGkOrYPUBF7yLXUyO_eL9Os0jAWoY6qGN8E=": "2332946000000", + "NKKa3Dg9qSoEzrh0xxA5MLfGRRfswqkadmaBE-NdT3w=": "389230000000", + "NL6eLimC1dUPE_sDASln8zqscrZ1Kz7kwZRD1d1BESo=": "1698694000000", + "NLSBof0FCzjjn8NJ2lWM1gg58YqHjWFFCZ2BsWDpBoQ=": "460196000000", + "NLZUpRmweRlyzQURj-vylg1Y86WtAMUx1UpcyD0bcjs=": "385690000000", + "NM848D2V0JqccV_5zkOCwyK3lEkJK0_k48PObu5w-T8=": "1154003000000", + "NNUKqCTu9wJCFHfGd-nkfwgunzKbn_5LKMPGprE3PWw=": "684445000000", + "NOOictPYyKM3XQ2rkXHKf7LE11pbPx6FRMIlIVgB6l4=": "385035000000", + "NOQ7_D5q3dSSQYMRip794nIsjNYeN2KW0013uDw-E9Q=": "4854617000000", + "NOVogrx1ZLmJJiJnzqRdPGS1Kf_S2GFqXNnJETA0DhU=": "377901000000", + "NOZVdeVFnHFWdDA5D87I6gaIrVTu7jiP18xaaji_3Bo=": "384615000000", + "NObw_V5Hdp14NROiW0PKLQ6JRpiHhL_f4X1yIKFRkJk=": "376971000000", + "NOn7EEQQ3TPVZy-89wQTOg2cs3HCnKAocjcOvcwp7Ao=": "25000168000000", + "NPEeYgd4s07sJpdtRbKwWPiDTbnhuFay5eayU0DPYM0=": "353298000000", + "NPNGlcgrN7yx3jK3iMo8BmPkkdCZ1cFyxOwtlMMnV6I=": "384615000000", + "NPxTke7OLBFwWBB1l6dRpg-nISmZ6hnO5MaUrVDXh2s=": "10683461000000", + "NQ7F5ztE0G_5f56YVP3Ce7LY8Qyt0WOGz9ftpZnBXxM=": "973754000000", + "NQBsEOLkLnKBdzf3TQKHQ9UFz2Id3xqCZuNCgJiViwM=": "930249000000", + "NQDINJWEHs2dhh-PCrRPSkHT6ZPhvBBZMEM0Pf8lRCg=": "1223425000000", + "NQMgOSwABct2NF0zVzC-ESOpDsZq42QabgFFMXJMbiA=": "480325000000", + "NQXVuuYqc56tYOQpnbYBegPblK69le9xm9rYRcRatQE=": "388604000000", + "NSDjEYIATapaOTZtrEZ0cyu5YaW63HhwN89hD9iJ0uE=": "417635000000", + "NSOB2Px59gMb6EtwHPfrnF0Bm6O0YlZDe0EeBwQfb20=": "520220000000", + "NSrvyteU4v7UVif1q6KHJhEHKR-JsAd3HxtxpG_nKBQ=": "769171000000", + "NT9KmOnBuB5hRcRslSQ9dlWfBj4bTvhUPQFpka-p-n4=": "2316163000000", + "NTBBpGaeYblpJo_aIWtTHBGgp_d9i3NW_j6bTJRt16k=": "388114000000", + "NTGq_pdGMQGKAiMvqy4ws1eJh4sF6akywCXLU9UEM0A=": "545429000000", + "NTmJ1ohyD7-TgQBjtlirJ9F1YyHXb-2TU6hgX9qdTzQ=": "385509000000", + "NUFfGbFheEexd79OvtM0tC22ayOgXWkKPLWvGiyobRw=": "2611637000000", + "NUYGY0ErUV6nKF-RP_A5w0jEgYrDPtykCUXRxTMF180=": "656903000000", + "NUheG4NTNB1JR-QQu1AR0WDwAbuRfrzXvvq2EoT_iaY=": "493696000000", + "NV1n7bJMaadDwe0fi1__xWHHtFHlohBuiqpoFuphPNI=": "509737000000", + "NVS3CsTy2DOtod_ma6jDb0EqAe2qwvUdiQvAHSkWAk4=": "1807692000000", + "NVnYI_q0gZPKqSC4ePKLAkDcX5ez7EjXHUMJ2WzmU4Q=": "3233699000000", + "NVw_Bu-PhvnlTr__7J5-wVnWqqeRycIBxepp4tW3Ahk=": "384070000000", + "NW4Z8b0znXcSJ2ZDNOLtxDNBbKmCwQu2_yYnY1fvI4Q=": "411085000000", + "NW4i9JEbNBgHJlc-3FNuQnI086zW-jwZdxo_fGoQubM=": "2088177000000", + "NWhviTSMT9JUKaZCGtrsmzYR0_vrUEIoSr_P32FptP4=": "446388000000", + "NWkKHkZ1kNNnnN8IHqzndGmeCYZrAKRzuh8hU019HP8=": "3264165000000", + "NXEJH9L6-ctf9vy2rSkPsMVpW3I7pc5k43R5IvFAcAk=": "624393000000", + "NXoHqMVs3rv8PfSeyv4QOOUilm3f2YHIYLb7gtHcTkQ=": "2059257000000", + "NXtSgpTQVyXMPaLOnkugc6MBMc-mJHbbwn0lDDqAz-w=": "416224000000", + "NYVK8eLEx4oNch3aDTB89yY3kBfnyh_91x9zlDccVdI=": "383258000000", + "NYc0A0TrDrrcz8X81srQ_If3_xtowYtiY0n-gsVGDZI=": "1924888000000", + "NYdmQmjP5KF8az1p3RvA1wY6-L8RlyvQq404_j10hn4=": "1041666000000", + "NYr6SGSPizTHAEMHqMtcuDxvh6zPEaJFM0pkiLzV3F4=": "384551000000", + "NZVfR8gH49vvOKk4LL64czQib-7ZY2bz7K_InnA0jDA=": "4694684000000", + "NZtYY24bO82zILTfQCK5SrWmBgbHl899UPFj7wSnR6w=": "1859815000000", + "N_KpK2YwcS0YjPve8tJzy3U2gbcjogcaCbN3pG1aX7o=": "389790000000", + "N_XQ7KBc63FNj9axvU1hYKIeq40SY86tsq6dQhZuZog=": "902412000000", + "Na-s8ZCW9Dy8LcQ6FDb47tMWF2AgthbtlbZ-ImU5CdI=": "453469000000", + "NaLGPdZH_pY38luhJEidCAVCZylJW6GsGWW4DhMa0cc=": "423076000000", + "Naay1v9CEpQi7NmSaK1J4xyYfz2Ng4WK_9YleI0UpRs=": "449443000000", + "NbP5bXm-GwWfdfna0MoxIPyGWvTXFJXo8pacSCvTyN4=": "378259000000", + "NbWIUDiyH_SVRVCBiYSmPYn-1whXxNmRugOc52i7uME=": "2083333000000", + "NbX-epnN9XU8Cv4UhzwLS657-8T2IvcIc7uQmnNQoHE=": "2820045000000", + "NbaetFKT0VG4vbBokgn-7E_9hdWQoskzhpWuwMMWxW4=": "527177000000", + "Nbu7sp7CrcoQ1SLLnwpc7EwX5yWnit8yo6hgHrNYhM8=": "1267309000000", + "Nc4EQIVtBxlHceRU4B0gLK9MoZyAp6ld9V2XixjRAHw=": "453318000000", + "NcJ0C8DmelI9wWQ_3q8g7EMvKziE65LNtJlBpAegSjE=": "461538000000", + "NcovRNYjaYsVoZET2nUTnbu3jyxd2U7F1CIjQ6w1nFQ=": "4557211000000", + "Ncxhwp1YqQibCy1r_SwhcVmvzDy9z2K_zTaiACzTwrg=": "507660000000", + "Nd9_vte3fifZszUv5Yn9xnGpVKt8M4rOeo0GFTL7v0I=": "992423000000", + "NdH13wLiLrJrsYkcMQlFoiXn5OPZRgY5jXE1tRD78Aw=": "1785049000000", + "NdKkueCrgg2LYER6_NeFf1aZx0FPmrxL-NnmLyR2q9w=": "587190000000", + "NdTW-w6jYqUEpoqobEk79uV9d-2ZpoJ5-HbAF-UW_8k=": "769358000000", + "NdW2CiNOi30TYT-5Diei7QXrb36Yva86mqYDy80KzkI=": "415399000000", + "NdbjboQ4bOHr3-csQWuU7AjUxps2uNMoKLtXcmOpQ0w=": "403063000000", + "NddKr45JS2wqC9fC2tRHvm3sAFncW4poJjz41FSqbPI=": "1141815000000", + "NeP_nrVKqJ_9vUzxJiUCH4_-WAj9zJS3MTRR97UFB3I=": "455781000000", + "NeedjSVvIYkMvurNpNRHnbzSY_9xmsV_e7B6Fi1HzAY=": "1134771000000", + "NemIu95fq9XYqrDyMvtJDwog5A5ZLBKz4KJjXxBVPho=": "3471292000000", + "NerAic0iMBqhHgbnuICUgVVenOjRd7yAEj_2uzIvJfo=": "769230000000", + "Nf6EeG7mAp-nTlj-spCG5H5afMX9HgmG6JBsupuGFr0=": "4079015000000", + "NfC5RFtRxUeFuoMDt35HJaFnFLJaBwu4UKyLnJuzlTg=": "384966000000", + "NfJgld6fXejchrbVUZ7hYgwDLD4Xaag9_xvifZwM6d0=": "456259000000", + "NfRt48IriI82UJdiaGctC0UQSpOJWRVg-wpvvZ-xFcU=": "450924000000", + "NgHvDG4tftZ3_DMttHfWgj2yaUA1uihBBA8PBrOY8UM=": "999190000000", + "NgS5ptEUlR4603XQRDTsoUss8kYTZXjmpNEzGYmq0GY=": "1963689000000", + "Ngn8lqkoIBar0ykuhK93GaVj8hGoHu9EvbW1Dp4xCIk=": "4037983000000", + "NgwGQYBMThZlx5T9Ejo2On2kVPOByRYmibmVML14m3o=": "467059000000", + "Nh10_kjkomAYXEBC7TzKwQkkGxde21Lksu2J4kyPhQI=": "500675000000", + "NiLZx2D5lQHshFVXda5wzL07dbjxhfta6bgN8d5wnsw=": "6249999000000", + "NiOY1hlEP2DQNJOshgxVn32YKsrXcs3zHEiLNoULOtI=": "448509000000", + "NiUjN5G-5eYaBDiVRbbJKV092SzIhpRuf430srU7uYw=": "416175000000", + "NiVaK9EC3hEVdgtUU5Pwepps4xQfeekzc2dT3bQLHr0=": "417948000000", + "Nj0FoDyHAckhOGHW9w_eSED5uegclt5NvwpKuY27kqw=": "377448000000", + "NjKx8NHFdPrQ96fDTsInA3DwVpI1PW06gTloOr_nsmI=": "385423000000", + "NjTfDG-1OLxz-Ao9hISHNsXIMPUf9m710VzRF5jFA5c=": "1233257000000", + "NjtpanEwLBuIyYgbZx9J6_7lET1W8htLV1_sUW_ng28=": "384615000000", + "Nkfg0JlYkXqkd7efZAJfCi7UdIetSjfz7Jp_lAZOk5A=": "380858000000", + "NkgteyAcBDY-Z4itDieY5F89Y4YDrRNs97J71sCCsTg=": "768005000000", + "Nkq-JRPuZCR4qXW2eUTIDCIb5DRMjBK-NJl8AIzOBYk=": "385152000000", + "NlOvxpaxs4jV-_jCHZG0CfDquDlrczpOao7QEaCWzRo=": "384615000000", + "NlTFg1zj9ekvIJMdRHxwCpWEReyn1FSk3QCvYRFEX6k=": "462146000000", + "NlqxUXWA_oDO00C766s7lSt9dQag7-BfL5RglIfQ-Dw=": "1918144000000", + "Nlt43UR_v8wC9WWu9jFI6B64KGM5Z0T61mFnzqPUdmg=": "384615000000", + "NlyRsshc2j64w_YRWTl7gLNU-tsDwpS5OUpbzUx9BZg=": "385506000000", + "Nm6oTE0-SgREKFGb2gPQmUk3GkhMaEUL6u5uej1jgAc=": "2266350000000", + "NmD9KuPkO6CjwQnQnIgaLuJerEsKRpu9ZQHr0UcHXwI=": "818220000000", + "NmJTHsLyE5OYSz-MewP14brFBY5Dogv17IovssvVCl0=": "1388070000000", + "NmkB5KccZ5sKOIxQFSZfb3UpTm7lXhw9XavpmhqE_yw=": "453243000000", + "Nmtjv_fQi7KlOIYYUQmqfWaOIgrnl3UqOoHD3llwxtU=": "469885000000", + "NnD-1gCOw2fbqX6q1NK8zzMaJzQpvdnJrPmjfHRFvNE=": "385507000000", + "NnEPFOxvcdzKtn9K15KFxFst8ubE4pNEqcUV3sTBntk=": "445583000000", + "NnUXZAmJXB6Pj0IJst5vXq0YfAoi6r4N9KalSRBQ7c8=": "384615000000", + "Nnr3-XvGachdN5U0_NHlHPFk4o8_7Mi_zyRxemfDIMc=": "381338000000", + "No4201ygxochPCQUOq6m7q4pFNEAHOyn2WsneIiCUr4=": "767610000000", + "NoUBsOH4lPyLVjIosnCZZcLPyWXNgE8HN9wFLarIAvo=": "2292284000000", + "NoWpGf8xyEg4PH0KOaykip70w-hnurTrJqZbAm0Fjko=": "763672000000", + "NoeTaxodxnsuL-3RwJvi3rBta20L4Af8bAHBmnrwyYA=": "1237753000000", + "NpUJZmEf5jvGGOQ_zRZP-ZGSJLFvmHAig_tEA7xpSI4=": "1223425000000", + "NpbORBCiWFI5Htm2D5eMC9i5uI0qQw4xcRKCMbcJo80=": "379928000000", + "NqSvkJSAeyCSKtasWe7_Y2ujHjGnibRutu22e6fWiqk=": "2083333000000", + "NqV9Fjb0MJ8aYNrGDvq9XAXzNC2NuMlYngcW4cJbYW4=": "453196000000", + "NqVmJV31I8jjhNu1pRi5D4-PXRSuft3FIeEkTcTjAEE=": "1499999000000", + "NqXfFOS8mIA7OtGuRaqi15wEPqwTpfa5RMH0rryXE6s=": "384069000000", + "NqZWt56WbraiOyW5cWxfTXxlOhaAAClQTRH5MUfATq0=": "1375110000000", + "NqdAHcubPeo361HI4IGVHOgjj1t6ISB5ejMqW_QpRIo=": "1702174000000", + "NqdujHnOxExH1CqgruwJ0sl_3xPYI4eM_W6u3L2U8ac=": "6517451000000", + "Nr6fdwC7Ks0VuMHSdnaUnPfOsrAiagAeG3oBKBrVeQg=": "944207000000", + "Nr89y6ldZ50blgSDTWmrcNhwGiHohwI7z4rDul_HqvQ=": "461214000000", + "NrP7ehuV3jbidNaDbp2zpg-JDtLBH-gh_ZEcc5DBy48=": "1852170000000", + "NrfhKRH-CJn99vVsjMOSwF0pPRm9lvyE0WWerDdsKU0=": "1927483000000", + "Nrqh_NyjCj34hV0ddB5VQnlqlvWrTgeHjQxSRxEqWvE=": "384615000000", + "NsgTZZIhXClflHCxBRBYykqK23plQTXSH5h8Z_rE56A=": "948095000000", + "NsttzGCxIErbSQb7k0iAKC45gmLR77-mUwJAcIHxeBU=": "8086220000000", + "Nt5vdwMv-0EtL0ynEFASXo8CCwjdstRLCVwOd80HmKc=": "417532000000", + "NtOCHy3DnqGxcGH__QdVf6dGOm2DJdYi-iPbmadc0cI=": "7710150000000", + "NthWjzRClx7Bvnckc7f3GsAIrxsbP45h17vNk67Qx7A=": "1233257000000", + "NtzUyBrzdtUfV5xFqbc9BM975cOqzP1lSMPkGYrAWPk=": "389704000000", + "NuhN3OVtwjEBZb-BUyfFidjX4NK58vLkhYkgIvRw-6E=": "379344000000", + "Num45XX4u6b_uOfWPXI-BuJcEI715BYSHfPDlhjSN70=": "377767000000", + "NusUOdwxWYhDXfas19P80LDv4dREV1zp2Gn5rTPOqtM=": "567916000000", + "NvK0Hq1Iq_qquFDR9qI0o1qo7Nxh-3baOnDQJ9jY_Bs=": "470437000000", + "Nvh5Ssd99pynKpF4hdBivBkzqzKk_xV3lddVJmL0ELY=": "607840000000", + "NvxUVuY_V9JgFAztOTc15BNmi4mZEc12F3XX5-OpdGw=": "407808000000", + "Nw-llzLwtQhw_tr0sG-jFz7k-ekA1s6hFtx_zmfwyxY=": "459285000000", + "Nw3RvG1TJQfXr0_-RTiuCNHTUA4NMoTO4zxjaBbHJ5I=": "4623043000000", + "NwGxY2KYHMUY4XoenYYX788FovcqOMIpEpn53HEEir4=": "388620000000", + "NwaXCCB9RJUksiDfYcr9APHWnC0NYiYYslUQiOdIy6o=": "396485000000", + "Nwi8-3WaqBp5PvA0lt48ntIA2JR2WLN6WVRwV3_V9ns=": "1461538000000", + "NxWORhXfG53hsGodo4eJfNrTSqV7AFueQOll1TQ3ENY=": "457943000000", + "Nxbs_FjFxB3A_IcoL76UNbwbBwquwLpOhmk-SoEfXuw=": "412817000000", + "NxczPLEQ6ETwgxMdonYexPPqvIszAIuI6VdN7jotfhE=": "1150959000000", + "NxgbEIpVt4AHtPzSCzRi9EWDFw6z42lOJJQ7pf4zgnM=": "1700304000000", + "NxnFFwEa2a8KUt1mkhCqCzBtj2xM0L91nAA8qGzMHpA=": "899999000000", + "NxySjy-D7Qt0HOx7Y2AMj4Lm4fadzM2kR1j4JjNndO0=": "768140000000", + "Ny0veKxsbjRwOCraMCuGwbSny-lluhimh_ujYVhoCLU=": "1818181000000", + "Ny1i58ICthu3VTCdlr6WRLNPgNrM3HlsksLBmYxiQJ8=": "769554000000", + "NyYBRJQOoHFDtdvJeuQxgAo9f8X9KJ0VzWW3DzhI9bk=": "464447000000", + "NyaSgkpdN3X4vvKaUMsLZ6Tz4N48jqW2-E3CfoTWOOI=": "385506000000", + "NyqvE7Tvkfu3GAknj_O7Mfd1AOZkyoQU5ZMTHlf9huU=": "488247000000", + "Nyrha4kdgtrUzmm4VcY1TjuGfv9UrH1MqFU3LbQIzL0=": "413869000000", + "NyvIpDFXQ5h_A1VV6HYipnz1UfBWGvP1RqW78p-yu9w=": "4110858000000", + "Nz5PydiIiR5fL-MVD_mdicsnbA3bWh4IflpTLxRz2qQ=": "951762000000", + "O-RJX8mdEYh0zj19613bNml9uI1KuGewncGDZv4Q34g=": "388439000000", + "O07-rvOvPrdUrcWm9Y9n4jj7v_4C0JBZ_X9OenBnkB4=": "1358328000000", + "O0nVZPB8bu7dzsP2L_HaTrBQTqh6Ew-EcNLgdE2T7MQ=": "384448000000", + "O0tZ0Z7HFuDy4lTDOvE6or3YP7Y5DNbNq50O7H8Vbgw=": "453908000000", + "O1RdQL7WHi891xfPcNy-yGGzjUxFdhvHhs9VOo1CrtY=": "420522000000", + "O1a7-HtQGpmM9nIjOa5_SFbgj6ecDOCQtwf_tJ0q7rg=": "385509000000", + "O1idKf4SRk8IYOHe0cXHy0qCaOpMHT2Hz_xNsrhu-PA=": "389459000000", + "O2XibmbtCU0sYt2CPX8g4QXzwN70aMJx8sqp8cZvVws=": "393443000000", + "O2ZyKaHMHSCUWnvwOu7_9lu5or5fUJsHtdnjQ2IGsEg=": "385343000000", + "O2f0YBD2G191LwXGtaGkyh7GAoYMSAIKZQHwYCX7Vsc=": "395565000000", + "O30vab5EysTCZ0jCkByj_5Cc0b-SQ2uKmo_uJ96exVQ=": "384615000000", + "O33NhyXzFl0vgnNUvFPX9kxzcm6nZwKn3bPJUNMwdOA=": "768909000000", + "O3fVmcHKkGlGEe-g7pSeUbAixcswRM-5ARxlzi4-gRU=": "1321326000000", + "O3ibdSNKvUg8vPVGylCBsWa4fDHSLWy3PMrFxe1AvC8=": "416666000000", + "O41uTAHDaDixmSYIwOPyja7lpBswZqxKNkdKNtfEqA0=": "456063000000", + "O4UE4wsL6IqUpkzBgA6ECS3r3ipwR8-LHn_wlYcET34=": "915968000000", + "O4tsNEoEUEjtiZ9X8d5Cd-N-mgWCyiJNCC6vtf7UN9I=": "468609000000", + "O5CdyFV-AjKsgp1jn6NsBs8_x77yQ2kALF7smR6ZEWg=": "422561000000", + "O5GTHmLkIusp8jOehT2Xi03me1cLOFdgcYCx8Mnr_0k=": "759857000000", + "O5KQZS0w2tqA9nV9IfmMQQLAIMFSkN3aJJ1dSHW1PYY=": "1325740000000", + "O5RWAPRpLSi8_crOSOPXaqar-BWSEnaVZwIxE005pC0=": "771600000000", + "O5TN30m78Dar9t8EojhubpU4C7LzImQ4DNiW1HB-zhI=": "4556000000000", + "O5Vl0hlzWQDLbuCAkb5r5M4K8rI5BMkchVBOu3cwwLo=": "1114431000000", + "O5_3BC7q02vQLxqHVYIz6foE8-Z6m8GEZMRt8CzGYgg=": "460333000000", + "O5tkpEA1tklZ90bV-t2ljHz8bKiyTRJrewYaI2P68K8=": "568614000000", + "O5uTjni1TKtiEsn05L04TA6sPDjbHN7myA4GyIZ8sZ8=": "455367000000", + "O6uQzB8e_98Tv78mn9eNvvIU9HdOni1QM0rgJ2TOHDE=": "402050000000", + "O6vNYbz6hRIShzKWecHlp10jb8ua98camXxzGIBaIxU=": "382911000000", + "O77Td-nDPx1qHoI38zBsir47-8rpeLaQ2D9VNZpJAEs=": "473001000000", + "O7FDcqjBLMVnKQMc4ag36eIsBn4WALZJNGzAW5KXJ_k=": "404710000000", + "O7bT_4FugKN2iubb8iFF9o7GRmAtaIUQVE2YYuc_tZY=": "378561000000", + "O7qmhJH7195XlnJfYufExWRO60asT0gdCoJ70fpHNeU=": "760671000000", + "O83_Tr-8rVeC2cJXdSHdZwbdLX5Isrjiuk3PlL9o_LQ=": "416735000000", + "O8FcMD44WjwI2HVde_41H7N53lwl13D4OA42pT_deE8=": "845123000000", + "O8YrhFqciH1J7E8nU4K5BhezKxyLu1XTPAPmfXAwr9E=": "390201000000", + "O8lynEGnnxGUCpma6EHbHXre4YuWYjKVKHh92pPYVJs=": "378310000000", + "O93S0as5J2gHkxNMdCBKFYN0M15EsoWvm-HKiJhJ9qw=": "467679000000", + "O9IA6YLEWvGR8XMbdKNDxDOBLkfjMHpnZ9P5wLtQPgk=": "358360000000", + "O9PqYg2Sw17bMkt5RNWQbqHbcge5bjWqfKhfXKEhHBo=": "2278000000000", + "O9b61jQ9vPW8_CqrFShdMOk2tJqKLs8liFEg5MesU9U=": "2083333000000", + "OAMNbXWz6cFx-h_yGDdWiiGQZGP31e4frqPmzCTvQPc=": "2095949000000", + "OB7-kbQRl6eRV4mRWpLUaMowcngGXggshgxW-fLSSCU=": "916992000000", + "OBHdKOpJN1Mh4ecHExEbY42gSfbnnmzridpHB_35cTg=": "414045000000", + "OBNnGuzBMHGBLXSq4zS1gJN0klX99M0vnc9SlUEeb6o=": "642362000000", + "OBV9V2ABJDtatEyKNQwHMV8gPqL1b1rQ0ShuGEw_EDA=": "1000639000000", + "OBWaZjHVhS_VpdhCAJV9CAmP5SHL-X9EEbTfM3NO2Xc=": "42670994000000", + "OBZlUAFwpoU-MSSMwuck3oemqhz1QY98BS_x6saCI5E=": "5003432000000", + "OBo3P6ZQ_dSFvn1M23mdSwS2QvzvjdDyt7jX_eETLvs=": "614506000000", + "OBrm-Mks5-PFAKgIk8ub8HvDe_mQgthE6OzOJMUBYSY=": "405197000000", + "OD-4lQDm4J2UIpITTXbHaLU0xumhefOAAPp6vCIsdnE=": "3076923000000", + "ODIcB0q0dkEEZR-mdzVGif2_dqEYvZB_KwkX23BeeCM=": "1222844000000", + "OEA-_5mKvIOU9YbcbI3kPGOGIwFer-wHogKtgAJ7u1w=": "384948000000", + "OEIGrX4gdIQCn8Bh23I67_Mcc9liCvxpH-SfrRiB93w=": "469318000000", + "OEdYPewCIY9jsIYALexWCZ-UmIb4ZCunu8CqLyHFEJY=": "491921000000", + "OEeZUX3GU1Brl4SiGBvFRCTOjFTm_sOCOmIbKTfWaw8=": "1298495000000", + "OEoYio0Lj6QdTT8m5_rCARryNfMH5k4koLr3MlJzZV8=": "1924509000000", + "OEv27JNseXf8NO8UQ99T7VWxBORgMqRmPCD9drSqYF8=": "451187000000", + "OF-sveQkyMntCiUoWuHnuaP1Q60uJEmxhBk2xvKobXU=": "384615000000", + "OF0vaqBuC3I5dFWtjk-fdKT-gwKdsni_FbI5B57f0WU=": "10811627000000", + "OFLVrsaPEIumAv3YaQg5ujILNSINGwqBa0eud45uurM=": "382251000000", + "OFQTl9CS-aOzI4m4V132GUBLz6Avj9SYsdVM7bW7jPE=": "384615000000", + "OFeSHOttFw8uZFE_ZApVWy8YVzzTS-wv_lXU_Et5Mgo=": "11215384000000", + "OG2cUrLQaUNGInG-PC81viipq-PmZpJnlPHSB51xaRE=": "4174903000000", + "OGH7qPPwjRhEhZnTSXkw34YU_42zF4EuH0kv1QsMako=": "36756230000000", + "OH-XzgxvYyAZKVQrazix9gLrYlbAED3jCxfmcEgLnd8=": "1154100000000", + "OHqAt2dMb_HJozvbbd2Dx8vnvn2PBp2cHN3fdQuXjeg=": "2301352000000", + "OHyKRNXWKa4Ggq5W2BAMVAmbtN1VuVV5Xu8TuOyeCyk=": "846153000000", + "OIRticQDKySVwqTN7NwqDDgtGTDkbhCtnemVdbSSldg=": "893487000000", + "OIyTW6qugIRdSsaxPYm-gdd04J7nBpzVEplmpNzyvpE=": "416690000000", + "OIzEkk6IF7hAjoPUuJk3TCoyGnZqkQX-DqjmrcOZ8ug=": "1071804000000", + "OJ8axwGIeE9uPZjKY72B6kUc_IDtWrul3wdoYQvnals=": "378576000000", + "OJAB88scFDuoda62gwXbwa183vq4LCsxJSsz2z3nD58=": "909090000000", + "OK3hNHfOxkwYrjVxdHvMmmS9qYnI9fHgnq5UMQu44IQ=": "28675033000000", + "OK_7SQZJWd0lMnikSttiR27-01D0WfnjA8TKGuORUKk=": "384777000000", + "OM2xVGPSgURMAzinOWf0TIjoOHNQooCSgTWQW_cIqdc=": "463749000000", + "OMbmxxaxxchZwHmeT2l0SXJMVvlrxJYPzcQWOYcfiX0=": "4173798000000", + "ON1j3GKUWcLQryQ0qAAHKlsSIpEjlcOHazdZGFt1bMw=": "1156074000000", + "ON4UfMJxinGBlURABbOJqDkiq6s45fl5StVM4jgembU=": "449217000000", + "ON4asaW5hYpwLWdcd2pMnb3ydZdtE2vls5Letj5rurg=": "450738000000", + "ONoJkR3IUAIhBVKY7KkngGq3E0ETxjqG7CLfR232aJ0=": "382394000000", + "ONs6RWruVmBgZE--wxRrQDU8v_0MjqA_6VQV2OZaOu8=": "379742000000", + "OOQ760z-aO0Seu50n9Q2P5B4Zqq3zrW-7o1G8-hAn0k=": "384615000000", + "OOVtta4pV3GEGY8S8ktdx4mmviVr0fLOe1Z2jLepi-A=": "391797000000", + "OOXxL87v8N8iXER6oT6Uyjxo0jPg4ze8DX9z7VECgW4=": "416421000000", + "OOfkEbPseuWISRC71KisVrMNR3aNCPFQM-VyzPnR7ew=": "4624111000000", + "OP9j7Xf9sZiPCjSDZWgiis6oN1YaaUqu6k521LESRHI=": "1352556000000", + "OPQpcM2rybPC_r2C3-H-NLc1ZVau7HPeTLuLr86lug4=": "3769230000000", + "OPTE6b_pU1Hl6I5U7FkHoYwxalGL2--LdBX7Ze1WEG4=": "570411000000", + "OQ9O-4mIyTuw55CFKWIHdILM5zObOua9iPAQyoO-bow=": "462839000000", + "OQUcEcEYtUVnnnKLgpvNQNVjkaqnJcSr4zNzklyqM6o=": "452733000000", + "OQWqbJl2JH2mDaJTnjaeaKY4Rr3HV1boH5d2-dThNuI=": "1154586000000", + "OQc6qsN-ljVgZ8IMIz0ut8xKi3YH3braHAUxiRt_H5M=": "377698000000", + "OQsDVoWxFQiOZTmAdGQhxypqBnXapv9FoLdZvd84xT4=": "414989000000", + "OQwFmuEfUPCFBctb1nEVJDk7hq6OSNZ28wsSTPHoYK4=": "769230000000", + "OQzLEy6v1GPj7dMqJoNW7nnCwJ-CquluGAaQXYbkVJw=": "1889091000000", + "ORXcbCwULUN5YfRD1PU1PwEEBIE_j4Gr-pw0Zq_ZY_8=": "1666666000000", + "ORnS6rjWXX8YpGpIhydzGAX3ZtwUXjvSKQUwf_2pzjQ=": "808957000000", + "ORp55lLcefeC86FO7dDQwX1LzPQiiU5Jv5pJPNnn-Gc=": "8443938000000", + "ORvidGG7Dqe3LvSFnuxU9rlJCJ88qnwP7ZGTSHBfhMQ=": "1632692000000", + "OSIu0NY1-zJ5NzyK1uG-ML-Btec5k3xfa8BymNoiZbs=": "576923000000", + "OSVtDWEGfU-GTIhDKcVe-tT7RU4f8s7bk67uOywoPjw=": "1000867000000", + "OSemKrwecvBcrnjs7LN8bhi3IolQXDOB6qm-cU-Y-qo=": "419168000000", + "OT6To5Ayqh7yArvimcPr9i4GEsgIviUiPNCCWnQB0dU=": "1540815000000", + "OTRjKw9lu8dxZXuPqRl9SKMpCEz6mYh3q6Bit8n4yoQ=": "460521000000", + "OTRy9kOK3u_w9Ub5afE0RTJncB4rojy_RJmqoOxj_2s=": "390237000000", + "OTS7NeMyUoWMTcBJyPdqh-RzfP4Eihe0JPi0WwdVygw=": "352834000000", + "OTTk94X5jj0RNUfKsuGiJVLxQDxKwZYG8gUx-p2ZbK0=": "499707000000", + "OU47BjVpTZXzfkjySA8usz2GxlLe3oBGtE66B48S_Yo=": "385506000000", + "OUM69uBnDEuPSGh7y31WtZvJyngfVn1B-IrylUQ7k8M=": "499993000000", + "OV0OlBsRqPdHRL0glyYU6PY0z2MBcRNoSyTewQBBaV0=": "460799000000", + "OVKqz3QnMUoPFaeSM_C986hr397LLfDwD11soAqGrXU=": "416673000000", + "OVLCqOTvkN2sNQxxMP-eqPBb4Hi-FzUSjLrV1-u8Hdg=": "774652000000", + "OVqXWMgoVFqRrt0-FuY0jzrvvd4ve2Cgb_uU0MHu_6I=": "4075159000000", + "OVs-T9ciD8S30_VRf4ZKFmUPKg8k9JJsus95Fcfl_-A=": "417702000000", + "OVyFmAp186bM4pSmgBPEOMF4zNccrOkjyI2RRYFWmq8=": "384615000000", + "OXm9wUgDix0wl5bA3ft2PqsnetN2qnRf9igXakwHMz0=": "983735000000", + "OXpyoWfxqSasGB1Do01yNXiZYc5BCi_pnmoKxBZR_CU=": "3124994000000", + "OY34jFVmmr8Ut8t7KK4QpC8jTwpHpP78WCWZcXVR6Ug=": "1156515000000", + "OY88hVMNtlRvs6ZnqKyVhGaPSehHXVx3dpV_qT2WKDQ=": "823294000000", + "OYi3-uQw_sTlDRNTu5foHh1sp4ZVe-N7XDsylanI_Hs=": "929128000000", + "OZ3BVbT5EY9156A6iEiNRF1amUftWQ2LDzwLyzBYeV8=": "3738539000000", + "OZYvBWjAmpRkyPRgT0-IEAtM-BzrpzJrmGYxfbBCS9g=": "813685000000", + "OZg8_2i6ZLgVk3Pcch3dM4frWjrTr_qIZiXKkgpu6AI=": "384938000000", + "OZquXLi4ph_2Yl29IJsV-INFpAF5cqh4HKA211T8BSQ=": "474857000000", + "OZwWyqaYCxlYcB3rBaTuO5zUCerZyZmq3Ovs1-xhhYM=": "666450000000", + "O_68bUTh0NfDUzns3xF69JXmOUsUySTf8TTrHGkVz3E=": "751186000000", + "O_LeaGK3lnE5s_19Zqz3v0iYK2ei7vCE4fAOsiG_BgE=": "387357000000", + "O_Q5ZmUQyjoGcEwkkyOapTFa3c_yc54O1xSSIlrMIM4=": "576923000000", + "O_v0-q_lRzxIDmJzFtka67SFKIcHrgUxom9FIoD5c6s=": "1145281000000", + "OaXNNx_015t9dN4IcIV3VkQrz_ulaPgbXFhMBAB7yjM=": "2247792000000", + "ObIiPFGAjANv5nCazZU5sq9LQUrVgL_9fLehkjexYWs=": "540456000000", + "Obp6HoproD1J4jOc4uzBpRe_pBQi9DciYOErUdhsM5Q=": "396989000000", + "ObrW3V8Zg4Axzltl5VCFLOUZ1ZyBoB-as8LSxjyBE9w=": "3413596000000", + "ObzE_IwS0qLonrHGYg7KL92QJKFhQvz-H7z1F_3jzQQ=": "416595000000", + "OcJ5o8ZZyB7YFdovnhrKPnp04Av5edggdIaCRlKP6HY=": "1363636000000", + "OcQ_EEAiJDoJHmB7R4crbF-_WnjQs1cToOI-RoNoPX0=": "452205000000", + "OcbKwgjOJpspmCg0hC0SWLQ4P8WF4aZP5SXG1Ddn8cE=": "386715000000", + "OcbnXbhxjwMFIOiYAGQPrTa9F72AB2HR3GBXcFYSQfM=": "1538461000000", + "OceI5lAOBnuJamh7jhNp0KluffhA90wikVwjp2PkBck=": "384615000000", + "OcggPCNqKItaQxfST-5jKw0oIewgSIYoDjtgN4dNRdc=": "15909090000000", + "Od2oTwGvvuUvdm36OEj8Ank7phCRLqEUj1hBgrnzcuM=": "909090000000", + "OdHwM3_np5UL9q5qPryGRefM20JrL80StSW-72eXJxc=": "5339950000000", + "OdtoK7pkvoxO6FKPBl9zW6K1JvnZhmV2vzXkrQIrM_M=": "392000000000", + "OdxXD-K6DRM5UuGujFJMdWoZSVaFWiu2M8ln6PixaEI=": "416901000000", + "OdxdMRdV2cOFiF-TVtQBjGZ95zNRI59MI6-F8k6RXZE=": "929128000000", + "OeOnzI6Xpx7pO57JZ51NsPVkFgrMWIC74Y_ApMGi7tU=": "471193000000", + "OeXr2uQY8Fl3hbGQx4jPLtqWkWQmpcWv1EN1l2eZXzU=": "384958000000", + "Oel6227DEMMprC0TJ2sA4umB2jo9MrRmnPkP1JSIUyM=": "377078000000", + "Of0Y3wmf0JU9jI9skCv3ghZ4m1cT2hxUeNRKWpar-w8=": "40624200000000", + "Of60pUvNEc3GLErVlKBUCtVLmkA2epkauO_gi2t8Mfk=": "1874999000000", + "OfAbgAFFaiRw0QlbJp8lkZV6atzOolpPpuoLZ-KppPg=": "2055429000000", + "OfYCxpDP_6cLlSGyIcXINaBs3OojsJtWVP9YU3V7Lmw=": "382544000000", + "OfmlouF4Ea4xYMreQUwzGcTtzeVzgZ4bEgWkzsrwr-Q=": "1267743000000", + "OfmvFBOQnjDlT-TxzQB7-pWO6oiVGBu1Ui9jgATNGWU=": "1537224000000", + "OgJSxo4-vPhIKHT-i084uRnnn7rLktnLhx9jmuRInzo=": "3533627000000", + "OgMWvujyrFW0t2eMx4ys4kDqsbjsNQNcv0BYF2o1n2c=": "455600000000", + "OgXdBspR2qBSKa-qLZ5wF33Jig7775i4uiBkD5iZp_k=": "767781000000", + "OgZT3gz5xSSgt_GBUY12QZ-uxg4lnm7ycg3Iya3YQsM=": "459420000000", + "OhKYnlgRENM2MxwYrgFENG5fpKnRQvI3LiCg18tjlnQ=": "385506000000", + "Ohbir7uTh3gHTZPAWP5_8nmrhhp0ScCaiqOjwXjEPc0=": "378037000000", + "OhoFladLgmcYsDr0CCPx-QmqWnqcEKMmgQOZTIk2wFg=": "1923076000000", + "OhqLfPfnXcrUAcWF6K3gUYHIO7Zy7a5nMcanNjx1NWY=": "3130983000000", + "Ohx7V32tPoADmQpeEfKA4ZagB-YT5d96S2beuIJEqUA=": "413516000000", + "OijWHdUpHIxCbSOy0EVqBFT676YD_yYVisqSJeVZNyE=": "417637000000", + "OiqO9l5Npd4v8DImALAEEzOyfzrUqK4lOjXHQDik4co=": "390103000000", + "Oj2T6-gPS611Br2tUNtlACnB4GXoFb7NND5hXAjFauM=": "698766000000", + "OjTxauCTmi8n23ZvlFu_xBO4C762v2-4HzdCh1lniT8=": "1153846000000", + "OjbBq2IYv5Kem0uwjuPdwBw-3uAytCAJtwxtE7xbvoY=": "842624000000", + "OjhbjD-jMPwdIqrmDOZfIhh5OoZZ4AQjiGPepH6h1bE=": "1927537000000", + "OjspnDldjQdOVQH_dRjubsDV1y-1pHvqsngkyzoeN7c=": "448299000000", + "OkHzj019qks6L-_jM9RAv1obBdsk16HG3DMq51jU4-0=": "384162000000", + "OkJh0RCeuVowuJH3oCknDDmlq-Zrn9PmXOhvE9YYTic=": "3926510000000", + "OkKOx3JWLCqE09MATie5ReHDxUapfdyTfQ90af1baoM=": "412214000000", + "OkhfvNWutPmheEBVQo9wDoEj61ZZF_hfTuXFpzTL3jI=": "908685000000", + "OlANqYsB7KV9Iyrzd23vyCquQjwg701TFg4w_V1gKZU=": "1157231000000", + "Om-a8YOOrWh_Mzh9iHO7f_NiHNR1tIFxE86weNcbw_w=": "455927000000", + "OmW0kLe1-K9FakWsUq3HpmCqFyHPgqgs8InH3guQ_FA=": "411085000000", + "On6MMgqHzgi-yd1tlWhVBAn_tiewHvCHm33RscZjztU=": "385505000000", + "OnBtylRjYPwrL_BBOYL36PDh-WGrGAi8tOklhuJ7XhA=": "454545000000", + "OnlxIjIDLpunmuC477d4jzrH7CKM49DhtzPeTaGD3o8=": "16538461000000", + "OoNMGKioFGwZALogXVlg5kl8zMjCXRW5DCZzN04ZqnI=": "2074563000000", + "OoZ-83c0-d_Jg6wD7i0JNX1Tc3pLjtKK9nzrTEDcWfQ=": "1743183000000", + "Op9lOXRcEJ-8uFvlgawooiTE31Id1-t46BLVIPH838Y=": "384615000000", + "OphlH5ObX-JZUFHoP7UHlm-m0S_397VDAc7HIBLVQvg=": "383557000000", + "Opmx3POtosZq_r5IOcI4Nl0we25RYLKVe5jmq6328gk=": "391885000000", + "Opnf1_-vxL4hhFCB40MYsBx1VIZ08ytW-sATVJTNzbY=": "4984087000000", + "OprOCODEigXSTZ53R5kqpUbqFvLGZDTQ9YMQOTaauT0=": "412720000000", + "OpwBRr89spPdg-zAYMG9_LF0Bs3bEWbvGUFE9GAkbE4=": "501235000000", + "Oq-cOjSsKykQWLTZ1wAIGDfDkveNDywuSF7w7qnGTo4=": "771145000000", + "OrPD8m0VvUAdXLFHs2okjRub1vIR5A8ISRrnuDRtZq4=": "384615000000", + "OsRF8plVPTsxg-coGBlduF21JVdGNvTKG2GydQSZVXc=": "384615000000", + "OsdZCzWll1rFvGECjLYc68r6fiIul7xb8NBjQ-j85VI=": "3838930000000", + "OtDLrK8o99BgNr05OIA5gYj7g-GElqKRtUDW1dS6D54=": "391797000000", + "OtsSE8B4PxX3OTTW-SMP0lcdMBTDUVwc5vGOTqy01Oc=": "470856000000", + "Ou-7xw-JRQQ8YumrZp5UZXkZ2a1PX6mhksmbshqsoAo=": "519272000000", + "OuE-mn1jFkzQCcGh60GpRxbMpZNj94iAHLX8xuRQGiw=": "961538000000", + "OuL7FWeLRxipI1UWn5WdDDeWYuuS-F7MHE2bypAWOuQ=": "1650176000000", + "OuSGPUEiRkSVUNUe6UENr4juvyB7FAOoiyl7c-l4vKE=": "1905227000000", + "OuYX7soqSMyE0mN4cKO8UJVJ5L2Z0s4pY5oDMOwIXH4=": "2093237000000", + "OubqGBVRX0VGxJ3rg1orwl2ZjV0OWh4aBliJM_rjt7w=": "1057692000000", + "Ov4WkS2Yv41Q6jkahZ9dbub7udMJTY_-SDlDwY9zuBI=": "384057000000", + "OvLdBsNrMS1mCIhJBtnyX2QZArTcYjKGhUrbQpWDteA=": "2500027000000", + "Ovokvhls1-X1tluEK5EymbaTefrLucgPnJ8N3bCqRE0=": "3795956000000", + "OvvepSCE2Optm6xWslqp_lsGlgG54BtcYiSPXsxbMk0=": "2463927000000", + "OwRebX6U4W2yHRu0ZXFNWJBo9I3an1Ntr1u3PnkoxiQ=": "423370000000", + "Ox2Y-zrnS7QTPMMDWQlppRGLjLWpfhKgNxZVKA2giiY=": "385506000000", + "OxRwkfK4SXSy0OAU2aplYe-1oS3_0ijvXlde79E9UyI=": "376209000000", + "OxgxmCfNKjb9IaHUO5mnmqWpjYN38VtZkHByHW4ogIg=": "379260000000", + "Oxyl6o787OTq9Wa4tMg37oe7YxRYG9BkkTa7Hd1Q_b0=": "426403000000", + "Oy4ZdqMw-5xcjDLcdDv104JQvlc2U8nDWuxgOubFP3o=": "385528000000", + "Oy5qY41enNBG389sPMfaXVDLbU5dPBInkK7pnlPDXdY=": "400057000000", + "Oy96eUaCYHi9KqGBHJaj3Pr-EAxAp8WH_3CjV10Uz1o=": "5769230000000", + "OyBnkGP4bi7BHHeZkyk7XqO8Tv668N81PuqlOa6Yvzw=": "640455000000", + "OyNMQvycfRk3VTa8pyodtFYpQILLcMre_kEHgBk18AU=": "1818181000000", + "OyQLYRBleqn5LDkivcaTbzQUyeRYwkjn8L-opO556-E=": "1156519000000", + "Oyq5_a8jzlegv0gKuc_k1UG2eUyljw_fPgG2OEpsTfY=": "451943000000", + "Oz4oDe5mVrfSw_SV6BFtCy0UWBIho3mJU92M4xso5p0=": "399476000000", + "OztuQreGcSKuspO4ybht_i5Lz6TasiB_GCF0k2uQOaQ=": "3856307000000", + "OzxzRB8pT8ETpJbzEGixEy5xNzYJOtjf-Pl0q7XKBq0=": "885940000000", + "P-qrAqLqHQ_m0xNdiaQcieXjb0nESjHe2k6qlyS0gyw=": "382930000000", + "P04FgWYeEvhA6zlD6yfWI7rHszj3zGzUrnOWHLp8nTY=": "3824448000000", + "P0ES8zQ7eCpFIeefQrVFwG1cMpzgvZ5OgGhAj1694w8=": "1923076000000", + "P0HwEveYn28wDaBQ_wlgJ05GLLJZhDj46r24k5Gkx48=": "384573000000", + "P0KeeQD_W2teno-b1wTZkScHhtwKRRSirQXfFfO_LVo=": "14620000000000", + "P0N3M8bnqGy-w1V4fyjRVV5lPkEUgDFh8l7ck1lx350=": "386600000000", + "P0O1o1AeNQ2QfuMLpfqY5wIRlKGOQKZ0E7LbdhH1DuE=": "463498000000", + "P0sVkOvxfYigM9RWxGgvuYH-T3c_WznkrJSQ2W2bMdg=": "380527000000", + "P1O8pBTZI6O8puHEUi-4Jw0yyqMlg5z1ICbBNVcGI6E=": "2001345000000", + "P1b6M5EmVsnvoja9icIloWx1n87AxO5Zw4ROIebewPw=": "384153000000", + "P1jTweqI5cyH-dhmvMqyVwio-eC_1mo7LLd5bJXMFiM=": "769230000000", + "P2MlPgzDiFDmT_M4qnwiToRLE3ecDaNJp9rHvCBALUs=": "1153846000000", + "P2v1wIFQ3IscjWoUmUy7FqSGGOIcWN_e8G40g5Z3L-Y=": "7692307000000", + "P3kRagAIB-G7r7M8pdwNza4-GFMn-1mV8qBi_UokrPg=": "832691000000", + "P4ATi8XpiRi4y0HXawp4OEyteye35s7PrEqwKZpoAJs=": "460776000000", + "P4Nn1xMso3yX-iwn7VswMqdMZxGulFvlugQOL36KF-c=": "386546000000", + "P5ZvhIYVdbUNW9jCHaec3-2OwQsbaKfeSrjxNa276Uk=": "499999000000", + "P5rvgMIX3lAazPkFEN5O21lCOlAS5qgHW-EWrfmDFP0=": "575059000000", + "P5uU6h1s4Bv7wuk-_E9xstndvtEJZ7pKCi-Q272M4_s=": "999999000000", + "P6-xKF3Thq77xkZ8gTlor32aOb6KpTPcow1yQJif59A=": "833347000000", + "P68on3cg-AkHjcBDqtMuDFwRwoA_JaXVPnTbCS_dD5E=": "465144000000", + "P6mxQORbvQJZCiOl0s3qs9tWIq2cg-EQCHcvuG8p8JQ=": "461179000000", + "P6n6aqXK_9_BHI5ynctqXJbAikZlk-k1k1H2AMEM4fI=": "1366800000000", + "P6wB2hb4nELeKE5PND1xuvBjwhkOwo-gGb7ynoyfH7E=": "416901000000", + "P6zWwPir1DNF7iIObXS8JR8rmXjLSXZOQ6aYLqhPKjQ=": "407469000000", + "P76nC9QhChPCKP2FARMS_eWO-2Xk39WK-e7rHf-kw2Y=": "407692000000", + "P7KUGMaa6DtWJRzD8YQlEnfbborel-nveVxeo_2fbhI=": "8352615000000", + "P7P04DMg_HdIFFeBCqvEph2LEPZXPgLtv-NK0EOEX94=": "785636000000", + "P7QqAqD_q3xuM3fcsOq6Timdqh_r8gfhbaUabj4wY3I=": "1156522000000", + "P8dWGTQRzdTx7bmp3aYd0-2J-QsGwYI65Drldx5pOaA=": "384615000000", + "P8noZtvPjnKDzBR047vAeKr_regQhpDCZCM4Eoycjho=": "382691000000", + "P8w5N71S1a0UTA4Tiv965A6tGk8nTtju-pU3nMcC2Zk=": "2224621000000", + "P9F5HTq56Mk5NIAeeqywy-nlFnaDR0hsAxDFXn5nFHA=": "1145509000000", + "P9JIH3mLumZDTbF4TH9uEbAj4qGFuNrQvs6W6yNnfX4=": "597896000000", + "P9ioFspolkvURcVBmDBKmF4zjSBs9LSy7iTnAU8ZSgc=": "454642000000", + "P9vFSad-M4EZlZzFoLXdXhQoFxu2yiKCYrMCFNHEL6c=": "464704000000", + "PA5SJpWSeq5NoJgqboUbC2mLpgzjGtLCBB9cW8Nd-cQ=": "784228000000", + "PANVgEVkeeDNY5BeUvYGwxn724mgPpoD938QWy1D7FA=": "847697000000", + "PAuK-DbcsJGf04yItaaIaCejbwjJKyDrqbN-qHgFMIY=": "391029000000", + "PAzYA0hznPb0mgrruQCnPrT0plp2vPztWUjTeALU480=": "2083333000000", + "PB10VpKLMBR0_BLTOOu-HbC3JK-bIyijFlN2I-ax1Xw=": "1499999000000", + "PB1eduSDhB9WxnOybBje3VdLIHfc4zs0dZdvk1MSQw4=": "384615000000", + "PBCDZZ3MOGN5tHOL7fEojwbbyKzPF7ubKiufIA6c5-o=": "769230000000", + "PBSVwypyUcq7WZI8sP2i7KfcKZ-NaHFO6kCBudZQ_UM=": "422561000000", + "PB__X2Xu2eMGWAx6hy1cOuMmFWDbJ2OmxucP7-b0gGk=": "669573000000", + "PC6FMrkk2xwq5b6mkfzi9oHYLc7fj1WzdiUQ419QWdQ=": "3702172000000", + "PCAkWXd9HiCTWFVAod5XMlEQ_OMMBMBTzEKsCytIu84=": "455600000000", + "PCIL26GRgGP9N4DcYp8psIdi1JZmVfn09TYQjIXfZjI=": "4580108000000", + "PCRofGYI_9Ym9QJ2ZGwotjRkXw7HuXMgeuiC0JX7zuM=": "387216000000", + "PCTO6SnXi9mYNlRl9beoxWT5CJjT5D8Z8UpkyOGE8tg=": "4556000000000", + "PCZTXoXpBQZYDSQWKhycgmZSKSVGi6_WZuJpmMtb0zE=": "1851774000000", + "PCkQjJDBvKtXZAhP669Me2myn94wb3hv1-j6t-cjEO0=": "385671000000", + "PDNTl_ny-lw_ugVhh2gmdyJ1bbIHiSkbFIZscjh-ZCM=": "603846000000", + "PDmJGv16Kf-AW6NPa8F1DvA8b_3fXXhK39dq9yVj_nM=": "999999000000", + "PE76We48i-qUANptvhflnceE4OZvRSF-iiJlP61a-QA=": "1153846000000", + "PE9zBHuUmoP-gAdo-VBvaXnMHBq47WmjLqmo9sCG0ec=": "460168000000", + "PECoOX_noSJ87ryS_iLsp-bM8r9y7OVVN6n3z93Ehc4=": "423074000000", + "PEpZ8ANEuCcZCINAjIzp6af4tZ1-0ET_VO7dpEdAQag=": "3845571000000", + "PFkUgwPihZJ37f0dcptnHspc3erYcNi4IfFOqMpo5mE=": "399604000000", + "PFrmiQe722FM2JfPz_k3bsWJPwEL0l69TKEkvh_CWrA=": "1519714000000", + "PGNIK7hnVRvl-3i_WND3tmu_e2AtWLtChPqsMkz360k=": "1153846000000", + "PGoQuxuUKL7oUHFZAbL4VTAaPVPVk1n_Vx0Yn3Ds3tY=": "771600000000", + "PGqjmw7BvaGcqaWa_n5axQNua0bmTqyQEmWGGqEBdN0=": "2003307000000", + "PHO26FbFrg7MojWLRpTSQub_O_NrR6-7rjFDx_kLDZk=": "2641305000000", + "PHQK-LbvFhzkwuUxGSFieyP5JjRA1qA5QIeq94wtO6o=": "386960000000", + "PIDhjGRzodUPX8Qz4EKldieMMgwkuhoM69iGs4MAvUc=": "461649000000", + "PIUtO9d11kZ5s37FkbZe74IQEc_YvFC38NwyYATSRqk=": "1671760000000", + "PI_IkEPC_XKmRRu7LnREwTW9TRQ3V-OkMdwVeeN5LVo=": "1959916000000", + "PK9a8hK9W8N4DtQnzdeNQ9r5lAM0KxJbNQyZ8Ab8p0E=": "488082000000", + "PLS1gd389tC1siokxyCDWEeKu_oW4JQvSTyMUwVfQGM=": "385506000000", + "PLUSlM4ezYy2vNBSmDoORTlPcgaiiL2CT-FADyab068=": "465144000000", + "PLcVxrMDQ0qzUbj6bPfz0csZ41Cp5fKWpWQMWauzEzA=": "648033000000", + "PLdXNFg5zJyGlV-zotmYOQ8Qg4QFDXD-66l0R1Az3ew=": "3741282000000", + "PLj_B1nAkP4Hpo4m_v1SFVELD0A5ynqaoMxPrGEKVn8=": "493696000000", + "PNP5kVsiivpwEeMybyfunLJFlkl-wFdn9C65OkgVv3k=": "379344000000", + "PNUDIwDHiUiRfeWy8QNypMN6s_Ik5wvOsrboDH6ylDU=": "499865000000", + "PNhB4otDzAS2hXVza1OCkf2K0xQtYvbMulVcQf0ChjY=": "464872000000", + "PO4pZVWZ7y9YKzRPQZidon_6ng4XBVl0szsoqS-VFUw=": "5651783000000", + "POA-pueWYFiBlUBu2LAYihuKqgeBmVDIcPWn_24a6wY=": "923712000000", + "POQdaL547lUyW2mh_MsJ-NDBv2D_gbUUfeaLycxmAvc=": "357939000000", + "POVdSSSTs0JqZ9ATfHQ0iljkgPoNE7Zlw_HS9I5JJJ4=": "422696000000", + "POZou8zoFvEKCtLefWJewQKchK5F8Ki2v0O6SEpHfcY=": "389613000000", + "POc7R2ZTS1gxH8_RaUdx7SmoSUin5BJXLDsi2lIy_A4=": "580014000000", + "POla7poy94Z00B4en-2WYTg1Mggf_lI0OcowlUpg1QA=": "453050000000", + "PP-HKWstDSwolO_2HqZIhcPH0hjekzJ9Z0o9uFdE6fs=": "736923000000", + "PP2gqIvbTg1dlGQOzVe-a0KZTX1WWcxEaEyEpmIBwI4=": "685447000000", + "PPD2yCbyiT2tutr_O2tgg5ZDx74yN_X0zcX8mMUCemc=": "1923076000000", + "PPQqEXkdLXUw10WMoamfOTrjDwrHW4Gx94MkdAfGKiU=": "384615000000", + "PPT21sWo8wsGrrkgP72DuHwflRP3-103JgRw5HCJYTQ=": "3708922000000", + "PPlTLPP9Bh8yA09vHq3EA98QKzig9cOxU4SmiyaruJ8=": "780474000000", + "PPtZreXh3SpdjlEAt0wmk5Krg7BAQzP7dGM0jbmnNXQ=": "7408501000000", + "PR2N-9ePNuLFF6CkiR2FXPsBDkp4-uH70n3EsWfvpNY=": "384615000000", + "PR7aPtQGuBpJp__xfN3h_Tr7xnNsTcFxH48n9nFshHk=": "686236000000", + "PRlfkWsiGDdQcdTbKyvJDeJJR3GI5b-Vrtq2QxNT0C0=": "419459000000", + "PRss9QX9KYCX54mrkjkbvUFr7Im2FTr3CFvYTI64PqM=": "20921509000000", + "PSHifqpQhuLV4B3JsbG63jMH6n39zqCGC_CHkhrdVgU=": "5007593000000", + "PT1Nss6vxHMICfcnz1b149iQLxjyyXqYQ04VvJo-zPY=": "1250022000000", + "PTr4_pRc-K_1NVSQmsxYV4vD7_GtGWmUZoGmBBsB1-8=": "481965000000", + "PU4zyzih97w4RPMa9rapLyvIg6sMQvq4ze0h6wYl_24=": "407469000000", + "PU5yY9_SuwL5OwfdVQJly56LnCR-twklXY8AnvVkUW0=": "530021000000", + "PVC_meLi3XCsQB2g_obrhAHAsmrmQKakVyFzDhTLbH0=": "384624000000", + "PWfLuPjurg551fYMUxRoHQJNjnq2oG7rpsf9uzTaA-Q=": "1963173000000", + "PX5L8V09nYBPP_ikLkf9RJopfcwJdxug_tQfRvBs8og=": "385509000000", + "PXOmffrXkVIQmyYxVz6WzxmDiUnj3f-QObor2b4DlL8=": "831835000000", + "PXWqzkKwX3yRaDZaceEubkRhRIpW52elRu4Gg7LIJHo=": "384615000000", + "PXcS8rjo2fXFjI3fuym_-1ztmsS6blYFTn-oXAWC_lw=": "769230000000", + "PXosCLFmcSWB9KO_m5hi78SZF2ab4uPweSsAt6190h4=": "390340000000", + "PXql-raY8pryCHHxEJTtsxPepNn5n3d0cez2soxPTd0=": "905070000000", + "PXvB_QlqwVcBK2svMCW6N-gQ0N1dThExol4LO3fDkIE=": "385670000000", + "PXxR4sUiPtY0MQL40WeQoMiLek1TSte_66K0yikCjCY=": "384680000000", + "PY2kReDQhUKa88Hn3yBIHgROeZDEq2KgTdMkGN5zIlE=": "1557767000000", + "PY3xrngfsE1kzkd3svgrn5XtKHyr3T9nzb9D_UoiGN0=": "499999000000", + "PY6hKQtlxqjk43bhX1f_PHdEc8eL2Zq7JSTORhdQLkw=": "384615000000", + "PY6nzWO5XQv11ULQnDxNpj-bHcMV9KibEMUa6kR9jXE=": "519014000000", + "PYHUZo-5s0iEP4GjydIh97eE3iiJJ2e5sCuqVkWdmIw=": "385507000000", + "PYNzCwvW_llEE_OnO0mhlQv5enBsvakb3bDp96fYW_g=": "377378000000", + "PYUOZDDmQ3J2Vr4A7nQz8IgzPRmAmFYDe2ppu0QZa6w=": "464533000000", + "PYdnX85_2DIQnajIeLP9WbyjnTihyI_wOM-DO9R1hoY=": "671450000000", + "PYgqd7wkJqT3zfwwePM4BuVdsrinXZYqYToxc9PNKLA=": "458281000000", + "PZLXbpmASDPPLmevuiAVyZfO739xa-2xiUhywz7EDRA=": "1249999000000", + "PZ_REi5YqO29eremRxHRF5crRl-cvfU103mCussB_ls=": "423370000000", + "PZa3HIOEyXPFJSEQghJSxNW_d_Z0ypkCzfQr3mP1FUs=": "471164000000", + "P_RhBn38gHfsnxF7DaPncohHpIVPf1WNSm0FD0FEySQ=": "2307692000000", + "P_cz8HxOZL5AoQ3-GrhfudUuDv7wNs4a_QwG0lIc3vY=": "384605000000", + "P_mWgYCiusMHz74oSlA1PD2Lp5ws2SptRAdxg8n1uJI=": "1931762000000", + "P_oRf9tmFKhLTbIf-vbCq-0fXEXQgbq4QeQ4CMssFJg=": "1249999000000", + "Pa4gmfmvepyQ_QngC1SgSR71ZuiBGtc215cCRbo9B8Q=": "415629000000", + "PaXOHU_jpBzRT-F3nDAlMeUWHkbZsIR0KRdcDazRrlE=": "379307000000", + "PaYRWk4IKeRSx-Etz-dnmVzY6YMY_Wtdn3qPfVSO-6U=": "3705556000000", + "PaoskbcBx4bU1XDDiGo7Q8yNJPoMA0R7lqkiuYi1nGY=": "897817000000", + "PaqB2QWKW_Pv2q3r2HAcdP2ysXXerY9D9o0OXertRwo=": "916545000000", + "PayWrxt-6HuwOENIS5jwhZiOTCOjU8RWuPh-OyWWAp8=": "384615000000", + "Pb4jcY5qjXd0lo8WyrTwQkymQAQMcLXuIMLkSQH7QyA=": "6910574000000", + "PbB7ludVoOUO2Zjl3crKGFfzZAnOUoPq61HIdCFgfSY=": "461538000000", + "PbkAc6V001nYNLzvUgIhxZZ9rWAULqpVYb6B5_NX3yA=": "1666666000000", + "Pbrso7GAVQ3oGt8FrQpI8V7e_wtGzxwy7CDKbXbYKv8=": "521954000000", + "Pbsbh2Y1dFxeeTAKnYmOi5XqHJbyNwq3gRmr3jfwMX8=": "766875000000", + "PbtkFsfIb2v6px-Wq8liVm382pA0cp8qGtF2FiJXB44=": "384615000000", + "PbxNvjsQ6zo3OqplK9HDXZfPMzSPqeoei5kc3YpNPVs=": "407808000000", + "PcPqJSQDn0FQzagnU5KZpqNkpjR_JzNchlCwraSjtqo=": "831431000000", + "PcTblxFYIaGrFVVHZkkzKxW9YROpy0pd7rZTs0q3KJY=": "464111000000", + "PchzOCW9HAQ6dS8HwlgijcUIDAscOFF6KHgNSFXXJ7o=": "384615000000", + "Pd2oc1Ba9Oh-xl0jBCNnM-MoAGhdE-8IGRn1JER1-zs=": "1153360000000", + "PfZxH6UPd8FV4sG7-TSP-WFLAHJgHusi2wRLXksy9l8=": "16724874000000", + "Pg0zZqQ6A7-4n-GZ0DP008wQ7e_Nb8_0VooF28EqKf8=": "384615000000", + "PgYUrQ6uqxaP8lctumEgVPmQE2JgRwTWrlbmWPgRZfA=": "490217000000", + "Ph4xr6d1hs2-WcceYNIv5r2Z0AK2qyVwPQ39l-zU3q8=": "1666666000000", + "PhJrHhPcFMY8HO7sA1nG1GsDrWrR4S4DRu2fad8f8Oc=": "810313000000", + "PhKpkKr8qchebpcQxzqKOgeg1F8wSpEgMKAVQsMEH6A=": "925649000000", + "Phu0Iq6jr-RP2ZIiy6G3RF6sMdYkoYoyEF0NyG0bU54=": "4049792000000", + "Pi6QxmCZ7pOmCiGb4xzoA1iWC1-w98T9PDphvaclptA=": "576923000000", + "PiAxp7NoV6JzxYRTVI5_do1p8YJueKj0GMKGIs0h-cA=": "1923076000000", + "PiRdc2ugvzz-gJOePs62LM1Z5700MhPmRJYw8Pslkag=": "384615000000", + "PiTFVdlJDU7g1ll8Z8ebM7RFDRmBTZE1ptOuHHaV-uo=": "543723000000", + "PjDN-Yp_35DIhdqO-faLmMR8WG0YKLX_Vt3a8OLXAl0=": "2499999000000", + "PjKgd4gtTiOxWKkFHG6rzbDKjBz84thinIjfdW1fGU4=": "1563772000000", + "PjYoLfB91yWKXAm5-fQPrp7NI3vahw1vKi-7-PnVJQg=": "384615000000", + "Pjq2BjBsNtbDXYktUx0Yb1D7fTEo4Xj8AgOIradCvBk=": "980769000000", + "PjxNTT2MNu_Bd77I2HX3_ET5Fxkaj0tFEejikdGBFXE=": "1682449000000", + "Pk5YAUSA3Z_-lxB6t2iOgjdri2QZ7xlIPXdzxAZCMOM=": "906315000000", + "PkTcvTJSSDind96R9njZ6Jcgnbi589t3VpDv0I9lN-8=": "927494000000", + "PkYPvajYPBuK5k9jWui95WKyCm-4v0W8rLL5wCG0eYY=": "457937000000", + "Pko98dlyFZ-MYIidcy1c4f93n44AvqrcUOqJ_TlFumY=": "384615000000", + "PlggJSCkQN0cB2CVgdIecse6PbRdUUrjQ5OrupmYaYc=": "624999000000", + "PlsQmPFe96ScdpUTbHXUkWSlYjYBXqn2j8fyzjKUjC0=": "932182000000", + "PmHa-JIEq-242etdom_fpFF1bEl9gLusAHIWG_DjyUw=": "375039000000", + "PmLwfX5xb3GBjNv6In85f4AKXFRua-_CwbLGjSEImSQ=": "381805000000", + "PmS5DH4ar4fYshQEUjlcE-JRBQmkwDEA96ExRRr8ZGI=": "2308449000000", + "Pmb9KD5wEkl4p1vEdUuODxyEfFcZxfyTPsQA8MwoXgo=": "3212791000000", + "Pmye5z_LaLiq6ELYmCn5vN3KLCxPGGDZFz1yBu3YJk4=": "384615000000", + "PnAAEQb9X3JOzn60cNhRN2L0Pb36HMkoU8H2ueOsUCQ=": "1240120000000", + "PnBQismEgwa3YrN_iDIym2vvcX1JFewl-pG24f6kxNc=": "378671000000", + "PnRyaPYpp5oiFuaaiRACRTqoq6f8oX1y6QVIC40jkKM=": "385505000000", + "PnbDMkGU9iQghGnmNBz22cDYjRTtvVGRYUQDXCqWpXA=": "386822000000", + "Po4h8kmaeq2QYiRAfMxH2j-x4464X56ykovHy0BjJfM=": "3635578000000", + "PoYK4DD1J0iQpi0zE2DXs5vxNDwGgbGPoJVvxp06GPU=": "1923076000000", + "Poq9BLzbgmeVNA1C7MHtEHCDo01Vu7K9QvMIC9gzVV0=": "458605000000", + "Pp7a17B2rmuLR1j7Wu55dpzAgNAJf7pAOS0osxTHoy8=": "27046818000000", + "PpbGxNWCs9hcTMVWGRjEtMm6hEMVbgVOPtZt-xacLcY=": "1174139000000", + "PqHtj16LrkkWBs2TbJHkiHRRk_TSow4E6y0zCJXvVLY=": "75692998000000", + "PqIGFv2vjI7Yi_EK2iEM3oD4r2jMdcZmelE7h6bQpME=": "438298000000", + "PqVQTIzxjKg8_TyoZGK5YRNF1rWsqZQeohmDEoq0TX8=": "1215692000000", + "PqcxnpjYWNoXCtFHJj8FqoFboT7ybMhIuOxznRJW6gc=": "3269413000000", + "PqhlbUL5esyxUtV8C5VDgjLZQAqjT2PHonA08AEhV30=": "408021000000", + "Pqoth_5wOkU2c3KOx_AItpp0K1-oEXwGcqHyi3480nA=": "379874000000", + "PqrTIwL5QJAXBf1-YqFHo1OiMjT6Pdm82dQiP9-MXZQ=": "384615000000", + "Pr28L-y0w7U0jlxUq2oNDdbMN6LGZAXrmwX9mvfRBGY=": "4946121000000", + "Prk-H5KXAdNkHlKhY08WZsVhofB5e93rFuqdOakUMP8=": "408021000000", + "PslmF0VT6DcoJsYvDSQjwaJ7m8JDIcOofQAqOZlpSrU=": "727307000000", + "Psn7_2_7sIhHDYmUYJyO_rWZPzjfTdP-YAawPgNebo0=": "393566000000", + "PtKsxLl-iV_ViuojXLcCaG_IBYhgP2uGaHPPHUjSLjM=": "384652000000", + "Ptb5iJOkrZhw8Qee7vnFz1b59I197xPAoGF1zoyFnpQ=": "379344000000", + "Pv1Wym28Tq1QdkB3tX3hY33W1HjOuVjW9skFP-Et10w=": "1170317000000", + "PvoUHQTtmMP-GA02oALf-qd9rTQXjWlJQQWWVO97T8Y=": "769230000000", + "PvxtOk2kd3jKre3C0Km6b8FB5CvGGDo3ayE8voxPw-c=": "384615000000", + "PwXsfrtGwWM17OJMArUg57q98wJ2Gka9AZex0_SiKu8=": "769230000000", + "Pwuq0YLJX5mWhmObfAUvAMP8_-M-95w71lZdjJP_zw8=": "769230000000", + "PxD7iClbtPnZZ0Ol3qLi89d2MM_hHqHJVrOFHVNXyUE=": "449629000000", + "Pxn4kYtNBxQzLhuCo3WU0fSa_aB3gyaH6XhfUXKfdWY=": "416673000000", + "Py4BHbEP2U62RqcaxxfMJ_toQ9y5UufhKaf8LJOsXRM=": "382908000000", + "Py8hLDqujqlzp4dL5Ocra64RRgXQ52she854lutL15g=": "772727000000", + "PySF4V0neH0bhCFVls15xutFziTE-cK4Rh8z2m2DC-Y=": "1135328000000", + "PyzoMjb2GnevgwKckzpYz81v0I8H9qcPquc0wTGRnTU=": "2314527000000", + "Pz87T9hgdMGgGeIHJ3rBnbNBauhv9BbWDdm2w_qE0B8=": "448211000000", + "PzB8gehN5mKQxghUMeNFVEbGW-qdurrNZ-oMjPxzzMY=": "789863000000", + "PzD7H5Lmeq_UIkWTfhO-G9rJahIhXaFXSH07rpDUmnU=": "963653000000", + "PzLSgVGy-JUDCUw4Ab5vOXrh7D8mDMZ1eUxBGcOOOiU=": "381805000000", + "PzN2XNU5Q3jx3L89blCAjBTtmZzKXSX3XUBJLcPNM1E=": "4591751000000", + "PzYwW3nZnustHDNcEbXACt-SW-XX8G1c6MnurPMsm8k=": "416666000000", + "Pz_4jL2l8UvBU1tlcSvDFAGLePrEruXAHdoj89iFgec=": "462146000000", + "PzecvS7jFPtIpfl3EppV-aegq2ZR_k5BdyRg61lLdPk=": "1223040000000", + "Q-EsiB8zTSTR8HawMe_xA0sKggZVJ5P-SjtHOFIZj-w=": "384615000000", + "Q-YavYsAY4cMeBnSgIkcqd4AuoVS0qS4rl4yjxCfI2A=": "19525416000000", + "Q01C0pEofBJQAIPTFQN22I8RcT9MDRyGqfLD1cB_Rkw=": "8272291000000", + "Q0CPSIvxVVJ7K9SPRBOohzL9C1H9UVaq4XUE4QSUVDs=": "599999000000", + "Q0nu8hnsRL8s0vkpMd1V9EZURq_MnJG7MiP61mcjnhQ=": "446994000000", + "Q0x-c3zp1KiVKwbnvK_Oq4pHxk9Mm2MhU9JR6V-7kZI=": "385507000000", + "Q1CIYr9AYCa6MEHkYRue9X0g1pLyxZBT3AUvbQU702s=": "451715000000", + "Q2KxiCkyYAwY2vbP_9zZeDP5k8Pq32wtBpdsc_NUykE=": "384817000000", + "Q2p156xmcOM3wBTw74olpRZRloDvBABFee8aoESDbgw=": "378733000000", + "Q2z1IgsETWYV4j4p7npiTnIIzaE36mskx9Z36aDANMk=": "954279000000", + "Q3DM1BlKhDDevXu1RIqsDVZZKZjxuF4SnN__ULXS5OA=": "2431133000000", + "Q4FRb72VJ6TQLQcjHslBo2aZNE0a0exFKFVahdTrJQo=": "384615000000", + "Q4KSuqmlYCtZ7NP5zxI_RsrZ9lTVy7p2NNWovdszlyQ=": "424796000000", + "Q4Lmf9naV2hlqb7FNkHiye2_fTlhz323_8n8VPp_0i8=": "825800000000", + "Q4WW7LkhVYPEC4V2Rj4TcgGEmO4g2owz4SJnR2B36Bk=": "1634235000000", + "Q4dff9sb5xmPbLL64pNeUn5Dtu3CBVopR0yI3YtceOw=": "755298000000", + "Q4tHH3jAYsBJfrOTT3lPSjt0lUVI30vZ5qUznUXu4Tk=": "808861000000", + "Q5-rFfxzeafmIvtZvt2L2Aoph7LZbg4c0rYQL5lJMjw=": "385213000000", + "Q5DRBbh2XR38bHQGEKszNDfFihq1gKbw23XTqbQuaeg=": "1563902000000", + "Q5ITl71mYr52NgIcnXlc1b9yJKWJedreEL5czU_yYms=": "417635000000", + "Q5N0Zu8U-r-ol2pZao3jErVvTsqRLhXCH_dBqOjVT6U=": "423370000000", + "Q5W_st5kWjMNoyfj1F6GZVWZepAYAMAHKFdpNhhPRfw=": "465433000000", + "Q5k_Nw-1BlH3ue-7FOmrGxS01bc8ZCkb3_XJQYAHme0=": "384615000000", + "Q5minQaY3aj5pZNo9KXoO7kBdhWB8SvAQtoW4au4kCk=": "1154347000000", + "Q5twgDofNEe9ZHu8NEIZuoXvuu7xDicJjAzT_FIP__c=": "384615000000", + "Q5uGS3RQ-iFWGpPiuGuW_RrUTQTfG9uMG4sWQphzdRk=": "520498000000", + "Q5xJo7d49_KAY-U3y4toO2sS00pr6uJ6mTMm6vEXBb0=": "2691889000000", + "Q63HozVtPoS-96_QrkGMatWs8mSt9DiV7O5fa92rPY0=": "769230000000", + "Q6PuxRN0JkickIgngAJwQczIN4wD1ITkUUSBaaKlVBQ=": "1153861000000", + "Q6RPaxa0fuwkWtoEJN-sanEljIAPxiHSDR9OvWhaDCE=": "404793000000", + "Q6ge0F8EbgkOfbitdDgQgawcvE0J6sc1anvY4DrIqBw=": "1158675000000", + "Q6ruqlmlVUd5ZLvPBWsO2A5HOkHf8bCqCb_sk-l_by8=": "385616000000", + "Q75I-zUi97IBEXtUCOsKqFsoyBV48tbKFI-cKbUWNS4=": "1783986000000", + "Q7PFhVXjGHBmh-y7woftCpMO9mskVCnI0K82jJJILew=": "382479000000", + "Q7UxWfJMdXxVD9Rv2LfTZNRFMIuPZTAXv95OXkaQB2k=": "538461000000", + "Q7d2AJjfguR4-U5Z7Sqvz6Z0uW779lb7COZdrmMo63M=": "615384000000", + "Q83P6mTIBkwTpdHpGSJ9kTMHT6vVmmoIeAYlHo7Dm3A=": "736918000000", + "Q8fJhb-CkwLCmYO0c_i9IjjjOF_qfj5IhPo-RyA-eb8=": "2763868000000", + "Q8oRQRGyhUqgs8hFOe8mPDpOXRnOQEZGGB85tJUjsR4=": "470195000000", + "Q9NVg9nF28AFq6Gx3Nn6W6ymitykApUmyZe2aeBE5xU=": "416313000000", + "Q9WW4oBrFCzVW5-uA_tF19LswRlV5QPMNwSonQlYXb0=": "4999999000000", + "Q9ZL4iSRfV6zG5GTS1fDyqMDFo7MPQqmarFruOy3PT8=": "577374000000", + "Q9h3IdzBbzNx75PPhBb283NxtsSTpAdeSUXMYD7fVo8=": "2238665000000", + "Q9voV92uIyMAeJO0uL4UcwyQioUFpUdsV6GHBShg7Uo=": "2745809000000", + "Q9ziatUq7qx8yH6r5cl04CX264GR8YsQ1yu0JClxkmo=": "452482000000", + "QA925D48wnZjo7MCJoIJ5IBTJBJJF7jkWnyjbs1vVa0=": "424303000000", + "QAe_-KNff8iedSamQbTQ0qn0cdlt1VjzusABtyh7O4c=": "386201000000", + "QAfKYqiiyakE8BtBl45uLKuXZtCl1uiEgBM70BD4rwA=": "1249999000000", + "QAksYHI_AAwa0B_uUry9TNB9SiBnK9jJcbDm8A_FlZs=": "1939039000000", + "QBy4vcFha_riw55h8nNY8ZhnXd2MpEldq2G2tG4A2-w=": "6509909000000", + "QCHmMtGxAcqpqgRUCZr0ZtGEE5cbnBHI15V_zOyV-Ts=": "1091328000000", + "QCwZ4wmH06YcJRzChAmi8RIeQjjCdmocWRmwVF6Qwbs=": "463315000000", + "QCzIrApA7zGRjVhZiqcBFRko38Za_CrMT7lXSgbnKIg=": "1365066000000", + "QD0bjpxHmzyQaHQEp7S_sBxCnCeLtKoinIGMie475jw=": "1425355000000", + "QDAknd0347ErtbzXtDnTF8yIDg7MifZgLBUSrtmAgJ4=": "769230000000", + "QDcPvR545bo8U5GmEH0OgRkxF6P7WKeHmdG0zxBO2lk=": "381695000000", + "QDyApdDYVUxVoOuantajiueOOsEv77HXYUp7bOABCTY=": "2053518000000", + "QEkFUAoqKPrlNog_G6lGF7OchmWy7sRVC0-whNT-u-0=": "3846153000000", + "QEnmhO-Au9Xe_bglmqQTnrGedkcjCfJQY7kGZ0PHAXk=": "1153902000000", + "QEq9sfI5eOgNmG0cMeYIgaaKtpkCA6CviUAuzL2Xv3g=": "1156517000000", + "QEyHradRj3QDr2s1C8sHE0F8HG0pB9aOZwjnUMFtG0U=": "384615000000", + "QFm5ZT0RJUwxELQoY8SH-zjlEO6ptRbuBk9rv-k3JBY=": "1157097000000", + "QGB9F-DzX0kyj28vm9mU_fLb6OQDY4MbHjolYKbH5g4=": "8658632000000", + "QGjSme7EfsHwiJwwe1si8cItmhpqOw5tKeHPqSncwb4=": "472009000000", + "QGk2P2cFImHFJdUxL6aKiN9IkQdmyFyvILWzAAKSWjk=": "378037000000", + "QGoLLULwJ3LQr1a5h9sGrhel-4tdlQTvlLT_uHC_KvU=": "2110842000000", + "QGtPs8pjIoWutUOwtvtpx0CnRKDBXNWfVYj5gh_cbYI=": "385508000000", + "QH3nXwzcr-W1bhocWsf3NBvOa8FS6nICAb70MmuG4Rw=": "463498000000", + "QHdJIe21D6Dxn4RYjwt_yDWh0U9hXz4s43YCGg10lMU=": "542473000000", + "QHoizjXFLA-8w9sAWUt-AEi7i_yWmwnQ-3TRC3dQQlk=": "1157186000000", + "QI1ZwCLV250s32zSO2u54vG9h5gLdQFKp6sP6xtXhK4=": "404383000000", + "QI2Utg3TPRNe-O98259-w7yYxyIM2o-nsH6Rt-Vk0nM=": "1933203000000", + "QIAWiuJxFm-5j4t6-KVFYpFBYl1DK2b7nuX7jxlXdQ8=": "768779000000", + "QIN4tiWerNnm-HFCdEFWRAqsgktSnS198EWKUrSxivs=": "5052659000000", + "QIpXl7m9pE3WaCnaVJwX56J0ajPcb4X41r6QFAHAb0o=": "470159000000", + "QJ6vY3qYXme9tYbRf0t0J93H9OzrYntcOGrswJ85Vnk=": "378257000000", + "QJMcH5_g-CERliQjS-WRqKI77MQ6No-g3ELWjVGtjzM=": "454545000000", + "QK9eGlmcqG8_GeK6Qyf3Kf_XJOLQ_TBBP7zDw-T8KS0=": "469988000000", + "QKn9oF6enKoMlHhZ2qQflzkX1TF9gU-xNXWD0fFZAFg=": "347931000000", + "QKvEnWkQtH4fX3RZ4OuEyi27M66u710_Jp_oKhrmSdc=": "384615000000", + "QLN5CeFXkkMtwz6ypFwgDwAJZhyXP_Ysx8O5Sv_EEPA=": "1355269000000", + "QLlS8Fn-ErjdtWIahOYm011xpxbr5pPH4RBACWpJvds=": "565887000000", + "QMkpqcgpMdoGkmhm4Pih-xi1X4eVsM1o-8J5yJi6PrQ=": "1156691000000", + "QMl94oiQoT4aXJnKTitZlvvziOaaHAUGnndnF-0_PYI=": "470398000000", + "QN62KJ0riLRwOaSCIqcp76H9cufvo_YD-VqK7_dok9E=": "4173180000000", + "QNy07XybmQwLiJugjM3ffbNpIpsmJaGl1Mj9ypmDFXg=": "2448515000000", + "QO82NsjuoSEixKOmOELkiqeDWHLejPHP5Qwt1XRkNyQ=": "3846153000000", + "QOHjvJjtCN3n1egPMQqen3qdctw1CqU60Y2FTOTfYfQ=": "769230000000", + "QOeZQtpR7oKAYKPZlpamFv_9tdcB2ay7KcIPw-lX5xk=": "1877100000000", + "QPeOoCGZODZZdkpGKhOxTs5qVBXjn6L-kkM_r9FxxKw=": "1923525000000", + "QPhEjX_KoGnL_9YjqMqCsi5oZ9l5026FokC2tmM46IM=": "498796000000", + "QQ9_CwxFAJWLpcKg6FbTQJphXyU_qLaGvQ0VD2MucGs=": "3830304000000", + "QQMmsxvnGHUMeVDgRq69USDCdQI_dMOuzhZJPa6vfxI=": "384615000000", + "QQQB6l5RBK27wF5nX9oOtWLySeWAZNX1s97MHAo-PQ4=": "1026763000000", + "QQrQly1e7UtwIMRS6hwgv1p1roGQBon6O-sFLcag2QE=": "461494000000", + "QQrfdsvswyBWMM3MgI7GqEDjslTFKbLYoc76SCjaANc=": "630445000000", + "QQtjbIyecsP7hHZk47uRgJuGq8yb8lsghkWX0LIHGfM=": "1818304000000", + "QQuGTQNO6nPNN6SnOvDzbPQihf-x-3jyJ7kAGvvv6WQ=": "411085000000", + "QS2tOX7FXyPrQhYz0Nkz4yP8nbhzxDDEyQ3KmKCecyk=": "4564202000000", + "QS6XkwqHH11ZIXg2Tio93b7Osb8ddmNN03yS5ngW0hs=": "386848000000", + "QS7VsAWTD5-aDQF8bXZzWsx2u0YiuFY8q285KOf-jeY=": "385505000000", + "QSWT_aAbPD8Hvl9zYyhkybYyKMcRwd2N42KkWD1-K9s=": "840252000000", + "QS_0e0o4Dxkr6l_5fJp36mS5DvNwnKH1XpbD_PFJMAw=": "847570000000", + "QTAlupNx_m2OUfxXMjF2_ghbL1ZC7A5o2CQReTkIUYU=": "446149000000", + "QTEn2ms3n_oRc6yDktQRUHzZlx0Anw4aQHutNfqOMLE=": "385035000000", + "QTI8mae1wZOaxhsLIC3at_j32rJz2k_MNp8TXl0rBjM=": "1156521000000", + "QTVcvUcNGcaSTspf6USu-f4x3v2szb3koC5dvf6o07Y=": "5084148000000", + "QTW3b_nZqwxAiDX2UPnaqgbupHsUnL6zmeJTAVyf0HY=": "399661000000", + "QUIhEWpb5S0YkYO8FTC6eao1fJc-v5wOtQrHsUDhnSI=": "1153846000000", + "QUi7iqIPEtBF0VyNneAQue_urxJb4_WLuZ7MQcQW7w4=": "384615000000", + "QUkurRE6AY5s9vHqifKhdPKvziA8W9pNorKpEaVX-yw=": "3315000000000", + "QVWoGC065SYbY_A_qMUJPrV5rkX4CNgTYboecqUjAy0=": "4011797000000", + "QWUtQHqtLBEFcXgUiQv6DkfB-z-flixWDbiLc5iX7qE=": "385528000000", + "QWXzSgljcCWPSFOEWC-T4OPvbKVEzKpLMkP5sj6BcQ8=": "390680000000", + "QWlhkg6IOMB6Hqv2RwF5oZdGqcq1-qZHnhjSUYUfLFc=": "817526000000", + "QXFMFPbWHtB4x4BH1eHPBXG19f0bkAjoBIaiTkD-6W4=": "673076000000", + "QXM6b7XmHdl3E4N1yb46381JMqCl6sYQIdWxFtI00nU=": "769251000000", + "QXVV8bfUMswiXpQ_GbR6HyhzBjozkgjWvzfiISvAHbc=": "2079887000000", + "QY3iVkpy_b_vPRsuTG4sxMN-0nwLCwiDO305gOA6hoc=": "411085000000", + "QYDo8HSzmHY6yYDz2fZkkCIlFVUFdEIMYZ6You863q4=": "460237000000", + "QYHjqA0HnqI98naT9W1F13Nor6KQUdC_vYhVPS7RNEQ=": "416666000000", + "QYpnUc8v1PgKzZ2kN-ZsFojFNymRt9dbDl81W7Vl9Cw=": "1538455000000", + "QZC48rsOfuk49QPQ8j0JCwXCLX1UsLgeipiAgExa5Z8=": "384210000000", + "QZMjs5hRz8OsFloTArj7W83nS44azgVtwGSZWN3yOjc=": "10152826000000", + "QZROBp8915awQ05wA6NRLT3XGhYKtYN-B9v4ZLantHE=": "381739000000", + "QZhB4SyBqFmPaaEa9IeDup33Vcm-02RIWFmdclDEAxg=": "385506000000", + "QZw9hs4q_qXhw9xn2_Y4k6wKnxnD6Vd2wCu2C87JCJs=": "412510000000", + "Q_3Gs-x9Pi7YaeRGOW5ejWjMSfwHZP20j8AgLv0JSu8=": "818181000000", + "Q_unI2aV9KEYRf_o1GVuCXCm1vIl2tPeEzTzLy5vGaQ=": "455209000000", + "QaZRrR8Wr0b02oLzRiU528UigBbphaKX91DCoaC515c=": "2314802000000", + "QayT9rnupSo8m5KUZs993Opp9O2wZxCWP874MCRdKBo=": "919448000000", + "Qb1V7Au6Z0g0BiNwJ3y3DjvTUUmWP6GAzxULyZP-NcM=": "391797000000", + "Qb3zb549_ri0ce_JvbTvcCP3poJgCihCk7AFtdrV9h0=": "1527214000000", + "QbJyjC54gzRVYKvXht-tj7Wh2rwzcOXemF_7IhRmFRE=": "411085000000", + "QbYO1303dzl7zQWhgdcvIDPR1pTquGPXWPCfOcncPU4=": "5085255000000", + "Qb_L8yDQWNs7TzyeTV3udraxm-WmxZlLSOIjejMwtoU=": "448700000000", + "Qc_ijAqc3v8f_gfYSY4onT1GDCVHsTLvSkVrDabaooE=": "384615000000", + "QdGKmS_yEd_QNnaQ0jgedW86ssznPyNjqx0QBNoaSEs=": "417821000000", + "QdJa35asC15xNdSQkkIsMMETfXbSevsNqyg_23O48_U=": "385506000000", + "QdMpxgZcb42lnmV_mPIu4rDGtnqvJqV3lO6EUBIgXQQ=": "525796000000", + "QdN8-zfrzMZMU7poYEOJjBFL9JFHfPh-ssaj-yePeF8=": "500384000000", + "QdO8vPbpyXa-WwH-_P6iaFy932Q33OVKQh1qFL4hKRA=": "846548000000", + "Qe8TPRohhmZ4BYSZIcCgAhmeUY22AeK5pWbSukx_T5w=": "462307000000", + "Qf2wQpUe_mkob0C3fHjis1D6BeDG2HjsNMC1zay4HGk=": "715769000000", + "QfvqCDTk21DmmsFPPWoyK9MxqfsLY03GBswmKTTqlcU=": "384615000000", + "QgBtv3zuj53MdKRBZWftXkqReQNNOSGCO60lCQq90_o=": "656573000000", + "Qghjm-2Ri2ejynSfiDFVURXr7MVhCw-dpVsdFGfBiMQ=": "791091000000", + "Qgzw0wg9GNIchrPDOI43ndI9-hUcuKoR1f_XsDNh5eY=": "1458630000000", + "Qh9FyqbbStLu_IEqXhtz3RxoM2YpkUXGKYopqDzPkGQ=": "4427090000000", + "QhanBVR9OYD40NCG4PPr1W4G2zgXBew69YZT0VopUIY=": "921463000000", + "QhnxGTJwXbrAFgHvgT3IgnnsAxq3-yHsAB6fbjpXmuY=": "619957000000", + "Qi0xQmRw4FLUIsYA5KEh3EObEJIIm80UZcYPizgOYrE=": "1963813000000", + "QiRCFLg-g0-jpYlhJgL6wnu6MYXsZo7ZG5hcEEJ-kQw=": "384615000000", + "QiWSDVTgErhXPSE5f_Kq84YIa12fwxsxWHwHajdpLzE=": "2068413000000", + "QiYX1_gZTpo_cuxnm6OapKD1cVT9BVDwAgGCZwBiFGs=": "12135311000000", + "Qid-LCxzjBFiVENT4ArigGxJBstuk6ioWlq57ATnKs0=": "448100000000", + "QiiMYc6lihw-gaUJzatMKY9dpNmV9Qb3ql0GqeKHCNw=": "385326000000", + "QjIIrlzJpVgf9U0AxQx8pke96u9Bdrno65xoI2Mr6KA=": "447427000000", + "QjNFIL790sFZbifwenXrLrRSX7cuLDBjdCHrZ6wG1dQ=": "424550000000", + "Qjm0JvluS6arCV8JGYkzDlBv98rRg3pBUoYpQFk6m7I=": "1155627000000", + "QjoUY-jdVqUUpoJIBjmWW6TZXUKTcwqW-uZ6FRhdS4I=": "1821728000000", + "QjySddH0sadRdtfVEnvdbLPMC53xyHuY-Yv76kOojfs=": "3999999000000", + "Qk8WHA0ZPxingm6riF3xyOi0A8hABWtu0W2qhBNbBBc=": "384615000000", + "QkGv4aSTufij93EhtB6CHmGshEmRlNHEj0txDVqeZ_0=": "388807000000", + "QkJL2t1BmCj9eOpX-1qGGzlimycTRZNgVj9CYTPdXAc=": "481965000000", + "QkVu_h8lxMjkSHzcDz98RcGXqSdFvRK6QdF7eiUS8rY=": "455585000000", + "QlLgkPX1AFf9gwIVm1hPrnBe_RGOg1YeNUbTmR7NkVM=": "3846153000000", + "Qmk4LKU9O57GQI0QI70KDYOOG--qFphnq0VP0nCwehE=": "1905132000000", + "QmqHlRIxYLQZvrudyvxztO5XiNgqcMfIOcjB05Gn3zg=": "469764000000", + "Qms_43ZB6MG-SahnWVj9FRX8fsL8H2en6uYdbzAp7a8=": "9415350000000", + "Qno2CXhPFfKF2eK9WIAPJlm2Fc7bnJ3O-sP75NpNFUc=": "411085000000", + "QoUKp1U1KCek6w8wkkggWIkXsGqDu4X4vJe_ncaVjbs=": "384615000000", + "QpG9IOP34nMJfuUF7wiN24z1EDms2Wo1cyeYsL5gIcs=": "464404000000", + "QpHTPkKTfWDbFTqq8ebV28zBVOG8iYF-emvqnUykfrs=": "1155184000000", + "QpNKMgkRlZEzEJ43IT8EhMchDfYL2wprhsTu9BtOZvM=": "874999000000", + "QqBeTfuvyWZTRiJ9Sk0fucRrS8U49mzn9NaLpIvMSoY=": "413740000000", + "Qr15T7LtIOrhieovVzJH-Z_hig4NqYTXUU7NBQqff30=": "1145412000000", + "QrCOmXUiwcqYH1aPYvQRd60OJcCvrDfrI7_nfsNA09A=": "2500044000000", + "QrFszzx4nXAeOyTPyVV3wQNF5pHR6I7uAgiMt_80AfI=": "384615000000", + "Qr_at2R6ncjAJvYLoizMOCV3VFBf4X4766DS66favnY=": "896027000000", + "Qrs_w9QMWKtAWE7By08FmuhMztgzGY2t8JugqkJWxTk=": "769230000000", + "Qs6WfRfBhUFoTEmER3bGPQDshslCUsmbHK6hUMr2afM=": "534979000000", + "QsG6SmMOWsjOumyWop2XWW2jatCaPrPO7g_F2PP2ZKI=": "464587000000", + "QsqswXBRSnoaGMUjWd-HFN1tqQrTL06FI4WQCO5zmKE=": "2110984000000", + "Qsydinb2qqZTBrwUXxQ0baPx3LnAyDnzrBP01Anaqco=": "3683678000000", + "Qt2U8BL1xlCKpq93o0OnB_TY1jPLQBcFixG6ZDrFiNs=": "833347000000", + "QtDcWC_pWnf7AgmaqMsBD5EVhsOP_1CRk_urkdftNWE=": "403504000000", + "QtH4CkG8DZQotbLFZ8qmGgpZ3x5UAi-haMsOHZ98WVY=": "454984000000", + "Qu2zFm2nG3fUJbSJ3mwduSAUdJf_6ynycQ0DR3LrOkM=": "378028000000", + "Qu8YtXNnvwQ6XLHhL6kChH3Aw7vIpct4zczwxpjJyaA=": "1096110000000", + "Qugo1lJxbX639OQ80gcw-oTJwuqLoO5vuCaYCAhX49k=": "413111000000", + "QusPdkIlywGF2_yjuvRnJxVaz5UL1-p3alrRh76zMDs=": "951750000000", + "QvPdykn0R9p8t-6iSWN1SU8BMmJDrx1yerhk1wyFFuE=": "19999999000000", + "Qv_Yvv86IU_T6cJZB61mcs6sraFcfZ7YmbXxnvhCEks=": "393804000000", + "Qvomd49ad3S3nq6F2t1KKywe-QwGRM2AhIop_BmmZFk=": "895083000000", + "QvsinjIIo84jjBD_MlWWu3HL3Zdz8-laY876_bJhtBI=": "385994000000", + "Qw82hLzk0Rgzh5clvFzW3_v5qrFXVdURfWudtf9QTBo=": "3855056000000", + "QwAtUF8V56ZzcerDef1gAwKN60YiEJptN_rpK4FS3Us=": "4135387000000", + "QwMUcByMEFLAahQp1uR6MaWcPNMTuVJDAr_7G2WiUH4=": "594774000000", + "Qwr4IOaqGjW82FnOe2mZZvU0PNfT8knydXgRKT4SZJo=": "376360000000", + "QwyVrS2vR5s8c6yarN9VcHlBbRAGqDTePRclrdUqD2A=": "395497000000", + "QwzwynpKzCRkr69GcACWGnIVYhfAZAgrTIVhDnJGSi8=": "1083267000000", + "QxT3F-24HT-KxZ-J77ghh8F_ar-RtuHgVoiToPzMhYQ=": "463541000000", + "Qxg-8DVWVKtI4TLKbGlYLMubEUbYV9I-brMZfQ-VvVA=": "2518691000000", + "Qxmyt4ymG_cNJiPbr7_8T57q-FhH3tgKKC8U5H74zm8=": "2503701000000", + "Qxzs4qerwxydD5ZQ9sEmQ4AHUqRd_f36Vj6uK453EFs=": "18181818000000", + "QyGb6LL3_wd4PiWBZUUWjAw4A3QCS1FwNlnUGrRK_hc=": "1223425000000", + "QyT_wkQEXuUh5XdYyhlQeQrcrEp1yeBiAV_K5yrgCmE=": "387002000000", + "Qy__N9ybATogFPS7b0FQxWX5sxWsz82lR_sKCR1k6Rw=": "384220000000", + "Qyl8FO33k_CX72T-Jt6GC0-78jYY-XKY9PmJBJRh7DY=": "11631977000000", + "QyoQL4xQ9CzGIbuL-0xd_q-H823hUxm7HkybPgfR2D4=": "384615000000", + "QzLEEgWFPccFH5m3Me4H5Rxmqvt4jWK30b5rqRqVp6M=": "987362000000", + "QzLnZzpCTHMooe-bN9LU1ET62L4cMNB56pez3_C3U9E=": "425251000000", + "QzTacGKSL3KhendoF-bKz6bTOOq20kAQE3MsigejpAA=": "377511000000", + "QzawOkxm3c-BG8xPI-R_3d8x34HWF1cc6vrsNoOFZes=": "455125000000", + "R-CRU69Evsguij3zPhv_19O_t0QmV4WGWFmuqm4AjiY=": "382444000000", + "R-Pmn2Zgx2WCfeZxD5fVq_fobTWuLiIM-pYxJRXB_WI=": "502779000000", + "R-hHq172oUZDLmxI0oIbYQIj4gqQbf9GW2kRM_qnuOA=": "7856488000000", + "R-pPqjx81in-zQXQDPDR9r5agVMpJoQ3GxfkR9a56Ck=": "833333000000", + "R1mu8ThSdZMLE5uCW4H7HT8VIRBYNPjKusxaUNAlxgE=": "5526816000000", + "R1y41TbyLe5abNyGAP4ofbxugN7vmzcR0X10cSZ0prQ=": "1156522000000", + "R23cNA7V-skDVQ0zT1V95tcLjU3sXGKm70M3f1Pg6i0=": "2257489000000", + "R2F_B7TWrAXeUrUr9ykJ-en9GnRvE6h-_kZw_Qxmgok=": "384896000000", + "R3P6FtVXHdkGbqypvKpPAuMhqJuGmLqTaQQ1eNxH_04=": "385510000000", + "R3WMbJ9X_ZeC0ypgqQDuPDjruC6jKxD-HSUndB632Sc=": "579114000000", + "R3sREFBsb1T1os8ii4LbwKmc0Wo50djZ7qqThNxbfJo=": "442798000000", + "R3tHa7BvmF2hHb4zsuK0-h0esinxMSPEEJ83NnHgjRQ=": "383481000000", + "R3tTUpd6IMxQ5mZTlczbJpwkrIb47OLLirQYRi2oTvE=": "7558248000000", + "R3yaYdPUY0xhvkoQw-LovTAf8xhs9LbgQgwFfa6fad0=": "407218000000", + "R43jSnxV4merUsLvhqva1zgoRqLnNiyezG5XMYnsifQ=": "461263000000", + "R4AGO9KxsDX7ocrrjkfpGUeFRn1Sys2U03aOyIjPt9M=": "1366800000000", + "R4IrffjF02XMbJdJ440Ywgi0AEp7Vn7BaQmHcnOGj-w=": "544338000000", + "R4M-VhUK-e6j9hc4I_aWHFj30EuDDd7GQCN0GEIBx9s=": "832842000000", + "R4xXzuJGojrCPcPtAfIsmPl7HPIJTrugEePjEnq9WY0=": "383748000000", + "R59_OyOqNlvqOcbYYo8Obl_YK9QZ4ZvPcWfozFihYlA=": "1739003000000", + "R5XENhNHsrXsyJVPHY0HnczgdjF3sdlx96k9V2CLMHM=": "2005898000000", + "R5f6izQwHl-JsqZppR8-RRDDAOmFo4WYEzOt8OlCau0=": "384711000000", + "R60RdeB7YNUov4x1ZpsgFEd-RbZ-U1KIk1a1UrDqtWk=": "5845283000000", + "R6FUhgemVCTdafaysFoUcQXz4TT-9e2YP2-W_yzWX3w=": "462444000000", + "R6MhG7iQPDNeT6qmL-3nUnDEzaZ_hh5J3xFoyNfNdqM=": "395499000000", + "R6zs4bwJDHIwaC-m2fLVQmBb6w00Qros04TAgt4xrkY=": "501124000000", + "R72EjM50yiQqfGKEVDsCvwWaF0-lWonkYhCLdr0vY5g=": "3076923000000", + "R7GU_YuGLQENAdFPG0X8ERDf38Fk1mqmTwKQuWNFMFI=": "416666000000", + "R7Iyq9Eh5MVRkZ0TJILxuENdq0-N2xRnegcCBpYlroU=": "384761000000", + "R7gT2tCzE2znuD3dvqfgpdaIob8vScM7ZPXsV9KX9-M=": "484353000000", + "R7kDJ_AdTswFkFhrw8NJKsDTqfqJJIUmWkWHtQBSlL4=": "2083325000000", + "R7yf-Q-180Iln-y-PwV34sbiddkc0gWpxWNwwKHpLas=": "7662968000000", + "R7zSJzB_IO0A6ty-BcCvv-uH34F2pue_4zbnInj5AGY=": "465485000000", + "R81bFhWfxe_hUJAAasOO7mJR2pFX5Uk39yKK8mXhM0U=": "3089470000000", + "R8K1OrckCGTO_Hx4d3TIjN6NpMTc6yGnhRjmIplNKy4=": "416666000000", + "R8NNTXQWW9tZdYb2KMSt7DgVJds_NqR4aFneH0TJuhM=": "2279092000000", + "R9EMxzMyXjjFCsOV0TQL2W7bUDrK7QOY3327WenBWpM=": "384615000000", + "R9Gsk8ZizUo9DaorRc_5orRznCkddTpEWoHhlhu9kBA=": "1150660000000", + "R9QGyU35BlUHIrZJdoFkbGtugiLh3bDtZuamFqWIBpQ=": "384615000000", + "RANcjC4-K3UtKdWvj3BYJyTyaZ4IvbhXd6wObOfYlTg=": "469310000000", + "RAd-3T3Gn064XSGLlAywehJODUGPBsIQnaE2mywduiA=": "471973000000", + "RAw3W8tMXSUF05esarFtPSQ_E2UrApkTRXAOYXyVE9Q=": "769230000000", + "RBZxaRPZARkw9mklFjC28UcsTKqJHxiNgxeWwmDKeBs=": "926781000000", + "RBokAuTr7wa0UwBsA1Hreyadw-hL9_TFP01kuDQXLOw=": "1182915000000", + "RByrkidwCds99qhGq_JMpUQTn9sH-C5r94pRhKW1rkQ=": "386395000000", + "RC4crfAXWLeJmQpyxderMamcyjlfd1WV4tPmZ8idJCI=": "571924000000", + "RC6Yc5bwlM7ytCl4lK4Hi5vp4TgQ4Ort1i2MeHezf6E=": "1244477000000", + "RCFxygtO82qYK5l7n8EgG31lCkjh5p9K1Km61pyg0fQ=": "653846000000", + "RCSM5415-ummBnLy_aKp7NkzhC8cWMzaj4xH36y1Y3Q=": "504195000000", + "RCl2K7nqJWqEnAulFe_aok7jFdXcgq6QA3S-swcz_wI=": "416654000000", + "RCv-DwAUk9dxsbCo8rBb0j413Q9YK9KAc9dKFiTLVmg=": "384615000000", + "RDbP1QxEwx8DiblxxMaX81_gV3hH2TOny1hIGjmxXRw=": "454190000000", + "RDlHBBci5L6Yc-Le1mHFocdl8mTdt7qdfwkgUPswmnE=": "2055429000000", + "RDuyu5eIx-yq-Lyu8JmTZ0LcKpsvXeJhvPrKqX0iumc=": "423368000000", + "REcaLIdBnzi4IXVRKK9TnyxIv83jOcgOWVebrLfhBBE=": "381805000000", + "RFFMzYd2Bt41SEMq200IL_ij5rzY7syLBBOizPKcP4c=": "3076923000000", + "RGuUZL3S1I_pC7BmbF1765OKhCxF8p4jBpJbAMS7Lj4=": "422516000000", + "RGyhaJO0AbLRMzUAQn7Lvd_ZBQ9JxanKk2Jo3vIhA4o=": "1923076000000", + "RGzitilzsIAnbfDm1Rv9-gURJJCzqlnfmQCvCsFgU1I=": "384083000000", + "RHXj_RbfzUhSNRYvdoNWq-Q4pw1iMkBYGUxqMgkf6Ho=": "1927431000000", + "RHbh_62P-oRN4kdP253aHv-1tGYu5DLgJCK0inVUXkQ=": "384926000000", + "RHetzSOKs58F8PUP4UWXMdc6g8Ev4HCqgiJdltF_ldY=": "1252904000000", + "RHptWRYU2EMggy-AE-PGVIhNo7zwCfnQFQOF-mW5Z5Y=": "1918603000000", + "RI07SHPU3JGOWZm440z-dmg8xETXBlUQTROB6hMCDXA=": "8781915000000", + "RI4Eo828mhN7vJIBDN2iA61vsQwPvH_0aIUxJuZuwqU=": "963915000000", + "RI8bBMm89K6WKjvm3sACbEi8D_XZFgK2M34TdosCKI8=": "455600000000", + "RIL9KzPamrXUA7NxyzbTAbFZPd1HCh4zJvBSdRiAqFU=": "1152836000000", + "RILTh41x4NONT8zaAJCaLiTDV02iXfwcM5kKY0vMLEQ=": "769230000000", + "RIlkflcMFfBATIZpH0XKVNJxvWdVg3eBCFGNCtWA3AM=": "757421000000", + "RIrBE0AHxRQjlp3FyJdKOtEL6fDG6HQNSceCsPctY1Q=": "381767000000", + "RJ539QXUKbMwu1hXxq1CJJ-7rdiEeXIlliksYOe-N9I=": "454545000000", + "RJPb3nhEa_H614N3jkoRj9uRgzMIRIg7tsJVZXqmeB8=": "462476000000", + "RJTWYnAMJJl85FO5ebZO8n1nXyb9UnUR0oDsipFi_IE=": "2000008000000", + "RJasZRosZ-Tyvhk4wOQRy7CXXIeAYE1E8ztCnyZE7ho=": "384615000000", + "RK5gxa3n-7TFB2v9xvl8QD0bgJ0xMsWH1Jdk50IiKKo=": "1249999000000", + "RKS119TXxDY6nqdi98dP-ztzij2jcafsotvuVFxYcY8=": "3838963000000", + "RKSP2rWvEoo3MuDfPP6nSDzXVjniyIaSju3fuE_ZEu4=": "411085000000", + "RKSXA5-LNQTeOrdB9XMpCQfQ_BhL9zU95BccBzgy0eQ=": "378310000000", + "RKXZ11bhUG8CMTy1Ibd36TYb0nwEc5OASAarIPERrGw=": "423029000000", + "RKnlJBgD9weZ2qE_vvr39doLYky6WSAbc4Ir4jgtY-k=": "1791666000000", + "RL9RcJW0o5eG68K90F8a1VfAucE9kX3aAp6AlJ7GNNY=": "379637000000", + "RMBVYvlAHDPrTPqyDRmjrDhY6-7wSfCONsUURltY3qc=": "384721000000", + "RMmtMWUzmXoRWAXpc73_9yG7Mp_VqTcD_WktlJiQtU8=": "4166737000000", + "RMpclTrGALZxQMjPHaflXZ1G23GS5FUoVmlcGqeoZZo=": "783770000000", + "RMyEBdnPiUS8upevSSTpy02Qmwkehw8pNOUudNuOvmM=": "3863636000000", + "RN80UJse4NjC1GLdsOnMPOJBOEYh8GLlMHEG3gcZKGo=": "1153846000000", + "RNAR2_-ETiZc-p2y6J8ssNvXGPwWh1LP2P7bLV4FSjw=": "2085392000000", + "RNAmFrGQjQgaopmnor49EZxOCr2jlEoS_CpyRVW4_aI=": "378037000000", + "RNHnXgM2cvGvQhyf5-ZOXMz_35xJI83hKq16gY1EM0M=": "999986000000", + "RNXDtiAzapXF0xZYO0E6r54BY4KYif9Eq7w1GptKgiA=": "384233000000", + "RNjlOA5A-Xvjv4AoX7Vljyh2t9yL605zF3v9B8aeQFc=": "3855058000000", + "ROJwh9jZhWczdzUi8buNTEE8-rYLIBeypLFjQm5NrIU=": "407808000000", + "ROV4fP-CXYC0gBI_Og12CTgxHvnOBjgaDY4iV6NFydM=": "666671000000", + "ROg4cETbowbd68i5Hse4-_n6m-cLDmNXfP8XmuAQJHk=": "379260000000", + "RPJ_gKIf2LMjMrC0Stb3SeUPnuUvJOsjxnJ8xdfX5us=": "416408000000", + "RPLtXDKPvmzwEyKL0mpKTB6hmRLFAOlst0osBThwmvg=": "469310000000", + "RPNLpoZUeKhYBYcCoYxleBHDH4l4JeqiqZfjtfNyqdE=": "462846000000", + "RPq3M9LGx3vkvoa-6eUbDtuwdLKf26NtMT87F_GuLXM=": "3845637000000", + "RPqtvfiLpx6IxrqeCCIyEQdsDtCjL_-t95ilS141Tyw=": "454545000000", + "RPv82bG8CxK1TDhchAD8Pnb7lJAx-ExW4f34vqzwKyo=": "1643009000000", + "RPyw-JLyl1UZRJ8PcEDDn_MFE-rXHM5BK8ssogpV0Gc=": "384615000000", + "RQ8KAnTk0pP7U0oulYCaBAXQpvekVZeGQq6DFmlqB3k=": "431630000000", + "RQQOePjT8XS3O0WhO1PLAj6EM4Ueh4f7wl_Yklp79w8=": "385496000000", + "RQcQitHZkvESWDAvSmE1k5AwdtpnD-p7MNwuH5ekqy8=": "495053000000", + "RQgTidj_lXb5sXPKhWjiqLi7uKxVGvGEuLydDA5XmdY=": "3459698000000", + "RQrSaL2fdAGFWQtSg7Y7qNpOwBR_0_904fZtzEEWPS8=": "1363636000000", + "RRBfR8SL4RwGaeBrSa4o-Au8mhys6MjkHhCwCoXVQwk=": "959200000000", + "RRHVD_IWz53HAqP3mTfmA-mm2TrOa3ULXWO7pVjm-9w=": "388825000000", + "RRIvA4iidKkkcDUbeYNRwxcOqVjKqoQktOgkxm3LdlQ=": "1237916000000", + "RRsR9jtJxney0D0c1_uTqic68rUjS1Yqzloqg6JNjRk=": "378325000000", + "RSPWHNtMAG60CIx_91HnZCReldhAtTICgIFq7kjTXjE=": "3144030000000", + "RSR0OD5fUUdNVx-_m1vol6xhEfiMIJU8ZRRdNU3AnUo=": "999999000000", + "RSjfa3YxGCnfUo9Xso-bZW7EgDi9xHcs9kXmxMxLqCg=": "11352035000000", + "RSoyn_030NjutXTQmMUB5aIi_TIZnHwbVjRI_hZug9Y=": "578495000000", + "RTKKqyU1wKIkX05cv14Lbm5IKf2txqGcDa3fWv7ZlT8=": "385506000000", + "RTdl7qoHYIM16o7W8uNvSBVWUmoL05pNXs5CGALDonw=": "1543339000000", + "RTh1IF3ESpyk70RNP_5pCXF6rU58GJV-ZlS5X-XS4Go=": "401923000000", + "RTsaScCdFctd1GeLYkSt8AQsy6N0oCtqUZBdmVIlvEY=": "1310055000000", + "RTvbwfDV6CVilLbqiy3jDKHIvA0ZO_vwus7o4a4B-h0=": "670490000000", + "RUtwEMI4GWM0HQGux-mLA0o4jT6a_A7TmWYZ-L1Uop0=": "386154000000", + "RVDZhMAg9Df96o6ogqwhWNkJaxaqnJPpVwWmL1E17fI=": "381852000000", + "RVFOvMuL9dFesnppvtV-lZ6JXuyukx1YSGmJBd-aMSs=": "1153846000000", + "RVeyWWeN9j_5X-EeekmRS57QgY_rVyPhNioK_FkTEmY=": "19230769000000", + "RVp2y7NL4V6yQYhiJ9BKBcMYIuF7Js-3hpxcxmZHR4g=": "469361000000", + "RW6aDuwvDJ2QNZe01WJCOsgUkhgw8OXoUM-wyIrMT2A=": "2414012000000", + "RXPnST_DoqbKiDXi76noyvzWXavcN2Wpkf3Cxlvn8nA=": "13624735000000", + "RXQq-3GEX0YULoMeHaH5uKWsUXGZHCt6SQAZsZI6eSE=": "408021000000", + "RXZ8wmaw-814GEXOnlhEdJPqOa808hyrdJrXNgTD6lA=": "458262000000", + "RY20OuSE0MVgb_2O3HhkKr0yFJ6lY511xMzEk9-7qkw=": "754137000000", + "RYWisl8nTmCbR-vbwiCyxtUdwHGaIlgR9DGcFVnoKJg=": "829683000000", + "RYoFTFE9H1XPOVxVQXav7a5jaxjq7B0iWcun7wL1H-c=": "379260000000", + "RZ4ioaiyG5nnmFWz6EGomd31THksw_3aURvS5rz9UA0=": "417633000000", + "RZjY9869H3bOCkhwdGh1fAUoEt8eOcZu4PoVOEfpoTU=": "473351000000", + "R_-Hc3xGUmHjd5Zu-SGjQRhPyxOyDzf4Lygi_uMarUI=": "384615000000", + "R_4xV_cY2Pn8kmE1sVlVIwfYhs7EPItPpZPvloWLLkM=": "392307000000", + "R_SqlCRQms_N6fGoHbr8Ey3_Px9cjdnMjgnbrzrYSQM=": "379443000000", + "R_q-pw-cFkhC26EfOFdhaSwO8Gpw_JBcMDW8zy-ulYo=": "2041119000000", + "Ra0WhG4Hq0QHDSHA1RDfC4B6iFrji1ipRXKPIS4X3RI=": "384615000000", + "Ra7Q_m9cMKM7A43iXWhgrMX3wnWJFpanJC1P6Ow21M0=": "2257883000000", + "RaG6Yo_TOkdSki33BOIY6cZsGs25eC9z9nu6uauY6kQ=": "5647260000000", + "RaTka_y8t8E7oH8ED2gz0ZhPCesSrKeykiusDrPhw74=": "832306000000", + "Rad0D8IZDmf4bG4uX0eaj8DGdkx41UapYccm8kfvhFw=": "377899000000", + "RapdSfHgUYf_Eam__LE5_xtybyalh5QmYymNJJfR4tg=": "3076923000000", + "Rb06xDNOGBIquL6g1LHSkoFhuCKIQp_uHpIJvP0wN-0=": "500530000000", + "Rb2mYE_siMM2rfO6YPdPkO-PR6Fjdk0ssx__bwgXSAI=": "1185774000000", + "Rb6ys1Y5lfcYQx7w3In5E8Qnw6DJqPbuXJiSar_yX6I=": "1584441000000", + "Rb7DXtAbKHWgmim0tD-YFoF6FKMQo1N04KWd8_nFeZ8=": "384615000000", + "RbByC4ffGqqUTD5MAh3baSN_Km3EY-rcA-1tKP5QYKw=": "410102000000", + "RbHrP055vtRdLg9v7PF8Oequ8zndYZ82lgUyyrqfvdE=": "452996000000", + "RbLIGtHyJIruk_xA5YMC6nmsFXrzIqfFAe6sBleqcUE=": "4634669000000", + "RbUe6sywrXc3IaQR0I3-ZCRRBiUCxip3ZdoyltW8WkQ=": "8257274000000", + "RbsdxzapnRbPgAehK-fXFc_JnZ9iUQg-Mue_pVSlUKQ=": "463633000000", + "RcQtl_KGRKHL24rQTL_Dg3R-jCCEVWvRKwWGKbO2gis=": "451376000000", + "RcWNGfXW-53buhND1zVOfRVfBYNpUCc_h5mfFhRROb8=": "462594000000", + "Rd1sGPOQRSKwgnT33R7CdesItiPNp_Z1yEpwBZgtNkU=": "384615000000", + "Rd2ex2xCKk1RfxOWEXguL1blkmf6T-yIu6VicwTWhFI=": "1511678000000", + "Rd76ZLURONs7NO7W3fn_fP_N3MkfJ2oEQeoMtTDG_3M=": "445057000000", + "RdHjt4hPq5jNJ6L8usopyvfGYSsxJ8bmN6qBqdFfRDE=": "385506000000", + "RdMTwK6wtxHhFoXbBNa1Nu8BZb7Fj99EiGOk0lUaiTc=": "1163889000000", + "RdNPUxatjU6CEUUJ3Ab00QGJmA4NLtcdagODGKbT9kE=": "539034000000", + "RdtrQqISRtF17EzdYn4TuQk4YXRnqQpdfuY7sh_CyUo=": "389644000000", + "ReD_H-SC3Mx9H2mLxScp57u3DUnMQiGap9QkosF20zw=": "2605189000000", + "ReHsoMsKXJ8alNyKXwUbnmDqOVEFRZsoJAxVZpaxfLE=": "1156527000000", + "ReL8XepsqkIUDmLbH-LWJLE2pRmjgDxwJvlzScfNdn0=": "1249999000000", + "Re_aBcF_zKRDnFPc5peU3RVs7qyYJhk_HrKSj2Q-ZbI=": "752847000000", + "ReetscE98gUhkI2Bqi-DZ0BN2SH9--s2V8RC7p6DMdY=": "2350717000000", + "RekF8Vy6NuXCBKY4PgDkjcz2oMYL7rUUiuxkGTK5kIM=": "458787000000", + "Rf5bFvvk-rRmAZ8CTwJ4eOVUF7M_B7-ADPTSyvTPT-Y=": "577489000000", + "RfFBBZ3WoRCFDRbFtFDPtHpWYw-kP06oc2ODN_5u89s=": "405544000000", + "RfzKoLEss7NsoSp7blMj-IxSKmfEw5OAmUPEgtX1HGM=": "448013000000", + "RgctIXF6pbMYHedHE7Jb9L5tb3daOdfFaYo-S_SSb-4=": "376209000000", + "RgvHJSKSdJt5NIysfnH6mYIL3X-xAYtflL6PnL60z9A=": "1666692000000", + "RhLJfig-9d5jREzeSROLtjbThmZ308Xc80zO0edvCQ0=": "457092000000", + "RhOWPqNFIXc3ZvMr1EzFIeFRqEH3rNpT1hKrjBrk34E=": "1212374000000", + "RhflQZWPyXAr8PoNZWhVzA9rvcySdlfCX4VrgO_FfNw=": "7065697000000", + "RhzHxwZ4LTwmhmBv1Ltmymv5Zb3ww3oT8VZ3LmgkFUw=": "482159000000", + "Ri2H7o7mWBNlbMvGSBujk_GiVnN9B_EcU6vpzoIqHQ8=": "606718000000", + "RiJV_Ri3hjgvxIZab_D8id6k4Th5B1sozBw86kCMpZw=": "379702000000", + "RiP0pGY2mqYHPuTECu6m_dKWbbgkaEEZx3eQeh8Ehzo=": "379928000000", + "RioaiSsAsD2aGSXsSQfSiQg4QJoOTzuxUuuY0n_3hYU=": "416657000000", + "Rj1O9VOHtly7fRl0PlYCkihIB7Y_mDTex4Nf-SdLKc8=": "3543821000000", + "Rj2bSF-jhPQhW_eV6MLVoWsk7nMdiatBo_bxj5831vo=": "7625356000000", + "Rj2kmbZF4cDxQmxMMM2C4W8c6JHgPW64PTSYcd5v37I=": "4166666000000", + "RjL4n2gzFPOShVj8WPo0nLgeq8J4bNHjRN0lnzQKlO4=": "423370000000", + "RjaWt1K8bm9-1ttjHgpG8WL7fzI4wDz-_X-wwtC38lE=": "2082051000000", + "RjgjGHFw82TX1Cm_as1XACdAWunzo3yNmBPtI0Ix0E4=": "944707000000", + "Rk9V-KHNTgzF9t9ey78YygRWSaOw2dXn2fM8Pg5BYqI=": "762594000000", + "RlEVK_D5Z5AWMzMQgmnoaOfkYoA7IEAhjur_Gkgeouo=": "1156527000000", + "RlOJ_umS_23zyf_YduPSBgrgMUk8VhJqVj5-aX3B-gY=": "383839000000", + "RmF_pRNqbXindukl3i8ktWgFFC8gOkq9FgANFLCTcbM=": "382643000000", + "RmOEi4ARK2X_ofIWMLPFfYG7hJoFGcsCy-RisCR6wkc=": "1666666000000", + "Rmx5zW5gKHuFYmLxVi_v2yMMv57aH64hWxnR0Dl-yW4=": "421678000000", + "RnMLu0MhMmaY0KS4iy1Alq0o14tTNJGRikMvnsXiXbY=": "384615000000", + "Rnee0-3CE6HAKDqJ8Ur6bmiKugziVXQKFclNgDgByVQ=": "1539800000000", + "RnivcSQhSLtBSNvhWxFv-0pLspVTZ2-bajzCfwFCmts=": "424045000000", + "RnoWvXAEPyiBERlGefrci0yWg6yYlgncLriQ0q5S0l8=": "747774000000", + "RnvxL-Kqh-02qCBJySOGBhB1EwcpIAHylVp8kjcp10Y=": "385510000000", + "RoGY2Vtim5FmalS3GD2omk-fiysQ0DCceSVNDEiy4uk=": "993700000000", + "RoeN3VL5hQbWOTS7AsXdTvlaimDo3vhqeIQSBlET1d8=": "1153846000000", + "RouKHhuhMAAYqHVWnjinG2fdXWprRYGAshwHN-12PgE=": "468799000000", + "RovkpzQs0RHLvPeFO-z-oqBqSAxOQs27-3oXMMx9Qqo=": "833333000000", + "RoyoAii5q6eCTbaHFlXqAefeKFugzcRE93HzMT5kZaQ=": "461263000000", + "RpVIrsjoYqEdC5fftF4Bl1e9vkKXQl7kYx02oAmeeVo=": "1639193000000", + "RpYPCivbDBbLrRh_2gdUUprArZwXf494SnyL-xUMquM=": "938936000000", + "Rq-_oWBkh0v6hF5NsWZTcWWg4IiuUrIVbFZMs46iO-Q=": "380694000000", + "RqPvQj1iRG_-i3n8inxmMclgOTpWkxX2L_GxdMmfFV4=": "7536094000000", + "Rqs2pYrFAF-ONthWPfZP-UqiKnCRmQWs16Is8enAQ2k=": "462769000000", + "RqvHRqwBUTXjBGh53W6t-n612A1Abb23oKI5hAaoQN4=": "469721000000", + "Rr5UXe9oUxlBPJy0NNWOXONgpFSlaPp6QUOR7hzT94M=": "499644000000", + "RrGoycfE5_P7u62cH1gpDlzI79P20vcoOy5fOgvT6mw=": "13196957000000", + "RrdcIkNTgtYmWPb1MyfbC_2RLi1aMyzKbZsUsEmeAmg=": "1527107000000", + "Rs1J-epOza3DhOr5oB0HJpOi5Xplydx8mDnmIHV4kDA=": "6822094000000", + "RsAkswTLv3T54SGQhNB7vcwlZLYBilrCYW1TrQClnts=": "576923000000", + "RsQDUCY2aerROmcGfWxxzBBlMKGBowlN7AjL3WzQZ_g=": "3333794000000", + "RsTiykkSizS-qD1WPscFXEYps95J8dJxH69FIiMGe1w=": "1711414000000", + "RsdSRYy8KV2PHAdznF1J9MTmbDbL_yWkjzN5L0_SDfE=": "388741000000", + "RsmTymC-PcpeB2izyzairYt128ZTwW_880jSbicqzS8=": "2960992000000", + "Rss3yu3cZRVdSrIHhZ7xgIZ8B3KJ0Xg29i__8zBGdKg=": "416666000000", + "RssPoLVzCY_gr_k_JaIXqCfIuKA_VOhsQVTQGgUsd2Y=": "5499999000000", + "RsxJcaQ8vowTR3zNP4z1JixWQ5qAWrWZODN6cXE2cLw=": "413918000000", + "RszrD-YPuyJnZT_DvVvtpbcIMRTBjz7sabNSyYH8D7s=": "625607000000", + "RtGJEvaOct-buKYzsEZuRluu1-X0wBH_GZ05ek_5L6c=": "2116852000000", + "RtrB9B5onQUIqf8ajPY8p3mHnD19eFXfwsxy5oycA7g=": "451665000000", + "RuGOFuW74HyH1BtqIfUIjEbBX5dU3TzIvt_aPY0fQJ0=": "1959542000000", + "RuSb0mdnO4o9LnHEwxRqe-8Cv9JXHW8DJ9NaSvLZKEA=": "9583333000000", + "RuXMmac5l2VmM7tgtgcSkTeKjHJ3_1_BGKdOzG5T8_Q=": "1249996000000", + "RuZIg_sxUzRNPMkbxJjxeULZXQJHVgI361sGi70FJYQ=": "1153846000000", + "RufdE3AJ6ewWBZK1m6ZZYVmGgx86xuOigo01J-Ckut8=": "1503082000000", + "RukMNPnnjJzfuQEFOlqdYPAbiRQUq1NVq0N3Gv-qj64=": "2884615000000", + "Rv-LWuTGui7RE0xM43kxGxGeTIZgzrc2CYIBfUmrAwo=": "769875000000", + "Rv2Jf-Xo1WSMjJHNkgBqdP4Y6ZmMKItkMoTjTVY-NXc=": "691282000000", + "RvBHUmuoFa4Po3LJ9Zr-_IN-35qIiWusJCf8meCO5AE=": "1181818000000", + "RvN9yBrewC6Y7Bzo6ja9UMNSzXVxEQJgDcCUk-P69q8=": "3846303000000", + "RvRU4sNYlwJygSeK-RQk1qSg6CSNRoZyLtbE4Lt87K0=": "2119079000000", + "Rw5rwjd1fMCzRSVgFbujcpjWgny7lMliKNsHjU0xYfk=": "416666000000", + "RwI_kryXneCZNjXxSoL2IUe8jPbtIRV_AQQT96Zy54E=": "419896000000", + "RwLfj__6ql_RIWZFi43jXDYxxOAJEbZvO-DLvJEVaXU=": "384102000000", + "RwbLFeYEYlkPT5BZvzhswT7XHtTIDdJHuaqBabkZvsc=": "384857000000", + "RwswrX5XxHszWr0MTjoRFoiCtktKSGFTr1BnWw1ODqo=": "903215000000", + "RxZd18W1w9Gam_JYe0zuRMBGQ1e-ijrefePL7wVVtGo=": "1717960000000", + "RxnZiMwU24q-4GroJYEg-asN3Gzp7akLjDRiQ64csIY=": "3170756000000", + "Ry2PXqTXExSlh2aiAsRjgBOPt_tzF0bGhu2T7UuGzJo=": "536051000000", + "Ry6NILQbeV1Ziwx_YZgGstU_jMyTADnMWmiQXQlRo3c=": "576923000000", + "Ryjm9ll4vQ6r1IOixFlHEqxM5sKK7CpnwS6zhKElJKc=": "925700000000", + "RzhoXMjaW-y6vobjiuBRWnHOoBzqyROimQI7fvUky0g=": "18718945000000", + "S-8L1PXUbIpJMDnaCCcWeTb0b0nAtENWhJoJpdBJnCA=": "416457000000", + "S-OBsqPqwYJr-SeOmc3FLwtNKvFVfGTP0utILPfLenE=": "384968000000", + "S-b0ln2XSoDYqNrjEjMEncxc9fxnBRJmomimWAClmQc=": "1498023000000", + "S-ctmChWWZH7s1aFvfwPs3dI3s0EF34XgwOMOecWvJ0=": "1909351000000", + "S-nCVegj54OvunNHLqEiqVhCN3jg5VEiCDR_fYFmYWU=": "1323257000000", + "S0NYnasj9Km8ZWo-lQobQKDoBl1_kCzqqkzznXnVCj4=": "451587000000", + "S1mapzX78qDWpWbwLm-QwrW4vNwsZMfLIZB2ivPQiKk=": "455947000000", + "S2e31-TG8nmVr5ZoaVj3SYNJf820_65zuNimIjnvsF4=": "1158159000000", + "S393a0OGNnJw3fIPWvAoXXOmd_oz9Xgqgq8JyqVmL4s=": "446307000000", + "S3PGGF9wjEtpxmGznM0prK7-JchLP0B0a86k7XSv6pk=": "379928000000", + "S3uhluGDYt-iaNUR4B1s9ERCqO0SEkCMHTut5s3b6wA=": "454545000000", + "S4QjXJzUsK20c9a2Ew_hYZSKuGCpHUNaxYQor18CdkY=": "1284422000000", + "S4uyB2TyV9KgF05k6-RrA-YaNhv1M5IlKt375hc2nYM=": "461582000000", + "S5-MD8Gk7uWe0pT54D-bSXvFkyhryuPydJfXpSlo_rE=": "1693339000000", + "S5DQf4wevKGviZEnif31QkO-xitBmIqV_6ygw_NP65c=": "11418556000000", + "S5IMApUqxFFWe2vAtozrtxzPZ-twRZ0zp7oqn8mAA4w=": "379554000000", + "S5Vb9b3vKom2xknBrN3nao-7dzLufJa5R6-XrorY6UQ=": "384615000000", + "S5rV8X5X9aD55JMFd_ldYf99AIsI3x-GqT_D2vUGDfs=": "416666000000", + "S5wcU5oeYlaubR5hsNRJA3McledQFpcYxJqgE3dG1Es=": "4164620000000", + "S6Vg9-JBfWgwXR6SdA3zt7bg_m4QxPuEcbyxAXeNdgo=": "1158173000000", + "S6_g4Yv6J-Lg-8VAfP-1V8Arznj7A2OCm-jvuD0ENtc=": "422920000000", + "S6kGClNFdu67yEBj2ZMOkDBihDTeVzmXNTk768bVieY=": "469479000000", + "S6v8tfvgxKJZWZUDcOkS_af5f6p6U8NRjMNzTM5Z3zw=": "385592000000", + "S7UnLPeGqFUbck5Hk1nQOH_00u6gSs13l5uXFyE9-c4=": "416666000000", + "S7a57lXdLuTq4rhbK4Nh93DYzclVPazTECWdXftMLhE=": "491921000000", + "S7kroOl2lSo2LAK-RstGHDkOCmYtALwTfur9Nsu-NAs=": "381955000000", + "S8kcZZ09nZkIf8DSZ-lRpH1I5hOwMJzXGk0-1CFO8xo=": "3855061000000", + "S8lISPtZUenif-6E5xChIiyAAh7VIL7TXtk6-0wdlFQ=": "1249999000000", + "S8znTlj_h02nhtDPfZxDNlP_4_UxzoDBxJC8BttLvug=": "425047000000", + "S9LypbwfTzDGE4rnkxb8xj45NA1D-S1_UzeoBItXPN0=": "503635000000", + "S9SY2fDCGLqZFhUOSJn8Jyqk7LfvpMyAbnPS6OAkCno=": "1923076000000", + "SAXjDcOkhLJrkKuSTSHUHaF5387H6_ej_AC3hc8kQpc=": "969731000000", + "SAgAMaQ_cq3-PPDNGeWxF0uAh6-53tsajH-3mEyNVFM=": "478235000000", + "SBM-RLMf5PN0fRpzwvPhh-mOEsCjU_C2Rosp73M2f60=": "382444000000", + "SBUxk8f7HaG020NLVwcQJzfyVG81_YqtLf-mdEFfwwM=": "2278000000000", + "SBjiV20yNJqleUrFkIlNpSmx4_EqixgvIrnRKHK9xQo=": "1153846000000", + "SBqR-8sWAffqxlyVn2ND45ypdyvk9ysjpcOB0tYUpC8=": "384615000000", + "SBxfzo-iktlmLhF3qr2uTA2_bw6Q0lL0zJBCBrVSC-Y=": "417630000000", + "SBzlA4EJMogJvaayTxysWUMjmO4hg3SfEBejG8CUrGQ=": "385506000000", + "SC1oxoONFJSzCQYkKV5D666MDmZYs4qLFED2NGCBycs=": "412863000000", + "SC9Lrqxp0dXf4OlYqDsd5orz16SXUC109cTMV0f4ZjI=": "1154301000000", + "SCdK2teYxBZXcliZd5SQv0bPqQwVZplpbTAr5qrjTOY=": "454545000000", + "SCjdOpt78eYMTiieDb9OVV_wO-fRxYaFRtOYHGWexNQ=": "590909000000", + "SD0owfmmxevzusPGDawnxx_tbxLSbgUUqW1YZS3hsQE=": "2316575000000", + "SD3y8p7ZTdZ59Pt1o_4JmwlVT4rvJnuQx2a-8Kji4tM=": "365288000000", + "SEHATOIcLlWQ-W-Kba496bh-ue-zsShVbC52LxK11MU=": "499999000000", + "SEOa_dJRei7xoWzEXLHvyKw49ah3rr9E__ZaFhbmvlg=": "381635000000", + "SETH13KQPyJp4h35dERESTbNoYufij7dbJVg-DQywDY=": "419771000000", + "SEUw2pZquBv0KTSAF43t65FDrCZUHwFu8_P2x_2vNXU=": "1153557000000", + "SEd2zKqyjB5nRohWThJFVtQRgZA4cePL-7FswdR7swY=": "462622000000", + "SEiUwPNDayWIT7SDYlSlENKe7yuzkVpXtiL_fTQTNYc=": "384615000000", + "SEnPusaX8C0jMMnkziYiY1VyYCR1_T3HakNjyGpvZ1E=": "1231084000000", + "SEzouXQPvB2c-V3s462B7zAgZy6RhVgTl_4LxzLKg-s=": "771545000000", + "SF6ApVoTClkO33Lo4BCgDuMqQX_YpNqeWLBTHr2xfAY=": "1224063000000", + "SF7SFjV0nwi5S1UvlTUmGLaj5tuNsrEc9RR-0OlgbQg=": "385161000000", + "SFhzQEHE7gJB7hEGWtPiJmF0EFCRsCkmzL58MaCI8eA=": "384615000000", + "SFobBn4yJaSao9oXuoSFlS9fkf5gNGkGq9IVzmH7Nv0=": "814467000000", + "SGOs54WsWRwJtvWFwklQq-bzMfmORAVtzrvYN1dxNfI=": "416901000000", + "SGPpL5FG2hauNp82w0xSOojlG6brxXXiPK4ZIhcyW_E=": "7574320000000", + "SHXT7cfSXtZCZEhz7fO1aeZZyDY63RXsbvjamsw-LMQ=": "377647000000", + "SHdDfl35Au4dEbNs6o0sGAKKtjh45lHkm-cwBRkfbL4=": "1854250000000", + "SId9smuIQ7AyKVaTMz7K3ybfEQtqJpToyxxXSq1uvZA=": "384615000000", + "SIhoDS28UhzZKw4_S7KVJzSehWxw1n5Gfpov8xtatCE=": "488631000000", + "SIu6xYAFzc16O_uwbcmZycNmfASh8p7dOZQFzUGt08Y=": "416666000000", + "SIxO749JZa-aBP4Jo8It99mOdVo-vCfuF97teSfsSUs=": "388630000000", + "SJ-2LwFq2l6CAn9cM9icmC4S7hxgDKyYHQ4iZh1COcg=": "825727000000", + "SJB7jDsJx38JSZ8YwziMzvfyI9wIaOPHQOFUfqPf8V8=": "2378394000000", + "SJC2dPFeEi6nQc75AUUvSN6_Ta5ISSmEP2EXWKjzw_k=": "1538461000000", + "SJqAzlttrAsVafVCfPIePD5oRAH7Fw8CrdCSweTrEMM=": "551784000000", + "SKGxvqEjIqb7BdOAKvAXYzzKaeShZNdVmbeFO4yYjoA=": "3855075000000", + "SKMww6YDcCiHCPa2RG6_GuFHaRQpOjZOocTM5jt_URY=": "453003000000", + "SKRcrEI7Jrm6fzRNgdXNtYaEgpcslAsKNzwaE5sHVvs=": "416375000000", + "SK_UTdJKo0pFm2A_2mpDoLT87DpZoRyua4XDZ28HTtc=": "454770000000", + "SKy0F1SOKivWOYVZD8WdiuBDg6lWT_qb1G28WaR6jl8=": "384615000000", + "SL3Dkg_QYbNOOmK1d33quOU8ZsAvKONMTgg96BOnKIw=": "527355000000", + "SL5q3i8TLQ9OT1tefkExSyoMsu9q4cRVJVhdwQDVF3s=": "2033473000000", + "SLY6corUjrPSoFzuFyvXhieKcVvOlpqM_Q0RaFve9Yc=": "19999999000000", + "SLpCdY8c0USC1y6SZhCSKb8Njy4uqMXzMCJxAIBX6EI=": "811241000000", + "SMTYHonmJFd2C7sG9uHwWKMRJWM47_nfhBPPH6tcftA=": "384615000000", + "SN48CL0ipLJqj9t90gQybMrgR7vWe6_lLUONcRgnzI8=": "393135000000", + "SNYxdl27Jd9DCLjmOeMDs2ChYeUIkTKcbX56Zj62jPg=": "413102000000", + "SNvPyFixXJJtl9UVOFrP-ifA6JoW78-40omR4fdjoyk=": "8333333000000", + "SO1I3m1TiUHXe-_Yvd64ufBhNUq9IBd_ZFnz2lAdUGg=": "2308247000000", + "SOHQrdasUfV_CLtFFuBhGFdKuvqa3SMkI-mGrZUpqlk=": "5346066000000", + "SOHpfNNM6QsH9JzX2VZcIIMCf-7O5ezUEvuGu7Y3ux4=": "833333000000", + "SON44kwXMFMiLvSPKGAWo8u6EeKoE7MPQc_t7fqMOMI=": "464615000000", + "SOYPO1TPUVgwuqom6eL8vQlev9bFIoaRz2kR3YPYK_I=": "974999000000", + "SOf2eJHZUL1FBM9QUifY2fpGijHkApxdFsTl6OQPMl8=": "914995000000", + "SP2kFP4-e72opfe8Ti3Ie2NFBPItFyvPKZrffdDHM6U=": "576923000000", + "SP_HXqzVpLe9KCwKzNEm2ORpttLqiNp081qj_o3NyT8=": "2083506000000", + "SQ2WyXc3nt7cmNf_H_Yro-JCMffedmQzT8PZMmuEnEg=": "2055429000000", + "SQPu_2ragxI0cBb7OufRVhVr6RDWzi_lwN_anZadYww=": "769228000000", + "SQrbNnwV8KGCH6w1-nYJ1nrWZ2Z4LI6ai5Sivli702M=": "1795352000000", + "SR0Erq_-YcXCUuFSnMdutB8oIXiwbTnkee7DNtvmycc=": "470660000000", + "SR5i5Pgxq9WBi5t_B5WuJa7EyF9Jz5nlQHDwAEZsrlM=": "381968000000", + "SR8iFaucpV_t8E4ARPlMgc5CSQCXRBbqPEmLTNa5SHA=": "1601188000000", + "SRBkRxAhzUMEYBQor6L_p3rABJRhmLoHmx-vSTGtngc=": "2468422000000", + "SRC9_K8LXqftMPub2HTh8QDgeCD8Hvup2bBXf7vxL3U=": "1666666000000", + "SREOCLByEbRy1cjYFw_4ziu186YKXO41mFiDElbQ_os=": "378341000000", + "SRdgxucTP6JAr-Bn5Xq1LB-OjQvngLhjk4U8TNi-nd4=": "481965000000", + "SRirPGAzVM0pXreoA-kQpcWkKuyocCohmARBn4QF5js=": "390715000000", + "SS10fhh5bCIJbZOlmP5d5H-9fSF-7KRxYgot_yXRewk=": "2786400000000", + "SS5gMDXm82dGbPvthoZuWjiyKb9uBEmOkYbtMOs4wF8=": "442614000000", + "SSE-5jIia0sCkh4V_69CalNJ42VLslB_5J1LiOVhNK4=": "468609000000", + "STHkhYrq9FHhtzxj8sPnQcs9a_8_Wiw2TZ1bVBI-LEI=": "407808000000", + "STzoWvvrxuo1YagYNJyl08hC7vpzpIy3S6YUAnXKh88=": "381162000000", + "SULtXteObtvWcoKFhFnuWW4HkYtfMLML3d8QJpBMR04=": "455600000000", + "SV1IAsDeRDjAHLweK8aPkUbkgGLCeeEq_maCwas1INw=": "1005398000000", + "SVDTSsAarkvqtoE4upotH-awC2mSvUvzK4nVEnMRFBo=": "1156522000000", + "SVcOS4WfLRX-G0fYScTovPhtZ78exuuB6gocA4oTIqc=": "462947000000", + "SW26NqH0kxmAL7zkkz1uesoPCNqmQfcaHkVO7AigO8Q=": "380017000000", + "SWLSQA3jjs-r2EJIPJm-6F1P4BzawyeBgouK_LCiiU8=": "11538461000000", + "SWd7STwuDbOjYL615DCrWLeBa-qDbvAZCbGwCeWPlSA=": "383845000000", + "SWp98e4XlBuoMGdB7DJxJFCrRa5QgTtMT0TtEjYcK0Y=": "1157114000000", + "SWrwEh9DoH1dx13JwU-PfOukIfceV8sSo6qn-38-ngE=": "769230000000", + "SWtfXDEGBJIzDA_32DQ8C3J1ruAHsufWN_T7nOBHTRs=": "541666000000", + "SWwBciGhBrr-XGNeAl-8VUeEg31tNpys_f_NG2eXJ_Y=": "708786000000", + "SXDSIu-cOXldDYcYkC_pTUKCjV9GJQG2M57lOno1X0Q=": "411085000000", + "SXF68KE9J6wz6pEnYC_QNO0RDpu431pfPL92RaZPP_E=": "454545000000", + "SXXyMvm1WYC20SA_WE_6IH2Iq6RewLljh0PSAFJ037I=": "465500000000", + "SXaSbUDB7y2RKrpAOIrjnDoE7pXvbYwfe5Sax9tFoVs=": "376126000000", + "SXgyNvX6A2O0Lkl6fQ_MAReNemKJ2oMgVkOa-4syNgg=": "2682599000000", + "SXkHZzKDXEVKqwZgHqWBCdEcvSofje3sCj586r_cIRg=": "381436000000", + "SXqKaW8pG5_31LTs_b6CuVoxntEZJf7TB4lLOqgrhc0=": "916791000000", + "SXscA6SWWN16z1ajEftH_onMjXecSLVcH_CPez4IHng=": "457143000000", + "SYHmw0Vus5LmajHBjst_iNQIlO5rLX8tWjY676N3Zpc=": "394450000000", + "SYHomSsFJYORA3Doe8kL7oArDaMm6S3S4Xoda7WL-mI=": "4999999000000", + "SYLUbxj0XyzE84Ry8QkUwFw7gJtr4DP9DU6X_6VdzvU=": "4166666000000", + "SZycf1ci5wco64o3nB2isB9lmp4L5-8KCiLosN_mFv8=": "3818029000000", + "S_-f6kkMSd5Tsy3u39S7c_VkHqhVcwP3Qn8wqcPAG64=": "383038000000", + "S_F35fMJv8zJF7TUMf8GnO-1gJZFpuSW5S92_QqA1-k=": "462146000000", + "S__-79RLU7aloCum87ZSiBsiq9o1SaXRnN7LNGHRApw=": "9090909000000", + "S_cba5gwft68yQu98gcpYy3Cg8FU8lajR063mVwFqME=": "763604000000", + "S_s7hDCHRG5EhWJMs87RKfUSBofBIzKva0Bkn1CkLTI=": "763454000000", + "Sa92SIGl9mOxs-SZl9mfhs8rMDoMd4E_qVbUpaGxyvw=": "412863000000", + "SaOJHqgoZb3pll5C7-ruO9ftLRuJl5_i5AQ-EkORPJ0=": "1923901000000", + "SaeiUO9q_hjeyzvqfj3gfIxyMNl7t2CMWvItV5OPOrg=": "4851270000000", + "Sb2zVSy-0_wBIUNm54SYeNnwKq9M9aurNeqsbuSfv5Y=": "393613000000", + "Sb83wwAp5A6-Qr-6PhBVmroaJkc0CGMy9ThvgYekrm0=": "919641000000", + "SbTe4S3AatRavUOVdwG3SoJuA-PaDe9Kc7xlVeI7G2M=": "384615000000", + "SbekJnuNShOJfnOnS-ejFBqupUm0ykP0L-NstcPNk5s=": "390817000000", + "Sbg4XPXO-4YS5KOmSoB8WQMbgcebEZP1QZ3ZmJ5bTBc=": "384615000000", + "Sc3LamjzwO1kWIpVf4CsoTnqfqLMB947wOHfySk3Www=": "30394289000000", + "ScStA8bWjUMePmgUxO-sMm0IvCxtikFJikoJt798VIk=": "7787692000000", + "ScqyvCJrJPae9fxxM4Xm1C_VqR2nOTdg5-5Lq9Ijxb8=": "488979000000", + "SdHFcEoCVXWfOw_N4hw4hKoeLwuX9pjcqdQDPVbGKI0=": "384615000000", + "Sdhw3we1EJxMSCwrsjOmU5ztca-fYB948Gvvvpjh1mc=": "563425000000", + "SdrMM3ZPE57n0GVxLwz6UzL6BHMlJNekzjVFqP3e2Qk=": "461318000000", + "Se2DDiWNR5fccPu1Vc21rgct6EKpnPT8LEk8cvgZBTU=": "508044000000", + "Se2V4LLEeMfBe6eoJTKCW7mh7Tjd8NN2gZZx5byd0bs=": "763672000000", + "SeEsx_A96SibtdbFRuHsJkHh3-d1_0D7mzJTtpl6wNM=": "413291000000", + "Seke0F479gO1Qqlpv22BA_iYDbZsJTnBvd3SBCKmKVU=": "464240000000", + "SepAee8641SionvN0XI08zchn01ZnvUsbxsepHz3Olc=": "385211000000", + "SezutLfrz8UpYlK6TZFvh169w_H-HKTSEB1OZylc2LU=": "3672319000000", + "SfCawiPd7qQ4FeathOoGkc1LzGNk6p9PkUphwRb3Hn4=": "1156522000000", + "SfQ5IsI_Xf_U-IwOIbWcRXIZIupqpdF4YbrmXluhbsU=": "459754000000", + "SfWrraXfCzZ03fiULK6Yso3xW-sTSbObRbaFH6TKLs4=": "2333242000000", + "Sfbp9zRqC7UAnnPV_XXYmcjJwo_5A0xW4Rsd1uTPLyo=": "374871000000", + "SfyDGxT8Z8Wo8ppt1YNf9PWawabzyukN3wpnlT7YIS0=": "8081479000000", + "Sg53UUTuq19VxtmcG2uFJPE4fKFPTXt1w6mdrKxYa0s=": "424835000000", + "Sg6Xn-96TqDHmlK_9YGJrdYElrZo5itfQv3K8vIh-9c=": "1884682000000", + "SgBQTwwO7aS5isf8I3SOnaNu20QyZeUGR32N7Em2Dec=": "993351000000", + "SgbuNV8naRT-Ja-B8Hrudnl80xxGDnt7qhgrza0MP0c=": "924915000000", + "ShG4B424QcVFj2CHh-nVrxUhsPczPxEwf4F5HfHddJM=": "1153908000000", + "ShOSZgKko_L8jvMjqzpAg5dPnY16IyhgsaXm5_bZiTY=": "769273000000", + "ShrydpxpKv3f_rwf5AgG0Ju9DkCJUt6MPgiUqWXw2PY=": "411085000000", + "Si2527JIqNY5eTX7duExg_SR_PH_aIWzSJCyf_U3hYI=": "422143000000", + "SiFTk2ajpV_bsFq4euExsSeeOcIWscJENFBVSorFen4=": "384610000000", + "SiJ7j2N8DKg2_lu_1KjsnHE40eK2OteWBCrdBhcX_aw=": "1375988000000", + "SieioJVAE4o_vtUeVnH9tjbjT5t3JhRziTKLeN5ALSs=": "1997119000000", + "Siq0b_ueIzkBlD1MsXL_n-4kJeP4vCjtpfmPk6_KoM0=": "1869521000000", + "SiqWeLmhbxJ6MpEW0rxtGF31E_Ld5QoOX8kpcEWRA8E=": "384615000000", + "Sj-7Vj4ALX82fHot2mXy3hXbYy8Yk1xJAZcZlBtv6UE=": "462944000000", + "SjcoeXgFQtll96fk3sNIJELZ3KI5OIXGMWdS0O-cUlc=": "566195000000", + "SkHmbI235hA-ICOpTDlC9ru1Z2PB3jQNXwEkACOJ-7w=": "411851000000", + "SkN-Bd3Y1M3YrpOj57YRdX0Mqyrznbp-PSPmxO8t7f8=": "379290000000", + "SkWrNTHRcsZ67JYvK7S4dKoZ8Z7tXNJ7QBlaZhjrxqs=": "471779000000", + "Skjmx8LCVfbDVtNLf-YKxhbepeZwHmGb464OJkE20oI=": "3223241000000", + "SkycvWDyhCVhkzN58gJI6LavUxGigf57Ilani1UlewA=": "766939000000", + "SkzsuupgYLnQRBVVBBZTQLB0kh5ra8tI3qinFKyfMQA=": "1389046000000", + "Sl2KaiqxnwXIKw1069iDBq0NwOb2oGEyzOW_Lk4xhIc=": "384618000000", + "SlLRKTsXpgewimE9Xvbyli8F4Rxz1mPy-u512kSQkMU=": "384615000000", + "SlLbV2j8bT5bBa1oZDb9MiVinF8abVpOXqNNRvg3Os0=": "385507000000", + "Sm2fFY0HS6H2SXxbbnJ7fVgR2b6ooD7esg2hwE-jPDE=": "392518000000", + "Smehw-zt0u8MYX21SyFhiO5iYyb679ZwKA6sl7wkfos=": "425047000000", + "Smn6skFXLIDt46iAPtNR2kl_UsjUTUsut_soeJhmhaI=": "834385000000", + "SnSgYUpzYrO9dwSOL2-sj8x52fT-ImHEYwrJXuGbFiU=": "654571000000", + "SnoeSLatwZJBLSwpBEesKgwMfeblVXb330EKL3XRK2Y=": "385510000000", + "SnxmDLuDGgsgWujR_SjiAg9smMshJniER495YiBYB7E=": "406044000000", + "SoFBh6PZKBmmJiZciGNiVL6wTY9yiDj3YwVAlU8V7-4=": "1730769000000", + "Sp0PnnbLZfx0ZRKEsJVkHOPoGQhLy7OnYNJjMS_VAZU=": "4035050000000", + "SpW_3VHHQk_Xw2JJdjpTdYtqG8faLLpMpzbSKYxUADo=": "451831000000", + "SpjFLgObPsf6rCVAm6S5hTCg8RGceJAuSQO5dgiBgL4=": "3867538000000", + "SpsuY6TqqBLNQM5x9EfqDHfI4r9GcKF-jcc45_IQloQ=": "2272727000000", + "Spv5nIIn-mNYMg5Rw2GR6n9BzDYjd3DXBhjy-gEs9Hg=": "1627125000000", + "SpxPtjF3n2G6_Z5Sup1aGJwqGVfVtOhXvUsJuCc_gYc=": "407530000000", + "Sq6xbDK1t9W5yqac3gBig95P3eidhQyMhRDHxjcYbsM=": "384615000000", + "Sq8Czmgadg9TBfTHn8Yru3853Z1DQOgdvP8X9KaqBVw=": "400371000000", + "Sqk-Or1dD4h7LwKoqnTOwyxcj9Blkss3IvSC-ImC7jI=": "1810402000000", + "Sr-P56tYWzjhQz5EEmBTPSAxaJl6_llUWLUftnftDuc=": "420060000000", + "Sr0y4S9hQwQAsOLv4OrJkHexM71WDYusHJIf_b7EwMs=": "412607000000", + "Sr3XoShMXuwEfD_Nrm955quW-h6oJl8wzSnsEIjxRyw=": "385506000000", + "SrUCxZU9nLBPgoVVzyuPaLyunRyXVdPRRLJas6WJ7wQ=": "419891000000", + "SsTCC-xPJaZKkgN6DOijdJ3y0fdtv4PIIh57qwrCmcw=": "1818668000000", + "SscR14U68T8frSf5cGBTyWp7cF-PzFzt_Y5sQqXjCV4=": "2022393000000", + "SslGIXxY_9YIZXLK-KmqFcII8WuZ0bYB7bVe0LA0olI=": "385509000000", + "SsmbXRaDrIora4SgAuwwYs71FmXL-j1v9wzZ_iz9j0s=": "383803000000", + "St9Vp20fdYQf9uzwg-AaUFNayxSvRMadYo9A5dgSt1o=": "2349530000000", + "StZc6SjtEb0p_SjAM_62BBzsTDPaDsyjq83ZWoS0-5E=": "382394000000", + "StjNAmV6SccOqX_OGTqckFXY460fXGIfd8d8qMDMMMo=": "538461000000", + "SuAUuPih7_3v6YTs-3an2WtmplZ8oD87rBRR7YeHeKU=": "788465000000", + "SuL30-reb-Dma5b_CBqeuCpRecp1nKUHw_j0I9DdBiA=": "454545000000", + "SuMBkqF86MAbJHC7X48gEw7Uh8QyF5RnANZKCxa1ZIY=": "384615000000", + "SuUjFg21Ew-nDaJYEV_8ab0UzhwkOalAT1OZXzaSuOE=": "748973000000", + "SuqQIuXRFURBlVC80_-qgwxz86QjAAF1TJK2Cv8Sqoo=": "3068830000000", + "SuzzCotbNN7Bp8_qaruKWA2iBtBn91GrH_zbazvacjI=": "437313000000", + "Sv5xcRKGb42zFdWeEET2tnKydrstnV7WdJn0zqylU9E=": "2070658000000", + "SvCzuh95gKFmG3rYfzbop5qA3LA44T2LK2_Eg9vM84o=": "469837000000", + "SvDQuSfXjderGAlemeTLXVkYqsdRs4IIWJaasjdom_Y=": "891648000000", + "SvniVKHvZ9tEv3QcbqeEj1gWu2nxyWx0RToQBh6Jpjk=": "384615000000", + "Swhbu3vYHsLS2OaCAz4OTQTFtTe9I49JWiMsV6WzrSU=": "1954356000000", + "Sx97Qfv3FGJc8TqCTymtPhAraiTAqW9OfAVP029JYDU=": "463511000000", + "SxZ-J-zDwdxOipY5Vwaq7NmNU_bzEhoz980cyk5H9kw=": "384768000000", + "SxmIBE95wG1goT4t9VuEecGkaOL64R5H8vSWcfjnnd8=": "384615000000", + "SxstyLEeun2n1YZtUjpqzjV0RZ1BL2MDTo9upiTh_38=": "5206939000000", + "Syi594y-C61133g-JPdczOmV5KE8k4pCqvLin4-9nLY=": "377692000000", + "SzDsyBATgcGBQ5vxhmkOZ4zNoM6hHEqAaBXeJq9Uedk=": "456456000000", + "SzPdb9zhWj7EP0DMnxrlZigfLdeGb9aVHzYnWVQTFZQ=": "454545000000", + "SzjIjBmKbpAmoE_vthrTL01-Dv0nQIlKEkvwVMhnfl4=": "1262181000000", + "T-7FHyBuWHSxw0YIouvGlHYWoT4jjqTuNt4l4vgRpdo=": "1132037000000", + "T-tpeDxcaOR_QeVE3kQ0twz3-Z2EZyD6McfrIZD2Nno=": "416408000000", + "T-xoObUayimBzNjqTPoequcCEnxreorNF2qtNvvcJCM=": "756514000000", + "T0OtqLc3zTy5ML-_JNlL37Gk-C-Moi5u8syzUYM6u8g=": "1344548000000", + "T0S6TodznUScowsmpJshRJffkk3IOJteC7PSjp9vHZk=": "469809000000", + "T0njmdpQTaW8Adtjpet7m5c5CJbcd3kkQVEVtc1IsaE=": "389386000000", + "T1N8huyrkkzSRveUDhuLJToAlTeIAI1xFG1_hg51KjI=": "425020000000", + "T22PtI5dTIaNj2JwaDzVUjefwwer6HEPoEMyfN6CNO8=": "1802002000000", + "T2E1wKTHWipHYJgQcnhKnjzDfn9E_nJ9psThbwxyqGc=": "964248000000", + "T2UL3fSb86S-VQvmw7ypuVs5D10jKOQxlbZeHTKEYXE=": "379603000000", + "T2fY7GkK2OkBi99tzZ9xf2gDsx5xENF0rgcWorgyQcs=": "469310000000", + "T2jzWwZF4yUAiP5zHUwlxZcR7otazbTtAT78cFdpQbM=": "673851000000", + "T2lfKndwHJTM9YEZWeCqaGaZnhM3eaD-ax4FFsnajE4=": "3846153000000", + "T30Bltb5MJh1YjWIN0cibLv73SylZptXuTMCAA3Ohqc=": "385168000000", + "T3afCTFRGM83pdsATRl_w-ZNLlExVZAFW4i1D1fFbIw=": "419075000000", + "T3d4i_7opknr_tvzzIR3raoHYq6DGFZLYJDQWRjH0-A=": "389613000000", + "T4k76HmpAf3TI4ysRBgAISJHffMsWjdqnB5s0Xcuvy4=": "458783000000", + "T4lHcC4fpOvGxmlI_YZyyrSjGGAhEtEpBRa9iCbVqLE=": "443380000000", + "T5byI90XFRWcHuMv3bjHY-91D_adEDFnmgfPLujE0cg=": "833802000000", + "T5p0OewwVDxDNgtlMiXcu8oLTkCF287NP7UjjoX2s_U=": "411085000000", + "T65clehjcmIz3jARlRsilCSmVep7JbpbXvTF1XrBXew=": "2839748000000", + "T66zwB2XM2a4PdHlrhZp0Q4FzJGz-AYDgSegiSZWSAg=": "418363000000", + "T6CuFMnQIiokXOvvSZfh74wcr8kqKumdU2uF_W2xNKI=": "492195000000", + "T6NGythQxTkm3glSrymftn1T5Mt6P1FnglyilVDuOdk=": "790995000000", + "T6X6KOVumlbOvt6P3wQzfPQH4i8_u9E0aInT1O1KdKo=": "2084206000000", + "T6_NIh-0SBBHhyCRiePPnDvE2wONneL0F5oN0mzd-Jw=": "559333000000", + "T6qmSLu4aelssncDsijhgdQgMLEVpDxsDkth-tZ1AUU=": "4054666000000", + "T6renS-C-bg5kqHfes8pyPRMplbBm00u4wcvclbL3NQ=": "1905640000000", + "T764T77DcfaAQ2piwU9ycCxXPF3pFYotNCO2xbJdJ-o=": "385508000000", + "T7BpesNfYvpduGPoCG94y1Es8nVHCV_wC1XPWcBSTg4=": "1513028000000", + "T80mbIDuB28I3kbkLjeSWwH5YuDgvJHLuIO9ro7U57A=": "1153846000000", + "T8OAfF9wDFD0zP9gy_DDuZbgFjE6ECNwvnvKZ1H8dWc=": "3880835000000", + "T8VsZHeS13XDf0q9Evop3-Lm-HEJQ4YYm9RvLwcJXCY=": "920027000000", + "T8_KAJpk2BRrfTWZeRcko-h3T3buNpoU0MSBuL5ign0=": "459318000000", + "T9CJOFLI_3fPIPqNn_bqMOAk8oBKp0KSwN-y5tvh4Jc=": "984391000000", + "T9PRHLHeXIu1FzjPL_9ofs-i7Avn6YDHS2e9V0QuzsA=": "1156532000000", + "T9TMTIJYoaKPrIv2b8OhIbbbRDtVWwfufO35L8eEHlk=": "1769230000000", + "T9iYpvU1dFRcPPGni8TIYWz-IUUvM3HQF_kMfAO6m3I=": "5825252000000", + "T9tIg_QPi5N-uKfDGq9X5ZkLOS1PptCUk0QGrrLpf68=": "1179159000000", + "TAAdCyOZMZ8wbZHaJRD-fgcYEOub1YYWLBhVGDjXpH8=": "1213320000000", + "TABpAcemRZeX3kAEfy6swsiT479YArwopjYiKal4pQk=": "486218000000", + "TAFe7JvMscTmjIrlNyvJ4Rn0dKn1IfToVZIcjbVH_NY=": "430743000000", + "TAPAuWMw2_1NVOFG8Lq3D0Uts1wkUJyBqgEb74Vqaos=": "1512876000000", + "TAg_6xHgYMIdjXi22XIEqxpRaN4wVqAfTWvd0wylWdE=": "405229000000", + "TB0SoUOlcGl2QpmaJh27rB4mzPxTouHbb5zOFl3TMJM=": "446613000000", + "TBHN5sGSA8vlYimejlEcgqIuGQ8h0M3uYnIkhAZo-1M=": "407808000000", + "TBLOKjaCZcspaiooOxOF2ufC0jxrsHbNheUvZTyHMf0=": "2501233000000", + "TBRpluY-Px7T2oFyHbXICVUEM21I1wVGdi62vEghG60=": "914067000000", + "TBVV5neWlX-oioJhvnSYqEqiRZc445_QuMXb2iALHtk=": "808497000000", + "TCGdGpa21vGwkNMD6PqPVb_DCju8ZngXcg_ckR1UEsA=": "538468000000", + "TCH-5PRDg3ZZSEpmn8yXMAJxoUi-qXIe_xYyOM88WUg=": "411085000000", + "TCNWv1UY7SZRk0r9OuT04fuf65hmimvaBcZZSxc1l0U=": "499391000000", + "TCQ4oVEJrDyFJUnMlLmXp3sVRzCTtJDPDV2zB7gWt2c=": "2073542000000", + "TCUHETQtgQOTjFVRH8bGbJgmZIHQGsQM9-sf8edWCQY=": "1734809000000", + "TCYhdCPnPJmGFCJYY-kq236oqDxcFM1HW7y0J30tQKo=": "706137000000", + "TCfxhwIVKJnDuG21nU6hFVCZ_itRm6qUfM7_QwDrfUU=": "2018426000000", + "TDKS3-VypXcEQzolkzO7IOgdzrkz86t1QDla6mzDXjQ=": "760231000000", + "TDM4Fvn7dGy7FEOXAJqfm--QBJxppgdahlJvQlP5eAU=": "385935000000", + "TECtaxiOU08pafigBGcvzj_swMuAVn3Nd1Yjk-LUrc0=": "386715000000", + "TERbjd7zY06DplCsk9egnQiYKfUQXT6s9eYaJnOYeCw=": "449746000000", + "TElZX_DlesuI3FuXC8asLyMEWQV5oNkDHFrCquSUU70=": "454038000000", + "TErBbf3sAbp2TPq7KZ2fe1KmH2Egu5tH8vPVU2R4FqQ=": "863973000000", + "TG1-OucRXFcgExTvx09RMK_qahotAEw1-C-_6n1HRsM=": "453652000000", + "TGK2WuotpDIUeFsyzkSjmj84A-Z4s35P1zKpGBn0LPw=": "403061000000", + "TGNRIbs23iGtwuLO4i4s19BryENXN908HaIw9bF-6Jg=": "428186000000", + "TGRsfM7elqh_k3iHV5GRZWYJN38oPAMiQINtCwzhywc=": "917293000000", + "TGpLzcS40OdUoMr0wKypL0YDdI6mcYr20mSdogLpZR0=": "440082000000", + "TGz4zOCmVM60YBnyALFWC0ss2oeaKf93DHJP_q3ARb8=": "456999000000", + "TH8jrbRRBDM2VZsnZSPwSAaJ1sfJW0zyd-ztxKJ03fY=": "460237000000", + "THBBi_4s-D5R2P45o_LsvJOULgeJNplfY0I05WnRl4E=": "11518601000000", + "THgoJhH7jpCPT_i_vaehohUjJXiB4cXn3ibDxPnhS6I=": "6102241000000", + "TIGywxkuA3q-gGhc8-t_Vl0hDuDZK20Jcdg7igNXloU=": "1159335000000", + "TIIMUqcXmZttm_k_Nlx0GkaLMzkzniLpybH9XdiLWSw=": "455600000000", + "TIbWJghinnJC7eQ0T2CYB3uz2J6rx-7ChDdEo_BCsPk=": "456386000000", + "TJaeS5vBwNH3p65qKCn11-0faH0-jN6WPi4IA-VY9Ho=": "411085000000", + "TJddBmAc5_KfeHQSRUMd2wRYI-zxCc3Z2Q-wp_wCEV0=": "384615000000", + "TJlUYglMrWn4GzpGz62OAiKAoeKTO7gInGXoZZ-t9vk=": "1153846000000", + "TK37LIzo_18Vav-B6Iriv9-88eXcJKRGzw3xtWhnQO8=": "416666000000", + "TK3_qEuI1j5SLvgdO-J0eyvopyPrNDNdUgReItfO-7g=": "1804233000000", + "TK5eo4OPXZZAv4W0lOP2KMR2pgGUlcpp6cKHlMJhGv0=": "385528000000", + "TKCu2zNR1s45jCq84YBtzlZfAEQb9yXfb3skmf_yW6U=": "407808000000", + "TKMpqi-rnNOgLbO4KRJ_BRIRExh911wZBl3PSgnW-kg=": "2499999000000", + "TKmfNptUOju83EtZl7PZbd2X4hTz-wi8RCRlwqLopeY=": "2099037000000", + "TL3--gU-l_QAr9r76txahFQR_eTMKalM_q_Lun7Lorw=": "455600000000", + "TLAA2MCzFTCN0ztmb0tx6Qt_jWWeojCOoBnu1nLxiUE=": "385830000000", + "TLS9DVv2aeZumLtsvxBqcrgbfcU5cnRvxN4-QnW4BYg=": "4071284000000", + "TLV5FutKSANrgq97LDiqQwZEmmzRTl7ZHEugsZvpSoQ=": "4562692000000", + "TLVAl4Quy56qUGHoOnEhYlxLh4ergrffbNTlNiGa9Xg=": "385505000000", + "TLnETExs0lEyGXPogZZUQ8-Us1E_SJ0310IE-ze4pgQ=": "384615000000", + "TLzWCkmM_fLTF8acdMM1cOQ1XolK_vT5IyR8ZLRv2xU=": "496799000000", + "TM3kjCKbA3awYjqV69ft-rpq2v5lWejHUEimP0MNUI4=": "1999999000000", + "TM5J4gTOcIBvGAIA1aiGrXDS3btTK-J6vPW6ahkJVoQ=": "383455000000", + "TMIq1ZSdC9dPgNBbRD8wewIUpo_tk0T3RlKknLXtazg=": "461553000000", + "TMXKg7vDH7TDBaitGRT6cZD4_iJRdp_DxnsvGFtz3G4=": "411085000000", + "TMXvkzRiQ4dh_XBa2iQIexHziCGZRJ88Zeye9q5UkT0=": "769178000000", + "TMeEHjWcE5IhVG8NrLL7xv6Dy7i4qeOkkBjNmbYH4Ss=": "384609000000", + "TMgZKzIJn26vvSLboh3L2YMIqK0_xbpqhvv1fKKkGZI=": "390917000000", + "TMkHwQ6tCduoiD60qeK_L7iZfVdIAdV228pJrkaeBeA=": "31859306000000", + "TMsQODyiz9YaMKAAqvjP9oxJDyTP6xxhTkKq5l46KIk=": "454397000000", + "TN4bUGuZwyecUXypke_OdFIlwM7a0jwEv97mAcoISsY=": "1153846000000", + "TNMCCSP0hqtH2V2hQXsHuWjwdmlK1DBWyy58cxcEh_w=": "2095522000000", + "TNxrpEy5MyfyZkjzlJguAmolJvAAzk43Sj3MxnhM11Q=": "8926955000000", + "TOR-0aZ03nd6q1pntimhhR8qjlojFgElZX26vCBcKLI=": "454527000000", + "TOlegdxhkrZsbBMtfL5HBg29_MuhbNwdoBa8-L7V4PQ=": "390975000000", + "TPA7-VD-ULaRoMmT44uJtRvCNefKhC-a_lX3md55Gpo=": "940062000000", + "TPSrjxo6_DDfpbSPivjzIO7JmUw0_QnRSJBXnGT_x5o=": "4678221000000", + "TPaPDoDJWBzSwgj26rLcEgAdwtfZiIJTnwlKZ9s7ekk=": "382394000000", + "TPdLdEkRsxs0aW7h5GCac6j5x-D-fuFynND6KJlAKBQ=": "385506000000", + "TQFhMfOzYBiRzVCxwG-S9nvkea5rMWkc2iCNWhijd3A=": "1694716000000", + "TR2zSFCV5rieZAHdZZBRDlIzZLdU-Mz3qM9SQwSCmp8=": "769230000000", + "TRKZn2kraJ6T7uFqH5cn-u5egjR2Dai_Awwll8XHK_E=": "4110858000000", + "TRazpLJba89NscDYCVcpc90GVPhL7ACcwumOAch8Ecs=": "385507000000", + "TRfhibhiQPGFrFqdUqvdKzY7ZnVUYXurN_Yxqa4fQB0=": "4926913000000", + "TRggNI27HawKHYahmKvSBu6dB9KfBDhp9kCSUVvGSl4=": "769230000000", + "TS9-HkUu_ckUYQWDwgECdPUSNYVSBAyhT8lRDjwf_40=": "463270000000", + "TSGqwsxceBwLeR--QtiAPX7JQeEVob_EwevaqDJLqGw=": "1927537000000", + "TSbNqxF-Pus1N9Y6JCJ2NwmkfYIskGGNtVpviijL_kQ=": "1078431000000", + "TSw5S27VCGc1hAB0Q6f1YU8m9B22vSoV-IAzciTRtXM=": "455600000000", + "TT2lLlm1bIlfqBY_ukjr_T28fferrj1TgoVXcTDRco0=": "3846153000000", + "TTFOTAi3HiO7ns-j7aRBeqs5i_ysaqobSzQb81CJ7a8=": "393015000000", + "TTIIXyTalJN5aC7o4n7QV0RgdVL1kFmQS-EC3O5N6Qo=": "404981000000", + "TTRysw-M3YBzft4IjSK-PzQJXrHvx_1uGvLZNYxTE5s=": "2307692000000", + "TTaz0s1a-7FlcYoEXfAY9zQ86PLz_IkIrP8kKzmPHoE=": "1890031000000", + "TTp4oUQSur1USwkRfS7oOkumUjqBnRwDMERzsHUt44I=": "382296000000", + "TTqgIKgyd6jccZ6JSVp5Eg_L5RuzWpVd-IZktY9peSg=": "1249999000000", + "TUOsQYnNyu84Ieq8wAv9isT7k4WYeSBykv1kpva1Xhw=": "385507000000", + "TUe9bETsMnKCXXmAqGa0_tRCEdba36VI-8eztan4rzQ=": "455249000000", + "TUnCHzmoynclcFE1SONUUsnSKFqQciUvag9MdWCfIZg=": "1153846000000", + "TVmMoaviUhsywKP9NNTBYlqkcwnaQN-I518APE5zPGQ=": "1368707000000", + "TVr-HcsGDQHdUC1Obirryfkx_1zlz00HKZZcSx9U30g=": "384631000000", + "TW6-1ICdwUPYpp_DiDfMTcLMM-zA-h8s9nJOgsJOaOQ=": "500320000000", + "TW9CO5ppLbwpVNih1DCVcm42ZT_o2XLRWvkUYlHedBw=": "3846153000000", + "TWfO52DjZQh1MfsaYhe0RJ7ij9XAfG7PUf-btKINmXw=": "454545000000", + "TWgDMqd3RmzuC1-MlKQ84sJlKZZphvaiOF74bHWCcHg=": "2280979000000", + "TWjrFzQ54CN8Rub-Z3UFU5wc2CZMAKKoeb1oweL9bRA=": "385507000000", + "TWqf_OA1kTwzOSuAEVL0z8M3ihOZ85m3QnE8Qt9LZVA=": "473265000000", + "TXC-rEpYEmWqm07xT91823rjKK3pnkvRRdWhb62_XJw=": "1666678000000", + "TXDkgGHNB8NDDGuLngAIpkkfze8noDVH9bYQpNExrKs=": "498593000000", + "TXZEy2ijIIvt-ajyMef0u-idEqULSxCsAs2SjM8jSCs=": "41614042000000", + "TXgFpsIhDeDdFl4tkl8JOcA_mUy5t8jEFrhtk3Nl95w=": "416666000000", + "TXo_uT-RUtvbYa1evHBxxLu88CaerlllQxBJfsmfeOQ=": "1384615000000", + "TXxKUWAP4OQLZ7ix07gyhySk6g5Yzqgy9bHmGT0qXqU=": "403542000000", + "TYoQZqGeogsN_wpnt3im96q-XJfyTLGp1qVsLNETYSg=": "934115000000", + "TZ4h06LVN7ZKCp_Vr5ES_LZ1l-hWIUnKaW4SkPnqpK0=": "386611000000", + "TZqihr6MrkfU7NPAD8UkV1hcCW_wS2iGq5V70FRplu4=": "769240000000", + "T_aw65OLTwI71NzjiWu70ElgFlYQ9aGaoILHo0FAUlQ=": "372058000000", + "T_jCquv7xNAVlMNk7U0Bj4KvGM7j-Vms4fJbm0fowgs=": "396483000000", + "T_oMfotTlayTfjx3wwr-5VetYckc6I81PyVDs7KhnOU=": "381635000000", + "T_w1cqc2BKSKm-mesketmzqP6R6R2Clnk5NB1a58wjY=": "769230000000", + "T_z0BzUwIgntcVNd3qxIH240RDwbron3QoXlbVX7UlM=": "3624999000000", + "TaXNwZgAipw1ucIqaBPOS_scemtyCfnDSL5lLAHEF8U=": "2275404000000", + "TabuOZ_QzmYaFJQH3kUqM354UMLdrZERVqw3B9GXMQo=": "12517503000000", + "TapJIqDfoJ_wQVRcKayGzb6GDrAhd6vmKHuv2D_8eSw=": "12741935000000", + "Tazv4VeCzbyDpnJHoqgOv7HNbtRn_9ZZbeoeaClKEF4=": "4540416000000", + "Tb4VcNV32tcVTfjV3YHYfocxipxYJP4EijYT2eaXNdo=": "669358000000", + "TbDi5FuV1ZImz-HVY_raPsGvl6uWet130W4oVmt_x7o=": "692307000000", + "TbPkwRuOeNpW7j7qsevK_KtJjpMYgiq7dSV7m8pGAWY=": "378341000000", + "TblZaN-wNTpMNnNFgxCrKZ3_miawPY-rJMFRZ7Pbm3M=": "584259000000", + "Tc4V9So2DnG7I9faUsZKi3xqWP8sc5OzSwU2DcmFhEI=": "5384615000000", + "TdAPvZ-TOWuJTJLn-QcoD639bxmQwaE6xrKVjf-CnPs=": "880291000000", + "TdbYO9Kq9MdHRCuKPg6TV0yX4ZXsrWhNs2tKBxeSLvI=": "384774000000", + "Tdy2vwOq1dr2JSBjaatgM_HXAjFy-hjEoPTYVCs_wMQ=": "384615000000", + "TfF4fLtpKQmZi6TTaW4I3e4DE8kcphTdU-ONkPFTy-M=": "1345378000000", + "TfHE1imi6jlCoIVeAEmeW3vqAn5vl31dR7OCRKyiTqY=": "834557000000", + "TfIAKjurwuoUXu42RB15mpvkO58kBOYsJvRk3ip1x04=": "1942665000000", + "TfTktDgH-CYrDdDIGUsJfgz2IgOqeFn9ZaAfbrXaloY=": "3690073000000", + "TfcOiG5gPH1wgEWjTsBXq9u8Ebq3Q6q_bj-OSnRghog=": "902536000000", + "TfemwpPbJnR1ReH8-jv02HzBLJjFjJVbxfATw6bbeNQ=": "467604000000", + "Tflu5ymmGQ1o2YFlaTShuj7IgIKsLHPI4FLPvqTiwzU=": "390962000000", + "TfmumusYXlp0Kjmg_v2JdZfCd54sWMkv0bfXD6hGj7c=": "385506000000", + "TgAFIwYGh0zoSS1kXobf7GyapsLIY3C8di8kMMt97WU=": "5192307000000", + "TgENOTxjPLyyFKGRkhAPvt7csvO8m4Kyr9AJnhvQZ2w=": "347570000000", + "TgUdRokk5FS225QFuAKWWF45aBEY24rs78Ou0IP2250=": "1812786000000", + "TgZPpsPpN81yhqyOVzHe6X-eXy4SBtXBe302xO3E5h4=": "2304657000000", + "TgxQjc-m-jO2mkIW9IoblXR4lu_gA6EC-5g1N-wr7Cw=": "1958327000000", + "ThGiNF3XW6T9MMp6-PiKWsioVNG2F_pBVhr_hONXq-A=": "487145000000", + "ThJHUyehjUTEhNmNXvXq2h1EUmzNHMUnPOFJ6Y1FiC0=": "1156518000000", + "ThJK63hC3PzGrjTCGMh81hRT6pGwG6EIeZf1awg7xss=": "2083333000000", + "ThWGOlrbzyDfVSdK-xkBrFoTMCJ2CJWEN-5LlDudA40=": "457208000000", + "Ths7rST014wnSAHwWzdnKKVOO7TaGizyc4ThEveEKSA=": "423634000000", + "TiXYTKPwfP_wrCOx5YRMaGK5LFTgD0uf0NXTZUtUncg=": "814938000000", + "TiY-JMyarKL1pnf3slEmBGQ_jZ6kpoI62QWpA6du8Ak=": "799838000000", + "Tie5eeUqZ8itfQ3hvTjb2w2oH8ktAhtlUVvNc0jjI0I=": "416659000000", + "TirNJLKIbGMtLwTGDoM0BDcZoZ0HGHUhWs9rjjTCPTk=": "2499999000000", + "Tis0xPKLTGxeCYn4FyhuHhZ2mWxsQVMz9fa70lK1mpE=": "384615000000", + "Tj36rUXIV4UwS8HbpLuDbvPhQi-LR2s0wCpqW2CK6YM=": "1146117000000", + "TjFSaK_3XIypDVaedg8aTQweNOn-05ZR_TTJrwm0HRY=": "1538461000000", + "TjeFQTXO9aXvGmkgqDWQYqnXTi3Fcqhmo2ZpWBo0wz8=": "499999000000", + "Tk527G7837xfz06MUhsUF7aI9gI2l0qB9kLIiGv0lfw=": "1019742000000", + "TkCte70SVji_uRCqpiiO3w2fAIOvGQHbUmbWaIb5XuY=": "2080471000000", + "TkJZ2MlfCe7dLOv3KoUCHwZZGH9mZ-FOk3CH9vsW5UU=": "455059000000", + "Tkz9wDqnYGsPId3VAsxgfi6S-MhozqrFZDS7_yMcrv8=": "378866000000", + "Tl48tUyN4Ilv3bl33PJoxHXhvb9B5-3FCLx8kzikTxY=": "453243000000", + "Tm3qBB25Jq64rqlCRsZnXhHbpOolTL6y4EbSmfnnzkM=": "388432000000", + "TmXPZgMpG-J5ZfYokmKRf4nEKYC598zukJeX8XkN_1I=": "411809000000", + "TmjMzGVL58Bb8qdgbHBn431-M4nWaoW5xZ8E-ta7VFU=": "411085000000", + "TmpfuhZeroRreQGdJda8tksLHL-8vqO0JMkhZh3O9WQ=": "424242000000", + "Tn059KJmqshzlCu252fyoSPC263U1B1jcM45WxQdoLU=": "381721000000", + "TnM8so2H0Ye5EBxR3HErCRMmrdL6JlLLSrLP_DyrrlE=": "3846153000000", + "TnN08zqxSJ--wf919NA-8i21xMtdg3NMXwAr6shLk5Y=": "3843882000000", + "To6Q3J5iUOL_KCmFFHDCFVKIcGEP0881p2mejZN_ndY=": "7507276000000", + "ToCO8Z_t4xNqfw8d47YUUH_dYbHujnzz116DDSo-n7c=": "384615000000", + "TpOMiNp2-bZTZVfgCezfTamieB2n0sk9hmWO2l-KvPI=": "10694999000000", + "TpXeiLOMShVcGXTUOJRCuP92EMqZjXyF7mYY3EB3k1w=": "452040000000", + "TpYi5tGrYo8M9vh2k2o10sU52I4Z8bv5O5tBbon46xc=": "511505000000", + "TpzcVzVtiBR0Y3IXthyc1tvdVR4N3b57Yg6L7Y8xZyk=": "411085000000", + "TqQd0PYrucACHeAAsiQNJjg1VCTIzgx_omji7ICU-ZA=": "358831000000", + "TqYkqfYDjymw6xYZjGfUZdxMT4E_pKk4-TZNjPFlOyg=": "2606663000000", + "Tr2r4ivZCwbPvPzi_8WKRp7PHTAG3MgJFXyjdjv8hoA=": "407808000000", + "TrYdxvJCfN9UIh5zORmv25D5ivU4_SPPHvrBEX0JAFE=": "384615000000", + "TrwmhaqJAEuw1GF3Y2vkYi7u5F9JXu4oNxmzrl_O9ko=": "4176371000000", + "TsMAQPZ1TWxodeVKjsZnu8n7MZanaD4gW3FnWPJ8Pcw=": "769340000000", + "TsMwVWyHVtHZKVSm1_BpHjGqZUn9kfsALu-BOEnqTJ4=": "385508000000", + "TsNT6fsflfNcwK3ZB4ezjmKqHpYEhQAPlpJUk5OKVr8=": "9596153000000", + "Tt7NhQ3g0ja5z2H5bENDNbKbXY-jA2Jjy2-SfiVGN2w=": "425284000000", + "TtGEuEyO49kCcMWQrna_ecvhLBSMqBFMiRf7qyNm7LA=": "2318461000000", + "TtIYdgTmxM1WlxICEeNafaaRDo0gw6Lplfyb1fiXpIE=": "384615000000", + "TtKFj8ZleQUvm48hAEI6MVMx-EiEzmeI5iXEbnMUad4=": "3611667000000", + "TtNQSJWvVE1ffzS1Kw9iSrkmqSFjafULN8p9Qy-dlS8=": "384615000000", + "TuZg5qwILprTrtRjSGR2dKzQ11rIIr0GK-DTTV4oZNQ=": "383553000000", + "TuwLcZ9jdalgTCsBi2Lqj_QoN0T9XZQb9tvcA274aJM=": "3501716000000", + "Tv8yfH30faV5FWQo9cUBI8JXtfzyQwEKoA-vcET6o2A=": "5245509000000", + "TvBJrJ57eL2wql43o__0EoURS_l8MWHcOCnTUrYubWU=": "27820754000000", + "TvIbdM-UTXnHvVBKtISRBM1dg-1aRXU9pBXWUUt0DZ0=": "8352730000000", + "Tvdn9qC545LHGrOcjbicYpo-VsHUQ19YANEnSZcegpM=": "1246889000000", + "TwKy9rhgDYrmApEYYIno0_-f5Axbtg_n4EzwWU5jTyc=": "421951000000", + "TwLSJCOGr_UhQGLJj8wW_VC_RJqGjiF42UK7eyfGSIk=": "19651356000000", + "TxP0IWtj_qIFcEMp2n3zZR5M70LbeG5DGzrZ30fxbTc=": "946002000000", + "Tx_123dwWpxnSz7alHsfMItnM22dwrm6bXd5EaewTig=": "416901000000", + "TxrSSY32j3E9kpoIQQLutxAM92BmVg_QCJMVDHs37Jk=": "1389724000000", + "TxubSzw31e_Quw-K47mh7T8jjhRuyDwyF73iRstdIx0=": "14013443000000", + "TxzB4X2FF3doaISiN8gmNB1lq3_Te3bK53fno-QKt3k=": "3749999000000", + "TyFaA88F5gxUzMOTyEvAvuBI7no5ZSz5zt4E3VdHpBU=": "1692307000000", + "TyVYP3JJivSRcZz5h1cEyjCCVCRvq_IlHmViKBgdkaw=": "624999000000", + "TyaI7Ng8u29ZlUD6uXEvh_dfRloyMsuJ3lUahb1D6YQ=": "460489000000", + "TzD74Ktw8ZZ2Cn6hHD5OF25RNJWRm5UV7p6vkdBdiBM=": "3796506000000", + "TzMnK_-pS2G70ee48PS8AknZCVmSRolYyOLOqw0PPc4=": "416782000000", + "TzSKG5rOvHNbiDk2QwtKdOhKglADzUlopQun9DhsXp4=": "1858257000000", + "TzV5qr3ItJh0sEduXfDMWgp6mUdccfWRZOF8XIukvhI=": "384615000000", + "U-ApjSkJAdX-o8C4b202LDZX1L8IDu1CG1jYG6_jhmM=": "2090990000000", + "U-C7mTdjLbnD4fZXNYQdlnINpMp8mobnfvdWNdX_1LQ=": "906947000000", + "U-V8AyFMmfdgF5hJKSv0mjUBkxsaEseDJ3wPiFgM12Q=": "455196000000", + "U-ZK_bQFkUOy7d3-4hPXuAwoOel1_AY0YCU33MCHd6k=": "419727000000", + "U-kBbgpn0xQ1gIuLjSLq2tzyYyD6VF-VddUhY0q3DuU=": "422027000000", + "U-kqUeIB6UlbCEQ8KqGa7dzcdNZg622qha6NDtBug5Q=": "377916000000", + "U-mU9Oc6nzsLqDnF-Wk1FM5YFNINhyqfHutwiAKRYpY=": "9112001000000", + "U-tf7JDx_9iJEQkQPGXwTQdsdN89iRVuhhTH6IB6QiE=": "384615000000", + "U-udo7yDUs4JVhv0RI5iA7975ralHx0uOdNf_kyl6e8=": "3843061000000", + "U1BolbcOnnP4qOco1HZbcNzHIF0LuQLqHlRXkJT9eIE=": "3127183000000", + "U1Q5fiZuGtYRVqldMke_NSIEgi42ioMeP5jjE23iFSo=": "423370000000", + "U1bQpxzcraxj3mSG4N1Na5gf20PNDoPrURrKXZ0ghdQ=": "384605000000", + "U1m6fh8_9BiNlv9_S82utLX0euV8t5fsBdWJBphLl2s=": "359692000000", + "U1oyR6oXzBLIxPkWwo3CyxiHSdiO50iH60KNDq87H5o=": "422592000000", + "U23-yrdWCMjj0sHJMYQPsFZiZCD95V3h4zQiEd5ZzV8=": "769230000000", + "U32kC_-UAKT2HxvvEQ-YNIHdKpf5wV0UkMa4lAxn4nA=": "498912000000", + "U3EPcB_dIRlChCMpfgPS09yCNgM9X8TzNV86l7BaKVE=": "384615000000", + "U3TTYGvzo19gdM4b14kHMkvg3_ftO9XqzaX4Mk_8mfw=": "1154183000000", + "U3y9DfojeXsjvticKIty3CPYYmTmThn7HRHliWESu3c=": "382536000000", + "U47--PZg2UNiL5ghkz4UInGs8xGALTiqzaiq0RKwCuE=": "416559000000", + "U4EekdnUAG3ZwHfLSXzGB5pnRfgV-_FZ3vFmTcmXVoA=": "1362069000000", + "U4tEG1D05OVAO22uTVEYjEFWkUfz3mTHli8vujPGUf8=": "385507000000", + "U5EClb9NthAmHXZ9bTN3URkFmTdZeuqKNl9vkfij0j0=": "448357000000", + "U5i4_5PbaTrtYg3fcPmVnWQHoQ5XKDwfJkHwEvYOzCM=": "4166666000000", + "U60OU-E3UzM2T86Hl2M6BaKG65DIZ8tnzJpNGNVsnWc=": "2499999000000", + "U66Q4DYTf7um5E4p9BBps8IAQaTmgMmxU9uMEQT0x_0=": "463146000000", + "U6Evr-GCSW6S37Aqe3983IKylPAkZi18UXx2-70H6HA=": "422350000000", + "U6gsAeqJ4EVeydeAgKTHmoZBuTI5EeO6UgYYC2w_XsQ=": "405229000000", + "U6kZx2h1xa9xIcgzkEsxr8-OkgT-9JDu2Rw3ZCAwimo=": "4635586000000", + "U6o_5jQbpU3nCymCjiuCFPll7NHvErkSKa9hz1WchIc=": "426923000000", + "U6tyH3EXzAKLxi1k4Hxt_1Tw_ciYip_5Ctu1tiynl5w=": "676408000000", + "U7Qx7OtqL0XWYDEJLHBg4dvbJHUKOoMDWpreY_Id4Z8=": "418059000000", + "U7bPLCINdK34nPTZjLeBYqbYlHvWn9b7sJSuO9iIf4I=": "380620000000", + "U7kiTbLrHJldcsWhv1pmqZSEvh8zrWuCA2Z22yVmiUw=": "385465000000", + "U81PJlM7gN3rcM2_wtr-EQk2oJzmKRVv_rTP3liadok=": "448101000000", + "U8F_Vq-p3Wc3I6hl-Fnd5UHxY9aS9b4Pd6V7femC0Bw=": "2136365000000", + "U8kZtcez5UIJvGUv3_38lwJE3koECmCsedHx9356JGk=": "833333000000", + "U8zi8IdMF0IFdt6tDCOSaim_gYKztf9mmrNNlxRbG7E=": "378257000000", + "U9Ar94IjW0V9Hr0LG_-56vvqROfK1OZRgE3hEleG2Cs=": "384615000000", + "U9FDY9sDaO31kJMZjkLlV_Lnm4gaLtDVWQO4pXmqNGs=": "769230000000", + "U9FrGqie_gAoV338QbtzXlE7M2HiosvBqNdcYMEP8uE=": "386099000000", + "U9Wv1AYXiGYhijS2bHN8SSSf7y_qqwd-GXSZdA6JaOk=": "889356000000", + "U9tYPgsgslUc9yEdf7xO6eOfzDYc18TH6b4pRBCthbw=": "19459198000000", + "UAfZnLJmkyhTHXoVojEiCaKVHIHMuCNDYl845ANDEOE=": "383695000000", + "UAnPCDBXq4pdxvFBztPb-wWFQ0QZaQR9ZD2MKIQ8gEk=": "1525894000000", + "UBJ0rudgvvF_FjZUuA02VgbcmJrCX8vp-mNU1dXQxLg=": "3465711000000", + "UBUuQLPmgVlYOZXPCKft35k3XppQCBe0U_7xf2rBROI=": "1639504000000", + "UBr6cf1OyVApXs6rFpYGumvDetD9tA0ZX6rOogXXde4=": "385895000000", + "UBx3kGsbw_MsOgfRzfxUeCZXgQPNbvFm13B8Kcgs0l4=": "648410000000", + "UBxk1DxGsJQM7gFMeiz3E3dLcPMpuIDyEka9P6asNEI=": "8461538000000", + "UBznrkHjH12BDxeeVDLAgaxaf-SQd01hRL4UX8kgmgk=": "769230000000", + "UC7oEYIhQOY5w38IKJQ9PVZ503ffgPAXaxPaU0TX9yA=": "2525808000000", + "UC99c0JOorWmt_sYDJkIwl9UPTl0G7dTBt_S-Y45NGE=": "1388517000000", + "UCXyiE1VCh8ixc6It83RidO1AgOhHM9RXiYkldhqkH4=": "771858000000", + "UCtIIEP73loE7_mstCVhABWVr_NTnbnVTuRu9rXzUuc=": "388874000000", + "UD131Wik6o4uSKxlhSCx22JGNe4Um54SIe9xq0E65xg=": "384615000000", + "UDBfAXPnbbmUxhrwHubNjJP_lN8N3fR7SFhkFCz5KlQ=": "440291000000", + "UEObN3UtABFC9M3Kzxeji70_CS3CO2aZvET4fu0ocC4=": "384410000000", + "UEQasmuatkRdj-D07FaTdYdCJYXaMNOHqGKLpggeVn4=": "1879855000000", + "UF1XzRHoQszjPlbw_D6oou87gdJz3caoeYKBAtGNMl0=": "383553000000", + "UFCTgP4kA6BAyOuEDf3ys79dJUi58Z9_uK7CrOwaANM=": "384615000000", + "UFf4jme_qzaFG6nZmyvkcAAbFapYkFqbdI9Ah4sDQ8c=": "4169223000000", + "UFtcny72NXE-yFnAZ8yxnnKl7xfSLv5191-2T_7XHN4=": "2087534000000", + "UGFuCzOKpEINMyTMy-O3N1cebFFWdZHGmTmPZQVI5j0=": "1923076000000", + "UGOB-NpCIY1oh597EnnoKX5SoCYZp6F_tIcqCBlCDfc=": "1366800000000", + "UGRxY3izmR8tbWvaEHP2VO6-e-1ytXTQgH1fYctThHo=": "526076000000", + "UGWsXU87r-ak_Ji8dyeftgO_6oLx2hMLvWBvYvq5nBQ=": "414989000000", + "UGqooaqLEl_8ejZI99aq-AgaXBu8MF_je6-0bAylgrY=": "416666000000", + "UHGPafr_gmCTMMnx_qLrLYKlfNeXdeWLU-4RTEQYCmI=": "1377894000000", + "UHPtzukC0xli3-0KGBqhpKsa2WbIWIMptqHicFjHcn0=": "576915000000", + "UHQfcJ23rRwDbtGLK-EvKr_c_7gsaPHiYJ0f2PiZcA8=": "2267876000000", + "UHmgAYDEExgWrOX_Y8Kj6jiXalsuB2kwhV48XVYVCuI=": "413620000000", + "UI8o2d0WSrT9u_e0M6f6Mr5ikeKjxqHuN7YP3wLVtNc=": "4173355000000", + "UIl_eeJg06OcfYvsSSaossxvgIZK1FIVlITZM4XSkmQ=": "499999000000", + "UIrQXyxe_pSJVb190dye4jE_ozAYfyvNfq4Yk_obFxw=": "4178790000000", + "UJGXUNFlyrByr9DWfZdUZ_8HWG2kCNMg6oXGaLaw2CI=": "459419000000", + "UJG_vL-9KGKK1uFabTNXyV7bWAOkS7pwcIdvkGBfIHg=": "384261000000", + "UKGAfCmJ0epL0dZsFrdtCeljm_oc5T1AQa2Ih6sO8Dk=": "416666000000", + "UKfRR4z-mG8Awqe7ip1lN7MbcVXwoq95FqbAHlNA0Fs=": "1250011000000", + "ULAsEqaQYfgENPsu38C7-IKxz2x4pwhJ7SNEtc1-kpE=": "385509000000", + "ULIxaNOHDEGdpHCCqTrnW4dZOLMIdYg2r7X0UnHBGHw=": "457355000000", + "ULRImLaeJcmV122wzvHaiHyJUJBWMX-LeXbbtfdrV_w=": "417094000000", + "ULTU8mIkTDs7b4vnp7MXqzI3XaF09NlTi3Ivghq1LMM=": "411085000000", + "ULlJUnRfQpmTJffDF6rY7oXyxBU6Gs6RH4XvZuK7eCE=": "769230000000", + "UM3BTA_b4ylBDlEZSqJe2EmnNlwYLaXGerNmKrqpUS0=": "767106000000", + "UMIT7svYzWpQ6A71K_mye_MwJELKm0sO43DeSqB5lCs=": "4138988000000", + "UMpk2P45eBJn92I1dsD3Mldsj3Qz-T59_vqj8nwC--0=": "5461524000000", + "UMwoNfKzwvnny-gvr4wInOSbz--mRL_jfRxZyiw1uFo=": "1366800000000", + "UN3QJg99rJ-X4ZqRELOnaKGdqlnxP2MLKMofm-0ZNgs=": "18512971000000", + "UNa4tmgtiqn1EJv63kJxHNQMcGp6x17LoW6KSoCgOow=": "1882921000000", + "UNxdnw8JhKyVfE7VpluzSeYKsydG1K6KJndcf4oY2Sw=": "385507000000", + "UOB0S3_CjujM5pItyIO8F4VLpsUCoOejKmOjkDYF2sY=": "488631000000", + "UOKQWiWZ-eQW9ZvC43dxw8a6xv-TdiOHKkmtAcdHd1U=": "397332000000", + "UOU701FT6as5TlRHtFcBOjKjyIPMChK4fvYv5MdzZtc=": "381635000000", + "UPFjLXP2BY5c6BRQq8uhx643TEo70rAaZCu-3P-kjUY=": "831117000000", + "UPezFePS8RcCtCLkQk34TvSogOcpnoQE4-eHYlKy-kQ=": "458778000000", + "UPliZE9pXrr5g3Eo9nf7ny52xMy8ti8uF17QTzM9PiM=": "454545000000", + "UPr9eyY_YGY8wPSlnYD_qahi65_aQa8rcgZs46VTRZs=": "469811000000", + "UQ5r452MxiINSZOMnCCUt3vpfJ4I9m8ocHs-yqwbVOc=": "504260000000", + "UQR4pQ9BnOt5n_VU5QLFZY_JfVQuu7I6nfDH-01okFE=": "7123151000000", + "UQjBpyP69K_VPQW1DyNSuWuOKtzOojiuHOFl3rV3vD8=": "1922723000000", + "UQkO0vTOWEZczIn41dpvkCsaQIUhH6b8wji07d0oeRg=": "1350779000000", + "UQpIvEAy5H_WnaqgHYN7Yxr0xpCe04hCkX2KFEikeUw=": "385528000000", + "URoFmSd7XxTl3hOBgQD_fBbJn8qwC7r9Pxn9W0LeLkk=": "4572549000000", + "URyI9_0aJ9qnTRqBPwiM7FtzBy6nGpR-FHoEJt0w-yI=": "3621396000000", + "USZor7AVPy-L1hzfnn5lvLvQsUhcvI52nstgFg_MDtg=": "2291929000000", + "USe0WqRtvJmW2MFXMMlKCUV197OVnoEtYmMSwlY6PIc=": "454543000000", + "USnpHBzAL8hwYQVa-Up8q_kTQe4cpUzuC9ZPHbSI6Sg=": "451760000000", + "USp_k8JFXk2n1FLEga_pRaWp-Rrs8tJ4um7D1WRvs5o=": "385510000000", + "USy2FxkD_VFa8inVXM6srHIMMVa1ikSy0ajTxz2qkBU=": "471937000000", + "UT_5vQpKi2QmkwjhrHZmbfhlMJD_JZiQ0GXILYGw55Q=": "1256564000000", + "UUS2I2ZquT8oPjRzf5VZo0qOleqYC2dr3haNAzJcgYY=": "416666000000", + "UV4GuyJarqKezZ9nR5UNvnQOLwVTss7W05_ck5WbwKU=": "384072000000", + "UV7MNYcZYAuyPSfyQ-XKWwCjRfU959wyFuW5_47Jlpw=": "12499999000000", + "UVexFudrSs2huhmsc7w-DKGAxaFgJ9WTB7pxscQlWCg=": "393019000000", + "UVhxOReZEBd2UfFzNSBnA7iqCoXDpqi2uakEI-i7gDc=": "2537908000000", + "UVpdmkh2aZxyX-gUpyBqrboHNaxuv01F4HjQCjkJ8Rg=": "385505000000", + "UVwKGtwUQnXXkhhieqUfqRfg5_znPsfoewOgWJB2d_4=": "383488000000", + "UW6dNMA51YL-5bCqcZKGR7kjekW1rCSSjWbxHWdtiyE=": "603447000000", + "UWMidlyTryZu6K8jewJ52OKOxhP4E6v69VZjBdqGCPw=": "424007000000", + "UWV5ivveaZsI6fxWZJ6cxSWjsFRHZ_Hl8dj4DlfJ1K8=": "425636000000", + "UWokLLCiuk1IDLTguz_EmBCSAaC1twBWWOoZBtRrT9E=": "1374999000000", + "UWt1BpiRL3_dq2Rf0PE2VvgGH7A_QDsDjxfnnFe4hAo=": "384615000000", + "UXYcJwh_P2tEI29d4U8Jk1O2vp-ljhM9T3d2whUUJ1o=": "466466000000", + "UXi3JAz8AtFNKxFYk7kBQ7bmifdove_EZreLP-VoXsc=": "1877283000000", + "UXrX0RT6kxMEqRywKI8tTrgpoCWOETASbHPv_LKj8UQ=": "402407000000", + "UXs15pTWYivwGEMdX1-gm_fBVRdB-wFTQOMAgYh4Y18=": "1233257000000", + "UXyui-KdOIOaACRWw54EPFFcRdbMOb0CBN1z2nZ11zk=": "456774000000", + "UYG9AwyE2FUxIE9kfFZcfvK-YJaf3sfyPosEYM0tZZM=": "619999000000", + "UYa5o1EH3DiJm2csZ_UEMajqojKaXtkpbVRFxkE5zAI=": "538266000000", + "UYbTazWQqjAgXH6RfzHbtYEdfZIWjxDtC0w-OOAOVyg=": "908051000000", + "UZr1aJUeDSci_uUC1bcvt-Q3eI4IUKt2Rzqu-y_dpRI=": "1270111000000", + "U_XPwnaRV-yz2exy6g2QfU_hKz4xsDo4iz4Eb60y16w=": "381767000000", + "U_dS7NDtBhAsVCBCwvejwUdLm0ROieBPpvchfwKP5ZY=": "3758700000000", + "Ua7MEer5P2isZ7bcJKYuYB1NdnVaZ2OAZJ5JANI2js4=": "950594000000", + "UaIDTTQX-2N2_IdWoecn2fUUOQlpQfk653SsUJhjyUc=": "692307000000", + "UaO2fFbXIBJvbpi_w6vQ6pSQ5un5KGj9aDlnGMa27fM=": "769180000000", + "UaPcoot8cKL0jD9aZ7-rNq4skBQb1F9qbLpwcNLJbs8=": "384615000000", + "UaRf8xjX12klxL_FEk5b4MBE_5oHcn2DRNBEXhKHQg4=": "585471000000", + "UalOboKAIvlykSCpaj8sW_w3U0QvF9r2-qt041PALZQ=": "771572000000", + "UbxLFovID639IPmwnjpXfMTvhQn7qU04GmIvLZsNzTg=": "768328000000", + "UcI57xyZjqlsf0EzfdUGc_kip6tcKuQCk_ToXDLwuWc=": "384615000000", + "UcQ4KZ7GmZkPeuk7idzAPG2X8bUUVD4x7whl6Lot-9I=": "384615000000", + "UckCINfSt89JKQYO4FwEIEH7WyrvQigtfOVEMhkOIjs=": "482124000000", + "Ucu1xUGg1egZh0hyXefdrV2fFSdwwjgPZQOVdxiGFEo=": "376736000000", + "UdR8dO-j5-boTtP579DSjBmLRp0Pk6rnTbuxEHPAOFs=": "1688787000000", + "UeM81E7DaaMQZwa7UPH_U-hZ4fY7Ea_QzmmgnD43FSE=": "2037666000000", + "UeZjQnt6ofx9QGtKgfe1_ndKYFT-lxBn2DfvWNpAHPY=": "463193000000", + "UenTYf2tZNoNsMEEqaXLknE6DAxbvaDWGj7CpJRJeg0=": "5551585000000", + "Uf60d9vWEUswjwdulTk3HNM8OmqbUwR6BQ7sQfYKpPI=": "384254000000", + "UfDEQXj7MFAjXzp8w-oTJmfi_k8kyAiY5vo7wgTUhVk=": "1013718000000", + "UfWYS8z8aGLG3gPE-S4Mz0s7lorPpbVAfpaVAUbLjUc=": "769230000000", + "UfwGdXU7H57pPm3yW-giVTh6oYvpioFIECGCnWoHvaI=": "641599000000", + "Ug4E4RnnN-_-STvrgvpl5eOXRcZzSDPWyYDJ8JYABvw=": "4144089000000", + "UgOLMcjiCBTTD_CiRTOz0gumSizqq_DNiljGMBhDJgc=": "648774000000", + "UhOyvN6Z-CLbhSTv7S7EDwteyNu8OJOZGvWoFJwdhTs=": "524432000000", + "UhQHcLHF1heoSIOvh2-OAkaP6flfz1BjJY7pfasRYRk=": "1476346000000", + "Uhe0IrL-z-Oaj93uErWh3SPT_sO3Ksi1QTiEKhqPeAo=": "385224000000", + "UhobtaCiy_OeaoT7XwYOOZU8iMwHmtRoT7z2w--5fJA=": "411085000000", + "UhrZDeJ_zqC3hXdGdkPhkndN2XDboI0axpwb1cfFSCQ=": "1994427000000", + "UiZg38W52wbB5qvE2jszF5fAL9rXbGFj9HxXApa8y_w=": "696009000000", + "UimSuJ61qadOcP8I74X1ieap18YbbbwPtqoBTbZ35ug=": "390975000000", + "Uinq1-5bwSYn1nMGDTfNdOCrbTJ3vy4QhKxm4VZ_uyE=": "567449000000", + "UiqsBvYggGax5EjEYIm0PaogChtYKixs4wHhyHIUMh8=": "384594000000", + "UjN5wFnOnmgcoj2yrwi2cZKioVe5nEzJ_yLOQ82AK30=": "392734000000", + "UjvkmC0QodF5VGKXXPqfpluiAWEawgOAHDWCW6DBWoI=": "1366800000000", + "Uk5Ag_J9R7e0ycD69AcB-LRihv7FF4X3Lbt0LGCDiKA=": "423370000000", + "UkELCV7nB7ME-QKA2SOT9LXhlI6s7AhKhHWuIa8ZTCs=": "498758000000", + "UkhSGIeOPl4OIMel1VJITDhFlRPfOhNMgohhfUj1mz0=": "654299000000", + "UkxEhLoyKWd3BraUK0aR1dtTlAS1NdXbydeAVwK9rXI=": "7565566000000", + "Ul8KxFM5r4yHJLVmP6M7NWhoB8bDawDUkXvX5do_CVU=": "576875000000", + "Ul9WD0EeYfRL0Qi5_BueEFMZ5n3AY-o3xcoz9FvSCFc=": "897549000000", + "UlECYtyQQiaEqg8aDNi8LpDtPWHxrjfJzBkCRQiJ2UI=": "460445000000", + "UlKR8geVktv9uOVmNgVDW6XawaqfhYZQZCxxGHAlCWM=": "379946000000", + "UlLXlH4-vn3R5Ntt0yQ23oomBJwyQqBizVtDkovHlWU=": "384615000000", + "UlsDKwT13fy8F5TQbjC5YoWX_DKzIWyZf4LU7tVrVew=": "384904000000", + "UmLCj7fni2acIEGfx3GoXOc__KbQn47tE7d8MiDab4s=": "1625155000000", + "UmZz49dcQNO2A37p5u8QCiT9Tvb-6EWaSK85sgZDQ90=": "452774000000", + "UmerpKDkIIbMPmSI7oaCEWTrt4UlT_0CVg9pYGnHeRw=": "383934000000", + "UmpMxfTakxVW-M7KPUSYgTNR_p-kI6u9L1_Rq6VeE94=": "380818000000", + "Un2Sg1b8ER2tp7xqO0-6yLMozkGv41Yxcz5v6NgWJw8=": "384615000000", + "UnEcouWj1WbwID15gwNjFWtoGCt2qojw3MqNfnegOL0=": "1156518000000", + "UnS36TzBc8i-WcXbbgqUJT3mA6WdU1yK1vMAK5eSp0A=": "2202734000000", + "UnlEegD823CuiDppuF2ZYDQHKBUyI3gBVzgBaGb10Ek=": "384615000000", + "UnpYWojCNwlL-xFqeuswmQm61As9a_-UnxXQqrzLInU=": "792307000000", + "Uofa7B__dfE_xYrsCo6KdcCkOwRVqdzhGZdMbxiM_wY=": "384615000000", + "UosWcvOgJGkSkMA93o49393X1GUFDitGC5CTYOIpHRU=": "393267000000", + "UpRSDH1l9eNgnqC87AYjj4t1q6_cYYsFQvHLEa05HAY=": "895446000000", + "UpYNCwBrEN6KdzvmVspLgl8vJkY0_7jzWHLX2idAN4g=": "766331000000", + "UpnfoJ9j_5s0SfenyVbsTe4QoQAGcH7uHS3OW3NoKtQ=": "1162716000000", + "Uq0gOD26i_QhKTy5CHTGM_SVeyffTV6Ir2dMFgyMLIo=": "1168375000000", + "Uq5he1MvlXBQtZ_RBWm7HwQBT81KJDqE9U9lYvv6rFo=": "3922333000000", + "UqV2sKYRtt3kU1pT-C-TBpNm2_-5Eg4xzy7KsYYK4wE=": "382133000000", + "UqpC_eVYbfKHOGvhjf54NzYXS9Z06aGgYRwAVCmkRpE=": "384615000000", + "UrLElx-uANsHREL7FYN3ROnL6586f53z4q7ENaUeFv8=": "384615000000", + "UrdSyfcQ-1RMCUTGFaUjFwe454M0QX16PqqFehIqoFo=": "3376960000000", + "Urrcwjcdkg4q7KoxFLZfooGeFCJm40u3eS8YoY_PK1Y=": "424482000000", + "UsCsFOn2hYBKo6PJ3KnEQC-1syuxhtirn6ox4KAqZYU=": "1897701000000", + "UssiuSdvQ3c7HJDXPd0OY_QYuZ0d2MgK60oe-HCx70E=": "16184524000000", + "Ut0bWaYMskNOMBboFmRDD_gRt0IvPJgzUGjpluYIQS8=": "684400000000", + "Uu2fvVv4eK76iquHC5pB8In-rgQmdYTEs6FjJah0Eck=": "4015222000000", + "Uu8PN-jbWKGw_XL7vVCx8THf-EcvD3dKJ3Cdd-F5imA=": "388604000000", + "UuEsj0TasmnaTVv0FWVIIfbjocDgXEQCc95Azvz8ELU=": "469318000000", + "UungguQNcXdPIR4CZOdTVmjlgSxP5gP3FF-b8-MQS6c=": "1624340000000", + "Uv-KXzmy09Y78ZPfToRulwWdQiJ9q0PVGhDXycJH2gE=": "384615000000", + "Uv6QEYRzoSVrgG364DvqPrbRtHl3Gccw-egUJDGUejg=": "2637613000000", + "UvSamsvJBb16b0P5R5tQQ-h8asMocI5J_wFGBKfcQ-g=": "4125973000000", + "UvqLdydhvEOf7wvtsuqY3P1ghgDP94S1K4Xn5gvmY5c=": "447058000000", + "Uvrcirha-kqIjm817FmNEIjWxAG5b1uLkrj6rWc_8W8=": "1168884000000", + "UwmQL41I9PbQ1ijB_tX256QadbCtrYmXbTRm4GXdwMg=": "472840000000", + "Ux5ZzJLEXHFcy25I37v145dQuP0pnmzUDPvoA0xn4VU=": "384615000000", + "Uxeo4eThs22ZnEeErK4glsYKOy1nBFS8C_5856qhE6k=": "766127000000", + "UyXDGNanq_Vtf6JJRDcWuNAK7j2sMjL--OuzUbLDp9s=": "460524000000", + "Uye4TIpIN6WS2QxKk0liz7tiAH2VwG7i86iSXpkBBA8=": "387690000000", + "UzF_WmtwJxG_V0iXfoWZXF91Qsy-_xAmcb3szQBy6-g=": "384615000000", + "V-0clivnAZjG2mONS2bsvMYkD9xy0JGU0QyPAHUsM28=": "417633000000", + "V-34dJ660H2PJ68BHwoH0bss8gaCoFg2TgfmQ-KD-t4=": "380298000000", + "V-T4luwSEroZoFz7uHcoDe_zG_xOotxB3elmY2AdVnE=": "4166666000000", + "V0GnWJ4nqOGKGYaVUyBmsCwGXtHThV_zQUpoyhECRlI=": "3852918000000", + "V0JN8VOf_uh0Eq2MeASM5q32-g3tNmbuBFsAiGO-XtY=": "863636000000", + "V0QBiqQ2jPfOnA0HENLe6_d8NsJgDxL9QK-gMOoe6fA=": "456369000000", + "V0_ePGxPFRvkOcc661zUr0x80QOVnG2ssXl2ycHCFn0=": "462320000000", + "V0j8taZ1lOVnQe19KUV5NcFwv8DKe8KtChOvMzYDCB0=": "18823942000000", + "V1HkJKyISwoAwBXcSBuwaFH0u3ec26qPX44AjCrVOAo=": "1144901000000", + "V1MZfUEaefyg5NRj1fZHj_PCoxRR_OQcComs7tSPErU=": "2499999000000", + "V1OttW6si4X0lx2dTF4ARg92fMoOwseEqZ4mulBAfxo=": "379260000000", + "V1PPps-4rPhg-tmV_i05rAS49nspeUrM-VrpciLver4=": "1131929000000", + "V1Y_NMPqF-SzKoIZ7c126JU1gzX2iiaMHUp_JxwQuy8=": "385507000000", + "V2CRf-XeQjoqHU7s7eMb0FcNuOmgi13BqpAcAPSNhRs=": "823859000000", + "V2HzKow0u9iygL8Xs7e_5vR1YuCm98t7c46U5uHX5kg=": "388356000000", + "V2nAeIhH3TVMAG6E-SSKkRoWW7_B7QewyBQOchJse08=": "395497000000", + "V2pLCt0dg5m_G5Ax6JWzBVZop7LSgmdq17oHb4OIwzI=": "770235000000", + "V4fupqoRPcL0JJBq8VlwMo7kyIowdKKyVw-vcJ57gVE=": "2733493000000", + "V4qvyItx90VkTbFfCdXWE6G373v81D6tmo2TodLQIts=": "844355000000", + "V4v2RITsoVmkGabE1HIHZFTLUtOeW3AbBJYoGAKh8b0=": "385507000000", + "V5QNzcTJt92zxV-0Y43Z4MuIN200Ff7TBcFtUtBJ7M8=": "532504000000", + "V5lq7S64SwYbrRovZ1sgJpI3TOoA8g2RMreN56efmPc=": "4001949000000", + "V60tT8okfc1NqUSAUVjEMT7bk9PF6LUXtHC3EG0GgF0=": "379260000000", + "V65b2tKex7ytUXulbmtliqlUkiSxbZbYlMcKri9hSO0=": "414989000000", + "V662FKausvBA10BVS23yh1ZPS9xAKqgztocO_QRp4Vc=": "3776928000000", + "V6I3NrQCTl9ftHJqkScD3kMtQf2EyFIRSP8mpNc532s=": "462146000000", + "V6NTlvTg_iYfPskJQU9VTkGXfG_wSDsEz3-ZP_Iec-o=": "828916000000", + "V7illMrqEblDCE8GkRcucZ6K19r0ijhAseVBZc7IpbY=": "625021000000", + "V7ivIZ7ZFVKQNRsTm-CAfDRVIsbJVbrlFWaf3ize0-4=": "500521000000", + "V7qx7GQc8--wluCB9QK09jNXbQNRykl_7FYsEyEiRMQ=": "384384000000", + "V87FwywvzcGAagF9eYlhEvEqW-FPfp_e1rfF_sn5qbE=": "416666000000", + "V8ICBz1alfmR13PpibVb_JLWi7S8YXG5WlR-Nubby3M=": "1212042000000", + "V8K8GBYhsEQz26IyoD1GZpE2o2imXroUkcIN6WDu1Dw=": "470553000000", + "V8cPHdnZGvzu8ihkJP1Te6tsvcS1_HMV3tioiCq0YO8=": "423284000000", + "V8kJgPPaiy8tsv0jDfnQaXq0W4qjjfLn04gg06faH4U=": "3254676000000", + "V8oHwA5ce3XTWSV4u3agxK2ZdFqaXNjhllusv1GpK0A=": "755057000000", + "V8orGFFBg1V6S7h5UVqSK60D4XRMv_EenWHSynTkq08=": "703293000000", + "V9HzFhdhDYP5vtPSIwwsBQWMM8fsSxXqn_2vgLw0Mgs=": "411085000000", + "VA29kemGQ2BlaQsjkdQjeoVA_kWqAq1VVuXMCnQKB1g=": "4166666000000", + "VA3TOblhncl3U9fFt6o0XhahF2TIkVJuJ_tV2z0ds18=": "404714000000", + "VAQF3wq2NSmtjy2pD2Ot94LT09mrLN1eNt1gE_2yhEM=": "416673000000", + "VAUouEmPlR7nkmtXd8rmPY_3BAmtYzCQ-3bRtXUxCG4=": "1892615000000", + "VAeFxP4OexxJlXqpux2t069_M31Wq4UIpOWp6zfLWY8=": "384631000000", + "VAjxE44_TxdRmXuKYzFYhd5GTx_KfPLnP1VP0CizJDw=": "385505000000", + "VB5VS7Cpgu4MVt56_8kF2Mh7Fz6caGtp9CoYKxGZjCo=": "1759925000000", + "VBPaQE23jt8pylNVb4CA0ch_GX4Jigd7ZF3s-4iCoIk=": "382479000000", + "VButF9IwYLzNl8kMbnjweeL3i9c0hZOEqnOWmPL1p3c=": "4090348000000", + "VC67fmh3QWHz-vX63QZg1E2E29eZUP8LZZOPsQ6rK54=": "1629719000000", + "VCGzAYNE5g2ngMRBWHWP5a5Ujfc4TGgr3l7ShvqLL4M=": "387617000000", + "VCRU9k9NoUgkHPaEbCt2xyWZ_WF0zLCvW9jfYHXbv_4=": "2692307000000", + "VCWfYnMzFsFkjGrKf3E2akx_qYPtHrRjHqveVvEk8B8=": "416666000000", + "VC_gzn4nPg5X8waVIgHCwHyu9wuG1Xvhrjv1Bm2GzyI=": "416666000000", + "VCfMx9Efojx0rQdHZ-Xx0PExace2ldbVRs5SFqcvf5E=": "416673000000", + "VCunRNkqjAHYj7gAYmrM9iSSipfQTBoEfyVZpVNY6OM=": "384615000000", + "VD76_Li8Dxt5p6ebQBz6vqc6YsozImAmIDfg55_Bstg=": "405229000000", + "VDCzgO97TtKOSg2OY7tqBI3IVIhftuierkXt2Zse9g8=": "906558000000", + "VDDHOGsFF2mcCzhiIGY8plLkKwky2056Ogb5mH6Culo=": "454545000000", + "VDKUZsmDX2NdycVudx7MA2xW5AnFhVVhiv76ADLEbQ0=": "769230000000", + "VDjPkj1G2WOzSTZYPYwHtecgoUaEDLASt9cR7rK-dtE=": "626923000000", + "VEXIrgHU30tsAZ3XLxR5crWClxqSWkIu72BztM3Y-k0=": "423177000000", + "VEXUk9om-gdAiInhVyn4-22Si7fSUX7CpYXqSlxzLQc=": "38550901000000", + "VEYLoODg8Aq_KUCE7XRRbCamIFQnW_dY3SmBKFFINZ0=": "769230000000", + "VE_8btwna7tnYW0LStu7Q1d042uiRy-cggz_LuS9n58=": "415631000000", + "VEoOUJxBoNguKpMNlbX80cldF7PMMzGV7ZxW_wssUPs=": "382165000000", + "VErRMAhhcBby25mm4Za_3XlGIMviv1iVgv_l7kz1pN4=": "383733000000", + "VFcr9N79rU7UxDNTXL9Bwoa-PUAZTMRpfQd10sxGz_c=": "2556525000000", + "VFeeCgp_8Y_UR4vfq10rrYtT5dO8UJNXk7a8u5evsX0=": "713625000000", + "VFqz34HIoPTWFeZh6Js6Jjx4k1AKM3h4h6JJoWPdEPs=": "454545000000", + "VIOFAc6YBzU8q6zjmzI-bl3FJNh7ukZv8tUi52DrcbY=": "846741000000", + "VIlh40RlCyiMjfBatu5p7-5Wd-n2P-zQXiT5nR50GFM=": "416666000000", + "VIm7xLMxUq9fnOv3-bnC-vT8R7TGN__sugvtwW0CI68=": "1249754000000", + "VIrLxIzZSIORDMpTB0R5hcjA9Fbe8-YLTg70FbtNdMI=": "416666000000", + "VJ8iv3KEknFpNDpTRUysZy9QrT8eYv9fL6de3jJVACY=": "382483000000", + "VJE62GLzb6KYq9Ihi9GRIr9hdWkEbviQ94iBJ0Tw9FM=": "1927528000000", + "VJXpdiF5oNpXciAAyJW0yWf6lwPeBBWJ7r4GdvR0YWM=": "499999000000", + "VKBL1KuxeRH5tEtOXaP6rT2AU9ZMGTCInFPOJM0hmaw=": "983799000000", + "VKNXIjNZ7U_wkNYRqTXc7BbpWOJacONNN0JTPRHNNgM=": "769882000000", + "VKPOvvpdaiIWor1Bsw0NhTCP8fr9Zid_iXXYC414oLs=": "1153846000000", + "VKrpxm_1d2a1OWXWIoZCeu732QbEduU_XDf7GvO8WbE=": "454545000000", + "VLTt4f3zcFZkIgaPuau_bWIzFi9l3FaLWGE44w64hHQ=": "385507000000", + "VLZcWMmMe0b0vcKU_Uej4gZaXP2zNVdJywXoYKfWC2c=": "4026000000000", + "VLjnNw0QW2-glgprpmOOHmB06Nz_y8s3I60bI-RKYU0=": "1196011000000", + "VLoKsrRTv-x7Sj_ODDBZuKlgpzT-pQIbq7rUnSQ10UY=": "385507000000", + "VMVx5mmDHQfIDUa8KUNHaOZW9gi2mUA8ykHzKdOo1v4=": "1038990000000", + "VMWp4lGy7hRq8VRhuF8kL5pQpFSrqMrcIg6o9uqN3pY=": "1923076000000", + "VMfwud07--Y0akmNiC1PMEc6cDFiUr9evbcOAipIRNc=": "894454000000", + "VMhwfn9tQzsDob77J2fEJYpC9o5_6B2P0WCNuc2xkvM=": "810455000000", + "VNHMEYkwTLj6fQqGMf8YcWJ9LukG_5Pub1AQQ_veC5A=": "588869000000", + "VNcwQDRKvTh18P8-pnhEeuD2lMWaRnGui-4J7o9mEQI=": "462146000000", + "VNrNzUTmEyGjiNyJnU5WAIrdQ11d9Q3Ce9j4oEEpj7I=": "1156520000000", + "VNvgmRSnbwiC3rpVgY55n32osZSMCI19Iw6bB92Mlv0=": "541376000000", + "VOYbxqutKqmhScXnoi-6yQzNqgVWQJ5cGeiHtq3cgp0=": "385153000000", + "VOd_r2jZO51AY6N2aFn_05udoucnTdIh0imXBZ-ezoA=": "385507000000", + "VP0iXlwL0CMW9cp8Ikfpa3OSM8FdNK-I-1S1qiL4_O8=": "383197000000", + "VPNRTSEzn_9woKyiv9NNyGNUalJUcW2ds3lx9l6v-jY=": "407469000000", + "VPRQnHZoLYia5pEDdCBnnQ2pYMNXrUprVqzyGfvBsso=": "32338450000000", + "VQ_2xE-KbTPRurVBnBeKXKkbxRl98r_Rup-U-0clykg=": "692307000000", + "VQk47Uh4IQ2FRMsIBf7B0StB8ezfvs35jKwwuGIwAj0=": "536047000000", + "VQmQUeI4YU8E1hLPDfeMHIBczCAX5K310avt456Q0sw=": "1153846000000", + "VQuO8-ClHyllv4ErCUxRt1X2UgvHkFOI-4cJyUx2y_0=": "384615000000", + "VR5V3M5isTXEzzjWlOzT19rqBOcEr2A_Y5OJ4QM5C3o=": "1134504000000", + "VRS_UyY917URHvqFEScbj3TTeYMcNMb4I3uEfuMhCEA=": "384615000000", + "VRgWysN5Y0syI6eM4UI6tb3jKgs9sFxWRadpnMHJ2ow=": "381632000000", + "VSszP2oX_65-d38RaZMGYTmxYewUZU6wuGuFZDjO9oc=": "423679000000", + "VTAh2byHmhkgXSgKi4vsavXnZSLShlzqq0U7WBW99BU=": "468923000000", + "VTfA7d1N3Kai8t9sSUYfDcwYYB5L3Qxmh-YLRrASvec=": "415629000000", + "VTiuICQtcQk0BACaMO9RPaQiX107e9Ed45Vej3GgQuU=": "458982000000", + "VTj26JAn5rwZljfdT_ObNqsQdehtCoZTaPPBmS-D0J8=": "387216000000", + "VTjsVgDorijHesX5KGdjlKrPNULpargBp6FqWayOOLI=": "499907000000", + "VUStFS2yZ9HQ4oMaVyPQAP9CULH36OzJsWi0_L3bqJ4=": "731217000000", + "VUbR7rYmgHmHQPwNZt3ziSlgZCz3BLrRLO0OOETOp0s=": "385510000000", + "VVOqXCM3rDgDHULSm3C10kGOWiPEqcC6L2S1nQr9iN0=": "453981000000", + "VVc9Xsjz03JhobwrcbfZwleB8Se93NhijB2vghizfew=": "378090000000", + "VW43NkFhlkaX-Lg1JBbGioylEG5jEpDUKAAyUi1Qkwo=": "3790313000000", + "VW9vsmGVwjmRe_HPtSqwz8DW0LPpAYUmB6_rW-6-DK0=": "498093000000", + "VWCcuYnbgLn_1ldMuXqmKRbnMmFs6yuk3akCmpqUAs8=": "765925000000", + "VWjOAWSJxxoG8Cmo-qo_JI83Hc4x-EUziCb4Syw4XV8=": "382394000000", + "VXfEgNlbVPn60ZqAtnqfq-C5DQTV4fqJ-awicX_WuT4=": "459105000000", + "VXjDsXD2KGSPYTgWBqLhcYBMZ7evuep6W6Sy2zuvLWo=": "4165782000000", + "VY6F-N8mhCMNQHOrsqnWRU_fwpFAd8AQozJtnQPPI0M=": "468609000000", + "VYCaBTI9fc6VKAsXvey5UvWMJQosudmMhXkS_8QS7jk=": "647762000000", + "VYefOPMl6fCjl9Oj9VFCA5ptUdVC0xuXxE5s6c9oZEU=": "458262000000", + "VYs6R2fifcneLKez_jF2RNvGdmF57kygKnImhNpj-1I=": "1935352000000", + "VZGtO6SDD1pLG3kcxhcuBcihcBOo4dnLQk6D9LozgA0=": "393616000000", + "VZNcblkgKpXvJpUcB8DzYKG25fB5pudN6eOsezRsSFs=": "4524370000000", + "VZwtDfqc0AwyhVz5MnmOlPBdlT5usy1Ws8g-wZEy_Po=": "576923000000", + "V_6MgG5LTWuXw-pPmnJOuLizZM4RSpC3QpX7x3VxJtk=": "545058000000", + "V_9K4y_OW3PpT2EgCPqJaSzN_SP2R8AdaVcbah5hhYQ=": "556085000000", + "V_wfW8SybcNCNRWRxVNbcz327bJYKoGzpk5DBYZ4ZyA=": "769230000000", + "V_yhXKRPFWrId-oZe4DuoVFeUrzAnCG4d34uQTlT96M=": "384615000000", + "Va8h43_7VKvQ8lCCJTqy3rcLvirhr0EgdiUp-MxkfvM=": "384615000000", + "VaADK-9KyRcwdLHZOFLEfh6LFyXs40-hwinIuNzyxO8=": "384615000000", + "VaJF58mIIj49zaYGzq8bnt5svpJ6knE9FbtnZD2gBJw=": "384615000000", + "VacXUG8owWVPIg16z6pYDlEl55OKNK8DbAFfC9G5JmA=": "1153846000000", + "Vb9EK9J-8kOnjiXrdu56niFgdysOV87UhtWjEeimp0s=": "1153856000000", + "VbRm-9QYqgm_kLzMh7v7KNONxEsqWhUu9mBaSoeivEk=": "7472057000000", + "Vbv_ovtDQu-mLNMxeFpCvpl9pH8VV2EDrZAN7pscwlA=": "367830000000", + "VczgcH9djg5CuhJz1bwmoujDpbMwtwjrKWh9M8dAHmU=": "385209000000", + "VdMI0qkgAOwvyLV-M7siItl-yJxCMlJ5aQ3EvtZxt8I=": "5012427000000", + "VdTCWvwv9WBj66zsPanKM9aUI87fLaGCjJOiqomUD8Q=": "384615000000", + "Ve4hcumLK6dC7EzHaMlf_b2AfXvq_-HWnbmzUXuDKUY=": "462622000000", + "VeEhWEfSRKO0ixxhOkzF8oKkSUyNuWeo5X5ZN8nGGMg=": "383472000000", + "VeFiIGssicbWkILdTR9p0oaJ9V9_NjoBzvtyZvx51KE=": "488135000000", + "VeKafH2qUZVHjMR1Mz9sTrJaUTagE7qvN4mD6NquFwA=": "583638000000", + "VeSjbM5blJtqiJhtIqw8FvCSvQazmBctLoBgrjSeN6k=": "524553000000", + "VeTNCbPzZzloM8raKM8rEpjwvzZIDGy3qbzlAAR18n0=": "416666000000", + "VeUzwQAeEnlB7B6Pt58opoI8F3yN6tRpPGToQm3EbP4=": "2391335000000", + "VevaOv6OmqTsxCjJVeC7decML-kgdFjPydTuJrnpuyI=": "384478000000", + "VfTtvKMS2pVYCJvPKo47jf9weXNGbrvu9lWj_a5Iu5U=": "423339000000", + "Vg6qonh4roFT9fDBMpKuR8sGwyVrbjHE214kVS0eipM=": "384615000000", + "VgTP0jLLgu0IVnxjvYXVZBJS1ojCt0x8TT0DGWo1mSo=": "4233446000000", + "VgljlxV4AOiCmIZt2smyGKrA6BX1wECnOQi3vwJEEyQ=": "378010000000", + "VhBp6oabPmsgu1xH_gNgdM92-TK6eeSaZ60wVwDmZfE=": "767923000000", + "VhEpsbpRESo-cBs3VeP-rXSEttwcgqFNhBF_3A-FbG0=": "495359000000", + "VhprsdGm9T26eSIh9UV53Wscp8usoYqFL8edjnrdWjU=": "451014000000", + "Vi7uRsxhBEoWSuNCgbKFR189l9vv1w59QPsZfkzvenc=": "374878000000", + "VipgzVFfe3R90HBD0jGnM28Ay9KLS6CJIoBLWXUoTtw=": "390530000000", + "ViyhxlrApci-YLg4wqWgZwZ0o8aOxxcLPzsTLdcPwU8=": "416424000000", + "VjKVQuy9IkqeRsm6ZbKkDcYl4SCEvyuOxqE_vDfQ4W4=": "414405000000", + "VjQE5btFaBZTYO4VR2H6tTOkuyLvdhlNtjPs4p3ZAkI=": "380589000000", + "VjR3SRiaCMw7YsTXfRe0xP2NuqcWL0JqDsXyagYtJ5o=": "2114239000000", + "VkCiLZhFvVOPbNnx8ljRo5MKSjaz99o0HKgK-rwzPig=": "916545000000", + "VkYAkBWkXSrtKOD05EWoeIWf4N_I___XnHX9fNt0fAA=": "4000000000000", + "Vkxthl0snzwfrYkK6SUBP0IR66uEAtuXh4w0MBY2IYY=": "3846153000000", + "Vl6hWSdUIrVXFS7xQ3eFY4XKu6PsGRkjOlVl4Czu8zs=": "381635000000", + "VlMcQqMbYM9xJT8sV928e4RRQVqNJtxrKqM0pKZAw0U=": "636539000000", + "Vm45eSvBAUvbasbI2n3QRTiuNJBo3Vl2Zv1az5sTkMQ=": "3780062000000", + "Vm8pILX5aiRhaIRc4siggVOJeDK3BxjAA8bZl_IiITc=": "1272563000000", + "VmOhDNYKjkHyk0n3SV84zBthZ3_eZNKioFn9MlGU40E=": "1387699000000", + "VmbalpuL74YnamLzt7YLKev2Kv0cdi10-LCXyLhlz7U=": "504754000000", + "VmxND21U5_GKDkNT0BVgfctVyV-bbYgcJsdxX7VTfwo=": "3749635000000", + "VnBN9v-0xK8bwNBp4a_KhkjoSoEW7LRSFWZcn8ameXg=": "460124000000", + "VnbllZzl-7cYJYXb7PrRbnXH-DWGETNI7dN5HXMfeDE=": "3257127000000", + "VoK-u_Hr2DAsMEyh3zlUfUWsuw29JuVn7T2fhdr6UhY=": "451223000000", + "Vocq1Tc9DDmLO6dulClmsG0KV1-GCAxk9sghDX0LNTU=": "1153846000000", + "Voe0Ngsh4xTMzp9Hgu3mOAvPsJPnZnDzmSao65FOBfM=": "768403000000", + "VofAcw4heZOBCU1qsy5ZWQL2LjCsdKHF7N6I2oAxhuQ=": "5105896000000", + "VognYDX3FXTymjyXHlF9fyo18TytM5dm2QlZTZq8ulI=": "1353804000000", + "Vojt9k8VsWWJdbdcBzeT6akBwCFULGHrYSnmdb0VfgA=": "535855000000", + "VoqiF3-MztTMlSojormw-o-cbUbaB_Hn0Y4oqIU35qg=": "4999999000000", + "VotCLnEXYktCTuFAHucL71NBq4tWKXmP9xXESKz0_UU=": "355204000000", + "Vp8ILp7pZkmIE7EmtRBnxm6jjoE943bx0j5qUk5fyJg=": "1105945000000", + "VpQDPbu3uMMp21fpltjNOTFePOoLhPnM-YUL-Lm2rJo=": "12223836000000", + "VpaxSCe75RWuuma8nqT_aBo2zb-F7iS2XoKl5UsKuI0=": "453196000000", + "VpdA1nz9iPYN0tWXA5YTM2i1Ye3M-8iNdeEbuEuemf8=": "384095000000", + "VpkVwTFZcxDd9Um7fW_HkwCBuwy_Ne2wtsv5M7bIRHg=": "1252906000000", + "VpybMOheqSHVkJsUnIwpU0Dk4LFr7O6szNxhOA9amRA=": "384615000000", + "VqY5OtjbKKUMfdi_y_WoIpEc5dhND9bG0vWRoNcE-CA=": "2259668000000", + "Vr-5WozkVuy-9LRt2wWlV5w5__8-slnw-tRyRROOfQc=": "2296901000000", + "VrNDKXl_iTXfGjk3eqp2KOKc9Pw_6GrqmbFI1Z5OKTg=": "1317145000000", + "VsJV0fJyXfF2fFpMpJh0yR_FWiAW18fkPMB4eI9TJaE=": "10416666000000", + "VsOLLNp8q56grZO4wjzIL_rpOLH4DW8e_fKLRA9jdNo=": "460896000000", + "VsOxPC0vwAah8mhaMUyrgDWMsnoPzh_GqOaTLugPJ1M=": "1580672000000", + "VsSTaOOd6Jr24JUvN3n3ENDYaLkshRS5deaBB39K0N8=": "1349423000000", + "Vsbcl-kuioZGulu7K9EgV4RbXOiAOarMtYTwFCzubp8=": "9350347000000", + "VsdLLVdikrZQ-kF-GF7HfL2m4BZMED4MszAokFy4k-A=": "385509000000", + "VtIqgyVVUH7bOBmiRpXTiN85H54XQOaCuZ-NGgO67u4=": "681818000000", + "VuTBhZHg_BlyGStawM_7osq1JUAuBjXl36LQ4HCveUQ=": "384615000000", + "Vv0BsZnN_Wqtw6Ocx8keARuu2H6A9Slt2T9olza4R0M=": "507660000000", + "VvCGxL6C4OMQBo7Z7lCGFZjM7624kkctqxWf9z71A_A=": "830923000000", + "Vv_Pwng5kzRD_O6-cZQUrsb_yG4xzLhI0c0DkIaaNNM=": "1542685000000", + "Vw4x4reMyzqu7RFbshAnbOC2I3NTYpnmMb7baC5YhfE=": "404758000000", + "Vw5DGwJgxSlLvJzO4HmlzKvMwJ_Fp4ZlV7AZt_cgG1Q=": "384615000000", + "Vw6hdc_hYpUFaA6mV5mMtTwNrvALV2lefMG4uH2mob8=": "446985000000", + "VwHmhh0xrJSAKmH25dJg2_zWy_G0G_2yaBgj7qI2oyg=": "576463000000", + "VwLeaJWttREkqBrGHt2OFwItq1LQmw5xdGr8rzSBlaU=": "810167000000", + "VwTytg60lrBDzSIr3367NY3kWvKNEkBsJYOIdSpiDTE=": "749999000000", + "VwVSGJD6yYGK_R1K33JJZQzCcrVxUrYwhdxoi6uPUgw=": "417636000000", + "VwisY3JyXnorSx8GK3N3VMLqG5VYJ5zfg5aWjGlitNE=": "414775000000", + "Vxbff8sxE8fG3qkIYyBHARcnfmlaFI_5jP3K0QtIYv0=": "462701000000", + "Vxk5nbiGtSItoObAcHGhi79I_0OmqYGtTqPyZmpdMQI=": "1513705000000", + "VyJSS696Iy6osOXT4SO5IXx9RDbjeMxSoEtDw_V7Arc=": "628328000000", + "VyXggLzXGNebpTb8-eGqOgPVq_oJN_lSLPLYQDUxQEI=": "653846000000", + "VzRQxPpWrn4F-6Pr8lkXx9DFI_4LFbhYKLm9gbhjwQY=": "769230000000", + "W-194H8a3TarKLAqzXtSfZX0a5O3ehmzbmvRRtAMNN8=": "1923076000000", + "W-2N2lGQ0aORw0-zYTa5a6CgjSqvmrQF2Ad_ms8FWeI=": "378611000000", + "W-4HLFYHh3iHoOrQZov3z7OCJztfaQkoBReiY2rvlDM=": "2096364000000", + "W-MkF99n3s8fquqTC7Y2Ld9AlhhdxVpGqSAjs5Qh8zw=": "18858682000000", + "W-fwfBnpfAeU7q1IVv-JeMszytmZ_qflHt-nXSH6rpE=": "8860783000000", + "W-pPiB1JzaGfbPcqwJ8i1lPDxYJ_NPSjRDKJze60JWU=": "5177637000000", + "W0baKn9Dsqrl-7adI0EC4b2CUYUnX2XkrmRPEjKTMt0=": "4246350000000", + "W11GDLlpd0297a7VwudpWaL6bsVVV0Q82X0MG-PMMjI=": "3681201000000", + "W1FSyQq_A_h6gk6W7-bjgrpOhYmagOYsM8m-xzRYm1c=": "788081000000", + "W1NL3cXix6-UzOgCyjnlDMIPknj2MaMXYJSedCrVO44=": "3410403000000", + "W1W0ZoQmGyerpp-qnEgsU0K8_y_w_BhtP6ApkD4K218=": "3640467000000", + "W1tM5589c53iKf5xEsW3zMkga0bY5OAHfcs9q6oCJPs=": "379203000000", + "W212sDMsjIPkG9lfKvtBS6sAuLrDZ3me_F9X1dpMFS8=": "384615000000", + "W21S5eiG-VGSQk_WLiAkaea_HxlY92hYJ9ekC2cDWVY=": "816925000000", + "W2GR7RllRvB2FT9sgZmTmcjfPt9sRSw3RtnKUqnxQYQ=": "384277000000", + "W2Orv4Ix1TN14DHULEq2KRLxiJH_gHA_u1Vh7qQE4uI=": "11348994000000", + "W2nOPMvBSXoKKo-9Nmsm9hUcmOJAHMMb_6Rw_eTRaXc=": "384695000000", + "W39gqN9Ll0VPEIScBkF_zQBXqcK9SbsAfuOLHt5meqY=": "378206000000", + "W3H5OInGhj3qp988eptD-AJ6l1YIplaaf68pcVAThbo=": "395499000000", + "W3LwUgaxcK8ismbFvEkAP62QSP7iWRFcS7F7dxZ3-bQ=": "4233705000000", + "W3kHQVClOhXxrrDERSQxozzS0QPXCBa5EQ7zZH-HFlg=": "3846041000000", + "W42eLMpAvyNbWx9k4zLjxcXdBCHe7TyKS5HME55mKfQ=": "6350849000000", + "W4EJ7ZCghB2tPxdrilF7s1zEb8qBas6UgWsZCR9pl-Y=": "384615000000", + "W4n7MC46gWMCcCVoawsvshHbRWhMIpp_C7QeMMWIbYA=": "413226000000", + "W4rNMQSlbejKIyYPZ6XlY3ahiG9yEroxghK8luwxjYw=": "385509000000", + "W4xkZlamglgpDgXSeVXaWK9JZl33opHtq-7UdybfKoA=": "6869158000000", + "W5OFa3poTHGe24kOD18ImLtV-nH9MO3BFiKN-MYV9Ng=": "384615000000", + "W5ccPpppiMQVzbKSIiveqO5PvOmei1ZXl7plqSY4DBw=": "6533662000000", + "W5isIuR5eoe3MXX3wVe5VcWiyQPh4-mwuOBJpgnHeQc=": "3846153000000", + "W5mMoEm76ncaPHCoSP6Z__FAeacevy11JhP2r5T3Fbc=": "7097544000000", + "W6B85uoflOgBlbRQNnCOurr6ebqQaK0rRq1zEzi1X3E=": "384315000000", + "W6D4JaOAVpx2uqxvgq2KnFV-l5keSh1PKndYtOPBozs=": "2278000000000", + "W6DC5D8O6HiKKYUJmRfrho8ie0KeBbh8rcTuZYJKDzE=": "384782000000", + "W6dPtPIOygv0PDYvlh756R-u0qnUPfjC89nqROKwgik=": "2026079000000", + "W6kU61hFyA7jbOvAVmAWtfFNFN_f5Znw0YR3Q57pkcE=": "381767000000", + "W6nnkNp8mNeyQ7DYyaH5MkFji0cbwO-XB-_XgBZkQRE=": "1499999000000", + "W6wkLGkpQXvBpZInrFsxaVAEj9q82bGmjw-44zzFFjw=": "421393000000", + "W7OipwQOkMWzwpUE7R5J_BIGnLAz0133vwy8RdvHZhA=": "405357000000", + "W7PMxZ9w5s0u7CfqqeUTolS1NtVUaBbGg168FuuUgLU=": "903178000000", + "W7ft1dBYdixkwW11bnLYwO69c-hbi0qb7OUAR-8jusw=": "6278889000000", + "W7ikjo5iQFJxX-iI8W8gSIukzbPdL287E2MBXCW7lsg=": "457885000000", + "W7sWYbwpWkxHLVe3qbn4y3JooNkP0cHafFvpOJHOT4c=": "1693482000000", + "W7vmbmI0zOuBYVD7EIWHwIduO6IQe_OOn-Yq1SUwap4=": "1038461000000", + "W893D6qaXwFElU1Wht6Yll2PbOkYtluaIFx6MDPKPw0=": "7529372000000", + "W8u5Hl6v3ZHwjoRwf_X2_l_NC-0vJHN1aCUP4EvldTc=": "1522339000000", + "W8yIGTOwSi_5d6hLuBzq12aq1k_K32TNs7HYs3MmICI=": "462984000000", + "W9OGyPNLaQOvviEVXG76ZadLzS27NUi2-kgJ8BjCQ7w=": "1925698000000", + "W9WFl3xk9hCCN3bO6MsBYvLJaaaUk7TXq3bNLkqhznc=": "454275000000", + "W9fHucoM5TOinfAzMm5pdHF1t7yAAfaT2eM1zCRNDZo=": "379260000000", + "W9fgQJP2lwanUCT_0G-rwdV-m0IX0pODyb9X-wQdlFk=": "616791000000", + "W9m2v-TQXC8uI_H1L34UB21LNyoX8bdEtZLX8K3BHoE=": "473848000000", + "W9tsPAVL0kguHaQz8Dbh1o9O_qotaCgGtuHpUqGK5d4=": "407808000000", + "WAESGn9NVU73JvXYe7LqgnNpla1kE_GfEFSVV1VR8_E=": "459921000000", + "WBS5OiVRsSVpxvWEnXoAc2U8gBPzh0MLB5c-el4e7Ho=": "3806212000000", + "WBaGgGszv19xd20pvCh6eRvd3PqH3XKDJMxlWy6gXYg=": "381635000000", + "WBpoWm7npEtvjR_NSzx27GIJ_y4tA9TppPCTdn20BKQ=": "384615000000", + "WBt1i79dKssTvCMZoHr_YXKkwIu9NY5WSX0Lblsh0ew=": "379203000000", + "WCBnt3od_cEecAGnTlLimYhH_78HkaGc7vQ7G3nmJjw=": "470116000000", + "WCOyUvnfHbcmCwgffKPLRt9HaO0t-I8mTW4wmXhQLdc=": "463439000000", + "WCewwfVakHAJCCcRFZT5kCxuQY0M5C7qYI4jYvBFiNQ=": "384615000000", + "WDCOkQxq5higjKJ021kl8fyBjMWXNfwmlwKVOo6SfmE=": "416666000000", + "WDMa4kgLXuTOGWyFnqJW79tjGlpceasXt0WQUixfER4=": "576923000000", + "WDbJJV_iMEh3t172D8UT7Z3MGQ-mt1-Ruk8TpaU4Xjk=": "1942114000000", + "WDhP2Ub_QukcLpRxuH-Bt7lVtu5uY5gX97SEnR7nOBQ=": "376454000000", + "WDnRNr24zQmkHNJp6W1_34BoprCYo9hy8bVkG05GprQ=": "576930000000", + "WEka3b3N3SYXLy9i67Uc7Ea8_NnPKZPXewgGTxdZ7Pg=": "1538461000000", + "WF41GlKLegYstBFVvCkJzhi-Yyr-mGfbCaSOo1Ad0AQ=": "4166666000000", + "WFKX5GwyoOn1Xp1crOztuCZW6mVe3mBCtTfmJ_uPLkw=": "17003535000000", + "WFiIonu8rIH8s2tKb93P4caQUcWutSqvCwUwXhuOpt4=": "751952000000", + "WG8rQo9SpE_h2vwyVFPL-5qcD2hmZ_QjRbP80ZkKzC0=": "383695000000", + "WGZ73u0AsL_yYxYJb41rpynvcefq5NIvUZYsVBmEIZw=": "500251000000", + "WGkc-RjZqFWNXM3A2E_EYYCD7cXeVd5wnq-kvDUc8IY=": "765373000000", + "WGsmuCEmNbtXzyixWM7JVHJry-jG758KPTsVKybPMqA=": "384063000000", + "WGzT21p0UjGdOFnKprpEWjrzSRqgXtpJpYA6_dYHZn8=": "453282000000", + "WH0GD6EzokjSt7uDsSai81qXIgYtrdn5z7uMOEgT7Mw=": "833979000000", + "WHdGqiZonCJzG8gsSEqcSG4ocsS0TfbrJPgJyObxul8=": "386418000000", + "WHtW1wX0m14TRx9L39KkKlo9IKcycnc415tU1CvZUuU=": "769230000000", + "WIAwrc4M0nZ8xkeitxy4O_JQEQ7Uh_6rS5uUjFY2MEw=": "377539000000", + "WIIpdqYe88MO80mh1PaCcSuxSOOCU6IAjuNVgRco138=": "381805000000", + "WIh1Ra8qkwOosEY_V6fow-TJZn_V43Ud3xiAdq2oRHg=": "384615000000", + "WJ6yg11l8y7sQS904Ql31UgMX3nsMrc7aPEJf0cU1f0=": "1156532000000", + "WJRBtNkp8KTic3P6_tSrCMlzGM1bIV1s3qaVOU9A0CM=": "10909090000000", + "WJXhtHFo1yhlXAU5QGHv_XxMHyzBVe-OdSri4T6SFQ0=": "462320000000", + "WJbKalGocxK5QsyUvJ4STepEZp9RMaldQBTyDUfDLGk=": "7740041000000", + "WJizNHjHIpqG26qy3mmWUJvJ4MIqHz97gfVEjkDfe1Y=": "460532000000", + "WKU9Dgpyd3HjExtTccQMuMAeO-hEe_DNjo1fcNvegzs=": "832869000000", + "WKVwEW1N4V221SzIxJJX3I_eTD0OjDwJ22pOOWsU_GI=": "423339000000", + "WKcaOLTKsulUzoQa4JidWWnSVk_gNKQTApBzLgyMSbM=": "497906000000", + "WKnpZMF1FDLYQLMdYHNF2_G7tc8JBYZnbA9O-eXauqs=": "18460519000000", + "WL-0pRn1PIQsKiD8G5usiuhvmFBoyaK_7hV7G2vMH7U=": "768527000000", + "WLDGVKmwgPvNZxTtN_lVxoHB6CS6WEOM1HdTkCXxO40=": "779722000000", + "WLaMiHgfwlw3WYhhRN_4pVrusp8bQ_0a_NhOWmoylxA=": "931449000000", + "WLdB8EIgDyhlBpSlIlBN5CnLMteIWCjOIzVB7-tDOuk=": "387062000000", + "WLiALQ59D0mb0s2_FvmUzl3x68VpXoql40vK5L3F3-4=": "570653000000", + "WM20DecQ1YayFsMV3ithPNDWzyPOAdIyzBydW1fZNiY=": "24356165000000", + "WM6hGwUA8s6JrvY9a9aroCABEQpDNi4sabQ16Wl5Jw8=": "385507000000", + "WMdkWL9sWYqozJHnqPjmTtmVF6yKPVTxfbKwW0VQ9E0=": "834965000000", + "WNC_oH2AkZyqxisZ8CPI5VPsFm2ul0k1o0pZbFQwFfs=": "4356972000000", + "WNGbYsyVuJdmk67YcPntPdJPz6kZh8etVncjKDlS3fg=": "1958333000000", + "WNJ2LOIYpRHIPiit18aW1oMMBZQLHKVGo5iLmNLELik=": "3999999000000", + "WNQzbnsum8b5D1WAHchA_F4Un30OmhWuGXz1Fu1mcYQ=": "469693000000", + "WNWkWS8GvXiqokIJrxG9SgBzh8Ne2oJ1F11lWGyTEI0=": "9401467000000", + "WNa-5fGEIhgLwxihP0DqJQfRMRN4B2o71W-QfX0h8Lo=": "418405000000", + "WNb3_S7H6EtwnfISv2R71MxdyhTPh-QPYRJWSL4BUl8=": "458897000000", + "WNdBlF8c5uJIkt8mhLeMEigwHiCobrH18XmUGyla2A0=": "1919945000000", + "WNirKNJh6v6mZMapH7iLvsvNQTkdDf-MzBGQuggfnMs=": "2081444000000", + "WOAyFtwABE2iUYDXkq2BGNudT9PJR7HPCdwle82Jr9I=": "769230000000", + "WODdwBIVYpGzDxa7QjU5LuBmcSPu455B3rmPg3cMvFw=": "473331000000", + "WO_PzzD1mfu-GPkMuDlrTmrB5ODDU0fV_8VUAYtGIwg=": "453998000000", + "WPpy_lFybh1-msOMmddCj8EkdAO0VW7LhxfzdahHxnI=": "385446000000", + "WPvNGiG-yYCaPbZkf4Rf0otA8RDspH1lpr69YZ9E0pA=": "1155974000000", + "WPyQfFOo-3F3UowK9f_ITZTOU1aI1NC2fixXTixtxTs=": "460910000000", + "WQ4G60CI0mCrR9nmPwATwvhChvyMwpupLYm-um1IBEk=": "1962122000000", + "WQNdc6NwbGA37kQYUMdFyCqk_OfCD6MbbnGRSrskXOk=": "15254845000000", + "WQTM4bQzYvVT4hxms9VF4ZLalQ7N0SYCdA8O4iY44HI=": "2007966000000", + "WQWwxp5xp-Nz4yYKgV9ml2sd0m0RhYcOe5DFVxbq5uM=": "645826000000", + "WQdXA_tXReeH4gj6qeS7Ve224oWefbO1K_p1VbO6bzo=": "3790675000000", + "WR39qA49oFOSnSQVANzSt7dmG6H0EOWgi_7OROVUm44=": "649822000000", + "WRRog3gd6tb3otq47F6irP4DLyVnDDEavlWDsCMcSVU=": "3282012000000", + "WSF6YrAx41wscRWJ0kZxSq3qfBVM234txoYWoKvaRuc=": "764788000000", + "WSid9kVZlZW8aITBIKrHTlT_WIL48HqS9v-w-oGsdrI=": "1173056000000", + "WStEhhKnA8BARPf8j7L3erCC_zePBevCdSunmpgHxlg=": "919047000000", + "WStfPgKcGhdzzpsQFmnAZzlJZFELWPQM1IHxXgL1OiA=": "385739000000", + "WU3oXVX9hbw_1t5H_wqSvXXLQBTvESXiW2hs5DXuZKI=": "499678000000", + "WUPFb1XsaB89SrRBg1BmwYLGYFvOolOIbh3J5zol-aM=": "7888266000000", + "WUVmGDUE7466I6kjstj1NK3CozLxWs9ozxDs0C78Vj4=": "800786000000", + "WUm5RWnd4i5s1Eq1Jvg6aanVlZC6x8ubTPVCjPWEjXo=": "463799000000", + "WVTln6w-sYQ11Hu84TQRo-asJjjrfC_OGS8G4jOsWhE=": "422561000000", + "WVlKZ3Awm1GZmiPNO-6Tt9KOdbzw55GH2vTgijCcsOk=": "422123000000", + "WVwwtyfsarlQVopdyicDfPgcMVIKCmThIbAtHhslrvY=": "411085000000", + "WW8fz3OXNiOGGk-J4DTRwp6NSqW8dDVm38_yYrDCQGA=": "422775000000", + "WWB54oAswl1vvYNZp7hLVo__4iaYvdv8J6BUhonisK4=": "769230000000", + "WWWSVuaKPFzW4YrBVjTeGmgiRasx2uM1NiJnbpZjmIw=": "670537000000", + "WXMhUCdsz1oUsbkmSS42x6sYa4Zbxh2VC8HWMEq9Mgk=": "388753000000", + "WXmzFOvBvFOi2t2VHaUVLdh4CIwrp7RF5WXWTvPlRDE=": "1233257000000", + "WXw5FluWr1qQXjm77jYuWXKROPwpJOze-RboH2eioMA=": "5197759000000", + "WYJx_Z_cxysF_7Xp-saaG7n84rSyZ7d4WeGv6ETUXqs=": "384615000000", + "WYa4KcLcSC1Y3rIN9mN6CRzFlgveefAEGZapoEAswcw=": "386166000000", + "WYgsWb24HC6HsXBVla2f4ahrpnWgHBClpXX9veZk3Zs=": "2080042000000", + "WZ-wqeyTmov38Q66_FPsgYUqwoXzz9C_18V3eEXZ-4U=": "1223899000000", + "WZHHg7pEqnP97FGg5homdLdV7UqFbovEnqTvll0S-5E=": "384615000000", + "WZLJQFP0gK21G-PTVM8ZG0CY8LoU3WqXM-N0BJIA3lQ=": "457566000000", + "WZUS4LTYIQtdAF8XXDxWwp0D4kU2WBYLwOyks-iUPUk=": "1923076000000", + "W_0ptmndgwIIQUdrQ26x1Nb2x5L3G70tNtK6IpWD5DY=": "381805000000", + "W_RpnO94M4pf2Q9yw5ZY1a_hE-LDapLxfcQdjJJWeWc=": "770269000000", + "W_Tteg8jn1k7vTeNNfJcR7HbAPEK5tWghHhbOM7glI4=": "3784043000000", + "W_ZMi8L4ZKtQauN0LHeo8cQDyL6ZVVWjzXAH8Pi58CQ=": "1224063000000", + "W_rxpiElzvcUQvjaGeUlTcUveKHWz8_h6h4BGWKoAHI=": "466657000000", + "Wa33tWLyFcC3kS12SEfMQD6O2YQnT61Smjftw6LWC0M=": "763607000000", + "WaWg-Ml9OmCJkDKxRcPei2_UUJAMy7QlQOSRtMg56WE=": "416901000000", + "WaX3RQv9TZTiw92gJ1kZC5_vqIHLVPsjb9eWCMffvo4=": "457716000000", + "Waww0mdTVLqd8seF6kuanElHlhcj6cUMTwPA8M4lnzk=": "379260000000", + "WbGxxQ9C2PlUR3Ti-_ZlFIpjeObcMyc2QBuaIaCpoqM=": "1249999000000", + "WbKiu_y_V7L6Xxxl7RLRHltka7GVj9IUg2hdulk_V7g=": "840121000000", + "WbQETrhsuTzmxA0exGPjN_XciYs1c7-d7rhf78cDqZo=": "450738000000", + "WbuLVevIlsNfTa3RRDkcqk7IyrJjVyr-P8s76MBEiCc=": "377664000000", + "WcOH_bG_bF9ZWAGf2pwnMhC9MXPPx69Mt_KLtQOOx_g=": "443320000000", + "WcdewEtzA4HrFuX-NVvVbKKuTeIFSANDsysuBz0haUc=": "678037000000", + "WcmSRqGWSy7XWzlMVXar4pWftZ-ILo54shpg8M__vaM=": "384615000000", + "WdHUIqdu5Fl_YfoQrEl3kEVx7JFe-OlzUMPvRvUPpUA=": "2083333000000", + "We9tPPUVk_XG4475b89KDwAtK_a3tKeELOmZK22Uty0=": "716860000000", + "WeDghlSkK5Jw-2W48-fYng8ctueKR79rjmt6vJu34jc=": "2096295000000", + "WebPFAxKXLUEJy7pOqVt0Q43jjZyaGqbCc8ux_Q-vVw=": "458395000000", + "Wfm7zRnL9tkxhKjC-NYdF4KLuhvS5g7bWX5uQu_CE8Q=": "909090000000", + "Wfp-ZKvldlkN6Y8g4ERsijQbSChNjggC46ZEYHuR7kQ=": "538461000000", + "WgA7ltHD1V9qDWgHBfGLZzw_5LEe9CNmsEFBqqBaKU4=": "2643898000000", + "WgLmZQg-fimhBsRlMLK8mLYL4ZNrOJwjFXzZnUkn5I4=": "385029000000", + "WgeVi56qFx3jSaZ02vUvR_puQ004mxabOg2I-W2Fspo=": "411085000000", + "Wh1AICRSdL8rjvVrGJ-QW617OaXgR54R2TPuYhheFQ0=": "519272000000", + "WhDQLWA61NTfyTA0GiPo7d0U525OxPQHW3u5JAiBWXM=": "1076886000000", + "WhdWMqvvFfgT2jqDyJLXCe0qeiT7Hw1nHmLPDNdvw54=": "9997917000000", + "Wi2GI4oq1eTqxK5RLa0zFL_-nfagFo2PgUkPmQW6iNQ=": "426656000000", + "WiPSI_w8W3LmsstHHNcA1zIRsDmc3Ov9GuMM_6nTly8=": "9982090000000", + "WiS1kCRkDFrAyUoFF98K2Wql0XzLomqx2zAAj51We-0=": "2039043000000", + "WighIHw_Jc2f1LWdR6HdrGVd7LK546Yh-oR8pajx8sk=": "388390000000", + "Wj6NRh18oy0TVNRN7Ij7logTugTYg5wohnt5zldDym8=": "8332394000000", + "Wj6spWww959wif5DdMIOf_NZtcWuCUb_a_2DZVUYa6E=": "703792000000", + "WjWdsdq6-4o0Duula23AckRypK9R8bl9cMtGWn8NWs8=": "820114000000", + "WjjtRT4HSmSPdlq4_IIwYTSwR99pfzR7I4vBJYtu8ps=": "728205000000", + "WjqIYRPkN0NbJnbIjrp8OogtfcWuUQBboRKmzfjqrio=": "463424000000", + "Wjr0f4kk-hKmv539OVIPJSez83RMlMHk74p7hN5LheE=": "489572000000", + "WkAhtiFFsY1iv10W1r7Xu6g3HtLeFzMjg6yb4L6VYKM=": "20833690000000", + "WkEEUBGRM_TGvGbbs3gPAEZwP08dmSM2XMJrGiNGF6E=": "393772000000", + "WkZCIF4B8XgH3zPH2obgELXE1Iu5vPBcu95S5WorAcE=": "906584000000", + "WlH1hRqJh_YZOz9RWrMmbkG5N4B6ZBn3Epq6sJnKf7c=": "750896000000", + "Wl_FOA2C0GBwEmwkdHIOhj6luptrJlG8lQqmQGfQxhU=": "933815000000", + "Wl_bKHVBkIT_iP57le5_SxuN_NKaleooaEYNZOY0r48=": "1792816000000", + "WllmUWldiV9PMnEDqOMfdNSrH7pvr6PStwuY7mKcDZM=": "2507224000000", + "Wm7GKn_nATTInc_xotmyJGL0hs7kE1jjqctqUTvrCz8=": "381331000000", + "WnI3c1q3sECfBwLw9KWbeb2nUTbXQZouIUo4IqIs654=": "1133483000000", + "WnMsWg07W_8vkG-Fy6VmeiWKmcZPuOsFAgy7aeRUp7I=": "625026000000", + "WnbqpPz0Pluzvj2nWx4nVNN45dj-W_JZVsFktENVQkE=": "385022000000", + "WndPemv7hFqjezI45hzKUVfonpFUhLTs9Fm_F1XaCRA=": "6387139000000", + "WneTry5MrkCawa-_DGPcBWqDJMZthOsTe7NtKZqCftM=": "3846153000000", + "WnkwKa1KP16iMuEhPlk5XEK8cPMgvWxLfEKIdap6Z6Y=": "384615000000", + "Wo08suoBQU-Or2g7oLOhyJD3rsO4WargiqWWckxF6Dg=": "462839000000", + "WoOvoW9f5fO_sYFkt9ElVjMULCWCMi_nK9DI514z8-I=": "385211000000", + "WofUFAhod4xCs_S1Wa7YD_E_0S0exYHJcl-iIDW5x7g=": "1270111000000", + "WogayZXNDCgkw8nkiPHYvHpqJH_4uRGM0qoXMVQusnw=": "378445000000", + "WpIHFMQuQ0MPNoh8TpgXvLEPGRP8aw-OQgex8sOvpj4=": "416666000000", + "WpM9ge3RvGblUzqvY83wxa_O_aoEaPjluDbk1_CyWvo=": "576129000000", + "WpQ1_KkYNR-BQGIyB1US_JK9Vbr_JKdS5XoSSG9AkWE=": "416666000000", + "WpgH39A2RXEwjmElmlluWGBXH1urIuKyLYTMyfP5oug=": "759898000000", + "Wpqz_mrYTXiD3zmA7eOG_rQvGVV5IPkpHmcbspi-xaA=": "502207000000", + "WpxyaMIOKFlL-y4pqdFu_kVsJ_sAIhWpyudN24pdpJ4=": "772470000000", + "WpzS3tctBfPBQ1pTfKDZg4VFv5GnkI4z05ITfQEv91c=": "455600000000", + "WqYKtDGrhfhaB1e9uHrjY6Q30HNb9KK6grLJrFopNnY=": "11538461000000", + "WqeKXELvgdWCbA7PnsWzsq02jd-6cq62qWe7UfF8pXU=": "2256916000000", + "WqgFAopd6zeVUG_x-jd1h5RNhntXyCb_YgbDiZklQew=": "384615000000", + "Wqrp0deFCuef3HrI6Ur5bT1HL5jLibORgQaShzjLJgE=": "417606000000", + "Wqx6j1K-QBy2cxENgXo7EGrheKMMu4wD8W2IusvOGkc=": "900604000000", + "Wr8X03TtxbeD2xZzh2lzdDd-TP-7emf36LPd1idbTHk=": "384615000000", + "WrHwe5g8vHotHrV3XCzFPriQjA07ESS_32Wv5TWAczA=": "8333475000000", + "WrRVfq_DhaR-rhxmGst1daziUiX7Kap27ZbSquVttBo=": "3730718000000", + "WrWhjfk4r803JOJeOEZcu8Ob9lySmaZHW8-WCwx210Y=": "3266355000000", + "Wraa2Sf0S8_kr3TaWCt68aZ4ls5O6eRUsBbCA5Z86Tw=": "455600000000", + "Ws1IweOZpqiQXz_ogOaHVmGykRhEmYRlOUK52Nn7Dyk=": "386517000000", + "Ws4oNxYTVLqKv5cNfEHrMySYYbccdrtnq7VEfooAFrk=": "406308000000", + "WsHN_QFClzO2eZsTLXUZJfDSMxiiG2mIpNCgS0Pm1Lg=": "384615000000", + "WsMzDSu28fkV3JwS693MnFwQO8IEG-9FqUXF6eAvZAA=": "1894212000000", + "WsS-ud1GAmn5oWzoXxqOcgXojNxbdgWtp8uJb76Wkzg=": "3846153000000", + "WtBOFAmL9CXWARQe_b1t-d8Pq-zXUNVJ7FzxNP6MvA0=": "4698375000000", + "Wtjdt5l_n3_ObEfb7KcT-eoz4ts2Rccs3h6oIPKY_KE=": "384954000000", + "WtxY7aUHW9_zWdO-OhD_zw7hfYC9mzA5nIMz26Nbqi4=": "938807000000", + "Wu731yDjmHXrQNVwV2YKyykPFDjwecxS7JXbF2zN8eI=": "3269230000000", + "Wusnf827Eyue5KUrXmcGtC-0Ez1Yck9hkTA1MW-5nf8=": "453900000000", + "WvOvJdFE1GPyzqdOnwnVDwokF06iZEKlT-y2Q--xrf0=": "1924973000000", + "WvZaEfMr9-gyCU1mTFHT8XgjKDBp5LwCCKytZf0WDfc=": "385614000000", + "Wvm3gzP3EFBGDdcAtzztBi9SEgMtta3a0mNO0mjjmEY=": "758689000000", + "WvtAOfLvFq42QFGOyhrs0OxAN4Hg7K-buIjtcd34D5M=": "384615000000", + "WvuI0AMa2IlNkar46rD5mYfyfYPW9sqitGW2XOWUMv8=": "2692307000000", + "WvvvqtfE6egJq5IBozMiiu5zY1eZuXrUdEF_sfyGol0=": "419975000000", + "WwHCb2TuMkeNoi2jA1vtxbHPrgzFmw1YyL3nGzq2mOw=": "769230000000", + "WwmkL88TSc6XfatpSjDQaGHRulUYzXcCg0JJIPSyXdc=": "381436000000", + "Wx-Wy7Hbp02HVLBey8oa22UlxGDVYmhuWV54sWIqS0M=": "454933000000", + "Wx63L5vIeWvTZAXO1OZnasgSbdN0WXPjoDVQjmzLjGw=": "378341000000", + "WxQ74dhQjyiRO69hTeUd3hTmqzPorlSA2RA1p-QyOTE=": "815527000000", + "Wxo7CBnm8gV835KlK6aCwCJF42W7HB4LF79_PrIWLhc=": "411085000000", + "WxszYfNG_2BVVKzpyKqy_5c6dLASVgrf4plXMKHCcdo=": "390975000000", + "WyDlCGtXFxSZ9w6V2TB6HewNFMfkrEGrrgsF7tBfNsU=": "384470000000", + "WyO-H9K5_gHI9OQ33bK2g9mLbMeq0bY_5b7q32IN7B0=": "385506000000", + "Wyqpc_ZEoyT73pCWDF414yXLSHIDX5gu7QsrY0VBkcY=": "893011000000", + "WyxGbT3Jg5XfQ6hFBwQeCGCoLODEFSIzJSB8RXxE8q0=": "469837000000", + "WzCt5-gvC8FUjYXO0KmNNfqtJ58ixe0GP6r8XHWK97I=": "388317000000", + "WzQXjldKs8rh1SDWhk8gtnB7eoFoBOehDtrFByivNcw=": "437624000000", + "WzyJQYQp3UYUFdK4NrzvDWBlSpkuwxV5H46Bv-JuR3Q=": "454742000000", + "X-fhH-yKPtYmxGyUqzZkFhQkk8nLThlqFUF-eroJ_cg=": "768842000000", + "X05XvTlV1Ivj7avWvsTajaqpeQGFurWDeyJmnvQWT4U=": "384615000000", + "X0LBlDjIZ1qQP7lM-BrQih4kTNemBwpfyaaofGOzhdE=": "464322000000", + "X1BzLtRxX8KWPaMPQotkSNF6hfvZgfbcK8EHYtKHt80=": "1233257000000", + "X1D0y5Fq_Lnc5xY41e0K5b91LBvbacU6tQCnzW1Z2ag=": "1156532000000", + "X1jgdZcJzAy01mXS1jLHnGoXN0CUirwTaqezuwDpJzI=": "4999999000000", + "X2iHvay2eFPg2bu0qOQFwxU2P76muqdNdU-hFOMkXsQ=": "381360000000", + "X325izdclTaCmSYlnVQrs_wMkOfVvcq8f4rIhdDsUkw=": "384615000000", + "X3GFos6dMe8r9sEgYBxqrEO_brDJSMxGDreh6kr0dNw=": "384615000000", + "X4235DRkMKkv1MXWbkuhD0dyQLxP0-nUMnwN3RlaxkQ=": "811058000000", + "X44LYXAscldZoFDtqp8zZ0DbL-Hvr3EWO21Nrj5ioF8=": "461142000000", + "X4ZqUlwKKP8I1KQsaoEtmVd5diaVDeTtXLLfhz_6ZDw=": "769230000000", + "X4ztG3MReqOp0IZom33YnT3e11r1fa-dgFJdm2kDyy4=": "424045000000", + "X5-g-W0xmxPzxsQGRQc41t1DBOQ-8jA-e2vZdDh2cFM=": "3307692000000", + "X5eH_Tq9JSjZ2q-vSJbksdkhumqgiU24H3WpCwZu8v0=": "1924295000000", + "X5ijfwSHfcRSCQFyme_sYD5qAWkCqetYzIyYJqhllI4=": "770570000000", + "X5rXdtp6nblelaOjgxag1NvLr17AQ8IkyQIg8SylVJE=": "624994000000", + "X6NOy8n_lgwEvWWsitgcWpdnGbdBqgkj0Bjr5lE1-Hk=": "463541000000", + "X6WZGDBkodkV2xqhZnaek4L-zWZuFWNGNqt413jV4yA=": "413151000000", + "X6YwT9RPK08j3LxRuw4XhxqwUqbQ4QKVW6K_uwTcvq4=": "546711000000", + "X6k8FIPdmt0Q8y-Ei3VG4c3NOT6wwE1ZWuASDnbdZfY=": "470776000000", + "X6nVk3SPb489fCptSK4lVLAwgtWsDzzNSrg4atFBKcs=": "386511000000", + "X789vxPO1gSnX7KFme7Cl1XGhGe57dDhiI2KYZx41eA=": "384615000000", + "X7IS_2xms9vLHtpEN0eYZ0U8Kr6YVpYvPx9IHuL1Xok=": "10390341000000", + "X8CzINkFCF1GkV4N9BG_4D9wh4J8asjTg3sh9RHETic=": "409116000000", + "X8FzmDTrPOmWS7dDsPr_9IVZ4alNMcgH9pPlwDvFKRo=": "1253906000000", + "X8Q5x8tNqVbMUTh3j8MqZ67ci3c691BvIyHWjC75kD8=": "463105000000", + "X8Rxsm4nf-NqsqkkkQ94kyg2dcHK5l6QZBlUoXQuIfc=": "8633081000000", + "X8qcKQfI_DuwbKynKd4yHx57O0Vnm1iocND3ZjlEZeo=": "9456573000000", + "X8w-n-xeZtxbueEhIO0JX1HbOoCiie_JLWk-jpzpzPk=": "422561000000", + "X99Nh5Tk7JKY92rDW5g3mw_-oZuxrlyNGOsOHIxV0r0=": "385035000000", + "X9oapjrq0ebR-Qp1XKRheor_ujkkWyWX58DNhZycYbg=": "454545000000", + "XAcgE-vRjgCOMy17V43ObpUx0ELANucz91RscctWymc=": "486218000000", + "XAoHkyJboKVehiFiqjXtdXw6_Cc4mJNGvtBZF3PGnVA=": "463219000000", + "XAxUJJ_bes9H8uy5J982Jbhf4PrYdfPuy5JRM_lKxhk=": "451775000000", + "XB8_6xPeWE-kgl6LkGNbvSwviJmoIrCXAg7t1lQZ9J4=": "1730769000000", + "XBnGW-jFaPj4rt4xr1Ns042LM64h8LFa2-ju23NXOhM=": "382846000000", + "XBodoADkDJ-34DCWOPhibhs9xrU-tN2ooCp_92AAdY8=": "384615000000", + "XBu4duje9gEC_N6Ikhivoa3Mj-1OvLivE0ivCoVhQOo=": "379260000000", + "XCB47VvvKOSrsyEFX-8oEcyOVvL5TojrnXq6iGyZ0xY=": "3907299000000", + "XCCBUwbfsYqHcsUU6a0uOE5FJQ9ayJd4m_U48Xw68SE=": "384615000000", + "XCMGBzPmWyrSM1dAuylAGoVXjwQMBa21JSpCezVi0AE=": "491110000000", + "XDRE88uW7QihwPqfCfPW0hgCzBKK8DpU0KTT10UtNLI=": "610287000000", + "XDbdYTlqF78DJ0UgWqfVS8HJm4bWs03dBcVN2ivGxBw=": "13265105000000", + "XDctqw8n28plMc_rgkZu7yATTbNiYLOeXpUKFnKlGvs=": "463541000000", + "XDqFHX1e4oCZxH_d3W9V_4ixvAuilsDFk5repBt8X0c=": "910488000000", + "XDsGKPQqVB3Lfb6hIjIJ-xW2-oevIXne-BtL1JKjoDY=": "22495688000000", + "XE3idGoHDRnj87wYe8raIyyYywHOvU00fUtAgIc63ZU=": "4999999000000", + "XF-wcZC5DTLIlXCIaaYDQ_4KxzHfD3XHVeHRXf_NhaI=": "385505000000", + "XFR8muMoBfHL1M_sHtoh2W8pnKhtgE-OucYueJliaks=": "8304015000000", + "XFd3d_FlU5IGx0iZtbsct37WYNAEfc2M-kMkqJUBf-g=": "384615000000", + "XFeRGMKMuddwZebJnawPihFqaE21o0uN2n4jkY1ar5U=": "406308000000", + "XFphAOngJ51S76h07k9DQhontuCsPEd-729UGqkwQ8A=": "769230000000", + "XFs_1_sx3Re4cuDsbNqzGdpttV2_wjMJ264CjGyE3eY=": "381454000000", + "XG8_XDsy8TtXuH8q4mcrOqo4DKY-M2oaU4ivLfO04Mw=": "380585000000", + "XGKBq43fKOr7Ma_750QOJoqfc97_HN2-5rrQuLgAm0M=": "762391000000", + "XGX45J8IoGYcXoGjCvYk8T0fRPlwNRPj_H8pY6AyCVQ=": "384615000000", + "XGbOhiz4aTrq_3ZJW5Jo6ZIeHBkuwp-jxk8Zue3OZ0w=": "764865000000", + "XH2PlnTVrXntt7ESoQOYSDBstGEPnpB3XpkKNNebnEA=": "380708000000", + "XHF4ZmtyJ_0OdEaouDbpoz6I7q92HbAstpcODtE9n_c=": "470531000000", + "XHIiLDG2URHa_FbW-qS5M7lNifeVQJbMzkZRNLFBE58=": "384615000000", + "XI3ppFwALJos9efei13DR_tm2a11k2zDLit-PmTKRis=": "384615000000", + "XIKpzxJbz_iCrwNjGZlZkGcJhDW9OIMMJv7VpSj3Ecg=": "825277000000", + "XIkQORhusOteZrCtGuoRjiySjOVNv9CXgsGadMBNxFQ=": "384615000000", + "XJ8K6EkcLwMBpRMnWVnRbjF-8jvhVP0LFT2S3HNNZVM=": "385973000000", + "XJTcFm5GVRjHKS85kT4hJxm3Fm71KwoD71-XrjRRLfw=": "391797000000", + "XKHYkOGTDILWxiPtES1w9jal2bCTOG7q9kmbj0jQKMY=": "2744663000000", + "XLGzz5vazvioudxTXIS23PQT6LN96rT2GGjDJLG6Kps=": "1250143000000", + "XLX1wlj3ZjROg583JrZaLR-7RET1BMWnFg9RskvRF3E=": "408021000000", + "XLci1zPaBT2VOBarLEXbWQxsTFJ2-xC9rrlCs4qiA2I=": "504471000000", + "XLlrSGMRE2wJa33sD0jLjrQT4jRTsx0WWfWOo06AUTY=": "748071000000", + "XM-lxJAcxPlUN8EdU7Oj7OCYgIPdPNqaLgvtxoKCQ4s=": "385506000000", + "XM4C337Ir8FR8EWTxtya5QlVaHBv_dsMOz_8JkXHzic=": "384615000000", + "XM6hEtAso2RGJkYVsZXSW9gxLW2nve7Xb_9zyyndiS4=": "1140748000000", + "XMTU1fPUSfDvKnZofOnjIbz7B3pcShmj3OZcJX_u-rQ=": "404875000000", + "XMZLqI9GatOtNNgFgjN_Jjv3i_ryHkfWlUBYbb_TdGQ=": "488082000000", + "XN0hnz4tspi0w58TX354Mgl0rlYRmur8fJmKrvdft4M=": "769230000000", + "XNQLnfWw_w6gsPozL68rP24Dr1lNlw6Z_8KDoo96pic=": "3505846000000", + "XNSYxyxJD--XYnBm2upANVDcMB6uBbcAf7ZmotCsKKM=": "1923076000000", + "XNWk-9LX0F-3rP9gcxHI3rftUlxhBhWMr2KE2m8XEMo=": "542774000000", + "XOfDcCwBz-anvpWxka2VQLp_hnH8ehn9lSDbQPJWfW8=": "674647000000", + "XPVH9mk5haNmLI1pl434FxtjfvwM7KPduGFqbABpvU0=": "1692731000000", + "XPcp4wysi2ZKrWcE9DOwWcF8cO74TqnL8_BoCBbiUWw=": "384615000000", + "XPiBwUQKOD4O_OYuTg630XMpNKZR9_qXUtH_SUoDCHw=": "416812000000", + "XPiXlEK9ptA1bi-MNYdBRiLu73jjcAEkEBHtEFD_abA=": "830923000000", + "XPjxmqrW0yTXnP4UA5nAZnDcaqXtfXWe7stSOVnHnqo=": "385506000000", + "XPzM-4K6Kj7sXNpAe535e3swQoUSE3EjtcQUV_gwXNI=": "961538000000", + "XQYSp25ltuFHfN_oftdN4TrlRlTwdVlEqaBbHjHzcGk=": "488135000000", + "XR3GbjHSHDwXMJYLp6sUteZWNpJzg7C52Yfpq1YbKTc=": "544715000000", + "XR7-_R3vGtH6NLg1fSZc7EMHcOkrN_WDjTtQLFawIEM=": "385528000000", + "XRr9Q_DWkvEuGkrZ4_Ofina9OxPs-uDJeT16EqwZsfc=": "810534000000", + "XRsU9vKCZwh0_7gpeHyTGxnlh7VdlD5x-YRfAJ88f9s=": "1256322000000", + "XS8qgs4y9U7kFwjXMeJPvvEAXYu2UzuiF4gD5qksR2I=": "392009000000", + "XSID9zCPztTykT1uJt2myg-8Y03bWRA_Rcc3cVNVJic=": "913466000000", + "XT-h1FE9u8x1pwF7Pgu-2Z3IUjqIbMey7U-V1xthTIg=": "1509204000000", + "XTfCCqdHsYRJck1nL1FvUFbOPOheEXnDgHcXr0pL_VA=": "4216365000000", + "XTnTDtxLRuJ4vKWq3WkwfziFc7LHQVvWry0ioTmgFfU=": "755958000000", + "XUAvK1EOdoeUk_onBKS3nIQ6MzajLrjOfYE1zcj9f44=": "463498000000", + "XUQSrGdUttHBe9IcozVtNdcGjYxH2c4Gc7M1TC3XcBw=": "10761363000000", + "XUZXS5Wsipp9oGw_EGzXf0lun7cx7sOzJsqk9Jfzntg=": "453057000000", + "XUeHrykZIwPnsFqPh6N2D2VuDem0EyuC4mf_epfZr88=": "2010962000000", + "XUf4TNvKjvZIaH7MygRFmZTyBYJfvAKSVryg77Qg8T0=": "416666000000", + "XUmTPJv2Z_Cv4CK7lxjuE8pf0d11269WjQQ_VZUvPYY=": "5093279000000", + "XUmh1gWsbj3FpFsAcTA1ZMfy6P71VthMYNuLdr-0dP8=": "385507000000", + "XVSerRJAAJZHOKmQJDnowm3pBZd_FmBNb5C3hqAxgbU=": "1927863000000", + "XW32ydK49a767MqxOrdEdMeXk0Uh2xLg3ZShDhz5Bic=": "385562000000", + "XWfdDvZHupMRXaSUkkuKY1ABV5PVEuSHjiEMWHiwmGM=": "1902568000000", + "XWvEyFvKgxsoJlUGd4-1UPgupQqebrpxx1hd9nNdxuA=": "414412000000", + "XXKefCAFIpsPi8SbeiMU7e9gsEeGJw53FgrG_U0MBA8=": "384604000000", + "XXPMOV2MtTdHMKaw7bt5sFBJ9vD2-CPsRUsr0eDi-_g=": "416666000000", + "XX_hubX3OWmKX5fonMzOKnr8bh59tOO734OkC8efDHk=": "30694729000000", + "XXfX_EiK2tSLP6vgP6xqAX6paT7uosen2NB1I95eW40=": "422216000000", + "XXmoB41_3OV5OGRoJzjwYEfujb6M3ida_GS1xI0y-IA=": "461319000000", + "XXstwwnZMLta_S-R8TcI-luLfEa5hu1mDYF--Bs0Sj8=": "415629000000", + "XY7PGIC8sIyIEOoIvmnKYU5pZD-KCF2BiJd-a_VBbY4=": "384678000000", + "XYJ8AxcXrJgXGik3dH2HC51bZJuy_EWNlGX4i5Rorlk=": "471839000000", + "XYTlTyd_M_vVPcxmVNLZlHc1ND12bVOzrOQOdTwsmDQ=": "758689000000", + "XYXITAHNwAk3IdodCDwr4or0C9onjXKE8wwFtJ0jRQk=": "461858000000", + "XYn5mSH79QMXVVQvSvTmPkSerw-ER22Op1s1Vsyivqg=": "1153846000000", + "XYqIvR2FxiDzSmWBAjD7Cu8SrdGq7WiR3_6MKZPNz_M=": "384615000000", + "XYsV_3r0PfwFVVDXc3pWql4kqFAmMB4KTEc8Ktb5DyY=": "1538461000000", + "XYskcn8ZPWW8ER6aR_R3It3UtZqSY4IcufJu_hk80Cc=": "416392000000", + "XZuh-mqDjd26uO3mwBPdFjU4vnowDC1grKXFvtmgmxw=": "1249999000000", + "XZvNMOFPi2p_Gkx3dQ8HzRtlKKjK_YxdfCzyRXrFKcg=": "464104000000", + "X_GMbVCreCmZ1t1mXIO9_K3PZ64P4jFTf70xD6akjO0=": "454586000000", + "X_NxWrUF_o3O6xslGX-XW_2IxEWYHky_Wrbf3PsI8C4=": "454318000000", + "X_RiGekxy7tV2Qo0-T5ej1eeRkONPJZNZWvbj6OkC6M=": "422561000000", + "X_al8y4vJ1LQPOu9Jha_JHY1KGO7DRw14PqRX5eGWh8=": "5833333000000", + "X_oYDjfD4zRrHrQDQfeyH3lGhl95_GsK-Q4qWbD5CwA=": "1363636000000", + "X_wtVYoJWNwaZGkA1n3KzaLq0FuMUT6HKWtbCpHjQMg=": "388549000000", + "XaFxIfjJi2Od5yy-SQ9khmYbdsQPJJ1k5kWHrMRayns=": "1250021000000", + "XapHDT2oOuEDYEbJSf0hwRATeZyODcd3W4q8eBRZOzc=": "424881000000", + "XawGQGM2VFiI5dX_Isgvdi3NK4eH5gSw53JpavOOt74=": "465433000000", + "XbLkanw6yRcrRTDihGm4oTnqb5B-j1DWDWPD0JILufM=": "1135800000000", + "Xbg6NNL2yq1c29POHu9qs7rh2xe_ruAOmLoSvtWT808=": "2918028000000", + "XbjMjRXB36tluNCDwXPhBguaExUnCuuxNPG8Y6GrC3Q=": "378385000000", + "Xc0Gy6VwOd40WfIeb2LNrdm-RmI3Paq6D2ZLh1FM8FE=": "384615000000", + "XcONWYuWr4uRpdCNhsBSw97q6TqJomEFGPVgDskazxU=": "384321000000", + "XcjeKDNf9CLpw6vE4hdwwTYddjURdcFv7edAolnoZqY=": "961538000000", + "Xck_1M2CzSupoiczGGo0A2QtNBIHJ8RDdeztgVPFn9A=": "451456000000", + "XdHqmOCQpNpt6fAuhZW3FVc5CacV1VXPT8lDr0ptceA=": "1153846000000", + "Xd_OZ_cDJwk-gX5wO0bmqHmfmD652jnQocbU82HDGQk=": "516817000000", + "Xdjb3dgzqFkTEW9af6Op8X7XY3w5s2l51Zsl0kWCY1E=": "384615000000", + "XeDlsfaXbeYdztIVPZ8A_Q0OlYZdGoG_RkZ6bSWiSOE=": "783778000000", + "Xf3EOMT431LQCqbKQ63dUi-5A3fbb3E7_RCIkaAmT_U=": "384615000000", + "XfLswIP9rwMrbo9FEnsrRC-WXS0s7OLcAEx_GtolNUs=": "2666580000000", + "XfNGiDAHBnw_ht6QtAqtc2QYcCsr4wlyCK7N0tBiY2E=": "769230000000", + "XfkNRDN49vk-g7YLWWtwjQOXhfqjZ8wFdb800McjF10=": "2299194000000", + "XfwzvHxFirn-0Xuf3dS6Jpiiq2CKTALCmgKBLm9dt84=": "6748433000000", + "Xg12XhcB4B5rrIxTjR1Zh7I-WcvnF1cFOmfhrzsmF7Y=": "461365000000", + "XgDDylNAa-wmA03B0FKcVtalZuMJVhkYdjZlWnBgMso=": "964248000000", + "XgXXAIuHpQjnwyE34IX2y-4h-zRqHEFKhbu6f2Cqlj0=": "385198000000", + "XgeTQdm5e4uT9bQBGfxJWRiOo_PYaOLGQ3Zk5VDsF4E=": "1373975000000", + "Xhg4CHzND453k__AiiuY_BDU6uy6mKdJQHbrg_VYUXc=": "1249999000000", + "Xi-vAwgHiukcTyjDu2S3AScMBpWvRrc6X3nxkRXmD2I=": "492837000000", + "XiJATGly7wkwzL32nl49Ya1du_Pk5ds4IAa7YfukAcU=": "651381000000", + "XitpJZvmvMO7q8bsKJhwKyL2FMvw9PFHAkucSWJXdgA=": "659188000000", + "Xj6f4sWOQQdpx-cjP7Ey8VqTEGnNaFdW5CO7-kqfoP4=": "578548000000", + "XjEHU0CNcOZuowVorrUSTnUm4jDLFKZPC6SUn9eUTtw=": "384902000000", + "XjZrpfQbv5rSYuOnAt50moAc-UVG-nsZjgMXjQEoJSA=": "13636363000000", + "XjeK7WVOyUAUsNKbKWAy1QSuGfSQE3orVsZ5GeACJKs=": "615384000000", + "XjolIrVeTMqZH9mWfeWHm4J2h54JGvZnBpWD5oaHgsc=": "473331000000", + "Xk8MkUx1MK6ZEk7vpk5xmKFg8IpAC5V488OLY4DvhLA=": "384615000000", + "XlWp-z6Dyiubmp_jyA0BXDqdC_3B4VqakfcjYgoxYPw=": "385505000000", + "XlgxKye1cxCk6twuXMsUZb9Jg5Jex5K3dzxNDbGEgSQ=": "441769000000", + "Xlsm5JoE0f64nPjwh5wT4RXyPe_UhE2ZlfJZ8wlNrbo=": "385047000000", + "Xm-2jd9JYeNf80ADxhOnsn9zZpYSii55IImOBR378oQ=": "381976000000", + "Xm-GBglQ-_EnA64A_7y4R46eOhifTDLd0JkEMrZCqDA=": "422561000000", + "Xm-VTrbREkplcbKn50tg11vk9sLmp7MosCRN6m_PJqw=": "1043281000000", + "XmFclIg-OnHFcF7-BUgelLMxFm7iC-KHzbL4hypGCFA=": "384615000000", + "XmLvWYCed0uuT3A-QbVEDfIQ5WaT7dcH30ttO63z7Z4=": "624999000000", + "Xm_MngK57sL7U3O3qul7iuPBcUwMqLeSdavVX6fxjEA=": "376837000000", + "XmpNWItsG4rrMCALgIihK5gj2H3wtSX4yW_Ev9oQN7o=": "450259000000", + "XmwwKQyG_IhNI1Z5koz07ub2B-MJP759IlsNYLI7F4E=": "1228050000000", + "XmzpK-P0IAvofPMp_Ve4w6sUFVTJQGBp8h3xhFE9N18=": "1153846000000", + "Xn9gjb3UbDwNMCAfLN16Yt7_ZLwBV_FGAO12Fn7z24A=": "763538000000", + "XnG6tyWWwUfGz6spW1qrCvapOxuIF1xr2QWS07h8-uU=": "893914000000", + "Xnbh6KRoK0QgkfmZougJKviaqMmEhosfG_SMdaOFQuE=": "1633257000000", + "Xo6UU_Yea9ywLwNkqsqDmijkmvn_AN6EIze08a0psg0=": "455402000000", + "XokmTMdPOU1z5pTWtU0YuKUZdA4UeJwLINdSFGTk-jU=": "384217000000", + "Xol5inh3nCy_U0-k79qhwXLBE28dw9Gy4T85TyyeOOc=": "377328000000", + "XotzrMqSthA58qnYhTxLTzzU-xUu-Ux60XYT7wt7bQA=": "384615000000", + "XpHKgirAapzg5zzMGyFACzGSfNGanqTmKDyKaQ1Cud8=": "419408000000", + "XppnQxEkNeRWQIRM-1c6CbACAwaMyY3qCnAfYcya7PI=": "449601000000", + "Xprn6ORHGEAHAugi8ghlL5Wv3M5X7pzznk9AW2vF-CE=": "385505000000", + "XqNBFYWxbW5ynRFer69b5fp75f4rh-VnZhG6Xv_gqDA=": "650761000000", + "XqO5-PYoBJQQM2xJN94eaUBxyqnb1CIJZq96Ia_4zc4=": "1030769000000", + "XqrQ4gEwFxQU6n4iIH7QGA1mX3ysc3nvnOZ5jS_skcE=": "3076923000000", + "Xrfkdb3x-9JKc1OwCQfrq_RvkT07iijY5JVsW6NoxdU=": "416666000000", + "Xs0u5Fednuw8y-IuV2I42DwV46psLJkFNLqksp_3zeE=": "384615000000", + "XsCMIKdNjQmsy8n-2WK2MtOeBPetv7baIdC4GGcV_2k=": "385229000000", + "XsMB1-bEIRVW6OkiGiKNrZDMQIsnpf4wfJvUyD1oL80=": "424923000000", + "XsUCtszAuPPRe3tk5DGzmnHU1vJybJc-R6i6bqNkv3I=": "909724000000", + "XsWOJcgNiAceUqiyG9WyxBZJ0d6JyxKBT-zxYoKSouU=": "384211000000", + "XsZGDtJctTc1R30LZedyFLEs5WA2Udpue9X9qJ1vQic=": "902469000000", + "XsjqZTAH60H6z2fq6KyK9Mj1T6FYdvH_sLNzttbTIuY=": "447983000000", + "XspJl2sd7heS-dkaYweSmAy8JS8mkEHu35wEGY5k07c=": "1648076000000", + "XssplbTgD5JTZAt509FgJPGDIbeXa9b9iIsxQU4oEwM=": "385505000000", + "Xst-FwT28Ua-wH1mSHsppRalRgVaWzwnZ8LLxHG1wtM=": "469825000000", + "XtZenXQ7BtGRJZKgqEEIV0IRvGAy7JwC3nMRhoNFCZM=": "416666000000", + "XtvyCpAcFnAOziEcHCXSC-D_-RjCA5-O4bnZOe8yYM4=": "385725000000", + "XvT7nmrGQps_8VLOVACydn1t2kdvyUUGlK1mQ9Gs6cI=": "1394356000000", + "Xvj3IsB-X4ml244pwKt-oW-1QZ3WP0ud7wpFJ75ARvs=": "390037000000", + "XvlKKEv3wdxxrIVSroTYdoirJ8q-suyWYaaWzYZ-FRY=": "4110858000000", + "XwQmbkw5Ga5k3mMMRaYLdppazA_V0p9oanqjmzVLP1w=": "2499999000000", + "XwVRUSVQUickCHPx0QYqf56BrGNX1v1wOyL5p7u3TV0=": "413365000000", + "XwZktDSL_wTT6vWWYY-bXcRA2_gVw8hCCIBnQbqoeaE=": "830439000000", + "XweJ3XyfXn4TZLXUseoYRKiVvgcuQ3XY5cVT1UnHtrw=": "1182197000000", + "XwkMnu9-OuNr2YYIVt66CDJhknSqMxV_rUFhcs_ICvI=": "1076916000000", + "Xx5TDyyjVVo1UB2ryS70WYTEyDubk2lo8VeoUp8dy8I=": "453082000000", + "XxBdo2t4JOpc8v1VzwBLvHtfzSvLAsdZYhsP9NMU2xc=": "387390000000", + "XxI3EUE1UIAadQjZw429TatjhJ5bcbjgJu11O2IGGus=": "389386000000", + "XxYqFhqCL__K9Qf_yMxrAmVv3WXHhr-gJn5QNK0NCDo=": "385506000000", + "XyLQTq7ZW-TU426fX16v1t_jcDHJw7inljCgw-2Sl6A=": "469988000000", + "XyYRLFhypzuSAGWtLl24jHZrvb9pBUGsONBzdVUP8I0=": "1667623000000", + "XyeQ-_D8KxFkf6uHTLPB-osxQF8Av4ZuCYG5cxp3EtQ=": "416666000000", + "XykE8XsXNLj4ucSrORf0pANTHf7rOriDSefpojWgWO8=": "415962000000", + "Xz--fEZaT0379Uz-sx04tc_BVBHGhFFt_bg2nE9BjfY=": "8690445000000", + "XzOeUpDOtYyz-P8k6NJYjSr_ieNFvl30YmmGAc0oFTk=": "384857000000", + "XzaT0ZoXM3EbNm7ya5zOinZop3GBQ7yN-qXF7VPfZVo=": "807630000000", + "Y-UWUu1UJti5nNgfhVwXwALNBaQ8_SbwvsUMJcURzr4=": "7443555000000", + "Y-bZvNahb6UVoIao_Pc43HT5D_AsWeJ2Xzrl3ARr8Lk=": "769230000000", + "Y-jIOMVAJ6BxzwObOXKv-YxP49i-Z4Y1LnlpLVT7siQ=": "536514000000", + "Y0-xNKac_2tF9wQIbmFshkSGTbCY_VBgbKKgyM7KNkc=": "2429028000000", + "Y0N_Hg6YIO0NXzzkJh8hBHFxEZDeuUMreXUHnCj7vGg=": "356788000000", + "Y0rDeK_LBPplV8nq5wjP_chOMR4PpGv0KjuEnIKBNrg=": "384615000000", + "Y15NoFJDnFiCKUo-i_BxMun2ULfwVBK00370YzY48gY=": "2691671000000", + "Y16kH_Ha73Q20f5AP-5oSDVNyZUAhrbf23oArX4wDgU=": "538444000000", + "Y2D-x15mQdgmAmlJqqlFRFmT1K7pP43pZpKs0vVgVtk=": "2533181000000", + "Y2KqRLf746rXGzMCG167vOzkerXhHQiMylNFb8IxV8c=": "390632000000", + "Y2MmmB7zVx731Vv3dyZhZPDsGnGb4LLaoc_jzrnBEps=": "496210000000", + "Y2VR6oJJlIIvDfBZbKvjA9IHllaIYFfJTeJEoUFFvrA=": "1153933000000", + "Y2jk2rsER26XieOft1vQTHuJ9AkbQzT-E1R2ZyDHznc=": "452341000000", + "Y2m41FadnfZiFRyC4xf10HiaK9nzs9iKg1Jg4MaV8oI=": "769307000000", + "Y2wKKp0bjFhktr9nymNKURtTIi_7cIkEsSbtqhOqLCQ=": "905988000000", + "Y3IDHnNAPTiuIzbUp9aayxibS5fyD5tyItOzVI8fEMA=": "769230000000", + "Y3It8ScSqW7JC5RR3gV73oiwKTpr5_JDsWndjpUkWt4=": "452104000000", + "Y3Ow5cxPrb5iJ4O9S6_YL6mVku9SZz54BGea6E4MbKs=": "10266024000000", + "Y3cVL8O3eZbj3poT1qOfUrq0bi9ecDOS39OQyP4r3pY=": "448838000000", + "Y3i_MzyQS3adBT9_GxwnC3o3Iu4JcjKt-rLCxXuEL70=": "1927525000000", + "Y3omyJD67YDSk8ywFSOC3aJpMFMnwUiAMiIrNp8zFq4=": "4098572000000", + "Y4bTRLqXR6OAL70gljF2JMIsh0yo2bOEhjv_TsbnJRU=": "384150000000", + "Y5AZfS0SVsBujqyinAZFtu-vQBjclCOFhHzqw4h5er8=": "407808000000", + "Y5fvkAPzkQMOhC8SZvB7YhZ9wVMEeEBQKMbcyVXSu7A=": "1636685000000", + "Y6DrnrBBeyLnO7olbilkp1fZJO5wPASdcNZExgSiYDQ=": "467231000000", + "Y6qM6VDH8jYTPwDxFX-hRrCOXK9VFkiM_AdT7FsV9DY=": "456319000000", + "Y75OQbZ4E9cC7tWn5pYmck_ECfAZnyh_gpL5OBWj1iw=": "455781000000", + "Y7JssOpppvAQN-J8LQEPBsXLKi_oDanPt6IU99mBI1w=": "454545000000", + "Y7Odt5T1iW3w6OCzhi3tvBo3yGICBkBEbFZuGSzf_Yk=": "2384394000000", + "Y7SSIv12_-W7Q6-heCaM7xjizLAs8JNaC1cIF30FsuY=": "470310000000", + "Y7_wFNjAcJDfuzMh8lDj97a1Cq9Jg6Ud5RnhKQ0vdP8=": "2257489000000", + "Y8-tLNc-tcHM8GQU4b53x5_w234xvgzJT3APGvTz6VA=": "1391513000000", + "Y82d5_ObOlyfQilEyKlhxy2S6G6J3k2_K3NXJpiDKDo=": "921144000000", + "Y89-r-ShAtnsUr6ZXqi85yr7pYu9XUXzTU4wJiT483Y=": "416666000000", + "Y8DXRQ24U9K5pxV2Qf24Rv4ymDhUtB_MefcDOF3pG8k=": "482124000000", + "Y8esuuIDRFsF-pfKerv_d-VTC5oJqOMATTuS92LbE1E=": "3807115000000", + "Y8fnrogG-YmshrWDuFZy9MEInMiBekYzv0LVqWrwORI=": "384112000000", + "Y8isxoyxC6xOPqk7KZcXMcjDJrdcmlcKoTF575idSbg=": "924820000000", + "Y8mJVctjzHmAKSXvW9k1ye2mqRlHXdKMo7Ef38sOVE4=": "462146000000", + "Y8tIJNL0_Cno8-KpAqwp_URGpEwZey20b3TrwnhMP88=": "384730000000", + "Y8vpCyjfi6GP0mSj7mYjVyS9ahSfUHC_HcEySJi6nc4=": "1666666000000", + "Y9-5ffRdlGFhLwquxQkhPAnI1w4meXE0ViI2HBHgP_A=": "385506000000", + "Y965E0FJ1NrIh4aFiKN7eK8Y01J5_C_DkMPmErBpCyw=": "755840000000", + "Y9FO3sX5eQqkjx9xKX9Xez6D0PWSAj7Y7LEsvEWTung=": "389421000000", + "Y9N90XIiy4fwtEH5H_72wgxcw6eOdPBhyIGYMI_rcPo=": "903496000000", + "Y9jS7qCsDAZTPJzZrHsBxmuG09zy958DDIfrmnX-n48=": "1818181000000", + "Y9rHBn3ScoTHL2ZquD4V0EE_PfLYgP2mbvABMfrXzMs=": "7256371000000", + "YALJTnYZx0Z74wFFKSDncOxq-hH5zjb9ri6oaL-5nIE=": "453736000000", + "YAqIR302j6Cm2ybKixzfPnqIq2sY1rfeac4C0m38Bok=": "385660000000", + "YBJpXtkNmnpjCwJ7xfqCNWpr1JQEOOUdK75Fair9-us=": "384111000000", + "YBROB_Bi1L38zT8y3Zn4xLGjZjCU7sm7I3hhgy3g0BA=": "1157593000000", + "YBb8LIROExvwk4wIrWpEsnEJ_9lHGRUdJFS8MOEkMrM=": "385506000000", + "YBnYWmgyKKLmG0FWteltYpCLw7aFra6-KQhx_xS2qFI=": "385189000000", + "YBx-wivf1f00JAYxsy34DswLXStgTk-bPOaHuXi-Afk=": "465433000000", + "YC-u0SuSdcDoAL-hBMTtr_UmCKfp8yjmLMMQBTFvsO4=": "353298000000", + "YCF2EnAhuHJv_LqURPXokrchtmWkSPUDBntbvFx0VwM=": "387115000000", + "YCInagu9D0ukKTWi0WRRY1YZqQDsWuWtH5k5Szpk09Q=": "1538987000000", + "YD8kW33G2uXY7aNL6esw2zB6wzyG_VXitsb3VAM4mf4=": "378561000000", + "YDAEtAPf31kBoN7PFemjBKOOhW4x8u9sjdsw_Q0-Zo4=": "1248097000000", + "YDMFiYe8Tl6Nepkot7eFlKXx4MnmHX4XwxWLudMAReM=": "2264332000000", + "YDSX5nkgPPJklaBuP_vFF6Wi-_oG8MJSECN6z3dLjgU=": "1908094000000", + "YE6bhzblzkfM-Kn5vv9Sr6aOkhj20CFefcgFzBYzw-I=": "2140514000000", + "YEWimCzUfu7Wl4IRh9meGI4b4o1bSfqKTqiPPhor2H8=": "764788000000", + "YEpsVTQrHw3RUbkp98d2Ljkn2jfH-W8UUafrK3a-USI=": "4174124000000", + "YErFxPMPYtQ_L7WYSxay-Bf2dTe2tB4SMDlb11IYzYw=": "488135000000", + "YFAPf7EXMil0IgXyAqSZa64tyN93xdydfsY1mBLXGzM=": "1159720000000", + "YFN-kYiK6xoGVoJNqpr9j8Rt7JH8zsnFZIdcRskNisw=": "1338544000000", + "YFbgc_4aVHnsl82FrTP8aXYpKYPiOUivb2mi4GMKeEw=": "457648000000", + "YFc6PeCdkkF-Cp93IqIiQdqwjSbr0HiaW0fzEbgiYuc=": "1750556000000", + "YFlI4krFRxGc-3DkgGoBr0ttW8C4pfESCXr8UDjlzFg=": "444665000000", + "YFrB79t1teMAws5wcLRwnHcBqOG1S5xR5dLUhq66B-g=": "1179588000000", + "YGHplh3TBAP-vjTQnObh0vNSfVHrfhidKjwQIQaxgLU=": "1131764000000", + "YGXGckBEr7mr0PAUqY_-UsX36fZDXvZPeqe6dwq3DJQ=": "381294000000", + "YGZ1sYFDOR9q9On_aQpOxylWN6ZKwWDrMe8rdnTzDTE=": "922309000000", + "YGhB38xHTqtG9t5bQLjyLf_NwJRKMJQTpa6vHw1LhJ8=": "2730761000000", + "YH-0Wu-4o84U-Q0mjt7UH8VU5RKB5-xxkNULFaI_Fv0=": "1161063000000", + "YHWW4i7kA2s8Gm5X3W43A1IP_3RdWLTbzhVPVEqLSI4=": "920582000000", + "YHZSg9kJ24B3ipQlcJ9kf-dKzvaazwTA1pzYO_Hwkxk=": "19236309000000", + "YHz582Ui9Rx8eCXCiTfMSIcmmBxtK4BZWk_LzLa2LO4=": "384160000000", + "YI-uSNOtyERr7f891mvD-rh5tB67uFkOV3ztgKL37Rk=": "384869000000", + "YIPvDxg7U-OADX9M-zs02zVFmwtRumU5iQcX9xHRQoc=": "416666000000", + "YIcLPUPh_g5X4CDaMU_2XyIlwIDbuq4rKDJjLq9375Y=": "584874000000", + "YIlJ3i0poWpWDbxwIfgQei4Zs861lfewLDniq4of-ng=": "411085000000", + "YJ0JZLn0A4z-e00HYPjR62hN7BX5EUByNwC0gFXxyOU=": "755868000000", + "YK0ILVE2xZx3xnLjvhVDaz6nHtkmmk_1XdC1SxQRtNk=": "504754000000", + "YKEB2jt8ho2qHgqk_-Al7kz7aQhTEOu9baBZUh1J4go=": "381632000000", + "YKOmTtmy5DHLmcCGZAv4o-fyWXnL2geBDp5zeFARhYM=": "1144304000000", + "YKsI_3zUgQXEdTlu3Z_Oe_fDiHNtSkj5iRcK5UVTdc0=": "1156517000000", + "YLFYoWTMl994KpGFvHYzY_HHsWA6sLv-xzwRhbhZEp4=": "384615000000", + "YLGNYS9sgA5cFks6IJpBTTy5GyUcYgTQtKQXsZXNX2w=": "398095000000", + "YLIm2KMM0z698GoukQwlF3BFojqk5TdizLPoPqpjCnM=": "393570000000", + "YLYIMLRGpTw4-hsfO_xCIeJ7ZZNXHY3YxEu3Zjgl3i4=": "2290886000000", + "YLut5lsqb_3qUrV2wvshYAc1p6kBCLe64JR2vjZFJLc=": "1956801000000", + "YM-VBD7bsxkwuv_nBCtteX6mYkRnq1LvBnlYVCIOx80=": "4007241000000", + "YM0dwRLSTA7JhaWYLWtHu-k3dhMqd5iKncP0YaRYy7Y=": "1142450000000", + "YMP-uGDKCBaR-EGR4ojWIhsMgpSq-X-nDMkZsN6fGXk=": "462146000000", + "YMtjwkru0z_AWibvoNnFUjAP_bMUGjZO9LcUgBgznxI=": "386288000000", + "YMtoDkNK9a81QltKpcmDGxfLoghEvwbyQRdEZZyjOPs=": "374327000000", + "YMzlv0r-HAK2XW75H5GpS8HG1y1Jpplz12srpVO3pz4=": "384741000000", + "YN1Ev6OqpJg-tgnV7h7ssy7PZt8h4S14ZajCnDK4K84=": "383644000000", + "YN6uBaGLMT0mrCR2X-kiauZF1O7ZipTqSSMqCFqxWvg=": "1175518000000", + "YNltTC3n7qMnMNfBPxCM5cN25Qaus97JCB1XOCceYoQ=": "1927528000000", + "YNm8_z-KODPymuBZaFDz6H2tOXdDRTVyQWJ1VOEN1xE=": "1573782000000", + "YO2X-eodNEl0Glx2sXd9d_BPAHoxJBxXJoN23EQBEK4=": "2274081000000", + "YOw6FQIYoBKPjQVzSD-6MAAFzR8S92Xu5KYcsfxq_9I=": "1250021000000", + "YP7iaoblMPrD17Vt0GCz0rWJ4VsND1c7FJS8nmZPydY=": "416673000000", + "YPSufEqfCysSVoy2FzwT8nzENs-FTkcKHp4dLvJL768=": "760231000000", + "YQ0ga_SS4E5-VkLKak7q-mvqP_vt8xm_9MKQvVRCC2I=": "384615000000", + "YQ6LUaPxZwl5FJwrtCRj1FYAm7LQ0xCEf_d5UOer5Do=": "426403000000", + "YQJnE_wN9Lv2hfKOB_8yHJSoHO9sjPagWSsEEqcLDFk=": "1164850000000", + "YQk9BORKWKwaekHBYiKsZMlLNjLbLG_wrEGcD9kJAJk=": "453783000000", + "YR6qR25qYfJ-PbKidYJw8A6_hc1kfalNEXZZPKigitY=": "390053000000", + "YRGVsPjkK-ba2OkzgkhYo8TqMxgaJA2TrYzyJEOEWOM=": "906627000000", + "YROUFsrSkz6dy7NzZUb3EvoKpJWYbYCcXjtLWs7-4r8=": "1363636000000", + "YSAeNOtwflVsXFTsZMLCLY8-wKB4EAYI_bdMDntZD-M=": "383903000000", + "YSDJZr2x1TV4kEDGZLH3x6-IJhesPxCmPnAk9TK2WWg=": "1374041000000", + "YSR2n4V5jTfmLHQky5U49v-iX1pPSvg_Sad0s5DCQaw=": "16197770000000", + "YSYaqKGgWLtEyD9hEOK7QZMBoo-JxFQ_S8migx1CFmc=": "777529000000", + "YTEjVrSxN4IJJNAISinruA8d1kqDkBr6VrVsdsKQqM0=": "379542000000", + "YTk_IqXaIFyi8LpD723uu1Jx5GWBdzt8OCSghdalarI=": "404015000000", + "YTmm-vscsR_BoUICWMPTHgVjMxgO0vr2GfLHaM4qENk=": "473331000000", + "YTp6WxeNUzUmiMlXAOJFB_cuqvqNjJ3QYyx7Ei6qQYQ=": "4581801000000", + "YUMy68WpfnMEjn5FCNdSm35qvbDTokNUsXyxmYfyhyU=": "385510000000", + "YUrf0mNyzZ_RiOveNNPjrfeGw-e99iYikfTcDdcWm1I=": "1822359000000", + "YV7_oEPqqWluBL1upqAW6sw-ULaGxpab0moArbFi6II=": "1542796000000", + "YVIxEscFQw6S1r0cyTOdRbucvl_FOP_ZKUiX1lPaZcc=": "1309889000000", + "YVPts7Cni5Jc3MuUazvPljFAjYBUnPx9nGOr83AT6BE=": "832223000000", + "YVzC3OYrVHjC-dpfGPXHi5aDh8aXkmt5iu06YP5dIQU=": "767594000000", + "YWe-WUodmInM26D_8zGFx4MmSKVlpecY5W7agQdCbnk=": "461555000000", + "YWmZmxCN-LGgLMY_2bXK-Ih3i_Vf5puPvKDyg-q9ilU=": "781016000000", + "YX3sY8AJNiR057GQvIG87zbPtlO65jSdgOPcNDkgLzM=": "385614000000", + "YXJS593RO5TG4YRktfnEgkm6JCmGhGop6Dd0eUspi7E=": "379260000000", + "YXKusZ31RUgLHRoUPjGG6OdPia7TdZTacFwHt78SXIE=": "759269000000", + "YXSsyKqSgsm0fbW1c2oUCLG5bpEbhHvpzt1XOSqcMSA=": "381839000000", + "YXoyzfLLeQQ_kbIav-QoOTGChipQ9iQ7H3qC0c2rqW0=": "3933873000000", + "YXuHB582zP8UwKWIckomjzF8F_kHkB8rwyULOGtU3qw=": "1153846000000", + "YYLAkf-vmn5cLlBEXNP_D3TehKvlchO8e_q8HA7tf70=": "1923886000000", + "YYkkQTLW0R9zK-OtN6EwJHPWiBqf6DGTdMi8Sia4SGk=": "2055429000000", + "YYryv6-5SYfbL1DNcHHrILdmdjfctTDQ5Iqxt5a_yuc=": "385505000000", + "YYslhjq4N37vJBB7ZOuIZXIg20IHOhQ7kVkVSBj2Frw=": "3461538000000", + "YYyVvXPhliYi8mOgdptJof0H55QEQ9cuBmf_ZRa1Rcw=": "1788788000000", + "YZ2TX5y2VwUWZTkcVJ4CJQbk7fqH9gQAAVLG9GXCv68=": "465048000000", + "YZG4MF500Fg-jn_9P3jmF9iHfOTw28iMLVYEZqcpHjM=": "850425000000", + "Y_3eh7KJW12tlykjJ-k2PxCIWBEVZC37Dwvt_ezn7PA=": "502779000000", + "Y_bI_ARmoW4VGMYO51R-5JeJT44HCeEnbDpC0G7q50o=": "410399000000", + "Y_u03_jxP9k4kQ9SYACGgdV-3OLJaCz6YlTcyN3eE0Q=": "902833000000", + "Y_xzKTxyNGD_LkPvhKpKej1TksmS4URs0M9ia4rJW6U=": "411085000000", + "Y_yzz2X7Y2nZXf9oHTHQUuFQ108T6u9Pphavyu4W7N8=": "503175000000", + "Ya3JJBDsaUHztBPsWlZc6mRlXsGwij05s40Yan58NHM=": "488979000000", + "YaSiLHSgbx0D6yJ8ea2ny8tHga55LOO2p5kP8aCIsAw=": "384652000000", + "YaWV6iM7tVxm7FWUlJQ8msL5PTXdMMlp1prBamTCQSg=": "379260000000", + "YaXGwW6Eqm-D6t2Gnb86SqNmuX-CfqBhFyDZdF1Nhfk=": "3846153000000", + "YadRJ64fHDBHhDLub4DWt1-4qr1vQq_tSMIACeriChU=": "617118000000", + "YailsVASrtCWqig-LJSciBBi-LyKw_H8Yi5kltQLeQ0=": "384941000000", + "Yb2ebHtK2sOIF4H9naghzpEce6zV4dpYmh42-7zkqUI=": "384615000000", + "Yb8dmUoCDIbvmJwsYT8rHGQDrv2pvskp0puV1LZDLAM=": "384892000000", + "YbFkqmtkNOmyboUe8JuMp-cfwSu87wT70cnZkPnPU3c=": "386931000000", + "Ybej4u_Pw-TkjqwfKJ-ezuHn7K-P0FP7VHYOakqM0Wo=": "727405000000", + "YbwQCruXuvmSzGFJlf5CegeaBXn4qaYC4eXECmJx0co=": "467234000000", + "YcFxmF0nd4ZPgwNSfg0nK-huTMQb8Xytjy_uET0Ky30=": "425255000000", + "Yca-zpI52p5Q7LKJXLBHgdEjVM7y8vdh7LMsaFCJeAs=": "383289000000", + "YdCtYQBfifEZKpv5Wwl6IStF0Sg6ckUDF33RcoTLtVA=": "420514000000", + "Yd_PUk6dSLv4ZIulRTl0vtR1zT5yD-Fo2R-pK_3poig=": "4565201000000", + "YdtbhgZKlkmbJtdlJPT8mHBNXXmSaIM_RY6bgJm6qyQ=": "380589000000", + "Ye5ZZw8_nDgsP7AhScO9N38SCt28NOkPad4mE6bsx6k=": "1817940000000", + "Yec2kZguWYuWBS8NWZZAxuSFe5dWJzCdwGhGnV-OWfU=": "946002000000", + "Yf3EIi6cfSyAKoI0F7rORuUDmGYSuC-0MPHXNoh8ajQ=": "1153846000000", + "Yf3infdgnXSDKZ1Nui7bDZgXr0wDnKYDlJBbAgTg_tM=": "472009000000", + "YfEGBR_jzR3NbwQdf7E5RSyd2a-Bf4tftVCXFnNEC_Q=": "463498000000", + "YfKRNL0Ww2zH6jP1rNvZMpbH7_3Ii8sUxKuUm6mQXiw=": "457740000000", + "YfRIrSbecOraQ0QsCgNFbdg7M7hxUM4WHn8EiMlNgFM=": "459850000000", + "Yg9vla_3xigIc5Z4Fd5bMD7aTxVMnioP41riEl-T898=": "925648000000", + "YgYatIM1awJc8Z11ybOHgpH-dx38GSoPkdKCrX3dR_U=": "763244000000", + "YgcVb6AbhSuL319MqbVIeS-FSeBld_vGKuADNYxG0N4=": "388478000000", + "YgyQrBG7UvfvPglfB79u1iG23UBo_GfSuKZ6IpMP-KA=": "1153846000000", + "Yh7OOw-6nQaDItM6BNTMoL6RpwzNzHFSEYHYSf07JSM=": "18181818000000", + "YhRDaZSgJM3JqNhNh2UP5BChNQz_53PGydZdDEQ0Ivg=": "1923076000000", + "Yi1YWg5Fh7A8tE5cnY2NzMMyIqLVm0BpXUVp4eyJvr4=": "2060882000000", + "Yi5OhlOpSonpxtLF2qxFfJhsyYYAGMKO24bQnp4JymE=": "411594000000", + "Yi5e-91zvwq7CY4KADvqZRXZ_q0GHTACJkli4U6xEr8=": "377309000000", + "Yi9277KC6ScJvxfOzdERcL_ztt8JDdJ2-Ds-K3WW10E=": "701782000000", + "Yihg-PmPcaWKLa3Fi9yVOucIlrbEjlUr1uTggr5IjEg=": "384615000000", + "YizRbNgPZuOKu6Ajk83slFEYoAFpGyMaG50bJgKvFCE=": "454370000000", + "YjKHewZsMdqj46Yw5qDHnDioOtanDrQnd8_Fy-p5hZc=": "1155274000000", + "YjKLRvr-vDtD4dBr-T-8yiUaQAR5wQZ5prh0MYZBUb4=": "424548000000", + "YjPWVqUTnlheRtq2orO5jakpTSRmLkbmibxpafCU4jI=": "450738000000", + "YjqnHeE0S5RPIvecfpQK-gJnosU8vOhci6xLXjtx5vA=": "416408000000", + "YjundBNjd5K9C7OqNlDOVFhYv7tpLUrJEdfFHnSPops=": "555325000000", + "YjzDBbzdypjyKcALtAEkPEHk5n2yc0nxrDG-OC5j0tI=": "384615000000", + "Yk8Nh_JuYxwipQdyy4y2mQDKRJjLYcg-wKBC_HUWBR0=": "3181164000000", + "Yke2APhhAym_StYtKGxcRpNsSPH7AlefKxPyfX6MX_c=": "770374000000", + "YkfvuvwJ96Ukr8Yv_NZ-N5dtiaNBsrMXKfqEL-imFfA=": "411085000000", + "YkrVirsmP9iKHoS8NKoTcySsjRdYbllfIhI0CQG6K7s=": "833333000000", + "Yl1ttqrEQulC0OvB2n9GJE8LdMcU9G8-c46pGUQ0gcQ=": "460952000000", + "YlFdBCXh0Xc8o6kG0tAEWM7hG1fHg1w0AqSZzDQvqeQ=": "498366000000", + "YlHNLPGDCSOZfW1g764t5NaN4SdAQK9izN_BYJ1hk00=": "838319000000", + "Ylifj8NaJNCYpPrYmvykcNUq5Zcz_QdRJihNEBU1CrY=": "1274301000000", + "Ylu064XqRcretcPzzkaHidtef2bHPelJLYSFMR5wK88=": "407469000000", + "YlzKRahI2oo4LE8pT4ERO6KMOnNnZP9pHWTp1kGKfPI=": "464104000000", + "Ym6nrZdRuDMy7f0t3JV3v6z1KefBtGEt9uAouvoSnGY=": "462839000000", + "YmWtEQVfq7kqvjnf3xSsGUhNNAvHYR_Wzxzudcy4mMs=": "3287659000000", + "Ymj9nnUxGkgvdBq_Lh1RYzD_ylm_ojcA_pk45-2Qg5c=": "3923076000000", + "Yna-22gAsU__qLsrbgwIlcedYzIUiG-OteHxP_yzqPY=": "5994080000000", + "Ynazj7OkinKlqLxCXYG1QlDFPSD12HTxwpwZEL-iSw8=": "8021760000000", + "YncJFdanzdXrFeexViNe7BWIDxKRgh_v0bAulnwdjdc=": "912339000000", + "YncRMQNXvADmljlA7e4vRFjGXIr2QTGSFrZDXuL-spA=": "454545000000", + "YnhGfelWeN_T-zCHhI1FoWnow8e8uM9SiWjDym8Vsis=": "422561000000", + "YnwAvFBRCxZCry5hTQndGzKlGKry5kMN2kbZyPOOp08=": "390816000000", + "YoaQeCfTRnjnE12Fjf7a49QAMmD0eoq06cC1VegWjMA=": "653846000000", + "YobJ3KDcRueyphVSgNG56PJ_tChMxwZLOdsSOehGmO8=": "384615000000", + "Yof1waUTPZINDnGJm8muHBs11VNjC2OAeewtLS9MqVc=": "1528743000000", + "YofuJgZojTlTyM1d90CTpaDtpIo0mtmg2Hg47vwx5yQ=": "820209000000", + "YoiPYds_uYTBopi3p_Kuni7-vb__BvKs_1mt2uSeWTE=": "1916873000000", + "YomUvu3vqzEXQaYL7yDvtXbYQAxS23Gx-6Hr4w-SRwg=": "1673648000000", + "Yp2WipxdLZ2MO9DN_mPMRnpB7XdsNIisFAusCF9ig58=": "384615000000", + "YpTSROiEZztEp43LLiNnNMLIm-cFLfSaDS1UgTs3IaQ=": "574775000000", + "Yq1YT6cY55E2iqNtxqkH9CPZjqYXKzcpaRd9tovUIx0=": "383334000000", + "YqNdFzryCrmM_E_uvSrr-P5SCNO_Q6nVVC3IGUuA1jg=": "424045000000", + "Yqf17e8DQxVNuze7_MgWghIFUoa_VT1YZ1l4BrZaGqQ=": "833333000000", + "Yr6tLxqP9_dNSA16bt50ewkpcrMDl3vbK5GjSeh1Cvs=": "4147477000000", + "YrLhaguZTy6-Kev96RO5lQSJ1456D5ODh3PDHb2zdt0=": "501408000000", + "YrPaZFSMwF63fahb-bGcGDXIpQ_rMkEWHPYU-zXRFTc=": "1931896000000", + "Yrk4m5jqGKdmazS4V7hysKpSp9YBgXYMhzFg1ZomhsI=": "769230000000", + "Ys92nqDppM0cpqFtfnKMZRObgKLZuKyYvcTzg9eh4zc=": "438461000000", + "YsYCdMK7JuZ1juIYfu0T8QN8fboq-nlKvUljeUmO090=": "386039000000", + "YseSgdGxUSprsU2MqIs927WPjd__5QcX4taw-DUY9Jo=": "776238000000", + "YsxFpb4wuAAP6q0qhDL3GWmSnvLAqeuWyaz3n9xoaQc=": "500070000000", + "Yt3AX9009PJx80OPN9gZLlJAFcsEbh9hg6Rvz8ZWycs=": "1136363000000", + "YtH2nhbvL8EFKgjrWxQUdlSHJACmiuTFE-wB26op8E4=": "485133000000", + "Yt_ZimiD0HbXRdvfoP5F3Vb1FLW2TAbHOu8GKOagOII=": "2031023000000", + "Yta7SHkhW7LE-Ci-CMLoLdouMCkn52Wh18q_Ljrbhoo=": "1004528000000", + "Ytj32jXyjyh0mkb52IdgiBb2r5bIQBErkZf4IlHkqkw=": "13772727000000", + "YuJDLRoUQPO2R-Dz90A-8-O90LmMPP0wfIC2mxH-tzI=": "416673000000", + "YuTwJz6ziH6xTVWyTIxObv25gTGJp0O4gdFlLSbUVd0=": "460148000000", + "YvN0WnAv2ceAwC5mOrK6T4W0eOh8RFaALZ92NFsIzk8=": "384615000000", + "YvQ00jw7SvdSKCS22Kob-hoyuP2eQ_U_yHlV-C0eUII=": "385505000000", + "YvW-00qCVZZ30C6x4TexYxPj7DPhTLsBc6acEIEULgM=": "446347000000", + "Yvd9yePNbBSC44JsuRcIxun__QyIa-riZmWQIJ43YvQ=": "385507000000", + "YvgnyeVpEYiRKVkrCcn2zus7Poblr_DZzH-IOCibsO4=": "385507000000", + "YwCz1AfDS-GE5DdzAqf8lSsiW6H24FeSzd3DH21oLks=": "1153846000000", + "YwdSzcuVVP1tDkXpdckQVjN3ekXqW8fAGOkV9TGJP_w=": "395728000000", + "YwfJ_KvTf4nl_-I49RYeYZyJlcOxL5CoPeltowZE1b4=": "454353000000", + "YwulYIlos1EW1DgA83E7-VuugEgqyz3IqkgWsVXmgbs=": "390993000000", + "YxDLgRObU3VfTR2a3iZLd-Z03IXY1OQUBwo-sBTYOOY=": "769230000000", + "YxElsSEyXk4JIbekebeJHuI1qEQfyvaPuovsLbuQiE8=": "385507000000", + "YxsUZ7FisLB_G1-xhPTBF--Td1KGXJwF83LVJ9K60nY=": "1728662000000", + "YyEHf8AJvxJrHR_PhVHqmtWauo5RMXsDCkXBZVrFpWk=": "400371000000", + "YyIjTkvRUYWNNW7yYNMPGzyDImTx6RLoZSjczwWmPHQ=": "468609000000", + "YylMccquKep66ZSMvt0PoVkJD-bPMPHWjkdGID9b-44=": "384615000000", + "Yza9nVOduML85DVhlUlYozkYZiOzM0yU-bCzRSXSdqA=": "460586000000", + "Z-So0_hDTy_2CeyrTJZfNqXdpDvqJoXQ8AxfZ6L2JQ0=": "454545000000", + "Z-o-e2W-QjP6JWozlOLjHVdoCJibA-UpLtmsW5Zl42Y=": "769230000000", + "Z0ULeSuEB9ojst8hmvnqPUrV0kUHpwTJOuU_3XwUK5U=": "1366800000000", + "Z0VydTjnNmBSQWrVvjXPcHcQd9EJrYNqTYrj4GHnsjg=": "397332000000", + "Z0oRVmqvt8ZTnK1qQ1RHfF-8u7JYnMbMkPUgpfJALY8=": "1927545000000", + "Z1DrHtdiAMdKrHeXwTBfFn-rZ_oYdQw89-QSwqLGLrU=": "769777000000", + "Z1rwUemOEKz5b9aAnNzRx_9kApFNAjB_rg10itdSn0U=": "3842983000000", + "Z22AkOEBFxMfRN7UJxQuqPJaCXIs97sXMA35OS8gcjw=": "384029000000", + "Z2C2eerE6n8ZCM1Ec7zoMJxTTd-T4_TLabeGHZE3N38=": "1415034000000", + "Z2DA0wFKUMw_IsyjZvq6jCRIucju5lxHdYBZhCI-u8k=": "383370000000", + "Z2LoWjhQOKXxHNCPjZ0-e_Z8YMQDMhDnX9Xrf_gcLiI=": "756302000000", + "Z2OPzLm2TQqbLGBpcQ7jA6iSqXJog3PTcSleyz3-7hI=": "391132000000", + "Z36c_tzeZCLXTQOF9-rCOOohfFZbh5hmrQU0qF_N9i4=": "2318813000000", + "Z37022BPoVhKEpmNsl02QBLf6cGVxhROTPpM0wN6UtA=": "415455000000", + "Z3BOfdLrIMPmEikXbRHPkA0Dq7Vl_yNLzCo5gfBLzNM=": "1924454000000", + "Z3DPUHO5A1LCWIb9xPy-tRaDYOH9a8QPGNPkv4QeKhw=": "909090000000", + "Z3ZvfbtIwGyXGIH4feQFyKIi9qqlLwvQipLsIo5uMlg=": "458877000000", + "Z3cGZyEbHFSxQ_LCJ7MP_tkemfykpPz-Q-CGTYpyMik=": "833333000000", + "Z3o0a5liOvhWXSLgtIIQBcjJDQN8OaRd5U_kV0x2cz8=": "447942000000", + "Z4xy6u_gmaHhhqI3cwT8HB9il47OXBHyn2T5zydUenw=": "362194000000", + "Z6kv4ZTqKveD_H6u_UWsBaiAALj5tCk5atdkTIqMbCU=": "2020141000000", + "Z6v5tOHHv06vaxfhUCf3TUvkxReOG9AevPNaczty71A=": "3848827000000", + "Z7aPtNu702r5vTQWkohvA3VhR7zgF443aVUwNkatDMk=": "648033000000", + "Z7jJ52IP1FJ-Z2PUJ6uhPN_iMPfb4dnmoNUtT1d_Azs=": "7433031000000", + "Z8-BEfZRBxtS_VtqXcyDfQL3-mi5Oc93shZRqqz2MRs=": "1083291000000", + "Z80pwhDSSDrTW3hRzYFpbcD5_iIMwBOxb5Qenta6_90=": "1110651000000", + "Z89KV_pfnU0mHzvT8lrsCfN-0gq_-mctlv4wlD7i_cA=": "501104000000", + "Z8PE7cgv7W0Y0J5xhLgoepyYknH6Nafd3a1wHYCZPl8=": "1239855000000", + "Z8U_bPgvWkT0PZWoB8S_k35HAQsSRvmee5M0yndyJNY=": "381714000000", + "Z8Zjdo3A_-NOFZox0Yik3abIG9h8XKtnkNjkgjyHY1c=": "381805000000", + "Z9-jhWY28qLjrXiauvhfHf2QLfrxX0XmAUX9DF3wwRg=": "1603820000000", + "Z9ldzynVH-HcGDz9U92lSX9DYr8s7G_QSwhxGEDMwDk=": "384615000000", + "Z9viiUTPaz6wPCqN2wXVvFKCto0Stc7DpRxXR2DoIIQ=": "796003000000", + "ZA0YqLs9Hlkhs1UfbyHzrw8JHreSLdgjEskZXzdwH1s=": "384615000000", + "ZA4NcNTyBkmb0M5TkGFKnMuOSwOn_12W1-FGs-_eevg=": "461538000000", + "ZA95N3gT5B69ggBPVIDJz5TQMTkRkxJO9GeUO2oqdSA=": "411851000000", + "ZAKhscOpH-H6rQbZNQXH9k0332GD21EKygT-6t58u1Y=": "692307000000", + "ZAP3PpybjfQ1lnF1GliNYAnOGmdrw02el1cvdE2PzF4=": "382737000000", + "ZAWmTU69h9SjZ82JrQGhPixOGJKzq3rRhH_d-M4IP9Y=": "1823608000000", + "ZApQIejdBKFFAR9fihTAYKsLH2l0HbyJd38jA0C826U=": "390680000000", + "ZApd0rispXs47dhPVHW_509ig3N5eO0S_xXnk1rlXro=": "3050505000000", + "ZAzb0eCYJMgoUnqsbNRZvbPdTeukv8Kwo4eDmWCK26U=": "452035000000", + "ZB3UUoWxovSIiA6ceshxZMsc8vUzXtZsm_ZP2Gs4mzU=": "417190000000", + "ZBQceMaf7MYxbrclvRfCckQZ8YZBbMxgUo-6aVSOzrQ=": "1168447000000", + "ZBbQ1KS9vsXbxj3rMDadzr9Mm0r2NbUOVnPOk0LiLz8=": "2083333000000", + "ZBhKGvaGFCCPi0Ob95o0_I-vPpiHgnDUTE5A3CRQK5o=": "464300000000", + "ZC19mtkS4XcFhTS00g3GbeWnBj7C6StIL8FEUtcgaGE=": "400371000000", + "ZCLl8FhR_KfGMyqGGoG21ViXb5OIsfPRpZooxgm0ekc=": "2499999000000", + "ZCRHlykhr94rfYDc9ecEA86U-2umNDTZAWD3eanIz_c=": "420518000000", + "ZDBGMPOC23TA2VV9kHilVjq4mKC9_TmO5p_TnYNowMw=": "408960000000", + "ZDK9NZcvUTJKIusfJYvKsdNv_Lt8LrEmbZhMOK71LOU=": "454545000000", + "ZDlUFmZJR--uOW4sm5FIiM7jv16PIaWsji6m94prPAk=": "384615000000", + "ZE0J6k8tHU04kWRFht5fySvPH7c1d83iN62YNkNlnDg=": "3242898000000", + "ZEIBmGF_fyMK7r-yAu6T8ouqgCrY9Cu1UZmgqwfhL8Q=": "491516000000", + "ZF5nvlh4K2WPtaYo6yiUgqxk5je3-DdJ-0SWM_EkM1Y=": "3856992000000", + "ZFQ7HXYEusvzffAZHYDDo0eTBpX8f74y2nw6NT84NEY=": "35426417000000", + "ZFVLsUEl1ZKeEot3Qyz7xwozY03d1ubycxrSXJbLA64=": "407469000000", + "ZFatSHUOZPFUQFYr4XdYgBz4QhIZU6eXgTvMUwfrYQA=": "642211000000", + "ZGT505s--gjVyGfLYvOqhRLJFVeXauhfIouSmdi9uD0=": "379354000000", + "ZGwak7FilKJGXQekIIlAqjQCmY_LS2vDQPAywtZrlXE=": "2084176000000", + "ZH4hDQa6Y58xxFe0Xm_n9IF5hoTXy5f6_R4Pz5kQL1c=": "381439000000", + "ZH8Ug4dyoOGxdpznUK67ERtNGoUpgkeIZEo4B5Fr-sQ=": "893416000000", + "ZHJF199Pk2eW3z5nLY-q9ecVwxOG7gzZ18bqVeSDbec=": "12499999000000", + "ZHOblNBwp4qB33KFa1p-8alW8aV-om9UdlAkvWhobJc=": "656013000000", + "ZHgbpnMiPxQXwwyKbfrUrzuDauMFc0Zviv2HlaEjmhs=": "411085000000", + "ZI-SKIZDjKEeEFY0Th_jM-Wxc188m63aFa9MSH2xchw=": "384615000000", + "ZI65q6I4c0Rx15N1ZaKIA89vh_SzvA_mO4WwUVaizfM=": "424426000000", + "ZIEDhumDdeNsd2xCL5sNqbtKa5fx3bzepuyQ57Wz500=": "454556000000", + "ZIExOYMoPdD4VheeW3l-YyUG7MG8pBO6Cp1LpW0ccXM=": "21200014000000", + "ZIXKaA_GxFLH9cC087Z5EgyFXzXSQ-y-xyQg6lnyX-4=": "1131938000000", + "ZIgj57JhHkaT5bH7YVT1mSyLlaT_XtYmv_vZ_IDz-sc=": "411085000000", + "ZIiVakPvi0oNbAETB_5jTYjIrzHBdFvdKMwUkHylfkw=": "385935000000", + "ZIkGQNOr0MIrxbVFojj1kSy6NR45yweBbQ29LZqWREg=": "769523000000", + "ZJEfx6_zi-j6a4WxwzN2LB5LnVxfebKqyPCZzp8fBYM=": "422561000000", + "ZJVkkEAbXgAxBaHANEfK27uVstbBW8VF0fB4ZZnTOGg=": "378611000000", + "ZJcsizcsbnkABGPsOjdiJC0ZeeA2VPCNsqczyul-AGk=": "399403000000", + "ZJk97XaaCS3MjlPjFlZlscLWboq35gybw3nvB_2FV64=": "1536921000000", + "ZKnAjuqh8gNmqu3sBpAG1FftHpHWs7XUIEH22U-hKII=": "384615000000", + "ZL0AA8pE8VZdTW-urugKY6o4JZnDFLezQdu0yHgl_XQ=": "1912992000000", + "ZL7s5Dy4wGUMeGzvi3d4IhoaIitElEZ7DzzbadN0uZg=": "420518000000", + "ZLHrR4A007xZE8j-kgL0PyXcii2jBK4US4qZXbQd4a0=": "384283000000", + "ZLM4OPn5ydR1aoWkmxzYQ9XY-nwM7c9ljwbYWIcG6HE=": "465040000000", + "ZLUio5YYclIG2TkvXBgg9LoQrSQ1ZDInGsFYMKVoHWw=": "388711000000", + "ZLam7GpptCBuTJoxjRo7RjtJ_NxWhF5Df_vPtAN2nXk=": "1238455000000", + "ZLvm6A5Do9ESQz2oBEJnZCihXSy2zrd7Wn1vT8nKaIA=": "454419000000", + "ZM8Ocf-Y71UFKm3QFg_U36Wi41MN5IyvIr6XubhMhzk=": "767441000000", + "ZMENYGv3asNPIFhBHf7rhwKuFSyJ6oSe6CaEwe-wFS4=": "576923000000", + "ZMEnLN4rCptMDyKb0GxjfUiEzOai1hqps_7z3-28wlc=": "3231245000000", + "ZMgMbxE_Xm6F2aanj04nGNlN_5eVW5FLJBU-KMogBlI=": "393806000000", + "ZMtJqeTouKSwmDY9sBSkSpQKlYjvkrC-7Xeh0kg_DT4=": "384346000000", + "ZN-dZbuKK8loBDzTkXw60d20FHG0P-h-oELji89DO10=": "844467000000", + "ZNHLye0JyeALe6Zsk-inauwa03siZrOfbXXOaoM_xUk=": "455600000000", + "ZNf8MWE0AAUflV7WAGC_EobuMeWSGBhNz0apK5y30Lo=": "598669000000", + "ZNwGJoDGk0CCEUsMThU7sVkGdPg4WynU-whZ71JeXwk=": "411085000000", + "ZO4HsYOwnp701r5DFs2dg3uvwhH32-GtZlIlbkxQBng=": "1948064000000", + "ZOB66UvxxJ0CvykFKJFoPai6TUVx6ARoa0FmxDJsF5Q=": "2011452000000", + "ZOFj463h6ZGrcNV2Q_Ox3lEI_SxAu-nBZnrZlIfTDyM=": "2172727000000", + "ZOStdQnHI_DqlZw0GPZFiUSYG9uKEr-P0tX8ayBG1OI=": "2298980000000", + "ZOx2r1lpt0T9ltwT8INoCrdHVD162ejZGQFfXRp7oho=": "1153846000000", + "ZPBsbXo5tPRldQ4iqKuw0cPwNGqjc-yN5tfEQ5gXU9E=": "5504976000000", + "ZPc_cyTjeHfLanxWhNxfEoRW-neu6Lk36JZyU4wAnJc=": "457658000000", + "ZPprmSndoK_ucNlztjfPhSN2CCfvb33OL94JPefGCHc=": "1877873000000", + "ZPq4FcbkAmxPu-gw0ukd-qpYmk1qJJiLRN49mFJoyOA=": "1159980000000", + "ZPwYE-MrXOo-MAxewd2xtNU_QXMN8pBRCRI5SSY1hCs=": "2843187000000", + "ZPyG0Z3ydnLu05jaPMDQi3Xce2Ec58KGPN8otMapwP8=": "486218000000", + "ZQcOsqynpFqLFip_XnIFuSuk37b-XBR01K1g7a5a8Tw=": "1258176000000", + "ZRWhrWjWYU8yHrO94pC0EhOETfZ0rb-mDgYO1W-4Qj8=": "384585000000", + "ZS-EOkGvEs-mwPm7DddoD59RqHzspA3Vnxr19GcIqdI=": "2358835000000", + "ZS2kQlvjLksR6nuKc3YTMfBwAJ68nlRx_NykkbTXdEc=": "416735000000", + "ZSkSm511WQplP1UFr-Qq_e1HPISeYq2X6Qzk67QPgPs=": "1662519000000", + "ZSpjZJam9eUPkcNswOwRX3yf2JhMnN8b4l2WSvf9GvY=": "566845000000", + "ZT3tuPlctWz2MijRLT7Ce5pG_ZRobjmCGXdpcfS2Od0=": "793337000000", + "ZTCkUcwQn9c3DYzRKMGCs9dW_wvvftM4Zi6wbsJ5Iy0=": "893658000000", + "ZTaeVLkEaDBfJiGH2ZeW73C3t88-8hBBsPp94wPqThw=": "5384592000000", + "ZTbALmkFNs_ixoQ5YDAoMIbBY1-Ca7KJ82gK5sPuvC0=": "7497594000000", + "ZTeIzNas8_HfuEj8ST4SxORcxJy5H2HsUzYYbxS3MvE=": "920286000000", + "ZTqcqz0LNsyFz4WWRZd8LIqC_P6Z5SZWSQjRv_2qLc4=": "2499999000000", + "ZU-E6_4XuXekwJc6itCgzZXhzL6Cm5hM6DpwACZZAXQ=": "387034000000", + "ZU4b6gxFD45FzfAMWfFY4mj0R6h19Y58et_uHvy8fnk=": "385507000000", + "ZUCrPtXz6AMpItpEkodX5Buz_S3_dA8lzsnPiEjPq90=": "1885207000000", + "ZUKRitarKyqV-t69EcBSuh-1VPjPW0qHpafdd0L_hkw=": "1223425000000", + "ZUiW9g6s26BXTFzyFDR5Xtco-e1oE_1c2OOdl1Sx5Yo=": "383217000000", + "ZV2P0yBQpBCUp9I-rE77yE_YjtvYcxDnTBAGz7U5WmI=": "5769230000000", + "ZV2cDqRgyeQYXezWB09s7q9D8Ot7K898Es-Q3_gn0dQ=": "1107326000000", + "ZVVwXIBwJ3UQfgqahrMdSHafFN8rVry3PARflqr6mNU=": "3937565000000", + "ZVsNvRhTdcAWEKuHNsYoGi06GJ5xAtNGMXaf1Jh4Utw=": "385507000000", + "ZVzJkvTFvM8bDD8m4dZJS0OFPH5XmyDYgKUGB8KjM1s=": "832413000000", + "ZW-ll-Mw69mPMIq0AIhMF9Du-h6-56uVMGvMEmUO7Sc=": "384615000000", + "ZWhsctR2fcVC616eNxBllEghOr_EEKzYXMW3lObBy7I=": "1924105000000", + "ZX8ONHFhGGcUX8MV0aJp76z0Nf9xFeEeJ577L3KNzKA=": "455341000000", + "ZXLTyOpbCa63OoGJ2KTOpOU2r14mbSMpPOzrFNTNItA=": "758537000000", + "ZXN1elzLbi4uj8SqJ5OUIXQCYJuppAW98_vPiC0yacQ=": "448320000000", + "ZXhQade2KDht4amr2r4rX432XsGSaG8SGTh8GpNVfOI=": "411085000000", + "ZXm-EVHfSZadvKpEC1k8YoxC2Jjs7iW7Ndwvwt4sOXg=": "413362000000", + "ZY0Q_WF9eSltuVlc_B-ACh_SfqZDPKh5Ovm28bIUkcQ=": "1115658000000", + "ZYIT2LBmXXMl8MuR4g1eFibxyerGsrqys2RSzIdzojg=": "384615000000", + "ZYJ0m-PhKuyK3xGzjhk3PpEhjp4LjO395KfXpuposHA=": "421446000000", + "ZYwwdluKC66Zw45LWgx7dEtBL2RKz3HxdOLF4Ivzz-U=": "545215000000", + "ZZmQgWB2FGUYzt5d7abWj48cOkLmpo0FhQoz6xO3LSE=": "1135024000000", + "ZZsKAg1J4vlmms0Q2ekF4op5Vj0Poa_oSEwQirLJQP8=": "491921000000", + "Z_z0AxIirfFOIuCZ7kro4pi5fSsEs8yxmsJMeuARn18=": "386204000000", + "Za9xl9iOSv-P7TLOgW8hVSAWOm7cE6ayoL8L6M0kts4=": "473265000000", + "ZaLE7ai9aU5vITKskX2YJCwrta45WuC_cfrhFurUp04=": "390743000000", + "ZaPZOV20dSABCt2KB18Rgpou_VtmaZ8pgMs6xDNUw9k=": "415629000000", + "ZayyeDDscfOUXPwTHGAwco9cKDzwBuiE5tKpeDJ_Tz4=": "385654000000", + "ZbR4hSD41jtM-iHCMp7rgUyFYmxwxfd2scjjdbmljyI=": "411526000000", + "Zbms98ERFFPfijfOD7IhWcRPKHYuyeHkrZ83tkiwQx0=": "9090909000000", + "ZcD0ue7Mo2RNMcQSg5s_DQ-p9yaRIAzJdyCU-8b7o7Y=": "767719000000", + "ZcSAsG9EKhJiN7dl3OGgxFrA1przA8Sus_xkroNJSo0=": "4199496000000", + "ZcrB7Uaj9G5etleL6s3i8dXLJxzDSDUSPSB6N2Nww-M=": "385665000000", + "ZdJoN4Y6rLi5ApexSunoO4fMGeitvkXpNPNquQrWadk=": "452511000000", + "ZdbfrO8D3Qo_n2e5ZkrzTB8liyduVHN_104gziEcbi8=": "395497000000", + "ZdcS18aQ8KekvK8xoLRFi4DpJRhJnttO2Ybtd_o9Gnc=": "1666666000000", + "ZdxSYu8o2sg3SGN5CWVoPu3GbXHVE0pWXdWuqqNKejo=": "426259000000", + "Ze9lmReI5tV8RSvPSnUE80qD-Wf3coa_vCq3j6hG6kU=": "382394000000", + "ZeUXhCw1E_mPCWaERTl3ahTPS37nrBkwOBd6Hbse5TA=": "769230000000", + "Zek5eC3p8CxMJq3MLwHJ3qh3DDKbXWuvptyfckj4E-Q=": "783778000000", + "ZfUaE6A2QF3-BJ9wWjpqXHAOzdaTiSwJ3WZTuhE8yJI=": "457702000000", + "ZfmWQ3vNoXsCQHmrQfYhz6UWtA_1T3PXmGzNN97oG-0=": "8333333000000", + "ZfmxHWa6-DQ0ARL3Pam8wnG4cix-wN2RQ_kXPYZ4xuQ=": "1522049000000", + "Zfx630P1UcVrTLI0FnoAqnoHku9AdeQUo2crmJ2iQrM=": "383714000000", + "ZgMHTocwK8sZPtpkcMgha4lVuBlBR55IkYaPJVhv0CI=": "468121000000", + "ZgWgg3ZMn9ufa7GOf8aoLE-ZkFgdRxxmTvlsxDbD5SY=": "446532000000", + "Zgxf3DNSuxGF1OJyFMJ9P2ES1URIu5dsTlTXwwwzaaM=": "384615000000", + "ZhPZ8FfcSqpnBMI772nxmrYGbfneMiaZK407egfWmuI=": "11538461000000", + "Zhi0An7Am4zLtNX-VwFOHS5f2WJx582q2GQd2f4WbDA=": "1241228000000", + "ZhiBImtqTrKcnR1mP2tsvgtKaxganc70Em2JnoV5ab8=": "449142000000", + "ZhmT6RUgFiel5I_HJfuqLqb6EdKowJ0TW-u1fYLgQTo=": "384615000000", + "ZiKJVTqd3bZW0rwh0B264lxcVxPvaVpy68hmFkZ3h64=": "453003000000", + "ZiPA0EUyfTyMn52b5otwCZJ7fx331EM1kqzcJwMQ6sY=": "473001000000", + "ZiVpBobo3g962hemtKb14ZOgYVjsW9iUxhOIGeSjbIk=": "384615000000", + "Zig9ESM3QIipJW5R30dJH9Qf9Co9OPRLtukCoWtSZSI=": "381632000000", + "Zim4VfPpu6Ki4ImGxm5AqhwO_IJJspRZ6SF7iQ0xZ7g=": "849693000000", + "ZisFK6CMMpcdvDGfJf7L_zEbEwv2AQGuDAvihXRKMN8=": "519045000000", + "ZiyEOS0mF_TPQBfLroqEZvt_z36sXuAfXeh7ivtvXrU=": "384615000000", + "ZizNhdc83Ii4E3lu5fJ4STIzOYeVJCm5RXemkcQPdrw=": "529201000000", + "ZjVMtE0gcdFJ3qSV2R-1x8c95jQkTg_mI-5dwhw1ya0=": "375432000000", + "ZjpE50ClKwIJRqHMhjtGKoDikHCmcNUEsQ3nGXak41w=": "3855089000000", + "ZjtSBSVv5gOlD11xUHRFLhTGlJ80MsxrAgngHQLQjkw=": "500251000000", + "Zk1FTU8_vsomZlh-GZxiRhUWLXb0DOEhy3ezCdagxsQ=": "1924269000000", + "ZkAimJNDnRHwMEEqx1fZ4_yphgR63rsqw5RI-WMwdPw=": "385510000000", + "ZkPuHGyueCQLF-bPOIngyGvzU7pklkps39lnlOguw1g=": "1428104000000", + "ZkTelfA60UzJJ_jdtTzU9REujL_PRVmFHeJxmZtJGBo=": "457433000000", + "ZkWaO6tRjlTOM83dKTs1KBx-h8uBgdve2enPPPK3x_c=": "1128954000000", + "ZkaRDbof9okcQ6vn3C3e0yD_2FyO6bsRjWxhgLcYT_A=": "454545000000", + "ZksfamwUdgyULohluIAK1IFTkeEyS8wv7mINHmgO2rY=": "767182000000", + "Zl3GEaiTZRpatJXX0Erudgfr63CqRlOBN-gPc8IUc8A=": "33808627000000", + "Zlguqgygb0PaK75EJqZ4CXlg7BeiZKuxgPGWUb0KrKc=": "412542000000", + "Zm0FvrBYYnPQXMFYhApy9I5BGtfkqifqVzjB9CfQD_k=": "452367000000", + "Zm5LN6Hsxzn0jMzDzt0GQKPyQOo7XYcsJ5UDNMLBg_M=": "1150899000000", + "ZndLOJ_CNXFauaZ35kbREXG-1U-Sut3YcVuNE0MH7QY=": "416375000000", + "ZntksQLAtK4zK7KH2WvxCfdbrjvdZ8oNu9rJj1bEpZg=": "2074375000000", + "ZojDb4tPn51kCd9Nl9OsBOivrmCUdcDRvmSWemz-SS8=": "1514867000000", + "ZqJr-2RggJKtupOjYR0I00-3O2wu_x5zeKrpEBXe6Xg=": "423370000000", + "ZqL0PL4iGkyJscTKEnuHBQ9qWsGrsJmmtB78X9mWQZY=": "468609000000", + "ZqesYHJP4pijBC4yhs81v1YOJyaJLHXeKNPemO5IwfQ=": "1156515000000", + "ZqrvJXvzC026jVup3rrzggjM-8bLdrxY9cKCTtS9HEs=": "415461000000", + "ZrM9K2aiBzfrDFzVRaKQE19jkwaKP2yuGmt-s6Xmycw=": "761132000000", + "Zs3YUJZHpoeg8Eho9DjCSM8zEu5RHHCLPqRm5rGmYvw=": "385447000000", + "Zs9re3GXjR5Tw35OoKkB9e8RbztWU7x-Dr6_MaYW69E=": "452425000000", + "ZsDOSIAmqc-S9_xzKywzKuwTZYDK1AtZENHeeIxVnTY=": "416666000000", + "ZsFFKxdfBaUX71i4b4iaubhYZ-VNfj5GD8xmmiJvl9k=": "812815000000", + "ZsRGqiWonaqW6f7aaZgS2V_3QoyNs8WpwDsFoAeejT0=": "417193000000", + "ZsbgpP7p097uUpTtwT25FQR1UXGixckicqbeL19zWpE=": "351050000000", + "Zscw8VJb8Q6PyOPtqK5FrmxG0LupV1tHaAribcpyuZ4=": "416666000000", + "ZsqVnIZ3cJso_enWwgoVAWGncXVA57dgODVcrAXHABI=": "885599000000", + "ZstxHXxX5S085Wra7iU65Gp1ufBoC_Fke3ojAzUgctg=": "769230000000", + "ZtgUsKFX8qkb560COoHC4RF6ZcNKrQOlL3cJmyjmBKw=": "1344890000000", + "ZuFSIgy0ySswJ4ijOt1Ae15jVT_xnWT2J8T3YqfH7Eo=": "2138004000000", + "Zug194TULQ5p-RuaeY7D7xpd6KeUwf2WHPSnkGNmZ6U=": "385988000000", + "ZvDu0NUOM5sJlx83uWtcrRcPsASuoD2BLFGDrTn6cEk=": "385505000000", + "ZwYyZmXsXokmaV5g0lzYgwPSklHHoEe9sNXCx0Q1d3Q=": "6810765000000", + "ZwwXOQCekzsi7B24bzw1UiaKPy0BrzgYmUgi0gMCiQI=": "384615000000", + "Zx8WMvWzulI6sxTW45LTSEoi5liNFFqTRLxLIi5fkgU=": "932527000000", + "ZxGUret8qb0RGFvwylL0V8_pZ_FfPo6sIs18IlgX8sU=": "1373076000000", + "ZxtUYyL79tDrxLuUS-qVEFCmuRt-KZECpfsIxgvOk2g=": "684383000000", + "Zy4-C0-LkEZ8-OtF-UG5z1tIhHA3PCxozHr9mW0L8Uo=": "803304000000", + "ZyDvTqEehDHa1pd0smn8hDRUovmZS_ZS6NHxLbsRL10=": "1386434000000", + "ZyJOp_ycUPRNlE-5f9oVdcGDxkFv4nLXmkocqcJDi-A=": "2313319000000", + "ZyntTAAGS9IhPtqv9ZZSUJyJcllAztZo6W5Hr2zgTSA=": "2307692000000", + "Zz1aeRV7H7fw2c1MjRQvteh2D9a2USAUz1VzDxfX2FU=": "385560000000", + "ZzXm4aLAdvk5bY8WK6f_g-g789-phpVjQr_d3wRMwvk=": "3619297000000", + "ZzrpiRZicrdp5i7BDmvAu9ete_Xper1-yUWz7HntEH8=": "655989000000", + "_-WfDPjqRfz7keo62TINfPDHVaWbjSUBBw_uNhoMpVw=": "384615000000", + "_-j4hakzTB137yQjhnfcMsVI--kkzzAt9i6TxSDwJTM=": "409116000000", + "_-zD4z9ldJelc6Hq3BKD0pW5ImIMUFTL_apkrdR36Vo=": "832476000000", + "_0bziZJZOLf1UAVyereUk_tcW-YX-PLhLOn3ro9hCbI=": "576923000000", + "_0ozMzYd1_ToDCFSaW8GihEG-ORLFUUVp4IPt-6wI74=": "500245000000", + "_0ro1Po3gdGLCyE_sTMXPbGY_KHy6d_HhevZUHvwXSg=": "385528000000", + "_14tMf2p2ZWhHI-ECrNJCM5QXOHrdQsX28kL2b2tzzQ=": "4000320000000", + "_1Nf14OqO-AywUySg6W-yRiPB9usBEsJTpKsjjo3YiM=": "3346153000000", + "_1akFj3OKfylN83anKweZPWySOUN7S1VCONAZiSRQy8=": "509585000000", + "_1bZpUd7zzdlPRy8o4mntYnFQMDKMchnHPhUYsAHN44=": "768499000000", + "_1jcPsXS2v_ZL-fD4YGG39fn0WAiinaH1OPBhXkQtT0=": "3765029000000", + "_1rMCsZtdxYJYmrnDLFQBLFz-7oM_Gh9e6OTLkD6qEI=": "384615000000", + "_1uf_FKG-bHPn0eqaH__BukyL1K9G4I7rqh56A8WlTM=": "453442000000", + "_29QCx0TMOxTknJnGA0ASGA_SoCCcOnXMitLOmsTujs=": "1346514000000", + "_2DLfBsi7CjtpNlXiPdBxyeRjaRrMw68071MuWFNCJE=": "1502755000000", + "_30Jo_KSi1lB3crjS2KTBV2NkCb74PhFMUVYvXFe5QE=": "4166666000000", + "_3H6Fh2QXyw6iRMYWebX7gbxnFduek_3JiAq-LoS9QU=": "3537639000000", + "_3V8znMHU_fOEf5XhYj3g7H51Wljoj8f_-FRA3XIW0I=": "1470728000000", + "_46_Py4W3HgGZWmg7a12kDr-7f8InYp6OjQnGvcwB5A=": "1153846000000", + "_4C9c-40LGYLYaR_E_stpCYLAxWRskJJ3f_RdXjU2Jw=": "753677000000", + "_4HMIXcpW7sZNEkZ69oHYMErGYWlsFHjXXhS3CkFjwQ=": "1538461000000", + "_4IAjfTdEHoRsCEUZQHDugLlFZmqoRPpHV2Tw16lexE=": "4557554000000", + "_4SSRg3bKI_yo4IeaPnW2m0G4kZyccZ5zk9m5Nh0Kss=": "418563000000", + "_4WEvESV4beX8_3d4OPD4q_dqXlqTdj04E5PUH6ruOQ=": "7637772000000", + "_4kRGfQHxYYq_ittf2BB5nEKHSKyR-aF93a3CYl_RO4=": "384615000000", + "_4yYvQn2CCthb9rvxydIb-uRePVM6DT9d1vDPS7EWYc=": "405176000000", + "_5SUKlmAdEn4xREtf8yMBm94hte6uQnPru8H2rNceT0=": "3855066000000", + "_5hUqT0FHDjTrRjBeirTa0orgbOChp129b9Hz4JXZCI=": "378072000000", + "_6B5fVoHDO7nxnqjHiNhdWl6z8mWontiWbDqpPfmlE0=": "416666000000", + "_6FwBELgShGoj4mRbtHQnUMfY3e9h3faCFfvg9l1wu0=": "409514000000", + "_774QtgKF97u41dHdh4j0Y-bP9a3lYbsGxP-dgkyrUA=": "1156522000000", + "_7IkNH94ka3hZrZGtb-QwoJ1nPh6H27SbftyG7kinaU=": "384853000000", + "_7UGLlX-wB6DSCO-pAwDna-qKlv0i9t3D4dkIYFl3A0=": "974536000000", + "_7fftVJZX-RllflsK9T7u5CkoCZ2Barqwo4eJi3Q0Hs=": "711953000000", + "_7lfxCsnleihao9uGP2LsU4mSdtGo85O-nwLALgcYdI=": "424045000000", + "_89qboVJPXIgR4C6ujTuJfJ_4_khzH5swhj1rs-UMqY=": "3551044000000", + "_8lWnZoEHYKDrJGtkxRBw0wqITZZkE-NsE7EQpCyIIA=": "780370000000", + "_8odS-Hega0uaJrSOr6IeRNccC68Khad31aBFg3bWxM=": "1249999000000", + "_9RQicprlWnIHbH2HzZXE9N6BeZmjpskSQwRoUZDMZ4=": "4176337000000", + "_9eZaUBn00to7Vyh2L0nppU7Jk_fZYMabfcOgtl3Y88=": "384615000000", + "_9r8scnUACHbddaBahmdyBeaGENGammZGP4X9bVkj_4=": "2272727000000", + "_ADnofHfdho0z75rSVtuxNZjMjCaFOnaSPR7NZd1wiI=": "572959000000", + "_AYiW1gA15U_CY5ZIsSa4J_pgPFAFcyrbV6CXV-JR58=": "454545000000", + "_BIS9VY_4LyzrVviWU7ATjGkagC1sY4vzeFje8Ccsyw=": "3841471000000", + "_BXX7vkRRpMILVF0PG0TvmG4m9c9crs_pxIve50ZOec=": "460910000000", + "_BnBYWKoj0Ay67hthMuEE4mbMyL2lIOzdIi0GtyFYUY=": "631981000000", + "_BwypGIhGKkOjbVWd5FkM2jeKjWW9QAZaiYoh7ALui4=": "381226000000", + "_C2Y1cZ3tbjNtnSYIxoU1wi5RiwqBAuJxXJgJvod3JU=": "385509000000", + "_C3kr51POnFNxpNBFJbpIQ72Nvs8n73EiTFsEBPnbNM=": "455091000000", + "_CMoJG54qAHc-hS7I7GCfw9VUvkgl9VDDmjcwN1mpFA=": "412014000000", + "_CcUn8G7gkjMrlr1Hc3RY-tOrCQlsSaHvHx2tVA-NZ4=": "3889408000000", + "_CeBMQat2F1D1PzfRESJVKmDTiJ_NAE2tQXOXr3S7HM=": "627726000000", + "_CiaSFXfcEeHUw1EwGUeby3Z7b5qn_y7j-8DBOhje1M=": "1365475000000", + "_D9l59nOq6d5byY69MjpbQVuzRY-QwyUeYJ5rwoJk2w=": "384037000000", + "_DDdobve0nM327Pq87Ue6W_dLSUlrPCKySUU7Yn0ugE=": "389081000000", + "_DH1B402x921JB5hFmQWu5QgEyw-C7Jo0usJbjYb2mU=": "379072000000", + "_DIphE7a5ZA62ngAg61Q7L1Lq3pc8eIQErppGZ_3HJ4=": "447389000000", + "_DW5vI9t7zN6gyFisVfiHROM1wqT6EYYGoNw0IRZ6-M=": "962891000000", + "_Ds0BLHmI2EBSSKjY-kjRGIz-TQQkvzMspQe-P8WvLk=": "416710000000", + "_Dwme_cvSzJI33NuFoaOtskj07nAtEInzaTC6Feu34c=": "675760000000", + "_Ebu9xObZC-Lpxxo13eW44axBlfdE1XDEzoMLvOGP9g=": "2303657000000", + "_FQgynxnLBxNKfyv2fzS49jNlSPKK5aSqES_AK6TT8E=": "909512000000", + "_FpzfFsUfo_P3FyVGF3ekLs5u2Bng6kGfILCHFTGxA8=": "378065000000", + "_FuJwd5wGucN3HDvnPzaShLamf2kiw1uuFmTfTeKCd0=": "492307000000", + "_GK53ACQp95Ly0dOscAyYYnn4DhtUJUtm_KAZ9eD3DM=": "385510000000", + "_GapdJMXHA1tlRGRhJ1n07KhAr4uSPAA1fqULWVT18E=": "1249228000000", + "_H20BHHTv6bbRAlcDNJBAI0kntpMAyz3u48JDT-_Pjc=": "1153846000000", + "_H3Xn3_4OkqqGmEHKp23a2ru5bl5vnJCIIIs3cgDw0E=": "390689000000", + "_H9bt8aplMzHgJbtIMB9eppT4fNlKP1_XjwICXMc_oI=": "449029000000", + "_HbhGiFT6kyQjJ_CXGjkwsmTvTvRVR1cCV2GCV9i6Ow=": "385877000000", + "_Hw1fp7aUjuQwD3w6xFnepPQzWeRFSmbKmGIhbV-w9s=": "385509000000", + "_I5kGdFGyFGSVaD4_2hotkk5MM02HmxNpM0tF-jHCHI=": "810436000000", + "_IH6f60r8udn0eIHzJ5qAPc8jX10CAXXAs39UliqZVQ=": "393313000000", + "_JFD1qdDP2tqn1VX_QkytK9-td-VvQWourOQrVjjblo=": "1927537000000", + "_J_A8dndW_ZTR8cYdagRUq1BwiLMRKVTuqZogyw4src=": "386715000000", + "_JtRHmDTJYvVAKCUYcFSQbd2Ma71n7kzCaOlgpeaIqI=": "1538433000000", + "_K2Hb-5t0s0k63RgbHtjINA02A8NK4e3HdRBE4Coau0=": "414392000000", + "_KRYu7x-q8_-WT7BmKGzgPH9Q6j0jqLQ12EthpBDu5g=": "1446372000000", + "_M9SPCGQL8_6oPFARwZ6e_silK2el_YoHIR4nV7GEJA=": "906721000000", + "_Mf07gvabAhHKFA11Oct_q2SISAEWzEg8z4Zm_hTYrQ=": "769230000000", + "_Nf2_s5dQHRwXAgoKEZPhp8FnFnOnxDl9YA9FOYYcDo=": "1153814000000", + "_OSnvXxisMgElCS_jMvNf5a8xgmkG3mNR-IPeId5W6o=": "1238591000000", + "_Opb48bGCUvZhkebOQ1uC7ywRyF-C3EYoe7As5O7Oc8=": "413877000000", + "_PCO9FG2bEXN2fTgINljeyhMREadjK1fJLSF_CRP93s=": "379260000000", + "_PFcZp2P7h90fX_ZypCNxHVwJU20Z3eqMjK6bWE-oWg=": "4122992000000", + "_PKBzqcblsJTw_q7Vt208h_-uSatkpu3M32T2aPI91Q=": "377579000000", + "_PNhs8JQl35cCmiKilXUpk2-y1U-1RvbjqPuyRLtfsM=": "1412228000000", + "_PRwYatfMhutM-yrbzOfZJLcjSfcmodP5HlOzPMkZz0=": "411085000000", + "_PloH7v9PbGF5XRK4PnuJ3B4P-Gg0oL7oDkUNC-Fxwo=": "455367000000", + "_Pm3Uoa5R92fXvjdx9siY1ckxqjdKgY_hjfSK8D1eqQ=": "384615000000", + "_QTj6d4R_5Gn-6tIkg0sY0jtYCOt7pbKYvd-KOD6H64=": "470553000000", + "_QpO9pbqfDCFuAHTjgtD9Fg_-dWCoI8OJ8SiUdU6AVg=": "488979000000", + "_QtBe7KOIV5k9E1adkUWjelwLtfVaaGLUGQKKtAp1fs=": "416666000000", + "_RGTpIICrLRzBm39ujFZhmbdPh_Za_FJssR0pS6vgag=": "411085000000", + "_RGomn3FXvFXIE5hb-w8HMlvuK0QJKnO-1xTw55mSog=": "384615000000", + "_RIhKUig8ek4XsFInkse8_pAYzqP0O2yhj-554lZQoA=": "2637613000000", + "_RNwk6pfUVXxxMMBT88UoCY_mo94J-S9GYyqsFkHqCM=": "413111000000", + "_RRI4fF9d1Qrmyipc4_-AXGz-GrTZ3HkkjWIDgC_7Bg=": "625028000000", + "_Rh5cBtPz0qlLcIiwx_yDKTBWyQfQWiTfvqz-zj0QVA=": "368100000000", + "_SLEZoVDdwA18neheJbarxWNL4LKOyJqahX-vXqI9UQ=": "460259000000", + "_SMJJLzqupw-WVHt_nwspjS7cmGsOjL9aoL4RQARTc8=": "9727081000000", + "_SMmVyrkzVK_bKw-TppgUC9PpRTvNvC7NhiNrGvhTBE=": "384615000000", + "_SUEmt_OeWDHv3JW5-JBxFK1JE3Ku5kT_9rmQTSgbDc=": "445391000000", + "_SWuaFuOmQFCI1EQDYGz9qxw1AUcXqt3iaNFhr13HWU=": "382394000000", + "_T912hEJxmsy-d3QWygE72VMsJMOOoRtNn6QC8KdBGs=": "1186326000000", + "_TCfnWRuKM46ENcsj7kwL2VJu3NeEAquw8diV-xC5q8=": "464025000000", + "_Tb8m-YJGR70PlF1qAjsKw_IZpVfkOWbH3P5S63nlEc=": "1923076000000", + "_TrfOTBdB5wLX8JVBfnU_DVWUTiHKnyUvtlIkStmMzM=": "407469000000", + "_Tv3iUevLKBX0M8IF3p030NA7Qn5KcxbJjayP5HKud0=": "1221386000000", + "_TwEDW4TRE734bkLQ10mUhZ1ovMS-ItLKxtDQFKzOAs=": "384615000000", + "_UHoHyfC8qEYX7cNN6j2jduNXhlAcFbdGQKuI98VbrY=": "583333000000", + "_UQiZ5LZ4TbpvEA5b5ksT4Gz0PywRnn8c-e3Lx0usxE=": "3846153000000", + "_UStkXqcIReg-Em5WNmmFLx4AngI69lGcNJHYYE9gN8=": "405552000000", + "_UeogrpwL5mTAVjhghq2MSL868TGrDfXvOnmeEkODoU=": "4044705000000", + "_UnRUf5JSBAqsBheGqttHWn3J6ovvh0QjdzKxq7gVQo=": "417125000000", + "_VMFSFPXntMYCy46wv-mnJKKjSMvGtURed-mP5UAEFM=": "586733000000", + "_VTP6-CyUIXVFNU0nCQACxZNoqIKkiP-hF-gvuIK-3c=": "769230000000", + "_VinpyynvR0w3z7TMV3_qgikpuJvvRxL1R1FQrf2koU=": "2107971000000", + "_WcODzm3akjOpB7is__64Dv_v9q2n8r4xHDUMc3HNNM=": "386582000000", + "_Ww8BHgi0wHSlX6g3dKCF7g5g0MLkckLuXxIaM0agxc=": "7692307000000", + "_X_S1a4Skm7L2VdJLQdDbetD50u65dQp77W0ofDAi6c=": "875430000000", + "_XdKZPg6m4czqGL-VHKrqGsF1GEMWrrAZz7eZLX6Vo0=": "768082000000", + "_XpVlSWWsw1glp1wCvV7xtmMSporTblRoB4Hmp8B18o=": "379260000000", + "_Y6EQjulNF5oUy-J9zArC5LtKW2vvYgAmaiQaEF74FU=": "4244886000000", + "_Y6yIm4awBROMsVFVLwUihGSb5-ZpsOZUB2NwIwfJXU=": "385189000000", + "_YKLFmK_s8hkoXUX2U_yajFBzujm07dC-NZfGHxqY_A=": "416627000000", + "_Yl-dTuTe7NUTbTnEBHuY4NrGzy2Fq4Epob05S7qsAc=": "6525968000000", + "_ZOceiUQtesGuMktHwd7_G9xSfzSr7ZctfjD_AsC9lg=": "1186493000000", + "_ZWNaQBhjkV06Z3-8ZmaivQnZcj6MhpSX8kJiZbunx0=": "417636000000", + "_ZWxwRUb5wERAm9dDzIje7UybzzrVlVMFbATEhooPYY=": "463216000000", + "__-RaaV53ar_uD1pD9flug7CL7Q5wBDWj4eyfS0QPKU=": "385509000000", + "__Kuedlwv4KqKGS5dAsmPCjBbjwyb4GG1E_BUabrV2Y=": "1923076000000", + "_a5uriaw9fNiChZlpA48QGmdPNscdTpON5up-Ty6_Io=": "405301000000", + "_aJByCJbtsRHWygxEiev9ocoh9hEEwObV4BnznPQ6d0=": "384742000000", + "_aS4tSGomgYp1CGNFYfF-Kmbqwz6uPRTtvoy1c9x0iM=": "423370000000", + "_asoHzSrE04ovwup2zJY43Dtfd6jugtOrszYX2n7bRI=": "2027186000000", + "_b1ZqxCGxutD7lGp820fQo9OWIDAXzecNg0-sCiJ0n4=": "1923076000000", + "_b9Bg85dOho2PJyMiBvgpMITIqkEmJkFACOUR62Zl3I=": "615663000000", + "_bNvwH_ELsvqAKOK1h1LsswBIGlPGLWA5ZrzAH5c7no=": "376529000000", + "_bWXYpAit31eZIcSOIW4mOcE-fwVNncRRD1cHpH6OVM=": "473176000000", + "_bj5dYXJEWI_wWD7mpB5I2fuEYxLKt-ZlKkB8sd1U4Q=": "384615000000", + "_brgpZrtqjDwlZKp4BXjHubF5nehC2sdwVgi7UbhOPQ=": "384615000000", + "_cHMryw39wQAzVqfo2PsAilrooOLqzMB4L6TZLP0-q0=": "4555960000000", + "_cZEnbvB26qzIb9Qz58ad7vtTuylFJ-8KB0Ka65wB8A=": "577878000000", + "_chYkbV3UC5WT4n5A5IQhdR2tvArxWdMBfvIiVWUprM=": "1135742000000", + "_choaAf55QbDbFYu3ZC_1jHIzYA17qPBvZBbVRYiGQA=": "500748000000", + "_ci8oxsRV2F4pRP5sNIbOeajzdEdcb5JqZR4iRCFq5c=": "1708326000000", + "_cxeEvEuQXU3oQSYhUwjM4qK4N6iRCdPfwy8xDeDczk=": "2373505000000", + "_d0xGUPticpYI6OG9sBVQlQdDIzGOGj4D5vF6lNjDVo=": "386318000000", + "_dbWnqaxzGjZV173sEwqnvYpMofvwnncCBJGLZnAd-Q=": "384615000000", + "_dkLAPzFbkhQwfhTl5G4W0brOddpc274RzmNNue31NE=": "576923000000", + "_dpZc_t80LaX29J53Lhet8D2k1fRCpeYcyItlXqZ5cQ=": "665212000000", + "_dv3sb_cxbWAtVMWl-o4L6gIZJWWhwM99K6UaFrtloE=": "488135000000", + "_eJIkmMvUhsoAbM4GCgAJWeLKLHhwTBJDiu7n-gm6dM=": "1927537000000", + "_eNG2HOLiSqt6_Ksw-Z_puHFZZPYK4UFONo8A_Wx7bE=": "1689607000000", + "_eSWwW16VPI6PlggHpAQHThXepWubHWM4R52wq5xnTE=": "458982000000", + "_eWVcVnEiEudKvKtdQaaD3Yjfneb6x0RJlg9OsMBmNM=": "457943000000", + "_fQ8F9bbDvkCWoVcGBKls6YZfZyT5AOh88-01M13Y9U=": "1156045000000", + "_fmE4hOkJvcdJbwZWDmx9qpTMJvobVxmE4HQq74QbfA=": "3846153000000", + "_fyd0pDFO5SwZhSUpiYL2AINcKAnw73JZmKdYStKW0s=": "378456000000", + "_g3WoC0_-pKCF37GK_zcTAC-Egrtdj3u7bPtU4nN8TU=": "495027000000", + "_gbgpL5F6DLFOgF3_CirXr5CFEjQV7ELzqA_nSQIhNs=": "1162240000000", + "_gc0SpvtURLx6xbupbu86NkxbX9CQi9sMKZvcycAtqQ=": "4992433000000", + "_gjoVXO8DHJXOPS-yA2AxQTLuTKN9o1uf5RSGKnrQow=": "454906000000", + "_hCJGGHYiZBXP8cfujU_DIxE8a_6BIAuQ0WOocCgZ-g=": "450384000000", + "_hHzYTL-CfDQwkVLDD43t0jjClNaQJc1KQQt-EXFQR0=": "384615000000", + "_hJF6Q68MaYJYYtwNlwBo8hmdGidhcJ1SVUqOT2Nq6I=": "453414000000", + "_iqmxz4FZ7o3D3Jcruxq3WrcMgk0WCiIsIjPU0m1cwY=": "384499000000", + "_j3FKZaGB2XZxamj6Fw4qkMOLGDebMbHJ772ZVaaEtM=": "469468000000", + "_jGlOtmX4mlgSIvqTFS8oFS4QPrKfaJCjpoP-IS1SB4=": "4036313000000", + "_jLf9IqTglGamy_uJhP3H46nB437vAq54GbuWSVA4Kg=": "4847358000000", + "_jb2IhQAtZlbAyAX4w13PZ2dSV3RZgwe1d2YOG4CFxc=": "371766000000", + "_kKOMRck7JeXz3cvcTSJDrRQOn0BzRzphVtaSArr4uY=": "462146000000", + "_kjpsHqjkWxYmp6_VTKQXfOTXNdBqxWkiOM2wzN_kl4=": "361016000000", + "_l1WsDvB-p8ASjeT0LV1LXsl34jVxgKReP9zFy7I7-o=": "577137000000", + "_m2vn2PD_s3kDCo92_moF6q5jCKBOJNynFEYFV_arBg=": "457167000000", + "_mDkdsF3sJtynqmR4i4XZpHlbBjhoBDXrHjpAyf4A40=": "396009000000", + "_maSUWNP33H7BeJV10x-JSOk6nIvn5D50x0xE2SP234=": "454545000000", + "_n1HAgLhyFV2quqXbETOrT5MwaVTEJY45wP_Z6vm7Yc=": "453764000000", + "_n_zvRofrswZubchiXRYbOqWk6KOAEFiNc9Srrj2v1c=": "7499999000000", + "_nw6UjzIUQxlviyaVq2-RjC5PMUFjSith84kZi7f-DY=": "403851000000", + "_oa0ruoZ4Q9ULDwhl977KIAy0-22Z-dYpCtYDPu3lwk=": "768677000000", + "_oggJlX3sS_WJNouAeDopwcnRMUhhV6bj7ZQNaiBCtY=": "2490036000000", + "_p3Y26RKW1tlz9ygdX7o8rOwVWxDhcpKxxz0tSA_Avc=": "846282000000", + "_pLhhgxUXMuUmfWU8NCudNtXKfFa6THrjpS0d8JBH1o=": "2498919000000", + "_pY38l9CabUUBkRW2zUXqkfrFAfIh2zmS2hrN82xnoE=": "384107000000", + "_pf5O41xhT2mplQWILVQkC585Jq-45vUZmO9oGHmTIs=": "1002486000000", + "_pl6t3AmtD_1cb31VkzNl40P_FEERTeEGqmdly-yuEk=": "388750000000", + "_pm6Xvemt3WTiTsoIGHquXYqA1pAb3MN6ylhAid3Sfg=": "417636000000", + "_q013uKG8aHh3IhvaR-GXwuz8mDfKxF632mld4PBDjk=": "385939000000", + "_q16aVUOCri3dWHIlPYFK5tRx2YPEv5Ap0O2YqXgGzs=": "385509000000", + "_q1YWfnjQmXu1XKcKL1gpi2i3_6dZbBt_iH8M_Is9yA=": "7710100000000", + "_q7RcVqLTznNFyPLl4t1n211OtJ_99_JcLpmZ6DsdPM=": "3358461000000", + "_q8kwQWK73tyiNjHDNHtVtFhpqxyrULPplXbbhYfkPo=": "432503000000", + "_qGC3EeE-QL-PnIAvp1V5Q3SEEOca4wR4fc9A-QKEk4=": "913841000000", + "_qN05raCFW5CRIbWEYyUXbM9DdQf_ML3VLrFoG2C4Pg=": "7710189000000", + "_qU_fSrEz0q8q38gkLSW35hx-UgKsrS5H9H4zvDyVF0=": "417633000000", + "_qUvCi7aVqL040lEhHT_ZIl9SAk_eLvtqin4mLbChiA=": "1153846000000", + "_r0WRk9klIvECtJ4YuGfsjHec5jMhcfXpkV1UuuuXRE=": "379554000000", + "_r3oZyy89ckoswk_71K7JdHcNEDaTTP8SqaAt2TNaDE=": "769128000000", + "_rxAr2P6N5LJ1mmOx1tTK_YuXIK0hnq7MAOFgUM6XjE=": "3102907000000", + "_s4ygMuUw8Bq3_SdcJNJAy8kWqLbi5lRsbB_LGUrtUQ=": "1999999000000", + "_sOa_iJQi0HDx9mTco1SxPaB9p17qdmsmxfijikm1MI=": "1666666000000", + "_sv19wjLq2ioDewqIQYNd6JREElHAP9iME9imkPVdEc=": "483530000000", + "_tCjRazoTtkDUWdg9M0IvTOoSDt71ZjRBumcds3OE8k=": "385507000000", + "_tNYetF_0Nr8ylpcyFuJs1v9hwhRq--GrKL1Er2uhGw=": "385509000000", + "_uOV6JvaJMu2q3CS5Fa51BqtJXJnVSobAFUgHYNCsfA=": "992250000000", + "_un02SpUFMaBUtYNjrDz380lblWJqdq1SwkLGmBwNc8=": "473001000000", + "_uthydUpbBjj6174MgbQr3UHmZW2UyZbaZaQq64zuW0=": "384615000000", + "_vPWl3pTjN-pSL5fYERgyFdOrynlFWgahS1eYoC-9KU=": "452525000000", + "_voHBvq-QAa2z1cqkrOHfzpRpxHqiXWfHMBRsbJs8fg=": "758689000000", + "_vsa_jiZjYgEHDhVIkSuOwMU5x_0fmbg_jkhgWA9Fms=": "412211000000", + "_vvfAFCnnEX-dPQW-XnuczBsIxJd4oeKLKGWSBWKas4=": "3175347000000", + "_wREz9NcuXMp6VewRyRcbZLgdbzsCXEFdnxnu9S3Xrs=": "387856000000", + "_wpEA2QZ0Y8cmbarRQa1577xj7jIoi0iz9R5ZOVPFu4=": "705402000000", + "_wzpR9E0Gl30ZJBryJGdCvBEQLmrnSxRLxRvE-rrKoI=": "1144901000000", + "_xIC3ZjQcJAQU_MmvozvSxMJJ8kyWutNK3VTggETdw0=": "1894410000000", + "_xLMwo29Cm6Jxhqf0GM3583m5v5SYHMANNZaWkuLD0w=": "7702727000000", + "_xcjXcEsJpCBbUabwcRZK3nB7Rxp7UAldddbplOErkQ=": "385507000000", + "_xliW-IucAk3YQRta-B58E58ID7tNQVUywYE-uUOBEs=": "1666312000000", + "_xqxWJo53KKNOg9kTrpj5Jp088-8KzFntyHuxE5qufY=": "464701000000", + "_xu05xWhlO4mUQ1nu0338VFWA-GVexPxk2mJPzlJbgA=": "5919994000000", + "_xuBuOXpnEhk5bD6SkgQKiETuXTq28cPhhJ1zr1-FT8=": "4213690000000", + "_xvw7YtmveVOy6vORArEntN-DL-vX1GzDLElQYbmVJ0=": "567919000000", + "_yMsZ7GcqR4HOR6PLQ7SPuhtRdPRMx3F9s9g-FeND0U=": "1927541000000", + "_yeEeV_1j2BGrDivi3IBMSbVzPF7GsaXhBY6s1sNdAk=": "769230000000", + "_ynjVfJ3Qbw4PZnMz8jeIuvyRedAHaCbYAkVZQt6g2k=": "2865012000000", + "_ypxyu7L_yJ_njTiLvuStVIN86St09cSa6z-u4Ahiq8=": "384615000000", + "_ywJocL2SmXywW3SihidkrhLEl46U0CNhTTGspqHa_Q=": "833333000000", + "_zTISlp_IxO0mhXEXXOdK79pr9stFSAADSe99z8w3Ks=": "2030639000000", + "_zVUQCEcK4r3z-bBL7Qn3Dv0Fwwm-8NZdNzMsGjjzzw=": "470734000000", + "_zXIJuXQUfkd3D2w1k5fx-rkPCIVeIpCc51T_WOjlYM=": "2459941000000", + "_zpx-OTJ9NivsWHgY3Gphu-9-nj2YabU4TTnrTD4YWA=": "3855061000000", + "a-ZhNMX3GEHw-_AaxCAzP-G8rSzq6lSwfc6TcoDP2JY=": "1224962000000", + "a-fZxyp8K4mE7Ul3wankwzgB7Gcc4vOqKp0QY-3KepA=": "384468000000", + "a00Zmm5QS-89VE-vQ2GENdCgbm_QJ4gtW5XdLVEJd4g=": "394923000000", + "a1tPA53U41YyuxILNSrEOQA0-1_fRliGhS3eNTj5Jqk=": "417630000000", + "a2-OPP9fUIGuVmwWcWFFKAnPNeb7Ry7dvJvUNAtiK1c=": "385510000000", + "a2OPnYNjB1iance6lmuZgZJrGYHIHVuSqV_U4bV3M-k=": "1145412000000", + "a2bOjYr8zTXIOhnMnHC8QDU2an_JT7fYj6X6NhzmE4w=": "384615000000", + "a2rOVYgR9791Ml94a1PYxjcokbK9sR4WWoNnoHyEbl4=": "926789000000", + "a33uyJ2Ugpqb8Tl-ZqPuQM74ulqr8MnAO-HdmqBoFEQ=": "1058856000000", + "a3T8BOztHwiIHtk0hF6k7YvZKjsL8feo37RbkH34Res=": "461437000000", + "a3X-S7gV-MmTl327klOSDGTD2nG0KgaSL0eBxLRX6PI=": "455600000000", + "a3bz-wTzplzriYy8L3qLa595XHTvmIbzheGeNwiDlDw=": "763735000000", + "a4OZqwNY1IzfWYHVYnxqT1FAGhxoBAX7KAVww0MEjBA=": "385507000000", + "a4OlCEMExpxzw8J4kW9Up3tT2DF2BnFYDpxWZJliRbM=": "416700000000", + "a4dIXSZ18v9GUVKbNTKCjxhJiOU6h49qZbcElgn_m3A=": "756620000000", + "a4onaamBE_QTDUIz6YRuFJo2JGVWEEZL_uB0Pmjb_MQ=": "416662000000", + "a4xCkbqsFuYJjnuh20qfXu_6uVK5OUjn2EFvWjMCqXs=": "461318000000", + "a5V4pf8O3n_TJaIINdTTIzsDA7CHm9VReGWkmC1prQU=": "4972182000000", + "a5e33MK0yelph2Ri8bTXXQog3tsLUQw_wufLQzRY2KM=": "452437000000", + "a5fNyhMb9LrDscViDFNonejwlR_i_ZSb0S-k1WaqjBs=": "423464000000", + "a5oj1KJTJ5UCAFpwsujeXI4u4sU5TxZkmg2XS2YOlVI=": "385510000000", + "a5uhM4ji461AhtCkZmnvPO8thDQx3S0X3-weDVq3RCM=": "911490000000", + "a6HX5npNFr8GlL0dfmH9ayIHTmsoEWGdwDcbXzt7I0I=": "416666000000", + "a6TcpKAjk9m0aF_Ka2Dm2vv5jG6Gp7zFuaRsprgbkSI=": "374928000000", + "a6fG3SBAXZaVVc96KcdesnqNjXQYPZIR2i0hvk7yrhE=": "911212000000", + "a6hrm06tHNUWSUFr5slantl0jdMNQmYRTqDIljkk0Ec=": "412455000000", + "a6i80loqMtZamErnpVaJd1hq_oIpyrxxvkyfsiEpNwU=": "384615000000", + "a7JUnmTkCO6oPcGXDUUEVzLezGQnl75X3uywfUNA31E=": "11861633000000", + "a7k7j3dJv29bzUTrk9PNAPbplrKbq2yjEMT9bmQ1Ks4=": "708333000000", + "a7y3QUv9RZo4JXTHaLLbfxPY5TJe49QZbN1IgBhUyj4=": "2692307000000", + "a834aPDzr_rFjXoLVGqqArD_NDxUmp-1E8dD2xnHQPM=": "832250000000", + "a8YHtt7BREnQbbZUBGTR-iIhNeFLIzRlrrL8ujdwu_U=": "447339000000", + "a8gwpp8akLxoN0oDNj4tOy1bt_0wnc9HfJYNnrwOqMM=": "1538461000000", + "a8nDNCQJzItV1XuEQwBIU5CAlbMatk6zeiAArDZI9DU=": "6153846000000", + "a8pr7FarmP-LNAsksxtRjmCPJDEuN0GJD6ylT3e4FFg=": "466696000000", + "a8sPaNFoh0fIIHJhxMe-HrAiySz5LJ5lUyBHCYgDC6c=": "1612263000000", + "a8wgZWC7ISxC6iWyPAzTvlaI65Nkwy74DEIR2XRvT_s=": "457745000000", + "a8xuf5b0JVL1iJfGh5Txk4ETDcNE7fXqoZSsbuqDxrs=": "385109000000", + "a8zurQfbO5Xsm7UhPCmx_xoH1BxBTQtNPj_nObcQgKA=": "1233257000000", + "a93nBUiYakQpqEwM9-piHyW0txWwQSeqUwCvFi7bvmg=": "446629000000", + "a95JR0ZUsYkhioYZUXxwg9hNhAqzN_NVkuutX9ElpQQ=": "384615000000", + "a9ZC6oxCoS4UoHpMo21TPMjo9WPRc8A4mUuhW159Hb0=": "850858000000", + "a9bSkBLR3YyLvE7H0uY9K94Hh9PZ2WnRw0fJWkRjTsw=": "833333000000", + "a9eOcgNIBhmuw5axiDn07Kf5GWiP3RRI2kM6KAnbhlE=": "1267685000000", + "aAFOypdj8hscRkpuZEnjKDe9Q4SE2SZ0Lp5ivhwfBHA=": "399800000000", + "aAuw-Eo-YT3jUzqUSb4KQYA94l2GIzBdDuljPxxkris=": "458538000000", + "aCjLxNvC901Gf9-e4qcM_QfAFa7DOAOm3LP4gODVe34=": "384615000000", + "aClpWtu9BAvtHgZ89ZSIe-qR3TVuDic00Hqec8cnpv0=": "8140575000000", + "aDLO9eZtMrR2fFZVa75rQT1tdMzSzC7Km_Dp8suMAMM=": "5725818000000", + "aDfjW3lfADKzLtsPeiS85ZTB4t0uTS5iORxUp02BHUU=": "384615000000", + "aDvnmTGouXzFakXbYW46Zr3rHNM9BgMI5qkZsqJUrns=": "1923076000000", + "aFY363NiexBTVeA8ObLBDgsZ5M89bkipHDm_N9ayAFA=": "392983000000", + "aGDHtKV4EF70BVv3imOg5uyKGxUk3Iu4-c3X-oX8fCU=": "384144000000", + "aGECCGeUjVBMNUUYV_u4k70xiMhLmZh2osmSYUUUBwA=": "384610000000", + "aGUb4Lu2r3PgRq_X_9d4xsRUdQrno46sCoWcwnZkeDI=": "1923076000000", + "aIDOqFb4gaRFnFgqe-SA48BMtN09xwIDQTgxippKXi4=": "1893165000000", + "aIH8bHFJZ4JgxmVDejyEvNlF5TjM0xkE6RSn8ZfHCsc=": "2471079000000", + "aII-iJKugOoXwvCUNmHJXrixU1R_wj3sMz35h4yVgUk=": "8405484000000", + "aJ3fCySBuJsR6nu6u0IEc7UNFXYSnlJ00xi6iSrl_L4=": "683851000000", + "aJZF4Jh27MoGoCw7sD3rSHd515MmuaRfZOouPQ7H9Iw=": "4961614000000", + "aK2bgwINVoMtW0rY_sdGvPF4jVWTExstKu-s7T18T44=": "1182478000000", + "aKYJ6S6d7Dju5Z8ezo4EwDh7dzbRdjgiCgJ76_LJj7w=": "20734424000000", + "aLq5Jn1SCGpuhoWzUj81nUqi7RiH_GJq7sO-SgIDjJU=": "431414000000", + "aMLw4vS_Dj2rz7ucFsoN8kBg4CnNI_0NbL6RiYa9Lc0=": "468818000000", + "aMzxIdDgWOdQHF42CIhB0BQzfnF7hTNWgoHu5UaXM-k=": "1153846000000", + "aN4QWTT2ORUITwMdF2WewVQSiOFv_gsck0jkWggmV8I=": "482645000000", + "aNDbH0ayeSTt8LfIjBjOwr8dsDvnRS0oFEQLwVqb__U=": "3041663000000", + "aNQjDZJzE33KZNEt-jOV_ruizQy4MS5QpPlHSxEGvd8=": "482269000000", + "aNilfiQmSvprBKeoqlCOMDdw15fLPlonuaNH4mmV4Hk=": "384615000000", + "aNjHZ8mY__jAvdvbW29DDjjqj_Jdkx5IwawtvzPgaBc=": "462687000000", + "aNoEUcAa5cwYs2vDq764ExkrrlDUbhQOe05ILyAjojc=": "1406400000000", + "aOPjqv6aSZlt6qQKUT29JRBFlTznKYHJgLKwApjUczA=": "1927530000000", + "aP-CL2XrJ0LnqvD9P7E8ZQ5Ib8dZVCIRfJwpGG-7ZR8=": "406843000000", + "aPDu9wHmLdKVZEisOvhoCMeOohs1kjuFhIMlYOfkZS0=": "5769230000000", + "aPryZwLrnMSXTtBHWIVW7HQ-3v81IH4wvZ-YRIaGUzU=": "452425000000", + "aQFH0B9fKrKalBu64Fs7ykIKyPuVnBXVG8U3b0nM6lU=": "4599140000000", + "aQm-dS_j3PNQS8SvZBYZyvsdBPDApdpe8yxh2sifF08=": "451562000000", + "aQq6lD3ywSdKi7qLo0MwGR6qs1u6f0md0K9bUobXaBA=": "375634000000", + "aQtC_Uy6meuCiN0JSUEsyZ1njEjQPv7K9vAAzGTCRCo=": "454984000000", + "aRt9bbOpMmRKGoKaqT1XBdrBis11y2vkDisdR9-09Co=": "397291000000", + "aTEP6dL__lfgUeLNZW173e-6Subi-n3Tiat0b7-r6oM=": "1840418000000", + "aTMRwpiWNkd0vTklHixL-9uTVc7uufsBpt9K6F9_Bwo=": "691604000000", + "aTTnYUy-cVyQkx2FyT0Q_F1PmcIsBeWgi45rtfaS3Vk=": "576923000000", + "aTzHzKayMKP_2J-nWeJe3XFZwwz4UJUr18Y943mEAxE=": "383684000000", + "aU7D2P_GHtj2r_hxEOKDzFL-m6UC3gjEHrBce-AcAwg=": "391429000000", + "aUEp86u4mPIhtiFJB5bhdBFbT_kn8gv19Gf8LyeT4S4=": "384735000000", + "aUToS8k7Sc8Q-sj-Ve1FUZGlPoy-UvZ1weyX_wWExtc=": "2094619000000", + "aUduS_8iQHoWFjZONRi7kFHI16Ur41LjL91yy3ASDD4=": "384615000000", + "aVFeN66fy6xVsPzI-8pldnv9TA6TmL8rhqpD842C5gM=": "449794000000", + "aVXZyxiwCTLHWqI5qwuslKogzpu8E-Kc_bjLUpizlpA=": "455332000000", + "aVd36xWjDRF427qTHi4xHMZnISyAQGC_ZV6-4g65o-c=": "388750000000", + "aVqZ4n6fsulO7Ss4bmJrRs4jQ3EQkm7Aaaqs8Weacw0=": "42499875000000", + "aWOhKYLrsN1V09FhxLpGJxeS4LJ1iyu8Ak5YaYDHHVA=": "470586000000", + "aWnZ-coeek2UmmN-1cWDZPR1Ed5JCwaJRDSfCiW-7jI=": "917721000000", + "aWsvMn_hw7ZQn0zynE-ro_Bz1KgJ2wBTUFkJuE5KvFk=": "455823000000", + "aX8NdPz3c0iwi6knkKuZEEulDL4-hMFF82C8LGLBtk8=": "464889000000", + "aX9NGrJEMZsohnn3vOXAI0xvc0ugn_njydU3CTktqNw=": "5590909000000", + "aXDvgcZqGrkFMhR4pXMoFVyR7okwTh16UkuSzc9cnJ8=": "4544046000000", + "aXkSInGIWH9MBcGI_vcET8awfCCyE9gjzUZO8z5f5yo=": "1538180000000", + "aXuDcfZ5mqLx1MzwyU_5_BoHCezljO6Ui0zwvc1U_F4=": "1843840000000", + "aYA0lZVYkI4liu8ZVcJ0NMo-MBHUgaVWMKaBv8JVpKM=": "384615000000", + "aYhRHahCpGoRiqIVAC2d-JgMEbi-iLmx50vVv9AGE1A=": "460884000000", + "aZ0UgYWO0F72R2L0eCnHltVuGs89KCtvaX_yD-as5cc=": "417633000000", + "aZzvbSWz99DxgtVD255EDLkhz1rcau04RnQFKuCb3cw=": "903577000000", + "a_4jn-2Oqh-baxALuHRRAUKir-Bv1wmBTvQF_VrnsYQ=": "384615000000", + "a_EtgOTJ5VjZi2xMkdY_aFfXdNb6ZG9bYVQVONMPYLc=": "384615000000", + "a_jtAMxfMfuquKn_7iuuVSXauR-01TutefIYAvJpDIE=": "2690478000000", + "aaDiTEQXhZRRkmn7UE_9BEvCFNI5aaiWuynOZImR-ow=": "1713789000000", + "aa_m8eSUU-aa47QgoNE79HlNI3sPFmYAna4ymCDX5d4=": "20833333000000", + "ab8J3POqDRRY5bgMcy9XLUwZlcs846tmbViRht2peuk=": "768612000000", + "abKoyoV3ryCvY8NMO4X9LyaWBL2oSo4_45bmKRa02BM=": "642698000000", + "abnyIpdjQdp8thkDQHrbFHtVS7fhEF2kmyz6UDGXYYU=": "416673000000", + "acCd4cBlUaWbYo4jV-drLC6k6YNYucHfhb5vW57f_k0=": "447145000000", + "acTBH3ZAoF4merlZeoEIvVJJewrbAC21W4flbNJsZgw=": "363041000000", + "acdDAVYS55_Dr6-I_WnJIGeYgtQU4b9pImvc62NorJQ=": "768696000000", + "acf611Gtde5MqKQU-65vYE9hCX9_II5NS5kgWAbtOS8=": "769230000000", + "acsmjcJHh4-p4sfex_jU_Wr8ZLcFRJhhQ7LLBaM8CxE=": "1620921000000", + "acuDKeqFFNbsEp6Vx1NYBvmSSKTbdMue4o3abnGHDSk=": "2994020000000", + "adTGFzOL6V4w-pCcwDnfma575LppHxQekxurp2ifRE0=": "501408000000", + "adXqi4RWkWiQnBNaLHEte3WcZ_-HDyiAEGNZtlD13sw=": "582168000000", + "addnAsl2RvVRVvR3Hjs3Hm4aHexCT4jKiZVrD9d8_PA=": "3990137000000", + "ade7wmf5-SV0dn7jagq-UuEWvn5tfCdOFy53HQ1UmR0=": "455644000000", + "adrYiLOSSVY-BRQUazw5QibLxccw43nmQCVI9znOMjY=": "3855287000000", + "aeDPnDFW1zXf_ZmJq_fKbtltvXGEMdovhV5-sJMfhSc=": "384106000000", + "aeoMqI1Tt9a1C_jnTfJA1rbHbGj0Cxd89S9BanGt2S4=": "1947297000000", + "afEwg6agPwellAeL8YMs5bLvZccWOxNEqApjwOJ73is=": "385606000000", + "afJohWdQ3tksIkY-AEm5PD-Hp8WEotN-I7ygqvqVVhM=": "833333000000", + "afVyMcAZ4x2mLQvXtC2Tv5abDT3NBg-D14Q75pX4FFI=": "919217000000", + "afnMJ1cskqiooa8c0pq3_Pu6c8hYp2w4wTNjB_mVf0Q=": "904565000000", + "ag0vFtneW5W-G2wmiFVvBFag_8I-zGvU5faIPRAtxH0=": "1539786000000", + "ag2dHQEuQBlyyuzEGZajMyAe_-7ShNJz5eb-FUFXPII=": "384615000000", + "agEhrvF4f8p-xbBHJmwmwURmBFwyf-x5exf8-bkIt9o=": "1586521000000", + "agRpkdA2ECJBlPqwcKnKancs6351shoZnhySY7oWQNc=": "552637000000", + "agWekXQFv9k44JsH_BU9UJ971C4T5q-FXwGE9r42OBY=": "379344000000", + "agg5Ygr6gszcsAqgO8nLY-ZZNm_AeqClMeaQ9rSR7FU=": "377429000000", + "ahhv3gEXr3UfnOTLCy3yYXlaJ3TfSr9GnCrJNV0x4Us=": "411085000000", + "ahm67ah2GW3kwuB6dvufHR5ut1OLXyjQTd7c8LdSEJA=": "878255000000", + "ai-L4p-w5UN3QlDqaYink5iAmA3x77rf-30D80QkHL4=": "379260000000", + "ai09Sz_XjsvyMtBSxJc73IPE7wOq83wFlFmwaxjO-e4=": "490314000000", + "aiLLCIttsunp3ruDVEfe91iU5ZuoMl7f_a8zR3NIyLg=": "463031000000", + "aip4jgGilQK_4VNa0liovvvI5V0luQMltsz9D69ZNPM=": "445420000000", + "aiqvISSfne5jMTV_-BLLV-1ARC9Z38GJl16tMfwY1bM=": "499999000000", + "ajDHElyYmHUf_tloCAQOGFqROkzj9EEtdeKqI6iLDDo=": "983716000000", + "ajMYSV8W1JO48ZXkV900qhPqyyRJzYtxtziHHuySUYc=": "762463000000", + "ajQ39y87m_tzIV9LkZXZMhizuV2jtwRr0DvhGCY7nEE=": "396485000000", + "ajY3WfUtlswbQrhjUQc9PYxWCHs0R2ODHki3N0zcOs0=": "1864908000000", + "ajqIs9vyI9aYorqGma0xTS0ktbhexgA39VKP6AiX6Bw=": "462687000000", + "ak1DJDWydCmgkhiY01iJNBTgBIB0TaZGTqU7ebA-hrs=": "455600000000", + "akf898hSl43P0W7mptoF24k-Oy_1lQWwPpzWzSrSq-8=": "1134962000000", + "akv0UXv6SZ_ZkRcUTapeqGxQ9Ea9lfwO8JoLlMT5weg=": "1538461000000", + "alQUZ4vzcynJLqU-QRiTcbxto3T--fAIuYu_cJDSQPA=": "445868000000", + "alh_hOph7xF4Ff5Ta9avqREMswsxneWg_bboMMg1RxQ=": "377583000000", + "aloVJUHsNKrgeem9-ijZEWbXNZP2mo5fj9-5BWk25wo=": "385505000000", + "amLY5udveMQggLYh_jSjjd2p66qhHIHDxNDJLDUBg6M=": "384470000000", + "amsBbISFcuN0g2_slHmIWRymjZoJi_XwX7P5wb1ZFgA=": "384615000000", + "an6-sfRjmOVMQNVihhJuGVVPZylgoMFG58ltCLE5D3U=": "462146000000", + "anGMNLvv4WST7o5dU6_sTFWPTiJmHuf9KqPviqDyJ5c=": "2003050000000", + "anePWsfawBpO4YQGWeNx9T_l-LwnxrqXr5ukOEpZ564=": "632056000000", + "anubiZjI3BGlXn1rQV9ebqaZcGcQPUJv_LsjCqVkf3E=": "2351989000000", + "ao0zLbazQBPnFRVL-ZtKgBaA53ZjQ5YDJKJypwv3Zc4=": "1582565000000", + "aoBR5j27SGBCcu-q8sW-qDYVbVL2Fs-hRIyRIK7y_Co=": "1582183000000", + "aoL1b06cLpzVl4Cnb058YKevWididSWMovdQboabidk=": "750005000000", + "aoULo3RD_CHOr08NK0BY_z9jvHc5gEnUus33sbXouA0=": "451625000000", + "aofY5FhXBCKZKKd7VyDdoXUD_cghCaWa0hUU7fbs-kw=": "4156299000000", + "apEKIqQBH7b2aR2CfeYnVb4-9LSu1ODTry1bwZmN5I8=": "905885000000", + "aq78BMMOVhxc1cpfpf5v2uCmcaTgnmBuw_A3pnj7GUU=": "501612000000", + "aqTYRaayrsAHJfcCmCoknHmPIl65M3_L8U5wgm3RVWA=": "404018000000", + "aqaBjlgQYQeFg0AxW37A5dZrg0nRDldx456asPUaFoc=": "1965519000000", + "aqwDx_40wPPzz_Y7SL1gDDwZk0KBj_jDNWsMkNWJtfA=": "469821000000", + "aqwz1Ge4JTflUIiHje80NdI1qQ7QEI3Ld-R-gakNYxU=": "448467000000", + "ar-coH51DuQt650wJ1wGLdqc5Ghh_v7oCWVcYYCQv94=": "2309098000000", + "ar8NkqzV4YwR5ke5Qj8E5kiWuhjmHcSIPPts3065Tb0=": "461181000000", + "arSpKYQwwx5_RSafYHxWg3F2JJTQn2gbFf1XZc_y09Q=": "384615000000", + "areFMEcsvbuPJPtaLc-mVHkcI3YClr-8H2e8p0ESdn8=": "386015000000", + "as2qjrgY5XldaEccz2Y1GsG61Z9sl4FwE5T45yoQ-A0=": "865384000000", + "as8iZX3nYq9zWUl5OTiAUc2ZLCriW6TYKmOydHevxB8=": "924573000000", + "asHPzjlzod6JifwywBv4OeTDBwaRLp9ynk6UXtVOeXI=": "381436000000", + "asMKiqBEhoHHYRfou-d68mEaPa_bJg5oBkpA7oCfFjc=": "466579000000", + "ashlftqk9ssmCBApZ7FKo43iPVc1KVWKhY61ti3EGL8=": "1135633000000", + "ast1TVup7r-jZcM101LU7fnxAE1cczasEIUmcUX0u-Q=": "499999000000", + "at5npiVPO8kgrmPqbl8GJzK6BJ2RyWPtjA4v5NcnkK0=": "2000659000000", + "atIdEEei6UnjRgJS-wx4KEIyGbsnFO1FeJGauKwqbUE=": "454727000000", + "au-wVOzdWNqLeIU-kd3sP2JBq-JMhm6lpmN5N-bprGE=": "3818371000000", + "av1BCXATNONCK-gmZhQKmQRa9z6lgwCgxfrmETQ3_BA=": "364846000000", + "avAol-WT7OZ5X0IvbxnTULjp8vqTJpmQjraYhRzlgVA=": "1156518000000", + "avqCDek5qgZqCLWwm9fJGiZV9pcJzAiA2iIrSezD5q8=": "4230769000000", + "awlzaeJNEbcMcveqecJafMQyrX0ZkRPYrQDzdSXC1gw=": "3118321000000", + "ax0DqfCgUHG3IMU3YscSg2vU2dWcsn5aaDiAG8ioy9s=": "909986000000", + "axLygEV3ktZ-bz_Qrl_5mKcHcFZMcjpj57FlSD1fCjY=": "833333000000", + "axRwNNLjSBcY8zwYdWSKID3qNe_ZK4ctck4d0yoEPvg=": "385512000000", + "ay-2bi4XEKiayY8qfWiYeidTh4-7B-wXe6ZUI3iv5Cw=": "3141572000000", + "aygjMWmMc8c4cO5dAN9a9-RSO3x7bpsuv7E-NGDOYXA=": "379260000000", + "ayljCfpOU9KZxI5RVFfziTl3r70TFl2hbngcjmYsRoI=": "21923051000000", + "azLog1EXv7o_K0q_zB5wVtuGJgKXHi8XFoYeJQ7DHbI=": "769230000000", + "azV_n3RWVRiCZY5-yt1UU35p9A7pt1DdZklyc7yhQWc=": "416666000000", + "azdgk4ztvO-qgcWeURXn-bpozAiQzF6UYfA9j4Pc1sA=": "390537000000", + "azhnIQZQTFzQaTPCIrYrvLAS-SoUhADr80L9Jk4CZls=": "384615000000", + "azvNgS5FfgpSkH9qTIEjmggEu1jKI7lsrdJ9pjTWiA8=": "1156518000000", + "b--sLVKwh51dIs6QMHL5SD7TISuflsUzvNqxeazHoQk=": "383704000000", + "b-3-bjVQgTJeLiCe9k7SCbh7YtxlKn0tjzkg7d_R8w4=": "959931000000", + "b-TlfKWJpu_CUsHh5D8tXJiojnvfvZkS_l3R_IPTaxI=": "467359000000", + "b-jC_eEVt0tdArsuHAJhYplu8887_rJxzqqS9uu_lFc=": "824436000000", + "b-oCdtwq_h1l-UVLC2REg_c5-7vaqxJQiDMVyOHuAJc=": "514411000000", + "b-tUEwSIWYMcZ6DkGD9k6sE6U0LsWFa_9R24xXJTVfI=": "698459000000", + "b05YNBKS4zbf6n64Z14_5FuYMXFkSll7YqcAex4EZWk=": "477243000000", + "b0HUxIh_oe_usOtwTtITqlEtOnAGlCAMyKsnjzptzNE=": "383088000000", + "b0fTdQDLSDiFol3b7ttih2eT_B1bOmNxhCAlDqZWKjk=": "383304000000", + "b1MOlaiae-BnQCjK3i0O6WhKkEEE5hTYzpZyfMvuvUc=": "833333000000", + "b1bNkEKEa6Boy-MPSbQKZwaEGQbfUvtBkJSfppZMLxo=": "377777000000", + "b1w0k4TfPa-RkCbPRTy4o-JjmLFjh7w1Ko9zpjDC8Gw=": "384312000000", + "b20FS3_FzE4j4iIlhmFu6FAi7SFCtlKmQVvAHhTJE1M=": "1230769000000", + "b29jl2pdf302EwL8bgimXDS1ckcPPaFX-Pv15xAb2Xo=": "3461538000000", + "b2TH8-ZmFkICBi2ve7KHd9WhPj6ZleMleSZb9bqzeFs=": "384615000000", + "b3EH99N5KZFC7uYS70XCB-XuUwsg2NrYusZyE_Le_2U=": "416652000000", + "b3Ly0m7SjubPpd8ZSL6kqGU-ezOS_cw9TtStpAmBACI=": "383334000000", + "b3xhMnqHiSWbu9Ze6JgzRIE2E6X2YA9w1pL-3G5IDhM=": "387491000000", + "b40muYyDpJW4EbxvUHuJkRdJ05d0Fk2QxwXgKLH8mYk=": "2837260000000", + "b4MyTL_WLc7smDzBZTFjGzQza1Jyc8WhDuBNbEccHfs=": "4706588000000", + "b4Y8X89vCy9er3MUka8iUt2pjxSaPqIOpz7zvCgM2ds=": "933844000000", + "b4o1TBXnxVqlfIA3m66wSGKC-ZwIm_BN8dqnZzV-6jU=": "4658845000000", + "b5eJLGhbgqlNuflo8ka_je8FdLvzC1jiFrSqD_3-41E=": "1245367000000", + "b5jY5Dv3oUYqp3dBwMIyjCPt702ZxXS5oRPBaaqdWNw=": "970681000000", + "b5tCFFVnrIUYP_cq1TC7jjnt1G4yCmz3Q4SUbjgfBB8=": "926872000000", + "b63h63DOpUdYmMka51gl72F93ivSkEOLJS644CDKnKQ=": "391797000000", + "b7WWAZoqaQ6SJmf3yIj6HvJRF_sFl0bcSvlZg-eEuHA=": "376125000000", + "b7fLNpe0Cnr33_GX4l0O-0VMHUK9PkFcYzwWXzCj3C4=": "9999999000000", + "b7vEJ3RTIrM7Rd2XbNMyXSkbKaaiDzrNHRoJxw1OnQA=": "1538461000000", + "b7vLywp_BWvGWWrsjJQaNIe81PNduX-i-tL1T23JK0E=": "377413000000", + "b83XeBgq-039jPfZPCp8yE30A8xkYlXNvZ2b4U5zRK8=": "12841132000000", + "b9CXQRrzZiwwF8bEdxJAY944ax8TUJd39prJLjx4OwM=": "458127000000", + "b9HJwVLwvevzViqTOeYaGN2XVKkbLCZZ5OiNA-vjOfg=": "567512000000", + "b9TMH7f8eBvBbdo3wuPxVCkNoLGw3KoOjB-PNKB72y0=": "461555000000", + "b9k4Jt_S26ztta3Ulmp9rKhAubYaEMI2_lZkZbdz9NM=": "451962000000", + "b9xRlA8pcZiMh-OUiU3DkAjXw7j5BvQ561mYIEGFXlU=": "3853851000000", + "bAUbLCMcknTKRkaTadyZMHGOLBW5rCzo2k836SSx8M4=": "1233257000000", + "bB-pyVyPHBuBQQM0bQMjBw_S7kihB87NJe2Z2k-kuPU=": "689346000000", + "bB1J9iEHJUDIUSQMNHmKa4TOXqHrrV08w0p9WoMQ_6U=": "758520000000", + "bBICoTfqBBHR9I9nBQzmACxQE_tAtieDsAAmsnO-eUE=": "1928496000000", + "bBc2zy9lpOOkbv0SBHJOdfDmULOnAzC7zzNr2viZR-o=": "407819000000", + "bBjg4LNwxkxFMh27CCaTmvGofdmg09zMQ4FrVO_aJII=": "1933361000000", + "bBrVtzvaqB2KyV3__DvKFhtae7OBjgDigW8Uzadr6So=": "1819642000000", + "bCBFJrRoIw5lo5KyGk--cwOfkhjBYXhwJnPwNDPqVv4=": "1129228000000", + "bCKJyfmEqhIs61JDYi1i8vJ1kqaFh2H54Vmfr8L9fNg=": "384615000000", + "bCVzL4SPslpcRw4Jnj6KEeQr2GHZitPJd_IyG0XcoHk=": "460109000000", + "bD9ezIDcloA7HSnvlL8gTsuTO2jnOtEzgafUxRjmJEQ=": "833333000000", + "bDrVFaNkCYGWi7ChhT6OVtztZBXjl2rWT0MORr2T1CM=": "863636000000", + "bE7jw1drUX1lS0VX_NetGhPzkCr8P76wLhNjCj_vUQE=": "382598000000", + "bEh8g9q0UCaIA1vGLMZ8pJSp0IWID0z2dwIzF0M2F-A=": "389386000000", + "bEr4ESDHCOIOteY9z0I73hPEYUU_FqFCvUB1ir54WHM=": "920141000000", + "bFrD31cD8r4MnenYCBgeFOxFxhpadyT2UzQOY-MRMbI=": "416901000000", + "bGC8NP6TUx-8sU0pTgvE9Qyd7cvHPR3g6RzFUFCD65M=": "1591079000000", + "bGD8rN_tDuGYuzr0-4wu65GXLyrs8Xw14lHz5L5143o=": "1923076000000", + "bGRVQX_BrCn01gcEcsa7Ue-uLmZ0uWFAOTVZU9CBY4o=": "384615000000", + "bGzUBETpWzDWQBuFjir-DbfAX7dnpKAci01N7ppSDE0=": "4544361000000", + "bH1c0dedMTHLkB1AvN_EFH1oMz0JVH1GTI9of4nBbcQ=": "1295840000000", + "bH43T9vbXkSqRGsus4PNGd8xOBsliZUpIPzwXIRKRdY=": "462146000000", + "bHX9b64_zwggqa6H174qfljSVbBqdJix8_2GOOcl2GI=": "471140000000", + "bHXD6z5N83eoBJGAUbG6hOSARVZ_wC77-CuavhZgihw=": "4038653000000", + "bHa4QCvq05-TOOQQkRF4CS0bYlI4U6NC6dhRfIqNh1M=": "385510000000", + "bIrLDck5gSht-Jyx-86sNksSeUxhE1-1dYRf-0bPhps=": "4524251000000", + "bJEHV5JWcClpnqR4p8BhUhEZSz35Vb_yQToywpX4d-M=": "2307692000000", + "bJTtbgwdMOb4yG7c18jOHtFgM_DFXx49kpOLppy18xw=": "377445000000", + "bK0jelHc_ixGbvyDQd7o5gM72Cw7mwKGIub8Pkgc_AI=": "771465000000", + "bLmZ8FtvO1AQV3p-_gQtjpVWKnPQ7181OLQ1EriusLQ=": "461801000000", + "bMBbMX6ZpSXJHaG2ttuW_adI1wplAKyLIxppYUmKKkk=": "470730000000", + "bMbMRCv-Cqmg8xwNLUIK17LjS7KhgwYRMueAreMfDLo=": "1249999000000", + "bMpB3gdvll4IezhNxLYO6WT0rqa2_4uUYUnWshyKTAk=": "455600000000", + "bN0cWIcuvEwSQD547Uj77G97kMj1RiafjClJMUQjKOM=": "991814000000", + "bN60CkN-HXlP1g7Bj4EHGfF9J5bG7UNAOOEth3Ns6Ig=": "3846153000000", + "bNE70MKRUY8tunBz5ZpexqAR0LIh72xiPPe1fgoTajI=": "1363636000000", + "bNJnJcn_pCrhLReY-TKxHMtJO550v18i4e8dSb54jzs=": "929867000000", + "bNN1kTVOfcxaQ0SYxF__q7uarK-9kB7mguyVrOZwtWA=": "382080000000", + "bNVEiuKLfbXc6ppSxRzkRc1sLZ4OmVlav_jVuKDcZuE=": "4166422000000", + "bNtOdmniFl4ttQm2VdjDZ_AG7sb559S5TaMRk4u5U0c=": "1002872000000", + "bOhQgJvRE8PqeTNybzWzL4YeRazZEpqOo2nV_yz_8EY=": "1860834000000", + "bPS43bYkriPwjvhDRv5jCULHvR0XSsyJ6xIalHtgN2k=": "1370057000000", + "bPslLXQA22THyoCktTb47TUWZW_NTa9Ufn61Br2dYqA=": "384615000000", + "bQGC41RGZEU-QYf4d6Jbvc-Rlsg43uVWJmKo6kB4a54=": "493511000000", + "bQTCCKQ2XxNbMm0b_Mj4lDQJWfw69a94wS1iT8MvOf8=": "449069000000", + "bR1-VtUpo9DScxoDd7331SXIATe13bUsf4URQC_zIVQ=": "1048150000000", + "bRCMkWNclg6L1Jb3MWN6jmlNmf7Hk6ZfB43WLb8AKSg=": "2500084000000", + "bRUROcoJP7FfLqGey8n9YpS_kvYQsA3kUp1LqGmRNLc=": "2020986000000", + "bRh7d9ARkr-h71R-E6r-jFro9Bbgpwl2MKIGSeiqZwE=": "455600000000", + "bSQBLBD2aPebYwzaGmxEcAw4dYC92tqIrRdGYb15rvs=": "1154982000000", + "bShqKNfOkOx3bYcHgcFJyiFjbbt_Q9fKqRYW6p6Yxf8=": "427942000000", + "bTBNeUxNqj2Am-Q0XZTSbsZCKMfmJQJFZ1PdwlyrqrA=": "385697000000", + "bTMpnxrkXTqRxsPez67boK1W_3D6x_WVKmFS9_rYgHE=": "898541000000", + "bUmcB_zCGhSKNF-JqrFXJ64iSVdnLESi8LBvQb22gUI=": "657307000000", + "bV5kTpYqmACcwcZvsAh--jnJGFCA-MZrCOCUG-b007k=": "2323542000000", + "bVO5F30rkBgzDXwUtz65Z6OrJXMyW53zwwjLKt-BDJk=": "384615000000", + "bVtrBOwSkghYzMXfEionPvFGDUVCEfrPmXubuYSR-74=": "761210000000", + "bVv6BIu2v3C2WOLsh8ZbeDKZSf06nAsCyCJYg_PiWdM=": "462839000000", + "bVxB2XMdOO4eTivU2QUkwRFudjre3xw3bYzMC-tEIyA=": "1134645000000", + "bWNDYDQaPA7wqZakV9d7MUKN6U36y_SL2zkAu2gVs5g=": "386331000000", + "bWX7cT0KD_Rz_iT7Y5YvqV1CjK0vZfpaGk7lfuqZOOU=": "635052000000", + "bWatF0n67Aj50YsskxtrcUN3DwCEHJpTkm3lmriouuc=": "396485000000", + "bWjlsjabMSi6DZDg3hjJKYoAw47KRqDsXTStvIeLWDU=": "419398000000", + "bWmwi1-MdK6jsCgXm9UALrv1Qc4T78UWnGabuwv8dnE=": "392602000000", + "bWy1szmjnBWSm7k7rUWF2EtYR-GOrmVeXGBLr6xAplQ=": "385509000000", + "bX8Fgf5gFYYpZylCe9TJ8tX7zt9f6vnmJxQRoohapKs=": "381635000000", + "bXEkGoOky16e5NYPI0oe0AuKbko8ZH4JRQrgHfd_vSU=": "1327728000000", + "bXYCmikMMXWGOuHok_ACegBy82vObkWdASrqS1kRyYs=": "462146000000", + "bXnf9VMcOINBeOsUs1mQiaDvYOmLERalMO-YZwm8mgM=": "416679000000", + "bYRPrZTrldUqzGyhBt8ryI14uBgJM51JQ4jb2i3szHM=": "1258081000000", + "bYvDhCFnAPqSEsHzigI4viWCcy0AQKGh_llPlaq2FFg=": "12692307000000", + "bZ-yrPCdNyaHApi8ipmb9D9mZera7NI5IKF9KatAsAQ=": "585762000000", + "bZI5Nz9QYex6_ZcOT2GcyVOznfyfaGoqIdbVH9BfppQ=": "385510000000", + "bZMebfO0Ca4MKvUG2Rjv_Fm4QH8Hd5IXi-K6goMhSW0=": "4110858000000", + "bZdG5K6M23I5wQoCDhYw0MrLKWZ3sJJTCUi4g6upJaw=": "454545000000", + "bZjI032s6sGnbQ2m_KmnwyQ19x3s5tLciEdanHr0MyE=": "384594000000", + "bZyMc_XVw6s8Rdm6OTQ4UXksVOCYHjtmn2CBEfi87iA=": "768894000000", + "b_3YZA9KxgXXTcitf5MHr9AslJIfOV6NoBecKsELgPg=": "416406000000", + "b_PxUdX7rsXy6HOovjTm4RjHYIKuYMtwY7wx0dTEZGo=": "522729000000", + "b_XZlw0LuC7FbwwsAC2CLF8XyEHFSU2kWTJG9Ya9PKM=": "453994000000", + "b_myy5JtDvXAuJoLOxg6MrWwDO7p0vnGPZS_T4ig21Y=": "464433000000", + "b_q5YCq6tnqYsAuXl_xYvWwn9QiswABWewCxyCYbahw=": "384615000000", + "baruKqNsVvlt3Ekyb0NIE97htFd7JylmWLeeCIoMamg=": "2236945000000", + "bau_xxBFtFBs5g6V_03QcWlc6MbsyEDMYq1qAqWHi6o=": "466267000000", + "bb2HUmBot5QGWbAOueWipYnas2zY8MWuHOPAgXAoosM=": "1893165000000", + "bbQQgG7dLDeuFUpJ5cC_plpXjTVGJ4sIVvACCnzsyf4=": "7302392000000", + "bbXyajJLwglKRaR9xqWoZL5-LcrC8bhEnzFxuuz2fVU=": "624999000000", + "bc2NzSVRAcd57K-OdK6Fh7_EaSlw4M0pHoM2SBTUm8Q=": "610717000000", + "bcPr_Esd2isRC8pwHUsxReWGu5uYs0oC9ey6aq8U7Kc=": "414122000000", + "bcWPls0-QvBenQ-jrWwnS0iJnb7X3DHhsn6l2LZX-J4=": "416388000000", + "bciJeS8MaEQ_8VbCkoMWvv07AUBQloCdWNCI7iz6feg=": "2214450000000", + "bdSx3M1gfohcSODC7WFPjMe1ATc03mUW9JsveBh975k=": "771018000000", + "bdTbFLPj9yvu8H1cjj6zN8EqRvN6Izwq-YMygolugKY=": "393359000000", + "bdmzLys5IyeL_0hlY9JP2vjkNKcZHnrjm6VvPOVZZ6c=": "22727272000000", + "bdtZI4vp-jfn0FATae7RkA9zV9SPu--Hv0egxA7A5Kc=": "4914836000000", + "bdt_glIANt7SdhdFoepS5E5_vDJQGjnknksO3_02i7o=": "813983000000", + "be59pLDr6Ens7KKcIJ4Eqb9PJH55Ffd5P4CiUzfmUB4=": "7409796000000", + "beS0-PmHJLnwMWPNREAGLRnIXKkBDH2xvmzf1rOSVx8=": "420060000000", + "bea_NnDI11LBqLjLZNTo7jyIpyA_neKWxAUxFEaYLew=": "4999999000000", + "bfBIoudbraZ4HVzIIIqQaa0RAp6Bx5cpHp1eRJyk_Uc=": "576688000000", + "bfUob5EBcCyMgWN71dyU5uEfFp1_tkYr4tnVGMBw4Ls=": "384615000000", + "bfYBvIVx0J0qJf_yR9rWZtCzBJ4UQKAvhf0n3eER1y0=": "3239873000000", + "bgBgms4bjkTNqNReGh-ArVa75We2bl7O9-zEuZdLojI=": "454545000000", + "bgEvyZuDHVWpwjow03a4B26156HyAKNU2rqwQOXOzWM=": "2307692000000", + "bgISkuEFo8AfUF5tvn1JWzPK5aTX6IFdXfYYTptbUJ4=": "417828000000", + "bgJAq-sA9Becq08eGCFw9rv2gUpN5m2s1f-RRGVdcb4=": "416378000000", + "bgzyPT5biORtmEr5sZHsifJNP9ARw19ckcBRRbbhdn0=": "8418627000000", + "bhjht8bhnw4ozvmjERBrCn6UlDHB_lkHb5PhzGQOxNE=": "468567000000", + "bhw1Tui1wXLsW_N5RCvp2p-2SNMgi2jZKuvXuaHZiew=": "389519000000", + "bi-y14egF-2rbAU0S3YxardrTtF8uRlT4cWc5vFleV8=": "384546000000", + "bidvJmupDEFRCT8RTYePf4G6QJrjB5dAIMnCbBRyfGU=": "381635000000", + "bjA0Mc6y-IYIaDUwEK6WMgpudP--sS6QRmAYaeHydYg=": "1432027000000", + "bjKUCLfCCZIl_6xy-PEKs9yBzDhmL2CmKYWCFQ4SUZA=": "445710000000", + "bjO_eJvLHRAu9NpuOb5vCIjC4U07kQjmtYaRGwLDkRI=": "454545000000", + "bjdYET8wSpDO7S30bMISevgCHcgqI7jOt2Uz4NtRpdw=": "1927533000000", + "bjeWss31mE-sArZ2W2eECtp83Q8fiX2TwJZ98U5SLQw=": "1252911000000", + "bkKXfkhbjkM4MwZRpcwXw0OmRukwMr_eJ3dGhGEATW4=": "3786121000000", + "bkPERF11RUsbbiGmTujf8RMvJra-NCBZ_kVuzK6zgVs=": "498966000000", + "bkTHBNhUHz3JywOouuk_zaZO_6L-HOf8dQBXWll4c1c=": "4166666000000", + "bka8g9SrWDdNuWWs6rWLo7mpyJHZ0Qm9fX8xYlQA1hw=": "619295000000", + "bkaqV-FQ3kN__VIAXMvnghnPNjPCl_o0uCmpaAGrHI0=": "1110651000000", + "blE3EBDJObcvhC1iG0nmFQpEWeetou_apk0vamqZcDk=": "384164000000", + "blvcCtJjFwwFQE_HU6dzo-sE2UzJzP9rWMO7QnNcTvM=": "458915000000", + "bm-NF_jqY7vCNUa_MbxsEmCaZWXgpPVUV5AUEqmjMBs=": "384615000000", + "bm4jQCvfzYP7eQqBITTiPiclApgW28zkJrVb-132aiQ=": "1270594000000", + "bmGAp8LuXxmMHvwg6rgdWBvOLHmldn2AnzVKQbkC20Y=": "455261000000", + "bmYqSbTlqodJxtr3L0-Fa2YeWyzp1AVG06OqDTGwJNQ=": "10564046000000", + "bn-FsdKtwhlhc3XSRJKNHH0rSDFSXugc5XzJguv3o98=": "1527211000000", + "bo3Z6ODK6ZTboN_GpObee_5Errk589w17tjRMUqogqM=": "836115000000", + "boCdDAirZ3wMe5IjVH0V7gFkhtl09qJatrx0jo-oSVQ=": "381767000000", + "boHqNUchYxNlhd-UhyRdkytLtCCtGjh9EI_8r7sKnAk=": "2619215000000", + "boJntfuftwemS8fiDrnHk8ph7TFLTFjpjIsvYRn3Ss8=": "940481000000", + "boQJQeEVmLto8xfvshHQ0Rum-OvmLu5s-VCh3xYWwIw=": "446505000000", + "boQiPVoG7Wnjo0yJfi6URjoaj4mNfRE2WYBrZxoJwac=": "1610251000000", + "bpo33aGSYdFX9D5OizBehVUf46e7ywODR9qicVlXLGA=": "1927537000000", + "bq0n3N1QHtDQws7ltG4Citf9t2Qoj_pz9Jvey5BR9Cg=": "417630000000", + "bqN_ZFehoxaVziPnkGoA3ZRxfanG4KJfEbboNZR3Ybw=": "389456000000", + "bqZeNCk1hzizZw1oUzU4YVgcg5HlN5h8NfsH0DY7fho=": "463851000000", + "bqpAI-51KSP6Bx5GO4umgqubv4rrC7TekiMYHfzRUuU=": "378119000000", + "bqszxE3Z5eXHZEAz8L91vYiWdSdvy7yS4RZvt4OR3K4=": "454545000000", + "brYHyiX5zcUVKwAQ7os9jF4Yc-7nxUB8tlRQna3_ovk=": "456871000000", + "bsRWI1cbsyIT6RgHx-lbTccYDks51TRWFZpFoHYdmR4=": "3892295000000", + "bsVoXOqp5Jl0GKYKaD2vNujpr4c64C2H-rL1keL6NJo=": "384697000000", + "bsuxMKnu_pf2_fgleZXcWfiMPjvZk8mFII3WyrAsmuw=": "385506000000", + "bt3MSYSZDjpXvvkIJAKgqt_XQABYnyMyr6rUu9t7Uag=": "379026000000", + "btsyYN3a6T-gVP0v26oS3vrxFH1ynFBzFRt2GB5WWX4=": "384615000000", + "btv764wD02GnPEgvp0it5a-kYEwSOdQeNQSsroBAJnE=": "1153846000000", + "bv6BKQT2t8WgV4MHwr1tLLOcsi_f5Et0RObq_JMXU90=": "385507000000", + "bvKawGzyMU4gNK3nur9yKlZX_jvbasXdqgbGABJZjI0=": "770515000000", + "bvSLOrP31y9iaME80YKbky5cIgpPBu-Sr0Ipq6I1JJI=": "850858000000", + "bw5lXUbT0zbLGSE-X2uSLoc7jNw4FTIkH0eTanODbPc=": "1577584000000", + "bwLyWVexF54xdicIiLmmPlY516ZS4P0uJA0wDhny1-A=": "384917000000", + "bwsBofxCStPTdmFnCWnqswFTnaDyHQVtnvQlSri_s7g=": "417632000000", + "bwtKfHdt_goSp9NU2Nh8081I1BG8dL6aPQIA5beeL6E=": "383276000000", + "bwyKxb-HQ46dl6p1RrJYjpjkcfkKUfyZdZwjjxNExFg=": "775784000000", + "bxSeWp5Bx3QkqCK1UkCZVt0wAOAwY6jhnxzRJ8mttT8=": "6530295000000", + "bx_Xw9DnLrTulEi87OYMvk4dj3GM4fmmFbTyzYxvX9w=": "909090000000", + "bxsG9njMziIjdh3ofUsqptvvgOjLcWw1l76ctDXV2NY=": "482124000000", + "by3pMzyF3VElCQ5FgFgGdxzsjjOiTkU0HhgLvQXNzeM=": "404440000000", + "byPDdN8G8-f6HivqvhtH9mvC9t1g6mnrGVNZfKw8tjg=": "3499999000000", + "byk6GzqqEw9VrQmwjGjflnB1G1k4hPxl0kKXoqglq9w=": "574117000000", + "bynXsRL7InUFNteYk8EyyJkkkZ7LNj13hV_VZ4CL3wo=": "454545000000", + "byw4d73-ZzKQT9-fkcz5FLXx_s0dFUkKUFZ4MyPzlZw=": "416666000000", + "bz1EZxrl9YuFOOJyuqcp6ZoahoVE-ZtGLM7cae7VjaY=": "449742000000", + "bz4x4OOHX-5u7K_nZl_Yq6LM_USD4MjENNuGiKyt9V4=": "1029922000000", + "bzWrA16dasFjqzKK2MfwuRahY0o3oIzQAo2hGuTrZl4=": "666996000000", + "bzXZfnaatG61fvsFfqcoZLZbgxwDgtNUzd0mhjx-u_w=": "389386000000", + "bz_9w830VYYzWdKhNu8yCcBLCyNf1SzF8oFSWupNkaY=": "6950000000000", + "bzjKI3MrGBdgqucohUUJR5H4QVDR8v4WABnbyD0mzNM=": "694148000000", + "bzpqQx18Di0fVnziZ_VjaNHFAlkvxHmhkQFw3K7E2mQ=": "620628000000", + "c-P35FVaPw-ow5LxCW6iRGVlFw3e06tGinkdWVtp2bg=": "832469000000", + "c-eAhJLs0YNnUzbVaothfTOHQTHHuvK2Vt9RiS6sMC8=": "384404000000", + "c0iOndNctMbGfuqoXglGfSoF0VhhRFjX0x65na0wWW4=": "427562000000", + "c0vJuVVwOAEiq6F3oRHiUmjhlUvFZ41ah_uLZpmsMZw=": "3389755000000", + "c1jE3XV_n-wwVIsze75Toa45UVOLty9w_UupTk29Tkk=": "1402592000000", + "c1mwOnYgmC7RLXBHVo8TGBGE2p424CLaW7YA9tawRbo=": "1648384000000", + "c2I83Na5Mo07BE9YCblU00YMAy0Y9Y7m21RN6r8IcyY=": "540689000000", + "c2SYp9qxsPn87JaBBg0rwrMrSqw8h8dalvEKsXVaTgE=": "378259000000", + "c2rq_6ooitCvVoJFNH3Qb7fNP0_t9qO3lKmdlariBpU=": "386905000000", + "c31jJFCSt_CFEV-qclDN7Y8t90dqeVQZI10uav3Y580=": "407808000000", + "c3Ny4qF-SV-vm753gL0eKj9ufVYucaXNUHTIYF2ezyw=": "576923000000", + "c3iQ72ktr2kfkNstQ8s9Ucw2-wYy8Ug9Ql5aKbMpND0=": "456871000000", + "c3jZpR92Jm8IiK_jnVnrem76082zCp1AJ0AvtueFDhk=": "1040445000000", + "c3uzxxv9gdmZIf1-gf-wyRO7DRCejNWctDKPKjqKXLk=": "447731000000", + "c4-3Ytwg-xydjq8yjEQm8hcx8z0EAJzxMXPwqLOj1LA=": "392555000000", + "c58_WD9F-OrhPDuLFklSmmovzbdPUwAXapoPlmzIiWo=": "447389000000", + "c5CqQpXnhQnPZGi_8whHz3G-gP4NiP5_eGJntgHsujE=": "455334000000", + "c5ndrBKGMrzB1iDTcKuGva98W_bl-hm_H9lj-uP7JwA=": "832706000000", + "c64CZ8MbnCaiV3Ikwb5TPdHPl8OVLVoekCoAVV6FIWI=": "389683000000", + "c6FbLkjSNAx7hHn8p2VCZ9TJRBfqDBZv8n8F0FxLmYo=": "992611000000", + "c6ZsOi4sDLX1xW0kYTibFYlnkBQk2MsViu7RtoidhCQ=": "384615000000", + "c7-eydg4QWI0SYhc5a0TWCaqFNRAu4pFgZ1BQmf-6H0=": "454545000000", + "c74NbfnkFqOMQixiQTiDouisZ5iBfvITXx2XduO99Is=": "4455661000000", + "c7CWajEu_MUXrnDmo7GfeLZqGNKfCdtheEawhw057Jc=": "4046457000000", + "c7DDzO8GgIRJpPR7XzGe6hzcSDDSvQc53NabRKnTqn0=": "4531139000000", + "c7DMgaejjEjHgl6vRZax-SmyZe0PdY2x8E7zXkAYADI=": "384615000000", + "c7G6LSVBv7t-dh3tJyzJulOJqTptLUQcjWkpjwYcH1U=": "448509000000", + "c88wMPI4dqYTRlnhxwpvoXFSTs5yeLJpIx13wUuY35E=": "452992000000", + "c8T0J5woLjiqARi1Lf5Wf-q6YAXVa2xlbpGON-r7cNw=": "447924000000", + "c8cBYJLEfvsi9yR5XQJwZ8eA34sCAte818pDVOPZ2ao=": "767729000000", + "c9724C_k7JmPabJXz8C1pNaJZ5T7rLq1dpfera7XOro=": "578548000000", + "c9TBJOlJ-H7XO4MaEBaqJPhhW8ub_H5_TogX1XFR7Jo=": "559859000000", + "c9W29KQpy83SUfGf4tHB2FGMXVhcs4b3NIBJ0BA_y8o=": "4615384000000", + "c9m1Ue12CVzukSgMraEmr3VepA_v51KNAbwD5wpuq48=": "769230000000", + "cA4dO_g4CBfZK7CwABTrir8gl2VdGM_3G8upHonvGoQ=": "383954000000", + "cACU6V2UuBRPtq3Jzw6AQfK_XfmCcN-IFBMFKCS4p4Q=": "1252909000000", + "cAhxRNys7trUPd3Xh_HcS1WULGhD8bVPoR0lhTj-1es=": "773626000000", + "cAiTRfkfwlDltVUSccQfhbI1ZJgczqtw4a6KU0C4zyI=": "5148166000000", + "cB7IiWbvburnzUO3i5WIHrNdRjmvo64y0pE0UtM-QTk=": "1040230000000", + "cB_k3TumJnDJ-wdNO2nSc2GpZfXYkqjG-kpMNSLz1oI=": "385506000000", + "cBzWFbeZFWD4jgdxB2tW-8f7i0nQK3m85avGAoNe5Vs=": "1519244000000", + "cC8Hxb9HZSEfj1fMdx23lxKuEgGVs5jIGHIztZUIWto=": "4233102000000", + "cCI_rAyey-qIdDqQM5Qmcu8bpCLSK_LjIiwt6zj35xY=": "384448000000", + "cCIrKsk6K03m3-vyS5pBxGdskJg0aBGDr-Smg3EPNIo=": "1164230000000", + "cCT1w4QhIR3IbnjGVzuNMol6nY1qOu5xXb--N4QCEdY=": "391908000000", + "cCWsNLaAuTDBboTXcR9CMJZGKOjuwWKpC6CUZkS8V6c=": "419947000000", + "cCbp5NB3uQ0VOmDAZ8REiw5x0ZoXgiAlyqXT1StP3dw=": "4230769000000", + "cDTHaP0fYbMMpsH0_UWDindJqX1MaFaV-kZlccyHOyc=": "358616000000", + "cDcQzyoYRMkeBcdtKB1m-h-ViJAijNfYmmyAgCRLPik=": "385505000000", + "cDfesYSGVSOOygX9NJMmiX-92SnLh6qlKc0VUAfqBBc=": "454545000000", + "cE-P5YLPuVTksfnkaJLMu6BitfIj2QltEim5u8Z-RYM=": "1818181000000", + "cEdXEGM-bcpjD06n-4QpMr1Td15EUUAcgVaevla34zY=": "951091000000", + "cEmF9cWzFgY9sQz2sFlwnDPEMzoAPWUhMCP2nXsRbZU=": "384615000000", + "cEoVffcCV3aJbjwSBla8yPIO7w3jERlZWzvFUx4K3EI=": "384615000000", + "cFA4qOSA1Z2EE2tpbIL1ETnuhR2uTSFmo-zZo24I_OE=": "411085000000", + "cFSRzL5euDXiLof-fLcps0jv-dGxn5CUbNaVy_6SGoQ=": "412344000000", + "cFSciCFnRBcwCMLZLx7kb_YMyEttvVvgs-gAp1b6ARA=": "1348316000000", + "cG1CymSKz0hTB_Aq3YcHQttE3vhNumVAOMls4E9llkk=": "385510000000", + "cGHGy41AwlOga1Duak4JlubF4etqnI4DUsSP9VmlVGs=": "416375000000", + "cGJRPp9o-gO831UChpOrZbStsi_IyU_7uZXP3cS5qR8=": "435218000000", + "cGb1QA-tEXVwi94EEeB5eqKEpzg4WeJfqA6BtqhjWUk=": "385510000000", + "cHZRfYjMy6vnQ_vb-3qPEg-pdasCA7Me6kZSLfxp_EE=": "426338000000", + "cHrR1xsFuKarAgkLWpbFwUGxX3jjctcQBwXh-QT0DVs=": "1134899000000", + "cI766mN-pgJtoPio7EbvKKIzjCtnmPY0egig8Y_qylg=": "452205000000", + "cId14E0GkzTW0DVW6J4P8fT2Xf-YN39T_b-BDs79oCo=": "1618405000000", + "cIjKi-sA-cNbRgNJjgz1FtXFG7dIPEBMc0Ob2Cc4Uhw=": "812088000000", + "cIleNN9_4VTGvXO8rE-o-ShnbEjznUF1QQoHLoRkALM=": "654867000000", + "cIqZO59Hx-cLSo6wXrCiUoLXIe1uSmrXAf2a75cgLGI=": "473001000000", + "cIxy-LRaOwRK9p9vxKvrn8xN1jyWZNbXEWx3pgDGMwY=": "9807692000000", + "cJ1ARyA_IP5gpzpJNAUM4ctbWflLzWpUAjK3mI2O9eA=": "773142000000", + "cJ3QeeTjTGO9YCemF0TsRutjrxIrrs6ps4XZMVPtuGQ=": "385510000000", + "cJ6nia2RMT3ss7J8cYG4QcFSZQhpprAECDrnyadt5ww=": "422561000000", + "cJEK5_jhcI92FJcXYUyXjfyqxEuXW5wKI5jrwkr7PtE=": "4987289000000", + "cJmpgAo7G_xOKgPzW0vr-1AxTbrhmGKIzp5HW1PdyPA=": "1153846000000", + "cJurlWpvNvksdMACpdhOceehDTyPZChc2BYQeiQV-B4=": "578577000000", + "cJzSPwWQ7p2Z7JCtg1QHICIDjCOdSfATAiVOpxea8I8=": "447431000000", + "cKDiZvrGBAiknS82UVuCoxxpVmtuNsdCqDpS-VEgRUw=": "755604000000", + "cK_EnTTaccgt1vuwItkyFOBES-u9rIbSdwkj2pQyuHE=": "11418283000000", + "cK_xXNfwWy2jKOyH1BliFmf9wjxV804cKU7EkajS3KU=": "390037000000", + "cKz_4p3JT77fHWfP7cwI0hzBHlh8KenTagQAy-FMc5U=": "391838000000", + "cLShi-0DU4jcb6Jk_YeyHyJoizHCq5Zohn8gyRyOKrQ=": "1927537000000", + "cLZ2zH0EJDQTrMYcxaURwA4Xem6WeNlroDGX1OMkCyA=": "4211121000000", + "cLZQH9HoC-GxbF2doema1RSNAiCT1HWdSaIUSxOEUtc=": "915299000000", + "cM2sPZ-gFnEoj8h1gnOLBJWs8av2JtL4r1q0dbj81yw=": "10955826000000", + "cM6bXR5476JUtZ82AY01jW1r-vXFsAh7kiDFdOh5wUc=": "977958000000", + "cMBwE07ZJhRpheKa7tO_aI52fhxiVeRwMWCbsp6N7Z4=": "384615000000", + "cMLhNlXdvrSepVEmF45MAXl1L84s_Cxbivot2qHZD40=": "1156527000000", + "cMbHcdV4IONqjzh0xehXfXe8DC3RMhSEldhzGEt0uiI=": "461801000000", + "cMfdzkAY4Yc3Uu63neocewc7xc00gPSR4gEjzipeGSs=": "1340053000000", + "cMlnUyt5tc1ZOC7gK_Cfldrc534DXy_NIBEXzYL6SlQ=": "769230000000", + "cNPw0Abkqx51iaiztGpsTQEzYhQTFkFCbJD8jZmCfaQ=": "454545000000", + "cNRICc1gcsgIfyz7CgFAt9xQ3Vxicg0JoPaKo4qn5Ao=": "394368000000", + "cO9-9-nBXZP8PVK8qUwzm51KiuQl_H9vym6Y0Qtj1PQ=": "388235000000", + "cOA7yJ802dWLtGEJ50zVIO205Nbe163RPyVpZypdJHo=": "416666000000", + "cOF98Ev1ivHh_GeS8_2sWvSX-ypixfoTq5Za0re9aws=": "454674000000", + "cOd3ugxPEb657cd5ELel7PG10Oy6hMexRL2cAnGnbTE=": "391885000000", + "cOhjfe1xs1VP0B1_hhZj4QKeBQQzmsQWM3QkFlcp_AI=": "384615000000", + "cOtCdvROdTpo7WRsQ8tn16eH02MAUEz19VeNFxa9qek=": "453243000000", + "cOxwpOZrFEL8DaPcwzBRpIJPIVmz9ymvC4ky2x8Xk3Q=": "387305000000", + "cPDvzf-COcA6ryHOqtJev1lWGYfHdoxyxGVbTuz7Gvw=": "762090000000", + "cPKUHxD4YwzQg7QCdyIFsA4jhnPOi593mfTcmNzxu5o=": "453414000000", + "cPQgRXX-GqILRD5BDFGL4epZ7LevFqfctFyTaShYBJs=": "413490000000", + "cQ_V-VABuz4Hb2ml4p9NxXm4XKSx7gkz_vHv91k-VWE=": "384615000000", + "cQfDWvTfHLHBSkqrPuG8XHg5Vq54_CtL0LWLTOo7Ymw=": "578780000000", + "cRTIORqs8JQ175ixgJUA830PZpx2L9oWL7IM5m3LOD4=": "470734000000", + "cRxklk3hhzVJysd6-fDyWZIPAJ4Qk7RZKe4UCTR6_uo=": "382394000000", + "cSJS9AXGBHBlDO_XIeJ9hKXPxvZmRj0g0hpDm6R-Bfg=": "456641000000", + "cSJg-dkO0PXs7RpxcWKJ8k-842gi-4LtVuPlL3OdQmo=": "384418000000", + "cST1diIh4Gnq1h7Pz3OB7VOsDdF_TKYLsPvV05uHyWM=": "801909000000", + "cSXri5IUbBgtGtlTk9sM4BVrZBbzmv9eUM_sb6hkO_I=": "384747000000", + "cSa7qNp9TtNfX6MAilAEnvuBKTnwAevsjNTOYOPxDcU=": "499999000000", + "cSil6QC4TB4zxbDcdzW1W0ZsWxe8V-eH8FMFgCIqu0k=": "384197000000", + "cSmPjNIpCqbBAPZJvPitanzBqWZWqYRAdFZmOw8b-lQ=": "385536000000", + "cStmrpicw88nZcccHDPa5dAG-TMytKxa_rvC56zajF4=": "384615000000", + "cTAabMCBmMoiWGdfEKsF45FwrzJOoM0z8TdBJSFgfV4=": "1895893000000", + "cTJ90PRSO4vbg0hFfOt_5gPrtjf-UhGANdTxTjUkJuU=": "423747000000", + "cTPGPnIksc6eRTUI444q2jEHogbfhfunQ6toX1PXdv0=": "384394000000", + "cTRskmOOEbiPvRQDNNfW3L97G7XAqUu6mWWV8_HO3IM=": "379260000000", + "cTVDxeS0LfCup2VN4Eo6HHboQ40pNYKyymNS8VRNWxs=": "405229000000", + "cUXEGlhiWuh-pHMe1xH-dXWLkaserAlGSV0r5BuBWa4=": "404872000000", + "cVKYk15eiY6og4PWHyxCoTs4b4xFGAX3Px3-WDf8Hgk=": "7246363000000", + "cVqdOGEnrOFAtcL5ns9GC6OtGE1Exvh_U4SSfWq6fRw=": "376837000000", + "cXhcBgEeBDq9IYMPkZa2QwVpcVF0zqukj6_IFxxXs4g=": "3338246000000", + "cXjXEwDfusBkOG373R8rhtFhoBuSuatbqnIUzbhatKY=": "3261924000000", + "cYBdNBmvJdNJlE6JqNVuoU8chUfkN7qUaYBZrIUq4tI=": "810714000000", + "cYTcrtztWEtWrBdribVThNfGmIkJydM-2Al3rtzTegc=": "4041708000000", + "cYUysGzOjN9VBzcR8w9JmPOcMSSC9Q_YeUpNxTANUxc=": "412863000000", + "cYkQE5I1UsZXlRm0PcW871mQyT0Sb46IC2YhXO4P1OI=": "461538000000", + "cYtODpfm0oloz3HMNESnUv9z63RncMm2SIVMD9mfDZw=": "1219560000000", + "cZ1ZBV7pQ9QBM0MEdkB8mPPPrk7wR_kuDnYEUxPjoYw=": "1886896000000", + "cZ_-97e27-dptZvhgtEZg83PjdRh-AOYbCqV_MrjQ1c=": "1538460000000", + "cZaKdSNkkX7LnSIOiYecmI2xSuREzsh9lHapq-Rppf8=": "384615000000", + "cZbUbuuiftTPmRCvnQVHtvNfA08uJdf3qmvCJBx2Omc=": "416666000000", + "c_J_Wy0i5HCNptrB2QkepTghPIQtWG_trBmnUxXs_3Y=": "1986705000000", + "c_vLbu16LEFZ7xU2aUkXmlc90chGlD5HLeUaILuLsWA=": "458399000000", + "c_voi_fg2jds2wAGJbXktcvC674l5N1wFsPPZJVlNMc=": "416337000000", + "ca1R-zSBgLCkrUtsgfsCzHOvEwV1VcD7gaG9TpZFSSQ=": "488135000000", + "ca5Ve15zVtMVZk33fvQ9DF8SByjvR2jV_prgXotZT7A=": "1926036000000", + "cawIPW11Cmong-9tz_9JuD2vlH5hCuFqMPBbYJFe8kU=": "385505000000", + "cb25dyHY4go_00qVpL-PfOPSZPp6rkVn2Zyv-Wi-NTs=": "2083369000000", + "cbHxFOuiDgSKWZVSwQ_gbTpB2WSZ46UZXjJZAKUYzrE=": "1384615000000", + "cbIDuqgDZAkBk9GSXMiaqHXo2Vv-CsMEeGs6Xv8tyqQ=": "416666000000", + "cbiccUhdXj_UXR3fDt_XMb4Un8TRIN1fcclCgvdekk0=": "446305000000", + "cckG13j-uGme4h6UYLhGsCaurWaSe-SmrOydM1_A0PY=": "3704261000000", + "ccmDYdUg34RZoBHMJt3G5h9QGX_RWAuVInd_E_ChA5c=": "384914000000", + "cdHSIvAC4nt3bGY93wj7J1A2kiOtcIql0y_bQH_g3Og=": "411085000000", + "cdKmuxZyauI1rklZdf2iGi3FapPOqcaGzCvFFFHQFyY=": "1510771000000", + "cdQkMd0JFCds7Hq0QOdiuPVuS1Jdh1VFZRg_rQet0pQ=": "384650000000", + "cdXYt_f8sFdxCpRAN4v2FMO_JBjbexFdyVBCGPTYylQ=": "777326000000", + "cdrVDbnzS9CTIu47QYOvn4IL92gCtWbMF5n6-rEDQcQ=": "2082843000000", + "ceRKzDWYXNCLGbFOhumgrCXB0R0lykSKBftYsBLKNvY=": "416666000000", + "ceU8UjpuuT6JzhM_botGWC1KOH6e8V0Drb-W0inJKk8=": "455526000000", + "cf6ZzfW58xqpw2FpJWwodBMGEIh6HbqTl1kpWNw2GCU=": "411085000000", + "cf9q6EgsuM2B2ebjp7sxUqljyppWHqUzhYQ33h1uxpg=": "455600000000", + "cfnL9Iys31_DG6aHFmBbUkegDXOxQMxjaLzLyeNXF8w=": "384615000000", + "cg5d8-KaqX08SGNxNN4BBYjJcBIX2bpevAgZQ0Uw-2U=": "1386434000000", + "cg7i2nUxwDLj6FAygaV2CgCAMWDwUMnBulLtkwzIL84=": "1354961000000", + "cghRvD1b6-8nYz8Pdmb_8OoKiNbXpVkBmdnGR4pLk8I=": "1390719000000", + "cgic1uCzFFDAYN7yzLmxRUca-UD_RDFiH7J-pCkEAY8=": "1047238000000", + "chd1LBc8BeOTiJrjriwrL8_tYNXJD98Lll0myd1xKio=": "464142000000", + "chjM-UoVD-Sg23XHOXXwf0B5z1Bt_9ksv09zRwyVjxY=": "7692295000000", + "chqDiQqHhZI9tuAa5t5whdtsb8sqV4oD7Yo3rLsR3sk=": "1603846000000", + "ci1L1m44l4B94AtvRkYDe1FhGPjqjx_Gt3T_0jsyz_o=": "1816809000000", + "ciLipkTScYQowhoH9dsI5VSEdXc0CvhC8Fl6_JefIXU=": "4008888000000", + "ciQZuoO6G5QzjWRbx9Wpnk_WjGiPchMZ2MxIcB6JHkw=": "417995000000", + "cj608nlRx2veSEnjxHJQRcNuXrndOC7PugPB9cde1lc=": "1361329000000", + "cj8HGK5tJwfeA45aGEs1sRYitXHeL3bE2q3F3pKW3mU=": "416666000000", + "cjCB6hCIncZpwJirJDoSMGk-qgU4cQnG44zPjTAc0Q0=": "2350290000000", + "cjGr8Ph3DU87g9VWm2jt52cOe2aVJ7kLhltDKclhw4M=": "411085000000", + "cjt2WrenxQtyzjCaWgAD08QdwmQbcyTKmVQBb5IPy4o=": "2534944000000", + "ck8-3V7eKiX8az0y4PCIizLSr7lMWaS2ogsMjFvx5V4=": "385506000000", + "ckMZk4eUIwHX9v21GD_jO_CIcK-mpjKK41VY1CU_Vtg=": "1153697000000", + "ckSblMPSDfsN7bJyZJUET4Kut9Xmfh0u0SOCDxNQq2g=": "385217000000", + "ckdcrg-dZ7kAa8bLB-ihXUs3QkcuhEkFQ4r607RofcQ=": "416666000000", + "cl2PNFf-4WjHtXhv1RtnaFk19vpq1O8V7pyUIdxtDQ0=": "406524000000", + "cl96UzejvX8kZB_MSCgTCChsXEvznJdd8HGYvHEDqNg=": "462320000000", + "clJ4_5ZoAA5R1a0Gg_JF1zfqPsqMJbxcWtXGyTvyRnk=": "1187125000000", + "clLpNsuKkNBWcpd4TAf-cZpcAczMMvRG_GhR0jQufSE=": "464970000000", + "clnyPFSSlc0HKH5jGdYkpOE89pjc6lB85SUV2Ry8vYQ=": "378341000000", + "cm0x-V5k9GuSU7-cdXUDgsWbzUcduv-85LhUekj7EFQ=": "2597869000000", + "cmCrSE8t_JlBPpwb76f0shHRFw4u_ZiTc0EbhHXJc7M=": "405357000000", + "cn7iviZqDIBlrdSN4OtibqEg86jzuzz2CcTRMRr5rfo=": "4843535000000", + "cnFjjpX45M_Gf2srRse0xcx8ODcq-OUP1Zz7frMbdi4=": "3300463000000", + "cnWyD35f3qXoBroO6cJMsZH7e3drf6PAzurQF4k6-Fw=": "455600000000", + "coBK1o7ybmIDC9Q1ZTcHexT2PmvKkO8n0reVLYLyCBg=": "1153846000000", + "coPL4BvdyqXmZNaSmfYgyJdhHl21PPzIclVrCR6IjAU=": "906799000000", + "coXam77n8s05MG9s1HfaIBNrVuDx-AlqeI94ThsTbJY=": "384902000000", + "cp0ZH3tANk_Vdr2-_fuUAyO7rCuKRVgi0A3weCEe_4s=": "1000909000000", + "cp91OAYvHQbMEGh44XKLwmugtYDK6xY1FyCgF4kr1Js=": "1150951000000", + "cpqG8icikf2CiA6vgxBLtn-eCRNX0z_eoIrkTL_sEPc=": "454545000000", + "cpzdxU8rFCRrzB1V8AcAK-9PbdLgkNWDGyzyoDyAX7Q=": "833333000000", + "cqB7bfvArG5iyUZa1Edae3iQJeI7k6-7EjKCrUOVfsU=": "456456000000", + "cqJn723Qxfwh_b02_avubJCOK2-oVH5mWe8iIgBknC0=": "3866403000000", + "cqUPK2dwuWL9v7mvz-bb54UcCYFpFVhYGpAfkuuRnjI=": "407808000000", + "cr5CPimWXDS4Kac541gDPLpttNLSPOyFBXZ0XjUqh80=": "38461538000000", + "crOFgas3Du0g_B93SpmxTLvLGzoqTwNxp1ka_2QqSKQ=": "576923000000", + "crzj2iSSJEW0lwNL8IJnV4S6EeEWuU3Q3IEgTlU9y84=": "657193000000", + "csK69ZYyQRQKKXmMmHgQMh2nWMKVZUhqbyA6vhtKFBY=": "386007000000", + "cse8E15Sj1UwHbTfgPVojCGOC8INvKp-EnN-N6Tv44U=": "844512000000", + "csszxZdSKyrcapWJJFoQSkN5cfREFHzzCUpsc1cG3Gs=": "707118000000", + "ctVK3U-VJN8KLsLZWXRl8zuaF6SJrugpkqcg7jxIa-s=": "463498000000", + "ctfn8BsZA8EZhuWmHTdyjvXQt0kkw6G1ev4wMz7lEOA=": "833362000000", + "ctkWOJE5Wr4fnLO3ipzyHHSS-syxgDQZxt2pN8hDuCE=": "771596000000", + "ctptnXZiIzhu_xVU4vs77_W2i6gNw-sHlQgHJARM8NE=": "417636000000", + "ctv366oZC6IW_4EyfLvaBZIpgHauOIdcIxgARjuEWhg=": "417635000000", + "cu0Dqm6Nhbj1aSwv66Xx78MgilkHKsVCqGVjV6TIb1Q=": "3793222000000", + "cu16B_1g43CVOZnT5mw2Nzs3gGcNRkTp5d-990cbZ2g=": "458396000000", + "cuDaicQW8Vmy_mBEzlpAUmwokVjBEkyxo6xVLzNV80U=": "384615000000", + "cuHu10qeCozZIr-VEucYLv35IUERbI_iePI1EhpTw-w=": "456276000000", + "cuz03qVirEEFKMeGEgYElpJWJDY_m3S7acGML9szudg=": "769230000000", + "cv2Xq78RMMShQib73oyDMh7RIn8RBO1D5Cy8eCiRYn8=": "1153846000000", + "cvI_aIQgzJd1iU-v39kV31B1yzuDdNApV8TyU56gV7M=": "384615000000", + "cx_dzODhcqNs5chyhy5E21SIQgh6Zorb_lKkg1IJJr4=": "2402477000000", + "cxc1UEMcK9K-00AbpEkxabIWxUdk55aktNEqaqPikCE=": "4545454000000", + "cxtGqRzAEPeTCaltoVNJWq7ymTy5LFNuB3ccgw20eh0=": "2460763000000", + "cxwwtN8A7JnADf8turcl8OJ6I8xXgIFVdpvbus85NZQ=": "1539317000000", + "cy8Rj7iXszsREbx05qYk01n8OJBPc323-AvvywSz8hk=": "453775000000", + "cyI0X5wr-LhH5Jx7gUB09rbBRJYnVPhaDAYXCxi7a7Y=": "391652000000", + "cydgvttcYcfvAHrdbxx6unB8aRmC92P83a8SrorC9fc=": "535554000000", + "cyp_-vICP525vRLMothjE9gxcumyGkuwukDWPrSzpyI=": "925646000000", + "czWS8krYhl7g56YcJjUCh7cnTWnzwXRggbilTLu4kyE=": "9999999000000", + "czY1YEHMe5fYKh3y7MFrjwHZj3Iq5VEaIWHtu0EjRZM=": "458722000000", + "czlL5QfwQ2SIDgPPlaytdtikkdeIswCsTqpXnJtT0qE=": "582847000000", + "d-1ikxJyO1nkrGDzLlBk-LHe8Cgzlr0dhrMY_fTNLxM=": "551691000000", + "d-4EaXV58Pc0dtSiU546etnRg92Qw0yUkAU2OjX_mas=": "1153873000000", + "d-hHRTKRaO9Ngu4g2mabrzYkNV9Ik0SoI7g9bCH4qlg=": "454700000000", + "d-qQQhpbRxi7gP2rsGntOaVLol0zBVTiFv2KsS3d140=": "1923127000000", + "d0CHKKy86WXox-8q9RbptiZnKTxv04Eo-LTYPxMYKCA=": "624999000000", + "d0Xx-NaBCsn2ZoCFdrCZy5l7Q64lC6-b20aPeh0WvaQ=": "385213000000", + "d0eaQm1zMP-8YpF9KEOuovpGAGwdmhLB6X4Unq_Ioo0=": "385505000000", + "d0v8cPLZRxwmCe15uSuTvoL47sStUIc2FdG60y3zEzI=": "392256000000", + "d1i_wM6j2QyCRtGYkgAUJhGYy9QVTjC2pzkC-mWYN3I=": "3848827000000", + "d1y8roaeY9Tvk41XZiG0gPaugJP7hzLsu_zzhsLbuZY=": "460079000000", + "d2Ie08ll075hQB4gPfpkJ7xvGoUOyJoev3GimjrRm0s=": "7710150000000", + "d2bNKkWP-7F-goM0D3qqbqcKI6Mwq4MinWU3ZBGLLFY=": "1536741000000", + "d2brz7y8eV1zGRspvWV0SWHdgqAdFliN_ruzncC9kOw=": "889412000000", + "d2dyRNETyKK0yjnynB04yWcBR0HsQKvFCahrgdhkebU=": "763604000000", + "d2sUqJiiJCfttQsNrZ8v9m4GW17_PPWHFfOTd7REsoU=": "378711000000", + "d3rqufQZGUECAf_PfulczhdCKfcFE9zUhd-8L0kG83Q=": "13479303000000", + "d4rpwXcAT6C3GETcquOIFz6wHuuuHj4AD93g8evSxZA=": "416666000000", + "d5EPZeWi4_sJIZgVVDdnx-kAFQD9F0UliKDuKTBYMgQ=": "587214000000", + "d5oinrwY864rPLf-mstBc35R9XsZTHDkzpKQGNvRWnE=": "4999999000000", + "d5vajVdA7qQhbkLVZ_X2tLT2TYy4LsJkvdjDAWl5cF8=": "407046000000", + "d6q4OZMHxdLVJuMI95PGojKATsT0SkDlgMLpy0jUeb8=": "381805000000", + "d77uQBeUCKZYXCbccJ_hszSaZkWjhnZ4yjPiBb7ZY5M=": "1674750000000", + "d7C6SHredoPLX75T3HIeMdT29CwjEPnZbGXd41dDha4=": "391941000000", + "d7x5ZVq-AJBf6FJDL8lq5fZIbwvuD09k3BfPg_U7890=": "5039049000000", + "d80qZsBhJjKDfzYCIw8u9P30tJscFx6HuC-fvZABdJU=": "384625000000", + "d8C6qqPfxRNukXcsGxfe_s_bDcLq8hFiF94M1x8Kcuk=": "1513084000000", + "d8GXBsfQTIGm_ZKBYktDuwNrZZNbrgSYzlGpq3kia1g=": "3601212000000", + "d8JXr8HHtquuXlyMVLPVXf0Xdi4nzsr4HKHTJKImy2E=": "1999999000000", + "d9Je-gElfCbqA1dSzCuy6VvaV24BXWqvu3iI6uTr3qE=": "384615000000", + "d9lFmoq5D6434sWUi7OjA020Vi-vwCSN8839Od4JpA4=": "1485645000000", + "d9ofPJcjsgKQ9qKTtEAY-nEysdATHFCwpKPu09R-6l4=": "384615000000", + "dA06DUcGPIhmo90tD4e1IGdPIzym5dCUhGFEu6tjgw4=": "460945000000", + "dA6rL-3t_otWAADVmaG7xcP9XGjphoPUzzOAYlixcJM=": "385448000000", + "dAEMGAbp5p98Id5eS6OSpjyZquH7FF2FCY0FQic3vic=": "417632000000", + "dAZ9BVxKXXImivfc8-15AbKXfIPOw5i45MSTWUIEXMY=": "385461000000", + "dAjEAvEpPUSnVizKu6Z_gy63sW6kLDwpyZ8kYU4VGyg=": "417634000000", + "dB2j9vLzKLf10ugMLAITHsTSKbojg8oHvUnJi-xEmZU=": "3823944000000", + "dBGLONY0-ylYO03yZpD8MEbkDN2l6UEyMgR6KOqa4qE=": "766709000000", + "dCDll99E-mWJ7d7dXsSNUYuEI2NAD1Pk9CY3PMz2la0=": "9999999000000", + "dCFf3fkPwe-IYwaKVjiaF0TwrlY7Lk7sStwNKcNx4Aw=": "815756000000", + "dCd57eky8LakgKaT19OdZAJcslWXUjqUeYR-lVWAtQo=": "773261000000", + "dDRjkkk1vgZxjIJmAgaQugqRd3mIf0m157Dvt66rn34=": "384644000000", + "dDVD-zjJpHJ8byWqmdlPHKs2XIzpkjlg5ncK-Gf0fPc=": "818786000000", + "dDWWI0yl4U5YVpd5dYl63zwNMz4Fr2KOayNZc-82HFk=": "386293000000", + "dDWhvLyQObK44yBwMT109_uRGS7BfYIebj6FUjzzAHA=": "694827000000", + "dDfWvwYcnfAT_0OQoahCxOjDnWCnMHmSqt_xnlBeBvY=": "4178535000000", + "dDxOhJUgV3ojfm58-g8jivsEkVVLgXz8xgXznvNe0zQ=": "1810877000000", + "dEEd2_3Hnb2dy7EFuCL8fT2Puodcw_W82XSv7CAYt8U=": "384486000000", + "dEw_TBo5ifWa_PSM5YCVl1ndCvPqCI8AANF6XK04ih8=": "457058000000", + "dEzAvJOROtCm6bEVEBAknqwtCB_iY7CdciwiUzgEd4o=": "385315000000", + "dF8UeXtqaxEH8zsirUToHFXgWAroJ9z-eusHXLyYko8=": "417236000000", + "dFrST_0ifIsJtsNzkZwr62m7XKTyoZtNaI2kZhUl7Zo=": "466216000000", + "dFtRA2etI-FmNX0SgTXVpPp-uDHTR103oMS5kEkWd0c=": "523748000000", + "dG-XG-RLOke2sU1spN4T32Zmn4tpqbPEZvV1Pmg5V2A=": "959422000000", + "dGGgS47brVvdckYkewX5GflfkFLlYB3VAhCmTRNaC3c=": "5080974000000", + "dGZH9SuLnRZTrQ-DP85DPvHGedgkOsXWZggQ6WnuZTY=": "411085000000", + "dGpPPFzq0_5eMcp7HOMsjLvhD0Dd0nITcGqQJV6AiDU=": "416666000000", + "dH6VBHvJb3pe69-9wtvsLv6DPuqcu-EGXzFm-eYuybw=": "2275234000000", + "dHb-FI72QqzcYdjOniZrLAC8VJcZjkINTX2LEgF-rGM=": "417612000000", + "dHdwswCVVNCSvjvV19ZeGOMWsD4H7uiw6P8mY3iFbgE=": "445020000000", + "dHnAEHO0wfIhgmV32oe_NPRNmQlIXGN75C36DKX3k1o=": "3854759000000", + "dHyUXNKjGJxq-Q0WDZknGy1i9Gr5gn98AuNYDhsd3yU=": "385011000000", + "dJ4Si95BIdfcogWx_KeBk6yOj7onq65yDixd6oK0yMU=": "3846153000000", + "dJ67Dedu-b_uE6jmITnUlCf6XS0xy8o5gh0jFvEpUa0=": "4230432000000", + "dJP38NQhtyFVGMwgqDJnMBx1OXJyO9tYuqw3QvN5L-E=": "385507000000", + "dJTJzeQYa2iGWzaSRkHlmgbTxgetB0UpG8JjwW1LeUY=": "1538461000000", + "dJUiWtr075F3JqOVENZpgHXGgk4kP0pyg62H7nnJbD8=": "391344000000", + "dK2VspiK9itOXOHmIkVcZr83Zu2Krjl5w0my2YFBT_I=": "576923000000", + "dKBUWetLv7b1GJd0MV8AtEPn-QR8gZ5v7e4sNRw2a0A=": "385507000000", + "dKB_jtF0mZ7nVOgmGvgNGN_HAvUuP6FTZ2dRZv_zz-E=": "384615000000", + "dKQB5vVxZY12dhf_E4PWvu_q7OF6RqLWqrpLY6bl3es=": "462839000000", + "dKwa85D7CHyAOtp-tod0RQqe5a1zKTFVQ0sYCPF1Rik=": "1891305000000", + "dLGGwCRLMjxRlFnvcemlSUT0aTAhukEsXxZhtxv5_58=": "5992795000000", + "dLMpkKC_Moj6SPViRE880LC8uUekk44KXRDJYuiAs_c=": "384615000000", + "dLerEc_8Zs_1S_c-lvcZf8BqTMW6O-FT-kEOAO3Vsns=": "384615000000", + "dMAl1ZvQ9x7lpU7E3R_PFfb9FHKg3yNq80iz82M2IBk=": "473771000000", + "dMWUhdmP8bkkj7bgzo6201fsNSYa7qCx-5EM7ye_TpE=": "4557606000000", + "dM_Ujo3BdrbJ2aV8BWyz7E3CD6nZEOURuF_hzVeLPsY=": "770472000000", + "dNaVBXj3Kl4y_fCYXYAF_q9VyTZQ0wjnG_r2dEMFi4Q=": "405229000000", + "dNxjsgphghtHgTESKqfoLD8TSQaKPPMwL1WEBI7xYYU=": "1927537000000", + "dO3QPB_I5h1Rd9DyABeXkpWfwX0KH88U_KQ-m7LVdNw=": "416666000000", + "dO5qtTxK2J8yCy04bkRGdLZN9vhuMEJY1tvHERxqlBY=": "5018032000000", + "dP-FD0-lDyKW-CB0x6dg8BZX7HcBVxrhxsTqLtnUBMc=": "577910000000", + "dPNTP-XHE5E34pF8Ou63PIENY90YPH9ilHeglg7aucs=": "363764000000", + "dPYbgbz8Uwh_zKWbAIjq0RZ_JUp2GGHzMOYWXcfZjiY=": "384615000000", + "dPmmT4FvzEyJjOoPEavgtTWlAHllCG41demnUQ_eegc=": "7462662000000", + "dQLA7d2jp-ojApYeL41TSqRotezoP7xXS-B8qWuTe8c=": "390985000000", + "dQvyjyk_E4F2SRyRWNgrJcAT6E1Tbp3Eyxje4bUFow0=": "454547000000", + "dR9g5VTLGdqEFSQ4kaifGAX-TsEpJho2puSzP9YSAD4=": "416710000000", + "dRAp-lOTacaFpWFsb-twCR6CekhAxgWVAYoqioSkT78=": "1152108000000", + "dRCzBkcc0cWERhmnV4ZuYzdFkvyTUPI0cDB8rMZOZlo=": "404995000000", + "dRkR4u721uk-O9iOwWJwBSkJlytjZez3v7K5S4fRxBw=": "417148000000", + "dSG5Uu1I2B0tpOOft-3TCxMXDGCHxWlQWo1WE-cmlyk=": "384615000000", + "dSIVxOporvEzy7-_Um9ki5gAu--_bEtShxyZacHUy9M=": "811696000000", + "dSMDi98DGctkgZdtK3gcPbKP6zE1PdpH8F2dQf3j5Ug=": "391885000000", + "dSRPOG3D69_Hq7MdAiRLDE55yxYBOp-q-ON7148QAHU=": "873483000000", + "dSmN-6RuGnopT_DgNA8hTIkfiYHhGmNVky1Sm87UHXg=": "929409000000", + "dSuemjDCeUDy8KR83e1uknTCB2d3zGNNUuhKZj0IZWk=": "462146000000", + "dTKlbBFaWauY6-4T-GJtwdpd-gxX9iMvJNjWqh55WOI=": "9112001000000", + "dTrhLiid1jM5-JxJX3f0_0saPFJGxB4UkRvExCWsv-k=": "3398840000000", + "dTsvBkUKohcSHEU-YnR-LJbIpM7G0ImIetV0b_2yy1o=": "640829000000", + "dUUvk19Ol_CpGlg-ohwrPpUU1hazexOpK8MMkEPSryE=": "384590000000", + "dUyDheIMMsNX9AyyJd7OZtT29oDObdzJ2Va0Y2wlshQ=": "416901000000", + "dVaiKPJpYtVXLsuFwCF3l_IpH-qbBY9JtdquPjEk8hM=": "622689000000", + "dWC7F25QP8a0mglmac8rRjPkrDZp-nZSyEwM12WUBtc=": "1869436000000", + "dWVdcwiZWWIhx6Ey7ZzTlWBAadQEmjXx0MYLzeV6Zuk=": "470671000000", + "dX2ikFJNiP2JOOD5yAVGjpoShk-FkFLqYIYniSoTj5w=": "393321000000", + "dXPjTjifgilpIP_8O1N4nV4ioOvYmy3tmkkuNqjjd4o=": "1818138000000", + "dXvxrBPkH2_GsWIFEkdsfG28h0Z818CeXDw27_V3AAk=": "454911000000", + "dYDL1XCMzuz1BT_uy4HG8fqNdfyMURqfU5e2ndpoQk0=": "4845850000000", + "dYK0mUASs-BYv_gAXvi74Rl5AYwZnwNIzjCocniLULs=": "450084000000", + "dYxtvCW6UOsJ0b2uYwXjRvpQwdNu402fmRXPOwU9CvM=": "1836164000000", + "dZO9UZ022prBL6rWm6nInEkm2kHm6rjrqy8RfFYxtjM=": "384157000000", + "dZoMTBGeKInkwcrF8covxtbCqgFAmWA55huZTodEfZM=": "1350623000000", + "d_RGvKa4DeEjwL38SbgxydTusCgTz6OUx2rkZiUBrf8=": "388656000000", + "d_bvaFO07DoJuQFWluO5gjQVEbDXlqdcA7hT7CBLDuc=": "418228000000", + "d_jBk19BB2EvHwrgfZxGdUgmwBo3o6GBtgfH4-NS18g=": "3873318000000", + "d_pzt2wnsGFSWTD1J_LYzy65XMUIexEOi5I-qMFuqvg=": "471997000000", + "da2Tp1hsdNn9z6rc66_602igSa4Tv00dWL9Y32TSHgg=": "417630000000", + "daTQhwl3Yd9aqxOA3Nk4Yyp8Q4riDIe-Qij1xe5rSZI=": "409514000000", + "dbLEgX8fApB2S5OiXipWZOeAzUFFNCWQd5ZvY5dDz-Q=": "754435000000", + "dbWXCCIgdCH5BdBAH1dNoR37BJwd5NR2Cncd8IqSYwg=": "411085000000", + "dcnFA1OIaubODtl8oXf_gnPjmTLG8ZfeBKvoSGSgFAk=": "12641071000000", + "ddE_gOljpJiNH_Hz32zCRhNeOuA5Sc1VAwFM-BZOrOk=": "384615000000", + "ddXixeIZ6RUmdnlg9yl_OWnXJ7uZPj4AHoavD8kZeXg=": "3852230000000", + "ddrlHbnW8ocNAjfDX5-lydqAbHYgvMaPqe3lz9QUTPQ=": "1538461000000", + "ddxOBuiosvHCWWAnut6Tc5ohpqN7BDI1x5VvQ0hznwc=": "454045000000", + "de2nzBBgivyN3yIZtArDc7VusHfcvjZGc9exXdDm8Z0=": "395071000000", + "de82028IYt7Cphj2WAeXaWCQC-VDS3ODAhB21_W64O0=": "391797000000", + "deHrv0efmcsnfUB2e6erHf_uQXkzOjXyNlgwpG2EeuU=": "385506000000", + "deqQnyuHDiJDkPorDSHeE8c7gO7NyMBznBbmmkjpwY8=": "7176552000000", + "dfLsuiqyHyhKPgnC6snP1-VZzPOZXOdl0UChBsH3eYY=": "745903000000", + "dgXTKnyaNDBj1l1qyJvydsUPkDUAOrQH6-u_mAzgtb8=": "893077000000", + "dgwxL2M-I2RzafAE9il-ZGlGwIgQRhHdF0D0UOgAT-w=": "393240000000", + "dhKF_F5fBqo7xNEwa16QJ9ZzN7IWwL9ldIFVl7V1et0=": "416716000000", + "dhunfMfPXW6JAkdKZrt0TEPywf17aOovfYwP86e2y40=": "3987100000000", + "di5gszLHQldtCEK7ldwX7gm2mQi23y8UKanOdsgc4WA=": "6853812000000", + "diI2BcoSI5lqMONQfQdIQsUIqHn8uKPYINJk7szLCGM=": "385311000000", + "diLgyWN3Xo_jJ3p2uQJTXhewBN83tptiKmI4wtvND_I=": "384615000000", + "diOeSegwKFyf2DRk7SCXWam5jBqWjcmflZ-AntenMnk=": "384620000000", + "dilNlEsiUiE2bXFGyhqEIrcx9WhJkLzc_Rqf7amcBsU=": "755466000000", + "djBVKxvIo145JxNpQqT--0uxFmTkhoaKuK1dNZD3Dg8=": "386671000000", + "djSg1yC8GAtcZ30-IaHXJQm3dR-pWWvmCMRymfx242c=": "3636363000000", + "djYBRw0_dIS88Kd8xp1yIN83q1DgAspHTXrD9zoSCcQ=": "830037000000", + "djv95_F51mw7U_XdEoJotZfWn956-fjQsVo61QckM1E=": "452875000000", + "djzWPVvdMzesxKnkEgbMmcz_AGi3GqLA5gWM3-x4pkU=": "1249361000000", + "dk9PRw4nbD35fxy46SfQ72JP3JBWNhmCJw5HAdqTVKA=": "557485000000", + "dlSHe_HTeaWYfDdWAOLqlpOw8yzt_8GNzq4BQ6oykEU=": "423710000000", + "dlXOP-fEAseSl14oROZuP7MQN9xo8N9xCGSN5LEgS2Y=": "416901000000", + "dltaEbS3wV9DPcxWMGh_kl-7L4y2aeh5Avxv7y9N6h4=": "926997000000", + "dm41C_BAv-LkALSh_xD4G7zno90lyPLlzEZYXI_JIS4=": "385506000000", + "dmAZETcDUadna3cppxYc-z5GUG6EyDSFHaXQcFBdzV8=": "384615000000", + "dmaEqHDTREIGpVMhULQOH4FlFATd8Z4W5BfwDEwlISk=": "4990354000000", + "dmeIGJvqBeAgwD76ZlSasL9LP0qmBd6YVnxLJUfNNtY=": "467059000000", + "dmj51vuPaMDJ8xZCZMTY28YXHfeBtg76pJBBZKEedSA=": "384458000000", + "dmuNDSXLfnj1uMIyZJ1UT5oEQxV4c49FPL2Pp3fTSSI=": "903313000000", + "dnSNco6PHTTNzB0k4sKpGyEjMa1yFBbCmKRELDiTQHU=": "384615000000", + "dnyXLsmPoBKsZvR_rM8SilMn8HjUiDUkQA1ILDKhsOI=": "384615000000", + "do1psB1ShUKbxG1o-NpHiBiFZMxcGEbKBH6UaH5NuSE=": "492195000000", + "doHvaajs_4a2RXo70U44Wa1V5XtkIHqLU00X-YLaJLc=": "984913000000", + "doJU-09WUoCXkf7GqutPtvzzBBY60-cJ-Rt7sXGNt_0=": "422031000000", + "doebYimAErezoZcf5edG86A5SsLxL_493fKsq6OQsgY=": "465433000000", + "dogJ25WY2d1gfCLyx6WQP6Smg3Y_3zg4ZX3SsTvvsXI=": "1363636000000", + "doj0cQOYEylpazpkGgZuQ_eR5rLJlGYo0hq6DkP5Gr8=": "384615000000", + "dolWf5vXwQwTyrNeywodvOM2TrbxkNIVplynG-IrtHI=": "1153846000000", + "dooUlerQwGbKOdjW-2vYaIu9HxrZn8cC50_bnyMjLpc=": "499712000000", + "doqjHNgJsOUyxaxJpqbaT3yWekmy3FriPG0qi3ma7LY=": "1134645000000", + "dos6V3ljb3nJWR4cm45tbtG5CJa6GdrXAJGwbxJ4lFs=": "1929357000000", + "dpHmv2xSFCLz3_UZcJwecXnXRmZmb_WdV4ZstWqzTBc=": "2039043000000", + "dpIg7_VTKus0FQeicNrbOIOzQrHcfABYDgWWlOw_SWk=": "499999000000", + "dpTC9k4oSM_ewfuhsauzVm3_GY6tVHZo8DvCE2kbdJ0=": "755400000000", + "dpUIr9RkGzTeCJcV4flW_9Mo6b7UXL5R8VMI-9YcETc=": "1153846000000", + "dpvLvrL_52chh-DQsbCHgcFrosO8WnjRF05XUW_CagE=": "388283000000", + "dq6IhiMUFxC1I3-Ew_ek6f4ppem52KQo3CNl1L5Yc1c=": "454445000000", + "dqMzSVMV0BHfYMHJdgKPKW9GDznpy9Cc3gqyZuPhkLA=": "903846000000", + "dqNUT0BR1_6JNo_QU2lAJiZoOvjRx8l_fQVSMNMA5RU=": "457150000000", + "dq_NU6QtCS3CX2fZnW8xtUefjZZUII7F5wfnkArl1Vg=": "1958331000000", + "dqe6D2z0l4fNMygelW_lEKPYZKathbBQgaqA30Ldudc=": "417630000000", + "dr5TW31_nBiCG0STjF-f-p5tbk2yrUHs0X_NSCA6v4A=": "916666000000", + "drW2wcbyWD1JAfru4w_kWr-RNQckg89qqdkqNitPqlc=": "1647916000000", + "ds3Hta_-KHTuQ--DtlnvpgqUMLN0KfZw3_0AFozPBLU=": "1250187000000", + "dsCZ3SD5Md5pjqFjeU4W8coqJgXjhL7R53TTrwz9IRA=": "384615000000", + "dsdciqm77SQl2Zx--u-NEo2zrXX2usT5kY2X-a2t0u4=": "850844000000", + "dtLDvHY7KnbgLFkpq_jyBWsKnRtILqwcwI1L-NbI4wg=": "455055000000", + "dtPMGrsBl2q0LrJQEeVLNtU4G93T1jwRbpjNMfEQDLk=": "1156532000000", + "dtQ6X_Q96_EKx3lAMB9Z8_idY9zOK-epcuthR2YRxQg=": "409514000000", + "du5cYYxoHL1s2Cmjx6oLMeDWI-bTe-7HH1bI7ZJy5JU=": "385261000000", + "duM12vpdWDQ9zR5Hv9ZRWispoUVpMN-eAKiTpma5i-A=": "1482586000000", + "duObPmzvithMyw5azzefiM_r04SmMgJbhQiaL32eKOM=": "384704000000", + "dujf9GKAo4CVojPE5x2tnCCufM1SQL1PXeYkVqJOvNA=": "928827000000", + "dunFChPB6e-qS2oXgHkIGKEeYiZfa7Z6e9GLk51LXdg=": "422196000000", + "duvmFROkatICSB4jRFDNDFGdoXbBklrR9xXoO10oERo=": "384615000000", + "dvJYPkoAyTyfVV5Wtw9qKbWnW9HZbKi5M7QR1JELu-0=": "760241000000", + "dvpEoXQNHInqzqP3S9ShI_fN09PRq1qY9ueKgMpir9k=": "4197514000000", + "dw2ySo8Ixri38U8T8YDtF-X2FRI9QViejf0dkIvq43o=": "1140340000000", + "dwD95tK9l-yvQRUe-xqqLKaGTt002iO4wSd3NLnHH9s=": "3860719000000", + "dwFJkDrKlANIWnc2hvW2RU0e1S5oJge3F3BVR0oWIFs=": "470605000000", + "dwNflKlngNav4UZKO-y2gtxSG6R_nX37AyNIrZdvqII=": "551600000000", + "dwSRJ8miYifCl8CSqiRvyTPfYF0nhr204DiA3sI4lz8=": "458402000000", + "dwVDJVajSbt1RPGTWEVfhKYK2OEQnDtAOCE-ByR-8Bk=": "1538440000000", + "dwfaatzxe41AlNjLmVnMx6fLw8gNC64dlKES4Aih7Vo=": "4166739000000", + "dwsTRCqrOee9p3ja1E6z0Whr-YVbxA_zcqGbTd-kXhM=": "376814000000", + "dxLw1M0J5Z2U7n0G_zMyDDJP6zaxWToud-AQ7inkoCk=": "448399000000", + "dyVUBzL0VvfM6iO5BRJeNxAvqyHKoDedGlaTG-Q6g_Y=": "384615000000", + "dz8vXhOH5i7fYl9g89xxby8aEkTGYfgXACjuDfep-rQ=": "354711000000", + "dzGmwLNHC3I-xqrd1ofiuq3ILiFliyQ65Sod67WSyRI=": "383553000000", + "dzcOPKSHwnvBxrxk6rm-MkMe3BgWS4WNW2VoeKNZiRU=": "384369000000", + "dzdY9BeVHZ8qYx-VPLaB0Qr9b9xv19KXZ0dhoOJ7m1I=": "383560000000", + "dzmPnbz1Td6OUP6z0E91Ja2WBHZjbNpSEiNo3xNJHhg=": "384615000000", + "dzy199_Tjf2MghQoGsaNzwABv2VIP65IChX8B6dJ2YU=": "4163967000000", + "e-0R6NMTseBjDSShNs_DWxY_Pd9SdAitey4cLyToy7I=": "33581585000000", + "e-YbWfzQHjYKAK4JvAsh35gcZ2FZbPTrycBM_KbCTkk=": "926545000000", + "e-bvgBPaZAVkHgGB-enU0Kma_i2s7LOYgAEYS7YPFZk=": "414408000000", + "e-cAwcPokdu_yg6Cxyhz9VRc6aldOB8jfokpfHpd4Fo=": "384630000000", + "e-o4_99PvjfBZ3QQKPFVL2Abu8aynH4CmgDhHJ1t8vQ=": "384210000000", + "e-qWcdjaxXi1KvsxDPYeCEq2qFnh7h5E_E7hA9KkwZk=": "457143000000", + "e04rOKcfvium03XtdxFHtKle6eyUYJP46Zz7ZoNEb44=": "686479000000", + "e0cBzlSMIDm3rJyL-5W-ahDsxefLQA9RqxEAshAIazE=": "769230000000", + "e0eRLKoJh6a-FG4G5OnIS3clwVOcBgggBCyI16o_L7w=": "430694000000", + "e1-1efZPh1oRBEcpqyD3xgCbTmWIrc9agD6yi7P25z4=": "2323524000000", + "e19395zjH90_uibNAOo8Y3p9hGIyww39zIvceqHGVvA=": "1156518000000", + "e1AM6Bo6jK71ec-wce-zUl4sQZ1hEs922Jk3zRIpJEQ=": "939115000000", + "e1MF-dbJ7xKP7t3Oun98TI9Btc5hbPwHfzKf47ZDnKo=": "1391917000000", + "e1b8nNgiOx-B0TxM3Z9R4tLK8FYd3_QMclGJzvUn_Bs=": "406366000000", + "e1eQST_w4MBWvPfbQRhibemrRgEbBflvGCmfGuPf3xA=": "376731000000", + "e2OB45Ps3ZK0odzxzbaQ2dOXZjMyFwWuaOGQq61tX6s=": "384615000000", + "e2Z7egq2xq376HGz97yZAH1peCGs0vYzvC5DJwTBAJU=": "386455000000", + "e2lNbWEK_98J0RMC79y4-KHX_kXar_1JBQ-KhLIM2kM=": "1716291000000", + "e2ucPidO9nhwq_3DQF3SYntK165EtNKrp1fnQZSDhJA=": "4936566000000", + "e2yW78ILtQRRY-N8dhQrVnGH1KGFZxVrTSRQMkQ0HRg=": "366604000000", + "e31w2sRnXzw2YQI54w2q239dayve3PxJpxx9tzJORU4=": "453414000000", + "e32BXIMRFFV70hIYrvTFcLW4ydDrD3gD1qGo0jWj0cU=": "462058000000", + "e3BqwnpF4m0x60qTO33a0HTS2HsDB09-2ngcS12lt5Y=": "409116000000", + "e3CfV8SMOCjNKAYPNYJJVT3nBip23YMR-0-7_cIBSwI=": "410163000000", + "e3ZpAWmUH8GWmLEDpiGd1ka_ctdebkqtzhMBQi4cvII=": "384615000000", + "e3mRY4swGTBSD9odGEumiv__1D9Sr9KSOcEOf4cNIDU=": "384615000000", + "e4A6pEv2oIPlzwacxCNm_Pmg3uzfKoepVDsapFnrBwQ=": "7365643000000", + "e4BcPYQCJjglz70cEShDW8YbbtzOI6zF0eEuIOX8dOM=": "384608000000", + "e4Ed2RL9PnP8pav6lMAEMqDjqlh5H3tmNV4BkifQ86E=": "1382699000000", + "e53d5R17_w-3fqyNCV4GUelsBvq4nZ2xBmW4N1riZeM=": "8999908000000", + "e67KKNYbHaLxcDxHOiTz3jaJRHiez0XA3oQ0tlmyt00=": "377652000000", + "e6n6DTZT0_eWiijcGo8wDDKuZ_9LX3-A3VvAG4BCDfY=": "1389506000000", + "e6qc2jXsWBmZV6xQo1AV-zmO09QjKTW9759SiXXzyoo=": "930449000000", + "e6tGIZBWiGeMNu03duJU5bfONtW4WwdLSDXSe1ZZwJQ=": "527256000000", + "e73jrT5QQqM_nqOucI8Wf9KLbrBtM2N_rs3qhQ7wXfA=": "633636000000", + "e7Czbgx9ctu5gRViroLJhg8XOAAICahXh8aOj6ZS894=": "447259000000", + "e7Ydq14emR56UTCqkKRBH1kt_LC-W9v4czvx00H-Y_8=": "482105000000", + "e8Bw5JxeJ6y0kZv9iSMVutMf0H4woAagxt1nZ8ZaqlM=": "384615000000", + "e9CJ_by-njp_vb1FZ6BVXri78bBFO8yvqNnbF-Dfpss=": "500233000000", + "e9D8p43qthu6oDPZnwUi_a8zDKIzLy5-HibPEot7gQE=": "1141169000000", + "e9T6YCvCxYC4drLEgHlFhETDMPySWt7ZTrqQ1bmUADc=": "2499999000000", + "e9YgdKfD3Ynh6BCZuVETERC50aGy0kliFD8jD2TjOdc=": "387421000000", + "e9_xIOExVLBmQxxOPAG3hZHh2DhBtxWiRW_bphVl-tU=": "384615000000", + "eABgbKH4jP03LCv5U_kLqJXljVah4Ndk6MhnJtwfVa8=": "453414000000", + "eAcy6yc5YSZCIyyZzbZOYK2K_Fsj0-ro4nrhTmDNv34=": "3419609000000", + "eAnV6EG1zsgf6KevtGkkBVFiMuI6mov3NxeVjbti_rs=": "384615000000", + "eAv8PTA85rQt3W2Qp6c9xmFeMI27rpucBSby19DrvXM=": "780021000000", + "eAwRTwFt-bklOgq8ZBsRtxiCKTYL9M4FPKRcR4YIYO8=": "464619000000", + "eBKi2FfL0YZGfLObH2P5RGN2PBKiEPHYb2uirbEws98=": "499999000000", + "eBLttMJ1FfXJw_SMhqkYoCBFDzKbySmO04fRE-M0TfE=": "5776548000000", + "eBeEnM6k-gwloswzhTWaRaASMKVlN3z_UMQ0XVAS4JY=": "534637000000", + "eBllineFZw54g5AUqXiSpu4l_lAn7dmUSvgO0NJLd94=": "468903000000", + "eBxwB3mwL8Mq6p-INYWRKFk8zQzdYkTHhZUHQBsEgGA=": "463799000000", + "eC0zJjjo8X4F2Kn8ObFeZPYxNfNBcJQwjvnKZNqGVQs=": "385506000000", + "eCZ_RLmg3Auqq-mofwPMIN_zF0dtkBlXQkurd-vdaEo=": "1923356000000", + "eCke1G6eKs3vYnd7tKVUZ1bD_vNdKgqqpwbqqAcstZg=": "2101673000000", + "eCya3dpbQPjyvGLGNPzqYDwO5Sd-ZJzBvjCEa_3AFGY=": "3092375000000", + "eEAFZBQ8dzUrG2WiLYV3mvRbFX4N8kcLcpY5u5nsiMw=": "378341000000", + "eEN4-aFRVQWpM5vobzqvcAzwQiXVRYNxPL18y8JG87Q=": "416941000000", + "eEUGFqtFz3FzVncORIXf6TM2UmVGLa5EtNqbz8DF5gw=": "4422815000000", + "eEYczppAjj5qkyyF9Jipnh1HsUq0bTlbjgypJWYdyps=": "366801000000", + "eFFjEHwzdtpYLfL416nMpL4bLPFpNqxO7HaDFJpvyXU=": "1159980000000", + "eFPCfQhExMBXSWStRDm0atj2vDjzKM07A1sVIQQ4NxY=": "1252904000000", + "eFfdEOzStx4cQav870CtTi0fBlQpICizmg8vftzBrGI=": "413834000000", + "eG3zAEjTphgduzxGFDweVz0VuYdvhOorY6iIl_cfXJ4=": "391618000000", + "eGJ-E_5pkSouXmQIMLcgaGkDpK21unggw_SpcACsG88=": "382394000000", + "eGkx1VrcZxoR0Dh_930eWWQICg7R24rO7kn8u_Wj8Tg=": "1246712000000", + "eGlJ8D8VFtrjl7LAARCEBR5c-ki40Fjebzw9ki7RGX0=": "736322000000", + "eH9JQUJ_wY-LIuyyXIPw84DQSsUpHjKgWc3bZ4TEcOE=": "1978680000000", + "eHNfRQ-0YJ7B-4YP34TIKbKTQYp6nmWhWfuphLGNpmY=": "1956077000000", + "eHln1j8SmjO-OtfShQ-wW72DVxZlFDs2FJNFet59f6w=": "3482281000000", + "eHwrdL-wAWK9zfpMbhdRpOVh2DJDcZu0vD9wQnd93tE=": "399142000000", + "eHytJ8Ok6bB8YfIuU1i0e6Zy--Fk4sIadBkeE2_BpNU=": "451719000000", + "eIHrAexAA7EnMttmpTphJNPIE_KCxW9b0EJAbarDV3s=": "384615000000", + "eIi7uHYvQQWCu8Qc4NJE7em5UynlA7G3nyFx76jYU5M=": "6398726000000", + "eJBiwOzkKToCRNSycyC0irvxJaCC2wkwW0N_b5rPCiU=": "6167335000000", + "eJIZ4EG4nJyR7D4kHs9X7l0njeoHSVvyMAmj0Ze7nzs=": "918840000000", + "eJKp6bs_SmsyFxlfaAQ6V8BJ_ty9GXVls6RGZmxvWlY=": "384615000000", + "eJOMFczKmPWwpYrgXYRfBF0f9iMRlpaOIhMLjKKbeaY=": "480295000000", + "eJPIL8uMlg1uhU66kpMQ3nNv3Q28ROh-0FMI4J9T4mQ=": "1153469000000", + "eJU3vzuY4C2WPMn8fjXgV9A5wAtQtIBqUFvGbqLLWOQ=": "385507000000", + "eJZa441mT2LD5RGWxfPnaGp5D2qE6fRG5XJR4zzuRwc=": "2083313000000", + "eK8v6F_eEzbixl-NixFXf6i4oPTP7QAOKJsz9IJn0e4=": "454356000000", + "eKHfIxje5P926ilE4j2uWIRGocO256Mr1rTAYeiwt0I=": "385725000000", + "eKOgiQlmLC5vOdqTosDegFk1JlWhinCpVOlOyc9ntt8=": "386318000000", + "eKcOAA5B2S6wsiGJqKXW7FlfmYcbrnOirxJg87U3qNw=": "377379000000", + "eLWHShdbzKRwbrpqzm0ebIzbKoEELqXIZXkhO_EoGw4=": "384673000000", + "eLqP9k4v_SwYYd1Bu6YqqaSz0Lsw7a2NqFVQ9zYBLOA=": "1666666000000", + "eLt076A2jgEa4Bb0EFYIw958mFrR-gBcVolhzHFajX4=": "1640805000000", + "eM-RIl6VXofIGcl78d1so0fofu_1qJMGdNvko5MZM-g=": "406351000000", + "eML_ng9ehNWe8oj2BMI76gq52lb9EYKeLWaR-O1n5u4=": "1153846000000", + "eMmmKHq-NybTqh4t6HfiVp-Hgs6UscaGnduBmjA5Cdk=": "418099000000", + "eMrKquJYw4AEezSzS62OjKf7nAQOABtuZ5Z4LZvXV9k=": "1264783000000", + "eMz3sWz0p22BuUjt-3Ak4eEM5kB2Za7MKOpdYk1AGms=": "1513905000000", + "eNdpzESjD3b9rf6zYpsQxHsejUTT9SWmI1Ie2w0g6yE=": "1166569000000", + "eNlaloZWo2Lt7GKef1CuvbZc5EjrX5rZtozZl5kpLL4=": "416673000000", + "eO0Ino1h-6ePD-NBIwH2cH4Jge00zD_GiMbhVXbwBP0=": "576923000000", + "eOMALZJeyJXeAj4Yc_bJzboq5uwsAB_il-P_jLjIBjs=": "384615000000", + "eOQfSmoPslr5R6n8XMpVXAd-N5siCWFA5NVkvMT3FuA=": "384615000000", + "eOvqN1mjv1js7B3du7u9jT8uKydf6pNdcDEAUxh05tw=": "384615000000", + "ePFBOeXUmCS3GptbOyo6q5yjogShEGYFP-GP_PAPXuM=": "416666000000", + "ePzR2L_8F3wYsS2I4q850VxgutXSKOlknKM6hW_NDPI=": "3357692000000", + "eQBGHSC0iGZUZYTSkPoJDptl3pxEav9HaEefBilOsxI=": "461153000000", + "eQHxbMKiz2eadPGSlaiAMVZItSAQrhVIqg6xjDK-LKM=": "457494000000", + "eQVkLs9ijnXL3K-bGziPQuWCX7UrWMy5BNW_W74o3nw=": "384615000000", + "eQkOrjlPV5grWGhscZ9GqGTDQbfiXokrv0KEB2_v9ZA=": "1153861000000", + "eR_CqZrzeStV6-wX8TJ-WsWpP64gnrzSuTPeB7VG30o=": "576923000000", + "eRbdfkZ4VslRH4RKlD7na89muFHXfx6GBoDjTLMWxBg=": "1178180000000", + "eSnJOCGvkdXoHD-Z4CvQryWZ1xPKuGN2OM-8rJ3yJhU=": "1666650000000", + "eT7kKFEhiImymrvJ03JW_rpTXNelEpUxRt3DME3p0c4=": "384615000000", + "eTWaXxwmgt7EFPFRSdcnO_fDAo64w9UcAmw-G6_57Ng=": "2254165000000", + "eTZOm_5rE1PIKadyuIAOSJfPrqJJWoD4BfSXKyh-tFc=": "4470559000000", + "eU3YQI4GOHRANQykdgxvbypmfpTNNYniy4CPC8tMJeA=": "1923076000000", + "eUmBtExQequO-XhvYBjR1Y6NM7mXKeCO_rv_f7AVpw8=": "499795000000", + "eV0s5_lhZc1NhuZd_SVA3koWiXH261DM49PVAe_KpuA=": "384615000000", + "eVF6bK7IywyhA7ztEYzYVpMqOPtptUzzcu2OC8z-O1s=": "446583000000", + "eVUWRvgomVqoJpIa6NBreZEjOXoE0ADfn-9mSfihI38=": "452413000000", + "eVtm4pu7AEQvITQmoMTsEqZgte1YouKWDaHH298LnbM=": "15769230000000", + "eX4cNw-TrbVQpau8mAYNkh_OHGJxOG9JcZLII_vl8iM=": "1368801000000", + "eYJFvHiDCNa7lg_D6f80Bn8JWdbO9weqUDUv-niGFQc=": "384615000000", + "eYnJhdgbZSFudt8hacC43PB791qGvIn36O5xHDHIFHo=": "385509000000", + "eZ6SJq3zwZU6V_taxs1rBMwSev3FypGvqs4JJ-Ieuno=": "386432000000", + "eZAhW_EgE7IIhnqmU6tj-LInDHEvG1o9Zqosjd_Q560=": "462839000000", + "eZO9GC99Z6mA_9GlM8-g96uz7MNoTot0mtFLYq-aHg0=": "381727000000", + "eZUgVk3ykhknT0Cfa3sOT0MTbenVKg0TgoF0_YwsVv4=": "457619000000", + "eZUjw3NbUysMh--t13KdJBTGKdFqiqGwbfSmljQexrQ=": "385108000000", + "eZZuGS3EAY-xkB4P-pXPE9VhN7FqpXJnVGgeJPutHIE=": "391410000000", + "e_C2AHGLaNMdHx1DyPPhMsv5mE67srrHpCv60tgq51c=": "453585000000", + "e_GZiP3wIeQK690pTXJgqIPu1kztRyJISet16mo8zGA=": "3041508000000", + "e_Un4YpvgbnVpJm_RNkWiiSqUBbE_R4MyNSq0Fx28ag=": "769557000000", + "eb6SzzSEscW19INQRreOftAOR03_CMTcSl2ccTEASkc=": "382983000000", + "ebB5mOS4yBKjrA1hT5rt-oeWk2kzhXpKnFKW7C8SmuE=": "954172000000", + "ebN-LU8boR8lrRxbFvrqasmUuqdAbofZiC745CV3VJI=": "416666000000", + "eblz2DY0RM89WuYsashjiRl2eh-dH8kqfqNd78wPIK4=": "530497000000", + "ebzd-jUpLtRVeva7fG1sJA9DHOfzduI3hTdovLOs8KA=": "384615000000", + "ec0xKJdhcDZl_pCmtWmiFOcLFwfiK3_9HK-CZDrXJFM=": "382302000000", + "ecDt97K-qJd7j-3Gmd4UESqC5UJuePbMs-ifHU8NXNE=": "4890586000000", + "ecNgIkZktO5y8amZzac8IdCAB2T0wkKzcqs9RQNTQwI=": "382479000000", + "ecVuYLnRUgxpASvGqTY62LHTiquPg3Z_ajoBbmkeTe0=": "384615000000", + "ecbsPk5TKq4bLy5ANiNa5syeM_B4QQWYPF8NceAJgj8=": "1159720000000", + "echgLa02aoNp1Pygv5lb4tbz0bjJ3uoRT3OV_Jcl2xk=": "538028000000", + "ecrOcv_ZizqZqUZc7SG3FRoJkiqMHoCpNT5NKzr_hyM=": "2088168000000", + "ecujt-LmRjLJLHsMkP6NbXjNNfRSIwtrYa7OWNd73zs=": "460854000000", + "eczomRGKFJb0NVkM1BrDty0YVpZsmwhAosoJWKT33yw=": "385506000000", + "edJkjXi2AJcbWoT-Z52EMMkWgb_8RAnJ3wuMJk10Ii8=": "400250000000", + "edQTIUkbCiMGlnK0T-dq3F8Xg8VUkCc5j5HsOvVNxtA=": "384615000000", + "ee84HaKdf-C0rPRuSWc_0FXgjdDqmzmd7M4pc4X6W_4=": "462771000000", + "eeE49LUZu_Xy0M1oPAyFR8vFulzCsPzbgl_FZKeBnFM=": "385507000000", + "eeWDKIdLzFkcl8vMVwSgLTNEG6Uw5t9xQKTxezrdc7w=": "455600000000", + "eecBd1l07Vb2iCUPOaQz1uWhOWanqlFajPBnfHfhl7g=": "388394000000", + "efVl8blFiNKDKopu64diPyPd4_pZWyIPtDafl2fA4Ow=": "377652000000", + "eft63b_KoxKviLRtwU5xeDUkJEQf0hRUeyWGdjgs-K4=": "769171000000", + "eh41IvTY3palGTJWmJlijin7ZK-H-c8oyEUxAQRQXoY=": "1923076000000", + "ehKMD6POZPV_1fQ-6r06Uo7nDHT9_eWn4ulcUYRVNZQ=": "458818000000", + "ehOKDqaG-LeBh9NEGEV6WPL_jvzMOPgeYh1Yd3T8hkE=": "395497000000", + "ehamT93hhVLUUnuH9OSeS0LNk3Umdp3-jdk8eaBX1O4=": "461047000000", + "ehzH7cWdxKg5i0GMsEdR3hDeqvxdNjBzopLlFpVCtfg=": "833348000000", + "ei2ORwgDRviA6Xob4tQyjQKQVRi0j_-qaz-MI7eMtVw=": "461303000000", + "eiGYidly2G31UX3xuQWs4ZsfTelZN1FTKAthyebTuUo=": "456684000000", + "eioCHwHy2xDMzckhgkGxSYcCtqsr_lLVObFkWh9i_SU=": "833348000000", + "eisD3bMF0I8DpHNyfKMvVVLBfosz356kkybMZOnDaIg=": "387020000000", + "ejW0yBDqK6UMZWbZqUdPlyToktBTZxQa7u8ZOFel31c=": "501244000000", + "ej_n1m8VEdaGjWBYxNaT4KSmmzbEXMMfdfRsHksHG38=": "3846153000000", + "ejoYIDG4E086wyGEuMCvpq-Wo0b1B8znPiZqX8Wm6OI=": "416666000000", + "ejoppR-z6GxoXsv3Je9ZVmTO3o1iwU55WjtuDFigsGI=": "845123000000", + "ekScC6KEub3x7_NiVRqUSRzBWZFWi4uPdtGocALbFMM=": "668914000000", + "el1OTg2Dacf5wd7g2F1NN0oqbQj7aOglGGQsBo21fDE=": "769764000000", + "el1b4KNHRaE_CeavZPz1oQxuvjGB3rViBqRIfBXtIsA=": "384615000000", + "el3y1oE2bQ9AuimMUOUu8A4cQyI60V9MLRoQyYEGPyc=": "999999000000", + "el8mYNjp6zjWkssxyBoTuDAgSxgrj-t-CQ4xKXDkedQ=": "2056000000000", + "elFMpDTnzh6LJ9aDMmAL85AclmonTUo62j_AGoSB-KU=": "11016896000000", + "elJprKE_q7iTcme5KJCNUh5gYefaZLqrZ3jdh1K8oAE=": "3264034000000", + "elZAb5P415_BIvsH-xdJAcc-FdRzUBJnKmjH1nlf4nA=": "844474000000", + "elZzwQ8EoI4tLTCxOm0WeowWoGLhFhcjv8VmLZJu8NY=": "383965000000", + "em9UijfWxfwUzpXvvcFATQvUWGbdJ03fnwSxvKLnp-E=": "1175392000000", + "emDY69GLDrGGkUb4s4sdk7BfbJGRVV12P0HMIi3GbIQ=": "1918713000000", + "emV1k01FQp9elsd76jarj4c0QFmW-q6OPUT5CYoQ-os=": "4850249000000", + "en4FKDyFMwy2gUxgUVmGLFBBVawK8AQSTChDcvrNExk=": "377344000000", + "en4gdjkdhpDKGaii5E8ShvL_7_DJm7I9Lvnm8wY_eYM=": "3588442000000", + "en57wElW_hlUwPzdvXWpOA_daxWBclNvpM5J00-WP4k=": "3904888000000", + "enLZD_JsmFFjGhsw2NNo7Yh6XIMGvWq6-1tgCbjsCR8=": "464300000000", + "en_kcZkCDIAvIPCuM151-uiRIgdzUordVq9PbqR6zJI=": "5002813000000", + "enixS1BrsoACpwrV7z062b2oCx6UuZGc3VNap7zMYmA=": "2349048000000", + "enu6Y189kYh5GUiSJEdczqI-r68S9UlPBA87k5lZnQ4=": "384615000000", + "eo1P2_ldK4XDzRdjDRj5ogA0IBgJTkkQ0L5cV9Tjddw=": "384866000000", + "eo1luEYTnaCFMQiufiLsw2A7QGu_8ZKiDxLPamys9yM=": "1999174000000", + "eoCa_6E49uow1DyZL6DPaxueJRlaRmXLJzHDDsaMadM=": "562406000000", + "eoR74-fzvfCQPXv_1GCLgwIB_yASxyq9cP2tM9h9T18=": "2080561000000", + "eoXxhbd7v3GtUrmRyd-w5IPOyYTAMqHDiLRFs3o0zag=": "469479000000", + "eoY4sna48p30Pkp-U5FULoDsvJkNq9jEjg8BHRFwNuI=": "387261000000", + "eon6eL_DPO_pJznE20cl6MtwSybI_zMeJ_gWcz2Ziy0=": "1923076000000", + "eoq_uXKKS1wz3j9lpLG6jTRyLfbGdMpmT6YJ6Jy_5M0=": "595574000000", + "eoqr3J27mjDIhaVZGZ1wK7jcjF_z--GuraAoHipey1E=": "378404000000", + "eozMyRqL36WdpkYqINrt3NJYftd21ScRsJf3Ad5JaGs=": "496297000000", + "epNKDu-nAyGZxJgOC2qSIVYbAmHdE6ImitmWl24PfeM=": "451653000000", + "ept-ZqrB26kcp93jMj9zGw4iDJo6NDdjndxBeEYoIWg=": "383550000000", + "epwRFYth9xl8XCC8GCdhFPJDNmyRSa7w-6xWc5U4byU=": "384211000000", + "eqrnIOJNbJjGkM9mUAPbuXcr8S1_KzqR9gTiULhLEqg=": "4630426000000", + "er9tZZ6X6pm_UO7waANKmnOkqvlCU-d2L3YmvGtyVjo=": "1702120000000", + "erHSiuGfpsrgFdMYz3bL7IgT9ESGOtEUsZCBnlYF8HY=": "682427000000", + "erIrzbvYpappIPqO1YN9XMycWupDQoKUf18ji8ij0yk=": "3540305000000", + "er_v5SLvzhgRIcWB1eapNmoyy3QmVCqYisYBu-4_T9A=": "533495000000", + "esQvKtuJy8FWXMS0pfXNCcd9M40t-IGVCVGntw3fPXI=": "769230000000", + "esaLiTrr5z3BXPnJb16toWkpLRBgh8R_FnsLbzSCvwM=": "385252000000", + "escr-D-kg83YmiSBibfR6Q-7sQXW5pXJ8s-VQLNQmBc=": "101363636000000", + "esmpbMTvXwv2rhZ0FLVP-q7arYUOySQXE4aaEJWsTiQ=": "383338000000", + "esq-sTF9oostKX_3Kt6rEfFk5wRyO6foxqm1aiG7MRU=": "1148124000000", + "etBmxa-PHFlwSBA3znze6XmP0lWNy9xrTVrxG_uSuXw=": "385510000000", + "etLRTngUtbuj2pbPRwW5E4coduPD_k-K3PNWARHU8dY=": "2417654000000", + "etnMuWlcT-Vfy1dmmH8zNV4TAnnshSoW6GXTOSJQknE=": "1330594000000", + "eu6uTe8PZD6W_snaMCHn6z_lRkLZZqnMvhmFFBl1kfg=": "945669000000", + "eu9c-aTlcoUbrb62ub1Yi_zL9wYEI5XYvaXKoimFQkc=": "2350155000000", + "eulzYFYNSxALipO13YJ62A5zent0p3DmwtHq7mmN-Cw=": "455600000000", + "eumzllYIlsaptvZpdkU7JzF22v-Zh1R8fb9Wr1B1lzw=": "610405000000", + "evtxKeNNZ4EGDQVl3QthhzQhJkYyHKydhPVm1WfNXZM=": "4166666000000", + "ewkeynvCEXgzFOwSAVdLHywY2ghmQkiYnIckm241EhE=": "786413000000", + "ewr4XG-0YkR7UWp3Pp4R3n6fXAKQiwES2ZBgwDfuuhc=": "469739000000", + "exMN5ZhBRyM8wVqhg0fNWN0foBW7_baUzx5saYcZyFs=": "385510000000", + "exT_te2nAwvBzZIhnyiC4ktkHA7EszVi_wiVXQfvEX0=": "384615000000", + "exxbPUOTjjjd0Dm_xP-a1ceFg4IDBnnuHcIJqyhFZKg=": "1181818000000", + "ey3fyaF9MCeEdf6ukePVlomTtHVgdeONevvL_h9WK-Y=": "2314250000000", + "eyLsPuPUNCsjVeWiji5OQSwcJjnN7P2jWAhD869IgoA=": "454545000000", + "eyYFRqoitlcOY6UO8ODJ0IzVF8m0tXnBRKykskmJKYg=": "384615000000", + "eycRdNldZlb6UXeIH78Jrvp3IoyQEdegeSlCkJQY-gY=": "1119486000000", + "eydr_orztwFI6lHF1cKQXzpBgwjv15REM8tVdYRgmVE=": "389414000000", + "eyxNcv8G7eD3oxRppIQe9E3Uj7Fc38scad9AJowU260=": "3855083000000", + "ezCyqZFpc9I7id7yVMycQx5kAkrg1DyRmfDKtHBO8kM=": "384615000000", + "f-9Y8qXQOWD4v-xABbX1BhZuOuVkgDwmZHIe8VyDSA0=": "466542000000", + "f0Cq8U0q193deKG4nV6MDc9PTXWFRKUdPBS0d1EyuUw=": "385506000000", + "f0xPoZyjtinuX2ktBZ-LUHbct8skHxrgzXQjp3f7JEA=": "568601000000", + "f1B40SlgzGga1sOmZcHPuLFQ0l18M8Jume2OBmpiNBY=": "388478000000", + "f1VM4VFobNnJrmtPrypbqd6pXY0LAUPWsHBd41K7_OY=": "473265000000", + "f2ZMKDV1oZmqkJ59tI9ux9Ac_WQr8WnYjz0kef6mpDk=": "1000017000000", + "f2gXuB8tUFaOMq9CgpLG0AZLgFowE7i-5-wxVzN2q-M=": "453393000000", + "f2yHTzN8D5-F2rBWYYxEgyBIARv6vD7vnpXCoUZOp_0=": "452790000000", + "f3fzAiNphTiXuQVHi1Jyxo42_jRDWy8yIv5ymNWPyR0=": "576923000000", + "f4VYkOJ2qmkXIqOeqSUvCrtIhEpHwgSQQb60gDWP7Vw=": "462146000000", + "f4fIbPHVemsr8xN2urmkghf2g-Aews-rXVLeM7Z5k-0=": "454088000000", + "f4lBAePKrZfSGo3wKIVfLBF4izbqZF-d-1xGLTljqh0=": "446181000000", + "f5EglovKv4aHeI2Io-d7gYWgWjhh4UF3QrP2Uzw53rU=": "2016540000000", + "f5LVL06iIVbtT3FLa_RqsGVumlDhm-u30yM5SCgVt-Y=": "384615000000", + "f5YReoPH9n-hx5HhVhIA_rKR8koGUQ4YArnpNZHOSUA=": "378404000000", + "f6cKIk1RKvp8dsK0n3oFVPHaGALQMnQkINoLQa5BVwU=": "412211000000", + "f6pzuzgWkCUJRlsAkNH9YJJTSGbkAaWCp3kC1qAHTNU=": "1923050000000", + "f6tcWeFWuGGkVRHnxfrAZL09e6rq-wpu5N7mxMizyiQ=": "417633000000", + "f798VUoU7EqXcA8WhrWYDfXes1SPTiLZ00M6B6QJ2Yg=": "833333000000", + "f7A9yjOUubo6Py9L5GziyebEeU-9XStAIWEvQdAU_9M=": "2295482000000", + "f7XkxCO5xjKYyNkd_VsXfEkBcJb0LxnWFguIgGZgDp0=": "1581798000000", + "f7mbnyWH7qjCxGTpZReDDO_lCYLUi4M9tnNhAykIKNg=": "471919000000", + "f84qTWaSjc6K2qi1NBDumYH5I34ZGF7hT2abxI9Lthk=": "391305000000", + "f8UlfgfunLWK-JNjHUYpoOQeus-elDDNni6NjrrNa0U=": "4776060000000", + "f8Xp-R5EqPgIGo47Yv6RuCLutZB0Ui6_kfs8kstNaCE=": "598422000000", + "f8YD-NfUQ2hJlwyOmf_2OxgCUvqL1PlRZ8E3utZwznY=": "2250164000000", + "f8gv1a0v9JsFM9CCOLTVbsqvyLUTxYZXFegwg_hVauM=": "838332000000", + "f8qPg3nvIGcjePCDvMVlZkI2Nm1e6-AtBBl8-Q6lT5k=": "416666000000", + "f95YsHQVeCTMq_D5FXGr1Dsq92zVRXXs6ZNr2eV5ebc=": "1090764000000", + "f9I7XqsdSQ40cO87704VkOwaEJ0IZoY9KOR26FS56tc=": "418280000000", + "fAUF8AAyW639Wx6mi4GPMgVq84g_3F0uOaGBM0kNews=": "3076923000000", + "fAd-pDG8BQvEbBwCvoAg3wB6hM544OtL2O7UaaLqnGU=": "381591000000", + "fAj1YzT6xh3sFsiyD4DqNFEv8VR1C0xlRo6ONZ8KsWQ=": "1156522000000", + "fAjdpBylvkZvmW32S4QzOPLiKh6vtyVdTF7S8_kpggo=": "408021000000", + "fApWemOnPumnBddWESWNSEX_xoIVnZCAo4q4IIFKrrI=": "1923076000000", + "fAza0vft-LnM3kbHatiM-Q4pSXJbE4CQV_4_oZwyEcI=": "833901000000", + "fBMegoDW7k8hoIA0HB2vlrWg6wSLS1RoSo3hO0oDydk=": "454545000000", + "fBNBGQx0fJWuVdOClDmoillrGGb1xGiEuLaHY5INXdU=": "763607000000", + "fBtLA4snAG7xh2YActnBD4HL63bcr_vqH4NGTrdDXi8=": "458399000000", + "fCGMcFTYfqrS6I7nt2hpwdkxvUIuzc-GPI5dhrgeGv0=": "394336000000", + "fD0OgYM3Win9RwOgBwHrjiY20_3gmATmNSTtd2uqji8=": "3855075000000", + "fDGrHMeD5WsPskBcjqKgcth_IRNKhgtB5_kwullW20M=": "464365000000", + "fDJP_Lz0vnjcPalsyeLJYzIeNfxw2xKYoJqzGh-FGoQ=": "1927537000000", + "fDWz-hLghO9YxcglrC6NMk02n18s3HiXKW7MdGwAvaI=": "2645073000000", + "fDXQYSQniUkXoQKKfOO9IPLlPX8_Mww2L9UP_z6fm0I=": "911964000000", + "fDfikulEsXITpZjFvI-XFJZOFsVMlTj-6UIBo0VxmYk=": "1233257000000", + "fE1ejbPGxwdEjIlS78Bn9UHsEocC4xCe-rmhs1IomrE=": "2082775000000", + "fEJ3JyzcRKQSUqazbmA98GxPgfPVvonf7xydFc0_EY4=": "416666000000", + "fEK70XKGUj4y8a7zjbKFwuWxxeD8YU2NjslH6APDeZs=": "385509000000", + "fFW3qNZZp9Xv9ad3x7Aj2Dv129V8TNQdkrXMEgarGyA=": "387850000000", + "fFbXHPz31UV1NIrPitQg_UTG8mmYOzIF38oimB1rC4g=": "392600000000", + "fFflRp57BvsPuARmTax65VCkit3zpSX87v_p6F5dW9E=": "669690000000", + "fG91xbeR76xMaw_FYWSRk05_J8KhGCE6lRN71CWb6Ds=": "4627198000000", + "fGCFx5XuwEp0VYXzKiJRWwU435IrZi7M_hGloDhKREE=": "770867000000", + "fGXSww6BnqoICfGQnvjQP8cwK940PLIF_-9KyIINfwY=": "924302000000", + "fH3oVWedggwO9ytFOMTeujSXrPCDYKwNSMOEbyzLXNI=": "405225000000", + "fHWW13jX9bI8PBTgFltFpQo_A6djj12XNYWoJl4zEVU=": "457134000000", + "fHrNR49w-AHQmnKXQfcq2K9KHRNYHwIM30k_WpOryAA=": "385507000000", + "fI7GVjMgZJm9KK7AjJ-ypqEuqynZojGY7hCjm_BKszw=": "483750000000", + "fIi_7MwOswrXbDK1iRKbRurNqu-nCm9sk0sW949hjjk=": "3184807000000", + "fIlztTSTivcVAmIOBE6VrDHkt3N-p1c5esWxcFch-Lg=": "470605000000", + "fIqWo2rw0KmMOSGtadiddc5PkUecuOELcvlNjH3bXd8=": "1923076000000", + "fIvX8qpUA_U9wZfOZ_InZ9TJ8nKtHDDCdagIADAaarI=": "419190000000", + "fIx4FSEoy15TlLf8Bk0a-hsQQIVw-MpkrEHGee6cDhc=": "9999999000000", + "fIyBvMq2MtAiKSy3c7gArGmlNt4RvkztbYAVCK67_M4=": "912806000000", + "fJBHZ_n4FDMl9-WuJ8kO_AugJqhOHhmPmQntZAGKEPI=": "382297000000", + "fJWJvs4uAcK-Bvw8UZSzvWqcX9IA63bSSNcYf94FD04=": "4727509000000", + "fJd-y5wS4JpBqhhmL7LvhnL3b3BxtemhAAZt0Bn1MNE=": "1156518000000", + "fJpPLuVu8lFHLMwVnBCeLg6Q1Wy85mhWtgQidBLmdao=": "392121000000", + "fKANIY1EIjn14GCXu3iv_okoCzJbQtcVgEQxDHa1Wvg=": "384164000000", + "fKWczLbhtlAE7FbeD27zAxlymPWMSRqg84Fd8W4vim4=": "3846153000000", + "fKyYAK662pbzlrKmQjW1AH4eS68jCjjHka7t6bERgSM=": "454640000000", + "fLCs5kjR9pSsLeXHy50Luwx32l3cwXonCX5_33DP0hg=": "1923076000000", + "fLb50xVQCMybTKW-_cBBksX3hLdWb0u2mbzF_-UBv68=": "769230000000", + "fMZIrWx7j0sn6Dd7TLdRUO3_d10xHuBknS5BScV-mX0=": "464704000000", + "fMaroAwg_UphB2vb9ABbP4hCFGpOX4BBEkKe93uD-u0=": "384615000000", + "fMhEU-0J8YkN-rVj3r5_vLJ-cfsE4orW4sVdSKiXIOU=": "386022000000", + "fMncLAPYpfKpKCLCWkAml4CY6cExj5Tkd-Zr4OxjY_o=": "1153846000000", + "fMxw1ikrMOxEqiYFyTN0uhdcMRZ6SelHhBtOHhkGlww=": "423181000000", + "fND9S-O83kJUSsti13l-YBWyHmOQSr0OPODNf0dh-t4=": "379068000000", + "fNLFkcI1pOIbR-ZsjSazS9Daa0SMRykucbt0pY9yBaA=": "632834000000", + "fNR7WrVt-LSM8z632jXvp8SC7mTfYuHXjUvYcqjaVds=": "555410000000", + "fNdKEmoFf8ebZ6IxYv9FkQzo0L2JOZa6xqCneGKm-Nc=": "454354000000", + "fNqpMCAXS7A70J94qpaRQfE0ykzwRWWBUvpckDohfqM=": "5384615000000", + "fNxqLPBSDcYNf6-7L4fJjNLMApLpC7f47KpVzIwi5C8=": "821056000000", + "fP1AnAgY5tsA9RFDVEdAveD1spSUsKyJspJx_FPAcHs=": "411085000000", + "fPfX95Ug7kGcwHo0vkVA3FZGf5nTlQgBipJ0cKbhge0=": "2029545000000", + "fQF8dvHPzEpU_ks7CchZ1rmFHZu-OXJ9nGLzEQj0s48=": "4623902000000", + "fQxk7q479bTK_KpWkXKJmRVJtNtdv9nytkTl6PIsfzU=": "8329509000000", + "fRB8e5JlR_qsQIOBZximW2CWek2G77GCcABlpWgzk9g=": "769230000000", + "fRFXC66BaqxxhC1-YhOpapVAxUNpfzRyLDgVoQwy0VA=": "411085000000", + "fR_LAurbqfMqcHjKJNKHa366jU01C6X6Zoh-vr2ULPY=": "2157071000000", + "fR_WyyUC71_GmhMYXZ5jO3ZSX2XLvp9a-V4-kd4qEr4=": "366808000000", + "fRay2iegJZ2pYQakbSYLWkpDCRPg_VPpBp7T7p62p1M=": "454565000000", + "fRi259Qy82yFS1FVZgdzAcxto0fdt7KiR9sSjr8nJuc=": "440433000000", + "fS-ia_zI_8_enG0N3EbZJSZaTWSRBOCrLm52iIX_uAw=": "1153846000000", + "fSGv1wcL39NqpQZQp5fUwSZDjWTv3qcuqzare_a6QLc=": "692307000000", + "fSOQXDS6eWwJYzgXIxY9dl8kCII886jeT6EsYOzFUK8=": "494934000000", + "fShtAk-vlNZyydW06XtJT6z39vS1Fi5WzSmaU-0-_Dc=": "390440000000", + "fTVskVPNwAzmhQFMhzduTwkR7ULP-JhT21EgxXC666M=": "380221000000", + "fTiNLT9bjFz5k_ATCxF4HynvJQf-2bARpHbBllZk_pM=": "384620000000", + "fU66Zgp2NHt_TthkCRAjUCmIsIZuzAHm8LvbQAXatx0=": "383937000000", + "fU7kJcLoj29gJkrpbuOa2jmG-Qu2RbNAPQZpHBI-NYk=": "424379000000", + "fUHV0AIMXMBZqnSyBty7FWVgAudm2ZL57OQWe8n4bbI=": "454666000000", + "fUNS-0rbER-vKvBhb1M3R5hBkCqQhjgDdtXB69ql1KA=": "383194000000", + "fUUKBcC31gpVPJEpfjQ3RZV19HZ22p_0NtmKK4rMLlg=": "464933000000", + "fU_W977Pf2AhmGhJee3KSC9LqZ4A_-xzGrEsHtwJm3Y=": "754692000000", + "fUafCXs41tyJrSCBILJ7AF11LrrpKHYyD4l2f7s_6RM=": "1646440000000", + "fUblnTII3DiRKxLwayMHHf3OpaR_66EU0e36pQ8NbqI=": "929409000000", + "fUfO7i91GfkQzz0mGRtTvg7rPZlFKZiLMCbKBQSIVyQ=": "909090000000", + "fUiy4ENDamsWKR7U_hNej8LSJ4KO9tp8D6xNX_61U10=": "563651000000", + "fUp7vfsi6sFpidt0fvZVw48XNV2o3B7vsvIMK9IjH-0=": "3845830000000", + "fUrX3JxsD_UaQ7a4WfKZ7uI4-Y3sG318O9ufOhv5uxc=": "464007000000", + "fV1WT-Nk-PtdhCT24OgaYtHb1XqOhpNPMRuUZlVAZYk=": "633131000000", + "fVEqtVZ0wR8vk-cY9omYo4n9_LxfKPTOtyWxZmTNpK4=": "2780505000000", + "fVvkcX8oGZq59pm2VH4JNQH1rw3GNA5VxsvihuzixCA=": "3254576000000", + "fXTull3-XWpJY-4m9Por3Yc-DzEoMpCmnf_zlzs32w0=": "416666000000", + "fY7bSZN3Wh3JsjdmKc7S_L3iJizytC3Sn4V65_1RhqU=": "381436000000", + "fYcoc94AHiAcmrgO4e3Iut-nTFgOiyjrMMChODiEpj8=": "427219000000", + "fYgNZh7wOZ-5fZvxbvEYspkNKxzRYzdM5CfBGy3zc4o=": "1010700000000", + "fYp8v0YASBr4hEd4ddfXVkMMr4zPforAQSLKpGcpnVI=": "1544676000000", + "fZCyebWSgOEDcowt1aRSQ4kX2Px2QTur7xhedi4pW6E=": "385507000000", + "fZFSG2DgZEOs6jyHdgCiGELmAApxJi9Lfx6maAw4w3E=": "2083333000000", + "f_8Da19LlhCBkwipf8C_HmiIRSsxf-WY_vpnQM0_LW4=": "416347000000", + "f_Abo_rzUeB2Wbnol5JtRWE1HgLtxxV_eTEVadKJRfo=": "411085000000", + "f_RWvhJvsUjZxq8U8TiDatBYfiULJqeapW1S8iLTZQ0=": "391797000000", + "f_h_Kc0VTAv4EFgYyvsxVxk3dqg0YpbjjDdYjWmmLE8=": "814741000000", + "f_s6TDNJHHtWxnhjHnt9Gq8yCQkY4V4w-JCqf1chdoE=": "378551000000", + "fa06BBdEm2BlJNKnMFC4EGB1GbZOpcgtVa0gAhuwG5k=": "392336000000", + "faKAvQ4CCNHlypY-8zOQEbkKj91MXtD4BeQWMIiB5xs=": "383648000000", + "faQEvQjtcXPvjXy-Tmij5U1aOoHN3kHpSJILkNpB2AQ=": "1130445000000", + "faQfZLALkIziUIvplBDbG8lcozma5GA3KWtWUpBJBps=": "385510000000", + "faxfyGIFZpq1HeVIR-UHOZP7AqOhOjpvVnBLxa2jC34=": "359186000000", + "fbElgrhvH__eb7LNzUptuY752zAUnpOD1oZbWoxWJ-g=": "2556346000000", + "fba_HeBhaHR__qkLMVRVje5pbfA4kyvUPcxDVqZo_yQ=": "416923000000", + "fbbU8ed6ulHzBZvh1-VYYXsRMe6XSO0xFrxADs24fsU=": "384682000000", + "fc2VJj-WpMLbZKgidgUYkcHBa6OC3LYFKA_r4qqcc6k=": "2310726000000", + "fcGY8ZRZyp3jmVBH5wgOJ1q3wuw51SZxN35bqAuHV3o=": "460089000000", + "fcLMDiPQrmXU_pY8tLvFCUmj6kXIIIx8gEJudyOqee8=": "769230000000", + "fcYedxGDpD5NSKt1fZLVFd_EOxID2OGNGDS_-A1ILfk=": "563609000000", + "fcywjJNztWppcYrUQ2hqvkvfGvWkueu85G7rLdzhdYc=": "384615000000", + "fd9PnqQfck_7sIbhn_2DCqbL__IV5nqh1O6KRZs39xY=": "416666000000", + "fdHW3OggWlBTj5cvKurLwUr5-U_ksnK-xGbjENeAPq0=": "378341000000", + "fdPpQAvhDvRmNRAuhCV54ty9NQAKykOGckjmIFU_RtI=": "715542000000", + "fdwCs0oo79ET9-UVbiXEtzfyIFisL62FkMCGB-RFLWo=": "3684914000000", + "fe5jVYoXKKMPkqzOudiMU7mGKD3adQdIpnnSQ2CsnJs=": "385507000000", + "feSTr8xWansj-8y73qSV_R1oFOHvTinGzPZW9w_Fbpk=": "381632000000", + "ff-MuMRjD9B2wp6Qb080jG-wq_9WWuTCrFC9ksCnH9E=": "384615000000", + "ffPMLdJXks8Vsk7kxc93vZBiVTLfOa6BJ7Pr8kuixs0=": "826009000000", + "ffgB5p3mTbIQK_gUC-F7U49MyUSdY91FrNJaGY-UgHQ=": "395533000000", + "ffr48ATW6PTMNdbBx4m99-ey5KOXidHYb0WGfDumwzA=": "393828000000", + "fg-VkEhz1UEDjDRgwthkeLKrZF9HTGZ4J5mRx3XjS_g=": "552381000000", + "fg9MhDln_KNgowzFwT3iiN80NE0gAW3N2qcbqNC-9NM=": "384657000000", + "fgJdX6FnZviXCNKemwqOkgTV38OnMP2NmF4DLskeq2E=": "4994400000000", + "fh4ap9p4BOdvFeJAm9cHq2xW3ZysJaRQqgk5-9-hCTQ=": "499999000000", + "fh6Ge2yy5QEyArIOq2KKe6244LlTFKDK_yNsc1HnNcI=": "385858000000", + "fhO91i2w3n_abayyjLUakgG__C3GHH5JCdLqXDllAB8=": "635907000000", + "fiSSuxlHtx_1oUsUwttq2aR6PGazfJs9ksdMzM_Ldqs=": "409110000000", + "figTuH_rotXLph9QquOw_IqbYQEmZPhcJfT-ppvVduM=": "1248608000000", + "fioGipc1NYv9_TTAPlDEmcOlHFW5zsxL--VALDSSOEg=": "1681512000000", + "fjWNMSN0_OI1YCzBOKx1Xldc7kYUhPqqmDMqVbyqNnA=": "386081000000", + "fk8LZSQGOHkwWnE7oNQ9Lf1HbAQpK2CcWLsVwf1UPfE=": "2305724000000", + "fk9GVvdQSodskK4iWpDaqV6K1kincaLRIhvdiMQNb6I=": "938409000000", + "fl2dx3lEb5-5QehgjXmRNp3gVTqM3sIMoXhw9wx51Hs=": "390005000000", + "fl90zT5ZDF-AJZjqxuwHWmlOFwhHyhURI5iNEgrwvUU=": "384615000000", + "flV15y49bvO0bzzdOlL0l0bq86sP9OSfhF8Rwb58Stc=": "465485000000", + "flrcKp5mVN3d92cKwLQ6Ufxg3KUWnYsnnRuzJmZSKxw=": "385507000000", + "flyehCTVaOK36BqjLwIn1yXJNUfLvvQeku0TGS7d6cE=": "8230509000000", + "flzIDh3N-j4EOO_92ho0p7nmCF5HTgC3CyDR_LflpzY=": "454545000000", + "fm3TfR9cXP_YchK5FozzKytfcD356nOAfMmcxi7UzMs=": "961538000000", + "fnaosx4Qp-2GLz35hR7QhVpqNwpLUmF-k3MMXt189yI=": "4826419000000", + "foR6X0cZQdS7ghfPj88RnABK2VJ_6ZMpKDdIkQQhrRs=": "424269000000", + "foU8guNxaidZNdkybuvY28sVYthKEj5XSab4uuo9tME=": "773053000000", + "fojzDYbmTxiJM4h-M1xumeaYAi5rFltq4cBJbQWu_8g=": "2543962000000", + "fpPBrAwmaDU-7qmmku7yBW46KS1gDKuot3F-cXzxDNg=": "3750129000000", + "fpakXa3ca6F0lIOtpbUTC6gsz2q-BrOvZKw6E7jgeX4=": "450244000000", + "fppJIkOp7Fhde5AWuYTacFO49Z6cqlMK6eOAVdIJGQ4=": "451255000000", + "fpqzWyzwv6O1PVSicv-d6B4a4tiFKcETObCxS3x-Dmc=": "20833333000000", + "fptBWhCh4ddpQ7YHAK4soD5B9viWQw_2CTLL6882-Ss=": "1154247000000", + "fq9a6M0ki1jCxxgtwA4QHH-Qm985IGa24AyX70mstaw=": "909132000000", + "fqSi2YjIrW-vnRR7c1lNfiZOmKm1_lLoAvBkTM4Oglo=": "755466000000", + "fqiVtaNSn2J6But4m7zOdEOwL1YuNtBE2MgKaurHAYA=": "384734000000", + "fqmgWL7UeBFkGjRy6taf12xaA_lXP40Z44DMog9pVVg=": "388753000000", + "fqtZkf70f9bSTRvMBmK5df21g8d230V7gtAgqN-TRJI=": "425284000000", + "fr0K6LVx8901WWegtYf4Jlv4B3RTSdvcXgFsEzx14xM=": "384489000000", + "frOuBBQ-RhSwE-Vw7CuHldJHncR86yZUD5yxQXEqxLU=": "2471600000000", + "frUIXiHGMoZynK5pAw47ftyEGH2LkMlD0e_96UUr__s=": "1927533000000", + "frZbkFaA8AItHkPHqu7heAtQznfDojYN2k-MoCaNJhk=": "382394000000", + "frkd_7aOCG1-sLEacZDzx2AwyMrybyuh22FKkPe36Gs=": "769230000000", + "frmKEYeGW6nT9vA-gTwwjmaAmnhthb18lIqLjDrIrcU=": "1727686000000", + "frxxRvbILF8E4t74OSSSch8SqCNHoj1JoUSbNfkMDt0=": "384615000000", + "fsQxbOqOGufUsB-9rF_vBO95llFBBz_LVVlNkwG-UZ8=": "899480000000", + "ft7v1yQIvg3_1R3O4W85jmE4EveYdZkdQyROLJW--R8=": "499226000000", + "ftHjF0Mr5osEXspoAwJdPwzhYi07aG_YHGUqQzQI5ug=": "1940207000000", + "fu2S36x5yix-It92PBEiRzt6f9WvJf-kze-dMxKtzQE=": "456404000000", + "fuVfWkZbTAkhM3ZO0dgRzqZowVx3d-cGYyp5syD8gfA=": "1999999000000", + "fugmdzaqNCkKuPOrPV4cvpD265K8GMYjf2Uge79c3mI=": "425039000000", + "fuoTr4G_G9QThTwD-iWKn5nTvb3K68IaSpjxrqvpmD0=": "3108168000000", + "fuqOek4DD7-AaKVcA4NSRxCec9xtAQ78pCzbuQpLVjI=": "2083333000000", + "fvG_WIV8rdd0h96bH2LLil0G__p2VQl6qV7DfRqrVYY=": "358811000000", + "fvNF85HoWUY1OJeak9UpIQVXRBTJyJYW7gwyk697Meo=": "391257000000", + "fvtb1vTAW4hS4OOYRZAoNvvMVii0Ur-GARbzy0zhINg=": "453867000000", + "fw1aHDyXXHbdeeS9vgiGdvVoCIXGiiN-cn_ERjxFBFc=": "437499000000", + "fwGWiVIPgO5z2qyus7wyAc72qRiB-0gB6GzQ_2fQ6no=": "2310726000000", + "fwIVMZz04axGlQC7ecLhIhyVWzUmA44vmhQxx6MJk8A=": "422561000000", + "fx-MAtfSSQUAMK92nHXTZLx9kKQGcZMaTn-3O0Zk564=": "378319000000", + "fxEiLBrP3j3ytX4Y6DrydWQSvNxYDRNijajkJq6NWl0=": "1526806000000", + "fxHW4mF2JbR0tSU6qYJ6JxVu0LFNFt_GT0KgqLu9v-0=": "546103000000", + "fyD2RWDnIeZ2l6RZFqNsplf0_IeQBAWfFMIec1wQIeY=": "934718000000", + "fyHpaakteySn-9PMspHaVxmTpCHkC0AX2IL_STbKAMc=": "378090000000", + "fyPhtAB0mdxosGUF3v_RteD5J6vhVNlKNcopSSAPE_Y=": "454545000000", + "fyQxJtJo1NwrusnDIP-yTQBUSX350wPfrMJaK_tE-ok=": "417635000000", + "fzHN3ZQNOQ2EKnsHhabQIePu1a3qiiqe1mpombd9pSI=": "638477000000", + "g-IKojY8NVTbOvLdUgVlXOygQf8cay5rYs7WYowC7LU=": "377706000000", + "g-Mu4TU4r89mfAdWlVrLJgWnLPgSgTo6oLisnmxlMDA=": "1727932000000", + "g-jl9J-hprN_EUO6gW7BF4yBdkVT9ltXI7nDaezTAiY=": "492890000000", + "g-nMVOMafoDkgRmX11hzFuAbcxOBsnbGgvTR3eaksXY=": "452482000000", + "g0zRPrCtV0Fnk_z1HRz93aI-0ohgcYnqDYkOqhPkocI=": "465802000000", + "g0zl2az4docciIoiwzACu1V7gyL5CwzeksKngh5aLqk=": "1153846000000", + "g1EDybulTKJzNaJJD1Q-Kh6c4FCt3BC05ucEK_IbuXw=": "1843376000000", + "g1VxPqhibUd3ufaIDIKBwZqNGqBTdpZfeTWH252Xrqs=": "394336000000", + "g1q40yY_xRSaVB9TvKNCW04If45i9lZjHVK-xMSmhik=": "384615000000", + "g1rKHg6-6_ePe7qBn6KA5M2moLSXXeCYwhUKIYNSn5Y=": "3840937000000", + "g1rlgXHMRx2AsP9Ztnoza-PSx0CUPPjxd6BkisTePzk=": "396483000000", + "g227Ohgf2qjZBlU7-l1IpSRuAZ-jR-ArcQgIATy7h8I=": "1402573000000", + "g2akTiGxhhciyu9rQtefn5q9oElx7gzqwWlJCkTVbdU=": "3999999000000", + "g2eArKWYc5dsbTpXUMKc9TYJoxnldBZxP-UJc-tJP9E=": "1156527000000", + "g2sY9LaP_ciI1iY8NYblpSZJB5bOL2Yz5HUkZ1UsK7s=": "380301000000", + "g3DB6_pfCB-JhczslOMx2bWjZWRIhzNybUCQCRwGZgs=": "384615000000", + "g3L8SKW17wNbv6saTU22sgLqWeDITziFePl2H-Wn0ng=": "1408464000000", + "g3mbvEpgYBYMz4-62dKCtgkb6cGH65cFXCm6-cWB9RY=": "498450000000", + "g3txya2gja18XkUfWwPoJA2BS98j0yJYT7do78RT9-k=": "385506000000", + "g43qWBa7FlG83RUZ-Csd4ERArFw99RJDkjPMoyVhWb0=": "1982897000000", + "g4N3_9ERSmYSF8uE5r0SLrx5v3Pxh1WV9fDa_D_cmv4=": "385134000000", + "g4T11j0B5eRVljoSLitrngxT5xhunIK3sv6hEsJvpL4=": "2083333000000", + "g4i5i4cuMbm2JCaDf2h-txaOWBMKNi_pRgBFjDGGI20=": "3191136000000", + "g5HLmSTiiCkEz8tj-tqaiecrVZpfRlhzd5xIgO4moJY=": "763607000000", + "g5Hcm6BSTfRA87_6V7ehb1ne1n9qEyR_ssH74-5M8No=": "449697000000", + "g5LNofzi-6RTN_6rMBmX0MK9UmH4OD4CM3OXV7DcC_g=": "469739000000", + "g5UYweychQyI3b679JE1pcAEJBOP6r5wQ-zhxUelJGE=": "459695000000", + "g5_HTk39lsBQQvDuViXIT8NQHf1L7omS5mcaZzKzn7U=": "389258000000", + "g63YaMIkAuDmml0Mp8ooW-KvxwoRpUyzbBGnLU-ASbY=": "773477000000", + "g6HlF6kZSTTHZKf-E2YNO-oIFM1_6elkMrWCxxW1s2M=": "12035017000000", + "g6jvMprltF4W9BrLVMt94r_N05WtMF9wFajCPNtkSYI=": "404829000000", + "g8PuJptf6nKrix8KsUXdDeTjsaK7aGikxnV09yZWfQk=": "384615000000", + "g9NOsWB8PLgBjb7nBnLl9VKd4TWNOk3EvrC0bCiISNo=": "455600000000", + "g9w88U4YFh6vCUCyumSu5GofT6rHIZ567BD391GxvTY=": "7411094000000", + "gAMWxkaALEqMQw0SMcm13LXLdzsNf_UCK9XIBOejLq0=": "1946962000000", + "gB24yrfm_44O7nj2D0xiRsIgGglLPbStSnVEmwnOMEs=": "460976000000", + "gBOWz8K3W2P872HZzjD7HdWRocjbrzN0u3sLYmJuI_U=": "997197000000", + "gBPyrWTquOQJl3QIHq2WRVfL2ztLWIW5LK2XTVX1tpk=": "3962571000000", + "gBWAjnUc34rDQ_CdJaUvlmT2DPk3lqcnHV7fYwXx0HA=": "381802000000", + "gBmH4y-q3BYs8Sz0PWx4-XGNRB2xQlsS9yfxvbaLzZo=": "415384000000", + "gCcDLoKdpJHd78rOEuAmGVwIvY1ZTwgHxtw-GCU4lCw=": "994230000000", + "gCsfCKb3ddyW4lgQIUQaeUTKbuPtBDumWn42iIL3Zxk=": "1669362000000", + "gDdl8BwpAphMAb8YIpW-WPMjwOrXSwyTVP6k9rlqKZ8=": "2319943000000", + "gDjXue8vTKiNumUHqOrHttsS8oBarmUx8wA0-fZLUDU=": "384615000000", + "gDziMTJOmLMSLpS2ch4iUrZhb7-Fu59DWhEKae_Qt7s=": "4228231000000", + "gF06YmaHjoVHzdnttmiaANC_C4p25crDfuXE0TgApws=": "3084192000000", + "gF2OnQDFjd8JqiGMWwQDAFA1QW_IxnZsx-qiQgrWs7g=": "384717000000", + "gFUimjSlMV4fyeINgR5HQwHz3ts_QpiRDug3VSRLfQU=": "457943000000", + "gFbKPWrEgWsIP32G6qPli5H_nL47ydXEsco8eZ99l3M=": "396483000000", + "gFhqq8uA2UvaRaQrhvPX12UZidTlP6FYpFyIh29XfR8=": "1152811000000", + "gFkQZujbsTZRbQneCQ4JtB9Kml-zfeI-vvVT-s3bsXA=": "384625000000", + "gGQavdgK_0N4Wd2WY7HpQtpL3Wq087MnlQAiQikAzG0=": "4995144000000", + "gGhoIvJknlYTM3kkfePoIH3eiWwb1oufol4-PNJCJiU=": "1263920000000", + "gGlazXsCdub4o3DThSQXIVSuPsI5bAlB9Flt8JFMuME=": "1138584000000", + "gGuHEoaoCaA4JZgEDNUeVA8Nn1xWQbyvbTIGm371pA0=": "452112000000", + "gHE8GEIwoH4_dWqUfM6Ve6-DB9m1bvDteDXl1Tv-Bl8=": "384615000000", + "gI1Ui96vVBtAHmDhNh9z1rVKypYbphL2C_GwNkXfCjo=": "526112000000", + "gI5g6u1gn5H41-QkQh6dD1VYeGT0kBojEM5xk3mxQRE=": "384615000000", + "gI5yNwnF3NswexgffgYIfBY5iy7o55ngeesTGxBykBE=": "1156515000000", + "gIIXSgCPK_jfvwcAbH93XFI60p34ejRjes6_K5iAL2M=": "601290000000", + "gILJ3kDEbzzrHeXZQpnWFuEpmXVtwXC4Sb9l1VSBesg=": "1249999000000", + "gITqV7JV9jrBsrb_9cS3HSCPFgx5N8CXhcO9YXW4nzU=": "456351000000", + "gIZLWWC8kUbyZMdaW9MtCzp0AhJztS87suq27ixmdHc=": "985015000000", + "gIb6Fd_7qD8Wz_c7_znts30QsTlfBtok09xKXTtfOJM=": "383598000000", + "gIz5E99M31_PwaamdnzaLFYRn7C8PkKXsYpEHxSI0ho=": "1249999000000", + "gIz_Sma4MdcBzKLKb2NsmzqNMyYhyBZrejAut4TPn9Q=": "18995908000000", + "gJ-2W-uR5rZB8zcfb1HgFeSyOw9YR6yFrHXZOYyevxA=": "1235184000000", + "gJ1hgjwuVPAECjllPAptZHbKY86uRUnGhOLbDRCp_L4=": "384852000000", + "gJE8eN1xR1NTj_3-yVEnXmT14RYFi-LKKasTa4TQxTg=": "21140751000000", + "gJzmUXk6GfvsoMFpgScnhY4BauBE7Et5ps3P3xiqg8I=": "2774998000000", + "gK-g1Bt5Qp6TTndzKXYgdOpvFUVlUyVKgQy2VkPXYnY=": "457604000000", + "gK7w_QoUfCX4sgnT-YKppWxuR-DhPfGG2caccEjDcnc=": "388807000000", + "gKkTRyACiTj3_KWffAAbRqgr-qLBg_4h2rtBJNj820g=": "1887367000000", + "gKx6LMbOuQAkM_8wVxmx6uM0wZlNBt7q2BCGZfJzrWw=": "385209000000", + "gKxoSe-GyugRs6wU8UkBKd8ZOvKoyTTVzKCK4kkLJYc=": "385528000000", + "gL5MCNarlh2RszZu5yYz_5lHM0EAk03m5fxGDh5Dl4E=": "396485000000", + "gL8ADvdTbfk1l3nAUk6HhFWoN4X7PMqT7ZbqmIzU_Ns=": "384615000000", + "gLsVMIawmKKm2X5rsHBu2Je-iu59N0_rLmOXShCTEYo=": "2083333000000", + "gMQBuxjtF12HyphbRu4eb3gI5FhTtmFahy9HrbbZdzU=": "10416666000000", + "gMh17WO8FZ69h95Ex4A3w_SGHLS99MbKEN9HEs9w8pg=": "1923076000000", + "gN15EsuQFG4tf_9K-M_h93Q6Izfr2B8TY3udgtsS3io=": "769230000000", + "gN5536v95HG2YtKR54c86EtEZjER9W6O1gh4mQM8ZdY=": "515470000000", + "gN6oY_KUEiqibrsHzk7iCxOf4b-X9tJG1iaAma5GQI8=": "668861000000", + "gNNH7lsE4yHZptrmnMudCtQBdWvRutlwBodUH87JrLA=": "7685073000000", + "gN_yJ2eS6g7FogjbRYQiynb22tY_soXqhRfSzmsKuWM=": "392748000000", + "gNcYjNqq2GKJmCH9xXc96BIGwZoefQHINu_J3VtbrHc=": "413869000000", + "gO76rfNL48V3UEDzYt1-gFK3Gt8QDCJPPuSZIMK1JI8=": "512851000000", + "gOQscPdT4S3fHQV4animRUShT2X702MPZkWaekhHexQ=": "1937083000000", + "gO_n7no5JRVVQsAePeZGvXlEnLQEMCe2YYYxw9IOI8k=": "1681818000000", + "gPIql7yjAoy36JUDBFa6avUQWQZBl1K77jgwtR6QCDI=": "413274000000", + "gPJZ5jQ_7lzuJ3wiXvHFj909AGl1WjBY3lcqj-Dz-yM=": "753919000000", + "gPSiwaCc74YZWnpfAtL2MLlsC1bCjeEbhriW6NQ5UvQ=": "576907000000", + "gP_HpMEY8Vjh-xigJSYgeA9Rn2D-uLBnEW6HZeauxlg=": "523764000000", + "gPdIsZ0D8DxdS2qM7tCycF94uGYDaSFL5sKaSMGY9wY=": "1233257000000", + "gPqH7Urw0bktkzb8wYgMJo7NUXnPAGG9dy7NJB5YnFY=": "424045000000", + "gPu88Hd-XoP613X1At2wuX5iRDYtxTbByu-iyEYP6R4=": "1252898000000", + "gPwsA2ZFT3nzCG3rQK4mKBw0FDG_Fq2DztRU_yrQRPA=": "1921073000000", + "gQ0mdOVvTme2dfQCzzUeFhbkmb5Pl0ysLGxryZz6wFo=": "469310000000", + "gQ2ujfWcXrJOWJ5Rh5cr6dBBZP2WhojA8ISN1tbX9YI=": "793877000000", + "gQ8IGO1iqmjNiLioz7lGRyu5orhgv6A_7rZS23UoV0w=": "452120000000", + "gQ_NlxYSJKSR-4F7VfepfeMs4ZMJiN1oMCQBEK4l7Gk=": "2088163000000", + "gQcuFr2YgPr50xe76DWRBOqI_mJcBFSogBhzo1siL60=": "499999000000", + "gRuej4RbZJ1MJl3UUAUGjbgcAnNxV1VbuPah8RDHUzw=": "417280000000", + "gRv78joiOEvc6uFubsL_eDTda-zwsnbAPPDjYxEwthc=": "2499999000000", + "gS9X1GtszSWLawioeT1sCfTTRxosulvWnEXFO401l-E=": "1154052000000", + "gSAE6JV0muifNptQ-eBLV8QzY4dA-wLNHKpV6RZf8xg=": "1385142000000", + "gSGxlZxKlKsJEFu1zuxYZoIvUbgJhamNf5gE8UvsTjc=": "355133000000", + "gSYf2V8ZoBWz3INB86u6LYXNR2X78P-yfvMgQGEWnzM=": "1888241000000", + "gSqVlJSfvp7Kptds_OJigqWTPVsGIV7sp86cHGb-92w=": "2278000000000", + "gSzJ9fpgHStsMsGH4MH1JyIvVFiqJPbCWkk2YmKPMy8=": "390880000000", + "gTqcBEyX7wNzYTsLGT3eNnYlLvKQajvJZ9E9JXA-qQ4=": "753674000000", + "gUK7NVUvZvoCMqq2dXHGtE-nBmyiaskTty52wCY0A-U=": "448728000000", + "gUU_K1g6yyxbb7ipSAJ4Ep6pxpQnZuxwV9583Bc9qOM=": "384615000000", + "gUgpYcvx6VWuxGAP4U0bbg_lPPwQnBBu0-hTsVSNBAw=": "385155000000", + "gUhf4iRvLpD3oPovQXBuVJ0OGbFAa9BVx3vm2DHsCtU=": "391797000000", + "gUj2A6LcosDiYoPbnd8k7f1LapRBgdCwoU36W9ZatKQ=": "1514898000000", + "gVd_GLIc3zn52QLEIijZGjyUC6RbggdX40Jl9FriBCw=": "468609000000", + "gWmVLRwRmEkTX8I6rTk3qMO_FXfOwJVxxw3vkZfqWs4=": "1128745000000", + "gXpFm-ijnkEfE3e4r72vQcpfJ9fPx5pXo6NI6mFwnLs=": "55777482000000", + "gXyA5Y4e3WAYh1E4Bmct_CCILAoYioE7g2swizCfWnk=": "462146000000", + "gZIfcRECJk0dPuypUA_Fnez_A4ju1fn5rFIdxFpxk8g=": "405357000000", + "gZrMOo5LP8d5ID-oYKhUHUqL3dvHzQzphxEydIsURUc=": "385506000000", + "gZtvgi2DPDz_ygujYFJIxM11ORFwrBJ6-AEU3AJmJ60=": "4507424000000", + "g_KvJR3n3kgXjVnJGr-_tRf13kFISa_w8es0U_MZ4UQ=": "385506000000", + "g_arpp3mp-vQ5zx1itJRzRiWlQubTJv_xtnpfcHCclc=": "384615000000", + "g_bjfAZABWIKnDEkfK64bQ6OfpexJpzNSHZTLui9-3U=": "488247000000", + "g_cNTZRRWQBcR6wsamMgtBK9iTz_6pzGlT9hx_oHcWM=": "385507000000", + "g_kBP_FHAzZdluWYuPDOKW1ZMHh-YenULNuT7--nyxc=": "1666666000000", + "g_uZbAziLPmo2MnacpW0mSo2_-bpuiAJDPz6Ji-6eyw=": "453695000000", + "gaJGJDXurPKxzkKXFZmDWoA2uxza4kssFRO0B5tJZdM=": "384615000000", + "gai-Q5LLl7LXjDrQJ12QQcaa3O7jMqdMdPeIn_TdP-4=": "448891000000", + "gb1mBVOgA4gfnNPr6BrC3eCrwrNoCCYulU9Pqx6aH-I=": "845123000000", + "gb9gBWw4C3LVo3KkyXSbaQ3wp_u9ZMXWI9La3peq6h8=": "5097317000000", + "gbDE_qQNkfaDKIw1pcFBF0omCAOc3NxxRqrAL2VBUj8=": "3855061000000", + "gbcAQNptoRPE8afiA5B4R1-H8PEa_hk58ZMFd-IiA_k=": "452098000000", + "gbdRNpoqGfL1R093P42PSxfC3sGwpPIS2vMirggTV0Y=": "384615000000", + "gcL2zzwpKg9tpBDHO3V2QgdkhjD40igJEbirK34SG9M=": "767243000000", + "gcgOw1tgxpRuUS_vVifhOPb-D4utqe-j3b_GajpGfIs=": "18676081000000", + "gd9lpt86Y_oCdaLOD162TcGAfzr6qEqPzLn66qMSisI=": "411085000000", + "gdKH8xKxZ9QsTgzi0BNznHC7N6pNIXPvKoZ2utxWqBM=": "1923723000000", + "gdL4khbRV2za12DIGIru9tINoc26qey0njZP_0A2vl8=": "385510000000", + "gdtvxxFZts-sh3MJXGWICsrUxttwiSxTA0LmDZgRAO4=": "390975000000", + "geF_C7UPYy4wSgpR5uh3lcSJhEh2fL-vZXi4g8Z8sTY=": "636308000000", + "gegr_fa5V_TYHc0LlSWcTG-OFht9kbYfd1eYgyHIa4I=": "391618000000", + "gf06RD7V3nAQZoHaYQoit9euzaPCzYunk-Ec9x2YqcI=": "11445415000000", + "gfTfrDD4m5obXFoEV0CxmtF_Z1Bj1JkALw_BKhJPavU=": "1625454000000", + "gfbHYo8H38EzB8_IFyQ36tQXz5FR5vo3FJY8v3puWJY=": "458299000000", + "gfjnoBGodymFRO3vqWV_T0T-XplABOUkYwdqSaaKKfE=": "413869000000", + "gg7klEytq3cD3fZLcQSm_kfBqkJmD05wAfB-jgJfhDs=": "3900434000000", + "gg8nDoCToNr80cT9bWo94oltJs-l7_G0GEQo8NSLqac=": "3846153000000", + "ggBJIiJ-kHQS_iqhqdB0nKNoSa2oC-MNB-RvbB0bqaw=": "1248895000000", + "ggezZiG9NXEkrm09Qgum7TwCmwURQSgZ-YngZH6cfgE=": "781361000000", + "ghqcQJD7MhCy04wQrzKG3fQW0wUr8LfT2fSMaS92k3E=": "3275559000000", + "giN1TRfWPrndDgn6P62F1XlKeJK9GyqkMFLF5veS2PI=": "452324000000", + "giVzUqqsh8xogJNG266T83BA9IqGUkjVTE3TaTCY9cU=": "459906000000", + "giYc14yzEFDIywVBlHWM_3qH0adchyVrAMbr3SPGv9U=": "909665000000", + "gj2IO9UwZEtNIl4EEjErov5rB5f9GLg0usihanYOeao=": "380858000000", + "gjQBStOUc4KAgC3vNuBuTkPNyyKJNIcfrlxHxD92SY0=": "1398457000000", + "gjeHGpJ8skduupXdpSfzqZr3icDRb29of7s11QNfn9Y=": "1156527000000", + "gjrfuT_qcCWSuhrZ35nLrRt_p6mQiebfi12t9_Y70E4=": "876495000000", + "gkAFkuhtGnkd-sV-Li6ti1FthAWYmpwcfk03e9fbihE=": "1536823000000", + "gkCKQGj0bfDzVGz6z4YRRkrzbuf2ktbycBzeIoGInvU=": "455600000000", + "gkFYZlQKrcggyt7ENmUQVZGCTluvx-JoB-LZvDOdvFM=": "394530000000", + "gkNcIdNUzcZ_2EpzvVNT7hm6ZVMRc-I6rJvqRZTzpGs=": "455209000000", + "gkP7s-l9_jl1Sz6Ozb-075JvEYK0lGuFMb7LFTV483s=": "411085000000", + "gkh7wnB1PS-CVxIKDQqWWCceDbp_k5khDHL8h70xdmA=": "420448000000", + "gl23JN9wIwQnVRhJ8q8taztCYO2hZQhReA8EjzFViHE=": "386791000000", + "glInNff1qUQnR1C-mCdpddbQvzzPSZf1kNO41r4yQ7s=": "2311393000000", + "glT7snSYHd144bqC4TZNX98ZqrGqpeQveKrFo0ewAtk=": "7677019000000", + "glV2oQzyixqAixHSr29-KCd6f9FOAPhDDYBlRBqOW1U=": "4001626000000", + "glX27zSLkKgGMp0au7rfZKkozxxfov-0XuYFWcy9a6I=": "1156518000000", + "gli4D7OgHyF_i6rkcbXXm50541tj4LAkUmuQ1Ik9rdA=": "390005000000", + "gljY9ZKIaI130-tylD3hOP_DddO4mXd3iMFEv0ou_uI=": "1666666000000", + "gm2xBkipPkm1ZLi9DaceeBjHzPLRUKNRlMymesyouAo=": "771796000000", + "gmBjlQy8L_oUyc8G5IP7R_vhyRCqYQdroTopR99U3YA=": "3846153000000", + "gmQYP4h2ZeUJRb-b4Hu4omTjlRo-Jey-MJye3ISDRXU=": "655115000000", + "gmzxV4O9gW07Kf8QNE1ba-yALfuhlxcDERXR-TuUdfQ=": "405357000000", + "gn85IYIManIBFh4B3evTEuwnt1seu6jQ95xsz6tcGDM=": "421689000000", + "gn8kk5igGSHHjGNp36UUpBnafK6010ridZ_JRfG1M8E=": "4092499000000", + "gnGvxAA5jjoFv0xSBFIwifJym5reGHlKYKMMfboFaMo=": "457429000000", + "gnT9rSEr1B6AyUrR71YpbKgDK2k9gezU_KQX9qfSBPE=": "378257000000", + "gnVMhBsK9fBqhGsEvnyxFAHhxh3pE8ddw1FebLZuuCM=": "379344000000", + "gnoZk2b0XtwfByLfysEhwvt_N80LmWAikiGHw_wVS8Y=": "385506000000", + "gns3g57CI__9QVR0YSZ9aJ9MTq1pA1Y0B86qQzkfIe4=": "1166169000000", + "gny0geF8DvaF59sSEALWmHn5dHpjuGyMuqDbMYTCd7Q=": "768353000000", + "go1B32DkYUSB4DGQRhjHJOz7zJSUByhxjY4P74WJZvo=": "382394000000", + "go3fo8AzZWGZrtOm616XSJ_uzVcQTpxj02L3U69YC8Y=": "2291892000000", + "go4pVdfETpIxS3WNdmN8ZURUY2F-aagKl4oiHJR6aK0=": "2902912000000", + "goR2iDwQ_Rq19zA4zLGjQKqbDb4Vne6i8dc7WCYZXQ4=": "462146000000", + "gowx21WBrjwq6JRVjvbQBhuOk3sk8C6LrvAf86zTGmE=": "652140000000", + "gpAaXaXzvrQs_FlXqH6Xh9EcSocPzQNpQfv6HvUl_RU=": "2500079000000", + "gpcDU2lT0x8kaVlX4XHekUCppaXhCL6RNDfJj7iyPfg=": "4649536000000", + "gpeP40Yk7tO1gZVPMoo7CJ3lQsG6fujxLG5BkON3eu4=": "2662571000000", + "gpnohvdTl8PS344Z3SKuPI02oAWdEEZEX0Ehu3JU_pc=": "501273000000", + "gptm8I2xL2V15E4UAeZmq_eivjQIHwz32Hw0oSU2bDU=": "401949000000", + "gqI6SzPJZWN9oEwtnQ5LjAYvJqG6YAde34_GfSehg8Y=": "459858000000", + "gqaga9JB4Xdfxoc0h3vyyl1Yg_n_FB9q6pznDbgT7Ww=": "1249999000000", + "grYV7v2HDP_wxYpEf3r6_8IFCA_7AULet5TpLefM60M=": "1388590000000", + "gsE4lOyuGmR62n_4MWxaFRryuyqVcBYpF13uzp42w7Q=": "384615000000", + "gsuBzRj8JVjeDBsLYGP8agp8j-g2JKiN4s_JwRGqVxI=": "899364000000", + "gszZ6Tg5E1QRucuXkBKYkTTuGLlmPAG1RDFNZFGiUZI=": "385103000000", + "gszvjfboSBy0cBtuyrjIivWeLW0Y-ftT64l80fl1eLc=": "763848000000", + "guLCHQu0ztH2djeG2XIJp0MpQjYoZMa5X-45aYBncfM=": "385510000000", + "gul73ECrPneqJLbRBnaU6I8rsgxCFEjpSzppAk3B-WM=": "379260000000", + "guqVGyJ1paOl_JHtt82WR8WLJjfbl692vJGoCWOMfgA=": "455695000000", + "gv-mtRQQuFl5NsxFlNbGmNJvrr3oad-xksH3KwRKjNs=": "384615000000", + "gv2meQM_VESeNtR3Hm7UCU8P8GuoAFT0LFKO1TXWdxg=": "1928235000000", + "gv4BFVrHXUxR2z9wlodWOj-Q753ZJ5L5XxhQAH5P4ik=": "898058000000", + "gv5BSnBTLJkWgmggiKIIrk6Z5BcHp4hjX6kYMaWN0Dc=": "1927530000000", + "gv6iCJ0MqjKOgYej3dpSJGK7Q12HneGqNkkZutbj4yg=": "497477000000", + "gvCwyQAQyWzmzLMxoLH9ESPuZfPxrKLk5o_Oc65Z2Zc=": "10353080000000", + "gvEaRqioR7l6ZibmetII3VBRmiLMYDBe0mi4awgbctc=": "1153813000000", + "gvrtDcRU-kdJ4H1BdrnZ2okgoT3EOw7Hxnh0BL4oeHw=": "4327157000000", + "gxLYYI0llgAgZxdGZcn9WlW5bT5aIf-GJ2n0gnTBGkU=": "4176337000000", + "gxLzvmydBhsqLwKOAI51TAZoenv3DdEDDnj9a3b_19k=": "447495000000", + "gxWBNO2qcFazNQsUtPL-iWFVvZtPj8S3OBbUmaNyi0M=": "449326000000", + "gxghDTwomyKY6MXQuXG9_ztnB8eI3pnEeo6SOyPWg8M=": "382394000000", + "gy4B4qZavN01qruqElckg99qq2YP2F_O1Ayos5Z9gkg=": "1874999000000", + "gyJEjoyqOBkuMbtQGo69Rx0FTUC2fsnT-S2o5r94TU8=": "3090467000000", + "gyuwvw5IfU9EBbxb0szf7H3L1ryI5HmNVS-0Hs7TzGU=": "385507000000", + "gzITQqfeyyX7f0BvwtKH5GJRDYyacU585tO9YpL0twU=": "961443000000", + "gzdEMz1HhgcxK2j1tSo-XI1k8WOuPu17GlFK29eLCDU=": "450416000000", + "gzrrssrUMJvsfFwtTBKH_FmKKmWpk_OkaFu1vyOznpo=": "1823621000000", + "gzu5tB4rvG-FuxRmefz_JULzhiFNjHzoNbQT2pNv9G0=": "387829000000", + "h-7--ZnQhnGP4h_Hdzrt25xGtn6Ye-0K61pocbONRkM=": "783595000000", + "h-AhXX_HtngnVckr1nwXpV-zB3J1rdMUfz8j24oW_Fs=": "381802000000", + "h-buGcUoZwg4g8D-1SfEqd82O3IS_x2tlTXono-D6Vs=": "455337000000", + "h-xwl0yg4Aq8zrSumKi_sZ4JhXlpW8gKTwtj-h7vgq4=": "1233257000000", + "h0-pXxaKNCbq0tjiri7bFJ1nR9DCVuYD49Bj_rpo5Z8=": "4285609000000", + "h04KcVJLvLkkD6axU3Ym265eWtrM_1Om0be9wfny5Ow=": "384615000000", + "h0NMLKH3vq8VPuRX1QIwe4eah__X8nAZH8xPjy8HZOg=": "411085000000", + "h0sCkj7iptAgm3BE-F3APB1nYaaRe9L5WTJh0q6VMuo=": "2692307000000", + "h1LB-HSvXnXT067nvno9PH6QPn3Hd8qSEr9xhw9h6G8=": "406450000000", + "h1f6Xt0iha7zsigHpPPqC2czOiqSx00TspqRVSussQ8=": "684819000000", + "h1w2ESaVVEHmaVgCatlNtDrtt0vPIHIZMy1L7Kd4YQ4=": "848090000000", + "h2MVm4YAyqqFskfawflcrKlR7eeUodJ27TL1shuidPk=": "416666000000", + "h2cw3PYlNCsDlkbrfSmJyERQQ74OTahg3F-ZhxON_mc=": "446543000000", + "h2mtd6Yuaq3uzvc5sFvZ2LCNB8m6Vvhr7Ek_3HKDdHo=": "4782670000000", + "h3Iakb-JDSHU2khGP1ntYtAoa3NeE5BCp7nuaxts7us=": "1215684000000", + "h4JJUm299De0esMwDVZjg-7VVpKU9dJgM2YEmmn9CJE=": "909090000000", + "h4btlBuxFMj1XOF3YsI_CPSE8sX_stunGd7yBPORikA=": "2134438000000", + "h4iLxkaPnb7qhAQMZikgjAqj4oOMfxR5Imi7NHJgLoQ=": "460037000000", + "h4vM8q-pN_cTarkGOP8QLXXOf8oGI4KcA6hPIdK0Nio=": "416741000000", + "h5XTnID5k6z8NaKi9yifHKdaOCo5MOUJPxD1qG75oo4=": "453986000000", + "h5dNDuoSlIJBEwVSEPEa_ZY7A-rCA5HQszro_T1w_sU=": "384615000000", + "h5pLm9Bg10f0bNSCTbkNjoFFKi0Ytc7oEdbtQu7QxFs=": "451219000000", + "h5xOAzKqNEBqIO0o4XrlSkplP33bcij6w4P0Q2h1YgI=": "1411928000000", + "h62tGWh0YWwR-uAMCQdfGtt0JIrx6rwYUIc--oiXrq8=": "385507000000", + "h66EDP5pX0O4KKrqggjaeiS_2WrKRisDQADS_qMVt0w=": "416666000000", + "h6gF4lWCqnZzbLHuU0oI3CuD33wAlgChTz0ZvFzbwaM=": "431068000000", + "h6nu8cLVvNvPrENI19HYKMoNiRSMW6yezMBc9pUO5xQ=": "1153846000000", + "h75qhUaDN7-DJGa6xJBiv3PjMphyfFrUUvZrd7WqvJk=": "3226008000000", + "h7Xou4oWLQcNSWnohFE8ASXBOLTCYn6HxqcD9Tt4Qic=": "382251000000", + "h7XvlEE-fB67JMXVoCxeiynmtE8szol0hBN2d9WeNns=": "4933599000000", + "h7Ys1csTYuPSQuuYj-meWmq1oi1ZOnOobHpRor8wj2U=": "500674000000", + "h7eIp5pXszqSoRu6mEV4UJ22irHrtRRA-nXKg_bTcD8=": "408223000000", + "h7eVr8jcg-QmV7KHNxo46vSEQQ2ckfDsDlTRhuBtjho=": "384615000000", + "h7offVpF9lS_f3B8A3mUEc2VDH4r5aEgmKcuo6dobOQ=": "1926725000000", + "h8PzZ22-HcT0PlWV__LGydAqJUE9QSMz6vEUzLG8LxQ=": "384006000000", + "h8Sffwm1gpSuxfBTU4ZN2Lyw48dIzRFu8f3ZB5hheOI=": "1388517000000", + "h8di47ZzTuZpAnZ5jSncsU6x5jkH9eB7_UFNWE8gyAM=": "456716000000", + "h8fq99yVgYMge0t74btIGcykekNYnpmnA2J413BNjeI=": "833333000000", + "h8m5uJ4bAONqTmYYIKFjDJvSdiY5pzy2BqvJjRDa94M=": "379736000000", + "h8mlNPGtQOA0Gx2lQaiBEUkmh9k9tDXVX6dpJr2m4Xg=": "4711993000000", + "h8vQUtOrOfUqsCmzy6XLB0BOfzkXv8vVcoYRWpFL1Lw=": "1649378000000", + "h9b-JAIlMojMJ_zj42EPijAQ7dqjtX2zXPO7GbzWnrc=": "377006000000", + "h9cLcuJR9Zdfkm42IEqZtTsW1OPmtwbEpLXRpCGHhO4=": "4017553000000", + "h9sNmVI0hc6mE8ipf9P7roCv9Q_h_XYTIU3XQTyG4uw=": "384749000000", + "hA0Cq2HPKsU_n7ILkuEudIxbukNCuln8lMQKyy1mR6Y=": "946530000000", + "hA5XQpR5WMVsqjpH4RbxbdJ_BA1FfEKIp5FflGp46eY=": "386998000000", + "hAOTUqL52TwgI6J0q5u53P_TJZB7ya5K5-P6VILhhRw=": "549999000000", + "hAed0ZfVa6LklQhqQT5FC2uTC3Rc41taTIORDz7s-y0=": "941460000000", + "hAofcwDb-0M1N0bM0TW3A1C4S1QaRj0rz5GmxCrvRXQ=": "8231377000000", + "hBc89IiHue-loO1-h-8GuOQUmC3ubVkDVh-3Z2z9NeI=": "2065661000000", + "hBg4H8DwGC5m79BspudCiuxzlvBowfpjI_4Vdo9V0Qo=": "451989000000", + "hC-5MRaeCvHVLE3WAp0SRKc3RrlhGj64ZHIqOVVV1X4=": "769230000000", + "hC0vlhmDzr3pSCgvhvH9lFpt-4byVHZ_IiHejfWYw18=": "2058033000000", + "hCXQUZZ6LG20OiKJ2W2Aui4MDq1J1h5mS-684uvFA-4=": "501500000000", + "hD5rh6XrJv4RgG3ZspHuahMa7Ub_oA0leFubh1ShKkE=": "453420000000", + "hE1DdVrfOIzRp8Ofpi1LQyevzN7jNoMKW0kpe3jr4aI=": "1340993000000", + "hE1m3Iayyiodl_Lgk1hUfmbx_HomWajU9lvi8n0aMsU=": "417352000000", + "hE3-4udlPK1r4Rw4P6CrZqk0_cK5jFSrHSW93sFeLmg=": "384615000000", + "hERhSWEWOZdBOjaWrkaRFaiWGpgvpnyPlEMiWKBhRyc=": "488247000000", + "hEqC7e6ExFmjROqrx8srHulcMRECJ6Ha9qAnFPwIojA=": "382412000000", + "hEtD5Ln4fDOI3bActI_SC3EhAQzTF8l85GMi3tBu6bI=": "1156518000000", + "hExzT6w2QmVrO4_xOGYYP-FT3s198pFneHUgRzayJ70=": "817479000000", + "hG1eXYX68zC6wKRNq5--S65TCc0UR1Xi9r3_ay4ntgk=": "5792272000000", + "hGFQl5NapkpyxnjV0YxR752EJFdRfQ3tChtG1yuZ0Bo=": "454586000000", + "hGP9z8yCvk_ukyuZGY-A1wS0hImaqFzs44xg5imUsQ0=": "385507000000", + "hGkdIGFKiCLDUxD5BJ1v0jaSAQTuCH2mjPvsXqPU-uM=": "737739000000", + "hGmggVZ9CA39kOK_z5lHjYOy5RaE-K-G2MpXczPsFVw=": "384615000000", + "hGndAM8NNlieWEIYs44PPWNf61zNnjGHndFFz9aAhaI=": "1053227000000", + "hGpeCYEMlQF2JQcqMsVxrdilD-Kg7jQ77ZTfYn4dj8k=": "384857000000", + "hHdJG0mRnTlCrf6VAo568gbJAbD1KuN-p9N5LC36_I8=": "461858000000", + "hHdOiQmOqGM59Pgp6UWramejni0JgobkU96aT9riRyk=": "384615000000", + "hHz3d6AEmPD9m9d1uSNRtzcgFzApI_iMHPYh7j1mq5k=": "385528000000", + "hIbLokrZk0US53k_-pXdgt4Tuj684I1veY5gGQlQc2I=": "384615000000", + "hJ-oVNj0KQgf7vVDnM08dDqQ6s8Ukd0D-CVbV0qqQpM=": "623076000000", + "hJ0N3_MQBZp4XfUf3OwFO1Bd8LFRdw4FUP2VQDLpCBA=": "381802000000", + "hJWaKduIErDBBc_H1RG6_HUW2cAzGTDnE4kYBEapq_c=": "1558011000000", + "hJrsuyhT-Kly6qyyInhmC7Jj-3OcYG42_fWujDiGqsc=": "826222000000", + "hK15JntOlByT7xGgcWrfiOIJoUpbz8yvrld0p5tePPM=": "1386434000000", + "hKFrT4Uu4AwWfVGPFxOFjnfK0UD6xPBJuWkkecUXS2Y=": "766914000000", + "hKJr8A9VJhdGEriV3B52a-sSp-awZ1JB5vVLp5MDDYU=": "385473000000", + "hKUXkoxIQC1nnwhfwu5ZZXbAZFh4EIwKEvppISPMbao=": "460374000000", + "hKhwKdUXbq_LRl1tXmWzoepOyRS8G3rEoOBbFaZHsLY=": "1364611000000", + "hL1nG-FOgb1-QatUQ4QATaEJDY5iTAVDfg38Q4D01Bg=": "1627705000000", + "hLPwfRMtyO_u_vgnk4iVthxOTQRwE2kvCgULifPIvLE=": "10552980000000", + "hLS9SK7-rZwvRIvc3HcoGA-xOVxfcEkZDkiHVwX6Fd4=": "1940588000000", + "hLdwn1pHGgkjyEorTC9XwVpzf1ai7dBbneGGPCE8D_o=": "4167939000000", + "hLnO8YyDgLkyzeR35o20FJ2RGEmixutS6ms4RjUODNY=": "1377392000000", + "hM-IQRufQNaoMublQR3CkHkLDRX6IivYNxR_BONmZy4=": "41666666000000", + "hMGV13NU93LwWGUQ8kVuTTaF5HKhv64kEmShqAQBUpk=": "407808000000", + "hMQZzBMXAoBmkzv0PeWRpJLK_Q83-hwBaU2DEUm5FuU=": "4221020000000", + "hN3Uh7AAlw4wbXxpDS95ybJpJss-Z5k_4g9tXPfA2nk=": "381767000000", + "hN85Qi1_KRZFB2Q3Fm4451-6_fQvN5F9o6VjjK8rd-I=": "1901426000000", + "hNo3T-3f6uTYob9y_nbqOB97fqc0jM4L1t-wpux8Wg8=": "719127000000", + "hO8jvsP6Q7iKq_SGthmUOtsq4J3P_CtVLXXdXlvINSs=": "408021000000", + "hOatb6zrdNFyKNQ4rjlGAs9c_iWit_IZIrthRQVX9s4=": "578358000000", + "hOszjXwHJnnqry7tdmBInMqPNq-sHTAsiaSI7dtZ7ls=": "390141000000", + "hOtCUT0Fsk5CTyQpz1gR0QnfTnapjwHVfv8m1Dso1sA=": "455879000000", + "hP-iiUTph2KcsLYPqTCMN_cjfSaN1Hdyce0skZsg4hU=": "385155000000", + "hP6nYgOFoR9vnvFFIrH5GYN3RE5M-Av_fbOf53abUD4=": "501234000000", + "hPPmGxzxUb8kJYAUSptbLysvlQYyYa1gT9dwEA240X0=": "385606000000", + "hQChtd6-LzRDJnMVyuD7VsQjEv3e_1H-cz1EIPKOG14=": "2068256000000", + "hQVAXb-HvwtNeMun-ckWTp2cMfQw08I40uppix2IKJI=": "453003000000", + "hR13wXw0f22oullU3ecrgEsgmApqITBFsywlcQAtmwU=": "404011000000", + "hR7BYkSVxHTzsa4ctwJDmS4DXKfTPoYml-NxrVd21H8=": "416666000000", + "hRB0uJYExfs2pIResLCqcrANwWk5SUam2-XRbWoaS2s=": "389411000000", + "hRj1GDnehqB0iOZdchIH3Nf-Ce6rgLmqsBW4HjG4FBM=": "384615000000", + "hRshxhuc_cwFPgLjZ-tgIB4feqO0e2HBkUfbLzhug88=": "384615000000", + "hRya-7p7rh4UUtc0HiG2PWx9iEiJ87SR5UDXMw3hSlw=": "385146000000", + "hSAmjKuHAqBLrrpNveNqiRFXE7K2TiaGxu7MYEhOmT4=": "384808000000", + "hSGP2c-SAIAOdm3Puvp0tVFU8A2SRhoj6MGcov6esig=": "1543356000000", + "hSIPg1_QPU7Tv_cz8yLCOpRj0nWkxw3j1AIOBhD7lJs=": "428023000000", + "hT9lvUCABzhLFqEH1wtR5duA5WDy3xCgzE2NGNnWhnk=": "446658000000", + "hTLeuJLk0ZwF0L5ruz88WVe-tRMVBe3ueHMRAR7WCew=": "454545000000", + "hTapbSm3q6DfGpPC22Lg3n9myVeEMiUVahTi7ToNBxA=": "1363636000000", + "hU1B28IpPae8kLsHc8VJV9LZWTGbkvi5SOo3AQqyzxw=": "1365374000000", + "hU82Ho8uOCiu7XtgG3qKJucogei90Bri4DJviR4yZuA=": "383422000000", + "hVJSFW1mfQMcntsHsWHjvM1ANn2AKO-MNLTROpfxqLw=": "384615000000", + "hVkw0820tv50-OzLccFN06hHORh9BY_2NwfJzLr8UaM=": "1269294000000", + "hW9V7gb5F6r0aVnKBjiAvDaEwdKbBJsElm2fG4koI1s=": "384563000000", + "hX9la72rkuZdXrGmQKBpZTetmg5KNnmz8EwjE4j7hIo=": "1339521000000", + "hXQiZJ6YM_v-ArXPaJMzNZTPtqtNMHVYqBlxgvN9n-k=": "384284000000", + "hY4LwS-JFcyc0wI8nI0Icv2YFpfl8nZik1AEhsYrK58=": "384489000000", + "hYBD8rySHA8sybkPQhSp3brs_saQHpfg9SFmjDJjU1g=": "397332000000", + "hZLwSO5ymIn1Tuym5gsu4mCLZjOSd-SjCUs-uK48JzM=": "2884615000000", + "h_J8Ca0xBUQy5Nzvho1g9ydCGPnklPhDENitqwGRz1A=": "417744000000", + "ha0Wt3rzoGIh1gZ4_vAyHVIPii7HGY3VCA4X8KNR8Mw=": "550159000000", + "haRzE6-UdLuxjm3ABdmQgCvNOQZG8pddcG6v2e0pUL0=": "836365000000", + "hadwCiPF7BFz7Je4Po-ItAsySICOv48TtJXdYslXCzU=": "376159000000", + "haooU8er3NCmHmo34cdM_v2f2GLHpMu_RWmdujI44CI=": "450042000000", + "haotuIA0GT-ILm6SzBi0sILV4wNWK8UzICtso3cwVY8=": "1075671000000", + "hapORzs29FyfzeTvt0wHSFYvRxlS3Hz16M8DEfraRgo=": "2088229000000", + "hbNwM2KHnjiv1z1sme7oGSM--WafRcOSi7pTkmqr1FA=": "18470349000000", + "hbkec9eKy_2vbBsN-16R5feNhlpEB7ROupEeDkzWEL0=": "499999000000", + "hcFJwG7IRyX75FzEfiALP2AR4RN2hsGPrwLqNAfGjKg=": "758333000000", + "hcTe93PRx9dKhsRlboVyFanfU345gadWPj-mNWWWD5g=": "458901000000", + "hdY0Vjm_Ehfp-EfBAazwPpP1E4c1YiBf6nRZWtcrkTg=": "500702000000", + "hd_rTChq167jdlShjpQ601PoRTfR5-sbcEgM707sXvo=": "625195000000", + "hdtlmJ0qkGi177aKDJcfUbZcJFuGZoL8tMPD6hf6BG4=": "769323000000", + "he0GWGTsHyXCvRTCA2w2l0FRPsEEhp835GKkinW_a88=": "454334000000", + "hePJvtCKSBju4vwJfWa9HYkc2OEKkq4y2SlxywWNM9E=": "3844080000000", + "heugvmUUPTpXhpMYMxCMljtr8LHzuxFR-p_TzP6vRZ4=": "6621492000000", + "hf0a7RrHnlcCaez4l4uAYLMfoUyQYun2jo1dR1jJLUE=": "939847000000", + "hf7gELbJ64GfVKXxSc5lDhWek5aVK_Vz33TduSb9Ntg=": "502779000000", + "hfLgv5SxbceVQhwqVx6UKav9Qz5tGKQZtR195bFQiPY=": "3855074000000", + "hfMbPyoXFxy1vmiJP9XBjLEIHfa_fLlMLidad09u4Ko=": "433628000000", + "hfNWx-IMTgeJRR43c4VAk3EwHP_k5utlv4geZmSejk8=": "423470000000", + "hfXqzp4dgq7ZExnWyfbsB1txYn6hYIqMPLUDGZlXEdc=": "1552795000000", + "hfnFt4wHQRcp8MlRG77ZDC20pHJATv8Dqh9fT4w9dfM=": "381642000000", + "hg5nLu725IxSmbB4WDQbAJscrm_maX0mIcyvs0Goa5Q=": "833333000000", + "hgBMJaRClF6vKSx_fASxCXpsZ98empLmo_6HdTDiFAY=": "454983000000", + "hgFd9b-VzWw8iQBNFPJSt4KQzN3bJJJki3ZLsy9Hkeg=": "417634000000", + "hgPxvkEVA0Y6cYdPTVWBvWBb3ILtiF77PpL0rTT4DZc=": "416673000000", + "hhAtDJJdxYiAaZdUny7H6c7XfWqYVBdQy6FHjeG6U5g=": "625195000000", + "hh_ZyXo2-CEMilylDbIhq6DIMkwKxfVfROGyqo7-VOY=": "11441444000000", + "hi0QVkYU8znWiUpAYAFGoFlatXkgi4cvk-NgPwf65DE=": "1542446000000", + "hi2LbWQIiNVep1tApcLRyWjujXZ14vB4kXj9fWGK12g=": "7775625000000", + "hiADtMHxbWAZfvlruWOsWgRTfQNPNyHEYXwvFeRKOu8=": "504260000000", + "hiO_cGDAQa654dl2ydqWVS1WWQWR8t7TdIpGEXJN6Hk=": "814467000000", + "hiWl8a1x9GsRf3mk-Fx5A2FSzjrLqnvCMs9ctDrZ4vk=": "10255703000000", + "hiXwHIDZ3n0dgl_xnbLBfewWLifyhV7bAFaTScGcc0M=": "435610000000", + "hiYfbolsSwAGkuTQIbQ5gEs_NAWAQB2yfZEtSn8yIM0=": "391797000000", + "hicJTdyCpoQ1Vo4mPFz0lfOiVeUdOQABLAnTFjNdttE=": "422775000000", + "hiqpvxJTH541WikoRL6nawcQQjyLMvu5UGUd53CpEWk=": "460976000000", + "hj1khGrt0LJrzyMyrcdlzHrdOLdxY-01GkESQhQcRho=": "9099144000000", + "hjRLogkd8mai9AQbnWJnsQdidDeW9W14g2Yd6xN1MGQ=": "489140000000", + "hjUYlfxcKp4nGloHgUiucFUBZy0PIa5DLDQnV-262Ek=": "384615000000", + "hjePGewNuo2Xf3b2RF3Q6mnl2QGn1oljNwYD9_Sppa8=": "384615000000", + "hjgda5U1VCncq5kR2vy2lzVakdErI1MfSSoEiOTCrB4=": "3635533000000", + "hjklmALeEVbQSJJlhLQyfx7mFcqLZLrMwL0jpBGZGrI=": "1265746000000", + "hjziL_JLM7VVSQ-_T2HW4iGkaDuiUDjmLfU6SAU7h2c=": "384615000000", + "hk5zT238k_gGkTedxJg2UqCrlfgFXd26O4CBDeEg0Hw=": "758689000000", + "hk_TdnZjrvLp6gT3X45_eWfvNJe2ODOnweFPAruGNlQ=": "514411000000", + "hl1wjlTby8a_8Oq7oy65jOzmj3yDOsNeB4sWYCIUwG0=": "769230000000", + "hl2q5vWxs0qt61CJAAawcB1vUHoo1Form4omSFn0sLs=": "24871719000000", + "hlxfAH0d_4iq_d5vuMgrftKjjqW1LiM2Fg6lGrirz3s=": "840967000000", + "hm4iqzqGcqzmBIxK_FOamLhGYDFU3Dks4lwck29WyjI=": "1682949000000", + "hmAM3435-y4yyohzogZzLP6gY6A5e7jzv-wdDtIb-l8=": "1250664000000", + "hmNVtuM8cu2ZVvMAVB2ylmgaH9Avm68_Qu90ch8CClc=": "454545000000", + "hmQSZHIotiXZFxAp753yTS-eAdnZSxP0BawJcSfjBf0=": "455003000000", + "hmpeuMjNq_pOWvi889-nbStaKnnywP9J_lHeOQOFPGs=": "390818000000", + "hn8kk2q_MuBV_vmT9Nocx8as_J5BXELFATvmAacZZRA=": "470139000000", + "hnHWYI8YyBg942dxFSoMfV8-uwLOFhWQK0kVmQAvgEU=": "833660000000", + "hnKmAChW0b_k-AlHZBp2yuRG6PRUvCrvdTbymQa68Mg=": "2250753000000", + "hnhUjLnLmzzdNTK2eAwLfWRo3jdY4TfgyFnpH4gaaXs=": "5706009000000", + "hoFZ0GjGac9Tb4gU4MYfwOybFJ_dZxxvQScnVXzWWNM=": "1223425000000", + "hoTu4_ptq_ngpcvmDOk5lixMBz04OhOpk5uqt1XK0Uw=": "385428000000", + "hoUNxX7iETPq3VD-itcH8hSbmH5BTi9ac5za4oFyNrA=": "5384613000000", + "hogQkKHXZ6vYTFO1_r5H1Uzcq0dvK9smtld54zSVSjA=": "407808000000", + "hp7EIHnyzwP3ak5m7LHW_tWDrsJzH9YDM3ZyaKM_CfY=": "413226000000", + "hpXKgypjVrOR2oiO3LxYLEub702RFTrsBHV09XjwDcI=": "1258135000000", + "hpmhQH7l2eIOlp6SjBXSYjIoGluQwgnYP9xVvX-gucU=": "1274767000000", + "hqF1Q6yjY1VxPcEZfRX3yxDVqtUorqwS00vQ7TniRao=": "380708000000", + "hqQSS575v1YFJlky76AdYbcxlVlQATcYNIlqRszn4kE=": "461992000000", + "hqQbPAOY7BEiKEh7AfE1jNh2U0Y-WKUrn3NwiF7a9Zk=": "469528000000", + "hqTInFAPt53mzU-aQedNg9aRos0Y-MUyMxRyVyYi37k=": "384625000000", + "hqUVxevvaik8ku8XOgXq7XHZtAgrYgVnwupWgr9RLX8=": "411367000000", + "hqluxGzvawzBOg1_CKRDtn4ZR4GBBUaVmQ-Jp_hqqG4=": "378257000000", + "hr4s_mZbkosPaOrttL4nSWsx-PRe-bIU0ImYLfMCzTE=": "473331000000", + "hsJ5o-QdgiCJPdQkW7MUN6Cj1tchxquoGu-Onn58pVU=": "466900000000", + "hsRwPqMaV4GPDtzNjnkYxCDN4FEUUPyezffrLiCQzmE=": "4193243000000", + "ht33wNW5h8jUzSSzgz5QPv1dKYG4m1WZ1RGyk9dmNK4=": "378966000000", + "ht5VFKhZqZgOxe79905CYihYmntEnYmqI4l46zpnHvo=": "999999000000", + "htc0EOtLdUHBbxgulL_gkhvOCLxXCEgW8yJukTxcJZE=": "377410000000", + "hu-FWSm0nH_22nEApGEENgJ__B-nz7QYcIc_c9iP-7c=": "417634000000", + "hu7oTTDfr046L1fo-ON7NzQ2TEPC5kjBPLpE1HLbl3w=": "814467000000", + "huGfZdG2pHKANoDc9hQ5PdvF8y5Ls5K6J6YS1BUamns=": "383483000000", + "huS5a9q94OzDqg2QxKcS_0QZqpcKetDdXGYOHnFWZrI=": "910118000000", + "huUSjYMW8wXmOrGarU6QqYznyhqTZHy3I6Whmo9Vjx0=": "384615000000", + "huqZc_cLKbn6EATcYeRPZi-0U7_HbLHC-9Z5sEMTeLY=": "521654000000", + "hutoPC2qeOBgr0mH_yfKAV9rOMYI0g9kxO5XJi0lnX0=": "961538000000", + "hvOKcJUJWeHoSbB5enk1v2n-tpB3ShDOb6YtofAVjfo=": "417637000000", + "hvR0Idz9fmKCL5XZ9fjgW-ieAryk9-NnoOOTCOzKsLw=": "411085000000", + "hwFjNsazTN6byDwGbeDKKuhBhk3Jm8L4BnyAt8onfG8=": "416666000000", + "hwLc2vz6g4f5AthIG4GzW7YQOGRiCEc2ry-zAdjXcEY=": "909090000000", + "hwUS5NugciabR-_QSY92FwiEiRgS-Zx1ZWmCTLp2VEc=": "384615000000", + "hwZW23i7ocDTLxPSYB9aWlc62XK9BQ81xa_XiZEiO3I=": "417520000000", + "hwhvYXWNmRsJjLAY3VM2VHB3NOAEWFBduPZepVsZE0c=": "384549000000", + "hwxxM-sEyWwJQJG3ZJJvUguT3ZRjPEOQ8spisctjmU8=": "4076446000000", + "hx1CfgxelmPBnTWB_D5c-XOuNaNQWUCvXybxFxfxaio=": "564372000000", + "hx4uuJrqpIn1onrueA3b45EZH82wH8jBAkREbMmqbUc=": "452201000000", + "hxLbr2XeekJNat-X8RNVvWFTburRlHZd27EAvoDrqzA=": "755163000000", + "hxUeOKTQmAFPqPrFoqR1RcKEH2K2hanvyYRlWyevbqw=": "753800000000", + "hxh1X_jgayj1EqlHN0rpKE5GSaNIM3-hG9SPILFkNT4=": "417630000000", + "hyoi7FBx4I6PfYRXeG5NU-Cn1lNeOxIY0_tYZYOLHLw=": "830545000000", + "hzRn1nIaGdrMMTY-B93jOzGXxFaftGDjCvy9k3z9iw8=": "769568000000", + "hz_Iha5c0LEob-AXQwAg-_LJd5JVxhfw6wK13wFOD0U=": "415396000000", + "hzb43TKR9se3GzxEV7ZR7ZecL-zUUbpgZ6_VX_ItFQU=": "427219000000", + "hzhVdK1mY8CbYeRGxtnad26RlCrSYfCm33e6iSCqOLI=": "1923076000000", + "i-Mk3ic4FRS4WoFm2BUKSyt_zqDo40Z-JojUh5RqZZA=": "384468000000", + "i-OPmizQe2Mo7WVmIleHKiRqMzDcShIM6FmXTCG_ZEg=": "406407000000", + "i-WolX6-J5Mca0SYFic28YC1JThBR6_U9591XIJ8djU=": "535669000000", + "i0-aSVhQ0oXYm9XlZd_eW53kPnZ5pQTakt98XuB_JYY=": "4127055000000", + "i05XaECllXpHTpydJ2B3Hphb2kxBkV90yjJ2EwYm4HM=": "459763000000", + "i0a6dDbjW6k8RM8cyeMhgBHaZuni5eTzP4PNUFO_cUw=": "417633000000", + "i0rE7tqHFfkMnSxxNkUZA2mZhviBriEIKYsCMTJHdtc=": "411085000000", + "i0tS72M_C2llEm4Os_xZpnZlEEakcMqdYlad4ML_ngk=": "383664000000", + "i0xZH-_xjZgBVt0VqTvN8pKL-a39k1wMio6N0b0n4ao=": "407808000000", + "i0ydsnrgPCPhLygWt6vL14Dv6pzF0Wkb4r_j7PUNl8Y=": "385765000000", + "i1JMbJaradPT2snt-wT0m34WmeutOFdTvnx67OtwY0k=": "460975000000", + "i1PUmxoWGPITPr5tukVwWgZv-_oFvYM0PYL5N0bPyRI=": "417633000000", + "i1bzGPVGrFo-4hzCCU0jW0qbIJqFxc-U-Yid33wvIyw=": "378257000000", + "i1mDDffU7Hzk-gSR12DOP28QFj17IymuH-76dO9Yn_U=": "20454545000000", + "i2MZkIb271AQfsaquaOBouT3B2v2MkhS1ag0yHw8sQk=": "1156520000000", + "i2dZ5S3MeLOXFmJlsRyaIrF2xCxavodLlcYOs3PJuj0=": "380592000000", + "i2mSqzNgRw-qCoRpMhqPFsmFe0d4dP34a1KEqUsle9I=": "4540814000000", + "i3CI2Dk5_RSkdZM0pDl7akq2FIv6agekjCfBxfznJWk=": "384615000000", + "i3JvagpNT-53x0pf0RuIjwe1OJJfs5UMkSYsvfYmEA8=": "416650000000", + "i3WLXc7qju-KZ6q1JjcPcL2Bm9dFvTt77xhFj7QYIS8=": "1852184000000", + "i3tQ_2IKqjtuUTDn7hkZuWXR8PO7dGxXJfFOJhiNcvU=": "1264105000000", + "i4LoUfcm58Tr8hPTh6_ZiGkOle-coYEK5Pv7ZRuEK4I=": "626993000000", + "i4h0h38QrFdUTgaoBk2suBc4KQyDUSRELU8YsVn5xAw=": "385510000000", + "i50P-90iyO1wIIUZlwjjpww55CKltAuWuPuYc2i3PGA=": "771294000000", + "i5U_uAfCd3ZXpSxtMbwboSbz7N9ZM0A_O_yxXWlmkNY=": "911828000000", + "i5i34hAsZmAU44PXF48zSuWKF32UKjGx52U6p9N-f8A=": "525148000000", + "i69ynw0rJE0gHTLBhxXpuhlQnP4VJHSafgqIacvXsG4=": "426445000000", + "i6Ap0DDQVca4t8i7Lqyj-vTtdwhThaim_k1I3l5Y-5M=": "1366168000000", + "i6GgipeUJEuXIRJzvC9GhD-DI_N00TvzEbbteGxajok=": "4156629000000", + "i6bsKaikbFH3oMptoCl1wnwpcvxRkY4eAOrO7y0rpnc=": "384615000000", + "i6wPcQdMNlqHJUUck_uo3aZ2tC96Nhhi31CbKrF24lg=": "1796276000000", + "i7DZUysnjl-w_-3aAObV46BuGM4oAZyBGbTxvWN96u4=": "459691000000", + "i7FDHDTjCBBsytCtE87wJHsmVbv1ZA1uJW-qzjlRaRs=": "445833000000", + "i7Gr1V3gzkxV3YVWWE82JJIaM6es3v-EnLxXDHeko_E=": "615384000000", + "i7Jlb3gWzFV8YCBNOA-zNCHdAd-cZpf60yfqucnDp3Y=": "676405000000", + "i7Te5CGc5BawPt44shkcdarwyepFk97nrVUL3oC-6Jw=": "385506000000", + "i7f55L0Q25WOGW8RqDJm7M6l1zXRpQ4Fddyio10D20U=": "416666000000", + "i7zQLVX1x4BUMjDRbi8LGQjMDqqKTNmAO5D4qlKl7IM=": "450740000000", + "i8fwhqrajXaB_y9HKilY6xvb-RYX-Twr4CxV17JbM9E=": "384662000000", + "i8jxr2rJ8hxEIg4te9-8kP5TuFJ_M9j-ARK94rx2rZE=": "509391000000", + "i94H3klR-q92_YrgrkmPnzGJ4tc1rfeMB3ePrV0eV2s=": "488082000000", + "i9cpWRqulXUWbb8nesM3in-lrSLSsaha8giRowP3mNo=": "2264968000000", + "i9jgs1BzGZ9P7_Du5tathsjKsPTstNrkVfOFg9OnnX4=": "924096000000", + "i9uw69Q4qOQClJMhGpjiMiV4GmYXuu2AkaLeyMt2tb4=": "1666666000000", + "iA2H4bo36gAB60h6yClQ2933wp9BJPjitBuASHlx2dA=": "1846153000000", + "iAM0pI7F12bM1xEgFSCsYGYu0PgyQpqqNklQNvkWdFA=": "3461538000000", + "iAOL_Ta02bQwpq4tcMitwKvIf_fyQoucGP_GisR-Suc=": "385507000000", + "iAhHU1i8ZI4bLqPaqiKBV5vRUkSzdbF_1Aw9OqPh4F0=": "1530596000000", + "iBgWp8_7vMqi9LCAkQLMg_N7-909sAX-3RWbl0XiGHQ=": "766243000000", + "iBkMUGWGkHWV0WY3mnSWghkzawVAxSyZC6BfyQ8O3ZU=": "455125000000", + "iBzw40gCI2C2d0h1r_k3Wo3nlkNBHWURrmPETpWhdRk=": "385506000000", + "iC0TU4gWPfrvO9DLAzH5fiVVjXeBFxaJwurYukieDTg=": "1345520000000", + "iC0ndPPB4XOn0r6lM3qQs6SUnnEyqwk4IK58jAay5DU=": "3636363000000", + "iC7XClKot1DX5pOFnbnsMmF6zOJW02dD0JygpPeLbYY=": "1699813000000", + "iD6BEXAE2QDJ47hNPvFHiJlc8s6RLSgXosuhduBsUsY=": "2247106000000", + "iD7BrDmbt1CNmDFAEB7LL7QBdzfgSlq3qbiCkoJDnLc=": "431036000000", + "iDDbw-k7K-1mTIrDPkqzC_QDtk3SpdhL658S4-WBD5g=": "2091578000000", + "iDeMrmt8rQ6trOSUj3hIo0wpxNjOddHjUXZ0nfam4Tw=": "384615000000", + "iDtDBA__kIe-y25b59eTf_obOJDOF0ucnZo7HE8J4Yw=": "384615000000", + "iEeT8v9d3C50el5af_RFZd0XQTHHkN4mGQFeuE64lYw=": "380680000000", + "iEmKzAXjEJC783scR0Dej_qK_fOEKlAmyoarosWssx4=": "527355000000", + "iF9rMc80Htbva44qcvse-3XILyUrMFYPnlxU75AZF3k=": "9615384000000", + "iFTNvOtyLYEQAp-UsYsRjs7LXf2TovSg2JF_C1Hu2aI=": "721678000000", + "iGMb6ZU_JkpnDuSyGmKgP9LF-mQL02L5vyBUuPqdE7M=": "384902000000", + "iGX7SC5FaBuyXAM7bQgDkuiMgF1ZeK9zNoQbf9fbjE8=": "379742000000", + "iGXnHuQH-sSk6BVUb2KdvlmD9PJJ1Kpq6UpaZCYQwIg=": "3760918000000", + "iGkQcvN0AT5nUbnFfW_2s5umaTsI6ILP33bvzv7DsmQ=": "1785662000000", + "iHDN3xWlQbfOFRkBGScBqOo10r0Kh_IVcHwSBCYlIaw=": "538461000000", + "iHMxOIqslN-zY8fbUwD9ltl7Wm9Nu3bWbLTs-RPMzec=": "1153846000000", + "iHowFHTBJhvoFiuQ6oLTWWCEDdh5a0KI-o1AvanHf4o=": "827359000000", + "iIOdofLoCwAVPXtz1hjrYJkvdv_IJlc3PGJcRP55q70=": "2083333000000", + "iIV2FC-gPv0fqEvHxoCgdP7WC1MTfWnGagmEUrMcu0M=": "384594000000", + "iIhswykF06wzNi_zQBPcVRl8Ed7wRKV5Byc9c6FvSig=": "708345000000", + "iIiJSRggwpPphGYCIInKr3-tPVzd0h3RhyqqdGzDpL4=": "910663000000", + "iIrytJ7pStMyn354TMLm7KnEQXFwq0wPzUnstUhNE1k=": "378341000000", + "iJ9Xn-U2BHKyR4J495Ktmhp_13JIiTZJ81K0M0Jvf7Q=": "1160206000000", + "iJIyDUde1EMYveaAnaY8tIC6P1zFUcEfBhNy7vtyRQM=": "384615000000", + "iJWdRg9f0t6nDkwL0qcCbKMTa1wFsXrvx_HwBlaIDoQ=": "499999000000", + "iJeszr-u418ycH9WbQS4hOcQzGGvQacTJMNNrSq-ltU=": "411085000000", + "iJltEouz_q2C_4TAfp1hFDJCbYdvObm7tiDsOUhpVKI=": "841353000000", + "iJzpMEA-9PrfM-0jDVMHfDb6MVVeiHIBH5Xa3h-zFqQ=": "385509000000", + "iK3trhOgmvjlwvucqqoRQAFRqMx98mVcdojgjXFErkw=": "407560000000", + "iK8aHzl9mgtWEXEi393FOyqd8VsB_3Srj4pYhdzCfhQ=": "417321000000", + "iKFhwWrNIRs7VomKhOd1k4OUUUKtOFewjfqsz-Znk9c=": "4103649000000", + "iKFpnGxNcThkzPGJlU0kUlT8Eg5Hh1KGSITY--Y2S2Q=": "3750064000000", + "iKWx_B72X25xQ2rt42WEJ9VXqn83zHuBu5otwYkMxf8=": "634433000000", + "iKlAPa0UfVk7Qk18YpWsk9PaEsi00odHagaH5u1EEaU=": "698546000000", + "iKse4CbamRWhAq-K4CCgGj5q3tI2-Dsy-qZixxwQ37E=": "2607326000000", + "iL47V2TvI517VExEySS3iERz-uXURcl_VaEqRBpniNY=": "1216178000000", + "iL5TGa7AfTtU0VRaV1A_SuQJ9KQZAqvz4X3lPyqaIUE=": "927845000000", + "iLeH73ZyfJOQ40vaiu50j5Q3y_Sj52TrsUf7oPTe0kQ=": "448013000000", + "iM4y9x2M1feUJ0Tn1lpnrckjn2_z0oRPIZ6M_hVFlbo=": "767923000000", + "iMH-dm2cx3sH64V5JljTERuqtTz1JBr4ohYAc107WVg=": "1153846000000", + "iMYXFaAYb8udPzAQehHjmzK9ppUvsMOQ5AlkVsfhuMk=": "655666000000", + "iNq1DBanDxA8lp7X16rnegfqhM08qGql-8hQ7LTLD08=": "1923076000000", + "iNwOCHeC_zG_VjhRpXBWpelkzVioqOq7cfw6cJb0tsc=": "1366800000000", + "iO06AwsX8skZA7_rc52PDgKhX25qK_fISKHMt2gCFJg=": "625865000000", + "iOW3zYznmzipMG-5k_PYzbwn4kGI---M2wE1fdvsvts=": "1744517000000", + "iOmso9NWk-MXkECGYWJabO33jHyybiXorMfPNSAzkgc=": "416666000000", + "iOnVa6hLfZBli8tTF-lh8OcC0Sepy3SFFaMbFHPjZJ8=": "384615000000", + "iPEuCkxIFUhcD_ygoghK_L9krK5-5covg1xKrLkhJLU=": "1363636000000", + "iPIh-S5kGgQUXAbDIzCH3qaK9TbP-gZo9CquRhrG9tQ=": "457943000000", + "iPN7-43ayucyRz3pLc4T8jKN4417oaBCLsAkwqejLQo=": "452326000000", + "iP_M7K952tSDkBA_JnxpvSOUY9j6CyUkWfBsKXdENmE=": "4641046000000", + "iPe0MZjS6vQqTpJ-ZhZ62heo_aGRwYnBQFfq8MCOo_c=": "390652000000", + "iPj69J1M7tMquwTIwRNHtIGtYg33HXBTci6f2pI7qwI=": "577336000000", + "iPq31m2peW_maRSjgaa1lwKfJK75Vq-EZ2EHrv9SC7E=": "381511000000", + "iQNGoZkQKcpBctGe0mRCN9YHFmpPNuRKjNOS3K5vv-o=": "770322000000", + "iQN_7t6z5aRko9AeZ03Qdh53rWC3zjf5SlPGy62Wl9o=": "4036499000000", + "iQRh4zISoTKvYjE0Nr_XwEgYfQewC2e5sKJyW6PkoMQ=": "2331291000000", + "iQzXwSDuCHX8mf27e9EzeNKk5Oy5w7AewpEKJvbpAh0=": "1810373000000", + "iRCyGz5JVVGNtuCJv4uPsgwcct2FOs47WqwiLWs0QCU=": "384615000000", + "iRvxlYZ5b32fmHy3OvA6vgDn2esv2Tnt0H2VlzDsY3c=": "386072000000", + "iRw4I4FS9B8xxXqudiSX-X11L7wTJsv0rHRrlVh2cHA=": "405357000000", + "iS-ujUGkGdvXw9PtVmY0TVlEC6ekLOr4bJYtmLyiFWc=": "684554000000", + "iSAwqdN-OJWxbtLL74fJTnMeZovy3PQPi9XHSovlQak=": "817248000000", + "iSKplB2qFrJd34ewjIgGozyPJbwyrLgiIK-xmCOt_5o=": "499999000000", + "iSYQePPRePNjrqRCzOmGYdJYI8iH_ctFFswwqp17b7Y=": "473265000000", + "iSxG747fE1E6F6SaVgwQ3Bn7bxLjOHozbbqvwTMnjMo=": "404052000000", + "iT9fRzR8PCoppILyH-26GCxlR-aZrL5mXessktGqohQ=": "954279000000", + "iTKOtaGNO6x74vl96RpjYoEQCNPzdbJ-l7T91JF_BxA=": "441016000000", + "iU0bMwkOlMW1UGRhQnGvQx3NBieCyNHwhk8qdEm0J8s=": "418116000000", + "iU3IKRqYrKNumWMAeW19EASUxFR8aeR0ISaCS2Dwz8g=": "806082000000", + "iUwdeJylPPWBwuKNrDocj-BgopQoc_IcL4TYAORR5DU=": "403846000000", + "iUx3ir7g4KqpMIoY2rDqJURXfey9nBjBw865Q7khb0A=": "1923076000000", + "iV2CgMWgxrBohixm_U4AMeZnhJNwGkhjT0EU4k5GBn8=": "454870000000", + "iWTb2kCwFWlK8HJS7Pr7nr5-MOHKJ5wxb8fXMBhsEQ8=": "703790000000", + "iW_YBdPXa0FI8RVEjICh7J59nxP5cVqWIiDinO2TFM4=": "1538461000000", + "iWiCPWDj4ITKi6ywVm1CcsOEe9T8Sfs6nYR257md6SM=": "654409000000", + "iXZE6Z1mpgk3knnnLFqvP-MMymB0vDVgLPC0D_S8LM0=": "408946000000", + "iXdQW7p8HTz9_FThCnDEncbogC_rHqiHF6lfWqcAO8c=": "461637000000", + "iYAlxEu75Erehv0k5rPeAawmigWPlPBSwx6yjm2hqcA=": "427562000000", + "iYPLZOqpMWBBQ1MvLzep0BUKZVY5V03FZmD3dRZ53SY=": "387297000000", + "iYdo5Q9t1cbyf8RkVk1wciosBsZGwtjA9rhmjimsIqg=": "1270111000000", + "iYhO-qUMQeS6SWaGO9xsoqI57hjM5xasbxEBv4FupUY=": "1348751000000", + "iZMX4fXcBfT_xgtQjf4MNC0MdsNfQYOLKSfxgdmbgJg=": "411085000000", + "iZNtWQPUuo2Dx4HwezOscLntiZmmKIUjMr8HHjynOSg=": "2088168000000", + "i_bB0-3GQP5FFQoonjlz4j4Y9JDh-YPa2DPudhY1ud0=": "835687000000", + "i_tXkdwMpINLO-bE2SjYPGDLXC16BM84f94ldr4deR0=": "381436000000", + "i_zMzkdWvrIl17xqLsx--O9iiSOh3wbRDJa6MqvpfQ8=": "4924450000000", + "ia4DJtJmHJaCo3FrtyHfkT6snWNpsawckS8rq5RxbCc=": "382394000000", + "iaHjIGSNca9YPaIhfTbgOM9exP5-pxjikDFbwbpBHn4=": "899999000000", + "iaLpgQEWknH-9lDUj5ToYOYhCQ_Sa21qBU0Fu_J-ojg=": "1119864000000", + "iaRZGFmWa8LLLZWcl8kn8Suu8VUbfe1-1ZikeuM4KLI=": "416360000000", + "iaVpe4XLBq31urdsZeYwoHf0IkJleaUAf7bR7NUgDls=": "390797000000", + "ibUqyo9gqQlEJGr1gGvs-oNOodHk-4qUVfQxrQYYq04=": "3974651000000", + "ibdgaAVjmZTIfSm-jEYGOx5-O0Wb0RweBi26j5SVkKk=": "699519000000", + "ibmUNKpv9NAm2Ms1syb_VHKJdMEjMgR-QdgGWHpBR0o=": "464300000000", + "ibwYufirBpPgKLh3rR_DTI5zin7Dy1ZUxro31NWvJng=": "417183000000", + "ibypyVJsxoGSPL2ATJ4UZewaYzOv0PhT713r-hH-aJ4=": "404710000000", + "icCBkd85lYXYPxvAczaGM2c98oGLY1P61cPzTnjRg0Y=": "6059271000000", + "icy4DFhztjkT27SJSYEfUp7BYfBJLEuMoLufKa_wTrs=": "385505000000", + "idPaB87qVMegJjLQfoN3MaAbstXBOrVoqSgAUjtzgSc=": "385624000000", + "idgjKjK2FlBoexP5iZNNGLlg3_rnS1MPS7MRXv4P6iE=": "583342000000", + "ido39-smx8mjycmGyDtJqEBU3TLGnaZZeFCGEAQ_dF4=": "416666000000", + "iduz70NXOtWHSK1Suxq8MrftdptxvdibYVRRzlvUhnA=": "445242000000", + "ieWCVuf70sitViK4G2EwMOa4FF4sBL9ySJPSPhJE0-Q=": "1923919000000", + "ie_QYfMoPqb--D8c8FDO92XStQOs-LrGolMltx3nYT0=": "6206072000000", + "ieqUsuDrzFxNSyByKQchi1nwBsPQ3rLr2DvoW8bUjic=": "1217819000000", + "ieqkEIzdXwIA_kkbyAGP0MuVOS1MkidEm7n2dLrzBtA=": "384966000000", + "ieyvbzz88-ZyG2enG7Lou-kDozKltCT-ckTLTI2dOUA=": "384002000000", + "ifa_UqqwY2bKAZp1G8Xaff0M0IHwbB1bpvp7UTVlyyM=": "769230000000", + "ifni6kaRlcWb2q9-6P3PRxUJmh5FKmE0FtZl5Q2gFTY=": "384615000000", + "ig4bEuWto1NZi_sRJcTY6rS2icAGnUe3q6Jyl2E6L6k=": "417630000000", + "ig8ZR0YPdkJozhT9q9bNsLdm7ZmtNx7jd9hPaf-rOlQ=": "927024000000", + "igEB9LpcUCBpm_SZ1XsvnZxjXtZRf-Kz6ZWXkE5gZkw=": "893416000000", + "igwqnxB7dnZZnuE2R5yphtMcyhJmk-2T0jy_g5J8_uw=": "1538065000000", + "ihV9d2sD9dWNu_qRk2Lgbts9umTNKuogK-bz7nHpLfo=": "1999999000000", + "ihlEj7eEgRLloAAqqnx3rEhvD9oIjyqvDKF3Quw7z-Q=": "834551000000", + "ihwB58gAGGdUNVH1lzWoH8fn-8hUnB_NOeqS2vYPBAg=": "386307000000", + "iiOf-kVZBm-dFVQWolD7jFp_8vltPiM2wVTnakCA4pk=": "466696000000", + "ije4fJoB0wUoOqHN2u-D_B4rXTq2HiLOGpMlJrzJ2kY=": "2272727000000", + "ikayGEtJQ-LXtFL7GrjzXOybhnJhExxUGt4euH-P5-k=": "384615000000", + "il6ypB-pVzmdQZ9rqN7VuAxXgjKv4gR4zXwzEP9gx8U=": "384615000000", + "il9gy2qw6o_Q3aYjmW5yLUHSDBMjxibTy2tEbAt3IIc=": "2080891000000", + "ilc_NuIPRDRtS5hw37wvgTazc94ctWwthBaZxIwkh0k=": "7401508000000", + "im-WFemvgHOLa1dHzn1Gx2_hAmXdck5F5ALlXcpPBIA=": "380723000000", + "imFFI2ByGsJlTAB0w6EYIKfacZ9DpSMMX1d8Lq6u4SA=": "833333000000", + "imZ4wUD6IGFHxkOg-Tn91_6Y1UkmE3GIOHLyGUPk_4k=": "1906882000000", + "imrrFqBFu6_1kIJUIXQuaHpP-ueRiTNarfN2cZvXZ3c=": "383038000000", + "imyHNwiA2rClXRih88lyUBjBpyZ3EimzNFwvCrG3yMA=": "769230000000", + "in-wOuwRT7vp-ZD7PB7O76q_eFGZchjQq-N61wdMA8w=": "31304422000000", + "incnq6kySmBycSYO7p6p7DGoHItOt2oCAAa7uiQbC8c=": "384615000000", + "infJs_uKmRIXtF7tQ-O5cuOsoz6MPW5rcwaCT77MHw0=": "491644000000", + "ing-yQ83RWTH4FBZv_hmPQzzrTBDVACla-Qvmviwa6U=": "423181000000", + "ingq3s5inDikllan85eDbUJK-kjgo7tgDezrWeEC-Ds=": "775861000000", + "ioAw__z916cY-q0RYoLDlig38VfEelZbBoF3NL4ePfE=": "449494000000", + "iohATOzPteelADwfn-xYAwjRj5pJ6zzdew2caoAxuEU=": "1970100000000", + "ip2vCHaNiRgrvJ5FFfylUIDjm9hm86pddbyTnn-R5UY=": "5058771000000", + "ipCng6z8CzqYlWACuyPqiJx0dF803m4pH39t6NmPmFQ=": "452205000000", + "ipKoo01ulTDlG3BPSKtMj2znd3Rb0SjjPKSncoJF658=": "3855074000000", + "ipgcvNvzW_2AfpyKUyOf9HQ_BaK8XZpEPAabYcd0dko=": "568525000000", + "ipiPq_jsbXQlEUR1Pu_taAAoIEd1I4Hx4QKQAKlU6WM=": "443461000000", + "ipiTnagCutaLKHIVW2kHUowZXiKVFPcxVKjH8o9hvRQ=": "980769000000", + "ipyHSd1B8LmrZatOZG95XXA_H-2yWb978T2g4u35tUs=": "384615000000", + "iqKWkDrApx7yd9gTl1vq2hIJ_lF94fyolC6LA_Rz7OE=": "752690000000", + "iqdova3Ra01jCBsdk_QOfajfA688rX0-cxsujGIQK4M=": "384615000000", + "iqfE8EBP8wg6Vp9DN_4OeKHi5l2hMQqCRs7hhp5hcXU=": "417633000000", + "iql3g5Gz6h67eYLHpdRbVPtEQfAHjnG2-e2RY0nV_cs=": "769230000000", + "iqmZKUMaMhXz9J68PEgUyAdd5bXj7clB8RenhC4bCOI=": "455541000000", + "iqqxXjc_9csna1cdJM8AUGxMgEAIXP8T0Xr4kGUs59Y=": "1369803000000", + "ir89N8A_1LPn14bjIdKmd3yh02c4pStoqCGzIrHKMg8=": "502410000000", + "ir9DKyDs5eSL7p2IOozNGGP9nRrqUhzzxAuOwmmapl0=": "576923000000", + "ir_Iti8wa7vuephi5RNdhFcM--Kv49WsPa2dQBI4vvw=": "833333000000", + "irg77pLcRzaaRSBN0dO6PYRmEQLCtCq8M5D5-0MV2PM=": "769230000000", + "is2mmidYiT4KWV8m0yZlrRQXiUI75mbAehNVgQ4_mxI=": "1794036000000", + "isJDl5n7tASDJCfbCUjAB2ShHdRj58bA7oz8cxy0F2Y=": "397163000000", + "ishk5VoL0vxmoj8SScfcmtUQ1JXTaYHM7uMrU94vGYA=": "804203000000", + "it2yyGN8gZDryjlVCqd4ISxkq2jLAM09QxROCh-wLNA=": "2557048000000", + "ith72gKknufoW4zx37nn5VIWV-EQLxG9m0WuknkfcI4=": "447619000000", + "iuHubZWNFKwRmI_ezHeP2OR7HbRAX2H-Q1OsSLUyTs8=": "500469000000", + "iuML8MRSKQ_zbiSPC9gojHqv9awq6hPkL0lWCh9FT7A=": "2313404000000", + "iuedPCDeeoxN0RUGV-tOw3ah0hxa53EjmGsb4q84pQE=": "422557000000", + "iuls9Gk-4Oj9ug2z2_Ux-Isvkxkso-_Ar3MT5ZczUZ4=": "379344000000", + "ivG96YYFvx8BtjH8cVzVRnWZhdDj_pxLprzL8jGqqpg=": "393310000000", + "ivH3VDw7wqrBj5cIYyuTPMt7WljsKFijGcsV_eNL7ZM=": "384615000000", + "ivKVpp1XZkjBQMebNa_qMcWb7sMG0A4mMxli9JNoHUs=": "417634000000", + "iv_FSl2jk96V4jgF2UXBwcQOd71r0-OWIxahe4hXtgI=": "8333358000000", + "ivgypb4Bd7jQrGvFEC3qJJJER2Z46c6jNTIcbwGn_cA=": "385614000000", + "iviKLTkdnBgmiZTX_NZo3SNWyoEGpG4JkawsGs6ZP9I=": "1233257000000", + "ivi_umyR_xpoh8pJS9cqYbNpJapG9wMlOpL6LzK-0vE=": "416666000000", + "iw7g3Oh6Zk8cm_LdkH8u370hvbAkvZCKiWpfyAF6lJU=": "673076000000", + "ixR3yC3HJ5I2OXmUWJ219se9lFJ94YEuGFFiT6SwJ1M=": "3144581000000", + "ixWyjwES2hSwqQ6nkSZdryM4B3Gm2tBDrBft78wsxvY=": "454545000000", + "ixlptnU7MSmCMyDDApTy1Z0YIxR2lMm-0rQl9-MEnIQ=": "390103000000", + "iy0NWzpniPk4VEZ5Xp_H0iJ_tLUdGFGdoqqE0EP472o=": "1952190000000", + "iy3tLxYUOrme2Vm1d8oQVK7O4Hh-256mnJQTIjkFHLc=": "1150707000000", + "iy5errqlJgU4je78IRw2isw9qRKzR54FiM-4Oc7k0Rg=": "1923076000000", + "iyUYnrC-qKMpOamX7-TbLYYJWRsQ5f2BMJe2HaovNCI=": "1140491000000", + "iyfeyn4wlhgVea-4Cj07QB53F9TplpUEoFb9XswI_4Y=": "2083368000000", + "iyr5qSUZH3zyc_W_7FnJb77TIKNPx5wfnKpMzfu0B94=": "378814000000", + "iywWWc--1OZgNvX5eEiXEQAvm9-Tzt0--9EJG3clHI8=": "1538461000000", + "iz0Dm1fqB8dYMJbIYbxrjiRPTJn9Lw_EnKf1nKr-ouI=": "377072000000", + "izD3NS99_tJE1qHoi73CUuPkTIrQdODYMnqBG4X0N2A=": "390237000000", + "j-IdMOTlnXw_reBM2C2fEo_uEtiMkwrtqXJUuRv2oMA=": "435589000000", + "j-aRgPTOIYx8YCG3hHYVGrMOySjvXE8sXfFinnq3S-Q=": "835901000000", + "j-xU5S9WjaNojCB0R09WZRSu6685C9s8HmJRAbqIj78=": "813336000000", + "j01wWB1xcOWSqt4YgmWdkA4NdVqXoRmYG36COB5BCuI=": "759112000000", + "j079Y4EZ1N_I4cAvOdzgh6R67cZZMcUT_fHdK-DFcK4=": "4162757000000", + "j0L5oSd7nG_zpw5wKe8j7Fpw4IJVc5hOpo7Ldy3ENck=": "1233257000000", + "j0Xcgl7MC_S0W6Rb753ZJ0HU_3WSjCSU2CGKLLDlg0Y=": "460558000000", + "j0bQLJxCmV-HN6qIjjDg7nkV2pps4fGUaIPoVvJ0wfU=": "414523000000", + "j0dz_JNXCmFiO4Tds40hgS3O4_F_3wkWw27Ie2SbSuI=": "424816000000", + "j0y0QXPzkZpzy3A0-2cNe_fH5Vp5zuKuqmZYc_lYjso=": "382864000000", + "j1YxNrG9sPK3VuldnJG6FGnNxw9Kwx4wnETOjD0tcv0=": "1575006000000", + "j1pRFH46w9bPoQnnYD-aZB-drgnwAJZTUV9Dfz1gDJI=": "688777000000", + "j1u7UsawqPGOSWWxQUaowhombSm639kci-huz91fpOg=": "385506000000", + "j1xDFA7raxZxFMHYPZ0bNCMHMMc7qi2tUiobTwswFiQ=": "6086363000000", + "j22bcYOQDcKiVafjvE6-Vwz_sf3j8Br-X-kSCUxPlDQ=": "501661000000", + "j2NxwLU1z-KF7W2IqqQ9iFsHqF7TjlUxPDsYnva8LLE=": "384615000000", + "j2R_gr9_5FRjBp82ztQHrrrh_w-AtH2k9C2JAWzKMLg=": "776635000000", + "j2fKMc8ARA82O7_WaH5p2fPRHYqKDQWTXMX8Dw2ynkI=": "3846153000000", + "j2tmFDFfloKd66XqBsZU_fGjmP85ludrlpBiWdF1gfQ=": "389217000000", + "j3Kjmff1GKc88iy8gvNxQN-6SrvcCS_26BYg8HlzTtQ=": "689017000000", + "j3Tn_5rq7Ykfy0WC5XbfW59VdPqT89EHmRyBROmEFLk=": "414523000000", + "j3XxNXVhbhaCseuuQG7S1vqhutFVSgf1e7bIr2HDzW8=": "743893000000", + "j3YQKWbNHYfx-p3e7ZAlfkPqVGweMSHXrsLRLOdUWow=": "4999999000000", + "j3vVy8TGGNvXgcQN8OTBtgbkQoTki17F06ymXJ_uPk0=": "416666000000", + "j45G9NhuCWzm2W0NTi1KD6FpHp8ME8vJGuJsKdyHkhw=": "2265091000000", + "j4Jo15-L6Jd4w7co8sfQb6Wu9Jl9JILD3w8yw4qxvQ0=": "455402000000", + "j5-cEsvRGSOgy59_q4KPYsHpwvrRZ4UBU9Aoeozjcl4=": "384356000000", + "j5htNx41aRTfp185boErQPUImla6fBo2yMObjgf9zO4=": "517171000000", + "j6G7JNIXnsuM17bArdMk_xWzLWwhnUGyZDajIPzS3J0=": "1923076000000", + "j6XvYDF9-ZygqEj3KJ9jQ-IgOvuGp4ocN2KeG38AJgs=": "384615000000", + "j6Y_pOqSK1lLURo8-_-VVyt1zSJlaTYwbC6lyg6S1Ok=": "411085000000", + "j6_mKsAOe6Lu1UoFcYcqzsy0qXOUy4I0ItlwZAQ20fw=": "2500042000000", + "j6zp0yEX7q8OjAC4e6EkZggIG6y6qs5r1AEasmU-wOg=": "1153846000000", + "j712PcsvW-ZbjHJR60ZnyBbySZkqZjfIIqElvHltrdU=": "384813000000", + "j7CKoMrwTauSUOdel1_g7sQoeBCo-4bd-3ckgvO39qc=": "499096000000", + "j7XfpGhd6c8wszSMBEHJJqatxyyu12QV-iClQBHiBzE=": "641556000000", + "j7wLDIUfWa-wcITo1e7oXrLEcE4Zpj3c71lbzYpywEM=": "1817180000000", + "j8lxrZO7iIFgJ4m7K6Rxfz5PxJ5d03lQ43ChYzzQ5iE=": "578190000000", + "j8pw3V9c5QXLHBvADofxKnD_AkhzqsIRVnM9iUeuGjc=": "1777883000000", + "j9CogT495qSwI3trTSx5OHMGQbaiYmIOGTF1YTobnCc=": "909090000000", + "j9PReNCcPjlvoDyRBf17uZY8ftPCYkwWo3QooF3RhrA=": "1233690000000", + "jBRokocSFoeu6XjZevKC7ThwK4VDR66rUMGCmEY7n48=": "378257000000", + "jCMnz76PuCK4kzhi5brw8Aa0qVdcVMwKuI2eX00wEjU=": "1510256000000", + "jCnYODVpw3XSTdFIcyp4mkdvf5QmktPgAd7bqCkEw0c=": "968105000000", + "jDBpBwbPpYtd6xXmupPW7WGBs3aFXe8QrqPf5zmi-nE=": "451418000000", + "jDJnuUHIQadMDfS66IdM4hvy_PIiUM4UZOhX_Z47sco=": "12993543000000", + "jDVxOnSZquuKU22yc7CT-i0B44fCiErelj2FkkqdWTQ=": "4166739000000", + "jDfvE3ze88dgV6uQVEEmcx6K60nap2b-s8DS0mIkCbA=": "408021000000", + "jE35AKIJBoun-PAOS82uXwK90ggbF_wjGhDHd5rc1G0=": "9795194000000", + "jE9J3ZCtkqcsOFi2HyZGzrn74vTdbynrj7uHRYOyiBk=": "384759000000", + "jEIqrATkowz7mT5f2p3yrxxwycEqiSNLHAIlvklQAsw=": "8333241000000", + "jESCrGzMDP7QwMydNnkpQXQuBjdgBhFCoDrmhiCq8z8=": "3831545000000", + "jEa4CqQTR5-XMw_xcBXSj893aP9Wqq2UevlBHzywDm8=": "407808000000", + "jEmh5XT4AYNmDZBSG5HKkyZRnPSMHc2QGIRPKI8P0AI=": "451935000000", + "jFSvaTCKXMU2O-2aU7K6Zj8e2ZZ1W0p0Wa62H7L6oHY=": "379667000000", + "jFfuI4_v6w_zkBlqWqvDv48vOR06XSwaxXbOs96IIu8=": "1411758000000", + "jFsHxnveizJrDTXOsKcSQepX9a8Z3iyi5_wMu_52sG8=": "576923000000", + "jG0KTljL3uKOH_rdnuNOg41XCmJe0BUV4nQ-dltBUGg=": "455234000000", + "jGau6-u2IL9feJbARzwBnepmD-AgE5RKSYebj5hkDb0=": "385507000000", + "jH-2kjoJo1PVGy32J5NOZVuatisq_4FGv5gOjxLAeTA=": "770637000000", + "jH04_EG4nLWmV4ZspGffC9sie4COmqBcMtMRY5bmibE=": "400250000000", + "jH9v5DIdUkycSqMqKIwWmNss3LVtmUmRM6D5owmctPc=": "446818000000", + "jHTAUUQOaZegjFMaI_flYyj3UR6d7Ac7WUi9a3JRNZE=": "501408000000", + "jHcJEbd5ZGl-gfhXBvhLo2WY0LUhGfev_dpyN4XU7Hg=": "2940501000000", + "jHeA5ruA6cBnEMlWj3PO-a0lfgZfkauAr6gwsqf0hwY=": "4166666000000", + "jIPqjlTofyW_hbfHWu9U9n33bL-P9_JveBb0KIf5Go4=": "844090000000", + "jIZJDYjIt4tm5aYYsygUw0bCYN-mbWUHsKLEvXtXPig=": "454340000000", + "jIsDtWe7ZFCSTSkxOinpgUkGlXk8eRtdP3Nbrr1yYVg=": "387334000000", + "jJlzBuZpTy_Y-YojvzS6Ll0E43HCAmW1w1qTH2jtBD8=": "411003000000", + "jJqEl-dwmfgLyhJOsomYaDF2Es5Wg0qbJEnLeaOKgcM=": "405225000000", + "jJuD_UCKRhXS4q37PDriZY0BV1gpT-KsMq8OvOyno0Q=": "413368000000", + "jKE-R1nJBG9Lyh-l6iJhXwBS9xVyOmzDiBvVnejQzbc=": "460037000000", + "jKRq63i37aB8PnkkM1WNaskufqijzXsnMz95wQhm39c=": "2500007000000", + "jKTlMeVeSMY2Csiax3Ynsy5PQzqV2rRnM7uuqAGE_XU=": "4138490000000", + "jKnTe1f17gs_QYkCLJNn582cuqqfq8Zefeh26ketuX8=": "1923076000000", + "jLliB9h-H-ZoU6e295QZnY1muFj9FBSCcbY5iqpt6h4=": "385211000000", + "jLvvTZcrAu6nONOGlTj-LUBbB3hWuKRQY0eh2lKyMxs=": "18407115000000", + "jLzeUkpOnw441nT-zAY9cgpTV6aZ8VD-7ubiBmA_Eys=": "2692307000000", + "jM1DejbxeOFSR2AyX5Yn_racN6zOLkOJp1Cxv2wdqXA=": "7694886000000", + "jM1RxRJJppBzNDxwJxLxDoglyxMMzeRIWTYu6DUEOJQ=": "921133000000", + "jMmb_aDP8RzKvVHSm5zHRripipKMbCEP6ECTf-jABOU=": "390437000000", + "jMs68vCCPIkh-o2SybihPv65A_QT67vz32hKK06lWaY=": "451748000000", + "jMsmonVTt6UBtzL-lQISM6qiiRcFxGjxbDvBnHdi_mY=": "780916000000", + "jN2LzJ99qXs71Jn5CSTFjbLhf6Gc5aIpt9wZSy18_-g=": "739583000000", + "jN6FwUAei4F8ICFCocTWWNm2k7pY7DtRwmuiKZ6r7VA=": "1588458000000", + "jNPnSquRI9yExNf7HTciXE4UIH82G2EjsA_gAcwzC1k=": "382686000000", + "jNXwE2JcamR2PIJqPCZAC5LEDSFqQgOHJi3uCBPr6NU=": "3855074000000", + "jNhmHquf-yiJbp-eGGakWIelHsWWSssXLUiCDvWi_zs=": "807019000000", + "jNiHV4PflY62xnwywXIHbvlQiHg_22Cs5P4QxMVcHz0=": "454501000000", + "jNkD_0JpeuSgf8VG2NxhRfch5TKX4dMDdcIFn0jsTTg=": "384615000000", + "jO-aUhMsjSN2cHo9rrJe7_i3guMii0BOmPzORN_khZs=": "4123464000000", + "jO32sWRqtGsAMATJY5jvzRG7pUhtX6RairoQP2LWp9s=": "387988000000", + "jO8ZdcSX7UfSsiguAMuXfcZhIGkM7GcRUHRoqPy-tnQ=": "940620000000", + "jOdlyUR48B0f2cf2JYQJPG6HkfEEFS61h2DtwD7wKlw=": "829237000000", + "jP-hZnGM6LPgR2Bi-8_LpItEzK_yrYpUTHCUa2VgYec=": "1607875000000", + "jP5ajAIDmxapzKWG1mvvvMdwxxRG_owKUxA4hjuvy94=": "500422000000", + "jPB1RqG8uWPxaVBrBI-SA82TChoodT2LysSnQdR6_LM=": "458244000000", + "jPCpHBXhZA3AalgaQvCCtlR8Ub0vlLseaT1SyRSVjCA=": "455600000000", + "jPP77MpKWMk5hXf_XYcMfqqxzGFLZiXYKDPhpGWrDCQ=": "1927545000000", + "jPbVxkE5owVFiGI0TPNXdJ2jVydtSeZUF-bVWg4UkeQ=": "385510000000", + "jQ05cs1W2mOvbSS7MvctkhKCWkaBPYXYI9xjHlE4QCk=": "867257000000", + "jQ32LedxfU_MeetoDNUBsmXXqgWkmua8gWlLcVoEwX0=": "383203000000", + "jQl_xraiZp2feEq-WT9mYZAkI0N8F08Yx1qea6GB174=": "419094000000", + "jRZ_2Tey6ta7onw1qS31TFSFRUxKznEPCsASR5diDIg=": "3682333000000", + "jRjTwNHa5y2iYLl0UkaCY9QsRREt3Pk1w6zC0G_cfS4=": "384903000000", + "jRjlTytG8jZvYzgN60nSA8JuabCnCKJkQBIyjBRqrk8=": "463042000000", + "jSc0K5bWkh7gkiEt0818kFDQ0G8csOnv4L9OQXETDXM=": "1871509000000", + "jTApKSgxuGqfRidlNoRF6IxPBAo6ohr6OCcMyrGkSsg=": "454916000000", + "jTF-QtKEHdCTO5clGrDfvnmmi49guqHOAFVbYaI9wF0=": "488247000000", + "jTPoAYmP64aiKDSMmYM2XZIH4rqrikpiHaIGIE1X8XU=": "8201193000000", + "jTp1cO0fjTmUDavuh6sX5ron-3mfqhLzERefu7jwq2s=": "500041000000", + "jUT6EVoutsClw6P93jg9vxamdwdxX_eoZy69L66t5sw=": "464525000000", + "jUbAbXemguU95D4o2UQTG0HZ9AQSTP-c75YPZKpfwiY=": "378257000000", + "jVJU5sC1pMNjujOiFm2HpCWN_0vC_K6rn2SEaTFjuNQ=": "459482000000", + "jVLI3_5XHDMcoox3fx9ysqB6J4SLIM_tHIY9ncO9f8E=": "1363636000000", + "jVP8k02Bt6yg4bWBPKL6hSa0cKVkMQMfVGAk2FgVr-Y=": "5202028000000", + "jV_n12JEmG2aAuZnYoQwAx2In-TR-a8XAczru81tJ5I=": "1927554000000", + "jVxw2ROPPvxnzEgOdRoV9pq_yPMHD_0M-ql9-gvnhcU=": "1154647000000", + "jWbD0Z1piLcOjm9j3hETurUA6TLAkM9iDEscgxXmGms=": "2308421000000", + "jWrVryKJFpjlrFcp_6RY-51Ez2jumXic2QWULLHOSu8=": "444665000000", + "jWwcYc225UuopeguWazLKt1C4bKH19mbwdKu0cwxRwc=": "961538000000", + "jXX86r1_0qiocuMxABQEcK0fIs50J84O8R_Xssccm9c=": "416666000000", + "jYG4O5r2fmNnMs-G6DU0qMMza7hi1Q4c7orM6CcndHY=": "467124000000", + "jYXIv5H00ztPOXv3B3Ck4RoasKGDCU03csFVqmd-7x0=": "454689000000", + "jYdQiorYfrUUgljE5Mc5ryDx1Cobp-RlwPBlYhIFu-w=": "891569000000", + "jYimaFTxrbx-oHhFsxPUUn6C9fxenOIdacjHG77XnaU=": "13755642000000", + "jZKO8GuWaml9EVgrfh-3SsUlA7yFCuwPgBLZ3aYFQBc=": "1536544000000", + "jZvRg7zSOcXW1HJUc8RcPYgYd9HVEpvDWOKjJrhpzjw=": "407564000000", + "j_kSkf00zOEccIvqz-cJMKcUgPpJ2MHEg8gu60CZiHw=": "821937000000", + "jaMbujVbXAHMiucfqYSr6iU2NHGz1sAPUuufgtp17IM=": "3848873000000", + "jajmMl5nbPPOJHRWZR8zaShjjvemCdI5DfShlN1kn9E=": "907494000000", + "javvoRF0F4R_4Eoet0VeaxhT33M0KMxjgb_Y9OayStU=": "4583316000000", + "jaybImNWln_quwN3xb9wUHFZOlfd2sErHrpoIYXSW10=": "1156522000000", + "jbcAWWWj2Bozm2IeaNUmtHzdvO51jhaZNGVA5TwxM54=": "1865265000000", + "jbn1f9mMQpJJFLbwQ-UZ4TgIAOyj3ymiA07fr4Lbw-E=": "2040105000000", + "jbnM8IYjLbhf_yMQoMbRkPi8k6geaL0w2kiuS9WxqRc=": "379873000000", + "jbwaLQ_Sx4PkdwH5pUZxzbfl4v264prxIVS-JXWCBQg=": "451823000000", + "jc0IS540sY7KHy5LWgi726Ab2HHsIoAKB4xhcoqtvWE=": "758618000000", + "jcT8szFEhFBtrw1zsYeSU1SVKl_GnoHfB1mgjfyutUI=": "2004151000000", + "jcTFWvzOmF8EYEtCUvrusopEfrnuvj9nnoLRd1sR1Ig=": "454545000000", + "jcg5d7e3y8GfGgjShczeg-9UoVT82jg5rOKi2gFkbD4=": "11945664000000", + "jd1U0bhzBz3lV93fNoBRvVxGtseJemq-S9wqRAb9xbI=": "411085000000", + "jdVQkgD3yqb06VP3gMWOlvR_6jju5xpLN3UZUoJISGA=": "851273000000", + "jdWTbDfKIBiLrtOP-aFKyRQKbQQh1JFCfyDhJtReAjk=": "6701451000000", + "jdcM74pJ8HWrhjoxNf9FaKkQ4f54gFWZcLgmvHzt4rk=": "1927554000000", + "jdd5ldd51VYrcZS57QBZEBWmw1O1NZGIewPsMpeOsDI=": "16923076000000", + "jdwQmwBI3HDCGRPG935EV7hmtv7fot2xw_mdLJEgKIk=": "416666000000", + "jeaiSEHcJwXf-QWL9yA-7E89iAUjcqtFdEXZmQCT5ZI=": "1955916000000", + "jecnr9vh98Ej7XQlcCwp5L-4Pz-ZSyYAAi127N_kCds=": "457978000000", + "jej501QgzFjRJTIgo81Zy5gLfQXWMHLv9M_cn5NeTVU=": "411085000000", + "jerjElrTPIDYintM7iTXiesgwi-_g50ZgE70Xoq1dKQ=": "383054000000", + "jf4o4sabEuLJcS_q2GlhbIifYqyx-xG60OE54rG_V-g=": "446388000000", + "jfHs3OC6JpJ4pdtHdePkpV1XvkkO3DoJ2ANd_IchQXc=": "582141000000", + "jfSe4ECd12EsVShFutb5tzx7jpG4L4ty7LaoAnSyKVM=": "380958000000", + "jgFaMnnMDVKVUepn6X8BNIJgOuFOOAXxjxS00m7YeTc=": "770406000000", + "jglUT1GgOeIIt8QtqzcgmKnal94MqPid4WPr80KpUP4=": "3228393000000", + "jhI_00-PN0fyt_Tx5tXXo4sLWz35EJCr0q6LeAL10Og=": "385510000000", + "jhiixUidiBi_pCVe9_QE2kfBbjHlLXNyGwSQkqUOmIo=": "622675000000", + "jhn1XiVzU72cOf-dRqDGd9bQ9zr5ZTxZLNHj_bmQqEg=": "3750233000000", + "jiAMJSROjwHw2gCpS5IEWsH2RadxaijuBDDZsdPI1Go=": "465692000000", + "jj3PG98TNi4x3ubIrgNxUhjcxCYn5d9CKbfzxlXL2_A=": "464564000000", + "jk8iO-aalnmVlo9cc5lYKokk7nf8gbPGSKsXbBuGsos=": "462146000000", + "jkNACTUgutMYIuByF5_BCEJURILDf1Jh_SSalWzeVFY=": "449246000000", + "jkTli1kb_vekxItQxRfvWBj0dxxvD54uNKi5h-2M6xI=": "383990000000", + "jkc_cldnWZp_rITleTBTLfJN1YfleMcTNLT9MXxdxqM=": "590909000000", + "jkuSMOAIxUZw7-YGl0M43i3poniWXLrRiWRMbj99Fq0=": "385506000000", + "jkwky4h2xA726Ynw1E3COMC3Iijm6X06mZDGPTuk7oQ=": "384360000000", + "jlNb-gXhRPzklxFW0RBjJonGEohB8OAYROYnC1LKIKc=": "507587000000", + "jlVJpMYc9x6FkSBAZXh-HMrfeRmx75J1u8QhOfbFFPU=": "833333000000", + "jlsGgO2dn1g_FFG7twNYsJBkLRzu8FBAKUwLzyVrZPY=": "386615000000", + "jlwumGOYZxF2RzDPUnbqsBuhQoBO1IbUDYFaY0gtZag=": "342652000000", + "jm1-vDeZ1uFsM6o7Y0bhP14n7vnQdV9_z3F3dqLo88Y=": "383848000000", + "jmbsg0dK_4_J_-GKelAHi55N0YYxIdW6h-xLu9tgPnI=": "384370000000", + "jmfiFQZvmojpFzl3-1wA8MFUZvMvqE3nkzOxSbdoRlM=": "407609000000", + "jnA0CKsX7nBJ74fY3JuRhsuf3Fc_Q0OuvyG3iXBKOFM=": "414092000000", + "jnOxKL-YQFVqZWYEoMaF1g0YKxFob0Inkh3V8CS0w_I=": "982065000000", + "jnTGA8QGy8G9aO1LcoR4dCOWgaZC_CD8UvBgXlF6Mac=": "3498394000000", + "jnq5s6n8F22IBllsKB17XdDj4TAaHV5WbBkmVmQ-fJk=": "384615000000", + "jo-74AYtEGIjHI099tG95RSAhXC52TGcKBvmpc-gRRI=": "378717000000", + "jo0cjwKk1JtmBwjiTsRg3wm6puk0YJOWINNDXAQCYCg=": "3923424000000", + "joMVrjxzk1JQYWoqd7vojG75QBBzpdtNkRioO2XYwIc=": "565199000000", + "joRrI4A0I0wA26xgRTNJSjbOBMsO22DVQfXvZtDsFFM=": "635529000000", + "joUgPVNAvNd9DYwg6O3BZNTnNKKOWU2g4TX3vpoOYKM=": "5464090000000", + "jobZUT70CBJrSBAkFVWHJZl5Ko4ngwp9gduoNQtdJhE=": "446947000000", + "jopjP9nwC8Pme25q1xOXyZxsGUhRqxedHk2UOshoJhc=": "769230000000", + "jpGB0K-bvNik6LZpuSmd5zjl-Hd1FgAe6dB_V9e5src=": "762905000000", + "jpNcxv4ugG_l55sSvTF1B7azZjcl0eaV3PzwZGGNEoU=": "4731808000000", + "jphXKbT3QT-uvkNJ9Fbclvue2fP1ykfF1J8STveXZqQ=": "3283811000000", + "jpyZd5h1UeLYlDhVoigJd9PsswyJ8VpZ2sR4WVkZZzg=": "22729454000000", + "jqc-YpxS-ddLELyqu1LINDrnbIVVXjS5umBtYd8xtLM=": "499999000000", + "jrFUxlY-mu4SLRt2abOmGAIKrPCFdpJSlnbeNAxONQY=": "2889028000000", + "jrJv08b_KGMKdOA4YQVFEY_Om5pN9XVfoN7AowXiQgs=": "480769000000", + "jrjLmtrzYuWtC-FKFWhBfeEpl-6kvIENY15Dt8UeK5o=": "485340000000", + "js0sZZDDjNBGpGn2rxO6qebBnDIEpQLWaF0i9WOo1mA=": "3855074000000", + "js1s9HtvDLU7o4b0ORk-vNpOgfUGLqlicfMTdwMVEHM=": "1504838000000", + "jsFskUABbzbt1TRvXk5UPSjPLEhxugM0NpM-fIjvoMY=": "767992000000", + "jsGHQ0ugFzCKzX_8ro8n0U4yUkeKjY68WtaF1CgUR4M=": "769144000000", + "jsGjs-7xMFUH6htSyvKnCE-B1QYyZxmX7v1e6wI2mD4=": "384615000000", + "jsISsxt11j-Abbz5USkPATVqsXoifVESNtdbj8Vk8IM=": "20937335000000", + "jsMMK8cVUeqjMyuTVJ5-xUNfH8CJTgoX-dlO7vEfKhQ=": "769230000000", + "jsPcigJOOIBUsCOKvdPOQvx90ZC2X_F3G5LTPugkLKE=": "460976000000", + "jsQBQoE1oW1UJDT_LjTiWGc05oNtl1K1jnzlq2Nmxss=": "411085000000", + "jsSQtQHuV7_--teJoj4xfvbcFGgXro_Al1v3L7aw7CA=": "467654000000", + "jsVG_9EVAly6gKkjNatZDpKSDr8nLX6RY9uFywLQCn8=": "382899000000", + "js_D3eH-ZQz2UObJ6W1xwV5h2GTgfsKopmK835vciNc=": "6699951000000", + "jt4yIyR1QfsCkeEF_Vga1EecFBPxOZgPvYuxo0lydsk=": "459420000000", + "jtLR5LRFCZVwKw49-VVed-CycfdI3e0Ay4_LfD072b0=": "1923076000000", + "jtlwEEO8HO4fR8nKcg0ktlgDchsSSYmvDq69nWmlszU=": "514382000000", + "ju_Vw9epMKVmLye9FxOnMguwRKjyHq-F9VnHxBPpxi4=": "470143000000", + "jumIhQJcPOHd69KFQTBvozu8xRs3d7Bh8wI6HfsstzQ=": "479574000000", + "juw1AVkr9o7zU2Fl3TVEH0taTA6dlk_RtnpCi8UGwo4=": "1149292000000", + "juy15jX0P3IRJ9e1KPuE8nGx7RNGzOCNZDYZk4f-LeM=": "384615000000", + "jvVSr8EslzkPPSV5LTa_SOmf9INjD0Qj2b_QZuEyM5I=": "385505000000", + "jvl44OF-zdN2ogRlLR7eVM2rg61MR4srxz1l9cFutI0=": "391797000000", + "jw-PrJwwVo9csOq1QxSS9Ap-pCSsVBsfP88oiwvW8LY=": "425636000000", + "jwCudwqMiFcefXyM4UQkv26qMR_Z-teGIlEt_iMyPRw=": "385505000000", + "jxIov4mnGAwPeovemhpSgzMwJzmh-Lc0jwshA9mbfyk=": "1366800000000", + "jxadAmaS21d966gUd6GIzMc3S5HbZ1HKsA5kRTkaopU=": "908511000000", + "jyl-hxu5ZXj4Z_wZYewNnhLJGODHy2_caLWFlBczkVY=": "459850000000", + "jyuZk50wRB8tNf7rPnlm36Lwx9VwtIU9KL3tS1vR2JU=": "3284615000000", + "jzARdNzjmm20E-8b4Xcugc4duLibqOKopZUd0BRLT7E=": "385211000000", + "jzSyxXKXZz-s4n9dAZVmpF80omz3fFZry-afeywDCqs=": "2478666000000", + "jzsW2a5fWvsYVU0Eq4F2Bxw6-Yc7r8_2GV1HE96FecA=": "1927529000000", + "k-5RWKBY8AupFBZoe4orHVLP1e9ssCBuiJtEuDNoc0g=": "1923076000000", + "k-E7-sybN5nyp4NPiXbdVOZvRN1MJYryZMHi8c_opdw=": "416673000000", + "k-ISNF7OL5aKebXEV2SoULfPvoCAigcNxJhnl2EmHeg=": "766000000000", + "k-SWwmW9Iwzjj8XzE99RQfgvxH45BdxUlI-PQdWefBE=": "385136000000", + "k-j9l-SgohW0I5fHh5N79vE0frN_DD6IA0OvjVEut5o=": "578409000000", + "k-nVqoIevCq0Ax3ZrickEyS5quFEU1xLK7MsZpT2boc=": "384635000000", + "k0INK7dDiLSG3T9HNvR0IB4_lZIm_WzWD9eD5ds2Ecc=": "383810000000", + "k0MrLscAjtVUGPqCuHWWCrBywx-TWy3VQ8SmZqnQr7Q=": "4891849000000", + "k0R6DK_kw6jEsqJhNQmBHKSXV3ckRJ0FDLUn162WQp4=": "1923076000000", + "k0wUnigl3UiH4FjU0PmRjO55TQMFU26uSYdmGGipD0s=": "423370000000", + "k1XOnaeUffhIeZ52fjvYSevJen3pgeOhiUiuIH9Sd7U=": "457174000000", + "k1cTR0tbLgikjXxf78slqvlKzBn_GxwHqqyYc1OF_r4=": "384128000000", + "k21xPuGgPOYW1tSrLpp6V4lIRdp5_uTknx3E4QKx3Y8=": "451381000000", + "k2GNiG9jK3RTjcAFq_3tbj1vcqaMIHR0ndSnmedpgz8=": "3405325000000", + "k2Gd2zFrk6bpGrWYxkM2zWSDvbjrkok1q6gtBp0JMvg=": "385492000000", + "k2Kzda1u3NDPTO3-pqiKQdCFaqm-dW32TTmaZ60WXMg=": "3643426000000", + "k2uAG27slUPJNDCabeHLbZbh2Fy7H_u3RX2NJBvSUc0=": "385505000000", + "k2yTA5uilLuaJLlz13aEpsyJItMQPip68WN67g0ewHs=": "384615000000", + "k3JzRNpPlXfNGd4vANZkEPP_VKWNoleI5bjoNhxwtlc=": "6224837000000", + "k3SXviDslEJub4IDak-P0GeeVL-ZSKXVnQZlEPJLtPc=": "3360792000000", + "k3jCjsMII8m-nO0qx2JtwZuBNdJvQBlj5CFyXHS_v9s=": "423368000000", + "k4FMO1F4dOzrYTuWWDc77F2_yp0uj2KlfEfIhRs7kcE=": "416666000000", + "k4uxCZ-ePuJcICsXKy2A_QqxrBfbteD_riE9blzOpdY=": "472496000000", + "k54QPaNmcLfOFI-9Ml1aCH30uvCtT43MsZm-PS7ZCL4=": "393573000000", + "k5SXEtWGgwK9mUtC4ZsNmI4APxaftBUhkj2RuW1d8L0=": "1560955000000", + "k5UKmM2CxpAWsxUwhudLfcmAAskoH-pAXj0BA2vsJlY=": "1128143000000", + "k5YbWCXv6N1W_yRdvFtkRxB8TIg8Uhf0C4DuMJwOAfU=": "389799000000", + "k5kCSYtFbERDEObFJFUqTEy2ImTnnPbEV9m5svmTm3o=": "4022018000000", + "k5xGRl2KHtONIymqSHLmCuPoIz4H2LShjO7sbmgf8y8=": "1153864000000", + "k61u-dfksXBRlQx5a1Esvjo58XTEShd8VYyOHrdcYdo=": "451869000000", + "k63TKXs_RRtLiqgN3rNrTHCx8DPTaQUoWZuwaGJI6zg=": "2083333000000", + "k6Gv_PgdppxfzNBT1lkMV-jnIIyzJok0d6_sXXJeBbY=": "2470761000000", + "k6XthLw4EtvGz3ulYOtkHZUudZjc1T1isL5hBw8xBlY=": "510548000000", + "k7AL-FOu6OrTywEh_sjsLpGOQgl4AIC7Rq8BuqGVmgU=": "2064435000000", + "k7EFxAZRty8nVD7rscpP2z5hQUalA2XHp9LeogYnQQE=": "458901000000", + "k7E_tcqdpnDRL2PxnysskhmUntFgzLHWxBxKGhdKg8Q=": "463786000000", + "k7FXGC96L19qR2-ZoFDIpOUcrDUFtS7pgSHrHr7dvic=": "385644000000", + "k7NjlMQj8Su4rLN-RDF2Bvn08vYwL4_ziMvYPtFRw1c=": "462628000000", + "k7P0Ikn7-7AZzglonvMa0E9dvpgQ8x_EIq405l64hjo=": "902075000000", + "k7djA1UykUBO4uTZWzCfcUi9wsa9mOsQddnpLY8ZiK0=": "5769204000000", + "k7hbFe80ibJ2jntee28ay0vw8K6EXsv2PSmad8xA5ak=": "384615000000", + "k7lV3GFmQAogPYWCrGWtpN1LwCfeO9D-DX8Xe9DFCEk=": "411085000000", + "k8X368ujKBDdkAyLOqciQlcTlH7FDP6wz3Ep4hqHJ_U=": "411085000000", + "k8iV9OFVxJR_qpMOwjWY7E4ilX_vUTBDD9crcRxiK3w=": "21984855000000", + "k8pxUHyIVkjZKbKGMn0S-i1AX5barIR_VHSA7imyQ3U=": "465692000000", + "k9VnW3mhyvLdPl2PvZR6HMTM7F2nzTU4FG9W473v_2o=": "769230000000", + "k9djO2gn9kFWORK9AfbkiPhD7KtgrQHZyme3xHCl804=": "771450000000", + "k9k1PjCRGC82JVWYLVMs5JLJvj_dNELPgpt58VNVv3g=": "8247981000000", + "k9k214QywpJBx7uNHp0duE6N_ld5oNvbLFJj13fo1Gc=": "3839630000000", + "k9k5QGdb2a8pR-j3QEHtNf-eCCj8Vo-7O8F4Px9F3eg=": "1553090000000", + "kA-oQorePZUAVhaLXHs7cFkOxcQbJ4Uwi131AXavyS4=": "384615000000", + "kAGMMsMf6TxSoWkarn-BIfAN4rcRt4q5iCuP0vSfA2A=": "383454000000", + "kAiZS8ZSEtYrpnUvvr8t0-PafhAZMg-tdNwt1yhMUBo=": "384930000000", + "kB0eNh5ZxGqBYpMEA-bwSCsjznYqBNo9FrZpJ5hIGhE=": "377818000000", + "kCSKUbp5MN1-3XCE1qQgZZYar0yuHLaLIyZ92xTQhKc=": "446263000000", + "kDAf6UIKJoNx0o4tT-SKVlApDCwTlunZKnctEwKNkpw=": "384615000000", + "kDGz_CVTAQNkfx6KX0AuMpIunALB9tYuABBoyts3Zl0=": "407469000000", + "kDRCHCKvX79BAG82K271SMLTgI2vlEJgt_qvwiEWDH4=": "4654118000000", + "kElfoRt6396VqyD-o8o2lbfwWdiJG2u02J848YS159Q=": "1634615000000", + "kF2BxrqbGqdHLOhidN3zwfXa6vFb2aU-3dQ8h1Xm0xs=": "454545000000", + "kFI8Q7s1Z7hWeaLie8zGAY5nOjmT9Wz4nxhHm46tdFI=": "1233257000000", + "kFVVWEDyH77j8Wt5dWY6yOPeQJlP-VqEilpA9ex3dPg=": "2630297000000", + "kFhdWp8oi_UAIOeTBHBOxNmOiL-Y1xAX9g9pUR1xKGE=": "2496524000000", + "kG3g2bHPGbIhVELgtz8pPyKI_ECPUnrI4A-YiqOdjVA=": "917138000000", + "kG68IAq2PhFG39ZKS9txFtDNumQREnLTvb97zea3Ruo=": "4567182000000", + "kGDmsAhLFI_x1RAnZKr7M7tA5gZa_zBtgCnQuXjRo6s=": "1346135000000", + "kGKYO0QpPqouZCpEose0JbX_XaqQPa2naJs7qllv_3c=": "4145511000000", + "kHMPoS2tiJZtu5XoKY4h2p8HYiRY-MrnU78l8KHkg6w=": "377692000000", + "kICrJ7IuHIxdP8kZ96rUZOrqZaZd3t9avRE2tiOmCa8=": "1349235000000", + "kIYRHrykX-mVSOOdDn8tl4u0OX9xl1-sz5lfZH_bvsU=": "1157097000000", + "kIchqTKTL2APmQ_WFrvpZAjopHjC_jjWWEL6zb2BaXs=": "1923076000000", + "kJQS7gVUpJj1wNXu2IO2_ZG99XyZQcLq5_L8-N9Mm-s=": "929316000000", + "kK6q7QC_1LsKWZz8m3Go9JMC6dyLt4HtT2frO97BZpc=": "576725000000", + "kKGlZT1mmRnoOYZMAmgZPUGSN86HRREt9pgWPcylnj4=": "769230000000", + "kKc0oYEvAqexUlm3zEkAhAFPVYEaOcWOqbZO1rqwK9s=": "2645417000000", + "kKxAJTnf3Nbpt1R7fTdo1V209_WEyNp1aGIKXmUSBzU=": "2055429000000", + "kL536XzPQeek8DH7sDeb8k47bAeVeF67rALmEbWPtgA=": "385505000000", + "kL5NQQxPVYZtfLb6wU1ayyDrMF09VBZLPBOZpTbdCSg=": "499982000000", + "kLKQSC9odvgf_z6rM45dCTVBrOVSwxKU2bx6QB5juxw=": "2268104000000", + "kLjtsdVB-oYR0g5OhKn15hud2eAqYkT1zxXY3eW-guM=": "1315545000000", + "kLntdWHwpBoMVUIxETTzPXyNHOmQIkA2uuz9A45H94I=": "3764833000000", + "kLuOmS53h24ELibfQLZGYB3xEu12iwbilODjx6Cepb4=": "568618000000", + "kMDNdVkkGWl8OrWvSorFTR9HMDvdnO7HZzE9B0xD9fE=": "446725000000", + "kMDOCGFmE8r_aAv3BTbEYTbARZuBJpzBSww5REfCVrg=": "1874111000000", + "kMIgyPhCy_u6WtgW1uf_5SI3VGfAeOi--zm_4bGYXcM=": "384201000000", + "kMNkPur_AkZu5QJpbwWcYAPeFVll4OMEoqJnq3zvOnU=": "384615000000", + "kMm16vrr5jnS-s7I9Y_cUrN_FqJXWfolwgZZRppVFjY=": "392602000000", + "kMo4xJltoYXAM_iohlP-Jyy0k8-0gTyaSEZ9esKbfVE=": "451692000000", + "kN6enEMcQdno4dFGpyi0_xzMWWzMgF5sm7GNNK8ZLk4=": "603076000000", + "kNCnzhkz2aUCiUA7itF9rNTQWihYpUdXqdHr6fkx5jc=": "387561000000", + "kNHpzkqxmyNLfJ7_Kqw6j3n-7KQVv3YLf22cm4Fp-oc=": "393464000000", + "kNdRA4WGJnaBwMDUpECrba-NWffkobfg3LcEVuEp7so=": "1565026000000", + "kP5NANK7gecFZAmIKkxpO9LWKUFlzd11Vm_SO9IbifM=": "399090000000", + "kPFV7dQ0G3r5RaFKzeuhfMsfzXnTeU1DKggXrW9oPA4=": "59999882000000", + "kPIP-JTYJqey2e3wl8cFw2H_VJOTnWlQOKGW9K2jHI8=": "411085000000", + "kPMGZS9niOQoWWD9m0mwqSLA0ePd3_BTE3ambYz48Eo=": "25814549000000", + "kPSf5Xq9AsvEgFFK1hqPbfZmLz0oAYUw72ftwNzyEes=": "400219000000", + "kQ0wBFmzZskU7C0z07Hoj6ph32XtgTlGABe7v3_jqYQ=": "384615000000", + "kQnCCiWMCxyzomABUmMyGIK1FXyGW2SPUl9EvXsUdzk=": "481155000000", + "kR-kNoB5Wws6qlVL7aonvyYhqfmMg9uPaPITTPpCZlw=": "589958000000", + "kRCMRne5c_obPmkU7nR3XAnygqxATaQl1KSj64G0EUM=": "384615000000", + "kRp9YMAyLSa1-tvqWTlxB9sdJUgghd1mSEDswA6Il7o=": "383024000000", + "kS8D-Jk2yGLKWW-sTmihSfeZ6pzw89HyruRJJiUI9so=": "2688818000000", + "kS9k7NP3SPVZlU1AVa5hmJBDQwMElk042rgDYeSo8rY=": "1126941000000", + "kSbIqKhOggzstvkHEmCKsWQFbQ123AqHVvSxGun6zVk=": "464300000000", + "kSvZvqvh8Tdi5Gx_aWzjkokqo3dsISrUjID-hdWxzuo=": "459483000000", + "kTI4zzg6NgDTNL7NRhn1Tn2lZQTwo7WBz707LvdcF4I=": "458448000000", + "kTJvteAJw0jkAPEkzeIZ5JPRK6mAyXJ2xO4CbaY_xHY=": "454445000000", + "kTPg3MnDMlwkJn_QRuMZYRLaJhZ_2Us1QKvB_FmSWUU=": "459633000000", + "kTQotLDFzFC3Lu2Ls2foSfOWHb-TeXkQ4RgK6j3hQMw=": "1538461000000", + "kTZtN52BPGbTwGJn41c-gR9AMn1rW9Zbq5fZiK7idwU=": "912391000000", + "kTx_kDsfnESgUcYByDBcCoteEIdAaVWANahXoutSPxo=": "1057318000000", + "kU5sGPI4y6f5kZuc5Dy9OuGWQ81wywG2RS1fK9_ae78=": "378727000000", + "kUK65rPX-zNHwsvuBEuyR0AmXdCZXMVtxzv01dtF2ec=": "382394000000", + "kUd9uWha4XC-eBK6G22WFNNFI8uzvENHMp-0xbLJVlE=": "384463000000", + "kUdiFBVCASBmolk1ehp-cxSW0Ww3N2iLa-b_77wMZFY=": "445866000000", + "kV8OBtZsQKtxlYmZQUG6pniSwMSCVqgNQZfkWpbLtZA=": "2117587000000", + "kV99Bun9q3dn-f4Mi7ikiThQiX-OKtHXSjP3TwFIzLc=": "417144000000", + "kVCfdeYnbyv2j9PS59sx4cslS0zZP5LhXKUvFnXdC-E=": "833333000000", + "kVGWfXwm2P2ZWs4ZZL-ja2qDt0raSYnk2_Wu8rCBN-E=": "1309889000000", + "kVIHQ2h0p0JnrLn4QcXAiIFZrvXszKdltU9Vf9CAWQU=": "384007000000", + "kVMfek9zChdkJiP5jJGvh5S1wEQPab7ijQQVlkm2rBA=": "463604000000", + "kVXa-fwvLSN6D38W__wJGz7emAWeSiMHOQpDVZ6exfQ=": "826822000000", + "kW6pfPmyRSDvWk-fo0tV3h0EhxefXl8ug8X932vc1F0=": "1510326000000", + "kWPmRYBGRZcrvXu3DWu6ofhmSoq8o1NKqaCiopEUomg=": "576923000000", + "kWv3FSd-d_gb3YEUr6aYEg6SHZd8BdCdTr17ktfZdTo=": "448457000000", + "kX642aMaJD4P55wwKrQNZYbX1MF9W7noJvLCbKuSKB0=": "1076547000000", + "kXCoxDcoKLoPQJ4wZiu3SmhY2LcE2QJH_kYSjvr3k1M=": "385023000000", + "kXTKuTtrzr_w9GI-nv-KHMDjg_khw0MTTXfx-H5Iz14=": "452141000000", + "kXsStJ-Fgkx8xKvisvlfBTo04TA3KeKmLR8QXzXYv_Y=": "1156522000000", + "kXuHzc_D0hrWB8L1zdAw24YoBEa06l0GreqhnBumoM4=": "390053000000", + "kYA0ZrJTo9a9Vm6F92M2GU2Kp9_Rq7zu4syXjCliirU=": "452702000000", + "kYKsQYUek_oWgMjq2fczHWl1l8u_keM4lVRapuhIp8Y=": "11456160000000", + "kYZVcug-fWAmta-2Y-UTKQaDS1ytsxwzQno8S1hZWXw=": "2492381000000", + "kYcHjUhjC-IfYkQFCi9E4oL6bAm3HZyYLtmLHM61Go8=": "415304000000", + "kYvbrRpiyAqUDvllfb7WKSbXekdsZWckdEdRSVx3Jvc=": "384467000000", + "kZFCWCkLSIeZljkNTTwklLmHvyIQvijvJ5A52QP6UiI=": "11177388000000", + "kZguKcGCsau2Av-au30aNj-MmAh77AzAal5-5sVbP_Q=": "456296000000", + "kZiEBik6NnwPte74-utwcCpFmT5SOMu0PVkqatr4ZL0=": "469410000000", + "kZwizWuecsfjjmgjJFFET2c-MXuwC8SXOIDBXl3zAOU=": "4545454000000", + "k_7WWRkHQ9ljZ8aC5SmsyvmmXKGcs0OpnVLrYLOhXv8=": "1338461000000", + "kaZYyKE3kwlwIkVmDGKjScrEsSpYLMvdWOviVHo-9bE=": "564312000000", + "kaaTDOh6z8VCqTVdJZjMw8rEz6qAcbeANroxDpixHGI=": "941657000000", + "kaeyivdFUNe36Ks4v-uMFml7qU6OyDu8cW_Nv3IAcNw=": "12504173000000", + "kb0DlIo6lOxeoi-xhe-o9V6KB8pNALSpOd9FI2yCAUM=": "454545000000", + "kb0V4yScq-4llmFPvwwHTrUyFZ0EGRXeUsnDB3TmYtg=": "769406000000", + "kb8j-VsmvRagXVUztzeLhXdsSq5nvhkjzmyQtLE1oZs=": "454081000000", + "kbrHRa9jOzc7gZeum4gjFGGd7QcPhILC_fBqT-gTiAM=": "895307000000", + "kc6KP649yGRt2c41kEgi7jkUgStH4iRHCZOifkmRPU0=": "3846153000000", + "kc8s_a1z2pHm_smXBhBhaLgFjLYu8pmHXvhSFrwg4yQ=": "1563737000000", + "kcC_7IceNHQN_zuHlzrjdtU9ojsC1KqMqROpvsAdfUM=": "6622434000000", + "kcqHEhEKBQVGex3Vk6XcP0i-cdywwSOt0NAeWRv5cxk=": "2499999000000", + "kcrOGpZLx92W1y1VPPdj_iFTYkNuBTbaXBlm6hxBgY0=": "376909000000", + "kd83pjiS8zDl1Teh7SdODm40JBv4nifliYEZsjPcsVE=": "1498560000000", + "kdEoXeTFsQ8Igqt7haev50PfFuFmd0O8iC2DqX9SPR8=": "636359000000", + "kdJm5BVsYZJVBujaPjTj9-Yf2tZk508vjPuRw1SxnnM=": "384615000000", + "kd_-YQkfqkuf8CZpSRi-fOPCzzw_figV9GCrs4YQHTo=": "384615000000", + "kdjCCcghx7uKGUDA2auOwdoJDGDmP1M3btJWkV1CTcI=": "384930000000", + "kdjj8frivBHGnLCpY_tCTiqGzzEQnnPRenXXqjkYffk=": "827107000000", + "keMk-4lYFj07VHBdKupkY7_jy_7SDyGBd8bQI4s3wWQ=": "413329000000", + "keVICKCgzGdg6teIXwlHrUDC3QrwmH5dVd9OwYhsJAw=": "3854604000000", + "kef87pl4M_9TeGlLXfPsrGWkY9y9zYQT-VvGppmVOcw=": "416666000000", + "kesmdlkDO-bVPEzva-fI4yXNkonDz3y6SapWPfQGPrs=": "3786118000000", + "kf7HdnYQtOJA6u_7haiatnYslvNGik7VLdtGfG62KBQ=": "456031000000", + "kfGE2zxWfPENXJm9-ApQ2WeEfqS4qw1IoQBqW9MvWNc=": "834651000000", + "kfWnf3V8r3AvXdvVrYp9AQb4NgYlLCio6R_j40XTFRY=": "768095000000", + "kfXxelKEB-OLy20AxNJrBTBMFoXaTsxfWeMxRPNCgfo=": "462146000000", + "kgEfFGS9e_9REzcZ6JDtlqaaNYqcssE6ahlT6yZBukQ=": "769230000000", + "kgWhDAcPkG_9oMuosp5llgudS0S7VP-jTOhTelo3shc=": "769230000000", + "kh-XQhe6n9LKmQ7nmKZDzGZ11dGfbrB0u7iqai5JQGU=": "1156517000000", + "khBI8HzTexTL6GLdUa23xNcUp-3mI1gNcV3ygwjWCDg=": "1250021000000", + "khosdJxYLzcQOQw2W8Px3C6_W7yPIolFu0nI-Lh2dNA=": "384644000000", + "kiHfJbpTiE1BUehqmyOxQ1qtm1N-h33ft4e4VrhcG7Y=": "574999000000", + "kiTBkqaW_H_PEZDNWKAqAEkbKd-3ca4vxCvBJDCV-HA=": "416965000000", + "kijgaU1PNVaHsiOHSIZ33zokBCITN5brzxeo-ux_Vgw=": "451703000000", + "kixZnNEkM5GcCkR_6QVQvvz4fCMiZdfJ_BAuCrMFOe8=": "464539000000", + "kk4AvFyj_mgMgPcFRf95TJk-pP0TtxEHYBeeYzgYLSs=": "573591000000", + "kk8SKbESXi8PGmlbcevMrAKDYmP3FH4D7WWdJWRZAD0=": "452039000000", + "kkOGAQREhVBsGvV1Ucu_MZ1PQ7X9mqZtDRoMmUCOw50=": "1153846000000", + "kkjbtrsm8X780Wu5l2DIfCVfdsro1rM69kRXydNBJ2Y=": "416541000000", + "klYGkszPhEnF0_v-WgQIp-e84kqRUTPlcYv_Sm6I-iQ=": "1504502000000", + "klb0QP7ooi5F040PBaBncoagvxnz8wxg7dFP37y1YC8=": "453122000000", + "kluOAlsbiS6rQya4pbB_XTa3VGQppBAyLmXWAXsBQhw=": "12491437000000", + "kmBkvzgP_LW5qlgNB8zvmrwVvxsjFlv-HHvJtOyHlOU=": "1585715000000", + "kmQpaV1eJbRGyw-AbZnOxEodZV5nFRA797_2QeHsHdk=": "1662156000000", + "kmyeBNeBvxbtjM0QN9bA18WCfvpcXTsmupu0UJgsvRQ=": "4147755000000", + "kofylcPm0KHn_xxGduUUoa4ogUnCTQxFxbAE8eIXo9E=": "455600000000", + "kolvmb_w2MFBfCpnYKyNPVS5ugdLcxuuVwSEOwQHOeE=": "384615000000", + "kpINp7-iBF5Y5yN31vAQkZCtEwXvu2MEmVR35WvgiIw=": "753599000000", + "kpdMKEcGlUbv3LbrLTwo3W4IKD-yIoS84admo6Nmg0Q=": "2253834000000", + "kpdoIbOvD1N8sRcHSLygrnh_JvU5trkGhoMUJs7Eg2Q=": "2074563000000", + "kplTNgbF94asm6u-FPxR8bmT83BdsLsDowUOBQ-nTyM=": "460608000000", + "kpoNc1q-AWJpVjisn5jEqOaNuQnaYjgWRfqlmC3jvL8=": "738915000000", + "kppwkHZLklCGArHrX8v61ZZyQ2Lhz1kfad8IdLMeHI8=": "379260000000", + "kpsmuDx4oaRwAjL3JXZ0fU0iWF5uOFmI7Hw7VFewkx4=": "1632420000000", + "kqAuvS4fz8JX_3T4fRPnNP9PO7zpPhPbmNwLLMinik4=": "460816000000", + "kqB8s0B_mLfwz7dL-jFjFuT2dmWBFdrkt-xwPL8h2DQ=": "417682000000", + "kqHGRR71wCGOS0ZuiY_n9pUp-D0hQejAnSHIicLVDJk=": "2064715000000", + "kqK810nlZ0OsizXHxeP70nGX8MtVg5LeouWxeUGPRmA=": "412006000000", + "kqOqzd0JtQ7YFTlNHHboTVRv8huSUxZ17ZFrbi1uTzA=": "377449000000", + "kqRhsHDtTTHTGwV4xXFBCLvxube6mHF3XBY8BrYMo1o=": "131406876000000", + "kr2oxspUNEWXWl4ni0BzAXHmsxY3pPhbTQMf22JixHY=": "783595000000", + "krLxGzD8S1WQQYXgTaaPI9MXTozWQwyzvx5DfVSKziQ=": "383195000000", + "krSPT-AwYq5n2de6hgNFN0NFRboWFj3iZWhyy6oTJEs=": "385278000000", + "kscEEAsT-dQbq6ttSkfqOx9lMsToIasd5UkFuKf8FKQ=": "458460000000", + "ktWk1Nj014HAadIJpVRKyVgoopWnISgl_Cp4QnvZpm4=": "502036000000", + "kt_dZF4gRRRXLNohzeiRmfKWf2XKwhuYr_k-IMldbvs=": "3299346000000", + "ktmWPIvtp5uuVBB2s_onlgfWOE7ho99xc_jp7SD3aoA=": "378460000000", + "ktpvab-QlLMyzZMAWJTRfQHuYPZLSxpkiiDx3QVvx48=": "416666000000", + "ktxjo_nXgBCww-HxXSa0iV3ajFMvEx6YZ0FcpjamAIQ=": "462146000000", + "ku2Ft4z_oalTjio5LTdc9Y_IELNxTGt9iMmVbj9ZN38=": "758520000000", + "kuPAOKC_tjmFdUt3GZ-RFqMXGElyZ6QIR4R__Qx_BLs=": "455600000000", + "kv_qQJ6kxnhfwAdODuv-WM0HB7nxT0WLnoNW_-q6g0w=": "453414000000", + "kvjOuIQpZnaPUy1B2kuEkY9bRbyq3VM2JEWIcPHU2Sk=": "384615000000", + "kvnlZPGGbXrS7QVTZv739O3025LeEudEoOGCuj8jYjw=": "411969000000", + "kvxHM2b_AQnSShGRbrFUg2WaOYxRG3qF39LuXt1etDc=": "962145000000", + "kw2yhhmVRi5tNW3PSIhP1tWVbEGqzoQ_Y24MicPUG2Q=": "394212000000", + "kwC80ZMcVBf7BiaC2uS3s26L18yI1_pr3r7l-W2ieF0=": "454676000000", + "kwDOaY-Pr407I5KtcY4o8aH6n0ZopVgGfrE19yUSdNI=": "1256161000000", + "kwPxl14TY0JOFL9g9FC96fF5wICuN8z9IdCQ594H3n8=": "454918000000", + "kyD5k4M1bFeCoty2IvBoBqqhvpTc5MS7g-yE08LggYE=": "1727387000000", + "ky_DED-MVFM5Q87L6P0Gk-aTyRz7xIm_Ml89R-ZwSOA=": "809727000000", + "kymEdAL93K_tO7bIBWTPXNDyLBgYHDob8iFq6_IDH3o=": "3511224000000", + "kzBh7OTiv8VK1eB-NNF6QaEJf-BzLmOYiqi5MJkuGC8=": "384615000000", + "kz_UD2BktdRrEPK8-vno7DXY2IOrGauzFy15zFFWv6U=": "906631000000", + "kzvcqX_PMbwHh2ak5xP7C6HrX2uk73tSW_WtAJ_rftk=": "454822000000", + "l-6hy2Vqgt-lp-W6hZJykWBlvB9yNse4UBY4DCpQzuM=": "1097648000000", + "l-nm-xqZHFF0lVAZAPXigX0y09jDWLmqOh2BkZWWORY=": "380240000000", + "l-p8jqYBdyBQeVyGRvxchHYU5AnljTgt9XhiDZMM9Rw=": "376914000000", + "l-zz4eDcvhdT-Q6K25ur37N-2eQIRh3aXe3W3GsQAus=": "380963000000", + "l0CegYkBXxd7rO0AZ-_TEoDgl-wxUQ-ZJw4TWRtf69I=": "807692000000", + "l0L6nyqLoqNv4ah0rW2zpJnegcYVKZEkB9VhjcLy7V4=": "756009000000", + "l1EWwhY69q-WeH1kDpxQVGG0EcsiviCX6AG55poO95A=": "33363135000000", + "l1Uyt7x62bX5RaEi9TwMv7Tuk3PBWuOHQwjVbAEn7FY=": "382536000000", + "l1ibb7LGwQxbSVFt0B3WoSkjUV6Vqh4w9LgUJunjAoM=": "1950355000000", + "l1mfieQJ3cSN1Ez2VLRn9LbjKuKj9_sY3xAuaJ1g8AU=": "4649411000000", + "l23wSB7lKHG-xSZMdPJvi1hasz8jZ8vOcJ2qzYMHEpE=": "384619000000", + "l2QgB5lsV8P2nZbTr0DB--rDyMPNh4NLl4qdBvPLksI=": "382706000000", + "l2s5Zy0MZs8bjo-qBsvviQGK6_x3-Wgy0DpOrLyKdIs=": "763544000000", + "l31yGbiPV-9DsgIVZH8Yf5nk1-BZuQX1j9szkitACbs=": "730769000000", + "l3W07TsY9v77I2yFsUEugBfIXFQ2AbE0TqJH9UK-PS8=": "992495000000", + "l3avGAPfal9l_xK4ZKW8jBo9JzywfdIQS9BpXDVqPLA=": "577623000000", + "l40FT0u4Xtftl8iY7fvmZmZpv8rDs_6ebVV2CqO3drA=": "1923076000000", + "l418qP0XBM8kv5pRzXbpPZSEEeo3Nigxj6gHe08FSiA=": "1932076000000", + "l4fVO0MTRZtplv-owBYjP8XKMKZkke3QlVshhGbNyZk=": "384615000000", + "l5CFb-2yo9idR_VliZo5FhQCYLh65g4XvG9_9UjGwo8=": "1022102000000", + "l5Ly-xi2-AGPnXQwQ3BK2QL0SG3gjgblHcGOsZ1y6r0=": "1893589000000", + "l5kqnTDTDx5zks1vbpXzztdaaoyy4JuRQfxX3ATLRhA=": "538461000000", + "l5oXH48MZb3VRteemPwnHrp7-mC1cwPkCidLyANNAR4=": "423009000000", + "l5vCdY75m03c_0jWDEvPLuCbQOYy4W23dtzKm8cK5mw=": "1604419000000", + "l6-NqdbYyLqHIxBa-WwiOpwJWlirz_E-3ZkrlV_CJWY=": "384615000000", + "l6arHKMuU1AKoLguA6ewQviqNCkXubWSwDEDsDNhATE=": "386570000000", + "l6lcMsgY1PHMorg7Y27q_HVM6IUA6zdW5rRbv8IgpOE=": "1957181000000", + "l7Gl1OsPbB0JgNZ3D_4o0TQ5trQZ_lHR1omZC-jRck0=": "917325000000", + "l8H2aT39c5TqkBHnnRLrXtOFhUksCtGBAOUJsedYzgI=": "384615000000", + "l8YoCXVMxIECKGVgSoqLw35AjqccDx1NPngkOYcMOCo=": "2304273000000", + "l9AfCitT8Om-L-K_Fapz3YDFVwb4rZrU-MGIFXObJ7k=": "769230000000", + "l9EOGMvmBpNwz9U2e1gi1czqQS9VY7vTbu1Xido4mwo=": "417946000000", + "l9QypYycWf88_ShCspmkHgDwGDchTYorsZUEZILCgJc=": "363321000000", + "l9kR6fTF6h8f9WJhmVEkzYIii2DOX4_3ZFrU_YU4dEk=": "756272000000", + "l9oEhbYetohfZGQaDFleL7nqEyOgH8Ylz8U52wHzVIg=": "690560000000", + "lAWjl_-u28-LeaetxqVNUqPr6h6cBOJcNBvWAO8EpmM=": "1153846000000", + "lB5K0Yp4J8qqK4PDhN5bmfIZIuXjidc033p8veCLPMg=": "452078000000", + "lBDv-C4rmmXKz-6vwexOPaiBhEn7ywlzDufYIDxHebo=": "1666779000000", + "lBLYvQpqqC2733k7bS-rDj0q7OeEz9pMW7cg7TdLgSg=": "874658000000", + "lBRM_bbkYPMV8EVhU_cBnBmkLqVAn25-LeXjN1Xxj8Q=": "422196000000", + "lBa8SQ5ZjWpTmmTE7u-sRB87AQHxKz5vRQAJnXPQCQk=": "1923076000000", + "lBjeZNDXYQVq1SAVVqqUR4tQAB7D9xhtBEflWjlQ_cg=": "424754000000", + "lC7vml0Qa8lZsALyMWCduN20lypUK9bgzquOAf1qPro=": "411085000000", + "lCRWtNQQW9fO4aiMym9NtIQZDfGgUJo21EnS3uRSuek=": "446263000000", + "lCS9xgVRIyoCRfC0CSXpcNolFdWyM8cOXD-R_5FLwcM=": "425251000000", + "lCd520cMb5mDbVNaqULWnCdF-p8Y_i8FH4_O2XyJuIM=": "761210000000", + "lCkzQOL4f_cwYTR4ZJXd-NdSzoWkasFNeUXw20cxvt4=": "384615000000", + "lD3qG9KhhMNo_ylDDfYa0wdNu-D13L61KLIpLdS_8uc=": "1920465000000", + "lDm4_fdFLfAUS-vpQgLbxBckZ8y7Xub7yJsakHZv83w=": "1248575000000", + "lDr4O_b50gUldzxcUl9JAMFo2VzyVZwYMaTcoyiYR_I=": "526112000000", + "lDuyqyOngdLXS1dd8s_fTk5MeKqnBnSSgolxeiOOh08=": "1923077000000", + "lE2i91WE34EVCrW87X-Lt8XXfXV3bHQvEEwbrCK6ruk=": "737416000000", + "lE5ZAqbckTsMDHLpptyvve4oAsC6-wQXFBZcb3SF4Eo=": "19943220000000", + "lEPxyIvxAkUKH9hN6FQdaMmz8dDqEyV3-NBchpIVDZc=": "576797000000", + "lEm-hLw5AxoT3sOovap_338CwNNpmvMS8NMoi4ADa5g=": "2100510000000", + "lEpzeryqM1LxRFBC73OCZcqsob1YtvsnOpAf841d7XY=": "458659000000", + "lF3eNfFxnAVDI9hDlzLPCsqPnYAw9zGuptrrSyxi_no=": "753674000000", + "lF5uVHSPplraCVJ3L20fR3e9oy6LdWsSxw71uSoB9Es=": "12499980000000", + "lFbTIv-dqsokHYPJh_KBI56eaFCKmedRp76kYlRjU_U=": "11152559000000", + "lFl3H2blNm0jHrpgZQ9D03bZLkofvCxy03M5uj8kcvI=": "1249999000000", + "lFuDzo2vh6UEMmrr-MmCvIbIqD8H3kTkT82oGkYjC3c=": "418144000000", + "lHLyypqb6umMTk2ubVitdwyFOq_g0gIeh9-osBj0r64=": "974536000000", + "lHbsZ4EWlJYkZOx5v4WdgzLLo6BObwTeBLn6yjCvDXE=": "385505000000", + "lIAq18xP5LYzboM-PKtRiQcm-0pOgzjv_qAOo6PBqFI=": "454859000000", + "lIOSSGN2vX-xBHkMifNEmZoRKDLXP-7W7Ki9sjrQ-nY=": "989645000000", + "lIShfPUywSW3r7lsxTmaCdeQh-B9Butf5517BwEhBSA=": "381802000000", + "lIivRuDqw-rv4y5BmR0uX0Na-SYwAGqIbra0fn1TcMQ=": "1590909000000", + "lJ47Fo1OEPWjr-MpazAtrfLt5pTeUlxwL-g7ZWGYZfw=": "1400084000000", + "lJGK3S4WIXOPflXEgjqZmI_z5ZWdCPSB4co_YjfESqs=": "468409000000", + "lJJmGpwNpAnbpH9HcMeQxbpKrXc9-GM8dyR6jW89zIs=": "1923076000000", + "lJNDwzJPbEXaRoJSAGfI8mkVsvIdk4fV6fNKpSlppU8=": "8217726000000", + "lJhpLvp13Q2EVYwaieep0NJksR41qkj1z1nMqoAewNI=": "1927547000000", + "lJlu-p3CsNnPE7y80HLFNATUGmmVqhDA9WiqifkuYMY=": "1818181000000", + "lK1O6Yz7O_E07K9VerQtxK_ac0QcX2gzFizcgnUd6kc=": "574033000000", + "lKFGVh5ol4_GmsLS508nhArN3YdNtsMjHt2xyT50u4I=": "386742000000", + "lKI1IlIKX8ij0Pd0UVTxYAyJ32TsDaryMcIFz2MMbHI=": "13612251000000", + "lKbO5dOS355pzspaeR3tPdmqtb4HbLZvxsjhdmNRMgc=": "417632000000", + "lKlUuD7j0X5HL9zKYrOotsf9Ugj1zxQRQV-SztswB-M=": "789200000000", + "lKsjdxj-Excd0K_J2nByD0mMVqGVx9ckfODngbXC_8o=": "389674000000", + "lL-VKA2FbNX2QKZ51yzRkYyKxRQ8DfbhB9IhaBEaXX8=": "938409000000", + "lL0cwK5TxCf-LzADL0XtLpX47wNXJa2aLeli-0xGr6U=": "380827000000", + "lL6jC2OyNR1hisF9Auk4LgtrCQ1rFndIrURtcvCO20M=": "782982000000", + "lLSGgo8CQ2VqhTT_U7vHk4u2AFcMyBUfiKg96k59rDg=": "411085000000", + "lLlxMCE06h80_Dhi0_FL8-QPTMNWgeIMagnveLKXL-8=": "928209000000", + "lMZK9hUYuGyfZwCHfx-HX2JVFxBg2WLzmVkHp6phTDE=": "1919579000000", + "lMb_CGjWL3HPR4DyE6mRwqgjhe6leTYQ_eU1JyYcSLw=": "1041666000000", + "lMjurq0i0FWlX2tfGpIPrcTr3jyHpUyQiZCx1Mu-VD4=": "458824000000", + "lMnMOWJK92rZsvkyBbphEeiQiA1AqCBbSBzdiK0zvhA=": "5808250000000", + "lN8x9PkGW7BC7uKuutPEjv0lfMbP7IDxHzMqtMhEeX0=": "369692000000", + "lNgyZfBqls_9zg82ZBCx2wLuIgwnhNUghGl9X1dbwIw=": "916606000000", + "lO5q04fPJqhT-lLfd1cqJ8BKE-Od5GiYjJKQmJ64VrA=": "4012039000000", + "lObmHirGeIksSpMXbD5TF-Uusb3Cvw0VBcyJA60QgKY=": "908900000000", + "lOgUyLYV1DUMalhHR9-_xa5CGu-0auzCUW2k5nXJw64=": "405574000000", + "lOy6wmM3VjEiKuJ1Efdx-i1mbVuzNBI2I1jmjWEoljs=": "384615000000", + "lP1bVmnxf0iX0hnN0jaUTX24DxdvHBiRtjaB31usQyU=": "387962000000", + "lP8fAFK-GOrjI91_M1m5LfGL_Ld-5Em8aQbHUoEfwOs=": "12534407000000", + "lQKDaIFeA5nMdtzVH8ri3Sd3kbg6TBw74nwpFwJI9-s=": "384615000000", + "lQiWWqpvBCrGN5VgWUfy7eh8b1QFhjwUwMzsdtzMO-Q=": "381358000000", + "lR5F2udAQ_tXQVmqPWRE9nBeyDoeZJR7DgXdTwqZSyI=": "385507000000", + "lRTIk7oIHN3451u7mJUNyh_zCbsyjBitrku_AwE7jP0=": "2914576000000", + "lRemjSEjNviTuMGJ_GXuVJL7YY317AAVptCMzsp3XT0=": "655115000000", + "lRfZKssadtVQBzjf0tlpMbnteW7LtbZKI8UcbuUGY9Y=": "386574000000", + "lSg23sGvzui1iqgxrX8WU88l82VbZs30uX9M3TJkL9w=": "418392000000", + "lSndEBKcA8HtGWJd0yE-VPtJ8OrmXF69BQqmHKbhbis=": "455600000000", + "lSs1AJAZdgtHZ8fyOZtVW1fIPDUMmvbh_Z7RtRwF9Nc=": "3072335000000", + "lSuPdNOC4wo3HFy86kaIv_fUV13XuSvofsm_SRDBbDo=": "3751654000000", + "lTbymFrDofrDurAMXQfCA9l-U2ikFGoPei7D-RpLmrk=": "380694000000", + "lU38M8Ud8ICR7r6ZlI0WH3C68RoFmbmmyNMGloWfHO0=": "464104000000", + "lULmLoHpp_XGuJ_p6kzjYkhpB1bnKN9ubfIGL8uN3RY=": "423100000000", + "lUWKz3ia9i6VMPgeYH1R2FGNjKe12IzHSHSuqP-g8kQ=": "381713000000", + "lUuUK26ZXN90ftSHzXy66pbFijYnjOG6pUKqLFl9PEg=": "2045419000000", + "lV3pWvZtAasPH3axGtoGREdlig3vHT7UI76Pw_UkeAM=": "848090000000", + "lVCBBBhb0ruEY7kNtr3U0p5RSEEyPQHl8sbxkEzyv8U=": "377733000000", + "lVa4GhtVapmbC9e20IVASlxRWdFpNvZ-1ttPiE-KyKM=": "380459000000", + "lVnfG23UylltJqVofuZ2Ny-l20RfrsJXUxP5XDS30Zo=": "457943000000", + "lW1g9I08Veoy1wsRGHAUE_J7U886drV_rgWOa3J3-Q0=": "418744000000", + "lWGK6QtSuSqI8OZUIbGDy9kRTlRq52opG_r4VWKpIVc=": "6807692000000", + "lWK4xL32OJFtC6LJIQp40iP1CnMlNSTHce594XjZFuw=": "913369000000", + "lWM1XhZcJ9Pr4QtgTHqIXHqBjjTfvt1wG3OnkoobhWQ=": "458333000000", + "lWQiy7xzGtOMFIbuNja8s9DbTnDVCOMO-2uK7lmAGrg=": "384615000000", + "lWShnMC3PJLgSUsg9-5vtcIjDXOxEOt35mwAC_fdOak=": "922769000000", + "lWclMOcAxFVA5GtsH0HNsdgCgIy4czh2tezLp-iX0pE=": "1169544000000", + "lWgQ3TJDPEmlF7EDkRBKLXE6zaSfwgWNy6CxUZHaR1M=": "11670991000000", + "lX8DmWI3lD8cWGuwgbCyqbAm-Y4PVr6vRY8VH4xHHXc=": "1350917000000", + "lXJ9R4EBFSTqs9QQBQaxLZ4TmZYsPC8XJ7zmtyi9hXc=": "4563165000000", + "lXWnu3oXgReTIMxeyGS9ssJYFvJYdsIY-ws6FVYcQu8=": "662654000000", + "lXeYI3vI0HO_cLo__MzsrMyiI8XGoQ7thNMmn2ToEnw=": "831345000000", + "lXlHRzyCAgUubWMSMYm87TyVJhnYSyiWT_fOSHtxZco=": "3845984000000", + "lYb81Un7MLS25IZ2wy7Ao0p7M1zyL9tJwurlpkD2qgg=": "381733000000", + "lYc7Qb3sDQJ1z6t0i6P2DElC94jlWynU0Zs7O0CMqYE=": "1068461000000", + "lZckaTXN_aWOf5JPE8BVEJRZLn3HGl-EKvBabNMipdQ=": "2260197000000", + "l_0WwkeGzUMRQ_woTDEbshAm7aWxGK6KTmYhtCxhjjs=": "3598284000000", + "l_FcriAgKvUr81EkJDsJgOTkTH0ENRd2zq1GfGE4XhY=": "769230000000", + "l_MeK5_Q5K5I_ia9fufOGUb6rkG1zRt7hWEI0UhxHKE=": "452053000000", + "l_O6v-ZpWXQ15yAfGYBy-vAliGGdkn6cWxkUWSaRgEk=": "502887000000", + "l_cFXcCNgrScOuzJDymCuBilzmjKA9yb4BAsAWiypuE=": "813489000000", + "l_zCzL-P-tYNxEMBYzhUOarGxOQn05DfI9qAk3ExqhU=": "460843000000", + "la17B0xW3AxeXAapAGs1zZCEnZ_99j1793atpi3SZ0w=": "417399000000", + "laA9dnXTfbNK7Jghl5oEHLWex1vthUax-1Yy-ukiWo8=": "405229000000", + "laJC8OKiMwfOI3bbNEEvjOXHzfRmoDdPAUkzsZuzp4o=": "1667418000000", + "laNGueXa4w0NKmKWow3SA7ZCEmcgqCKxTZhvE02fElo=": "385506000000", + "lakHLKe7Ocubbus-GkN-F0OgHbFqdnKFQ2dqjeJe9OQ=": "353346000000", + "lb0yxpACAU4Y4Y8W7tpMgOXJaPxLSxVEcTJP02I763s=": "1919526000000", + "lb1Ts88YBrPrqhSBKMyGTePpswmTAr-5zHt375mIH0E=": "467411000000", + "lb5DlfLUcf8sPq-Vyk72GU-h3Ao8me0EREqHMhfTzRE=": "454545000000", + "lcxfs4-jhm_2kMhXRRMHHJHU0YF_hyvrNtMJmczQoqk=": "461906000000", + "ldNEGI25UrkQnMABvAfFgv9t04CWOdYdc57y8SJ3c_Q=": "1135997000000", + "le-XesWn_dDWPqU_UOQt9m1tSx01BpfByHv0J75ToZs=": "466427000000", + "le0nKdP6PRzauxZ-6MBvhDkhaFrNUcAAnyUEyBNJrXE=": "1573078000000", + "leGuhvWCcuhEj1T9HM8n0tsgarSClFB-ntEPpapi6Fk=": "390915000000", + "leJg8GF5HSFj3RFTGvr9VS2I8zwIPgRo6HvzWmS6LtU=": "411658000000", + "lePSNm1iqGZo_lnSmhWpkgGoetD7AyGNY_JQ9EZ8VHg=": "837433000000", + "leYJ0H2lnZBrIPmlBG25w9BjM0VyggJmi4kOniErzgg=": "391132000000", + "le_uFUoxfv7kIvYbSFnXiIA75fLPhUojTngeGlvP2_g=": "458561000000", + "lfifVFhSSbJQJZJtv7MSMhGvQj2SVw4oUAM-2F3O3y0=": "384573000000", + "lfoFx0SzzcaGlOmBNSgShC-EngaPhweByDi9ycGXs7E=": "1925660000000", + "lg6kAukcRP8U1FwFtbKXkd7GAcXNYaluNPSSEIPbOfE=": "839774000000", + "lgBF5rNSQGNiG0YrhLPp1wQGYICORbWKUdHETHaAp40=": "19615384000000", + "lgKWSK5jiDrwJFTwTfwE0QQ6Qh-RFllrT7jzvLTrYFM=": "499999000000", + "lgS9L5kPUCjxLdeM33YsU8vbPRkF0L7qnyzYBXRhVsw=": "1023073000000", + "lgSyNOpMej9Qr31JQ8T0QfZazMhtxcW39A8TVMQW4r4=": "12426286000000", + "lgTGS2wgCmaAYjYqN8H3baB9UX_7MTtqrLAAGSCjcZA=": "390743000000", + "lgZSP2l2d18d_K7Q7TmRSg0_ahPjbIAPsakNH-VfoS8=": "46175710000000", + "lgeoybJx5oZeQW0AXIt2mhJOHErhzSAKcmxp6T0B5R0=": "1524230000000", + "lgnZYhm3VyjNDHOrrYhrtJ1dkk_YlyBURs5pPknQ-uc=": "386127000000", + "lhJ7QLT_Y0SJJwyP2ckDLrzAOa8FZ9RAKfZ9bclcOrk=": "455600000000", + "lhRgJWW02OvEo8Q0qOUAjuNpcArTVjDJUBB2O4PdYsw=": "3846593000000", + "lhSpUbRRhuxvI1sCnZ0YZh9AFIqJmfFDBx3JvUpCaxU=": "2281847000000", + "lhnemCSKTfPnu5NhFES9aOYHipQ6ODB2fu_ElI7xJlA=": "379187000000", + "liF6v3oWKsEV_G4Y9rtD6pN18xF0BaoYV1QnJNLYvEk=": "654771000000", + "liSus5PJ0cpcMMxxmnkS-9XGg8m_KawWpX4C5ZM5RTQ=": "396565000000", + "li_fWK3aZc7d8XcrUQLMVSN50pMyBxhXYwj7bSB_IAU=": "388584000000", + "lj-GUupjlC9fcCG_NeM-dmQaHC3O8nmgDLw3GS8U7K8=": "423368000000", + "ljUa7cwanKzkmtnovN7TrSqaUcwvwQL81vRdio1ws2U=": "2055429000000", + "ljh6Q9MMXJb6pfJQv8L4nAlMl64DQBpZBa1ccRtB5_0=": "764813000000", + "ljvIrhPVos0Z0Tjo4K_9zerSkPupIm5rV2344HkjZ8A=": "376160000000", + "ljweoY2tBb1FVlR4mGrAOnbv_mbJ1WUVk_lrfldsmis=": "386516000000", + "lkRPHX2eyf4rr1z9JuigSrZlNTOpRBdtJ4Hbk8N4RR8=": "385509000000", + "lkRn0yNCi-xoskAnCmK2uj9k9LUzmgREV45JX5xpLV4=": "833333000000", + "lkcaja6aiM78WIBCzflSUX1mpLMhcftb16NfchqCxYo=": "458272000000", + "lkhLZnegNVv4lTJWwj2Jsq2-kEczOGUkSidx-d7cjkQ=": "395499000000", + "lkhiZQkJrqHvDGW-qpFjdKezf4yhdxNByP8tMa7bcvg=": "2505718000000", + "lkl-f6HqlCnwoCfxy2QZtYPzlgGECRLqVLlfEPkCk6A=": "2871626000000", + "lkqH6fissefHP1Lok0R1tZybC_VKZZLRsdBUMQbph00=": "416673000000", + "lkyt9ukDWzt8AueOWU8yJO2tOldAp367iqH9kgqRDLg=": "381802000000", + "llbGA0lJC2cZHk17NOCCgnem4oTi3CZVet-vYl6epX0=": "421947000000", + "llgknX2H8hglIdzQ7GJv5busJb2p2vzhYLEmoQeZwZw=": "379260000000", + "llqU1WQWI9PQEAfgtaV5QbuugnY6beNDMCRc9ezZZ2A=": "421142000000", + "llwEHNpIcGgTVi_X0wYamXBuq0iUEIuVJ8zxKCyHNXg=": "2290833000000", + "lm5nDsjIKufrMKjlDyL4hFNaUtMYnTWqwfNrGEeOMZw=": "4595160000000", + "lmSnROyfI2dNMR5Q4-4RcLa92FvVFrjgrcSMMzvBvNU=": "2047011000000", + "lma1GUz3uONBWWPT0JYCIzXcRGEfEFJLidUugTO3QWo=": "405883000000", + "lmnzIVM7seeyxlO6BLq_TXID-bHTTsE4v3sV-LjkgXE=": "411085000000", + "lmt5_Jq6jNiZhkJCOwRqcbakmAScfiHgb3OCwRmC95k=": "384615000000", + "ln-F-S7cYpSzhvDWbjIflRHEcPfnEuQx5gJc6crDaQA=": "462839000000", + "ln5WlbEfCkaDJDL8iq4s6mYe0kFHq3pZoOXEtZavaoY=": "455014000000", + "lnIRh-_SIEvFV2PzCSclRjHzowSJPXRb92IIoD1IgUA=": "821478000000", + "lnM5Z-NRluj4DcYGrs3o72zsnu1sgOXSvXMHVj2J3dA=": "412097000000", + "lndtJBBxF6Tn8LbMXcYXk2mKzy_ERg8sKMyzI7PsCjc=": "1922298000000", + "lng9I6F63Y5ac8EeHwTOAlWs6T3_HxXe1QYCJejOnn4=": "636148000000", + "lniP4uBjyhKH-0l_fVzhdna2vkRKalERMxdaW5mS53s=": "384615000000", + "loMepoLpdmZGKCYvHgwjm7_R-OHFT5DKTu7KkuDZLK8=": "420229000000", + "loVKM0-z664rLYcloBO-FkWnbE1p2oaWkZhtK4tqd_w=": "908423000000", + "loc1Z53ZE4QFOV6XogzEALgjFvyu7oSnGDer-j4W_-I=": "3790675000000", + "loeWHVpW627tsEA6O400vHf9V2Wyr_6ohdo3OwzQ3eU=": "769948000000", + "lopKpgLa2KAlHnHWNthXLspH0relWQEAN3kzLksPLww=": "412863000000", + "losQml5sK-ocfzjXJtvJ9wM8JtiiN3YBmnFD1zvhjWk=": "1823779000000", + "lozILO--tKcmWPHm9qr7lLP7rg5zXBUPrfVoOdAzVcg=": "416666000000", + "lp6qyKsMcd6Y9I2M3CxzcdqfgA93SRmLmpos0DElKkA=": "1496282000000", + "lpNRsAIX_o1Jq2gPOYynDqNCQubZCco60p0aJLIB6fE=": "769230000000", + "lpiN91XoBSekQO_vmEfwtLohv5iJ4rnxbOAPYEleHj4=": "416541000000", + "lq1E4vwqFLdY0rGha7Krix0itmhWbGDB6Sg5EZKoP64=": "470069000000", + "lqFPfnV02rQuyohiYbYEwdgfaorJOqCdmwufHQXVs8c=": "833802000000", + "lqNv51aybfa3YyAuWamL1ie8B2HJiubX07Ma37xGfg0=": "462771000000", + "lqWTgZdWeTwyZlUX_9LgE8aoITNFg2xkjg-SZlDz9H0=": "504212000000", + "lqzlTiAUkKIqqEcr_vJpDXxfXbpk_MCUaLRE3PrWQ_g=": "2083333000000", + "lr-sET1l2kwk17NtgHlinU4kBHKMNwwGHEhfS843Jyc=": "769230000000", + "lrK7qRmRCqF8q-kjPsZ6CANR4s_IWkKGU8RZYxuNNOY=": "383334000000", + "lrNUmJN-XFl4aNGg075ECwOaNQ5iIukFUYjyHlrbNQk=": "1400084000000", + "lrPW3kIU4OEIEvFJ_1eOf4IhvdCfqji-8Crf9mfNQjM=": "416666000000", + "lsC1VZc7BclOlwfNh6IeNEQ0CIReJkBJ1txFOAMyhug=": "397332000000", + "lsCYC2OPq5j5WoRHLxEqxbhdXjG9cpuFEDoI447nDMI=": "384615000000", + "lsZzQwdRWz_jSA6rgy6rqIQ8p-omYWlJtZzPedehv7M=": "616234000000", + "lscydBE-wvV2PRotSgDokpY7qtuIteEnQ5Sq2Oy01fc=": "623247000000", + "lsp9kz_zgAb0uxE8e_GeM7pUiqlUzhUu-kOljwWEdC8=": "1153846000000", + "lsqWgX3QC6Cb9XfZbJOxwjKJZrpjopqmr50szdzCmaE=": "763096000000", + "lst1Y2mJsjnQdMCTqPlB5N576k3wCVWj-6ttBuMogjI=": "464564000000", + "lstVl8M9Fi9XOGsC9QJ1q1pZLynmtAWCSLtT4OGllqc=": "369226000000", + "lsu3cgJmB2HPszdLW7n1ey9dDCy1eDCgSvLUmdCHF5E=": "390975000000", + "ltgk7yTm9cVyTNC69AfQrn6Az9qIDKTcOfZ6wsTdPbE=": "458576000000", + "lu_WozHQvU9OYLCfb9Atcf0SE-OhFEmn1EaBs6s3Wew=": "4146001000000", + "lug42L-OXC2pzFPtHDVQyKApyFocmYGU_UvXPeD64xY=": "915384000000", + "luoeQvZkneljeZMZdjMtRtA3_JnxUWU2UpvitLHat4M=": "3855050000000", + "luuMp6VfJ_wwHSfK7zJHJxAT8mZ36O4EuiyU4I0vQMI=": "381802000000", + "lvMXmGsZwLSxJtDv9SRYKYq3jiECUtN85dhLJiy8fpo=": "461997000000", + "lvQzZ723xL2sbfspytOvvBma63K5BEZFiCFa_KxRe7w=": "764908000000", + "lwBxZTIerePRQCcWr480oCXpS3_lrzgl5qJnAqAnR38=": "4103819000000", + "lwi6xVTl7VyONh14GQsTeh5LfwgOhsbHMVCzc0XUa18=": "412158000000", + "lwulF_D0shnS4ZRMWKezlg0-pi8Dfpc6wf4KyP4yQUQ=": "472752000000", + "lxVCdliD0sEvpnzK02MfyOKcwQJptuDnrdA4uAyZjm4=": "501408000000", + "lxbpj8x7QxT6hjYL64jhWKbYQi2bm3D-jEnMlmxB3mo=": "457217000000", + "ly-XULXjv8HRFezWhewLH6_7tH7WgeXPUSqXuXobyoU=": "3846153000000", + "lyshBiEDISgekI0Iz2Y_rv80yUJAYI1zw40MSUIgkYA=": "384605000000", + "m-18WZ2Xgwx6GvZ96cp_yYINYmufIKyjLDoneUD8KYY=": "3818547000000", + "m-47c2F0zAR9wIz-PkSx_wSvxp_QB9MlFwaK9KaOLgU=": "1210755000000", + "m-JT-747_M9cM0Dvu0JONkP9Hhl9tLrcEuy-A6CQT1Y=": "512979000000", + "m-gBO6xSS0oQiZqLSs3jdhNKwg1YsaHFD2gN2t5J9cw=": "458900000000", + "m0FGN4YVdKAMUsU8dWQ_6ws8j0NK0OCmvhZptU_ndjU=": "769377000000", + "m1IineF4NHtVLO6EBoXwWtctrxkTa6H7qaju8Wbpz2c=": "384615000000", + "m1WVE4ImAmvFDicIP6paLtrIWDQMHfEgNvRbru_RAjs=": "783770000000", + "m1_NA6V-2WnL2HLU-W0vVvndf7NYrzVz4OPNcJXpqa8=": "406044000000", + "m22HbYZV2dGKFqOdHGrL1GsH4mjWBGmdS9wS8CZu-D8=": "2689707000000", + "m26Dp_H1pkslvo0A0ybqREa-yF9mNChht91VOnQQcJY=": "473692000000", + "m2MIpUqWMTQJwK9F4LnaNstGh4BjMy2L2GDHpsuCAPA=": "3846153000000", + "m2Qoa0hyrstX6gafnbTq6CAtT96sYo76-jx6HuEYbrM=": "771530000000", + "m2YPlDHuEOGU-4w9gKwsRLIps5535hf59qaapIoLtL4=": "2236541000000", + "m2cX_Nd6z4rqOGKI73oH1I4fcn6akAh7XwCAD2Ih2yU=": "787901000000", + "m2kntoXSwocPAwVD0S9fMaKeoNjVdUmBFFEKrLaOe_M=": "384940000000", + "m32DEub1pYACeTxatoB6Jq_ByACV3BATcgXy3se1rBM=": "415629000000", + "m35w-w31sXQINSsifX_SechxsfRjaVIpbKyOFji6EEw=": "3672993000000", + "m3F4grjeNm9sRm3GiB1W_28EJ_RG4xCF1iDoLoQll0o=": "823917000000", + "m3MA-J5MfCbVqUNjriX56JWWa9v5zN-Mvu8vasuHWFM=": "385510000000", + "m3Xs9-e92-c_-9Z1-uhh3OSq4z-C4Ry-em57MNKijvc=": "1511881000000", + "m3_QfTyr5OQJK-lZKyWxIAkrQ1g2eE6ewhsF6Ps2mJI=": "416666000000", + "m3ilYbM8RegDBxBF5_fCwzMbcVYkKEVyo7RajFPUDDA=": "383900000000", + "m46SskEqC2J6WTgtkL2yjcaiPnDP8I8lgDOFOLztqm4=": "833321000000", + "m47dIBXMuzFhhGiPWhgSj6LPUOkcK5WfFs7Evz69GiI=": "522085000000", + "m4CPqNTv0jNJah-05c3Q2pg3bL5Cu_LY9YUoezJN_hA=": "423370000000", + "m4N1XE_7QUdcxJb2-alW-yFXs0FL4nHKvTpclKER90s=": "1011286000000", + "m50K3IFgi9FgWA4U1LIoMZg5IFL1JHtV0niR6GxzTe8=": "2339165000000", + "m51cGbNXko5k2RxxgpOZ5ZIvOWzY09yjjIadlk6eOSc=": "341647000000", + "m56-14V8Q6KAsh4ER4fePvMfVumVRxSzOM88LtOXaso=": "378520000000", + "m5FZXqoM1BhV6E4PsbghaypA2ExVz_MKzL_FJ8JbEmE=": "2050546000000", + "m5LyYDGxWNVOJuSSx_B9beRk2mhHHqX00J18ZRD3pmk=": "384615000000", + "m5NjBaEQFfLvXVNd-r1U6YqZwPgMhnyxFSqI1IIFME0=": "460094000000", + "m5QtJ9RCJcxSCRZ6q1ZXIwr8CPvBmykxiQatAZ6sIGs=": "26089543000000", + "m5qn1t1-I1bXuPJ3uFujAvCcjrkB37Cc7cuct18aZLE=": "386004000000", + "m5qpXGXfEsU4MEU14Zbx_FcjfrXPyRSu_eXU-p04Htk=": "3275834000000", + "m5rZGd9Z-osb5bonc2ojSXBdhGgIrEorkhqCwjyWjik=": "1079388000000", + "m5yKz10HSjTfGC7ARvxfpopEYxiL03RaPRLHb6zdB5M=": "583285000000", + "m8TWzsrokqnJSJbxb4Cr2kSNETVJ3co6IpI8m3F3ZwE=": "416666000000", + "m8gSwimnejWbmQpUAEWyK_Te3LpCaB9WV_T4E4_8x5s=": "379203000000", + "m91KqK__EJUezCaTzysGO-flC1jJ9kW_uW4ACZFJJ9k=": "384073000000", + "m9Qh0TJzNMr8tV-xZpRGxPAzN_OzBQiPP0zNIzXECYs=": "416901000000", + "m9WW7WA7INuWjJlNQokxaPL_1hL2bnSfkSxYwQGENcI=": "378310000000", + "mAGF1CqpFmt-OysBPNoPMEm01EUL8HInsqroTD3efS8=": "451268000000", + "mAHi85xAJY0sjGeKZ0oPGdbAtRWt7giCGwSj8ElLymQ=": "1588075000000", + "mAZDVYX1Fj-L-RJCmIsnqOlWHgNyUBmF7j4DtFJw104=": "411085000000", + "mAfkIzj5c2mm8XXufMK9TcP5FKzOFcFmM-L72m0hgM4=": "1871600000000", + "mB11uO0N8FSlLfTtWcXPMyGclCHjFNyiZ_JRPntNfdU=": "937959000000", + "mB5tfDeGQt7RNwZccjM-Am73eaVwPnDIUpmPAwqcm9I=": "385509000000", + "mB9YtY9wBL02ul1nxJiL160emiy75X3v16clZquli00=": "843390000000", + "mBjvvKC11ghQMp-x2P2rx1ty-F0TgLbjPYtihfYRjss=": "473265000000", + "mBnISzw6JLP-JfCVt-BrEXnPbIVx866BBimeLK7QhH4=": "1814912000000", + "mCBucKU6C9EseH2t2Sh7xStjXwFYmnjji8G35QEgCY0=": "453516000000", + "mCCsQobTa-aFHPdSRpeuawYQPGUT4juTQRJyASfgGjQ=": "384615000000", + "mCf8LGCcLHxZWfuGw-pErCF_nht0S75uzNLl_JRLXcg=": "420557000000", + "mChmQMUUHymrhI2d6abD4W6QZVNfjRKj1tJg7aKdGF8=": "376106000000", + "mCxxEG2lxV893fQz9dp5lyw21EKRjsP_CxVfrffyz74=": "777293000000", + "mCzdG7fdy3XOL8PkJ75RQS3eLwqoNJHIq-IiditvuDk=": "488979000000", + "mD2E6LeS_J3SgMcvK25lP6ZBXmJJGfikpvpQ6GGTCpw=": "4199461000000", + "mDFML0qTYnhwu0DL8Xbftd3KZdwpkLLPe6s_W2I2BSs=": "454957000000", + "mDS7EIXO9bf_Svr60UmqfnKOD5t9o1prft2W_JhFTMg=": "1154089000000", + "mDcL59nrYfrUcyFqnnSsccarY3QppXtofSLUR8RRiTg=": "1801716000000", + "mEW7SrsoL4xNad3s4CdxLwEy6fqMhSC3TE-vdnK4ISo=": "2426784000000", + "mEnPiJH4EJrWc6jZAk8BtZcMCwzEq5ASo1sRLjieA-c=": "2686614000000", + "mEofn6670tdeI9VXjhz3KxtrhZc2rdnu2YjEu0MJvLc=": "384615000000", + "mFIs0gM-GXf8M9UKROAnPF-gyJWmi9r5KG6rYsIjdhI=": "7853878000000", + "mFNm4S9tf9sUQgZhOrfzb6M9h-Vjok-bavaBed-TovQ=": "4222380000000", + "mFbssXXocZ12E-G5TWyGRyK7L6qWl-PJe481CGdGdEE=": "403063000000", + "mG46pzHXa_mw8JAm6-IOO9B6tfDv7TtUHeLjDOyPEKQ=": "16284615000000", + "mGKbrqL3KzxEsqeJdOfN0i7zotxDb7vx8qXcfr-zVyE=": "549503000000", + "mGk-R1S2aOKnR2fcYiFhG6nHekvbzAdK1wz-SYDkNRE=": "2248931000000", + "mH2xrLYveZ-DjSvyE0f5qmr1M3PQhxoxbmEC8Ld4dDU=": "385507000000", + "mHXJ1KMjI0vAMk63yIMWS_LMIiWkRjU9fYhmYtT6e-Y=": "1599999000000", + "mHoJDhrGqrqqXx8nGwb9ZE1_34BI-fHJCLzgzVHkugk=": "385590000000", + "mHp-l5b1czZt30pfMfchdcn_qIuJo0UIxXgGHDn3Tqs=": "749999000000", + "mHsF-YpiARBiaZuXw40HMaoAoS07EC2YqfRfdYZ7ptw=": "385505000000", + "mI19GeAZhCPFKNY8Eq1WTs0_3Ow2N1U0lOAa8F2Em3M=": "460429000000", + "mIRCQ2syZ2yvIBYFmRQ-hdYqt8BM8pBUFdGaS5DAQ8I=": "769230000000", + "mIYsJrdnH0WScbsM2ROlQeVh_AzIB3VQ2s08vtfVKCI=": "7497594000000", + "mIfCUn9jCudYd71OzOrfXH00zb5EVDTc8G7326yJHP8=": "1432835000000", + "mIkTxkXqiMkzF12NR-uqRgKJ-nGbwpSUxcZ_aEO4rv4=": "767698000000", + "mJ9AgndSHo5G6pQWKs0gMjPUjJGj_cfx6bjmNZJkRrQ=": "416666000000", + "mJDMA79zpuSZQN0H_Ia5WLR31g5QN2RJrlLiPc3fFJU=": "356097000000", + "mJQdYSk1yPQH7g35jA52l0tWLNTEi7gwFansBjnb1LI=": "768094000000", + "mJhq8HxdKd91E45XHqYmf1CxXLaB2e8nQd27AohH92g=": "916402000000", + "mJq7keloXOfAqTd3LHXd84HLDwYa_4LOXBOTXpFoNmI=": "391797000000", + "mKH5wemJ94o5qg0T-TYpVmDxnSD3pxZA0zegrLaGyhY=": "405357000000", + "mL-LgJc2zvAqS4sX8I_jekHcz9Jm0oJ7vSQrRuBF52c=": "385509000000", + "mL1_hi_bZ4CZkUB6Y7jBRqf8RAdXMGmbFLf29xO0aZ4=": "576923000000", + "mLryScNSg0wIqH4pJ7GmtOjzevlrIgs3_Rz6bC4iUok=": "384615000000", + "mLs3wN9LD4ymo6h87V8qd3mV6q_kLGvivq95hqu8mfI=": "2083333000000", + "mMKN2YcGylVo_ZjdP6gFroIvNW5QuaRMRIad8FnP6i4=": "769230000000", + "mMZJ1hqO4ovUqCtEiZzT6WDEz6GKnzsXaRJLcEkA4gA=": "381839000000", + "mN3tseZbV_EMl39FlFNTfkx8DboOIo7TJDu5kM7QSqw=": "3747274000000", + "mNKa0gsMoObwP8oG6RiSF9HTYOwL4D8f82U8JwauoDY=": "1908842000000", + "mNqklwBEtNAZtnvqYLwKUBsdBFh5ZT-DgEb2yxugNrI=": "1923787000000", + "mOJ-P5oSN2kJxxDmdKDAU9bXl8eVhawm4BnEqphq4j0=": "403691000000", + "mOWpLlupRGBkq2uyKE_7q1fCNXgutdjlttMyb3f2osI=": "452533000000", + "mOe2b_st49f3aq4tp2I1NpsXDWREZn4zl4cRohkVE4U=": "764788000000", + "mOr6FPZmxIqhXvBydGHGu_dI3ZkDV-9ewbmrjcKlLbg=": "636269000000", + "mPDg3EK5pXUmLjnUhdoYqmlzYEZ9NE6-eb0mN1k6O5k=": "689563000000", + "mPLl2beT9Gt8RdeFbWjyGJpowHa_Ztw7f4XhpAoC86A=": "455600000000", + "mPN1xj3GbEjHmDAJ9o-0fEYyL99i6A0dy0lQCSmVINc=": "461144000000", + "mQMb54bD9UokI19LhSaZrHhov3rtUhvEP1y8-2JjQjY=": "385505000000", + "mQTL2Qjxrz2e79xeL0NuSbJGsIT3xSS_jQ52-9FzQww=": "687952000000", + "mQl7xDRCc4_6TVBSRZq_8zORqHmo0mugWy8YGzkJUjw=": "416652000000", + "mQmBHh0tz9vTtobpKa68mxbyEKVoJXyNeuOULS3yEkE=": "405846000000", + "mR6_l2fnqtG3pICx8YVDCaYdfc2pMOxK2a92OiXmlFk=": "3846153000000", + "mSJHv-PBhe2_Vy42IkJVvQKN9JpBRKx8DRx8Fc5IvOk=": "454445000000", + "mSo3jCIzrvc5WevACW_ty4dIOq_VcYKiQ8aYp_SHuMA=": "383148000000", + "mTNlA8JBHATxfkKC98l9YJfUk_9x3OJ76WO_fwvtQhM=": "529179000000", + "mTawaguepq5nU9slRhp6xSO-ra2NqDzeJeVaPFlN1aA=": "1144095000000", + "mTp0w5n011DQTlCS-QwSYx5OE-3UtvwQAzD_MLHiTlk=": "448226000000", + "mTryuzArR5mxxaFMUXiEFoa56wv4nIIGQbORHPPDoVY=": "452201000000", + "mU2oio2bpfoMWGMq97eFKmhE8rVNdTVdz1wnXIDhFPo=": "409546000000", + "mU2pPc-FFM1HqMUaAfh6n_OwXdQY4wJUrdUYgs9Akv8=": "391327000000", + "mU89a_G8CKtuZ6YigkwbUVgBTuaqNxnVMq0zJPeEE3o=": "385514000000", + "mU8fjAkGGZLwdn0xTO-lo1bN6exxpw7FUWB-kIddjYw=": "769230000000", + "mUD-mP3LKgbt8WdmYg0TxY11UNxLIOG92XZYdyQDggY=": "451898000000", + "mUY_p6EPE5RWF8ZhMJTznw5I0Cw8Bb5RhaDLbvaCRm4=": "4166812000000", + "mUcPkjy9pDMdXsmHpffxQV1n4QpXc0pMGfRfTf-HZJg=": "469404000000", + "mV1HSPJzlUxhGzTScsWO_Ma7ImCzkJjQ0CYTq-9gaXw=": "588911000000", + "mVIDfWmx1ZT2dC3Q_wAIZLuPgLh2IhvrRblwJGwtl_0=": "805082000000", + "mVvtj2RKdXIPYe3vC4g_OIrAc-K-sF0JMPG824fRY0Q=": "2756294000000", + "mW0SALbc3LtTeC-6zdvYe1pFumWwU5Sz93jvp0RwKTM=": "1889005000000", + "mW7jsg_RT8nPCT0suJD4iqHhQvBOemBLucVqQXVP8kw=": "4727509000000", + "mW9sKyWi3b6rcnKJCjEK0LgvzcMg0xPOT4rHToDvZ1A=": "2059114000000", + "mWbD7UgzunSCLCrcRzf8kJ87UJDOE1KRyBhzHVdb-K0=": "455600000000", + "mWbRBMlWe76Kc4QvVqaJxk1Exa2brEjHb0dR2SWjhKI=": "1331790000000", + "mX4WyArrWsAMv2ZiB9uoX_aWBWFnRvLSxrH7IkjkTuI=": "385123000000", + "mX4muZ-5S5RN-kM00YALudGrNTmEZAUaFdJphlfGPfg=": "564314000000", + "mY4iDqST0XEENStuHAmARb172WXaCNfBjjEXsFrNiIk=": "451692000000", + "mYQtWxyhfXEUA6OFE0RG_0HTm0KixlZI22O2-wcJi3Y=": "378006000000", + "mYddrhVfwmUmRINMla37OqRaG3nCRNRB8YV7ntDYMx0=": "656619000000", + "mYkd6Ft0lFiuvfJvq2U1m9CqZxNpbDjQKbNe3Q0wOkQ=": "1043831000000", + "mYpPnKHVYOejpNed6h9ezZKWcp_9DA2nFeb6gueGVVk=": "6637952000000", + "mYv1TnQLr5f_tKk3hm7NT85eEGxqerUuhYXq9CU-pco=": "1951354000000", + "mZ8dZVeB6hvMDVCvP0MXOIKZzgiHlL3cTNt3WZuIPT0=": "1156517000000", + "mZAN3mywAydrwGapMG_7dTqlbOBke6bvre9gEwT2y20=": "2925713000000", + "mZFfcglV5GWSzr3Czh6ONJDP3sc5mWhzckgLZrJen14=": "910115000000", + "mZZ0EMvQz31cYLbVPUr6KCqqeQtYb51k1yHzbJ3d_Ck=": "378310000000", + "m_CemrTZdfFgRJPfbD3w77gQIAPnUI1dN6iLOxpI8Po=": "769105000000", + "m_I4MjN8iEAt2Pdub25LkXYpS3mhCyVMla1bJv2SWsc=": "1157258000000", + "m_aycUWot5aaVWjUJqsdvfuXeGzFpes6iYcvbQTXej4=": "3322285000000", + "m_dAjr4fF1j0W9QEAhqRzefQDWuQmbIEfyJffBs7J1Y=": "820377000000", + "ma35NI3Xxw5-M4FRmgCKsPF464AZnPa5UqokdAzyyKE=": "471203000000", + "maMElOMSsIvPCMRdpnDJcuXiu0AIlWpbQfPoXqWET48=": "2021862000000", + "manV64y5J2-PVegaWw-lhW-nMtoai8eUnrAO4ioCojw=": "762930000000", + "mayXYaFLihS-vwU--6kF-a8YJ868EgjWYssltbcVscI=": "767693000000", + "mb5_5Jfw2feVGG6WfxVS3KEAKLh28p7IVyv-VNkD-JQ=": "384531000000", + "mbOKmMAslqbQb4m5UBGHHRvEsek8Y78RavEZ84VXUB0=": "454342000000", + "mbnoGif2yb6uPN_Fw1xcREU5sqm7yHmG4qsEy3BK4aY=": "455600000000", + "mbubnbLEaUFnqotZ7sLg7m4A1vcW5zw-T2TBjhB5cBw=": "4694039000000", + "mcn0rhMfLfyVneosRFwF-w81T7xnjlajNsLlkuJGvM0=": "1153846000000", + "mcrwiC50qEyKPfwYJl33Wde78ZYA5c3hktHCULDvqbI=": "4571675000000", + "mdOIXAMNAAZxCbePsbqTGV5IjE9Yktr7py1XGidRMy0=": "391005000000", + "md_2cPlyST-tiuORQjD-VWX8oXGwlktmmy1vvYC5Lbc=": "2062284000000", + "mdeiVPnc1LXpUFP3ZAsmKyNcLYK6Rx2uNP0WTmO14LQ=": "383241000000", + "mdnfBFudgYvkMrGTqOhHUMfjcVVnT75r8-U5OpqOOlk=": "1923076000000", + "mdtnpMQjGdlRMBAbXmpsLdE5xMHFmgRm9jFuYs-FOuk=": "768373000000", + "meGSD-O_IBkXjjaMhoA_ed8cd3L_aMvcTCal17sC_No=": "449698000000", + "meinkGOI726zLW0e42Cr_oYAEi4bfGX1VJh3dU0HYHc=": "616749000000", + "mf-JRoXVGiDHST0wLKnBwvUAkvOSc4MSLmCTeVt1qkc=": "1590488000000", + "mf5HKG9Bsp1q5bnBym7dWM6VzkOBXpbbKVpMrQSRfOs=": "420691000000", + "mff7KGqq37nkBbV5R3W3QSNxDFUsXxWVAGE3yXzf4Qc=": "907772000000", + "mfyOygTJ_JhUgn7sc5IEGwB6eZV-xZDtzdKT_EkzydU=": "3852131000000", + "mg6yH14HOM8QeoFU27vZG3NkzQExW7em50IFFru-M5E=": "414813000000", + "mgB_7AZ3f0El0D3iEnKbxzTARVTDNvN-TrrOIBgbLMs=": "393877000000", + "mgHa1GHY0CGPTjSbYyJSxL9CAvu6nQap4RhjxvqBEAA=": "389613000000", + "mgJ_V00WWpAovQdyzJ0n5qW0GRzZlyk8PYCYdbv4O8A=": "2483049000000", + "mgKFerxsm2v-dDbknK5GNZxAvx5L6EXVKTUJuwum1r8=": "548770000000", + "mh-GakteTXXKtnXkf64dzzYbQxtcVFEjxpAi0rgVDxw=": "416775000000", + "mh2Pc1kxjqlFIqUZFnpI-pxpqu-E-WxQSj3Qmmg3Y5c=": "384615000000", + "mhF84pchbreXcduIjLB8SFeLFCXkC22ft3dRWk-DKsI=": "462146000000", + "mhF8BvjRiFQsoF90a5lYP5C2JbmFY3XR42ODdJWOwHk=": "1978982000000", + "mho2rc_UDVCukABfbkR0_Q3hrjnE3dBSthg6oTqvffk=": "416644000000", + "mi47c09qIRju2uiycNOGOgAPONYX4P13I5NBP50U1d0=": "463795000000", + "mih0JKWMKFjcGn00UXd9grVcwdZZsNpZprUTcaQIXfg=": "452356000000", + "mjBJyNZFT1L_2nAha1La1fxdss29uSsByIhurDQBudE=": "3104469000000", + "mjLwVw3spA6VkShQRkfj4mtAlgc5kCtlBj0QN7c4d0I=": "1154123000000", + "mjg9HMYAdzLxSXf7_ViNry6XKK-95d-OZr0nXB7uBGk=": "2088168000000", + "mjk_9YxybiFE27z-uGGnX-O_iqk_HFP79xdJlyOTPSI=": "423531000000", + "mjqGbV9ee2AEMv0X_LRHWno2r_U_X4Xe438K2BjwEiQ=": "412781000000", + "mjs6v-uoi3YszqHFIyaynoJ8L6pDDLP-XLJ-7WGZIl0=": "462839000000", + "mk92M9tnhM6m5AkAkVD5J3gsj7w1sftSka3Q5UGDthU=": "1130571000000", + "mkBmSMysxymVCD82qLx9Ijbj9JcmimWCn_eIRtnEfio=": "4621453000000", + "mkECt2JyzXNsM81N1jfjob9yxQqhAJxCCVfrp9WfQBg=": "4545454000000", + "mkRfuwWwLsh55HIlms2OQWerajFCJd39wmFxhfmCxE4=": "1133655000000", + "mka5Rk6tjLmwx973vg-_eAt3a3DiaxwTG5tO8QZkb9w=": "1890021000000", + "mkjVBbjTj19Hgl9kOic7WOtxBkNCaT7jmVcPQw_nmnQ=": "454648000000", + "mlJGC_id23C30WLNdjuiIT2Y6jDyUB5c5qrLNFgi8wk=": "383629000000", + "mlK2zRwnHh_oDXU3TA8cxGCofQqGxrmkO9marF5Z7iE=": "530710000000", + "mlXy_1minPsUgPuj2_kzZCLep0a8Lrq8l33g1cUeEhE=": "804129000000", + "mm_LVotFzFrja6zx13NHD9qmmGsHgO05vf_1dJQJjY8=": "416666000000", + "mmpPJAz8I1OFFl_IBrqhws1xFYUa2RX4tZxRf0FF0KI=": "411085000000", + "mmq6hu4hFOPhnyc3ESladICRBnSbPklsv6qmmLVl5B4=": "769230000000", + "mn40GZfihdNrFOgfRmaRga3uO61sY4oqsGkIztAmB9s=": "454850000000", + "mnlwNLgSqmAgYrCULZVRZL-5559wJ1VxNb3hTqtKWF4=": "917122000000", + "moPaFD-iQuXXsthkD48aU-9o3feoBUpvqCxCZsKdfXk=": "2083333000000", + "moZIbMdvE-U-_eTQUGbSte0Z4vRseh8TZOlIPnvvfu0=": "385506000000", + "motcSPBj5Obdl7nhAw-X7y0fswZvCDWsJUbMSyDHntE=": "836874000000", + "mpFbmf7OTH8KwhpX_7mb9K0GN2wPhnD4wRfPIV7thmc=": "385510000000", + "mpNCs1pb22tskrUAs4w9e2Y0PNwqTmYe9siChTzI1YI=": "2271830000000", + "mpY6B7Se3gzRJUxHmUAOxRgKv8eClKzyOTi0A3pdhXg=": "463541000000", + "mpbhBhpW-dubvKqYalGlZo36DplG42rf3TK_1-kaDpI=": "576725000000", + "mpdTbdSXEnk7RNhUeq4nHQRzMgx9rZVmn_SC4fn0iIw=": "384615000000", + "mpwKpm8QUIXgn76DoSIIj0Lj7KsbpU0O9FBzp1zNeYc=": "4373636000000", + "mqJJIuhENTDAKj5zMWaqJ5s_DckKoaJ4GBgcUvQCblI=": "461611000000", + "mqrx6OFioFPj3eP99wgejPqNwEQ9aOZNL4QUDvm3WYQ=": "416696000000", + "mqz10ph7q3zfPT-YaWPHsAFQkAxj6_16pg93YdUIEs8=": "468837000000", + "mrl1Gh02H4Mr6y3rFI9rVEKYAWIkLwPaOb0YzPvolU0=": "463431000000", + "ms8cXARz--7NmOYPclmHKZohsbFq98mLaf-Tz_1rUis=": "454545000000", + "ms91bZ9AjzmXGG3cDgfMYQfadAC7B_OrSFWgmrZiFAs=": "3384196000000", + "msLKqjQsPc3jyZMDwAFEhTbxzjQt3pQXhTdwaSc6hfU=": "397128000000", + "msffStEwaWlYGR8QleFa-L2XjqaRQo7tQMObBTg6-oM=": "833333000000", + "mssn4zCWq0CzZV2aoMOEVOAkRdH5xJtxkJtogloTPxk=": "387826000000", + "mt5hSOiaivAoWeSy-_7pNBMmLykVkyGO9v92Xu-kKzQ=": "1153846000000", + "mtJQTG4Bvil_WQPTzJnsHfMWxE1rHeUR3Zxso0XtMWY=": "1156517000000", + "mtVOVWXPCzQ4bVYFpYtYhU8vRq3Fpjm9ir3QDCO0ZIQ=": "1156522000000", + "mtvKCkDQhVhHJ0palVlhvpszLeffT-3abSRuNpfmLi8=": "384615000000", + "mu1Qcgq4Ky28iLJW6T5rVKcqGpnMpSMSDOlLRatXMSI=": "597896000000", + "mud8Dq1HkjnG5D6MWNmpDGhVcDBFXK1kA3_3s2yYsn0=": "1319281000000", + "mupGrpsL0IjmDufIo3QPiD8iTxhzrJLtZMf_GstHtcs=": "760671000000", + "mutYCtARCxVTFhpcQ_U38MFuix2QD5fWgwNUZzKqtkE=": "2960113000000", + "mv8uNF-q7I_9wPH22eIfcSJ8kFUY6lctQ714J1BvkiM=": "411085000000", + "mwHnOXJmFHlfESMqvj1Nx2_EFK_1HOmXdxq6G1wEAWE=": "385507000000", + "mwbQqOALhOaP4FtUL9-0oPoIGZcgQL7nhcGLHEWaj6I=": "1562722000000", + "mwf3tTydxdaYqRQNn1gOVcyV_SnM8OdQq4d8d6vHpnw=": "470073000000", + "mwwJ789jTf5BPGOogUK0VZ6sSCfJBvhzQTsSS5UuibQ=": "455600000000", + "mwzptpqgB-FWBssXoS4CCOfRwiCPw-9KlfwwnFd7zkA=": "4078086000000", + "mxkPAvh-7VYAMQypvkHbYpFRTIGE-Slz_0rFu1qMbn0=": "1959914000000", + "mxvK-qWqmnzS8XacHRh86hCTyvkPWVv4e7ZTF3JYwr4=": "5093279000000", + "myDIWTXxTQEyLzZ1v9lnsLJBoWTSLXOCnasd4Ueeev0=": "408203000000", + "myL46QthZroD8CNkx_EMD_OMFVKX9ovBy8-Wm2nSos0=": "842892000000", + "mySVSuEqhV8RacpQ2qiccD-mQb02s__C58eGRqzJ-hI=": "3412615000000", + "mylObiuruthbLh5bBiJ_HGrOkgLulThJPRRou9ZvUVc=": "383204000000", + "myoxUsEtHlxZxcKdc5DdKPcTmg0gCpJm5BRG4N_c_U8=": "423076000000", + "myxAeNxkJJh8HXAugOcRccBNKdBLjFo1ylOzCy3os0c=": "469349000000", + "mzG3Gw2fWHucXYQ94O_3qXk7KI5P2UXXdwifMS8ubYM=": "1158619000000", + "mzHp38U7zEobRoqKAInpwDJ5K2a5748LghFx_HEJdbI=": "3530288000000", + "mzILaU3_aANOCkAn9mYVg2VVsDB4XjoeGcfJ7r2gDiI=": "427093000000", + "mzkqowINuebLx2hnlxi4bxqzSSb-czDCRGzQzsMH8HE=": "470856000000", + "n-Pi1NntvPDxbY4q6_IYaQr0IQBXb8IeT8OEmw9BJp8=": "3695416000000", + "n-Yla2kLk7t1PGyT494ItvOileO6_fyOmMZtdk1Gb7w=": "4087632000000", + "n-pR8A0dz8FrHSYFm0SpVqEOABXYX86rZgAs_FUed3U=": "385509000000", + "n-zlTxJEVD-YfJfckohNwc9JhuFIAggoda9D_8c7Cbw=": "1370999000000", + "n0REofvOH2f3huSRzUuUlucQLnh-Q3S-8YKQKbpHr1o=": "1153815000000", + "n1M8qja-qyZbhHvvDCJhB091OTmXtfa4beK04x7g3qo=": "3190592000000", + "n1OTyyjLf3IQS5JYcep76d4yeBg1lfFfEa4aZBbPMk8=": "387996000000", + "n1Uc7gAyiBFHspT7JbK3MJLt6Chhm4k5wPm2F1W3QkQ=": "466620000000", + "n1XumIFTsOFILVvGa3zItfNXVZ0nKwjSBraPHdedFHg=": "2061902000000", + "n24xRzGOJHh26zGmpYsOm3x-NWbkmeCfM_aHqUt5yVA=": "384615000000", + "n2AECb63-PJTCWlK7soUswbRb4rdgWkuCV2DbubpRZ4=": "1179356000000", + "n2Id0oTNYLL8P1hC7jO0-iGGNXGcupNcqPs3ksRiHMo=": "416901000000", + "n2ZyK2jKKuq71oWai5AxgdSk7251yaM7mxJy6OH4nLc=": "381805000000", + "n3JoTgCVx4JGq15LeVnZ6zpLseNhh7UgfvvhaRtaQUc=": "1354095000000", + "n3bJFIJD6g5SDuDpAiseaJDpyL2CZiLK-3orzOWKQv4=": "416666000000", + "n4Axi3QEOka7fTLKMsQaZK79HVPkNZB0Npfu14f6cQE=": "448425000000", + "n4VzGSkd-OrbJGvZHRnykA2w8y3y2P-z7wzio2qNjII=": "464950000000", + "n5-d-UyT0_pak1deCKSvyaQUlZL6ubZ6wE2cTDkukwc=": "3033046000000", + "n51Xo11tW-ibbL-AOwadL67IEomsLPzXEdRQeVMOPoI=": "833300000000", + "n57EutK4VB1Zx2BOWmle3sRTan3QPvADkGofUpFHApc=": "462784000000", + "n58HBg4e1QWdWPcihgac6YweUgcJUgLgwWglEO0U7yU=": "378995000000", + "n5KgWA2GqhGEjwS6ZK3JqV-pOdFnUzhRhdHXruh9zpo=": "1556113000000", + "n5hRj1emq4DF-8wW-kZo0RNmsMTiMynCTP94D60rPpQ=": "454545000000", + "n5on8xtjzf3Zv9_s3HpsQE3go_GvLnw0xzR4VgPnets=": "1642956000000", + "n5wG6WIvTCS34mj1MHdRPy0ZG9Yf4kOwsKSzWkV8nhY=": "385258000000", + "n6rjUSixgLu2mYqJqZiG_ZNdWGzmuZ_1msdXBA3Y2bo=": "569876000000", + "n6wWqbL2NHkZIIb3dtqJJoG7yavbCVvDYDC1Z9hTDaw=": "456239000000", + "n7Gz667w4Wk_2VrTMEOWDOCj6OqFzmSQUmlEtoomN10=": "404814000000", + "n7YczjTGc2wp-C9Z328h4s5d8Wn_CUliQqkb2kGjkqc=": "380428000000", + "n7t89-orOrNnKPI38BOEkAZREUJUajDxM1NSz8nEIVI=": "826828000000", + "n7vsqQffx1Eo3jVTWxQTr9afFiBcKsofD9n9oOD2Uvs=": "384615000000", + "n8E0heLGtBD4TYYYlvchcU1GoXYRwnTAgVcpRY0GqlU=": "4011344000000", + "n8NVfGqOpEkSYuP-r2qQlK_01LcfEPiXEDeO7xoHkUA=": "1156528000000", + "n8XPd-u3c7pIR7-RFetafQDIIK7sHNeBuFk8OqXSy54=": "814902000000", + "n8_fUhmdZxJwyv6B_xBRjnST8p3iFByVI7QXAP0W0G8=": "1063461000000", + "n8dATQOGJks-xwwOnUpnBSSaENGxinWe1vWAWi-iEKo=": "450062000000", + "n9GQ2qXx6jTQufAA2-B-AXPFdM3AeM0J1kmP4UFqhXU=": "2306691000000", + "n9VEEaC3yqK8VGF12qpGlNvNTQDsmL4AcUGSNQoVFJs=": "2055429000000", + "n9ivAUZcsGWmrJBR_ZNAgRH5ZveaQl92ZtzLfqBKGQk=": "3656282000000", + "n9pvX3bc2XPLXEzQW_qsIgAip9kcI0ydMLF97vNaMbk=": "469468000000", + "n9rFbhLy1BIyWvJ9xX_vupGZFO7fJ9hR6q6fKmEH_SU=": "385213000000", + "nAYq5_iMLNzrsjvXp1mMYOSWtCz1ex9nreef4C-uzTM=": "2406412000000", + "nAZdrJiJFwFoWwg0x_CYXLUasNJqFOGB2QUZ-4hVoSw=": "420128000000", + "nAqXEejkdEZ7irxMsS4o2BpzQN-5Vq1Q4smiImBNg_g=": "378341000000", + "nBGYOEjpevTJSAvLQTLMSD4EISCK6Mt6V0pNdIINWOE=": "3372600000000", + "nCHpS8Ou7ozQ3XVBB3zq7kwrqOoY8k3z6SS-L5mWkFQ=": "418546000000", + "nCUFAzEXdXOZZnPch79IQzYZCsgCVzAxzxdGOmrTMNA=": "500797000000", + "nCWQRuFaTvDUQfV-l2L56bKAV-HAzCa5gdI6XFKZYNQ=": "384615000000", + "nDFGkVYtO73yZb4QgXUaSdcvAAL7inSjUm-SvKD7ZFg=": "384615000000", + "nDFXLHp1r8NmPzbYa0uqvalHtYP3uxFUsZVBMk5uLwc=": "657692000000", + "nDrlBWVOxcX-r0e3SS1yhfOfzwgEjjBZJmbXyZzgh_k=": "385731000000", + "nE7Sblq0muflgULiZFZec9R9A0iw0gH3mhsFOuaPzEQ=": "8228306000000", + "nEBDbibz0QIID2s7qp7sA239MXKufIDSqdzunVcYjlI=": "984770000000", + "nEJjEGMaPF5Ico8jM8C40Zphs6PPloiEEkVmyEx9JIM=": "1378448000000", + "nEJpxIQzHaSyMAnLPw-2bwekk7TLDfarxUfktEYSJxk=": "446388000000", + "nEZiLu--LCjAMt_V35fhL0AYWz2kN2SFZiwe-MQ4cIY=": "988740000000", + "nEuJsi-Z19fxdFHxl25u9xaxrYVK3L52t-wQP9UhjcI=": "385510000000", + "nEw32OCvmc3zDKXZ6SpAC6wewUwZ9qMB4HaiTLrvDqI=": "3915443000000", + "nFIjzP4179_y4pijoV_VTLd6f6VGRZ9ZuJdkn6NnmWY=": "422471000000", + "nFTTqGxQ6Gu-SkdDPzxST-1Tc9yMWRjXyRE1m6XraBc=": "463761000000", + "nGkMTxecl74V_tDKrrPZmRRe5ksWopLF9_yt_UGs2lM=": "734514000000", + "nHCX9KyRccbfpTzbfUrPA1T4-Aesty20fg93_3rthe0=": "391797000000", + "nHLO41LvnNvLOIgaN0f80hXehF7pJN4_zLiATBpm1mE=": "4621453000000", + "nHNrr-RKdcbGeWzpdUmv2ZDmTK-ND3t--S81F88x-Pg=": "384615000000", + "nHugt0olAEr69Ued6uupcjZse2WkCmwSnZS619iDwc8=": "454756000000", + "nI42LJkscl6RKYQA_iTfMXg9O7XWodZ-l42eRR-BSq4=": "833331000000", + "nI674zIXYBo5OUGvZsis961Ntxy4brbMYTU6n4RlArk=": "831312000000", + "nIqCuAKDxC_NF0pG4gwc9K5Cy_Z7FZhpoQTJKAIugnU=": "385506000000", + "nJ57DlmQ9iOfsO2Wu7OCtw8R4iVg6prP0B1-zZ1XChY=": "20646899000000", + "nJAHwgaarEZBY35WbB-bjZjJT7nwmUHwUmk7rynX5H8=": "7394562000000", + "nJuro8km3GINK75zSwmMdYkBgyaojUjPNlf1DKnQOi4=": "1154123000000", + "nJusAbgocBtcf6KVG2UD-XgZMMa9j6rHM3NBdiS5Vio=": "7972680000000", + "nK4IyAnl5stL_t7SN2qOG-2r-IYv3cy0HCu5pyHdGhY=": "377987000000", + "nK8lF0nMHMulQzoPnoLgYibUOtuSTN8nV3dP848IZYU=": "380208000000", + "nKPMIXzjCLP2XneV8SW0_bf-VCYugae_EBbFBRPhxlk=": "769230000000", + "nKXRJRMFRa_BP0taUffbHnT0SUlhouuBVuSeSuBt5D8=": "2692307000000", + "nKkOs_lplqZUCiOelqzLKH9SFd_tJyAKt0BfpqB74x0=": "5188649000000", + "nL3jDVpKy7XeLwZ88ExNb58oVGCb23VMicQXrrUSH44=": "385507000000", + "nLjJMU_jKqljg-kMjzpt9_Mbxx2i0PTLftGMZEcHrGw=": "378611000000", + "nMQO1DQzVOH_EMMZEhNDHhRGrmxpjMN30wZQcUzUUeM=": "1134971000000", + "nMS_SFlyxgxmAXS6FHsg1q0HZoZDLL6EVF7AaRFnsRw=": "2022201000000", + "nMSrLPCg8SHXa3FFH7k3cPkFWqFbLTlmymbOQcM806M=": "769428000000", + "nMcuuci8Bv9J0e6FQ25H2bmvA55Eu6see7bdVAHbsGA=": "480295000000", + "nMhyCONYfHkFFnyWFeKefmz_ErwwLKN1w_5ISlEjOtc=": "1349526000000", + "nMl8NGErV73fObeuCdbavFlnxvLRMdxWtPEyuEv0UVY=": "385506000000", + "nP4Pq7OXt2KDJFhJqM4Wh3D73kaB7_STGFhz8wa51n0=": "384615000000", + "nPBb2aMn6tXtMuaRIxCHEsXAYsekQJ8H567Vr-ooisQ=": "4091726000000", + "nPEPt-mNULMwF259hbpcUilpc6Z-opiJ9CNJDnCLHj4=": "1666666000000", + "nPa1w4752ZDGJJQ8_m9b8hZiRlA_KRGfiqNdaTTH-yU=": "384615000000", + "nPq4I6p-IvK_Vfh1xlJm6FsiOlLSaXGsUI_dDjLGgGg=": "469402000000", + "nPs7CfLtaYBvhY8MEqpq2zxao8oTSnrOAevlE1QUeMA=": "914050000000", + "nQTLiixqimskzXRI4ZrmZ3kOpMIwl7KuebKSrkHu9ZY=": "1893589000000", + "nRRffEOcNsW5upD5ienlyl0aCbjrVtnhiPO9OETR71E=": "412158000000", + "nS1Cwvbdvezk_-gCw37tshm2SIMrK70q2kbwDP8YFvA=": "411851000000", + "nS6fOQRIPD1xiZfolHKGAGGkX-4qhTCR1ppTx14LvtA=": "384615000000", + "nSH-5lTRKH9owzYrgCTLLLe7gg_0CvDXlYV_Z2LwwJ0=": "1242008000000", + "nT1LZSr8loWTbeAfxcQ3tdv7gjNj7rkZDjhI9PyPNP4=": "768464000000", + "nT3fZF7IMR4vRxHwwQmHAftPjKh730DWiFWe06Z7InE=": "1923076000000", + "nT3vmIMU7IuskNvqWJlhDkhbzXuUYuiFPzns4vFtgbM=": "1344514000000", + "nTETbPHTEhaqESyQq16lmEj1sxm5CQzHBm0Afpe9yRk=": "384615000000", + "nTIXq7j74YR-LpmNiUvyl2twBm-j-TeY8lfKdRM6nzA=": "1923076000000", + "nTQF-oVysVxE6HC0lC3LWbXFiqZdYVYCf0MOtKGvamI=": "384615000000", + "nTu9zh8YJ0M_OicASjkUYSoVLWKJt3Aa3xPgXHvGy8Q=": "1152202000000", + "nUYbvpgO_O4XqX4HAlmc-97s1GWT5OA2Nvf-5bLVxKM=": "384388000000", + "nUdQdr5FEN1Y96I7GFV1QJh1gN2FtCCkWV9lgji7qhU=": "556279000000", + "nV7I0wY_yuH_6FGyTe3gNLwEMy-DFBD4gzk4J2kTmyE=": "1228523000000", + "nVD2PVNktz1yf0nRp4fTfOXCbjBU_X2jPcyvw8FtYyE=": "910164000000", + "nVKmWLM4hPQiInBO2NlyJu2dWgOsF0UPvCeAhz2wvsU=": "500251000000", + "nVn9ZdeA52KlOQac9UhHBuimPJd5qEElwSi-BW7rA-Q=": "970681000000", + "nW-T8lm04J7qahM4FSDLbxsM4wj2BRo0FCUnEWBpEBY=": "391885000000", + "nW8bo6vQDY6K2OBWgs56wgFj7gTarYlAbzO1G2UGtls=": "1404078000000", + "nWFM0guMOx3EPcY97Mpe88VtEAHFrAro_lOXIWLeDP8=": "598794000000", + "nWU18ahYNpH5Gbz5kcl1IzK9kLXig0fPu596jEXsjfM=": "384758000000", + "nWa3ovlw4fw2HYa2bkFbmbLGgXIGJgzFBvPaDpVDPkc=": "415288000000", + "nWe0YGYUyt34_SmSHzHJh402FZ4h00oaL_RkJQGH6UE=": "473265000000", + "nWvPls-RFsJwwWyN8WvyEnnBADHOBXNpwBZ18-eagT0=": "375634000000", + "nXFXUEyxh1EZnEYFZP6CUlGWt5KZr8fFe9z4AoebMKg=": "389097000000", + "nYsi_SY_fVINxjVOF5DlYjtXZRk2JPEPah0FWxqHVCQ=": "358004000000", + "nZQ6-XPUYVqIo5En7b9klheghnvL-JwrbsowN8tBSd8=": "384615000000", + "nZX1aAYQchlrNXTug_LYtmKlsE-nZH4UwZ4mMGWayt8=": "420022000000", + "nZfasyWHptzc3i9DYwZIdxBCq9H70x07mDzn-rHkM-w=": "471941000000", + "nZrgfMf1b9ZO4GrDHkOasHsymvLKksDn7VcGqCeZXCw=": "772105000000", + "n_qgmKiLh7QNtaFJEl12rGfzAwDLCWcEkYyTpQOm69Y=": "511839000000", + "na5xB7dbKUYStuz3RSo_Kq50ONgdKZRQeWBG0JZ1Y9Y=": "466152000000", + "naZFzVXYPVZ_EWfCC9T15tMNyz00npKvKgDk24ceWMA=": "454643000000", + "naczSSaNfO4aY_EF5bpfzMfaYDbnM6tr8XR4AiO_Tlo=": "575059000000", + "naeq0jFejWS4WpuKeUqtvbYS6SaX1h8p9s0W9wLWhzU=": "612877000000", + "nau2kGzMQoxThjuHa5GubHApkoVGvjHv74JlCad-CXs=": "3722997000000", + "nb5bKaN_f6sxUNJpkjlfxuuXNhv9AYExkeLeXYdqb9A=": "2083366000000", + "nbIbbVN5ye5Jph3pOjORxNPQj3cTQVOY-jJ0oFwFAkk=": "384615000000", + "nbmkLIFYTQPaCXPdaZMsuvxSBfnBF4SrBwu4-0k_94g=": "384958000000", + "nbppL8VTf2TiMTpt0RvE__D8OoTrobzi59xSIvNEc70=": "1180412000000", + "nc-t5R_soP0y0SgNU0iS26xAZ0VAV4MEXsOk-fcxjcc=": "384615000000", + "ncVx-dqAglvSjSl1g8l0pI4xeVUF6fLqR2mW7SJapGM=": "1866440000000", + "ncmpIdepRY72NSNZzZl7wrUm4lKyJr-S2PcSJkz_0w8=": "384268000000", + "ncr99HR0MIt8JTgAnKRtEaDUDAwhWW0X_qAT6Cbe9Go=": "457013000000", + "ncw5G4KNYfeNFMgJGGd6y0rkJtJ5RW5JeZVpo7SaauM=": "597458000000", + "nd-HuJBfhzRcaUXQ4AJspWJKleNS1_LRRQJ3p8F0NrU=": "384599000000", + "ndPef-CicbcNCVuVWJGfIDGN2QldJI85tTwnjqQOi6g=": "460776000000", + "ndejaC2FuKrfVxMvnWdHdMIzRtKOegxkCYxAKWGYrAQ=": "1923076000000", + "ndfEYOi9rlwGHnuaXsDCbqqqt42mtc5bK1IAy4XdGco=": "804803000000", + "ndv-UP6gmAGgYOVJlPozulZHTNjbsPdn1X2RcjwL5Fs=": "3986462000000", + "ne2amiESMWCvFy8--2crfCdMqbnqygCX10ptkBnQnfY=": "452515000000", + "neT3DWPiFE3D3gmfonee0Lpw7PsJHOvz21OTmv99V_s=": "355692000000", + "neVISdAB3q-zhnaNBvfGqjL_X8ldQmJ6k2UGiOdx-94=": "459292000000", + "nenwBpNlqmnTY1q6qZBK82hL_CPo-LjcZW-vISQ7h7U=": "384615000000", + "neu2Pnl9P97JAZf0p4ZrWty1oJcT0TbSUROEbt0MGUA=": "385510000000", + "nf2QB96kOBZISdKDGB2G2PvwfS9lYZhZpQNZQqz7Ykg=": "450381000000", + "nfwYiUDIoZIQaBZItt0kn3bOgpfm1XIftzuNsGNvQJ0=": "407226000000", + "ng6tKZBZqAtbS5sPEk7syKfdIMb9G1XPwPt-HSnlOK0=": "384615000000", + "ngD7Coz4i0P6OROCBdU1wISVWpUtzWHDy0ZPf9Qu7cA=": "818220000000", + "ngOvS4ZQ4BU8LAYUzliHHlmE0VTOkN7SREXbug7HsZw=": "484181000000", + "nh-wdbIzYaTFSs2_y98cGwFrynZ2NTNc-JMM9nP6H60=": "450975000000", + "nh3QbOmRU7hrikg4Sw4s8ao8mhZC7FM8GrUdYXdxGSY=": "1009888000000", + "nhGC1HYB_gTaV2l5505k29uaaDsCwpXleisoIZpUmx4=": "452223000000", + "nhXQcsP8ZmXAyvywPCOGWs6QNcOzY6QyKbrD8mbTeRk=": "909090000000", + "nhbMrAZojkKY05mhOK15goBPtF61nvJAT4RB04bl8LI=": "379354000000", + "nhhAEHX3bjUlvpnvLBLON4Lx6VEo-nj1pAPrpRb4I44=": "416335000000", + "niBZUcu65cjd7YWnYYfppc5EWKOEVMwK0gRJdSLb-Sc=": "1363636000000", + "niE_8htF9_ugaaxeL9L2gXW7W5NmTdu6fs3XDNMaBGc=": "384732000000", + "niJdOo-i4XkHL5VbclqugHV_IcWMlBp92QIDhy4CJaA=": "421370000000", + "niVKlaVcr8ROjUw323mjk8RRHv3F2bP8r6RbtvkGdTg=": "563636000000", + "nicwV4wiVxvYYhG9T6pfy1GtL9FtgOHIzspRCZpZpsg=": "541749000000", + "nig_mOWJ26piZSZIPNGqQ4TjIcJ2LHlPwIdnwnK890A=": "380610000000", + "nislBGlpXccMPAXMRNoiR4KzDDonIAQVI2VpWH-3VUs=": "1170708000000", + "njNN6FaeppyRGmKF_k0e9-WDYhK5VzFpqc5b4cqWrAw=": "384615000000", + "nkRcr2KkmOGKgJyBbpO6ahQuYJX3pVzC2XycYd6Be40=": "377783000000", + "nl-6yp6FDpCV9M6QMqMvshhKRKZPZW9ZW_ZeJiq3N7A=": "470198000000", + "nlVN4CRlRS4pwvJZiitkShDJeSZfCjxthlQ4_Nx6RJs=": "423762000000", + "nlzPF0jVKoU14sCHRJCF38cXcXdeLwJIiRPmjHVqZek=": "637540000000", + "nmP0BH7q4h6E-e8m7nSP8_bp9MWgGQmPOv7rCaY059M=": "3294336000000", + "nmPseYbc8FXMYdAzJBPiW1oqfAy-uIk92Ht95IZTUvY=": "416644000000", + "nn5YJ1UqeGNG-9BncvtAqNMIa8fhf6-ZmvUxx8IFbug=": "3846153000000", + "nnRnDA4sxkaeLNs1Xpv5vSFgunggj0nJFvHKWrnGcFQ=": "384807000000", + "no--KahJpAgpCaLaMjqS9j-TK9ObjPq4Zv_qamqiFjM=": "3846153000000", + "noPt0IKKYVbOA5mdiZhIbETFB65294RTHny3IInBFWo=": "416650000000", + "noqIYpv8uTnKNJeFlPy9txVdniJ65K3w5Rsfh9zzsm0=": "470865000000", + "noywNZ176YKClP7t-D50ycnCKWAb42tvUkLPJmilUcE=": "450246000000", + "npHJzFPKD6VqivcrEInU2hSi2qpbpA3pd2zf3oMZ6qs=": "1978468000000", + "npO-O4Umq70cL_5OC17D7FbodDayVPhn39zDYd5iV8s=": "930524000000", + "npSveHuFhKIA_FH0qUj4exctSrQS3XjP3htdcybKICs=": "3755173000000", + "npnnvsHuqsrVWQtW8YioF3qDfd6iPI4V8AhuMsFxjog=": "1270412000000", + "npuCMhpOg6lkl6V8LLi1S4eiIXTAWHCW3bCOABvlRC8=": "1211627000000", + "nq520Xt6rlvhrYQeU_DcM2JNdmX6jiEVFqzrdDzCygs=": "462785000000", + "nqH68t1GCL83C313pSKE0zHnCkuEFjX7CxoUAYcKMow=": "500019000000", + "nqW1HaZUBjgaHyy_-Ol4KjEVN_Y13qJXdgbtsHMupkk=": "769230000000", + "nqx96JzXn3kSxRMwtYKptGEcQ2ApD3RXXCrfYdU8Q3Q=": "1373518000000", + "nrJ957PYfEoMPF5sDohh0k-omcwyHNzKHkFgogRmxT4=": "1223425000000", + "nrOiGzEOMcMfyrX8umzOSIHAf9Iawtl7j8tWXAgCzoE=": "454332000000", + "nrRhn8NFY7BRhLGniBU98NDKpaVBw3jbWfQkmxRlkbs=": "1149765000000", + "nra37ch0h0P6lcdK2QVPz8isLuRzrO8FE4xqrSz66eg=": "1891285000000", + "nrablJoaFYG53IqXcJOTfFyXVM95hrukUMTG7Yw3Cdw=": "8846153000000", + "nrloerwMGBXNpWwg5MCD6B0_RhOXJ4QD9_SmcChqucI=": "1153846000000", + "nro6VFkUw3-d2DXeePAZYtd6l3bRcoOUDZ_40HktW_A=": "384629000000", + "nrunXZpmKWCDPV3mQsVvqcPOLtOXd0UboNLT283TBg4=": "1927530000000", + "nsTWMki78C93-5mheP1nqhcP15viaOIE8vHPe6ajwpQ=": "1249999000000", + "nscJJi35EK5qBNbMfq7171OmFqPtjJJoLQNUj0GNAqw=": "411085000000", + "nsosUD52l5qV760n6vJFx0KXH9TVOO3A2vT1kdb60LM=": "3856657000000", + "nsrZ1vs4-bdoXbl0lJPnJ6nYq2ZGWzpOv_oAxRjkcSk=": "385528000000", + "nt6y11EfmgVBzwnyxnHnjIwnRugiIIQPYwYe9z8bqJ8=": "720996000000", + "ntDvR2jGopm38ti8V1JEHmCPYNApKEFIsX_mEWMmWnA=": "420440000000", + "ntVBKfT_SfDQY5FJb1bkzFjUPbdR0d4j1bJ3Bocb-L8=": "4166666000000", + "ntpl2sn0YBY2T94EiZuT8YjrPZu4i2z9uAZ5LBO49ts=": "1252906000000", + "nuOwI9io0TCbk68yrQkOT2tyoMLXkt2CZFTkB6zvK3E=": "15923229000000", + "nuRdUDlDdoRtrmwCQsY6VjyD_8AWr0O5Kd_mMx0kn1g=": "1538461000000", + "nufJgV1YOtVWmcXR2YkGDLN0RlpSJGl_-d8f4_vjjNs=": "384564000000", + "nupvnuKJqmQ6PqhGQrI5-ZTx6WCfvpBkqIg4taO1fx0=": "449892000000", + "nuvQIMTx8I7lwyKhcuNQ354CXiJVWWNjmM4sonmAoP0=": "384615000000", + "nvk6lDsjIvmKae_AJm-kP9brCvIEiR9-dlm5P0Pvgow=": "8160016000000", + "nw3dp78sObe6_gyuG5sglbqkAaJX2uPQiRxijCSLwrY=": "812088000000", + "nwcfWshuPz7T4UKV78n0hfucQIpHHAANcx7cLcN2zVI=": "1153846000000", + "nx4sTcskQMqaR-6t_HJbg3HwKrGLoCfE0_BkKcwTqrY=": "1153846000000", + "nyAKlXl60kE3vsSifwMA37K11IPmx2ICxerQQjb7fz0=": "384631000000", + "nyAOK_Y6rlgNPOkn7hTLLfYvEELMtjRyK322t92yQoE=": "467359000000", + "nyVcw-4y1ot1M_uZqezxfMzsKu37igZZc-VoaOWF-s8=": "389459000000", + "nyqLAIfrPgerMO1O7ndGRIOd2yDm7b62NuZ3mV9DnrM=": "1827146000000", + "nyvB8LpUddo90QxHRicQfb2dh7sDCQyfi-mhmZgC2bI=": "384615000000", + "nyxIdmw8J2IwdhzEervVTRYxf01ooA8AJZC7yqImFww=": "377786000000", + "nyzJoGtHS5ldudgJX71iRNy0VVADGe9Lj5c452ze93M=": "405357000000", + "nz2T53gwbypGaX18GfCLWFd2B6Yu7KBmH3fKBbNK7PE=": "521440000000", + "nz6OctAS3vTpfkTbfhK8YlcbJ7_zsUQgAo5yLdSYF8w=": "768904000000", + "nzB-3MjsEmnSrjrhnPSbo1KHXpCpXaNlQguIB3j_8UE=": "416520000000", + "nzGdGLCyK7VPpnUgl3918XfzX4EoR-W0sxJ_AG6TXKA=": "1363636000000", + "nzGoS_h_PxABA3kb7U2LUVzp3qVZvpSrrzECXx9xIzM=": "391957000000", + "nzVhY4eTUGY8Lol3nD_yfX3hYsuBBs9IU9bF-tVrc3g=": "2784601000000", + "nzh0fKmasCkYggRx0tKrEOAjt-SaaDNmh8oinwr8NZk=": "1238591000000", + "o-2WOGOInXzVSA-3Kl40BCtk7WBtu-v41VNCzzisWmg=": "384615000000", + "o-B7MYhCKdFdirgW4oyFWrnIqgYlq6uB9OpfmgfeUb0=": "2156572000000", + "o-BEpjCyf2-kByaMjlUY90ilWadYmAZj3dwlKVHNVFw=": "415420000000", + "o-ni7SNUVP1VfvnhQ189teXiXNcESUPitnqNlCcjimE=": "904621000000", + "o-umfD_N2o9lLKncRbUk5OZVbY05ZkJvaQznfLWILLU=": "525893000000", + "o0CSzFdFgVbFsaPiOjqnaVMjcLoQP-v5BzaZpscEJfA=": "923455000000", + "o0E_ZKq8upuZ-Ul924MqBESbRDo5-6NO0TPWoDdMHQY=": "385506000000", + "o0JrPq4o9NHbdt5aU_EPKqFp8sBZgWcOPvgk4tmK30I=": "422187000000", + "o0P2VIUfBNqRf-5gdjclStOkvqI95YYhmQIvodstu6M=": "2043414000000", + "o0QhlvUiWMio97F_10lbYqQCpDYreNBGBX_yMrdOS2Y=": "2083333000000", + "o0SyYqhbU2ku-cHFK53epnmVZX-tM8awWTqdVyKCfU4=": "384679000000", + "o1_LkpEgrfqZndWLeiu9yKaLuH6xAGlbRL5GFYUu89k=": "384615000000", + "o1jiWJI_MmBta7CfeyNl9ZJ28lwwpXJnExEGGK3oNUI=": "576551000000", + "o1lBzOj33u8Pu_4F5vH-tx8fukB1p1uHLxGXiMCTaLU=": "66714570000000", + "o2BQVxPLCPoNSUfpsww7k8-xNQfMtJYFyhlAn6ML4FQ=": "463231000000", + "o2HDjvl0XCgXpsAaIiGcDLM8hQEQD8FEHJZtTkKT1h0=": "677152000000", + "o397Qbo2arXbPyq1KPgnDxRp48Mt4rG8jlNJvJfxSzc=": "1538461000000", + "o3CtLvCcdnbrXj2_Xekhsi95X049dk00c8IA0Om-sZc=": "411085000000", + "o3aCHUJA0bvFSlDqo18QDWKzXhKdSLNh-weKNftk3Hk=": "482434000000", + "o3kFTD2taU2QJXBSI0E1-0JQ0dwiqXPzzMT-1vwc6l8=": "771280000000", + "o3xnVwwoLQm4SavoEhuaXIYnkqf-BCycUEs_8a3jOAo=": "382765000000", + "o48fhWOY6EIJQoNho-4b_ruZKBWnxI1f3M0QAHfZOFg=": "381802000000", + "o4TDLGcjK518GgZ0qdV_O3uoCeiuIZZV8eAx-yX2lLo=": "417633000000", + "o4qbxPt_Y91YluxSMEQrB2xwnUxj4iCz2WBnPlRoizg=": "417636000000", + "o50CSPyvqytKEtQw9Vv1lftUmnVJcUXf7YIoSkohA7I=": "385507000000", + "o57CiaWZVsRmvajakO7asGilD6qmIkMKHJ5FYnXrjuM=": "8346824000000", + "o5yDdpgHEov4mgzC61lO3_mss5CUs2CBf2D9k0hik00=": "1156476000000", + "o67JsRBvtoEflA-CbcBd38iNlOyafzGLq3V0HwcXUgc=": "773687000000", + "o6Lw5KCv7uT7fHOq5fj2dCUQ3SzEQGUVgymFig2LVak=": "453890000000", + "o6ZK8D-x-SLRGkG6qdxjq7jRCprcnlGdtZShqfGLDzg=": "635499000000", + "o6_dOtvdeyQllNPa_SObTLzafN99GMfCwUplLIT5pws=": "406180000000", + "o7gW2phIed_JiBTBG5OxMl8uhvMhZOArB88r6osQMuY=": "847421000000", + "o7yOIuV3coTNKwigISjKnvb3JdED2KLTADyAS_26OWs=": "7692307000000", + "o82HfaUiqb2giO1LgxfRw7fZcNkXTevKbe4QGIN_Ilw=": "378010000000", + "o9TOCNcpuLS6gVV8W9iWNOafaqLr61_gu3VTfK-8OzM=": "464662000000", + "oA5-1P4PI9DSFUtbg5kkQG5x9CYbCYc2mJ1ErlGlqg4=": "1927537000000", + "oAN5AnIdtbI5WOmoDkMoijaJwIsSo7KE7CuyaWPWRJA=": "642211000000", + "oAqfuHAevJuWp4G6AmN68uOQW-ryv3UJKmuc-BBWL74=": "381802000000", + "oB-IGWPe3xIx5jYd1tuEacO5MqVGwQHQ9SC5Aup8mBo=": "5602054000000", + "oB3RhSf0bvf2O6TSkWD4rk6Qsd0pPsiDv1C0fKZrD0o=": "836250000000", + "oB6z165a-ySgCRHh561qvTxsFT3Lr7DSBAr95y_Cod4=": "3364965000000", + "oB9_GR7_mJ--FypLZ3euf6Ctkp6S6Y8Mj5wmM5ItbaE=": "455600000000", + "oBYiLMCP1PRu11ZneKUeqUr9gtIzzkKA5EUAj4m9fP8=": "390237000000", + "oBkIXC0uFF-G8QR3T_sMhSr4SbFZqZKNt2TBerARkZg=": "461906000000", + "oBxMnDW97dWQQ2ZHsXsu7UB3YSol3NGgHV61HcnxWVM=": "994130000000", + "oCA74wQxl7IzFXxk5l0zmXxX_2oY3Ri7nKai4wOX8bc=": "1168476000000", + "oCImTwrHOJraPxAuO3hBBkB9Jg3YqE0PrKk-9ABvuiM=": "454200000000", + "oCROVsptepFndrEIF_wJTi6ZKUAPi7aFnzNaEeOZkd0=": "11580614000000", + "oCcZomkUB6QwNPXCY0HpSIcolRA-lllveb8Xjq9u_3c=": "4448085000000", + "oCqa0Ai_bMLjMLOhR_EvkrhBh7TX4qao_7iLYs0CBIw=": "411609000000", + "oCvpQef_yDLPg-Qx5JYwR5ZtFKT0Z3MymYg3q1D_CI8=": "1382564000000", + "oDCXB7ACjVx0GN_BBGpzOsVLp6qKIO-OCwnDTXnBkMQ=": "384604000000", + "oDD4L6R5E7GhNogxNxunUtqOOuxbNknggX3cajB6sJU=": "385510000000", + "oDFjVlNdkrdSztKJAhTbpnq15Z9xhFXtzqU8kOUODRs=": "1153846000000", + "oDHNT2B-FJ90ruNC7ohUlniNKuaJH1ba0W4mQSK8-8M=": "837715000000", + "oDT-iW5dDQ9ys9SU-SI1UfY7jrTkSxhDtm664Z5XxO8=": "416843000000", + "oDjayLbupl37yRdHBCcVWr8yhr3mNpa4KXReJWhw1Wk=": "731483000000", + "oDjlXE-l3YQVbaUBIokJJmHuydZubog-sVpT2Qz0Xpo=": "3625572000000", + "oDlMA3thWsYda_4ilA_ZGG5wzTZo2H0vevJmsSpjTto=": "2386333000000", + "oDpLWKOMtWiMjTsq3toCkIcBIe0x7_vbsXCC_pR3pA8=": "1518159000000", + "oDtAcz4Pr53m5QOc8ZiA7tEpOCJO-pliLvJz7jFNh5E=": "1459835000000", + "oDvcm6__90uUDdJNgMk8qKaijQ5DV8c25uTD3L5OxS4=": "462146000000", + "oE1Ivt2XlQiC3ODtgO5jUFUO8ywKniZP5SBQUIgxWQs=": "454545000000", + "oEKyJTynNpwmgCZL5eLI-P8F4QGmUQ5zrqtxEt1m_PI=": "384210000000", + "oEhbhO0wZ7MGde_O1NJ9adYOCsPD5kN-G9ILX15trJc=": "455600000000", + "oEzmXgcNqYEjmsDiPj-A06sRDom03zmbmXBmZtSg1hg=": "750335000000", + "oF4KwEK20qLgvyvm65JoWzfMmD_UhgdhuutLl4H4TGk=": "751952000000", + "oFAgdceQtxifShHwVtTfJteeEsxCiOT7Q1z9oFJQTxw=": "449205000000", + "oFTGajkZpbYCMB0M9rYzSBKr7HRBOgHBaJzSAjrHank=": "4241329000000", + "oFa5cWKlJxate3LdVEl4OfLkF10LRh_KFCtEJV1WmA0=": "416666000000", + "oFf7HRr8jIGVn5qu25znsuol5UoZ4PYTioEuDBIxsNQ=": "389217000000", + "oFuMYXnPPwU6go6S-SxQGI-lyKXza_AkibOxAg8NwJo=": "449482000000", + "oG2EAx4emMO3cHmuT2CE_iRnUMzrdsV55prZWsJoLqc=": "385506000000", + "oGDHstIwBUICm1zhu9Y_8lqSyE33ASaO-1-pTTR6ZQQ=": "6249999000000", + "oGvvo0793rmOqMcJ8yolbnCT6lZpvhNuwPwvV5UwFIU=": "460976000000", + "oGwu_6IqzUlgL9o5Er2tela3T9Rxyj-xgjTP_XJDtvU=": "3843897000000", + "oHPBhb832I9Fi87fsBBgQFuTqWUyyhb4SGjJ5SIQfJk=": "411085000000", + "oH_quCEUb1NkkfjmndwCBA0-nVDE1M-H0Sl2zm0rHhI=": "1927530000000", + "oHysuYIdK1JgXj5qiA7b4Dm34CSglj-vjb7TohajEa0=": "384615000000", + "oItXQoUm-6N3KNNFoIK_V50EpnUA8s50J3Q7LAsWuWM=": "961538000000", + "oJAPsQ-Prb68-hP3xe9UBRS-OzmutMovhA14r0nCeuQ=": "467593000000", + "oJGSlNK9xCGKsDyiNUwOl2XX41PAPf8pEkkgbSMZUWI=": "769230000000", + "oJT7KFQ9kmKWzA5_r30Fc8g5ZwvYe9rjmu8Cp75NVbQ=": "446710000000", + "oJc28DbaUHsazHfk8N6knxMEtZOdFpp6T3vCioagt_Y=": "926090000000", + "oJk-x2_DD4o-e8UVEoc4lHQEUu6EuXbgi2sCZ_Nz4RA=": "4196174000000", + "oKQ3QxaoPC18NA9Q4bUXQFEhVF6wEB5WVpz2HSYMlQo=": "384615000000", + "oL3X8MrNjCJGKCW2DWHBxyLkeXUc4V2O1hQigsb4VSw=": "385510000000", + "oLH34BaS0h6iq9qto7-aV7tJxYfu0Unq88getpxIZkg=": "385011000000", + "oLPbnYoDWNca7EvIE8Tk9Q3nZjGR9MwtAErM-tXq0BI=": "377835000000", + "oLu3O8l3gTIGntZntZiaM1OjuhfB8f2sokw2NJ3a9EY=": "416901000000", + "oLze3smcytjSdDIL98bVRww9HmcCV1otXdTHpLxnH4M=": "382394000000", + "oM48ERIm-aXG73zV0yVV7ybUupdmYlmzzm-Ty49NQbs=": "384072000000", + "oMHoMA5jxL-hg1vAVvShzdvIN5UgBYNGoFP3Ka9Jyg0=": "1131929000000", + "oMeTkOB81mrr5yukEgL7B_69S7GULtqZHFrPN4YV71g=": "416666000000", + "oMo6tUj6UXU08ivIEoliTgeG0bpLPlnkjjemb-y1psI=": "2291666000000", + "oMuWvgh5tllLPkKIrxFFTRhWuhbS0WyvvydrWLTfdC8=": "4999999000000", + "oN49Gw18Ukh6dwyY0SUjM0uw_GUbWjNtj6Wz87GHosE=": "925701000000", + "oNP5XWcn87tKg49xX4dirnFRqVrsvMBpCTBEEKJONWc=": "426403000000", + "oNibVP-ZZ503G8fC2B9gVTbA8pICS7WpoZgBvfbsWX0=": "465212000000", + "oNxTWg0lnCNNpULHF3KRucnGwDciTgI0VHPrgSsuoCQ=": "2022352000000", + "oO-3PnPioiNttXoryWYzBJfcTed7Dw87yyiOp8zElpU=": "460237000000", + "oO5F2g5rr9vTu5vA9pTtzaS4mN9jYznLSkO8vrsEd2Y=": "416673000000", + "oOA-H5lErO2oKC7UXJLwvmzwXtqfFSTF_lv8Ah0KpaA=": "2083368000000", + "oOruxuTh3Q8ppbaHGALGPItgbzqiln4XuK7EIT6MBlg=": "578497000000", + "oPIk1ZGjFjHoFceuHO3ZWFlySwtGDAHM5qpKIPF6SOc=": "420684000000", + "oQBfS80B7-EEQYf9-LyQURZVKKKsgqkwnuIZNhR9J94=": "420060000000", + "oQanRqMvwSDbml7omKPCustBIIFx2PJx85Ufd-VWUJ0=": "454545000000", + "oQo7KlI8o4fxyd7uF8s0xZNPa4PDW-ipRN0JNMyJ5eA=": "550726000000", + "oR4tVp7PsrgmUYyC0tvAB2syuOHIcIMFtcH_XjI_gMM=": "384766000000", + "oRZS7HlDmscM-zNvrcygNqHJeAIlg4wN7Zx5Adv0dEE=": "5146256000000", + "oSMLCHwVsERetSlPMx4CZBqQ_-XIecZ7GuXG8ptLQTE=": "442725000000", + "oT6h9DMf5VHFTXVffsW6ve2ZFVEeXhPNdsZEFbU-H8k=": "384615000000", + "oTTW0SsJSTrGVHy82cCPUKV0GOxWGx5Mv2oKf3x62io=": "1175323000000", + "oTknRh_FH5f5Wm97V8WfaRpZjsBmZZgfTogufo5Z2pw=": "454545000000", + "oULDr5IO24hpb4ZxJStspQKPRMylXQHNzsWKlaiVWVs=": "1233257000000", + "oUWmdg1Q9Z6dDkgPFTBYTcgOAkCZ9QV4cqhbleqIlh4=": "384615000000", + "oUc3U0x9z5yhKUmM5rT2XPLm7W4U7xBrCsQSU4Y82g8=": "385510000000", + "oUiKSN3sOe7dUnE9XOQkCNMCytn0mO-LKhbqgsfD8J4=": "386379000000", + "oUilW5iyLQgUfVcHnDlNHGnAIe5bRbaNB3GOzijLBp0=": "455600000000", + "oUqjLFIU-vUsYUuhncPSpXauNi2iE1d4eLnkNZOTOJk=": "458017000000", + "oVuJm354IkPY1bptoHTN6Q3Zs4FtYzrhWD7zhFgRk_U=": "927766000000", + "oX9wRF0fzvel9oqVG-5FWiMXWiX4NAIpmn0HEGPPORE=": "909090000000", + "oXM1pZfZTVvNmeXjObuFyckGYqmQmQL5J3Pzgiy8GbY=": "381162000000", + "oYJXrvsIe01W25T32IW-aWr3vKt_cmZ12qwmBklbPZY=": "3716515000000", + "oYOL37hzF0MU9eEIDC6ggxyoj1bhIL0OQuborp73oTw=": "382790000000", + "oYeI1I8DwX5fp4_rchR02c0Vb8SUAtTUEuba5QLRkZE=": "417634000000", + "oYzZ6H9B5QAzaw023ND69mzG-snSOFz47jV8ygA7cwA=": "437313000000", + "oZcDDEqV7uM6ZRrfOrqCRuftSGoY0XpAG5-z7sRtPJo=": "413437000000", + "o_2W6TLY4Z6CjjNfXG0Am7CahHUp0VMOg3xHixVv_l8=": "424673000000", + "o_fJIFFbnfEJwj6U1QfWwj-QA99PRKOHGOU_na1hHcA=": "1173549000000", + "o_m_zFEF6G66YztGkOsGRMVAP6xAsN9dP8kDiYSD_sg=": "384615000000", + "oatFSNHyGLaottbGKTDWnCeiN7s_5DT7F5jgB7JtTtA=": "452582000000", + "obYXE_FPEgqa9ULpnRiZNOphmCYUgwgvQvQAuOmeFSY=": "1156517000000", + "obZqsPU_lADjeSrk2TX_i7Dn3K6bpJRJfHtlv3dg_l4=": "761824000000", + "obdGGb97oHQmhjqWZpvcfZ6lxaaZIA2n878NBhlHWQY=": "1133655000000", + "obzSLb7_rHPwEHDz3iCk8qF6ZoFnGzS8cDQHMmb2OvY=": "422561000000", + "oc8zf2VcaK2T5BqHIiBal9HJk8Uin4O1fgNOH1GmY0I=": "545454000000", + "ocJbhUy5_RZM5SUNxa5hPlfSPlrK6EUbxrxONFOLiNg=": "456934000000", + "ocVQkQcWZUp2EykJw63wCSIbwZwH92DYKaJ0S3Ywwkw=": "384081000000", + "odLBMZpq4LlY8xSRCJNnvgYdWOFYLS7EGQzZYq5a3K4=": "1366800000000", + "odLeAgGu8XSwrSnULCh48hVq6Gw_ws4_o2rASpIssnY=": "381635000000", + "odw6qZDHxAPHUsAn9hkZJilDYxsOTZKWrHxlySKGj80=": "1501455000000", + "oeHdKyns2CAXci1_z8cA_sQTukKPsSbyYUT3ib7m7Xo=": "455600000000", + "oeUM-xro-i-Rf4wErmeAU8LxNqCeoyA7ZLW76hjNwrw=": "1511572000000", + "oeVWZ-T0-kklBD9H9JAobRH9HRDCJnnC20mlxv4wpmw=": "406076000000", + "oekiQQUBAe4nxlodUgOVOQ8kx_bkfoGWT2whxfSeGQw=": "539145000000", + "oeyEIHKNKHSIEtWFyfJUzh3Vu6ObhHiNC8lbUjhryO8=": "769230000000", + "of98OSzvKzJzPOi5n6yRM_VNYK6XE9vL1iYLixqhjso=": "464662000000", + "ofmRWOMJzwLLJOAJaU6Nf0z2OKNpXAr9UNFHv69ef-k=": "769328000000", + "ogBLr05_d31YA1oaZQyW3y9dYImfTrXcgcpFcgvlfhw=": "649553000000", + "ogU3vfhr7rm6zE07z3onuQitMOP0rpscprpkI0_wBrs=": "491000000000", + "ogWzuKskmFahrznbGpJqIf_4QolU0GoqOKZ0Ir5KYLw=": "445981000000", + "oghklyXfsJvXb8SVepLYwk6gSYg507GMsOwTCFd-PeE=": "385505000000", + "ogwdMkYLcYrzBJUjcFBZ71iHapKSGBDW-1xCXZvGBU4=": "389764000000", + "oh-Dhc-0qVtPXTbmNzcjXx9aKFsQEga1-BH9Zz8Jh58=": "379344000000", + "oh2M72MbciUo2rVc-xJDKoBfFYfdUfkY-Dar7jaORgo=": "385505000000", + "oh4DZRU8vU6M_9OTnCvollL06LuWgRyj9FdR1_He4pc=": "1272135000000", + "oh6IUs2I-DXERsVlqOZeRW-ggMAqVsurLgvdWm68LQo=": "912134000000", + "oh90ayVTj4uhUyUh2kEPb6wyCJsCvXNQ7neH9JYsgwo=": "524269000000", + "ohLxJJxn1FlTPg9eHPASwyxuXpNSuMtZvoOv84-_bTo=": "386127000000", + "ohTlIkx8l3CjNK_xZyNPa3jnKaeVnp1XfQAKZA3XeR4=": "915384000000", + "ohsBvHOKku0TR48CrxOCH4KFKb63fqnfjnruBb5cYik=": "454526000000", + "ohvOnmWOA9KSg4Ee6UTmUT2B1H1v5YYtzXtYHbCMRbk=": "384615000000", + "oi-2FlMjOPpAGCUYBDDcLnTJZGLD5ItZtahkM-IdVjU=": "1365166000000", + "oiJfxgD1_e9QaPVAdQudiCBIXBdBJd2KN0qrUGIgUT0=": "385510000000", + "oi_qXjkQx3jA1pSPEe8CnDt-jox7UOdkCdfFC0f7RPM=": "6760769000000", + "oidLSccLPYDepdIHk3rIP2L-04u4yrSMUN2lUFMHAl4=": "1363820000000", + "ojBQpXKNq83Som2ZwTXD54ujtewGBVnG5jTnrs32TrU=": "2020895000000", + "ojE0dFhDa6yR3jnySLrrTSdR4uE6weJtGd08P-701hg=": "385510000000", + "ojT9zXFTR6znTF3YflS1SGJyaouJ6ozUluccC1bubqc=": "382896000000", + "ojoy0Jzyg9eqe8lstiCFv2ptfyrLluWMOQaavFStrWQ=": "492397000000", + "okGaWzKJKe-1YMYKI9H7x1X1QyW_sOJI3UaQ5-cuxWw=": "379507000000", + "okU9WjRwsRFy3cYV74349ukPMIQZRxV__fig1VzbMjs=": "1946775000000", + "okfZebvaVhnzcXfbdelK1TcCh8XSlcstWEwWa_RbVNM=": "411085000000", + "okimhLUbpIpHk0V3XmaPCK32rW8SHNYmpdTk9NUdSSU=": "381786000000", + "olHoXQR2gDNfVYYTMtQ2OenDx7nLYqiUtiBSfeFTMdQ=": "384615000000", + "oleTG9tZQjuERAfAX4elfteHyzIasQLCLHqOlrzItTQ=": "463436000000", + "omBrMEvc1iDyLPf6dN32OJwFEVXUTI5_MCAuFNN7hHM=": "416666000000", + "omRMTtF1Gfm_0owl2tHfp4ZjhjxWmfUDiRv31DhR3b4=": "883538000000", + "om_BsLRMOLJG6-2CAofnQ2MOhuVj3a8jkcW4lkJoB0s=": "384064000000", + "omzSAvphABknPE_JXMfrJ-FU-uLEgWlcTkKDz34Xjt4=": "3467029000000", + "on7z6JJUMj7tAM9zmFnzZYpgAO7Opxc1cJ3NuCanj9Q=": "1153846000000", + "onBDT30qDtmSWrwvq85qesiGgIP6eWhDeGKBIXEiMvE=": "416666000000", + "onG6F9WhKYbkaDb_JVTWldXjcx9jFQGqKr1_UpzCTL4=": "840040000000", + "onIf0C2c0dSbVycWZwb9UM2FZwrC5cGOqypn4n-ZDNo=": "562130000000", + "oo4NsTdsaK8PRvICvA4mU050-ZQizHhTCkFPHVQk6hE=": "404478000000", + "oo61LMBWXp1MsUKYNt9u-b6aQVFUS8aUWBWBp7x85gQ=": "488979000000", + "ooBgy2fZ6aZMjNx24aBYOcfDEGh_1_gTku1m0mkDt9g=": "1388596000000", + "ooqT4Et11xEZdCAOtmILa3hIh-SIfOTMfbfGPBqcNWU=": "2140520000000", + "ooyoRZ3w2FQGIACl5H9PNy3qwfga9I7j4MArSKNeei0=": "395497000000", + "opAdEqEENbp96_VAOzr4EUAnXimfFz--ZqkSuPaH6XA=": "448672000000", + "opD0kS_O79bdCtFs03Szcoa0m6OCRC7oH-fkB32ZMBc=": "401242000000", + "oq-umyNXp-ZG6o0FH11d1WDiChXgbCOzwHwumWzCHXE=": "1925957000000", + "oq4o95IsR5q8l0Twvibybjj1sIl_U8_rGQQ3bEb3ZdQ=": "877562000000", + "oq6D2TVfOjCXNkwj6U3nwkt5e5XCknGH_onmSHevke0=": "1132435000000", + "oqaCa8so2ypkQHsR32FAd7NGQHvAqNdEBwT5BSsg5FU=": "391727000000", + "oqnQq-0TrsDkgWSfrZBaZUNO39smaJKlHwk-NLHIA8w=": "961538000000", + "or3VfsAcp4ImGG0OJQUit8lFPcUvtMlp-i2WSk6f41s=": "3369487000000", + "oramp5t1Rsn2zpjiLLih7KwD93_xi-YXJsdxoyKRCV8=": "416666000000", + "oroc15V4ggtTRLsOUdZPxPTAkiBmyZTFZAkdT9z5tTs=": "350161000000", + "osKGNAmzlpdAgQHdsxR8D0VAiVvDSi0Z9hypIOeM0h0=": "3115384000000", + "osPibaY5Ak-S_2Jg_7VNX91E6XP6hmS5vuuWtU0TJ5s=": "411085000000", + "oskOYDMPsdA-d1RfF4OImtwMKiLTiknrcmRZrTrzmI8=": "1200353000000", + "osodPt7HnWuq5e5-fO3JSEzn0jx6Sq8T-AJ71kN7wJM=": "9265709000000", + "ot6gbJktWEv93qFOqXF6JbtYhblDlbPYvKfsSwv9mrY=": "453003000000", + "otohupPjupqY_YQgLzLC_IjxiTdnhNVdN3oPrGTR-W0=": "400511000000", + "ou1XtWyI9YT-_22Phgfe2GQoGsgU9Vw3uCUibh6SB14=": "457382000000", + "ou4jDLm1pz_kyNJa8qe_jDQbsJiWytGmeQq5pkrI2FQ=": "390141000000", + "ouWUfeW6pzmfbsF_yjsVfwu6PBw2QtuVzy6_l7MxsNU=": "753418000000", + "ouebqZrhKqK6y_51GJek3uKiWYSQ4pQFSU_S2yLqWeA=": "84885536000000", + "ow_mHT2pO94dnKuyz09XEL5Wf46U2Hu6DkDC3jvEKdY=": "1859377000000", + "owq-ffMcletwlGQdFUVmihUszyje3i13HfVzpTi5_cE=": "492195000000", + "oxAGe5HU41ivml12hORK-6PoBEWu3BKg77odTLf9SxY=": "3210998000000", + "oxF2lLwpWjUWybAxwl2LLUwoj6J_-3jUOqZdzJeJ-Ao=": "10680589000000", + "oxW5Na9vWAvxTwE2MOMFkrneDM_d0nFFAdg5L9NZSWA=": "1233333000000", + "oxk73cUEJTlKEmNDWviCOKodGLSh3QecSABKFxWYbr8=": "5272870000000", + "oxlmBpZmrkkdY760jFHtScpmuIFNKt10a0GY2MHhSmI=": "397332000000", + "oxmhNWTOrWbJfy8rp92iUv5hEKUUIAvHZbRZOuX1lTo=": "8288346000000", + "oxxlu59cMb9g6OwNJgwXPrRweYLNfMgiEfA0ftFelwc=": "404628000000", + "oz1pFyMrw6LUgtlnvmvAC080Kq-EgWGk5aPKy1BvFLA=": "1153846000000", + "oz6LyWKVFLmzcfrohytVjwYWJXzIx-IAVxY63eOaDVE=": "12429705000000", + "ozO3VskDy15HN5mzlCiRR9ZvlBqCTpBO88Ggud13zEI=": "464300000000", + "ozoDTcKXI5ZZELs5l-fs2cNCfdillZpnRbtuXhCAKio=": "381836000000", + "oztJ5NTbJ1IJop1I5g6Ae92nUgVB_Bn41kaL_RjOwng=": "1233257000000", + "ozzjTNEYrQEKKjDxYZnhzD65GHqyzDzM1lkg8dNN4dQ=": "1553041000000", + "p-FxxQ5dAv6HenSftLLEajHpkAriFiZk7GaNclQ03YU=": "7566832000000", + "p-IrPUxPCAskptB2G4H8TyI0JoBIm_mpBb_r_Ecp7B4=": "386353000000", + "p-Lea72S79RmR8auOxvlHft1c8uXkwh4_lhBjZo4doY=": "754619000000", + "p-SoARk8zcAFj82k0NdvAQZhm7NOaTz5XQPBV9r_mZA=": "411085000000", + "p-fftC9j6Mj1WA5kmXdylwdOMNd9zwrW7pJwF0mlo3w=": "461156000000", + "p0HZtlofYv5YUHSHfz520bsEFKss5nhQy3T7pSj23zI=": "3707972000000", + "p0RF-FbLTXkqIzqsHtl7MiNppah0LCQ5J_yX-KWmLvg=": "379203000000", + "p10C7AOdXMRYRVXisCs_5CktBDCbgfOPGGx6tKoQOu8=": "448254000000", + "p16R9zmV7DZ7qpmL5ednU-qAyUI8MbKn-nO5iNXKAxU=": "3888630000000", + "p16dC_9p9TEj6PljmMnV76O1JlFvcSZ9lhtjmBtwcHQ=": "384615000000", + "p1BdL_H_yfBqfvwKn-LrCRuoD2MGuMjgQ4xqVG06Rl8=": "453157000000", + "p1O7oMCb4IcVAYp-PllkT1HXz99Dpp7MtthSerJP1OM=": "1538461000000", + "p1ScJOYvVZcOAE4j55hcx3_sbcAkCpNxQMCTmxDROmU=": "2352765000000", + "p1m1_6bmxHSnyUzg9MLgjQcnz3byaRw1Vw2f_8PMH_8=": "576384000000", + "p2cW1daDNuEN8NuuwUTEwBvn6UDaF1V1ZxTNXGws7Sw=": "716993000000", + "p2fgymTBrLZ9-DoLebXG-f6a3UVVlA9_ac_bkPWr0IQ=": "3968602000000", + "p2jsL3RH8e_kXjzc6JmD_BgOUa0d24xrYBcwfs96zN8=": "384615000000", + "p3EM3akrKixbuxTddHiP-6r2_4Fucl4hOEK725ltAEA=": "1815718000000", + "p3HIizxd6TgcVuthXERxpjPL_a_Fh058pulwgFYZJYg=": "386248000000", + "p3NeWGwEdKd3J-qZktTzZZHrq-GYOjhVWl-Flcx06A0=": "525780000000", + "p3OU8nO9cGgfOXh_Vw9F3Q0N5OIuelYIsFw32jsrn-8=": "4176295000000", + "p3mC-AHiisYS8giiu5VDXTyS8KqIksxjG5IOJxDWCkA=": "1136494000000", + "p3prpnh-PdjyTGu9J4UJCnghjVpYf2BRWs2CommxROk=": "458982000000", + "p43bHg0C21L6B8QkkEGjatQ9gdAFkuiohsMqdx5eSVE=": "1765241000000", + "p46arSIo_QB0X301T6Wga8fYFkOjdvaluyMnzJkETvw=": "967244000000", + "p4r7g1wZm-NFUzey-TCAbU34IHPYEpiWH0IdupcDd8g=": "384615000000", + "p503r89JJ8x_r-HOr2S4JlGVwNx8vQbT4KD98d3Zgf8=": "455125000000", + "p5RJIrVHboveH0NR9EvxxOnpVm6mQI47FArJ7SWQ928=": "1538461000000", + "p5VEg4KeybblWw0vrEo7vLdSi37E7wgdpg9730jr2ng=": "658754000000", + "p5dnz-gL8UR759w0dJ_HaIDl0ADMNSjfDp4u2VPn95c=": "416029000000", + "p5myrRtjcoHz5VSj7mNcoCmvIhB_7F4ghl5aH6p2Sgg=": "387383000000", + "p6JCn20sDd0cby-JLOEghEpz9VXLqg-D0BJaQBQjFko=": "384615000000", + "p6Q0lCi9Q3unQEEY5xjDMiJ93YV_J0h7NVR993sDMLY=": "425032000000", + "p7-yWJ1YkaK00H2nrAccGPaA--jtC1MfDkSDCZJFAEA=": "384615000000", + "p8Lg8zuslKmAYO6QoBVZ6ze306whSMw-ZH-sQj0hOu0=": "1147383000000", + "p8tgKi159XvL3xyOMhEpXCKZlYHphAaJcLCQGv12_YE=": "3706439000000", + "p9hnNbtoHO3ngInLntvTWXIo7yixryAZaSbN2QkFo3o=": "500256000000", + "pAgH1_e8JYSdQjhgr4_qXDk4HdQmL6RW58wpVoZ0zOc=": "2110984000000", + "pAkp2OJ4xIQ9XnrsfdYqIK8MzR0tJf-KIzvWX5fzQ9Y=": "384615000000", + "pAnMfyM8JqmKJf-U5-QkLqJ9oWUVY1C34_SjD7mz0jc=": "2317110000000", + "pBBRma15JEonKKhyD38GcLdzz_LzUugLjGJh67lW-3o=": "769230000000", + "pBPE_LPoMNBgUyKwnpxvae40GGIBdVcjoMgzRaESNL0=": "682426000000", + "pC8Pn9h8nBKMMGwznZCaIEfXcCAi_HYO1Se1KaHqJCI=": "3912515000000", + "pCA4en7VzZIZHukHNZr31EtNXIakayrrJdUtYFOd8eM=": "2198076000000", + "pCpgEPzptzMv-yZSK5yh_g9Bl-e-JAidV7GqCnqi-qI=": "4115343000000", + "pCqrck_qrm6icO0qRp4K-pjMN2x0Q0AofKhJh7ZSCNg=": "384577000000", + "pCw0DcwV6WPyYLpz22d_TU_hE-QzPMGXUiV7_xTeQus=": "1156518000000", + "pDFvEs_xHdrIhPlQTvqfXICGp6ZonzQ4kurQxLGF0Zk=": "769230000000", + "pDIhy7kJnIB1e5Qan0lCtqGf9t-gl9Asos0w3HH9tyk=": "383939000000", + "pDMmiNKOAuP4w9cBbphhN1t-R_X-nDbNvGmSpyxuqeg=": "385261000000", + "pDVZyxJ0Q81aK2Ddk2kw-BK-t-50HbsbVwi6S_XCS5Q=": "392243000000", + "pDw3KVsqOSQ6qXxXWVIvEBZ9cphl2_G8B0WvrsU7zDA=": "1158838000000", + "pEqMeQTsXTi4wrdtMxonYbobphLPXswyixmEdjjlC20=": "450825000000", + "pFVlVGW8qDGFyssB2PW_MB-yYAxdKAcLV-3LyKPRGTg=": "757122000000", + "pFiX6g6PME-hnCrmSvA3cHy6DWohnQRJXUZZKaGXEvY=": "382338000000", + "pGG6-X_Ep68bFSgwLr_jkOTI0i1nP0DRYfxET0OS52I=": "469487000000", + "pGR7sG-Xzq2BfufT9O6OnSaTBEYgJSeYT7ipBOi0C20=": "676021000000", + "pGRWgI1upoy8kidFjv3dcigL6twbYpakkMCGsTIaMmA=": "385506000000", + "pGSGorPx1214E3bFleEa-64PDhnrFvfgMHIx1mmJlmY=": "4245191000000", + "pHhHgZmshGw3i1h1teaQo5-w3tAqZKPnuwfvgVp50SY=": "769230000000", + "pHxoge5V5KKFNDHVTygW_T-eVxEihS7nxf52DQ7hjdY=": "11610510000000", + "pIAx4xVXO-19DRPUOJvckblKkjYLnq_ho1SPEs9_TEs=": "3855067000000", + "pIJSTjkjhU7ak6GogAnHIJy-c1_DGplSITxDldTyxSI=": "416666000000", + "pJ6OdDDUOVCw8CJm1sIPkp5fHNEwaOV46lxpPZ3G460=": "386111000000", + "pJqCZzcnhn2IrbbwptFyjVT6PhZIGBfJA0CBAs8TofM=": "382344000000", + "pJqJBGdDKVA7P3UOzLbeWsALFDaw2c1lNlde1JmlWcU=": "769776000000", + "pKXHSyCUja0FuEjzS3iNi1D9xOmC6cLPS5Y0FRgQmwQ=": "833333000000", + "pKgneUqUbXnP4Jk3btvat7bJGF9vM9Yn70AdlbWk1ok=": "759620000000", + "pKrgRsyPfF85RNkRtZxNbyMNqw0ZFvRkHQuYEzaGLj8=": "390286000000", + "pLQ5oCgPi3upTQqHxgFWdjBA_b24EA95gLHNBy6AS2c=": "2310726000000", + "pLfxG_rrGovF8cOR9yOsaPOrQ-WIzU4Ieki6GXwSMfk=": "487972000000", + "pLy_9nqZL0GJFtxx9ukyLVEU4G2GMnJhnV12q7PfbLY=": "1889920000000", + "pM8Nk_8_uE61eJ9YV6AIY798y4xMtuLDoJDKPVgDXI4=": "460487000000", + "pMF_BWSbn5E9s7hR6sBsa74m_RDHR6lsVkcg2uIXrRU=": "391001000000", + "pMHuZ0blyEPRHUo8BziUPdwewvOwlvgDx55c-rnN26Y=": "411085000000", + "pN09GnYhoMvynvQN51n-uXpp_z3zjKabFNMs1_KRaqA=": "2824797000000", + "pNX5E6ocjGtOKmlldpA40ishOOtN7XqAhUV7zmzcyaU=": "384615000000", + "pNbO3_cJaHouyqktCHmMJQHfs2l152DTLiIHKXiUCZc=": "2289694000000", + "pNfubbipvZ6-wMR8xDGh5TciP6t2YyHkB0Kph5S1ypY=": "1921418000000", + "pO2ZDQV9W98u4sOGpInKoHzAgQ-bhfY_HJDf9t9CzuQ=": "381436000000", + "pO5MUWoSTCKffTAuQujmyHGwvA7XgKDA4QZPeN2zPvo=": "2321821000000", + "pOATWJn0KZJz-waT2EXIATVyN1hfRP1FSLyTEw3lDgs=": "384615000000", + "pORnBjo_fdaXTGN7LYlgeSTOdXzSM84Oixi6pPhac5U=": "4037662000000", + "pOWJnu5kVaATX3WdlJ-3W_eZDkrPovlR8caV4cLtn_4=": "642211000000", + "pOqURm0fBlBaa2GkcjqQYOIrLMN8aLI0YHLMCU3u98M=": "830205000000", + "pOz4F_mBkHgiI2uTuF9vvxSZMH3lZzmy-J68O9T_HSk=": "985784000000", + "pPrKuvxDqTk0gjcFoF7E8nNgA90zhSF_R5WNP1iG28M=": "459911000000", + "pQGW5OroDRypbGZE3cWB4O8VtIGOIhMEUvAXDaScBgY=": "4233446000000", + "pQZBIA69dflDYyRnVZF0BmQpAEyCKsbOOWodazoritk=": "22727272000000", + "pRJaUIKpJxG7UslGTlQEudggkFHjLMPn-uz5hffH6I0=": "4730014000000", + "pRdCgjA63bDzKrZdCjn3ZQ4JC0j4r4eMAHwDLxlKEm8=": "4176307000000", + "pRdz_qRCr1IayWqf12cs6AGz3Rg5b30D7eK9Mxbl1Nc=": "4147755000000", + "pSM9rRADCRU--uQFWopKY0w0whqq2Gvkh9yhkjGGHxc=": "557501000000", + "pSg85rM6Wpl0SJKPwHNMuZi1yD3eNfM9NCnIcZ151kM=": "1363636000000", + "pTa-e4ACnNPr6K-Anil4piOB6kVeZ4q09h8-HN8tcMs=": "657517000000", + "pTojwVdo6IS0VB_SRxSw-1bKG05Bzfo9F9BVPfjL9dU=": "387796000000", + "pU-jgm49g_P7FOGhZbAMmqr5na5dS6Xk-ZIbbdUm4W4=": "415404000000", + "pU9xI2hg1h5QPrhW9wMHkJfUlGOfZY3Z-4pGabBWFvM=": "682960000000", + "pUPRNmtu5NvJX9BlcUyu_lEWYz4dH4kyEm0exn8gumA=": "1153184000000", + "pUu3c2sc4F62E_eiXv5wI0eEpn6k4EXYLgHr6zF74m8=": "416673000000", + "pV76FiG_xPsWx55gPxYy4z84JmTgeHGfvkMt3_hGV8E=": "470601000000", + "pVBqDvjRFSW7jGWqYthV_L182pLEo5-gp2Sa_5QYcIw=": "1923076000000", + "pVV2U-PM9St8RmdiknUk9S5uslT940S6RKEYYn0S09M=": "385507000000", + "pVczM5JicloDMeUWDkDeo5avAu-LXegsZTMGnsm4wrk=": "485068000000", + "pVtvogR5ADRiZ4gqYOpHA94hvCtW04s8A28JCa45xL8=": "2387875000000", + "pW61iGhs6NEMFAY6_wxILa2fFn3Tfo13IdER5rKAI58=": "382899000000", + "pWBd2J4kMH4rCPSGAUG1bdQwIeK8S2ZjGml69P62iEs=": "416666000000", + "pX4NFBgIEuUpb5rL3UcBZnmE1GVbDdn9Bus0j2OiwjA=": "448869000000", + "pXBVdkY2GsTf7MHOsxelRsvaN0Z7I3sC0LpEEK5aqFg=": "3842547000000", + "pXGqsKLRgNUVlkbX7YEny4RP9qIXiN77RFuOcGydp4E=": "1408709000000", + "pXaCKpj0N7zFKKhuymwzQZC05CgvXJ8MgIubJKUJLVo=": "426403000000", + "pXibtdlGExwLEPeRfepQTwcNrwrWKHi5KkhT8GcpwkA=": "1451675000000", + "pY77YzMGboG5KAy7jKI4prlRduX36tZHTV43hQ9GjvA=": "520076000000", + "pYSJEHVyNOnG9iB2EJJ44WRjEPe-7Fi3rxHcrirx0Zw=": "1250130000000", + "pYir8Id0m-xt95StpPN15yejYvE6W2T58gni94Lk3i8=": "449667000000", + "pYqB-6P9cgjnWBhdVky6T4hmE_GKop5SR27IF1C7nIo=": "3670892000000", + "pZ2Qqj7f-RaAd4BmoS6TkWCfIvIpFOlKQSA_bZCVgcg=": "511764000000", + "pZZUy5N0pGF_w6PvPEbZqBSa6UxD5hOhyuPElvns3cQ=": "407808000000", + "pZte3cEQ98qdueGRGDLEjAhJ22kD_1QmKi02EFdsM2c=": "385614000000", + "p_0_GVlz_FfDtml9IiLkDQK0m4zIgrCx8qeYshQX3Og=": "404755000000", + "p_9DSAZu4_IS3OiajGch_HhbzexMXjFWjn16WomCgw4=": "2719179000000", + "p_NGBun8HKI6nm1Eikh8XzdouhnuTkLoKZT5SCAmlqo=": "1687254000000", + "p_bSrm7u0AkFjBIt3JWxQm9Reh_L2Gvktgco6ovyOF8=": "750727000000", + "pa2BYEd9YLfIGXtxL_2RNkD438VO4IkSr-w-77-fzNk=": "766913000000", + "pa997PtipfCuR9XlE9tJqV213oc74tFyAwp5JmUg7wY=": "924724000000", + "paOq1_QpbSmz4RNixTGeJZPAvz3KeHLBb3X6wc9SuMI=": "466150000000", + "paP_y837FdwHvyfYxbNKw1-WdciZD6OILYQrWTuaxrk=": "3288011000000", + "paTEioi7eDXjOdjpe1jaQV3NXvaNZid5eCqAijcpXlo=": "391132000000", + "paXQuSaIcUfQX5XM9fwU_lKl3mHbLiqkQF9DkXFrgb8=": "384357000000", + "pb6tICwlMkp7kQ299zl_1wrLCxzgbnXoUbtV1delmos=": "381802000000", + "pbVdcUlonpXb5JGix8aGzmuRUm2qaKMIjBuhoJt5ICM=": "4686346000000", + "pbqNqQ-gCARMbvsi-OYBd8ed-FRbJ31OowtlwwdKZbQ=": "462146000000", + "pcHnZLYbGF4KFp6HRa0P2GMOVMYT_lWfM7q0ms3oJJ4=": "385671000000", + "pcLkL3ndHx9Vj3vs9pOjHD27-3Z9vxx9tf2nVYdplQw=": "454545000000", + "pd30EQpdhvgO0e765ZwZHTzmNUYQVaNubkpfMsitOII=": "382667000000", + "pdH_hJAB35jBVMkxIsMqobSAMLP1C_J51XoJ6tIXMGo=": "384615000000", + "pdRr3X8qpz7mg-G2999UOS78sqLod3sRQzB1zv7__QY=": "384641000000", + "pd_T0-NSbOyYAJ8W6CnkxoGeIdMGxY_FzNCTzNepnuM=": "921904000000", + "peHSHwLEXq0X9u8xTgmav4CzS6sQ_PB6d4S9RnRraDQ=": "411085000000", + "pf5QUqAoXMl8rCaU_LWg5dCIHU1LchTiOyetCCoVFoI=": "415629000000", + "pfG5Hmu9JPhKFQEZ5ZiG1-_qB_pZZ--D4GEU6WEWS7E=": "1254545000000", + "pfL2YHbWOBRJyhMv8k-XX_UmrgK2sLwCH0MiGGmYcCk=": "507660000000", + "pfh27ZLFmqGfZcX0c8BLDXKVswBRQc_6PR2DSm2Ds_8=": "2307692000000", + "pg3TuHM3M087uQtpQNYu9j2Sd0Tth2puiWS-eAWubMk=": "769137000000", + "pgEEswff7AzBO6uQJFcWUm7FPxPDVRCdWHfoPrKYiPc=": "3700966000000", + "pgJVjxGBFzdbMcDL-wSiIgw5ZLV72pnBoSm1Mv7qGR4=": "452464000000", + "pgMpcxiSe7Upg_PrM-yvE1YdsUjQt-9K63k6LIg8wT4=": "524709000000", + "pgTcsEiUtjKXMNO8g_eBLSODYwdUDXDrr9DN18bDQjw=": "385505000000", + "pg_iWJLzwJTt9P06UFH2HMTbaClH3tiIYRTq-fdB86I=": "1538461000000", + "pgwz32J-fiHD5zSvvjTlG1XiN0pXvJOBs774h8tEodM=": "385507000000", + "pgzuAL-40a4qhSyA41Y_Rfb9hGGKQ_6JVczeyagYRfo=": "2654493000000", + "ph0fdqriJj4Z5SOS8oh_YFsYxEk_f20TKOGVkzgnJkY=": "1693482000000", + "phY9Vn6sa5G2LKhOH0RPHju6ldAH9c25SsQjOVfNVhI=": "1138610000000", + "phloADDd5Ud5nrk67Vbo_Xhohd05ZtzIraRsAaldSeU=": "455600000000", + "phxW_43fB4j7zXC2gwSePnigZo58KRBwzsOrougvTxU=": "1275273000000", + "pi0wg_VgbG3MBdriWkNMh-_2LgMZ92hLb1lDUEf9W5A=": "384615000000", + "piAqGfwsSYjktifzd46_S_YtMyZB3r4WPAdH0q6rX1A=": "469988000000", + "piXzZBsxs3ouScwcPU-yd98kJhjZAewbjQ4MkHW0irM=": "1538461000000", + "piwTm5hnf2WOgnCfg98mNaC6Ci5fqMh8vE-bG_y1WWc=": "1337186000000", + "pj-Yw8JTnFP3nlzZwVB4x9z86JzUXIdHGM2nrKkQWq0=": "378310000000", + "pkMkbMGKNIBx8XovmPzgM0b3iRNCu0kcPrhaZWTrwQo=": "1538461000000", + "pkSLI2Hr3xt9aJ_pslT-SIcqkuY7eXG5Ekl1ADtnNoc=": "767923000000", + "pkZG5oUmcAJ3nmULN7sD1GVetKBSzMJ4K8Oeq2f5fg0=": "4545454000000", + "pkfaeDAHTWJK78VLHhq_609r63fnhlkD3TPQybUb8w0=": "2055429000000", + "pkwBi3_08H6ufboaPWUqiljttsPtpbDc756icpNuwsQ=": "928285000000", + "pl-KfVsSWCGZRtg3dmtRKvue9BAP_Or81rDuHLnBrK0=": "925700000000", + "pl1g6C_wIKQdZERaw9eiDd9b6dVm0GlQP1uX0QBUiaY=": "508538000000", + "pl2haxOyr2NkPQZmgjjDrPtXTQWXx8Dl875gyjlfxw4=": "2469861000000", + "pl9N629VBzRbdteFV2JL3DpyWb1ij2LeHohS6Gz5DOk=": "1041666000000", + "plI6eZ-ui6V_7lkdiKeyFzx1tCjhnxyZ_45cw7EwbnY=": "378172000000", + "plNQ63cjpGodH8wzwcQIA6ENe11MOwB6Dqs2uORlR90=": "906006000000", + "plPUjpJYi5dhFbyP94t3rPTLcdlhQqh9t7m21b1WGrE=": "378849000000", + "plqX_BUSkM9zHM3QqrPDmHNsN_Mgc14z9DMRgRgWbHg=": "384615000000", + "pmBn22eTx9cs4fefr0xMmD_rYULA-C2WaT7YdENc4Hw=": "411085000000", + "ppXjWH2VOaxh5bk_5X7OV59BPb1ZUNKKtrQAUh28LAM=": "2116140000000", + "ppxtdmggelD0rybKDro7pguOb7XX4WpGokf6FkKxKCM=": "500384000000", + "pqGtRbxCnQTR7RwFVSWLJxEWxxMLXPy0rc4-T5Cxje0=": "1349104000000", + "pqH80wS_d_ybzVXkgrtZ8XAvMzpW2vG4x5ic9KnO8GM=": "460854000000", + "pqa_pi6vuemZZSvix1REMOGCSvEDMMJNt2skX_GnQ0w=": "4253981000000", + "pr8julHNU9x2HJBGXqrTUydYz_DXCLUeSSyIOTJlEC0=": "454909000000", + "prCBHhgq6fVGbKy8Mztfk5jWc4Vco3Diao0lRWrY01E=": "384615000000", + "prT3UVfD0-BCyqbWBSyCCOMZobtUbTs47G6m-iWEy2s=": "419895000000", + "prjV3PmUykgCQheuQjCv44nYlQDoFxr_H1DQl2U3NqM=": "1153846000000", + "pryftLEjsAKtQsYVN8grfaQdhQXJ9UxuF5Jz5ObIytw=": "1156532000000", + "ps04WtX3qK1DBBqteNutF--QpZa29n4NA-eKeqgddW4=": "1157881000000", + "psCgAalV5syUJmFC0jaASENtHJZksHNJbainuz_sfdw=": "1923076000000", + "psvyGHF48oHg2cwiEzHNBXXzDGwD_Ns9K5dwpK8rjBc=": "1390187000000", + "ptU8sgHGNsBhBmZRiQeRWGsWMjvw535WDYDf6rL6deM=": "4176365000000", + "ptZbzQZOnBlq2IHlZQEzJUTej5SbrpLtYYCm8id_Y9g=": "413437000000", + "puLcBTbiSFUaHIBWK-L-jaaoy706VeM1NFvBBLXGI7M=": "678830000000", + "puxbCoICJT6_qH1FN_hjhXNBIg8WNxNU4bBfoT9bj6M=": "2059457000000", + "pvAAohrHODKNBLpIn-SRIixSFG2xKjxFNeZ68P9BGy4=": "1156518000000", + "pvKHdCGqcncG5ERNXaDyDHnghU8vBjGpmkRt563XDAo=": "377448000000", + "pvgc0yvPWblm9N4LC44g1020tXgvZUwcYnjHPDmrdwg=": "454545000000", + "pvtSlsQlojLNrOUlxOzAwG7h6dIVN12Z5Lt6HGmMWG4=": "417633000000", + "pwXpr7-_7_EsmPzunDmK2LJPdg5YNYIc4bxcYda_R1E=": "779369000000", + "pwocHkDZZdgco4T_iBnDDV7Dbne6APpm1jvjVjYv8yI=": "1153182000000", + "pwvw4gzRoowPXCcFiTVssSnm8z27mz8-0DW73RnZunU=": "585396000000", + "pxYBA1synrC35McvowSfw7Ccf6vqIFPxZR2XAbDehgc=": "846153000000", + "pxYvYtBJzPt_ADKt7TFUJrFOKidU09Uu1aBBCayjQsg=": "576923000000", + "pxnm_UzZLavv5dnUkM7ceBYrxJfo2MSH7e5UXTplnik=": "519376000000", + "pyR2NWkQi8rOs2ATCJI788qOYD_XNpC59jXTf2Ubv4k=": "384524000000", + "pygL5Uq3zwfafkxLodAJJ5EaIUQgbUEev2cpKPw1wkU=": "1001241000000", + "pynGH9NL5q7NCx1rFj4X1rb9x2lfFH2UrXo6xzsOynQ=": "898300000000", + "pynYdVdfNLgjAc5EqVnnULD3h91L1ouazleES_wfo3g=": "766272000000", + "pz1uRCKJK6c9Ifv6e49uMA5jCP-w367FJp3sDevX4eg=": "769230000000", + "pzFriIID6Wni_EHDRo3COlqRxHm_N8BVPWhnnnQc4t8=": "389217000000", + "pzHRVXdQVPiixWhAXp8Dsf48t1nSpd8DRL4L-SreLuE=": "410625000000", + "pzKCy-KPEMNYh51a308kR4dUTukYMJieGqsO8CRf_SM=": "379230000000", + "pzMnR2o66HWEN8H8s-Jskl3UD-CxhsSni2pFGliqRd4=": "769230000000", + "pzXApkjWn2HTLQNfmVtaWVAk_pkjER2E0rCvfLFfbtg=": "385770000000", + "pzpFgbhUwl-nIZyPb8NDAfeFVMSvYN3v92o1XGoh7u0=": "2344096000000", + "q-Ol6waSXdxPfm4wl-S7iroQFPvhMV_tknFAXkB3Ue4=": "390141000000", + "q-iUNgn33ZppmCIdy0peh6NPU2QowhlpGdwaULL8hx4=": "1537111000000", + "q-uM4C1UT1m-gsin5noNNUuDolgUtzq9lWrbjnHwX90=": "1265685000000", + "q0aZtLKeTgSK4DOowaSpBIfyElhhSbBfdrb2DYCbNwE=": "385507000000", + "q0kAaYKJlp7SiPOph8eZbipKQJiiTQbK6fJhZNoIFvM=": "378404000000", + "q17E_e6ceE3deqBGqrntu04K5G0O0dUocSLzQiU94MI=": "3846153000000", + "q1CHna7DjORwgUe2nadhCbLFX3LrOFVG5qUTaYspfYs=": "455125000000", + "q1NWRD2LE7TyHOS6EqaDG2ZYX1i5BLRcNSWx-_qEmJ4=": "385507000000", + "q1UddLxBpVUZCj9ye9cLOH_7GBmGPLtM5UoJ_OgicMk=": "455600000000", + "q1gHo8MhLlkZaHsMnNukjiiRb8TuIM47HORS3QPOMzc=": "418059000000", + "q1zZdzXou6HkBfRTPpyFDi6KwzDvPoO3jXWaubM8x5k=": "658869000000", + "q2-g8A7fagvDG9v0tm6aANL_1cRYh0mWDfSIs2FZMzU=": "4150966000000", + "q2JTvLvoDlhXM4aka6EEsN7_-8rtUDTT201RVlw2AV4=": "457150000000", + "q2TS74FTUnvECKdrk8mQuVOqA_q6TkbkgWSfFRPQgMg=": "384615000000", + "q3XeZSnKmfJEBnT4VivKde2vrb3Ju-Ez9SCupM3VA0E=": "455600000000", + "q3lK5QXTNvjfbw2AGRrm0Xxh1GCmQffUXS1dHs_mNVw=": "473331000000", + "q4GG-WkYxMqIlBFulSw9NOiKTAkyMz422u0RCY8T7To=": "458561000000", + "q4ou30RchQy4bQwB3PYHlz1bvfqDKJ6wHpFwYC7YNi4=": "763672000000", + "q4rqSQaoNMDT2IY-LQWVXRIvyz7S1x9chKj-IT4Y56Q=": "450033000000", + "q4ybFkPknvL_6UuZBlTPWKSjoq-o4PvuGmVQN0NjIUM=": "1153846000000", + "q50OH3QpzGx1vfgZBvySK0DA8sgv7Ifw640UPjsXVi0=": "1154640000000", + "q6CpE_kI_Tu-XHHl_O_MWGZLD2k_7lhwCNt4x99W6Ys=": "449726000000", + "q6IpdhlvtEEueTAzy3ODz38rgygBsiJx6Ue3YP3jw6w=": "454545000000", + "q6R07QPUTsL_losg8D10szZ3I6kknLiA7KU2IcVImkI=": "991666000000", + "q7H4-ZucBowbD5jvzpJ0k6SHNkvKA1G2tm-4hYTBumE=": "460854000000", + "q7_j1H17ywM6co-tcxMXaQxTujL9PV36itxJ5EpIJSw=": "454700000000", + "q7vNG97HMr37oABmrhIPMEY7iXCL_i-ZHcFFlqCRqFw=": "833349000000", + "q81wfSrZM_FIx94i91QwcR1yEVe69pWXQ93Z7pxZSoY=": "454545000000", + "q8HnkWGYdRk2yG-lneNateMMCmEBCeVL8D2cgWV7vPA=": "397332000000", + "q8a49RrL4Ku_KMP79Z6GUs4vJ8oFHKYmYf4wK0SsVP8=": "463152000000", + "q8p4VyW0ChcyFGF07WpC1bIHpQTcKJbzsQb9N816-sk=": "2041119000000", + "q94ba5Rqaj2fJHZZ7jbb-AjWudK43HPLreyTtDfbmRg=": "1153765000000", + "q99HEfXcMXI5835zHqZyytoTvi7zq3RcIMgaGOloNb4=": "383014000000", + "q9FeUeKyGIDGxI0tjHj-hL5aueSiYNxmbYDBfULf-rA=": "2083333000000", + "q9_RY4Jxm_BnaD5Rrk4IgJh74bvK-QNrNMxgRzURzdo=": "416673000000", + "q9fv--ad-cqR1QHhupZDG4U3-E-_tDTCmvPLekQbH2I=": "816083000000", + "q9qK_4qm4Gfn5ALsffMtF6QQrJT7U5KFvZ0DABMWimk=": "554039000000", + "qAMmdGtgoEmyIztRpsiKZwedmDf4ZTgnC5qxgtNJ1rg=": "7682181000000", + "qB-Io6QgbStkEuqFxOjiqenKrk4KKVX6PYUL3PxAEo4=": "460608000000", + "qBE3x2ZHTFsHFWMbkfUiRTTJs4UAc6v6189LTPpjVAw=": "33315847000000", + "qBK9ZMC3Vi5nwPzBL0_Oja19d5bAAhFmHFCPdSwr_zE=": "469811000000", + "qB_LWDvRrxUaDMWu8JYnosWa14xTWR6eC7KQvLKaXb8=": "584259000000", + "qBcdpRWPYmTaxRpjo7B1jm_nA96YGSV00MKGc7n0sbg=": "424465000000", + "qByJMWS2f7xlqZeIfdQYaP9clZKZKQJqpS9v1iVLTk0=": "4555854000000", + "qCCaIP-P1HSX5L1x598jsl8uFYOtP_3WiDo2QdA8C1A=": "3612316000000", + "qCGF7lkkRZz0kH_GrzjxYCIwU4wUJ9fbOTMH-e5PgD4=": "2089305000000", + "qCIftt36bCUSpqnpeO01lKPHSTufoGuZsVAZ52gPHF8=": "12278012000000", + "qD6agiNkdLf33hVk0bwDY65effuDucOQM8ta9xaEIRk=": "833943000000", + "qD7k3Dc_XdB0iIzWGVPPgtUgSVq0WZnlGE5zW8jWeY8=": "755094000000", + "qDfmHoe4_kfwTNTEz7UsZ4Na8ImcLtwpjsoQERDtmaA=": "453442000000", + "qDueV_hFXBtPTyLB_AJqERKqAV7BeQhVMfM-YiRURXA=": "629001000000", + "qE8DdcznfGd-HOqQ5SA3sMt4R5qB-LWTHLSDSxU6gFE=": "5157569000000", + "qEjTMNAbI9lyPPrSjuj-WqQ_MLq7SqWJrYfzT_arQog=": "462743000000", + "qEptC8xUP9jAZoJpTiIRXzRw0SkRFjmh0cAubienb8U=": "469811000000", + "qFMV-hWB2ks4RC_Ut0h6uYmxGh_zRAyqooJJheQhDSY=": "388750000000", + "qFYm8PTZHXs5tKVnURNz-vqecXdeDekkRKckWU8IJqw=": "909090000000", + "qFaAyJ1Y_2VpnkKBVxpPo5OlY6G-dwqNLSqV6oXr6Ls=": "385505000000", + "qFctS43-YWeaDQ6DLWoEHhbaph03wcFsOzPiYnK3dt4=": "1365086000000", + "qFmemZbdy70MFrLpcjKOdVRoZEmCwzmnI2HJTIEpir0=": "465040000000", + "qFtEwQwQOeflAk961Qsbdy0AyHpJsUOB3WdU9HfuTi0=": "9947939000000", + "qG1NvwdSdhl-GlLyniN2EXRJFwZtbdpDQR8fF_P1VLU=": "385510000000", + "qGlC5eZ7i0AEAaTqrrdWuosrDBM2tmZddixyIllhTq4=": "378592000000", + "qGx8KA_AA9ZiZuoP9y9I41VcE7Rc9F9BsM8mUS5Hoi0=": "390975000000", + "qHFw9BygCia5UPLhuQ9SH9rI1s7_tTYRQg6gywtrMyA=": "769230000000", + "qHb4VnIjuqjZqPPDQg3SslZ6RX038v84vD2-bREbVa8=": "388566000000", + "qI1ur6erU8DfL2YcWDRJfHQ-ECrixaFbgKNdB7sfzTc=": "890119000000", + "qI450C7p75ATTau293ogxhMWAMChiHRvifuD56WQUKA=": "1377378000000", + "qIJCuFrpPBpZpQlOHnn8-F2qf0c11aRX8GVwqNqqj9s=": "407808000000", + "qIvKO9sC2YdtIc0YYBskCEj30TVhQYCC3ynUWqcPOkE=": "2018954000000", + "qJYPIYnF-VOQm6xWoRqHSjI8FAxyhtnEWKN35AoRxwM=": "23392175000000", + "qJ_5qXiUghSDBsiP0C_NNEbMkriPI77kHmDbtQqYmZM=": "461856000000", + "qJc0dOAMcwxWrOuxYvWlcd_o6DQtWe9mS3-ghoiziME=": "455600000000", + "qJiaVCTHmiS-jwh0ae1mDGYtnb9Drv2Q6IRkFOFFhwc=": "810075000000", + "qJofa4fCE0VuHHMmGmgoJIYgH0gHZK0BVHN8SpR4ImM=": "417134000000", + "qJqLzlBtTOWzyehhzJGxXcZ-q9LHIVn-F3v60lUglwk=": "3805127000000", + "qJySBEHgkBQpQqz_vuMZNQ8wdspsGDK8X_4iIAyHN6I=": "1881489000000", + "qK3b7rEnQ5CBVzBAOffvop0NSJ_UeEqblKEN6W30zZo=": "1136363000000", + "qKUfSqNJJ13LUtD9c11cCFY7C2Txi9_3W778EnMJ1dc=": "456104000000", + "qKhFkfz_O6PrFhC7pd96U3AYvmwh-NagF-r6SanWiKQ=": "2499999000000", + "qKugZ_Rh3LdqU3enAjse0sZC-r9ipW9YVxI_PuEnwQk=": "1393853000000", + "qL2zLd3deQAnG9lFlczkk5vn9emZXER1W7tGDYkMemI=": "9624191000000", + "qM1CR5DqVwL1kuK9v7MorX-82-0VTNKIjJkO4A28LK8=": "407609000000", + "qMD3SC89IM3PEF2Uu2iwTTMDomOhAy9vIWrC_JbyNZc=": "927791000000", + "qMlbwQtUfJQbQA5jqV1xpLeK7GoNZY3uKhdrJOjCz1U=": "384832000000", + "qN28fQSDOp7hKVDDJXc_1UnjsjLkoUOX4Nj10NS1MAk=": "1128091000000", + "qNexIrp3gjKo-7yZIXW7v76lkEdR7_JbIrpgjoldS9w=": "454617000000", + "qNtdgS42tCTiJZPQXSLQFJeosYN5XSZZyRkvCYNmzSo=": "935730000000", + "qO0FBTUSnQi85ergkbez-K1wwp6Cm1tSlqkI4g-g0_w=": "385505000000", + "qON0cF9-rPqQeHQr3YYbB60pxM_hH2Sde3uKQ34n9SE=": "1586139000000", + "qOx-o1lo1FWyuiHJimw6lfOLD1boiiyiqSKA-Oui920=": "34592056000000", + "qPMEik8nTucNqqJY94UGsfV_0EOf5PLdp5asdTYF9jo=": "764453000000", + "qPe9YzH9kzNtUmwbjWLgnvYOAsFq6zF6_Yyv1hOVTI0=": "469837000000", + "qPq5eRCh6NyNj28zjUIM-gk59ZVW6k-h6XzEzNd-af0=": "458711000000", + "qPylZ6jRW1S-XXCbp-uGk-eIKFKtel_5Ny-GtE8l4v0=": "451287000000", + "qQAjggJYjcf42YL1Z9xvE_VusuoVVxwvNBZxzPRt7S4=": "379344000000", + "qQT2u6_4H1VV76ZSP39X0pkqtQWOqSS3uw38kvLonKQ=": "1286892000000", + "qQaUzo3jbqSY0gzrOvnBPfsOyzHj4aakGz1qVBszCIg=": "911463000000", + "qQcZ68XyUaVf8qQcXx5gGyHc-57hp6dfdPFFtBAtmSo=": "415629000000", + "qQlv-suAyrAwR0FIHm_dvR-_gLsv3lfL9QkGWJKO7l4=": "422859000000", + "qRlp26QTf0_ElErbhviQoo5Jrgvco0EBf7UkZUuLhv8=": "999999000000", + "qRnAUyV0XjUYGYtSqO3ly5kv4nYQnXOyAh3-G-33DLs=": "3846153000000", + "qSFgtoK8Ub9smDMgRJhG76Wf-17gPKdfYUNqWAy10E8=": "4267500000000", + "qSdtKzo5teNlGL1I9VGZBgeQpgiVTHnVL4kHbOxRTfc=": "389964000000", + "qTY696oaKDAJrL21guUnLCxkYXCDwCKkERWKxHqz7GE=": "996689000000", + "qTb0YLo_Xd5RwTwEDJTE1_0sUVpCeHRhJLs-qn2WU9Y=": "1461538000000", + "qTtLyhlasAl3rokBmbB1wyzOriggD08ROaSF8oi1raE=": "576923000000", + "qU8Uq7j4xR8hEWwkaBaPe7Cix9oA9Y3wzsI0jYV-3y4=": "16666666000000", + "qUB9vdwvGGOFep6_ITUdOt8gNwp3rioZ3nj3rWuiysY=": "2552040000000", + "qUGmSeY6WNOa5fiy0qNzNfMpYrmzOsMwfypUVwDFTds=": "2070049000000", + "qUIO9zxR8v_sba-G8nKBIqVUP14OIbPC4EBg_GkGceA=": "381140000000", + "qUVCkOIFIJ83UZkh7w_W1ySSQJ0JNuvKS4LsPbbi_o4=": "385508000000", + "qV471TnVwWbKBsz-0UPULsfy5ENTZ49hPTlmqFbUH9U=": "755015000000", + "qVQ9OFoDCISWlpDUyZXXY9BANFxVqX3KH5mooB7fRn4=": "9081628000000", + "qVoIzpYMjbGOV5Qc2JEhlTAnAsYPPUUtYbh-k1mLZjA=": "1402137000000", + "qWlZ7Qhuvu_2Whk_8an22rbFfhpFAZeuM0pn9X-PvnI=": "403061000000", + "qWxtE1Ehe7_tVNpHY0TlpO5otOn4flQow3VhWrOE6fM=": "1874999000000", + "qX1cB2WImTW-ly5uOuDhRXqdr_tJnwQGx1Va-_nWYRg=": "454547000000", + "qXWZyoI2ElRfpXlH9oAMB6r7_gO8MKc3g5rmljQ_0u8=": "419072000000", + "qXb5xG1_rG5OmICFbgzipggyrDBwWAwZCg7F4lmqKDo=": "499999000000", + "qY-KFBnQKkejbTm1I8a_hXpZW7Si1Q0QqYkd5OYL1eU=": "2055429000000", + "qY3Gmbn9JRWmYoxXZBLbbk0mRKhnx271Rm1o4NJnWxU=": "808033000000", + "qY7OPxgXEFwjYbUu-pepkwT0qaDve4RJaGTSTfMjm2c=": "384615000000", + "qY7jSG1w5Tc8hQ3EylDz6S0zksZfXJxm4n5F5Ub5o1o=": "382406000000", + "qY8HAzFYX89wimLgqC5v8vODjaxZag7I8B5hrJMuKKI=": "1852931000000", + "qY_o97hs6lQpRJGpIhqapa3zJuRlDEcRTRrNKRKshP8=": "4154615000000", + "qYgW7cE-y338hqYntFKVOHVuGmrwEn1dbXBbmiWAh-g=": "472287000000", + "qYjK-SPkqXSyFPiGjXYH-cziPg6XY1rQcVYZOGCY1GY=": "451307000000", + "qZfxJIAQzA1baNKFOAfAbUZUL9oI6ErOBYETF9Nus2s=": "2936704000000", + "q_1ieVlMDySOWCmEZQPokxlsTTXX0-e3HDtM4EMU1SQ=": "452802000000", + "q_2Q5NDw_zlna-52lhIUo8Qyn9h1OvWi80U1SvVrT0U=": "4846536000000", + "q_MzLlpqe3vrVd8Ph2GTQx76guR6NA71Srw_YByPBrE=": "1925909000000", + "q_THHRf6KpqIrkHGDcYpLkOXsnurro4Lw7IpFK_fHSA=": "4520394000000", + "q_jV6nmHHrQqoatyGwclj7ub9I1mVJ-zzx6vtwJagaM=": "759041000000", + "q_thfny8GqURzlvXOocPj7GFsyjW9Fz7P8moIGgv5WY=": "384565000000", + "q_u9qhLcla_W-tcqrbJvn1n-tdPrRtvWPKxiA87QuXs=": "393135000000", + "qb6_rL8PKD_DVHiBmECZjj_tmaAHQg6bvSwvNIQcBkc=": "423374000000", + "qbUQS8nHTnSenGc3L7VxmEHdxedqVeAjeI8JVDS39Mc=": "488025000000", + "qbmNdk3EROyAtuisQBzl6E42RDw-aH2typ7Kg3Y6b-w=": "784894000000", + "qcqVNohiHbSkjuImmngbLFUwbmOQvdGq3pp8YnL38Us=": "1721419000000", + "qcwzUdoPb-Wa7BndKw6-pTxr3PswYsZVYRgCbc3c0Zw=": "411448000000", + "qd7VjZPYETpcw3UAIYcKCfeNQF517fvj6WHUJU4Oe7s=": "10060660000000", + "qd9rylSBpvYs2qYqwzbOSSbA1LWLPy6h-XxNk3KhTkU=": "1257478000000", + "qdXJ1hj4tPSxsg147nm0exEbMuOjqSnbok9BMQ6hidI=": "6677723000000", + "qdXtuAmhtcGxvV3a4wNo763Umuwk-5ygos69yVgbYKo=": "1383627000000", + "qd_ZGCu5xV2Wu-mxML3f-S5H2ZGgP9KMDVYcSCmt-Lc=": "658219000000", + "qe1NvTKQVIfVMx7lhhTGH9dmQWpu2m4GWynBSBaMa_8=": "384615000000", + "qe3tA6Ebe2xqgjG8x2ARYtqXyZDIkEsiGfCdVQwCksI=": "833333000000", + "qeUsKUAGmCDQhuMLy4FDa_Vtei6Ku9BMBxAb8GfI5VQ=": "411085000000", + "qeVHZDWS_bxr0bqg-NAy3D6-eVvM2tQTNYcttYIocN4=": "381839000000", + "qf1cQ-_TNfiFuXc25tjpKLPWdyu_9UbdhPyOOTXBiX8=": "1457773000000", + "qfHAJbDiw8o6_c3ciBQLSMzE2-xBbAMy3yzZMhgdMPI=": "4157594000000", + "qfJ_FdGSzfkIqBAKVNV6KK_2ZfTp7Nm4vJp7YmMUcO0=": "3846153000000", + "qf_u-1dPudplp8OlGBQBFHzGolQkb2heDmXj6NW7TpA=": "4076923000000", + "qgdvFdEYsQrN8yYsJ1dkGlxct0xDxNOS49asr_IQKCo=": "899685000000", + "qheBkLz9rFltG9rSGNc64fsE67fNZzTXAdMwn5xej28=": "2083333000000", + "qhkqa-fMHiCqC1n3uFBKrQK8j_h8dLJuGkIAb8X5DuU=": "928092000000", + "qi-IzFHoSCFe2_UZ8N_Rl4PWsNHlxK1bTN1P3CYvs4Y=": "462352000000", + "qit1WpxlfSFdrrvY9FUWBQr0WZScHF1zlEQDexmHqEo=": "1412171000000", + "qjF6W-ehKYfFZkOAOGg06RHdArstkyKmGf__lfIbC9U=": "834393000000", + "qjMgFl2fDL_-qmjLEvURfA4v94pD6Ikd6GG89FoFSAo=": "833347000000", + "qjN18Hrx33zDjbejkn4nXPeSuBCHx1_SlHTXCSoUsMc=": "9425788000000", + "qj_W49XNHiGcdoJmco2Z6fOlGDha5itTWFHvUXQ4nAQ=": "381770000000", + "qjwLl1NPoJ1MRQp-Ukl3uJd-2JflsCYg4vTnvzF0TAo=": "423055000000", + "qkX6dp-f-SzWXp6cZ21xCeHdGW4nuBo1cmv9CJNVM8Y=": "399564000000", + "qkiCHmQUSO8ryVpEcUQIQlvjjnuBVajq0DCPZnEIHMs=": "753621000000", + "qkp_xJjOPXjV7cOxlIr2Zt6a2iieL8wf3wkmDpT1exA=": "385510000000", + "ql5XEQoA8MoCDxWcUY5Me3R4Dykgtf2UsYWVvjWp_Nw=": "411201000000", + "qlPaKRuvECVR3r69jFmBVBgLHZScO7k94eo6dJqy_WE=": "383228000000", + "qlVtwn5gptqrOK9aOtk7p-YF6ZRz0NfyQDQtTsbuFeI=": "1361868000000", + "qlYSs-ahCZosY5fdZNiUZTBNvnqk51wAu01TrMLU1ok=": "473265000000", + "qlZ580lZ2OEhXoL7s2ZrmP3SWkquPYAVHSy-jREoODU=": "586129000000", + "qluQEajn96aiu5y7GjwxgJY6rpkYsg_HgBhEwWwtifo=": "453379000000", + "qlwOkSQgpthnxVwgG8pqItBOuq3Z5z4_sRD7UHceM98=": "466315000000", + "qm05ZTPrjM9Lus2ujJLMq54dhpVkkbL7ZyswKgeEC1I=": "384615000000", + "qm0p0yfw9_w5snm4AQ0tNrqESCDh61vwZ5GnsnceNYc=": "379241000000", + "qm940No01vE2CoIrzn4GvElG4eEHzsiJwIYRv5j5gpo=": "416666000000", + "qmKWzRp9r2jU7n7K22Nh4t-jtipynjZkG2J2KGdrjlA=": "763247000000", + "qmejzZx4X-X7QZ9NVoNgR8cBsdjk0ITUWVI5KEO7O6s=": "459502000000", + "qmsg-09ES3MofvUq6Bz7Pf30W_pRJ3uU1fWJCU4VqSc=": "501408000000", + "qn7EkPI2b0gF8wwizDkLiO0Sdd-8EGDDhklL64WL8W8=": "463837000000", + "qnXWMDtNRAeTwg2wRlOfYGDDkmzSXf_NIGqMt999sVI=": "479215000000", + "qnmxppvpgv6aGldZT5l2r67nEp12fGbO05ltqJTBV0A=": "390411000000", + "qnqOAjcUQ2wf90Rq_uqfbqonHXF26sRnVw34hxfKatA=": "786616000000", + "qoKjkRwJC-6ptytBLBr1m4efd4LkrDdQ1guA-mVgWuE=": "501385000000", + "qoNsjb-MnfX6gQ3yywH7nwqobt_N3urPm6YAZ19oFhU=": "11599855000000", + "qodjyKASZayq4nIlakCJDvEFqGNGXhil_vJO1xpTuMs=": "3439984000000", + "qovcM12fXmdVRvw7T4w11x0wSDdvoDls7mPG0KZ7MM8=": "385528000000", + "qp72ucEko3m-sOFPn6j1IqLddMuVbC0_AvlgC-VEaWM=": "416666000000", + "qpRXFGTRPOr6TCkWj_pa2UkwPObdBxtJ7ROn9e1SWOk=": "3701614000000", + "qpSoiA7uQyxHcrvYVr2ZAhkQxZHNcXJtBMZj2Wiwe58=": "4579438000000", + "qqqrlrRqsRI5g5IKlQTsm2ql5MYgWVIH3iYYcrbv4yM=": "1195909000000", + "qqtCj-owigKtlfeOLf6FGAeFMcCKLsazXW1Z-5KgPIw=": "464757000000", + "qrMS11W7y4_Z7bhnqnX3bepJN5gur-qmGNgZ2Hq2ZF4=": "1364008000000", + "qrPidhjtNJ2MF0oRZMO3u2vKXqf6oLhddx6fMmnZBpQ=": "460066000000", + "qrZ3PxR4rOeSGN9-uuncO0q9KAvA3b6zedvC4y4Vf8U=": "449029000000", + "qrcl6eqM5n19PZpI8C9f2x6VIf2hDjEgYPbrChJiQNs=": "907032000000", + "qsBBqYUmJcBbXBhUBJKR3B1j0ot8KsV7BUdCcp0-r5c=": "1858140000000", + "qslni957hlb7MChu_rSUQzjx7ewB8z4O-j67E0cZfzc=": "4149387000000", + "qswWckUMN5V6COzn0L09OmET_JgGa8y1U8ko_HC22kU=": "416666000000", + "qt9677rXV03lIRZNdJwv48mMHgWgYFH_9SbXjjYfexw=": "1251868000000", + "qtBFeA1fFdFbyDifVLcSyWGQnYOV97Zm11gnR72cfeg=": "411085000000", + "qtLgAACGCGeoRvhkp4pL8DRR76d6ZPUtCF8jaWRYeeY=": "379344000000", + "qu2-keFrex0IuXWbwEAGo1dMz9mhXZEUMMD-vGm78JA=": "408533000000", + "qu73t6IX0lC_ZVHJodIznm8WFk_j-1LwjkrUEBKFUKk=": "384032000000", + "quCL5le_OetbhgnD_hjNVUnwhCx3kiEIxXu6kz8ktpE=": "451692000000", + "quFY0hGJ7t-kul_zaRGJvzlsPkoaY3lAlIr47S85N2k=": "572707000000", + "quPb6ni6q4OmvKcjBPWEXgR1hgccR3r7ZSZEt1a-KZo=": "8333333000000", + "qu_VfioEvYryFZd3IWZhebJgEDJvvXKr7TvhYKCN8gc=": "3297987000000", + "qv75YbG0_Z7sc03lZ4xEl1ae0FypOaQCaBoWcXD5Y50=": "4565083000000", + "qvB-Vy96sU_Yoif08UWMqEcHoDNkemjdQz5co6Lyi64=": "1083094000000", + "qvff_I6o5Ar_vwm5tx913NlAc6uAMiKaFDayTPRaB9Y=": "457943000000", + "qvi4kZ_uFDhidslrgtu0-ohuWtOP585Ee7PvhuXNOoc=": "552445000000", + "qw2125ZWe4YldnMRtbX3b4Nnbo3SN8lgslk9ne84TEE=": "1806216000000", + "qwl3MsHnftHtn-rgnNMI4FRetBPbmTWcDqQGnG3M4yA=": "1363636000000", + "qx9sZ9_s3fLVUFpCWA00qmR9Y7VQn5Xr2YHBRPqHQRk=": "384945000000", + "qxLXlC0ZBTX9YaPNSs2b1lPJZfZFdeBTwYP9GGprCmw=": "1952189000000", + "qxWDlQcg6s6cePKZDzd5CROH1qlM6b6vO55nsBaWynE=": "452992000000", + "qxddNj79bE9waOPVhhI7zgJi8Ze3HO3I7UYeDStCGDw=": "785002000000", + "qxlr3A3Whw7QIwoqsypIjr4U4AIJr-SHSgwxO6c8FPk=": "975157000000", + "qy1TMsgP2VkgtHGmqKupVC-B90VsiIjstQ0Y5Q2_WeI=": "404478000000", + "qz160yxarxLRDFZmzWDhcrXx9oDgXmj7fv2cNGLkNI4=": "10454545000000", + "qz6W6EgIlUtBha3bA8yzo_heTR3A6gfZHei3JSwGiyo=": "768695000000", + "qzpeVoqdUce7qr9_OKLXINPgZWrImZD8Li-eKEvglUY=": "579056000000", + "r-xhv7T7Z2FLlk3tNFxJlPROXd4GYIAhkw6kCdmmuCM=": "6550435000000", + "r05EVa9wYSuiYL7vH-UkZkLa5bVe-O3aGsdU2QCmPa0=": "1644524000000", + "r09oR0YjFS92sRaMZ1WkcYCRaJtTIlhJeRO10l5qtBo=": "463099000000", + "r0JZjJ_DTfmZqZkBX1dN2lkJA8N6jJIZqEKMzWAyQ-0=": "382394000000", + "r0Wpzs4AKWc1AU4Zj3jdBQkr4-iUcvH1Z6rqs7rInfg=": "917710000000", + "r0fUnHUXJPIZeSazYZpefWs6XdSPWj3IAjSvb1g-UCU=": "463665000000", + "r1eTAJ9I5T4IYFtOcXvyv-9oBJrssTpl7y4hQljqBXo=": "384343000000", + "r1n8ZZAiBBlQAPrSqyj2svzBwVPWDFKH7Z9YoDsi2Js=": "834556000000", + "r1oen6ko8KusLdeOGT5b58Yy7R97Rv3JFCzcDgJwSq8=": "424758000000", + "r2Gn751DmjZcOL3FKt4Iry7YQkQNJEGrXBLqXERza30=": "2267514000000", + "r2PoxjqxRjFJeDTivPD4ur_HaI_MFUjdXp-ZpeHWllc=": "769230000000", + "r4_VpK-Upk6D_y2_FQ7Q0hXOkdpQCNs9bFihwf2fqOo=": "2909090000000", + "r4_gzQaIfO3affJwKOxNMEXyLW-pBxPaU6YLBgY4pTU=": "1236867000000", + "r5BMg0ovFHGhZGhWGL_2oM_z1ku0KOZuUHcEZGLTUaY=": "1842458000000", + "r5Dryhy8TAPjhB2WzV_HLNN3lDufa6lCcEc9ALD0XUI=": "810428000000", + "r6Zb2fKEhp-HElDFRdPNbDd-4DDiLlZhCSTP1wt4YR4=": "421370000000", + "r6i9g4WLeRQ5A0pLP0W6gPZywn85mB-Bx7aUhfC70cI=": "407469000000", + "r6jKQFDFe8fYzUlJcuCkvN5eLdVDfCRrxthTETORcNY=": "1371815000000", + "r6mogDtJ950dv8MqzxMoVQqBoDR11GBKXDtdPA3i4Rk=": "417632000000", + "r6pJP1glaAvnVvHilz1ZK-115H7sNsqDNQbodYxDgSM=": "457014000000", + "r72ZD4ef-BzxKJHucELrkg9bDJN1ONjZYDOiaGWoGIc=": "7568023000000", + "r764ZjjELAzNv52Dh3by2L9r86wIOfae9P9k6Ebwo1c=": "1947974000000", + "r7goFfGD14l65HwfRPCQ-tgaA9nStAU1YF8j7ceBt2Q=": "87373125000000", + "r7mAE6XNaNZXy0Juahyx-8E7F3I_9F8ZPVD6bAEgXKo=": "1363636000000", + "r8-oGsJiM2wzGqf9JCUc8ag2t1q98Ve06npiYo4z2Rs=": "385505000000", + "r960G1L0P6PApTJqMkSiqW8XMxv8uQyEmSRpf_4N-NM=": "625698000000", + "r9PLrwXDuhoQUlpiY3LqK87kL-XoED9ZOsuYWW62kAM=": "384619000000", + "r9U7iGSbJ7al6r0o-ewMueo81cJ5AEAW39RM-qQ5mnA=": "2310726000000", + "r9_Azymw-hD4AaH8ZNXeCH2kCHFV0a1k2NvnevtB1BI=": "500960000000", + "rA-UfU3qbbKop4yo9V7rE0dmS6Bxm_drv_9LTbccNmM=": "1309650000000", + "rA6YZ5xb1vqugmjpNeAKspoIkEuB9zelEWfKxQuj-ZE=": "769209000000", + "rAATObmUJWZyHE4ngX-UXH2NnbQQsp0bCekFdeXCzUk=": "577459000000", + "rADtc4CfY7FklgEQHfN2Kur8K00zI2KW0qcnHUlf5tc=": "614756000000", + "rAJUA6yjrWNzc2Zv0NVOrpaLsOcdtIQmfwZmXPw0Lws=": "411085000000", + "rAy70R0q9cbRyx_19uDAAtZ_2WUMPRsOKCm0qVRHYTU=": "457529000000", + "rBScmzycdYmoFuOpwvjD7s38Quu_nR1OaybKQaQjd2g=": "591202000000", + "rBc1mY_2rIjhTWsWW9SmRMYHHn5GpmCpR3JKyqXQaT8=": "393313000000", + "rBjlyK1uchRcf6NdmjxdejjAT5It6E_4gD6cg3Dj8Q4=": "380811000000", + "rBphXET7cD_r3oaM2jkQeXtKMZ5dmAojVlFTMMhBSLI=": "2916659000000", + "rCVXyHbE1Ud9hcXActSdZdCA02nPE3UxYu0kmEpdVmk=": "942307000000", + "rCWDPayl2dlZnQZfJ6bNb363caCHyK7rYIs8WH-XZl4=": "989074000000", + "rCb1_U7ezyIfJaRh2rqjGazJjiuCl4GLBVi1Nqh_UDk=": "1739719000000", + "rCf-Vi8_c2nrKRIXkGv2WbHMj8wPKtjQtAG_hqon3Dw=": "530057000000", + "rCgWDGuzWkptmKvPZgHGPuAwDzJy62qF8Pg4fAS4FPI=": "384615000000", + "rCmj9S4qh4tGwHOnM0YUJQiztpVVF9A1auBh5W5jrGU=": "834035000000", + "rDzoYwOez2_rKbXuWb_DDCMwLTfo5PSNsvIBKao9KaM=": "767961000000", + "rE-8VdYASkPq63uYby4bb60VKSV349nUWCKlqCnqr-8=": "725589000000", + "rE47dLx7lWJlD7fKmklvGCcqxQT2TBh3_VVZpmNDpk0=": "1230823000000", + "rE4Fn4MDR2TdlXlrW9JAn0sFAD3q48eu94x6pkN9XRo=": "1001538000000", + "rEQetUtkkaagfkpkblF9vaxvC7co_7bv-82DCaVoKG8=": "749759000000", + "rE_5vqLwRgjeAD5J1CET5cFKy7aZKSjn0AvI9Ttboxs=": "846153000000", + "rEzkxrkWHlxrC9w8Ej9s9rDI35oyFXELHM3VmosDO0g=": "452450000000", + "rF00KwOI7tkizdlSNgz42JcUvXU2pzoJY9l0P1t5yV4=": "382394000000", + "rF49gt1XU3lVBlz7ACxOZ1z3DzHAKMjwQw7G-JlT6S0=": "2379170000000", + "rGMau_omDaAapUbdxAzQtblLuw2PApo2yx2c_2B19Rs=": "468609000000", + "rGsTUetLe5NfimE7XlG1l8iH_joqwC3NWtVty97R_OM=": "416673000000", + "rH-qB2DdesEvCpOh5k3FN6BFK6yvSURs4wWuTrIQQsY=": "1684885000000", + "rH2qDmpzb-9AxmB5orvNnJZYfxbpc9TrFCaCYj9JbO8=": "2083169000000", + "rHXRp36cGvvTJJofrOsifVihpPhyP3mvWqmnPEG1A4E=": "417149000000", + "rHYEvmV-TvH0uPQky9Erxv5zcB2eBWF_vgELR7MkaZY=": "634433000000", + "rHdOY1HHwRFWUL5yC_AP6n9vChOnY5vxrU3ZujfqtaI=": "483147000000", + "rI04LqkwArR9YkqQKsmpC4kJwKofy5ct9G-0rRadXYg=": "385505000000", + "rIGMAvufyO4evswSPiXAv1sHAd0JquH2Y6CsVt1yKIA=": "1392516000000", + "rIIwt6ouwaNpjRFDZwy_wRhEus8IgUOVu--wFU4pQpo=": "395497000000", + "rINeawlhXzJzE9ntkzZHmA1pBUUM5uvpZQVO1RA7HJI=": "3844869000000", + "rJ4XAg17G9HjD3Bvf4lsc3EESVQ2Se2BzpOMVTgAdag=": "21900149000000", + "rJFxjEhDWfqYRNCHrYGNfbaGvIcuQg1ayNJ9qZcZu1w=": "411969000000", + "rJPxNeLLsy6mOaXI4MYuNzyQ0WlgUSnkMCBHs-SKfNs=": "1874439000000", + "rJow4us0ODTEEU-HnqKlTaoVtgvS5ggjUnFgCH4ASwI=": "1269606000000", + "rKCgWPc9qr1w39SmnXuZyFf-nsBXcohZKmx3CguH-yk=": "771961000000", + "rKFQNkwgM0DZxZ-_cL6zwnM-NMIx93KfFA3WDLarpYA=": "1156520000000", + "rK_SkN5WkQOtwFUPBZetkKrnde4Oev1ckXVXX55J_sM=": "383228000000", + "rKtAYpLoYROm4kqbCtlqwy0rhTn2RnTz4W8Y-VwVtsQ=": "790998000000", + "rLC2CuYtsluBjV6IZSunzaVttt99v4GvLtym3KYm5V8=": "1252901000000", + "rLEHot9Gzs80kW0ke_W3boNXcftS8Q_7hn7ukM2Z0bk=": "3846153000000", + "rLYXBJxw1Kg67E3RpfEfzw3AOp4OdQEZ1l23ZooRlCQ=": "385505000000", + "rLZk9YqhygoS96y1qBxiIQ5K4OR73hxevnSy9_2uoVk=": "1418627000000", + "rLlx6vZUl8qKTH4heBEA2Eky6Uw9oq1blG2zSizgYBE=": "554324000000", + "rLzkiIePYlNMiWXfs6r8h0VMCDwSSqP67aa6vQtFDuE=": "383197000000", + "rMNAubrlu3slkkazhklBbopkyowyTwBJmAgQNHwJ05U=": "376837000000", + "rMjarbPZdrauNuT_IFQc6xeF5d5avj61wDHUajLdf7o=": "847421000000", + "rMxlDvRcE05gMFX5Z5P6rQY7Bq9zZI2p6vRu0j6vZAU=": "416666000000", + "rNP0jb06A9L0oN9pJxQq1Mo_pkuFuxLdq6CCdi2ySJw=": "1548420000000", + "rNl7iOWzosmgDl_-sHkuzKmbRimAQ9XObxy3n06sRdU=": "1156519000000", + "rO-pMn4PZB42ov0r43fIZxZH51V0BM3Nn0b04g2omeI=": "4166666000000", + "rO3WFK6WHnx7RsXVsNRQzZBURD6It_mMt74tqbMproA=": "776245000000", + "rP05kTrlZ9XQjDFpo0TfRuBMbWMzzUeFWNpTIfAKvJQ=": "384593000000", + "rPKkvWlZTUJh8UviL3qURuA8kRWjARWC7Ql6Atmme7U=": "446725000000", + "rPM86Wv84W8YESwJ7IDx55jOAVWpsBKRbG-rBUfHiLo=": "1376653000000", + "rPT8sp9vujz1JXZMW4DHawDQW_RN9FzKpJlcvQD98D4=": "770335000000", + "rPWTfDS4Y0_d1QHs6mQQ_EeL-yDI5vAp3vSnMjnF4AM=": "384615000000", + "rPrxJsdLMPuJBm8PCO49qxpSFxG_ateVOiuNZI6BIlM=": "8339611000000", + "rQQvKIyGoO6faNk21_R46RzorLpG0OEcuTFhhu5IVIw=": "2080650000000", + "rQpgjM4UyR4N9QqHKv8DGvT_vhlbDLffZIaZCFRXOFg=": "376125000000", + "rQqyUy-IvSuUb0axTehroPYo3hcXo2b9Y4ccH__S2ps=": "381767000000", + "rRq9h1zqB9V1NyEqyEzngCKWOtZJdvpWtdPRiIELNh4=": "1223425000000", + "rRv7NYKTpiDhY8To1QA7QYV08dcZA7aBlszkaU5nKXA=": "21071538000000", + "rSKzrQ7cb1m4yDsB-Vyi4L68HqbcXLRrDX1oQaHCPGI=": "2916637000000", + "rSMHl7y22Eg7c81dTAZRXpZD37JbTDZI3cTHSpfymsc=": "385435000000", + "rSRlrDILeinFjNAdKBXXdtgiNleC5jszos_bC9s2s4Y=": "384813000000", + "rShNt6R_gFvtcemhHlQkPwxzzhbkHsQG5tFDzTECSwo=": "3793448000000", + "rSsVD1D3fiRjTk0CxG2AupZxw5lYkKgy87vnUj2P2bQ=": "451521000000", + "rTSu4Wq8PHi6ix-LtrCt0q5b7njzRBN2UBSh9PyZAqs=": "416666000000", + "rTY4P6Uf4ZKw6qAykJnasnJp-4DDzfSk4QBh6vhu3uM=": "385505000000", + "rTmSMvlq36fFIj9v-J3ljxxSetwGTv6PzuoJe5-xzDs=": "463398000000", + "rTmVwrrd5U_nz6Ci_Egm1dUd9_7hizBv5EZgQjtuD7Q=": "2316509000000", + "rULSIcwMiwQ0jS5CRoLd0PKoAvPORBiPD2njBJ8lq9M=": "500210000000", + "rUSCmUN7wdAcNfxBqagAV-BNr2l6EY2-4E_VGKidPuA=": "1002567000000", + "rUUH5FCZtiCdquYH1QBVRyiaQc0ln-_QwXp7ctE7ggQ=": "917239000000", + "rUzHeQCTzqVFGMVaw3tQ5h24oljxEdYayZyUxzaxIvM=": "351858000000", + "rV9zkhZF-8wHNGOhzEyYvH6aZX0cIkOFs9RwjX6cbtc=": "1873637000000", + "rVQYO3I6Ng12ATZOI36AolJX3xw1_fOGrNA1gpGg24Q=": "384615000000", + "rVQuc61YLNhgcIbPPhdNBbmYXLpYX445bxUx92nKo90=": "834184000000", + "rVhVv0dbc_xfcj8NdW-AV8l0wbuaX2ypGCO1Vy0ycnI=": "4038461000000", + "rWDQc_Nwgo7lW1f5t6TeQtxfCxqKjZIvryCtlS2FZs0=": "384244000000", + "rWGXh0Vf0euDrAK9IB9dsadX91sMgxKXxQXJjekftW0=": "2499999000000", + "rWbc9EsZV-9d4Ks2sIm40NtA5-DCGVbMs-A-lQZuBWA=": "4582599000000", + "rWmmMC5FdcBYZWdoGfAUR29BoGfRf_ofNj9ftDOtaik=": "1822400000000", + "rXH-jWzCOLx9XnPpVk9CAXB-qsvdCbVzr1dHfY8XEZM=": "385731000000", + "rXJaPaR_Rv2pyPNQIJTe53nvzo7ERJjlmov_UE0BbPk=": "1223425000000", + "rXgzAT0Tni2uVwYFtNvQyQ97wuU9eIvSyHGV5759Kf0=": "861307000000", + "rY0EB7r8ib-M6VEzD_fkqvzWnGnPLG_gW3dKcbT0e2s=": "419607000000", + "rY8x8Zh93tIJANgRwNgNwKyRU738xnIX9kv4glzjo7I=": "2485046000000", + "rYe-xIWBcWhc5j4DtZ6Gejl22IxaGiHtI0bQIelJ4DU=": "1156520000000", + "rZ2UKDRgxcqv95CRn5CEj8b7McS8iUU6oddehDpR-8o=": "971226000000", + "rZ9AIaj9vSjHWC20-n8R7Ii7XfgNMvvDyryZ3xM22CA=": "416901000000", + "rZLvShBWW05jR2R5-WLS7Q-Jji0jBZj2vOWXZBzfjEk=": "378507000000", + "rZSYQpPu1oPp-WrlHlUP8BuZ7L90BoTjjQSgoZK-AW8=": "3539775000000", + "rZlluypr4_4dABK5r81Wk-qkBgSBTJMIaWEZdoMLeYk=": "455103000000", + "r_-kPxfhP23pJyGIVvSF9ERlbVmF1nij75R70kcouwk=": "384615000000", + "r__wEaTeBg9nSbr9rr5-GQ55-Kbpe4BVamgwtWhNvDs=": "2692307000000", + "r_aRD6_6W3kxpQPO5b1gHXGdep6yTwww1AM-NHW-m3c=": "1918404000000", + "ra579ixwg0deHCy91u3BkYDfzP1mdJV7f--nuy9QQBc=": "15961753000000", + "raRGplaXz7Gxv83cflZ7tpAIKv_jMbakjOO-_7iYNHs=": "413111000000", + "rab7nlH5eggUDOiGEk_yI9v662eg888_LFgC3A-hkJc=": "384615000000", + "ratuvPcsXoWr8WOl-6BW0wwq98-1iHPJ7U-gpV5cGt8=": "385188000000", + "rb-Sa_L1dY-1iNSeLDOWOf0Vt0cpkcFurO2flzJP4do=": "454401000000", + "rbQVhdKvDSgqhR9Ej8-ykQ0MtvHxHl7iAanZrXGxL7A=": "4230769000000", + "rbTTW20RwxCPMiS4GtbOV3t4u08JJ_-WT_MS7-O58RA=": "384615000000", + "rbmo8xFV-XY00uTquibd4Dplexho3ckKVCEjL7fS1YQ=": "672689000000", + "rbnLUv_-3e64XNtpVsqwA1AKdxfU4DpwTDLfIa7xDQk=": "6590534000000", + "rc3BqTzQMdCYknx2MVVmTICt-W-SD62MXZV5hldKxZo=": "384250000000", + "rcJb3JelWO6QlgWrT5j5qlZVeEyoCTFS-IoUlLCZ420=": "3855061000000", + "rcSKFpvIqoU2HMKDEfyjshGH6FoP9ii6Prd3gLLU0FU=": "378257000000", + "rcYnwH1PUBgRDoDD_6Uk5RjkrwawfBV7l7t5NsvLEyc=": "461649000000", + "rcskFdBaBPdX4M4gyCCJIrGuk9gMMaVw1MYeoBIYKkM=": "736060000000", + "rcvXcKflqGRcgNkYdGLm_tSehkUrfAUVQ8p4TpOEEQI=": "417501000000", + "rdLq-jzv5Fi8-GB-5AebwpaIHjwxNiGG9R6hFMqSDXU=": "465044000000", + "rdtmdkhoktxscy60BvqGoEex-qtC3kZsDel4dzgcgE8=": "377242000000", + "rdxvmU0TZhdbUKixBQw2SVGPJN6wBgaB-ya_Ok4Fh-k=": "388728000000", + "re5H3eSL7U1NR6M0xQ3BRLqjz8NpmOrB2-O-JjEY1hs=": "909312000000", + "reXoJ9UjPj8utpPeJyHJqewxmqjtvmyfJTBBMHI1TnM=": "430653000000", + "refWOfgbuPp6_FQkW04jRHQszRYg6w_sT67q5Y2w2vg=": "384615000000", + "reg2aoBcX-7T4O26-kd01PuntzOEAuh3TyPXZnkNfLg=": "416666000000", + "rehGgW2pu5Dmk3bigwZy65qVVaW0Zchm5ctdu165-7o=": "378257000000", + "reiJVPAMTREnPfNkD9pzN0pQZ_Zsr6o0mmz_B0sP1Fc=": "383021000000", + "relsNezwXwvV1tOBLgl1kWMq68BJ828c9DS-QeZUdQE=": "30352916000000", + "rewFi8_GvX_tSoSwOpdOF27AZgJ2dwRa646pnSgYY6Q=": "416666000000", + "rf07FEfOop5YuKcousnN1YeoIETsydaJLhXCGkuLP7Q=": "1422218000000", + "rfKJGNhLQgcEy9kKR9oP9zofMzG3gzwWwJBNDgX87so=": "417529000000", + "rfLcvlULtF4f1DQvoEN7caE48kA5gAn_FQinjUgJiCU=": "461649000000", + "rfUPGB9YjqyKpPHY0fk5W78esKi51dkxNLECn-7a7hU=": "7662809000000", + "rg45DG0mXXLkMZSyFHQL4eHFcQ_cT7ZtywpMN0LqJ54=": "3303953000000", + "rgX1B-t-wD4uoQXVUy29UvChqMAZaBHQ69LYXm1DlSM=": "790998000000", + "rgetgbKz_Ex3QVZkYAJQhHx9IXebIIARMnnYDJuZWJs=": "826486000000", + "rhIbAidqc1rx16hxsAd7op1dlHD8Cq3tSEJuPPk330o=": "922143000000", + "rhIeecthHcr6S7pDUk2-oVUpvFkquoVTro4sgBkltrI=": "379344000000", + "rhb7dityRhloHVpRphXl52kjYdOTFYKsNdck4uKuEMg=": "1134175000000", + "ricfwNoyl4G_qX48EV-jGJB6tH4esiLTskfm2ZeIjF8=": "2087040000000", + "rilyuS4enO09XfOLQeqCOlEFdnZaJpjZB3x8BRIFafU=": "385506000000", + "rjWluRI4KwDjIvPyjAl7hmTVQxLSl8Tofe53ldnnxw4=": "455600000000", + "rjYU15IJ2a6Zr8oLqtYUu4pmovc6-pjJ4Bij7b8J_IU=": "460310000000", + "rjhUlRF8-KiWrFNloT36h-oDDzWmUsvdKCmfyu1pZkE=": "384973000000", + "rjiRwsvn41dnBRvUtWx4CPzFV8_GvoqYA1GoXa6qFpU=": "457058000000", + "rjzddDN6f4r9dWQ3bxwe4CzvIlv0HY-iNMNObwtCU5c=": "385506000000", + "rk05z5-sFblpwM1ZoV_nZvjLJd2CoEpkGA_8xN885mk=": "378072000000", + "rkbiZTw37FsdG-d9ljBR6-46YjvIuI79v_uKkaQMYjo=": "632565000000", + "rkf4_p6LRc2fCfG8gQ7Lr0dmJ7WIyzMh5pgC67LH8d0=": "385400000000", + "rl97wz1UuwX7Bbk1Aju1VaXfC-G5RV01HFAgTsc8boE=": "1216563000000", + "rlGiNRZM_r76Z2RCKxTZ-CoPvMHzev-3Zhm_O0Yq0D0=": "496855000000", + "rlRJ8jiw6ywOnrG8TxzlfqxiAqCKylwZponf4gPKUgM=": "1538461000000", + "rlWrMICHmxurfXQzZuqWs80zhiK7y3eQZ5cYnSaeAsE=": "469404000000", + "rlZ_e5cSOBDbSIZ3tv0g01PFIb3mjePjl5g5FACTyb4=": "385505000000", + "rlwZ0AiIjMTnqsNU_KWCDbA8BSQoMcOjcKF3rJQm4j0=": "1378107000000", + "rmp26U4Uw8PHk-iLZZukm-3ZIQnCjk962znPtp5VlIc=": "1204617000000", + "rmyk5FXYL1RdzxSY5GAEjpvlHj1C8eh29uTF3sMw8Vo=": "4997932000000", + "rnI_v23HGXUuOl7sLZ0Qd9zTEaEELhqL3gbg2oInA-M=": "3199956000000", + "rnSjQz0aJV4zEyNreN1tC9IrpeyC1s0OyxfobQu3BhA=": "961538000000", + "rnc11Q8yIOl61LTrGTkSKo2sRGU79g8XVRhV4XUnfoY=": "388347000000", + "ro4KCX6o6aeOofECPPmSEEyEycSCBMdNc2f_K2ZpB1A=": "418120000000", + "roC_M4Wpy4xZyjriChvR08tBWSGOP-dUuCF4RmKzipo=": "386320000000", + "roNePgaZTY6pynK-FhlMQOG9p2hja-cEFsiGMWi-_Ew=": "994805000000", + "ronEX6qjaF5BI1zU5odm88c5ihInatthEbYUuokDz2E=": "385506000000", + "rox_OyW4GXXHQdMdPadRp5-bbtSBXzdXHdjSh9ghOIs=": "452943000000", + "rpS6NjTZFlYGcesbe-eAwgY8ILxFfOHeAIPZ-6d0rgA=": "463799000000", + "rqQs9N6hZXq-ac2-pEwaohwoxpVRSEab_DGl2ErliII=": "7483384000000", + "rqfn_NZb24IiTXGpR7BeTCS3R0zsReHTFpXhwGEAMtc=": "454545000000", + "rqspG0dZaXqXcypKKHhOxwa6d15Dw0R2IGaZ2b_5-ps=": "3921237000000", + "rqveLamNMSCfdZIFeoTQARjpgkUGlyNahM4SDNvUTk0=": "492405000000", + "rrpoMfPKY6cYXTJ5a1JIxhebkeujSMb8NO7iDiIt7_4=": "639417000000", + "rsAUdPYBezXrxY_iUTtPw-5Bgw39QDINxZ4quDHHe-U=": "455526000000", + "rsSdA5uGAZcS2ZwQZUh9t2qQIMNflZy0Pjp8HEdDVN0=": "817307000000", + "rsX0ymnRRNsmkxiPhYIif9QHFDGi41bCt7FVa3uonxU=": "455367000000", + "rsf4C3wXTm4JM40EzMVCNvDbSxmlkcI0gQXopQ2VOmo=": "416666000000", + "rt2LjgquVq5PDTGiLA9pkS4pY8FVHLYFgmSCYYidVx0=": "1615367000000", + "rt8ypDF-GpsKx0fC7529RO1kbzM0GzEf7X2JqDpL-vE=": "380585000000", + "rtvgqgE0L9GC6vU_zjJ3gjTIU33UMDjoDqmUKG5LtGw=": "4834423000000", + "ru-hQ5sISHTzCH8fFJ9LYAOmtst56WV5qctsz9JVA3A=": "415901000000", + "ru4WjOX_Dbb2hLe4IakRabwq9phwX28ksy25n3RTriY=": "576923000000", + "rv3Pe95b7h9qWk0PmuMoLE5xdUYn3g5ivCXFeAAFA3c=": "384600000000", + "rvGqId8PM9ON676P_VzQKSeSd5qEhxrtNoFqs63rhew=": "3414222000000", + "rvNho-rJmTrnklZWuLbTaLEZFwL434vhd1l3g3hDjCM=": "6249999000000", + "rvZsQsnyh-jRJosL6bgUGQrASznvsifq2WhYlZ9NWVw=": "632091000000", + "rvf7OsxQWkV11jZ80wRcZqc1_mO4znQ4Eb-kbY0ODJw=": "787528000000", + "rwOQsgESA3NbWT9jSr_7p2lia385KVm-iodwzVpLH24=": "396305000000", + "rw_ZQ4bcsybHMl5MOuq3EsCazox_vFFklBka87tzCTA=": "1785662000000", + "rx1IWbdvLX-Vu2uANB2Y1WiVzDyENbaXCH2UyO-qfco=": "843817000000", + "rxEsNIeL6wqYbIgwG4Qxy9ORgX_nLq4dfP-xcpnktwM=": "3749999000000", + "rxcOX7FAbYzTT2CsPemHLJxPfxcRZmDKFzPMWHFrSy4=": "572250000000", + "rxofZ9KiogyNQc_R1nJd21oRdNqP6qCLQyYel9ARd4Q=": "406107000000", + "rxsxj4RZ6hQQWPtozwWJ_yBhUfpzk81CndiP2h8gFgA=": "476420000000", + "rxvToRa8DI7wUF0yoI1TmSKASoY8evBFslPop6NQZiY=": "384615000000", + "ry6kAxpMLFsQbaZFa8fFiSBkQ0PinGCjZ317MMEwVDM=": "608069000000", + "ry8Cq8YzQTk5-lAmWuGOrw_XhSeFX3BaDO0qtGPV80c=": "538461000000", + "ryGWpq6VlT7rFby2a5ajx_s-IES1HNqlfhwfdpMxGo4=": "1321302000000", + "ryNzRliSw5GQA3doUJIwrdq60shLmDug3LXvelClPt8=": "384615000000", + "ryTXb9ixTfJ0gifhtIANfvE7IWa-Jo9g-KpHroFCQXg=": "464322000000", + "rydFfVh_VV87VQCiiZ7n5la9YNWNoWOfG4eYKBEJ1mc=": "567136000000", + "ryetfvip4SUnxBFbjQqW74tLhBX0PVz_Oe5RP90fjbA=": "1100384000000", + "rz6oQFvdWUtyF-RdutokG4hKIaF0KJ_8V8LjAYBVluE=": "499999000000", + "rzLXxmnyvjcDS965f8WOCQaFUESYLmFMTxYg20z0IYo=": "473228000000", + "rza52Iy_F1pb-XhQWQPzNYO30jUXenq1WAxdceTGdAw=": "381567000000", + "rznwG6aD_qbzyj8kV_DjuUIRD-NODmTXUyRTFyL1jZA=": "19041970000000", + "rzsgq7sSeZ_VaKGDMM0MUPugJ9AIyhQth_qZgt2lHcU=": "385475000000", + "s-1nukFlVXfAb6gtdU1vBIUASmZxVEM_ly4805qppIE=": "467972000000", + "s-_BEi46207th3yrjWu6xpBLrrFtA3H_p4ykPkdafJ0=": "929233000000", + "s-bTClKvEhZPj23JJPFUjAdoSXqw_ZNrQyZnysNEOoo=": "422815000000", + "s-fvBM-ImS5iT-LiAyNkisdqRh9aRXAxJZn01KbLl-4=": "763868000000", + "s-ljWB9nlY1hTjcId7gI4iR0ETTcDAGx2ak85blTMpc=": "764832000000", + "s1Q6kxHHeju-FOcgw37pkVGTSPFqWTNsNajbVTVsYyI=": "808957000000", + "s1U-738Ktinbb6aAqiaLGuDASomJm4PsjCLNDzGMe4Y=": "416408000000", + "s1amqFg5JacBI-4BhEIQs79SJQyAdI5GSeocj1su9v4=": "448728000000", + "s1o_lVOItwL_8HbR4oT1WA3SJv7pSslYdJgIeBRCDPg=": "447576000000", + "s1zEems_2aGQ36JPtt9PGvpbrmUBTn7z-fGygiXO2g8=": "1249999000000", + "s1znhzDUSUZME3szyjx92I8rPUr0Tujufoi-g15rEfE=": "4969390000000", + "s2BxlYdX_GZ272WPi1Av9fg06QhUogfp4voKPkkOwt4=": "897065000000", + "s2LUTjCodFS68cxVlPD1zJI-JQLK8jd5gyIKhBgzlPs=": "845123000000", + "s2X5tFvs9OO1okGi4AB4t-2OItI2GfE2F_LLO-V0g6M=": "5651183000000", + "s2ZDveGmNXI_mezEWPy6_aw396oAUXkWvic_z7-vGOg=": "385078000000", + "s2zRpRrLvpchVo3rQvD1FLsChYgyI1a6UEQOjLXTWw0=": "2098228000000", + "s3LLA6XR95k3X4I-Kvbsh1MSLz1XPj6HvY-__lPODb8=": "456504000000", + "s3luQYd8HfSMMw9-xW4f5_hUo3yEKEUdz7TtrOmYqJk=": "603092000000", + "s4EMkg4WyXIIr29_oirs8cD6dPBJVzZENw8a6Jed1z0=": "769845000000", + "s4VjrLnXZLpyoG6tCj3VtjrlOgR2S4Y1g0p7lb_wQqo=": "419937000000", + "s4bO0OWJNJa0f6ZMQfssWsDToHK-AxZrRPn2BIBfonA=": "1854461000000", + "s4dY-1ie5zB7YOKhba_uWiRVGtw6rxP3C4Rlt8TgI7M=": "380112000000", + "s4elD0eFTy5MkUCpvKM6Aa8Z7d4Y3rzBAZgHhVS3Sx0=": "5297616000000", + "s5SUjZxruB_DbErbSiRtg7XyJAYHwQb2GTU5r4SBiQU=": "379928000000", + "s5r3C4Z00A5TaZWXsItzDh08fVNApsPEpjMzS_LkyK4=": "416673000000", + "s60Tof21Jqfv9ynLcU6s8_tTTVQNwnRXUPcIyvBqYWg=": "561854000000", + "s6NU4LEkVqJLwaNPX8ax_HOA-qRfV1yuJUzq8968XUo=": "642698000000", + "s6Wh7wv3w5kv7-ocEo2SgSgblIycML3i2WMOMugaSPQ=": "576635000000", + "s6bGY2h6YuV7SLIgrQT7kmVnbKKy55AFs_0TaLEfHGk=": "2059257000000", + "s6pWTu9oBMuQQ7mBFccnyR5I5iOrm9kr35j6DITzfnM=": "6030655000000", + "s7-9z6ae81TYK0cFQ9ldUtzlOpZlAFch2Tgnm3SmZIk=": "547656000000", + "s76O19pWeVSBwvCZ6HGtx6pkzTLelhZumdtCO8g7kwc=": "378106000000", + "s7Hylh721ZxXsl6Q81J29yOTikTIah975PI_VGZDJsk=": "1177351000000", + "s7l2J79y46Z6U_rBncuO33rgcInqjA_79-GWfk-B0W0=": "473848000000", + "s8Ch5v5O1Df9jxcMyjd_EKLDtmZ8x68SaJccJ-4GQaw=": "3003846000000", + "s8JOTyUczE0-mCKUL7Zo3Wvy5dNUplyx4KBQBGZLojo=": "420145000000", + "s90L-2ns7rSmFMR2vgvuYU_6pJRiEJNreHMbd0Z_YfQ=": "410399000000", + "s98FEYfhRW8nXxxtaX1X9g2yImfGW---3EbpUcFqy1k=": "383532000000", + "s9WRaqCEheTRAOb9KcSofTZ-7Mybn0AGD82y1E_9PUM=": "2070226000000", + "sAA6p24brSJG1TFNlJic5KANNeEZx5NPC_exEDlfJO8=": "4542327000000", + "sATZq6IuPbWfh4zYIKbfzYzH8TmHTQdM4hl4YNcW9zA=": "469809000000", + "sAzEh_mn_PR4e3DVcRal8N4PScOx1Z3aOq_68YL_G8s=": "393313000000", + "sB-oSbrW1OgNHw-AfbBbihkKouuGlYce-RC-gtqCRFc=": "452708000000", + "sB8IZpBYUeVId-xIvEmpPcwekGDSEG78uPG9pnPQLyc=": "373603000000", + "sBJx9wzjXmVa1VFEsvUzZwa9eXtDTqZmnkUWGNPn6AU=": "386406000000", + "sBUHP-Sg3Y0EEeHbm8-3yNIkxa3xeMxnf6vUEWgl7Vk=": "384982000000", + "sBaMRV3exR3LDY8gZn8qpU1a2HTm_Lkg5fOaaUnXB0c=": "2291642000000", + "sCwV-eq7QuZk-WJNtR3VoutGD7fWo351URG9tAuu3hk=": "384615000000", + "sD9SOxMH5VNlAgmtU0diQwzXEBrbtPQ-PhGC-sXz6Sc=": "966294000000", + "sD_-Eue8RyqnXmIzu4XuLGjMIsHuPsTYAuxIXxOpYlc=": "506181000000", + "sDu3DYr7eZaa4er4We3xUiS3Be6-8IeaEZio4aXtwRA=": "1365145000000", + "sEeclrmLaaA51Ga5ZPxtmXyIuUg60HeN0ukPiHCsF_g=": "2499999000000", + "sEsnOuRrNx_duJRRzHMEEx9GL6GU4FMRblAiR6rMUU0=": "1249999000000", + "sFFFuUbc36osVdhugKesCHivwgWCti72sDVYiw58-As=": "1916510000000", + "sFKwUo6Q9gnXugUi9ePKWZ95KlxfV4633jd4vH2wOxE=": "385507000000", + "sFc5rqO07gnhgbffolvUyBA9l3XKoPICAl1Snz9Y0PA=": "463156000000", + "sG-ceg0f8lMVYiNV2csKhVmdHUoaPDyR11hViaK76d8=": "845123000000", + "sGWtCmxuO6E9jGQR_9tXMfPab017qu55ynyPJkIpbrg=": "1230219000000", + "sGjjfYvLhNCw0AgmqfIV4YVu7FKiZ-oPOS7zlISTTVw=": "3380298000000", + "sHICjWrF38w_gax0fYdmxyslhHFqcHCulM5CLY58K2U=": "384615000000", + "sHYvFaJfm-hJmzrNC23DssIFXE_zYXybUl2U3sydwqA=": "411085000000", + "sI7tOv1FrMXxLe7IFr7SDDWgvmi2cozxqrV7WntfxkI=": "454566000000", + "sICY1rwf2kzlZsS4jaU90fGhdbXebfvxFrwxoLjJSKY=": "1969135000000", + "sIFY6tcrmEfv9jEmHgpcx-6pZzYdg_VoXnCxY0aWw5U=": "1888319000000", + "sIREmPRjBjzFbWyXEZEA7qthe-OZKi01s_TxiYWH2AI=": "384615000000", + "sIgiCY6uS3uw7ct2wDULShvAgL-KU3CR5BeVP957SeY=": "4644913000000", + "sJZvRJPClHaqVPbHONbWwukzdJ4oKUXrz_zrS24mRLs=": "454545000000", + "sJkaI6HmivYdmwKMG5mQSsFNrEfJuZRYhDH0qrjXOlE=": "8930873000000", + "sJlOSuJQ0ZuZ_q846CBkJUflpP5F5lg2psO9FOISr1E=": "1835405000000", + "sJwotMi2yx0uBpD4F49FhiyParvf6JPXNnThlbo206M=": "2307692000000", + "sK4h-qaPEU5uhh9VGtWNk_0agyeSpKXB4so87whpBb8=": "384615000000", + "sK8cANImf7cE4KA1A4mrFSGiKsbaQ59vO8JAbyd9Y4o=": "20001042000000", + "sKcm6tDvCODpi51CbmAdT_2VnXBklOxkq6rPwULvKzg=": "384615000000", + "sKgHDFMtjneyVdzk0p5Oa9IfbbrmPAfpl9lDq1rrJkQ=": "456266000000", + "sLHTwI-NTeFWVSqanVjVZci_gFwEVR8CYciZBHT2NJQ=": "492802000000", + "sLJjKkB_W6AdRtyO3hFkLhUUA7cccO0Hdgs4gN67omI=": "7000421000000", + "sM5dqo8Qmc1V5FmyrfOcFMWgSxtneg--KVsrbhbEQs8=": "412635000000", + "sMdXcIBi4xdcrvnNj0Wol59qawOUES9CFr44ntpMFow=": "385507000000", + "sMyghyVHIBt_9fQv18CehPrsL83vLqd7mQU04b5bvHg=": "1513770000000", + "sN1q_N9-_ARMD4ifM2khdYB-nHrmi3aWFP_8JGqYnro=": "1666695000000", + "sN_72NnJ8eCuEJrDCXbAbUSWwoa4nVmSh-cODB-LxZU=": "8333333000000", + "sNzQ_LxmRMWEEXJCknRKdUOYgcljThjmI6oXWiHJSEw=": "384615000000", + "sO3olhUNKsugvQkTU_oYBnIiPSwMCeoQFjMVp5Zrj0E=": "1896014000000", + "sOA96cRAoNbapYZ1R-HCdxkGbju3GE5jl0KPOz322Gk=": "481965000000", + "sOFcxGzKuhncvCSu2nQoUsRCkbEjAoGLoIER5UZKgLk=": "8333333000000", + "sOK4nfVriZQIOIq5p8vMA27UimuDPTdr2nVBmsyZLws=": "416666000000", + "sOQGIvCGDRYlM6U1XsCWpindkXEW8a_ZycHK9wq8kMc=": "381632000000", + "sOj1mn6jabEQOb9yV49XBa-eXFETncIE2Hb8IoK8hDQ=": "416666000000", + "sOr2DTQmAMbRNVRtioeObVaQJA7N3P1uzGjHsbKaMEE=": "975129000000", + "sOsQI8Y4-MwihAH8J92f-XWWj4To3EoXz26OMKVQ9AM=": "840116000000", + "sP3RFNDQtrpz0RA3AKKop4ZyAozIsYK_VINiqJwYFDo=": "1261419000000", + "sPWemmRjgsurnfHTNthsy3fCVim0PY10Ihg_Semxv_8=": "769230000000", + "sPZvVyI5wjLuobKkve9BKmcbM3ocB9SY0GBbwSPhahE=": "385602000000", + "sPnhRUIp-LzDAf7ZugXESIJy9rfJSCwSZhRYon4QW3M=": "416833000000", + "sQ2d15BmBU2P97JOFsqhsc8Hi4T7a2V1UI3XVLKfAw0=": "380862000000", + "sQ8Ab5TDBtorohFY6mU8OfZB_FNJHrW3m8TFSGK0-ZU=": "378755000000", + "sQMrmYUzTjgHTASpaDpG38IkJaZI38IZZ1wvNhoKY0U=": "2681980000000", + "sRI1oXejH-xCx3CTf7KshE5w182NaeaPwHfnOoJNN-w=": "1999999000000", + "sRJuYKzWHsn2PHysJQya3nnbdablfrWcrNp4YoWbRuI=": "4642118000000", + "sRPN7oF8BWlN8VYtsVwdvgxEyuztmNb0LcEO8PTuES0=": "4165243000000", + "sRlAqOFbhC2g2xna8kCQHkbYuCTtFL2xrjn31vQfyd4=": "769230000000", + "sRm1AdrkoxvP3vIJGzPTeQvWtESaT8RmL6t0Nyttzoc=": "552876000000", + "sRtMqylT_PJn-OS3H3dAMvny0Fv3liBejV5p3QIw2v0=": "385449000000", + "sS2cnfkaxMaldNT-fZPrUhyUDF9l4WyswZ0q_l3frG8=": "454545000000", + "sS7c9_lkNLp9VcDqeLdiZBrdn7os6YMsONovv6K20bU=": "1927547000000", + "sSGeYHYf_xNJ3RfkQDrvYcAuLxXH88nfBK2ldU9oBEQ=": "384897000000", + "sSiC9GntOOltzg0-QL_nu0NWHotsujPIpL_KQITF-3M=": "1350098000000", + "sSwuQRtpytR_a44hcV3Obp3um15TzcWJS4wNShDH1Ks=": "780319000000", + "sTS7iLcwYFe5-u6-JcBDAgieqFace8gr-uXwKNjEkLM=": "1153846000000", + "sTniNkQlM72NuXc2tYQU5yhApccW2ymfrTMQ6X18Jlg=": "417634000000", + "sTq_fbHatHEwNO555FTOXt3D3rZUAY_dYqGbqCPE8VI=": "14352168000000", + "sUWRIU6auFTBT8yG4Z23JDDO_F9lHBiIxSXuua565uM=": "384615000000", + "sUak-5WYj9NfP_LdqmgKJVVFzze-zgkQCq203fZxYC4=": "1902052000000", + "sUoo80obs8yRowUt5nDkoM-Cx-ANFhn1-N7M7vblOIs=": "763268000000", + "sUuVZNCEPIwP09YCu95ElHGU3Hc_uPxV130kTymVcOg=": "384615000000", + "sVXP2kGu5JRK9AoZsjfNxeF-JKjd0vqWl9KpQNm-3r4=": "386320000000", + "sVvDBz5pWwyI4xXWhfhsAC59s97UWLx6w2he2PLeR9Q=": "7692307000000", + "sWCJ1Wt76nO_5wQThCdv3m3Es5KIOY2KdyTyFiLT9vc=": "501413000000", + "sWCThyIHjWIOLX_4QY99VYeNI29obSmUIxyz93UT4d0=": "462472000000", + "sWMZIqWNx67zlr0ZIM94L2K_OvUUmRmp6LfFFUMRCJE=": "385507000000", + "sXZOp0uHXs3jhHTEamwCIYXoyBOxdiCVn-mW7NtZE4Y=": "378037000000", + "sXq-iHDLPwwq-smBkb1HQYlQa8tzBkZjRQGuo6jUfSs=": "770133000000", + "sYMNrCJPwT0DHE1WThaS8LOgkkY885QFBgWRT8Jm5qA=": "385352000000", + "sYVkE3gwj6R-BvpeyKftpHbxdeSNGcVFDtDLqJGNeqI=": "538466000000", + "sYlpa-dpgEGtPWF8fN1GYtFu1RB4vWPGSGPHY4eWHaQ=": "1999999000000", + "sZ5WdfkUX4rR-OwMZwCQsgaGs2cofU2reAW8eLaodpk=": "473001000000", + "sZYRhL1X_DhN_kaCG-7ekjb6R_8YUg9HuEjAvYpQJqw=": "1409664000000", + "sZkgMid1_1Vw91VJlGdsNdLBmQoASZ8WNdsceFqw42U=": "441769000000", + "s_JV7tdN9CS91uvyIZ6S6WvBKUFtHT02ibJWQklVHwY=": "1945234000000", + "s_eyaqwTpy7U6bjnY1X4thokqXvSyOZR8RIo74c7uZ4=": "769230000000", + "saFqX5JPQgqBxjStIsoXYhICOkyX01CgIyHYlxRZoNE=": "446505000000", + "saYvG6IonKPNbhctHfEjApBZvD-5ci-2z7PoR4GHxT4=": "415177000000", + "saa-MqiRLQDZ44rQPqTjBibWtu7klXmgGV230ppERbc=": "838464000000", + "sbOYcIWm2HpvYD0Gam1R5mM9kvcYgXbWrfYsBvlhIUE=": "2552557000000", + "sb_T-cb3V7D6mli-Z4ZrVyUIraCYiD9bnXa6uSRmcNQ=": "1265782000000", + "sbm68Ob7_hV9ffzh9kGOYcG_IDRJWi2DiPUjIHPRxBE=": "1255127000000", + "sc2EF1PmA-JpBHD9cAzPl19Fyo3bHxTBZlqYF8VZji8=": "5642445000000", + "sckTMjt9yHjL2Mv56hysQ1LdKbfZV3vsULlaV_CUP48=": "1075604000000", + "sd7aa7vD9lPbAKksLmUzVqKIv6IYtHb8xks_wFtzQE4=": "1091616000000", + "sdJEXW-dWXJJXOLhQKlvXx9gOnEp1BlGkcU_INrxwoA=": "364677000000", + "sdN0stq2uoIjRRB0m2zktTzGi48XR_-n8TrjHT2rIpI=": "456871000000", + "sdV79VMW8Sf7p6D7IwB3r2-kSUiJyhIVwJ41V8baQ-g=": "379658000000", + "sdl1TECCdXjp1Uo0uSdzR7ZKRTVzqwnM44Ct59ErWg8=": "385510000000", + "seUPrBMo_6RdNSo9rUHlk65WmbNK3pIwZIjspF8VyYI=": "384917000000", + "seuSJOEhbk1A5Dco2479hBiCh3tk5McFgahzBoIKwls=": "3535329000000", + "sf04SwcGsMUs_FMBjZHrq9EBq1yA2qbRFQQjs7dCRk0=": "933373000000", + "sf46_647e5I9IXMB8-TvlMxCqKgihtojL5Jufz-QmfQ=": "384615000000", + "sfCEf6PrgRle3T1HCeVevt0mgRcxD6qAjvS1uY2_n6o=": "8278633000000", + "sgRaie0wKDIwJhjVUwf9xzOI7fwwDqKuGx0K7S54OdA=": "384615000000", + "sgpwqQLOvEQO96BAwxSlreKTSW4otadTIVKTJ4_5qmg=": "1896623000000", + "shIevgNhqx9fo-ssUhOP6tm8-aAXtILbhX7IsyaPJjk=": "385506000000", + "shRMGSnSADKG-UZINCJ8m8cGm0qhPvhENwtJBj-eDLc=": "1272807000000", + "sh_EPuP4ta4CKI3sLpSWjaqJmL5YJXr2_Pl8SmNhUQw=": "5769230000000", + "shi7t0UIFZoEE7PRQ1hjLRm0VIi_W6gSGXksZ5ENo7E=": "1441965000000", + "shoKUUaPDJtqZhUey4h0qUyvqAmf4o5ccI9ksNEnhvo=": "18759196000000", + "shoe3-GisevS_ie8qCa4eoALVZKxDWue1QB85LP_tiY=": "948076000000", + "siNCYKoq5-T9ZD9O01cnwX-Z7TMH4xzq_nlTQyyNeYo=": "458773000000", + "siQDWUVxNxfgsY8uEM60jxHfbKc5AwqwI2w7yGmkD7c=": "770833000000", + "si_JL5ozoS0o3LYqbHh_YUjBTOAr1TINHn73iUTuSao=": "4974180000000", + "sigZsNMIxqXMcLPbhP8iSDzL7ofh00cGErXOxFSOb-E=": "381902000000", + "sjA2fYlFlUAis8FZAVY9tZ0JF1OQqgTr8P7iDkZ6KWM=": "411085000000", + "sjS77dmceaVx4ANVx_cTr3hPHIXLQ1aO9ZwznGnCo_Y=": "418507000000", + "sjgN8nWXO9PT26a5_y7NFXsNXg5FufyHcSwnYwbAuP0=": "395499000000", + "skXjaLCvymoz6NwioAlSgaBGaPpcQVcgXF_7ltlYDoM=": "412985000000", + "skd9HAVw7xV9FkXBB67GdoaYK56sXbX2MfGb0eNI6CA=": "384603000000", + "skkvw77_vacNfkv_G1FY2NaNxYX2YgnyF3DHn1t2dcI=": "899685000000", + "slJqDtgbcSmE-SdAu2tvHAtAEPiuYPql0E3iVjKhGFU=": "754827000000", + "slZt6pj88TrBM94t5JTx5Lik6HKByRnGv2csq6QEc6A=": "481721000000", + "slg_ky52bQTgRn5En-YZaShG-TQpyCxKs57nnbLjgq0=": "756920000000", + "slstSBCAJQU5TLooV8MCkLbiMm_CVVSc1ocU64R005E=": "14226081000000", + "sm2t-DQAIz8blh3v1NTWSsjOE8hK2ZS5G_nIOtPzhto=": "378561000000", + "sn3x8uwSYwVC2PaaJYkYo_tLFcwSfWSrW1lNai_9AOM=": "384615000000", + "snd4KH9_zlPCNE8P_WGdHGpoOl6c4JfrnutzK_Dh02A=": "1215564000000", + "sneKJOCsAFh0gX_CO6w0OEt6UVOGxeqSYNIon0VTqPI=": "769230000000", + "soGmT4wocpf9XsCiDVNhNjuSF1miT6LnsN811x2BUg4=": "19230769000000", + "soRmWwU-MncrzxWwMhgWEPPRmH7XxcrWl_d2Y_LPOzw=": "458399000000", + "soXhQZKqdAY5aMCyz7xPXKPY9H3H-9TtrB6AuVIAhfc=": "777978000000", + "sp5fc--hCA6F74IDEYO34sAeQ1aTL2_ATF-UBhk7cCM=": "385509000000", + "spY701tzSvgruElAY_ZHXarmHoYZNe5-kk0SmhrUMbw=": "7907134000000", + "spuQANiLqs-n_a4omLUtPayozo3LqWJFiancF6lmcEk=": "411085000000", + "sqCEhkKIwHeqGIKyT2cH8LGuO7cFj-KSKrKDlVuYRKw=": "1563266000000", + "sqOeY3saoFhJt205dImisxX_Pka0qNBeMI6ZSvB6BKw=": "2730743000000", + "sqYzyOnT76RKUOcpcZqPiR5L7ebvpSM86txEilwdUmI=": "1820233000000", + "sr-32NyMg8LJQHu7UQpUtcfUYk6CXMCHHuMQ1b7dzfk=": "1254201000000", + "srL1KSkjc8-5ousiQzKlASx9YXRvl-2AWYYWWmUrQnc=": "384615000000", + "srVPl8i6vWhkTpTADMr6PTkqBzG3q2uB1v7qYWHMzhI=": "4616309000000", + "sreXp0J0c6vH9pu1H5ZqRTq3NKCotMF38HT1A4n2NIQ=": "384615000000", + "srjiSK7qJGywOP7cwiUZHckcSKoQm6w-Y1Z3gwDoCOE=": "384615000000", + "ss-aKryx5pMdASSHvaAmvDScC8hDrgMy-09GD-e7pvo=": "379344000000", + "ssVTmz5fW1mxILcVKDbgO8MyrdnbmzQSD4u9Z6ARinc=": "816665000000", + "ssjGFmezuNZs0zuYH8C2uC-NkBm3bRg38I7vzUv9qB8=": "1927528000000", + "ssqrCdf_XttWDBL6QOFB0TtxJTlfhZ-S45YgiOIAzLs=": "842738000000", + "st9J8hOUQaoyx3KLN8RBz5KGaerc2E1FCFnykcb569E=": "385506000000", + "stDzhcvGKZ7DxPszaTN_a4QXbzFs_nNq2Ir2bT6GJ-8=": "492798000000", + "stHZDZAVthGMphyj3bOv4vVnqbzZdBlHDv5ky5BGOVA=": "498155000000", + "stNp-5XYif_DToy6mCxdFMPZ12NDhukgGFPrqC6lKIY=": "476807000000", + "stRTjpLdJOkUmcpYMzKQ-IpY_7SUXhatKL1qbO_btaI=": "384316000000", + "suDTEY5KhRZy1i7pqSmFR3_HOGlp1eQ8ALPgqlb3ihg=": "2460380000000", + "suMw2EYLeR0Bv1bX7c29t3GJ5-kbmrYXyT58jM1Kzmk=": "387132000000", + "suNrCvTTG_AfHE-PztJbrehrNuTvIfo8V4yPN5mdWW4=": "384615000000", + "sumabiRyY2jP_5C94j7ovAzJds99tRs9hZCByAvMIic=": "1078535000000", + "susSnA_b6ehlCxYJFr2oB_IZ7xkZ49DYpLVI6bUeHEM=": "1538461000000", + "sv1Ud9Hb57SgU4DoKilAmXSAxqarofRoKOTxk6l50N0=": "3570765000000", + "svEYcpNMXLUgom5-jv8z3u5yPE36Q9i2vEKkSw1E2Is=": "1371823000000", + "svJADPc16w3kA_QbpBOKrI4-1Mqx71Bgj1uPmwKC9HE=": "805513000000", + "svMdviTXJOsMPWISEisqasYZfBEjSxWg-RpXtjvIohI=": "754692000000", + "svfgdD4M5HJBoQ52tyuruNpZxXt_T1zcmrpBRXzBAfU=": "416372000000", + "swxRpqUN8muOZttYbToY0FiNjI8p4jhED5X3zUoaVKc=": "407808000000", + "sx7a9Xi1P_1ZWc81go_gD5QtR0nnCW9TUvV8NRDIDjs=": "384615000000", + "sxHWbUnxk_ibGSOEXryN1nJBjcfpJsr-Kr8SAdWmSXc=": "1156517000000", + "sxYiq2e_85tI0tkPp_cYJFk7NsCYIwub51qRx0WjgMo=": "4621453000000", + "sxf-owQnLGJOcoIZD9Gsn8bKpwm_nsyg26rV4nccxXg=": "384615000000", + "sxvpTQlit2TE9kuuwV-62KOJ6S09LYm0UHJKP3VFsYY=": "414989000000", + "sy7spEdbL1prZmBAhYvGwKnkylmGXHGcgBQEDb6vl2E=": "954279000000", + "syO2JoAwsRMK5mJPirt6U1dvcDuR6OPZsZNMS8hmuik=": "1173076000000", + "syWOvDseYNAfb2AUMq-OrKEtdSbEPjrNhe1XyBwdpIc=": "20656748000000", + "sz5AEZPNTXkaPkcjjaFdkXWKoknTHWt9jxgZ-hkiFkY=": "1295513000000", + "t-2Fo-qJq7ruhFu27X2UQ3WQFtuzdqB0mxm5PNpNhRY=": "416821000000", + "t-3F-8Y1M-kMFdt8Nn7EaOwdpC8ufDazxV8imu0vmyY=": "549999000000", + "t-Rh_TECfmPLwukxiMpJtNvHn78cBFVjowGGi-YpLg4=": "384615000000", + "t-V5VLNruig54nzqwnBwJidOThKnFny5DqftChi2ex0=": "448709000000", + "t-bGrV_CLjuiCZuDz7Cc1qXFEC67uI2kBRZXhqyNcLk=": "4166666000000", + "t-kccfbIHM1gWttIwm0_S2W0lh4lodQoL319EC_rl3g=": "2429760000000", + "t-tVLoW5dmUR-oS3AiyHhvy0NtBNK6Y9IpNv2pk4vBo=": "1666666000000", + "t02IZwqFGrKfF6kb5B_GOAiDvs9gaT4T6Bq7tf5OKdM=": "1155808000000", + "t02iGrrePJl3D6gIuHyYd42QiJE6O53CeEC5ZQa23eA=": "384615000000", + "t0AtjUMNkYyqUdDYnr8r1DYEegMtcpT7ZPDNCdnCiqw=": "580031000000", + "t0JSg3iRNxfEJbMptmcmSWB2ytbvpEKRIObjDsi_Lp8=": "385506000000", + "t0JhhX34QoRyJ0PQmsGhmhrRTRfU0boYVAGG7x8qefs=": "4706045000000", + "t1N_HdrGlJ--mUrmeQflIruyQ3TMLN0mF1OkDQkl7kM=": "2065023000000", + "t1peh3lCuXBBmeUKkoU80959JX2TUW1KwdpUyNLsfKM=": "2055429000000", + "t1wZIu7HvpuVO_6A2LnR7oAyeZNZjsgjER_4JZLJLQU=": "476900000000", + "t2Bj9x2ZP-z1NDHM7s6kOCXNubi8YaWXqdV9KX6n9LI=": "1326989000000", + "t2RzoMvBeb88uYnyqhf-oR1L5Abx49paMBQkauUrX7A=": "769220000000", + "t2bLWS1_6nqTrP2EmvNYbrlVDLKF4LQ2FuhDe5pfE80=": "454809000000", + "t2dITZgx4xRC0r6ZDuwQMI_1uvJuaEkcxOubTqfAtsw=": "2019163000000", + "t33YPmTYGZDkR-Pt2H_XHQ1DQulPuuMyflLnpoJ-iCg=": "1170401000000", + "t3UQ8LExF7NiFSVjT6Uek-_8yxg7s9EwwE5fCGp33q4=": "487145000000", + "t3XRQr2I6MRgcbppmo4fJHhXjMNUy3aYm8A1cWSJf_o=": "459927000000", + "t3sUu72PM_GiRVC7m6LGti15lGiTtqHF39nyIo9gXFM=": "412986000000", + "t43ZNT9G1BE9KZWiXGCVMNsgc6evm-xUWVcS7S0TA9M=": "422561000000", + "t49Imw5NET4Lo6TX4_5SOlIwUgpWijsZ5U0lS3qxJc4=": "760905000000", + "t4KEMb7fYiy9zIRGNla-qp5UmSbCnYKZ9sU0EIK99dQ=": "407808000000", + "t4iVptLIidRSAXusq3uXe8aGdJTiMfkqPMbmEIzZO8k=": "380342000000", + "t4y6kF-_bl8br5KfCF8J1Q6KS9lbTe6C8wDInUDbhTU=": "1539919000000", + "t59uS1fzDh3lO13mxUDb4XZdLFrD0ifGst3-ikhG9no=": "449342000000", + "t5dTuiU-bPXnVJYayUKMplspreD45NUlKOiUOtnW-BI=": "385505000000", + "t67H4PboWn2ClTLE_w9fxjGo_HSCKRay8nWJ25SHafM=": "833333000000", + "t6c2u05U3cMDTk_qe1xHpjexjsdDLllszR8CtuPKRts=": "447655000000", + "t6psLZ6quv_e6pOE-mRmGbxJR8P7YYZ4goFPpfzRMgA=": "382410000000", + "t8IlJ5YGRQf_L1SIQhqnXzsmnHhRSbv6PMwCU2y05SM=": "694498000000", + "t8kt7MGgSN8pXalXcrpXtFpwK0BJzeybags3ieIwnCk=": "448054000000", + "t9Be65DXNZsg0K7GSZFLPIyLbdjuR-wAZiwIkxj7ESI=": "389898000000", + "t9C3HK1G8idq7tq24uNzzQWePnQRgZN4c8xrxl4VxSY=": "4279139000000", + "t9DL6x4QVR6fwLWTqTGlWXbpgk5xzqCacXR5O0ahyIo=": "483147000000", + "t9I29EvRDVi0KQxk9aubm7AUtr_jAnqutLzuL5yC0HI=": "753807000000", + "t9QGYKbwY10Il2ujvaquEl3FE4z6pwKF1ny5w2X-fW8=": "405197000000", + "t9SyOnSnd9QHtw-oj3H701hLpVCps5CPCuZ8AsV7nws=": "384620000000", + "t9cqAAc1ovhrVoTUQoHHr8fBbhE1vdBXbQJeEyrqg4I=": "5000004000000", + "t9laqBZ0MczhAmS_q70Pczkn5LdApFwOWUGuT-wjpuw=": "3756941000000", + "tA-YzExiQFmjEZ8y3jufd9Y0igWBKe83CkHHWaq319g=": "1407087000000", + "tAOxMDwXPafl4ziiPIEQkORXB_Ou7ADkr8PrZAwShTo=": "1596707000000", + "tAXcadh1GceAfpH1uQpdQWFouGzhcQtX7J0XI-bgLpA=": "3830209000000", + "tAbJbuuEixH1rdjbu_XcnZtyGFbHFTmDEk4aHAcKyFc=": "769230000000", + "tAz2rQCNYufObZFhtR0IDDBH_6ulyg940TqBz8_Exzk=": "385509000000", + "tB4SdfQeCKEiKqpY_yAVdoAjzR10s6UkG2yd_oQtbp4=": "2080352000000", + "tBMKtclnpNtDvZ9aQFaYRWdvDtEbAVRK7nO10vzYnzY=": "1813007000000", + "tBNUdtI6GVKroRDDieTLSbI96jXQWQjmV5ANGPiSz9c=": "3153846000000", + "tBeadB2nA5nvZdYdHfNHQWRd17t9gsRa5LshOteYExI=": "460674000000", + "tBpd0NhJmLvv1Wm_v_wTuUIJVAeR0twPrQNR_CatDuw=": "3434710000000", + "tCH8EGjDZ-1jvU-0I-ZlFUBw54o_VTLSR75TSy0M3X4=": "838319000000", + "tCz66PousVV4VwNqH0hXIDXvC1T3YfOWQQuNLKZJidk=": "411085000000", + "tDEjWCR4AOvX9vIDVlOH-Ndk_CjphDN4CEBYvSxSggI=": "3755832000000", + "tDtgFGT7ukzgeiNlfhqXWYp1PByanrxLGIuJ55mpmj4=": "2083333000000", + "tE4knI-5Wmrs1YlumgR0czdRk3lZsncDjBKdWkv5HuU=": "2972578000000", + "tEFx2x5i66--pQmXW9SDTqtI1oFf8Xpd4qIUJA71fVE=": "600093000000", + "tETabr5D2o2drl4EbtjV6tk2EjupQhqKlBDzEVqBiy8=": "453157000000", + "tEqpvPCJD-4B9cLaUoeiJ6DTA2xdRaWtT_Dzn4uT6hY=": "769657000000", + "tEsGt9cLk74YHcYvfRXT61rhLNKYrIwKri-6q_RfTm4=": "393443000000", + "tF2nekmpYiz0jBx65sUmnjPNVKB1KOUpe2HmJyeebok=": "384615000000", + "tFDA8q8gPyj14Kk7MR1c6j15_Hc7-8tPHEs8ykziC7s=": "423076000000", + "tFO5TbgWSWLs_fRX0VLcaSfq-20yipVTMg8OYuai4xU=": "1033428000000", + "tFcLRoXabFei9mQDT74971CCRxChsKzRnHqttP7ow7M=": "1588569000000", + "tFrqv1w4BSQ4v41dznUyWZhr-hafEk9EYJyu0v_q7Sg=": "837715000000", + "tFsAD4KloOshR1yUHHH59o16tPqyZ-zCsJbvXMJKn5E=": "765331000000", + "tFsVZCYg5mhjnTlyCMpHbdLAAt12HvdeDOMMwPQIxkE=": "384615000000", + "tGBqCuBElR_aNq1xADnLLDQB2CVIG8KSv6zoEfRBeRM=": "1731970000000", + "tGHBOxfh3OXWD9QwnPy-uK_VdK3UcyIoZ76n4MlbO7o=": "400541000000", + "tH1fWmRn5rEjB0bm-B3VXVvetl6Xd2x4T0Lszk6hxfE=": "494865000000", + "tH8-fxMFNyaJE8Wm0CwQMIZGBoT-u-xK79bkEjiiRoQ=": "3855108000000", + "tHaNFWS07fkczltBwbQqoNJFFNMUVTR7sp5Hu2Chf1M=": "420807000000", + "tHpYSsGWAWWglSQkxbCC60Msn6CaZe-23qAK89B6Y8o=": "4166666000000", + "tI7vYFIO1VZAPKIkZLytzctizas4NMu6gMDu3vD6NG0=": "816256000000", + "tI8w_IOO6i-oQcPNkYXnA-p2ED6vQvSPL-oX3dnGNgU=": "1923474000000", + "tIFLz0ialFlHUOuFxRwIzKf4QwVTxp8_EwGMOo0rkVA=": "625107000000", + "tIYOEO8Z8zRku93fDQvKl0wkyL_P7m4WyKisi-Kqz9k=": "456531000000", + "tIzbpbGifnFlY3K7XgQTSS8c3zHmNd-5yFIgH9yNmSA=": "1156517000000", + "tJQtS06uzfG-j6V55ima18Oi2iPlNtm4OcW6KIshIOY=": "464564000000", + "tJUhIbatDjM6NnAZm7xIR7rUt3VoZusHkn753bs0Chc=": "384615000000", + "tJW27xDNwCHn9W9SFF3gd6E_JqmJcPB_WIYiHWyP-cg=": "384615000000", + "tJ_s69rwh1vk6UMFW8MwftUd3kw9xE2v2M6E-X_NSt8=": "465122000000", + "tJd-XTeSZHwwttJbhmNvPizsiVR1LUOAPyuMbOs8-lo=": "16340487000000", + "tJgxKg3Fw3m7-i4YM3SffA6uHwKO2bwnserKo4_h3wg=": "834320000000", + "tJwo7bKcTD0C3LI_vp56OvmerGQnQMBZkgS6HgiU0Y4=": "458982000000", + "tKZFcBDzV6Qxqy-cEzv_fDHBQ00w_0_k2Q14FnB3FRA=": "504026000000", + "tKhq295QIIjYBd9VSGnpLBs3D7HadpFGBU0FxupUOTk=": "919762000000", + "tKiX4AEIaT-gtWDCWK47euPIxkIplo13rsSCT0Auo4k=": "459121000000", + "tKqPOUuynQJqO5ClivwnJO9UmnIfbvqA-K76NBHsUT4=": "384615000000", + "tLSFxJzR8jxaScWQe_WZnNYmBv8YIfBufGRRAGy8FvU=": "384615000000", + "tLgNjo525GQ2ex_ZKm6pUow77a9aW86adNUBCEpDxx4=": "1923076000000", + "tM8MJi6paTZ6caXCXK8P2ZCRWNCxAaESAjINZSqobXs=": "1280769000000", + "tME0oQ_6UnnQJlW9Pz71i-ZQisSa6jLt8XX1DUbLqIM=": "1670225000000", + "tMQyyQjw4Uw5oY5OemCRIl1nJCKQqBBZC8ucCCHvGTk=": "478846000000", + "tMW-Qv9T8reMV4m_yuOj4DxgDIMSb-ZJVhFbDN4rQz4=": "5015511000000", + "tMyTMiMPd_bH6e1i1XV4AgoedNi9JlFsEWwEgKbJbg0=": "454545000000", + "tO9t-JhYAswtaXgsKe_AnNga2tBxjV8jIj7VMHzeKLc=": "452447000000", + "tOKXqNvTtE25LiWgRiyuXF8R_3x6AOCggzof7d0xpqs=": "769230000000", + "tP2tUkiBCs_gI-Nc_IVOc6O9-vsstWwU0BXRcK-5a5E=": "1154373000000", + "tPQcjeqUhXSmQPxmlCC2ubrWdyAnL3BRbk1Wh-hY5T8=": "1153846000000", + "tPm2nLGI0C_kNblxb-qHBv9OU79kcP59btIHYNlZZK0=": "417633000000", + "tPnc70cI5lKsChcZahjzbtifhHlATpBUhbBywAgTdi4=": "384685000000", + "tPndxc0omEnwdmEqpo20kC4q6FdCXwAEd_FetKzM2tI=": "384615000000", + "tQGV13Cl_I4DvjYCLXB2ChAxgmxOHTu2TSDTcHAUn-U=": "545454000000", + "tQMbyS32YgAhwvQ9wfpionGFD4OJGP2AsaOKoyxaqU8=": "751149000000", + "tQ_f77c1CKjto59lA4YycGO9DhaoJsckwIPRw5Phkys=": "1923720000000", + "tRH83t74zPZUEbXMZw7vxhcJyn2j6OMbc0EKuCgc-TQ=": "455600000000", + "tRINHaqjV1c2eT6yta9y8W8yCNKkIin0LJNNC4Di3hg=": "462834000000", + "tRZlHKPzWgfu5SAtZZioNfykUdfokiKp8FEaYJdCtj8=": "763268000000", + "tRf28vRqtKHPj0E3CCGnM-C7QoFpScS-kWfGRX3bx58=": "389707000000", + "tRjz9BH6G_OWeNJUaOVS9p8GURbXCpZSIlvV4E5UR18=": "384581000000", + "tS00om-RXpKTU3fUDeKlk4lrOUJB1IWMS76jI1ye6vw=": "4176307000000", + "tS3YMkw69_YFBxB8AEnCi553bna_pngOLNXnt9cTduQ=": "1610036000000", + "tSDbW34jqQG-28nQDqKIkGrDplSRhaUMSVr8SbOa3SU=": "461346000000", + "tSRzYNwngaODGQvjjdHwXbGCIuYVBvJvdv_MpdTaqLw=": "1927537000000", + "tSom1-7hCksICUYztzd4CW1FhdpRCxTAQVGIyB0Vdlc=": "393570000000", + "tT4FPOXyLkdWUwXrZ75CXpKIkYy5FEoiv2zOmNilir4=": "3286540000000", + "tTHll4vF6k_eczXGmwkj6WqZRCP2G15PZVPVI4omnks=": "565868000000", + "tTcrSmOo_C89lpuxZeljLRIDylMfRzDWS-9Un0B1lSk=": "2083113000000", + "tTrpv-8iwNbnpCAh6gxOrO05vNmCDCHMnLVSGTWCpdw=": "3855091000000", + "tU2A-74kJZg62_8bSRtQk__dJSkqWo2u_TgQrcLSJ9I=": "384615000000", + "tU3D6oETUCAHBW3EgqL_Vz-4g_2Zbcm-ekaPxPANWZc=": "1928334000000", + "tUj3gVBNk7Ts_5_Fdf2l6DAu97X4Ek4ZyWJyhbTkBkY=": "416666000000", + "tUjnt1mkXktX2L6plbvpDS-tY-LsHkaBNh8a7_GgVjA=": "780415000000", + "tUqVDN9slVI9WWj1bFkPCrgAJxUMuK9cLe_qchBO8xs=": "457772000000", + "tVEpbAqHxeameorP6AfvQVixPIpj7t6lmG9WMBHFXh4=": "1979159000000", + "tVNYvyz7vFdQ_dHxXRiGcTqjNo5nXt06J6A6S1uFLGs=": "474410000000", + "tVR7v42z6RQ5KheD0uKeTw1tj_Ju_BCIIbWLedLjeQA=": "6369354000000", + "tVzS8DC0yRpTKFc4LPxzFVWh3tvBaY39v3v60iXHvQ8=": "650269000000", + "tW1SZ5hQGqVRkT_j-YALBYVGhg0EhTs166dxOlasGnY=": "1999999000000", + "tW3Kkyw6h-SlVoE6_ykDjHpCsyt5CZSYouTIWPMTebU=": "774224000000", + "tXjjYMfct1NrOESrUXs9JfQObjjB8ztcDTXW2xw5Kbo=": "839813000000", + "tYLjem6Mpptgvdw6aVjTSU8qaqcOuww6ziDz2T6USnQ=": "394270000000", + "tYm5XjzUJzP59nC34D9Eok4b157ogjrNsNAvjO29OwI=": "384615000000", + "tYwZt3wxlWbv436ipTvWmgoeaahvwHeTaLt5eJUGKug=": "753018000000", + "tZCsgiMBB6-hG3GT9Raa-eav1GJ7quF74UQ-qiIbjJw=": "384987000000", + "tZGPYARAhEPG3eq414ax3b8uDkg-8XisF8-wZN2GhKk=": "3269230000000", + "tZe4m8byNwoxiJj80SF1pWRhiiBl6kwN1I7RthLzB78=": "421597000000", + "t_2nvCJTLN16m_WkjPLnzcwtH1qlC46hBKS3jHrfhns=": "961538000000", + "t_GU_tmzeN2fMKNikL-lge3i6N0nyZg0W02U9JTN5JI=": "1152721000000", + "t_SD577sSQTkgeLWbmKipzU7THUJfEYAuDsQ68r8ge0=": "411085000000", + "t_oxw78KdH3qxCIYhx0TSsVHR3xJjuEUv2yjp2mV-sY=": "411085000000", + "t_tCUCvUgxTBkgKcByAnOvaQLG_UcJLeHRxCwOi0_XI=": "1934863000000", + "ta9D_Wo6AaRzqFyEp_ybI9KRw60VBVq1-kaCAojPp-o=": "3269230000000", + "tar7xdNC8GbyvqegJ-yAZ5wfNW_DKl-2Dd255Hld-Kk=": "3147817000000", + "tb200HdDFbKCJKUc1AUkoi1T08G2EMBJOzxY81XaGWI=": "458877000000", + "tbJRgXFBrzOWLHjkh8CccUyAQYFMa2D3JEn1cUBmXoU=": "1879350000000", + "tbSigNcvM0wwa7Ha74l-ygfipI5Kx3_wBg2XIxnxSQ0=": "769301000000", + "tbZPLkm57GIHxFAM5KA-QwCXf1US8wLmjcP-JUd0sK0=": "1156522000000", + "tc8wJvM24qkJoZTp2G3O9GvsgiS16lj6lJ1kUHdDVvE=": "462050000000", + "tc8zBSdcFv_66-aFawiEG6bGgGeU4hfkMj1RSm7DbmM=": "384615000000", + "tcCKKimLBKfQrjXY1_XW29FchMRn_a3PJAbmFlIyCZI=": "450697000000", + "tctkmCzZiEbCaYLUHXHwNb_ThEENZhrO0ihN0MYFlkc=": "4586347000000", + "tdaWDeXHqW1DWGeKUE01tqtstOXxwitqkY2NraV6JTw=": "384615000000", + "tdmzFOW4RxRCxfdfgnLrkedVLWSZoNtvqloGDZ4MJfU=": "385506000000", + "te-QsJHog6_lbYaCeZitTQhyxh7Ps4YmxSm7v--HmWk=": "417633000000", + "te7Owco_qtw5va_X7M1biRrRfO1wy-Ck2mziuW4toJo=": "384971000000", + "teak5i_IKklOSkJzOMTMoa_mpajYd6hR_ncGL1EgBi8=": "1053419000000", + "tezAKSKE3-MqYsRhXs-bZY5HTvx8uDz5cJFWRsDOkI8=": "415629000000", + "tf2NJuZs6ga3oBH1LgX6IwNrBOO0md1zQ-fhmIqgJzE=": "384615000000", + "tf2iO4FjTNmAtDp2HFhVXQaRppvNG_2qAGQYhLelBLU=": "384458000000", + "tfu-zg9Hkk4g9xRmnQ5JuR2iH0zuATmqWrHB_UJ1o-o=": "13076909000000", + "tfxge1HbpJXV6ykWzJij61KeibZNMnslIhQtG1ViQyY=": "463071000000", + "tgJ2RVgk7xIabzlqXcdgz4n2ZkE63NCn_lQJaEgP-KU=": "2692307000000", + "tgWi4I0E59zCfofYQzRnhIx2csr3SeGb2PiH4_dCrRc=": "416673000000", + "tgXX7Wl0cEjkeASlknENOMS02NsnmF-GCBNLGIiyHVs=": "391019000000", + "tgbrYlUKWdU-ZsUpoACU_PGCxr5ibc88_C38DqME7-A=": "377783000000", + "tgkzQUH1FZrZb5IfaeXKp-lpxoCgG6-Yw_6vSn1pTI8=": "574106000000", + "tgoKaBRdoZ9cqcJUvph-wOrjEvRBzWoj3oWxUW6ypIY=": "454545000000", + "tgqwR7f5lxayIoQXXZPIPizGQQpOixobtWttUt_h5Vw=": "1388517000000", + "tgxiJIHXzhaqNXNGyQrkE4bUqa8Dx09FGW2F59P3dME=": "453157000000", + "th8z8obl0EjEJi1o5WNnbUHbWIKxldn_jAzPlJIHVwc=": "1363636000000", + "thGEwr3hHzoE5Y6ouIuZY2fjDEu6wBIDs_PKW5x7R_Q=": "453157000000", + "thNm4om9ZpzUb3Q4eYgdAHjLnr8jHxZL9BZ_MLoXQ6w=": "624999000000", + "thUJvJQ-AGj12QyHpBM-T5QAJojDDRoPYd7UelvNU98=": "1923076000000", + "thWSh1wftircClwOjgDN8IkkOfMyLdZDZTY_ranAYBg=": "422561000000", + "thafLXWeBxlCYcN3hITBL-lbWXIrgVmTMEgcXJNfTfI=": "394351000000", + "thnlIxwjLpYZe5t6kyBeu3cmg5NMckbxL5hWBh4VEs0=": "1260181000000", + "tiGewftLaMciI1rI4PhF-uoajuy_6ZDI5YmNXK59QEk=": "911191000000", + "tiX3vA2T62XY7BBojcDVJBTvTVdSbulMkuZbjp6e6mA=": "446615000000", + "tj5zvGwwD2Kp100BMkhF5-Ym3GYJVIveL8otI8tZqgg=": "385505000000", + "tjL8u-f0I5J90yfbPOGZLwk5lvsEVcXmnRvWmp3HnFU=": "384615000000", + "tjRk50ar1Z8D7Cu2Txo5jnEjI9dKrH8JKXIY1mHNAIo=": "939231000000", + "tjiN3DY8MAvXqN2WGB0HHiKrh3HaijIR2__TX4CnXmo=": "473265000000", + "tjuPYYocikq17QJckkq7jv6e7fsdI9PyFF_GF8xz1YY=": "482456000000", + "tkWYK4Ii4BLrOLkPUNFV3pwDx4aLPFfY5yMF5ip9Mr4=": "458634000000", + "tkXXevD6YLkM5DmJEhYjS0lTuUtKWcPDpIk9bdX4JI8=": "694030000000", + "tkYgAxPVNfIBJx0bhAEEIlb9xoAABLj9pHcJi6L8Xxk=": "411085000000", + "tlSSKdQ7dnLAmdTHmKd-slq--GXsjPyw-BAa_yq4-aQ=": "825733000000", + "tmCIy3cjB-Ft_7Z04dKWU7ZtytQ7AtC3zLFr52c4pdQ=": "7497594000000", + "tmM8KarNsRL6GZR9440Ba7CjiZSGsRAUWSX5N-71S18=": "383253000000", + "tmNn09X33nOvKRQkPKYk4NVaKRPMv_1mLrc1UPT98AQ=": "463390000000", + "tmf1fX4rpGOy6ZMBFDUge5zV93dYlgxLRiZZv27EbjU=": "2916658000000", + "tmn0Ml4h-yOz60BzCZg9mhniq_ouFVIdBsKcvU_A0Os=": "1666666000000", + "tmpI5xt1ej1aJuL42p3E8jnJ2HJZJEU9oeWb2tVDyp0=": "2041005000000", + "tnHmdhWND9LAlAGOK3zbKSwo_DOzGbsPAlLeC32DlGw=": "499178000000", + "tnMDFqViDzJ7hOksEnTv98rT2rPS3xNpD5d2dqgA31M=": "393446000000", + "tnZtT9PvWGoU0Jp5eWi7fVIHPrIUEQnwDEqFoHFFl38=": "470350000000", + "tnmcWmaRWBMX-JDh8vn8H4IurmqXEOz8_1P028sbEFg=": "455931000000", + "tnreBL9agVLI78gSWKGbhLb5mxOXpsb1xh-V0nYveH8=": "384615000000", + "toY_9IxOHLpwM8grnY8K8J6EwE597WtMambv0VLqLfQ=": "3926771000000", + "tofBgP-5XgGpv4ZZAHZIKmEnQVosDj7lIit2yGan-kM=": "464004000000", + "tooDz9aPOfOjxsbcDzfT-jbBD9VFZHUGs909Buz_rl4=": "391798000000", + "tpSr8gPlft4rDFsNJc09AAwMA34hQKrivoY5U4WjOnQ=": "384021000000", + "tpVZ9kCNEvpe4gS-rh42C9GWC-oBOQ75ZY48XceOGqE=": "3077798000000", + "tq8qKU4yu-mOP8-WiiWcCxh_AejCfGt_qn0_0Z8MNZE=": "453712000000", + "tqLOMOyeE2P_xamKhyrEM3k11sPJD4y_ihy2DyCABHI=": "736579000000", + "tqVcAuR25-aqa-gkVxOnnSwsFJRZI5m-JMMd4ikFfdo=": "385508000000", + "tqk4ZrpbsVEvjoSxMlp1m35Yn_T6DHH9tvvD5Gjr3n8=": "946663000000", + "tqoT-GQKjcoCY5_KM0OM9OFjvjS7PpDEoO_OtQbdCyE=": "826798000000", + "tqy_x4U0OlJ_ZEbZMygmawHbIdsW6ehAz655pBd95RQ=": "384615000000", + "tr5N7HluYhXAGEM7W9gWRZoazUj71B4mjs0MdcJKNN4=": "2615479000000", + "trWmFnrMz_FXceilra0bi2LqtBtzXY3i0yhZ9AxCIOM=": "1666666000000", + "trcJp7lUbGYHT3E6pjlmydQYaFiCnkOX2I_ogrsTSJw=": "2275476000000", + "trdNwgy3syk2eMp_Fney3qq2om-BtZ1OSfEwBVNnED4=": "454485000000", + "trtoIGh3owIUU2VXiEHPNOMJNnsKMQocZHpnv6KPhq0=": "384615000000", + "tsAOH3GTsz74BT4J-HZD9piyJ2H8rky8UMzZDnDfFMo=": "469837000000", + "tsE2wHpSg0KmA5pF_EwYhgC4B5f1XW4ZIy7XLuEiZ5w=": "1047200000000", + "tsNtblO_875P2nYX5fTyQtVNd1Kk-hrkBDB6MYWVGbA=": "424673000000", + "tsZJ28XbRQTcVWvCEBPgWJmxrL5bDUEEs5H9guV-MMg=": "454137000000", + "tso-3uMm_f6pQ3myCSYEQ2Ikua_3LG8HUnHhg91C0iY=": "384615000000", + "tsqgDoGiu8hETbF8Mo0TfBa3srwamMRk67REJFkgI8g=": "416666000000", + "ttEyMTKV2U34yiGPF5nDNn_HkIv7l12wBbomfeYhGME=": "447986000000", + "ttQupvLn7HxHKFEy0K1vjFhJ98nsgc881IXRK4qhTBg=": "455141000000", + "ttShAZ8z3fYC4iBjgNkmtf029cYrMIalhL1cdNAPQ_M=": "1673017000000", + "ttWpGCVWMeDElp3mutMAShfEu0qf7TDZop_Vf-UOXi0=": "4423077000000", + "ttbli94UGIUHVT4EkU9FWAtV3FFSt6TPpcYoQdTVelg=": "1364610000000", + "tteozbIjEKWkmUx3sQd7CTYJzl9DpjyLwUdutohc4U4=": "384615000000", + "tthENwk-7bwcsm1PqDxCc6GbIQ124ISn8PVKUHuAsR8=": "778301000000", + "ttnv_lt2VsWmMCY-MXaa1EkMhTA1mH9FHStRaa7O9w0=": "1249989000000", + "ttw2hHZDwO3garzNcnNNF0nd8BM87GBuXpY-h42QX90=": "445981000000", + "tuPi-6ngTAAG9DKgrb61wYUkSeJxL5_cPOIpt1p4D4U=": "1381273000000", + "tueBIrSuWTeWmbSH-cSOUQUI6a1DCWj0iuugW3JPWRI=": "908983000000", + "tuiAIIP4RIkigFWmzvd56d0KlGE4cSUcSqxv46Gwclw=": "534999000000", + "tvYKnfRIDZrkt9--thOcF5VnpJ6-8TWdoFZshSWcono=": "1135024000000", + "tvcp_ZTScUMapB2XNZ9ecJZmOxF7GLtx7x3dZBWu1bE=": "1144901000000", + "tvjufxW-yLRfKDJThUd2CmhFQGbgWq9zAbAFlOCfjvM=": "4673517000000", + "tvnTHpMDA35JLsuTk5ds0ah-FOW3EVrRqzoD2H_-v_M=": "1152797000000", + "twDYEOUZcKlB_PrSN7LY5OH68_smgaZDYLWWWjrbdYM=": "1927537000000", + "twfDA1CLhOD7z0Q39ueLvSFKxpEhXnVqW2ai4nYsglg=": "7809166000000", + "tx52pXBD7fFDfa_uCzo5SudbPeCQnzhJ1FQPhenV04E=": "457611000000", + "txEt5q_XIx1G0-w2fYbIeXkJ69qYzaBITPra5wGvhwk=": "457043000000", + "txRQns5qNgPMdoXzBydIMscdkUqqMA8efR4wIq3TYjU=": "831259000000", + "tzSRsoSdnuKv-71kMyCSEpZXHs7A7mEcb0ve_GdOsn4=": "1533218000000", + "tzwWWO_40qHbB-81r8MNQUaZs-JZbPBHdhLFIRXH9N0=": "376747000000", + "tzz7uR4sPUZrpZohLkmXccGlacAh-xTcE6omKKbq9xQ=": "454494000000", + "u-Caf-D9wEKwvN6nKKPMc1XgGxHMEEUvBbMZJ4bJcZc=": "384615000000", + "u0-ukJ_swyBQcdlt_9qDTk7StScLrBB9f4fEQRwEk2w=": "2009477000000", + "u0JUQTH7jm5f13W7_QoYDj_aWlyHLtl2ekmht4XBCno=": "385510000000", + "u0STy-9-LOKcqCShFwLREMz0tRneJ0ZfvBvm5FOK9jo=": "384917000000", + "u0bZ8mue9G19sh9PhnoIwDGrD3jZW1i8Pt958g2Suzc=": "465700000000", + "u0btALD87ql2hiolhxPwUDcP7StWBBVOKphDAbbElyY=": "925501000000", + "u0cEh1n__X-vYOQ4r6DVjgbhlB1JhYfeBmWEG1-MLW4=": "499999000000", + "u1kLn2lUKCixMGzKZz2_gnGK6uHyZUkbiyVdtaFA4JA=": "7692307000000", + "u1uwqRBietyHcE0xMU1JJCGtJCY1g9F0LdYcyf5LvxU=": "1155246000000", + "u2HYQUJxE7cUQVmYEj_rfEcdege1OTOyDT7uLRDAM9o=": "384615000000", + "u2Sqjz_t_qmQLBaApLka_hZx54MLKsbCz63c3e1PhT4=": "1252892000000", + "u2W37_ypwHYUAlXAafmK4L4t9Cqaed7eCy_veRgX240=": "505255000000", + "u2gJ1rf-BS3W1wRcGSWoc3SVBl78HL9NojTbmR23bm0=": "384615000000", + "u2qVizENdgXO6S15YCTYNBAPqPqxhc-dzwDtHsfY7Vc=": "423669000000", + "u3-lGz4AYul1QJYW-D5ErgqEOa0mYOTO-JN-HMilB2s=": "384615000000", + "u360SbY6PWkZyad8hMh5uzmYOfn5Sy9RD6KahgQIAOY=": "1252908000000", + "u3WUg3jhD9IROiEYwrysTTf6f51yEiOFFC7gMxE60DU=": "1153846000000", + "u3jzU5VhQogloO03ho4_DWWxsjwgf5yICwTEv_6AkKA=": "4349302000000", + "u4HhJNYLerThiCM2zSZuRe6Pc-fVqJa0gtn6bdVTeIE=": "394347000000", + "u4mGBrNJKVXJ9XV1X_PlI7CRiWiRmPAXEr3pD0v1f64=": "385134000000", + "u56v4pXibTeCM_TrQdS-EdGpweEzCguDmW1Ly9zpp5A=": "4084824000000", + "u5FbAJmxEVryIvJEkgc-N7AMbsFPkZkfj_Nbq8YGXgo=": "385506000000", + "u5FlIVyXcyYynTeTB-ciaFKLgx3J2TR4JaWtLC8D0Bs=": "769652000000", + "u5OhQqwLwj4oQ7QRXGJbBcS2X-h7bZ-BBuGbfj8Ds1Q=": "3845693000000", + "u5P5gDF2UeF4V4YKlCLbj6y8uou50WdZeAZQ0-xvc4c=": "417630000000", + "u5Pj_0BzNh5g-m4xYRSdaWMBWvmmYzHvzO9SAJx0dxU=": "1352005000000", + "u5U-5MzuCwOOy7k49YwQ2EicJmguQvohaiAN04XPEZs=": "458356000000", + "u5a7_hC5Fgd7bBa-B12KLHtqeSwmWd9O_XEpEBJBADs=": "967404000000", + "u5o8sA1kbGhB9G0bHQ2s7mdVC_zPAuZMHYMIfeJ1_ks=": "2307692000000", + "u5qQFxkj69oeLyjGmKKjHczFx5P4lxmqTMWMVkCGmeo=": "2115384000000", + "u5ySHPWeSeRMoyYrY7XcBNz9aP-0Z78qTd1MxgWkyoo=": "769230000000", + "u6KtD3eZDIY8CuzaWYsRf0RVh238j8bmc9MNgobpD4o=": "8213696000000", + "u6Zvw8hhFpdr_rQGLATTSYK-SmQw0SLsbLPeQmX8w9c=": "398808000000", + "u6u_nGgBDk45MbLY5Uybo6pLlXV0Ra4AvUeRooc0Jqk=": "812736000000", + "u74L_QTu7-1iqHD7x0bPKYrK1ai-OcwYX2pJAXh29jY=": "1153846000000", + "u7WoclanxRaTEUOPoK4ksbnKfo7U-Ze9ZxpvQmaI2v8=": "768695000000", + "u860_C4kmWRf5fI1F0rxNe7wE3c-xGPbMimyvRgsDww=": "473064000000", + "u8ImuUsQol03bDs2q2JXz2Cc47dcTi7IIz1-e1i7-Fo=": "16258427000000", + "u8ca7bcpO8y9mn0ZvazaLkUjaRliNYqCc0Ae-LMMO-g=": "572713000000", + "u91lWrkZ3uNpwpBLhRapYir6OIKSnxjY9vPALqFjMTQ=": "1538461000000", + "u988DjmQTK02MO8cRoAHkGbY-ruQYNy7jDDF0gVjgFo=": "452989000000", + "u9BQn9bLCvNT6aNrOshz52BvoSTJhRsiP1k40a0pyrY=": "413520000000", + "u9szVgNRpbbLIB8Itx0qyVq3ka_NdhjpZEZ8t-FdvDg=": "416666000000", + "uA-WShqRpF2hJ4MaLo4b4771ZhVBWCWfXAjpWZpoYUM=": "3750742000000", + "uAD7QvOhKruZp9nWXINf4XHMLAHc72lFNzJVChG5tXQ=": "470730000000", + "uAOupYTBopp_bVBGwsoDAyCiVcNpgFlQYSCBokJwz0I=": "459394000000", + "uAzNSBTDDmGOEpidLWONf0Xk9GQGemD8p8d1s4I3x-Q=": "464757000000", + "uB-p3PWg1Ptb8GfpCL4JC77mWo5i-fTbNtnh2q4iw10=": "1380996000000", + "uB31dXTnt1nhKQRH4yH1F0WRXTwqDUNSFdV1jlgkmjE=": "416666000000", + "uBK-cgU_DUFLuRGDHVLeD1KTZezzkNkEOU49J1bntb4=": "767923000000", + "uBNWPukr_cbohtwEhOHiMJlh3mBlez3vHa3xaS9QDYI=": "388361000000", + "uB_wFw53Qk05O1NgMrJZQu_PHTMLnW0XzdeQL4GT9Dk=": "408041000000", + "uC-GPK0OjZg7VdrznRUwKkjTaU2OfxFj8GEUgn1CjsA=": "381805000000", + "uCJ6fIpgdILBDdcFa2iVaUbY-IR7YHSvXLaPRacQafk=": "763268000000", + "uCuF_Y1vpJxVd-4_qhaktkyAyZZX-at9LXVW3_Fe9es=": "453599000000", + "uCzz6LIk98OfYmPOqhz10HUegk9GIXzabAqNEDEACDs=": "449266000000", + "uD03PwV6OORosD0csyNF8cFCXNOTMWo-ogUeeqACirI=": "673076000000", + "uDNspK-oSBnLly5QCACWdtD1OnRpguccBwXzvb4z2xg=": "1233257000000", + "uDRmvS1XXp8I4Y8ZW3foDA32ynBHqCsJdKwr9vhOAf8=": "384697000000", + "uDSEVK4R-x1alwu41xuUK1fSRox7G3Hdt_hu8bNjEyQ=": "1249999000000", + "uDkHNQNdE7zhUmaM2jNd1HxL5Zu0elL54fhQ0ym1tYs=": "4259727000000", + "uEDkFpLLaCCwZe7dOoTqcpc1Z1f5EcRBheyaCvGATY4=": "19285060000000", + "uEOZJPOpQRQka3WJfHti8pwRjwi7maVqlZ9G1QtQOF0=": "446606000000", + "uElJMM3huf2O_q1BquAwcbpGXC2ekpK_1SMjow3xhc0=": "384615000000", + "uEsjuocemP2vseiIDsx4tJ466Yh37MJL9Si-qs6O3rw=": "535979000000", + "uFAoYj3MeA5BGGrXnQOhkMnVjVOhNIm36YXGXpQ_cIQ=": "378257000000", + "uFJddm906q2_HkxE4iZGZT0Z1cfbpt5efasCKnu01aE=": "636269000000", + "uFiyrqTagtLMuf8sOhkbfyV0fdBk-jvoMfYUTRsVkR8=": "806633000000", + "uFtPIhwOLFJwR-tSM3ZukIYOwp3n_Ffy8d4HLV3dp_Q=": "1252898000000", + "uG6cL9ue5XRdBYTxpCzR0vtLaN5FBv3E1suymlbzLeU=": "1252909000000", + "uGINGwD3YISbuq53pLHpev7O48iL5Knqm-0j-zHJJwA=": "830439000000", + "uGya-BH6ltOLgeeZMWbuQ2LPvZ10Fgf3WLM3aPvsh40=": "499999000000", + "uHGTHiDBCmsAaRZR8r3WY9oTYfzWVaCoE8PZ1q1IuZY=": "390053000000", + "uHzQUy1YxBbEiRelYyILEOzxfkY2EdkfKThWj4Uhaa4=": "469809000000", + "uI2rRC-12kjAz7sbn5rPDG4YA3lFvCCkfX_u5WEpBNI=": "903970000000", + "uI2zlRgLuwS9tDm32K8Y6Qy33LbOOgaZdT18INhLIEI=": "385505000000", + "uJJMSoCQEJa_R-aoFMaPZrDSd8zfbpRDqnozp8xAle8=": "336883000000", + "uK5BpiHVvGEIp6okbIH4idznrZEJhXU5nWjzoqkKuLk=": "470493000000", + "uKME42N1JWg2MHntr2Z8RmxXGoxpMcC6K6VnOS7EuTk=": "519249000000", + "uKW9v0UuRrJQHKtpGhllfDU2LjtRjqla9qKM3xG09k4=": "396485000000", + "uKZXSJvx139fJXnfCl8ZNm1sK24vcCqJMcDQboIXLek=": "634303000000", + "uKxPmWGkt4WwmwTsU5jvINrb9WhCQo0d46bH1JX6PnE=": "3306869000000", + "uKzPiCb5zCHLDR2nZ815fx0gTYiNMWSbq1X2u-eppA8=": "393191000000", + "uL5HKS5W-L2OyVTBdkFq_WSv_o8GDn2LQWcqKX0fjK4=": "384296000000", + "uLJXd6VLEFDe2MHry-wpd0NHF3mcH6bfhHWEK3kR4e8=": "1346185000000", + "uLS_fhuc93nN-v7NJlNMem2fKOWp39haqe5Wm3eUGfg=": "416666000000", + "uLXHbifovu6XXpF7hrRzPW7sI6LZo6fUxLiv6AQQ9js=": "454486000000", + "uLnxMYsyEeVff41_LavIjfeNPcyLexFPz2Nfw1Vj_ws=": "384615000000", + "uMHJl4Q1Wp0iBKh_i-zCw1D52F_HLCFW4shY-gz5Tmc=": "460987000000", + "uMU9MpbbVEc03n-rWOztA846yWKTHmv-O26TCSPIkbw=": "472905000000", + "uMbv85ziq9ghgSriwW8cdv_6tLtokaCPR66OepFcCgM=": "385509000000", + "uNBJylxA3ALRnVdE8VXdUySdOgeaU3knZ-Z-LfmTbhU=": "384066000000", + "uNLp_NyTEgFlA4qxBDg-2Sy5jUy6MjIY_rRepKS-Apo=": "1241607000000", + "uOFYkpFGIcEfgZLjpe2f31D8fkwKDErSMG3caJ3N5tg=": "411944000000", + "uOgxa2bFVUXHEOBIiQ2pR0JAeKkYxvhT7w7v_xvFOEc=": "450789000000", + "uPhI0wkP10QMmj15XpP68BaH_pmHIpsRcTX3-vI-OSI=": "384615000000", + "uPwYBfOS0jv-PY518j-LNMFwg6WQa37kvzRgtvxJFeY=": "458722000000", + "uQ-IbXSsBQf3j6RjjL2wu1AZWoZaG-QT0C9ZIRKb4t4=": "1156518000000", + "uQ1Rq0ow2c9z7LljLEKuH9aEv3-tFFqieXMOkvyftL8=": "1666692000000", + "uQ3emwq0Ehbgs1MO1TZbO_nKwboVunr18xMghKvx4OE=": "699569000000", + "uQiH1DaZRcUpxgH_YaaU5zTeNSg_pvoLkmELB3tZMiE=": "414951000000", + "uR4GXKRqzV21OmyGWgFSwNNOuzlMAPC-b9QleDtsrXA=": "383760000000", + "uRF2aCkrfLwl8etRLO4Xj2voUjGBvcscXvXuz8xO-jo=": "11356472000000", + "uRTDbxoXUqJ9ZkSOq0GR0TxRuXMwvwNkBWg2RuXPsuI=": "472515000000", + "uR_Ouwj7c7tyIjuvyLcRNW5vvy-af-KgUR81GojHUYE=": "444560000000", + "uRg231DtzhQQqGMhlNhSrnZZZzZ2E3CVCKJ4zu5-TfE=": "420514000000", + "uRkyr0-XqcSMVabc4pL42jrsZhWmzvYiZf-UF1GT2-8=": "385505000000", + "uSHG59YeEqpU29zKQ0u2omugEJSx40dr3MH_AkryFyY=": "381836000000", + "uScYeiBidjDTO5Mwms7OCn5NBmjezXkUjCXFxbEADhU=": "1841763000000", + "uSoWQ-XgwvJlYrWCLhXDgM4JwJeyfrNPfwwrwuo-Bd0=": "576923000000", + "uSs2sWE8yJJqzpUGsiyGgUUSTXYLwnAdsUoi58TcK6U=": "3749999000000", + "uSswHa7IDrehX-zV5LJq5urjkboN8gpabeJbMNyXq8Q=": "455327000000", + "uT60S7nroW0qoUKoQvmyTvjLeBkiRuXTi_83XkUWGZE=": "384070000000", + "uTL7ZdjFawgyV9LHJFE-aPC1U79tvwYcOPR9aLF2yPY=": "392996000000", + "uTnx0XxY4bIeLbWrrFO1ZTI5weGBPDJDotnyGDXsneo=": "391550000000", + "uUn7QIw29ABQ3qtVmTRi0mkQ-DQXH-STufPgzwnIPcQ=": "416679000000", + "uV56adJrDCEjyfcX40RoyNJVIpV43BZNMs3tNxadpiw=": "384615000000", + "uVb45WlYKXDqpVE3jtWR630nHP-qnaNL6_81-g3wLgk=": "6518282000000", + "uVwMsCxstuvRBpTG2RK67bo03kPLiE63DE6RdcwsKAQ=": "386369000000", + "uW5VMAr01En3VT0_CUP2JT7DmSvvy4tyXhBd7Bf7mvU=": "383030000000", + "uWplQ36wnVm6FhpNjqYnE7U14Iutv4R-qvg7SWX66Wk=": "3808272000000", + "uWxuAaPi4QevAzx7e47ue1-5wA0gpwDtsBh6MOu5iZY=": "384615000000", + "uX2bRjCQnfmHb8ILeEfJ_HUNe31GR_wdM24P0034zGg=": "470198000000", + "uXTpCl-PNoi_UX325Hf0L9Uo7jxtRqnpS58NKXjoxPk=": "416666000000", + "uXdannK96wsnBMoY7K3daq8MMasg9-N1qi3EZj_Ke8c=": "457896000000", + "uYHDXwE4vvyau1tW7BVnk2zLbwYy2eCoKxJZtTyg6w0=": "2407430000000", + "uYKgYwl4gI3b3f0FZnLlqwXZ0paBisajR5h7pA-6LeQ=": "6054573000000", + "uYr-ovhQWVOePH6MmLE1ybyDAk9X12_Xc3ZNeUKvgdw=": "376833000000", + "uZ4W18jaFZkbvjH83ZvCeWUG9EnUJmPy-PyBrDVDv5U=": "3076923000000", + "uZBcbyNmNZmlrv1yvWQhwjK7zEfg7TYDBEXV2f38iGQ=": "22629879000000", + "uZEdY7QbrukXZPwhBme32GhdBoq0ncZEDTya1uc-f2A=": "465642000000", + "uZKoqkSlXsrcSkiAV_LUZ2MtzAxQAxF2DnrTS2tuwTg=": "385219000000", + "u__D97IoSuapdqUXUtKZlecekAZIsvfczfYKA7nFN_g=": "515384000000", + "u_xrtduWo2BB-UcYGq4jkEKHeO_x7qAw9-FaGZFamGc=": "4176295000000", + "uaXRfuS4hhekDzVISbebs8HHePLZbUev1BJXdVhwytE=": "1513350000000", + "ub7RVxXX5JgTFf_9UQoMoRHr7tm-elfu3sUubn7VJCM=": "445280000000", + "ub9qWeE6vYkhIgPnRJfHvFq0SsqS2afiP9tPwJPDrp8=": "410048000000", + "ubZEuwibyhb3z2-ceqXWkadhiFF4wbB93Ul4KKOAOe4=": "450369000000", + "ubiyqt6GnXM9aSVK-h0BFzjAUwp0013C_mLv1Ap0sEs=": "3714283000000", + "ublFok_CBJ6Za8X7vf4DDueM-aZWGsBhA3wQ7K3thgA=": "392939000000", + "ucJy2Razdk04H4ql7pk_4vnlrRkJfe0nI74g3bGonKo=": "839770000000", + "ucOY5l7LuolidjvnCyj3zTp738sNHeYLNnCUSPlHQEw=": "384446000000", + "ucOtnrT14WO2pU2Om4Fnvxf19bUvhhS2Sl5rUja3hJc=": "13620024000000", + "ucPDfZKf4DlbQ-SN4WS-40VFA9SpCQ2kR0qT-A4Oqbo=": "354711000000", + "udO33KOdDAWyM8wEAdhU2Vxxgp9zPnvcZA7kMM1ApCA=": "384040000000", + "udTepGrbAGwVwVB4_7rUKqgBnMuHwN0CI6Ple8ujiKw=": "833347000000", + "uexZ-9aic1cRDNcymqcI8WZzgfvcpbdmodhLX3XQY7Y=": "384615000000", + "uf6dAA2frj7p-CkQymp9fpquYEL7Esw85iW-ugVsQLA=": "576923000000", + "ufKQZuO72LbW1uozFR8VewZJJK09Eyafu2Po1oQ5_DM=": "379414000000", + "ufOjx6GdP3t3lRGiCt1CwO7JdPH8TttM4ojPwrj_LOo=": "377410000000", + "ufe_QHIUYTfaJ724fTY1wcajvSdxStDsnky48rtSo3I=": "417634000000", + "ufg7GZYGtdkgFtGBFeGgU_LjFb1aIi4pV3sdcsXhMEQ=": "464564000000", + "ufwHRT0QFyfLZWvjJmoPi_PClgKexTgARZCKMXeUK-A=": "458174000000", + "ug7Jps7TJz6pHR9IOAPkvo5v0zEpj-a_3GZLUcIO7sY=": "449253000000", + "ugPALjf8sGGnFJ5GX8wSKb-QUGRfW2hg_EKZTP7BrWM=": "1156522000000", + "ugrIPJAXnT7aE2-9Sv9wGqgHzMSNledYUdbsP82WVF8=": "769230000000", + "uhCBqX9SIrqjwhwe-zGwRJ2APxt90bhgLfZmlLLGk2c=": "910115000000", + "uhcJQv38aK2MhBQLJTwyQcJ1giv5HEqH1HvjgWHPlzA=": "787448000000", + "uheY7nuY3AeCasR_05qJD3oBNQWno4VNZypZxy7Ee3o=": "1645346000000", + "uhov4CLU-Kd6dDM0LTfnMkS4XA-Nd4iNzL7v8b1DaxQ=": "441666000000", + "uhpz4Dc-Sphcaywql0gxeSA4BiKGb4y9Fkhm8a-xV6E=": "1730769000000", + "ui1lt2c3nwRA-Z3lSqmhKGRYzINocgSe46pLlFZQ6Gg=": "659188000000", + "ui55jlsHyFh9MsEl62UYMoCdl4X_3NmEvORuHpBkqJ4=": "3338945000000", + "uiEULbLaiqtqvYeCZMD9357B8S_zz3GjAF3Be8uO2wQ=": "576923000000", + "uiPPg2u1ztJ-8ZLguDK4meK1KgDQ2kjWHjwdjRcOpjc=": "384570000000", + "uiR6NmqFpPSRQLkT0_CBWC_e736kwHtajhgoAi-2qFc=": "16249119000000", + "uiTPXt4__Tn308pj-9F5t0aiV6lzhhOqQppr2AwwFzo=": "1167539000000", + "uilPs_OJZWMyO18C4HlX4kVMsiWxnjcVVDl8lbnC1K0=": "384615000000", + "ujAXHbBr7RJ3K--5oOjkdFM4hd9Nh_mUMxhCFluvpDA=": "413426000000", + "ujLCHMnnLrKbNfW_qu-3kMg3LDTrD-zUnJRyVfNg26M=": "422196000000", + "ujQaFDnZ2A__rNdhTj2cjPY7krOs5TLlrhseqnMh9Ro=": "500006000000", + "uk4y6STxmmJVpg65-Q7hHgP4JbCT_GtkkjGt_cThkaE=": "1840889000000", + "ukgtFiykaL9o88XnwTIi6dhmAKwtUokvR0tb1hiWHEg=": "3782064000000", + "ul24CtfqE6n5N8Q6lr6uoKGaJaAkLcUx7t-nlhX6eUk=": "491921000000", + "ul3itLKsXBNPxb02erPYLYOPAWNEHlJdUVrluOIOZLM=": "378460000000", + "um17rGHVnoqFbCRDnvdVUEcDQhdaHL1nP7KT2MUw4G0=": "2344906000000", + "umQHLk-zhgdDTlenA2v9EEqsm0lJGXfq8ZW50NEhjsY=": "1927551000000", + "umXnKrahJ5TsuvPQCgqE2S1x0BjffHwAdSiU5jGf8tI=": "453638000000", + "umfSZQ_Ygvfl4fRBVwnorS9PEqPTPm5-23vRu8Aao5o=": "961538000000", + "un1n3cvDrvCBB1fdwgc9vaFyeaxICz1aO52QcImLfBE=": "770215000000", + "ungOsBaSo5o9tw0CcdjVRd0XQcxLgqP25PhjUc6VfBU=": "833347000000", + "uoOWDTeUVQHiSKnh0zrA9O83bKXQP5NCTrf931X7m6M=": "38537276000000", + "uojb6KF-U_3vk-b7x7WuDH42y5aEAaUVMftqN3ewMgw=": "384615000000", + "upD17VYhAcaHZHN3UUmI_dmI5biTfP1Jkf4kVqXYZtc=": "385507000000", + "upYLfTxFCGIAfCKoDsOmkip-8AQ_nZkIz4XqnOHAdnI=": "482872000000", + "up_xGKqkrNgyQuHtY673nZkUz1IJklOuwtK2M_ZQ7ic=": "7930076000000", + "uqC0Zlj9DDp4Oj6bdzPXrjon_oV7hkIzCd1QGaCmcpQ=": "7499999000000", + "uqkcEp8Z0ATtQP82vxWcdB9IEZyGsmeF4eliiY6mypQ=": "451350000000", + "urbI1TPEgYT1syuUFZcdEXbZpkAORncYrKpeq_8cvM4=": "416666000000", + "uru-PN89QpcJR4ps0fCDNXfctFXX09dX2nyXrWMCaLo=": "416901000000", + "uryBxPH6-L6pej5VR6IFEyJFAcG9yT11fB3-4Eq6FiU=": "411969000000", + "uskZF2aFTsoEjrbd45OjNiiq5DRlNbNfQ-oYGvO8Vs4=": "641074000000", + "uswEEnKHOg1qEAr4bKa2Bu4MlYzV04U9O6ZZAyiOdoU=": "4009090000000", + "utmubS1-hlpoY6qxepV-Xk0K4kBDvxGURf3MTQIn8Lc=": "1923076000000", + "utoQpWoFedpw9zt7ayFNzGr0Vlrsjy--VC0tRc4lejg=": "1871299000000", + "uuYF-959WmdtgLLA4iq5iYhLQcQh7Y_J3GbuMBKjkAo=": "416666000000", + "uulfeqeWEM5lCniOAryEMjhA6wSNjbVrPxt9wQa21fg=": "384615000000", + "uuoqq3mXV_A7HEqYM_l13uu_rC2vULE7sEQmrTqU6Pk=": "695350000000", + "uuq4tHx8BI9dFzIyaaPQV5eL3ahVgSLIoo3srAdQiY4=": "384615000000", + "uvoN5ij1SaMM_PVhTvWa_4H0YrRhRnJ3awDygIYB1xw=": "461180000000", + "uvuvfUU4FwCwzaKG3FfViWyGhU_xn2SlNbCpKFxisB4=": "3076923000000", + "uvvXeni9hrtpOnVkSQxQiYGDDNLK66SuJ-xbMj1y8L4=": "1866939000000", + "uwEBoJv2VcM-0VN84W1uW0bGnJ-qGwZtfw3XYK2ExjI=": "419234000000", + "uwTmizZNGIN0ip82dOST0Gj5_KxxF71mjQIozSMKCLg=": "3333333000000", + "uwiUs5PFm-4xXujBzdhGoKCpyjUg5q4RCZLryHPogdU=": "395125000000", + "uwmTRpk6qlQq_YgstgyhJ-rYpehxEFMzk_2N6aUVtnI=": "384615000000", + "uwo_Dl1NEwKalGco-dpCDRJoCy5MszlD7rpmwzDwSBE=": "454092000000", + "uwwSSeSNZfM7FjIn00Bq7aUJGVJJ1aTV1WL9Ly770s4=": "456067000000", + "ux-TvBOgQLtWd3fUUIqpi65rEloj3b9BX6tIbHr_q3U=": "416809000000", + "uxCaVbZg6qMBlCBSl0wO0w8AUghAQUHxOiEb_QV9EAU=": "540071000000", + "uy5DKeekqEQ-clEP0dz7xmiO5P_iT2ihbU4I5ZfpzUg=": "635600000000", + "uywe6KUs7dP3ufohCXAw3WYeGWLgk3aViwCE06acOGc=": "385505000000", + "uz2MpLsjhRsw5t-xBUtDwt21akwZ7Zwzs5cKRZqgAVQ=": "954228000000", + "uz2uNgqJFQg8ZJQV8JokdisRvGga75sspZQtCIktBJA=": "1264105000000", + "uzVMTM6-RL8fr35jBp0pcZL_T5rNNunzd_xKB3FNGbo=": "1793255000000", + "uzibMTWuSo-1S6ZSIWTTllNUBsuocF7w8FXFzC24Cys=": "4999999000000", + "uzqhfjutcyRNbXxAeHLFCvivChaZnU3PdV1osIfMGZs=": "384615000000", + "v-_PLcLJn2QYS2Jbp0N6ls2H2DM9nUU1Uc9LZ2a5nII=": "11207119000000", + "v-sE3Za8VJbIbkZSOtkTwewFl-D25bwEd8Bdmyjxjtc=": "470605000000", + "v-zu_REv6c2cZNqfTdoaT1DRcXFkivH9isn5Xk5bw1g=": "539687000000", + "v06xIHeUXbRvCcp3PVcXWQloaBszaQ8scJI2FMisJXQ=": "3472000000000", + "v0F9IEeZwVxhI0UHn43Yjw41a_Nhb4wmyLQU0wxkfUA=": "1505148000000", + "v1hWWi4SIc7cTNma6JSqGh65T1Tgjet8xc4pmUtJnaA=": "1363636000000", + "v1oJizOICi8lmgXFzOCXZvMiqbfrQVF5DiJ1PARnqZg=": "1128677000000", + "v22n8JIQ3ZM-DNHMCjJdg-R_k49xS-oLghlQN5_1J20=": "769230000000", + "v27EC80gNWi6BkWRKOY0uDrZZDpmD6HSCf7Jydm1K1A=": "454545000000", + "v3EhgTnXJat_52FoPVAJot3FZuWwDRwM8V0Skqf2ISo=": "1361946000000", + "v3EzrXoJrg-SCb1c3BZPDBCVli0TpM8vf8ITGjViRdc=": "411085000000", + "v3HvKJ2vSgT44iW4qechH5zeQf0o3gdjg3yWzDSVm_U=": "409778000000", + "v3ln6Tqet0dmqwM3tpKqb1UPhGGK3V1Unj-kzqRbybM=": "554737000000", + "v4MAD54DzDrIxr-vNfPaDfYLlbNd2Z0jj0kl0w0JGkw=": "385507000000", + "v4ibvaOmgAMeBdd5VGf38FPhtzMLmGL1xMY2W2qjXP8=": "764698000000", + "v52ZDMDaxiwQt3YnLV44d2_xxOZ2rvayAa1yTPr5xuE=": "499999000000", + "v53tRXiQyxbpF7ggxB4qm382oks04GiJY9mqyaCSIRs=": "462286000000", + "v5QzrqaMiw9Ics31VNThO5vARpYZtYBN-ZtRgyuJ0Ek=": "1741351000000", + "v66hRX1iB4YLfkiLnPSn2nOJNbFWldMhZ-s6FQ_00WQ=": "9891607000000", + "v6VLRktJSRyh0nHgsSTDVj3U2AkUUGT9FPt9hYRgOkU=": "416666000000", + "v6py_wTxOunJhW6HWWUmD_Be0MFb2IHEWk-6oj-sWfk=": "492307000000", + "v70rF_-UT94pdsoxAR4A6Vw_q2co-OlexWXFjmqmF9w=": "18181818000000", + "v7C9SKh7MivNfbWn4zmcv-mcKQTDqg_B1VWlp0R8MN0=": "769230000000", + "v7HVPoeNzUmjb0ADjQqn9ZN7qoxhK2mHR1bxAm59XqY=": "4999999000000", + "v7Skq36UX9Ypo3LVjrvwr4dwPj1PrsedlOpRtpJVfHs=": "624999000000", + "v86r37TE8jrPi3Mp1CwpfAZVqPSDWdXPqBMpGvANuyU=": "384313000000", + "v8GTbon7ICTSAGtX3W4cuzH5cTgrr1p1HWZBq8kdJdw=": "461649000000", + "v8KTI3eokxZlSFIoIK_femmOB09Gc80haUsDZKqRxN8=": "407808000000", + "v8PENhMJk33nB250RPBXMCTkbG0Hf3I-_7nQqbddNtU=": "1249999000000", + "v8qNfz7wgvRKwXgeHJPqJpirYSIWyaxjs701Lr5xg0c=": "406308000000", + "v8ukR1VotHNVGGtXpxPHqoLcxbA0lojHIdnh5j6mYuA=": "411085000000", + "v8uoSRn7MLpqQgiUy2R_vd4jR_KzYMu8M4kUIR3ptAw=": "501207000000", + "v993c7lQV2eHb7cKmIAgC8767SuZd0S_gVMDQUYBQcI=": "458340000000", + "v9FAgrdIxMs4VF3qfYXgdTpfcmvADw88d5lE73eIsVI=": "384615000000", + "v9RghEHCX0-_R0fp2JTfb2BZk1kXZxQA-2-FKZT-SZ4=": "459977000000", + "v9TapadujaMxnaV0x6bNgfBCQ9buNMCQ2pX_Mxm7KrQ=": "377647000000", + "v9UyQXaata3MQV2l0P2aBXLduyTmYm7Rbw_onIFB8NI=": "458716000000", + "v9Xhyi0ga3g9Iay9KCVo4yWClhmVwuUGAkchzmyoORo=": "387226000000", + "vA6_cn5BdPqqhgPbBSRiawHGiDkrM6PFMZAJTbpuafo=": "385506000000", + "vAF1CGDzWf83m1SMnX35-iNqFIPCfDXAxgrNiRW7PXg=": "392676000000", + "vAetCNwZNoYEp4K1owbEgvF2yhrdPjQkSm_oX-HC_7g=": "464997000000", + "vAs4ASFCgOFApkDkc7bN7ZF0bvP6w1JFFQPsplVbtKA=": "465876000000", + "vBW4zgqU1-vfhNJkDqyfb8dLZueJWI_hVRkY2CyHvsE=": "7499999000000", + "vBYJzsaQllNLadOmmiTHh31mqIbH6JzsrphMvsFcEe8=": "471887000000", + "vBbJzMTbikeoLxQCadHvEvsGUC0hsMTZSINMyff__uQ=": "1249999000000", + "vC5qoc7qaRzBnDFQ8WrFwtG3EjIyuWKk4bJNPd_hbto=": "387796000000", + "vCFIiV_yL7C-564eaBHFLoq0G4snRJ8DH3XzMLPKX8M=": "454400000000", + "vCO4u3wRZd0UP4fcVRexvBMUe_xKXOO9CGbBExsY3Y4=": "417631000000", + "vCbG4LoaNR0LLE9h-4gnm7r1Vp_rz3GY8iB-yI0uwBQ=": "384615000000", + "vCbXR4t5UNI5c1ajWjI9vLO2di8RCCI4VfZwmFxAq6U=": "460237000000", + "vCz4YSIsGb_N9-3iHalcEUEjWmDAk_Y-5VgMK-rylS0=": "838516000000", + "vECT3dcLV7EpEeUc_ZW9MN6xMHnUyRlpPi3g2ZXYC-g=": "1151408000000", + "vEkFD071vf3qjb1VUM7Ow8JoUyCYikEMaevb6SkJKHU=": "4036903000000", + "vF9fVEzWJMNSS_JxmDoP2mLSs_N2M3HpEUILlIS6GtE=": "385509000000", + "vFWMfm03C_XvDgh1yJh2IQx_BBRtZqGdEC9_9ctI-Dw=": "4626613000000", + "vGXYSsmyMN8kYFkOlwrsX2o-x0NZhiIXIMih_w39tkM=": "827201000000", + "vHSZRRpSKcMPbSnW5N01gYLhGKZmBNaqZSzlVKaWcbU=": "504003000000", + "vHqZsn135Nz9_xevuyjScANBD57yIpUsSKEGLrc_UFM=": "461906000000", + "vI5kFPn6wl2-Om_flr7whSMH6wsJyNlUKWwVdgJBuuw=": "447095000000", + "vIRZMSOPiKVlH3VsGa0AhTLyWtYsj_An5I1kGjURzkQ=": "381802000000", + "vJ8i6uO-p-s2s8-6qgZHs2hstPiQ0A6PqwuK_KTdU_U=": "420623000000", + "vJCLW03uif5mO9z9DZOJp8DTlEiAimlxy1VC6FFACEI=": "406668000000", + "vJJQG2CO03JSGQ1b9jNzZHTYEEPcp7UsOcrtAm0ffG0=": "656788000000", + "vKUQka5jaDPIQLQYu23GR7LhPLnKeZWrfd7KJQI3m3c=": "507660000000", + "vKiB6Ant4y672bUfjxAvasHHnoygN_xn-qWOcuuZgYU=": "385510000000", + "vKjPkzgE0BsExsjOSnhJfS5YWQ_9sczkXNhsTb1Pavk=": "376209000000", + "vKsREJcbPEy5k2e8DVqe8VaZRQcrHHbz-P49aBGipkw=": "354912000000", + "vKx_cLLW0YDOSWhGvBOjd4nS3yizjzLDYHohVup6imA=": "909090000000", + "vL5aWurjOWyf24FCW_4NZtE8d32pT_hGHXATqEKMeNw=": "2057170000000", + "vLMzz0mQMcCCeuRHzo3h7YSNe2F4IIobO1_ARLpy3d0=": "455303000000", + "vLUc0zCQ5PyeyIlNTMg_I7sjfeltMuZfilJye-V5P7I=": "384615000000", + "vLoL_bLQ-vG4blbiXNPYh2KXG6uOZpiIyPAfRp3uMbc=": "902683000000", + "vLpO4s3gkvVjlpdcN1-wAVDjRU8AatMnyWfJTNuzB1g=": "1364904000000", + "vM9x3cYKJtv7mePG2ijLSfidVsW-LQ_Fa9IfxLbQqQg=": "2917262000000", + "vMWsRWmalFACov7nRehqsBYM4wxkuKAg1KPC3J_1Qi8=": "384505000000", + "vMXZ4SoSO1Xj_WdIOPSpQVZnwq5C4edILItwCS7bRr4=": "783595000000", + "vMjYnm46KtgzykPgHCh49VcVm0o7rM9PQhiZ71-yPzI=": "2064318000000", + "vMsRcMVqadmBLJP1aBzEYXasUeS5iOgsbakVVDsZ5SM=": "461998000000", + "vMsYL4zVGWO0WWw71cf85uMM8JQqxPKm2pKG2zcczIM=": "3846153000000", + "vN2MK5XAaYpF2wnTZl4kdoFm95GLo3hHVzHo5TSZfCc=": "456067000000", + "vN9NtUCL6YOIfeofK_qbChTo3wPora3WuiTkrQPAz2U=": "1927533000000", + "vNI8MOaZL8CNvLee_QjkU9_HIMD3y7XzS24HtrKpvao=": "796097000000", + "vNOV_QdMIBoyGzpNwi_7wBcnm8PTfHuXpo_mFfVNoEo=": "613636000000", + "vNRR0Og7Syr7tbgU0Eb2ag_DRYqiogtZRddLfLNC5Yk=": "1732491000000", + "vN_u8QJXrT-kAu6JK7m-On8Vsl5ULlOSNrvadewcXmQ=": "768007000000", + "vO3TgVwgk3nAkH0tjebjX2G-YRUME3A8yDgCo5DkpZM=": "8467411000000", + "vOvkuuEXQczDaHJ9mPTegYHgpjC3jWQ8y9_7Vt1cncM=": "5384613000000", + "vPDLWmGcGIe9QPof8ruNxblgZaGLLGhR2bx0f1Zu0RA=": "769230000000", + "vPT9PW9xBz2-kLaXMWRNMvm_tB86ZIdQKRWq7j_r4Uo=": "1007069000000", + "vPXqesbrKVhy4AbsKKWc-YJMKypqcl3GR5_dav1t6Hw=": "384615000000", + "vPauoM_V0TL0Z1ht4eirRneK5P-oRnIhaxmp4EB9IPg=": "416792000000", + "vQ0hQlyfQv1jxhFaqPeIw-lvwbCIsSn24cdTU8cxE8U=": "833333000000", + "vQODivoZuDNyUZcNl3GGbowPvZ4dHUGDlLHfYqPMM3o=": "2020135000000", + "vQRk7VkFVRojLdNUF4PTJTPKMudSLu-paA-R0YHFhyk=": "415426000000", + "vQRwQRhPhDK38FecM38aNvI8Bau4ryK0a0IhsFhL3wY=": "456104000000", + "vQp3ChfWoyaOMUyZE4rP7PGwGx3quIVPVJnrED9QOJI=": "446197000000", + "vR0fGKf-Bu8xOJo77dwRaTNLhP8b9z2C314TstgFrJA=": "4621453000000", + "vR6sIHLK-LbyVaY0TXwyUfzSKbSG7rFX8qHk-oOd_0A=": "382755000000", + "vRBPaTHvtiQ8-oH8UG88f0O6BjSUoemb7-keiIk3eiA=": "1039074000000", + "vRRZshFmtNoHHyaf5OU9evo9DoTT520pvYTAGYO1Uck=": "420291000000", + "vSjo29gZa9HWmh2MEdxxvOwEpyjIi6Vcphpxw8ZJrjY=": "12500217000000", + "vTAUC4gVrx3jFzbc72bg_uBOLzQazhpGiO9s070Zonw=": "451044000000", + "vTritZVdp5NoLG95MEzKsdmo6Reo8w6Hldm3xUKMF1I=": "934718000000", + "vTs-ceZ32hciYkCgYgJ6zi8RKpRn24inqsxyIKX38ls=": "2304083000000", + "vTuimvJV6Xx7gsVRq6BKMH-UVGLyfxDgpAO6UMVG9xk=": "1882865000000", + "vTvl2gUVztaGUXK39DpKyRi-95xkpDE8ptm_qIUmcUM=": "384447000000", + "vU00dBMogm__yXtkLxYqN6OBoJPjjZHQUH6nSfG5GbY=": "466456000000", + "vUAglSiiX7YnpWVuYubXLFnJL6rC-lU7-5DiJi7C5Do=": "385507000000", + "vUS8SZC3ktbhG4xuOvhe9JHQBlJS0FmXTJoXC6FeNuo=": "593934000000", + "vV8lbXTWVT5ektJALnLmWr18DXggHjN7TFUEUl7hU34=": "384615000000", + "vV9F1kKKsllmN8SprY-t2LvzrSHTiwxTrqTEpyLYGus=": "384649000000", + "vVAm6XNB0CQNlCkHl4DF1Izu7kvU29Y2-YhcZlpfOd0=": "472288000000", + "vVZ4IHEUTjDX3TNzpA0IP2QlNl8kpEHSMYTYJLvDCHI=": "6248133000000", + "vVjaO1ddVoXUzLtgkx9fTkkVBnltAWgj_wUlAGzzGF0=": "767905000000", + "vW7xprFclM23z09HzBxFQy4QEoEYxfOIZD5HfdqkcqU=": "2272727000000", + "vWK525RCFhldBBDeh2LttQ0_qEiDbwnvjuS1dGZe0FI=": "410399000000", + "vWdMyQ2lYPjGtjq05V5mrl5Pb04qohnQx4vvjL497Fg=": "623649000000", + "vWhKqGMyx4gV1MBexZ_jCMHPU350Xs1A-5g15qYlRPg=": "19246500000000", + "vXd7XGcuFA7Nd51Sutj6g0Jh0nHEzOpnSYf9QHfvYJ0=": "385507000000", + "vXwvyqzeoV6yp5o3iMFZmxJLLcrmn43C9iiKdOz4E3k=": "384615000000", + "vYURTeyJHM6TtSLSt9Z9TS9dYIFRb0IAzLDdBv5xU4c=": "3817675000000", + "vYZlUnYsOZGuIKFiDdMOPz0dIEjW2o9yGDG1O8sIhsI=": "458982000000", + "vZJCmNBWWHOcfBPuoYdJUVUN6M38UM-ID8rVkgWjqFQ=": "460896000000", + "v_4k7OPXpapuLqA0q1PvIDmMorfRcj8hqpt2eE0U5Bc=": "1366800000000", + "v_O5kaNgY65taVfLstSi0ctv6Hv9S779nbi7zv-S48Q=": "458399000000", + "vaT5ecsIdGK28EuvKGNq-EaWP2uW9RPqfH_psVHrfhU=": "384714000000", + "vai-AlIJyJG2nqdQaZa_rivWPAW30YVU_7lLKQuRfjo=": "416666000000", + "vaocbfT6_Z3HwYi2p2X2XUTNkXM29UsBuUgTL3o0qOg=": "387464000000", + "vaq5g2JEmg6eTN4cTPsZ-kNgdPNYi1gWvGjH0JdqzIQ=": "385229000000", + "vau19RFk3AhsCDkpotsBgA5E1LCsDBVnLCmdCVNoI9I=": "2505818000000", + "vayjHU7Hnk3I4gx29ZBR7jqc_OlIzBKbvLT_5w3Kl9k=": "769346000000", + "vbTu1G7zOAeOcbLvthuPm-F0UdYXiqXmj7_12JbkrYg=": "1153846000000", + "vbU2oFSj4irdMmXzkS8NpxNZ09-5FuMQU0QUnCby33M=": "2392932000000", + "vbUKCK0YbAz9ti5nUMsgp7YL8IazghU1pHZf9umCkn8=": "1215264000000", + "vboeCDe6jjMtB7omrIH9Iub5rLcAZTn7U0FuI-SFgqk=": "384615000000", + "vbqG75sq2hr9XNjAUo0R8Ixspd9oyMxaUVjSbq8wISc=": "2114959000000", + "vcqb9pb33jQf1-OfPzRzKZK8mvg2agbYYSwClCEztoM=": "1819478000000", + "vcrt_6m-i7YVRzTaC0I_emUn3QEsPS5iIKWIjLtWE-k=": "385507000000", + "vd0DF_4jyGiWrbiy4qRPcs2FIjatVGCZJlxX4ul2dzE=": "408304000000", + "vdZ1MWO_zEeQfa8Jr-kUCTpu-uR8AQJmyEXAl6Vxn0Q=": "464459000000", + "vdeoFDo9iG7dWdlnIYatflvTkULpAcor8C_nExyiGPc=": "384615000000", + "veCtTQygOAryRxtYuwINKxeUaiUqhhikdL9u1t45bmQ=": "1223425000000", + "veNgKQhxXMIbzEISKiNbmL4pHxdFX1ImGpNXeyc7Iv4=": "416666000000", + "veVdxEBsU46Eze98mCmdg7Cig8lZ_aPc-QmNe7gxrFg=": "465433000000", + "veZ77a7Ubo0HAE0bDthNVWcLjKICrFfa1zN3HDUDgxY=": "909090000000", + "vejEEBUY5sZL7gnHJiUIo0FprEhvsMkW0svxExFMwEU=": "4044402000000", + "vejLnZ6coMxQnssU7SqkVwoxzxgRdLMO8_Rh_oKpD6s=": "389414000000", + "vfMzboyhWCD88flnzy1IUu0zVUKQIiECPYccXsF_Nzo=": "20452092000000", + "vfNZ2ZIAaiHAPtGa4RSDIxYHMHRdy5XDralIDywOkvs=": "390606000000", + "vfS3gyin7X-_jRccV0wIElsO5FZMBZIjZbAeW1cGdn4=": "1900132000000", + "vfxsy0iXO6fzzpDSvWXs8afVxYZCSLNi-47Mg3HYTN8=": "384314000000", + "vg2tr_fGkMcgXQkm352Q9T4sDlwGXE9A_MvxYkM-nvU=": "451910000000", + "vgY7g4EWnicTbFoglWw9UocROEX_3TQZGF3d3-4dCEQ=": "770221000000", + "vgn934yJcjfjaksDtIeT-1M_PEHMW-9xA-17q6pywGY=": "407808000000", + "vh4o19m03XKwryYu4HQ8cCqz_aMwZ21YaewKq_L90NA=": "385505000000", + "vhHRfCmRrMmI9bgTN3fkq7U2JTd_Yu9EGI59lX5X8X4=": "384615000000", + "vhcupkR-nSb5VBdeLO5q4EmHoH2ldNE7P4P9nkqy_aQ=": "7486720000000", + "vhnryQZ9fdV-Yxr-yPKJ1P6uTeEe0iWJEVXMsdHY2zo=": "382394000000", + "vhtvGJ9grMr8DnU7WBCM9BF7RhBu_7BLC_mGZUi_Njg=": "417634000000", + "viWXUcG0V272lrOnu4qGqwC_aE6vH3rvOzVdyHs9Fyc=": "455337000000", + "vj6PoNLJ04goXWdo116Gn8P6_yP_ZxM3lGFOhOerERk=": "4233705000000", + "vj7L661h6J2j1L-ynKgmjQfLRsa-NaZqvO0z8REo1lM=": "2017111000000", + "vj9qk7-b9zbpSxxY1ghRP8tuGxmBJ4o2diRtI6KnwQc=": "1789326000000", + "vjhLO02K4ZUGdmscaVAmUxgtP5EKkfD2D_sVVmijOrY=": "413732000000", + "vjxQgkFg2RprRRa06XiwopLC6xJDh-f_48VwyckYV84=": "3635881000000", + "vjyyk_LO_IwxbrcCs8nCIaQidKHUUqJ_XIiEmPPYe3U=": "926068000000", + "vk53SNivCuiWEoj29IdvN20XBBnnyjJ1J4NpyBcgVGM=": "649928000000", + "vkXEK2GAyfJD2Ya5Jr6seUIk4jyNhdFrch86WV50pfU=": "1134771000000", + "vkmHqtVVmdxCcNsEGBCTKP2TobFz2HrBfapa2MGmjZE=": "422558000000", + "vkwgmeZDqn8zkfDX1EO-4_Uek5Snlev-i65PnYP7Pco=": "939231000000", + "vlMKAVjh2x2CmXV4uaELzYrYEr6VdCh6Iq1T4A9zuas=": "3076923000000", + "vm327F5DJaKj6SQ5trEkh8FtUf7hOZVONAn26kiSoQM=": "12499999000000", + "vmZ5338U0dLUuXcshAhytGRPlhp877INChsENxgIt-o=": "384615000000", + "vmZ8WMcflInDn4nR1WrzSMXH8JnnGxeh8zjOhm0iXxM=": "385505000000", + "vnII0QeEeEedrUc7AiZoW8xu38dXdBNBUQP6ZWKhFbM=": "833333000000", + "vo6j0qguY9xKc71PK-B33P2SAxVASUMv7lEbVT21eZE=": "1540046000000", + "voHZ6rr4ls2yTJ-M_JBjDZ5El_g5v9C199-jloQAP6I=": "1039481000000", + "voPzBNbDFugB7Viv4XD63Roxt-IrqbUwD9dW-v96d2o=": "833333000000", + "vodhGXP8DDiq4AxVyL33IPxQ50dg7OZUoEAajTcnwj4=": "1156518000000", + "vohrB-L9A_feYXsz8TKNIDpkRXz3k1JgpX1fPeEOgRE=": "649467000000", + "vorRDdYnjxcDJrTE7dmIyCdD7JXiDl9Ua4aJ8MOfpQE=": "388461000000", + "vp9KuGsu8VTZ6X6hZodFmTAge81dDDk0TOJPHk-9bBQ=": "449522000000", + "vpEhZGsWw8w9RFF1DFKqOSnGoJZ9ONL71hbFIRU46uw=": "2916666000000", + "vpH8IuUUMHTp3WEdeXc66K3UVkYRtmInI1KBthhWvMk=": "377391000000", + "vpKSOkawmIeRmQSAD96rHxAwypuMlGnAmdCHEZ6Q7j0=": "379138000000", + "vpbnHv8zaxtYLClC4D1TlfWDWXm2DySuXmt6ob9uTn4=": "418546000000", + "vqBn6RLFekS-pgLfN4JLrXeXAjP3fwsJsfnMjMgKPcQ=": "756639000000", + "vrKVL7lgNCNlFzhw8b1G_e-N0wSkz7an7ijeEOQxa4c=": "3846153000000", + "vrKmW9UkxPovt5i6spKB7Jom9aUSdO-cuSF6iPHENck=": "483442000000", + "vs1EmMlXaBfXpAv8lA6UEGXyZlB8_F2ty_9J98kdrS8=": "767422000000", + "vs8OSYfGxlMJgUJhPgpSRAX8EgqtxIDDIvcTG2sH8SQ=": "420768000000", + "vsBdJg2fzrO5ka1dOVyOPEdKMNJXRxxVu-O4z_Qc7do=": "786938000000", + "vsC1PcM8iA8I2s2WOznHMPYrEhMT3M2ExZbiQnJ2yB8=": "636235000000", + "vsk2T1CWGuh_sshwThnmjRzNwbflQB4xzvJuJ1L2qPM=": "394620000000", + "vswLZE6ZXb5rY7WY3HPcFY1eJhqK8DB-DV5_uewOgmM=": "421678000000", + "vtLIp5czwHu-GgfnUoxFyGgXkoQJOetRkjJedfDQdWg=": "764799000000", + "vtdR8uvK71QMeEGDayX8aaJcwhXAH12lodFqhK-wdV4=": "462687000000", + "vu8001_OeEFB0vkAnhXTQzMZX-VpZGXP_jH9nmUhBcY=": "458176000000", + "vuAbY3dppqJkve9SzA4vhTleIG2AeXNklzD8zHXMSuk=": "12136055000000", + "vv7sgxdlqhtjK8n44sCKIrUkCxblgoQKsv9-NKEa7jI=": "384615000000", + "vvFNzLexWhZy4n6-MkDTZT9xZg9lb9NT91Vt2te2FNo=": "1354022000000", + "vvOq5dcsqzpYVJo99dMFMU9sMuj8H4j78rXM7SW7pQI=": "450406000000", + "vvR5sv9v6YHec522pn0VnJAnxfMK-VP_GvFfNeGY1Qw=": "4551250000000", + "vvfRVfjINpH2EW4g-1RDHGbGOhXalTBTq5Hnd2uvwDI=": "388549000000", + "vw-VNUVaIRwbXUj7ICqFDYqYIGO2nSDqa-OjwfYl2aw=": "384615000000", + "vwN78QJlnFSSw4eWiRy1cn3gVaQQ2LICUPG9ywTMLT4=": "844724000000", + "vwSZusp1P1dJSN5B-0zz3zLdFbbFUqvKm4lC-LJrVVk=": "408021000000", + "vwWGccPc0kT5w7bFw6tzbIPU9lb8-D1KzDxy23wtybM=": "2088168000000", + "vwZ4TZLsflSw5UENW8v7HYneOFEwX6kMnitR0s4lKPY=": "390778000000", + "vxIWkm-KUnDgry2mB0GYFYM8M1O20l_hUpmQ63FB0yM=": "460013000000", + "vxRX4i6ysT4zaP1cHXEued6SBXN1DcIhhb1tevmVwGM=": "3737207000000", + "vxlMmKtZ5g2UPIR21IPfafSj2yuFutd8W29R1y3hMLM=": "411085000000", + "vxnuX8IsCZ8QmuModOQjSLDRC8iQ9GDHxRuVw7BY1hM=": "1924371000000", + "vyC80bqymvZzoo_0OjUnKKya3GTGsgdqdUpX2E7Yc_k=": "377921000000", + "vyEIwToIiklG8zV58l5EbZyfwnf30M371ysXxHHMkkQ=": "386486000000", + "vzD-SvxrIwO8U1C1nYRnUzcV1OhbKRlNf4PU_e_bIkQ=": "3773099000000", + "vzJHLygg8NcgbVo36sfpdqmAjWVBqavnAHd29y_EnzM=": "767421000000", + "vztQmrnLA5ValxT83DU1t7uhbyxBKiAP_uTr9aG3jGQ=": "2269455000000", + "w-Uschb9yua1rKz0RHQFab9NFyMVGA2sFYz9sKOaDvQ=": "382687000000", + "w-YVgq4qgBDIXcgXlihm2zJmbFI_ZOiM74Vhgsj0PXI=": "384615000000", + "w-iJJDHUwAoOucJp7cwPgWAHeRmheEVQrExdeqVQff8=": "906471000000", + "w-jYZxGD6c6lKcLQ50QEk1H2J97XaCX7OF2JsJynwqM=": "383807000000", + "w-zm3Beg0x8Knv6N2_OjzM11ppHblU1_7X_h52ekwIQ=": "1344010000000", + "w0VcEiI93DoHuWYhKGv6VvRBWlGsPa1KCQvZsB5Cxis=": "1628608000000", + "w0iNvZyv0U-spQEQDxvMD_48bKJr3edwvRfKj-Gl6WQ=": "4061679000000", + "w0rSdSf_WmHg2gWo7LR13j3GCYDMVBR4N6wTM0KVKmI=": "384462000000", + "w1NpICpvPNwzMT9ZOD96rG6kJLZqH-cfZU89H4v4sPM=": "1524239000000", + "w1ffopg3noN-5-A9wha3oMc1xN-HI7aGEaXlia_GpDA=": "382838000000", + "w1nKNJQVEt0IdLQ7i_mpcO8XyCVOZ-tg5LPEohR4n8o=": "9975689000000", + "w28yBQYuP0lfvbgaOGoFrWSpqTAmTfwxhSjVeYX75HI=": "480803000000", + "w2TYQ_cOHFtScO4GZlmvWK6XQgF_rxR1Qi7f1WJ1yaU=": "3689236000000", + "w2roeHtR5pTaiXLQzBrV5IEG9UQ9ir44dqmVOlwsg6A=": "455600000000", + "w3DYeN0f6VQjtAC5BrrJScJpx1_1Kp6YeCXS9BOOhGs=": "542615000000", + "w4tbKFTHKdR6zZzDOoiEZU_YpSBkfpqBV3vUmHAZKlk=": "460976000000", + "w5fV5qrldEYUYsT3-U0rj97Ms7vv--RYUj1Av8enEag=": "566370000000", + "w6GiYUNv1fBVZT9x6ptMK3m0amEpYspIuPNjZ3FT3_A=": "385506000000", + "w6LAJ5TcHfBRcTAEGQyQvn3IMF8ZeUMiEvunpCSDaLI=": "995850000000", + "w6Xf9W5Zg1SHhZPBwreGq1GfAQ6xDDTYrLmQgCI_Auo=": "3612119000000", + "w6Z-KZAsAzTiXbMgMnuffjoCV4fayhvGup-YdkERhIY=": "407808000000", + "w6g66FkJy3e0ZKXtNwPPd9LbhjFJybeeQrikNVk3FKg=": "385510000000", + "w6ykyz80S7jUERHATfryL_5GfuDXrrssrUsj5bHiKcg=": "910115000000", + "w7jJjVHNT3XgC-rCtbmyCZheQmKxnTcJdGDOlRHcP6s=": "417698000000", + "w86DXxd_bb3G-_b-7sSZQG0FCv45KaiqJnzRuOi6apw=": "378833000000", + "w8r8wLloGoihekxMRX64js25LNw-7-g4QRdr4uhH6R0=": "1666666000000", + "w8z-NXZUwGI9ZUFMOl0idkO11MkSDlF074YgXC-8epA=": "2000126000000", + "w90EdqNBFn-DcohHQUg9dRgRv_TlIFRl5hcJsQSV2EA=": "385721000000", + "w9GNcIMYPWwfUdcuGFbAwLbCh-ZicwmmuhyZZfuW74s=": "615115000000", + "w9HB_litkqbxdbq5452ALVVLlUP2riXEvjE6CLImsKY=": "4166666000000", + "wA4XdLL-RK_0yudkomObIXaGfqTeXSkJKMQZv5QiK3s=": "3179993000000", + "wADICQyOkwRngt9fZbbzg6HKuesqkpTJunr5ZSnmmQc=": "757357000000", + "wAlXqzF9ACuHnk5kb9JMsjXPZT7MF0QkfU5boAYbzNk=": "7390122000000", + "wArleRuKvytH5mkrEReIPB--SPUEpd2IXuJtThZBxcE=": "2090909000000", + "wB1NYUYhmGLiTIvq4vhGyTCz3dAr7HTn_qRtblWhFkc=": "385252000000", + "wBRiz-s6KXzmTts5NT-cCLwmA68iJjfVT7NckiPwdJM=": "15384615000000", + "wBTw9XQGapYGjt6N61oWafgs2bF5k4xKeFZcHBuTtBo=": "420102000000", + "wBYHjou35Wrt2Zrz_Lp4_qjgfJMjZ_btFB2wu3GLIRI=": "455600000000", + "wBzkCl6iwuCsHdTzmodXxMBbTi2XvDTqwMH80kkd0RY=": "545274000000", + "wC5JFM4lN3SpmIXzwCbsW0Cj3Y9hmUp4TEBG4WIaDhI=": "457680000000", + "wCe7zvMDJwf7ERhwXOlul5hhvid_FjxP4qkI3eeiNDk=": "417630000000", + "wCe9NMu-C41fo8taTi9DqpRu2shvEK3QgUkkh25CJNY=": "565687000000", + "wE4QoihIs33kX1BJugP63hh_pWgnI4e4cvOblpP-C_0=": "569159000000", + "wEENJ0S6om_WzX-iak5H-GZYhTZ9P7VR2zwXawrCACs=": "929867000000", + "wEheCG6ky-3NxbeIRDGvU3NGb8jSKnfXqIzm4T23EBg=": "385413000000", + "wF-bZjNF5srwrf8_cWx2C6VPYLAMye4ZwwAq2nT3JwE=": "455600000000", + "wFGNqFmZw7jQObMhX8sswGK7TlWwzyMmDo0Nb-XAjNA=": "449601000000", + "wFTyR0dsLrv4tigbgUwizHF5ILPHmA7rPRxceZpm0TA=": "368565000000", + "wF_eyYPzoKt6OH5y-4wfBntTjcmEvwPG96VwfGm90J4=": "1905619000000", + "wGHikFwao54GNa7olG8gBDySA-3F0ah9f6xvGRnBflw=": "465433000000", + "wGJ2uMs7clxhSKgIDaVpOeMSkrJmWQ1hzM2Nd1PPRO4=": "384615000000", + "wGeauzCNjL-qcDtoY_gjBF7GDjizOtPudhzAphALL9o=": "3846153000000", + "wGsNp1C-QUwOp5Ybu05Qh7wX4MWTIXWbxLzOkrixo80=": "385228000000", + "wGyhau_Aa0cXYaBllybTmplHmsFDJAofChX5HLua7N8=": "2004111000000", + "wHbUtDqiuIY8GjvPQDxuCcf8kXJzE1Js1FGFIykWRy0=": "385018000000", + "wI0m1kzK2-t27SVhThNR_HEwpjRQa4mYoJ0eH2_SpgQ=": "376889000000", + "wI8v31xBzlVrs3fAjQP4IyYT_h8z-qw-_PSwwPMHZ94=": "768095000000", + "wIE8RoqKSB7R2Q4iosktPBRHONPnnMCLxNT6e4Oqw2s=": "4137837000000", + "wIs1N7NvwMUC6TUO5qQFtIXVtygnJUnHwgWeOmYx6Gs=": "900447000000", + "wJ0JqNZ93xm1zchxPxz8aoH2Omj-ZymqBo78bxtWcgI=": "20330855000000", + "wJA7IhHZzABVN-h2KbWn_0Li2XoYhpCb9s7p4ndRgcQ=": "499999000000", + "wJB-I4YoIve9KipAwE1h2dT4Bf_16WdHJHu8xcv3SwY=": "453645000000", + "wJE6B_rEk3oDpPxW8Q-wQcZkqUmRkVVfFVkUnhHy_Ps=": "384298000000", + "wJeNrZrIH6neVuQZBTPQxZja32e6OtAhQHlU6V2In9A=": "691925000000", + "wJpG5B0awJfJh-AmVThH0o08hRSAzT0EC1Dl7Ykz-Q4=": "377736000000", + "wK8wWAfcqH2QK9BJOJ8_0jL74WXEY0z651ASHeWyHlc=": "417273000000", + "wKE5w79t_0touAlqUuO1se_x8qXYmCDNEWUzGoTmgBQ=": "1922224000000", + "wKNIslI16Bjq1_ckI9s7VIomphZwR14Aojj5PcghOl0=": "4976836000000", + "wKYmQdEwcV-2B8RGq5UJUO6_FfR3uzntYDjYIYM500A=": "384635000000", + "wKhFLeBY-EXpefxS_tVR471Y_-9FMeVx6F8Ldo5J69U=": "4199066000000", + "wKovxO-MHHxjtmJdFaBjjqlB4nBInyoRkKVMKIGypf0=": "384615000000", + "wL6FAXRKqU3TYlFrdBX0GgSGK87wEb1SqCNeTkapy8c=": "1250909000000", + "wLP5IbFBmSKJcyYP-Z-QrfRUIP8a1Eexa1B4YIpFkO4=": "377309000000", + "wLRJATMaRkdZoc6Psi3vteB57WHC32mM9oPmMsyTnEY=": "416666000000", + "wLb8FQ2TBzj-WOUgKu5IYbBysg5zrCDVvwOqib3hbHg=": "381767000000", + "wM690P4swPsndI9XH7ui_C9O2ZGPUVe1gwEb00Dc4uA=": "377583000000", + "wMDbHcXONWc0H0KSI-_52qZU4pYk6iE3192BrLFo0vk=": "827107000000", + "wMG7c9kaESgegXb6x64MAA-gIlxPNlFkapxjxZSkQUg=": "382429000000", + "wMqj2ZzoyRs2sNwcJlVtTv4DBcI_cQNzkM--83ZaKbo=": "383982000000", + "wMygECfwUCdlIOqf7xYq7-jT6_4tupz20HGDJkmPLX8=": "719263000000", + "wNJLM5C2oY1v14_ErFT3TziYBkpiDP7UP4LiMb4Y-X0=": "459483000000", + "wNurUnEwvCdgj6ayLr3QdT-wymXTd8rdALsvgZ2_UMA=": "378103000000", + "wNzPrf3hFC5yKc_ZlYl8CaYrIRrziV4ibC7e2PAYeFc=": "3823944000000", + "wO5k5YwMnTCT333QTc3xGnfkN8skCrYSYlQSXvvOQPc=": "464494000000", + "wO_meyM0AatpQauzq7Y0fPHVHyPW4gonM0kCUIBhm2Q=": "383695000000", + "wOgdcXzDfpiPSqJGBz_r4jd_xbYDFbJ1_KLdsR_B4-A=": "385509000000", + "wOqmJJXUreKUUuDJrEry3qRhU4fSXvaCA1S0ronzJ0o=": "768472000000", + "wP1fDaVIJOQRJ0Eore-ixuynGVKi8i-nOm3R5qQtU7c=": "383598000000", + "wPBN072YvgrZ4SP06CMim6CjOA5TBkKBTzggZkLJInY=": "843188000000", + "wRN4xd6IquWh4DipuIDsH2fq9Ht1sDSkqpClLcXWcN4=": "381767000000", + "wRT0LmqRO19jBSpPrIUSw7NHuSuq8zsow1BE203tfXg=": "384565000000", + "wRg2xWFcY2n9kPTKf1cRFLtUccIa2XU-Dr--E8mBX0A=": "3027209000000", + "wRu3NMMRID4WMv7FAmkATO0pKD7NeFvtPy3yKPALuSU=": "414531000000", + "wSF7lk_e970R3e4mvpxyOAbBa8nhrM_TgUMfavT0Mb0=": "419377000000", + "wSrHS5aVes-nnm36wpfiLT0dsT9vpyUnk5KR6fNt98A=": "415461000000", + "wTBJJ7JYEhQNpM2iykMQSW7RwEaAlSN-mHbVe4EQgr8=": "769230000000", + "wTcLCZsHwjsRhHJh7XTXDlpOzedT57c_TchKfb77sO8=": "382986000000", + "wTdJU8PR3vv8zWbRq7ynaX9Rr2ddTKe2XLj3splEk8A=": "434104000000", + "wTxuQlb6BxtIaHRzFP2XEOScwEAMkORxNTUzamOnSjI=": "2500138000000", + "wUpYVROz1_E22TgguIBf2Gc6Vr_LNgzC7qJ0uQTVO8Y=": "384615000000", + "wUxiAKR6u-gmtQYRkpbAZB1QF7YNra1jxSZr3_gC2ik=": "6923076000000", + "wVEcX233rRIV8JqhSoRjkbzokXGvBZPTcysMfE-nX6Y=": "16801246000000", + "wVFbaCsj2yP2_GGj9TdiQCbWxqS8yEdNAz5GLc3pfRw=": "3846153000000", + "wVb9uC_w-WbOE1JcaGARvZCb8aS9Udxz-O2ObnyGEq8=": "417633000000", + "wVoPpsp3useZma2fkdUPIwd4mnh2zYacrKKcO9VECMc=": "769268000000", + "wW7Hn-qe1nKryVsTpL5h6iloNqOC6T5BpAF08GJtapo=": "464954000000", + "wW8u3vm7JN74eM4-KqDGQQP8cy8kekvgZht-JoMKnEU=": "1667395000000", + "wWTtB_iaFNlvGvQjAV7HRt4B3l1FcMivoIH3POhmjf0=": "451615000000", + "wX9Tb7q2bp1XansFwp5_gq6roYTf5Hnc--UDNnOK8z0=": "386478000000", + "wX_clppyLAoBcWrUHV1ogRv1sdP2_FgsmlfY2xIEyHs=": "385505000000", + "wX_k8hZwCtD3bkvM1k376ffFLZNl6zKq3bINabCvOyQ=": "496321000000", + "wXfiVJwbc6pvkJKgib2Nnx-k_C6cMk9mPL1uE2BfoLI=": "501408000000", + "wXmMTV9OWPfwVo3-_oeZCpBqk0aE5-4t6-xT7lefdCE=": "1666666000000", + "wXo-_1MOxt-DfoOltje91ltZrRmpTfG9IGY8oxANxyk=": "417630000000", + "wXwRVwzpl57X6McAZsVzs-NlWOBuJTVUyBHt-_QjKIg=": "769230000000", + "wY5fPFcR4O-PafZR4Wb7L7RKiyD_SPcfws-rVPReqRI=": "1346300000000", + "wYXSQXeiTQXO1mV7Z84UBoh0wTQaFTMoZMOVi6CSuMQ=": "611538000000", + "wYsmGSQFbyxKgoeL7yQukIE2eax0-iDaUkEdkUzNzEg=": "385507000000", + "wZ8tGRwfiHOkDag4dcE3cHhGJLdLQQQy7XP0iON6wys=": "383695000000", + "wZcRKhg9Sx-j9zgJUFWu_KXvLnSwmOuckWpUCCaCFAo=": "384800000000", + "wZqs_LtdxvXmU4f5yIAJ4nNLoSwyk4FWCaLU39cqx2U=": "454545000000", + "w_7cTx6VHi-u9VERW2tz0GnoZjOdFp9RBbQewIrFivI=": "1543796000000", + "w_nNxPkx9UQeOsY1gFN-xxqq29QrHrf7ruhGsFM1xIw=": "1099272000000", + "wafjYcRJ2EndSofTxubbzGZNaVdylwmkWpHmSG1U4kI=": "1818181000000", + "waiO6HcETrtLfy4sHE7Fjt1zPlrC9OQZHsEwD3U3UL8=": "1103408000000", + "wammpxMzNN9FbU8m2RnOcRndrOrBVRwCTf2w5F3JRtc=": "758127000000", + "wauGChMKXGZx7O7pgQTeS9HRK8jIFThnBAryMf0yfts=": "525148000000", + "waz2AY3fO0M_7oB0LbUy0ehtw8-gzQXcuo09hK4YNu8=": "920593000000", + "wbkPTdVooP7vrVvX-r9czWZCRQf2tLeyYfGN9HJUqOY=": "11246391000000", + "wbtEV5xY70LFw1OqDTzFO3IKSrxNVB9IBoN7tMNObPs=": "3857004000000", + "wc139uotzWvMY0ZDtD-M6VHchCt_pruaB0AKDseupE8=": "1153846000000", + "wcSykPjLJgy00nLTV5FNK1Flky71f7zsKykwvljsbv0=": "1144989000000", + "wcytCamBO8pYmm414Ag5IH_ra3wie8rnB-aqoP2H2fE=": "384615000000", + "wczPci9Hv5bNBzK8xyULt1RZEyXEI0he19gMxNX5sZ0=": "406201000000", + "wd2sGx7Fb_QS3vuINp9JPTDp1HFbLCM4mNjx7Vn7RV0=": "1992081000000", + "wdAWxLRo7Zgp3lOjL7yOp5K_maq6Rdpg8A6SkbYPC3E=": "381802000000", + "wdvuDMAlCVBpFoSiak_fWfRd7pyFKLZkvEWwxa2jkMA=": "1617675000000", + "we-B1u0l-Zxre5sgAIbz8_L7V0OmBi3K7RqWygG1oTE=": "3088086000000", + "we26zwDocBFqvfeuqW4YCNHW-ttl23BCmknG4Idk5bU=": "459233000000", + "we2W5WX8_fJ8G_yHQsTwsqo2fRsYeHxr6B1BHIX29EE=": "929867000000", + "we9K4a6TAaKKj_UNVkgVSlDZcpeOk-XPmgvCAp8iDOI=": "794665000000", + "weYx4x9UgzjKA3cJyzz8KMAu_3gT2rw-R_5PQIFD7Qw=": "411085000000", + "wfEWhrpnjGqW3dWsU0sgDmPXoqmdvaYgBiUu53ZJufo=": "764208000000", + "wfr2AEvexWXE9oExO12ELvq3DLCod1CDNr5R8E3O5W4=": "419895000000", + "wgPa5SbXpl3ABbtwj9HUlzWfq4QKycnyt2zb33W7TiE=": "481282000000", + "wgcn_WGJnu8aOnGyQwfdSNtEvLTYf0dhvmW8AnuBzQE=": "4624446000000", + "wgjCpmPK-B_Jcrws-V5_6cWQ2HAgMdUllsfy94vJStA=": "385505000000", + "wh6zcu2xUjBYcFfsZCMlEpBjb6sDEBQli7tJNwzX1-8=": "393464000000", + "wi1h71ZIVCebyfITDH7AIbZcgIUv78LApe8niM2E7eo=": "419895000000", + "wi2JXgxe9fAPe3BbeYXvM3iAyVrkPQ7mGVkEBj1f-kM=": "3461438000000", + "wiJ7BsVyyGIL-THtruN3lJZTok7GUSIfbBhtsPvIL8U=": "417634000000", + "wiUOQcVBu0U6-kXL_JDJIAFoH0GkKdiU0WNWmDGrY9M=": "412214000000", + "wil3Oc38iAXjvC9eL-a_JJOxSnI40dEoNCZLA4p2zKo=": "462694000000", + "wip_q0paHRnXVY1nPp-_NjdfYdVOAwbHC58yMDZWUzo=": "836714000000", + "wjCAs_w9LUMjfPTQhye4lFUm9fVLPugzRaUyp5ZTqW4=": "1153846000000", + "wjamkr30KzB-MBKTbUeXxdl3Qy1RKfSmmlAoxj-zv4Q=": "764959000000", + "wjyci98FE4KoDWBZfEEqogRxdOhPIITbJN99Qdo2jYw=": "451044000000", + "wk2TWuINvR-EXUEqMy5kPaN-AQ1kDkKKeOT0JrM36No=": "1031661000000", + "wkFYr0QQQBv55je3Bc49qAHPgFy4NtPEroTEw4vkUqY=": "1111728000000", + "wkt0EXrjlR1DkKnBVC2_0qesT68B9t3UAy7s3nWsHSg=": "1698686000000", + "wlVfYVcWDtU_BXQGYlRpfyvC3f_GwjCLr0afHPeStek=": "5769230000000", + "wlWN43tEnU0YsGks2AhwWVSA02xTEeb1GRz3C7KHNNk=": "5203820000000", + "wm3MlW_DB9i-rnd9bPCulxKFaStHP7WI5t7ZyUwASM4=": "3584225000000", + "wm4cM3bILgxmx7z3OLoNctrDbcfGX16KawEiggPeQ5A=": "384619000000", + "wm5nPynRkzlFrg7tUe-XDIS-T6VYU9piZue3Xa6pb0Q=": "378325000000", + "wmEFcHkkcKzvN8E-8KPnOzaG8Sz-Yokqmks2o9iPKN0=": "411085000000", + "wmUvTFLEZBYNW5WhuTgQPRFOYa9ILrKEcsK-OiJ8P0A=": "351621000000", + "wmZ5XZ47LFvSUPB-K_f4uuE_kki12U-pvBM9zZ-X9sU=": "383031000000", + "wnGT8QUhrMcTpvD5PhBSYpIZcfGMta7582GjTDWyO5s=": "385510000000", + "wnpC28_v0m-RUEw9_Rg18bl-eI_oqJsbiC5ygf40qes=": "384463000000", + "wopFPU5xRH3BXnn4NPXWDrevjjpjTzrvZw1OftgWlVE=": "1810183000000", + "wotXOB7Kz4BNx2fjjbTFh1m2GgoNhHEiz9k6uhlHVFA=": "985999000000", + "woyau5HhdX1vcA47OjxxwYKFRjsN2TfG_3WV7lao1SU=": "36618750000000", + "wp7KNaMqxEtheUN0e6vtzx9EDNBxCgHPWcCvaQXps14=": "411302000000", + "wpb_Zea7nd5f2X99mVmIuQpaSAj_CC1SZJY4BRGzkuE=": "769230000000", + "wpgr6R-lS6wfSY5q9qMrmgiDPeb238a2a2eLzTHX2f0=": "4167600000000", + "wq3smeq5pLU107L2gfCWHSB7IKImzCS6XY84lnZrANQ=": "560831000000", + "wq4yrrSF2q1nr6nVDj3eEXpsyTuydK_eFBt-QKYGKYM=": "470741000000", + "wrN7Lfnni-17Bn1TblqwigWQSsjXm72ukX_s0hwk3eA=": "4176362000000", + "wrNrsuBRUAC0RJAttVU7vS05fh9NMwuvmajTJg-Ztos=": "810455000000", + "wribKolGVIaNfkBYnWoD43TIjdBTu9tn6kdR-XuZLtA=": "427217000000", + "ws3HNXgmNaAh09ra9Fc3vbBS8R3lAxs9I0thpSSV-jk=": "453525000000", + "wsu8V94UtHS2Z12uHSqLGQKB0WBfRa-ESly1uBZK5Xg=": "424839000000", + "wt5tLFR_t_OUVt9tMbY5QJyiw45cBnxYnQtt7Vhbgm0=": "384483000000", + "wtIRsUr_Qe6rWroRXv9XojAI39FOY9ukjIomTHRXT6E=": "1155230000000", + "wuwRaSj3AqA6eujyU5L7g3GDDce-XKfeiPYuVIv8meQ=": "1927530000000", + "wv7HihTBwQsNGaut8gvbMe9RjJH7pzgh9x1gJmegrTU=": "5195368000000", + "wvV4-G2MVQycmZLA0goIyG-TfGwOpV7BeUiZ5rPzl5c=": "3501723000000", + "wvdlacfpUhybBaY_sIRG-II4v7Qbtef5LcXFGQGp7KU=": "2349118000000", + "wwKq8EHgD9jNkflukF0rb-lnnsL_BrVtLpeOPuEV04w=": "2083333000000", + "ww_YM3PKTlm3faa4nK13PUkxG0Q2CLUoulaWPdcoSds=": "925600000000", + "wwcWNj6X9OlLJILvb4hMdsjybyZiS18kThFgMvOr2l0=": "650269000000", + "wxKMzXJzUer0z2ph1aPt1--M5dQswkBCO5EnDRkTbBY=": "849347000000", + "wxk6Fnk2SCrCsS6Rc8eFNI9mg2tRwYnjIkWh3oWmbhU=": "385510000000", + "wxrEOWHrafrWtXlzBGilgvqei-V3vmqTuCbypMckgsA=": "833685000000", + "wy250VafF5fjHzwqD4dLnTnaGttu39NRqIBnd1JNLpA=": "1011764000000", + "wyE4kz0w2mnqzLB4uTGRwSJFf-R8sWi0-vSU3CSomLg=": "419232000000", + "wyQ_na_9Y8aMS9K9hL2PtES6prVxbk9lbqNR-gUdiJ8=": "940059000000", + "wyr871d6fwpg2c8JiuN_2QpDm35i4ZsuwZ8P5ioKPTs=": "382437000000", + "wzYquSAKvIRa-IweypN6D45D1AWzXl4tW555T-Dl4PE=": "3263177000000", + "wzbWuwx9yK8jF9AY3BH1CTAs5NuhErNGzPZJ7ULQP0w=": "453414000000", + "wzgyYjUcGzdFSWEmvjWFGFIUND0Nkr95iP2KcU8nL04=": "409643000000", + "wzhHUYLFtNQWQVWmbzjsmElzBaJjapt-z4Vyio-bEiQ=": "412871000000", + "wznvme6SU2HQ4CLlSdv0T2WbKDKB5780QcFTdCv69k4=": "7715309000000", + "x-9Ie1z_Yh4kPyhNrp0ef0FRDyHBZ_WDssLafQiPee8=": "16161357000000", + "x-SDg5MOcjlgBZg8U48iqgGIiewz0qo6eLATZ44uuXw=": "391727000000", + "x-mx1__4YeBVJY_X3jYANsIYSTPzBHw4bPAxUFzCaFM=": "757222000000", + "x-wzstcxeM0ZLyDxKttwitXNcOTnsj86wcxWheIIfy4=": "3814101000000", + "x0Ryjfxq3PEnaImbyWuAnE5HltChwrzxRqeSftaWSDc=": "1917793000000", + "x0gf7dO0FK2bF6LM8yZyQ3H-5kkkMnCthuU9kc91bT4=": "526095000000", + "x0guzq0bSIGUat-zUP_TYH7zaQFYNFCbI11U1f4O23U=": "384615000000", + "x0uLDyXCgvaKAMahKY83AFIZTXJcN-8ob4Y0xbfEwnE=": "1923076000000", + "x15MiFQXH2xpJHmxnw0hZyxQA_rYFNyOZHPzPqGXKc0=": "391257000000", + "x1dT14B1M9MKlYPCgpUAuOgEsYvSdhIcUp1uPLaegbQ=": "8329259000000", + "x28PAU1SmLvjC-h8gOANoRm784pXWEUmQiHYNAV-Tbk=": "439348000000", + "x2A5o-71RwktcERUiLVf2pPP-3gf2V72jomSM97ndUY=": "415672000000", + "x3GHAoIx97PoHIA2qBP06lDq3x-nsM65TCk39Y7am-Q=": "384615000000", + "x3TYQhUguLJe1PfIFhTgYBYbAx3M2e3VumTy8JTNH9A=": "361573000000", + "x3X7kxVG37WipTdAULTLtAC0RL3HqexmhKdlcXC5nvo=": "384615000000", + "x3g4hLQLwAdEK_yAl-615x-QBD85CqlGkovUqlXcFGo=": "376187000000", + "x47-htnJNJ9hcnohhC4Mf76RarfCD7B1dDkBu0Zqk1E=": "767139000000", + "x48dOJ93Mizoi1lon17wXJlk6-MKgbRGxZsjf9jkPL4=": "1499804000000", + "x4Xz_SFlgXxYymIm9COtaW09CSQSGX4mUsFPbT4Ajgg=": "384615000000", + "x5857Scm920b_cYXSTur0hu2xM_liTn_AI5jd4vRKtI=": "22613713000000", + "x5G1b6BoAGklP0qNXuHIRQQEdbG9emdfoM03k39n6fs=": "416901000000", + "x5SUNx9HQBa3N5yhRiMVBhx0d35d0pCet7SedV33ZzU=": "6042914000000", + "x5YoSdiLExhMkCu94_fs2JD5I5dmfmnNxMV-mnTQCno=": "673872000000", + "x5k1ZcT8yn4mgpPuQhVwqRYaATdyTAu1Gp1OELKhtiw=": "966884000000", + "x5qEYV_Yz9up7NfBvhLU7NvxFtyqrRnV3-_YKHS64UQ=": "382282000000", + "x6cpOCzgx__uBHBX3wuvLHJ5ixq05Sl3E28waI24mm0=": "415742000000", + "x6f3--NYwsoOaRrYHzKn8hujxfGSTf2vRJRWpuKncMU=": "4229869000000", + "x72g7AK-9x8pdFJmDuD89oBmIpXObTOlZQ34sb1R_2I=": "3766933000000", + "x75y_S63nmIF3LknaphHcn4UY0u9js3MrtjpyfBDnP4=": "25781943000000", + "x7H4cvv8L7ZkGGcUYmeAerp3PVasUd9yZsRYpPC_beU=": "3846153000000", + "x7mhPI5dey_qdhyehvt5HW6E5C7_eAtX_40Z5rG8B6U=": "1572568000000", + "x8JwB8dJuU3jfwOckM7IOh3avb3IXpYAIgTVU0ap_-M=": "384615000000", + "x8acd_nc8d6s3wi_EK5FoR1FBjnjSGor8aRyYviXUBs=": "858310000000", + "x8j4ACxTfZD9mrCPNPWnnXMOpAadKCy3q4nLxJGuRZ4=": "384615000000", + "x8l72UskKK8BvQmBdN-I_-qpugEEkLm8DhO0qrDThOo=": "4231684000000", + "x8pYfK_zDE4ybDU7IwzuT94OXdz5AyWS-laxymfKyss=": "4562969000000", + "x9-zUVeu6cEcgGP5PoYJToX1_lkY0uAWc-ekwe6M8u0=": "384615000000", + "x92MnCl8RiNtmn5h3-UDzJ5QcSQsB1rEnB6fuTtC-14=": "354326000000", + "x9DphxioOKWo2m5zW4BSDvLFxEUIfZE1l7APWcmbrPA=": "499352000000", + "x9Xq7A-n5yRQMW_SlOLGrIp2s_eA1nh3FSQNTWGBcVQ=": "406884000000", + "x9cSvwjZsnRy2R6ENO4I2jdVD5QZx2Fatr_GagywGuY=": "12690742000000", + "x9gDZ6WSu6JJESkCigRstaaNWFXxhuyHqIOzRi40Cwg=": "499999000000", + "x9rQTdcKKYI9hN1wDn17z_i2fjYkboP_4wvpOdR60ow=": "767169000000", + "xAIXRQvdLrQuVi0Aq_E0bqQMNDdwmxAQjdZToajjRpg=": "780611000000", + "xAuJkR0Wgf_OyNf7vAZ__vceKoL1n7RO7w5tn8j399M=": "384615000000", + "xB-17CxYLiBNr_iyoqdLYeP5VgmDzvfY_LXrs_vic-I=": "38461538000000", + "xB00KsINJyWBnFfNKlyro5-apvZEtBgGoclG-4QGCGk=": "459490000000", + "xB3HHIw_gs0OTDZYcYXlLcQlP8DXDibmoxqSY9lAzQE=": "463041000000", + "xBQVVAy7Oct4DCJ0qxyBHmZU2Wqtt1opXJWMbcAdu-w=": "833333000000", + "xBfKAQFjBRcAXscudnJ2NDGVa2YqWJEUpqh3xpLj6I0=": "414596000000", + "xBgopoKET9SjWK6opVIi7_wPaXxE9M---8M8NYl-BY4=": "412211000000", + "xDAlDWEcBRWqVygsGabwuZ6bGuZHqjrQMNYYRo-6mGw=": "482872000000", + "xDBIG2wRYCj7hTn1qJwsOJxRDXzJMMy0hqVrNXkvu-4=": "20881827000000", + "xDFPvs848qFvVzziRcHAF2ldjHwY535Z0UUI5W8eq-U=": "385507000000", + "xDOCMVwpWBp7Pv7qnfNxqaB_KyVoEZw34HxCEm6bDxA=": "763848000000", + "xDSH5U35xWGJZ5ZubtKn5q7KlwpvqLHa-qOd4AtXPAM=": "556934000000", + "xDTVcjDANy0xVfrwEjnhcuylrfuDbEgSG-_ZCEFXkMM=": "384615000000", + "xDWp9jo4DmDjaWXJ3K-_fg-zMp2GY5cI9Q6Vktg7Is4=": "469468000000", + "xDY13FjMyhTM-xomsqxX6_dzvaEuDILN3jbfIFD5-oo=": "1136384000000", + "xDYHpBA4trR0tB34vpViHbL13TYBfC_ZLa1hu8KNxz4=": "422561000000", + "xDiS2YE2FdSOKpPAHs9tfW_Bzrz-thvEOKEt4Au57Eg=": "384615000000", + "xDuKcTcu7u18tNTTd1OyFJy8-TUcxHSyW_B_WlGDvu0=": "376979000000", + "xDxXHNexgJdsWuiUjlsGsUsHij4eoowt1clqJUEO0NU=": "384692000000", + "xEMwOruM4tqC9WQ7KJAjgi1jsZ7EL4Q8bcO6ihlgYsk=": "2559199000000", + "xEc1dmiPtT5-DdiSpyMfn6XebA06Q-pxFz-Yb_76V0U=": "430694000000", + "xEdbMBCY6pr4kxi17QakCfemZwo8RMG8XDJy6WfQEzQ=": "396376000000", + "xEki9qEWNIMqV-3Wlt8PPSZhEt9AbtXGX0AA_ioGFQY=": "829551000000", + "xF26wOQerj0LuVdFmFnPiwaKLHVShhbtBwNWU1wY8TM=": "411085000000", + "xF8dEGjIsaQWORtuYPfynob-iCRIHk4DfDLotXCso98=": "384041000000", + "xFBBFP3HTc6g0hcViCoP8Cyyz_2Ql_LHwA_9fNgGLkw=": "454242000000", + "xFBHhC9oqXdTW5nWeFReB41OWXya9Go1WFLdn_jK4Lc=": "1920404000000", + "xFGQv5TD62LS0uvvVKgUhqfngRlCQLDV01YO-uRsiL0=": "769230000000", + "xFn2frNoSAYqsV-cpdQYGqnI2b97RICeaWYSKKNr_IQ=": "902999000000", + "xFt35IO4-Bp4JMBA5VzcWLAYPC64MHkOk9NM3xFDIgo=": "387131000000", + "xH7oMpw52v17NxGwCxRDJ4B7KDFkW4Sr7oEkAT-YhYI=": "1528665000000", + "xHW6J13OntUuVhmFUW-6mAmUASSz5SjGyoNVr1dUglA=": "461654000000", + "xICuJuU-9TKvcEgIdwA3M47pcWAHNOWmvErf8hNfJVU=": "385506000000", + "xIEfDWuRsMW9rm2DEDieiWk9LQr_vomzsldlZPrTCH0=": "417384000000", + "xINUjtTfKBf3HKjqdb3FWK_RBf3AS9IjXIF-ncAXkgY=": "462821000000", + "xJN0X0HA7SIxvcZLvsPd8r4FnfrGEWgtKlKla_OQKRY=": "384774000000", + "xJfLRWsvbNDTkzMh1uY46RGbINENWQLQFwZSYj3N5yY=": "704796000000", + "xKRdgevnF2FW32ojBOcYnTy5VP4fR0fNsO2dlW7sg-0=": "502779000000", + "xL14BvzUrbSD8-ainhJnaPwpe8YdiE2vR-QA5vLEvZE=": "384615000000", + "xLBFFydku5NlK6XQytdlQaUPXCa3l5ksgQ-c5_8F3SE=": "1156522000000", + "xLDnMoQczQ-DKrZ2sn7x6-6ynojUlfoQBoKsyvg2er0=": "643269000000", + "xLUyHyJanD6pA7eERldYcvwQTdUlD-w6C7GDUesUnDU=": "393108000000", + "xLZckKsXYrJXkInnwv3Xjbdsy-yoRdFws1JXgvdSBww=": "384615000000", + "xLfub-cYovfRJNDHvu3WCLGiAROYjGdOBdyJXdtu13c=": "4154883000000", + "xMADYxChYwW828V1-SPVx0ejE1sfLBUUcMyKRFcfhmk=": "3127059000000", + "xMIPKKf9IiCsEQX9uGnAt4_jiCbZo4ym8u1CPllyJiQ=": "470031000000", + "xMXBJGG8a3wIIuFijxZiAuyLfX7gVomLS3sNgUCIHL8=": "384615000000", + "xMmcuqiYch6yrX9GY87cafPL87csjpHrmasfppyXoBE=": "383160000000", + "xNq_L2fuu8RP7a25fGCFPRjGnt41SpoqFSNBsDd0fuo=": "421308000000", + "xOF4AMoldA0kuxLEI99wF0kRoUvtOjcO4X2Mb40geSQ=": "378140000000", + "xOgGw9NC5XkPIwQCgTVrWodlQmOfV15agPy1Lppbd4s=": "2083479000000", + "xOkdn05qsdyy5p6haDJ9x9gK7bw__wF0cwF7c3jbOxI=": "753217000000", + "xP-1dsPTwGEVtMmgwVeoSLtE9w-PMaWSbfsFBdyNfI4=": "470368000000", + "xPZOJYNxiCNvsGcILaYgD2On5bHyGLNBeGhxcnJubxs=": "361173000000", + "xP_KLSQY5scsGrGmox3sEurpcVch7ARAoBO9BOpWMLk=": "3333333000000", + "xP_r3F50Q9E_CNqpkYlFC0gwP3RdkFA-zV-YXOE8vrs=": "1777958000000", + "xP_wYQJA17ozIKFQLJjLEHP7j79UIzkD1W9M8iAgKys=": "1645215000000", + "xPkcwGXX-MtMM7O2yTNl_cuES2CNehneYHFa0Ap5ACw=": "786965000000", + "xPnyX1mPy8KajxKEeHu689Kdbx77KG5N9S8TxIlOu6M=": "1918873000000", + "xQ3NpPBJWl0bTe3WO_mny3OwhqDCw-xtX9hmIeJ-fxM=": "382506000000", + "xQECCCDh8I6REM6VQ-t7fwvQezJ5Kcja1bU6f8JQ69U=": "2916666000000", + "xQcezAH1fSY2VAUmSxl7IhBT4TOPnzafFiBB6YMYyIs=": "416666000000", + "xQjdm9KCMFuHD6H2EZoQMjs761GcyMKgZqIW8ROc-9c=": "771530000000", + "xR0GIwf7_7EgQITDGeizLUHsZQNEPU0Sp487OPXbhw8=": "964539000000", + "xRMhhJpllbipC-Q_STQ2OuLoF_qEIYjgnUOKztmJ8N0=": "3979208000000", + "xRPonO8UcxIZwee0NPUn7ngE8jkdswowPD2UxnlNLfc=": "1153846000000", + "xRSipzguNdm9rYyxUfU07UivGJQFQn89XXjo2XywYIU=": "1131804000000", + "xRSrnMHsHm8MtQ5SilqLc3phWAqccY1jIvCejnjq7Nc=": "356716000000", + "xRVh3wmAXizN1lrjf9sF3eAEjlUNW1yIPhIQNoY0S8o=": "384615000000", + "xRaCY_7FNXYFznBupXNYZmsCMUXuaKbK5s9notHYmFc=": "394212000000", + "xRrR50G_nmnv0_nCfaQzRfEcCstPaQ8uOyiPNJsjTbc=": "1126724000000", + "xSFE6mcL-TMDGMvVIsE7QNkBTdqQbCackg1ua5QZHkE=": "2311154000000", + "xSWLwFEtiv7LizPiHm3EFSW6jGTAquX6f7Ke2a7jC1o=": "449099000000", + "xSps_14p4MrgY_2hbDhwO3gJWOVfXJ-Yv3IR6E7YHlk=": "384451000000", + "xSsFm9wxXra5GXlcaF8KqHGNFXtN-63M9YiWgouQjRc=": "1154815000000", + "xTAW8jFDRBSg8obQNv6Q_evWEphpYrjyAvtN14iVoNY=": "912739000000", + "xTFjlurHk_aw5f-Zq67p0D7ZL5Yw5udtOcBRLs_vcNE=": "481282000000", + "xTQr1kiulplFZyIsOOUTZo6-J0oZmgKP1ooeaCltLdo=": "1136363000000", + "xTwGFsO7o42G_mwrzOGrEPpWS2UQZutmIlU27F2f1HE=": "2306306000000", + "xTzdWTdrjMAx1qsVkwPDW9bzJgbzDVKlk9UB7U0lsYo=": "538461000000", + "xU_tpmIhwmopvKRUMY1cdyPMcUAE4cXRIRNEgr7jQQE=": "1186497000000", + "xUjgnWv9BM4elrc87TdT6f2324xeNLmauSRMYQLF0c4=": "981674000000", + "xVLrAVIuR64qZlxG-oJ3FphJz-n52IGm89fCKFagUb4=": "389443000000", + "xVYjNmCsPJI0ABY0d82HByQ9C6U_pZYuugSqHxkDKGE=": "823211000000", + "xVYnQFimkYLjemtYxFfz0_54hXmgaUPeqpuH03Q9QCk=": "384084000000", + "xWxe1zYLEvmavsAu84escGyv3IBKLud_jKBrQ_GW4cE=": "1153846000000", + "xY0tUUzduioKaLdRkHDCTWF7yCGbmmgaHncmIkattPg=": "2307692000000", + "xYfrY12STKtul-OajOWjr8YQpiLYGjyIwBn-P26or7A=": "2604038000000", + "xYiMZPg1CduO6ILJD8g2Iur2600NGJ68-QyUolgRNV4=": "492028000000", + "xYtu_ENmwg0ZGmxae0UZBvx-e5yatvIwJW9lqh8amPM=": "460366000000", + "xYtza-enOxLQQWsu4Rn1FOw05hBETjOYdePhkx4Wpjc=": "394336000000", + "xYvthzFixyXTOy-Pzuf8rGzyPjFIgvXb-R8gv13aGL0=": "6435418000000", + "xZ27G4bk-nxg7-OvSCwfBBqMT_NBqsi4PV2YRV3f-fo=": "416884000000", + "xZ9HKLCLmsmlYSFPNImhPg7cnNKJIlYfy4GptRATU3U=": "469837000000", + "xZKTizazIRD42z-9ZAIXgWd11FhQ8FNLyNfa0D7Sq4I=": "454558000000", + "xZymcNqYf-gva0619VS_tgl4sF8nkxQE1QYzbVDnNHQ=": "457736000000", + "x_Q-uc_DsJugfidFlsqAa2JiBWad9ppqLJ6z5RTshw0=": "3777401000000", + "x_RuOmYnmm6L6MfLwDTfqqSPQ48umlVZDmRRvKY44TI=": "386615000000", + "xa1Ueb9Jf9Ds-ykrRRDVxShyTuSydH_L-rMGQFsER-s=": "418859000000", + "xaITeL_LlETPkIFPNRZSRzADDsfMX-B9G27O66iYlx0=": "1884612000000", + "xaNwbM5PEvJpLQ7A99uH_STGPntUQ7F0R_aIgz89Qxg=": "52815370000000", + "xaoePq-kaH0MD-YN75dUuLQLHHRsuYP5NC2KdMo5Mck=": "1393048000000", + "xb8ktbgIkaZQtaxydBlA0uH7xGhaFzkErxx_FxjfaQU=": "460559000000", + "xbpKTbuAz23AIUU8f7dH5bRMs8fEGcWXjsye3com9e4=": "473001000000", + "xbsTLeHzUhR7wCgfAw3S5STant3QLGIYvpVeRattPs8=": "392695000000", + "xbuySoProKx1AZyomPw3fejzzjGbJtGBQhHi3AargOE=": "1923495000000", + "xc8wQ4vx1WXpf4e193DZy3qHqBtTJ6YU1fE70eIclUw=": "34321730000000", + "xciuvAT1rtMHVWXj4a0BnIoHjqecLsZm6BXk96lMJ9w=": "473692000000", + "xcwEuzqqI1_aXSENfglMQYIp38n8Q6mUnk77AodOddc=": "31249999000000", + "xd3elMeolhMiLIq_E_xrAiXvqGHONiU7FcqYc6OgsBA=": "383653000000", + "xdFMOFeI6quWcBZff7kYWc2LgWki7PxVrBVASRQ9o5g=": "2272727000000", + "xdckNnvrQD3oWfkydaME_iSKAJVN5avD8CR2tYDmtOU=": "379970000000", + "xe9H0P17kF34hZ6aGWaCMwkQjQuYok77FlShbh-IN2Y=": "470034000000", + "xeEh99EpzNZmt-wjHeWgpbmQYA_SyPv6tW4YMd_Omd4=": "402004000000", + "xeYg04ZNWRyqwwAfAh-jGuIL2sSYLyZxoENs1uuHrQk=": "442128000000", + "xeZvuwPuFdzGxqz6ONTlwKCI4G7xSWgHWze6tt3jP8Y=": "457651000000", + "xfGWa0ghVCZiHlQd4L5IHf9rTIHUuFwr8HrNUmeZPFA=": "462839000000", + "xfIQ4DQOOM7UWBY7tGfddi4urWRp13whnjXAWkyETpk=": "527648000000", + "xfaxS3CqJIxWmlnBlLWFBKq5bLA7sEjdpq2-bEU-Snk=": "419319000000", + "xfiHj3ixzGdHx1OSzWJA7_2QFPWBKAe0bS0zMrXNN58=": "1538461000000", + "xg5fYqyapidTS5P5TQhrkZxrluO6M9apFxNMh4hYobE=": "384274000000", + "xgLUnxniAqaLDNFYSPgYdFudBiqXVg_ipECcV5eJd3k=": "384615000000", + "xga8IBtMzjOg1f47A1kDahJBocZDf1_jhz_iQgwSuIM=": "453082000000", + "xgiKNhC6qgTH16Z2Hmk8aL0vhyTrvlMlPpX4Hen_l_M=": "404478000000", + "xgkQdm5rKePUQFNkhBDpTSSBS_vWl1lAZkXjKRVIePU=": "376163000000", + "xgvPz8l8vaTsieFkir9TP8ApmSTS5oDDMMTIr6z-PzA=": "469837000000", + "xh-xTiCSZdkwBYv73WoQP2MvCp0q4oWSMrIQv6G7JSQ=": "393904000000", + "xhCVK3vSgga2asPO9ITiMqmT0fr-5N3Yoptc05NYGGA=": "750997000000", + "xhClS1X_tMoN6WshoV9LpAW0JMg2-y_rDNL9XQFVNc4=": "418737000000", + "xhPLXhqDHw-68eXWvD8pT7mvtxzSLuMXB8txWlof_Kw=": "1540006000000", + "xhPNgsqNju7pFVqfVBX6T9oQA586mBNfrxRWG8jSxHQ=": "384615000000", + "xhaE1KlSk89caNff_tJu6ukS7VhzRCNj-mDTJDhD_z8=": "385007000000", + "xhf0x7kK5IARTjx-dt8Bd9ectgVarR7eK1VSMYsKuBw=": "4200605000000", + "xhgu7saE2F4bZiXWqH9Kv0LmdCCSmf17wpxde6uWAfw=": "769230000000", + "xiXlqxuYFfX_a_nXRTZZ7184JtpewArprGPpbobaN9w=": "2278048000000", + "xidxl7FRT3MT6gfcSiBQQiEEevE-tmKqc-jr2zUeGt8=": "383558000000", + "xifp57g7AUQdjqMIGhRzh4t7BUgDZ5BUfK6PLf7tSRg=": "1154647000000", + "xj59unCgpHGftTiEC-y3VzuXMZkC7nLW7uwRYQgLv9I=": "424269000000", + "xjNE_qpoNA9REsIuhJ1Q0DmsNMjVrqDB_5jVcas-Fvs=": "417632000000", + "xjXk6m0c3GuuvQSNpUly3GgfoUAAeT0zYpOZb3YsiVU=": "3842827000000", + "xk3o0xoev6l0OMLH7WjOfklcIDD0g1kP-CWR-P-wr-o=": "847212000000", + "xkBCd1_f-KSLhcAIYCJfcPeUeJn-XTzbFPzYIom0aFY=": "19230750000000", + "xkJu1C2NRDft0zE-pTIR2W9vJtJMyUaAHMItssEUjgI=": "386214000000", + "xkKORoUPKlyDzw5Vn5FFYsaVgATYzOVC4XtoRPinyjw=": "384501000000", + "xkRjjIA9WXjHSK6WFtJUpCCiSCsDWO6T9cjYAq67eJk=": "416666000000", + "xl-UR5MewBy7qMmfulunSyzXjr9E9xoLgcf10_QxrZE=": "419271000000", + "xl4GljbVqxU5DoDy4Cd2vLLAuZbhCJXBY_HLCREv-4g=": "384615000000", + "xlEhMXCz-UamxbV6INH-7sfWAwSYThTiqdfeCDKzU-c=": "384483000000", + "xlZbrKwJGlStGNb8ub2M5ARUknEv4P0eSiw_EYowOAM=": "460821000000", + "xliT4n9s4mRqlUHV3yLt_qTdompoZaAOGPM2ru9RCQ4=": "817363000000", + "xlis7zT3Yl0VlhtCFNrnT3FIdXwf-vfxRVXH6tyAEPE=": "455600000000", + "xluHpwvx1_tWChRLQim9pf6dDjkDyuHelgsGgPa_i6k=": "455266000000", + "xmZ3Hm5Usp0TXbv7FYjIfgMxlNM_S1soC9II8yzSMbk=": "384615000000", + "xnJvTnKDfyE2ufJXq10YvYnKvWCvKGq9rCnOK6NLHrc=": "1668981000000", + "xndgljbFaOZlp1jGtSQmr9i7UFCloFpVBEUT79gFPno=": "453132000000", + "xnlOnYJpJB0aaLOiZCbRoQItF2wUKM8dqHyF9RjEixM=": "454545000000", + "xoBnMdXPZP1UlRSqCEsuVTDBjz1dUAk9juEqXpQ7kA4=": "569308000000", + "xoYLPkK0fQVMcjo7YYR_mLVjxuJX7GkafUm_5OjXWs0=": "1002212000000", + "xodIg7eFrLLjg8nzgrB_dCoi5xDzafRiUBVw7XwKHgw=": "382080000000", + "xon59mzAeft2Ib5p-Oi_DmQtBlZLBu0AjOrdG_K_ViY=": "752339000000", + "xoo0NPglqKeuXJ-0cifQbJ04ZhwlyvTNA2IUREnodgU=": "620572000000", + "xp45lqxT5ca9dqWDRYfal9GNlQI5qEiAPpw1qliEFNk=": "1156522000000", + "xpC25l3jmNW5RyQHoF7pB6UBqBSjbjs1l9XpBvD94ns=": "778772000000", + "xpOqytx8C93k609TjZnK9nT73v_vnBMYbk6VhYou6oY=": "4211455000000", + "xpeI1e79GVVNomJM5MAy9wmwUzSPfAim249mDiCzC_c=": "378078000000", + "xqAVuFz-Xo4JqkA6uRZWK4roYEk9XSrTOAHH0Ud8UCY=": "3907499000000", + "xqgJG-C39WXfTq2wMReIje4EvPeVKHQz0oQBPSiCt20=": "417633000000", + "xrGnhlBU_M-y9nDVzJlDJ05ub45fPoHaANQRb5NykUc=": "384615000000", + "xrJozIhuz3qRxPZRQEoqhPJ_vAugAsQbA-DDA5ww1X0=": "2300826000000", + "xrl2DYVByeEvh3X-g5MITIsFpTENhmpcRGNadiFoV0c=": "2689377000000", + "xrrJuYLrt3BZSCX6dgaKzuCNbjewuKZMRfryc-YOO1E=": "499999000000", + "xs6xCDsZK2IFtZT0pdhGIcuB6Cj82Xr1qRNMaJRdqyY=": "1247328000000", + "xsEggtp4qnhI8BFkhUM62-eO7hnxv_1-zAtADowJst4=": "695642000000", + "xsQeTJl4AL50HqtT3OnW2Oe1trlX7SXqvzktZGY2xKw=": "384751000000", + "xsRYzR8t_VWUVDXfyw3tt7uJ7S8bMVcs2-G0twGE5yE=": "477107000000", + "xsiMgc-F5_lwGjTh11Wmde9AlcubZvVdCKgle7pxd2w=": "414775000000", + "xszTtw6avjPqm0IPHFUsu_TAAArlLPpWlhEeTvmUeTo=": "385506000000", + "xtHRYZG_2OPZb_fkp5sO52XxfiPQyc2pkBFd5YRC76Y=": "384615000000", + "xtHXuZq7s52eVZeDJLVxId8Ho_lisLPX-KwtWkA5WuQ=": "1269762000000", + "xtkW_8CyM1f3hjBaaHMp_GiYebONOTWZ4Hai2fzrj4M=": "462839000000", + "xu8HwG87CH71XBx1qUkPU2fi7PfUSTAJKVXncFI1dLI=": "12577847000000", + "xuFXVMFDjzZabZVN2xrl9qjGCnFmEMG09Ir5HRRXMC8=": "425636000000", + "xvTaBqUcmZD2hBq10SlIhL0E08zf8WQWOP7Jp_NAr68=": "407808000000", + "xvjtl2pRXIX7LN4xYcOHGlxLKmTykx_wj3DXDiTcejc=": "1153121000000", + "xwNP8i8qnH9DNAOW-SFo_TMGTEl2OabWUun_G_fQmHg=": "2001661000000", + "xx-jAnRWDNIt48GQXOxhWQrb3dUlI1GJuZj5dKcujR4=": "470605000000", + "xxPCgj230kONZe2oOspL0P9LSr3htSlbDgNsj2wmxSU=": "781016000000", + "xxPCsnoJKTdgbFhKebv-jKT-OZ3pYgTTw9RoTT-JKgE=": "976078000000", + "xxppattN3Jva0ovJ3GwEjHqV8U5QU8BwJvbm2cRM_-o=": "1997136000000", + "xxsi5UhccD6XVcRjatqWLc33cAl0MmJ205ww0HXnMdw=": "384615000000", + "xy3rIZTx_VRYinRdc_piuaL-3WQjOB2Pf8n2Rop7MPQ=": "384615000000", + "xyDP4zi5nIeGGuMK4I_olKT-qJnF1iDLgnwyVffIS-E=": "454234000000", + "xysVWHvFAeLzuOB9yQYxlnbPuw6-ZDUTn1fQouhTCoU=": "942597000000", + "xyx4POE5SggVK_Te1CUYRrryXpug4Pvnnr5_TLQkDrU=": "424816000000", + "xyyL2jeiAUUFVWw00WboKWO-E9aT67yZNFBPSthAO-4=": "381454000000", + "xz6DupV5v5TIlGvGRzTBIk_2KeVrAWpzVJdj5RFbJvA=": "2062284000000", + "y-9XmE1es-MI4bVH1v7H_DJmtyaKSJEqL7klzQa74IU=": "423004000000", + "y-UgS7AVshq3Evg6mjWNKz-XLw7QLCSp8AJDG1MdbhY=": "455600000000", + "y-WPF8eD1h0IIyUdEpPhRy6fuzXV1322Pu-4MXrTNek=": "1155348000000", + "y-XFSnJAhPA9K0PxBbbCUvV-W6_OY2TkUoz1d_-6sQ8=": "500445000000", + "y-l_ASLh9pG6hWgZvpBGb11zsmAKewGwOzFKOuW0K0Y=": "924724000000", + "y04uSb7PcKGBu7XK0Bb2vdReToUU23sq8L7VjqZ2pG4=": "454061000000", + "y09hmq-tsPXBZ50QIE6pXWJ9C3U4-LgRA_CGzk8JbWU=": "406607000000", + "y0JP_GbcMKkSLHvfm-n0Qv5yl_Tc7atuAyBswUDXv34=": "406449000000", + "y1MIQ1ntDpTo21to0dBH9nE92zcc2UFAaLkevQStxDI=": "3855058000000", + "y1N5oXlAWVI3CksUA9wgTrcbeB_7kMan7vDsvTmSEeo=": "626852000000", + "y1PomsekHBW7-BTs00r0bsGIp23gDzCWMjgBBWkuCWQ=": "464371000000", + "y1TzGriIZft-sdNMRc7r0ujcqVaX5-5u2e-bEzyRPSY=": "23417975000000", + "y1dTTM1Xjk4z0sdQnKfxd3ueEt-yGjL0H4n6tmcHXSI=": "411085000000", + "y1pULWmJyYYUEdlJDuh3otdhPbTDUJkf5Dgqzzeq_o4=": "926541000000", + "y2EBtKi-7wIdSxairdSQdom6nh52r9z77GkSE713gyA=": "543101000000", + "y3dCwcsWBjV8soFHzfwTBH_g2sFD4ecJgzsvX4HofXE=": "2077904000000", + "y3fE6aNvZpLPTDqefuwUN0nyWR15xNcNQumCuCM4I2U=": "384120000000", + "y45m6ZZgGT6n-eGWtqG41A3jct2ZYRBbJnkiCqJLp8M=": "647352000000", + "y4XNjEF4I9Ep3Quf22i4DZagpf5KQ1Rhr4OmLWscHQk=": "415842000000", + "y4bdU9QL-KwGlGsEm_bBM3n_D4l6C3Ln4aBFvAzbBmM=": "415389000000", + "y4tejZt09y31x_6XtH47t0QNvNGViiFdIY_ugJq9Di0=": "770269000000", + "y59JS-paJ3u8Hb0iK-uIh1PTmQXDdniZS-jXJJnVCgQ=": "384786000000", + "y5OzJu-_GNiSJHlmGoejd1mhNPraGAe6GOSOVfSjTsk=": "909090000000", + "y5fbvhl7nSjujaFN5uA-e064Vk7fzzv29hORRM8Q-5M=": "384615000000", + "y5whyW0x2TA67Jb2a7A0qrnHqiWGEOy67Puv_Xf_6wY=": "825277000000", + "y6lqGtX88vsbNB39GUqkhyUT5pJtLVRyiPtZThh-UKU=": "492314000000", + "y6p1DjzPdrRv9E7y-wjbLYfwKsmp4Lh2O63JrfqJgw0=": "384615000000", + "y6uiJ1mXcgxxTjEJomWKe83HuBnUT8TwobcVqDCW7kg=": "377783000000", + "y79IOx-uFjAqLImbwfoHB0EmRNOMImN1ay4YDeLyAMA=": "464089000000", + "y7Ers14pnq4Mqt9LKiwblZd9J1syBXd6q-LKKZ3C-8U=": "379558000000", + "y7NcDYyvnI-pLA0YahA9nvqdCVxtDUBC21NQit8znUk=": "385505000000", + "y7Vl04nbvi2k6V_ei1BG2R04EmWhi__n3dNJBZysrbE=": "20831130000000", + "y7cPyPv97_1HlUyKkTuZIDKDjz-AdnimQLaA1WxrWJw=": "1872083000000", + "y7gdsH1EfGAYxAe0WbIvzSdgBqMmC3TX_Fm5stvl6ME=": "461801000000", + "y87ltmpBcl-_Wpp1y_Z6V880ea1qqaSKA4rRon93POg=": "416666000000", + "y8AXu3iv-i8-3Gnk_-cEtbpPA_9EgZWys0uWGDbVlYM=": "452992000000", + "y8MjVwzRmnkkdNGHfpG5cYfL_hKDxIdTMp253xZChVc=": "1751233000000", + "y8ovn__EPAgGkXIRG8JSkjyI1x7nkpyNWdV9ztHcARs=": "3626457000000", + "y8uhBciFtjBKrmbQwyxIXhLeIYV2rh8ykL5QXMfBO0Y=": "384631000000", + "y8x4Uqg5Ba-QHHhq6KyNe6_hpI7Qdjf3sET9tA0tXYI=": "769230000000", + "y8zkbBoUhzz5FKVDcrQwUmTHquC7gUWpqDajxrwbgeU=": "384615000000", + "y9IUZZjT5GkNbyoUN_P_amHzdmMckIf-Im_G5LHxeDs=": "460442000000", + "y9TR29rWh-W5ytYF7KgzYio9QOrCguIVmAzWlE1S2Vw=": "2310823000000", + "y9Vh-vfFviQIeuyhIGaBdX8N5X9d1UqbEUvuTwwp7ik=": "1168476000000", + "y9aajAQsiGK1kNz3vkVM1cyZTC6nuJFomNUbjzh2zfc=": "458460000000", + "yANmP8tcJRIopKmM_xzDeUoKE6w9EMkVkgIV8pnhJ_w=": "545837000000", + "yAabJj81NKXcdwI-ThHQ0eFbUVPIEATndI0MsWRMBA4=": "385509000000", + "yAlmSd6ewlcMBbspuZX0UisRycRNcNbVa0Z7Yz1Go4A=": "465712000000", + "yAtK7IDrAWZXvMOFC6ebL_7tbP_H8vKYSL4glW2ilhc=": "382394000000", + "yAy7YBddzyMzOCaMf0ghDE8t7z03U-0BBYVO_4v0FKs=": "6396061000000", + "yB3smVL8nv2tCTNvqVI_DjHagATNZHP4CcJ50dPcNgg=": "1484507000000", + "yBYJe17WRYwNKgUyOCWbet37a236Wkh8_U7jRCV0EQ0=": "3557016000000", + "yBbUGjEU6L2x3kECLQbHlj7NC8HeKe7IHDvWtd-CEV4=": "384615000000", + "yBbs_Zdi97aZtjhaDnMAMxhUqYXTC_CsANZ8Fk2iIIo=": "458314000000", + "yBzEh8PUFrIF48-jV7j4oNR_G85aJ9ZhcyMnZt7wwIE=": "376889000000", + "yCshPvQnbod8xXr7jHRSnmc6upKXix9g-VGGOHEzcic=": "878096000000", + "yCwBq4EXiVtzUjGg1kvH6EkRgLYBuDiwI4A3Ac76sZQ=": "384425000000", + "yD7YZ83VexPBRgejqDV6BqwGc59uSLjVYnNb8EzmyOs=": "1510256000000", + "yDCqUM-HuUfgzehANhWCIBQGl8PpzLKX7q6lcMd2j4M=": "415819000000", + "yDKArBTg9EuUOGRUhM2eQ_wSRd_vbmuHVs9UQo_WLRQ=": "11990846000000", + "yDOGV8aajNAEMlObK4QxhTnZp7Hmre41uPfavtF0QxY=": "385507000000", + "yDjqNjsdeBQQMI_KqE_bsh3GmzlfGRP8yMlV7Fz2N-Y=": "4603727000000", + "yE3SdNLQoAMhDpzLyvE3FvR0VkJCDGZnXxbZVjcpbO4=": "574968000000", + "yESrBcjvPeqgINx4zJbubY9LLXX0WX-RgiEFJ4zPF_U=": "389441000000", + "yEwQqfbs78rdsQKk6n1bwsrVfUm5sqoFtGtMtohHHNo=": "1030769000000", + "yEzqEUDtbjo3JLMKZWKFQ3sObzg3Lz9pq4dJdoGhh_o=": "379928000000", + "yFOTycJiZOzjX_RcO_uEGch1XG9JFY1dHuPQ-pq_Ghw=": "720740000000", + "yFU5DjAPnwGJKp5GIug7JzxEIZ8ARC9FDVpkM1lCSy4=": "7692240000000", + "yFWMTlX8gF_2DpZ4JJkNkJcnh_yKq2kdwbbe49q1deo=": "386498000000", + "yFuRtSDPC1desSuwB9nP4-viADuIO9Yd4mtY05LYAtM=": "3659444000000", + "yFuyTCmdzsHxdVzZtHdFXr3zoYoJmW8AOgmefkvHKlo=": "448838000000", + "yGPqN1fQ395ncLf1Z5BeksmRyluvlmkvMDG2oJJsAHY=": "769230000000", + "yGn3dVV-uMh5veluUX0r2p-CwmlXhECC_n9cyEFA5KE=": "382394000000", + "yGtJF-kdq3UjSbky4p0JjjYUlWentIXQG4pJhTOIbL0=": "850155000000", + "yGzFjdyb2DUTXzaQM_EElhOEAIbs43_cwUOoXOOCpfs=": "385962000000", + "yH55o7xgC35wN6ElxVb3atd5IMc8Q2A77qBizHuZhKo=": "388354000000", + "yHPwxPwwvtqxS8t-U_i2rF3mbNL3yKc1UAhKTuADmbU=": "791457000000", + "yHQJxrke2gcx_tCsDniAA7HjKa6rscEcowWc_rrqahw=": "377851000000", + "yIXCsC-tBZ3r_V65VsLNXyUE1kzPsxMiztzsT-nxbz8=": "573591000000", + "yIlCtOjQXAed2MUWjhG4GaVK4vK4WiNA3jkFoxKUUEE=": "838750000000", + "yItCS0iuhmRSwTpnaP8I5mqIZHB9Q_XdeXcDjFz6NIk=": "419023000000", + "yIyzynH8oRkkTY-5qhhZzcV8jv9I4rOY_W7mcEKAacY=": "454721000000", + "yJEQ9zQQVWM_YxG31YHUF18pSxsLJQAK3NV4TEMr6FY=": "1814771000000", + "yJUPIGsBKT5i6WGcInCMx7dAixCBKik6CxvfE69o5tw=": "394118000000", + "yJe2vVtNqv2GVTbrrt-At0EGVG67gRJmp-Af2JYTn50=": "624999000000", + "yJeBwV2x5jv8NQDmJ2IYDeIi94n6D4WbBA9vfqUxk0k=": "391885000000", + "yJi1mf5Li_FWlz8xUrQwiNEBHmZ9hL5J4ttkDGnnTAs=": "417087000000", + "yJlgrsBVg42fCsRI-9PfduI9n2Ap2Peud8Q7CG1Yk-w=": "2692307000000", + "yKA1OMPbxjb_TtoUD1HhgVr4uRaF_BQH7bTM7vi45mk=": "385742000000", + "yKADEDgyVEBbsRTRCU-flnLwi49Fmpxiigmj35r01rE=": "532838000000", + "yKk0MZZMfsAZgXxeN7WQ3sWKFXO6-wC6ArM3uYWqPBU=": "1370847000000", + "yKoJfxFOAoK4aDR_8lCgFECIygwhoz_3pylEqNB1wr4=": "2131613000000", + "yKq6OFz2pIwGW-F8JHlIs8qDSnf3503dkT01izJtMDY=": "460412000000", + "yLYmxDspelx51dn4snNC68XPlLfcqCpZpiB03JrTUu8=": "509711000000", + "yLdE5J8NIhmS0UDKv2xLUnQf6Wq7v_O80Mw2z4HRwu8=": "2892744000000", + "yLuS1M2ngqIneS5TbcJNwQkdXL889a4i_sseWvGG1eg=": "1244967000000", + "yMsqHhTiBp0kTUxQlY2E6C-HKRmh0H4sjqqHoR5WHek=": "2494023000000", + "yNAuUyh_E-Uy9HFzOe8awcwKJhwGWHgKvV1uxVx8Www=": "1355115000000", + "yNdNzaXcM2sKt4oSEBGB-Q_mcVcYpU-3CVnbgmHxqGA=": "1538461000000", + "yNi5FOf1rl6Zfyn_7OCzk7Vt2YWn-5N60HyAQc2iAS4=": "387951000000", + "yNkpUlQbNlT98cOvb1-_I-GrKTuv_KmzCkOX4W9KCeI=": "416645000000", + "yO7LZ_wKccI-VrURCHyKURJtxCYE0Z1mASwitS8WY6M=": "396483000000", + "yOmbN12o7tywj19fh7udZ40DicFUQfzUahsvKfLi-ek=": "1256379000000", + "yP8CKgs4CaQW_gOprhRmJKkVqfqFmU6QjmknRK0Ys9k=": "386922000000", + "yPO-NuhPunKS2jW3lUnqZ3-7UTVwJERCP6IB2up76dI=": "380577000000", + "yPkkZku0NQHI-EnrwQwTFAf2L93iYL9-xJ9Pr4hvAXk=": "384615000000", + "yQ7mRW85EjQKhOa_Y4oCsQpQntTqkBlJYCoz3fTGpLo=": "383032000000", + "yQJ7UG65K4klEx-dw7nzrcHWQjMK1QIm9OUF9GtrKGU=": "403990000000", + "yQdcEK6UEH1ORDLkU5ABDFUri3T6L5pkD5dzSzcJtc8=": "539157000000", + "yQhZXrlLIoqjrh2-70veckJx7GAzsPSSlNxotA54k28=": "384615000000", + "yQkfsi5sKUgWNTE7QGUF0BqKHvvP-thMbo2OYxcpXxQ=": "384440000000", + "yQuDDB5LKh13Btxcfyu2SjDtA_Mtvi3toDD-9ZaH014=": "391797000000", + "yRDRZFtlGHWygIhMMHJUDaER7dsJ9BY1MMDOE2-tPoo=": "3665193000000", + "yRLR22tjdWexSa_c1lARtIVb5un_qS2ws_TjMA7D_SI=": "1215696000000", + "yRYNzLq2E_ui7X4tpXXO6_uq4GkGTGTMMws7TBHlP1Y=": "384684000000", + "yS9oBJ7QxznrCPg9zmQg9gsnI_LkbFDoL4APxuIW5zY=": "451463000000", + "ySSpOGkNt3gM1M7tj6Lmqto3eYRM3kJpknA47dw9c-0=": "412344000000", + "ySV8BIZA5Bqh2e-JrRny6DoexzEruWPWRfOgo-KeNSs=": "504754000000", + "ySYpm169mJDjw1Xb2PRTqveDRH9K5s4TEU4EbuWp-xc=": "384615000000", + "yShcDKxrqZ5TfJqECIinVS6Blp3QzXPWb8J2Y0eOHL4=": "453777000000", + "yTKNsrfHVZf3YbEmyBR6Pg6yIs85ksa57YUuui8rcuQ=": "501244000000", + "yTSVZXI4iHd4W5kNrkO2sz9AENon8iuER4EiwW3cYPg=": "420891000000", + "yTodf0FngmI6w0JexGIe_Lc2kfmAWoygMiFkzqGUWRM=": "1923076000000", + "yUAtXs7LHVfUEDexSnDxmVt-th19El9BQJXrClLqlkE=": "411085000000", + "yUFrwFFIaDf0LH1ZIhKOJFxYjx37TEqHcdFZKmX_-ik=": "772360000000", + "yUnWjcG37xT74elD1UJnzfUtcvWxWB3MwinYaDOuJPw=": "447986000000", + "yUpremD0VmUhdSaOeTKdCKwz09dvJhUt0eWGK66Yf20=": "384643000000", + "yV8gfjalTas0_JDpYt-EPd7-qUFDQjPEs6K5NpcldBI=": "1874739000000", + "yVIFZsMXEQyh2y5P3rwtwYiOUPJBsyxBVRP8CqqI14k=": "446108000000", + "yVNv3YUjzBH95ub45oAOBSaUjC1e5amVey9Mp-PRSPs=": "2027818000000", + "yVxRxYuS-h_6FGX8xOtnEsms8EgjdOQtYbv-bcPw61A=": "499850000000", + "yWGFl8fXZjbzKVblA2jNEvV2XAlK9cqfwAfd06LJO_k=": "1363426000000", + "yWOe81eS0kFAdXJNNAtsa0gloODgie5G9dqHAF0XoUc=": "384968000000", + "yWtmDlwYAmNDy9Xc3_S-k4YMiTmw54m_OaXOGz593zc=": "384606000000", + "yWuEqgJv4jWRdTYRuDJVK8OwYkTfUSbyTaCu2NqdbEg=": "391885000000", + "yXrHwVPpXhrjtP90VCFpBFPh1DTmdABZVwgtjEZRQTc=": "384615000000", + "yYX6oT9YHLXpT8u6se6yca-xysH5mE4l1A12TS5MoTc=": "378642000000", + "yYXqI-ixxGEXJAWOqs86sg3PY0yy7v-AFo6i4uGhtD0=": "4166739000000", + "yYx4MujwT85_H3tJ4ArXwJ9MiAIL0FqN6hhRI9IJiDg=": "384615000000", + "yZ9Rqjbz9dtzQd0vL1NqV9SQtjkY6GsKJ3_CGjKx9u8=": "421893000000", + "yZBSPWfQMFft22U-cWry-5p9iDSbkgx_dHVNphd4w6k=": "14834001000000", + "yZExyaxSA8gnx4YT79odzqaGAxGqYrMmRReqmx4ZhaE=": "447623000000", + "yZKYROQRvHHKOCiJkDvSYLV-w38KQ5zVNK6iV4obcIM=": "385509000000", + "yZpSVHxGm54IlzePUOJVd8a1SMbbXBGY3NAbuggj3jQ=": "1853931000000", + "y_671TpYOBMXKBLc3UC3w7lh7GouHjw-A3WrjBXVfgU=": "391132000000", + "y_FFsZLkko5hEEp4xotucQBYq5LHluJy9heSKcOJcpk=": "939592000000", + "y_KnNYNQyUhTc38KNWgvcWNEoSujJKVdDdBF-bAMtPs=": "927599000000", + "y_k6CRlGMl3yL7o86wxOwtovbiCiZBOKiYv8yuc5jN8=": "465692000000", + "yaNF-TUOX_Rbhj3pb_S_JXQaQ5gqyf3-0yzbA6HncVk=": "4525676000000", + "yaf9eyQ_WDZbIhXN5yPWk8pFTmZlR5TPFuMslSlOY38=": "18511345000000", + "ybDmccWvnWok8h5OKDn1bhKUcfqskLPaVnr9c94Xcm4=": "1925338000000", + "ybWLF5QSxzmJqLBp4LenlolfIPByqVrXsKtccTrnQSo=": "382924000000", + "ybZVEW7WzUpvBUOW8yxt_3Y2uwELPgI2n429apb4rPE=": "1249999000000", + "ycABGQycCiClcQCcTGk7KGKB0jB_VJlAqnaMAfJt1ns=": "756683000000", + "ycEmYvblXLHZgl1cA9bJ6LwFq1-MxFC2sRNIeXn8IZU=": "457218000000", + "ycN4n2Z_lsHGVBb9PP4HsM9FGMVTRDblSN_Ck3Aw49k=": "451268000000", + "ycew06XdCM7D9UGZaJH6H780GHP6lpMVul1H_XYkCkk=": "1625289000000", + "ydQ8khmulz_OgFtNrJb-0HyCFw6Ym0NNhYhrC2JVYlA=": "999999000000", + "ydVTBCL4YFHeH_-a3WPqebdOyj3oA6WP4wq6JKuNk6I=": "383311000000", + "ye3Zs88ayn9Ehshsd7Irpf_vO9qemeDVoweOylPGWRw=": "794665000000", + "ye78NgUbdUeTpB2iyO-R3F3DtfHfMdK6fpsMAOCeOqs=": "390975000000", + "yetA7Ye2X20PQhA5cCDZ_e7xbDSme2YDWhleuHVQFck=": "771848000000", + "yf5MtPV7qRTgwjeTvnW9dvlsBqgTdJGoBSusSb7zhkM=": "1146953000000", + "ygj1bj7MBmw5DnWwYJtLYJVK4_AKj4Cp4qdFR3qWbGc=": "387002000000", + "yhMU0pgplsBo9uNZb-MXlZBY0Z9ITcRgr6rd0XsVtMs=": "654208000000", + "yhMW5uaWFDaSnzasaOjNMYYzIgHinWSS0XDRkcVlT4g=": "999999000000", + "yhaKYgmhjKiF8ffU7y9SwSW_z1KVDKvStdggEIiw-TA=": "2810769000000", + "yhsprow7cQWOaVnDWSC7CoWuEsol6PaHmmlosT9NDXM=": "384136000000", + "yiI0v8xJww3k-6pb20ckLDoncmFIhLomjaoen8rb5Ac=": "769230000000", + "yiUTf2D_vTYc6D-Gh716tFK6QcU-557-fixdUHw5imc=": "384615000000", + "yi_EveQGObesJmj2cLn6KkFMUd2zt42b8Lv71P4wWSA=": "19679282000000", + "yiepuPiyy-boxiM1va2hbJmvYYhCQ5axosEtK0X2kj4=": "1236871000000", + "yj8RWNW1tq3Z9NgjhesYbtz02o0gf1P3WjV3skzDAp0=": "1659943000000", + "yjDGzFkid9lYaKY79q3LKkeNDM240Dfs65FoTnybIu4=": "631324000000", + "yjMY9uQ_9LFEQZySyGs4xO1mEFqiKvA9NWcpvyUkgiE=": "927494000000", + "yjXSYDGTilKE5ICDTWPhl29YZpZGEVAvph4fy2v7vbQ=": "381808000000", + "yjYUoCLUgT7m5c_qlsXeTw3LspqR1nDaH5MIA-s9LLg=": "384576000000", + "yjdGapCwEP-zVGu1lHCIXjIHb2IZl4d0UEVnwNPBGZs=": "452437000000", + "yjdegmHmHtwigKu_RHx0HAdrIjJsyndPJ-82OGeCdEw=": "377545000000", + "yjebzp9QoyuoPcuTN3XdrXYIWcUtT-dk709krctTzzA=": "3148396000000", + "yjfhgQoKcrzgyKWkHu0Kgb4ofgWBKA57y35xF6BBzrY=": "963009000000", + "yk18irRXd_cjTHd71pfnDfNv2fUm_2znc9j4GRdu7l4=": "385528000000", + "ykArJdngrF0VLiiyk8LV-bxAkm_cYSGwVnMcnSU0Z2w=": "385507000000", + "ykDVpNvfa5RR37iUQLTm2ET4ZPiqISR28U6MMshjuHM=": "613139000000", + "ykoPODIvO6s_Sn9TsxKSJ3yrrShROcEo9F28oEG4Pyk=": "384910000000", + "ylBJNBt3qL9g5KVpcy45_BuzAuJctCEFLvTgUl8YNak=": "384615000000", + "yla8S_6rMnq3Xw7Hdq6tQvuGtAyt5l0O1KAtfUm0djE=": "384615000000", + "ymB_8d8E8zCMqThttCR0uSe5_sp96NRUUatI3VKhhG4=": "384615000000", + "ymeDGkZBayC2qvGcN9fFXMzQg_VVwalFteCZbibMJZo=": "456239000000", + "ympYWOmqabJJyuzt2lwhuXuniEm-ttazhOLN59cn7h4=": "878930000000", + "ymtbPlOvOr7XTnoiMY_e_UCvqXMYMjPj2dI7YS1NZl4=": "416901000000", + "ynIQBzzivqaC-F8lSWky3hTRDWYLJiVNpVophvJLp9o=": "560817000000", + "ynJHhvqALxIeFi_xAilGD07HEnDMRmBh2h_4L3G0NGs=": "411085000000", + "ynKOCGc0jNtrFFbOxVQidmnlCN74HxNU5Gb9u4cH5KU=": "454754000000", + "ynKb9Cm5a74MVCX33Sjlt-X1pUIY1UKZRkrUrKQ5GuU=": "938699000000", + "ynaxSCJKHa4yyWWNT02AsSrn3szWwBu1KbrTDy2qUsc=": "385875000000", + "yne6ufy8bKusCv9QBhYzEN0ohxteSuF26S68NYQIDbc=": "385505000000", + "ynoKrESwvCHoIAd0XY5NcAlaHHvScVToFxaDODHBm2Y=": "384615000000", + "ynpumGaI993j9QbiEdLpTE3BsZx7ydyjhremcYnbz0s=": "3418461000000", + "yo-y79acaeU-Pl1-d46d08amaE_t32_vhm03r7asymc=": "10539219000000", + "yoK1MaNigLh1JQNhhwtgiFJEqWDWEj6zGfZXmg9LX4A=": "566237000000", + "yoUJKHOdahXqyTBIKh3j1aQMsrCawhSQCPEG416FAWo=": "849347000000", + "yofOWKEoTsW4SP34rHD-cJzcHshR5HoQV8D1uVNAn94=": "407808000000", + "yp3gtXE9JK9fDUJRGJqg5fSDy_SER0a2Qbn2hbrP4kE=": "2291421000000", + "ypAmMxGCoWlatbWybIOuZiStIGq6uZNN8qVbvnmNZ0o=": "2727076000000", + "ypKpzAJOgo8EqGwc1ACXEkOf5JDIZwdyBpga9qdIo7o=": "384615000000", + "ypMK-Mo0cr-9cFcz9K_hcY9A5xV1aPwC6MSD27a_LIA=": "2116961000000", + "ypmPYkrBu5IH6EgG7-4NnrPJnc_cCW9QB4Z0I2lo_J8=": "385507000000", + "ypxtPagGDEBKHO-5Tg-YSe_GttOm3Vau2CeU3Y-W980=": "458858000000", + "ypzK4q5yWFaV3qlEtUkE3bOTRE1vQ3QtOOTT9IgN4tI=": "4167106000000", + "yqxtwTf1uR2tTCLkyJzA1rM24V1vyrE8HpTohKq4lKk=": "384615000000", + "yrqE2MIPOgOuzXH_fL9si3jrURCVr4zKpQcc8-uDfeM=": "501408000000", + "ys5iHPAZOmhAhmsO58xJ4HWlbfMwsCW7gFspyFv5HgQ=": "1001564000000", + "ysXj5jJF_9K_HnMXRXdRoETINt0yG5XX4Cenfz-rmb8=": "395497000000", + "ytBy6WPVpvncyfUI43HgbpXE3VSFPI7sSCdr87uUswc=": "384615000000", + "ytsMGVPBb1AE0jQeNDlQQPSgMqOrhDyMRH9Bfc3RlZg=": "788862000000", + "ytwE8WKSC1AizTOXYcYq3CVMU4GeMxgNXbjuYWLS7uU=": "384615000000", + "ytwXzKtqrkGxlzvb_SlgE9BV-nExUK_Al-i6OjSgAlQ=": "385506000000", + "yu5Y90RGr2gCORRvnpTUAqBXWE01gJEApqpfnQUYFbY=": "1153846000000", + "yuCNY-lk7dINlCjY-CzO3hLGF_ZDVX-DAXvQzcTBE4A=": "624575000000", + "yuUBWgLDAxCTAjVAk_v_l7b9dGGoJiCYaaIt6omcG_0=": "449217000000", + "yuxOHt7z_yRDJwDWXp567xvEDqdZVpKOnImG0nQ397U=": "2056822000000", + "yvB0ZYQgVqq7mYiSXq9TVd9_-vtXJYrwkTIgMJ6yHSA=": "781507000000", + "yvK7DfdU5uT9pv351Zw6HQUWeHZTn8VAZ78IBFS-n5k=": "417377000000", + "yvYjFyVKZgURuJmbmHKw90T4yg97Y_g-qUoD-xP0vYU=": "422117000000", + "yvfuaIdo1ntUs-gNBdNW6HHpCpOAr5l2KWmcmFlntKQ=": "944381000000", + "yvisXhhS8J6oaHBc8phpYuJkTxYf-5nE24j321DLBBM=": "385506000000", + "yvzrQKem1eeyTFEoPZON4Ahx0fuAjTpB3k7o9P8irso=": "390166000000", + "ywEyaxT9N8Oblj3l0NTjcU7iUozrAZbSGf_a-Uylvs8=": "454876000000", + "ywZ-Wo3FUSo2SiXnclP4k4evyHzO159KwfsxfUJvMXo=": "413846000000", + "ywbRWRI446OhZUBTt9X8wfnF9gcMR7zP1UQ1V8eDUNs=": "416666000000", + "ywkDwh2nTXMYTlTPvmrI52l4FshPJccWE2rRInUjB0Q=": "1208590000000", + "yxKeDXuMZX-xdWLXJ9Uqr3mSWZh6XUhRq-H5O5XHR-s=": "379323000000", + "yxQd0yb3H-8nExYPMAuThkV7C3lA211K4OMaXDmjX84=": "413226000000", + "yxmcd8X3VK-UmbxJ0uN2HqgLhCKiVWZ7mrtGa6u9pYc=": "385018000000", + "yxz8gQ4PofbbIO6tHCVh3-TJJdNKKdejvaK1LeUjUyo=": "576923000000", + "yy2MBVoLVps7LOijsv_zWG6ANg-j_Y-DXYip7kIkErs=": "384615000000", + "yzH2aYKTcN-m2oVGmGNfw2XC383qj3WdmO6LpZ1MCJM=": "996153000000", + "yzmcOQGmKXysJwbf1fdJhecQ-U2Ek2s8FrdjMeCAtxs=": "452840000000", + "z--C2pBcwXsKQ2r0ORBTylqNQP0CAH8HM94MEISKlok=": "1361814000000", + "z-31ffaqXuGbDMlutnlRgfsxhKslwGgFY4Paw1XQ8OI=": "403612000000", + "z-A6cm0c56lRvCqsoRZS9jCeZjhZG0fcQD_q19UHYUI=": "380051000000", + "z-ClkikibRlqDEliaSv1na2FlxQxF2ODjOjANghdqik=": "3846153000000", + "z-HLuXv0TsTnbrR1NlI6Esz6BxTRoiSosL3ELpo7BFU=": "445980000000", + "z-M2aS1D0SG_UKq3XRJ6Lj8W-xbBLNChmUJcw8-WnZ0=": "390067000000", + "z-PfeK14EZS9YBA6f6qrn6A2d7ZSMbxB8qQHDA1S6Tw=": "463777000000", + "z-QCBBbEdQjYo-3nAPHVt75k1udd12TAzpV5psXYReU=": "409355000000", + "z09WKMy9O9L3iQ1wluZb3mB_ccR7wUvunwodSD9MwT4=": "384844000000", + "z0Lg0qGZrk4QaD6yTFLtAJoclTkBRIdGg6Z_qXqkdNM=": "407808000000", + "z0WNgk7cbFL50_aWnJlGJlXoCgDak-l_Z4kgWOT0AjA=": "509391000000", + "z0Z0JEJEAxUCNzLGGtcbPnnlDxspA_iYPuoIrTyS-N0=": "3635773000000", + "z0o6IBomDQvLQCdENZFk4e8d-7U2cQfliQq395AVB-E=": "455600000000", + "z1K6tI-KsM8b6725JLlgHoh2IqeshN5_L-yxhF2OVkg=": "383796000000", + "z1RYXv3JlVGqpkbsffXos40olZwshANY7-IEwawzPuc=": "921789000000", + "z1guvwpJ9SLBWyM7XAbcjRVy5MCXhpQrHllb5Epj3KY=": "3957753000000", + "z1zmmfSoA3pkoonVLud0sJWFaQ6v0bVVgpidcAZZvwA=": "967054000000", + "z4kvaTP-4oKfWzSXdtdHjOnd2b_wdYYfyyv4TXqJ1Ac=": "380513000000", + "z5JODKY30QuXrt6U22XIixs2NVrqZZqGLrQZXBMoHp4=": "1363636000000", + "z5gUhoZSTOOHWbA8luc8guBGsR_yJYGUQiqoaPvOMZU=": "384453000000", + "z6PpYZfo8Qr0LLi9Sa6UQIxx9ULtapOqcZ0IL7flYCI=": "384159000000", + "z6QRwlRBIVpWBxX0YmP5nYpNRv-2TJwf72tJ7Yoy4h8=": "3653846000000", + "z7w-LQgZVLWOUiy6wtoSgnaqliw2s-eFlFiOmOt2144=": "463498000000", + "z8HUwyr5tb6o7tzkIZoSBb903CPUsk2fFhOBQF9ymgg=": "3347842000000", + "z9JsQDeXs4fOcUGV1-yUq99RV0BlLSK_wCjQnxYZBg4=": "378341000000", + "z9dA0XVHS-XCBMvHlHCqlj1SwB8zkWmhkCPxUJ2thYY=": "512565000000", + "z9qs_vx9yV8w9_D3ozK9CTETr2AVwfODKeW9pjHn3C8=": "3994400000000", + "zAFPTvyDRrAJV1U53sJ1YjEdro2ZX-dTpyr7YsDo5dY=": "563045000000", + "zAfdMhon31zf-XdYi2I5yebNcDrKu_183YziOtM-NA4=": "411085000000", + "zAv1A3HhijeCLpjg0O4kL192R1gJzD_X3K8VazaIj8c=": "3023506000000", + "zBTkmsvtDDQ-5OD26iFuVdqsvLzRcL9QCbsOa7wxYcc=": "454545000000", + "zC72MXQbGCl_DIdstCNcDZGDfXACLD7q_dD7b-IfOXE=": "462848000000", + "zCMqwAQduCV1hh9q_2KPePJJ228xa41CZ8OEwDDqOeY=": "386475000000", + "zCZyerP-jBY8TO0XmhtcNFHM9_5vf5L-hirM_yHSePo=": "740539000000", + "zCimJ2Ofs8dc8Gyb0Xe53LhgV0wv0xYj7Q9nCztmWsM=": "381123000000", + "zCopeLMokh5aDn5REXLIbqvYW8wPqkQx7TQOUOtj-Ho=": "385506000000", + "zDGZjZ7AqdbBdxb1oPn0G3BBKUAcNslVmIt_VylWoaY=": "379344000000", + "zDP28dkHgZjAF7gQ2ujkuYLbRkn1feMCqGj2JgI-ZDU=": "383595000000", + "zDzvuwXNy_Aa9Dw8tPzu-eg-cHV-sHS7-E-Ptt5rZ10=": "833333000000", + "zE3WcrMCu8eN444HRCaX665utvxJsWfX2CKoNu-af1Q=": "416673000000", + "zE56EfVAvv0XekVyBDGh2Iz1QT6X38YxlcBYO20hqa0=": "1773135000000", + "zEVe1Ppcr5XB0LQiCr-ylS10ou2DEPrprk6E3QhRCik=": "786892000000", + "zEmpBly0iS7MEys2ld7XRkjMMx5DdrnF7rknq5UN1XQ=": "858107000000", + "zF4bVnDoKjiblzkaWqE5Xk05vIGGTu_uy5abkhQ9qPE=": "814467000000", + "zFOvs0a_kKPN3RtesRae4UmgQzW8JrEon-aRl5reNOY=": "454325000000", + "zGCBnbMnfdbPYqXKTx01rSnLtuGnUgoMDlgnjkMt_Dk=": "11185669000000", + "zGVcAqCVLv0MLWrntLw1QUzO1O04Rh_Y8olbCaIDz7w=": "977958000000", + "zGeubC5m-iQCS2E5fXp0y92BX_XefneCJYu6n3mdm2E=": "411085000000", + "zGidMcW9tq2m2N4VPtsL7LPe0eDENMhxRNV-M0XT5ds=": "1161490000000", + "zIgC8htxraDQ0uCgV9nMGecXjCY-jP8vzVwMCkYNHy0=": "896928000000", + "zIhdIw7z5CQT3_realfnrPQ01iisHkm9iNwRn1x3hp4=": "412297000000", + "zItatTDv11zJ08YMeE-AWAX5fNnLCspnq0k9Dd8EOS8=": "403504000000", + "zJO4ggWhlH5SmT7VsyxKjdAoGTXjeHL-4t-0BiNZxTY=": "411085000000", + "zJRJM_DllKuBZEdkgANo3ZjnXHDG8ks6fSRfUmm5ebs=": "384680000000", + "zJcbd8ttZtdADd7SZyvoby4Kqm8zQseB8CSmMEcyCyI=": "2307692000000", + "zJmd8wyg5xHegzU3IumKsAUlTW-KctsOId4Z8Qt_8fs=": "384615000000", + "zK8m968_hK7RvPnhf9j_LY7BBSsESr8r3FuFlz8E3Gc=": "385509000000", + "zKWsyoo5wP8-RNMs8UHqY78TBH64lzKS5GDSu5Nv9wE=": "923602000000", + "zKpNK7ffok7FSFPBc25LQudoriCgg54yY9p4aPGHjD0=": "848090000000", + "zL4XNmB08thkmGNZm2rYlxTw93kHLmufrXkEt_LsuuU=": "3730039000000", + "zLHgwwBCqSh1sb0bZ2TfDd6-4jmOojkZQIvt_YdP2GA=": "1524935000000", + "zLla2jeJAj3VQYnmxYOd39JcxsJ6SlogdaKZds_SIj4=": "769230000000", + "zLqfOtaErOdhmXYMjTcyd9rDfghMfLfBXIKKOh_RQO8=": "16083693000000", + "zMDavWV50Q-mhDlm-ZgbYNJCKdtsHGdZb0tPH23lsDg=": "385510000000", + "zMKbEIk00e2rgjJ47BWvmPEMoE1dg2BW7usifXpn6og=": "1053269000000", + "zMQpR8u2lGbdWGfIRlCBgEMIqvRl0jE4b_EgaMdWK6M=": "425400000000", + "zMVvGR3CMbbVW8zO5243P7yK9BM482YrbXNh-eSm2Zo=": "381454000000", + "zMct16gT1fZQgMW3lqZtZp0hGKHLccueWda3TT0VHnI=": "455600000000", + "zMofaDZ7_vXAOiOJbtzVJc3jlyU6_UtKBTo26sqKhXM=": "505769000000", + "zMyMjpLbXz9EAqNtUtZAbWYpCsiOEwj4P7Dck7AuTqg=": "421927000000", + "zNZFJvSpVdAA9oa24cHt92gmOboBnWV7VMf6E7fZcGc=": "378746000000", + "zNpKczQkK-ZG5vgcnGAIatzwt2TqJDkq-6fSPJJO8CE=": "1858257000000", + "zO-4mZIuBmOrOfxYUtw61f6dzOClGkGxH1Yl7U2fNKA=": "776995000000", + "zO0je0bUStJtLWI7xjkyC8ZysctywvD-1sh1y5ckC6I=": "455614000000", + "zOBcJoQPGOaGLeUv2pejqd0XCoeXNzODG5MenJ-5eNM=": "384615000000", + "zOU_7KE6uFIUxgl1sWWNMIm-KqBXhgaNTJcFeUPIelc=": "769230000000", + "zOh6RclsM3z420VPD9Lz9WC3DDJvc_hMTKQfof5D_Jw=": "395806000000", + "zP6q8NKgSmAWVUVylc3DvcCEldNYK1fMp0aRJjfc6UI=": "384615000000", + "zPc1DZ_qKQGFBfznQeu6Pw0zoKUeQAJmZQqcClfYSHo=": "11783276000000", + "zPcEyWq50pLNj4-flCriauhPtObNU3L16LfqZaXzBKE=": "767539000000", + "zPh-eW4-T0T8RwTPyyaXxCFRAGcu3udlCioJP-qHCm4=": "457547000000", + "zQEek6N0BDlnkBf7AmHmCo5i7LquM8vPPdSJZ_VhBt0=": "12863625000000", + "zQSoFVNn5T6ROHYBqE-2PC8rOWXDOcfqbMNjG0RfjV8=": "385507000000", + "zQsaQ5viY1WwSrXFf4pM8DTKWypoxdrcMV7XXWM46SM=": "1252904000000", + "zR8N8MRaidCF-5i2I2O0B9-KqstFnp-pBHVk-9w3AQQ=": "450550000000", + "zRsoQa7DH_itob91R2O4SB3Lzzwv1QSOKnue_1dgbgI=": "999999000000", + "zRzAWeAnPiRMrSCzOLIzpTfhnv88joFWM1ipGiefZso=": "384724000000", + "zSTFwdsn-uHmpVhb1RYlJyZwJ0ijpIYPDRaONEYWgps=": "466541000000", + "zSZFtoTn8EsI3HlcnzYBJ5W2DK2AfZ5CdeEk_dE7RwU=": "769230000000", + "zSbn9ydCPAP5bMrUvxd78u70iVg4cWCwMMs-j938TtQ=": "461649000000", + "zSpMbHHkwUbNLYtH_GpMUhqu8m5eqyNDvUYRFeKyCjU=": "416666000000", + "zSrZEX1ZhAqMG6mJoIBAauo-rTPGDDinNbxfz74SgIM=": "385528000000", + "zT-QhhyZWEULaM2xzL3VSsWm7R0AfRKmJnrLFPmv0Xw=": "404478000000", + "zTNTR5eMJiENofFEESA3UeWY3ZgJ9KzRTym3jw1UI0M=": "385313000000", + "zTSV1NsdtrhFKbHX3PUrKjYXoucYqjDpFyi9N2z9iD4=": "2502164000000", + "zTWPjxW5rqykolLNcIwHCVdJSp45UR_SUA20e6Md-Gk=": "1031755000000", + "zTZ-COKEjkVw0p5gbBdyt6LeO_J61YHme9twiUM8Q78=": "469479000000", + "zTfw-7o_laruNl9tEX-2UeTW5Z42Xr-2ZBKxzmEStno=": "384615000000", + "zThcBx_BNe2GevnqHIekXZMyoGnD0SVZ2_8ayuavZjA=": "2155341000000", + "zUSakz0ehMqQVCqix3TU1mRNSHkV_MwbuPXSu8gJ1Kc=": "18393959000000", + "zUqxsvFz3PNePa3I5oOaQNIVuTUpfYJBBsJvUc9O2OM=": "5578077000000", + "zUsuNi4otxLx9FnuT_wOVYj-s42OnSSwi5mpB_06eco=": "381436000000", + "zV8XXzrhvWnmvUCX_Y5cJU2v6w2OnHe5Frp3co8ZjXM=": "1594707000000", + "zVKvHX9F3n9r6GgqwdgWhn9dOD3uFp_dxNMeOR1CmyY=": "769230000000", + "zVVvRML_ua-CRxPGWx3i2zcTBEVYamELY0F653xvCGU=": "411085000000", + "zWQ69PbSR_Xounc0yfwlGkbJadiqa4Qbx4o8_MHKgr8=": "946002000000", + "zWc1Rb_kZQYZKbFSNcfXcIh8r2ooV7Mhz9vfTD6rrdk=": "417636000000", + "zWiEDxyLY6-HsnuTKsn3t69cJ7X5tJdX-3CJkL2dDig=": "463270000000", + "zWtHHcGPv6l5zviclEZRuNAdlcd6I8XoCA3LoxzPjRA=": "385507000000", + "zWxhzdIo6tEFTHYXCjhx8IBSJNcnNMmGPaUH0Z9EytQ=": "1223425000000", + "zX8Kv8rNe2D0lUuULSgzt9MHPGPcE96hWHdUdIjcv5Q=": "414392000000", + "zXtOoYZduk2RPyRwty1Vv56GmsoGTX35Zxcp4QR6mSU=": "2132069000000", + "zYQ934WnCaST8X8AqY-79Xd6lsuDA_9aqW77793H498=": "384615000000", + "zYaEouoCZ5JjU3z4giqx4GkCysiPD1VRhj5gTIXafrc=": "6188061000000", + "zYqafhVNFUId3AKTXlWSHIAl5GxamJgjH4WiiEwIsFc=": "416666000000", + "zZDX3MbWHA5FcBPv0rP_xU6AzyTTGbakDUvHK-sqWm4=": "38550673000000", + "zZKDXQ4NVI-ZHvfswZOq4Cd8glKTcNOmJiGhNOhen08=": "462008000000", + "zZdd3PzVnk0J187Q-I-zvDP0gU8II2MmV-Q6YiHhsPY=": "473549000000", + "zZz-Q2G-EGXC6TbV4ako-zTDRNZdBavW41sIlcOyIPA=": "455367000000", + "z_aQ5QM-n2q4erm5_asd-yziCsrqStgEGrqhfwZidBY=": "1500000000000", + "z_c1El61QbCirK1YG9W7A4AMzZU5DYz3sRtVm6bbM_g=": "833348000000", + "z_jcXyK4qopp2xXgoPSDZM1_cTUxi2nRMoD5WrX1Fno=": "391797000000", + "z_vzR80eG_iECydIinfQRHjY3AENepfDD7uvqE2sXmk=": "902349000000", + "zaLNSOKoviFWSm8S7Dnmf405YpcPPUj9HB2si6uANXg=": "385202000000", + "zaRjDggHaMIWkEiyic8shSaYDKnK9yUBdPhW_Ak3rlY=": "3786121000000", + "za_NtMGkoEosbVIhKAmeVJTVDsci02aqe2jMXeJJV6Y=": "1946776000000", + "zaeKFGRrGeehmQCfcrQph7wY9N4a9Ae6EQgSnvqIRUA=": "454821000000", + "zaltOVsgwT3lVzygQx0e18K_AJUsWOw-h-EcQVfIJgo=": "644862000000", + "zamKiES1QM0lFQuTkVC9cSBwQO3woX9HoLMWlM0W4X4=": "769230000000", + "zawLat69tbES56wVZuqoECBx_yjpLe0IUZm_3oCFRNo=": "902995000000", + "zbWb1wch7W8aZYkPqDlCwwmZ-QNmp2QiX8ifQD-EwqU=": "500128000000", + "zbaE-MA5SiYznllr6YhflOvC-AKrqCM5k2OBNUYS5LQ=": "469837000000", + "zbvdyCPwqtccOwuQ5HrRFiu1XOO2B-EHXb6yW4lUlU8=": "2691112000000", + "zdIb51-eZljqpfYArIc8L1gb3zDjf-27tCzhjILwTIs=": "2479005000000", + "zdTxDJLT-pKRTqESoyEQV1EuOAvXbV0oaaCQz9ODLyo=": "377984000000", + "zdlZKq42I5ZP75lm7Col7mHHppkZite3YvTNlwL22e8=": "382597000000", + "zdpPXvVoHWG7z70zKrNLqTeOL2n1Cz-kE1O61AVrMDc=": "1250960000000", + "zduPyrEL1zaciu5Em8_OtcJSiY_gkU6tHBW9hG-Baj0=": "492721000000", + "ze2N-SpxBZEDbNqzuTYsJ8Untp9Y4uHdkhrtI9itMKc=": "909090000000", + "zeo5MK0Z1yAV4zHIj9gCW3SIUolbQDywOsEWqbsXG6E=": "809430000000", + "zf9MGcMPJOu1tssh720BtzFgAyNImPdZkrSXsNhH6MU=": "908792000000", + "zfH7Rn5eGTV6oGLFJm8Tor33SGp1YTa37aMvgx7lKmg=": "384615000000", + "zfm4JqdKVxmTB5tpKsILhcklo19AVoyfz7zJz2_aJ4s=": "421707000000", + "zg2ThTDufJ3NKAIW17M3DuPLsP_1VejNL9TeEf6VQsA=": "7488651000000", + "zgWSY8FF6tFZDPs7ABroXkIg2I3zyIuu4sQ0uWdQbYM=": "448254000000", + "zgX1L6SgM4oFQGb0p-YBx3m1J7oQ-1PH3OA6cyGne8A=": "384615000000", + "zg_t8iIRTVsJ39Cm1gEctOJFo-nHqjpx9DpQ6ljb83M=": "755181000000", + "zget-0kJ4euyVKzKNeG1K9hj7rlxO6UVNjSGIgE8yzw=": "472515000000", + "zgrxPAkBTngK8y76yxEnRI-36liFL_6aE7QzNXI6bWk=": "417334000000", + "zh6vhLSQA93tQe52Dl7mAUCncZJ7vjwT5c3xQfGLyPw=": "390883000000", + "zhGqP0j1h6sENYbg4428wwmIh-TfAl7nI0bvHEYIBOs=": "1695548000000", + "zhJAesO8i3uP_mzbzfJYxQ79OWgKna-A5hwCGpr3xHY=": "384647000000", + "zhP0rXS1bfa0aINM9X5wHNBBHrQmyjSsQDDQ7TIK1Ig=": "499999000000", + "zhPGUbOoLbBFRbx57lKrQF6aUdxTvP4x09ooAzxlfEQ=": "378341000000", + "zhm3KvzxTeHjrljODAxO7o7-S7z7GVFKoAt6saXMjk8=": "499999000000", + "zhqnNVlTnf2WbPvv_-InSxMM3VhJ8zZ-n87CVi6LOC8=": "465243000000", + "zhsYm3yPCFqCyVbrBTR1Eu_1JatQmapSUmHQRQZ5kqM=": "449694000000", + "zhxVuHkNEuOmYDX15CoTKHdz9bZkMvOZ8vW4CHP-wsw=": "381463000000", + "ziV0W9bkeuhX8ziF1lGCbaFubhfeASs0RUsMzCLZPvI=": "920270000000", + "zij8zKgKbfu2fFBt2O7RKXShCHOQ0jx4bURnuFH13zg=": "463216000000", + "zikSXM7RTG1JGUxymU03PZZBMsja0a2qICZ6EseEDgg=": "395545000000", + "ziyxJXH0jA3WESq2wadCAo6Iax6Eh9iGOfENxL1Zhvs=": "9401467000000", + "zjEisKZt9BUZwKJmYCrw9yGD6CmlxSrlSZmZqoBG4oY=": "384343000000", + "zjR5tq7YjHcIJ7zWwYeYHB1q3_9MetCOTGeD0urgC_0=": "384615000000", + "zjaf_0nU-5B6JpkNLQLuzxZ1nlzHRQrGpUqxwywL508=": "1160302000000", + "zjl2jylM0p763uHxETWWzpjsURKHEVCFfwTeIwuBqvE=": "928628000000", + "zjpgTLhWfkLO42gZOWRHN77x4rxhMnbhwUmQLHeJJ8E=": "412218000000", + "zkO2XzvvF6WzVotUzRCvG65zfj-U8yQ4Lxj7Fiu1HMw=": "463392000000", + "zkPQBMSzAIKK592U2ZiEWiqOG8yJCJc4DNnqS7yLi-w=": "1362714000000", + "zkZ3ddU8ZcRukyd81BL6Wc1QTYUUMY7-VudsBTtrStU=": "1129467000000", + "zkZXxSn_x1i-J3Bz0X3UIGM22Qib_iZrTq_pXpoNvgE=": "383849000000", + "zkgMsOOlVlbE6ohld4xeverXhycJbYA0j_M4COe-Zig=": "466680000000", + "zl8ZQpnSNPiRwiw5fCfDVMBCPJ3ZFwj2WGbGt9rMoSY=": "964607000000", + "zlFU6Uo_UK_NTlmYtQAFKPlPAlqp--Rw1fWTCDo1ldI=": "385505000000", + "zlK6ci6E3CNu7A8HYqui8k-svj0ZsMwZokAJA0HLf-g=": "2026785000000", + "zlKDnRhXe4MJbX493uCu--HpVYL3jpR5jiZEtyNqmWI=": "411085000000", + "zlv81k2JPm_0qzNj8VMWwQT9K0CXF5PvLKNJKzY2bBM=": "2269230000000", + "zm23Max18aVCQK-q2G7IovtKjHCGEF93mp6MJP0wI6M=": "379928000000", + "zm4YXEHIQvigi3dSmcgE2IKied6ODCwPw0GvB7PK05w=": "521500000000", + "zm8FOR9QklyxgJykzWMwIisrlTj8BtDBJpOYTfbwxwA=": "490222000000", + "zmtMXs6drSJppvTDwJNfEYettg0DyRmRc4ENfm-HWhU=": "1248759000000", + "znELWWP27AcIn9Edc4SBxglWw-DXV_5M7HOWjRHQ0nE=": "5052235000000", + "znQUMVvM58PqtWVZ_onMpDWd2T7gpL85oOOCq6JLqhE=": "384715000000", + "zoK9Ob6-tEhXrt7yqMq6unX3qJkuqk6PUxLGpCNC_rs=": "903330000000", + "zoa55Jhgx68HZBNv5JxH36sUyyuEwc3OLjG8AMB2l4g=": "2305747000000", + "zodcU8ZqgCPnQTFkXYIK1HVXLZRCysveqBNpk9NtFOE=": "835584000000", + "zoiuLn11RjX5dO8VogjZqnnk4KykRF-Dtz0QC0ObnN4=": "1242307000000", + "zoks631qqgol79Yyg3JmI6a2yDWiR-rcuA8iKVgX8Cw=": "454433000000", + "zp2mnN8y-_xX5sh_1ZxD-KW_aMSw-KbE07OrQ-gB_jQ=": "40021142000000", + "zp8a50tyr3qynF-npJY5eDJZtPO4RnLFN1I9jcRl5zs=": "1030246000000", + "zqMtIAi0d_8R---m37Ts_D_PrvpA970dFbUF9EOJiyU=": "375593000000", + "zqq4Av3qFkUernvteiMNxvVb8XhWyIOLxi6a0usFNss=": "384749000000", + "zr69u0Jb00PdCMywJe1z5o3654tIlytU_PN1YehaUfE=": "459182000000", + "zrBL5i9opUMkImOH8t61yGjFW71dNd_INmasul2Xwoc=": "1351257000000", + "zrBjOSI4TTA3unNykXwGBb8cTvpNMZ5mTu4iK6F3_oE=": "384615000000", + "zreo0vRPd3rD_wX0IvBtqJkPpBpoOHz9_dSnJMrYpoA=": "413111000000", + "zrlJ-3jauFECjBs9hPNKWoe_wMAA90PxQ-zVqZCayZA=": "380413000000", + "zro5tQR5qp1G6UbJYUzFmJpnyjsw4-QqyLdXoHtn4Tw=": "3755395000000", + "zs2gu4O4sRURaOLm-bLxp67iAs27kI2ap0Nk8hJLXok=": "769241000000", + "zsAYeKaqvdR9qCO_bFPEbiYL3viZCsyl1ZZ1ubHtyUA=": "385507000000", + "zsEqTzDud3L5dJ-rL_bGon7D-x0kzgjUg5mLHYd8W40=": "405357000000", + "ztBjWNL9hV2yp1uvxsWR7taUJi6S1TDJxx6d34XgUS0=": "765466000000", + "zu5hQ6XaOHk-UGbb4zGfoPI69pbW7mbFTlwzS5uO_As=": "451018000000", + "zu8BGw2Icdw5Y4437a3Y1GcA_H84pJviUQbmKGQLAj4=": "446353000000", + "zuW54Rhpv2XDgDhlbHEjiRFnl95HU3buvnWcP8FFsoI=": "417632000000", + "zub0I3Je8X6nIB-5hzebDoTC37-KAbz2lt8qn1FESMc=": "1475532000000", + "zuse_l4u5b6g75GVDJiciqUIsVOAUL_400Adhq30sbc=": "6747307000000", + "zvTS-QkaNEMvws-zN18vtQrDogs592nPbTsvDO-6VsE=": "2059661000000", + "zvaKjINz8CFKNkyq-cZGXQtn_iyg4EjY_7abK-LyN5k=": "351985000000", + "zvdlh2hRABrqx8TV5uNA6JggS4b5lWb-u9cvaOEzgyM=": "763472000000", + "zw0YHGV2lMF7_tiFQIl_mDrwXTg1v7xFihBjHnW0JQQ=": "3177607000000", + "zw_iD-vbatNkBN6K_3LEuf0hOa-2d_YAjDzwqjdEfHE=": "8184351000000", + "zwsZLONiMOEH1DkTqTs59bt8emqB0OF907Y5EaJr4so=": "391429000000", + "zxgYuwWddc-6HMOU8xT6BG7C4znTf6IQ2aBz3b9UfuA=": "810432000000", + "zxtBAhluYR0AU-6k4ItOvqygRCc2JO9ww7S0MHRpAbM=": "386020000000", + "zxxoLQ8pZGyqAMywrFgzmCjYPkhSwnPXIYlot6z9xc4=": "1123552000000", + "zy95aaJwOIME8PyBSvTzcN-cSkiDdpzb8bCtBV-senU=": "2055429000000", + "zyhwJzvkyIAFnr6_H6by-p2m_y1befbo6De7RNE9UWw=": "812990000000", + "zzLMmvC_FLPkEKdxF18RKKD1oUiNHijOCY7whztL-60=": "444868000000", + "zzSg0APQsBqgiYqd9RmQXHdMQGB0ELxcNf63Gw150lA=": "451750000000", + "zzYGnA1j5ZrDq3u5MI_ZyjrZ4HohcqIEgaAhVH_-c7g=": "384618000000", + "zzk-mHcdo_-fLCmHq72qwAMmV6D8E9dWsYOc_N3HAGs=": "472670000000", + "EXIqdPNaKsWCjLdhv_SpveI4DAEfzs7fu9I-aJDlxtE=": "1000000", + "pso9BlSESUlBOJsWoyMTQ6KQu_5If1lM-JXxcWQZCcw=": "1000000", + "NmpL-2uBZj9Ud0aKtQ94FxyOynm0EyqFAie9umf02sw=": "1000000", + "fMywKku2XZPn0hHgopz5TPq_IH_K8DQPTgBcyc9lPmQ=": "1000000", + "JYlnKiCl03Xiyu0fsNMKJcFlyqg29RNL5EyrCPxqP3U=": "1000000", + "Bo0Z_sEDsvgN-c4eL-j23HCjP_wbV5BZzIrTe6U6tM4=": "1000000", + "6YgMsJxoljXccOBra7JWVTF5sXF_oJRtPgQUOE8i1rU=": "1000000", + "OA__yy1yzQhFvQsmF_g7OiwqRBxKqNqrc4INnGV5xO4=": "1000000", + "pkPmUH8TZznveB6AP_tiVy_6mcJXv2OAZou6ZDukc78=": "1000000", + "QvmpvWW0RwLIXIIvw0T70RGPWFcfvf0zfLl8A-w6fpE=": "1000000", + "QZfhl9Oym32ivExdgOuv7ib1TUweYArl2VNmc2OSJR8=": "1000000", + "VYxFlcyJaBYBzCPu-D4ExUbRA6EpIHvckK8iXhPqcZ8=": "1000000", + "hP-oIkn7cEB4igep_5QCH9EDSGmRJDuIZrqis6JEw9g=": "1000000", + "VbFEhy8Ek4KJ0XTDv4vIXP9AJZ_HLfReVxHgWStCKM4=": "1000000", + "MgKJC2PPMwRxJV_he5Hdjjgk7Krs-doH6wfmX4Pr7xU=": "1000000", + "LO8KVvlkwROmupn6k1ZAilsLhnCxeCQh-IGDZZKV4pI=": "1000000", + "p6vAS4YpCICHYELeOq8qWNw5dWgkj_a5z7dd-fvRxLc=": "1000000", + "nQPPWXu2nL0_hngiiqavfbBedKa8kgci61Zju2J4xck=": "1000000", + "QK5z1Nso4FSDkksI6WntCuEn_r2iZWkPDdiHEXtmVu8=": "1000000", + "W4N7IecQ6SFusvCyBLkvMKeCD6fwgm3w6F3WLcG_uPE=": "1000000", + "qDymZoQEifqdn1rVNefg_eAQEwLJdCGhf-0tl4tJzCE=": "1000000", + "YROeciz8Tl5A736dQvfeQ6xG7tDFDrlmWXqApzdvyJc=": "1000000", + "0hFpatOL2r61YPcvBEpmixqfHGOIOiOcZxpc-cdiCqg=": "1000000", + "Q2sB1G7-N_dmOARf8rJDJEIuoYx_2suwHfQC4IEbd6A=": "1000000", + "wi2fHknao4J5kXB0I8RHLTNYzUzUn_AhF410JHNQx58=": "1000000", + "F5E4zk90Yar9UXPuox7hbK-o2GDL4GsJ3mSE7YyjGl0=": "1000000", + "7VPY13iXRE9IgVzeJZXuD--aVO4-Bis6y9_ao2SM7vw=": "1000000", + "NxW59jOreWgj2EhMRlCnwBsw37Bl8E7C4nVBjdHpHeA=": "1000000", + "RU4zCzbmU7MCTrehA3umBJB1C5hXNzU6udUsr_vsmFg=": "1000000", + "1dHNY7AZK6aXqrSySMOvf0vpaqF97B-Wz-Qj28tq2bQ=": "1000000", + "IVC_8MGyKQ5T9abq_ts2QMcw2-_2pAGPrpLIZd3qXhY=": "1000000", + "mioy3pImzdfsdydUVvlPaobm4WutTvbjle45rxhQfpQ=": "1000000", + "vnmHmYkv7FTEw0Vowh8wtojnBxUfTjtkHSTfpKKW7-4=": "1000000", + "deo7O26FMunxtf99KPvFMk4xMdnwrwwAnCF2YEnnwhU=": "1000000", + "Xi4H63FKXJ7h6AvYY4GD_woP6fMcpqkOXhvpJjnR9dQ=": "1000000", + "ANxzBDedix7vRsQ-CZB3nPkpXeGsv9NwFbauKx1GPi4=": "1000000", + "X7F8wzhUJpq5G-Mg9zdNYXrraiqP_gSP-TakiK-1XJg=": "1000000", + "O-QDlWiya5w6bWL9LaxZvUIMZr3SB_vQGdronVPqz34=": "1000000", + "UkC0OBumnDpyN7yTonJABJVoHcE0e57gUBiBD5m7mPc=": "1000000", + "I8os_IpCAAqXWUh-J8CVWdgO7sXmbcSq0Vx_gHE1Kys=": "1000000", + "kan8Y7-_nw4VKfcGM3VkDHs5CHRu8OwrdyaULM9p8bI=": "1000000", + "-QdRHkfh5v-fGJs1RzL8o2gYlKjA_DI3jPsZE4drwGg=": "1000000", + "1bNRW-8El-C6tjT2oTaC6XJsndWe-_0Jf_NitqgjmC4=": "1000000", + "4nJkiLu9eGI-o9LQliDuzNFZXZ2BQF1ddXNSet-TRuY=": "1000000", + "QlTiTDViEdXVFVI1v86D1GIQYxf-kM71TfGLgD1_N4o=": "1000000", + "yZBmdBIHwqkTHSa5s-jr261Twn1MeAHqWhRiNhrzbo0=": "1000000", + "QG3eombzAhT27zR1osK6P5V1jS_IuyP6-eNhQRaKFN4=": "1000000", + "VrwLb3ZgcE6rVs2GjtPKGfK7D8JgkMnrZiJ5k0lZTsc=": "1000000", + "1YHjK7gTM9RKXqp2Lq4BSdm2Dfv2u1CXjYSqTh8_bBA=": "1000000", + "3S5lNAgDi77UmxFOdDUszQerXE3phnpgdWWhQQGjZJY=": "1000000", + "84LIweGTSRwPaJXFDkW3NRvw1pN30T0nx2vryABo8wQ=": "1000000", + "V9QrQ2x55Ig20rLaE2XSd0ym5WNUU2256XfmV6DxtEg=": "1000000", + "kTlkGYuWa8kv6bQabhkMFIXhc_mq8hYnBwTGJWj5Ltc=": "1000000", + "XmjoesNh6oRqfSxpOE4ksdt5T1wGXA9Kzt2PM37Z-_4=": "1000000", + "aAOJsRGygvJghSpdt_PBHZhq5Xr0--9j0esEWUC6C6w=": "1000000", + "YhtX5DY9y_4rz6UipJtBqVNPl49fNZCU3CCYj8FZJ_I=": "1000000", + "EdZ3DVwtHL8SWs66EE9Q1Z2G1BsWA3O5H9apSnqSfGo=": "1000000", + "NOdT1zT9G7jkDgo1fYs57kS7ZgJ4LZSUuBHoOVdmy7c=": "1000000", + "yhMtPSw5m2HN90XPEIglt-M3jkIog2juvgmg2cthUvQ=": "1000000", + "5T12MntOlbsYH9AO86QtxP5R0O7zM7jjW3UFKlbAzCw=": "1000000", + "E86nSQfWqnzHKEm1MQirIDT8bHeOtX0SpXAnmICQI-U=": "1000000", + "GBmgESXOoDvkDRDaMLaPOPh5CslfVm02CjpaORkq-Dk=": "1000000", + "y55NmCPK9Y66znWCPAR2S4ULjs0O1b16kY3FJ50e3M8=": "1000000", + "gqcvfQ8zA_W-DIMyz0aeDyoZlCMwL9yy0_sUcx_Vhrc=": "1000000", + "bglzb5blhne2oU5fKacQFb4tk_GlWQkSBw_d-rKi6Ss=": "1000000", + "Tgb-ZbIAKIQjIxbmiOMPXI0FBYGTjOfDxhZWfhHGNyo=": "1000000", + "kETCIDB0PVn7T0Vuu6UeWRH2TPbABaKs7IN0yZTWRew=": "1000000", + "YWh3KTsWM8OCi-URndhaS82wpvhF0b25Ztx_vX2wTRg=": "1000000", + "eKEZetRMwX98ft4haziaVXvNc98TNAAFcKU8OPVfFpE=": "1000000", + "BXj0WV7eFikLEC7PCU_1XcMe0onv6prvDyO83HxkjWo=": "1000000", + "h8B6u9Ygj7VflikkWywJ-ZByWmEb9UuChiVVTTqeItA=": "1000000", + "19p3eJjO_LNe7UKxiQZ8bMR0TawemHk8djhIoeReiAE=": "1000000", + "K0IMfSF9_OoLbkCW-DPrwlcKCmKAK8l915rgcKOrT_s=": "1000000", + "GHmzOwF6Awdfc8r5oa-F40HGmOcha602DfbeiBH8fn4=": "1000000", + "AI-MuWYFSy59YCDh1C5Igj3dBMRMzEDKoO7qEZ0dQg8=": "1000000", + "jnV8RwX_ROa_jkjX_kUHZRhGbHb_5NAvOshdPqRyENc=": "1000000", + "-vZRkzjIbGn9UdcD5oGJiKnGiKHmZ0wso8DWMEyrS7M=": "1000000", + "R7tu8GLKHSsfsfGzI_DaAWsBrrgRYejj8liPYXtnyok=": "1000000", + "sOnErK3Adm5gqJcUAP_Er6vEbJzlltvZh_VbK4P9eao=": "1000000", + "HvrJwjO0EarxcFDccS-SXoO3H9-lmBnQuyvvIwe-R4s=": "1000000", + "dcbpvBiy-vrrPpnMbrpPg4tq1kWllf-aS4OhvzXTuGo=": "1000000", + "Va1CHNfKouuj1wd5KYy3qredBCcKFbF0cXu1qU5He7g=": "1000000", + "2T91AlqwjTou3RLy6KsUjaXfgrdqRmBCpQB1xDynhnQ=": "1000000", + "CiGGvRaHdSRD6fkmz6PnUiGeai8PbH0XiDuKH27te_k=": "1000000", + "qsipweUQqHJO0gMxR7c6a8vgQmztlAz7_PeMa0Mn_Mc=": "1000000", + "wSR4D2pnUvevLB688yFq_i58QeB3-g-Rs_FQKHvNBpE=": "1000000", + "u_KpiOfRLfUVNr-hKKk_R30MlazM7IkCRykd0fSwrPA=": "1000000", + "a0cNhiexJphG6-byQMbXUv6Sc2ia8XEyqR_hfSM0MyA=": "1000000", + "Lb3itXes6IKXaT5hhNxHo85hq9p3jXmHHnvAvUKtde4=": "1000000", + "0WDV35rP20S2Kgiq1ZT8t3u-MMwIhYB-SpFLY-TMYIc=": "1000000", + "S5AETIobCjtm-wGz41qctRYClISKtVm5WQl5Mt_s_sM=": "1000000", + "ufdpN0pr0XSX6zM6TFLIbqbmCKjl5mOFMmRwzVWd2Wk=": "1000000", + "jlrtJFiEaWBwqscKn0trbdF57cJG0gWwWSy77zfksz4=": "1000000", + "jAve37urJqEwgwBRL_sbIg8GjuE_dhKvsHbCLeP7dkE=": "1000000", + "rmRhP2qqwDrIowGDWaLIt1cUXhT26qdUrM6Cfk2_noU=": "1000000", + "GAEWYvFCgYR_REWE0rMzz0bttgZbQAffI5nrg9C1BrE=": "1000000", + "50OTwx-p9ZxFbqUI4debpIPX5dbUquAR_Ze8XTTwpOo=": "1000000", + "TZnMXsbBiRpIMVdWB3GhFEY9kqUw34_WTgP2j1cd6bc=": "1000000", + "iZrqDRzDc0LUtcyedAFBlZnIuWcfOuhFnw0mLm0Pfuc=": "1000000", + "reC2xKbUqVou_9pA0oHhrL8V93VPO43sUF5jCSyU8kM=": "1000000", + "URVk8FxX6Ik9z-Cub09oOxMkp6FwNq27kJUXbjJnfsQ=": "2463071701000000", + "ocEVzr7ctJ3NyCWj_356QsTyINKoJlwCCAgKFGPjvqg=": "2074165643000000", + "5Y1_PK90x1jCNzzQwthIt0RGT7E3PAPwDI-tbHN39l8=": "648176763000000" + }, + "blockVersionData": { + "heavyDelThd": "300000000000", + "maxBlockSize": "2000000", + "maxHeaderSize": "2000000", + "maxProposalSize": "700", + "maxTxSize": "4096", + "mpcThd": "20000000000000", + "scriptVersion": 0, + "slotDuration": "20000", + "softforkRule": { + "initThd": "900000000000000", + "minThd": "600000000000000", + "thdDecrement": "50000000000000" + }, + "txFeePolicy": { + "multiplier": "43946000000", + "summand": "155381000000000" + }, + "unlockStakeEpoch": "18446744073709551615", + "updateImplicit": "10000", + "updateProposalThd": "100000000000000", + "updateVoteThd": "1000000000000" + }, + "ftsSeed": "76617361206f7061736120736b6f766f726f64612047677572646120626f726f64612070726f766f6461", + "protocolConsts": { + "k": 2160, + "protocolMagic": 764824073, + "vssMaxTTL": 6, + "vssMinTTL": 2 + }, + "startTime": 1506203091, + "bootStakeholders": { + "1deb82908402c7ee3efeb16f369d97fba316ee621d09b32b8969e54b": 1, + "65904a89e6d0e5f881513d1736945e051b76f095eca138ee869d543d": 1, + "5411c7bf87c252609831a337a713e4859668cba7bba70a9c3ef7c398": 1, + + "6c9e14978b9d6629b8703f4f25e9df6ed4814b930b8403b0d45350ea": 1, + "43011479a595b300e0726910d0b602ffcdd20466a3b8ceeacd3fbc26": 1, + + "5071d8802ddd05c59f4db907bd1749e82e6242caf6512b20a8368fcf": 1, + "af2800c124e599d6dec188a75f8bfde397ebb778163a18240371f2d1": 1 + }, + "heavyDelegation": { + "1deb82908402c7ee3efeb16f369d97fba316ee621d09b32b8969e54b":{"cert":"c8b39f094dc00608acb2d20ff274cb3e0c022ccb0ce558ea7c1a2d3a32cd54b42cc30d32406bcfbb7f2f86d05d2032848be15b178e3ad776f8b1bc56a671400d","delegatePk":"6MA6A8Cy3b6kGVyvOfQeZp99JR7PIh+7LydcCl1+BdGQ3MJG9WyOM6wANwZuL2ZN2qmF6lKECCZDMI3eT1v+3w==","issuerPk":"UHMxYf2vtsjLb64OJb35VVEFs2eO+wjxd1uekN5PXHe8yM7/+NkBHLJ4so/dyG2bqwmWVtd6eFbHYZEIy/ZXUg==","omega":0}, + "65904a89e6d0e5f881513d1736945e051b76f095eca138ee869d543d":{"cert":"552741f728196e62f218047b944b24ce4d374300d04b9b281426f55aa000d53ded66989ad5ea0908e6ff6492001ff18ece6c7040a934060759e9ae09863bf203","delegatePk":"X93u2t4nFNbbL54RBHQ9LY2Bjs3cMG4XYQjbFMqt1EG0V9WEDGD4hAuZyPeMKQriKdT4Qx5ni6elRcNWB7lN2w==","issuerPk":"C9sfXvPZlAN1k/ImYlXxNKVkZYuy34FLO5zvuW2jT6nIiFkchbdw/TZybV89mRxmiCiv/Hu+CHL9aZE25mTZ2A==","omega":0}, + "5411c7bf87c252609831a337a713e4859668cba7bba70a9c3ef7c398":{"cert":"c946fd596bdb31949aa435390de19a549c9698cad1813e34ff2431bc06190188188f4e84001380713e3f916c7526096e7c4855904bff40385007b81e1e657d0e","delegatePk":"i1Mgdin5ow5LIBUETzN8AXNavmckPBlHDJ2ujHtzJ5gJiHufQg1vcO4enVDBYFKHjlRLZctdRL1pF1ayhM2Cmw==","issuerPk":"mm+jQ8jGw23ho1Vv60Eb/fhwjVr4jehibQ/Gv6Tuu22Zq4PZDWZTGtkSLT+ctLydBbJkSGclMqaNp5b5MoQx/Q==","omega":0}, + + "6c9e14978b9d6629b8703f4f25e9df6ed4814b930b8403b0d45350ea":{"cert":"8ab43e904b06e799c1817c5ced4f3a7bbe15cdbf422dea9d2d5dc2c6105ce2f4d4c71e5d4779f6c44b770a133636109949e1f7786acb5a732bcdea0470fea406","delegatePk":"8U9xLcYA15MFLUhC1QzvpOZYhOps+DcHB564zjAu/IXa6SLV6zg40rkXhPBIJNJnZ7+2W9NqNudP7EbQnZiFjQ==","issuerPk":"JlZuhvxrmxd8hIDidbKxErVz9tBz+d7qU7jZnE7ZdrM1srOELw44AAHwkLySPKqWke2RFeKG2pQh4nRcesyH8Q==","omega":0}, + "43011479a595b300e0726910d0b602ffcdd20466a3b8ceeacd3fbc26":{"cert":"cf6ddc111545f61c2442b68bd7864ea952c428d145438948ef48a4af7e3f49b175564007685be5ae3c9ece0ab27de09721db0cb63aa67dc081a9f82d7e84210d","delegatePk":"kYDYGOac2ZfjRmPEGKZIwHby4ZzUGU5IbhWdhYC8bNqBNERAxq0OUwb9A1vvkoHaXY+9OPWfWI9wgQFu5hET0g==","issuerPk":"0pZchpkBIxeYxdAtOfyip5qkfD6FSSG1hVyC/RRwiRUX4fp3FlXsjK0T7PblcZrcU5L8BX4XA9X1gzEeg3Ri8Q==","omega":0}, + + "5071d8802ddd05c59f4db907bd1749e82e6242caf6512b20a8368fcf":{"cert":"496b29b5c57e8ac7cffc6e8b5e40b3d260e407ad4d09792decb0a22d54da7f8828265688a18aa1a5c76d9e7477a5f4a650501409fdcd3855b300fd2e2bc3c605","delegatePk":"icKfjErye3rMvliXR4IBNOu6ocrzzpSScKPQx9z9VBsd7zJtLvDbeANByeJh8EiQze7x+cmfbZC47cp9PPwJiA==","issuerPk":"mTqPBW0tPlCwrGATnxDfj4Ej1ffEgXtA2sK13YqpSoLoU2gy5jEt38B4fXtTEMgVZVraT9vPaxIpfURY7Mwt+w==","omega":0}, + "af2800c124e599d6dec188a75f8bfde397ebb778163a18240371f2d1":{"cert":"e03e62f083df5576360e60a32e22bbb07b3c8df4fcab8079f1d6f61af3954d242ba8a06516c395939f24096f3df14e103a7d9c2b80a68a9363cf1f27c7a4e307","delegatePk":"YSYalbdhPua/IGfa13twNJcpsMUNV7wc8w3g20oec6iF0AVK98I/xsN5GdukHGAqV+LQ+TKaeVS4ZzONb7LJRQ==","issuerPk":"G8l6L+AsKXiAzo7P2Zf+TB7AnuEP7u6faGdgFmsFKB1ig0aP/ZO+ywyVbM3dZC35sSRMkVkRGF+kk1X28iv6uQ==","omega":0} + }, + "nonAvvmBalances": {}, + "vssCerts": { + "6bef444609d6e336cb1fe1daba278918dbc5768e6754c2945dd8d25c":{"expiryEpoch":5,"signature":"2d96e4d4a4c506cc5762128b814ffb20afb97d30eb976334cd241a3935bd155ea1d68772b0903bde4584470359206769d83fa2ce55f56a1027ec3c52cb5e8703","signingKey":"6MA6A8Cy3b6kGVyvOfQeZp99JR7PIh+7LydcCl1+BdGQ3MJG9WyOM6wANwZuL2ZN2qmF6lKECCZDMI3eT1v+3w==","vssKey":"WCED6k6ArqOnhQtfNRg0FSCxWmAtocZcyV33AdjMotjGwxI="}, + "eb649333a196ecb024a4a5919d3ce86084014136fd3e884e52ecd057":{"expiryEpoch":5,"signature":"0b115a39935ce6008a4bbad0377f35463fd3510e282186ba43492768a02eb000bd4d3bc50799a24c53879ff2f2587179e797ee1c312acaf107cba67f91cb280b","signingKey":"X93u2t4nFNbbL54RBHQ9LY2Bjs3cMG4XYQjbFMqt1EG0V9WEDGD4hAuZyPeMKQriKdT4Qx5ni6elRcNWB7lN2w==","vssKey":"WCECS11PWxybUHKY2hHmBgm/zYaR2YsqsH+f3uPOp2ydz/E="}, + "5ffca3a329599727e39a7472c5270e54cf59a27b74306cc9f7fd0f5e":{"expiryEpoch":5,"signature":"6cc8d84dd55b41efcf46c4b3086da1fb60c938182b4b66657650839d9fac1e2194a8253dc6d5c107ac0e9e714d1364fff9d2114eae07363d9937ee1d92b69c06","signingKey":"i1Mgdin5ow5LIBUETzN8AXNavmckPBlHDJ2ujHtzJ5gJiHufQg1vcO4enVDBYFKHjlRLZctdRL1pF1ayhM2Cmw==","vssKey":"WCEDca27BxibVjQoA1QJaWx4gAE2MUB0lHfb6jJ3iorXD7s="}, + "ce1e50f578d3043dc78d8777f5723cc7b6ca512d8cdbe8a09aafc9c3":{"expiryEpoch":5,"signature":"2b830f1a79d2baca791a90c3784d74ec9f00267efac5ccd3cd7082b854234f411c237b59f34736933ba626fadc87fd6b2114c44486de692892d7401343990e01","signingKey":"8U9xLcYA15MFLUhC1QzvpOZYhOps+DcHB564zjAu/IXa6SLV6zg40rkXhPBIJNJnZ7+2W9NqNudP7EbQnZiFjQ==","vssKey":"WCECs1+lg8Lsm15FxfY8bhGyRuwe8yOaSH0wwSajLRYeW/s="}, + "0efd6f3b2849d5baf25b3e2bf2d46f88427b4e455fc3dc43f57819c5":{"expiryEpoch":5,"signature":"d381d32a18cd12a1c6ff87da0229c9a5b998fd093ac29f5d932bfc918e7dbc6e1dc292a36c46a3e129c5b1ef661124361426b443480534ff51dacc82bf4b630f","signingKey":"kYDYGOac2ZfjRmPEGKZIwHby4ZzUGU5IbhWdhYC8bNqBNERAxq0OUwb9A1vvkoHaXY+9OPWfWI9wgQFu5hET0g==","vssKey":"WCECgow+hJK+BxjNx0gIYrap+onUsRocObQEVzvJsdj68vw="}, + "1040655f58d5bf2be1c06f983abf66c7f01d28c239f27648a0c73e5d":{"expiryEpoch":5,"signature":"b02e89abb183da7c871bca87a563d38356b44f403348b6a5f24ee4459335290d980db69a6482455aae231a9880defe2fd4212272c4b2ea3da8744a8ba750440a","signingKey":"icKfjErye3rMvliXR4IBNOu6ocrzzpSScKPQx9z9VBsd7zJtLvDbeANByeJh8EiQze7x+cmfbZC47cp9PPwJiA==","vssKey":"WCECQoZjWJSu/6R74CC0ueh7cXmR0sasmTuCqf8X0BtAQ4o="}, + "1fa56ba63cff50d124b6af42f33b245a30fcd1b0170d7704b0b201c7":{"expiryEpoch":5,"signature":"7bb244c4fa1499021b0f2d36515a1f288a33cf00f1b88b57626998b439dcfb03ad88a7bc93101e4d83cdc75329799fbb2ccb28a7212a3e49737b06287d09b00c","signingKey":"YSYalbdhPua/IGfa13twNJcpsMUNV7wc8w3g20oec6iF0AVK98I/xsN5GdukHGAqV+LQ+TKaeVS4ZzONb7LJRQ==","vssKey":"WCECNXeQRqiTZSPDDyeRJ3gl/QzYMLLtNH0yN+XOl17pu8Y="} + } +} diff --git a/mithril-infra/assets/docker/cardano/config/9.2/mainnet/cardano-node/config-bp.json b/mithril-infra/assets/docker/cardano/config/9.2/mainnet/cardano-node/config-bp.json new file mode 100644 index 00000000000..c5ff1016edd --- /dev/null +++ b/mithril-infra/assets/docker/cardano/config/9.2/mainnet/cardano-node/config-bp.json @@ -0,0 +1,109 @@ +{ + "AlonzoGenesisFile": "alonzo-genesis.json", + "AlonzoGenesisHash": "7e94a15f55d1e82d10f09203fa1d40f8eede58fd8066542cf6566008068ed874", + "ByronGenesisFile": "byron-genesis.json", + "ByronGenesisHash": "5f20df933584822601f9e3f8c024eb5eb252fe8cefb24d1317dc3d432e940ebb", + "ConwayGenesisFile": "conway-genesis.json", + "ConwayGenesisHash": "15a199f895e461ec0ffc6dd4e4028af28a492ab4e806d39cb674c88f7643ef62", + "EnableP2P": true, + "LastKnownBlockVersion-Alt": 0, + "LastKnownBlockVersion-Major": 3, + "LastKnownBlockVersion-Minor": 0, + "MaxKnownMajorProtocolVersion": 2, + "MinNodeVersion": "8.12.0", + "PeerSharing": false, + "Protocol": "Cardano", + "RequiresNetworkMagic": "RequiresNoMagic", + "ShelleyGenesisFile": "shelley-genesis.json", + "ShelleyGenesisHash": "1a3be38bcbb7911969283716ad7aa550250226b76a61fc51cc9a9a35d9276d81", + "TargetNumberOfActivePeers": 20, + "TargetNumberOfEstablishedPeers": 50, + "TargetNumberOfKnownPeers": 100, + "TargetNumberOfRootPeers": 100, + "TraceAcceptPolicy": true, + "TraceBlockFetchClient": false, + "TraceBlockFetchDecisions": false, + "TraceBlockFetchProtocol": false, + "TraceBlockFetchProtocolSerialised": false, + "TraceBlockFetchServer": false, + "TraceChainDb": true, + "TraceChainSyncBlockServer": false, + "TraceChainSyncClient": false, + "TraceChainSyncHeaderServer": false, + "TraceChainSyncProtocol": false, + "TraceConnectionManager": true, + "TraceDNSResolver": true, + "TraceDNSSubscription": true, + "TraceDiffusionInitialization": true, + "TraceErrorPolicy": true, + "TraceForge": true, + "TraceHandshake": true, + "TraceInboundGovernor": true, + "TraceIpSubscription": true, + "TraceLedgerPeers": true, + "TraceLocalChainSyncProtocol": false, + "TraceLocalConnectionManager": true, + "TraceLocalErrorPolicy": true, + "TraceLocalHandshake": true, + "TraceLocalRootPeers": true, + "TraceLocalTxSubmissionProtocol": false, + "TraceLocalTxSubmissionServer": false, + "TraceMempool": false, + "TraceMux": false, + "TracePeerSelection": true, + "TracePeerSelectionActions": true, + "TracePublicRootPeers": true, + "TraceServer": true, + "TraceTxInbound": false, + "TraceTxOutbound": false, + "TraceTxSubmissionProtocol": false, + "TracingVerbosity": "NormalVerbosity", + "TurnOnLogMetrics": true, + "TurnOnLogging": true, + "defaultBackends": [ + "KatipBK" + ], + "defaultScribes": [ + [ + "StdoutSK", + "stdout" + ] + ], + "hasEKG": 12788, + "hasPrometheus": [ + "127.0.0.1", + 12798 + ], + "minSeverity": "Info", + "options": { + "mapBackends": { + "cardano.node.metrics": [ + "EKGViewBK" + ], + "cardano.node.resources": [ + "EKGViewBK" + ] + }, + "mapSubtrace": { + "cardano.node.metrics": { + "subtrace": "Neutral" + } + } + }, + "rotation": { + "rpKeepFilesNum": 10, + "rpLogLimitBytes": 5000000, + "rpMaxAgeHours": 24 + }, + "setupBackends": [ + "KatipBK" + ], + "setupScribes": [ + { + "scFormat": "ScText", + "scKind": "StdoutSK", + "scName": "stdout", + "scRotation": null + } + ] +} diff --git a/mithril-infra/assets/docker/cardano/config/9.2/mainnet/cardano-node/config.json b/mithril-infra/assets/docker/cardano/config/9.2/mainnet/cardano-node/config.json new file mode 100644 index 00000000000..78e331e4988 --- /dev/null +++ b/mithril-infra/assets/docker/cardano/config/9.2/mainnet/cardano-node/config.json @@ -0,0 +1,109 @@ +{ + "AlonzoGenesisFile": "alonzo-genesis.json", + "AlonzoGenesisHash": "7e94a15f55d1e82d10f09203fa1d40f8eede58fd8066542cf6566008068ed874", + "ByronGenesisFile": "byron-genesis.json", + "ByronGenesisHash": "5f20df933584822601f9e3f8c024eb5eb252fe8cefb24d1317dc3d432e940ebb", + "ConwayGenesisFile": "conway-genesis.json", + "ConwayGenesisHash": "15a199f895e461ec0ffc6dd4e4028af28a492ab4e806d39cb674c88f7643ef62", + "EnableP2P": true, + "LastKnownBlockVersion-Alt": 0, + "LastKnownBlockVersion-Major": 3, + "LastKnownBlockVersion-Minor": 0, + "MaxKnownMajorProtocolVersion": 2, + "MinNodeVersion": "8.12.0", + "PeerSharing": true, + "Protocol": "Cardano", + "RequiresNetworkMagic": "RequiresNoMagic", + "ShelleyGenesisFile": "shelley-genesis.json", + "ShelleyGenesisHash": "1a3be38bcbb7911969283716ad7aa550250226b76a61fc51cc9a9a35d9276d81", + "TargetNumberOfActivePeers": 20, + "TargetNumberOfEstablishedPeers": 50, + "TargetNumberOfKnownPeers": 150, + "TargetNumberOfRootPeers": 60, + "TraceAcceptPolicy": true, + "TraceBlockFetchClient": false, + "TraceBlockFetchDecisions": false, + "TraceBlockFetchProtocol": false, + "TraceBlockFetchProtocolSerialised": false, + "TraceBlockFetchServer": false, + "TraceChainDb": true, + "TraceChainSyncBlockServer": false, + "TraceChainSyncClient": false, + "TraceChainSyncHeaderServer": false, + "TraceChainSyncProtocol": false, + "TraceConnectionManager": true, + "TraceDNSResolver": true, + "TraceDNSSubscription": true, + "TraceDiffusionInitialization": true, + "TraceErrorPolicy": true, + "TraceForge": true, + "TraceHandshake": true, + "TraceInboundGovernor": true, + "TraceIpSubscription": true, + "TraceLedgerPeers": true, + "TraceLocalChainSyncProtocol": false, + "TraceLocalConnectionManager": true, + "TraceLocalErrorPolicy": true, + "TraceLocalHandshake": true, + "TraceLocalRootPeers": true, + "TraceLocalTxSubmissionProtocol": false, + "TraceLocalTxSubmissionServer": false, + "TraceMempool": false, + "TraceMux": false, + "TracePeerSelection": true, + "TracePeerSelectionActions": true, + "TracePublicRootPeers": true, + "TraceServer": true, + "TraceTxInbound": false, + "TraceTxOutbound": false, + "TraceTxSubmissionProtocol": false, + "TracingVerbosity": "NormalVerbosity", + "TurnOnLogMetrics": true, + "TurnOnLogging": true, + "defaultBackends": [ + "KatipBK" + ], + "defaultScribes": [ + [ + "StdoutSK", + "stdout" + ] + ], + "hasEKG": 12788, + "hasPrometheus": [ + "127.0.0.1", + 12798 + ], + "minSeverity": "Info", + "options": { + "mapBackends": { + "cardano.node.metrics": [ + "EKGViewBK" + ], + "cardano.node.resources": [ + "EKGViewBK" + ] + }, + "mapSubtrace": { + "cardano.node.metrics": { + "subtrace": "Neutral" + } + } + }, + "rotation": { + "rpKeepFilesNum": 10, + "rpLogLimitBytes": 5000000, + "rpMaxAgeHours": 24 + }, + "setupBackends": [ + "KatipBK" + ], + "setupScribes": [ + { + "scFormat": "ScText", + "scKind": "StdoutSK", + "scName": "stdout", + "scRotation": null + } + ] +} diff --git a/mithril-infra/assets/docker/cardano/config/9.2/mainnet/cardano-node/conway-genesis.json b/mithril-infra/assets/docker/cardano/config/9.2/mainnet/cardano-node/conway-genesis.json new file mode 100644 index 00000000000..760995a34d4 --- /dev/null +++ b/mithril-infra/assets/docker/cardano/config/9.2/mainnet/cardano-node/conway-genesis.json @@ -0,0 +1,303 @@ +{ + "poolVotingThresholds": { + "committeeNormal": 0.51, + "committeeNoConfidence": 0.51, + "hardForkInitiation": 0.51, + "motionNoConfidence": 0.51, + "ppSecurityGroup": 0.51 + }, + "dRepVotingThresholds": { + "motionNoConfidence": 0.67, + "committeeNormal": 0.67, + "committeeNoConfidence": 0.6, + "updateToConstitution": 0.75, + "hardForkInitiation": 0.6, + "ppNetworkGroup": 0.67, + "ppEconomicGroup": 0.67, + "ppTechnicalGroup": 0.67, + "ppGovGroup": 0.75, + "treasuryWithdrawal": 0.67 + }, + "committeeMinSize": 7, + "committeeMaxTermLength": 146, + "govActionLifetime": 6, + "govActionDeposit": 100000000000, + "dRepDeposit": 500000000, + "dRepActivity": 20, + "minFeeRefScriptCostPerByte": 15, + "plutusV3CostModel": [ + 100788, + 420, + 1, + 1, + 1000, + 173, + 0, + 1, + 1000, + 59957, + 4, + 1, + 11183, + 32, + 201305, + 8356, + 4, + 16000, + 100, + 16000, + 100, + 16000, + 100, + 16000, + 100, + 16000, + 100, + 16000, + 100, + 100, + 100, + 16000, + 100, + 94375, + 32, + 132994, + 32, + 61462, + 4, + 72010, + 178, + 0, + 1, + 22151, + 32, + 91189, + 769, + 4, + 2, + 85848, + 123203, + 7305, + -900, + 1716, + 549, + 57, + 85848, + 0, + 1, + 1, + 1000, + 42921, + 4, + 2, + 24548, + 29498, + 38, + 1, + 898148, + 27279, + 1, + 51775, + 558, + 1, + 39184, + 1000, + 60594, + 1, + 141895, + 32, + 83150, + 32, + 15299, + 32, + 76049, + 1, + 13169, + 4, + 22100, + 10, + 28999, + 74, + 1, + 28999, + 74, + 1, + 43285, + 552, + 1, + 44749, + 541, + 1, + 33852, + 32, + 68246, + 32, + 72362, + 32, + 7243, + 32, + 7391, + 32, + 11546, + 32, + 85848, + 123203, + 7305, + -900, + 1716, + 549, + 57, + 85848, + 0, + 1, + 90434, + 519, + 0, + 1, + 74433, + 32, + 85848, + 123203, + 7305, + -900, + 1716, + 549, + 57, + 85848, + 0, + 1, + 1, + 85848, + 123203, + 7305, + -900, + 1716, + 549, + 57, + 85848, + 0, + 1, + 955506, + 213312, + 0, + 2, + 270652, + 22588, + 4, + 1457325, + 64566, + 4, + 20467, + 1, + 4, + 0, + 141992, + 32, + 100788, + 420, + 1, + 1, + 81663, + 32, + 59498, + 32, + 20142, + 32, + 24588, + 32, + 20744, + 32, + 25933, + 32, + 24623, + 32, + 43053543, + 10, + 53384111, + 14333, + 10, + 43574283, + 26308, + 10, + 16000, + 100, + 16000, + 100, + 962335, + 18, + 2780678, + 6, + 442008, + 1, + 52538055, + 3756, + 18, + 267929, + 18, + 76433006, + 8868, + 18, + 52948122, + 18, + 1995836, + 36, + 3227919, + 12, + 901022, + 1, + 166917843, + 4307, + 36, + 284546, + 36, + 158221314, + 26549, + 36, + 74698472, + 36, + 333849714, + 1, + 254006273, + 72, + 2174038, + 72, + 2261318, + 64571, + 4, + 207616, + 8310, + 4, + 1293828, + 28716, + 63, + 0, + 1, + 1006041, + 43623, + 251, + 0, + 1 + ], + "constitution": { + "anchor": { + "dataHash": "ca41a91f399259bcefe57f9858e91f6d00e1a38d6d9c63d4052914ea7bd70cb2", + "url": "ipfs://bafkreifnwj6zpu3ixa4siz2lndqybyc5wnnt3jkwyutci4e2tmbnj3xrdm" + }, + "script": "fa24fb305126805cf2164c161d852a0e7330cf988f1fe558cf7d4a64" + }, + "committee": { + "members": { + "scriptHash-df0e83bde65416dade5b1f97e7f115cc1ff999550ad968850783fe50": 580, + "scriptHash-b6012034ba0a7e4afbbf2c7a1432f8824aee5299a48e38e41a952686": 580, + "scriptHash-ce8b37a72b178a37bbd3236daa7b2c158c9d3604e7aa667e6c6004b7": 580, + "scriptHash-f0dc2c00d92a45521267be2d5de1c485f6f9d14466d7e16062897cf7": 580, + "scriptHash-349e55f83e9af24813e6cb368df6a80d38951b2a334dfcdf26815558": 580, + "scriptHash-84aebcfd3e00d0f87af918fc4b5e00135f407e379893df7e7d392c6a": 580, + "scriptHash-e8165b3328027ee0d74b1f07298cb092fd99aa7697a1436f5997f625": 580 + }, + "threshold": { + "numerator": 2, + "denominator": 3 + } + } +} diff --git a/mithril-infra/assets/docker/cardano/config/9.2/mainnet/cardano-node/shelley-genesis.json b/mithril-infra/assets/docker/cardano/config/9.2/mainnet/cardano-node/shelley-genesis.json new file mode 100644 index 00000000000..e8cc20dc2cc --- /dev/null +++ b/mithril-infra/assets/docker/cardano/config/9.2/mainnet/cardano-node/shelley-genesis.json @@ -0,0 +1,68 @@ +{ + "activeSlotsCoeff": 0.05, + "protocolParams": { + "protocolVersion": { + "minor": 0, + "major": 2 + }, + "decentralisationParam": 1, + "eMax": 18, + "extraEntropy": { + "tag": "NeutralNonce" + }, + "maxTxSize": 16384, + "maxBlockBodySize": 65536, + "maxBlockHeaderSize": 1100, + "minFeeA": 44, + "minFeeB": 155381, + "minUTxOValue": 1000000, + "poolDeposit": 500000000, + "minPoolCost": 340000000, + "keyDeposit": 2000000, + "nOpt": 150, + "rho": 0.003, + "tau": 0.20, + "a0": 0.3 + }, + "genDelegs": { + "ad5463153dc3d24b9ff133e46136028bdc1edbb897f5a7cf1b37950c": { + "delegate": "d9e5c76ad5ee778960804094a389f0b546b5c2b140a62f8ec43ea54d", + "vrf": "64fa87e8b29a5b7bfbd6795677e3e878c505bc4a3649485d366b50abadec92d7" + }, + "b9547b8a57656539a8d9bc42c008e38d9c8bd9c8adbb1e73ad529497": { + "delegate": "855d6fc1e54274e331e34478eeac8d060b0b90c1f9e8a2b01167c048", + "vrf": "66d5167a1f426bd1adcc8bbf4b88c280d38c148d135cb41e3f5a39f948ad7fcc" + }, + "60baee25cbc90047e83fd01e1e57dc0b06d3d0cb150d0ab40bbfead1": { + "delegate": "7f72a1826ae3b279782ab2bc582d0d2958de65bd86b2c4f82d8ba956", + "vrf": "c0546d9aa5740afd569d3c2d9c412595cd60822bb6d9a4e8ce6c43d12bd0f674" + }, + "f7b341c14cd58fca4195a9b278cce1ef402dc0e06deb77e543cd1757": { + "delegate": "69ae12f9e45c0c9122356c8e624b1fbbed6c22a2e3b4358cf0cb5011", + "vrf": "6394a632af51a32768a6f12dac3485d9c0712d0b54e3f389f355385762a478f2" + }, + "162f94554ac8c225383a2248c245659eda870eaa82d0ef25fc7dcd82": { + "delegate": "4485708022839a7b9b8b639a939c85ec0ed6999b5b6dc651b03c43f6", + "vrf": "aba81e764b71006c515986bf7b37a72fbb5554f78e6775f08e384dbd572a4b32" + }, + "2075a095b3c844a29c24317a94a643ab8e22d54a3a3a72a420260af6": { + "delegate": "6535db26347283990a252313a7903a45e3526ec25ddba381c071b25b", + "vrf": "fcaca997b8105bd860876348fc2c6e68b13607f9bbd23515cd2193b555d267af" + }, + "268cfc0b89e910ead22e0ade91493d8212f53f3e2164b2e4bef0819b": { + "delegate": "1d4f2e1fda43070d71bb22a5522f86943c7c18aeb4fa47a362c27e23", + "vrf": "63ef48bc5355f3e7973100c371d6a095251c80ceb40559f4750aa7014a6fb6db" + } + }, + "updateQuorum": 5, + "networkId": "Mainnet", + "initialFunds": {}, + "maxLovelaceSupply": 45000000000000000, + "networkMagic": 764824073, + "epochLength": 432000, + "systemStart": "2017-09-23T21:44:51Z", + "slotsPerKESPeriod": 129600, + "slotLength": 1, + "maxKESEvolutions": 62, + "securityParam": 2160 +} diff --git a/mithril-infra/assets/docker/cardano/config/9.2/mainnet/cardano-node/topology.json b/mithril-infra/assets/docker/cardano/config/9.2/mainnet/cardano-node/topology.json new file mode 100644 index 00000000000..586b8c1764f --- /dev/null +++ b/mithril-infra/assets/docker/cardano/config/9.2/mainnet/cardano-node/topology.json @@ -0,0 +1,31 @@ +{ + "bootstrapPeers": [ + { + "address": "backbone.cardano.iog.io", + "port": 3001 + }, + { + "address": "backbone.mainnet.emurgornd.com", + "port": 3001 + }, + { + "address": "backbone.mainnet.cardanofoundation.org", + "port": 3001 + } + ], + "localRoots": [ + { + "accessPoints": [], + "advertise": false, + "trustable": false, + "valency": 1 + } + ], + "publicRoots": [ + { + "accessPoints": [], + "advertise": false + } + ], + "useLedgerAfterSlot": 128908821 +} diff --git a/mithril-infra/assets/docker/cardano/config/9.2/preprod/cardano-node/alonzo-genesis.json b/mithril-infra/assets/docker/cardano/config/9.2/preprod/cardano-node/alonzo-genesis.json new file mode 100644 index 00000000000..0fd90deeb7b --- /dev/null +++ b/mithril-infra/assets/docker/cardano/config/9.2/preprod/cardano-node/alonzo-genesis.json @@ -0,0 +1,196 @@ +{ + "lovelacePerUTxOWord": 34482, + "executionPrices": { + "prSteps": + { + "numerator" : 721, + "denominator" : 10000000 + }, + "prMem": + { + "numerator" : 577, + "denominator" : 10000 + } + }, + "maxTxExUnits": { + "exUnitsMem": 10000000, + "exUnitsSteps": 10000000000 + }, + "maxBlockExUnits": { + "exUnitsMem": 50000000, + "exUnitsSteps": 40000000000 + }, + "maxValueSize": 5000, + "collateralPercentage": 150, + "maxCollateralInputs": 3, + "costModels": { + "PlutusV1": { + "sha2_256-memory-arguments": 4, + "equalsString-cpu-arguments-constant": 1000, + "cekDelayCost-exBudgetMemory": 100, + "lessThanEqualsByteString-cpu-arguments-intercept": 103599, + "divideInteger-memory-arguments-minimum": 1, + "appendByteString-cpu-arguments-slope": 621, + "blake2b-cpu-arguments-slope": 29175, + "iData-cpu-arguments": 150000, + "encodeUtf8-cpu-arguments-slope": 1000, + "unBData-cpu-arguments": 150000, + "multiplyInteger-cpu-arguments-intercept": 61516, + "cekConstCost-exBudgetMemory": 100, + "nullList-cpu-arguments": 150000, + "equalsString-cpu-arguments-intercept": 150000, + "trace-cpu-arguments": 150000, + "mkNilData-memory-arguments": 32, + "lengthOfByteString-cpu-arguments": 150000, + "cekBuiltinCost-exBudgetCPU": 29773, + "bData-cpu-arguments": 150000, + "subtractInteger-cpu-arguments-slope": 0, + "unIData-cpu-arguments": 150000, + "consByteString-memory-arguments-intercept": 0, + "divideInteger-memory-arguments-slope": 1, + "divideInteger-cpu-arguments-model-arguments-slope": 118, + "listData-cpu-arguments": 150000, + "headList-cpu-arguments": 150000, + "chooseData-memory-arguments": 32, + "equalsInteger-cpu-arguments-intercept": 136542, + "sha3_256-cpu-arguments-slope": 82363, + "sliceByteString-cpu-arguments-slope": 5000, + "unMapData-cpu-arguments": 150000, + "lessThanInteger-cpu-arguments-intercept": 179690, + "mkCons-cpu-arguments": 150000, + "appendString-memory-arguments-intercept": 0, + "modInteger-cpu-arguments-model-arguments-slope": 118, + "ifThenElse-cpu-arguments": 1, + "mkNilPairData-cpu-arguments": 150000, + "lessThanEqualsInteger-cpu-arguments-intercept": 145276, + "addInteger-memory-arguments-slope": 1, + "chooseList-memory-arguments": 32, + "constrData-memory-arguments": 32, + "decodeUtf8-cpu-arguments-intercept": 150000, + "equalsData-memory-arguments": 1, + "subtractInteger-memory-arguments-slope": 1, + "appendByteString-memory-arguments-intercept": 0, + "lengthOfByteString-memory-arguments": 4, + "headList-memory-arguments": 32, + "listData-memory-arguments": 32, + "consByteString-cpu-arguments-intercept": 150000, + "unIData-memory-arguments": 32, + "remainderInteger-memory-arguments-minimum": 1, + "bData-memory-arguments": 32, + "lessThanByteString-cpu-arguments-slope": 248, + "encodeUtf8-memory-arguments-intercept": 0, + "cekStartupCost-exBudgetCPU": 100, + "multiplyInteger-memory-arguments-intercept": 0, + "unListData-memory-arguments": 32, + "remainderInteger-cpu-arguments-model-arguments-slope": 118, + "cekVarCost-exBudgetCPU": 29773, + "remainderInteger-memory-arguments-slope": 1, + "cekForceCost-exBudgetCPU": 29773, + "sha2_256-cpu-arguments-slope": 29175, + "equalsInteger-memory-arguments": 1, + "indexByteString-memory-arguments": 1, + "addInteger-memory-arguments-intercept": 1, + "chooseUnit-cpu-arguments": 150000, + "sndPair-cpu-arguments": 150000, + "cekLamCost-exBudgetCPU": 29773, + "fstPair-cpu-arguments": 150000, + "quotientInteger-memory-arguments-minimum": 1, + "decodeUtf8-cpu-arguments-slope": 1000, + "lessThanInteger-memory-arguments": 1, + "lessThanEqualsInteger-cpu-arguments-slope": 1366, + "fstPair-memory-arguments": 32, + "modInteger-memory-arguments-intercept": 0, + "unConstrData-cpu-arguments": 150000, + "lessThanEqualsInteger-memory-arguments": 1, + "chooseUnit-memory-arguments": 32, + "sndPair-memory-arguments": 32, + "addInteger-cpu-arguments-intercept": 197209, + "decodeUtf8-memory-arguments-slope": 8, + "equalsData-cpu-arguments-intercept": 150000, + "mapData-cpu-arguments": 150000, + "mkPairData-cpu-arguments": 150000, + "quotientInteger-cpu-arguments-constant": 148000, + "consByteString-memory-arguments-slope": 1, + "cekVarCost-exBudgetMemory": 100, + "indexByteString-cpu-arguments": 150000, + "unListData-cpu-arguments": 150000, + "equalsInteger-cpu-arguments-slope": 1326, + "cekStartupCost-exBudgetMemory": 100, + "subtractInteger-cpu-arguments-intercept": 197209, + "divideInteger-cpu-arguments-model-arguments-intercept": 425507, + "divideInteger-memory-arguments-intercept": 0, + "cekForceCost-exBudgetMemory": 100, + "blake2b-cpu-arguments-intercept": 2477736, + "remainderInteger-cpu-arguments-constant": 148000, + "tailList-cpu-arguments": 150000, + "encodeUtf8-cpu-arguments-intercept": 150000, + "equalsString-cpu-arguments-slope": 1000, + "lessThanByteString-memory-arguments": 1, + "multiplyInteger-cpu-arguments-slope": 11218, + "appendByteString-cpu-arguments-intercept": 396231, + "lessThanEqualsByteString-cpu-arguments-slope": 248, + "modInteger-memory-arguments-slope": 1, + "addInteger-cpu-arguments-slope": 0, + "equalsData-cpu-arguments-slope": 10000, + "decodeUtf8-memory-arguments-intercept": 0, + "chooseList-cpu-arguments": 150000, + "constrData-cpu-arguments": 150000, + "equalsByteString-memory-arguments": 1, + "cekApplyCost-exBudgetCPU": 29773, + "quotientInteger-memory-arguments-slope": 1, + "verifySignature-cpu-arguments-intercept": 3345831, + "unMapData-memory-arguments": 32, + "mkCons-memory-arguments": 32, + "sliceByteString-memory-arguments-slope": 1, + "sha3_256-memory-arguments": 4, + "ifThenElse-memory-arguments": 1, + "mkNilPairData-memory-arguments": 32, + "equalsByteString-cpu-arguments-slope": 247, + "appendString-cpu-arguments-intercept": 150000, + "quotientInteger-cpu-arguments-model-arguments-slope": 118, + "cekApplyCost-exBudgetMemory": 100, + "equalsString-memory-arguments": 1, + "multiplyInteger-memory-arguments-slope": 1, + "cekBuiltinCost-exBudgetMemory": 100, + "remainderInteger-memory-arguments-intercept": 0, + "sha2_256-cpu-arguments-intercept": 2477736, + "remainderInteger-cpu-arguments-model-arguments-intercept": 425507, + "lessThanEqualsByteString-memory-arguments": 1, + "tailList-memory-arguments": 32, + "mkNilData-cpu-arguments": 150000, + "chooseData-cpu-arguments": 150000, + "unBData-memory-arguments": 32, + "blake2b-memory-arguments": 4, + "iData-memory-arguments": 32, + "nullList-memory-arguments": 32, + "cekDelayCost-exBudgetCPU": 29773, + "subtractInteger-memory-arguments-intercept": 1, + "lessThanByteString-cpu-arguments-intercept": 103599, + "consByteString-cpu-arguments-slope": 1000, + "appendByteString-memory-arguments-slope": 1, + "trace-memory-arguments": 32, + "divideInteger-cpu-arguments-constant": 148000, + "cekConstCost-exBudgetCPU": 29773, + "encodeUtf8-memory-arguments-slope": 8, + "quotientInteger-cpu-arguments-model-arguments-intercept": 425507, + "mapData-memory-arguments": 32, + "appendString-cpu-arguments-slope": 1000, + "modInteger-cpu-arguments-constant": 148000, + "verifySignature-cpu-arguments-slope": 1, + "unConstrData-memory-arguments": 32, + "quotientInteger-memory-arguments-intercept": 0, + "equalsByteString-cpu-arguments-constant": 150000, + "sliceByteString-memory-arguments-intercept": 0, + "mkPairData-memory-arguments": 32, + "equalsByteString-cpu-arguments-intercept": 112536, + "appendString-memory-arguments-slope": 1, + "lessThanInteger-cpu-arguments-slope": 497, + "modInteger-cpu-arguments-model-arguments-intercept": 425507, + "modInteger-memory-arguments-minimum": 1, + "sha3_256-cpu-arguments-intercept": 0, + "verifySignature-memory-arguments": 1, + "cekLamCost-exBudgetMemory": 100, + "sliceByteString-cpu-arguments-intercept": 150000 + } + } +} diff --git a/mithril-infra/assets/docker/cardano/config/9.2/preprod/cardano-node/byron-genesis.json b/mithril-infra/assets/docker/cardano/config/9.2/preprod/cardano-node/byron-genesis.json new file mode 100644 index 00000000000..23425788693 --- /dev/null +++ b/mithril-infra/assets/docker/cardano/config/9.2/preprod/cardano-node/byron-genesis.json @@ -0,0 +1,117 @@ +{ "bootStakeholders": + { "05d1c10e4bf3cdd4de54712531c53be75a1609b25f396ffbbe5becf1": 1 + , "3bf1193b19be416283b8c0516d2f8b80939ffccb1c9b05946f54c83a": 1 + , "7bdd769bd872e8e6336c23f1e566c19a96e72137174b891fad9f4b99": 1 + , "9ddc1e29c59df0ddd9347fe8b8a736d247f286414684eddc02885348": 1 + , "a118c0d2737c8a77c0d982a0d299bc42614cea4e0c23614ba24a05ca": 1 + , "b0b2df3c9cf4dfe2ae04409913b3c3125509acbbfa0722449570aaeb": 1 + , "e0a65f21229e44c2bf6eec5b14e2775003b674ae53de18d22814346a": 1 + } +, "heavyDelegation": + { "05d1c10e4bf3cdd4de54712531c53be75a1609b25f396ffbbe5becf1": + { "omega": 0 + , "issuerPk": + "UFsjehyxQAIMxEL25RxqD0itM0RCdzWprVt1W+zopM5b7U9ru9AMr/zf9lAjWaFlNOpRgrrbz7r5tRbt8wUmSg==" + , "delegatePk": + "iwlg0jS9pn1SQyxdGiasor+1uaCflm2Vkqe/DHKKHs2EDqxcP+in7doCSnQDttN3BZkIKLNUgzKj+FAiHCCYvw==" + , "cert": + "633fc347138ee155d038b9d1040ee1e45cea5b1e8627046c95f7fe4ba949b0569437962568eadef9d49e22becbf30192425c008d10e03004612633dbc307340b" + } + , "3bf1193b19be416283b8c0516d2f8b80939ffccb1c9b05946f54c83a": + { "omega": 0 + , "issuerPk": + "pAIACMG6WCa4mz0tVoeekLXYuWkdxk/rgDuZ/x7ugh3CvEuhpGf2LRRRWilaGdraH1sCbnuMCmAHrBTbPDFmxA==" + , "delegatePk": + "0ajebKqP2bF1xZhi7N1avNBHe4S4Kg5S+uzGs8hRAKR1IW/7ZOp0U3AhQFuzKLD3BuSq1xV3leMWeBzKEg2slg==" + , "cert": + "eb5c4d76c7bfca2ab790a76f7dc4c6d9f7d0956d4af3b8c649804ef98beeb138d8916982c9142747b7a07e69f52b2c3776d64a7d74494e0f72eefaebf6bf5d07" + } + , "7bdd769bd872e8e6336c23f1e566c19a96e72137174b891fad9f4b99": + { "omega": 0 + , "issuerPk": + "P7JjeSPHjexNW5MsCaySrURaqV2gCgXttEe0CgfFnVZFGHaS9A4xEUrQ83VTLPjk+HV0Di19DjQ+DhS1M6Mf7A==" + , "delegatePk": + "jvMgwt9mVKYYjEXpxjnApoa/WoZSlVh9OZ3+sF/nSrZ5YaaWsmjIvOyTcrxzqpsTZewAez36BTnqwA0VSjFRjA==" + , "cert": + "9ef9f0e5ca23cd9365ec7a23f1b2d159da0d58e0242cb817c3bc946ba1c9e3629f1976f09a88370247bbc458c810d21a889e3ff6dd189ceea784bc9ab6dc9b0a" + } + , "9ddc1e29c59df0ddd9347fe8b8a736d247f286414684eddc02885348": + { "omega": 0 + , "issuerPk": + "Xro6BbV6hMh3RTZnst4ABhtQ2vr83YPXoLfQ8JWeunvvcuudGBQvLeqwVfGXrBWoMOOKroFV48ygfSEq2xhREA==" + , "delegatePk": + "mq5iXU0VvLNzPUIOBk8c0zjzhuCvBJ/NQrRVpp0orTZkg9F3uiuAG0E24NZmLl6eCiTyyAoOeNTCNbTAjyAfTA==" + , "cert": + "939dcfe5555ee661b9db5d817a70d5c3fa9d1d97c2ae5849696d915606b530f7e9edda5d02a01e61524a766f9c356084616ba058a3de70ea51bf29cd187a5f07" + } + , "a118c0d2737c8a77c0d982a0d299bc42614cea4e0c23614ba24a05ca": + { "omega": 0 + , "issuerPk": + "eqAAtu1X79MxCSa/i/RSApLGsnhDYqLJLu93f3wSzR5/M7calZS8DHFrAtJgzYbkg9nwKF1HQQ8bO/1LOJ9O4w==" + , "delegatePk": + "lCuzqqsPZEK5BrZbpt2/eWnKpmLZCWiSYhGj1WUy8R2OjLStw/UDT7xiV/pbEIZoncfQJN9yJqpQH8KOui0fYw==" + , "cert": + "b96ad354a6989df5de8d0888414843736d0a4a6626a1e595e8785a70b10a38eb4632159aabf84959983e8852fd4d390eba6c423fac8ea117913cec46353bd90e" + } + , "b0b2df3c9cf4dfe2ae04409913b3c3125509acbbfa0722449570aaeb": + { "omega": 0 + , "issuerPk": + "Y+Vaj0IaMeq0+oWjQr5hiEl4Ek+cWsKq7mufTO4wue2R6A6AMlqEDIV7vYsd3NZWomG5DGcwSAw2Ev1Mz26LIA==" + , "delegatePk": + "YYtiXfMN5TiV/ynno3cNylbC/wZtSqBaaXGQXe7O9tu33RDqH5F15Sk+reyXvxaxZ683mns+1K8DLNB7mezB6g==" + , "cert": + "ca38e688e759183b57d08ca6568248b91c8ddd81e56d0d31c3f3a26eca35754387c5f301ef017dafae453a93757d39a0e2d326ebe59cf31d5c1b22fc8616ac00" + } + , "e0a65f21229e44c2bf6eec5b14e2775003b674ae53de18d22814346a": + { "omega": 0 + , "issuerPk": + "vynbl3q/BFvwehgMzpp3NoWOuN5RwDUYCbNop0RR0jlEXomgPOrlXCwMTrwrI8Dcfzq5q1fK/1hOfv9IwDMPAA==" + , "delegatePk": + "1N1ppBBxvC3I5kqX9L1jeVJM4MK2ZXKAQ6Bn400+IYr4mh4zTYciCsTJTyvY8IKIBBEcT3GYW6ZlaYy7XbY5kg==" + , "cert": + "82b10bbea2dd80441315230354e3e4af0ac87d02c9e6424fc9432be21a6183c81555d3a1b373566aef7a8065a126d57c42629be780becc61bc1b8f3ce5b5170d" + } + } +, "startTime": 1654041600 +, "nonAvvmBalances": + { "FHnt4NL7yPXhCzCHVywZLqVsvwuG3HvwmjKXQJBrXh3h2aigv6uxkePbpzRNV8q": + "0" + , "FHnt4NL7yPXuJGViM3KwSPwrwECD9q5vNetX3QJDYRWgiX3RHi5i5VV32dnETDK": + "0" + , "FHnt4NL7yPXuYUxBF33VX5dZMBDAab2kvSNLRzCskvuKNCSDknzrQvKeQhGUw5a": + "30000000000000000" + , "FHnt4NL7yPY8exfnuJ8ACyoU7xCN93tKXSv357UrTp1nddGbkWxJpQfrt62xYFX": + "0" + , "FHnt4NL7yPYFpVcAXZADrKdsqCAFvcRFYkTcqkn2guGmj8akQMiMVjhSUECvD1F": + "0" + , "FHnt4NL7yPYH2vP2FLEfH2pt3K6meM7fgtjRiLBidaqpP5ogPzxLNsZy68e1KdW": + "0" + , "FHnt4NL7yPYHrcxPtPufYYFWLhqvHGnZ5NFSz2KZpWQgSq4VLsUgWnkEmfUtd1E": + "0" + , "FHnt4NL7yPYJiN5Y8VsQr6LP6YgN51BHBPegNjVwKkq6AooCkbTpfZ2bqkVkfXU": + "0" + } +, "blockVersionData": + { "scriptVersion": 0 + , "slotDuration": "20000" + , "maxBlockSize": "2000000" + , "maxHeaderSize": "2000000" + , "maxTxSize": "4096" + , "maxProposalSize": "700" + , "mpcThd": "20000000000000" + , "heavyDelThd": "300000000000" + , "updateVoteThd": "1000000000000" + , "updateProposalThd": "100000000000000" + , "updateImplicit": "10000" + , "softforkRule": + { "initThd": "900000000000000" + , "minThd": "600000000000000" + , "thdDecrement": "50000000000000" + } + , "txFeePolicy": + { "summand": "155381000000000" , "multiplier": "43946000000" } + , "unlockStakeEpoch": "18446744073709551615" + } +, "protocolConsts": { "k": 2160 , "protocolMagic": 1 } +, "avvmDistr": {} +} \ No newline at end of file diff --git a/mithril-infra/assets/docker/cardano/config/9.2/preprod/cardano-node/config-bp.json b/mithril-infra/assets/docker/cardano/config/9.2/preprod/cardano-node/config-bp.json new file mode 100644 index 00000000000..630cd5ce785 --- /dev/null +++ b/mithril-infra/assets/docker/cardano/config/9.2/preprod/cardano-node/config-bp.json @@ -0,0 +1,108 @@ +{ + "AlonzoGenesisFile": "alonzo-genesis.json", + "AlonzoGenesisHash": "7e94a15f55d1e82d10f09203fa1d40f8eede58fd8066542cf6566008068ed874", + "ByronGenesisFile": "byron-genesis.json", + "ByronGenesisHash": "d4b8de7a11d929a323373cbab6c1a9bdc931beffff11db111cf9d57356ee1937", + "ConwayGenesisFile": "conway-genesis.json", + "ConwayGenesisHash": "0eb6adaec3fcb1fe286c1b4ae0da2a117eafc3add51e17577d36dd39eddfc3db", + "EnableP2P": true, + "LastKnownBlockVersion-Alt": 0, + "LastKnownBlockVersion-Major": 2, + "LastKnownBlockVersion-Minor": 0, + "MinNodeVersion": "8.12.0", + "PeerSharing": false, + "Protocol": "Cardano", + "RequiresNetworkMagic": "RequiresMagic", + "ShelleyGenesisFile": "shelley-genesis.json", + "ShelleyGenesisHash": "162d29c4e1cf6b8a84f2d692e67a3ac6bc7851bc3e6e4afe64d15778bed8bd86", + "TargetNumberOfActivePeers": 20, + "TargetNumberOfEstablishedPeers": 50, + "TargetNumberOfKnownPeers": 100, + "TargetNumberOfRootPeers": 100, + "TraceAcceptPolicy": true, + "TraceBlockFetchClient": false, + "TraceBlockFetchDecisions": false, + "TraceBlockFetchProtocol": false, + "TraceBlockFetchProtocolSerialised": false, + "TraceBlockFetchServer": false, + "TraceChainDb": true, + "TraceChainSyncBlockServer": false, + "TraceChainSyncClient": false, + "TraceChainSyncHeaderServer": false, + "TraceChainSyncProtocol": false, + "TraceConnectionManager": true, + "TraceDNSResolver": true, + "TraceDNSSubscription": true, + "TraceDiffusionInitialization": true, + "TraceErrorPolicy": true, + "TraceForge": true, + "TraceHandshake": true, + "TraceInboundGovernor": true, + "TraceIpSubscription": true, + "TraceLedgerPeers": true, + "TraceLocalChainSyncProtocol": false, + "TraceLocalConnectionManager": true, + "TraceLocalErrorPolicy": true, + "TraceLocalHandshake": true, + "TraceLocalRootPeers": true, + "TraceLocalTxSubmissionProtocol": false, + "TraceLocalTxSubmissionServer": false, + "TraceMempool": true, + "TraceMux": false, + "TracePeerSelection": true, + "TracePeerSelectionActions": true, + "TracePublicRootPeers": true, + "TraceServer": true, + "TraceTxInbound": false, + "TraceTxOutbound": false, + "TraceTxSubmissionProtocol": false, + "TracingVerbosity": "NormalVerbosity", + "TurnOnLogMetrics": true, + "TurnOnLogging": true, + "defaultBackends": [ + "KatipBK" + ], + "defaultScribes": [ + [ + "StdoutSK", + "stdout" + ] + ], + "hasEKG": 12788, + "hasPrometheus": [ + "127.0.0.1", + 12798 + ], + "minSeverity": "Info", + "options": { + "mapBackends": { + "cardano.node.metrics": [ + "EKGViewBK" + ], + "cardano.node.resources": [ + "EKGViewBK" + ] + }, + "mapSubtrace": { + "cardano.node.metrics": { + "subtrace": "Neutral" + } + } + }, + "rotation": { + "rpKeepFilesNum": 10, + "rpLogLimitBytes": 5000000, + "rpMaxAgeHours": 24 + }, + "setupBackends": [ + "KatipBK" + ], + "setupScribes": [ + { + "scFormat": "ScText", + "scKind": "StdoutSK", + "scName": "stdout", + "scRotation": null + } + ] +} diff --git a/mithril-infra/assets/docker/cardano/config/9.2/preprod/cardano-node/config.json b/mithril-infra/assets/docker/cardano/config/9.2/preprod/cardano-node/config.json new file mode 100644 index 00000000000..563fbde095b --- /dev/null +++ b/mithril-infra/assets/docker/cardano/config/9.2/preprod/cardano-node/config.json @@ -0,0 +1,108 @@ +{ + "AlonzoGenesisFile": "alonzo-genesis.json", + "AlonzoGenesisHash": "7e94a15f55d1e82d10f09203fa1d40f8eede58fd8066542cf6566008068ed874", + "ByronGenesisFile": "byron-genesis.json", + "ByronGenesisHash": "d4b8de7a11d929a323373cbab6c1a9bdc931beffff11db111cf9d57356ee1937", + "ConwayGenesisFile": "conway-genesis.json", + "ConwayGenesisHash": "0eb6adaec3fcb1fe286c1b4ae0da2a117eafc3add51e17577d36dd39eddfc3db", + "EnableP2P": true, + "LastKnownBlockVersion-Alt": 0, + "LastKnownBlockVersion-Major": 2, + "LastKnownBlockVersion-Minor": 0, + "MinNodeVersion": "8.12.0", + "PeerSharing": true, + "Protocol": "Cardano", + "RequiresNetworkMagic": "RequiresMagic", + "ShelleyGenesisFile": "shelley-genesis.json", + "ShelleyGenesisHash": "162d29c4e1cf6b8a84f2d692e67a3ac6bc7851bc3e6e4afe64d15778bed8bd86", + "TargetNumberOfActivePeers": 20, + "TargetNumberOfEstablishedPeers": 50, + "TargetNumberOfKnownPeers": 150, + "TargetNumberOfRootPeers": 60, + "TraceAcceptPolicy": true, + "TraceBlockFetchClient": false, + "TraceBlockFetchDecisions": false, + "TraceBlockFetchProtocol": false, + "TraceBlockFetchProtocolSerialised": false, + "TraceBlockFetchServer": false, + "TraceChainDb": true, + "TraceChainSyncBlockServer": false, + "TraceChainSyncClient": false, + "TraceChainSyncHeaderServer": false, + "TraceChainSyncProtocol": false, + "TraceConnectionManager": true, + "TraceDNSResolver": true, + "TraceDNSSubscription": true, + "TraceDiffusionInitialization": true, + "TraceErrorPolicy": true, + "TraceForge": true, + "TraceHandshake": true, + "TraceInboundGovernor": true, + "TraceIpSubscription": true, + "TraceLedgerPeers": true, + "TraceLocalChainSyncProtocol": false, + "TraceLocalConnectionManager": true, + "TraceLocalErrorPolicy": true, + "TraceLocalHandshake": true, + "TraceLocalRootPeers": true, + "TraceLocalTxSubmissionProtocol": false, + "TraceLocalTxSubmissionServer": false, + "TraceMempool": true, + "TraceMux": false, + "TracePeerSelection": true, + "TracePeerSelectionActions": true, + "TracePublicRootPeers": true, + "TraceServer": true, + "TraceTxInbound": false, + "TraceTxOutbound": false, + "TraceTxSubmissionProtocol": false, + "TracingVerbosity": "NormalVerbosity", + "TurnOnLogMetrics": true, + "TurnOnLogging": true, + "defaultBackends": [ + "KatipBK" + ], + "defaultScribes": [ + [ + "StdoutSK", + "stdout" + ] + ], + "hasEKG": 12788, + "hasPrometheus": [ + "127.0.0.1", + 12798 + ], + "minSeverity": "Info", + "options": { + "mapBackends": { + "cardano.node.metrics": [ + "EKGViewBK" + ], + "cardano.node.resources": [ + "EKGViewBK" + ] + }, + "mapSubtrace": { + "cardano.node.metrics": { + "subtrace": "Neutral" + } + } + }, + "rotation": { + "rpKeepFilesNum": 10, + "rpLogLimitBytes": 5000000, + "rpMaxAgeHours": 24 + }, + "setupBackends": [ + "KatipBK" + ], + "setupScribes": [ + { + "scFormat": "ScText", + "scKind": "StdoutSK", + "scName": "stdout", + "scRotation": null + } + ] +} diff --git a/mithril-infra/assets/docker/cardano/config/9.2/preprod/cardano-node/conway-genesis.json b/mithril-infra/assets/docker/cardano/config/9.2/preprod/cardano-node/conway-genesis.json new file mode 100644 index 00000000000..09c77b4d33e --- /dev/null +++ b/mithril-infra/assets/docker/cardano/config/9.2/preprod/cardano-node/conway-genesis.json @@ -0,0 +1,303 @@ +{ + "poolVotingThresholds": { + "committeeNormal": 0.51, + "committeeNoConfidence": 0.51, + "hardForkInitiation": 0.51, + "motionNoConfidence": 0.51, + "ppSecurityGroup": 0.51 + }, + "dRepVotingThresholds": { + "motionNoConfidence": 0.67, + "committeeNormal": 0.67, + "committeeNoConfidence": 0.6, + "updateToConstitution": 0.75, + "hardForkInitiation": 0.6, + "ppNetworkGroup": 0.67, + "ppEconomicGroup": 0.67, + "ppTechnicalGroup": 0.67, + "ppGovGroup": 0.75, + "treasuryWithdrawal": 0.67 + }, + "committeeMinSize": 7, + "committeeMaxTermLength": 146, + "govActionLifetime": 6, + "govActionDeposit": 100000000000, + "dRepDeposit": 500000000, + "dRepActivity": 20, + "minFeeRefScriptCostPerByte": 15, + "plutusV3CostModel": [ + 100788, + 420, + 1, + 1, + 1000, + 173, + 0, + 1, + 1000, + 59957, + 4, + 1, + 11183, + 32, + 201305, + 8356, + 4, + 16000, + 100, + 16000, + 100, + 16000, + 100, + 16000, + 100, + 16000, + 100, + 16000, + 100, + 100, + 100, + 16000, + 100, + 94375, + 32, + 132994, + 32, + 61462, + 4, + 72010, + 178, + 0, + 1, + 22151, + 32, + 91189, + 769, + 4, + 2, + 85848, + 123203, + 7305, + -900, + 1716, + 549, + 57, + 85848, + 0, + 1, + 1, + 1000, + 42921, + 4, + 2, + 24548, + 29498, + 38, + 1, + 898148, + 27279, + 1, + 51775, + 558, + 1, + 39184, + 1000, + 60594, + 1, + 141895, + 32, + 83150, + 32, + 15299, + 32, + 76049, + 1, + 13169, + 4, + 22100, + 10, + 28999, + 74, + 1, + 28999, + 74, + 1, + 43285, + 552, + 1, + 44749, + 541, + 1, + 33852, + 32, + 68246, + 32, + 72362, + 32, + 7243, + 32, + 7391, + 32, + 11546, + 32, + 85848, + 123203, + 7305, + -900, + 1716, + 549, + 57, + 85848, + 0, + 1, + 90434, + 519, + 0, + 1, + 74433, + 32, + 85848, + 123203, + 7305, + -900, + 1716, + 549, + 57, + 85848, + 0, + 1, + 1, + 85848, + 123203, + 7305, + -900, + 1716, + 549, + 57, + 85848, + 0, + 1, + 955506, + 213312, + 0, + 2, + 270652, + 22588, + 4, + 1457325, + 64566, + 4, + 20467, + 1, + 4, + 0, + 141992, + 32, + 100788, + 420, + 1, + 1, + 81663, + 32, + 59498, + 32, + 20142, + 32, + 24588, + 32, + 20744, + 32, + 25933, + 32, + 24623, + 32, + 43053543, + 10, + 53384111, + 14333, + 10, + 43574283, + 26308, + 10, + 16000, + 100, + 16000, + 100, + 962335, + 18, + 2780678, + 6, + 442008, + 1, + 52538055, + 3756, + 18, + 267929, + 18, + 76433006, + 8868, + 18, + 52948122, + 18, + 1995836, + 36, + 3227919, + 12, + 901022, + 1, + 166917843, + 4307, + 36, + 284546, + 36, + 158221314, + 26549, + 36, + 74698472, + 36, + 333849714, + 1, + 254006273, + 72, + 2174038, + 72, + 2261318, + 64571, + 4, + 207616, + 8310, + 4, + 1293828, + 28716, + 63, + 0, + 1, + 1006041, + 43623, + 251, + 0, + 1 + ], + "constitution": { + "anchor": { + "dataHash": "ca41a91f399259bcefe57f9858e91f6d00e1a38d6d9c63d4052914ea7bd70cb2", + "url": "ipfs://bafkreifnwj6zpu3ixa4siz2lndqybyc5wnnt3jkwyutci4e2tmbnj3xrdm" + }, + "script": "fa24fb305126805cf2164c161d852a0e7330cf988f1fe558cf7d4a64" + }, + "committee": { + "members": { + "scriptHash-a6a5e006fd4e8f51062dc431362369b2a43140abced8aa2ff2256d7b": 229, + "scriptHash-6095e643ea6f1cccb6e463ec34349026b3a48621aac5d512655ab1bf": 229, + "scriptHash-94c0de47e7ae32e3f7234ada5cf976506b68e3bb88c54dc53b4ba984": 229, + "scriptHash-5098dfd0deba725fadd692198fc33ee959fbe7e6edf1b5a695e06e61": 229, + "scriptHash-5a71f17f4ce4c1c0be053575d717ade6ad8a1d5453d02a65ce40d4b1": 229, + "scriptHash-2f4a6c6f098e20ee4bfd5b39942c164575f8ceb348e754df5d0ec04f": 229, + "scriptHash-94f51c795a6c11adb9c1e30f0b6def4230cbd0b8bc800098e2d2307b": 229 + }, + "threshold": { + "numerator": 2, + "denominator": 3 + } + } +} diff --git a/mithril-infra/assets/docker/cardano/config/9.2/preprod/cardano-node/shelley-genesis.json b/mithril-infra/assets/docker/cardano/config/9.2/preprod/cardano-node/shelley-genesis.json new file mode 100644 index 00000000000..24862eb838a --- /dev/null +++ b/mithril-infra/assets/docker/cardano/config/9.2/preprod/cardano-node/shelley-genesis.json @@ -0,0 +1,72 @@ +{ + "activeSlotsCoeff": 0.05, + "epochLength": 432000, + "genDelegs": { + "637f2e950b0fd8f8e3e811c5fbeb19e411e7a2bf37272b84b29c1a0b": { + "delegate": "aae9293510344ddd636364c2673e34e03e79e3eefa8dbaa70e326f7d", + "vrf": "227116365af2ed943f1a8b5e6557bfaa34996f1578eec667a5e2b361c51e4ce7" + }, + "8a4b77c4f534f8b8cc6f269e5ebb7ba77fa63a476e50e05e66d7051c": { + "delegate": "d15422b2e8b60e500a82a8f4ceaa98b04e55a0171d1125f6c58f8758", + "vrf": "0ada6c25d62db5e1e35d3df727635afa943b9e8a123ab83785e2281605b09ce2" + }, + "b00470cd193d67aac47c373602fccd4195aad3002c169b5570de1126": { + "delegate": "b3b539e9e7ed1b32fbf778bf2ebf0a6b9f980eac90ac86623d11881a", + "vrf": "0ff0ce9b820376e51c03b27877cd08f8ba40318f1a9f85a3db0b60dd03f71a7a" + }, + "b260ffdb6eba541fcf18601923457307647dce807851b9d19da133ab": { + "delegate": "7c64eb868b4ef566391a321c85323f41d2b95480d7ce56ad2abcb022", + "vrf": "7fb22abd39d550c9a022ec8104648a26240a9ff9c88b8b89a6e20d393c03098e" + }, + "ced1599fd821a39593e00592e5292bdc1437ae0f7af388ef5257344a": { + "delegate": "de7ca985023cf892f4de7f5f1d0a7181668884752d9ebb9e96c95059", + "vrf": "c301b7fc4d1b57fb60841bcec5e3d2db89602e5285801e522fce3790987b1124" + }, + "dd2a7d71a05bed11db61555ba4c658cb1ce06c8024193d064f2a66ae": { + "delegate": "1e113c218899ee7807f4028071d0e108fc790dade9fd1a0d0b0701ee", + "vrf": "faf2702aa4893c877c622ab22dfeaf1d0c8aab98b837fe2bf667314f0d043822" + }, + "f3b9e74f7d0f24d2314ea5dfbca94b65b2059d1ff94d97436b82d5b4": { + "delegate": "fd637b08cc379ef7b99c83b416458fcda8a01a606041779331008fb9", + "vrf": "37f2ea7c843a688159ddc2c38a2f997ab465150164a9136dca69564714b73268" + } + }, + "initialFunds": {}, + "maxKESEvolutions": 62, + "maxLovelaceSupply": 45000000000000000, + "networkId": "Testnet", + "networkMagic": 1, + "protocolParams": { + "protocolVersion": { + "minor": 0, + "major": 2 + }, + "decentralisationParam": 1, + "eMax": 18, + "extraEntropy": { + "tag": "NeutralNonce" + }, + "maxTxSize": 16384, + "maxBlockBodySize": 65536, + "maxBlockHeaderSize": 1100, + "minFeeA": 44, + "minFeeB": 155381, + "minUTxOValue": 1000000, + "poolDeposit": 500000000, + "minPoolCost": 340000000, + "keyDeposit": 2000000, + "nOpt": 150, + "rho": 0.003, + "tau": 0.20, + "a0": 0.3 + }, + "securityParam": 2160, + "slotLength": 1, + "slotsPerKESPeriod": 129600, + "staking": { + "pools": {}, + "stake": {} + }, + "systemStart": "2022-06-01T00:00:00Z", + "updateQuorum": 5 +} diff --git a/mithril-infra/assets/docker/cardano/config/9.2/preprod/cardano-node/topology.json b/mithril-infra/assets/docker/cardano/config/9.2/preprod/cardano-node/topology.json new file mode 100644 index 00000000000..2241cbcb9aa --- /dev/null +++ b/mithril-infra/assets/docker/cardano/config/9.2/preprod/cardano-node/topology.json @@ -0,0 +1,23 @@ +{ + "bootstrapPeers": [ + { + "address": "preprod-node.play.dev.cardano.org", + "port": 3001 + } + ], + "localRoots": [ + { + "accessPoints": [], + "advertise": false, + "trustable": false, + "valency": 1 + } + ], + "publicRoots": [ + { + "accessPoints": [], + "advertise": false + } + ], + "useLedgerAfterSlot": 64454371 +} diff --git a/mithril-infra/assets/docker/cardano/config/9.2/preview/cardano-node/alonzo-genesis.json b/mithril-infra/assets/docker/cardano/config/9.2/preview/cardano-node/alonzo-genesis.json new file mode 100644 index 00000000000..0fd90deeb7b --- /dev/null +++ b/mithril-infra/assets/docker/cardano/config/9.2/preview/cardano-node/alonzo-genesis.json @@ -0,0 +1,196 @@ +{ + "lovelacePerUTxOWord": 34482, + "executionPrices": { + "prSteps": + { + "numerator" : 721, + "denominator" : 10000000 + }, + "prMem": + { + "numerator" : 577, + "denominator" : 10000 + } + }, + "maxTxExUnits": { + "exUnitsMem": 10000000, + "exUnitsSteps": 10000000000 + }, + "maxBlockExUnits": { + "exUnitsMem": 50000000, + "exUnitsSteps": 40000000000 + }, + "maxValueSize": 5000, + "collateralPercentage": 150, + "maxCollateralInputs": 3, + "costModels": { + "PlutusV1": { + "sha2_256-memory-arguments": 4, + "equalsString-cpu-arguments-constant": 1000, + "cekDelayCost-exBudgetMemory": 100, + "lessThanEqualsByteString-cpu-arguments-intercept": 103599, + "divideInteger-memory-arguments-minimum": 1, + "appendByteString-cpu-arguments-slope": 621, + "blake2b-cpu-arguments-slope": 29175, + "iData-cpu-arguments": 150000, + "encodeUtf8-cpu-arguments-slope": 1000, + "unBData-cpu-arguments": 150000, + "multiplyInteger-cpu-arguments-intercept": 61516, + "cekConstCost-exBudgetMemory": 100, + "nullList-cpu-arguments": 150000, + "equalsString-cpu-arguments-intercept": 150000, + "trace-cpu-arguments": 150000, + "mkNilData-memory-arguments": 32, + "lengthOfByteString-cpu-arguments": 150000, + "cekBuiltinCost-exBudgetCPU": 29773, + "bData-cpu-arguments": 150000, + "subtractInteger-cpu-arguments-slope": 0, + "unIData-cpu-arguments": 150000, + "consByteString-memory-arguments-intercept": 0, + "divideInteger-memory-arguments-slope": 1, + "divideInteger-cpu-arguments-model-arguments-slope": 118, + "listData-cpu-arguments": 150000, + "headList-cpu-arguments": 150000, + "chooseData-memory-arguments": 32, + "equalsInteger-cpu-arguments-intercept": 136542, + "sha3_256-cpu-arguments-slope": 82363, + "sliceByteString-cpu-arguments-slope": 5000, + "unMapData-cpu-arguments": 150000, + "lessThanInteger-cpu-arguments-intercept": 179690, + "mkCons-cpu-arguments": 150000, + "appendString-memory-arguments-intercept": 0, + "modInteger-cpu-arguments-model-arguments-slope": 118, + "ifThenElse-cpu-arguments": 1, + "mkNilPairData-cpu-arguments": 150000, + "lessThanEqualsInteger-cpu-arguments-intercept": 145276, + "addInteger-memory-arguments-slope": 1, + "chooseList-memory-arguments": 32, + "constrData-memory-arguments": 32, + "decodeUtf8-cpu-arguments-intercept": 150000, + "equalsData-memory-arguments": 1, + "subtractInteger-memory-arguments-slope": 1, + "appendByteString-memory-arguments-intercept": 0, + "lengthOfByteString-memory-arguments": 4, + "headList-memory-arguments": 32, + "listData-memory-arguments": 32, + "consByteString-cpu-arguments-intercept": 150000, + "unIData-memory-arguments": 32, + "remainderInteger-memory-arguments-minimum": 1, + "bData-memory-arguments": 32, + "lessThanByteString-cpu-arguments-slope": 248, + "encodeUtf8-memory-arguments-intercept": 0, + "cekStartupCost-exBudgetCPU": 100, + "multiplyInteger-memory-arguments-intercept": 0, + "unListData-memory-arguments": 32, + "remainderInteger-cpu-arguments-model-arguments-slope": 118, + "cekVarCost-exBudgetCPU": 29773, + "remainderInteger-memory-arguments-slope": 1, + "cekForceCost-exBudgetCPU": 29773, + "sha2_256-cpu-arguments-slope": 29175, + "equalsInteger-memory-arguments": 1, + "indexByteString-memory-arguments": 1, + "addInteger-memory-arguments-intercept": 1, + "chooseUnit-cpu-arguments": 150000, + "sndPair-cpu-arguments": 150000, + "cekLamCost-exBudgetCPU": 29773, + "fstPair-cpu-arguments": 150000, + "quotientInteger-memory-arguments-minimum": 1, + "decodeUtf8-cpu-arguments-slope": 1000, + "lessThanInteger-memory-arguments": 1, + "lessThanEqualsInteger-cpu-arguments-slope": 1366, + "fstPair-memory-arguments": 32, + "modInteger-memory-arguments-intercept": 0, + "unConstrData-cpu-arguments": 150000, + "lessThanEqualsInteger-memory-arguments": 1, + "chooseUnit-memory-arguments": 32, + "sndPair-memory-arguments": 32, + "addInteger-cpu-arguments-intercept": 197209, + "decodeUtf8-memory-arguments-slope": 8, + "equalsData-cpu-arguments-intercept": 150000, + "mapData-cpu-arguments": 150000, + "mkPairData-cpu-arguments": 150000, + "quotientInteger-cpu-arguments-constant": 148000, + "consByteString-memory-arguments-slope": 1, + "cekVarCost-exBudgetMemory": 100, + "indexByteString-cpu-arguments": 150000, + "unListData-cpu-arguments": 150000, + "equalsInteger-cpu-arguments-slope": 1326, + "cekStartupCost-exBudgetMemory": 100, + "subtractInteger-cpu-arguments-intercept": 197209, + "divideInteger-cpu-arguments-model-arguments-intercept": 425507, + "divideInteger-memory-arguments-intercept": 0, + "cekForceCost-exBudgetMemory": 100, + "blake2b-cpu-arguments-intercept": 2477736, + "remainderInteger-cpu-arguments-constant": 148000, + "tailList-cpu-arguments": 150000, + "encodeUtf8-cpu-arguments-intercept": 150000, + "equalsString-cpu-arguments-slope": 1000, + "lessThanByteString-memory-arguments": 1, + "multiplyInteger-cpu-arguments-slope": 11218, + "appendByteString-cpu-arguments-intercept": 396231, + "lessThanEqualsByteString-cpu-arguments-slope": 248, + "modInteger-memory-arguments-slope": 1, + "addInteger-cpu-arguments-slope": 0, + "equalsData-cpu-arguments-slope": 10000, + "decodeUtf8-memory-arguments-intercept": 0, + "chooseList-cpu-arguments": 150000, + "constrData-cpu-arguments": 150000, + "equalsByteString-memory-arguments": 1, + "cekApplyCost-exBudgetCPU": 29773, + "quotientInteger-memory-arguments-slope": 1, + "verifySignature-cpu-arguments-intercept": 3345831, + "unMapData-memory-arguments": 32, + "mkCons-memory-arguments": 32, + "sliceByteString-memory-arguments-slope": 1, + "sha3_256-memory-arguments": 4, + "ifThenElse-memory-arguments": 1, + "mkNilPairData-memory-arguments": 32, + "equalsByteString-cpu-arguments-slope": 247, + "appendString-cpu-arguments-intercept": 150000, + "quotientInteger-cpu-arguments-model-arguments-slope": 118, + "cekApplyCost-exBudgetMemory": 100, + "equalsString-memory-arguments": 1, + "multiplyInteger-memory-arguments-slope": 1, + "cekBuiltinCost-exBudgetMemory": 100, + "remainderInteger-memory-arguments-intercept": 0, + "sha2_256-cpu-arguments-intercept": 2477736, + "remainderInteger-cpu-arguments-model-arguments-intercept": 425507, + "lessThanEqualsByteString-memory-arguments": 1, + "tailList-memory-arguments": 32, + "mkNilData-cpu-arguments": 150000, + "chooseData-cpu-arguments": 150000, + "unBData-memory-arguments": 32, + "blake2b-memory-arguments": 4, + "iData-memory-arguments": 32, + "nullList-memory-arguments": 32, + "cekDelayCost-exBudgetCPU": 29773, + "subtractInteger-memory-arguments-intercept": 1, + "lessThanByteString-cpu-arguments-intercept": 103599, + "consByteString-cpu-arguments-slope": 1000, + "appendByteString-memory-arguments-slope": 1, + "trace-memory-arguments": 32, + "divideInteger-cpu-arguments-constant": 148000, + "cekConstCost-exBudgetCPU": 29773, + "encodeUtf8-memory-arguments-slope": 8, + "quotientInteger-cpu-arguments-model-arguments-intercept": 425507, + "mapData-memory-arguments": 32, + "appendString-cpu-arguments-slope": 1000, + "modInteger-cpu-arguments-constant": 148000, + "verifySignature-cpu-arguments-slope": 1, + "unConstrData-memory-arguments": 32, + "quotientInteger-memory-arguments-intercept": 0, + "equalsByteString-cpu-arguments-constant": 150000, + "sliceByteString-memory-arguments-intercept": 0, + "mkPairData-memory-arguments": 32, + "equalsByteString-cpu-arguments-intercept": 112536, + "appendString-memory-arguments-slope": 1, + "lessThanInteger-cpu-arguments-slope": 497, + "modInteger-cpu-arguments-model-arguments-intercept": 425507, + "modInteger-memory-arguments-minimum": 1, + "sha3_256-cpu-arguments-intercept": 0, + "verifySignature-memory-arguments": 1, + "cekLamCost-exBudgetMemory": 100, + "sliceByteString-cpu-arguments-intercept": 150000 + } + } +} diff --git a/mithril-infra/assets/docker/cardano/config/9.2/preview/cardano-node/byron-genesis.json b/mithril-infra/assets/docker/cardano/config/9.2/preview/cardano-node/byron-genesis.json new file mode 100644 index 00000000000..99b58458400 --- /dev/null +++ b/mithril-infra/assets/docker/cardano/config/9.2/preview/cardano-node/byron-genesis.json @@ -0,0 +1,117 @@ +{ "bootStakeholders": + { "021e737009040bf7f1e7b1bcc148f29d748d4a6b561902c95e4a9f36": 1 + , "0bc82ced9544980b9ffe7f64b1538bbda6804a5cc32c8035485e184b": 1 + , "18ed9844deef98cf9ba8b39791dede0538d2d2fa79bf67ef37dcc826": 1 + , "66cfa84ad0ee5ca8586244c8393007cf3d9622d77cfa03fd4f35065b": 1 + , "76c4d6c68c0ef81ae364411a84e52ce66089ed006ca29adfc0227901": 1 + , "8cc6b89fec65cc83d34b7bab2e6494db631d8476a86625767dd0c2a0": 1 + , "e90060fdc085ac9f63cdb3b32ba1d84e0f7eb98561687b213b4c8770": 1 + } +, "heavyDelegation": + { "021e737009040bf7f1e7b1bcc148f29d748d4a6b561902c95e4a9f36": + { "omega": 0 + , "issuerPk": + "6hSFCotivD08t02n43RMiaF9LzwtYVrFMu/WX6ShfEsxfdXFL5Y6c+DwHSZOCywU0RJz5er2icIO03UytC9NTg==" + , "delegatePk": + "JEnSVQTPGriTx1+lAMkKhCNsMBDNPGw+NiEvNPh4ui6IdvxrO+WkQPTy5U865XB4VFvi/zb7d+H1bilnztQNBg==" + , "cert": + "558952d17442e8cc73f0c7dd606e329b38ed2ec0c1f83fe2567d28b21ef2223d2d23640cd0531f75832b50e519631c48643fcfaa7168851645dce07b90d87f0e" + } + , "0bc82ced9544980b9ffe7f64b1538bbda6804a5cc32c8035485e184b": + { "omega": 0 + , "issuerPk": + "MJ7IskKU8GKk0Eeg3zhfSOK1DDVXOMHD2V/zhEpODUtL9YB0Y7sXnbZfg3+Df05hskP5Jz+dZvdC6DH/dP9jmQ==" + , "delegatePk": + "hwO7NJL7LfAk5e/QG61FKcdORoK60tvprE3063Muh4EQKrWA6l7t23B2GziK8D0hRO0j5W1Gzpn8WW69XLIlKA==" + , "cert": + "2bccf50d0c3cbb03dd29cfba817e8ba615db3d7722b41b264ad08722e548cfe83d069b29d13e490823d7519ecdd9940ea49573f6027056c4bd58da1adf75020e" + } + , "18ed9844deef98cf9ba8b39791dede0538d2d2fa79bf67ef37dcc826": + { "omega": 0 + , "issuerPk": + "pXbW4Jak8maeuWiosvrurykKnqDSHswUjroonSDS3fTnWS+BKe+vjT4zZJNKhQ33KbagiHVJ5CJUNggfsCtG2g==" + , "delegatePk": + "rbJAZp3kWCUvp8dnLR6qsgpGU+qKAFow4NHYKWiKCkfm1qFCFONob50N1IbNWCGWAhg38ZPTvBazTasjsfj6yQ==" + , "cert": + "89e1638e31fd3d402cecb897ba773d8c2c11c2d3cff2462b266e21461539b1a4fe8fb528e159b9af473799b51e49aa5b5816a88f10c484aa7cef7ad12850830a" + } + , "66cfa84ad0ee5ca8586244c8393007cf3d9622d77cfa03fd4f35065b": + { "omega": 0 + , "issuerPk": + "/LGZjmmcAMRisP7Rf454GM2QUKgj2aAyqE+iQo2PIEhcistFOlT+idtbLTceZAnQcwwPJDtTcNi+EnPQyscZOg==" + , "delegatePk": + "rinFUiKKCPPFY0ULEKn1SPRgLVmOS3jdTXDtrxK6VI1I11G3uBS1Olxi0mQSN3kf+B3hm/xHkuUDVNaSXNiBeQ==" + , "cert": + "3e7f30bb68c5bc4d23c2a730ac154a188a1fd45aac3f438efd380303171443d2ca4f50e5a1ff66b40ae3da64697f2599956ae06c21b73fa828b8c0dc9fb27302" + } + , "76c4d6c68c0ef81ae364411a84e52ce66089ed006ca29adfc0227901": + { "omega": 0 + , "issuerPk": + "9EE85tTLdSSR4T1Xoy6n9wr6jlbavCdfp9oQKusskO3DSSyNqRYS7QzYQ96j/WnphUey63082YkKijMfF9A4eA==" + , "delegatePk": + "dvyHDkXg8LFtb0K6Sitl8OGSEZPvfCVQYLDR6Au6t6/ROvlerMKQ8uri4fG7hQQzbHKtdKWgv94t+zuFJTQ1fw==" + , "cert": + "5ec0ed46ae7e575bdb089f1bceca3b2689b13a7162fe08578fe60ba64607fffaa507412a97652c3c81cc0ef93ff404cf809a628ae19faba1a035fca0505c1d04" + } + , "8cc6b89fec65cc83d34b7bab2e6494db631d8476a86625767dd0c2a0": + { "omega": 0 + , "issuerPk": + "Hr5S5PAxf9HSB4FzmtZzaFcXrNrctrI5XUrDrnCkOUTX6rhbtOMkXU3sWVDOvU6LNSSr3/Ws2+iCYZIr7LmTWg==" + , "delegatePk": + "FaLH2b5H/XS31YRnm98N6fP4Etx6m+GbniVAXMwOp8KhYXPKBJBsX/EjIy3pSkvRBhGCjsycB0yrDxWMi5ZsIQ==" + , "cert": + "10f06304cceb42071605ebba67b308c7568e5e6fe0d773c58f7e8c13bc8d8a340f70a4fd5e1b4a1c1db1de5c7646802bbc929d6c82d7adb8a77cb6ad77eac50a" + } + , "e90060fdc085ac9f63cdb3b32ba1d84e0f7eb98561687b213b4c8770": + { "omega": 0 + , "issuerPk": + "B2R+VXzy3c8bxncdOpQ2Z/tblxRNQO8AXQ0OsJDQvZYnLeGQcLD78kyYLpi3nfuS4SfnLar23NV4yiEVwaw+Yw==" + , "delegatePk": + "nACHGIBacymrKwn07iW/a5ZKJCPZ2cKQqeXw3ivR7WOYVUuufWhZlCoUTZ7rtBqoDaexblUQwkC7hA7AmNA3FA==" + , "cert": + "b5440daa05f7fae557df46e4f1b7c5802b86f465daad1137e315abf6e72f1c877207276abb8dcba86e18e42d39b34c2f0fa82ba2919944cdc8e2e5264baa450b" + } + } +, "startTime": 1666656000 +, "nonAvvmBalances": + { "FHnt4NL7yPXjpZtYj1YUiX9QYYUZGXDT9gA2PJXQFkTSMx3EgawXK5BUrCHdhe2": + "0" + , "FHnt4NL7yPXk7D87qAWEmfnL7wSQ9AzBU2mjZt3eM48NSCbygxgzAU6vCGiRZEW": + "0" + , "FHnt4NL7yPXpazQsTdJ3Gp1twQUo4N5rrgGbRNSzchjchPiApc1k4CvqDMcdd7H": + "0" + , "FHnt4NL7yPXtNo1wLCLZyGTMfAvB14h8onafiYkM7B69ZwvGgXeUyQWfi7FPrif": + "0" + , "FHnt4NL7yPXtmi4mAjD43V3NB3shDs1gCuHNcMLPsRWjaw1b2yRV2xad8S8V6aq": + "0" + , "FHnt4NL7yPXvDWHa8bVs73UEUdJd64VxWXSFNqetECtYfTd9TtJguJ14Lu3feth": + "30000000000000000" + , "FHnt4NL7yPXvNSRpCYydjRr7koQCrsTtkovk5uYMimgqMJX2DyrEEBqiXaTd8rG": + "0" + , "FHnt4NL7yPY9rTvdsCeyRnsbzp4bN7XdmAZeU5PzA1qR2asYmN6CsdxJw4YoDjG": + "0" + } +, "blockVersionData": + { "scriptVersion": 0 + , "slotDuration": "20000" + , "maxBlockSize": "2000000" + , "maxHeaderSize": "2000000" + , "maxTxSize": "4096" + , "maxProposalSize": "700" + , "mpcThd": "20000000000000" + , "heavyDelThd": "300000000000" + , "updateVoteThd": "1000000000000" + , "updateProposalThd": "100000000000000" + , "updateImplicit": "10000" + , "softforkRule": + { "initThd": "900000000000000" + , "minThd": "600000000000000" + , "thdDecrement": "50000000000000" + } + , "txFeePolicy": + { "summand": "155381000000000" , "multiplier": "43946000000" } + , "unlockStakeEpoch": "18446744073709551615" + } +, "protocolConsts": { "k": 432 , "protocolMagic": 2 } +, "avvmDistr": {} +} diff --git a/mithril-infra/assets/docker/cardano/config/9.2/preview/cardano-node/config-bp.json b/mithril-infra/assets/docker/cardano/config/9.2/preview/cardano-node/config-bp.json new file mode 100644 index 00000000000..4e60568c8a2 --- /dev/null +++ b/mithril-infra/assets/docker/cardano/config/9.2/preview/cardano-node/config-bp.json @@ -0,0 +1,114 @@ +{ + "AlonzoGenesisFile": "alonzo-genesis.json", + "AlonzoGenesisHash": "7e94a15f55d1e82d10f09203fa1d40f8eede58fd8066542cf6566008068ed874", + "ByronGenesisFile": "byron-genesis.json", + "ByronGenesisHash": "83de1d7302569ad56cf9139a41e2e11346d4cb4a31c00142557b6ab3fa550761", + "ConwayGenesisFile": "conway-genesis.json", + "ConwayGenesisHash": "9cc5084f02e27210eacba47af0872e3dba8946ad9460b6072d793e1d2f3987ef", + "EnableP2P": true, + "ExperimentalHardForksEnabled": false, + "ExperimentalProtocolsEnabled": false, + "LastKnownBlockVersion-Alt": 0, + "LastKnownBlockVersion-Major": 3, + "LastKnownBlockVersion-Minor": 1, + "MinNodeVersion": "8.12.0", + "PeerSharing": false, + "Protocol": "Cardano", + "RequiresNetworkMagic": "RequiresMagic", + "ShelleyGenesisFile": "shelley-genesis.json", + "ShelleyGenesisHash": "363498d1024f84bb39d3fa9593ce391483cb40d479b87233f868d6e57c3a400d", + "TargetNumberOfActivePeers": 20, + "TargetNumberOfEstablishedPeers": 50, + "TargetNumberOfKnownPeers": 100, + "TargetNumberOfRootPeers": 100, + "TestAllegraHardForkAtEpoch": 0, + "TestAlonzoHardForkAtEpoch": 0, + "TestMaryHardForkAtEpoch": 0, + "TestShelleyHardForkAtEpoch": 0, + "TraceAcceptPolicy": true, + "TraceBlockFetchClient": false, + "TraceBlockFetchDecisions": false, + "TraceBlockFetchProtocol": false, + "TraceBlockFetchProtocolSerialised": false, + "TraceBlockFetchServer": false, + "TraceChainDb": true, + "TraceChainSyncBlockServer": false, + "TraceChainSyncClient": false, + "TraceChainSyncHeaderServer": false, + "TraceChainSyncProtocol": false, + "TraceConnectionManager": true, + "TraceDNSResolver": true, + "TraceDNSSubscription": true, + "TraceDiffusionInitialization": true, + "TraceErrorPolicy": true, + "TraceForge": true, + "TraceHandshake": true, + "TraceInboundGovernor": true, + "TraceIpSubscription": true, + "TraceLedgerPeers": true, + "TraceLocalChainSyncProtocol": false, + "TraceLocalConnectionManager": true, + "TraceLocalErrorPolicy": true, + "TraceLocalHandshake": true, + "TraceLocalRootPeers": true, + "TraceLocalTxSubmissionProtocol": false, + "TraceLocalTxSubmissionServer": false, + "TraceMempool": true, + "TraceMux": false, + "TracePeerSelection": true, + "TracePeerSelectionActions": true, + "TracePublicRootPeers": true, + "TraceServer": true, + "TraceTxInbound": false, + "TraceTxOutbound": false, + "TraceTxSubmissionProtocol": false, + "TracingVerbosity": "NormalVerbosity", + "TurnOnLogMetrics": true, + "TurnOnLogging": true, + "defaultBackends": [ + "KatipBK" + ], + "defaultScribes": [ + [ + "StdoutSK", + "stdout" + ] + ], + "hasEKG": 12788, + "hasPrometheus": [ + "127.0.0.1", + 12798 + ], + "minSeverity": "Info", + "options": { + "mapBackends": { + "cardano.node.metrics": [ + "EKGViewBK" + ], + "cardano.node.resources": [ + "EKGViewBK" + ] + }, + "mapSubtrace": { + "cardano.node.metrics": { + "subtrace": "Neutral" + } + } + }, + "rotation": { + "rpKeepFilesNum": 10, + "rpLogLimitBytes": 5000000, + "rpMaxAgeHours": 24 + }, + "setupBackends": [ + "KatipBK" + ], + "setupScribes": [ + { + "scFormat": "ScText", + "scKind": "StdoutSK", + "scName": "stdout", + "scRotation": null + } + ] +} diff --git a/mithril-infra/assets/docker/cardano/config/9.2/preview/cardano-node/config.json b/mithril-infra/assets/docker/cardano/config/9.2/preview/cardano-node/config.json new file mode 100644 index 00000000000..2a5ab35ae43 --- /dev/null +++ b/mithril-infra/assets/docker/cardano/config/9.2/preview/cardano-node/config.json @@ -0,0 +1,114 @@ +{ + "AlonzoGenesisFile": "alonzo-genesis.json", + "AlonzoGenesisHash": "7e94a15f55d1e82d10f09203fa1d40f8eede58fd8066542cf6566008068ed874", + "ByronGenesisFile": "byron-genesis.json", + "ByronGenesisHash": "83de1d7302569ad56cf9139a41e2e11346d4cb4a31c00142557b6ab3fa550761", + "ConwayGenesisFile": "conway-genesis.json", + "ConwayGenesisHash": "9cc5084f02e27210eacba47af0872e3dba8946ad9460b6072d793e1d2f3987ef", + "EnableP2P": true, + "ExperimentalHardForksEnabled": false, + "ExperimentalProtocolsEnabled": false, + "LastKnownBlockVersion-Alt": 0, + "LastKnownBlockVersion-Major": 3, + "LastKnownBlockVersion-Minor": 1, + "MinNodeVersion": "8.12.0", + "PeerSharing": true, + "Protocol": "Cardano", + "RequiresNetworkMagic": "RequiresMagic", + "ShelleyGenesisFile": "shelley-genesis.json", + "ShelleyGenesisHash": "363498d1024f84bb39d3fa9593ce391483cb40d479b87233f868d6e57c3a400d", + "TargetNumberOfActivePeers": 20, + "TargetNumberOfEstablishedPeers": 50, + "TargetNumberOfKnownPeers": 150, + "TargetNumberOfRootPeers": 60, + "TestAllegraHardForkAtEpoch": 0, + "TestAlonzoHardForkAtEpoch": 0, + "TestMaryHardForkAtEpoch": 0, + "TestShelleyHardForkAtEpoch": 0, + "TraceAcceptPolicy": true, + "TraceBlockFetchClient": false, + "TraceBlockFetchDecisions": false, + "TraceBlockFetchProtocol": false, + "TraceBlockFetchProtocolSerialised": false, + "TraceBlockFetchServer": false, + "TraceChainDb": true, + "TraceChainSyncBlockServer": false, + "TraceChainSyncClient": false, + "TraceChainSyncHeaderServer": false, + "TraceChainSyncProtocol": false, + "TraceConnectionManager": true, + "TraceDNSResolver": true, + "TraceDNSSubscription": true, + "TraceDiffusionInitialization": true, + "TraceErrorPolicy": true, + "TraceForge": true, + "TraceHandshake": true, + "TraceInboundGovernor": true, + "TraceIpSubscription": true, + "TraceLedgerPeers": true, + "TraceLocalChainSyncProtocol": false, + "TraceLocalConnectionManager": true, + "TraceLocalErrorPolicy": true, + "TraceLocalHandshake": true, + "TraceLocalRootPeers": true, + "TraceLocalTxSubmissionProtocol": false, + "TraceLocalTxSubmissionServer": false, + "TraceMempool": true, + "TraceMux": false, + "TracePeerSelection": true, + "TracePeerSelectionActions": true, + "TracePublicRootPeers": true, + "TraceServer": true, + "TraceTxInbound": false, + "TraceTxOutbound": false, + "TraceTxSubmissionProtocol": false, + "TracingVerbosity": "NormalVerbosity", + "TurnOnLogMetrics": true, + "TurnOnLogging": true, + "defaultBackends": [ + "KatipBK" + ], + "defaultScribes": [ + [ + "StdoutSK", + "stdout" + ] + ], + "hasEKG": 12788, + "hasPrometheus": [ + "127.0.0.1", + 12798 + ], + "minSeverity": "Info", + "options": { + "mapBackends": { + "cardano.node.metrics": [ + "EKGViewBK" + ], + "cardano.node.resources": [ + "EKGViewBK" + ] + }, + "mapSubtrace": { + "cardano.node.metrics": { + "subtrace": "Neutral" + } + } + }, + "rotation": { + "rpKeepFilesNum": 10, + "rpLogLimitBytes": 5000000, + "rpMaxAgeHours": 24 + }, + "setupBackends": [ + "KatipBK" + ], + "setupScribes": [ + { + "scFormat": "ScText", + "scKind": "StdoutSK", + "scName": "stdout", + "scRotation": null + } + ] +} diff --git a/mithril-infra/assets/docker/cardano/config/9.2/preview/cardano-node/conway-genesis.json b/mithril-infra/assets/docker/cardano/config/9.2/preview/cardano-node/conway-genesis.json new file mode 100644 index 00000000000..4f8b1d06492 --- /dev/null +++ b/mithril-infra/assets/docker/cardano/config/9.2/preview/cardano-node/conway-genesis.json @@ -0,0 +1,297 @@ +{ + "poolVotingThresholds": { + "committeeNormal": 0.51, + "committeeNoConfidence": 0.51, + "hardForkInitiation": 0.51, + "motionNoConfidence": 0.51, + "ppSecurityGroup": 0.51 + }, + "dRepVotingThresholds": { + "motionNoConfidence": 0.67, + "committeeNormal": 0.67, + "committeeNoConfidence": 0.6, + "updateToConstitution": 0.75, + "hardForkInitiation": 0.6, + "ppNetworkGroup": 0.67, + "ppEconomicGroup": 0.67, + "ppTechnicalGroup": 0.67, + "ppGovGroup": 0.75, + "treasuryWithdrawal": 0.67 + }, + "committeeMinSize": 0, + "committeeMaxTermLength": 365, + "govActionLifetime": 30, + "govActionDeposit": 100000000000, + "dRepDeposit": 500000000, + "dRepActivity": 20, + "minFeeRefScriptCostPerByte": 15, + "plutusV3CostModel": [ + 100788, + 420, + 1, + 1, + 1000, + 173, + 0, + 1, + 1000, + 59957, + 4, + 1, + 11183, + 32, + 201305, + 8356, + 4, + 16000, + 100, + 16000, + 100, + 16000, + 100, + 16000, + 100, + 16000, + 100, + 16000, + 100, + 100, + 100, + 16000, + 100, + 94375, + 32, + 132994, + 32, + 61462, + 4, + 72010, + 178, + 0, + 1, + 22151, + 32, + 91189, + 769, + 4, + 2, + 85848, + 123203, + 7305, + -900, + 1716, + 549, + 57, + 85848, + 0, + 1, + 1, + 1000, + 42921, + 4, + 2, + 24548, + 29498, + 38, + 1, + 898148, + 27279, + 1, + 51775, + 558, + 1, + 39184, + 1000, + 60594, + 1, + 141895, + 32, + 83150, + 32, + 15299, + 32, + 76049, + 1, + 13169, + 4, + 22100, + 10, + 28999, + 74, + 1, + 28999, + 74, + 1, + 43285, + 552, + 1, + 44749, + 541, + 1, + 33852, + 32, + 68246, + 32, + 72362, + 32, + 7243, + 32, + 7391, + 32, + 11546, + 32, + 85848, + 123203, + 7305, + -900, + 1716, + 549, + 57, + 85848, + 0, + 1, + 90434, + 519, + 0, + 1, + 74433, + 32, + 85848, + 123203, + 7305, + -900, + 1716, + 549, + 57, + 85848, + 0, + 1, + 1, + 85848, + 123203, + 7305, + -900, + 1716, + 549, + 57, + 85848, + 0, + 1, + 955506, + 213312, + 0, + 2, + 270652, + 22588, + 4, + 1457325, + 64566, + 4, + 20467, + 1, + 4, + 0, + 141992, + 32, + 100788, + 420, + 1, + 1, + 81663, + 32, + 59498, + 32, + 20142, + 32, + 24588, + 32, + 20744, + 32, + 25933, + 32, + 24623, + 32, + 43053543, + 10, + 53384111, + 14333, + 10, + 43574283, + 26308, + 10, + 16000, + 100, + 16000, + 100, + 962335, + 18, + 2780678, + 6, + 442008, + 1, + 52538055, + 3756, + 18, + 267929, + 18, + 76433006, + 8868, + 18, + 52948122, + 18, + 1995836, + 36, + 3227919, + 12, + 901022, + 1, + 166917843, + 4307, + 36, + 284546, + 36, + 158221314, + 26549, + 36, + 74698472, + 36, + 333849714, + 1, + 254006273, + 72, + 2174038, + 72, + 2261318, + 64571, + 4, + 207616, + 8310, + 4, + 1293828, + 28716, + 63, + 0, + 1, + 1006041, + 43623, + 251, + 0, + 1 + ], + "constitution": { + "anchor": { + "dataHash": "ca41a91f399259bcefe57f9858e91f6d00e1a38d6d9c63d4052914ea7bd70cb2", + "url": "ipfs://bafkreifnwj6zpu3ixa4siz2lndqybyc5wnnt3jkwyutci4e2tmbnj3xrdm" + }, + "script": "fa24fb305126805cf2164c161d852a0e7330cf988f1fe558cf7d4a64" + }, + "committee": { + "members": { + "scriptHash-ff9babf23fef3f54ec29132c07a8e23807d7b395b143ecd8ff79f4c7": 1000 + }, + "threshold": { + "numerator": 2, + "denominator": 3 + } + } +} diff --git a/mithril-infra/assets/docker/cardano/config/9.2/preview/cardano-node/shelley-genesis.json b/mithril-infra/assets/docker/cardano/config/9.2/preview/cardano-node/shelley-genesis.json new file mode 100644 index 00000000000..20abba3fb1b --- /dev/null +++ b/mithril-infra/assets/docker/cardano/config/9.2/preview/cardano-node/shelley-genesis.json @@ -0,0 +1,68 @@ +{ + "activeSlotsCoeff": 0.05, + "epochLength": 86400, + "genDelegs": { + "12b0f443d02861948a0fce9541916b014e8402984c7b83ad70a834ce": { + "delegate": "7c54a168c731f2f44ced620f3cca7c2bd90731cab223d5167aa994e6", + "vrf": "62d546a35e1be66a2b06e29558ef33f4222f1c466adbb59b52d800964d4e60ec" + }, + "3df542796a64e399b60c74acfbdb5afa1e114532fa36b46d6368ef3a": { + "delegate": "c44bc2f3cc7e98c0f227aa399e4035c33c0d775a0985875fff488e20", + "vrf": "4f9d334decadff6eba258b2df8ae1f02580a2628bce47ae7d957e1acd3f42a3c" + }, + "93fd5083ff20e7ab5570948831730073143bea5a5d5539852ed45889": { + "delegate": "82a02922f10105566b70366b07c758c8134fa91b3d8ae697dfa5e8e0", + "vrf": "8a57e94a9b4c65ec575f35d41edb1df399fa30fdf10775389f5d1ef670ca3f9f" + }, + "a86cab3ea72eabb2e8aafbbf4abbd2ba5bdfd04eea26a39b126a78e4": { + "delegate": "10257f6d3bae913514bdc96c9170b3166bf6838cca95736b0e418426", + "vrf": "1b54aad6b013145a0fc74bb5c2aa368ebaf3999e88637d78e09706d0cc29874a" + }, + "b799804a28885bd49c0e1b99d8b3b26de0fac17a5cf651ecf0c872f0": { + "delegate": "ebe606e22d932d51be2c1ce87e7d7e4c9a7d1f7df4a5535c29e23d22", + "vrf": "b3fc06a1f8ee69ff23185d9af453503be8b15b2652e1f9fb7c3ded6797a2d6f9" + }, + "d125812d6ab973a2c152a0525b7fd32d36ff13555a427966a9cac9b1": { + "delegate": "e302198135fb5b00bfe0b9b5623426f7cf03179ab7ba75f945d5b79b", + "vrf": "b45ca2ed95f92248fa0322ce1fc9f815a5a5aa2f21f1adc2c42c4dccfc7ba631" + }, + "ef27651990a26449a40767d5e06cdef1670a3f3ff4b951d385b51787": { + "delegate": "0e0b11e80d958732e587585d30978d683a061831d1b753878f549d05", + "vrf": "b860ec844f6cd476c4fabb4aa1ca72d5c74d82f3835aed3c9515a35b6e048719" + } + }, + "initialFunds": {}, + "maxKESEvolutions": 62, + "maxLovelaceSupply": 45000000000000000, + "networkId": "Testnet", + "networkMagic": 2, + "protocolParams": { + "protocolVersion": { + "minor": 0, + "major": 6 + }, + "decentralisationParam": 1, + "eMax": 18, + "extraEntropy": { + "tag": "NeutralNonce" + }, + "maxTxSize": 16384, + "maxBlockBodySize": 65536, + "maxBlockHeaderSize": 1100, + "minFeeA": 44, + "minFeeB": 155381, + "minUTxOValue": 1000000, + "poolDeposit": 500000000, + "minPoolCost": 340000000, + "keyDeposit": 2000000, + "nOpt": 150, + "rho": 0.003, + "tau": 0.20, + "a0": 0.3 + }, + "securityParam": 432, + "slotLength": 1, + "slotsPerKESPeriod": 129600, + "systemStart": "2022-10-25T00:00:00Z", + "updateQuorum": 5 +} diff --git a/mithril-infra/assets/docker/cardano/config/9.2/preview/cardano-node/topology.json b/mithril-infra/assets/docker/cardano/config/9.2/preview/cardano-node/topology.json new file mode 100644 index 00000000000..3a6607f594f --- /dev/null +++ b/mithril-infra/assets/docker/cardano/config/9.2/preview/cardano-node/topology.json @@ -0,0 +1,23 @@ +{ + "bootstrapPeers": [ + { + "address": "preview-node.play.dev.cardano.org", + "port": 3001 + } + ], + "localRoots": [ + { + "accessPoints": [], + "advertise": false, + "trustable": false, + "valency": 1 + } + ], + "publicRoots": [ + { + "accessPoints": [], + "advertise": false + } + ], + "useLedgerAfterSlot": 53827185 +} diff --git a/mithril-infra/assets/docker/cardano/config/9.2/sanchonet/cardano-node/alonzo-genesis.json b/mithril-infra/assets/docker/cardano/config/9.2/sanchonet/cardano-node/alonzo-genesis.json new file mode 100644 index 00000000000..de05d3d9e46 --- /dev/null +++ b/mithril-infra/assets/docker/cardano/config/9.2/sanchonet/cardano-node/alonzo-genesis.json @@ -0,0 +1,188 @@ +{ + "collateralPercentage": 150, + "costModels": { + "PlutusV1": [ + 197209, + 0, + 1, + 1, + 396231, + 621, + 0, + 1, + 150000, + 1000, + 0, + 1, + 150000, + 32, + 2477736, + 29175, + 4, + 29773, + 100, + 29773, + 100, + 29773, + 100, + 29773, + 100, + 29773, + 100, + 29773, + 100, + 100, + 100, + 29773, + 100, + 150000, + 32, + 150000, + 32, + 150000, + 32, + 150000, + 1000, + 0, + 1, + 150000, + 32, + 150000, + 1000, + 0, + 8, + 148000, + 425507, + 118, + 0, + 1, + 1, + 150000, + 1000, + 0, + 8, + 150000, + 112536, + 247, + 1, + 150000, + 10000, + 1, + 136542, + 1326, + 1, + 1000, + 150000, + 1000, + 1, + 150000, + 32, + 150000, + 32, + 150000, + 32, + 1, + 1, + 150000, + 1, + 150000, + 4, + 103599, + 248, + 1, + 103599, + 248, + 1, + 145276, + 1366, + 1, + 179690, + 497, + 1, + 150000, + 32, + 150000, + 32, + 150000, + 32, + 150000, + 32, + 150000, + 32, + 150000, + 32, + 148000, + 425507, + 118, + 0, + 1, + 1, + 61516, + 11218, + 0, + 1, + 150000, + 32, + 148000, + 425507, + 118, + 0, + 1, + 1, + 148000, + 425507, + 118, + 0, + 1, + 1, + 2477736, + 29175, + 4, + 0, + 82363, + 4, + 150000, + 5000, + 0, + 1, + 150000, + 32, + 197209, + 0, + 1, + 1, + 150000, + 32, + 150000, + 32, + 150000, + 32, + 150000, + 32, + 150000, + 32, + 150000, + 32, + 150000, + 32, + 3345831, + 1, + 1 + ] + }, + "executionPrices": { + "prMem": 5.77e-2, + "prSteps": 7.21e-5 + }, + "lovelacePerUTxOWord": 34482, + "maxBlockExUnits": { + "exUnitsMem": 50000000, + "exUnitsSteps": 40000000000 + }, + "maxCollateralInputs": 3, + "maxTxExUnits": { + "exUnitsMem": 10000000, + "exUnitsSteps": 10000000000 + }, + "maxValueSize": 5000 +} \ No newline at end of file diff --git a/mithril-infra/assets/docker/cardano/config/9.2/sanchonet/cardano-node/byron-genesis.json b/mithril-infra/assets/docker/cardano/config/9.2/sanchonet/cardano-node/byron-genesis.json new file mode 100644 index 00000000000..f0c29c655b7 --- /dev/null +++ b/mithril-infra/assets/docker/cardano/config/9.2/sanchonet/cardano-node/byron-genesis.json @@ -0,0 +1,62 @@ +{ + "avvmDistr": {}, + "blockVersionData": { + "heavyDelThd": "300000000000", + "maxBlockSize": "2000000", + "maxHeaderSize": "2000000", + "maxProposalSize": "700", + "maxTxSize": "4096", + "mpcThd": "20000000000000", + "scriptVersion": 0, + "slotDuration": "20000", + "softforkRule": { + "initThd": "900000000000000", + "minThd": "600000000000000", + "thdDecrement": "50000000000000" + }, + "txFeePolicy": { + "multiplier": "43946000000", + "summand": "155381000000000" + }, + "unlockStakeEpoch": "18446744073709551615", + "updateImplicit": "10000", + "updateProposalThd": "100000000000000", + "updateVoteThd": "1000000000000" + }, + "bootStakeholders": { + "318488dc356f6034104804b2cb6a2dcc055202491386fb0d5af7c3ba": 1, + "3a3c2ffaf066c8f211a1bdfd844f767ac453b1d94915e725c5867467": 1, + "3ae8eabb4e0626cea0ba38d8303d59514dae9c307d93bad3d259e4a9": 1 + }, + "heavyDelegation": { + "318488dc356f6034104804b2cb6a2dcc055202491386fb0d5af7c3ba": { + "cert": "b80e06679023284236df3464dc6aab3f56f23cb721d5943c59632ac77004f76ae415b6d291606c7194509e1fefa0c8341eed269bd0e0e1433302b00912a4230c", + "delegatePk": "9ELoyHN4GVtXrFzAJZApAVjrhwftqEFVoDXl9ebtTwpe/lG4b5ZkgH3DqwHE1hNJFRsnYs4zYzMmdbnoR7lfUA==", + "issuerPk": "MHFL9SqIV6KuXSAvp08jHBRtHwNsDJMsCxbmXLorSbfLAORg7waqVL8NEaKU3Lb0FBIX5sHVC21i1M/c0jrnlA==", + "omega": 0 + }, + "3a3c2ffaf066c8f211a1bdfd844f767ac453b1d94915e725c5867467": { + "cert": "ce91b8e35b67de2236fa79b353d1c4ebd97ad4b4cc89056a1acfc217ece8e91fbffc4bf44604a96a1064c9997f6cd39b81284aadfac752056eafc6b5996a6509", + "delegatePk": "Grpf6iTqd9aWc3QWvfthNv2l8Pp0X2tKpoIoPn0+Dy1+ow60UTu9i1j4KPjp1uzrnM4JoUcmkCGF507fPagO8w==", + "issuerPk": "1FPA7qSOPVDlNZoQAuoB2dnm+tKI5td6+BO5sJ2rswVxuS6S6sjBFVfVz/VXfKTcEt/AKyffgzWXAtPCnhC1jw==", + "omega": 0 + }, + "3ae8eabb4e0626cea0ba38d8303d59514dae9c307d93bad3d259e4a9": { + "cert": "908dd25262598050d60cb24928a7059fea3726a1dd7764645edab654d3b4e37ba69acd4841454f70f0f643305ede0ef66dc0ea9747a2387da05d2af77963f30a", + "delegatePk": "1zYduiReianx6HJHgQqtira7XY6M/Ol4tFj/O7TzTLcNfgazJm8pq5y6HAANwl91iL1pDZuIgFjzI+2i1Z6y2Q==", + "issuerPk": "Pgj3IyTJDyxr+t5fcMuM3aPtyNCxOo4T9sr78BNbgWBGwlTGo0P6UtzNLyqloLsH8V6Lv6kYMdWELAiEyfCpkw==", + "omega": 0 + } + }, + "nonAvvmBalances": { + "FHnt4NL7yPXqn7xha3WB99wYLxAc1FhceD3D1pQWaCthk9RYB46aGb6Tbq2KxV5": "0", + "FHnt4NL7yPXwj8m191s48v1RZtQqA2sVHpamzStuXTuAnzYUSR6hRPqhYmW3MY4": "0", + "FHnt4NL7yPXzVZ5xexcb7rWqCYWuFU7y6Pp4tLTiv6txhDcpQ2m7AFGMirsi1F1": "30000000000000000", + "FHnt4NL7yPY27r794z4UiYJ3RwezucDRLX94Pzy6mYPNUNWboB71S9xUm2WEDrv": "0" + }, + "protocolConsts": { + "k": 432, + "protocolMagic": 4 + }, + "startTime": 1686789000 +} diff --git a/mithril-infra/assets/docker/cardano/config/9.2/sanchonet/cardano-node/config-bp.json b/mithril-infra/assets/docker/cardano/config/9.2/sanchonet/cardano-node/config-bp.json new file mode 100644 index 00000000000..74a55d0f7c8 --- /dev/null +++ b/mithril-infra/assets/docker/cardano/config/9.2/sanchonet/cardano-node/config-bp.json @@ -0,0 +1,114 @@ +{ + "AlonzoGenesisFile": "alonzo-genesis.json", + "AlonzoGenesisHash": "8bedcaea62107d8a79ed5293b0027b3f8706a4bc2422f33380cb1fd01c6fa6ec", + "ByronGenesisFile": "byron-genesis.json", + "ByronGenesisHash": "785eb88427e136378a15b0a152a8bfbeec7a611529ccda29c43a1e60ffb48eaa", + "ConwayGenesisFile": "conway-genesis.json", + "ConwayGenesisHash": "e85ee5b7af8ca5c273c20746c9f994aef1a72a79c38b4eea230817e7e66c0741", + "EnableP2P": true, + "ExperimentalHardForksEnabled": true, + "ExperimentalProtocolsEnabled": true, + "LastKnownBlockVersion-Alt": 0, + "LastKnownBlockVersion-Major": 3, + "LastKnownBlockVersion-Minor": 1, + "MinNodeVersion": "8.12.0", + "PeerSharing": false, + "Protocol": "Cardano", + "RequiresNetworkMagic": "RequiresMagic", + "ShelleyGenesisFile": "shelley-genesis.json", + "ShelleyGenesisHash": "f94457ec45a0c6773057a529533cf7ccf746cb44dabd56ae970e1dbfb55bfdb2", + "TargetNumberOfActivePeers": 20, + "TargetNumberOfEstablishedPeers": 50, + "TargetNumberOfKnownPeers": 100, + "TargetNumberOfRootPeers": 100, + "TestAllegraHardForkAtEpoch": 0, + "TestAlonzoHardForkAtEpoch": 0, + "TestMaryHardForkAtEpoch": 0, + "TestShelleyHardForkAtEpoch": 0, + "TraceAcceptPolicy": true, + "TraceBlockFetchClient": false, + "TraceBlockFetchDecisions": false, + "TraceBlockFetchProtocol": false, + "TraceBlockFetchProtocolSerialised": false, + "TraceBlockFetchServer": false, + "TraceChainDb": true, + "TraceChainSyncBlockServer": false, + "TraceChainSyncClient": false, + "TraceChainSyncHeaderServer": false, + "TraceChainSyncProtocol": false, + "TraceConnectionManager": true, + "TraceDNSResolver": true, + "TraceDNSSubscription": true, + "TraceDiffusionInitialization": true, + "TraceErrorPolicy": true, + "TraceForge": true, + "TraceHandshake": true, + "TraceInboundGovernor": true, + "TraceIpSubscription": true, + "TraceLedgerPeers": true, + "TraceLocalChainSyncProtocol": false, + "TraceLocalConnectionManager": true, + "TraceLocalErrorPolicy": true, + "TraceLocalHandshake": true, + "TraceLocalRootPeers": true, + "TraceLocalTxSubmissionProtocol": false, + "TraceLocalTxSubmissionServer": false, + "TraceMempool": true, + "TraceMux": false, + "TracePeerSelection": true, + "TracePeerSelectionActions": true, + "TracePublicRootPeers": true, + "TraceServer": true, + "TraceTxInbound": false, + "TraceTxOutbound": false, + "TraceTxSubmissionProtocol": false, + "TracingVerbosity": "NormalVerbosity", + "TurnOnLogMetrics": true, + "TurnOnLogging": true, + "defaultBackends": [ + "KatipBK" + ], + "defaultScribes": [ + [ + "StdoutSK", + "stdout" + ] + ], + "hasEKG": 12788, + "hasPrometheus": [ + "127.0.0.1", + 12798 + ], + "minSeverity": "Info", + "options": { + "mapBackends": { + "cardano.node.metrics": [ + "EKGViewBK" + ], + "cardano.node.resources": [ + "EKGViewBK" + ] + }, + "mapSubtrace": { + "cardano.node.metrics": { + "subtrace": "Neutral" + } + } + }, + "rotation": { + "rpKeepFilesNum": 10, + "rpLogLimitBytes": 5000000, + "rpMaxAgeHours": 24 + }, + "setupBackends": [ + "KatipBK" + ], + "setupScribes": [ + { + "scFormat": "ScText", + "scKind": "StdoutSK", + "scName": "stdout", + "scRotation": null + } + ] +} diff --git a/mithril-infra/assets/docker/cardano/config/9.2/sanchonet/cardano-node/config.json b/mithril-infra/assets/docker/cardano/config/9.2/sanchonet/cardano-node/config.json new file mode 100644 index 00000000000..638bb250c48 --- /dev/null +++ b/mithril-infra/assets/docker/cardano/config/9.2/sanchonet/cardano-node/config.json @@ -0,0 +1,114 @@ +{ + "AlonzoGenesisFile": "alonzo-genesis.json", + "AlonzoGenesisHash": "8bedcaea62107d8a79ed5293b0027b3f8706a4bc2422f33380cb1fd01c6fa6ec", + "ByronGenesisFile": "byron-genesis.json", + "ByronGenesisHash": "785eb88427e136378a15b0a152a8bfbeec7a611529ccda29c43a1e60ffb48eaa", + "ConwayGenesisFile": "conway-genesis.json", + "ConwayGenesisHash": "e85ee5b7af8ca5c273c20746c9f994aef1a72a79c38b4eea230817e7e66c0741", + "EnableP2P": true, + "ExperimentalHardForksEnabled": true, + "ExperimentalProtocolsEnabled": true, + "LastKnownBlockVersion-Alt": 0, + "LastKnownBlockVersion-Major": 3, + "LastKnownBlockVersion-Minor": 1, + "MinNodeVersion": "8.12.0", + "PeerSharing": true, + "Protocol": "Cardano", + "RequiresNetworkMagic": "RequiresMagic", + "ShelleyGenesisFile": "shelley-genesis.json", + "ShelleyGenesisHash": "f94457ec45a0c6773057a529533cf7ccf746cb44dabd56ae970e1dbfb55bfdb2", + "TargetNumberOfActivePeers": 20, + "TargetNumberOfEstablishedPeers": 50, + "TargetNumberOfKnownPeers": 150, + "TargetNumberOfRootPeers": 60, + "TestAllegraHardForkAtEpoch": 0, + "TestAlonzoHardForkAtEpoch": 0, + "TestMaryHardForkAtEpoch": 0, + "TestShelleyHardForkAtEpoch": 0, + "TraceAcceptPolicy": true, + "TraceBlockFetchClient": false, + "TraceBlockFetchDecisions": false, + "TraceBlockFetchProtocol": false, + "TraceBlockFetchProtocolSerialised": false, + "TraceBlockFetchServer": false, + "TraceChainDb": true, + "TraceChainSyncBlockServer": false, + "TraceChainSyncClient": false, + "TraceChainSyncHeaderServer": false, + "TraceChainSyncProtocol": false, + "TraceConnectionManager": true, + "TraceDNSResolver": true, + "TraceDNSSubscription": true, + "TraceDiffusionInitialization": true, + "TraceErrorPolicy": true, + "TraceForge": true, + "TraceHandshake": true, + "TraceInboundGovernor": true, + "TraceIpSubscription": true, + "TraceLedgerPeers": true, + "TraceLocalChainSyncProtocol": false, + "TraceLocalConnectionManager": true, + "TraceLocalErrorPolicy": true, + "TraceLocalHandshake": true, + "TraceLocalRootPeers": true, + "TraceLocalTxSubmissionProtocol": false, + "TraceLocalTxSubmissionServer": false, + "TraceMempool": true, + "TraceMux": false, + "TracePeerSelection": true, + "TracePeerSelectionActions": true, + "TracePublicRootPeers": true, + "TraceServer": true, + "TraceTxInbound": false, + "TraceTxOutbound": false, + "TraceTxSubmissionProtocol": false, + "TracingVerbosity": "NormalVerbosity", + "TurnOnLogMetrics": true, + "TurnOnLogging": true, + "defaultBackends": [ + "KatipBK" + ], + "defaultScribes": [ + [ + "StdoutSK", + "stdout" + ] + ], + "hasEKG": 12788, + "hasPrometheus": [ + "127.0.0.1", + 12798 + ], + "minSeverity": "Info", + "options": { + "mapBackends": { + "cardano.node.metrics": [ + "EKGViewBK" + ], + "cardano.node.resources": [ + "EKGViewBK" + ] + }, + "mapSubtrace": { + "cardano.node.metrics": { + "subtrace": "Neutral" + } + } + }, + "rotation": { + "rpKeepFilesNum": 10, + "rpLogLimitBytes": 5000000, + "rpMaxAgeHours": 24 + }, + "setupBackends": [ + "KatipBK" + ], + "setupScribes": [ + { + "scFormat": "ScText", + "scKind": "StdoutSK", + "scName": "stdout", + "scRotation": null + } + ] +} diff --git a/mithril-infra/assets/docker/cardano/config/9.2/sanchonet/cardano-node/conway-genesis.json b/mithril-infra/assets/docker/cardano/config/9.2/sanchonet/cardano-node/conway-genesis.json new file mode 100644 index 00000000000..81b2f4b7deb --- /dev/null +++ b/mithril-infra/assets/docker/cardano/config/9.2/sanchonet/cardano-node/conway-genesis.json @@ -0,0 +1,298 @@ +{ + "poolVotingThresholds": { + "committeeNormal": 0.65, + "committeeNoConfidence": 0.65, + "hardForkInitiation": 0.51, + "motionNoConfidence": 0.6, + "ppSecurityGroup": 0.6 + }, + "dRepVotingThresholds": { + "motionNoConfidence": 0.67, + "committeeNormal": 0.67, + "committeeNoConfidence": 0.65, + "updateToConstitution": 0.75, + "hardForkInitiation": 0.6, + "ppNetworkGroup": 0.67, + "ppEconomicGroup": 0.67, + "ppTechnicalGroup": 0.67, + "ppGovGroup": 0.75, + "treasuryWithdrawal": 0.67 + }, + "committeeMinSize": 5, + "committeeMaxTermLength": 146, + "govActionLifetime": 14, + "govActionDeposit": 100000000000, + "dRepDeposit": 500000000, + "dRepActivity": 20, + "minFeeRefScriptCostPerByte": 15, + "plutusV3CostModel": [ + 100788, + 420, + 1, + 1, + 1000, + 173, + 0, + 1, + 1000, + 59957, + 4, + 1, + 11183, + 32, + 201305, + 8356, + 4, + 16000, + 100, + 16000, + 100, + 16000, + 100, + 16000, + 100, + 16000, + 100, + 16000, + 100, + 100, + 100, + 16000, + 100, + 94375, + 32, + 132994, + 32, + 61462, + 4, + 72010, + 178, + 0, + 1, + 22151, + 32, + 91189, + 769, + 4, + 2, + 85848, + 123203, + 7305, + -900, + 1716, + 549, + 57, + 85848, + 0, + 1, + 1, + 1000, + 42921, + 4, + 2, + 24548, + 29498, + 38, + 1, + 898148, + 27279, + 1, + 51775, + 558, + 1, + 39184, + 1000, + 60594, + 1, + 141895, + 32, + 83150, + 32, + 15299, + 32, + 76049, + 1, + 13169, + 4, + 22100, + 10, + 28999, + 74, + 1, + 28999, + 74, + 1, + 43285, + 552, + 1, + 44749, + 541, + 1, + 33852, + 32, + 68246, + 32, + 72362, + 32, + 7243, + 32, + 7391, + 32, + 11546, + 32, + 85848, + 123203, + 7305, + -900, + 1716, + 549, + 57, + 85848, + 0, + 1, + 90434, + 519, + 0, + 1, + 74433, + 32, + 85848, + 123203, + 7305, + -900, + 1716, + 549, + 57, + 85848, + 0, + 1, + 1, + 85848, + 123203, + 7305, + -900, + 1716, + 549, + 57, + 85848, + 0, + 1, + 955506, + 213312, + 0, + 2, + 270652, + 22588, + 4, + 1457325, + 64566, + 4, + 20467, + 1, + 4, + 0, + 141992, + 32, + 100788, + 420, + 1, + 1, + 81663, + 32, + 59498, + 32, + 20142, + 32, + 24588, + 32, + 20744, + 32, + 25933, + 32, + 24623, + 32, + 43053543, + 10, + 53384111, + 14333, + 10, + 43574283, + 26308, + 10, + 16000, + 100, + 16000, + 100, + 962335, + 18, + 2780678, + 6, + 442008, + 1, + 52538055, + 3756, + 18, + 267929, + 18, + 76433006, + 8868, + 18, + 52948122, + 18, + 1995836, + 36, + 3227919, + 12, + 901022, + 1, + 166917843, + 4307, + 36, + 284546, + 36, + 158221314, + 26549, + 36, + 74698472, + 36, + 333849714, + 1, + 254006273, + 72, + 2174038, + 72, + 2261318, + 64571, + 4, + 207616, + 8310, + 4, + 1293828, + 28716, + 63, + 0, + 1, + 1006041, + 43623, + 251, + 0, + 1 + ], + "constitution": { + "anchor": { + "url": "ipfs://QmQq5hWDNzvDR1ForEktAHrdCQmfSL2u5yctNpzDwoSBu4", + "dataHash": "23b43bebac48a4acc39e578715aa06635d6d900fa3ea7441dfffd6e43b914f7b" + }, + "script": "edcd84c10e36ae810dc50847477083069db796219b39ccde790484e0" + }, + "committee": { + "members": { + "scriptHash-7ceede7d6a89e006408e6b7c6acb3dd094b3f6817e43b4a36d01535b": 500, + "scriptHash-6095e643ea6f1cccb6e463ec34349026b3a48621aac5d512655ab1bf": 500, + "scriptHash-27999ed757d6dac217471ae61d69b1b067b8b240d9e3ff36eb66b5d0": 500, + "scriptHash-87f867a31c0f81360d4d7dcddb6b025ba8383db9bf77a2af7797799d": 500, + "scriptHash-a19a7ba1caede8f3ab3e5e2a928b3798d7d011af18fbd577f7aeb0ec": 500 + }, + "threshold": 0.67 + } +} diff --git a/mithril-infra/assets/docker/cardano/config/9.2/sanchonet/cardano-node/shelley-genesis.json b/mithril-infra/assets/docker/cardano/config/9.2/sanchonet/cardano-node/shelley-genesis.json new file mode 100644 index 00000000000..544585999ef --- /dev/null +++ b/mithril-infra/assets/docker/cardano/config/9.2/sanchonet/cardano-node/shelley-genesis.json @@ -0,0 +1,56 @@ +{ + "activeSlotsCoeff": 5.0e-2, + "epochLength": 86400, + "genDelegs": { + "c1ad22cabb342cbb83ce3859708232f4945ccb669e9b5f932cffc0ed": { + "delegate": "405357b552c397e81f73dcb5a0da0828fe29610bd25197d86130df34", + "vrf": "458215df6c07abc66e80082caa7a189dc2f4995ad4b4b5f09481a55d8d0692d2" + }, + "c264bca994a3a5deee5a1d9b92a3d7e9d6cbdb81f2f6989bb7f7b437": { + "delegate": "d9d9d0f0e1f25c4af4d80cb2d62878b611d8b3a8e1ef548d01f246d7", + "vrf": "624f1bf3b2f978e0c95644f26228b307d7acca7fc7eb3d88fb6f107e0aa1198c" + }, + "d4bf7eb45b72dffa5ac33d5c902fe409e4e611f2e9a52fb0d09784c3": { + "delegate": "806eb0c17d9b0fe6d99acbabe7be76ef72bf9de96c5b58435e50837f", + "vrf": "57e52289207a7128c29e0b7e96a02c731a961a5944329b363bed751ad8f377ee" + } + }, + "initialFunds": {}, + "maxKESEvolutions": 62, + "maxLovelaceSupply": 45000000000000000, + "networkId": "Testnet", + "networkMagic": 4, + "protocolParams": { + "a0": 0.3, + "decentralisationParam": 1.0, + "eMax": 18, + "extraEntropy": { + "tag": "NeutralNonce" + }, + "keyDeposit": 2000000, + "maxBlockBodySize": 65536, + "maxBlockHeaderSize": 1100, + "maxTxSize": 16384, + "minFeeA": 44, + "minFeeB": 155381, + "minPoolCost": 340000000, + "minUTxOValue": 1000000, + "nOpt": 150, + "poolDeposit": 500000000, + "protocolVersion": { + "major": 6, + "minor": 0 + }, + "rho": 3.0e-3, + "tau": 0.2 + }, + "securityParam": 432, + "slotLength": 1, + "slotsPerKESPeriod": 129600, + "staking": { + "pools": {}, + "stake": {} + }, + "systemStart": "2023-06-15T00:30:00Z", + "updateQuorum": 3 +} \ No newline at end of file diff --git a/mithril-infra/assets/docker/cardano/config/9.2/sanchonet/cardano-node/topology.json b/mithril-infra/assets/docker/cardano/config/9.2/sanchonet/cardano-node/topology.json new file mode 100644 index 00000000000..101e1e4a639 --- /dev/null +++ b/mithril-infra/assets/docker/cardano/config/9.2/sanchonet/cardano-node/topology.json @@ -0,0 +1,23 @@ +{ + "bootstrapPeers": [ + { + "address": "sanchonet-node.play.dev.cardano.org", + "port": 3001 + } + ], + "localRoots": [ + { + "accessPoints": [], + "advertise": false, + "trustable": false, + "valency": 1 + } + ], + "publicRoots": [ + { + "accessPoints": [], + "advertise": false + } + ], + "useLedgerAfterSlot": 33695977 +} From df44f12f321db18e7f34e50563f3b504228b54ae Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Mon, 30 Sep 2024 16:44:00 +0200 Subject: [PATCH 149/274] chore: update default Cardno node version to '9.2.1' in infra --- mithril-infra/variables.tf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mithril-infra/variables.tf b/mithril-infra/variables.tf index e742b1c6cd0..823af67f164 100644 --- a/mithril-infra/variables.tf +++ b/mithril-infra/variables.tf @@ -141,7 +141,7 @@ locals { variable "cardano_image_id" { type = string description = "The Cardano image tag of service to deploy" - default = "9.1.0" + default = "9.2.0" } variable "cardano_image_registry" { From f537c40d634ce0d8011c1c20e8c469c8bbb21c88 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Mon, 30 Sep 2024 16:44:15 +0200 Subject: [PATCH 150/274] chore: update default Cardano node version to '9.2.1' in infra --- mithril-infra/variables.tf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mithril-infra/variables.tf b/mithril-infra/variables.tf index 823af67f164..effa7ecfd53 100644 --- a/mithril-infra/variables.tf +++ b/mithril-infra/variables.tf @@ -141,7 +141,7 @@ locals { variable "cardano_image_id" { type = string description = "The Cardano image tag of service to deploy" - default = "9.2.0" + default = "9.2.1" } variable "cardano_image_registry" { From 1e6820487e6adca6235b5f5204561277820e4eae Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Mon, 30 Sep 2024 16:45:29 +0200 Subject: [PATCH 151/274] chore: update default version Cardano CLI Docker images to '9.2.1' --- mithril-aggregator/Dockerfile | 2 +- mithril-aggregator/Dockerfile.ci | 2 +- mithril-signer/Dockerfile | 2 +- mithril-signer/Dockerfile.ci | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mithril-aggregator/Dockerfile b/mithril-aggregator/Dockerfile index c30d659820b..f45ad41b596 100644 --- a/mithril-aggregator/Dockerfile +++ b/mithril-aggregator/Dockerfile @@ -35,7 +35,7 @@ RUN /app/target/release/mithril-aggregator --version FROM debian:11-slim # Args -ARG CARDANO_NODE_VERSION=9.1.0 +ARG CARDANO_NODE_VERSION=9.2.1 ARG CARDANO_BIN_URL=https://github.com/input-output-hk/cardano-node/releases/download/$CARDANO_NODE_VERSION/cardano-node-$CARDANO_NODE_VERSION-linux.tar.gz ARG EMBED-CARDANO-CLI=0 diff --git a/mithril-aggregator/Dockerfile.ci b/mithril-aggregator/Dockerfile.ci index c2586cf7b2b..99777918344 100644 --- a/mithril-aggregator/Dockerfile.ci +++ b/mithril-aggregator/Dockerfile.ci @@ -14,7 +14,7 @@ RUN mkdir -p /app/bin RUN apt-get update -y && apt-get install -y libssl-dev ca-certificates wget && apt-get clean && rm -rf /var/lib/apt/lists/* # Install cardano-cli -ARG CARDANO_NODE_VERSION=9.1.0 +ARG CARDANO_NODE_VERSION=9.2.1 ARG CARDANO_BIN_URL=https://github.com/input-output-hk/cardano-node/releases/download/$CARDANO_NODE_VERSION/cardano-node-$CARDANO_NODE_VERSION-linux.tar.gz ARG EMBED-CARDANO-CLI=0 RUN if [ "$EMBED-CARDANO-CLI" = 1 ] ; then \ diff --git a/mithril-signer/Dockerfile b/mithril-signer/Dockerfile index 40c5cb1a926..76531ef488a 100644 --- a/mithril-signer/Dockerfile +++ b/mithril-signer/Dockerfile @@ -33,7 +33,7 @@ RUN /app/target/release/mithril-signer --version FROM debian:11-slim # Args -ARG CARDANO_NODE_VERSION=9.1.0 +ARG CARDANO_NODE_VERSION=9.2.1 ARG CARDANO_BIN_URL=https://github.com/input-output-hk/cardano-node/releases/download/$CARDANO_NODE_VERSION/cardano-node-$CARDANO_NODE_VERSION-linux.tar.gz ARG EMBED-CARDANO-CLI=0 diff --git a/mithril-signer/Dockerfile.ci b/mithril-signer/Dockerfile.ci index 7fcc25e7ad6..ea2ac6cea75 100644 --- a/mithril-signer/Dockerfile.ci +++ b/mithril-signer/Dockerfile.ci @@ -14,7 +14,7 @@ RUN mkdir -p /app/bin RUN apt-get update -y && apt-get install -y libssl-dev ca-certificates wget && apt-get clean && rm -rf /var/lib/apt/lists/* # Install cardano-cli -ARG CARDANO_NODE_VERSION=9.1.0 +ARG CARDANO_NODE_VERSION=9.2.1 ARG CARDANO_BIN_URL=https://github.com/input-output-hk/cardano-node/releases/download/$CARDANO_NODE_VERSION/cardano-node-$CARDANO_NODE_VERSION-linux.tar.gz ARG EMBED-CARDANO-CLI=0 # Install cardano-cli From 90c8398f651f3754d7a8637f238b538f2b2b2f2f Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Mon, 30 Sep 2024 17:00:28 +0200 Subject: [PATCH 152/274] chore: update default devnet and e2e test Cardano node version to '9.2.1' --- mithril-test-lab/mithril-devnet/mkfiles/mkfiles-init.sh | 2 +- mithril-test-lab/mithril-end-to-end/src/main.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mithril-test-lab/mithril-devnet/mkfiles/mkfiles-init.sh b/mithril-test-lab/mithril-devnet/mkfiles/mkfiles-init.sh index 8292535acb1..37c439a29b4 100644 --- a/mithril-test-lab/mithril-devnet/mkfiles/mkfiles-init.sh +++ b/mithril-test-lab/mithril-devnet/mkfiles/mkfiles-init.sh @@ -9,7 +9,7 @@ esac # Cardano node version if [ -z "${CARDANO_NODE_VERSION}" ]; then - CARDANO_NODE_VERSION="9.1.0" + CARDANO_NODE_VERSION="9.2.1" fi if [ -z "${CARDANO_NODE_VERSION_RELEASE}" ]; then CARDANO_NODE_VERSION_RELEASE=$(echo "${CARDANO_NODE_VERSION}" | cut -d'-' -f1) diff --git a/mithril-test-lab/mithril-end-to-end/src/main.rs b/mithril-test-lab/mithril-end-to-end/src/main.rs index 3c3048c1141..3fe390ece78 100644 --- a/mithril-test-lab/mithril-end-to-end/src/main.rs +++ b/mithril-test-lab/mithril-end-to-end/src/main.rs @@ -57,7 +57,7 @@ pub struct Args { cardano_epoch_length: f64, /// Cardano node version - #[clap(long, default_value = "9.1.1")] + #[clap(long, default_value = "9.2.1")] cardano_node_version: String, /// Epoch at which hard fork to the latest Cardano era will be made (starts with the latest era by default) From f7a02e1efc59a88ab66887d51f5c0a1b78a46bd0 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Mon, 30 Sep 2024 17:03:03 +0200 Subject: [PATCH 153/274] docs: update Cardano node version to '9.2.1' in examples --- .../root/manual/getting-started/bootstrap-cardano-node.md | 8 ++++---- .../root/manual/getting-started/run-mithril-devnet.md | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/website/root/manual/getting-started/bootstrap-cardano-node.md b/docs/website/root/manual/getting-started/bootstrap-cardano-node.md index 97408f508e3..7b8561e1276 100644 --- a/docs/website/root/manual/getting-started/bootstrap-cardano-node.md +++ b/docs/website/root/manual/getting-started/bootstrap-cardano-node.md @@ -436,7 +436,7 @@ You will see more information about the snapshot: +-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Size | 2323485648 | +-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| Cardano node version | 9.1.0 | +| Cardano node version | 9.2.1 | +-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Location | https://storage.googleapis.com/cdn.aggregator.testing-preview.api.mithril.network/preview-e539-i10787.db5f50a060d4b813125c4263b700ecc96e5d8c8710f0430e5c80d2f0fa79b667.tar.zst | +-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ @@ -464,11 +464,11 @@ You will see that the selected snapshot archive has been downloaded locally, unp 5/5 - Verifying the cardano db signature… Cardano db 'db5f50a060d4b813125c4263b700ecc96e5d8c8710f0430e5c80d2f0fa79b667' has been unpacked and successfully checked against Mithril multi-signature contained in the certificate. - Files in the directory '/home/mithril/data/testnet/db5f50a060d4b813125c4263b700ecc96e5d8c8710f0430e5c80d2f0fa79b667/db' can be used to run a Cardano node with version >= 9.1.0. + Files in the directory '/home/mithril/data/testnet/db5f50a060d4b813125c4263b700ecc96e5d8c8710f0430e5c80d2f0fa79b667/db' can be used to run a Cardano node with version >= 9.2.1. If you are using Cardano Docker image, you can restore a Cardano Node with: - docker run -v cardano-node-ipc:/ipc -v cardano-node-data:/data --mount type=bind,source="/home/mithril/data/testnet/db5f50a060d4b813125c4263b700ecc96e5d8c8710f0430e5c80d2f0fa79b667/db",target=/data/db/ -e NETWORK=preview ghcr.io/intersectmbo/cardano-node:9.1.0 + docker run -v cardano-node-ipc:/ipc -v cardano-node-data:/data --mount type=bind,source="/home/mithril/data/testnet/db5f50a060d4b813125c4263b700ecc96e5d8c8710f0430e5c80d2f0fa79b667/db",target=/data/db/ -e NETWORK=preview ghcr.io/intersectmbo/cardano-node:9.2.1 ``` ### Step 5: Launch a Cardano node from the restored Cardano DB snapshot @@ -476,7 +476,7 @@ Cardano db 'db5f50a060d4b813125c4263b700ecc96e5d8c8710f0430e5c80d2f0fa79b667' ha Launch an empty Cardano node and make it live in minutes! ```bash -docker run -v cardano-node-ipc:/ipc -v cardano-node-data:/data --mount type=bind,source="$(pwd)/data/testnet/$SNAPSHOT_DIGEST/db",target=/data/db/ -e NETWORK=$CARDANO_NETWORK ghcr.io/intersectmbo/cardano-node:9.1.0 +docker run -v cardano-node-ipc:/ipc -v cardano-node-data:/data --mount type=bind,source="$(pwd)/data/testnet/$SNAPSHOT_DIGEST/db",target=/data/db/ -e NETWORK=$CARDANO_NETWORK ghcr.io/intersectmbo/cardano-node:9.2.1 ``` You will see the Cardano node start by validating the files ingested from the snapshot archive. Then, it will synchronize with the other network nodes and start adding blocks: diff --git a/docs/website/root/manual/getting-started/run-mithril-devnet.md b/docs/website/root/manual/getting-started/run-mithril-devnet.md index 23569affd2a..5df8c983a70 100644 --- a/docs/website/root/manual/getting-started/run-mithril-devnet.md +++ b/docs/website/root/manual/getting-started/run-mithril-devnet.md @@ -486,7 +486,7 @@ You will see more information about the snapshot: +-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Size | 2323485648 | +-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| Cardano node version | 9.1.0 | +| Cardano node version | 9.2.1 | +-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Location | https://storage.googleapis.com/cdn.aggregator.testing-preview.api.mithril.network/preview-e539-i10787.db5f50a060d4b813125c4263b700ecc96e5d8c8710f0430e5c80d2f0fa79b667.tar.zst | +-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ @@ -514,9 +514,9 @@ You will see that the certificate chain is validated to ensure the issued certif 5/5 - Verifying the cardano db signature… Cardano db 'db5f50a060d4b813125c4263b700ecc96e5d8c8710f0430e5c80d2f0fa79b667' has been unpacked and successfully checked against Mithril multi-signature contained in the certificate. - Files in the directory '/home/mithril/data/testnet/db5f50a060d4b813125c4263b700ecc96e5d8c8710f0430e5c80d2f0fa79b667/db' can be used to run a Cardano node with version >= 9.1.0. + Files in the directory '/home/mithril/data/testnet/db5f50a060d4b813125c4263b700ecc96e5d8c8710f0430e5c80d2f0fa79b667/db' can be used to run a Cardano node with version >= 9.2.1. If you are using Cardano Docker image, you can restore a Cardano Node with: - docker run -v cardano-node-ipc:/ipc -v cardano-node-data:/data --mount type=bind,source="/home/mithril/data/testnet/db5f50a060d4b813125c4263b700ecc96e5d8c8710f0430e5c80d2f0fa79b667/db",target=/data/db/ -e NETWORK=preview ghcr.io/intersectmbo/cardano-node:9.1.0 + docker run -v cardano-node-ipc:/ipc -v cardano-node-data:/data --mount type=bind,source="/home/mithril/data/testnet/db5f50a060d4b813125c4263b700ecc96e5d8c8710f0430e5c80d2f0fa79b667/db",target=/data/db/ -e NETWORK=preview ghcr.io/intersectmbo/cardano-node:9.2.1 ``` From 959b994ed8c74c6e7bf2a96492ad502ec50cbbf7 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Mon, 30 Sep 2024 17:04:32 +0200 Subject: [PATCH 154/274] feat: activate Cardano node version '9.2' in e2e test in CI --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 31c60799820..8be8774dd56 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -289,9 +289,9 @@ jobs: matrix: mode: ["std"] era: ${{ fromJSON(needs.build-ubuntu-X64.outputs.eras) }} - cardano_node_version: ["9.0.0", "9.1.0", "9.1.1"] + cardano_node_version: ["9.0.0", "9.1.0", "9.1.1", "9.2.0", "9.2.1"] hard_fork_latest_era_at_epoch: [0] - run_id: ["#1", "#2"] + run_id: ["#1"] extra_args: [""] include: From 586c892ab0eaf4da2a8e96fcd965d61d5bd7701f Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Mon, 30 Sep 2024 18:23:06 +0200 Subject: [PATCH 155/274] fix: allow more attempts to transfer funds and write datums for era in e2e test Updated from '3' to '10' attempts. --- .../mithril-devnet/mkfiles/mkfiles-mithril-era.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mithril-test-lab/mithril-devnet/mkfiles/mkfiles-mithril-era.sh b/mithril-test-lab/mithril-devnet/mkfiles/mkfiles-mithril-era.sh index 4425249c70d..31064213c18 100644 --- a/mithril-test-lab/mithril-devnet/mkfiles/mkfiles-mithril-era.sh +++ b/mithril-test-lab/mithril-devnet/mkfiles/mkfiles-mithril-era.sh @@ -113,7 +113,7 @@ function send_funds_to_era_address { # Try to send funds to Mithril era address function try_send_funds_to_era_address { - SEND_FUNDS_ERA_ADDRESS_WAIT_ROUNDS_MAX=3 + SEND_FUNDS_ERA_ADDRESS_WAIT_ROUNDS_MAX=10 SEND_FUNDS_ERA_ADDRESS_WAIT_ROUNDS=1 SEND_FUNDS_ERA_ADDRESS_WAIT_ROUND_DELAY=2 while true @@ -184,7 +184,7 @@ function write_datums_for_era_address { # Try to write datums for Mithril era address function try_write_datums_for_era_address { - WRITE_DATUMS_ERA_ADDRESS_WAIT_ROUNDS_MAX=3 + WRITE_DATUMS_ERA_ADDRESS_WAIT_ROUNDS_MAX=10 WRITE_DATUMS_ERA_ADDRESS_WAIT_ROUNDS=1 WRITE_DATUMS_ERA_ADDRESS_WAIT_ROUND_DELAY=2 while true From f708cbb0b0e563a8c12cb640fec5ee397bd4a1dd Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Tue, 1 Oct 2024 19:02:50 +0200 Subject: [PATCH 156/274] perf: fine tune Cardano network on the devnet in e2e --- mithril-test-lab/mithril-end-to-end/src/main.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mithril-test-lab/mithril-end-to-end/src/main.rs b/mithril-test-lab/mithril-end-to-end/src/main.rs index 3fe390ece78..b77cb4f309b 100644 --- a/mithril-test-lab/mithril-end-to-end/src/main.rs +++ b/mithril-test-lab/mithril-end-to-end/src/main.rs @@ -49,11 +49,11 @@ pub struct Args { number_of_pool_nodes: u8, /// Length of a Cardano slot in the devnet (in s) - #[clap(long, default_value_t = 0.08)] + #[clap(long, default_value_t = 0.10)] cardano_slot_length: f64, /// Length of a Cardano epoch in the devnet (in s) - #[clap(long, default_value_t = 35.0)] + #[clap(long, default_value_t = 30.0)] cardano_epoch_length: f64, /// Cardano node version From e75550ce35bdc15e59ceee448403bd75b3abc80e Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Mon, 30 Sep 2024 17:06:58 +0200 Subject: [PATCH 157/274] docs: update CHANGELOG --- CHANGELOG.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ef26bd0776f..f63cefe1de7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,10 +21,12 @@ As a minor extension, we have adopted a slightly different versioning convention - Refactor the builder of the protocol messages, and add support for protocol parameters and epoch parts. -- Signer compute what to sign independently of the aggregator. +- Signer computes what to sign independently of the aggregator. - Deprecate aggregator `/certificate-pending` route as the signer does not need it anymore. +- Support for `Cardano node` `9.2.1` in the signer and the aggregator. + - Crates versions: | Crate | Version | From 1e5d3834b3431cc953a672f670f17bfa65e9270a Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Thu, 3 Oct 2024 11:15:22 +0200 Subject: [PATCH 158/274] chore: bump crates versions - 'mithril-aggregator' from '0.5.73' to '0.5.74' - 'mithril-infra' from '0.3.'0' to '0.3.1' - 'mithril-signer' from '0.2.191' to '0.2.192' - 'mithril-devnet' from '0.4.0' to '0.4.1' - 'mithril-end-to-end' from '0.4.33' to '0.4.34'. --- Cargo.lock | 6 +++--- mithril-aggregator/Cargo.toml | 2 +- mithril-infra/assets/infra.version | 2 +- mithril-signer/Cargo.toml | 2 +- mithril-test-lab/mithril-devnet/VERSION | 2 +- mithril-test-lab/mithril-end-to-end/Cargo.toml | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d58310f02fb..96bfebef2cc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3403,7 +3403,7 @@ dependencies = [ [[package]] name = "mithril-aggregator" -version = "0.5.73" +version = "0.5.74" dependencies = [ "anyhow", "async-trait", @@ -3630,7 +3630,7 @@ dependencies = [ [[package]] name = "mithril-end-to-end" -version = "0.4.33" +version = "0.4.34" dependencies = [ "anyhow", "async-recursion", @@ -3703,7 +3703,7 @@ dependencies = [ [[package]] name = "mithril-signer" -version = "0.2.191" +version = "0.2.192" dependencies = [ "anyhow", "async-trait", diff --git a/mithril-aggregator/Cargo.toml b/mithril-aggregator/Cargo.toml index 9631a64e071..e251bd15207 100644 --- a/mithril-aggregator/Cargo.toml +++ b/mithril-aggregator/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-aggregator" -version = "0.5.73" +version = "0.5.74" description = "A Mithril Aggregator server" authors = { workspace = true } edition = { workspace = true } diff --git a/mithril-infra/assets/infra.version b/mithril-infra/assets/infra.version index 0d91a54c7d4..9e11b32fcaa 100644 --- a/mithril-infra/assets/infra.version +++ b/mithril-infra/assets/infra.version @@ -1 +1 @@ -0.3.0 +0.3.1 diff --git a/mithril-signer/Cargo.toml b/mithril-signer/Cargo.toml index 856d03b0200..dfab7c10f28 100644 --- a/mithril-signer/Cargo.toml +++ b/mithril-signer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-signer" -version = "0.2.191" +version = "0.2.192" description = "A Mithril Signer" authors = { workspace = true } edition = { workspace = true } diff --git a/mithril-test-lab/mithril-devnet/VERSION b/mithril-test-lab/mithril-devnet/VERSION index 1d0ba9ea182..267577d47e4 100644 --- a/mithril-test-lab/mithril-devnet/VERSION +++ b/mithril-test-lab/mithril-devnet/VERSION @@ -1 +1 @@ -0.4.0 +0.4.1 diff --git a/mithril-test-lab/mithril-end-to-end/Cargo.toml b/mithril-test-lab/mithril-end-to-end/Cargo.toml index ad558c6baa2..02571887bcf 100644 --- a/mithril-test-lab/mithril-end-to-end/Cargo.toml +++ b/mithril-test-lab/mithril-end-to-end/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-end-to-end" -version = "0.4.33" +version = "0.4.34" authors = { workspace = true } edition = { workspace = true } documentation = { workspace = true } From 42b7b313e173deb57476d0f8c83cedad872a5db4 Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Thu, 3 Oct 2024 17:37:45 +0200 Subject: [PATCH 159/274] fix: signer register-signature won't fail if already certified Else this prevent the signer state machine to mark the beacon as signed, making it stay at that beacon until an epoch change. --- .../src/services/aggregator_client.rs | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/mithril-signer/src/services/aggregator_client.rs b/mithril-signer/src/services/aggregator_client.rs index 3d88c2b1f75..a0f75666c4b 100644 --- a/mithril-signer/src/services/aggregator_client.rs +++ b/mithril-signer/src/services/aggregator_client.rs @@ -260,6 +260,10 @@ impl AggregatorClient for AggregatorHTTPClient { match response { Ok(response) => match response.status() { StatusCode::CREATED => Ok(()), + StatusCode::GONE => { + debug!("Aggregator already certified that message"; "signed_entity_type" => ?signed_entity_type); + Ok(()) + } StatusCode::PRECONDITION_FAILED => Err(self.handle_api_error(&response)), StatusCode::BAD_REQUEST => Err(AggregatorClientError::RemoteServerLogical( anyhow!("bad request: {}", response.text().await.unwrap_or_default()), @@ -844,6 +848,36 @@ mod tests { }; } + #[tokio::test] + async fn test_register_signatures_ok_410() { + let single_signatures = fake_data::single_signatures((1..5).collect()); + let (server, config, api_version_provider) = setup_test(); + let _snapshots_mock = server.mock(|when, then| { + when.method(POST).path("/register-signatures"); + then.status(410).body( + serde_json::to_vec(&ClientError::new( + "already_aggregated".to_string(), + "too late".to_string(), + )) + .unwrap(), + ); + }); + let certificate_handler = AggregatorHTTPClient::new( + config.aggregator_endpoint, + config.relay_endpoint, + Arc::new(api_version_provider), + None, + ); + certificate_handler + .register_signatures( + &SignedEntityType::dummy(), + &single_signatures, + &ProtocolMessage::default(), + ) + .await + .expect("Should not fail when status is 410 (GONE)"); + } + #[tokio::test] async fn test_register_signatures_ko_409() { let single_signatures = fake_data::single_signatures((1..5).collect()); From c6c410f97e67d4c3521839e22756d15e7c1b83b8 Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Thu, 3 Oct 2024 17:49:05 +0200 Subject: [PATCH 160/274] test: fix incorrectly named mock in signer `aggregator_client` --- .../src/services/aggregator_client.rs | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/mithril-signer/src/services/aggregator_client.rs b/mithril-signer/src/services/aggregator_client.rs index a0f75666c4b..e0d2fda1ba8 100644 --- a/mithril-signer/src/services/aggregator_client.rs +++ b/mithril-signer/src/services/aggregator_client.rs @@ -534,7 +534,7 @@ mod tests { async fn test_epoch_settings_ok_200() { let (server, config, api_version_provider) = setup_test(); let epoch_settings_expected = EpochSettingsMessage::dummy(); - let _snapshots_mock = server.mock(|when, then| { + let _server_mock = server.mock(|when, then| { when.path("/epoch-settings"); then.status(200) .body(json!(epoch_settings_expected).to_string()); @@ -556,7 +556,7 @@ mod tests { #[tokio::test] async fn test_epoch_settings_ko_412() { let (server, config, api_version_provider) = setup_test(); - let _snapshots_mock = server.mock(|when, then| { + let _server_mock = server.mock(|when, then| { when.path("/epoch-settings"); then.status(412) .header(MITHRIL_API_VERSION_HEADER, "0.0.999"); @@ -578,7 +578,7 @@ mod tests { #[tokio::test] async fn test_epoch_settings_ko_500() { let (server, config, api_version_provider) = setup_test(); - let _snapshots_mock = server.mock(|when, then| { + let _server_mock = server.mock(|when, then| { when.path("/epoch-settings"); then.status(500).body("an error occurred"); }); @@ -602,7 +602,7 @@ mod tests { #[tokio::test] async fn test_epoch_settings_timeout() { let (server, config, api_version_provider) = setup_test(); - let _snapshots_mock = server.mock(|when, then| { + let _server_mock = server.mock(|when, then| { when.path("/epoch-settings"); then.delay(Duration::from_millis(200)); }); @@ -630,7 +630,7 @@ mod tests { let single_signers = fake_data::signers(1); let single_signer = single_signers.first().unwrap(); let (server, config, api_version_provider) = setup_test(); - let _snapshots_mock = server.mock(|when, then| { + let _server_mock = server.mock(|when, then| { when.method(POST).path("/register-signer"); then.status(201); }); @@ -650,7 +650,7 @@ mod tests { async fn test_register_signer_ko_412() { let epoch = Epoch(1); let (server, config, api_version_provider) = setup_test(); - let _snapshots_mock = server.mock(|when, then| { + let _server_mock = server.mock(|when, then| { when.method(POST).path("/register-signer"); then.status(412) .header(MITHRIL_API_VERSION_HEADER, "0.0.999"); @@ -677,7 +677,7 @@ mod tests { let single_signers = fake_data::signers(1); let single_signer = single_signers.first().unwrap(); let (server, config, api_version_provider) = setup_test(); - let _snapshots_mock = server.mock(|when, then| { + let _server_mock = server.mock(|when, then| { when.method(POST).path("/register-signer"); then.status(400).body( serde_json::to_vec(&ClientError::new( @@ -714,7 +714,7 @@ mod tests { let single_signers = fake_data::signers(1); let single_signer = single_signers.first().unwrap(); let (server, config, api_version_provider) = setup_test(); - let _snapshots_mock = server.mock(|when, then| { + let _server_mock = server.mock(|when, then| { when.method(POST).path("/register-signer"); then.status(500).body("an error occurred"); }); @@ -741,7 +741,7 @@ mod tests { let single_signers = fake_data::signers(1); let single_signer = single_signers.first().unwrap(); let (server, config, api_version_provider) = setup_test(); - let _snapshots_mock = server.mock(|when, then| { + let _server_mock = server.mock(|when, then| { when.method(POST).path("/register-signer"); then.delay(Duration::from_millis(200)); }); @@ -767,7 +767,7 @@ mod tests { async fn test_register_signatures_ok_201() { let single_signatures = fake_data::single_signatures((1..5).collect()); let (server, config, api_version_provider) = setup_test(); - let _snapshots_mock = server.mock(|when, then| { + let _server_mock = server.mock(|when, then| { when.method(POST).path("/register-signatures"); then.status(201); }); @@ -790,7 +790,7 @@ mod tests { #[tokio::test] async fn test_register_signatures_ko_412() { let (server, config, api_version_provider) = setup_test(); - let _snapshots_mock = server.mock(|when, then| { + let _server_mock = server.mock(|when, then| { when.method(POST).path("/register-signatures"); then.status(412) .header(MITHRIL_API_VERSION_HEADER, "0.0.999"); @@ -818,7 +818,7 @@ mod tests { async fn test_register_signatures_ko_400() { let single_signatures = fake_data::single_signatures((1..5).collect()); let (server, config, api_version_provider) = setup_test(); - let _snapshots_mock = server.mock(|when, then| { + let _server_mock = server.mock(|when, then| { when.method(POST).path("/register-signatures"); then.status(400).body( serde_json::to_vec(&ClientError::new( @@ -852,7 +852,7 @@ mod tests { async fn test_register_signatures_ok_410() { let single_signatures = fake_data::single_signatures((1..5).collect()); let (server, config, api_version_provider) = setup_test(); - let _snapshots_mock = server.mock(|when, then| { + let _server_mock = server.mock(|when, then| { when.method(POST).path("/register-signatures"); then.status(410).body( serde_json::to_vec(&ClientError::new( @@ -882,7 +882,7 @@ mod tests { async fn test_register_signatures_ko_409() { let single_signatures = fake_data::single_signatures((1..5).collect()); let (server, config, api_version_provider) = setup_test(); - let _snapshots_mock = server.mock(|when, then| { + let _server_mock = server.mock(|when, then| { when.method(POST).path("/register-signatures"); then.status(409); }); @@ -910,7 +910,7 @@ mod tests { async fn test_register_signatures_ko_500() { let single_signatures = fake_data::single_signatures((1..5).collect()); let (server, config, api_version_provider) = setup_test(); - let _snapshots_mock = server.mock(|when, then| { + let _server_mock = server.mock(|when, then| { when.method(POST).path("/register-signatures"); then.status(500).body("an error occurred"); }); @@ -938,7 +938,7 @@ mod tests { async fn test_register_signatures_timeout() { let single_signatures = fake_data::single_signatures((1..5).collect()); let (server, config, api_version_provider) = setup_test(); - let _snapshots_mock = server.mock(|when, then| { + let _server_mock = server.mock(|when, then| { when.method(POST).path("/register-signatures"); then.delay(Duration::from_millis(200)); }); From 995914935b1a4d1a2ba9fe6978e77d859a4dbf9a Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Thu, 3 Oct 2024 17:42:00 +0200 Subject: [PATCH 161/274] chore: bump crates versions * Mithril-signer from `0.2.192` to `0.2.193` --- Cargo.lock | 2 +- mithril-signer/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 96bfebef2cc..c77995b9f87 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3703,7 +3703,7 @@ dependencies = [ [[package]] name = "mithril-signer" -version = "0.2.192" +version = "0.2.193" dependencies = [ "anyhow", "async-trait", diff --git a/mithril-signer/Cargo.toml b/mithril-signer/Cargo.toml index dfab7c10f28..743cf96f446 100644 --- a/mithril-signer/Cargo.toml +++ b/mithril-signer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-signer" -version = "0.2.192" +version = "0.2.193" description = "A Mithril Signer" authors = { workspace = true } edition = { workspace = true } From 255d899236df40f3e571b5ccdaae32974c9faac1 Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Wed, 2 Oct 2024 18:46:04 +0200 Subject: [PATCH 162/274] docs: update since signers now compute what to sign independently --- .../mithril/mithril-network/aggregator.md | 6 ++---- .../mithril-network/images/signer-runtime.jpg | Bin 75721 -> 92800 bytes .../root/mithril/mithril-network/signer.md | 1 - docs/website/root/mithril/threat-model.md | 4 +--- 4 files changed, 3 insertions(+), 8 deletions(-) diff --git a/docs/website/root/mithril/mithril-network/aggregator.md b/docs/website/root/mithril/mithril-network/aggregator.md index 15c753961bc..11cfc05c94a 100644 --- a/docs/website/root/mithril/mithril-network/aggregator.md +++ b/docs/website/root/mithril/mithril-network/aggregator.md @@ -23,11 +23,9 @@ A **Mithril aggregator** is a trustless node responsible for coordinating the ac The primary objective of the Mithril aggregator is to coordinate and synchronize the production of Mithril multi-signatures: -- When a new snapshot is ready to be produced (and certified), the Mithril aggregator generates and broadcasts a fresh **beacon** to inform Mithril signers of the specific time reference to employ in computing the message (or digest) for signing +- It is responsible for broadcasting the **verification keys** (Mithril public keys) of all the registered Mithril signers -- It is also responsible for advertising the **verification keys** (Mithril public keys) of all the registered Mithril signers - -- The beacon, the current protocol parameters, and the available verification keys are compiled and shared in a **pending certificate** +- The current protocol parameters and the available verification keys are compiled and shared in an **epoch settings** data - Mithril signers can register with it to participate in the signature process later on. diff --git a/docs/website/root/mithril/mithril-network/images/signer-runtime.jpg b/docs/website/root/mithril/mithril-network/images/signer-runtime.jpg index c198b3638944b9bf7954a9e4a4921a0402fdd8f3..9a0c6eaaa43024297ae15259f4edf4b373948938 100644 GIT binary patch literal 92800 zcmdqI2UJ_hk^m|jgGfWpV2=qV4+tSL9z+z$M43F}fI%daL4dFc5|Rie zNCXia$k8A~5D08?5;H5XXH<)i+XFkEN{~_emADj$l&Yv(|zjWc!$j^6>8&Y!h9 z?Z|M732>U}6a&+#<3<4YiIS%oPMsvcw{-6O8OE~=r%zotAv<0NoK$?GI^)HwSI?bg zWMBlGI?ZrGKgV?b#vNw)o4gYD{V%Yv8bSP0$}0%B_$1{_&3=8JnEbwv+|R}?E&H=E z$jjR|skC=e%I^30)H2Fl6R6MAMwtid@Mi)J32*o{!S*NhaGlhDit#%o0D!Z9tLWVM z6Y9@QCsc-0jAzcCJAdlTiMl79dzyji4C9SE68Fy<{p!WcEBSkT>A9Q6Z{GK=vPen) z46^h7@{}*3Z0$kLt-F06j;VmlCtRnQ7?=QRfTOf;P5u8W)G%jds(OJs23W@omDb`# z@PvL*?hm?Gs>?xrCOJNetX+JQaTPH4&Vgz$Zc1Yq0#(TpU0lmB=_IVc3g>58VG$|U zmXe;0+8Q4NSbIY&oDMVaN11Pr$bDhP*M^18Rn_MoiRT9;iE|8Mc`7zyneWTJnqHl^Z_M00+i|Kbg^{F$3*XGby^fXLeBbT!iWs!~< z{d(}0E=iXcU=4rd1eoBXXucrgd!vId6+gD%55yf(z@Q%37n8bMDCv)AQLF!9W5Dz? z``r_$oysEz!3?Qg-Oz_u`;R1NGwS82-z0Kv=Z1KC#|7X+@62!>18VT?p?Wo8<3_VQ z(&c##7PV5n2k^FB<@E-bO^jCg)k4DKZ=8P(o`O^`FDfB|#>V%OP;Nb6ME8DB0_}F7 z+=(FUkQfWUmAS@V#ijdK_%(FuFIWxbVw2Z?p7yc8mS^9Ls0+5Srj@y&gKF@mKJ$WX zE#n_l^@A)dE7#^G6?$mRp`J>yxX%MM2%KU@k$UpY(CcL%^*yi!@i(r1Bo3EqPQ%4t zyu)`iXyMRvgYG&6Q*3%9%6wj`gMIq;PeqElltw)*Wxt5oOrPuv?xj|^HssL!y0Skk zy=cp&>r8oXmtL8idv9x7+MqC)g@v2go@Hdx0i(+mAm*l3nR#TDi1<>gUR(LK$UWI+ z&7c10m{UD4xq+P@caW76w|{Loz|~@=IxvS@x4kxW6?M1pA60lNgOO4_!rS?C{Xsu1 zbU^-EZ~j@DCFs6tc@?IPehf(0p6NWgF`mFcP>Zgf`P$)|k|EZ%AWo^&fofDxtuoqarM*M3y4>T(h)K>-pK&H0 ze-110`&lms$}n@yuFoHT^hduC$lHhhig)MabT7A4?5NnWILbBS+yOw<20M?{qx7tW563_%@)M2?Tf%JcXZ|UVYZ;_P~(8l`f@F4 zeTBG4JOazPjcl6ES7uJ|s$LNuRFP>fhO(z;M|s#o|JLIF>%r==JMR3g>wTy(TXpR! zGex^E(>#wBN`&?#=Z^s)TA9Ip-3f=V)gCSSxIpwq`yn<^=60uI8RgwK&c6m3Z9W+m zE(@&$h0PcTl&d|jocfJ!I4KrDnhbgU4@v*84K|1#47hnHB&{Z&V`-!1gbDjyp?fC3 zwoj%V3(^*7>nQ{JG#4ajHkgcoT~nZ?TPe%KQCv98%K8J@ZUh}qv7Obog(J0;41PS( zT%s7FmECXap5f1rKZN7o1>Y!@rNJvs~I72HUnm>99+ye^XU2IbLGVv-r=UZe%m z+{Ko}nL^kSfsLLLh|~YtnhcA<*ls_>s4i3bsF|Kl9UD_~)L}(@Y1U}Kk=4lA@hxxD zyicpc88xhau=;sB==MRO-+LCd^gv`{<>s1d=izvUhmu-B+IH^B*EDcoiQyyHY}99k zdOohOd6ay>4Qh_MSRoM%#;ZR;)&&=gTaM47M`0i8w$86iV*6;L?dpv+BO*JD3~;R{&cVhV(>j0KeBhS()i{qXiRyyr-Ij^i zMcK<>rG1x{=j%HXA~h{&csqgcG3^&4YqNp`YO#mKrRQQt!t+j=I+P>-tVIi&%5E1+ z%jD`~u{pn6f-Jpi^1GzleX0iJtlEf-4NtPCr;h{vC0{UwF45wkV~O^1S#2RDC<0;6 zvH18gve3j#^5PB$z+~VMi)JY^Cg|y{`?MOY{C${0uz1`D)bEIz%C7 z&0-}=I7B187;!1{-qEP-g<*@1Ml49n)65n4gXhz}b>jKd6lojZxQazeyH?4fILt{7 z_^{Bqa6b3eyyY#4_|nqm=F(_&SBw5(Cg#?NaJtH(1h*n1`okr#^RVPgb&*9GYmKa*uzbdKI2u(kB75AS;! zN3ynk1I0q@HWA#{Iy>U&=5~$N-=~DRv;vWHlbX;t`0WN{ql@?e{_5v`jY^U4e&&7yKR zj|T0kUM&!h?Up_4ja8?R1asF1@k>^+!o5fDsxAV>4&-?9)oo|h9ow_L)D12~liWPd zeRw-GAoAc^nc2|HI^LbQi;cIWyK{mt>dYoR7ZQXbG8@%=Y{%RW#@b5|UK-$y{!hzV z=!Q===q^Q7AXR(b_V8#77 z<>OvBfaGLEg*UlHLUSuY8rlX;-qn^j-8BhvHuy4LKjU(ROe|Bx$DeXu|M^z^b);{m zp>|}aF4^|xXW?1wo6$J^us42t1BI6q|GKPy;b76FFitRlcOR1vG+mxe5-kT*e33bA zq2cvHK{{}K)n|Gz#e_0-k8^Zn+qDCBq&^$b1 z&4qE+Mj(+_jf28{@<$npxZPN=n@*P8=(YK`|5EK=$}(8O+q^o%$}JC%M%?LPy}J%p zk2j71a*F8Bt|1AVlQag-ude520o%IdIN!^jYlS?S48!6EDxV}8n%{;#zGh!1zjLqo z7{Kv<@116*_K0+)b%m06-$L{XtM5*RPv47`8j!ey`RzVX9g8j5g`>NE;PbuE{O&t1 zoX4+`ZOfujZ60k>!qJ3e-z~^_DDvVH@UKthWWX${XsxXyBS6(rTcFqS?=eR*&o+Jw z;-7D+IV-n2aIO2)QYz;59NYM$nVS5$GMmhx*U+$-M_)fn(G@&|!_qgmMUWKl6zQ2D zAz^5Gm!Z264i|B@|1WjTcZDw|qS??gC}=#)-_`DQgMENbn>EDRJ3ltZRCC^@6r@=K zTYtdJQs~NA=0@A5flVFCDopwG_5DE1QZ3OAm#H<2#{hF20+tr><-_A8l^EZ}rE^?g z!RKbOcyL1pOsg;D76aoJz-x&^g9i2Qyn32`33c8tiYw(guUc7flyA%a9ZTHbIG+6v z8RDhM21c@a44mqQ#{k%~4K0dWNW|{_tvanO;BMQJE5`Pb{Om-5nskV1%TU~N9?SkP z% z7>kVyL?C0SObzZ{%;)TozYD8iI07w9qND+ci_;|03mNI8zx*qnX}GxG=DP$`MspGNuy{e{xfCZ%}J zM}D<{SqFYtSP;hY<<;bC)UVk(A_X6CC{^S?MLTtl^AsBD2vJ)C!1Q4w5)dsvNKH>` zTuqOAt~cB9{7Zr_s~xWom!06G1lz_WyUPy~aSYg&AIr={c3wQKpI)@m3+`vaxPCsY zUzA!f&h{|K@ULw>1~6H~&e_FaVa|vN!RSehf50qH*fWtOe6Q6=dMp#FZg)ERaI~sY zjyve1=-{QTOY>qkDsShN;8Bh>=~$!B`rv}t^W#zu@m;3XwXNL-j@1fe2T5=VL65?g zZ7N8@D0_8&m6&KT=pmVa6yhwP4J9J0E#ujz8?2W4Q@$eUx-X}aH_ea@gY5I^4+#&(yD!^esb-=YX7ItQw(7|2`(WT~;LC2WZh{d?e&4N5DqV6_Nzxcsn zoFlm9QcABbJQ1motDZ5)YEq-wnu(IsBqVdE##?ri@Rim}S&Ud5uyaPP;lOD+{lo4c z4dIxnDF{CX6staot_}HZjq2FTpZH^|`_;<+CUd<7NMAKyRz>Lfom_|C>0=Lxkj-JM z%(iwMiM()AQx2Baayx5ik-1v|fADj4_o0Nsm%#=V0R=-r%E-M^r6zYOI*76jbgh8M zDuye3SrVEmiRr|ph&dJIgG+Lag4|7X{%5H#? zhR7>g!SZ%A^3XMe(N914I$1HfSArtM>d7H%##4TKu6ocxLra@C2R#>Qhy}4|m{24l z)8_}-XSuzSL+h-_(iA-dJH8UV$)wG0)ytiH+9GB$ZDL84QBB>>k5DNwV$7N|M)#%L zq)QuzChgp2bHU)z?lp^yr5D@MNoM#!0Vk4*ltSj?7pYsx;~0NCzQW03J|>hTy$fA% zPUWAAtnj}tvJ%CzclrZbx-H9G|Jq1i^Ls64ZBpS(6h`&g@3~L7*g5dWD@y`>5pr#OGg;Z%b~2?T-&u%9hWD~X zwZw0KWkx%{zZ25B=!f`-fGTW@GBUE16*t^{t6#pn{$casJn)XX|622~QR}P%Njwp^ z$8dHe&)n}y9BV~SG5ZUv?MnwGGRb8%w+HA3CGlenzZCRrDycBr5BtO1EA^kPujMKD zb+@EZT?ik4dXp_!{n7S;CBqwSw|EINyuLn3_93mcfV50f@gIhRuM~9{cq=YN@zp)R zRrB-9tT&J7i=NTF@xV1pp@IJPN%nlL{rYm2a#ZhiWp_n~M9bnQ)*+h3_FJWP+gSS6 zCRtIedrx@Ml@kOmhnuq%K?K^fAbUHPFRJ{|fps(6LR))v!UW5vqJptS@t?K_fgW(u zz}~iF$JrkBVOeV=N`3gcYKfvo3Qd%~h?rqnwtt}vIR~2qzV;R3N632nJkXu+h3-Kz zLI$10M#L80R1}d55qN>RaXX4$3MysskvkGK&hc^R7ZYCGZm@RSQ8rG{mKBrO_7-X( z{ZWuO_-M;du`UUs6*;otTzp+`u3EfL_l86{Wr;>v!}(M?7~ls(NiVK!Y5Fol%AagD zJY2PKYXGfuR@r(=jpAIWD*$vsLKbhhHZmsm$6kvmjX+GludU>{@r$8o+v^;jJ}*Vu z<$tT1{~EhCMYQwduILk2r$QR$FOfqLZJ<`hxG#sXaheirG~qncku<~(y>l5)@mJSB z*^IpK{buB=E8EZ5Jxr&n^0Qp$zp8u^)iK^KqMP3Ima(5254CYnA9t^`j)G&yXgw@& z7;UWOZ2eAxV#i~m<)K}bX;Gga8esvy7i}NOl>k(#h%ercK#_99)0Oj+M@Q45Pkfb) zRa=dseaFH^Xio>JDNo<5`2bkWqx;y7Y{^%n*%XsW5ecfk@gp(JTp>kvi6pRI?qEIW zW^0)nr)qw(5DCkWqli78ZuXj<{j#S_hIkF$w>G8%yLHZiB-MR4i@Xb$UlgvH+WUY4 zhDoRxnA>u_{`^*rgjB5A@?snh^Mc%s1CxODG;;|GX=93vGo1~T$pI>Yz zAko4TtTlUuka5>{^JZM0EO5O8rEZkIwvJg3IDE@$-Rc-<4 zB@rjy(}W;dCN-Hy_GC|g9!)oUr$E=-ADh0tVfyt!r`$2X50dmX-S-$!pWChKe9iL7 z4GQXxZwp(^MDW9@%i+2#mrJ3n7~j-_JRi1D^`C)|s3K-0l1!iLTx$nRFW`CZe!_ltp zAJznrLw5*mu^I-QghUAspU&iq_@8IIeey&#=u82`nGMgWtE=Ax{im^pm6+{kvt@A= zbdv0L#F$M;4Sjkf%o(kiKDUOe>>cRQ0)eh6Cozj^C{-sb+%+5LDA8D)c(^$XHz4g9 z-OMAi=;>{m0+DuhiWPWFRZvR0wIgg-P#jv@Ck~W}gMt=na`;9`Vn>oP<0b<*=zd*2 zmxAP>-O6p{v7{<7Da{g{K%JD9yKfCjMSYi}Dqi%~$mPMdU_cRxE%n8YL0>TK){mH^ zkPY%NKz+O#qHvH~941#cc;oFDF5BEIFL_;;`B6GMNW={#fKO%@W}9*=TFaWKW0Cbq zY{k8BC205{8*D-ro$IWb5KdcPMq6<2))c8a`y6;3?JHd@KxFyD%!4iw8VffGQh|ba z(CYD?yuADZO*J`o(Ck^MjdW{{sH9FkL-BUL>FXnXBXe_@LM-}ag3ew-&YRKp+V#6` zF|4@FH9kAH3_<;`IGjDgECtB2|aErFsm29s~HXr$_#) zIX!w#RK7zVQ9U;CuIx$4y4_t7&CLp3o~wR$BIs0{wO1u|o(AzL#^n9p02Wy%$_j4aldltTIcc5k6=WF$q3CL@ zMbnrT;n#_#Z<|}2hC3~{fC{Ws6Z&N}OY-_={91Sz4kj3vi~k~)(i2)bC5^Rybh411 zPi>Ro))jC%2DBjx9MCnc(PV{RixEZL!qHMu1J(ce7th5>JCyLmDR+A%Q8QpVw7-rc z&XL<3_W4`8zd@kZg)F*!>COSqp6J6{qu(C?2k?yT{h+djNKTY;mqES0e;iYI(eAT( zis+|%1fBj8w=7hLWVMp2O~_s#eahs*y>AkjY%p`kshxtYOQ%Rpv5pmMM0TL{jrv$R zLnsZt_^z~zG8l$l|ws9Se^RDaAzB+$Ob>1$DF|l*gs~gW%CbG9szlaZj0r z3tqmQ|B|hu<+4kA>xjk;87!Tb&;RGH`4wA|p@{ra+)I^f?E)e0p-6Kf53zCA55nJ!&n|G|<{>E_mS+?4mD_ScFtSoD8{N+R&xqBd zu|j{ngb|fg-ttd0(Jj$wWCAfO@uP4EMq;kWJ52G^&Hl%gFM5SjPj~o;@Mmmj={u49 zE4;+_lL&4|wvi(|TmM1$bWtd}(GD@Y^`#9HbRXTIP#kgiWaHP8Yx^-%o=lK2TV8zW zfgQ=S3VTD~7_ek=5I*W&1fd?}uERnb`$Dqo!(>gk#Gx|9hPheydnD&l3zG;t{=I$e z4T}%%b1PYmZ&{Np*m8`oPO*Fmhrq*IlRB6Hc)zNbXo!|k9mS)YU@P^ma?36=j-!(z za)p-t>Kd)x@}yD87FmgxL#4RLVP#^5yXd89JD|)mLZH+tqTa!D*$(F;B~sDMcjdjt zy??daf8V@JTP(=AF8``=+x&qaMf;#Xk)I1Ak=aKvi1hFZ_F-2GO!y2sEuLe13%ObU?z&AX9;~|zR3|^vf)?g%q9zjY# zP@~PG#1~hD-vOmuIVA%J#%`cGzO0G*W>#{vSz%8rRSffK1Qw6*`kns#eLergPv<>O zA0tQcgq<8KNa+9F{oOxF{|?jil^(b`0i1>0=1$Xk;xBl{vq7h9zlmQFtYDlXJ-hT( zh^uz7T%lU+MWx1tpT1{5oxNYMFH(d3$RDcff!6k9yF4F^83}a)xwn}#4l5pt1{?#v zK4kRW;;4WS3p=)!>6*0_bUpv>ol^f(A`Dg79LZ9TUo^1bAL;w*g6ySFpV z4i4kKrsQ4n_$T4tVW*|u)L7UyT6cHTOll0h<8C~K{~G(daV&}j=gt5A?$ofo_n~-d zc1R-5o%mkh->|C(W)$s$@9v1o5zK%aq{dI$+CCK{JRJA6IY-LV&5d_t@`d6H*^l2kb{w6tPHqsA#!A$=V!CAA#OZE2x@E7#g)8sVc>TpM3`Azc79=W!}_ zj%B^$@kg=i^`2*t^tb?I){gcdTm3E)bZoJ&KWM84hxPKk_ z7cCzWgod}(_aK1UcgoHLHn+5i^wkIjKw*MWoSCyS3IWeH2F8RMUiFpGS$TSY+p0u( zPD$erG+H(vskl#M>|FsK^?Dt$ovdfjM-OxwDy+gZ8NOrq{g#X8)l8lF@B&yUrf+Ps zyB-5_EpUao*jsE%M!Mw2$GCFEfc@tM!PYex+G)^VmcJ&-!y>(=`h>1%ZZ$_O*0HY| z6&e5=e$I=!)QhO667G%9kNN2rupKNH5hxb;0=yv6T9jZZQX%tJ#atRVwPq86CE1L{ zLXlJJOXm#!wa5ORzsiv?8&9$jrr&Vb%}bGme(KkP#vKDw@o@~2FiiokrgejaR;l;-yKbx5Da!b#R(3)jN9FR{a#*qk=*%xqXi8&kT z?b_ABLkSmOPOAP3CjVKB*`c_#1JLBsF(CDBxud_`^pe#;V8xE#&Q9=G6j7Klk)5dF z*h2Rm*#8ke6^@dI!fl09J%y74@u_}b8W?PtC7aSe;2xu4Q5Vuy?H$;8*xScf!^gzU z9K{i2VZlp7+VLu7!=q#{cZep#oKC zzu1_%TcQ4|o#oaL$yvBIm2EYuqUFf9r915y5bc#D<+5#=)x~;PzH2zUW`GR9r5P0b zVhD+(k#rEOd5}wfdLB=SPr>>J3ZFxJVnXswrs2uBsfD2JR4~-iF=HP#Q3H%_Y@88L z7Pvl=vPdxLwX%ce)sPk6eP_25^!zbECtf9s;2wM!uCgBRF6~eH=^K4l(^ZRdLb6SQ zY4^?~{ae0ox%2x7vPBoXYK)eb(jI6ok>)azK`djzV*^cuQ%2wB2C2tjH^=in8Sdn@Yv5P+C;U$oyg7;VPYE!K&Wo3R`7dQW;tQt$hRNBBS$ zn4?TP)ZX;bVYgy$IJs{uucM4J-%%^cpefd}tF0@z5L%A|`t$M$y%|3lN6Z#cz1E%e zl3yFBJ$YA(sO{(|iii2U2g-IGSTK{thsU8v0nRYzC+{JD?9n=6^nH@nMOt?n$j(Q_5MW| zWUo>D($9}`uzM5oU>fWj!V#i2%##K_T==3ATXK70Q-|*dFsVli6#Iw=n|-W z!fL^N}JF}MA&MS$*OmBsQ$QpUWgiu>i8h5iPa zj*>${{5+2Ve7E7i=D9`Uyee;m>J4-!)dqsj~U#2T;`V#cku z_|6$`n|yPXMBp@wSUQT{*KA6q0A?uH`kg~66Mk3DXCgOq1H zgi?VLocerMJ1z#H^0lmeMl-v4+}>Ix^i$swi3LWe^l|8!q=Tva%%T zb@n{`dH9N|JKk8)8d4ID`mhC#x=z%a&hcS&P%qAKtRb|`I(9uf)LM#D4WNgS`RNAR ziREk6hCn+i1t7wpW`f#A=#7t%MVcPTxszF@t{^g&@54dHN^$SA5M|9;#2ihG{wQ*v8_+>s$!*WwUg=+K`YQ+cXtu=f9DfHL153twY46EF z6hc$mx_T9H0kVJkVdpy{tXh6({ONomYl*I3_aXds=>soQnIk~56d#Y2#R^N0rq5kx z62^IMM?=3iAj8%9sCBqZXC)c}4eg#!Nt5)Fg@W7WLsja+u5JhMCZeNFGI6@NJKeS@|%UuT>M+YP4CtNunB=8^`6@?D9o^GE;rh;Hcyi z*hKGfM0fC$)t$*~5=m8tOe=eQpHwx!_fgv^7p4zS=5c8uDT0B=pw} z6HN7O^DI})NFqliIl7>WXe$;-7_E`Q#Kp(b1fuEb^@!*bT<6eE(%rm{QnAbuDBH^c z^$UJiQ>?twxf4cY?4`iuKJ^5j@(ObWId6Zr_{H`TQyd?B2AbHKkutJ$=)35og)0_H zL*p=PnI5yxSM-@$*dxc91q8DhVFT*aP2!|PT3oDBj?>Fj`4AJBXw6Ha`-fp`4svT! zpGpj@6sCLym?DsyT;@4klH3XNKtz?g*Y}JykYrua@Z3PYSa`@?>R6^aneL0mRe41x z7NMh8)K|Z(oP-6!#CBhnm*X6Q``->1UoAx2uN3^=!5qxZt0}euSIo)Di#C~>wNAzH zqMPF1E;h*ls|}_>dg}XQ#O(mh@na&MWK<#!vaa4eJdiyz@syT&em*5JLcGoK|qXj6Wy!hlyBwT1UZCc`sgs8hgLU&o5 zR%m9+VyX|m_Yg$-#br4Rlxb=@4kdF?kq%W&oc6dXqo(_e&_4#;))o5>X5vVCr-pTM zJ7)MWb|f`Oqtwlvb8~sn%D_&+QNX41iGkE@=4&EUq>is*&61Hq#Pn*r!eP1S#e*{x z&!^s@0fNpvM29!FkB~*H28KPS4je65wlCnu&rE$?{Z9#ZJI^5s?I{E=+uH;>Qs;wMW1@c{lBI8_f0yjG{H>ae7Ay>N&3Yls{t%g zhB3uW5l@P@nDPb+TNPl-erI&f#|c$Q&h+&{D+pVcen~d=RKlX|MWMzI%{f!F8tj**5|aarzT#$<*$IkWhD#xi z-J&UJ!dX6rmcg5={T)g|m^gxVZwV$G(it6mLxv@Ox2?S92eyGMF9&_bnZ4ka8^bQ8 zmUdO(etvawNz8pi(^5j)>3h@1fC@e)B@ZWIBO{W+^=lj|-ng2fi8`tT$wAk}U1mp^ zq!Of$wbcS@DF4(tWYtz{?_IiVMx9w#%2D#Y1}k!|)^Mw{#=afYWh|RFbj4_?mU90x z@0yc8V`HHuhk=z$#W;jTwHF|81>DUn@g(sk_jJWxeqO8BI^miLA~9278!egk0UV)g zxb5W56jN)gE5!F6?Kg(KV*pHiq ze>yy3T%fH6JzoX6B09mU*0Du>2Jw@nB+sr-7A6D=J0SU&u>3&*Y(+7V9h}U58y?f@ zG?PnS2P(@vuDA2U?BFwiL)6YSLY#3!snP}@v?u5#wFPTCl(qL;s5p;Iv_ZhGQ$JdB ztOWkMI0EIj(0|(f6D|1N)-iw!+xin$_)fyOB*^MV;hcvHF8n6}vpGaT0ZFV|!^ApS zxuD?pyWdTme@Cx|a&Wz`rf4+77C9!b5hdANhBbJtj7#r=eQ0Vft#8+THNAN^{ANa8 zbARLIaBI2VQoiKaaJ{`~-qN*NGrs3WU8hZ~mJHno%+*5Zaz)PIgsu8bOiX^J&Y`EJ zG`!MK%-jo&T~cX~&eV$((I3o#lw|6Qm+G;B6wrs*`VpuhuPy`Ajp_&#q%kISB<9fS ziI(fpOOXXQA?P$*c+n%|WV?g?$W~}8tohDQ!&wEmXv+bwIKtrg_{N4kbdNhqn9vm1 zBGy01Aylc^#n9UtYbXrq9^~CLEpCtMHM+SsYg@i$DS2q&?ogdmHOtJFy~ErGeZHyh zHda}XBW8h@Q0a<9w>RMlmcqkI!bKGXQEW`9LBfZ@yh0d`P)t*{*YHVZ3goR0DOV{1 zA291ti(Qb8juKLA>5Y2L3VMy2P9JW8JrEl#>IOE#v6G9^1Yx_%!g9U#NP7!YA5~L@ z+bz}pG^;^g1(v{^9H5`%(I-ligjPPDiJ6I$91$6bw>&g3R_W0{nubt9Kk42AuNd;U${6y9)tZ9P1bvX{lGkeNTy%gPyV?V@6{j<* zZ!Loq!GZ637~`Ci7fH$3%BY$>|Mj#m=S4XjzK?<|&9-a##N`G(otW(?(VHw-P|6N+Xf2k`uyQpkK*YYzi&xgfiECr@YnF$` zGK7}v;`V>QEiae2_goE%S5}*r=xI-H*;z#zUBOVDF|wQ4Jnd>~FTu~qhic8fJsi(& zHM!hHAm!=<&`6DxoZ>f&wTV5vTM3Yo6Ss3hpfw_LQy@;u>AqveEukg}a=Qfi<&V=` zd^s%sbO;W)nAuq)IfvH+hwoL!y>>XM^(v30bn#0|-(+NXfn#FsI_AP5-th{ipGp$}m_)CJ7|IiLuk8r)ZKOWZtY#nByTh}PqG^>CWHze@W z>c6P;bvbL_vL_hjMS;E`j^2}sv;+lR>&GD-6B_~k^Y!mse|`5@2bNTb`A{ff5OpK3 zkoaLRr?Jp%KNr4sOMWk;Sd&g{JxB9rdNI0q=vQrbOQ&XxOk7Q;uW5^`b{crVWgsCr zk#gf9xlU`KN1Jii8s8KaR5e9W*})KD!Gf#`qq~VZZJc~IJKoE)d_#jdB_=*b!3Bu3 zA7aB19PH~q~Mm*Oh1D|xl6LI2c=UepTB|0`4A}%??^V7j9{_GZseY64(V})ds z%^ny|h6URp+oLILRf|JJAfhPmELTqgokqJZFMgD7oH!ev-ah1jLgp{2t82vf_#_AN z226#~76<(n82=eX`NtRiD%9BPT5hLe$xWX}!Qk>fk)^C|SDs5iXo4n=zyddwXw3+q zC}NV%Pl$4LPLe32;=PmUS(4T;f$*mr%FzhixnDkk-h&mlZ^(U^Tvae5Np$(ZZf}|j zlcX=GooZPuwUX_P9mQLMLHBir?Bfw9VTQ0%h!u9T{^26T(<*kBHKK0{K0z8B3!nIA%O5`Btu7;tu|L5y$%Hm`dQ6*aA;PD*@S-_$Q|taL zz{ug&hE~1k#NFEYNghdm(i{oq?-OK{A6aLo*cjM<3`kb#-Ohb!jsVfqsaI40Xv7j_&dw;#RwL+NuuU?jxGGnvgGb?9z~w}synHkLg|krPU!-6G;0+*A~|onw>7 z9L1Bew?T6oFn=V@qf?(G)e;DeZrN_Ryw};Js_=P&&RvQ5q)uk8vxUPmkGP!P^F6AS z{{*rYDp#>2X{FmI_0S7G`>JH2`?d`EMS-|nRCY&uNn&?qi||X2z5Roo?5We#-@X<52G4i@KEN^|HWN?XNEuUo{+TW;pk4pc z+VG2Rg%^-izS`}9FApH8sgC^qT@>N+rLCteNy7_kODVltzJ$TXw-lp+pNHS1M@_p9 zO_`V+c}c{dnyR^zIge54c?ffC^P21JNo1}*xr|PoCwHdox3S_+Hc3r@nDnwzS(mB9 zl6|3JQdkh^byLR103QYaHAnFn;OjLj#iFBCuA~vB6$P&gRNYXf-7<^IPV%#dQZ=xFr39N08IKE* zx?8d^h2Bbhv`&_?z#9Zsld{orqp;o~K8j?RbHKByoi|LXsl!I4224OH=wP92*Y2ug zz)Rq(5DZl}b;HwefxOexfFVuxs@XjW7k@f5zgDRDQNxMQhwcR#tH+nJc2AGsGwZ?L z%ecCe9dBoXW7N&%k?5aA!62&{OCR1(-z@w$cqT00*4Enc7|_~MuP@Kc_9yXYi~9$& zlmax|1Ada%a^As8LrHyo%^g2@uA8HK2CM8*vW)NvUT=Dwu$p&slTW*khX_PnVxO>hFe#q=3% z3)lhUgfi6|;Rb@K9Qks?bp@5)D!0p@@3e>q`|bruxK(D(f=8*MoGp$HH;eZDL7{I@ zDKtGq)-5(vbPC}Z;FVdLb7&GdrEr+K&qw9doU*2lZ_-=V8yhKV>(OMxamaR~fjRM| zi`x(euD=K#?^78S2%THg=Wu$x8=Ez#CWuAh?{?tK+d!{q0k)trObpi*bxq@sCzih< zqZVCkgXtx)mQ$}h!(a?^D{nT!wZ;b=gB=}<(_7B)fQ#x1i(N^kPFwqpkF^Ee3%(iU zAMmtbg~QNxn%AimDU}+s*<5*sAKI0>xyJOpHpoba8nGZ`3<1grxS9$vAqt9J2UA0} z+-_jX!jVBaP_>wo8_UY){x34uIB3>=QSNsMJ6H6Zgs`t+_2v$>WI{A701USMbpGH$ zkZYEhLk2P7iRfOqx%m@<|5~AEO5~lVNTF&-v#Y(1Lwv!M##9i*Z!@p99v2G+fJ;@5-U z|LvJ5A2?m}qeN7)KI$OIo!^=t?K)Lj!_G~(X+_J6D1zlCGZovYg9CHHM!1OAp&A84 z&j$x4dq-inuv?y$Www9<9SB7NH~WE#GI-x7C>(DVN8=il^RPF$H-GO>)&7B;U!&Gfkb0SpZ3;c@Xy0g_y(c1;I+?KW1!J8H1dca{q^1LzlaNIU9F+#E0#2O7tC{2 ziSf%SzLL$j1v7WqQ_>AWQB&po103kL54RVFEa|8G4kI>mM_ZV`>gw>P!g{5lsUu{Hu|*Ul9OR`xH%X7}VMD_}ZTyfJreoX?AgCEbP@K z*q=ImLwNTY--fmcQReg@2V-$KTuOk`sZ1)KNwHf ztpzl_5Wgr}7h*fD>w@3`XFX^s7n0xIO1aR4E$k!QS6zZ%%(8=IBlCUT`qkMA6Yxk!BmG!_1|>- zxA0>8htyy(k;9$lP;Fzz%0G!0lRs7lABG(CtedSuAXfQi>m+BdPHQ1kauMekuZ-y0Dg-Ghbq*;K;@z3e@-0(Ws&_ z7awsOZnnnDE|Q35CnweyPL6Thk+%Mc#!Q0Ix)T$oGa)rVh(d-!#m!=0=ZJpHJQ|LM8^mu8bkm^#{Y68iKv?`(>1s$6_9oO>9u z+H>CjFy~O~>3V?j*Mq}PO5fLbHbbnl)a`1EtajRX0sYnx3&#Qi%T!Qe69YXt22mX- z6Qkjin!}6LPK)S_kleuszQNwWKlbnc%toz5DrLEIdE4OO8v4WfQr6sj%5&v1>*6T+ zuSXix@%*lgQec)?XGBAwyxwd-rW;DlzW4-AVSX<#T!(DHM^qPV2_4MR$m6T9)y@u3 zg(*_lq+%ZRYtn(FVxR>uP`Il)V|iAhR90S?lLEGgK^Wi)%EUEh{VnG+v?^R-_k4+hDnb z;2$P>#)F-vlD|LVhP6_H_Y98L9s_>3_3!WPYWB;rK__lZ$D`xFBc|yQj9z-22||InB}a#3iPyq)T7)dX7V<$~ec)z}-KRBm!g8CAH_$_=lU_o><5 z4AP1OTZzZd1U?JN0Ji0N^n&{vp}T+>qyDm%I?-9SM&@tV$tGTcQr zLa!E4$0z)s88q$}$q76CX zNFYoR7(|Ip@1_V4qS*8*FunUz&PmS6y*catzMI^&?pnX^ubCI#cV;v*d-lwpy`Lw0 zXv)hn9gk;Wa14-V)~kObh&-Y%WOgjg_E(|~;(qT<^?0wuR&%pSB^2&C>+CiO5 z{fNQV1JfTJqgJX|Q79j;v`ho#Xv0iFQqh7G#)<7i1q=`WoNA+0MWJ&;ucpqQ)DWSe z6pGdr<#8^?yosC^QA{a~Wgm%Iy}cH?B8rf7lIQA-cO2o)JCz3;?S}lrM%~(u38N&X z(D$jcvxp1JIA?6fQgxTiV(4;AQ|QT^a^H5V@^*JZ8Dn{)UtT^o2e#4Qqo9Ph_2(O) za`I()T*#sZbZUR7GanNskc%1d@A5}0pV3nDAIuje*C6nF>X_n|YNL;+wNq$Uj}h?`;*0PyNMc1sfE zizWm}HawiI&ysl*AcKy$u9|4nLcFAuLyTZ{_4}!w&X*MC@O^b>!Udq>6E4emRV zzEUS;NpqdjvH=vCyo4JTK@=87RvIR8;7NfQ(XNNBmkT>BVquOnRcpgGk7N+bO$Tk# z$mJN2YZs^>?zvVIuz^~yuwRpv3v{wk0a|f!DxfEUoD1DbUC3mmh8b1yO7{WjVB$`F zZxW?F!944_N{EVR(et<4Q5nTa`T(baC7^^hf)RDX>4ht@XJw2frQV1%RZ~8U(EPO z)etkVFFT@RLXg8W;f-cu4{KiGz_1Oh)v}d+kiDDTq~?A)muEOQ8P9Ta+JP|US*%@u zu~GQ}7oc%3>Wn2-fq8h=HE#09%BG(zZ^X8jfO}ZP9ePk)Q&IGoqr`?$_prHPA%OtL zSMo5)2@NwE{mrI00R3d0Ei0|E!Z$Sn8^`J#`0kI=_2-sRodg7;&e}~O)P6xZ40r_- z`pP@!g?OILDcEMKgVr*fGJjcwAn9!*`RdYdM^quWk9Qe&DFOj&G&D5i&rNf-j zxy^#xdpJ3H;0V0Pv9G2A4r3iHw?;4IV$N8U&vv+Zv&)Of4zGfSKl;rEx zT^mK`GY{-O)U5f&m>9%v;eZvR0@H>W#PEo6#`0FWnU={yO2kNbl+i{XfSc9iJU062 zN|T5)Gt{HrZ&nGs;@tCNY+SRXlu$8w zYc_)1HVdwGE!Q0G{=y+br)zOrhLe58lsZGo3_-?V_ST$52c(3Po57vq&9kou#u!WN%2e-=LNxQBh@QGB~=L0TDHX|#4naBuUXcDOtuQ_gL4W< zL}`1l{dNqzQgKj$X&jvm9k^uV-`(W3Q`)I*5-Ik6$;`aBAJM3$)--lBFz$s~-lDb4?_Z@@`@Z%opVW*H+K&DXNlZZCdF`g*}&5IlRq7*aW{BUzMs!YBf98lv=TnmTrtf$?%3rW$Y>FR^3EVeCJrzd^&mRLhVc+&jTth(EZH;gc}-HQtFi;J>7YOVd$ zp_d=_hWMCXc6s@$IW=A~D~ZqpvVMC72B&`H%_Q2Ie>eD?_- zs#L2u-!r!;zMZzZbsA0>(zw{zEr2ayLi#358aMk``jZ^o2c52u__+AvGQvSSty?9xi*UgK+*+ z-w#0Wq~u1M@Wb+lPj~wPxpLVEBeOW#_ftqx&T+6 zQ$pG1-I7kmq4>`{>`?WXz1ki{*h0ELN0X}tC+yU`VUa$n}K+r|7NL$2f z{gI91>|XRp2kVL!VwZwpgRsZdv#t-^?FC2gW1!57!+zg>Jb+ksNT6@3|O)G zYB|7Kuas-p1}xz!%p)wi@pD!8DuCtNJRxG!A!B(u`i4NOfJK-?=U%5zrr@K}1R{6)@{(bEJ zTi=zeqB{ShThjmjy!Q7uzn0B-IIDZTjr_M>{sPmG+xL$KDDlN+H@9_m5$`3^@)<2F zs;g^t6xOnOPK0k(aiA2{q{1h`_U*LgLz3Dd^1YY9?A3{RmqRj&KAB`wINSx? zh6L&O2?06ZO&SuFmfz$2mt{!>J|K-3y28)YGtGGSr84Gw6@adZzFx6x_*5B}a}KyF z=YHE1lAo;~zM$J%i=Pg;`-$sniiJ@L-2O6uq^TIz5R2PkDYh!;R~U3yFo0VaT?+b_J5t7ifA zK?Xq1k^y@&*VUH-W`FN1^MYrj_x(+mo+H4;dbGWxW&%4cu{gh2QHaEN9TIn zQ*Fw!XE9T`1U5g}kwL7n;8!K|1t;ujFfvo{QWZvDJW!L=|`KVi-@>{<9gJ>F-XqVrqu4MA&I}q$UoCRx99%n=NxQ% zQN4%dRfxU&4R=X@l}9kr!? zb9532S%b4;973A_ht<;(jLcjbp|J*02njVkIQ+uFt1g{9$;hl36bP6Y4r|)P;4c^V zKnx}QZPUc@>JnUC&3MT`oh}s%BzlWC&ztr`e~+c#TGkbuu@C@wsw*Ath|tL?H9>B6 zSI!#0nA}WsE6RUL(aQ~WY8|M}E_)H=zF{;wcJ1>BCTdzsixJ?>yVXRYzolw67)K#J zqad;NMom~+b%^Fu(&7odG zhfjvx1}ddD3SFh9%#6$YRKp9>@L+;%MJBln8_fyl;i2u2!d%af^gFvZF5=3xl^$Z{ zd*Iwg9_k(NQGlAQ$!IUsGkWM#_ex6Y;-GN+7USvgyz@NsVNyU_+M{c^SUa2(Q$W`D zF#Sr5wWfBqMeV}0b{-2pYLb>&8M5qSn1XR8+2%(XgGr(pT}zH^5iaFY6%oA%&B3Qc zvw)n~YFc&-t*-G+t6Ws*MXLH{yjA{kzkwHW*}-?D+jD6Eq*@f1j0X`Z@VW53q;AG= z4LL-9Sjx-Ft5>C}V_VZF^^>4kkxd05yVr_*@pJRv)L;Wb=4lCUox23ZrQ*y)wZ~Zo z<0Lsnk@7G_@l_l)-CY!EP57Y3cG{sL{Sf8FRyN38b}afr2zO}4_koZyIwC#5nsa>c zFz6t@>jc5nI@OdJ^MLnspuMD|oM^!b8)R4Lh1D;8zq;CDb?|;kx)zy$)jw<@b zyo`MOJxhrP`MLSgJ%(pHbecs4(!mte1`Gz*(wf5~Rj(lqXt!jB{UPw5oD$bCPx}nd z%n}>jWfKQlQkuvaWuC>t(&9(v3U});P5uXq)GY0EaVn4DL4Z`>!A7&j8W!%qnkDei zPr-Mre`#lAi^$5Vr%ivH+CZGjia1bU=I>ggb!5JIWF~yuwwagm?Z7o-b%{$Qq(`4{ z+M<(zfnqvbmJyRu!!((f4(gb4>z^z6BKzhkI_q!&jY){4V>1Y1j>=7U@{NQR5Ikc{ zaB~NaMWceBrS$Df%!+An=|~~!eGBO_Xb!AD;ivK|57_pD5>A7A|K z=}%pt{PyubQu)fF6@|kUdqkts>D>hgAt|Kp3lKK-dP@qaAoSZ-&i zf5l3mWUa){h;HLMl|pG>IDS}MFEr)#{*Q0|_VlMr)W3cFkM#6|1^oSmJhg0YzRH|k z%IydFjigb1f9xRQrU%`Ew2Sm}PpZCJx%nXXk&tb*^RS;4wIF;$CQ9zW3_ z8)MkJ(!MZCZ29I}6J;IAf*Vt4dZG8q=U89wXc)uy_+H6>tn;_0zc@8S+ne6nZYVAs zxHbORwnkdi@8ysAu!#+rbDD;Ym&EzvHRD8FtDU9;{S13JnzkPLy&WJO@FufyS(Q{q z(D0Bm`nx}?WeBoBq`Gf%4?YTYooC}e+dS<(dMGfHJu?t&^mEBMwH9v+xUgG`Yaf%O z*m&Jf%FdQ56w#4sPQpT}!oSvk$Acw@8J>FmbCI%QzT6ZKJW-LqQAG+ zUWviful~sJEBywZN5H%kFmeczr66u8IzbgMV_ZQXd#9Jt9@yUMg`0mKp|5W1VjZJE) z{#n`E!tr-cXyj&D2;3Rt4{aSfaqs`n)qnd;>FGWwg3>HXOe(>Bx_!UcxN9gU?IdX; z=rgs;%VJWK!C#sY?Yl3zL^^TmJU?;wTd2OzTk92G6_g>uf!iqex^vXRkz7D-~j@!x3|56HK{3@CPu(XM=)d}&z&v- zuY1JGH5DH=s4UH6pkDVjJhtCZvpub{1DzYaUPJ1)Encw^3{XkzRpW$#xKp~`_T(mw zTENZVcWhmo_@=|wyVYhA*P*Qj1N~s6mm^wLM7?JTMJo>QYKp)1*jE{f?vVDdwn)+P z)SafJuBuZC9nlkJGbWyrbc68lMn_GoP)2?m?a}M;V{NFxfg<2W$mE(c$LvPwA~HO% z-hEf)SC5w8Pq@D-t%%cVqYpI#*baIskCQmq=B=;aQe?eaUcI)rOW*^mb_&`J(e>~yRzrrRnPgkP$xil#;VZ%5_*j4Q zBL|ico6g{;Tf-=frFAz#Um7>>lcsI$h{Us9Ww1_Q;k$!g*}2n<5eydD164R~+8Ic; z;Bg(c1n^5=^C@zXK&bc+;P{-u{&smTouerKfW|sDV6s{f>dBkzfe43+@ddQUa{}>= z`65g1XX<^Bb=e3h%B20Qr%uOUF|$^IBpM5)pwni*eQ&7U;>7aPv%pHZW0OWbsmyeF zMaNoQ-g5lOlxa3xT=cZd!nBe7!We9A{X3N7Kzf5hAZR*86Lcybdi!CialOx&S$0xh z9Jk#_52#p|>Y`r)UYgMXv7ry{E&uJH?IqB4AkalGVPIk4zMPKax^Acb*NYvEnx-T4 zOr+Ok(oJ-2d)0T|-+87{H_07`!fy}KZh;SP?hQ={tul{{epY_``%(QR{}(M+CwSh+ z_*q^UOZvjm_3`>+0E>4qcq}Z?ejp52j?Ina-q_?+xSMOcYtBYw7l>SzJXYwy6W07g zQp;y4;EkSZngrLcbuV4RU^b?wnN22C1i>0M-g2T^sY}sNUyw&#!xe+$^UoK3kq}Fb zdJ5M{l1GWPG?UFK?y+nS?cm2dq=sU>m6LiS4t>y1&;sCA8MKaSTU=mL=eyHVh~zKX zU=%_`zPrNu`JqlgJD3AGqur^jYu64p zs4GfHx;pLk5k;Pg==6s8&eJ_{%#vO2iP!J#qIuIB|L?5k71*_DS&R>K-Z}zj|H$geYFus*ep+31*7R z5ru^6FAMug8y^G;&)o_htUe_GAKwdws0IzT(7_D8N=2jQBG^|FA19Jk2SfPZ93nb5Y0#^IwdIwl z^gDib_r#G_(Bok9xsm({&C$IgtDjR3!(`N1=7gOsjSr8vuDso^L}g75v3KdmhioTV z)1=TC{%>kmMo&B7bYTJak?fnGy1Elfan0}kL6J`Yf9POIKiC}1?_2k;{9kORh=Iv$;c&YyH06PrjBJ>#CmaHCFkie@fm%!e z+?^Z9KcN0i=WBN_fr4mG*7USj2BwIs`)z(R;mW{qzGkYgI0~2wQk;b-X9q(ZY`lg z-BctcCGoEW^5Rw-$;#r7%{KGBmjfL;juu7P1|AtzQ)-N2;#4ovas)$xF|;Q)?ji15-EgMB zxD-&Rx2dXfiY+@M;WL#QnLOMV9{y__{*n8OV)mc(^lzpAZ|xKQME%wq7w!V9FNAk} z=X2qD`5g$do5HIX$-R`1)iG*A`7 z>BG&pN_0%x6w3wid!FTZ(@E>@bo&7RuN`2T-cV<)>on%bz^DX!D z4ZJmNnAt8ug_1D&C3qszViS0gR%~Ae8$nO%Iictq<(SsA*mkb#(L5ayP@&>>ewqfE z(L#FcZ?=gzQ|EgIm0zVdjJe|G5?GMfLzS?fU7GgFJT1z{YBNk^y0?9+RRk^8r>9X4 zU5IZD^?w-3QVB+pUFH~9*n;s@Q(Pr!5Ra#l(%qM3-bL^hevF6KTenAh8tdx{2IdCi zi=&?=X?e;yC-#Ux;I9-S?t+aSz|18Kkzb19g=M(EK_;IV;kSZ9uEU%KDJ0XREA;T~ zf`VwICaP6vzfxhw@aNTn{wVbbi9m~J&6vWlBs@+z;B>@PlJfJ!2QWL2%Jz<*+Gws- zo|{bX5oINNdrd$$pBld?bS?&&GNom>M{U8-_c7u5v&WO^MTORmbBE1Sy~n!e9S52( zZikJp`5ya&7wZX$e3OonPgvg}=_ZuQCXc3957{!3YkLgLf78v&O!PijXbPQd7ic=g zj!>72{H8xmIiqcOciowoDGhW<^su(NS@P~uPm!d$e!9Y}X|Aq%^4FL_{j%yVqaTwW zCRvL#6awtHFW}#nBt{dTY`W!p2}D#xOO0)VnJ(n&m<3YC3N!VN@2@lH+h<^W3+nUy zOasY=XCWd;@eJv$6ScjLp$BBS3D+j?;XVEws)}ny`GY*q z3|#Zsql|(urIDZ5%wTRzu?5oABth9SO3c9A*`l+%@t|qa+Xc*z}L^{c5y-YC$>;DwY)0M1#8DL z#9mn#DAF21=d|#+=7)rcRnNiRADRJ$iB^{?DJFNf$aqsabPUEIJ?XLhOgd9IaHdhS zv>X)}Y)>sjrbU~Qtj^#_7)*6b*%HH#Nv_bEf8*h`x=&~~JO`>x9GIy;_qB{3N)O~R zb}~N4JvQ!#nY+`gFW05gYPH#ruJ>Y{*zV!F-|!1iTsX_+J*kCo?L6jEzcwMB9h1E* za;)=z=|KLzx_`uJnTPHh=ttpM?Q6X*Esh%6_lJ@SVlvyp#~fYKi!?`01~8%*4bPS1 zT9X1kJ$f3AviZcDKAb}bb_%fhw1noJ?Mx?9C3_y|6oao5w8=Ek^w~u?4bJeOj<{_} zJx`3m_3rWuei}Qbb+>F|so+J2UQ59%2@$0p2BISfX={GS(HRkPKZ=z!@Wj1j< zo_=WKM^hD5nIGE9ZrbU>*!GlG2sdWIk3?z}QSsKgx6}O4^{#o4Z(k~6lqBd-qyOph zY1O#b`4(<*7(aYx%Us5`LjLE{MC2&nfTUYS+mn~@NK~U1#$1xSMMBo7jQ-A(g4^vj zv@m69+9kx6XFuY~6xv$)iELVpgB#t8m0uW)HS^eYtyI(8%SWo(>ruL(D)CX%ISC4^GnVy~ zlICNiD;gB&P8S%YE}P`FzV-dWQ9=vr_FdBWoDn*4d<*fA!5V#e1dKVj71GAyS7W~U z!qMdMg(Lg|!>XPQrSX}g8u4%-qG~ZjC_L+EUU=uRk<<>Fji~mpo~~9_rE~P1 zhP~f8-11Q9q|z6Th7(JaPo<-@3kQzuHxCm>6ap(Au<;Wozi?a>{$1TCz{C+P=Mcwd zHg7tm+MG%a^4LM3`Q;YUNq)+?CjNLYzFk~{$-6Ut2z4DYlyA_rY6)|RSHj-X{c`Cf zCH1<6)i-LFTC(bwCedt$1NR&Je=sKh#oguKHOl|OA?|4)O7q6k;|S-wnoG*5nAKIH};+-c0oISYJ$nOR{qjF0pH0(+J4 zZXAVtKDm2}x3d)@_h>g?CFM;A;3@dDrzN`A6PbELj%drBUWKNvo{Wyq0ZNVdVLroL zbl)7M&l9_c!epy4A`%B(tcp#hhaFNsM@e(OZTPpp{I81zz^wvpg&BoDsu{_5-QbQb zpz^?t6>hLEsV%oFp@o`T^jl9#q!Dm2juq@qP*1~EQ_Pdi%>-YR1!_7%nDr)Hd7aT&~BTjPnC}*y-KclMafJ20RPZg z-g=V@0R61Nq8f*aurkl7y&M+IW_0Qd`1&yLl;U0@iv%_Zs zBcm5(Li5xzX~wVf+dtRJ7vMG^!Z#>jJrW9{xxr_De6f}p}k#QOj?yy zZsg_J+F(7xd&h(w_$N+~-ifk(aHvjtk{TO2VI5oRvHE;7dTMCvfn823z=F;*JZQzI z3qj}r?J?Si&5DE(*cyJrc%Y}e<=>6ce^JR z+Ka*i)JtCbVH0bEGpn%>V)U%2%kpRz<4}H~JbDO^OPvLdvYqr-W8xk4v+D{g=a!69 zcm2CH^{uc|SC^akkKT+usO>k_XF|>LQ|6WiwnbRYawptM+s3D7W_%A#hpJz81{dvF z4D+J{^-D@^yF=Nm7uH@v9gmEg_p8JMfu$z$Z!7aR7xuH)w+{rBNhB8GCxh9joR#;F zInLY687)Rx&vwY??QZ}A^5ZKg&q~Z(lO07|A`k|caLSsvD_;rhNREIBaI{m8-y%5p zc@NI^IZuWyb@L(jQEX7~E@Tce{Ylx@w^=r6bDQWDtnsXHjD~zB;oyhiB7~kL5V~x0 zn_;Ejd)ibyz3f$0Yx&|wkcFt7&4GCKb;yLIxZEL_F-Bji?H}4;D$h88`&1NU)bU5M^lR)21<_8)D#92|dfW8?&M*}l+67A+ANI5b4P)+rZLh9lIS zEolljvQbjgvF$xq8oZJ_F!xFL@HA3}rW7Yo>G|c@1zrNG0t6~{uKNOv&66=PxHxL_D~-fR=QfQ&>QFM?*nHs4;>s zpEa+BN?9D`d_2|Wx@Fa1kQ&Y#p<_6npMd6%duvwc%0yCh=FZ5{H%!&5RSw2;lqVkuYwr3rrrVCwXE zJHaHbGh^Z0@Ti)XbOQRCJP1^Kx||ed*wvDsDR3UuR!xcRg|yZ9q4|iTJuTjw>0EZs z?#3uInF}tz5}+rRVTceR;r&F}e1qB>57_}rU4Was)PVGaPE)M0Qp4!#Ke>hvG!R8FNJ( z`ZY@|H2ZeaHVkRSDY&@$rnN$&9@brH&jH7j=cw><((rSOnyPE=adCNCnk1AzK9fyG zin0-fyxRYMqt$JT6<-FRA#PN1z7Oq6nVuC;l?ZR+DchHYU#-MX3Oo4k6N>6qjM9Sh z-2WChc{sdn4%oh&2r`SAQ(J)~<^71mOurHty3I};a zM06PVH8h{Pvxq1A7=oI_1a%YtXhQxIo1JfhyOa(-oiHjnU2P#TKts#GrMIRL=MPAEoV*$*H=NBYM z5+CF8H;wYV;{i)9g&1)iU`7U!ayOALzXL1pi>n=I>#-WN-g51O8)F~k0mDDzqJ{%O zD49M7tdD_CqcHQ~)aJ@uy-YQI8vFxwNuT9f&8R z#x1phE_^w@#Kq*%aPt&zswgpH4a7?U>58CKGFu19&?|?7trN6RkyKHK#W|A0%|R}M zhCtB6)F#p7QyERlpRt>2YN;_OrJZImHPYhqd!65q8qFME(7R)8G0{lvwk;4FKN{L& z8SNdcN|U_mV{SzVNGn>%r`Se0pt?_{W_V3Tq-33)wx^{9INYcJG}8nDqbzqLV>^x$ z;NbV{dwWwk^7Xb-!PYruyMACfSd@tJ&ramwN#qRl&>I8}Yg*^jl^m82kH%MK3i?;5 z&XJ>m)57iQfEa=16F?`IOod*;QGqQbUf>JIc+L0owN-s$$Ku8|!@opp&Vgj)HQ=O|BGe-3JQ3XZO}sjQ193MC8L_A)iEsu^~xmKtlls1ma~ zAD2r^8q^Cf&KYlHlV}E_``W%`8?zykwT96efU?|PT=&LpY03VIGW&}3H&x@(uq=K0Q4`IL3D`*e%+2ac-b)1hY)YY@Z7-+{=wNxkh0D4v*s zU0LVoa>9Eiqp-)iKo4d!t*AABG%kKmjiOwW#~U_%q0-SL!25mrnG&IZBtjuO?7GKy zym3ZretB2*mEFFW^B0byi0I%e!@=Gbian?A@8}0YEWnjPQtnd~^PN-2dB+R*Y6zr>BSlI7;3Dya3*u;#cm?|P&EXeF{UF7<*R7I4(lzOB zY}$s?cL&PZ+Djc}7hB!46{R)f2n?u5#5 z?D*?8^iMeYo>wuW(6`PBcNLYBUcR$%ZKC*i_ZGJe>fH1$0kbLYh(uy!)v*%+SphbL zfe`M$@pp;|J6R-djZn8G=Wk2~Ygu-uu}x{QEfinoQaHJU4gUVK>G*3^izO8O5Ua6z zY(qRUINH3fxcP`f{rPA2VlrZjZLj$G#0Q-876^6JEWE?9$JJQdRA@8AHdb&5|L~|{ zh)&)Y2>p0`4#K<7M-4^B9B>4mnixl#6fLohB#$rrf0usl{OfsZFi}a+3{ z?qS6hf&JSP*~@2{cc-wU1^xG`hKgL|8PQds&8m=0-V$}ntAL`_NTaBj>3Y`V?ZT^x9GchW#b3+v#V!5rYSTLJDBTH>OI5(9q;$ZqcG(iU!~lTtHZP&GiZ>hEDoXo=JTxfL_TOe% zIFYWANuAF#O~GO942Cqg8LZ7Y#T zRdh8})^h+fJ1=!CH8lfC@YeBrHc??%z|&Xde=U==@8wDvRuUldBLn%Sye1KVmN?md zDX6buPr!-~u4iGXuaZ+hYJ3*vk&4L^6Cp-K^$GPGZ0jXDxekI?n~mnNEP*|RixV*J z?JOIKg@tUQStc+I(};}yP=BcyYO$$e+*HGJ+1r{X)07)%vfQaiN9T!UX!>;6lGvP_ z-5|QaBV^vA5^Y=>dLtH?waK}2$Jdj|@eNFK^wyN?t^$;}eagjL+@4T#Q%;$$14Hey zk9)Fgh3lf%f?)Xv2`Wo9LOb0iOIbY*JIyU{c$i~)`rP0bRtDuxxMd_ezvzxrzCjC8o zz9UUbWpQ&G-KgP@K2H_vQKs{vs1HqB+15k8 zkX$^KlZU^2F8r~7#kcPnIy^NgnVDs85POT<5?aEdQvQi!7o(YW$*FMvBeD;C{b|uRlM#=<>Y6I5c(7}HH}=iG;gVmMj_qasxK{mQ-jXIZ&q$f z8FbP6(@9&Wmn%%S;np_dHs1-!zjYJUTGV+m$xBrG5zRm?&5OD}1}#qq+$jl`=Bc@y z?ArHASoqeEIkbE%B{S=th0P-Q!Rn3OOBLx^@4>!I>dfcLBXS7s$u|7O1WzGNuJkh1 zh`9!+fc?Emfa*fs3P_$y|1V9trB)jT=(fDHym+pzJ}z>gKY!K1xAs(>;)BleL)@Xi zYWnWu)!g@Q_QZzGbRx}vbbXdJkb}i4g;`og_-AnWYJ*!&OaA z;e|v-XPl9aRP4e2QfK);Kmq@hADjSh-Qj~x(H{Qhmg(cqK5A5bo48*u+@yMH>R$#1 z|9<0lh_4f<_nPH_0Aw7P4~rhoXFDbYNJ@IcpdGguI_E14w9VYB&R7|`M|7K!Jouku z^i`NeY`DzhFCn8CIk`cY^?xL#aIQ7mfr^@_58FC+rTj)ORM^ z(ZD!!L4~l&I(+C^es%)0=##};%_Mt_;39|%G{K$-L4B^>yNNtz(96`DMqcU*vUg^L z`nF`*lrAh*c@z@|?`ulk-pD%DuT?@|-unas%k z+LJtXs}+r319dwmwnA=p+j_bVdr2YEL#*Om=_(dtzCQAnnLc20*pdOAb5PYOFMn)0 zs%b@a1BJ3Z=u{8$5PYP$>y`4UTg@N5A6$Qr6CZy1TAwJ5G$1T|inugvT)n3#fGO=&{7v2XCgsn0{q z{K*tFaUh?xa?+?PKeH_Q8BRf^RBNeHh!l$_C)QY$rd9EEn#A3NyBiv+m(Lo>cP#_0 zB~!+lww$8|0a2?NjZhq&7H$sCl}TzvR)dl_oiiZ8#PE*bTq0R0jxF7z!R0T z^tbNJ)jMv5`ay{?x`E3O-J_vN?%mJi0z=gYUkwMpsw?c|W;0d!?QS1bi>Li;;hMyh zuEo(EEBfyB+}Do1ZD`14ixCr#Ekr^&iMZbH7v!OaZ-0rvIrt?4N7wW5KP5w(v5Dmm zqs(WH?&%#wY_-a?jigFVMgS-Qc5aJjlG8%Q4}~$2?d1z!$Nl4*KVgJck`CRgU(mrT z#>BRrIPr6+_c^KUFpa23T)(#f9#8C-{@Z&WZ8}d8pj08>*}C)|yNT>hnw{q^BBWyZEeNGRPw~17gczY;ac8CVi%2cA{WB2>xO=q zQq}rN>*N4QyI)S}5NUgPXR5w&_sw%U{-c)@o1bpg&$*>-Q-iZIAm9q%`_QKR>1o6T zKIBtmsR|SjX+EYgDjXGJbIQ?lWxz6R@S7E(s{12OlIfj1TJqsrV2w=G`B{jhtd@G{ zfD_w1wrTDP=hE_CXQQ=?`BHiU!YLy&;swA?lUrxeiCs*GSGdJTZ;jalRBVUC<4u~m z4Iok(vyvj>qsE|UwNd!6%TOMQLgD1RnwoVID_2rAUtut4IU!n5X1Xkti`I}TTT9)k zl@gmfpe)|4snHYp!m+{a&alSdbZ4}iXVLa|MpVAvxa|k0k(gc>f0pJKj%irvq`{6M ztm6UKaByDUnCm=v`v|(z{oWXtHn(*y7e+r7Z84oTZCyRc-xx$TepuvJAf&U~;Gi(C09zlCKEU|#5%tmk$oH!unpFKDc85B)~D^CyhHFb!C; zxsSf4e3(=@KeBYxqaclM$?GaLs|`k^*YoU4jP z0-2mUSuv?_CWMRNds%(nb1F%1I2Z2aJc&-6YoYh5S=NdsTJYf|-QNoL{`k8e#ldm$ z=+(m&bhVXasiAz;;kVO1vStgpPlbBNedAr@>+}6I1HN!f0?Z^suR_6ho1IleOK8T9 zJ?P~b;xz0bDNEu&oE>Ltu_u^IWNfaOkzbn5tFQFqcfHJ)epu#}B5(QHDn{Un@59

#}I|DBlW4$@HoKhs`Xifk(_5A!>gTFdmU1&Qx)q zr}oe+S%^_pHURbgU1I+Y)?nysX}PjGP%BS0E2qMsKQG&D-)jKwgUzh-@QWRPhm02L zI22kA>9LGR6Qfh8a4t5H0-qxnBI`6Vfqr)Qkec_QuRDOkj`SmRzx)1^rQ#j6U>S=- zKl7lfO@pI>IEH{;`*kXlMaN_^3)U)johvhE(a1Gn17Djr>1@R5Vuz?fHsCY}Qup%0 zayTY%!a?qd>$zg$Abqh*G{>9Gr@A(k-b(v*W%);EpP?&^|ELicKwHT8d?(kuUhGWV zq-nK}l62dr+g`c3gdp$jaG3qKY_Gu#@dyeo-S=K;3RQB5iI)HVu_4 zSQ~k*Yg8bmvi{t1;=wd z+cxh*F5VCM=|pK5X20l@#z_f{yT=*zTET;>SM=p&FdeQHF0_RR3$fTS<4fjd?;ur zu#_hLg#$Q5iac5c-uhK;j=l6NVXU1ADo@|c!%p8(c9jO%olTSA8uk*xL>~1^0C=>o zMKp_JHKHaTB~p`I5W?k*!q1eYoQhr@$QcAvTRXgeO+3BBLaR!8)>A~TfDY`k5ZU~- zbPkRn!<(?r>i*Mq9!>PXv277hp(dM_F(^FzgrHctQ-_?g1l8*da)>kt8r;(~A^Ag% z%jRAM?JGGIRUL7yK8@da{C_iG7iMFw?g4WGDw>Rv9ektjG!U9S8D{!P5T1qD&&Ii@ zZ<2Q5!lf#v{0w|$KxKFYogK+|nU^~EoKx;3$o*Ta(r^^=YDkVYmB>b4xR%Lz@j~5y zcRCC(-F%si+z1t|_i0sF?->j}&7@r*qLxYRgljECP94AY-@1JHierGJ?9y!JQ7tR- zB5{Dn|Re0wD*=(P4_1U80(a3?_-j$}>=E5w7=ogM-n`jMN^^3s{ zUpSaqQCWAc3=aLH2KB#JaG_xQ-<5xRGyMyPTZkOHO*Y7Z?xk3^xnqx-RV;i`y)<;W zyU8ZHu{a42db?cAsT!W}hyT|74^;zs9fe*BU>wG2tO}cyZi#+6G2nh!xzoA$>dtI=`j2oMH= z0MQ&*Isr^?F_D=dQcfoj*o1 zFxuKP`@RcI9dSbkdMO`5VgGEsFm#g z_WsE6f0dZ@)&H+V&!$(ru;jz`$#nEItjcyd4cQe49SotHsJcK6Y@7Qx|@HB9gyxBv~g}8uee&#KnaPu>ZWZJE0x>h0DoE z>)vwz>d{q;zC)zWWX#8;fH(hgC-8m+}b8WjU98Go|qSLK#GGo zoLk#nSU047^3z0aI#wpj&H0&oWjFs}_W6nLAK_(Um(7g)(qu15+S{cl4fU=S4;ojQ z|Ej;AY|UK_T4v7})2(KV0u%`zHpM9R;vCMe{o8h-Uxi(5;O3xe3fd!Qu4}H&^hI+jo;D>8hx8%}vnVm7p+PX* zKv~KBb4Y}%zX z8OLUW#iGkAo_w3k?-JeL zv9<0nS3nvkGJ5Un0Ncm@#v&^!gB`cs^4YJ=%6ERL%3`a>Qf|7~St+MQWw=Rf>tMmf zXJ4EQz59v24K>oy3bneLQiTL9d(lJQ_?Roi3-%;<4dNB=@d_ID2KcTo?K-nFKFWux zZi7}HE$p&qqq|q8h{H=hy!zXGXYHo~;I*&duY}_TQPM2fTy^ToT&ba~L}-6$1*Q%b zbX(0;7D3K(a`PZ4De(v?x2HScp}*nFqGA?WT6!#nEHt*}lcn9l!E&IhP&4y=XD`;p z#>RC#z(MVguMgNz=qe)zz}1{E{GR4ckG5qB@4eW~smFbT+5hl34*PPfaN^ZY5TkPZ zt%Q#R*S{Nez#Kfy8Vi^_-9b8gkStFTAi?eN*#hWYgEJOMy{M4!QdW`<>5hy-{%lj} zPP0>5uT=~2z~u3Ch>(b&CkZ(~ha*%|yK++iZ9Z426$XTES-dw=Da*eMgr7brKH+46 z_R>nW?&$t<42{J03LKe155CvXvHlQ#e{KQ&@MzL%%fC>>Cx$v=mF=D@EGc&9gkFKv zk4ivb#AGVdAL`|dOHBq3ziu9U|M7H#mMi!`=9cK7 z_vMHmWI%|~74eF_R0ZPY&IUBx$)m#8nQ+U55Iz)z>tMcF(d!1r=IxLZ0+zYd*FaM95Yavc5vm!CGL857DL1Qjl1} zbvLrc+Wz#%xwr*+Xv7x8Q9&=jeD5e}Lbe;2we|MMD&3v zRQHc9wSHf{a;a-b9{CzS=?IVb?a8F%hY>_aGTny#Mp+{<44t~b&3K7Q50k2Y%X1f2M$!T19`K48CH*FCoV-QDnzKt5l=NF64P$l@ftEElPsg zm7?UUbE3^eRfS6^gjVHZCQy_$hYL zvm?3T0fTuw>Un!DtNMP^+BL0Jg1RiYbDW`bxrH;<{pC4!!WrCt+I={K8dP`R#NgtH z$A(FA{2#h$nx3UoF8v@9k6IG3!ubsx(`eWLP4`LNK77@y)z7zG|IV2&Bd(o)bs8W< zuZO`Y%K6Bk1WZO|%UZ&Uh_tVz|M{MpuiB~!arfJiAvOKuQZAQZ@zvl9A~Ps}bqQie zLE|YQL-PwOV5W*4A*aQ%O^9Xij)bEGY(!`5nMJrc0h8Z1Y6cUEmf_PK%{vm9THRie zFI?{>mRCs_)?T^B4bwaSoFD(k=NTy?fX7LdJE;lY=cbP~w?S9;HEg~1WT=zs!IR5F z4Z<ptCoRo`7XWp4$Ol8!+xs_3^2!rG*C zw5qf}ha52-9f?j(cqa_s(j>qc+dZ?^@Mu4ZCDl;AOF5KQ_|fj6>jkNoZwuGhZ&DRr z2B*#waTss5Mk$^GQj;gRGx6@q>N#suAGO!t2WtH^tHc-8KAR_ZaD1bErP>v0 zuUJnm^B+^R#k++43L4rPr(v99(ZoqJIs$RR7Hhue|<8TJn2(eH;jbe z1zRk--x)@jTqJ!b?()2AG*{x>7cO2%N41{2n2fk1v{*J~0q@MC!}3!WYH+(kq^p2= zp*$H0Cz(-sVe4`^;wExdpiYHX^|7se9uM=<;uUxd=OA}gI#sG#0EdD%yATc^2f$pj zm!A)-ys{$TZn{%+lr?f5J+I$Roh-pRiI-0k#kuot4=TR|>zY`LPX;7i{rw1wkiTcc z_yk7}G^a*UYkBd01?lD7I@j(Ij@MbRbPvxu?mlHWaOdAFVm+hW<{Nm) zddqZrUE#FXhkER#@3$_$-wfk2{hn)j`^9>UGZ~rYxY>yHT2b?^locd^ z0+yF&FxFyNk6DDw@{EB6W%+g6ycBn%$|9>Exx0YBNxkfh>93>T$Jg@0I4F#Upy5u{ z{O}5;As!K6pL%BqB^umy*JR)C~95sI%IvM`6nH?boH@W1m z3rh0Z*E-{`L(QV(w@&7#1CV^r>sVMxq?%gfqO-`YBI@z#K?v<>R$hDIjZmuEGsYU8 z`38SLj=KREL8+EaJb47{D43etF=+nO?vHD1oJgJ-w`C2k7FryeS)8_TUS{Zhg1 zc001Dr`39zmM^4gNn$!$OTOP(bccgaJ?PZ@Ku=mLz`sFp>JezRqGC#*qjxhlhb?5a zyV$l8{G-nvR@{>W8?CS+6~r)YX;UfzTS`V}jyh`^roAAig>6-c!Xd=x(S zj5W#JNjlDd_K)mcR8B86FYKWC*4r=zreWG4_6L`uB4epy;~(lgDTomcAD3vF4!@R{)BPXq%$=fT3vQL`>KUeN%7QCs;X_J6JUf1brmdiupy7%JYI zs(%6LsXGV^_ycMNwH@k&tnD)}#b_OlH9$YNqVKd4kYGP|oYkiSGVL`K|f-=RUOp zDQ%@;EqvaIGCLzk-fJ1$NzG+svoO(YPDe3H>xAr$bTv828=e^+S~o@%~r)jUtM$v4Xr(r!&NnfnMn6iH)^ zRth#uMbiWTz#qOPplblCCzBMkwlg29s+Kv2*>#J>ouTJqSlA#=n36HB5 zZteYmO#!!$+f_-zSc0j2N=hI6x|Qu0iS`Peo`FB4 zZt>;#?Py#Ag)0~dyLh{TvNW+u!*i{@V`9NXCnbJHrJg2U+MVtdyB`yoB^9b&)?Skk zv0{%rMvafQ(2r^a-?0(lq)lF3Q&-Y&vAi!+vdFjivTeL)7KAMQ% zs;94}K^bq5cUAsRC)W;Jzh22Jo|V|LFiW<)pA4x=^xxCBOOnx_r`uk|f)U$rc&kJ5 z5#5oH(`py&2dr8Xgp|6UN(yvygGK6;RMw_Ha<_j7UZ?3wiyQwq-p<`|8yA)a%6f9E zRDK7yYcbMPoqQ&{23eq}?9gT+ghq;CG-760*H{DA4Q}MmO?F~ZP2zfa0yf>ll@NU< zyUk6j7)UIt{mmD^S@3u?v6;4dXC+eoK6k<&hp^CryuL%wVcMDaH;@0#?C^8$aTALI zHS?+MpY6_$JV!4J+?^MGI=9F5>dse|dz6lq%v`Kbv~{)j7cRk)L2rdwEV=)^m!)-e zZAD?|_l2DOhP;``=m<1_cg>H&8 zOWhfYi7u?&@F-8+xWGzZZiRd;ZV#q|0csK)eTJ} zsoJO@ir(QtV>90)t$Rm0db4|`*4^G$U53@hekQJI2t&a484V6A@E2Iq=+8O{;6t5y zuOw)AKkjO5-Lbq@mHO#?XMI~v%GR{Mdqy;=>uMt6mi$E zUO=VT)aav+)hAz8Rws%n~!pj0Tp?^=TuD|_cK zB?ZfH{Cq}E>4*k0aI&+jtcQR9Y~~EFFKtDB*c{Ki48MEvn)&l}iQvUno~->cHS|0i zzu90%pzCEnJkj(_EMvFKk!Mmvbk52{qOAxDS79H6I+KPT=&E(FRSoZUGc~Y`AVYCv z0OL+maO4&K$}0?!bnDy4L0!tb9fyVdmVUEqrjn*0B=+1%ND?m+UF}mX74s759LaCl zJOgkce8TUBO{q<+3=Ip)hwoG+>s|lUMTO>zTU$!-nv z&-(Sp@wXBhg?h+k&M^f{@KU%-V#B7KPTW@VaP2{-rZF0%%6xS#@K?=(C$E>|ZS96;XN~(Sk>Ys?D3VA# z>qc*N>Orr1Ps`_!;FCtgF`_JYG@}Qzb{wpSCa1Wx7bY=4AcH)_eVW54YOdI*TgVmz z%Bd#U&CY>SBH5!AxGed@Fm?0wcFPb$V6{V;ZWDijJIu8eNmi-^@A!)q&tV(a{>G0! z{hx4g+|zd3y-&~AC+c1Oq}nJO^l;$Hon=wA-_I0qorCf=LusuJeh<-<&cL*+kLaXF zyuV@i-C5jWl2VSmOJW*ArIY+x`g8Mfr@T&`9nxKYCGxC$V=ni9@**&=4(b2PEUiIS zSjUB~iWq$1suItAz2mWa@~xD6I3aJf_2&-qgMYd5ufsErzrdVtd$|?A_v*rEF4daX z;%0pscDg<4S5FTs+U{q>S@cuL4oIyw3yQ-0FSoc(@r*YX8>)hN{NQ}kjsPC2T%c+-p})%Oa{?bR(2H+TKm3mrB6<- zh8~}@vOhDlc^7)0u^{<6iOyTovwK%ze3>0eXJIWUD|tRK2Lejb8*CXIYBOV%b_*>q z$k0;u7=rVQ8*PX4c^gEfHO5vc6A^^eYa;jnH4XSlPj> zmujAj)z8}&4vnA8zDM>tknd0194E4TH}}5&dW1iVZept?)a5CwEnh9Ehbrq}2u)M~ zuz*ZO8HFzF4sVzIqEv)m#?j9$%wa-9Nqk42lwJV&)Wa8#{}KYx+a^LvWa~Fxd@V?g zKKmqYZ9E>D#GPkhx?XN$lGtD!I&}2l`8>tnGPuN<9{vW^90-uQKB<7m=-@x=tkDdU zk7;hv`2nP=^-I4EXz;OIKlB652!|E>?l#sejrlG@*Pnmkx=)X^sC-7bplXsZ^Jvdd zC$ipNj2VHGDP^N4`&wbDw;BxkRLspBD1po=JM)k_$)!90r_vny!eL346wV+L9l;i zVJR_*FnSkcpeS)E4cy?&j*OxE7s#gagwwfkwl~Q>iwjw7?)I5E4p5R+h|dyN{y4|r zdG+0257HmWau|qnJx;q<7EC3B_d_+aYq^^vy;AL)zi|EW-T~j*jDD9GrrclDj2SI( zXUUnN$@3MT%W4r+n~#eq(QPFoTnUo0pOPOaUt(QC^aFS7eORou$r1yv&`SHO0jLzbm0Xgds%}@?*lLe*m8gEZas12AJi` zcRHlUr}&;Vjg;^b8OP5oQnN$IvRqkQBa`cgB5=3zc7Iy~;enAy(Ldu03D2uPD&OcD zQR*lyJ@Z3Af3N9aP^W6jctMxnkb|4ET35Rf(r_Z0(T}8L18xOlJU5oRPsb(F4@{4&Y6b^cZhm^(@FexxjtR}w(C+oge>T*0+ z{4`0;-^^;(ME-?5EtBp0DQT=s*cO|bWU=Si3xWz>ywJ;YAaOM$RhYBx%VDOj)${Eixo_-Ju&S5H z>f<>_P2Bs3$>BH7XQ@{D7}~qPo1@Faf;?00*bVLEP}qjn`?2h8Mpc1OESWMwZJ89~We2Gu^fV^x5ArEsabb zw8j*t@mtL>Y<9$xpkoYEgFqv=Ta0^-y7tSLxfi<}NH;2OwobyEI2BKrygIfwm_GW( z44dXa;!jon?{b&dANUL^#Xa(?w-C8K9#~O20Jb3y)=8n$ya}Pyi*fo3g6{rx)rt${ z)dk*pV!48Xj!^e!ea`KPhlk@V!}dYPo))Jt^~lPGUWM1=RkrauPp$kkb5zO2`cJZ` z14ZDhI{1dFz+3@{=znaEsgu6ZLzmD5S2{yuP}``(CcP{z!szZ61D|h`-#oRi3i}^X zJWuRPM&ab18s&d&;Hrl`NR)c|U=u~j6OUnXc;)L4Sb_DO)V|qno@C2Q7BGgmKf!rD zy%oMg|4!>Mmy>z{YBk2H<6vdXy@P`IY3Lv$Zzi=gDn1}rASgi4jlg|<)vsjrr`PQR*TGtcYY&)f^jU<%qM_3vmrC ziuGtp4MpEAOz8Rr{0Jv3dEv?xgpKKvPu8bHc)Mh?+^ZoKx;aq(URVsq%ZLnx@fL6X(N9cD4I>?X1_<;@m6}`>rLv1i)Z+O?%!OC|A~;icrBa3pCWmN2|)I z#W_sErO*Q{&5YJA|EZPq9=6Hi)t6Qke^|O&UzG{#qF+e<1p?=85~VwIADqgMnKrRo+P`{Jvj!A5 zn%gFekB+Dzzvn#WI_($^;0qTsC9`iFsbEtg_AECT~V)a{5+sMvSqPpHj zkEWAb8ea(+p)NwChE!2n5`e*Aw|LnVC?;L;F&w40Zyq(@EMNAK_`)SMsh7Q@E8vAE z&uH$J?w;B3hjyZWLr>Dc#_d2lNk);aBOJLI)_m@{Cquv{G7Si+x4G7m)*1=|;7a3) zRympQ0E;;v1jJrviW8J+Ggd;4WA=6ojSe;7DOe2bL{Gb3e!<5k4#IcXWQAqGFY(rJ zQU9oqz9^AB&mBc^@t<+-2%%DO>4^4DP8=8k&4%yc8GE`=&I=R z%#kCq0Q%XuchSKf$w^G7gW0m{QO!wd#F)7u%XbHho<(1{LWd>_QH!Nhyfhj+?Rlt_ zi6ei3uA`i;^AwSd;8Y7o44FNXo{7ozsXbS=>j(^A<)P5?ZJ%(sWADb1*!96`mD(>{ za^V0DP4}CYJ#7Dx?zHeh%6Bmfq47aJpZB%XO}DUzD~v_E-I~hGn4$S>se7hWgYFb6 zZ2dTJj#Xb$k5=HfFK49AeIop zf-HWkM3*>!@3{s-KLi5jz0q|>uOv)kz%!!UB+F@E4nQwmaK@AFPtz}2>v)IJRW>!G z=aA@EU$~4Ntn6Ythzz3P^6(t-IOtZ4Oiqjc&jqd5m$DXs@i8yH{_sB#0C?f&9b=Ox zjS2G^V_zE3)Vf4=`{ao>)cu2KL6U{k4{97}rSif78&F^0ZA$qcvM}H-+6drlQUe{Y zeUjZRD;iG(M{cY%Ytn!DXWiew2+d!Irxbrjs|w_L4>7}=ReR7uGO9M(x-@^IgFzJg zmnG51=oa5WZr%ZJc5vq$)8(J^=3g6cYXOOH4vmq!B|rvSTFwRZ-wppKY@NoS`T8CG z*^?XS!TDv~YTL%^#nF++M&i4XvDPCI?}f*(p#@ST^5$1E|F{`qj_W$uZ7T6bJvi-W zwODGpd<=PHYNtUA*-ytBS5>VWR~Ugf7&@;g8H-++IYq@~2*DYvdxlp&4D0+dDMQTI zzBB*;(59{%-7`6jXJ@G?yJBXLn!(PDjy|G)@%+T=)B{Rg zQD{9}(QiHtp6g@k;y!_~c~Y`R(i~g^t9p3{1EPopOm@9yJ^s6iGLaGhG2_BW;>p%b zf+VWb6Qrl!FutbkFycw{p$spvPL&Xm5ym;mMd)6G18AzC z$YPTWaRNT7_1oVK@QM$ue&L$Jt$*Q~$Voi0dGt^2_y534_Ebq=+0;UzW+_~F8Y0o* z)b8VtfFOOhG_ENaEKdTto-q_f)ng3`I2D=uoz#zib?B0+eWuf>aDsP=QZr;s{;dp% z&igD@k4T-|`ZOVJqqzJV;UE&iu}G6|sHqfh6J+r|fqn5=s*wh`;7P@&BA4 z-gC{n@{ZGUd?EXi6rF#Ul-fTm|y^|-9Hr|I|$VvuISe&>b$yo;?#5NeD})gg$22S8!q z-^%^{eL&G@YKMi|p@f>Wvj&rWIpGE}C-?t@67XU@loN1t-))#5^x+BH%*?6YOyqo* zzV}YLhUO62aY`b4(`QyciBce?Fm?N{KK)QW5`{yI%T&pWk>00Gdge0V!{yz=d84ah zZ|L#{92eibb0PW7M&%xjE$+3sM23B8)dKc;4_vpGyA9u1xSnGa8+o?|Bxp!ws;n*P zh;OeO)dr`+KkSRRm#Q(U%d=EDy!PfM!t&qLjmf~^u9`mmb~ytLx*5+p|>p!sX^ItV?SR#L;(YmbVtzy#pfXmB*MMZ~5d&p4+X8 zpo}J1+ievJvjH;LMrXYpYMHTGbo#>eK;ORkNrl53W_2zVfEgg(8l*S7SCFas!jm<+ zN*}d9+vOHkZ81%i?VKt}LdVBnxXOPXbJ8{hyOx!-Z4XbHB*MGq?tzmAWYanw#nW9- z4NP)^!HGn72cf^3iW9w$h1LV?O|J|zQT2*}^+*z1SSFEgx5Yo?q<{1v7a)dGwhZ(C z!sS>lb+e%orITO;>Lkl3%$IRekkSYLO^*ILJ$3uN%rewVx99xF^G7?T|Oj zzo@Re_w+ER0BIQKz~Hu*63?AhBX(tfZ}QvUt;iUa^&XB4uL4Rp|Az6`f36FF?cc@Q zdJ){a@|vIkH=FUrv473#Qad2Rr%cWxy03(U8xEmOqy0WF+sAlvNC1w z?e8@H$v_t0&>|b8nGqSNr+=4pfV39w z7Iv4>yF!L(NPl)xSo*|!p=S{p3egb0k|`*1)c$TqZy^y<$Qtn3%YNk_o5V5NH`+9c z!%gs-N&=WO2IJ%XYxy;UEY`*b;3O^|bt`!@biD!PQ-8q6lx%yCiU0l`1dvrsAq%pO z-Pn*herwR6>4p$J9lTXiaUT@Wu&OE0tN$X7`=9!f;_E^b-4>Z6EV-)znQ-O+!u z=N$E`GKV0Uiw$0DO<|fUvb|&+;8HN{Eq7<_1qYSWotrUMC?6c9eFG#VyqL> zAUkoOMS-ZAdVF%^O-xJ`nDvFvSh%2M;Ztf{r@M&6v?pn(#l?)Wva-T}8nA4CTzouu zoUMTq6BEPZxAgCPZS<6Y?%fr2+xZFY|gqp`{{s+yYM!OZQ7fhuCa&}KD zDBWxOeY|V<3R}(B9uaRpHqu!wZWX(&R3#`F`D6&dq0{r;srOP?^&+%#Yu_q)uC%hG ztDL#g^2l;0qHEB5(GR7*oypd#Ji8Z7zVp|UJp2D^5_7I^zKyn74It;|*b!=(A~m*4 zwrErBCoyiCP5YfZNhjBaoHVF0mEsyXtGu{SW8u-ip2;_$vS8tSn98BpAms=ge%8Pz zZ&G!kS;n|k9~VAM>;p)_zS&?8y_?Ef_xX$jbzy96Gmd4#cHAVY0=5T?bR{tm7BuZ< zM``n3{C&NOhkrH7^>3#Be@Ek|4uRbJWfNQ8U8+3K8dZ7vht@Z}YhT@ZeCpiCm5gVN z4^fx!u{UW_9S_^(A0TX&xWgZoJcopcnl^Xgy@?w)7mriBd*Z(x=lX7yx9;$HL^5^V z7Qdp3m!*>Hjt$HNIwcLNWnPd2W_+#rSXsMOx@B=VZ^}lcBHEVDVr0drhJD`Zhe5Qd z-WKXxIU8wh$v)810^d-LxPAB7_LYW{4%l&LA47ym}dX zMo4E!QL}w6Tp8SvZzB^O9lcHyqDHU+>oqsc0XKW7dXEUM3Q)| zCflTxJ_`AD;Vct{{6BVLw5c*)rJS8sV&H{j5u`1ft-sx*afs}!;bUVf4Y9^;I*`t4 zl}b;x9`4SY_`3KVyc4VvsInyY_7ChM+W8L* zNw0nmuCO6%uis{`pZ9PZu~9*e4OQr|Blao*H4IT%n=m+4Wl#x7ZfR+?%0gvEt>maEQ4tT>XXUm9$3U_M5DDcyVfHeE$rRJXU@aUy!QB*FW?Y zME8#Gg)K`GT=gp);08v7er=a~9O6d+5X$~(NmXsJ8%O0crp-C7$1t)k2dXp3bLH09 zHlv}OND=9wov*!zU_beJ zvxP~tQ+AxrdqS4RZ<54~#OltCNB7LtV;kVS9gX-Q?E6RSa>*~1TICplRh2%%8-!QS?XVz=Hh(TS#NT#2??I@?z<_=&!J565-7fyn^M*N7O(H$s|Tvt>v_9v;~uG^-zndfz~8#&6W+L zfRJ3*>ix^SWvbu$Y3IQX3_$v2lENREfxHjIZok%Eq+LgR;rccnSTXqa57U<`;0_sE zb-FC2E@zM!*#oQ2^Ay!zg{^kw3Kl!sX-pxszdx}4^CCJdtz0VC6r~f7X9+W%`t+QDxUN~Hnv8h@QR+6%4xJ>F zX8NrFh1AvVz1RsYNxbb}ukjR<2N>-P&cf)uUyW&b zK`L|1Kj+QQ9<1kMd20AZfeK(q1_t$e@9F@&PYnYUEB2l#`V?NbqdQ}=Y(Lk z(ZRK>jy?F@v$8-nF{$OuzalDdah>|{_ton*EYuJMez|CJ6|}Qs6Q(9oUV^#h9k!-p zRZFw#7iEgcPS&uhi@WRf@1*<=h~s5($oA8VgAyfg8i!y=2f}D&{b)tioroWC!S!inogcoPv7`kC+L5zi zOhfH$n437N4F1B+mx5?2qi7a|zq9VXk}8yPvrjjY6FDdk_x04$;Y)yGO98)g<~|(& zJBJOrVI9P81UB!qPwPDkvnAWu*a&!(&X*OGl>8DcbpJz(vpB#hHw=Uo#6q~QoEcj5 z^-`cmLhR`Fc5ZGMWnE?I`0EQKbBMl^_!}Mb3*)TSb4A3)kLk|4raivWMZR)32+moZ zIYS!;S^!kwkAQ#7bVO}z*5S>^YSz0yu>!wvEh4F?kbb0qd$XupnDb=Dr&-RWl;Saf z|7$1?J_(=&GKsC~v6XFZCGDiSCux7|3yn%|;IB8xZTmV(p%dVNr$@$;5R#4(6uip8 z)9OfLTPadND+P|zV)@XuBd4|Ti3&PyKX8rN-hkGW;7TV7oAg9hN3L#JwccV z#T!*E`^(zV!Tk_uSB%AY(4VUJKVfYnGz?PPTM&-6$fuu%>iE6Wb_OQPgeDyc5*BC= zd`kG?O+~ev^U-xo*?O3VDew-S2B-i0ju`5kFVIu2f{b-F>^i`e0yd-65S1|NJVv$I z!D|rcyw~c;(hcT=FgHo7%wo*B8$S%hn+?P-u9eBwjGIb;If2UJm1#Rta4R=l0aA&l zqm#GBJ6BX@`DGmTZhFl2Ar7Y_IaYN=2y>ba z{&}{n%*ni@Y4XdTfqf{T41ObFMUTZ zP4A>+%4q+?joL#nJfyy8O87W(gx0D32^aW$AvONp4)?>7x(67!WP(~4>1t(~b&)?| zHYsd1G_{+P$0->Y8|c4gQ^MUn)y)zXe-)rF+W_zEeXwwG=}&3-Hx&!;LSlm2T<|*2c#qK zwoHgrE_a@Rw|@z=FVuc3y*gBp>J+^-GQBUI$9)3#i`tmh6}IoqejBKDkC#R;3ftaD zXug>!_;L9inGWl(E5J`biu7^}AZF5e>6JTknJ3Cg+P(8_C5EK3KlWeN=2nhT@ze#? z=QM-{MCevYm)4QH^5^_{tXsA_l;W1B;}$}rQp7Jm2A~jm-d{4m4TXK^{5cg5M3N!B zp>S0IuNJ@wbXt_fvmk$>6Dle7Nt#6Am9%q)^$fBXE|x*wfYxZvUJWH5S1=m4;FLg9 zek`Umk8pI&=qG&h{1~Ap)X_yZBQR7e$gExr&79?JuNR3#X@?UrStU=TYY&ysCumO{ z8w%MnJ*c}A}1KC_ivgaArg$jKR{p_bS{9U+V)=FAKJuWlaSjqsnt^a_B|Cy2;wjbP@7m{?Z zV1(lHp;DyINWmB6m3uc3C06pZ_55B%D0hXC44TkM7l@$;gFgXM$8~PxL9O_;p$jkj z;a`I-0Mev|5;!Liduzma{hqH_F#j8`(4mi}VreGpo!8@U@A!h>v^KbOW3R&|8szmepOoUvQ1(AXno$~h} zp`Nx!&$MZq8qO9aB|Db$A3d>8@V=n4nTcfSAnS5ZsP$Y z_l?A`4_1Q-BISI!!$O0~4c(b;=I9>s$cN#(_c(PinY`BKd1#lpq|R+izpZBXL+P4O z4JWyIPD>C?BXbqNoM(T~OOu}YWeFR992h!+I*t%6pOw3c0EQaao(8j4YVrW|L+>;M1UeI+_I>_rkGxYwhoitWp<;GDX>nxv*ip94^v zrZWdo26OquWkw2mWMJ7yQyx#ENBsvsy z$a=b1dsI9!tg_~GH*u`W#tCD80^}q0BFc@ELM*ej9Jd;3Rfl)dUEO+t8)M_Orx}Uo zrjJ=X)Jz6J)6Q<_U^~2j|M28;DjXgJUkpA1{HYJzrws1=d9P&aJjxG)h~SNOdjUOB*sq$5=J^GCHF{g5AW87YLy=J^-)wTtrlQGaG?^mu#!C3 zA*PL-XcUptJ}L5GblQfNzmVweL%${Czw8+k=LYsInwT~akfI|W7-pLfZT4CK(9`i( z1O2w@U3Am1SQcx5BWKmDv$+V@< z!&>^bIbz!YOF|kZ4TlO){yD&0GRVuU&F$S)y^gO*z#sp29-fOWzQHX=cI;spyDwZC z=OM ztZRStw1oL9b=G9fRT>x={HZu^Dt|EW8=_u+H@~A1N(*pXxTKTZ?OWOapW0Q^*^<7d zq-!L3v5c}H)JUj}(AL4J>PfTh%MVl-I;D8u>3)ZN_CLT9Y0vhipElIg?UcB;u}MY& zC&H78-)OxKHrR~0c(xNyjt<(cyx8%*DOu2xgK*w8%49Y_jivU)Sik z-E?lVsCr>X54PmxIr5!}uYxJeXZTE%=Y&^Cm$lXjxJGxioP}YUTi!APBpQ{0TRtb3D9L>-w3(NVIvKA*9jU;$-lfqv#ljjd?8v0_W>wS+^b%k(N*g}0?6^!T_xBH z*0yaK2KUfmPHq*87-3EGwj#}VSo?XLdz^)vpYHthN1oQVbu%HtG#=K1P;TofwO?hkqAC^=L6rzD8G8N<@_P z!YqOzH09Rh*n`+tBUye?J&*D)37|D68&fxtIV8WO4^pSfIGZ?WJon;D1L zl(?^YbEBcVZ;#Fm?JA8yPcj5G-!07Vs8&!5Ex^30zl_RP z!k^EVx0kT!$NsU;yb@&1o6I=8HEgKrN%bsC`F)pD?<=N-%PWs>Twfky&%v0l30jJ7 z&Po{N=oXx*cqC&wGtQO`TN%mBLAUdM;j(JZ17e`td4OfJGArcVtl0X_z51iPTs7^+ zbMPZmRFwQ;r}VyTHm{~J(K{ZYDb0PjNwla-##+Akyom1Q9;mf0p=J;<{@v}cTVY*+1vU)D1{@T_#Ya-zV5!v#U(O?GJ zH!=_P9U6*JnZ-)NKl~Bb;uoF@1e8fwV)`PjOY@6lY#vbMbo3c2~KTXM5*~)=)e^3vZ^yDl|L#Xb8 zEWgS2)!F=@(A+f|97x95wgbRfkBF0bp;v#DJHZEZjuzdx{OagL5fzJdu%v98&78QN zJe1JAt{&Q{f_N$46)65=N$2+I`zxIx9V^# z_J6VW=HYB+|NpR=&P=D9jw)K~6s5I}68q9lEw!d8u|=3#E4Gplg6ecywJT~T+8_v` z)-+PIirAG1O(KliL#Vwd^W2@~^Zi`c@A~vR^Ld`@dj5Ex`;VUciqo^)=iKK$=ly=a zUN3Fo6D6e#dcg0rhXz$~st=XOZNZXpoYtr1crztceEzx zk_}j1ofFXx?EVTZ%Nb$i5JL=HH*f;4Nt2iWgEjl~*7-HTTb|=I?s15IWh8C18}pHE zI>-Afu>BW5c{pGaem{~V>%|Nz(NNl3TbW_qp$P4oZR?49p|z+M+fz*z#>n3-N+*sgnXT_uL-a%+C6FTH{#^!ss=|kp z+S~Sn%dq3nU`t4a$zo>swirzeLSJ@#k-vRHr%l?387Es9uq_xc=)A$MQz1ls{etE< z7mJbjF~nd#8C=As`}sOm-EVUnPW~`ZuMaY`-cL6^f0P+nOq}&wcy1Eqk_<*moS81T z{X&F~M)^v!ga47u8c=LI)(s#{#@jgX(DSa>qA;E5pZq&GWfQ* znw4vwGNgxX9yOhkdP*>K_V0>IGWL(jl?p*N7Jdo)qn0mDA(r*ZLFwql{`?U;GPix= zicvt)ySGvVLOOzPQ9_lOVxx*d*Lci;1?-6kEvJ{eh0i$hNKJ%iNy`?u6M;Y|B{hNk zE;$O-FFo-S@@u@7qM$<9I^j%DO3R0!Z<~MrXLqi=@ZWYAh$0Mqtl`n&6>EMb>@%NO zI34)Kxj!@fPjbQ*95)qKnOY*!;nJF6#Gk6}d`^oJh=_4QVP?c3-918HYlVz;S(udw|m<@tMe8CZ*Fc4bRw@w+c zG+W4;f_4{ly&eRN?>9M3X}gL{5kzTIounUZ@^w0re=ZBB`wp>q+9L3G#`XnQZ-B9V zg0{c+9NjA;ruOEz%U5I#rDi*une4QzS?zt45A?kX8!jMiy3uIgLU%{wBXmsgbTIW-jMuU^`Jrw zB^a5a4u9Ej_s^RC!PEp8bDPZHEM0{VaGk=tx!*vq^*dVJ8?H>MjENo6N`W|7pFB8S zI=d4x<6NTb~9tbHGtoLgUXIN~B}sdFX=7!Nv85J_j+u6!~zw>RQaG-o#u<4|lKH z&H}79=NXbSQYg6TTnXQoUE2w53@wfe%~rdler+0|m5f*(1z~WwlJt{j3E4Q$oI?I1 z78Vws5=I1aZ=p_|8wfRGY&`;BI~ETe*%Kp*k2hBW_GWc87lGKh6wZi7|Fksh56Wz` znhk)Zplh*{kFRE9Ij%Bg3n#?<-&8*>(eO$}JM5zezS$F*T)!}U-ec5R?j6345}bUj z-iGXrWp4*O942|$P*|~f&vr8F*9y!4&TQ(HXBxpm`{85TC3)a2>Y0*$8K1=_urP2) zBdz!#jYKalf80B8=I{GSabz(PckdV+AB~Mm%210tiV4jXg{bhm`#268B4q0xma<5e z1lKqzzHc|^AS;hY&QJav*gujli*Iu$3|#K4f4mC=jtZZHDt`as$NfZ`Ky<-d?_hbA z%BCAr4P?2%9K6nm!KrIexXb(cVL-(9 zM6C_cuZX^}pqc<`8=}-|YY(54-&ymoe;-ls5Jr?z$gKRTs`$x+0SAPN$m1$=8@BG_ zRFLTIVY!{0(bkqOQhBlg;3Dep;@Vg;3kO~HP*j7pBtAQ~o@D7mA5U(dRe%25KPdBe zLe)-Z$$sb1WacPCE!}uGURq`sQbsHxkL)zwxN@ojRs}E09#_t+fzF4`w(XwY5YFE( zL*B^(q}L>)x{*!4@tmRVY;SEwmQNH4V*>ToJ0jV7A0yKAa~8e<$gb0Bg&I2d9w5of z8VH6hZqgaxYqr#R;T73|?+r+)G@K957+_%FnTT9RgruYtUrbCJ+R)_NWTl8X)pov? zQgSH)LDuT2)BZCQ^M4-JKRBLCcT|xTO-^N}N0&oaF?;6~lh}$%=fPHOjVuqehAyo$ zwzs+^k{LGx7SpxmQd(g=hudn}zXD^ug*&GZP0K+`i3mW;`-$OO3(RE2^S*D29M@S^ zCtX_%0nn10!Vwo+&JkTi7{@ciwq80F3T_ZD_%&E#;cmFV zVhQUc_`P=S#!J1pO&a%M$pGxtG*+6L02t4IcAyTM7+@+G%@0 zp+RJ*T|eQl`H~&6z*o=UB`1K!^LN^!mYrOy9{*OZUPN;En3Z>;Lr%Izw~+mf35Tzb z%7xI?)~KpkbB2A>_Tzon5i%baPCDW(AixJf8v#S}&*u97jOG8_9Zi2tirA0b8(90o z?=s*R{|q@%tV+2O{4g-8Yqe(8a>wrwsQz)u3MDD==;z(z{-Lr6X0Q=2#B7)#?&|Y?$o~u_^Y7*kOE8C;%LHt zq|M@9^8en$d#lI3(E_)RL_MiG$MBkB9-W&7$4V=2cZ)}0FH z#0m8Md7cygmU}Ep6r|wY*f)oH;p25JZ+c`qZ+`hN^!-<`c9Rge{f5l;+QrM91%Q9H zegB)^cy5c|1z2`C#z(w|mw5N?x=2V}sH(eh!&ExT?i5+qL1fzzfC35O7lx14$Is7+ z?}FX&uYOR3yz+m}trV2^S^U)|M^gi8tR?m(AyF6v0GQri#-KT^W52B3&IOK!=!7lZlWz!;*un# zBb*NJo{)zK#|)2sLPLChA7H$i*w;Q1>4~T3;U~jNsFlfOZHRN}inecoeZYG?>lEh= zBov~(yzNh1`?L}82?`izvvw1Jv%{}HXa+5B79T`A=wJQz)c3-OibkqwxWD#-yiAo% ztc#f9*G5-wnhHST<)_@TPbqa%nqY$h5&4&g4WREk9G^BTkTS2^fCbc4YhF3ec1hQ$ zYYtL=q!eOj>qYYgpxQs@2M?_JoNvuxAj`|6aRklti1W?G+{83zTHYI9CzhIDq90@t;TDvcNoDogycLnb*~{C8CCYo17M7Rcf4;~* zy>6{1b~>Kfwq4DV1VVvTprx_fmsg)Hi0dWW=O^E=v(-=cnP0vz6P=-@V}^*fYD3~4 z#7oLgA+%h2X8?W|x#hzE1%&N!s$@|Y5mf((4xxT!am~SsB5fVgXWM)&U)pLGo<7(V zPs$hIyG*0q`i4)e;h18uWq%F(t09~7m-K}VQ%%}Fqz{>zi{3EbAbSKPZTly~x8doB z+)Rrax?%9(*dU*eTdd+sS74TE&vaU)--leTt;o+rFrd}d-Id|6{=6|tIq4+Y+asf~ zWz-^WA*h+IWzTSNdOV-@BNJ09awz+>g=m?@n(Tbh!-en%a{r( zEh!;iTAUQ%2W_6RVoq1CPW05KcvxoQITQK^KZxI6pf`x*1^c~#3*HlXObV?un~xAk z57Jse{DexbD|D46eDAD1PreRiSKpYXNBHmnX< z+x3YlOBM84>$s(dAVr zcOuY)QnnBx8q`TqVVQQu55AK8>5+5Uvjj};d0#H29Z}>Fj*#)KDK`6YI9+^;+_{Zh z_n!{J5jk1^;>3{i}Y-aXFnD z4)v)d0u1h?jHz-zw-Qz^s`@!G2=b=(sxsO&t6r8o$r`3Plie79>X3k zt{I8T{a~ovH zEr|~;UG6CtzdwFpbU_SmupHX*WMcWyo4@}2chk@AgI6gT=E{6Ki8bYV03zubLva~T zoo7zC%uhS}dn3|y{kyse6>O+FGQ@b(?*22LlgA#2D4iBiJ4NpEuuy)`ACS)1X9ERq z|IFttNV>^{;or_?A*ShBM3Wep_Y&whfn-w&^6_@_RUqK=D^Nl0^7hG=`Mu-7sgw|R zH$EF+*1JFG zpMOVs*y$EQLqJahDk8{nj^lk}Trd=Bzx%y}+L*)bRfl5;Z;zH{l#*k`F?82#!m(wR(Hb-Z~VsNUbcVcB*XfN`227SLoUkr(3Z{o;YN`1 zmRZ5z&s4-g)lFs}o-CNUpa=Cd4eza7w63mr`%IggaK}n5giqtpKb~Np8>)w^d6?gLEZauBQ-MXVh{qk?oXM`X=ko2@=>iu!-$&5^jvhxGXtfy+Urt+@mXZdwvNB+5b1! z=axf}7*^o5=j4H9RH(6^c~q`geND}t?c6Ta?v&)3iA65(>aOW5*Y8OxUwSV4{U5c9 z`q%Dz)m9l33(i0Kwsv@L*{}Fu(|j%a?z1QVP4jp@zqZ)*7y@R<5Y6C@Ra8|8m0Okh zRYsigpd;WlnpEj+mYR^%BH9Gl%&n%gKxg>x{?USO_h2hqa&Xl?1&{{eTmN9q%As4g zipt!)GSu)X0^CHq?7j*7e6Igj4le}`+Ra;?Q{NJ*Y`z;S_f!1<5=~d|U0)ke&F>Pf zQf)xU5xWNYY>r*{uln{`mz5F-p4!!h_qqbj{1qx_zhpaV?Jz&sVt9IBbvx1#hYXP; z%y@FjYSY{UptsF0|IvU8a|8x%d01S+J6MKc${gF+CADHJ5lF?ae{9gAMJe?K{rDTt ztn1Ibm_*ElZ}o+iP4?Ay)kmE?Yksm&H;ha!mD8oL_>x%*%B=yRbFVjU`bfIbA7 zXr%OzRf!4?(TRX~SrB~)O8tmnJWAhIIy`7)#wIbBfUEyb=KDYD=i{y8WMmgNt{08^ zKwn=X!?|liV=9Z%kUm`$O{I4>e@*WZ4Tt+sF3&8VK`8Z*R1w_#Z(dh#<`;(KqR_qT z?_=gvC;2YDr7Z*?7B@mJ=9IkNeD(Ua8;X|y1MRrm!;Xf@ z#Sk`cTmAmbPKbNtxjKfsrAhZG4>#nZ0({|h%Zt)U@N7{(OSW{9bD|r>X=XmASjIK0 zcTG~Y^*dXWGVNSK-bRMZnA)~L&{8d#kF>jm+hk}rL~F=ylrW-pl&*H{xok8&W#};B z$?>D)fT&g4O0s{%^C+}op=XHaR*4YExmb@4kUy=y51q#LSbZM*v1 z^5T>pN>R!(6qOvbX-9^3H$iQ7C_dcEJLALsRkzqVi`WCmBwx2wt0aGudTM`CvWaV+ z$znlRs_TaX7hjmMDdJvpx--MEiw`o`NoUsp!7*7|RW{*J(RjMRahNJ%F+?2)!W^sh zpAJrbypgpM+Y1hAOw_A{^80V9sJz>!f`n{PxfvPji%B?FUmL?TRPez#9i17>s2{A? zYj)TIEA+hCRjrY*(6)R^DPpAv5`!j^T_bjB2Et+e-qXKu^?RLab92Cs*yZY(iS>1> z4_4t1IiSRBasEd)*rlS|h70GQCPq?rUM5naF&~N$8@76UU2}$d4RH%(3p>ME*~hpv zev5aowVD5BntbL!^IgWpsKU~BE!xyYj*l2#c zeMXXv=O%S673c2<4>*TGL=gq(YoAc#g-;j&(9u?b%3G^jxXI?_op@*pT2)mT-?2`g zo*z}o6dnPk45{>tXq$!XD`jH?gwSOD$`$95UNPeCH71*oUClpV5gF%IutRS}tWAQW zLreBFZhAL_$ZwT@!cIo8&(0+QLE55y14nILgj8Frg6;9v-5uHsmxpcX)#Z&wc88iX zttE23N>tISqU{_jitNTO^%PkfSiN0Q^$6Sg^?_=C_S)o#t5afeHHu}XK}cjC4ByfF zjmJPJ_~EK>#_n^K%7FTzccW*gebq>fX!3~pFJs)S5db19oMDIB1%x{6JWVAFu7|)# zfY@EeYEf0ll8H$0ZGz6M&QymgO%r?4fT<&8UF&sFp7|J*7N zSIr!&{AlE{0Y&%eX0(f?j@Q+xDH(N6MkNq9ZEHnG%O$BTmg(w@Fwzkl9v;mmWBQo9 z#rGwiS70EcAxd#`UqF1Tl0Z*$597!27iAwWiuH&@5RukpRRsFmH;i&f8Sw%RtE#FQ zv)#QHve;w;@&5$pPBO78#WeNz8J0PP3u8WHRT3(pw0fbEhxA&HOw`&dAq8g}B;Kmz zF2Dki;T3Mmn17#JZ*p*YpucJlgAZ4&dE4F>uwVUQU{XSGHZD4vVS1vOW%TuVMV(Wc zKi!j|iu!`397k|c5WS+SFYC3-cUg1<2-Fu$@9^|e)kj`Tr=T417XZriA>oQwm+TxN z&nx1^90!E2&64zPt@2pGZ`ll0T%vLCYEGbLFP#sYo#Tq2J_d_= zMcdcwXCe=h4baNR-y=25PJpq4FfqlUYJ`W+lh`v%d+6Ckgxs}U{|d~A%!F-e%nYmD zFeqe$v?V4SCqqFkcgRGA*-2O~ZS<*lCD-z6PIY)@6nBG=hHVyenb!`i?u3sUpoJ1U zESTM#v3oT$aIlFbSQm(=MnGeoMmx4lui> zBwxI9EzK@zjcs=(=>`sn-XIS<_A&9UlCoG`O>lwIiNq1z4s$)+yT!IG#*Un4Rf^y@ zR8ywmwh6N+wsz`4_Xu(P(i)Dq*oenwROVaZH?v3rG)_C;VlSOyV+5-OpCL?phQ3dD zry_b*$!G_cL#ozA_C&iyBZss=wh6!JH#uFLORQH>uQ@6ocSFjXBIg)}a5wTz3X+b0 z!ME~`K+v=6%oSlaebY6_Ammi*)CMK4xPYLRrvXVL@d{TmRn(A{EGUnz*FeN3tj6Ts zZZqs%U+mTnM!l6+6=W5K_}ti$cdBrP-aGS_8dRcfT&*|OJ3HZl0gW@modBU3k&O}h*Jz~bwc+qEI zVF1$M0^m93%eGGgq~AzzkP?I7P0(y>d*>Sd&MiS5fy-IQK_s-*X-+pjD16b}k?!0) zWnnYdMyxlBJ*2_zxnj#@f73M`ZFTEK-%?uHa?_(-cS;F+DCC|-*^H2+-mTww&=UOhbtL{pJ#hv6+_%aIO26StnatX>;mssekwb(r#w}t~1x>TE9-nf4?U2L0&?x2}77!f^i z-^EYMsb&zN2<#Vw7yZi+^x>=hsUV2kxL$gao>sad8 z5gsYII>kG*)#4LE*e+rU>DkX1-o_PNSXs>*ND?o8!pQN(5!!c`TjHd_{x zK-Y|!>i0_iw)dSZpXN_3rG;P%x(jOH+X1C0B3KjYbO+I;c)%}@kTiSP6mPX@Tys`J zWSnSdTd#$?!y*LG`b!^dF8RR)-)$}V_b+QwwQ)H(Nf}qqKpQW<*JDM9N=q1didwXh zo%|{mTy`ek=2=5dP1w2oBqTz_T(YCD_*%O73kr3L5F8{Gve?`ao}WL;#Fr7XVv}-* zX8}zOUVRd8imKiZHTixycokh)qHK$3c+*Nwq~&W_U&~1P%^WksN_z?Z^d;AJ=F+l_ z?fRP1$5KK$%^m)xvcHcjC*!F&D_J?#)**u?g?jNPyzgx@!K4tYbvaWB`-~4$h1$74 z)Y`lm96ALunc57UF*I%`X)jk9vNEIOxFl=G+0J1W#S+U8vTkZEZ8H%M z_ClB3(GBXd!n1AqoC5iitOt5>$4Ao`0Z?#ZgH4ZGbw_F!5RIE&=_<#q%>!68S-29( zs!MW83xgJpmDy#3gF?zQK7P$4wf+cKNu~9W#=j}t@ysrgt>@Mqbv^9^W+2F7Lf{3&Q-E*8InbPIbdS)i3FG(K z)5PUyC-s$gQ?=z{2D$#7$v#`g_|5{)5HG)|9p3KRIuhFRc`p^URuB>vs!MVy-p#;M z&i0?bC^q}o8UODt1D~^CNiJasuVlZ=jug|I(#}{BOJZ_zgxgbmziTU(m0IAlPL~NP zq*!JW$C;W(Ox(8~o$O0vTHQr5whkwAj8&}T+yna`(;BsK*c@maE(51g_zruPzg*gl z2}GZiSf&dIKyGu?w(3I=)pxQ8aX44kFbnXJ*mby3FpMCN3smV4SdqdFCyLD7d1|dA z+g=FIO?NC4kijFWz$Xhm7lkFmydLHl=;WS~(B5j9_n%4RI={^4g!PfJDhD92f!y=o zcu>8QnvDEX{0rE~?Sgth3|!@X^fEh$#Gb!NX8J5F-s0G&UWI_=-II)~Qu+YjjrH== zNxLQZ&={d_*E45fQbi>;b~y|CL*^h{<6>NCUfcGiQkx8kI6Ves4Wl@rJiv$y^RB57dVS|a*`4kNnYIdQat07z@ z0FKXN5+x&@b?W9$`!9C{<{2;Dp3$7j>+asj@DGPfj9}*UB0Sc{jtTlEX1+v-&XS#H zf>Fy{0e4fOIsgq}VT6%f;?njXc=<2lW%B2#9|m9ZQC`zGL#vNX-r;QPXs01gB@6tpyv!`T42Iufh;Iw7UFo-Zcp3{`8H8l@XNyPbTxntDaCzHYrjb@)7Nj6=?s z>y4wE6vZv0;LHiB7aiISctUwK##5D#B3`MfyXAiqEe4d zzHL(?A>y6eRQrtW9z?d@qnm&_7GPhCo!1dGEx{U7Mg9Jz=&qQn0TPm==XeqTCIJAz z+$xn&Noc%h!R zoW+p9iR^ZjST{5|-f06LKusnrbupGU-Le3%(5Qkn6bJ-PcN?7jVAi@YUf{Ot5&tUQ zt(jliBGoJ|jzA7~%<0Y+12n1)00h!9r@TfIWe8m0!a8jc9qo2)KRp#owGK(C`?n|8 zuB^a``$#x4JJZ6i`tQE|f93m}%|*9*d{K5}3EQ?0s~__&^HWnbd1!K#Uykb^)RI%Y zUPvBigjnWGGt@0#P)e`;1R$MH^=Sr1ALZm#8Tmi{kj^RIuZP!MOW!h2OGgLwSg|vX zz(2mwQQCKA=-$_<7kkLiD<>tw&ye|A8$+RDV;JiFS*`*qw z7$#=+Ay4AWXEjbWI|m7RZ6PeWQxO z{m^ZC>oXq#TUh#9{XqR2y-E)$QHpeWFz+s0Rrf%9o$}#0WG76{Wlrxg>EaP^VEUoXzzPCxU89ZIZ+Os{f^cWbJI+n-eT_!jz|AIe|e zWa4ccw5Cd};1rqPcn)>A$n6hbUb+j^ctYIkmv`C^Z)TqD^F5sz?%VGh|MgXk>68|0 zDbZYQE#beg-^b)hmQ2sMDHXZ4KGm$tWbtf7bQ*HR4g4G-F5O2eOz&LWZ=!74>V^2B z{J_6fDeQ#_dgxl$1A$DtmW55_Z?o!=d4nI*W|BQ4nw%jqQx~0kxuBjir1H(Ol|_ky zf%esenXF|u|IJa6MkClE=lLQ-Bi~1zbjDzhNQ#8WAVyw1W_tbUI(C?$&5ke4S85&` zbV6a9Rdn&XuAcmf`uGt-vZ-gqYhPscOOTenL(w=P@^WATg0a2DKymflXe zLEutjO?-()K~*WICm1YMhx(O{TqA!UBF5y}O7;w&n5U=YnE;NWcj-nZqRl|1Pm^xx zJYC+TJymiheiRj}?tkSrLb;%u`R!Q2P(i@-<6WT|2}40ON@HbheEK^3;Mz7=xMbk; zZ#;g1T0b@vc$brNF)p?`yT9>N0pa^#d*ee7y_@26eGXF>6a}~Rh7@jt!u~QxMx<(C z%Et*a>jdnS8#uty0^+YCk*WO9YJO6bPk50)?z=I6yyx=Yo+8Iykhdzs%-Z=g;J^%Jdn zeADaC;9V1ZMD8@GyjZVpu@-QW-)Jmtp<|Gekyqa~SpiBRTm4)?EQUtQBy637{0@JB$0I85mH|6$9*0w*o2C=@s3vrcU8FUpOdUR?sj*g~`Zk_i#R$OVmozA0EDQNP$B@Z$ z1*koPwJEkm6;ljHTW}N9Lo}~!FHcS#d1(3kPRFzIys&8V+Xc$KDa3#(^aUpN=%~`7 znCKB8^8Mqu(n?SyY#a!D4_B$B=(#G~;GFLU~vUvWb@;LdiEd2ncf0KpEQD;oFuNq=DL*g z*DIsF1^4?jTHHxFi}n3Ph7?EMhajQ5t|fQg(5`dSPAkOFs(jk;OY}eJ&A(;+%tYn= zvJ2VRQ>mp$@UyFNQhe`t%l(({qOqrm^_??OdKNWO6q8Hv-0mdHH2>T%C$SHI_DsX! zpq4ROXa`R1{K|n7xvdTaS7M5HEMD4Q|F?So{_W>1qwf??JE&pEk4B;I&eVf4eBk^S z18e|#-n}NLL zJ=}+vOB-x`sp`&s*7=DkXL5D$LoKZ9=O%6(I?-EutbN7$(u<5uc=Aouf*bXM9FgDD z+}v7Qz6A9H8JaK?8?p*9pp{AtKl}S#`?s8*>t({~$2+ertH}OFmUtn|v3idT_6aMf zqVa~^g|{_9*6k9vUQ{K2Fz<|`0Op)m&?7(mQSMg`ZF=jb9yC@*9w&c662KSG1-Gu> zpqV?k=s2}og?c~nDUOm{deO;F>15M2t_tjJ)s4(m73AiuM1~p@!R-{*g1=TS1!c7H63N%E8 zkDn126bR?<_Rh*GxR`Wwj07i;lnmRp!Cz;p3;tWz|Niag9#Z`3V*WknbC>ok)%~)d z@P(xi2ErEvP|`Wv!Uc78fz+3bx2hOnTR|&5+v>N>ey{YnPkJ}o^9gnl{oMNc;Ej%& z0c&e{*Ekv3^#1U4zEUi+^gDf{DhK1p0sld5TNans#$;yO3~GCgy@kGe!@$de5+<9O zp)6Tndu}cgQ2b`VGvX?&^)n$`7qQm+>mQq)5bvo%0iM2!R&UyooWTjbh{CF_C)6K$ z^fe$*Wb7tdq@C(f^}-477`NM(i84L!44ALtMIaSGL_7ke{}Wf)SG@|cg0YPJi*!SK zAYnG*_Qr{CdOy)Y{?5A5vo6!>OV%AG9T_3qTM0nxeLc>;L>q-rA`dcEF>6)tvnbVF zgMC4$AGQFbly%MazIs1728$XHMy!{tCRm`d;FS#KzneGMQ#qTN3v-GT*u}_@S`egq zW{Y5C)g{1^eK=Sf9PiEwn>0%9pKW_c%YU?coe^2grXdXGIkG#Rk&Y#Mh{?SD?6z&M zvzJ2(yf%f8j}?v-HfvGy?&!Wqn;|UvG_%T91kKYGTkjFoGO&aU&z|GGE>c-rg!;~A z=EVi#q5sO8{<(!ra3J*gK*d>s47kNJJBYR8JpQ5Jy>Ex6{KL~f()snot87hc!yt~a zw33Ejm+t~ow3|tX5`TYRQ1lsD6y_hU}viZ zbMsr;{~4ceJ4iVV0qlT{Qh5XS)lrS+%@WFe!Z;su>;#E zs|GL6iiJR=^&*`;WMB~Wibfz1IZa@(?CiX5tB)4|ZZ6x0!ku*oQ|ea=?Mi*Ehs{~G zZ#h{D3Z%pGr11P>7+Uwr%u@yw(^M07(sAkGP{+_)okqXH+%2i*NQ_%+*&H9+?!FP^ z+i}{`Orod1{igh0Nxya&we`kq-r|;4w$oJGB_Gs>=$~fGQ~LtbiGDB$ra9@UdQurS zGPf=fT<&(VxIySvL%^*K;I(6nx;|eN#mhFjhEk{cRlgOlx*B!WrLe^cu*+REll3e8 z`|tfsW8M+EV*x#!W>jmo(qzHkyh8{OOY9oNL`9yKLlIOH(-oEqmKtw~^9rAXAm*VfA z9e{gDh`P4uR|2ztvZq9hLEy*LRMck zvEKokCVj|j+l)S8j2$7wk}!a!tR=9|kS-=OgQsAoO0&`g_{51OE?h2jZC$CaDzR+V z`QJR|j_^CnY5r}F}>J~(BUxj$B(pTe(WSO+0E1B z{=|a+FmE^xISDmsm%?akxdlnROA+d(;E_e+T(j8pb* zet)&pUd)mi-44!XoPR#X?Fq#ddqh}e;2#L^x4I#8&_<0VNmym}p;HfS)tcvwT%WV* zPl}cmcgsl^)mRGj3tgI0)gn**44JS%hB?J0vLV(UoWm-mjdQLwZXj##&7qzYm!>Fx z+0%UVqDK&Ry1fv6;T;C6_K|)ROhWPCxsvNMvc6!DJyWAMivoLSCken8FhDw)affku*h#V z!DWnvnibNXkDFB$4eBbHbOx_TTUzmSMY;%A$HeE!V!fx%P&eT=u(7xg+bdvQfWY|MUf&Z|6jwe|COxYsXwbcYOCIXV~UeNOa$@ z!)|&v`c^qIoQ}(9_XHb3jU2{_WklD~1Wz|L>LqUOhTVd9Uayy^Co(%WCaXhI|{Ku=NPGyXRQi6lI&=Dh!Q3@JzRHPm71xGEQo4vcL*HoH-GI1f{uQg z(TY0m9&q>T3bz}RNln za5g;&GSAEDv3Lz+O#g#&joGHI?8%rp8X&KUY5M9rZYLR1D^~Dm^@GR$6W;GWeo59tAGO6=K48 z+6!qXK%^TEw-k576RoY?(wgyo$JI;E^!N@;V9i1bLmu?chAew_Q-}xG)f}21PG(!F z1lHJBZrC@q)+~+1>EsimFU)wb%NuR44I7${PqR~zo8h9ffEouL`{s>3GY6KVXyF;3 zqShM8VBKD;zGUJK~CWUa<*6?R~CXT4+IZ760lb%c9iEgZXT@XX4G z#@enMmw9+}Ir&oF#VBhN{=p>ME-7fQD|gT-rmRsmUjsaM^?Ye8QL;2UVJ(SY-#T_` zx!`=g7k@ObhFxG)&5cp`je=G=;hOz(>aHC`Xky50NO#2y)DW2>6q#=Ap&pW0t`34S ztMi$mfpb~Ou%g@J{hEeTXJfF(6rj+McZ8h*G<$;90h2O)4A6@j$6xFM9i36v!)07k zrdfAC8<{|0=a(9`r5eKFs+eK3iRqhc^!&ETj2^fq%7|s+PZz2mRIfxH>?Gv@jA|?8 zNt!gv>&bpfZ{7~J4f>3fFaO4KXCiXs|)( zTlFvSLGNmZv?I@nvF<5=Y|HNK5V#btLEWL$g8u6wtVm4_9dm--eN2|2QZr zSFoJa93i)o-66K0O#%)u5SL05)W%xD>$EEgbArAZ1VVobl(~{I4R%r>Y1(3&lY0bfQhAFo4WYx z{I#jjPhHYlD$%ZfS9^oyaKUJl%%bQU1uA66-*M7z(K5ZKPh8Bq z9BK*?LT$EI<|Q9H?|i4J5){Z{@XqUAK27 z+#xq)-!Z&JYjLKh&w%NtUVfqhJK)xEgEbGx*Ox7L-}D8jW7j|lze{nP<2;5~Hln=~ ze$-P1F#8$*&u-d2JtiJe=OS-jJ_72Q>UmO+K*xhH?l$I#Eq3zqZ#@2ISyPhA`SBF7 zX{1yB3CoaQEbA(uCG1Unc^<1Q`+eZZU4m9v!A-mPP zRtI7kN~)YRKp33)==Lic=5M>$_mz;jQKTN=)H-!d?&6GZN;iE?i-;h|MGouA9AK9- zxV8Z_wNb!T4qTsn(^-%|ebbxKrVnl(e$YC3#T%D1gCdp`7U5mHKt_g@Nt#S7Aa!hG z2yVo~)craBM&)XKQ1G`g3B3dNP0qsLs6h+5&AW30Q_nd1wL!$38$_K1y@-eg?ll4@ z8n@K^#kKtmKU$aCi|R0DYROd=MQYjt3hWx>3Rm!0JsE=6z5m0t8AP)b zd9^_lj#c4Yg*rs_n;5#y6@L37Q zQhduXGgBjB{a$hWQ4l1=W;6(SX_+_v_i_AZ|9l1l@Ml3^9GT72e03ty$^p0S7-779 z<6wlyk~Z5@>|!m?WaLvqPEmG3!{9A;4d8PpxhAgaU7zw2PS989PGm zOyiZQ>XKf)@?9O~ekKsiUSRH3jG`VuI=uH57CyNxb^I0@?z_r{5EnkmRt>z`xjg{0 z4tLVvsTuY>Yuq`PyqGwYE8j@#OuOOmG_kLmg^j0( zc8ZPsVP4qBRHqbJhQOY|lxqdoJrl;VrfgOT;UBjD@R)U67kkHFQ-1zh=qS}Is7 z>!9D399IgMgiK?wu6n=zNE%H#efxMc=9mY_j~Q*2(@tWQ&AVneGmVj3HcRfeUQ{4Z zh_LT~nD;?dwGP#Rc86@N_r`w^0Q=vj;Ai5k|N5_*Y_Ht`FXu$KzWMijUS->3Ec1O% z=8WnWH!uH{iMqaCdeaboRtE(L2Q6Ir4PDFtn@vw+A9$Mp94Gv4aWlNJ_29i4Bh<6Ns_-0o1cH?W)ODOxI z9ITLGsw55v;D8BnNrs1BGuEif0fdS72P?Zg;sY55$Vk9K_HaAu4bN6Y^&T_7sgTl;HSe`fsy=3Ad_(5gfOTZvh+GMH z?y{Pb3am^qLfgCObl{rw+sc|6C=`lH8?frarvOllfmD;Go;f?YpJnd;*`6!78ac1wKTiM2 zM9S92b8k&5oj=!)WMlb~PU8rEVcV9PsY#th44ubl>*OgJ;cY`=HB6!kZ9~Tnteh!J zhwEkhqDO}Z2j9#zIOfF1JMC)Xs$y445%M|ZA`n&+pZx~Za<_VX=;sCNOxMRDGZgyt zR@Ma(>+`~NQ<%t2)2Z;R4`lk-3vReL-G2{P-&xjp;ixX@^m98Z;z?H}2vpO`j9GYE znYh+0tC3%2EJd;{2k=J?-T4uBZ%6#UI0xpH-nNhU;&bJz$1h%#^$>nz({A@8C&TpQ ztyEdB9t9r}5?dg`9nNYDEj@e@UI?-?x762gNwe0c`8krV8?#)C=4+)`b!!TQG|5YL zIGjpe|4h)P)zf(JlSkD=vx)`+T5H3?^oA@|-rHN=d#>bxw0q2kZM#_~eV$T2Ax)7a z+ke9;G0PSU&vtKob;YX`%eJ;N=9pNjr4HF_&Cm7&vKUe+TJ)vx^svlGcH`l8Anbh6 zziv3;N!JTrgi~tC_og~$S&aa0LZ0`%jgh3^q{zC|?%Go2;u}4rrMyM!p4j&2_M4tx zpRs1Im2EqeY2nSXpktk-47Y5E`tHLTV9pI+1__FtE`MfXcda)ysV1(5b>geX^=eSP z)Cv^$VfJ86S+$l>x=^_mtuxs&<+`dXO}9D6%#o>gB~B#ayPji<|5tlo9@SK`tskWo zuYx{=I56HOIE6`(fS@3@gb0WbNeB=IWe^Bq5CRAR6#Ie@C7NJRKoEn3a6*Cs!W2MT z8<}J#i~=Gu1PCIN2#PPa-{q}-YrXdBUBB1ezqM}uspMqWaH{ImslDsl-%cJpMtw05 z-Y<1FSOB$@v(yPHMiG~d&YH2_n{?UFL$hS1+S0g9_XYKaaTfGcn({3z3Fl6fd3!79YJQk4{j&d*Z0gAnK#Y= zma!;aVIQ8?F$wRho%T^tgxQ?#4!;MC=^5Lx?v3r=y%R znjKsvE>Jth`_*hJMF>?JIx7t4AJ626w`^691^kemm7r%ZYmL_mHo2T0Y1s)JJrnCh zm`lWlv);pHQt#mg~G@_sMOOoLN6klgB0=ta80vKa_p9Kr&?%WYa zeN~<8Dr;4Js`Y2kfBeT=W*2>6!?}i#(Md$noddQiMMmR-<4xP1T2d`H_2T z8~W)Sp)=NWnu|U~LEGwlN8=lDmnIT}!<+?3iQsvqYL#+wa^yy_*Mi_ml;lOkbXNBL zb)4f1=TuI-M6NJ}UQc{)ezKQr36qPSFm#xaAN~xoli0ezczNoLUc}0VG2}eJxH@K~ zsf614)AX@|XAtyFH&N)UI@J(A4hv5~+?)x(keF>z_%{j=+N%w5FiS z*;Av=@?_$@5i|;S`JhtH|EOc#*EUUht2@`RK#&EO7?yd^*?4dzw?)n zxTf{i(RJK2>CM3y)wLU4ulYKQuay@eOZ*_08AA9BDto>9};ZfKCx3>L^R0U)6ud{M$2$+F+0#(N}q$vPiZ zZlHF*h==CM7J38_9a%e?iCA^8eSg0o!vFdsyh?_^7r~>r; zk%y6iWqX*{y2kA%EIzP#N-Pz5I8si>O4YzAKE8vz+qrpROYIv3l<_12TbLI*x_smn zb!hub-1g+8r=k#4-Ldo=N%-nyz3KFOI!99s38sS~rZ#m2o_hGWh+0i;)}1F_si{6H zCyyaDxEA9NebtCE)SyZ-ZWj6h)ED!APlP0%6TivHC}B=75kiQ#uw1 z&eYmON=1I+Svw=LZ!wM|8VuzjZO<7H8Q0Fg_sIt*p)hdg=&Ov>VT`QLisM~|hi0&A zg+&*{Zqv*DUcR}!nqueKy~N7 zGhG4lW!S^*1mPo3r=pw6WtzM;j2*1Ad?ofdn4nuouXC^wj==FPmCX3}P?%%<8|xu$ zw9Vp+`Ks1*bUEW~Xz9}~B+4d~z|L`d7<^LAdfDyg0#Ok#jgBZxVWV+V8;#l#2Un_{ z&>^exs}9rKJItuOJQlgYF#b)Pa~l6{2aw`Wkd?}DPA|+LZ`%flgY04XlUiIkth zcJN5=m_4+s6JVwF{_w`viJ6b~H5s1jamnG8&Xs;qvw<<9bakq}9MOVQ+wSc1@T#E~t6#QN;ka%A z1gpwJhQi+|NuHnE{5+^F~oP z18}p%@iPHE3k}d*Mm^Mjn(n6w$?YUsj=!ckpRo9#QeTt-U7Wrj%ChehUBG=A7SK7b4OW{PmVu#D{i!P};Fh3FSORfz@ZRA=orkJ>L+UQ|@`gCpvHJ z((1P4q0R_PrKY~irHBBGxuv{GlF4$cyH}iPqMG|KW}kXr`P)*Z=BfKbIihRr$773B zve&KbTk=^sKi@p$Cn+?Eu3MFl?v6UVggvorqf&4=?tZb#>D3)A(YGc4A7{GB>%z|0 zpa>1Bt)C!`Q{m6i_xkodYC{e$w7yiZsAnwdpiy<}%WlDC)d(aZm_LgbQx2_z9g2Sr zOB}pFSM`_tX4~CAIigYyw*AQ_KItdL_zY7bGW0X(l5%tjRvZ{c?6q<=U^46vNkJkH1P=1sVB^3B+F>_ze1Pa7KdM=^G_MxNI2g?bB*2Uj{%;2ktLA z7{8JU1L@x8DJltXEXcK5LPSAj%|w}|przCOXiWWvt6x#{y2+5ot3%dHVoxP8IqwN6 zX}c3!AUMv1_*fVE8T4q|FUZ2L-P8Oc_h;3kP^BxcuRgw}u~#7~I>S8bkyq#>jncJC z>n~Eb!Q>cZJeQ?Ng*6h>7pzcI{Ud{!rd14m@J=O@nnPqo?kD|ZLk;;F82qg&vouHB zA-xA7x2aLk9GM_+ZOx0AlAKrkrcPQD{*o8>n#>8s0B;s=IIe;(^&s0}dcJ6t-_tt? zIM(|OJkNnoEY8(@2IXxE=tyfNv^OcaGBNTlO_NM8nS(HpO({AE)JQ~xn4(3lVvMR1 zh<|Ra*l$X|Jjb_fUal3*!@#q=CQn`Kl-faP77{I<>47pklDs*GSn?OiI5Nj7w02gp zyw5s{rV^ePN4;vu?9(NPp;{0K`AF(wVcMPa3DTGW+GO&v8|QCPaj58{rP22!r_e1o zAJyNi3ES3wQ6^M*Ed1qJ@o!a0 z_s5o_l8rO#_FoZq)^DmxpiRa3_W8FDwwy%A!oi)z;|)X+3vKs7m=&UVS`6eSCpHB^ z+bZL^dZz@)dMfl#*tVmb@@#tlMJB77#v`D^E@kF~_&2h09>nn`kE-;125q+3X*TLt z;R|u%(+lqzk|LjfWKpoti{2iU-AqU+9C0#Gl$B?W)%R5JjJ!B|YV64(pdM-(tW-XS zk7;aX!yduwcBs`))TUb`wY7Fy_8#)gjXaaMTUX{W&lfUgW{@|Ef${0kW7|q5okDJP z2<$aFc!Z)rG{(vn=Fynoqe_F|^G^AUP$nv!*k<_WQ$VGS)FcCFusk0(=U3Cl73>t^ zxu!{{D{8BggncK!qiP9vd}Jqv4gyo8%rHWdInrEe&XiK8=107HZvYDT=MKX-!uO8X zMf7mc;vcQug0>nCk$pB)Ii3y@oqv{_ou6xwYO$H*XlF<#;GRf|tS^Hu1pO^dcTgWLE5hR(Nd`Pj+{jX2!GOF3gP*{*H&p4VESiaXay}8NGsJ zxn$~2L%A^T9{c|G(5#1;tR%+U!DxQW0>#F=U-PKth;vilXPpZCK4try(Cw+k5IgQSsRPlt-O8R!z%2 zJgrcc>tU1@>ZV$9haR-_Q=)6u!iNnZM$LO(c+N1lXJ~acOBIhjv}wou(1a)sGol7N zDK7*ar6Cgo_SORr(yj`#pGj48I7P=F$jJucQpj034>MBt8bb{u{Ceb309 z)G100P0V=7NYJJd5_zheJ8t#%&Dj`1`|8;BW$D#dM&G*je<}8oxU4?~L-L=-TqpT+ zi#TMta4fL^p^m=kn?wi}hnlug#mnbobpv*0wmbS6W;JPaf7Hw@=+6z{B0Jbsx+6Ix z#_ryP-WqurY0;>56&2cuMwtw*X!;)S9YN0kS0oEM3qNttuA7-4;{SH>$zxvzYuHYm zj0hR(EjCm~s|k48{>UFj@W?|h3#Mm)3bxA?oNiyj$2q%4#543)%j;Yn+$w(-j^`vn zvSQl~DUbT+MK=Z5<`=TIV2`xsJ_&Th1LGxo#Afx~7qW7Ew>_o-rs zFWV=7DNa%$PweV7HQCC_sq_^5qjs4$T-`_KQ&7s0@$o)y9^avQ? zgT@tjM$TZcpZ0se_4bPmvHwz)|KxG|rA)c&g42&DjnjpmIcJNq^vfJI8>z&NmT(m> zO_1{1si(8{hW7tdoFdD2FFL`YZRJ9-mRTH7N#1y@r)&K3m8#FJNo&g-t+#6sb=W;^}P6&v(~hyt7=nzqB2q z^cnPUQ&-Gg?;`<2(~W=gkax(Pc|$9-B2+HgOACZUI(!c=L))d7lw!TlAjADTB-b!j z%l`ue*7Yk8nDMVcV1I9~ha+rKqIA&v5IXmQp>VL8$kB!VtB{c-*E zkCbhXwCi!u0f2JzF@{I`sSy`otPV0TGRLBsB(1e*o$Nbzgf-^b8HVLyut$kItjiHY zpBe{p-9q5U*sh0DG>~P+lO|L2psKw_ksO>@NiY3&CH>0}_iyj0|Iuy#e$|QD{lhS3 zs0Ke4Injx>?W)<&>@esY3vM63##0*jIA$GW`Cba+AB7J%)AG&B zr@MlpvCw!3$%L}UCi zfC5fIEBaPfCx*9>D`xMHIWUp39wugulFxvL=sYwpf4&GQi}X^Lzy=jgf?ZBfFzAym z4Vq$xRdXvpe&JJQnw47g*2U*zPoL`${7z=uS@*IoB=ETo{2$DoLHN&Z*qn@_Q>n#z z22}VSTR=JfCJI+J9ZBNY&6XiOE<=Hm^p)WK7Zv|N=$6>tD{-|MrZw~<+(!D?+y@fpH3<7)bvYDtx9b_nNWrMpq9-5a;V|S78VJR z{78zytrP0~b+42ZI{~9Y*tnRJ@rd5MV8 z(^7H)Pxc>Q2*Q)trh~VSifw~`us#CX$QVj+yMya;;*>Tr3fME{>FpgzgxYo4)KNoN za4Jh2$|g1U4Js&yg4zbHfJo(+HeBNTjOW4TxG$0c+@|}wi3DF+O0(S@R0EfXLQe=# zvjmBWvACi4x!KGLx8#TqUXei-%c;Av3FO3lynj#`0I=~?7*J(Oq#Oez1N=r!ky+&6^8ba1dut-xR zkup5tCTh3VS__XvHz-CPo=8)kN1)vF9qp5vK6o-BFLI41GZuNWeJBY|EXPB`J;~D- zx%0!K#MD~GuT8&<4*_jzBWp6<;L-$zutFtU+L?m z#G7%TFRnQK2=r>>x?m%y=8zZ=ga!~3FW$1=|cir34IM7vfEm9s(0-!JUQ7^8Lz zwL&f;4LfUhYjCsfQF!xbg7ibiNh7Z1nWw%E@AYdSmPBK!jDMLk`_Ae2Hib_8$v6h4 zrDafk$YMWmm&tuGe&BqZflIYjZ$Z`v44|r2|6S_W_V|CxeFu9kHo3^bJmpEO`8`1{ z8C`C#^dg}K`9nXRLUZ8OnU?GQua8+q?$5L^S<58G2-=Mn#!0(i3}lRBw1wsQ>3(yn z>+)VTasoEXpC-fM%iD|dU46OUvj3U_B7va|>*2e0@`rlBP_$!y5qL-MI5<>vU^KC{ zw*O-vuRblt=AFxqBOR@2aAOI21*Us2wztj9kvXez;Q-)sKDdkuqwN}rfT3$MboMs1 zvaKi&$`-X3%&U6(k1Rn4Td(}#KVlg5rS`+N4s7tQt-On_?iY3vPW6Oj)m*&$AQy<` zjM}%M-O=$QX7r`{w0(AE`iKn`)rZpbz}I^ZPKDAA_}M`>6aAz%@fQg*&%1~HSEEup Ste*6)4bi{Tf3*ib_xvY1^mBIr literal 75721 zcmeFYcUY52_b?p0VnqazB1)A6P`dPWCG;YY5L!U#Boqlv`mVbQgtkO#Xlv*R2~q-v zP*i%C5?Tl-y#_&geer4Q{@!Pw@AtdD>;10pkN4!tJ?G3hbLPyP`<|J5=G=#aho1mf zbTqUz0LP920LPAgfWz@)gW3-t+B`Bg)X>%g|DDkcID(V+001|4Z@<^ncS10Q8Fgh0K4-K4)VnI;#B0*lS1lHK)Jh zcfR4af5(--;eOsvy^mxbeZx@@YIGjk&LpNtIxN(zQH$( zFF3eEO^(vDM}HoG7r+>x3Hb3_`;X`&@W258_tyb{6TkhDXPW{5RJ;HHIEVkp6Z{&;Oyzsr%sTxgJaLZY zh;MrZa8&b=?I$m=o;`cw?C}$TW5-XNJazgE>)ETf*(A?h<1b^s&MANY0nE(TFR_o~ zhJciUk%_7IOH4viNh!Hk_DAC-B-=^J8Dd$&s`1o5V7Ab}0cxq&z zDW!ds6D|@TJp@(G$d9ZY213Jh-&F0ixpvCxa+FSOtIWp$cVGC7$B_%@?TspnKbK}< zI4!8MamB1$jksX4)#9b&RX!&AY`IYvd{v`PNkTnIglv}Jxihb=#|QaZTGc+sYN@bn za=be*FggTW7&-)mk#@fHhlUdaFmG?=js6zE&J_Q7FD>hUbM2RpMV_vgC#U$nG;IYe z7oFKc4-|l&|FyEvZ>s)}YPwO{Gk9n17mF1h>C-q%U+Gj6h6{f2qrvo}9@+ygS_z&d zI3cc@uFt)#VASCy51w=%94y2#IrBZS&zvV66z_z6FKFpP21w#v6F^B{G-@^N;nNBgxTKyZPD>pVmuPmou+xd_qw$y ztv?Q4-aQ`^YTtd(klp+5+a)lxtTR(OAH8%v%Y(kAt{9m*ALXyI%lCe{`+>P(-0+>H zk6nh`I4{8pT_eHEQ1{s(!Dv=^t+XG5U2d>{yfQBZq0)n8QN}FTWmAMT`88TCeEWJ7 zTGJOE{f^YqC>AOD8RY(lvFAM#WI>T(y4?*tphVYrWN@XsHZ|w^q0Vi2i{;C7N z&wrv6m25C^>-((#ia)JfUf|0QJtcAABzpd_+Mol?nA%_k4&nN>~_(b&sOl0H?5(C6%%U-g@7ySYyT|u zAJSt-_xe!_e)>-$g{_hcA@FE;v2F!&TprIA>0@Zmgl(8;%#O8I`&z>!+KM6h+{w;F zZ$&?Xcyxcb&BfF5NhLDqm>I4-G03`-zYHy%wTjT%0(0-euL`}BO_7t1oqo1o$KFc3 zR-p^-Ib&jK)K|>M(@jw%n;ZgqHgPzhYrey$m85$xMejg6a#-|x%SQSvY%!yr^K#>Q zU1RXiG#X>g?`|-&o4-=MZWWQUI7hQW6JHl;D4JoT!N^-Ff{yd4s=}{ZVe?{xxXO!$ z?^X*XoQKnTVV3F8A2v~-Busgn!_NWyc!AL-JpcBc{7Kh}i>XhFS!+m98-`!sv(`^> zrYSS?a(IhtKQ|0MSBVUdK7+X-0)J9BzF48zq%wZi0fBSRFRpIh-zS!jg{1Fa_THKJ z*_y-bY0KRk(Gbsajot}g1OeUBKA@0~0dv)l+S`@GR0?{l+6nBo$^FRKpnG#4#z@|| z5u3WTvYUJ8I`nW}jeP|c1g%V|>V=vb4B~7hL{$)EK)E61y#yX_Frk-rM7Mr#C}vAam|JXO!vJvCe*OLbuyp2EEMs|6u| z&Mw<{N>93+hRIg~7fB0S506v&jb`iBCRbq|6TkbK{9zKtT&`B(+-!SGo~nG2T3_no zi=IqE!>YUMysA`{gifX^gcoT-LbDZBGNv@;&Ug$_6RypPmc5GDnO32toK7;gCa&IK z7y2+A?K{_PRg}w+W5^FF#RXSmT2E;D-ESDl)HOW4(XanY#m$%+=}i_oG`mXwqhJ9z zxcB^cxnY5#1@Z-<%*lqN?gQg5!lbj)eXOgSqysxpORC6h8Us{o7w?L>&+xCnS&M7M zI1N-HyqBKXs`+{uUeKmRjxZBH-5l26w!q}>QpxI*X1`qPu&r59%S}!n?}gg7dd^eZB>DrY6TW<<3r}K2 z*;+ErDL~CZ0YJYj9(4WCXotAnQ=eWXd~aCAE0`US`n=Hy;*n>q+KI#g1kP#whsW`s ztP|%(>_7P3_$T>S>4{ZLBG!DoATdLvxO=S-7)59U&hJnVDHbk>iv~N0PWd}3vdezdUs4*(;1=Z%3(&7U*M3d*S8m*(| zmOS{h4kW$113cub-;3jZ{8v`|Isd;g$Ns&*Nzule$U-iM-v^cqyXA*71M9Z$`o#Mw zf-_j?u1b}7A$2b+M%Ji-BZaq2Cp@1ta$xW@y;1Gz^_W{l$^9wAD;ByNREOV8t%0U! z&7GV0lEM-bL5xbFy=R+PCd9REU2e_Kl)4+{OSbgr$J2SI(ZJU8(aP}&kgxJ7uO13O zi|k&}!3aDsI7bb8^J3@4yI9Qz1LCBAbRIU-0M8daxS&82z#?)>Li**_p%5JA6vV44 zzEFLrm0G5j_rsr?{U53S#_~~SJ5lpAZ@7)rd~%?ftM71XeB4)%KmCG1oQXFW!r&e& zIRv!mM1;>RNS{A-+M!^RUapU^x#iYco~xSNf%?u zsB7oHorZFE`AglGd^%cfy~D>pI&Cs7aN!k@#!_XjOzkC=Lx2|~1cg7iwU*I4wkfMQ z11uWny{MrdW2|j*5xVjGdUw|;*`tk+#zJWWqLv*BxGfP-U6o%AOOabveOBtK=p1Cr zliMq(4U;`yO^zcN=L##V*3}#WtotRIUV+_Q`06VdA5LdRcOK*HfK5dDKCpVVH^9(k zc^8}YH37DACVL~}5J17JDL_N7?DRs`I$V*jgnyqPIJ^C5tVoe~T6j(>caEzzHG#Ln z8oo&{SeI6NZ{wHsMp~*wamMonStj1a=DLTnfrqqpqnDQgI~5NUfq)@Q<@q-?MAg~A z{_%Z8^(yVVDlf=utj*zPd)$5 zNp%u2TzJ@7bdINBOJzaQtFtJw>-$!IXUfH2d_)Ybb_?A)U4gsT<#AEEzgqQKktY3I z)96j5RSDDdqK98|X&2=RF=H1cLStHYORaWJm(Q>eEsdDAh1Rg7(!q_jF#=TOHSI~T zMes+Tx3v~UK{aZB<=SM45RRsTo3oaC&?6rOuTH3llx^;J7;U!_wqDlh0!fwT#N=r< zhgt@rSb6&VuSln&LJS_{<|dRt+kkBo;q>a()hT^B};<&2lYfe&K_NK81Y(e`& zqD39|`t8oajr7!;`~vL~Y>Nye(2kVkj3MUHs`tG9f9Em!e_r)oX4Sv81girHA{5%8 z$T%Y&8U*FN(QRZD(u4cC9{KN=?)r-VcIAdq$yg%=s^*V&2gvQ$YMw}#Glf5EC&|jS z(jU6Y?~)Ujo?`q3bt?TV$GEBYlcP*k1Q*THIs^Uv{4~8E#z%(nR6bvM_>^o-lr(|B zMkVC2FzvfyWHz}#sWzXnKj}u24IpN*`7u}uUGlzjHE^Zex+Yon_;pjg6g^`jXvgE{+~sl$r#>L4>H4h!4l5K#ZCmf( ziXHs~=q1(Wt;~o@S$3y4{#)FZyQ2rH8%*wuTam>t?;9~g9s4|_lYHQ>+-M;~izg&s z^0cYMS*UI4f8Dgt)AJJB06QN7KFfD8Fxb6;9mPG>H-ipp{gx{`I{knUaY9ZoB>qA{ z1npj9OZJPK=ncvFNxOvV*%(t5*1!a_C2IV0k)px>I3N6-`ByXLB$>^`b6+ZwFZC9# z3Q{3hYiw5*;a1UNHam}Coo{L#?1sjP@PAb?v1h0b^{1&?+W2JmwX-C?f)tu6at*-w z35_6^aUVwwVy?lZVh>)s@oV?5bs?XCYuK)Aafd?*sbJ` z`R7JR6>y{o1qwi>E$m$*hrF~RE7#SR)dwFY%pafTWW?m@@$q7p9I%xO&m2at=isW- zlf>CRPk~eThSglmmMWry(v!Rw-?6GlJg!{owDZaa_EVjAw^DlL1>DPksOLHEYnTeod{v`VcJ8G#SepGV4EEl+eMcDh4Z#^$WvVg-R~up&clZ~!V;pDRBd%1W2C z|9H~eua9W^d!rYDi_O3){HZj(o2kd=1;gG@CuW{TB0)(&93*15lbJ{n(UOc64L0Kvv2WY(%E4Ie(~cNg>u z3HokZG3fdIA;Eka@gH6W@O)#*keGDT|Cf)S{{+QE!u8DqQ-Zna(!68 zW{J;K^iJ|OO#7VR)!S=4Wm=F!cmWh0;7RRc6R;OIY6nOP8Hq*0mA8 z1eWbs=cWi|q<-9X5rBzEFiHr?GfSl*6r(_F;B|@43=gMGf4RlR(jLE0CxoI{M?C^t zJUgEB&^vFxfJ{{&5Rt9DLvss{voQsxqiZO^UP>|92tVVmle)UJgt^^bI>erJ2>5kO z%~uEc)n<0#%TC>s_(OoXN7EeeTtn@zhB1f>xidd8R?yMcer6gpKF6lOt!FI=Q$j%z z>kuephp4DQ(~xDuQBw(DJQs?t4vw;?+iz)JghjiMnpcHep0yyP&0K)gXLDIoFFiP8 zv;`sB>~s7@*4-vWz|4NVic9rh=@(7KQ|)}))-%XeF20gkb7G-Y8^sUSKHs^ZH*<}b*sb2)@+IP!DdKFP|$9;_^dWtpKOg)=gK)M~^&r(HvLUblvx&*8#^2_n}p8 zp>;18b~IjZzxk7B!#lvy9?kdKRKAlfehRpD2>4#x|4%D!N_j?}&`2my@%RP3^P6mk zHbHNLdMfo&06~ZqXh1^83iWd3|J0fMv(-y{y^+?Vy)!n#e@oVM5#;$~-p;$yO2| z8-@I=&CV|9zBuM|?9Ly?eD)dZS9^580^jR2=6Dx6Xyvsl9J?VdX6+Dd;`r>v*UQBG zM3%s%^4uYrVz(}C;fQWZ$5`%c3{=0h)Rk1@BGg)!wL|2&wkhh8qHSAaB5BMB)=G|O zZLod=6|kfhjBRX2_XzJ%7hmpEVF(0@D!Z(CDz=2t${poU#K}$I=Gtl=3|x`!TuEv zN19Ld_}Ne9gGD-!q>_4||Dup^-B&g@VuQI|ajRG9%s9Tk#UB4bW_WAVd$DIM!PHo{ zt*vsK?GXh{T{Fas1b9?H^-o#n_Sq(gJ|rlH#y>_0&>}5S**cNNMIvhQIGHvfY3|k- z_*4)gjl^KHqnqbmU7OPn+}#Wsg}1Kw+F9f?7`2nk?{}!P^75aP&dwJ&#W*|KYV*WV zcm~KO-YB3q1Tv2fyZ^^4)b!tXuLBc8%{60tOy2+=d^`L8-{2JRv&Z6dPxuyfnj}%6 z^VV|rRvIisVw(_&|Fi60Ej%Zruu&gW)Zfn)QeG;#73(a#Dl)|nQb^Y!Zi>$;ji@QC z1=r9ex|0-WRY9fCSgAnJ@JmdVg-lP0+szQLikN&un1r@~#&}iVia?yjvZ!f+YBst{ zRN=b!6byLsy8{~MuRJ1G`_6+_Mh0%;sw~q%B8$K*%`72XW(!yKVjv8!fJbNaq`o`l zSn2HhX6{!n!#sb%omgAP<(QV=XiXQ#)AO6$cvS+j>N)G{xs}v$)8ALN;!z5YV zBZ%u*u3rU_GGR)k!xt(e`umkK>j=@Irfbuy@s6)&)2cR`1}}f!Yf0^+`!?ZsRpHBUJ1nWFYjwU1S88W{r4|b824E0>CIpJ|KXPjhv}K$(DIj})qDI(t47 z>Z4L4BCZ};0ny%r<5PXC#}z-d-FRi}lV>ev!9cCmC+U}|z|88_L&Ogy82_%UuXUf4_%Fv-RAHg6$-@FGhbH{#>%B%C@iQx6#E;18};2+`|{R z5DIc}#5^=E11Ap_GcLZ_!Z|tA;RVCtaCqQd|DB&eqn337_XdF_5ILH%Anf*tjM5<-2bv{h|O8 z?-eIOHL9yS?c&(GTNy(FzFzD`y2;KGW|z31wJmP%xAA6W^1lHqbI@OJOcr;iTw!`RTtaq5a+hZX$MpN0Qov+txs2D}(6?%LDl)&*VWIN#7v(LcNr;9$en z5*J?>G70&vo>ezaQTVgOvCu>bLZaz?j1DevVHd!?gPfTB6n zeBw^*?3y-*Fv!nir_-&Qi+Tu<+cN#~d~TGD6!6~0rFXA<`)PmSaAMZ=*Y;1t=4?%`Ndoz5?m}gu+Yr0F zY1qb5IM83h|Lb8cs&v6X8cI}z`Bu(>#}5I1zxyne7vd7wT_h7Q(N{fg49%55imP9- zo2^Z|kLuuoE!i%aBjVl2)5#Wi*_a}(LLz2GNJ9LA5eSvhntl*lziGMc!;w88A&pV#69q}_aP6=fUoTqbjJ(^mbL@hQC_JO@I3IVdwV6P+`e?l#= z|LBCY#j)J3%x4%G?gbP_j?$VXTs4ImSbl=|3We1VI+O0FPh|&>X=W_lv@CrVT0bps z8$QK{CC%GK?PX>B*7p9B#{^;4EYBwXSu3QEDe$G8WqMDE@3~%`?3AXk8X^wAj6rKXQK{--XCb0Bfe@-EP(`6nsV2Nhk;uM@Ii>b<5P`y*>|7 zCs6>1x$n}8l`90!D0JFEyHHB~vJrM>!E8%g9f{bn3nhv!RAGNFohe3-);gm{1?mT* zK--oI%2k6ps>&UcisP)!-LYc5+lZKW+HS6}%$Hn0-&U8GLwYK5W%W>L$k*uZn|xy< znPp#1-iX7R=&$COhT8rWgnp4q2}j+N;rK|NZWV4pDgHcDt$vD1nc{Qo$i4g|;Yh^> zk0fQgJ7L9$ktMIf5cz95_-5c|n}WVNYLc%O4PHa;fPl5xPK{^i!rg>L>M!QT-l(MM zUXwb_GW3+uC@H7*h18{*ge3k+pRx49RPTiX!d)=SA7Ay7&$`5rbGwQ1dqpW-d^l? z;9I28zuY(kIDX<6bI-Eyso;Ixr{@Q`^Ti6aF@3ji3%j z%r%-dZOOpT6;Hja)8W6_V|AcyaR_+ny7hQNX727gJ@JwInr+Y3=9O z@8$FW|B1)a6#g_2`)N2SWqwql{sr?wlIn_~#ynq)<)rYvW(EARf4<^Dij9k)8OS}>E5(jnP12wU<$G8}n2N%t zmLqY6J_*)j8w(-qMGaykXFbo9 z@*eO5_pIlMiKnypU!LubYwTlckQMnujd^rkm5ZM|!U^y zYm>8`T9U9+9$cJJRmoI4qXhn?4Tjn0of#6UlWgg}`5VlN6388RGoKWLPOmk|v0Y?r z8(B{xyi}SV9s8Q=fVGp3QXgO06rO6CQM)t6I>eg&qo>_v#Y=@s;iM zl$;>Qia=V4cx8?iDK`L@CuXSmpwczs=3dK_wLGgg`qnR>iCrDA^zgo*EpdN;JhQ>w zTO0~OX1{$i|yKf|F!G?8Cj%K(`7Da}JhaQS(Z2w_ZnD zDk#YpPvEW0!cIcLi>bG#0{P-yUUbSBU=65~*92OuwZp?sC@iIuF~D_apxKU<4f~9%aLCVWLLI8h zXIE>s8VD9Y1aMV-WDtG2H_FImvKKNkd_%P{l2DRC`Yb+JAl}J8BseU}6z(fw#AsB? zyAU;#SYfN$5TW9e^g%~s`}bqdeQQpYXhq#G zTy?uOSM>!XzNh{uf1GciYok_ORqDoW%%a{&wW7?WknkXT=}q3j*>`tPs|cENf4ckn-g=s{%}z*Vl-iJ#U6NwRpsoGD$vt|?TR!U3{e!zti)!8_z|JoX`IF>R z6CUD`gzLfGe4w2yqrl`*Q~7P;k97-<7C!ak=DiMhiO%M73?$vHnb! z)@Sf9cFtvVHfPwtAOKZoL!Ly#Oli)Vk^z`2%(&&pxt>z;P+>Z><(hvqT0^@2GOj<^SiYd)Pl-q@7}KtyY;dp z*J`o0)^pbMtxl zB#@nmz)RkYMsC=Jrn_ zzTI?Q0WqNGA?RqlI~6UI2u_HjuvQZS1fWoP$e07&=hBU+-riBsTV$#G9xZK8?QX7V zo0Mpk>nAlEXy9BKmH46nJc(4QSIEA}#f2?kN*i|@LwktI16&0h_UT^~nzwm@l$E99 z{PjzNRSbsWNQIX$b{drXHqSiyvvi(j7-w`q&{{No#^5qA3Zky3hx{_pG_pV4XBBcT z_oarZ`;g$vGlEJvkm5e6l*Py*sP?3tG6}+<#IHA?Yv zBJE{jc&(g3_C3;&J;NdfA#k*wz}+1aK8Ds7hjdlwc9_mIFX5-vqnA@kRaW@boUP`} zTG+c+@zwcL3w=8UE1-+gbTRKzMN_B{LR$z@qT;0E!7&3iHOs8wrU2$fgsC`ByDNf$u^)cWel*Rz1 zFd@dv0^dYtU4kOKQGR()I$wg27zFaB`$5-`N#kHj=cdXCQU8^n0@R8s5`f3=I?W@B zXkb4CzRyLkeU3M-^~N>z21#~<5+3%RFyU@&V0o5vG)>H_r?G-NQDI27KeF!jG{&^@ zB%)BdnbBJjmN1_`>Tb`tPO7mf9Hf;XI}TH+oNZ)_nmYXr+s=PBvt_+03)r(*shWz<>l~D>Y8Vd5$L-GuHfy=qE?=q>G2PsuSA4^Nj#dFm$u^8y$o_Oz2g`JkyNpiDVz$L?-(eBDO%?@NLEHdKQu3h3qoKPem(u* zlP;It*oKK-Q1g;ag_cT*xmx{bA>UU|d^Xow`jr?$O&{Nibz;VT8@ZFbqh;#zA~xpS zU=x8O*9SR53jl3udb_`G==W61d#n0NpHSHlO14WxBYzPmOZ=|0`@E-5g^T$7S&*?} zxFguNGx`e-hobmS4+#`~=aynlX6ATub!Fv%TZOJNOs9yqDEI>jv5lY6nur!mv!uR8| zqR|e*AwY<4|EK@CQ%`I^#D{RCbs4N50&Zt&pmc?EUEr-cI+a{VatS^rK>U*}T8;10|2aod(M1 z!F-9)Y)eJ{JM&G?kB$)rn78g?oA4<#eep!Rg_+wHQ$=UkUPtQ|QVxqVa7)`}wVI5P zTTESKI(f;}JxROoZ2iI(7A}*jyJ)tEv7E9`cx1AXfFi#k81b3#S32d=*SrP@Y1K?r ze(=b>KrZj3PqJZ~L4sHftM4hmXJ+LuPqX@3U5{hB4FwHf=a8^?%|1|^aN@IVi^0!< zZ1z9H{BPD)s#6{|5F5vY840kWT?(uqGig_f^gv@g~auuEX=X{M@> zcBTwI@q^^Ai5K-E7MTPda(3}U#EO>7vQlps%&I=XsK(zmS^z5yvf+1~)KG~5L!k(t z$}plgXQF6~BZtN?VQGk)*T~QaZX+ZHI)hftiP6-&MuG;Kg-5jQEgwX7Tdb9yDCwt5 zaL`ZKV!N~r!Qg83E_=`S7k*Q(iU}ZhxteJ6IZwg}@DhpCe2gQ-D4d9d`c5+x@xeFW&E;g6%`!=DCUZjhFD;jXelyr{e86)TBcfLr z7#IIWwsjg`%~`cK(m6&O(|U8BF>bl!lUqPOio|lCN2bH2MYQemVoY0jjAb#h?b*5D zqi7ss!8w}WB?k)MRryN2D3PZ5c0Y|drL_X za1G4#9=M;XTH4PLe4X>6%M zf#xZ+a3-@;R{bcLC1Eyi?Q(>YO4hCF*$&J;GK*qK@VR)qAiMDA(uXogJF5FY@hlN_ zcNj8As?yk!DjYhwI;E^iGd7z~$S;|o#Rl}WucHW=7noj&>_ee6JV>>tSn=4#>|O2= zpmSsFc%_T3e~X|`;tOsQ0peZjfC8R51W$(XA`Pp}&gL_8^dDTVN%1>BwrmyoRp}7G z^c#_%TkCZW;m1;Q<#c$;S=e*mf{onsyxWGfw#G4Fb@=F3DmP;wc$B(WeGb$!VW|3L zWvt_A=&vlxYi)0>4*>y_HYsC=0M9>BsQLgamzmL5El3nLMG+hb#uN6~L|{!>)IUu-8F zYnh*lnR_*7;1X>%7vwnQ+eDI)dFn+@FI?@_Y94Bz(#U0^gy-`kYN0<~pg4EpKK46s z?wbNrta;t@8XuSTXu}NVJbdw%FW~AM6icPy(PuZLIcX`z3WLoSoA^oxx6J#6IKmyr z+)rzXg`0e2^W2!(T{60aqvmtK)JxT-1|AaF_Qy@o6a-nJDS6#(^N0S~#JiSJbSVYC z@Zhs_iOo3)j@4FAfjD`5d5NxIxR@jMJJ8celml+(>@jD1fk?bZI9n4+>SdgoXo42q4<3_6uvm zgxwsiQy;^y6!5dNNX0#PH08+P7IZ1$X_U{j9n$~s*}i-PqtuZBd*D?Dm3>Tl9Y-iB zH{&ZEPF>SnEc6SsnjF%N(Htheek)w`@Z{zefml&_T2aaOfm8m9W%_xjk=5X|I>d|J zq%}sPMn2HZBylMeQ&r?#X_j^~@$N>wKiP0TSK%PP$8UMgT?^Imy8f|ugHe>~ zr()|SX6FV8)`K%Q?`;5N#NM6I#Z1fb!0JCy`f7A`(;`om({;J?h;Q{GYMl&E$Oj!A zL@uTZ@8WSjcR#-wC{A)I4#Ocx#BNru_Ac)q(M%IW3W?GqkXE4ydYA;4PKyZ=&|E~u zGv)*r-DR8CW4awt72YeA*234I#4{1!HFD_*Q*AeDoNY18vZR|JiMwsQh_D2Qv%yegz?k8+!m(Kkn|x_;2R7F)O*Cztf4 z&bGlrCWV=8J=N)D;jko1Kz!E97r$$bPTWzUz44v`$F*)-5gFFuRRwZ@;A1a7n7tdy zyZjP&2bX@-ZuP+17bqwyP2W$%JOc%|aP)QXAMk&A@8Vk5dy~b0=8zk-?dWq}EKZ*a zHdO4@F3j&W{(3$c@K;gzn&!lEY@XTL@RVHaKC3R6cdpo>x=eHpSd1dXM-B({8n%Uv9BUkm)fNw?n0?d(b@c$lkPZ06<#alA%$zp1906t`m} z{P|bMdedR?=Vboqf^QgUyNjiWYz6YV$>+ZIwqvwJ8we7+F6xAN?}^pS$`rAuL2(HI z`^KkN@kI&TZC5Uc)k%DqejD)SE!`7d`L@2X_z)1hQghvPj1oqYupns1Jk3p99KY@$ z{rHAHdLhc;ksK_iWKM6khjeEo+I#I4&KLTKSi zjJ7}=(auO71}sunH=rh-Fp}v4(2&Q+cOs&VMxAf2VTAQa_HSB83k0Q#Ed`~78GPK> z$z6L(r_bjN?%b70;we?=kOl?IFflQ0ag1BoQH(pjFUYfw8&C0FwR|*ZBsb<@op-*Y zD$L052K!WU%!`!t6)QcO;ZpJ%73bYsZoDYh-yxSPc?}5@jqX-e$><1T^}TJ9zTjZ# zvKG=kzBNoSH%f)yLOnvQgDrzVrG(KKO@0ddZ)D4L=6ugP7x~L?Ph&b%n9qTPQK$`< z)Wj=mL7m8GW8qy%-V&*^uYxgmEE-)SDuK)?j4k>Ozx}<&!HMYne#wGTi@w?L@bu1*Opr&-V<$R{c9cHuuy_&aaIytS8=wZM#;t^P`0$j~~`)6++eRna$ zW84)Bzx`5PTQJ^>9EEV7Q83Ft(mU_^18dlMOoRM|9lb4k6?4d_ zis)W9s~LXTx5{bqVNK9U?Af;ONY!7T{j`Z}3{h8_d8hq*RLvjcp9`@R=W%uA2c!@c zV_%oUU7K(Iezv_JMKgXRFfYw@GJJ5g1mW(OSjSfV3dq=MbS{t}S#N&8fyc27242|51adRTptmHIN zeP9S-^U%|)0OuEF8K}+2_81D2ZMiDnhNNI4OK$ne1y~G&z!!O2DM-YpTr?1!-~sFs zun3=%GhjM^;kAXk-?ieupq|){0^e%xo~Tktkz|dIm2Iz)r&)4?S8gCDfk!K1sd|sd zfU+u7K-C#0r3(7GJ$nLXl762RBc0Z)-^;4Y%9_q}2tK8W8O%hN3b3;;BD-U!p!Ad| zD0uMlXOR;l+VC}cRGUV=Lq)&Th4CpP_f`;)9a^IKH09>D^%T6D+h|CK1U;}_?)BO~ z!Pk*~@^fHV;Xu@Zu*`yR5085(_nY#1I<&Uo>iyZP7CzqT&r6-ukM`xDXms9M3}@;| zy%*?pS2qn@_53D~-;LIa$Jh1~Dt})5qnWuOESYxw55II4wL9x3o2Z>KEMB<1WM=wnv7yc5ZwO3a<{MZmx>^aaTEszdvknqB*^#3kiZSW z-l!J4&H>{$6j#m~1>7TjF0#BR4~2YgEO1khH_6CDL~~+ zkNN)eU#$I}G$wHzG>fp0Mb;q3=i>=4YD>;F_>C`P-&X$qhuELyamownFOc1vC44V^ zLhOD#)&5tDdw_u0PU^LgvN z=eoH?S{hYBTPF4^_Y0^hagI@=;#4v56x#I6`)yEPd{L&D=>snElSJ^6-HLv{liW2Z zO08{(_(<>%Bag7lF)RLMcKvwj(!qkJYxzg@xp@Le#P!|-HWNQp?VI`iWVWLdWBy|s ztW3f}P5SJjci9m50}j85vP(z4vAkuGn%-cN+x;UtRX!wA5ZydnYqgPQEY!Y*?j&F2 z82a7wfm3m{&9&|5(YVgI*~kjn%ILYWTDMYz2(C4VJ#oIOQ$B3CIFDx9AP)bq;2G!m z7EY2Tf_?00exurOnvoi|ekj@?8fo&nt-Q8116GL$H|U)q-}T+Ki~ zNOav0;LT~vaNsR%3=&vSyFQabL)@hBR~RqMGLUNuQSaI_RV6>S*rDm>&VfSZR^mEkvWeTA=qPWthpiiKwf(qN{82#Mtj`bI z6>@a3WrfB@CDw2}DAy-1OIpul*Y^Iil?*S@QEt$OCvN)KJJBLB)b*9X4@albkJif1 zE(LrZcIfA*0S36{HX%Y|dgUFaF*8~XC=e^Fd`9~9rAlF8rdXm%oEeHP#GxBGdWTs~ zh|*ROa^vYpyfI-tBfA6z|48N`7O_$1I(qViKhkqJZlj9w9l$*=oH0l!gEMlnOAp-_ zy->Te1;rc!w5>C=2jm{Mi8Us}ak1yinhpWpO`XYyfLIx%^pLy!J++;#p3uyI+2fo& zF+#4}>Gt;%Ur*3DIUcXaaL!6VSrudEq~oB*49EbgZ%w~nB~{ueD8F0rmBQGUw^Ysr z$XFeWy&HBe*VZ;j_)1&i0vXbc5*Aj_0!Ur^)7|wi;=dKSbn5%3#Og!J7BD#0{BoUQ zt>o+D(*VF<9q_5zT!IQ`f4Vv>v)bTa3YKjd2wbvXbaQ*b5odhHSh8ap)xN%%ZAxLk zF^WdxM?Xc%vRDaKe$IYllhbB$E3l~OP07gIJ_}5U&G@zZ*{%X+oYK5X-dEa4HS~x0 zcmHa_u`Vb71MXZih6X%+Y;K7I57nr2@lTtnW^nU(7PGH5Pt6Vv4yd$svqFg58Tp9L zV*VaGa)pXa{mr5nu${%o^QoJ=UV^E3%fU(J)MyCxt9msXIMYqoywohT-VtV-oWa_N zrxt{dsoj~m_qPa|g?~iQ7}MMZi-~F!rOOS436ygCLU`du1-aM=zmFu~lb+3S*6vyL z0DW9NZl52O522mUku>=X<@BLW!;}lc`o- zH{Oh!HV&<{*~`cj2uynkFyMl*@G*g-ZKq|_y4MJP${LS%?Mm6GZ7p{y;}w%TVacJC z*M(Pu8hudHSEA_kWlW_ig}rw{ZD!hhP(FI@05NxDv7;p;iC?w#4GqEk^+TfbyWk~d zhc6|fN*cv+)%#eAGFd;4PB4-;=b4$mr)O%fsXDqf(nu)~gqo;tEX%vqN?S!%YLUEP z!Swbu{kTr>OiJ*`MONtjVPT?okL@$hfizDBA0IDc-oxM(!uI~kmaKPWfinq=MR$1> zKp?YVMcJSH+sHWD-|1&t)8?I_Y{p7)JCf19u34MVik@+w z(yxFH$+dI(JWs4tiWX7TiT2+ zYv78KM)C(hA-i(OQ=9yj`WLS)<*XSfE zpv+OJ?Gk(m3zKd@=0+@flU!r%5@Nxoz^v<~zDpWetgKw&VFQTzLOIJ{D|CGXi~Dq% z8u9Zf_DHjtuLQFu1&hY7K12E8FXTxMlJ2%0>}zG|!bF*Y_&GMJZ+g{4Rj#Bo#5-4p z88UQ9I(DkOX{ZD#%i9^j)GU;h6pTjpE?6@T$aAAH`U%(Zz&jtvXP|2uXJ>`*Rr4?T z2O2JTCwTopXW-KFtGdvB0>;$^-B%T$B{+UJfrGN46Y`Gbb#gKtX}0@C+#?>CJF`1Pt-^j1H9v(M@>3I#vQjW$Y&nV{ z)_R`xw7dN7_CQ8K_+|NB5r&Usxf4u+!%H?&&wgm&RGoo!13PhDGdy!F7n7g8Ai;tu zpiT7y)57G%ERN!7K-7z`Jj%@!jZj)smXUAZD%wRdo=1c?@9!hZH^P78nnI(*xM77( z<_&3BeKGVg-jU2py`~7+$&fSO z^4WMaV9wPYVbR;dd8*^{|?W^eIfH%4g= zmp6xOcns5p58KKL6`d;VkMPNO*4uOj z&^Pg{ZXYoDxcxpVP(#GN6w@Nj25Us{mJAcgotbA?#(^W&+qxwnkiFcNUCB1nY;j`= zu}o_blMHO-q-AvkiPmKD+E(vN0|6@|JbybUpwVCYP2D zE+$vhp7As95s;Hnju0ucvJ$MZ33Etq$rp_rUx^ zN}yok0A^%(ZJA}>q0@9rb-dDYP1r9dArk4BHiOZe@oCO|M~Eo7&^e?|9U4OHYjj_1 zDyzVNJD0efo>$Q9d>>;l-hV8+PQgbf_D@>1Sev!zo@VOUnV%P9wv9#Y7F!*-^AxI*A`F zZ1VENX2Sv9$NNgOKEtNV2K_O;1x{WA0nbH7YyVd@OZsYq{b1Mitk~2zOa28<`e~D zBK>~pesU_#MC^z+xgdiRQ*sF4&t7c~w7mSqq7>l~Jbh6J=Zw!zHY_zHBxG>((n4~M zFOR3V+f8ZsnrD{prfMz-yX`)?a>ltUgI)I1t+TpKK#E)o#YA%m_JV3;b5f+WtOt~9 ztx4c|SVowSwZR2mvBVTT?L3vG-?4vda=*hIzjyPKAGNy>yHTZ9l-!gXbS|}RFC`yvt4lGpEl3~)1kG^^2^@#r>Hz>oK4N72C80WCnxd<8bpcQnffJM56t$osAU^k>x*f5=PjgEhm&468_ zj}Q}?`HyW{42J6#tQ<`go!VWW&)xOz%NS$Y^?BvzHJRB?@bYSJ^v2-s*qA3|^h~aN z{8(ScOztkBxJ8H@HItk_>LgPHS6F4hV7TeFFTbS~7Fk##TkHK!jP&u=RC_363`#aOsG7+ArrrtC2pKBrmUFCY=9K4BRUyfV=WAx&&2sTZy8TAxd@5F;ndAkdTK6m-JUs}e>gk?fJCkmQKg#? zG61&r)W5 z3vqKPeZLPV*hzLcs5a6GglclCyYV=O*ZN{NrJ$uOY(6wPVa@8frvPI561f7Q-(Y1q zLo#1wt~K4?<&1Ru4tp=!7LcyRYLW%ll4mC8Uk{tVt&g`|41+aD^s%;q?$!h#?cwSxin@Q*I;(z1p^Y=3T5Weg5+6#+=r72rInW?zw*N01| z8vU|etFC0ImBF=n!1^1+!Rkhoj=(6>$M;%QQbEDi#}^h;om9oRTMc^o658}dc7l_% zVWAUg+zndSlEtf4U_E%)D93l&p}fk!-cxOyFr^JFi1Nw4x|SUvS1qdf zBmc<@Z2^mYoo&m?fe3`qQRB{}8{I`1Q^UJjLqsB*@EQU&XIo28G?C_KN=gff zMQN|l$q}T&NPTpWV@)b}|Cj1^*X4IGJWUNWkP%`O_u1iE72C7wvFqK4$xjtWnh8GE zplp>utuj(RR86yhJnXlW2a9%3`e~0@>r<$H)QvHAC$2*l>tLDEjXyZsPi$!ux}-cp zF394jJw&`9F|PK6<)|TCQcsO}OjmnC!BF4O-eTyj7y|mLXnARZwv~z>%xKBfs44_wAt2;OmV7^z&!qS%t zm-=J_@vOG~LBE^{p}A2fm|R&7KsF(J5x#_+Ax3Hs0T zh=o!^oz9bDJxF+T0lDdZ4SQr3IK)cH)|mGh*j@sdZWsD4?OXJ=x`8RXGG#w56Atl_l3Xyet}54M+mRw9OF zRuAtE8%%Cd6@t*lwKl|hW^tDv3+U<2&xVTYqP z?G80rnIn5@Mjtp#b6o@x%*_mAZI?>jeHL`zad&8a16NPo77A3#sX>TRrnw#@1nG**I7xhvoj zy4)z!$UWLCr)B&y{-M;(Qwa36A(We7rfP{re0;*llhYc6f-&=;fH<4ft zjJuMq0O#Y!ef@$n=`4P#!Y4d{%vzVtb)K%3xF&nlAqQq25~`Tba0`gu8`K7+hq=r= zM5i?F3X*E9sYbP2GkO^Ed=S>kCbaOG6BT>!=SB4R!o(rPzT%%EDpL_zodJ~OcXmBB zAw-#s0@;IZu}dhai1x~hzS|;?X{>JNW&4%qpDYA@>J6_VIfV7;T>6#iDvp>X%sXMWwL;wK-oT%Nyw5X6Ny|DW-H zf4SEGk+k(^k^dll_YYB;|1cH&`sa!Ncjk&e|NmF%h+czd)!4Or-SbQCw7VFO^NNG+v|g$x_k z;ANuX={%2wijW*6SOR1E5#xzWsV{vCUwKq@zNxE!e(L{RwAlZZ z%KqD;1Q*f!HxnoNZ{cRirdkH)H`ymRbmryfrJ*CO3AG*0oBChMf3Aie>k|PtmF#Z0 zkuxlQmfXV0K9*qW_e&zYk|5|V9{?XLYZ|Q#R zKvg_jQwVJa6$u$FI8RYCZ5cfIv)iQ0P0b}?Uzl`Q7&)fUj=Gqxx*@)em=0--0fDZUm0Ue9=h{wBm7u294L@ZEfL#hhmSDK?08EAVRPC@dl4l=&bp zv^eFe`m*`96Ndl#{(}aW%_rYA`tc3>3usnN<=JD2!I1fk+yeJg1^0VQcLt`LgoNxY zh}%F_-g#oJS;c;dJtkpP(c-lgyHAbONc7GP-r9@5lN}kRQ)YC&%hgC6M=@dAPdPoG z8g>UCEZ`HhosZ!!-Dx8qAz4eA^isz zbD-uAlGBr53um&0)5tqchtXBXgicO<(J{c1O+6A@E4aLppXZ<5%kpPp(VzLBYMP`I!(!)=>2WS-+sTjSGcf_cX={a7t(y>_rJd; z-wKDY_bRt;TqA#WT89dN@*U+5o?6J(3EXEl{7+KiUr+tkm?zo(?YR7-!X2Jd(gCSl zaO1a^{b%`%z<>B|oOb>b(}z&0@9RDHN$wY!93pso%e{v|vCNk-S=!fp;x zQhPy7RsvcYxKh_zsazZyMgm*$3lRO!Sb|qntCn$->1`n$2)2saTp_xIH|I9Uzkk=e zWNvHwU2YN`6a^74D3$Vl_{a!W~pg~I9aOjpDHjk?F`53M~Xvp2c~Jwlh+sIaq@`Q z4)ev=4yFrmU8)GW-~XMAeQ;a_@*x>b`uSA?7MkcZSf17fpCjA}k+cDd z4PM`!oD6R5$Sw&~UvO$BPebRaXGAZrP&s~ntqYez>S|~B`|$c{#=y(-14+K83+*tN zV#LG8HM#c-B^BB#HHr6EN7sCD2gw|H+=Jk_j)>NUrPq=tWkf7(Zk`qa6$c6LI8GU) z9kB=wZSC7w;Y8RkS-14`s)jUKPnJ8+6<_Ih+X_bT*@zbhm*Jb*BusZBvYTJpeuU8D zzxW}yG!E0vPZ9E%Zr}?GOW6*dQmyk2;L|()@|I|J7GX%7ty_kB@PsD&woURAJ$L&r6q zZwGj(Lt<<_m#lN2br1H**QNfsJN@PO-?Y^Gmh@cSd)DEW+5U+~9Rsk zo~Li|AIp4wh8rFC769-~p#J;^`J%D8X6}Cu4gaq`T>zu|CN#KvWO>m4K`$FTp>F(B zLY#cESQZyfT&5gy9BA9KVi&4emI)9|8PkW)G_*oFi!2^L*-LscvR z`-Bw;cMB?;PW8>o4AXbJm~~$A_02D-jHVS@XN;v= z-PA-+nC-z9y{lz0>~r<;U;kLbEK~NEf^t#^R(8WTvikI*$w6yTB42qF58dIeGPH_g z_8n&?x3s=EU)R1iIbr};BQC@oiyrrv#^?5)%1AQ{WqKJWW^KywqN9fK8l* z`LEXyH;h7k5JCKZpglyyc|*UXi0Vj(B#*&ge9mr)ZR=S6K38o-OOnu~m=SvO`4kN# z>l-q?t)l&@M=nA3<--%<;}0)##O%8-;PlJ2j zubyp~0wZpLK9$|(#%V!w1vz7o1V*X;JmFWTm*H{VM1cDz(-r`Ru*Hq4fa8i7KwudD z)i;ha|9mSazNKtf|HB0R=c(U)yJ<_m^6g6gI{jCk{|$}f&;N5J-k=?HFC#Gv%oNIP zT}!hv-tj7J3c&4S4|}@N-5&#ACA?=CmKv#+f-R=z6JMMDlvJZ9Cl)T4u_ik6nRjmY z&i?PLuBY32A09|ORNDCbI{E|5t2rv?lTqQ+qm{!px;MFjR}YUVHcmh8dS`k168gnZ z5k76Fe33rLzi0sB1}~d7szMhahO|%XQ6|dCgF>KgQ0n=c~?aOf{ zoPo9*rqeYoda=qbfQGZ7^JM@(&Ti^{{x^4kjeT6A_V!v-AIFnL6p>?T!n9i#P6jlO zzf-I7Xuo|0X5MWJu(a)14mQzI}Ms`#uNCFxE*M6-aAO z)ASMU2hjeA5)lXn*?j6Y6Ui0qUIa9_zCj6F*N3v%$I15m=t$jrE0M)U2|*5FX@+k^DoZhY!@ zXXkTDI}>8WVh;L$;`{r*|3UaSb&P9HVVlV;y@%-BUBCQmZnEdC{X366R5fDpm9>YOSs*+I(;0 zA>YPbfT+vS!#SgK29oqqq>X`z@j^qahi&U~whX&gVW$!e=D4EyQ8u9!*Rvlu!mnm- z;&82VV$Z3^si#o1M8KGW?07plt6YnUb7mLYMrerC0V=WgOC>FGEfBj?7Yh3w6<0@d z%llhmeNRf7JFc2ekMzE_bHhXd-F=U5@}ro>P0TQ9S*th7hfdL5(}jeTBJ4-H`+{4G z07VGZ#u*#Xf?k3({mW$(riXOj1DbVr4O^saGkg*9T5nl!a|7I2L=gj$4dxwx3}#C(R7GdByHyz z@{3LTT$s^f$@J`$rF2Yuynnf?R=uKzTWMEyiCJm7M*?jl?Ap+?(FD+z$P4Tld!I`K zTaH-|0pc1_?~mI)*|hAR(XTsO7qjs6`46$6gP35mPy5@;be=z>`oDSS&YT2q{(_Lp zt90^e1d>_mm)t8UKB6Rbyfq*kr6;Y>Jd_ajKmrO-v-{b=z=)JNid$IL^KS7TuN7fz5#{`J(fZQAy4d*c*|tR z3y=_{jA4ofHfx`*^+)S%7Yr{q&!i9sjF?z+J8Z*G8)Dr?Q5p z17x-13&0`(-MY#lJ zw2~0kn{dEbtGu%(TlJuEsdw~e;%g_{w1WN`s$BUCnv98Us|i-Oq}n*8wIdDW z24<2E_)nvBUt9IF-Wb3d{KAfZh5(1y1;sCeRc^PbP<|=RVjmYqN4^2(x(2a%v!Ote z)fg)DH&=e=crzoXph^%Y$98WXXYfFx$ZkO!p=A;NqJPVJWiSXpvY%0nz;uqSx2UM~ zKkEirIj(Czf}<+mXOad_*IbyeNXB+=q3pr#{>hbC!5s&oiZE~>9(c5;42%eHT7#di zXbGz7cm33$z1lF)h`l^5K56VEKGa`qejj$gRc56R_5Lfdc3(v0H@NZo^36#Xko^~r)DKLU|8+5b?lhXu9 z;F>(9u0lu4P@RWG=AoA23n!O77d5$YXUx15AZ#Ng>k~-hseu;Vo~u@>Oz~XYHbjBV zE4g@tl`~4cc>`HbWNy7}Z$L$qPAm9IwC*i*jN<80cy}00(KNVuX-um;TZ>4|J+KV++wIt<&91W0t zG}7w8sl{`&GB;aBtdOBl`A_Uq^e*Nz3 z9;rNN&#r5B1+W{x3H6@YD9h;{HCR9Q2fvEAB>W{UXiuxT))mH8bbnglGL4o(&ZNER|e^X2TrNHx~ z2WQ>G1Y9oi#?bC^(TLw9ojLhW9?`&++W1H;-qVcBif}l9n>&%z`P%Zy>@b7EM`;}Vx)E0jNbJS0z z{JaXLn8pvbQM>%gHH_c&5z+M>fH!!yoN4QE%qP z27VtUvN#%fVRF8l>Q2A8YMrzI#pkf|D^zd!k}am01cdDw)+!)j&5c|xDNi2kC2oSU zLB1wb-$4vVL(c2Frq!s&(OXA|RW5#Q9RbxNL=hV&Tjp~7t_xc*ainpLQr7_!uJ_d@ zOhu{p)ZeY^d}nkyM=j$394&4)r5RwX)RFVft(+dzky{bo^;>j|e}u;{ID{J3P{iNf zc=bXv`3XOzPmfmYcc62w*sl$UsQqNnc5Yo!v#kuQx+!?G@a%>f+)vVv+Gi(ang|Zb zKKh>Z-ZZN-&e)1LO317viBxpLQ(p}no*o%S1hvmxy11}|EF$I@a?RZ`2NXVL)BP@u zXA7sXcdt}1h?f%*Cdj)v0t=5^gx_m)#wwFl0+=ms z_DQ4RLd{vrs02oS3T3P~LI%#RGPwFeX7h)Af-r;EPesD$O}LyU4a$0Y6fver2dGHkQyzv7@PD*Jc8mWg>IwA zLtHZ*!)@kPY!gm3W3f``x!8f%oL*N=@QqVGv3vuyUg3$yI!hFPFSENO*yK&`YmiW# z-`3&148#$J$VuQS!wP+a1wmitt(lm5*J3w>P3&n$sDZ<{tE;OU z|3&&L^SsgJ&+IT8VXrCSjX3AChhs%tereGBoZDzkCag+6xg+56awHUeze^>COGP;B zgGJ7(DSp|i@K}=paBN7QEBz<0?kl_p&xp2#Xs+;o<#ANHrgYS*YeKC(5X~RghQJ84 z#JUs7#EhbDshsG_Fmdr|5SJt&iMqRCSvjF*55KR}JXf%oG1VcP9%drmA7;D><~UD5 z6)Oq`c5~sMNz-;;dCX3xFSx#2=IBOS?Ge$u9LwL@3+bMnwr}SCj2n2b%Y~p8wM@PjdPF%kCY&|&g$h@O^3&Ul(LxN>;fz+XR@mfAjP(E=Eb5G7F! z<5?Dy`m@pCi&!L4HiYX-sd*CWG5$IqRKy37gf)^~wXpMSIGDegh>VLK&H#;|iMTzj zojEeYQa)UNj_J(t@O=I*`2HNqkri2wmbj`5vmX?A=U}H*GyxwL{bZm-6C|4mv}DU; zFHuR|Tt`yPHp%&uQz~T*mR9Bxe45$eK*0nFYjwm>HL+-fo8f_&2^7u}P3^WCohG4Y z0QS?q_ZSbzSsEYESrns_BUBQ9$s`=pB51<22_pstg+5E$(>%s%F*z$vlCn=o&w%0# z;PxbTWH3BZ+TscQ*;K$S!;|@BjI#1@r}}<4Tv#PrQ7%T@ZXvjLC3Y-orq*riR@#&I z!v{oMZH9zzhx=+SQ$vtRHB^ieWzY9ldZ}{p7#VLj#cazX$+FQQ=1n&D8f;y;{#C_Z zxmy)MI__A>AS;DahNSxm!l}Ml!ke=z)tB~_D>TThPIDh**S%2u{ss5lo^3a#j+Q02 zei}q+I-|H@0&nm4*4XrN?5I*V3nQHP=TQP_pvT};o4ODSlUI=vuj@kT8WM1)?nn_U zbH9rqvs8mD*UGl+tIuu@(ELK_eR@JjNw7Qry;9cvT}~TQ0!ALQ=USTc9z6`Ovhl6z zb=AHxNC-$o*?cI#HzSI))3mVqrBM!IT0>-fYKuQc8A~J&Qnk3bjs6G|NFu@Ta&WfG zCNNvCB33hTq0k3#22gxWs@5skia8y`rjHN@ZAoZ-SghM!^z2pUsYAb59d=5 zc@;w`V!oJB)YsPsbKzz2Ryx4;Yl{=oLh1J9z4nx7vEP?z?0XXxeG^wWq^W|3Vf8~G z%~xc9B|6yvqUGnkr&?6IEe6qnD=R+Q7E^ortG0mX8y%&uJS#4>ve#LA*TW5>zw)G& zc9)cXKHPKot?bHYS_}#i`$2){P|p98zfuBjde=-0cw(n_mpUCd7mf$I(+z@Eng>$w zrpJ9!rgsDheT^-XTw`Vp&VsCONNddz=6eG^5~9+p^uM6>7w9n4^~_Jj!{F%pEANH! zF0#jIJ(f0isw}lu_jV^SR;iKU6v&bc7r+M>w$afJiLC*AkDDAa!^D%of|kkmLvQ(I zTRd<*C^qK}?6A73{Xt`qda}J|So@cgj}7>|0{iN3+-{Z*3{(WH(-+rxIgas@;JMLE z{DxGaR4d{lwkBQZ-JEb>`%rjhdtY%15SVM_TmlP*r-y*dF=pX1bb+~fpE>Yb@kW)Y z!ZTO3tBB0*SxeL4Cj#;p@*N}OlaX^b&!3HxS-50(NdBhIkEk9lYJm(3r|PJK;1z** zfY#lprp*&t?xkfMg+!Igh%`fP&P~JHG-}@QbDG|nn{7fIW_R1jvb%-Bh!N@HGfZu1 zHl zoxaQ&iGSzbtuQ;ax1rDB96vIyETqi01M^8Xvp_HJW_kVQm(#0xZ{+Q)ZRtTvwqwj! z9ww${eCUCLf0bgg6VS6bMBnc*t>Xdd&~-LS9PX}<>dYW!uKQ0BH6pa~7%D^PBZ~!z z+yt_zdfA2>%R!aSUeXmz@&Xru_O_m=s%qOt-l+KAbk=9Q$lg9fAn;>)lTdgw?I zoR?&9l!$gEkVLst?ldT{NT|8-CSNVxeumZ=I((HcBUE2KJc+(c>kv|T*wcF7V~va9 z?3)wJKhvBEe1C(XOK)Zt>R}FP5VLaG!mON)oa^`GrR@AzKeC+HkbO({T1wCOZUald zoauEpcGVvgI%V$eQ}LNN6_j4KXq57z=}L|Nl@8T1SOyZWr(*S$6T*kkE=zLpT!(-a$3(qh?JjA}cP7ftn> z93Bo_Px)OpH)t}#=E=e-x>WSNf<9olyuiXOl`7PsiPt&-#K{MXDMc&OMv&Zmh}mF` zJts94A7Qrbu$pzduXD#>IJli2+PqO3;sx)VT-;86ZAh!J8W}Eh4&^*t@Q_cpob}UOY~4reIZ~&v zb4fkFkKoc%%<+p>j?d83w$+5J&;7yk@hRSil$dw+2CaNp_6~+sN@#8iE4$Yd-J6Qs z_XJ(_-`S3EFu-niBk~%6sA^N^cCXzZBt*C%yRfN%*`bM`O=W2basjmdlPPrKP#-IZ z^if|wFw}$@NuHkqLAGB0fQ(Y8cC`;fY*^X_M4?89F_F?wCj}C+@AgYuUnk|E@S<7t+1vNPmfPA z6Vp9E9(y=3AYI^cu&~|WqdQ;St#vEN_#8y8xCuTwEuNYoSiXh_77l^o68fk|5&!Zl z&yZ{oc*)RckTO#F!w?rLrCOZnNnXN6mXsY$)Ez7?^SSqx=Se%lz$x`DF&5$IHl;mo z_gp(h{5uzm2K%tUoQt4L(Hrh9-qGh?JNc02QjC6?c>~ZY!;s1*BEu+4&S%-2-9v+Y10^W6GC8L(HR^*MQT)Q}L9n`k1+r*_Xfl*hFDmxjiKLt)nEzZM z1T083+pIupT(V;hO|1@jK&YiLU<)sxF$+8u75O8rOS0wO$#qJW+qET9WO&y1_#zDb-sVF2Y!3r`E)H4|Pe>E85xD+G{;GpO2MjkqR5dzw!{HDW(x= zOJ{_{M8MqS8swIbx_lcsiK~xpQ5xt@3Ic|f0fE=Fa zB(0f;M3O2NUOze7B-0~_6zpp|zi=BX8qX@ZIa&gTW_zTTN6NaP_{o6J7Gr?|4UWs-xej!NInHx16uOA+HoUUY?kjFFfIX)VE8C}?_R zEV>uJoOPQ1X-u)t7dEKM&4v+F_!9p>ox5%qWbGU0AfSIm=oTg^A7Yny2Mhc#2isWx z0o!Q=fnG1J8yO!)%*|zI-ljk^eWZP_#7EtoGSA~Pd@X3QyBFf;aS_?$4T+5`b zZNoB7?pdMd9|K!enVOcD(aMYaanywuR&SoZc{CBaSDY$O@>02A<|;nz7CI++v%fk2 z$yc5XAdS?Yo?+v9{Y|(_)fiDmDf_3D^V>Lr$I=`{3qFzt)LjPUWDxd$OQ=*TCSU;M zjs&%t;JSi6hlf5=dK>BwYyp)vCIA+wwKSNfnp)a#Zl%R`#~IANSP3LI$7ccn(vWCX zs;+rpNm_iJW5__VGl9dmC-b>hYks9S@cWFJffx1m;vKnEjh!yN)OS_}M{dPk92O3s z2{x*#!R@nndHLvP?}%K={k98v2lYARy`f%SUK<&I8B$O}vv%NJux*A21QiR%lb5WR zYk~MuwPC60N+X}*@<_`kJ#O%)^2C!O=Y!!-)gUAL7v8eGP!fb>lM4N51O0{C<^&3( zr4S=05KmA7no0VG?&hIC-flE){T`y1QeZqXo%_52Mz?B>Cp4J%5({$7WMR|2_aX2; zyn}M&9tol6gL$v?Ls6-6=>1N@H6dgK3kw*p>^yYHqkA1mjp zA@Ho}?eNOFGIDN{uWEmo6%(=R86s!tZfQQu6rK!wmRQk7UsCC?$-lBj#6RyV>Xtop zcJq$UlTmWvmt=oEbdQd-h9<6GJ&os;fO|Ff5BmjGro6J@GYrwPq&jKTjSu1fmM}+U>r<(F z(7Rdo(r6~vpO+&r1Tp|v98=cOqx-XmqI*f7qRyI~))h$Q40al4%tyE9Hp;#F^ zzMoN!2;Mm@`^^goX`aF7mK6Z9%eLaB1+4LF-*{bp0F66oK<=c9l z__iWL)T8aTMWRdXb>@EmF_v`rmhNVV-bPf!Zq>K#B4R!UiEeU%_a#T(JEG`6K4S!g zO%yVja!oRmoC_bHx-92_?N1DrH|geCv%3N(sv(X2Z)bFvlC=zd0~E?%?Y+f} zGG5$8Ff3rJZ8Udk`|@hBy1}|ByttHW=bfxbSb_|l0fX!$2^i)r&VHul5UHjF6Os7h zhck%DE-&RIcQ=2#SvI-syrm(oF4(Bi%_KWWzEeoIiA$g%0{b-JwQlwM^N)k;E6#sOLo$6jp&72CeKz2nlUBjM}Gfbn`_xmS(guNLzy?xL>6P{yEl(Dwvrr zTf+sxgk;S8#M6BHZv)I>r>Bz;Vbd0elqmtE7MRF6*9CR3Q+AE}p|_?p3d{Rryi4O5 z41Infgmjw>`pUDY_X>huWO&B{T5dB~2ZdTgLf;!L*@x)b;L=d!xBY$>}ug1i9yE1#w zYN+L0^EA=7vAq;!LvI7c*EAjfaJNTrF^!sxf@{&8YTgk_^iKW4R zKL>E(_jj(qf?gm|s+*fzC8keApua}2O(pIiY5qQFP_l-#nAx+nR;zfsU*g$1V*DUV zBSUCwYd2J*_Qw!qvz@??Ge7pUzJOX^STHb|fM)#MyWdLLKF)T}@sihj)<+*fg_#dE zl3PZ;=|&;n{foQN!+^(ml-&H%GMMW3D!#!fESAr~93Y{@fa_IK-b%>Q+WN|qW5JDe z^1Mclx?9kCrTXE+O&Dp6O2TJR8_BT6X<}g?SJ4B@&Ja0A#vNQ@ z)4BcSU%mWH23~vAZ7*V2lxsr`+2nkPU0!GlyLF}%%!#T5D@2&>_-yI< zth^ag9Q?U%aOW$JCVhD?cmJl|WH;B-SO3`$rK){%l+(6lb9vz`a0jE|moI}fG{SIG zx#L{%y*vx}u;4FL9Vc-$KQ33*Mtih+`M9TL zVHy*fOTljW`Y^3b?us4LsnDUU(!PRmL_zZCa=<#~0!rg-jS zN=Honyi_i+{5GrP7m!6WHxGGI4NjvYNRq3(B~4otwQ^O>SJh^6-p1^jaSKGdT%0Lf zKmNmy%<%a8p_4@+4~OsJ9GrAKfcDF!X~*Zis^rh#4o$fslrgnNVz(Q(uB+M;M~P%W zO7{gVa42OMD5Idd8Jr%;1b1&<8Ok{HmW^%QaSOtTXle9fHH4UzAOo4t9@#pIxY9Q+ zAG>$M3x4&!qFof^Xq_l!FOj#}fYmymT5h;zx)mMTQu~>?9p(ACxqv_h5I)L97U86P zvaj%*$mZeE1GZ|KJ(k$u-+0aHVKvTr#(9cQq^V1F!f`diYy%L8o2xN&L|!x2W|_}Y z2gDYY_FKI?nelmL@fBv(5IHr^yoxga%0rkyH$CpMb>wCiJeu3-As%&;x4TkTPe0wu zGZHFZKaahBuw#9Mj`x78;|sI-kvTWd~^8RNg_lF&E?> z)=Yc`L&jb^pq(z9H68RO%Bw8G6>Ll_$mCSa#ocq6SrQ5S*m`7F=uEPuHx|4@XsP&2+6(zNuf3iZ8^e>-sz=BKW4H_i@E%swmdc&RYTMd5vg zfg3ilbz^E~(A>lFN4xy*kElY0&orEz57cZA6g6Xm+D(eioY$gjF+DTyQcdJ%hxwO{tTsVy&EfrS^9k>CQmggEwjCXL8$(8x8wFXO= z&_FIOa&eP$K1Qwc;ImfY@1Oa1dc#C_R?V*`ts@Yx>a*e;#oV&-ZO;tnaSV1UrfvAV+`>&1Z$mM{~dZ(}7@%K^%x$dr#i_O+R~7d4Xu%z_us30^BqJ8zsds3D2v zJYox0qs$p}b@O==KP&_18P=3MrmFH$5zGrRocna^4tiC@xMeMAtxRa|677a}L8Ub( z!+AKbG}{zL9&Y&ZvV2KDa!a;zG&+;vOP2U$iTP{<PcjXA+6z`NC9f<-HlW^cFUK8-7|hT5P9VXLT)Y z#*3S{0~qW3`QzQ|M|7_K3kUnlOQn$Tj&YK9C$Y-6ahs$+jtzkuIgE@nb^4r66UwN9F>*8XsR!#Pze^ML)fj?@5d>kqy@D9#8ffijv zv1ns9vq{kAUB?K4i^ZD87jofY9R9N_Z@zO0FaH>37D8UnizqPieXBH=`MtThM<=Qr zlzvq6LW?lTq0*C(l{=6{!V#v8GZEA(VEW}KbK*%bFs)}cg>)hkM@_2pa=_{?DPez>GQwcv1k=(cZ z^a8oKPh0LA^iygw5xj-9ZV+F(%kvgLHBGN zj?#bePB8-vwl=su-P*77x=j}EcTio!OUPtKSL%ay{Re2Br6B2Mp*uxI`DraCM&COI zbZcPRTV(lXr?4$rY9@H63G?)rnzjlgCqHPSLg*Cj`8$CPG?yDyVQ(L4dw1!Q@oa{; z8)oi&vK!aeHfTGnAF$l0@)VrME`=`b{}z++ywHN`7Pk~t?IcvLXp#c+ac_8D{D69s zUuyw&A;Wfe>^6n*eQH@$l%41#97o`6agA2`3qHOV?9G-!&CE=b=#C#ArWN>gw+$H_ zYNk|Tp;!%wohBYos_wL9o*Q+P&jrqKAW}~q_uG&)-SL*;Ymh)ZiX2M7yr3GR^cOt} zlEWh^Rzdn44Rf+`+|-5Pl9YbJXwz@6J|=UAGrz+FM?Hfi4(lOg}E zj{Z!%Sbn9k%2xlaXHRW&RH7icePjl{sAp%`wiVsoQ`07`<>soWL~hPfn-BeIy@)23 zrqjyUFWW5~WseWkB%W-VrQG*?@@^?@b|2`i1#M~OutTRKN$K3ARYm1Ibl&rgm^Xf& zuq>~59-VL=9+Bje*{`c|zMM9C(HhX?_I9RNLHaAtBdZxDOvkGY#C}YIROcR4CkI62 z0n8bHI|=?xKJ954Q`kTuRan}YTiJY%kBi*BTWDBJRk}Q~3D+3uTL-FIX}m~a6wD{E zkmb-MKcUSpK<|wS(Be7==veHL#&FN2lQ8NagbGtvU;j%GZ^xI{s*d)t#XV<}jO&7& zEHkY5`32~fg^8A%xErep0?Y8CPY^R59pUw!9!7!pM9{12~Nx=kMYX_F#RxEaC>2D`J>9c(mf;b&v|wc{jt6ep@y5d z%%d%<``J1s!RZPcO8a&qlDE!G(Uqoz*#R}Qvs^w)LfcZY>9bkR9$wKh|DtZL4|}T~ z>hb{0?#^dS`9)fTyRWk32y}_nVoEU=vm(v`KMhjV!ew`3&6{!fjIunR!TQ)UqJ8qA z(=s^xm$FiSk&*EIb12bga~+cAwT!euZiCgEmi4@=)J*Sf0JiQ%89a8k9oe`~)exR0 zR>mOX6Dr^vBuj;jfL?Qdg8MxunE%xllMrG-isleDvP0Yh38~Rw+G#&?cFLjxer~vT zPyh}e zxoPQ_@=?9B(TUMw zx;_ix7IXdRx$H47n!ICqtU38KDP`i$w0%E>QD7-baLZe*68iq8<0OXPerMnvWTlO1 z&&}x~o{S^uZ@eX*xJHH$TboPnb(o)nIFr0A8o_RPNQ)kiB{#5}K#GNDA<#Geo`&CZ z&k%<66IV7wBk)vQBc@|~C0f!PU@_p_*aT`Vq?Ns8rD7b}OT6~U{vg!|g=aHtiz=|? z<6b9kkCw5(5S)fgUR0X@4dsCO4oj2X4EMv zDk3ONMnI6zh7yo&A#{R}gwPr31On2f&p3({6Qp;LP*ahTAcUgQyFfw@C=hz+9nmkd z&))BzIoJE1{eIuIzkkj-`Gd6xtgL5cJMjj^f zg}Hm}lou4osXv28E%pbi7bNy33MnDhaGgB8Uoe+Cb{s6Fq=N;Rg@Q#T4I@rL6K7zU zJlqc+2+84GD|JzXb`|QER8jw{0U(4X5ym)YZBH&f%&VNrlW+gT5Wc|7uDJcU6kl8Z zbmL&ZzrBH2*tVK-wXQx6{j9=P3hS|0npz&z7kwtt(NQtdVvA52r~|V1rmkjt{i-k{ za$8>9HMqkqI?9&i{AIB63+v(Ue-1)qBTl3v7Y~hs*_P{UHU9h@>02DnO91~qmfo2= z8&09U3)B33S6A-YY`uCc-{88vjyfN|Tk!4luN=(XtGA2a`W~$FSlFWH$8pP^o}#ZO z*w_i~WikD1KpV}j(6Lr<0RRw@@Y|Q$q@p4PfX$GDLhl?8rYs!K_no>E=2fG!;sX#k z0iR`s$QX~!?liq9#uLy3b^~&u+^V1NZd>7el-@8ZhK1~^mgtc6;nCsQfRfTY{!xay z*$$`I8X_pUCJ1Ov&2NY{Z+HphmwUDV?-H=cC3irpL!eLAlb zwtTq&Z;19c>&U(jC{?%XiK9Dq*(wEmIyMbm|H@HS?NI3vaMq#OwBpz_^1?u5C+8Qo zZ5YwvIsN*$@Q(ZDk-GlYcd`cl6(-z{aTDG}Z`29~1E5)kX*dAewL4{Ey~*Ck)4Tp= zjg4c&tgo{L-sPgx>=p!O!ggUT#>7_{yh>tgk)7mgn8w=m(7b&7vlhH*^Q+~S;=q@1 z+9WApmy}f*OIc2dn}wYAA1d{z5*G9Wq9-WnI81r!^nkM6Yh%Q&CJ2O-f!M)MN#blw z9L&I-Gd@~9iHVxTP^9P(PIi$hyBJ%YROe$_DBpkVr@Msf2{qGbYSQxQzTPyaVstVy z;#WO^T_XA^h-IA}={giV7!wVD7F!nE^`+5#*VLz;K7x>OXHA=(@pOQtA+8S$Ly*?RS71~+gvMX#gvjt{kc4gwj|L*QC*;_Emft{ z6H>xxZ&|(23{x9sOu!%E!^0DjLdV!z5YLu95V&>_Tq_#(5P^av*Z{iiqY>!rUFWqi9WM71h9c5 zmNhJ9Rbp*fg2q^>E|n&?n_K3M7AAHrGVT$#%*;ae7io-8$?EOP}w$t&b1iFS}~N02C4{%oRoq0x(sb5Fw{w z=e&}$ZWWApjLBF(bXYD0tpj!ev!R2MJ$NrGV1iH~rP*w;9tdf)5>lZh@kx$VikTTq z&kC%qS(M7bR)&@mzHR@hwmUTXY%wuO*R&rPs54Ns`s{V3cjvn0u?|{ULR(IORYzLJ zy@}*I^PZBl6j?hw41XY2G1zZvCUdz`l~+X*t$&@Ch+A~B%dZR39;VWZ8REd{@@9wG zFSH%P3U>)hOD#%!=fmt#fmISwvo5Zg6FB9PYi9znAUZjD_r*cOEOGPty+?(is^xAl zL_YT}-m5DoVCsy0~GK&K%P)NKfEcE3!Q@kj0}_{CJS!B zcu|iHeWZ|=V6e)i%X=!Vse5^${lN(Hou1*;($H8_{BNY;tQ5?XB}7}HHKMei zN8NKd-&AS)F2D4LO68V)=~$6EHVF?u6IC69A9M;SW|v+i>PF|P^^DF`oaC$LDs(Ia z`D&NbsA69^Y$%-~<;jiHo`D7^t6Q$6d1>*9J5?~#%Xjh(sQ~Yw{>q z!^E6E#R}D7R#r0Rt zR7%RlO?CZryU43`eM`brq<_V!R+UbOec^38dJq=wO!OIA*A2F7t>S>#SD zA)OU&ZJHQ@?&*^I!fp;^mp8W%}A&BgqnL3 zS0j<_R>UB}V51{}>W#<8+DioqW^2ew2$MW|qM>YfgnN98Ap}i^sY$weArm(!!Z%?g zwpdmUcHnA5&|-yc*7=ew3Mng3A5%;sP zu%*dd?gGC!Z=J(IOdZiUq@rQx*K^%Jv2&$w^7u~t$;rot-N)qU^BesuxrF?23kL>4 zDRY0P;<%70GtZvfVcL|)N3UOfdp!dSKNsc99k<>(4fJIbXWmbbot~j?2KU<9{l`)d z2giR;nV;v>JJgCwez?1{1Mx?nuHQbk?Pm8kDk;bfKRp-8aq7u1?p$j3#gZb*60ph) z=3~(*Q8hxpdrI`TRI}P$q}5PW_{+jDiwYP|S8rnQV#5-TuY}zbo9eB!QZx3rzDPc~ zWGx`nFOcPqOTr>%^+m!ksFl%1utkI56b!LnSPMMa>FOQQSQIDR zR<^Pb@M#!>9vxdqqs%^|*NRk6I{Swbm15e}p1`1>Ev|=tCjlP2Z9{-Iv)`$T{!iQT zI4zJ*$^{T2)7Nst?ca5d2a0rSj>$`7Bz?mxl{^7naG3tQGgTKiTEzY?&1tN{v5i`m zeb6o=NbS9wH|wg$l9}3j9zS{zVsR2B#&PuzTZGS2Ygc%2k|em{a;Tc2t8_9HYB)L@ z8#}e2+7&}HrIZRF>B5E2%1Q>jbXjFp_j(6OgB7hF^Ya#~HGDba!Cqz5BJae`%0mFQ z!gWt%_&SgZy|P~&T?tM{HE%F#o0DCiuUpKFHFXz(NEhN%Hp9) zu%bQiJe4cW@%6wUDc6ajLUpS6*3^%y4`I*y!ko}q1dNa!F=ASXs_ zvz{J5f`>?_JcZCQTC3)%*0Qysr`W?eF?5yHR;QaR_}Q*Z146qCKOG3IYFAQ}7enh$ zqCLm4b*emS06-w<{+J}_4hKgh&+ZN{PL-shHhODGaew%9>RtQuK#vEhHHNb9kr&;)ls;%Fep9L(6!xo*~OxZuI?B z3w?kLCVjk)6jVW=c2QUw(KqXv{V<;R#)Sm9)20P41>}BSkLQ);|R%OD^VnDEL~p=WI|Q7f(xR{hE*CJIfBhVM zOWLGt7zNmvS?c-oGx~sHgLb8)G&=5E;unXle)1nhdlsgtNI3|M&avTxegG-k80;RZ z{rs2O@y?TCmy_}LFZRmtKXMBK6H-XdO1-!1FlB=Qe@lyF#Q%+8ntzcN&+h70$zs|) zT;6XHJcUU%#g~m>QKz{A~Iv;%a-5^+;6ppnTVnr3wNykn}S7p2K)M@K> zAQyLoRb{y;k_YLod}ZNwmlHUxvBPt@^HCtUK}fR_|H$Sb?u~X@!ktgA5LKB%kGpSu z8k?kU;ULO|6N|X)eN4$o(AWp}1g@(`DM2P>qd_-8RF%?pRx)VS$*WIb*$ik@KI)BW+Jy|?J6 zi~oFo=v(&MP#`Wa?R}O9Mop>hCHc;`sdqTODeeCGvyFNMZPqGH`+f+S-gYowOn6o) zZ`R{4#KzuO*O&YGi+5#{y1Y4fl0^q(?hUFk>z3?5_72beyCJX_a9X1$u~8`@sB!`# zwU?P)<6N2#pDKEi3&k7MlB}rgZ(PNzh z5Wfd!jx(}r+)Eh#1idryk3B8$I3`z7|0NDfhkrh;|FL)B9LRGGF0EBUV&av1L9hnf z*(aNKjZU9Oe+SbaHdp=0zIW>$YBgs^2QH-ooyP5#o+(rs$+GpHpV&*Z+F8c#ucX9! zlW9Z!oL=6!U0wTX-;vb~CaNaU;0St1-Oio$I~*6gaA{d}SqQ-RW1Qr&Xn=XE6xV7Z z+9YQL7zzLYFqr-PvTrX?H)=ep4Q^V*GA|CTO+{TRBP;xtx@VPNDS|Us?TOIVC98Ur zJj)hYqX+eYb<6o?%-_eGSQU@X8_z3d0#-x#Aru$5SL`UPtrgXg3scuCnebx5EGYfI zE4MktHn;1>?FacDzV=~`+8XbW%$jPRcfxFB8;qwcAG>wlNKVeQz~87;(DFvsnmG{? zr)@?e?N8Xr(R$5N6Soyx5~a>o_}c=u6Hiu27|WA>ow0{Pl}0Nu7j*0gmhqIu!QLmk zA#Dn8hKfs{-s|O4z7RW7SpK5>u)n1((X`Z>`TnGmy$sIB>!M|nCn_fykjZ!VL85{2 zynG55%T$2NIdX#BzZ_E@)LFChOR;V6vFIDn!Q1rRvTmFwo`g>xBn75*#Yxr(@r&wn zoB{mG!6l1ZYFg*Y`|-hIDzyqOfei?E8wziN_d~ zRCs1cFev4MHnidAA;F@c%o9!-dQCi{ujlt_L$`qgS_IW{KG172d(X3~z6hL+0|fn} zr5wIlRlYSfri$kbMz>o!f(0K zPb%y3eni-XI!m*Kmj|f>Yqkfd zmdB~!@Q?rt!w$hXTue-57$SSb^ptEY-6g9cV#KDp$0qW}dn+a+m92&qJIj&n+Uzxg z=MDC1I}>L8bPUF|Sa9;3TTm%=^xBj?Yq9nKptKJ#FU< z3U!!KDUIg0g#IDaeHPXpRjK~e;l+?;|t6uxkchzejCp%eI-$9(esh}}( zuAbM+oS}5o*sEf&K0F@8m^L}xo7-3BO+zG$RA7}Sb52x)r>Ox}=l}j4pZ+m#)8MWQ zEK;;U396b0(%p&1eG=0(c zoBr`C+B3~-vIWk|(yh`c_{lScKiGdTJpUTqIE(SHUBSr31WjUd)Nk`o^TiH`$PWTU zx|!ZBVBDNZvfssx0H<-2k}OWW;%my7*$`R1yJnh0Vmk^2ydYd|XEi#uV@&n3*b}AD z8kf~QJ=u13@8-3@n(0D2gKjBBjZ$PGiGZpw|4>6sic7>*4Awa7z`VEAkyHBsTs~Ou zxy{y(nA)Kc_?TQZVRdnRI5sJZsXyiHSE-uF6CzlaGf*oeFjSZ|cboZ@L*~$~zPXI- zh$B48&RWuv*J(T0%*b0a00~IM;QGP18L8DTY^nkL5>GbwjFZgUqO!sn-sw9Tp9TA# zD_0i|i<6yo+q#y;$qryvI$;3+X^Bb|lSZ9+|71mvr)|vUjEgjDA?~pl8-+Se83Dq0 zwC4hQ@VDPCWVp97_Z{mba!h|*&6wq8s1FdpynB}$NxO=dk2t>T{N+Cx3x9h{wD&?y z=+);V5E2@)R0=#=kt?_a9qJo@8VHR`t^W{ms|r(;gQsV2Ver;;tMl=DGRe1<{61sk@A?JU(;+d1wPZB3ZKL28L zM024_!iBzctZ_yDeDegMu>9-aTleo2!Y;dh-p8u`c=o=?iMvtcpP!*W*=%qKy5fiC zd9JlcK7DvF&*ow$r`91`&ucUPhogGVKO)BR@whB=E3CrFFH8(6$@M;iVWLgRC#)#;xoEv}84YhlKZ^@s<@wKQ zKjQdd<+iFP&vVJauxH+&g8d+y5`sUotc^rg>`b6{9C8gBz68Q($#Ql@zdJL6!~KGV z^i}v|BQjR^#O195$1tSOM;WWQ+s2QNue~7%y+8`t9R((&KX)`4B#CY?3>yue!avyh zdi8y0B((~6w{3^s7pS!ewHiI2*r&&Yc zY`C9%$GibsGcDW)fdOdZ(4aNQddqISMK#(mdO;DktSlg`SdbU@%r5D{wtf!LpMMTr zCk})M1Njt0BD`=Bk`-Spwmz>HKI>Jg2zzQehYKs+>JPM`0y1+i8TY%ce*)G%-(Eau z-(KC9aaVfm?Gv-igUS@=emP)|EKl4xXqC?C7_+2msYtN7@ry)1(d3Eyj{_GoGKRTc za)kbUT>WM9y>RisvXaHwVFVH^#rB|#e=^vKs&s|OT&8J0G`MV!RTE!gt4#Qd?AqfR ze&c&|?A$`Q?b4UeIoQ4S4M+y7COv!psY@ykCGIQ7eX-IV1DIogDHg42O?R3_OKi0z z;{3~DOEtUxPd;y3k|B4btqX|*1CVKj5v?UX13i;bkSWp+SUpKxW)(T92f#I#v1)-j zV=sQ}`TN=bjXnzB{&`(j=J0{WwW+F*{kCY((TCrB-f}#$?sxF3nb|v(;ji)<8n5*k ze#7VY#{8Wbr?nOq6?jpsD~6PdTO21sL)kHWNmp>`8DhXlR=vVC=}?dxEi;Yf6Od+9 zY@%_Aas}(yh{Zn`(XG4}J5E-UT?HYwMMU;rad7B{wvsF&Bn{PNc#^6ly1hSiYEs_a z*;BB3i0buR$buhU*#Hj8^Xl#6DW3KXXAgs_UB^qI>2{AB9@szhLZv11*0jx!mR+ZB z*%Few38~7{)%h3zuJZQLjlmV>8H?|UgUb+|xlrhV`9)z{x_AGsb(gjO|d zw{#ba<{O!Jsg5TDEhHyV7A7pogAyES)tng~B@?KaH#h$T60 z15Avrx-O2aM2*O=2Fq>3Dph$RYtr=$ic}q5?F`rDp!KK4h^4jQiQn_825Mih82k#? z=t&(1PSb&YtL65A!I58H)X3H9zz;G?qbuYIZLE_V2|J|`%ZyKIujfye-N5D0(g5l> zA*Ivi@tYyDJLUR=26MVV+lJ1%W6!+=OdjTJ-D4cq)%kT#Tc_X)yYW4ocU(LRQ}E8{ z8MErs@G}4MxMBAkTw4e4?BYeM=wOD?Z3GEUc{ESk;nL*EX-|JRuR!|bmQgPh(QTCZ zU>M}L*~!f1Ldv&Pw4oi9Et7(`w{aN!tlc^^|Tfgwa{XsDRay=+7wYjITDXn zNXgW+q8VA8_RMzE#@@~c!!+kNCpSq_43}ke){_7by2K+}(3`;naS7_2jBDBgIk?Zt z9EjgHF*AWc?z%^a0xaNGCzmpJDgf>0%!3*RyqCBJ8YXcqCUbC~UTQi$-(-!~6T-Gt zecQ3(j`i^V@eDMPKr(!0HHDsou`7{#n36ubEXG)s?X>7OzhN|vkNPT_!Tf#H-CS`M zFm)!xcrzh%rRqI;nzi40gWT&UnpIZDR#gsjzbFs7!lm$olcy-EtPO~*1eUQ`Zr4#_ zOQd;7YWDXwGGEFyhRzlKT;D}fit}s`61|D8$XR5%xG1KIVnGw$Zb;GKt?RAJMxk~s z&Ff=G@r>m>32~{EN#4Q_S!E?&d)Y&djINZyZU1%^*SOs$7UYhYdfbjl-)*MMfNVKJ zOEUhW?@n3s%2p^EkR0dM2<0+^~Z9_tQ&$Sa;*FNa|j8h>2~2VT+{X~ zM7#K;Eb=o-=QH+8fL8im!SNQ5d#m*D!_}X!=sFLto!`wiCXC6}O_7Dq_LKaq5Rz-G ze!$x!xq;>`)&B|C)43CZHd%;!hoM^@fw=X%uZCP{s2yVcQ03??x-QB zOP5tw2osWO$`q)%*Cxf|bjFpSEB*!(7u?gc#3i&1U`?>;hoCpZZYh%Rr=`D3^_6b| zi!y^`OvVP5IbF1Fgs0_c7Co`NY@NXGw_4vlW1Nq}6x!%!?`Rh*XT#2*=^$tF-BB}} zrP<<=_{_e!IORf1#v~43DI&g%Yw{}HKZ|_W%LaZcHn=v~$of)Dc?(*KT+Y-@l_P2% zkMC(2Orc=lkjXhVM86F8+%DGlX37#uI;ig_?g1kib+v_npXE`Wxhhfub|CJ^!YUq~ zp_cfopm{Glm1j(QbLC*ww!TvrqYQTkGjVG2wqG*ypMsM$FgC_u5c>W23cfH{Q>EuI zVNvUx&{2ExxTMbkeLkAyNlG9W6AQ|mcebmJj1%LCegW$s$hrjb&fo6bzfp?rn?KKI zX`lZbHQ%ZE$RR3wL#$Qwz069+TxMz#J6|3cqdB6>kWLGRZ|I3lubpyd)}TkEr5X`+ z7d<~LJ6|TjT&_H>=62*;(~cP-4n}JWHQpPOEQuWgmY0CtRMHIial-)b`blh!-4K}_ zC~x74OGqVIag;njTxbmAN`+xdn3xm0O54lkOvIIyH86v^Z(EhM;8y%{Ich=f&gdjk z;n^}LJ~vXLh^KXzTVV*X4~CFk)oZQWMX3+ApE{+`wGq;Gogl6@XZjF7h`?2DXxX& zGcnVz8j!%{78P=2?TI?c9(Bf<4fQmL60qh*K1u6Al!!NUO;Y*b3dcKy|)8uXp zGaD7XBW|BGRtJaL78XmkSyk_?d-(9p(lfU=G7_-%@fkS05@T&Ljm|DK9q*>NVs5HOi`AcJAdiNojc9Qnhmv-23EDT*9Dn}Vn zzOpw5+p>7;q4nECYw!}Oy2@7Jd|E|4IfQe~xr~(9IOzq|apsEJ!g%uS4ZyJ@d-prV zALa)5T9GKydmamPp#iNI!Stp|)k4+0!Lj!%KAa2mi7xGYw+3!Ue$KMca&Av@9DpFl z@1O4F$nc$-eH3d$p_3m09#i3w6%cA>L@fkwBosgMxQ)xXr0w-;D8rd-R+DxXaMqQr z9(Q8wDB|5XzF$s3{HgN!UFrB# zm;5=e5T02wWllPkd|hQWDQK&`Uo7UefrMhAg{n0XY9HTY=p2QCZQIHN#$1P`B8#^i zWPK|)^-NDoo-!|9PBGONoLAit*)yDD&g){fUS0mzW9Hsv5fkgR9?~9gH4@je; zWdj0|p@vKyuLsTiY6e9x=vX4T&%xt|1l5_?5w%jMaBUmnn4PC{05IgHG1`Wc-0L8T zJD5x$rg8_YzVZWJbq=rC74@_iP+T{g&t!bT|Jv7>KbVkYEx^zc{DmwK@DX4!?^)q$iMLCoV zw-ylOea_hFzYtpP$!(wL3>Oz!%kF9i*v#7174i(>e3&ix%J9)fN%X^@nAO|lyu69K z+&MdOyeIx_ulY53rq* zCiPS0azK^9Vb5lMV+Y4+ScO0Dimp>hYL&yzy?xFS4-M>Q*M5T+kQBfus#N0@A!@8` zCD+84J4hyZWrNv#4sXT$;djrO7W)rthh9bKWb6i<;EcFkR@n-NDV|O^N7A%Sbxd5& zDqA|z3!#u>biLPWy~25TczB>u*BG@B?t}iDSE(qEu)ug(T!Ld^Vpz)Zu`ts{VeAX~ zsxa|bXnSEuxWw&+9$t&42f-qJlUhQ22bY zYv+TwqnxZn2bHiIJA8q&=LzIc`7o^Xy2neVrav2WSDe!E|z zs%RqrK@p;)tDQ_TMP52`x-qU%~*F5VFd&3Y^V zM&VEvHCa(NElz`yQ`MThVNf=1=0>6$SMYg@k*C%x{+vc#KO=bOhJ*C{+nM41TEX;+ z#G#(~ilv#Y+Kx`u0lvyz2M?E@|Hsh0VWs?d>eEGYa$&!{Twc;d<$HTB(FDf+1 zy)E>Hetb6|L~>VuSQXNg8;WWEF?D*=IO+U3_$Ikc;Vib^dfM!Ar)J64PHee<+45u? z8IC(K)bYaB43oOa1HepW#f16CC(S%v#49yMpuz7U7G|^xVZnh~H8SKY$KXB&!)D*z zrBro(fsj*7g0YKi7(>_N{eZ$}X0uITZq7!VTt~mL!OY;Lbw+=z>R=)@fgV*Vakb_Waw-1lG=HlI1u3W#@=)iO~ zYDpu$o%y81^SWWuFOtrx zg$5!tH&pFJt=mMDmHwE8nWu3-OjT*n_Z-uWTAS`Ji`Nf2+ee#OEp*<(1R~4ZuJ!92 zyW$H`>JnP^@1~(!s_OJBCw>|WW<-_xuIOyzT0)w%+dvrTP}VqA7WTOkHy|Us3k zWAKYx7}U$Xo}i;!>N}M$hpb6`(JUM^?~v;0I%zxv zj0~;LL~AFh7xt~sE%Jf;tg1{@HnjpFO<=RnpQ-uJI5{~h(E3T=pz>FjTA<-jlH z0!37GG40`OOY+hiuU+x>`AId`gS5GASDsj>fdiq2#o4){O9Sv0?LjzcYIuH%nB6`k zbSoxf$ieWo2Y2~(frE`z2Ae=H(X$~XkfkM*dP6V>Sx5LuF3d41tTD2drb6!`L(GIu{@h7QZxFY)NT?aNz_CYM?Ve8ike!6iED}P1QB4oo94DO4lZnd5d*rjR}lwaROd_iUM^5_QMG*oCv}pIDA%*}>Rh2{O%NpS#lpC@xX1yliWK zsNmNgR_vK9T%I@-WncwyhsR&a=S{v~<`tf`yM_nT5)k!NM8HXvX+Q~g_onaiEA&evpws7mbOam1aP726jStD4Oi z38WFP8rh=za?vAdcW5Dn2?Bu-Sn*%~-q>$?5y+dc$ZVGsC8a?cjW)XSDf*gad3Zvg z`T)@r!geykh)BR-Kb3#is2SDzSaJyeote`ctF?f}_`Mz2PJd~htS8xNqE}!*kTE`A zs{&@HkzEntcM*-n9wqm4r=)9Cn)s@JQK}@!o3)Eks6=SG?vSl@J#L|W-2B~@7r}~V z*E==R+T~ORPYfExOB*Ma3MB?a{lBxeDV_MRMa+cplf!cpP{^6(<-UpPxp{CmHR!j8 z|7bo32SodaizMNT4(EsVc3jxTn@_(Vx%j+1+T%D>VgB#e_?OK$_P|roh?OhkOoxl9 z?A7nuV(c4R`A~}LFtycaC}K908u}wo@D>IX3kwcMP-{hx!S+>l({V0o=g<<#I!oLi z!s--M5!Su6^TlDd1l;dzaJ^$2YKG2=!V%G>4 zXEaDJG2a0K##W*B*|JM@f-9b%vzRuJ!6xHC%h=C5?R+NzYfF#U@J-1fX>Ox0nhYiS z3M)e%o6049|6P;f(24254>#X*t>hIxOq8Z`PdY}6+e=sXAf#-R&QG+D#x`!X40pxk zL4B6D`!tiC4v`htdnil<{j5y7OeH_**chsrcf|jL-x|P{>XzU%QJHKAt^48=dZdaouo`j zvZ}dM30AJbBbwb+mcu2>`?wulwv>EWqDchLwj@nG*Io`|VQu_mR_9As-8x*cuyR7U zt}t8XK9_}6RvGo(S=GfR`-)O?ufaSa=?s(if+NaxP4d0RnhiYoXN1yM448%5S#M&A zcXxL`wb)N0U6hK(R(vts*2FB%RMd?%_p2som7OT{|B!DT>>ra7tT-;MbEZb1>6!xDg#6ck5$yYvtEjsaa@ANc0)q;{j>x0Q7j?}7V%D*|&dfr8 z`w^gx!r|Gt+%ALfZ(?b+WN#Ht+3y`&*LM4B&16iJbq)m#W@6Qa6o;yuQeB)NnQVKu zUeI3RRpLJydMbfFnb&lAuxI*a1q>uK-in%(O{wn~+4E~Rk(%+(XjtkMt{Dh{X^jbP z7-3bTaT~RzhG8XM6i-5MFKOYW&oR!DlD4X+1ZRhoG3WyRDkA{;8AW49mo`FtHLpt~w3 z-m20KW--1Ir#t35hsF8Nl#sA`(tXiD2LJq>g$j6pj$w@#8V;z|CcXN{g>d}!$??~) z^*{dUuRE9ea2wMe-BJKW88xcBpQp1EsaD7qE{fTy*sWY> zCo>zhmq3WRzA%5mz8{-mH+6QTZmZh`gfqBNYi4I%4TN59i>Xv_FJbztn)Sl$YGFJ) zJZ5I5g}fM=rmtg3vZ(aqiM?s1IvntW z?Zb^-P(WX50LCLODxk-EV^#xWZVPsM`bQC$q?E_+Gx9E{6j(JAYia`FLB3zIUo$)h zs?4OrcFT_+y#4!PK3T2SOf6Sgw7Jaz7r?6X%t!vxj^H0@j-J57$lT&9H5i~T0I-$~ z7AO(7iJJNBm{OyRSN`=>o7*Hv(2htx`XTE7 zGi0qQhU&`c|6T@3JAd(3w+!tNnD^Mjci8Z#4pEJFybHx%c@f$w7)Or+)S6Mt0jxoY z=n1ksixF!Ey-Tn-0VWT0JDIcWOizDc3+xqDh4OgyIY!v2Bm~t8=1i0<#>M}{j&=^< zBOk`g5VGlpqqi0pXTo=RxH}SC&l`jM^Y+!9Ji>TCgU2%fBRd#rX=!`u&vhhM!r(kVt2-0L#qF|TmJL+Q`wzLLtuX?BG10u zTX`z8Ym|=Uap|I;G2ZFG*A@Bc)BU+48x0FSv|f3j)A0~h(Jo*{aDup!u>)LO>M!^H z`AL7;`*-yE3*1)jYr6-jz?<0yt68z4>%42@1HsrQ*F>HHEX(nr%ml~A(_lLLj<2%K zE2HzTW_BSOnnyL+6ad6!K zeE%!QEf2XiP)#qc^VjDG&%Znvba)Z(lMPG$)0KQHJXG!+SrPfoi^%t7Y$ruzPs_zUQS!R?c68%~M0P)Et8xxU0C<9iOy*vJP zz*n)E7$F__(v$S^f<#mKI*HH`DOlH42z?ML zFDzJ5tA;84%CXRJ)dgH6Wb;<;N1k1C3)7;XDF${ubJ3fRp2alL+Q2A8l)1=HLi;%N z=jFjD^+U7!pUsxhpH>*N;4jbzUpcOzzod`+5IGk$y>FV6P`vwIxK?=oWN6_h{k*cZ z>kU&%>rBwaO}#%IZmxdhV0+^@@he9ZL(5O=pGW^D5?c5sbpP>CQ|cA%*6V*dTz`Ej z;?eUpy_2sT0f!xbKKyj-UmEl04-jqoXKO_NeEemJKegunUd%sl?Ek$pf9@v#n{_jd z8)1JRa{tGV8KEFZYw(3PG2_(EUU# zsb$XJ1{OfVqF_8%34VR^sw!Z1X~kq96i}cxL8Po`p68{SoB{F(NnO4zxrFiZ)oEGt zw5I7GB*t}4E&Vt1x9=|!c!H0l?a^L7=Bt)KNV&ymzF+-2!Ph3|mJ6Mhtdlgc<2@tN zzN=I`+c-1T4Dv>__fb(9u~p{7yTU8hS$PRIb~iC3OdjuG1wf#|-=YB5u6D6pcL(l; ztrK6?|K(pyW~bum-6!q*Et;1x4a(i8@QX`pR|B1WY>lIR;&E!foCtvH+1K_sR zgL27Pr4r-;1kw(S46aib&O_MvS?C#6|1g0B-cw(GRF%mnDnDWkA(NdVw8}s3d>E!F z*i_RfMe)>a{+>#dI6D?hzK=%xOLUJ!i zH_D~N z6^J0kWSL0;CE?mD7H}X6K}|v7Ya~3Ckn#z|AV%pk!jWd%5Lc zmNOIqSYuG>T#@5MSTk~`63UQx^MPQdCl^n%#$}rCBzdc!djOGEi441bz7LGI8pO}ga?~0q>6DI z0I?*sB~Djk=vm#@)Yv+x^EZwce4z(4Q!7=FPzdy1q77A9Z(s#SvrQBC%HI%+6J^zH z6C$kdi>;xEt2Hovb{z_W5eZy3X>LoL=UvScU$C-628elPCEY!u#N~xjAUt7YP!g#@38a0 zX5_$Jntk8GFIHhue4C@xYYt--$IYS?rvaA5>RLn4O-K@rNu$g@q8fVohT06;mL=&q z8>qx-CAv9+TP(wiQhQ*!0nm9UXd+^WU0nHAct-f}zComdOe4~QeQ7P)ThU3Moo&L$ z34fSy$B{zS6K&=BKmVxEElQB`FRiut1^3!O>7^L_7T)~F$y5`s&BKea%3j_~e;BNb zzHnlNc~D~H)g%14FplYI<9DA2cxo1-zcd)6-%=XTr?Y@AocfBp97 zjvbTQ3&N0C>djRfh*=W2>L6daGibA4BE8yl*IsqHDShlKhe~$oz)N?grVBLqJYs9Y z1a<|A_qJM^w(J1hz*!Bf>lu#dw~OYq%L~$(ep|Kp$|5w!3sR`2L*mqIkDo?EU&ms; z4rPh8(Ql+@JRV{vA%(RlSd#M?*B`;>)>U-Gc30l&R`RxuyR9zJO0@gVOx9p*l68Sl z8l`!j)(~IlwTZ(8O)h@%-oyCqPA1LjWeBhJSLb*w$w z$sM-uZQyFcFgsUC7=^K&eE-yaPQU#xJH)^G!zp%ec^}Nj@n_z{f5IIbazI+Bw+SPQ zIs(!@l?5O>WRhhnpLHY+sV0+q3Cnw;Nj%^{9|iB&${m9#JKMgWrjDv@F%<#NcQ!=rE`?FHX$ZD7Rm%n!Z(vyzkpW z`T!kjnn3Hys3gs;?F~(UpksG3e!F-?R1#PxEo>o{wjVB6fADFf=6B*tdwB62?Qh&SPQ*L2`!XWdgw@z>U-RK_qpyq&))0xzMuDf@<(!#IWuSG%w*2Y z@Av(Ezm=uzC~9WrOy%Sg4PIb; z@Rp9Xf=1C{&wGlUg-MD}qr^*08ZQK#btGk{;p6D)Etx)!`tQ7bDy`^CVssCB_LJYM zw>$KWd?8QH*3lR1kFsIE4y_)a@>&hH&ww7M9IJYUNLtYPFm4tHzZckRlvCZe5)yoM z5B~SO-}w2JmTdnb81{rEO6C#04V=rRzT$zD2R&N;P^YpYGZYo?2V%6Q)X}BXRELS8 znf1=xB#bI6M#;c5*0uX00ZLu;N?Y9=n2Ah3la-GgHe&{Pne>Z$T?kgy%d&|YovHji zppb(Ta9;e+4TXmu@=Y74T? z#9=$)67@D>>oDCve!{9{80sB08;reYJSFU2cSeeoCZmj9sh{iDKjlpXm+o7wK;VXJ zFQ$#TpX|B%jW_Z4Y?Nl#frokS#%~dT?zU|ClKY$B+kQ5SVttMU!A;_P_s}tak=D*yQD0^r8b(D>9oP95> zGjkONk*Z*21FURJ1lcZ6ykd+bo^@^uq%xgyLA`#xM#w20h~+jj^fl*I31}dSQsA2l zJ@1C-KT&R(avwvW$qjU_N<1Jkd-yhL^v2@L3*?T4GalrUsKj!h+j~p$C--pMye16^hB;tmz zDjErUTcelF)1r^@n})`g!i^4jJWwXarWdD`0H_vO7%X@ zT5_my9sbC1tuZ^YYBPX@bavktxjuN%SNGCEF0A1#MEBfy?oeObYEmPQeZ1|~k>l!H z(77l~+y0RW*sBYwZJ3*$&-i6$Y&EfMio@>PVi^qsDE}dn+s{Ytz613b-;}H`itO_w z>)Op7BVraCAFmlgp{!fiyaCf)V`be`EHY8Zq}}vdE%`)Q6IP7#VW+uHG}3&>V5r&y zPNcw;k9MV?4r3c*rj0Lnlzr^_V0t2`UEAP$1SL^VDtFi>qA`WIsn3w>jfE|$otctO z*60=>4r?~c)BdD)5xwd^4Hpz(TcHJuNq=)xVH3BEB z#wfezzkl${Sl6=q6h$pvX>HE;#}U!4X=ue^5V?zX?k!VyERt@yjtq0f=DI{1(42e@~|2Db>f@u+d{=Ef^CDd4i4 zT0isJSa;(^XaRH#E*`T%$Zd=Un6^DP=OR{YKuE5VEU`+h%we+-#@mV z9PYqOyh8Su1Xz(Rb;*$Gw`bWN%CvULVH~6Lr&?B z-!jAemgnpCU23wX#FqS<4|=X84cN88jctu&QFgiw!n%#S@m1$iif1kAi|24KJKLV3 z!Kv=l@uyQmyu^>#I@6V-C-W*tdVFj9`}Z^J8zAv2x}IdHx3pcY8sMem&Uc+&2-?Xd zU3JW6PTvPWL4E3rTlyM_-E@#npGf`>zWbI^_At*= zuk4*QCu6yJ20S}KJf@!3ho!mB76u(cqKC!c+nm?MQV!0hsv*Vd zZQ{eu-q8}%3Xv5#SYPj0zS+fFclVvW7DFKLXdjZ%ABj=P0z#7AaXKd9;b|&b2!;f) zic&{%Nxm>7DGNhy~;RaX|MVJ@&dIghiKIDIs#9k5iWRJpJVGW0Z1 z1cN|*oA4O7iUGzP&X^hSiDTV-A-}WPuGqDkDtKSJ0A`_Tj3ox*)p~c}QuV~utSn?) z(IBUJCf0U^M?=>h5|o)ZCOZ`0WI{{OGu3nxR+rz9ye>3{o3px*P4adhGqHnuZyGHO z%BrWBKeW?0h{s@jDx$Lyn22I=X&GU}gmH79Kv%{m4)4@~*1@JxQ7;cxrE2MxyUtWm z<=NTEslqGsok2^T=_$Pl%9zlOo<0$+@$OF?IlZ&3k(u#n$K%x}X!t0Z1d}LZmUwF< z4_(Lo07VDt1A$cfdI8U`9^ulVH2reE+_+LRs!Jy7N?c8A9c>1#P^4RpZ${@S%CRu> z=65MIB_~MURKYZ)m8mTtyEFi4LGnC}jX=4L>I4)9wdhHy4H@~DLBSUfUf~A;0@-eF zt`(7SDW5Wz!$S3!a9fF%-+~QVWdO(w4+dmU=t9#5~3Br z2jU^MKcC?)hij#+37jWRqcaov{YAQ8^(ME*xEGYBo5$r7Npzz3(m+wI5;vHSuy~WR zJv<_LatY^v8OfbY9tKpNH&8QQoC zIvq#VkH)oHCY>0G1Bpmszh0=ApgI=Z43L@nms)XoqEYW4BC<1;`(T=XIJ1 zCyAxzN3`_#+|pgd!&Qm7j5Mv7$uuWy_)JfNdY7K=X)$AewWyGbiPuygQx6L?W!EA~ zR19bQ7gel;GwwPc%j2o*V znU|K)9^?gfOUU!i#FwkQTQkFq=Nh$!wa!p$Wa3-QBkbiOxWV#@dD60YfNDUYpz1AD z1J9M^=-}S*_8u%{G&v+VEL9GPmV*q}YP?4VnFd`^JlD(URo`ghcD)!B2>l?~QaqEJ z`OdS9S*4Md?q@bIi-)KmXyi{BYPcRCma=WqhZtq|sHvC-ToIr>dAzrnEF5yVDUG^~ z#x1hsR}nps0T;pw7_fQzxkua5>!bm3*)k%2S|v&AEjyXlVix!OeQP`{w`m6B(`0IT z5XPAv@v6JRRV2R>g{JSZ_q<3pP4TU6ICAmKlmj)`tA8bQAg@m(V+(0F=Q?Cn+I>^q zy2c;xyOc4)n#bhH-)MCu!-;?ak6UN%PO&=Q6mnJ~&_Y#9Ps%f*vC9k4_0<8xbnFuM z|4O{8PH;{B?_7feorBL_c&}aEXxvas%mkz9mgw<2?C?4zPnQAam_-G|dH`US>^lOv zM>-6~>dKu)n%FpCV?NGDY(9#av3VRr^ebH(yh=rQ&{V_AvD62dG3um8#ONHPQ~U|r zv}&c)xYpQ7rWdVhGCv^2;@k#eeHKqs>V%n_7kiz2r* zWKf#)L#r!CA3D?db!(>Nv6wH($K|m>tH% zazl!g5YpR)D7KbO1QUjZ%^fjq`GMJF0^C3>%N;#I8X~TYA-Re+J?L1rNAn@L^#!0 z3=iRqc1vX}YrmromdL^=9$DJt6MkrD^4sn)Y^(hxSvGU2KgJ zlbr{JERf_VE|y3zWW(W>Ua*}4*Wn}1rM~9^Sj7`P3$gqY??gU=`4VH;AV4J`qYC7oPKBnX>PM&!7}6i8Vq}|lfd0)R{QJoz5Kbi#XI6F z2Z(PD&96G>|IY0(u?lKpm$%Ea`EkXGUK4Z23MBu9gL2)BY+C}eP9Re~z`(p7KpIbp zqZy%Ud{u@v_Y%5-&vd5QlqkN=|9HP@-RR(^p`S^O`!W@?kMHSW9M;$^1=>*tQX~)Z^rr|Q;@!k24hPyy}&iS!%hzq{rBRM1DIM7Wy^6T8@$dO z&K+M-)#cm^{m#psfCT}Yelu^kwo?Bg-HX;3|59H){>6;Eqr6S-G?q-_MxZfa(CCu3 zfdJUl*yx}`Xp1?OMS zC$0|J-W!r)c_I=e41X#0p-JeMPmIElohcsWZdDzCjW_Gmv#U4!vQ`gFk5#2lc$as7 z#GjzaIIdiv;Z6OV1t?0ZZbD;Y;64G;K;)jBe_Z~Xj{c1{3e1F^qB{5*4kU?YSDXXHgFTrPnP$IOK1@y zgFkV+N5VI5e|Bj+ofBEZ*>BYue~4p;Jr5iLg?+_r~;!<-=vjkwz zYT*;!AQ(Ud0P?pUxO3yLoAggw`*;_p-Wyr7iXh}qSl@INS}P{z+2v&&9oR-MTWAc% za@0W=vHg0ru+eNejlHIkaP`a>XLZ#wOZ(l+A3(lAO4_1g@A0Je<^ZvT*z z9Xl-XvA%4bX7%^@)!!<4YEU6kO70Xk{Xx9SYg3JzEP%CG#f|8gov0>Zzay!*4+3Y6 zUUoROt-h)^&HF1~-Hg=j&;HqOe0}}O_UPi#t*6=5{5-=dq|<+N7IW-+n&0*eZIp&h zBq>t0?cMJ)xl23XZ~D$=x^d10;ozQcbfwf_EO#b&jveAV3;sp^#8n#)D{@RxBC(>Z z9#9yOq#Bm1CO;F+qSuqz(eqF!)cE$~omN|#m}#LROgpeu26{BJz(d#w?a8V8%w*Ec z5x3Q90+%t2cW1~;WijX(K^3~Hdt~sP_T-to2VT7KuzY7R)R>;P)O@+BROak3b#Cul zq38fcPJHLB8AMpD){#NiK-~cci`DvASZs(_(MD>T##UHxj{5E@D~nm~`*L0B5vGRh z$^1>H)wVo0LXTneFxEkB2JFict>9w)r1h)M4YWl%(?I*MoEI{A?MyscIi^bT)*JMi zf=EkJqnDD%U}x^Ecc5X22U8dnyc=%e{P9EnM4GEZzR@FT!7<$|eE6IP-ruGtbf*Z= zbGWL0+imcnWr{?jO@s{Ab0;;9GrT4%cq<@3vFpEpe`a3$-!)>uic{lg))C|T=H|WK zeK#w*?Iz_E;VrDD3(P3XM=R%ig({OY5+!_4-i7)RP1V}g@l!mm8Bn9Z`jbvn8&uKV z+%qoHC{j#ZR~M+*99pLL@^}@dfQXxB2!z-3r4Y+e1de0aluOi5om0>4seC^s(%(qS94~;|JZTV7K5yD?H7a>j8LjCDYo!VA`1+ zuk60?YVAWNw61vw>Nz=^$`GZr7tpQns6Js8Nc51)Ec`&gzFBfUCU(N{c$Fo)otw-q zI5e0Y($TWph6Um_fbQClq$?#jB!$~*dzLW!1wF78F05c;CayRKi)leVMQQYDXh=P0 zl`z#{6c)y|hgI4M6)mnabm zgcQY~IW95PxsqByOAA}MiMiF%kp`a2w0*Y zcWfsuP;4b?;Sh3_`==}4I9~zT&ZX5}k-YivUqmu~F8_}Rg+EMSUtIqGcP(Q_Gm8pT>GxwrQerz#PtpFlO=~;(Tl#k`IqKMOyx# zuA;fHy{}0Mkm8mXt&-FNL5EReJ_#5*;uVg4p-c&{H9jUFc#0MK$D#Ny0A|4q2#&pp zvtQ>m)BMLFki~4iMpxrH&0<(y-G~JB-NatNW3k8I(PSOZ)iQmC##ZA5B8k$TRBPD+~)dZ()>RvthV#;c~9NvzuKZ%q<}^Q?1B!C+y~5IQDn-Z)B5qMg*#t z*#OM6NbZc3ZzdQqHI0le;pd!-gTtu4f)VbEnS!NV#9G7jIUWSE4eYf!!tjH zvO+vn+}<20Mc7Vc*E+{;AL$vVUM)K)6t99N98lL!6Ec9vcwtQN>~(RAy7utZVgQ|F z2KizD{JV!={mlGZ!Mjc_9-Q7&5c>VR7V0ebE!E1O>DJpB@CoK_)Vs6qW1$~0#d^rB zPL}58_gxx?v3CvEOl3eAUfvodad3c-E*WE{^N|GvP$rMAp$dx zL4?>7otq#J)Y6(VwZ$CTciOwN?jXdn-j-z&Ni2|867v=X!IQt=xbg3{@lWS}9pLD< zOk!k!h}*_gfM$KJA%BXp?lG4nSl-Rdq^t8wakAOzI&SfLdP3f6g}yC5artAc;Fa#7 zlP(35Sur0->RG-;Y<6UyBAbpP0ANiD%4G5#PJIT46zI~?>D_P1nUpPjZ~ha9xt5L1 zCyr>%A7@U6ZX_?gpV+!4{#MuSq3_Y^?JMgyeRj?*-+KlGg|eNSqB0h5$6h!kaB}Ly zt6J-rw=5L7vN!8WOoPxxJK7_%Hwlr^3V*deqO;m znWXF{(DMGty>uxjwa;S6g-f%|`4LLyPK=B|g{dE|ZGPhDYD?n1IC4@V<3Y2uNa@vH z88y$REOKI_Oa5g3l#g`u)y_+TkhmH_K`BtQ8$K7%I~DDHy0OJq+sd(Kr_Tw^L3l^~{^QFi8x`EUewl?JjB z2QAnL2I3z|I4%Cvt0C?q=4Q?HPEVnoMmElgGsm|Meh)jscw15CCHUI2^tipf<)i4r zqViWUhOS~U;Bl;;+}09cm4G#sBzZiXl2eb+zLebXGqueYVs7f`(VFRGWKyg5eIgXB zYaoqED3k+RDAY53RP9LRb#e(T#HM(6bK(b2!khlyckw(OhEyuiWgJg2coG;wKkZJ| zt>6kFRjfJE1N9Q^W!C~}OQX-MMM})x);2oT2sH_gSRFTMDhFHCGcxsYwsD{1L$$S? zdQx>im|KIn4|g0OoSi8a2jo%9#Gy{#-gr#1s+uYM4vAzJMtDPaR4MJOL?^WF15M&6QrrckP3jf}T2 zYB<=P>}Ua+G0`=g66k^%<5hHy#52r1N)b^!DFG*?r?a2tK9^~N84Dg)8_fr#%Yq7I zBBP8%i3%}&+|?ew)2)j4j7KvY-#4RLsR!uuoO$I;@dehpwCG(#vKV}+gVyXVYl9n- zaGG^f1w&zW&3^!<{y)YwfBv7I+Bx-!G;c^qTM(+_DNcp%jQ;%xkZ(n zWx#rRyXV{P$}= zaX@TuJlKCNnEB|$>Y7=7X>6Xp^?OgKj&7w$fusj@#jZKy7w)l`?!X}K=YlTtJqPNn z&dmBU-cXH&%xWM?6?ufGWIq&a_kL+Rz(tZFWWr+CcMZLNJ_qr6@h$r?TQXNQZvi5VN+0k5S-iK zUX^1S+wRLOqFW!w&Jx1c2@hXdQcVRaj;mJq<3;l3@0yPnJNfSO?ioAep;>h%L)chi zD045Y?451DPTxqV3gM<`oW1V$pEVR>6ZrbFSn||{Ewjr7$sJ_fjS1Q z_dt))U!w7E8OdVAyNU27F1)%ANHP{PjDht*I3C~r%BKAH)4qC5x2v$BI5kwMZjP@A z=8{84$URgiP-Ak!KaS%Xn8b{oq)Kj1bJS%;uOlbAu4-S3bu%GZd2|(LD|adP2^b4; zW>TaDHo|l8kb)BPWHtk&PVqm-0Stcgn%BcefrW3z*(!HUQ{JONT9loj-1Xvrktm&8 zI5`J?FlFbQ)b~7`S^C^^aTC`VhkDVemR73Vq2KECu^c*%_6$4va!xqSE%fknU82)~ zHajEBe~+xrN{FOyZls74%t*ky*tN%T3>i$5Ir$f0)F0f~x1I;STM7LzrrHu#@c!L= z7_hr&do-+a8rbRm(=@+AzXbVX0o7u>S;>=IhsI4k)RIkNOxI};^M0t=rI!mf&L+jZ z3ejfwyOwWMbZB-ouTSJBH!;QuuH5!AMRrAjOq*(VKy>+=Uthmz{M#iW&L_6sAZa~B zi^%#m%RGV;U&zgZG|O_|9m1OHZdg6;p-QTWjFZ|CkrC7iZjE}<%eK^aP#f{7y@FPc zt$wVRv)CBTq#50~Ps3lp!^|$0+_!Dru~3+|gW3{$q?W;=M-NqnZSzi6h9L^O`g?>E74Y!bRO@Mqmhq8&R>Dgo{R;O`ev!~s zNr8^J5o$Zj8(@Ait>7`R$&Hs- zI+)n=JrPZG95g%MpB5l0RROOM=z^=kI5}aEeND{oLo?XjMFOA@I&S-V!LnALL4QfV z9};GJVsU<(UksVRLLU)@#6w+SGVNd)CAMZ>TD)#gX5me!VGV%9FVpWGg|Z{N%&vWR za(Sz1ds?9S6NgFNj+5p^#ZMdowUkdBoyDIxk`sWb?_Z=>v9+EKfiz61wrbT2C4~l_ z4YMHM$UH^qo) zD2TmuqG1@VtwL-lbVvB_$pL1g^oD7siA zdURs&#gNf@a0{{YN)cTTz$_6x%EFl15RChy!aJSjwG%Bu?m;aCFq(#hxd-|bv4~>$ zr)~Y$7%(LNpu}NcYnQr-J7QFe?w7U@pF4AT{jR4XO_!@$C}S2N-%wT8hQ=YVi3&nk zyWagcf*d#YeA5wIL^#ms>UqRl${sl@m1S5t=HM&ThB2Fq5Ktqv@WKr+0zDA}#eIr~ z20#{$ z(6tSQwc1=}pg0NSn1R5!FIf*HK%z^XX5ZF54rhaEN37xbJki9M-X@yIg|4!)fxxqF zS>-H%A2v!S>f+P+xTGKE23aj)8afkToei{NP!(lYV?L_bDUsE}638qlGglnO5)oFx zN6}4OXh>>JgZmDSyLpQwC1dw zY~tNqbtkdwCbtGQTm)7U(&pSa)#3s&jPL2qT2>ClOgS`AFwfe}^)3k?l@)(@E8DzH zMtPEQ$I2t})fS{vK9E}1-i*X(w(9~;UWS>{wHg&vZ@aqP8r}ZL+CYOw0Ajc>n?gVpE zMM3&9c&5WLL&jx0DXz_}%oevt^;qA*Yi@E|AoQTHk1Fa4r?m?a=@`yX<5$KSHt^Hs zrCIF_)aBu8r+?Dk$qx*x9D#r0Q0NRA4fuzH`{8MTx8|?YE+>UZT3svc9`;f{NW%PX zkM47YJbWz(YYR-O4G;x!!*_H`_KX~OUGO-kTJ5E>xrIEBAjxh+eNqNGCDh_JP$%tA zr`v@drgu{Uq-@g`VYZWX~|h1SF% zwoch@e)eS~Xn4f7+uKcLbKzzShAa^KNv&~wF;08iu;(eoG2WW|s9hZTtaa5hCf{}} z9*6?OS@~P95R3Nfd`n0Fmgj%&?a+(2&b|LZ?-tg#aMGe|qO4h7vXl*bUv}P0@fJfW zpLksLwT8HT!OSQ!$rCkMXuDN*XZyR|XW2dPP7VtK%q8OKful^NHib=*jorxqbUZ)vHbgU!%$Y8a&aQ zBTCu3_AJRLw1mC2@nqs7e&pW$aOEGax)%2LMGkxV33-lqmb1u7d%N1qVVWB6Bf@*v z@%fZMzkobxbF5vszR;oTYcgCv+sf2=E_ZZVsGfXKX6a;{jYHe8W8kL&c@2X&ZemJi zZWEIu?Wb?7@*%hwzPNss)Eij< z2xo8xm(Vyar)S1+ZqFe?*JF+@#6tA;?X1aO+^YNGqe0=W0|Ale_0}p}KXHtozxYZM zEF`u$Pzu~$p_A`UKLc*>nRh3L#(+M3{Oc!2^$MW*Cehv*x z%-BKR+Y;-7yt-J~1oWxG%bnwH|G`DAqHj=MTkzlTVDY}SIWTNfr!Z3x`O>(*cASw+ vtRrz-=8uAxVCtFjr9bEXhj){M Date: Fri, 4 Oct 2024 14:45:06 +0200 Subject: [PATCH 163/274] fix: wrong Cardano artifacts link in test Docker workflow in CI --- .github/workflows/test-docker-distribution.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-docker-distribution.yml b/.github/workflows/test-docker-distribution.yml index 2d3f2ef1540..359772ce784 100644 --- a/.github/workflows/test-docker-distribution.yml +++ b/.github/workflows/test-docker-distribution.yml @@ -25,7 +25,7 @@ on: description: The url of the archive of the Cardano binaries required: true type: string - default: https://github.com/IntersectMBO/cardano-node/releases/download/9.0.0/cardano-node-9.0.0-linux.tar.gz + default: https://github.com/IntersectMBO/cardano-node/releases/download/9.2.1/cardano-node-9.2.1-linux.tar.gz dry_run: description: Dry run will not push the Docker images to the registry required: true From 12193538429dec7965892e3a59025950d5286b7e Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Fri, 4 Oct 2024 15:06:03 +0200 Subject: [PATCH 164/274] chore: remove decommissioned 'testing-mainnet' network --- .github/workflows/test-deploy-network.yml | 30 +------------------ .../benchmark/aggregator-prover/README.md | 6 ++-- 2 files changed, 4 insertions(+), 32 deletions(-) diff --git a/.github/workflows/test-deploy-network.yml b/.github/workflows/test-deploy-network.yml index 2907cfd892e..035ed420975 100644 --- a/.github/workflows/test-deploy-network.yml +++ b/.github/workflows/test-deploy-network.yml @@ -16,7 +16,6 @@ on: options: - dev-preview - dev-mainnet - - testing-mainnet dry_run: description: Dry run will not deploy the distribution to the Mithril network required: true @@ -28,7 +27,7 @@ jobs: strategy: fail-fast: false matrix: - environment: [dev-preview, dev-mainnet, testing-mainnet] + environment: [dev-preview, dev-mainnet] include: - environment: dev-preview environment_prefix: dev @@ -92,33 +91,6 @@ jobs: google_compute_instance_boot_disk_type: pd-standard google_compute_instance_data_disk_size: 1000 google_compute_instance_data_disk_type: pd-balanced - - environment: testing-mainnet - environment_prefix: testing - cardano_network: mainnet - mithril_use_p2p_network: false - mithril_api_domain: api.mithril.network - mithril_era_reader_adapter_type: bootstrap - mithril_protocol_parameters: | - { - k = 2422 - m = 20973 - phi_f = 0.20 - } - mithril_signers: | - { - "1" = { - type = "unverified-alone", - pool_id = "pool1re8cmjt895tpx8dx2veg0cew5yqtxnt82sll03e433a4ugnh9w7", - } - } - terraform_backend_bucket: hydra-terraform-admin - google_region: europe-west1 - google_zone: europe-west1-b - google_machine_type: e2-highmem-8 - google_compute_instance_boot_disk_size: 250 - google_compute_instance_boot_disk_type: pd-standard - google_compute_instance_data_disk_size: 1000 - google_compute_instance_data_disk_type: pd-balanced environment: ${{ matrix.environment }} runs-on: ubuntu-22.04 diff --git a/mithril-test-lab/benchmark/aggregator-prover/README.md b/mithril-test-lab/benchmark/aggregator-prover/README.md index 4677e2b87ac..bff560481f7 100644 --- a/mithril-test-lab/benchmark/aggregator-prover/README.md +++ b/mithril-test-lab/benchmark/aggregator-prover/README.md @@ -27,11 +27,11 @@ export AB_CONCURRENCY_MAX=50 export AB_CONCURRENCY_STEP=50 ``` -- or the `testing-mainnet` network +- or the `dev-mainnet` network ```bash # Aggregator endpoint -export AGGREGATOR_ENDPOINT=https://aggregator.testing-mainnet.api.mithril.network/aggregator +export AGGREGATOR_ENDPOINT=https://aggregator.dev-mainnet.api.mithril.network/aggregator # Transactions file to prove export TRANSACTIONS_FILE=transactions-mainnet.txt @@ -61,7 +61,7 @@ Which will output these type of results: ```bash MITHRIL AGGREGATOR PROVER ROUTE BENCHMARK ->> Aggregator endpoint: https://aggregator.testing-mainnet.api.mithril.network/aggregator +>> Aggregator endpoint: https://aggregator.dev-mainnet.api.mithril.network/aggregator >> Aggregator route: /proof/cardano-transaction >> Transactions file: transactions-mainnet.txt >> Transactions available: [100] From 5642b6805567432a9af8646ecaa35d44ec65e913 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Mon, 7 Oct 2024 12:39:30 +0200 Subject: [PATCH 165/274] chore: remove 'testing-mainnet' genesis verification key in infra --- mithril-infra/configuration/testing-mainnet/genesis.vkey | 1 - 1 file changed, 1 deletion(-) delete mode 100644 mithril-infra/configuration/testing-mainnet/genesis.vkey diff --git a/mithril-infra/configuration/testing-mainnet/genesis.vkey b/mithril-infra/configuration/testing-mainnet/genesis.vkey deleted file mode 100644 index 575154ce701..00000000000 --- a/mithril-infra/configuration/testing-mainnet/genesis.vkey +++ /dev/null @@ -1 +0,0 @@ -5b3132372c37332c3132342c3136312c362c3133372c3133312c3231332c3230372c3131372c3139382c38352c3137362c3139392c3136322c3234312c36382c3132332c3131392c3134352c31332c3233322c3234332c34392c3232392c322c3234392c3230352c3230352c33392c3233352c34345d \ No newline at end of file From e71693684478a33d0f054cde3232836161573a47 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Mon, 7 Oct 2024 14:10:05 +0200 Subject: [PATCH 166/274] chore: bump infra version From '0.3.1' to '0.3.2'. --- mithril-infra/assets/infra.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mithril-infra/assets/infra.version b/mithril-infra/assets/infra.version index 9e11b32fcaa..d15723fbe8d 100644 --- a/mithril-infra/assets/infra.version +++ b/mithril-infra/assets/infra.version @@ -1 +1 @@ -0.3.1 +0.3.2 From 0d938c22afd5312a58964c90b778c1f5716a924c Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Mon, 7 Oct 2024 14:12:21 +0200 Subject: [PATCH 167/274] fix: setup relay and block producer topologies of signer in infra --- mithril-infra/mithril.signer.tf | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/mithril-infra/mithril.signer.tf b/mithril-infra/mithril.signer.tf index 8234a815177..cb08ab397ec 100644 --- a/mithril-infra/mithril.signer.tf +++ b/mithril-infra/mithril.signer.tf @@ -43,14 +43,6 @@ resource "null_resource" "mithril_signer" { "mkdir -p /home/curry/data/${var.cardano_network}/mithril-signer-${each.key}/mithril/snapshots", "echo -n ${local.mithril_signers_relay_cardano_port[each.key]} > /home/curry/data/${var.cardano_network}/mithril-signer-${each.key}/cardano/pool/port", <<-EOT -# Setup cardano node block producer topology -cat /home/curry/docker/cardano-configurations/network/${var.cardano_network}/cardano-node/topology.json | jq 'del(.publicRoots[0].accessPoints[0:])' | jq '.localRoots[0].accessPoints[0] |= . + { "address": "${google_compute_address.mithril-external-address.address}", "port": ${local.mithril_signers_relay_cardano_port[each.key]}}' > /home/curry/data/${var.cardano_network}/mithril-signer-${each.key}/cardano/pool/topology-block-producer.json - -# Setup cardano node relay topology -cat /home/curry/docker/cardano-configurations/network/${var.cardano_network}/cardano-node/topology.json | jq '.localRoots[0].accessPoints[0] |= . + { "address": "${google_compute_address.mithril-external-address.address}", "port": ${local.mithril_signers_block_producer_cardano_port[each.key]}}' > /home/curry/data/${var.cardano_network}/mithril-signer-${each.key}/cardano/pool/topology-relay.json -EOT - , - <<-EOT set -e # Setup cardano node configuration CARDANO_NODE_EXACT_VERSION="${var.cardano_image_id}" @@ -58,10 +50,11 @@ CARDANO_NODE_MINOR_VERSION=$(echo $CARDANO_NODE_EXACT_VERSION | cut -d. -f1,2) CARDANO_NODE_VERSIONS="$CARDANO_NODE_EXACT_VERSION $CARDANO_NODE_MINOR_VERSION" SIGNER_TYPES="full relay block-producer" for SIGNER_TYPE in $SIGNER_TYPES; do - # Copy the cardano node configuration files to the signer (exact version, and fallback to minor version) + # Copy the cardano node configuration files to the signer and setup topology files (exact version, and fallback to minor version of the Cardano node) FOUND_CONFIGURATION=false for CARDANO_NODE_VERSION in $CARDANO_NODE_VERSIONS; do if [ -d "/home/curry/docker/cardano/config/$CARDANO_NODE_VERSION/${var.cardano_network}" ]; then + # Copy the configuration files to the signer SIGNER_TYPE_CONFIG_DIRECTORY=/home/curry/data/${var.cardano_network}/mithril-signer-${each.key}/cardano/config/$SIGNER_TYPE rm -rf $SIGNER_TYPE_CONFIG_DIRECTORY mkdir -p $SIGNER_TYPE_CONFIG_DIRECTORY @@ -70,6 +63,13 @@ for SIGNER_TYPE in $SIGNER_TYPES; do cat $SIGNER_TYPE_CONFIG_DIRECTORY/${var.cardano_network}/cardano-node/config.json | jq ".hasPrometheus[0] |= \"cardano-node-$SIGNER_TYPE-signer-${each.key}\"" > $SIGNER_TYPE_CONFIG_DIRECTORY/${var.cardano_network}/cardano-node/config.json.new rm -f $SIGNER_TYPE_CONFIG_DIRECTORY/${var.cardano_network}/cardano-node/config.json mv $SIGNER_TYPE_CONFIG_DIRECTORY/${var.cardano_network}/cardano-node/config.json.new $SIGNER_TYPE_CONFIG_DIRECTORY/${var.cardano_network}/cardano-node/config.json + + # Setup cardano node block producer topology + cat /home/curry/docker/cardano/config/$CARDANO_NODE_VERSION/${var.cardano_network}/cardano-node/topology.json | jq 'del(.bootstrapPeers)' | jq 'del(.useLedgerAfterSlot)' | jq '.localRoots[0].accessPoints[0] |= . + { "address": "${google_compute_address.mithril-external-address.address}", "port": ${local.mithril_signers_relay_cardano_port[each.key]}}' > /home/curry/data/${var.cardano_network}/mithril-signer-${each.key}/cardano/pool/topology-block-producer.json + + # Setup cardano node relay topology + cat /home/curry/docker/cardano/config/$CARDANO_NODE_VERSION/${var.cardano_network}/cardano-node/topology.json > /home/curry/data/${var.cardano_network}/mithril-signer-${each.key}/cardano/pool/topology-relay.json + FOUND_CONFIGURATION=true break fi From 62fd8cac6e2095183bebfe29bdedbf62de3cc934 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Mon, 7 Oct 2024 14:14:11 +0200 Subject: [PATCH 168/274] chore: remove unused volume of signer in infra --- .../assets/docker/docker-compose-signer-verified-norelay.yaml | 1 - .../assets/docker/docker-compose-signer-verified-p2p.yaml | 1 - mithril-infra/assets/docker/docker-compose-signer-verified.yaml | 1 - 3 files changed, 3 deletions(-) diff --git a/mithril-infra/assets/docker/docker-compose-signer-verified-norelay.yaml b/mithril-infra/assets/docker/docker-compose-signer-verified-norelay.yaml index 50fad493114..9d961fac757 100644 --- a/mithril-infra/assets/docker/docker-compose-signer-verified-norelay.yaml +++ b/mithril-infra/assets/docker/docker-compose-signer-verified-norelay.yaml @@ -122,7 +122,6 @@ services: - ../data/${NETWORK}/mithril-signer-${SIGNER_ID}/cardano/db/block-producer:/mithril-signer-${SIGNER_ID}/cardano/db - ../data/${NETWORK}/mithril-signer-${SIGNER_ID}/cardano/pool:/mithril-signer-${SIGNER_ID}/cardano/pool - ../data/${NETWORK}/mithril-signer-${SIGNER_ID}/cardano/ipc:/ipc - - ./cardano-configurations/network/${NETWORK}:/config command: ["-vvv"] depends_on: cardano-node-signer-block-producer: diff --git a/mithril-infra/assets/docker/docker-compose-signer-verified-p2p.yaml b/mithril-infra/assets/docker/docker-compose-signer-verified-p2p.yaml index 872d6173829..b5f780534c9 100644 --- a/mithril-infra/assets/docker/docker-compose-signer-verified-p2p.yaml +++ b/mithril-infra/assets/docker/docker-compose-signer-verified-p2p.yaml @@ -122,7 +122,6 @@ services: - ../data/${NETWORK}/mithril-signer-${SIGNER_ID}/cardano/db/block-producer:/mithril-signer-${SIGNER_ID}/cardano/db - ../data/${NETWORK}/mithril-signer-${SIGNER_ID}/cardano/pool:/mithril-signer-${SIGNER_ID}/cardano/pool - ../data/${NETWORK}/mithril-signer-${SIGNER_ID}/cardano/ipc:/ipc - - ./cardano-configurations/network/${NETWORK}:/config command: ["-vvv"] depends_on: cardano-node-signer-block-producer: diff --git a/mithril-infra/assets/docker/docker-compose-signer-verified.yaml b/mithril-infra/assets/docker/docker-compose-signer-verified.yaml index 7793bfe53a7..add0e9bcc69 100644 --- a/mithril-infra/assets/docker/docker-compose-signer-verified.yaml +++ b/mithril-infra/assets/docker/docker-compose-signer-verified.yaml @@ -132,7 +132,6 @@ services: - ../data/${NETWORK}/mithril-signer-${SIGNER_ID}/cardano/db/block-producer:/mithril-signer-${SIGNER_ID}/cardano/db - ../data/${NETWORK}/mithril-signer-${SIGNER_ID}/cardano/pool:/mithril-signer-${SIGNER_ID}/cardano/pool - ../data/${NETWORK}/mithril-signer-${SIGNER_ID}/cardano/ipc:/ipc - - ./cardano-configurations/network/${NETWORK}:/config command: ["-vvv"] depends_on: cardano-node-signer-block-producer: From 66f8751819d81eaf14d825499e9d2a0b7ec2e440 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Mon, 7 Oct 2024 14:24:10 +0200 Subject: [PATCH 169/274] fix: usage of genesis file with SPO tools in infra --- mithril-infra/README.md | 24 +++++++++---------- mithril-infra/assets/tools/pool/_prelude.sh | 8 ------- .../assets/tools/pool/create-keys.sh | 5 ++++ .../assets/tools/pool/register-stake-pool.sh | 5 ++++ 4 files changed, 22 insertions(+), 20 deletions(-) diff --git a/mithril-infra/README.md b/mithril-infra/README.md index 5168338ffc3..1e27b1b058a 100644 --- a/mithril-infra/README.md +++ b/mithril-infra/README.md @@ -69,8 +69,8 @@ terraform apply --var-file=env.$DEPLOY_ENVIRONMENT.tfvars You should see this output from terraform: ```bash -aggregator_endpoint = "https://aggregator.***.api.mithril.network/aggregator" -api_subdomain = "***.api.mithril.network." +aggregator_endpoint = "https://aggregator.**.api.mithril.network/aggregator" +api_subdomain = "**.api.mithril.network." external-ip = "35.195.148.171" google_project = "mithril" name_servers = tolist([ @@ -154,14 +154,14 @@ In order to retire a stake pool: - Retire a stake poool with `retire-stake-pool.sh` -| Script | Description | Usage | -| --------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- | -| `create-keys.sh` | Script for creating keys for a Cardano pool (SPO) | `./tools/pool/create-keys.sh` | -| `query-stake-pool.sh` | Script for querying info about a Cardano pool (SPO) | `./tools/pool/query-stake-pool.sh` | -| `register-stake-address.sh` | Script for registering stake address of a Cardano pool (SPO) | `TX_IN=***YOUR_TX_IN*** ./tools/pool/register-stake-address.sh` | -| `register-stake-pool.sh` | Script for registering a Cardano stake pool (SPO) | `TX_IN=***YOUR_TX_IN*** SIGNER_DOMAIN=***YOUR_SIGNER_DOMAIN_NAME*** POOL_TICKER=***YOUR_TICKER*** ./tools/pool/register-stake-pool.sh` | -| `renew-opcert.sh` | Script for renewing Operational Certificate for a Cardano pool (SPO) | `./tools/pool/renew-opcert.sh` | -| `retire-stake-pool.sh` | Script for retiring a Cardano pool (SPO) | `TX_IN=***YOUR_TX_IN*** VALUE_OUT=***YOUR_VALUE_OUT*** ./tools/pool/retire-stake-pool.sh` | +| Script | Description | Usage | +| --------------------------- | -------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `create-keys.sh` | Script for creating keys for a Cardano pool (SPO) | `GENESIS_FILE=**YOUR_GENESIS_FILE** ./tools/pool/create-keys.sh` | +| `query-stake-pool.sh` | Script for querying info about a Cardano pool (SPO) | `./tools/pool/query-stake-pool.sh` | +| `register-stake-address.sh` | Script for registering stake address of a Cardano pool (SPO) | `TX_IN=**YOUR_TX_IN** ./tools/pool/register-stake-address.sh` | +| `register-stake-pool.sh` | Script for registering a Cardano stake pool (SPO) | `GENESIS_FILE=**YOUR_GENESIS_FILE** TX_IN=**YOUR_TX_IN** SIGNER_DOMAIN=**YOUR_SIGNER_DOMAIN_NAME** POOL_TICKER=**YOUR_TICKER** ./tools/pool/register-stake-pool.sh` | +| `renew-opcert.sh` | Script for renewing Operational Certificate for a Cardano pool (SPO) | `./tools/pool/renew-opcert.sh` | +| `retire-stake-pool.sh` | Script for retiring a Cardano pool (SPO) | `TX_IN=**YOUR_TX_IN** VALUE_OUT=**YOUR_VALUE_OUT** ./tools/pool/retire-stake-pool.sh` | ### Genesis @@ -245,7 +245,7 @@ sqlite3 data/$NETWORK/mithril-aggregator/mithril/stores/aggregator.sqlite3 "SELE Run the following Rust snippet (see below) ### Update the current genesis certificate of the aggregator database -./tools/genesis/update-genesis-certificate.sh $NETWORK mithril-aggregator ***YOUR_UPDATED_CERTIFICATE_HASH*** '***YOUR_UPDATED_JSON_CERTIFICATE***' +./tools/genesis/update-genesis-certificate.sh $NETWORK mithril-aggregator **YOUR_UPDATED_CERTIFICATE_HASH** '**YOUR_UPDATED_JSON_CERTIFICATE**' ``` Snippet code to re-compute a valid genesis certificate: @@ -256,7 +256,7 @@ Snippet code to re-compute a valid genesis certificate: fn update_genesis_certificate() { use crate::entities::Certificate; - let certificate_json = "***YOUR_GENESIS_CERTIFICATE***"; + let certificate_json = "**YOUR_GENESIS_CERTIFICATE**"; let mut certificate: Certificate = serde_json::from_str(certificate_json).unwrap(); certificate.beacon.epoch -= 1; certificate.hash = certificate.compute_hash(); diff --git a/mithril-infra/assets/tools/pool/_prelude.sh b/mithril-infra/assets/tools/pool/_prelude.sh index 368ff7bc8f0..7e5a422b3c1 100644 --- a/mithril-infra/assets/tools/pool/_prelude.sh +++ b/mithril-infra/assets/tools/pool/_prelude.sh @@ -42,14 +42,6 @@ fi POOL_ARTIFACTS_DIR=/pool POOL_ARTIFACTS_DIR_PREFIX=./data/${NETWORK}/${SIGNER_NODE}/cardano POOL_WWW_DIR=/www -GENESIS_FILE=/home/curry/docker/cardano-configurations/network/${NETWORK}/genesis/shelley.json if [ -z "${AMOUNT_STAKED}" ]; then AMOUNT_STAKED=1000000000 fi - -# Compute transaction input if needed -#if [ -z "${TX_IN}" ]; then -# TX_IN=$(CARDANO_CLI_CMD query utxo \ -# --testnet-magic $NETWORK_MAGIC \ -# --address $(cat ${POOL_ARTIFACTS_DIR_PREFIX}${POOL_ARTIFACTS_DIR}/payment.addr) | tail -n 1 | awk '{print $1;}')#1 -#fi \ No newline at end of file diff --git a/mithril-infra/assets/tools/pool/create-keys.sh b/mithril-infra/assets/tools/pool/create-keys.sh index 92541c27a5c..0c2a3502509 100644 --- a/mithril-infra/assets/tools/pool/create-keys.sh +++ b/mithril-infra/assets/tools/pool/create-keys.sh @@ -6,6 +6,11 @@ # Import prelude . $(dirname -- "$0")/_prelude.sh +if [ -z "${GENESIS_FILE}" ]; then + echo Missing environment variable: GENESIS_FILE + exit 1 +fi + # Create keys and addresses ## Create payment keypair CARDANO_CLI_CMD address key-gen \ diff --git a/mithril-infra/assets/tools/pool/register-stake-pool.sh b/mithril-infra/assets/tools/pool/register-stake-pool.sh index 40d627177e0..24d8b7e74b1 100644 --- a/mithril-infra/assets/tools/pool/register-stake-pool.sh +++ b/mithril-infra/assets/tools/pool/register-stake-pool.sh @@ -6,6 +6,11 @@ # Import prelude . $(dirname -- "$0")/_prelude.sh +if [ -z "${GENESIS_FILE}" ]; then + echo Missing environment variable: GENESIS_FILE + exit 1 +fi + # Check if all env vars are set if [ -z "${TX_IN}" ]; then echo Missing environment variable: TX_IN From b5c5ba248b7f917dab72835651150eac359191eb Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Mon, 7 Oct 2024 14:24:37 +0200 Subject: [PATCH 170/274] chore: bump infra version From '0.3.2' to '0.3.3'. --- mithril-infra/assets/infra.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mithril-infra/assets/infra.version b/mithril-infra/assets/infra.version index d15723fbe8d..1c09c74e221 100644 --- a/mithril-infra/assets/infra.version +++ b/mithril-infra/assets/infra.version @@ -1 +1 @@ -0.3.2 +0.3.3 From 1320060188ccfbcf42df598fd3aaebadb240e202 Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Thu, 3 Oct 2024 16:20:07 +0200 Subject: [PATCH 171/274] feat: add `protocol_initializer` to signer epoch service --- mithril-common/src/test_utils/fake_data.rs | 27 ++++ .../src/dependency_injection/builder.rs | 5 +- mithril-signer/src/runtime/runner.rs | 26 ++-- mithril-signer/src/services/epoch_service.rs | 131 +++++++++++++++--- .../src/store/protocol_initializer_store.rs | 22 +-- .../test_extensions/state_machine_tester.rs | 5 +- 6 files changed, 163 insertions(+), 53 deletions(-) diff --git a/mithril-common/src/test_utils/fake_data.rs b/mithril-common/src/test_utils/fake_data.rs index 6d9e6f7e572..4f7ae052e29 100644 --- a/mithril-common/src/test_utils/fake_data.rs +++ b/mithril-common/src/test_utils/fake_data.rs @@ -52,6 +52,33 @@ pub fn protocol_parameters() -> entities::ProtocolParameters { entities::ProtocolParameters::new(k, m, phi_f) } +cfg_random! { + /// Fake ProtocolInitializer + pub fn protocol_initializer>( + seed: S, + stake: entities::Stake, + ) -> crypto_helper::ProtocolInitializer { + use rand_chacha::ChaCha20Rng; + use rand_core::SeedableRng; + + let protocol_parameters = protocol_parameters(); + let seed: [u8; 32] = format!("{:<032}", seed.into()).as_bytes()[..32] + .try_into() + .unwrap(); + let mut rng = ChaCha20Rng::from_seed(seed); + let kes_secret_key_path: Option = None; + let kes_period = Some(0); + + crypto_helper::ProtocolInitializer::setup( + protocol_parameters.into(), + kes_secret_key_path, + kes_period, + stake, + &mut rng, + ).unwrap() + } +} + /// Fake CertificatePending pub fn certificate_pending() -> entities::CertificatePending { // Epoch diff --git a/mithril-signer/src/dependency_injection/builder.rs b/mithril-signer/src/dependency_injection/builder.rs index 6ee7b5fbfed..ba756066331 100644 --- a/mithril-signer/src/dependency_injection/builder.rs +++ b/mithril-signer/src/dependency_injection/builder.rs @@ -322,7 +322,10 @@ impl<'a> DependenciesBuilder<'a> { let cardano_stake_distribution_signable_builder = Arc::new( CardanoStakeDistributionSignableBuilder::new(stake_store.clone()), ); - let epoch_service = Arc::new(RwLock::new(MithrilEpochService::new(stake_store.clone()))); + let epoch_service = Arc::new(RwLock::new(MithrilEpochService::new( + stake_store.clone(), + protocol_initializer_store.clone(), + ))); let signable_seed_builder_service = Arc::new(SignerSignableSeedBuilder::new( epoch_service.clone(), single_signer.clone(), diff --git a/mithril-signer/src/runtime/runner.rs b/mithril-signer/src/runtime/runner.rs index 1dbd5ecd27f..938f37f3797 100644 --- a/mithril-signer/src/runtime/runner.rs +++ b/mithril-signer/src/runtime/runner.rs @@ -287,6 +287,7 @@ impl Runner for SignerRunner { epoch_settings, aggregator_features.capabilities.signed_entity_types, ) + .await } async fn compute_message( @@ -413,10 +414,8 @@ impl Runner for SignerRunner { mod tests { use mockall::mock; use mockall::predicate::eq; - use rand_chacha::ChaCha20Rng; - use rand_core::SeedableRng; use std::collections::BTreeSet; - use std::{path::Path, path::PathBuf, sync::Arc}; + use std::{path::Path, sync::Arc}; use tokio::sync::RwLock; use mithril_common::{ @@ -496,7 +495,7 @@ mod tests { #[async_trait] impl EpochService for FakeEpochServiceImpl { - fn inform_epoch_settings( + async fn inform_epoch_settings( &mut self, _epoch_settings: SignerEpochSettings, _allowed_discriminants: BTreeSet, @@ -509,6 +508,9 @@ mod tests { fn next_protocol_parameters(&self) -> StdResult<&ProtocolParameters> { unimplemented!() } + fn protocol_initializer(&self) -> StdResult<&Option> { + Ok(&None) + } fn current_signers(&self) -> StdResult<&Vec> { unimplemented!() } @@ -550,14 +552,7 @@ mod tests { } fn dummy_protocol_initializer() -> ProtocolInitializer { - ProtocolInitializer::setup( - fake_data::protocol_parameters().into(), - None::, - Some(0), - 1234, - &mut ChaCha20Rng::from_seed([0; 32]), - ) - .unwrap() + fake_data::protocol_initializer("party", 1234) } async fn init_services() -> SignerDependencyContainer { @@ -611,10 +606,13 @@ mod tests { let cardano_stake_distribution_builder = Arc::new( CardanoStakeDistributionSignableBuilder::new(stake_store.clone()), ); - let epoch_service = Arc::new(RwLock::new(MithrilEpochService::new(stake_store.clone()))); - let single_signer = Arc::new(MithrilSingleSigner::new(party_id)); let protocol_initializer_store = Arc::new(ProtocolInitializerStore::new(Box::new(adapter), None)); + let epoch_service = Arc::new(RwLock::new(MithrilEpochService::new( + stake_store.clone(), + protocol_initializer_store.clone(), + ))); + let single_signer = Arc::new(MithrilSingleSigner::new(party_id)); let signable_seed_builder_service = Arc::new(SignerSignableSeedBuilder::new( epoch_service.clone(), single_signer.clone(), diff --git a/mithril-signer/src/services/epoch_service.rs b/mithril-signer/src/services/epoch_service.rs index bbae068b12f..cfc6720e061 100644 --- a/mithril-signer/src/services/epoch_service.rs +++ b/mithril-signer/src/services/epoch_service.rs @@ -16,6 +16,7 @@ use mithril_persistence::store::StakeStorer; use crate::dependency_injection::EpochServiceWrapper; use crate::entities::SignerEpochSettings; use crate::services::SignedEntityConfigProvider; +use crate::store::ProtocolInitializerStorer; use crate::RunnerError; /// Errors dedicated to the EpochService. @@ -31,7 +32,7 @@ pub enum EpochServiceError { pub trait EpochService: Sync + Send { /// Inform the service a new epoch has been detected, telling it to update its /// internal state for the new epoch. - fn inform_epoch_settings( + async fn inform_epoch_settings( &mut self, epoch_settings: SignerEpochSettings, allowed_discriminants: BTreeSet, @@ -43,6 +44,11 @@ pub trait EpochService: Sync + Send { /// Get next protocol parameters used in next epoch (associated with the actual epoch) fn next_protocol_parameters(&self) -> StdResult<&ProtocolParameters>; + /// Get the protocol initializer for the current epoch if any + /// + /// `None` if the signer can't sign for the current epoch. + fn protocol_initializer(&self) -> StdResult<&Option>; + /// Get signers for the current epoch fn current_signers(&self) -> StdResult<&Vec>; @@ -79,6 +85,7 @@ pub trait EpochService: Sync + Send { struct EpochData { epoch: Epoch, next_protocol_parameters: ProtocolParameters, + protocol_initializer: Option, current_signers: Vec, next_signers: Vec, allowed_discriminants: BTreeSet, @@ -89,14 +96,19 @@ struct EpochData { /// Implementation of the [epoch service][EpochService]. pub struct MithrilEpochService { stake_storer: Arc, + protocol_initializer_store: Arc, epoch_data: Option, } impl MithrilEpochService { /// Create a new service instance - pub fn new(stake_storer: Arc) -> Self { + pub fn new( + stake_storer: Arc, + protocol_initializer_store: Arc, + ) -> Self { Self { stake_storer, + protocol_initializer_store, epoch_data: None, } } @@ -148,7 +160,7 @@ impl MithrilEpochService { #[async_trait] impl EpochService for MithrilEpochService { - fn inform_epoch_settings( + async fn inform_epoch_settings( &mut self, epoch_settings: SignerEpochSettings, allowed_discriminants: BTreeSet, @@ -158,9 +170,16 @@ impl EpochService for MithrilEpochService { epoch_settings ); + let epoch = epoch_settings.epoch; + let protocol_initializer = self + .protocol_initializer_store + .get_protocol_initializer(epoch.offset_to_signer_retrieval_epoch()?) + .await?; + self.epoch_data = Some(EpochData { - epoch: epoch_settings.epoch, + epoch, next_protocol_parameters: epoch_settings.next_protocol_parameters, + protocol_initializer, current_signers: epoch_settings.current_signers, next_signers: epoch_settings.next_signers, allowed_discriminants, @@ -180,6 +199,10 @@ impl EpochService for MithrilEpochService { Ok(&self.unwrap_data()?.next_protocol_parameters) } + fn protocol_initializer(&self) -> StdResult<&Option> { + Ok(&self.unwrap_data()?.protocol_initializer) + } + fn current_signers(&self) -> StdResult<&Vec> { Ok(&self.unwrap_data()?.current_signers) } @@ -284,7 +307,7 @@ pub mod mock_epoch_service { impl EpochService for EpochServiceImpl { /// Inform the service a new epoch has been detected, telling it to update its /// internal state for the new epoch. - fn inform_epoch_settings( + async fn inform_epoch_settings( &mut self, epoch_settings: SignerEpochSettings, allowed_discriminants: BTreeSet, @@ -296,6 +319,8 @@ pub mod mock_epoch_service { /// Get next protocol parameters used in next epoch (associated with the actual epoch) fn next_protocol_parameters(&self) -> StdResult<&'static ProtocolParameters>; + fn protocol_initializer(&self) -> StdResult<&'static Option>; + /// Get signers for the current epoch fn current_signers(&self) -> StdResult<&'static Vec>; @@ -354,6 +379,7 @@ mod tests { use crate::entities::SignerEpochSettings; use crate::services::MithrilProtocolInitializerBuilder; + use crate::store::ProtocolInitializerStore; use super::*; @@ -369,15 +395,19 @@ mod tests { ) .unwrap(); let stake_store = Arc::new(StakeStore::new(Box::new(DumbStoreAdapter::new()), None)); - let service = MithrilEpochService::new(stake_store); + let protocol_initializer_store = Arc::new(ProtocolInitializerStore::new( + Box::new(DumbStoreAdapter::new()), + None, + )); + let service = MithrilEpochService::new(stake_store, protocol_initializer_store); service .is_signer_included_in_current_stake_distribution(party_id, protocol_initializer) .expect_err("can_signer_sign should return error when epoch settings is not set"); } - #[test] - fn test_is_signer_included_in_current_stake_distribution_returns_true_when_signer_verification_key_and_pool_id_found( + #[tokio::test] + async fn test_is_signer_included_in_current_stake_distribution_returns_true_when_signer_verification_key_and_pool_id_found( ) { let fixtures = MithrilFixtureBuilder::default().with_signers(10).build(); let protocol_initializer = fixtures.signers_fixture()[0] @@ -386,15 +416,21 @@ mod tests { let epoch = Epoch(12); let signers = fixtures.signers(); let stake_store = Arc::new(StakeStore::new(Box::new(DumbStoreAdapter::new()), None)); + let protocol_initializer_store = Arc::new(ProtocolInitializerStore::new( + Box::new(DumbStoreAdapter::new()), + None, + )); + let epoch_settings = SignerEpochSettings { epoch, current_signers: signers[..5].to_vec(), ..SignerEpochSettings::dummy().clone() }; - let mut service = MithrilEpochService::new(stake_store); + let mut service = MithrilEpochService::new(stake_store, protocol_initializer_store); service .inform_epoch_settings(epoch_settings.clone(), BTreeSet::new()) + .await .unwrap(); let party_id = fixtures.signers_fixture()[0].party_id(); @@ -435,17 +471,22 @@ mod tests { .map(|(i, signer)| (signer.party_id.clone(), (i + 1) as u64 * 100)) .collect(); - // Init stake_store + // Init stores let stake_store = Arc::new(StakeStore::new(Box::new(DumbStoreAdapter::new()), None)); stake_store .save_stakes(epoch, stake_distribution.clone()) .await .expect("save_stakes should not fail"); + let protocol_initializer_store = Arc::new(ProtocolInitializerStore::new( + Box::new(DumbStoreAdapter::new()), + None, + )); // Build service and register epoch settings - let service = MithrilEpochService::new(stake_store); + let service = MithrilEpochService::new(stake_store, protocol_initializer_store); assert!(service.epoch_of_current_data().is_err()); assert!(service.next_protocol_parameters().is_err()); + assert!(service.protocol_initializer().is_err()); assert!(service.current_signers().is_err()); assert!(service.next_signers().is_err()); assert!(service.current_signers_with_stake().await.is_err()); @@ -454,14 +495,18 @@ mod tests { assert!(service.next_cardano_transactions_signing_config().is_err()); } - #[test] - fn test_data_are_available_after_register_epoch_settings_call() { + #[tokio::test] + async fn test_data_are_available_after_register_epoch_settings_call() { let epoch = Epoch(12); // Signers and stake distribution let signers = fake_data::signers(10); - // Init stake_store + // Init stores let stake_store = Arc::new(StakeStore::new(Box::new(DumbStoreAdapter::new()), None)); + let protocol_initializer_store = Arc::new(ProtocolInitializerStore::new( + Box::new(DumbStoreAdapter::new()), + None, + )); // Epoch settings let epoch_settings = SignerEpochSettings { @@ -472,13 +517,14 @@ mod tests { }; // Build service and register epoch settings - let mut service = MithrilEpochService::new(stake_store); + let mut service = MithrilEpochService::new(stake_store, protocol_initializer_store); service .inform_epoch_settings( epoch_settings.clone(), BTreeSet::from([SignedEntityTypeDiscriminants::CardanoImmutableFilesFull]), ) + .await .unwrap(); // Check current_signers @@ -503,6 +549,10 @@ mod tests { epoch_settings.next_protocol_parameters, *service.next_protocol_parameters().unwrap() ); + assert!( + service.protocol_initializer().unwrap().is_none(), + "protocol_initializer should be None since nothing was in store" + ); // Check allowed_discriminants assert_eq!( @@ -555,6 +605,10 @@ mod tests { ), None, )); + let protocol_initializer_store = Arc::new(ProtocolInitializerStore::new( + Box::new(DumbStoreAdapter::new()), + None, + )); // Epoch settings let epoch_settings = SignerEpochSettings { @@ -565,9 +619,10 @@ mod tests { }; // Build service and register epoch settings - let mut service = MithrilEpochService::new(stake_store); + let mut service = MithrilEpochService::new(stake_store, protocol_initializer_store); service .inform_epoch_settings(epoch_settings.clone(), BTreeSet::new()) + .await .unwrap(); // Check current signers with stake @@ -593,13 +648,53 @@ mod tests { } } + #[tokio::test] + async fn test_protocol_initializer_is_available_after_register_epoch_settings_call_if_in_store() + { + let epoch = Epoch(12); + let stake_store = Arc::new(StakeStore::new(Box::new(DumbStoreAdapter::new()), None)); + let protocol_initializer_store = Arc::new(ProtocolInitializerStore::new( + Box::new( + MemoryAdapter::new(Some(vec![( + epoch.offset_to_signer_retrieval_epoch().unwrap(), + fake_data::protocol_initializer("seed", 1245), + )])) + .unwrap(), + ), + None, + )); + + let mut service = MithrilEpochService::new(stake_store, protocol_initializer_store); + let epoch_settings = SignerEpochSettings { + epoch, + ..SignerEpochSettings::dummy().clone() + }; + service + .inform_epoch_settings(epoch_settings, BTreeSet::new()) + .await + .unwrap(); + + let protocol_initializer = service.protocol_initializer().unwrap(); + assert_eq!( + Some(1245), + protocol_initializer.as_ref().map(|p| p.get_stake()), + ); + } + #[tokio::test] async fn is_source_of_signed_entity_config() { let stake_store = Arc::new(StakeStore::new( Box::new(MemoryAdapter::::new(None).unwrap()), None, )); - let epoch_service = Arc::new(RwLock::new(MithrilEpochService::new(stake_store))); + let protocol_initializer_store = Arc::new(ProtocolInitializerStore::new( + Box::new(DumbStoreAdapter::new()), + None, + )); + let epoch_service = Arc::new(RwLock::new(MithrilEpochService::new( + stake_store, + protocol_initializer_store, + ))); let config_provider = SignerSignedEntityConfigProvider { cardano_network: fake_data::network(), epoch_service: epoch_service.clone(), @@ -626,6 +721,7 @@ mod tests { }, allowed_discriminants.clone(), ) + .await .unwrap(); config_provider @@ -649,6 +745,7 @@ mod tests { }, allowed_discriminants.clone(), ) + .await .unwrap(); let config = config_provider.get().await.unwrap(); diff --git a/mithril-signer/src/store/protocol_initializer_store.rs b/mithril-signer/src/store/protocol_initializer_store.rs index b37f57db754..8f8dae2a4d4 100644 --- a/mithril-signer/src/store/protocol_initializer_store.rs +++ b/mithril-signer/src/store/protocol_initializer_store.rs @@ -100,34 +100,16 @@ impl ProtocolInitializerStorer for ProtocolInitializerStore { #[cfg(test)] mod tests { - use std::path::PathBuf; - - use super::*; - use mithril_common::test_utils::fake_data; use mithril_persistence::store::adapter::MemoryAdapter; - use rand_chacha::ChaCha20Rng; - use rand_core::SeedableRng; + use super::*; fn setup_protocol_initializers(nb_epoch: u64) -> Vec<(Epoch, ProtocolInitializer)> { let mut values: Vec<(Epoch, ProtocolInitializer)> = Vec::new(); for epoch in 1..=nb_epoch { - let protocol_parameters = fake_data::protocol_parameters(); - let party_id = format!("{:<032}", 1); let stake = (epoch + 1) * 100; - let seed: [u8; 32] = party_id.as_bytes()[..32].try_into().unwrap(); - let mut rng = ChaCha20Rng::from_seed(seed); - let kes_secret_key_path: Option = None; - let kes_period = Some(0); - let protocol_initializer = ProtocolInitializer::setup( - protocol_parameters.into(), - kes_secret_key_path, - kes_period, - stake, - &mut rng, - ) - .expect("protocol initializer should not fail"); + let protocol_initializer = fake_data::protocol_initializer("1", stake); values.push((Epoch(epoch), protocol_initializer)); } values diff --git a/mithril-signer/tests/test_extensions/state_machine_tester.rs b/mithril-signer/tests/test_extensions/state_machine_tester.rs index dd9ed8d8300..dd9ca6926de 100644 --- a/mithril-signer/tests/test_extensions/state_machine_tester.rs +++ b/mithril-signer/tests/test_extensions/state_machine_tester.rs @@ -216,7 +216,10 @@ impl StateMachineTester { let cardano_stake_distribution_builder = Arc::new( CardanoStakeDistributionSignableBuilder::new(stake_store.clone()), ); - let epoch_service = Arc::new(RwLock::new(MithrilEpochService::new(stake_store.clone()))); + let epoch_service = Arc::new(RwLock::new(MithrilEpochService::new( + stake_store.clone(), + protocol_initializer_store.clone(), + ))); let signable_seed_builder_service = Arc::new(SignerSignableSeedBuilder::new( epoch_service.clone(), single_signer.clone(), From 1233fece7f8837e293a16c5beac44b8ffbbfacf6 Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Thu, 3 Oct 2024 17:27:14 +0200 Subject: [PATCH 172/274] refactor: move `can_signer_sign_current_epoch` check to signer epoch service Before it was in the runner. --- mithril-signer/src/runtime/runner.rs | 179 +----------------- mithril-signer/src/services/epoch_service.rs | 184 ++++++++++++++++--- 2 files changed, 161 insertions(+), 202 deletions(-) diff --git a/mithril-signer/src/runtime/runner.rs b/mithril-signer/src/runtime/runner.rs index 938f37f3797..9267b181ee9 100644 --- a/mithril-signer/src/runtime/runner.rs +++ b/mithril-signer/src/runtime/runner.rs @@ -248,27 +248,7 @@ impl Runner for SignerRunner { async fn can_sign_current_epoch(&self) -> StdResult { let epoch_service = self.epoch_service_read().await; - let epoch = epoch_service.epoch_of_current_data()?; - if let Some(protocol_initializer) = self - .services - .protocol_initializer_store - .get_protocol_initializer(epoch.offset_to_signer_retrieval_epoch()?) - .await? - { - debug!(" > got protocol initializer for this epoch ({epoch})"); - if epoch_service.is_signer_included_in_current_stake_distribution( - self.services.single_signer.get_party_id(), - protocol_initializer, - )? { - return Ok(true); - } else { - debug!(" > Signer not in current stake distribution. Can NOT sign"); - } - } else { - warn!(" > NO protocol initializer found for this epoch ({epoch})",); - } - - Ok(false) + epoch_service.can_signer_sign_current_epoch(self.services.single_signer.get_party_id()) } async fn inform_epoch_settings(&self, epoch_settings: SignerEpochSettings) -> StdResult<()> { @@ -430,8 +410,8 @@ mod tests { }, digesters::{DumbImmutableDigester, DumbImmutableFileObserver}, entities::{ - BlockNumber, BlockRange, CardanoDbBeacon, CardanoTransactionsSigningConfig, Epoch, - ProtocolMessagePartKey, ProtocolParameters, SignedEntityTypeDiscriminants, + BlockNumber, BlockRange, CardanoDbBeacon, Epoch, ProtocolMessagePartKey, + SignedEntityTypeDiscriminants, }, era::{adapters::EraReaderBootstrapAdapter, EraChecker, EraReader}, messages::{AggregatorCapabilities, AggregatorFeaturesMessage}, @@ -488,73 +468,6 @@ mod tests { } } - struct FakeEpochServiceImpl { - epoch_returned: Epoch, - can_signer_sign_current_epoch_returned: Result, - } - - #[async_trait] - impl EpochService for FakeEpochServiceImpl { - async fn inform_epoch_settings( - &mut self, - _epoch_settings: SignerEpochSettings, - _allowed_discriminants: BTreeSet, - ) -> StdResult<()> { - Ok(()) - } - fn epoch_of_current_data(&self) -> StdResult { - Ok(self.epoch_returned) - } - fn next_protocol_parameters(&self) -> StdResult<&ProtocolParameters> { - unimplemented!() - } - fn protocol_initializer(&self) -> StdResult<&Option> { - Ok(&None) - } - fn current_signers(&self) -> StdResult<&Vec> { - unimplemented!() - } - fn next_signers(&self) -> StdResult<&Vec> { - unimplemented!() - } - async fn current_signers_with_stake(&self) -> StdResult> { - Ok(vec![]) - } - async fn next_signers_with_stake(&self) -> StdResult> { - Ok(vec![]) - } - - fn allowed_discriminants(&self) -> StdResult<&BTreeSet> { - unimplemented!() - } - - fn cardano_transactions_signing_config( - &self, - ) -> StdResult<&Option> { - Ok(&None) - } - fn next_cardano_transactions_signing_config( - &self, - ) -> StdResult<&Option> { - Ok(&None) - } - - fn is_signer_included_in_current_stake_distribution( - &self, - _party_id: PartyId, - _protocol_initializer: ProtocolInitializer, - ) -> StdResult { - match &self.can_signer_sign_current_epoch_returned { - Ok(result) => Ok(*result), - Err(e) => Err(anyhow::anyhow!(e.clone())), - } - } - } - - fn dummy_protocol_initializer() -> ProtocolInitializer { - fake_data::protocol_initializer("party", 1234) - } - async fn init_services() -> SignerDependencyContainer { let sqlite_connection = Arc::new(main_db_connection().unwrap()); let adapter: MemoryAdapter = MemoryAdapter::new(None).unwrap(); @@ -781,92 +694,6 @@ mod tests { ); } - #[tokio::test] - async fn can_sign_current_epoch_returns_false_when_epoch_service_returns_false() { - let mut services = init_services().await; - let epoch_service = FakeEpochServiceImpl { - epoch_returned: Epoch(8), - can_signer_sign_current_epoch_returned: Ok(false), - }; - services.epoch_service = Arc::new(RwLock::new(epoch_service)); - - services - .protocol_initializer_store - .save_protocol_initializer(Epoch(7), dummy_protocol_initializer()) - .await - .unwrap(); - - let runner = init_runner(Some(services), None).await; - - assert!(!runner.can_sign_current_epoch().await.unwrap()); - } - - #[tokio::test] - async fn can_sign_current_epoch_returns_true_when_epoch_service_returns_true() { - let mut services = init_services().await; - - let epoch_service = FakeEpochServiceImpl { - epoch_returned: Epoch(8), - can_signer_sign_current_epoch_returned: Ok(true), - }; - services.epoch_service = Arc::new(RwLock::new(epoch_service)); - - services - .protocol_initializer_store - .save_protocol_initializer(Epoch(7), dummy_protocol_initializer()) - .await - .unwrap(); - - let runner = init_runner(Some(services), None).await; - - assert!(runner.can_sign_current_epoch().await.unwrap()); - } - - #[tokio::test] - async fn can_sign_current_epoch_when_epoch_service_returns_error() { - let mut services = init_services().await; - - let epoch_service = FakeEpochServiceImpl { - epoch_returned: Epoch(8), - can_signer_sign_current_epoch_returned: Err("Simulate an error".to_string()), - }; - services.epoch_service = Arc::new(RwLock::new(epoch_service)); - - services - .protocol_initializer_store - .save_protocol_initializer(Epoch(7), dummy_protocol_initializer()) - .await - .unwrap(); - - let runner = init_runner(Some(services), None).await; - - assert!(runner.can_sign_current_epoch().await.is_err()); - } - - #[tokio::test] - async fn can_sign_current_epoch_returns_false_when_cannot_get_protocol_initializer_for_current_epoch( - ) { - let mut services = init_services().await; - - let epoch_service = FakeEpochServiceImpl { - epoch_returned: Epoch(8), - can_signer_sign_current_epoch_returned: Ok(true), - }; - services.epoch_service = Arc::new(RwLock::new(epoch_service)); - - let runner = init_runner(Some(services), None).await; - - assert!(runner - .services - .protocol_initializer_store - .get_protocol_initializer(Epoch(7)) - .await - .unwrap() - .is_none()); - - assert!(!runner.can_sign_current_epoch().await.unwrap()); - } - #[tokio::test] async fn test_compute_message() { let mut services = init_services().await; diff --git a/mithril-signer/src/services/epoch_service.rs b/mithril-signer/src/services/epoch_service.rs index cfc6720e061..6b3c5b630b3 100644 --- a/mithril-signer/src/services/epoch_service.rs +++ b/mithril-signer/src/services/epoch_service.rs @@ -1,6 +1,6 @@ use anyhow::anyhow; use async_trait::async_trait; -use slog_scope::{debug, trace}; +use slog_scope::{debug, trace, warn}; use std::collections::BTreeSet; use std::sync::Arc; use thiserror::Error; @@ -74,12 +74,8 @@ pub trait EpochService: Sync + Send { &self, ) -> StdResult<&Option>; - /// Check if a signer is included in the current stake distribution - fn is_signer_included_in_current_stake_distribution( - &self, - party_id: PartyId, - protocol_initializer: ProtocolInitializer, - ) -> StdResult; + /// Check if the given signer can sign for the current epoch + fn can_signer_sign_current_epoch(&self, party_id: PartyId) -> StdResult; } struct EpochData { @@ -151,6 +147,17 @@ impl MithrilEpochService { Ok(signers_with_stake) } + fn is_signer_included_in_current_stake_distribution( + &self, + party_id: PartyId, + protocol_initializer: &ProtocolInitializer, + ) -> StdResult { + Ok(self.current_signers()?.iter().any(|s| { + s.party_id == party_id + && s.verification_key == protocol_initializer.verification_key().into() + })) + } + fn unwrap_data(&self) -> Result<&EpochData, EpochServiceError> { self.epoch_data .as_ref() @@ -245,15 +252,22 @@ impl EpochService for MithrilEpochService { Ok(&self.unwrap_data()?.next_cardano_transactions_signing_config) } - fn is_signer_included_in_current_stake_distribution( - &self, - party_id: PartyId, - protocol_initializer: ProtocolInitializer, - ) -> StdResult { - Ok(self.current_signers()?.iter().any(|s| { - s.party_id == party_id - && s.verification_key == protocol_initializer.verification_key().into() - })) + fn can_signer_sign_current_epoch(&self, party_id: PartyId) -> StdResult { + let epoch = self.epoch_of_current_data()?; + if let Some(protocol_initializer) = self.protocol_initializer()? { + debug!(" > got protocol initializer for this epoch ({epoch})"); + if self + .is_signer_included_in_current_stake_distribution(party_id, protocol_initializer)? + { + return Ok(true); + } else { + debug!(" > Signer not in current stake distribution. Can NOT sign"); + } + } else { + warn!(" > NO protocol initializer found for this epoch ({epoch})",); + } + + Ok(false) } } @@ -346,12 +360,7 @@ pub mod mock_epoch_service { &self, ) -> StdResult<&'static Option>; - /// Check if a signer is included in the current stake distribution - fn is_signer_included_in_current_stake_distribution( - &self, - party_id: PartyId, - protocol_initializer: ProtocolInitializer, - ) -> StdResult; + fn can_signer_sign_current_epoch(&self, party_id: PartyId) -> StdResult; } } @@ -383,6 +392,19 @@ mod tests { use super::*; + fn empty_or_default_epoch_data(epoch: Epoch) -> EpochData { + EpochData { + epoch, + next_protocol_parameters: fake_data::protocol_parameters(), + protocol_initializer: None, + current_signers: vec![], + next_signers: vec![], + allowed_discriminants: BTreeSet::new(), + cardano_transactions_signing_config: None, + next_cardano_transactions_signing_config: None, + } + } + #[test] fn test_is_signer_included_in_current_stake_distribution_returns_error_when_epoch_settings_is_not_set( ) { @@ -402,7 +424,7 @@ mod tests { let service = MithrilEpochService::new(stake_store, protocol_initializer_store); service - .is_signer_included_in_current_stake_distribution(party_id, protocol_initializer) + .is_signer_included_in_current_stake_distribution(party_id, &protocol_initializer) .expect_err("can_signer_sign should return error when epoch settings is not set"); } @@ -437,7 +459,7 @@ mod tests { assert!(service .is_signer_included_in_current_stake_distribution( party_id.clone(), - protocol_initializer.clone() + &protocol_initializer ) .unwrap()); @@ -445,7 +467,7 @@ mod tests { assert!(!service .is_signer_included_in_current_stake_distribution( party_id_not_included, - protocol_initializer + &protocol_initializer ) .unwrap()); @@ -455,11 +477,121 @@ mod tests { assert!(!service .is_signer_included_in_current_stake_distribution( party_id, - protocol_initializer_not_included + &protocol_initializer_not_included ) .unwrap()); } + #[test] + fn signer_cant_sign_if_no_protocol_initializer_are_stored() { + let epoch = Epoch(12); + let fixtures = MithrilFixtureBuilder::default().with_signers(10).build(); + let stake_store = Arc::new(StakeStore::new(Box::new(DumbStoreAdapter::new()), None)); + let protocol_initializer_store = Arc::new(ProtocolInitializerStore::new( + Box::new(DumbStoreAdapter::new()), + None, + )); + + let epoch_service = { + let mut service = MithrilEpochService::new(stake_store, protocol_initializer_store); + service.epoch_data = Some(EpochData { + protocol_initializer: None, + current_signers: fixtures.signers(), + ..empty_or_default_epoch_data(epoch) + }); + service + }; + + let can_sign_current_epoch = epoch_service + .can_signer_sign_current_epoch(fixtures.signers()[0].party_id.clone()) + .unwrap(); + assert!(!can_sign_current_epoch); + } + + #[test] + fn signer_cant_sign_if_it_dont_use_stored_protocol_initializer() { + let epoch = Epoch(12); + let fixtures = MithrilFixtureBuilder::default().with_signers(10).build(); + let stake_store = Arc::new(StakeStore::new(Box::new(DumbStoreAdapter::new()), None)); + let protocol_initializer_store = Arc::new(ProtocolInitializerStore::new( + Box::new(DumbStoreAdapter::new()), + None, + )); + + let epoch_service = { + let mut service = MithrilEpochService::new(stake_store, protocol_initializer_store); + service.epoch_data = Some(EpochData { + protocol_initializer: Some( + fixtures.signers_fixture()[2].protocol_initializer.clone(), + ), + current_signers: fixtures.signers(), + ..empty_or_default_epoch_data(epoch) + }); + service + }; + + let can_sign_current_epoch = epoch_service + .can_signer_sign_current_epoch(fixtures.signers()[0].party_id.clone()) + .unwrap(); + assert!(!can_sign_current_epoch); + } + + #[test] + fn signer_cant_sign_if_not_in_current_signers() { + let epoch = Epoch(12); + let fixtures = MithrilFixtureBuilder::default().with_signers(10).build(); + let stake_store = Arc::new(StakeStore::new(Box::new(DumbStoreAdapter::new()), None)); + let protocol_initializer_store = Arc::new(ProtocolInitializerStore::new( + Box::new(DumbStoreAdapter::new()), + None, + )); + + let epoch_service = { + let mut service = MithrilEpochService::new(stake_store, protocol_initializer_store); + service.epoch_data = Some(EpochData { + protocol_initializer: Some( + fixtures.signers_fixture()[0].protocol_initializer.clone(), + ), + current_signers: fixtures.signers()[2..].to_vec(), + ..empty_or_default_epoch_data(epoch) + }); + service + }; + + let can_sign_current_epoch = epoch_service + .can_signer_sign_current_epoch(fixtures.signers()[0].party_id.clone()) + .unwrap(); + assert!(!can_sign_current_epoch); + } + + #[test] + fn signer_can_sign_if_in_current_signers_and_use_the_stored_protocol_initializer() { + let epoch = Epoch(12); + let fixtures = MithrilFixtureBuilder::default().with_signers(10).build(); + let stake_store = Arc::new(StakeStore::new(Box::new(DumbStoreAdapter::new()), None)); + let protocol_initializer_store = Arc::new(ProtocolInitializerStore::new( + Box::new(DumbStoreAdapter::new()), + None, + )); + + let epoch_service = { + let mut service = MithrilEpochService::new(stake_store, protocol_initializer_store); + service.epoch_data = Some(EpochData { + protocol_initializer: Some( + fixtures.signers_fixture()[0].protocol_initializer.clone(), + ), + current_signers: fixtures.signers(), + ..empty_or_default_epoch_data(epoch) + }); + service + }; + + let can_sign_current_epoch = epoch_service + .can_signer_sign_current_epoch(fixtures.signers()[0].party_id.clone()) + .unwrap(); + assert!(can_sign_current_epoch); + } + #[tokio::test] async fn test_retrieve_data_return_error_before_register_epoch_settings_was_call() { let epoch = Epoch(12); From d4af2f168562cec2851f4c9c17a2be99f3088c0c Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Fri, 4 Oct 2024 12:03:33 +0200 Subject: [PATCH 173/274] refactor: signer `SignableSeedBuilder` compute next avk without SingleSigner This will allow to remove the `compute_aggregate_verification_key` from the signer `MithrilSingleSigner`. --- .../src/dependency_injection/builder.rs | 1 - mithril-signer/src/runtime/runner.rs | 1 - .../signable_builder/signable_seed_builder.rs | 63 ++++++++++--------- .../test_extensions/state_machine_tester.rs | 1 - 4 files changed, 32 insertions(+), 34 deletions(-) diff --git a/mithril-signer/src/dependency_injection/builder.rs b/mithril-signer/src/dependency_injection/builder.rs index ba756066331..dfe5d075226 100644 --- a/mithril-signer/src/dependency_injection/builder.rs +++ b/mithril-signer/src/dependency_injection/builder.rs @@ -328,7 +328,6 @@ impl<'a> DependenciesBuilder<'a> { ))); let signable_seed_builder_service = Arc::new(SignerSignableSeedBuilder::new( epoch_service.clone(), - single_signer.clone(), protocol_initializer_store.clone(), )); let signable_builder_service = Arc::new(MithrilSignableBuilderService::new( diff --git a/mithril-signer/src/runtime/runner.rs b/mithril-signer/src/runtime/runner.rs index 9267b181ee9..38b9ba43ddf 100644 --- a/mithril-signer/src/runtime/runner.rs +++ b/mithril-signer/src/runtime/runner.rs @@ -528,7 +528,6 @@ mod tests { let single_signer = Arc::new(MithrilSingleSigner::new(party_id)); let signable_seed_builder_service = Arc::new(SignerSignableSeedBuilder::new( epoch_service.clone(), - single_signer.clone(), protocol_initializer_store.clone(), )); let signable_builder_service = Arc::new(MithrilSignableBuilderService::new( diff --git a/mithril-signer/src/services/signable_builder/signable_seed_builder.rs b/mithril-signer/src/services/signable_builder/signable_seed_builder.rs index 7529816f626..a5cf845e58c 100644 --- a/mithril-signer/src/services/signable_builder/signable_seed_builder.rs +++ b/mithril-signer/src/services/signable_builder/signable_seed_builder.rs @@ -3,26 +3,24 @@ //! This service is responsible for computing the seed protocol message //! that is used by the [SignableBuilder] to compute the final protocol message. //! -use anyhow::anyhow; +use anyhow::{anyhow, Context}; use async_trait::async_trait; use std::sync::Arc; use tokio::sync::RwLock; use mithril_common::{ - entities::{ProtocolMessagePartValue, ProtocolParameters}, + crypto_helper::ProtocolInitializer, + entities::{ProtocolMessagePartValue, ProtocolParameters, SignerWithStake}, + protocol::SignerBuilder, signable_builder::SignableSeedBuilder, StdResult, }; -use crate::{ - services::{EpochService, SingleSigner}, - store::ProtocolInitializerStorer, -}; +use crate::{services::EpochService, store::ProtocolInitializerStorer}; /// SignableSeedBuilder signer implementation pub struct SignerSignableSeedBuilder { epoch_service: Arc>, - single_signer: Arc, protocol_initializer_store: Arc, } @@ -30,15 +28,34 @@ impl SignerSignableSeedBuilder { /// SignerSignableSeedBuilder factory pub fn new( epoch_service: Arc>, - single_signer: Arc, protocol_initializer_store: Arc, ) -> Self { Self { epoch_service, - single_signer, protocol_initializer_store, } } + + fn compute_encode_avk( + &self, + protocol_initializer: ProtocolInitializer, + signers_with_stake: &[SignerWithStake], + ) -> StdResult { + let signer_builder = SignerBuilder::new( + signers_with_stake, + &protocol_initializer.get_protocol_parameters().into(), + ) + .with_context(|| "SignerSignableSeedBuilder can not compute aggregate verification key")?; + + let encoded_avk = signer_builder + .compute_aggregate_verification_key() + .to_json_hex() + .with_context(|| { + "SignerSignableSeedBuilder can not serialize aggregate verification key" + })?; + + Ok(encoded_avk) + } } #[async_trait] @@ -55,13 +72,8 @@ impl SignableSeedBuilder for SignerSignableSeedBuilder { anyhow!("can not get protocol_initializer at epoch {next_signer_retrieval_epoch}") })?; let next_signers_with_stake = epoch_service.next_signers_with_stake().await?; - let next_aggregate_verification_key = self - .single_signer - .compute_aggregate_verification_key( - &next_signers_with_stake, - &next_protocol_initializer, - )? - .ok_or_else(|| anyhow!("next_signers avk".to_string()))?; + let next_aggregate_verification_key = + self.compute_encode_avk(next_protocol_initializer, &next_signers_with_stake)?; Ok(next_aggregate_verification_key) } @@ -99,15 +111,13 @@ mod tests { }; use crate::{ - services::{mock_epoch_service::MockEpochServiceImpl, MockSingleSigner}, - store::MockProtocolInitializerStorer, + services::mock_epoch_service::MockEpochServiceImpl, store::MockProtocolInitializerStorer, }; use super::*; struct MockDependencyInjector { mock_epoch_service: MockEpochServiceImpl, - mock_single_signer: MockSingleSigner, mock_protocol_initializer_store: MockProtocolInitializerStorer, } @@ -115,7 +125,6 @@ mod tests { fn new() -> MockDependencyInjector { MockDependencyInjector { mock_epoch_service: MockEpochServiceImpl::new(), - mock_single_signer: MockSingleSigner::new(), mock_protocol_initializer_store: MockProtocolInitializerStorer::new(), } } @@ -123,7 +132,6 @@ mod tests { fn build_signable_builder_service(self) -> SignerSignableSeedBuilder { SignerSignableSeedBuilder::new( Arc::new(RwLock::new(self.mock_epoch_service)), - Arc::new(self.mock_single_signer), Arc::new(self.mock_protocol_initializer_store), ) } @@ -136,9 +144,7 @@ mod tests { let protocol_initializer = next_fixture.signers_fixture()[0] .protocol_initializer .clone(); - let expected_next_aggregate_verification_key = next_fixture.compute_and_encode_avk(); - let expected_next_aggregate_verification_key_clone = - expected_next_aggregate_verification_key.clone(); + let next_signers_with_stake = next_fixture.signers_with_stake(); let mut mock_container = MockDependencyInjector::new(); mock_container.mock_epoch_service = MockEpochServiceImpl::new_with_config(|mock_epoch_service| { @@ -148,14 +154,9 @@ mod tests { .once(); mock_epoch_service .expect_next_signers_with_stake() - .return_once(|| Ok(Vec::new())) + .return_once(move || Ok(next_signers_with_stake)) .once(); }); - mock_container - .mock_single_signer - .expect_compute_aggregate_verification_key() - .return_once(move |_, _| Ok(Some(expected_next_aggregate_verification_key_clone))) - .once(); mock_container .mock_protocol_initializer_store .expect_get_protocol_initializer() @@ -170,7 +171,7 @@ mod tests { assert_eq!( next_aggregate_verification_key, - expected_next_aggregate_verification_key + next_fixture.compute_and_encode_avk() ); } diff --git a/mithril-signer/tests/test_extensions/state_machine_tester.rs b/mithril-signer/tests/test_extensions/state_machine_tester.rs index dd9ca6926de..06d17a09caa 100644 --- a/mithril-signer/tests/test_extensions/state_machine_tester.rs +++ b/mithril-signer/tests/test_extensions/state_machine_tester.rs @@ -222,7 +222,6 @@ impl StateMachineTester { ))); let signable_seed_builder_service = Arc::new(SignerSignableSeedBuilder::new( epoch_service.clone(), - single_signer.clone(), protocol_initializer_store.clone(), )); let signable_builder_service = Arc::new(MithrilSignableBuilderService::new( From 747bcd49022b5f6878af047719633c747fc73953 Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Fri, 4 Oct 2024 15:38:41 +0200 Subject: [PATCH 174/274] refactor: remove `compute_aggregate_verification_key` from signer SingleSigner Has the signable seed service, its only business usage, doesn't need it anymore. --- mithril-signer/src/runtime/runner.rs | 79 +------------------- mithril-signer/src/services/single_signer.rs | 47 ------------ 2 files changed, 1 insertion(+), 125 deletions(-) diff --git a/mithril-signer/src/runtime/runner.rs b/mithril-signer/src/runtime/runner.rs index 38b9ba43ddf..357c2fc0805 100644 --- a/mithril-signer/src/runtime/runner.rs +++ b/mithril-signer/src/runtime/runner.rs @@ -410,8 +410,7 @@ mod tests { }, digesters::{DumbImmutableDigester, DumbImmutableFileObserver}, entities::{ - BlockNumber, BlockRange, CardanoDbBeacon, Epoch, ProtocolMessagePartKey, - SignedEntityTypeDiscriminants, + BlockNumber, BlockRange, Epoch, ProtocolMessagePartKey, SignedEntityTypeDiscriminants, }, era::{adapters::EraReaderBootstrapAdapter, EraChecker, EraReader}, messages::{AggregatorCapabilities, AggregatorFeaturesMessage}, @@ -693,82 +692,6 @@ mod tests { ); } - #[tokio::test] - async fn test_compute_message() { - let mut services = init_services().await; - let current_time_point = services - .ticker_service - .get_current_time_point() - .await - .expect("get_current_time_point should not fail"); - let signed_entity_type = SignedEntityType::CardanoImmutableFilesFull(CardanoDbBeacon::new( - "whatever", - *current_time_point.epoch, - current_time_point.immutable_file_number, - )); - let fixture = MithrilFixtureBuilder::default().with_signers(5).build(); - let signer_with_stake = fixture.signers_fixture()[0].signer_with_stake.clone(); - let protocol_initializer = fixture.signers_fixture()[0].protocol_initializer.clone(); - let single_signer = Arc::new(MithrilSingleSigner::new( - signer_with_stake.party_id.to_owned(), - )); - services.single_signer = single_signer.clone(); - services - .protocol_initializer_store - .save_protocol_initializer( - current_time_point - .epoch - .offset_to_next_signer_retrieval_epoch(), - protocol_initializer.clone(), - ) - .await - .expect("save_protocol_initializer should not fail"); - - services - .stake_store - .save_stakes( - current_time_point - .epoch - .offset_to_next_signer_retrieval_epoch(), - fixture.stake_distribution(), - ) - .await - .expect("save_stakes should not fail"); - - let next_signers_with_stake = &fixture.signers_with_stake()[3..5]; - let next_signers = &fixture.signers()[3..5]; - - let mut expected = ProtocolMessage::new(); - expected.set_message_part( - ProtocolMessagePartKey::SnapshotDigest, - DIGESTER_RESULT.to_string(), - ); - let avk = services - .single_signer - .compute_aggregate_verification_key(next_signers_with_stake, &protocol_initializer) - .expect("compute_aggregate_verification_key should not fail") - .expect("an avk should have been computed"); - expected.set_message_part(ProtocolMessagePartKey::NextAggregateVerificationKey, avk); - - let runner = init_runner(Some(services), None).await; - - // inform epoch settings - let epoch_settings = SignerEpochSettings { - epoch: current_time_point.epoch, - current_signers: fixture.signers(), - next_signers: next_signers.to_vec(), - ..SignerEpochSettings::dummy().clone() - }; - runner.inform_epoch_settings(epoch_settings).await.unwrap(); - - let message = runner - .compute_message(&signed_entity_type) - .await - .expect("compute_message should not fail"); - - assert_eq!(expected, message); - } - #[tokio::test] async fn test_compute_single_signature() { let mut services = init_services().await; diff --git a/mithril-signer/src/services/single_signer.rs b/mithril-signer/src/services/single_signer.rs index 06b7e03c85d..8c2bf87d56c 100644 --- a/mithril-signer/src/services/single_signer.rs +++ b/mithril-signer/src/services/single_signer.rs @@ -49,13 +49,6 @@ pub trait SingleSigner: Sync + Send { protocol_initializer: &ProtocolInitializer, ) -> StdResult>; - /// Compute aggregate verification key from stake distribution - fn compute_aggregate_verification_key( - &self, - signers_with_stake: &[SignerWithStake], - protocol_initializer: &ProtocolInitializer, - ) -> StdResult>; - /// Get party id fn get_party_id(&self) -> PartyId; } @@ -136,29 +129,6 @@ impl SingleSigner for MithrilSingleSigner { Ok(signatures) } - /// Compute aggregate verification key from stake distribution - fn compute_aggregate_verification_key( - &self, - signers_with_stake: &[SignerWithStake], - protocol_initializer: &ProtocolInitializer, - ) -> StdResult> { - let signer_builder = SignerBuilder::new( - signers_with_stake, - &protocol_initializer.get_protocol_parameters().into(), - ) - .with_context(|| "Mithril Single Signer can not compute aggregate verification key") - .map_err(SingleSignerError::AggregateVerificationKeyComputationFailed)?; - - let encoded_avk = signer_builder - .compute_aggregate_verification_key() - .to_json_hex() - .with_context(|| { - "Mithril Single Signer can not serialize aggregate verification key" - })?; - - Ok(Some(encoded_avk)) - } - /// Get party id fn get_party_id(&self) -> PartyId { self.party_id.clone() @@ -210,21 +180,4 @@ mod tests { "produced single signature should be valid" ); } - - #[test] - fn compute_aggregate_verification_key_success() { - let fixture = MithrilFixtureBuilder::default().with_signers(5).build(); - let signers_with_stake = fixture.signers_with_stake(); - let current_signer = &fixture.signers_fixture()[0]; - let single_signer = - MithrilSingleSigner::new(current_signer.signer_with_stake.party_id.to_owned()); - - single_signer - .compute_aggregate_verification_key( - &signers_with_stake, - ¤t_signer.protocol_initializer, - ) - .expect("compute aggregate verification signature should not fail") - .expect("aggregate verification signature should not be empty"); - } } From 92788abc4749b360700f26595e3f4cc5dfd74ed8 Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Fri, 4 Oct 2024 15:50:33 +0200 Subject: [PATCH 175/274] test: add tooling to make tests using signer epoch service easier --- mithril-signer/src/services/epoch_service.rs | 137 +++++++++++-------- 1 file changed, 77 insertions(+), 60 deletions(-) diff --git a/mithril-signer/src/services/epoch_service.rs b/mithril-signer/src/services/epoch_service.rs index 6b3c5b630b3..1c9bc69e669 100644 --- a/mithril-signer/src/services/epoch_service.rs +++ b/mithril-signer/src/services/epoch_service.rs @@ -78,15 +78,15 @@ pub trait EpochService: Sync + Send { fn can_signer_sign_current_epoch(&self, party_id: PartyId) -> StdResult; } -struct EpochData { - epoch: Epoch, - next_protocol_parameters: ProtocolParameters, - protocol_initializer: Option, - current_signers: Vec, - next_signers: Vec, - allowed_discriminants: BTreeSet, - cardano_transactions_signing_config: Option, - next_cardano_transactions_signing_config: Option, +pub(crate) struct EpochData { + pub epoch: Epoch, + pub next_protocol_parameters: ProtocolParameters, + pub protocol_initializer: Option, + pub current_signers: Vec, + pub next_signers: Vec, + pub allowed_discriminants: BTreeSet, + pub cardano_transactions_signing_config: Option, + pub next_cardano_transactions_signing_config: Option, } /// Implementation of the [epoch service][EpochService]. @@ -308,6 +308,51 @@ impl SignedEntityConfigProvider for SignerSignedEntityConfigProvider { } } +#[cfg(test)] +impl MithrilEpochService { + /// `TEST ONLY` - Create a new instance of the service using dumb dependencies. + pub fn new_with_dumb_dependencies() -> Self { + use crate::store::ProtocolInitializerStore; + use mithril_persistence::store::adapter::DumbStoreAdapter; + use mithril_persistence::store::StakeStore; + + let stake_store = Arc::new(StakeStore::new(Box::new(DumbStoreAdapter::new()), None)); + let protocol_initializer_store = Arc::new(ProtocolInitializerStore::new( + Box::new(DumbStoreAdapter::new()), + None, + )); + + Self::new(stake_store, protocol_initializer_store) + } + + /// `TEST ONLY` - Set all data to either default values, empty values, or fake values + /// if no default/empty can be set. + pub fn set_data_to_default_or_fake(mut self, epoch: Epoch) -> Self { + use mithril_common::test_utils::fake_data; + + let epoch_data = EpochData { + epoch, + next_protocol_parameters: fake_data::protocol_parameters(), + protocol_initializer: None, + current_signers: vec![], + next_signers: vec![], + allowed_discriminants: BTreeSet::new(), + cardano_transactions_signing_config: None, + next_cardano_transactions_signing_config: None, + }; + self.epoch_data = Some(epoch_data); + self + } + + /// `TEST ONLY` - Alter the data stored in the service, won't do anything if no data is stored. + pub(crate) fn alter_data(mut self, data_config: impl FnOnce(&mut EpochData)) -> Self { + if let Some(data) = self.epoch_data.as_mut() { + data_config(data); + } + self + } +} + #[cfg(test)] pub mod mock_epoch_service { use mockall::mock; @@ -392,19 +437,6 @@ mod tests { use super::*; - fn empty_or_default_epoch_data(epoch: Epoch) -> EpochData { - EpochData { - epoch, - next_protocol_parameters: fake_data::protocol_parameters(), - protocol_initializer: None, - current_signers: vec![], - next_signers: vec![], - allowed_discriminants: BTreeSet::new(), - cardano_transactions_signing_config: None, - next_cardano_transactions_signing_config: None, - } - } - #[test] fn test_is_signer_included_in_current_stake_distribution_returns_error_when_epoch_settings_is_not_set( ) { @@ -492,15 +524,12 @@ mod tests { None, )); - let epoch_service = { - let mut service = MithrilEpochService::new(stake_store, protocol_initializer_store); - service.epoch_data = Some(EpochData { - protocol_initializer: None, - current_signers: fixtures.signers(), - ..empty_or_default_epoch_data(epoch) + let epoch_service = MithrilEpochService::new(stake_store, protocol_initializer_store) + .set_data_to_default_or_fake(epoch) + .alter_data(|data| { + data.protocol_initializer = None; + data.current_signers = fixtures.signers(); }); - service - }; let can_sign_current_epoch = epoch_service .can_signer_sign_current_epoch(fixtures.signers()[0].party_id.clone()) @@ -518,17 +547,13 @@ mod tests { None, )); - let epoch_service = { - let mut service = MithrilEpochService::new(stake_store, protocol_initializer_store); - service.epoch_data = Some(EpochData { - protocol_initializer: Some( - fixtures.signers_fixture()[2].protocol_initializer.clone(), - ), - current_signers: fixtures.signers(), - ..empty_or_default_epoch_data(epoch) + let epoch_service = MithrilEpochService::new(stake_store, protocol_initializer_store) + .set_data_to_default_or_fake(epoch) + .alter_data(|data| { + data.protocol_initializer = + Some(fixtures.signers_fixture()[2].protocol_initializer.clone()); + data.current_signers = fixtures.signers(); }); - service - }; let can_sign_current_epoch = epoch_service .can_signer_sign_current_epoch(fixtures.signers()[0].party_id.clone()) @@ -546,17 +571,13 @@ mod tests { None, )); - let epoch_service = { - let mut service = MithrilEpochService::new(stake_store, protocol_initializer_store); - service.epoch_data = Some(EpochData { - protocol_initializer: Some( - fixtures.signers_fixture()[0].protocol_initializer.clone(), - ), - current_signers: fixtures.signers()[2..].to_vec(), - ..empty_or_default_epoch_data(epoch) + let epoch_service = MithrilEpochService::new(stake_store, protocol_initializer_store) + .set_data_to_default_or_fake(epoch) + .alter_data(|data| { + data.protocol_initializer = + Some(fixtures.signers_fixture()[0].protocol_initializer.clone()); + data.current_signers = fixtures.signers()[2..].to_vec(); }); - service - }; let can_sign_current_epoch = epoch_service .can_signer_sign_current_epoch(fixtures.signers()[0].party_id.clone()) @@ -574,17 +595,13 @@ mod tests { None, )); - let epoch_service = { - let mut service = MithrilEpochService::new(stake_store, protocol_initializer_store); - service.epoch_data = Some(EpochData { - protocol_initializer: Some( - fixtures.signers_fixture()[0].protocol_initializer.clone(), - ), - current_signers: fixtures.signers(), - ..empty_or_default_epoch_data(epoch) + let epoch_service = MithrilEpochService::new(stake_store, protocol_initializer_store) + .set_data_to_default_or_fake(epoch) + .alter_data(|data| { + data.protocol_initializer = + Some(fixtures.signers_fixture()[0].protocol_initializer.clone()); + data.current_signers = fixtures.signers(); }); - service - }; let can_sign_current_epoch = epoch_service .can_signer_sign_current_epoch(fixtures.signers()[0].party_id.clone()) From fdf1ab2dd5866870cb1de1fe8f1465437f6ff871 Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Fri, 4 Oct 2024 15:53:53 +0200 Subject: [PATCH 176/274] refactor: simplify signer SingleSigner signature computation By using the `protocol_initializer` stored in the epoch service, removing the need to pass it in `compute_single_signatures` parameters. --- .../src/dependency_injection/builder.rs | 5 +- mithril-signer/src/runtime/runner.rs | 36 ++++------ mithril-signer/src/runtime/state_machine.rs | 4 +- mithril-signer/src/services/single_signer.rs | 71 ++++++++++++------- .../test_extensions/state_machine_tester.rs | 7 +- 5 files changed, 70 insertions(+), 53 deletions(-) diff --git a/mithril-signer/src/dependency_injection/builder.rs b/mithril-signer/src/dependency_injection/builder.rs index dfe5d075226..8c533a67460 100644 --- a/mithril-signer/src/dependency_injection/builder.rs +++ b/mithril-signer/src/dependency_injection/builder.rs @@ -214,7 +214,6 @@ impl<'a> DependenciesBuilder<'a> { )?), self.config.store_retention_limit, )); - let single_signer = Arc::new(MithrilSingleSigner::new(self.compute_protocol_party_id()?)); let digester = Arc::new(CardanoImmutableDigester::new( self.build_digester_cache_provider().await?, slog_scope::logger(), @@ -326,6 +325,10 @@ impl<'a> DependenciesBuilder<'a> { stake_store.clone(), protocol_initializer_store.clone(), ))); + let single_signer = Arc::new(MithrilSingleSigner::new( + self.compute_protocol_party_id()?, + epoch_service.clone(), + )); let signable_seed_builder_service = Arc::new(SignerSignableSeedBuilder::new( epoch_service.clone(), protocol_initializer_store.clone(), diff --git a/mithril-signer/src/runtime/runner.rs b/mithril-signer/src/runtime/runner.rs index 357c2fc0805..0c36060eaa1 100644 --- a/mithril-signer/src/runtime/runner.rs +++ b/mithril-signer/src/runtime/runner.rs @@ -50,7 +50,6 @@ pub trait Runner: Send + Sync { /// Create the single signature. async fn compute_single_signature( &self, - epoch: Epoch, message: &ProtocolMessage, ) -> StdResult>; @@ -288,7 +287,6 @@ impl Runner for SignerRunner { async fn compute_single_signature( &self, - epoch: Epoch, message: &ProtocolMessage, ) -> StdResult> { debug!("RUNNER: compute_single_signature"); @@ -298,22 +296,11 @@ impl Runner for SignerRunner { .await .with_context(|| "Runner can not not retrieve signers")?; - let signer_retrieval_epoch = epoch.offset_to_signer_retrieval_epoch()?; - let protocol_initializer = self + let signature = self .services - .protocol_initializer_store - .get_protocol_initializer(signer_retrieval_epoch) - .await? - .ok_or_else(|| { - RunnerError::NoValueError(format!( - "protocol_initializer at epoch {signer_retrieval_epoch}" - )) - })?; - let signature = self.services.single_signer.compute_single_signatures( - message, - &signers, - &protocol_initializer, - )?; + .single_signer + .compute_single_signatures(message, &signers) + .await?; info!( " > {}", if signature.is_some() { @@ -524,7 +511,7 @@ mod tests { stake_store.clone(), protocol_initializer_store.clone(), ))); - let single_signer = Arc::new(MithrilSingleSigner::new(party_id)); + let single_signer = Arc::new(MithrilSingleSigner::new(party_id, epoch_service.clone())); let signable_seed_builder_service = Arc::new(SignerSignableSeedBuilder::new( epoch_service.clone(), protocol_initializer_store.clone(), @@ -703,8 +690,10 @@ mod tests { let fixture = MithrilFixtureBuilder::default().with_signers(5).build(); let signer_with_stake = fixture.signers_fixture()[0].signer_with_stake.clone(); let protocol_initializer = fixture.signers_fixture()[0].protocol_initializer.clone(); + let single_signer = Arc::new(MithrilSingleSigner::new( signer_with_stake.party_id.to_string(), + services.epoch_service.clone(), )); services.single_signer = single_signer.clone(); services @@ -744,10 +733,6 @@ mod tests { "an avk".to_string(), ); - let expected = single_signer - .compute_single_signatures(&message, signers_with_stake, &protocol_initializer) - .expect("compute_single_signatures should not fail"); - let runner = init_runner(Some(services), None).await; // inform epoch settings @@ -759,8 +744,13 @@ mod tests { }; runner.inform_epoch_settings(epoch_settings).await.unwrap(); + let expected = single_signer + .compute_single_signatures(&message, signers_with_stake) + .await + .expect("compute_single_signatures should not fail"); + let single_signature = runner - .compute_single_signature(current_time_point.epoch, &message) + .compute_single_signature(&message) .await .expect("compute_message should not fail"); assert_eq!(expected, single_signature); diff --git a/mithril-signer/src/runtime/state_machine.rs b/mithril-signer/src/runtime/state_machine.rs index 9e2190bdd12..6d995c3889d 100644 --- a/mithril-signer/src/runtime/state_machine.rs +++ b/mithril-signer/src/runtime/state_machine.rs @@ -377,7 +377,7 @@ impl StateMachine { let single_signatures = self .runner - .compute_single_signature(current_epoch, &message) + .compute_single_signature(&message) .await .map_err(|e| RuntimeError::KeepState { message: format!("Could not compute single signature during 'ready to sign → ready to sign' phase (current epoch {current_epoch:?})"), @@ -725,7 +725,7 @@ mod tests { runner .expect_compute_single_signature() .once() - .returning(|_, _| Ok(Some(fake_data::single_signatures(vec![1, 5, 23])))); + .returning(|_| Ok(Some(fake_data::single_signatures(vec![1, 5, 23])))); runner .expect_compute_message() .once() diff --git a/mithril-signer/src/services/single_signer.rs b/mithril-signer/src/services/single_signer.rs index 8c2bf87d56c..fe8097e9b79 100644 --- a/mithril-signer/src/services/single_signer.rs +++ b/mithril-signer/src/services/single_signer.rs @@ -1,4 +1,5 @@ use anyhow::{anyhow, Context}; +use async_trait::async_trait; use hex::ToHex; use slog_scope::{info, trace, warn}; use std::path::PathBuf; @@ -11,10 +12,9 @@ use mithril_common::entities::{ use mithril_common::protocol::SignerBuilder; use mithril_common::{StdError, StdResult}; -#[cfg(test)] -use mockall::automock; +use crate::dependency_injection::EpochServiceWrapper; -/// This is responsible of creating new instances of ProtocolInitializer. +/// This is responsible for creating new instances of ProtocolInitializer. pub struct MithrilProtocolInitializerBuilder {} impl MithrilProtocolInitializerBuilder { @@ -38,15 +38,15 @@ impl MithrilProtocolInitializerBuilder { } } -/// The SingleSigner is the structure responsible of issuing SingleSignatures. -#[cfg_attr(test, automock)] +/// The SingleSigner is the structure responsible for issuing SingleSignatures. +#[cfg_attr(test, mockall::automock)] +#[async_trait] pub trait SingleSigner: Sync + Send { /// Computes single signatures - fn compute_single_signatures( + async fn compute_single_signatures( &self, protocol_message: &ProtocolMessage, signers_with_stake: &[SignerWithStake], - protocol_initializer: &ProtocolInitializer, ) -> StdResult>; /// Get party id @@ -72,22 +72,35 @@ pub enum SingleSignerError { /// Implementation of the SingleSigner. pub struct MithrilSingleSigner { party_id: PartyId, + epoch_service: EpochServiceWrapper, } impl MithrilSingleSigner { /// Create a new instance of the MithrilSingleSigner. - pub fn new(party_id: PartyId) -> Self { - Self { party_id } + pub fn new(party_id: PartyId, epoch_service: EpochServiceWrapper) -> Self { + Self { + party_id, + epoch_service, + } + } + + async fn get_protocol_initializer(&self) -> StdResult { + let epoch_service = self.epoch_service.read().await; + epoch_service.protocol_initializer()?.clone().ok_or(anyhow!( + "Can not Sign or Compute AVK, No protocol initializer found for party_id: '{}'", + self.party_id.clone() + )) } } +#[async_trait] impl SingleSigner for MithrilSingleSigner { - fn compute_single_signatures( + async fn compute_single_signatures( &self, protocol_message: &ProtocolMessage, signers_with_stake: &[SignerWithStake], - protocol_initializer: &ProtocolInitializer, ) -> StdResult> { + let protocol_initializer = self.get_protocol_initializer().await?; let builder = SignerBuilder::new( signers_with_stake, &protocol_initializer.get_protocol_parameters().into(), @@ -137,32 +150,42 @@ impl SingleSigner for MithrilSingleSigner { #[cfg(test)] mod tests { - use super::*; + use std::sync::Arc; + use tokio::sync::RwLock; - use mithril_common::{ - crypto_helper::ProtocolClerk, entities::ProtocolMessagePartKey, - test_utils::MithrilFixtureBuilder, - }; + use mithril_common::crypto_helper::ProtocolClerk; + use mithril_common::entities::{Epoch, ProtocolMessagePartKey}; + use mithril_common::test_utils::MithrilFixtureBuilder; - #[test] - fn compute_single_signature_success() { + use crate::services::MithrilEpochService; + + use super::*; + + #[tokio::test] + async fn compute_single_signature_success() { let snapshot_digest = "digest".to_string(); let fixture = MithrilFixtureBuilder::default().with_signers(5).build(); let signers_with_stake = fixture.signers_with_stake(); let current_signer = &fixture.signers_fixture()[0]; - let single_signer = MithrilSingleSigner::new(current_signer.party_id()); let clerk = ProtocolClerk::from_signer(¤t_signer.protocol_signer); let avk = clerk.compute_avk(); let mut protocol_message = ProtocolMessage::new(); protocol_message.set_message_part(ProtocolMessagePartKey::SnapshotDigest, snapshot_digest); let expected_message = protocol_message.compute_hash().as_bytes().to_vec(); + let epoch_service = MithrilEpochService::new_with_dumb_dependencies() + .set_data_to_default_or_fake(Epoch(10)) + .alter_data(|data| { + data.protocol_initializer = Some(current_signer.protocol_initializer.clone()) + }); + + let single_signer = MithrilSingleSigner::new( + current_signer.party_id(), + Arc::new(RwLock::new(epoch_service)), + ); let sign_result = single_signer - .compute_single_signatures( - &protocol_message, - &signers_with_stake, - ¤t_signer.protocol_initializer, - ) + .compute_single_signatures(&protocol_message, &signers_with_stake) + .await .expect("single signer should not fail") .expect("single signer should produce a signature here"); diff --git a/mithril-signer/tests/test_extensions/state_machine_tester.rs b/mithril-signer/tests/test_extensions/state_machine_tester.rs index 06d17a09caa..6249f2ff25a 100644 --- a/mithril-signer/tests/test_extensions/state_machine_tester.rs +++ b/mithril-signer/tests/test_extensions/state_machine_tester.rs @@ -163,9 +163,6 @@ impl StateMachineTester { ), config.store_retention_limit, )); - let single_signer = Arc::new(MithrilSingleSigner::new( - config.party_id.to_owned().unwrap_or_default(), - )); let stake_store = Arc::new(StakeStore::new( Box::new(SQLiteAdapter::new("stake", sqlite_connection.clone()).unwrap()), config.store_retention_limit, @@ -220,6 +217,10 @@ impl StateMachineTester { stake_store.clone(), protocol_initializer_store.clone(), ))); + let single_signer = Arc::new(MithrilSingleSigner::new( + config.party_id.to_owned().unwrap_or_default(), + epoch_service.clone(), + )); let signable_seed_builder_service = Arc::new(SignerSignableSeedBuilder::new( epoch_service.clone(), protocol_initializer_store.clone(), From 8a2b36e473a837704be10e8f4f4a60874543591a Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Fri, 4 Oct 2024 16:40:12 +0200 Subject: [PATCH 177/274] refactor: simplify signer SingleSigner signature computation By using the `current_signers_with_stake` of the epoch service, removing the need to pass it in `compute_single_signatures` parameters. --- mithril-signer/src/runtime/runner.rs | 20 +---- mithril-signer/src/services/single_signer.rs | 85 +++++++++++++------- 2 files changed, 58 insertions(+), 47 deletions(-) diff --git a/mithril-signer/src/runtime/runner.rs b/mithril-signer/src/runtime/runner.rs index 0c36060eaa1..80f18fe441f 100644 --- a/mithril-signer/src/runtime/runner.rs +++ b/mithril-signer/src/runtime/runner.rs @@ -6,8 +6,7 @@ use tokio::sync::RwLockReadGuard; use mithril_common::crypto_helper::{KESPeriod, OpCert, ProtocolOpCert, SerDeShelleyFileFormat}; use mithril_common::entities::{ - Epoch, PartyId, ProtocolMessage, SignedEntityType, Signer, SignerWithStake, SingleSignatures, - TimePoint, + Epoch, PartyId, ProtocolMessage, SignedEntityType, Signer, SingleSignatures, TimePoint, }; use mithril_common::StdResult; use mithril_persistence::store::StakeStorer; @@ -100,13 +99,6 @@ impl SignerRunner { Self { services, config } } - /// Get the current signers with their stake. - async fn get_current_signers_with_stake(&self) -> StdResult> { - let epoch_service = self.epoch_service_read().await; - - epoch_service.current_signers_with_stake().await - } - async fn epoch_service_read(&self) -> RwLockReadGuard<'_, dyn EpochService> { self.services.epoch_service.read().await } @@ -291,15 +283,10 @@ impl Runner for SignerRunner { ) -> StdResult> { debug!("RUNNER: compute_single_signature"); - let signers = self - .get_current_signers_with_stake() - .await - .with_context(|| "Runner can not not retrieve signers")?; - let signature = self .services .single_signer - .compute_single_signatures(message, &signers) + .compute_single_signatures(message) .await?; info!( " > {}", @@ -720,7 +707,6 @@ mod tests { .await .expect("save_stakes should not fail"); - let signers_with_stake = &fixture.signers_with_stake()[0..3]; let signers = &fixture.signers()[0..3]; let mut message = ProtocolMessage::new(); @@ -745,7 +731,7 @@ mod tests { runner.inform_epoch_settings(epoch_settings).await.unwrap(); let expected = single_signer - .compute_single_signatures(&message, signers_with_stake) + .compute_single_signatures(&message) .await .expect("compute_single_signatures should not fail"); diff --git a/mithril-signer/src/services/single_signer.rs b/mithril-signer/src/services/single_signer.rs index fe8097e9b79..f28521f0fca 100644 --- a/mithril-signer/src/services/single_signer.rs +++ b/mithril-signer/src/services/single_signer.rs @@ -7,9 +7,9 @@ use thiserror::Error; use mithril_common::crypto_helper::{KESPeriod, ProtocolInitializer}; use mithril_common::entities::{ - PartyId, ProtocolMessage, ProtocolParameters, SignerWithStake, SingleSignatures, Stake, + PartyId, ProtocolMessage, ProtocolParameters, SingleSignatures, Stake, }; -use mithril_common::protocol::SignerBuilder; +use mithril_common::protocol::{SignerBuilder, SingleSigner as ProtocolSingleSigner}; use mithril_common::{StdError, StdResult}; use crate::dependency_injection::EpochServiceWrapper; @@ -46,7 +46,6 @@ pub trait SingleSigner: Sync + Send { async fn compute_single_signatures( &self, protocol_message: &ProtocolMessage, - signers_with_stake: &[SignerWithStake], ) -> StdResult>; /// Get party id @@ -84,31 +83,25 @@ impl MithrilSingleSigner { } } - async fn get_protocol_initializer(&self) -> StdResult { + async fn build_protocol_single_signer(&self) -> StdResult { let epoch_service = self.epoch_service.read().await; - epoch_service.protocol_initializer()?.clone().ok_or(anyhow!( - "Can not Sign or Compute AVK, No protocol initializer found for party_id: '{}'", - self.party_id.clone() - )) - } -} + let protocol_initializer = + epoch_service + .protocol_initializer()? + .as_ref() + .ok_or(anyhow!( + "Can not Sign or Compute AVK, No protocol initializer found for party_id: '{}'", + self.party_id.clone() + ))?; -#[async_trait] -impl SingleSigner for MithrilSingleSigner { - async fn compute_single_signatures( - &self, - protocol_message: &ProtocolMessage, - signers_with_stake: &[SignerWithStake], - ) -> StdResult> { - let protocol_initializer = self.get_protocol_initializer().await?; let builder = SignerBuilder::new( - signers_with_stake, + &epoch_service.current_signers_with_stake().await?, &protocol_initializer.get_protocol_parameters().into(), ) .with_context(|| "Mithril Single Signer can not build signer") - .map_err(|e| SingleSignerError::ProtocolSignerCreationFailure(anyhow!(e)))?; - info!("Signing protocol message"; "protocol_message" => #?protocol_message, "signed message" => protocol_message.compute_hash().encode_hex::()); - let signatures = builder + .map_err(SingleSignerError::ProtocolSignerCreationFailure)?; + + let single_signer = builder .restore_signer_from_initializer(self.party_id.clone(), protocol_initializer.clone()) .with_context(|| { format!( @@ -116,7 +109,22 @@ impl SingleSigner for MithrilSingleSigner { self.party_id.clone() ) }) - .map_err(|e| SingleSignerError::ProtocolSignerCreationFailure(anyhow!(e)))? + .map_err(SingleSignerError::ProtocolSignerCreationFailure)?; + + Ok(single_signer) + } +} + +#[async_trait] +impl SingleSigner for MithrilSingleSigner { + async fn compute_single_signatures( + &self, + protocol_message: &ProtocolMessage, + ) -> StdResult> { + let protocol_single_signer = self.build_protocol_single_signer().await?; + + info!("Signing protocol message"; "protocol_message" => #?protocol_message, "signed message" => protocol_message.compute_hash().encode_hex::()); + let signatures = protocol_single_signer .sign(protocol_message) .with_context(|| { format!( @@ -156,8 +164,11 @@ mod tests { use mithril_common::crypto_helper::ProtocolClerk; use mithril_common::entities::{Epoch, ProtocolMessagePartKey}; use mithril_common::test_utils::MithrilFixtureBuilder; + use mithril_persistence::store::adapter::{DumbStoreAdapter, MemoryAdapter}; + use mithril_persistence::store::StakeStore; use crate::services::MithrilEpochService; + use crate::store::ProtocolInitializerStore; use super::*; @@ -165,17 +176,28 @@ mod tests { async fn compute_single_signature_success() { let snapshot_digest = "digest".to_string(); let fixture = MithrilFixtureBuilder::default().with_signers(5).build(); - let signers_with_stake = fixture.signers_with_stake(); let current_signer = &fixture.signers_fixture()[0]; let clerk = ProtocolClerk::from_signer(¤t_signer.protocol_signer); let avk = clerk.compute_avk(); - let mut protocol_message = ProtocolMessage::new(); - protocol_message.set_message_part(ProtocolMessagePartKey::SnapshotDigest, snapshot_digest); - let expected_message = protocol_message.compute_hash().as_bytes().to_vec(); - let epoch_service = MithrilEpochService::new_with_dumb_dependencies() + let stake_store = Arc::new(StakeStore::new( + Box::new( + MemoryAdapter::new(Some(vec![( + Epoch(10).offset_to_signer_retrieval_epoch().unwrap(), + fixture.stake_distribution(), + )])) + .unwrap(), + ), + None, + )); + let protocol_initializer_store = Arc::new(ProtocolInitializerStore::new( + Box::new(DumbStoreAdapter::new()), + None, + )); + let epoch_service = MithrilEpochService::new(stake_store, protocol_initializer_store) .set_data_to_default_or_fake(Epoch(10)) .alter_data(|data| { - data.protocol_initializer = Some(current_signer.protocol_initializer.clone()) + data.protocol_initializer = Some(current_signer.protocol_initializer.clone()); + data.current_signers = fixture.signers(); }); let single_signer = MithrilSingleSigner::new( @@ -183,12 +205,15 @@ mod tests { Arc::new(RwLock::new(epoch_service)), ); + let mut protocol_message = ProtocolMessage::new(); + protocol_message.set_message_part(ProtocolMessagePartKey::SnapshotDigest, snapshot_digest); let sign_result = single_signer - .compute_single_signatures(&protocol_message, &signers_with_stake) + .compute_single_signatures(&protocol_message) .await .expect("single signer should not fail") .expect("single signer should produce a signature here"); + let expected_message = protocol_message.compute_hash().as_bytes().to_vec(); let decoded_sig = sign_result.to_protocol_signature(); assert!( decoded_sig From f28f383e962d4162c7516fdf75d1cc90b9b90897 Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Fri, 4 Oct 2024 17:37:54 +0200 Subject: [PATCH 178/274] tests: simplify dependencies in signer certifier tests By allowing to only specifies the dependencies that matters for the test. --- mithril-signer/src/services/certifier.rs | 82 ++++++++++++------------ 1 file changed, 42 insertions(+), 40 deletions(-) diff --git a/mithril-signer/src/services/certifier.rs b/mithril-signer/src/services/certifier.rs index f7efec8907d..06b2e7977ec 100644 --- a/mithril-signer/src/services/certifier.rs +++ b/mithril-signer/src/services/certifier.rs @@ -131,15 +131,14 @@ mod tests { for signed_entity_type in SignedEntityTypeDiscriminants::all() { locker.lock(signed_entity_type).await; } - let certifier_service = SignerCertifierService::new( - Arc::new(DumbTickerService::new(TimePoint::dummy())), - Arc::new(DumbSignedBeaconStore::default()), - Arc::new(DumbSignedEntityConfigProvider::new( + let certifier_service = SignerCertifierService { + signed_entity_type_lock: locker.clone(), + signed_entity_config_provider: Arc::new(DumbSignedEntityConfigProvider::new( CardanoTransactionsSigningConfig::dummy(), SignedEntityTypeDiscriminants::all(), )), - locker, - ); + ..SignerCertifierService::dumb_dependencies(TimePoint::new(1, 14, ChainPoint::dummy())) + }; let beacon_to_sign = certifier_service.get_beacon_to_sign().await.unwrap(); assert_eq!(beacon_to_sign, None); @@ -147,20 +146,18 @@ mod tests { #[tokio::test] async fn only_one_unlocked_and_not_yet_signed_yield_a_beacon_to_sign() { - let ticker_service = DumbTickerService::new(TimePoint::new(3, 14, ChainPoint::dummy())); let locker = Arc::new(SignedEntityTypeLock::new()); for signed_entity_type in SignedEntityTypeDiscriminants::all().into_iter().skip(1) { locker.lock(signed_entity_type).await; } - let certifier_service = SignerCertifierService::new( - Arc::new(ticker_service), - Arc::new(DumbSignedBeaconStore::default()), - Arc::new(DumbSignedEntityConfigProvider::new( + let certifier_service = SignerCertifierService { + signed_entity_type_lock: locker.clone(), + signed_entity_config_provider: Arc::new(DumbSignedEntityConfigProvider::new( CardanoTransactionsSigningConfig::dummy(), SignedEntityTypeDiscriminants::all(), )), - Arc::new(SignedEntityTypeLock::new()), - ); + ..SignerCertifierService::dumb_dependencies(TimePoint::new(3, 14, ChainPoint::dummy())) + }; let beacon_to_sign = certifier_service.get_beacon_to_sign().await.unwrap(); let signed_discriminant: Option = @@ -175,15 +172,14 @@ mod tests { #[tokio::test] async fn mark_beacon_as_signed_update_the_store() { let signed_beacons_store = Arc::new(DumbSignedBeaconStore::default()); - let certifier_service = SignerCertifierService::new( - Arc::new(DumbTickerService::new(TimePoint::dummy())), - signed_beacons_store.clone(), - Arc::new(DumbSignedEntityConfigProvider::new( + let certifier_service = SignerCertifierService { + signed_beacon_store: signed_beacons_store.clone(), + signed_entity_config_provider: Arc::new(DumbSignedEntityConfigProvider::new( CardanoTransactionsSigningConfig::dummy(), SignedEntityTypeDiscriminants::all(), )), - Arc::new(SignedEntityTypeLock::new()), - ); + ..SignerCertifierService::dumb_dependencies(TimePoint::dummy()) + }; certifier_service .mark_beacon_as_signed(&BeaconToSign { @@ -203,16 +199,14 @@ mod tests { #[tokio::test] async fn if_already_signed_a_beacon_is_not_returned_anymore() { - let ticker_service = DumbTickerService::new(TimePoint::new(1, 14, ChainPoint::dummy())); - let certifier_service = SignerCertifierService::new( - Arc::new(ticker_service), - Arc::new(DumbSignedBeaconStore::default()), - Arc::new(DumbSignedEntityConfigProvider::new( + let certifier_service = SignerCertifierService { + signed_beacon_store: Arc::new(DumbSignedBeaconStore::default()), + signed_entity_config_provider: Arc::new(DumbSignedEntityConfigProvider::new( CardanoTransactionsSigningConfig::dummy(), SignedEntityTypeDiscriminants::all(), )), - Arc::new(SignedEntityTypeLock::new()), - ); + ..SignerCertifierService::dumb_dependencies(TimePoint::new(1, 14, ChainPoint::dummy())) + }; let first_beacon_to_sign = certifier_service .get_beacon_to_sign() @@ -237,16 +231,13 @@ mod tests { #[tokio::test] async fn draining_out_all_beacons_to_sign_use_signed_entity_discriminant_order() { - let ticker_service = DumbTickerService::new(TimePoint::new(1, 14, ChainPoint::dummy())); - let certifier_service = SignerCertifierService::new( - Arc::new(ticker_service), - Arc::new(DumbSignedBeaconStore::default()), - Arc::new(DumbSignedEntityConfigProvider::new( + let certifier_service = SignerCertifierService { + signed_entity_config_provider: Arc::new(DumbSignedEntityConfigProvider::new( CardanoTransactionsSigningConfig::dummy(), SignedEntityTypeDiscriminants::all(), )), - Arc::new(SignedEntityTypeLock::new()), - ); + ..SignerCertifierService::dumb_dependencies(TimePoint::new(1, 14, ChainPoint::dummy())) + }; let mut previous_beacon_to_sign = certifier_service .get_beacon_to_sign() @@ -278,16 +269,13 @@ mod tests { #[tokio::test] async fn draining_out_all_beacons_to_sign_doesnt_repeat_value() { - let ticker_service = DumbTickerService::new(TimePoint::new(1, 14, ChainPoint::dummy())); - let certifier_service = SignerCertifierService::new( - Arc::new(ticker_service), - Arc::new(DumbSignedBeaconStore::default()), - Arc::new(DumbSignedEntityConfigProvider::new( + let certifier_service = SignerCertifierService { + signed_entity_config_provider: Arc::new(DumbSignedEntityConfigProvider::new( CardanoTransactionsSigningConfig::dummy(), SignedEntityTypeDiscriminants::all(), )), - Arc::new(SignedEntityTypeLock::new()), - ); + ..SignerCertifierService::dumb_dependencies(TimePoint::new(1, 14, ChainPoint::dummy())) + }; let mut all_signed_beacons = vec![]; while let Some(beacon_to_sign) = certifier_service.get_beacon_to_sign().await.unwrap() { @@ -318,6 +306,20 @@ mod tests { use super::*; + impl SignerCertifierService { + pub fn dumb_dependencies(initial_time_point: TimePoint) -> Self { + Self { + ticker_service: Arc::new(DumbTickerService::new(initial_time_point)), + signed_beacon_store: Arc::new(DumbSignedBeaconStore::default()), + signed_entity_config_provider: Arc::new(DumbSignedEntityConfigProvider::new( + CardanoTransactionsSigningConfig::dummy(), + SignedEntityTypeDiscriminants::all(), + )), + signed_entity_type_lock: Arc::new(SignedEntityTypeLock::new()), + } + } + } + pub struct DumbTickerService { time_point: TimePoint, } From ab2906d3c240780b6ed90a371530b77668b296a2 Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Fri, 4 Oct 2024 18:25:38 +0200 Subject: [PATCH 179/274] refactor: move responsibility of computing/publishing signatures to certifier in signer --- .../src/dependency_injection/builder.rs | 2 + mithril-signer/src/runtime/runner.rs | 175 ++---------------- mithril-signer/src/runtime/state_machine.rs | 19 +- .../src/services/aggregator_client.rs | 17 +- mithril-signer/src/services/certifier.rs | 147 ++++++++++++++- .../test_extensions/state_machine_tester.rs | 2 + 6 files changed, 187 insertions(+), 175 deletions(-) diff --git a/mithril-signer/src/dependency_injection/builder.rs b/mithril-signer/src/dependency_injection/builder.rs index 8c533a67460..1616bbabb14 100644 --- a/mithril-signer/src/dependency_injection/builder.rs +++ b/mithril-signer/src/dependency_injection/builder.rs @@ -371,6 +371,8 @@ impl<'a> DependenciesBuilder<'a> { epoch_service.clone(), )), signed_entity_type_lock.clone(), + single_signer.clone(), + aggregator_client.clone(), )); let services = SignerDependencyContainer { diff --git a/mithril-signer/src/runtime/runner.rs b/mithril-signer/src/runtime/runner.rs index 80f18fe441f..8852e8ab78e 100644 --- a/mithril-signer/src/runtime/runner.rs +++ b/mithril-signer/src/runtime/runner.rs @@ -1,12 +1,12 @@ use anyhow::Context; use async_trait::async_trait; -use slog_scope::{debug, info, warn}; +use slog_scope::{debug, warn}; use thiserror::Error; use tokio::sync::RwLockReadGuard; use mithril_common::crypto_helper::{KESPeriod, OpCert, ProtocolOpCert, SerDeShelleyFileFormat}; use mithril_common::entities::{ - Epoch, PartyId, ProtocolMessage, SignedEntityType, Signer, SingleSignatures, TimePoint, + Epoch, PartyId, ProtocolMessage, SignedEntityType, Signer, TimePoint, }; use mithril_common::StdResult; use mithril_persistence::store::StakeStorer; @@ -47,17 +47,10 @@ pub trait Runner: Send + Sync { ) -> StdResult; /// Create the single signature. - async fn compute_single_signature( + async fn compute_publish_single_signature( &self, + beacon_to_sign: &BeaconToSign, message: &ProtocolMessage, - ) -> StdResult>; - - /// Send the single signature to the aggregator in order to be aggregated. - async fn send_single_signature( - &self, - signed_entity_type: &SignedEntityType, - maybe_signature: Option, - signed_message: &ProtocolMessage, ) -> StdResult<()>; /// Mark the beacon as signed. @@ -277,51 +270,16 @@ impl Runner for SignerRunner { Ok(protocol_message) } - async fn compute_single_signature( + async fn compute_publish_single_signature( &self, + beacon_to_sign: &BeaconToSign, message: &ProtocolMessage, - ) -> StdResult> { - debug!("RUNNER: compute_single_signature"); - - let signature = self - .services - .single_signer - .compute_single_signatures(message) - .await?; - info!( - " > {}", - if signature.is_some() { - "could compute a single signature!" - } else { - "NO single signature was computed." - } - ); - - Ok(signature) - } - - async fn send_single_signature( - &self, - signed_entity_type: &SignedEntityType, - maybe_signature: Option, - protocol_message: &ProtocolMessage, ) -> StdResult<()> { - debug!("RUNNER: send_single_signature"); - - if let Some(single_signatures) = maybe_signature { - debug!(" > there is a single signature to send"); - - self.services - .certificate_handler - .register_signatures(signed_entity_type, &single_signatures, protocol_message) - .await?; - - Ok(()) - } else { - debug!(" > NO single signature to send, doing nothing"); - - Ok(()) - } + debug!("RUNNER: compute_publish_single_signature"); + self.services + .certifier + .compute_publish_single_signature(beacon_to_sign, message) + .await } async fn mark_beacon_as_signed(&self, beacon: &BeaconToSign) -> StdResult<()> { @@ -383,9 +341,7 @@ mod tests { MKMap, MKMapNode, MKTreeNode, MKTreeStoreInMemory, MKTreeStorer, ProtocolInitializer, }, digesters::{DumbImmutableDigester, DumbImmutableFileObserver}, - entities::{ - BlockNumber, BlockRange, Epoch, ProtocolMessagePartKey, SignedEntityTypeDiscriminants, - }, + entities::{BlockNumber, BlockRange, Epoch, SignedEntityTypeDiscriminants}, era::{adapters::EraReaderBootstrapAdapter, EraChecker, EraReader}, messages::{AggregatorCapabilities, AggregatorFeaturesMessage}, signable_builder::{ @@ -405,9 +361,8 @@ mod tests { use crate::metrics::MetricsService; use crate::services::{ CardanoTransactionsImporter, DumbAggregatorClient, MithrilEpochService, - MithrilSingleSigner, MockAggregatorClient, MockTransactionStore, MockUpkeepService, - SignerCertifierService, SignerSignableSeedBuilder, SignerSignedEntityConfigProvider, - SingleSigner, + MithrilSingleSigner, MockTransactionStore, MockUpkeepService, SignerCertifierService, + SignerSignableSeedBuilder, SignerSignedEntityConfigProvider, }; use crate::store::ProtocolInitializerStore; @@ -523,6 +478,7 @@ mod tests { Arc::new(CardanoTransactionsPreloaderActivation::new(true)), )); let upkeep_service = Arc::new(MockUpkeepService::new()); + let aggregator_client = Arc::new(DumbAggregatorClient::default()); let certifier = Arc::new(SignerCertifierService::new( ticker_service.clone(), Arc::new(SignedBeaconRepository::new(sqlite_connection.clone(), None)), @@ -531,11 +487,13 @@ mod tests { epoch_service.clone(), )), signed_entity_type_lock.clone(), + single_signer.clone(), + aggregator_client.clone(), )); SignerDependencyContainer { stake_store, - certificate_handler: Arc::new(DumbAggregatorClient::default()), + certificate_handler: aggregator_client, chain_observer, digester, single_signer, @@ -666,103 +624,6 @@ mod tests { ); } - #[tokio::test] - async fn test_compute_single_signature() { - let mut services = init_services().await; - let current_time_point = services - .ticker_service - .get_current_time_point() - .await - .expect("get_current_time_point should not fail"); - let fixture = MithrilFixtureBuilder::default().with_signers(5).build(); - let signer_with_stake = fixture.signers_fixture()[0].signer_with_stake.clone(); - let protocol_initializer = fixture.signers_fixture()[0].protocol_initializer.clone(); - - let single_signer = Arc::new(MithrilSingleSigner::new( - signer_with_stake.party_id.to_string(), - services.epoch_service.clone(), - )); - services.single_signer = single_signer.clone(); - services - .protocol_initializer_store - .save_protocol_initializer( - current_time_point - .epoch - .offset_to_signer_retrieval_epoch() - .expect("offset_to_signer_retrieval_epoch should not fail"), - protocol_initializer.clone(), - ) - .await - .expect("save_protocol_initializer should not fail"); - - services - .stake_store - .save_stakes( - current_time_point - .epoch - .offset_to_signer_retrieval_epoch() - .expect("offset_to_signer_retrieval_epoch should not fail"), - fixture.stake_distribution(), - ) - .await - .expect("save_stakes should not fail"); - - let signers = &fixture.signers()[0..3]; - - let mut message = ProtocolMessage::new(); - message.set_message_part( - ProtocolMessagePartKey::SnapshotDigest, - "a message".to_string(), - ); - message.set_message_part( - ProtocolMessagePartKey::NextAggregateVerificationKey, - "an avk".to_string(), - ); - - let runner = init_runner(Some(services), None).await; - - // inform epoch settings - let epoch_settings = SignerEpochSettings { - epoch: current_time_point.epoch, - current_signers: signers.to_vec(), - next_signers: fixture.signers(), - ..SignerEpochSettings::dummy().clone() - }; - runner.inform_epoch_settings(epoch_settings).await.unwrap(); - - let expected = single_signer - .compute_single_signatures(&message) - .await - .expect("compute_single_signatures should not fail"); - - let single_signature = runner - .compute_single_signature(&message) - .await - .expect("compute_message should not fail"); - assert_eq!(expected, single_signature); - } - - #[tokio::test] - async fn test_send_single_signature() { - let mut services = init_services().await; - let mut certificate_handler = MockAggregatorClient::new(); - certificate_handler - .expect_register_signatures() - .once() - .returning(|_, _, _| Ok(())); - services.certificate_handler = Arc::new(certificate_handler); - let runner = init_runner(Some(services), None).await; - - runner - .send_single_signature( - &SignedEntityType::dummy(), - Some(fake_data::single_signatures(vec![2, 5, 12])), - &ProtocolMessage::default(), - ) - .await - .expect("send_single_signature should not fail"); - } - #[tokio::test] async fn test_update_era_checker() { let services = init_services().await; diff --git a/mithril-signer/src/runtime/state_machine.rs b/mithril-signer/src/runtime/state_machine.rs index 6d995c3889d..2b7cb6c0c7e 100644 --- a/mithril-signer/src/runtime/state_machine.rs +++ b/mithril-signer/src/runtime/state_machine.rs @@ -375,17 +375,10 @@ impl StateMachine { nested_error: Some(e) })?; - let single_signatures = self - .runner - .compute_single_signature(&message) + self.runner.compute_publish_single_signature(&beacon_to_sign, &message) .await .map_err(|e| RuntimeError::KeepState { - message: format!("Could not compute single signature during 'ready to sign → ready to sign' phase (current epoch {current_epoch:?})"), - nested_error: Some(e) - })?; - self.runner.send_single_signature(&beacon_to_sign.signed_entity_type, single_signatures, &message).await - .map_err(|e| RuntimeError::KeepState { - message: format!("Could not send single signature during 'ready to sign → ready to sign' phase (current epoch {current_epoch:?})"), + message: format!("Could not compute and publish single signature during 'ready to sign → ready to sign' phase (current epoch {current_epoch:?})"), nested_error: Some(e) })?; self.runner.mark_beacon_as_signed(&beacon_to_sign).await @@ -722,18 +715,14 @@ mod tests { .expect_get_beacon_to_sign() .once() .returning(move || Ok(Some(beacon_to_sign_clone.clone()))); - runner - .expect_compute_single_signature() - .once() - .returning(|_| Ok(Some(fake_data::single_signatures(vec![1, 5, 23])))); runner .expect_compute_message() .once() .returning(|_| Ok(ProtocolMessage::new())); runner - .expect_send_single_signature() + .expect_compute_publish_single_signature() .once() - .returning(|_, _, _| Ok(())); + .returning(|_, _| Ok(())); runner .expect_mark_beacon_as_signed() .once() diff --git a/mithril-signer/src/services/aggregator_client.rs b/mithril-signer/src/services/aggregator_client.rs index e0d2fda1ba8..410b707d5be 100644 --- a/mithril-signer/src/services/aggregator_client.rs +++ b/mithril-signer/src/services/aggregator_client.rs @@ -11,13 +11,14 @@ use mithril_common::{ messages::{ AggregatorFeaturesMessage, EpochSettingsMessage, TryFromMessageAdapter, TryToMessageAdapter, }, - StdError, MITHRIL_API_VERSION_HEADER, MITHRIL_SIGNER_VERSION_HEADER, + StdError, StdResult, MITHRIL_API_VERSION_HEADER, MITHRIL_SIGNER_VERSION_HEADER, }; use crate::entities::SignerEpochSettings; use crate::message_adapters::{ FromEpochSettingsAdapter, ToRegisterSignatureMessageAdapter, ToRegisterSignerMessageAdapter, }; +use crate::services::SignaturePublisher; /// Error structure for the Aggregator Client. #[derive(Error, Debug)] @@ -97,6 +98,20 @@ pub trait AggregatorClient: Sync + Send { ) -> Result; } +#[async_trait] +impl SignaturePublisher for T { + async fn publish( + &self, + signed_entity_type: &SignedEntityType, + signatures: &SingleSignatures, + protocol_message: &ProtocolMessage, + ) -> StdResult<()> { + self.register_signatures(signed_entity_type, signatures, protocol_message) + .await?; + Ok(()) + } +} + /// AggregatorHTTPClient is a http client for an aggregator pub struct AggregatorHTTPClient { aggregator_endpoint: String, diff --git a/mithril-signer/src/services/certifier.rs b/mithril-signer/src/services/certifier.rs index 06b2e7977ec..44d680f527c 100644 --- a/mithril-signer/src/services/certifier.rs +++ b/mithril-signer/src/services/certifier.rs @@ -1,12 +1,16 @@ use async_trait::async_trait; use chrono::Utc; +use slog_scope::debug; use std::sync::Arc; -use mithril_common::entities::{SignedEntityConfig, SignedEntityType, TimePoint}; +use mithril_common::entities::{ + ProtocolMessage, SignedEntityConfig, SignedEntityType, SingleSignatures, TimePoint, +}; use mithril_common::signed_entity_type_lock::SignedEntityTypeLock; use mithril_common::{StdResult, TickerService}; use crate::entities::BeaconToSign; +use crate::services::SingleSigner; /// Certifier Service /// @@ -21,6 +25,13 @@ pub trait CertifierService: Sync + Send { /// Mark a beacon as signed so it won't be returned by `get_beacon_to_sign` anymore. async fn mark_beacon_as_signed(&self, signed_beacon: &BeaconToSign) -> StdResult<()>; + + /// Compute and publish a single signature for a given protocol message. + async fn compute_publish_single_signature( + &self, + beacon_to_sign: &BeaconToSign, + protocol_message: &ProtocolMessage, + ) -> StdResult<()>; } /// Trait to provide the current signed entity configuration that can change over time. @@ -45,12 +56,27 @@ pub trait SignedBeaconStore: Sync + Send { async fn mark_beacon_as_signed(&self, entity: &BeaconToSign) -> StdResult<()>; } +/// Publishes computed single signatures to a third party. +#[cfg_attr(test, mockall::automock)] +#[async_trait] +pub trait SignaturePublisher: Send + Sync { + /// Publish computed single signatures. + async fn publish( + &self, + signed_entity_type: &SignedEntityType, + signatures: &SingleSignatures, + protocol_message: &ProtocolMessage, + ) -> StdResult<()>; +} + /// Implementation of the [Certifier Service][CertifierService] for the Mithril Signer. pub struct SignerCertifierService { ticker_service: Arc, signed_beacon_store: Arc, signed_entity_config_provider: Arc, signed_entity_type_lock: Arc, + single_signer: Arc, + signature_publisher: Arc, } impl SignerCertifierService { @@ -60,12 +86,16 @@ impl SignerCertifierService { signed_beacon_store: Arc, signed_entity_config_provider: Arc, signed_entity_type_lock: Arc, + single_signer: Arc, + signature_publisher: Arc, ) -> Self { Self { ticker_service, signed_beacon_store, signed_entity_config_provider, signed_entity_type_lock, + single_signer, + signature_publisher, } } @@ -115,13 +145,44 @@ impl CertifierService for SignerCertifierService { .mark_beacon_as_signed(signed_beacon) .await } + + async fn compute_publish_single_signature( + &self, + beacon_to_sign: &BeaconToSign, + protocol_message: &ProtocolMessage, + ) -> StdResult<()> { + if let Some(single_signatures) = self + .single_signer + .compute_single_signatures(protocol_message) + .await? + { + debug!(" > there is a single signature to send"); + self.signature_publisher + .publish( + &beacon_to_sign.signed_entity_type, + &single_signatures, + protocol_message, + ) + .await?; + } else { + debug!(" > NO single signature to send, doing nothing"); + } + + Ok(()) + } } #[cfg(test)] mod tests { + use mockall::predicate::eq; + use mithril_common::entities::{ - CardanoTransactionsSigningConfig, ChainPoint, Epoch, SignedEntityTypeDiscriminants, + CardanoTransactionsSigningConfig, ChainPoint, Epoch, ProtocolMessagePartKey, + SignedEntityTypeDiscriminants, }; + use mithril_common::test_utils::fake_data; + + use crate::services::MockSingleSigner; use super::{tests::tests_tooling::*, *}; @@ -298,6 +359,86 @@ mod tests { ); } + #[tokio::test] + async fn compute_publish_single_signature_success_if_a_signature_was_issued() { + let protocol_message = { + let mut message = ProtocolMessage::new(); + message.set_message_part(ProtocolMessagePartKey::SnapshotDigest, "digest".to_string()); + message + }; + let beacon_to_sign = BeaconToSign::new( + Epoch(1), + SignedEntityType::MithrilStakeDistribution(Epoch(4)), + Utc::now(), + ); + + let certifier_service = SignerCertifierService { + single_signer: { + let mut single_signer = MockSingleSigner::new(); + single_signer + .expect_compute_single_signatures() + .with(eq(protocol_message.clone())) + .return_once(|_| Ok(Some(fake_data::single_signatures(vec![1, 5, 12])))); + Arc::new(single_signer) + }, + signature_publisher: { + let mut signature_publisher = MockSignaturePublisher::new(); + signature_publisher + .expect_publish() + .with( + eq(beacon_to_sign.signed_entity_type.clone()), + eq(fake_data::single_signatures(vec![1, 5, 12])), + eq(protocol_message.clone()), + ) + .returning(|_, _, _| Ok(())); + Arc::new(signature_publisher) + }, + ..SignerCertifierService::dumb_dependencies(TimePoint::new(1, 14, ChainPoint::dummy())) + }; + + certifier_service + .compute_publish_single_signature(&beacon_to_sign, &protocol_message) + .await + .expect("Single signature should be computed and published"); + } + + #[tokio::test] + async fn compute_publish_single_signature_success_but_dont_publish_if_no_signature_were_issued() + { + let protocol_message = { + let mut message = ProtocolMessage::new(); + message.set_message_part(ProtocolMessagePartKey::SnapshotDigest, "digest".to_string()); + message + }; + let beacon_to_sign = BeaconToSign::new( + Epoch(1), + SignedEntityType::MithrilStakeDistribution(Epoch(4)), + Utc::now(), + ); + + let certifier_service = SignerCertifierService { + single_signer: { + let mut single_signer = MockSingleSigner::new(); + single_signer + .expect_compute_single_signatures() + .with(eq(protocol_message.clone())) + .return_once(|_| Ok(None)); + Arc::new(single_signer) + }, + signature_publisher: { + let mut signature_publisher = MockSignaturePublisher::new(); + signature_publisher.expect_publish().never(); + Arc::new(signature_publisher) + }, + ..SignerCertifierService::dumb_dependencies(TimePoint::new(1, 14, ChainPoint::dummy())) + }; + + certifier_service + .compute_publish_single_signature(&beacon_to_sign, &protocol_message) + .await + .unwrap(); + } + pub mod tests_tooling { use std::collections::BTreeSet; use tokio::sync::RwLock; @@ -316,6 +457,8 @@ mod tests { SignedEntityTypeDiscriminants::all(), )), signed_entity_type_lock: Arc::new(SignedEntityTypeLock::new()), + single_signer: Arc::new(MockSingleSigner::new()), + signature_publisher: Arc::new(MockSignaturePublisher::new()), } } } diff --git a/mithril-signer/tests/test_extensions/state_machine_tester.rs b/mithril-signer/tests/test_extensions/state_machine_tester.rs index 6249f2ff25a..c4987ea8e69 100644 --- a/mithril-signer/tests/test_extensions/state_machine_tester.rs +++ b/mithril-signer/tests/test_extensions/state_machine_tester.rs @@ -262,6 +262,8 @@ impl StateMachineTester { epoch_service.clone(), )), signed_entity_type_lock.clone(), + single_signer.clone(), + certificate_handler.clone(), )); let services = SignerDependencyContainer { From 3681e2b996c904e4e95ccd74f3ef0700f7ea7007 Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Fri, 4 Oct 2024 18:42:38 +0200 Subject: [PATCH 180/274] refactor: simplify signer certifier api By removing `mark_beacon_as_signed` from its public api since the "compute/publish" signatures can now execute it directly. --- mithril-signer/src/runtime/runner.rs | 9 -- mithril-signer/src/runtime/state_machine.rs | 10 -- mithril-signer/src/services/certifier.rs | 140 ++++++++++++++------ 3 files changed, 98 insertions(+), 61 deletions(-) diff --git a/mithril-signer/src/runtime/runner.rs b/mithril-signer/src/runtime/runner.rs index 8852e8ab78e..d5b74701ee2 100644 --- a/mithril-signer/src/runtime/runner.rs +++ b/mithril-signer/src/runtime/runner.rs @@ -53,9 +53,6 @@ pub trait Runner: Send + Sync { message: &ProtocolMessage, ) -> StdResult<()>; - /// Mark the beacon as signed. - async fn mark_beacon_as_signed(&self, beacon: &BeaconToSign) -> StdResult<()>; - /// Read the current era and update the EraChecker. async fn update_era_checker(&self, epoch: Epoch) -> StdResult<()>; @@ -282,12 +279,6 @@ impl Runner for SignerRunner { .await } - async fn mark_beacon_as_signed(&self, beacon: &BeaconToSign) -> StdResult<()> { - debug!("RUNNER: mark_beacon_as_signed"; "beacon" => ?beacon); - - self.services.certifier.mark_beacon_as_signed(beacon).await - } - async fn update_era_checker(&self, epoch: Epoch) -> StdResult<()> { debug!("RUNNER: update_era_checker"); diff --git a/mithril-signer/src/runtime/state_machine.rs b/mithril-signer/src/runtime/state_machine.rs index 2b7cb6c0c7e..97db5699da2 100644 --- a/mithril-signer/src/runtime/state_machine.rs +++ b/mithril-signer/src/runtime/state_machine.rs @@ -381,11 +381,6 @@ impl StateMachine { message: format!("Could not compute and publish single signature during 'ready to sign → ready to sign' phase (current epoch {current_epoch:?})"), nested_error: Some(e) })?; - self.runner.mark_beacon_as_signed(&beacon_to_sign).await - .map_err(|e| RuntimeError::KeepState { - message: format!("Could not mark beacon as signed during 'ready to sign → ready to sign' phase (current epoch {current_epoch:?})"), - nested_error: Some(e) - })?; self.metrics_service .signature_registration_success_since_startup_counter_increment(); @@ -723,11 +718,6 @@ mod tests { .expect_compute_publish_single_signature() .once() .returning(|_, _| Ok(())); - runner - .expect_mark_beacon_as_signed() - .once() - .with(predicate::eq(beacon_to_sign)) - .returning(|_| Ok(())); let state_machine = init_state_machine( SignerState::ReadyToSign { diff --git a/mithril-signer/src/services/certifier.rs b/mithril-signer/src/services/certifier.rs index 44d680f527c..bc28971816a 100644 --- a/mithril-signer/src/services/certifier.rs +++ b/mithril-signer/src/services/certifier.rs @@ -23,9 +23,6 @@ pub trait CertifierService: Sync + Send { /// If all available signed entity have already been signed, `None` is returned. async fn get_beacon_to_sign(&self) -> StdResult>; - /// Mark a beacon as signed so it won't be returned by `get_beacon_to_sign` anymore. - async fn mark_beacon_as_signed(&self, signed_beacon: &BeaconToSign) -> StdResult<()>; - /// Compute and publish a single signature for a given protocol message. async fn compute_publish_single_signature( &self, @@ -140,12 +137,6 @@ impl CertifierService for SignerCertifierService { } } - async fn mark_beacon_as_signed(&self, signed_beacon: &BeaconToSign) -> StdResult<()> { - self.signed_beacon_store - .mark_beacon_as_signed(signed_beacon) - .await - } - async fn compute_publish_single_signature( &self, beacon_to_sign: &BeaconToSign, @@ -165,9 +156,14 @@ impl CertifierService for SignerCertifierService { ) .await?; } else { - debug!(" > NO single signature to send, doing nothing"); + debug!(" > NO single signature to send"); } + debug!(" > marking beacon as signed"; "beacon" => ?beacon_to_sign); + self.signed_beacon_store + .mark_beacon_as_signed(beacon_to_sign) + .await?; + Ok(()) } } @@ -230,38 +226,11 @@ mod tests { ); } - #[tokio::test] - async fn mark_beacon_as_signed_update_the_store() { - let signed_beacons_store = Arc::new(DumbSignedBeaconStore::default()); - let certifier_service = SignerCertifierService { - signed_beacon_store: signed_beacons_store.clone(), - signed_entity_config_provider: Arc::new(DumbSignedEntityConfigProvider::new( - CardanoTransactionsSigningConfig::dummy(), - SignedEntityTypeDiscriminants::all(), - )), - ..SignerCertifierService::dumb_dependencies(TimePoint::dummy()) - }; - - certifier_service - .mark_beacon_as_signed(&BeaconToSign { - epoch: Epoch(1), - signed_entity_type: SignedEntityType::MithrilStakeDistribution(Epoch(4)), - initiated_at: Utc::now(), - }) - .await - .unwrap(); - - let signed_beacons = signed_beacons_store.signed_beacons().await; - assert_eq!( - vec![SignedEntityType::MithrilStakeDistribution(Epoch(4))], - signed_beacons - ); - } - #[tokio::test] async fn if_already_signed_a_beacon_is_not_returned_anymore() { + let signed_beacon_store = Arc::new(DumbSignedBeaconStore::default()); let certifier_service = SignerCertifierService { - signed_beacon_store: Arc::new(DumbSignedBeaconStore::default()), + signed_beacon_store: signed_beacon_store.clone(), signed_entity_config_provider: Arc::new(DumbSignedEntityConfigProvider::new( CardanoTransactionsSigningConfig::dummy(), SignedEntityTypeDiscriminants::all(), @@ -274,7 +243,7 @@ mod tests { .await .unwrap() .unwrap(); - certifier_service + signed_beacon_store .mark_beacon_as_signed(&first_beacon_to_sign.clone()) .await .unwrap(); @@ -292,7 +261,9 @@ mod tests { #[tokio::test] async fn draining_out_all_beacons_to_sign_use_signed_entity_discriminant_order() { + let signed_beacon_store = Arc::new(DumbSignedBeaconStore::default()); let certifier_service = SignerCertifierService { + signed_beacon_store: signed_beacon_store.clone(), signed_entity_config_provider: Arc::new(DumbSignedEntityConfigProvider::new( CardanoTransactionsSigningConfig::dummy(), SignedEntityTypeDiscriminants::all(), @@ -307,7 +278,7 @@ mod tests { .expect("There should be a beacon to sign since nothing is locked or signed"); loop { - certifier_service + signed_beacon_store .mark_beacon_as_signed(&previous_beacon_to_sign) .await .unwrap(); @@ -330,7 +301,9 @@ mod tests { #[tokio::test] async fn draining_out_all_beacons_to_sign_doesnt_repeat_value() { + let signed_beacon_store = Arc::new(DumbSignedBeaconStore::default()); let certifier_service = SignerCertifierService { + signed_beacon_store: signed_beacon_store.clone(), signed_entity_config_provider: Arc::new(DumbSignedEntityConfigProvider::new( CardanoTransactionsSigningConfig::dummy(), SignedEntityTypeDiscriminants::all(), @@ -340,7 +313,7 @@ mod tests { let mut all_signed_beacons = vec![]; while let Some(beacon_to_sign) = certifier_service.get_beacon_to_sign().await.unwrap() { - certifier_service + signed_beacon_store .mark_beacon_as_signed(&beacon_to_sign) .await .unwrap(); @@ -372,6 +345,7 @@ mod tests { Utc::now(), ); + let signed_beacons_store = Arc::new(DumbSignedBeaconStore::default()); let certifier_service = SignerCertifierService { single_signer: { let mut single_signer = MockSingleSigner::new(); @@ -393,6 +367,7 @@ mod tests { .returning(|_, _, _| Ok(())); Arc::new(signature_publisher) }, + signed_beacon_store: signed_beacons_store.clone(), ..SignerCertifierService::dumb_dependencies(TimePoint::new(1, 14, ChainPoint::dummy())) }; @@ -400,6 +375,12 @@ mod tests { .compute_publish_single_signature(&beacon_to_sign, &protocol_message) .await .expect("Single signature should be computed and published"); + + let signed_beacons = signed_beacons_store.signed_beacons().await; + assert_eq!( + vec![beacon_to_sign.signed_entity_type.clone()], + signed_beacons + ); } #[tokio::test] @@ -416,6 +397,7 @@ mod tests { Utc::now(), ); + let signed_beacons_store = Arc::new(DumbSignedBeaconStore::default()); let certifier_service = SignerCertifierService { single_signer: { let mut single_signer = MockSingleSigner::new(); @@ -430,6 +412,7 @@ mod tests { signature_publisher.expect_publish().never(); Arc::new(signature_publisher) }, + signed_beacon_store: signed_beacons_store.clone(), ..SignerCertifierService::dumb_dependencies(TimePoint::new(1, 14, ChainPoint::dummy())) }; @@ -437,6 +420,79 @@ mod tests { .compute_publish_single_signature(&beacon_to_sign, &protocol_message) .await .unwrap(); + + let signed_beacons = signed_beacons_store.signed_beacons().await; + assert_eq!( + vec![beacon_to_sign.signed_entity_type.clone()], + signed_beacons + ); + } + + #[tokio::test] + async fn beacon_isnt_mark_as_signed_if_computing_signature_fails() { + let beacon_to_sign = BeaconToSign::new( + Epoch(1), + SignedEntityType::MithrilStakeDistribution(Epoch(4)), + Utc::now(), + ); + + let signed_beacons_store = Arc::new(DumbSignedBeaconStore::default()); + let certifier_service = SignerCertifierService { + single_signer: { + let mut single_signer = MockSingleSigner::new(); + single_signer + .expect_compute_single_signatures() + .return_once(|_| Err(anyhow::anyhow!("error"))); + Arc::new(single_signer) + }, + signed_beacon_store: signed_beacons_store.clone(), + ..SignerCertifierService::dumb_dependencies(TimePoint::new(1, 14, ChainPoint::dummy())) + }; + + certifier_service + .compute_publish_single_signature(&beacon_to_sign, &ProtocolMessage::new()) + .await + .unwrap_err(); + + let signed_beacons = signed_beacons_store.signed_beacons().await; + assert_eq!(Vec::::new(), signed_beacons); + } + + #[tokio::test] + async fn beacon_isnt_mark_as_signed_if_publishing_signature_fails() { + let beacon_to_sign = BeaconToSign::new( + Epoch(1), + SignedEntityType::MithrilStakeDistribution(Epoch(4)), + Utc::now(), + ); + + let signed_beacons_store = Arc::new(DumbSignedBeaconStore::default()); + let certifier_service = SignerCertifierService { + single_signer: { + let mut single_signer = MockSingleSigner::new(); + single_signer + .expect_compute_single_signatures() + .return_once(|_| Ok(Some(fake_data::single_signatures(vec![1, 5, 12])))); + Arc::new(single_signer) + }, + signature_publisher: { + let mut signature_publisher = MockSignaturePublisher::new(); + signature_publisher + .expect_publish() + .return_once(|_, _, _| Err(anyhow::anyhow!("error"))); + Arc::new(signature_publisher) + }, + signed_beacon_store: signed_beacons_store.clone(), + ..SignerCertifierService::dumb_dependencies(TimePoint::new(1, 14, ChainPoint::dummy())) + }; + + certifier_service + .compute_publish_single_signature(&beacon_to_sign, &ProtocolMessage::new()) + .await + .unwrap_err(); + + let signed_beacons = signed_beacons_store.signed_beacons().await; + assert_eq!(Vec::::new(), signed_beacons); } pub mod tests_tooling { From 7b59db8925f38f2e2aca3bfe2eb668d0757bc5a2 Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Mon, 7 Oct 2024 17:01:11 +0200 Subject: [PATCH 181/274] test: adjustements following PR reviews --- mithril-signer/src/services/epoch_service.rs | 164 +++++++++---------- 1 file changed, 74 insertions(+), 90 deletions(-) diff --git a/mithril-signer/src/services/epoch_service.rs b/mithril-signer/src/services/epoch_service.rs index 1c9bc69e669..f52227340c2 100644 --- a/mithril-signer/src/services/epoch_service.rs +++ b/mithril-signer/src/services/epoch_service.rs @@ -514,99 +514,83 @@ mod tests { .unwrap()); } - #[test] - fn signer_cant_sign_if_no_protocol_initializer_are_stored() { - let epoch = Epoch(12); - let fixtures = MithrilFixtureBuilder::default().with_signers(10).build(); - let stake_store = Arc::new(StakeStore::new(Box::new(DumbStoreAdapter::new()), None)); - let protocol_initializer_store = Arc::new(ProtocolInitializerStore::new( - Box::new(DumbStoreAdapter::new()), - None, - )); - - let epoch_service = MithrilEpochService::new(stake_store, protocol_initializer_store) - .set_data_to_default_or_fake(epoch) - .alter_data(|data| { - data.protocol_initializer = None; - data.current_signers = fixtures.signers(); - }); - - let can_sign_current_epoch = epoch_service - .can_signer_sign_current_epoch(fixtures.signers()[0].party_id.clone()) - .unwrap(); - assert!(!can_sign_current_epoch); - } - - #[test] - fn signer_cant_sign_if_it_dont_use_stored_protocol_initializer() { - let epoch = Epoch(12); - let fixtures = MithrilFixtureBuilder::default().with_signers(10).build(); - let stake_store = Arc::new(StakeStore::new(Box::new(DumbStoreAdapter::new()), None)); - let protocol_initializer_store = Arc::new(ProtocolInitializerStore::new( - Box::new(DumbStoreAdapter::new()), - None, - )); - - let epoch_service = MithrilEpochService::new(stake_store, protocol_initializer_store) - .set_data_to_default_or_fake(epoch) - .alter_data(|data| { - data.protocol_initializer = - Some(fixtures.signers_fixture()[2].protocol_initializer.clone()); - data.current_signers = fixtures.signers(); - }); - - let can_sign_current_epoch = epoch_service - .can_signer_sign_current_epoch(fixtures.signers()[0].party_id.clone()) - .unwrap(); - assert!(!can_sign_current_epoch); - } - - #[test] - fn signer_cant_sign_if_not_in_current_signers() { - let epoch = Epoch(12); - let fixtures = MithrilFixtureBuilder::default().with_signers(10).build(); - let stake_store = Arc::new(StakeStore::new(Box::new(DumbStoreAdapter::new()), None)); - let protocol_initializer_store = Arc::new(ProtocolInitializerStore::new( - Box::new(DumbStoreAdapter::new()), - None, - )); - - let epoch_service = MithrilEpochService::new(stake_store, protocol_initializer_store) - .set_data_to_default_or_fake(epoch) - .alter_data(|data| { - data.protocol_initializer = - Some(fixtures.signers_fixture()[0].protocol_initializer.clone()); - data.current_signers = fixtures.signers()[2..].to_vec(); - }); - - let can_sign_current_epoch = epoch_service - .can_signer_sign_current_epoch(fixtures.signers()[0].party_id.clone()) - .unwrap(); - assert!(!can_sign_current_epoch); - } + mod can_signer_sign_current_epoch { + use super::*; + + #[test] + fn cant_sign_if_no_protocol_initializer_are_stored() { + let epoch = Epoch(12); + let fixtures = MithrilFixtureBuilder::default().with_signers(10).build(); + + let epoch_service = MithrilEpochService::new_with_dumb_dependencies() + .set_data_to_default_or_fake(epoch) + .alter_data(|data| { + data.protocol_initializer = None; + data.current_signers = fixtures.signers(); + }); + + let can_sign_current_epoch = epoch_service + .can_signer_sign_current_epoch(fixtures.signers()[0].party_id.clone()) + .unwrap(); + assert!(!can_sign_current_epoch); + } - #[test] - fn signer_can_sign_if_in_current_signers_and_use_the_stored_protocol_initializer() { - let epoch = Epoch(12); - let fixtures = MithrilFixtureBuilder::default().with_signers(10).build(); - let stake_store = Arc::new(StakeStore::new(Box::new(DumbStoreAdapter::new()), None)); - let protocol_initializer_store = Arc::new(ProtocolInitializerStore::new( - Box::new(DumbStoreAdapter::new()), - None, - )); + #[test] + fn cant_sign_if_stored_protocol_initializer_belong_to_another_party() { + let epoch = Epoch(12); + let fixtures = MithrilFixtureBuilder::default().with_signers(10).build(); + + let epoch_service = MithrilEpochService::new_with_dumb_dependencies() + .set_data_to_default_or_fake(epoch) + .alter_data(|data| { + data.protocol_initializer = + Some(fixtures.signers_fixture()[2].protocol_initializer.clone()); + data.current_signers = fixtures.signers(); + }); + + let can_sign_current_epoch = epoch_service + .can_signer_sign_current_epoch(fixtures.signers()[0].party_id.clone()) + .unwrap(); + assert!(!can_sign_current_epoch); + } - let epoch_service = MithrilEpochService::new(stake_store, protocol_initializer_store) - .set_data_to_default_or_fake(epoch) - .alter_data(|data| { - data.protocol_initializer = - Some(fixtures.signers_fixture()[0].protocol_initializer.clone()); - data.current_signers = fixtures.signers(); - }); + #[test] + fn cant_sign_if_not_in_current_signers() { + let epoch = Epoch(12); + let fixtures = MithrilFixtureBuilder::default().with_signers(10).build(); + + let epoch_service = MithrilEpochService::new_with_dumb_dependencies() + .set_data_to_default_or_fake(epoch) + .alter_data(|data| { + data.protocol_initializer = + Some(fixtures.signers_fixture()[0].protocol_initializer.clone()); + data.current_signers = fixtures.signers()[2..].to_vec(); + }); + + let can_sign_current_epoch = epoch_service + .can_signer_sign_current_epoch(fixtures.signers()[0].party_id.clone()) + .unwrap(); + assert!(!can_sign_current_epoch); + } - let can_sign_current_epoch = epoch_service - .can_signer_sign_current_epoch(fixtures.signers()[0].party_id.clone()) - .unwrap(); - assert!(can_sign_current_epoch); + #[test] + fn can_sign_if_in_current_signers_and_use_the_stored_protocol_initializer() { + let epoch = Epoch(12); + let fixtures = MithrilFixtureBuilder::default().with_signers(10).build(); + + let epoch_service = MithrilEpochService::new_with_dumb_dependencies() + .set_data_to_default_or_fake(epoch) + .alter_data(|data| { + data.protocol_initializer = + Some(fixtures.signers_fixture()[0].protocol_initializer.clone()); + data.current_signers = fixtures.signers(); + }); + + let can_sign_current_epoch = epoch_service + .can_signer_sign_current_epoch(fixtures.signers()[0].party_id.clone()) + .unwrap(); + assert!(can_sign_current_epoch); + } } #[tokio::test] From ba1f77fcd1142776fc2e330bc5dce55b829e8982 Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Mon, 7 Oct 2024 17:03:27 +0200 Subject: [PATCH 182/274] style(test): reorder `MockEpochServiceImpl` to match trait definition + remove duplicate method comments. --- mithril-signer/src/services/epoch_service.rs | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/mithril-signer/src/services/epoch_service.rs b/mithril-signer/src/services/epoch_service.rs index f52227340c2..ae70f5235cb 100644 --- a/mithril-signer/src/services/epoch_service.rs +++ b/mithril-signer/src/services/epoch_service.rs @@ -364,43 +364,32 @@ pub mod mock_epoch_service { #[async_trait] impl EpochService for EpochServiceImpl { - /// Inform the service a new epoch has been detected, telling it to update its - /// internal state for the new epoch. async fn inform_epoch_settings( &mut self, epoch_settings: SignerEpochSettings, allowed_discriminants: BTreeSet, ) -> StdResult<()>; - /// Get the current epoch for which the data stored in this service are computed. fn epoch_of_current_data(&self) -> StdResult; - /// Get next protocol parameters used in next epoch (associated with the actual epoch) fn next_protocol_parameters(&self) -> StdResult<&'static ProtocolParameters>; fn protocol_initializer(&self) -> StdResult<&'static Option>; - /// Get signers for the current epoch fn current_signers(&self) -> StdResult<&'static Vec>; - /// Get signers for the next epoch fn next_signers(&self) -> StdResult<&'static Vec>; - /// Get the list of signed entity types that are allowed to sign for the current epoch - fn allowed_discriminants(&self) -> StdResult<&'static BTreeSet>; - - /// Get signers with stake for the current epoch async fn current_signers_with_stake(&self) -> StdResult>; - /// Get signers with stake for the next epoch async fn next_signers_with_stake(&self) -> StdResult>; - /// Get the cardano transactions signing configuration for the current epoch + fn allowed_discriminants(&self) -> StdResult<&'static BTreeSet>; + fn cardano_transactions_signing_config( &self, ) -> StdResult<&'static Option>; - /// Get the cardano transactions signing configuration for the next epoch fn next_cardano_transactions_signing_config( &self, ) -> StdResult<&'static Option>; From 8c8b8d25bdaf0f6f8d63471a3d4c8ba2e7d828f9 Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Mon, 7 Oct 2024 18:46:26 +0200 Subject: [PATCH 183/274] chore: upgrade crate versions * mithril-common from `0.4.63` to `0.4.64` * mithril-signer from `0.2.193` to `0.2.194` --- Cargo.lock | 4 ++-- mithril-common/Cargo.toml | 2 +- mithril-signer/Cargo.toml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c77995b9f87..f6dc8b60cc0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3559,7 +3559,7 @@ dependencies = [ [[package]] name = "mithril-common" -version = "0.4.63" +version = "0.4.64" dependencies = [ "anyhow", "async-trait", @@ -3703,7 +3703,7 @@ dependencies = [ [[package]] name = "mithril-signer" -version = "0.2.193" +version = "0.2.194" dependencies = [ "anyhow", "async-trait", diff --git a/mithril-common/Cargo.toml b/mithril-common/Cargo.toml index 5c41b8a1269..e9f4d168f2f 100644 --- a/mithril-common/Cargo.toml +++ b/mithril-common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-common" -version = "0.4.63" +version = "0.4.64" description = "Common types, interfaces, and utilities for Mithril nodes." authors = { workspace = true } edition = { workspace = true } diff --git a/mithril-signer/Cargo.toml b/mithril-signer/Cargo.toml index 743cf96f446..33fa2627175 100644 --- a/mithril-signer/Cargo.toml +++ b/mithril-signer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-signer" -version = "0.2.193" +version = "0.2.194" description = "A Mithril Signer" authors = { workspace = true } edition = { workspace = true } From a1ba1e4dd6b68b2234c595937c002768e6120a4f Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Mon, 7 Oct 2024 15:59:31 +0200 Subject: [PATCH 184/274] refactor: make epoch mandatory in `RegisterSignerMessage` This is non-breaking since the epoch is sent by all signers since version `0.2.36` released with distribution `2318` more than a year and half ago (no signers are running older versions anymore). --- .../src/http_server/routes/signer_routes.rs | 27 +--- .../src/messages/register_signer.rs | 123 ++++++++++++------ .../to_register_signer_message.rs | 2 +- .../src/stress_test/payload_builder.rs | 2 +- 4 files changed, 83 insertions(+), 71 deletions(-) diff --git a/mithril-aggregator/src/http_server/routes/signer_routes.rs b/mithril-aggregator/src/http_server/routes/signer_routes.rs index 6ff1c627165..262032a6378 100644 --- a/mithril-aggregator/src/http_server/routes/signer_routes.rs +++ b/mithril-aggregator/src/http_server/routes/signer_routes.rs @@ -91,17 +91,7 @@ mod handlers { "complete_message" => #?register_signer_message ); - let registration_epoch = match register_signer_message.epoch { - Some(epoch) => epoch, - None => match signer_registerer.get_current_round().await { - Some(round) => round.epoch, - None => { - let err = SignerRegistrationError::RegistrationRoundNotYetOpened; - warn!("register_signer::error"; "error" => ?err); - return Ok(reply::service_unavailable(err.to_string())); - } - }, - }; + let registration_epoch = register_signer_message.epoch; let signer = match FromRegisterSignerAdapter::try_adapt(register_signer_message) { Ok(signer) => signer, @@ -292,9 +282,6 @@ mod tests { mock_signer_registerer .expect_register_signer() .return_once(|_, _| Ok(signer_with_stake)); - mock_signer_registerer - .expect_get_current_round() - .return_once(|| None); let mut dependency_manager = initialize_dependencies().await; dependency_manager.signer_registerer = Arc::new(mock_signer_registerer); @@ -333,9 +320,6 @@ mod tests { signer_with_stake, ))) }); - mock_signer_registerer - .expect_get_current_round() - .return_once(|| None); let mut dependency_manager = initialize_dependencies().await; dependency_manager.signer_registerer = Arc::new(mock_signer_registerer); @@ -373,9 +357,6 @@ mod tests { ProtocolRegistrationError::OpCertInvalid ))) }); - mock_signer_registerer - .expect_get_current_round() - .return_once(|| None); let mut dependency_manager = initialize_dependencies().await; dependency_manager.signer_registerer = Arc::new(mock_signer_registerer); @@ -413,9 +394,6 @@ mod tests { "an error occurred".to_string(), )) }); - mock_signer_registerer - .expect_get_current_round() - .return_once(|| None); let mut dependency_manager = initialize_dependencies().await; dependency_manager.signer_registerer = Arc::new(mock_signer_registerer); @@ -448,9 +426,6 @@ mod tests { mock_signer_registerer .expect_register_signer() .return_once(|_, _| Err(SignerRegistrationError::RegistrationRoundNotYetOpened)); - mock_signer_registerer - .expect_get_current_round() - .return_once(|| None); let mut dependency_manager = initialize_dependencies().await; dependency_manager.signer_registerer = Arc::new(mock_signer_registerer); diff --git a/mithril-common/src/messages/register_signer.rs b/mithril-common/src/messages/register_signer.rs index 5835e9435e6..11b3f46b809 100644 --- a/mithril-common/src/messages/register_signer.rs +++ b/mithril-common/src/messages/register_signer.rs @@ -1,23 +1,16 @@ use serde::{Deserialize, Serialize}; use std::fmt::{Debug, Formatter}; -#[cfg(any(test, feature = "test_tools"))] -use crate::test_utils::fake_keys; -use crate::{ - crypto_helper::KESPeriod, - entities::{ - Epoch, HexEncodedOpCert, HexEncodedVerificationKey, HexEncodedVerificationKeySignature, - PartyId, - }, +use crate::crypto_helper::KESPeriod; +use crate::entities::{ + Epoch, HexEncodedOpCert, HexEncodedVerificationKey, HexEncodedVerificationKeySignature, PartyId, }; -era_deprecate!("make epoch of RegisterSignerMessage not optional"); /// Register Signer Message #[derive(Clone, PartialEq, Eq, Serialize, Deserialize)] pub struct RegisterSignerMessage { /// Epoch at which registration is sent - /// #[serde(skip_serializing_if = "Option::is_none")] - pub epoch: Option, + pub epoch: Epoch, /// The unique identifier of the signer // TODO: Should be removed once the signer certification is fully deployed @@ -51,8 +44,10 @@ impl RegisterSignerMessage { cfg_test_tools! { /// Return a dummy test entity (test-only). pub fn dummy() -> Self { + use crate::test_utils::fake_keys; + Self { - epoch: Some(Epoch(1)), + epoch: Epoch(1), party_id: "pool1m8crhnqj5k2kyszf5j2scshupystyxc887zdfrpzh6ty6eun4fx".to_string(), verification_key: fake_keys::signer_verification_key()[0].to_string(), verification_key_signature: Some( @@ -69,7 +64,9 @@ impl Debug for RegisterSignerMessage { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { let should_be_exhaustive = f.alternate(); let mut debug = f.debug_struct("Signer"); - debug.field("party_id", &self.party_id); + debug + .field("party_id", &self.party_id) + .field("epoch", &self.epoch); match should_be_exhaustive { true => debug @@ -96,10 +93,45 @@ impl Debug for RegisterSignerMessage { mod tests { use super::*; - // reference structure to compare with what should be deserialized. - fn golden_message_v1() -> RegisterSignerMessage { - RegisterSignerMessage { - epoch: None, + const ACTUAL_JSON: &str = r#"{ + "epoch": 123, + "party_id": "pool1m8crhnqj5k2kyszf5j2scshupystyxc887zdfrpzh6ty6eun4fx", + "verification_key": "7b22766b223a5b3134352c32332c3135382c31322c3138332c3230392c33322c3134302c33372c3132342c3136362c3231352c3136302c3231352c3235302c3133342c3135342c3235302c3234312c3230362c3139342c3232322c382c35392c33332c392c35382c322c3235312c31302c33322c3135352c3232372c3134332c3232362c35372c3135312c37342c3139392c3131372c37352c3136382c3134302c34362c3233392c3134352c37322c31362c32312c3138312c3139332c3134362c38362c3231332c3230342c3139332c3232332c32352c3135372c33342c33332c3232372c35312c3132362c3132362c3135362c36342c3232302c3139392c3231332c31362c34352c3131302c3234332c33352c3134382c37312c3231382c3132342c3132332c31362c3132312c3135322c31382c32362c3231322c3231342c3230312c3139302c3137342c3131352c39372c3234392c3235342c3131362c3234335d2c22706f70223a5b3138332c3134352c3133392c3234322c3132302c3136302c35362c3131382c3234322c3230342c39312c38392c32312c3138342c382c34372c3231332c3130352c36332c3135302c32312c3231372c352c382c3231392c3138382c3131342c3230352c3136362c31362c3234302c3234302c3231342c31362c3230342c3231382c3139332c3138312c32342c35362c34352c39392c3234342c38312c32352c35322c3232342c36372c3136382c3136392c3130392c3132322c38372c34392c3137302c3138312c3135312c31352c3235322c3139352c3231312c3233342c3139352c34392c39312c31392c35312c3234312c33332c35382c3134302c3235322c3234322c362c342c34302c32312c3136372c3234392c3235312c33362c38372c36302c39362c36392c3135322c3231302c39382c3136352c352c362c34312c39362c3233352c37352c3138335d7d", + "verification_key_signature": "7b227369676d61223a7b227369676d61223a7b227369676d61223a7b227369676d61223a7b227369676d61223a7b227369676d61223a5b33322c3235332c3134372c3132382c39302c3137372c31322c3231302c3232312c37332c31332c3234332c31302c36342c39322c3139322c3131342c3231302c3231372c3133312c3131322c3137322c3231362c3138372c38382c3138362c32372c31342c3134302c3230362c38312c3234332c3132342c3131342c3234362c3130342c35362c3131342c372c3131342c35372c3232392c3135362c32332c39342c32382c3137372c36302c3131302c34332c3136362c392c3139392c3233302c3133342c37302c3233322c3131362c3130302c36382c39342c3135332c3136342c31345d2c226c68735f706b223a5b3136332c3234362c39382c3232362c31302c36302c3131322c3234312c3136372c36322c3230302c3234382c39392c3133382c3136322c3137322c3137352c31332c3138392c392c302c3234392c34322c3232392c3231312c3230362c3235302c3136372c33382c36332c3138392c3134335d2c227268735f706b223a5b3137322c3138392c3138352c3233302c3234382c39342c3235312c3138312c3137392c38362c38342c32332c3137382c3230352c3232362c382c3233312c3230372c3231302c38332c36382c3231342c3231362c37342c3135362c3130322c32382c3233302c382c35322c3130312c3234355d7d2c226c68735f706b223a5b3134302c3230372c39382c3133362c3134312c3233312c3231352c3230342c35322c3135352c38392c3232332c34382c3134392c3138352c3135352c3131342c3235352c39332c3137352c3234332c37302c3137362c3134332c32342c3132352c32392c3231392c3135302c33362c3232352c33375d2c227268735f706b223a5b3137312c3232392c3139332c3130352c3233342c31382c3232392c38312c3235352c3139322c3133302c32352c33322c3138342c312c33392c39332c3138372c382c3233332c36392c37342c35362c3130312c37302c3231332c3232342c33322c31382c3130322c3235332c35355d7d2c226c68735f706b223a5b34322c302c31382c36382c3135332c3234312c3231342c3133352c3139342c34332c3231322c35382c36322c332c3136302c3133332c34342c37342c3131312c37382c3136322c3133322c35372c32362c3138392c36372c3132372c3232352c37352c3137312c31342c3131345d2c227268735f706b223a5b3133372c3135302c39302c3139362c3232322c3234312c3137392c3133372c3130362c33362c3130322c37322c35372c37312c3130392c3235302c392c33362c3134362c3234372c37342c3231362c31322c342c35322c33372c3233342c37302c3233342c37302c36362c34315d7d2c226c68735f706b223a5b3132312c3134352c3233352c3230392c3135322c39302c3135372c3231392c35312c34302c3136372c322c3137372c3138372c39372c3135332c3138392c3130392c3234392c38392c3231372c3135302c3139322c3131302c3232322c3138332c3134362c39392c3134352c35392c3132352c3132305d2c227268735f706b223a5b32362c38352c3137332c3235302c34382c36322c33382c3231392c39312c3138392c3136382c35322c3137392c34342c39332c39362c31362c3136392c38372c31302c3137302c312c3138392c322c3235352c3131312c3230342c3233372c3138312c3137342c31362c3231385d7d2c226c68735f706b223a5b372c37382c3233342c34362c32372c3234322c332c3234312c3231342c3131322c372c34302c3131372c39372c39332c3234322c3130342c3137302c39352c3138372c37382c3134312c3233382c35392c3231302c352c3133342c3234392c3231372c31302c3132312c33345d2c227268735f706b223a5b3134312c3130332c3232332c3233332c3230322c34302c3231352c3135362c3131342c36342c3231332c35392c3233332c33362c3234372c3132342c3130392c3138312c3230302c3136342c3232302c3230352c32392c3133332c3132302c3232342c3132312c3132362c36362c3235322c37312c3233325d7d2c226c68735f706b223a5b3134352c3139352c3234312c35332c3139392c3133362c33322c3235342c3131362c3132302c3137352c3232332c31382c37352c3134362c35312c3131362c3235332c3137342c3132312c3235342c3134302c3136392c33302c3135312c33332c3134392c3131342c3130322c3132332c3139302c33325d2c227268735f706b223a5b32362c3233332c3137382c3138372c3234342c33382c3138372c3132332c3133382c33312c34352c39382c37302c38322c3232392c39302c3137372c36352c3133332c3135372c39372c3233302c35302c37382c3134362c37302c3230322c3130312c35362c32302c3234372c3231375d7d", + "operational_certificate": "5b5b5b3230332c3130392c34302c32382c3235312c39342c35322c32342c3231322c3131362c3134392c38302c3138332c3136322c312c36322c352c3133332c35372c3230342c31352c3137322c3134372c38362c3132352c35392c31322c3235332c3130312c3138342c32332c31355d2c322c3132382c5b3133382c3131302c3139322c35302c38362c332c3136382c33342c3137322c31392c39312c3133392c3139302c3134302c31382c3137372c33312c34362c3132322c3130362c3233342c3137372c3130382c3232352c3230372c342c302c35392c3233372c3133352c3130342c39382c3133332c3133312c32392c3231322c3137312c3139342c3234342c3139312c3137392c3131392c34322c37352c3135302c36312c3232362c3132312c35342c3232332c3139332c3133382c3139302c32372c3138322c3135322c35362c32312c3136302c3230372c33352c3233372c3130322c31325d5d2c5b3230372c31322c3136382c3139302c34362c3131362c3139362c3133332c3139362c3233312c3132342c3235302c3134372c33372c3137352c3231312c3234372c3139382c3134302c3133392c3234362c3130342c3132342c3232372c34392c352c3235332c3232382c3130372c39332c3133362c3134345d5d", + "kes_period": 6 + }"#; + + // Supported structure until OpenAPI version 0.1.8. + #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] + pub struct RegisterSignerMessageUntilV0_1_8 { + pub party_id: PartyId, + pub verification_key: HexEncodedVerificationKey, + #[serde(skip_serializing_if = "Option::is_none")] + pub verification_key_signature: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub operational_certificate: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub kes_period: Option, + } + + // Supported structure until OpenAPI version 0.1.32. + #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] + pub struct RegisterSignerMessageUntilV0_1_32 { + #[serde(skip_serializing_if = "Option::is_none")] + pub epoch: Option, + pub party_id: PartyId, + pub verification_key: HexEncodedVerificationKey, + #[serde(skip_serializing_if = "Option::is_none")] + pub verification_key_signature: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub operational_certificate: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub kes_period: Option, + } + + fn golden_message_until_open_api_0_1_8() -> RegisterSignerMessageUntilV0_1_8 { + RegisterSignerMessageUntilV0_1_8 { party_id: "pool1m8crhnqj5k2kyszf5j2scshupystyxc887zdfrpzh6ty6eun4fx".to_string(), verification_key: "7b22766b223a5b3134352c32332c3135382c31322c3138332c3230392c33322c3134302c33372c3132342c3136362c3231352c3136302c3231352c3235302c3133342c3135342c3235302c3234312c3230362c3139342c3232322c382c35392c33332c392c35382c322c3235312c31302c33322c3135352c3232372c3134332c3232362c35372c3135312c37342c3139392c3131372c37352c3136382c3134302c34362c3233392c3134352c37322c31362c32312c3138312c3139332c3134362c38362c3231332c3230342c3139332c3232332c32352c3135372c33342c33332c3232372c35312c3132362c3132362c3135362c36342c3232302c3139392c3231332c31362c34352c3131302c3234332c33352c3134382c37312c3231382c3132342c3132332c31362c3132312c3135322c31382c32362c3231322c3231342c3230312c3139302c3137342c3131352c39372c3234392c3235342c3131362c3234335d2c22706f70223a5b3138332c3134352c3133392c3234322c3132302c3136302c35362c3131382c3234322c3230342c39312c38392c32312c3138342c382c34372c3231332c3130352c36332c3135302c32312c3231372c352c382c3231392c3138382c3131342c3230352c3136362c31362c3234302c3234302c3231342c31362c3230342c3231382c3139332c3138312c32342c35362c34352c39392c3234342c38312c32352c35322c3232342c36372c3136382c3136392c3130392c3132322c38372c34392c3137302c3138312c3135312c31352c3235322c3139352c3231312c3233342c3139352c34392c39312c31392c35312c3234312c33332c35382c3134302c3235322c3234322c362c342c34302c32312c3136372c3234392c3235312c33362c38372c36302c39362c36392c3135322c3231302c39382c3136352c352c362c34312c39362c3233352c37352c3138335d7d".to_string(), verification_key_signature: Some("7b227369676d61223a7b227369676d61223a7b227369676d61223a7b227369676d61223a7b227369676d61223a7b227369676d61223a5b33322c3235332c3134372c3132382c39302c3137372c31322c3231302c3232312c37332c31332c3234332c31302c36342c39322c3139322c3131342c3231302c3231372c3133312c3131322c3137322c3231362c3138372c38382c3138362c32372c31342c3134302c3230362c38312c3234332c3132342c3131342c3234362c3130342c35362c3131342c372c3131342c35372c3232392c3135362c32332c39342c32382c3137372c36302c3131302c34332c3136362c392c3139392c3233302c3133342c37302c3233322c3131362c3130302c36382c39342c3135332c3136342c31345d2c226c68735f706b223a5b3136332c3234362c39382c3232362c31302c36302c3131322c3234312c3136372c36322c3230302c3234382c39392c3133382c3136322c3137322c3137352c31332c3138392c392c302c3234392c34322c3232392c3231312c3230362c3235302c3136372c33382c36332c3138392c3134335d2c227268735f706b223a5b3137322c3138392c3138352c3233302c3234382c39342c3235312c3138312c3137392c38362c38342c32332c3137382c3230352c3232362c382c3233312c3230372c3231302c38332c36382c3231342c3231362c37342c3135362c3130322c32382c3233302c382c35322c3130312c3234355d7d2c226c68735f706b223a5b3134302c3230372c39382c3133362c3134312c3233312c3231352c3230342c35322c3135352c38392c3232332c34382c3134392c3138352c3135352c3131342c3235352c39332c3137352c3234332c37302c3137362c3134332c32342c3132352c32392c3231392c3135302c33362c3232352c33375d2c227268735f706b223a5b3137312c3232392c3139332c3130352c3233342c31382c3232392c38312c3235352c3139322c3133302c32352c33322c3138342c312c33392c39332c3138372c382c3233332c36392c37342c35362c3130312c37302c3231332c3232342c33322c31382c3130322c3235332c35355d7d2c226c68735f706b223a5b34322c302c31382c36382c3135332c3234312c3231342c3133352c3139342c34332c3231322c35382c36322c332c3136302c3133332c34342c37342c3131312c37382c3136322c3133322c35372c32362c3138392c36372c3132372c3232352c37352c3137312c31342c3131345d2c227268735f706b223a5b3133372c3135302c39302c3139362c3232322c3234312c3137392c3133372c3130362c33362c3130322c37322c35372c37312c3130392c3235302c392c33362c3134362c3234372c37342c3231362c31322c342c35322c33372c3233342c37302c3233342c37302c36362c34315d7d2c226c68735f706b223a5b3132312c3134352c3233352c3230392c3135322c39302c3135372c3231392c35312c34302c3136372c322c3137372c3138372c39372c3135332c3138392c3130392c3234392c38392c3231372c3135302c3139322c3131302c3232322c3138332c3134362c39392c3134352c35392c3132352c3132305d2c227268735f706b223a5b32362c38352c3137332c3235302c34382c36322c33382c3231392c39312c3138392c3136382c35322c3137392c34342c39332c39362c31362c3136392c38372c31302c3137302c312c3138392c322c3235352c3131312c3230342c3233372c3138312c3137342c31362c3231385d7d2c226c68735f706b223a5b372c37382c3233342c34362c32372c3234322c332c3234312c3231342c3131322c372c34302c3131372c39372c39332c3234322c3130342c3137302c39352c3138372c37382c3134312c3233382c35392c3231302c352c3133342c3234392c3231372c31302c3132312c33345d2c227268735f706b223a5b3134312c3130332c3232332c3233332c3230322c34302c3231352c3135362c3131342c36342c3231332c35392c3233332c33362c3234372c3132342c3130392c3138312c3230302c3136342c3232302c3230352c32392c3133332c3132302c3232342c3132312c3132362c36362c3235322c37312c3233325d7d2c226c68735f706b223a5b3134352c3139352c3234312c35332c3139392c3133362c33322c3235342c3131362c3132302c3137352c3232332c31382c37352c3134362c35312c3131362c3235332c3137342c3132312c3235342c3134302c3136392c33302c3135312c33332c3134392c3131342c3130322c3132332c3139302c33325d2c227268735f706b223a5b32362c3233332c3137382c3138372c3234342c33382c3138372c3132332c3133382c33312c34352c39382c37302c38322c3232392c39302c3137372c36352c3133332c3135372c39372c3233302c35302c37382c3134362c37302c3230322c3130312c35362c32302c3234372c3231375d7d".to_string()), @@ -108,9 +140,8 @@ mod tests { } } - // reference structure to compare with what should be deserialized. - fn golden_message_v2() -> RegisterSignerMessage { - RegisterSignerMessage { + fn golden_message_until_open_api_0_1_32() -> RegisterSignerMessageUntilV0_1_32 { + RegisterSignerMessageUntilV0_1_32 { epoch: Some(Epoch(123)), party_id: "pool1m8crhnqj5k2kyszf5j2scshupystyxc887zdfrpzh6ty6eun4fx".to_string(), verification_key: "7b22766b223a5b3134352c32332c3135382c31322c3138332c3230392c33322c3134302c33372c3132342c3136362c3231352c3136302c3231352c3235302c3133342c3135342c3235302c3234312c3230362c3139342c3232322c382c35392c33332c392c35382c322c3235312c31302c33322c3135352c3232372c3134332c3232362c35372c3135312c37342c3139392c3131372c37352c3136382c3134302c34362c3233392c3134352c37322c31362c32312c3138312c3139332c3134362c38362c3231332c3230342c3139332c3232332c32352c3135372c33342c33332c3232372c35312c3132362c3132362c3135362c36342c3232302c3139392c3231332c31362c34352c3131302c3234332c33352c3134382c37312c3231382c3132342c3132332c31362c3132312c3135322c31382c32362c3231322c3231342c3230312c3139302c3137342c3131352c39372c3234392c3235342c3131362c3234335d2c22706f70223a5b3138332c3134352c3133392c3234322c3132302c3136302c35362c3131382c3234322c3230342c39312c38392c32312c3138342c382c34372c3231332c3130352c36332c3135302c32312c3231372c352c382c3231392c3138382c3131342c3230352c3136362c31362c3234302c3234302c3231342c31362c3230342c3231382c3139332c3138312c32342c35362c34352c39392c3234342c38312c32352c35322c3232342c36372c3136382c3136392c3130392c3132322c38372c34392c3137302c3138312c3135312c31352c3235322c3139352c3231312c3233342c3139352c34392c39312c31392c35312c3234312c33332c35382c3134302c3235322c3234322c362c342c34302c32312c3136372c3234392c3235312c33362c38372c36302c39362c36392c3135322c3231302c39382c3136352c352c362c34312c39362c3233352c37352c3138335d7d".to_string(), @@ -120,38 +151,44 @@ mod tests { } } - // Test the retro compatibility with possible future upgrades. + fn golden_actual_message() -> RegisterSignerMessage { + RegisterSignerMessage { + epoch: Epoch(123), + party_id: "pool1m8crhnqj5k2kyszf5j2scshupystyxc887zdfrpzh6ty6eun4fx".to_string(), + verification_key: "7b22766b223a5b3134352c32332c3135382c31322c3138332c3230392c33322c3134302c33372c3132342c3136362c3231352c3136302c3231352c3235302c3133342c3135342c3235302c3234312c3230362c3139342c3232322c382c35392c33332c392c35382c322c3235312c31302c33322c3135352c3232372c3134332c3232362c35372c3135312c37342c3139392c3131372c37352c3136382c3134302c34362c3233392c3134352c37322c31362c32312c3138312c3139332c3134362c38362c3231332c3230342c3139332c3232332c32352c3135372c33342c33332c3232372c35312c3132362c3132362c3135362c36342c3232302c3139392c3231332c31362c34352c3131302c3234332c33352c3134382c37312c3231382c3132342c3132332c31362c3132312c3135322c31382c32362c3231322c3231342c3230312c3139302c3137342c3131352c39372c3234392c3235342c3131362c3234335d2c22706f70223a5b3138332c3134352c3133392c3234322c3132302c3136302c35362c3131382c3234322c3230342c39312c38392c32312c3138342c382c34372c3231332c3130352c36332c3135302c32312c3231372c352c382c3231392c3138382c3131342c3230352c3136362c31362c3234302c3234302c3231342c31362c3230342c3231382c3139332c3138312c32342c35362c34352c39392c3234342c38312c32352c35322c3232342c36372c3136382c3136392c3130392c3132322c38372c34392c3137302c3138312c3135312c31352c3235322c3139352c3231312c3233342c3139352c34392c39312c31392c35312c3234312c33332c35382c3134302c3235322c3234322c362c342c34302c32312c3136372c3234392c3235312c33362c38372c36302c39362c36392c3135322c3231302c39382c3136352c352c362c34312c39362c3233352c37352c3138335d7d".to_string(), + verification_key_signature: Some("7b227369676d61223a7b227369676d61223a7b227369676d61223a7b227369676d61223a7b227369676d61223a7b227369676d61223a5b33322c3235332c3134372c3132382c39302c3137372c31322c3231302c3232312c37332c31332c3234332c31302c36342c39322c3139322c3131342c3231302c3231372c3133312c3131322c3137322c3231362c3138372c38382c3138362c32372c31342c3134302c3230362c38312c3234332c3132342c3131342c3234362c3130342c35362c3131342c372c3131342c35372c3232392c3135362c32332c39342c32382c3137372c36302c3131302c34332c3136362c392c3139392c3233302c3133342c37302c3233322c3131362c3130302c36382c39342c3135332c3136342c31345d2c226c68735f706b223a5b3136332c3234362c39382c3232362c31302c36302c3131322c3234312c3136372c36322c3230302c3234382c39392c3133382c3136322c3137322c3137352c31332c3138392c392c302c3234392c34322c3232392c3231312c3230362c3235302c3136372c33382c36332c3138392c3134335d2c227268735f706b223a5b3137322c3138392c3138352c3233302c3234382c39342c3235312c3138312c3137392c38362c38342c32332c3137382c3230352c3232362c382c3233312c3230372c3231302c38332c36382c3231342c3231362c37342c3135362c3130322c32382c3233302c382c35322c3130312c3234355d7d2c226c68735f706b223a5b3134302c3230372c39382c3133362c3134312c3233312c3231352c3230342c35322c3135352c38392c3232332c34382c3134392c3138352c3135352c3131342c3235352c39332c3137352c3234332c37302c3137362c3134332c32342c3132352c32392c3231392c3135302c33362c3232352c33375d2c227268735f706b223a5b3137312c3232392c3139332c3130352c3233342c31382c3232392c38312c3235352c3139322c3133302c32352c33322c3138342c312c33392c39332c3138372c382c3233332c36392c37342c35362c3130312c37302c3231332c3232342c33322c31382c3130322c3235332c35355d7d2c226c68735f706b223a5b34322c302c31382c36382c3135332c3234312c3231342c3133352c3139342c34332c3231322c35382c36322c332c3136302c3133332c34342c37342c3131312c37382c3136322c3133322c35372c32362c3138392c36372c3132372c3232352c37352c3137312c31342c3131345d2c227268735f706b223a5b3133372c3135302c39302c3139362c3232322c3234312c3137392c3133372c3130362c33362c3130322c37322c35372c37312c3130392c3235302c392c33362c3134362c3234372c37342c3231362c31322c342c35322c33372c3233342c37302c3233342c37302c36362c34315d7d2c226c68735f706b223a5b3132312c3134352c3233352c3230392c3135322c39302c3135372c3231392c35312c34302c3136372c322c3137372c3138372c39372c3135332c3138392c3130392c3234392c38392c3231372c3135302c3139322c3131302c3232322c3138332c3134362c39392c3134352c35392c3132352c3132305d2c227268735f706b223a5b32362c38352c3137332c3235302c34382c36322c33382c3231392c39312c3138392c3136382c35322c3137392c34342c39332c39362c31362c3136392c38372c31302c3137302c312c3138392c322c3235352c3131312c3230342c3233372c3138312c3137342c31362c3231385d7d2c226c68735f706b223a5b372c37382c3233342c34362c32372c3234322c332c3234312c3231342c3131322c372c34302c3131372c39372c39332c3234322c3130342c3137302c39352c3138372c37382c3134312c3233382c35392c3231302c352c3133342c3234392c3231372c31302c3132312c33345d2c227268735f706b223a5b3134312c3130332c3232332c3233332c3230322c34302c3231352c3135362c3131342c36342c3231332c35392c3233332c33362c3234372c3132342c3130392c3138312c3230302c3136342c3232302c3230352c32392c3133332c3132302c3232342c3132312c3132362c36362c3235322c37312c3233325d7d2c226c68735f706b223a5b3134352c3139352c3234312c35332c3139392c3133362c33322c3235342c3131362c3132302c3137352c3232332c31382c37352c3134362c35312c3131362c3235332c3137342c3132312c3235342c3134302c3136392c33302c3135312c33332c3134392c3131342c3130322c3132332c3139302c33325d2c227268735f706b223a5b32362c3233332c3137382c3138372c3234342c33382c3138372c3132332c3133382c33312c34352c39382c37302c38322c3232392c39302c3137372c36352c3133332c3135372c39372c3233302c35302c37382c3134362c37302c3230322c3130312c35362c32302c3234372c3231375d7d".to_string()), + operational_certificate: Some("5b5b5b3230332c3130392c34302c32382c3235312c39342c35322c32342c3231322c3131362c3134392c38302c3138332c3136322c312c36322c352c3133332c35372c3230342c31352c3137322c3134372c38362c3132352c35392c31322c3235332c3130312c3138342c32332c31355d2c322c3132382c5b3133382c3131302c3139322c35302c38362c332c3136382c33342c3137322c31392c39312c3133392c3139302c3134302c31382c3137372c33312c34362c3132322c3130362c3233342c3137372c3130382c3232352c3230372c342c302c35392c3233372c3133352c3130342c39382c3133332c3133312c32392c3231322c3137312c3139342c3234342c3139312c3137392c3131392c34322c37352c3135302c36312c3232362c3132312c35342c3232332c3139332c3133382c3139302c32372c3138322c3135322c35362c32312c3136302c3230372c33352c3233372c3130322c31325d5d2c5b3230372c31322c3136382c3139302c34362c3131362c3139362c3133332c3139362c3233312c3132342c3235302c3134372c33372c3137352c3231312c3234372c3139382c3134302c3133392c3234362c3130342c3132342c3232372c34392c352c3235332c3232382c3130372c39332c3133362c3134345d5d".to_string()), + kes_period: Some(6), + } + } + #[test] - fn test_v1() { - let json = r#"{ -"party_id": "pool1m8crhnqj5k2kyszf5j2scshupystyxc887zdfrpzh6ty6eun4fx", -"verification_key": "7b22766b223a5b3134352c32332c3135382c31322c3138332c3230392c33322c3134302c33372c3132342c3136362c3231352c3136302c3231352c3235302c3133342c3135342c3235302c3234312c3230362c3139342c3232322c382c35392c33332c392c35382c322c3235312c31302c33322c3135352c3232372c3134332c3232362c35372c3135312c37342c3139392c3131372c37352c3136382c3134302c34362c3233392c3134352c37322c31362c32312c3138312c3139332c3134362c38362c3231332c3230342c3139332c3232332c32352c3135372c33342c33332c3232372c35312c3132362c3132362c3135362c36342c3232302c3139392c3231332c31362c34352c3131302c3234332c33352c3134382c37312c3231382c3132342c3132332c31362c3132312c3135322c31382c32362c3231322c3231342c3230312c3139302c3137342c3131352c39372c3234392c3235342c3131362c3234335d2c22706f70223a5b3138332c3134352c3133392c3234322c3132302c3136302c35362c3131382c3234322c3230342c39312c38392c32312c3138342c382c34372c3231332c3130352c36332c3135302c32312c3231372c352c382c3231392c3138382c3131342c3230352c3136362c31362c3234302c3234302c3231342c31362c3230342c3231382c3139332c3138312c32342c35362c34352c39392c3234342c38312c32352c35322c3232342c36372c3136382c3136392c3130392c3132322c38372c34392c3137302c3138312c3135312c31352c3235322c3139352c3231312c3233342c3139352c34392c39312c31392c35312c3234312c33332c35382c3134302c3235322c3234322c362c342c34302c32312c3136372c3234392c3235312c33362c38372c36302c39362c36392c3135322c3231302c39382c3136352c352c362c34312c39362c3233352c37352c3138335d7d", -"verification_key_signature": "7b227369676d61223a7b227369676d61223a7b227369676d61223a7b227369676d61223a7b227369676d61223a7b227369676d61223a5b33322c3235332c3134372c3132382c39302c3137372c31322c3231302c3232312c37332c31332c3234332c31302c36342c39322c3139322c3131342c3231302c3231372c3133312c3131322c3137322c3231362c3138372c38382c3138362c32372c31342c3134302c3230362c38312c3234332c3132342c3131342c3234362c3130342c35362c3131342c372c3131342c35372c3232392c3135362c32332c39342c32382c3137372c36302c3131302c34332c3136362c392c3139392c3233302c3133342c37302c3233322c3131362c3130302c36382c39342c3135332c3136342c31345d2c226c68735f706b223a5b3136332c3234362c39382c3232362c31302c36302c3131322c3234312c3136372c36322c3230302c3234382c39392c3133382c3136322c3137322c3137352c31332c3138392c392c302c3234392c34322c3232392c3231312c3230362c3235302c3136372c33382c36332c3138392c3134335d2c227268735f706b223a5b3137322c3138392c3138352c3233302c3234382c39342c3235312c3138312c3137392c38362c38342c32332c3137382c3230352c3232362c382c3233312c3230372c3231302c38332c36382c3231342c3231362c37342c3135362c3130322c32382c3233302c382c35322c3130312c3234355d7d2c226c68735f706b223a5b3134302c3230372c39382c3133362c3134312c3233312c3231352c3230342c35322c3135352c38392c3232332c34382c3134392c3138352c3135352c3131342c3235352c39332c3137352c3234332c37302c3137362c3134332c32342c3132352c32392c3231392c3135302c33362c3232352c33375d2c227268735f706b223a5b3137312c3232392c3139332c3130352c3233342c31382c3232392c38312c3235352c3139322c3133302c32352c33322c3138342c312c33392c39332c3138372c382c3233332c36392c37342c35362c3130312c37302c3231332c3232342c33322c31382c3130322c3235332c35355d7d2c226c68735f706b223a5b34322c302c31382c36382c3135332c3234312c3231342c3133352c3139342c34332c3231322c35382c36322c332c3136302c3133332c34342c37342c3131312c37382c3136322c3133322c35372c32362c3138392c36372c3132372c3232352c37352c3137312c31342c3131345d2c227268735f706b223a5b3133372c3135302c39302c3139362c3232322c3234312c3137392c3133372c3130362c33362c3130322c37322c35372c37312c3130392c3235302c392c33362c3134362c3234372c37342c3231362c31322c342c35322c33372c3233342c37302c3233342c37302c36362c34315d7d2c226c68735f706b223a5b3132312c3134352c3233352c3230392c3135322c39302c3135372c3231392c35312c34302c3136372c322c3137372c3138372c39372c3135332c3138392c3130392c3234392c38392c3231372c3135302c3139322c3131302c3232322c3138332c3134362c39392c3134352c35392c3132352c3132305d2c227268735f706b223a5b32362c38352c3137332c3235302c34382c36322c33382c3231392c39312c3138392c3136382c35322c3137392c34342c39332c39362c31362c3136392c38372c31302c3137302c312c3138392c322c3235352c3131312c3230342c3233372c3138312c3137342c31362c3231385d7d2c226c68735f706b223a5b372c37382c3233342c34362c32372c3234322c332c3234312c3231342c3131322c372c34302c3131372c39372c39332c3234322c3130342c3137302c39352c3138372c37382c3134312c3233382c35392c3231302c352c3133342c3234392c3231372c31302c3132312c33345d2c227268735f706b223a5b3134312c3130332c3232332c3233332c3230322c34302c3231352c3135362c3131342c36342c3231332c35392c3233332c33362c3234372c3132342c3130392c3138312c3230302c3136342c3232302c3230352c32392c3133332c3132302c3232342c3132312c3132362c36362c3235322c37312c3233325d7d2c226c68735f706b223a5b3134352c3139352c3234312c35332c3139392c3133362c33322c3235342c3131362c3132302c3137352c3232332c31382c37352c3134362c35312c3131362c3235332c3137342c3132312c3235342c3134302c3136392c33302c3135312c33332c3134392c3131342c3130322c3132332c3139302c33325d2c227268735f706b223a5b32362c3233332c3137382c3138372c3234342c33382c3138372c3132332c3133382c33312c34352c39382c37302c38322c3232392c39302c3137372c36352c3133332c3135372c39372c3233302c35302c37382c3134362c37302c3230322c3130312c35362c32302c3234372c3231375d7d", -"operational_certificate": "5b5b5b3230332c3130392c34302c32382c3235312c39342c35322c32342c3231322c3131362c3134392c38302c3138332c3136322c312c36322c352c3133332c35372c3230342c31352c3137322c3134372c38362c3132352c35392c31322c3235332c3130312c3138342c32332c31355d2c322c3132382c5b3133382c3131302c3139322c35302c38362c332c3136382c33342c3137322c31392c39312c3133392c3139302c3134302c31382c3137372c33312c34362c3132322c3130362c3233342c3137372c3130382c3232352c3230372c342c302c35392c3233372c3133352c3130342c39382c3133332c3133312c32392c3231322c3137312c3139342c3234342c3139312c3137392c3131392c34322c37352c3135302c36312c3232362c3132312c35342c3232332c3139332c3133382c3139302c32372c3138322c3135322c35362c32312c3136302c3230372c33352c3233372c3130322c31325d5d2c5b3230372c31322c3136382c3139302c34362c3131362c3139362c3133332c3139362c3233312c3132342c3235302c3134372c33372c3137352c3231312c3234372c3139382c3134302c3133392c3234362c3130342c3132342c3232372c34392c352c3235332c3232382c3130372c39332c3133362c3134345d5d", -"kes_period": 6 -}"#; - let message: RegisterSignerMessage = serde_json::from_str(json).expect( - "This JSON is expected to be successfully parsed into a RegisterSignerMessage instance.", + fn test_actual_json_deserialized_into_message_supported_until_open_api_0_1_8() { + let json = ACTUAL_JSON; + let message: RegisterSignerMessageUntilV0_1_8 = serde_json::from_str(json).expect( + "This JSON is expected to be successfully parsed into a RegisterSignerMessageUntilV0_1_8 instance.", + ); + + assert_eq!(golden_message_until_open_api_0_1_8(), message); + } + + #[test] + fn test_actual_json_deserialized_into_message_supported_until_open_api_0_1_32() { + let json = ACTUAL_JSON; + let message: RegisterSignerMessageUntilV0_1_32 = serde_json::from_str(json).expect( + "This JSON is expected to be successfully parsed into a RegisterSignerMessageUntilV0_1_32 instance.", ); - assert_eq!(golden_message_v1(), message); + assert_eq!(golden_message_until_open_api_0_1_32(), message); } - // Test the retro compatibility with possible future upgrades. #[test] - fn test_v2() { - let json = r#"{ -"epoch": 123, -"party_id": "pool1m8crhnqj5k2kyszf5j2scshupystyxc887zdfrpzh6ty6eun4fx", -"verification_key": "7b22766b223a5b3134352c32332c3135382c31322c3138332c3230392c33322c3134302c33372c3132342c3136362c3231352c3136302c3231352c3235302c3133342c3135342c3235302c3234312c3230362c3139342c3232322c382c35392c33332c392c35382c322c3235312c31302c33322c3135352c3232372c3134332c3232362c35372c3135312c37342c3139392c3131372c37352c3136382c3134302c34362c3233392c3134352c37322c31362c32312c3138312c3139332c3134362c38362c3231332c3230342c3139332c3232332c32352c3135372c33342c33332c3232372c35312c3132362c3132362c3135362c36342c3232302c3139392c3231332c31362c34352c3131302c3234332c33352c3134382c37312c3231382c3132342c3132332c31362c3132312c3135322c31382c32362c3231322c3231342c3230312c3139302c3137342c3131352c39372c3234392c3235342c3131362c3234335d2c22706f70223a5b3138332c3134352c3133392c3234322c3132302c3136302c35362c3131382c3234322c3230342c39312c38392c32312c3138342c382c34372c3231332c3130352c36332c3135302c32312c3231372c352c382c3231392c3138382c3131342c3230352c3136362c31362c3234302c3234302c3231342c31362c3230342c3231382c3139332c3138312c32342c35362c34352c39392c3234342c38312c32352c35322c3232342c36372c3136382c3136392c3130392c3132322c38372c34392c3137302c3138312c3135312c31352c3235322c3139352c3231312c3233342c3139352c34392c39312c31392c35312c3234312c33332c35382c3134302c3235322c3234322c362c342c34302c32312c3136372c3234392c3235312c33362c38372c36302c39362c36392c3135322c3231302c39382c3136352c352c362c34312c39362c3233352c37352c3138335d7d", -"verification_key_signature": "7b227369676d61223a7b227369676d61223a7b227369676d61223a7b227369676d61223a7b227369676d61223a7b227369676d61223a5b33322c3235332c3134372c3132382c39302c3137372c31322c3231302c3232312c37332c31332c3234332c31302c36342c39322c3139322c3131342c3231302c3231372c3133312c3131322c3137322c3231362c3138372c38382c3138362c32372c31342c3134302c3230362c38312c3234332c3132342c3131342c3234362c3130342c35362c3131342c372c3131342c35372c3232392c3135362c32332c39342c32382c3137372c36302c3131302c34332c3136362c392c3139392c3233302c3133342c37302c3233322c3131362c3130302c36382c39342c3135332c3136342c31345d2c226c68735f706b223a5b3136332c3234362c39382c3232362c31302c36302c3131322c3234312c3136372c36322c3230302c3234382c39392c3133382c3136322c3137322c3137352c31332c3138392c392c302c3234392c34322c3232392c3231312c3230362c3235302c3136372c33382c36332c3138392c3134335d2c227268735f706b223a5b3137322c3138392c3138352c3233302c3234382c39342c3235312c3138312c3137392c38362c38342c32332c3137382c3230352c3232362c382c3233312c3230372c3231302c38332c36382c3231342c3231362c37342c3135362c3130322c32382c3233302c382c35322c3130312c3234355d7d2c226c68735f706b223a5b3134302c3230372c39382c3133362c3134312c3233312c3231352c3230342c35322c3135352c38392c3232332c34382c3134392c3138352c3135352c3131342c3235352c39332c3137352c3234332c37302c3137362c3134332c32342c3132352c32392c3231392c3135302c33362c3232352c33375d2c227268735f706b223a5b3137312c3232392c3139332c3130352c3233342c31382c3232392c38312c3235352c3139322c3133302c32352c33322c3138342c312c33392c39332c3138372c382c3233332c36392c37342c35362c3130312c37302c3231332c3232342c33322c31382c3130322c3235332c35355d7d2c226c68735f706b223a5b34322c302c31382c36382c3135332c3234312c3231342c3133352c3139342c34332c3231322c35382c36322c332c3136302c3133332c34342c37342c3131312c37382c3136322c3133322c35372c32362c3138392c36372c3132372c3232352c37352c3137312c31342c3131345d2c227268735f706b223a5b3133372c3135302c39302c3139362c3232322c3234312c3137392c3133372c3130362c33362c3130322c37322c35372c37312c3130392c3235302c392c33362c3134362c3234372c37342c3231362c31322c342c35322c33372c3233342c37302c3233342c37302c36362c34315d7d2c226c68735f706b223a5b3132312c3134352c3233352c3230392c3135322c39302c3135372c3231392c35312c34302c3136372c322c3137372c3138372c39372c3135332c3138392c3130392c3234392c38392c3231372c3135302c3139322c3131302c3232322c3138332c3134362c39392c3134352c35392c3132352c3132305d2c227268735f706b223a5b32362c38352c3137332c3235302c34382c36322c33382c3231392c39312c3138392c3136382c35322c3137392c34342c39332c39362c31362c3136392c38372c31302c3137302c312c3138392c322c3235352c3131312c3230342c3233372c3138312c3137342c31362c3231385d7d2c226c68735f706b223a5b372c37382c3233342c34362c32372c3234322c332c3234312c3231342c3131322c372c34302c3131372c39372c39332c3234322c3130342c3137302c39352c3138372c37382c3134312c3233382c35392c3231302c352c3133342c3234392c3231372c31302c3132312c33345d2c227268735f706b223a5b3134312c3130332c3232332c3233332c3230322c34302c3231352c3135362c3131342c36342c3231332c35392c3233332c33362c3234372c3132342c3130392c3138312c3230302c3136342c3232302c3230352c32392c3133332c3132302c3232342c3132312c3132362c36362c3235322c37312c3233325d7d2c226c68735f706b223a5b3134352c3139352c3234312c35332c3139392c3133362c33322c3235342c3131362c3132302c3137352c3232332c31382c37352c3134362c35312c3131362c3235332c3137342c3132312c3235342c3134302c3136392c33302c3135312c33332c3134392c3131342c3130322c3132332c3139302c33325d2c227268735f706b223a5b32362c3233332c3137382c3138372c3234342c33382c3138372c3132332c3133382c33312c34352c39382c37302c38322c3232392c39302c3137372c36352c3133332c3135372c39372c3233302c35302c37382c3134362c37302c3230322c3130312c35362c32302c3234372c3231375d7d", -"operational_certificate": "5b5b5b3230332c3130392c34302c32382c3235312c39342c35322c32342c3231322c3131362c3134392c38302c3138332c3136322c312c36322c352c3133332c35372c3230342c31352c3137322c3134372c38362c3132352c35392c31322c3235332c3130312c3138342c32332c31355d2c322c3132382c5b3133382c3131302c3139322c35302c38362c332c3136382c33342c3137322c31392c39312c3133392c3139302c3134302c31382c3137372c33312c34362c3132322c3130362c3233342c3137372c3130382c3232352c3230372c342c302c35392c3233372c3133352c3130342c39382c3133332c3133312c32392c3231322c3137312c3139342c3234342c3139312c3137392c3131392c34322c37352c3135302c36312c3232362c3132312c35342c3232332c3139332c3133382c3139302c32372c3138322c3135322c35362c32312c3136302c3230372c33352c3233372c3130322c31325d5d2c5b3230372c31322c3136382c3139302c34362c3131362c3139362c3133332c3139362c3233312c3132342c3235302c3134372c33372c3137352c3231312c3234372c3139382c3134302c3133392c3234362c3130342c3132342c3232372c34392c352c3235332c3232382c3130372c39332c3133362c3134345d5d", -"kes_period": 6 -}"#; + fn test_actual_json_deserialized_into_actual_message() { + let json = ACTUAL_JSON; let message: RegisterSignerMessage = serde_json::from_str(json).expect( "This JSON is expected to be successfully parsed into a RegisterSignerMessage instance.", ); - assert_eq!(golden_message_v2(), message); + assert_eq!(golden_actual_message(), message); } } diff --git a/mithril-signer/src/message_adapters/to_register_signer_message.rs b/mithril-signer/src/message_adapters/to_register_signer_message.rs index 4e144ee6343..18836dded46 100644 --- a/mithril-signer/src/message_adapters/to_register_signer_message.rs +++ b/mithril-signer/src/message_adapters/to_register_signer_message.rs @@ -14,7 +14,7 @@ impl TryToMessageAdapter<(Epoch, Signer), RegisterSignerMessage> /// Method to trigger the conversion. fn try_adapt((epoch, signer): (Epoch, Signer)) -> StdResult { let message = RegisterSignerMessage { - epoch: Some(epoch), + epoch, party_id: signer.party_id, verification_key: signer.verification_key.try_into().with_context(|| { format!( diff --git a/mithril-test-lab/mithril-end-to-end/src/stress_test/payload_builder.rs b/mithril-test-lab/mithril-end-to-end/src/stress_test/payload_builder.rs index ce847989df8..b0044984c0e 100644 --- a/mithril-test-lab/mithril-end-to-end/src/stress_test/payload_builder.rs +++ b/mithril-test-lab/mithril-end-to-end/src/stress_test/payload_builder.rs @@ -32,7 +32,7 @@ pub fn generate_register_signer_message( .iter() .cloned() .map(|signer| RegisterSignerMessage { - epoch: Some(epoch), + epoch, party_id: signer.party_id, verification_key: signer.verification_key.to_json_hex().unwrap(), verification_key_signature: signer From 525751e11a53e1314589156cd1c551ea237a75a6 Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Tue, 8 Oct 2024 10:11:17 +0200 Subject: [PATCH 185/274] chore: upgrade crate versions * mithril-aggregator from `0.5.74` to `0.5.75` * mithril-common from `0.4.64` to `0.4.65` * mithril-signer from `0.2.194` to `0.2.195` * mithril-end-to-end from `0.4.34` to `0.4.35` --- Cargo.lock | 8 ++++---- mithril-aggregator/Cargo.toml | 2 +- mithril-common/Cargo.toml | 2 +- mithril-signer/Cargo.toml | 2 +- mithril-test-lab/mithril-end-to-end/Cargo.toml | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f6dc8b60cc0..1706b3e306a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3403,7 +3403,7 @@ dependencies = [ [[package]] name = "mithril-aggregator" -version = "0.5.74" +version = "0.5.75" dependencies = [ "anyhow", "async-trait", @@ -3559,7 +3559,7 @@ dependencies = [ [[package]] name = "mithril-common" -version = "0.4.64" +version = "0.4.65" dependencies = [ "anyhow", "async-trait", @@ -3630,7 +3630,7 @@ dependencies = [ [[package]] name = "mithril-end-to-end" -version = "0.4.34" +version = "0.4.35" dependencies = [ "anyhow", "async-recursion", @@ -3703,7 +3703,7 @@ dependencies = [ [[package]] name = "mithril-signer" -version = "0.2.194" +version = "0.2.195" dependencies = [ "anyhow", "async-trait", diff --git a/mithril-aggregator/Cargo.toml b/mithril-aggregator/Cargo.toml index e251bd15207..4a84a93467a 100644 --- a/mithril-aggregator/Cargo.toml +++ b/mithril-aggregator/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-aggregator" -version = "0.5.74" +version = "0.5.75" description = "A Mithril Aggregator server" authors = { workspace = true } edition = { workspace = true } diff --git a/mithril-common/Cargo.toml b/mithril-common/Cargo.toml index e9f4d168f2f..3f54e64486d 100644 --- a/mithril-common/Cargo.toml +++ b/mithril-common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-common" -version = "0.4.64" +version = "0.4.65" description = "Common types, interfaces, and utilities for Mithril nodes." authors = { workspace = true } edition = { workspace = true } diff --git a/mithril-signer/Cargo.toml b/mithril-signer/Cargo.toml index 33fa2627175..e26f012c561 100644 --- a/mithril-signer/Cargo.toml +++ b/mithril-signer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-signer" -version = "0.2.194" +version = "0.2.195" description = "A Mithril Signer" authors = { workspace = true } edition = { workspace = true } diff --git a/mithril-test-lab/mithril-end-to-end/Cargo.toml b/mithril-test-lab/mithril-end-to-end/Cargo.toml index 02571887bcf..dd429fe0a09 100644 --- a/mithril-test-lab/mithril-end-to-end/Cargo.toml +++ b/mithril-test-lab/mithril-end-to-end/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-end-to-end" -version = "0.4.34" +version = "0.4.35" authors = { workspace = true } edition = { workspace = true } documentation = { workspace = true } From 077b74d8a172059b1d07b0a16d7ebd44600b688e Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Mon, 7 Oct 2024 18:46:09 +0200 Subject: [PATCH 186/274] feat: sign current epoch in genesis certificate --- .../src/certificate_chain/certificate_genesis.rs | 15 ++++++++++++++- mithril-common/src/crypto_helper/tests_setup.rs | 4 +++- mithril-common/src/test_utils/mithril_fixture.rs | 1 + 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/mithril-common/src/certificate_chain/certificate_genesis.rs b/mithril-common/src/certificate_chain/certificate_genesis.rs index c1e7df45f8f..6da5b306ef9 100644 --- a/mithril-common/src/certificate_chain/certificate_genesis.rs +++ b/mithril-common/src/certificate_chain/certificate_genesis.rs @@ -43,6 +43,7 @@ impl CertificateGenesisProducer { pub fn create_genesis_protocol_message( genesis_protocol_parameters: &ProtocolParameters, genesis_avk: &ProtocolAggregateVerificationKey, + genesis_epoch: &Epoch, ) -> StdResult { let genesis_avk = genesis_avk.to_json_hex()?; let mut protocol_message = ProtocolMessage::new(); @@ -54,6 +55,10 @@ impl CertificateGenesisProducer { ProtocolMessagePartKey::NextProtocolParameters, genesis_protocol_parameters.compute_hash(), ); + protocol_message.set_message_part( + ProtocolMessagePartKey::CurrentEpoch, + genesis_epoch.to_string(), + ); Ok(protocol_message) } @@ -94,7 +99,7 @@ impl CertificateGenesisProducer { ); let previous_hash = "".to_string(); let genesis_protocol_message = - Self::create_genesis_protocol_message(&protocol_parameters, &genesis_avk)?; + Self::create_genesis_protocol_message(&protocol_parameters, &genesis_avk, &epoch)?; Ok(Certificate::new( previous_hash, epoch, @@ -117,9 +122,11 @@ mod tests { let fixture = MithrilFixtureBuilder::default().with_signers(5).build(); let genesis_protocol_parameters = fixture.protocol_parameters(); let genesis_avk = fixture.compute_avk(); + let genesis_epoch = Epoch(123); let protocol_message = CertificateGenesisProducer::create_genesis_protocol_message( &genesis_protocol_parameters, &genesis_avk, + &genesis_epoch, ) .unwrap(); @@ -135,5 +142,11 @@ mod tests { protocol_message.get_message_part(&ProtocolMessagePartKey::NextProtocolParameters), Some(&expected_genesis_protocol_parameters_value) ); + + let expected_genesis_epoch = genesis_epoch.to_string(); + assert_eq!( + protocol_message.get_message_part(&ProtocolMessagePartKey::CurrentEpoch), + Some(&expected_genesis_epoch) + ); } } diff --git a/mithril-common/src/crypto_helper/tests_setup.rs b/mithril-common/src/crypto_helper/tests_setup.rs index 040f9824cea..096d9813ffe 100644 --- a/mithril-common/src/crypto_helper/tests_setup.rs +++ b/mithril-common/src/crypto_helper/tests_setup.rs @@ -179,7 +179,8 @@ pub fn setup_certificate_chain( let genesis_verifier = genesis_signer.create_genesis_verifier(); let genesis_producer = CertificateGenesisProducer::new(Some(Arc::new(genesis_signer))); let protocol_parameters = setup_protocol_parameters(); - let mut epochs = (1..total_certificates + 2) + let genesis_epoch = Epoch(1); + let mut epochs = (genesis_epoch.0..total_certificates + 2) .map(|i| match certificates_per_epoch { 0 => panic!("expected at least 1 certificate per epoch"), 1 => Epoch(i), @@ -250,6 +251,7 @@ pub fn setup_certificate_chain( CertificateGenesisProducer::create_genesis_protocol_message( next_protocol_parameters, &next_avk, + &genesis_epoch, ) .unwrap(); let genesis_signature = genesis_producer diff --git a/mithril-common/src/test_utils/mithril_fixture.rs b/mithril-common/src/test_utils/mithril_fixture.rs index 9303b05c153..cdbc177b607 100644 --- a/mithril-common/src/test_utils/mithril_fixture.rs +++ b/mithril-common/src/test_utils/mithril_fixture.rs @@ -183,6 +183,7 @@ impl MithrilFixture { let genesis_protocol_message = CertificateGenesisProducer::create_genesis_protocol_message( &self.protocol_parameters, &genesis_avk, + &epoch, ) .unwrap(); let genesis_signature = genesis_producer From d2ce6efbbf5d25d990af52060e78c3b6d30794ec Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Mon, 7 Oct 2024 18:47:26 +0200 Subject: [PATCH 187/274] chore: update aggregator genesis tools to sign current epoch --- mithril-aggregator/src/tools/genesis.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mithril-aggregator/src/tools/genesis.rs b/mithril-aggregator/src/tools/genesis.rs index bdf93db1fff..de28c9a8f59 100644 --- a/mithril-aggregator/src/tools/genesis.rs +++ b/mithril-aggregator/src/tools/genesis.rs @@ -110,6 +110,7 @@ impl GenesisTools { let protocol_message = CertificateGenesisProducer::create_genesis_protocol_message( &self.genesis_protocol_parameters, &self.genesis_avk, + &self.time_point.epoch, )?; target_file.write_all(protocol_message.compute_hash().as_bytes())?; Ok(()) @@ -135,6 +136,7 @@ impl GenesisTools { let genesis_protocol_message = CertificateGenesisProducer::create_genesis_protocol_message( &self.genesis_protocol_parameters, &self.genesis_avk, + &self.time_point.epoch, )?; let genesis_signature = genesis_producer.sign_genesis_protocol_message(genesis_protocol_message)?; From 141e25af666584da9a6c040c17626291628849fc Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Tue, 8 Oct 2024 11:55:40 +0200 Subject: [PATCH 188/274] chore: bump crates versions - 'mithril-aggregator' from '0.5.75' to '0.5.76' - 'mithril-common' from '0.4.65' to '0.4.66'. --- Cargo.lock | 4 ++-- mithril-aggregator/Cargo.toml | 2 +- mithril-common/Cargo.toml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1706b3e306a..19bc664c7d6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3403,7 +3403,7 @@ dependencies = [ [[package]] name = "mithril-aggregator" -version = "0.5.75" +version = "0.5.76" dependencies = [ "anyhow", "async-trait", @@ -3559,7 +3559,7 @@ dependencies = [ [[package]] name = "mithril-common" -version = "0.4.65" +version = "0.4.66" dependencies = [ "anyhow", "async-trait", diff --git a/mithril-aggregator/Cargo.toml b/mithril-aggregator/Cargo.toml index 4a84a93467a..28919eee946 100644 --- a/mithril-aggregator/Cargo.toml +++ b/mithril-aggregator/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-aggregator" -version = "0.5.75" +version = "0.5.76" description = "A Mithril Aggregator server" authors = { workspace = true } edition = { workspace = true } diff --git a/mithril-common/Cargo.toml b/mithril-common/Cargo.toml index 3f54e64486d..51fa28491e9 100644 --- a/mithril-common/Cargo.toml +++ b/mithril-common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-common" -version = "0.4.65" +version = "0.4.66" description = "Common types, interfaces, and utilities for Mithril nodes." authors = { workspace = true } edition = { workspace = true } From 8500e600fa6745acb8068e50fcd3043d430d9649 Mon Sep 17 00:00:00 2001 From: Damien Lachaume <135982616+dlachaume@users.noreply.github.com> Date: Tue, 8 Oct 2024 16:53:54 +0200 Subject: [PATCH 189/274] feat: make stable in `mithril-client` --- mithril-client/src/aggregator_client.rs | 56 +++++++++++-------------- mithril-client/src/client.rs | 5 --- mithril-client/src/lib.rs | 2 +- mithril-client/src/message.rs | 23 +++++----- mithril-client/src/type_alias.rs | 32 +++++++------- 5 files changed, 53 insertions(+), 65 deletions(-) diff --git a/mithril-client/src/aggregator_client.rs b/mithril-client/src/aggregator_client.rs index a10cbd28393..fa604c65257 100644 --- a/mithril-client/src/aggregator_client.rs +++ b/mithril-client/src/aggregator_client.rs @@ -78,21 +78,18 @@ pub enum AggregatorRequest { }, /// Get proofs that the given set of Cardano transactions is included in the global Cardano transactions set - #[cfg(feature = "unstable")] GetTransactionsProofs { /// Hashes of the transactions to get proofs for. transactions_hashes: Vec, }, /// Get a specific [Cardano transaction snapshot][crate::CardanoTransactionSnapshot] - #[cfg(feature = "unstable")] GetCardanoTransactionSnapshot { /// Hash of the Cardano transaction snapshot to retrieve hash: String, }, /// Lists the aggregator [Cardano transaction snapshot][crate::CardanoTransactionSnapshot] - #[cfg(feature = "unstable")] ListCardanoTransactionSnapshots, /// Get a specific [Cardano stake distribution][crate::CardanoStakeDistribution] from the aggregator by hash @@ -135,18 +132,15 @@ impl AggregatorRequest { AggregatorRequest::IncrementSnapshotStatistic { snapshot: _ } => { "statistics/snapshot".to_string() } - #[cfg(feature = "unstable")] AggregatorRequest::GetTransactionsProofs { transactions_hashes, } => format!( "proof/cardano-transaction?transaction_hashes={}", transactions_hashes.join(",") ), - #[cfg(feature = "unstable")] AggregatorRequest::GetCardanoTransactionSnapshot { hash } => { format!("artifact/cardano-transaction/{hash}") } - #[cfg(feature = "unstable")] AggregatorRequest::ListCardanoTransactionSnapshots => { "artifact/cardano-transactions".to_string() } @@ -583,34 +577,34 @@ mod tests { .route() ); - #[cfg(feature = "unstable")] - { - assert_eq!( - "proof/cardano-transaction?transaction_hashes=abc,def,ghi,jkl".to_string(), - AggregatorRequest::GetTransactionsProofs { - transactions_hashes: vec![ - "abc".to_string(), - "def".to_string(), - "ghi".to_string(), - "jkl".to_string() - ] - } - .route() - ); + assert_eq!( + "proof/cardano-transaction?transaction_hashes=abc,def,ghi,jkl".to_string(), + AggregatorRequest::GetTransactionsProofs { + transactions_hashes: vec![ + "abc".to_string(), + "def".to_string(), + "ghi".to_string(), + "jkl".to_string() + ] + } + .route() + ); - assert_eq!( - "artifact/cardano-transaction/abc".to_string(), - AggregatorRequest::GetCardanoTransactionSnapshot { - hash: "abc".to_string() - } - .route() - ); + assert_eq!( + "artifact/cardano-transaction/abc".to_string(), + AggregatorRequest::GetCardanoTransactionSnapshot { + hash: "abc".to_string() + } + .route() + ); - assert_eq!( - "artifact/cardano-transactions".to_string(), - AggregatorRequest::ListCardanoTransactionSnapshots.route() - ); + assert_eq!( + "artifact/cardano-transactions".to_string(), + AggregatorRequest::ListCardanoTransactionSnapshots.route() + ); + #[cfg(feature = "unstable")] + { assert_eq!( "artifact/cardano-stake-distribution/abc".to_string(), AggregatorRequest::GetCardanoStakeDistribution { diff --git a/mithril-client/src/client.rs b/mithril-client/src/client.rs index 25ee3e3f113..362959ae729 100644 --- a/mithril-client/src/client.rs +++ b/mithril-client/src/client.rs @@ -10,7 +10,6 @@ use mithril_common::api_version::APIVersionProvider; use crate::aggregator_client::{AggregatorClient, AggregatorHTTPClient}; #[cfg(feature = "unstable")] use crate::cardano_stake_distribution_client::CardanoStakeDistributionClient; -#[cfg(feature = "unstable")] use crate::cardano_transaction_client::CardanoTransactionClient; use crate::certificate_client::{ CertificateClient, CertificateVerifier, MithrilCertificateVerifier, @@ -56,7 +55,6 @@ impl ClientOptions { /// Use the [ClientBuilder] to instantiate it easily. #[derive(Clone)] pub struct Client { - #[cfg(feature = "unstable")] cardano_transaction_client: Arc, #[cfg(feature = "unstable")] cardano_stake_distribution_client: Arc, @@ -67,7 +65,6 @@ pub struct Client { impl Client { /// Get the client that fetches and verifies Mithril Cardano transaction proof. - #[cfg(feature = "unstable")] pub fn cardano_transaction(&self) -> Arc { self.cardano_transaction_client.clone() } @@ -185,7 +182,6 @@ impl ClientBuilder { Some(snapshot_downloader) => snapshot_downloader, }; - #[cfg(feature = "unstable")] let cardano_transaction_client = Arc::new(CardanoTransactionClient::new(aggregator_client.clone())); @@ -225,7 +221,6 @@ impl ClientBuilder { Arc::new(CardanoStakeDistributionClient::new(aggregator_client)); Ok(Client { - #[cfg(feature = "unstable")] cardano_transaction_client, #[cfg(feature = "unstable")] cardano_stake_distribution_client, diff --git a/mithril-client/src/lib.rs b/mithril-client/src/lib.rs index 39d7e251492..bef7766bf59 100644 --- a/mithril-client/src/lib.rs +++ b/mithril-client/src/lib.rs @@ -85,8 +85,8 @@ macro_rules! cfg_unstable { pub mod aggregator_client; cfg_unstable! { pub mod cardano_stake_distribution_client; - pub mod cardano_transaction_client; } +pub mod cardano_transaction_client; pub mod certificate_client; mod client; pub mod feedback; diff --git a/mithril-client/src/message.rs b/mithril-client/src/message.rs index 8e2fea173b1..8e0014f7920 100644 --- a/mithril-client/src/message.rs +++ b/mithril-client/src/message.rs @@ -17,7 +17,6 @@ use crate::common::{ProtocolMessage, ProtocolMessagePartKey}; #[cfg(feature = "unstable")] use crate::CardanoStakeDistribution; use crate::MithrilCertificate; -#[cfg(feature = "unstable")] use crate::VerifiedCardanoTransactions; use crate::{MithrilResult, MithrilSigner, MithrilStakeDistribution}; @@ -131,18 +130,18 @@ impl MessageBuilder { Ok(message) } - cfg_unstable! { - /// Compute message for a Cardano Transactions Proofs. - pub fn compute_cardano_transactions_proofs_message( - &self, - transactions_proofs_certificate: &MithrilCertificate, - verified_transactions: &VerifiedCardanoTransactions, - ) -> ProtocolMessage { - let mut message = transactions_proofs_certificate.protocol_message.clone(); - verified_transactions.fill_protocol_message(&mut message); - message - } + /// Compute message for a Cardano Transactions Proofs. + pub fn compute_cardano_transactions_proofs_message( + &self, + transactions_proofs_certificate: &MithrilCertificate, + verified_transactions: &VerifiedCardanoTransactions, + ) -> ProtocolMessage { + let mut message = transactions_proofs_certificate.protocol_message.clone(); + verified_transactions.fill_protocol_message(&mut message); + message + } + cfg_unstable! { /// Compute message for a Cardano stake distribution. pub fn compute_cardano_stake_distribution_message( &self, diff --git a/mithril-client/src/type_alias.rs b/mithril-client/src/type_alias.rs index 7b02fdd3220..3e5f2b6fa53 100644 --- a/mithril-client/src/type_alias.rs +++ b/mithril-client/src/type_alias.rs @@ -36,36 +36,36 @@ pub use mithril_common::messages::CertificateListItemMessageMetadata as MithrilC /// pub use mithril_common::messages::SignerWithStakeMessagePart as MithrilSigner; -cfg_unstable! { - /// A Cardano stake distribution. - pub use mithril_common::messages::CardanoStakeDistributionMessage as CardanoStakeDistribution; +pub use mithril_common::messages::CardanoTransactionsProofsMessage as CardanoTransactionsProofs; - /// List item of Cardano stake distributions. - pub use mithril_common::messages::CardanoStakeDistributionListItemMessage as CardanoStakeDistributionListItem; +pub use mithril_common::messages::CardanoTransactionsSetProofMessagePart as CardanoTransactionsSetProof; - pub use mithril_common::messages::CardanoTransactionsProofsMessage as CardanoTransactionsProofs; +pub use mithril_common::messages::VerifiedCardanoTransactions; - pub use mithril_common::messages::CardanoTransactionsSetProofMessagePart as CardanoTransactionsSetProof; +pub use mithril_common::messages::VerifyCardanoTransactionsProofsError; - pub use mithril_common::messages::VerifiedCardanoTransactions; +/// A snapshot that allow to know up to which [point of time][common::CardanoDbBeacon] Mithril have certified Cardano transactions. +pub use mithril_common::messages::CardanoTransactionSnapshotMessage as CardanoTransactionSnapshot; - pub use mithril_common::messages::VerifyCardanoTransactionsProofsError; +/// List item of a Cardano transaction snapshot. +pub use mithril_common::messages::CardanoTransactionSnapshotListItemMessage as CardanoTransactionSnapshotListItem; - /// A snapshot that allow to know up to which [point of time][common::CardanoDbBeacon] Mithril have certified Cardano transactions. - pub use mithril_common::messages::CardanoTransactionSnapshotMessage as CardanoTransactionSnapshot; +cfg_unstable! { + /// A Cardano stake distribution. + pub use mithril_common::messages::CardanoStakeDistributionMessage as CardanoStakeDistribution; - /// List item of a Cardano transaction snapshot. - pub use mithril_common::messages::CardanoTransactionSnapshotListItemMessage as CardanoTransactionSnapshotListItem; + /// List item of Cardano stake distributions. + pub use mithril_common::messages::CardanoStakeDistributionListItemMessage as CardanoStakeDistributionListItem; } /// `mithril-common` re-exports pub mod common { pub use mithril_common::entities::{ - CardanoDbBeacon, CompressionAlgorithm, Epoch, ImmutableFileNumber, ProtocolMessage, - ProtocolMessagePartKey, ProtocolParameters, + BlockHash, BlockNumber, CardanoDbBeacon, ChainPoint, CompressionAlgorithm, Epoch, + ImmutableFileNumber, ProtocolMessage, ProtocolMessagePartKey, ProtocolParameters, + SlotNumber, TransactionHash, }; cfg_unstable! { - pub use mithril_common::entities::{ChainPoint, TransactionHash, SlotNumber, BlockHash, BlockNumber}; pub use mithril_common::entities::{StakeDistribution}; } } From f5691c13a98a2d9d59469b5cefc29add67fc8a77 Mon Sep 17 00:00:00 2001 From: Damien Lachaume <135982616+dlachaume@users.noreply.github.com> Date: Tue, 8 Oct 2024 17:06:01 +0200 Subject: [PATCH 190/274] feat: make stable in `mithril-client-cli` --- .../src/commands/cardano_transaction/mod.rs | 2 +- mithril-client-cli/src/main.rs | 29 ++----------------- 2 files changed, 3 insertions(+), 28 deletions(-) diff --git a/mithril-client-cli/src/commands/cardano_transaction/mod.rs b/mithril-client-cli/src/commands/cardano_transaction/mod.rs index 69f558e2664..9277ec06672 100644 --- a/mithril-client-cli/src/commands/cardano_transaction/mod.rs +++ b/mithril-client-cli/src/commands/cardano_transaction/mod.rs @@ -14,7 +14,7 @@ use mithril_client::MithrilResult; /// Cardano transactions management #[derive(Subcommand, Debug, Clone)] -#[command(about = "[unstable] Cardano transactions management (alias: ctx)")] +#[command(about = "Cardano transactions management (alias: ctx)")] pub enum CardanoTransactionCommands { /// Cardano transaction snapshot commands #[clap(subcommand)] diff --git a/mithril-client-cli/src/main.rs b/mithril-client-cli/src/main.rs index e4ee21b58e7..458ff871054 100644 --- a/mithril-client-cli/src/main.rs +++ b/mithril-client-cli/src/main.rs @@ -79,7 +79,7 @@ pub struct Args { #[example = "`./mithril-client.log`"] log_output: Option, - /// Enable unstable commands (such as Cardano Transactions) + /// Enable unstable commands (such as Cardano Stake Distribution) #[clap(long)] unstable: bool, } @@ -207,16 +207,7 @@ impl ArtifactCommands { match self { Self::CardanoDb(cmd) => cmd.execute(config_builder).await, Self::MithrilStakeDistribution(cmd) => cmd.execute(config_builder).await, - Self::CardanoTransaction(cmd) => { - if !unstable_enabled { - Err(anyhow!(Self::unstable_flag_missing_message( - "cardano-transaction", - "snapshot list" - ))) - } else { - cmd.execute(config_builder).await - } - } + Self::CardanoTransaction(cmd) => cmd.execute(config_builder).await, Self::CardanoStakeDistribution(cmd) => { if !unstable_enabled { Err(anyhow!(Self::unstable_flag_missing_message( @@ -263,22 +254,6 @@ async fn main() -> MithrilResult<()> { mod tests { use super::*; - #[tokio::test] - async fn fail_if_cardano_tx_command_is_used_without_unstable_flag() { - let args = - Args::try_parse_from(["mithril-client", "cardano-transaction", "snapshot", "list"]) - .unwrap(); - - let error = args - .execute() - .await - .expect_err("Should fail if unstable flag missing"); - - assert!(error - .to_string() - .contains("subcommand is only accepted using the --unstable flag.")); - } - #[tokio::test] async fn fail_if_cardano_stake_distribution_command_is_used_without_unstable_flag() { let args = From ecf74577a39cd09ae1d9708a76dbd00b5b3c8d5b Mon Sep 17 00:00:00 2001 From: Damien Lachaume <135982616+dlachaume@users.noreply.github.com> Date: Tue, 8 Oct 2024 17:17:43 +0200 Subject: [PATCH 191/274] feat: make stable in `mithril-client-wasm` --- mithril-client-wasm/src/client_wasm.rs | 48 +++++++++----------------- 1 file changed, 16 insertions(+), 32 deletions(-) diff --git a/mithril-client-wasm/src/client_wasm.rs b/mithril-client-wasm/src/client_wasm.rs index 5ab6c224947..eccfaa78043 100644 --- a/mithril-client-wasm/src/client_wasm.rs +++ b/mithril-client-wasm/src/client_wasm.rs @@ -222,26 +222,10 @@ impl MithrilClient { Ok(serde_wasm_bindgen::to_value(&result)?) } -} - -// Unstable functions are only available when the unstable flag is set -#[wasm_bindgen] -impl MithrilClient { - fn guard_unstable(&self) -> Result<(), wasm_bindgen::JsValue> { - if !self.unstable { - return Err(JsValue::from_str("Unstable functions are not enabled. Set the 'unstable' client option field to 'true' to enable them.")); - } - - Ok(()) - } /// Call the client for the list of available Cardano transactions snapshots - /// - /// Warning: this function is unstable and may be modified in the future #[wasm_bindgen] pub async fn list_cardano_transactions_snapshots(&self) -> WasmResult { - self.guard_unstable()?; - let result = self .client .cardano_transaction() @@ -253,12 +237,8 @@ impl MithrilClient { } /// Call the client to get a Cardano transactions snapshot from a hash - /// - /// Warning: this function is unstable and may be modified in the future #[wasm_bindgen] pub async fn get_cardano_transactions_snapshot(&self, hash: &str) -> WasmResult { - self.guard_unstable()?; - let result = self .client .cardano_transaction() @@ -273,15 +253,11 @@ impl MithrilClient { } /// Call the client to get a Cardano transactions proofs - /// - /// Warning: this function is unstable and may be modified in the future #[wasm_bindgen] pub async fn get_cardano_transaction_proofs( &self, ctx_hashes: Box<[JsValue]>, ) -> Result { - self.guard_unstable()?; - let hashes = ctx_hashes .iter() .map(|h| { @@ -303,16 +279,12 @@ impl MithrilClient { } /// Call the client to verify a cardano transaction proof and compute a message - /// - /// Warning: this function is unstable and may be modified in the future #[wasm_bindgen] pub async fn verify_cardano_transaction_proof_then_compute_message( &self, cardano_transaction_proof: &CardanoTransactionsProofs, certificate: JsValue, ) -> WasmResult { - self.guard_unstable()?; - let certificate: MithrilCertificate = serde_wasm_bindgen::from_value(certificate).map_err(|err| format!("{err:?}"))?; let verified_proof = cardano_transaction_proof @@ -323,6 +295,18 @@ impl MithrilClient { Ok(serde_wasm_bindgen::to_value(&result)?) } +} + +// Unstable functions are only available when the unstable flag is set +#[wasm_bindgen] +impl MithrilClient { + fn guard_unstable(&self) -> Result<(), wasm_bindgen::JsValue> { + if !self.unstable { + return Err(JsValue::from_str("Unstable functions are not enabled. Set the 'unstable' client option field to 'true' to enable them.")); + } + + Ok(()) + } /// Call the client to get a cardano stake distribution from a hash /// @@ -673,7 +657,7 @@ mod tests { #[wasm_bindgen_test] async fn list_cardano_transactions_snapshots_should_return_value_convertible_in_rust_type() { - let cardano_tx_sets_js_value = get_mithril_client_unstable() + let cardano_tx_sets_js_value = get_mithril_client_stable() .list_cardano_transactions_snapshots() .await .expect("list_cardano_transactions_snapshots should not fail"); @@ -691,7 +675,7 @@ mod tests { #[wasm_bindgen_test] async fn get_cardano_transactions_snapshot_should_return_value_convertible_in_rust_type() { - let cardano_tx_set_js_value = get_mithril_client_unstable() + let cardano_tx_set_js_value = get_mithril_client_stable() .get_cardano_transactions_snapshot(test_data::ctx_snapshot_hashes()[0]) .await .expect("get_cardano_transactions_snapshot should not fail"); @@ -704,7 +688,7 @@ mod tests { #[wasm_bindgen_test] async fn get_cardano_transactions_snapshot_should_fail_with_unknown_digest() { - get_mithril_client_unstable() + get_mithril_client_stable() .get_cardano_transactions_snapshot("whatever") .await .expect_err("get_cardano_transactions_snapshot should fail"); @@ -714,7 +698,7 @@ mod tests { async fn get_cardano_transaction_proofs_should_return_value_convertible_in_rust_type() { let tx_hash = test_data::proof_transaction_hashes()[0]; let ctx_hashes = Box::new([JsValue::from(tx_hash)]); - let client = get_mithril_client_unstable(); + let client = get_mithril_client_stable(); let tx_proof = client .get_cardano_transaction_proofs(ctx_hashes) From d5374e508599cbb17122637818067940fc36109f Mon Sep 17 00:00:00 2001 From: Damien Lachaume <135982616+dlachaume@users.noreply.github.com> Date: Tue, 8 Oct 2024 17:31:54 +0200 Subject: [PATCH 192/274] feat: remove `unstable` feature in example crate --- examples/client-cardano-transaction/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/client-cardano-transaction/Cargo.toml b/examples/client-cardano-transaction/Cargo.toml index f0808ded0ee..39c52fb30f6 100644 --- a/examples/client-cardano-transaction/Cargo.toml +++ b/examples/client-cardano-transaction/Cargo.toml @@ -12,7 +12,7 @@ repository = "https://github.com/input-output-hk/mithril/" [dependencies] anyhow = "1.0.86" clap = { version = "4.5.17", features = ["derive", "env"] } -mithril-client = { path = "../../mithril-client", features = ["unstable"] } +mithril-client = { path = "../../mithril-client" } slog = "2.7.0" slog-async = "2.8.0" slog-term = "2.9.1" From f5a8604d0b0244c3057b38022c3a7fe9ed9f86ef Mon Sep 17 00:00:00 2001 From: Damien Lachaume <135982616+dlachaume@users.noreply.github.com> Date: Tue, 8 Oct 2024 17:54:32 +0200 Subject: [PATCH 193/274] test: remove the `unstable` CLI option in `mithril-end-to-end` for `cardano-transaction` commands --- mithril-test-lab/mithril-end-to-end/src/mithril/client.rs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/mithril-test-lab/mithril-end-to-end/src/mithril/client.rs b/mithril-test-lab/mithril-end-to-end/src/mithril/client.rs index 21d7987dbb7..f250dff244a 100644 --- a/mithril-test-lab/mithril-end-to-end/src/mithril/client.rs +++ b/mithril-test-lab/mithril-end-to-end/src/mithril/client.rs @@ -165,11 +165,9 @@ impl ClientCommand { cmd.cli_arg(), ] .concat(), - ClientCommand::CardanoTransaction(cmd) => [ - vec!["--unstable".to_string(), "cardano-transaction".to_string()], - cmd.cli_arg(), - ] - .concat(), + ClientCommand::CardanoTransaction(cmd) => { + [vec!["cardano-transaction".to_string()], cmd.cli_arg()].concat() + } ClientCommand::CardanoStakeDistribution(cmd) => [ vec![ "--unstable".to_string(), From d2a8eb2059e660f2e1c93c7404f0ab9bcd63483e Mon Sep 17 00:00:00 2001 From: Damien Lachaume <135982616+dlachaume@users.noreply.github.com> Date: Tue, 8 Oct 2024 18:01:03 +0200 Subject: [PATCH 194/274] docs: adapt client documentation with new stable & unstable status --- .../root/manual/developer-docs/nodes/mithril-client.md | 10 +++++----- .../manual/getting-started/bootstrap-cardano-node.md | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/website/root/manual/developer-docs/nodes/mithril-client.md b/docs/website/root/manual/developer-docs/nodes/mithril-client.md index ca8bbc03e59..d213bfa25d0 100644 --- a/docs/website/root/manual/developer-docs/nodes/mithril-client.md +++ b/docs/website/root/manual/developer-docs/nodes/mithril-client.md @@ -130,7 +130,7 @@ Usage: mithril-client [OPTIONS] Commands: cardano-db Cardano db management (alias: cdb) mithril-stake-distribution Mithril Stake Distribution management (alias: msd) - cardano-transaction [unstable] Cardano transactions management (alias: ctx) + cardano-transaction Cardano transactions management (alias: ctx) cardano-stake-distribution [unstable] Cardano stake distribution management (alias: csd) help Print this message or the help of the given subcommand(s) @@ -148,7 +148,7 @@ Options: --log-output Redirect the logs to a file --unstable - Enable unstable commands (such as Cardano Transactions) + Enable unstable commands (such as Cardano Stake Distribution) -h, --help Print help -V, --version @@ -253,13 +253,13 @@ mithril_client mithril-stake-distribution list mithril_client mithril-stake-distribution download $MITHRIL_STAKE_DISTRIBUTION_ARTIFACT_HASH # 7- List Cardano transaction snapshots -mithril_client --unstable cardano-transaction snapshot list +mithril_client cardano-transaction snapshot list # 8- Show detailed information about a Cardano transaction snapshot -mithril_client --unstable cardano-transaction snapshot show $CARDANO_TRANSACTION_SNAPSHOT_HASH +mithril_client cardano-transaction snapshot show $CARDANO_TRANSACTION_SNAPSHOT_HASH # 9- Certify that given list of transactions hashes are included in the Cardano transactions set -mithril_client --unstable cardano-transaction certify $TRANSACTION_HASH_1,$TRANSACTION_HASH_2 +mithril_client cardano-transaction certify $TRANSACTION_HASH_1,$TRANSACTION_HASH_2 # 10- List Cardano stake distributions mithril_client --unstable cardano-stake-distribution list diff --git a/docs/website/root/manual/getting-started/bootstrap-cardano-node.md b/docs/website/root/manual/getting-started/bootstrap-cardano-node.md index 7b8561e1276..f141215bd61 100644 --- a/docs/website/root/manual/getting-started/bootstrap-cardano-node.md +++ b/docs/website/root/manual/getting-started/bootstrap-cardano-node.md @@ -115,10 +115,10 @@ This program shows, downloads and verifies certified blockchain artifacts. Usage: mithril-client [OPTIONS] Commands: - snapshot Deprecated, use `cardano-db` instead cardano-db Cardano db management (alias: cdb) mithril-stake-distribution Mithril Stake Distribution management (alias: msd) - cardano-transaction [unstable] Cardano transactions management (alias: ctx) + cardano-transaction Cardano transactions management (alias: ctx) + cardano-stake-distribution [unstable] Cardano stake distribution management (alias: csd) help Print this message or the help of the given subcommand(s) Options: @@ -135,7 +135,7 @@ Options: --log-output Redirect the logs to a file --unstable - Enable unstable commands (such as Cardano Transactions) + Enable unstable commands (such as Cardano Stake Distribution) -h, --help Print help -V, --version From 30cafcc26e073986269cba1d195e23358718f96e Mon Sep 17 00:00:00 2001 From: Damien Lachaume <135982616+dlachaume@users.noreply.github.com> Date: Tue, 8 Oct 2024 18:02:59 +0200 Subject: [PATCH 195/274] test: adapt 'Mithril Client multi-platform test' manual workflow --- .github/workflows/test-client.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/test-client.yml b/.github/workflows/test-client.yml index e2abe92dd3a..a5f7295552a 100644 --- a/.github/workflows/test-client.yml +++ b/.github/workflows/test-client.yml @@ -141,20 +141,20 @@ jobs: shell: bash working-directory: ./bin run: | - ./mithril-client ${{ steps.prepare.outputs.debug_level }} --unstable cardano-transaction snapshot list - echo "CTX_SNAPSHOT_HASH=$(./mithril-client --unstable cardano-transaction snapshot list --json | jq -r '.[0].hash')" >> $GITHUB_ENV + ./mithril-client ${{ steps.prepare.outputs.debug_level }} cardano-transaction snapshot list + echo "CTX_SNAPSHOT_HASH=$(./mithril-client cardano-transaction snapshot list --json | jq -r '.[0].hash')" >> $GITHUB_ENV - name: Cardano transaction / show snapshot if: steps.aggregator_capability_unix.outputs.ctx_enabled == 'true' || steps.aggregator_capability_windows.outputs.ctx_enabled == 'true' shell: bash working-directory: ./bin - run: ./mithril-client --unstable cardano-transaction snapshot show $CTX_SNAPSHOT_HASH + run: ./mithril-client cardano-transaction snapshot show $CTX_SNAPSHOT_HASH - name: Cardano transaction certify if: steps.aggregator_capability_unix.outputs.ctx_enabled == 'true' || steps.aggregator_capability_windows.outputs.ctx_enabled == 'true' shell: bash working-directory: ./bin - run: ./mithril-client --unstable ${{ steps.prepare.outputs.debug_level }} cardano-transaction certify $TRANSACTIONS_HASHES_TO_CERTIFY + run: ./mithril-client ${{ steps.prepare.outputs.debug_level }} cardano-transaction certify $TRANSACTIONS_HASHES_TO_CERTIFY - name: Cardano Stake Distribution / list and get last epoch and hash if: steps.aggregator_capability_unix.outputs.csd_enabled == 'true' || steps.aggregator_capability_windows.outputs.csd_enabled == 'true' @@ -242,18 +242,18 @@ jobs: if: steps.aggregator_capability.outputs.ctx_enabled == 'true' shell: bash run: | - ${{ steps.command.outputs.mithril_client }} --unstable cardano-transaction snapshot list - echo "CTX_SNAPSHOT_HASH=$(${{ steps.command.outputs.mithril_client }} --unstable cardano-transaction snapshot list --json | jq -r '.[0].hash')" >> $GITHUB_ENV + ${{ steps.command.outputs.mithril_client }} cardano-transaction snapshot list + echo "CTX_SNAPSHOT_HASH=$(${{ steps.command.outputs.mithril_client }} cardano-transaction snapshot list --json | jq -r '.[0].hash')" >> $GITHUB_ENV - name: Cardano transaction / show snapshot if: steps.aggregator_capability.outputs.ctx_enabled == 'true' shell: bash - run: ${{ steps.command.outputs.mithril_client }} --unstable cardano-transaction snapshot show $CTX_SNAPSHOT_HASH + run: ${{ steps.command.outputs.mithril_client }} cardano-transaction snapshot show $CTX_SNAPSHOT_HASH - name: Cardano transaction certify if: steps.aggregator_capability.outputs.ctx_enabled == 'true' shell: bash - run: ${{ steps.command.outputs.mithril_client }} --unstable ${{ steps.prepare.outputs.debug_level }} cardano-transaction certify $TRANSACTIONS_HASHES_TO_CERTIFY + run: ${{ steps.command.outputs.mithril_client }} ${{ steps.prepare.outputs.debug_level }} cardano-transaction certify $TRANSACTIONS_HASHES_TO_CERTIFY - name: Cardano Stake Distribution / list and get last epoch and hash if: steps.aggregator_capability.outputs.csd_enabled == 'true' From f461358ad3b7ef8a560b19526e8ae503f0366cff Mon Sep 17 00:00:00 2001 From: Damien Lachaume <135982616+dlachaume@users.noreply.github.com> Date: Tue, 8 Oct 2024 18:58:26 +0200 Subject: [PATCH 196/274] fix: reverse the order of parameters in the function `compute_mithril_stake_distribution_message` --- mithril-client-wasm/www-test/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mithril-client-wasm/www-test/index.js b/mithril-client-wasm/www-test/index.js index 141ee72ecd6..b9da8e98483 100644 --- a/mithril-client-wasm/www-test/index.js +++ b/mithril-client-wasm/www-test/index.js @@ -100,8 +100,8 @@ let mithril_stake_distribution_message; test_number++; await run_test("compute_mithril_stake_distribution_message", test_number, async () => { mithril_stake_distribution_message = await client.compute_mithril_stake_distribution_message( - last_certificate_from_chain, mithril_stake_distribution, + last_certificate_from_chain, ); console.log("mithril_stake_distribution_message", mithril_stake_distribution_message); }); From eec0a1f24b16390e96eda29836f56bc252d02a8f Mon Sep 17 00:00:00 2001 From: Damien Lachaume <135982616+dlachaume@users.noreply.github.com> Date: Tue, 8 Oct 2024 18:09:47 +0200 Subject: [PATCH 197/274] docs: announce the stable status of Cardano transaction in CHANGELOG --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f63cefe1de7..6d6ebddfbed 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,8 @@ As a minor extension, we have adopted a slightly different versioning convention - Support for `Cardano node` `9.2.1` in the signer and the aggregator. +- Support for stable Cardano transaction client library, CLI and WASM. + - Crates versions: | Crate | Version | From b8ac5d46f29c05742f73f9b23d9ad3b48abd5122 Mon Sep 17 00:00:00 2001 From: Damien Lachaume <135982616+dlachaume@users.noreply.github.com> Date: Wed, 9 Oct 2024 10:35:23 +0200 Subject: [PATCH 198/274] chore: bump crates versions * client-cardano-transaction from `0.1.11` to `0.1.12` * mithril-client-cli from `0.9.13` to `0.9.14` * mithril-client-wasm from `0.5.0` to `0.5.1` * mithril-client from `0.9.0` to `0.9.1` * mithril-end-to-end from `0.4.35` to `0.4.36` --- Cargo.lock | 10 +++++----- examples/client-cardano-transaction/Cargo.toml | 2 +- mithril-client-cli/Cargo.toml | 2 +- mithril-client-wasm/Cargo.toml | 2 +- mithril-client/Cargo.toml | 2 +- mithril-test-lab/mithril-end-to-end/Cargo.toml | 2 +- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 19bc664c7d6..7e159b6697e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -933,7 +933,7 @@ dependencies = [ [[package]] name = "client-cardano-transaction" -version = "0.1.11" +version = "0.1.12" dependencies = [ "anyhow", "clap", @@ -3480,7 +3480,7 @@ dependencies = [ [[package]] name = "mithril-client" -version = "0.9.0" +version = "0.9.1" dependencies = [ "anyhow", "async-recursion", @@ -3513,7 +3513,7 @@ dependencies = [ [[package]] name = "mithril-client-cli" -version = "0.9.13" +version = "0.9.14" dependencies = [ "anyhow", "async-trait", @@ -3543,7 +3543,7 @@ dependencies = [ [[package]] name = "mithril-client-wasm" -version = "0.5.0" +version = "0.5.1" dependencies = [ "async-trait", "futures", @@ -3630,7 +3630,7 @@ dependencies = [ [[package]] name = "mithril-end-to-end" -version = "0.4.35" +version = "0.4.36" dependencies = [ "anyhow", "async-recursion", diff --git a/examples/client-cardano-transaction/Cargo.toml b/examples/client-cardano-transaction/Cargo.toml index 39c52fb30f6..5621e9ca791 100644 --- a/examples/client-cardano-transaction/Cargo.toml +++ b/examples/client-cardano-transaction/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "client-cardano-transaction" description = "Mithril client cardano-transaction example" -version = "0.1.11" +version = "0.1.12" authors = ["dev@iohk.io", "mithril-dev@iohk.io"] documentation = "https://mithril.network/doc" edition = "2021" diff --git a/mithril-client-cli/Cargo.toml b/mithril-client-cli/Cargo.toml index 2b79f20b530..a0f26572c7f 100644 --- a/mithril-client-cli/Cargo.toml +++ b/mithril-client-cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-client-cli" -version = "0.9.13" +version = "0.9.14" description = "A Mithril Client" authors = { workspace = true } edition = { workspace = true } diff --git a/mithril-client-wasm/Cargo.toml b/mithril-client-wasm/Cargo.toml index b82660e95b2..3f5bc7a30c8 100644 --- a/mithril-client-wasm/Cargo.toml +++ b/mithril-client-wasm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-client-wasm" -version = "0.5.0" +version = "0.5.1" description = "Mithril client WASM" authors = { workspace = true } edition = { workspace = true } diff --git a/mithril-client/Cargo.toml b/mithril-client/Cargo.toml index a991ff141d3..15352fa85be 100644 --- a/mithril-client/Cargo.toml +++ b/mithril-client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-client" -version = "0.9.0" +version = "0.9.1" description = "Mithril client library" authors = { workspace = true } edition = { workspace = true } diff --git a/mithril-test-lab/mithril-end-to-end/Cargo.toml b/mithril-test-lab/mithril-end-to-end/Cargo.toml index dd429fe0a09..75810e90f2d 100644 --- a/mithril-test-lab/mithril-end-to-end/Cargo.toml +++ b/mithril-test-lab/mithril-end-to-end/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-end-to-end" -version = "0.4.35" +version = "0.4.36" authors = { workspace = true } edition = { workspace = true } documentation = { workspace = true } From 8ebd3e5470f9bfa04d73239622f3378a2b3e3231 Mon Sep 17 00:00:00 2001 From: Damien Lachaume <135982616+dlachaume@users.noreply.github.com> Date: Wed, 9 Oct 2024 10:42:04 +0200 Subject: [PATCH 199/274] chore: upgrade `mithril-explorer` dependencies --- mithril-explorer/package-lock.json | 2507 ++++++++++++---------------- mithril-explorer/package.json | 10 +- 2 files changed, 1067 insertions(+), 1450 deletions(-) diff --git a/mithril-explorer/package-lock.json b/mithril-explorer/package-lock.json index 26d6c94d6d8..3448878d241 100644 --- a/mithril-explorer/package-lock.json +++ b/mithril-explorer/package-lock.json @@ -1,22 +1,22 @@ { "name": "mithril-explorer", - "version": "0.7.8", + "version": "0.7.9", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "mithril-explorer", - "version": "0.7.8", + "version": "0.7.9", "dependencies": { "@mithril-dev/mithril-client-wasm": "file:../mithril-client-wasm/pkg", "@popperjs/core": "^2.11.8", - "@reduxjs/toolkit": "^2.2.7", + "@reduxjs/toolkit": "^2.2.8", "bootstrap": "^5.3.3", "bootstrap-icons": "^1.11.3", "chart.js": "^4.4.4", - "next": "^14.2.13", + "next": "^14.2.15", "react": "^18.3.1", - "react-bootstrap": "^2.10.4", + "react-bootstrap": "^2.10.5", "react-chartjs-2": "^5.2.0", "react-dom": "^18.3.1", "react-redux": "^9.1.2" @@ -25,7 +25,7 @@ "@testing-library/jest-dom": "^6.5.0", "@testing-library/react": "^16.0.1", "eslint": "^8.57.1", - "eslint-config-next": "^14.2.13", + "eslint-config-next": "^14.2.15", "fantasticon": "^3.0.0", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", @@ -36,17 +36,9 @@ }, "../mithril-client-wasm/pkg": { "name": "mithril-client-wasm", - "version": "0.4.2", + "version": "0.5.1", "license": "Apache-2.0" }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/@adobe/css-tools": { "version": "4.4.0", "dev": true, @@ -65,83 +57,19 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.23.5", + "version": "7.25.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" + "@babel/highlight": "^7.25.7", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/code-frame/node_modules/ansi-styles": { - "version": "3.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/color-convert": { - "version": "1.9.3", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/code-frame/node_modules/color-name": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/code-frame/node_modules/has-flag": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/supports-color": { - "version": "5.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/compat-data": { - "version": "7.23.5", + "version": "7.25.7", "dev": true, "license": "MIT", "engines": { @@ -149,20 +77,20 @@ } }, "node_modules/@babel/core": { - "version": "7.24.0", + "version": "7.25.7", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.0", - "@babel/parser": "^7.24.0", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.0", - "@babel/types": "^7.24.0", + "@babel/code-frame": "^7.25.7", + "@babel/generator": "^7.25.7", + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helpers": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/template": "^7.25.7", + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -186,27 +114,27 @@ } }, "node_modules/@babel/generator": { - "version": "7.23.6", + "version": "7.25.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" + "@babel/types": "^7.25.7", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", + "version": "7.25.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", + "@babel/compat-data": "^7.25.7", + "@babel/helper-validator-option": "^7.25.7", + "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -222,58 +150,27 @@ "semver": "bin/semver.js" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", + "version": "7.25.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.22.15" + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", + "version": "7.25.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-module-imports": "^7.25.7", + "@babel/helper-simple-access": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", + "@babel/traverse": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -283,7 +180,7 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.0", + "version": "7.25.7", "dev": true, "license": "MIT", "engines": { @@ -291,29 +188,19 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", + "version": "7.25.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", + "version": "7.25.7", "dev": true, "license": "MIT", "engines": { @@ -321,7 +208,7 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", + "version": "7.25.7", "dev": true, "license": "MIT", "engines": { @@ -329,7 +216,7 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", + "version": "7.25.7", "dev": true, "license": "MIT", "engines": { @@ -337,26 +224,26 @@ } }, "node_modules/@babel/helpers": { - "version": "7.24.0", + "version": "7.25.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.0", - "@babel/types": "^7.24.0" + "@babel/template": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.23.4", + "version": "7.25.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-validator-identifier": "^7.25.7", "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" @@ -427,9 +314,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.0", + "version": "7.25.7", "dev": true, "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.7" + }, "bin": { "parser": "bin/babel-parser.js" }, @@ -470,6 +360,34 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.25.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-syntax-import-meta": { "version": "7.10.4", "dev": true, @@ -493,11 +411,11 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.23.3", + "version": "7.25.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -572,6 +490,20 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-syntax-top-level-await": { "version": "7.14.5", "dev": true, @@ -587,11 +519,11 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.23.3", + "version": "7.25.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -601,7 +533,7 @@ } }, "node_modules/@babel/runtime": { - "version": "7.25.6", + "version": "7.25.7", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -611,31 +543,28 @@ } }, "node_modules/@babel/template": { - "version": "7.24.0", + "version": "7.25.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0" + "@babel/code-frame": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.24.0", + "version": "7.25.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0", + "@babel/code-frame": "^7.25.7", + "@babel/generator": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/template": "^7.25.7", + "@babel/types": "^7.25.7", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -652,12 +581,12 @@ } }, "node_modules/@babel/types": { - "version": "7.24.0", + "version": "7.25.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-string-parser": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", "to-fast-properties": "^2.0.0" }, "engines": { @@ -684,7 +613,7 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", + "version": "4.11.1", "dev": true, "license": "MIT", "engines": { @@ -773,7 +702,7 @@ } }, "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", + "version": "6.1.0", "dev": true, "license": "MIT", "engines": { @@ -888,6 +817,11 @@ "node": ">=8" } }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/sprintf-js": { + "version": "1.0.3", + "dev": true, + "license": "BSD-3-Clause" + }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", "dev": true, @@ -912,21 +846,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/console/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/@jest/core": { "version": "29.7.0", "dev": true, @@ -973,19 +892,15 @@ } } }, - "node_modules/@jest/core/node_modules/chalk": { - "version": "4.1.2", + "node_modules/@jest/core/node_modules/ansi-styles": { + "version": "5.2.0", "dev": true, "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/@jest/core/node_modules/pretty-format": { @@ -1001,19 +916,8 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/core/node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/@jest/core/node_modules/react-is": { - "version": "18.2.0", + "version": "18.3.1", "dev": true, "license": "MIT" }, @@ -1126,21 +1030,6 @@ } } }, - "node_modules/@jest/reporters/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/@jest/reporters/node_modules/glob": { "version": "7.2.3", "dev": true, @@ -1237,21 +1126,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/transform/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/@jest/types": { "version": "29.6.3", "dev": true, @@ -1268,21 +1142,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/types/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.5", "dev": true, @@ -1313,7 +1172,7 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", + "version": "1.5.0", "dev": true, "license": "MIT" }, @@ -1335,26 +1194,23 @@ "link": true }, "node_modules/@next/env": { - "version": "14.2.13", - "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.13.tgz", - "integrity": "sha512-s3lh6K8cbW1h5Nga7NNeXrbe0+2jIIYK9YaA9T7IufDWnZpozdFUp6Hf0d5rNWUKu4fEuSX2rCKlGjCrtylfDw==" + "version": "14.2.15", + "license": "MIT" }, "node_modules/@next/eslint-plugin-next": { - "version": "14.2.13", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.13.tgz", - "integrity": "sha512-z8Mk0VljxhIzsSiZUSdt3wp+t2lKd+jk5a9Jsvh3zDGkItgDMfjv/ZbET6HsxEl/fSihVoHGsXV6VLyDH0lfTQ==", + "version": "14.2.15", "dev": true, + "license": "MIT", "dependencies": { "glob": "10.3.10" } }, "node_modules/@next/swc-darwin-arm64": { - "version": "14.2.13", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.13.tgz", - "integrity": "sha512-IkAmQEa2Htq+wHACBxOsslt+jMoV3msvxCn0WFSfJSkv/scy+i/EukBKNad36grRxywaXUYJc9mxEGkeIs8Bzg==", + "version": "14.2.15", "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "darwin" @@ -1364,12 +1220,13 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "14.2.13", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.13.tgz", - "integrity": "sha512-Dv1RBGs2TTjkwEnFMVL5XIfJEavnLqqwYSD6LXgTPdEy/u6FlSrLBSSfe1pcfqhFEXRAgVL3Wpjibe5wXJzWog==", + "version": "14.2.15", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.15.tgz", + "integrity": "sha512-5TGyjFcf8ampZP3e+FyCax5zFVHi+Oe7sZyaKOngsqyaNEpOgkKB3sqmymkZfowy3ufGA/tUgDPPxpQx931lHg==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "darwin" @@ -1379,12 +1236,13 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "14.2.13", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.13.tgz", - "integrity": "sha512-yB1tYEFFqo4ZNWkwrJultbsw7NPAAxlPXURXioRl9SdW6aIefOLS+0TEsKrWBtbJ9moTDgU3HRILL6QBQnMevg==", + "version": "14.2.15", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.15.tgz", + "integrity": "sha512-3Bwv4oc08ONiQ3FiOLKT72Q+ndEMyLNsc/D3qnLMbtUYTQAmkx9E/JRu0DBpHxNddBmNT5hxz1mYBphJ3mfrrw==", "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -1394,12 +1252,13 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "14.2.13", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.13.tgz", - "integrity": "sha512-v5jZ/FV/eHGoWhMKYrsAweQ7CWb8xsWGM/8m1mwwZQ/sutJjoFaXchwK4pX8NqwImILEvQmZWyb8pPTcP7htWg==", + "version": "14.2.15", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.15.tgz", + "integrity": "sha512-k5xf/tg1FBv/M4CMd8S+JL3uV9BnnRmoe7F+GWC3DxkTCD9aewFRH1s5rJ1zkzDa+Do4zyN8qD0N8c84Hu96FQ==", "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -1409,12 +1268,13 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "14.2.13", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.13.tgz", - "integrity": "sha512-aVc7m4YL7ViiRv7SOXK3RplXzOEe/qQzRA5R2vpXboHABs3w8vtFslGTz+5tKiQzWUmTmBNVW0UQdhkKRORmGA==", + "version": "14.2.15", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.15.tgz", + "integrity": "sha512-kE6q38hbrRbKEkkVn62reLXhThLRh6/TvgSP56GkFNhU22TbIrQDEMrO7j0IcQHcew2wfykq8lZyHFabz0oBrA==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -1424,12 +1284,13 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "14.2.13", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.13.tgz", - "integrity": "sha512-4wWY7/OsSaJOOKvMsu1Teylku7vKyTuocvDLTZQq0TYv9OjiYYWt63PiE1nTuZnqQ4RPvME7Xai+9enoiN0Wrg==", + "version": "14.2.15", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.15.tgz", + "integrity": "sha512-PZ5YE9ouy/IdO7QVJeIcyLn/Rc4ml9M2G4y3kCM9MNf1YKvFY4heg3pVa/jQbMro+tP6yc4G2o9LjAz1zxD7tQ==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -1439,12 +1300,13 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "14.2.13", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.13.tgz", - "integrity": "sha512-uP1XkqCqV2NVH9+g2sC7qIw+w2tRbcMiXFEbMihkQ8B1+V6m28sshBwAB0SDmOe0u44ne1vFU66+gx/28RsBVQ==", + "version": "14.2.15", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.15.tgz", + "integrity": "sha512-2raR16703kBvYEQD9HNLyb0/394yfqzmIeyp2nDzcPV4yPjqNUG3ohX6jX00WryXz6s1FXpVhsCo3i+g4RUX+g==", "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "win32" @@ -1454,12 +1316,13 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "14.2.13", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.13.tgz", - "integrity": "sha512-V26ezyjPqQpDBV4lcWIh8B/QICQ4v+M5Bo9ykLN+sqeKKBxJVDpEc6biDVyluTXTC40f5IqCU0ttth7Es2ZuMw==", + "version": "14.2.15", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.15.tgz", + "integrity": "sha512-fyTE8cklgkyR1p03kJa5zXEaZ9El+kDNM5A+66+8evQS5e/6v0Gk28LqA0Jet8gKSOyP+OTm/tJHzMlGdQerdQ==", "cpu": [ "ia32" ], + "license": "MIT", "optional": true, "os": [ "win32" @@ -1469,12 +1332,13 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "14.2.13", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.13.tgz", - "integrity": "sha512-WwzOEAFBGhlDHE5Z73mNU8CO8mqMNLqaG+AO9ETmzdCQlJhVtWZnOl2+rqgVQS+YHunjOWptdFmNfbpwcUuEsw==", + "version": "14.2.15", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.15.tgz", + "integrity": "sha512-SzqGbsLsP9OwKNUG9nekShTwhj6JSB9ZLMWQ8g1gG6hdE5gQLncbnbymrwy2yVmH9nikSLYRYxYMFu78Ggp7/g==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "win32" @@ -1515,6 +1379,14 @@ "node": ">= 8" } }, + "node_modules/@nolyfill/is-core-module": { + "version": "1.0.39", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.4.0" + } + }, "node_modules/@npmcli/fs": { "version": "2.1.2", "dev": true, @@ -1552,13 +1424,14 @@ "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/popperjs" } }, "node_modules/@react-aria/ssr": { - "version": "3.9.5", + "version": "3.9.6", "license": "Apache-2.0", "dependencies": { "@swc/helpers": "^0.5.0" @@ -1571,9 +1444,10 @@ } }, "node_modules/@reduxjs/toolkit": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.2.7.tgz", - "integrity": "sha512-faI3cZbSdFb8yv9dhDTmGwclW0vk0z5o1cia+kf7gCbaCwHI5e+7tP57mJUv22pNcNbeA62GSrPpfrUfdXcQ6g==", + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.2.8.tgz", + "integrity": "sha512-eK/ieXftPRQfaBSmzsamXEyDwkntMTY0e9SG5ETsEOv5JIPKhu3mj992t6B8FJjlnSrZBAAqdT8oMkPe4j+P9g==", + "license": "MIT", "dependencies": { "immer": "^10.0.3", "redux": "^5.0.1", @@ -1629,8 +1503,13 @@ "react": ">=16.14.0" } }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, "node_modules/@rushstack/eslint-patch": { - "version": "1.7.2", + "version": "1.10.4", "dev": true, "license": "MIT" }, @@ -1668,7 +1547,7 @@ } }, "node_modules/@testing-library/dom": { - "version": "10.3.1", + "version": "10.4.0", "dev": true, "license": "MIT", "peer": true, @@ -1686,53 +1565,50 @@ "node": ">=18" } }, - "node_modules/@testing-library/dom/node_modules/chalk": { - "version": "4.1.2", + "node_modules/@testing-library/jest-dom": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.5.0.tgz", + "integrity": "sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@adobe/css-tools": "^4.4.0", + "aria-query": "^5.0.0", + "chalk": "^3.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.6.3", + "lodash": "^4.17.21", + "redent": "^3.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=14", + "npm": ">=6", + "yarn": ">=1" } }, - "node_modules/@testing-library/dom/node_modules/dom-accessibility-api": { - "version": "0.5.16", + "node_modules/@testing-library/jest-dom/node_modules/chalk": { + "version": "3.0.0", "dev": true, "license": "MIT", - "peer": true - }, - "node_modules/@testing-library/jest-dom": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.5.0.tgz", - "integrity": "sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA==", - "dev": true, "dependencies": { - "@adobe/css-tools": "^4.4.0", - "aria-query": "^5.0.0", - "chalk": "^3.0.0", - "css.escape": "^1.5.1", - "dom-accessibility-api": "^0.6.3", - "lodash": "^4.17.21", - "redent": "^3.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=14", - "npm": ">=6", - "yarn": ">=1" + "node": ">=8" } }, + "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { + "version": "0.6.3", + "dev": true, + "license": "MIT" + }, "node_modules/@testing-library/react": { "version": "16.0.1", "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.0.1.tgz", "integrity": "sha512-dSmwJVtJXmku+iocRhWOUFbrERC76TX2Mnf0ATODz8brzAZrMBbzLwQixlBSanZxR6LddK3eiwpSFZgDET1URg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5" }, @@ -1799,7 +1675,7 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.20.5", + "version": "7.20.6", "dev": true, "license": "MIT", "dependencies": { @@ -1845,63 +1721,38 @@ "parse5": "^7.0.0" } }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "dev": true, - "license": "MIT" - }, "node_modules/@types/json5": { "version": "0.0.29", "dev": true, "license": "MIT" }, "node_modules/@types/node": { - "version": "20.11.25", + "version": "22.7.5", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.19.2" } }, "node_modules/@types/prop-types": { - "version": "15.7.11", + "version": "15.7.13", "license": "MIT" }, "node_modules/@types/react": { - "version": "18.2.64", + "version": "18.3.11", "license": "MIT", "dependencies": { "@types/prop-types": "*", - "@types/scheduler": "*", "csstype": "^3.0.2" } }, - "node_modules/@types/react-dom": { - "version": "18.2.20", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@types/react": "*" - } - }, "node_modules/@types/react-transition-group": { - "version": "4.4.10", + "version": "4.4.11", "license": "MIT", "dependencies": { "@types/react": "*" } }, - "node_modules/@types/scheduler": { - "version": "0.16.8", - "license": "MIT" - }, - "node_modules/@types/semver": { - "version": "7.5.8", - "dev": true, - "license": "MIT" - }, "node_modules/@types/stack-utils": { "version": "2.0.3", "dev": true, @@ -1921,7 +1772,7 @@ "license": "MIT" }, "node_modules/@types/yargs": { - "version": "17.0.32", + "version": "17.0.33", "dev": true, "license": "MIT", "dependencies": { @@ -1933,26 +1784,31 @@ "dev": true, "license": "MIT" }, - "node_modules/@typescript-eslint/parser": { - "version": "6.21.0", + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.8.1", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4" + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.8.1", + "@typescript-eslint/type-utils": "8.8.1", + "@typescript-eslint/utils": "8.8.1", + "@typescript-eslint/visitor-keys": "8.8.1", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -1960,41 +1816,26 @@ } } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "6.21.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "7.2.0", + "node_modules/@typescript-eslint/parser": { + "version": "8.8.1", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/typescript-estree": "7.2.0", - "@typescript-eslint/utils": "7.2.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" + "@typescript-eslint/scope-manager": "8.8.1", + "@typescript-eslint/types": "8.8.1", + "@typescript-eslint/typescript-estree": "8.8.1", + "@typescript-eslint/visitor-keys": "8.8.1", + "debug": "^4.3.4" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.56.0" + "eslint": "^8.57.0 || ^9.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -2002,34 +1843,34 @@ } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "7.2.0", + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.8.1", "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.8.1", + "@typescript-eslint/visitor-keys": "8.8.1" + }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.2.0", + "node_modules/@typescript-eslint/type-utils": { + "version": "8.8.1", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", + "@typescript-eslint/typescript-estree": "8.8.1", + "@typescript-eslint/utils": "8.8.1", "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -2041,50 +1882,12 @@ } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "7.2.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/brace-expansion": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/minimatch": { - "version": "9.0.3", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@typescript-eslint/types": { - "version": "6.21.0", + "version": "8.8.1", "dev": true, "license": "MIT", "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -2092,21 +1895,21 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.21.0", + "version": "8.8.1", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", + "@typescript-eslint/types": "8.8.1", + "@typescript-eslint/visitor-keys": "8.8.1", "debug": "^4.3.4", - "globby": "^11.1.0", + "fast-glob": "^3.3.2", "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -2127,7 +1930,7 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.3", + "version": "9.0.5", "dev": true, "license": "ISC", "dependencies": { @@ -2141,132 +1944,36 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "7.2.0", + "version": "8.8.1", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "7.2.0", - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/typescript-estree": "7.2.0", - "semver": "^7.5.4" + "@typescript-eslint/scope-manager": "8.8.1", + "@typescript-eslint/types": "8.8.1", + "@typescript-eslint/typescript-estree": "8.8.1" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.56.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.2.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "7.2.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/brace-expansion": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/minimatch": { - "version": "9.0.3", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "eslint": "^8.57.0 || ^9.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.21.0", + "version": "8.8.1", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "6.21.0", - "eslint-visitor-keys": "^3.4.1" + "@typescript-eslint/types": "8.8.1", + "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -2297,7 +2004,7 @@ "license": "ISC" }, "node_modules/acorn": { - "version": "8.11.3", + "version": "8.12.1", "dev": true, "license": "MIT", "bin": { @@ -2325,9 +2032,12 @@ } }, "node_modules/acorn-walk": { - "version": "8.3.2", + "version": "8.3.4", "dev": true, "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, "engines": { "node": ">=0.4.0" } @@ -2486,14 +2196,15 @@ } }, "node_modules/array-includes": { - "version": "3.1.7", + "version": "3.1.8", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", "is-string": "^1.0.7" }, "engines": { @@ -2511,33 +2222,16 @@ "node": ">=8" } }, - "node_modules/array.prototype.filter": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-array-method-boxes-properly": "^1.0.0", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/array.prototype.findlast": { - "version": "1.2.4", + "version": "1.2.5", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", + "es-abstract": "^1.23.2", "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", "es-shim-unscopables": "^1.0.2" }, "engines": { @@ -2548,14 +2242,15 @@ } }, "node_modules/array.prototype.findlastindex": { - "version": "1.2.4", + "version": "1.2.5", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", + "es-abstract": "^1.23.2", "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", "es-shim-unscopables": "^1.0.2" }, "engines": { @@ -2599,27 +2294,19 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array.prototype.toreversed": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - } - }, "node_modules/array.prototype.tosorted": { - "version": "1.1.3", + "version": "1.1.4", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.1.0", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/arraybuffer.prototype.slice": { @@ -2648,14 +2335,6 @@ "dev": true, "license": "MIT" }, - "node_modules/asynciterator.prototype": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - } - }, "node_modules/asynckit": { "version": "0.4.0", "dev": true, @@ -2676,7 +2355,7 @@ } }, "node_modules/axe-core": { - "version": "4.7.0", + "version": "4.10.0", "dev": true, "license": "MPL-2.0", "engines": { @@ -2684,11 +2363,11 @@ } }, "node_modules/axobject-query": { - "version": "3.2.1", + "version": "4.1.0", "dev": true, "license": "Apache-2.0", - "dependencies": { - "dequal": "^2.0.3" + "engines": { + "node": ">= 0.4" } }, "node_modules/babel-jest": { @@ -2711,21 +2390,6 @@ "@babel/core": "^7.8.0" } }, - "node_modules/babel-jest/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/babel-plugin-istanbul": { "version": "6.1.1", "dev": true, @@ -2779,22 +2443,25 @@ } }, "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", + "version": "1.1.0", "dev": true, "license": "MIT", "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" }, "peerDependencies": { "@babel/core": "^7.0.0" @@ -2842,6 +2509,7 @@ "url": "https://opencollective.com/bootstrap" } ], + "license": "MIT", "peerDependencies": { "@popperjs/core": "^2.11.8" } @@ -2859,7 +2527,8 @@ "type": "opencollective", "url": "https://opencollective.com/bootstrap" } - ] + ], + "license": "MIT" }, "node_modules/brace-expansion": { "version": "1.1.11", @@ -2882,7 +2551,7 @@ } }, "node_modules/browserslist": { - "version": "4.23.0", + "version": "4.24.0", "dev": true, "funding": [ { @@ -2900,10 +2569,10 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" + "caniuse-lite": "^1.0.30001663", + "electron-to-chromium": "^1.5.28", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" }, "bin": { "browserslist": "cli.js" @@ -3069,7 +2738,7 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001594", + "version": "1.0.30001667", "funding": [ { "type": "opencollective", @@ -3095,7 +2764,7 @@ } }, "node_modules/chalk": { - "version": "3.0.0", + "version": "4.1.2", "dev": true, "license": "MIT", "dependencies": { @@ -3103,7 +2772,10 @@ "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/char-regex": { @@ -3118,6 +2790,7 @@ "version": "4.4.4", "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.4.tgz", "integrity": "sha512-emICKGBABnxhMjUjlYRR12PmOXhJ2eJjEHL2/dZlWjxRAZT1D8xplLFq5M0tMQK8ja+wBS/tuVEJB5C6r7VxJA==", + "license": "MIT", "dependencies": { "@kurkle/color": "^0.3.0" }, @@ -3148,7 +2821,7 @@ } }, "node_modules/cjs-module-lexer": { - "version": "1.2.3", + "version": "1.4.1", "dev": true, "license": "MIT" }, @@ -3280,11 +2953,11 @@ } }, "node_modules/commander": { - "version": "9.5.0", + "version": "12.1.0", "dev": true, "license": "MIT", "engines": { - "node": "^12.20.0 || >=14" + "node": ">=18" } }, "node_modules/common-tags": { @@ -3330,21 +3003,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/create-jest/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/cross-spawn": { "version": "7.0.3", "dev": true, @@ -3396,39 +3054,87 @@ "node_modules/d": { "version": "1.0.2", "dev": true, - "license": "ISC", + "license": "ISC", + "dependencies": { + "es5-ext": "^0.10.64", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/data-urls": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "dev": true, + "license": "MIT", "dependencies": { - "es5-ext": "^0.10.64", - "type": "^2.7.2" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" }, "engines": { - "node": ">=0.12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/damerau-levenshtein": { - "version": "1.0.8", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/data-urls": { - "version": "3.0.2", + "node_modules/data-view-byte-offset": { + "version": "1.0.0", "dev": true, "license": "MIT", "dependencies": { - "abab": "^2.0.6", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0" + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" }, "engines": { - "node": ">=12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/debug": { - "version": "4.3.4", + "version": "4.3.7", "dev": true, "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -3445,7 +3151,7 @@ "license": "MIT" }, "node_modules/dedent": { - "version": "1.5.1", + "version": "1.5.3", "dev": true, "license": "MIT", "peerDependencies": { @@ -3457,6 +3163,37 @@ } } }, + "node_modules/deep-equal": { + "version": "2.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.5", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.2", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/deep-is": { "version": "0.1.4", "dev": true, @@ -3566,9 +3303,10 @@ } }, "node_modules/dom-accessibility-api": { - "version": "0.6.3", + "version": "0.5.16", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/dom-helpers": { "version": "5.2.1", @@ -3595,7 +3333,7 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.4.693", + "version": "1.5.33", "dev": true, "license": "ISC" }, @@ -3625,7 +3363,7 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.15.1", + "version": "5.17.1", "dev": true, "license": "MIT", "dependencies": { @@ -3669,7 +3407,7 @@ } }, "node_modules/es-abstract": { - "version": "1.22.5", + "version": "1.23.3", "dev": true, "license": "MIT", "dependencies": { @@ -3677,8 +3415,12 @@ "arraybuffer.prototype.slice": "^1.0.3", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", "es-define-property": "^1.0.0", "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", "es-set-tostringtag": "^2.0.3", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.6", @@ -3689,10 +3431,11 @@ "has-property-descriptors": "^1.0.2", "has-proto": "^1.0.3", "has-symbols": "^1.0.3", - "hasown": "^2.0.1", + "hasown": "^2.0.2", "internal-slot": "^1.0.7", "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", "is-negative-zero": "^2.0.3", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.3", @@ -3703,17 +3446,17 @@ "object-keys": "^1.1.1", "object.assign": "^4.1.5", "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.0", + "safe-array-concat": "^1.1.2", "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", "typed-array-buffer": "^1.0.2", "typed-array-byte-length": "^1.0.1", "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.5", + "typed-array-length": "^1.0.6", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.14" + "which-typed-array": "^1.1.15" }, "engines": { "node": ">= 0.4" @@ -3722,11 +3465,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-array-method-boxes-properly": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, "node_modules/es-define-property": { "version": "1.0.0", "dev": true, @@ -3746,26 +3484,55 @@ "node": ">= 0.4" } }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/es-iterator-helpers": { - "version": "1.0.17", + "version": "1.1.0", "dev": true, "license": "MIT", "dependencies": { - "asynciterator.prototype": "^1.0.0", "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.22.4", + "es-abstract": "^1.23.3", "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.2", + "es-set-tostringtag": "^2.0.3", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", + "globalthis": "^1.0.4", "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.1", + "has-proto": "^1.0.3", "has-symbols": "^1.0.3", "internal-slot": "^1.0.7", - "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.1.0" + "iterator.prototype": "^1.1.3", + "safe-array-concat": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" }, "engines": { "node": ">= 0.4" @@ -3857,7 +3624,7 @@ } }, "node_modules/escalade": { - "version": "3.1.2", + "version": "3.2.0", "dev": true, "license": "MIT", "engines": { @@ -3899,7 +3666,9 @@ "version": "8.57.1", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -3951,12 +3720,13 @@ } }, "node_modules/eslint-config-next": { - "version": "14.2.13", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.13.tgz", - "integrity": "sha512-aro1EKAoyYchnO/3Tlo91hnNBO7QO7qnv/79MAFC+4Jq8TdUVKQlht5d2F+YjrePjdpOvfL+mV9JPfyYNwkk1g==", + "version": "14.2.15", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.15.tgz", + "integrity": "sha512-mKg+NC/8a4JKLZRIOBplxXNdStgxy7lzWuedUaCc8tev+Al9mwDUTujQH6W6qXDH9kycWiVo28tADWGvpBsZcQ==", "dev": true, + "license": "MIT", "dependencies": { - "@next/eslint-plugin-next": "14.2.13", + "@next/eslint-plugin-next": "14.2.15", "@rushstack/eslint-patch": "^1.3.3", "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", @@ -3977,160 +3747,6 @@ } } }, - "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "7.2.0", - "@typescript-eslint/type-utils": "7.2.0", - "@typescript-eslint/utils": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^7.0.0", - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/eslint-config-next/node_modules/@typescript-eslint/parser": { - "version": "7.2.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/scope-manager": "7.2.0", - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/typescript-estree": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/eslint-config-next/node_modules/@typescript-eslint/scope-manager": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/eslint-config-next/node_modules/@typescript-eslint/types": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/eslint-config-next/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.2.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/eslint-config-next/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "7.2.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/eslint-config-next/node_modules/brace-expansion": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/eslint-config-next/node_modules/minimatch": { - "version": "9.0.3", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "dev": true, @@ -4150,16 +3766,17 @@ } }, "node_modules/eslint-import-resolver-typescript": { - "version": "3.6.1", + "version": "3.6.3", "dev": true, "license": "ISC", "dependencies": { - "debug": "^4.3.4", - "enhanced-resolve": "^5.12.0", - "eslint-module-utils": "^2.7.4", - "fast-glob": "^3.3.1", - "get-tsconfig": "^4.5.0", - "is-core-module": "^2.11.0", + "@nolyfill/is-core-module": "1.0.39", + "debug": "^4.3.5", + "enhanced-resolve": "^5.15.0", + "eslint-module-utils": "^2.8.1", + "fast-glob": "^3.3.2", + "get-tsconfig": "^4.7.5", + "is-bun-module": "^1.0.2", "is-glob": "^4.0.3" }, "engines": { @@ -4170,11 +3787,20 @@ }, "peerDependencies": { "eslint": "*", - "eslint-plugin-import": "*" + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } } }, "node_modules/eslint-module-utils": { - "version": "2.8.1", + "version": "2.12.0", "dev": true, "license": "MIT", "dependencies": { @@ -4198,33 +3824,35 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.29.1", + "version": "2.31.0", "dev": true, "license": "MIT", "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", "array.prototype.flat": "^1.3.2", "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", + "eslint-module-utils": "^2.12.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.8", "tsconfig-paths": "^3.15.0" }, "engines": { "node": ">=4" }, "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, "node_modules/eslint-plugin-import/node_modules/debug": { @@ -4255,67 +3883,75 @@ } }, "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.8.0", + "version": "6.10.0", "dev": true, "license": "MIT", "dependencies": { - "@babel/runtime": "^7.23.2", - "aria-query": "^5.3.0", - "array-includes": "^3.1.7", + "aria-query": "~5.1.3", + "array-includes": "^3.1.8", "array.prototype.flatmap": "^1.3.2", "ast-types-flow": "^0.0.8", - "axe-core": "=4.7.0", - "axobject-query": "^3.2.1", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", - "es-iterator-helpers": "^1.0.15", - "hasown": "^2.0.0", + "es-iterator-helpers": "^1.0.19", + "hasown": "^2.0.2", "jsx-ast-utils": "^3.3.5", "language-tags": "^1.0.9", "minimatch": "^3.1.2", - "object.entries": "^1.1.7", - "object.fromentries": "^2.0.7" + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.0" }, "engines": { "node": ">=4.0" }, "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/aria-query": { + "version": "5.1.3", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "deep-equal": "^2.0.5" } }, "node_modules/eslint-plugin-react": { - "version": "7.34.0", + "version": "7.37.1", "dev": true, "license": "MIT", "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlast": "^1.2.4", + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", "array.prototype.flatmap": "^1.3.2", - "array.prototype.toreversed": "^1.1.2", - "array.prototype.tosorted": "^1.1.3", + "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.17", + "es-iterator-helpers": "^1.0.19", "estraverse": "^5.3.0", + "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", - "object.entries": "^1.1.7", - "object.fromentries": "^2.0.7", - "object.hasown": "^1.1.3", - "object.values": "^1.1.7", + "object.entries": "^1.1.8", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.0", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.5", "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.10" + "string.prototype.matchall": "^4.0.11", + "string.prototype.repeat": "^1.0.0" }, "engines": { "node": ">=4" }, "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.0", + "version": "4.6.2", "dev": true, "license": "MIT", "engines": { @@ -4375,30 +4011,15 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://opencollective.com/eslint" } }, "node_modules/esniff": { @@ -4444,7 +4065,7 @@ } }, "node_modules/esquery": { - "version": "1.5.0", + "version": "1.6.0", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -4557,6 +4178,7 @@ "resolved": "https://registry.npmjs.org/fantasticon/-/fantasticon-3.0.0.tgz", "integrity": "sha512-PylulixZA8I0SeiUKtuyOhwrz/ojZTSA1KXddipvEyQXCVrpPMTnSXzaE9nXXK7nCjJWFkqoBAQ1aBdaxMltrg==", "dev": true, + "license": "MIT", "dependencies": { "case": "^1.6.3", "cli-color": "^2.0.4", @@ -4585,14 +4207,6 @@ "balanced-match": "^1.0.0" } }, - "node_modules/fantasticon/node_modules/commander": { - "version": "12.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, "node_modules/fantasticon/node_modules/glob": { "version": "10.4.5", "dev": true, @@ -4613,15 +4227,12 @@ } }, "node_modules/fantasticon/node_modules/jackspeak": { - "version": "3.4.2", + "version": "3.4.3", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, - "engines": { - "node": "14 >=14.21 || 16 >=16.20 || >=18" - }, "funding": { "url": "https://github.com/sponsors/isaacs" }, @@ -4769,7 +4380,7 @@ } }, "node_modules/foreground-child": { - "version": "3.2.1", + "version": "3.3.0", "dev": true, "license": "ISC", "dependencies": { @@ -4828,20 +4439,6 @@ "dev": true, "license": "ISC" }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/function-bind": { "version": "1.1.2", "dev": true, @@ -4986,7 +4583,7 @@ } }, "node_modules/get-tsconfig": { - "version": "4.7.2", + "version": "4.8.1", "dev": true, "license": "MIT", "dependencies": { @@ -4998,9 +4595,8 @@ }, "node_modules/glob": { "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", "dev": true, + "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^2.3.5", @@ -5031,18 +4627,16 @@ }, "node_modules/glob/node_modules/brace-expansion": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/glob/node_modules/minimatch": { "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -5068,11 +4662,12 @@ } }, "node_modules/globalthis": { - "version": "1.0.3", + "version": "1.0.4", "dev": true, "license": "MIT", "dependencies": { - "define-properties": "^1.1.3" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -5228,7 +4823,7 @@ "license": "ISC" }, "node_modules/hasown": { - "version": "2.0.1", + "version": "2.0.2", "dev": true, "license": "MIT", "dependencies": { @@ -5312,7 +4907,7 @@ } }, "node_modules/ignore": { - "version": "5.3.1", + "version": "5.3.2", "dev": true, "license": "MIT", "engines": { @@ -5320,7 +4915,7 @@ } }, "node_modules/immer": { - "version": "10.0.3", + "version": "10.1.1", "license": "MIT", "funding": { "type": "opencollective", @@ -5343,7 +4938,7 @@ } }, "node_modules/import-local": { - "version": "3.1.0", + "version": "3.2.0", "dev": true, "license": "MIT", "dependencies": { @@ -5427,10 +5022,20 @@ "node": ">= 12" } }, - "node_modules/ip-address/node_modules/sprintf-js": { - "version": "1.1.3", + "node_modules/is-arguments": { + "version": "1.1.1", "dev": true, - "license": "BSD-3-Clause" + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/is-array-buffer": { "version": "3.0.4", @@ -5492,6 +5097,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-bun-module": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.6.3" + } + }, "node_modules/is-callable": { "version": "1.2.7", "dev": true, @@ -5504,11 +5117,28 @@ } }, "node_modules/is-core-module": { - "version": "2.13.1", + "version": "2.15.1", "dev": true, "license": "MIT", "dependencies": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5594,9 +5224,12 @@ "license": "MIT" }, "node_modules/is-map": { - "version": "2.0.2", + "version": "2.0.3", "dev": true, "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -5668,9 +5301,12 @@ } }, "node_modules/is-set": { - "version": "2.0.2", + "version": "2.0.3", "dev": true, "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -5743,9 +5379,12 @@ } }, "node_modules/is-weakmap": { - "version": "2.0.1", + "version": "2.0.2", "dev": true, "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -5762,12 +5401,15 @@ } }, "node_modules/is-weakset": { - "version": "2.0.2", + "version": "2.0.3", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5792,7 +5434,7 @@ } }, "node_modules/istanbul-lib-instrument": { - "version": "6.0.2", + "version": "6.0.3", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -5845,7 +5487,7 @@ } }, "node_modules/iterator.prototype": { - "version": "1.1.2", + "version": "1.1.3", "dev": true, "license": "MIT", "dependencies": { @@ -5854,13 +5496,15 @@ "has-symbols": "^1.0.3", "reflect.getprototypeof": "^1.0.4", "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/jackspeak": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -5879,6 +5523,7 @@ "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", @@ -5943,19 +5588,15 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-circus/node_modules/chalk": { - "version": "4.1.2", + "node_modules/jest-circus/node_modules/ansi-styles": { + "version": "5.2.0", "dev": true, "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-circus/node_modules/pretty-format": { @@ -5971,19 +5612,8 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-circus/node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/jest-circus/node_modules/react-is": { - "version": "18.2.0", + "version": "18.3.1", "dev": true, "license": "MIT" }, @@ -6019,21 +5649,6 @@ } } }, - "node_modules/jest-cli/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/jest-config": { "version": "29.7.0", "dev": true, @@ -6078,19 +5693,15 @@ } } }, - "node_modules/jest-config/node_modules/chalk": { - "version": "4.1.2", + "node_modules/jest-config/node_modules/ansi-styles": { + "version": "5.2.0", "dev": true, "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-config/node_modules/glob": { @@ -6125,19 +5736,8 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-config/node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/jest-config/node_modules/react-is": { - "version": "18.2.0", + "version": "18.3.1", "dev": true, "license": "MIT" }, @@ -6155,19 +5755,15 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-diff/node_modules/chalk": { - "version": "4.1.2", + "node_modules/jest-diff/node_modules/ansi-styles": { + "version": "5.2.0", "dev": true, "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-diff/node_modules/pretty-format": { @@ -6183,19 +5779,8 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-diff/node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/jest-diff/node_modules/react-is": { - "version": "18.2.0", + "version": "18.3.1", "dev": true, "license": "MIT" }, @@ -6225,19 +5810,15 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-each/node_modules/chalk": { - "version": "4.1.2", + "node_modules/jest-each/node_modules/ansi-styles": { + "version": "5.2.0", "dev": true, "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-each/node_modules/pretty-format": { @@ -6253,19 +5834,8 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-each/node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/jest-each/node_modules/react-is": { - "version": "18.2.0", + "version": "18.3.1", "dev": true, "license": "MIT" }, @@ -6274,6 +5844,7 @@ "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz", "integrity": "sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==", "dev": true, + "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -6381,7 +5952,7 @@ } }, "node_modules/jest-leak-detector/node_modules/react-is": { - "version": "18.2.0", + "version": "18.3.1", "dev": true, "license": "MIT" }, @@ -6399,19 +5970,15 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-matcher-utils/node_modules/chalk": { - "version": "4.1.2", + "node_modules/jest-matcher-utils/node_modules/ansi-styles": { + "version": "5.2.0", "dev": true, "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-matcher-utils/node_modules/pretty-format": { @@ -6427,19 +5994,8 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-matcher-utils/node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/jest-matcher-utils/node_modules/react-is": { - "version": "18.2.0", + "version": "18.3.1", "dev": true, "license": "MIT" }, @@ -6462,19 +6018,15 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-message-util/node_modules/chalk": { - "version": "4.1.2", + "node_modules/jest-message-util/node_modules/ansi-styles": { + "version": "5.2.0", "dev": true, "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-message-util/node_modules/pretty-format": { @@ -6490,19 +6042,8 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-message-util/node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/jest-message-util/node_modules/react-is": { - "version": "18.2.0", + "version": "18.3.1", "dev": true, "license": "MIT" }, @@ -6563,30 +6104,15 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve/node_modules/chalk": { - "version": "4.1.2", + "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner": { @@ -6620,21 +6146,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-runner/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/jest-runtime": { "version": "29.7.0", "dev": true, @@ -6667,21 +6178,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-runtime/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/jest-runtime/node_modules/glob": { "version": "7.2.3", "dev": true, @@ -6731,19 +6227,15 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-snapshot/node_modules/chalk": { - "version": "4.1.2", + "node_modules/jest-snapshot/node_modules/ansi-styles": { + "version": "5.2.0", "dev": true, "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-snapshot/node_modules/pretty-format": { @@ -6759,19 +6251,8 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-snapshot/node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/jest-snapshot/node_modules/react-is": { - "version": "18.2.0", + "version": "18.3.1", "dev": true, "license": "MIT" }, @@ -6791,21 +6272,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-util/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/jest-validate": { "version": "29.7.0", "dev": true, @@ -6822,30 +6288,26 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", + "node_modules/jest-validate/node_modules/ansi-styles": { + "version": "5.2.0", "dev": true, "license": "MIT", "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/jest-validate/node_modules/chalk": { - "version": "4.1.2", + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", "dev": true, "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/jest-validate/node_modules/pretty-format": { @@ -6861,19 +6323,8 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-validate/node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/jest-validate/node_modules/react-is": { - "version": "18.2.0", + "version": "18.3.1", "dev": true, "license": "MIT" }, @@ -6895,21 +6346,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-watcher/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/jest-worker": { "version": "29.7.0", "dev": true, @@ -7003,14 +6439,14 @@ } }, "node_modules/jsesc": { - "version": "2.5.2", + "version": "3.0.2", "dev": true, "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/json-buffer": { @@ -7075,7 +6511,7 @@ } }, "node_modules/language-subtag-registry": { - "version": "0.3.22", + "version": "0.3.23", "dev": true, "license": "CC0-1.0" }, @@ -7140,7 +6576,7 @@ "license": "MIT" }, "node_modules/loglevel": { - "version": "1.9.1", + "version": "1.9.2", "dev": true, "license": "MIT", "engines": { @@ -7326,18 +6762,21 @@ } }, "node_modules/memoizee": { - "version": "0.4.15", + "version": "0.4.17", "dev": true, "license": "ISC", "dependencies": { - "d": "^1.0.1", - "es5-ext": "^0.10.53", + "d": "^1.0.2", + "es5-ext": "^0.10.64", "es6-weak-map": "^2.0.3", "event-emitter": "^0.3.5", "is-promise": "^2.2.2", "lru-queue": "^0.1.0", "next-tick": "^1.1.0", "timers-ext": "^0.1.7" + }, + "engines": { + "node": ">=0.12" } }, "node_modules/merge-stream": { @@ -7360,9 +6799,8 @@ }, "node_modules/micromatch": { "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, + "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -7613,7 +7051,7 @@ } }, "node_modules/ms": { - "version": "2.1.2", + "version": "2.1.3", "dev": true, "license": "MIT" }, @@ -7657,11 +7095,12 @@ "license": "MIT" }, "node_modules/next": { - "version": "14.2.13", - "resolved": "https://registry.npmjs.org/next/-/next-14.2.13.tgz", - "integrity": "sha512-BseY9YNw8QJSwLYD7hlZzl6QVDoSFHL/URN5K64kVEVpCsSOWeyjbIGK+dZUaRViHTaMQX8aqmnn0PHBbGZezg==", + "version": "14.2.15", + "resolved": "https://registry.npmjs.org/next/-/next-14.2.15.tgz", + "integrity": "sha512-h9ctmOokpoDphRvMGnwOJAedT6zKhwqyZML9mDtspgf4Rh3Pn7UTYKqePNoDvhsWBAO5GoPNYshnAUGIazVGmw==", + "license": "MIT", "dependencies": { - "@next/env": "14.2.13", + "@next/env": "14.2.15", "@swc/helpers": "0.5.5", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001579", @@ -7676,15 +7115,15 @@ "node": ">=18.17.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "14.2.13", - "@next/swc-darwin-x64": "14.2.13", - "@next/swc-linux-arm64-gnu": "14.2.13", - "@next/swc-linux-arm64-musl": "14.2.13", - "@next/swc-linux-x64-gnu": "14.2.13", - "@next/swc-linux-x64-musl": "14.2.13", - "@next/swc-win32-arm64-msvc": "14.2.13", - "@next/swc-win32-ia32-msvc": "14.2.13", - "@next/swc-win32-x64-msvc": "14.2.13" + "@next/swc-darwin-arm64": "14.2.15", + "@next/swc-darwin-x64": "14.2.15", + "@next/swc-linux-arm64-gnu": "14.2.15", + "@next/swc-linux-arm64-musl": "14.2.15", + "@next/swc-linux-x64-gnu": "14.2.15", + "@next/swc-linux-x64-musl": "14.2.15", + "@next/swc-win32-arm64-msvc": "14.2.15", + "@next/swc-win32-ia32-msvc": "14.2.15", + "@next/swc-win32-x64-msvc": "14.2.15" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", @@ -7710,6 +7149,7 @@ "resolved": "https://registry.npmjs.org/next-router-mock/-/next-router-mock-0.9.13.tgz", "integrity": "sha512-906n2RRaE6Y28PfYJbaz5XZeJ6Tw8Xz1S6E31GGwZ0sXB6/XjldD1/2azn1ZmBmRk5PQRkzjg+n+RHZe5xQzWA==", "dev": true, + "license": "MIT", "peerDependencies": { "next": ">=10.0.0", "react": ">=17.0.0" @@ -7769,7 +7209,7 @@ "license": "MIT" }, "node_modules/node-releases": { - "version": "2.0.14", + "version": "2.0.18", "dev": true, "license": "MIT" }, @@ -7821,7 +7261,7 @@ } }, "node_modules/nwsapi": { - "version": "2.2.7", + "version": "2.2.13", "dev": true, "license": "MIT" }, @@ -7833,9 +7273,27 @@ } }, "node_modules/object-inspect": { - "version": "1.13.1", + "version": "1.13.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.6", "dev": true, "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -7866,26 +7324,27 @@ } }, "node_modules/object.entries": { - "version": "1.1.7", + "version": "1.1.8", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" } }, "node_modules/object.fromentries": { - "version": "2.0.7", + "version": "2.0.8", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -7895,37 +7354,26 @@ } }, "node_modules/object.groupby": { - "version": "1.0.2", + "version": "1.0.3", "dev": true, "license": "MIT", "dependencies": { - "array.prototype.filter": "^1.0.3", - "call-bind": "^1.0.5", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.0.0" - } - }, - "node_modules/object.hasown": { - "version": "1.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "es-abstract": "^1.23.2" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 0.4" } }, "node_modules/object.values": { - "version": "1.1.7", + "version": "1.2.0", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -7957,16 +7405,16 @@ } }, "node_modules/optionator": { - "version": "0.9.3", + "version": "0.9.4", "dev": true, "license": "MIT", "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, "engines": { "node": ">= 0.8.0" @@ -8023,7 +7471,7 @@ } }, "node_modules/package-json-from-dist": { - "version": "1.0.0", + "version": "1.0.1", "dev": true, "license": "BlueOak-1.0.0" }, @@ -8129,7 +7577,7 @@ } }, "node_modules/picocolors": { - "version": "1.0.0", + "version": "1.1.0", "license": "ISC" }, "node_modules/picomatch": { @@ -8240,68 +7688,168 @@ "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, - "engines": { - "node": "^10 || ^12 || >=14" + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-eslint": { + "version": "16.3.0", + "resolved": "https://registry.npmjs.org/prettier-eslint/-/prettier-eslint-16.3.0.tgz", + "integrity": "sha512-Lh102TIFCr11PJKUMQ2kwNmxGhTsv/KzUg9QYF2Gkw259g/kPgndZDWavk7/ycbRvj2oz4BPZ1gCU8bhfZH/Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/parser": "^6.7.5", + "common-tags": "^1.4.0", + "dlv": "^1.1.0", + "eslint": "^8.7.0", + "indent-string": "^4.0.0", + "lodash.merge": "^4.6.0", + "loglevel-colored-level-prefix": "^1.0.0", + "prettier": "^3.0.1", + "pretty-format": "^29.7.0", + "require-relative": "^0.8.7", + "typescript": "^5.2.2", + "vue-eslint-parser": "^9.1.0" + }, + "engines": { + "node": ">=16.10.0" + }, + "peerDependencies": { + "prettier-plugin-svelte": "^3.0.0", + "svelte-eslint-parser": "*" + }, + "peerDependenciesMeta": { + "prettier-plugin-svelte": { + "optional": true + }, + "svelte-eslint-parser": { + "optional": true + } + } + }, + "node_modules/prettier-eslint/node_modules/@typescript-eslint/parser": { + "version": "6.21.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/prelude-ls": { - "version": "1.2.1", + "node_modules/prettier-eslint/node_modules/@typescript-eslint/scope-manager": { + "version": "6.21.0", "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" + }, "engines": { - "node": ">= 0.8.0" + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/prettier": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", - "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "node_modules/prettier-eslint/node_modules/@typescript-eslint/types": { + "version": "6.21.0", "dev": true, - "bin": { - "prettier": "bin/prettier.cjs" - }, + "license": "MIT", "engines": { - "node": ">=14" + "node": "^16.0.0 || >=18.0.0" }, "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/prettier-eslint": { - "version": "16.3.0", - "resolved": "https://registry.npmjs.org/prettier-eslint/-/prettier-eslint-16.3.0.tgz", - "integrity": "sha512-Lh102TIFCr11PJKUMQ2kwNmxGhTsv/KzUg9QYF2Gkw259g/kPgndZDWavk7/ycbRvj2oz4BPZ1gCU8bhfZH/Xg==", + "node_modules/prettier-eslint/node_modules/@typescript-eslint/typescript-estree": { + "version": "6.21.0", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/parser": "^6.7.5", - "common-tags": "^1.4.0", - "dlv": "^1.1.0", - "eslint": "^8.7.0", - "indent-string": "^4.0.0", - "lodash.merge": "^4.6.0", - "loglevel-colored-level-prefix": "^1.0.0", - "prettier": "^3.0.1", - "pretty-format": "^29.7.0", - "require-relative": "^0.8.7", - "typescript": "^5.2.2", - "vue-eslint-parser": "^9.1.0" + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": ">=16.10.0" + "node": "^16.0.0 || >=18.0.0" }, - "peerDependencies": { - "prettier-plugin-svelte": "^3.0.0", - "svelte-eslint-parser": "*" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependenciesMeta": { - "prettier-plugin-svelte": { - "optional": true - }, - "svelte-eslint-parser": { + "typescript": { "optional": true } } }, + "node_modules/prettier-eslint/node_modules/@typescript-eslint/visitor-keys": { + "version": "6.21.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/prettier-eslint/node_modules/ansi-styles": { "version": "5.2.0", "dev": true, @@ -8313,6 +7861,28 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/prettier-eslint/node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/prettier-eslint/node_modules/minimatch": { + "version": "9.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/prettier-eslint/node_modules/pretty-format": { "version": "29.7.0", "dev": true, @@ -8327,7 +7897,7 @@ } }, "node_modules/prettier-eslint/node_modules/react-is": { - "version": "18.2.0", + "version": "18.3.1", "dev": true, "license": "MIT" }, @@ -8428,7 +7998,7 @@ } }, "node_modules/pure-rand": { - "version": "6.0.4", + "version": "6.1.0", "dev": true, "funding": [ { @@ -8470,6 +8040,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" }, @@ -8478,9 +8049,10 @@ } }, "node_modules/react-bootstrap": { - "version": "2.10.4", - "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-2.10.4.tgz", - "integrity": "sha512-W3398nBM2CBfmGP2evneEO3ZZwEMPtHs72q++eNw60uDGDAdiGn0f9yNys91eo7/y8CTF5Ke1C0QO8JFVPU40Q==", + "version": "2.10.5", + "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-2.10.5.tgz", + "integrity": "sha512-XueAOEn64RRkZ0s6yzUTdpFtdUXs5L5491QU//8ZcODKJNDLt/r01tNyriZccjgRImH1REynUc9pqjiRMpDLWQ==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.24.7", "@restart/hooks": "^0.4.9", @@ -8510,6 +8082,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/react-chartjs-2/-/react-chartjs-2-5.2.0.tgz", "integrity": "sha512-98iN5aguJyVSxp5U3CblRLH67J8gkfyGNbiK3c+l1QI/G4irHMPQw44aEPmjVag+YKTyQ260NcF82GTQ3bdscA==", + "license": "MIT", "peerDependencies": { "chart.js": "^4.1.1", "react": "^16.8.0 || ^17.0.0 || ^18.0.0" @@ -8519,6 +8092,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -8541,6 +8115,7 @@ "version": "9.1.2", "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.1.2.tgz", "integrity": "sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w==", + "license": "MIT", "dependencies": { "@types/use-sync-external-store": "^0.0.3", "use-sync-external-store": "^1.0.0" @@ -8610,15 +8185,15 @@ } }, "node_modules/reflect.getprototypeof": { - "version": "1.0.5", + "version": "1.0.6", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.0.0", - "get-intrinsic": "^1.2.3", + "es-abstract": "^1.23.1", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", "globalthis": "^1.0.3", "which-builtin-type": "^1.1.3" }, @@ -8634,14 +8209,14 @@ "license": "MIT" }, "node_modules/regexp.prototype.flags": { - "version": "1.5.2", + "version": "1.5.3", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" + "set-function-name": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -8669,7 +8244,7 @@ "license": "MIT" }, "node_modules/reselect": { - "version": "5.1.0", + "version": "5.1.1", "license": "MIT" }, "node_modules/resolve": { @@ -8804,12 +8379,12 @@ } }, "node_modules/safe-array-concat": { - "version": "1.1.0", + "version": "1.1.2", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", - "get-intrinsic": "^1.2.2", + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, @@ -8861,7 +8436,7 @@ "license": "MIT" }, "node_modules/sax": { - "version": "1.3.0", + "version": "1.4.1", "dev": true, "license": "ISC" }, @@ -8884,12 +8459,9 @@ } }, "node_modules/semver": { - "version": "7.6.0", + "version": "7.6.3", "dev": true, "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -8897,38 +8469,22 @@ "node": ">=10" } }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "dev": true, - "license": "ISC" - }, "node_modules/set-blocking": { "version": "2.0.0", "dev": true, "license": "ISC" }, "node_modules/set-function-length": { - "version": "1.2.1", + "version": "1.2.2", "dev": true, "license": "MIT", "dependencies": { - "define-data-property": "^1.1.2", + "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.3", + "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.1" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -9060,7 +8616,7 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", + "version": "1.2.1", "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -9076,7 +8632,7 @@ } }, "node_modules/sprintf-js": { - "version": "1.0.3", + "version": "1.1.3", "dev": true, "license": "BSD-3-Clause" }, @@ -9126,6 +8682,17 @@ "node": ">=8" } }, + "node_modules/stop-iteration-iterator": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "internal-slot": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/streamsearch": { "version": "1.1.0", "engines": { @@ -9188,7 +8755,7 @@ "license": "MIT" }, "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.0.1", + "version": "6.1.0", "dev": true, "license": "MIT", "engines": { @@ -9212,33 +8779,58 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, + "node_modules/string.prototype.includes": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, "node_modules/string.prototype.matchall": { - "version": "4.0.10", + "version": "4.0.11", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "regexp.prototype.flags": "^1.5.0", - "set-function-name": "^2.0.0", - "side-channel": "^1.0.4" + "internal-slot": "^1.0.7", + "regexp.prototype.flags": "^1.5.2", + "set-function-name": "^2.0.2", + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, "node_modules/string.prototype.trim": { - "version": "1.2.8", + "version": "1.2.9", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -9248,26 +8840,29 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.7", + "version": "1.0.8", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.7", + "version": "1.0.8", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -9426,6 +9021,14 @@ "balanced-match": "^1.0.0" } }, + "node_modules/svgicons2svgfont/node_modules/commander": { + "version": "9.5.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || >=14" + } + }, "node_modules/svgicons2svgfont/node_modules/glob": { "version": "8.1.0", "dev": true, @@ -9543,12 +9146,15 @@ "license": "MIT" }, "node_modules/timers-ext": { - "version": "0.1.7", + "version": "0.1.8", "dev": true, "license": "ISC", "dependencies": { - "es5-ext": "~0.10.46", - "next-tick": "1" + "es5-ext": "^0.10.64", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.12" } }, "node_modules/tmpl": { @@ -9576,7 +9182,7 @@ } }, "node_modules/tough-cookie": { - "version": "4.1.3", + "version": "4.1.4", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -9601,7 +9207,7 @@ } }, "node_modules/ts-api-utils": { - "version": "1.2.1", + "version": "1.3.0", "dev": true, "license": "MIT", "engines": { @@ -9642,7 +9248,7 @@ } }, "node_modules/tslib": { - "version": "2.6.2", + "version": "2.7.0", "license": "0BSD" }, "node_modules/ttf2eot": { @@ -9687,7 +9293,7 @@ } }, "node_modules/type": { - "version": "2.7.2", + "version": "2.7.3", "dev": true, "license": "ISC" }, @@ -9772,7 +9378,7 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.5", + "version": "1.0.6", "dev": true, "license": "MIT", "dependencies": { @@ -9791,7 +9397,7 @@ } }, "node_modules/typescript": { - "version": "5.4.2", + "version": "5.6.3", "dev": true, "license": "Apache-2.0", "bin": { @@ -9803,7 +9409,7 @@ } }, "node_modules/uglify-js": { - "version": "3.17.4", + "version": "3.19.3", "dev": true, "license": "BSD-2-Clause", "optional": true, @@ -9842,7 +9448,7 @@ } }, "node_modules/undici-types": { - "version": "5.26.5", + "version": "6.19.8", "dev": true, "license": "MIT" }, @@ -9877,7 +9483,7 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.13", + "version": "1.1.1", "dev": true, "funding": [ { @@ -9895,8 +9501,8 @@ ], "license": "MIT", "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.2.0", + "picocolors": "^1.1.0" }, "bin": { "update-browserslist-db": "cli.js" @@ -9923,7 +9529,7 @@ } }, "node_modules/use-sync-external-store": { - "version": "1.2.0", + "version": "1.2.2", "license": "MIT", "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0" @@ -9935,7 +9541,7 @@ "license": "MIT" }, "node_modules/v8-to-istanbul": { - "version": "9.2.0", + "version": "9.3.0", "dev": true, "license": "ISC", "dependencies": { @@ -9948,7 +9554,7 @@ } }, "node_modules/vue-eslint-parser": { - "version": "9.4.2", + "version": "9.4.3", "dev": true, "license": "MIT", "dependencies": { @@ -10065,12 +9671,12 @@ } }, "node_modules/which-builtin-type": { - "version": "1.1.3", + "version": "1.1.4", "dev": true, "license": "MIT", "dependencies": { - "function.prototype.name": "^1.1.5", - "has-tostringtag": "^1.0.0", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", "is-date-object": "^1.0.5", "is-finalizationregistry": "^1.0.2", @@ -10079,8 +9685,8 @@ "is-weakref": "^1.0.2", "isarray": "^2.0.5", "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.15" }, "engines": { "node": ">= 0.4" @@ -10090,29 +9696,32 @@ } }, "node_modules/which-collection": { - "version": "1.0.1", + "version": "1.0.2", "dev": true, "license": "MIT", "dependencies": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/which-typed-array": { - "version": "1.1.14", + "version": "1.1.15", "dev": true, "license": "MIT", "dependencies": { - "available-typed-arrays": "^1.0.6", - "call-bind": "^1.0.5", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.1" + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -10147,6 +9756,14 @@ "node": ">=8" } }, + "node_modules/word-wrap": { + "version": "1.2.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wordwrap": { "version": "1.0.0", "dev": true, @@ -10204,7 +9821,7 @@ } }, "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.0.1", + "version": "6.1.0", "dev": true, "license": "MIT", "engines": { diff --git a/mithril-explorer/package.json b/mithril-explorer/package.json index 141e178d9ae..41ca7fd3d81 100644 --- a/mithril-explorer/package.json +++ b/mithril-explorer/package.json @@ -1,6 +1,6 @@ { "name": "mithril-explorer", - "version": "0.7.8", + "version": "0.7.9", "private": true, "scripts": { "dev": "next dev", @@ -15,13 +15,13 @@ "dependencies": { "@mithril-dev/mithril-client-wasm": "file:../mithril-client-wasm/pkg", "@popperjs/core": "^2.11.8", - "@reduxjs/toolkit": "^2.2.7", + "@reduxjs/toolkit": "^2.2.8", "bootstrap": "^5.3.3", "bootstrap-icons": "^1.11.3", "chart.js": "^4.4.4", - "next": "^14.2.13", + "next": "^14.2.15", "react": "^18.3.1", - "react-bootstrap": "^2.10.4", + "react-bootstrap": "^2.10.5", "react-chartjs-2": "^5.2.0", "react-dom": "^18.3.1", "react-redux": "^9.1.2" @@ -30,7 +30,7 @@ "@testing-library/jest-dom": "^6.5.0", "@testing-library/react": "^16.0.1", "eslint": "^8.57.1", - "eslint-config-next": "^14.2.13", + "eslint-config-next": "^14.2.15", "fantasticon": "^3.0.0", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", From 49e2230655bee1c40c2cdb01f1e13dd1e1f0f987 Mon Sep 17 00:00:00 2001 From: Damien Lachaume <135982616+dlachaume@users.noreply.github.com> Date: Wed, 9 Oct 2024 10:44:08 +0200 Subject: [PATCH 200/274] chore: upgrade `www` and `www-test` dependencies and bump packages versions --- .../www-test/package-lock.json | 220 ++++++++---------- mithril-client-wasm/www-test/package.json | 4 +- mithril-client-wasm/www/package-lock.json | 219 ++++++++--------- mithril-client-wasm/www/package.json | 4 +- 4 files changed, 187 insertions(+), 260 deletions(-) diff --git a/mithril-client-wasm/www-test/package-lock.json b/mithril-client-wasm/www-test/package-lock.json index 97b208fa12e..9d662a9aad6 100644 --- a/mithril-client-wasm/www-test/package-lock.json +++ b/mithril-client-wasm/www-test/package-lock.json @@ -1,12 +1,12 @@ { "name": "www-test", - "version": "0.2.2", + "version": "0.2.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "www-test", - "version": "0.2.2", + "version": "0.2.4", "dependencies": { "@mithril-dev/mithril-client-wasm": "file:../pkg" }, @@ -14,14 +14,14 @@ "copy-webpack-plugin": "^12.0.2", "dotenv-webpack": "^8.1.0", "prettier": "^3.3.2", - "webpack": "^5.94.0", + "webpack": "^5.95.0", "webpack-cli": "^5.1.4", "webpack-dev-server": "^5.1.0" } }, "../pkg": { "name": "mithril-client-wasm", - "version": "0.4.2", + "version": "0.5.1", "license": "Apache-2.0" }, "node_modules/@discoveryjs/json-ext": { @@ -645,10 +645,9 @@ } }, "node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "version": "1.20.2", "dev": true, + "license": "MIT", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", @@ -658,7 +657,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.13.0", + "qs": "6.11.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -670,9 +669,8 @@ }, "node_modules/body-parser/node_modules/bytes": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -757,9 +755,8 @@ }, "node_modules/call-bind": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -912,9 +909,8 @@ }, "node_modules/content-type": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -937,6 +933,7 @@ "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-12.0.2.tgz", "integrity": "sha512-SNwdBeHyII+rWvee/bTnAYyO8vfVdcSTud4EIb6jcZ8inLeWucJE0DnxXQBjlQ5zlteuuvooGQy3LIyGxhvlOA==", "dev": true, + "license": "MIT", "dependencies": { "fast-glob": "^3.3.2", "glob-parent": "^6.0.1", @@ -1010,9 +1007,8 @@ }, "node_modules/define-data-property": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -1038,18 +1034,16 @@ }, "node_modules/depd": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/destroy": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" @@ -1092,6 +1086,7 @@ "resolved": "https://registry.npmjs.org/dotenv-webpack/-/dotenv-webpack-8.1.0.tgz", "integrity": "sha512-owK1JcsPkIobeqjVrk6h7jPED/W6ZpdFsMPR+5ursB7/SdgDyO+VzAU+szK8C8u3qUhtENyYnj8eyXMR5kkGag==", "dev": true, + "license": "MIT", "dependencies": { "dotenv-defaults": "^2.0.2" }, @@ -1113,10 +1108,9 @@ "license": "ISC" }, "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "version": "1.0.2", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -1146,9 +1140,8 @@ }, "node_modules/es-define-property": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", "dev": true, + "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.4" }, @@ -1158,9 +1151,8 @@ }, "node_modules/es-errors": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -1224,9 +1216,8 @@ }, "node_modules/etag": { "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -1245,37 +1236,36 @@ } }, "node_modules/express": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", - "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", + "version": "4.19.2", "dev": true, + "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.3", + "body-parser": "1.20.2", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.6.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~2.0.0", + "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.3.1", + "finalhandler": "1.2.0", "fresh": "0.5.2", "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", + "merge-descriptors": "1.0.1", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.10", + "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.13.0", + "qs": "6.11.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", + "send": "0.18.0", + "serve-static": "1.15.0", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -1361,13 +1351,12 @@ } }, "node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "version": "1.2.0", "dev": true, + "license": "MIT", "dependencies": { "debug": "2.6.9", - "encodeurl": "~2.0.0", + "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", @@ -1427,13 +1416,24 @@ }, "node_modules/fresh": { "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, + "node_modules/fsevents": { + "version": "2.3.3", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/function-bind": { "version": "1.1.2", "dev": true, @@ -1444,9 +1444,8 @@ }, "node_modules/get-intrinsic": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", @@ -1498,9 +1497,8 @@ }, "node_modules/gopd": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dev": true, + "license": "MIT", "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -1528,9 +1526,8 @@ }, "node_modules/has-property-descriptors": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" }, @@ -1540,9 +1537,8 @@ }, "node_modules/has-proto": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -1552,9 +1548,8 @@ }, "node_modules/has-symbols": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -1633,9 +1628,8 @@ }, "node_modules/http-errors": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dev": true, + "license": "MIT", "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -1698,9 +1692,8 @@ }, "node_modules/iconv-lite": { "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -1964,9 +1957,8 @@ }, "node_modules/media-typer": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -1990,13 +1982,9 @@ } }, "node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "version": "1.0.1", "dev": true, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "license": "MIT" }, "node_modules/merge-stream": { "version": "2.0.0", @@ -2020,10 +2008,9 @@ } }, "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "version": "4.0.7", "dev": true, + "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -2034,9 +2021,8 @@ }, "node_modules/mime": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true, + "license": "MIT", "bin": { "mime": "cli.js" }, @@ -2121,9 +2107,8 @@ }, "node_modules/object-inspect": { "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -2251,10 +2236,9 @@ "license": "MIT" }, "node_modules/path-to-regexp": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", - "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", - "dev": true + "version": "0.1.7", + "dev": true, + "license": "MIT" }, "node_modules/path-type": { "version": "5.0.0", @@ -2342,12 +2326,11 @@ } }, "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "version": "6.11.0", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.0.6" + "side-channel": "^1.0.4" }, "engines": { "node": ">=0.6" @@ -2393,9 +2376,8 @@ }, "node_modules/raw-body": { "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dev": true, + "license": "MIT", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -2408,9 +2390,8 @@ }, "node_modules/raw-body/node_modules/bytes": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -2569,9 +2550,8 @@ }, "node_modules/safer-buffer": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/schema-utils": { "version": "4.2.0", @@ -2609,10 +2589,9 @@ } }, "node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "version": "0.18.0", "dev": true, + "license": "MIT", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -2632,20 +2611,10 @@ "node": ">= 0.8.0" } }, - "node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/send/node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/serialize-javascript": { "version": "6.0.2", @@ -2713,15 +2682,14 @@ } }, "node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "version": "1.15.0", "dev": true, + "license": "MIT", "dependencies": { - "encodeurl": "~2.0.0", + "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.19.0" + "send": "0.18.0" }, "engines": { "node": ">= 0.8.0" @@ -2729,9 +2697,8 @@ }, "node_modules/set-function-length": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, + "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -2746,9 +2713,8 @@ }, "node_modules/setprototypeof": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/shallow-clone": { "version": "3.0.1", @@ -2790,9 +2756,8 @@ }, "node_modules/side-channel": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -2916,9 +2881,8 @@ }, "node_modules/statuses": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -3088,9 +3052,8 @@ }, "node_modules/toidentifier": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.6" } @@ -3117,9 +3080,8 @@ }, "node_modules/type-is": { "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, + "license": "MIT", "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -3146,9 +3108,8 @@ }, "node_modules/unpipe": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -3240,10 +3201,11 @@ } }, "node_modules/webpack": { - "version": "5.94.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", - "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", + "version": "5.95.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.95.0.tgz", + "integrity": "sha512-2t3XstrKULz41MNMBF+cJ97TyHdyQ8HCt//pqErqDvNjU9YQBnZxIHa11VXsi7F3mb5/aO2tuDxdeTPdU7xu9Q==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "^1.0.5", "@webassemblyjs/ast": "^1.12.1", @@ -3290,6 +3252,7 @@ "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", "dev": true, + "license": "MIT", "dependencies": { "@discoveryjs/json-ext": "^0.5.0", "@webpack-cli/configtest": "^2.1.1", @@ -3371,6 +3334,7 @@ "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.1.0.tgz", "integrity": "sha512-aQpaN81X6tXie1FoOB7xlMfCsN19pSvRAeYUHOdFWOlhpQ/LlbfTqYwwmEDFV0h8GGuqmCmKmT+pxcUV/Nt2gQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/bonjour": "^3.5.13", "@types/connect-history-api-fallback": "^1.5.4", diff --git a/mithril-client-wasm/www-test/package.json b/mithril-client-wasm/www-test/package.json index e3fa8824aa7..7a3d2f3bb92 100644 --- a/mithril-client-wasm/www-test/package.json +++ b/mithril-client-wasm/www-test/package.json @@ -1,6 +1,6 @@ { "name": "www-test", - "version": "0.2.3", + "version": "0.2.4", "private": true, "scripts": { "build": "webpack --config webpack.config.js", @@ -15,7 +15,7 @@ "copy-webpack-plugin": "^12.0.2", "dotenv-webpack": "^8.1.0", "prettier": "^3.3.2", - "webpack": "^5.94.0", + "webpack": "^5.95.0", "webpack-cli": "^5.1.4", "webpack-dev-server": "^5.1.0" } diff --git a/mithril-client-wasm/www/package-lock.json b/mithril-client-wasm/www/package-lock.json index 56d48466dc6..f3ff81484a6 100644 --- a/mithril-client-wasm/www/package-lock.json +++ b/mithril-client-wasm/www/package-lock.json @@ -1,26 +1,26 @@ { "name": "www", - "version": "0.2.2", + "version": "0.2.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "www", - "version": "0.2.2", + "version": "0.2.4", "dependencies": { "@mithril-dev/mithril-client-wasm": "file:../pkg" }, "devDependencies": { "copy-webpack-plugin": "^12.0.2", "prettier": "^3.3.2", - "webpack": "^5.94.0", + "webpack": "^5.95.0", "webpack-cli": "^5.1.4", "webpack-dev-server": "^5.1.0" } }, "../pkg": { "name": "mithril-client-wasm", - "version": "0.4.1", + "version": "0.5.1", "license": "Apache-2.0" }, "node_modules/@discoveryjs/json-ext": { @@ -644,10 +644,9 @@ } }, "node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "version": "1.20.2", "dev": true, + "license": "MIT", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", @@ -657,7 +656,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.13.0", + "qs": "6.11.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -669,9 +668,8 @@ }, "node_modules/body-parser/node_modules/bytes": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -756,9 +754,8 @@ }, "node_modules/call-bind": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -911,9 +908,8 @@ }, "node_modules/content-type": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -936,6 +932,7 @@ "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-12.0.2.tgz", "integrity": "sha512-SNwdBeHyII+rWvee/bTnAYyO8vfVdcSTud4EIb6jcZ8inLeWucJE0DnxXQBjlQ5zlteuuvooGQy3LIyGxhvlOA==", "dev": true, + "license": "MIT", "dependencies": { "fast-glob": "^3.3.2", "glob-parent": "^6.0.1", @@ -1009,9 +1006,8 @@ }, "node_modules/define-data-property": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -1037,18 +1033,16 @@ }, "node_modules/depd": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/destroy": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" @@ -1081,10 +1075,9 @@ "license": "ISC" }, "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "version": "1.0.2", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -1114,9 +1107,8 @@ }, "node_modules/es-define-property": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", "dev": true, + "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.4" }, @@ -1126,9 +1118,8 @@ }, "node_modules/es-errors": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -1192,9 +1183,8 @@ }, "node_modules/etag": { "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -1213,37 +1203,36 @@ } }, "node_modules/express": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", - "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", + "version": "4.19.2", "dev": true, + "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.3", + "body-parser": "1.20.2", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.6.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~2.0.0", + "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.3.1", + "finalhandler": "1.2.0", "fresh": "0.5.2", "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", + "merge-descriptors": "1.0.1", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.10", + "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.13.0", + "qs": "6.11.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", + "send": "0.18.0", + "serve-static": "1.15.0", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -1329,13 +1318,12 @@ } }, "node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "version": "1.2.0", "dev": true, + "license": "MIT", "dependencies": { "debug": "2.6.9", - "encodeurl": "~2.0.0", + "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", @@ -1395,13 +1383,24 @@ }, "node_modules/fresh": { "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, + "node_modules/fsevents": { + "version": "2.3.3", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/function-bind": { "version": "1.1.2", "dev": true, @@ -1412,9 +1411,8 @@ }, "node_modules/get-intrinsic": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", @@ -1466,9 +1464,8 @@ }, "node_modules/gopd": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dev": true, + "license": "MIT", "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -1496,9 +1493,8 @@ }, "node_modules/has-property-descriptors": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" }, @@ -1508,9 +1504,8 @@ }, "node_modules/has-proto": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -1520,9 +1515,8 @@ }, "node_modules/has-symbols": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -1601,9 +1595,8 @@ }, "node_modules/http-errors": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dev": true, + "license": "MIT", "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -1666,9 +1659,8 @@ }, "node_modules/iconv-lite": { "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -1932,9 +1924,8 @@ }, "node_modules/media-typer": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -1958,13 +1949,9 @@ } }, "node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "version": "1.0.1", "dev": true, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "license": "MIT" }, "node_modules/merge-stream": { "version": "2.0.0", @@ -1988,10 +1975,9 @@ } }, "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "version": "4.0.7", "dev": true, + "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -2002,9 +1988,8 @@ }, "node_modules/mime": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true, + "license": "MIT", "bin": { "mime": "cli.js" }, @@ -2089,9 +2074,8 @@ }, "node_modules/object-inspect": { "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -2219,10 +2203,9 @@ "license": "MIT" }, "node_modules/path-to-regexp": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", - "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", - "dev": true + "version": "0.1.7", + "dev": true, + "license": "MIT" }, "node_modules/path-type": { "version": "5.0.0", @@ -2310,12 +2293,11 @@ } }, "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "version": "6.11.0", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.0.6" + "side-channel": "^1.0.4" }, "engines": { "node": ">=0.6" @@ -2361,9 +2343,8 @@ }, "node_modules/raw-body": { "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dev": true, + "license": "MIT", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -2376,9 +2357,8 @@ }, "node_modules/raw-body/node_modules/bytes": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -2537,9 +2517,8 @@ }, "node_modules/safer-buffer": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/schema-utils": { "version": "4.2.0", @@ -2577,10 +2556,9 @@ } }, "node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "version": "0.18.0", "dev": true, + "license": "MIT", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -2600,20 +2578,10 @@ "node": ">= 0.8.0" } }, - "node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/send/node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/serialize-javascript": { "version": "6.0.2", @@ -2681,15 +2649,14 @@ } }, "node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "version": "1.15.0", "dev": true, + "license": "MIT", "dependencies": { - "encodeurl": "~2.0.0", + "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.19.0" + "send": "0.18.0" }, "engines": { "node": ">= 0.8.0" @@ -2697,9 +2664,8 @@ }, "node_modules/set-function-length": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, + "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -2714,9 +2680,8 @@ }, "node_modules/setprototypeof": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/shallow-clone": { "version": "3.0.1", @@ -2758,9 +2723,8 @@ }, "node_modules/side-channel": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -2884,9 +2848,8 @@ }, "node_modules/statuses": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -3056,9 +3019,8 @@ }, "node_modules/toidentifier": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.6" } @@ -3085,9 +3047,8 @@ }, "node_modules/type-is": { "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, + "license": "MIT", "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -3114,9 +3075,8 @@ }, "node_modules/unpipe": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -3208,10 +3168,11 @@ } }, "node_modules/webpack": { - "version": "5.94.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", - "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", + "version": "5.95.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.95.0.tgz", + "integrity": "sha512-2t3XstrKULz41MNMBF+cJ97TyHdyQ8HCt//pqErqDvNjU9YQBnZxIHa11VXsi7F3mb5/aO2tuDxdeTPdU7xu9Q==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "^1.0.5", "@webassemblyjs/ast": "^1.12.1", @@ -3258,6 +3219,7 @@ "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", "dev": true, + "license": "MIT", "dependencies": { "@discoveryjs/json-ext": "^0.5.0", "@webpack-cli/configtest": "^2.1.1", @@ -3339,6 +3301,7 @@ "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.1.0.tgz", "integrity": "sha512-aQpaN81X6tXie1FoOB7xlMfCsN19pSvRAeYUHOdFWOlhpQ/LlbfTqYwwmEDFV0h8GGuqmCmKmT+pxcUV/Nt2gQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/bonjour": "^3.5.13", "@types/connect-history-api-fallback": "^1.5.4", diff --git a/mithril-client-wasm/www/package.json b/mithril-client-wasm/www/package.json index 8b4ac2fa522..044bdd35764 100644 --- a/mithril-client-wasm/www/package.json +++ b/mithril-client-wasm/www/package.json @@ -1,6 +1,6 @@ { "name": "www", - "version": "0.2.3", + "version": "0.2.4", "private": true, "scripts": { "build": "webpack --config webpack.config.js", @@ -14,7 +14,7 @@ "devDependencies": { "copy-webpack-plugin": "^12.0.2", "prettier": "^3.3.2", - "webpack": "^5.94.0", + "webpack": "^5.95.0", "webpack-cli": "^5.1.4", "webpack-dev-server": "^5.1.0" } From 4e700698256d8c30ea509cd6764f524fdcc1a706 Mon Sep 17 00:00:00 2001 From: Damien Lachaume <135982616+dlachaume@users.noreply.github.com> Date: Wed, 9 Oct 2024 12:07:06 +0200 Subject: [PATCH 201/274] refactor: replace ticker service with epoch service in `/register-signer` --- .../src/http_server/routes/middlewares.rs | 9 +--- .../src/http_server/routes/signer_routes.rs | 54 +++++++++++++++---- 2 files changed, 44 insertions(+), 19 deletions(-) diff --git a/mithril-aggregator/src/http_server/routes/middlewares.rs b/mithril-aggregator/src/http_server/routes/middlewares.rs index 49c3c350ce3..89d0f842b70 100644 --- a/mithril-aggregator/src/http_server/routes/middlewares.rs +++ b/mithril-aggregator/src/http_server/routes/middlewares.rs @@ -3,8 +3,8 @@ use std::sync::Arc; use warp::Filter; +use mithril_common::api_version::APIVersionProvider; use mithril_common::entities::SignedEntityConfig; -use mithril_common::{api_version::APIVersionProvider, TickerService}; use crate::database::repository::SignerGetter; use crate::dependency_injection::EpochServiceWrapper; @@ -64,13 +64,6 @@ pub fn with_certifier_service( warp::any().map(move || dependency_manager.certifier_service.clone()) } -/// With ticker service middleware -pub fn with_ticker_service( - dependency_manager: Arc, -) -> impl Filter,), Error = Infallible> + Clone { - warp::any().map(move || dependency_manager.ticker_service.clone()) -} - /// With epoch service middleware pub fn with_epoch_service( dependency_manager: Arc, diff --git a/mithril-aggregator/src/http_server/routes/signer_routes.rs b/mithril-aggregator/src/http_server/routes/signer_routes.rs index 262032a6378..2241cc02de2 100644 --- a/mithril-aggregator/src/http_server/routes/signer_routes.rs +++ b/mithril-aggregator/src/http_server/routes/signer_routes.rs @@ -1,7 +1,9 @@ use std::sync::Arc; +use slog_scope::warn; use warp::Filter; +use crate::dependency_injection::EpochServiceWrapper; use crate::http_server::routes::middlewares; use crate::DependencyContainer; @@ -31,7 +33,7 @@ fn register_signer( .and(middlewares::with_event_transmitter( dependency_manager.clone(), )) - .and(middlewares::with_ticker_service(dependency_manager)) + .and(middlewares::with_epoch_service(dependency_manager)) .and_then(handlers::register_signer) } @@ -56,19 +58,30 @@ fn registered_signers( .and_then(handlers::registered_signers) } +async fn fetch_epoch_header_value(epoch_service: EpochServiceWrapper) -> String { + match epoch_service.read().await.epoch_of_current_data() { + Ok(epoch) => format!("{epoch}"), + Err(e) => { + warn!("Could not fetch epoch header value from Epoch service: {e}"); + String::new() + } + } +} + mod handlers { use crate::database::repository::SignerGetter; + use crate::dependency_injection::EpochServiceWrapper; use crate::entities::{ SignerRegistrationsMessage, SignerTickerListItemMessage, SignersTickersMessage, }; use crate::event_store::{EventMessage, TransmitterService}; + use crate::http_server::routes::signer_routes::fetch_epoch_header_value; use crate::{ http_server::routes::reply, Configuration, SignerRegisterer, SignerRegistrationError, }; use crate::{FromRegisterSignerAdapter, VerificationKeyStorer}; use mithril_common::entities::Epoch; use mithril_common::messages::{RegisterSignerMessage, TryFromMessageAdapter}; - use mithril_common::TickerService; use slog_scope::{debug, trace, warn}; use std::convert::Infallible; use std::sync::Arc; @@ -80,7 +93,7 @@ mod handlers { register_signer_message: RegisterSignerMessage, signer_registerer: Arc, event_transmitter: Arc>, - ticker_service: Arc, + epoch_service: EpochServiceWrapper, ) -> Result { debug!( "⇄ HTTP SERVER: register_signer/{:?}", @@ -109,13 +122,7 @@ mod handlers { None => Vec::new(), }; - let epoch_str = match ticker_service.get_current_epoch().await { - Ok(epoch) => format!("{epoch}"), - Err(e) => { - warn!("Could not read epoch to add in event: {e}"); - String::new() - } - }; + let epoch_str = fetch_epoch_header_value(epoch_service).await; if !epoch_str.is_empty() { headers.push(("epoch", epoch_str.as_str())); } @@ -238,15 +245,17 @@ mod tests { use anyhow::anyhow; use mockall::predicate::eq; use serde_json::Value::Null; + use tokio::sync::RwLock; use warp::{ http::{Method, StatusCode}, test::request, }; - use mithril_common::entities::Epoch; use mithril_common::{ crypto_helper::ProtocolRegistrationError, + entities::Epoch, messages::RegisterSignerMessage, + test_utils::MithrilFixtureBuilder, test_utils::{apispec::APISpec, fake_data}, }; use mithril_persistence::store::adapter::AdapterError; @@ -255,6 +264,7 @@ mod tests { database::{record::SignerRecord, repository::MockSignerGetter}, http_server::SERVER_BASE_PATH, initialize_dependencies, + services::FakeEpochService, signer_registerer::MockSignerRegisterer, store::MockVerificationKeyStorer, SignerRegistrationError, @@ -650,4 +660,26 @@ mod tests { ) .unwrap(); } + + #[tokio::test] + async fn test_fetch_epoch_header_value_when_epoch_service_return_epoch() { + let fixture = MithrilFixtureBuilder::default().build(); + let epoch_service = Arc::new(RwLock::new(FakeEpochService::from_fixture( + Epoch(84), + &fixture, + ))); + + let epoch_str = fetch_epoch_header_value(epoch_service).await; + + assert_eq!(epoch_str, "84".to_string()); + } + + #[tokio::test] + async fn test_fetch_epoch_header_value_when_epoch_service_error_return_empty_string() { + let epoch_service = Arc::new(RwLock::new(FakeEpochService::without_data())); + + let epoch_str = fetch_epoch_header_value(epoch_service).await; + + assert_eq!(epoch_str, "".to_string()); + } } From 84f7ab2648181ab7174befc887a89f2f89db1bdd Mon Sep 17 00:00:00 2001 From: Damien Lachaume <135982616+dlachaume@users.noreply.github.com> Date: Thu, 10 Oct 2024 09:46:25 +0200 Subject: [PATCH 202/274] chore: upgrade crate version * mithril-aggregator from `0.5.76` to `0.5.77 --- Cargo.lock | 2 +- mithril-aggregator/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7e159b6697e..146e7a9e7f9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3403,7 +3403,7 @@ dependencies = [ [[package]] name = "mithril-aggregator" -version = "0.5.76" +version = "0.5.77" dependencies = [ "anyhow", "async-trait", diff --git a/mithril-aggregator/Cargo.toml b/mithril-aggregator/Cargo.toml index 28919eee946..e86aa3620c0 100644 --- a/mithril-aggregator/Cargo.toml +++ b/mithril-aggregator/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-aggregator" -version = "0.5.76" +version = "0.5.77" description = "A Mithril Aggregator server" authors = { workspace = true } edition = { workspace = true } From b307ab0f208f661a681f2b6ddf1e5c829e5f273a Mon Sep 17 00:00:00 2001 From: Damien Lachaume <135982616+dlachaume@users.noreply.github.com> Date: Tue, 1 Oct 2024 10:39:22 +0200 Subject: [PATCH 203/274] feat: add `network` and `allowed_discriminants` as parameters for `MithrilEpochService` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Sébastien Fauvel --- mithril-aggregator/src/configuration.rs | 1 + .../src/dependency_injection/builder.rs | 7 ++++++- mithril-aggregator/src/services/epoch_service.rs | 14 ++++++++++++-- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/mithril-aggregator/src/configuration.rs b/mithril-aggregator/src/configuration.rs index 5b40873eea8..7940f97c04c 100644 --- a/mithril-aggregator/src/configuration.rs +++ b/mithril-aggregator/src/configuration.rs @@ -289,6 +289,7 @@ impl Configuration { .map(|limit| if limit > 3 { limit as u64 } else { 3 }) } + // TODO: Maybe remove this function, signing configuration in SignedEntityConfig is stored in DB /// Compute a [SignedEntityConfig] based on this configuration. pub fn compute_signed_entity_config(&self) -> StdResult { let network = self.get_network()?; diff --git a/mithril-aggregator/src/dependency_injection/builder.rs b/mithril-aggregator/src/dependency_injection/builder.rs index 552bfcee96f..ceb6d22d7d0 100644 --- a/mithril-aggregator/src/dependency_injection/builder.rs +++ b/mithril-aggregator/src/dependency_injection/builder.rs @@ -1220,13 +1220,18 @@ impl DependenciesBuilder { async fn build_epoch_service(&mut self) -> Result { let verification_key_store = self.get_verification_key_store().await?; let epoch_settings_storer = self.get_epoch_settings_storer().await?; - let epoch_settings = self.get_epoch_settings_configuration()?; + let network = self.configuration.get_network()?; + let allowed_discriminants = self + .get_signed_entity_config()? + .list_allowed_signed_entity_types_discriminants(); let epoch_service = Arc::new(RwLock::new(MithrilEpochService::new( epoch_settings, epoch_settings_storer, verification_key_store, + network, + allowed_discriminants, ))); Ok(epoch_service) diff --git a/mithril-aggregator/src/services/epoch_service.rs b/mithril-aggregator/src/services/epoch_service.rs index fab60ac3c54..995d7089ee8 100644 --- a/mithril-aggregator/src/services/epoch_service.rs +++ b/mithril-aggregator/src/services/epoch_service.rs @@ -1,15 +1,17 @@ use anyhow::Context; use async_trait::async_trait; use slog_scope::debug; +use std::collections::BTreeSet; use std::sync::Arc; use thiserror::Error; use mithril_common::crypto_helper::ProtocolAggregateVerificationKey; use mithril_common::entities::{ - CardanoTransactionsSigningConfig, Epoch, ProtocolParameters, Signer, SignerWithStake, + CardanoTransactionsSigningConfig, Epoch, ProtocolParameters, SignedEntityTypeDiscriminants, + Signer, SignerWithStake, }; use mithril_common::protocol::{MultiSigner as ProtocolMultiSigner, SignerBuilder}; -use mithril_common::StdResult; +use mithril_common::{CardanoNetwork, StdResult}; use crate::entities::AggregatorEpochSettings; use crate::{EpochSettingsStorer, VerificationKeyStorer}; @@ -122,6 +124,8 @@ pub struct MithrilEpochService { computed_epoch_data: Option, epoch_settings_storer: Arc, verification_key_store: Arc, + network: CardanoNetwork, + allowed_discriminants: BTreeSet, } impl MithrilEpochService { @@ -130,6 +134,8 @@ impl MithrilEpochService { future_epoch_settings: AggregatorEpochSettings, epoch_settings_storer: Arc, verification_key_store: Arc, + network: CardanoNetwork, + allowed_discriminants: BTreeSet, ) -> Self { Self { future_epoch_settings, @@ -137,6 +143,8 @@ impl MithrilEpochService { computed_epoch_data: None, epoch_settings_storer, verification_key_store, + network, + allowed_discriminants, } } @@ -746,6 +754,8 @@ mod tests { }, Arc::new(epoch_settings_storer), Arc::new(vkey_store), + CardanoNetwork::TestNet(27), + BTreeSet::new(), ) } From ac100a6f61b384f232dece99121da165e5abebcd Mon Sep 17 00:00:00 2001 From: Damien Lachaume <135982616+dlachaume@users.noreply.github.com> Date: Tue, 1 Oct 2024 18:12:50 +0200 Subject: [PATCH 204/274] feat: implement Signed entity configuration in Epoch Service --- .../src/services/epoch_service.rs | 266 +++++++++++++----- 1 file changed, 192 insertions(+), 74 deletions(-) diff --git a/mithril-aggregator/src/services/epoch_service.rs b/mithril-aggregator/src/services/epoch_service.rs index 995d7089ee8..90752a0f473 100644 --- a/mithril-aggregator/src/services/epoch_service.rs +++ b/mithril-aggregator/src/services/epoch_service.rs @@ -7,8 +7,8 @@ use thiserror::Error; use mithril_common::crypto_helper::ProtocolAggregateVerificationKey; use mithril_common::entities::{ - CardanoTransactionsSigningConfig, Epoch, ProtocolParameters, SignedEntityTypeDiscriminants, - Signer, SignerWithStake, + BlockNumber, CardanoTransactionsSigningConfig, Epoch, ProtocolParameters, SignedEntityConfig, + SignedEntityTypeDiscriminants, Signer, SignerWithStake, }; use mithril_common::protocol::{MultiSigner as ProtocolMultiSigner, SignerBuilder}; use mithril_common::{CardanoNetwork, StdResult}; @@ -96,6 +96,9 @@ pub trait EpochService: Sync + Send { /// Get the [protocol multi signer][ProtocolMultiSigner] for the next epoch fn next_protocol_multi_signer(&self) -> StdResult<&ProtocolMultiSigner>; + + /// Get the [SignedEntityConfig] for the current epoch. + fn signed_entity_config(&self) -> StdResult<&SignedEntityConfig>; } struct EpochData { @@ -107,6 +110,7 @@ struct EpochData { next_signers_with_stake: Vec, current_signers: Vec, next_signers: Vec, + signed_entity_config: SignedEntityConfig, } struct ComputedEpochData { @@ -245,6 +249,14 @@ impl EpochService for MithrilEpochService { let current_signers = Signer::vec_from(current_signers_with_stake.clone()); let next_signers = Signer::vec_from(next_signers_with_stake.clone()); + let signed_entity_config = SignedEntityConfig { + allowed_discriminants: self.allowed_discriminants.clone(), + network: self.network, + cardano_transactions_signing_config: epoch_settings + .cardano_transactions_signing_config + .clone(), + }; + self.epoch_data = Some(EpochData { epoch, epoch_settings, @@ -254,6 +266,7 @@ impl EpochService for MithrilEpochService { next_signers_with_stake, current_signers, next_signers, + signed_entity_config, }); self.computed_epoch_data = None; @@ -370,6 +383,10 @@ impl EpochService for MithrilEpochService { fn next_protocol_multi_signer(&self) -> StdResult<&ProtocolMultiSigner> { Ok(&self.unwrap_computed_data()?.next_protocol_multi_signer) } + + fn signed_entity_config(&self) -> StdResult<&SignedEntityConfig> { + Ok(&self.unwrap_data()?.signed_entity_config) + } } #[cfg(test)] @@ -423,6 +440,7 @@ impl FakeEpochService { next_signers_with_stake, current_signers, next_signers, + signed_entity_config: SignedEntityConfig::dummy(), }), computed_epoch_data: Some(ComputedEpochData { aggregate_verification_key: protocol_multi_signer @@ -596,17 +614,21 @@ impl EpochService for FakeEpochService { fn next_protocol_multi_signer(&self) -> StdResult<&ProtocolMultiSigner> { Ok(&self.unwrap_computed_data()?.next_protocol_multi_signer) } + + fn signed_entity_config(&self) -> StdResult<&SignedEntityConfig> { + Ok(&self.unwrap_data()?.signed_entity_config) + } } #[cfg(test)] mod tests { - use mithril_common::entities::{CardanoTransactionsSigningConfig, PartyId}; + use mithril_common::entities::{CardanoTransactionsSigningConfig, PartyId, SignedEntityType}; use mithril_common::test_utils::{fake_data, MithrilFixture, MithrilFixtureBuilder}; use mithril_persistence::store::adapter::MemoryAdapter; use std::collections::{BTreeSet, HashMap}; use crate::services::epoch_service::tests::ServiceBuilderParameters::WithFutureProtocolParameters; - use crate::store::FakeEpochSettingsStorer; + use crate::store::{FakeEpochSettingsStorer, MockVerificationKeyStorer}; use crate::VerificationKeyStore; use super::*; @@ -623,6 +645,7 @@ mod tests { next_signers_with_stake: BTreeSet, current_signers: BTreeSet, next_signers: BTreeSet, + signed_entity_config: SignedEntityConfig, } #[derive(Debug, Clone, PartialEq)] @@ -656,6 +679,7 @@ mod tests { .collect(), current_signers: service.current_signers()?.clone().into_iter().collect(), next_signers: service.next_signers()?.clone().into_iter().collect(), + signed_entity_config: service.signed_entity_config()?.clone(), }) } } @@ -679,12 +703,97 @@ mod tests { .collect() } + struct EpochServiceBuilder { + cardano_transactions_signing_config: CardanoTransactionsSigningConfig, + future_protocol_parameters: ProtocolParameters, + network: CardanoNetwork, + allowed_discriminants: BTreeSet, + signer_retrieval_epoch: Epoch, + next_signer_retrieval_epoch: Epoch, + signers_with_stake: Vec, + next_signers_with_stake: Vec, + stored_epoch_settings: AggregatorEpochSettings, + stored_next_epoch_settings: AggregatorEpochSettings, + stored_upcoming_epoch_settings: AggregatorEpochSettings, + } + + impl EpochServiceBuilder { + fn new(epoch: Epoch, current_epoch_fixture: MithrilFixture) -> Self { + let next_epoch_fixture = current_epoch_fixture.clone(); + Self { + // Aggregator configuration + cardano_transactions_signing_config: CardanoTransactionsSigningConfig::dummy(), + future_protocol_parameters: current_epoch_fixture.protocol_parameters(), + network: CardanoNetwork::TestNet(0), + allowed_discriminants: BTreeSet::new(), + // Epoch used for verification keys and database + signer_retrieval_epoch: epoch.offset_to_signer_retrieval_epoch().unwrap(), + next_signer_retrieval_epoch: epoch.offset_to_next_signer_retrieval_epoch(), + // Signers in verification key store + signers_with_stake: current_epoch_fixture.signers_with_stake(), + next_signers_with_stake: next_epoch_fixture.signers_with_stake(), + // Database data + stored_epoch_settings: AggregatorEpochSettings { + protocol_parameters: current_epoch_fixture.protocol_parameters(), + cardano_transactions_signing_config: CardanoTransactionsSigningConfig::dummy(), + }, + stored_next_epoch_settings: AggregatorEpochSettings { + protocol_parameters: current_epoch_fixture.protocol_parameters(), + cardano_transactions_signing_config: CardanoTransactionsSigningConfig::dummy(), + }, + stored_upcoming_epoch_settings: AggregatorEpochSettings { + protocol_parameters: current_epoch_fixture.protocol_parameters(), + cardano_transactions_signing_config: CardanoTransactionsSigningConfig::dummy(), + }, + } + } + + fn build(self) -> MithrilEpochService { + let epoch_settings_storer = FakeEpochSettingsStorer::new(vec![ + (self.signer_retrieval_epoch, self.stored_epoch_settings), + ( + self.next_signer_retrieval_epoch, + self.stored_next_epoch_settings.clone(), + ), + ( + self.next_signer_retrieval_epoch.next(), + self.stored_upcoming_epoch_settings.clone(), + ), + ]); + let vkey_store = VerificationKeyStore::new(Box::new( + MemoryAdapter::new(Some(vec![ + ( + self.signer_retrieval_epoch, + map_signers_for_vkey_store(&self.signers_with_stake), + ), + ( + self.next_signer_retrieval_epoch, + map_signers_for_vkey_store(&self.next_signers_with_stake), + ), + ])) + .unwrap(), + )); + MithrilEpochService::new( + AggregatorEpochSettings { + protocol_parameters: self.future_protocol_parameters, + cardano_transactions_signing_config: self.cardano_transactions_signing_config, + }, + Arc::new(epoch_settings_storer), + Arc::new(vkey_store), + self.network, + self.allowed_discriminants, + ) + } + } + + // TODO: Use EpochServiceBuilder and remove ServiceBuilderParameters enum ServiceBuilderParameters { DifferentFixtureForSecondEpoch(MithrilFixture), UpcomingProtocolParameters(ProtocolParameters), WithFutureProtocolParameters(ProtocolParameters), } + // TODO: Use EpochServiceBuilder and remove build_service /// By default will copy data from the given fixture for all epochs, can be fined tuned /// with the [ServiceBuilderParameters]. async fn build_service( @@ -692,71 +801,31 @@ mod tests { current_epoch_fixture: &MithrilFixture, additional_params: &[ServiceBuilderParameters], ) -> MithrilEpochService { - let signer_retrieval_epoch = epoch.offset_to_signer_retrieval_epoch().unwrap(); - let next_signer_retrieval_epoch = epoch.offset_to_next_signer_retrieval_epoch(); - let mut next_epoch_fixture = current_epoch_fixture; - let mut upcoming_protocol_parameters = current_epoch_fixture.protocol_parameters(); - let mut future_protocol_parameters = current_epoch_fixture.protocol_parameters(); - + let mut builder = EpochServiceBuilder::new(epoch, current_epoch_fixture.clone()); for params in additional_params { match params { ServiceBuilderParameters::DifferentFixtureForSecondEpoch(fixture) => { - next_epoch_fixture = fixture + builder.stored_next_epoch_settings = AggregatorEpochSettings { + protocol_parameters: fixture.protocol_parameters(), + cardano_transactions_signing_config: + CardanoTransactionsSigningConfig::dummy(), + }; + builder.next_signers_with_stake = fixture.signers_with_stake().clone(); } ServiceBuilderParameters::UpcomingProtocolParameters(params) => { - upcoming_protocol_parameters = params.clone() + builder.stored_upcoming_epoch_settings = AggregatorEpochSettings { + protocol_parameters: params.clone(), + cardano_transactions_signing_config: + CardanoTransactionsSigningConfig::dummy(), + }; + } + ServiceBuilderParameters::WithFutureProtocolParameters(params) => { + builder.future_protocol_parameters = params.clone(); } - WithFutureProtocolParameters(params) => future_protocol_parameters = params.clone(), } } - let epoch_settings_storer = FakeEpochSettingsStorer::new(vec![ - ( - signer_retrieval_epoch, - AggregatorEpochSettings { - protocol_parameters: current_epoch_fixture.protocol_parameters(), - cardano_transactions_signing_config: CardanoTransactionsSigningConfig::dummy(), - }, - ), - ( - next_signer_retrieval_epoch, - AggregatorEpochSettings { - protocol_parameters: next_epoch_fixture.protocol_parameters(), - cardano_transactions_signing_config: CardanoTransactionsSigningConfig::dummy(), - }, - ), - ( - next_signer_retrieval_epoch.next(), - AggregatorEpochSettings { - protocol_parameters: upcoming_protocol_parameters.clone(), - cardano_transactions_signing_config: CardanoTransactionsSigningConfig::dummy(), - }, - ), - ]); - let vkey_store = VerificationKeyStore::new(Box::new( - MemoryAdapter::new(Some(vec![ - ( - signer_retrieval_epoch, - map_signers_for_vkey_store(¤t_epoch_fixture.signers_with_stake()), - ), - ( - next_signer_retrieval_epoch, - map_signers_for_vkey_store(&next_epoch_fixture.signers_with_stake()), - ), - ])) - .unwrap(), - )); - - MithrilEpochService::new( - AggregatorEpochSettings { - protocol_parameters: future_protocol_parameters, - cardano_transactions_signing_config: CardanoTransactionsSigningConfig::dummy(), - }, - Arc::new(epoch_settings_storer), - Arc::new(vkey_store), - CardanoNetwork::TestNet(27), - BTreeSet::new(), - ) + builder.build() } #[tokio::test] @@ -769,19 +838,22 @@ mod tests { let upcoming_protocol_parameters = fake_data::protocol_parameters(); let epoch = Epoch(5); - let mut service = build_service( - epoch, - ¤t_epoch_fixture, - &[ - ServiceBuilderParameters::DifferentFixtureForSecondEpoch( - next_epoch_fixture.clone(), - ), - ServiceBuilderParameters::UpcomingProtocolParameters( - upcoming_protocol_parameters.clone(), - ), - ], - ) - .await; + let builder = EpochServiceBuilder { + next_signers_with_stake: next_epoch_fixture.signers_with_stake(), + stored_next_epoch_settings: AggregatorEpochSettings { + protocol_parameters: next_epoch_fixture.protocol_parameters(), + ..AggregatorEpochSettings::dummy() + }, + stored_upcoming_epoch_settings: AggregatorEpochSettings { + protocol_parameters: upcoming_protocol_parameters.clone(), + ..AggregatorEpochSettings::dummy() + }, + network: SignedEntityConfig::dummy().network, + allowed_discriminants: SignedEntityConfig::dummy().allowed_discriminants, + ..EpochServiceBuilder::new(epoch, current_epoch_fixture.clone()) + }; + + let mut service = builder.build(); service .inform_epoch(epoch) @@ -793,7 +865,7 @@ mod tests { .expect("extracting data from service should not fail"); assert_eq!( - data, + data.clone(), ExpectedEpochData { epoch, protocol_parameters: current_epoch_fixture.protocol_parameters(), @@ -811,6 +883,50 @@ mod tests { .collect(), current_signers: current_epoch_fixture.signers().into_iter().collect(), next_signers: next_epoch_fixture.signers().into_iter().collect(), + signed_entity_config: SignedEntityConfig::dummy(), + } + ); + } + + #[tokio::test] + async fn inform_epoch_get_signed_entity_config_from_its_dependencies_and_store() { + let epoch = Epoch(5); + + let cardano_transactions_signing_config = + CardanoTransactionsSigningConfig::new(BlockNumber(29), BlockNumber(986)); + let network = CardanoNetwork::TestNet(27); + let allowed_discriminants = BTreeSet::from([ + SignedEntityTypeDiscriminants::CardanoTransactions, + SignedEntityTypeDiscriminants::CardanoImmutableFilesFull, + ]); + + let builder = EpochServiceBuilder { + network, + allowed_discriminants: allowed_discriminants.clone(), + stored_epoch_settings: AggregatorEpochSettings { + cardano_transactions_signing_config: cardano_transactions_signing_config.clone(), + ..AggregatorEpochSettings::dummy() + }, + ..EpochServiceBuilder::new(epoch, MithrilFixtureBuilder::default().build()) + }; + + let mut service = builder.build(); + + service + .inform_epoch(epoch) + .await + .expect("inform_epoch should not fail"); + + let signed_entity_config = service + .signed_entity_config() + .expect("extracting data from service should not fail"); + + assert_eq!( + signed_entity_config.clone(), + SignedEntityConfig { + allowed_discriminants, + network, + cardano_transactions_signing_config, } ); } @@ -978,6 +1094,7 @@ mod tests { "next_protocol_multi_signer", service.next_protocol_multi_signer().err(), ), + ("signed_entity_config", service.signed_entity_config().err()), ] { let error = res.unwrap_or_else(|| panic!("getting {name} should have returned an error")); @@ -1008,6 +1125,7 @@ mod tests { assert!(service.next_signers_with_stake().is_ok()); assert!(service.current_signers().is_ok()); assert!(service.next_signers().is_ok()); + assert!(service.signed_entity_config().is_ok()); for (name, res) in [ ( From e54cd9a94cd5cb00f887e0821350415ccc72eef8 Mon Sep 17 00:00:00 2001 From: sfauvel Date: Thu, 3 Oct 2024 17:44:08 +0200 Subject: [PATCH 205/274] Move outdated computation from state_machine to the runner --- mithril-aggregator/src/runtime/runner.rs | 104 +++++++++++++++++- .../src/runtime/state_machine.rs | 62 ++++------- .../src/services/epoch_service.rs | 6 +- 3 files changed, 127 insertions(+), 45 deletions(-) diff --git a/mithril-aggregator/src/runtime/runner.rs b/mithril-aggregator/src/runtime/runner.rs index c3735f7ce63..2fc7ec9efb6 100644 --- a/mithril-aggregator/src/runtime/runner.rs +++ b/mithril-aggregator/src/runtime/runner.rs @@ -130,6 +130,13 @@ pub trait AggregatorRunnerTrait: Sync + Send { signed_entity_type: &SignedEntityType, protocol_message: &ProtocolMessage, ) -> StdResult; + + /// Checks if the open message is considered outdated. + async fn is_outdated( + &self, + open_message_signed_entity_type: SignedEntityType, + last_time_point: &TimePoint, + ) -> StdResult; } /// The runner responsibility is to expose a code API for the state machine. It @@ -486,6 +493,33 @@ impl AggregatorRunnerTrait for AggregatorRunner { .create_open_message(signed_entity_type, protocol_message) .await } + + async fn is_outdated( + &self, + open_message_signed_entity_type: SignedEntityType, + last_time_point: &TimePoint, + ) -> StdResult { + let current_open_message = self + .get_current_open_message_for_signed_entity_type( + &open_message_signed_entity_type, + ) + .await + .with_context(|| format!("AggregatorRuntime can not get the current open message for signed entity type: '{}'", &open_message_signed_entity_type))?; + let is_expired_open_message = current_open_message + .as_ref() + .map(|om| om.is_expired) + .unwrap_or(false); + + let exists_newer_open_message = { + let new_signed_entity_type = self + .dependencies + .signed_entity_config + .time_point_to_signed_entity(&open_message_signed_entity_type, last_time_point)?; + new_signed_entity_type != open_message_signed_entity_type + }; + + Ok(exists_newer_open_message || is_expired_open_message) + } } #[cfg(test)] @@ -502,7 +536,7 @@ pub mod tests { use async_trait::async_trait; use chrono::{DateTime, Utc}; use mithril_common::entities::{ - CardanoTransactionsSigningConfig, ChainPoint, SignedEntityTypeDiscriminants, + CardanoTransactionsSigningConfig, ChainPoint, Epoch, SignedEntityTypeDiscriminants, }; use mithril_common::signed_entity_type_lock::SignedEntityTypeLock; use mithril_common::{ @@ -1236,4 +1270,72 @@ pub mod tests { assert!(!signed_entities.is_empty()); assert!(!signed_entities.contains(&SignedEntityTypeDiscriminants::CardanoTransactions)); } + + #[tokio::test] + async fn is_outdated_return_false_when_message_is_not_expired_and_has_same_signed_entity_type() + { + assert!(!is_outdated_returned_when(IsExpired::No, true).await); + } + + #[tokio::test] + async fn is_outdated_return_true_when_message_is_expired_and_has_same_signed_entity_type() { + assert!(is_outdated_returned_when(IsExpired::Yes, true).await); + } + + #[tokio::test] + async fn is_outdated_return_true_when_message_is_not_expired_and_has_not_the_same_signed_entity_type( + ) { + assert!(is_outdated_returned_when(IsExpired::No, false).await); + } + + #[tokio::test] + async fn is_outdated_return_true_when_message_is_expired_and_has_not_the_same_signed_entity_type( + ) { + assert!(is_outdated_returned_when(IsExpired::Yes, false).await); + } + + async fn is_outdated_returned_when( + is_expired: IsExpired, + same_signed_entity_type: bool, + ) -> bool { + let current_time_point = TimePoint { + epoch: Epoch(2), + immutable_file_number: 1, + ..TimePoint::dummy() + }; + + let message_epoch = if same_signed_entity_type { + current_time_point.epoch + } else { + current_time_point.epoch - 1 + }; + let open_message = OpenMessage { + signed_entity_type: SignedEntityType::MithrilStakeDistribution(message_epoch), + is_expired: is_expired == IsExpired::Yes, + ..OpenMessage::dummy() + }; + + let runner = { + let mut deps = initialize_dependencies().await; + let mut mock_certifier_service = MockCertifierService::new(); + + let open_message_cloned = open_message.clone(); + mock_certifier_service + .expect_get_open_message() + .times(1) + .return_once(|_| Ok(Some(open_message_cloned))); + mock_certifier_service + .expect_mark_open_message_if_expired() + .returning(|_| Ok(None)); + + deps.certifier_service = Arc::new(mock_certifier_service); + + build_runner_with_fixture_data(deps).await + }; + + runner + .is_outdated(open_message.signed_entity_type, ¤t_time_point) + .await + .unwrap() + } } diff --git a/mithril-aggregator/src/runtime/state_machine.rs b/mithril-aggregator/src/runtime/state_machine.rs index 8da6cf40b09..ebbaa82f0e8 100644 --- a/mithril-aggregator/src/runtime/state_machine.rs +++ b/mithril-aggregator/src/runtime/state_machine.rs @@ -222,34 +222,21 @@ impl AggregatorRuntime { self.runner.get_time_point_from_chain().await.with_context(|| { "AggregatorRuntime in the state SIGNING can not get current time point from chain" })?; - let current_open_message = self + + let is_outdated = self .runner - .get_current_open_message_for_signed_entity_type( - &state.open_message.signed_entity_type, + .is_outdated( + state.open_message.signed_entity_type.clone(), + &last_time_point, ) - .await - .with_context(|| format!("AggregatorRuntime can not get the current open message for signed entity type: '{}'", &state.open_message.signed_entity_type))?; - let is_expired_open_message = current_open_message - .as_ref() - .map(|om| om.is_expired) - .unwrap_or(false); - let exists_newer_open_message = { - let new_signed_entity_type = self - .config - .signed_entity_config - .time_point_to_signed_entity( - &state.open_message.signed_entity_type, - &last_time_point, - )?; - new_signed_entity_type != state.open_message.signed_entity_type - }; + .await?; if state.current_time_point.epoch < last_time_point.epoch { // SIGNING > IDLE info!("→ Epoch changed, transitioning to IDLE"); let new_state = self.transition_from_signing_to_idle(state).await?; self.state = AggregatorState::Idle(new_state); - } else if exists_newer_open_message || is_expired_open_message { + } else if is_outdated { // SIGNING > READY info!("→ Open message changed, transitioning to READY"); let new_state = self @@ -409,7 +396,7 @@ mod tests { use mockall::predicate; use std::time::Duration; - use mithril_common::entities::{Epoch, SignedEntityConfig, SignedEntityType}; + use mithril_common::entities::SignedEntityConfig; use mithril_common::test_utils::fake_data; use super::super::runner::MockAggregatorRunner; @@ -646,27 +633,20 @@ mod tests { .once() .returning(|| Ok(TimePoint::dummy())); runner - .expect_get_current_open_message_for_signed_entity_type() + .expect_is_outdated() .once() - .returning(|_| { - Ok(Some(OpenMessage { - signed_entity_type: SignedEntityType::MithrilStakeDistribution(Epoch(1)), - ..OpenMessage::dummy() - })) - }); + .returning(|_, _| Ok(true)); runner .expect_drop_pending_certificate() .once() .returning(|| Ok(Some(fake_data::certificate_pending()))); - let state = SigningState { + let initial_state = AggregatorState::Signing(SigningState { current_time_point: TimePoint::dummy(), - open_message: OpenMessage { - signed_entity_type: SignedEntityType::MithrilStakeDistribution(Epoch(2)), - ..OpenMessage::dummy() - }, - }; - let mut runtime = init_runtime(Some(AggregatorState::Signing(state)), runner).await; + open_message: OpenMessage::dummy(), + }); + + let mut runtime = init_runtime(Some(initial_state), runner).await; runtime.cycle().await.unwrap(); assert_eq!("ready".to_string(), runtime.get_state()); @@ -680,9 +660,9 @@ mod tests { .once() .returning(|| Ok(TimePoint::dummy())); runner - .expect_get_current_open_message_for_signed_entity_type() + .expect_is_outdated() .once() - .returning(|_| Ok(Some(OpenMessage::dummy()))); + .returning(|_, _| Ok(false)); runner .expect_create_certificate() .once() @@ -713,9 +693,9 @@ mod tests { .once() .returning(|| Ok(TimePoint::dummy())); runner - .expect_get_current_open_message_for_signed_entity_type() + .expect_is_outdated() .once() - .returning(|_| Ok(Some(OpenMessage::dummy()))); + .returning(|_, _| Ok(false)); runner .expect_create_certificate() .return_once(move |_| Ok(Some(fake_data::certificate("whatever".to_string())))); @@ -753,9 +733,9 @@ mod tests { .once() .returning(|| Ok(TimePoint::dummy())); runner - .expect_get_current_open_message_for_signed_entity_type() + .expect_is_outdated() .once() - .returning(|_| Ok(Some(OpenMessage::dummy()))); + .returning(|_, _| Ok(false)); runner .expect_create_certificate() .return_once(move |_| Ok(Some(fake_data::certificate("whatever".to_string())))); diff --git a/mithril-aggregator/src/services/epoch_service.rs b/mithril-aggregator/src/services/epoch_service.rs index 90752a0f473..eae5893f17f 100644 --- a/mithril-aggregator/src/services/epoch_service.rs +++ b/mithril-aggregator/src/services/epoch_service.rs @@ -7,7 +7,7 @@ use thiserror::Error; use mithril_common::crypto_helper::ProtocolAggregateVerificationKey; use mithril_common::entities::{ - BlockNumber, CardanoTransactionsSigningConfig, Epoch, ProtocolParameters, SignedEntityConfig, + CardanoTransactionsSigningConfig, Epoch, ProtocolParameters, SignedEntityConfig, SignedEntityTypeDiscriminants, Signer, SignerWithStake, }; use mithril_common::protocol::{MultiSigner as ProtocolMultiSigner, SignerBuilder}; @@ -622,13 +622,13 @@ impl EpochService for FakeEpochService { #[cfg(test)] mod tests { - use mithril_common::entities::{CardanoTransactionsSigningConfig, PartyId, SignedEntityType}; + use mithril_common::entities::{BlockNumber, CardanoTransactionsSigningConfig, PartyId}; use mithril_common::test_utils::{fake_data, MithrilFixture, MithrilFixtureBuilder}; use mithril_persistence::store::adapter::MemoryAdapter; use std::collections::{BTreeSet, HashMap}; use crate::services::epoch_service::tests::ServiceBuilderParameters::WithFutureProtocolParameters; - use crate::store::{FakeEpochSettingsStorer, MockVerificationKeyStorer}; + use crate::store::FakeEpochSettingsStorer; use crate::VerificationKeyStore; use super::*; From a678a92d1250a1f53f8043fe38dd8c058ea1316f Mon Sep 17 00:00:00 2001 From: Damien Lachaume <135982616+dlachaume@users.noreply.github.com> Date: Mon, 7 Oct 2024 17:08:52 +0200 Subject: [PATCH 206/274] Remove cardano signing configuration in `init_state_from_fixture` parameters. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Instead, retrieve it from the aggregator configuration. Co-authored-by: Sébastien Fauvel --- .../src/dependency_injection/containers.rs | 11 ++++------- .../src/services/certifier/certifier_service.rs | 8 ++------ .../tests/test_extensions/runtime_tester.rs | 7 +------ 3 files changed, 7 insertions(+), 19 deletions(-) diff --git a/mithril-aggregator/src/dependency_injection/containers.rs b/mithril-aggregator/src/dependency_injection/containers.rs index 73fac4805ff..08b5227f2ca 100644 --- a/mithril-aggregator/src/dependency_injection/containers.rs +++ b/mithril-aggregator/src/dependency_injection/containers.rs @@ -194,19 +194,16 @@ impl DependencyContainer { /// /// Fill the stores of a [DependencyManager] in a way to simulate an aggregator state /// using the data from a precomputed fixture. - pub async fn init_state_from_fixture( - &self, - fixture: &MithrilFixture, - cardano_transactions_signing_config: &CardanoTransactionsSigningConfig, - target_epochs: &[Epoch], - ) { + pub async fn init_state_from_fixture(&self, fixture: &MithrilFixture, target_epochs: &[Epoch]) { for epoch in target_epochs { self.epoch_settings_storer .save_epoch_settings( *epoch, AggregatorEpochSettings { protocol_parameters: fixture.protocol_parameters(), - cardano_transactions_signing_config: cardano_transactions_signing_config + cardano_transactions_signing_config: self + .config + .cardano_transactions_signing_config .clone(), }, ) diff --git a/mithril-aggregator/src/services/certifier/certifier_service.rs b/mithril-aggregator/src/services/certifier/certifier_service.rs index a5f25ac3f8e..a2c26097cfc 100644 --- a/mithril-aggregator/src/services/certifier/certifier_service.rs +++ b/mithril-aggregator/src/services/certifier/certifier_service.rs @@ -382,7 +382,7 @@ mod tests { }; use chrono::{DateTime, Days}; use mithril_common::{ - entities::{CardanoDbBeacon, CardanoTransactionsSigningConfig, ProtocolMessagePartKey}, + entities::{CardanoDbBeacon, ProtocolMessagePartKey}, test_utils::{fake_data, MithrilFixture, MithrilFixtureBuilder}, }; use tokio::sync::RwLock; @@ -442,11 +442,7 @@ mod tests { .await .unwrap(); dependency_manager - .init_state_from_fixture( - fixture, - &CardanoTransactionsSigningConfig::dummy(), - epochs_with_signers, - ) + .init_state_from_fixture(fixture, epochs_with_signers) .await; MithrilCertifierService::from_deps(network, dependency_builder).await diff --git a/mithril-aggregator/tests/test_extensions/runtime_tester.rs b/mithril-aggregator/tests/test_extensions/runtime_tester.rs index 896a5222fce..40b403f9fd0 100644 --- a/mithril-aggregator/tests/test_extensions/runtime_tester.rs +++ b/mithril-aggregator/tests/test_extensions/runtime_tester.rs @@ -9,7 +9,6 @@ use mithril_aggregator::{ AggregatorRuntime, Configuration, DependencyContainer, DumbSnapshotUploader, DumbSnapshotter, SignerRegistrationError, }; -use mithril_common::entities::CardanoTransactionsSigningConfig; use mithril_common::{ cardano_block_scanner::{DumbBlockScanner, ScannedBlock}, chain_observer::{ChainObserver, FakeObserver}, @@ -191,11 +190,7 @@ impl RuntimeTester { // Init the stores needed for a genesis certificate let genesis_epochs = self.dependencies.get_genesis_epochs().await; self.dependencies - .init_state_from_fixture( - fixture, - &CardanoTransactionsSigningConfig::dummy(), - &[genesis_epochs.0, genesis_epochs.1], - ) + .init_state_from_fixture(fixture, &[genesis_epochs.0, genesis_epochs.1]) .await; Ok(()) } From 329486484bb175115fc8810cbe4bdf7dd9875374 Mon Sep 17 00:00:00 2001 From: Damien Lachaume <135982616+dlachaume@users.noreply.github.com> Date: Mon, 7 Oct 2024 17:12:08 +0200 Subject: [PATCH 207/274] Use `SignedEntityConfig` from the `EpochService` to create the signed entity type --- .../mithril_stake_distribution.rs | 5 ++- .../src/http_server/routes/epoch_routes.rs | 2 + mithril-aggregator/src/multi_signer.rs | 2 + mithril-aggregator/src/runtime/runner.rs | 43 +++++++++++++++---- .../src/services/epoch_service.rs | 4 +- .../signable_builder/signable_seed_builder.rs | 3 +- 6 files changed, 48 insertions(+), 11 deletions(-) diff --git a/mithril-aggregator/src/artifact_builder/mithril_stake_distribution.rs b/mithril-aggregator/src/artifact_builder/mithril_stake_distribution.rs index 6ac599fdc71..081396005f6 100644 --- a/mithril-aggregator/src/artifact_builder/mithril_stake_distribution.rs +++ b/mithril-aggregator/src/artifact_builder/mithril_stake_distribution.rs @@ -38,7 +38,9 @@ impl ArtifactBuilder for MithrilStakeDistributi #[cfg(test)] mod tests { - use mithril_common::{crypto_helper::ProtocolParameters, test_utils::fake_data}; + use mithril_common::{ + crypto_helper::ProtocolParameters, entities::SignedEntityConfig, test_utils::fake_data, + }; use std::sync::Arc; use tokio::sync::RwLock; @@ -61,6 +63,7 @@ mod tests { &epoch_settings, &signers_with_stake, &signers_with_stake, + SignedEntityConfig::dummy(), ); let mithril_stake_distribution_artifact_builder = MithrilStakeDistributionArtifactBuilder::new(Arc::new(RwLock::new(epoch_service))); diff --git a/mithril-aggregator/src/http_server/routes/epoch_routes.rs b/mithril-aggregator/src/http_server/routes/epoch_routes.rs index 77463cef2c0..38f6a0010c4 100644 --- a/mithril-aggregator/src/http_server/routes/epoch_routes.rs +++ b/mithril-aggregator/src/http_server/routes/epoch_routes.rs @@ -202,6 +202,7 @@ mod tests { &upcoming_epoch_settings, &fake_data::signers_with_stakes(5), &fake_data::signers_with_stakes(3), + SignedEntityConfig::dummy(), ); let message = get_epoch_settings_message( @@ -245,6 +246,7 @@ mod tests { &AggregatorEpochSettings::dummy(), &fake_data::signers_with_stakes(5), &fake_data::signers_with_stakes(3), + SignedEntityConfig::dummy(), ); let message = get_epoch_settings_message( diff --git a/mithril-aggregator/src/multi_signer.rs b/mithril-aggregator/src/multi_signer.rs index 586259403dc..bade2b3e7a2 100644 --- a/mithril-aggregator/src/multi_signer.rs +++ b/mithril-aggregator/src/multi_signer.rs @@ -134,6 +134,7 @@ impl MultiSigner for MultiSignerImpl { #[cfg(test)] mod tests { + use entities::SignedEntityConfig; use std::sync::Arc; use tokio::sync::RwLock; @@ -189,6 +190,7 @@ mod tests { }, &fixture.signers_with_stake(), &next_fixture.signers_with_stake(), + SignedEntityConfig::dummy(), )))); { diff --git a/mithril-aggregator/src/runtime/runner.rs b/mithril-aggregator/src/runtime/runner.rs index 2fc7ec9efb6..5f765023c5c 100644 --- a/mithril-aggregator/src/runtime/runner.rs +++ b/mithril-aggregator/src/runtime/runner.rs @@ -513,7 +513,10 @@ impl AggregatorRunnerTrait for AggregatorRunner { let exists_newer_open_message = { let new_signed_entity_type = self .dependencies - .signed_entity_config + .epoch_service + .read() + .await + .signed_entity_config()? .time_point_to_signed_entity(&open_message_signed_entity_type, last_time_point)?; new_signed_entity_type != open_message_signed_entity_type }; @@ -536,9 +539,11 @@ pub mod tests { use async_trait::async_trait; use chrono::{DateTime, Utc}; use mithril_common::entities::{ - CardanoTransactionsSigningConfig, ChainPoint, Epoch, SignedEntityTypeDiscriminants, + CardanoDbBeacon, CardanoTransactionsSigningConfig, ChainPoint, Epoch, SignedEntityConfig, + SignedEntityTypeDiscriminants, }; use mithril_common::signed_entity_type_lock::SignedEntityTypeLock; + use mithril_common::CardanoNetwork; use mithril_common::{ chain_observer::FakeObserver, digesters::DumbImmutableFileObserver, @@ -580,7 +585,6 @@ pub mod tests { .unwrap(); deps.init_state_from_fixture( &fixture, - &CardanoTransactionsSigningConfig::dummy(), &[ current_epoch.offset_to_signer_retrieval_epoch().unwrap(), current_epoch, @@ -1300,17 +1304,28 @@ pub mod tests { ) -> bool { let current_time_point = TimePoint { epoch: Epoch(2), - immutable_file_number: 1, + immutable_file_number: 12, ..TimePoint::dummy() }; - let message_epoch = if same_signed_entity_type { - current_time_point.epoch + let message_network = CardanoNetwork::MainNet; + let epoch_service_network = if same_signed_entity_type { + message_network } else { - current_time_point.epoch - 1 + CardanoNetwork::DevNet(412) + }; + + let epoch_service_signed_entity_config = SignedEntityConfig { + network: epoch_service_network, + ..SignedEntityConfig::dummy() + }; + let cardano_db_beacon = CardanoDbBeacon { + network: message_network.to_string(), + epoch: current_time_point.epoch, + immutable_file_number: current_time_point.immutable_file_number, }; let open_message = OpenMessage { - signed_entity_type: SignedEntityType::MithrilStakeDistribution(message_epoch), + signed_entity_type: SignedEntityType::CardanoImmutableFilesFull(cardano_db_beacon), is_expired: is_expired == IsExpired::Yes, ..OpenMessage::dummy() }; @@ -1330,6 +1345,18 @@ pub mod tests { deps.certifier_service = Arc::new(mock_certifier_service); + let epoch_settings = AggregatorEpochSettings::dummy(); + let epoch_service = FakeEpochService::with_data( + current_time_point.epoch, + &epoch_settings, + &epoch_settings, + &epoch_settings, + &fake_data::signers_with_stakes(1), + &fake_data::signers_with_stakes(1), + epoch_service_signed_entity_config, + ); + deps.epoch_service = Arc::new(RwLock::new(epoch_service)); + build_runner_with_fixture_data(deps).await }; diff --git a/mithril-aggregator/src/services/epoch_service.rs b/mithril-aggregator/src/services/epoch_service.rs index eae5893f17f..a1a824ebdef 100644 --- a/mithril-aggregator/src/services/epoch_service.rs +++ b/mithril-aggregator/src/services/epoch_service.rs @@ -409,6 +409,7 @@ impl FakeEpochService { upcoming_epoch_settings: &AggregatorEpochSettings, current_signers_with_stake: &[SignerWithStake], next_signers_with_stake: &[SignerWithStake], + signed_entity_config: SignedEntityConfig, ) -> Self { let protocol_multi_signer = SignerBuilder::new( current_signers_with_stake, @@ -440,7 +441,7 @@ impl FakeEpochService { next_signers_with_stake, current_signers, next_signers, - signed_entity_config: SignedEntityConfig::dummy(), + signed_entity_config, }), computed_epoch_data: Some(ComputedEpochData { aggregate_verification_key: protocol_multi_signer @@ -481,6 +482,7 @@ impl FakeEpochService { &upcoming_epoch_settings, &fixture.signers_with_stake(), &fixture.signers_with_stake(), + SignedEntityConfig::dummy(), ) } diff --git a/mithril-aggregator/src/services/signable_builder/signable_seed_builder.rs b/mithril-aggregator/src/services/signable_builder/signable_seed_builder.rs index a845acb54e3..8082c34351c 100644 --- a/mithril-aggregator/src/services/signable_builder/signable_seed_builder.rs +++ b/mithril-aggregator/src/services/signable_builder/signable_seed_builder.rs @@ -57,7 +57,7 @@ impl SignableSeedBuilder for AggregatorSignableSeedBuilder { #[cfg(test)] mod tests { use mithril_common::{ - entities::Epoch, + entities::{Epoch, SignedEntityConfig}, test_utils::{MithrilFixture, MithrilFixtureBuilder}, }; @@ -86,6 +86,7 @@ mod tests { }, &fixture.signers_with_stake(), &next_fixture.signers_with_stake(), + SignedEntityConfig::dummy(), ))); AggregatorSignableSeedBuilder::new(epoch_service) From 477f84ee34a62e14bcc116a1433ad034f7289d46 Mon Sep 17 00:00:00 2001 From: Damien Lachaume <135982616+dlachaume@users.noreply.github.com> Date: Mon, 7 Oct 2024 18:00:30 +0200 Subject: [PATCH 208/274] Remove the signed entity config in the dependency container of the aggregator MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add `allowed_discriminants` in the dependencies builder - Remove `signed_entity_config` in `AggregatorConfig` Co-authored-by: Sébastien Fauvel Co-authored-by: DJO --- mithril-aggregator/src/configuration.rs | 36 ++++--- .../src/dependency_injection/builder.rs | 52 +++++------ .../src/dependency_injection/containers.rs | 14 +-- .../src/http_server/routes/epoch_routes.rs | 51 ++++------ .../src/http_server/routes/middlewares.rs | 11 ++- .../src/http_server/routes/root_routes.rs | 69 ++++++++++---- mithril-aggregator/src/runtime/runner.rs | 47 ++++++---- .../src/runtime/state_machine.rs | 3 +- .../src/services/epoch_service.rs | 93 +++++++++++++------ .../test_extensions/aggregator_observer.rs | 18 ++-- .../src/entities/signed_entity_config.rs | 12 ++- 11 files changed, 247 insertions(+), 159 deletions(-) diff --git a/mithril-aggregator/src/configuration.rs b/mithril-aggregator/src/configuration.rs index 7940f97c04c..38ea004eb37 100644 --- a/mithril-aggregator/src/configuration.rs +++ b/mithril-aggregator/src/configuration.rs @@ -5,7 +5,7 @@ use mithril_common::crypto_helper::ProtocolGenesisSigner; use mithril_common::era::adapters::EraReaderAdapterType; use mithril_doc::{Documenter, DocumenterDefault, StructDoc}; use serde::{Deserialize, Serialize}; -use std::collections::HashMap; +use std::collections::{BTreeSet, HashMap}; use std::path::PathBuf; use std::str::FromStr; @@ -289,23 +289,22 @@ impl Configuration { .map(|limit| if limit > 3 { limit as u64 } else { 3 }) } - // TODO: Maybe remove this function, signing configuration in SignedEntityConfig is stored in DB - /// Compute a [SignedEntityConfig] based on this configuration. - pub fn compute_signed_entity_config(&self) -> StdResult { - let network = self.get_network()?; - let allowed_discriminants = self + /// Compute the list of signed entity discriminants that are allowed to be processed based in this configuration. + pub fn compute_allowed_signed_entity_types_discriminants( + &self, + ) -> StdResult> { + let mut allowed_discriminants = self .signed_entity_types .as_ref() .map(SignedEntityTypeDiscriminants::parse_list) .transpose() .with_context(|| "Invalid 'signed_entity_types' configuration")? .unwrap_or_default(); + SignedEntityConfig::append_allowed_signed_entity_types_discriminants( + &mut allowed_discriminants, + ); - Ok(SignedEntityConfig { - allowed_discriminants, - network, - cardano_transactions_signing_config: self.cardano_transactions_signing_config.clone(), - }) + Ok(allowed_discriminants) } } @@ -541,4 +540,19 @@ mod test { DefaultConfiguration::default().cardano_transactions_signing_config ); } + + #[test] + fn compute_allowed_signed_entity_types_discriminants_append_default_discriminants() { + let config = Configuration { + signed_entity_types: None, + ..Configuration::new_sample() + }; + + assert_eq!( + config + .compute_allowed_signed_entity_types_discriminants() + .unwrap(), + BTreeSet::from(SignedEntityConfig::DEFAULT_ALLOWED_DISCRIMINANTS) + ); + } } diff --git a/mithril-aggregator/src/dependency_injection/builder.rs b/mithril-aggregator/src/dependency_injection/builder.rs index ceb6d22d7d0..d06715e284d 100644 --- a/mithril-aggregator/src/dependency_injection/builder.rs +++ b/mithril-aggregator/src/dependency_injection/builder.rs @@ -1,7 +1,7 @@ use anyhow::Context; use semver::Version; use slog::Logger; -use std::sync::Arc; +use std::{collections::BTreeSet, sync::Arc}; use tokio::{ sync::{ mpsc::{UnboundedReceiver, UnboundedSender}, @@ -29,10 +29,7 @@ use mithril_common::{ CardanoImmutableDigester, DumbImmutableFileObserver, ImmutableDigester, ImmutableFileObserver, ImmutableFileSystemObserver, }, - entities::{ - CertificatePending, CompressionAlgorithm, Epoch, SignedEntityConfig, - SignedEntityTypeDiscriminants, - }, + entities::{CertificatePending, CompressionAlgorithm, Epoch, SignedEntityTypeDiscriminants}, era::{ adapters::{EraReaderAdapterBuilder, EraReaderDummyAdapter}, EraChecker, EraMarker, EraReader, EraReaderAdapter, SupportedEra, @@ -101,8 +98,8 @@ pub struct DependenciesBuilder { /// Configuration parameters pub configuration: Configuration, - /// Signed entity configuration - pub signed_entity_config: Option, + /// List of signed entity discriminants that are allowed to be processed + pub allowed_discriminants: Option>, /// SQLite database connection pub sqlite_connection: Option>, @@ -246,7 +243,7 @@ impl DependenciesBuilder { pub fn new(configuration: Configuration) -> Self { Self { configuration, - signed_entity_config: None, + allowed_discriminants: None, sqlite_connection: None, sqlite_connection_cardano_transaction_pool: None, stake_store: None, @@ -294,13 +291,18 @@ impl DependenciesBuilder { } } - /// Get the signed entity configuration - pub fn get_signed_entity_config(&mut self) -> Result { - if self.signed_entity_config.is_none() { - self.signed_entity_config = Some(self.configuration.compute_signed_entity_config()?); + /// Get the allowed signed entity types discriminants + pub fn get_allowed_signed_entity_types_discriminants( + &mut self, + ) -> Result> { + if self.allowed_discriminants.is_none() { + self.allowed_discriminants = Some( + self.configuration + .compute_allowed_signed_entity_types_discriminants()?, + ); } - Ok(self.signed_entity_config.clone().unwrap()) + Ok(self.allowed_discriminants.clone().unwrap()) } fn build_sqlite_connection( @@ -584,8 +586,9 @@ impl DependenciesBuilder { // Temporary fix, should be removed // Replace empty JSON values '{}' injected with Migration #28 let cardano_signing_config = self - .get_signed_entity_config()? - .cardano_transactions_signing_config; + .configuration + .cardano_transactions_signing_config + .clone(); #[allow(deprecated)] epoch_settings_store .replace_cardano_signing_config_empty_values(cardano_signing_config)?; @@ -1222,9 +1225,7 @@ impl DependenciesBuilder { let epoch_settings_storer = self.get_epoch_settings_storer().await?; let epoch_settings = self.get_epoch_settings_configuration()?; let network = self.configuration.get_network()?; - let allowed_discriminants = self - .get_signed_entity_config()? - .list_allowed_signed_entity_types_discriminants(); + let allowed_discriminants = self.get_allowed_signed_entity_types_discriminants()?; let epoch_service = Arc::new(RwLock::new(MithrilEpochService::new( epoch_settings, @@ -1338,8 +1339,9 @@ impl DependenciesBuilder { let epoch_settings = AggregatorEpochSettings { protocol_parameters: self.configuration.protocol_parameters.clone(), cardano_transactions_signing_config: self - .get_signed_entity_config()? - .cardano_transactions_signing_config, + .configuration + .cardano_transactions_signing_config + .clone(), }; Ok(epoch_settings) } @@ -1348,7 +1350,7 @@ impl DependenciesBuilder { pub async fn build_dependency_container(&mut self) -> Result { let dependency_manager = DependencyContainer { config: self.configuration.clone(), - signed_entity_config: self.get_signed_entity_config()?, + allowed_discriminants: self.get_allowed_signed_entity_types_discriminants()?, sqlite_connection: self.get_sqlite_connection().await?, sqlite_connection_cardano_transaction_pool: self .get_sqlite_connection_cardano_transaction_pool() @@ -1405,10 +1407,7 @@ impl DependenciesBuilder { pub async fn create_aggregator_runner(&mut self) -> Result { let dependency_container = Arc::new(self.build_dependency_container().await?); - let config = AggregatorConfig::new( - Duration::from_millis(self.configuration.run_interval), - self.get_signed_entity_config()?, - ); + let config = AggregatorConfig::new(Duration::from_millis(self.configuration.run_interval)); let runtime = AggregatorRuntime::new( config, None, @@ -1437,8 +1436,7 @@ impl DependenciesBuilder { &mut self, ) -> Result> { let activation = self - .get_signed_entity_config()? - .list_allowed_signed_entity_types_discriminants() + .get_allowed_signed_entity_types_discriminants()? .contains(&SignedEntityTypeDiscriminants::CardanoTransactions); let cardano_transactions_preloader = CardanoTransactionsPreloader::new( self.get_signed_entity_lock().await?, diff --git a/mithril-aggregator/src/dependency_injection/containers.rs b/mithril-aggregator/src/dependency_injection/containers.rs index 08b5227f2ca..c23ca6d58e2 100644 --- a/mithril-aggregator/src/dependency_injection/containers.rs +++ b/mithril-aggregator/src/dependency_injection/containers.rs @@ -1,5 +1,4 @@ -use mithril_persistence::sqlite::SqliteConnectionPool; -use std::sync::Arc; +use std::{collections::BTreeSet, sync::Arc}; use tokio::sync::RwLock; use mithril_common::{ @@ -10,7 +9,7 @@ use mithril_common::{ crypto_helper::ProtocolGenesisVerifier, digesters::{ImmutableDigester, ImmutableFileObserver}, entities::{ - CardanoTransactionsSigningConfig, Epoch, ProtocolParameters, SignedEntityConfig, + CardanoTransactionsSigningConfig, Epoch, ProtocolParameters, SignedEntityTypeDiscriminants, SignerWithStake, StakeDistribution, }, era::{EraChecker, EraReader}, @@ -19,7 +18,10 @@ use mithril_common::{ test_utils::MithrilFixture, TickerService, }; -use mithril_persistence::{sqlite::SqliteConnection, store::StakeStorer}; +use mithril_persistence::{ + sqlite::{SqliteConnection, SqliteConnectionPool}, + store::StakeStorer, +}; use crate::{ configuration::*, @@ -48,8 +50,8 @@ pub struct DependencyContainer { /// Configuration structure. pub config: Configuration, - /// Signed entity configuration. - pub signed_entity_config: SignedEntityConfig, + /// List of signed entity discriminants that are allowed to be processed + pub allowed_discriminants: BTreeSet, /// SQLite database connection /// diff --git a/mithril-aggregator/src/http_server/routes/epoch_routes.rs b/mithril-aggregator/src/http_server/routes/epoch_routes.rs index 38f6a0010c4..3ec8f60e904 100644 --- a/mithril-aggregator/src/http_server/routes/epoch_routes.rs +++ b/mithril-aggregator/src/http_server/routes/epoch_routes.rs @@ -1,8 +1,8 @@ -use std::sync::Arc; +use std::{collections::BTreeSet, sync::Arc}; use warp::Filter; use mithril_common::{ - entities::{SignedEntityConfig, SignedEntityTypeDiscriminants}, + entities::SignedEntityTypeDiscriminants, messages::{EpochSettingsMessage, SignerMessagePart}, StdResult, }; @@ -24,13 +24,13 @@ fn epoch_settings( warp::path!("epoch-settings") .and(warp::get()) .and(middlewares::with_epoch_service(dependency_manager.clone())) - .and(middlewares::with_signed_entity_config(dependency_manager)) + .and(middlewares::with_allowed_discriminants(dependency_manager)) .and_then(handlers::epoch_settings) } async fn get_epoch_settings_message( epoch_service: EpochServiceWrapper, - signed_entity_config: SignedEntityConfig, + allowed_discriminants: BTreeSet, ) -> StdResult { let epoch_service = epoch_service.read().await; @@ -40,9 +40,8 @@ async fn get_epoch_settings_message( let current_signers = epoch_service.current_signers()?; let next_signers = epoch_service.next_signers()?; - let allowed_types = signed_entity_config.list_allowed_signed_entity_types_discriminants(); let cardano_transactions_discriminant = - allowed_types.get(&SignedEntityTypeDiscriminants::CardanoTransactions); + allowed_discriminants.get(&SignedEntityTypeDiscriminants::CardanoTransactions); let cardano_transactions_signing_config = cardano_transactions_discriminant .map(|_| epoch_service.current_cardano_transactions_signing_config()) @@ -68,10 +67,11 @@ async fn get_epoch_settings_message( mod handlers { use slog_scope::debug; + use std::collections::BTreeSet; use std::convert::Infallible; use warp::http::StatusCode; - use mithril_common::entities::SignedEntityConfig; + use mithril_common::entities::SignedEntityTypeDiscriminants; use crate::dependency_injection::EpochServiceWrapper; use crate::http_server::routes::epoch_routes::get_epoch_settings_message; @@ -80,11 +80,11 @@ mod handlers { /// Epoch Settings pub async fn epoch_settings( epoch_service: EpochServiceWrapper, - signed_entity_config: SignedEntityConfig, + allowed_discriminants: BTreeSet, ) -> Result { debug!("⇄ HTTP SERVER: epoch_settings"); let epoch_settings_message = - get_epoch_settings_message(epoch_service, signed_entity_config).await; + get_epoch_settings_message(epoch_service, allowed_discriminants).await; match epoch_settings_message { Ok(message) => Ok(reply::json(&message, StatusCode::OK)), @@ -135,20 +135,10 @@ mod tests { let fixture = MithrilFixtureBuilder::default().with_signers(3).build(); let epoch_service = FakeEpochService::from_fixture(Epoch(4), &fixture); let epoch_service = Arc::new(RwLock::new(epoch_service)); + let allowed_discriminants = + BTreeSet::from([SignedEntityTypeDiscriminants::CardanoTransactions]); - let cardano_transactions_signing_config = CardanoTransactionsSigningConfig { - security_parameter: BlockNumber(70), - step: BlockNumber(15), - }; - let signed_entity_config = SignedEntityConfig { - cardano_transactions_signing_config: cardano_transactions_signing_config.clone(), - allowed_discriminants: BTreeSet::from([ - SignedEntityTypeDiscriminants::CardanoTransactions, - ]), - ..SignedEntityConfig::dummy() - }; - - let message = get_epoch_settings_message(epoch_service, signed_entity_config) + let message = get_epoch_settings_message(epoch_service, allowed_discriminants) .await .unwrap(); @@ -162,17 +152,8 @@ mod tests { let epoch_service = FakeEpochService::from_fixture(Epoch(4), &fixture); let epoch_service = Arc::new(RwLock::new(epoch_service)); - let cardano_transactions_signing_config = CardanoTransactionsSigningConfig { - security_parameter: BlockNumber(70), - step: BlockNumber(15), - }; - let signed_entity_config = SignedEntityConfig { - cardano_transactions_signing_config, - allowed_discriminants: BTreeSet::new(), - ..SignedEntityConfig::dummy() - }; - - let message = get_epoch_settings_message(epoch_service, signed_entity_config) + let allowed_discriminants = BTreeSet::new(); + let message = get_epoch_settings_message(epoch_service, allowed_discriminants) .await .unwrap(); @@ -207,7 +188,7 @@ mod tests { let message = get_epoch_settings_message( Arc::new(RwLock::new(epoch_service)), - SignedEntityConfig::dummy(), + SignedEntityTypeDiscriminants::all(), ) .await .unwrap(); @@ -251,7 +232,7 @@ mod tests { let message = get_epoch_settings_message( Arc::new(RwLock::new(epoch_service)), - SignedEntityConfig::dummy(), + SignedEntityTypeDiscriminants::all(), ) .await .unwrap(); diff --git a/mithril-aggregator/src/http_server/routes/middlewares.rs b/mithril-aggregator/src/http_server/routes/middlewares.rs index 89d0f842b70..5cce8484d5f 100644 --- a/mithril-aggregator/src/http_server/routes/middlewares.rs +++ b/mithril-aggregator/src/http_server/routes/middlewares.rs @@ -1,10 +1,11 @@ +use std::collections::BTreeSet; use std::convert::Infallible; use std::sync::Arc; use warp::Filter; use mithril_common::api_version::APIVersionProvider; -use mithril_common::entities::SignedEntityConfig; +use mithril_common::entities::SignedEntityTypeDiscriminants; use crate::database::repository::SignerGetter; use crate::dependency_injection::EpochServiceWrapper; @@ -43,11 +44,11 @@ pub fn with_config( warp::any().map(move || dependency_manager.config.clone()) } -/// With signed entity config middleware -pub fn with_signed_entity_config( +/// With allowed discriminants config middleware +pub fn with_allowed_discriminants( dependency_manager: Arc, -) -> impl Filter + Clone { - warp::any().map(move || dependency_manager.signed_entity_config.clone()) +) -> impl Filter,), Error = Infallible> + Clone { + warp::any().map(move || dependency_manager.allowed_discriminants.clone()) } /// With Event transmitter middleware diff --git a/mithril-aggregator/src/http_server/routes/root_routes.rs b/mithril-aggregator/src/http_server/routes/root_routes.rs index 94333bef1fc..dd38bbbe7a1 100644 --- a/mithril-aggregator/src/http_server/routes/root_routes.rs +++ b/mithril-aggregator/src/http_server/routes/root_routes.rs @@ -18,7 +18,7 @@ fn root( .and(middlewares::with_api_version_provider( dependency_manager.clone(), )) - .and(middlewares::with_signed_entity_config( + .and(middlewares::with_allowed_discriminants( dependency_manager.clone(), )) .and(middlewares::with_config(dependency_manager)) @@ -26,13 +26,14 @@ fn root( } mod handlers { + use std::collections::BTreeSet; use std::{convert::Infallible, sync::Arc}; use slog_scope::{debug, warn}; use warp::http::StatusCode; use mithril_common::api_version::APIVersionProvider; - use mithril_common::entities::{SignedEntityConfig, SignedEntityTypeDiscriminants}; + use mithril_common::entities::SignedEntityTypeDiscriminants; use mithril_common::messages::{ AggregatorCapabilities, AggregatorFeaturesMessage, CardanoTransactionsProverCapabilities, }; @@ -43,7 +44,7 @@ mod handlers { /// Root pub async fn root( api_version_provider: Arc, - signed_entity_config: SignedEntityConfig, + allowed_discriminants: BTreeSet, configuration: Configuration, ) -> Result { debug!("⇄ HTTP SERVER: root"); @@ -54,8 +55,7 @@ mod handlers { ); let mut capabilities = AggregatorCapabilities { - signed_entity_types: signed_entity_config - .list_allowed_signed_entity_types_discriminants(), + signed_entity_types: allowed_discriminants, cardano_transactions_prover: None, cardano_transactions_signing_config: None, }; @@ -87,8 +87,9 @@ mod handlers { #[cfg(test)] mod tests { + use crate::dependency_injection::DependenciesBuilder; use crate::http_server::SERVER_BASE_PATH; - use crate::{initialize_dependencies, DependencyContainer}; + use crate::{Configuration, DependencyContainer}; use mithril_common::entities::{ BlockNumber, CardanoTransactionsSigningConfig, SignedEntityTypeDiscriminants, }; @@ -123,14 +124,31 @@ mod tests { async fn test_root_route_ok() { let method = Method::GET.as_str(); let path = "/"; - let mut dependency_manager = initialize_dependencies().await; - dependency_manager - .signed_entity_config - .allowed_discriminants = BTreeSet::from([ - SignedEntityTypeDiscriminants::MithrilStakeDistribution, - SignedEntityTypeDiscriminants::CardanoImmutableFilesFull, - SignedEntityTypeDiscriminants::CardanoStakeDistribution, - ]); + let config = Configuration { + signed_entity_types: Some( + BTreeSet::from([ + SignedEntityTypeDiscriminants::CardanoStakeDistribution, + SignedEntityTypeDiscriminants::CardanoImmutableFilesFull, + SignedEntityTypeDiscriminants::MithrilStakeDistribution, + ]) + .iter() + .map(SignedEntityTypeDiscriminants::to_string) + .collect::>() + .join(","), + ), + ..Configuration::new_sample() + }; + let mut builder = DependenciesBuilder::new(config); + let dependency_manager = builder.build_dependency_container().await.unwrap(); + + // let mut dependency_manager = initialize_dependencies().await; + // dependency_manager + // .signed_entity_config + // .allowed_discriminants = BTreeSet::from([ + // SignedEntityTypeDiscriminants::MithrilStakeDistribution, + // SignedEntityTypeDiscriminants::CardanoImmutableFilesFull, + // SignedEntityTypeDiscriminants::CardanoStakeDistribution, + // ]); let expected_open_api_version = dependency_manager .api_version_provider .clone() @@ -182,11 +200,24 @@ mod tests { async fn test_root_route_ok_with_cardano_transactions_enabled() { let method = Method::GET.as_str(); let path = "/"; - let mut dependency_manager = initialize_dependencies().await; - dependency_manager - .signed_entity_config - .allowed_discriminants = - BTreeSet::from([SignedEntityTypeDiscriminants::CardanoTransactions]); + let config = Configuration { + signed_entity_types: Some( + BTreeSet::from([SignedEntityTypeDiscriminants::CardanoTransactions]) + .iter() + .map(SignedEntityTypeDiscriminants::to_string) + .collect::>() + .join(","), + ), + ..Configuration::new_sample() + }; + let mut builder = DependenciesBuilder::new(config); + let mut dependency_manager = builder.build_dependency_container().await.unwrap(); + + // let mut dependency_manager = initialize_dependencies().await; + // dependency_manager + // .signed_entity_config + // .allowed_discriminants = + // BTreeSet::from([SignedEntityTypeDiscriminants::CardanoTransactions]); dependency_manager .config .cardano_transactions_prover_max_hashes_allowed_by_request = 99; diff --git a/mithril-aggregator/src/runtime/runner.rs b/mithril-aggregator/src/runtime/runner.rs index 5f765023c5c..ed3f4fd8012 100644 --- a/mithril-aggregator/src/runtime/runner.rs +++ b/mithril-aggregator/src/runtime/runner.rs @@ -5,8 +5,7 @@ use std::sync::Arc; use std::time::Duration; use mithril_common::entities::{ - Certificate, CertificatePending, Epoch, ProtocolMessage, SignedEntityConfig, SignedEntityType, - Signer, TimePoint, + Certificate, CertificatePending, Epoch, ProtocolMessage, SignedEntityType, Signer, TimePoint, }; use mithril_common::StdResult; use mithril_persistence::store::StakeStorer; @@ -22,18 +21,12 @@ use mockall::automock; pub struct AggregatorConfig { /// Interval between each snapshot, in ms pub interval: Duration, - - /// Signed entity configuration. - pub signed_entity_config: SignedEntityConfig, } impl AggregatorConfig { /// Create a new instance of AggregatorConfig. - pub fn new(interval: Duration, signed_entity_config: SignedEntityConfig) -> Self { - Self { - interval, - signed_entity_config, - } + pub fn new(interval: Duration) -> Self { + Self { interval } } } @@ -157,7 +150,10 @@ impl AggregatorRunner { ) -> StdResult> { let signed_entity_types = self .dependencies - .signed_entity_config + .epoch_service + .read() + .await + .signed_entity_config()? .list_allowed_signed_entity_types(time_point)?; let unlocked_signed_entities = self .dependencies @@ -528,7 +524,7 @@ impl AggregatorRunnerTrait for AggregatorRunner { #[cfg(test)] pub mod tests { use crate::entities::AggregatorEpochSettings; - use crate::services::{FakeEpochService, MockUpkeepService}; + use crate::services::{FakeEpochService, FakeEpochServiceData, MockUpkeepService}; use crate::{ entities::OpenMessage, initialize_dependencies, @@ -977,9 +973,13 @@ pub mod tests { let expected_epoch_settings = AggregatorEpochSettings { protocol_parameters: deps.config.protocol_parameters.clone(), cardano_transactions_signing_config: deps - .signed_entity_config + .config .cardano_transactions_signing_config .clone(), + // cardano_transactions_signing_config: deps + // .signed_entity_config + // .cardano_transactions_signing_config + // .clone(), }; let current_epoch = deps.ticker_service.get_current_epoch().await.unwrap(); let insert_epoch = current_epoch.offset_to_epoch_settings_recording_epoch(); @@ -1224,8 +1224,14 @@ pub mod tests { async fn list_available_signed_entity_types_list_all_configured_entities_if_none_are_locked() { let runner = { let mut dependencies = initialize_dependencies().await; - dependencies.signed_entity_config.allowed_discriminants = - SignedEntityTypeDiscriminants::all(); + let epoch_service = FakeEpochService::new(FakeEpochServiceData { + signed_entity_config: SignedEntityConfig { + allowed_discriminants: SignedEntityTypeDiscriminants::all(), + ..SignedEntityConfig::dummy() + }, + ..FakeEpochServiceData::dummy(Epoch(32)) + }); + dependencies.epoch_service = Arc::new(RwLock::new(epoch_service)); dependencies.signed_entity_type_lock = Arc::new(SignedEntityTypeLock::default()); AggregatorRunner::new(Arc::new(dependencies)) }; @@ -1252,9 +1258,16 @@ pub mod tests { let signed_entity_type_lock = Arc::new(SignedEntityTypeLock::default()); let runner = { let mut dependencies = initialize_dependencies().await; - dependencies.signed_entity_config.allowed_discriminants = - SignedEntityTypeDiscriminants::all(); dependencies.signed_entity_type_lock = signed_entity_type_lock.clone(); + let epoch_service = FakeEpochService::new(FakeEpochServiceData { + signed_entity_config: SignedEntityConfig { + allowed_discriminants: SignedEntityTypeDiscriminants::all(), + ..SignedEntityConfig::dummy() + }, + ..FakeEpochServiceData::dummy(Epoch(32)) + }); + dependencies.epoch_service = Arc::new(RwLock::new(epoch_service)); + AggregatorRunner::new(Arc::new(dependencies)) }; diff --git a/mithril-aggregator/src/runtime/state_machine.rs b/mithril-aggregator/src/runtime/state_machine.rs index ebbaa82f0e8..b4b09e2fc09 100644 --- a/mithril-aggregator/src/runtime/state_machine.rs +++ b/mithril-aggregator/src/runtime/state_machine.rs @@ -396,7 +396,6 @@ mod tests { use mockall::predicate; use std::time::Duration; - use mithril_common::entities::SignedEntityConfig; use mithril_common::test_utils::fake_data; use super::super::runner::MockAggregatorRunner; @@ -407,7 +406,7 @@ mod tests { runner: MockAggregatorRunner, ) -> AggregatorRuntime { AggregatorRuntime::new( - AggregatorConfig::new(Duration::from_millis(20), SignedEntityConfig::dummy()), + AggregatorConfig::new(Duration::from_millis(20)), init_state, Arc::new(runner), ) diff --git a/mithril-aggregator/src/services/epoch_service.rs b/mithril-aggregator/src/services/epoch_service.rs index a1a824ebdef..d7c8a33aa66 100644 --- a/mithril-aggregator/src/services/epoch_service.rs +++ b/mithril-aggregator/src/services/epoch_service.rs @@ -398,50 +398,67 @@ pub struct FakeEpochService { precompute_epoch_data_error: bool, } +#[cfg(test)] +pub struct FakeEpochServiceData { + pub epoch: Epoch, + pub epoch_settings: AggregatorEpochSettings, + pub next_epoch_settings: AggregatorEpochSettings, + pub upcoming_epoch_settings: AggregatorEpochSettings, + pub current_signers_with_stake: Vec, + pub next_signers_with_stake: Vec, + pub signed_entity_config: SignedEntityConfig, +} + +#[cfg(test)] +impl FakeEpochServiceData { + pub fn dummy(epoch: Epoch) -> Self { + use mithril_common::test_utils::fake_data; + let signers = fake_data::signers_with_stakes(3); + + Self { + epoch, + epoch_settings: AggregatorEpochSettings::dummy(), + next_epoch_settings: AggregatorEpochSettings::dummy(), + upcoming_epoch_settings: AggregatorEpochSettings::dummy(), + current_signers_with_stake: signers.clone(), + next_signers_with_stake: signers, + signed_entity_config: SignedEntityConfig::dummy(), + } + } +} + #[cfg(test)] impl FakeEpochService { - /// Note: protocol multi signers and current/next avk will be computed using the given protocol - /// parameters and signers. - pub fn with_data( - epoch: Epoch, - epoch_settings: &AggregatorEpochSettings, - next_epoch_settings: &AggregatorEpochSettings, - upcoming_epoch_settings: &AggregatorEpochSettings, - current_signers_with_stake: &[SignerWithStake], - next_signers_with_stake: &[SignerWithStake], - signed_entity_config: SignedEntityConfig, - ) -> Self { + pub fn new(data: FakeEpochServiceData) -> Self { + let current_signers = Signer::vec_from(data.current_signers_with_stake.clone()); + let next_signers = Signer::vec_from(data.next_signers_with_stake.clone()); + let protocol_multi_signer = SignerBuilder::new( - current_signers_with_stake, - &epoch_settings.protocol_parameters, + &data.current_signers_with_stake, + &data.epoch_settings.protocol_parameters, ) .with_context(|| "Could not build protocol_multi_signer for epoch service") .unwrap() .build_multi_signer(); let next_protocol_multi_signer = SignerBuilder::new( - next_signers_with_stake, - &next_epoch_settings.protocol_parameters, + &data.next_signers_with_stake, + &data.next_epoch_settings.protocol_parameters, ) .with_context(|| "Could not build protocol_multi_signer for epoch service") .unwrap() .build_multi_signer(); - let current_signers_with_stake = current_signers_with_stake.to_vec(); - let next_signers_with_stake = next_signers_with_stake.to_vec(); - let current_signers = Signer::vec_from(current_signers_with_stake.clone()); - let next_signers = Signer::vec_from(next_signers_with_stake.clone()); - Self { epoch_data: Some(EpochData { - epoch, - epoch_settings: epoch_settings.clone(), - next_epoch_settings: next_epoch_settings.clone(), - upcoming_epoch_settings: upcoming_epoch_settings.clone(), - current_signers_with_stake, - next_signers_with_stake, + epoch: data.epoch, + epoch_settings: data.epoch_settings, + next_epoch_settings: data.next_epoch_settings, + upcoming_epoch_settings: data.upcoming_epoch_settings, + current_signers_with_stake: data.current_signers_with_stake, + next_signers_with_stake: data.next_signers_with_stake, current_signers, next_signers, - signed_entity_config, + signed_entity_config: data.signed_entity_config, }), computed_epoch_data: Some(ComputedEpochData { aggregate_verification_key: protocol_multi_signer @@ -457,6 +474,28 @@ impl FakeEpochService { } } + /// Note: protocol multi signers and current/next avk will be computed using the given protocol + /// parameters and signers. + pub fn with_data( + epoch: Epoch, + epoch_settings: &AggregatorEpochSettings, + next_epoch_settings: &AggregatorEpochSettings, + upcoming_epoch_settings: &AggregatorEpochSettings, + current_signers_with_stake: &[SignerWithStake], + next_signers_with_stake: &[SignerWithStake], + signed_entity_config: SignedEntityConfig, + ) -> Self { + Self::new(FakeEpochServiceData { + epoch, + epoch_settings: epoch_settings.clone(), + next_epoch_settings: next_epoch_settings.clone(), + upcoming_epoch_settings: upcoming_epoch_settings.clone(), + current_signers_with_stake: current_signers_with_stake.to_vec(), + next_signers_with_stake: next_signers_with_stake.to_vec(), + signed_entity_config, + }) + } + pub fn from_fixture( epoch: Epoch, fixture: &mithril_common::test_utils::MithrilFixture, diff --git a/mithril-aggregator/tests/test_extensions/aggregator_observer.rs b/mithril-aggregator/tests/test_extensions/aggregator_observer.rs index b633f43286b..67dd62585be 100644 --- a/mithril-aggregator/tests/test_extensions/aggregator_observer.rs +++ b/mithril-aggregator/tests/test_extensions/aggregator_observer.rs @@ -1,13 +1,12 @@ use anyhow::{anyhow, Context}; -use mithril_aggregator::services::SignedEntityService; use mithril_aggregator::{ - dependency_injection::DependenciesBuilder, entities::OpenMessage, services::CertifierService, + dependency_injection::{DependenciesBuilder, EpochServiceWrapper}, + entities::OpenMessage, + services::{CertifierService, SignedEntityService}, }; use mithril_common::entities::{CardanoTransactionsSnapshot, Certificate, SignedEntity}; use mithril_common::{ - entities::{ - Epoch, SignedEntityConfig, SignedEntityType, SignedEntityTypeDiscriminants, TimePoint, - }, + entities::{Epoch, SignedEntityType, SignedEntityTypeDiscriminants, TimePoint}, CardanoNetwork, StdResult, TickerService, }; use std::sync::Arc; @@ -18,7 +17,7 @@ pub struct AggregatorObserver { certifier_service: Arc, signed_entity_service: Arc, ticker_service: Arc, - signed_entity_config: SignedEntityConfig, + epoch_service: EpochServiceWrapper, } impl AggregatorObserver { @@ -29,7 +28,7 @@ impl AggregatorObserver { certifier_service: deps_builder.get_certifier_service().await.unwrap(), signed_entity_service: deps_builder.get_signed_entity_service().await.unwrap(), ticker_service: deps_builder.get_ticker_service().await.unwrap(), - signed_entity_config: deps_builder.get_signed_entity_config().unwrap(), + epoch_service: deps_builder.get_epoch_service().await.unwrap(), } } @@ -72,7 +71,10 @@ impl AggregatorObserver { .await .with_context(|| "Querying the current beacon should not fail")?; - self.signed_entity_config + self.epoch_service + .read() + .await + .signed_entity_config()? .time_point_to_signed_entity(discriminant, &time_point) } diff --git a/mithril-common/src/entities/signed_entity_config.rs b/mithril-common/src/entities/signed_entity_config.rs index 635eeafd461..6ede65f07fe 100644 --- a/mithril-common/src/entities/signed_entity_config.rs +++ b/mithril-common/src/entities/signed_entity_config.rs @@ -40,6 +40,14 @@ impl SignedEntityConfig { SignedEntityTypeDiscriminants::CardanoImmutableFilesFull, ]; + /// Append to the given list of allowed signed entity types discriminants the [Self::DEFAULT_ALLOWED_DISCRIMINANTS] + /// if not already present. + pub fn append_allowed_signed_entity_types_discriminants( + discriminants: &mut BTreeSet, + ) { + discriminants.append(&mut BTreeSet::from(Self::DEFAULT_ALLOWED_DISCRIMINANTS)); + } + /// Create the deduplicated list of allowed signed entity types discriminants. /// /// The list is the aggregation of [Self::DEFAULT_ALLOWED_DISCRIMINANTS] and @@ -47,8 +55,8 @@ impl SignedEntityConfig { pub fn list_allowed_signed_entity_types_discriminants( &self, ) -> BTreeSet { - let mut discriminants = BTreeSet::from(Self::DEFAULT_ALLOWED_DISCRIMINANTS); - discriminants.append(&mut self.allowed_discriminants.clone()); + let mut discriminants = self.allowed_discriminants.clone(); + Self::append_allowed_signed_entity_types_discriminants(&mut discriminants); discriminants } From 8f5ca53a7cf71f575ae07f5faa83a77c26afee6c Mon Sep 17 00:00:00 2001 From: Damien Lachaume <135982616+dlachaume@users.noreply.github.com> Date: Tue, 8 Oct 2024 14:54:42 +0200 Subject: [PATCH 209/274] Remove test function `build_service` in favor of `EpochServiceBuilder` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Sébastien Fauvel Co-authored-by: DJO --- .../src/services/epoch_service.rs | 87 +++++-------------- 1 file changed, 20 insertions(+), 67 deletions(-) diff --git a/mithril-aggregator/src/services/epoch_service.rs b/mithril-aggregator/src/services/epoch_service.rs index d7c8a33aa66..4f4d41569a8 100644 --- a/mithril-aggregator/src/services/epoch_service.rs +++ b/mithril-aggregator/src/services/epoch_service.rs @@ -668,7 +668,6 @@ mod tests { use mithril_persistence::store::adapter::MemoryAdapter; use std::collections::{BTreeSet, HashMap}; - use crate::services::epoch_service::tests::ServiceBuilderParameters::WithFutureProtocolParameters; use crate::store::FakeEpochSettingsStorer; use crate::VerificationKeyStore; @@ -827,48 +826,6 @@ mod tests { } } - // TODO: Use EpochServiceBuilder and remove ServiceBuilderParameters - enum ServiceBuilderParameters { - DifferentFixtureForSecondEpoch(MithrilFixture), - UpcomingProtocolParameters(ProtocolParameters), - WithFutureProtocolParameters(ProtocolParameters), - } - - // TODO: Use EpochServiceBuilder and remove build_service - /// By default will copy data from the given fixture for all epochs, can be fined tuned - /// with the [ServiceBuilderParameters]. - async fn build_service( - epoch: Epoch, - current_epoch_fixture: &MithrilFixture, - additional_params: &[ServiceBuilderParameters], - ) -> MithrilEpochService { - let mut builder = EpochServiceBuilder::new(epoch, current_epoch_fixture.clone()); - for params in additional_params { - match params { - ServiceBuilderParameters::DifferentFixtureForSecondEpoch(fixture) => { - builder.stored_next_epoch_settings = AggregatorEpochSettings { - protocol_parameters: fixture.protocol_parameters(), - cardano_transactions_signing_config: - CardanoTransactionsSigningConfig::dummy(), - }; - builder.next_signers_with_stake = fixture.signers_with_stake().clone(); - } - ServiceBuilderParameters::UpcomingProtocolParameters(params) => { - builder.stored_upcoming_epoch_settings = AggregatorEpochSettings { - protocol_parameters: params.clone(), - cardano_transactions_signing_config: - CardanoTransactionsSigningConfig::dummy(), - }; - } - ServiceBuilderParameters::WithFutureProtocolParameters(params) => { - builder.future_protocol_parameters = params.clone(); - } - } - } - - builder.build() - } - #[tokio::test] async fn inform_epoch_get_data_from_its_dependencies() { let current_epoch_fixture = MithrilFixtureBuilder::default().with_signers(3).build(); @@ -941,7 +898,7 @@ mod tests { SignedEntityTypeDiscriminants::CardanoImmutableFilesFull, ]); - let builder = EpochServiceBuilder { + let mut service = EpochServiceBuilder { network, allowed_discriminants: allowed_discriminants.clone(), stored_epoch_settings: AggregatorEpochSettings { @@ -949,9 +906,8 @@ mod tests { ..AggregatorEpochSettings::dummy() }, ..EpochServiceBuilder::new(epoch, MithrilFixtureBuilder::default().build()) - }; - - let mut service = builder.build(); + } + .build(); service .inform_epoch(epoch) @@ -981,14 +937,15 @@ mod tests { .build(); let epoch = Epoch(5); - let mut service = build_service( - epoch, - ¤t_epoch_fixture, - &[ServiceBuilderParameters::DifferentFixtureForSecondEpoch( - next_epoch_fixture.clone(), - )], - ) - .await; + let mut service = EpochServiceBuilder { + stored_next_epoch_settings: AggregatorEpochSettings { + protocol_parameters: next_epoch_fixture.protocol_parameters(), + cardano_transactions_signing_config: CardanoTransactionsSigningConfig::dummy(), + }, + next_signers_with_stake: next_epoch_fixture.signers_with_stake().clone(), + ..EpochServiceBuilder::new(epoch, current_epoch_fixture.clone()) + } + .build(); service .inform_epoch(epoch) @@ -1017,7 +974,7 @@ mod tests { let fixture = MithrilFixtureBuilder::default().with_signers(3).build(); let avk = fixture.compute_avk(); let epoch = Epoch(4); - let mut service = build_service(epoch, &fixture, &[]).await; + let mut service = EpochServiceBuilder::new(epoch, fixture.clone()).build(); let signer_builder = SignerBuilder::new( &fixture.signers_with_stake(), &fixture.protocol_parameters(), @@ -1040,17 +997,13 @@ mod tests { #[tokio::test] async fn update_epoch_settings_insert_future_epoch_settings_in_the_store() { - let fixture = MithrilFixtureBuilder::default().with_signers(3).build(); let future_protocol_parameters = ProtocolParameters::new(6, 89, 0.124); let epoch = Epoch(4); - let mut service = build_service( - epoch, - &fixture, - &[WithFutureProtocolParameters( - future_protocol_parameters.clone(), - )], - ) - .await; + let mut service = EpochServiceBuilder { + future_protocol_parameters: future_protocol_parameters.clone(), + ..EpochServiceBuilder::new(epoch, MithrilFixtureBuilder::default().build()) + } + .build(); service .inform_epoch(epoch) @@ -1082,7 +1035,7 @@ mod tests { #[tokio::test] async fn cant_get_data_if_inform_epoch_has_not_been_called() { let fixture = MithrilFixtureBuilder::default().with_signers(3).build(); - let service = build_service(Epoch(4), &fixture, &[]).await; + let service = EpochServiceBuilder::new(Epoch(4), fixture.clone()).build(); for (name, res) in [ ( @@ -1151,7 +1104,7 @@ mod tests { async fn can_only_get_non_computed_data_if_inform_epoch_has_been_called_but_not_precompute_epoch_data( ) { let fixture = MithrilFixtureBuilder::default().with_signers(3).build(); - let mut service = build_service(Epoch(4), &fixture, &[]).await; + let mut service = EpochServiceBuilder::new(Epoch(4), fixture.clone()).build(); service.inform_epoch(Epoch(4)).await.unwrap(); assert!(service.epoch_of_current_data().is_ok()); From 26be0d640575317b9c5eb9aeafd1b086db4e9a4f Mon Sep 17 00:00:00 2001 From: Damien Lachaume <135982616+dlachaume@users.noreply.github.com> Date: Tue, 8 Oct 2024 15:54:34 +0200 Subject: [PATCH 210/274] Refactor epoch service test tools --- .../mithril_stake_distribution.rs | 22 +++-- mithril-aggregator/src/configuration.rs | 2 +- .../src/http_server/routes/epoch_routes.rs | 40 ++++----- .../src/http_server/routes/root_routes.rs | 14 ---- mithril-aggregator/src/multi_signer.rs | 24 +++--- mithril-aggregator/src/runtime/runner.rs | 39 +++++---- .../src/services/epoch_service.rs | 81 +++++++------------ .../signable_builder/signable_seed_builder.rs | 42 +++++----- 8 files changed, 112 insertions(+), 152 deletions(-) diff --git a/mithril-aggregator/src/artifact_builder/mithril_stake_distribution.rs b/mithril-aggregator/src/artifact_builder/mithril_stake_distribution.rs index 081396005f6..5ab3bb5fdeb 100644 --- a/mithril-aggregator/src/artifact_builder/mithril_stake_distribution.rs +++ b/mithril-aggregator/src/artifact_builder/mithril_stake_distribution.rs @@ -38,15 +38,13 @@ impl ArtifactBuilder for MithrilStakeDistributi #[cfg(test)] mod tests { - use mithril_common::{ - crypto_helper::ProtocolParameters, entities::SignedEntityConfig, test_utils::fake_data, - }; + use mithril_common::{crypto_helper::ProtocolParameters, test_utils::fake_data}; use std::sync::Arc; use tokio::sync::RwLock; use super::*; - use crate::{entities::AggregatorEpochSettings, services::FakeEpochService}; + use crate::{entities::AggregatorEpochSettings, services::FakeEpochServiceBuilder}; #[tokio::test] async fn should_compute_valid_artifact() { @@ -56,15 +54,13 @@ mod tests { protocol_parameters: fake_data::protocol_parameters(), ..AggregatorEpochSettings::dummy() }; - let epoch_service = FakeEpochService::with_data( - Epoch(1), - &epoch_settings, - &epoch_settings, - &epoch_settings, - &signers_with_stake, - &signers_with_stake, - SignedEntityConfig::dummy(), - ); + let epoch_service = FakeEpochServiceBuilder { + epoch_settings: epoch_settings.clone(), + current_signers_with_stake: signers_with_stake.clone(), + next_signers_with_stake: signers_with_stake.clone(), + ..FakeEpochServiceBuilder::dummy(Epoch(1)) + } + .build(); let mithril_stake_distribution_artifact_builder = MithrilStakeDistributionArtifactBuilder::new(Arc::new(RwLock::new(epoch_service))); let artifact = mithril_stake_distribution_artifact_builder diff --git a/mithril-aggregator/src/configuration.rs b/mithril-aggregator/src/configuration.rs index 38ea004eb37..af4c00b3b37 100644 --- a/mithril-aggregator/src/configuration.rs +++ b/mithril-aggregator/src/configuration.rs @@ -289,7 +289,7 @@ impl Configuration { .map(|limit| if limit > 3 { limit as u64 } else { 3 }) } - /// Compute the list of signed entity discriminants that are allowed to be processed based in this configuration. + /// Compute the list of signed entity discriminants that are allowed to be processed based on this configuration. pub fn compute_allowed_signed_entity_types_discriminants( &self, ) -> StdResult> { diff --git a/mithril-aggregator/src/http_server/routes/epoch_routes.rs b/mithril-aggregator/src/http_server/routes/epoch_routes.rs index 3ec8f60e904..a6faaf5e98d 100644 --- a/mithril-aggregator/src/http_server/routes/epoch_routes.rs +++ b/mithril-aggregator/src/http_server/routes/epoch_routes.rs @@ -106,14 +106,14 @@ mod tests { use mithril_common::{ entities::{ BlockNumber, CardanoTransactionsSigningConfig, Epoch, ProtocolParameters, - SignedEntityConfig, SignedEntityTypeDiscriminants, + SignedEntityTypeDiscriminants, }, test_utils::{apispec::APISpec, fake_data, MithrilFixtureBuilder}, }; - use crate::initialize_dependencies; use crate::services::FakeEpochService; use crate::{entities::AggregatorEpochSettings, http_server::SERVER_BASE_PATH}; + use crate::{initialize_dependencies, services::FakeEpochServiceBuilder}; use super::*; @@ -176,15 +176,15 @@ mod tests { ..AggregatorEpochSettings::dummy() }; - let epoch_service = FakeEpochService::with_data( - Epoch(1), - ¤t_epoch_settings, - &next_epoch_settings, - &upcoming_epoch_settings, - &fake_data::signers_with_stakes(5), - &fake_data::signers_with_stakes(3), - SignedEntityConfig::dummy(), - ); + let epoch_service = FakeEpochServiceBuilder { + epoch_settings: current_epoch_settings, + next_epoch_settings: next_epoch_settings.clone(), + upcoming_epoch_settings: upcoming_epoch_settings.clone(), + current_signers_with_stake: fake_data::signers_with_stakes(5), + next_signers_with_stake: fake_data::signers_with_stakes(3), + ..FakeEpochServiceBuilder::dummy(Epoch(1)) + } + .build(); let message = get_epoch_settings_message( Arc::new(RwLock::new(epoch_service)), @@ -220,15 +220,15 @@ mod tests { ..AggregatorEpochSettings::dummy() }; - let epoch_service = FakeEpochService::with_data( - Epoch(1), - ¤t_epoch_settings, - &next_epoch_settings, - &AggregatorEpochSettings::dummy(), - &fake_data::signers_with_stakes(5), - &fake_data::signers_with_stakes(3), - SignedEntityConfig::dummy(), - ); + let epoch_service = FakeEpochServiceBuilder { + epoch_settings: current_epoch_settings.clone(), + next_epoch_settings: next_epoch_settings.clone(), + upcoming_epoch_settings: AggregatorEpochSettings::dummy(), + current_signers_with_stake: fake_data::signers_with_stakes(5), + next_signers_with_stake: fake_data::signers_with_stakes(3), + ..FakeEpochServiceBuilder::dummy(Epoch(1)) + } + .build(); let message = get_epoch_settings_message( Arc::new(RwLock::new(epoch_service)), diff --git a/mithril-aggregator/src/http_server/routes/root_routes.rs b/mithril-aggregator/src/http_server/routes/root_routes.rs index dd38bbbe7a1..4f029615b18 100644 --- a/mithril-aggregator/src/http_server/routes/root_routes.rs +++ b/mithril-aggregator/src/http_server/routes/root_routes.rs @@ -141,14 +141,6 @@ mod tests { let mut builder = DependenciesBuilder::new(config); let dependency_manager = builder.build_dependency_container().await.unwrap(); - // let mut dependency_manager = initialize_dependencies().await; - // dependency_manager - // .signed_entity_config - // .allowed_discriminants = BTreeSet::from([ - // SignedEntityTypeDiscriminants::MithrilStakeDistribution, - // SignedEntityTypeDiscriminants::CardanoImmutableFilesFull, - // SignedEntityTypeDiscriminants::CardanoStakeDistribution, - // ]); let expected_open_api_version = dependency_manager .api_version_provider .clone() @@ -212,12 +204,6 @@ mod tests { }; let mut builder = DependenciesBuilder::new(config); let mut dependency_manager = builder.build_dependency_container().await.unwrap(); - - // let mut dependency_manager = initialize_dependencies().await; - // dependency_manager - // .signed_entity_config - // .allowed_discriminants = - // BTreeSet::from([SignedEntityTypeDiscriminants::CardanoTransactions]); dependency_manager .config .cardano_transactions_prover_max_hashes_allowed_by_request = 99; diff --git a/mithril-aggregator/src/multi_signer.rs b/mithril-aggregator/src/multi_signer.rs index bade2b3e7a2..5f7baaa9bd3 100644 --- a/mithril-aggregator/src/multi_signer.rs +++ b/mithril-aggregator/src/multi_signer.rs @@ -134,7 +134,6 @@ impl MultiSigner for MultiSignerImpl { #[cfg(test)] mod tests { - use entities::SignedEntityConfig; use std::sync::Arc; use tokio::sync::RwLock; @@ -144,7 +143,7 @@ mod tests { use mithril_common::test_utils::{fake_data, MithrilFixtureBuilder}; use crate::entities::AggregatorEpochSettings; - use crate::services::FakeEpochService; + use crate::services::{FakeEpochService, FakeEpochServiceBuilder}; use super::*; @@ -173,25 +172,26 @@ mod tests { let epoch = Epoch(5); let fixture = MithrilFixtureBuilder::default().with_signers(5).build(); let next_fixture = MithrilFixtureBuilder::default().with_signers(4).build(); - let multi_signer = - MultiSignerImpl::new(Arc::new(RwLock::new(FakeEpochService::with_data( - epoch, - &AggregatorEpochSettings { + let multi_signer = MultiSignerImpl::new(Arc::new(RwLock::new( + FakeEpochServiceBuilder { + epoch_settings: AggregatorEpochSettings { protocol_parameters: fixture.protocol_parameters(), ..AggregatorEpochSettings::dummy() }, - &AggregatorEpochSettings { + next_epoch_settings: AggregatorEpochSettings { protocol_parameters: next_fixture.protocol_parameters(), ..AggregatorEpochSettings::dummy() }, - &AggregatorEpochSettings { + upcoming_epoch_settings: AggregatorEpochSettings { protocol_parameters: next_fixture.protocol_parameters(), ..AggregatorEpochSettings::dummy() }, - &fixture.signers_with_stake(), - &next_fixture.signers_with_stake(), - SignedEntityConfig::dummy(), - )))); + current_signers_with_stake: fixture.signers_with_stake(), + next_signers_with_stake: next_fixture.signers_with_stake(), + ..FakeEpochServiceBuilder::dummy(epoch) + } + .build(), + ))); { let message = setup_message(); diff --git a/mithril-aggregator/src/runtime/runner.rs b/mithril-aggregator/src/runtime/runner.rs index ed3f4fd8012..df5ad55a320 100644 --- a/mithril-aggregator/src/runtime/runner.rs +++ b/mithril-aggregator/src/runtime/runner.rs @@ -524,7 +524,7 @@ impl AggregatorRunnerTrait for AggregatorRunner { #[cfg(test)] pub mod tests { use crate::entities::AggregatorEpochSettings; - use crate::services::{FakeEpochService, FakeEpochServiceData, MockUpkeepService}; + use crate::services::{FakeEpochService, FakeEpochServiceBuilder, MockUpkeepService}; use crate::{ entities::OpenMessage, initialize_dependencies, @@ -976,10 +976,6 @@ pub mod tests { .config .cardano_transactions_signing_config .clone(), - // cardano_transactions_signing_config: deps - // .signed_entity_config - // .cardano_transactions_signing_config - // .clone(), }; let current_epoch = deps.ticker_service.get_current_epoch().await.unwrap(); let insert_epoch = current_epoch.offset_to_epoch_settings_recording_epoch(); @@ -1224,13 +1220,14 @@ pub mod tests { async fn list_available_signed_entity_types_list_all_configured_entities_if_none_are_locked() { let runner = { let mut dependencies = initialize_dependencies().await; - let epoch_service = FakeEpochService::new(FakeEpochServiceData { + let epoch_service = FakeEpochServiceBuilder { signed_entity_config: SignedEntityConfig { allowed_discriminants: SignedEntityTypeDiscriminants::all(), ..SignedEntityConfig::dummy() }, - ..FakeEpochServiceData::dummy(Epoch(32)) - }); + ..FakeEpochServiceBuilder::dummy(Epoch(32)) + } + .build(); dependencies.epoch_service = Arc::new(RwLock::new(epoch_service)); dependencies.signed_entity_type_lock = Arc::new(SignedEntityTypeLock::default()); AggregatorRunner::new(Arc::new(dependencies)) @@ -1259,13 +1256,14 @@ pub mod tests { let runner = { let mut dependencies = initialize_dependencies().await; dependencies.signed_entity_type_lock = signed_entity_type_lock.clone(); - let epoch_service = FakeEpochService::new(FakeEpochServiceData { + let epoch_service = FakeEpochServiceBuilder { signed_entity_config: SignedEntityConfig { allowed_discriminants: SignedEntityTypeDiscriminants::all(), ..SignedEntityConfig::dummy() }, - ..FakeEpochServiceData::dummy(Epoch(32)) - }); + ..FakeEpochServiceBuilder::dummy(Epoch(32)) + } + .build(); dependencies.epoch_service = Arc::new(RwLock::new(epoch_service)); AggregatorRunner::new(Arc::new(dependencies)) @@ -1311,6 +1309,10 @@ pub mod tests { assert!(is_outdated_returned_when(IsExpired::Yes, false).await); } + // The network field in the signed entity configuration is modified to test the scenario + // where the computed signed entity type differs from the one specified in the open message. + // This is the simplest attribute to manipulate, compared to the protocol parameters, + // even though it may not be a real use case. async fn is_outdated_returned_when( is_expired: IsExpired, same_signed_entity_type: bool, @@ -1358,16 +1360,11 @@ pub mod tests { deps.certifier_service = Arc::new(mock_certifier_service); - let epoch_settings = AggregatorEpochSettings::dummy(); - let epoch_service = FakeEpochService::with_data( - current_time_point.epoch, - &epoch_settings, - &epoch_settings, - &epoch_settings, - &fake_data::signers_with_stakes(1), - &fake_data::signers_with_stakes(1), - epoch_service_signed_entity_config, - ); + let epoch_service = FakeEpochServiceBuilder { + signed_entity_config: epoch_service_signed_entity_config, + ..FakeEpochServiceBuilder::dummy(current_time_point.epoch) + } + .build(); deps.epoch_service = Arc::new(RwLock::new(epoch_service)); build_runner_with_fixture_data(deps).await diff --git a/mithril-aggregator/src/services/epoch_service.rs b/mithril-aggregator/src/services/epoch_service.rs index 4f4d41569a8..577e06d9222 100644 --- a/mithril-aggregator/src/services/epoch_service.rs +++ b/mithril-aggregator/src/services/epoch_service.rs @@ -399,7 +399,7 @@ pub struct FakeEpochService { } #[cfg(test)] -pub struct FakeEpochServiceData { +pub struct FakeEpochServiceBuilder { pub epoch: Epoch, pub epoch_settings: AggregatorEpochSettings, pub next_epoch_settings: AggregatorEpochSettings, @@ -410,7 +410,7 @@ pub struct FakeEpochServiceData { } #[cfg(test)] -impl FakeEpochServiceData { +impl FakeEpochServiceBuilder { pub fn dummy(epoch: Epoch) -> Self { use mithril_common::test_utils::fake_data; let signers = fake_data::signers_with_stakes(3); @@ -425,40 +425,37 @@ impl FakeEpochServiceData { signed_entity_config: SignedEntityConfig::dummy(), } } -} -#[cfg(test)] -impl FakeEpochService { - pub fn new(data: FakeEpochServiceData) -> Self { - let current_signers = Signer::vec_from(data.current_signers_with_stake.clone()); - let next_signers = Signer::vec_from(data.next_signers_with_stake.clone()); + pub fn build(self) -> FakeEpochService { + let current_signers = Signer::vec_from(self.current_signers_with_stake.clone()); + let next_signers = Signer::vec_from(self.next_signers_with_stake.clone()); let protocol_multi_signer = SignerBuilder::new( - &data.current_signers_with_stake, - &data.epoch_settings.protocol_parameters, + &self.current_signers_with_stake, + &self.epoch_settings.protocol_parameters, ) .with_context(|| "Could not build protocol_multi_signer for epoch service") .unwrap() .build_multi_signer(); let next_protocol_multi_signer = SignerBuilder::new( - &data.next_signers_with_stake, - &data.next_epoch_settings.protocol_parameters, + &self.next_signers_with_stake, + &self.next_epoch_settings.protocol_parameters, ) .with_context(|| "Could not build protocol_multi_signer for epoch service") .unwrap() .build_multi_signer(); - Self { + FakeEpochService { epoch_data: Some(EpochData { - epoch: data.epoch, - epoch_settings: data.epoch_settings, - next_epoch_settings: data.next_epoch_settings, - upcoming_epoch_settings: data.upcoming_epoch_settings, - current_signers_with_stake: data.current_signers_with_stake, - next_signers_with_stake: data.next_signers_with_stake, + epoch: self.epoch, + epoch_settings: self.epoch_settings, + next_epoch_settings: self.next_epoch_settings, + upcoming_epoch_settings: self.upcoming_epoch_settings, + current_signers_with_stake: self.current_signers_with_stake, + next_signers_with_stake: self.next_signers_with_stake, current_signers, next_signers, - signed_entity_config: data.signed_entity_config, + signed_entity_config: self.signed_entity_config, }), computed_epoch_data: Some(ComputedEpochData { aggregate_verification_key: protocol_multi_signer @@ -473,29 +470,10 @@ impl FakeEpochService { precompute_epoch_data_error: false, } } +} - /// Note: protocol multi signers and current/next avk will be computed using the given protocol - /// parameters and signers. - pub fn with_data( - epoch: Epoch, - epoch_settings: &AggregatorEpochSettings, - next_epoch_settings: &AggregatorEpochSettings, - upcoming_epoch_settings: &AggregatorEpochSettings, - current_signers_with_stake: &[SignerWithStake], - next_signers_with_stake: &[SignerWithStake], - signed_entity_config: SignedEntityConfig, - ) -> Self { - Self::new(FakeEpochServiceData { - epoch, - epoch_settings: epoch_settings.clone(), - next_epoch_settings: next_epoch_settings.clone(), - upcoming_epoch_settings: upcoming_epoch_settings.clone(), - current_signers_with_stake: current_signers_with_stake.to_vec(), - next_signers_with_stake: next_signers_with_stake.to_vec(), - signed_entity_config, - }) - } - +#[cfg(test)] +impl FakeEpochService { pub fn from_fixture( epoch: Epoch, fixture: &mithril_common::test_utils::MithrilFixture, @@ -514,15 +492,16 @@ impl FakeEpochService { protocol_parameters: fixture.protocol_parameters(), cardano_transactions_signing_config: CardanoTransactionsSigningConfig::dummy(), }; - Self::with_data( - epoch, - &epoch_settings, - &next_epoch_settings, - &upcoming_epoch_settings, - &fixture.signers_with_stake(), - &fixture.signers_with_stake(), - SignedEntityConfig::dummy(), - ) + + FakeEpochServiceBuilder { + epoch_settings, + next_epoch_settings, + upcoming_epoch_settings, + current_signers_with_stake: fixture.signers_with_stake(), + next_signers_with_stake: fixture.signers_with_stake(), + ..FakeEpochServiceBuilder::dummy(epoch) + } + .build() } /// Note: using this will make all 'get' method from [EpochService] trait diff --git a/mithril-aggregator/src/services/signable_builder/signable_seed_builder.rs b/mithril-aggregator/src/services/signable_builder/signable_seed_builder.rs index 8082c34351c..ea1f1130f70 100644 --- a/mithril-aggregator/src/services/signable_builder/signable_seed_builder.rs +++ b/mithril-aggregator/src/services/signable_builder/signable_seed_builder.rs @@ -57,11 +57,11 @@ impl SignableSeedBuilder for AggregatorSignableSeedBuilder { #[cfg(test)] mod tests { use mithril_common::{ - entities::{Epoch, SignedEntityConfig}, + entities::Epoch, test_utils::{MithrilFixture, MithrilFixtureBuilder}, }; - use crate::{entities::AggregatorEpochSettings, services::FakeEpochService}; + use crate::{entities::AggregatorEpochSettings, services::FakeEpochServiceBuilder}; use super::*; @@ -70,24 +70,26 @@ mod tests { fixture: &MithrilFixture, next_fixture: &MithrilFixture, ) -> AggregatorSignableSeedBuilder { - let epoch_service = Arc::new(RwLock::new(FakeEpochService::with_data( - epoch, - &AggregatorEpochSettings { - protocol_parameters: fixture.protocol_parameters(), - ..AggregatorEpochSettings::dummy() - }, - &AggregatorEpochSettings { - protocol_parameters: next_fixture.protocol_parameters(), - ..AggregatorEpochSettings::dummy() - }, - &AggregatorEpochSettings { - protocol_parameters: next_fixture.protocol_parameters(), - ..AggregatorEpochSettings::dummy() - }, - &fixture.signers_with_stake(), - &next_fixture.signers_with_stake(), - SignedEntityConfig::dummy(), - ))); + let epoch_service = Arc::new(RwLock::new( + FakeEpochServiceBuilder { + epoch_settings: AggregatorEpochSettings { + protocol_parameters: fixture.protocol_parameters(), + ..AggregatorEpochSettings::dummy() + }, + next_epoch_settings: AggregatorEpochSettings { + protocol_parameters: next_fixture.protocol_parameters(), + ..AggregatorEpochSettings::dummy() + }, + upcoming_epoch_settings: AggregatorEpochSettings { + protocol_parameters: next_fixture.protocol_parameters(), + ..AggregatorEpochSettings::dummy() + }, + current_signers_with_stake: fixture.signers_with_stake(), + next_signers_with_stake: next_fixture.signers_with_stake(), + ..FakeEpochServiceBuilder::dummy(epoch) + } + .build(), + )); AggregatorSignableSeedBuilder::new(epoch_service) } From 65e8a7dfc641fc2dd087abebb6d1bd86ff425f3a Mon Sep 17 00:00:00 2001 From: Damien Lachaume <135982616+dlachaume@users.noreply.github.com> Date: Wed, 9 Oct 2024 15:40:04 +0200 Subject: [PATCH 211/274] Renaming and remove comments MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Sébastien Fauvel --- .../src/http_server/routes/epoch_routes.rs | 4 ++- .../src/http_server/routes/middlewares.rs | 4 +-- .../src/http_server/routes/root_routes.rs | 6 ++-- mithril-aggregator/src/runtime/runner.rs | 36 ++++++++----------- .../src/runtime/state_machine.rs | 10 +++--- .../src/services/epoch_service.rs | 10 ++---- 6 files changed, 31 insertions(+), 39 deletions(-) diff --git a/mithril-aggregator/src/http_server/routes/epoch_routes.rs b/mithril-aggregator/src/http_server/routes/epoch_routes.rs index a6faaf5e98d..0cd7040dea7 100644 --- a/mithril-aggregator/src/http_server/routes/epoch_routes.rs +++ b/mithril-aggregator/src/http_server/routes/epoch_routes.rs @@ -24,7 +24,9 @@ fn epoch_settings( warp::path!("epoch-settings") .and(warp::get()) .and(middlewares::with_epoch_service(dependency_manager.clone())) - .and(middlewares::with_allowed_discriminants(dependency_manager)) + .and(middlewares::with_allowed_signed_entity_type_discriminants( + dependency_manager, + )) .and_then(handlers::epoch_settings) } diff --git a/mithril-aggregator/src/http_server/routes/middlewares.rs b/mithril-aggregator/src/http_server/routes/middlewares.rs index 5cce8484d5f..0dd3039c867 100644 --- a/mithril-aggregator/src/http_server/routes/middlewares.rs +++ b/mithril-aggregator/src/http_server/routes/middlewares.rs @@ -44,8 +44,8 @@ pub fn with_config( warp::any().map(move || dependency_manager.config.clone()) } -/// With allowed discriminants config middleware -pub fn with_allowed_discriminants( +/// With allowed signed entity discriminants middleware +pub fn with_allowed_signed_entity_type_discriminants( dependency_manager: Arc, ) -> impl Filter,), Error = Infallible> + Clone { warp::any().map(move || dependency_manager.allowed_discriminants.clone()) diff --git a/mithril-aggregator/src/http_server/routes/root_routes.rs b/mithril-aggregator/src/http_server/routes/root_routes.rs index 4f029615b18..12cb259a2a0 100644 --- a/mithril-aggregator/src/http_server/routes/root_routes.rs +++ b/mithril-aggregator/src/http_server/routes/root_routes.rs @@ -18,7 +18,7 @@ fn root( .and(middlewares::with_api_version_provider( dependency_manager.clone(), )) - .and(middlewares::with_allowed_discriminants( + .and(middlewares::with_allowed_signed_entity_type_discriminants( dependency_manager.clone(), )) .and(middlewares::with_config(dependency_manager)) @@ -44,7 +44,7 @@ mod handlers { /// Root pub async fn root( api_version_provider: Arc, - allowed_discriminants: BTreeSet, + allowed_signed_entity_type_discriminants: BTreeSet, configuration: Configuration, ) -> Result { debug!("⇄ HTTP SERVER: root"); @@ -55,7 +55,7 @@ mod handlers { ); let mut capabilities = AggregatorCapabilities { - signed_entity_types: allowed_discriminants, + signed_entity_types: allowed_signed_entity_type_discriminants, cardano_transactions_prover: None, cardano_transactions_signing_config: None, }; diff --git a/mithril-aggregator/src/runtime/runner.rs b/mithril-aggregator/src/runtime/runner.rs index df5ad55a320..7030de7b72e 100644 --- a/mithril-aggregator/src/runtime/runner.rs +++ b/mithril-aggregator/src/runtime/runner.rs @@ -125,7 +125,7 @@ pub trait AggregatorRunnerTrait: Sync + Send { ) -> StdResult; /// Checks if the open message is considered outdated. - async fn is_outdated( + async fn is_open_message_outdated( &self, open_message_signed_entity_type: SignedEntityType, last_time_point: &TimePoint, @@ -490,7 +490,7 @@ impl AggregatorRunnerTrait for AggregatorRunner { .await } - async fn is_outdated( + async fn is_open_message_outdated( &self, open_message_signed_entity_type: SignedEntityType, last_time_point: &TimePoint, @@ -1287,36 +1287,30 @@ pub mod tests { } #[tokio::test] - async fn is_outdated_return_false_when_message_is_not_expired_and_has_same_signed_entity_type() - { - assert!(!is_outdated_returned_when(IsExpired::No, true).await); + async fn is_outdated_return_false_when_message_is_not_expired_and_no_newer_open_message() { + assert!(!is_outdated_returned_when(IsExpired::No, false).await); } #[tokio::test] - async fn is_outdated_return_true_when_message_is_expired_and_has_same_signed_entity_type() { - assert!(is_outdated_returned_when(IsExpired::Yes, true).await); + async fn is_outdated_return_true_when_message_is_expired_and_no_newer_open_message() { + assert!(is_outdated_returned_when(IsExpired::Yes, false).await); } #[tokio::test] - async fn is_outdated_return_true_when_message_is_not_expired_and_has_not_the_same_signed_entity_type( - ) { - assert!(is_outdated_returned_when(IsExpired::No, false).await); + async fn is_outdated_return_true_when_message_is_not_expired_and_exists_newer_open_message() { + assert!(is_outdated_returned_when(IsExpired::No, true).await); } #[tokio::test] - async fn is_outdated_return_true_when_message_is_expired_and_has_not_the_same_signed_entity_type( - ) { - assert!(is_outdated_returned_when(IsExpired::Yes, false).await); + async fn is_outdated_return_true_when_message_is_expired_and_exists_newer_open_message() { + assert!(is_outdated_returned_when(IsExpired::Yes, true).await); } // The network field in the signed entity configuration is modified to test the scenario // where the computed signed entity type differs from the one specified in the open message. // This is the simplest attribute to manipulate, compared to the protocol parameters, // even though it may not be a real use case. - async fn is_outdated_returned_when( - is_expired: IsExpired, - same_signed_entity_type: bool, - ) -> bool { + async fn is_outdated_returned_when(is_expired: IsExpired, newer_open_message: bool) -> bool { let current_time_point = TimePoint { epoch: Epoch(2), immutable_file_number: 12, @@ -1324,10 +1318,10 @@ pub mod tests { }; let message_network = CardanoNetwork::MainNet; - let epoch_service_network = if same_signed_entity_type { - message_network - } else { + let epoch_service_network = if newer_open_message { CardanoNetwork::DevNet(412) + } else { + message_network }; let epoch_service_signed_entity_config = SignedEntityConfig { @@ -1371,7 +1365,7 @@ pub mod tests { }; runner - .is_outdated(open_message.signed_entity_type, ¤t_time_point) + .is_open_message_outdated(open_message.signed_entity_type, ¤t_time_point) .await .unwrap() } diff --git a/mithril-aggregator/src/runtime/state_machine.rs b/mithril-aggregator/src/runtime/state_machine.rs index b4b09e2fc09..19f8d04721a 100644 --- a/mithril-aggregator/src/runtime/state_machine.rs +++ b/mithril-aggregator/src/runtime/state_machine.rs @@ -225,7 +225,7 @@ impl AggregatorRuntime { let is_outdated = self .runner - .is_outdated( + .is_open_message_outdated( state.open_message.signed_entity_type.clone(), &last_time_point, ) @@ -632,7 +632,7 @@ mod tests { .once() .returning(|| Ok(TimePoint::dummy())); runner - .expect_is_outdated() + .expect_is_open_message_outdated() .once() .returning(|_, _| Ok(true)); runner @@ -659,7 +659,7 @@ mod tests { .once() .returning(|| Ok(TimePoint::dummy())); runner - .expect_is_outdated() + .expect_is_open_message_outdated() .once() .returning(|_, _| Ok(false)); runner @@ -692,7 +692,7 @@ mod tests { .once() .returning(|| Ok(TimePoint::dummy())); runner - .expect_is_outdated() + .expect_is_open_message_outdated() .once() .returning(|_, _| Ok(false)); runner @@ -732,7 +732,7 @@ mod tests { .once() .returning(|| Ok(TimePoint::dummy())); runner - .expect_is_outdated() + .expect_is_open_message_outdated() .once() .returning(|_, _| Ok(false)); runner diff --git a/mithril-aggregator/src/services/epoch_service.rs b/mithril-aggregator/src/services/epoch_service.rs index 577e06d9222..1a91715f34e 100644 --- a/mithril-aggregator/src/services/epoch_service.rs +++ b/mithril-aggregator/src/services/epoch_service.rs @@ -129,7 +129,7 @@ pub struct MithrilEpochService { epoch_settings_storer: Arc, verification_key_store: Arc, network: CardanoNetwork, - allowed_discriminants: BTreeSet, + allowed_signed_entity_discriminants: BTreeSet, } impl MithrilEpochService { @@ -148,7 +148,7 @@ impl MithrilEpochService { epoch_settings_storer, verification_key_store, network, - allowed_discriminants, + allowed_signed_entity_discriminants: allowed_discriminants, } } @@ -250,7 +250,7 @@ impl EpochService for MithrilEpochService { let next_signers = Signer::vec_from(next_signers_with_stake.clone()); let signed_entity_config = SignedEntityConfig { - allowed_discriminants: self.allowed_discriminants.clone(), + allowed_discriminants: self.allowed_signed_entity_discriminants.clone(), network: self.network, cardano_transactions_signing_config: epoch_settings .cardano_transactions_signing_config @@ -740,18 +740,14 @@ mod tests { fn new(epoch: Epoch, current_epoch_fixture: MithrilFixture) -> Self { let next_epoch_fixture = current_epoch_fixture.clone(); Self { - // Aggregator configuration cardano_transactions_signing_config: CardanoTransactionsSigningConfig::dummy(), future_protocol_parameters: current_epoch_fixture.protocol_parameters(), network: CardanoNetwork::TestNet(0), allowed_discriminants: BTreeSet::new(), - // Epoch used for verification keys and database signer_retrieval_epoch: epoch.offset_to_signer_retrieval_epoch().unwrap(), next_signer_retrieval_epoch: epoch.offset_to_next_signer_retrieval_epoch(), - // Signers in verification key store signers_with_stake: current_epoch_fixture.signers_with_stake(), next_signers_with_stake: next_epoch_fixture.signers_with_stake(), - // Database data stored_epoch_settings: AggregatorEpochSettings { protocol_parameters: current_epoch_fixture.protocol_parameters(), cardano_transactions_signing_config: CardanoTransactionsSigningConfig::dummy(), From 0244426f7e7065bc20350d4c5c437e5ceb66095b Mon Sep 17 00:00:00 2001 From: Damien Lachaume <135982616+dlachaume@users.noreply.github.com> Date: Wed, 9 Oct 2024 16:46:24 +0200 Subject: [PATCH 212/274] Refactor signed entity types construction in route route tests --- .../src/http_server/routes/root_routes.rs | 28 +++++++------------ 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/mithril-aggregator/src/http_server/routes/root_routes.rs b/mithril-aggregator/src/http_server/routes/root_routes.rs index 12cb259a2a0..781a0f165e2 100644 --- a/mithril-aggregator/src/http_server/routes/root_routes.rs +++ b/mithril-aggregator/src/http_server/routes/root_routes.rs @@ -125,17 +125,12 @@ mod tests { let method = Method::GET.as_str(); let path = "/"; let config = Configuration { - signed_entity_types: Some( - BTreeSet::from([ - SignedEntityTypeDiscriminants::CardanoStakeDistribution, - SignedEntityTypeDiscriminants::CardanoImmutableFilesFull, - SignedEntityTypeDiscriminants::MithrilStakeDistribution, - ]) - .iter() - .map(SignedEntityTypeDiscriminants::to_string) - .collect::>() - .join(","), - ), + signed_entity_types: Some(format!( + "{}, {}, {}", + SignedEntityTypeDiscriminants::CardanoStakeDistribution, + SignedEntityTypeDiscriminants::CardanoImmutableFilesFull, + SignedEntityTypeDiscriminants::MithrilStakeDistribution, + )), ..Configuration::new_sample() }; let mut builder = DependenciesBuilder::new(config); @@ -193,13 +188,10 @@ mod tests { let method = Method::GET.as_str(); let path = "/"; let config = Configuration { - signed_entity_types: Some( - BTreeSet::from([SignedEntityTypeDiscriminants::CardanoTransactions]) - .iter() - .map(SignedEntityTypeDiscriminants::to_string) - .collect::>() - .join(","), - ), + signed_entity_types: Some(format!( + "{}", + SignedEntityTypeDiscriminants::CardanoTransactions + )), ..Configuration::new_sample() }; let mut builder = DependenciesBuilder::new(config); From 8d1d4e498e927a5e3070eb6e86fb60413e91ef7a Mon Sep 17 00:00:00 2001 From: Damien Lachaume <135982616+dlachaume@users.noreply.github.com> Date: Wed, 9 Oct 2024 17:02:07 +0200 Subject: [PATCH 213/274] `append_allowed_signed_entity_types_discriminants` returns a new instance of the list instead of updating the given one --- mithril-aggregator/src/configuration.rs | 9 +++++---- mithril-common/src/entities/signed_entity_config.rs | 11 ++++++----- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/mithril-aggregator/src/configuration.rs b/mithril-aggregator/src/configuration.rs index af4c00b3b37..de92ee316a2 100644 --- a/mithril-aggregator/src/configuration.rs +++ b/mithril-aggregator/src/configuration.rs @@ -293,16 +293,17 @@ impl Configuration { pub fn compute_allowed_signed_entity_types_discriminants( &self, ) -> StdResult> { - let mut allowed_discriminants = self + let allowed_discriminants = self .signed_entity_types .as_ref() .map(SignedEntityTypeDiscriminants::parse_list) .transpose() .with_context(|| "Invalid 'signed_entity_types' configuration")? .unwrap_or_default(); - SignedEntityConfig::append_allowed_signed_entity_types_discriminants( - &mut allowed_discriminants, - ); + let allowed_discriminants = + SignedEntityConfig::append_allowed_signed_entity_types_discriminants( + allowed_discriminants, + ); Ok(allowed_discriminants) } diff --git a/mithril-common/src/entities/signed_entity_config.rs b/mithril-common/src/entities/signed_entity_config.rs index 6ede65f07fe..0fe5604a1d5 100644 --- a/mithril-common/src/entities/signed_entity_config.rs +++ b/mithril-common/src/entities/signed_entity_config.rs @@ -43,9 +43,11 @@ impl SignedEntityConfig { /// Append to the given list of allowed signed entity types discriminants the [Self::DEFAULT_ALLOWED_DISCRIMINANTS] /// if not already present. pub fn append_allowed_signed_entity_types_discriminants( - discriminants: &mut BTreeSet, - ) { + discriminants: BTreeSet, + ) -> BTreeSet { + let mut discriminants = discriminants; discriminants.append(&mut BTreeSet::from(Self::DEFAULT_ALLOWED_DISCRIMINANTS)); + discriminants } /// Create the deduplicated list of allowed signed entity types discriminants. @@ -55,9 +57,8 @@ impl SignedEntityConfig { pub fn list_allowed_signed_entity_types_discriminants( &self, ) -> BTreeSet { - let mut discriminants = self.allowed_discriminants.clone(); - Self::append_allowed_signed_entity_types_discriminants(&mut discriminants); - discriminants + let discriminants = self.allowed_discriminants.clone(); + Self::append_allowed_signed_entity_types_discriminants(discriminants) } /// Convert this time point to a signed entity type based on the given discriminant. From 61c48e8ed616e8f33937aca7b01bd1f463fc8cec Mon Sep 17 00:00:00 2001 From: Damien Lachaume <135982616+dlachaume@users.noreply.github.com> Date: Wed, 9 Oct 2024 17:10:18 +0200 Subject: [PATCH 214/274] Remove `allowed_discriminants` from dependencies builder --- .../src/dependency_injection/builder.rs | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/mithril-aggregator/src/dependency_injection/builder.rs b/mithril-aggregator/src/dependency_injection/builder.rs index d06715e284d..7a9ce67f483 100644 --- a/mithril-aggregator/src/dependency_injection/builder.rs +++ b/mithril-aggregator/src/dependency_injection/builder.rs @@ -98,9 +98,6 @@ pub struct DependenciesBuilder { /// Configuration parameters pub configuration: Configuration, - /// List of signed entity discriminants that are allowed to be processed - pub allowed_discriminants: Option>, - /// SQLite database connection pub sqlite_connection: Option>, @@ -243,7 +240,6 @@ impl DependenciesBuilder { pub fn new(configuration: Configuration) -> Self { Self { configuration, - allowed_discriminants: None, sqlite_connection: None, sqlite_connection_cardano_transaction_pool: None, stake_store: None, @@ -292,17 +288,14 @@ impl DependenciesBuilder { } /// Get the allowed signed entity types discriminants - pub fn get_allowed_signed_entity_types_discriminants( - &mut self, + fn get_allowed_signed_entity_types_discriminants( + &self, ) -> Result> { - if self.allowed_discriminants.is_none() { - self.allowed_discriminants = Some( - self.configuration - .compute_allowed_signed_entity_types_discriminants()?, - ); - } + let allowed_discriminants = self + .configuration + .compute_allowed_signed_entity_types_discriminants()?; - Ok(self.allowed_discriminants.clone().unwrap()) + Ok(allowed_discriminants) } fn build_sqlite_connection( From 2def8ad1ac787751d9dca1409323308456007ba8 Mon Sep 17 00:00:00 2001 From: Damien Lachaume <135982616+dlachaume@users.noreply.github.com> Date: Wed, 9 Oct 2024 18:01:12 +0200 Subject: [PATCH 215/274] Change the way to test `is_open_message_outdated` cases when there is a newer open message. Now modifying the epoch message instead of the signed entity config parameter. We are not testing anymore that the function calls the epoch service. --- mithril-aggregator/src/runtime/runner.rs | 56 +++++++++--------------- 1 file changed, 21 insertions(+), 35 deletions(-) diff --git a/mithril-aggregator/src/runtime/runner.rs b/mithril-aggregator/src/runtime/runner.rs index 7030de7b72e..ddce241007a 100644 --- a/mithril-aggregator/src/runtime/runner.rs +++ b/mithril-aggregator/src/runtime/runner.rs @@ -535,11 +535,10 @@ pub mod tests { use async_trait::async_trait; use chrono::{DateTime, Utc}; use mithril_common::entities::{ - CardanoDbBeacon, CardanoTransactionsSigningConfig, ChainPoint, Epoch, SignedEntityConfig, + CardanoTransactionsSigningConfig, ChainPoint, Epoch, SignedEntityConfig, SignedEntityTypeDiscriminants, }; use mithril_common::signed_entity_type_lock::SignedEntityTypeLock; - use mithril_common::CardanoNetwork; use mithril_common::{ chain_observer::FakeObserver, digesters::DumbImmutableFileObserver, @@ -1287,54 +1286,42 @@ pub mod tests { } #[tokio::test] - async fn is_outdated_return_false_when_message_is_not_expired_and_no_newer_open_message() { + async fn is_open_message_outdated_return_false_when_message_is_not_expired_and_no_newer_open_message( + ) { assert!(!is_outdated_returned_when(IsExpired::No, false).await); } #[tokio::test] - async fn is_outdated_return_true_when_message_is_expired_and_no_newer_open_message() { + async fn is_open_message_outdated_return_true_when_message_is_expired_and_no_newer_open_message( + ) { assert!(is_outdated_returned_when(IsExpired::Yes, false).await); } #[tokio::test] - async fn is_outdated_return_true_when_message_is_not_expired_and_exists_newer_open_message() { + async fn is_open_message_outdated_return_true_when_message_is_not_expired_and_exists_newer_open_message( + ) { assert!(is_outdated_returned_when(IsExpired::No, true).await); } #[tokio::test] - async fn is_outdated_return_true_when_message_is_expired_and_exists_newer_open_message() { + async fn is_open_message_outdated_return_true_when_message_is_expired_and_exists_newer_open_message( + ) { assert!(is_outdated_returned_when(IsExpired::Yes, true).await); } - // The network field in the signed entity configuration is modified to test the scenario - // where the computed signed entity type differs from the one specified in the open message. - // This is the simplest attribute to manipulate, compared to the protocol parameters, - // even though it may not be a real use case. async fn is_outdated_returned_when(is_expired: IsExpired, newer_open_message: bool) -> bool { let current_time_point = TimePoint { epoch: Epoch(2), - immutable_file_number: 12, ..TimePoint::dummy() }; - let message_network = CardanoNetwork::MainNet; - let epoch_service_network = if newer_open_message { - CardanoNetwork::DevNet(412) + let message_epoch = if newer_open_message { + current_time_point.epoch + 54 } else { - message_network - }; - - let epoch_service_signed_entity_config = SignedEntityConfig { - network: epoch_service_network, - ..SignedEntityConfig::dummy() + current_time_point.epoch }; - let cardano_db_beacon = CardanoDbBeacon { - network: message_network.to_string(), - epoch: current_time_point.epoch, - immutable_file_number: current_time_point.immutable_file_number, - }; - let open_message = OpenMessage { - signed_entity_type: SignedEntityType::CardanoImmutableFilesFull(cardano_db_beacon), + let open_message_to_verify = OpenMessage { + signed_entity_type: SignedEntityType::MithrilStakeDistribution(message_epoch), is_expired: is_expired == IsExpired::Yes, ..OpenMessage::dummy() }; @@ -1343,29 +1330,28 @@ pub mod tests { let mut deps = initialize_dependencies().await; let mut mock_certifier_service = MockCertifierService::new(); - let open_message_cloned = open_message.clone(); + let open_message_current = open_message_to_verify.clone(); mock_certifier_service .expect_get_open_message() .times(1) - .return_once(|_| Ok(Some(open_message_cloned))); + .return_once(|_| Ok(Some(open_message_current))); mock_certifier_service .expect_mark_open_message_if_expired() .returning(|_| Ok(None)); deps.certifier_service = Arc::new(mock_certifier_service); - let epoch_service = FakeEpochServiceBuilder { - signed_entity_config: epoch_service_signed_entity_config, - ..FakeEpochServiceBuilder::dummy(current_time_point.epoch) - } - .build(); + let epoch_service = FakeEpochServiceBuilder::dummy(current_time_point.epoch).build(); deps.epoch_service = Arc::new(RwLock::new(epoch_service)); build_runner_with_fixture_data(deps).await }; runner - .is_open_message_outdated(open_message.signed_entity_type, ¤t_time_point) + .is_open_message_outdated( + open_message_to_verify.signed_entity_type, + ¤t_time_point, + ) .await .unwrap() } From 85fa75b9e93f986d386e87d321eb7e900b1820c7 Mon Sep 17 00:00:00 2001 From: Damien Lachaume <135982616+dlachaume@users.noreply.github.com> Date: Wed, 9 Oct 2024 18:08:17 +0200 Subject: [PATCH 216/274] Refactor `EpochServiceBuilder` simplifying its inner parameters --- .../src/services/epoch_service.rs | 38 ++++++++++--------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/mithril-aggregator/src/services/epoch_service.rs b/mithril-aggregator/src/services/epoch_service.rs index 1a91715f34e..8183e6bbb41 100644 --- a/mithril-aggregator/src/services/epoch_service.rs +++ b/mithril-aggregator/src/services/epoch_service.rs @@ -727,8 +727,7 @@ mod tests { future_protocol_parameters: ProtocolParameters, network: CardanoNetwork, allowed_discriminants: BTreeSet, - signer_retrieval_epoch: Epoch, - next_signer_retrieval_epoch: Epoch, + current_epoch: Epoch, signers_with_stake: Vec, next_signers_with_stake: Vec, stored_epoch_settings: AggregatorEpochSettings, @@ -737,52 +736,57 @@ mod tests { } impl EpochServiceBuilder { - fn new(epoch: Epoch, current_epoch_fixture: MithrilFixture) -> Self { - let next_epoch_fixture = current_epoch_fixture.clone(); + fn new(epoch: Epoch, epoch_fixture: MithrilFixture) -> Self { Self { cardano_transactions_signing_config: CardanoTransactionsSigningConfig::dummy(), - future_protocol_parameters: current_epoch_fixture.protocol_parameters(), + future_protocol_parameters: epoch_fixture.protocol_parameters(), network: CardanoNetwork::TestNet(0), allowed_discriminants: BTreeSet::new(), - signer_retrieval_epoch: epoch.offset_to_signer_retrieval_epoch().unwrap(), - next_signer_retrieval_epoch: epoch.offset_to_next_signer_retrieval_epoch(), - signers_with_stake: current_epoch_fixture.signers_with_stake(), - next_signers_with_stake: next_epoch_fixture.signers_with_stake(), + current_epoch: epoch, + signers_with_stake: epoch_fixture.signers_with_stake(), + next_signers_with_stake: epoch_fixture.signers_with_stake(), stored_epoch_settings: AggregatorEpochSettings { - protocol_parameters: current_epoch_fixture.protocol_parameters(), + protocol_parameters: epoch_fixture.protocol_parameters(), cardano_transactions_signing_config: CardanoTransactionsSigningConfig::dummy(), }, stored_next_epoch_settings: AggregatorEpochSettings { - protocol_parameters: current_epoch_fixture.protocol_parameters(), + protocol_parameters: epoch_fixture.protocol_parameters(), cardano_transactions_signing_config: CardanoTransactionsSigningConfig::dummy(), }, stored_upcoming_epoch_settings: AggregatorEpochSettings { - protocol_parameters: current_epoch_fixture.protocol_parameters(), + protocol_parameters: epoch_fixture.protocol_parameters(), cardano_transactions_signing_config: CardanoTransactionsSigningConfig::dummy(), }, } } fn build(self) -> MithrilEpochService { + let signer_retrieval_epoch = self + .current_epoch + .offset_to_signer_retrieval_epoch() + .unwrap(); + let next_signer_retrieval_epoch = + self.current_epoch.offset_to_next_signer_retrieval_epoch(); + let epoch_settings_storer = FakeEpochSettingsStorer::new(vec![ - (self.signer_retrieval_epoch, self.stored_epoch_settings), + (signer_retrieval_epoch, self.stored_epoch_settings), ( - self.next_signer_retrieval_epoch, + next_signer_retrieval_epoch, self.stored_next_epoch_settings.clone(), ), ( - self.next_signer_retrieval_epoch.next(), + next_signer_retrieval_epoch.next(), self.stored_upcoming_epoch_settings.clone(), ), ]); let vkey_store = VerificationKeyStore::new(Box::new( MemoryAdapter::new(Some(vec![ ( - self.signer_retrieval_epoch, + signer_retrieval_epoch, map_signers_for_vkey_store(&self.signers_with_stake), ), ( - self.next_signer_retrieval_epoch, + next_signer_retrieval_epoch, map_signers_for_vkey_store(&self.next_signers_with_stake), ), ])) From 91f748e7330d1ebfb83862e9bdc4b75d621072df Mon Sep 17 00:00:00 2001 From: Damien Lachaume <135982616+dlachaume@users.noreply.github.com> Date: Wed, 9 Oct 2024 18:15:25 +0200 Subject: [PATCH 217/274] chore: upgrade crate versions * mithril-aggregator from `0.5.77` to `0.5.78` * mithril-common from `0.4.66` to `0.4.67` --- Cargo.lock | 4 ++-- mithril-aggregator/Cargo.toml | 2 +- mithril-common/Cargo.toml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 146e7a9e7f9..9e211be853f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3403,7 +3403,7 @@ dependencies = [ [[package]] name = "mithril-aggregator" -version = "0.5.77" +version = "0.5.78" dependencies = [ "anyhow", "async-trait", @@ -3559,7 +3559,7 @@ dependencies = [ [[package]] name = "mithril-common" -version = "0.4.66" +version = "0.4.67" dependencies = [ "anyhow", "async-trait", diff --git a/mithril-aggregator/Cargo.toml b/mithril-aggregator/Cargo.toml index e86aa3620c0..7e7e094db63 100644 --- a/mithril-aggregator/Cargo.toml +++ b/mithril-aggregator/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-aggregator" -version = "0.5.77" +version = "0.5.78" description = "A Mithril Aggregator server" authors = { workspace = true } edition = { workspace = true } diff --git a/mithril-common/Cargo.toml b/mithril-common/Cargo.toml index 51fa28491e9..4ea4e38c8bc 100644 --- a/mithril-common/Cargo.toml +++ b/mithril-common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-common" -version = "0.4.66" +version = "0.4.67" description = "Common types, interfaces, and utilities for Mithril nodes." authors = { workspace = true } edition = { workspace = true } From 1efcc7646c26947a4b97fc3b319e732a0522f19a Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Tue, 1 Oct 2024 18:03:03 +0200 Subject: [PATCH 218/274] fix: remove version warning in devnet docker compose file --- mithril-test-lab/mithril-devnet/mkfiles/mkfiles-docker.sh | 2 -- 1 file changed, 2 deletions(-) diff --git a/mithril-test-lab/mithril-devnet/mkfiles/mkfiles-docker.sh b/mithril-test-lab/mithril-devnet/mkfiles/mkfiles-docker.sh index 7f00f4db248..615f4488630 100644 --- a/mithril-test-lab/mithril-devnet/mkfiles/mkfiles-docker.sh +++ b/mithril-test-lab/mithril-devnet/mkfiles/mkfiles-docker.sh @@ -5,8 +5,6 @@ GENESIS_SECRET_KEY=5b3131382c3138342c3232342c3137332c3136302c3234312c36312c31343 CHAIN_OBSERVER_TYPE=pallas cat >> docker-compose.yaml < Date: Tue, 1 Oct 2024 18:04:11 +0200 Subject: [PATCH 219/274] fix: make accurate validation of Mithril era transaction in devnet --- .../mithril-devnet/mkfiles/mkfiles-mithril-era.sh | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/mithril-test-lab/mithril-devnet/mkfiles/mkfiles-mithril-era.sh b/mithril-test-lab/mithril-devnet/mkfiles/mkfiles-mithril-era.sh index 31064213c18..560a8741daa 100644 --- a/mithril-test-lab/mithril-devnet/mkfiles/mkfiles-mithril-era.sh +++ b/mithril-test-lab/mithril-devnet/mkfiles/mkfiles-mithril-era.sh @@ -95,16 +95,19 @@ function send_funds_to_era_address { --tx-file node-pool${N}/tx/tx${N}-era-funds.tx \\ --testnet-magic ${NETWORK_MAGIC} + ## Compute the submitted transaction id + TX_ID_SUBMITTED=\$(CARDANO_NODE_SOCKET_PATH=node-pool${N}/ipc/node.sock $CARDANO_CLI \${CURRENT_CARDANO_ERA} transaction txid --tx-file node-pool${N}/tx/tx${N}-era-funds.tx) + ## Wait at least for 10 blocks so that the transaction is confirmed wait_for_elapsed_blocks 10 - ## Wait for all pool nodes to see the new funds + ## Wait for all pool nodes to see the new transaction for (( i=1; i<=${NUM_POOL_NODES}; i++ )); do - AMOUNT_RETRIEVED=\$(CARDANO_NODE_SOCKET_PATH=node-pool\${i}/ipc/node.sock $CARDANO_CLI query utxo \\ + TOTAL_UTXOS_FOR_TX_ID=\$(CARDANO_NODE_SOCKET_PATH=node-pool\${i}/ipc/node.sock $CARDANO_CLI query utxo \\ --testnet-magic ${NETWORK_MAGIC} --address \$(cat addresses/${ADDR}.addr) --out-file /dev/stdout \\ - | jq '. [] | select(.value.lovelace | . != null and . != "") | .value.lovelace') + | jq '. | with_entries(select(.key | startswith("${TX_ID_SUBMITTED}"))) | length') echo ">>>>>> Era address funds retrieved on node-pool\${i}: \${AMOUNT_RETRIEVED}" - if [ "\${AMOUNT_RETRIEVED}" != "${AMOUNT_TRANSFERRED}" ]; then + if [ "\${TOTAL_UTXOS_FOR_TX_ID}" == "0" ]; then touch ${MITHRIL_ERA_ERROR_FILE} break fi From ba70c8c88638165e5010570f3f1c0992b2fd82f7 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Wed, 2 Oct 2024 15:10:58 +0200 Subject: [PATCH 220/274] fix: make accurate computation of incoming transactions for era markers on chain in devnet --- .../mkfiles/mkfiles-mithril-era.sh | 37 +++++++++++++------ 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/mithril-test-lab/mithril-devnet/mkfiles/mkfiles-mithril-era.sh b/mithril-test-lab/mithril-devnet/mkfiles/mkfiles-mithril-era.sh index 560a8741daa..291eaf50cd7 100644 --- a/mithril-test-lab/mithril-devnet/mkfiles/mkfiles-mithril-era.sh +++ b/mithril-test-lab/mithril-devnet/mkfiles/mkfiles-mithril-era.sh @@ -142,20 +142,35 @@ function write_datums_for_era_address { # Remove if exists previous error file rm -f ${MITHRIL_ERA_ERROR_FILE} - # Write the era datum on chain - TX_IN=\$(CARDANO_NODE_SOCKET_PATH=node-pool${N}/ipc/node.sock $CARDANO_CLI query utxo \\ + # Fetch transactions from UTxOs of the era address + TX_IN_DATUM=\$(CARDANO_NODE_SOCKET_PATH=node-pool${N}/ipc/node.sock $CARDANO_CLI query utxo \\ + --testnet-magic ${NETWORK_MAGIC} --address \$(cat addresses/${ADDR}.addr) --out-file /dev/stdout \\ + | jq -r 'to_entries | map({utxo: .key} + .value) | . [] | select(.inlineDatum | . != null and . != "") | .utxo') + TX_IN_NO_DATUM=\$(CARDANO_NODE_SOCKET_PATH=node-pool${N}/ipc/node.sock $CARDANO_CLI query utxo \\ --testnet-magic ${NETWORK_MAGIC} --address \$(cat addresses/${ADDR}.addr) --out-file /dev/stdout \\ | jq -r 'to_entries | [last] | .[0].key') ## Build the transaction - CARDANO_NODE_SOCKET_PATH=node-pool${N}/ipc/node.sock $CARDANO_CLI \${CURRENT_CARDANO_ERA} transaction build \\ - --tx-in \${TX_IN} \\ - --tx-out \$(cat addresses/${ADDR}.addr)+${SCRIPT_TX_VALUE} \\ - --tx-out-inline-datum-file \${DATUM_FILE} \\ - --change-address \$(cat addresses/${ADDR}.addr) \\ - --testnet-magic ${NETWORK_MAGIC} \\ - --invalid-hereafter 100000 \\ - --out-file node-pool${N}/tx/tx${N}-era-datum.txbody + if [ "\${TX_IN_DATUM}" == "" ]; then + CARDANO_NODE_SOCKET_PATH=node-pool${N}/ipc/node.sock $CARDANO_CLI \${CURRENT_CARDANO_ERA} transaction build \\ + --tx-in \${TX_IN_NO_DATUM} \\ + --tx-out \$(cat addresses/${ADDR}.addr)+${SCRIPT_TX_VALUE} \\ + --tx-out-inline-datum-file \${DATUM_FILE} \\ + --change-address \$(cat addresses/${ADDR}.addr) \\ + --testnet-magic ${NETWORK_MAGIC} \\ + --invalid-hereafter 100000 \\ + --out-file node-pool${N}/tx/tx${N}-era-datum.txbody + else + CARDANO_NODE_SOCKET_PATH=node-pool${N}/ipc/node.sock $CARDANO_CLI \${CURRENT_CARDANO_ERA} transaction build \\ + --tx-in \${TX_IN_DATUM} \\ + --tx-in \${TX_IN_NO_DATUM} \\ + --tx-out \$(cat addresses/${ADDR}.addr)+${SCRIPT_TX_VALUE} \\ + --tx-out-inline-datum-file \${DATUM_FILE} \\ + --change-address \$(cat addresses/${ADDR}.addr) \\ + --testnet-magic ${NETWORK_MAGIC} \\ + --invalid-hereafter 100000 \\ + --out-file node-pool${N}/tx/tx${N}-era-datum.txbody + fi ## Sign the transaction CARDANO_NODE_SOCKET_PATH=node-pool${N}/ipc/node.sock $CARDANO_CLI \${CURRENT_CARDANO_ERA} transaction sign \\ @@ -176,7 +191,7 @@ function write_datums_for_era_address { for (( i=1; i<=${NUM_POOL_NODES}; i++ )); do INLINE_DATUM=\$(CARDANO_NODE_SOCKET_PATH=node-pool\${i}/ipc/node.sock $CARDANO_CLI query utxo \\ --testnet-magic ${NETWORK_MAGIC} --address \$(cat addresses/${ADDR}.addr) --out-file /dev/stdout \\ - | jq -r '. [] | select(.inlineDatum | . != null and . != "") | .inlineDatum.fields[].bytes' | xxd -r -p) + | jq -r '. [] | select(.inlineDatum | . != null and . != "") | .inlineDatum.fields[].bytes' | xxd -r -p | jq) echo ">>>>>> Era address inline datum retrieved on node-pool\${i}: \${INLINE_DATUM}" if [ "\${INLINE_DATUM}" == "" ]; then touch ${MITHRIL_ERA_ERROR_FILE} From 27065b3ace80d8ace0f051d7900a8d9b1179358d Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Tue, 1 Oct 2024 18:05:42 +0200 Subject: [PATCH 221/274] chore: better logs in e2e test when registering an era --- mithril-test-lab/mithril-end-to-end/src/assertions/exec.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mithril-test-lab/mithril-end-to-end/src/assertions/exec.rs b/mithril-test-lab/mithril-end-to-end/src/assertions/exec.rs index 55ae20ced3c..fb1ac4fe22e 100644 --- a/mithril-test-lab/mithril-end-to-end/src/assertions/exec.rs +++ b/mithril-test-lab/mithril-end-to-end/src/assertions/exec.rs @@ -23,7 +23,7 @@ pub async fn register_era_marker( devnet: &Devnet, mithril_era: &str, ) -> StdResult<()> { - info!("Register era marker"); + info!("Register '{mithril_era}' era marker"); info!("> generating era marker tx datum..."); let tx_datum_file_path = devnet @@ -33,7 +33,7 @@ pub async fn register_era_marker( .era_generate_tx_datum(&tx_datum_file_path, mithril_era) .await?; - info!("> writing era marker on the Cardano chain..."); + info!("> writing '{mithril_era}' era marker on the Cardano chain..."); devnet.write_era_marker(&tx_datum_file_path).await?; Ok(()) From 8926170cf0e1cfeb637ad1a40a48248f54a7cfe0 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Tue, 1 Oct 2024 18:13:13 +0200 Subject: [PATCH 222/274] feat: add era switch capability to e2e test --- .../mithril-end-to-end/src/end_to_end_spec.rs | 28 +++++++++- .../mithril-end-to-end/src/main.rs | 6 +++ .../src/mithril/infrastructure.rs | 51 ++++++++++++++++--- 3 files changed, 76 insertions(+), 9 deletions(-) diff --git a/mithril-test-lab/mithril-end-to-end/src/end_to_end_spec.rs b/mithril-test-lab/mithril-end-to-end/src/end_to_end_spec.rs index 4fac42eb0f8..39ff5f5f665 100644 --- a/mithril-test-lab/mithril-end-to-end/src/end_to_end_spec.rs +++ b/mithril-test-lab/mithril-end-to-end/src/end_to_end_spec.rs @@ -1,6 +1,6 @@ use crate::assertions; use crate::MithrilInfrastructure; -use mithril_common::StdResult; +use mithril_common::{entities::Epoch, StdResult}; pub struct Spec<'a> { pub infrastructure: &'a mut MithrilInfrastructure, @@ -71,6 +71,30 @@ impl<'a> Spec<'a> { ) .await?; + // Verify that artifacts are produced and signed correctly + self.verify_artifacts_production(target_epoch).await?; + + // Verify that artifacts are produced and signed correctly after era switch + if self.infrastructure.can_switch_to_next_era() { + // Switch to next era + self.infrastructure.switch_to_next_era().await?; + target_epoch += 2; + assertions::wait_for_target_epoch( + self.infrastructure.chain_observer(), + target_epoch, + "epoch after which the era switch will have triggered".to_string(), + ) + .await?; + + // Verify that artifacts are produced and signed correctly + self.verify_artifacts_production(target_epoch).await?; + } + + Ok(()) + } + + async fn verify_artifacts_production(&self, target_epoch: Epoch) -> StdResult { + let aggregator_endpoint = self.infrastructure.aggregator().endpoint(); let expected_epoch_min = target_epoch - 3; // Verify that mithril stake distribution artifacts are produced and signed correctly { @@ -173,6 +197,6 @@ impl<'a> Spec<'a> { } } - Ok(()) + Ok(target_epoch) } } diff --git a/mithril-test-lab/mithril-end-to-end/src/main.rs b/mithril-test-lab/mithril-end-to-end/src/main.rs index b77cb4f309b..fd93954862a 100644 --- a/mithril-test-lab/mithril-end-to-end/src/main.rs +++ b/mithril-test-lab/mithril-end-to-end/src/main.rs @@ -72,6 +72,11 @@ pub struct Args { #[clap(long, default_value = "thales")] mithril_era: String, + /// Mithril next era to run + #[clap(long)] + mithril_next_era: Option, + + /// Mithril era reader adapter #[clap(long, default_value = "cardano-chain")] mithril_era_reader_adapter: String, @@ -190,6 +195,7 @@ async fn main() -> StdResult<()> { cardano_node_version: args.cardano_node_version, mithril_run_interval: args.mithril_run_interval, mithril_era: args.mithril_era, + mithril_next_era: args.mithril_next_era, mithril_era_reader_adapter: args.mithril_era_reader_adapter, signed_entity_types: args.signed_entity_types, run_only_mode, diff --git a/mithril-test-lab/mithril-end-to-end/src/mithril/infrastructure.rs b/mithril-test-lab/mithril-end-to-end/src/mithril/infrastructure.rs index 8e1e67fad5b..9296b8e41f1 100644 --- a/mithril-test-lab/mithril-end-to-end/src/mithril/infrastructure.rs +++ b/mithril-test-lab/mithril-end-to-end/src/mithril/infrastructure.rs @@ -7,6 +7,7 @@ use mithril_common::entities::{PartyId, ProtocolParameters, SignedEntityTypeDisc use mithril_common::{CardanoNetwork, StdResult}; use slog_scope::info; use std::borrow::BorrowMut; +use std::fs; use std::path::PathBuf; use std::sync::Arc; use std::time::Duration; @@ -22,6 +23,7 @@ pub struct MithrilInfrastructureConfig { pub cardano_node_version: String, pub mithril_run_interval: u32, pub mithril_era: String, + pub mithril_next_era: Option, pub mithril_era_reader_adapter: String, pub signed_entity_types: Vec, pub run_only_mode: bool, @@ -42,6 +44,9 @@ pub struct MithrilInfrastructure { run_only_mode: bool, is_signing_cardano_transactions: bool, is_signing_cardano_stake_distribution: bool, + current_era: String, + next_era: Option, + era_reader_adapter: String, } impl MithrilInfrastructure { @@ -96,7 +101,33 @@ impl MithrilInfrastructure { .as_ref() .to_string(), ), - }) + current_era: config.mithril_era.clone(), + next_era: config.mithril_next_era.clone(), + era_reader_adapter: config.mithril_era_reader_adapter.clone(), + async fn activate_era( + aggregator: &mut Aggregator, + config: &MithrilInfrastructureConfig, + ) -> StdResult<()> { + if config.mithril_era_reader_adapter == "cardano-chain" { + assertions::register_era_marker(aggregator, &config.devnet, &config.mithril_era) + .await?; + sleep(Duration::from_secs(5)).await; + } + + Ok(()) + } + + pub async fn switch_to_next_era(&mut self) -> StdResult<()> { + if let Some(next_era) = &self.next_era { + if self.era_reader_adapter == "cardano-chain" { + assertions::register_era_marker(&mut self.aggregator, &self.devnet, next_era) + .await?; + } + self.current_era = next_era.to_owned(); + self.next_era = None; + } + + Ok(()) } async fn start_aggregator( @@ -124,11 +155,9 @@ impl MithrilInfrastructure { m: 105, phi_f: 0.95, }); - if config.mithril_era_reader_adapter == "cardano-chain" { - assertions::register_era_marker(&mut aggregator, &config.devnet, &config.mithril_era) - .await?; - sleep(Duration::from_secs(5)).await; - } + + Self::activate_era(&mut aggregator, config).await?; + aggregator.serve()?; Ok(aggregator) @@ -280,7 +309,11 @@ impl MithrilInfrastructure { } pub fn build_client(&self) -> StdResult { - Client::new(self.aggregator.endpoint(), &self.work_dir, &self.bin_dir) + let era_work_dir = self.work_dir.join(format!("era.{}", self.current_era)); + if !era_work_dir.exists() { + fs::create_dir(&era_work_dir)?; + } + Client::new(self.aggregator.endpoint(), &era_work_dir, &self.bin_dir) } pub fn run_only_mode(&self) -> bool { @@ -295,6 +328,10 @@ impl MithrilInfrastructure { self.is_signing_cardano_stake_distribution } + pub fn can_switch_to_next_era(&self) -> bool { + self.next_era.is_some() + } + pub async fn tail_logs(&self, number_of_line: u64) -> StdResult<()> { self.aggregator().tail_logs(number_of_line).await?; for signer in self.signers() { From fe5ed4ad836e7677dc5301a937319a1daec7b61b Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Tue, 1 Oct 2024 18:18:03 +0200 Subject: [PATCH 223/274] feat: add regenesis on era switch capability to e2e test --- .../mithril-end-to-end/src/end_to_end_spec.rs | 17 +++++++++++++++-- mithril-test-lab/mithril-end-to-end/src/main.rs | 4 ++++ .../src/mithril/infrastructure.rs | 10 ++++++++++ 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/mithril-test-lab/mithril-end-to-end/src/end_to_end_spec.rs b/mithril-test-lab/mithril-end-to-end/src/end_to_end_spec.rs index 39ff5f5f665..caf936db322 100644 --- a/mithril-test-lab/mithril-end-to-end/src/end_to_end_spec.rs +++ b/mithril-test-lab/mithril-end-to-end/src/end_to_end_spec.rs @@ -72,13 +72,13 @@ impl<'a> Spec<'a> { .await?; // Verify that artifacts are produced and signed correctly - self.verify_artifacts_production(target_epoch).await?; + let mut target_epoch = self.verify_artifacts_production(target_epoch).await?; // Verify that artifacts are produced and signed correctly after era switch if self.infrastructure.can_switch_to_next_era() { // Switch to next era self.infrastructure.switch_to_next_era().await?; - target_epoch += 2; + target_epoch += 5; assertions::wait_for_target_epoch( self.infrastructure.chain_observer(), target_epoch, @@ -86,6 +86,19 @@ impl<'a> Spec<'a> { ) .await?; + // Proceed to a re-genesis of the certificate chain + if self.infrastructure.can_regenesis_on_era_switch() { + assertions::bootstrap_genesis_certificate(self.infrastructure.aggregator_mut()) + .await?; + target_epoch += 5; + assertions::wait_for_target_epoch( + self.infrastructure.chain_observer(), + target_epoch, + "epoch after which the re-genesis on era switch will be completed".to_string(), + ) + .await?; + } + // Verify that artifacts are produced and signed correctly self.verify_artifacts_production(target_epoch).await?; } diff --git a/mithril-test-lab/mithril-end-to-end/src/main.rs b/mithril-test-lab/mithril-end-to-end/src/main.rs index fd93954862a..5606048ea2a 100644 --- a/mithril-test-lab/mithril-end-to-end/src/main.rs +++ b/mithril-test-lab/mithril-end-to-end/src/main.rs @@ -76,6 +76,9 @@ pub struct Args { #[clap(long)] mithril_next_era: Option, + /// Mithril re-genesis on era switch (used only when 'mithril_next_era' is set) + #[clap(long, default_value_t = false)] + mithril_era_regenesis_on_switch: bool, /// Mithril era reader adapter #[clap(long, default_value = "cardano-chain")] @@ -196,6 +199,7 @@ async fn main() -> StdResult<()> { mithril_run_interval: args.mithril_run_interval, mithril_era: args.mithril_era, mithril_next_era: args.mithril_next_era, + mithril_era_regenesis_on_switch: args.mithril_era_regenesis_on_switch, mithril_era_reader_adapter: args.mithril_era_reader_adapter, signed_entity_types: args.signed_entity_types, run_only_mode, diff --git a/mithril-test-lab/mithril-end-to-end/src/mithril/infrastructure.rs b/mithril-test-lab/mithril-end-to-end/src/mithril/infrastructure.rs index 9296b8e41f1..f68f11fd75b 100644 --- a/mithril-test-lab/mithril-end-to-end/src/mithril/infrastructure.rs +++ b/mithril-test-lab/mithril-end-to-end/src/mithril/infrastructure.rs @@ -24,6 +24,7 @@ pub struct MithrilInfrastructureConfig { pub mithril_run_interval: u32, pub mithril_era: String, pub mithril_next_era: Option, + pub mithril_era_regenesis_on_switch: bool, pub mithril_era_reader_adapter: String, pub signed_entity_types: Vec, pub run_only_mode: bool, @@ -47,6 +48,7 @@ pub struct MithrilInfrastructure { current_era: String, next_era: Option, era_reader_adapter: String, + regenesis_on_era_switch: bool, } impl MithrilInfrastructure { @@ -104,6 +106,10 @@ impl MithrilInfrastructure { current_era: config.mithril_era.clone(), next_era: config.mithril_next_era.clone(), era_reader_adapter: config.mithril_era_reader_adapter.clone(), + regenesis_on_era_switch: config.mithril_era_regenesis_on_switch, + }) + } + async fn activate_era( aggregator: &mut Aggregator, config: &MithrilInfrastructureConfig, @@ -332,6 +338,10 @@ impl MithrilInfrastructure { self.next_era.is_some() } + pub fn can_regenesis_on_era_switch(&self) -> bool { + self.regenesis_on_era_switch + } + pub async fn tail_logs(&self, number_of_line: u64) -> StdResult<()> { self.aggregator().tail_logs(number_of_line).await?; for signer in self.signers() { From 843c85fb8556a9a4d9b9a6849894d99925bfbbb3 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Wed, 2 Oct 2024 15:35:12 +0200 Subject: [PATCH 224/274] fix: use accurate epochs in era markers in e2e test --- .../mithril-end-to-end/src/assertions/exec.rs | 5 +-- .../mithril-end-to-end/src/end_to_end_spec.rs | 2 +- .../src/mithril/aggregator.rs | 12 +++++-- .../src/mithril/infrastructure.rs | 33 ++++++++++++++----- 4 files changed, 39 insertions(+), 13 deletions(-) diff --git a/mithril-test-lab/mithril-end-to-end/src/assertions/exec.rs b/mithril-test-lab/mithril-end-to-end/src/assertions/exec.rs index fb1ac4fe22e..ee14ae99057 100644 --- a/mithril-test-lab/mithril-end-to-end/src/assertions/exec.rs +++ b/mithril-test-lab/mithril-end-to-end/src/assertions/exec.rs @@ -1,7 +1,7 @@ use std::path::PathBuf; use crate::{Aggregator, Devnet}; -use mithril_common::entities::ProtocolParameters; +use mithril_common::entities::{Epoch, ProtocolParameters}; use mithril_common::StdResult; use slog_scope::info; @@ -22,6 +22,7 @@ pub async fn register_era_marker( aggregator: &mut Aggregator, devnet: &Devnet, mithril_era: &str, + era_epoch: &Epoch, ) -> StdResult<()> { info!("Register '{mithril_era}' era marker"); @@ -30,7 +31,7 @@ pub async fn register_era_marker( .artifacts_dir() .join(PathBuf::from("era-tx-datum.txt".to_string())); aggregator - .era_generate_tx_datum(&tx_datum_file_path, mithril_era) + .era_generate_tx_datum(&tx_datum_file_path, mithril_era, era_epoch) .await?; info!("> writing '{mithril_era}' era marker on the Cardano chain..."); diff --git a/mithril-test-lab/mithril-end-to-end/src/end_to_end_spec.rs b/mithril-test-lab/mithril-end-to-end/src/end_to_end_spec.rs index caf936db322..197aa8e073b 100644 --- a/mithril-test-lab/mithril-end-to-end/src/end_to_end_spec.rs +++ b/mithril-test-lab/mithril-end-to-end/src/end_to_end_spec.rs @@ -77,7 +77,7 @@ impl<'a> Spec<'a> { // Verify that artifacts are produced and signed correctly after era switch if self.infrastructure.can_switch_to_next_era() { // Switch to next era - self.infrastructure.switch_to_next_era().await?; + self.infrastructure.register_switch_to_next_era().await?; target_epoch += 5; assertions::wait_for_target_epoch( self.infrastructure.chain_observer(), diff --git a/mithril-test-lab/mithril-end-to-end/src/mithril/aggregator.rs b/mithril-test-lab/mithril-end-to-end/src/mithril/aggregator.rs index 0649ce9d49f..cd3c8a5e325 100644 --- a/mithril-test-lab/mithril-end-to-end/src/mithril/aggregator.rs +++ b/mithril-test-lab/mithril-end-to-end/src/mithril/aggregator.rs @@ -6,6 +6,7 @@ use crate::{ use anyhow::{anyhow, Context}; use mithril_common::era::SupportedEra; use mithril_common::{entities, StdResult}; +use std::cmp; use std::collections::HashMap; use std::path::{Path, PathBuf}; use std::time::Duration; @@ -173,15 +174,22 @@ impl Aggregator { &mut self, target_path: &Path, mithril_era: &str, + epoch: &entities::Epoch, ) -> StdResult<()> { let is_not_first_era = SupportedEra::eras().first().map(|e| e.to_string()) != Some(mithril_era.to_string()); + let current_era_epoch = if is_not_first_era { + entities::Epoch(0) + } else { + *epoch + }; + let next_era_epoch = entities::Epoch(cmp::max(**epoch, *current_era_epoch + 1)); let mut args = vec![ "era".to_string(), "generate-tx-datum".to_string(), "--current-era-epoch".to_string(), - "0".to_string(), + (*current_era_epoch).to_string(), "--era-markers-secret-key".to_string(), ERA_MARKERS_SECRET_KEY.to_string(), "--target-path".to_string(), @@ -191,7 +199,7 @@ impl Aggregator { // If only the first available era is targeted we have no "next-era" to activate if is_not_first_era { args.push("--next-era-epoch".to_string()); - args.push("1".to_string()); + args.push(next_era_epoch.to_string()); } let exit_status = self diff --git a/mithril-test-lab/mithril-end-to-end/src/mithril/infrastructure.rs b/mithril-test-lab/mithril-end-to-end/src/mithril/infrastructure.rs index f68f11fd75b..f62635e772a 100644 --- a/mithril-test-lab/mithril-end-to-end/src/mithril/infrastructure.rs +++ b/mithril-test-lab/mithril-end-to-end/src/mithril/infrastructure.rs @@ -3,7 +3,7 @@ use crate::{ RelayPassive, RelaySigner, Signer, DEVNET_MAGIC_ID, }; use mithril_common::chain_observer::{ChainObserver, PallasChainObserver}; -use mithril_common::entities::{PartyId, ProtocolParameters, SignedEntityTypeDiscriminants}; +use mithril_common::entities::{Epoch, PartyId, ProtocolParameters, SignedEntityTypeDiscriminants}; use mithril_common::{CardanoNetwork, StdResult}; use slog_scope::info; use std::borrow::BorrowMut; @@ -110,24 +110,41 @@ impl MithrilInfrastructure { }) } - async fn activate_era( + async fn register_startup_era( aggregator: &mut Aggregator, config: &MithrilInfrastructureConfig, ) -> StdResult<()> { + let era_epoch = Epoch(0); if config.mithril_era_reader_adapter == "cardano-chain" { - assertions::register_era_marker(aggregator, &config.devnet, &config.mithril_era) - .await?; + assertions::register_era_marker( + aggregator, + &config.devnet, + &config.mithril_era, + &era_epoch, + ) + .await?; sleep(Duration::from_secs(5)).await; } Ok(()) } - pub async fn switch_to_next_era(&mut self) -> StdResult<()> { + pub async fn register_switch_to_next_era(&mut self) -> StdResult<()> { if let Some(next_era) = &self.next_era { + let next_era_epoch = self + .chain_observer() + .get_current_epoch() + .await? + .unwrap_or_default() + + 1; if self.era_reader_adapter == "cardano-chain" { - assertions::register_era_marker(&mut self.aggregator, &self.devnet, next_era) - .await?; + assertions::register_era_marker( + &mut self.aggregator, + &self.devnet, + next_era, + &next_era_epoch, + ) + .await?; } self.current_era = next_era.to_owned(); self.next_era = None; @@ -162,7 +179,7 @@ impl MithrilInfrastructure { phi_f: 0.95, }); - Self::activate_era(&mut aggregator, config).await?; + Self::register_startup_era(&mut aggregator, config).await?; aggregator.serve()?; From 971b7d386bf0cb844edcd0bd824b434d64da55a7 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Wed, 2 Oct 2024 15:45:30 +0200 Subject: [PATCH 225/274] feat: add era switch in e2e tests in CI --- .github/workflows/ci.yml | 45 +++++++++++++++++++++++++++++++++------- 1 file changed, 38 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8be8774dd56..c5143aa9620 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -289,6 +289,7 @@ jobs: matrix: mode: ["std"] era: ${{ fromJSON(needs.build-ubuntu-X64.outputs.eras) }} + next_era: [""] cardano_node_version: ["9.0.0", "9.1.0", "9.1.1", "9.2.0", "9.2.1"] hard_fork_latest_era_at_epoch: [0] run_id: ["#1"] @@ -298,10 +299,27 @@ jobs: # Include a test for the P2P mode - mode: "p2p" era: ${{ fromJSON(needs.build-ubuntu-X64.outputs.eras)[0] }} + next_era: [""] cardano_node_version: "9.1.1" hard_fork_latest_era_at_epoch: 0 run_id: "#1" extra_args: "--use-p2p-network" + # Include a test for the era switch without regenesis + - mode: "p2p" + era: ${{ fromJSON(needs.build-ubuntu-X64.outputs.eras)[0] }} + next_era: ${{ fromJSON(needs.build-ubuntu-X64.outputs.eras)[1] }} + cardano_node_version: "9.1.1" + hard_fork_latest_era_at_epoch: 0 + run_id: "#1" + extra_args: "" + # Include a test for the era switch with regenesis + - mode: "p2p" + era: ${{ fromJSON(needs.build-ubuntu-X64.outputs.eras)[0] }} + next_era: ${{ fromJSON(needs.build-ubuntu-X64.outputs.eras)[1] }} + cardano_node_version: "9.1.1" + hard_fork_latest_era_at_epoch: 0 + run_id: "#1" + extra_args: "--mithril-era-regenesis-on-switch" steps: - name: Checkout sources uses: actions/checkout@v4 @@ -328,13 +346,26 @@ jobs: - name: Test run: | - ./mithril-end-to-end -vvv \ - --bin-directory ./bin \ - --work-directory=./artifacts \ - --devnet-scripts-directory=./mithril-test-lab/mithril-devnet \ - --mithril-era=${{ matrix.era }} \ - --cardano-node-version ${{ matrix.cardano_node_version }} \ - --cardano-hard-fork-latest-era-at-epoch ${{ matrix.hard_fork_latest_era_at_epoch }} ${{ matrix.extra_args }} + if [[ "${{ matrix.next_era }}" == "" ]]; then + # If there is no next era, we don't need to specify it with '--mithril-next-era' + ./mithril-end-to-end -vvv \ + --bin-directory ./bin \ + --work-directory=./artifacts \ + --devnet-scripts-directory=./mithril-test-lab/mithril-devnet \ + --mithril-era=${{ matrix.era }} \ + --cardano-node-version ${{ matrix.cardano_node_version }} \ + --cardano-hard-fork-latest-era-at-epoch ${{ matrix.hard_fork_latest_era_at_epoch }} ${{ matrix.extra_args }} + else + # If there is a next era, we need to specify it with '--mithril-next-era' + ./mithril-end-to-end -vvv \ + --bin-directory ./bin \ + --work-directory=./artifacts \ + --devnet-scripts-directory=./mithril-test-lab/mithril-devnet \ + --mithril-era=${{ matrix.era }} \ + --mithril-next-era=${{ matrix.next_era }} \ + --cardano-node-version ${{ matrix.cardano_node_version }} \ + --cardano-hard-fork-latest-era-at-epoch ${{ matrix.hard_fork_latest_era_at_epoch }} ${{ matrix.extra_args }} + fi - name: Upload E2E Tests Artifacts if: ${{ failure() }} From d577607a38709339e24130165078cbda1d820828 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Wed, 9 Oct 2024 15:27:36 +0200 Subject: [PATCH 226/274] fix: make era switch jobs in 'std' mode in CI --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c5143aa9620..c3a31bb003d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -305,7 +305,7 @@ jobs: run_id: "#1" extra_args: "--use-p2p-network" # Include a test for the era switch without regenesis - - mode: "p2p" + - mode: "std" era: ${{ fromJSON(needs.build-ubuntu-X64.outputs.eras)[0] }} next_era: ${{ fromJSON(needs.build-ubuntu-X64.outputs.eras)[1] }} cardano_node_version: "9.1.1" @@ -313,7 +313,7 @@ jobs: run_id: "#1" extra_args: "" # Include a test for the era switch with regenesis - - mode: "p2p" + - mode: "std" era: ${{ fromJSON(needs.build-ubuntu-X64.outputs.eras)[0] }} next_era: ${{ fromJSON(needs.build-ubuntu-X64.outputs.eras)[1] }} cardano_node_version: "9.1.1" From 80f7b1cdfd7bfe0c5d09c405a04efce1387924a1 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Wed, 9 Oct 2024 15:28:09 +0200 Subject: [PATCH 227/274] refactor: e2e execution command with new era --- .github/workflows/ci.yml | 36 +++++++++++++++++------------------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c3a31bb003d..4b866477acc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -346,26 +346,24 @@ jobs: - name: Test run: | - if [[ "${{ matrix.next_era }}" == "" ]]; then - # If there is no next era, we don't need to specify it with '--mithril-next-era' - ./mithril-end-to-end -vvv \ - --bin-directory ./bin \ - --work-directory=./artifacts \ - --devnet-scripts-directory=./mithril-test-lab/mithril-devnet \ - --mithril-era=${{ matrix.era }} \ - --cardano-node-version ${{ matrix.cardano_node_version }} \ - --cardano-hard-fork-latest-era-at-epoch ${{ matrix.hard_fork_latest_era_at_epoch }} ${{ matrix.extra_args }} - else - # If there is a next era, we need to specify it with '--mithril-next-era' - ./mithril-end-to-end -vvv \ - --bin-directory ./bin \ - --work-directory=./artifacts \ - --devnet-scripts-directory=./mithril-test-lab/mithril-devnet \ - --mithril-era=${{ matrix.era }} \ - --mithril-next-era=${{ matrix.next_era }} \ - --cardano-node-version ${{ matrix.cardano_node_version }} \ - --cardano-hard-fork-latest-era-at-epoch ${{ matrix.hard_fork_latest_era_at_epoch }} ${{ matrix.extra_args }} + cat > ./mithril-end-to-end.sh << EOF + #!/bin/bash + set -x + ./mithril-end-to-end -vvv \\ + --bin-directory ./bin \\ + --work-directory=./artifacts \\ + --devnet-scripts-directory=./mithril-test-lab/mithril-devnet \\ + --mithril-era=${{ matrix.era }} \\ + --cardano-node-version ${{ matrix.cardano_node_version }} \\ + --cardano-hard-fork-latest-era-at-epoch ${{ matrix.hard_fork_latest_era_at_epoch }} ${{ matrix.extra_args }} \\ + EOF + # If there is a next era, we need to specify it with '--mithril-next-era' + if [[ "${{ matrix.next_era }}" != "" ]]; then + echo " --mithril-next-era=${{ matrix.next_era }}" >> ./mithril-end-to-end.sh fi + chmod u+x ./mithril-end-to-end.sh + ./mithril-end-to-end.sh + rm ./mithril-end-to-end.sh - name: Upload E2E Tests Artifacts if: ${{ failure() }} From e93b1a19ca7d3700f94e0ca89865abfa693b4a09 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Wed, 9 Oct 2024 17:56:18 +0200 Subject: [PATCH 228/274] chore: remove sleep from 'register_startup_era' in e2e test --- .../mithril-end-to-end/src/mithril/infrastructure.rs | 3 --- 1 file changed, 3 deletions(-) diff --git a/mithril-test-lab/mithril-end-to-end/src/mithril/infrastructure.rs b/mithril-test-lab/mithril-end-to-end/src/mithril/infrastructure.rs index f62635e772a..d4b1c49d667 100644 --- a/mithril-test-lab/mithril-end-to-end/src/mithril/infrastructure.rs +++ b/mithril-test-lab/mithril-end-to-end/src/mithril/infrastructure.rs @@ -10,8 +10,6 @@ use std::borrow::BorrowMut; use std::fs; use std::path::PathBuf; use std::sync::Arc; -use std::time::Duration; -use tokio::time::sleep; use super::signer::SignerConfig; @@ -123,7 +121,6 @@ impl MithrilInfrastructure { &era_epoch, ) .await?; - sleep(Duration::from_secs(5)).await; } Ok(()) From 46bac50e0d3e33efb06d8f375509ea0894e97dbd Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Thu, 10 Oct 2024 09:23:32 +0200 Subject: [PATCH 229/274] refactor: simplify 'era_generate_tx_datum' implementation in e2e test Also take advantage of Epoch implementation of Copy. --- mithril-test-lab/mithril-end-to-end/src/assertions/exec.rs | 2 +- .../mithril-end-to-end/src/mithril/aggregator.rs | 6 +++--- .../mithril-end-to-end/src/mithril/infrastructure.rs | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/mithril-test-lab/mithril-end-to-end/src/assertions/exec.rs b/mithril-test-lab/mithril-end-to-end/src/assertions/exec.rs index ee14ae99057..96ff2fc7dcb 100644 --- a/mithril-test-lab/mithril-end-to-end/src/assertions/exec.rs +++ b/mithril-test-lab/mithril-end-to-end/src/assertions/exec.rs @@ -22,7 +22,7 @@ pub async fn register_era_marker( aggregator: &mut Aggregator, devnet: &Devnet, mithril_era: &str, - era_epoch: &Epoch, + era_epoch: Epoch, ) -> StdResult<()> { info!("Register '{mithril_era}' era marker"); diff --git a/mithril-test-lab/mithril-end-to-end/src/mithril/aggregator.rs b/mithril-test-lab/mithril-end-to-end/src/mithril/aggregator.rs index cd3c8a5e325..69eb2be9053 100644 --- a/mithril-test-lab/mithril-end-to-end/src/mithril/aggregator.rs +++ b/mithril-test-lab/mithril-end-to-end/src/mithril/aggregator.rs @@ -174,16 +174,16 @@ impl Aggregator { &mut self, target_path: &Path, mithril_era: &str, - epoch: &entities::Epoch, + next_era_activation_epoch: entities::Epoch, ) -> StdResult<()> { let is_not_first_era = SupportedEra::eras().first().map(|e| e.to_string()) != Some(mithril_era.to_string()); let current_era_epoch = if is_not_first_era { entities::Epoch(0) } else { - *epoch + next_era_activation_epoch }; - let next_era_epoch = entities::Epoch(cmp::max(**epoch, *current_era_epoch + 1)); + let next_era_epoch = entities::Epoch(cmp::max(*next_era_activation_epoch, 1)); let mut args = vec![ "era".to_string(), diff --git a/mithril-test-lab/mithril-end-to-end/src/mithril/infrastructure.rs b/mithril-test-lab/mithril-end-to-end/src/mithril/infrastructure.rs index d4b1c49d667..b0fa185096a 100644 --- a/mithril-test-lab/mithril-end-to-end/src/mithril/infrastructure.rs +++ b/mithril-test-lab/mithril-end-to-end/src/mithril/infrastructure.rs @@ -118,7 +118,7 @@ impl MithrilInfrastructure { aggregator, &config.devnet, &config.mithril_era, - &era_epoch, + era_epoch, ) .await?; } @@ -139,7 +139,7 @@ impl MithrilInfrastructure { &mut self.aggregator, &self.devnet, next_era, - &next_era_epoch, + next_era_epoch, ) .await?; } From 54df00af7e7d031a6f28c854df7ec43def5de092 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Thu, 10 Oct 2024 10:57:30 +0200 Subject: [PATCH 230/274] refactor: move era switch responsibility from infrastructure in e2e test Co-authored-by: DJO --- .../mithril-end-to-end/src/end_to_end_spec.rs | 44 +++++++-- .../mithril-end-to-end/src/main.rs | 12 ++- .../src/mithril/infrastructure.rs | 91 +++++++------------ 3 files changed, 76 insertions(+), 71 deletions(-) diff --git a/mithril-test-lab/mithril-end-to-end/src/end_to_end_spec.rs b/mithril-test-lab/mithril-end-to-end/src/end_to_end_spec.rs index 197aa8e073b..b2f524a3f77 100644 --- a/mithril-test-lab/mithril-end-to-end/src/end_to_end_spec.rs +++ b/mithril-test-lab/mithril-end-to-end/src/end_to_end_spec.rs @@ -1,14 +1,40 @@ use crate::assertions; use crate::MithrilInfrastructure; -use mithril_common::{entities::Epoch, StdResult}; +use mithril_common::{ + entities::{Epoch, SignedEntityTypeDiscriminants}, + StdResult, +}; pub struct Spec<'a> { pub infrastructure: &'a mut MithrilInfrastructure, + is_signing_cardano_transactions: bool, + is_signing_cardano_stake_distribution: bool, + next_era: Option, + regenesis_on_era_switch: bool, } impl<'a> Spec<'a> { - pub fn new(infrastructure: &'a mut MithrilInfrastructure) -> Self { - Self { infrastructure } + pub fn new( + infrastructure: &'a mut MithrilInfrastructure, + signed_entity_types: Vec, + next_era: Option, + regenesis_on_era_switch: bool, + ) -> Self { + Self { + infrastructure, + is_signing_cardano_transactions: signed_entity_types.contains( + &SignedEntityTypeDiscriminants::CardanoTransactions + .as_ref() + .to_string(), + ), + is_signing_cardano_stake_distribution: signed_entity_types.contains( + &SignedEntityTypeDiscriminants::CardanoStakeDistribution + .as_ref() + .to_string(), + ), + next_era, + regenesis_on_era_switch, + } } pub async fn run(&mut self) -> StdResult<()> { @@ -75,9 +101,11 @@ impl<'a> Spec<'a> { let mut target_epoch = self.verify_artifacts_production(target_epoch).await?; // Verify that artifacts are produced and signed correctly after era switch - if self.infrastructure.can_switch_to_next_era() { + if let Some(next_era) = &self.next_era { // Switch to next era - self.infrastructure.register_switch_to_next_era().await?; + self.infrastructure + .register_switch_to_next_era(next_era) + .await?; target_epoch += 5; assertions::wait_for_target_epoch( self.infrastructure.chain_observer(), @@ -87,7 +115,7 @@ impl<'a> Spec<'a> { .await?; // Proceed to a re-genesis of the certificate chain - if self.infrastructure.can_regenesis_on_era_switch() { + if self.regenesis_on_era_switch { assertions::bootstrap_genesis_certificate(self.infrastructure.aggregator_mut()) .await?; target_epoch += 5; @@ -153,7 +181,7 @@ impl<'a> Spec<'a> { } // Verify that Cardano transactions artifacts are produced and signed correctly - if self.infrastructure.is_signing_cardano_transactions() { + if self.is_signing_cardano_transactions { let hash = assertions::assert_node_producing_cardano_transactions(&aggregator_endpoint) .await?; let certificate_hash = assertions::assert_signer_is_signing_cardano_transactions( @@ -180,7 +208,7 @@ impl<'a> Spec<'a> { } // Verify that Cardano stake distribution artifacts are produced and signed correctly - if self.infrastructure.is_signing_cardano_stake_distribution() { + if self.is_signing_cardano_stake_distribution { { let (hash, epoch) = assertions::assert_node_producing_cardano_stake_distribution( &aggregator_endpoint, diff --git a/mithril-test-lab/mithril-end-to-end/src/main.rs b/mithril-test-lab/mithril-end-to-end/src/main.rs index 5606048ea2a..769f58787e2 100644 --- a/mithril-test-lab/mithril-end-to-end/src/main.rs +++ b/mithril-test-lab/mithril-end-to-end/src/main.rs @@ -198,13 +198,12 @@ async fn main() -> StdResult<()> { cardano_node_version: args.cardano_node_version, mithril_run_interval: args.mithril_run_interval, mithril_era: args.mithril_era, - mithril_next_era: args.mithril_next_era, - mithril_era_regenesis_on_switch: args.mithril_era_regenesis_on_switch, mithril_era_reader_adapter: args.mithril_era_reader_adapter, - signed_entity_types: args.signed_entity_types, + signed_entity_types: args.signed_entity_types.clone(), run_only_mode, use_p2p_network_mode, use_p2p_passive_relays, + use_era_specific_work_dir: args.mithril_next_era.is_some(), }) .await?; @@ -214,7 +213,12 @@ async fn main() -> StdResult<()> { run_only.start().await } false => { - let mut spec = Spec::new(&mut infrastructure); + let mut spec = Spec::new( + &mut infrastructure, + args.signed_entity_types, + args.mithril_next_era, + args.mithril_era_regenesis_on_switch, + ); spec.run().await } }; diff --git a/mithril-test-lab/mithril-end-to-end/src/mithril/infrastructure.rs b/mithril-test-lab/mithril-end-to-end/src/mithril/infrastructure.rs index b0fa185096a..c11dbe2c088 100644 --- a/mithril-test-lab/mithril-end-to-end/src/mithril/infrastructure.rs +++ b/mithril-test-lab/mithril-end-to-end/src/mithril/infrastructure.rs @@ -3,7 +3,7 @@ use crate::{ RelayPassive, RelaySigner, Signer, DEVNET_MAGIC_ID, }; use mithril_common::chain_observer::{ChainObserver, PallasChainObserver}; -use mithril_common::entities::{Epoch, PartyId, ProtocolParameters, SignedEntityTypeDiscriminants}; +use mithril_common::entities::{Epoch, PartyId, ProtocolParameters}; use mithril_common::{CardanoNetwork, StdResult}; use slog_scope::info; use std::borrow::BorrowMut; @@ -21,13 +21,12 @@ pub struct MithrilInfrastructureConfig { pub cardano_node_version: String, pub mithril_run_interval: u32, pub mithril_era: String, - pub mithril_next_era: Option, - pub mithril_era_regenesis_on_switch: bool, pub mithril_era_reader_adapter: String, pub signed_entity_types: Vec, pub run_only_mode: bool, pub use_p2p_network_mode: bool, pub use_p2p_passive_relays: bool, + pub use_era_specific_work_dir: bool, } pub struct MithrilInfrastructure { @@ -41,12 +40,9 @@ pub struct MithrilInfrastructure { relay_passives: Vec, cardano_chain_observer: Arc, run_only_mode: bool, - is_signing_cardano_transactions: bool, - is_signing_cardano_stake_distribution: bool, current_era: String, - next_era: Option, era_reader_adapter: String, - regenesis_on_era_switch: bool, + use_era_specific_work_dir: bool, } impl MithrilInfrastructure { @@ -91,20 +87,9 @@ impl MithrilInfrastructure { relay_passives, cardano_chain_observer, run_only_mode: config.run_only_mode, - is_signing_cardano_transactions: config.signed_entity_types.contains( - &SignedEntityTypeDiscriminants::CardanoTransactions - .as_ref() - .to_string(), - ), - is_signing_cardano_stake_distribution: config.signed_entity_types.contains( - &SignedEntityTypeDiscriminants::CardanoStakeDistribution - .as_ref() - .to_string(), - ), current_era: config.mithril_era.clone(), - next_era: config.mithril_next_era.clone(), era_reader_adapter: config.mithril_era_reader_adapter.clone(), - regenesis_on_era_switch: config.mithril_era_regenesis_on_switch, + use_era_specific_work_dir: config.use_era_specific_work_dir, }) } @@ -126,26 +111,23 @@ impl MithrilInfrastructure { Ok(()) } - pub async fn register_switch_to_next_era(&mut self) -> StdResult<()> { - if let Some(next_era) = &self.next_era { - let next_era_epoch = self - .chain_observer() - .get_current_epoch() - .await? - .unwrap_or_default() - + 1; - if self.era_reader_adapter == "cardano-chain" { - assertions::register_era_marker( - &mut self.aggregator, - &self.devnet, - next_era, - next_era_epoch, - ) - .await?; - } - self.current_era = next_era.to_owned(); - self.next_era = None; + pub async fn register_switch_to_next_era(&mut self, next_era: &str) -> StdResult<()> { + let next_era_epoch = self + .chain_observer() + .get_current_epoch() + .await? + .unwrap_or_default() + + 1; + if self.era_reader_adapter == "cardano-chain" { + assertions::register_era_marker( + &mut self.aggregator, + &self.devnet, + next_era, + next_era_epoch, + ) + .await?; } + self.current_era = next_era.to_owned(); Ok(()) } @@ -329,31 +311,22 @@ impl MithrilInfrastructure { } pub fn build_client(&self) -> StdResult { - let era_work_dir = self.work_dir.join(format!("era.{}", self.current_era)); - if !era_work_dir.exists() { - fs::create_dir(&era_work_dir)?; - } - Client::new(self.aggregator.endpoint(), &era_work_dir, &self.bin_dir) - } - - pub fn run_only_mode(&self) -> bool { - self.run_only_mode - } - - pub fn is_signing_cardano_transactions(&self) -> bool { - self.is_signing_cardano_transactions - } + let work_dir = if self.use_era_specific_work_dir { + let era_work_dir = self.work_dir.join(format!("era.{}", self.current_era)); + if !era_work_dir.exists() { + fs::create_dir(&era_work_dir)?; + } - pub fn is_signing_cardano_stake_distribution(&self) -> bool { - self.is_signing_cardano_stake_distribution - } + era_work_dir + } else { + self.work_dir.clone() + }; - pub fn can_switch_to_next_era(&self) -> bool { - self.next_era.is_some() + Client::new(self.aggregator.endpoint(), &work_dir, &self.bin_dir) } - pub fn can_regenesis_on_era_switch(&self) -> bool { - self.regenesis_on_era_switch + pub fn run_only_mode(&self) -> bool { + self.run_only_mode } pub async fn tail_logs(&self, number_of_line: u64) -> StdResult<()> { From 1e1a7fd67b3a2ba81eb530b579078b5e01f33aac Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Thu, 10 Oct 2024 10:58:09 +0200 Subject: [PATCH 231/274] refactor: better namings of signer logs in e2e test Co-authored-by: DJO --- .../mithril-end-to-end/src/mithril/infrastructure.rs | 1 + mithril-test-lab/mithril-end-to-end/src/mithril/signer.rs | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/mithril-test-lab/mithril-end-to-end/src/mithril/infrastructure.rs b/mithril-test-lab/mithril-end-to-end/src/mithril/infrastructure.rs index c11dbe2c088..15b1ee95dad 100644 --- a/mithril-test-lab/mithril-end-to-end/src/mithril/infrastructure.rs +++ b/mithril-test-lab/mithril-end-to-end/src/mithril/infrastructure.rs @@ -255,6 +255,7 @@ impl MithrilInfrastructure { }; let mut signer = Signer::new(&SignerConfig { + signer_number: index + 1, aggregator_endpoint, pool_node, cardano_cli_path: &config.devnet.cardano_cli_path(), diff --git a/mithril-test-lab/mithril-end-to-end/src/mithril/signer.rs b/mithril-test-lab/mithril-end-to-end/src/mithril/signer.rs index ecfcdf85725..8fd6dde1070 100644 --- a/mithril-test-lab/mithril-end-to-end/src/mithril/signer.rs +++ b/mithril-test-lab/mithril-end-to-end/src/mithril/signer.rs @@ -9,6 +9,7 @@ use tokio::process::Child; #[derive(Debug)] pub struct SignerConfig<'a> { + pub signer_number: usize, pub aggregator_endpoint: String, pub pool_node: &'a PoolNode, pub cardano_cli_path: &'a Path, @@ -102,7 +103,9 @@ impl Signer { env, &args, )?; - command.set_log_name(format!("mithril-signer-{party_id}").as_str()); + command.set_log_name( + format!("mithril-signer-{}-{party_id}", signer_config.signer_number).as_str(), + ); Ok(Self { party_id, From 1579f7541fa74f97aeb46279a1d3c013a98fbafc Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Thu, 10 Oct 2024 11:03:54 +0200 Subject: [PATCH 232/274] docs: update CHANGELOG --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6d6ebddfbed..d5a29bbdc61 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,8 @@ As a minor extension, we have adopted a slightly different versioning convention - Support for stable Cardano transaction client library, CLI and WASM. +- Support for Mithril era switch in end to end test. + - Crates versions: | Crate | Version | From d3fe03f484f8fac1677f4e6e35162d95fd515be5 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Thu, 10 Oct 2024 11:03:12 +0200 Subject: [PATCH 233/274] chore: bump crates versions - 'mithril-end-to-end' from '0.4.36' to '0.4.37' - 'mithril-devnet' from '0.4.1' to '0.4.2'. --- Cargo.lock | 2 +- mithril-test-lab/mithril-devnet/VERSION | 2 +- mithril-test-lab/mithril-end-to-end/Cargo.toml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9e211be853f..6a85656610a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3630,7 +3630,7 @@ dependencies = [ [[package]] name = "mithril-end-to-end" -version = "0.4.36" +version = "0.4.37" dependencies = [ "anyhow", "async-recursion", diff --git a/mithril-test-lab/mithril-devnet/VERSION b/mithril-test-lab/mithril-devnet/VERSION index 267577d47e4..2b7c5ae0184 100644 --- a/mithril-test-lab/mithril-devnet/VERSION +++ b/mithril-test-lab/mithril-devnet/VERSION @@ -1 +1 @@ -0.4.1 +0.4.2 diff --git a/mithril-test-lab/mithril-end-to-end/Cargo.toml b/mithril-test-lab/mithril-end-to-end/Cargo.toml index 75810e90f2d..c28b58bbadf 100644 --- a/mithril-test-lab/mithril-end-to-end/Cargo.toml +++ b/mithril-test-lab/mithril-end-to-end/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-end-to-end" -version = "0.4.36" +version = "0.4.37" authors = { workspace = true } edition = { workspace = true } documentation = { workspace = true } From 8d90daf76c1fe765b977767b055a5c0001c54028 Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Tue, 8 Oct 2024 16:54:27 +0200 Subject: [PATCH 234/274] refactor: make all signer services use a dedicated logger Each service now create a child logger that's tagged with its name so we can know more easily the source of a log. This allow to remove `slog_scope` from the main dependencies (its still used by the integration tests). --- mithril-signer/Cargo.toml | 2 +- .../src/dependency_injection/builder.rs | 50 ++++++++----- mithril-signer/src/main.rs | 35 ++++++--- mithril-signer/src/metrics/server.rs | 66 ++++++++++++----- mithril-signer/src/metrics/service.rs | 64 ++++++++++------ mithril-signer/src/runtime/runner.rs | 56 +++++++++----- mithril-signer/src/runtime/state_machine.rs | 55 ++++++++++---- .../src/services/aggregator_client.rs | 37 ++++++++-- .../importer/importer_by_chunk.rs | 3 +- .../importer/importer_with_pruner.rs | 3 +- .../importer/importer_with_vacuum.rs | 3 +- .../cardano_transactions/importer/service.rs | 3 +- mithril-signer/src/services/certifier.rs | 15 +++- mithril-signer/src/services/epoch_service.rs | 73 +++++++++++++++---- mithril-signer/src/services/single_signer.rs | 35 ++++++--- mithril-signer/src/services/upkeep_service.rs | 3 +- .../test_extensions/state_machine_tester.rs | 38 ++++++---- 17 files changed, 381 insertions(+), 160 deletions(-) diff --git a/mithril-signer/Cargo.toml b/mithril-signer/Cargo.toml index e26f012c561..3722c281b55 100644 --- a/mithril-signer/Cargo.toml +++ b/mithril-signer/Cargo.toml @@ -38,7 +38,6 @@ slog = { version = "2.7.0", features = [ ] } slog-async = "2.8.0" slog-bunyan = "2.5.0" -slog-scope = "4.4.0" sqlite = { version = "0.36.1", features = ["bundled"] } thiserror = "1.0.63" tokio = { version = "1.40.0", features = ["full"] } @@ -52,6 +51,7 @@ httpmock = "0.7.0" mithril-common = { path = "../mithril-common" } mockall = "0.13.0" prometheus-parse = "0.2.5" +slog-scope = "4.4.0" slog-term = "2.9.1" [features] diff --git a/mithril-signer/src/dependency_injection/builder.rs b/mithril-signer/src/dependency_injection/builder.rs index 1616bbabb14..b723108e824 100644 --- a/mithril-signer/src/dependency_injection/builder.rs +++ b/mithril-signer/src/dependency_injection/builder.rs @@ -3,7 +3,7 @@ use std::sync::Arc; use std::time::Duration; use anyhow::{anyhow, Context}; - +use slog::Logger; use tokio::sync::{Mutex, RwLock}; use mithril_common::api_version::APIVersionProvider; @@ -58,11 +58,12 @@ pub struct DependenciesBuilder<'a> { chain_observer_builder: fn(&Configuration) -> StdResult>, immutable_file_observer_builder: fn(&Configuration) -> StdResult>, + root_logger: Logger, } impl<'a> DependenciesBuilder<'a> { /// Create a new `DependenciesBuilder`. - pub fn new(config: &'a Configuration) -> Self { + pub fn new(config: &'a Configuration, root_logger: Logger) -> Self { let chain_observer_builder: fn(&Configuration) -> StdResult> = |config: &Configuration| { let chain_observer_type = ChainObserverType::Pallas; @@ -102,6 +103,7 @@ impl<'a> DependenciesBuilder<'a> { config, chain_observer_builder, immutable_file_observer_builder, + root_logger, } } @@ -115,6 +117,11 @@ impl<'a> DependenciesBuilder<'a> { self } + /// Return a copy of the root logger. + pub fn root_logger(&self) -> Logger { + self.root_logger.clone() + } + /// Override default chain observer builder. pub fn override_chain_observer_builder( &mut self, @@ -155,7 +162,7 @@ impl<'a> DependenciesBuilder<'a> { &format!("immutables_digests_{}.json", self.config.network), ) .should_reset_digests_cache(self.config.reset_digests_cache) - .with_logger(slog_scope::logger()) + .with_logger(self.root_logger()) .build() .await?; @@ -169,11 +176,10 @@ impl<'a> DependenciesBuilder<'a> { migrations: Vec, ) -> StdResult { let sqlite_db_path = self.config.get_sqlite_file(sqlite_file_name)?; - let logger = slog_scope::logger(); let connection = ConnectionBuilder::open_file(&sqlite_db_path) .with_node_type(ApplicationNodeType::Signer) .with_migrations(migrations) - .with_logger(logger.clone()) + .with_logger(self.root_logger()) .build() .with_context(|| "Database connection initialisation error")?; @@ -216,7 +222,7 @@ impl<'a> DependenciesBuilder<'a> { )); let digester = Arc::new(CardanoImmutableDigester::new( self.build_digester_cache_provider().await?, - slog_scope::logger(), + self.root_logger(), )); let stake_store = Arc::new(StakeStore::new( Box::new(SQLiteAdapter::new("stake", sqlite_connection.clone())?), @@ -252,13 +258,14 @@ impl<'a> DependenciesBuilder<'a> { self.config.relay_endpoint.clone(), api_version_provider.clone(), Some(Duration::from_millis(HTTP_REQUEST_TIMEOUT_DURATION)), + self.root_logger(), )); let cardano_immutable_snapshot_builder = Arc::new(CardanoImmutableFilesFullSignableBuilder::new( digester.clone(), &self.config.db_directory, - slog_scope::logger(), + self.root_logger(), )); let mithril_stake_distribution_signable_builder = Arc::new(MithrilStakeDistributionSignableBuilder::default()); @@ -268,18 +275,18 @@ impl<'a> DependenciesBuilder<'a> { let chain_block_reader = PallasChainReader::new( &self.config.cardano_node_socket_path, network, - slog_scope::logger(), + self.root_logger(), ); let block_scanner = Arc::new(CardanoBlockScanner::new( Arc::new(Mutex::new(chain_block_reader)), self.config .cardano_transactions_block_streamer_max_roll_forwards_per_poll, - slog_scope::logger(), + self.root_logger(), )); let transactions_importer = Arc::new(CardanoTransactionsImporter::new( block_scanner, transaction_store.clone(), - slog_scope::logger(), + self.root_logger(), )); // Wrap the transaction importer with decorator to prune the transactions after import let transactions_importer = Arc::new(TransactionsImporterWithPruner::new( @@ -288,7 +295,7 @@ impl<'a> DependenciesBuilder<'a> { .then_some(self.config.network_security_parameter), transaction_store.clone(), transactions_importer, - slog_scope::logger(), + self.root_logger(), )); // Wrap the transaction importer with decorator to chunk its workload, so it prunes // transactions after each chunk, reducing the storage footprint @@ -296,7 +303,7 @@ impl<'a> DependenciesBuilder<'a> { transaction_store.clone(), transactions_importer.clone(), self.config.transactions_import_block_chunk_size, - slog_scope::logger(), + self.root_logger(), )); // For the preloader, we want to vacuum the database after each chunk, to reclaim disk space // earlier than with just auto_vacuum (that execute only after the end of all import). @@ -305,10 +312,10 @@ impl<'a> DependenciesBuilder<'a> { Arc::new(TransactionsImporterWithVacuum::new( sqlite_connection_cardano_transaction_pool.clone(), transactions_importer.clone(), - slog_scope::logger(), + self.root_logger(), )), self.config.transactions_import_block_chunk_size, - slog_scope::logger(), + self.root_logger(), )); let block_range_root_retriever = transaction_store.clone(); let cardano_transactions_builder = Arc::new(CardanoTransactionsSignableBuilder::< @@ -316,7 +323,7 @@ impl<'a> DependenciesBuilder<'a> { >::new( state_machine_transactions_importer, block_range_root_retriever, - slog_scope::logger(), + self.root_logger(), )); let cardano_stake_distribution_signable_builder = Arc::new( CardanoStakeDistributionSignableBuilder::new(stake_store.clone()), @@ -324,10 +331,12 @@ impl<'a> DependenciesBuilder<'a> { let epoch_service = Arc::new(RwLock::new(MithrilEpochService::new( stake_store.clone(), protocol_initializer_store.clone(), + self.root_logger(), ))); let single_signer = Arc::new(MithrilSingleSigner::new( self.compute_protocol_party_id()?, epoch_service.clone(), + self.root_logger(), )); let signable_seed_builder_service = Arc::new(SignerSignableSeedBuilder::new( epoch_service.clone(), @@ -341,7 +350,7 @@ impl<'a> DependenciesBuilder<'a> { cardano_transactions_builder, cardano_stake_distribution_signable_builder, )); - let metrics_service = Arc::new(MetricsService::new()?); + let metrics_service = Arc::new(MetricsService::new(self.root_logger())?); let preloader_activation = CardanoTransactionsPreloaderActivationSigner::new(aggregator_client.clone()); let cardano_transactions_preloader = Arc::new(CardanoTransactionsPreloader::new( @@ -349,7 +358,7 @@ impl<'a> DependenciesBuilder<'a> { preloader_transactions_importer, self.config.preload_security_parameter, chain_observer.clone(), - slog_scope::logger(), + self.root_logger(), Arc::new(preloader_activation), )); let signed_beacon_repository = Arc::new(SignedBeaconRepository::new( @@ -361,7 +370,7 @@ impl<'a> DependenciesBuilder<'a> { sqlite_connection_cardano_transaction_pool, signed_entity_type_lock.clone(), vec![signed_beacon_repository.clone()], - slog_scope::logger(), + self.root_logger(), )); let certifier = Arc::new(SignerCertifierService::new( ticker_service.clone(), @@ -373,6 +382,7 @@ impl<'a> DependenciesBuilder<'a> { signed_entity_type_lock.clone(), single_signer.clone(), aggregator_client.clone(), + self.root_logger(), )); let services = SignerDependencyContainer { @@ -408,6 +418,8 @@ mod tests { test_utils::TempDir, }; + use crate::test_tools::TestLogger; + use super::*; fn get_test_dir(test_name: &str) -> PathBuf { @@ -431,7 +443,7 @@ mod tests { -> StdResult> = |_config: &Configuration| Ok(Arc::new(DumbImmutableFileObserver::default())); - let mut dependencies_builder = DependenciesBuilder::new(&config); + let mut dependencies_builder = DependenciesBuilder::new(&config, TestLogger::stdout()); dependencies_builder .override_chain_observer_builder(chain_observer_builder) .override_immutable_file_observer_builder(immutable_file_observer_builder) diff --git a/mithril-signer/src/main.rs b/mithril-signer/src/main.rs index 41a2cd17abb..12e73aa7c72 100644 --- a/mithril-signer/src/main.rs +++ b/mithril-signer/src/main.rs @@ -2,8 +2,7 @@ use anyhow::{anyhow, Context}; use clap::{CommandFactory, Parser, Subcommand}; use config::{Map, Value}; -use slog::{o, Drain, Level, Logger}; -use slog_scope::{crit, debug, info}; +use slog::{crit, debug, info, o, Drain, Level, Logger}; use std::path::PathBuf; use std::sync::Arc; use std::time::Duration; @@ -124,7 +123,7 @@ enum SignerCommands { async fn main() -> StdResult<()> { // Load args let args = Args::parse(); - let _guard = slog_scope::set_global_logger(build_logger(args.log_level())); + let root_logger = build_logger(args.log_level()); if let Some(SignerCommands::GenerateDoc(cmd)) = &args.command { let config_infos = vec![ @@ -140,7 +139,7 @@ async fn main() -> StdResult<()> { #[cfg(feature = "bundle_openssl")] openssl_probe::init_ssl_cert_env_vars(); - debug!("Starting"; "node_version" => env!("CARGO_PKG_VERSION")); + debug!(root_logger, "Starting"; "node_version" => env!("CARGO_PKG_VERSION")); // Load config let config: Configuration = config::Config::builder() @@ -174,7 +173,7 @@ async fn main() -> StdResult<()> { .try_deserialize() .with_context(|| "configuration deserialize error")?; - let services = DependenciesBuilder::new(&config) + let services = DependenciesBuilder::new(&config, root_logger.clone()) .build() .await .with_context(|| "services initialization error")?; @@ -182,13 +181,18 @@ async fn main() -> StdResult<()> { let metrics_service = services.metrics_service.clone(); let cardano_transaction_preloader = services.cardano_transactions_preloader.clone(); - debug!("Started"; "run_mode" => &args.run_mode, "config" => format!("{config:?}")); + debug!(root_logger, "Started"; "run_mode" => &args.run_mode, "config" => format!("{config:?}")); let state_machine = StateMachine::new( SignerState::Init, - Box::new(SignerRunner::new(config.clone(), services)), + Box::new(SignerRunner::new( + config.clone(), + services, + root_logger.clone(), + )), Duration::from_millis(config.run_interval), metrics_service.clone(), + root_logger.clone(), ); let mut join_set = JoinSet::new(); @@ -200,25 +204,34 @@ async fn main() -> StdResult<()> { .map(|_| None) }); + let preload_logger = root_logger.clone(); join_set.spawn(async move { let refresh_interval = config.preloading_refresh_interval_in_seconds; let mut interval = tokio::time::interval(Duration::from_secs(refresh_interval)); loop { interval.tick().await; if let Err(err) = cardano_transaction_preloader.preload().await { - crit!("🔥 Cardano transactions preloader failed: {err:?}"); + crit!( + preload_logger, + "🔥 Cardano transactions preloader failed: {err:?}" + ); } - info!("⟳ Next Preload Cardano Transactions will start in {refresh_interval} s",); + info!( + preload_logger, + "⟳ Next Preload Cardano Transactions will start in {refresh_interval} s", + ); } }); let (metrics_server_shutdown_tx, metrics_server_shutdown_rx) = oneshot::channel(); if config.enable_metrics_server { + let metrics_logger = root_logger.clone(); join_set.spawn(async move { MetricsServer::new( &config.metrics_server_ip, config.metrics_server_port, metrics_service, + metrics_logger.clone(), ) .start(metrics_server_shutdown_rx) .await @@ -254,7 +267,7 @@ async fn main() -> StdResult<()> { let shutdown_reason = match join_set.join_next().await { Some(Err(e)) => { - crit!("A critical error occurred: {e:?}"); + crit!(root_logger, "A critical error occurred: {e:?}"); None } Some(Ok(res)) => res?, @@ -267,7 +280,7 @@ async fn main() -> StdResult<()> { join_set.shutdown().await; - debug!("Stopping"; "shutdown_reason" => shutdown_reason); + debug!(root_logger, "Stopping"; "shutdown_reason" => shutdown_reason); Ok(()) } diff --git a/mithril-signer/src/metrics/server.rs b/mithril-signer/src/metrics/server.rs index d18731d2b6b..71d00ed1a4c 100644 --- a/mithril-signer/src/metrics/server.rs +++ b/mithril-signer/src/metrics/server.rs @@ -1,5 +1,3 @@ -use std::sync::Arc; - use axum::{ body::Body, extract::State, @@ -8,10 +6,13 @@ use axum::{ routing::get, Router, }; -use mithril_common::StdResult; -use slog_scope::{error, info, warn}; +use slog::{error, info, warn, Logger}; +use std::sync::Arc; use tokio::sync::oneshot::Receiver; +use mithril_common::logging::LoggerExtensions; +use mithril_common::StdResult; + use crate::MetricsService; /// Metrics server errors @@ -26,8 +27,6 @@ impl IntoResponse for MetricsServerError { fn into_response(self) -> Response { match self { Self::Internal(e) => { - error!("{}", e); - (StatusCode::INTERNAL_SERVER_ERROR, format!("Error: {:?}", e)).into_response() } } @@ -39,15 +38,27 @@ pub struct MetricsServer { server_port: u16, server_ip: String, metrics_service: Arc, + logger: Logger, +} + +struct RouterState { + metrics_service: Arc, + logger: Logger, } impl MetricsServer { /// Create a new MetricsServer instance. - pub fn new(server_ip: &str, server_port: u16, metrics_service: Arc) -> Self { + pub fn new( + server_ip: &str, + server_port: u16, + metrics_service: Arc, + logger: Logger, + ) -> Self { Self { server_port, server_ip: server_ip.to_string(), metrics_service, + logger: logger.new_with_component_name::(), } } @@ -56,27 +67,40 @@ impl MetricsServer { format!("http://{}:{}", self.server_ip, self.server_port) } - /// Serve the metrics on a HTTP server. + /// Serve the metrics on an HTTP server. pub async fn start(&self, shutdown_rx: Receiver<()>) -> StdResult<()> { info!( - "MetricsServer: starting HTTP server for metrics on port {}", - self.server_port + self.logger, + "MetricsServer: starting HTTP server for metrics on port {}", self.server_port ); + + let router_state = Arc::new(RouterState { + metrics_service: self.metrics_service.clone(), + logger: self.logger.clone(), + }); let app = Router::new() .route( "/metrics", - get(|State(state): State>| async move { - state.export_metrics().map_err(MetricsServerError::Internal) + get(|State(state): State>| async move { + state.metrics_service.export_metrics().map_err(|e| { + error!(state.logger, "MetricsServer: error exporting metrics"; "error" => ?e); + MetricsServerError::Internal(e) + }) }), ) - .with_state(self.metrics_service.clone()); + .with_state(router_state); let listener = tokio::net::TcpListener::bind(format!("{}:{}", self.server_ip, self.server_port)) .await?; + + let serve_logger = self.logger.clone(); axum::serve(listener, app) - .with_graceful_shutdown(async { + .with_graceful_shutdown(async move { shutdown_rx.await.ok(); - warn!("MetricsServer: shutting down HTTP server after receiving signal"); + warn!( + serve_logger, + "MetricsServer: shutting down HTTP server after receiving signal" + ); }) .await?; @@ -91,13 +115,21 @@ mod tests { use std::time::Duration; use tokio::{sync::oneshot, task::yield_now, time::sleep}; + use crate::test_tools::TestLogger; + use super::*; #[tokio::test] async fn test_metrics_server() { + let logger = TestLogger::stdout(); let (shutdown_tx, shutdown_rx) = oneshot::channel(); - let metrics_service = Arc::new(MetricsService::new().unwrap()); - let metrics_server = Arc::new(MetricsServer::new("0.0.0.0", 9090, metrics_service.clone())); + let metrics_service = Arc::new(MetricsService::new(logger.clone()).unwrap()); + let metrics_server = Arc::new(MetricsServer::new( + "0.0.0.0", + 9090, + metrics_service.clone(), + logger, + )); let metrics_server_endpoint = metrics_server.endpoint(); let exported_metrics_test = tokio::spawn(async move { diff --git a/mithril-signer/src/metrics/service.rs b/mithril-signer/src/metrics/service.rs index 15dc6eb6672..c87b5ec10ae 100644 --- a/mithril-signer/src/metrics/service.rs +++ b/mithril-signer/src/metrics/service.rs @@ -1,6 +1,8 @@ -use mithril_common::{entities::Epoch, StdResult}; use prometheus::{Counter, Encoder, Gauge, Opts, Registry, TextEncoder}; -use slog_scope::debug; +use slog::{debug, Logger}; + +use mithril_common::logging::LoggerExtensions; +use mithril_common::{entities::Epoch, StdResult}; use super::{ RUNTIME_CYCLE_SUCCESS_SINCE_STARTUP_METRIC_HELP, @@ -29,6 +31,7 @@ type CounterValue = u32; /// Metrics service which is responsible for recording and exposing metrics. pub struct MetricsService { registry: Registry, + logger: Logger, signer_registration_success_since_startup_counter: Box, signer_registration_total_since_startup_counter: Box, signer_registration_success_last_epoch_gauge: Box, @@ -41,7 +44,7 @@ pub struct MetricsService { impl MetricsService { /// Create a new `MetricsService` instance. - pub fn new() -> StdResult { + pub fn new(logger: Logger) -> StdResult { let registry = Registry::new(); // Signer registration metrics @@ -101,6 +104,7 @@ impl MetricsService { Ok(Self { registry, + logger: logger.new_with_component_name::(), signer_registration_success_since_startup_counter, signer_registration_total_since_startup_counter, signer_registration_success_last_epoch_gauge, @@ -127,19 +131,22 @@ impl MetricsService { } /// Export the metrics as a string with the Open Metrics standard format. - /// These metrics can be exposed on a HTTP server. + /// These metrics can be exposed on an HTTP server. pub fn export_metrics(&self) -> StdResult { let mut buffer = vec![]; let encoder = TextEncoder::new(); let metric_families = self.registry.gather(); - encoder.encode(&metric_families, &mut buffer).unwrap(); + encoder.encode(&metric_families, &mut buffer)?; Ok(String::from_utf8(buffer)?) } /// Increment the `signer_registration_success_since_startup` counter. pub fn signer_registration_success_since_startup_counter_increment(&self) { - debug!("MetricsService: incrementing 'signer_registration_success_since_startup' counter"); + debug!( + self.logger, + "MetricsService: incrementing 'signer_registration_success_since_startup' counter" + ); self.signer_registration_success_since_startup_counter.inc(); } @@ -152,7 +159,10 @@ impl MetricsService { /// Increment the `signer_registration_total_since_startup` counter. pub fn signer_registration_total_since_startup_counter_increment(&self) { - debug!("MetricsService: incrementing 'signer_registration_total_since_startup' counter"); + debug!( + self.logger, + "MetricsService: incrementing 'signer_registration_total_since_startup' counter" + ); self.signer_registration_total_since_startup_counter.inc(); } @@ -165,7 +175,7 @@ impl MetricsService { /// Set the `signer_registration_success_last_epoch` gauge value. pub fn signer_registration_success_last_epoch_gauge_set(&self, value: Epoch) { - debug!("MetricsService: set 'signer_registration_success_last_epoch_set' gauge value to {value}"); + debug!(self.logger, "MetricsService: set 'signer_registration_success_last_epoch_set' gauge value to {value}"); self.signer_registration_success_last_epoch_gauge .set(value.0 as f64); } @@ -182,6 +192,7 @@ impl MetricsService { /// Increment the `signature_registration_success_since_startup` counter. pub fn signature_registration_success_since_startup_counter_increment(&self) { debug!( + self.logger, "MetricsService: incrementing 'signature_registration_success_since_startup' counter" ); self.signature_registration_success_since_startup_counter @@ -197,7 +208,10 @@ impl MetricsService { /// Increment the `signature_registration_total_since_startup` counter. pub fn signature_registration_total_since_startup_counter_increment(&self) { - debug!("MetricsService: incrementing 'signature_registration_total_since_startup' counter"); + debug!( + self.logger, + "MetricsService: incrementing 'signature_registration_total_since_startup' counter" + ); self.signature_registration_total_since_startup_counter .inc(); } @@ -211,7 +225,7 @@ impl MetricsService { /// Set the `signature_registration_success_last_epoch` gauge value. pub fn signature_registration_success_last_epoch_gauge_set(&self, value: Epoch) { - debug!("MetricsService: set 'signature_registration_success_last_epoch_set' gauge value to {value}"); + debug!(self.logger, "MetricsService: set 'signature_registration_success_last_epoch_set' gauge value to {value}"); self.signature_registration_success_last_epoch_gauge .set(value.0 as f64); } @@ -227,7 +241,10 @@ impl MetricsService { /// Increment the `runtime_cycle_total_since_startup` counter. pub fn runtime_cycle_total_since_startup_counter_increment(&self) { - debug!("MetricsService: incrementing 'runtime_cycle_total_since_startup' counter"); + debug!( + self.logger, + "MetricsService: incrementing 'runtime_cycle_total_since_startup' counter" + ); self.runtime_cycle_total_since_startup_counter.inc(); } @@ -238,7 +255,10 @@ impl MetricsService { /// Increment the `runtime_cycle_success_since_startup` counter. pub fn runtime_cycle_success_since_startup_counter_increment(&self) { - debug!("MetricsService: incrementing 'runtime_cycle_success_since_startup' counter"); + debug!( + self.logger, + "MetricsService: incrementing 'runtime_cycle_success_since_startup' counter" + ); self.runtime_cycle_success_since_startup_counter.inc(); } @@ -255,6 +275,8 @@ mod tests { use prometheus_parse::Value; use std::collections::BTreeMap; + use crate::test_tools::TestLogger; + use super::*; fn parse_metrics(raw_metrics: &str) -> StdResult> { @@ -269,7 +291,7 @@ mod tests { #[test] fn test_export_metrics() { - let metrics_service = MetricsService::new().unwrap(); + let metrics_service = MetricsService::new(TestLogger::stdout()).unwrap(); let exported_metrics = metrics_service.export_metrics().unwrap(); let parsed_metrics = parse_metrics(&exported_metrics).unwrap(); @@ -313,7 +335,7 @@ mod tests { #[test] fn test_signer_registration_success_since_startup_counter_increment() { - let metrics_service = MetricsService::new().unwrap(); + let metrics_service = MetricsService::new(TestLogger::stdout()).unwrap(); assert_eq!( 0, metrics_service.signer_registration_success_since_startup_counter_get(), @@ -328,7 +350,7 @@ mod tests { #[test] fn test_signer_registration_total_since_startup_counter_increment() { - let metrics_service = MetricsService::new().unwrap(); + let metrics_service = MetricsService::new(TestLogger::stdout()).unwrap(); assert_eq!( 0, metrics_service.signer_registration_total_since_startup_counter_get(), @@ -343,7 +365,7 @@ mod tests { #[test] fn test_signer_registration_success_last_epoch_gauge_set() { - let metrics_service = MetricsService::new().unwrap(); + let metrics_service = MetricsService::new(TestLogger::stdout()).unwrap(); assert_eq!( Epoch(0), metrics_service.signer_registration_success_last_epoch_gauge_get(), @@ -358,7 +380,7 @@ mod tests { #[test] fn test_signature_registration_success_since_startup_counter_increment() { - let metrics_service = MetricsService::new().unwrap(); + let metrics_service = MetricsService::new(TestLogger::stdout()).unwrap(); assert_eq!( 0, metrics_service.signature_registration_success_since_startup_counter_get(), @@ -373,7 +395,7 @@ mod tests { #[test] fn test_signature_registration_total_since_startup_counter_increment() { - let metrics_service = MetricsService::new().unwrap(); + let metrics_service = MetricsService::new(TestLogger::stdout()).unwrap(); assert_eq!( 0, metrics_service.signature_registration_total_since_startup_counter_get(), @@ -388,7 +410,7 @@ mod tests { #[test] fn test_signature_registration_success_last_epoch_gauge_set() { - let metrics_service = MetricsService::new().unwrap(); + let metrics_service = MetricsService::new(TestLogger::stdout()).unwrap(); assert_eq!( Epoch(0), metrics_service.signature_registration_success_last_epoch_gauge_get(), @@ -403,7 +425,7 @@ mod tests { #[test] fn test_runtime_cycle_success_since_startup_counter_increment() { - let metrics_service = MetricsService::new().unwrap(); + let metrics_service = MetricsService::new(TestLogger::stdout()).unwrap(); assert_eq!( 0, metrics_service.runtime_cycle_success_since_startup_counter_get(), @@ -418,7 +440,7 @@ mod tests { #[test] fn test_runtime_cycle_total_since_startup_counter_increment() { - let metrics_service = MetricsService::new().unwrap(); + let metrics_service = MetricsService::new(TestLogger::stdout()).unwrap(); assert_eq!( 0, metrics_service.runtime_cycle_total_since_startup_counter_get(), diff --git a/mithril-signer/src/runtime/runner.rs b/mithril-signer/src/runtime/runner.rs index d5b74701ee2..9452a4e4e48 100644 --- a/mithril-signer/src/runtime/runner.rs +++ b/mithril-signer/src/runtime/runner.rs @@ -1,6 +1,6 @@ use anyhow::Context; use async_trait::async_trait; -use slog_scope::{debug, warn}; +use slog::{debug, warn, Logger}; use thiserror::Error; use tokio::sync::RwLockReadGuard; @@ -8,6 +8,7 @@ use mithril_common::crypto_helper::{KESPeriod, OpCert, ProtocolOpCert, SerDeShel use mithril_common::entities::{ Epoch, PartyId, ProtocolMessage, SignedEntityType, Signer, TimePoint, }; +use mithril_common::logging::LoggerExtensions; use mithril_common::StdResult; use mithril_persistence::store::StakeStorer; @@ -81,12 +82,17 @@ pub enum RunnerError { pub struct SignerRunner { config: Configuration, services: SignerDependencyContainer, + logger: Logger, } impl SignerRunner { /// Create a new Runner instance. - pub fn new(config: Configuration, services: SignerDependencyContainer) -> Self { - Self { services, config } + pub fn new(config: Configuration, services: SignerDependencyContainer, logger: Logger) -> Self { + Self { + services, + config, + logger: logger.new_with_component_name::(), + } } async fn epoch_service_read(&self) -> RwLockReadGuard<'_, dyn EpochService> { @@ -98,7 +104,7 @@ impl SignerRunner { #[async_trait] impl Runner for SignerRunner { async fn get_epoch_settings(&self) -> StdResult> { - debug!("RUNNER: get_epoch_settings"); + debug!(self.logger, "RUNNER: get_epoch_settings"); self.services .certificate_handler @@ -108,13 +114,13 @@ impl Runner for SignerRunner { } async fn get_beacon_to_sign(&self) -> StdResult> { - debug!("RUNNER: get_beacon_to_sign"); + debug!(self.logger, "RUNNER: get_beacon_to_sign"); self.services.certifier.get_beacon_to_sign().await } async fn get_current_time_point(&self) -> StdResult { - debug!("RUNNER: get_current_time_point"); + debug!(self.logger, "RUNNER: get_current_time_point"); self.services .ticker_service @@ -124,7 +130,7 @@ impl Runner for SignerRunner { } async fn register_signer_to_aggregator(&self) -> StdResult<()> { - debug!("RUNNER: register_signer_to_aggregator"); + debug!(self.logger, "RUNNER: register_signer_to_aggregator"); let (epoch, protocol_parameters) = { let epoch_service = self.services.epoch_service.read().await; @@ -200,7 +206,7 @@ impl Runner for SignerRunner { } async fn update_stake_distribution(&self, epoch: Epoch) -> StdResult<()> { - debug!("RUNNER: update_stake_distribution"); + debug!(self.logger, "RUNNER: update_stake_distribution"); let exists_stake_distribution = !self .services @@ -233,7 +239,7 @@ impl Runner for SignerRunner { } async fn inform_epoch_settings(&self, epoch_settings: SignerEpochSettings) -> StdResult<()> { - debug!("RUNNER: register_epoch"); + debug!(self.logger, "RUNNER: register_epoch"); let aggregator_features = self .services .certificate_handler @@ -255,7 +261,7 @@ impl Runner for SignerRunner { &self, signed_entity_type: &SignedEntityType, ) -> StdResult { - debug!("RUNNER: compute_message"); + debug!(self.logger, "RUNNER: compute_message"); let protocol_message = self .services @@ -272,7 +278,7 @@ impl Runner for SignerRunner { beacon_to_sign: &BeaconToSign, message: &ProtocolMessage, ) -> StdResult<()> { - debug!("RUNNER: compute_publish_single_signature"); + debug!(self.logger, "RUNNER: compute_publish_single_signature"); self.services .certifier .compute_publish_single_signature(beacon_to_sign, message) @@ -280,7 +286,7 @@ impl Runner for SignerRunner { } async fn update_era_checker(&self, epoch: Epoch) -> StdResult<()> { - debug!("RUNNER: update_era_checker"); + debug!(self.logger, "RUNNER: update_era_checker"); let era_token = self .services @@ -293,6 +299,7 @@ impl Runner for SignerRunner { .era_checker .change_era(current_era, era_token.get_current_epoch()); debug!( + self.logger, "Current Era is {} (Epoch {}).", current_era, era_token.get_current_epoch() @@ -300,14 +307,14 @@ impl Runner for SignerRunner { if era_token.get_next_supported_era().is_err() { let era_name = &era_token.get_next_era_marker().unwrap().name; - warn!("Upcoming Era '{era_name}' is not supported by this version of the software. Please update!"); + warn!(self.logger, "Upcoming Era '{era_name}' is not supported by this version of the software. Please update!"); } Ok(()) } async fn upkeep(&self, current_epoch: Epoch) -> StdResult<()> { - debug!("RUNNER: upkeep"); + debug!(self.logger, "RUNNER: upkeep"); self.services.upkeep_service.run(current_epoch).await?; Ok(()) } @@ -356,6 +363,7 @@ mod tests { SignerSignableSeedBuilder, SignerSignedEntityConfigProvider, }; use crate::store::ProtocolInitializerStore; + use crate::test_tools::TestLogger; use super::*; @@ -388,6 +396,7 @@ mod tests { } async fn init_services() -> SignerDependencyContainer { + let logger = TestLogger::stdout(); let sqlite_connection = Arc::new(main_db_connection().unwrap()); let adapter: MemoryAdapter = MemoryAdapter::new(None).unwrap(); let stake_distribution_signers = fake_data::signers_with_stakes(2); @@ -416,7 +425,7 @@ mod tests { Arc::new(CardanoImmutableFilesFullSignableBuilder::new( digester.clone(), Path::new(""), - slog_scope::logger(), + logger.clone(), )); let mithril_stake_distribution_signable_builder = Arc::new(MithrilStakeDistributionSignableBuilder::default()); @@ -425,14 +434,14 @@ mod tests { let transactions_importer = Arc::new(CardanoTransactionsImporter::new( transaction_parser.clone(), transaction_store.clone(), - slog_scope::logger(), + logger.clone(), )); let block_range_root_retriever = Arc::new(MockBlockRangeRootRetrieverImpl::::new()); let cardano_transactions_builder = Arc::new(CardanoTransactionsSignableBuilder::new( transactions_importer.clone(), block_range_root_retriever, - slog_scope::logger(), + logger.clone(), )); let stake_store = Arc::new(StakeStore::new(Box::new(DumbStoreAdapter::new()), None)); let cardano_stake_distribution_builder = Arc::new( @@ -443,8 +452,13 @@ mod tests { let epoch_service = Arc::new(RwLock::new(MithrilEpochService::new( stake_store.clone(), protocol_initializer_store.clone(), + logger.clone(), ))); - let single_signer = Arc::new(MithrilSingleSigner::new(party_id, epoch_service.clone())); + let single_signer = Arc::new(MithrilSingleSigner::new( + party_id, + epoch_service.clone(), + logger.clone(), + )); let signable_seed_builder_service = Arc::new(SignerSignableSeedBuilder::new( epoch_service.clone(), protocol_initializer_store.clone(), @@ -457,7 +471,7 @@ mod tests { cardano_transactions_builder, cardano_stake_distribution_builder, )); - let metrics_service = Arc::new(MetricsService::new().unwrap()); + let metrics_service = Arc::new(MetricsService::new(logger.clone()).unwrap()); let signed_entity_type_lock = Arc::new(SignedEntityTypeLock::default()); let security_parameter = BlockNumber(0); let cardano_transactions_preloader = Arc::new(CardanoTransactionsPreloader::new( @@ -465,7 +479,7 @@ mod tests { transactions_importer.clone(), security_parameter, chain_observer.clone(), - slog_scope::logger(), + logger.clone(), Arc::new(CardanoTransactionsPreloaderActivation::new(true)), )); let upkeep_service = Arc::new(MockUpkeepService::new()); @@ -480,6 +494,7 @@ mod tests { signed_entity_type_lock.clone(), single_signer.clone(), aggregator_client.clone(), + logger.clone(), )); SignerDependencyContainer { @@ -510,6 +525,7 @@ mod tests { SignerRunner::new( maybe_config.unwrap_or(Configuration::new_sample("1")), maybe_services.unwrap_or(init_services().await), + TestLogger::stdout(), ) } diff --git a/mithril-signer/src/runtime/state_machine.rs b/mithril-signer/src/runtime/state_machine.rs index 97db5699da2..52d10ee2baf 100644 --- a/mithril-signer/src/runtime/state_machine.rs +++ b/mithril-signer/src/runtime/state_machine.rs @@ -1,10 +1,11 @@ -use slog_scope::{crit, debug, error, info}; +use slog::{crit, debug, error, info, Logger}; use std::{fmt::Display, ops::Deref, sync::Arc, time::Duration}; use tokio::{sync::Mutex, time::sleep}; use mithril_common::{ crypto_helper::ProtocolInitializerError, entities::{Epoch, TimePoint}, + logging::LoggerExtensions, }; use crate::entities::{BeaconToSign, SignerEpochSettings}; @@ -80,6 +81,7 @@ pub struct StateMachine { runner: Box, state_sleep: Duration, metrics_service: Arc, + logger: Logger, } impl StateMachine { @@ -89,12 +91,14 @@ impl StateMachine { runner: Box, state_sleep: Duration, metrics_service: Arc, + logger: Logger, ) -> Self { Self { state: Mutex::new(starting_state), runner, state_sleep, metrics_service, + logger: logger.new_with_component_name::(), } } @@ -105,20 +109,21 @@ impl StateMachine { /// Launch the state machine until an error occurs or it is interrupted. pub async fn run(&self) -> Result<(), RuntimeError> { - info!("STATE MACHINE: launching"); + info!(self.logger, "STATE MACHINE: launching"); loop { if let Err(e) = self.cycle().await { if e.is_critical() { - crit!("{e}"); + crit!(self.logger, "{e}"); return Err(e); } else { - error!("{e}"); + error!(self.logger, "{e}"); } } info!( + self.logger, "… Cycle finished, Sleeping for {} ms", self.state_sleep.as_millis() ); @@ -129,8 +134,11 @@ impl StateMachine { /// Perform a cycle of the state machine. pub async fn cycle(&self) -> Result<(), RuntimeError> { let mut state = self.state.lock().await; - info!("================================================================================"); - info!("STATE MACHINE: new cycle: {}", *state); + info!( + self.logger, + "================================================================================" + ); + info!(self.logger, "STATE MACHINE: new cycle: {}", *state); self.metrics_service .runtime_cycle_total_since_startup_counter_increment(); @@ -141,7 +149,10 @@ impl StateMachine { } SignerState::Unregistered { epoch } => { if let Some(new_epoch) = self.has_epoch_changed(*epoch).await? { - info!("→ Epoch has changed, transiting to Unregistered"); + info!( + self.logger, + "→ Epoch has changed, transiting to Unregistered" + ); *state = self .transition_from_unregistered_to_unregistered(new_epoch) .await?; @@ -154,10 +165,10 @@ impl StateMachine { nested_error: Some(e), })? { - info!("→ Epoch settings found"); + info!(self.logger, "→ Epoch settings found"); if epoch_settings.epoch >= *epoch { - info!("new Epoch found"); - info!(" â‹… transiting to Registered"); + info!(self.logger, "new Epoch found"); + info!(self.logger, " â‹… transiting to Registered"); *state = self .transition_from_unregistered_to_one_of_registered_states( epoch_settings, @@ -165,29 +176,36 @@ impl StateMachine { .await?; } else { info!( + self.logger, " â‹… Epoch settings found, but its epoch is behind the known epoch, waiting…"; "epoch_settings" => ?epoch_settings, "known_epoch" => ?epoch, ); } } else { - info!("→ No epoch settings found yet, waiting…"); + info!(self.logger, "→ No epoch settings found yet, waiting…"); } } SignerState::RegisteredNotAbleToSign { epoch } => { if let Some(new_epoch) = self.has_epoch_changed(*epoch).await? { - info!(" → new Epoch detected, transiting to Unregistered"); + info!( + self.logger, + " → new Epoch detected, transiting to Unregistered" + ); *state = self .transition_from_registered_not_able_to_sign_to_unregistered(new_epoch) .await?; } else { - info!(" â‹… Epoch has NOT changed, waiting…"); + info!(self.logger, " â‹… Epoch has NOT changed, waiting…"); } } SignerState::ReadyToSign { epoch } => match self.has_epoch_changed(*epoch).await? { Some(new_epoch) => { - info!("→ Epoch has changed, transiting to Unregistered"); + info!( + self.logger, + "→ Epoch has changed, transiting to Unregistered" + ); *state = self .transition_from_ready_to_sign_to_unregistered(new_epoch) .await?; @@ -203,6 +221,7 @@ impl StateMachine { match beacon_to_sign { Some(beacon) => { info!( + self.logger, "→ Epoch has NOT changed we can sign this beacon, transiting to ReadyToSign"; "beacon_to_sign" => ?beacon, ); @@ -211,7 +230,7 @@ impl StateMachine { .await?; } None => { - info!(" â‹… no beacon to sign, waiting…"); + info!(self.logger, " â‹… no beacon to sign, waiting…"); } } } @@ -357,6 +376,7 @@ impl StateMachine { ); debug!( + self.logger, " > transition_from_ready_to_sign_to_ready_to_sign"; "current_epoch" => ?current_epoch, "retrieval_epoch" => ?retrieval_epoch, @@ -429,16 +449,19 @@ mod tests { use mithril_common::test_utils::fake_data; use crate::runtime::runner::MockSignerRunner; + use crate::test_tools::TestLogger; use super::*; fn init_state_machine(init_state: SignerState, runner: MockSignerRunner) -> StateMachine { - let metrics_service = Arc::new(MetricsService::new().unwrap()); + let logger = TestLogger::stdout(); + let metrics_service = Arc::new(MetricsService::new(logger.clone()).unwrap()); StateMachine { state: init_state.into(), runner: Box::new(runner), state_sleep: Duration::from_millis(100), metrics_service, + logger, } } diff --git a/mithril-signer/src/services/aggregator_client.rs b/mithril-signer/src/services/aggregator_client.rs index 410b707d5be..5018d48e12a 100644 --- a/mithril-signer/src/services/aggregator_client.rs +++ b/mithril-signer/src/services/aggregator_client.rs @@ -1,13 +1,14 @@ use anyhow::anyhow; use async_trait::async_trait; use reqwest::{self, Client, Proxy, RequestBuilder, Response, StatusCode}; -use slog_scope::debug; +use slog::{debug, Logger}; use std::{io, sync::Arc, time::Duration}; use thiserror::Error; use mithril_common::{ api_version::APIVersionProvider, entities::{Epoch, ProtocolMessage, SignedEntityType, Signer, SingleSignatures}, + logging::LoggerExtensions, messages::{ AggregatorFeaturesMessage, EpochSettingsMessage, TryFromMessageAdapter, TryToMessageAdapter, }, @@ -118,6 +119,7 @@ pub struct AggregatorHTTPClient { relay_endpoint: Option, api_version_provider: Arc, timeout_duration: Option, + logger: Logger, } impl AggregatorHTTPClient { @@ -127,13 +129,16 @@ impl AggregatorHTTPClient { relay_endpoint: Option, api_version_provider: Arc, timeout_duration: Option, + logger: Logger, ) -> Self { - debug!("New AggregatorHTTPClient created"); + let logger = logger.new_with_component_name::(); + debug!(logger, "New AggregatorHTTPClient created"); Self { aggregator_endpoint, relay_endpoint, api_version_provider, timeout_duration, + logger, } } @@ -193,7 +198,7 @@ impl AggregatorClient for AggregatorHTTPClient { async fn retrieve_epoch_settings( &self, ) -> Result, AggregatorClientError> { - debug!("Retrieve epoch settings"); + debug!(self.logger, "Retrieve epoch settings"); let url = format!("{}/epoch-settings", self.aggregator_endpoint); let response = self .prepare_request_builder(self.prepare_http_client()?.get(url.clone())) @@ -225,7 +230,7 @@ impl AggregatorClient for AggregatorHTTPClient { epoch: Epoch, signer: &Signer, ) -> Result<(), AggregatorClientError> { - debug!("Register signer"); + debug!(self.logger, "Register signer"); let url = format!("{}/register-signer", self.aggregator_endpoint); let register_signer_message = ToRegisterSignerMessageAdapter::try_adapt((epoch, signer.to_owned())) @@ -258,7 +263,7 @@ impl AggregatorClient for AggregatorHTTPClient { signatures: &SingleSignatures, protocol_message: &ProtocolMessage, ) -> Result<(), AggregatorClientError> { - debug!("Register signatures"); + debug!(self.logger, "Register signatures"); let url = format!("{}/register-signatures", self.aggregator_endpoint); let register_single_signature_message = ToRegisterSignatureMessageAdapter::try_adapt(( signed_entity_type.to_owned(), @@ -276,7 +281,7 @@ impl AggregatorClient for AggregatorHTTPClient { Ok(response) => match response.status() { StatusCode::CREATED => Ok(()), StatusCode::GONE => { - debug!("Aggregator already certified that message"; "signed_entity_type" => ?signed_entity_type); + debug!(self.logger, "Aggregator already certified that message"; "signed_entity_type" => ?signed_entity_type); Ok(()) } StatusCode::PRECONDITION_FAILED => Err(self.handle_api_error(&response)), @@ -298,7 +303,7 @@ impl AggregatorClient for AggregatorHTTPClient { async fn retrieve_aggregator_features( &self, ) -> Result { - debug!("Retrieve aggregator features message"); + debug!(self.logger, "Retrieve aggregator features message"); let url = format!("{}/", self.aggregator_endpoint); let response = self .prepare_request_builder(self.prepare_http_client()?.get(url.clone())) @@ -430,6 +435,7 @@ mod tests { use mithril_common::test_utils::fake_data; use crate::configuration::Configuration; + use crate::test_tools::TestLogger; use super::*; @@ -464,6 +470,7 @@ mod tests { config.relay_endpoint, Arc::new(api_version_provider), None, + TestLogger::stdout(), ), ) } @@ -559,6 +566,7 @@ mod tests { config.relay_endpoint, Arc::new(api_version_provider), None, + TestLogger::stdout(), ); let epoch_settings = certificate_handler.retrieve_epoch_settings().await; epoch_settings.as_ref().expect("unexpected error"); @@ -581,6 +589,7 @@ mod tests { config.relay_endpoint, Arc::new(api_version_provider), None, + TestLogger::stdout(), ); let epoch_settings = certificate_handler .retrieve_epoch_settings() @@ -602,6 +611,7 @@ mod tests { config.relay_endpoint, Arc::new(api_version_provider), None, + TestLogger::stdout(), ); match certificate_handler @@ -626,6 +636,7 @@ mod tests { config.relay_endpoint, Arc::new(api_version_provider), Some(Duration::from_millis(50)), + TestLogger::stdout(), ); let error = certificate_handler @@ -654,6 +665,7 @@ mod tests { config.relay_endpoint, Arc::new(api_version_provider), None, + TestLogger::stdout(), ); let register_signer = certificate_handler .register_signer(epoch, single_signer) @@ -677,6 +689,7 @@ mod tests { config.relay_endpoint, Arc::new(api_version_provider), None, + TestLogger::stdout(), ); let error = certificate_handler .register_signer(epoch, single_signer) @@ -707,6 +720,7 @@ mod tests { config.relay_endpoint, Arc::new(api_version_provider), None, + TestLogger::stdout(), ); match certificate_handler @@ -738,6 +752,7 @@ mod tests { config.relay_endpoint, Arc::new(api_version_provider), None, + TestLogger::stdout(), ); match certificate_handler @@ -765,6 +780,7 @@ mod tests { config.relay_endpoint, Arc::new(api_version_provider), Some(Duration::from_millis(50)), + TestLogger::stdout(), ); let error = certificate_handler @@ -791,6 +807,7 @@ mod tests { config.relay_endpoint, Arc::new(api_version_provider), None, + TestLogger::stdout(), ); let register_signatures = certificate_handler .register_signatures( @@ -816,6 +833,7 @@ mod tests { config.relay_endpoint, Arc::new(api_version_provider), None, + TestLogger::stdout(), ); let error = certificate_handler .register_signatures( @@ -848,6 +866,7 @@ mod tests { config.relay_endpoint, Arc::new(api_version_provider), None, + TestLogger::stdout(), ); match certificate_handler .register_signatures( @@ -882,6 +901,7 @@ mod tests { config.relay_endpoint, Arc::new(api_version_provider), None, + TestLogger::stdout(), ); certificate_handler .register_signatures( @@ -906,6 +926,7 @@ mod tests { config.relay_endpoint, Arc::new(api_version_provider), None, + TestLogger::stdout(), ); match certificate_handler .register_signatures( @@ -934,6 +955,7 @@ mod tests { config.relay_endpoint, Arc::new(api_version_provider), None, + TestLogger::stdout(), ); match certificate_handler .register_signatures( @@ -962,6 +984,7 @@ mod tests { config.relay_endpoint, Arc::new(api_version_provider), Some(Duration::from_millis(50)), + TestLogger::stdout(), ); let error = certificate_handler diff --git a/mithril-signer/src/services/cardano_transactions/importer/importer_by_chunk.rs b/mithril-signer/src/services/cardano_transactions/importer/importer_by_chunk.rs index a571c75e63a..3cce53ef00e 100644 --- a/mithril-signer/src/services/cardano_transactions/importer/importer_by_chunk.rs +++ b/mithril-signer/src/services/cardano_transactions/importer/importer_by_chunk.rs @@ -4,6 +4,7 @@ use async_trait::async_trait; use slog::{debug, Logger}; use mithril_common::entities::BlockNumber; +use mithril_common::logging::LoggerExtensions; use mithril_common::signable_builder::TransactionsImporter; use mithril_common::StdResult; @@ -35,7 +36,7 @@ impl TransactionsImporterByChunk { highest_transaction_block_number_getter, wrapped_importer, chunk_size, - logger, + logger: logger.new_with_component_name::(), } } } diff --git a/mithril-signer/src/services/cardano_transactions/importer/importer_with_pruner.rs b/mithril-signer/src/services/cardano_transactions/importer/importer_with_pruner.rs index 9fbad429ae6..11e6efe611d 100644 --- a/mithril-signer/src/services/cardano_transactions/importer/importer_with_pruner.rs +++ b/mithril-signer/src/services/cardano_transactions/importer/importer_with_pruner.rs @@ -4,6 +4,7 @@ use async_trait::async_trait; use slog::{debug, Logger}; use mithril_common::entities::BlockNumber; +use mithril_common::logging::LoggerExtensions; use mithril_common::signable_builder::TransactionsImporter; use mithril_common::StdResult; @@ -38,7 +39,7 @@ impl TransactionsImporterWithPruner { number_of_blocks_to_keep, transaction_pruner, wrapped_importer, - logger, + logger: logger.new_with_component_name::(), } } } diff --git a/mithril-signer/src/services/cardano_transactions/importer/importer_with_vacuum.rs b/mithril-signer/src/services/cardano_transactions/importer/importer_with_vacuum.rs index fa5bff5a239..1a541629172 100644 --- a/mithril-signer/src/services/cardano_transactions/importer/importer_with_vacuum.rs +++ b/mithril-signer/src/services/cardano_transactions/importer/importer_with_vacuum.rs @@ -4,6 +4,7 @@ use async_trait::async_trait; use slog::{debug, Logger}; use mithril_common::entities::BlockNumber; +use mithril_common::logging::LoggerExtensions; use mithril_common::signable_builder::TransactionsImporter; use mithril_common::StdResult; use mithril_persistence::sqlite::{SqliteCleaner, SqliteCleaningTask, SqliteConnectionPool}; @@ -25,7 +26,7 @@ impl TransactionsImporterWithVacuum { Self { connection_pool, wrapped_importer, - logger, + logger: logger.new_with_component_name::(), } } } diff --git a/mithril-signer/src/services/cardano_transactions/importer/service.rs b/mithril-signer/src/services/cardano_transactions/importer/service.rs index 96ff039f551..70d6769346e 100644 --- a/mithril-signer/src/services/cardano_transactions/importer/service.rs +++ b/mithril-signer/src/services/cardano_transactions/importer/service.rs @@ -12,6 +12,7 @@ use mithril_common::crypto_helper::{MKTree, MKTreeNode, MKTreeStoreInMemory}; use mithril_common::entities::{ BlockNumber, BlockRange, CardanoTransaction, ChainPoint, SlotNumber, }; +use mithril_common::logging::LoggerExtensions; use mithril_common::signable_builder::TransactionsImporter; use mithril_common::StdResult; @@ -68,7 +69,7 @@ impl CardanoTransactionsImporter { Self { block_scanner, transaction_store, - logger, + logger: logger.new_with_component_name::(), } } diff --git a/mithril-signer/src/services/certifier.rs b/mithril-signer/src/services/certifier.rs index bc28971816a..ef4686172e5 100644 --- a/mithril-signer/src/services/certifier.rs +++ b/mithril-signer/src/services/certifier.rs @@ -1,11 +1,12 @@ use async_trait::async_trait; use chrono::Utc; -use slog_scope::debug; +use slog::{debug, Logger}; use std::sync::Arc; use mithril_common::entities::{ ProtocolMessage, SignedEntityConfig, SignedEntityType, SingleSignatures, TimePoint, }; +use mithril_common::logging::LoggerExtensions; use mithril_common::signed_entity_type_lock::SignedEntityTypeLock; use mithril_common::{StdResult, TickerService}; @@ -74,6 +75,7 @@ pub struct SignerCertifierService { signed_entity_type_lock: Arc, single_signer: Arc, signature_publisher: Arc, + logger: Logger, } impl SignerCertifierService { @@ -85,6 +87,7 @@ impl SignerCertifierService { signed_entity_type_lock: Arc, single_signer: Arc, signature_publisher: Arc, + logger: Logger, ) -> Self { Self { ticker_service, @@ -93,6 +96,7 @@ impl SignerCertifierService { signed_entity_type_lock, single_signer, signature_publisher, + logger: logger.new_with_component_name::(), } } @@ -147,7 +151,7 @@ impl CertifierService for SignerCertifierService { .compute_single_signatures(protocol_message) .await? { - debug!(" > there is a single signature to send"); + debug!(self.logger, " > there is a single signature to send"); self.signature_publisher .publish( &beacon_to_sign.signed_entity_type, @@ -156,10 +160,10 @@ impl CertifierService for SignerCertifierService { ) .await?; } else { - debug!(" > NO single signature to send"); + debug!(self.logger, " > NO single signature to send"); } - debug!(" > marking beacon as signed"; "beacon" => ?beacon_to_sign); + debug!(self.logger, " > marking beacon as signed"; "beacon" => ?beacon_to_sign); self.signed_beacon_store .mark_beacon_as_signed(beacon_to_sign) .await?; @@ -501,6 +505,8 @@ mod tests { use mithril_common::CardanoNetwork; + use crate::test_tools::TestLogger; + use super::*; impl SignerCertifierService { @@ -515,6 +521,7 @@ mod tests { signed_entity_type_lock: Arc::new(SignedEntityTypeLock::new()), single_signer: Arc::new(MockSingleSigner::new()), signature_publisher: Arc::new(MockSignaturePublisher::new()), + logger: TestLogger::stdout(), } } } diff --git a/mithril-signer/src/services/epoch_service.rs b/mithril-signer/src/services/epoch_service.rs index ae70f5235cb..493987c6a6d 100644 --- a/mithril-signer/src/services/epoch_service.rs +++ b/mithril-signer/src/services/epoch_service.rs @@ -1,6 +1,6 @@ use anyhow::anyhow; use async_trait::async_trait; -use slog_scope::{debug, trace, warn}; +use slog::{debug, trace, warn, Logger}; use std::collections::BTreeSet; use std::sync::Arc; use thiserror::Error; @@ -10,6 +10,7 @@ use mithril_common::entities::{ CardanoTransactionsSigningConfig, Epoch, PartyId, ProtocolParameters, SignedEntityConfig, SignedEntityTypeDiscriminants, Signer, SignerWithStake, }; +use mithril_common::logging::LoggerExtensions; use mithril_common::{CardanoNetwork, StdResult}; use mithril_persistence::store::StakeStorer; @@ -94,6 +95,7 @@ pub struct MithrilEpochService { stake_storer: Arc, protocol_initializer_store: Arc, epoch_data: Option, + logger: Logger, } impl MithrilEpochService { @@ -101,11 +103,13 @@ impl MithrilEpochService { pub fn new( stake_storer: Arc, protocol_initializer_store: Arc, + logger: Logger, ) -> Self { Self { stake_storer, protocol_initializer_store, epoch_data: None, + logger: logger.new_with_component_name::(), } } @@ -114,7 +118,7 @@ impl MithrilEpochService { epoch: Epoch, signers: &[Signer], ) -> StdResult> { - debug!("EpochService: associate_signers_with_stake"); + debug!(self.logger, "EpochService: associate_signers_with_stake"); let stakes = self .stake_storer @@ -138,6 +142,7 @@ impl MithrilEpochService { *stake, )); trace!( + self.logger, " > associating signer_id {} with stake {}", signer.party_id, *stake @@ -173,8 +178,8 @@ impl EpochService for MithrilEpochService { allowed_discriminants: BTreeSet, ) -> StdResult<()> { debug!( - "EpochService: register_epoch_settings: {:?}", - epoch_settings + self.logger, + "EpochService: register_epoch_settings: {:?}", epoch_settings ); let epoch = epoch_settings.epoch; @@ -255,16 +260,25 @@ impl EpochService for MithrilEpochService { fn can_signer_sign_current_epoch(&self, party_id: PartyId) -> StdResult { let epoch = self.epoch_of_current_data()?; if let Some(protocol_initializer) = self.protocol_initializer()? { - debug!(" > got protocol initializer for this epoch ({epoch})"); + debug!( + self.logger, + " > got protocol initializer for this epoch ({epoch})" + ); if self .is_signer_included_in_current_stake_distribution(party_id, protocol_initializer)? { return Ok(true); } else { - debug!(" > Signer not in current stake distribution. Can NOT sign"); + debug!( + self.logger, + " > Signer not in current stake distribution. Can NOT sign" + ); } } else { - warn!(" > NO protocol initializer found for this epoch ({epoch})",); + warn!( + self.logger, + " > NO protocol initializer found for this epoch ({epoch})", + ); } Ok(false) @@ -313,6 +327,7 @@ impl MithrilEpochService { /// `TEST ONLY` - Create a new instance of the service using dumb dependencies. pub fn new_with_dumb_dependencies() -> Self { use crate::store::ProtocolInitializerStore; + use crate::test_tools::TestLogger; use mithril_persistence::store::adapter::DumbStoreAdapter; use mithril_persistence::store::StakeStore; @@ -322,7 +337,11 @@ impl MithrilEpochService { None, )); - Self::new(stake_store, protocol_initializer_store) + Self::new( + stake_store, + protocol_initializer_store, + TestLogger::stdout(), + ) } /// `TEST ONLY` - Set all data to either default values, empty values, or fake values @@ -423,6 +442,7 @@ mod tests { use crate::entities::SignerEpochSettings; use crate::services::MithrilProtocolInitializerBuilder; use crate::store::ProtocolInitializerStore; + use crate::test_tools::TestLogger; use super::*; @@ -442,7 +462,11 @@ mod tests { Box::new(DumbStoreAdapter::new()), None, )); - let service = MithrilEpochService::new(stake_store, protocol_initializer_store); + let service = MithrilEpochService::new( + stake_store, + protocol_initializer_store, + TestLogger::stdout(), + ); service .is_signer_included_in_current_stake_distribution(party_id, &protocol_initializer) @@ -470,7 +494,11 @@ mod tests { ..SignerEpochSettings::dummy().clone() }; - let mut service = MithrilEpochService::new(stake_store, protocol_initializer_store); + let mut service = MithrilEpochService::new( + stake_store, + protocol_initializer_store, + TestLogger::stdout(), + ); service .inform_epoch_settings(epoch_settings.clone(), BTreeSet::new()) .await @@ -605,7 +633,11 @@ mod tests { )); // Build service and register epoch settings - let service = MithrilEpochService::new(stake_store, protocol_initializer_store); + let service = MithrilEpochService::new( + stake_store, + protocol_initializer_store, + TestLogger::stdout(), + ); assert!(service.epoch_of_current_data().is_err()); assert!(service.next_protocol_parameters().is_err()); assert!(service.protocol_initializer().is_err()); @@ -639,7 +671,11 @@ mod tests { }; // Build service and register epoch settings - let mut service = MithrilEpochService::new(stake_store, protocol_initializer_store); + let mut service = MithrilEpochService::new( + stake_store, + protocol_initializer_store, + TestLogger::stdout(), + ); service .inform_epoch_settings( @@ -741,7 +777,11 @@ mod tests { }; // Build service and register epoch settings - let mut service = MithrilEpochService::new(stake_store, protocol_initializer_store); + let mut service = MithrilEpochService::new( + stake_store, + protocol_initializer_store, + TestLogger::stdout(), + ); service .inform_epoch_settings(epoch_settings.clone(), BTreeSet::new()) .await @@ -786,7 +826,11 @@ mod tests { None, )); - let mut service = MithrilEpochService::new(stake_store, protocol_initializer_store); + let mut service = MithrilEpochService::new( + stake_store, + protocol_initializer_store, + TestLogger::stdout(), + ); let epoch_settings = SignerEpochSettings { epoch, ..SignerEpochSettings::dummy().clone() @@ -816,6 +860,7 @@ mod tests { let epoch_service = Arc::new(RwLock::new(MithrilEpochService::new( stake_store, protocol_initializer_store, + TestLogger::stdout(), ))); let config_provider = SignerSignedEntityConfigProvider { cardano_network: fake_data::network(), diff --git a/mithril-signer/src/services/single_signer.rs b/mithril-signer/src/services/single_signer.rs index f28521f0fca..eddac2790f7 100644 --- a/mithril-signer/src/services/single_signer.rs +++ b/mithril-signer/src/services/single_signer.rs @@ -1,7 +1,7 @@ use anyhow::{anyhow, Context}; use async_trait::async_trait; use hex::ToHex; -use slog_scope::{info, trace, warn}; +use slog::{info, trace, warn, Logger}; use std::path::PathBuf; use thiserror::Error; @@ -9,6 +9,7 @@ use mithril_common::crypto_helper::{KESPeriod, ProtocolInitializer}; use mithril_common::entities::{ PartyId, ProtocolMessage, ProtocolParameters, SingleSignatures, Stake, }; +use mithril_common::logging::LoggerExtensions; use mithril_common::protocol::{SignerBuilder, SingleSigner as ProtocolSingleSigner}; use mithril_common::{StdError, StdResult}; @@ -72,14 +73,16 @@ pub enum SingleSignerError { pub struct MithrilSingleSigner { party_id: PartyId, epoch_service: EpochServiceWrapper, + logger: Logger, } impl MithrilSingleSigner { /// Create a new instance of the MithrilSingleSigner. - pub fn new(party_id: PartyId, epoch_service: EpochServiceWrapper) -> Self { + pub fn new(party_id: PartyId, epoch_service: EpochServiceWrapper, logger: Logger) -> Self { Self { party_id, epoch_service, + logger: logger.new_with_component_name::(), } } @@ -123,7 +126,11 @@ impl SingleSigner for MithrilSingleSigner { ) -> StdResult> { let protocol_single_signer = self.build_protocol_single_signer().await?; - info!("Signing protocol message"; "protocol_message" => #?protocol_message, "signed message" => protocol_message.compute_hash().encode_hex::()); + info!( + self.logger, "Signing protocol message"; + "protocol_message" => #?protocol_message, + "signed message" => protocol_message.compute_hash().encode_hex::() + ); let signatures = protocol_single_signer .sign(protocol_message) .with_context(|| { @@ -137,13 +144,17 @@ impl SingleSigner for MithrilSingleSigner { match &signatures { Some(signature) => { trace!( + self.logger, "Party #{}: lottery #{:?} won", signature.party_id, &signature.won_indexes ); } None => { - warn!("no signature computed, all lotteries were lost"); + warn!( + self.logger, + "no signature computed, all lotteries were lost" + ); } }; @@ -169,6 +180,7 @@ mod tests { use crate::services::MithrilEpochService; use crate::store::ProtocolInitializerStore; + use crate::test_tools::TestLogger; use super::*; @@ -179,6 +191,7 @@ mod tests { let current_signer = &fixture.signers_fixture()[0]; let clerk = ProtocolClerk::from_signer(¤t_signer.protocol_signer); let avk = clerk.compute_avk(); + let logger = TestLogger::stdout(); let stake_store = Arc::new(StakeStore::new( Box::new( MemoryAdapter::new(Some(vec![( @@ -193,16 +206,18 @@ mod tests { Box::new(DumbStoreAdapter::new()), None, )); - let epoch_service = MithrilEpochService::new(stake_store, protocol_initializer_store) - .set_data_to_default_or_fake(Epoch(10)) - .alter_data(|data| { - data.protocol_initializer = Some(current_signer.protocol_initializer.clone()); - data.current_signers = fixture.signers(); - }); + let epoch_service = + MithrilEpochService::new(stake_store, protocol_initializer_store, logger.clone()) + .set_data_to_default_or_fake(Epoch(10)) + .alter_data(|data| { + data.protocol_initializer = Some(current_signer.protocol_initializer.clone()); + data.current_signers = fixture.signers(); + }); let single_signer = MithrilSingleSigner::new( current_signer.party_id(), Arc::new(RwLock::new(epoch_service)), + logger, ); let mut protocol_message = ProtocolMessage::new(); diff --git a/mithril-signer/src/services/upkeep_service.rs b/mithril-signer/src/services/upkeep_service.rs index 1055ee59abd..2cf3a82599f 100644 --- a/mithril-signer/src/services/upkeep_service.rs +++ b/mithril-signer/src/services/upkeep_service.rs @@ -12,6 +12,7 @@ use async_trait::async_trait; use slog::{info, Logger}; use mithril_common::entities::Epoch; +use mithril_common::logging::LoggerExtensions; use mithril_common::signed_entity_type_lock::SignedEntityTypeLock; use mithril_common::StdResult; use mithril_persistence::sqlite::{ @@ -63,7 +64,7 @@ impl SignerUpkeepService { cardano_tx_connection_pool, signed_entity_type_lock, pruning_tasks, - logger, + logger: logger.new_with_component_name::(), } } diff --git a/mithril-signer/tests/test_extensions/state_machine_tester.rs b/mithril-signer/tests/test_extensions/state_machine_tester.rs index c4987ea8e69..fca6e280467 100644 --- a/mithril-signer/tests/test_extensions/state_machine_tester.rs +++ b/mithril-signer/tests/test_extensions/state_machine_tester.rs @@ -97,6 +97,13 @@ impl Debug for StateMachineTester { } } +fn stdout_logger() -> slog::Logger { + let decorator = slog_term::PlainDecorator::new(slog_term::TestStdoutWriter); + let drain = slog_term::CompactFormat::new(decorator).build().fuse(); + let drain = slog_async::Async::new(drain).build().fuse(); + slog::Logger::root(Arc::new(drain), slog::o!()) +} + impl StateMachineTester { pub async fn init( signers_with_stake: &[SignerWithStake], @@ -109,7 +116,10 @@ impl StateMachineTester { let config = Configuration::new_sample(&selected_signer_party_id); let network = config.get_network()?; - let dependencies_builder = DependenciesBuilder::new(&config); + let logger = stdout_logger(); + let logs_guard = slog_scope::set_global_logger(logger.clone()); + + let dependencies_builder = DependenciesBuilder::new(&config, logger.clone()); let sqlite_connection = Arc::new( dependencies_builder .build_sqlite_connection( @@ -130,12 +140,6 @@ impl StateMachineTester { SqliteConnectionPool::build_from_connection(transaction_sqlite_connection), ); - let decorator = slog_term::PlainDecorator::new(slog_term::TestStdoutWriter); - let drain = slog_term::CompactFormat::new(decorator).build().fuse(); - let drain = slog_async::Async::new(drain).build().fuse(); - let logs_guard = - slog_scope::set_global_logger(slog::Logger::root(Arc::new(drain), slog::o!())); - let immutable_observer = Arc::new(DumbImmutableFileObserver::new()); immutable_observer.shall_return(Some(1)).await; @@ -189,7 +193,7 @@ impl StateMachineTester { Arc::new(CardanoImmutableFilesFullSignableBuilder::new( digester.clone(), Path::new(""), - slog_scope::logger(), + logger.clone(), )); let mithril_stake_distribution_signable_builder = Arc::new(MithrilStakeDistributionSignableBuilder::default()); @@ -200,7 +204,7 @@ impl StateMachineTester { let transactions_importer = Arc::new(CardanoTransactionsImporter::new( block_scanner.clone(), transaction_store.clone(), - slog_scope::logger(), + logger.clone(), )); let block_range_root_retriever = transaction_store.clone(); let cardano_transactions_builder = Arc::new(CardanoTransactionsSignableBuilder::< @@ -208,7 +212,7 @@ impl StateMachineTester { >::new( transactions_importer.clone(), block_range_root_retriever, - slog_scope::logger(), + logger.clone(), )); let cardano_stake_distribution_builder = Arc::new( CardanoStakeDistributionSignableBuilder::new(stake_store.clone()), @@ -216,10 +220,12 @@ impl StateMachineTester { let epoch_service = Arc::new(RwLock::new(MithrilEpochService::new( stake_store.clone(), protocol_initializer_store.clone(), + logger.clone(), ))); let single_signer = Arc::new(MithrilSingleSigner::new( config.party_id.to_owned().unwrap_or_default(), epoch_service.clone(), + logger.clone(), )); let signable_seed_builder_service = Arc::new(SignerSignableSeedBuilder::new( epoch_service.clone(), @@ -233,8 +239,8 @@ impl StateMachineTester { cardano_transactions_builder, cardano_stake_distribution_builder, )); - let metrics_service = Arc::new(MetricsService::new().unwrap()); - let expected_metrics_service = Arc::new(MetricsService::new().unwrap()); + let metrics_service = Arc::new(MetricsService::new(logger.clone()).unwrap()); + let expected_metrics_service = Arc::new(MetricsService::new(logger.clone()).unwrap()); let signed_entity_type_lock = Arc::new(SignedEntityTypeLock::default()); let security_parameter = BlockNumber(0); let cardano_transactions_preloader = Arc::new(CardanoTransactionsPreloader::new( @@ -242,7 +248,7 @@ impl StateMachineTester { transactions_importer.clone(), security_parameter, chain_observer.clone(), - slog_scope::logger(), + logger.clone(), Arc::new(CardanoTransactionsPreloaderActivation::new(true)), )); let upkeep_service = Arc::new(SignerUpkeepService::new( @@ -250,7 +256,7 @@ impl StateMachineTester { sqlite_connection_cardano_transaction_pool, signed_entity_type_lock.clone(), vec![], - slog_scope::logger(), + logger.clone(), )); let signed_beacon_repository = Arc::new(SignedBeaconRepository::new(sqlite_connection.clone(), None)); @@ -264,6 +270,7 @@ impl StateMachineTester { signed_entity_type_lock.clone(), single_signer.clone(), certificate_handler.clone(), + logger.clone(), )); let services = SignerDependencyContainer { @@ -290,13 +297,14 @@ impl StateMachineTester { .set_signers(signers_with_stake.to_owned()) .await; - let runner = Box::new(SignerRunner::new(config, services)); + let runner = Box::new(SignerRunner::new(config, services, logger.clone())); let state_machine = StateMachine::new( SignerState::Init, runner, Duration::from_secs(5), metrics_service.clone(), + logger.clone(), ); Ok(StateMachineTester { From 5df73184dc77c8e4404fef55528b91bb01fb3878 Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Tue, 8 Oct 2024 17:16:27 +0200 Subject: [PATCH 235/274] style: remove prefixes used in signer logs Since now each logs are tagged with their source component. --- mithril-signer/src/metrics/server.rs | 6 ++--- mithril-signer/src/metrics/service.rs | 22 ++++++++++++------- mithril-signer/src/runtime/runner.rs | 20 ++++++++--------- mithril-signer/src/runtime/state_machine.rs | 4 ++-- .../importer/importer_by_chunk.rs | 2 +- .../cardano_transactions/importer/service.rs | 10 +++++---- mithril-signer/src/services/epoch_service.rs | 7 ++---- mithril-signer/src/services/upkeep_service.rs | 15 +++++-------- 8 files changed, 44 insertions(+), 42 deletions(-) diff --git a/mithril-signer/src/metrics/server.rs b/mithril-signer/src/metrics/server.rs index 71d00ed1a4c..9365b49ddd8 100644 --- a/mithril-signer/src/metrics/server.rs +++ b/mithril-signer/src/metrics/server.rs @@ -71,7 +71,7 @@ impl MetricsServer { pub async fn start(&self, shutdown_rx: Receiver<()>) -> StdResult<()> { info!( self.logger, - "MetricsServer: starting HTTP server for metrics on port {}", self.server_port + "starting HTTP server for metrics on port {}", self.server_port ); let router_state = Arc::new(RouterState { @@ -83,7 +83,7 @@ impl MetricsServer { "/metrics", get(|State(state): State>| async move { state.metrics_service.export_metrics().map_err(|e| { - error!(state.logger, "MetricsServer: error exporting metrics"; "error" => ?e); + error!(state.logger, "error exporting metrics"; "error" => ?e); MetricsServerError::Internal(e) }) }), @@ -99,7 +99,7 @@ impl MetricsServer { shutdown_rx.await.ok(); warn!( serve_logger, - "MetricsServer: shutting down HTTP server after receiving signal" + "shutting down HTTP server after receiving signal" ); }) .await?; diff --git a/mithril-signer/src/metrics/service.rs b/mithril-signer/src/metrics/service.rs index c87b5ec10ae..2c281e99d6d 100644 --- a/mithril-signer/src/metrics/service.rs +++ b/mithril-signer/src/metrics/service.rs @@ -145,7 +145,7 @@ impl MetricsService { pub fn signer_registration_success_since_startup_counter_increment(&self) { debug!( self.logger, - "MetricsService: incrementing 'signer_registration_success_since_startup' counter" + "incrementing 'signer_registration_success_since_startup' counter" ); self.signer_registration_success_since_startup_counter.inc(); } @@ -161,7 +161,7 @@ impl MetricsService { pub fn signer_registration_total_since_startup_counter_increment(&self) { debug!( self.logger, - "MetricsService: incrementing 'signer_registration_total_since_startup' counter" + "incrementing 'signer_registration_total_since_startup' counter" ); self.signer_registration_total_since_startup_counter.inc(); } @@ -175,7 +175,10 @@ impl MetricsService { /// Set the `signer_registration_success_last_epoch` gauge value. pub fn signer_registration_success_last_epoch_gauge_set(&self, value: Epoch) { - debug!(self.logger, "MetricsService: set 'signer_registration_success_last_epoch_set' gauge value to {value}"); + debug!( + self.logger, + "set 'signer_registration_success_last_epoch_set' gauge value to {value}" + ); self.signer_registration_success_last_epoch_gauge .set(value.0 as f64); } @@ -193,7 +196,7 @@ impl MetricsService { pub fn signature_registration_success_since_startup_counter_increment(&self) { debug!( self.logger, - "MetricsService: incrementing 'signature_registration_success_since_startup' counter" + "incrementing 'signature_registration_success_since_startup' counter" ); self.signature_registration_success_since_startup_counter .inc(); @@ -210,7 +213,7 @@ impl MetricsService { pub fn signature_registration_total_since_startup_counter_increment(&self) { debug!( self.logger, - "MetricsService: incrementing 'signature_registration_total_since_startup' counter" + "incrementing 'signature_registration_total_since_startup' counter" ); self.signature_registration_total_since_startup_counter .inc(); @@ -225,7 +228,10 @@ impl MetricsService { /// Set the `signature_registration_success_last_epoch` gauge value. pub fn signature_registration_success_last_epoch_gauge_set(&self, value: Epoch) { - debug!(self.logger, "MetricsService: set 'signature_registration_success_last_epoch_set' gauge value to {value}"); + debug!( + self.logger, + "set 'signature_registration_success_last_epoch_set' gauge value to {value}" + ); self.signature_registration_success_last_epoch_gauge .set(value.0 as f64); } @@ -243,7 +249,7 @@ impl MetricsService { pub fn runtime_cycle_total_since_startup_counter_increment(&self) { debug!( self.logger, - "MetricsService: incrementing 'runtime_cycle_total_since_startup' counter" + "incrementing 'runtime_cycle_total_since_startup' counter" ); self.runtime_cycle_total_since_startup_counter.inc(); } @@ -257,7 +263,7 @@ impl MetricsService { pub fn runtime_cycle_success_since_startup_counter_increment(&self) { debug!( self.logger, - "MetricsService: incrementing 'runtime_cycle_success_since_startup' counter" + "incrementing 'runtime_cycle_success_since_startup' counter" ); self.runtime_cycle_success_since_startup_counter.inc(); } diff --git a/mithril-signer/src/runtime/runner.rs b/mithril-signer/src/runtime/runner.rs index 9452a4e4e48..1c3e2946493 100644 --- a/mithril-signer/src/runtime/runner.rs +++ b/mithril-signer/src/runtime/runner.rs @@ -104,7 +104,7 @@ impl SignerRunner { #[async_trait] impl Runner for SignerRunner { async fn get_epoch_settings(&self) -> StdResult> { - debug!(self.logger, "RUNNER: get_epoch_settings"); + debug!(self.logger, "get_epoch_settings"); self.services .certificate_handler @@ -114,13 +114,13 @@ impl Runner for SignerRunner { } async fn get_beacon_to_sign(&self) -> StdResult> { - debug!(self.logger, "RUNNER: get_beacon_to_sign"); + debug!(self.logger, "get_beacon_to_sign"); self.services.certifier.get_beacon_to_sign().await } async fn get_current_time_point(&self) -> StdResult { - debug!(self.logger, "RUNNER: get_current_time_point"); + debug!(self.logger, "get_current_time_point"); self.services .ticker_service @@ -130,7 +130,7 @@ impl Runner for SignerRunner { } async fn register_signer_to_aggregator(&self) -> StdResult<()> { - debug!(self.logger, "RUNNER: register_signer_to_aggregator"); + debug!(self.logger, "register_signer_to_aggregator"); let (epoch, protocol_parameters) = { let epoch_service = self.services.epoch_service.read().await; @@ -206,7 +206,7 @@ impl Runner for SignerRunner { } async fn update_stake_distribution(&self, epoch: Epoch) -> StdResult<()> { - debug!(self.logger, "RUNNER: update_stake_distribution"); + debug!(self.logger, "update_stake_distribution"); let exists_stake_distribution = !self .services @@ -239,7 +239,7 @@ impl Runner for SignerRunner { } async fn inform_epoch_settings(&self, epoch_settings: SignerEpochSettings) -> StdResult<()> { - debug!(self.logger, "RUNNER: register_epoch"); + debug!(self.logger, "register_epoch"); let aggregator_features = self .services .certificate_handler @@ -261,7 +261,7 @@ impl Runner for SignerRunner { &self, signed_entity_type: &SignedEntityType, ) -> StdResult { - debug!(self.logger, "RUNNER: compute_message"); + debug!(self.logger, "compute_message"); let protocol_message = self .services @@ -278,7 +278,7 @@ impl Runner for SignerRunner { beacon_to_sign: &BeaconToSign, message: &ProtocolMessage, ) -> StdResult<()> { - debug!(self.logger, "RUNNER: compute_publish_single_signature"); + debug!(self.logger, "compute_publish_single_signature"); self.services .certifier .compute_publish_single_signature(beacon_to_sign, message) @@ -286,7 +286,7 @@ impl Runner for SignerRunner { } async fn update_era_checker(&self, epoch: Epoch) -> StdResult<()> { - debug!(self.logger, "RUNNER: update_era_checker"); + debug!(self.logger, "update_era_checker"); let era_token = self .services @@ -314,7 +314,7 @@ impl Runner for SignerRunner { } async fn upkeep(&self, current_epoch: Epoch) -> StdResult<()> { - debug!(self.logger, "RUNNER: upkeep"); + debug!(self.logger, "upkeep"); self.services.upkeep_service.run(current_epoch).await?; Ok(()) } diff --git a/mithril-signer/src/runtime/state_machine.rs b/mithril-signer/src/runtime/state_machine.rs index 52d10ee2baf..3e43b1f7a52 100644 --- a/mithril-signer/src/runtime/state_machine.rs +++ b/mithril-signer/src/runtime/state_machine.rs @@ -109,7 +109,7 @@ impl StateMachine { /// Launch the state machine until an error occurs or it is interrupted. pub async fn run(&self) -> Result<(), RuntimeError> { - info!(self.logger, "STATE MACHINE: launching"); + info!(self.logger, "launching"); loop { if let Err(e) = self.cycle().await { @@ -138,7 +138,7 @@ impl StateMachine { self.logger, "================================================================================" ); - info!(self.logger, "STATE MACHINE: new cycle: {}", *state); + info!(self.logger, "new cycle: {}", *state); self.metrics_service .runtime_cycle_total_since_startup_counter_increment(); diff --git a/mithril-signer/src/services/cardano_transactions/importer/importer_by_chunk.rs b/mithril-signer/src/services/cardano_transactions/importer/importer_by_chunk.rs index 3cce53ef00e..34f29cab473 100644 --- a/mithril-signer/src/services/cardano_transactions/importer/importer_by_chunk.rs +++ b/mithril-signer/src/services/cardano_transactions/importer/importer_by_chunk.rs @@ -54,7 +54,7 @@ impl TransactionsImporter for TransactionsImporterByChunk { let next_up_to = (intermediate_up_to + self.chunk_size).min(up_to_beacon); debug!( self.logger, - "Running Transactions importer between block '{intermediate_up_to}' and '{next_up_to}'"; + "Running Transactions import between block '{intermediate_up_to}' and '{next_up_to}'"; ); self.wrapped_importer.import(next_up_to).await?; intermediate_up_to = next_up_to; diff --git a/mithril-signer/src/services/cardano_transactions/importer/service.rs b/mithril-signer/src/services/cardano_transactions/importer/service.rs index 70d6769346e..6dad6d96bd5 100644 --- a/mithril-signer/src/services/cardano_transactions/importer/service.rs +++ b/mithril-signer/src/services/cardano_transactions/importer/service.rs @@ -87,14 +87,16 @@ impl CardanoTransactionsImporter { if from.as_ref().is_some_and(|f| f.block_number >= until) { debug!( self.logger, - "TransactionsImporter does not need to retrieve Cardano transactions, the database is up to date for block_number '{until}'", + "Does not need to retrieve Cardano transactions, the database is up to date for block_number '{until}'", ); return Ok(()); } debug!( self.logger, - "TransactionsImporter will retrieve Cardano transactions between block_number '{}' and '{until}'", - from.as_ref().map(|c|c.block_number).unwrap_or(BlockNumber(0)) + "Will retrieve Cardano transactions between block_number '{}' and '{until}'", + from.as_ref() + .map(|c| c.block_number) + .unwrap_or(BlockNumber(0)) ); let mut streamer = self.block_scanner.scan(from, until).await?; @@ -138,7 +140,7 @@ impl CardanoTransactionsImporter { }; debug!( - self.logger, "TransactionsImporter - computing Block Range Roots"; + self.logger, "Computing Block Range Roots"; "start_block" => *block_ranges.start(), "end_block" => *block_ranges.end(), ); diff --git a/mithril-signer/src/services/epoch_service.rs b/mithril-signer/src/services/epoch_service.rs index 493987c6a6d..1a81a0beaf0 100644 --- a/mithril-signer/src/services/epoch_service.rs +++ b/mithril-signer/src/services/epoch_service.rs @@ -118,7 +118,7 @@ impl MithrilEpochService { epoch: Epoch, signers: &[Signer], ) -> StdResult> { - debug!(self.logger, "EpochService: associate_signers_with_stake"); + debug!(self.logger, "associate_signers_with_stake"); let stakes = self .stake_storer @@ -177,10 +177,7 @@ impl EpochService for MithrilEpochService { epoch_settings: SignerEpochSettings, allowed_discriminants: BTreeSet, ) -> StdResult<()> { - debug!( - self.logger, - "EpochService: register_epoch_settings: {:?}", epoch_settings - ); + debug!(self.logger, "register_epoch_settings: {:?}", epoch_settings); let epoch = epoch_settings.epoch; let protocol_initializer = self diff --git a/mithril-signer/src/services/upkeep_service.rs b/mithril-signer/src/services/upkeep_service.rs index 2cf3a82599f..b25543e0d6b 100644 --- a/mithril-signer/src/services/upkeep_service.rs +++ b/mithril-signer/src/services/upkeep_service.rs @@ -71,7 +71,7 @@ impl SignerUpkeepService { async fn execute_pruning_tasks(&self, current_epoch: Epoch) -> StdResult<()> { for task in &self.pruning_tasks { info!( - self.logger, "UpkeepService::Pruning stale data"; + self.logger, "Pruning stale data"; "pruned_data" => task.pruned_data(), "current_epoch" => ?current_epoch ); task.prune(current_epoch).await?; @@ -84,7 +84,7 @@ impl SignerUpkeepService { if self.signed_entity_type_lock.has_locked_entities().await { info!( self.logger, - "UpkeepService::Some entities are locked - Skipping database upkeep" + "Some entities are locked - Skipping database upkeep" ); return Ok(()); } @@ -95,7 +95,7 @@ impl SignerUpkeepService { // Run the database upkeep tasks in another thread to avoid blocking the tokio runtime let db_upkeep_thread = tokio::task::spawn_blocking(move || -> StdResult<()> { - info!(db_upkeep_logger, "UpkeepService::Cleaning main database"); + info!(db_upkeep_logger, "Cleaning main database"); SqliteCleaner::new(&main_db_connection) .with_logger(db_upkeep_logger.clone()) .with_tasks(&[ @@ -104,10 +104,7 @@ impl SignerUpkeepService { ]) .run()?; - info!( - db_upkeep_logger, - "UpkeepService::Cleaning cardano transactions database" - ); + info!(db_upkeep_logger, "Cleaning cardano transactions database"); let cardano_tx_db_connection = cardano_tx_db_connection_pool.connection()?; SqliteCleaner::new(&cardano_tx_db_connection) .with_logger(db_upkeep_logger.clone()) @@ -126,7 +123,7 @@ impl SignerUpkeepService { #[async_trait] impl UpkeepService for SignerUpkeepService { async fn run(&self, current_epoch: Epoch) -> StdResult<()> { - info!(self.logger, "UpkeepService::start"); + info!(self.logger, "start upkeep of the application"); self.execute_pruning_tasks(current_epoch) .await @@ -136,7 +133,7 @@ impl UpkeepService for SignerUpkeepService { .await .with_context(|| "Database upkeep failed")?; - info!(self.logger, "UpkeepService::end"); + info!(self.logger, "upkeep finished"); Ok(()) } } From cae10c30781630401701526b7ed2642d3af41895 Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Tue, 8 Oct 2024 17:58:40 +0200 Subject: [PATCH 236/274] refactor: add component name for loggers used in `mithril-persistence` + add some logs in the connection builder + remove unneeded 'slog-*' dependencies --- Cargo.lock | 3 --- internal/mithril-persistence/Cargo.toml | 3 --- .../src/database/version_checker.rs | 20 ++++++++++++------- .../mithril-persistence/src/sqlite/cleaner.rs | 7 ++++--- .../src/sqlite/connection_builder.rs | 18 ++++++++++++----- 5 files changed, 30 insertions(+), 21 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6a85656610a..3f7a6896395 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3669,9 +3669,6 @@ dependencies = [ "serde_json", "sha2", "slog", - "slog-async", - "slog-scope", - "slog-term", "sqlite", "thiserror", "tokio", diff --git a/internal/mithril-persistence/Cargo.toml b/internal/mithril-persistence/Cargo.toml index 8815531ad7b..b086e67baaa 100644 --- a/internal/mithril-persistence/Cargo.toml +++ b/internal/mithril-persistence/Cargo.toml @@ -29,7 +29,4 @@ tokio = { version = "1.40.0", features = ["sync"] } [dev-dependencies] mithril-common = { path = "../../mithril-common", features = ["test_tools"] } mockall = "0.13.0" -slog-async = "2.8.0" -slog-scope = "4.4.0" -slog-term = "2.9.1" tokio = { version = "1.40.0", features = ["macros", "time"] } diff --git a/internal/mithril-persistence/src/database/version_checker.rs b/internal/mithril-persistence/src/database/version_checker.rs index e8efef174da..092d4d7ec88 100644 --- a/internal/mithril-persistence/src/database/version_checker.rs +++ b/internal/mithril-persistence/src/database/version_checker.rs @@ -1,9 +1,11 @@ use anyhow::{anyhow, Context}; use chrono::Utc; -use mithril_common::StdResult; use slog::{debug, error, info, Logger}; use std::{cmp::Ordering, collections::BTreeSet}; +use mithril_common::logging::LoggerExtensions; +use mithril_common::StdResult; + use super::{ ApplicationNodeType, DatabaseVersion, DbVersion, GetDatabaseVersionQuery, UpdateDatabaseVersionQuery, @@ -38,7 +40,7 @@ impl<'conn> DatabaseVersionChecker<'conn> { Self { connection, application_type, - logger, + logger: logger.new_with_component_name::(), migrations, } } @@ -203,6 +205,10 @@ mod tests { use super::*; + fn discard_logger() -> Logger { + Logger::root(slog::Discard, slog::o!()) + } + fn check_database_version(connection: &SqliteConnection, db_version: DbVersion) { let version = connection .fetch_first(GetDatabaseVersionQuery::get_application_version( @@ -243,7 +249,7 @@ mod tests { let (_filepath, connection) = create_sqlite_file("test_upgrade_with_migration.sqlite3").unwrap(); let mut db_checker = DatabaseVersionChecker::new( - slog_scope::logger(), + discard_logger(), ApplicationNodeType::Aggregator, &connection, ); @@ -302,7 +308,7 @@ mod tests { fn starting_with_migration() { let (_filepath, connection) = create_sqlite_file("starting_with_migration").unwrap(); let mut db_checker = DatabaseVersionChecker::new( - slog_scope::logger(), + discard_logger(), ApplicationNodeType::Aggregator, &connection, ); @@ -325,7 +331,7 @@ mod tests { fn test_failing_migration() { let (_filepath, connection) = create_sqlite_file("test_failing_migration").unwrap(); let mut db_checker = DatabaseVersionChecker::new( - slog_scope::logger(), + discard_logger(), ApplicationNodeType::Aggregator, &connection, ); @@ -356,7 +362,7 @@ mod tests { fn test_fail_downgrading() { let (_filepath, connection) = create_sqlite_file("test_fail_downgrading").unwrap(); let mut db_checker = DatabaseVersionChecker::new( - slog_scope::logger(), + discard_logger(), ApplicationNodeType::Aggregator, &connection, ); @@ -371,7 +377,7 @@ mod tests { // re instantiate a new checker with no migration registered (version 0). let db_checker = DatabaseVersionChecker::new( - slog_scope::logger(), + discard_logger(), ApplicationNodeType::Aggregator, &connection, ); diff --git a/internal/mithril-persistence/src/sqlite/cleaner.rs b/internal/mithril-persistence/src/sqlite/cleaner.rs index 841023539d8..e57296bec7c 100644 --- a/internal/mithril-persistence/src/sqlite/cleaner.rs +++ b/internal/mithril-persistence/src/sqlite/cleaner.rs @@ -1,5 +1,6 @@ use slog::{debug, Logger}; +use mithril_common::logging::LoggerExtensions; use mithril_common::StdResult; use crate::sqlite::SqliteConnection; @@ -24,9 +25,9 @@ impl SqliteCleaningTask { /// Get the log message for the task. pub fn log_message(self: SqliteCleaningTask) -> &'static str { match self { - SqliteCleaningTask::Vacuum => "SqliteCleaner::Running `vacuum` on the database", + SqliteCleaningTask::Vacuum => "Running `vacuum` on the SQLite database", SqliteCleaningTask::WalCheckpointTruncate => { - "SqliteCleaner::Running `wal_checkpoint(TRUNCATE)` on the database" + "Running `wal_checkpoint(TRUNCATE)` on the SQLite database" } } } @@ -52,7 +53,7 @@ impl<'a> SqliteCleaner<'a> { /// Set the logger to be used by the cleaner. pub fn with_logger(mut self, logger: Logger) -> Self { - self.logger = logger; + self.logger = logger.new_with_component_name::(); self } diff --git a/internal/mithril-persistence/src/sqlite/connection_builder.rs b/internal/mithril-persistence/src/sqlite/connection_builder.rs index 63039700513..207029e29d6 100644 --- a/internal/mithril-persistence/src/sqlite/connection_builder.rs +++ b/internal/mithril-persistence/src/sqlite/connection_builder.rs @@ -2,9 +2,10 @@ use std::ops::Not; use std::path::{Path, PathBuf}; use anyhow::Context; -use slog::Logger; +use slog::{debug, Logger}; use sqlite::{Connection, ConnectionThreadSafe}; +use mithril_common::logging::LoggerExtensions; use mithril_common::StdResult; use crate::database::{ApplicationNodeType, DatabaseVersionChecker, SqlMigration}; @@ -15,7 +16,7 @@ pub struct ConnectionBuilder { sql_migrations: Vec, options: Vec, node_type: ApplicationNodeType, - logger: Logger, + base_logger: Logger, } /// Options to apply to the connection @@ -41,7 +42,7 @@ impl ConnectionBuilder { sql_migrations: vec![], options: vec![], node_type: ApplicationNodeType::Signer, - logger: Logger::root(slog::Discard, slog::o!()), + base_logger: Logger::root(slog::Discard, slog::o!()), } } @@ -66,7 +67,7 @@ impl ConnectionBuilder { /// Set the logger to log to at build time pub fn with_logger(mut self, logger: Logger) -> Self { - self.logger = logger; + self.base_logger = logger; self } @@ -78,6 +79,9 @@ impl ConnectionBuilder { /// Build a connection based on the builder configuration pub fn build(self) -> StdResult { + let logger = self.base_logger.new_with_component_name::(); + + debug!(logger, "Opening SQLite connection"; "path" => self.connection_path.display()); let connection = Connection::open_thread_safe(&self.connection_path).with_context(|| { format!( @@ -90,12 +94,14 @@ impl ConnectionBuilder { .options .contains(&ConnectionOptions::EnableWriteAheadLog) { + debug!(logger, "Enabling SQLite Write Ahead Log journal mode"); connection .execute("pragma journal_mode = wal; pragma synchronous = normal;") .with_context(|| "SQLite initialization: could not enable WAL.")?; } if self.options.contains(&ConnectionOptions::EnableForeignKeys) { + debug!(logger, "Enabling SQLite foreign key support"); connection .execute("pragma foreign_keys=true") .with_context(|| "SQLite initialization: could not enable FOREIGN KEY support.")?; @@ -103,8 +109,9 @@ impl ConnectionBuilder { if self.sql_migrations.is_empty().not() { // Check database migrations + debug!(logger, "Applying database migrations"); let mut db_checker = - DatabaseVersionChecker::new(self.logger, self.node_type, &connection); + DatabaseVersionChecker::new(self.base_logger, self.node_type, &connection); for migration in self.sql_migrations { db_checker.add_migration(migration); @@ -119,6 +126,7 @@ impl ConnectionBuilder { .options .contains(&ConnectionOptions::ForceDisableForeignKeys) { + debug!(logger, "Force disabling SQLite foreign key support"); connection .execute("pragma foreign_keys=false") .with_context(|| "SQLite initialization: could not disable FOREIGN KEY support.")?; From 157d986e92febc5859035df8b01769d2e3dc382b Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Tue, 8 Oct 2024 18:00:02 +0200 Subject: [PATCH 237/274] style: set application name in signer log to `mithril-signer` Instead of the default `slog-rs`. --- mithril-signer/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mithril-signer/src/main.rs b/mithril-signer/src/main.rs index 12e73aa7c72..bbef3d21272 100644 --- a/mithril-signer/src/main.rs +++ b/mithril-signer/src/main.rs @@ -103,7 +103,7 @@ impl Args { } fn build_logger(min_level: Level) -> Logger { - let drain = slog_bunyan::new(std::io::stdout()) + let drain = slog_bunyan::with_name("mithril-signer", std::io::stdout()) .set_pretty(false) .build() .fuse(); From 31819bf2c06abd77c04b5a0e2e264ba1da860369 Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Tue, 8 Oct 2024 19:32:14 +0200 Subject: [PATCH 238/274] refactor: move huge context data away from logs main msg And instead add them to a property. This allow to keep the main log messages leans while still providing detailed errors info. --- mithril-signer/src/main.rs | 7 +- mithril-signer/src/runtime/error.rs | 151 ++++++++++++++++--- mithril-signer/src/runtime/state_machine.rs | 7 +- mithril-signer/src/services/epoch_service.rs | 2 +- 4 files changed, 133 insertions(+), 34 deletions(-) diff --git a/mithril-signer/src/main.rs b/mithril-signer/src/main.rs index bbef3d21272..a129b2ca5e5 100644 --- a/mithril-signer/src/main.rs +++ b/mithril-signer/src/main.rs @@ -211,10 +211,7 @@ async fn main() -> StdResult<()> { loop { interval.tick().await; if let Err(err) = cardano_transaction_preloader.preload().await { - crit!( - preload_logger, - "🔥 Cardano transactions preloader failed: {err:?}" - ); + crit!(preload_logger, "🔥 Cardano transactions preloader failed"; "error" => ?err); } info!( preload_logger, @@ -267,7 +264,7 @@ async fn main() -> StdResult<()> { let shutdown_reason = match join_set.join_next().await { Some(Err(e)) => { - crit!(root_logger, "A critical error occurred: {e:?}"); + crit!(root_logger, "A critical error occurred"; "error" => ?e); None } Some(Ok(res)) => res?, diff --git a/mithril-signer/src/runtime/error.rs b/mithril-signer/src/runtime/error.rs index 1302be04a18..472915db217 100644 --- a/mithril-signer/src/runtime/error.rs +++ b/mithril-signer/src/runtime/error.rs @@ -1,3 +1,4 @@ +use slog::{crit, error, Logger}; use std::fmt::Display; use mithril_common::entities::EpochError; @@ -40,39 +41,37 @@ impl RuntimeError { } ) } + + /// Write the error to the given logger. + pub fn write_to_log(&self, logger: &Logger) { + match self { + Self::KeepState { nested_error, .. } => match nested_error { + None => error!(logger, "{self}"), + Some(err) => error!(logger, "{self}"; "nested_error" => ?err), + }, + Self::Critical { nested_error, .. } => match nested_error { + None => crit!(logger, "{self}"), + Some(err) => crit!(logger, "{self}"; "nested_error" => ?err), + }, + } + } } impl std::error::Error for RuntimeError {} impl Display for RuntimeError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { - Self::KeepState { - message, - nested_error, - } => { - let nested = if let Some(error) = nested_error { - format!("nested error = {error:?}") - } else { - String::new() - }; + Self::KeepState { message, .. } => { write!( - f, - "An error occurred, runtime state kept. message = '{message}'. {nested}" + formatter, + "An error occurred, runtime state kept. message = '{message}'" ) } - Self::Critical { - message, - nested_error, - } => { - let nested = if let Some(error) = nested_error { - format!("nested error = {error:?}") - } else { - String::new() - }; + Self::Critical { message, .. } => { write!( - f, - "A critical error occurred, aborting runtime. message = '{message}'. {nested}" + formatter, + "A critical error occurred, aborting runtime. message = '{message}'" ) } } @@ -96,3 +95,109 @@ impl From for RuntimeError { } } } + +#[cfg(test)] +mod tests { + use anyhow::anyhow; + use std::path::Path; + + use mithril_common::test_utils::TempDir; + + use crate::test_tools::TestLogger; + + use super::*; + + /// Separate function so the logger is dropped and flushed before the assertion. + fn write_log(log_file: &Path, error: &RuntimeError) { + let logger = TestLogger::file(log_file); + error.write_to_log(&logger); + } + + fn nested_error_debug_string(error: &RuntimeError) -> String { + let error = match error { + RuntimeError::KeepState { nested_error, .. } => nested_error, + RuntimeError::Critical { nested_error, .. } => nested_error, + }; + match error { + None => String::new(), + Some(err) => { + format!("{err:?}") + } + } + } + + #[test] + fn log_critical_without_nested_error() { + let log_file = TempDir::create("signer_runtime_error", "log_critical_without_nested_error") + .join("file.log"); + + let error = RuntimeError::Critical { + message: "Critical error".to_string(), + nested_error: None, + }; + write_log(&log_file, &error); + + let log_content = std::fs::read_to_string(&log_file).unwrap(); + assert!(log_content.contains(&format!("{error}"))); + assert!(!log_content.contains("nested_error")); + } + + #[test] + fn log_critical_with_nested_error() { + let log_file = TempDir::create("signer_runtime_error", "log_critical_with_nested_error") + .join("file.log"); + + let error = RuntimeError::Critical { + message: "Critical error".to_string(), + nested_error: Some( + anyhow!("Another context error") + .context("Context error") + .context("Critical nested error"), + ), + }; + write_log(&log_file, &error); + + let log_content = std::fs::read_to_string(&log_file).unwrap(); + assert!(log_content.contains(&format!("{error}"))); + assert!(log_content.contains(&nested_error_debug_string(&error))); + } + + #[test] + fn log_keep_state_without_nested_error() { + let log_file = TempDir::create( + "signer_runtime_error", + "log_keep_state_without_nested_error", + ) + .join("file.log"); + + let error = RuntimeError::KeepState { + message: "KeepState error".to_string(), + nested_error: None, + }; + write_log(&log_file, &error); + + let log_content = std::fs::read_to_string(&log_file).unwrap(); + assert!(log_content.contains(&format!("{error}"))); + assert!(!log_content.contains("nested_error")); + } + + #[test] + fn log_keep_state_with_nested_error() { + let log_file = TempDir::create("signer_runtime_error", "log_keep_state_with_nested_error") + .join("file.log"); + + let error = RuntimeError::KeepState { + message: "KeepState error".to_string(), + nested_error: Some( + anyhow!("Another context error") + .context("Context error") + .context("KeepState nested error"), + ), + }; + write_log(&log_file, &error); + + let log_content = std::fs::read_to_string(&log_file).unwrap(); + assert!(log_content.contains(&format!("{error}"))); + assert!(log_content.contains(&nested_error_debug_string(&error))); + } +} diff --git a/mithril-signer/src/runtime/state_machine.rs b/mithril-signer/src/runtime/state_machine.rs index 3e43b1f7a52..432614044de 100644 --- a/mithril-signer/src/runtime/state_machine.rs +++ b/mithril-signer/src/runtime/state_machine.rs @@ -1,4 +1,4 @@ -use slog::{crit, debug, error, info, Logger}; +use slog::{debug, info, Logger}; use std::{fmt::Display, ops::Deref, sync::Arc, time::Duration}; use tokio::{sync::Mutex, time::sleep}; @@ -113,12 +113,9 @@ impl StateMachine { loop { if let Err(e) = self.cycle().await { + e.write_to_log(&self.logger); if e.is_critical() { - crit!(self.logger, "{e}"); - return Err(e); - } else { - error!(self.logger, "{e}"); } } diff --git a/mithril-signer/src/services/epoch_service.rs b/mithril-signer/src/services/epoch_service.rs index 1a81a0beaf0..137551b5d5d 100644 --- a/mithril-signer/src/services/epoch_service.rs +++ b/mithril-signer/src/services/epoch_service.rs @@ -177,7 +177,7 @@ impl EpochService for MithrilEpochService { epoch_settings: SignerEpochSettings, allowed_discriminants: BTreeSet, ) -> StdResult<()> { - debug!(self.logger, "register_epoch_settings: {:?}", epoch_settings); + debug!(self.logger, "register_epoch_settings"; "epoch_settings" => ?epoch_settings); let epoch = epoch_settings.epoch; let protocol_initializer = self From dbecb222387719559a58c883d79ff83cd0a0a9ee Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Wed, 9 Oct 2024 10:36:45 +0200 Subject: [PATCH 239/274] refactor: standardize http errors handling in signer aggregator_client * Always include the status code text in the issued error, this should add more context when the response text is empty. * When the response contains json: try to parse ideally as a `ClientError` or `ServerError` to use their properties, if of an unknown type it will output all the json key/value pairs as a fallback. --- Cargo.lock | 1 + mithril-signer/Cargo.toml | 1 + .../src/services/aggregator_client.rs | 234 ++++++++++++++++-- 3 files changed, 212 insertions(+), 24 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3f7a6896395..db54ccd6a67 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3710,6 +3710,7 @@ dependencies = [ "config", "criterion", "hex", + "http 1.1.0", "httpmock", "mithril-common", "mithril-doc", diff --git a/mithril-signer/Cargo.toml b/mithril-signer/Cargo.toml index 3722c281b55..ce5d87bec05 100644 --- a/mithril-signer/Cargo.toml +++ b/mithril-signer/Cargo.toml @@ -47,6 +47,7 @@ tikv-jemallocator = { version = "0.6.0", optional = true } [dev-dependencies] criterion = { version = "0.5.1", features = ["html_reports", "async_tokio"] } +http = "1.1.0" httpmock = "0.7.0" mithril-common = { path = "../mithril-common" } mockall = "0.13.0" diff --git a/mithril-signer/src/services/aggregator_client.rs b/mithril-signer/src/services/aggregator_client.rs index 5018d48e12a..21f12476595 100644 --- a/mithril-signer/src/services/aggregator_client.rs +++ b/mithril-signer/src/services/aggregator_client.rs @@ -1,5 +1,6 @@ use anyhow::anyhow; use async_trait::async_trait; +use reqwest::header::{self, HeaderValue}; use reqwest::{self, Client, Proxy, RequestBuilder, Response, StatusCode}; use slog::{debug, Logger}; use std::{io, sync::Arc, time::Duration}; @@ -7,7 +8,10 @@ use thiserror::Error; use mithril_common::{ api_version::APIVersionProvider, - entities::{Epoch, ProtocolMessage, SignedEntityType, Signer, SingleSignatures}, + entities::{ + ClientError, Epoch, ProtocolMessage, ServerError, SignedEntityType, Signer, + SingleSignatures, + }, logging::LoggerExtensions, messages::{ AggregatorFeaturesMessage, EpochSettingsMessage, TryFromMessageAdapter, TryToMessageAdapter, @@ -21,6 +25,8 @@ use crate::message_adapters::{ }; use crate::services::SignaturePublisher; +const JSON_CONTENT_TYPE: HeaderValue = HeaderValue::from_static("application/json"); + /// Error structure for the Aggregator Client. #[derive(Error, Debug)] pub enum AggregatorClientError { @@ -36,6 +42,10 @@ pub enum AggregatorClientError { #[error("remote server unreachable")] RemoteServerUnreachable(#[source] StdError), + /// Unhandled status code + #[error("unhandled status code: {0}, response text: {1}")] + UnhandledStatusCode(StatusCode, String), + /// Could not parse response. #[error("json parsing failed")] JsonParseFailed(#[source] StdError), @@ -69,6 +79,62 @@ impl AggregatorClientError { } } +impl AggregatorClientError { + /// Create an `AggregatorClientError` from a response. + /// + /// This method is meant to be used after handling domain-specific cases leaving only + /// 4xx or 5xx status codes. + /// Otherwise, it will return an `UnhandledStatusCode` error. + pub async fn from_response(response: Response) -> Self { + let error_code = response.status(); + + if error_code.is_client_error() { + let root_cause = Self::get_root_cause(response).await; + Self::RemoteServerLogical(anyhow!(root_cause)) + } else if error_code.is_server_error() { + let root_cause = Self::get_root_cause(response).await; + Self::RemoteServerTechnical(anyhow!(root_cause)) + } else { + let response_text = response.text().await.unwrap_or_default(); + Self::UnhandledStatusCode(error_code, response_text) + } + } + + async fn get_root_cause(response: Response) -> String { + let error_code = response.status(); + let canonical_reason = error_code + .canonical_reason() + .unwrap_or_default() + .to_lowercase(); + let is_json = response + .headers() + .get(header::CONTENT_TYPE) + .is_some_and(|ct| JSON_CONTENT_TYPE == ct); + + if is_json { + let json_value: serde_json::Value = response.json().await.unwrap_or_default(); + + if let Ok(client_error) = serde_json::from_value::(json_value.clone()) { + format!( + "{}: {}: {}", + canonical_reason, client_error.label, client_error.message + ) + } else if let Ok(server_error) = + serde_json::from_value::(json_value.clone()) + { + format!("{}: {}", canonical_reason, server_error.message) + } else if json_value.is_null() { + canonical_reason.to_string() + } else { + format!("{}: {}", canonical_reason, json_value) + } + } else { + let response_text = response.text().await.unwrap_or_default(); + format!("{}: {}", canonical_reason, response_text) + } + } +} + /// Trait for mocking and testing a `AggregatorClient` #[cfg_attr(test, mockall::automock)] #[async_trait] @@ -216,10 +282,7 @@ impl AggregatorClient for AggregatorHTTPClient { Err(err) => Err(AggregatorClientError::JsonParseFailed(anyhow!(err))), }, StatusCode::PRECONDITION_FAILED => Err(self.handle_api_error(&response)), - _ => Err(AggregatorClientError::RemoteServerTechnical(anyhow!( - "{}", - response.text().await.unwrap_or_default() - ))), + _ => Err(AggregatorClientError::from_response(response).await), }, Err(err) => Err(AggregatorClientError::RemoteServerUnreachable(anyhow!(err))), } @@ -245,13 +308,7 @@ impl AggregatorClient for AggregatorHTTPClient { Ok(response) => match response.status() { StatusCode::CREATED => Ok(()), StatusCode::PRECONDITION_FAILED => Err(self.handle_api_error(&response)), - StatusCode::BAD_REQUEST => Err(AggregatorClientError::RemoteServerLogical( - anyhow!("bad request: {}", response.text().await.unwrap_or_default()), - )), - _ => Err(AggregatorClientError::RemoteServerTechnical(anyhow!( - "{}", - response.text().await.unwrap_or_default() - ))), + _ => Err(AggregatorClientError::from_response(response).await), }, Err(err) => Err(AggregatorClientError::RemoteServerUnreachable(anyhow!(err))), } @@ -285,16 +342,10 @@ impl AggregatorClient for AggregatorHTTPClient { Ok(()) } StatusCode::PRECONDITION_FAILED => Err(self.handle_api_error(&response)), - StatusCode::BAD_REQUEST => Err(AggregatorClientError::RemoteServerLogical( - anyhow!("bad request: {}", response.text().await.unwrap_or_default()), - )), StatusCode::CONFLICT => Err(AggregatorClientError::RemoteServerLogical(anyhow!( "already registered single signatures" ))), - _ => Err(AggregatorClientError::RemoteServerTechnical(anyhow!( - "{}", - response.text().await.unwrap_or_default() - ))), + _ => Err(AggregatorClientError::from_response(response).await), }, Err(err) => Err(AggregatorClientError::RemoteServerUnreachable(anyhow!(err))), } @@ -317,10 +368,7 @@ impl AggregatorClient for AggregatorHTTPClient { .await .map_err(|e| AggregatorClientError::JsonParseFailed(anyhow!(e)))?), StatusCode::PRECONDITION_FAILED => Err(self.handle_api_error(&response)), - _ => Err(AggregatorClientError::RemoteServerTechnical(anyhow!( - "{}", - response.text().await.unwrap_or_default() - ))), + _ => Err(AggregatorClientError::from_response(response).await), }, Err(err) => Err(AggregatorClientError::RemoteServerUnreachable(anyhow!(err))), } @@ -426,10 +474,11 @@ pub(crate) mod dumb { #[cfg(test)] mod tests { + use http::response::Builder as HttpResponseBuilder; use httpmock::prelude::*; use serde_json::json; - use mithril_common::entities::{ClientError, Epoch}; + use mithril_common::entities::Epoch; use mithril_common::era::{EraChecker, SupportedEra}; use mithril_common::messages::TryFromMessageAdapter; use mithril_common::test_utils::fake_data; @@ -494,6 +543,34 @@ mod tests { }); } + fn build_text_response>(status_code: StatusCode, body: T) -> Response { + HttpResponseBuilder::new() + .status(status_code) + .body(body.into()) + .unwrap() + .into() + } + + fn build_json_response(status_code: StatusCode, body: &T) -> Response { + HttpResponseBuilder::new() + .status(status_code) + .header(header::CONTENT_TYPE, JSON_CONTENT_TYPE) + .body(serde_json::to_string(&body).unwrap()) + .unwrap() + .into() + } + + macro_rules! assert_error_text_contains { + ($error: expr, $expect_contains: expr) => { + let error = &$error; + assert!( + error.contains($expect_contains), + "Expected error message to contain '{}'\ngot '{error:?}'", + $expect_contains, + ); + }; + } + #[tokio::test] async fn test_aggregator_features_ok_200() { let (server, client) = setup_server_and_client(); @@ -1001,4 +1078,113 @@ mod tests { "unexpected error type: {error:?}" ); } + + #[tokio::test] + async fn test_4xx_errors_are_handled_as_remote_server_logical() { + let response = build_text_response(StatusCode::BAD_REQUEST, "error text"); + let handled_error = AggregatorClientError::from_response(response).await; + + assert!( + matches!( + handled_error, + AggregatorClientError::RemoteServerLogical(..) + ), + "Expected error to be RemoteServerLogical\ngot '{handled_error:?}'", + ); + } + + #[tokio::test] + async fn test_5xx_errors_are_handled_as_remote_server_technical() { + let response = build_text_response(StatusCode::INTERNAL_SERVER_ERROR, "error text"); + let handled_error = AggregatorClientError::from_response(response).await; + + assert!( + matches!( + handled_error, + AggregatorClientError::RemoteServerTechnical(..) + ), + "Expected error to be RemoteServerLogical\ngot '{handled_error:?}'", + ); + } + + #[tokio::test] + async fn test_non_4xx_or_5xx_errors_are_handled_as_unhandled_status_code_and_contains_response_text( + ) { + let response = build_text_response(StatusCode::OK, "ok text"); + let handled_error = AggregatorClientError::from_response(response).await; + + assert!( + matches!( + handled_error, + AggregatorClientError::UnhandledStatusCode(..) if format!("{handled_error:?}").contains("ok text") + ), + "Expected error to be UnhandledStatusCode with 'ok text' in error text\ngot '{handled_error:?}'", + ); + } + + #[tokio::test] + async fn test_root_cause_of_non_json_response_contains_response_plain_text() { + let error_text = "An error occurred; please try again later."; + let response = build_text_response(StatusCode::EXPECTATION_FAILED, error_text); + + assert_error_text_contains!( + AggregatorClientError::get_root_cause(response).await, + "expectation failed: An error occurred; please try again later." + ); + } + + #[tokio::test] + async fn test_root_cause_of_json_formatted_client_error_response_contains_error_label_and_message( + ) { + let client_error = ClientError::new("label", "message"); + let response = build_json_response(StatusCode::BAD_REQUEST, &client_error); + + assert_error_text_contains!( + AggregatorClientError::get_root_cause(response).await, + "bad request: label: message" + ); + } + + #[tokio::test] + async fn test_root_cause_of_json_formatted_server_error_response_contains_error_label_and_message( + ) { + let server_error = ServerError::new("message"); + let response = build_json_response(StatusCode::BAD_REQUEST, &server_error); + + assert_error_text_contains!( + AggregatorClientError::get_root_cause(response).await, + "bad request: message" + ); + } + + #[tokio::test] + async fn test_root_cause_of_unknown_formatted_json_response_contains_json_key_value_pairs() { + let response = build_json_response( + StatusCode::INTERNAL_SERVER_ERROR, + &json!({ "second": "unknown", "first": "foreign" }), + ); + + assert_error_text_contains!( + AggregatorClientError::get_root_cause(response).await, + r#"internal server error: {"first":"foreign","second":"unknown"}"# + ); + } + + #[tokio::test] + async fn test_root_cause_with_invalid_json_response_still_contains_response_status_name() { + let response = HttpResponseBuilder::new() + .status(StatusCode::BAD_REQUEST) + .header(header::CONTENT_TYPE, JSON_CONTENT_TYPE) + .body(r#"{"invalid":"unexpected dot", "key": "value".}"#) + .unwrap() + .into(); + + let root_cause = AggregatorClientError::get_root_cause(response).await; + + assert_error_text_contains!(root_cause, "bad request"); + assert!( + !root_cause.contains("bad request: "), + "Expected error message should not contain additional information \ngot '{root_cause:?}'" + ); + } } From be2657a4dfddbece4ffbced2916eede4b9d0ea7f Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Wed, 9 Oct 2024 14:23:28 +0200 Subject: [PATCH 240/274] fix: signer raised error when `register_signature` returned `202` --- .../src/services/aggregator_client.rs | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/mithril-signer/src/services/aggregator_client.rs b/mithril-signer/src/services/aggregator_client.rs index 21f12476595..a07319e8683 100644 --- a/mithril-signer/src/services/aggregator_client.rs +++ b/mithril-signer/src/services/aggregator_client.rs @@ -336,7 +336,7 @@ impl AggregatorClient for AggregatorHTTPClient { match response { Ok(response) => match response.status() { - StatusCode::CREATED => Ok(()), + StatusCode::CREATED | StatusCode::ACCEPTED => Ok(()), StatusCode::GONE => { debug!(self.logger, "Aggregator already certified that message"; "signed_entity_type" => ?signed_entity_type); Ok(()) @@ -896,6 +896,31 @@ mod tests { register_signatures.expect("unexpected error"); } + #[tokio::test] + async fn test_register_signatures_ok_202() { + let single_signatures = fake_data::single_signatures((1..5).collect()); + let (server, config, api_version_provider) = setup_test(); + let _server_mock = server.mock(|when, then| { + when.method(POST).path("/register-signatures"); + then.status(202); + }); + let certificate_handler = AggregatorHTTPClient::new( + config.aggregator_endpoint, + config.relay_endpoint, + Arc::new(api_version_provider), + None, + TestLogger::stdout(), + ); + let register_signatures = certificate_handler + .register_signatures( + &SignedEntityType::dummy(), + &single_signatures, + &ProtocolMessage::default(), + ) + .await; + register_signatures.expect("unexpected error"); + } + #[tokio::test] async fn test_register_signatures_ko_412() { let (server, config, api_version_provider) = setup_test(); From ca7789ae54b582191e9cedc776793622087b0fbb Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Thu, 10 Oct 2024 12:36:04 +0200 Subject: [PATCH 241/274] chore: upgrade crate versions * mithril-persistence from `0.2.27` to `0.2.28` * mithril-signer from `0.2.195` to `0.2.196` --- Cargo.lock | 4 ++-- internal/mithril-persistence/Cargo.toml | 2 +- mithril-signer/Cargo.toml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index db54ccd6a67..e10e605def8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3656,7 +3656,7 @@ dependencies = [ [[package]] name = "mithril-persistence" -version = "0.2.27" +version = "0.2.28" dependencies = [ "anyhow", "async-trait", @@ -3700,7 +3700,7 @@ dependencies = [ [[package]] name = "mithril-signer" -version = "0.2.195" +version = "0.2.196" dependencies = [ "anyhow", "async-trait", diff --git a/internal/mithril-persistence/Cargo.toml b/internal/mithril-persistence/Cargo.toml index b086e67baaa..e5a8801d7db 100644 --- a/internal/mithril-persistence/Cargo.toml +++ b/internal/mithril-persistence/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-persistence" -version = "0.2.27" +version = "0.2.28" description = "Common types, interfaces, and utilities to persist data for Mithril nodes." authors = { workspace = true } edition = { workspace = true } diff --git a/mithril-signer/Cargo.toml b/mithril-signer/Cargo.toml index ce5d87bec05..c9f5c73c881 100644 --- a/mithril-signer/Cargo.toml +++ b/mithril-signer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-signer" -version = "0.2.195" +version = "0.2.196" description = "A Mithril Signer" authors = { workspace = true } edition = { workspace = true } From 83470fb535124860d878d50e7c1df78596949239 Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Thu, 10 Oct 2024 12:10:22 +0200 Subject: [PATCH 242/274] feat: dispatch e2e artifacts in dedicated subdirectories As the main work directory became quite packed. --- .../mithril-end-to-end/src/main.rs | 6 +++ .../src/mithril/aggregator.rs | 5 +++ .../src/mithril/infrastructure.rs | 41 +++++++++++++------ .../src/stress_test/aggregator_helpers.rs | 1 + 4 files changed, 40 insertions(+), 13 deletions(-) diff --git a/mithril-test-lab/mithril-end-to-end/src/main.rs b/mithril-test-lab/mithril-end-to-end/src/main.rs index 769f58787e2..bc198578035 100644 --- a/mithril-test-lab/mithril-end-to-end/src/main.rs +++ b/mithril-test-lab/mithril-end-to-end/src/main.rs @@ -174,6 +174,11 @@ async fn main() -> StdResult<()> { work_dir.canonicalize().unwrap() } }; + let artifacts_dir = { + let path = work_dir.join("artifacts"); + fs::create_dir(&path).expect("Artifacts dir creation failure"); + path + }; let run_only_mode = args.run_only; let use_p2p_network_mode = args.use_p2p_network; let use_p2p_passive_relays = args.use_p2p_passive_relays; @@ -193,6 +198,7 @@ async fn main() -> StdResult<()> { let mut infrastructure = MithrilInfrastructure::start(&MithrilInfrastructureConfig { server_port, devnet: devnet.clone(), + artifacts_dir, work_dir, bin_dir: args.bin_directory, cardano_node_version: args.cardano_node_version, diff --git a/mithril-test-lab/mithril-end-to-end/src/mithril/aggregator.rs b/mithril-test-lab/mithril-end-to-end/src/mithril/aggregator.rs index 69eb2be9053..feb4f18b804 100644 --- a/mithril-test-lab/mithril-end-to-end/src/mithril/aggregator.rs +++ b/mithril-test-lab/mithril-end-to-end/src/mithril/aggregator.rs @@ -18,6 +18,7 @@ pub struct AggregatorConfig<'a> { pub pool_node: &'a PoolNode, pub cardano_cli_path: &'a Path, pub work_dir: &'a Path, + pub artifacts_dir: &'a Path, pub bin_dir: &'a Path, pub cardano_node_version: &'a str, pub mithril_run_interval: u32, @@ -62,6 +63,10 @@ impl Aggregator { ("URL_SNAPSHOT_MANIFEST", ""), ("SNAPSHOT_STORE_TYPE", "local"), ("SNAPSHOT_UPLOADER_TYPE", "local"), + ( + "SNAPSHOT_DIRECTORY", + aggregator_config.artifacts_dir.to_str().unwrap(), + ), ("NETWORK_MAGIC", &magic_id), ("DATA_STORES_DIRECTORY", "./stores/aggregator"), ( diff --git a/mithril-test-lab/mithril-end-to-end/src/mithril/infrastructure.rs b/mithril-test-lab/mithril-end-to-end/src/mithril/infrastructure.rs index 15b1ee95dad..cc6470b231b 100644 --- a/mithril-test-lab/mithril-end-to-end/src/mithril/infrastructure.rs +++ b/mithril-test-lab/mithril-end-to-end/src/mithril/infrastructure.rs @@ -1,7 +1,4 @@ -use crate::{ - assertions, Aggregator, AggregatorConfig, Client, Devnet, PoolNode, RelayAggregator, - RelayPassive, RelaySigner, Signer, DEVNET_MAGIC_ID, -}; +use anyhow::Context; use mithril_common::chain_observer::{ChainObserver, PallasChainObserver}; use mithril_common::entities::{Epoch, PartyId, ProtocolParameters}; use mithril_common::{CardanoNetwork, StdResult}; @@ -11,12 +8,18 @@ use std::fs; use std::path::PathBuf; use std::sync::Arc; +use crate::{ + assertions, Aggregator, AggregatorConfig, Client, Devnet, PoolNode, RelayAggregator, + RelayPassive, RelaySigner, Signer, DEVNET_MAGIC_ID, +}; + use super::signer::SignerConfig; pub struct MithrilInfrastructureConfig { pub server_port: u64, pub devnet: Devnet, pub work_dir: PathBuf, + pub artifacts_dir: PathBuf, pub bin_dir: PathBuf, pub cardano_node_version: String, pub mithril_run_interval: u32, @@ -30,7 +33,7 @@ pub struct MithrilInfrastructureConfig { } pub struct MithrilInfrastructure { - work_dir: PathBuf, + artifacts_dir: PathBuf, bin_dir: PathBuf, devnet: Devnet, aggregator: Aggregator, @@ -77,8 +80,8 @@ impl MithrilInfrastructure { )); Ok(Self { - work_dir: config.work_dir.to_path_buf(), bin_dir: config.bin_dir.to_path_buf(), + artifacts_dir: config.artifacts_dir.to_path_buf(), devnet: config.devnet.clone(), aggregator, signers, @@ -137,11 +140,22 @@ impl MithrilInfrastructure { pool_node: &PoolNode, chain_observer_type: &str, ) -> StdResult { + let aggregator_artifacts_directory = config.artifacts_dir.join("mithril-aggregator"); + if !aggregator_artifacts_directory.exists() { + fs::create_dir_all(&aggregator_artifacts_directory).with_context(|| { + format!( + "Could not create artifacts directory '{}'", + aggregator_artifacts_directory.display() + ) + })?; + } + let mut aggregator = Aggregator::new(&AggregatorConfig { server_port: config.server_port, pool_node, cardano_cli_path: &config.devnet.cardano_cli_path(), work_dir: &config.work_dir, + artifacts_dir: &aggregator_artifacts_directory, bin_dir: &config.bin_dir, cardano_node_version: &config.cardano_node_version, mithril_run_interval: config.mithril_run_interval, @@ -312,15 +326,16 @@ impl MithrilInfrastructure { } pub fn build_client(&self) -> StdResult { - let work_dir = if self.use_era_specific_work_dir { - let era_work_dir = self.work_dir.join(format!("era.{}", self.current_era)); - if !era_work_dir.exists() { - fs::create_dir(&era_work_dir)?; + let work_dir = { + let mut artifacts_dir = self.artifacts_dir.join("mithril-client"); + if self.use_era_specific_work_dir { + artifacts_dir = artifacts_dir.join(format!("era.{}", self.current_era)); + } + if !artifacts_dir.exists() { + fs::create_dir_all(&artifacts_dir)?; } - era_work_dir - } else { - self.work_dir.clone() + artifacts_dir }; Client::new(self.aggregator.endpoint(), &work_dir, &self.bin_dir) diff --git a/mithril-test-lab/mithril-end-to-end/src/stress_test/aggregator_helpers.rs b/mithril-test-lab/mithril-end-to-end/src/stress_test/aggregator_helpers.rs index ecfac461ee3..0e209954f95 100644 --- a/mithril-test-lab/mithril-end-to-end/src/stress_test/aggregator_helpers.rs +++ b/mithril-test-lab/mithril-end-to-end/src/stress_test/aggregator_helpers.rs @@ -23,6 +23,7 @@ pub async fn bootstrap_aggregator( pool_node: &args.pool_node, cardano_cli_path: &args.cardano_cli_path, work_dir: &args.work_dir, + artifacts_dir: &args.work_dir, bin_dir: &args.bin_dir, cardano_node_version: "1.2.3", mithril_run_interval: 1000, From bc5b99b34ff57207139166fac2c977d5c2339d41 Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Thu, 10 Oct 2024 15:23:26 +0200 Subject: [PATCH 243/274] feat(e2e): stop mithril nodes before the devnet To avoid noise in the node logs because of errors due to not being able to access associated cardano nodes. --- .../mithril-end-to-end/src/main.rs | 13 ++++++++---- .../src/mithril/aggregator.rs | 3 +++ .../src/mithril/infrastructure.rs | 12 +++++++++++ .../mithril-end-to-end/src/mithril/signer.rs | 21 ++++++++++++++++--- 4 files changed, 42 insertions(+), 7 deletions(-) diff --git a/mithril-test-lab/mithril-end-to-end/src/main.rs b/mithril-test-lab/mithril-end-to-end/src/main.rs index bc198578035..08821a68476 100644 --- a/mithril-test-lab/mithril-end-to-end/src/main.rs +++ b/mithril-test-lab/mithril-end-to-end/src/main.rs @@ -11,7 +11,6 @@ use std::{ fs, path::{Path, PathBuf}, sync::Arc, - thread::sleep, time::Duration, }; use tokio_util::sync::CancellationToken; @@ -230,14 +229,16 @@ async fn main() -> StdResult<()> { }; match runner { - Ok(_) if run_only_mode => run_until_cancelled(devnet).await, + Ok(_) if run_only_mode => run_until_cancelled(infrastructure, devnet).await, Ok(_) => { + infrastructure.stop_nodes().await?; devnet.stop().await?; Ok(()) } Err(error) => { let has_written_logs = infrastructure.tail_logs(40).await; error!("Mithril End to End test in failed: {}", error); + infrastructure.stop_nodes().await?; devnet.stop().await?; has_written_logs?; Err(error) @@ -245,7 +246,10 @@ async fn main() -> StdResult<()> { } } -async fn run_until_cancelled(devnet: Devnet) -> StdResult<()> { +async fn run_until_cancelled( + mut mithril_infrastructure: MithrilInfrastructure, + devnet: Devnet, +) -> StdResult<()> { let cancellation_token = CancellationToken::new(); let cloned_token = cancellation_token.clone(); @@ -253,10 +257,11 @@ async fn run_until_cancelled(devnet: Devnet) -> StdResult<()> { _ = tokio::spawn(async move { while !cloned_token.is_cancelled() { info!("Mithril end to end is running and will remain active until manually stopped..."); - sleep(Duration::from_secs(5)); + tokio::time::sleep(Duration::from_secs(5)).await; } }) => {} _ = tokio::signal::ctrl_c() => { + mithril_infrastructure.stop_nodes().await?; cancellation_token.cancel(); devnet.stop().await?; } diff --git a/mithril-test-lab/mithril-end-to-end/src/mithril/aggregator.rs b/mithril-test-lab/mithril-end-to-end/src/mithril/aggregator.rs index feb4f18b804..a7868d5eb5a 100644 --- a/mithril-test-lab/mithril-end-to-end/src/mithril/aggregator.rs +++ b/mithril-test-lab/mithril-end-to-end/src/mithril/aggregator.rs @@ -6,6 +6,7 @@ use crate::{ use anyhow::{anyhow, Context}; use mithril_common::era::SupportedEra; use mithril_common::{entities, StdResult}; +use slog_scope::info; use std::cmp; use std::collections::HashMap; use std::path::{Path, PathBuf}; @@ -167,10 +168,12 @@ impl Aggregator { pub async fn stop(&mut self) -> StdResult<()> { if let Some(process) = self.process.as_mut() { + info!("Stopping aggregator"); process .kill() .await .with_context(|| "Could not kill aggregator")?; + self.process = None; } Ok(()) } diff --git a/mithril-test-lab/mithril-end-to-end/src/mithril/infrastructure.rs b/mithril-test-lab/mithril-end-to-end/src/mithril/infrastructure.rs index cc6470b231b..4e42d300e81 100644 --- a/mithril-test-lab/mithril-end-to-end/src/mithril/infrastructure.rs +++ b/mithril-test-lab/mithril-end-to-end/src/mithril/infrastructure.rs @@ -289,6 +289,18 @@ impl MithrilInfrastructure { Ok(signers) } + pub async fn stop_nodes(&mut self) -> StdResult<()> { + // Note: The aggregator should be stopped *last* since signers depends on it + info!("Stopping Mithril infrastructure"); + for signer in self.signers.as_mut_slice() { + signer.stop().await?; + } + + self.aggregator.stop().await?; + + Ok(()) + } + pub fn devnet(&self) -> &Devnet { &self.devnet } diff --git a/mithril-test-lab/mithril-end-to-end/src/mithril/signer.rs b/mithril-test-lab/mithril-end-to-end/src/mithril/signer.rs index 8fd6dde1070..b91dee9ed66 100644 --- a/mithril-test-lab/mithril-end-to-end/src/mithril/signer.rs +++ b/mithril-test-lab/mithril-end-to-end/src/mithril/signer.rs @@ -1,8 +1,10 @@ use crate::devnet::PoolNode; use crate::utils::MithrilCommand; use crate::{DEVNET_MAGIC_ID, ERA_MARKERS_VERIFICATION_KEY}; +use anyhow::Context; use mithril_common::entities::PartyId; use mithril_common::StdResult; +use slog_scope::info; use std::collections::HashMap; use std::path::Path; use tokio::process::Child; @@ -24,6 +26,7 @@ pub struct SignerConfig<'a> { #[derive(Debug)] pub struct Signer { + name: String, party_id: PartyId, command: MithrilCommand, process: Option, @@ -103,11 +106,11 @@ impl Signer { env, &args, )?; - command.set_log_name( - format!("mithril-signer-{}-{party_id}", signer_config.signer_number).as_str(), - ); + let name = format!("mithril-signer-{}-{party_id}", signer_config.signer_number); + command.set_log_name(&name); Ok(Self { + name, party_id, command, process: None, @@ -119,6 +122,18 @@ impl Signer { Ok(()) } + pub async fn stop(&mut self) -> StdResult<()> { + if let Some(process) = self.process.as_mut() { + let name = self.name.as_str(); + info!("Stopping {name}"); + process + .kill() + .await + .with_context(|| "Could not kill signer")?; + self.process = None; + } + Ok(()) + } pub async fn tail_logs(&self, number_of_line: u64) -> StdResult<()> { self.command .tail_logs( From 36133e88f856d89cf6e5acd82a4effa5fa41e616 Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Thu, 10 Oct 2024 15:40:51 +0200 Subject: [PATCH 244/274] feat(e2e): separate log file for aggregator bootstrapping --- .../mithril-end-to-end/src/mithril/aggregator.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/mithril-test-lab/mithril-end-to-end/src/mithril/aggregator.rs b/mithril-test-lab/mithril-end-to-end/src/mithril/aggregator.rs index a7868d5eb5a..73bf5937c4d 100644 --- a/mithril-test-lab/mithril-end-to-end/src/mithril/aggregator.rs +++ b/mithril-test-lab/mithril-end-to-end/src/mithril/aggregator.rs @@ -145,8 +145,11 @@ impl Aggregator { } pub async fn bootstrap_genesis(&mut self) -> StdResult<()> { - let exit_status = self - .command + // Clone the command so we can alter it without affecting the original + let mut command = self.command.clone(); + command.set_log_name("mithril-aggregator-genesis-bootstrap"); + + let exit_status = command .start(&["genesis".to_string(), "bootstrap".to_string()])? .wait() .await From 4bdc0476c4d4182d226cb02158f19ddf0b96aa80 Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Thu, 10 Oct 2024 12:13:03 +0200 Subject: [PATCH 245/274] chore: upgrade crate versions * mithril-end-to-end from `0.4.37` to `0.4.38` --- Cargo.lock | 2 +- mithril-test-lab/mithril-end-to-end/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e10e605def8..9a6b1b61bbf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3630,7 +3630,7 @@ dependencies = [ [[package]] name = "mithril-end-to-end" -version = "0.4.37" +version = "0.4.38" dependencies = [ "anyhow", "async-recursion", diff --git a/mithril-test-lab/mithril-end-to-end/Cargo.toml b/mithril-test-lab/mithril-end-to-end/Cargo.toml index c28b58bbadf..7d714f04c8a 100644 --- a/mithril-test-lab/mithril-end-to-end/Cargo.toml +++ b/mithril-test-lab/mithril-end-to-end/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-end-to-end" -version = "0.4.37" +version = "0.4.38" authors = { workspace = true } edition = { workspace = true } documentation = { workspace = true } From 1f92bb07d34993553dc4b2d375b14f25e581181b Mon Sep 17 00:00:00 2001 From: Damien Lachaume <135982616+dlachaume@users.noreply.github.com> Date: Thu, 10 Oct 2024 16:53:54 +0200 Subject: [PATCH 246/274] fix: disable store pruning for genesis commands --- mithril-aggregator/src/dependency_injection/builder.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mithril-aggregator/src/dependency_injection/builder.rs b/mithril-aggregator/src/dependency_injection/builder.rs index 7a9ce67f483..01d0d7d0898 100644 --- a/mithril-aggregator/src/dependency_injection/builder.rs +++ b/mithril-aggregator/src/dependency_injection/builder.rs @@ -1451,6 +1451,9 @@ impl DependenciesBuilder { "Dependencies Builder can not get Cardano network while building genesis container" })?; + // Disable store pruning for genesis commands + self.configuration.store_retention_limit = None; + let dependencies = GenesisToolsDependency { network, ticker_service: self.get_ticker_service().await?, From 0dcc77e19b30b08169316521cd83732945c21178 Mon Sep 17 00:00:00 2001 From: Damien Lachaume <135982616+dlachaume@users.noreply.github.com> Date: Thu, 10 Oct 2024 17:14:18 +0200 Subject: [PATCH 247/274] fix: enhance logs when error with bootstrap genesis in e2e --- .../mithril-end-to-end/src/mithril/aggregator.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mithril-test-lab/mithril-end-to-end/src/mithril/aggregator.rs b/mithril-test-lab/mithril-end-to-end/src/mithril/aggregator.rs index 73bf5937c4d..805a2c8016f 100644 --- a/mithril-test-lab/mithril-end-to-end/src/mithril/aggregator.rs +++ b/mithril-test-lab/mithril-end-to-end/src/mithril/aggregator.rs @@ -147,7 +147,8 @@ impl Aggregator { pub async fn bootstrap_genesis(&mut self) -> StdResult<()> { // Clone the command so we can alter it without affecting the original let mut command = self.command.clone(); - command.set_log_name("mithril-aggregator-genesis-bootstrap"); + let process_name = "mithril-aggregator-genesis-bootstrap"; + command.set_log_name(process_name); let exit_status = command .start(&["genesis".to_string(), "bootstrap".to_string()])? @@ -158,6 +159,8 @@ impl Aggregator { if exit_status.success() { Ok(()) } else { + self.command.tail_logs(Some(process_name), 40).await?; + Err(match exit_status.code() { Some(c) => { anyhow!("`mithril-aggregator genesis bootstrap` exited with code: {c}") From 6627cd1ec186afbc65fc92f009538ef325ae1b5b Mon Sep 17 00:00:00 2001 From: Damien Lachaume <135982616+dlachaume@users.noreply.github.com> Date: Thu, 10 Oct 2024 17:16:07 +0200 Subject: [PATCH 248/274] chore: upgrade crate versions * mithril-aggregator from `0.5.78` to `0.5.79` * mithril-end-to-end from `0.4.38` to `0.4.39` --- Cargo.lock | 4 ++-- mithril-aggregator/Cargo.toml | 2 +- mithril-test-lab/mithril-end-to-end/Cargo.toml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9a6b1b61bbf..5456540aa3d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3403,7 +3403,7 @@ dependencies = [ [[package]] name = "mithril-aggregator" -version = "0.5.78" +version = "0.5.79" dependencies = [ "anyhow", "async-trait", @@ -3630,7 +3630,7 @@ dependencies = [ [[package]] name = "mithril-end-to-end" -version = "0.4.38" +version = "0.4.39" dependencies = [ "anyhow", "async-recursion", diff --git a/mithril-aggregator/Cargo.toml b/mithril-aggregator/Cargo.toml index 7e7e094db63..da9bbd7afca 100644 --- a/mithril-aggregator/Cargo.toml +++ b/mithril-aggregator/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-aggregator" -version = "0.5.78" +version = "0.5.79" description = "A Mithril Aggregator server" authors = { workspace = true } edition = { workspace = true } diff --git a/mithril-test-lab/mithril-end-to-end/Cargo.toml b/mithril-test-lab/mithril-end-to-end/Cargo.toml index 7d714f04c8a..b34aaad2434 100644 --- a/mithril-test-lab/mithril-end-to-end/Cargo.toml +++ b/mithril-test-lab/mithril-end-to-end/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-end-to-end" -version = "0.4.38" +version = "0.4.39" authors = { workspace = true } edition = { workspace = true } documentation = { workspace = true } From 423395b869b1cd9f86230e24e2569c02a4f1a466 Mon Sep 17 00:00:00 2001 From: Damien Lachaume <135982616+dlachaume@users.noreply.github.com> Date: Thu, 10 Oct 2024 10:58:59 +0200 Subject: [PATCH 249/274] docs: add Cardano node troubleshooting instructions for macOS users --- mithril-test-lab/mithril-end-to-end/README.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/mithril-test-lab/mithril-end-to-end/README.md b/mithril-test-lab/mithril-end-to-end/README.md index 41ad2149fd0..129f89f748e 100644 --- a/mithril-test-lab/mithril-end-to-end/README.md +++ b/mithril-test-lab/mithril-end-to-end/README.md @@ -75,6 +75,20 @@ to your PATH from your bashrc like: Once saved, you need to reload your shell profile. Execute source $HOME/.bashrc or source $HOME/.zshrc (depending on the shell application you use). +#### Troubleshoot Cardano node timeout errors on macOS + +Sometimes, the default parameter values used to run the end to end test may not be suitable for macOS environments, causing the following error: + +```bash +>>>> Timeout: node-pool1 has not enough immutable files within 100 attempts +``` + +The default value of the **Cardano slot length** parameter can prevent the Cardano nodes to work properly in the `devnet`. Increasing the value helps improve the stability: you can add `--cardano-slot-length 0.25` to the run command: + +```bash +./mithril-end-to-end -vvv --work-directory db/ --bin-directory ../../target/release --devnet-scripts-directory=../mithril-devnet --cardano-slot-length 0.25 +``` + ### Use your own cardano binaries You can use your own compiled cardano binaries to run the end to end test: From c42cbb172139f4c3edb3fdd2ce4f8bc6f9ac5849 Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Fri, 11 Oct 2024 12:45:51 +0200 Subject: [PATCH 250/274] refactor(aggregator): simplify http server dependencies By providing the dependency container by reference instead of by move, allowing to remove the numerous `.clone()` used before. --- .../cardano_stake_distribution.rs | 16 ++--- .../artifact_routes/cardano_transaction.rs | 12 ++-- .../mithril_stake_distribution.rs | 12 ++-- .../routes/artifact_routes/snapshot.rs | 22 +++--- .../http_server/routes/certificate_routes.rs | 16 ++--- .../src/http_server/routes/epoch_routes.rs | 11 +-- .../src/http_server/routes/middlewares.rs | 72 +++++++++++-------- .../src/http_server/routes/proof_routes.rs | 18 ++--- .../src/http_server/routes/root_routes.rs | 13 ++-- .../src/http_server/routes/router.rs | 26 ++++--- .../http_server/routes/signatures_routes.rs | 12 ++-- .../src/http_server/routes/signer_routes.rs | 27 +++---- .../http_server/routes/statistics_routes.rs | 12 ++-- 13 files changed, 132 insertions(+), 137 deletions(-) diff --git a/mithril-aggregator/src/http_server/routes/artifact_routes/cardano_stake_distribution.rs b/mithril-aggregator/src/http_server/routes/artifact_routes/cardano_stake_distribution.rs index de03fa2d466..b65408b9e69 100644 --- a/mithril-aggregator/src/http_server/routes/artifact_routes/cardano_stake_distribution.rs +++ b/mithril-aggregator/src/http_server/routes/artifact_routes/cardano_stake_distribution.rs @@ -1,14 +1,13 @@ use crate::http_server::routes::middlewares; use crate::DependencyContainer; -use std::sync::Arc; use warp::Filter; pub fn routes( - dependency_manager: Arc, + dependency_manager: &DependencyContainer, ) -> impl Filter + Clone { - artifact_cardano_stake_distributions(dependency_manager.clone()) + artifact_cardano_stake_distributions(dependency_manager) .or(artifact_cardano_stake_distribution_by_id( - dependency_manager.clone(), + dependency_manager, )) .or(artifact_cardano_stake_distribution_by_epoch( dependency_manager, @@ -17,7 +16,7 @@ pub fn routes( /// GET /artifact/cardano-stake-distributions fn artifact_cardano_stake_distributions( - dependency_manager: Arc, + dependency_manager: &DependencyContainer, ) -> impl Filter + Clone { warp::path!("artifact" / "cardano-stake-distributions") .and(warp::get()) @@ -27,7 +26,7 @@ fn artifact_cardano_stake_distributions( /// GET /artifact/cardano-stake-distribution/:id fn artifact_cardano_stake_distribution_by_id( - dependency_manager: Arc, + dependency_manager: &DependencyContainer, ) -> impl Filter + Clone { warp::path!("artifact" / "cardano-stake-distribution" / String) .and(warp::get()) @@ -37,7 +36,7 @@ fn artifact_cardano_stake_distribution_by_id( /// GET /artifact/cardano-stake-distribution/epoch/:epoch fn artifact_cardano_stake_distribution_by_epoch( - dependency_manager: Arc, + dependency_manager: &DependencyContainer, ) -> impl Filter + Clone { warp::path!("artifact" / "cardano-stake-distribution" / "epoch" / String) .and(warp::get()) @@ -137,6 +136,7 @@ pub mod handlers { pub mod tests { use anyhow::anyhow; use serde_json::Value::Null; + use std::sync::Arc; use warp::{ http::{Method, StatusCode}, test::request, @@ -163,7 +163,7 @@ pub mod tests { warp::any() .and(warp::path(SERVER_BASE_PATH)) - .and(routes(dependency_manager).with(cors)) + .and(routes(&dependency_manager).with(cors)) } #[tokio::test] diff --git a/mithril-aggregator/src/http_server/routes/artifact_routes/cardano_transaction.rs b/mithril-aggregator/src/http_server/routes/artifact_routes/cardano_transaction.rs index 93a686ddd41..203f72abaaf 100644 --- a/mithril-aggregator/src/http_server/routes/artifact_routes/cardano_transaction.rs +++ b/mithril-aggregator/src/http_server/routes/artifact_routes/cardano_transaction.rs @@ -1,18 +1,17 @@ use crate::http_server::routes::middlewares; use crate::DependencyContainer; -use std::sync::Arc; use warp::Filter; pub fn routes( - dependency_manager: Arc, + dependency_manager: &DependencyContainer, ) -> impl Filter + Clone { - artifact_cardano_transactions(dependency_manager.clone()) + artifact_cardano_transactions(dependency_manager) .or(artifact_cardano_transaction_by_id(dependency_manager)) } /// GET /artifact/cardano-transactions fn artifact_cardano_transactions( - dependency_manager: Arc, + dependency_manager: &DependencyContainer, ) -> impl Filter + Clone { warp::path!("artifact" / "cardano-transactions") .and(warp::get()) @@ -22,7 +21,7 @@ fn artifact_cardano_transactions( /// GET /artifact/cardano-transaction/:id fn artifact_cardano_transaction_by_id( - dependency_manager: Arc, + dependency_manager: &DependencyContainer, ) -> impl Filter + Clone { warp::path!("artifact" / "cardano-transaction" / String) .and(warp::get()) @@ -102,6 +101,7 @@ pub mod tests { }; use mithril_persistence::sqlite::HydrationError; use serde_json::Value::Null; + use std::sync::Arc; use warp::{ http::{Method, StatusCode}, test::request, @@ -119,7 +119,7 @@ pub mod tests { warp::any() .and(warp::path(SERVER_BASE_PATH)) - .and(routes(dependency_manager).with(cors)) + .and(routes(&dependency_manager).with(cors)) } #[tokio::test] diff --git a/mithril-aggregator/src/http_server/routes/artifact_routes/mithril_stake_distribution.rs b/mithril-aggregator/src/http_server/routes/artifact_routes/mithril_stake_distribution.rs index ff7e28ba824..9f6ce379e46 100644 --- a/mithril-aggregator/src/http_server/routes/artifact_routes/mithril_stake_distribution.rs +++ b/mithril-aggregator/src/http_server/routes/artifact_routes/mithril_stake_distribution.rs @@ -1,19 +1,18 @@ use crate::http_server::routes::middlewares; use crate::DependencyContainer; -use std::sync::Arc; use warp::Filter; pub fn routes( - dependency_manager: Arc, + dependency_manager: &DependencyContainer, ) -> impl Filter + Clone { - artifact_mithril_stake_distributions(dependency_manager.clone()).or( + artifact_mithril_stake_distributions(dependency_manager).or( artifact_mithril_stake_distribution_by_id(dependency_manager), ) } /// GET /artifact/mithril-stake-distributions fn artifact_mithril_stake_distributions( - dependency_manager: Arc, + dependency_manager: &DependencyContainer, ) -> impl Filter + Clone { warp::path!("artifact" / "mithril-stake-distributions") .and(warp::get()) @@ -23,7 +22,7 @@ fn artifact_mithril_stake_distributions( /// GET /artifact/mithril-stake-distribution/:id fn artifact_mithril_stake_distribution_by_id( - dependency_manager: Arc, + dependency_manager: &DependencyContainer, ) -> impl Filter + Clone { warp::path!("artifact" / "mithril-stake-distribution" / String) .and(warp::get()) @@ -102,6 +101,7 @@ pub mod tests { }; use mithril_persistence::sqlite::HydrationError; use serde_json::Value::Null; + use std::sync::Arc; use warp::{ http::{Method, StatusCode}, test::request, @@ -119,7 +119,7 @@ pub mod tests { warp::any() .and(warp::path(SERVER_BASE_PATH)) - .and(routes(dependency_manager).with(cors)) + .and(routes(&dependency_manager).with(cors)) } #[tokio::test] diff --git a/mithril-aggregator/src/http_server/routes/artifact_routes/snapshot.rs b/mithril-aggregator/src/http_server/routes/artifact_routes/snapshot.rs index 7a1e40426b4..3c77e05e6bb 100644 --- a/mithril-aggregator/src/http_server/routes/artifact_routes/snapshot.rs +++ b/mithril-aggregator/src/http_server/routes/artifact_routes/snapshot.rs @@ -1,18 +1,17 @@ use crate::http_server::routes::middlewares; use crate::http_server::SERVER_BASE_PATH; use crate::DependencyContainer; -use std::sync::Arc; use warp::hyper::Uri; use warp::Filter; pub fn routes( - dependency_manager: Arc, + dependency_manager: &DependencyContainer, ) -> impl Filter + Clone { - artifact_cardano_full_immutable_snapshots(dependency_manager.clone()) + artifact_cardano_full_immutable_snapshots(dependency_manager) .or(artifact_cardano_full_immutable_snapshot_by_id( - dependency_manager.clone(), + dependency_manager, )) - .or(serve_snapshots_dir(dependency_manager.clone())) + .or(serve_snapshots_dir(dependency_manager)) .or(snapshot_download(dependency_manager)) .or(artifact_cardano_full_immutable_snapshots_legacy()) .or(artifact_cardano_full_immutable_snapshot_by_id_legacy()) @@ -20,7 +19,7 @@ pub fn routes( /// GET /artifact/snapshots fn artifact_cardano_full_immutable_snapshots( - dependency_manager: Arc, + dependency_manager: &DependencyContainer, ) -> impl Filter + Clone { warp::path!("artifact" / "snapshots") .and(warp::get()) @@ -30,7 +29,7 @@ fn artifact_cardano_full_immutable_snapshots( /// GET /artifact/snapshot/:id fn artifact_cardano_full_immutable_snapshot_by_id( - dependency_manager: Arc, + dependency_manager: &DependencyContainer, ) -> impl Filter + Clone { warp::path!("artifact" / "snapshot" / String) .and(warp::get()) @@ -40,17 +39,17 @@ fn artifact_cardano_full_immutable_snapshot_by_id( /// GET /artifact/snapshots/{digest}/download fn snapshot_download( - dependency_manager: Arc, + dependency_manager: &DependencyContainer, ) -> impl Filter + Clone { warp::path!("artifact" / "snapshot" / String / "download") .and(warp::get().or(warp::head()).unify()) - .and(middlewares::with_config(dependency_manager.clone())) + .and(middlewares::with_config(dependency_manager)) .and(middlewares::with_signed_entity_service(dependency_manager)) .and_then(handlers::snapshot_download) } fn serve_snapshots_dir( - dependency_manager: Arc, + dependency_manager: &DependencyContainer, ) -> impl Filter + Clone { let config = dependency_manager.config.clone(); @@ -234,6 +233,7 @@ mod tests { }; use mithril_persistence::sqlite::HydrationError; use serde_json::Value::Null; + use std::sync::Arc; use warp::{ http::{Method, StatusCode}, test::request, @@ -251,7 +251,7 @@ mod tests { warp::any() .and(warp::path(SERVER_BASE_PATH)) - .and(routes(dependency_manager).with(cors)) + .and(routes(&dependency_manager).with(cors)) } #[tokio::test] diff --git a/mithril-aggregator/src/http_server/routes/certificate_routes.rs b/mithril-aggregator/src/http_server/routes/certificate_routes.rs index 24cb53e2509..f0ec6f1f8cd 100644 --- a/mithril-aggregator/src/http_server/routes/certificate_routes.rs +++ b/mithril-aggregator/src/http_server/routes/certificate_routes.rs @@ -1,19 +1,18 @@ use crate::http_server::routes::middlewares; use crate::DependencyContainer; -use std::sync::Arc; use warp::Filter; pub fn routes( - dependency_manager: Arc, + dependency_manager: &DependencyContainer, ) -> impl Filter + Clone { - certificate_pending(dependency_manager.clone()) - .or(certificate_certificates(dependency_manager.clone())) + certificate_pending(dependency_manager) + .or(certificate_certificates(dependency_manager)) .or(certificate_certificate_hash(dependency_manager)) } /// GET /certificate-pending fn certificate_pending( - dependency_manager: Arc, + dependency_manager: &DependencyContainer, ) -> impl Filter + Clone { warp::path!("certificate-pending") .and(warp::get()) @@ -25,7 +24,7 @@ fn certificate_pending( /// GET /certificates fn certificate_certificates( - dependency_manager: Arc, + dependency_manager: &DependencyContainer, ) -> impl Filter + Clone { warp::path!("certificates") .and(warp::get()) @@ -35,7 +34,7 @@ fn certificate_certificates( /// GET /certificate/{certificate_hash} fn certificate_certificate_hash( - dependency_manager: Arc, + dependency_manager: &DependencyContainer, ) -> impl Filter + Clone { warp::path!("certificate" / String) .and(warp::get()) @@ -126,6 +125,7 @@ mod tests { }; use mithril_persistence::store::adapter::DumbStoreAdapter; use serde_json::Value::Null; + use std::sync::Arc; use warp::{ http::{Method, StatusCode}, test::request, @@ -148,7 +148,7 @@ mod tests { warp::any() .and(warp::path(SERVER_BASE_PATH)) - .and(routes(dependency_manager).with(cors)) + .and(routes(&dependency_manager).with(cors)) } #[tokio::test] diff --git a/mithril-aggregator/src/http_server/routes/epoch_routes.rs b/mithril-aggregator/src/http_server/routes/epoch_routes.rs index 0cd7040dea7..d0bb49d0806 100644 --- a/mithril-aggregator/src/http_server/routes/epoch_routes.rs +++ b/mithril-aggregator/src/http_server/routes/epoch_routes.rs @@ -1,4 +1,4 @@ -use std::{collections::BTreeSet, sync::Arc}; +use std::collections::BTreeSet; use warp::Filter; use mithril_common::{ @@ -12,18 +12,18 @@ use crate::http_server::routes::middlewares; use crate::DependencyContainer; pub fn routes( - dependency_manager: Arc, + dependency_manager: &DependencyContainer, ) -> impl Filter + Clone { epoch_settings(dependency_manager) } /// GET /epoch-settings fn epoch_settings( - dependency_manager: Arc, + dependency_manager: &DependencyContainer, ) -> impl Filter + Clone { warp::path!("epoch-settings") .and(warp::get()) - .and(middlewares::with_epoch_service(dependency_manager.clone())) + .and(middlewares::with_epoch_service(dependency_manager)) .and(middlewares::with_allowed_signed_entity_type_discriminants( dependency_manager, )) @@ -99,6 +99,7 @@ mod handlers { mod tests { use serde_json::Value::Null; use std::collections::BTreeSet; + use std::sync::Arc; use tokio::sync::RwLock; use warp::{ http::{Method, StatusCode}, @@ -129,7 +130,7 @@ mod tests { warp::any() .and(warp::path(SERVER_BASE_PATH)) - .and(routes(dependency_manager).with(cors)) + .and(routes(&dependency_manager).with(cors)) } #[tokio::test] diff --git a/mithril-aggregator/src/http_server/routes/middlewares.rs b/mithril-aggregator/src/http_server/routes/middlewares.rs index 0dd3039c867..267a410d90d 100644 --- a/mithril-aggregator/src/http_server/routes/middlewares.rs +++ b/mithril-aggregator/src/http_server/routes/middlewares.rs @@ -18,100 +18,114 @@ use crate::{ /// With certificate pending store pub(crate) fn with_certificate_pending_store( - dependency_manager: Arc, + dependency_manager: &DependencyContainer, ) -> impl Filter,), Error = Infallible> + Clone { - warp::any().map(move || dependency_manager.certificate_pending_store.clone()) + let certificate_pending_store = dependency_manager.certificate_pending_store.clone(); + warp::any().map(move || certificate_pending_store.clone()) } /// With signer registerer middleware pub fn with_signer_registerer( - dependency_manager: Arc, + dependency_manager: &DependencyContainer, ) -> impl Filter,), Error = Infallible> + Clone { - warp::any().map(move || dependency_manager.signer_registerer.clone()) + let signer_register = dependency_manager.signer_registerer.clone(); + warp::any().map(move || signer_register.clone()) } /// With signer getter middleware pub fn with_signer_getter( - dependency_manager: Arc, + dependency_manager: &DependencyContainer, ) -> impl Filter,), Error = Infallible> + Clone { - warp::any().map(move || dependency_manager.signer_getter.clone()) + let signer_getter = dependency_manager.signer_getter.clone(); + warp::any().map(move || signer_getter.clone()) } /// With config middleware pub fn with_config( - dependency_manager: Arc, + dependency_manager: &DependencyContainer, ) -> impl Filter + Clone { - warp::any().map(move || dependency_manager.config.clone()) + let config = dependency_manager.config.clone(); + warp::any().map(move || config.clone()) } /// With allowed signed entity discriminants middleware pub fn with_allowed_signed_entity_type_discriminants( - dependency_manager: Arc, + dependency_manager: &DependencyContainer, ) -> impl Filter,), Error = Infallible> + Clone { - warp::any().map(move || dependency_manager.allowed_discriminants.clone()) + let allowed_discriminants = dependency_manager.allowed_discriminants.clone(); + warp::any().map(move || allowed_discriminants.clone()) } /// With Event transmitter middleware pub fn with_event_transmitter( - dependency_manager: Arc, + dependency_manager: &DependencyContainer, ) -> impl Filter>,), Error = Infallible> + Clone { - warp::any().map(move || dependency_manager.event_transmitter.clone()) + let event_transmitter = dependency_manager.event_transmitter.clone(); + warp::any().map(move || event_transmitter.clone()) } /// With certifier service middleware pub fn with_certifier_service( - dependency_manager: Arc, + dependency_manager: &DependencyContainer, ) -> impl Filter,), Error = Infallible> + Clone { - warp::any().map(move || dependency_manager.certifier_service.clone()) + let certifier_service = dependency_manager.certifier_service.clone(); + warp::any().map(move || certifier_service.clone()) } /// With epoch service middleware pub fn with_epoch_service( - dependency_manager: Arc, + dependency_manager: &DependencyContainer, ) -> impl Filter + Clone { - warp::any().map(move || dependency_manager.epoch_service.clone()) + let epoch_service = dependency_manager.epoch_service.clone(); + warp::any().map(move || epoch_service.clone()) } /// With signed entity service pub fn with_signed_entity_service( - dependency_manager: Arc, + dependency_manager: &DependencyContainer, ) -> impl Filter,), Error = Infallible> + Clone { - warp::any().map(move || dependency_manager.signed_entity_service.clone()) + let signed_entity_service = dependency_manager.signed_entity_service.clone(); + warp::any().map(move || signed_entity_service.clone()) } /// With verification key store pub fn with_verification_key_store( - dependency_manager: Arc, + dependency_manager: &DependencyContainer, ) -> impl Filter,), Error = Infallible> + Clone { - warp::any().map(move || dependency_manager.verification_key_store.clone()) + let verification_key_store = dependency_manager.verification_key_store.clone(); + warp::any().map(move || verification_key_store.clone()) } /// With API version provider pub fn with_api_version_provider( - dependency_manager: Arc, + dependency_manager: &DependencyContainer, ) -> impl Filter,), Error = Infallible> + Clone { - warp::any().map(move || dependency_manager.api_version_provider.clone()) + let api_version_provider = dependency_manager.api_version_provider.clone(); + warp::any().map(move || api_version_provider.clone()) } /// With Message service pub fn with_http_message_service( - dependency_manager: Arc, + dependency_manager: &DependencyContainer, ) -> impl Filter,), Error = Infallible> + Clone { - warp::any().map(move || dependency_manager.message_service.clone()) + let message_service = dependency_manager.message_service.clone(); + warp::any().map(move || message_service.clone()) } /// With Prover service pub fn with_prover_service( - dependency_manager: Arc, + dependency_manager: &DependencyContainer, ) -> impl Filter,), Error = Infallible> + Clone { - warp::any().map(move || dependency_manager.prover_service.clone()) + let prover_service = dependency_manager.prover_service.clone(); + warp::any().map(move || prover_service.clone()) } /// With Single Signature Authenticator pub fn with_single_signature_authenticator( - dependency_manager: Arc, + dependency_manager: &DependencyContainer, ) -> impl Filter,), Error = Infallible> + Clone { - warp::any().map(move || dependency_manager.single_signer_authenticator.clone()) + let single_signer_authenticator = dependency_manager.single_signer_authenticator.clone(); + warp::any().map(move || single_signer_authenticator.clone()) } pub mod validators { @@ -121,7 +135,7 @@ pub mod validators { /// With Prover Transactions Hash Validator pub fn with_prover_transactions_hash_validator( - dependency_manager: Arc, + dependency_manager: &DependencyContainer, ) -> impl Filter + Clone { let max_hashes = dependency_manager .config diff --git a/mithril-aggregator/src/http_server/routes/proof_routes.rs b/mithril-aggregator/src/http_server/routes/proof_routes.rs index a254828d6bc..ec34c5e73e6 100644 --- a/mithril-aggregator/src/http_server/routes/proof_routes.rs +++ b/mithril-aggregator/src/http_server/routes/proof_routes.rs @@ -1,5 +1,4 @@ use serde::{Deserialize, Serialize}; -use std::sync::Arc; use warp::Filter; use crate::http_server::routes::middlewares; @@ -27,26 +26,20 @@ impl CardanoTransactionProofQueryParams { } pub fn routes( - dependency_manager: Arc, + dependency_manager: &DependencyContainer, ) -> impl Filter + Clone { proof_cardano_transaction(dependency_manager) } /// GET /proof/cardano-transaction fn proof_cardano_transaction( - dependency_manager: Arc, + dependency_manager: &DependencyContainer, ) -> impl Filter + Clone { warp::path!("proof" / "cardano-transaction") .and(warp::get()) .and(warp::query::()) - .and(middlewares::with_signed_entity_service( - dependency_manager.clone(), - )) - .and( - middlewares::validators::with_prover_transactions_hash_validator( - dependency_manager.clone(), - ), - ) + .and(middlewares::with_signed_entity_service(dependency_manager)) + .and(middlewares::validators::with_prover_transactions_hash_validator(dependency_manager)) .and(middlewares::with_prover_service(dependency_manager)) .and_then(handlers::proof_cardano_transaction) } @@ -134,6 +127,7 @@ mod handlers { mod tests { use anyhow::anyhow; use serde_json::Value::Null; + use std::sync::Arc; use std::vec; use warp::{ http::{Method, StatusCode}, @@ -165,7 +159,7 @@ mod tests { warp::any() .and(warp::path(SERVER_BASE_PATH)) - .and(routes(dependency_manager).with(cors)) + .and(routes(&dependency_manager).with(cors)) } #[tokio::test] diff --git a/mithril-aggregator/src/http_server/routes/root_routes.rs b/mithril-aggregator/src/http_server/routes/root_routes.rs index 781a0f165e2..5db5a59cc01 100644 --- a/mithril-aggregator/src/http_server/routes/root_routes.rs +++ b/mithril-aggregator/src/http_server/routes/root_routes.rs @@ -1,25 +1,22 @@ use crate::DependencyContainer; -use std::sync::Arc; use warp::Filter; use super::middlewares; pub fn routes( - dependency_manager: Arc, + dependency_manager: &DependencyContainer, ) -> impl Filter + Clone { root(dependency_manager) } /// GET / fn root( - dependency_manager: Arc, + dependency_manager: &DependencyContainer, ) -> impl Filter + Clone { warp::path::end() - .and(middlewares::with_api_version_provider( - dependency_manager.clone(), - )) + .and(middlewares::with_api_version_provider(dependency_manager)) .and(middlewares::with_allowed_signed_entity_type_discriminants( - dependency_manager.clone(), + dependency_manager, )) .and(middlewares::with_config(dependency_manager)) .and_then(handlers::root) @@ -117,7 +114,7 @@ mod tests { warp::any() .and(warp::path(SERVER_BASE_PATH)) - .and(routes(dependency_manager).with(cors)) + .and(routes(&dependency_manager).with(cors)) } #[tokio::test] diff --git a/mithril-aggregator/src/http_server/routes/router.rs b/mithril-aggregator/src/http_server/routes/router.rs index fcedfb2a06e..3b3b4eb93fb 100644 --- a/mithril-aggregator/src/http_server/routes/router.rs +++ b/mithril-aggregator/src/http_server/routes/router.rs @@ -42,29 +42,27 @@ pub fn routes( )) .and(warp::path(SERVER_BASE_PATH)) .and( - certificate_routes::routes(dependency_manager.clone()) - .or(artifact_routes::snapshot::routes( - dependency_manager.clone(), - )) + certificate_routes::routes(&dependency_manager) + .or(artifact_routes::snapshot::routes(&dependency_manager)) .or(artifact_routes::mithril_stake_distribution::routes( - dependency_manager.clone(), + &dependency_manager, )) .or(artifact_routes::cardano_stake_distribution::routes( - dependency_manager.clone(), + &dependency_manager, )) .or(artifact_routes::cardano_transaction::routes( - dependency_manager.clone(), + &dependency_manager, )) - .or(proof_routes::routes(dependency_manager.clone())) - .or(signer_routes::routes(dependency_manager.clone())) - .or(signatures_routes::routes(dependency_manager.clone())) - .or(epoch_routes::routes(dependency_manager.clone())) - .or(statistics_routes::routes(dependency_manager.clone())) - .or(root_routes::routes(dependency_manager.clone())) + .or(proof_routes::routes(&dependency_manager)) + .or(signer_routes::routes(&dependency_manager)) + .or(signatures_routes::routes(&dependency_manager)) + .or(epoch_routes::routes(&dependency_manager)) + .or(statistics_routes::routes(&dependency_manager)) + .or(root_routes::routes(&dependency_manager)) .with(cors), ) .recover(handle_custom) - .and(middlewares::with_api_version_provider(dependency_manager)) + .and(middlewares::with_api_version_provider(&dependency_manager)) .map(|reply, api_version_provider: Arc| { warp::reply::with_header( reply, diff --git a/mithril-aggregator/src/http_server/routes/signatures_routes.rs b/mithril-aggregator/src/http_server/routes/signatures_routes.rs index 029f2f758af..3a7589ecace 100644 --- a/mithril-aggregator/src/http_server/routes/signatures_routes.rs +++ b/mithril-aggregator/src/http_server/routes/signatures_routes.rs @@ -1,24 +1,21 @@ use crate::http_server::routes::middlewares; use crate::DependencyContainer; -use std::sync::Arc; use warp::Filter; pub fn routes( - dependency_manager: Arc, + dependency_manager: &DependencyContainer, ) -> impl Filter + Clone { register_signatures(dependency_manager) } /// POST /register-signatures fn register_signatures( - dependency_manager: Arc, + dependency_manager: &DependencyContainer, ) -> impl Filter + Clone { warp::path!("register-signatures") .and(warp::post()) .and(warp::body::json()) - .and(middlewares::with_certifier_service( - dependency_manager.clone(), - )) + .and(middlewares::with_certifier_service(dependency_manager)) .and(middlewares::with_single_signature_authenticator( dependency_manager, )) @@ -108,6 +105,7 @@ mod handlers { #[cfg(test)] mod tests { use anyhow::anyhow; + use std::sync::Arc; use warp::http::{Method, StatusCode}; use warp::test::request; @@ -135,7 +133,7 @@ mod tests { warp::any() .and(warp::path(SERVER_BASE_PATH)) - .and(routes(dependency_manager).with(cors)) + .and(routes(&dependency_manager).with(cors)) } #[tokio::test] diff --git a/mithril-aggregator/src/http_server/routes/signer_routes.rs b/mithril-aggregator/src/http_server/routes/signer_routes.rs index 2241cc02de2..cff94a30cff 100644 --- a/mithril-aggregator/src/http_server/routes/signer_routes.rs +++ b/mithril-aggregator/src/http_server/routes/signer_routes.rs @@ -1,5 +1,3 @@ -use std::sync::Arc; - use slog_scope::warn; use warp::Filter; @@ -10,16 +8,16 @@ use crate::DependencyContainer; const MITHRIL_SIGNER_VERSION_HEADER: &str = "signer-node-version"; pub fn routes( - dependency_manager: Arc, + dependency_manager: &DependencyContainer, ) -> impl Filter + Clone { - register_signer(dependency_manager.clone()) - .or(registered_signers(dependency_manager.clone())) + register_signer(dependency_manager) + .or(registered_signers(dependency_manager)) .or(signers_tickers(dependency_manager)) } /// POST /register-signer fn register_signer( - dependency_manager: Arc, + dependency_manager: &DependencyContainer, ) -> impl Filter + Clone { warp::path!("register-signer") .and(warp::post()) @@ -27,30 +25,26 @@ fn register_signer( MITHRIL_SIGNER_VERSION_HEADER, )) .and(warp::body::json()) - .and(middlewares::with_signer_registerer( - dependency_manager.clone(), - )) - .and(middlewares::with_event_transmitter( - dependency_manager.clone(), - )) + .and(middlewares::with_signer_registerer(dependency_manager)) + .and(middlewares::with_event_transmitter(dependency_manager)) .and(middlewares::with_epoch_service(dependency_manager)) .and_then(handlers::register_signer) } /// Get /signers/tickers fn signers_tickers( - dependency_manager: Arc, + dependency_manager: &DependencyContainer, ) -> impl Filter + Clone { warp::path!("signers" / "tickers") .and(warp::get()) - .and(middlewares::with_config(dependency_manager.clone())) + .and(middlewares::with_config(dependency_manager)) .and(middlewares::with_signer_getter(dependency_manager)) .and_then(handlers::signers_tickers) } /// Get /signers/registered/:epoch fn registered_signers( - dependency_manager: Arc, + dependency_manager: &DependencyContainer, ) -> impl Filter + Clone { warp::path!("signers" / "registered" / String) .and(warp::get()) @@ -245,6 +239,7 @@ mod tests { use anyhow::anyhow; use mockall::predicate::eq; use serde_json::Value::Null; + use std::sync::Arc; use tokio::sync::RwLock; use warp::{ http::{Method, StatusCode}, @@ -282,7 +277,7 @@ mod tests { warp::any() .and(warp::path(SERVER_BASE_PATH)) - .and(routes(dependency_manager).with(cors)) + .and(routes(&dependency_manager).with(cors)) } #[tokio::test] diff --git a/mithril-aggregator/src/http_server/routes/statistics_routes.rs b/mithril-aggregator/src/http_server/routes/statistics_routes.rs index 508b15e5082..eefd6b6c9bd 100644 --- a/mithril-aggregator/src/http_server/routes/statistics_routes.rs +++ b/mithril-aggregator/src/http_server/routes/statistics_routes.rs @@ -1,25 +1,22 @@ -use std::sync::Arc; use warp::Filter; use crate::http_server::routes::middlewares; use crate::DependencyContainer; pub fn routes( - dependency_manager: Arc, + dependency_manager: &DependencyContainer, ) -> impl Filter + Clone { post_statistics(dependency_manager) } /// POST /statistics/snapshot fn post_statistics( - dependency_manager: Arc, + dependency_manager: &DependencyContainer, ) -> impl Filter + Clone { warp::path!("statistics" / "snapshot") .and(warp::post()) .and(warp::body::json()) - .and(middlewares::with_event_transmitter( - dependency_manager.clone(), - )) + .and(middlewares::with_event_transmitter(dependency_manager)) .and_then(handlers::post_snapshot_statistics) } @@ -57,6 +54,7 @@ mod tests { use mithril_common::messages::SnapshotDownloadMessage; use mithril_common::test_utils::apispec::APISpec; + use std::sync::Arc; use warp::{ http::{Method, StatusCode}, test::request, @@ -76,7 +74,7 @@ mod tests { warp::any() .and(warp::path(SERVER_BASE_PATH)) - .and(routes(dependency_manager).with(cors)) + .and(routes(&dependency_manager).with(cors)) } #[tokio::test] From 41367497b2d184b9be1e0c8f94c785c16c9c2c81 Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Fri, 11 Oct 2024 15:07:11 +0200 Subject: [PATCH 251/274] chore: upgrade crate versions * mithril-aggregator from `0.5.79` to `0.5.80` --- Cargo.lock | 2 +- mithril-aggregator/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5456540aa3d..d75f9f66211 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3403,7 +3403,7 @@ dependencies = [ [[package]] name = "mithril-aggregator" -version = "0.5.79" +version = "0.5.80" dependencies = [ "anyhow", "async-trait", diff --git a/mithril-aggregator/Cargo.toml b/mithril-aggregator/Cargo.toml index da9bbd7afca..24c888d08d4 100644 --- a/mithril-aggregator/Cargo.toml +++ b/mithril-aggregator/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-aggregator" -version = "0.5.79" +version = "0.5.80" description = "A Mithril Aggregator server" authors = { workspace = true } edition = { workspace = true } From 3fdbddff81259c24ed563f2480034014c679ad7d Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Fri, 11 Oct 2024 11:46:03 +0200 Subject: [PATCH 252/274] refactor(aggregator): simplify `mockall::automock` imports Use full path instead of needing a use gated by an `cfg(test)` that add noises with the other imports. --- mithril-aggregator/src/artifact_builder/interface.rs | 5 +---- .../src/database/repository/signer_store.rs | 4 +--- mithril-aggregator/src/multi_signer.rs | 5 +---- mithril-aggregator/src/runtime/runner.rs | 5 +---- mithril-aggregator/src/services/message.rs | 5 +---- mithril-aggregator/src/services/signed_entity.rs | 5 +---- mithril-aggregator/src/services/stake_distribution.rs | 5 +---- mithril-aggregator/src/signer_registerer.rs | 8 +++----- .../src/snapshot_uploaders/snapshot_uploader.rs | 5 +---- mithril-aggregator/src/store/verification_key_store.rs | 5 +---- mithril-aggregator/src/tools/remote_file_uploader.rs | 5 +---- mithril-aggregator/src/tools/signer_importer.rs | 6 ++---- 12 files changed, 15 insertions(+), 48 deletions(-) diff --git a/mithril-aggregator/src/artifact_builder/interface.rs b/mithril-aggregator/src/artifact_builder/interface.rs index 28d8a669432..2db853b2a83 100644 --- a/mithril-aggregator/src/artifact_builder/interface.rs +++ b/mithril-aggregator/src/artifact_builder/interface.rs @@ -5,11 +5,8 @@ use mithril_common::{ StdResult, }; -#[cfg(test)] -use mockall::automock; - /// ArtifactBuilder is trait for building an artifact -#[cfg_attr(test, automock)] +#[cfg_attr(test, mockall::automock)] #[async_trait] pub trait ArtifactBuilder: Send + Sync where diff --git a/mithril-aggregator/src/database/repository/signer_store.rs b/mithril-aggregator/src/database/repository/signer_store.rs index 1a0d73fae1a..ac20553c090 100644 --- a/mithril-aggregator/src/database/repository/signer_store.rs +++ b/mithril-aggregator/src/database/repository/signer_store.rs @@ -3,8 +3,6 @@ use std::sync::Arc; use async_trait::async_trait; use chrono::Utc; -#[cfg(test)] -use mockall::automock; use mithril_common::StdResult; use mithril_persistence::sqlite::{ConnectionExtensions, SqliteConnection}; @@ -16,7 +14,7 @@ use crate::database::record::SignerRecord; use crate::SignerRecorder; /// Service to get [SignerRecord]. -#[cfg_attr(test, automock)] +#[cfg_attr(test, mockall::automock)] #[async_trait] pub trait SignerGetter: Sync + Send { /// Return all stored records. diff --git a/mithril-aggregator/src/multi_signer.rs b/mithril-aggregator/src/multi_signer.rs index 5f7baaa9bd3..865cb5e5ac8 100644 --- a/mithril-aggregator/src/multi_signer.rs +++ b/mithril-aggregator/src/multi_signer.rs @@ -12,11 +12,8 @@ use mithril_common::{ use crate::dependency_injection::EpochServiceWrapper; use crate::entities::OpenMessage; -#[cfg(test)] -use mockall::automock; - /// MultiSigner is the cryptographic engine in charge of producing multi signatures from individual signatures -#[cfg_attr(test, automock)] +#[cfg_attr(test, mockall::automock)] #[async_trait] pub trait MultiSigner: Sync + Send { /// Verify a single signature diff --git a/mithril-aggregator/src/runtime/runner.rs b/mithril-aggregator/src/runtime/runner.rs index ddce241007a..fce0016216b 100644 --- a/mithril-aggregator/src/runtime/runner.rs +++ b/mithril-aggregator/src/runtime/runner.rs @@ -13,9 +13,6 @@ use mithril_persistence::store::StakeStorer; use crate::entities::OpenMessage; use crate::DependencyContainer; -#[cfg(test)] -use mockall::automock; - /// Configuration structure dedicated to the AggregatorRuntime. #[derive(Debug, Clone)] pub struct AggregatorConfig { @@ -165,7 +162,7 @@ impl AggregatorRunner { } } -#[cfg_attr(test, automock)] +#[cfg_attr(test, mockall::automock)] #[async_trait] impl AggregatorRunnerTrait for AggregatorRunner { /// Return the current time point from the chain diff --git a/mithril-aggregator/src/services/message.rs b/mithril-aggregator/src/services/message.rs index e40c1aac014..4bcd035d7cc 100644 --- a/mithril-aggregator/src/services/message.rs +++ b/mithril-aggregator/src/services/message.rs @@ -18,9 +18,6 @@ use mithril_common::{ use crate::database::repository::{CertificateRepository, SignedEntityStorer}; -#[cfg(test)] -use mockall::automock; - /// Error related to the [MessageService] #[derive(Debug, Error)] pub enum MessageServiceError { @@ -29,7 +26,7 @@ pub enum MessageServiceError { PendingCertificateDoesNotExist, } /// HTTP Message service trait. -#[cfg_attr(test, automock)] +#[cfg_attr(test, mockall::automock)] #[async_trait] pub trait MessageService: Sync + Send { /// Return the message representation of a certificate if it exists. diff --git a/mithril-aggregator/src/services/signed_entity.rs b/mithril-aggregator/src/services/signed_entity.rs index 2482be8c592..eca3a5bf55b 100644 --- a/mithril-aggregator/src/services/signed_entity.rs +++ b/mithril-aggregator/src/services/signed_entity.rs @@ -25,11 +25,8 @@ use crate::{ database::{record::SignedEntityRecord, repository::SignedEntityStorer}, }; -#[cfg(test)] -use mockall::automock; - /// ArtifactBuilder Service trait -#[cfg_attr(test, automock)] +#[cfg_attr(test, mockall::automock)] #[async_trait] pub trait SignedEntityService: Send + Sync { /// Create artifact for a signed entity type and a certificate diff --git a/mithril-aggregator/src/services/stake_distribution.rs b/mithril-aggregator/src/services/stake_distribution.rs index f6958fb8720..38a560e9513 100644 --- a/mithril-aggregator/src/services/stake_distribution.rs +++ b/mithril-aggregator/src/services/stake_distribution.rs @@ -17,9 +17,6 @@ use mithril_persistence::store::StakeStorer; use crate::database::repository::StakePoolStore; -#[cfg(test)] -use mockall::automock; - /// Errors related to the [StakeDistributionService]. #[derive(Debug)] pub enum StakePoolDistributionServiceError { @@ -89,7 +86,7 @@ impl Display for StakePoolDistributionServiceError { impl std::error::Error for StakePoolDistributionServiceError {} /// Responsible of synchronizing with Cardano stake distribution. -#[cfg_attr(test, automock)] +#[cfg_attr(test, mockall::automock)] #[async_trait] pub trait StakeDistributionService: Sync + Send { /// Return the stake distribution fot the given epoch. diff --git a/mithril-aggregator/src/signer_registerer.rs b/mithril-aggregator/src/signer_registerer.rs index 8830160c7f2..e314950b180 100644 --- a/mithril-aggregator/src/signer_registerer.rs +++ b/mithril-aggregator/src/signer_registerer.rs @@ -14,8 +14,6 @@ use mithril_common::{ use crate::VerificationKeyStorer; use mithril_common::chain_observer::ChainObserverError; -#[cfg(test)] -use mockall::automock; /// Error type for signer registerer service. #[derive(Error, Debug)] @@ -74,7 +72,7 @@ impl SignerRegistrationRound { } /// Trait to register a signer -#[cfg_attr(test, automock)] +#[cfg_attr(test, mockall::automock)] #[async_trait] pub trait SignerRegisterer: Sync + Send { /// Register a signer @@ -89,7 +87,7 @@ pub trait SignerRegisterer: Sync + Send { } /// Trait to open a signer registration round -#[cfg_attr(test, automock)] +#[cfg_attr(test, mockall::automock)] #[async_trait] pub trait SignerRegistrationRoundOpener: Sync + Send { /// Open a signer registration round @@ -104,7 +102,7 @@ pub trait SignerRegistrationRoundOpener: Sync + Send { } /// Signer recorder trait -#[cfg_attr(test, automock)] +#[cfg_attr(test, mockall::automock)] #[async_trait] pub trait SignerRecorder: Sync + Send { /// Record a signer registration diff --git a/mithril-aggregator/src/snapshot_uploaders/snapshot_uploader.rs b/mithril-aggregator/src/snapshot_uploaders/snapshot_uploader.rs index 7459e13d967..d76b4a746e4 100644 --- a/mithril-aggregator/src/snapshot_uploaders/snapshot_uploader.rs +++ b/mithril-aggregator/src/snapshot_uploaders/snapshot_uploader.rs @@ -2,13 +2,10 @@ use async_trait::async_trait; use mithril_common::StdResult; use std::path::Path; -#[cfg(test)] -use mockall::automock; - pub type SnapshotLocation = String; /// SnapshotUploader represents a snapshot uploader interactor -#[cfg_attr(test, automock)] +#[cfg_attr(test, mockall::automock)] #[async_trait] pub trait SnapshotUploader: Sync + Send { /// Upload a snapshot diff --git a/mithril-aggregator/src/store/verification_key_store.rs b/mithril-aggregator/src/store/verification_key_store.rs index 85499092941..dd8968f9668 100644 --- a/mithril-aggregator/src/store/verification_key_store.rs +++ b/mithril-aggregator/src/store/verification_key_store.rs @@ -7,16 +7,13 @@ use tokio::sync::RwLock; use mithril_common::entities::{Epoch, PartyId, Signer, SignerWithStake}; use mithril_persistence::store::adapter::StoreAdapter; -#[cfg(test)] -use mockall::automock; - type Adapter = Box>>; /// Store and get signers verification keys for given epoch. /// /// Important note: This store works on the **recording** epoch, the epoch at which the signers /// are signed into a certificate so they can sign single signatures at the next epoch. -#[cfg_attr(test, automock)] +#[cfg_attr(test, mockall::automock)] #[async_trait] pub trait VerificationKeyStorer: Sync + Send { /// Save the verification key, for the given [Signer] for the given [Epoch], returns the diff --git a/mithril-aggregator/src/tools/remote_file_uploader.rs b/mithril-aggregator/src/tools/remote_file_uploader.rs index 19c06b5ac05..2e1594ef7b9 100644 --- a/mithril-aggregator/src/tools/remote_file_uploader.rs +++ b/mithril-aggregator/src/tools/remote_file_uploader.rs @@ -9,11 +9,8 @@ use slog_scope::info; use std::{env, path::Path}; use tokio_util::{codec::BytesCodec, codec::FramedRead}; -#[cfg(test)] -use mockall::automock; - /// RemoteFileUploader represents a remote file uploader interactor -#[cfg_attr(test, automock)] +#[cfg_attr(test, mockall::automock)] #[async_trait] pub trait RemoteFileUploader: Sync + Send { /// Upload a snapshot diff --git a/mithril-aggregator/src/tools/signer_importer.rs b/mithril-aggregator/src/tools/signer_importer.rs index eec1a1c045f..cedaa01ebec 100644 --- a/mithril-aggregator/src/tools/signer_importer.rs +++ b/mithril-aggregator/src/tools/signer_importer.rs @@ -10,8 +10,6 @@ use std::time::Duration; use crate::database::repository::SignerStore; -#[cfg(test)] -use mockall::automock; use slog_scope::{info, warn}; pub type PoolTicker = String; @@ -66,7 +64,7 @@ impl SignersImporter { } /// Trait that define how a [SignersImporter] retrieve the signers to import. -#[cfg_attr(test, automock)] +#[cfg_attr(test, mockall::automock)] #[async_trait] pub trait SignersImporterRetriever: Sync + Send { /// Retrieve the signers list. @@ -74,7 +72,7 @@ pub trait SignersImporterRetriever: Sync + Send { } /// Trait that define how a [SignersImporter] persist the retrieved signers. -#[cfg_attr(test, automock)] +#[cfg_attr(test, mockall::automock)] #[async_trait] pub trait SignersImporterPersister: Sync + Send { /// Persist the given list of signers. From d40dd6bf7b21731dd38e64336e4e2645471a1e6a Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Fri, 11 Oct 2024 11:00:04 +0200 Subject: [PATCH 253/274] feat(common): new logger extension to create logger with given name To create child logger when there's no component to hold them (such as the http server in aggregator). --- mithril-common/src/logging.rs | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/mithril-common/src/logging.rs b/mithril-common/src/logging.rs index 9b4ae29baa0..60fc5a7a083 100644 --- a/mithril-common/src/logging.rs +++ b/mithril-common/src/logging.rs @@ -6,11 +6,18 @@ use slog::Logger; pub trait LoggerExtensions { /// Create a new child logger with a `src` key containing the component name. fn new_with_component_name(&self) -> Self; + + /// Create a new child logger with a `src` key containing the provided name. + fn new_with_name(&self, name: &str) -> Self; } impl LoggerExtensions for Logger { fn new_with_component_name(&self) -> Self { - self.new(slog::o!("src" => component_name::())) + self.new_with_name(component_name::()) + } + + fn new_with_name(&self, name: &str) -> Self { + self.new(slog::o!("src" => name.to_owned())) } } @@ -78,4 +85,22 @@ mod tests { "log should contain `src` key for `TestStruct` as component name was provided, logs:\n{logs}" ); } + + #[test] + fn logger_extension_new_with_name() { + let expected_name = "my name"; + let log_path = + TempDir::create("common_logging", "logger_extension_new_with_name").join("test.log"); + { + let root_logger = TestLogger::file(&log_path); + let child_logger = root_logger.new_with_name(expected_name); + info!(child_logger, "Child log"); + } + + let logs = std::fs::read_to_string(&log_path).unwrap(); + assert!( + logs.contains("src") && logs.contains(expected_name), + "log should contain `src` key for `{expected_name}` as a name was provided, logs:\n{logs}" + ); + } } From b153b5ff88294da5f95e81244852a4ccd2d0885b Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Fri, 11 Oct 2024 11:24:31 +0200 Subject: [PATCH 254/274] refactor(aggregator): add a child logger to all components that use logs * Tagged with the component name. * Existing logs are still using `slog_scope` but this prepare its removal. --- .../cardano_immutable_files_full.rs | 15 ++++- .../src/commands/tools_command.rs | 1 + .../src/dependency_injection/builder.rs | 35 ++++++++--- .../src/dependency_injection/containers.rs | 4 ++ mithril-aggregator/src/event_store/runner.rs | 13 ++-- .../src/event_store/transmitter_service.rs | 14 +++-- .../src/http_server/routes/middlewares.rs | 11 +++- .../src/http_server/routes/mod.rs | 5 ++ mithril-aggregator/src/multi_signer.rs | 61 +++++++++++-------- mithril-aggregator/src/runtime/runner.rs | 9 ++- .../src/runtime/state_machine.rs | 14 +++-- .../services/cardano_transactions_importer.rs | 3 +- .../services/certifier/buffered_certifier.rs | 3 +- .../services/certifier/certifier_service.rs | 10 +-- .../src/services/epoch_service.rs | 7 +++ mithril-aggregator/src/services/prover.rs | 8 ++- .../src/services/signed_entity.rs | 8 +++ mithril-aggregator/src/services/upkeep.rs | 3 +- .../local_snapshot_uploader.rs | 28 ++++++--- .../remote_snapshot_uploader.rs | 27 ++++++-- mithril-aggregator/src/snapshotter.rs | 16 ++++- .../src/tools/certificates_hash_migrator.rs | 8 +++ .../src/tools/remote_file_uploader.rs | 13 +++- .../src/tools/signer_importer.rs | 60 ++++++++++++++---- .../tools/single_signature_authenticator.rs | 3 +- 25 files changed, 289 insertions(+), 90 deletions(-) diff --git a/mithril-aggregator/src/artifact_builder/cardano_immutable_files_full.rs b/mithril-aggregator/src/artifact_builder/cardano_immutable_files_full.rs index e8104acbe6e..63e0413a18d 100644 --- a/mithril-aggregator/src/artifact_builder/cardano_immutable_files_full.rs +++ b/mithril-aggregator/src/artifact_builder/cardano_immutable_files_full.rs @@ -1,6 +1,7 @@ use anyhow::Context; use async_trait::async_trait; use semver::Version; +use slog::Logger; use slog_scope::{debug, warn}; use std::sync::Arc; use thiserror::Error; @@ -11,6 +12,7 @@ use crate::{ }; use super::ArtifactBuilder; +use mithril_common::logging::LoggerExtensions; use mithril_common::{ entities::{ CardanoDbBeacon, Certificate, CompressionAlgorithm, ProtocolMessagePartKey, Snapshot, @@ -33,6 +35,7 @@ pub struct CardanoImmutableFilesFullArtifactBuilder { snapshotter: Arc, snapshot_uploader: Arc, compression_algorithm: CompressionAlgorithm, + logger: Logger, } impl CardanoImmutableFilesFullArtifactBuilder { @@ -42,12 +45,14 @@ impl CardanoImmutableFilesFullArtifactBuilder { snapshotter: Arc, snapshot_uploader: Arc, compression_algorithm: CompressionAlgorithm, + logger: Logger, ) -> Self { Self { cardano_node_version: cardano_node_version.clone(), snapshotter, snapshot_uploader, compression_algorithm, + logger: logger.new_with_component_name::(), } } @@ -167,7 +172,10 @@ mod tests { use super::*; - use crate::{snapshot_uploaders::MockSnapshotUploader, DumbSnapshotUploader, DumbSnapshotter}; + use crate::{ + snapshot_uploaders::MockSnapshotUploader, test_tools::TestLogger, DumbSnapshotUploader, + DumbSnapshotter, + }; #[tokio::test] async fn should_compute_valid_artifact() { @@ -187,6 +195,7 @@ mod tests { dumb_snapshotter.clone(), dumb_snapshot_uploader.clone(), CompressionAlgorithm::Zstandard, + TestLogger::stdout(), ); let artifact = cardano_immutable_files_full_artifact_builder .compute_artifact(beacon.clone(), &certificate) @@ -224,6 +233,7 @@ mod tests { Arc::new(DumbSnapshotter::new()), Arc::new(DumbSnapshotUploader::new()), CompressionAlgorithm::default(), + TestLogger::stdout(), ); cardano_immutable_files_full_artifact_builder @@ -248,6 +258,7 @@ mod tests { Arc::new(DumbSnapshotter::new()), Arc::new(DumbSnapshotUploader::new()), CompressionAlgorithm::Gzip, + TestLogger::stdout(), ); let ongoing_snapshot = cardano_immutable_files_full_artifact_builder @@ -275,6 +286,7 @@ mod tests { Arc::new(DumbSnapshotter::new()), Arc::new(DumbSnapshotUploader::new()), algorithm, + TestLogger::stdout(), ); let ongoing_snapshot = cardano_immutable_files_full_artifact_builder @@ -316,6 +328,7 @@ mod tests { Arc::new(DumbSnapshotter::new()), Arc::new(snapshot_uploader), CompressionAlgorithm::default(), + TestLogger::stdout(), ); cardano_immutable_files_full_artifact_builder diff --git a/mithril-aggregator/src/commands/tools_command.rs b/mithril-aggregator/src/commands/tools_command.rs index 4ba49759a48..5f0faba0ece 100644 --- a/mithril-aggregator/src/commands/tools_command.rs +++ b/mithril-aggregator/src/commands/tools_command.rs @@ -67,6 +67,7 @@ impl RecomputeCertificatesHashCommand { let migrator = CertificatesHashMigrator::new( CertificateRepository::new(connection.clone()), Arc::new(SignedEntityStore::new(connection.clone())), + dependencies_builder.get_logger()?, ); migrator diff --git a/mithril-aggregator/src/dependency_injection/builder.rs b/mithril-aggregator/src/dependency_injection/builder.rs index 01d0d7d0898..ce70cd0e66a 100644 --- a/mithril-aggregator/src/dependency_injection/builder.rs +++ b/mithril-aggregator/src/dependency_injection/builder.rs @@ -417,6 +417,7 @@ impl DependenciesBuilder { } async fn build_snapshot_uploader(&mut self) -> Result> { + let logger = self.get_logger()?; if self.configuration.environment == ExecutionEnvironment::Production { match self.configuration.snapshot_uploader_type { SnapshotUploaderType::Gcp => { @@ -431,14 +432,16 @@ impl DependenciesBuilder { })?; Ok(Arc::new(RemoteSnapshotUploader::new( - Box::new(GcpFileUploader::new(bucket.clone())), + Box::new(GcpFileUploader::new(bucket.clone(), logger.clone())), bucket, self.configuration.snapshot_use_cdn_domain, + logger, ))) } SnapshotUploaderType::Local => Ok(Arc::new(LocalSnapshotUploader::new( self.configuration.get_server_url(), &self.configuration.snapshot_directory, + logger, ))), } } else { @@ -456,7 +459,8 @@ impl DependenciesBuilder { } async fn build_multi_signer(&mut self) -> Result> { - let multi_signer = MultiSignerImpl::new(self.get_epoch_service().await?); + let multi_signer = + MultiSignerImpl::new(self.get_epoch_service().await?, self.get_logger()?); Ok(Arc::new(multi_signer)) } @@ -823,6 +827,7 @@ impl DependenciesBuilder { self.configuration.db_directory.clone(), ongoing_snapshot_directory, algorithm, + self.get_logger()?, )?) } _ => Arc::new(DumbSnapshotter::new()), @@ -1025,7 +1030,7 @@ impl DependenciesBuilder { async fn build_event_transmitter(&mut self) -> Result>> { let sender = self.get_event_transmitter_sender().await?; - let event_transmitter = Arc::new(TransmitterService::new(sender)); + let event_transmitter = Arc::new(TransmitterService::new(sender, self.get_logger()?)); Ok(event_transmitter) } @@ -1157,6 +1162,7 @@ impl DependenciesBuilder { } async fn build_signed_entity_service(&mut self) -> Result> { + let logger = self.get_logger()?; let signed_entity_storer = self.build_signed_entity_storer().await?; let epoch_service = self.get_epoch_service().await?; let mithril_stake_distribution_artifact_builder = Arc::new( @@ -1172,6 +1178,7 @@ impl DependenciesBuilder { snapshotter, snapshot_uploader, self.configuration.snapshot_compression_algorithm, + logger.clone(), )); let prover_service = self.get_prover_service().await?; let cardano_transactions_artifact_builder = Arc::new( @@ -1187,6 +1194,7 @@ impl DependenciesBuilder { cardano_transactions_artifact_builder, self.get_signed_entity_lock().await?, cardano_stake_distribution_artifact_builder, + logger, )); // Compute the cache pool for prover service @@ -1226,6 +1234,7 @@ impl DependenciesBuilder { verification_key_store, network, allowed_discriminants, + self.get_logger()?, ))); Ok(epoch_service) @@ -1344,6 +1353,7 @@ impl DependenciesBuilder { let dependency_manager = DependencyContainer { config: self.configuration.clone(), allowed_discriminants: self.get_allowed_signed_entity_types_discriminants()?, + root_logger: self.get_logger()?, sqlite_connection: self.get_sqlite_connection().await?, sqlite_connection_cardano_transaction_pool: self .get_sqlite_connection_cardano_transaction_pool() @@ -1391,7 +1401,10 @@ impl DependenciesBuilder { /// Create dependencies for the [EventStore] task. pub async fn create_event_store(&mut self) -> Result { - let event_store = EventStore::new(self.get_event_transmitter_receiver().await?); + let event_store = EventStore::new( + self.get_event_transmitter_receiver().await?, + self.get_logger()?, + ); Ok(event_store) } @@ -1405,6 +1418,7 @@ impl DependenciesBuilder { config, None, Arc::new(AggregatorRunner::new(dependency_container)), + self.get_logger()?, ) .await .map_err(|e| DependenciesBuilderError::Initialization { @@ -1472,11 +1486,18 @@ impl DependenciesBuilder { &mut self, cexplorer_pools_url: &str, ) -> Result { - let retriever = - CExplorerSignerRetriever::new(cexplorer_pools_url, Some(Duration::from_secs(30)))?; + let retriever = CExplorerSignerRetriever::new( + cexplorer_pools_url, + Some(Duration::from_secs(30)), + self.get_logger()?, + )?; let persister = self.get_signer_store().await?; - Ok(SignersImporter::new(Arc::new(retriever), persister)) + Ok(SignersImporter::new( + Arc::new(retriever), + persister, + self.get_logger()?, + )) } /// Create [TickerService] instance. diff --git a/mithril-aggregator/src/dependency_injection/containers.rs b/mithril-aggregator/src/dependency_injection/containers.rs index c23ca6d58e2..5a8efa3c616 100644 --- a/mithril-aggregator/src/dependency_injection/containers.rs +++ b/mithril-aggregator/src/dependency_injection/containers.rs @@ -1,3 +1,4 @@ +use slog::Logger; use std::{collections::BTreeSet, sync::Arc}; use tokio::sync::RwLock; @@ -53,6 +54,9 @@ pub struct DependencyContainer { /// List of signed entity discriminants that are allowed to be processed pub allowed_discriminants: BTreeSet, + /// Application root logger + pub root_logger: Logger, + /// SQLite database connection /// /// This is not a real service, but it is needed to instantiate all store diff --git a/mithril-aggregator/src/event_store/runner.rs b/mithril-aggregator/src/event_store/runner.rs index d19cb66b40c..a5636e67047 100644 --- a/mithril-aggregator/src/event_store/runner.rs +++ b/mithril-aggregator/src/event_store/runner.rs @@ -1,22 +1,27 @@ use anyhow::Context; +use mithril_common::logging::LoggerExtensions; +use mithril_common::StdResult; +use slog::Logger; use slog_scope::{debug, info}; use sqlite::Connection; use std::{path::PathBuf, sync::Arc}; use tokio::sync::mpsc::UnboundedReceiver; -use mithril_common::StdResult; - use super::{EventMessage, EventPersister}; /// EventMessage receiver service. pub struct EventStore { receiver: UnboundedReceiver, + logger: Logger, } impl EventStore { /// Instantiate the EventMessage receiver service. - pub fn new(receiver: UnboundedReceiver) -> Self { - Self { receiver } + pub fn new(receiver: UnboundedReceiver, logger: Logger) -> Self { + Self { + receiver, + logger: logger.new_with_component_name::(), + } } /// Launch the service. It runs until all the transmitters are gone and all diff --git a/mithril-aggregator/src/event_store/transmitter_service.rs b/mithril-aggregator/src/event_store/transmitter_service.rs index 9b5df027a1c..2af94a39aa5 100644 --- a/mithril-aggregator/src/event_store/transmitter_service.rs +++ b/mithril-aggregator/src/event_store/transmitter_service.rs @@ -1,9 +1,11 @@ -use std::fmt::Debug; - use serde::Serialize; +use slog::Logger; use slog_scope::warn; +use std::fmt::Debug; use tokio::sync::mpsc::UnboundedSender; +use mithril_common::logging::LoggerExtensions; + use super::EventMessage; /// The transmitter service is used to allow inter process channel @@ -13,6 +15,7 @@ where MSG: Debug + Sync + Send, { transmitter: UnboundedSender, + logger: Logger, } impl TransmitterService @@ -20,8 +23,11 @@ where MSG: Debug + Sync + Send, { /// Instantiate a new Service by passing a MPSC transmitter. - pub fn new(transmitter: UnboundedSender) -> Self { - Self { transmitter } + pub fn new(transmitter: UnboundedSender, logger: Logger) -> Self { + Self { + transmitter, + logger: logger.new_with_component_name::(), + } } /// Clone the internal transmitter and return it. diff --git a/mithril-aggregator/src/http_server/routes/middlewares.rs b/mithril-aggregator/src/http_server/routes/middlewares.rs index 267a410d90d..995746b49de 100644 --- a/mithril-aggregator/src/http_server/routes/middlewares.rs +++ b/mithril-aggregator/src/http_server/routes/middlewares.rs @@ -1,7 +1,7 @@ +use slog::Logger; use std::collections::BTreeSet; use std::convert::Infallible; use std::sync::Arc; - use warp::Filter; use mithril_common::api_version::APIVersionProvider; @@ -10,12 +10,21 @@ use mithril_common::entities::SignedEntityTypeDiscriminants; use crate::database::repository::SignerGetter; use crate::dependency_injection::EpochServiceWrapper; use crate::event_store::{EventMessage, TransmitterService}; +use crate::http_server::routes::http_server_child_logger; use crate::services::{CertifierService, MessageService, ProverService, SignedEntityService}; use crate::{ CertificatePendingStore, Configuration, DependencyContainer, SignerRegisterer, SingleSignatureAuthenticator, VerificationKeyStorer, }; +/// With logger middleware +pub(crate) fn with_logger( + dependency_manager: &DependencyContainer, +) -> impl Filter + Clone { + let logger = http_server_child_logger(&dependency_manager.root_logger); + warp::any().map(move || logger.clone()) +} + /// With certificate pending store pub(crate) fn with_certificate_pending_store( dependency_manager: &DependencyContainer, diff --git a/mithril-aggregator/src/http_server/routes/mod.rs b/mithril-aggregator/src/http_server/routes/mod.rs index d806afe4326..a4a6eca6338 100644 --- a/mithril-aggregator/src/http_server/routes/mod.rs +++ b/mithril-aggregator/src/http_server/routes/mod.rs @@ -26,3 +26,8 @@ macro_rules! unwrap_to_internal_server_error { } }; } + +pub(crate) fn http_server_child_logger(logger: &slog::Logger) -> slog::Logger { + use mithril_common::logging::LoggerExtensions; + logger.new_with_name("http_server") +} diff --git a/mithril-aggregator/src/multi_signer.rs b/mithril-aggregator/src/multi_signer.rs index 865cb5e5ac8..1fe8f9a3a98 100644 --- a/mithril-aggregator/src/multi_signer.rs +++ b/mithril-aggregator/src/multi_signer.rs @@ -1,10 +1,12 @@ use anyhow::{anyhow, Context}; use async_trait::async_trait; +use slog::Logger; use slog_scope::{debug, warn}; use mithril_common::{ crypto_helper::{ProtocolAggregationError, ProtocolMultiSignature}, entities::{self}, + logging::LoggerExtensions, protocol::MultiSigner as ProtocolMultiSigner, StdResult, }; @@ -40,13 +42,17 @@ pub trait MultiSigner: Sync + Send { /// MultiSignerImpl is an implementation of the MultiSigner pub struct MultiSignerImpl { epoch_service: EpochServiceWrapper, + logger: Logger, } impl MultiSignerImpl { /// MultiSignerImpl factory - pub fn new(epoch_service: EpochServiceWrapper) -> Self { + pub fn new(epoch_service: EpochServiceWrapper, logger: Logger) -> Self { debug!("New MultiSignerImpl created"); - Self { epoch_service } + Self { + epoch_service, + logger: logger.new_with_component_name::(), + } } fn run_verify_single_signature( @@ -141,6 +147,7 @@ mod tests { use crate::entities::AggregatorEpochSettings; use crate::services::{FakeEpochService, FakeEpochServiceBuilder}; + use crate::test_tools::TestLogger; use super::*; @@ -169,26 +176,29 @@ mod tests { let epoch = Epoch(5); let fixture = MithrilFixtureBuilder::default().with_signers(5).build(); let next_fixture = MithrilFixtureBuilder::default().with_signers(4).build(); - let multi_signer = MultiSignerImpl::new(Arc::new(RwLock::new( - FakeEpochServiceBuilder { - epoch_settings: AggregatorEpochSettings { - protocol_parameters: fixture.protocol_parameters(), - ..AggregatorEpochSettings::dummy() - }, - next_epoch_settings: AggregatorEpochSettings { - protocol_parameters: next_fixture.protocol_parameters(), - ..AggregatorEpochSettings::dummy() - }, - upcoming_epoch_settings: AggregatorEpochSettings { - protocol_parameters: next_fixture.protocol_parameters(), - ..AggregatorEpochSettings::dummy() - }, - current_signers_with_stake: fixture.signers_with_stake(), - next_signers_with_stake: next_fixture.signers_with_stake(), - ..FakeEpochServiceBuilder::dummy(epoch) - } - .build(), - ))); + let multi_signer = MultiSignerImpl::new( + Arc::new(RwLock::new( + FakeEpochServiceBuilder { + epoch_settings: AggregatorEpochSettings { + protocol_parameters: fixture.protocol_parameters(), + ..AggregatorEpochSettings::dummy() + }, + next_epoch_settings: AggregatorEpochSettings { + protocol_parameters: next_fixture.protocol_parameters(), + ..AggregatorEpochSettings::dummy() + }, + upcoming_epoch_settings: AggregatorEpochSettings { + protocol_parameters: next_fixture.protocol_parameters(), + ..AggregatorEpochSettings::dummy() + }, + current_signers_with_stake: fixture.signers_with_stake(), + next_signers_with_stake: next_fixture.signers_with_stake(), + ..FakeEpochServiceBuilder::dummy(epoch) + } + .build(), + )), + TestLogger::stdout(), + ); { let message = setup_message(); @@ -226,9 +236,10 @@ mod tests { let epoch = Epoch(5); let fixture = MithrilFixtureBuilder::default().with_signers(5).build(); let protocol_parameters = fixture.protocol_parameters(); - let multi_signer = MultiSignerImpl::new(Arc::new(RwLock::new( - FakeEpochService::from_fixture(epoch, &fixture), - ))); + let multi_signer = MultiSignerImpl::new( + Arc::new(RwLock::new(FakeEpochService::from_fixture(epoch, &fixture))), + TestLogger::stdout(), + ); let message = setup_message(); diff --git a/mithril-aggregator/src/runtime/runner.rs b/mithril-aggregator/src/runtime/runner.rs index fce0016216b..772fdddb3ef 100644 --- a/mithril-aggregator/src/runtime/runner.rs +++ b/mithril-aggregator/src/runtime/runner.rs @@ -1,5 +1,6 @@ use anyhow::{anyhow, Context}; use async_trait::async_trait; +use slog::Logger; use slog_scope::{debug, warn}; use std::sync::Arc; use std::time::Duration; @@ -7,6 +8,7 @@ use std::time::Duration; use mithril_common::entities::{ Certificate, CertificatePending, Epoch, ProtocolMessage, SignedEntityType, Signer, TimePoint, }; +use mithril_common::logging::LoggerExtensions; use mithril_common::StdResult; use mithril_persistence::store::StakeStorer; @@ -133,12 +135,17 @@ pub trait AggregatorRunnerTrait: Sync + Send { /// holds services and configuration. pub struct AggregatorRunner { dependencies: Arc, + logger: Logger, } impl AggregatorRunner { /// Create a new instance of the Aggregator Runner. pub fn new(dependencies: Arc) -> Self { - Self { dependencies } + let logger = dependencies.root_logger.new_with_component_name::(); + Self { + dependencies, + logger, + } } async fn list_available_signed_entity_types( diff --git a/mithril-aggregator/src/runtime/state_machine.rs b/mithril-aggregator/src/runtime/state_machine.rs index 19f8d04721a..133a147ff68 100644 --- a/mithril-aggregator/src/runtime/state_machine.rs +++ b/mithril-aggregator/src/runtime/state_machine.rs @@ -6,6 +6,8 @@ use crate::{ use anyhow::Context; use mithril_common::entities::TimePoint; +use mithril_common::logging::LoggerExtensions; +use slog::Logger; use slog_scope::{crit, info, trace, warn}; use std::fmt::Display; use std::sync::Arc; @@ -57,14 +59,10 @@ impl Display for AggregatorState { /// [documentation](https://mithril.network/doc/mithril/mithril-network/aggregator#under-the-hood) /// for more explanations about the Aggregator state machine. pub struct AggregatorRuntime { - /// Configuration config: AggregatorConfig, - - /// the internal state of the automate state: AggregatorState, - - /// specific runner for this state machine runner: Arc, + logger: Logger, } impl AggregatorRuntime { @@ -73,7 +71,9 @@ impl AggregatorRuntime { aggregator_config: AggregatorConfig, init_state: Option, runner: Arc, + logger: Logger, ) -> Result { + let logger = logger.new_with_component_name::(); info!("initializing runtime"); let state = if let Some(init_state) = init_state { @@ -90,6 +90,7 @@ impl AggregatorRuntime { config: aggregator_config, state, runner, + logger, }) } @@ -398,6 +399,8 @@ mod tests { use mithril_common::test_utils::fake_data; + use crate::test_tools::TestLogger; + use super::super::runner::MockAggregatorRunner; use super::*; @@ -409,6 +412,7 @@ mod tests { AggregatorConfig::new(Duration::from_millis(20)), init_state, Arc::new(runner), + TestLogger::stdout(), ) .await .unwrap() diff --git a/mithril-aggregator/src/services/cardano_transactions_importer.rs b/mithril-aggregator/src/services/cardano_transactions_importer.rs index 8413fea87e0..9c71b8a792a 100644 --- a/mithril-aggregator/src/services/cardano_transactions_importer.rs +++ b/mithril-aggregator/src/services/cardano_transactions_importer.rs @@ -12,6 +12,7 @@ use mithril_common::crypto_helper::{MKTree, MKTreeNode, MKTreeStoreInMemory}; use mithril_common::entities::{ BlockNumber, BlockRange, CardanoTransaction, ChainPoint, SlotNumber, }; +use mithril_common::logging::LoggerExtensions; use mithril_common::signable_builder::TransactionsImporter; use mithril_common::StdResult; @@ -68,7 +69,7 @@ impl CardanoTransactionsImporter { Self { block_scanner, transaction_store, - logger, + logger: logger.new_with_component_name::(), } } diff --git a/mithril-aggregator/src/services/certifier/buffered_certifier.rs b/mithril-aggregator/src/services/certifier/buffered_certifier.rs index 7edf5538798..9c8cf1025e4 100644 --- a/mithril-aggregator/src/services/certifier/buffered_certifier.rs +++ b/mithril-aggregator/src/services/certifier/buffered_certifier.rs @@ -6,6 +6,7 @@ use mithril_common::entities::{ Certificate, Epoch, ProtocolMessage, SignedEntityType, SignedEntityTypeDiscriminants, SingleSignatures, }; +use mithril_common::logging::LoggerExtensions; use mithril_common::StdResult; use crate::entities::OpenMessage; @@ -35,7 +36,7 @@ impl BufferedCertifierService { Self { certifier_service, buffered_single_signature_store, - logger, + logger: logger.new_with_component_name::(), } } diff --git a/mithril-aggregator/src/services/certifier/certifier_service.rs b/mithril-aggregator/src/services/certifier/certifier_service.rs index a2c26097cfc..99b3d368ac8 100644 --- a/mithril-aggregator/src/services/certifier/certifier_service.rs +++ b/mithril-aggregator/src/services/certifier/certifier_service.rs @@ -11,6 +11,7 @@ use mithril_common::entities::{ Certificate, CertificateMetadata, CertificateSignature, Epoch, ProtocolMessage, SignedEntityType, SingleSignatures, StakeDistributionParty, }; +use mithril_common::logging::LoggerExtensions; use mithril_common::protocol::ToMessage; use mithril_common::{CardanoNetwork, StdResult, TickerService}; @@ -35,7 +36,7 @@ pub struct MithrilCertifierService { // todo: should be removed after removing immutable file number from the certificate metadata ticker_service: Arc, epoch_service: EpochServiceWrapper, - _logger: Logger, + logger: Logger, } impl MithrilCertifierService { @@ -63,7 +64,7 @@ impl MithrilCertifierService { genesis_verifier, ticker_service, epoch_service, - _logger: logger, + logger: logger.new_with_component_name::(), } } @@ -378,7 +379,7 @@ impl CertifierService for MithrilCertifierService { mod tests { use crate::{ dependency_injection::DependenciesBuilder, multi_signer::MockMultiSigner, - services::FakeEpochService, Configuration, + services::FakeEpochService, test_tools::TestLogger, Configuration, }; use chrono::{DateTime, Days}; use mithril_common::{ @@ -404,7 +405,6 @@ mod tests { let multi_signer = dependency_builder.get_multi_signer().await.unwrap(); let ticker_service = dependency_builder.get_ticker_service().await.unwrap(); let epoch_service = dependency_builder.get_epoch_service().await.unwrap(); - let logger = dependency_builder.get_logger().unwrap(); Self::new( network, @@ -416,7 +416,7 @@ mod tests { multi_signer, ticker_service, epoch_service, - logger, + TestLogger::stdout(), ) } } diff --git a/mithril-aggregator/src/services/epoch_service.rs b/mithril-aggregator/src/services/epoch_service.rs index 8183e6bbb41..8f9ca7f949c 100644 --- a/mithril-aggregator/src/services/epoch_service.rs +++ b/mithril-aggregator/src/services/epoch_service.rs @@ -1,5 +1,6 @@ use anyhow::Context; use async_trait::async_trait; +use slog::Logger; use slog_scope::debug; use std::collections::BTreeSet; use std::sync::Arc; @@ -10,6 +11,7 @@ use mithril_common::entities::{ CardanoTransactionsSigningConfig, Epoch, ProtocolParameters, SignedEntityConfig, SignedEntityTypeDiscriminants, Signer, SignerWithStake, }; +use mithril_common::logging::LoggerExtensions; use mithril_common::protocol::{MultiSigner as ProtocolMultiSigner, SignerBuilder}; use mithril_common::{CardanoNetwork, StdResult}; @@ -130,6 +132,7 @@ pub struct MithrilEpochService { verification_key_store: Arc, network: CardanoNetwork, allowed_signed_entity_discriminants: BTreeSet, + logger: Logger, } impl MithrilEpochService { @@ -140,6 +143,7 @@ impl MithrilEpochService { verification_key_store: Arc, network: CardanoNetwork, allowed_discriminants: BTreeSet, + logger: Logger, ) -> Self { Self { future_epoch_settings, @@ -149,6 +153,7 @@ impl MithrilEpochService { verification_key_store, network, allowed_signed_entity_discriminants: allowed_discriminants, + logger: logger.new_with_component_name::(), } } @@ -648,6 +653,7 @@ mod tests { use std::collections::{BTreeSet, HashMap}; use crate::store::FakeEpochSettingsStorer; + use crate::test_tools::TestLogger; use crate::VerificationKeyStore; use super::*; @@ -801,6 +807,7 @@ mod tests { Arc::new(vkey_store), self.network, self.allowed_discriminants, + TestLogger::stdout(), ) } } diff --git a/mithril-aggregator/src/services/prover.rs b/mithril-aggregator/src/services/prover.rs index 02464f3ac2f..34d86b4920b 100644 --- a/mithril-aggregator/src/services/prover.rs +++ b/mithril-aggregator/src/services/prover.rs @@ -12,6 +12,7 @@ use mithril_common::{ entities::{ BlockNumber, BlockRange, CardanoTransaction, CardanoTransactionsSetProof, TransactionHash, }, + logging::LoggerExtensions, resource_pool::ResourcePool, signable_builder::BlockRangeRootRetriever, StdResult, @@ -70,7 +71,7 @@ impl MithrilProverService { transaction_retriever, block_range_root_retriever, mk_map_pool: ResourcePool::new(mk_map_pool_size, vec![]), - logger, + logger: logger.new_with_component_name::(), } } @@ -219,6 +220,8 @@ mod tests { use mockall::mock; use mockall::predicate::eq; + use crate::test_tools::TestLogger; + use super::*; mock! { @@ -366,13 +369,12 @@ mod tests { let mut block_range_root_retriever = MockBlockRangeRootRetrieverImpl::new(); block_range_root_retriever_mock_config(&mut block_range_root_retriever); let mk_map_pool_size = 1; - let logger = slog_scope::logger(); MithrilProverService::new( Arc::new(transaction_retriever), Arc::new(block_range_root_retriever), mk_map_pool_size, - logger, + TestLogger::stdout(), ) } diff --git a/mithril-aggregator/src/services/signed_entity.rs b/mithril-aggregator/src/services/signed_entity.rs index eca3a5bf55b..481497ea3ed 100644 --- a/mithril-aggregator/src/services/signed_entity.rs +++ b/mithril-aggregator/src/services/signed_entity.rs @@ -5,6 +5,7 @@ use anyhow::{anyhow, Context}; use async_trait::async_trait; use chrono::Utc; +use slog::Logger; use slog_scope::info; use std::sync::Arc; use tokio::task::JoinHandle; @@ -15,6 +16,7 @@ use mithril_common::{ Certificate, Epoch, MithrilStakeDistribution, SignedEntity, SignedEntityType, SignedEntityTypeDiscriminants, Snapshot, }, + logging::LoggerExtensions, signable_builder::Artifact, signed_entity_type_lock::SignedEntityTypeLock, StdResult, @@ -87,6 +89,7 @@ pub struct MithrilSignedEntityService { signed_entity_type_lock: Arc, cardano_stake_distribution_artifact_builder: Arc>, + logger: Logger, } impl MithrilSignedEntityService { @@ -106,6 +109,7 @@ impl MithrilSignedEntityService { cardano_stake_distribution_artifact_builder: Arc< dyn ArtifactBuilder, >, + logger: Logger, ) -> Self { Self { signed_entity_storer, @@ -114,6 +118,7 @@ impl MithrilSignedEntityService { cardano_transactions_artifact_builder, signed_entity_type_lock, cardano_stake_distribution_artifact_builder, + logger: logger.new_with_component_name::(), } } @@ -397,6 +402,7 @@ mod tests { use crate::artifact_builder::MockArtifactBuilder; use crate::database::repository::MockSignedEntityStorer; + use crate::test_tools::TestLogger; use super::*; @@ -470,6 +476,7 @@ mod tests { Arc::new(self.mock_cardano_transactions_artifact_builder), Arc::new(SignedEntityTypeLock::default()), Arc::new(self.mock_cardano_stake_distribution_artifact_builder), + TestLogger::stdout(), ) } @@ -521,6 +528,7 @@ mod tests { Arc::new(self.mock_cardano_transactions_artifact_builder), Arc::new(SignedEntityTypeLock::default()), Arc::new(self.mock_cardano_stake_distribution_artifact_builder), + TestLogger::stdout(), ) } diff --git a/mithril-aggregator/src/services/upkeep.rs b/mithril-aggregator/src/services/upkeep.rs index c3e59434c3c..533e672e618 100644 --- a/mithril-aggregator/src/services/upkeep.rs +++ b/mithril-aggregator/src/services/upkeep.rs @@ -11,6 +11,7 @@ use anyhow::Context; use async_trait::async_trait; use slog::{info, Logger}; +use mithril_common::logging::LoggerExtensions; use mithril_common::signed_entity_type_lock::SignedEntityTypeLock; use mithril_common::StdResult; use mithril_persistence::sqlite::{ @@ -48,7 +49,7 @@ impl AggregatorUpkeepService { main_db_connection, cardano_tx_connection_pool, signed_entity_type_lock, - logger, + logger: logger.new_with_component_name::(), } } diff --git a/mithril-aggregator/src/snapshot_uploaders/local_snapshot_uploader.rs b/mithril-aggregator/src/snapshot_uploaders/local_snapshot_uploader.rs index 384e427a315..31f52ccf72d 100644 --- a/mithril-aggregator/src/snapshot_uploaders/local_snapshot_uploader.rs +++ b/mithril-aggregator/src/snapshot_uploaders/local_snapshot_uploader.rs @@ -1,9 +1,12 @@ use anyhow::Context; use async_trait::async_trait; -use mithril_common::StdResult; +use slog::Logger; use slog_scope::debug; use std::path::{Path, PathBuf}; +use mithril_common::logging::LoggerExtensions; +use mithril_common::StdResult; + use crate::http_server; use crate::snapshot_uploaders::{SnapshotLocation, SnapshotUploader}; use crate::tools; @@ -15,15 +18,18 @@ pub struct LocalSnapshotUploader { /// Target folder where to store snapshots archive target_location: PathBuf, + + logger: Logger, } impl LocalSnapshotUploader { /// LocalSnapshotUploader factory - pub(crate) fn new(snapshot_server_url: String, target_location: &Path) -> Self { + pub(crate) fn new(snapshot_server_url: String, target_location: &Path, logger: Logger) -> Self { debug!("New LocalSnapshotUploader created"; "snapshot_server_url" => &snapshot_server_url); Self { snapshot_server_url, target_location: target_location.to_path_buf(), + logger: logger.new_with_component_name::(), } } } @@ -51,14 +57,17 @@ impl SnapshotUploader for LocalSnapshotUploader { #[cfg(test)] mod tests { - use super::LocalSnapshotUploader; - use crate::http_server; - use crate::snapshot_uploaders::SnapshotUploader; use std::fs::File; use std::io::Write; use std::path::{Path, PathBuf}; use tempfile::tempdir; + use crate::http_server; + use crate::snapshot_uploaders::SnapshotUploader; + use crate::test_tools::TestLogger; + + use super::LocalSnapshotUploader; + fn create_fake_archive(dir: &Path, digest: &str) -> PathBuf { let file_path = dir.join(format!("test.{digest}.tar.gz")); let mut file = File::create(&file_path).unwrap(); @@ -84,7 +93,7 @@ mod tests { http_server::SERVER_BASE_PATH, &digest ); - let uploader = LocalSnapshotUploader::new(url, target_dir.path()); + let uploader = LocalSnapshotUploader::new(url, target_dir.path(), TestLogger::stdout()); let location = uploader .upload_snapshot(&archive) @@ -100,8 +109,11 @@ mod tests { let target_dir = tempdir().unwrap(); let digest = "41e27b9ed5a32531b95b2b7ff3c0757591a06a337efaf19a524a998e348028e7"; let archive = create_fake_archive(source_dir.path(), digest); - let uploader = - LocalSnapshotUploader::new("http://test.com:8080/".to_string(), target_dir.path()); + let uploader = LocalSnapshotUploader::new( + "http://test.com:8080/".to_string(), + target_dir.path(), + TestLogger::stdout(), + ); uploader.upload_snapshot(&archive).await.unwrap(); assert!(target_dir diff --git a/mithril-aggregator/src/snapshot_uploaders/remote_snapshot_uploader.rs b/mithril-aggregator/src/snapshot_uploaders/remote_snapshot_uploader.rs index 47170ad2eab..036a2996480 100644 --- a/mithril-aggregator/src/snapshot_uploaders/remote_snapshot_uploader.rs +++ b/mithril-aggregator/src/snapshot_uploaders/remote_snapshot_uploader.rs @@ -1,8 +1,11 @@ use async_trait::async_trait; -use mithril_common::StdResult; +use slog::Logger; use slog_scope::debug; use std::path::Path; +use mithril_common::logging::LoggerExtensions; +use mithril_common::StdResult; + use crate::snapshot_uploaders::{SnapshotLocation, SnapshotUploader}; use crate::tools::RemoteFileUploader; @@ -11,6 +14,7 @@ pub struct RemoteSnapshotUploader { bucket: String, file_uploader: Box, use_cdn_domain: bool, + logger: Logger, } impl RemoteSnapshotUploader { @@ -19,12 +23,14 @@ impl RemoteSnapshotUploader { file_uploader: Box, bucket: String, use_cdn_domain: bool, + logger: Logger, ) -> Self { debug!("New GCPSnapshotUploader created"); Self { bucket, file_uploader, use_cdn_domain, + logger: logger.new_with_component_name::(), } } } @@ -50,12 +56,15 @@ impl SnapshotUploader for RemoteSnapshotUploader { #[cfg(test)] mod tests { - use super::RemoteSnapshotUploader; - use crate::snapshot_uploaders::SnapshotUploader; - use crate::tools::MockRemoteFileUploader; use anyhow::anyhow; use std::path::Path; + use crate::snapshot_uploaders::SnapshotUploader; + use crate::test_tools::TestLogger; + use crate::tools::MockRemoteFileUploader; + + use super::RemoteSnapshotUploader; + #[tokio::test] async fn test_upload_snapshot_not_using_cdn_domain_ok() { let use_cdn_domain = false; @@ -65,6 +74,7 @@ mod tests { Box::new(file_uploader), "cardano-testnet".to_string(), use_cdn_domain, + TestLogger::stdout(), ); let snapshot_filepath = Path::new("test/snapshot.xxx.tar.gz"); let expected_location = @@ -87,6 +97,7 @@ mod tests { Box::new(file_uploader), "cdn.mithril.network".to_string(), use_cdn_domain, + TestLogger::stdout(), ); let snapshot_filepath = Path::new("test/snapshot.xxx.tar.gz"); let expected_location = "https://cdn.mithril.network/snapshot.xxx.tar.gz".to_string(); @@ -105,8 +116,12 @@ mod tests { file_uploader .expect_upload_file() .returning(|_| Err(anyhow!("unexpected error"))); - let snapshot_uploader = - RemoteSnapshotUploader::new(Box::new(file_uploader), "".to_string(), false); + let snapshot_uploader = RemoteSnapshotUploader::new( + Box::new(file_uploader), + "".to_string(), + false, + TestLogger::stdout(), + ); let snapshot_filepath = Path::new("test/snapshot.xxx.tar.gz"); let result = snapshot_uploader diff --git a/mithril-aggregator/src/snapshotter.rs b/mithril-aggregator/src/snapshotter.rs index 9965794e6e4..d9f288dbbad 100644 --- a/mithril-aggregator/src/snapshotter.rs +++ b/mithril-aggregator/src/snapshotter.rs @@ -1,7 +1,7 @@ use anyhow::{anyhow, Context}; use flate2::Compression; use flate2::{read::GzDecoder, write::GzEncoder}; -use mithril_common::StdResult; +use slog::Logger; use slog_scope::{info, warn}; use std::fs::{self, File}; use std::io::{self, Read, Seek, SeekFrom}; @@ -11,6 +11,9 @@ use tar::{Archive, Entry, EntryType}; use thiserror::Error; use zstd::{Decoder, Encoder}; +use mithril_common::logging::LoggerExtensions; +use mithril_common::StdResult; + use crate::dependency_injection::DependenciesBuilderError; use crate::ZstandardCompressionParameters; @@ -45,6 +48,8 @@ pub struct CompressedArchiveSnapshotter { /// Compression algorithm used for the archive compression_algorithm: SnapshotterCompressionAlgorithm, + + logger: Logger, } #[derive(Debug, Clone, PartialEq, Eq)] @@ -119,6 +124,7 @@ impl CompressedArchiveSnapshotter { db_directory: PathBuf, ongoing_snapshot_directory: PathBuf, compression_algorithm: SnapshotterCompressionAlgorithm, + logger: Logger, ) -> StdResult { if ongoing_snapshot_directory.exists() { fs::remove_dir_all(&ongoing_snapshot_directory).with_context(|| { @@ -143,6 +149,7 @@ impl CompressedArchiveSnapshotter { db_directory, ongoing_snapshot_directory, compression_algorithm, + logger: logger.new_with_component_name::(), }) } @@ -391,6 +398,8 @@ mod tests { use mithril_common::digesters::DummyImmutablesDbBuilder; use mithril_common::test_utils::TempDir; + use crate::test_tools::TestLogger; + use super::*; fn get_test_directory(dir_name: &str) -> PathBuf { @@ -427,6 +436,7 @@ mod tests { db_directory, pending_snapshot_directory.clone(), SnapshotterCompressionAlgorithm::Gzip, + TestLogger::stdout(), ) .unwrap(), ); @@ -450,6 +460,7 @@ mod tests { db_directory, pending_snapshot_directory.clone(), SnapshotterCompressionAlgorithm::Gzip, + TestLogger::stdout(), ) .unwrap(), ); @@ -470,6 +481,7 @@ mod tests { db_directory, pending_snapshot_directory.clone(), SnapshotterCompressionAlgorithm::Gzip, + TestLogger::stdout(), ) .unwrap(), ); @@ -505,6 +517,7 @@ mod tests { db_directory, pending_snapshot_directory.clone(), SnapshotterCompressionAlgorithm::Gzip, + TestLogger::stdout(), ) .unwrap(), ); @@ -543,6 +556,7 @@ mod tests { db_directory, pending_snapshot_directory.clone(), ZstandardCompressionParameters::default().into(), + TestLogger::stdout(), ) .unwrap(), ); diff --git a/mithril-aggregator/src/tools/certificates_hash_migrator.rs b/mithril-aggregator/src/tools/certificates_hash_migrator.rs index 29f76735a4c..a370df737a0 100644 --- a/mithril-aggregator/src/tools/certificates_hash_migrator.rs +++ b/mithril-aggregator/src/tools/certificates_hash_migrator.rs @@ -1,8 +1,10 @@ use std::{collections::HashMap, sync::Arc}; use anyhow::{anyhow, Context}; +use slog::Logger; use slog_scope::{debug, info, trace}; +use mithril_common::logging::LoggerExtensions; use mithril_common::{entities::Certificate, StdResult}; use crate::database::repository::{CertificateRepository, SignedEntityStorer}; @@ -11,6 +13,7 @@ use crate::database::repository::{CertificateRepository, SignedEntityStorer}; pub struct CertificatesHashMigrator { certificate_repository: CertificateRepository, signed_entity_storer: Arc, + logger: Logger, } impl CertificatesHashMigrator { @@ -18,10 +21,12 @@ impl CertificatesHashMigrator { pub fn new( certificate_repository: CertificateRepository, signed_entity_storer: Arc, + logger: Logger, ) -> Self { Self { certificate_repository, signed_entity_storer, + logger: logger.new_with_component_name::(), } } @@ -198,6 +203,7 @@ mod test { use crate::database::record::{CertificateRecord, SignedEntityRecord}; use crate::database::repository::SignedEntityStore; + use crate::test_tools::TestLogger; use super::*; @@ -449,6 +455,7 @@ mod test { let migrator = CertificatesHashMigrator::new( CertificateRepository::new(sqlite_connection.clone()), Arc::new(SignedEntityStore::new(sqlite_connection.clone())), + TestLogger::stdout(), ); migrator .migrate() @@ -613,6 +620,7 @@ mod test { let migrator = CertificatesHashMigrator::new( CertificateRepository::new(connection.clone()), Arc::new(SignedEntityStore::new(connection.clone())), + TestLogger::stdout(), ); migrator .migrate() diff --git a/mithril-aggregator/src/tools/remote_file_uploader.rs b/mithril-aggregator/src/tools/remote_file_uploader.rs index 2e1594ef7b9..7b305f60648 100644 --- a/mithril-aggregator/src/tools/remote_file_uploader.rs +++ b/mithril-aggregator/src/tools/remote_file_uploader.rs @@ -4,11 +4,14 @@ use cloud_storage::{ bucket::Entity, bucket_access_control::Role, object_access_control::NewObjectAccessControl, Client, }; -use mithril_common::StdResult; +use slog::Logger; use slog_scope::info; use std::{env, path::Path}; use tokio_util::{codec::BytesCodec, codec::FramedRead}; +use mithril_common::logging::LoggerExtensions; +use mithril_common::StdResult; + /// RemoteFileUploader represents a remote file uploader interactor #[cfg_attr(test, mockall::automock)] #[async_trait] @@ -20,12 +23,16 @@ pub trait RemoteFileUploader: Sync + Send { /// GcpFileUploader represents a Google Cloud Platform file uploader interactor pub struct GcpFileUploader { bucket: String, + logger: Logger, } impl GcpFileUploader { /// GcpFileUploader factory - pub fn new(bucket: String) -> Self { - Self { bucket } + pub fn new(bucket: String, logger: Logger) -> Self { + Self { + bucket, + logger: logger.new_with_component_name::(), + } } } diff --git a/mithril-aggregator/src/tools/signer_importer.rs b/mithril-aggregator/src/tools/signer_importer.rs index cedaa01ebec..34ed8489eb9 100644 --- a/mithril-aggregator/src/tools/signer_importer.rs +++ b/mithril-aggregator/src/tools/signer_importer.rs @@ -1,16 +1,18 @@ use anyhow::Context; use async_trait::async_trait; -use mithril_common::{entities::PartyId, StdResult}; use reqwest::{IntoUrl, Url}; use serde::{Deserialize, Serialize}; +use slog::Logger; +use slog_scope::{info, warn}; use std::collections::HashMap; use std::ops::Not; use std::sync::Arc; use std::time::Duration; -use crate::database::repository::SignerStore; +use mithril_common::logging::LoggerExtensions; +use mithril_common::{entities::PartyId, StdResult}; -use slog_scope::{info, warn}; +use crate::database::repository::SignerStore; pub type PoolTicker = String; @@ -18,6 +20,7 @@ pub type PoolTicker = String; pub struct SignersImporter { retriever: Arc, persister: Arc, + logger: Logger, } impl SignersImporter { @@ -25,10 +28,12 @@ impl SignersImporter { pub fn new( retriever: Arc, persister: Arc, + logger: Logger, ) -> Self { Self { retriever, persister, + logger: logger.new_with_component_name::(), } } @@ -97,11 +102,16 @@ pub struct CExplorerSignerRetriever { /// Url from which a SPO list using the CExplorer format will be fetch. source_url: Url, client: reqwest::Client, + logger: Logger, } impl CExplorerSignerRetriever { /// Create a new [CExplorerSignerRetriever] that will fetch data from the given url. - pub(crate) fn new(source_url: T, timeout: Option) -> StdResult { + pub(crate) fn new( + source_url: T, + timeout: Option, + logger: Logger, + ) -> StdResult { let source_url = source_url .into_url() .with_context(|| "Given `source_url` is not a valid Url")?; @@ -113,7 +123,11 @@ impl CExplorerSignerRetriever { .build() .with_context(|| "Http Client build failed")?; - Ok(Self { source_url, client }) + Ok(Self { + source_url, + client, + logger, + }) } } @@ -190,6 +204,7 @@ mod tests { use crate::database::repository::{SignerGetter, SignerStore}; use crate::database::test_helper::main_db_connection; use crate::http_server::routes::reply; + use crate::test_tools::TestLogger; use super::*; @@ -270,8 +285,12 @@ mod tests { }"# })); - let retriever = - CExplorerSignerRetriever::new(format!("{}/list", server.url()), None).unwrap(); + let retriever = CExplorerSignerRetriever::new( + format!("{}/list", server.url()), + None, + TestLogger::stdout(), + ) + .unwrap(); let result = retriever .retrieve() .await @@ -292,8 +311,12 @@ mod tests { let server = test_http_server(warp::path("list").map(|| reply::internal_server_error("whatever"))); - let retriever = - CExplorerSignerRetriever::new(format!("{}/list", server.url()), None).unwrap(); + let retriever = CExplorerSignerRetriever::new( + format!("{}/list", server.url()), + None, + TestLogger::stdout(), + ) + .unwrap(); retriever .retrieve() .await @@ -304,8 +327,12 @@ mod tests { async fn retriever_yield_error_when_json_is_malformed() { let server = test_http_server(warp::path("list").map(|| r#"{ "data": [ {"pool_" ] }"#)); - let retriever = - CExplorerSignerRetriever::new(format!("{}/list", server.url()), None).unwrap(); + let retriever = CExplorerSignerRetriever::new( + format!("{}/list", server.url()), + None, + TestLogger::stdout(), + ) + .unwrap(); retriever .retrieve() .await @@ -322,6 +349,7 @@ mod tests { let retriever = CExplorerSignerRetriever::new( format!("{}/list", server.url()), Some(Duration::from_millis(10)), + TestLogger::stdout(), ) .unwrap(); retriever @@ -344,6 +372,7 @@ mod tests { let importer = SignersImporter::new( Arc::new(retriever), Arc::new(SignerStore::new(connection.clone())), + TestLogger::stdout(), ); importer .run() @@ -388,6 +417,7 @@ mod tests { let importer = SignersImporter::new( Arc::new(retriever), Arc::new(SignerStore::new(connection.clone())), + TestLogger::stdout(), ); importer .run() @@ -436,9 +466,15 @@ mod tests { let importer = SignersImporter::new( Arc::new( - CExplorerSignerRetriever::new(format!("{}/list", server.url()), None).unwrap(), + CExplorerSignerRetriever::new( + format!("{}/list", server.url()), + None, + TestLogger::stdout(), + ) + .unwrap(), ), Arc::new(SignerStore::new(connection.clone())), + TestLogger::stdout(), ); importer .run() diff --git a/mithril-aggregator/src/tools/single_signature_authenticator.rs b/mithril-aggregator/src/tools/single_signature_authenticator.rs index 768d13705eb..80a5c64f07c 100644 --- a/mithril-aggregator/src/tools/single_signature_authenticator.rs +++ b/mithril-aggregator/src/tools/single_signature_authenticator.rs @@ -2,6 +2,7 @@ use slog::{debug, Logger}; use std::sync::Arc; use mithril_common::entities::{SingleSignatureAuthenticationStatus, SingleSignatures}; +use mithril_common::logging::LoggerExtensions; use mithril_common::StdResult; use crate::MultiSigner; @@ -17,7 +18,7 @@ impl SingleSignatureAuthenticator { pub fn new(multi_signer: Arc, logger: Logger) -> Self { Self { multi_signer, - logger, + logger: logger.new_with_component_name::(), } } From 00c1e1adc11383d50a0a44ac33bd18fd2052aaf8 Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Fri, 11 Oct 2024 17:10:04 +0200 Subject: [PATCH 255/274] refactor(aggregator): use dedicated logger instead of `slog_scope` in http server To tag the logs with a source so they may be easily filtered. --- .../artifact_routes/cardano_transaction.rs | 16 +++-- .../mithril_stake_distribution.rs | 16 +++-- .../routes/artifact_routes/snapshot.rs | 29 ++++++---- .../http_server/routes/certificate_routes.rs | 22 ++++--- .../src/http_server/routes/epoch_routes.rs | 6 +- .../src/http_server/routes/mod.rs | 4 +- .../src/http_server/routes/proof_routes.rs | 13 +++-- .../src/http_server/routes/root_routes.rs | 8 ++- .../src/http_server/routes/router.rs | 23 +++++--- .../http_server/routes/signatures_routes.rs | 20 ++++--- .../src/http_server/routes/signer_routes.rs | 58 ++++++++++++------- 11 files changed, 134 insertions(+), 81 deletions(-) diff --git a/mithril-aggregator/src/http_server/routes/artifact_routes/cardano_transaction.rs b/mithril-aggregator/src/http_server/routes/artifact_routes/cardano_transaction.rs index 203f72abaaf..fbd83e47adc 100644 --- a/mithril-aggregator/src/http_server/routes/artifact_routes/cardano_transaction.rs +++ b/mithril-aggregator/src/http_server/routes/artifact_routes/cardano_transaction.rs @@ -15,6 +15,7 @@ fn artifact_cardano_transactions( ) -> impl Filter + Clone { warp::path!("artifact" / "cardano-transactions") .and(warp::get()) + .and(middlewares::with_logger(dependency_manager)) .and(middlewares::with_http_message_service(dependency_manager)) .and_then(handlers::list_artifacts) } @@ -25,6 +26,7 @@ fn artifact_cardano_transaction_by_id( ) -> impl Filter + Clone { warp::path!("artifact" / "cardano-transaction" / String) .and(warp::get()) + .and(middlewares::with_logger(dependency_manager)) .and(middlewares::with_http_message_service(dependency_manager)) .and_then(handlers::get_artifact_by_signed_entity_id) } @@ -33,7 +35,7 @@ pub mod handlers { use crate::http_server::routes::reply; use crate::services::MessageService; - use slog_scope::{debug, warn}; + use slog::{debug, warn, Logger}; use std::convert::Infallible; use std::sync::Arc; use warp::http::StatusCode; @@ -42,9 +44,10 @@ pub mod handlers { /// List Cardano Transactions set artifacts pub async fn list_artifacts( + logger: Logger, http_message_service: Arc, ) -> Result { - debug!("⇄ HTTP SERVER: artifacts"); + debug!(logger, "⇄ HTTP SERVER: artifacts"); match http_message_service .get_cardano_transaction_list_message(LIST_MAX_ITEMS) @@ -52,7 +55,7 @@ pub mod handlers { { Ok(message) => Ok(reply::json(&message, StatusCode::OK)), Err(err) => { - warn!("list_artifacts_cardano_transactions"; "error" => ?err); + warn!(logger, "list_artifacts_cardano_transactions"; "error" => ?err); Ok(reply::server_error(err)) } @@ -62,9 +65,10 @@ pub mod handlers { /// Get Artifact by signed entity id pub async fn get_artifact_by_signed_entity_id( signed_entity_id: String, + logger: Logger, http_message_service: Arc, ) -> Result { - debug!("⇄ HTTP SERVER: artifact/{signed_entity_id}"); + debug!(logger, "⇄ HTTP SERVER: artifact/{signed_entity_id}"); match http_message_service .get_cardano_transaction_message(&signed_entity_id) @@ -72,11 +76,11 @@ pub mod handlers { { Ok(Some(message)) => Ok(reply::json(&message, StatusCode::OK)), Ok(None) => { - warn!("get_cardano_transaction_details::not_found"); + warn!(logger, "get_cardano_transaction_details::not_found"); Ok(reply::empty(StatusCode::NOT_FOUND)) } Err(err) => { - warn!("get_cardano_transaction_details::error"; "error" => ?err); + warn!(logger, "get_cardano_transaction_details::error"; "error" => ?err); Ok(reply::server_error(err)) } } diff --git a/mithril-aggregator/src/http_server/routes/artifact_routes/mithril_stake_distribution.rs b/mithril-aggregator/src/http_server/routes/artifact_routes/mithril_stake_distribution.rs index 9f6ce379e46..b101705ae1b 100644 --- a/mithril-aggregator/src/http_server/routes/artifact_routes/mithril_stake_distribution.rs +++ b/mithril-aggregator/src/http_server/routes/artifact_routes/mithril_stake_distribution.rs @@ -16,6 +16,7 @@ fn artifact_mithril_stake_distributions( ) -> impl Filter + Clone { warp::path!("artifact" / "mithril-stake-distributions") .and(warp::get()) + .and(middlewares::with_logger(dependency_manager)) .and(middlewares::with_http_message_service(dependency_manager)) .and_then(handlers::list_artifacts) } @@ -26,6 +27,7 @@ fn artifact_mithril_stake_distribution_by_id( ) -> impl Filter + Clone { warp::path!("artifact" / "mithril-stake-distribution" / String) .and(warp::get()) + .and(middlewares::with_logger(dependency_manager)) .and(middlewares::with_http_message_service(dependency_manager)) .and_then(handlers::get_artifact_by_signed_entity_id) } @@ -34,7 +36,7 @@ pub mod handlers { use crate::http_server::routes::reply; use crate::services::MessageService; - use slog_scope::{debug, warn}; + use slog::{debug, warn, Logger}; use std::convert::Infallible; use std::sync::Arc; use warp::http::StatusCode; @@ -43,9 +45,10 @@ pub mod handlers { /// List MithrilStakeDistribution artifacts pub async fn list_artifacts( + logger: Logger, http_message_service: Arc, ) -> Result { - debug!("⇄ HTTP SERVER: artifacts"); + debug!(logger, "⇄ HTTP SERVER: artifacts"); match http_message_service .get_mithril_stake_distribution_list_message(LIST_MAX_ITEMS) @@ -53,7 +56,7 @@ pub mod handlers { { Ok(message) => Ok(reply::json(&message, StatusCode::OK)), Err(err) => { - warn!("list_artifacts_mithril_stake_distribution"; "error" => ?err); + warn!(logger,"list_artifacts_mithril_stake_distribution"; "error" => ?err); Ok(reply::server_error(err)) } } @@ -62,9 +65,10 @@ pub mod handlers { /// Get Artifact by signed entity id pub async fn get_artifact_by_signed_entity_id( signed_entity_id: String, + logger: Logger, http_message_service: Arc, ) -> Result { - debug!("⇄ HTTP SERVER: artifact/{signed_entity_id}"); + debug!(logger, "⇄ HTTP SERVER: artifact/{signed_entity_id}"); match http_message_service .get_mithril_stake_distribution_message(&signed_entity_id) @@ -72,11 +76,11 @@ pub mod handlers { { Ok(Some(message)) => Ok(reply::json(&message, StatusCode::OK)), Ok(None) => { - warn!("get_mithril_stake_distribution_details::not_found"); + warn!(logger, "get_mithril_stake_distribution_details::not_found"); Ok(reply::empty(StatusCode::NOT_FOUND)) } Err(err) => { - warn!("get_mithril_stake_distribution_details::error"; "error" => ?err); + warn!(logger,"get_mithril_stake_distribution_details::error"; "error" => ?err); Ok(reply::server_error(err)) } } diff --git a/mithril-aggregator/src/http_server/routes/artifact_routes/snapshot.rs b/mithril-aggregator/src/http_server/routes/artifact_routes/snapshot.rs index 3c77e05e6bb..45d7ddd6f87 100644 --- a/mithril-aggregator/src/http_server/routes/artifact_routes/snapshot.rs +++ b/mithril-aggregator/src/http_server/routes/artifact_routes/snapshot.rs @@ -23,6 +23,7 @@ fn artifact_cardano_full_immutable_snapshots( ) -> impl Filter + Clone { warp::path!("artifact" / "snapshots") .and(warp::get()) + .and(middlewares::with_logger(dependency_manager)) .and(middlewares::with_http_message_service(dependency_manager)) .and_then(handlers::list_artifacts) } @@ -33,6 +34,7 @@ fn artifact_cardano_full_immutable_snapshot_by_id( ) -> impl Filter + Clone { warp::path!("artifact" / "snapshot" / String) .and(warp::get()) + .and(middlewares::with_logger(dependency_manager)) .and(middlewares::with_http_message_service(dependency_manager)) .and_then(handlers::get_artifact_by_signed_entity_id) } @@ -43,6 +45,7 @@ fn snapshot_download( ) -> impl Filter + Clone { warp::path!("artifact" / "snapshot" / String / "download") .and(warp::get().or(warp::head()).unify()) + .and(middlewares::with_logger(dependency_manager)) .and(middlewares::with_config(dependency_manager)) .and(middlewares::with_signed_entity_service(dependency_manager)) .and_then(handlers::snapshot_download) @@ -55,6 +58,7 @@ fn serve_snapshots_dir( warp::path("snapshot_download") .and(warp::fs::dir(config.snapshot_directory)) + .and(middlewares::with_logger(dependency_manager)) .and(middlewares::with_signed_entity_service(dependency_manager)) .and_then(handlers::ensure_downloaded_file_is_a_snapshot) } @@ -92,7 +96,7 @@ mod handlers { use crate::http_server::SERVER_BASE_PATH; use crate::services::MessageService; use crate::{services::SignedEntityService, Configuration}; - use slog_scope::{debug, warn}; + use slog::{debug, warn, Logger}; use std::convert::Infallible; use std::str::FromStr; use std::sync::Arc; @@ -102,9 +106,10 @@ mod handlers { /// List Snapshot artifacts pub async fn list_artifacts( + logger: Logger, http_message_service: Arc, ) -> Result { - debug!("⇄ HTTP SERVER: artifacts"); + debug!(logger, "⇄ HTTP SERVER: artifacts"); match http_message_service .get_snapshot_list_message(LIST_MAX_ITEMS) @@ -112,7 +117,7 @@ mod handlers { { Ok(message) => Ok(reply::json(&message, StatusCode::OK)), Err(err) => { - warn!("list_artifacts_snapshot"; "error" => ?err); + warn!(logger,"list_artifacts_snapshot"; "error" => ?err); Ok(reply::server_error(err)) } } @@ -121,20 +126,21 @@ mod handlers { /// Get Artifact by signed entity id pub async fn get_artifact_by_signed_entity_id( signed_entity_id: String, + logger: Logger, http_message_service: Arc, ) -> Result { - debug!("⇄ HTTP SERVER: artifact/{signed_entity_id}"); + debug!(logger, "⇄ HTTP SERVER: artifact/{signed_entity_id}"); match http_message_service .get_snapshot_message(&signed_entity_id) .await { Ok(Some(signed_entity)) => Ok(reply::json(&signed_entity, StatusCode::OK)), Ok(None) => { - warn!("snapshot_details::not_found"); + warn!(logger, "snapshot_details::not_found"); Ok(reply::empty(StatusCode::NOT_FOUND)) } Err(err) => { - warn!("snapshot_details::error"; "error" => ?err); + warn!(logger,"snapshot_details::error"; "error" => ?err); Ok(reply::server_error(err)) } } @@ -143,10 +149,12 @@ mod handlers { /// Download a file if and only if it's a snapshot archive pub async fn ensure_downloaded_file_is_a_snapshot( reply: warp::fs::File, + logger: Logger, signed_entity_service: Arc, ) -> Result { let filepath = reply.path().to_path_buf(); debug!( + logger, "⇄ HTTP SERVER: ensure_downloaded_file_is_a_snapshot / file: `{}`", filepath.display() ); @@ -167,7 +175,7 @@ mod handlers { _ => Ok(reply::empty(StatusCode::NOT_FOUND)), }, Err(err) => { - warn!("ensure_downloaded_file_is_a_snapshot::error"; "error" => ?err); + warn!(logger,"ensure_downloaded_file_is_a_snapshot::error"; "error" => ?err); Ok(reply::empty(StatusCode::NOT_FOUND)) } } @@ -176,10 +184,11 @@ mod handlers { /// Snapshot download pub async fn snapshot_download( digest: String, + logger: Logger, config: Configuration, signed_entity_service: Arc, ) -> Result { - debug!("⇄ HTTP SERVER: snapshot_download/{}", digest); + debug!(logger, "⇄ HTTP SERVER: snapshot_download/{}", digest); match signed_entity_service .get_signed_snapshot_by_id(&digest) @@ -206,11 +215,11 @@ mod handlers { Ok(Box::new(warp::redirect::found(snapshot_uri)) as Box) } Ok(None) => { - warn!("snapshot_download::not_found"); + warn!(logger, "snapshot_download::not_found"); Ok(reply::empty(StatusCode::NOT_FOUND)) } Err(err) => { - warn!("snapshot_download::error"; "error" => ?err); + warn!(logger,"snapshot_download::error"; "error" => ?err); Ok(reply::server_error(err)) } } diff --git a/mithril-aggregator/src/http_server/routes/certificate_routes.rs b/mithril-aggregator/src/http_server/routes/certificate_routes.rs index f0ec6f1f8cd..d6b75864dd3 100644 --- a/mithril-aggregator/src/http_server/routes/certificate_routes.rs +++ b/mithril-aggregator/src/http_server/routes/certificate_routes.rs @@ -16,6 +16,7 @@ fn certificate_pending( ) -> impl Filter + Clone { warp::path!("certificate-pending") .and(warp::get()) + .and(middlewares::with_logger(dependency_manager)) .and(middlewares::with_certificate_pending_store( dependency_manager, )) @@ -28,6 +29,7 @@ fn certificate_certificates( ) -> impl Filter + Clone { warp::path!("certificates") .and(warp::get()) + .and(middlewares::with_logger(dependency_manager)) .and(middlewares::with_http_message_service(dependency_manager)) .and_then(handlers::certificate_certificates) } @@ -38,6 +40,7 @@ fn certificate_certificate_hash( ) -> impl Filter + Clone { warp::path!("certificate" / String) .and(warp::get()) + .and(middlewares::with_logger(dependency_manager)) .and(middlewares::with_http_message_service(dependency_manager)) .and_then(handlers::certificate_certificate_hash) } @@ -48,7 +51,7 @@ mod handlers { ToCertificatePendingMessageAdapter, }; - use slog_scope::{debug, warn}; + use slog::{debug, warn, Logger}; use std::convert::Infallible; use std::sync::Arc; use warp::http::StatusCode; @@ -57,9 +60,10 @@ mod handlers { /// Certificate Pending pub async fn certificate_pending( + logger: Logger, certificate_pending_store: Arc, ) -> Result { - debug!("⇄ HTTP SERVER: certificate_pending"); + debug!(logger, "⇄ HTTP SERVER: certificate_pending"); match certificate_pending_store.get().await { Ok(Some(certificate_pending)) => Ok(reply::json( @@ -68,7 +72,7 @@ mod handlers { )), Ok(None) => Ok(reply::empty(StatusCode::NO_CONTENT)), Err(err) => { - warn!("certificate_pending::error"; "error" => ?err); + warn!(logger,"certificate_pending::error"; "error" => ?err); Ok(reply::server_error(err)) } } @@ -76,9 +80,10 @@ mod handlers { /// List all Certificates pub async fn certificate_certificates( + logger: Logger, http_message_service: Arc, ) -> Result { - debug!("⇄ HTTP SERVER: certificate_certificates",); + debug!(logger, "⇄ HTTP SERVER: certificate_certificates",); match http_message_service .get_certificate_list_message(LIST_MAX_ITEMS) @@ -86,7 +91,7 @@ mod handlers { { Ok(certificates) => Ok(reply::json(&certificates, StatusCode::OK)), Err(err) => { - warn!("certificate_certificates::error"; "error" => ?err); + warn!(logger,"certificate_certificates::error"; "error" => ?err); Ok(reply::server_error(err)) } } @@ -95,11 +100,12 @@ mod handlers { /// Certificate by certificate hash pub async fn certificate_certificate_hash( certificate_hash: String, + logger: Logger, http_message_service: Arc, ) -> Result { debug!( - "⇄ HTTP SERVER: certificate_certificate_hash/{}", - certificate_hash + logger, + "⇄ HTTP SERVER: certificate_certificate_hash/{}", certificate_hash ); match http_message_service @@ -109,7 +115,7 @@ mod handlers { Ok(Some(certificate)) => Ok(reply::json(&certificate, StatusCode::OK)), Ok(None) => Ok(reply::empty(StatusCode::NOT_FOUND)), Err(err) => { - warn!("certificate_certificate_hash::error"; "error" => ?err); + warn!(logger,"certificate_certificate_hash::error"; "error" => ?err); Ok(reply::server_error(err)) } } diff --git a/mithril-aggregator/src/http_server/routes/epoch_routes.rs b/mithril-aggregator/src/http_server/routes/epoch_routes.rs index d0bb49d0806..39d221625e6 100644 --- a/mithril-aggregator/src/http_server/routes/epoch_routes.rs +++ b/mithril-aggregator/src/http_server/routes/epoch_routes.rs @@ -23,6 +23,7 @@ fn epoch_settings( ) -> impl Filter + Clone { warp::path!("epoch-settings") .and(warp::get()) + .and(middlewares::with_logger(dependency_manager)) .and(middlewares::with_epoch_service(dependency_manager)) .and(middlewares::with_allowed_signed_entity_type_discriminants( dependency_manager, @@ -68,7 +69,7 @@ async fn get_epoch_settings_message( } mod handlers { - use slog_scope::debug; + use slog::{debug, Logger}; use std::collections::BTreeSet; use std::convert::Infallible; use warp::http::StatusCode; @@ -81,10 +82,11 @@ mod handlers { /// Epoch Settings pub async fn epoch_settings( + logger: Logger, epoch_service: EpochServiceWrapper, allowed_discriminants: BTreeSet, ) -> Result { - debug!("⇄ HTTP SERVER: epoch_settings"); + debug!(logger, "⇄ HTTP SERVER: epoch_settings"); let epoch_settings_message = get_epoch_settings_message(epoch_service, allowed_discriminants).await; diff --git a/mithril-aggregator/src/http_server/routes/mod.rs b/mithril-aggregator/src/http_server/routes/mod.rs index a4a6eca6338..23fb5ae5957 100644 --- a/mithril-aggregator/src/http_server/routes/mod.rs +++ b/mithril-aggregator/src/http_server/routes/mod.rs @@ -14,11 +14,11 @@ mod statistics_routes; /// if it was an Error. Else return the unwrapped value. #[macro_export] macro_rules! unwrap_to_internal_server_error { - ($code:expr, $($warn_comment:tt)*) => { + ($code:expr, $logger:expr => $($warn_comment:tt)*) => { match $code { Ok(res) => res, Err(err) => { - warn!($($warn_comment)*; "error" => ?err); + slog::warn!($logger, $($warn_comment)*; "error" => ?err); return Ok($crate::http_server::routes::reply::server_error( err, )); diff --git a/mithril-aggregator/src/http_server/routes/proof_routes.rs b/mithril-aggregator/src/http_server/routes/proof_routes.rs index ec34c5e73e6..79917773e69 100644 --- a/mithril-aggregator/src/http_server/routes/proof_routes.rs +++ b/mithril-aggregator/src/http_server/routes/proof_routes.rs @@ -38,6 +38,7 @@ fn proof_cardano_transaction( warp::path!("proof" / "cardano-transaction") .and(warp::get()) .and(warp::query::()) + .and(middlewares::with_logger(dependency_manager)) .and(middlewares::with_signed_entity_service(dependency_manager)) .and(middlewares::validators::with_prover_transactions_hash_validator(dependency_manager)) .and(middlewares::with_prover_service(dependency_manager)) @@ -50,7 +51,7 @@ mod handlers { messages::CardanoTransactionsProofsMessage, StdResult, }; - use slog_scope::{debug, warn}; + use slog::{debug, warn, Logger}; use std::{convert::Infallible, sync::Arc}; use warp::http::StatusCode; @@ -65,18 +66,20 @@ mod handlers { pub async fn proof_cardano_transaction( transaction_parameters: CardanoTransactionProofQueryParams, + logger: Logger, signed_entity_service: Arc, validator: ProverTransactionsHashValidator, prover_service: Arc, ) -> Result { let transaction_hashes = transaction_parameters.split_transactions_hashes(); debug!( + logger, "⇄ HTTP SERVER: proof_cardano_transaction?transaction_hashes={}", transaction_parameters.transaction_hashes ); if let Err(error) = validator.validate(&transaction_hashes) { - warn!("proof_cardano_transaction::bad_request"); + warn!(logger, "proof_cardano_transaction::bad_request"); return Ok(reply::bad_request(error.label, error.message)); } @@ -86,17 +89,17 @@ mod handlers { signed_entity_service .get_last_cardano_transaction_snapshot() .await, - "proof_cardano_transaction::error" + logger => "proof_cardano_transaction::error" ) { Some(signed_entity) => { let message = unwrap_to_internal_server_error!( build_response_message(prover_service, signed_entity, sanitized_hashes).await, - "proof_cardano_transaction" + logger => "proof_cardano_transaction" ); Ok(reply::json(&message, StatusCode::OK)) } None => { - warn!("proof_cardano_transaction::not_found"); + warn!(logger, "proof_cardano_transaction::not_found"); Ok(reply::empty(StatusCode::NOT_FOUND)) } } diff --git a/mithril-aggregator/src/http_server/routes/root_routes.rs b/mithril-aggregator/src/http_server/routes/root_routes.rs index 5db5a59cc01..f02b93745ac 100644 --- a/mithril-aggregator/src/http_server/routes/root_routes.rs +++ b/mithril-aggregator/src/http_server/routes/root_routes.rs @@ -14,6 +14,7 @@ fn root( dependency_manager: &DependencyContainer, ) -> impl Filter + Clone { warp::path::end() + .and(middlewares::with_logger(dependency_manager)) .and(middlewares::with_api_version_provider(dependency_manager)) .and(middlewares::with_allowed_signed_entity_type_discriminants( dependency_manager, @@ -26,7 +27,7 @@ mod handlers { use std::collections::BTreeSet; use std::{convert::Infallible, sync::Arc}; - use slog_scope::{debug, warn}; + use slog::{debug, Logger}; use warp::http::StatusCode; use mithril_common::api_version::APIVersionProvider; @@ -40,15 +41,16 @@ mod handlers { /// Root pub async fn root( + logger: Logger, api_version_provider: Arc, allowed_signed_entity_type_discriminants: BTreeSet, configuration: Configuration, ) -> Result { - debug!("⇄ HTTP SERVER: root"); + debug!(logger, "⇄ HTTP SERVER: root"); let open_api_version = unwrap_to_internal_server_error!( api_version_provider.compute_current_version(), - "root::error" + logger => "root::error" ); let mut capabilities = AggregatorCapabilities { diff --git a/mithril-aggregator/src/http_server/routes/router.rs b/mithril-aggregator/src/http_server/routes/router.rs index 3b3b4eb93fb..7c153fa2fc5 100644 --- a/mithril-aggregator/src/http_server/routes/router.rs +++ b/mithril-aggregator/src/http_server/routes/router.rs @@ -1,6 +1,6 @@ use crate::http_server::routes::{ - artifact_routes, certificate_routes, epoch_routes, root_routes, signatures_routes, - signer_routes, statistics_routes, + artifact_routes, certificate_routes, epoch_routes, http_server_child_logger, root_routes, + signatures_routes, signer_routes, statistics_routes, }; use crate::http_server::SERVER_BASE_PATH; use crate::DependencyContainer; @@ -8,7 +8,7 @@ use crate::DependencyContainer; use mithril_common::api_version::APIVersionProvider; use mithril_common::MITHRIL_API_VERSION_HEADER; -use slog_scope::warn; +use slog::{warn, Logger}; use std::sync::Arc; use warp::http::Method; use warp::http::StatusCode; @@ -39,6 +39,7 @@ pub fn routes( warp::any() .and(header_must_be( dependency_manager.api_version_provider.clone(), + http_server_child_logger(&dependency_manager.root_logger), )) .and(warp::path(SERVER_BASE_PATH)) .and( @@ -78,11 +79,13 @@ pub fn routes( /// API Version verification fn header_must_be( api_version_provider: Arc, + logger: Logger, ) -> impl Filter + Clone { warp::header::optional(MITHRIL_API_VERSION_HEADER) .and(warp::any().map(move || api_version_provider.clone())) + .and(warp::any().map(move || logger.clone())) .and_then( - move |maybe_header: Option, api_version_provider: Arc| async move { + move |maybe_header: Option, api_version_provider: Arc, logger: Logger| async move { match maybe_header { None => Ok(()), Some(version) => match semver::Version::parse(&version) { @@ -96,7 +99,7 @@ fn header_must_be( } Ok(_version) => Err(warp::reject::custom(VersionMismatchError)), Err(err) => { - warn!("⇄ HTTP SERVER::api_version_check::parse_error"; "error" => ?err); + warn!(logger, "⇄ HTTP SERVER::api_version_check::parse_error"; "error" => ?err); Err(warp::reject::custom(VersionParseError)) } }, @@ -124,13 +127,15 @@ mod tests { era::{EraChecker, SupportedEra}, }; + use crate::test_tools::TestLogger; + use super::*; #[tokio::test] async fn test_no_version() { let era_checker = EraChecker::new(SupportedEra::dummy(), Epoch(1)); let api_version_provider = Arc::new(APIVersionProvider::new(Arc::new(era_checker))); - let filters = header_must_be(api_version_provider); + let filters = header_must_be(api_version_provider, TestLogger::stdout()); warp::test::request() .path("/aggregator/whatever") .filter(&filters) @@ -142,7 +147,7 @@ mod tests { async fn test_parse_version_error() { let era_checker = EraChecker::new(SupportedEra::dummy(), Epoch(1)); let api_version_provider = Arc::new(APIVersionProvider::new(Arc::new(era_checker))); - let filters = header_must_be(api_version_provider); + let filters = header_must_be(api_version_provider, TestLogger::stdout()); warp::test::request() .header(MITHRIL_API_VERSION_HEADER, "not_a_version") .path("/aggregator/whatever") @@ -161,7 +166,7 @@ mod tests { open_api_versions.insert("openapi.yaml".to_string(), Version::new(1, 0, 0)); version_provider.update_open_api_versions(open_api_versions); let api_version_provider = Arc::new(version_provider); - let filters = header_must_be(api_version_provider); + let filters = header_must_be(api_version_provider, TestLogger::stdout()); warp::test::request() .header(MITHRIL_API_VERSION_HEADER, "0.0.999") .path("/aggregator/whatever") @@ -178,7 +183,7 @@ mod tests { open_api_versions.insert("openapi.yaml".to_string(), Version::new(0, 1, 0)); version_provider.update_open_api_versions(open_api_versions); let api_version_provider = Arc::new(version_provider); - let filters = header_must_be(api_version_provider); + let filters = header_must_be(api_version_provider, TestLogger::stdout()); warp::test::request() .header(MITHRIL_API_VERSION_HEADER, "0.1.2") .path("/aggregator/whatever") diff --git a/mithril-aggregator/src/http_server/routes/signatures_routes.rs b/mithril-aggregator/src/http_server/routes/signatures_routes.rs index 3a7589ecace..c1cd99b0af7 100644 --- a/mithril-aggregator/src/http_server/routes/signatures_routes.rs +++ b/mithril-aggregator/src/http_server/routes/signatures_routes.rs @@ -15,6 +15,7 @@ fn register_signatures( warp::path!("register-signatures") .and(warp::post()) .and(warp::body::json()) + .and(middlewares::with_logger(dependency_manager)) .and(middlewares::with_certifier_service(dependency_manager)) .and(middlewares::with_single_signature_authenticator( dependency_manager, @@ -23,7 +24,7 @@ fn register_signatures( } mod handlers { - use slog_scope::{debug, trace, warn}; + use slog::{debug, trace, warn, Logger}; use std::convert::Infallible; use std::sync::Arc; use warp::http::StatusCode; @@ -40,11 +41,12 @@ mod handlers { /// Register Signatures pub async fn register_signatures( message: RegisterSignatureMessage, + logger: Logger, certifier_service: Arc, single_signer_authenticator: Arc, ) -> Result { - debug!("⇄ HTTP SERVER: register_signatures/{:?}", message); - trace!("⇄ HTTP SERVER: register_signatures"; "complete_message" => #?message ); + debug!(logger, "⇄ HTTP SERVER: register_signatures/{:?}", message); + trace!(logger,"⇄ HTTP SERVER: register_signatures"; "complete_message" => #?message ); let signed_entity_type = message.signed_entity_type.clone(); let signed_message = message.signed_message.clone(); @@ -52,7 +54,7 @@ mod handlers { let mut signatures = match FromRegisterSingleSignatureAdapter::try_adapt(message) { Ok(signature) => signature, Err(err) => { - warn!("register_signatures::payload decoding error"; "error" => ?err); + warn!(logger,"register_signatures::payload decoding error"; "error" => ?err); return Ok(reply::bad_request( "Could not decode signature payload".to_string(), @@ -66,11 +68,11 @@ mod handlers { single_signer_authenticator .authenticate(&mut signatures, &signed_message) .await, - "single_signer_authenticator::error" + logger => "single_signer_authenticator::error" ); if !signatures.is_authenticated() { - debug!("register_signatures::unauthenticated_signature"); + debug!(logger, "register_signatures::unauthenticated_signature"); return Ok(reply::bad_request( "Could not authenticate signature".to_string(), "Signature could not be authenticated".to_string(), @@ -84,15 +86,15 @@ mod handlers { { Err(err) => match err.downcast_ref::() { Some(CertifierServiceError::AlreadyCertified(signed_entity_type)) => { - debug!("register_signatures::open_message_already_certified"; "signed_entity_type" => ?signed_entity_type); + debug!(logger,"register_signatures::open_message_already_certified"; "signed_entity_type" => ?signed_entity_type); Ok(reply::empty(StatusCode::GONE)) } Some(CertifierServiceError::NotFound(signed_entity_type)) => { - debug!("register_signatures::not_found"; "signed_entity_type" => ?signed_entity_type); + debug!(logger,"register_signatures::not_found"; "signed_entity_type" => ?signed_entity_type); Ok(reply::empty(StatusCode::NOT_FOUND)) } Some(_) | None => { - warn!("register_signatures::error"; "error" => ?err); + warn!(logger,"register_signatures::error"; "error" => ?err); Ok(reply::server_error(err)) } }, diff --git a/mithril-aggregator/src/http_server/routes/signer_routes.rs b/mithril-aggregator/src/http_server/routes/signer_routes.rs index cff94a30cff..3ab00a820f8 100644 --- a/mithril-aggregator/src/http_server/routes/signer_routes.rs +++ b/mithril-aggregator/src/http_server/routes/signer_routes.rs @@ -1,4 +1,4 @@ -use slog_scope::warn; +use slog::warn; use warp::Filter; use crate::dependency_injection::EpochServiceWrapper; @@ -25,6 +25,7 @@ fn register_signer( MITHRIL_SIGNER_VERSION_HEADER, )) .and(warp::body::json()) + .and(middlewares::with_logger(dependency_manager)) .and(middlewares::with_signer_registerer(dependency_manager)) .and(middlewares::with_event_transmitter(dependency_manager)) .and(middlewares::with_epoch_service(dependency_manager)) @@ -37,6 +38,7 @@ fn signers_tickers( ) -> impl Filter + Clone { warp::path!("signers" / "tickers") .and(warp::get()) + .and(middlewares::with_logger(dependency_manager)) .and(middlewares::with_config(dependency_manager)) .and(middlewares::with_signer_getter(dependency_manager)) .and_then(handlers::signers_tickers) @@ -48,15 +50,22 @@ fn registered_signers( ) -> impl Filter + Clone { warp::path!("signers" / "registered" / String) .and(warp::get()) + .and(middlewares::with_logger(dependency_manager)) .and(middlewares::with_verification_key_store(dependency_manager)) .and_then(handlers::registered_signers) } -async fn fetch_epoch_header_value(epoch_service: EpochServiceWrapper) -> String { +async fn fetch_epoch_header_value( + epoch_service: EpochServiceWrapper, + logger: &slog::Logger, +) -> String { match epoch_service.read().await.epoch_of_current_data() { Ok(epoch) => format!("{epoch}"), Err(e) => { - warn!("Could not fetch epoch header value from Epoch service: {e}"); + warn!( + logger, + "Could not fetch epoch header value from Epoch service: {e}" + ); String::new() } } @@ -76,7 +85,7 @@ mod handlers { use crate::{FromRegisterSignerAdapter, VerificationKeyStorer}; use mithril_common::entities::Epoch; use mithril_common::messages::{RegisterSignerMessage, TryFromMessageAdapter}; - use slog_scope::{debug, trace, warn}; + use slog::{debug, trace, warn, Logger}; use std::convert::Infallible; use std::sync::Arc; use warp::http::StatusCode; @@ -85,15 +94,16 @@ mod handlers { pub async fn register_signer( signer_node_version: Option, register_signer_message: RegisterSignerMessage, + logger: Logger, signer_registerer: Arc, event_transmitter: Arc>, epoch_service: EpochServiceWrapper, ) -> Result { debug!( - "⇄ HTTP SERVER: register_signer/{:?}", - register_signer_message + logger, + "⇄ HTTP SERVER: register_signer/{register_signer_message:?}" ); - trace!( + trace!(logger, "⇄ HTTP SERVER: register_signer"; "complete_message" => #?register_signer_message ); @@ -103,7 +113,7 @@ mod handlers { let signer = match FromRegisterSignerAdapter::try_adapt(register_signer_message) { Ok(signer) => signer, Err(err) => { - warn!("register_signer::payload decoding error"; "error" => ?err); + warn!(logger,"register_signer::payload decoding error"; "error" => ?err); return Ok(reply::bad_request( "Could not decode signer payload".to_string(), err.to_string(), @@ -116,7 +126,7 @@ mod handlers { None => Vec::new(), }; - let epoch_str = fetch_epoch_header_value(epoch_service).await; + let epoch_str = fetch_epoch_header_value(epoch_service, &logger).await; if !epoch_str.is_empty() { headers.push(("epoch", epoch_str.as_str())); } @@ -136,7 +146,7 @@ mod handlers { Ok(reply::empty(StatusCode::CREATED)) } Err(SignerRegistrationError::ExistingSigner(signer_with_stake)) => { - debug!("register_signer::already_registered"); + debug!(logger, "register_signer::already_registered"); let _ = event_transmitter.send_event_message( "HTTP::signer_register", "register_signer", @@ -146,20 +156,20 @@ mod handlers { Ok(reply::empty(StatusCode::CREATED)) } Err(SignerRegistrationError::FailedSignerRegistration(err)) => { - warn!("register_signer::failed_signer_registration"; "error" => ?err); + warn!(logger,"register_signer::failed_signer_registration"; "error" => ?err); Ok(reply::bad_request( "failed_signer_registration".to_string(), err.to_string(), )) } Err(SignerRegistrationError::RegistrationRoundNotYetOpened) => { - warn!("register_signer::registration_round_not_yed_opened"); + warn!(logger, "register_signer::registration_round_not_yed_opened"); Ok(reply::service_unavailable( SignerRegistrationError::RegistrationRoundNotYetOpened.to_string(), )) } Err(err) => { - warn!("register_signer::error"; "error" => ?err); + warn!(logger,"register_signer::error"; "error" => ?err); Ok(reply::server_error(err)) } } @@ -168,14 +178,18 @@ mod handlers { /// Get Registered Signers for a given epoch pub async fn registered_signers( registered_at: String, + logger: Logger, verification_key_store: Arc, ) -> Result { - debug!("⇄ HTTP SERVER: signers/registered/{:?}", registered_at); + debug!( + logger, + "⇄ HTTP SERVER: signers/registered/{:?}", registered_at + ); let registered_at = match registered_at.parse::() { Ok(epoch) => Epoch(epoch), Err(err) => { - warn!("registered_signers::invalid_epoch"; "error" => ?err); + warn!(logger,"registered_signers::invalid_epoch"; "error" => ?err); return Ok(reply::bad_request( "invalid_epoch".to_string(), err.to_string(), @@ -194,21 +208,22 @@ mod handlers { Ok(reply::json(&message, StatusCode::OK)) } Ok(None) => { - warn!("registered_signers::not_found"); + warn!(logger, "registered_signers::not_found"); Ok(reply::empty(StatusCode::NOT_FOUND)) } Err(err) => { - warn!("registered_signers::error"; "error" => ?err); + warn!(logger,"registered_signers::error"; "error" => ?err); Ok(reply::server_error(err)) } } } pub async fn signers_tickers( + logger: Logger, configuration: Configuration, signer_getter: Arc, ) -> Result { - debug!("⇄ HTTP SERVER: signers/tickers"); + debug!(logger, "⇄ HTTP SERVER: signers/tickers"); let network = configuration.network; match signer_getter.get_all().await { @@ -227,7 +242,7 @@ mod handlers { )) } Err(err) => { - warn!("registered_signers::error"; "error" => ?err); + warn!(logger,"registered_signers::error"; "error" => ?err); Ok(reply::server_error(err)) } } @@ -262,6 +277,7 @@ mod tests { services::FakeEpochService, signer_registerer::MockSignerRegisterer, store::MockVerificationKeyStorer, + test_tools::TestLogger, SignerRegistrationError, }; @@ -664,7 +680,7 @@ mod tests { &fixture, ))); - let epoch_str = fetch_epoch_header_value(epoch_service).await; + let epoch_str = fetch_epoch_header_value(epoch_service, &TestLogger::stdout()).await; assert_eq!(epoch_str, "84".to_string()); } @@ -673,7 +689,7 @@ mod tests { async fn test_fetch_epoch_header_value_when_epoch_service_error_return_empty_string() { let epoch_service = Arc::new(RwLock::new(FakeEpochService::without_data())); - let epoch_str = fetch_epoch_header_value(epoch_service).await; + let epoch_str = fetch_epoch_header_value(epoch_service, &TestLogger::stdout()).await; assert_eq!(epoch_str, "".to_string()); } From 24f7381c535cc5626439d3ee4420b43c33726dd1 Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Fri, 11 Oct 2024 12:48:07 +0200 Subject: [PATCH 256/274] refactor(aggregator): use dedicated logger instead of `slog_scope` in services & tools To tag the logs with a source so they may be easily filtered. --- .../cardano_immutable_files_full.rs | 24 ++++--- .../src/dependency_injection/builder.rs | 13 ++-- mithril-aggregator/src/event_store/runner.rs | 14 ++-- .../src/event_store/transmitter_service.rs | 7 +- .../cardano_stake_distribution.rs | 29 +++++--- mithril-aggregator/src/multi_signer.rs | 23 +++++-- mithril-aggregator/src/runtime/runner.rs | 42 ++++++------ .../src/runtime/state_machine.rs | 67 +++++++++++++------ .../services/certifier/certifier_service.rs | 55 +++++++++------ .../src/services/epoch_service.rs | 12 ++-- .../src/services/signed_entity.rs | 5 +- .../local_snapshot_uploader.rs | 8 +-- .../remote_snapshot_uploader.rs | 8 +-- mithril-aggregator/src/snapshotter.rs | 8 +-- .../src/store/epoch_settings_storer.rs | 2 - .../src/tools/certificates_hash_migrator.rs | 48 +++++++++---- mithril-aggregator/src/tools/genesis.rs | 6 +- .../src/tools/remote_file_uploader.rs | 13 ++-- .../src/tools/signer_importer.rs | 22 +++--- 19 files changed, 246 insertions(+), 160 deletions(-) diff --git a/mithril-aggregator/src/artifact_builder/cardano_immutable_files_full.rs b/mithril-aggregator/src/artifact_builder/cardano_immutable_files_full.rs index 63e0413a18d..c5643a72267 100644 --- a/mithril-aggregator/src/artifact_builder/cardano_immutable_files_full.rs +++ b/mithril-aggregator/src/artifact_builder/cardano_immutable_files_full.rs @@ -1,8 +1,7 @@ use anyhow::Context; use async_trait::async_trait; use semver::Version; -use slog::Logger; -use slog_scope::{debug, warn}; +use slog::{debug, warn, Logger}; use std::sync::Arc; use thiserror::Error; @@ -61,7 +60,10 @@ impl CardanoImmutableFilesFullArtifactBuilder { beacon: &CardanoDbBeacon, snapshot_digest: &str, ) -> StdResult { - debug!("CardanoImmutableFilesFullArtifactBuilder: create snapshot archive"); + debug!( + self.logger, + "CardanoImmutableFilesFullArtifactBuilder: create snapshot archive" + ); let snapshotter = self.snapshotter.clone(); let snapshot_name = format!( @@ -79,7 +81,7 @@ impl CardanoImmutableFilesFullArtifactBuilder { }) .await??; - debug!(" > snapshot created: '{:?}'", ongoing_snapshot); + debug!(self.logger, " > snapshot created: '{ongoing_snapshot:?}'"); Ok(ongoing_snapshot) } @@ -88,7 +90,10 @@ impl CardanoImmutableFilesFullArtifactBuilder { &self, ongoing_snapshot: &OngoingSnapshot, ) -> StdResult> { - debug!("CardanoImmutableFilesFullArtifactBuilder: upload snapshot archive"); + debug!( + self.logger, + "CardanoImmutableFilesFullArtifactBuilder: upload snapshot archive" + ); let location = self .snapshot_uploader .upload_snapshot(ongoing_snapshot.get_file_path()) @@ -96,8 +101,8 @@ impl CardanoImmutableFilesFullArtifactBuilder { if let Err(error) = tokio::fs::remove_file(ongoing_snapshot.get_file_path()).await { warn!( - " > Post upload ongoing snapshot file removal failure: {}", - error + self.logger, + " > Post upload ongoing snapshot file removal failure: {error}" ); } @@ -111,7 +116,10 @@ impl CardanoImmutableFilesFullArtifactBuilder { snapshot_digest: String, remote_locations: Vec, ) -> StdResult { - debug!("CardanoImmutableFilesFullArtifactBuilder: create snapshot"); + debug!( + self.logger, + "CardanoImmutableFilesFullArtifactBuilder: create snapshot" + ); let snapshot = Snapshot::new( snapshot_digest, diff --git a/mithril-aggregator/src/dependency_injection/builder.rs b/mithril-aggregator/src/dependency_injection/builder.rs index ce70cd0e66a..78ed10196e9 100644 --- a/mithril-aggregator/src/dependency_injection/builder.rs +++ b/mithril-aggregator/src/dependency_injection/builder.rs @@ -1,6 +1,6 @@ use anyhow::Context; use semver::Version; -use slog::Logger; +use slog::{debug, Logger}; use std::{collections::BTreeSet, sync::Arc}; use tokio::{ sync::{ @@ -560,6 +560,7 @@ impl DependenciesBuilder { } async fn build_epoch_settings_storer(&mut self) -> Result> { + let logger = self.get_logger()?; let epoch_settings_store = EpochSettingsStore::new( self.get_sqlite_connection().await?, self.configuration.safe_epoch_retention_limit(), @@ -591,11 +592,13 @@ impl DependenciesBuilder { .replace_cardano_signing_config_empty_values(cardano_signing_config)?; } + let epoch_settings_configuration = self.get_epoch_settings_configuration()?; + debug!( + logger, + "Handle discrepancies at startup of epoch settings store, will record epoch settings from the configuration for epoch {current_epoch}: {epoch_settings_configuration:?}" + ); epoch_settings_store - .handle_discrepancies_at_startup( - current_epoch, - &self.get_epoch_settings_configuration()?, - ) + .handle_discrepancies_at_startup(current_epoch, &epoch_settings_configuration) .await .map_err(|e| DependenciesBuilderError::Initialization { message: "can not create aggregator runner".to_string(), diff --git a/mithril-aggregator/src/event_store/runner.rs b/mithril-aggregator/src/event_store/runner.rs index a5636e67047..bb31db410ba 100644 --- a/mithril-aggregator/src/event_store/runner.rs +++ b/mithril-aggregator/src/event_store/runner.rs @@ -1,8 +1,7 @@ use anyhow::Context; use mithril_common::logging::LoggerExtensions; use mithril_common::StdResult; -use slog::Logger; -use slog_scope::{debug, info}; +use slog::{debug, info, Logger}; use sqlite::Connection; use std::{path::PathBuf, sync::Arc}; use tokio::sync::mpsc::UnboundedReceiver; @@ -36,16 +35,19 @@ impl EventStore { Arc::new(connection) }; let persister = EventPersister::new(connection); - info!("monitoring: starting event loop to log messages."); + info!( + self.logger, + "monitoring: starting event loop to log messages." + ); loop { if let Some(message) = self.receiver.recv().await { - debug!("Event received: {message:?}"); + debug!(self.logger, "Event received: {message:?}"); let event = persister .persist(message) .with_context(|| "event persist failure")?; - debug!("event ID={} created", event.event_id); + debug!(self.logger, "event ID={} created", event.event_id); } else { - info!("No more events to proceed, quitting…"); + info!(self.logger, "No more events to proceed, quitting…"); break; } } diff --git a/mithril-aggregator/src/event_store/transmitter_service.rs b/mithril-aggregator/src/event_store/transmitter_service.rs index 2af94a39aa5..303acf63328 100644 --- a/mithril-aggregator/src/event_store/transmitter_service.rs +++ b/mithril-aggregator/src/event_store/transmitter_service.rs @@ -1,6 +1,5 @@ use serde::Serialize; -use slog::Logger; -use slog_scope::warn; +use slog::{warn, Logger}; use std::fmt::Debug; use tokio::sync::mpsc::UnboundedSender; @@ -53,7 +52,7 @@ impl TransmitterService { { let content = serde_json::to_string(content).map_err(|e| { let error_msg = format!("Serialization error while forging event message: {e}"); - warn!("Event message error => «{error_msg}»"); + warn!(self.logger, "Event message error => «{error_msg}»"); error_msg })?; @@ -69,7 +68,7 @@ impl TransmitterService { self.get_transmitter().send(message.clone()).map_err(|e| { let error_msg = format!("An error occurred when sending message {message:?} to monitoring: '{e}'."); - warn!("Event message error => «{error_msg}»"); + warn!(self.logger, "Event message error => «{error_msg}»"); error_msg }) diff --git a/mithril-aggregator/src/http_server/routes/artifact_routes/cardano_stake_distribution.rs b/mithril-aggregator/src/http_server/routes/artifact_routes/cardano_stake_distribution.rs index b65408b9e69..6f2a1709c8d 100644 --- a/mithril-aggregator/src/http_server/routes/artifact_routes/cardano_stake_distribution.rs +++ b/mithril-aggregator/src/http_server/routes/artifact_routes/cardano_stake_distribution.rs @@ -20,6 +20,7 @@ fn artifact_cardano_stake_distributions( ) -> impl Filter + Clone { warp::path!("artifact" / "cardano-stake-distributions") .and(warp::get()) + .and(middlewares::with_logger(dependency_manager)) .and(middlewares::with_http_message_service(dependency_manager)) .and_then(handlers::list_artifacts) } @@ -30,6 +31,7 @@ fn artifact_cardano_stake_distribution_by_id( ) -> impl Filter + Clone { warp::path!("artifact" / "cardano-stake-distribution" / String) .and(warp::get()) + .and(middlewares::with_logger(dependency_manager)) .and(middlewares::with_http_message_service(dependency_manager)) .and_then(handlers::get_artifact_by_signed_entity_id) } @@ -40,6 +42,7 @@ fn artifact_cardano_stake_distribution_by_epoch( ) -> impl Filter + Clone { warp::path!("artifact" / "cardano-stake-distribution" / "epoch" / String) .and(warp::get()) + .and(middlewares::with_logger(dependency_manager)) .and(middlewares::with_http_message_service(dependency_manager)) .and_then(handlers::get_artifact_by_epoch) } @@ -49,7 +52,7 @@ pub mod handlers { use crate::services::MessageService; use mithril_common::entities::Epoch; - use slog_scope::{debug, warn}; + use slog::{debug, warn, Logger}; use std::convert::Infallible; use std::sync::Arc; use warp::http::StatusCode; @@ -58,9 +61,10 @@ pub mod handlers { /// List CardanoStakeDistribution artifacts pub async fn list_artifacts( + logger: Logger, http_message_service: Arc, ) -> Result { - debug!("⇄ HTTP SERVER: artifacts"); + debug!(logger, "⇄ HTTP SERVER: artifacts"); match http_message_service .get_cardano_stake_distribution_list_message(LIST_MAX_ITEMS) @@ -68,7 +72,7 @@ pub mod handlers { { Ok(message) => Ok(reply::json(&message, StatusCode::OK)), Err(err) => { - warn!("list_artifacts_cardano_stake_distribution"; "error" => ?err); + warn!(logger, "list_artifacts_cardano_stake_distribution"; "error" => ?err); Ok(reply::server_error(err)) } } @@ -77,9 +81,10 @@ pub mod handlers { /// Get Artifact by signed entity id pub async fn get_artifact_by_signed_entity_id( signed_entity_id: String, + logger: Logger, http_message_service: Arc, ) -> Result { - debug!("⇄ HTTP SERVER: artifact/{signed_entity_id}"); + debug!(logger, "⇄ HTTP SERVER: artifact/{signed_entity_id}"); match http_message_service .get_cardano_stake_distribution_message(&signed_entity_id) @@ -87,11 +92,11 @@ pub mod handlers { { Ok(Some(message)) => Ok(reply::json(&message, StatusCode::OK)), Ok(None) => { - warn!("get_cardano_stake_distribution_details::not_found"); + warn!(logger, "get_cardano_stake_distribution_details::not_found"); Ok(reply::empty(StatusCode::NOT_FOUND)) } Err(err) => { - warn!("get_cardano_stake_distribution_details::error"; "error" => ?err); + warn!(logger, "get_cardano_stake_distribution_details::error"; "error" => ?err); Ok(reply::server_error(err)) } } @@ -100,14 +105,15 @@ pub mod handlers { /// Get Artifact by epoch pub async fn get_artifact_by_epoch( epoch: String, + logger: Logger, http_message_service: Arc, ) -> Result { - debug!("⇄ HTTP SERVER: artifact/epoch/{epoch}"); + debug!(logger, "⇄ HTTP SERVER: artifact/epoch/{epoch}"); let artifact_epoch = match epoch.parse::() { Ok(epoch) => Epoch(epoch), Err(err) => { - warn!("get_artifact_by_epoch::invalid_epoch"; "error" => ?err); + warn!(logger, "get_artifact_by_epoch::invalid_epoch"; "error" => ?err); return Ok(reply::bad_request( "invalid_epoch".to_string(), err.to_string(), @@ -121,11 +127,14 @@ pub mod handlers { { Ok(Some(message)) => Ok(reply::json(&message, StatusCode::OK)), Ok(None) => { - warn!("get_cardano_stake_distribution_details_by_epoch::not_found"); + warn!( + logger, + "get_cardano_stake_distribution_details_by_epoch::not_found" + ); Ok(reply::empty(StatusCode::NOT_FOUND)) } Err(err) => { - warn!("get_cardano_stake_distribution_details_by_epoch::error"; "error" => ?err); + warn!(logger, "get_cardano_stake_distribution_details_by_epoch::error"; "error" => ?err); Ok(reply::server_error(err)) } } diff --git a/mithril-aggregator/src/multi_signer.rs b/mithril-aggregator/src/multi_signer.rs index 1fe8f9a3a98..2d0ba920a83 100644 --- a/mithril-aggregator/src/multi_signer.rs +++ b/mithril-aggregator/src/multi_signer.rs @@ -1,7 +1,6 @@ use anyhow::{anyhow, Context}; use async_trait::async_trait; -use slog::Logger; -use slog_scope::{debug, warn}; +use slog::{debug, warn, Logger}; use mithril_common::{ crypto_helper::{ProtocolAggregationError, ProtocolMultiSignature}, @@ -48,10 +47,11 @@ pub struct MultiSignerImpl { impl MultiSignerImpl { /// MultiSignerImpl factory pub fn new(epoch_service: EpochServiceWrapper, logger: Logger) -> Self { - debug!("New MultiSignerImpl created"); + let logger = logger.new_with_component_name::(); + debug!(logger, "New MultiSignerImpl created"); Self { epoch_service, - logger: logger.new_with_component_name::(), + logger, } } @@ -62,8 +62,11 @@ impl MultiSignerImpl { protocol_multi_signer: &ProtocolMultiSigner, ) -> StdResult<()> { debug!( + self.logger, "Verify single signature from {} at indexes {:?} for message {:?}", - single_signature.party_id, single_signature.won_indexes, message + single_signature.party_id, + single_signature.won_indexes, + message ); protocol_multi_signer @@ -111,7 +114,10 @@ impl MultiSigner for MultiSignerImpl { &self, open_message: &OpenMessage, ) -> StdResult> { - debug!("MultiSigner:create_multi_signature({open_message:?})"); + debug!( + self.logger, + "MultiSigner:create_multi_signature({open_message:?})" + ); let epoch_service = self.epoch_service.read().await; let protocol_multi_signer = epoch_service.protocol_multi_signer().with_context(|| { @@ -124,7 +130,10 @@ impl MultiSigner for MultiSignerImpl { ) { Ok(multi_signature) => Ok(Some(multi_signature)), Err(ProtocolAggregationError::NotEnoughSignatures(actual, expected)) => { - warn!("Could not compute multi-signature: Not enough signatures. Got only {} out of {}.", actual, expected); + warn!( + self.logger, + "Could not compute multi-signature: Not enough signatures. Got only {actual} out of {expected}." + ); Ok(None) } Err(err) => Err(anyhow!(err).context(format!( diff --git a/mithril-aggregator/src/runtime/runner.rs b/mithril-aggregator/src/runtime/runner.rs index 772fdddb3ef..b1af5cce612 100644 --- a/mithril-aggregator/src/runtime/runner.rs +++ b/mithril-aggregator/src/runtime/runner.rs @@ -1,7 +1,6 @@ use anyhow::{anyhow, Context}; use async_trait::async_trait; -use slog::Logger; -use slog_scope::{debug, warn}; +use slog::{debug, warn, Logger}; use std::sync::Arc; use std::time::Duration; @@ -174,7 +173,7 @@ impl AggregatorRunner { impl AggregatorRunnerTrait for AggregatorRunner { /// Return the current time point from the chain async fn get_time_point_from_chain(&self) -> StdResult { - debug!("RUNNER: get time point from chain"); + debug!(self.logger, "RUNNER: get time point from chain"); let time_point = self .dependencies .ticker_service @@ -188,7 +187,7 @@ impl AggregatorRunnerTrait for AggregatorRunner { &self, signed_entity_type: &SignedEntityType, ) -> StdResult> { - debug!("RUNNER: get_current_open_message_for_signed_entity_type"; "signed_entity_type" => ?signed_entity_type); + debug!(self.logger,"RUNNER: get_current_open_message_for_signed_entity_type"; "signed_entity_type" => ?signed_entity_type); self.mark_open_message_if_expired(signed_entity_type) .await?; @@ -204,7 +203,7 @@ impl AggregatorRunnerTrait for AggregatorRunner { &self, current_time_point: &TimePoint, ) -> StdResult> { - debug!("RUNNER: get_current_non_certified_open_message"; "time_point" => #?current_time_point); + debug!(self.logger,"RUNNER: get_current_non_certified_open_message"; "time_point" => #?current_time_point); let signed_entity_types = self .list_available_signed_entity_types(current_time_point) .await?; @@ -233,7 +232,7 @@ impl AggregatorRunnerTrait for AggregatorRunner { } async fn is_certificate_chain_valid(&self, time_point: &TimePoint) -> StdResult<()> { - debug!("RUNNER: is_certificate_chain_valid"); + debug!(self.logger, "RUNNER: is_certificate_chain_valid"); self.dependencies .certifier_service .verify_certificate_chain(time_point.epoch) @@ -243,7 +242,7 @@ impl AggregatorRunnerTrait for AggregatorRunner { } async fn update_stake_distribution(&self, new_time_point: &TimePoint) -> StdResult<()> { - debug!("RUNNER: update stake distribution"; "time_point" => #?new_time_point); + debug!(self.logger,"RUNNER: update stake distribution"; "time_point" => #?new_time_point); self.dependencies .stake_distribution_service .update_stake_distribution() @@ -252,7 +251,7 @@ impl AggregatorRunnerTrait for AggregatorRunner { } async fn open_signer_registration_round(&self, new_time_point: &TimePoint) -> StdResult<()> { - debug!("RUNNER: open signer registration round"; "time_point" => #?new_time_point); + debug!(self.logger,"RUNNER: open signer registration round"; "time_point" => #?new_time_point); let registration_epoch = new_time_point.epoch.offset_to_recording_epoch(); let stakes = self @@ -269,7 +268,7 @@ impl AggregatorRunnerTrait for AggregatorRunner { } async fn close_signer_registration_round(&self) -> StdResult<()> { - debug!("RUNNER: close signer registration round"); + debug!(self.logger, "RUNNER: close signer registration round"); self.dependencies .signer_registration_round_opener @@ -290,7 +289,7 @@ impl AggregatorRunnerTrait for AggregatorRunner { &self, signed_entity_type: &SignedEntityType, ) -> StdResult { - debug!("RUNNER: compute protocol message"); + debug!(self.logger, "RUNNER: compute protocol message"); let protocol_message = self .dependencies .signable_builder_service @@ -305,7 +304,7 @@ impl AggregatorRunnerTrait for AggregatorRunner { &self, signed_entity_type: &SignedEntityType, ) -> StdResult> { - debug!("RUNNER: mark expired open message"); + debug!(self.logger, "RUNNER: mark expired open message"); let expired_open_message = self .dependencies @@ -315,8 +314,8 @@ impl AggregatorRunnerTrait for AggregatorRunner { .with_context(|| "CertifierService can not mark expired open message")?; debug!( - "RUNNER: marked expired open messages: {:#?}", - expired_open_message + self.logger, + "RUNNER: marked expired open messages: {:#?}", expired_open_message ); Ok(expired_open_message) @@ -327,7 +326,7 @@ impl AggregatorRunnerTrait for AggregatorRunner { time_point: TimePoint, signed_entity_type: &SignedEntityType, ) -> StdResult { - debug!("RUNNER: create new pending certificate"); + debug!(self.logger, "RUNNER: create new pending certificate"); let epoch_service = self.dependencies.epoch_service.read().await; let signers = epoch_service.current_signers_with_stake()?; @@ -359,7 +358,7 @@ impl AggregatorRunnerTrait for AggregatorRunner { &self, pending_certificate: CertificatePending, ) -> StdResult<()> { - debug!("RUNNER: saving pending certificate"); + debug!(self.logger, "RUNNER: saving pending certificate"); let signed_entity_type = pending_certificate.signed_entity_type.clone(); self.dependencies @@ -371,11 +370,11 @@ impl AggregatorRunnerTrait for AggregatorRunner { } async fn drop_pending_certificate(&self) -> StdResult> { - debug!("RUNNER: drop pending certificate"); + debug!(self.logger, "RUNNER: drop pending certificate"); let certificate_pending = self.dependencies.certificate_pending_store.remove().await?; if certificate_pending.is_none() { - warn!(" > drop_pending_certificate::no certificate pending in store, did the previous loop crashed ?"); + warn!(self.logger," > drop_pending_certificate::no certificate pending in store, did the previous loop crashed ?"); } Ok(certificate_pending) @@ -385,7 +384,7 @@ impl AggregatorRunnerTrait for AggregatorRunner { &self, signed_entity_type: &SignedEntityType, ) -> StdResult> { - debug!("RUNNER: create_certificate"); + debug!(self.logger, "RUNNER: create_certificate"); self.dependencies .certifier_service @@ -403,7 +402,7 @@ impl AggregatorRunnerTrait for AggregatorRunner { signed_entity_type: &SignedEntityType, certificate: &Certificate, ) -> StdResult<()> { - debug!("RUNNER: create artifact"); + debug!(self.logger, "RUNNER: create artifact"); self.dependencies .signed_entity_service .create_artifact(signed_entity_type.to_owned(), certificate) @@ -438,6 +437,7 @@ impl AggregatorRunnerTrait for AggregatorRunner { .era_checker .change_era(current_era, token.get_current_epoch()); debug!( + self.logger, "Current Era is {} (Epoch {}).", current_era, token.get_current_epoch() @@ -445,7 +445,7 @@ impl AggregatorRunnerTrait for AggregatorRunner { if token.get_next_supported_era().is_err() { let era_name = &token.get_next_era_marker().unwrap().name; - warn!("Upcoming Era '{era_name}' is not supported by this version of the software. Please update!"); + warn!(self.logger,"Upcoming Era '{era_name}' is not supported by this version of the software. Please update!"); } Ok(()) @@ -479,7 +479,7 @@ impl AggregatorRunnerTrait for AggregatorRunner { } async fn upkeep(&self) -> StdResult<()> { - debug!("RUNNER: upkeep"); + debug!(self.logger, "RUNNER: upkeep"); self.dependencies.upkeep_service.run().await } diff --git a/mithril-aggregator/src/runtime/state_machine.rs b/mithril-aggregator/src/runtime/state_machine.rs index 133a147ff68..8904376136a 100644 --- a/mithril-aggregator/src/runtime/state_machine.rs +++ b/mithril-aggregator/src/runtime/state_machine.rs @@ -7,8 +7,7 @@ use crate::{ use anyhow::Context; use mithril_common::entities::TimePoint; use mithril_common::logging::LoggerExtensions; -use slog::Logger; -use slog_scope::{crit, info, trace, warn}; +use slog::{crit, info, trace, warn, Logger}; use std::fmt::Display; use std::sync::Arc; use tokio::time::sleep; @@ -74,13 +73,13 @@ impl AggregatorRuntime { logger: Logger, ) -> Result { let logger = logger.new_with_component_name::(); - info!("initializing runtime"); + info!(logger, "initializing runtime"); let state = if let Some(init_state) = init_state { - trace!("got initial state from caller"); + trace!(logger, "got initial state from caller"); init_state } else { - trace!("idle state, no current time point"); + trace!(logger, "idle state, no current time point"); AggregatorState::Idle(IdleState { current_time_point: None, }) @@ -105,18 +104,21 @@ impl AggregatorRuntime { /// Launches an infinite loop ticking the state machine. pub async fn run(&mut self) -> Result<(), RuntimeError> { - info!("STATE MACHINE: launching"); + info!(self.logger, "STATE MACHINE: launching"); loop { if let Err(e) = self.cycle().await { - warn!("State machine issued an error: {e}"); + warn!(self.logger, "State machine issued an error: {e}"); match &e { RuntimeError::Critical { message: _, nested_error: _, } => { - crit!("state machine: a critical error occurred: {e:?}"); + crit!( + self.logger, + "state machine: a critical error occurred: {e:?}" + ); return Err(e); } @@ -125,6 +127,7 @@ impl AggregatorRuntime { nested_error, } => { warn!( + self.logger, "KeepState Error: {message}. Nested error: «{}».", nested_error .as_ref() @@ -137,6 +140,7 @@ impl AggregatorRuntime { nested_error, } => { warn!( + self.logger, "ReInit Error: {message}. Nested error: «{}».", nested_error .as_ref() @@ -151,6 +155,7 @@ impl AggregatorRuntime { } info!( + self.logger, "… Cycle finished, Sleeping for {} ms", self.config.interval.as_millis() ); @@ -160,8 +165,11 @@ impl AggregatorRuntime { /// Perform one tick of the state machine. pub async fn cycle(&mut self) -> Result<(), RuntimeError> { - info!("================================================================================"); - info!("STATE MACHINE: new cycle: {}", self.state); + info!( + self.logger, + "================================================================================" + ); + info!(self.logger, "STATE MACHINE: new cycle: {}", self.state); match self.state.clone() { AggregatorState::Idle(state) => { @@ -169,7 +177,7 @@ impl AggregatorRuntime { || "AggregatorRuntime in the state IDLE can not get current time point from chain", )?; - info!("→ trying to transition to READY"; "last_time_point" => ?last_time_point); + info!(self.logger, "→ trying to transition to READY"; "last_time_point" => ?last_time_point); self.try_transition_from_idle_to_ready( state.current_time_point, @@ -191,7 +199,7 @@ impl AggregatorRuntime { if state.current_time_point.epoch < last_time_point.epoch { // transition READY > IDLE - info!("→ Epoch has changed, transitioning to IDLE"; "last_time_point" => ?last_time_point); + info!(self.logger, "→ Epoch has changed, transitioning to IDLE"; "last_time_point" => ?last_time_point); self.state = AggregatorState::Idle(IdleState { current_time_point: Some(state.current_time_point), }); @@ -202,7 +210,7 @@ impl AggregatorRuntime { .with_context(|| "AggregatorRuntime can not get the current open message")? { // transition READY > SIGNING - info!("→ transitioning to SIGNING"); + info!(self.logger, "→ transitioning to SIGNING"); let new_state = self .transition_from_ready_to_signing(last_time_point.clone(), open_message.clone()) .await.with_context(|| format!("AggregatorRuntime can not perform a transition from READY state to SIGNING with entity_type: '{:?}'", open_message.signed_entity_type))?; @@ -210,7 +218,7 @@ impl AggregatorRuntime { } else { // READY > READY info!( - " â‹… no open message to certify, waiting…"; + self.logger, " â‹… no open message to certify, waiting…"; "time_point" => ?state.current_time_point ); self.state = AggregatorState::Ready(ReadyState { @@ -234,12 +242,15 @@ impl AggregatorRuntime { if state.current_time_point.epoch < last_time_point.epoch { // SIGNING > IDLE - info!("→ Epoch changed, transitioning to IDLE"); + info!(self.logger, "→ Epoch changed, transitioning to IDLE"); let new_state = self.transition_from_signing_to_idle(state).await?; self.state = AggregatorState::Idle(new_state); } else if is_outdated { // SIGNING > READY - info!("→ Open message changed, transitioning to READY"); + info!( + self.logger, + "→ Open message changed, transitioning to READY" + ); let new_state = self .transition_from_signing_to_ready_new_open_message(state) .await?; @@ -249,7 +260,7 @@ impl AggregatorRuntime { let new_state = self .transition_from_signing_to_ready_multisignature(state) .await?; - info!("→ a multi-signature has been created, build an artifact & a certificate and transitioning back to READY"); + info!(self.logger, "→ a multi-signature has been created, build an artifact & a certificate and transitioning back to READY"); self.state = AggregatorState::Ready(new_state); } } @@ -264,7 +275,7 @@ impl AggregatorRuntime { maybe_current_time_point: Option, new_time_point: TimePoint, ) -> Result<(), RuntimeError> { - trace!("trying transition from IDLE to READY state"); + trace!(self.logger, "trying transition from IDLE to READY state"); if maybe_current_time_point.is_none() || maybe_current_time_point.unwrap().epoch < new_time_point.epoch @@ -303,7 +314,10 @@ impl AggregatorRuntime { &self, state: SigningState, ) -> Result { - trace!("launching transition from SIGNING to READY state"); + trace!( + self.logger, + "launching transition from SIGNING to READY state" + ); let certificate = self .runner .create_certificate(&state.open_message.signed_entity_type) @@ -340,7 +354,10 @@ impl AggregatorRuntime { &self, state: SigningState, ) -> Result { - trace!("launching transition from SIGNING to IDLE state"); + trace!( + self.logger, + "launching transition from SIGNING to IDLE state" + ); self.runner.drop_pending_certificate().await?; Ok(IdleState { @@ -354,7 +371,10 @@ impl AggregatorRuntime { &self, state: SigningState, ) -> Result { - trace!("launching transition from SIGNING to READY state"); + trace!( + self.logger, + "launching transition from SIGNING to READY state" + ); self.runner.drop_pending_certificate().await?; Ok(ReadyState { @@ -369,7 +389,10 @@ impl AggregatorRuntime { new_time_point: TimePoint, open_message: OpenMessage, ) -> Result { - trace!("launching transition from READY to SIGNING state"); + trace!( + self.logger, + "launching transition from READY to SIGNING state" + ); let certificate_pending = self .runner diff --git a/mithril-aggregator/src/services/certifier/certifier_service.rs b/mithril-aggregator/src/services/certifier/certifier_service.rs index 99b3d368ac8..91747b712e3 100644 --- a/mithril-aggregator/src/services/certifier/certifier_service.rs +++ b/mithril-aggregator/src/services/certifier/certifier_service.rs @@ -1,8 +1,7 @@ use anyhow::Context; use async_trait::async_trait; use chrono::Utc; -use slog::Logger; -use slog_scope::{debug, info, trace, warn}; +use slog::{debug, info, trace, warn, Logger}; use std::sync::Arc; use mithril_common::certificate_chain::CertificateVerifier; @@ -73,6 +72,7 @@ impl MithrilCertifierService { signed_entity_type: &SignedEntityType, ) -> StdResult> { debug!( + self.logger, "CertifierService::get_open_message_record(signed_entity_type: {signed_entity_type:?})" ); @@ -89,7 +89,10 @@ impl MithrilCertifierService { #[async_trait] impl CertifierService for MithrilCertifierService { async fn inform_epoch(&self, epoch: Epoch) -> StdResult<()> { - debug!("CertifierService::inform_epoch(epoch: {epoch:?})"); + debug!( + self.logger, + "CertifierService::inform_epoch(epoch: {epoch:?})" + ); let nb = self .open_message_repository .clean_epoch(epoch) @@ -97,7 +100,7 @@ impl CertifierService for MithrilCertifierService { .with_context(|| { format!("Certifier can not clean open messages from epoch '{epoch}'") })?; - info!("MithrilCertifierService: Informed of a new Epoch: {epoch:?}. Cleaned {nb} open messages along with their single signatures."); + info!(self.logger, "MithrilCertifierService: Informed of a new Epoch: {epoch:?}. Cleaned {nb} open messages along with their single signatures."); Ok(()) } @@ -107,25 +110,25 @@ impl CertifierService for MithrilCertifierService { signed_entity_type: &SignedEntityType, signature: &SingleSignatures, ) -> StdResult { - debug!("CertifierService::register_single_signature(signed_entity_type: {signed_entity_type:?}, single_signatures: {signature:?}"); - trace!("CertifierService::register_single_signature"; "complete_single_signatures" => #?signature); + debug!(self.logger, "CertifierService::register_single_signature(signed_entity_type: {signed_entity_type:?}, single_signatures: {signature:?}"); + trace!(self.logger, "CertifierService::register_single_signature"; "complete_single_signatures" => #?signature); let open_message = self .get_open_message_record(signed_entity_type) .await.with_context(|| format!("CertifierService can not get open message record for signed_entity_type: '{signed_entity_type}'"))? .ok_or_else(|| { - warn!("CertifierService::register_single_signature: OpenMessage not found for type {signed_entity_type:?}."); + warn!(self.logger, "CertifierService::register_single_signature: OpenMessage not found for type {signed_entity_type:?}."); CertifierServiceError::NotFound(signed_entity_type.clone()) })?; if open_message.is_certified { - warn!("CertifierService::register_single_signature: open message {signed_entity_type:?} is already certified, cannot register single signature."); + warn!(self.logger, "CertifierService::register_single_signature: open message {signed_entity_type:?} is already certified, cannot register single signature."); return Err(CertifierServiceError::AlreadyCertified(signed_entity_type.clone()).into()); } if open_message.is_expired { - warn!("CertifierService::register_single_signature: open message {signed_entity_type:?} has expired, cannot register single signature."); + warn!(self.logger, "CertifierService::register_single_signature: open message {signed_entity_type:?} has expired, cannot register single signature."); return Err(CertifierServiceError::Expired(signed_entity_type.clone()).into()); } @@ -141,8 +144,8 @@ impl CertifierService for MithrilCertifierService { .single_signature_repository .create_single_signature(signature, &open_message.clone().into()) .await.with_context(|| format!("Certifier can not create the single signature from single_signature: '{signature:?}', open_message: '{open_message:?}'"))?; - info!("CertifierService::register_single_signature: created pool '{}' single signature for {signed_entity_type:?}.", single_signature.signer_id); - debug!("CertifierService::register_single_signature: created single signature for open message ID='{}'.", single_signature.open_message_id); + info!(self.logger, "CertifierService::register_single_signature: created pool '{}' single signature for {signed_entity_type:?}.", single_signature.signer_id); + debug!(self.logger, "CertifierService::register_single_signature: created single signature for open message ID='{}'.", single_signature.open_message_id); Ok(SignatureRegistrationStatus::Registered) } @@ -152,7 +155,7 @@ impl CertifierService for MithrilCertifierService { signed_entity_type: &SignedEntityType, protocol_message: &ProtocolMessage, ) -> StdResult { - debug!("CertifierService::create_open_message(signed_entity_type: {signed_entity_type:?}, protocol_message: {protocol_message:?})"); + debug!(self.logger, "CertifierService::create_open_message(signed_entity_type: {signed_entity_type:?}, protocol_message: {protocol_message:?})"); let open_message = self .open_message_repository .create_open_message( @@ -168,8 +171,9 @@ impl CertifierService for MithrilCertifierService { signed_entity_type.get_epoch_when_signed_entity_type_is_signed() ) })?; - info!("CertifierService::create_open_message: created open message for {signed_entity_type:?}"); + info!(self.logger, "CertifierService::create_open_message: created open message for {signed_entity_type:?}"); debug!( + self.logger, "CertifierService::create_open_message: created open message ID='{}'", open_message.open_message_id ); @@ -181,7 +185,10 @@ impl CertifierService for MithrilCertifierService { &self, signed_entity_type: &SignedEntityType, ) -> StdResult> { - debug!("CertifierService::get_open_message(signed_entity_type: {signed_entity_type:?})"); + debug!( + self.logger, + "CertifierService::get_open_message(signed_entity_type: {signed_entity_type:?})" + ); let open_message = self .open_message_repository @@ -197,7 +204,10 @@ impl CertifierService for MithrilCertifierService { &self, signed_entity_type: &SignedEntityType, ) -> StdResult> { - debug!("CertifierService::mark_open_message_if_expired"); + debug!( + self.logger, + "CertifierService::mark_open_message_if_expired" + ); let mut open_message_record = self .open_message_repository @@ -219,24 +229,27 @@ impl CertifierService for MithrilCertifierService { &self, signed_entity_type: &SignedEntityType, ) -> StdResult> { - debug!("CertifierService::create_certificate(signed_entity_type: {signed_entity_type:?})"); + debug!( + self.logger, + "CertifierService::create_certificate(signed_entity_type: {signed_entity_type:?})" + ); let open_message_record = self .get_open_message_record(signed_entity_type) .await? .ok_or_else(|| { - warn!("CertifierService::create_certificate: OpenMessage not found for type {signed_entity_type:?}."); + warn!(self.logger, "CertifierService::create_certificate: OpenMessage not found for type {signed_entity_type:?}."); CertifierServiceError::NotFound(signed_entity_type.clone()) })?; let open_message: OpenMessage = open_message_record.clone().into(); if open_message.is_certified { - warn!("CertifierService::create_certificate: open message {signed_entity_type:?} is already certified, cannot create certificate."); + warn!(self.logger, "CertifierService::create_certificate: open message {signed_entity_type:?} is already certified, cannot create certificate."); return Err(CertifierServiceError::AlreadyCertified(signed_entity_type.clone()).into()); } if open_message.is_expired { - warn!("CertifierService::create_certificate: open message {signed_entity_type:?} is expired, cannot create certificate."); + warn!(self.logger, "CertifierService::create_certificate: open message {signed_entity_type:?} is expired, cannot create certificate."); return Err(CertifierServiceError::Expired(signed_entity_type.clone()).into()); } @@ -247,11 +260,11 @@ impl CertifierService for MithrilCertifierService { .await? { None => { - debug!("CertifierService::create_certificate: No multi-signature could be created for open message {signed_entity_type:?}"); + debug!(self.logger, "CertifierService::create_certificate: No multi-signature could be created for open message {signed_entity_type:?}"); return Ok(None); } Some(signature) => { - info!("CertifierService::create_certificate: multi-signature created for open message {signed_entity_type:?}"); + info!(self.logger, "CertifierService::create_certificate: multi-signature created for open message {signed_entity_type:?}"); signature } }; diff --git a/mithril-aggregator/src/services/epoch_service.rs b/mithril-aggregator/src/services/epoch_service.rs index 8f9ca7f949c..c6de2fec6d5 100644 --- a/mithril-aggregator/src/services/epoch_service.rs +++ b/mithril-aggregator/src/services/epoch_service.rs @@ -1,7 +1,6 @@ use anyhow::Context; use async_trait::async_trait; -use slog::Logger; -use slog_scope::debug; +use slog::{debug, Logger}; use std::collections::BTreeSet; use std::sync::Arc; use thiserror::Error; @@ -189,8 +188,7 @@ impl MithrilEpochService { let recording_epoch = actual_epoch.offset_to_epoch_settings_recording_epoch(); debug!( - "EpochService: inserting epoch settings in epoch {}", - recording_epoch; + self.logger, "EpochService: inserting epoch settings in epoch {recording_epoch}"; "epoch_settings" => ?self.future_epoch_settings ); @@ -222,7 +220,7 @@ impl MithrilEpochService { #[async_trait] impl EpochService for MithrilEpochService { async fn inform_epoch(&mut self, epoch: Epoch) -> StdResult<()> { - debug!("EpochService::inform_epoch(epoch: {epoch:?})"); + debug!(self.logger, "EpochService::inform_epoch(epoch: {epoch:?})"); let signer_retrieval_epoch = epoch.offset_to_signer_retrieval_epoch().with_context(|| { @@ -279,7 +277,7 @@ impl EpochService for MithrilEpochService { } async fn update_epoch_settings(&mut self) -> StdResult<()> { - debug!("EpochService::update_epoch_settings"); + debug!(self.logger, "EpochService::update_epoch_settings"); let data = self.unwrap_data().with_context(|| { "can't update epoch settings if inform_epoch has not been called first" @@ -289,7 +287,7 @@ impl EpochService for MithrilEpochService { } async fn precompute_epoch_data(&mut self) -> StdResult<()> { - debug!("EpochService::precompute_epoch_data"); + debug!(self.logger, "EpochService::precompute_epoch_data"); let data = self.unwrap_data().with_context(|| { "can't precompute epoch data if inform_epoch has not been called first" diff --git a/mithril-aggregator/src/services/signed_entity.rs b/mithril-aggregator/src/services/signed_entity.rs index 481497ea3ed..caf5296289e 100644 --- a/mithril-aggregator/src/services/signed_entity.rs +++ b/mithril-aggregator/src/services/signed_entity.rs @@ -5,8 +5,7 @@ use anyhow::{anyhow, Context}; use async_trait::async_trait; use chrono::Utc; -use slog::Logger; -use slog_scope::info; +use slog::{info, Logger}; use std::sync::Arc; use tokio::task::JoinHandle; @@ -128,7 +127,7 @@ impl MithrilSignedEntityService { certificate: &Certificate, ) -> StdResult<()> { info!( - "MithrilSignedEntityService::create_artifact"; + self.logger, "MithrilSignedEntityService::create_artifact"; "signed_entity_type" => ?signed_entity_type, "certificate_hash" => &certificate.hash ); diff --git a/mithril-aggregator/src/snapshot_uploaders/local_snapshot_uploader.rs b/mithril-aggregator/src/snapshot_uploaders/local_snapshot_uploader.rs index 31f52ccf72d..c2f898de0c9 100644 --- a/mithril-aggregator/src/snapshot_uploaders/local_snapshot_uploader.rs +++ b/mithril-aggregator/src/snapshot_uploaders/local_snapshot_uploader.rs @@ -1,7 +1,6 @@ use anyhow::Context; use async_trait::async_trait; -use slog::Logger; -use slog_scope::debug; +use slog::{debug, Logger}; use std::path::{Path, PathBuf}; use mithril_common::logging::LoggerExtensions; @@ -25,11 +24,12 @@ pub struct LocalSnapshotUploader { impl LocalSnapshotUploader { /// LocalSnapshotUploader factory pub(crate) fn new(snapshot_server_url: String, target_location: &Path, logger: Logger) -> Self { - debug!("New LocalSnapshotUploader created"; "snapshot_server_url" => &snapshot_server_url); + let logger = logger.new_with_component_name::(); + debug!(logger, "New LocalSnapshotUploader created"; "snapshot_server_url" => &snapshot_server_url); Self { snapshot_server_url, target_location: target_location.to_path_buf(), - logger: logger.new_with_component_name::(), + logger, } } } diff --git a/mithril-aggregator/src/snapshot_uploaders/remote_snapshot_uploader.rs b/mithril-aggregator/src/snapshot_uploaders/remote_snapshot_uploader.rs index 036a2996480..e99fb97a076 100644 --- a/mithril-aggregator/src/snapshot_uploaders/remote_snapshot_uploader.rs +++ b/mithril-aggregator/src/snapshot_uploaders/remote_snapshot_uploader.rs @@ -1,6 +1,5 @@ use async_trait::async_trait; -use slog::Logger; -use slog_scope::debug; +use slog::{debug, Logger}; use std::path::Path; use mithril_common::logging::LoggerExtensions; @@ -25,12 +24,13 @@ impl RemoteSnapshotUploader { use_cdn_domain: bool, logger: Logger, ) -> Self { - debug!("New GCPSnapshotUploader created"); + let logger = logger.new_with_component_name::(); + debug!(logger, "New GCPSnapshotUploader created"); Self { bucket, file_uploader, use_cdn_domain, - logger: logger.new_with_component_name::(), + logger, } } } diff --git a/mithril-aggregator/src/snapshotter.rs b/mithril-aggregator/src/snapshotter.rs index d9f288dbbad..9aaeb1da3f3 100644 --- a/mithril-aggregator/src/snapshotter.rs +++ b/mithril-aggregator/src/snapshotter.rs @@ -1,8 +1,7 @@ use anyhow::{anyhow, Context}; use flate2::Compression; use flate2::{read::GzDecoder, write::GzEncoder}; -use slog::Logger; -use slog_scope::{info, warn}; +use slog::{info, warn, Logger}; use std::fs::{self, File}; use std::io::{self, Read, Seek, SeekFrom}; use std::path::{Path, PathBuf}; @@ -102,7 +101,7 @@ impl Snapshotter for CompressedArchiveSnapshotter { let filesize = self.create_and_verify_archive(&archive_path).inspect_err(|_err| { if archive_path.exists() { if let Err(remove_error) = fs::remove_file(&archive_path) { - warn!( + warn!(self.logger, " > Post snapshotter.snapshot failure, could not remove temporary archive at path: path:{}, err: {}", archive_path.display(), remove_error @@ -162,6 +161,7 @@ impl CompressedArchiveSnapshotter { fn create_archive(&self, archive_path: &Path) -> StdResult { info!( + self.logger, "compressing {} into {}", self.db_directory.display(), archive_path.display() @@ -247,7 +247,7 @@ impl CompressedArchiveSnapshotter { // Verify if an archive is corrupted (i.e. at least one entry is invalid) fn verify_archive(&self, archive_path: &Path) -> StdResult<()> { - info!("verifying archive: {}", archive_path.display()); + info!(self.logger, "verifying archive: {}", archive_path.display()); let mut snapshot_file_tar = File::open(archive_path) .map_err(|e| SnapshotError::InvalidArchiveError(e.to_string()))?; diff --git a/mithril-aggregator/src/store/epoch_settings_storer.rs b/mithril-aggregator/src/store/epoch_settings_storer.rs index d90c4a67374..504c055ddb6 100644 --- a/mithril-aggregator/src/store/epoch_settings_storer.rs +++ b/mithril-aggregator/src/store/epoch_settings_storer.rs @@ -2,7 +2,6 @@ use std::collections::HashMap; use async_trait::async_trait; use mithril_common::StdResult; -use slog_scope::debug; use tokio::sync::RwLock; use mithril_common::entities::{Epoch, ProtocolParameters}; @@ -37,7 +36,6 @@ pub trait EpochSettingsStorer: Sync + Send { for epoch_offset in 0..=2 { let epoch = current_epoch + epoch_offset; if self.get_epoch_settings(epoch).await?.is_none() { - debug!("Handle discrepancies at startup of epoch settings store, will record epoch settings from the configuration for epoch {epoch}: {epoch_settings_configuration:?}"); self.save_epoch_settings(epoch, epoch_settings_configuration.clone()) .await?; } diff --git a/mithril-aggregator/src/tools/certificates_hash_migrator.rs b/mithril-aggregator/src/tools/certificates_hash_migrator.rs index a370df737a0..b9a1e18adee 100644 --- a/mithril-aggregator/src/tools/certificates_hash_migrator.rs +++ b/mithril-aggregator/src/tools/certificates_hash_migrator.rs @@ -1,8 +1,7 @@ use std::{collections::HashMap, sync::Arc}; use anyhow::{anyhow, Context}; -use slog::Logger; -use slog_scope::{debug, info, trace}; +use slog::{debug, info, trace, Logger}; use mithril_common::logging::LoggerExtensions; use mithril_common::{entities::Certificate, StdResult}; @@ -32,7 +31,7 @@ impl CertificatesHashMigrator { /// Recompute all the certificates hashes the database. pub async fn migrate(&self) -> StdResult<()> { - info!("🔧 Certificate Hash Migrator: starting"); + info!(self.logger, "🔧 Certificate Hash Migrator: starting"); let (old_certificates, old_and_new_hashes) = self.create_certificates_with_updated_hash().await?; @@ -41,7 +40,10 @@ impl CertificatesHashMigrator { self.cleanup(old_certificates).await?; - info!("🔧 Certificate Hash Migrator: all certificates have been migrated successfully"); + info!( + self.logger, + "🔧 Certificate Hash Migrator: all certificates have been migrated successfully" + ); Ok(()) } @@ -50,7 +52,10 @@ impl CertificatesHashMigrator { async fn create_certificates_with_updated_hash( &self, ) -> StdResult<(Vec, HashMap)> { - info!("🔧 Certificate Hash Migrator: recomputing all certificates hash"); + info!( + self.logger, + "🔧 Certificate Hash Migrator: recomputing all certificates hash" + ); let old_certificates = self .certificate_repository // arbitrary high value to get all existing certificates @@ -65,7 +70,10 @@ impl CertificatesHashMigrator { // Note: get_latest_certificates retrieve certificates from the earliest to the older, // in order to have a strong guarantee that when inserting a certificate in the db its // previous_hash exist we have to work in the reverse order. - debug!("🔧 Certificate Hash Migrator: computing new hash for all certificates"); + debug!( + self.logger, + "🔧 Certificate Hash Migrator: computing new hash for all certificates" + ); for mut certificate in old_certificates.into_iter().rev() { let old_previous_hash = if certificate.is_genesis() { certificate.previous_hash.clone() @@ -90,14 +98,14 @@ impl CertificatesHashMigrator { if certificate.is_genesis() { trace!( - "🔧 Certificate Hash Migrator: new hash computed for genesis certificate {:?}", + self.logger, "🔧 Certificate Hash Migrator: new hash computed for genesis certificate {:?}", certificate.signed_entity_type(); "old_hash" => &certificate.hash, "new_hash" => &new_hash, ); } else { trace!( - "🔧 Certificate Hash Migrator: new hash computed for certificate {:?}", + self.logger, "🔧 Certificate Hash Migrator: new hash computed for certificate {:?}", certificate.signed_entity_type(); "old_hash" => &certificate.hash, "new_hash" => &new_hash, @@ -116,7 +124,10 @@ impl CertificatesHashMigrator { // 2 - Certificates migrated, we can insert them in the db // (we do this by chunks in order to avoid reaching the limit of 32766 variables in a single query) - debug!("🔧 Certificate Hash Migrator: inserting migrated certificates in the database"); + debug!( + self.logger, + "🔧 Certificate Hash Migrator: inserting migrated certificates in the database" + ); let migrated_certificates_chunk_size = 250; for migrated_certificates_chunk in migrated_certificates.chunks(migrated_certificates_chunk_size) @@ -136,7 +147,10 @@ impl CertificatesHashMigrator { &self, old_and_new_certificate_hashes: HashMap, ) -> StdResult<()> { - info!("🔧 Certificate Hash Migrator: updating signed entities certificate ids"); + info!( + self.logger, + "🔧 Certificate Hash Migrator: updating signed entities certificate ids" + ); let old_hashes: Vec<&str> = old_and_new_certificate_hashes .keys() .map(|k| k.as_str()) @@ -151,7 +165,7 @@ impl CertificatesHashMigrator { ) )?; - debug!("🔧 Certificate Hash Migrator: updating signed entities certificate_ids to new computed hash"); + debug!(self.logger,"🔧 Certificate Hash Migrator: updating signed entities certificate_ids to new computed hash"); for signed_entity_record in records_to_migrate.iter_mut() { let new_certificate_hash = old_and_new_certificate_hashes @@ -163,7 +177,7 @@ impl CertificatesHashMigrator { .to_owned(); trace!( - "🔧 Certificate Hash Migrator: migrating signed entity {} certificate hash computed for certificate", + self.logger, "🔧 Certificate Hash Migrator: migrating signed entity {} certificate hash computed for certificate", signed_entity_record.signed_entity_id; "old_certificate_hash" => &signed_entity_record.certificate_id, "new_certificate_hash" => &new_certificate_hash @@ -171,7 +185,10 @@ impl CertificatesHashMigrator { signed_entity_record.certificate_id = new_certificate_hash; } - debug!("🔧 Certificate Hash Migrator: updating migrated signed entities in the database"); + debug!( + self.logger, + "🔧 Certificate Hash Migrator: updating migrated signed entities in the database" + ); self.signed_entity_storer .update_signed_entities(records_to_migrate) .await @@ -181,7 +198,10 @@ impl CertificatesHashMigrator { } async fn cleanup(&self, old_certificates: Vec) -> StdResult<()> { - info!("🔧 Certificate Hash Migrator: deleting old certificates in the database"); + info!( + self.logger, + "🔧 Certificate Hash Migrator: deleting old certificates in the database" + ); self.certificate_repository .delete_certificates(&old_certificates.iter().collect::>()) .await diff --git a/mithril-aggregator/src/tools/genesis.rs b/mithril-aggregator/src/tools/genesis.rs index de28c9a8f59..0ea2ae0370e 100644 --- a/mithril-aggregator/src/tools/genesis.rs +++ b/mithril-aggregator/src/tools/genesis.rs @@ -206,7 +206,6 @@ impl GenesisTools { #[cfg(test)] mod tests { - use crate::database::test_helper::main_db_connection; use mithril_common::{ certificate_chain::MithrilCertificateVerifier, crypto_helper::ProtocolGenesisSigner, @@ -214,6 +213,9 @@ mod tests { }; use std::path::PathBuf; + use crate::database::test_helper::main_db_connection; + use crate::test_tools::TestLogger; + use super::*; fn get_temp_dir(dir_name: &str) -> PathBuf { @@ -237,7 +239,7 @@ mod tests { let connection = main_db_connection().unwrap(); let certificate_store = Arc::new(CertificateRepository::new(Arc::new(connection))); let certificate_verifier = Arc::new(MithrilCertificateVerifier::new( - slog_scope::logger(), + TestLogger::stdout(), certificate_store.clone(), )); let genesis_avk = create_fake_genesis_avk(); diff --git a/mithril-aggregator/src/tools/remote_file_uploader.rs b/mithril-aggregator/src/tools/remote_file_uploader.rs index 7b305f60648..9c386fb22a0 100644 --- a/mithril-aggregator/src/tools/remote_file_uploader.rs +++ b/mithril-aggregator/src/tools/remote_file_uploader.rs @@ -4,8 +4,7 @@ use cloud_storage::{ bucket::Entity, bucket_access_control::Role, object_access_control::NewObjectAccessControl, Client, }; -use slog::Logger; -use slog_scope::info; +use slog::{info, Logger}; use std::{env, path::Path}; use tokio_util::{codec::BytesCodec, codec::FramedRead}; @@ -47,7 +46,7 @@ impl RemoteFileUploader for GcpFileUploader { let filename = filepath.file_name().unwrap().to_str().unwrap(); - info!("uploading {}", filename); + info!(self.logger, "uploading {filename}"); let client = Client::default(); let file = tokio::fs::File::open(filepath).await.unwrap(); let stream = FramedRead::new(file, BytesCodec::new()); @@ -63,7 +62,7 @@ impl RemoteFileUploader for GcpFileUploader { .await .with_context(|| "remote uploading failure")?; - info!("uploaded {}", filename); + info!(self.logger, "uploaded {filename}"); // ensure the uploaded file as public read access // when a file is uploaded to Google cloud storage its permissions are overwritten so @@ -74,8 +73,8 @@ impl RemoteFileUploader for GcpFileUploader { }; info!( - "updating acl for {}: {:?}", - filename, new_bucket_access_control + self.logger, + "updating acl for {filename}: {new_bucket_access_control:?}" ); client @@ -84,7 +83,7 @@ impl RemoteFileUploader for GcpFileUploader { .await .with_context(|| "updating acl failure")?; - info!("updated acl for {} ", filename); + info!(self.logger, "updated acl for {filename}"); Ok(()) } diff --git a/mithril-aggregator/src/tools/signer_importer.rs b/mithril-aggregator/src/tools/signer_importer.rs index 34ed8489eb9..c5d97ec7d53 100644 --- a/mithril-aggregator/src/tools/signer_importer.rs +++ b/mithril-aggregator/src/tools/signer_importer.rs @@ -2,8 +2,7 @@ use anyhow::Context; use async_trait::async_trait; use reqwest::{IntoUrl, Url}; use serde::{Deserialize, Serialize}; -use slog::Logger; -use slog_scope::{info, warn}; +use slog::{info, warn, Logger}; use std::collections::HashMap; use std::ops::Not; use std::sync::Arc; @@ -39,12 +38,17 @@ impl SignersImporter { /// Import and persist the signers pub async fn run(&self) -> StdResult<()> { - info!("🔧 Signer Importer: starting"); + info!(self.logger, "🔧 Signer Importer: starting"); let items = self .retriever .retrieve() .await .with_context(|| "Failed to retrieve signers from remote service")?; + + info!(self.logger, + "🔧 Signer Importer: persisting retrieved data in the database"; + "number_of_signer_to_insert" => items.len() + ); self.persister .persist(items) .await @@ -58,9 +62,13 @@ impl SignersImporter { loop { interval.tick().await; if let Err(error) = self.run().await { - warn!("Signer retriever failed: Error: «{:?}».", error); + warn!( + self.logger, + "Signer retriever failed: Error: «{:?}».", error + ); } info!( + self.logger, "🔧 Signer Importer: Cycle finished, Sleeping for {} min", run_interval.as_secs() / 60 ); @@ -87,10 +95,6 @@ pub trait SignersImporterPersister: Sync + Send { #[async_trait] impl SignersImporterPersister for SignerStore { async fn persist(&self, signers: HashMap>) -> StdResult<()> { - info!( - "🔧 Signer Importer: persisting retrieved data in the database"; - "number_of_signer_to_insert" => signers.len() - ); self.import_many_signers(signers).await?; Ok(()) @@ -135,7 +139,7 @@ impl CExplorerSignerRetriever { impl SignersImporterRetriever for CExplorerSignerRetriever { async fn retrieve(&self) -> StdResult>> { info!( - "🔧 Signer Importer: retrieving data from source"; + self.logger, "🔧 Signer Importer: retrieving data from source"; "source_url" => &self.source_url.as_str() ); let response = self From 358126139f8135f712bd9f839f942736c49fe493 Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Fri, 11 Oct 2024 18:48:06 +0200 Subject: [PATCH 257/274] refactor(aggregator): create & dispatch a root logger in commands --- .../src/commands/era_command.rs | 38 ++++++++---- .../src/commands/genesis_command.rs | 58 ++++++++++++++----- mithril-aggregator/src/commands/mod.rs | 23 ++++---- .../src/commands/serve_command.rs | 18 ++++-- .../src/commands/tools_command.rs | 30 +++++++--- mithril-aggregator/src/main.rs | 4 +- 6 files changed, 119 insertions(+), 52 deletions(-) diff --git a/mithril-aggregator/src/commands/era_command.rs b/mithril-aggregator/src/commands/era_command.rs index fd9b2bae468..dfede5f9ad5 100644 --- a/mithril-aggregator/src/commands/era_command.rs +++ b/mithril-aggregator/src/commands/era_command.rs @@ -8,7 +8,7 @@ use mithril_common::{ entities::{Epoch, HexEncodedEraMarkersSecretKey}, StdResult, }; -use slog_scope::debug; +use slog::{debug, Logger}; use crate::tools::EraTools; @@ -21,8 +21,14 @@ pub struct EraCommand { } impl EraCommand { - pub async fn execute(&self, config_builder: ConfigBuilder) -> StdResult<()> { - self.era_subcommand.execute(config_builder).await + pub async fn execute( + &self, + root_logger: Logger, + config_builder: ConfigBuilder, + ) -> StdResult<()> { + self.era_subcommand + .execute(root_logger, config_builder) + .await } } @@ -37,10 +43,14 @@ pub enum EraSubCommand { } impl EraSubCommand { - pub async fn execute(&self, config_builder: ConfigBuilder) -> StdResult<()> { + pub async fn execute( + &self, + root_logger: Logger, + config_builder: ConfigBuilder, + ) -> StdResult<()> { match self { - Self::List(cmd) => cmd.execute(config_builder).await, - Self::GenerateTxDatum(cmd) => cmd.execute(config_builder).await, + Self::List(cmd) => cmd.execute(root_logger, config_builder).await, + Self::GenerateTxDatum(cmd) => cmd.execute(root_logger, config_builder).await, } } } @@ -54,8 +64,12 @@ pub struct ListEraSubCommand { } impl ListEraSubCommand { - pub async fn execute(&self, _config_builder: ConfigBuilder) -> StdResult<()> { - debug!("LIST ERA command"); + pub async fn execute( + &self, + root_logger: Logger, + _config_builder: ConfigBuilder, + ) -> StdResult<()> { + debug!(root_logger, "LIST ERA command"); let era_tools = EraTools::new(); let eras = era_tools.get_supported_eras_list()?; @@ -91,8 +105,12 @@ pub struct GenerateTxDatumEraSubCommand { } impl GenerateTxDatumEraSubCommand { - pub async fn execute(&self, _config_builder: ConfigBuilder) -> StdResult<()> { - debug!("GENERATETXDATUM ERA command"); + pub async fn execute( + &self, + root_logger: Logger, + _config_builder: ConfigBuilder, + ) -> StdResult<()> { + debug!(root_logger, "GENERATETXDATUM ERA command"); let era_tools = EraTools::new(); let era_markers_secret_key = diff --git a/mithril-aggregator/src/commands/genesis_command.rs b/mithril-aggregator/src/commands/genesis_command.rs index c5b2a182793..d25fbef7a34 100644 --- a/mithril-aggregator/src/commands/genesis_command.rs +++ b/mithril-aggregator/src/commands/genesis_command.rs @@ -6,7 +6,7 @@ use mithril_common::{ entities::HexEncodedGenesisSecretKey, StdResult, }; -use slog_scope::debug; +use slog::{debug, Logger}; use std::path::PathBuf; use crate::{dependency_injection::DependenciesBuilder, tools::GenesisTools, Configuration}; @@ -20,8 +20,14 @@ pub struct GenesisCommand { } impl GenesisCommand { - pub async fn execute(&self, config_builder: ConfigBuilder) -> StdResult<()> { - self.genesis_subcommand.execute(config_builder).await + pub async fn execute( + &self, + root_logger: Logger, + config_builder: ConfigBuilder, + ) -> StdResult<()> { + self.genesis_subcommand + .execute(root_logger, config_builder) + .await } } @@ -42,12 +48,16 @@ pub enum GenesisSubCommand { } impl GenesisSubCommand { - pub async fn execute(&self, config_builder: ConfigBuilder) -> StdResult<()> { + pub async fn execute( + &self, + root_logger: Logger, + config_builder: ConfigBuilder, + ) -> StdResult<()> { match self { - Self::Bootstrap(cmd) => cmd.execute(config_builder).await, - Self::Export(cmd) => cmd.execute(config_builder).await, - Self::Import(cmd) => cmd.execute(config_builder).await, - Self::Sign(cmd) => cmd.execute(config_builder).await, + Self::Bootstrap(cmd) => cmd.execute(root_logger, config_builder).await, + Self::Export(cmd) => cmd.execute(root_logger, config_builder).await, + Self::Import(cmd) => cmd.execute(root_logger, config_builder).await, + Self::Sign(cmd) => cmd.execute(root_logger, config_builder).await, } } } @@ -61,13 +71,17 @@ pub struct ExportGenesisSubCommand { } impl ExportGenesisSubCommand { - pub async fn execute(&self, config_builder: ConfigBuilder) -> StdResult<()> { + pub async fn execute( + &self, + root_logger: Logger, + config_builder: ConfigBuilder, + ) -> StdResult<()> { let config: Configuration = config_builder .build() .with_context(|| "configuration build error")? .try_deserialize() .with_context(|| "configuration deserialize error")?; - debug!("EXPORT GENESIS command"; "config" => format!("{config:?}")); + debug!(root_logger, "EXPORT GENESIS command"; "config" => format!("{config:?}")); println!( "Genesis export payload to sign to {}", self.target_path.display() @@ -98,13 +112,17 @@ pub struct ImportGenesisSubCommand { } impl ImportGenesisSubCommand { - pub async fn execute(&self, config_builder: ConfigBuilder) -> StdResult<()> { + pub async fn execute( + &self, + root_logger: Logger, + config_builder: ConfigBuilder, + ) -> StdResult<()> { let config: Configuration = config_builder .build() .with_context(|| "configuration build error")? .try_deserialize() .with_context(|| "configuration deserialize error")?; - debug!("IMPORT GENESIS command"; "config" => format!("{config:?}")); + debug!(root_logger, "IMPORT GENESIS command"; "config" => format!("{config:?}")); println!( "Genesis import signed payload from {}", self.signed_payload_path.to_string_lossy() @@ -144,8 +162,12 @@ pub struct SignGenesisSubCommand { } impl SignGenesisSubCommand { - pub async fn execute(&self, _config_builder: ConfigBuilder) -> StdResult<()> { - debug!("SIGN GENESIS command"); + pub async fn execute( + &self, + root_logger: Logger, + _config_builder: ConfigBuilder, + ) -> StdResult<()> { + debug!(root_logger, "SIGN GENESIS command"); println!( "Genesis sign payload from {} to {}", self.to_sign_payload_path.to_string_lossy(), @@ -171,13 +193,17 @@ pub struct BootstrapGenesisSubCommand { } impl BootstrapGenesisSubCommand { - pub async fn execute(&self, config_builder: ConfigBuilder) -> StdResult<()> { + pub async fn execute( + &self, + root_logger: Logger, + config_builder: ConfigBuilder, + ) -> StdResult<()> { let config: Configuration = config_builder .build() .with_context(|| "configuration build error")? .try_deserialize() .with_context(|| "configuration deserialize error")?; - debug!("BOOTSTRAP GENESIS command"; "config" => format!("{config:?}")); + debug!(root_logger, "BOOTSTRAP GENESIS command"; "config" => format!("{config:?}")); println!("Genesis bootstrap for test only!"); let mut dependencies_builder = DependenciesBuilder::new(config.clone()); let dependencies = dependencies_builder diff --git a/mithril-aggregator/src/commands/mod.rs b/mithril-aggregator/src/commands/mod.rs index b993cc4e804..0cdac03d933 100644 --- a/mithril-aggregator/src/commands/mod.rs +++ b/mithril-aggregator/src/commands/mod.rs @@ -8,8 +8,7 @@ use clap::{CommandFactory, Parser, Subcommand}; use config::{builder::DefaultState, ConfigBuilder, Map, Source, Value, ValueKind}; use mithril_common::StdResult; use mithril_doc::{Documenter, DocumenterDefault, StructDoc}; -use slog::Level; -use slog_scope::debug; +use slog::{debug, Level, Logger}; use std::path::PathBuf; use crate::{Configuration, DefaultConfiguration}; @@ -35,12 +34,16 @@ pub enum CommandType { } impl MainCommand { - pub async fn execute(&self, config_builder: ConfigBuilder) -> StdResult<()> { + pub async fn execute( + &self, + root_logger: Logger, + config_builder: ConfigBuilder, + ) -> StdResult<()> { match self { - Self::Genesis(cmd) => cmd.execute(config_builder).await, - Self::Era(cmd) => cmd.execute(config_builder).await, - Self::Serve(cmd) => cmd.execute(config_builder).await, - Self::Tools(cmd) => cmd.execute(config_builder).await, + Self::Genesis(cmd) => cmd.execute(root_logger, config_builder).await, + Self::Era(cmd) => cmd.execute(root_logger, config_builder).await, + Self::Serve(cmd) => cmd.execute(root_logger, config_builder).await, + Self::Tools(cmd) => cmd.execute(root_logger, config_builder).await, Self::GenerateDoc(cmd) => { let config_infos = vec![Configuration::extract(), DefaultConfiguration::extract()]; cmd.execute_with_configurations(&mut MainOpts::command(), &config_infos) @@ -111,7 +114,7 @@ impl Source for MainOpts { impl MainOpts { /// execute command - pub async fn execute(&self) -> StdResult<()> { + pub async fn execute(&self, root_logger: Logger) -> StdResult<()> { let config_file_path = self .config_directory .join(format!("{}.json", self.run_mode)); @@ -122,9 +125,9 @@ impl MainOpts { ) .add_source(config::Environment::default().separator("__")) .add_source(self.clone()); - debug!("Started"; "run_mode" => &self.run_mode, "node_version" => env!("CARGO_PKG_VERSION")); + debug!(root_logger, "Started"; "run_mode" => &self.run_mode, "node_version" => env!("CARGO_PKG_VERSION")); - self.command.execute(config_builder).await + self.command.execute(root_logger, config_builder).await } /// get log level from parameters diff --git a/mithril-aggregator/src/commands/serve_command.rs b/mithril-aggregator/src/commands/serve_command.rs index fcb8aad12bd..c17efc175fc 100644 --- a/mithril-aggregator/src/commands/serve_command.rs +++ b/mithril-aggregator/src/commands/serve_command.rs @@ -2,7 +2,7 @@ use anyhow::Context; use clap::Parser; use config::{builder::DefaultState, ConfigBuilder, Map, Source, Value, ValueKind}; use mithril_common::StdResult; -use slog_scope::{crit, debug, info, warn}; +use slog::{crit, debug, info, warn, Logger}; use std::time::Duration; use std::{net::IpAddr, path::PathBuf}; use tokio::{sync::oneshot, task::JoinSet}; @@ -80,14 +80,18 @@ impl Source for ServeCommand { } impl ServeCommand { - pub async fn execute(&self, mut config_builder: ConfigBuilder) -> StdResult<()> { + pub async fn execute( + &self, + root_logger: Logger, + mut config_builder: ConfigBuilder, + ) -> StdResult<()> { config_builder = config_builder.add_source(self.clone()); let config: Configuration = config_builder .build() .with_context(|| "configuration build error")? .try_deserialize() .with_context(|| "configuration deserialize error")?; - debug!("SERVE command"; "config" => format!("{config:?}")); + debug!(root_logger, "SERVE command"; "config" => format!("{config:?}")); let mut dependencies_builder = DependenciesBuilder::new(config.clone()); // start servers @@ -172,8 +176,10 @@ impl ServeCommand { } Err(error) => { warn!( + root_logger, "Failed to build the `SignersImporter`:\n url to import `{}`\n Error: {:?}", - cexplorer_pools_url, error + cexplorer_pools_url, + error ); } } @@ -183,7 +189,7 @@ impl ServeCommand { dependencies_builder.vanish().await; if let Err(e) = join_set.join_next().await.unwrap()? { - crit!("A critical error occurred: {e}"); + crit!(root_logger, "A critical error occurred: {e}"); } // stop servers @@ -194,7 +200,7 @@ impl ServeCommand { preload_task.abort(); } - info!("Event store is finishing..."); + info!(root_logger, "Event store is finishing..."); event_store_thread.await.unwrap(); println!("Services stopped, exiting."); diff --git a/mithril-aggregator/src/commands/tools_command.rs b/mithril-aggregator/src/commands/tools_command.rs index 5f0faba0ece..959191917ae 100644 --- a/mithril-aggregator/src/commands/tools_command.rs +++ b/mithril-aggregator/src/commands/tools_command.rs @@ -3,7 +3,7 @@ use clap::{Parser, Subcommand}; use config::{builder::DefaultState, ConfigBuilder}; use mithril_common::StdResult; use mithril_persistence::sqlite::{SqliteCleaner, SqliteCleaningTask}; -use slog_scope::debug; +use slog::{debug, Logger}; use std::sync::Arc; use crate::{ @@ -22,8 +22,14 @@ pub struct ToolsCommand { } impl ToolsCommand { - pub async fn execute(&self, config_builder: ConfigBuilder) -> StdResult<()> { - self.genesis_subcommand.execute(config_builder).await + pub async fn execute( + &self, + root_logger: Logger, + config_builder: ConfigBuilder, + ) -> StdResult<()> { + self.genesis_subcommand + .execute(root_logger, config_builder) + .await } } @@ -39,9 +45,13 @@ pub enum ToolsSubCommand { } impl ToolsSubCommand { - pub async fn execute(&self, config_builder: ConfigBuilder) -> StdResult<()> { + pub async fn execute( + &self, + root_logger: Logger, + config_builder: ConfigBuilder, + ) -> StdResult<()> { match self { - Self::RecomputeCertificatesHash(cmd) => cmd.execute(config_builder).await, + Self::RecomputeCertificatesHash(cmd) => cmd.execute(root_logger, config_builder).await, } } } @@ -51,13 +61,17 @@ impl ToolsSubCommand { pub struct RecomputeCertificatesHashCommand {} impl RecomputeCertificatesHashCommand { - pub async fn execute(&self, config_builder: ConfigBuilder) -> StdResult<()> { + pub async fn execute( + &self, + root_logger: Logger, + config_builder: ConfigBuilder, + ) -> StdResult<()> { let config: Configuration = config_builder .build() .with_context(|| "configuration build error")? .try_deserialize() .with_context(|| "configuration deserialize error")?; - debug!("RECOMPUTE CERTIFICATES HASH command"; "config" => format!("{config:?}")); + debug!(root_logger, "RECOMPUTE CERTIFICATES HASH command"; "config" => format!("{config:?}")); println!("Recomputing all certificate hash",); let mut dependencies_builder = DependenciesBuilder::new(config.clone()); let connection = dependencies_builder @@ -67,7 +81,7 @@ impl RecomputeCertificatesHashCommand { let migrator = CertificatesHashMigrator::new( CertificateRepository::new(connection.clone()), Arc::new(SignedEntityStore::new(connection.clone())), - dependencies_builder.get_logger()?, + root_logger, ); migrator diff --git a/mithril-aggregator/src/main.rs b/mithril-aggregator/src/main.rs index cfb18b86bc1..3d9c1e8b371 100644 --- a/mithril-aggregator/src/main.rs +++ b/mithril-aggregator/src/main.rs @@ -28,10 +28,10 @@ pub fn build_logger(args: &MainOpts) -> Logger { async fn main() -> StdResult<()> { // Load args let args = MainOpts::parse(); - let _guard = slog_scope::set_global_logger(build_logger(&args)); + let root_logger = build_logger(&args); #[cfg(feature = "bundle_openssl")] openssl_probe::init_ssl_cert_env_vars(); - args.execute().await + args.execute(root_logger).await } From e8e634c4793490a33098c1605510c0b5cfe5cb8c Mon Sep 17 00:00:00 2001 From: Damien Lachaume <135982616+dlachaume@users.noreply.github.com> Date: Fri, 11 Oct 2024 18:22:37 +0200 Subject: [PATCH 258/274] ci: use a new action in the `create-pre-release` job This replaces the unmaintained `marvinpinto/action-automatic-releases` action and handles the update of the release body, previously done by the `tubone24/update_release` action. --- .github/workflows/pre-release.yml | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/.github/workflows/pre-release.yml b/.github/workflows/pre-release.yml index 9b977d7cc70..c7f0da86a08 100644 --- a/.github/workflows/pre-release.yml +++ b/.github/workflows/pre-release.yml @@ -76,23 +76,15 @@ jobs: compatibility-table: '{ "release-mainnet": "â›”", "release-preprod": "â›”", "pre-release-preview": "✔", "testing-preview": "â›”", "testing-sanchonet": "â›”" }' - name: Create pre-release ${{ github.ref_name }} - uses: marvinpinto/action-automatic-releases@latest + uses: softprops/action-gh-release@v2 with: - repo_token: ${{ secrets.GITHUB_TOKEN }} - automatic_release_tag: ${{ github.ref_name }} + token: ${{ secrets.GITHUB_TOKEN }} + tag_name: ${{ github.ref_name }} prerelease: true - title: Mithril v${{ github.ref_name }} + name: Mithril v${{ github.ref_name }} files: package/* - - - name: Update release body with release notes addon - # specific version since this action does not support giving only the major number - uses: tubone24/update_release@v1.3.1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - TAG_NAME: ${{ github.ref_name }} - with: - is_append_body: true body_path: ./release-notes-addon.txt + append_body: true build-push-docker: runs-on: ubuntu-22.04 From c3b7af7edabcedc06370740b42454b05b3b9ab45 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Mon, 14 Oct 2024 11:03:19 +0200 Subject: [PATCH 259/274] chore: reduce pace of preloader refresh in signer From every 2 hours to 12 hours. --- mithril-signer/src/main.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mithril-signer/src/main.rs b/mithril-signer/src/main.rs index a129b2ca5e5..cf8a83750ca 100644 --- a/mithril-signer/src/main.rs +++ b/mithril-signer/src/main.rs @@ -81,11 +81,10 @@ pub struct Args { allow_unparsable_block: bool, /// Preloading refresh interval in seconds - // TODO: Replace the default value to 43200 (12 hours) once the Cardano transactions is activated on mainnet #[clap( long, env = "PRELOADING_REFRESH_INTERVAL_IN_SECONDS", - default_value_t = 7200 + default_value_t = 43200 )] preloading_refresh_interval_in_seconds: u64, } From 032f9440901a5f87552e92068f72e722cc3d234d Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Mon, 14 Oct 2024 11:04:05 +0200 Subject: [PATCH 260/274] chore: bump crates versions - 'mithril-signer' from '0.2.196' to '0.2.197'. --- Cargo.lock | 2 +- mithril-signer/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d75f9f66211..7fc54613d36 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3700,7 +3700,7 @@ dependencies = [ [[package]] name = "mithril-signer" -version = "0.2.196" +version = "0.2.197" dependencies = [ "anyhow", "async-trait", diff --git a/mithril-signer/Cargo.toml b/mithril-signer/Cargo.toml index c9f5c73c881..5627ee7e578 100644 --- a/mithril-signer/Cargo.toml +++ b/mithril-signer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-signer" -version = "0.2.196" +version = "0.2.197" description = "A Mithril Signer" authors = { workspace = true } edition = { workspace = true } From 1111de0d482b749b8f9ad6f0e1254ed076f7f3fd Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Fri, 11 Oct 2024 18:52:02 +0200 Subject: [PATCH 261/274] refactor(aggregator): dispatch root logger when building dependencies --- .../src/commands/genesis_command.rs | 9 ++- .../src/commands/serve_command.rs | 3 +- .../src/commands/tools_command.rs | 3 +- .../repository/certificate_repository.rs | 30 +++---- .../src/dependency_injection/builder.rs | 80 ++++++++++--------- .../src/dependency_injection/containers.rs | 2 +- .../src/http_server/routes/proof_routes.rs | 10 +-- .../src/http_server/routes/root_routes.rs | 4 +- .../http_server/routes/statistics_routes.rs | 2 +- .../services/certifier/certifier_service.rs | 2 +- mithril-aggregator/src/services/message.rs | 34 ++++---- .../src/services/stake_distribution.rs | 3 +- .../tests/test_extensions/runtime_tester.rs | 11 +-- 13 files changed, 103 insertions(+), 90 deletions(-) diff --git a/mithril-aggregator/src/commands/genesis_command.rs b/mithril-aggregator/src/commands/genesis_command.rs index d25fbef7a34..381814e9d7a 100644 --- a/mithril-aggregator/src/commands/genesis_command.rs +++ b/mithril-aggregator/src/commands/genesis_command.rs @@ -86,7 +86,8 @@ impl ExportGenesisSubCommand { "Genesis export payload to sign to {}", self.target_path.display() ); - let mut dependencies_builder = DependenciesBuilder::new(config.clone()); + let mut dependencies_builder = + DependenciesBuilder::new(root_logger.clone(), config.clone()); let dependencies = dependencies_builder .create_genesis_container() .await @@ -127,7 +128,8 @@ impl ImportGenesisSubCommand { "Genesis import signed payload from {}", self.signed_payload_path.to_string_lossy() ); - let mut dependencies_builder = DependenciesBuilder::new(config.clone()); + let mut dependencies_builder = + DependenciesBuilder::new(root_logger.clone(), config.clone()); let dependencies = dependencies_builder .create_genesis_container() .await @@ -205,7 +207,8 @@ impl BootstrapGenesisSubCommand { .with_context(|| "configuration deserialize error")?; debug!(root_logger, "BOOTSTRAP GENESIS command"; "config" => format!("{config:?}")); println!("Genesis bootstrap for test only!"); - let mut dependencies_builder = DependenciesBuilder::new(config.clone()); + let mut dependencies_builder = + DependenciesBuilder::new(root_logger.clone(), config.clone()); let dependencies = dependencies_builder .create_genesis_container() .await diff --git a/mithril-aggregator/src/commands/serve_command.rs b/mithril-aggregator/src/commands/serve_command.rs index c17efc175fc..cccd6e48114 100644 --- a/mithril-aggregator/src/commands/serve_command.rs +++ b/mithril-aggregator/src/commands/serve_command.rs @@ -92,7 +92,8 @@ impl ServeCommand { .try_deserialize() .with_context(|| "configuration deserialize error")?; debug!(root_logger, "SERVE command"; "config" => format!("{config:?}")); - let mut dependencies_builder = DependenciesBuilder::new(config.clone()); + let mut dependencies_builder = + DependenciesBuilder::new(root_logger.clone(), config.clone()); // start servers println!("Starting server..."); diff --git a/mithril-aggregator/src/commands/tools_command.rs b/mithril-aggregator/src/commands/tools_command.rs index 959191917ae..e36ced14030 100644 --- a/mithril-aggregator/src/commands/tools_command.rs +++ b/mithril-aggregator/src/commands/tools_command.rs @@ -73,7 +73,8 @@ impl RecomputeCertificatesHashCommand { .with_context(|| "configuration deserialize error")?; debug!(root_logger, "RECOMPUTE CERTIFICATES HASH command"; "config" => format!("{config:?}")); println!("Recomputing all certificate hash",); - let mut dependencies_builder = DependenciesBuilder::new(config.clone()); + let mut dependencies_builder = + DependenciesBuilder::new(root_logger.clone(), config.clone()); let connection = dependencies_builder .get_sqlite_connection() .await diff --git a/mithril-aggregator/src/database/repository/certificate_repository.rs b/mithril-aggregator/src/database/repository/certificate_repository.rs index 53390170a68..3cea511ca87 100644 --- a/mithril-aggregator/src/database/repository/certificate_repository.rs +++ b/mithril-aggregator/src/database/repository/certificate_repository.rs @@ -239,7 +239,7 @@ mod tests { async fn repository_get_certificate() { let (certificates, _) = setup_certificate_chain(5, 2); let expected_hash = certificates[0].hash.clone(); - let mut deps = DependenciesBuilder::new(Configuration::new_sample()); + let mut deps = DependenciesBuilder::new_for_test(Configuration::new_sample()); let connection = deps.get_sqlite_connection().await.unwrap(); insert_certificate_records(&connection, certificates.clone()); @@ -262,7 +262,7 @@ mod tests { #[tokio::test] async fn repository_get_latest_certificates() { let (certificates, _) = setup_certificate_chain(5, 2); - let mut deps = DependenciesBuilder::new(Configuration::new_sample()); + let mut deps = DependenciesBuilder::new_for_test(Configuration::new_sample()); let connection = deps.get_sqlite_connection().await.unwrap(); insert_certificate_records(&connection, certificates.clone()); @@ -278,7 +278,7 @@ mod tests { #[tokio::test] async fn get_master_certificate_no_certificate_recorded_returns_none() { - let mut deps = DependenciesBuilder::new(Configuration::new_sample()); + let mut deps = DependenciesBuilder::new_for_test(Configuration::new_sample()); let connection = deps.get_sqlite_connection().await.unwrap(); let repository: CertificateRepository = CertificateRepository::new(connection); @@ -292,7 +292,7 @@ mod tests { #[tokio::test] async fn get_master_certificate_one_cert_in_current_epoch_recorded_returns_that_one() { - let mut deps = DependenciesBuilder::new(Configuration::new_sample()); + let mut deps = DependenciesBuilder::new_for_test(Configuration::new_sample()); let connection = deps.get_sqlite_connection().await.unwrap(); let certificate = CertificateRecord::dummy_genesis("1", Epoch(1), 1); let expected_certificate: Certificate = certificate.clone().into(); @@ -311,7 +311,7 @@ mod tests { #[tokio::test] async fn get_master_certificate_multiple_cert_in_current_epoch_returns_first_of_current_epoch() { - let mut deps = DependenciesBuilder::new(Configuration::new_sample()); + let mut deps = DependenciesBuilder::new_for_test(Configuration::new_sample()); let connection = deps.get_sqlite_connection().await.unwrap(); let certificates = vec![ CertificateRecord::dummy_genesis("1", Epoch(1), 1), @@ -334,7 +334,7 @@ mod tests { #[tokio::test] async fn get_master_certificate_multiple_cert_in_previous_epoch_none_in_the_current_returns_first_of_previous_epoch( ) { - let mut deps = DependenciesBuilder::new(Configuration::new_sample()); + let mut deps = DependenciesBuilder::new_for_test(Configuration::new_sample()); let connection = deps.get_sqlite_connection().await.unwrap(); let certificates = vec![ CertificateRecord::dummy_genesis("1", Epoch(1), 1), @@ -357,7 +357,7 @@ mod tests { #[tokio::test] async fn get_master_certificate_multiple_cert_in_previous_one_cert_in_current_epoch_returns_one_in_current_epoch( ) { - let mut deps = DependenciesBuilder::new(Configuration::new_sample()); + let mut deps = DependenciesBuilder::new_for_test(Configuration::new_sample()); let connection = deps.get_sqlite_connection().await.unwrap(); let certificates = vec![ CertificateRecord::dummy_genesis("1", Epoch(1), 1), @@ -381,7 +381,7 @@ mod tests { #[tokio::test] async fn get_master_certificate_multiple_cert_in_previous_multiple_in_current_epoch_returns_first_of_current_epoch( ) { - let mut deps = DependenciesBuilder::new(Configuration::new_sample()); + let mut deps = DependenciesBuilder::new_for_test(Configuration::new_sample()); let connection = deps.get_sqlite_connection().await.unwrap(); let certificates = vec![ CertificateRecord::dummy_genesis("1", Epoch(1), 1), @@ -406,7 +406,7 @@ mod tests { #[tokio::test] async fn get_master_certificate_multiple_cert_in_penultimate_epoch_none_in_previous_returns_none( ) { - let mut deps = DependenciesBuilder::new(Configuration::new_sample()); + let mut deps = DependenciesBuilder::new_for_test(Configuration::new_sample()); let connection = deps.get_sqlite_connection().await.unwrap(); let certificates = vec![ CertificateRecord::dummy_genesis("1", Epoch(1), 1), @@ -427,7 +427,7 @@ mod tests { #[tokio::test] async fn get_master_certificate_second_genesis_after_multiple_cert_in_current_epoch_returns_last_genesis( ) { - let mut deps = DependenciesBuilder::new(Configuration::new_sample()); + let mut deps = DependenciesBuilder::new_for_test(Configuration::new_sample()); let connection = deps.get_sqlite_connection().await.unwrap(); let certificates = vec![ CertificateRecord::dummy_genesis("1", Epoch(1), 1), @@ -451,7 +451,7 @@ mod tests { #[tokio::test] async fn get_master_certificate_second_genesis_after_multiple_cert_in_multiple_epochs_returns_last_genesis( ) { - let mut deps = DependenciesBuilder::new(Configuration::new_sample()); + let mut deps = DependenciesBuilder::new_for_test(Configuration::new_sample()); let connection = deps.get_sqlite_connection().await.unwrap(); let certificates = vec![ CertificateRecord::dummy_genesis("1", Epoch(1), 1), @@ -477,7 +477,7 @@ mod tests { #[tokio::test] async fn get_master_certificate_new_genesis_after_multiple_cert_in_previous_epoch_returns_last_genesis( ) { - let mut deps = DependenciesBuilder::new(Configuration::new_sample()); + let mut deps = DependenciesBuilder::new_for_test(Configuration::new_sample()); let connection = deps.get_sqlite_connection().await.unwrap(); let certificates = vec![ CertificateRecord::dummy_genesis("1", Epoch(1), 1), @@ -503,7 +503,7 @@ mod tests { let (certificates, _) = setup_certificate_chain(3, 1); let expected_certificate_id = &certificates[2].hash; let epoch = &certificates[2].epoch; - let mut deps = DependenciesBuilder::new(Configuration::new_sample()); + let mut deps = DependenciesBuilder::new_for_test(Configuration::new_sample()); let connection = deps.get_sqlite_connection().await.unwrap(); insert_certificate_records(&connection, certificates.clone()); @@ -520,7 +520,7 @@ mod tests { #[tokio::test] async fn save_certificate() { let (certificates, _) = setup_certificate_chain(5, 3); - let mut deps = DependenciesBuilder::new(Configuration::new_sample()); + let mut deps = DependenciesBuilder::new_for_test(Configuration::new_sample()); let connection = deps.get_sqlite_connection().await.unwrap(); let repository: CertificateRepository = CertificateRepository::new(connection); let certificate = repository @@ -544,7 +544,7 @@ mod tests { #[tokio::test] async fn delete_only_given_certificates() { - let mut deps = DependenciesBuilder::new(Configuration::new_sample()); + let mut deps = DependenciesBuilder::new_for_test(Configuration::new_sample()); let connection = deps.get_sqlite_connection().await.unwrap(); let repository = CertificateRepository::new(connection.clone()); let records = vec![ diff --git a/mithril-aggregator/src/dependency_injection/builder.rs b/mithril-aggregator/src/dependency_injection/builder.rs index 78ed10196e9..310eb15c6c8 100644 --- a/mithril-aggregator/src/dependency_injection/builder.rs +++ b/mithril-aggregator/src/dependency_injection/builder.rs @@ -98,6 +98,9 @@ pub struct DependenciesBuilder { /// Configuration parameters pub configuration: Configuration, + /// Application root logger + pub root_logger: Logger, + /// SQLite database connection pub sqlite_connection: Option>, @@ -237,9 +240,10 @@ pub struct DependenciesBuilder { impl DependenciesBuilder { /// Create a new clean dependency builder - pub fn new(configuration: Configuration) -> Self { + pub fn new(root_logger: Logger, configuration: Configuration) -> Self { Self { configuration, + root_logger, sqlite_connection: None, sqlite_connection_cardano_transaction_pool: None, stake_store: None, @@ -303,7 +307,7 @@ impl DependenciesBuilder { sqlite_file_name: &str, migrations: Vec, ) -> Result { - let logger = self.get_logger()?; + let logger = self.root_logger(); let connection_builder = match self.configuration.environment { ExecutionEnvironment::Test if self.configuration.data_stores_directory.to_string_lossy() == ":memory:" => @@ -417,7 +421,7 @@ impl DependenciesBuilder { } async fn build_snapshot_uploader(&mut self) -> Result> { - let logger = self.get_logger()?; + let logger = self.root_logger(); if self.configuration.environment == ExecutionEnvironment::Production { match self.configuration.snapshot_uploader_type { SnapshotUploaderType::Gcp => { @@ -460,7 +464,7 @@ impl DependenciesBuilder { async fn build_multi_signer(&mut self) -> Result> { let multi_signer = - MultiSignerImpl::new(self.get_epoch_service().await?, self.get_logger()?); + MultiSignerImpl::new(self.get_epoch_service().await?, self.root_logger()); Ok(Arc::new(multi_signer)) } @@ -560,7 +564,7 @@ impl DependenciesBuilder { } async fn build_epoch_settings_storer(&mut self) -> Result> { - let logger = self.get_logger()?; + let logger = self.root_logger(); let epoch_settings_store = EpochSettingsStore::new( self.get_sqlite_connection().await?, self.configuration.safe_epoch_retention_limit(), @@ -702,7 +706,7 @@ impl DependenciesBuilder { &self.configuration.data_stores_directory, &format!("immutables_digests_{}.json", self.configuration.network), ) - .with_logger(self.get_logger()?) + .with_logger(self.root_logger()) .should_reset_digests_cache(self.configuration.reset_digests_cache) .build() .await?; @@ -721,14 +725,9 @@ impl DependenciesBuilder { Ok(self.immutable_cache_provider.as_ref().cloned().unwrap()) } - fn create_logger(&self) -> Result { - Ok(slog_scope::logger()) - } - - /// This method does not cache the logger since it is managed internally by - /// its own crate. - pub fn get_logger(&self) -> Result { - self.create_logger() + /// Return a copy of the root logger. + pub fn root_logger(&self) -> Logger { + self.root_logger.clone() } async fn build_transaction_repository(&mut self) -> Result> { @@ -755,7 +754,7 @@ impl DependenciesBuilder { let chain_block_reader = PallasChainReader::new( &self.configuration.cardano_node_socket_path, self.configuration.get_network()?, - self.get_logger()?, + self.root_logger(), ); Ok(Arc::new(Mutex::new(chain_block_reader))) @@ -775,7 +774,7 @@ impl DependenciesBuilder { self.get_chain_block_reader().await?, self.configuration .cardano_transactions_block_streamer_max_roll_forwards_per_poll, - self.get_logger()?, + self.root_logger(), ); Ok(Arc::new(block_scanner)) @@ -795,7 +794,7 @@ impl DependenciesBuilder { ExecutionEnvironment::Production => Some(self.get_immutable_cache_provider().await?), _ => None, }; - let digester = CardanoImmutableDigester::new(immutable_digester_cache, self.get_logger()?); + let digester = CardanoImmutableDigester::new(immutable_digester_cache, self.root_logger()); Ok(Arc::new(digester)) } @@ -830,7 +829,7 @@ impl DependenciesBuilder { self.configuration.db_directory.clone(), ongoing_snapshot_directory, algorithm, - self.get_logger()?, + self.root_logger(), )?) } _ => Arc::new(DumbSnapshotter::new()), @@ -850,7 +849,7 @@ impl DependenciesBuilder { async fn build_certificate_verifier(&mut self) -> Result> { let verifier = Arc::new(MithrilCertificateVerifier::new( - self.get_logger()?, + self.root_logger(), self.get_certificate_repository().await?, )); @@ -1033,7 +1032,7 @@ impl DependenciesBuilder { async fn build_event_transmitter(&mut self) -> Result>> { let sender = self.get_event_transmitter_sender().await?; - let event_transmitter = Arc::new(TransmitterService::new(sender, self.get_logger()?)); + let event_transmitter = Arc::new(TransmitterService::new(sender, self.root_logger())); Ok(event_transmitter) } @@ -1109,7 +1108,7 @@ impl DependenciesBuilder { let immutable_signable_builder = Arc::new(CardanoImmutableFilesFullSignableBuilder::new( self.get_immutable_digester().await?, &self.configuration.db_directory, - self.get_logger()?, + self.root_logger(), )); let transactions_importer = self.get_transactions_importer().await?; let block_range_root_retriever = self.get_transaction_repository().await?; @@ -1118,7 +1117,7 @@ impl DependenciesBuilder { >::new( transactions_importer, block_range_root_retriever, - self.get_logger()?, + self.root_logger(), )); let cardano_stake_distribution_builder = Arc::new( CardanoStakeDistributionSignableBuilder::new(self.get_stake_store().await?), @@ -1165,7 +1164,7 @@ impl DependenciesBuilder { } async fn build_signed_entity_service(&mut self) -> Result> { - let logger = self.get_logger()?; + let logger = self.root_logger(); let signed_entity_storer = self.build_signed_entity_storer().await?; let epoch_service = self.get_epoch_service().await?; let mithril_stake_distribution_artifact_builder = Arc::new( @@ -1237,7 +1236,7 @@ impl DependenciesBuilder { verification_key_store, network, allowed_discriminants, - self.get_logger()?, + self.root_logger(), ))); Ok(epoch_service) @@ -1285,7 +1284,7 @@ impl DependenciesBuilder { let transactions_importer = Arc::new(CardanoTransactionsImporter::new( self.get_block_scanner().await?, self.get_transaction_repository().await?, - self.get_logger()?, + self.root_logger(), )); Ok(transactions_importer) @@ -1305,7 +1304,7 @@ impl DependenciesBuilder { self.get_sqlite_connection_cardano_transaction_pool() .await?, self.get_signed_entity_lock().await?, - self.get_logger()?, + self.root_logger(), )); Ok(upkeep_service) @@ -1323,7 +1322,7 @@ impl DependenciesBuilder { &mut self, ) -> Result> { let authenticator = - SingleSignatureAuthenticator::new(self.get_multi_signer().await?, self.get_logger()?); + SingleSignatureAuthenticator::new(self.get_multi_signer().await?, self.root_logger()); Ok(Arc::new(authenticator)) } @@ -1356,7 +1355,7 @@ impl DependenciesBuilder { let dependency_manager = DependencyContainer { config: self.configuration.clone(), allowed_discriminants: self.get_allowed_signed_entity_types_discriminants()?, - root_logger: self.get_logger()?, + root_logger: self.root_logger(), sqlite_connection: self.get_sqlite_connection().await?, sqlite_connection_cardano_transaction_pool: self .get_sqlite_connection_cardano_transaction_pool() @@ -1406,7 +1405,7 @@ impl DependenciesBuilder { pub async fn create_event_store(&mut self) -> Result { let event_store = EventStore::new( self.get_event_transmitter_receiver().await?, - self.get_logger()?, + self.root_logger(), ); Ok(event_store) @@ -1421,7 +1420,7 @@ impl DependenciesBuilder { config, None, Arc::new(AggregatorRunner::new(dependency_container)), - self.get_logger()?, + self.root_logger(), ) .await .map_err(|e| DependenciesBuilderError::Initialization { @@ -1455,7 +1454,7 @@ impl DependenciesBuilder { .cardano_transactions_signing_config .security_parameter, self.get_chain_observer().await?, - self.get_logger()?, + self.root_logger(), Arc::new(CardanoTransactionsPreloaderActivation::new(activation)), ); @@ -1492,14 +1491,14 @@ impl DependenciesBuilder { let retriever = CExplorerSignerRetriever::new( cexplorer_pools_url, Some(Duration::from_secs(30)), - self.get_logger()?, + self.root_logger(), )?; let persister = self.get_signer_store().await?; Ok(SignersImporter::new( Arc::new(retriever), persister, - self.get_logger()?, + self.root_logger(), )) } @@ -1538,7 +1537,7 @@ impl DependenciesBuilder { let multi_signer = self.get_multi_signer().await?; let ticker_service = self.get_ticker_service().await?; let epoch_service = self.get_epoch_service().await?; - let logger = self.get_logger()?; + let logger = self.root_logger(); let certifier = Arc::new(MithrilCertifierService::new( cardano_network, @@ -1556,7 +1555,7 @@ impl DependenciesBuilder { Ok(Arc::new(BufferedCertifierService::new( certifier, Arc::new(BufferedSingleSignatureRepository::new(sqlite_connection)), - self.get_logger()?, + self.root_logger(), ))) } @@ -1596,7 +1595,7 @@ impl DependenciesBuilder { .cardano_transactions_prover_cache_pool_size; let transaction_retriever = self.get_transaction_repository().await?; let block_range_root_retriever = self.get_transaction_repository().await?; - let logger = self.get_logger()?; + let logger = self.root_logger(); let prover_service = MithrilProverService::::new( transaction_retriever, block_range_root_retriever, @@ -1622,6 +1621,13 @@ impl DependenciesBuilder { } } +#[cfg(test)] +impl DependenciesBuilder { + pub(crate) fn new_with_stdout_logger(configuration: Configuration) -> Self { + Self::new(crate::test_tools::TestLogger::stdout(), configuration) + } +} + #[cfg(test)] mod tests { use mithril_common::entities::SignedEntityTypeDiscriminants; @@ -1651,7 +1657,7 @@ mod tests { signed_entity_types: Some(signed_entity_types), ..Configuration::new_sample() }; - let mut dep_builder = DependenciesBuilder::new(configuration); + let mut dep_builder = DependenciesBuilder::new_with_stdout_logger(configuration); let cardano_transactions_preloader = dep_builder .create_cardano_transactions_preloader() diff --git a/mithril-aggregator/src/dependency_injection/containers.rs b/mithril-aggregator/src/dependency_injection/containers.rs index 5a8efa3c616..f4d1a43724b 100644 --- a/mithril-aggregator/src/dependency_injection/containers.rs +++ b/mithril-aggregator/src/dependency_injection/containers.rs @@ -304,7 +304,7 @@ pub mod tests { pub async fn initialize_dependencies() -> DependencyContainer { let config = Configuration::new_sample(); - let mut builder = DependenciesBuilder::new(config); + let mut builder = DependenciesBuilder::new_with_stdout_logger(config); builder.build_dependency_container().await.unwrap() } diff --git a/mithril-aggregator/src/http_server/routes/proof_routes.rs b/mithril-aggregator/src/http_server/routes/proof_routes.rs index 79917773e69..e013dddfc53 100644 --- a/mithril-aggregator/src/http_server/routes/proof_routes.rs +++ b/mithril-aggregator/src/http_server/routes/proof_routes.rs @@ -198,7 +198,7 @@ mod tests { #[tokio::test] async fn proof_cardano_transaction_ok() { let config = Configuration::new_sample(); - let mut builder = DependenciesBuilder::new(config); + let mut builder = DependenciesBuilder::new_with_stdout_logger(config); let mut dependency_manager = builder.build_dependency_container().await.unwrap(); let mut mock_signed_entity_service = MockSignedEntityService::new(); mock_signed_entity_service @@ -240,7 +240,7 @@ mod tests { #[tokio::test] async fn proof_cardano_transaction_not_found() { let config = Configuration::new_sample(); - let mut builder = DependenciesBuilder::new(config); + let mut builder = DependenciesBuilder::new_with_stdout_logger(config); let dependency_manager = builder.build_dependency_container().await.unwrap(); let method = Method::GET.as_str(); @@ -271,7 +271,7 @@ mod tests { #[tokio::test] async fn proof_cardano_transaction_ko() { let config = Configuration::new_sample(); - let mut builder = DependenciesBuilder::new(config); + let mut builder = DependenciesBuilder::new_with_stdout_logger(config); let mut dependency_manager = builder.build_dependency_container().await.unwrap(); let mut mock_signed_entity_service = MockSignedEntityService::new(); mock_signed_entity_service @@ -307,7 +307,7 @@ mod tests { #[tokio::test] async fn proof_cardano_transaction_return_bad_request_with_invalid_hashes() { let config = Configuration::new_sample(); - let mut builder = DependenciesBuilder::new(config); + let mut builder = DependenciesBuilder::new_with_stdout_logger(config); let dependency_manager = builder.build_dependency_container().await.unwrap(); let method = Method::GET.as_str(); @@ -337,7 +337,7 @@ mod tests { async fn proof_cardano_transaction_route_deduplicate_hashes() { let tx = fake_data::transaction_hashes()[0].to_string(); let config = Configuration::new_sample(); - let mut builder = DependenciesBuilder::new(config); + let mut builder = DependenciesBuilder::new_with_stdout_logger(config); let mut dependency_manager = builder.build_dependency_container().await.unwrap(); let mut mock_signed_entity_service = MockSignedEntityService::new(); mock_signed_entity_service diff --git a/mithril-aggregator/src/http_server/routes/root_routes.rs b/mithril-aggregator/src/http_server/routes/root_routes.rs index f02b93745ac..1cb96128cb8 100644 --- a/mithril-aggregator/src/http_server/routes/root_routes.rs +++ b/mithril-aggregator/src/http_server/routes/root_routes.rs @@ -132,7 +132,7 @@ mod tests { )), ..Configuration::new_sample() }; - let mut builder = DependenciesBuilder::new(config); + let mut builder = DependenciesBuilder::new_with_stdout_logger(config); let dependency_manager = builder.build_dependency_container().await.unwrap(); let expected_open_api_version = dependency_manager @@ -193,7 +193,7 @@ mod tests { )), ..Configuration::new_sample() }; - let mut builder = DependenciesBuilder::new(config); + let mut builder = DependenciesBuilder::new_with_stdout_logger(config); let mut dependency_manager = builder.build_dependency_container().await.unwrap(); dependency_manager .config diff --git a/mithril-aggregator/src/http_server/routes/statistics_routes.rs b/mithril-aggregator/src/http_server/routes/statistics_routes.rs index eefd6b6c9bd..ba566057b4e 100644 --- a/mithril-aggregator/src/http_server/routes/statistics_routes.rs +++ b/mithril-aggregator/src/http_server/routes/statistics_routes.rs @@ -80,7 +80,7 @@ mod tests { #[tokio::test] async fn post_statistics_ok() { let config = Configuration::new_sample(); - let mut builder = DependenciesBuilder::new(config); + let mut builder = DependenciesBuilder::new_with_stdout_logger(config); let mut rx = builder.get_event_transmitter_receiver().await.unwrap(); let dependency_manager = builder.build_dependency_container().await.unwrap(); let snapshot_download_message = SnapshotDownloadMessage::dummy(); diff --git a/mithril-aggregator/src/services/certifier/certifier_service.rs b/mithril-aggregator/src/services/certifier/certifier_service.rs index 91747b712e3..5bddc253518 100644 --- a/mithril-aggregator/src/services/certifier/certifier_service.rs +++ b/mithril-aggregator/src/services/certifier/certifier_service.rs @@ -442,7 +442,7 @@ mod tests { current_epoch: Option, ) -> MithrilCertifierService { let configuration = Configuration::new_sample(); - let mut dependency_builder = DependenciesBuilder::new(configuration); + let mut dependency_builder = DependenciesBuilder::new_with_stdout_logger(configuration); if let Some(epoch) = current_epoch { dependency_builder.epoch_service = Some(Arc::new(RwLock::new( diff --git a/mithril-aggregator/src/services/message.rs b/mithril-aggregator/src/services/message.rs index 4bcd035d7cc..a0ea8c04811 100644 --- a/mithril-aggregator/src/services/message.rs +++ b/mithril-aggregator/src/services/message.rs @@ -267,7 +267,7 @@ mod tests { async fn get_no_certificate() { // setup let configuration = Configuration::new_sample(); - let mut dep_builder = DependenciesBuilder::new(configuration); + let mut dep_builder = DependenciesBuilder::new_with_stdout_logger(configuration); let service = dep_builder.get_message_service().await.unwrap(); // test @@ -283,7 +283,7 @@ mod tests { async fn get_certificate() { // setup let configuration = Configuration::new_sample(); - let mut dep_builder = DependenciesBuilder::new(configuration); + let mut dep_builder = DependenciesBuilder::new_with_stdout_logger(configuration); let repository = dep_builder.get_certificate_repository().await.unwrap(); let service = dep_builder.get_message_service().await.unwrap(); let fixture = MithrilFixtureBuilder::default().with_signers(3).build(); @@ -305,7 +305,7 @@ mod tests { #[tokio::test] async fn get_last_certificates() { let configuration = Configuration::new_sample(); - let mut dep_builder = DependenciesBuilder::new(configuration); + let mut dep_builder = DependenciesBuilder::new_with_stdout_logger(configuration); let repository = dep_builder.get_certificate_repository().await.unwrap(); let service = dep_builder.get_message_service().await.unwrap(); let fixture = MithrilFixtureBuilder::default().with_signers(3).build(); @@ -330,7 +330,7 @@ mod tests { #[tokio::test] async fn get_snapshot_not_exist() { let configuration = Configuration::new_sample(); - let mut dep_builder = DependenciesBuilder::new(configuration); + let mut dep_builder = DependenciesBuilder::new_with_stdout_logger(configuration); let service = dep_builder.get_message_service().await.unwrap(); let snapshot = service.get_snapshot_message("whatever").await.unwrap(); @@ -351,7 +351,7 @@ mod tests { // setup let configuration = Configuration::new_sample(); - let mut dep_builder = DependenciesBuilder::new(configuration); + let mut dep_builder = DependenciesBuilder::new_with_stdout_logger(configuration); let mut storer = MockSignedEntityStorer::new(); storer .expect_get_signed_entity() @@ -383,7 +383,7 @@ mod tests { // setup let configuration = Configuration::new_sample(); - let mut dep_builder = DependenciesBuilder::new(configuration); + let mut dep_builder = DependenciesBuilder::new_with_stdout_logger(configuration); let mut storer = MockSignedEntityStorer::new(); storer .expect_get_last_signed_entities_by_type() @@ -408,7 +408,7 @@ mod tests { }; let message = ToMithrilStakeDistributionMessageAdapter::adapt(entity); let configuration = Configuration::new_sample(); - let mut dep_builder = DependenciesBuilder::new(configuration); + let mut dep_builder = DependenciesBuilder::new_with_stdout_logger(configuration); let mut storer = MockSignedEntityStorer::new(); storer .expect_get_signed_entity() @@ -428,7 +428,7 @@ mod tests { #[tokio::test] async fn get_mithril_stake_distribution_not_exist() { let configuration = Configuration::new_sample(); - let mut dep_builder = DependenciesBuilder::new(configuration); + let mut dep_builder = DependenciesBuilder::new_with_stdout_logger(configuration); let mut storer = MockSignedEntityStorer::new(); storer .expect_get_signed_entity() @@ -456,7 +456,7 @@ mod tests { }]; let message = ToMithrilStakeDistributionListMessageAdapter::adapt(vec![entity]); let configuration = Configuration::new_sample(); - let mut dep_builder = DependenciesBuilder::new(configuration); + let mut dep_builder = DependenciesBuilder::new_with_stdout_logger(configuration); let mut storer = MockSignedEntityStorer::new(); storer .expect_get_last_signed_entities_by_type() @@ -487,7 +487,7 @@ mod tests { }; let message = ToCardanoTransactionMessageAdapter::adapt(entity); let configuration = Configuration::new_sample(); - let mut dep_builder = DependenciesBuilder::new(configuration); + let mut dep_builder = DependenciesBuilder::new_with_stdout_logger(configuration); let mut storer = MockSignedEntityStorer::new(); storer .expect_get_signed_entity() @@ -507,7 +507,7 @@ mod tests { #[tokio::test] async fn get_cardano_transaction_not_exist() { let configuration = Configuration::new_sample(); - let mut dep_builder = DependenciesBuilder::new(configuration); + let mut dep_builder = DependenciesBuilder::new_with_stdout_logger(configuration); let mut storer = MockSignedEntityStorer::new(); storer .expect_get_signed_entity() @@ -538,7 +538,7 @@ mod tests { }]; let message = ToCardanoTransactionListMessageAdapter::adapt(vec![entity]); let configuration = Configuration::new_sample(); - let mut dep_builder = DependenciesBuilder::new(configuration); + let mut dep_builder = DependenciesBuilder::new_with_stdout_logger(configuration); let mut storer = MockSignedEntityStorer::new(); storer .expect_get_last_signed_entities_by_type() @@ -566,7 +566,7 @@ mod tests { }; let message = ToCardanoStakeDistributionMessageAdapter::adapt(entity); let configuration = Configuration::new_sample(); - let mut dep_builder = DependenciesBuilder::new(configuration); + let mut dep_builder = DependenciesBuilder::new_with_stdout_logger(configuration); let mut storer = MockSignedEntityStorer::new(); storer .expect_get_signed_entity() @@ -586,7 +586,7 @@ mod tests { #[tokio::test] async fn get_cardano_stake_distribution_not_exist() { let configuration = Configuration::new_sample(); - let mut dep_builder = DependenciesBuilder::new(configuration); + let mut dep_builder = DependenciesBuilder::new_with_stdout_logger(configuration); let mut storer = MockSignedEntityStorer::new(); storer .expect_get_signed_entity() @@ -614,7 +614,7 @@ mod tests { }; let message = ToCardanoStakeDistributionMessageAdapter::adapt(entity.clone()); let configuration = Configuration::new_sample(); - let mut dep_builder = DependenciesBuilder::new(configuration); + let mut dep_builder = DependenciesBuilder::new_with_stdout_logger(configuration); let mut storer = MockSignedEntityStorer::new(); storer .expect_get_cardano_stake_distribution_signed_entity_by_epoch() @@ -634,7 +634,7 @@ mod tests { #[tokio::test] async fn get_cardano_stake_distribution_by_epoch_not_exist() { let configuration = Configuration::new_sample(); - let mut dep_builder = DependenciesBuilder::new(configuration); + let mut dep_builder = DependenciesBuilder::new_with_stdout_logger(configuration); let mut storer = MockSignedEntityStorer::new(); storer .expect_get_cardano_stake_distribution_signed_entity_by_epoch() @@ -662,7 +662,7 @@ mod tests { }]; let message = ToCardanoStakeDistributionListMessageAdapter::adapt(vec![entity]); let configuration = Configuration::new_sample(); - let mut dep_builder = DependenciesBuilder::new(configuration); + let mut dep_builder = DependenciesBuilder::new_with_stdout_logger(configuration); let mut storer = MockSignedEntityStorer::new(); storer .expect_get_last_signed_entities_by_type() diff --git a/mithril-aggregator/src/services/stake_distribution.rs b/mithril-aggregator/src/services/stake_distribution.rs index 38a560e9513..d97a66a39f3 100644 --- a/mithril-aggregator/src/services/stake_distribution.rs +++ b/mithril-aggregator/src/services/stake_distribution.rs @@ -230,7 +230,8 @@ mod tests { use super::*; async fn get_service(chain_observer: MockChainObserver) -> MithrilStakeDistributionService { - let mut builder = DependenciesBuilder::new(crate::Configuration::new_sample()); + let mut builder = + DependenciesBuilder::new_with_stdout_logger(crate::Configuration::new_sample()); let stake_service = MithrilStakeDistributionService::new( builder.get_stake_store().await.unwrap(), Arc::new(chain_observer), diff --git a/mithril-aggregator/tests/test_extensions/runtime_tester.rs b/mithril-aggregator/tests/test_extensions/runtime_tester.rs index 40b403f9fd0..8f0c2d02add 100644 --- a/mithril-aggregator/tests/test_extensions/runtime_tester.rs +++ b/mithril-aggregator/tests/test_extensions/runtime_tester.rs @@ -81,19 +81,20 @@ pub struct RuntimeTester { pub observer: Arc, pub open_message_repository: Arc, pub block_scanner: Arc, - _logs_guard: slog_scope::GlobalLoggerGuard, + _global_logger_guard: slog_scope::GlobalLoggerGuard, } -fn build_logger() -> slog_scope::GlobalLoggerGuard { +fn build_logger() -> slog::Logger { let decorator = slog_term::PlainDecorator::new(slog_term::TestStdoutWriter); let drain = slog_term::CompactFormat::new(decorator).build().fuse(); let drain = slog_async::Async::new(drain).build().fuse(); - slog_scope::set_global_logger(slog::Logger::root(Arc::new(drain), slog::o!())) + slog::Logger::root(Arc::new(drain), slog::o!()) } impl RuntimeTester { pub async fn build(start_time_point: TimePoint, configuration: Configuration) -> Self { let logger = build_logger(); + let global_logger = slog_scope::set_global_logger(logger.clone()); let network = configuration.network.clone(); let snapshot_uploader = Arc::new(DumbSnapshotUploader::new()); let immutable_file_observer = Arc::new(DumbImmutableFileObserver::new()); @@ -110,7 +111,7 @@ impl RuntimeTester { Some(Epoch(0)), )])); let block_scanner = Arc::new(DumbBlockScanner::new()); - let mut deps_builder = DependenciesBuilder::new(configuration); + let mut deps_builder = DependenciesBuilder::new(logger.clone(), configuration); deps_builder.snapshot_uploader = Some(snapshot_uploader.clone()); deps_builder.chain_observer = Some(chain_observer.clone()); deps_builder.immutable_file_observer = Some(immutable_file_observer.clone()); @@ -140,7 +141,7 @@ impl RuntimeTester { observer, open_message_repository, block_scanner, - _logs_guard: logger, + _global_logger_guard: global_logger, } } From e71d93093dc270d2d27aee59f2c419bc8af7d123 Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Fri, 11 Oct 2024 18:56:18 +0200 Subject: [PATCH 262/274] test(aggregator): use simpler method to build sqlite connection in `certificate_repository` --- .../repository/certificate_repository.rs | 50 ++++++------------- 1 file changed, 16 insertions(+), 34 deletions(-) diff --git a/mithril-aggregator/src/database/repository/certificate_repository.rs b/mithril-aggregator/src/database/repository/certificate_repository.rs index 3cea511ca87..84885667390 100644 --- a/mithril-aggregator/src/database/repository/certificate_repository.rs +++ b/mithril-aggregator/src/database/repository/certificate_repository.rs @@ -130,8 +130,6 @@ mod tests { use mithril_common::crypto_helper::tests_setup::setup_certificate_chain; use crate::database::test_helper::{insert_certificate_records, main_db_connection}; - use crate::dependency_injection::DependenciesBuilder; - use crate::Configuration; use super::*; @@ -239,8 +237,7 @@ mod tests { async fn repository_get_certificate() { let (certificates, _) = setup_certificate_chain(5, 2); let expected_hash = certificates[0].hash.clone(); - let mut deps = DependenciesBuilder::new_for_test(Configuration::new_sample()); - let connection = deps.get_sqlite_connection().await.unwrap(); + let connection = Arc::new(main_db_connection().unwrap()); insert_certificate_records(&connection, certificates.clone()); let repository: CertificateRepository = CertificateRepository::new(connection); @@ -262,8 +259,7 @@ mod tests { #[tokio::test] async fn repository_get_latest_certificates() { let (certificates, _) = setup_certificate_chain(5, 2); - let mut deps = DependenciesBuilder::new_for_test(Configuration::new_sample()); - let connection = deps.get_sqlite_connection().await.unwrap(); + let connection = Arc::new(main_db_connection().unwrap()); insert_certificate_records(&connection, certificates.clone()); let repository = CertificateRepository::new(connection); @@ -278,8 +274,7 @@ mod tests { #[tokio::test] async fn get_master_certificate_no_certificate_recorded_returns_none() { - let mut deps = DependenciesBuilder::new_for_test(Configuration::new_sample()); - let connection = deps.get_sqlite_connection().await.unwrap(); + let connection = Arc::new(main_db_connection().unwrap()); let repository: CertificateRepository = CertificateRepository::new(connection); let certificate = repository @@ -292,8 +287,7 @@ mod tests { #[tokio::test] async fn get_master_certificate_one_cert_in_current_epoch_recorded_returns_that_one() { - let mut deps = DependenciesBuilder::new_for_test(Configuration::new_sample()); - let connection = deps.get_sqlite_connection().await.unwrap(); + let connection = Arc::new(main_db_connection().unwrap()); let certificate = CertificateRecord::dummy_genesis("1", Epoch(1), 1); let expected_certificate: Certificate = certificate.clone().into(); insert_certificate_records(&connection, vec![certificate]); @@ -311,8 +305,7 @@ mod tests { #[tokio::test] async fn get_master_certificate_multiple_cert_in_current_epoch_returns_first_of_current_epoch() { - let mut deps = DependenciesBuilder::new_for_test(Configuration::new_sample()); - let connection = deps.get_sqlite_connection().await.unwrap(); + let connection = Arc::new(main_db_connection().unwrap()); let certificates = vec![ CertificateRecord::dummy_genesis("1", Epoch(1), 1), CertificateRecord::dummy_db_snapshot("2", "1", Epoch(1), 2), @@ -334,8 +327,7 @@ mod tests { #[tokio::test] async fn get_master_certificate_multiple_cert_in_previous_epoch_none_in_the_current_returns_first_of_previous_epoch( ) { - let mut deps = DependenciesBuilder::new_for_test(Configuration::new_sample()); - let connection = deps.get_sqlite_connection().await.unwrap(); + let connection = Arc::new(main_db_connection().unwrap()); let certificates = vec![ CertificateRecord::dummy_genesis("1", Epoch(1), 1), CertificateRecord::dummy_db_snapshot("2", "1", Epoch(1), 2), @@ -357,8 +349,7 @@ mod tests { #[tokio::test] async fn get_master_certificate_multiple_cert_in_previous_one_cert_in_current_epoch_returns_one_in_current_epoch( ) { - let mut deps = DependenciesBuilder::new_for_test(Configuration::new_sample()); - let connection = deps.get_sqlite_connection().await.unwrap(); + let connection = Arc::new(main_db_connection().unwrap()); let certificates = vec![ CertificateRecord::dummy_genesis("1", Epoch(1), 1), CertificateRecord::dummy_db_snapshot("2", "1", Epoch(1), 2), @@ -381,8 +372,7 @@ mod tests { #[tokio::test] async fn get_master_certificate_multiple_cert_in_previous_multiple_in_current_epoch_returns_first_of_current_epoch( ) { - let mut deps = DependenciesBuilder::new_for_test(Configuration::new_sample()); - let connection = deps.get_sqlite_connection().await.unwrap(); + let connection = Arc::new(main_db_connection().unwrap()); let certificates = vec![ CertificateRecord::dummy_genesis("1", Epoch(1), 1), CertificateRecord::dummy_db_snapshot("2", "1", Epoch(1), 2), @@ -406,8 +396,7 @@ mod tests { #[tokio::test] async fn get_master_certificate_multiple_cert_in_penultimate_epoch_none_in_previous_returns_none( ) { - let mut deps = DependenciesBuilder::new_for_test(Configuration::new_sample()); - let connection = deps.get_sqlite_connection().await.unwrap(); + let connection = Arc::new(main_db_connection().unwrap()); let certificates = vec![ CertificateRecord::dummy_genesis("1", Epoch(1), 1), CertificateRecord::dummy_db_snapshot("2", "1", Epoch(1), 2), @@ -427,8 +416,7 @@ mod tests { #[tokio::test] async fn get_master_certificate_second_genesis_after_multiple_cert_in_current_epoch_returns_last_genesis( ) { - let mut deps = DependenciesBuilder::new_for_test(Configuration::new_sample()); - let connection = deps.get_sqlite_connection().await.unwrap(); + let connection = Arc::new(main_db_connection().unwrap()); let certificates = vec![ CertificateRecord::dummy_genesis("1", Epoch(1), 1), CertificateRecord::dummy_db_snapshot("2", "1", Epoch(1), 2), @@ -451,8 +439,7 @@ mod tests { #[tokio::test] async fn get_master_certificate_second_genesis_after_multiple_cert_in_multiple_epochs_returns_last_genesis( ) { - let mut deps = DependenciesBuilder::new_for_test(Configuration::new_sample()); - let connection = deps.get_sqlite_connection().await.unwrap(); + let connection = Arc::new(main_db_connection().unwrap()); let certificates = vec![ CertificateRecord::dummy_genesis("1", Epoch(1), 1), CertificateRecord::dummy_db_snapshot("2", "1", Epoch(1), 2), @@ -477,8 +464,7 @@ mod tests { #[tokio::test] async fn get_master_certificate_new_genesis_after_multiple_cert_in_previous_epoch_returns_last_genesis( ) { - let mut deps = DependenciesBuilder::new_for_test(Configuration::new_sample()); - let connection = deps.get_sqlite_connection().await.unwrap(); + let connection = Arc::new(main_db_connection().unwrap()); let certificates = vec![ CertificateRecord::dummy_genesis("1", Epoch(1), 1), CertificateRecord::dummy_db_snapshot("2", "1", Epoch(1), 2), @@ -503,8 +489,7 @@ mod tests { let (certificates, _) = setup_certificate_chain(3, 1); let expected_certificate_id = &certificates[2].hash; let epoch = &certificates[2].epoch; - let mut deps = DependenciesBuilder::new_for_test(Configuration::new_sample()); - let connection = deps.get_sqlite_connection().await.unwrap(); + let connection = Arc::new(main_db_connection().unwrap()); insert_certificate_records(&connection, certificates.clone()); let repository: CertificateRepository = CertificateRepository::new(connection); @@ -520,9 +505,8 @@ mod tests { #[tokio::test] async fn save_certificate() { let (certificates, _) = setup_certificate_chain(5, 3); - let mut deps = DependenciesBuilder::new_for_test(Configuration::new_sample()); - let connection = deps.get_sqlite_connection().await.unwrap(); - let repository: CertificateRepository = CertificateRepository::new(connection); + let connection = Arc::new(main_db_connection().unwrap()); + let repository: CertificateRepository = CertificateRepository::new(connection.clone()); let certificate = repository .create_certificate(certificates[4].clone()) .await @@ -530,7 +514,6 @@ mod tests { assert_eq!(certificates[4].hash, certificate.hash); { - let connection = deps.get_sqlite_connection().await.unwrap(); let cert = connection .fetch_first(GetCertificateRecordQuery::by_certificate_id( &certificates[4].hash, @@ -544,8 +527,7 @@ mod tests { #[tokio::test] async fn delete_only_given_certificates() { - let mut deps = DependenciesBuilder::new_for_test(Configuration::new_sample()); - let connection = deps.get_sqlite_connection().await.unwrap(); + let connection = Arc::new(main_db_connection().unwrap()); let repository = CertificateRepository::new(connection.clone()); let records = vec![ CertificateRecord::dummy_genesis("1", Epoch(1), 1), From a2fc819126f724ed1ca99397b192541ead6210ee Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Fri, 11 Oct 2024 19:01:56 +0200 Subject: [PATCH 263/274] feat(aggregator): add logs to snapshot uploaders --- .../src/snapshot_uploaders/local_snapshot_uploader.rs | 1 + .../src/snapshot_uploaders/remote_snapshot_uploader.rs | 2 ++ 2 files changed, 3 insertions(+) diff --git a/mithril-aggregator/src/snapshot_uploaders/local_snapshot_uploader.rs b/mithril-aggregator/src/snapshot_uploaders/local_snapshot_uploader.rs index c2f898de0c9..461ac0dda4d 100644 --- a/mithril-aggregator/src/snapshot_uploaders/local_snapshot_uploader.rs +++ b/mithril-aggregator/src/snapshot_uploaders/local_snapshot_uploader.rs @@ -51,6 +51,7 @@ impl SnapshotUploader for LocalSnapshotUploader { digest.unwrap() ); + debug!(self.logger, "Snapshot 'uploaded' to local storage"; "location" => &location); Ok(location) } } diff --git a/mithril-aggregator/src/snapshot_uploaders/remote_snapshot_uploader.rs b/mithril-aggregator/src/snapshot_uploaders/remote_snapshot_uploader.rs index e99fb97a076..be0345bd1d3 100644 --- a/mithril-aggregator/src/snapshot_uploaders/remote_snapshot_uploader.rs +++ b/mithril-aggregator/src/snapshot_uploaders/remote_snapshot_uploader.rs @@ -48,7 +48,9 @@ impl SnapshotUploader for RemoteSnapshotUploader { ) }; + debug!(self.logger, "Uploading snapshot to remote storage"; "location" => &location); self.file_uploader.upload_file(snapshot_filepath).await?; + debug!(self.logger, "Snapshot upload to remote storage completed"; "location" => &location); Ok(location) } From 1c06fede17ad0640b80b887c7d68b987df7e3da9 Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Fri, 11 Oct 2024 19:03:30 +0200 Subject: [PATCH 264/274] chore: remove `slog_scope` from aggregator main dependencies It's still a `dev-dependencies` as it is useful for integration tests. --- mithril-aggregator/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mithril-aggregator/Cargo.toml b/mithril-aggregator/Cargo.toml index 24c888d08d4..9d3ade0000c 100644 --- a/mithril-aggregator/Cargo.toml +++ b/mithril-aggregator/Cargo.toml @@ -44,7 +44,6 @@ slog = { version = "2.7.0", features = [ ] } slog-async = "2.8.0" slog-bunyan = "2.5.0" -slog-scope = "4.4.0" sqlite = { version = "0.36.1", features = ["bundled"] } tar = "0.4.41" thiserror = "1.0.63" @@ -70,6 +69,7 @@ mithril-common = { path = "../mithril-common", features = [ "test_tools", ] } mockall = "0.13.0" +slog-scope = "4.4.0" slog-term = "2.9.1" tempfile = "3.12.0" From d1a1ee59124cc420d7e13647747afe4bed7624e3 Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Fri, 11 Oct 2024 19:06:58 +0200 Subject: [PATCH 265/274] style(aggregator): set application name in log to `mithril-aggregator` Instead of the default `slog-rs`. --- mithril-aggregator/src/main.rs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/mithril-aggregator/src/main.rs b/mithril-aggregator/src/main.rs index 3d9c1e8b371..03f88b31232 100644 --- a/mithril-aggregator/src/main.rs +++ b/mithril-aggregator/src/main.rs @@ -1,17 +1,21 @@ #![doc = include_str!("../README.md")] use clap::Parser; -use mithril_aggregator::{CommandType, MainOpts}; -use mithril_common::StdResult; use slog::{Drain, Fuse, Level, Logger}; use slog_async::Async; use std::sync::Arc; +use mithril_aggregator::{CommandType, MainOpts}; +use mithril_common::StdResult; + fn build_io_logger(log_level: Level, io: W) -> Fuse { - let drain = slog_bunyan::new(io).set_pretty(false).build().fuse(); + let drain = slog_bunyan::with_name("mithril-aggregator", io) + .set_pretty(false) + .build() + .fuse(); let drain = slog::LevelFilter::new(drain, log_level).fuse(); - slog_async::Async::new(drain).build().fuse() + Async::new(drain).build().fuse() } /// Build a logger from args. From 01bf63f383fe9d2c5aee51d906da43a90724fb4d Mon Sep 17 00:00:00 2001 From: DJO <790521+Alenar@users.noreply.github.com> Date: Mon, 14 Oct 2024 12:40:16 +0200 Subject: [PATCH 266/274] chore: upgrade crate versions * mithril-aggregator from `0.5.80` to `0.5.81` * mithril-common from `0.4.67` to `0.4.68` --- Cargo.lock | 4 ++-- mithril-aggregator/Cargo.toml | 2 +- mithril-common/Cargo.toml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d75f9f66211..dce9e239c12 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3403,7 +3403,7 @@ dependencies = [ [[package]] name = "mithril-aggregator" -version = "0.5.80" +version = "0.5.81" dependencies = [ "anyhow", "async-trait", @@ -3559,7 +3559,7 @@ dependencies = [ [[package]] name = "mithril-common" -version = "0.4.67" +version = "0.4.68" dependencies = [ "anyhow", "async-trait", diff --git a/mithril-aggregator/Cargo.toml b/mithril-aggregator/Cargo.toml index 9d3ade0000c..2fb7be2e5c1 100644 --- a/mithril-aggregator/Cargo.toml +++ b/mithril-aggregator/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-aggregator" -version = "0.5.80" +version = "0.5.81" description = "A Mithril Aggregator server" authors = { workspace = true } edition = { workspace = true } diff --git a/mithril-common/Cargo.toml b/mithril-common/Cargo.toml index 4ea4e38c8bc..99f12801e4f 100644 --- a/mithril-common/Cargo.toml +++ b/mithril-common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-common" -version = "0.4.67" +version = "0.4.68" description = "Common types, interfaces, and utilities for Mithril nodes." authors = { workspace = true } edition = { workspace = true } From ba93f3d3bd923b155666171fddecebe7dd96a1b0 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Mon, 14 Oct 2024 15:14:17 +0200 Subject: [PATCH 267/274] docs: update CHANGELOG with '2442.0' distribution --- CHANGELOG.md | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d5a29bbdc61..c293b40299b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,11 +9,25 @@ As a minor extension, we have adopted a slightly different versioning convention ## Mithril Distribution [XXXX] - UNRELEASED -- Optimizations of the state machine used by the signer to create individual signatures. +- Crates versions: + +| Crate | Version | +| ----- | ------- | +| N/A | `-` | + +## Mithril Distribution [2442.0] - UNRELEASED + +- Decentralization of the signature orchestration: -- Support for buffering of incoming single signatures by the aggregator if it can not aggregate them yet. + - Optimizations of the state machine used by the signer to create individual signatures. -- Expose the Cardano transactions signing configuration for the current and upcoming epoch via the `/epoch-settings` route. + - Support for buffering of incoming single signatures by the aggregator if it can not aggregate them yet. + + - Expose the Cardano transactions signing configuration for the current and upcoming epoch via the `/epoch-settings` route. + + - Signer computes what to sign independently of the aggregator. + + - Deprecate aggregator `/certificate-pending` route as the signer does not need it anymore. - Support for new `Pythagoras` Mithril era. @@ -21,16 +35,10 @@ As a minor extension, we have adopted a slightly different versioning convention - Refactor the builder of the protocol messages, and add support for protocol parameters and epoch parts. -- Signer computes what to sign independently of the aggregator. - -- Deprecate aggregator `/certificate-pending` route as the signer does not need it anymore. - - Support for `Cardano node` `9.2.1` in the signer and the aggregator. - Support for stable Cardano transaction client library, CLI and WASM. -- Support for Mithril era switch in end to end test. - - Crates versions: | Crate | Version | From e2a8f79aee0fc5c04ed6a865264aa949b3f93e44 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Mon, 14 Oct 2024 17:08:57 +0200 Subject: [PATCH 268/274] chore: update Rust dependencies --- Cargo.lock | 877 ++++++++++++------ demo/protocol-demo/Cargo.toml | 4 +- .../Cargo.toml | 4 +- .../client-cardano-transaction/Cargo.toml | 4 +- .../Cargo.toml | 4 +- examples/client-snapshot/Cargo.toml | 8 +- internal/mithril-doc-derive/Cargo.toml | 2 +- internal/mithril-doc/Cargo.toml | 4 +- internal/mithril-persistence/Cargo.toml | 8 +- mithril-aggregator/Cargo.toml | 18 +- mithril-client-cli/Cargo.toml | 12 +- mithril-client-wasm/Cargo.toml | 14 +- mithril-client/Cargo.toml | 18 +- mithril-common/Cargo.toml | 32 +- mithril-relay/Cargo.toml | 10 +- mithril-signer/Cargo.toml | 14 +- mithril-stm/Cargo.toml | 6 +- .../mithril-aggregator-fake/Cargo.toml | 16 +- .../mithril-end-to-end/Cargo.toml | 12 +- 19 files changed, 682 insertions(+), 385 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3c377d24030..6daa0c5ad2d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "addr2line" -version = "0.24.1" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5fb1d8e4442bd405fdfd1dacb42792696b0cf9cb15882e5d097b742a676d375" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ "gimli", ] @@ -153,9 +153,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.87" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10f00e1f6e58a40e807377c75c6a7f97bf9044fab57816f2414e6f5f4499d7b8" +checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6" [[package]] name = "arc-swap" @@ -165,9 +165,9 @@ checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" [[package]] name = "arrayref" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d151e35f61089500b617991b791fc8bfd237ae50cd5950803758a179b41e67a" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" [[package]] name = "arrayvec" @@ -208,7 +208,7 @@ checksum = "965c2d33e53cb6b267e148a4cb0760bc01f4904c1cd4bb4002a085bb016d1490" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", "synstructure", ] @@ -220,7 +220,7 @@ checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -335,9 +335,9 @@ dependencies = [ [[package]] name = "async-process" -version = "2.2.4" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8a07789659a4d385b79b18b9127fc27e1a59e1e89117c78c5ea3b806f016374" +checksum = "63255f1dc2381611000436537bbedfe83183faa303a5a0edaf191edef06526bb" dependencies = [ "async-channel 2.3.1", "async-io", @@ -350,7 +350,6 @@ dependencies = [ "futures-lite", "rustix", "tracing", - "windows-sys 0.59.0", ] [[package]] @@ -361,7 +360,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -418,13 +417,13 @@ checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" -version = "0.1.82" +version = "0.1.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a27b8a3a6e1a44fa4c8baf1f653e4172e81486d4941f2237e20dc2d0cf4ddff1" +checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -459,15 +458,15 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "axum" -version = "0.7.5" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a6c9af12842a67734c9a2e355436e5d03b22383ed60cf13cd0c18fbfe3dcbcf" +checksum = "504e3947307ac8326a5437504c517c4b56716c9d98fac0028c2acc7ca47d70ae" dependencies = [ "async-trait", "axum-core", @@ -499,9 +498,9 @@ dependencies = [ [[package]] name = "axum-core" -version = "0.4.3" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a15c63fd72d41492dc4f497196f5da1fb04fb7529e631d73630d1b491e47a2e3" +checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" dependencies = [ "async-trait", "bytes", @@ -512,7 +511,7 @@ dependencies = [ "mime", "pin-project-lite", "rustversion", - "sync_wrapper 0.1.2", + "sync_wrapper 1.0.1", "tower-layer", "tower-service", "tracing", @@ -707,6 +706,12 @@ dependencies = [ "zeroize", ] +[[package]] +name = "borrow-or-share" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eeab4423108c5d7c744f4d234de88d18d636100093ae04caf4825134b9c3a32" + [[package]] name = "bs58" version = "0.5.1" @@ -730,9 +735,9 @@ checksum = "5ce89b21cab1437276d2650d57e971f9d548a2d9037cc231abdc0562b97498ce" [[package]] name = "bytemuck" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94bbb0ad554ad961ddc5da507a12a29b14e4ae5bda06b19f575a3e6079d2e2ae" +checksum = "8334215b81e418a0a7bdb8ef0849474f40bb10c8b71f1c4ed315cff49f32494d" [[package]] name = "byteorder" @@ -742,9 +747,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.7.1" +version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" +checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" [[package]] name = "cast" @@ -754,9 +759,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.1.18" +version = "1.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b62ac837cdb5cb22e10a256099b4fc502b1dfe560cb282963a974d7abd80e476" +checksum = "b16803a61b81d9eabb7eae2588776c4c1e584b738ede45fdbb4c972cec1e9945" dependencies = [ "jobserver", "libc", @@ -857,9 +862,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.17" +version = "4.5.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e5a21b8495e732f1b3c364c9949b201ca7bae518c502c80256c96ad79eaf6ac" +checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" dependencies = [ "clap_builder", "clap_derive", @@ -867,9 +872,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.17" +version = "4.5.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cf2dd12af7a047ad9d6da2b6b249759a22a7abc0f474c1dae1777afa4b21a73" +checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" dependencies = [ "anstream", "anstyle", @@ -879,14 +884,14 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.13" +version = "4.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "501d359d5f3dcaf6ecdeee48833ae73ec6e42723a1e52419c79abf9507eec0a0" +checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" dependencies = [ - "heck 0.5.0", + "heck", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -1303,7 +1308,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -1327,7 +1332,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -1338,7 +1343,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -1450,7 +1455,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -1518,6 +1523,15 @@ version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +[[package]] +name = "email_address" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e079f19b08ca6239f47f8ba8509c11cf3ea30095831f7fed61441475edd8c449" +dependencies = [ + "serde", +] + [[package]] name = "ena" version = "0.14.3" @@ -1544,14 +1558,14 @@ dependencies = [ [[package]] name = "enum-as-inner" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ffccbb6966c05b32ef8fbac435df276c4ae4d3dc55a8cd0eb9745e6c12f546a" +checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" dependencies = [ - "heck 0.4.1", + "heck", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -1662,14 +1676,25 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" -version = "1.0.33" +version = "1.0.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "324a1be68054ef05ad64b861cc9eaf1d623d2d8cb25b4bf2cb9cdd902b4bf253" +checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" dependencies = [ "crc32fast", "miniz_oxide", ] +[[package]] +name = "fluent-uri" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1918b65d96df47d3591bed19c5cca17e3fa5d0707318e4b5ef2eae01764df7e5" +dependencies = [ + "borrow-or-share", + "ref-cast", + "serde", +] + [[package]] name = "flume" version = "0.11.0" @@ -1688,6 +1713,12 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foldhash" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f81ec6369c545a7d40e4589b5597581fa1c441fe1cce96dd1de43159910a36a2" + [[package]] name = "foreign-types" version = "0.3.2" @@ -1740,9 +1771,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -1765,9 +1796,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -1775,15 +1806,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", @@ -1793,9 +1824,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-lite" @@ -1812,13 +1843,13 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -1834,15 +1865,15 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-ticker" @@ -1863,9 +1894,9 @@ checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" [[package]] name = "futures-util" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-channel", "futures-core", @@ -1914,9 +1945,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.31.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32085ea23f3234fc7846555e85283ba4de91e21016dc0455a16286d87a292d64" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "glob" @@ -1958,7 +1989,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.5.0", + "indexmap 2.6.0", "slab", "tokio", "tokio-util", @@ -1977,7 +2008,7 @@ dependencies = [ "futures-core", "futures-sink", "http 1.1.0", - "indexmap 2.5.0", + "indexmap 2.6.0", "slab", "tokio", "tokio-util", @@ -2014,12 +2045,13 @@ checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" [[package]] name = "hashbrown" -version = "0.14.5" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" dependencies = [ - "ahash", "allocator-api2", + "equivalent", + "foldhash", ] [[package]] @@ -2046,12 +2078,6 @@ dependencies = [ "http 0.2.12", ] -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - [[package]] name = "heck" version = "0.5.0" @@ -2215,9 +2241,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.9.4" +version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" +checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" [[package]] name = "httpdate" @@ -2318,12 +2344,12 @@ dependencies = [ "hyper 1.4.1", "hyper-util", "rustls", - "rustls-native-certs 0.8.0", + "rustls-native-certs", "rustls-pki-types", "tokio", "tokio-rustls", "tower-service", - "webpki-roots 0.26.5", + "webpki-roots 0.26.6", ] [[package]] @@ -2357,9 +2383,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.7" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cde7055719c54e36e95e8719f95883f22072a48ede39db7fc17a4e1d5281e9b9" +checksum = "41296eb09f183ac68eec06e03cdbea2e759633d4067b2f6552fc2e009bcad08b" dependencies = [ "bytes", "futures-channel", @@ -2370,16 +2396,15 @@ dependencies = [ "pin-project-lite", "socket2", "tokio", - "tower", "tower-service", "tracing", ] [[package]] name = "iana-time-zone" -version = "0.1.60" +version = "0.1.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -2398,6 +2423,124 @@ dependencies = [ "cc", ] +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + [[package]] name = "ident_case" version = "1.0.1" @@ -2424,6 +2567,18 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "idna" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd69211b9b519e98303c015e21a007e293db403b6c85b9b124e133d25e242cdd" +dependencies = [ + "icu_normalizer", + "icu_properties", + "smallvec", + "utf8_iter", +] + [[package]] name = "if-addrs" version = "0.10.2" @@ -2485,12 +2640,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", - "hashbrown 0.14.5", + "hashbrown 0.15.0", "serde", ] @@ -2546,9 +2701,9 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.10.0" +version = "2.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "187674a687eed5fe42285b40c6291f9a01517d415fad1c3cbc6a9f778af7fcd4" +checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" [[package]] name = "is-terminal" @@ -2567,15 +2722,6 @@ version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" -[[package]] -name = "iso8601" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "924e5d73ea28f59011fec52a0d12185d496a9b075d360657aed2a5707f701153" -dependencies = [ - "nom", -] - [[package]] name = "itertools" version = "0.10.5" @@ -2629,9 +2775,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.70" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" +checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" dependencies = [ "wasm-bindgen", ] @@ -2649,32 +2795,29 @@ dependencies = [ [[package]] name = "jsonschema" -version = "0.18.1" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5f037c58cadb17e8591b620b523cc6a7ab2b91b6ce3121f8eb4171f8d80115c" +checksum = "bea85509e7320309cc8be62d8badb46f9525157bdc748bf2ec089cd4083a3f7e" dependencies = [ "ahash", "anyhow", "base64 0.22.1", "bytecount", - "clap", + "email_address", "fancy-regex", "fraction", - "getrandom", - "iso8601", + "idna 1.0.2", "itoa", - "memchr", "num-cmp", "once_cell", - "parking_lot", "percent-encoding", - "regex", - "reqwest 0.12.7", + "referencing", + "regex-syntax", + "reqwest 0.12.8", "serde", "serde_json", - "time", "url", - "uuid", + "uuid-simd", ] [[package]] @@ -2768,9 +2911,9 @@ checksum = "db13adb97ab515a3691f56e4dbab09283d0b86cb45abd991d8634a9d6f501760" [[package]] name = "libc" -version = "0.2.158" +version = "0.2.159" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" +checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" [[package]] name = "libm" @@ -3137,10 +3280,10 @@ version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "206e0aa0ebe004d778d79fb0966aa0de996c19894e2c0605ba2f8524dd4443d8" dependencies = [ - "heck 0.5.0", + "heck", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -3272,6 +3415,12 @@ version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +[[package]] +name = "litemap" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704" + [[package]] name = "lock_api" version = "0.4.12" @@ -3293,11 +3442,11 @@ dependencies = [ [[package]] name = "lru" -version = "0.12.4" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37ee39891760e7d94734f6f63fedc29a2e4a152f836120753a72503f09fcf904" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" dependencies = [ - "hashbrown 0.14.5", + "hashbrown 0.15.0", ] [[package]] @@ -3422,7 +3571,7 @@ dependencies = [ "openssl", "openssl-probe", "rayon", - "reqwest 0.12.7", + "reqwest 0.12.8", "semver", "serde", "serde_json", @@ -3457,7 +3606,7 @@ dependencies = [ "futures", "mithril-build-script", "mithril-common", - "reqwest 0.12.7", + "reqwest 0.12.8", "serde", "serde_json", "signal-hook", @@ -3494,7 +3643,7 @@ dependencies = [ "indicatif", "mithril-common", "mockall", - "reqwest 0.12.7", + "reqwest 0.12.8", "semver", "serde", "serde_json", @@ -3590,12 +3739,12 @@ dependencies = [ "rand_chacha", "rand_core 0.6.4", "rayon", - "reqwest 0.12.7", + "reqwest 0.12.8", "semver", "serde", "serde_bytes", "serde_json", - "serde_with 3.9.0", + "serde_with 3.11.0", "serde_yaml", "sha2", "slog", @@ -3625,7 +3774,7 @@ name = "mithril-doc-derive" version = "0.1.9" dependencies = [ "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -3641,7 +3790,7 @@ dependencies = [ "indicatif", "mithril-common", "mithril-doc", - "reqwest 0.12.7", + "reqwest 0.12.8", "serde", "serde_json", "serde_yaml", @@ -3684,7 +3833,7 @@ dependencies = [ "libp2p", "mithril-common", "mithril-doc", - "reqwest 0.12.7", + "reqwest 0.12.8", "serde", "serde_json", "serde_yaml", @@ -3722,7 +3871,7 @@ dependencies = [ "prometheus-parse", "rand_chacha", "rand_core 0.6.4", - "reqwest 0.12.7", + "reqwest 0.12.8", "serde", "serde_json", "slog", @@ -3800,7 +3949,7 @@ dependencies = [ "cfg-if", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -3823,9 +3972,9 @@ dependencies = [ [[package]] name = "multiaddr" -version = "0.18.1" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b852bc02a2da5feed68cd14fa50d0774b92790a5bdbfa932a813926c8472070" +checksum = "fe6351f60b488e04c1d21bc69e56b89cb3f5e8f5d22557d6e8031bdfd79b6961" dependencies = [ "arrayref", "byteorder", @@ -3836,7 +3985,7 @@ dependencies = [ "percent-encoding", "serde", "static_assertions", - "unsigned-varint 0.7.2", + "unsigned-varint 0.8.0", "url", ] @@ -4134,9 +4283,9 @@ checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" [[package]] name = "object" -version = "0.36.4" +version = "0.36.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "084f1a5821ac4c651660a94a7153d27ac9d8a53736203f58b31945ded098070a" +checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" dependencies = [ "memchr", ] @@ -4152,9 +4301,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.19.0" +version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "oorandom" @@ -4191,7 +4340,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -4232,6 +4381,12 @@ dependencies = [ "hashbrown 0.13.2", ] +[[package]] +name = "outref" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4030760ffd992bef45b0ae3f10ce1aba99e33464c90d14dd7c039884963ddc7a" + [[package]] name = "overload" version = "0.1.1" @@ -4382,9 +4537,9 @@ checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "pathdiff" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" +checksum = "d61c5ce1153ab5b689d0c074c4e7fc613e942dfb7dd9eea5ab202d2ad91fe361" [[package]] name = "pem" @@ -4415,9 +4570,9 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" -version = "2.7.12" +version = "2.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c73c26c01b8c87956cea613c907c9d6ecffd8d18a2a5908e5de0adfaa185cea" +checksum = "879952a81a83930934cbf1786752d6dedc3b1f29e8f8fb2ad1d0a36f377cf442" dependencies = [ "memchr", "thiserror", @@ -4426,9 +4581,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.7.12" +version = "2.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "664d22978e2815783adbdd2c588b455b1bd625299ce36b2a99881ac9627e6d8d" +checksum = "d214365f632b123a47fd913301e14c946c61d1c183ee245fa76eb752e59a02dd" dependencies = [ "pest", "pest_generator", @@ -4436,22 +4591,22 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.7.12" +version = "2.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2d5487022d5d33f4c30d91c22afa240ce2a644e87fe08caad974d4eab6badbe" +checksum = "eb55586734301717aea2ac313f50b2eb8f60d2fc3dc01d190eefa2e625f60c4e" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] name = "pest_meta" -version = "2.7.12" +version = "2.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0091754bbd0ea592c4deb3a122ce8ecbb0753b738aa82bc055fcc2eccc8d8174" +checksum = "b75da2a70cf4d9cb76833c990ac9cd3923c9a8905a8929789ce347c84564d03d" dependencies = [ "once_cell", "pest", @@ -4465,7 +4620,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap 2.5.0", + "indexmap 2.6.0", ] [[package]] @@ -4485,22 +4640,22 @@ checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" [[package]] name = "pin-project" -version = "1.1.5" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +checksum = "baf123a161dde1e524adf36f90bc5d8d3462824a9c43553ad07a8183161189ec" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.5" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +checksum = "a4502d8515ca9f32f1fb543d987f63d95a14934883db45bdb48060b6b69257f8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -4538,9 +4693,9 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" [[package]] name = "plotters" @@ -4610,9 +4765,9 @@ dependencies = [ [[package]] name = "portable-atomic" -version = "1.7.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da544ee218f0d287a911e9c99a39a8c9bc8fcad3cb8db5959940044ecfc67265" +checksum = "cc9c68a3f6da06753e9335d63e27f6b9754dd1920d941135b7ea8224f141adb2" [[package]] name = "powerfmt" @@ -4663,9 +4818,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.86" +version = "1.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "b3e4daa0dcf6feba26f985457cdf104d4b4256fc5a09547140f3631bb076b19a" dependencies = [ "unicode-ident", ] @@ -4705,7 +4860,7 @@ checksum = "440f724eba9f6996b75d63681b0a92b06947f1457076d503a4d2e2c8f56442b8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -4911,9 +5066,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.3" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" +checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" dependencies = [ "bitflags 2.6.0", ] @@ -4929,11 +5084,44 @@ dependencies = [ "thiserror", ] +[[package]] +name = "ref-cast" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf0a6f84d5f1d581da8b41b47ec8600871962f2a528115b542b362d4b744931" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcc303e793d3734489387d205e9b186fac9c6cfacedd98cbb2e8a5943595f3e6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "referencing" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35bdf02a06a0820fcb9ce064715b424f1cdd79e24f991990a92425afe11eaf4a" +dependencies = [ + "ahash", + "fluent-uri", + "once_cell", + "percent-encoding", + "serde_json", +] + [[package]] name = "regex" -version = "1.10.6" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" +checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8" dependencies = [ "aho-corasick", "memchr", @@ -4943,9 +5131,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.7" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" dependencies = [ "aho-corasick", "memchr", @@ -4954,9 +5142,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" @@ -5002,9 +5190,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.7" +version = "0.12.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8f4955649ef5c38cc7f9e8aa41761d48fb9677197daea9984dc54f56aad5e63" +checksum = "f713147fbe92361e52392c73b8c9e48c04c6625bce969ef54dc901e58e042a7b" dependencies = [ "base64 0.22.1", "bytes", @@ -5030,8 +5218,8 @@ dependencies = [ "pin-project-lite", "quinn", "rustls", - "rustls-native-certs 0.7.3", - "rustls-pemfile 2.1.3", + "rustls-native-certs", + "rustls-pemfile 2.2.0", "rustls-pki-types", "serde", "serde_json", @@ -5048,7 +5236,7 @@ dependencies = [ "wasm-bindgen-futures", "wasm-streams", "web-sys", - "webpki-roots 0.26.5", + "webpki-roots 0.26.6", "windows-registry", ] @@ -5121,9 +5309,9 @@ dependencies = [ [[package]] name = "rug" -version = "1.26.0" +version = "1.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f86bdefce0edcc5493a2c5a2c87e57a40c78c772a7e6c48f25550e89815772b" +checksum = "97ae2c1089ec0575193eb9222881310cc1ed8bce3646ef8b81b44b518595b79d" dependencies = [ "az", "gmp-mpfr-sys", @@ -5173,9 +5361,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.36" +version = "0.38.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f55e80d50763938498dd5ebb18647174e0c76dc38c5505294bb224624f30f36" +checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" dependencies = [ "bitflags 2.6.0", "errno", @@ -5186,31 +5374,18 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.12" +version = "0.23.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c58f8c84392efc0a126acce10fa59ff7b3d2ac06ab451a33f2741989b806b044" +checksum = "415d9944693cb90382053259f89fbb077ea730ad7273047ec63b19bc9b160ba8" dependencies = [ "once_cell", "ring 0.17.8", "rustls-pki-types", - "rustls-webpki 0.102.7", + "rustls-webpki 0.102.8", "subtle", "zeroize", ] -[[package]] -name = "rustls-native-certs" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5bfb394eeed242e909609f56089eecfe5fda225042e8b171791b9c95f5931e5" -dependencies = [ - "openssl-probe", - "rustls-pemfile 2.1.3", - "rustls-pki-types", - "schannel", - "security-framework", -] - [[package]] name = "rustls-native-certs" version = "0.8.0" @@ -5218,7 +5393,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fcaf18a4f2be7326cd874a5fa579fae794320a0f388d365dca7e480e55f83f8a" dependencies = [ "openssl-probe", - "rustls-pemfile 2.1.3", + "rustls-pemfile 2.2.0", "rustls-pki-types", "schannel", "security-framework", @@ -5235,19 +5410,18 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "2.1.3" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "196fe16b00e106300d3e45ecfcb764fa292a535d7326a29a5875c579c7417425" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" dependencies = [ - "base64 0.22.1", "rustls-pki-types", ] [[package]] name = "rustls-pki-types" -version = "1.8.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0a2ce646f8655401bb81e7927b812614bd5d91dbc968696be50603510fcaf0" +checksum = "0e696e35370c65c9c541198af4543ccd580cf17fc25d8e05c5a242b202488c55" [[package]] name = "rustls-webpki" @@ -5261,9 +5435,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.102.7" +version = "0.102.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84678086bd54edf2b415183ed7a94d0efb049f1b646a33e22a36f3794be6ae56" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" dependencies = [ "ring 0.17.8", "rustls-pki-types", @@ -5325,9 +5499,9 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.24" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9aaafd5a2b6e3d657ff009d82fbd630b6bd54dd4eb06f21693925cdf80f9b8b" +checksum = "01227be5826fa0690321a2ba6c5cd57a19cf3f6a09e76973b58e61de6ab9d1c1" dependencies = [ "windows-sys 0.59.0", ] @@ -5359,9 +5533,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.11.1" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75da29fe9b9b08fe9d6b22b5b4bcbc75d8db3aa31e639aa56bb62e9d46bfceaf" +checksum = "ea4a292869320c0272d7bc55a5a6aafaff59b4f63404a003887b679a2e05b4b6" dependencies = [ "core-foundation-sys", "libc", @@ -5416,7 +5590,7 @@ checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -5453,9 +5627,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "0.6.7" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb5b1b31579f3811bf615c144393417496f152e12ac8b7663bf664f4a815306d" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" dependencies = [ "serde", ] @@ -5490,19 +5664,19 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.9.0" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cecfa94848272156ea67b2b1a53f20fc7bc638c4a46d2f8abde08f05f4b857" +checksum = "8e28bdad6db2b8340e449f7108f020b3b092e8583a9e3fb82713e1d4e71fe817" dependencies = [ "base64 0.22.1", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.5.0", + "indexmap 2.6.0", "serde", "serde_derive", "serde_json", - "serde_with_macros 3.9.0", + "serde_with_macros 3.11.0", "time", ] @@ -5515,19 +5689,19 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] name = "serde_with_macros" -version = "3.9.0" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8fee4991ef4f274617a51ad4af30519438dacb2f56ac773b08a1922ff743350" +checksum = "9d846214a9854ef724f3da161b426242d8de7c1fc7de2f89bb1efcb154dca79d" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -5536,7 +5710,7 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.5.0", + "indexmap 2.6.0", "itoa", "ryu", "serde", @@ -5829,6 +6003,12 @@ dependencies = [ "sqlite3-src", ] +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + [[package]] name = "static_assertions" version = "1.1.0" @@ -5869,11 +6049,11 @@ version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" dependencies = [ - "heck 0.5.0", + "heck", "proc-macro2", "quote", "rustversion", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -5895,9 +6075,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.77" +version = "2.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" +checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" dependencies = [ "proc-macro2", "quote", @@ -5927,7 +6107,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -5986,9 +6166,9 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tar" -version = "0.4.41" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb797dad5fb5b76fcf519e702f4a589483b5ef06567f160c392832c1f5e44909" +checksum = "4ff6c40d3aedb5e06b57c6f669ad17ab063dd1e63d977c6a88e7f4dfa4f04020" dependencies = [ "filetime", "libc", @@ -5997,9 +6177,9 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.12.0" +version = "3.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" +checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" dependencies = [ "cfg-if", "fastrand", @@ -6036,22 +6216,22 @@ checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76" [[package]] name = "thiserror" -version = "1.0.63" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" +checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.63" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" +checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -6135,6 +6315,16 @@ dependencies = [ "crunchy", ] +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", +] + [[package]] name = "tinytemplate" version = "1.2.1" @@ -6186,7 +6376,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -6258,11 +6448,11 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.20" +version = "0.22.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d" +checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ - "indexmap 2.5.0", + "indexmap 2.6.0", "serde", "serde_spanned", "toml_datetime", @@ -6271,14 +6461,14 @@ dependencies = [ [[package]] name = "tower" -version = "0.4.13" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +checksum = "2873938d487c3cfb9aed7546dc9f2711d867c9f90c46b889989a2cb84eba6b4f" dependencies = [ "futures-core", "futures-util", - "pin-project", "pin-project-lite", + "sync_wrapper 0.1.2", "tokio", "tower-layer", "tower-service", @@ -6287,15 +6477,14 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.5.2" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5" +checksum = "8437150ab6bbc8c5f0f519e3d5ed4aa883a83dd4cdd3d1b21f9482936046cb97" dependencies = [ "bitflags 2.6.0", "bytes", "http 1.1.0", "http-body 1.0.1", - "http-body-util", "pin-project-lite", "tower-layer", "tower-service", @@ -6334,7 +6523,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -6430,14 +6619,14 @@ checksum = "70b20a22c42c8f1cd23ce5e34f165d4d37038f5b663ad20fb6adbdf029172483" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] name = "ucd-trie" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" [[package]] name = "uint" @@ -6468,42 +6657,42 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.15" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" +checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" [[package]] name = "unicode-normalization" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" dependencies = [ "tinyvec", ] [[package]] name = "unicode-segmentation" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" [[package]] name = "unicode-width" -version = "0.1.13" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" [[package]] name = "unicode-xid" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "229730647fbc343e3a80e463c1db7f78f3855d3f3739bee0dda773c9a037c90a" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" [[package]] name = "universal-hash" @@ -6562,6 +6751,18 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "utf8parse" version = "0.2.2" @@ -6587,7 +6788,18 @@ checksum = "ee1cd046f83ea2c4e920d6ee9f7c3537ef928d75dce5d84a87c2c5d6b3999a3a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", +] + +[[package]] +name = "uuid-simd" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b082222b4f6619906941c17eb2297fff4c2fb96cb60164170522942a200bd8" +dependencies = [ + "outref", + "uuid", + "vsimd", ] [[package]] @@ -6620,6 +6832,12 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" +[[package]] +name = "vsimd" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64" + [[package]] name = "wait-timeout" version = "0.2.0" @@ -6685,9 +6903,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" +checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" dependencies = [ "cfg-if", "once_cell", @@ -6696,24 +6914,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" +checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.43" +version = "0.4.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" +checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" dependencies = [ "cfg-if", "js-sys", @@ -6723,9 +6941,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" +checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -6733,28 +6951,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" +checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" +checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" [[package]] name = "wasm-bindgen-test" -version = "0.3.43" +version = "0.3.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68497a05fb21143a08a7d24fc81763384a3072ee43c44e86aad1744d6adef9d9" +checksum = "d381749acb0943d357dcbd8f0b100640679883fcdeeef04def49daf8d33a5426" dependencies = [ "console_error_panic_hook", "js-sys", @@ -6767,20 +6985,20 @@ dependencies = [ [[package]] name = "wasm-bindgen-test-macro" -version = "0.3.43" +version = "0.3.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b8220be1fa9e4c889b30fd207d4906657e7e90b12e0e6b0c8b8d8709f5de021" +checksum = "c97b2ef2c8d627381e51c071c2ab328eac606d3f69dd82bcbca20a9e389d95f0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] name = "wasm-streams" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129" +checksum = "4e072d4e72f700fb3443d8fe94a39315df013eef1104903cdb0a2abd322bbecd" dependencies = [ "futures-util", "js-sys", @@ -6791,9 +7009,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.70" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" +checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" dependencies = [ "js-sys", "wasm-bindgen", @@ -6817,9 +7035,9 @@ checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" [[package]] name = "webpki-roots" -version = "0.26.5" +version = "0.26.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bd24728e5af82c6c4ec1b66ac4844bdf8156257fccda846ec58b42cd0cdbe6a" +checksum = "841c67bff177718f1d4dfefde8d8f0e78f9b6589319ba88312f567fc5841a958" dependencies = [ "rustls-pki-types", ] @@ -7069,9 +7287,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.6.18" +version = "0.6.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f" +checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" dependencies = [ "memchr", ] @@ -7086,6 +7304,18 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + [[package]] name = "x25519-dalek" version = "2.0.1" @@ -7190,6 +7420,30 @@ dependencies = [ "time", ] +[[package]] +name = "yoke" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", + "synstructure", +] + [[package]] name = "zerocopy" version = "0.7.35" @@ -7208,7 +7462,28 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", +] + +[[package]] +name = "zerofrom" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", + "synstructure", ] [[package]] @@ -7228,7 +7503,29 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", +] + +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", ] [[package]] diff --git a/demo/protocol-demo/Cargo.toml b/demo/protocol-demo/Cargo.toml index 9affdad5a85..04ba4d0dc96 100644 --- a/demo/protocol-demo/Cargo.toml +++ b/demo/protocol-demo/Cargo.toml @@ -11,14 +11,14 @@ repository = { workspace = true } [dependencies] base64 = "0.22.1" blake2 = "0.10.6" -clap = { version = "4.5.17", features = ["derive"] } +clap = { version = "4.5.20", features = ["derive"] } hex = "0.4.3" log = "0.4.22" mithril-common = { path = "../../mithril-common", features = ["fs"] } mithril-doc = { path = "../../internal/mithril-doc" } rand_chacha = "0.3.1" rand_core = "0.6.4" -serde = { version = "1.0.209", features = ["derive"] } +serde = { version = "1.0.210", features = ["derive"] } serde_json = "1.0.128" [target.'cfg(not(windows))'.dependencies] diff --git a/examples/client-cardano-stake-distribution/Cargo.toml b/examples/client-cardano-stake-distribution/Cargo.toml index 03894a44122..a18d7800f1e 100644 --- a/examples/client-cardano-stake-distribution/Cargo.toml +++ b/examples/client-cardano-stake-distribution/Cargo.toml @@ -10,8 +10,8 @@ license = "Apache-2.0" repository = "https://github.com/input-output-hk/mithril/" [dependencies] -anyhow = "1.0.86" -clap = { version = "4.5.17", features = ["derive", "env"] } +anyhow = "1.0.89" +clap = { version = "4.5.20", features = ["derive", "env"] } mithril-client = { path = "../../mithril-client", features = ["unstable"] } slog = "2.7.0" slog-async = "2.8.0" diff --git a/examples/client-cardano-transaction/Cargo.toml b/examples/client-cardano-transaction/Cargo.toml index 5621e9ca791..88269574aa4 100644 --- a/examples/client-cardano-transaction/Cargo.toml +++ b/examples/client-cardano-transaction/Cargo.toml @@ -10,8 +10,8 @@ license = "Apache-2.0" repository = "https://github.com/input-output-hk/mithril/" [dependencies] -anyhow = "1.0.86" -clap = { version = "4.5.17", features = ["derive", "env"] } +anyhow = "1.0.89" +clap = { version = "4.5.20", features = ["derive", "env"] } mithril-client = { path = "../../mithril-client" } slog = "2.7.0" slog-async = "2.8.0" diff --git a/examples/client-mithril-stake-distribution/Cargo.toml b/examples/client-mithril-stake-distribution/Cargo.toml index dde022f24bd..f637122aea2 100644 --- a/examples/client-mithril-stake-distribution/Cargo.toml +++ b/examples/client-mithril-stake-distribution/Cargo.toml @@ -10,8 +10,8 @@ license = "Apache-2.0" repository = "https://github.com/input-output-hk/mithril/" [dependencies] -anyhow = "1.0.86" -clap = { version = "4.5.17", features = ["derive", "env"] } +anyhow = "1.0.89" +clap = { version = "4.5.20", features = ["derive", "env"] } mithril-client = { path = "../../mithril-client" } slog = "2.7.0" slog-async = "2.8.0" diff --git a/examples/client-snapshot/Cargo.toml b/examples/client-snapshot/Cargo.toml index 1acc2e4c44a..2af35f94e79 100644 --- a/examples/client-snapshot/Cargo.toml +++ b/examples/client-snapshot/Cargo.toml @@ -10,10 +10,10 @@ license = "Apache-2.0" repository = "https://github.com/input-output-hk/mithril/" [dependencies] -anyhow = "1.0.86" -async-trait = "0.1.82" -clap = { version = "4.5.17", features = ["derive", "env"] } -futures = "0.3.30" +anyhow = "1.0.89" +async-trait = "0.1.83" +clap = { version = "4.5.20", features = ["derive", "env"] } +futures = "0.3.31" indicatif = "0.17.8" mithril-client = { path = "../../mithril-client", features = ["fs"] } tokio = { version = "1.40.0", features = ["full"] } diff --git a/internal/mithril-doc-derive/Cargo.toml b/internal/mithril-doc-derive/Cargo.toml index 59a3cd43f24..e36a3410edd 100644 --- a/internal/mithril-doc-derive/Cargo.toml +++ b/internal/mithril-doc-derive/Cargo.toml @@ -13,7 +13,7 @@ proc-macro = true [dependencies] quote = "1.0.37" -syn = { version = "2.0.77", features = ["full"] } +syn = { version = "2.0.79", features = ["full"] } [features] default = [] diff --git a/internal/mithril-doc/Cargo.toml b/internal/mithril-doc/Cargo.toml index 3b5ffac537d..99efd0030a0 100644 --- a/internal/mithril-doc/Cargo.toml +++ b/internal/mithril-doc/Cargo.toml @@ -10,12 +10,12 @@ repository = { workspace = true } include = ["**/*.rs", "Cargo.toml", "README.md", ".gitignore"] [dependencies] -clap = { version = "4.5.17", features = ["derive", "env"] } +clap = { version = "4.5.20", features = ["derive", "env"] } config = "0.14.0" mithril-doc-derive = { path = "../mithril-doc-derive" } [dev-dependencies] -regex = "1.10.6" +regex = "1.11.0" [features] default = [] diff --git a/internal/mithril-persistence/Cargo.toml b/internal/mithril-persistence/Cargo.toml index e5a8801d7db..c0c5b03e5ac 100644 --- a/internal/mithril-persistence/Cargo.toml +++ b/internal/mithril-persistence/Cargo.toml @@ -12,18 +12,18 @@ repository = { workspace = true } crate-type = ["lib", "cdylib", "staticlib"] [dependencies] -anyhow = "1.0.86" -async-trait = "0.1.82" +anyhow = "1.0.89" +async-trait = "0.1.83" chrono = { version = "0.4.38", features = ["serde"] } hex = "0.4.3" mithril-common = { path = "../../mithril-common", features = ["fs"] } semver = "1.0.23" -serde = { version = "1.0.209", features = ["derive"] } +serde = { version = "1.0.210", features = ["derive"] } serde_json = "1.0.128" sha2 = "0.10.8" slog = "2.7.0" sqlite = { version = "0.36.1", features = ["bundled"] } -thiserror = "1.0.63" +thiserror = "1.0.64" tokio = { version = "1.40.0", features = ["sync"] } [dev-dependencies] diff --git a/mithril-aggregator/Cargo.toml b/mithril-aggregator/Cargo.toml index 2fb7be2e5c1..0c51eb00cb1 100644 --- a/mithril-aggregator/Cargo.toml +++ b/mithril-aggregator/Cargo.toml @@ -18,13 +18,13 @@ name = "cardano_transactions_get" harness = false [dependencies] -anyhow = "1.0.86" -async-trait = "0.1.82" +anyhow = "1.0.89" +async-trait = "0.1.83" chrono = { version = "0.4.38", features = ["serde"] } -clap = { version = "4.5.17", features = ["derive", "env", "cargo"] } +clap = { version = "4.5.20", features = ["derive", "env", "cargo"] } cloud-storage = "0.11.1" config = "0.14.0" -flate2 = "1.0.33" +flate2 = "1.0.34" hex = "0.4.3" mithril-common = { path = "../mithril-common", features = ["full"] } mithril-doc = { path = "../internal/mithril-doc" } @@ -32,9 +32,9 @@ mithril-persistence = { path = "../internal/mithril-persistence" } openssl = { version = "0.10.66", features = ["vendored"], optional = true } openssl-probe = { version = "0.1.5", optional = true } rayon = "1.10.0" -reqwest = { version = "0.12.7", features = ["json"] } +reqwest = { version = "0.12.8", features = ["json"] } semver = "1.0.23" -serde = { version = "1.0.209", features = ["derive"] } +serde = { version = "1.0.210", features = ["derive"] } serde_json = "1.0.128" serde_yaml = "0.9.34" sha2 = "0.10.8" @@ -45,8 +45,8 @@ slog = { version = "2.7.0", features = [ slog-async = "2.8.0" slog-bunyan = "2.5.0" sqlite = { version = "0.36.1", features = ["bundled"] } -tar = "0.4.41" -thiserror = "1.0.63" +tar = "0.4.42" +thiserror = "1.0.64" tokio = { version = "1.40.0", features = ["full"] } tokio-util = { version = "0.7.12", features = ["codec"] } typetag = "0.2.18" @@ -71,7 +71,7 @@ mithril-common = { path = "../mithril-common", features = [ mockall = "0.13.0" slog-scope = "4.4.0" slog-term = "2.9.1" -tempfile = "3.12.0" +tempfile = "3.13.0" [features] default = ["jemallocator"] diff --git a/mithril-client-cli/Cargo.toml b/mithril-client-cli/Cargo.toml index a0f26572c7f..f38718e6169 100644 --- a/mithril-client-cli/Cargo.toml +++ b/mithril-client-cli/Cargo.toml @@ -22,21 +22,21 @@ Run `mithril-client --help` to display the available options.""" assets = [["../target/release/mithril-client", "usr/bin/", "755"]] [dependencies] -anyhow = "1.0.86" -async-trait = "0.1.82" +anyhow = "1.0.89" +async-trait = "0.1.83" chrono = { version = "0.4.38", features = ["serde"] } -clap = { version = "4.5.17", features = ["derive", "env"] } +clap = { version = "4.5.20", features = ["derive", "env"] } cli-table = "0.4.9" config = "0.14.0" fs2 = "0.4.3" -futures = "0.3.30" +futures = "0.3.31" human_bytes = { version = "0.4.3", features = ["fast"] } indicatif = { version = "0.17.8", features = ["tokio"] } mithril-client = { path = "../mithril-client", features = ["fs", "unstable"] } mithril-doc = { path = "../internal/mithril-doc" } openssl = { version = "0.10.66", features = ["vendored"], optional = true } openssl-probe = { version = "0.1.5", optional = true } -serde = { version = "1.0.209", features = ["derive"] } +serde = { version = "1.0.210", features = ["derive"] } serde_json = "1.0.128" slog = { version = "2.7.0", features = [ "max_level_trace", @@ -46,7 +46,7 @@ slog-async = "2.8.0" slog-bunyan = "2.5.0" slog-scope = "4.4.0" slog-term = "2.9.1" -thiserror = "1.0.63" +thiserror = "1.0.64" tokio = { version = "1.40.0", features = ["full"] } [dev-dependencies] diff --git a/mithril-client-wasm/Cargo.toml b/mithril-client-wasm/Cargo.toml index 3f5bc7a30c8..bd53ad7eb00 100644 --- a/mithril-client-wasm/Cargo.toml +++ b/mithril-client-wasm/Cargo.toml @@ -13,17 +13,17 @@ categories = ["cryptography"] crate-type = ["cdylib"] [dependencies] -async-trait = "0.1.82" -futures = "0.3.30" +async-trait = "0.1.83" +futures = "0.3.31" mithril-client = { path = "../mithril-client", features = ["unstable"] } -serde = { version = "1.0.209", features = ["derive"] } +serde = { version = "1.0.210", features = ["derive"] } serde-wasm-bindgen = "0.6.5" -wasm-bindgen = "0.2.93" -wasm-bindgen-futures = "0.4.43" -web-sys = { version = "0.3.70", features = ["BroadcastChannel"] } +wasm-bindgen = "0.2.95" +wasm-bindgen-futures = "0.4.45" +web-sys = { version = "0.3.72", features = ["BroadcastChannel"] } [dev-dependencies] -wasm-bindgen-test = "0.3.43" +wasm-bindgen-test = "0.3.45" [build-dependencies] mithril-build-script = { path = "../internal/mithril-build-script" } diff --git a/mithril-client/Cargo.toml b/mithril-client/Cargo.toml index 15352fa85be..0dc996aa5dc 100644 --- a/mithril-client/Cargo.toml +++ b/mithril-client/Cargo.toml @@ -24,14 +24,14 @@ path = "tests/cardano_transaction_proof.rs" required-features = ["unstable"] [dependencies] -anyhow = "1.0.86" +anyhow = "1.0.89" async-recursion = "1.1.1" -async-trait = "0.1.82" +async-trait = "0.1.83" chrono = { version = "0.4.38", features = ["serde"] } -flate2 = { version = "1.0.33", optional = true } +flate2 = { version = "1.0.34", optional = true } flume = { version = "0.11.0", optional = true } -futures = "0.3.30" -reqwest = { version = "0.12.7", default-features = false, features = [ +futures = "0.3.31" +reqwest = { version = "0.12.8", default-features = false, features = [ "charset", "http2", "macos-system-configuration", @@ -39,12 +39,12 @@ reqwest = { version = "0.12.7", default-features = false, features = [ "stream", ] } semver = "1.0.23" -serde = { version = "1.0.209", features = ["derive"] } +serde = { version = "1.0.210", features = ["derive"] } serde_json = "1.0.128" slog = "2.7.0" strum = { version = "0.26.3", features = ["derive"] } -tar = { version = "0.4.41", optional = true } -thiserror = "1.0.63" +tar = { version = "0.4.42", optional = true } +thiserror = "1.0.64" tokio = { version = "1.40.0", features = ["sync"] } uuid = { version = "1.10.0", features = ["v4"] } zstd = { version = "0.13.2", optional = true } @@ -57,7 +57,7 @@ mithril-common = { path = "../mithril-common", version = "=0.4", default-feature [target.'cfg(target_family = "wasm")'.dependencies] getrandom = { version = "0.2.15", features = ["js"] } mithril-common = { path = "../mithril-common", version = "=0.4", default-features = false } -reqwest = { version = "0.12.7", default-features = false, features = [ +reqwest = { version = "0.12.8", default-features = false, features = [ "charset", "http2", "macos-system-configuration", diff --git a/mithril-common/Cargo.toml b/mithril-common/Cargo.toml index 99f12801e4f..27ca755e5f5 100644 --- a/mithril-common/Cargo.toml +++ b/mithril-common/Cargo.toml @@ -30,8 +30,8 @@ name = "merkle_map" harness = false [dependencies] -anyhow = "1.0.86" -async-trait = "0.1.82" +anyhow = "1.0.89" +async-trait = "0.1.83" bech32 = "0.11.0" blake2 = "0.10.6" chrono = { version = "0.4.38", features = ["serde"] } @@ -42,47 +42,47 @@ ed25519-dalek = { version = "2.1.1", features = ["rand_core", "serde"] } fixed = "1.28.0" glob = { version = "0.3.1", optional = true } hex = "0.4.3" -jsonschema = { version = "0.18.1", optional = true } +jsonschema = { version = "0.23.0", optional = true } kes-summed-ed25519 = { version = "0.2.1", features = [ "serde_enabled", "sk_clone_enabled", ] } mithril-stm = { path = "../mithril-stm", version = "0.3", default-features = false } nom = "7.1.3" -pallas-addresses = { version = "0.30.1", optional = true } -pallas-codec = { version = "0.30.1", optional = true } -pallas-hardano = { version = "0.30.1", optional = true } -pallas-network = { version = "0.30.1", optional = true } -pallas-primitives = { version = "0.30.1", optional = true } -pallas-traverse = { version = "0.30.1", optional = true } +pallas-addresses = { version = "0.30.2", optional = true } +pallas-codec = { version = "0.30.2", optional = true } +pallas-hardano = { version = "0.30.2", optional = true } +pallas-network = { version = "0.30.2", optional = true } +pallas-primitives = { version = "0.30.2", optional = true } +pallas-traverse = { version = "0.30.2", optional = true } rand_chacha = "0.3.1" rand_core = "0.6.4" rayon = "1.10.0" -reqwest = { version = "0.12.7", optional = true } +reqwest = { version = "0.12.8", optional = true } semver = "1.0.23" -serde = { version = "1.0.209", features = ["derive"] } +serde = { version = "1.0.210", features = ["derive"] } serde_bytes = "0.11.15" serde_json = "1.0.128" -serde_with = "3.9.0" +serde_with = "3.11.0" serde_yaml = "0.9.34" sha2 = "0.10.8" slog = "2.7.0" strum = { version = "0.26.3", features = ["derive"] } -thiserror = "1.0.63" +thiserror = "1.0.64" tokio = { version = "1.40.0", features = ["io-util", "rt", "sync"] } typetag = "0.2.18" walkdir = "2.5.0" warp = { version = "0.3.7", optional = true } [target.'cfg(target_family = "wasm")'.dependencies] -wasm-bindgen = "0.2.93" +wasm-bindgen = "0.2.95" [dev-dependencies] criterion = { version = "0.5.1", features = ["html_reports", "async_tokio"] } mockall = "0.13.0" -pallas-crypto = "0.30.1" +pallas-crypto = "0.30.2" rand_core = { version = "0.6.4", features = ["getrandom"] } -reqwest = { version = "0.12.7", features = ["json"] } +reqwest = { version = "0.12.8", features = ["json"] } slog-async = "2.8.0" slog-term = "2.9.1" tokio = { version = "1.40.0", features = ["macros", "rt-multi-thread", "time"] } diff --git a/mithril-relay/Cargo.toml b/mithril-relay/Cargo.toml index b64e576568b..c46745759b3 100644 --- a/mithril-relay/Cargo.toml +++ b/mithril-relay/Cargo.toml @@ -11,8 +11,8 @@ repository = { workspace = true } # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -anyhow = "1.0.86" -clap = { version = "4.5.17", features = ["derive", "env"] } +anyhow = "1.0.89" +clap = { version = "4.5.20", features = ["derive", "env"] } config = "0.14.0" libp2p = { version = "0.54.1", features = [ "tokio", @@ -33,8 +33,8 @@ libp2p = { version = "0.54.1", features = [ ] } mithril-common = { path = "../mithril-common", features = ["full"] } mithril-doc = { path = "../internal/mithril-doc" } -reqwest = { version = "0.12.7", features = ["json"] } -serde = { version = "1.0.209", features = ["derive"] } +reqwest = { version = "0.12.8", features = ["json"] } +serde = { version = "1.0.210", features = ["derive"] } serde_json = "1.0.128" serde_yaml = "0.9.34" slog = { version = "2.7.0", features = [ @@ -45,6 +45,6 @@ slog-async = "2.8.0" slog-bunyan = "2.5.0" slog-scope = "4.4.0" slog-term = "2.9.1" -thiserror = "1.0.63" +thiserror = "1.0.64" tokio = { version = "1.40.0", features = ["full"] } warp = "0.3.7" diff --git a/mithril-signer/Cargo.toml b/mithril-signer/Cargo.toml index 5627ee7e578..d127ba76fe1 100644 --- a/mithril-signer/Cargo.toml +++ b/mithril-signer/Cargo.toml @@ -14,11 +14,11 @@ name = "mktree_store_sqlite" harness = false [dependencies] -anyhow = "1.0.86" -async-trait = "0.1.82" -axum = "0.7.5" +anyhow = "1.0.89" +async-trait = "0.1.83" +axum = "0.7.7" chrono = { version = "0.4.38", features = ["serde"] } -clap = { version = "4.5.17", features = ["derive", "env"] } +clap = { version = "4.5.20", features = ["derive", "env"] } config = "0.14.0" hex = "0.4.3" mithril-common = { path = "../mithril-common", features = ["full"] } @@ -29,8 +29,8 @@ openssl-probe = { version = "0.1.5", optional = true } prometheus = "0.13.4" rand_chacha = "0.3.1" rand_core = "0.6.4" -reqwest = { version = "0.12.7", features = ["json", "stream"] } -serde = { version = "1.0.209", features = ["derive"] } +reqwest = { version = "0.12.8", features = ["json", "stream"] } +serde = { version = "1.0.210", features = ["derive"] } serde_json = "1.0.128" slog = { version = "2.7.0", features = [ "max_level_trace", @@ -39,7 +39,7 @@ slog = { version = "2.7.0", features = [ slog-async = "2.8.0" slog-bunyan = "2.5.0" sqlite = { version = "0.36.1", features = ["bundled"] } -thiserror = "1.0.63" +thiserror = "1.0.64" tokio = { version = "1.40.0", features = ["full"] } [target.'cfg(not(target_env = "msvc"))'.dependencies] diff --git a/mithril-stm/Cargo.toml b/mithril-stm/Cargo.toml index 749cf070d3d..db1d9312d89 100644 --- a/mithril-stm/Cargo.toml +++ b/mithril-stm/Cargo.toml @@ -20,12 +20,12 @@ blst = { version = "0.3.13", features = ["portable"] } digest = { version = "0.10.7", features = ["alloc"] } rand_core = "0.6.4" rayon = "1.10.0" -serde = { version = "1.0.209", features = ["rc", "derive"] } -thiserror = "1.0.63" +serde = { version = "1.0.210", features = ["rc", "derive"] } +thiserror = "1.0.64" [target.'cfg(not(any(target_family = "wasm", windows)))'.dependencies] # only unix supports the rug backend -rug = { version = "1.26.0", optional = true } +rug = { version = "1.26.1", optional = true } num-bigint = { version = "0.4.6", optional = true } num-rational = { version = "0.4.2", optional = true } num-traits = { version = "0.2.19", optional = true } diff --git a/mithril-test-lab/mithril-aggregator-fake/Cargo.toml b/mithril-test-lab/mithril-aggregator-fake/Cargo.toml index acb7e8b8fbe..f7cfe828a8d 100644 --- a/mithril-test-lab/mithril-aggregator-fake/Cargo.toml +++ b/mithril-test-lab/mithril-aggregator-fake/Cargo.toml @@ -10,17 +10,17 @@ license = { workspace = true } repository = { workspace = true } [dependencies] -anyhow = "1.0.86" -axum = { version = "0.7.5", features = ["tokio", "http1"] } -clap = { version = "4.5.17", features = ["derive"] } -clap_derive = "4.5.13" -futures = "0.3.30" -serde = { version = "1.0.209", features = ["derive"] } +anyhow = "1.0.89" +axum = { version = "0.7.7", features = ["tokio", "http1"] } +clap = { version = "4.5.20", features = ["derive"] } +clap_derive = "4.5.18" +futures = "0.3.31" +serde = { version = "1.0.210", features = ["derive"] } serde_json = "1.0.128" signal-hook = "0.3.17" signal-hook-tokio = { version = "0.3.1", features = ["futures-v0_3"] } tokio = { version = "1.40.0", features = ["full"] } -tower-http = { version = "0.5.2", features = ["trace", "cors"] } +tower-http = { version = "0.6.1", features = ["trace", "cors"] } tracing = "0.1.40" tracing-subscriber = "0.3.18" @@ -29,7 +29,7 @@ mithril-common = { "path" = "../../mithril-common", features = [ "test_tools", "random", ] } -reqwest = "0.12.7" +reqwest = "0.12.8" warp = "0.3.7" [build-dependencies] diff --git a/mithril-test-lab/mithril-end-to-end/Cargo.toml b/mithril-test-lab/mithril-end-to-end/Cargo.toml index b34aaad2434..11584e260c3 100644 --- a/mithril-test-lab/mithril-end-to-end/Cargo.toml +++ b/mithril-test-lab/mithril-end-to-end/Cargo.toml @@ -15,17 +15,17 @@ test = false bench = false [dependencies] -anyhow = "1.0.86" +anyhow = "1.0.89" async-recursion = "1.1.1" -async-trait = "0.1.82" -clap = { version = "4.5.17", features = ["derive"] } +async-trait = "0.1.83" +clap = { version = "4.5.20", features = ["derive"] } glob = "0.3.1" hex = "0.4.3" indicatif = { version = "0.17.8", features = ["tokio"] } mithril-common = { path = "../../mithril-common", features = ["full"] } mithril-doc = { path = "../../internal/mithril-doc" } -reqwest = { version = "0.12.7", features = ["json"] } -serde = { version = "1.0.209", features = ["derive"] } +reqwest = { version = "0.12.8", features = ["json"] } +serde = { version = "1.0.210", features = ["derive"] } serde_json = "1.0.128" serde_yaml = "0.9.34" slog = { version = "2.7.0", features = [ @@ -35,7 +35,7 @@ slog = { version = "2.7.0", features = [ slog-async = "2.8.0" slog-scope = "4.4.0" slog-term = "2.9.1" -thiserror = "1.0.63" +thiserror = "1.0.64" tokio = { version = "1.40.0", features = ["full"] } tokio-util = { version = "0.7.12", features = ["codec"] } From 3435afef049160856aaf05c4ee504d406d7560f6 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Mon, 14 Oct 2024 17:11:53 +0200 Subject: [PATCH 269/274] fix: clippy warnings with 'jsonschema::JSONSchema' Which has been replaced by 'jsonschema::Validator'. --- mithril-common/src/test_utils/apispec.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mithril-common/src/test_utils/apispec.rs b/mithril-common/src/test_utils/apispec.rs index 842ed9f325b..4e3efb921d0 100644 --- a/mithril-common/src/test_utils/apispec.rs +++ b/mithril-common/src/test_utils/apispec.rs @@ -1,7 +1,7 @@ //! Tools to helps validate conformity to an OpenAPI specification use glob::glob; -use jsonschema::JSONSchema; +use jsonschema::Validator; use reqwest::Url; use serde::Serialize; use serde_json::{json, Value, Value::Null}; @@ -218,7 +218,7 @@ impl<'a> APISpec<'a> { let components = self.openapi["components"].clone(); schema.insert(String::from("components"), components); - let validator = JSONSchema::compile(&json!(schema)).unwrap(); + let validator = Validator::new(&json!(schema)).unwrap(); match validator.validate(value).map_err(|errs| { errs.into_iter() .map(|e| e.to_string()) From 0c43d41fa7e91f24c21c32585baa4321352426aa Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Mon, 14 Oct 2024 17:08:59 +0200 Subject: [PATCH 270/274] chore: bump crates versions --- Cargo.lock | 38 +++++++++---------- demo/protocol-demo/Cargo.toml | 2 +- .../Cargo.toml | 2 +- .../client-cardano-transaction/Cargo.toml | 2 +- .../Cargo.toml | 2 +- examples/client-snapshot/Cargo.toml | 2 +- internal/mithril-build-script/Cargo.toml | 2 +- internal/mithril-doc-derive/Cargo.toml | 2 +- internal/mithril-doc/Cargo.toml | 2 +- internal/mithril-persistence/Cargo.toml | 2 +- mithril-aggregator/Cargo.toml | 2 +- mithril-client-cli/Cargo.toml | 2 +- mithril-client-wasm/Cargo.toml | 2 +- mithril-client/Cargo.toml | 2 +- mithril-common/Cargo.toml | 2 +- mithril-relay/Cargo.toml | 2 +- mithril-signer/Cargo.toml | 2 +- mithril-stm/Cargo.toml | 2 +- .../mithril-aggregator-fake/Cargo.toml | 2 +- .../mithril-end-to-end/Cargo.toml | 2 +- 20 files changed, 38 insertions(+), 38 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6daa0c5ad2d..2b664ddc0d4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -925,7 +925,7 @@ dependencies = [ [[package]] name = "client-cardano-stake-distribution" -version = "0.1.1" +version = "0.1.2" dependencies = [ "anyhow", "clap", @@ -938,7 +938,7 @@ dependencies = [ [[package]] name = "client-cardano-transaction" -version = "0.1.12" +version = "0.1.13" dependencies = [ "anyhow", "clap", @@ -951,7 +951,7 @@ dependencies = [ [[package]] name = "client-mithril-stake-distribution" -version = "0.2.0" +version = "0.2.1" dependencies = [ "anyhow", "clap", @@ -964,7 +964,7 @@ dependencies = [ [[package]] name = "client-snapshot" -version = "0.1.16" +version = "0.1.17" dependencies = [ "anyhow", "async-trait", @@ -3552,7 +3552,7 @@ dependencies = [ [[package]] name = "mithril-aggregator" -version = "0.5.81" +version = "0.5.82" dependencies = [ "anyhow", "async-trait", @@ -3597,7 +3597,7 @@ dependencies = [ [[package]] name = "mithril-aggregator-fake" -version = "0.3.9" +version = "0.3.10" dependencies = [ "anyhow", "axum", @@ -3620,7 +3620,7 @@ dependencies = [ [[package]] name = "mithril-build-script" -version = "0.2.10" +version = "0.2.11" dependencies = [ "semver", "serde_json", @@ -3629,7 +3629,7 @@ dependencies = [ [[package]] name = "mithril-client" -version = "0.9.1" +version = "0.9.2" dependencies = [ "anyhow", "async-recursion", @@ -3662,7 +3662,7 @@ dependencies = [ [[package]] name = "mithril-client-cli" -version = "0.9.14" +version = "0.9.15" dependencies = [ "anyhow", "async-trait", @@ -3692,7 +3692,7 @@ dependencies = [ [[package]] name = "mithril-client-wasm" -version = "0.5.1" +version = "0.5.2" dependencies = [ "async-trait", "futures", @@ -3708,7 +3708,7 @@ dependencies = [ [[package]] name = "mithril-common" -version = "0.4.68" +version = "0.4.69" dependencies = [ "anyhow", "async-trait", @@ -3761,7 +3761,7 @@ dependencies = [ [[package]] name = "mithril-doc" -version = "0.1.10" +version = "0.1.11" dependencies = [ "clap", "config", @@ -3771,7 +3771,7 @@ dependencies = [ [[package]] name = "mithril-doc-derive" -version = "0.1.9" +version = "0.1.10" dependencies = [ "quote", "syn 2.0.79", @@ -3779,7 +3779,7 @@ dependencies = [ [[package]] name = "mithril-end-to-end" -version = "0.4.39" +version = "0.4.40" dependencies = [ "anyhow", "async-recursion", @@ -3805,7 +3805,7 @@ dependencies = [ [[package]] name = "mithril-persistence" -version = "0.2.28" +version = "0.2.29" dependencies = [ "anyhow", "async-trait", @@ -3825,7 +3825,7 @@ dependencies = [ [[package]] name = "mithril-relay" -version = "0.1.24" +version = "0.1.25" dependencies = [ "anyhow", "clap", @@ -3849,7 +3849,7 @@ dependencies = [ [[package]] name = "mithril-signer" -version = "0.2.197" +version = "0.2.198" dependencies = [ "anyhow", "async-trait", @@ -3887,7 +3887,7 @@ dependencies = [ [[package]] name = "mithril-stm" -version = "0.3.29" +version = "0.3.30" dependencies = [ "bincode", "blake2 0.10.6", @@ -3910,7 +3910,7 @@ dependencies = [ [[package]] name = "mithrildemo" -version = "0.1.42" +version = "0.1.43" dependencies = [ "base64 0.22.1", "blake2 0.10.6", diff --git a/demo/protocol-demo/Cargo.toml b/demo/protocol-demo/Cargo.toml index 04ba4d0dc96..01e815d63ba 100644 --- a/demo/protocol-demo/Cargo.toml +++ b/demo/protocol-demo/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithrildemo" -version = "0.1.42" +version = "0.1.43" authors = { workspace = true } edition = { workspace = true } documentation = { workspace = true } diff --git a/examples/client-cardano-stake-distribution/Cargo.toml b/examples/client-cardano-stake-distribution/Cargo.toml index a18d7800f1e..75980e05d28 100644 --- a/examples/client-cardano-stake-distribution/Cargo.toml +++ b/examples/client-cardano-stake-distribution/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "client-cardano-stake-distribution" description = "Mithril client cardano stake distribution example" -version = "0.1.1" +version = "0.1.2" authors = ["dev@iohk.io", "mithril-dev@iohk.io"] documentation = "https://mithril.network/doc" edition = "2021" diff --git a/examples/client-cardano-transaction/Cargo.toml b/examples/client-cardano-transaction/Cargo.toml index 88269574aa4..83d6645f9d5 100644 --- a/examples/client-cardano-transaction/Cargo.toml +++ b/examples/client-cardano-transaction/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "client-cardano-transaction" description = "Mithril client cardano-transaction example" -version = "0.1.12" +version = "0.1.13" authors = ["dev@iohk.io", "mithril-dev@iohk.io"] documentation = "https://mithril.network/doc" edition = "2021" diff --git a/examples/client-mithril-stake-distribution/Cargo.toml b/examples/client-mithril-stake-distribution/Cargo.toml index f637122aea2..8d50d7b1557 100644 --- a/examples/client-mithril-stake-distribution/Cargo.toml +++ b/examples/client-mithril-stake-distribution/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "client-mithril-stake-distribution" description = "Mithril client stake distribution example" -version = "0.2.0" +version = "0.2.1" authors = ["dev@iohk.io", "mithril-dev@iohk.io"] documentation = "https://mithril.network/doc" edition = "2021" diff --git a/examples/client-snapshot/Cargo.toml b/examples/client-snapshot/Cargo.toml index 2af35f94e79..8d2c6dadbaa 100644 --- a/examples/client-snapshot/Cargo.toml +++ b/examples/client-snapshot/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "client-snapshot" description = "Mithril client snapshot example" -version = "0.1.16" +version = "0.1.17" authors = ["dev@iohk.io", "mithril-dev@iohk.io"] documentation = "https://mithril.network/doc" edition = "2021" diff --git a/internal/mithril-build-script/Cargo.toml b/internal/mithril-build-script/Cargo.toml index 1db9130dd71..299761c97fa 100644 --- a/internal/mithril-build-script/Cargo.toml +++ b/internal/mithril-build-script/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-build-script" -version = "0.2.10" +version = "0.2.11" description = "A toolbox for Mithril crates build scripts" authors = { workspace = true } edition = { workspace = true } diff --git a/internal/mithril-doc-derive/Cargo.toml b/internal/mithril-doc-derive/Cargo.toml index e36a3410edd..15d32e407d5 100644 --- a/internal/mithril-doc-derive/Cargo.toml +++ b/internal/mithril-doc-derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-doc-derive" -version = "0.1.9" +version = "0.1.10" description = "An internal macro to support documentation generation." authors = { workspace = true } edition = { workspace = true } diff --git a/internal/mithril-doc/Cargo.toml b/internal/mithril-doc/Cargo.toml index 99efd0030a0..8640db2af41 100644 --- a/internal/mithril-doc/Cargo.toml +++ b/internal/mithril-doc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-doc" -version = "0.1.10" +version = "0.1.11" description = "An internal crate to generate documentation." authors = { workspace = true } edition = { workspace = true } diff --git a/internal/mithril-persistence/Cargo.toml b/internal/mithril-persistence/Cargo.toml index c0c5b03e5ac..b8c3ee7f2d9 100644 --- a/internal/mithril-persistence/Cargo.toml +++ b/internal/mithril-persistence/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-persistence" -version = "0.2.28" +version = "0.2.29" description = "Common types, interfaces, and utilities to persist data for Mithril nodes." authors = { workspace = true } edition = { workspace = true } diff --git a/mithril-aggregator/Cargo.toml b/mithril-aggregator/Cargo.toml index 0c51eb00cb1..8f849ae5f78 100644 --- a/mithril-aggregator/Cargo.toml +++ b/mithril-aggregator/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-aggregator" -version = "0.5.81" +version = "0.5.82" description = "A Mithril Aggregator server" authors = { workspace = true } edition = { workspace = true } diff --git a/mithril-client-cli/Cargo.toml b/mithril-client-cli/Cargo.toml index f38718e6169..ba8ec34102d 100644 --- a/mithril-client-cli/Cargo.toml +++ b/mithril-client-cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-client-cli" -version = "0.9.14" +version = "0.9.15" description = "A Mithril Client" authors = { workspace = true } edition = { workspace = true } diff --git a/mithril-client-wasm/Cargo.toml b/mithril-client-wasm/Cargo.toml index bd53ad7eb00..84a2f02fe3e 100644 --- a/mithril-client-wasm/Cargo.toml +++ b/mithril-client-wasm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-client-wasm" -version = "0.5.1" +version = "0.5.2" description = "Mithril client WASM" authors = { workspace = true } edition = { workspace = true } diff --git a/mithril-client/Cargo.toml b/mithril-client/Cargo.toml index 0dc996aa5dc..97d63bc5c8f 100644 --- a/mithril-client/Cargo.toml +++ b/mithril-client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-client" -version = "0.9.1" +version = "0.9.2" description = "Mithril client library" authors = { workspace = true } edition = { workspace = true } diff --git a/mithril-common/Cargo.toml b/mithril-common/Cargo.toml index 27ca755e5f5..e50dcc770a7 100644 --- a/mithril-common/Cargo.toml +++ b/mithril-common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-common" -version = "0.4.68" +version = "0.4.69" description = "Common types, interfaces, and utilities for Mithril nodes." authors = { workspace = true } edition = { workspace = true } diff --git a/mithril-relay/Cargo.toml b/mithril-relay/Cargo.toml index c46745759b3..14dff41fb96 100644 --- a/mithril-relay/Cargo.toml +++ b/mithril-relay/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-relay" -version = "0.1.24" +version = "0.1.25" description = "A Mithril relay" authors = { workspace = true } edition = { workspace = true } diff --git a/mithril-signer/Cargo.toml b/mithril-signer/Cargo.toml index d127ba76fe1..473a1c3fb7f 100644 --- a/mithril-signer/Cargo.toml +++ b/mithril-signer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-signer" -version = "0.2.197" +version = "0.2.198" description = "A Mithril Signer" authors = { workspace = true } edition = { workspace = true } diff --git a/mithril-stm/Cargo.toml b/mithril-stm/Cargo.toml index db1d9312d89..accdd463853 100644 --- a/mithril-stm/Cargo.toml +++ b/mithril-stm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-stm" -version = "0.3.29" +version = "0.3.30" edition = { workspace = true } authors = { workspace = true } homepage = { workspace = true } diff --git a/mithril-test-lab/mithril-aggregator-fake/Cargo.toml b/mithril-test-lab/mithril-aggregator-fake/Cargo.toml index f7cfe828a8d..e9ae7d88cbc 100644 --- a/mithril-test-lab/mithril-aggregator-fake/Cargo.toml +++ b/mithril-test-lab/mithril-aggregator-fake/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-aggregator-fake" -version = "0.3.9" +version = "0.3.10" description = "Mithril Fake Aggregator for client testing" authors = { workspace = true } documentation = { workspace = true } diff --git a/mithril-test-lab/mithril-end-to-end/Cargo.toml b/mithril-test-lab/mithril-end-to-end/Cargo.toml index 11584e260c3..d6870f80488 100644 --- a/mithril-test-lab/mithril-end-to-end/Cargo.toml +++ b/mithril-test-lab/mithril-end-to-end/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-end-to-end" -version = "0.4.39" +version = "0.4.40" authors = { workspace = true } edition = { workspace = true } documentation = { workspace = true } From edfe168db9eb63c8f9197f404cceaafe79447b64 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Mon, 14 Oct 2024 17:09:50 +0200 Subject: [PATCH 271/274] chore: upgrade mithril client wasm 'www' and 'www-test' dependencies By running 'make upgrade-www-deps' command. --- .../www-test/package-lock.json | 78 +++++++++---------- mithril-client-wasm/www/package-lock.json | 77 +++++++++--------- 2 files changed, 72 insertions(+), 83 deletions(-) diff --git a/mithril-client-wasm/www-test/package-lock.json b/mithril-client-wasm/www-test/package-lock.json index 9d662a9aad6..35c38c0c210 100644 --- a/mithril-client-wasm/www-test/package-lock.json +++ b/mithril-client-wasm/www-test/package-lock.json @@ -21,7 +21,7 @@ }, "../pkg": { "name": "mithril-client-wasm", - "version": "0.5.1", + "version": "0.5.2", "license": "Apache-2.0" }, "node_modules/@discoveryjs/json-ext": { @@ -645,7 +645,7 @@ } }, "node_modules/body-parser": { - "version": "1.20.2", + "version": "1.20.3", "dev": true, "license": "MIT", "dependencies": { @@ -657,7 +657,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.11.0", + "qs": "6.13.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -933,7 +933,6 @@ "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-12.0.2.tgz", "integrity": "sha512-SNwdBeHyII+rWvee/bTnAYyO8vfVdcSTud4EIb6jcZ8inLeWucJE0DnxXQBjlQ5zlteuuvooGQy3LIyGxhvlOA==", "dev": true, - "license": "MIT", "dependencies": { "fast-glob": "^3.3.2", "glob-parent": "^6.0.1", @@ -1086,7 +1085,6 @@ "resolved": "https://registry.npmjs.org/dotenv-webpack/-/dotenv-webpack-8.1.0.tgz", "integrity": "sha512-owK1JcsPkIobeqjVrk6h7jPED/W6ZpdFsMPR+5ursB7/SdgDyO+VzAU+szK8C8u3qUhtENyYnj8eyXMR5kkGag==", "dev": true, - "license": "MIT", "dependencies": { "dotenv-defaults": "^2.0.2" }, @@ -1108,7 +1106,7 @@ "license": "ISC" }, "node_modules/encodeurl": { - "version": "1.0.2", + "version": "2.0.0", "dev": true, "license": "MIT", "engines": { @@ -1236,36 +1234,36 @@ } }, "node_modules/express": { - "version": "4.19.2", + "version": "4.21.0", "dev": true, "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.2", + "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.6.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.2.0", + "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", + "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", + "path-to-regexp": "0.1.10", "proxy-addr": "~2.0.7", - "qs": "6.11.0", + "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", + "send": "0.19.0", + "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -1351,12 +1349,12 @@ } }, "node_modules/finalhandler": { - "version": "1.2.0", + "version": "1.3.1", "dev": true, "license": "MIT", "dependencies": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", @@ -1422,18 +1420,6 @@ "node": ">= 0.6" } }, - "node_modules/fsevents": { - "version": "2.3.3", - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/function-bind": { "version": "1.1.2", "dev": true, @@ -1982,9 +1968,12 @@ } }, "node_modules/merge-descriptors": { - "version": "1.0.1", + "version": "1.0.3", "dev": true, - "license": "MIT" + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/merge-stream": { "version": "2.0.0", @@ -2008,7 +1997,7 @@ } }, "node_modules/micromatch": { - "version": "4.0.7", + "version": "4.0.8", "dev": true, "license": "MIT", "dependencies": { @@ -2236,7 +2225,7 @@ "license": "MIT" }, "node_modules/path-to-regexp": { - "version": "0.1.7", + "version": "0.1.10", "dev": true, "license": "MIT" }, @@ -2326,11 +2315,11 @@ } }, "node_modules/qs": { - "version": "6.11.0", + "version": "6.13.0", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" }, "engines": { "node": ">=0.6" @@ -2589,7 +2578,7 @@ } }, "node_modules/send": { - "version": "0.18.0", + "version": "0.19.0", "dev": true, "license": "MIT", "dependencies": { @@ -2611,6 +2600,14 @@ "node": ">= 0.8.0" } }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/send/node_modules/ms": { "version": "2.1.3", "dev": true, @@ -2682,14 +2679,14 @@ } }, "node_modules/serve-static": { - "version": "1.15.0", + "version": "1.16.2", "dev": true, "license": "MIT", "dependencies": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" + "send": "0.19.0" }, "engines": { "node": ">= 0.8.0" @@ -3205,7 +3202,6 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.95.0.tgz", "integrity": "sha512-2t3XstrKULz41MNMBF+cJ97TyHdyQ8HCt//pqErqDvNjU9YQBnZxIHa11VXsi7F3mb5/aO2tuDxdeTPdU7xu9Q==", "dev": true, - "license": "MIT", "dependencies": { "@types/estree": "^1.0.5", "@webassemblyjs/ast": "^1.12.1", @@ -3252,7 +3248,6 @@ "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", "dev": true, - "license": "MIT", "dependencies": { "@discoveryjs/json-ext": "^0.5.0", "@webpack-cli/configtest": "^2.1.1", @@ -3334,7 +3329,6 @@ "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.1.0.tgz", "integrity": "sha512-aQpaN81X6tXie1FoOB7xlMfCsN19pSvRAeYUHOdFWOlhpQ/LlbfTqYwwmEDFV0h8GGuqmCmKmT+pxcUV/Nt2gQ==", "dev": true, - "license": "MIT", "dependencies": { "@types/bonjour": "^3.5.13", "@types/connect-history-api-fallback": "^1.5.4", diff --git a/mithril-client-wasm/www/package-lock.json b/mithril-client-wasm/www/package-lock.json index f3ff81484a6..f735a1f974c 100644 --- a/mithril-client-wasm/www/package-lock.json +++ b/mithril-client-wasm/www/package-lock.json @@ -20,7 +20,7 @@ }, "../pkg": { "name": "mithril-client-wasm", - "version": "0.5.1", + "version": "0.5.2", "license": "Apache-2.0" }, "node_modules/@discoveryjs/json-ext": { @@ -644,7 +644,7 @@ } }, "node_modules/body-parser": { - "version": "1.20.2", + "version": "1.20.3", "dev": true, "license": "MIT", "dependencies": { @@ -656,7 +656,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.11.0", + "qs": "6.13.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -932,7 +932,6 @@ "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-12.0.2.tgz", "integrity": "sha512-SNwdBeHyII+rWvee/bTnAYyO8vfVdcSTud4EIb6jcZ8inLeWucJE0DnxXQBjlQ5zlteuuvooGQy3LIyGxhvlOA==", "dev": true, - "license": "MIT", "dependencies": { "fast-glob": "^3.3.2", "glob-parent": "^6.0.1", @@ -1075,7 +1074,7 @@ "license": "ISC" }, "node_modules/encodeurl": { - "version": "1.0.2", + "version": "2.0.0", "dev": true, "license": "MIT", "engines": { @@ -1203,36 +1202,36 @@ } }, "node_modules/express": { - "version": "4.19.2", + "version": "4.21.0", "dev": true, "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.2", + "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.6.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.2.0", + "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", + "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", + "path-to-regexp": "0.1.10", "proxy-addr": "~2.0.7", - "qs": "6.11.0", + "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", + "send": "0.19.0", + "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -1318,12 +1317,12 @@ } }, "node_modules/finalhandler": { - "version": "1.2.0", + "version": "1.3.1", "dev": true, "license": "MIT", "dependencies": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", @@ -1389,18 +1388,6 @@ "node": ">= 0.6" } }, - "node_modules/fsevents": { - "version": "2.3.3", - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/function-bind": { "version": "1.1.2", "dev": true, @@ -1949,9 +1936,12 @@ } }, "node_modules/merge-descriptors": { - "version": "1.0.1", + "version": "1.0.3", "dev": true, - "license": "MIT" + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/merge-stream": { "version": "2.0.0", @@ -1975,7 +1965,7 @@ } }, "node_modules/micromatch": { - "version": "4.0.7", + "version": "4.0.8", "dev": true, "license": "MIT", "dependencies": { @@ -2203,7 +2193,7 @@ "license": "MIT" }, "node_modules/path-to-regexp": { - "version": "0.1.7", + "version": "0.1.10", "dev": true, "license": "MIT" }, @@ -2293,11 +2283,11 @@ } }, "node_modules/qs": { - "version": "6.11.0", + "version": "6.13.0", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" }, "engines": { "node": ">=0.6" @@ -2556,7 +2546,7 @@ } }, "node_modules/send": { - "version": "0.18.0", + "version": "0.19.0", "dev": true, "license": "MIT", "dependencies": { @@ -2578,6 +2568,14 @@ "node": ">= 0.8.0" } }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/send/node_modules/ms": { "version": "2.1.3", "dev": true, @@ -2649,14 +2647,14 @@ } }, "node_modules/serve-static": { - "version": "1.15.0", + "version": "1.16.2", "dev": true, "license": "MIT", "dependencies": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" + "send": "0.19.0" }, "engines": { "node": ">= 0.8.0" @@ -3172,7 +3170,6 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.95.0.tgz", "integrity": "sha512-2t3XstrKULz41MNMBF+cJ97TyHdyQ8HCt//pqErqDvNjU9YQBnZxIHa11VXsi7F3mb5/aO2tuDxdeTPdU7xu9Q==", "dev": true, - "license": "MIT", "dependencies": { "@types/estree": "^1.0.5", "@webassemblyjs/ast": "^1.12.1", @@ -3219,7 +3216,6 @@ "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", "dev": true, - "license": "MIT", "dependencies": { "@discoveryjs/json-ext": "^0.5.0", "@webpack-cli/configtest": "^2.1.1", @@ -3301,7 +3297,6 @@ "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.1.0.tgz", "integrity": "sha512-aQpaN81X6tXie1FoOB7xlMfCsN19pSvRAeYUHOdFWOlhpQ/LlbfTqYwwmEDFV0h8GGuqmCmKmT+pxcUV/Nt2gQ==", "dev": true, - "license": "MIT", "dependencies": { "@types/bonjour": "^3.5.13", "@types/connect-history-api-fallback": "^1.5.4", From ff856fde2d9cf56a25f66152155ecb49a3bac90b Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Mon, 14 Oct 2024 17:09:59 +0200 Subject: [PATCH 272/274] chore: upgrade explorer dependencies By running 'make upgrade' command. --- mithril-explorer/package-lock.json | 2371 ++++++++++++++++------------ 1 file changed, 1366 insertions(+), 1005 deletions(-) diff --git a/mithril-explorer/package-lock.json b/mithril-explorer/package-lock.json index 3448878d241..da6b321e040 100644 --- a/mithril-explorer/package-lock.json +++ b/mithril-explorer/package-lock.json @@ -36,9 +36,17 @@ }, "../mithril-client-wasm/pkg": { "name": "mithril-client-wasm", - "version": "0.5.1", + "version": "0.5.2", "license": "Apache-2.0" }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@adobe/css-tools": { "version": "4.4.0", "dev": true, @@ -57,19 +65,83 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.25.7", + "version": "7.23.5", "dev": true, "license": "MIT", "dependencies": { - "@babel/highlight": "^7.25.7", - "picocolors": "^1.0.0" + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/compat-data": { - "version": "7.25.7", + "version": "7.23.5", "dev": true, "license": "MIT", "engines": { @@ -77,20 +149,20 @@ } }, "node_modules/@babel/core": { - "version": "7.25.7", + "version": "7.24.0", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.25.7", - "@babel/generator": "^7.25.7", - "@babel/helper-compilation-targets": "^7.25.7", - "@babel/helper-module-transforms": "^7.25.7", - "@babel/helpers": "^7.25.7", - "@babel/parser": "^7.25.7", - "@babel/template": "^7.25.7", - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.24.0", + "@babel/parser": "^7.24.0", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.0", + "@babel/types": "^7.24.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -114,27 +186,27 @@ } }, "node_modules/@babel/generator": { - "version": "7.25.7", + "version": "7.23.6", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.25.7", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^3.0.2" + "@babel/types": "^7.23.6", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.7", + "version": "7.23.6", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.25.7", - "@babel/helper-validator-option": "^7.25.7", - "browserslist": "^4.24.0", + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -150,27 +222,58 @@ "semver": "bin/semver.js" } }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-module-imports": { - "version": "7.25.7", + "version": "7.22.15", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.25.7", + "version": "7.23.3", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.25.7", - "@babel/helper-simple-access": "^7.25.7", - "@babel/helper-validator-identifier": "^7.25.7", - "@babel/traverse": "^7.25.7" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -180,7 +283,7 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.25.7", + "version": "7.24.0", "dev": true, "license": "MIT", "engines": { @@ -188,19 +291,29 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.25.7", + "version": "7.22.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.25.7", + "version": "7.23.4", "dev": true, "license": "MIT", "engines": { @@ -208,7 +321,7 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.7", + "version": "7.22.20", "dev": true, "license": "MIT", "engines": { @@ -216,7 +329,7 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.25.7", + "version": "7.23.5", "dev": true, "license": "MIT", "engines": { @@ -224,26 +337,26 @@ } }, "node_modules/@babel/helpers": { - "version": "7.25.7", + "version": "7.24.0", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.25.7", - "@babel/types": "^7.25.7" + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.0", + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.25.7", + "version": "7.23.4", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.25.7", + "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "js-tokens": "^4.0.0" }, "engines": { "node": ">=6.9.0" @@ -314,12 +427,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.25.7", + "version": "7.24.0", "dev": true, "license": "MIT", - "dependencies": { - "@babel/types": "^7.25.7" - }, "bin": { "parser": "bin/babel-parser.js" }, @@ -360,34 +470,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.25.7", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-import-meta": { "version": "7.10.4", "dev": true, @@ -411,11 +493,11 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.25.7", + "version": "7.23.3", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -490,20 +572,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-top-level-await": { "version": "7.14.5", "dev": true, @@ -519,11 +587,11 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.25.7", + "version": "7.23.3", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -533,7 +601,7 @@ } }, "node_modules/@babel/runtime": { - "version": "7.25.7", + "version": "7.25.6", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -543,28 +611,31 @@ } }, "node_modules/@babel/template": { - "version": "7.25.7", + "version": "7.24.0", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.25.7", - "@babel/parser": "^7.25.7", - "@babel/types": "^7.25.7" + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.25.7", + "version": "7.24.0", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.25.7", - "@babel/generator": "^7.25.7", - "@babel/parser": "^7.25.7", - "@babel/template": "^7.25.7", - "@babel/types": "^7.25.7", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -581,12 +652,12 @@ } }, "node_modules/@babel/types": { - "version": "7.25.7", + "version": "7.24.0", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.25.7", - "@babel/helper-validator-identifier": "^7.25.7", + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { @@ -613,7 +684,7 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.11.1", + "version": "4.10.0", "dev": true, "license": "MIT", "engines": { @@ -702,7 +773,7 @@ } }, "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", + "version": "6.0.1", "dev": true, "license": "MIT", "engines": { @@ -817,11 +888,6 @@ "node": ">=8" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/sprintf-js": { - "version": "1.0.3", - "dev": true, - "license": "BSD-3-Clause" - }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", "dev": true, @@ -846,6 +912,21 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/@jest/console/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/@jest/core": { "version": "29.7.0", "dev": true, @@ -892,15 +973,19 @@ } } }, - "node_modules/@jest/core/node_modules/ansi-styles": { - "version": "5.2.0", + "node_modules/@jest/core/node_modules/chalk": { + "version": "4.1.2", "dev": true, "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/@jest/core/node_modules/pretty-format": { @@ -916,8 +1001,19 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/@jest/core/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/@jest/core/node_modules/react-is": { - "version": "18.3.1", + "version": "18.2.0", "dev": true, "license": "MIT" }, @@ -1030,6 +1126,21 @@ } } }, + "node_modules/@jest/reporters/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/@jest/reporters/node_modules/glob": { "version": "7.2.3", "dev": true, @@ -1126,6 +1237,21 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/@jest/transform/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/@jest/types": { "version": "29.6.3", "dev": true, @@ -1142,6 +1268,21 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/@jest/types/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.5", "dev": true, @@ -1172,7 +1313,7 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", + "version": "1.4.15", "dev": true, "license": "MIT" }, @@ -1207,10 +1348,11 @@ }, "node_modules/@next/swc-darwin-arm64": { "version": "14.2.15", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.15.tgz", + "integrity": "sha512-Rvh7KU9hOUBnZ9TJ28n2Oa7dD9cvDBKua9IKx7cfQQ0GoYUwg9ig31O2oMwH3wm+pE3IkAQ67ZobPfEgurPZIA==", "cpu": [ "arm64" ], - "license": "MIT", "optional": true, "os": [ "darwin" @@ -1226,7 +1368,6 @@ "cpu": [ "x64" ], - "license": "MIT", "optional": true, "os": [ "darwin" @@ -1242,7 +1383,6 @@ "cpu": [ "arm64" ], - "license": "MIT", "optional": true, "os": [ "linux" @@ -1258,7 +1398,6 @@ "cpu": [ "arm64" ], - "license": "MIT", "optional": true, "os": [ "linux" @@ -1269,8 +1408,6 @@ }, "node_modules/@next/swc-linux-x64-gnu": { "version": "14.2.15", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.15.tgz", - "integrity": "sha512-kE6q38hbrRbKEkkVn62reLXhThLRh6/TvgSP56GkFNhU22TbIrQDEMrO7j0IcQHcew2wfykq8lZyHFabz0oBrA==", "cpu": [ "x64" ], @@ -1285,8 +1422,6 @@ }, "node_modules/@next/swc-linux-x64-musl": { "version": "14.2.15", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.15.tgz", - "integrity": "sha512-PZ5YE9ouy/IdO7QVJeIcyLn/Rc4ml9M2G4y3kCM9MNf1YKvFY4heg3pVa/jQbMro+tP6yc4G2o9LjAz1zxD7tQ==", "cpu": [ "x64" ], @@ -1306,7 +1441,6 @@ "cpu": [ "arm64" ], - "license": "MIT", "optional": true, "os": [ "win32" @@ -1322,7 +1456,6 @@ "cpu": [ "ia32" ], - "license": "MIT", "optional": true, "os": [ "win32" @@ -1338,7 +1471,6 @@ "cpu": [ "x64" ], - "license": "MIT", "optional": true, "os": [ "win32" @@ -1379,14 +1511,6 @@ "node": ">= 8" } }, - "node_modules/@nolyfill/is-core-module": { - "version": "1.0.39", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.4.0" - } - }, "node_modules/@npmcli/fs": { "version": "2.1.2", "dev": true, @@ -1424,14 +1548,13 @@ "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", - "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/popperjs" } }, "node_modules/@react-aria/ssr": { - "version": "3.9.6", + "version": "3.9.5", "license": "Apache-2.0", "dependencies": { "@swc/helpers": "^0.5.0" @@ -1447,7 +1570,6 @@ "version": "2.2.8", "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.2.8.tgz", "integrity": "sha512-eK/ieXftPRQfaBSmzsamXEyDwkntMTY0e9SG5ETsEOv5JIPKhu3mj992t6B8FJjlnSrZBAAqdT8oMkPe4j+P9g==", - "license": "MIT", "dependencies": { "immer": "^10.0.3", "redux": "^5.0.1", @@ -1503,13 +1625,8 @@ "react": ">=16.14.0" } }, - "node_modules/@rtsao/scc": { - "version": "1.1.0", - "dev": true, - "license": "MIT" - }, "node_modules/@rushstack/eslint-patch": { - "version": "1.10.4", + "version": "1.7.2", "dev": true, "license": "MIT" }, @@ -1547,7 +1664,7 @@ } }, "node_modules/@testing-library/dom": { - "version": "10.4.0", + "version": "10.3.1", "dev": true, "license": "MIT", "peer": true, @@ -1565,12 +1682,33 @@ "node": ">=18" } }, + "node_modules/@testing-library/dom/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@testing-library/dom/node_modules/dom-accessibility-api": { + "version": "0.5.16", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/@testing-library/jest-dom": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.5.0.tgz", "integrity": "sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA==", "dev": true, - "license": "MIT", "dependencies": { "@adobe/css-tools": "^4.4.0", "aria-query": "^5.0.0", @@ -1586,29 +1724,11 @@ "yarn": ">=1" } }, - "node_modules/@testing-library/jest-dom/node_modules/chalk": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { - "version": "0.6.3", - "dev": true, - "license": "MIT" - }, "node_modules/@testing-library/react": { "version": "16.0.1", "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.0.1.tgz", "integrity": "sha512-dSmwJVtJXmku+iocRhWOUFbrERC76TX2Mnf0ATODz8brzAZrMBbzLwQixlBSanZxR6LddK3eiwpSFZgDET1URg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5" }, @@ -1675,7 +1795,7 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.20.6", + "version": "7.20.5", "dev": true, "license": "MIT", "dependencies": { @@ -1721,38 +1841,63 @@ "parse5": "^7.0.0" } }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "dev": true, + "license": "MIT" + }, "node_modules/@types/json5": { "version": "0.0.29", "dev": true, "license": "MIT" }, "node_modules/@types/node": { - "version": "22.7.5", + "version": "20.11.25", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~6.19.2" + "undici-types": "~5.26.4" } }, "node_modules/@types/prop-types": { - "version": "15.7.13", + "version": "15.7.11", "license": "MIT" }, "node_modules/@types/react": { - "version": "18.3.11", + "version": "18.2.64", "license": "MIT", "dependencies": { "@types/prop-types": "*", + "@types/scheduler": "*", "csstype": "^3.0.2" } }, + "node_modules/@types/react-dom": { + "version": "18.2.20", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/react": "*" + } + }, "node_modules/@types/react-transition-group": { - "version": "4.4.11", + "version": "4.4.10", "license": "MIT", "dependencies": { "@types/react": "*" } }, + "node_modules/@types/scheduler": { + "version": "0.16.8", + "license": "MIT" + }, + "node_modules/@types/semver": { + "version": "7.5.8", + "dev": true, + "license": "MIT" + }, "node_modules/@types/stack-utils": { "version": "2.0.3", "dev": true, @@ -1772,7 +1917,7 @@ "license": "MIT" }, "node_modules/@types/yargs": { - "version": "17.0.33", + "version": "17.0.32", "dev": true, "license": "MIT", "dependencies": { @@ -1784,31 +1929,26 @@ "dev": true, "license": "MIT" }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.8.1", + "node_modules/@typescript-eslint/parser": { + "version": "6.21.0", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.8.1", - "@typescript-eslint/type-utils": "8.8.1", - "@typescript-eslint/utils": "8.8.1", - "@typescript-eslint/visitor-keys": "8.8.1", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", - "natural-compare": "^1.4.0", - "ts-api-utils": "^1.3.0" + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", - "eslint": "^8.57.0 || ^9.0.0" + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -1816,26 +1956,41 @@ } } }, - "node_modules/@typescript-eslint/parser": { - "version": "8.8.1", + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.21.0", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.8.1", - "@typescript-eslint/types": "8.8.1", - "@typescript-eslint/typescript-estree": "8.8.1", - "@typescript-eslint/visitor-keys": "8.8.1", - "debug": "^4.3.4" + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "7.2.0", + "@typescript-eslint/utils": "7.2.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" + "eslint": "^8.56.0" }, "peerDependenciesMeta": { "typescript": { @@ -1843,34 +1998,34 @@ } } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.8.1", + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { + "version": "7.2.0", "dev": true, "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.8.1", - "@typescript-eslint/visitor-keys": "8.8.1" - }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.8.1", + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "7.2.0", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/typescript-estree": "8.8.1", - "@typescript-eslint/utils": "8.8.1", + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0", "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -1882,12 +2037,50 @@ } } }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "7.2.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/minimatch": { + "version": "9.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@typescript-eslint/types": { - "version": "8.8.1", + "version": "6.21.0", "dev": true, "license": "MIT", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -1895,21 +2088,21 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.8.1", + "version": "6.21.0", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "8.8.1", - "@typescript-eslint/visitor-keys": "8.8.1", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", - "fast-glob": "^3.3.2", + "globby": "^11.1.0", "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -1930,7 +2123,7 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.5", + "version": "9.0.3", "dev": true, "license": "ISC", "dependencies": { @@ -1944,36 +2137,132 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.8.1", + "version": "7.2.0", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.8.1", - "@typescript-eslint/types": "8.8.1", - "@typescript-eslint/typescript-estree": "8.8.1" + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "7.2.0", + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/typescript-estree": "7.2.0", + "semver": "^7.5.4" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" + "eslint": "^8.56.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "7.2.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "7.2.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/minimatch": { + "version": "9.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.8.1", + "version": "6.21.0", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.8.1", - "eslint-visitor-keys": "^3.4.3" + "@typescript-eslint/types": "6.21.0", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -2004,7 +2293,7 @@ "license": "ISC" }, "node_modules/acorn": { - "version": "8.12.1", + "version": "8.11.3", "dev": true, "license": "MIT", "bin": { @@ -2032,12 +2321,9 @@ } }, "node_modules/acorn-walk": { - "version": "8.3.4", + "version": "8.3.2", "dev": true, "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, "engines": { "node": ">=0.4.0" } @@ -2196,15 +2482,14 @@ } }, "node_modules/array-includes": { - "version": "3.1.8", + "version": "3.1.7", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", "is-string": "^1.0.7" }, "engines": { @@ -2222,16 +2507,33 @@ "node": ">=8" } }, + "node_modules/array.prototype.filter": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array.prototype.findlast": { - "version": "1.2.5", + "version": "1.2.4", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.5", "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", + "es-abstract": "^1.22.3", "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", "es-shim-unscopables": "^1.0.2" }, "engines": { @@ -2242,15 +2544,14 @@ } }, "node_modules/array.prototype.findlastindex": { - "version": "1.2.5", + "version": "1.2.4", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.5", "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", + "es-abstract": "^1.22.3", "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", "es-shim-unscopables": "^1.0.2" }, "engines": { @@ -2294,19 +2595,27 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array.prototype.toreversed": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + } + }, "node_modules/array.prototype.tosorted": { - "version": "1.1.4", + "version": "1.1.3", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.5", "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", - "es-errors": "^1.3.0", + "es-abstract": "^1.22.3", + "es-errors": "^1.1.0", "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" } }, "node_modules/arraybuffer.prototype.slice": { @@ -2335,6 +2644,14 @@ "dev": true, "license": "MIT" }, + "node_modules/asynciterator.prototype": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + } + }, "node_modules/asynckit": { "version": "0.4.0", "dev": true, @@ -2355,7 +2672,7 @@ } }, "node_modules/axe-core": { - "version": "4.10.0", + "version": "4.7.0", "dev": true, "license": "MPL-2.0", "engines": { @@ -2363,11 +2680,11 @@ } }, "node_modules/axobject-query": { - "version": "4.1.0", + "version": "3.2.1", "dev": true, "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" + "dependencies": { + "dequal": "^2.0.3" } }, "node_modules/babel-jest": { @@ -2390,6 +2707,21 @@ "@babel/core": "^7.8.0" } }, + "node_modules/babel-jest/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/babel-plugin-istanbul": { "version": "6.1.1", "dev": true, @@ -2443,25 +2775,22 @@ } }, "node_modules/babel-preset-current-node-syntax": { - "version": "1.1.0", + "version": "1.0.1", "dev": true, "license": "MIT", "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-import-attributes": "^7.24.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5" + "@babel/plugin-syntax-top-level-await": "^7.8.3" }, "peerDependencies": { "@babel/core": "^7.0.0" @@ -2509,7 +2838,6 @@ "url": "https://opencollective.com/bootstrap" } ], - "license": "MIT", "peerDependencies": { "@popperjs/core": "^2.11.8" } @@ -2527,8 +2855,7 @@ "type": "opencollective", "url": "https://opencollective.com/bootstrap" } - ], - "license": "MIT" + ] }, "node_modules/brace-expansion": { "version": "1.1.11", @@ -2551,7 +2878,7 @@ } }, "node_modules/browserslist": { - "version": "4.24.0", + "version": "4.23.0", "dev": true, "funding": [ { @@ -2569,10 +2896,10 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001663", - "electron-to-chromium": "^1.5.28", - "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.0" + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" }, "bin": { "browserslist": "cli.js" @@ -2738,7 +3065,7 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001667", + "version": "1.0.30001594", "funding": [ { "type": "opencollective", @@ -2764,7 +3091,7 @@ } }, "node_modules/chalk": { - "version": "4.1.2", + "version": "3.0.0", "dev": true, "license": "MIT", "dependencies": { @@ -2772,10 +3099,7 @@ "supports-color": "^7.1.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=8" } }, "node_modules/char-regex": { @@ -2790,7 +3114,6 @@ "version": "4.4.4", "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.4.tgz", "integrity": "sha512-emICKGBABnxhMjUjlYRR12PmOXhJ2eJjEHL2/dZlWjxRAZT1D8xplLFq5M0tMQK8ja+wBS/tuVEJB5C6r7VxJA==", - "license": "MIT", "dependencies": { "@kurkle/color": "^0.3.0" }, @@ -2821,7 +3144,7 @@ } }, "node_modules/cjs-module-lexer": { - "version": "1.4.1", + "version": "1.2.3", "dev": true, "license": "MIT" }, @@ -2953,11 +3276,11 @@ } }, "node_modules/commander": { - "version": "12.1.0", + "version": "9.5.0", "dev": true, "license": "MIT", "engines": { - "node": ">=18" + "node": "^12.20.0 || >=14" } }, "node_modules/common-tags": { @@ -3003,6 +3326,21 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/create-jest/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "dev": true, @@ -3044,97 +3382,49 @@ }, "node_modules/csstype": { "version": "3.1.3", - "license": "MIT" - }, - "node_modules/cubic2quad": { - "version": "1.2.1", - "dev": true, - "license": "MIT" - }, - "node_modules/d": { - "version": "1.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "es5-ext": "^0.10.64", - "type": "^2.7.2" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/damerau-levenshtein": { - "version": "1.0.8", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/data-urls": { - "version": "3.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "abab": "^2.0.6", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/data-view-buffer": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "license": "MIT" }, - "node_modules/data-view-byte-length": { - "version": "1.0.1", + "node_modules/cubic2quad": { + "version": "1.2.1", "dev": true, - "license": "MIT", + "license": "MIT" + }, + "node_modules/d": { + "version": "1.0.2", + "dev": true, + "license": "ISC", "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" + "es5-ext": "^0.10.64", + "type": "^2.7.2" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.12" } }, - "node_modules/data-view-byte-offset": { - "version": "1.0.0", + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/data-urls": { + "version": "3.0.2", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=12" } }, "node_modules/debug": { - "version": "4.3.7", + "version": "4.3.4", "dev": true, "license": "MIT", "dependencies": { - "ms": "^2.1.3" + "ms": "2.1.2" }, "engines": { "node": ">=6.0" @@ -3151,7 +3441,7 @@ "license": "MIT" }, "node_modules/dedent": { - "version": "1.5.3", + "version": "1.5.1", "dev": true, "license": "MIT", "peerDependencies": { @@ -3163,37 +3453,6 @@ } } }, - "node_modules/deep-equal": { - "version": "2.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.5", - "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.2", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.2", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/deep-is": { "version": "0.1.4", "dev": true, @@ -3303,10 +3562,9 @@ } }, "node_modules/dom-accessibility-api": { - "version": "0.5.16", + "version": "0.6.3", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/dom-helpers": { "version": "5.2.1", @@ -3333,7 +3591,7 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.33", + "version": "1.4.693", "dev": true, "license": "ISC" }, @@ -3363,7 +3621,7 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.17.1", + "version": "5.15.1", "dev": true, "license": "MIT", "dependencies": { @@ -3407,7 +3665,7 @@ } }, "node_modules/es-abstract": { - "version": "1.23.3", + "version": "1.22.5", "dev": true, "license": "MIT", "dependencies": { @@ -3415,12 +3673,8 @@ "arraybuffer.prototype.slice": "^1.0.3", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.7", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", "es-define-property": "^1.0.0", "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", "es-set-tostringtag": "^2.0.3", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.6", @@ -3431,11 +3685,10 @@ "has-property-descriptors": "^1.0.2", "has-proto": "^1.0.3", "has-symbols": "^1.0.3", - "hasown": "^2.0.2", + "hasown": "^2.0.1", "internal-slot": "^1.0.7", "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", "is-negative-zero": "^2.0.3", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.3", @@ -3446,17 +3699,17 @@ "object-keys": "^1.1.1", "object.assign": "^4.1.5", "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.2", + "safe-array-concat": "^1.1.0", "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", - "string.prototype.trimstart": "^1.0.8", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", "typed-array-buffer": "^1.0.2", "typed-array-byte-length": "^1.0.1", "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.6", + "typed-array-length": "^1.0.5", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" + "which-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -3465,6 +3718,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, "node_modules/es-define-property": { "version": "1.0.0", "dev": true, @@ -3484,55 +3742,26 @@ "node": ">= 0.4" } }, - "node_modules/es-get-iterator": { - "version": "1.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/es-iterator-helpers": { - "version": "1.1.0", + "version": "1.0.17", "dev": true, "license": "MIT", "dependencies": { + "asynciterator.prototype": "^1.0.0", "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", + "es-abstract": "^1.22.4", "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.3", + "es-set-tostringtag": "^2.0.2", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.4", + "globalthis": "^1.0.3", "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "internal-slot": "^1.0.7", - "iterator.prototype": "^1.1.3", - "safe-array-concat": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -3624,7 +3853,7 @@ } }, "node_modules/escalade": { - "version": "3.2.0", + "version": "3.1.2", "dev": true, "license": "MIT", "engines": { @@ -3668,7 +3897,6 @@ "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, - "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -3724,7 +3952,6 @@ "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.15.tgz", "integrity": "sha512-mKg+NC/8a4JKLZRIOBplxXNdStgxy7lzWuedUaCc8tev+Al9mwDUTujQH6W6qXDH9kycWiVo28tADWGvpBsZcQ==", "dev": true, - "license": "MIT", "dependencies": { "@next/eslint-plugin-next": "14.2.15", "@rushstack/eslint-patch": "^1.3.3", @@ -3747,6 +3974,160 @@ } } }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "7.2.0", + "@typescript-eslint/type-utils": "7.2.0", + "@typescript-eslint/utils": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/parser": { + "version": "7.2.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "7.2.0", + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/typescript-estree": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/scope-manager": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/types": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/typescript-estree": { + "version": "7.2.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/visitor-keys": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "7.2.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/eslint-config-next/node_modules/minimatch": { + "version": "9.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "dev": true, @@ -3766,17 +4147,16 @@ } }, "node_modules/eslint-import-resolver-typescript": { - "version": "3.6.3", + "version": "3.6.1", "dev": true, "license": "ISC", "dependencies": { - "@nolyfill/is-core-module": "1.0.39", - "debug": "^4.3.5", - "enhanced-resolve": "^5.15.0", - "eslint-module-utils": "^2.8.1", - "fast-glob": "^3.3.2", - "get-tsconfig": "^4.7.5", - "is-bun-module": "^1.0.2", + "debug": "^4.3.4", + "enhanced-resolve": "^5.12.0", + "eslint-module-utils": "^2.7.4", + "fast-glob": "^3.3.1", + "get-tsconfig": "^4.5.0", + "is-core-module": "^2.11.0", "is-glob": "^4.0.3" }, "engines": { @@ -3787,20 +4167,11 @@ }, "peerDependencies": { "eslint": "*", - "eslint-plugin-import": "*", - "eslint-plugin-import-x": "*" - }, - "peerDependenciesMeta": { - "eslint-plugin-import": { - "optional": true - }, - "eslint-plugin-import-x": { - "optional": true - } + "eslint-plugin-import": "*" } }, "node_modules/eslint-module-utils": { - "version": "2.12.0", + "version": "2.8.1", "dev": true, "license": "MIT", "dependencies": { @@ -3824,35 +4195,33 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.31.0", + "version": "2.29.1", "dev": true, "license": "MIT", "dependencies": { - "@rtsao/scc": "^1.1.0", - "array-includes": "^3.1.8", - "array.prototype.findlastindex": "^1.2.5", + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", "array.prototype.flat": "^1.3.2", "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.12.0", - "hasown": "^2.0.2", - "is-core-module": "^2.15.1", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "object.groupby": "^1.0.3", - "object.values": "^1.2.0", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", "semver": "^6.3.1", - "string.prototype.trimend": "^1.0.8", "tsconfig-paths": "^3.15.0" }, "engines": { "node": ">=4" }, "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" } }, "node_modules/eslint-plugin-import/node_modules/debug": { @@ -3883,75 +4252,67 @@ } }, "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.10.0", + "version": "6.8.0", "dev": true, "license": "MIT", "dependencies": { - "aria-query": "~5.1.3", - "array-includes": "^3.1.8", + "@babel/runtime": "^7.23.2", + "aria-query": "^5.3.0", + "array-includes": "^3.1.7", "array.prototype.flatmap": "^1.3.2", "ast-types-flow": "^0.0.8", - "axe-core": "^4.10.0", - "axobject-query": "^4.1.0", + "axe-core": "=4.7.0", + "axobject-query": "^3.2.1", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", - "es-iterator-helpers": "^1.0.19", - "hasown": "^2.0.2", + "es-iterator-helpers": "^1.0.15", + "hasown": "^2.0.0", "jsx-ast-utils": "^3.3.5", "language-tags": "^1.0.9", "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "safe-regex-test": "^1.0.3", - "string.prototype.includes": "^2.0.0" + "object.entries": "^1.1.7", + "object.fromentries": "^2.0.7" }, "engines": { "node": ">=4.0" }, "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" - } - }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/aria-query": { - "version": "5.1.3", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "deep-equal": "^2.0.5" + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" } }, "node_modules/eslint-plugin-react": { - "version": "7.37.1", + "version": "7.34.0", "dev": true, "license": "MIT", "dependencies": { - "array-includes": "^3.1.8", - "array.prototype.findlast": "^1.2.5", + "array-includes": "^3.1.7", + "array.prototype.findlast": "^1.2.4", "array.prototype.flatmap": "^1.3.2", - "array.prototype.tosorted": "^1.1.4", + "array.prototype.toreversed": "^1.1.2", + "array.prototype.tosorted": "^1.1.3", "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.19", + "es-iterator-helpers": "^1.0.17", "estraverse": "^5.3.0", - "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", - "object.entries": "^1.1.8", - "object.fromentries": "^2.0.8", - "object.values": "^1.2.0", + "object.entries": "^1.1.7", + "object.fromentries": "^2.0.7", + "object.hasown": "^1.1.3", + "object.values": "^1.1.7", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.5", "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.11", - "string.prototype.repeat": "^1.0.0" + "string.prototype.matchall": "^4.0.10" }, "engines": { "node": ">=4" }, "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" } }, "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.2", + "version": "4.6.0", "dev": true, "license": "MIT", "engines": { @@ -4014,12 +4375,27 @@ "node_modules/eslint-visitor-keys": { "version": "3.4.3", "dev": true, - "license": "Apache-2.0", + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=10" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/esniff": { @@ -4065,7 +4441,7 @@ } }, "node_modules/esquery": { - "version": "1.6.0", + "version": "1.5.0", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -4178,7 +4554,6 @@ "resolved": "https://registry.npmjs.org/fantasticon/-/fantasticon-3.0.0.tgz", "integrity": "sha512-PylulixZA8I0SeiUKtuyOhwrz/ojZTSA1KXddipvEyQXCVrpPMTnSXzaE9nXXK7nCjJWFkqoBAQ1aBdaxMltrg==", "dev": true, - "license": "MIT", "dependencies": { "case": "^1.6.3", "cli-color": "^2.0.4", @@ -4207,6 +4582,14 @@ "balanced-match": "^1.0.0" } }, + "node_modules/fantasticon/node_modules/commander": { + "version": "12.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/fantasticon/node_modules/glob": { "version": "10.4.5", "dev": true, @@ -4227,12 +4610,15 @@ } }, "node_modules/fantasticon/node_modules/jackspeak": { - "version": "3.4.3", + "version": "3.4.2", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, + "engines": { + "node": "14 >=14.21 || 16 >=16.20 || >=18" + }, "funding": { "url": "https://github.com/sponsors/isaacs" }, @@ -4380,7 +4766,7 @@ } }, "node_modules/foreground-child": { - "version": "3.3.0", + "version": "3.2.1", "dev": true, "license": "ISC", "dependencies": { @@ -4583,7 +4969,7 @@ } }, "node_modules/get-tsconfig": { - "version": "4.8.1", + "version": "4.7.2", "dev": true, "license": "MIT", "dependencies": { @@ -4662,12 +5048,11 @@ } }, "node_modules/globalthis": { - "version": "1.0.4", + "version": "1.0.3", "dev": true, "license": "MIT", "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" + "define-properties": "^1.1.3" }, "engines": { "node": ">= 0.4" @@ -4823,7 +5208,7 @@ "license": "ISC" }, "node_modules/hasown": { - "version": "2.0.2", + "version": "2.0.1", "dev": true, "license": "MIT", "dependencies": { @@ -4907,7 +5292,7 @@ } }, "node_modules/ignore": { - "version": "5.3.2", + "version": "5.3.1", "dev": true, "license": "MIT", "engines": { @@ -4915,7 +5300,7 @@ } }, "node_modules/immer": { - "version": "10.1.1", + "version": "10.0.3", "license": "MIT", "funding": { "type": "opencollective", @@ -4938,7 +5323,7 @@ } }, "node_modules/import-local": { - "version": "3.2.0", + "version": "3.1.0", "dev": true, "license": "MIT", "dependencies": { @@ -5022,20 +5407,10 @@ "node": ">= 12" } }, - "node_modules/is-arguments": { - "version": "1.1.1", + "node_modules/ip-address/node_modules/sprintf-js": { + "version": "1.1.3", "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "license": "BSD-3-Clause" }, "node_modules/is-array-buffer": { "version": "3.0.4", @@ -5097,14 +5472,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-bun-module": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.6.3" - } - }, "node_modules/is-callable": { "version": "1.2.7", "dev": true, @@ -5117,28 +5484,11 @@ } }, "node_modules/is-core-module": { - "version": "2.15.1", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-view": { - "version": "1.0.1", + "version": "2.13.1", "dev": true, "license": "MIT", "dependencies": { - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5224,12 +5574,9 @@ "license": "MIT" }, "node_modules/is-map": { - "version": "2.0.3", + "version": "2.0.2", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.4" - }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -5301,12 +5648,9 @@ } }, "node_modules/is-set": { - "version": "2.0.3", + "version": "2.0.2", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.4" - }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -5379,12 +5723,9 @@ } }, "node_modules/is-weakmap": { - "version": "2.0.2", + "version": "2.0.1", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.4" - }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -5401,15 +5742,12 @@ } }, "node_modules/is-weakset": { - "version": "2.0.3", + "version": "2.0.2", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5434,7 +5772,7 @@ } }, "node_modules/istanbul-lib-instrument": { - "version": "6.0.3", + "version": "6.0.2", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -5487,7 +5825,7 @@ } }, "node_modules/iterator.prototype": { - "version": "1.1.3", + "version": "1.1.2", "dev": true, "license": "MIT", "dependencies": { @@ -5496,9 +5834,6 @@ "has-symbols": "^1.0.3", "reflect.getprototypeof": "^1.0.4", "set-function-name": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" } }, "node_modules/jackspeak": { @@ -5523,7 +5858,6 @@ "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, - "license": "MIT", "dependencies": { "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", @@ -5588,15 +5922,19 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-circus/node_modules/ansi-styles": { - "version": "5.2.0", + "node_modules/jest-circus/node_modules/chalk": { + "version": "4.1.2", "dev": true, "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-circus/node_modules/pretty-format": { @@ -5612,8 +5950,19 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-circus/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/jest-circus/node_modules/react-is": { - "version": "18.3.1", + "version": "18.2.0", "dev": true, "license": "MIT" }, @@ -5649,6 +5998,21 @@ } } }, + "node_modules/jest-cli/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/jest-config": { "version": "29.7.0", "dev": true, @@ -5693,15 +6057,19 @@ } } }, - "node_modules/jest-config/node_modules/ansi-styles": { - "version": "5.2.0", + "node_modules/jest-config/node_modules/chalk": { + "version": "4.1.2", "dev": true, "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-config/node_modules/glob": { @@ -5736,8 +6104,19 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-config/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/jest-config/node_modules/react-is": { - "version": "18.3.1", + "version": "18.2.0", "dev": true, "license": "MIT" }, @@ -5755,15 +6134,19 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-diff/node_modules/ansi-styles": { - "version": "5.2.0", + "node_modules/jest-diff/node_modules/chalk": { + "version": "4.1.2", "dev": true, "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-diff/node_modules/pretty-format": { @@ -5779,8 +6162,19 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-diff/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/jest-diff/node_modules/react-is": { - "version": "18.3.1", + "version": "18.2.0", "dev": true, "license": "MIT" }, @@ -5810,15 +6204,19 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-each/node_modules/ansi-styles": { - "version": "5.2.0", + "node_modules/jest-each/node_modules/chalk": { + "version": "4.1.2", "dev": true, "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-each/node_modules/pretty-format": { @@ -5834,8 +6232,19 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-each/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/jest-each/node_modules/react-is": { - "version": "18.3.1", + "version": "18.2.0", "dev": true, "license": "MIT" }, @@ -5844,7 +6253,6 @@ "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz", "integrity": "sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==", "dev": true, - "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -5952,7 +6360,7 @@ } }, "node_modules/jest-leak-detector/node_modules/react-is": { - "version": "18.3.1", + "version": "18.2.0", "dev": true, "license": "MIT" }, @@ -5970,15 +6378,19 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-matcher-utils/node_modules/ansi-styles": { - "version": "5.2.0", + "node_modules/jest-matcher-utils/node_modules/chalk": { + "version": "4.1.2", "dev": true, "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-matcher-utils/node_modules/pretty-format": { @@ -5994,8 +6406,19 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-matcher-utils/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/jest-matcher-utils/node_modules/react-is": { - "version": "18.3.1", + "version": "18.2.0", "dev": true, "license": "MIT" }, @@ -6018,15 +6441,19 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-message-util/node_modules/ansi-styles": { - "version": "5.2.0", + "node_modules/jest-message-util/node_modules/chalk": { + "version": "4.1.2", "dev": true, "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-message-util/node_modules/pretty-format": { @@ -6042,8 +6469,19 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-message-util/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/jest-message-util/node_modules/react-is": { - "version": "18.3.1", + "version": "18.2.0", "dev": true, "license": "MIT" }, @@ -6115,6 +6553,21 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-resolve/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/jest-runner": { "version": "29.7.0", "dev": true, @@ -6143,7 +6596,22 @@ "source-map-support": "0.5.13" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-runtime": { @@ -6178,6 +6646,21 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-runtime/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/jest-runtime/node_modules/glob": { "version": "7.2.3", "dev": true, @@ -6227,15 +6710,19 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-snapshot/node_modules/ansi-styles": { - "version": "5.2.0", + "node_modules/jest-snapshot/node_modules/chalk": { + "version": "4.1.2", "dev": true, "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-snapshot/node_modules/pretty-format": { @@ -6251,8 +6738,19 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-snapshot/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/jest-snapshot/node_modules/react-is": { - "version": "18.3.1", + "version": "18.2.0", "dev": true, "license": "MIT" }, @@ -6272,6 +6770,21 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-util/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/jest-validate": { "version": "29.7.0", "dev": true, @@ -6288,26 +6801,30 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-validate/node_modules/ansi-styles": { - "version": "5.2.0", + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", "dev": true, "license": "MIT", "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", + "node_modules/jest-validate/node_modules/chalk": { + "version": "4.1.2", "dev": true, "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-validate/node_modules/pretty-format": { @@ -6323,8 +6840,19 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-validate/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/jest-validate/node_modules/react-is": { - "version": "18.3.1", + "version": "18.2.0", "dev": true, "license": "MIT" }, @@ -6346,6 +6874,21 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-watcher/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/jest-worker": { "version": "29.7.0", "dev": true, @@ -6439,14 +6982,14 @@ } }, "node_modules/jsesc": { - "version": "3.0.2", + "version": "2.5.2", "dev": true, "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=6" + "node": ">=4" } }, "node_modules/json-buffer": { @@ -6511,7 +7054,7 @@ } }, "node_modules/language-subtag-registry": { - "version": "0.3.23", + "version": "0.3.22", "dev": true, "license": "CC0-1.0" }, @@ -6576,7 +7119,7 @@ "license": "MIT" }, "node_modules/loglevel": { - "version": "1.9.2", + "version": "1.9.1", "dev": true, "license": "MIT", "engines": { @@ -6762,21 +7305,18 @@ } }, "node_modules/memoizee": { - "version": "0.4.17", + "version": "0.4.15", "dev": true, "license": "ISC", "dependencies": { - "d": "^1.0.2", - "es5-ext": "^0.10.64", + "d": "^1.0.1", + "es5-ext": "^0.10.53", "es6-weak-map": "^2.0.3", "event-emitter": "^0.3.5", "is-promise": "^2.2.2", "lru-queue": "^0.1.0", "next-tick": "^1.1.0", "timers-ext": "^0.1.7" - }, - "engines": { - "node": ">=0.12" } }, "node_modules/merge-stream": { @@ -7051,7 +7591,7 @@ } }, "node_modules/ms": { - "version": "2.1.3", + "version": "2.1.2", "dev": true, "license": "MIT" }, @@ -7098,7 +7638,6 @@ "version": "14.2.15", "resolved": "https://registry.npmjs.org/next/-/next-14.2.15.tgz", "integrity": "sha512-h9ctmOokpoDphRvMGnwOJAedT6zKhwqyZML9mDtspgf4Rh3Pn7UTYKqePNoDvhsWBAO5GoPNYshnAUGIazVGmw==", - "license": "MIT", "dependencies": { "@next/env": "14.2.15", "@swc/helpers": "0.5.5", @@ -7149,7 +7688,6 @@ "resolved": "https://registry.npmjs.org/next-router-mock/-/next-router-mock-0.9.13.tgz", "integrity": "sha512-906n2RRaE6Y28PfYJbaz5XZeJ6Tw8Xz1S6E31GGwZ0sXB6/XjldD1/2azn1ZmBmRk5PQRkzjg+n+RHZe5xQzWA==", "dev": true, - "license": "MIT", "peerDependencies": { "next": ">=10.0.0", "react": ">=17.0.0" @@ -7209,7 +7747,7 @@ "license": "MIT" }, "node_modules/node-releases": { - "version": "2.0.18", + "version": "2.0.14", "dev": true, "license": "MIT" }, @@ -7261,7 +7799,7 @@ } }, "node_modules/nwsapi": { - "version": "2.2.13", + "version": "2.2.7", "dev": true, "license": "MIT" }, @@ -7273,27 +7811,9 @@ } }, "node_modules/object-inspect": { - "version": "1.13.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is": { - "version": "1.1.6", + "version": "1.13.1", "dev": true, "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -7324,27 +7844,26 @@ } }, "node_modules/object.entries": { - "version": "1.1.8", + "version": "1.1.7", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" } }, "node_modules/object.fromentries": { - "version": "2.0.8", + "version": "2.0.7", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -7354,26 +7873,37 @@ } }, "node_modules/object.groupby": { - "version": "1.0.3", + "version": "1.0.2", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "array.prototype.filter": "^1.0.3", + "call-bind": "^1.0.5", "define-properties": "^1.2.1", - "es-abstract": "^1.23.2" + "es-abstract": "^1.22.3", + "es-errors": "^1.0.0" + } + }, + "node_modules/object.hasown": { + "version": "1.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, - "engines": { - "node": ">= 0.4" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object.values": { - "version": "1.2.0", + "version": "1.1.7", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -7405,16 +7935,16 @@ } }, "node_modules/optionator": { - "version": "0.9.4", + "version": "0.9.3", "dev": true, "license": "MIT", "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" + "type-check": "^0.4.0" }, "engines": { "node": ">= 0.8.0" @@ -7471,7 +8001,7 @@ } }, "node_modules/package-json-from-dist": { - "version": "1.0.1", + "version": "1.0.0", "dev": true, "license": "BlueOak-1.0.0" }, @@ -7577,7 +8107,7 @@ } }, "node_modules/picocolors": { - "version": "1.1.0", + "version": "1.0.0", "license": "ISC" }, "node_modules/picomatch": { @@ -7678,176 +8208,76 @@ "url": "https://tidelift.com/funding/github/npm/postcss" }, { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", - "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-eslint": { - "version": "16.3.0", - "resolved": "https://registry.npmjs.org/prettier-eslint/-/prettier-eslint-16.3.0.tgz", - "integrity": "sha512-Lh102TIFCr11PJKUMQ2kwNmxGhTsv/KzUg9QYF2Gkw259g/kPgndZDWavk7/ycbRvj2oz4BPZ1gCU8bhfZH/Xg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/parser": "^6.7.5", - "common-tags": "^1.4.0", - "dlv": "^1.1.0", - "eslint": "^8.7.0", - "indent-string": "^4.0.0", - "lodash.merge": "^4.6.0", - "loglevel-colored-level-prefix": "^1.0.0", - "prettier": "^3.0.1", - "pretty-format": "^29.7.0", - "require-relative": "^0.8.7", - "typescript": "^5.2.2", - "vue-eslint-parser": "^9.1.0" - }, - "engines": { - "node": ">=16.10.0" - }, - "peerDependencies": { - "prettier-plugin-svelte": "^3.0.0", - "svelte-eslint-parser": "*" - }, - "peerDependenciesMeta": { - "prettier-plugin-svelte": { - "optional": true - }, - "svelte-eslint-parser": { - "optional": true - } - } - }, - "node_modules/prettier-eslint/node_modules/@typescript-eslint/parser": { - "version": "6.21.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/prettier-eslint/node_modules/@typescript-eslint/scope-manager": { - "version": "6.21.0", - "dev": true, + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0" + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" }, "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": "^10 || ^12 || >=14" } }, - "node_modules/prettier-eslint/node_modules/@typescript-eslint/types": { - "version": "6.21.0", + "node_modules/prelude-ls": { + "version": "1.2.1", "dev": true, "license": "MIT", "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">= 0.8.0" } }, - "node_modules/prettier-eslint/node_modules/@typescript-eslint/typescript-estree": { - "version": "6.21.0", + "node_modules/prettier": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "bin": { + "prettier": "bin/prettier.cjs" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": ">=14" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/prettier-eslint/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.21.0", + "node_modules/prettier-eslint": { + "version": "16.3.0", + "resolved": "https://registry.npmjs.org/prettier-eslint/-/prettier-eslint-16.3.0.tgz", + "integrity": "sha512-Lh102TIFCr11PJKUMQ2kwNmxGhTsv/KzUg9QYF2Gkw259g/kPgndZDWavk7/ycbRvj2oz4BPZ1gCU8bhfZH/Xg==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/types": "6.21.0", - "eslint-visitor-keys": "^3.4.1" + "@typescript-eslint/parser": "^6.7.5", + "common-tags": "^1.4.0", + "dlv": "^1.1.0", + "eslint": "^8.7.0", + "indent-string": "^4.0.0", + "lodash.merge": "^4.6.0", + "loglevel-colored-level-prefix": "^1.0.0", + "prettier": "^3.0.1", + "pretty-format": "^29.7.0", + "require-relative": "^0.8.7", + "typescript": "^5.2.2", + "vue-eslint-parser": "^9.1.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": ">=16.10.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "prettier-plugin-svelte": "^3.0.0", + "svelte-eslint-parser": "*" + }, + "peerDependenciesMeta": { + "prettier-plugin-svelte": { + "optional": true + }, + "svelte-eslint-parser": { + "optional": true + } } }, "node_modules/prettier-eslint/node_modules/ansi-styles": { @@ -7861,28 +8291,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/prettier-eslint/node_modules/brace-expansion": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/prettier-eslint/node_modules/minimatch": { - "version": "9.0.3", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/prettier-eslint/node_modules/pretty-format": { "version": "29.7.0", "dev": true, @@ -7897,7 +8305,7 @@ } }, "node_modules/prettier-eslint/node_modules/react-is": { - "version": "18.3.1", + "version": "18.2.0", "dev": true, "license": "MIT" }, @@ -7998,7 +8406,7 @@ } }, "node_modules/pure-rand": { - "version": "6.1.0", + "version": "6.0.4", "dev": true, "funding": [ { @@ -8040,7 +8448,6 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" }, @@ -8052,7 +8459,6 @@ "version": "2.10.5", "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-2.10.5.tgz", "integrity": "sha512-XueAOEn64RRkZ0s6yzUTdpFtdUXs5L5491QU//8ZcODKJNDLt/r01tNyriZccjgRImH1REynUc9pqjiRMpDLWQ==", - "license": "MIT", "dependencies": { "@babel/runtime": "^7.24.7", "@restart/hooks": "^0.4.9", @@ -8082,7 +8488,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/react-chartjs-2/-/react-chartjs-2-5.2.0.tgz", "integrity": "sha512-98iN5aguJyVSxp5U3CblRLH67J8gkfyGNbiK3c+l1QI/G4irHMPQw44aEPmjVag+YKTyQ260NcF82GTQ3bdscA==", - "license": "MIT", "peerDependencies": { "chart.js": "^4.1.1", "react": "^16.8.0 || ^17.0.0 || ^18.0.0" @@ -8092,7 +8497,6 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "license": "MIT", "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -8115,7 +8519,6 @@ "version": "9.1.2", "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.1.2.tgz", "integrity": "sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w==", - "license": "MIT", "dependencies": { "@types/use-sync-external-store": "^0.0.3", "use-sync-external-store": "^1.0.0" @@ -8185,15 +8588,15 @@ } }, "node_modules/reflect.getprototypeof": { - "version": "1.0.6", + "version": "1.0.5", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.5", "define-properties": "^1.2.1", - "es-abstract": "^1.23.1", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", + "es-abstract": "^1.22.3", + "es-errors": "^1.0.0", + "get-intrinsic": "^1.2.3", "globalthis": "^1.0.3", "which-builtin-type": "^1.1.3" }, @@ -8209,14 +8612,14 @@ "license": "MIT" }, "node_modules/regexp.prototype.flags": { - "version": "1.5.3", + "version": "1.5.2", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.6", "define-properties": "^1.2.1", "es-errors": "^1.3.0", - "set-function-name": "^2.0.2" + "set-function-name": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -8244,7 +8647,7 @@ "license": "MIT" }, "node_modules/reselect": { - "version": "5.1.1", + "version": "5.1.0", "license": "MIT" }, "node_modules/resolve": { @@ -8379,12 +8782,12 @@ } }, "node_modules/safe-array-concat": { - "version": "1.1.2", + "version": "1.1.0", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, @@ -8436,7 +8839,7 @@ "license": "MIT" }, "node_modules/sax": { - "version": "1.4.1", + "version": "1.3.0", "dev": true, "license": "ISC" }, @@ -8459,9 +8862,12 @@ } }, "node_modules/semver": { - "version": "7.6.3", + "version": "7.6.0", "dev": true, "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, "bin": { "semver": "bin/semver.js" }, @@ -8469,22 +8875,38 @@ "node": ">=10" } }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, "node_modules/set-blocking": { "version": "2.0.0", "dev": true, "license": "ISC" }, "node_modules/set-function-length": { - "version": "1.2.2", + "version": "1.2.1", "dev": true, "license": "MIT", "dependencies": { - "define-data-property": "^1.1.4", + "define-data-property": "^1.1.2", "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", + "get-intrinsic": "^1.2.3", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" + "has-property-descriptors": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -8616,7 +9038,7 @@ } }, "node_modules/source-map-js": { - "version": "1.2.1", + "version": "1.0.2", "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -8632,7 +9054,7 @@ } }, "node_modules/sprintf-js": { - "version": "1.1.3", + "version": "1.0.3", "dev": true, "license": "BSD-3-Clause" }, @@ -8682,17 +9104,6 @@ "node": ">=8" } }, - "node_modules/stop-iteration-iterator": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "internal-slot": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/streamsearch": { "version": "1.1.0", "engines": { @@ -8755,7 +9166,7 @@ "license": "MIT" }, "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.1.0", + "version": "6.0.1", "dev": true, "license": "MIT", "engines": { @@ -8779,58 +9190,33 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/string.prototype.includes": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, "node_modules/string.prototype.matchall": { - "version": "4.0.11", + "version": "4.0.10", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "regexp.prototype.flags": "^1.5.2", - "set-function-name": "^2.0.2", - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">= 0.4" + "internal-slot": "^1.0.5", + "regexp.prototype.flags": "^1.5.0", + "set-function-name": "^2.0.0", + "side-channel": "^1.0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/string.prototype.repeat": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, "node_modules/string.prototype.trim": { - "version": "1.2.9", + "version": "1.2.8", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -8840,29 +9226,26 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.8", + "version": "1.0.7", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.8", + "version": "1.0.7", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -9021,14 +9404,6 @@ "balanced-match": "^1.0.0" } }, - "node_modules/svgicons2svgfont/node_modules/commander": { - "version": "9.5.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || >=14" - } - }, "node_modules/svgicons2svgfont/node_modules/glob": { "version": "8.1.0", "dev": true, @@ -9146,15 +9521,12 @@ "license": "MIT" }, "node_modules/timers-ext": { - "version": "0.1.8", + "version": "0.1.7", "dev": true, "license": "ISC", "dependencies": { - "es5-ext": "^0.10.64", - "next-tick": "^1.1.0" - }, - "engines": { - "node": ">=0.12" + "es5-ext": "~0.10.46", + "next-tick": "1" } }, "node_modules/tmpl": { @@ -9182,7 +9554,7 @@ } }, "node_modules/tough-cookie": { - "version": "4.1.4", + "version": "4.1.3", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -9207,7 +9579,7 @@ } }, "node_modules/ts-api-utils": { - "version": "1.3.0", + "version": "1.2.1", "dev": true, "license": "MIT", "engines": { @@ -9248,7 +9620,7 @@ } }, "node_modules/tslib": { - "version": "2.7.0", + "version": "2.6.2", "license": "0BSD" }, "node_modules/ttf2eot": { @@ -9293,7 +9665,7 @@ } }, "node_modules/type": { - "version": "2.7.3", + "version": "2.7.2", "dev": true, "license": "ISC" }, @@ -9378,7 +9750,7 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.6", + "version": "1.0.5", "dev": true, "license": "MIT", "dependencies": { @@ -9397,7 +9769,7 @@ } }, "node_modules/typescript": { - "version": "5.6.3", + "version": "5.4.2", "dev": true, "license": "Apache-2.0", "bin": { @@ -9409,7 +9781,7 @@ } }, "node_modules/uglify-js": { - "version": "3.19.3", + "version": "3.17.4", "dev": true, "license": "BSD-2-Clause", "optional": true, @@ -9448,7 +9820,7 @@ } }, "node_modules/undici-types": { - "version": "6.19.8", + "version": "5.26.5", "dev": true, "license": "MIT" }, @@ -9483,7 +9855,7 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.1", + "version": "1.0.13", "dev": true, "funding": [ { @@ -9501,8 +9873,8 @@ ], "license": "MIT", "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.0" + "escalade": "^3.1.1", + "picocolors": "^1.0.0" }, "bin": { "update-browserslist-db": "cli.js" @@ -9529,7 +9901,7 @@ } }, "node_modules/use-sync-external-store": { - "version": "1.2.2", + "version": "1.2.0", "license": "MIT", "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0" @@ -9541,7 +9913,7 @@ "license": "MIT" }, "node_modules/v8-to-istanbul": { - "version": "9.3.0", + "version": "9.2.0", "dev": true, "license": "ISC", "dependencies": { @@ -9554,7 +9926,7 @@ } }, "node_modules/vue-eslint-parser": { - "version": "9.4.3", + "version": "9.4.2", "dev": true, "license": "MIT", "dependencies": { @@ -9671,12 +10043,12 @@ } }, "node_modules/which-builtin-type": { - "version": "1.1.4", + "version": "1.1.3", "dev": true, "license": "MIT", "dependencies": { - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", + "function.prototype.name": "^1.1.5", + "has-tostringtag": "^1.0.0", "is-async-function": "^2.0.0", "is-date-object": "^1.0.5", "is-finalizationregistry": "^1.0.2", @@ -9685,8 +10057,8 @@ "is-weakref": "^1.0.2", "isarray": "^2.0.5", "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.15" + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" }, "engines": { "node": ">= 0.4" @@ -9696,32 +10068,29 @@ } }, "node_modules/which-collection": { - "version": "1.0.2", + "version": "1.0.1", "dev": true, "license": "MIT", "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/which-typed-array": { - "version": "1.1.15", + "version": "1.1.14", "dev": true, "license": "MIT", "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", + "available-typed-arrays": "^1.0.6", + "call-bind": "^1.0.5", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.2" + "has-tostringtag": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -9756,14 +10125,6 @@ "node": ">=8" } }, - "node_modules/word-wrap": { - "version": "1.2.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/wordwrap": { "version": "1.0.0", "dev": true, @@ -9821,7 +10182,7 @@ } }, "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.1.0", + "version": "6.0.1", "dev": true, "license": "MIT", "engines": { From f470a1e2f02c79b91621a4f7f5fe02494d59bc92 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Mon, 14 Oct 2024 17:10:03 +0200 Subject: [PATCH 273/274] chore: bump javascript packages versions By running: - 'make www-install' command in 'mithril-client-wasm'. - 'make www-test-install' command in 'mithril-client-wasm'. - 'make install' command in 'mithril-explorer'. - 'make install' command in 'docs/website'. --- docs/website/package-lock.json | 4 ++-- docs/website/package.json | 2 +- mithril-client-wasm/www-test/package-lock.json | 4 ++-- mithril-client-wasm/www-test/package.json | 2 +- mithril-client-wasm/www/package-lock.json | 4 ++-- mithril-client-wasm/www/package.json | 2 +- mithril-explorer/package-lock.json | 4 ++-- mithril-explorer/package.json | 2 +- 8 files changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/website/package-lock.json b/docs/website/package-lock.json index b18fe8f0272..a106743a975 100644 --- a/docs/website/package-lock.json +++ b/docs/website/package-lock.json @@ -1,12 +1,12 @@ { "name": "mithril-doc", - "version": "0.1.42", + "version": "0.1.43", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "mithril-doc", - "version": "0.1.42", + "version": "0.1.43", "dependencies": { "@docusaurus/core": "^3.5.2", "@docusaurus/preset-classic": "^3.5.2", diff --git a/docs/website/package.json b/docs/website/package.json index 01d46b1ff2a..d9cf7f30839 100644 --- a/docs/website/package.json +++ b/docs/website/package.json @@ -1,6 +1,6 @@ { "name": "mithril-doc", - "version": "0.1.42", + "version": "0.1.43", "private": true, "scripts": { "docusaurus": "docusaurus", diff --git a/mithril-client-wasm/www-test/package-lock.json b/mithril-client-wasm/www-test/package-lock.json index 35c38c0c210..adf3cbf0ff8 100644 --- a/mithril-client-wasm/www-test/package-lock.json +++ b/mithril-client-wasm/www-test/package-lock.json @@ -1,12 +1,12 @@ { "name": "www-test", - "version": "0.2.4", + "version": "0.2.5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "www-test", - "version": "0.2.4", + "version": "0.2.5", "dependencies": { "@mithril-dev/mithril-client-wasm": "file:../pkg" }, diff --git a/mithril-client-wasm/www-test/package.json b/mithril-client-wasm/www-test/package.json index 7a3d2f3bb92..f8d2bf51ebe 100644 --- a/mithril-client-wasm/www-test/package.json +++ b/mithril-client-wasm/www-test/package.json @@ -1,6 +1,6 @@ { "name": "www-test", - "version": "0.2.4", + "version": "0.2.5", "private": true, "scripts": { "build": "webpack --config webpack.config.js", diff --git a/mithril-client-wasm/www/package-lock.json b/mithril-client-wasm/www/package-lock.json index f735a1f974c..b160bad59a1 100644 --- a/mithril-client-wasm/www/package-lock.json +++ b/mithril-client-wasm/www/package-lock.json @@ -1,12 +1,12 @@ { "name": "www", - "version": "0.2.4", + "version": "0.2.5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "www", - "version": "0.2.4", + "version": "0.2.5", "dependencies": { "@mithril-dev/mithril-client-wasm": "file:../pkg" }, diff --git a/mithril-client-wasm/www/package.json b/mithril-client-wasm/www/package.json index 044bdd35764..c36535346f7 100644 --- a/mithril-client-wasm/www/package.json +++ b/mithril-client-wasm/www/package.json @@ -1,6 +1,6 @@ { "name": "www", - "version": "0.2.4", + "version": "0.2.5", "private": true, "scripts": { "build": "webpack --config webpack.config.js", diff --git a/mithril-explorer/package-lock.json b/mithril-explorer/package-lock.json index da6b321e040..6718c255d3b 100644 --- a/mithril-explorer/package-lock.json +++ b/mithril-explorer/package-lock.json @@ -1,12 +1,12 @@ { "name": "mithril-explorer", - "version": "0.7.9", + "version": "0.7.10", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "mithril-explorer", - "version": "0.7.9", + "version": "0.7.10", "dependencies": { "@mithril-dev/mithril-client-wasm": "file:../mithril-client-wasm/pkg", "@popperjs/core": "^2.11.8", diff --git a/mithril-explorer/package.json b/mithril-explorer/package.json index 41ca7fd3d81..340b5dad8ec 100644 --- a/mithril-explorer/package.json +++ b/mithril-explorer/package.json @@ -1,6 +1,6 @@ { "name": "mithril-explorer", - "version": "0.7.9", + "version": "0.7.10", "private": true, "scripts": { "dev": "next dev", From 376c2ad6247e776086d0e3eb277edf6bcba47d37 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Mon, 14 Oct 2024 17:10:38 +0200 Subject: [PATCH 274/274] chore: update nix flake dependencies By running 'nix flake update' command. --- flake.lock | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/flake.lock b/flake.lock index 440e77ea8a3..3ed1a4a9768 100644 --- a/flake.lock +++ b/flake.lock @@ -2,11 +2,11 @@ "nodes": { "crane": { "locked": { - "lastModified": 1727316705, - "narHash": "sha256-/mumx8AQ5xFuCJqxCIOFCHTVlxHkMT21idpbgbm/TIE=", + "lastModified": 1728776144, + "narHash": "sha256-fROVjMcKRoGHofDm8dY3uDUtCMwUICh/KjBFQnuBzfg=", "owner": "ipetkov", "repo": "crane", - "rev": "5b03654ce046b5167e7b0bccbd8244cb56c16f0e", + "rev": "f876e3d905b922502f031aeec1a84490122254b7", "type": "github" }, "original": { @@ -20,11 +20,11 @@ "nixpkgs-lib": "nixpkgs-lib" }, "locked": { - "lastModified": 1726153070, - "narHash": "sha256-HO4zgY0ekfwO5bX0QH/3kJ/h4KvUDFZg8YpkNwIbg1U=", + "lastModified": 1727826117, + "narHash": "sha256-K5ZLCyfO/Zj9mPFldf3iwS6oZStJcU4tSpiXTMYaaL0=", "owner": "hercules-ci", "repo": "flake-parts", - "rev": "bcef6817a8b2aa20a5a6dbb19b43e63c5bf8619a", + "rev": "3d04084d54bedc3d6b8b736c70ef449225c361b1", "type": "github" }, "original": { @@ -35,11 +35,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1727173215, - "narHash": "sha256-OtMlWYCqBDbnEsByoows785Gem9CSMiXYEBiKKtStk4=", + "lastModified": 1728538411, + "narHash": "sha256-f0SBJz1eZ2yOuKUr5CA9BHULGXVSn6miBuUWdTyhUhU=", "owner": "nixos", "repo": "nixpkgs", - "rev": "965289e5e07243f1cde3212d8bcaf726d36c5c46", + "rev": "b69de56fac8c2b6f8fd27f2eca01dcda8e0a4221", "type": "github" }, "original": { @@ -51,14 +51,14 @@ }, "nixpkgs-lib": { "locked": { - "lastModified": 1725233747, - "narHash": "sha256-Ss8QWLXdr2JCBPcYChJhz4xJm+h/xjl4G0c0XlP6a74=", + "lastModified": 1727825735, + "narHash": "sha256-0xHYkMkeLVQAMa7gvkddbPqpxph+hDzdu1XdGPJR+Os=", "type": "tarball", - "url": "https://github.com/NixOS/nixpkgs/archive/356624c12086a18f2ea2825fed34523d60ccc4e3.tar.gz" + "url": "https://github.com/NixOS/nixpkgs/archive/fb192fec7cc7a4c26d51779e9bab07ce6fa5597a.tar.gz" }, "original": { "type": "tarball", - "url": "https://github.com/NixOS/nixpkgs/archive/356624c12086a18f2ea2825fed34523d60ccc4e3.tar.gz" + "url": "https://github.com/NixOS/nixpkgs/archive/fb192fec7cc7a4c26d51779e9bab07ce6fa5597a.tar.gz" } }, "root": { @@ -76,11 +76,11 @@ ] }, "locked": { - "lastModified": 1727252110, - "narHash": "sha256-3O7RWiXpvqBcCl84Mvqa8dXudZ1Bol1ubNdSmQt7nF4=", + "lastModified": 1727984844, + "narHash": "sha256-xpRqITAoD8rHlXQafYZOLvUXCF6cnZkPfoq67ThN0Hc=", "owner": "numtide", "repo": "treefmt-nix", - "rev": "1bff2ba6ec22bc90e9ad3f7e94cca0d37870afa3", + "rev": "4446c7a6fc0775df028c5a3f6727945ba8400e64", "type": "github" }, "original": {