diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index e638fcdcb..e2e87f1c2 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -35,12 +35,12 @@ jobs: python -m pip install --no-cache-dir --require-hashes -r src/common/db/requirements.txt echo "CODEQL_PYTHON=$(which python)" >> $GITHUB_ENV - name: Initialize CodeQL - uses: github/codeql-action/init@407ffafae6a767df3e0230c3df91b6443ae8df75 # v2.22.8 + uses: github/codeql-action/init@305f6546310b9203e892c28c1484e82977f4f63d # v2.22.10 with: languages: ${{ matrix.language }} config-file: ./.github/codeql.yml setup-python-dependencies: false - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@407ffafae6a767df3e0230c3df91b6443ae8df75 # v2.22.8 + uses: github/codeql-action/analyze@305f6546310b9203e892c28c1484e82977f4f63d # v2.22.10 with: category: "/language:${{matrix.language}}" diff --git a/.github/workflows/push-github.yml b/.github/workflows/push-github.yml index 43a92ba11..e463a7799 100644 --- a/.github/workflows/push-github.yml +++ b/.github/workflows/push-github.yml @@ -23,7 +23,7 @@ jobs: with: name: BunkerWeb_documentation_v${{ inputs.VERSION }}.pdf # Create tag - - uses: rickstaa/action-create-tag@861755f3fcbce1b21a65c17bad10e7d35c27b6d9 # v1.7.1 + - uses: rickstaa/action-create-tag@a1c7777fcb2fee4f19b0f283ba888afa11678b72 # v1.7.2 name: Create tag if: inputs.VERSION != 'testing' with: @@ -31,7 +31,7 @@ jobs: message: "v${{ inputs.VERSION }}" force_push_tag: true # Create tag - - uses: rickstaa/action-create-tag@861755f3fcbce1b21a65c17bad10e7d35c27b6d9 # v1.7.1 + - uses: rickstaa/action-create-tag@a1c7777fcb2fee4f19b0f283ba888afa11678b72 # v1.7.2 name: Create tag if: inputs.VERSION == 'testing' with: diff --git a/.github/workflows/push-packagecloud.yml b/.github/workflows/push-packagecloud.yml index fe7912ea4..1a8f3eaed 100644 --- a/.github/workflows/push-packagecloud.yml +++ b/.github/workflows/push-packagecloud.yml @@ -42,7 +42,7 @@ jobs: - name: Check out repository code uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: Install ruby - uses: ruby/setup-ruby@8575951200e472d5f2d95c625da0c7bec8217c42 # v1.161.0 + uses: ruby/setup-ruby@af848b40be8bb463a751551a1180d74782ba8a72 # v1.162.0 with: ruby-version: "3.0" - name: Install packagecloud diff --git a/.github/workflows/scorecards-analysis.yml b/.github/workflows/scorecards-analysis.yml index 979021677..42053fc06 100644 --- a/.github/workflows/scorecards-analysis.yml +++ b/.github/workflows/scorecards-analysis.yml @@ -25,6 +25,6 @@ jobs: results_format: sarif publish_results: true - name: "Upload SARIF results to code scanning" - uses: github/codeql-action/upload-sarif@407ffafae6a767df3e0230c3df91b6443ae8df75 # v2.22.8 + uses: github/codeql-action/upload-sarif@305f6546310b9203e892c28c1484e82977f4f63d # v2.22.10 with: sarif_file: results.sarif diff --git a/.gitignore b/.gitignore index f8c5853af..a4deff667 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ env node_modules /src/ui/*.txt .mypy_cache +.cache/ diff --git a/CHANGELOG.md b/CHANGELOG.md index c5a9fd378..408284b51 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,8 +2,10 @@ ## v1.5.5 - YYYY/MM/DD +- [BUGFIX] Fix issues with the database when upgrading from version 1.5.3 and 1.5.4 to the most recent version - [FEATURE] Add Anonymous reporting feature -- [MISC] Updated ModSecurity to v3.0.11 +- [FEATURE] Add support for fallback Referrer-Policies +- [DEPS] Updated ModSecurity to v3.0.11 ## v1.5.4 - 2023/12/04 diff --git a/README.md b/README.md index f85a29af1..b4a8893b8 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@
-
+
@@ -18,39 +18,23 @@
-<<<<<<< Updated upstream
- π Website
+ π Website
|
- π Documentation
+ π€ Panel
|
- π¨βπ» Demo
+ π Documentation
|
- π‘οΈ Examples
-=======
- π Website
- |
- π Documentation
- |
- π¨βπ» Demo
- |
- π€ Panel
+ π¨βπ» Demo
|
π‘οΈ Examples
->>>>>>> Stashed changes
|
π¬ Chat
|
π Forum
-<<<<<<< Updated upstream
- βοΈ Configurator
+ βοΈ Configurator
|
- πΊοΈ Threatmap
-=======
- βοΈ Configurator
- |
- πΊοΈ Threatmap
->>>>>>> Stashed changes
+ πΊοΈ Threatmap
-
+
-A demo website protected with BunkerWeb is available at [demo.bunkerweb.io](https://demo.bunkerweb.io?utm_campaign=self&utm_source=github). Feel free to visit it and perform some security tests.
+A demo website protected with BunkerWeb is available at [demo.bunkerweb.io](https://demo.bunkerweb.io/?utm_campaign=self&utm_source=github). Feel free to visit it and perform some security tests.
-<<<<<<< Updated upstream
-=======
## Professional services
-Get the most of BunkerWeb by getting professional services directly from the maintainers of the project. From technical support to tailored consulting and development, we are here to assist you in the security of your web services.
+Maximize your BunkerWeb experience by getting professional services directly from the maintainers of the project. Whether you require technical support, personalized consulting, or development services, we stand ready to assist you in fortifying the security of your web services.
-You will find more information by visiting the [BunkerWeb Panel](https://panel.bunkerweb.io?utm_campaign=self&utm_source=github), our dedicated platform for professional services.
+You will find more information by visiting the [BunkerWeb Panel](https://panel.bunkerweb.io/?utm_campaign=self&utm_source=github), our dedicated platform for professional services.
Don't hesitate to [contact us](https://panel.bunkerweb.io/contact.php?utm_campaign=self&utm_source=github) if you have any question, we will be more than happy to respond to your needs.
->>>>>>> Stashed changes
+## Ecosystem, community and resources
+
+Official websites, tools and resources about BunkerWeb :
+
+- [**Website**](https://www.bunkerweb.io/?utm_campaign=self&utm_source=github) : get more information, news and articles about BunkerWeb
+- [**Panel**](https://panel.bunkerweb.io/?utm_campaign=self&utm_source=github) : dedicated platform to order and manage professional services (e.g. technical support) around BunkerWeb
+- [**Documentation**](https://docs.bunkerweb.io/?utm_campaign=self&utm_source=github) : technical documentation of the BunkerWeb solution
+- [**Demo**](https://demo.bunkerweb.io/?utm_campaign=self&utm_source=github) : demonstration website of BunkerWeb, don't hesitate to attempt attacks to test the robustness of the solution
+- [**Configurator**](https://config.bunkerweb.io/?utm_campaign=self&utm_source=github) : user-friendly tool to help you configure BunkerWeb
+- [**Threatmap**](https://threatmap.bunkerweb.io/?utm_campaign=self&utm_source=github) : live cyber attack blocked by BunkerWeb instances all around the world
+
+Community and social networks :
+
+- [**Discord**](https://discord.com/invite/fTf46FmtyD)
+- [**LinkedIn**](https://www.linkedin.com/company/bunkerity/)
+- [**Twitter**](https://twitter.com/bunkerity)
+- [**Reddit**](https://www.reddit.com/r/BunkerWeb/)
+
# Concepts
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- +
-A demo website protected with BunkerWeb is available at [demo.bunkerweb.io](https://demo.bunkerweb.io?utm_campaign=self&utm_source=doc). Feel free to visit it and perform some security tests. +A demo website protected with BunkerWeb is available at [demo.bunkerweb.io](https://demo.bunkerweb.io/?utm_campaign=self&utm_source=doc). Feel free to visit it and perform some security tests. ## Professional services @@ -66,3 +66,21 @@ Get the most of BunkerWeb by getting professional services directly from the mai You will find more information by visiting the [BunkerWeb Panel](https://panel.bunkerweb.io/?utm_campaign=self&utm_source=doc), our dedicated platform for professional services. Don't hesitate to [contact us](https://panel.bunkerweb.io/contact.php?utm_campaign=self&utm_source=doc) if you have any question, we will be more than happy to respond to your needs. + +## Ecosystem, community and resources + +Official websites, tools and resources about BunkerWeb : + +- [**Website**](https://www.bunkerweb.io/?utm_campaign=self&utm_source=doc) : get more information, news and articles about BunkerWeb +- [**Panel**](https://panel.bunkerweb.io/?utm_campaign=self&utm_source=doc) : dedicated platform to order and manage professional services (e.g. technical support) around BunkerWeb +- [**Documentation**](https://docs.bunkerweb.io) : technical documentation of the BunkerWeb solution +- [**Demo**](https://demo.bunkerweb.io/?utm_campaign=self&utm_source=doc) : demonstration website of BunkerWeb, don't hesitate to attempt attacks to test the robustness of the solution +- [**Configurator**](https://config.bunkerweb.io/?utm_campaign=self&utm_source=doc) : user-friendly tool to help you configure BunkerWeb +- [**Threatmap**](https://threatmap.bunkerweb.io/?utm_campaign=self&utm_source=doc) : live cyber attack blocked by BunkerWeb instances all around the world + +Community and social networks : + +- [**Discord**](https://discord.com/invite/fTf46FmtyD) +- [**LinkedIn**](https://www.linkedin.com/company/bunkerity/) +- [**Twitter**](https://twitter.com/bunkerity) +- [**Reddit**](https://www.reddit.com/r/BunkerWeb/) \ No newline at end of file diff --git a/docs/integrations.md b/docs/integrations.md index 577fe47a7..c97dde18f 100644 --- a/docs/integrations.md +++ b/docs/integrations.md @@ -654,7 +654,7 @@ metadata: name: cr-bunkerweb rules: - apiGroups: [""] - resources: ["services", "pods", "configmaps"] + resources: ["services", "pods", "configmaps", "secrets"] verbs: ["get", "watch", "list"] - apiGroups: ["networking.k8s.io"] resources: ["ingresses"] diff --git a/docs/json2md.py b/docs/json2md.py index daf052292..7ea963260 100755 --- a/docs/json2md.py +++ b/docs/json2md.py @@ -39,7 +39,7 @@ doc = StringIO() print("# Settings\n", file=doc) print( - '!!! info "Settings generator tool"\n\n To help you tune BunkerWeb, we have made an easy-to-use settings generator tool available at [config.bunkerweb.io](https://config.bunkerweb.io?utm_campaign=self&utm_source=doc).\n', + '!!! info "Settings generator tool"\n\n To help you tune BunkerWeb, we have made an easy-to-use settings generator tool available at [config.bunkerweb.io](https://config.bunkerweb.io/?utm_campaign=self&utm_source=doc).\n', file=doc, ) print( diff --git a/docs/professional-services.md b/docs/professional-services.md index a5fde998c..4f190c418 100644 --- a/docs/professional-services.md +++ b/docs/professional-services.md @@ -8,7 +8,7 @@ But dedicating time to a specific technology may not be easy depending on your b Getting professional services in addition to the open-source solution is the ideal solution to cover your business needs. You can focus on your top priorities and rely on a trusted partner when it comes to web security. -Please note that professionnal services are directly offered by [Bunkerity](https://www.bunkerity.com?utm_campaign=self&utm_source=doc), the company maintaining the BunkerWeb project, through our [BunkerWeb Panel](https://panel.bunkerweb.io/?utm_campaign=self&utm_source=doc) online platform. +Please note that professionnal services are directly offered by [Bunkerity](https://www.bunkerity.com/?utm_campaign=self&utm_source=doc), the company maintaining the BunkerWeb project, through our [BunkerWeb Panel](https://panel.bunkerweb.io/?utm_campaign=self&utm_source=doc) online platform. ## Which professional services do you offer ? diff --git a/docs/requirements.in b/docs/requirements.in index 9ecdddd44..b725557b6 100644 --- a/docs/requirements.in +++ b/docs/requirements.in @@ -1,5 +1,5 @@ mike==2.0.0 mkdocs==1.5.3 -mkdocs-material==9.4.14 +mkdocs-material[imaging]==9.5.2 mkdocs-print-site-plugin==2.3.6 pytablewriter==1.2.0 diff --git a/docs/requirements.txt b/docs/requirements.txt index 1e1b163b8..84e541c44 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -4,14 +4,76 @@ # # pip-compile --allow-unsafe --generate-hashes --strip-extras requirements.in # -babel==2.13.1 \ - --hash=sha256:33e0952d7dd6374af8dbf6768cc4ddf3ccfefc244f9986d4074704f2fbd18900 \ - --hash=sha256:7077a4984b02b6727ac10f1f7294484f737443d7e2e66c5e4380e41a3ae0b4ed +babel==2.14.0 \ + --hash=sha256:6919867db036398ba21eb5c7a0f6b28ab8cbc3ae7a73a44ebe34ae74a4e7d363 \ + --hash=sha256:efb1a25b7118e67ce3a259bed20545c29cb68be8ad2c784c83689981b7a57287 + # via mkdocs-material +cairocffi==1.6.1 \ + --hash=sha256:78e6bbe47357640c453d0be929fa49cd05cce2e1286f3d2a1ca9cbda7efdb8b7 \ + --hash=sha256:aa78ee52b9069d7475eeac457389b6275aa92111895d78fbaa2202a52dac112e + # via cairosvg +cairosvg==2.7.1 \ + --hash=sha256:432531d72347291b9a9ebfb6777026b607563fd8719c46ee742db0aef7271ba0 \ + --hash=sha256:8a5222d4e6c3f86f1f7046b63246877a63b49923a1cd202184c3a634ef546b3b # via mkdocs-material certifi==2023.11.17 \ --hash=sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1 \ --hash=sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474 # via requests +cffi==1.16.0 \ + --hash=sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc \ + --hash=sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a \ + --hash=sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417 \ + --hash=sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab \ + --hash=sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520 \ + --hash=sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36 \ + --hash=sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743 \ + --hash=sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8 \ + --hash=sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed \ + --hash=sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684 \ + --hash=sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56 \ + --hash=sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324 \ + --hash=sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d \ + --hash=sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235 \ + --hash=sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e \ + --hash=sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088 \ + --hash=sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000 \ + --hash=sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7 \ + --hash=sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e \ + --hash=sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673 \ + --hash=sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c \ + --hash=sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe \ + --hash=sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2 \ + --hash=sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098 \ + --hash=sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8 \ + --hash=sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a \ + --hash=sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0 \ + --hash=sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b \ + --hash=sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896 \ + --hash=sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e \ + --hash=sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9 \ + --hash=sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2 \ + --hash=sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b \ + --hash=sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6 \ + --hash=sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404 \ + --hash=sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f \ + --hash=sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0 \ + --hash=sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4 \ + --hash=sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc \ + --hash=sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936 \ + --hash=sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba \ + --hash=sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872 \ + --hash=sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb \ + --hash=sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614 \ + --hash=sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1 \ + --hash=sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d \ + --hash=sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969 \ + --hash=sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b \ + --hash=sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4 \ + --hash=sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627 \ + --hash=sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956 \ + --hash=sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357 + # via cairocffi chardet==5.2.0 \ --hash=sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7 \ --hash=sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970 @@ -116,12 +178,20 @@ colorama==0.4.6 \ --hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \ --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 # via mkdocs-material +cssselect2==0.7.0 \ + --hash=sha256:1ccd984dab89fc68955043aca4e1b03e0cf29cad9880f6e28e3ba7a74b14aa5a \ + --hash=sha256:fd23a65bfd444595913f02fc71f6b286c29261e354c41d722ca7a261a49b5969 + # via cairosvg dataproperty==1.0.1 \ --hash=sha256:0b8b07d4fb6453fcf975b53d35dea41f3cfd69c9d79b5010c3cf224ff0407a7a \ --hash=sha256:723e5729fa6e885e127a771a983ee1e0e34bb141aca4ffe1f0bfa7cde34650a4 # via # pytablewriter # tabledata +defusedxml==0.7.1 \ + --hash=sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69 \ + --hash=sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61 + # via cairosvg ghp-import==2.1.0 \ --hash=sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619 \ --hash=sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343 @@ -241,9 +311,9 @@ mkdocs==1.5.3 \ # -r requirements.in # mike # mkdocs-material -mkdocs-material==9.4.14 \ - --hash=sha256:a511d3ff48fa8718b033e7e37d17abd9cc1de0fdf0244a625ca2ae2387e2416d \ - --hash=sha256:dbc78a4fea97b74319a6aa9a2f0be575a6028be6958f813ba367188f7b8428f6 +mkdocs-material==9.5.2 \ + --hash=sha256:6ed0fbf4682491766f0ec1acc955db6901c2fd424c7ab343964ef51b819741f5 \ + --hash=sha256:ca8b9cd2b3be53e858e5a1a45ac9668bd78d95d77a30288bb5ebc1a31db6184c # via # -r requirements.in # mkdocs-print-site-plugin @@ -264,18 +334,92 @@ packaging==23.2 \ paginate==0.5.6 \ --hash=sha256:5e6007b6a9398177a7e1648d04fdd9f8c9766a1a945bceac82f1929e8c78af2d # via mkdocs-material -pathspec==0.11.2 \ - --hash=sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20 \ - --hash=sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3 +pathspec==0.12.1 \ + --hash=sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08 \ + --hash=sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712 # via mkdocs pathvalidate==3.2.0 \ --hash=sha256:5e8378cf6712bff67fbe7a8307d99fa8c1a0cb28aa477056f8fc374f0dff24ad \ --hash=sha256:cc593caa6299b22b37f228148257997e2fa850eea2daf7e4cc9205cef6908dee # via pytablewriter +pillow==9.5.0 \ + --hash=sha256:07999f5834bdc404c442146942a2ecadd1cb6292f5229f4ed3b31e0a108746b1 \ + --hash=sha256:0852ddb76d85f127c135b6dd1f0bb88dbb9ee990d2cd9aa9e28526c93e794fba \ + --hash=sha256:1781a624c229cb35a2ac31cc4a77e28cafc8900733a864870c49bfeedacd106a \ + --hash=sha256:1e7723bd90ef94eda669a3c2c19d549874dd5badaeefabefd26053304abe5799 \ + --hash=sha256:229e2c79c00e85989a34b5981a2b67aa079fd08c903f0aaead522a1d68d79e51 \ + --hash=sha256:22baf0c3cf0c7f26e82d6e1adf118027afb325e703922c8dfc1d5d0156bb2eeb \ + --hash=sha256:252a03f1bdddce077eff2354c3861bf437c892fb1832f75ce813ee94347aa9b5 \ + --hash=sha256:2dfaaf10b6172697b9bceb9a3bd7b951819d1ca339a5ef294d1f1ac6d7f63270 \ + --hash=sha256:322724c0032af6692456cd6ed554bb85f8149214d97398bb80613b04e33769f6 \ + --hash=sha256:35f6e77122a0c0762268216315bf239cf52b88865bba522999dc38f1c52b9b47 \ + --hash=sha256:375f6e5ee9620a271acb6820b3d1e94ffa8e741c0601db4c0c4d3cb0a9c224bf \ + --hash=sha256:3ded42b9ad70e5f1754fb7c2e2d6465a9c842e41d178f262e08b8c85ed8a1d8e \ + --hash=sha256:432b975c009cf649420615388561c0ce7cc31ce9b2e374db659ee4f7d57a1f8b \ + --hash=sha256:482877592e927fd263028c105b36272398e3e1be3269efda09f6ba21fd83ec66 \ + --hash=sha256:489f8389261e5ed43ac8ff7b453162af39c3e8abd730af8363587ba64bb2e865 \ + --hash=sha256:54f7102ad31a3de5666827526e248c3530b3a33539dbda27c6843d19d72644ec \ + --hash=sha256:560737e70cb9c6255d6dcba3de6578a9e2ec4b573659943a5e7e4af13f298f5c \ + --hash=sha256:5671583eab84af046a397d6d0ba25343c00cd50bce03787948e0fff01d4fd9b1 \ + --hash=sha256:5ba1b81ee69573fe7124881762bb4cd2e4b6ed9dd28c9c60a632902fe8db8b38 \ + --hash=sha256:5d4ebf8e1db4441a55c509c4baa7a0587a0210f7cd25fcfe74dbbce7a4bd1906 \ + --hash=sha256:60037a8db8750e474af7ffc9faa9b5859e6c6d0a50e55c45576bf28be7419705 \ + --hash=sha256:608488bdcbdb4ba7837461442b90ea6f3079397ddc968c31265c1e056964f1ef \ + --hash=sha256:6608ff3bf781eee0cd14d0901a2b9cc3d3834516532e3bd673a0a204dc8615fc \ + --hash=sha256:662da1f3f89a302cc22faa9f14a262c2e3951f9dbc9617609a47521c69dd9f8f \ + --hash=sha256:7002d0797a3e4193c7cdee3198d7c14f92c0836d6b4a3f3046a64bd1ce8df2bf \ + --hash=sha256:763782b2e03e45e2c77d7779875f4432e25121ef002a41829d8868700d119392 \ + --hash=sha256:77165c4a5e7d5a284f10a6efaa39a0ae8ba839da344f20b111d62cc932fa4e5d \ + --hash=sha256:7c9af5a3b406a50e313467e3565fc99929717f780164fe6fbb7704edba0cebbe \ + --hash=sha256:7ec6f6ce99dab90b52da21cf0dc519e21095e332ff3b399a357c187b1a5eee32 \ + --hash=sha256:833b86a98e0ede388fa29363159c9b1a294b0905b5128baf01db683672f230f5 \ + --hash=sha256:84a6f19ce086c1bf894644b43cd129702f781ba5751ca8572f08aa40ef0ab7b7 \ + --hash=sha256:8507eda3cd0608a1f94f58c64817e83ec12fa93a9436938b191b80d9e4c0fc44 \ + --hash=sha256:85ec677246533e27770b0de5cf0f9d6e4ec0c212a1f89dfc941b64b21226009d \ + --hash=sha256:8aca1152d93dcc27dc55395604dcfc55bed5f25ef4c98716a928bacba90d33a3 \ + --hash=sha256:8d935f924bbab8f0a9a28404422da8af4904e36d5c33fc6f677e4c4485515625 \ + --hash=sha256:8f36397bf3f7d7c6a3abdea815ecf6fd14e7fcd4418ab24bae01008d8d8ca15e \ + --hash=sha256:91ec6fe47b5eb5a9968c79ad9ed78c342b1f97a091677ba0e012701add857829 \ + --hash=sha256:965e4a05ef364e7b973dd17fc765f42233415974d773e82144c9bbaaaea5d089 \ + --hash=sha256:96e88745a55b88a7c64fa49bceff363a1a27d9a64e04019c2281049444a571e3 \ + --hash=sha256:99eb6cafb6ba90e436684e08dad8be1637efb71c4f2180ee6b8f940739406e78 \ + --hash=sha256:9adf58f5d64e474bed00d69bcd86ec4bcaa4123bfa70a65ce72e424bfb88ed96 \ + --hash=sha256:9b1af95c3a967bf1da94f253e56b6286b50af23392a886720f563c547e48e964 \ + --hash=sha256:a0aa9417994d91301056f3d0038af1199eb7adc86e646a36b9e050b06f526597 \ + --hash=sha256:a0f9bb6c80e6efcde93ffc51256d5cfb2155ff8f78292f074f60f9e70b942d99 \ + --hash=sha256:a127ae76092974abfbfa38ca2d12cbeddcdeac0fb71f9627cc1135bedaf9d51a \ + --hash=sha256:aaf305d6d40bd9632198c766fb64f0c1a83ca5b667f16c1e79e1661ab5060140 \ + --hash=sha256:aca1c196f407ec7cf04dcbb15d19a43c507a81f7ffc45b690899d6a76ac9fda7 \ + --hash=sha256:ace6ca218308447b9077c14ea4ef381ba0b67ee78d64046b3f19cf4e1139ad16 \ + --hash=sha256:b416f03d37d27290cb93597335a2f85ed446731200705b22bb927405320de903 \ + --hash=sha256:bf548479d336726d7a0eceb6e767e179fbde37833ae42794602631a070d630f1 \ + --hash=sha256:c1170d6b195555644f0616fd6ed929dfcf6333b8675fcca044ae5ab110ded296 \ + --hash=sha256:c380b27d041209b849ed246b111b7c166ba36d7933ec6e41175fd15ab9eb1572 \ + --hash=sha256:c446d2245ba29820d405315083d55299a796695d747efceb5717a8b450324115 \ + --hash=sha256:c830a02caeb789633863b466b9de10c015bded434deb3ec87c768e53752ad22a \ + --hash=sha256:cb841572862f629b99725ebaec3287fc6d275be9b14443ea746c1dd325053cbd \ + --hash=sha256:cfa4561277f677ecf651e2b22dc43e8f5368b74a25a8f7d1d4a3a243e573f2d4 \ + --hash=sha256:cfcc2c53c06f2ccb8976fb5c71d448bdd0a07d26d8e07e321c103416444c7ad1 \ + --hash=sha256:d3c6b54e304c60c4181da1c9dadf83e4a54fd266a99c70ba646a9baa626819eb \ + --hash=sha256:d3d403753c9d5adc04d4694d35cf0391f0f3d57c8e0030aac09d7678fa8030aa \ + --hash=sha256:d9c206c29b46cfd343ea7cdfe1232443072bbb270d6a46f59c259460db76779a \ + --hash=sha256:e49eb4e95ff6fd7c0c402508894b1ef0e01b99a44320ba7d8ecbabefddcc5569 \ + --hash=sha256:f8286396b351785801a976b1e85ea88e937712ee2c3ac653710a4a57a8da5d9c \ + --hash=sha256:f8fc330c3370a81bbf3f88557097d1ea26cd8b019d6433aa59f71195f5ddebbf \ + --hash=sha256:fbd359831c1657d69bb81f0db962905ee05e5e9451913b18b831febfe0519082 \ + --hash=sha256:fe7e1c262d3392afcf5071df9afa574544f28eac825284596ac6db56e6d11062 \ + --hash=sha256:fed1e1cf6a42577953abbe8e6cf2fe2f566daebde7c34724ec8803c4c0cda579 + # via + # cairosvg + # mkdocs-material platformdirs==4.1.0 \ --hash=sha256:11c8f37bcca40db96d8144522d925583bdb7a31f7b0e37e3ed4318400a8e2380 \ --hash=sha256:906d548203468492d432bcb294d4bc2fff751bf84971fbb2c10918cc206ee420 # via mkdocs +pycparser==2.21 \ + --hash=sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9 \ + --hash=sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206 + # via cffi pygments==2.17.2 \ --hash=sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c \ --hash=sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367 @@ -455,14 +599,6 @@ regex==2023.10.3 \ requests==2.31.0 \ --hash=sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f \ --hash=sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1 - # via - # importlib-metadata - # importlib-resources - -# The following packages are considered to be unsafe in a requirements file: -setuptools==69.0.2 \ - --hash=sha256:1e8fdff6797d3865f37397be788a4e3cba233608e9b509382a2777d25ebde7f2 \ - --hash=sha256:735896e78a4742605974de002ac60562d286fa8051a7e2299445e8e8fbb01aa6 # via mkdocs-material six==1.16.0 \ --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ @@ -476,6 +612,12 @@ tcolorpy==0.1.4 \ --hash=sha256:d0926480aa5012f34877d69fc3b670f207dc165674e68ad07458fa6ee5b12724 \ --hash=sha256:f0dceb1cb95e554cee63024b3cd2fd8d4628c568773de2d1e6b4f0478461901c # via pytablewriter +tinycss2==1.2.1 \ + --hash=sha256:2b80a96d41e7c3914b8cda8bc7f705a4d9c49275616e886103dd839dfc847847 \ + --hash=sha256:8cff3a8f066c2ec677c06dbc7b45619804a6938478d9d73c284b29d14ecb0627 + # via + # cairosvg + # cssselect2 typepy==1.3.2 \ --hash=sha256:b69fd48b9f50cdb3809906eef36b855b3134ff66c8893a4f8580abddb0b39517 \ --hash=sha256:d5d1022a424132622993800f1d2cd16cfdb691ac4e3b9c325f0fcb37799db1ae @@ -483,7 +625,6 @@ typepy==1.3.2 \ # dataproperty # pytablewriter # tabledata - # typepy urllib3==2.1.0 \ --hash=sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3 \ --hash=sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54 @@ -521,7 +662,21 @@ watchdog==3.0.0 \ --hash=sha256:d00e6be486affb5781468457b21a6cbe848c33ef43f9ea4a73b4882e5f188a44 \ --hash=sha256:d429c2430c93b7903914e4db9a966c7f2b068dd2ebdd2fa9b9ce094c7d459f33 # via mkdocs +webencodings==0.5.1 \ + --hash=sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78 \ + --hash=sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923 + # via + # cssselect2 + # tinycss2 zipp==3.17.0 \ --hash=sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31 \ --hash=sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0 + # via + # importlib-metadata + # importlib-resources + +# The following packages are considered to be unsafe in a requirements file: +setuptools==69.0.2 \ + --hash=sha256:1e8fdff6797d3865f37397be788a4e3cba233608e9b509382a2777d25ebde7f2 \ + --hash=sha256:735896e78a4742605974de002ac60562d286fa8051a7e2299445e8e8fbb01aa6 # via pytablewriter diff --git a/docs/settings.md b/docs/settings.md index 3078235ca..9d8ac806a 100644 --- a/docs/settings.md +++ b/docs/settings.md @@ -2,7 +2,7 @@ !!! info "Settings generator tool" - To help you tune BunkerWeb, we have made an easy-to-use settings generator tool available at [config.bunkerweb.io](https://config.bunkerweb.io?utm_campaign=self&utm_source=doc). + To help you tune BunkerWeb, we have made an easy-to-use settings generator tool available at [config.bunkerweb.io](https://config.bunkerweb.io/?utm_campaign=self&utm_source=doc). This section contains the full list of settings supported by BunkerWeb. If you are not yet familiar with BunkerWeb, you should first read the [concepts](concepts.md) section of the documentation. Please follow the instructions for your own [integration](integrations.md) on how to apply the settings. @@ -363,6 +363,7 @@ Miscellaneous settings. |`OPEN_FILE_CACHE_VALID` |`30s` |multisite|no |Open file cache valid time | |`EXTERNAL_PLUGIN_URLS` | |global |no |List of external plugins URLs (direct download to .zip or .tar file) to download and install (URLs are separated with space).| |`DENY_HTTP_STATUS` |`403` |global |no |HTTP status code to send when the request is denied (403 or 444). When using 444, BunkerWeb will close the connection. | +|`SEND_ANONYMOUS_REPORT` |`yes` |global |no |Send anonymous report to BunkerWeb maintainers. | ### ModSecurity diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md index d6a2fbb2d..281c76a18 100644 --- a/docs/troubleshooting.md +++ b/docs/troubleshooting.md @@ -1,5 +1,8 @@ # Troubleshooting +!!! info "BunkerWeb Panel" + If you are unable to resolve your problems, you can [contact us directly via our panel](https://panel.bunkerweb.io/?utm_campaign=self&utm_source=doc). This centralises all requests relating to the BunkerWeb solution. + ## Logs When troubleshooting, logs are your best friends. We try our best to provide user-friendly logs to help you understand what's happening. diff --git a/examples/kubernetes-tls/app1app2.crt b/examples/kubernetes-tls/app1app2.crt new file mode 100644 index 000000000..e7cce33ee --- /dev/null +++ b/examples/kubernetes-tls/app1app2.crt @@ -0,0 +1,30 @@ +-----BEGIN CERTIFICATE----- +MIIFOTCCAyGgAwIBAgIUDBbkHicmx8nqUQNnkDvx32hqmiswDQYJKoZIhvcNAQEL +BQAwLDEqMCgGA1UEAwwhYXBwMS5leGFtcGxlLmNvbSxhcHAyLmV4YW1wbGUuY29t +MB4XDTIzMTIxNzExMjg0NFoXDTMzMTIxNDExMjg0NFowLDEqMCgGA1UEAwwhYXBw +MS5leGFtcGxlLmNvbSxhcHAyLmV4YW1wbGUuY29tMIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA0PE86OpiyWSgQlm30SF737CM7+NIsUn0jo7RZUoB/rmM +jryWruQ/IZOH7TjKyPBemX+90q56ExIPthuGK6QTZBGpwNdGLRG7ghvKeJSWTkZv +8lYWx/ROSQZ5xRbJFMDyZAwjbhJhLlV2vV19vbC5NkgbBowSpMzwd9Ymy7ULazIQ +cQ7frZu4BNhLQ3aTuNktxT11tuvI4zOK6Ma0aoBWEMgyI/lYq/U61zLc0MOWVta1 +9Llo5AO90MN5+5pM0xZPgvVNsrwCyWga+cl/oykkimmzxRMA67t01ew8MheK6fFC +5sLqQPqSmelgkB/Ff3eaoxYhGgWYVx6jOg89zuW65wVbOVokq0pmlLWe48Ea6oTe +AC/+Xq2TWnzm/3RI10YSFTdzcslqO8H2e4Pa3oyj2kNk7JE8GHewCA9WL+SIP18t +GtbTAXonSHaseWu1Stelm43V/N2AViILv7aBNFHJ8iGWsOqSjJCVqymtOsmosZYZ +zosLSItNrTGtRTqj5v5gsynQrnEj2hM9nFVOsVSTHltMOj39nfrkcG70Vsn1Z7dB +mhm1hIDi0fZSPiLw1o/PsKdNOcfnmPX4ol4vW48HilBDINVaQAJMU016JgSOeBls +tGdCZWFceOdEwVy+12ATPolSaY8Ro6NtHW5r6ONcIkZi9Nccxjl5ETz9WalfyIEC +AwEAAaNTMFEwHQYDVR0OBBYEFHiUEzaEK6Iv6zQMopthSOfZpK5JMB8GA1UdIwQY +MBaAFHiUEzaEK6Iv6zQMopthSOfZpK5JMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI +hvcNAQELBQADggIBAAtXURD4HT3kMSscVByqUM4inJc3p8dGEAxAQRNBxN3VOkwA +melyRQ3SeBUJKnElGTtgMIW7JmEPdZdAcQiUZ2UEI7AKhMWACGg6LBGRNXATp1sA +GAzPgVqNVs+x2Iyif5kE9xWss+VE3PH17LMJMhqlpKcjkrrFwtmtRC2a1fGnDLtK +UoewUIjC/9qEKySQs3eyCCbjnJWDpvJaUrBpIUvjFHHus/UOYmCu7UBxSa31kku/ +cVpJVi0fODyA5VH606AS4fR9XQBDF80FYH7dr+jkXcMmh9FAl5AsvPeP7nhcX/nM +fwlEHT6/TOX0xw8c5P+sKmJASBt/Lvc+pFWxNRLlF9SWcskXT3wf5hoz8qRS89ip +567cPDquOHmG4qg2c0f8I2mNomxVl4TW4fjSqtvsoIQDDTzyXBBG1pMMhQMNcjGI +twpusIdIQHTkR6heBfmSjGSkh6c4bXw44QWl1kq0+uouKF2aFajAUmRq3MC+r6iP +yg1zBpPkNMICfCyekhY1N3THfU9bhEBtvbIqobuTGp2OyekBShOkpXfeLp1hDIPh +10RQU3lzE4/fipja+t/IiBxAJ20MSsHOFvPRpX2Q6/7584eguA5hAsflQw1PIXj5 +wOi4cm6tx3xVWzhuRHa6oUBtSS/IjRX55lcWFE8xYXqulpHM2rP/KAsCKu3N +-----END CERTIFICATE----- diff --git a/examples/kubernetes-tls/app1app2.key b/examples/kubernetes-tls/app1app2.key new file mode 100644 index 000000000..80df378b0 --- /dev/null +++ b/examples/kubernetes-tls/app1app2.key @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +MIIJQgIBADANBgkqhkiG9w0BAQEFAASCCSwwggkoAgEAAoICAQDQ8Tzo6mLJZKBC +WbfRIXvfsIzv40ixSfSOjtFlSgH+uYyOvJau5D8hk4ftOMrI8F6Zf73SrnoTEg+2 +G4YrpBNkEanA10YtEbuCG8p4lJZORm/yVhbH9E5JBnnFFskUwPJkDCNuEmEuVXa9 +XX29sLk2SBsGjBKkzPB31ibLtQtrMhBxDt+tm7gE2EtDdpO42S3FPXW268jjM4ro +xrRqgFYQyDIj+Vir9TrXMtzQw5ZW1rX0uWjkA73Qw3n7mkzTFk+C9U2yvALJaBr5 +yX+jKSSKabPFEwDru3TV7DwyF4rp8ULmwupA+pKZ6WCQH8V/d5qjFiEaBZhXHqM6 +Dz3O5brnBVs5WiSrSmaUtZ7jwRrqhN4AL/5erZNafOb/dEjXRhIVN3NyyWo7wfZ7 +g9rejKPaQ2TskTwYd7AID1Yv5Ig/Xy0a1tMBeidIdqx5a7VK16WbjdX83YBWIgu/ +toE0UcnyIZaw6pKMkJWrKa06yaixlhnOiwtIi02tMa1FOqPm/mCzKdCucSPaEz2c +VU6xVJMeW0w6Pf2d+uRwbvRWyfVnt0GaGbWEgOLR9lI+IvDWj8+wp005x+eY9fii +Xi9bjweKUEMg1VpAAkxTTXomBI54GWy0Z0JlYVx450TBXL7XYBM+iVJpjxGjo20d +bmvo41wiRmL01xzGOXkRPP1ZqV/IgQIDAQABAoICAQCtnhcnz0Ng532HRLfKThF5 +sWGbH/hSYQqWvrPef52ixRm3rZtkHgMbalTDWLKgP6PL1uqruxFy8Uoe30Yg00jN +mSO+OuN0JczycxdOFOHEjyEMdF6frjCy22+pxqI13ZJMcg2qtBkOgDOXbK1ERynP +oiDa0t/XEvgqC8fW80xWuZYR6/MPdlp1pCj+GPTs34H56HT9F3Wo3TZq8FoQOS3K +6h9H5zS4RqCrGveDfVJaPDWb8cjn1vgOFbAx0mhN6rcNMbprb3C9XQU1VCr8L/7O +CME5W+4i83RFIfRvB0MF29TknUg70DqrK9JyUAQzQ/Y51/SPg+CvW6T0ZJ/OYPRo +7HfNGk1+yhou2wvZnC9OqI98tZBniO5fEdcUCguaZZWW7jwMpONk0cI8sm6NoWpy +uiIb2W5jNlOpXqBx/0veejfDtfso7MvkPY/hwppw++DY331au2rsLsDbXUx96SOJ +d7PyflXNjrrzSTO5X6UyQiYNl1/EaBQjQN/R9YxyC2uS+UsM5UesB5Tg++jER6HL +mT6cccE5YLjbdTfT9TDvgNIgB2tS1mnBvI4nObaMX/JuASyMYUEoQQsiNPtuElqC +U7DXkgMKHd6qlrsVMxrIyih3UNjtyQZBQcokP4UcW5hIzTLyrNPyBSzh6QUbs4Kn +lL9PyYYcDEXlMP30i+M3AQKCAQEA7ccgjMYIYq2qv8X/G15ZmWdw5+Hz16S58KzE +n0mVF4Ht16mBDfrQve0h5nn6/h33bffpgxKigmM0b+vEzgPtPSlNhaLCE4Kt7SZn +NuRVHJ74nHXsTi+Z0ZSkgeKwBRmji5TN7PBEoVdaExhM/qGnwG7x5CQNLQ0O1w2J +5b6ywGnghjlhHRI5uGdmHy2n6N5Rj37OFrLVOLdEexy351ogZY74673BXGVjLNe2 +UMM6CazE00gDwKv0rOniZv732O8MVaOMR6CYG3z7TgfVGESWS1mEGTrkbLgGbT4X +naGhUH90+AKZwD2LmMJPbQR5PhwcmaCx/xgPj1RWRl4zemDjsQKCAQEA4PRl41Wd +Yiirgc41oXC3hk/cMtCsz+Cz8WL7pCRJL3hvX/Z+7Pp6eMeiHBnaObjZNUY/eC+s +I1i4tCShMnqSddm/YnvgiS1UsDF2N4Xm0oR0PfK0jcQDq/IYyxCJmp56ZJ8y1c5W +v9wvJ+7U/AELjuqkGiZ0w0wDGtdNdFVbUSjyf385Dmq0D19rrl3Y9OmoDaECYVdS +L7/8hjIgmT09+Yrf05+IlEo/f6aPjM1xi6WYC3+aQOp3yjW6oSPEZZuc2WfVyhss +AiDSwbqu1nxS5WswOTGKmirl3btACafOK8x/czeoqM8Wjju8HAG1btlUT4BzLNVk +GZR14iJcFxZ10QKCAQBri6czRNbCGx6hwqIR9Oi9s8Wje9VYcc8QBnSgPx3KFiBH +bQlME2ean8i3f/CAQ3mIKZtah3EtXEV5YcAQFkKVaTsA+I6jWHXmT3pbn4bHfTeh +PMz2yBzgaETH4ooOpHwOQ+2n/zxrZSD+hf09JkzDguqxb4TuHXva1OrMGSasVLcS +vp0oEvg8abgM3g+WCggFySrZpWU/U9ULgf/ECkWg6bu4lIkCi3EB9Ucm3EZB3fzg +OzBHUv9FvjuCrkvXuLdxfJmURBTISg04S96cLVl1FzXiW3q5mbp+apkv2M0npZ54 +FmUISE39d9WIz38vEnP1IHOhl3ZiM5kaFr1d2rjhAoIBAGOtB0R/GBh5at0+cNcS +6c7yreA6RIhryW/I6zWk+mS1WaxMvZrltcS0uGj5L4/qDxyi/taTURPsaRMxM9f5 +JdJgZIQP3cMKuf7EO9yIUWmwVQ1p8ITseLAEuuWnc0F2vUa+n7jLD/c9aguosOjk +0alG4OXRamVq1elbwy8r7yV8Hk9OIQr5TsWNA1qkrNCAg/1d/X8CQSF1UUBpD7a2 +wzJCTcEobE1AxPgb5nl+QrSc8E0QAlqHSgLoYcSq44geNpbCgqFl/s8GmjxLKtNR +DS4om5qMEB0Vqvrf0JU2rI0NtN9ppyr9b8IgR86lFy6Bz/DWOrJ/7zXCaaWEkgeM +5TECggEAKSvloR9pVm0nzvN3e4Xtjj01rVUZOU667lUT3TAeDycTTLK4tXsYR47V +olDmKwIN7YL/U6WAm1ClE+DGMnt27hKeIBctKJXiiIqK7hlAAOmk6nCWUXU7yCgb +RkV9DTXHQ4gEtzgU0kx0r9pTydc19rMAanl7fgiNUNc+RcHeNSH9hoWPTGpOb5Om +R4LuAJSewMdtnYFa7Xu3P7QjT7b0d7ARGnF1OrjKA9Nqm65D3bh8hlikANrGkM+k +pPM2BJiTnh6vLYMh5TBMSFNLJPUKItyTaIz2CVFdWE5ipV3UPjj8beYsFDt24XmC +FI88g7aCJHlP2wvuyZiPnOtCdGVVKw== +-----END PRIVATE KEY----- diff --git a/examples/kubernetes-tls/app3.crt b/examples/kubernetes-tls/app3.crt new file mode 100644 index 000000000..144da26d0 --- /dev/null +++ b/examples/kubernetes-tls/app3.crt @@ -0,0 +1,30 @@ +-----BEGIN CERTIFICATE----- +MIIFFzCCAv+gAwIBAgIUETXxobflxWhnHIL/u7KBRE/y4eswDQYJKoZIhvcNAQEL +BQAwGzEZMBcGA1UEAwwQYXBwMy5leGFtcGxlLmNvbTAeFw0yMzEyMTcxMTMwMTda +Fw0zMzEyMTQxMTMwMTdaMBsxGTAXBgNVBAMMEGFwcDMuZXhhbXBsZS5jb20wggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDEq6OCSCs3Uyswq4sH8FWfd4oR +ssX/qIzu5FwTjpvFKOa/d+b6rnWC2SR6RKKmR47bwGBx2jvQIOZ118ta0rKtws0F +AHYXgwxTpuljz3vESrybXxUA7Pmjiog2zvGkKIKHAOZdjwRbDQBvceocurChKn3V +t8CjKSGecq6qN4dh0xPwEIWAsIpIsnrMSI3JbjCDlUe7SKEcWYKcFZfgm71KBYnD +gwTTFaRnzrVWLyvqJ/wfQldCzmbGJ5cR6CsF9Keu/KQelJxQA9SEqqxLzU04dHOB +wYJVyBWL6m2udh6qWRRP3FwAdX6QB9cT0ql/JwxirS/+kBmHAKS8K+iTxl7JzaDw +hxwfjJkTNiw3mMnvah6L7SHAKVd53UXt1lc6vsz02/4cIiNxCA/k9TKWwYb6ogl0 +MenPPjfmSDp2zEHX9FP/xbJgnO9wPdzO1nQrVKFRynrC5tlnmzU9DKpn+dflKvmQ +/hqFwu//ZUnCfyApdrtF7ICj+mngJkD8M6aJ4ALDhXpOjPzIMxLe/b+vArPhOVIj +CEUSUg6u3eDuksKKS+0fBZgrrYhHpBNNiLXzD7rAXoAKOWorAgshdSlsLbWcEfm7 +RhiwXIfqK/Ykk0YOQRLlowRJuHU17w+8nfnGz80GL9ZN06AE3o7uCLem4FS0WK22 +3I8WKJWY3opjD6FdyQIDAQABo1MwUTAdBgNVHQ4EFgQUnyUyfZmtc1z0AtSo8AS2 +SHklcV4wHwYDVR0jBBgwFoAUnyUyfZmtc1z0AtSo8AS2SHklcV4wDwYDVR0TAQH/ +BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAn4OP9GNeUl42T1mPewQa8x1jbFj/ +klALcY1onrUFbpLHceFljyOLkDL+XufXGZ842h1/g4PVFQZlCku6qUaSNc9pz6JX +48olhJODV4+HZXh3KUpCDBXNxywnnKw+dF60imDPp7TdL2wdCSZAyH7pkbFlXsPU +B9SWLemyr/aX+/z3qD7OC6q1sHH9h7asRXbXycowROZozDCSVQKITC8P4avzbLJ9 +yrUgjHyj2ymxMUOGs65fnKr1/xrMLjYyjN8v9OMVEh02+qO4pOhz4WCEEur1zIC1 +X24YUhnX4QNJ4Qi1qwidAbBIZrXt4PW2i4Mw2eQO1RU1w81pz8vY725l2GygFG3N +DhEkAdILJ99KUN0YlU7BAPsCU5pe+uA40uBe5Oti9PAlEnvH4i49p34JKjZ4q30e +FIy5VjuCkmVlSzUfRQhZ8QRz2hdK/hJY6Pwo63UP7Mb1tup8hmEcfZATotMjUK4U +d+BYe6OFw50s2s6uMiVuu2Wb2sWsP5gOk9SkaCKbvQa4Miu/kWKbvT9Pb81u544t +XoqVO2d83uOm5FTM+gFgMDtJDK/poqIXho6MDnUES1SoUZgY2XRHLOBvCAms9SIW +HCzbrzSqs8P6UxaiV59Ht3toL/xQmR/skfrn/QUYdsSh9dtOStkHUOzzepkTroj0 +MZUb2FnSikWBzcI= +-----END CERTIFICATE----- diff --git a/examples/kubernetes-tls/app3.key b/examples/kubernetes-tls/app3.key new file mode 100644 index 000000000..fc38a7359 --- /dev/null +++ b/examples/kubernetes-tls/app3.key @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQDEq6OCSCs3Uysw +q4sH8FWfd4oRssX/qIzu5FwTjpvFKOa/d+b6rnWC2SR6RKKmR47bwGBx2jvQIOZ1 +18ta0rKtws0FAHYXgwxTpuljz3vESrybXxUA7Pmjiog2zvGkKIKHAOZdjwRbDQBv +ceocurChKn3Vt8CjKSGecq6qN4dh0xPwEIWAsIpIsnrMSI3JbjCDlUe7SKEcWYKc +FZfgm71KBYnDgwTTFaRnzrVWLyvqJ/wfQldCzmbGJ5cR6CsF9Keu/KQelJxQA9SE +qqxLzU04dHOBwYJVyBWL6m2udh6qWRRP3FwAdX6QB9cT0ql/JwxirS/+kBmHAKS8 +K+iTxl7JzaDwhxwfjJkTNiw3mMnvah6L7SHAKVd53UXt1lc6vsz02/4cIiNxCA/k +9TKWwYb6ogl0MenPPjfmSDp2zEHX9FP/xbJgnO9wPdzO1nQrVKFRynrC5tlnmzU9 +DKpn+dflKvmQ/hqFwu//ZUnCfyApdrtF7ICj+mngJkD8M6aJ4ALDhXpOjPzIMxLe +/b+vArPhOVIjCEUSUg6u3eDuksKKS+0fBZgrrYhHpBNNiLXzD7rAXoAKOWorAgsh +dSlsLbWcEfm7RhiwXIfqK/Ykk0YOQRLlowRJuHU17w+8nfnGz80GL9ZN06AE3o7u +CLem4FS0WK223I8WKJWY3opjD6FdyQIDAQABAoICABxlA4htzv9/3H58ZehRhKsv +YRnJC9krhp1/DuQr9MV0cEw4jXqn8YNgwml8u1bygeesUMBfV79m4J8m9s84GGAJ +/fu441PlscPqF0w3ypC+kZiFE808aZZ5C82N90lSJ/ZB5QChA2n56JQuiDR5p8K9 +Fcnja8aiy53KxPkCZ2NyTDCe0geQdYalbiFMYFwysoJs7RxXEhu7uKW8YF8nXR7w +ycEWi33GZCQwrfGxgc+e0kHZHCwjDKeTU7ZcJMoJVqRnCXL41dCfnPFCivmuvHVo +Kr0TKTQlXScEQ62qlCbYEZyuHgJa9FjrKNxNz/bxtlIQ2xsPxv+80gvw8vVS8KBF +KKZQ5R7SuCT1tGveHk3MEO8yUXj+LNB4H4xNK5LHcBc5ZFH5mcop5kkk4rnR+1pK +LFH1jpy1vdNEAeHNKbJAxrec1Z4NKs4Lwv6n5/b4EsoFwNlFM9IJ6dNqijMJXlsC +It9byyjKpcY/8w89EgN00aae4xPSBJTQU/gFgnUJmP+YD6i7B3/WCsZfnFeuj7qM +2T8Qxhf5R4/aNOqf0mCyV14HmglFygAzTin/e5fiEA1Pk8bc3+CHWmmfNIURq2kr +gQOg5k6R46P/93zLs6kZyLD4UL/7kn2rOIIlQqrbityaIppUNka7kxcD7h0R+yJW +lKLTMoEHPinkaM2X125ZAoIBAQD1ZZ7eeTsIdW5AcG+U1J690SGu03MHQAyZ+a0L +WOhVJn21lEuCTCu0dKcNSXET5ZLkzUmXt0UKJ20IZL1Az7cDekNvtNoTFDYrl1e7 +uH52TuoUxxiANkDlTm5dSqA44flzNtG1rPcjNBbW6IRWAUQGSzOWPzJHAO2H4Wa4 +m1m0YzwFz8PC5A1/NX8/BHsTYiIFsmf3o1I6M3HnrqHkftZmIVKataRZadDLpbTp +426kpY8WnnV9udXMPHmvBZ+P3kKjKc99oY/u4mtnPReBj0LIz+3Smc6cUpkdq/EI +VK2xCvFm/uJN93iLPyx2HJUf+bu/f+GvH8Fz8KCe/0PpKCv7AoIBAQDNKwu0jlaI +Y0mtrJZvXUPWtK3ZNUQ24BuVcCvi99R391f++oZ+g8ib1SqqLGNmY3DJ4WsbLtpi +9toPDLT4mgZAUEhjRLY+S0IeXTVxdN/JOZ6eMamyM3x75efWPILhxLk4AeibGIha +L5Ln2CWlDjc7mGZNjUn0HbXvdwEtDnlhoAnFDpKCOxEFt+r2cke3D0StpnFdcDfp +jL8NHmsSPBz2TFtMhtczkFB/1pc5Grf+3LemHQmKpOCfFQcS+VCI1UU5gfhkr6IS +ycCvvdioSwmolqhaBzug9yCx1pUL9s2FaiWIMzvvsy63lZkEC9009Zy5rGo0RWN8 +Hr5HllKXs04LAoIBAQDPHyV3W1VzL0KOSxgywz70sZY/bCNThEDemTjwMetvK1zB +LNiKsmXVGvyAn3M8uvFAAvFRh5NTHbHOetCt6mPrIH/YwgmqPs31/vhC7lZ23uZ+ +AQlx9djScl9+iGUxfbHBCAz6zXGOmgGJBJnlyY2zzjdNYiu6eFMD9EByIlUVhwh7 +U0BEt52Yt/udodeLpbFXo5xTDNtzWkaSqPfl1xR5ATkqcZO1EDX2HPfUzWxutXpP +OhGqu3Zzurtt+U4S7SLLepexzvKgSyUh7xNu/A7/VVjC/6S+loy72YtIX8h2fOkB +6LHz4qMwzHJngnpvkaZg3LwMxr3OcNPxPzz/hzOPAoIBAQCQ6s3KzBtdHNyG+vgL +U1I+jsKZQOGc7TEundux5qHB1wjlxmlHZahGQgxvxQi04pphToLL4Y1KB9jAdpZB +XvH5bXuj+n3LhHcAYZAFQqtrQ/LBBI07nNhZ32uhTH6aH81APUDihDKTmTTn5Cm6 +606iHqRsNNc+wdmnemRvQeEEzvj3orJjoHsGkgE58ECtkfBNw9ohSMmFgu/TwV+Z +srI2WnrGlBvfhRkHIzkPkcrTD238vFfoAUvTshOcGFQFQrcxxpb/73rIUI900uD9 +BnudBEWHycIZkVUbqFkA6WQDz5URHjdAuUzPSbCaRhMKfE4mbB1cLIL3wfNfN1PB +aVo/AoIBAFISVR5sVewY2uBu9a4eb64p/30g+BaOmvhVt2gLfm65sCCLzYH4GjcW +ZI1IPvf7NtTfKa/RvNEGcGs2GYyWhUu4GlC5t3oKDyZo66oHSeM005nDbsMszaeQ +m1c0eGj8NsSf+3GHxTwVAtxwOlEkznxLE+dZADD49DJSG9B/FnG/0g6LGfOxSWRk +J3iQAUTriVRKcIxBmYe/BUxtyfkwEv3Wjc7W5LMRzT87pljd2i4jy1fxSqXCH9Wy +tButCdI31UcQdZ9jrPydCy5eJng087pHSMvsVHv/CDP3aka5HQU/tCMERsaFJKiS +l2qeGi6z5g40o9wd3s0sBaPePtZ7dUY= +-----END PRIVATE KEY----- diff --git a/examples/kubernetes-tls/kubernetes.yml b/examples/kubernetes-tls/kubernetes.yml new file mode 100644 index 000000000..9fbe5d805 --- /dev/null +++ b/examples/kubernetes-tls/kubernetes.yml @@ -0,0 +1,164 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: ingress +spec: + tls: + - hosts: + - app1.example.com + - app2.example.com + secretName: secret-tls-app1app2 + - hosts: + - app3.example.com + secretName: secret-tls-app3 + rules: + - host: app1.example.com + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: svc-app1 + port: + number: 80 + - host: app2.example.com + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: svc-app2 + port: + number: 80 + - host: app3.example.com + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: svc-app3 + port: + number: 80 +--- +apiVersion: v1 +kind: Secret +metadata: + name: secret-tls-app1app2 +data: + tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZPVENDQXlHZ0F3SUJBZ0lVREJia0hpY214OG5xVVFObmtEdngzMmhxbWlzd0RRWUpLb1pJaHZjTkFRRUwKQlFBd0xERXFNQ2dHQTFVRUF3d2hZWEJ3TVM1bGVHRnRjR3hsTG1OdmJTeGhjSEF5TG1WNFlXMXdiR1V1WTI5dApNQjRYRFRJek1USXhOekV4TWpnME5Gb1hEVE16TVRJeE5ERXhNamcwTkZvd0xERXFNQ2dHQTFVRUF3d2hZWEJ3Ck1TNWxlR0Z0Y0d4bExtTnZiU3hoY0hBeUxtVjRZVzF3YkdVdVkyOXRNSUlDSWpBTkJna3Foa2lHOXcwQkFRRUYKQUFPQ0FnOEFNSUlDQ2dLQ0FnRUEwUEU4Nk9waXlXU2dRbG0zMFNGNzM3Q003K05Jc1VuMGpvN1JaVW9CL3JtTQpqcnlXcnVRL0laT0g3VGpLeVBCZW1YKzkwcTU2RXhJUHRodUdLNlFUWkJHcHdOZEdMUkc3Z2h2S2VKU1dUa1p2CjhsWVd4L1JPU1FaNXhSYkpGTUR5WkF3amJoSmhMbFYydlYxOXZiQzVOa2diQm93U3BNendkOVlteTdVTGF6SVEKY1E3ZnJadTRCTmhMUTNhVHVOa3R4VDExdHV2STR6T0s2TWEwYW9CV0VNZ3lJL2xZcS9VNjF6TGMwTU9XVnRhMQo5TGxvNUFPOTBNTjUrNXBNMHhaUGd2Vk5zcndDeVdnYStjbC9veWtraW1tenhSTUE2N3QwMWV3OE1oZUs2ZkZDCjVzTHFRUHFTbWVsZ2tCL0ZmM2Vhb3hZaEdnV1lWeDZqT2c4OXp1VzY1d1ZiT1Zva3EwcG1sTFdlNDhFYTZvVGUKQUMvK1hxMlRXbnptLzNSSTEwWVNGVGR6Y3NscU84SDJlNFBhM295ajJrTms3SkU4R0hld0NBOVdMK1NJUDE4dApHdGJUQVhvblNIYXNlV3UxU3RlbG00M1YvTjJBVmlJTHY3YUJORkhKOGlHV3NPcVNqSkNWcXltdE9zbW9zWllaCnpvc0xTSXROclRHdFJUcWo1djVnc3luUXJuRWoyaE05bkZWT3NWU1RIbHRNT2ozOW5mcmtjRzcwVnNuMVo3ZEIKbWhtMWhJRGkwZlpTUGlMdzFvL1BzS2ROT2Nmbm1QWDRvbDR2VzQ4SGlsQkRJTlZhUUFKTVUwMTZKZ1NPZUJscwp0R2RDWldGY2VPZEV3VnkrMTJBVFBvbFNhWThSbzZOdEhXNXI2T05jSWtaaTlOY2N4amw1RVR6OVdhbGZ5SUVDCkF3RUFBYU5UTUZFd0hRWURWUjBPQkJZRUZIaVVFemFFSzZJdjZ6UU1vcHRoU09mWnBLNUpNQjhHQTFVZEl3UVkKTUJhQUZIaVVFemFFSzZJdjZ6UU1vcHRoU09mWnBLNUpNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEUVlKS29aSQpodmNOQVFFTEJRQURnZ0lCQUF0WFVSRDRIVDNrTVNzY1ZCeXFVTTRpbkpjM3A4ZEdFQXhBUVJOQnhOM1ZPa3dBCm1lbHlSUTNTZUJVSktuRWxHVHRnTUlXN0ptRVBkWmRBY1FpVVoyVUVJN0FLaE1XQUNHZzZMQkdSTlhBVHAxc0EKR0F6UGdWcU5Wcyt4Mkl5aWY1a0U5eFdzcytWRTNQSDE3TE1KTWhxbHBLY2prcnJGd3RtdFJDMmExZkduREx0SwpVb2V3VUlqQy85cUVLeVNRczNleUNDYmpuSldEcHZKYVVyQnBJVXZqRkhIdXMvVU9ZbUN1N1VCeFNhMzFra3UvCmNWcEpWaTBmT0R5QTVWSDYwNkFTNGZSOVhRQkRGODBGWUg3ZHIramtYY01taDlGQWw1QXN2UGVQN25oY1gvbk0KZndsRUhUNi9UT1gweHc4YzVQK3NLbUpBU0J0L0x2YytwRld4TlJMbEY5U1djc2tYVDN3ZjVob3o4cVJTODlpcAo1NjdjUERxdU9IbUc0cWcyYzBmOEkybU5vbXhWbDRUVzRmalNxdHZzb0lRRERUenlYQkJHMXBNTWhRTU5jakdJCnR3cHVzSWRJUUhUa1I2aGVCZm1TakdTa2g2YzRiWHc0NFFXbDFrcTArdW91S0YyYUZhakFVbVJxM01DK3I2aVAKeWcxekJwUGtOTUlDZkN5ZWtoWTFOM1RIZlU5YmhFQnR2Yklxb2J1VEdwMk95ZWtCU2hPa3BYZmVMcDFoRElQaAoxMFJRVTNsekU0L2ZpcGphK3QvSWlCeEFKMjBNU3NIT0Z2UFJwWDJRNi83NTg0ZWd1QTVoQXNmbFF3MVBJWGo1CndPaTRjbTZ0eDN4Vld6aHVSSGE2b1VCdFNTL0lqUlg1NWxjV0ZFOHhZWHF1bHBITTJyUC9LQXNDS3UzTgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg== + tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUpRZ0lCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQ1N3d2dna29BZ0VBQW9JQ0FRRFE4VHpvNm1MSlpLQkMKV2JmUklYdmZzSXp2NDBpeFNmU09qdEZsU2dIK3VZeU92SmF1NUQ4aGs0ZnRPTXJJOEY2WmY3M1Nybm9URWcrMgpHNFlycEJOa0VhbkExMFl0RWJ1Q0c4cDRsSlpPUm0veVZoYkg5RTVKQm5uRkZza1V3UEprRENOdUVtRXVWWGE5ClhYMjlzTGsyU0JzR2pCS2t6UEIzMWliTHRRdHJNaEJ4RHQrdG03Z0UyRXREZHBPNDJTM0ZQWFcyNjhqak00cm8KeHJScWdGWVF5RElqK1ZpcjlUclhNdHpRdzVaVzFyWDB1V2prQTczUXczbjdta3pURmsrQzlVMnl2QUxKYUJyNQp5WCtqS1NTS2FiUEZFd0RydTNUVjdEd3lGNHJwOFVMbXd1cEErcEtaNldDUUg4Vi9kNXFqRmlFYUJaaFhIcU02CkR6M081YnJuQlZzNVdpU3JTbWFVdFo3andScnFoTjRBTC81ZXJaTmFmT2IvZEVqWFJoSVZOM055eVdvN3dmWjcKZzlyZWpLUGFRMlRza1R3WWQ3QUlEMVl2NUlnL1h5MGExdE1CZWlkSWRxeDVhN1ZLMTZXYmpkWDgzWUJXSWd1Lwp0b0UwVWNueUlaYXc2cEtNa0pXckthMDZ5YWl4bGhuT2l3dElpMDJ0TWExRk9xUG0vbUN6S2RDdWNTUGFFejJjClZVNnhWSk1lVzB3NlBmMmQrdVJ3YnZSV3lmVm50MEdhR2JXRWdPTFI5bEkrSXZEV2o4K3dwMDA1eCtlWTlmaWkKWGk5Ymp3ZUtVRU1nMVZwQUFreFRUWG9tQkk1NEdXeTBaMEpsWVZ4NDUwVEJYTDdYWUJNK2lWSnBqeEdqbzIwZApibXZvNDF3aVJtTDAxeHpHT1hrUlBQMVpxVi9JZ1FJREFRQUJBb0lDQVFDdG5oY256ME5nNTMySFJMZktUaEY1CnNXR2JIL2hTWVFxV3ZyUGVmNTJpeFJtM3JadGtIZ01iYWxURFdMS2dQNlBMMXVxcnV4Rnk4VW9lMzBZZzAwak4KbVNPK091TjBKY3p5Y3hkT0ZPSEVqeUVNZEY2ZnJqQ3kyMitweHFJMTNaSk1jZzJxdEJrT2dET1hiSzFFUnluUApvaURhMHQvWEV2Z3FDOGZXODB4V3VaWVI2L01QZGxwMXBDaitHUFRzMzRINTZIVDlGM1dvM1RacThGb1FPUzNLCjZoOUg1elM0UnFDckd2ZURmVkphUERXYjhjam4xdmdPRmJBeDBtaE42cmNOTWJwcmIzQzlYUVUxVkNyOEwvN08KQ01FNVcrNGk4M1JGSWZSdkIwTUYyOVRrblVnNzBEcXJLOUp5VUFRelEvWTUxL1NQZytDdlc2VDBaSi9PWVBSbwo3SGZOR2sxK3lob3Uyd3ZabkM5T3FJOTh0WkJuaU81ZkVkY1VDZ3VhWlpXVzdqd01wT05rMGNJOHNtNk5vV3B5CnVpSWIyVzVqTmxPcFhxQngvMHZlZWpmRHRmc283TXZrUFkvaHdwcHcrK0RZMzMxYXUycnNMc0RiWFV4OTZTT0oKZDdQeWZsWE5qcnJ6U1RPNVg2VXlRaVlObDEvRWFCUWpRTi9SOVl4eUMydVMrVXNNNVVlc0I1VGcrK2pFUjZITAptVDZjY2NFNVlMamJkVGZUOVREdmdOSWdCMnRTMW1uQnZJNG5PYmFNWC9KdUFTeU1ZVUVvUVFzaU5QdHVFbHFDClU3RFhrZ01LSGQ2cWxyc1ZNeHJJeWloM1VOanR5UVpCUWNva1A0VWNXNWhJelRMeXJOUHlCU3poNlFVYnM0S24KbEw5UHlZWWNERVhsTVAzMGkrTTNBUUtDQVFFQTdjY2dqTVlJWXEycXY4WC9HMTVabVdkdzUrSHoxNlM1OEt6RQpuMG1WRjRIdDE2bUJEZnJRdmUwaDVubjYvaDMzYmZmcGd4S2lnbU0wYit2RXpnUHRQU2xOaGFMQ0U0S3Q3U1puCk51UlZISjc0bkhYc1RpK1owWlNrZ2VLd0JSbWppNVRON1BCRW9WZGFFeGhNL3FHbndHN3g1Q1FOTFEwTzF3MkoKNWI2eXdHbmdoamxoSFJJNXVHZG1IeTJuNk41UmozN09GckxWT0xkRWV4eTM1MW9nWlk3NDY3M0JYR1ZqTE5lMgpVTU02Q2F6RTAwZ0R3S3Ywck9uaVp2NzMyTzhNVmFPTVI2Q1lHM3o3VGdmVkdFU1dTMW1FR1Rya2JMZ0diVDRYCm5hR2hVSDkwK0FLWndEMkxtTUpQYlFSNVBod2NtYUN4L3hnUGoxUldSbDR6ZW1EanNRS0NBUUVBNFBSbDQxV2QKWWlpcmdjNDFvWEMzaGsvY010Q3N6K0N6OFdMN3BDUkpMM2h2WC9aKzdQcDZlTWVpSEJuYU9ialpOVVkvZUMrcwpJMWk0dENTaE1ucVNkZG0vWW52Z2lTMVVzREYyTjRYbTBvUjBQZkswamNRRHEvSVl5eENKbXA1NlpKOHkxYzVXCnY5d3ZKKzdVL0FFTGp1cWtHaVowdzB3REd0ZE5kRlZiVVNqeWYzODVEbXEwRDE5cnJsM1k5T21vRGFFQ1lWZFMKTDcvOGhqSWdtVDA5K1lyZjA1K0lsRW8vZjZhUGpNMXhpNldZQzMrYVFPcDN5alc2b1NQRVpadWMyV2ZWeWhzcwpBaURTd2JxdTFueFM1V3N3T1RHS21pcmwzYnRBQ2FmT0s4eC9jemVvcU04V2pqdThIQUcxYnRsVVQ0QnpMTlZrCkdaUjE0aUpjRnhaMTBRS0NBUUJyaTZjelJOYkNHeDZod3FJUjlPaTlzOFdqZTlWWWNjOFFCblNnUHgzS0ZpQkgKYlFsTUUyZWFuOGkzZi9DQVEzbUlLWnRhaDNFdFhFVjVZY0FRRmtLVmFUc0ErSTZqV0hYbVQzcGJuNGJIZlRlaApQTXoyeUJ6Z2FFVEg0b29PcEh3T1ErMm4venhyWlNEK2hmMDlKa3pEZ3VxeGI0VHVIWHZhMU9yTUdTYXNWTGNTCnZwMG9Fdmc4YWJnTTNnK1dDZ2dGeVNyWnBXVS9VOVVMZ2YvRUNrV2c2YnU0bElrQ2kzRUI5VWNtM0VaQjNmemcKT3pCSFV2OUZ2anVDcmt2WHVMZHhmSm1VUkJUSVNnMDRTOTZjTFZsMUZ6WGlXM3E1bWJwK2Fwa3YyTTBucFo1NApGbVVJU0UzOWQ5V0l6Mzh2RW5QMUlIT2hsM1ppTTVrYUZyMWQycmpoQW9JQkFHT3RCMFIvR0JoNWF0MCtjTmNTCjZjN3lyZUE2UklocnlXL0k2eldrK21TMVdheE12WnJsdGNTMHVHajVMNC9xRHh5aS90YVRVUlBzYVJNeE05ZjUKSmRKZ1pJUVAzY01LdWY3RU85eUlVV213VlExcDhJVHNlTEFFdXVXbmMwRjJ2VWErbjdqTEQvYzlhZ3Vvc09qawowYWxHNE9YUmFtVnExZWxid3k4cjd5VjhIazlPSVFyNVRzV05BMXFrck5DQWcvMWQvWDhDUVNGMVVVQnBEN2EyCnd6SkNUY0VvYkUxQXhQZ2I1bmwrUXJTYzhFMFFBbHFIU2dMb1ljU3E0NGdlTnBiQ2dxRmwvczhHbWp4TEt0TlIKRFM0b201cU1FQjBWcXZyZjBKVTJySTBOdE45cHB5cjliOElnUjg2bEZ5NkJ6L0RXT3JKLzd6WENhYVdFa2dlTQo1VEVDZ2dFQUtTdmxvUjlwVm0wbnp2TjNlNFh0amowMXJWVVpPVTY2N2xVVDNUQWVEeWNUVExLNHRYc1lSNDdWCm9sRG1Ld0lON1lML1U2V0FtMUNsRStER01udDI3aEtlSUJjdEtKWGlpSXFLN2hsQUFPbWs2bkNXVVhVN3lDZ2IKUmtWOURUWEhRNGdFdHpnVTBreDByOXBUeWRjMTlyTUFhbmw3ZmdpTlVOYytSY0hlTlNIOWhvV1BUR3BPYjVPbQpSNEx1QUpTZXdNZHRuWUZhN1h1M1A3UWpUN2IwZDdBUkduRjFPcmpLQTlOcW02NUQzYmg4aGxpa0FOckdrTStrCnBQTTJCSmlUbmg2dkxZTWg1VEJNU0ZOTEpQVUtJdHlUYUl6MkNWRmRXRTVpcFYzVVBqajhiZVlzRkR0MjRYbUMKRkk4OGc3YUNKSGxQMnd2dXlaaVBuT3RDZEdWVkt3PT0KLS0tLS1FTkQgUFJJVkFURSBLRVktLS0tLQo= +type: kubernetes.io/tls +--- +apiVersion: v1 +kind: Secret +metadata: + name: secret-tls-app3 +data: + tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZGekNDQXYrZ0F3SUJBZ0lVRVRYeG9iZmx4V2huSElML3U3S0JSRS95NGVzd0RRWUpLb1pJaHZjTkFRRUwKQlFBd0d6RVpNQmNHQTFVRUF3d1FZWEJ3TXk1bGVHRnRjR3hsTG1OdmJUQWVGdzB5TXpFeU1UY3hNVE13TVRkYQpGdzB6TXpFeU1UUXhNVE13TVRkYU1Cc3hHVEFYQmdOVkJBTU1FR0Z3Y0RNdVpYaGhiWEJzWlM1amIyMHdnZ0lpCk1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRREVxNk9DU0NzM1V5c3dxNHNIOEZXZmQ0b1IKc3NYL3FJenU1RndUanB2RktPYS9kK2I2cm5XQzJTUjZSS0ttUjQ3YndHQngyanZRSU9aMTE4dGEwckt0d3MwRgpBSFlYZ3d4VHB1bGp6M3ZFU3J5Ylh4VUE3UG1qaW9nMnp2R2tLSUtIQU9aZGp3UmJEUUJ2Y2VvY3VyQ2hLbjNWCnQ4Q2pLU0dlY3E2cU40ZGgweFB3RUlXQXNJcElzbnJNU0kzSmJqQ0RsVWU3U0tFY1dZS2NGWmZnbTcxS0JZbkQKZ3dUVEZhUm56clZXTHl2cUovd2ZRbGRDem1iR0o1Y1I2Q3NGOUtldS9LUWVsSnhRQTlTRXFxeEx6VTA0ZEhPQgp3WUpWeUJXTDZtMnVkaDZxV1JSUDNGd0FkWDZRQjljVDBxbC9Kd3hpclMvK2tCbUhBS1M4SytpVHhsN0p6YUR3Cmh4d2ZqSmtUTml3M21NbnZhaDZMN1NIQUtWZDUzVVh0MWxjNnZzejAyLzRjSWlOeENBL2s5VEtXd1liNm9nbDAKTWVuUFBqZm1TRHAyekVIWDlGUC94Ykpnbk85d1Bkek8xblFyVktGUnluckM1dGxubXpVOURLcG4rZGZsS3ZtUQovaHFGd3UvL1pVbkNmeUFwZHJ0RjdJQ2orbW5nSmtEOE02YUo0QUxEaFhwT2pQeklNeExlL2IrdkFyUGhPVklqCkNFVVNVZzZ1M2VEdWtzS0tTKzBmQlpncnJZaEhwQk5OaUxYekQ3ckFYb0FLT1dvckFnc2hkU2xzTGJXY0VmbTcKUmhpd1hJZnFLL1lrazBZT1FSTGxvd1JKdUhVMTd3KzhuZm5HejgwR0w5Wk4wNkFFM283dUNMZW00RlMwV0syMgozSThXS0pXWTNvcGpENkZkeVFJREFRQUJvMU13VVRBZEJnTlZIUTRFRmdRVW55VXlmWm10YzF6MEF0U284QVMyClNIa2xjVjR3SHdZRFZSMGpCQmd3Rm9BVW55VXlmWm10YzF6MEF0U284QVMyU0hrbGNWNHdEd1lEVlIwVEFRSC8KQkFVd0F3RUIvekFOQmdrcWhraUc5dzBCQVFzRkFBT0NBZ0VBbjRPUDlHTmVVbDQyVDFtUGV3UWE4eDFqYkZqLwprbEFMY1kxb25yVUZicExIY2VGbGp5T0xrREwrWHVmWEdaODQyaDEvZzRQVkZRWmxDa3U2cVVhU05jOXB6NkpYCjQ4b2xoSk9EVjQrSFpYaDNLVXBDREJYTnh5d25uS3crZEY2MGltRFBwN1RkTDJ3ZENTWkF5SDdwa2JGbFhzUFUKQjlTV0xlbXlyL2FYKy96M3FEN09DNnExc0hIOWg3YXNSWGJYeWNvd1JPWm96RENTVlFLSVRDOFA0YXZ6YkxKOQp5clVnakh5ajJ5bXhNVU9HczY1Zm5LcjEveHJNTGpZeWpOOHY5T01WRWgwMitxTzRwT2h6NFdDRUV1cjF6SUMxClgyNFlVaG5YNFFOSjRRaTFxd2lkQWJCSVpyWHQ0UFcyaTRNdzJlUU8xUlUxdzgxcHo4dlk3MjVsMkd5Z0ZHM04KRGhFa0FkSUxKOTlLVU4wWWxVN0JBUHNDVTVwZSt1QTQwdUJlNU90aTlQQWxFbnZINGk0OXAzNEpLalo0cTMwZQpGSXk1Vmp1Q2ttVmxTelVmUlFoWjhRUnoyaGRLL2hKWTZQd282M1VQN01iMXR1cDhobUVjZlpBVG90TWpVSzRVCmQrQlllNk9GdzUwczJzNnVNaVZ1dTJXYjJzV3NQNWdPazlTa2FDS2J2UWE0TWl1L2tXS2J2VDlQYjgxdTU0NHQKWG9xVk8yZDgzdU9tNUZUTStnRmdNRHRKREsvcG9xSVhobzZNRG5VRVMxU29VWmdZMlhSSExPQnZDQW1zOVNJVwpIQ3picnpTcXM4UDZVeGFpVjU5SHQzdG9ML3hRbVIvc2tmcm4vUVVZZHNTaDlkdE9TdGtIVU96emVwa1Ryb2owCk1aVWIyRm5TaWtXQnpjST0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo= + tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUpRd0lCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQ1Mwd2dna3BBZ0VBQW9JQ0FRREVxNk9DU0NzM1V5c3cKcTRzSDhGV2ZkNG9Sc3NYL3FJenU1RndUanB2RktPYS9kK2I2cm5XQzJTUjZSS0ttUjQ3YndHQngyanZRSU9aMQoxOHRhMHJLdHdzMEZBSFlYZ3d4VHB1bGp6M3ZFU3J5Ylh4VUE3UG1qaW9nMnp2R2tLSUtIQU9aZGp3UmJEUUJ2CmNlb2N1ckNoS24zVnQ4Q2pLU0dlY3E2cU40ZGgweFB3RUlXQXNJcElzbnJNU0kzSmJqQ0RsVWU3U0tFY1dZS2MKRlpmZ203MUtCWW5EZ3dUVEZhUm56clZXTHl2cUovd2ZRbGRDem1iR0o1Y1I2Q3NGOUtldS9LUWVsSnhRQTlTRQpxcXhMelUwNGRIT0J3WUpWeUJXTDZtMnVkaDZxV1JSUDNGd0FkWDZRQjljVDBxbC9Kd3hpclMvK2tCbUhBS1M4CksraVR4bDdKemFEd2h4d2ZqSmtUTml3M21NbnZhaDZMN1NIQUtWZDUzVVh0MWxjNnZzejAyLzRjSWlOeENBL2sKOVRLV3dZYjZvZ2wwTWVuUFBqZm1TRHAyekVIWDlGUC94Ykpnbk85d1Bkek8xblFyVktGUnluckM1dGxubXpVOQpES3BuK2RmbEt2bVEvaHFGd3UvL1pVbkNmeUFwZHJ0RjdJQ2orbW5nSmtEOE02YUo0QUxEaFhwT2pQeklNeExlCi9iK3ZBclBoT1ZJakNFVVNVZzZ1M2VEdWtzS0tTKzBmQlpncnJZaEhwQk5OaUxYekQ3ckFYb0FLT1dvckFnc2gKZFNsc0xiV2NFZm03Umhpd1hJZnFLL1lrazBZT1FSTGxvd1JKdUhVMTd3KzhuZm5HejgwR0w5Wk4wNkFFM283dQpDTGVtNEZTMFdLMjIzSThXS0pXWTNvcGpENkZkeVFJREFRQUJBb0lDQUJ4bEE0aHR6djkvM0g1OFplaFJoS3N2CllSbkpDOWtyaHAxL0R1UXI5TVYwY0V3NGpYcW44WU5nd21sOHUxYnlnZWVzVU1CZlY3OW00SjhtOXM4NEdHQUoKL2Z1NDQxUGxzY1BxRjB3M3lwQytrWmlGRTgwOGFaWjVDODJOOTBsU0ovWkI1UUNoQTJuNTZKUXVpRFI1cDhLOQpGY25qYThhaXk1M0t4UGtDWjJOeVREQ2UwZ2VRZFlhbGJpRk1ZRnd5c29KczdSeFhFaHU3dUtXOFlGOG5YUjd3CnljRVdpMzNHWkNRd3JmR3hnYytlMGtIWkhDd2pES2VUVTdaY0pNb0pWcVJuQ1hMNDFkQ2ZuUEZDaXZtdXZIVm8KS3IwVEtUUWxYU2NFUTYycWxDYllFWnl1SGdKYTlGanJLTnhOei9ieHRsSVEyeHNQeHYrODBndnc4dlZTOEtCRgpLS1pRNVI3U3VDVDF0R3ZlSGszTUVPOHlVWGorTE5CNEg0eE5LNUxIY0JjNVpGSDVtY29wNWtrazRyblIrMXBLCkxGSDFqcHkxdmRORUFlSE5LYkpBeHJlYzFaNE5LczRMd3Y2bjUvYjRFc29Gd05sRk05SUo2ZE5xaWpNSlhsc0MKSXQ5Ynl5aktwY1kvOHc4OUVnTjAwYWFlNHhQU0JKVFFVL2dGZ25VSm1QK1lENmk3QjMvV0NzWmZuRmV1ajdxTQoyVDhReGhmNVI0L2FOT3FmMG1DeVYxNEhtZ2xGeWdBelRpbi9lNWZpRUExUGs4YmMzK0NIV21tZk5JVVJxMmtyCmdRT2c1azZSNDZQLzkzekxzNmtaeUxENFVMLzdrbjJyT0lJbFFxcmJpdHlhSXBwVU5rYTdreGNEN2gwUit5SlcKbEtMVE1vRUhQaW5rYU0yWDEyNVpBb0lCQVFEMVpaN2VlVHNJZFc1QWNHK1UxSjY5MFNHdTAzTUhRQXlaK2EwTApXT2hWSm4yMWxFdUNUQ3UwZEtjTlNYRVQ1WkxrelVtWHQwVUtKMjBJWkwxQXo3Y0Rla052dE5vVEZEWXJsMWU3CnVINTJUdW9VeHhpQU5rRGxUbTVkU3FBNDRmbHpOdEcxclBjak5CYlc2SVJXQVVRR1N6T1dQekpIQU8ySDRXYTQKbTFtMFl6d0Z6OFBDNUExL05YOC9CSHNUWWlJRnNtZjNvMUk2TTNIbnJxSGtmdFptSVZLYXRhUlphZERMcGJUcAo0MjZrcFk4V25uVjl1ZFhNUEhtdkJaK1Aza0tqS2M5OW9ZL3U0bXRuUFJlQmowTEl6KzNTbWM2Y1Vwa2RxL0VJClZLMnhDdkZtL3VKTjkzaUxQeXgySEpVZitidS9mK0d2SDhGejhLQ2UvMFBwS0N2N0FvSUJBUUROS3d1MGpsYUkKWTBtdHJKWnZYVVBXdEszWk5VUTI0QnVWY0N2aTk5UjM5MWYrK29aK2c4aWIxU3FxTEdObVkzREo0V3NiTHRwaQo5dG9QRExUNG1nWkFVRWhqUkxZK1MwSWVYVFZ4ZE4vSk9aNmVNYW15TTN4NzVlZldQSUxoeExrNEFlaWJHSWhhCkw1TG4yQ1dsRGpjN21HWk5qVW4wSGJYdmR3RXREbmxob0FuRkRwS0NPeEVGdCtyMmNrZTNEMFN0cG5GZGNEZnAKakw4Tkhtc1NQQnoyVEZ0TWh0Y3prRkIvMXBjNUdyZiszTGVtSFFtS3BPQ2ZGUWNTK1ZDSTFVVTVnZmhrcjZJUwp5Y0N2dmRpb1N3bW9scWhhQnp1Zzl5Q3gxcFVMOXMyRmFpV0lNenZ2c3k2M2xaa0VDOTAwOVp5NXJHbzBSV044CkhyNUhsbEtYczA0TEFvSUJBUURQSHlWM1cxVnpMMEtPU3hneXd6NzBzWlkvYkNOVGhFRGVtVGp3TWV0dksxekIKTE5pS3NtWFZHdnlBbjNNOHV2RkFBdkZSaDVOVEhiSE9ldEN0Nm1QcklIL1l3Z21xUHMzMS92aEM3bFoyM3VaKwpBUWx4OWRqU2NsOStpR1V4ZmJIQkNBejZ6WEdPbWdHSkJKbmx5WTJ6empkTllpdTZlRk1EOUVCeUlsVVZod2g3ClUwQkV0NTJZdC91ZG9kZUxwYkZYbzV4VEROdHpXa2FTcVBmbDF4UjVBVGtxY1pPMUVEWDJIUGZVeld4dXRYcFAKT2hHcXUzWnp1cnR0K1U0UzdTTExlcGV4enZLZ1N5VWg3eE51L0E3L1ZWakMvNlMrbG95NzJZdElYOGgyZk9rQgo2TEh6NHFNd3pISm5nbnB2a2FaZzNMd014cjNPY05QeFB6ei9oek9QQW9JQkFRQ1E2czNLekJ0ZEhOeUcrdmdMClUxSStqc0taUU9HYzdURXVuZHV4NXFIQjF3amx4bWxIWmFoR1FneHZ4UWkwNHBwaFRvTEw0WTFLQjlqQWRwWkIKWHZINWJYdWorbjNMaEhjQVlaQUZRcXRyUS9MQkJJMDduTmhaMzJ1aFRINmFIODFBUFVEaWhES1RtVFRuNUNtNgo2MDZpSHFSc05OYyt3ZG1uZW1SdlFlRUV6dmozb3JKam9Ic0drZ0U1OEVDdGtmQk53OW9oU01tRmd1L1R3VitaCnNySTJXbnJHbEJ2ZmhSa0hJemtQa2NyVEQyMzh2RmZvQVV2VHNoT2NHRlFGUXJjeHhwYi83M3JJVUk5MDB1RDkKQm51ZEJFV0h5Y0laa1ZVYnFGa0E2V1FEejVVUkhqZEF1VXpQU2JDYVJoTUtmRTRtYkIxY0xJTDN3Zk5mTjFQQgphVm8vQW9JQkFGSVNWUjVzVmV3WTJ1QnU5YTRlYjY0cC8zMGcrQmFPbXZoVnQyZ0xmbTY1c0NDTHpZSDRHamNXClpJMUlQdmY3TnRUZkthL1J2TkVHY0dzMkdZeVdoVXU0R2xDNXQzb0tEeVpvNjZvSFNlTTAwNW5EYnNNc3phZVEKbTFjMGVHajhOc1NmKzNHSHhUd1ZBdHh3T2xFa3pueExFK2RaQURENDlESlNHOUIvRm5HLzBnNkxHZk94U1dSawpKM2lRQVVUcmlWUktjSXhCbVllL0JVeHR5Zmt3RXYzV2pjN1c1TE1SelQ4N3BsamQyaTRqeTFmeFNxWENIOVd5CnRCdXRDZEkzMVVjUWRaOWpyUHlkQ3k1ZUpuZzA4N3BIU012c1ZIdi9DRFAzYWthNUhRVS90Q01FUnNhRkpLaVMKbDJxZUdpNno1ZzQwbzl3ZDNzMHNCYVBlUHRaN2RVWT0KLS0tLS1FTkQgUFJJVkFURSBLRVktLS0tLQo= +type: kubernetes.io/tls +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: app1 + labels: + app: app1 +spec: + replicas: 1 + selector: + matchLabels: + app: app1 + template: + metadata: + labels: + app: app1 + spec: + containers: + - name: app1 + image: tutum/hello-world + ports: + - containerPort: 80 +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: app2 + labels: + app: app2 +spec: + replicas: 1 + selector: + matchLabels: + app: app2 + template: + metadata: + labels: + app: app2 + spec: + containers: + - name: app2 + image: tutum/hello-world + ports: + - containerPort: 80 +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: app3 + labels: + app: app3 +spec: + replicas: 1 + selector: + matchLabels: + app: app3 + template: + metadata: + labels: + app: app3 + spec: + containers: + - name: app3 + image: tutum/hello-world + ports: + - containerPort: 80 +--- +apiVersion: v1 +kind: Service +metadata: + name: svc-app1 +spec: + selector: + app: app1 + ports: + - protocol: TCP + port: 80 + targetPort: 80 +--- +apiVersion: v1 +kind: Service +metadata: + name: svc-app2 +spec: + selector: + app: app2 + ports: + - protocol: TCP + port: 80 + targetPort: 80 +--- +apiVersion: v1 +kind: Service +metadata: + name: svc-app3 +spec: + selector: + app: app3 + ports: + - protocol: TCP + port: 80 + targetPort: 80 diff --git a/examples/kubernetes-tls/tests.json b/examples/kubernetes-tls/tests.json new file mode 100644 index 000000000..031368a2a --- /dev/null +++ b/examples/kubernetes-tls/tests.json @@ -0,0 +1,26 @@ +{ + "name": "kubernetes-ingress", + "kinds": ["kubernetes"], + "timeout": 60, + "delay": 60, + "tests": [ + { + "type": "string", + "url": "https://app1.example.com", + "string": "hello", + "tls": "app1.example.com,app2.example.com" + }, + { + "type": "string", + "url": "https://app2.example.com", + "string": "hello", + "tls": "app1.example.com,app2.example.com" + }, + { + "type": "string", + "url": "https://app3.example.com", + "string": "hello", + "tls": "app3.example.com" + } + ] +} diff --git a/misc/integrations/k8s.mariadb.ui.yml b/misc/integrations/k8s.mariadb.ui.yml index 54622931a..89a40345c 100644 --- a/misc/integrations/k8s.mariadb.ui.yml +++ b/misc/integrations/k8s.mariadb.ui.yml @@ -4,7 +4,7 @@ metadata: name: cr-bunkerweb rules: - apiGroups: [""] - resources: ["services", "pods", "configmaps"] + resources: ["services", "pods", "configmaps", "secrets"] verbs: ["get", "watch", "list"] - apiGroups: ["networking.k8s.io"] resources: ["ingresses"] diff --git a/misc/integrations/k8s.mariadb.yml b/misc/integrations/k8s.mariadb.yml index 7d5f4c1c2..cd739eb29 100644 --- a/misc/integrations/k8s.mariadb.yml +++ b/misc/integrations/k8s.mariadb.yml @@ -4,7 +4,7 @@ metadata: name: cr-bunkerweb rules: - apiGroups: [""] - resources: ["services", "pods", "configmaps"] + resources: ["services", "pods", "configmaps", "secrets"] verbs: ["get", "watch", "list"] - apiGroups: ["networking.k8s.io"] resources: ["ingresses"] diff --git a/misc/integrations/k8s.mysql.ui.yml b/misc/integrations/k8s.mysql.ui.yml index 8b2ec3222..169c58625 100644 --- a/misc/integrations/k8s.mysql.ui.yml +++ b/misc/integrations/k8s.mysql.ui.yml @@ -4,7 +4,7 @@ metadata: name: cr-bunkerweb rules: - apiGroups: [""] - resources: ["services", "pods", "configmaps"] + resources: ["services", "pods", "configmaps", "secrets"] verbs: ["get", "watch", "list"] - apiGroups: ["networking.k8s.io"] resources: ["ingresses"] diff --git a/misc/integrations/k8s.mysql.yml b/misc/integrations/k8s.mysql.yml index 7c01dc5d9..99f5604e7 100644 --- a/misc/integrations/k8s.mysql.yml +++ b/misc/integrations/k8s.mysql.yml @@ -4,7 +4,7 @@ metadata: name: cr-bunkerweb rules: - apiGroups: [""] - resources: ["services", "pods", "configmaps"] + resources: ["services", "pods", "configmaps", "secrets"] verbs: ["get", "watch", "list"] - apiGroups: ["networking.k8s.io"] resources: ["ingresses"] diff --git a/misc/integrations/k8s.postgres.ui.yml b/misc/integrations/k8s.postgres.ui.yml index cb165bb00..6e78d8df6 100644 --- a/misc/integrations/k8s.postgres.ui.yml +++ b/misc/integrations/k8s.postgres.ui.yml @@ -4,7 +4,7 @@ metadata: name: cr-bunkerweb rules: - apiGroups: [""] - resources: ["services", "pods", "configmaps"] + resources: ["services", "pods", "configmaps", "secrets"] verbs: ["get", "watch", "list"] - apiGroups: ["networking.k8s.io"] resources: ["ingresses"] diff --git a/misc/integrations/k8s.postgres.yml b/misc/integrations/k8s.postgres.yml index 69df9178d..69af0aad4 100644 --- a/misc/integrations/k8s.postgres.yml +++ b/misc/integrations/k8s.postgres.yml @@ -4,7 +4,7 @@ metadata: name: cr-bunkerweb rules: - apiGroups: [""] - resources: ["services", "pods", "configmaps"] + resources: ["services", "pods", "configmaps", "secrets"] verbs: ["get", "watch", "list"] - apiGroups: ["networking.k8s.io"] resources: ["ingresses"] diff --git a/misc/logo.ascii b/misc/logo.ascii index 4a7126cbd..964309ee9 100644 --- a/misc/logo.ascii +++ b/misc/logo.ascii @@ -1,12 +1,12 @@ -[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;2;3mβ[48;2;0;0;0m[38;2;2;8;11mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;5;24;33mβ[48;2;0;0;0m[38;2;11;52;72mβ[48;2;0;0;1m[38;2;14;67;94mβ[48;2;0;2;2m[38;2;15;72;101mβ[48;2;0;1;2m[38;2;16;73;101mβ[48;2;0;0;0m[38;2;6;30;42mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;1;4;7mβ[48;2;3;15;21m[38;2;15;74;104mβ[48;2;9;41;56m[38;2;19;90;126mβ[48;2;8;41;57m[38;2;19;89;124mβ[48;2;8;41;57m[38;2;19;89;124mβ[48;2;8;39;54m[38;2;19;91;127mβ[48;2;1;4;5m[38;2;7;35;48mβ[48;2;5;23;32m[38;2;9;46;64mβ[48;2;14;66;92m[38;2;19;92;128mβ[48;2;14;67;93m[38;2;18;88;122mβ[48;2;14;66;93m[38;2;18;88;122mβ[48;2;14;68;94m[38;2;18;88;123mβ[48;2;12;57;80m[38;2;19;90;126mβ[48;2;1;4;6m[38;2;10;47;66mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;2;3m[38;2;2;11;16mβ[48;2;12;59;83m[38;2;17;84;118mβ[48;2;18;88;122m[38;2;18;87;121mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;121m[38;2;18;86;120mβ[48;2;18;85;118m[38;2;19;90;126mβ[48;2;5;21;29m[38;2;8;37;52mβ[48;2;10;49;68m[38;2;11;53;75mβ[48;2;19;89;124m[38;2;19;89;124mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;15;71;99m[38;2;18;90;125mβ[48;2;12;56;79m[38;2;15;75;104mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;1;7;10m[38;2;7;34;48mβ[48;2;13;64;89m[38;2;19;90;125mβ[48;2;14;67;93m[38;2;18;88;123mβ[48;2;14;67;93m[38;2;18;88;122mβ[48;2;14;65;90m[38;2;18;88;123mβ[48;2;9;43;59m[38;2;18;83;116mβ[48;2;3;14;19m[38;2;7;34;47mβ[48;2;8;37;52m[38;2;18;88;122mβ[48;2;9;42;58m[38;2;19;89;124mβ[48;2;5;26;36m[38;2;18;86;120mβ[48;2;3;17;23m[38;2;18;84;118mβ[48;2;3;17;23m[38;2;18;84;118mβ[48;2;3;17;23m[38;2;18;84;118mβ[48;2;1;5;6m[38;2;16;74;103mβ[48;2;0;1;2m[38;2;15;71;100mβ[48;2;0;2;2m[38;2;15;72;101mβ[48;2;0;0;0m[38;2;12;59;83mβ[48;2;0;0;0m[38;2;10;46;64mβ[48;2;0;0;0m[38;2;2;8;12mβ[48;2;0;0;0m[38;2;5;24;34mβ[48;2;0;0;0m[38;2;6;27;38mβ[48;2;0;0;0m[38;2;5;24;34mβ[48;2;0;0;0m[38;2;2;9;12mβ[48;2;0;0;0m[38;2;2;8;11mβ[48;2;0;0;0m[38;2;0;1;1mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[0m -[48;2;0;1;1m[38;2;14;64;89mβ[48;2;3;14;20m[38;2;17;85;118mβ[48;2;4;17;24m[38;2;18;86;121mβ[48;2;7;35;48m[38;2;19;89;124mβ[48;2;9;40;56m[38;2;19;90;125mβ[48;2;12;57;80m[38;2;19;89;124mβ[48;2;14;64;89m[38;2;19;89;124mβ[48;2;15;71;98m[38;2;18;88;123mβ[48;2;17;81;112m[38;2;18;87;121mβ[48;2;14;67;93m[38;2;19;89;123mβ[48;2;11;52;72m[38;2;19;90;125mβ[48;2;3;15;20m[38;2;17;82;115mβ[48;2;0;0;0m[38;2;3;15;21mβ[48;2;15;72;100m[38;2;11;50;71mβ[48;2;19;92;128m[38;2;19;90;125mβ[48;2;18;88;123m[38;2;18;86;120mβ[48;2;18;88;123m[38;2;18;86;120mβ[48;2;19;91;127m[38;2;19;89;124mβ[48;2;12;61;85m[38;2;12;58;81mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;1;5;8m[38;2;1;3;5mβ[48;2;16;79;111m[38;2;15;72;100mβ[48;2;18;87;122m[38;2;18;88;123mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;19;90;125m[38;2;19;90;125mβ[48;2;9;46;65m[38;2;9;45;63mβ[48;2;9;44;62m[38;2;9;44;62mβ[48;2;19;90;125m[38;2;19;90;125mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;121m[38;2;18;86;120mβ[48;2;19;89;123m[38;2;18;87;122mβ[48;2;6;29;41m[38;2;17;82;115mβ[48;2;1;6;8m[38;2;4;16;23mβ[48;2;16;80;111m[38;2;14;67;93mβ[48;2;18;87;121m[38;2;18;88;123mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;19;90;125m[38;2;19;90;125mβ[48;2;8;36;51m[38;2;8;36;51mβ[48;2;11;53;74m[38;2;11;53;74mβ[48;2;19;89;124m[38;2;19;89;124mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;88;123m[38;2;18;88;123mβ[48;2;15;73;102m[38;2;14;67;94mβ[48;2;0;2;2m[38;2;4;17;24mβ[48;2;14;66;92m[38;2;18;84;118mβ[48;2;19;88;123m[38;2;18;86;121mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;19;90;125m[38;2;19;87;122mβ[48;2;11;54;76m[38;2;4;20;28mβ[48;2;4;18;25m[38;2;5;21;29mβ[48;2;18;88;122m[38;2;18;88;122mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;121m[38;2;18;86;120mβ[48;2;18;86;121m[38;2;18;86;120mβ[48;2;18;86;121m[38;2;18;87;121mβ[48;2;18;88;122m[38;2;18;87;121mβ[48;2;18;88;123m[38;2;18;87;121mβ[48;2;18;88;123m[38;2;18;86;121mβ[48;2;19;89;125m[38;2;18;88;123mβ[48;2;18;86;119m[38;2;14;71;99mβ[48;2;8;38;53m[38;2;5;26;37mβ[48;2;18;88;123m[38;2;18;88;122mβ[48;2;19;89;124m[38;2;18;86;120mβ[48;2;18;88;123m[38;2;18;86;120mβ[48;2;17;81;113m[38;2;18;87;121mβ[48;2;17;81;113m[38;2;18;87;121mβ[48;2;14;68;95m[38;2;18;88;123mβ[48;2;14;64;89m[38;2;19;89;124mβ[48;2;10;49;68m[38;2;19;90;125mβ[48;2;6;28;39m[38;2;19;88;123mβ[48;2;0;2;3m[38;2;15;70;98mβ[48;2;0;0;0m[38;2;5;24;33mβ[48;2;0;0;0m[38;2;0;0;0mβ[0m -[48;2;16;78;109m[38;2;14;66;91mβ[48;2;18;88;122m[38;2;18;88;123mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;88;122mβ[48;2;18;86;120m[38;2;18;87;121mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;19;91;126m[38;2;19;90;125mβ[48;2;9;43;61m[38;2;9;45;63mβ[48;2;9;45;64m[38;2;7;36;51mβ[48;2;19;90;125m[38;2;19;89;124mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;19;88;123m[38;2;18;87;122mβ[48;2;14;68;95m[38;2;16;79;110mβ[48;2;0;2;4m[38;2;1;5;8mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;12;58;81m[38;2;12;59;82mβ[48;2;19;89;124m[38;2;19;89;124mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;19;90;125m[38;2;19;90;125mβ[48;2;9;45;63m[38;2;9;44;62mβ[48;2;9;44;62m[38;2;9;44;62mβ[48;2;19;90;125m[38;2;19;90;125mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;87;122m[38;2;18;86;120mβ[48;2;17;80;111m[38;2;18;87;121mβ[48;2;18;84;117m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;19;90;125m[38;2;19;90;125mβ[48;2;8;36;51m[38;2;8;36;51mβ[48;2;11;53;74m[38;2;11;53;74mβ[48;2;19;89;124m[38;2;19;89;124mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;88;123m[38;2;18;86;120mβ[48;2;13;62;88m[38;2;18;87;121mβ[48;2;11;53;74m[38;2;18;87;121mβ[48;2;19;89;124m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;19;88;123m[38;2;19;90;125mβ[48;2;15;70;98m[38;2;8;37;52mβ[48;2;0;0;1m[38;2;0;0;0mβ[48;2;9;43;60m[38;2;9;45;63mβ[48;2;19;90;125m[38;2;19;90;125mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;87;121mβ[48;2;18;86;119m[38;2;18;84;117mβ[48;2;17;81;113m[38;2;8;38;53mβ[48;2;17;81;113m[38;2;4;21;30mβ[48;2;17;81;113m[38;2;4;22;30mβ[48;2;18;85;118m[38;2;6;28;40mβ[48;2;19;92;128m[38;2;7;32;44mβ[48;2;14;69;96m[38;2;4;19;27mβ[48;2;9;42;59m[38;2;10;47;66mβ[48;2;19;89;124m[38;2;19;90;125mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;88;123mβ[48;2;18;86;120m[38;2;18;88;123mβ[48;2;18;86;120m[38;2;18;88;123mβ[48;2;18;86;120m[38;2;18;87;122mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;19;89;124m[38;2;18;86;120mβ[48;2;17;83;116m[38;2;18;89;124mβ[48;2;5;24;33m[38;2;14;67;92mβ[0m -[48;2;11;52;72m[38;2;8;38;52mβ[48;2;19;89;124m[38;2;19;89;124mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;88;123mβ[48;2;18;88;122m[38;2;10;47;65mβ[48;2;15;73;102m[38;2;1;4;5mβ[48;2;17;83;115m[38;2;5;22;30mβ[48;2;18;87;121m[38;2;17;83;116mβ[48;2;18;86;120m[38;2;18;87;121mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;19;90;125m[38;2;18;87;122mβ[48;2;9;46;65m[38;2;5;24;34mβ[48;2;4;20;28m[38;2;5;22;31mβ[48;2;18;88;123m[38;2;18;88;124mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;87;122m[38;2;18;87;122mβ[48;2;16;78;109m[38;2;16;79;111mβ[48;2;1;5;8m[38;2;2;8;12mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;12;60;83m[38;2;9;42;59mβ[48;2;19;89;124m[38;2;19;90;125mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;19;90;125m[38;2;18;88;123mβ[48;2;11;51;72m[38;2;14;69;97mβ[48;2;5;26;36m[38;2;5;23;33mβ[48;2;18;88;123m[38;2;18;88;122mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;19;90;125m[38;2;19;90;125mβ[48;2;8;36;51m[38;2;8;36;51mβ[48;2;11;53;74m[38;2;11;53;74mβ[48;2;19;89;124m[38;2;19;89;124mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;87;122m[38;2;18;87;122mβ[48;2;16;77;108m[38;2;16;76;106mβ[48;2;1;7;10m[38;2;1;5;6mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;9;45;63m[38;2;9;44;62mβ[48;2;19;90;125m[38;2;19;90;125mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;121m[38;2;18;86;120mβ[48;2;18;85;119m[38;2;18;86;120mβ[48;2;17;81;113m[38;2;18;87;121mβ[48;2;17;82;114m[38;2;18;87;122mβ[48;2;17;79;110m[38;2;19;87;121mβ[48;2;4;18;26m[38;2;5;21;29mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;11;54;75m[38;2;15;71;100mβ[48;2;19;90;125m[38;2;18;88;123mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;87;121m[38;2;18;88;122mβ[48;2;14;69;96m[38;2;6;29;41mβ[48;2;14;69;96m[38;2;3;13;18mβ[48;2;15;70;97m[38;2;0;0;0mβ[48;2;16;75;105m[38;2;3;13;18mβ[48;2;18;87;121m[38;2;17;83;116mβ[48;2;18;86;120m[38;2;18;87;121mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;87;121mβ[0m -[48;2;4;20;27m[38;2;2;12;16mβ[48;2;17;85;118m[38;2;16;81;113mβ[48;2;18;87;121m[38;2;18;87;121mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;89;124m[38;2;18;88;123mβ[48;2;6;26;35m[38;2;15;70;97mβ[48;2;0;0;0m[38;2;1;4;6mβ[48;2;2;8;11m[38;2;6;29;41mβ[48;2;16;78;109m[38;2;19;89;124mβ[48;2;18;87;122m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;121mβ[48;2;6;30;42m[38;2;19;86;120mβ[48;2;3;13;18m[38;2;5;26;37mβ[48;2;17;83;116m[38;2;16;76;106mβ[48;2;18;87;121m[38;2;18;87;122mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;88;123m[38;2;18;88;123mβ[48;2;5;23;32m[38;2;5;23;31mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;7;33;46m[38;2;7;32;44mβ[48;2;19;90;125m[38;2;19;90;125mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;88;123m[38;2;18;88;123mβ[48;2;14;69;96m[38;2;14;69;96mβ[48;2;5;24;34m[38;2;5;24;34mβ[48;2;18;88;122m[38;2;18;88;122mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;121mβ[48;2;18;86;121m[38;2;17;82;114mβ[48;2;18;88;123m[38;2;14;65;91mβ[48;2;18;86;120m[38;2;19;88;122mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;19;90;125m[38;2;19;90;125mβ[48;2;8;36;51m[38;2;8;36;51mβ[48;2;11;53;74m[38;2;11;53;74mβ[48;2;19;89;124m[38;2;19;89;124mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;87;122mβ[48;2;18;88;122m[38;2;15;71;99mβ[48;2;18;87;122m[38;2;16;75;104mβ[48;2;18;86;120m[38;2;18;87;122mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;121m[38;2;18;86;120mβ[48;2;18;87;121m[38;2;19;90;125mβ[48;2;4;20;27m[38;2;10;47;65mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;10;51;72m[38;2;14;70;97mβ[48;2;19;89;124m[38;2;18;88;123mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;87;121mβ[48;2;18;87;121m[38;2;16;76;107mβ[48;2;18;88;123m[38;2;15;69;97mβ[48;2;18;88;123m[38;2;14;69;97mβ[48;2;18;89;124m[38;2;15;71;99mβ[48;2;18;86;120m[38;2;14;66;91mβ[48;2;3;12;17m[38;2;1;6;8mβ[48;2;0;0;0m[38;2;2;9;13mβ[48;2;15;71;98m[38;2;17;81;113mβ[48;2;18;88;123m[38;2;18;87;122mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;84;118m[38;2;18;86;121mβ[48;2;18;83;115m[38;2;18;87;121mβ[48;2;11;52;72m[38;2;19;89;125mβ[48;2;13;61;85m[38;2;19;88;123mβ[48;2;18;87;121m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;87;122m[38;2;19;89;125mβ[48;2;16;76;106m[38;2;11;54;75mβ[0m -[48;2;0;0;0m[38;2;0;0;0mβ[48;2;14;70;97m[38;2;13;65;90mβ[48;2;18;88;123m[38;2;18;88;123mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;121m[38;2;18;86;121mβ[48;2;18;87;120m[38;2;18;84;117mβ[48;2;3;10;14m[38;2;8;40;55mβ[48;2;1;7;10m[38;2;8;39;54mβ[48;2;18;82;116m[38;2;16;78;108mβ[48;2;18;87;121m[38;2;18;87;122mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;19;89;124m[38;2;19;89;124mβ[48;2;12;58;80m[38;2;12;61;85mβ[48;2;16;75;105m[38;2;12;55;77mβ[48;2;18;87;122m[38;2;19;89;125mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;88;123m[38;2;18;86;120mβ[48;2;13;61;85m[38;2;18;88;123mβ[48;2;5;26;37m[38;2;19;89;124mβ[48;2;13;61;85m[38;2;18;88;123mβ[48;2;18;88;123m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;88;123m[38;2;19;91;127mβ[48;2;14;68;94m[38;2;10;45;63mβ[48;2;5;24;34m[38;2;3;16;23mβ[48;2;18;88;122m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;87;122m[38;2;18;87;122mβ[48;2;16;78;108m[38;2;17;79;110mβ[48;2;2;9;13m[38;2;1;3;4mβ[48;2;15;71;98m[38;2;4;20;27mβ[48;2;18;88;124m[38;2;18;85;119mβ[48;2;18;86;120m[38;2;18;87;121mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;19;90;125m[38;2;19;90;125mβ[48;2;8;36;51m[38;2;8;36;51mβ[48;2;11;53;74m[38;2;11;53;74mβ[48;2;19;89;124m[38;2;19;89;124mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;19;90;125m[38;2;19;90;125mβ[48;2;10;46;64m[38;2;10;49;68mβ[48;2;8;35;50m[38;2;2;10;13mβ[48;2;19;90;125m[38;2;17;84;117mβ[48;2;18;86;120m[38;2;18;86;121mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;19;88;123m[38;2;18;87;120mβ[48;2;14;67;94m[38;2;18;84;117mβ[48;2;0;1;2m[38;2;3;15;21mβ[48;2;14;69;96m[38;2;14;67;93mβ[48;2;18;88;123m[38;2;18;88;123mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;19;89;123m[38;2;18;86;120mβ[48;2;12;59;83m[38;2;18;87;122mβ[48;2;5;26;36m[38;2;18;88;123mβ[48;2;6;27;37m[38;2;19;88;123mβ[48;2;4;20;28m[38;2;18;85;118mβ[48;2;2;7;10m[38;2;17;80;113mβ[48;2;1;3;5m[38;2;14;67;93mβ[48;2;3;14;20m[38;2;4;18;25mβ[48;2;18;85;120m[38;2;18;84;118mβ[48;2;18;86;121m[38;2;18;86;121mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;87;121mβ[48;2;18;86;120m[38;2;19;89;124mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;86;120mβ[48;2;18;86;120m[38;2;18;87;121mβ[48;2;18;88;123m[38;2;17;80;112mβ[48;2;17;80;112m[38;2;6;28;39mβ[48;2;3;14;19m[38;2;0;0;0mβ[0m -[48;2;0;0;0m[38;2;0;0;0mβ[48;2;10;47;66m[38;2;8;34;47mβ[48;2;19;91;126m[38;2;18;87;121mβ[48;2;18;87;121m[38;2;18;84;117mβ[48;2;18;87;121m[38;2;18;84;117mβ[48;2;18;86;121m[38;2;18;84;117mβ[48;2;19;89;124m[38;2;18;84;117mβ[48;2;19;90;126m[38;2;18;84;117mβ[48;2;18;87;122m[38;2;18;84;117mβ[48;2;18;87;121m[38;2;18;84;117mβ[48;2;18;87;121m[38;2;18;84;117mβ[48;2;18;87;121m[38;2;18;84;117mβ[48;2;19;90;125m[38;2;18;85;119mβ[48;2;12;58;81m[38;2;6;28;39mβ[48;2;4;18;25m[38;2;0;0;0mβ[48;2;18;87;121m[38;2;8;37;52mβ[48;2;18;88;122m[38;2;17;84;117mβ[48;2;18;87;121m[38;2;18;84;117mβ[48;2;18;87;121m[38;2;18;84;117mβ[48;2;18;87;121m[38;2;18;84;117mβ[48;2;18;87;121m[38;2;18;84;117mβ[48;2;18;87;121m[38;2;18;84;117mβ[48;2;18;87;121m[38;2;18;84;117mβ[48;2;18;87;121m[38;2;18;85;118mβ[48;2;19;89;125m[38;2;14;69;95mβ[48;2;15;75;105m[38;2;3;13;18mβ[48;2;2;11;15m[38;2;0;0;0mβ[48;2;1;4;5m[38;2;1;4;6mβ[48;2;16;79;111m[38;2;13;66;94mβ[48;2;18;88;123m[38;2;16;79;116mβ[48;2;18;87;121m[38;2;15;76;111mβ[48;2;18;89;125m[38;2;13;65;95mβ[48;2;18;81;113m[38;2;11;52;77mβ[48;2;1;6;9m[38;2;0;0;1mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;9;44;61m[38;2;0;0;5mβ[48;2;19;91;127m[38;2;11;56;84mβ[48;2;18;88;123m[38;2;13;64;94mβ[48;2;18;88;123m[38;2;13;63;92mβ[48;2;18;88;123m[38;2;13;63;93mβ[48;2;20;93;129m[38;2;12;60;89mβ[48;2;8;37;53m[38;2;1;7;15mβ[48;2;11;54;76m[38;2;7;38;58mβ[48;2;19;91;127m[38;2;13;65;95mβ[48;2;18;88;123m[38;2;13;63;92mβ[48;2;18;88;123m[38;2;13;63;92mβ[48;2;19;92;128m[38;2;11;64;94mβ[48;2;11;52;73m[38;2;0;25;38mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;14;65;92m[38;2;6;26;42mβ[48;2;19;89;124m[38;2;16;79;116mβ[48;2;18;87;121m[38;2;16;78;113mβ[48;2;18;87;121m[38;2;16;77;113mβ[48;2;19;89;125m[38;2;16;80;116mβ[48;2;7;35;49m[38;2;10;51;76mβ[48;2;14;66;92m[38;2;13;65;96mβ[48;2;18;89;124m[38;2;17;83;117mβ[48;2;18;87;121m[38;2;18;84;117mβ[48;2;18;87;121m[38;2;18;84;117mβ[48;2;18;87;121m[38;2;18;84;117mβ[48;2;18;87;121m[38;2;18;84;117mβ[48;2;18;87;121m[38;2;18;84;117mβ[48;2;18;87;121m[38;2;18;84;117mβ[48;2;18;87;121m[38;2;18;84;117mβ[48;2;18;89;124m[38;2;18;85;119mβ[48;2;16;78;108m[38;2;15;70;98mβ[48;2;8;40;56m[38;2;9;41;57mβ[48;2;19;89;124m[38;2;19;87;121mβ[48;2;18;87;121m[38;2;18;84;117mβ[48;2;18;87;121m[38;2;18;84;117mβ[48;2;18;88;122m[38;2;18;86;120mβ[48;2;17;79;111m[38;2;13;66;92mβ[48;2;10;48;67m[38;2;0;4;5mβ[48;2;18;85;118m[38;2;17;78;108mβ[48;2;18;87;121m[38;2;18;85;118mβ[48;2;18;87;121m[38;2;18;84;117mβ[48;2;19;89;124m[38;2;18;85;119mβ[48;2;13;63;89m[38;2;16;76;106mβ[48;2;0;0;0m[38;2;1;4;6mβ[48;2;0;0;0m[38;2;0;0;0mβ[0m -[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;2;3m[38;2;0;0;0mβ[48;2;3;12;17m[38;2;0;0;0mβ[48;2;3;12;17m[38;2;0;0;0mβ[48;2;3;12;17m[38;2;0;0;0mβ[48;2;3;12;17m[38;2;0;0;0mβ[48;2;3;12;17m[38;2;0;0;0mβ[48;2;3;12;17m[38;2;0;0;0mβ[48;2;3;12;17m[38;2;0;0;0mβ[48;2;3;12;17m[38;2;0;0;0mβ[48;2;3;12;17m[38;2;0;0;0mβ[48;2;3;12;17m[38;2;0;0;0mβ[48;2;3;12;17m[38;2;0;0;0mβ[48;2;0;1;1m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;2;11;15m[38;2;0;0;0mβ[48;2;3;12;17m[38;2;0;0;0mβ[48;2;3;12;17m[38;2;0;0;0mβ[48;2;3;12;17m[38;2;0;0;0mβ[48;2;3;12;17m[38;2;0;0;0mβ[48;2;3;12;17m[38;2;0;0;0mβ[48;2;3;12;17m[38;2;0;0;0mβ[48;2;3;13;17m[38;2;0;0;0mβ[48;2;0;2;3m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;7;27;20m[38;2;18;68;40mβ[48;2;19;73;54m[38;2;50;184;109mβ[48;2;18;68;50m[38;2;48;177;106mβ[48;2;16;58;35m[38;2;49;178;107mβ[48;2;16;57;33m[38;2;49;178;108mβ[48;2;16;57;34m[38;2;46;177;106mβ[48;2;16;57;35m[38;2;42;176;103mβ[48;2;16;57;34m[38;2;47;178;107mβ[48;2;16;57;34m[38;2;49;178;108mβ[48;2;16;57;35m[38;2;47;177;106mβ[48;2;16;57;35m[38;2;42;175;103mβ[48;2;16;57;35m[38;2;46;177;105mβ[48;2;16;57;34m[38;2;49;178;107mβ[48;2;15;56;33m[38;2;44;176;104mβ[48;2;16;58;35m[38;2;44;176;104mβ[48;2;16;57;35m[38;2;44;176;104mβ[48;2;16;57;35m[38;2;44;176;104mβ[48;2;13;57;33m[38;2;47;177;106mβ[48;2;83;109;95m[38;2;60;183;115mβ[48;2;150;153;151m[38;2;158;223;187mβ[48;2;39;75;56m[38;2;76;189;127mβ[48;2;15;58;35m[38;2;40;174;101mβ[48;2;18;69;51m[38;2;42;174;101mβ[48;2;18;70;52m[38;2;45;175;103mβ[48;2;18;70;52m[38;2;49;177;105mβ[48;2;18;70;52m[38;2;48;176;105mβ[48;2;17;65;45m[38;2;48;177;106mβ[48;2;18;69;50m[38;2;50;183;110mβ[48;2;8;32;29m[38;2;16;60;35mβ[48;2;3;12;17m[38;2;0;0;0mβ[48;2;3;12;17m[38;2;0;0;0mβ[48;2;3;12;17m[38;2;0;0;0mβ[48;2;3;12;17m[38;2;0;0;0mβ[48;2;3;12;17m[38;2;0;0;0mβ[48;2;3;12;17m[38;2;0;0;0mβ[48;2;3;12;17m[38;2;0;0;0mβ[48;2;3;13;18m[38;2;0;0;0mβ[48;2;2;8;11m[38;2;0;0;0mβ[48;2;1;5;7m[38;2;0;0;0mβ[48;2;3;13;18m[38;2;0;0;0mβ[48;2;3;12;17m[38;2;0;0;0mβ[48;2;3;12;17m[38;2;0;0;0mβ[48;2;3;12;17m[38;2;0;0;0mβ[48;2;2;10;13m[38;2;0;0;0mβ[48;2;0;1;1m[38;2;0;0;0mβ[48;2;2;11;16m[38;2;0;0;0mβ[48;2;3;12;17m[38;2;0;0;0mβ[48;2;3;12;17m[38;2;0;0;0mβ[48;2;3;12;17m[38;2;0;0;0mβ[48;2;2;11;15m[38;2;0;0;0mβ[48;2;0;1;1m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[0m -[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;18;66;40m[38;2;18;66;40mβ[48;2;49;179;108m[38;2;49;179;108mβ[48;2;47;172;104m[38;2;47;172;104mβ[48;2;47;172;104m[38;2;47;172;104mβ[48;2;43;170;101m[38;2;45;171;102mβ[48;2;97;192;140m[38;2;73;182;123mβ[48;2;146;212;176m[38;2;163;218;189mβ[48;2;74;183;124m[38;2;57;176;111mβ[48;2;36;167;96m[38;2;100;193;142mβ[48;2;77;184;125m[38;2;57;176;111mβ[48;2;143;210;174m[38;2;167;220;191mβ[48;2;89;189;134m[38;2;65;179;117mβ[48;2;40;169;99m[38;2;98;192;141mβ[48;2;99;193;141m[38;2;148;212;177mβ[48;2;145;211;175m[38;2;62;178;115mβ[48;2;145;211;175m[38;2;64;179;117mβ[48;2;93;191;137m[38;2;153;214;181mβ[48;2;43;170;101m[38;2;91;190;135mβ[48;2;40;169;99m[38;2;36;168;96mβ[48;2;134;207;167m[38;2;162;218;188mβ[48;2;115;199;153m[38;2;176;224;198mβ[48;2;136;208;169m[38;2;75;183;125mβ[48;2;137;208;169m[38;2;88;188;134mβ[48;2;72;182;123m[38;2;167;220;191mβ[48;2;43;170;101m[38;2;66;180;118mβ[48;2;47;172;104m[38;2;45;171;102mβ[48;2;47;172;104m[38;2;47;172;104mβ[48;2;49;178;108m[38;2;49;178;108mβ[48;2;16;60;36m[38;2;16;60;36mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[0m -[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;18;66;40m[38;2;18;66;40mβ[48;2;49;179;108m[38;2;49;179;108mβ[48;2;47;172;104m[38;2;47;172;104mβ[48;2;47;172;104m[38;2;47;172;104mβ[48;2;47;172;104m[38;2;47;172;104mβ[48;2;46;172;104m[38;2;41;169;99mβ[48;2;142;210;174m[38;2;130;205;165mβ[48;2;96;192;140m[38;2;173;222;195mβ[48;2;210;237;222m[38;2;118;201;156mβ[48;2;91;190;136m[38;2;173;222;195mβ[48;2;142;210;173m[38;2;119;201;157mβ[48;2;37;168;97m[38;2;34;167;95mβ[48;2;157;216;184m[38;2;137;208;170mβ[48;2;158;216;185m[38;2;117;200;155mβ[48;2;130;205;164m[38;2;59;177;112mβ[48;2;129;205;164m[38;2;63;179;116mβ[48;2;151;214;180m[38;2;64;179;116mβ[48;2;136;207;169m[38;2;61;177;114mβ[48;2;35;167;95m[38;2;37;168;97mβ[48;2;149;213;178m[38;2;152;214;180mβ[48;2;78;184;127m[38;2;92;190;137mβ[48;2;40;169;99m[38;2;37;168;97mβ[48;2;36;168;96m[38;2;35;167;95mβ[48;2;107;196;148m[38;2;119;201;156mβ[48;2;115;199;154m[38;2;107;196;148mβ[48;2;41;169;99m[38;2;41;170;100mβ[48;2;47;172;104m[38;2;47;172;104mβ[48;2;49;178;108m[38;2;49;178;108mβ[48;2;16;60;36m[38;2;16;60;36mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[0m -[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;18;67;41m[38;2;14;51;31mβ[48;2;50;183;110m[38;2;38;138;83mβ[48;2;48;176;106m[38;2;36;133;80mβ[48;2;48;175;106m[38;2;38;141;85mβ[48;2;47;172;104m[38;2;47;172;104mβ[48;2;41;170;100m[38;2;47;172;104mβ[48;2;103;194;145m[38;2;51;174;107mβ[48;2;177;224;199m[38;2;58;176;112mβ[48;2;46;172;103m[38;2;44;171;102mβ[48;2;191;230;209m[38;2;64;179;116mβ[48;2;90;189;135m[38;2;51;174;107mβ[48;2;40;169;99m[38;2;47;172;104mβ[48;2;63;178;116m[38;2;44;171;102mβ[48;2;156;215;183m[38;2;55;175;110mβ[48;2;118;201;156m[38;2;104;195;145mβ[48;2;104;195;146m[38;2;112;198;151mβ[48;2;142;210;173m[38;2;82;186;129mβ[48;2;98;192;141m[38;2;46;172;103mβ[48;2;68;181;120m[38;2;66;180;118mβ[48;2;185;227;204m[38;2;84;187;131mβ[48;2;175;223;197m[38;2;67;180;118mβ[48;2;103;194;144m[38;2;117;200;154mβ[48;2;118;200;156m[38;2;113;198;152mβ[48;2;154;214;181m[38;2;54;175;109mβ[48;2;54;175;109m[38;2;44;171;102mβ[48;2;46;172;103m[38;2;47;172;104mβ[48;2;47;172;104m[38;2;47;172;104mβ[48;2;49;178;108m[38;2;49;178;108mβ[48;2;16;60;36m[38;2;16;60;36mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[0m +[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;1;1mβ[48;2;0;0;0m[38;2;1;4;6mβ[48;2;0;0;0m[38;2;1;5;7mβ[48;2;0;0;0m[38;2;0;1;1mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;4;32;45mβ[48;2;0;0;0m[38;2;8;65;91mβ[48;2;0;2;2m[38;2;9;69;97mβ[48;2;1;6;8m[38;2;10;75;106mβ[48;2;1;5;8m[38;2;10;75;106mβ[48;2;0;0;0m[38;2;2;18;25mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;1;4;5mβ[48;2;3;20;29m[38;2;10;73;103mβ[48;2;5;41;57m[38;2;11;89;125mβ[48;2;6;48;67m[38;2;11;87;122mβ[48;2;7;54;75m[38;2;11;87;123mβ[48;2;6;44;63m[38;2;11;87;122mβ[48;2;0;2;3m[38;2;2;16;22mβ[48;2;4;28;39m[38;2;7;51;71mβ[48;2;9;72;100m[38;2;11;89;126mβ[48;2;10;75;105m[38;2;11;86;120mβ[48;2;10;77;107m[38;2;11;86;120mβ[48;2;10;81;113m[38;2;11;86;120mβ[48;2;7;55;78m[38;2;11;88;123mβ[48;2;0;1;2m[38;2;5;39;55mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;1;2m[38;2;0;2;3mβ[48;2;8;63;89m[38;2;9;73;102mβ[48;2;11;87;122m[38;2;11;87;121mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;86;120m[38;2;11;85;119mβ[48;2;10;82;115m[38;2;11;87;123mβ[48;2;2;13;18m[38;2;3;21;30mβ[48;2;4;33;45m[38;2;5;38;53mβ[48;2;11;88;123m[38;2;11;89;124mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;83;117m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;88;123mβ[48;2;7;53;74m[38;2;7;58;81mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;3;5m[38;2;3;25;35mβ[48;2;8;62;86m[38;2;11;87;123mβ[48;2;9;72;101m[38;2;11;86;121mβ[48;2;9;67;94m[38;2;11;87;121mβ[48;2;8;64;90m[38;2;11;89;124mβ[48;2;7;56;78m[38;2;9;73;102mβ[48;2;1;9;12m[38;2;2;14;19mβ[48;2;5;38;53m[38;2;10;82;114mβ[48;2;6;43;60m[38;2;11;88;123mβ[48;2;5;35;50m[38;2;11;87;122mβ[48;2;4;29;41m[38;2;11;86;121mβ[48;2;3;23;32m[38;2;11;85;119mβ[48;2;2;17;24m[38;2;11;83;116mβ[48;2;1;12;16m[38;2;10;80;112mβ[48;2;1;7;9m[38;2;10;76;107mβ[48;2;0;3;4m[38;2;9;72;100mβ[48;2;0;0;0m[38;2;9;67;94mβ[48;2;0;0;0m[38;2;7;54;76mβ[48;2;0;0;0m[38;2;1;5;7mβ[48;2;0;0;0m[38;2;4;29;40mβ[48;2;0;0;0m[38;2;4;35;49mβ[48;2;0;0;0m[38;2;3;24;34mβ[48;2;0;0;0m[38;2;2;16;23mβ[48;2;0;0;0m[38;2;1;9;13mβ[48;2;0;0;0m[38;2;0;3;5mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[0m +[48;2;1;4;6m[38;2;9;72;100mβ[48;2;2;15;21m[38;2;11;84;118mβ[48;2;3;26;36m[38;2;11;87;122mβ[48;2;5;37;52m[38;2;11;88;124mβ[48;2;6;49;69m[38;2;11;88;124mβ[48;2;8;60;84m[38;2;11;88;123mβ[48;2;9;69;97m[38;2;11;87;122mβ[48;2;10;75;105m[38;2;11;86;121mβ[48;2;10;76;107m[38;2;11;86;121mβ[48;2;9;70;98m[38;2;11;87;122mβ[48;2;6;48;67m[38;2;11;90;126mβ[48;2;1;7;10m[38;2;8;64;90mβ[48;2;0;0;0m[38;2;0;2;3mβ[48;2;9;68;95m[38;2;7;58;82mβ[48;2;11;90;126m[38;2;11;88;123mβ[48;2;11;87;122m[38;2;11;85;119mβ[48;2;11;86;121m[38;2;11;85;119mβ[48;2;11;90;126m[38;2;11;89;124mβ[48;2;4;36;51m[38;2;6;43;60mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;4;5m[38;2;0;0;0mβ[48;2;10;75;104m[38;2;9;68;95mβ[48;2;11;86;121m[38;2;11;87;122mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;87;122m[38;2;11;88;123mβ[48;2;2;20;28m[38;2;3;25;36mβ[48;2;6;46;65m[38;2;5;41;58mβ[48;2;11;88;124m[38;2;11;89;124mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;86;120m[38;2;11;85;119mβ[48;2;11;84;118m[38;2;11;87;122mβ[48;2;3;21;30m[38;2;9;73;103mβ[48;2;0;0;0m[38;2;1;12;17mβ[48;2;9;72;101m[38;2;9;71;100mβ[48;2;11;87;121m[38;2;11;87;121mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;87;122m[38;2;11;87;122mβ[48;2;3;21;29m[38;2;2;21;29mβ[48;2;5;39;55m[38;2;5;39;55mβ[48;2;11;89;124m[38;2;11;89;124mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;88;124m[38;2;11;88;124mβ[48;2;7;55;77m[38;2;7;51;71mβ[48;2;0;0;0m[38;2;1;6;8mβ[48;2;7;56;79m[38;2;10;80;112mβ[48;2;11;88;123m[38;2;11;86;120mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;86;120mβ[48;2;11;88;124m[38;2;10;80;112mβ[48;2;5;38;53m[38;2;1;8;11mβ[48;2;1;10;14m[38;2;2;16;22mβ[48;2;11;83;116m[38;2;11;85;119mβ[48;2;11;86;120m[38;2;11;85;120mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;120m[38;2;11;88;123mβ[48;2;11;86;120m[38;2;11;88;123mβ[48;2;11;86;121m[38;2;11;87;122mβ[48;2;11;87;121m[38;2;11;86;121mβ[48;2;11;88;124m[38;2;11;87;123mβ[48;2;10;80;113m[38;2;9;72;101mβ[48;2;2;14;20m[38;2;2;15;21mβ[48;2;10;79;110m[38;2;11;82;115mβ[48;2;11;89;125m[38;2;11;86;120mβ[48;2;11;87;122m[38;2;11;85;119mβ[48;2;11;84;118m[38;2;11;85;120mβ[48;2;10;80;112m[38;2;11;86;120mβ[48;2;10;74;103m[38;2;11;87;121mβ[48;2;8;66;92m[38;2;11;87;122mβ[48;2;7;53;74m[38;2;11;88;124mβ[48;2;4;30;42m[38;2;11;88;123mβ[48;2;1;5;7m[38;2;9;74;104mβ[48;2;0;0;0m[38;2;3;27;37mβ[48;2;0;0;0m[38;2;0;0;0mβ[0m +[48;2;11;83;116m[38;2;9;70;98mβ[48;2;11;86;120m[38;2;11;86;121mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;86;121mβ[48;2;11;85;119m[38;2;11;88;123mβ[48;2;11;85;119m[38;2;11;86;121mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;87;122m[38;2;11;88;123mβ[48;2;2;18;25m[38;2;4;28;40mβ[48;2;6;47;66m[38;2;5;38;53mβ[48;2;11;88;124m[38;2;11;89;124mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;88;124m[38;2;11;88;123mβ[48;2;6;50;69m[38;2;7;57;80mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;8;64;90m[38;2;7;58;81mβ[48;2;11;87;122m[38;2;11;88;123mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;88;124m[38;2;11;88;124mβ[48;2;4;29;41m[38;2;4;34;47mβ[48;2;5;36;50m[38;2;4;33;46mβ[48;2;11;89;124m[38;2;11;88;124mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;87;121m[38;2;11;85;119mβ[48;2;10;76;106m[38;2;11;86;121mβ[48;2;11;82;115m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;87;122m[38;2;11;86;120mβ[48;2;2;22;29m[38;2;2;18;25mβ[48;2;5;39;55m[38;2;5;39;55mβ[48;2;11;89;124m[38;2;11;89;124mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;88;123m[38;2;11;85;119mβ[48;2;7;56;78m[38;2;11;84;118mβ[48;2;5;39;55m[38;2;11;85;119mβ[48;2;11;88;123m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;88;124m[38;2;11;86;120mβ[48;2;7;54;75m[38;2;3;21;29mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;3;22;30m[38;2;4;27;38mβ[48;2;11;87;121m[38;2;11;88;122mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;120m[38;2;11;86;121mβ[48;2;11;82;114m[38;2;10;76;107mβ[48;2;7;58;81m[38;2;2;20;28mβ[48;2;8;61;86m[38;2;2;12;17mβ[48;2;9;68;95m[38;2;1;10;13mβ[48;2;10;74;104m[38;2;1;8;11mβ[48;2;10;82;115m[38;2;1;9;12mβ[48;2;8;58;82m[38;2;1;5;8mβ[48;2;2;19;27m[38;2;4;27;39mβ[48;2;11;85;119m[38;2;11;88;123mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;87;122mβ[48;2;11;85;119m[38;2;11;88;124mβ[48;2;11;85;119m[38;2;11;88;124mβ[48;2;11;85;119m[38;2;11;88;123mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;87;122m[38;2;11;85;119mβ[48;2;11;84;117m[38;2;11;87;122mβ[48;2;3;25;36m[38;2;9;70;99mβ[0m +[48;2;7;56;78m[38;2;5;41;57mβ[48;2;11;87;122m[38;2;11;87;122mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;86;120mβ[48;2;11;86;121m[38;2;10;79;110mβ[48;2;10;76;106m[38;2;2;12;18mβ[48;2;8;59;83m[38;2;0;0;0mβ[48;2;10;78;109m[38;2;3;19;26mβ[48;2;11;86;120m[38;2;11;83;116mβ[48;2;11;85;119m[38;2;11;86;120mβ[48;2;11;85;119m[38;2;11;86;121mβ[48;2;11;88;123m[38;2;10;74;104mβ[48;2;3;23;33m[38;2;0;3;5mβ[48;2;4;29;41m[38;2;3;23;32mβ[48;2;11;88;124m[38;2;11;87;122mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;87;122m[38;2;11;87;122mβ[48;2;8;64;89m[38;2;9;69;96mβ[48;2;0;0;0m[38;2;0;1;1mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;7;52;73m[38;2;6;45;63mβ[48;2;11;88;124m[38;2;11;89;124mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;89;124m[38;2;11;88;124mβ[48;2;5;40;55m[38;2;6;43;60mβ[48;2;4;29;41m[38;2;3;24;34mβ[48;2;11;88;123m[38;2;11;88;123mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;86;120m[38;2;11;86;120mβ[48;2;2;17;24m[38;2;2;17;24mβ[48;2;5;39;55m[38;2;6;43;60mβ[48;2;11;89;124m[38;2;11;89;124mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;87;122m[38;2;11;87;122mβ[48;2;9;67;94m[38;2;9;67;94mβ[48;2;0;1;2m[38;2;0;1;1mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;4;32;45m[38;2;5;36;51mβ[48;2;11;88;123m[38;2;11;88;124mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;86;120m[38;2;11;85;119mβ[48;2;11;86;120m[38;2;11;85;119mβ[48;2;11;83;116m[38;2;11;86;120mβ[48;2;10;79;111m[38;2;11;86;121mβ[48;2;9;74;103m[38;2;11;87;121mβ[48;2;2;14;20m[38;2;2;18;26mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;5;37;52m[38;2;6;46;65mβ[48;2;11;88;124m[38;2;11;89;124mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;87;121m[38;2;11;86;121mβ[48;2;7;51;71m[38;2;3;26;37mβ[48;2;6;48;67m[38;2;0;3;4mβ[48;2;6;48;67m[38;2;0;0;0mβ[48;2;6;49;69m[38;2;0;0;0mβ[48;2;11;84;117m[38;2;9;69;97mβ[48;2;11;85;119m[38;2;11;87;122mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;84;118mβ[0m +[48;2;4;27;37m[38;2;2;15;21mβ[48;2;11;86;121m[38;2;11;82;115mβ[48;2;11;85;119m[38;2;11;85;120mβ[48;2;11;87;121m[38;2;11;85;119mβ[48;2;10;74;103m[38;2;11;87;122mβ[48;2;0;2;3m[38;2;5;42;59mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;1;10;14m[38;2;4;29;41mβ[48;2;10;80;112m[38;2;11;88;123mβ[48;2;11;86;120m[38;2;11;85;119mβ[48;2;11;86;121m[38;2;11;85;119mβ[48;2;10;75;105m[38;2;11;88;123mβ[48;2;1;11;15m[38;2;9;70;98mβ[48;2;2;14;20m[38;2;2;14;20mβ[48;2;11;84;118m[38;2;10;80;112mβ[48;2;11;86;119m[38;2;11;86;120mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;86;121m[38;2;11;86;121mβ[48;2;10;75;105m[38;2;10;79;111mβ[48;2;1;4;5m[38;2;1;6;8mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;5;40;56m[38;2;4;31;43mβ[48;2;11;89;124m[38;2;11;88;124mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;88;124m[38;2;11;88;123mβ[48;2;6;48;68m[38;2;7;54;77mβ[48;2;3;20;28m[38;2;2;16;23mβ[48;2;11;87;121m[38;2;11;86;120mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;86;121mβ[48;2;11;86;120m[38;2;9;72;101mβ[48;2;11;87;123m[38;2;6;48;68mβ[48;2;11;85;119m[38;2;11;87;122mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;86;120m[38;2;11;86;120mβ[48;2;2;17;24m[38;2;2;17;24mβ[48;2;6;44;62m[38;2;6;44;62mβ[48;2;11;89;124m[38;2;11;89;124mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;87;122mβ[48;2;11;87;121m[38;2;7;53;74mβ[48;2;11;87;121m[38;2;8;59;83mβ[48;2;11;85;119m[38;2;11;87;122mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;86;120m[38;2;11;85;119mβ[48;2;11;83;116m[38;2;11;88;124mβ[48;2;2;14;19m[38;2;5;36;51mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;5;42;59m[38;2;6;47;66mβ[48;2;11;89;124m[38;2;11;89;124mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;86;121mβ[48;2;11;87;121m[38;2;9;67;94mβ[48;2;11;88;124m[38;2;6;49;69mβ[48;2;11;88;123m[38;2;7;56;79mβ[48;2;11;88;123m[38;2;8;65;91mβ[48;2;11;83;117m[38;2;8;59;82mβ[48;2;1;11;15m[38;2;0;3;4mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;7;55;78m[38;2;8;64;90mβ[48;2;11;88;123m[38;2;11;88;123mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;10;81;113m[38;2;11;86;120mβ[48;2;10;78;109m[38;2;11;86;121mβ[48;2;6;49;69m[38;2;11;88;123mβ[48;2;6;44;61m[38;2;11;88;123mβ[48;2;11;83;116m[38;2;11;85;119mβ[48;2;11;85;120m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;86;120m[38;2;11;88;123mβ[48;2;10;74;103m[38;2;6;48;67mβ[0m +[48;2;1;6;8m[38;2;0;0;0mβ[48;2;10;75;105m[38;2;9;66;92mβ[48;2;11;86;121m[38;2;11;87;122mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;88;123m[38;2;11;88;122mβ[48;2;8;60;83m[38;2;8;66;92mβ[48;2;0;0;0m[38;2;2;17;24mβ[48;2;2;12;18m[38;2;4;30;42mβ[48;2;11;83;117m[38;2;10;79;111mβ[48;2;11;85;120m[38;2;11;86;120mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;87;122m[38;2;11;88;124mβ[48;2;4;28;39m[38;2;4;33;47mβ[48;2;9;72;101m[38;2;7;55;78mβ[48;2;11;87;121m[38;2;11;89;124mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;4;36;50m[38;2;11;86;121mβ[48;2;2;19;27m[38;2;11;86;120mβ[48;2;7;56;79m[38;2;11;87;122mβ[48;2;11;87;122m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;88;124m[38;2;11;88;124mβ[48;2;6;49;69m[38;2;3;27;38mβ[48;2;2;13;18m[38;2;1;11;15mβ[48;2;11;84;118m[38;2;11;83;117mβ[48;2;11;85;120m[38;2;11;86;120mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;87;122m[38;2;11;87;122mβ[48;2;9;67;95m[38;2;9;71;100mβ[48;2;0;1;1m[38;2;0;1;1mβ[48;2;8;62;87m[38;2;2;13;18mβ[48;2;11;88;123m[38;2;10;80;112mβ[48;2;11;85;119m[38;2;11;86;121mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;86;120m[38;2;11;86;120mβ[48;2;2;17;24m[38;2;2;17;24mβ[48;2;6;44;62m[38;2;6;44;62mβ[48;2;11;89;124m[38;2;11;89;124mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;88;124m[38;2;11;88;124mβ[48;2;4;31;43m[38;2;4;33;46mβ[48;2;3;21;29m[38;2;0;3;4mβ[48;2;11;87;122m[38;2;10;76;107mβ[48;2;11;85;119m[38;2;11;86;121mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;88;123m[38;2;11;86;120mβ[48;2;8;60;85m[38;2;10;79;110mβ[48;2;0;0;0m[38;2;1;5;7mβ[48;2;7;52;73m[38;2;7;56;79mβ[48;2;11;88;123m[38;2;11;88;123mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;87;123m[38;2;11;85;119mβ[48;2;7;54;76m[38;2;11;86;121mβ[48;2;2;17;23m[38;2;11;86;120mβ[48;2;1;12;16m[38;2;11;83;116mβ[48;2;1;8;12m[38;2;10;80;112mβ[48;2;1;4;6m[38;2;10;76;106mβ[48;2;0;0;0m[38;2;8;60;84mβ[48;2;0;1;2m[38;2;1;10;14mβ[48;2;9;71;100m[38;2;10;77;108mβ[48;2;11;87;122m[38;2;11;86;120mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;86;120mβ[48;2;11;85;119m[38;2;11;87;122mβ[48;2;11;85;119m[38;2;11;86;120mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;85;119mβ[48;2;11;85;119m[38;2;11;86;120mβ[48;2;11;87;122m[38;2;10;80;112mβ[48;2;10;77;109m[38;2;3;22;31mβ[48;2;2;11;16m[38;2;0;0;0mβ[0m +[48;2;0;0;0m[38;2;0;0;0mβ[48;2;7;54;75m[38;2;5;37;52mβ[48;2;11;89;125m[38;2;10;80;113mβ[48;2;11;86;121m[38;2;10;77;108mβ[48;2;11;86;121m[38;2;10;77;108mβ[48;2;11;86;120m[38;2;10;78;109mβ[48;2;11;86;120m[38;2;10;78;109mβ[48;2;11;88;124m[38;2;10;78;109mβ[48;2;11;86;121m[38;2;10;77;108mβ[48;2;11;86;121m[38;2;10;77;108mβ[48;2;11;86;121m[38;2;10;77;108mβ[48;2;11;86;121m[38;2;10;78;110mβ[48;2;11;89;125m[38;2;9;71;99mβ[48;2;4;28;39m[38;2;1;8;11mβ[48;2;2;18;26m[38;2;0;0;0mβ[48;2;11;86;120m[38;2;4;35;49mβ[48;2;11;87;122m[38;2;10;77;108mβ[48;2;11;86;121m[38;2;10;78;109mβ[48;2;11;86;121m[38;2;10;77;108mβ[48;2;11;86;121m[38;2;10;77;108mβ[48;2;11;86;121m[38;2;10;77;108mβ[48;2;11;86;121m[38;2;10;77;108mβ[48;2;11;86;121m[38;2;10;77;109mβ[48;2;11;86;121m[38;2;10;78;110mβ[48;2;11;90;125m[38;2;7;54;76mβ[48;2;8;62;87m[38;2;1;6;9mβ[48;2;0;2;3m[38;2;0;0;0mβ[48;2;1;9;13m[38;2;0;1;4mβ[48;2;10;83;116m[38;2;7;61;89mβ[48;2;11;87;122m[38;2;9;76;109mβ[48;2;11;86;121m[38;2;9;73;104mβ[48;2;11;89;123m[38;2;8;71;102mβ[48;2;10;75;106m[38;2;6;48;69mβ[48;2;0;3;4m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;5;37;51m[38;2;0;0;0mβ[48;2;11;89;125m[38;2;6;47;68mβ[48;2;11;88;123m[38;2;7;63;91mβ[48;2;11;88;123m[38;2;7;58;84mβ[48;2;11;88;123m[38;2;7;59;84mβ[48;2;11;89;124m[38;2;6;51;74mβ[48;2;2;17;24m[38;2;0;2;5mβ[48;2;6;46;64m[38;2;3;27;40mβ[48;2;11;92;128m[38;2;7;64;92mβ[48;2;11;87;122m[38;2;1;56;83mβ[48;2;11;87;122m[38;2;3;58;85mβ[48;2;11;90;126m[38;2;8;66;95mβ[48;2;4;32;44m[38;2;2;17;26mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;7;54;75m[38;2;2;21;31mβ[48;2;11;90;126m[38;2;9;74;106mβ[48;2;11;86;121m[38;2;9;75;107mβ[48;2;11;86;121m[38;2;9;74;107mβ[48;2;11;88;124m[38;2;9;78;111mβ[48;2;3;26;36m[38;2;5;40;57mβ[48;2;8;60;85m[38;2;7;56;79mβ[48;2;11;89;125m[38;2;10;80;111mβ[48;2;11;86;121m[38;2;10;78;108mβ[48;2;11;86;121m[38;2;10;78;108mβ[48;2;11;86;121m[38;2;10;78;108mβ[48;2;11;86;121m[38;2;10;78;108mβ[48;2;11;86;121m[38;2;10;78;108mβ[48;2;11;87;121m[38;2;10;78;108mβ[48;2;11;87;122m[38;2;10;78;108mβ[48;2;11;89;125m[38;2;10;79;111mβ[48;2;10;77;107m[38;2;8;61;85mβ[48;2;2;17;24m[38;2;2;18;26mβ[48;2;11;82;115m[38;2;10;78;109mβ[48;2;11;87;122m[38;2;10;77;109mβ[48;2;11;86;121m[38;2;10;77;108mβ[48;2;11;87;122m[38;2;10;80;112mβ[48;2;10;78;109m[38;2;7;58;81mβ[48;2;4;33;46m[38;2;0;0;0mβ[48;2;10;79;110m[38;2;8;60;84mβ[48;2;11;87;122m[38;2;10;79;111mβ[48;2;11;86;121m[38;2;10;77;108mβ[48;2;11;89;124m[38;2;10;79;110mβ[48;2;9;67;93m[38;2;9;68;95mβ[48;2;0;0;0m[38;2;0;3;5mβ[48;2;0;0;0m[38;2;0;0;0mβ[0m +[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;2;3m[38;2;0;0;0mβ[48;2;1;6;9m[38;2;0;0;0mβ[48;2;1;6;9m[38;2;0;0;0mβ[48;2;1;6;9m[38;2;0;0;0mβ[48;2;1;6;9m[38;2;0;0;0mβ[48;2;1;6;9m[38;2;0;0;0mβ[48;2;1;6;9m[38;2;0;0;0mβ[48;2;1;6;9m[38;2;0;0;0mβ[48;2;1;6;9m[38;2;0;0;0mβ[48;2;1;6;9m[38;2;0;0;0mβ[48;2;1;6;9m[38;2;0;0;0mβ[48;2;1;4;6m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;1;5;7m[38;2;0;0;0mβ[48;2;1;6;9m[38;2;0;0;0mβ[48;2;1;6;9m[38;2;0;0;0mβ[48;2;1;6;9m[38;2;0;0;0mβ[48;2;1;6;9m[38;2;0;0;0mβ[48;2;1;6;9m[38;2;0;0;0mβ[48;2;1;6;9m[38;2;0;0;0mβ[48;2;1;6;8m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;4;16;10m[38;2;33;123;75mβ[48;2;6;22;13m[38;2;45;169;102mβ[48;2;6;24;17m[38;2;44;164;99mβ[48;2;6;28;22m[38;2;44;163;98mβ[48;2;6;26;20m[38;2;43;163;98mβ[48;2;6;24;16m[38;2;38;162;94mβ[48;2;6;21;12m[38;2;39;162;96mβ[48;2;6;21;13m[38;2;44;164;100mβ[48;2;6;21;13m[38;2;44;164;99mβ[48;2;6;21;12m[38;2;39;162;96mβ[48;2;5;19;10m[38;2;38;162;95mβ[48;2;6;20;12m[38;2;44;164;99mβ[48;2;5;20;10m[38;2;43;164;99mβ[48;2;5;19;10m[38;2;39;162;95mβ[48;2;5;19;10m[38;2;38;162;95mβ[48;2;6;21;12m[38;2;39;162;95mβ[48;2;5;20;11m[38;2;43;164;99mβ[48;2;6;21;12m[38;2;43;164;98mβ[48;2;78;84;80m[38;2;94;195;141mβ[48;2;53;60;55m[38;2;134;206;167mβ[48;2;5;21;12m[38;2;34;160;91mβ[48;2;6;21;12m[38;2;38;162;95mβ[48;2;6;21;13m[38;2;39;162;96mβ[48;2;6;21;12m[38;2;44;164;99mβ[48;2;6;25;19m[38;2;44;164;98mβ[48;2;7;28;22m[38;2;44;163;98mβ[48;2;7;28;22m[38;2;45;168;101mβ[48;2;5;22;19m[38;2;32;122;73mβ[48;2;0;3;5m[38;2;0;0;0mβ[48;2;0;4;6m[38;2;0;0;0mβ[48;2;1;6;9m[38;2;0;0;0mβ[48;2;1;6;9m[38;2;0;0;0mβ[48;2;1;6;9m[38;2;0;0;0mβ[48;2;1;6;9m[38;2;0;0;0mβ[48;2;1;6;9m[38;2;0;0;0mβ[48;2;1;6;9m[38;2;0;0;0mβ[48;2;1;6;9m[38;2;0;0;0mβ[48;2;1;6;9m[38;2;0;0;0mβ[48;2;1;6;9m[38;2;0;0;0mβ[48;2;0;4;6m[38;2;0;0;0mβ[48;2;0;2;2m[38;2;0;0;0mβ[48;2;1;6;9m[38;2;0;0;0mβ[48;2;1;6;9m[38;2;0;0;0mβ[48;2;1;6;9m[38;2;0;0;0mβ[48;2;1;6;9m[38;2;0;0;0mβ[48;2;1;4;6m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;1;4;6m[38;2;0;0;0mβ[48;2;1;6;9m[38;2;0;0;0mβ[48;2;1;6;9m[38;2;0;0;0mβ[48;2;1;6;9m[38;2;0;0;0mβ[48;2;1;6;8m[38;2;0;0;0mβ[48;2;0;1;1m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[0m +[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;34;130;79m[38;2;34;129;78mβ[48;2;47;179;108m[38;2;47;177;107mβ[48;2;46;174;105m[38;2;46;172;104mβ[48;2;46;173;104m[38;2;45;172;104mβ[48;2;51;175;108m[38;2;45;172;103mβ[48;2;101;195;144m[38;2;150;213;179mβ[48;2;89;191;136m[38;2;102;194;145mβ[48;2;44;172;103m[38;2;55;176;110mβ[48;2;45;173;104m[38;2;53;175;109mβ[48;2;94;193;140m[38;2;111;198;151mβ[48;2;100;195;144m[38;2;140;209;172mβ[48;2;48;174;106m[38;2;41;170;100mβ[48;2;47;174;105m[38;2;127;204;162mβ[48;2;102;196;145m[38;2;105;195;147mβ[48;2;122;203;159m[38;2;62;178;116mβ[48;2;103;196;146m[38;2;103;195;145mβ[48;2;48;174;106m[38;2;127;204;162mβ[48;2;43;172;102m[38;2;42;170;101mβ[48;2;63;179;117m[38;2;61;178;115mβ[48;2;128;205;163m[38;2;189;229;208mβ[48;2;96;193;140m[38;2;110;197;150mβ[48;2;125;205;161m[38;2;65;180;118mβ[48;2;100;195;144m[38;2;121;202;158mβ[48;2;45;173;104m[38;2;119;201;157mβ[48;2;46;173;105m[38;2;41;170;101mβ[48;2;46;174;105m[38;2;46;172;104mβ[48;2;47;179;108m[38;2;47;177;107mβ[48;2;34;130;79m[38;2;34;129;78mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[0m +[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;34;129;78m[38;2;34;129;78mβ[48;2;47;177;107m[38;2;47;177;107mβ[48;2;46;172;104m[38;2;46;172;104mβ[48;2;46;172;104m[38;2;46;172;104mβ[48;2;40;170;100m[38;2;43;171;102mβ[48;2;95;192;139m[38;2;69;181;120mβ[48;2;89;189;135m[38;2;136;208;169mβ[48;2;139;209;172m[38;2;131;206;165mβ[48;2;131;206;165m[38;2;133;206;167mβ[48;2;95;192;139m[38;2;135;207;168mβ[48;2;85;188;132m[38;2;62;178;115mβ[48;2;61;178;115m[38;2;62;178;115mβ[48;2;170;221;194m[38;2;158;217;185mβ[48;2;105;195;147m[38;2;76;184;126mβ[48;2;110;197;150m[38;2;79;185;128mβ[48;2;106;196;148m[38;2;78;185;127mβ[48;2;166;219;190m[38;2;71;182;122mβ[48;2;62;179;116m[38;2;47;172;105mβ[48;2;63;179;116m[38;2;60;178;114mβ[48;2;148;213;178m[38;2;150;213;180mβ[48;2;38;169;98m[38;2;38;169;98mβ[48;2;43;171;102m[38;2;42;171;101mβ[48;2;41;170;100m[38;2;42;170;101mβ[48;2;141;210;173m[38;2;140;209;172mβ[48;2;55;176;111m[38;2;54;175;110mβ[48;2;45;172;103m[38;2;45;172;103mβ[48;2;47;177;107m[38;2;47;177;107mβ[48;2;34;129;78m[38;2;34;129;78mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[0m +[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;34;129;78m[38;2;34;129;78mβ[48;2;47;177;107m[38;2;47;177;107mβ[48;2;46;172;104m[38;2;46;172;104mβ[48;2;46;172;104m[38;2;46;172;104mβ[48;2;46;172;104m[38;2;46;172;104mβ[48;2;45;172;104m[38;2;43;171;102mβ[48;2;180;225;201m[38;2;88;189;134mβ[48;2;98;193;141m[38;2;55;176;111mβ[48;2;104;195;146m[38;2;56;176;112mβ[48;2;175;223;197m[38;2;85;188;132mβ[48;2;43;171;102m[38;2;43;171;102mβ[48;2;42;170;101m[38;2;45;172;104mβ[48;2;119;201;157m[38;2;44;171;103mβ[48;2;115;199;154m[38;2;99;193;143mβ[48;2;66;180;118m[38;2;128;205;164mβ[48;2;80;185;129m[38;2;121;202;159mβ[48;2;117;200;155m[38;2;77;184;126mβ[48;2;53;175;109m[38;2;45;172;103mβ[48;2;92;190;137m[38;2;96;192;140mβ[48;2;195;231;212m[38;2;79;185;128mβ[48;2;114;199;153m[38;2;96;192;140mβ[48;2;71;182;122m[38;2;126;204;161mβ[48;2;124;203;160m[38;2;96;192;140mβ[48;2;111;198;151m[38;2;43;171;102mβ[48;2;41;170;101m[38;2;46;172;104mβ[48;2;46;172;104m[38;2;46;172;104mβ[48;2;47;177;107m[38;2;47;177;107mβ[48;2;34;129;78m[38;2;34;129;78mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[48;2;0;0;0m[38;2;0;0;0mβ[0m diff --git a/misc/logo.png b/misc/logo.png index b4f39d0da..18d95f3d7 100644 Binary files a/misc/logo.png and b/misc/logo.png differ diff --git a/misc/requirements-ansible.txt b/misc/requirements-ansible.txt index 0f99812f9..40f7cf1bc 100644 --- a/misc/requirements-ansible.txt +++ b/misc/requirements-ansible.txt @@ -8,9 +8,9 @@ ansible==8.6.1 \ --hash=sha256:18b397580c1f05ce5de1fe238508dd81218d278667956d2f7709320176c3ed4a \ --hash=sha256:222735c32d2d2749f207e55ef740638bb97c7aaaa8b63bb7c7592d447da47584 # via -r requirements-ansible.in -ansible-core==2.15.7 \ - --hash=sha256:8a7988b8fbd1f4bb5799becae120b828de6248ba9056d83f427235533d655e2b \ - --hash=sha256:bc51d011bdb67538d1ee043e0f8072b3a849b78897caf15b6f294160c5c7c6ba +ansible-core==2.15.8 \ + --hash=sha256:55e6f4350fb98ac5441620ba981b1d9f7b90aa5f320885965af996e149bd3caa \ + --hash=sha256:8aa49cb1ddbf33d88c2bb4bf09ecd4b0dd8b788e174adca8b88dda6e6bdbf59b # via ansible cffi==1.16.0 \ --hash=sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc \ diff --git a/mkdocs.yml b/mkdocs.yml index df4fcd0bb..b8cd13a60 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,7 +1,7 @@ -site_name: BunkerWeb +site_name: BunkerWeb documentation site_url: https://docs.bunkerweb.io/ repo_url: https://github.com/bunkerity/bunkerweb -site_description: Make your web services secure by default. +site_description: Documentation of BunkerWeb, the open source and next generation WAF. copyright: Copyright © Bunkerity #remote_branch: ? #remote_name: ? @@ -69,5 +69,9 @@ extra: plugins: - search - print-site + - social: + cards_layout_options: + background_color: "#0b5577" + color: "white" - mike: canonical_version: latest diff --git a/src/autoconf/Dockerfile b/src/autoconf/Dockerfile index b757f9031..65330ff4b 100644 --- a/src/autoconf/Dockerfile +++ b/src/autoconf/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.12.0-alpine3.18@sha256:f1d0d03700fb2d4480e89fb807e7346c14b88952f7bd58d56de54a24817cc2e8 AS builder +FROM python:3.12.1-alpine3.18@sha256:af0d8da43677e3000ebdf4045508d891a87e7bd2d3ec87bc6e40403be97291b8 AS builder # Copy python requirements COPY src/deps/requirements.txt /tmp/requirements-deps.txt @@ -34,7 +34,7 @@ COPY src/common/helpers helpers COPY src/common/settings.json settings.json COPY src/common/utils utils -FROM python:3.12.0-alpine3.18@sha256:f1d0d03700fb2d4480e89fb807e7346c14b88952f7bd58d56de54a24817cc2e8 +FROM python:3.12.1-alpine3.18@sha256:af0d8da43677e3000ebdf4045508d891a87e7bd2d3ec87bc6e40403be97291b8 # Set default umask to prevent huge recursive chmod increasing the final image size RUN umask 027 diff --git a/src/autoconf/IngressController.py b/src/autoconf/IngressController.py index cbfb9621e..bdd3d34bf 100644 --- a/src/autoconf/IngressController.py +++ b/src/autoconf/IngressController.py @@ -121,10 +121,6 @@ class IngressController(Controller): location += 1 services.append(service) - # parse tls - if controller_service.spec.tls: # TODO: support tls - self._logger.warning("Ignoring unsupported tls.") - # parse annotations if controller_service.metadata.annotations: for service in services: @@ -142,6 +138,36 @@ class IngressController(Controller): variable = variable.replace(f"{server_name}_", "", 1) if self._is_setting_context(variable, "multisite"): service[variable] = value + + # parse tls + if controller_service.spec.tls: + for tls in controller_service.spec.tls: + if tls.hosts and tls.secret_name: + for host in tls.hosts: + for service in services: + if host in service["SERVER_NAME"].split(" "): + secret_tls = self.__corev1.list_secret_for_all_namespaces( + watch=False, + field_selector=f"metadata.name={tls.secret_name},metadata.namespace={namespace}", + ).items + if not secret_tls: + self._logger.warning( + f"Ignoring tls setting for {host} : secret {tls.secret_name} not found.", + ) + break + if not secret_tls.data: + self._logger.warning( + f"Ignoring tls setting for {host} : secret {tls.secret_name} contains no data.", + ) + break + if "tls.crt" not in secret_tls.data or "tls.key" not in secret_tls.data: + self._logger.warning( + f"Ignoring tls setting for {host} : secret {tls.secret_name} is missing tls data.", + ) + break + service["USE_CUSTOM_SSL"] = "yes" + service["CUSTOM_SSL_CERT_DATA"] = secret_tls.data["tls.crt"] + service["CUSTOM_SSL_KEY_DATA"] = secret_tls.data["tls.key"] return services def _get_static_services(self) -> List[dict]: diff --git a/src/bw/lua/bunkerweb/plugin.lua b/src/bw/lua/bunkerweb/plugin.lua index 473714a7c..488eb05c1 100644 --- a/src/bw/lua/bunkerweb/plugin.lua +++ b/src/bw/lua/bunkerweb/plugin.lua @@ -13,6 +13,7 @@ function plugin:initialize(id, ctx) local current_phase = ngx.get_phase() for _, check_phase in ipairs { "set", + "ssl_certificate", "access", "content", "header_filter", diff --git a/src/bw/lua/bunkerweb/utils.lua b/src/bw/lua/bunkerweb/utils.lua index 364b52b85..77382757c 100644 --- a/src/bw/lua/bunkerweb/utils.lua +++ b/src/bw/lua/bunkerweb/utils.lua @@ -680,6 +680,7 @@ utils.get_phases = function() "init_worker", "set", "access", + "ssl_certificate", "header", "log", "preread", @@ -692,6 +693,7 @@ utils.is_cosocket_available = function() local phases = { "timer", "access", + "ssl_certificate", "preread", } local current_phase = ngx.get_phase() diff --git a/src/common/confs/server-http/server.conf b/src/common/confs/server-http/server.conf index 4a137ed69..d6871be91 100644 --- a/src/common/confs/server-http/server.conf +++ b/src/common/confs/server-http/server.conf @@ -23,7 +23,9 @@ server { # include LUA files include {{ NGINX_PREFIX }}set-lua.conf; + include {{ NGINX_PREFIX }}ssl-certificate-lua.conf; include {{ NGINX_PREFIX }}access-lua.conf; + include {{ NGINX_PREFIX }}header-lua.conf; include {{ NGINX_PREFIX }}log-lua.conf; # include config files diff --git a/src/common/confs/server-http/ssl-certificate-lua.conf b/src/common/confs/server-http/ssl-certificate-lua.conf new file mode 100644 index 000000000..e9692db0c --- /dev/null +++ b/src/common/confs/server-http/ssl-certificate-lua.conf @@ -0,0 +1,94 @@ +ssl_certificate_by_lua_block { + local class = require "middleclass" + local clogger = require "bunkerweb.logger" + local helpers = require "bunkerweb.helpers" + local utils = require "bunkerweb.utils" + local cdatastore = require "bunkerweb.datastore" + local cclusterstore = require "bunkerweb.clusterstore" + local cjson = require "cjson" + local ssl = require "ngx.ssl" + + -- Don't process internal requests + local logger = clogger:new("SSL-CERTIFICATE") + if ngx.req.is_internal() then + logger:log(ngx.INFO, "skipped ssl_certificate phase because request is internal") + return true + end + + -- Start access phase + local datastore = cdatastore:new() + logger:log(ngx.INFO, "ssl_certificate phase started") + + -- Fill ctx + logger:log(ngx.INFO, "filling ngx.ctx ...") + local ok, ret, errors, ctx = helpers.fill_ctx() + if not ok then + logger:log(ngx.ERR, "fill_ctx() failed : " .. ret) + elseif errors then + for i, error in ipairs(errors) do + logger:log(ngx.ERR, "fill_ctx() error " .. tostring(i) .. " : " .. error) + end + end + logger:log(ngx.INFO, "ngx.ctx filled (ret = " .. ret .. ")") + + -- Get plugins order + local order, err = datastore:get("plugins_order", true) + if not order then + logger:log(ngx.ERR, "can't get plugins order from datastore : " .. err) + return + end + + -- Call ssl_certificate() methods + logger:log(ngx.INFO, "calling ssl_certificate() methods of plugins ...") + for i, plugin_id in ipairs(order.ssl_certificate) do + -- Require call + local plugin_lua, err = helpers.require_plugin(plugin_id) + if plugin_lua == false then + logger:log(ngx.ERR, err) + elseif plugin_lua == nil then + logger:log(ngx.INFO, err) + else + -- Check if plugin has access method + if plugin_lua.ssl_certificate ~= nil then + -- New call + local ok, plugin_obj = helpers.new_plugin(plugin_lua, ctx) + if not ok then + logger:log(ngx.ERR, plugin_obj) + else + local ok, ret = helpers.call_plugin(plugin_obj, "ssl_certificate") + if not ok then + logger:log(ngx.ERR, ret) + elseif not ret.ret then + logger:log(ngx.ERR, plugin_id .. ":ssl_certificate() call failed : " .. ret.msg) + else + logger:log(ngx.INFO, plugin_id .. ":ssl_certificate() call successful : " .. ret.msg) + if ret.status then + logger:log(ngx.INFO, plugin_id .. " is setting certificate/key : " .. ret.msg) + local ok, err = ssl.set_cert(ret.status[1]) + if not ok then + logger:log(ngx.ERR, "error while setting certificate : " .. err) + else + local ok, err = ssl.set_priv_key(ret.status[2]) + if not ok then + logger:log(ngx.ERR, "error while setting private key : " .. err) + else + return true + end + end + end + end + end + else + logger:log(ngx.INFO, "skipped execution of " .. plugin_id .. " because method ssl_certificate() is not defined") + end + end + end + logger:log(ngx.INFO, "called ssl_certificate() methods of plugins") + + -- Save ctx + ngx.ctx = ctx + + logger:log(ngx.INFO, "ssl_certificate phase ended") + + return true +} diff --git a/src/common/core/customcert/confs/server-http/custom-cert.conf b/src/common/core/customcert/confs/server-http/custom-cert.conf index 623fc48a7..0447a7d1c 100644 --- a/src/common/core/customcert/confs/server-http/custom-cert.conf +++ b/src/common/core/customcert/confs/server-http/custom-cert.conf @@ -1,7 +1,6 @@ {% set os_path = import("os.path") %} {% if USE_CUSTOM_SSL == "yes" %} -{% if os_path.isfile("/var/cache/bunkerweb/customcert/cert.pem") and os_path.isfile("/var/cache/bunkerweb/customcert/key.pem") or os_path.isfile("/var/cache/bunkerweb/customcert/" + SERVER_NAME.split(" ")[0] + "/cert.pem") and os_path.isfile("/var/cache/bunkerweb/customcert/" + SERVER_NAME.split(" ")[0] + "/key.pem") +%} # listen on HTTPS PORT listen 0.0.0.0:{{ HTTPS_PORT }} ssl {% if HTTP2 == "yes" %}http2{% endif %} {% if USE_PROXY_PROTOCOL == "yes" %}proxy_protocol{% endif %}; @@ -10,16 +9,18 @@ listen [::]:{{ HTTPS_PORT }} ssl {% if HTTP2 == "yes" %}http2{% endif %} {% if U {% endif %} # TLS config -{% if os_path.isfile("/var/cache/bunkerweb/customcert/" + SERVER_NAME.split(" ")[0] + "/cert.pem") %} -ssl_certificate /var/cache/bunkerweb/customcert/{{ SERVER_NAME.split(" ")[0] }}/cert.pem; -{% else %} -ssl_certificate /var/cache/bunkerweb/customcert/cert.pem; -{% endif %} -{% if os_path.isfile("/var/cache/bunkerweb/customcert/" + SERVER_NAME.split(" ")[0] + "/key.pem") %} -ssl_certificate_key /var/cache/bunkerweb/customcert/{{ SERVER_NAME.split(" ")[0] }}/key.pem; -{% else %} -ssl_certificate_key /var/cache/bunkerweb/customcert/key.pem; -{% endif %} +ssl_certificate /var/cache/bunkerweb/default-server-cert/cert.pem; +ssl_certificate_key /var/cache/bunkerweb/default-server-cert/cert.key; +# {% if os_path.isfile("/var/cache/bunkerweb/customcert/" + SERVER_NAME.split(" ")[0] + "/cert.pem") %} +# ssl_certificate /var/cache/bunkerweb/customcert/{{ SERVER_NAME.split(" ")[0] }}/cert.pem; +# {% else %} +# ssl_certificate /var/cache/bunkerweb/customcert/cert.pem; +# {% endif %} +# {% if os_path.isfile("/var/cache/bunkerweb/customcert/" + SERVER_NAME.split(" ")[0] + "/key.pem") %} +# ssl_certificate_key /var/cache/bunkerweb/customcert/{{ SERVER_NAME.split(" ")[0] }}/key.pem; +# {% else %} +# ssl_certificate_key /var/cache/bunkerweb/customcert/key.pem; +# {% endif %} ssl_protocols {{ SSL_PROTOCOLS }}; ssl_prefer_server_ciphers on; ssl_session_tickets off; @@ -30,5 +31,4 @@ ssl_dhparam /etc/nginx/dhparam; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; {% endif %} -{% endif %} -{% endif %} +{% endif %} \ No newline at end of file diff --git a/src/common/core/customcert/customcert.lua b/src/common/core/customcert/customcert.lua new file mode 100644 index 000000000..22e0582ea --- /dev/null +++ b/src/common/core/customcert/customcert.lua @@ -0,0 +1,132 @@ +local class = require "middleclass" +local plugin = require "bunkerweb.plugin" +local utils = require "bunkerweb.utils" +local ssl = require "ngx.ssl" + +local customcert = class("customcert", plugin) + +function customcert:initialize(ctx) + -- Call parent initialize + plugin.initialize(self, "customcert", ctx) +end + +function customcert:init() + local ok, err = true, "success" + if utils.has_variable("USE_CUSTOM_SSL", "yes") then + local multisite, err = utils.get_variable("MULTISITE") + if not multisite then + return self:ret(false, "can't get MULTISITE variable : " .. err) + end + if multisite == "yes" then + local vars, err = utils.get_multiple_variables({"USE_CUSTOM_SSL"}) + if not vars then + return self:ret(false, "can't get USE_CUSTOM_SSL variables : " .. err) + end + if vars["global"]["USE_CUSTOM_SSL"] == "yes" then + local check, data = self:read_files() + if not check then + self.logger:log(ngx.ERR, "error while reading files : " .. err) + ok = false + err = "error reading files" + else + local check, err = self:load_data(data) + if not check then + self.logger:log(ngx.ERR, "error while loading data : " .. err) + ok = false + err = "error loading data" + end + end + end + for server_name, multisite_vars in pairs(vars) do + if multisite_vars["USE_CUSTOM_SSL"] == "yes" then + local check, data = self:read_files(server_name) + if not check then + self.logger:log(ngx.ERR, "error while reading files : " .. err) + ok = false + err = "error reading files" + else + local check, err = self:load_data(data, server_name) + if not check then + self.logger:log(ngx.ERR, "error while loading data : " .. err) + ok = false + err = "error loading data" + end + end + end + end + else + local check, data = self:read_files() + if not check then + self.logger:log(ngx.ERR, "error while reading files : " .. err) + ok = false + err = "error reading files" + else + local check, err = self:load_data(data) + if not check then + self.logger:log(ngx.ERR, "error while loading data : " .. err) + ok = false + err = "error loading data" + end + end + end + else + err = "custom ssl is not used" + end + return self:ret(ok, err) +end + +function customcert:ssl_certificate() + if self.variables["USE_CUSTOM_SSL"] == "yes" then + local global_data, err = self.datastore:get("plugin_customcert_global", true) + if not global_data and err ~= "not found" then + return self:ret(false, "error while getting plugin_customcert_global from datastore : " .. err) + end + local site_data, err = self.datastore:get("plugin_customcert_" .. self.ctx.bw.server_name, true) + if not site_data and err ~= "not found" then + return self:ret(false, "error while getting plugin_customcert_" .. self.ctx.bw.server_name .. " from datastore : " .. err) + end + if not global_data and not site_data then + return self:ret(false, "both global and site cert are not present in datastore") + end + return self:ret(true, "certificate/key data found", site_data or global_data) + end + return self:ret(true, "custom certificate is not used") +end + +function customcert:read_files(server_name) + local files = { + "/var/cache/bunkerweb/customcert/" .. (server_name or "") .. "/cert.pem", + "/var/cache/bunkerweb/customcert/" .. (server_name or "") .. "/key.pem" + } + local data = {} + for i, file in ipairs(files) do + local f, err = io.open(file, "r") + if not f then + return false, file .. " = " .. err + end + table.insert(data, f:read("*a")) + f:close() + end + return true, data +end + +function customcert:load_data(data, server_name) + -- Load certificate + local cert_chain, err = ssl.parse_pem_cert(data[1]) + if not cert_chain then + return false, "error while parsing pem cert : " .. err + end + -- Load key + local priv_key, err = ssl.parse_priv_key(data[2]) + if not priv_key then + return false, "error while parsing pem priv key : " .. err + end + local cache_key = "plugin_customcert_" .. (server_name or "global") + local ok, err = self.datastore:set(cache_key, {cert_chain, priv_key}, nil, true) + if not ok then + return false, "error while setting data into datastore : " .. err + end + return true +end + +return customcert \ No newline at end of file diff --git a/src/common/core/customcert/jobs/custom-cert.py b/src/common/core/customcert/jobs/custom-cert.py index b6a2e5a5b..c88ef819f 100644 --- a/src/common/core/customcert/jobs/custom-cert.py +++ b/src/common/core/customcert/jobs/custom-cert.py @@ -6,6 +6,7 @@ from pathlib import Path from sys import exit as sys_exit, path as sys_path from traceback import format_exc from typing import Optional +from base64 import b64decode for deps_path in [ join(sep, "usr", "share", "bunkerweb", *paths) @@ -99,6 +100,28 @@ try: cert_path = getenv("CUSTOM_SSL_CERT", "") key_path = getenv("CUSTOM_SSL_KEY", "") + cert_data = b64decode(getenv("CUSTOM_SSL_CERT_DATA", "")) + key_data = b64decode(getenv("CUSTOM_SSL_KEY_DATA", "")) + for file, data in [("cert.pem", cert_data), ("key.pem", key_data)]: + if data != b"": + file_path = Path( + sep, + "var", + "tmp", + "bunkerweb", + "customcert", + file + ) + file_path.parent.mkdir(parents=True, exist_ok=True) + file_path.write_bytes(data) + if file == "cert.pem": + cert_path = str(file_path) + else: + key_path = str(file_path) + + if cert_data != b"": + with open() + if cert_path and key_path: logger.info(f"Checking certificate {cert_path} ...") need_reload = check_cert(cert_path, key_path) @@ -124,6 +147,26 @@ try: cert_path = getenv(f"{first_server}_CUSTOM_SSL_CERT", "") key_path = getenv(f"{first_server}_CUSTOM_SSL_KEY", "") + cert_data = b64decode(getenv(f"{first_server}_CUSTOM_SSL_CERT_DATA", "")) + key_data = b64decode(getenv(f"{first_server}_CUSTOM_SSL_KEY_DATA", "")) + for file, data in [("cert.pem", cert_data), ("key.pem", key_data)]: + if data != b"": + file_path = Path( + sep, + "var", + "tmp", + "bunkerweb", + "customcert", + server_name, + file + ) + file_path.parent.mkdir(parents=True, exist_ok=True) + file_path.write_bytes(data) + if file == "cert.pem": + cert_path = str(file_path) + else: + key_path = str(file_path) + if cert_path and key_path: logger.info( f"Checking certificate {cert_path} ...", diff --git a/src/common/core/customcert/plugin.json b/src/common/core/customcert/plugin.json index 0016ee42a..c6366f368 100644 --- a/src/common/core/customcert/plugin.json +++ b/src/common/core/customcert/plugin.json @@ -31,6 +31,24 @@ "label": "Key path", "regex": "^(/[\\w. \\-]+)*/?$", "type": "text" + }, + "CUSTOM_SSL_CERT_DATA": { + "context": "multisite", + "default": "", + "help": "Certificate data encoded in base64.", + "id": "custom-https-cert-data", + "label": "Certificate data (base64)", + "regex": "^.*$", + "type": "text" + }, + "CUSTOM_SSL_KEY_DATA": { + "context": "multisite", + "default": "", + "help": "Key data encoded in base64.", + "id": "custom-https-key-data", + "label": "Key data (base64)", + "regex": "^.*$", + "type": "text" } }, "jobs": [ diff --git a/src/common/core/headers/plugin.json b/src/common/core/headers/plugin.json index c6573f3c3..8da20a712 100644 --- a/src/common/core/headers/plugin.json +++ b/src/common/core/headers/plugin.json @@ -85,19 +85,8 @@ "help": "Value for the Referrer-Policy header.", "id": "referrer-policy", "label": "Referrer-Policy", - "regex": "^(no-referrer|no-referrer-when-downgrade|origin|origin-when-cross-origin|same-origin|strict-origin|strict-origin-when-cross-origin|unsafe-url)?$", - "type": "select", - "select": [ - "", - "no-referrer", - "no-referrer-when-downgrade", - "origin", - "origin-when-cross-origin", - "same-origin", - "strict-origin", - "strict-origin-when-cross-origin", - "unsafe-url" - ] + "regex": "^(?!^(,| ))((, )?(no-referrer-when-downgrade|no-referrer|origin-when-cross-origin|same-origin|strict-origin-when-cross-origin|strict-origin|origin|unsafe-url)(?!\\b.*, \\4\\b))*$", + "type": "text" }, "PERMISSIONS_POLICY": { "context": "multisite", diff --git a/src/common/core/letsencrypt/confs/server-http/lets-encrypt.conf b/src/common/core/letsencrypt/confs/server-http/lets-encrypt.conf index 6cf6f2bf6..1d5e9538b 100644 --- a/src/common/core/letsencrypt/confs/server-http/lets-encrypt.conf +++ b/src/common/core/letsencrypt/confs/server-http/lets-encrypt.conf @@ -13,8 +13,10 @@ listen [::]:{{ HTTPS_PORT }} ssl {% if HTTP2 == "yes" %}http2{% endif %} {% if U {% endif %} # TLS config -ssl_certificate /var/cache/bunkerweb/letsencrypt/etc/live/{{ SERVER_NAME.split(" ")[0] }}/fullchain.pem; -ssl_certificate_key /var/cache/bunkerweb/letsencrypt/etc/live/{{ SERVER_NAME.split(" ")[0] }}/privkey.pem; +ssl_certificate /var/cache/bunkerweb/default-server-cert/cert.pem; +ssl_certificate_key /var/cache/bunkerweb/default-server-cert/cert.key; +#ssl_certificate /var/cache/bunkerweb/letsencrypt/etc/live/{{ SERVER_NAME.split(" ")[0] }}/fullchain.pem; +#ssl_certificate_key /var/cache/bunkerweb/letsencrypt/etc/live/{{ SERVER_NAME.split(" ")[0] }}/privkey.pem; ssl_protocols {{ SSL_PROTOCOLS }}; ssl_prefer_server_ciphers on; ssl_session_tickets off; diff --git a/src/common/core/letsencrypt/letsencrypt.lua b/src/common/core/letsencrypt/letsencrypt.lua index dbf958791..54c76e92f 100644 --- a/src/common/core/letsencrypt/letsencrypt.lua +++ b/src/common/core/letsencrypt/letsencrypt.lua @@ -1,6 +1,8 @@ local cjson = require "cjson" local class = require "middleclass" local plugin = require "bunkerweb.plugin" +local utils = require "bunkerweb.utils" +local ssl = require "ngx.ssl" local letsencrypt = class("letsencrypt", plugin) @@ -9,6 +11,107 @@ function letsencrypt:initialize(ctx) plugin.initialize(self, "letsencrypt", ctx) end +function letsencrypt:init() + local ok, err = true, "success" + if utils.has_variable("AUTO_LETS_ENCRYPT", "yes") then + local multisite, err = utils.get_variable("MULTISITE") + if not multisite then + return self:ret(false, "can't get MULTISITE variable : " .. err) + end + if multisite == "yes" then + local vars, err = utils.get_multiple_variables({"AUTO_LETS_ENCRYPT"}) + if not vars then + return self:ret(false, "can't get AUTO_LETS_ENCRYPT variables : " .. err) + end + for server_name, multisite_vars in pairs(vars) do + if multisite_vars["AUTO_LETS_ENCRYPT"] == "yes" then + local check, data = self:read_files(server_name) + if not check then + self.logger:log(ngx.ERR, "error while reading files : " .. err) + ok = false + err = "error reading files" + else + local check, err = self:load_data(data, server_name) + if not check then + self.logger:log(ngx.ERR, "error while loading data : " .. err) + ok = false + err = "error loading data" + end + end + end + end + else + local server_name, err = utils.get_variable("SERVER_NAME") + if not server_name then + return self:ret(false, "can't get SERVER_NAME variable : " .. err) + end + local check, data = self:read_files(server_name:gmatch("%S+")[1]) + if not check then + self.logger:log(ngx.ERR, "error while reading files : " .. err) + ok = false + err = "error reading files" + else + local check, err = self:load_data(data) + if not check then + self.logger:log(ngx.ERR, "error while loading data : " .. err) + ok = false + err = "error loading data" + end + end + end + else + err = "let's encrypt is not used" + end + return self:ret(ok, err) +end + +function letsencrypt:ssl_certificate() + if self.variables["AUTO_LETS_ENCRYPT"] == "yes" then + local data, err = self.datastore:get("plugin_letsencrypt_" .. self.ctx.bw.server_name, true) + if not data then + return self:ret(false, "error while getting plugin_letsencrypt_" .. self.ctx.bw.server_name .. " from datastore : " .. err) + end + return self:ret(true, "certificate/key data found", data) + end + return self:ret(true, "let's encrypt is not used") +end + +function letsencrypt:read_files(server_name) + local files = { + "/var/cache/bunkerweb/letsencrypt/etc/live/" .. server_name .. "/fullchain.pem", + "/var/cache/bunkerweb/letsencrypt/etc/live/" .. server_name .. "/privkey.pem" + } + local data = {} + for i, file in ipairs(files) do + local f, err = io.open(file, "r") + if not f then + return false, file .. " = " .. err + end + table.insert(data, f:read("*a")) + f:close() + end + return true, data +end + +function letsencrypt:load_data(data, server_name) + -- Load certificate + local cert_chain, err = ssl.parse_pem_cert(data[1]) + if not cert_chain then + return false, "error while parsing pem cert : " .. err + end + -- Load key + local priv_key, err = ssl.parse_priv_key(data[2]) + if not priv_key then + return false, "error while parsing pem priv key : " .. err + end + local cache_key = "plugin_letsencrypt_" .. (server_name or "global") + local ok, err = self.datastore:set(cache_key, {cert_chain, priv_key}, nil, true) + if not ok then + return false, "error while setting data into datastore : " .. err + end + return true +end + function letsencrypt:access() if string.sub(self.ctx.bw.uri, 1, string.len("/.well-known/acme-challenge/")) == "/.well-known/acme-challenge/" then self.logger:log(ngx.NOTICE, "got a visit from Let's Encrypt, let's whitelist it") diff --git a/src/common/core/order.json b/src/common/core/order.json index 2a6f90007..a63c5f311 100644 --- a/src/common/core/order.json +++ b/src/common/core/order.json @@ -7,8 +7,16 @@ "bunkernet", "limit" ], - "init_worker": ["redis", "bunkernet", "dnsbl"], + "init_worker": [ + "redis", + "bunkernet", + "dnsbl", + "customcert", + "letsencrypt", + "selfsigned" + ], "set": ["sessions", "whitelist"], + "ssl_certificate": ["customcert", "letsencrypt", "selfsigned"], "access": [ "whitelist", "letsencrypt", diff --git a/src/common/core/selfsigned/confs/server-http/self-signed.conf b/src/common/core/selfsigned/confs/server-http/self-signed.conf index d305f81ad..a690f2039 100644 --- a/src/common/core/selfsigned/confs/server-http/self-signed.conf +++ b/src/common/core/selfsigned/confs/server-http/self-signed.conf @@ -7,8 +7,10 @@ listen [::]:{{ HTTPS_PORT }} ssl {% if HTTP2 == "yes" %}http2{% endif %} {% if U {% endif %} # TLS config -ssl_certificate /var/cache/bunkerweb/selfsigned/{{ SERVER_NAME.split(" ")[0] }}.pem; -ssl_certificate_key /var/cache/bunkerweb/selfsigned/{{ SERVER_NAME.split(" ")[0] }}.key; +ssl_certificate /var/cache/bunkerweb/default-server-cert/cert.pem; +ssl_certificate_key /var/cache/bunkerweb/default-server-cert/cert.key; +# ssl_certificate /var/cache/bunkerweb/selfsigned/{{ SERVER_NAME.split(" ")[0] }}.pem; +# ssl_certificate_key /var/cache/bunkerweb/selfsigned/{{ SERVER_NAME.split(" ")[0] }}.key; ssl_protocols {{ SSL_PROTOCOLS }}; ssl_prefer_server_ciphers on; ssl_session_tickets off; diff --git a/src/common/core/selfsigned/selfsigned.lua b/src/common/core/selfsigned/selfsigned.lua new file mode 100644 index 000000000..d2de5e7e9 --- /dev/null +++ b/src/common/core/selfsigned/selfsigned.lua @@ -0,0 +1,114 @@ +local class = require "middleclass" +local plugin = require "bunkerweb.plugin" +local utils = require "bunkerweb.utils" +local ssl = require "ngx.ssl" + +local selfsigned = class("selfsigned", plugin) + +function selfsigned:initialize(ctx) + -- Call parent initialize + plugin.initialize(self, "selfsigned", ctx) +end + +function selfsigned:init() + local ok, err = true, "success" + if utils.has_variable("GENERATE_SELF_SIGNED_SSL", "yes") then + local multisite, err = utils.get_variable("MULTISITE") + if not multisite then + return self:ret(false, "can't get MULTISITE variable : " .. err) + end + if multisite == "yes" then + local vars, err = utils.get_multiple_variables({"GENERATE_SELF_SIGNED_SSL"}) + if not vars then + return self:ret(false, "can't get GENERATE_SELF_SIGNED_SSL variables : " .. err) + end + for server_name, multisite_vars in pairs(vars) do + if multisite_vars["GENERATE_SELF_SIGNED_SSL"] == "yes" then + local check, data = self:read_files(server_name) + if not check then + self.logger:log(ngx.ERR, "error while reading files : " .. err) + ok = false + err = "error reading files" + else + local check, err = self:load_data(data, server_name) + if not check then + self.logger:log(ngx.ERR, "error while loading data : " .. err) + ok = false + err = "error loading data" + end + end + end + end + else + local server_name, err = utils.get_variable("SERVER_NAME") + if not server_name then + return self:ret(false, "can't get SERVER_NAME variable : " .. err) + end + local check, data = self:read_files(server_name:gmatch("%S+")[1]) + if not check then + self.logger:log(ngx.ERR, "error while reading files : " .. err) + ok = false + err = "error reading files" + else + local check, err = self:load_data(data) + if not check then + self.logger:log(ngx.ERR, "error while loading data : " .. err) + ok = false + err = "error loading data" + end + end + end + else + err = "self signed is not used" + end + return self:ret(ok, err) +end + +function selfsigned:ssl_certificate() + if self.variables["GENERATE_SELF_SIGNED_SSL"] == "yes" then + local data, err = self.datastore:get("plugin_selfsigned_" .. self.ctx.bw.server_name, true) + if not data then + return self:ret(false, "error while getting plugin_selfsigned_" .. self.ctx.bw.server_name .. " from datastore : " .. err) + end + return self:ret(true, "certificate/key data found", data) + end + return self:ret(true, "selfsigned is not used") +end + +function selfsigned:read_files(server_name) + local files = { + "/var/cache/bunkerweb/selfsigned/" .. server_name .. "/cert.pem", + "/var/cache/bunkerweb/selfsigned/" .. server_name .. "/key.pem" + } + local data = {} + for i, file in ipairs(files) do + local f, err = io.open(file, "r") + if not f then + return false, file .. " = " .. err + end + table.insert(data, f:read("*a")) + f:close() + end + return true, data +end + +function selfsigned:load_data(data, server_name) + -- Load certificate + local cert_chain, err = ssl.parse_pem_cert(data[1]) + if not cert_chain then + return false, "error while parsing pem cert : " .. err + end + -- Load key + local priv_key, err = ssl.parse_priv_key(data[2]) + if not priv_key then + return false, "error while parsing pem priv key : " .. err + end + local cache_key = "plugin_selfsigned_" .. (server_name or "global") + local ok, err = self.datastore:set(cache_key, {cert_chain, priv_key}, nil, true) + if not ok then + return false, "error while setting data into datastore : " .. err + end + return true +end + +return selfsigned diff --git a/src/common/db/Database.py b/src/common/db/Database.py index 10fef9d5c..499b2b02c 100644 --- a/src/common/db/Database.py +++ b/src/common/db/Database.py @@ -346,7 +346,10 @@ class Database: if has_all_tables: return False, "" - Base.metadata.create_all(self.__sql_engine, checkfirst=True) + try: + Base.metadata.create_all(self.__sql_engine, checkfirst=True) + except BaseException: + return False, format_exc() to_put = [] with self.__db_session() as session: @@ -373,19 +376,51 @@ class Database: jobs = plugin.pop("jobs", []) page = plugin.pop("page", False) - to_put.append( - Plugins( - id=plugin["id"], - name=plugin["name"], - description=plugin["description"], - version=plugin["version"], - stream=plugin["stream"], - external=plugin.get("external", False), - method=plugin.get("method"), - data=plugin.get("data"), - checksum=plugin.get("checksum"), + db_plugin = session.query(Plugins).filter_by(id=plugin["id"]).first() + if db_plugin: + updates = {} + + if plugin["name"] != db_plugin.name: + updates[Plugins.name] = plugin["name"] + + if plugin["description"] != db_plugin.description: + updates[Plugins.description] = plugin["description"] + + if plugin["version"] != db_plugin.version: + updates[Plugins.version] = plugin["version"] + + if plugin["stream"] != db_plugin.stream: + updates[Plugins.stream] = plugin["stream"] + + if plugin.get("external", False) != db_plugin.external: + updates[Plugins.external] = plugin.get("external", False) + + if plugin.get("method", "manual") != db_plugin.method: + updates[Plugins.method] = plugin.get("method", "manual") + + if plugin.get("data") != db_plugin.data: + updates[Plugins.data] = plugin.get("data") + + if plugin.get("checksum") != db_plugin.checksum: + updates[Plugins.checksum] = plugin.get("checksum") + + if updates: + self.__logger.warning(f'Plugin "{plugin["id"]}" already exists, updating it with the new values') + session.query(Plugins).filter(Plugins.id == plugin["id"]).update(updates) + else: + to_put.append( + Plugins( + id=plugin["id"], + name=plugin["name"], + description=plugin["description"], + version=plugin["version"], + stream=plugin["stream"], + external=plugin.get("external", False), + method=plugin.get("method"), + data=plugin.get("data"), + checksum=plugin.get("checksum"), + ) ) - ) for setting, value in settings.items(): value.update( @@ -395,15 +430,98 @@ class Database: "id": setting, } ) + db_setting = session.query(Settings).filter_by(id=setting).first() + select_values = value.pop("select", []) - for select in value.pop("select", []): - to_put.append(Selects(setting_id=value["id"], value=select)) + if db_setting: + updates = {} - to_put.append(Settings(**value)) + if value["name"] != db_setting.name: + updates[Settings.name] = value["name"] + + if value["context"] != db_setting.context: + updates[Settings.context] = value["context"] + + if value["default"] != db_setting.default: + updates[Settings.default] = value["default"] + + if value["help"] != db_setting.help: + updates[Settings.help] = value["help"] + + if value["label"] != db_setting.label: + updates[Settings.label] = value["label"] + + if value["regex"] != db_setting.regex: + updates[Settings.regex] = value["regex"] + + if value["type"] != db_setting.type: + updates[Settings.type] = value["type"] + + if value.get("multiple") != db_setting.multiple: + updates[Settings.multiple] = value.get("multiple") + + if updates: + self.__logger.warning(f'Setting "{setting}" already exists, updating it with the new values') + session.query(Settings).filter(Settings.id == setting).update(updates) + else: + if db_plugin: + self.__logger.warning(f'Setting "{setting}" does not exist, creating it') + to_put.append(Settings(**value)) + + db_selects = session.query(Selects).with_entities(Selects.value).filter_by(setting_id=value["id"]).all() + db_values = [select.value for select in db_selects] + missing_values = [select for select in db_values if select not in select_values] + + if select_values: + if missing_values: + # Remove selects that are no longer in the list + self.__logger.warning(f'Removing {len(missing_values)} selects from setting "{setting}" as they are no longer in the list') + session.query(Selects).filter(Selects.value.in_(missing_values)).delete() + + for select in select_values: + if select not in db_values: + to_put.append(Selects(setting_id=value["id"], value=select)) + else: + if missing_values: + self.__logger.warning(f'Removing all selects from setting "{setting}" as there are no longer any in the list') + session.query(Selects).filter_by(setting_id=value["id"]).delete() + + db_jobs = session.query(Jobs).with_entities(Jobs.name).filter_by(plugin_id=plugin["id"]).all() + db_names = [job.name for job in db_jobs] + job_names = [job["name"] for job in jobs] + missing_names = [job for job in db_names if job not in job_names] + + if missing_names: + # Remove jobs that are no longer in the list + self.__logger.warning(f'Removing {len(missing_names)} jobs from plugin "{plugin["id"]}" as they are no longer in the list') + session.query(Jobs).filter(Jobs.name.in_(missing_names)).delete() for job in jobs: - job["file_name"] = job.pop("file") - to_put.append(Jobs(plugin_id=plugin["id"], **job)) + db_job = session.query(Jobs).with_entities(Jobs.file_name, Jobs.every, Jobs.reload).filter_by(name=job["name"], plugin_id=plugin["id"]).first() + + if job["name"] not in db_names or not db_job: + job["file_name"] = job.pop("file") + job["reload"] = job.get("reload", False) + if db_plugin: + self.__logger.warning(f'Job "{job["name"]}" does not exist, creating it') + to_put.append(Jobs(plugin_id=plugin["id"], **job)) + else: + updates = {} + + if job["file"] != db_job.file_name: + updates[Jobs.file_name] = job["file"] + + if job["every"] != db_job.every: + updates[Jobs.every] = job["every"] + + if job.get("reload", None) != db_job.reload: + updates[Jobs.reload] = job.get("reload", False) + + if updates: + self.__logger.warning(f'Job "{job["name"]}" already exists, updating it with the new values') + updates[Jobs.last_run] = None + session.query(Jobs_cache).filter(Jobs_cache.job_name == job["name"]).delete() + session.query(Jobs).filter(Jobs.name == job["name"]).update(updates) if page: core_ui_path = Path(sep, "usr", "share", "bunkerweb", "core", plugin["id"], "ui") @@ -411,16 +529,53 @@ class Database: if path_ui.exists(): if {"template.html", "actions.py"}.issubset(listdir(str(path_ui))): + db_plugin_page = ( + session.query(Plugin_pages) + .with_entities( + Plugin_pages.template_checksum, + Plugin_pages.actions_checksum, + ) + .filter_by(plugin_id=plugin["id"]) + .first() + ) template = path_ui.joinpath("template.html").read_bytes() actions = path_ui.joinpath("actions.py").read_bytes() + template_checksum = sha256(template).hexdigest() + actions_checksum = sha256(actions).hexdigest() + + if db_plugin_page: + updates = {} + if template_checksum != db_plugin_page.template_checksum: + updates.update( + { + Plugin_pages.template_file: template, + Plugin_pages.template_checksum: template_checksum, + } + ) + + if actions_checksum != db_plugin_page.actions_checksum: + updates.update( + { + Plugin_pages.actions_file: actions, + Plugin_pages.actions_checksum: actions_checksum, + } + ) + + if updates: + self.__logger.warning(f'Page for plugin "{plugin["id"]}" already exists, updating it with the new values') + session.query(Plugin_pages).filter(Plugin_pages.plugin_id == plugin["id"]).update(updates) + continue + + if db_plugin: + self.__logger.warning(f'Page for plugin "{plugin["id"]}" does not exist, creating it') to_put.append( Plugin_pages( plugin_id=plugin["id"], template_file=template, - template_checksum=sha256(template).hexdigest(), + template_checksum=template_checksum, actions_file=actions, - actions_checksum=sha256(actions).hexdigest(), + actions_checksum=actions_checksum, ) ) @@ -568,8 +723,8 @@ class Database: } ) else: - if config.get("SERVER_NAME", "") != "" and not (session.query(Services).with_entities(Services.id).filter_by(id=config["SERVER_NAME"].split(" ")[0]).first()): - to_put.append(Services(id=config["SERVER_NAME"].split(" ")[0], method=method)) + if not (session.query(Services).with_entities(Services.id).filter_by(id=config.get("SERVER_NAME", "www.example.com").split(" ")[0]).first()): + to_put.append(Services(id=config.get("SERVER_NAME", "www.example.com").split(" ")[0], method=method)) for key, value in config.items(): suffix = 0 @@ -783,9 +938,8 @@ class Database: } ) - if is_multisite: - servers = " ".join(service.id for service in session.query(Services).all()) - config["SERVER_NAME"] = servers if not methods else {"value": servers, "global": True, "method": "default"} + servers = " ".join(service.id for service in session.query(Services).all()) + config["SERVER_NAME"] = servers if not methods else {"value": servers, "global": True, "method": "default"} return config diff --git a/src/common/db/requirements.txt b/src/common/db/requirements.txt index 7408a4e2e..0db96e162 100644 --- a/src/common/db/requirements.txt +++ b/src/common/db/requirements.txt @@ -83,64 +83,65 @@ cryptography==41.0.7 \ --hash=sha256:e3114da6d7f95d2dee7d3f4eec16dacff819740bbab931aff8648cb13c5ff5e7 \ --hash=sha256:f983596065a18a2183e7f79ab3fd4c475205b839e02cbc0efbbf9666c4b3083d # via -r requirements.in -greenlet==3.0.1 \ - --hash=sha256:0a02d259510b3630f330c86557331a3b0e0c79dac3d166e449a39363beaae174 \ - --hash=sha256:0b6f9f8ca7093fd4433472fd99b5650f8a26dcd8ba410e14094c1e44cd3ceddd \ - --hash=sha256:100f78a29707ca1525ea47388cec8a049405147719f47ebf3895e7509c6446aa \ - --hash=sha256:1757936efea16e3f03db20efd0cd50a1c86b06734f9f7338a90c4ba85ec2ad5a \ - --hash=sha256:19075157a10055759066854a973b3d1325d964d498a805bb68a1f9af4aaef8ec \ - --hash=sha256:19bbdf1cce0346ef7341705d71e2ecf6f41a35c311137f29b8a2dc2341374565 \ - --hash=sha256:20107edf7c2c3644c67c12205dc60b1bb11d26b2610b276f97d666110d1b511d \ - --hash=sha256:22f79120a24aeeae2b4471c711dcf4f8c736a2bb2fabad2a67ac9a55ea72523c \ - --hash=sha256:2847e5d7beedb8d614186962c3d774d40d3374d580d2cbdab7f184580a39d234 \ - --hash=sha256:28e89e232c7593d33cac35425b58950789962011cc274aa43ef8865f2e11f46d \ - --hash=sha256:329c5a2e5a0ee942f2992c5e3ff40be03e75f745f48847f118a3cfece7a28546 \ - --hash=sha256:337322096d92808f76ad26061a8f5fccb22b0809bea39212cd6c406f6a7060d2 \ - --hash=sha256:3fcc780ae8edbb1d050d920ab44790201f027d59fdbd21362340a85c79066a74 \ - --hash=sha256:41bdeeb552d814bcd7fb52172b304898a35818107cc8778b5101423c9017b3de \ - --hash=sha256:4eddd98afc726f8aee1948858aed9e6feeb1758889dfd869072d4465973f6bfd \ - --hash=sha256:52e93b28db27ae7d208748f45d2db8a7b6a380e0d703f099c949d0f0d80b70e9 \ - --hash=sha256:55d62807f1c5a1682075c62436702aaba941daa316e9161e4b6ccebbbf38bda3 \ - --hash=sha256:5805e71e5b570d490938d55552f5a9e10f477c19400c38bf1d5190d760691846 \ - --hash=sha256:599daf06ea59bfedbec564b1692b0166a0045f32b6f0933b0dd4df59a854caf2 \ - --hash=sha256:60d5772e8195f4e9ebf74046a9121bbb90090f6550f81d8956a05387ba139353 \ - --hash=sha256:696d8e7d82398e810f2b3622b24e87906763b6ebfd90e361e88eb85b0e554dc8 \ - --hash=sha256:6e6061bf1e9565c29002e3c601cf68569c450be7fc3f7336671af7ddb4657166 \ - --hash=sha256:80ac992f25d10aaebe1ee15df45ca0d7571d0f70b645c08ec68733fb7a020206 \ - --hash=sha256:816bd9488a94cba78d93e1abb58000e8266fa9cc2aa9ccdd6eb0696acb24005b \ - --hash=sha256:85d2b77e7c9382f004b41d9c72c85537fac834fb141b0296942d52bf03fe4a3d \ - --hash=sha256:87c8ceb0cf8a5a51b8008b643844b7f4a8264a2c13fcbcd8a8316161725383fe \ - --hash=sha256:89ee2e967bd7ff85d84a2de09df10e021c9b38c7d91dead95b406ed6350c6997 \ - --hash=sha256:8bef097455dea90ffe855286926ae02d8faa335ed8e4067326257cb571fc1445 \ - --hash=sha256:8d11ebbd679e927593978aa44c10fc2092bc454b7d13fdc958d3e9d508aba7d0 \ - --hash=sha256:91e6c7db42638dc45cf2e13c73be16bf83179f7859b07cfc139518941320be96 \ - --hash=sha256:97e7ac860d64e2dcba5c5944cfc8fa9ea185cd84061c623536154d5a89237884 \ - --hash=sha256:990066bff27c4fcf3b69382b86f4c99b3652bab2a7e685d968cd4d0cfc6f67c6 \ - --hash=sha256:9fbc5b8f3dfe24784cee8ce0be3da2d8a79e46a276593db6868382d9c50d97b1 \ - --hash=sha256:ac4a39d1abae48184d420aa8e5e63efd1b75c8444dd95daa3e03f6c6310e9619 \ - --hash=sha256:b2c02d2ad98116e914d4f3155ffc905fd0c025d901ead3f6ed07385e19122c94 \ - --hash=sha256:b2d3337dcfaa99698aa2377c81c9ca72fcd89c07e7eb62ece3f23a3fe89b2ce4 \ - --hash=sha256:b489c36d1327868d207002391f662a1d163bdc8daf10ab2e5f6e41b9b96de3b1 \ - --hash=sha256:b641161c302efbb860ae6b081f406839a8b7d5573f20a455539823802c655f63 \ - --hash=sha256:b8ba29306c5de7717b5761b9ea74f9c72b9e2b834e24aa984da99cbfc70157fd \ - --hash=sha256:b9934adbd0f6e476f0ecff3c94626529f344f57b38c9a541f87098710b18af0a \ - --hash=sha256:ce85c43ae54845272f6f9cd8320d034d7a946e9773c693b27d620edec825e376 \ - --hash=sha256:cf868e08690cb89360eebc73ba4be7fb461cfbc6168dd88e2fbbe6f31812cd57 \ - --hash=sha256:d2905ce1df400360463c772b55d8e2518d0e488a87cdea13dd2c71dcb2a1fa16 \ - --hash=sha256:d57e20ba591727da0c230ab2c3f200ac9d6d333860d85348816e1dca4cc4792e \ - --hash=sha256:d6a8c9d4f8692917a3dc7eb25a6fb337bff86909febe2f793ec1928cd97bedfc \ - --hash=sha256:d923ff276f1c1f9680d32832f8d6c040fe9306cbfb5d161b0911e9634be9ef0a \ - --hash=sha256:daa7197b43c707462f06d2c693ffdbb5991cbb8b80b5b984007de431493a319c \ - --hash=sha256:dbd4c177afb8a8d9ba348d925b0b67246147af806f0b104af4d24f144d461cd5 \ - --hash=sha256:dc4d815b794fd8868c4d67602692c21bf5293a75e4b607bb92a11e821e2b859a \ - --hash=sha256:e9d21aaa84557d64209af04ff48e0ad5e28c5cca67ce43444e939579d085da72 \ - --hash=sha256:ea6b8aa9e08eea388c5f7a276fabb1d4b6b9d6e4ceb12cc477c3d352001768a9 \ - --hash=sha256:eabe7090db68c981fca689299c2d116400b553f4b713266b130cfc9e2aa9c5a9 \ - --hash=sha256:f2f6d303f3dee132b322a14cd8765287b8f86cdc10d2cb6a6fae234ea488888e \ - --hash=sha256:f33f3258aae89da191c6ebaa3bc517c6c4cbc9b9f689e5d8452f7aedbb913fa8 \ - --hash=sha256:f7bfb769f7efa0eefcd039dd19d843a4fbfbac52f1878b1da2ed5793ec9b1a65 \ - --hash=sha256:f89e21afe925fcfa655965ca8ea10f24773a1791400989ff32f467badfe4a064 \ - --hash=sha256:fa24255ae3c0ab67e613556375a4341af04a084bd58764731972bcbc8baeba36 +greenlet==3.0.2 \ + --hash=sha256:006c1028ac0cfcc4e772980cfe73f5476041c8c91d15d64f52482fc571149d46 \ + --hash=sha256:0acadbc3f72cb0ee85070e8d36bd2a4673d2abd10731ee73c10222cf2dd4713c \ + --hash=sha256:0c0fdb8142742ee68e97c106eb81e7d3e883cc739d9c5f2b28bc38a7bafeb6d1 \ + --hash=sha256:0df7eed98ea23b20e9db64d46eb05671ba33147df9405330695bcd81a73bb0c9 \ + --hash=sha256:10d247260db20887ae8857c0cbc750b9170f0b067dd7d38fb68a3f2334393bd3 \ + --hash=sha256:14b5d999aefe9ffd2049ad19079f733c3aaa426190ffecadb1d5feacef8fe397 \ + --hash=sha256:18fe39d70d482b22f0014e84947c5aaa7211fb8e13dc4cc1c43ed2aa1db06d9a \ + --hash=sha256:1c1129bc47266d83444c85a8e990ae22688cf05fb20d7951fd2866007c2ba9bc \ + --hash=sha256:1dac09e3c0b78265d2e6d3cbac2d7c48bd1aa4b04a8ffeda3adde9f1688df2c3 \ + --hash=sha256:2c93cd03acb1499ee4de675e1a4ed8eaaa7227f7949dc55b37182047b006a7aa \ + --hash=sha256:2e9c5423046eec21f6651268cb674dfba97280701e04ef23d312776377313206 \ + --hash=sha256:2ee59c4627c8c4bb3e15949fbcd499abd6b7f4ad9e0bfcb62c65c5e2cabe0ec4 \ + --hash=sha256:339c0272a62fac7e602e4e6ec32a64ff9abadc638b72f17f6713556ed011d493 \ + --hash=sha256:38878744926cec29b5cc3654ef47f3003f14bfbba7230e3c8492393fe29cc28b \ + --hash=sha256:3e4bfa752b3688d74ab1186e2159779ff4867644d2b1ebf16db14281f0445377 \ + --hash=sha256:520fcb53a39ef90f5021c77606952dbbc1da75d77114d69b8d7bded4a8e1a813 \ + --hash=sha256:5f9ea7c2c9795549653b6f7569f6bc75d2c7d1f6b2854eb8ce0bc6ec3cb2dd88 \ + --hash=sha256:654b84c9527182036747938b81938f1d03fb8321377510bc1854a9370418ab66 \ + --hash=sha256:6d65bec56a7bc352bcf11b275b838df618651109074d455a772d3afe25390b7d \ + --hash=sha256:7363756cc439a503505b67983237d1cc19139b66488263eb19f5719a32597836 \ + --hash=sha256:80d068e4b6e2499847d916ef64176811ead6bf210a610859220d537d935ec6fd \ + --hash=sha256:8756a94ed8f293450b0e91119eca2a36332deba69feb2f9ca410d35e74eae1e4 \ + --hash=sha256:89a6f6ddcbef4000cda7e205c4c20d319488ff03db961d72d4e73519d2465309 \ + --hash=sha256:8f34a765c5170c0673eb747213a0275ecc749ab3652bdbec324621ed5b2edaef \ + --hash=sha256:8f8d14a0a4e8c670fbce633d8b9a1ee175673a695475acd838e372966845f764 \ + --hash=sha256:950e21562818f9c771989b5b65f990e76f4ac27af66e1bb34634ae67886ede2a \ + --hash=sha256:9560c580c896030ff9c311c603aaf2282234643c90d1dec738a1d93e3e53cd51 \ + --hash=sha256:9acd8fd67c248b8537953cb3af8787c18a87c33d4dcf6830e410ee1f95a63fd4 \ + --hash=sha256:a37ae53cca36823597fd5f65341b6f7bac2dd69ecd6ca01334bb795460ab150b \ + --hash=sha256:aecea0442975741e7d69daff9b13c83caff8c13eeb17485afa65f6360a045765 \ + --hash=sha256:b1405614692ac986490d10d3e1a05e9734f473750d4bee3cf7d1286ef7af7da6 \ + --hash=sha256:b1fd25dfc5879a82103b3d9e43fa952e3026c221996ff4d32a9c72052544835d \ + --hash=sha256:b2cedf279ca38ef3f4ed0d013a6a84a7fc3d9495a716b84a5fc5ff448965f251 \ + --hash=sha256:b3f0497db77cfd034f829678b28267eeeeaf2fc21b3f5041600f7617139e6773 \ + --hash=sha256:bfcecc984d60b20ffe30173b03bfe9ba6cb671b0be1e95c3e2056d4fe7006590 \ + --hash=sha256:c1f647fe5b94b51488b314c82fdda10a8756d650cee8d3cd29f657c6031bdf73 \ + --hash=sha256:c235131bf59d2546bb3ebaa8d436126267392f2e51b85ff45ac60f3a26549af0 \ + --hash=sha256:c27b142a9080bdd5869a2fa7ebf407b3c0b24bd812db925de90e9afe3c417fd6 \ + --hash=sha256:c42bb589e6e9f9d8bdd79f02f044dff020d30c1afa6e84c0b56d1ce8a324553c \ + --hash=sha256:cd5bc4fde0842ff2b9cf33382ad0b4db91c2582db836793d58d174c569637144 \ + --hash=sha256:cecfdc950dd25f25d6582952e58521bca749cf3eeb7a9bad69237024308c8196 \ + --hash=sha256:d1fceb5351ab1601903e714c3028b37f6ea722be6873f46e349a960156c05650 \ + --hash=sha256:d4d0df07a38e41a10dfb62c6fc75ede196572b580f48ee49b9282c65639f3965 \ + --hash=sha256:d5547b462b8099b84746461e882a3eb8a6e3f80be46cb6afb8524eeb191d1a30 \ + --hash=sha256:d64643317e76b4b41fdba659e7eca29634e5739b8bc394eda3a9127f697ed4b0 \ + --hash=sha256:db4233358d3438369051a2f290f1311a360d25c49f255a6c5d10b5bcb3aa2b49 \ + --hash=sha256:e0e28f5233d64c693382f66d47c362b72089ebf8ac77df7e12ac705c9fa1163d \ + --hash=sha256:e79fb5a9fb2d0bd3b6573784f5e5adabc0b0566ad3180a028af99523ce8f6138 \ + --hash=sha256:e84bef3cfb6b6bfe258c98c519811c240dbc5b33a523a14933a252e486797c90 \ + --hash=sha256:ed1a8a08de7f68506a38f9a2ddb26bbd1480689e66d788fcd4b5f77e2d9ecfcc \ + --hash=sha256:ed9bf77b41798e8417657245b9f3649314218a4a17aefb02bb3992862df32495 \ + --hash=sha256:edf7a1daba1f7c54326291a8cde58da86ab115b78c91d502be8744f0aa8e3ffa \ + --hash=sha256:f260e6c2337871a52161824058923df2bbddb38bc11a5cbe71f3474d877c5bd9 \ + --hash=sha256:f27aa32466993c92d326df982c4acccd9530fe354e938d9e9deada563e71ce76 \ + --hash=sha256:f4cf532bf3c58a862196b06947b1b5cc55503884f9b63bf18582a75228d9950e \ + --hash=sha256:fb5d60805057d8948065338be6320d35e26b0a72f45db392eb32b70dd6dc9227 \ + --hash=sha256:fc14dd9554f88c9c1fe04771589ae24db76cd56c8f1104e4381b383d6b71aff8 \ + --hash=sha256:fefd5eb2c0b1adffdf2802ff7df45bfe65988b15f6b972706a0e55d451bffaea # via sqlalchemy psycopg2-binary==2.9.9 \ --hash=sha256:03ef7df18daf2c4c07e2695e8cfd5ee7f748a1d54d802330985a78d2a5a6dca9 \ @@ -275,7 +276,7 @@ sqlalchemy==2.0.23 \ --hash=sha256:f508ba8f89e0a5ecdfd3761f82dda2a3d7b678a626967608f4273e0dba8f07ac \ --hash=sha256:fd54601ef9cc455a0c61e5245f690c8a3ad67ddb03d3b91c361d076def0b4c60 # via -r requirements.in -typing-extensions==4.8.0 \ - --hash=sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0 \ - --hash=sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef +typing-extensions==4.9.0 \ + --hash=sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783 \ + --hash=sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd # via sqlalchemy diff --git a/src/common/gen/Templator.py b/src/common/gen/Templator.py index 3fa0b4d4e..3b567b09e 100644 --- a/src/common/gen/Templator.py +++ b/src/common/gen/Templator.py @@ -101,6 +101,8 @@ class Templator: for root_conf in ( "server.conf", "access-lua.conf", + "ssl-certificate-lua.conf", + "header-lua.conf", "init-lua.conf", "log-lua.conf", "set-lua.conf", diff --git a/src/common/gen/requirements.in b/src/common/gen/requirements.in index fb3bf36d4..94055e71c 100644 --- a/src/common/gen/requirements.in +++ b/src/common/gen/requirements.in @@ -1,4 +1,4 @@ -docker==6.1.3 +docker==7.0.0 jinja2==3.1.2 kubernetes==28.1.0 python-dotenv==1.0.0 diff --git a/src/common/gen/requirements.txt b/src/common/gen/requirements.txt index 29a436147..19c629d14 100644 --- a/src/common/gen/requirements.txt +++ b/src/common/gen/requirements.txt @@ -110,13 +110,13 @@ charset-normalizer==3.3.2 \ --hash=sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519 \ --hash=sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561 # via requests -docker==6.1.3 \ - --hash=sha256:aa6d17830045ba5ef0168d5eaa34d37beeb113948c413affe1d5991fc11f9a20 \ - --hash=sha256:aecd2277b8bf8e506e484f6ab7aec39abe0038e29fa4a6d3ba86c3fe01844ed9 +docker==7.0.0 \ + --hash=sha256:12ba681f2777a0ad28ffbcc846a69c31b4dfd9752b47eb425a274ee269c5e14b \ + --hash=sha256:323736fb92cd9418fc5e7133bc953e11a9da04f4483f828b527db553f1e7e5a3 # via -r requirements.in -google-auth==2.25.1 \ - --hash=sha256:d5d66b8f4f6e3273740d7bb73ddefa6c2d1ff691704bd407d51c6b5800e7c97b \ - --hash=sha256:dfd7b44935d498e106c08883b2dac0ad36d8aa10402a6412e9a1c9d74b4773f1 +google-auth==2.25.2 \ + --hash=sha256:42f707937feb4f5e5a39e6c4f343a17300a459aaf03141457ba505812841cc40 \ + --hash=sha256:473a8dfd0135f75bb79d878436e568f2695dce456764bf3a02b6f8c540b1d256 # via kubernetes idna==3.6 \ --hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \ @@ -308,6 +308,4 @@ urllib3==1.26.18 \ websocket-client==1.7.0 \ --hash=sha256:10e511ea3a8c744631d3bd77e61eb17ed09304c413ad42cf6ddfa4c7787e8fe6 \ --hash=sha256:f4c3d22fec12a2461427a29957ff07d35098ee2d976d3ba244e688b8b4057588 - # via - # docker - # kubernetes + # via kubernetes diff --git a/src/common/gen/save_config.py b/src/common/gen/save_config.py index dd67a5bff..605cc4363 100644 --- a/src/common/gen/save_config.py +++ b/src/common/gen/save_config.py @@ -309,10 +309,24 @@ if __name__ == "__main__": else: logger.info("Database initialized") else: - logger.info( - "Database is already initialized, skipping ...", + logger.info("Database is already initialized, checking for changes ...") + + ret, err = db.init_tables( + [ + config.get_settings(), + config.get_plugins("core"), + config.get_plugins("external"), + ] ) + if not ret and err: + logger.error(f"Exception while checking database tables : {err}") + sys_exit(1) + elif not ret: + logger.info("Database tables didn't change, skipping update ...") + else: + logger.info("Database tables successfully updated") + if args.init: sys_exit(0) diff --git a/src/scheduler/Dockerfile b/src/scheduler/Dockerfile index 97e576f45..9d9d48e58 100644 --- a/src/scheduler/Dockerfile +++ b/src/scheduler/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.12.0-alpine3.18@sha256:f1d0d03700fb2d4480e89fb807e7346c14b88952f7bd58d56de54a24817cc2e8 AS builder +FROM python:3.12.1-alpine3.18@sha256:af0d8da43677e3000ebdf4045508d891a87e7bd2d3ec87bc6e40403be97291b8 AS builder # Install python dependencies RUN apk add --no-cache --virtual .build-deps g++ gcc musl-dev jpeg-dev zlib-dev libffi-dev cairo-dev pango-dev gdk-pixbuf-dev openssl-dev cargo postgresql-dev @@ -38,7 +38,7 @@ COPY src/common/utils utils COPY src/scheduler scheduler COPY src/VERSION VERSION -FROM python:3.12.0-alpine3.18@sha256:f1d0d03700fb2d4480e89fb807e7346c14b88952f7bd58d56de54a24817cc2e8 +FROM python:3.12.1-alpine3.18@sha256:af0d8da43677e3000ebdf4045508d891a87e7bd2d3ec87bc6e40403be97291b8 # Set default umask to prevent huge recursive chmod increasing the final image size RUN umask 027 diff --git a/src/ui/Dockerfile b/src/ui/Dockerfile index 299b06be3..64b15011e 100644 --- a/src/ui/Dockerfile +++ b/src/ui/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.12.0-alpine3.18@sha256:f1d0d03700fb2d4480e89fb807e7346c14b88952f7bd58d56de54a24817cc2e8 AS builder +FROM python:3.12.1-alpine3.18@sha256:af0d8da43677e3000ebdf4045508d891a87e7bd2d3ec87bc6e40403be97291b8 AS builder # Install python dependencies RUN apk add --no-cache --virtual .build-deps g++ gcc musl-dev jpeg-dev zlib-dev libffi-dev cairo-dev pango-dev gdk-pixbuf-dev openssl-dev cargo postgresql-dev file make @@ -36,7 +36,7 @@ COPY src/common/helpers helpers COPY src/ui ui COPY src/VERSION VERSION -FROM python:3.12.0-alpine3.18@sha256:f1d0d03700fb2d4480e89fb807e7346c14b88952f7bd58d56de54a24817cc2e8 +FROM python:3.12.1-alpine3.18@sha256:af0d8da43677e3000ebdf4045508d891a87e7bd2d3ec87bc6e40403be97291b8 # Set default umask to prevent huge recursive chmod increasing the final image size RUN umask 027 diff --git a/src/ui/main.py b/src/ui/main.py index 38bff71c0..554d94d4a 100755 --- a/src/ui/main.py +++ b/src/ui/main.py @@ -1,5 +1,6 @@ #!/usr/bin/python3 +from contextlib import suppress from os import _exit, getenv, listdir, sep, urandom from os.path import basename, dirname, join from secrets import choice @@ -180,7 +181,11 @@ while not db.is_initialized(): ) sleep(5) -USER = db.get_ui_user() +USER = "Error" +while USER == "Error": + with suppress(Exception): + USER = db.get_ui_user() + USER_PASSWORD_RX = re_compile(r"^(?=.*?\p{Lowercase_Letter})(?=.*?\p{Uppercase_Letter})(?=.*?\d)(?=.*?[ !\"#$%&'()*+,./:;<=>?@[\\\]^_`{|}~-]).{8,}$") if USER: diff --git a/src/ui/static/images/favicon-white.ico b/src/ui/static/images/favicon-white.ico old mode 100755 new mode 100644 diff --git a/src/ui/static/images/favicon.ico b/src/ui/static/images/favicon.ico old mode 100755 new mode 100644 diff --git a/tests/Test.py b/tests/Test.py index 5e872e2d9..baf5f9f85 100644 --- a/tests/Test.py +++ b/tests/Test.py @@ -10,7 +10,9 @@ from subprocess import run from logger import log from string import ascii_lowercase, digits from random import choice - +from ssl import SSLContext, create_connection +import OpenSSL.crypto as crypto +from urllib.parse import urlparse class Test(ABC): def __init__(self, name, kind, timeout, tests, no_copy_container=False, delay=0): @@ -126,6 +128,7 @@ class Test(ABC): # run a single test def __run_test(self, test): try: + ok = False ex_url = test["url"] for ex_domain, test_domain in self._domains.items(): if search(ex_domain, ex_url): @@ -133,10 +136,20 @@ class Test(ABC): break if test["type"] == "string": r = get(ex_url, timeout=10, verify=False) - return test["string"].casefold() in r.text.casefold() + ok = test["string"].casefold() in r.text.casefold() elif test["type"] == "status": r = get(ex_url, timeout=10, verify=False) - return test["status"] == r.status_code + ok = test["status"] == r.status_code + if ok and "tls" in test: + connection = create_connection((urlparse(ex_url).netloc, 443)) + context = SSLContext() + sock = context.wrap_socket(connection, server_hostname=urlparse(ex_url).netloc) + cert = sock.getpeercert(True) + sock.close() + x509 = crypto.load_certificate(crypto.FILETYPE_ASN1, cert) + if x509.get_subject().CN != test["tls"]: + ok = False + log("TEST", "β οΈ", f"wrong cert CN : {x509.get_subject().CN}") except: return False raise (Exception(f"unknown test type {test['type']}")) diff --git a/tests/core/badbehavior/requirements.in b/tests/core/badbehavior/requirements.in index 0aa9a6b38..87bc072d9 100644 --- a/tests/core/badbehavior/requirements.in +++ b/tests/core/badbehavior/requirements.in @@ -1,2 +1,2 @@ -docker==6.1.3 +docker==7.0.0 requests==2.31.0 diff --git a/tests/core/badbehavior/requirements.txt b/tests/core/badbehavior/requirements.txt index f83005ee2..ca98425ae 100644 --- a/tests/core/badbehavior/requirements.txt +++ b/tests/core/badbehavior/requirements.txt @@ -100,9 +100,9 @@ charset-normalizer==3.3.2 \ --hash=sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519 \ --hash=sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561 # via requests -docker==6.1.3 \ - --hash=sha256:aa6d17830045ba5ef0168d5eaa34d37beeb113948c413affe1d5991fc11f9a20 \ - --hash=sha256:aecd2277b8bf8e506e484f6ab7aec39abe0038e29fa4a6d3ba86c3fe01844ed9 +docker==7.0.0 \ + --hash=sha256:12ba681f2777a0ad28ffbcc846a69c31b4dfd9752b47eb425a274ee269c5e14b \ + --hash=sha256:323736fb92cd9418fc5e7133bc953e11a9da04f4483f828b527db553f1e7e5a3 # via -r requirements.in idna==3.6 \ --hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \ @@ -124,7 +124,3 @@ urllib3==2.1.0 \ # via # docker # requests -websocket-client==1.7.0 \ - --hash=sha256:10e511ea3a8c744631d3bd77e61eb17ed09304c413ad42cf6ddfa4c7787e8fe6 \ - --hash=sha256:f4c3d22fec12a2461427a29957ff07d35098ee2d976d3ba244e688b8b4057588 - # via docker diff --git a/tests/core/blacklist/api/requirements.in b/tests/core/blacklist/api/requirements.in index b04d6bd60..8e346bd2b 100644 --- a/tests/core/blacklist/api/requirements.in +++ b/tests/core/blacklist/api/requirements.in @@ -1,2 +1,2 @@ -fastapi==0.104.1 +fastapi==0.105.0 uvicorn[standard]==0.24.0 diff --git a/tests/core/blacklist/api/requirements.txt b/tests/core/blacklist/api/requirements.txt index b52ef7152..2352d9e41 100644 --- a/tests/core/blacklist/api/requirements.txt +++ b/tests/core/blacklist/api/requirements.txt @@ -23,9 +23,9 @@ exceptiongroup==1.2.0 \ --hash=sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14 \ --hash=sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68 # via anyio -fastapi==0.104.1 \ - --hash=sha256:752dc31160cdbd0436bb93bad51560b57e525cbb1d4bbf6f4904ceee75548241 \ - --hash=sha256:e5e4540a7c5e1dcfbbcf5b903c234feddcdcd881f191977a1c5dfd917487e7ae +fastapi==0.105.0 \ + --hash=sha256:4d12838819aa52af244580675825e750ad67c9df4614f557a769606af902cf22 \ + --hash=sha256:f19ebf6fdc82a3281d10f2cb4774bdfa90238e3b40af3525a0c09fd08ad1c480 # via -r requirements.in h11==0.14.0 \ --hash=sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d \ @@ -248,9 +248,9 @@ starlette==0.27.0 \ --hash=sha256:6a6b0d042acb8d469a01eba54e9cda6cbd24ac602c4cd016723117d6a7e73b75 \ --hash=sha256:918416370e846586541235ccd38a474c08b80443ed31c578a418e2209b3eef91 # via fastapi -typing-extensions==4.8.0 \ - --hash=sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0 \ - --hash=sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef +typing-extensions==4.9.0 \ + --hash=sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783 \ + --hash=sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd # via # fastapi # pydantic diff --git a/tests/core/bunkernet/api/requirements.in b/tests/core/bunkernet/api/requirements.in index b04d6bd60..8e346bd2b 100644 --- a/tests/core/bunkernet/api/requirements.in +++ b/tests/core/bunkernet/api/requirements.in @@ -1,2 +1,2 @@ -fastapi==0.104.1 +fastapi==0.105.0 uvicorn[standard]==0.24.0 diff --git a/tests/core/bunkernet/api/requirements.txt b/tests/core/bunkernet/api/requirements.txt index b52ef7152..2352d9e41 100644 --- a/tests/core/bunkernet/api/requirements.txt +++ b/tests/core/bunkernet/api/requirements.txt @@ -23,9 +23,9 @@ exceptiongroup==1.2.0 \ --hash=sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14 \ --hash=sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68 # via anyio -fastapi==0.104.1 \ - --hash=sha256:752dc31160cdbd0436bb93bad51560b57e525cbb1d4bbf6f4904ceee75548241 \ - --hash=sha256:e5e4540a7c5e1dcfbbcf5b903c234feddcdcd881f191977a1c5dfd917487e7ae +fastapi==0.105.0 \ + --hash=sha256:4d12838819aa52af244580675825e750ad67c9df4614f557a769606af902cf22 \ + --hash=sha256:f19ebf6fdc82a3281d10f2cb4774bdfa90238e3b40af3525a0c09fd08ad1c480 # via -r requirements.in h11==0.14.0 \ --hash=sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d \ @@ -248,9 +248,9 @@ starlette==0.27.0 \ --hash=sha256:6a6b0d042acb8d469a01eba54e9cda6cbd24ac602c4cd016723117d6a7e73b75 \ --hash=sha256:918416370e846586541235ccd38a474c08b80443ed31c578a418e2209b3eef91 # via fastapi -typing-extensions==4.8.0 \ - --hash=sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0 \ - --hash=sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef +typing-extensions==4.9.0 \ + --hash=sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783 \ + --hash=sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd # via # fastapi # pydantic diff --git a/tests/core/bwcli/requirements.in b/tests/core/bwcli/requirements.in index 23b7591c4..901105d06 100644 --- a/tests/core/bwcli/requirements.in +++ b/tests/core/bwcli/requirements.in @@ -1 +1 @@ -docker==6.1.3 +docker==7.0.0 diff --git a/tests/core/bwcli/requirements.txt b/tests/core/bwcli/requirements.txt index e535176b7..de920371a 100644 --- a/tests/core/bwcli/requirements.txt +++ b/tests/core/bwcli/requirements.txt @@ -100,9 +100,9 @@ charset-normalizer==3.3.2 \ --hash=sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519 \ --hash=sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561 # via requests -docker==6.1.3 \ - --hash=sha256:aa6d17830045ba5ef0168d5eaa34d37beeb113948c413affe1d5991fc11f9a20 \ - --hash=sha256:aecd2277b8bf8e506e484f6ab7aec39abe0038e29fa4a6d3ba86c3fe01844ed9 +docker==7.0.0 \ + --hash=sha256:12ba681f2777a0ad28ffbcc846a69c31b4dfd9752b47eb425a274ee269c5e14b \ + --hash=sha256:323736fb92cd9418fc5e7133bc953e11a9da04f4483f828b527db553f1e7e5a3 # via -r requirements.in idna==3.6 \ --hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \ @@ -122,7 +122,3 @@ urllib3==2.1.0 \ # via # docker # requests -websocket-client==1.7.0 \ - --hash=sha256:10e511ea3a8c744631d3bd77e61eb17ed09304c413ad42cf6ddfa4c7787e8fe6 \ - --hash=sha256:f4c3d22fec12a2461427a29957ff07d35098ee2d976d3ba244e688b8b4057588 - # via docker diff --git a/tests/core/db/requirements.txt b/tests/core/db/requirements.txt index 7408a4e2e..0db96e162 100644 --- a/tests/core/db/requirements.txt +++ b/tests/core/db/requirements.txt @@ -83,64 +83,65 @@ cryptography==41.0.7 \ --hash=sha256:e3114da6d7f95d2dee7d3f4eec16dacff819740bbab931aff8648cb13c5ff5e7 \ --hash=sha256:f983596065a18a2183e7f79ab3fd4c475205b839e02cbc0efbbf9666c4b3083d # via -r requirements.in -greenlet==3.0.1 \ - --hash=sha256:0a02d259510b3630f330c86557331a3b0e0c79dac3d166e449a39363beaae174 \ - --hash=sha256:0b6f9f8ca7093fd4433472fd99b5650f8a26dcd8ba410e14094c1e44cd3ceddd \ - --hash=sha256:100f78a29707ca1525ea47388cec8a049405147719f47ebf3895e7509c6446aa \ - --hash=sha256:1757936efea16e3f03db20efd0cd50a1c86b06734f9f7338a90c4ba85ec2ad5a \ - --hash=sha256:19075157a10055759066854a973b3d1325d964d498a805bb68a1f9af4aaef8ec \ - --hash=sha256:19bbdf1cce0346ef7341705d71e2ecf6f41a35c311137f29b8a2dc2341374565 \ - --hash=sha256:20107edf7c2c3644c67c12205dc60b1bb11d26b2610b276f97d666110d1b511d \ - --hash=sha256:22f79120a24aeeae2b4471c711dcf4f8c736a2bb2fabad2a67ac9a55ea72523c \ - --hash=sha256:2847e5d7beedb8d614186962c3d774d40d3374d580d2cbdab7f184580a39d234 \ - --hash=sha256:28e89e232c7593d33cac35425b58950789962011cc274aa43ef8865f2e11f46d \ - --hash=sha256:329c5a2e5a0ee942f2992c5e3ff40be03e75f745f48847f118a3cfece7a28546 \ - --hash=sha256:337322096d92808f76ad26061a8f5fccb22b0809bea39212cd6c406f6a7060d2 \ - --hash=sha256:3fcc780ae8edbb1d050d920ab44790201f027d59fdbd21362340a85c79066a74 \ - --hash=sha256:41bdeeb552d814bcd7fb52172b304898a35818107cc8778b5101423c9017b3de \ - --hash=sha256:4eddd98afc726f8aee1948858aed9e6feeb1758889dfd869072d4465973f6bfd \ - --hash=sha256:52e93b28db27ae7d208748f45d2db8a7b6a380e0d703f099c949d0f0d80b70e9 \ - --hash=sha256:55d62807f1c5a1682075c62436702aaba941daa316e9161e4b6ccebbbf38bda3 \ - --hash=sha256:5805e71e5b570d490938d55552f5a9e10f477c19400c38bf1d5190d760691846 \ - --hash=sha256:599daf06ea59bfedbec564b1692b0166a0045f32b6f0933b0dd4df59a854caf2 \ - --hash=sha256:60d5772e8195f4e9ebf74046a9121bbb90090f6550f81d8956a05387ba139353 \ - --hash=sha256:696d8e7d82398e810f2b3622b24e87906763b6ebfd90e361e88eb85b0e554dc8 \ - --hash=sha256:6e6061bf1e9565c29002e3c601cf68569c450be7fc3f7336671af7ddb4657166 \ - --hash=sha256:80ac992f25d10aaebe1ee15df45ca0d7571d0f70b645c08ec68733fb7a020206 \ - --hash=sha256:816bd9488a94cba78d93e1abb58000e8266fa9cc2aa9ccdd6eb0696acb24005b \ - --hash=sha256:85d2b77e7c9382f004b41d9c72c85537fac834fb141b0296942d52bf03fe4a3d \ - --hash=sha256:87c8ceb0cf8a5a51b8008b643844b7f4a8264a2c13fcbcd8a8316161725383fe \ - --hash=sha256:89ee2e967bd7ff85d84a2de09df10e021c9b38c7d91dead95b406ed6350c6997 \ - --hash=sha256:8bef097455dea90ffe855286926ae02d8faa335ed8e4067326257cb571fc1445 \ - --hash=sha256:8d11ebbd679e927593978aa44c10fc2092bc454b7d13fdc958d3e9d508aba7d0 \ - --hash=sha256:91e6c7db42638dc45cf2e13c73be16bf83179f7859b07cfc139518941320be96 \ - --hash=sha256:97e7ac860d64e2dcba5c5944cfc8fa9ea185cd84061c623536154d5a89237884 \ - --hash=sha256:990066bff27c4fcf3b69382b86f4c99b3652bab2a7e685d968cd4d0cfc6f67c6 \ - --hash=sha256:9fbc5b8f3dfe24784cee8ce0be3da2d8a79e46a276593db6868382d9c50d97b1 \ - --hash=sha256:ac4a39d1abae48184d420aa8e5e63efd1b75c8444dd95daa3e03f6c6310e9619 \ - --hash=sha256:b2c02d2ad98116e914d4f3155ffc905fd0c025d901ead3f6ed07385e19122c94 \ - --hash=sha256:b2d3337dcfaa99698aa2377c81c9ca72fcd89c07e7eb62ece3f23a3fe89b2ce4 \ - --hash=sha256:b489c36d1327868d207002391f662a1d163bdc8daf10ab2e5f6e41b9b96de3b1 \ - --hash=sha256:b641161c302efbb860ae6b081f406839a8b7d5573f20a455539823802c655f63 \ - --hash=sha256:b8ba29306c5de7717b5761b9ea74f9c72b9e2b834e24aa984da99cbfc70157fd \ - --hash=sha256:b9934adbd0f6e476f0ecff3c94626529f344f57b38c9a541f87098710b18af0a \ - --hash=sha256:ce85c43ae54845272f6f9cd8320d034d7a946e9773c693b27d620edec825e376 \ - --hash=sha256:cf868e08690cb89360eebc73ba4be7fb461cfbc6168dd88e2fbbe6f31812cd57 \ - --hash=sha256:d2905ce1df400360463c772b55d8e2518d0e488a87cdea13dd2c71dcb2a1fa16 \ - --hash=sha256:d57e20ba591727da0c230ab2c3f200ac9d6d333860d85348816e1dca4cc4792e \ - --hash=sha256:d6a8c9d4f8692917a3dc7eb25a6fb337bff86909febe2f793ec1928cd97bedfc \ - --hash=sha256:d923ff276f1c1f9680d32832f8d6c040fe9306cbfb5d161b0911e9634be9ef0a \ - --hash=sha256:daa7197b43c707462f06d2c693ffdbb5991cbb8b80b5b984007de431493a319c \ - --hash=sha256:dbd4c177afb8a8d9ba348d925b0b67246147af806f0b104af4d24f144d461cd5 \ - --hash=sha256:dc4d815b794fd8868c4d67602692c21bf5293a75e4b607bb92a11e821e2b859a \ - --hash=sha256:e9d21aaa84557d64209af04ff48e0ad5e28c5cca67ce43444e939579d085da72 \ - --hash=sha256:ea6b8aa9e08eea388c5f7a276fabb1d4b6b9d6e4ceb12cc477c3d352001768a9 \ - --hash=sha256:eabe7090db68c981fca689299c2d116400b553f4b713266b130cfc9e2aa9c5a9 \ - --hash=sha256:f2f6d303f3dee132b322a14cd8765287b8f86cdc10d2cb6a6fae234ea488888e \ - --hash=sha256:f33f3258aae89da191c6ebaa3bc517c6c4cbc9b9f689e5d8452f7aedbb913fa8 \ - --hash=sha256:f7bfb769f7efa0eefcd039dd19d843a4fbfbac52f1878b1da2ed5793ec9b1a65 \ - --hash=sha256:f89e21afe925fcfa655965ca8ea10f24773a1791400989ff32f467badfe4a064 \ - --hash=sha256:fa24255ae3c0ab67e613556375a4341af04a084bd58764731972bcbc8baeba36 +greenlet==3.0.2 \ + --hash=sha256:006c1028ac0cfcc4e772980cfe73f5476041c8c91d15d64f52482fc571149d46 \ + --hash=sha256:0acadbc3f72cb0ee85070e8d36bd2a4673d2abd10731ee73c10222cf2dd4713c \ + --hash=sha256:0c0fdb8142742ee68e97c106eb81e7d3e883cc739d9c5f2b28bc38a7bafeb6d1 \ + --hash=sha256:0df7eed98ea23b20e9db64d46eb05671ba33147df9405330695bcd81a73bb0c9 \ + --hash=sha256:10d247260db20887ae8857c0cbc750b9170f0b067dd7d38fb68a3f2334393bd3 \ + --hash=sha256:14b5d999aefe9ffd2049ad19079f733c3aaa426190ffecadb1d5feacef8fe397 \ + --hash=sha256:18fe39d70d482b22f0014e84947c5aaa7211fb8e13dc4cc1c43ed2aa1db06d9a \ + --hash=sha256:1c1129bc47266d83444c85a8e990ae22688cf05fb20d7951fd2866007c2ba9bc \ + --hash=sha256:1dac09e3c0b78265d2e6d3cbac2d7c48bd1aa4b04a8ffeda3adde9f1688df2c3 \ + --hash=sha256:2c93cd03acb1499ee4de675e1a4ed8eaaa7227f7949dc55b37182047b006a7aa \ + --hash=sha256:2e9c5423046eec21f6651268cb674dfba97280701e04ef23d312776377313206 \ + --hash=sha256:2ee59c4627c8c4bb3e15949fbcd499abd6b7f4ad9e0bfcb62c65c5e2cabe0ec4 \ + --hash=sha256:339c0272a62fac7e602e4e6ec32a64ff9abadc638b72f17f6713556ed011d493 \ + --hash=sha256:38878744926cec29b5cc3654ef47f3003f14bfbba7230e3c8492393fe29cc28b \ + --hash=sha256:3e4bfa752b3688d74ab1186e2159779ff4867644d2b1ebf16db14281f0445377 \ + --hash=sha256:520fcb53a39ef90f5021c77606952dbbc1da75d77114d69b8d7bded4a8e1a813 \ + --hash=sha256:5f9ea7c2c9795549653b6f7569f6bc75d2c7d1f6b2854eb8ce0bc6ec3cb2dd88 \ + --hash=sha256:654b84c9527182036747938b81938f1d03fb8321377510bc1854a9370418ab66 \ + --hash=sha256:6d65bec56a7bc352bcf11b275b838df618651109074d455a772d3afe25390b7d \ + --hash=sha256:7363756cc439a503505b67983237d1cc19139b66488263eb19f5719a32597836 \ + --hash=sha256:80d068e4b6e2499847d916ef64176811ead6bf210a610859220d537d935ec6fd \ + --hash=sha256:8756a94ed8f293450b0e91119eca2a36332deba69feb2f9ca410d35e74eae1e4 \ + --hash=sha256:89a6f6ddcbef4000cda7e205c4c20d319488ff03db961d72d4e73519d2465309 \ + --hash=sha256:8f34a765c5170c0673eb747213a0275ecc749ab3652bdbec324621ed5b2edaef \ + --hash=sha256:8f8d14a0a4e8c670fbce633d8b9a1ee175673a695475acd838e372966845f764 \ + --hash=sha256:950e21562818f9c771989b5b65f990e76f4ac27af66e1bb34634ae67886ede2a \ + --hash=sha256:9560c580c896030ff9c311c603aaf2282234643c90d1dec738a1d93e3e53cd51 \ + --hash=sha256:9acd8fd67c248b8537953cb3af8787c18a87c33d4dcf6830e410ee1f95a63fd4 \ + --hash=sha256:a37ae53cca36823597fd5f65341b6f7bac2dd69ecd6ca01334bb795460ab150b \ + --hash=sha256:aecea0442975741e7d69daff9b13c83caff8c13eeb17485afa65f6360a045765 \ + --hash=sha256:b1405614692ac986490d10d3e1a05e9734f473750d4bee3cf7d1286ef7af7da6 \ + --hash=sha256:b1fd25dfc5879a82103b3d9e43fa952e3026c221996ff4d32a9c72052544835d \ + --hash=sha256:b2cedf279ca38ef3f4ed0d013a6a84a7fc3d9495a716b84a5fc5ff448965f251 \ + --hash=sha256:b3f0497db77cfd034f829678b28267eeeeaf2fc21b3f5041600f7617139e6773 \ + --hash=sha256:bfcecc984d60b20ffe30173b03bfe9ba6cb671b0be1e95c3e2056d4fe7006590 \ + --hash=sha256:c1f647fe5b94b51488b314c82fdda10a8756d650cee8d3cd29f657c6031bdf73 \ + --hash=sha256:c235131bf59d2546bb3ebaa8d436126267392f2e51b85ff45ac60f3a26549af0 \ + --hash=sha256:c27b142a9080bdd5869a2fa7ebf407b3c0b24bd812db925de90e9afe3c417fd6 \ + --hash=sha256:c42bb589e6e9f9d8bdd79f02f044dff020d30c1afa6e84c0b56d1ce8a324553c \ + --hash=sha256:cd5bc4fde0842ff2b9cf33382ad0b4db91c2582db836793d58d174c569637144 \ + --hash=sha256:cecfdc950dd25f25d6582952e58521bca749cf3eeb7a9bad69237024308c8196 \ + --hash=sha256:d1fceb5351ab1601903e714c3028b37f6ea722be6873f46e349a960156c05650 \ + --hash=sha256:d4d0df07a38e41a10dfb62c6fc75ede196572b580f48ee49b9282c65639f3965 \ + --hash=sha256:d5547b462b8099b84746461e882a3eb8a6e3f80be46cb6afb8524eeb191d1a30 \ + --hash=sha256:d64643317e76b4b41fdba659e7eca29634e5739b8bc394eda3a9127f697ed4b0 \ + --hash=sha256:db4233358d3438369051a2f290f1311a360d25c49f255a6c5d10b5bcb3aa2b49 \ + --hash=sha256:e0e28f5233d64c693382f66d47c362b72089ebf8ac77df7e12ac705c9fa1163d \ + --hash=sha256:e79fb5a9fb2d0bd3b6573784f5e5adabc0b0566ad3180a028af99523ce8f6138 \ + --hash=sha256:e84bef3cfb6b6bfe258c98c519811c240dbc5b33a523a14933a252e486797c90 \ + --hash=sha256:ed1a8a08de7f68506a38f9a2ddb26bbd1480689e66d788fcd4b5f77e2d9ecfcc \ + --hash=sha256:ed9bf77b41798e8417657245b9f3649314218a4a17aefb02bb3992862df32495 \ + --hash=sha256:edf7a1daba1f7c54326291a8cde58da86ab115b78c91d502be8744f0aa8e3ffa \ + --hash=sha256:f260e6c2337871a52161824058923df2bbddb38bc11a5cbe71f3474d877c5bd9 \ + --hash=sha256:f27aa32466993c92d326df982c4acccd9530fe354e938d9e9deada563e71ce76 \ + --hash=sha256:f4cf532bf3c58a862196b06947b1b5cc55503884f9b63bf18582a75228d9950e \ + --hash=sha256:fb5d60805057d8948065338be6320d35e26b0a72f45db392eb32b70dd6dc9227 \ + --hash=sha256:fc14dd9554f88c9c1fe04771589ae24db76cd56c8f1104e4381b383d6b71aff8 \ + --hash=sha256:fefd5eb2c0b1adffdf2802ff7df45bfe65988b15f6b972706a0e55d451bffaea # via sqlalchemy psycopg2-binary==2.9.9 \ --hash=sha256:03ef7df18daf2c4c07e2695e8cfd5ee7f748a1d54d802330985a78d2a5a6dca9 \ @@ -275,7 +276,7 @@ sqlalchemy==2.0.23 \ --hash=sha256:f508ba8f89e0a5ecdfd3761f82dda2a3d7b678a626967608f4273e0dba8f07ac \ --hash=sha256:fd54601ef9cc455a0c61e5245f690c8a3ad67ddb03d3b91c361d076def0b4c60 # via -r requirements.in -typing-extensions==4.8.0 \ - --hash=sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0 \ - --hash=sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef +typing-extensions==4.9.0 \ + --hash=sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783 \ + --hash=sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd # via sqlalchemy diff --git a/tests/core/greylist/api/requirements.in b/tests/core/greylist/api/requirements.in index b04d6bd60..8e346bd2b 100644 --- a/tests/core/greylist/api/requirements.in +++ b/tests/core/greylist/api/requirements.in @@ -1,2 +1,2 @@ -fastapi==0.104.1 +fastapi==0.105.0 uvicorn[standard]==0.24.0 diff --git a/tests/core/greylist/api/requirements.txt b/tests/core/greylist/api/requirements.txt index b52ef7152..2352d9e41 100644 --- a/tests/core/greylist/api/requirements.txt +++ b/tests/core/greylist/api/requirements.txt @@ -23,9 +23,9 @@ exceptiongroup==1.2.0 \ --hash=sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14 \ --hash=sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68 # via anyio -fastapi==0.104.1 \ - --hash=sha256:752dc31160cdbd0436bb93bad51560b57e525cbb1d4bbf6f4904ceee75548241 \ - --hash=sha256:e5e4540a7c5e1dcfbbcf5b903c234feddcdcd881f191977a1c5dfd917487e7ae +fastapi==0.105.0 \ + --hash=sha256:4d12838819aa52af244580675825e750ad67c9df4614f557a769606af902cf22 \ + --hash=sha256:f19ebf6fdc82a3281d10f2cb4774bdfa90238e3b40af3525a0c09fd08ad1c480 # via -r requirements.in h11==0.14.0 \ --hash=sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d \ @@ -248,9 +248,9 @@ starlette==0.27.0 \ --hash=sha256:6a6b0d042acb8d469a01eba54e9cda6cbd24ac602c4cd016723117d6a7e73b75 \ --hash=sha256:918416370e846586541235ccd38a474c08b80443ed31c578a418e2209b3eef91 # via fastapi -typing-extensions==4.8.0 \ - --hash=sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0 \ - --hash=sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef +typing-extensions==4.9.0 \ + --hash=sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783 \ + --hash=sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd # via # fastapi # pydantic diff --git a/tests/core/redis/requirements.in b/tests/core/redis/requirements.in index 117888c95..6de6aa9ee 100644 --- a/tests/core/redis/requirements.in +++ b/tests/core/redis/requirements.in @@ -1,4 +1,4 @@ -fastapi==0.104.1 +fastapi==0.105.0 redis==5.0.1 requests==2.31.0 selenium==4.16.0 diff --git a/tests/core/redis/requirements.txt b/tests/core/redis/requirements.txt index 477b4b9cc..c6d50dc4f 100644 --- a/tests/core/redis/requirements.txt +++ b/tests/core/redis/requirements.txt @@ -134,9 +134,9 @@ exceptiongroup==1.2.0 \ # anyio # trio # trio-websocket -fastapi==0.104.1 \ - --hash=sha256:752dc31160cdbd0436bb93bad51560b57e525cbb1d4bbf6f4904ceee75548241 \ - --hash=sha256:e5e4540a7c5e1dcfbbcf5b903c234feddcdcd881f191977a1c5dfd917487e7ae +fastapi==0.105.0 \ + --hash=sha256:4d12838819aa52af244580675825e750ad67c9df4614f557a769606af902cf22 \ + --hash=sha256:f19ebf6fdc82a3281d10f2cb4774bdfa90238e3b40af3525a0c09fd08ad1c480 # via -r requirements.in h11==0.14.0 \ --hash=sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d \ @@ -401,9 +401,9 @@ trio-websocket==0.11.1 \ --hash=sha256:18c11793647703c158b1f6e62de638acada927344d534e3c7628eedcb746839f \ --hash=sha256:520d046b0d030cf970b8b2b2e00c4c2245b3807853ecd44214acd33d74581638 # via selenium -typing-extensions==4.8.0 \ - --hash=sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0 \ - --hash=sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef +typing-extensions==4.9.0 \ + --hash=sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783 \ + --hash=sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd # via # fastapi # pydantic diff --git a/tests/core/reversescan/requirements.in b/tests/core/reversescan/requirements.in index 22cca2ade..38d2876d6 100644 --- a/tests/core/reversescan/requirements.in +++ b/tests/core/reversescan/requirements.in @@ -1,3 +1,3 @@ -fastapi==0.104.1 +fastapi==0.105.0 requests==2.31.0 uvicorn[standard]==0.24.0 diff --git a/tests/core/reversescan/requirements.txt b/tests/core/reversescan/requirements.txt index f46853cb0..68b0679ee 100644 --- a/tests/core/reversescan/requirements.txt +++ b/tests/core/reversescan/requirements.txt @@ -119,9 +119,9 @@ exceptiongroup==1.2.0 \ --hash=sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14 \ --hash=sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68 # via anyio -fastapi==0.104.1 \ - --hash=sha256:752dc31160cdbd0436bb93bad51560b57e525cbb1d4bbf6f4904ceee75548241 \ - --hash=sha256:e5e4540a7c5e1dcfbbcf5b903c234feddcdcd881f191977a1c5dfd917487e7ae +fastapi==0.105.0 \ + --hash=sha256:4d12838819aa52af244580675825e750ad67c9df4614f557a769606af902cf22 \ + --hash=sha256:f19ebf6fdc82a3281d10f2cb4774bdfa90238e3b40af3525a0c09fd08ad1c480 # via -r requirements.in h11==0.14.0 \ --hash=sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d \ @@ -350,9 +350,9 @@ starlette==0.27.0 \ --hash=sha256:6a6b0d042acb8d469a01eba54e9cda6cbd24ac602c4cd016723117d6a7e73b75 \ --hash=sha256:918416370e846586541235ccd38a474c08b80443ed31c578a418e2209b3eef91 # via fastapi -typing-extensions==4.8.0 \ - --hash=sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0 \ - --hash=sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef +typing-extensions==4.9.0 \ + --hash=sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783 \ + --hash=sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd # via # fastapi # pydantic diff --git a/tests/core/whitelist/api/requirements.in b/tests/core/whitelist/api/requirements.in index b04d6bd60..8e346bd2b 100644 --- a/tests/core/whitelist/api/requirements.in +++ b/tests/core/whitelist/api/requirements.in @@ -1,2 +1,2 @@ -fastapi==0.104.1 +fastapi==0.105.0 uvicorn[standard]==0.24.0 diff --git a/tests/core/whitelist/api/requirements.txt b/tests/core/whitelist/api/requirements.txt index b52ef7152..2352d9e41 100644 --- a/tests/core/whitelist/api/requirements.txt +++ b/tests/core/whitelist/api/requirements.txt @@ -23,9 +23,9 @@ exceptiongroup==1.2.0 \ --hash=sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14 \ --hash=sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68 # via anyio -fastapi==0.104.1 \ - --hash=sha256:752dc31160cdbd0436bb93bad51560b57e525cbb1d4bbf6f4904ceee75548241 \ - --hash=sha256:e5e4540a7c5e1dcfbbcf5b903c234feddcdcd881f191977a1c5dfd917487e7ae +fastapi==0.105.0 \ + --hash=sha256:4d12838819aa52af244580675825e750ad67c9df4614f557a769606af902cf22 \ + --hash=sha256:f19ebf6fdc82a3281d10f2cb4774bdfa90238e3b40af3525a0c09fd08ad1c480 # via -r requirements.in h11==0.14.0 \ --hash=sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d \ @@ -248,9 +248,9 @@ starlette==0.27.0 \ --hash=sha256:6a6b0d042acb8d469a01eba54e9cda6cbd24ac602c4cd016723117d6a7e73b75 \ --hash=sha256:918416370e846586541235ccd38a474c08b80443ed31c578a418e2209b3eef91 # via fastapi -typing-extensions==4.8.0 \ - --hash=sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0 \ - --hash=sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef +typing-extensions==4.9.0 \ + --hash=sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783 \ + --hash=sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd # via # fastapi # pydantic diff --git a/tests/requirements.in b/tests/requirements.in index 332fdbdeb..09f397033 100644 --- a/tests/requirements.in +++ b/tests/requirements.in @@ -1,2 +1,3 @@ pyyaml==6.0.1 requests==2.31.0 +pyOpenSSL==23.3.0 diff --git a/tests/requirements.txt b/tests/requirements.txt index c9454d9bf..c9ae6cfb6 100644 --- a/tests/requirements.txt +++ b/tests/requirements.txt @@ -1,13 +1,79 @@ # -# This file is autogenerated by pip-compile with Python 3.9 +# This file is autogenerated by pip-compile with Python 3.7 # by the following command: # -# pip-compile --allow-unsafe --generate-hashes --strip-extras requirements.in +# pip-compile --allow-unsafe --generate-hashes --resolver=backtracking --strip-extras requirements.in # certifi==2023.11.17 \ --hash=sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1 \ --hash=sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474 # via requests +cffi==1.15.1 \ + --hash=sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5 \ + --hash=sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef \ + --hash=sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104 \ + --hash=sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426 \ + --hash=sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405 \ + --hash=sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375 \ + --hash=sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a \ + --hash=sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e \ + --hash=sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc \ + --hash=sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf \ + --hash=sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185 \ + --hash=sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497 \ + --hash=sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3 \ + --hash=sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35 \ + --hash=sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c \ + --hash=sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83 \ + --hash=sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21 \ + --hash=sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca \ + --hash=sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984 \ + --hash=sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac \ + --hash=sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd \ + --hash=sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee \ + --hash=sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a \ + --hash=sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2 \ + --hash=sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192 \ + --hash=sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7 \ + --hash=sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585 \ + --hash=sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f \ + --hash=sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e \ + --hash=sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27 \ + --hash=sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b \ + --hash=sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e \ + --hash=sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e \ + --hash=sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d \ + --hash=sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c \ + --hash=sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415 \ + --hash=sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82 \ + --hash=sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02 \ + --hash=sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314 \ + --hash=sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325 \ + --hash=sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c \ + --hash=sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3 \ + --hash=sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914 \ + --hash=sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045 \ + --hash=sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d \ + --hash=sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9 \ + --hash=sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5 \ + --hash=sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2 \ + --hash=sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c \ + --hash=sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3 \ + --hash=sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2 \ + --hash=sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8 \ + --hash=sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d \ + --hash=sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d \ + --hash=sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9 \ + --hash=sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162 \ + --hash=sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76 \ + --hash=sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4 \ + --hash=sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e \ + --hash=sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9 \ + --hash=sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6 \ + --hash=sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b \ + --hash=sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01 \ + --hash=sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0 + # via cryptography charset-normalizer==3.3.2 \ --hash=sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027 \ --hash=sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087 \ @@ -100,10 +166,43 @@ charset-normalizer==3.3.2 \ --hash=sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519 \ --hash=sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561 # via requests +cryptography==41.0.7 \ + --hash=sha256:079b85658ea2f59c4f43b70f8119a52414cdb7be34da5d019a77bf96d473b960 \ + --hash=sha256:09616eeaef406f99046553b8a40fbf8b1e70795a91885ba4c96a70793de5504a \ + --hash=sha256:13f93ce9bea8016c253b34afc6bd6a75993e5c40672ed5405a9c832f0d4a00bc \ + --hash=sha256:37a138589b12069efb424220bf78eac59ca68b95696fc622b6ccc1c0a197204a \ + --hash=sha256:3c78451b78313fa81607fa1b3f1ae0a5ddd8014c38a02d9db0616133987b9cdf \ + --hash=sha256:43f2552a2378b44869fe8827aa19e69512e3245a219104438692385b0ee119d1 \ + --hash=sha256:48a0476626da912a44cc078f9893f292f0b3e4c739caf289268168d8f4702a39 \ + --hash=sha256:49f0805fc0b2ac8d4882dd52f4a3b935b210935d500b6b805f321addc8177406 \ + --hash=sha256:5429ec739a29df2e29e15d082f1d9ad683701f0ec7709ca479b3ff2708dae65a \ + --hash=sha256:5a1b41bc97f1ad230a41657d9155113c7521953869ae57ac39ac7f1bb471469a \ + --hash=sha256:68a2dec79deebc5d26d617bfdf6e8aab065a4f34934b22d3b5010df3ba36612c \ + --hash=sha256:7a698cb1dac82c35fcf8fe3417a3aaba97de16a01ac914b89a0889d364d2f6be \ + --hash=sha256:841df4caa01008bad253bce2a6f7b47f86dc9f08df4b433c404def869f590a15 \ + --hash=sha256:90452ba79b8788fa380dfb587cca692976ef4e757b194b093d845e8d99f612f2 \ + --hash=sha256:928258ba5d6f8ae644e764d0f996d61a8777559f72dfeb2eea7e2fe0ad6e782d \ + --hash=sha256:af03b32695b24d85a75d40e1ba39ffe7db7ffcb099fe507b39fd41a565f1b157 \ + --hash=sha256:b640981bf64a3e978a56167594a0e97db71c89a479da8e175d8bb5be5178c003 \ + --hash=sha256:c5ca78485a255e03c32b513f8c2bc39fedb7f5c5f8535545bdc223a03b24f248 \ + --hash=sha256:c7f3201ec47d5207841402594f1d7950879ef890c0c495052fa62f58283fde1a \ + --hash=sha256:d5ec85080cce7b0513cfd233914eb8b7bbd0633f1d1703aa28d1dd5a72f678ec \ + --hash=sha256:d6c391c021ab1f7a82da5d8d0b3cee2f4b2c455ec86c8aebbc84837a631ff309 \ + --hash=sha256:e3114da6d7f95d2dee7d3f4eec16dacff819740bbab931aff8648cb13c5ff5e7 \ + --hash=sha256:f983596065a18a2183e7f79ab3fd4c475205b839e02cbc0efbbf9666c4b3083d + # via pyopenssl idna==3.6 \ --hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \ --hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f # via requests +pycparser==2.21 \ + --hash=sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9 \ + --hash=sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206 + # via cffi +pyopenssl==23.3.0 \ + --hash=sha256:6756834481d9ed5470f4a9393455154bc92fe7a64b7bc6ee2c804e78c52099b2 \ + --hash=sha256:6b2cba5cc46e822750ec3e5a81ee12819850b11303630d575e98108a079c2b12 + # via -r requirements.in pyyaml==6.0.1 \ --hash=sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5 \ --hash=sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc \ @@ -160,7 +259,7 @@ requests==2.31.0 \ --hash=sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f \ --hash=sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1 # via -r requirements.in -urllib3==2.1.0 \ - --hash=sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3 \ - --hash=sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54 +urllib3==2.0.7 \ + --hash=sha256:c97dfde1f7bd43a71c8d2a58e369e9b2bf692d1334ea9f9cae55add7d0dd0f84 \ + --hash=sha256:fdb6d215c776278489906c2f8916e6e7d4f5a9b602ccbcfdf7f016fc8da0596e # via requests