From 92bfc8d61f53d9845a3d7e952c96225b22e95a3d Mon Sep 17 00:00:00 2001 From: Anthony Bosio Date: Mon, 9 Sep 2024 10:12:13 -0400 Subject: [PATCH 01/21] docs: update related to optional GraphQL (#366) #290 --------- Co-authored-by: abosio --- README.md | 8 ++++++-- {{cookiecutter.project_slug}}/docs/sentry.md | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 94f16689..eae90c7b 100644 --- a/README.md +++ b/README.md @@ -8,8 +8,12 @@ a new project and streamlines the development experience with Tilt. **scaf** generates a new project structure with Kubernetes manifests in three Kustomize layers for dev, sandbox, and production. A new project contains the following: -* NextJS or React frontend * Django backend +* Celery (optional) +* Next.js frontend (optional) + * Strawberry GraphQL (if frontend is chosen) + * Apollo Client (if frontend is chosen) + * _TODO: REST alternative to GraphQL_ * Postgres database for local development * CloudNativePG deployment for production * Redis @@ -23,6 +27,7 @@ contains the following: * GitHub and Bitbucket pipelines to build and push images, run security, formatting and linting checks * Terraform config to set up a k3s cluster on AWS +* Sentry (optional) ## Installation @@ -134,7 +139,6 @@ default_context: source_control_provider: github.com timezone: US/Eastern use_celery: n - use_graphql: y use_sentry: n version: 0.1.0 diff --git a/{{cookiecutter.project_slug}}/docs/sentry.md b/{{cookiecutter.project_slug}}/docs/sentry.md index e27e9f3e..454e83d1 100644 --- a/{{cookiecutter.project_slug}}/docs/sentry.md +++ b/{{cookiecutter.project_slug}}/docs/sentry.md @@ -8,7 +8,7 @@ 4. Assign a team (create a team, if needed, with the plus icon next to the team dropdown). Teams should be based around the people involved in a project or projects that need to know about errors, not just the client. 5. Click the Create Project button 6. Repeat the above steps with the following changes: -7. Choose React +7. Choose Next.js 8. Name the Project with client-frontend naming convention (ex. {{ cookiecutter.project_dash }}-frontend) 9. Assign a team (create a team, if needed, with the plus icon next to the team dropdown). Teams should be based around the people involved in a project or projects that need to know about errors, not just the client. 10. Click the Create Project button From 952e276852afe84cdbfca062da65fcae6cad6bc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roch=C3=A9=20Compaan?= Date: Wed, 11 Sep 2024 21:22:03 +0200 Subject: [PATCH 02/21] feat: script to test cookiecutter part of Scaf --- README.md | 114 ++++++++----------------- test-configs/nextjs-django-github.yaml | 22 +++++ test-scaf.sh | 65 ++++++++++++++ 3 files changed, 124 insertions(+), 77 deletions(-) create mode 100644 test-configs/nextjs-django-github.yaml create mode 100755 test-scaf.sh diff --git a/README.md b/README.md index eae90c7b..b5dc8dab 100644 --- a/README.md +++ b/README.md @@ -6,32 +6,34 @@ a new project and streamlines the development experience with Tilt. **scaf** generates a new project structure with Kubernetes manifests in -three Kustomize layers for dev, sandbox, and production. A new project +three Kustomize layers for dev, sandbox, and production. A new project contains the following: -* Django backend -* Celery (optional) -* Next.js frontend (optional) - * Strawberry GraphQL (if frontend is chosen) - * Apollo Client (if frontend is chosen) - * _TODO: REST alternative to GraphQL_ -* Postgres database for local development -* CloudNativePG deployment for production -* Redis -* Mailhog -* ArgoCD -* Traefik -* Certmanger -* Certificates and Ingress Routes -* Kube Prometheus Stack -* Grafana Loki -* GitHub and Bitbucket pipelines to build and push images, run security, -formatting and linting checks -* Terraform config to set up a k3s cluster on AWS -* Sentry (optional) + +- Django backend +- Celery (optional) +- Next.js frontend (optional) + - Strawberry GraphQL (if frontend is chosen) + - Apollo Client (if frontend is chosen) + - _TODO: REST alternative to GraphQL_ +- Postgres database for local development +- CloudNativePG deployment for production +- Redis +- Mailhog +- ArgoCD +- Traefik +- Certmanger +- Certificates and Ingress Routes +- Kube Prometheus Stack +- Grafana Loki +- GitHub and Bitbucket pipelines to build and push images, run security, + formatting and linting checks +- Terraform config to set up a k3s cluster on AWS +- Sentry (optional) ## Installation Installation is supported on Linux and macOS: + ``` curl -sSL https://raw.githubusercontent.com/sixfeetup/scaf/main/install.sh | sh ``` @@ -50,8 +52,9 @@ documentation explaining how to use and configure your newly created project. To deploy your project using Terraform and AWS, you can follow the instructions in `terraform/README.md.` Note that you will need: + - an AWS account where you have access to the `OrganizationAccountAccessRole` -- terraform, and AWS CLI installed and configured +- terraform, and AWS CLI installed and configured ## Development on Scaf @@ -62,7 +65,7 @@ The Nix Flake ensures all developers are using the same versions of all packages to develop on Scaf in an isolated environment. Follow the instructions to install -[Nix](https://nixos.org/download/#download-nix) for your OS. +[Nix](https://nixos.org/download/#download-nix) for your OS. Nix Flakes are a feature that comes with Nix, but they are considered experimental and are not enabled by default in stable releases of Nix. To use @@ -116,63 +119,20 @@ When making changes to scaf, keep the following in mind: - update to the latest Python supported by Django. For Django 4.1, this is 3.8, 3.9, and 3.10. ### Testing -To test the cookiecutter portion of scaf, create virtual environment ad install black, isort and cookiecutter. -Create a test cookiecutter.yaml file with the following content: -```yaml ---- -default_context: - author_name: Joe Sixie - aws_account_id: "000000000000" - aws_region: us-east-1 - create_nextjs_frontend: y - debug: n - description: Behold My Awesome Project! - domain_name: sixfeetup.com - email: joe-sixie@sixfeetup.com - mail_service: Mailgun - project_dash: my-awesome-sixie-project - project_name: My Awesome Sixie Project - project_slug: my_awesome_sixie_project - repo_name: my_awesome_sixie_project - repo_url: git@github.com:sixfeetup/my_awesome_sixie_project.git - source_control_organization_slug: sixfeetup - source_control_provider: github.com - timezone: US/Eastern - use_celery: n - use_sentry: n - version: 0.1.0 -``` - -Then create a helper script to run the tests: -```bash -#! /bin/bash +To test the cookiecutter portion of Scaf, run the `./test-scaf.sh` script. -SCAF_ROOT=/Users/gfranxman/sfu/ScafDev/scaf -OUTPUT_FOLDER=./scaf-test -TEST_CONFIG=./scaf-cookiecutter.yaml +If you are not using the Nix development environment, create a virtual environment and +install black, isort and cookiecutter before running `./test-scaf.sh`. -rm -rf $OUTPUT_FOLDER && cookiecutter $SCAF_ROOT --no-input --config-file $TEST_CONFIG -o $OUTPUT_FOLDER -v +Running `./test-scaf.sh -h` shows the usage instructions: +```shell +Usage: ./test-scaf.sh [-b ] [-o ] [-c ] [-h] + -b Optional: Specify the branch to test (default is local checkout) + -o Optional: Specify the output folder (default is /tmp/scaf-test) + -c Optional: Specify the config file (default is ./test-configs/nextjs-django-github.yaml) + -h Show this help message ``` -Run the script and check the output folder for the generated project. - -To test run the project using your branch for scaf and the cookiecutter you have to tell it -which branch and repo to use. Here is an example script to do that: - -(You will need to adjust the paths and branch name to match your setup): -```bash -#! /bin/bash - -SCAF_ROOT=/Users/gfranxman/sfu/ScafDev/scaf -OUTPUT_FOLDER=./scaf-test -TEST_CONFIG=./scaf-cookiecutter.yaml - -BRANCH_NAME=gfranxman/configure-git-remote -BASE_REPO=https://github.com/sixfeetup/scaf.git - - -rm -rf $OUTPUT_FOLDER && \ -$SCAF_ROOT/scaf myproject --no-input --checkout $BRANCH_NAME ${BASE_REPO} -``` +Feel free to add more useful test configurations to `./test-configs/`. diff --git a/test-configs/nextjs-django-github.yaml b/test-configs/nextjs-django-github.yaml new file mode 100644 index 00000000..61eab938 --- /dev/null +++ b/test-configs/nextjs-django-github.yaml @@ -0,0 +1,22 @@ +default_context: + author_name: Iam Scafman + aws_account_id: "000000000000" + aws_region: us-east-1 + create_nextjs_frontend: y + debug: n + description: My Awesome Scaf Project! + domain_name: sixfeetup.com + email: iamscafman@sixfeetup.com + mail_service: Mailgun + project_dash: my-awesome-scaf-project + project_name: My Awesome Scaf Project + project_slug: my_awesome_scaf_project + repo_name: my_awesome_sixie_project + repo_url: git@github.com:sixfeetup/my_awesome_scaf_project.git + source_control_organization_slug: sixfeetup + source_control_provider: github.com + timezone: US/Eastern + use_celery: n + use_graphql: y + use_sentry: n + version: 0.1.0 diff --git a/test-scaf.sh b/test-scaf.sh new file mode 100755 index 00000000..e7842bea --- /dev/null +++ b/test-scaf.sh @@ -0,0 +1,65 @@ +#!/bin/bash + +# Default values +BRANCH_NAME="" +OUTPUT_FOLDER="/tmp/scaf-test" +TEST_CONFIG="./test-configs/nextjs-django-github.yaml" + +# Usage function to display help message +usage() { + echo "Usage: $0 [-b ] [-o ] [-c ] [-h]" + echo " -b Optional: Specify the branch to test (default is local checkout)" + echo " -o Optional: Specify the output folder (default is /tmp/scaf-test)" + echo " -c Optional: Specify the config file (default is $TEST_CONFIG)" + echo " -h Show this help message" + exit 0 +} + +# Parse command-line arguments +while getopts ":b:o:c:h" opt; do + case ${opt} in + b ) + BRANCH_NAME=$OPTARG + ;; + o ) + OUTPUT_FOLDER=$OPTARG + ;; + c ) + TEST_CONFIG=$OPTARG + ;; + h ) + usage + ;; + \? ) + echo "Invalid option: -$OPTARG" 1>&2 + usage + ;; + : ) + echo "Option -$OPTARG requires an argument." 1>&2 + usage + ;; + esac +done + +# Dynamically set the SCAF_ROOT to the directory where this script is located. +SCAF_ROOT=$(dirname "$(realpath "$0")") + +# Ensure the test configuration file exists. +if [[ ! -f "$TEST_CONFIG" ]]; then + echo "Test config file ($TEST_CONFIG) not found!" + exit 1 +fi + +# Clean the output folder. +rm -rf "$OUTPUT_FOLDER" + +# Check if a branch name was provided. +if [[ -n "$BRANCH_NAME" ]]; then + # Test with the specified branch. + cookiecutter "$SCAF_ROOT" --checkout "$BRANCH_NAME" --no-input --config-file "$TEST_CONFIG" -o "$OUTPUT_FOLDER" -v + echo "Test completed using branch '$BRANCH_NAME'. Check the $OUTPUT_FOLDER for the generated project." +else + # Use local checkout. + cookiecutter "$SCAF_ROOT" --no-input --config-file "$TEST_CONFIG" -o "$OUTPUT_FOLDER" -v + echo "Test completed using the local checkout. Check the $OUTPUT_FOLDER for the generated project." +fi From fbec7476213c26d675585985b34c91f80b21dad4 Mon Sep 17 00:00:00 2001 From: sedatbasar <43781806+sedatbasar@users.noreply.github.com> Date: Thu, 12 Sep 2024 12:56:49 +0300 Subject: [PATCH 03/21] chore: #116 Extends frontend eslint rules (#372) Co-authored-by: sedatbasar --- .../frontend/.eslintrc.json | 11 +- .../frontend/package-lock.json | 215 ++++++++---------- .../frontend/package.json | 10 +- .../frontend/pages/_app.tsx | 1 - 4 files changed, 115 insertions(+), 122 deletions(-) diff --git a/{{cookiecutter.project_slug}}/frontend/.eslintrc.json b/{{cookiecutter.project_slug}}/frontend/.eslintrc.json index c1831458..6ac87541 100644 --- a/{{cookiecutter.project_slug}}/frontend/.eslintrc.json +++ b/{{cookiecutter.project_slug}}/frontend/.eslintrc.json @@ -1,7 +1,16 @@ { - "extends": ["next/core-web-vitals", "plugin:@typescript-eslint/recommended", "plugin:jsx-a11y/recommended"], + "extends": [ + "next/core-web-vitals", + "plugin:@typescript-eslint/recommended", + "plugin:jsx-a11y/recommended", + "plugin:react-hooks/recommended", + "eslint:recommended", + "plugin:react/recommended", + "plugin:react/jsx-runtime" + ], "plugins": ["jsx-a11y", "unused-imports"], "rules": { + "react/jsx-curly-brace-presence": "error", "@typescript-eslint/no-unused-vars": "off", "unused-imports/no-unused-imports": "error", "unused-imports/no-unused-vars": [ diff --git a/{{cookiecutter.project_slug}}/frontend/package-lock.json b/{{cookiecutter.project_slug}}/frontend/package-lock.json index 03e000bb..d5166465 100644 --- a/{{cookiecutter.project_slug}}/frontend/package-lock.json +++ b/{{cookiecutter.project_slug}}/frontend/package-lock.json @@ -26,14 +26,16 @@ "@graphql-typed-document-node/core": "^3.2.0", "@testing-library/react": "^16.0.0", "@types/lodash": "^4.17.6", - "@types/node": "^20", - "@types/react": "^18", + "@types/node": "20.16.5", + "@types/react": "18.3.5", "@types/react-dom": "^18", "@vitejs/plugin-react": "^4.3.1", - "eslint": "^8", + "eslint": "^8.57.0", "eslint-config-next": "14.2.4", "eslint-plugin-import": "^2.29.1", "eslint-plugin-jsx-a11y": "^6.9.0", + "eslint-plugin-react": "^7.35.2", + "eslint-plugin-react-hooks": "^4.6.2", "graphql": "^16.9.0", "husky": "^9.0.11", "jsdom": "^24.1.0", @@ -41,7 +43,7 @@ "prettier": "^3.3.2", "prettier-plugin-tailwindcss": "^0.6.5", "tailwindcss": "^3.4.1", - "typescript": "^5.5.3", + "typescript": "5.6.2", "vitest": "^1.6.0" } }, @@ -3439,12 +3441,12 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.14.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.9.tgz", - "integrity": "sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==", + "version": "20.16.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.5.tgz", + "integrity": "sha512-VwYCweNo3ERajwy0IUlqqcyZ8/A7Zwa9ZP3MnENWcB11AejO+tLy3pu850goUW2FC/IJMdZUfKpX/yxL1gymCA==", "dev": true, "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.19.2" } }, "node_modules/@types/prop-types": { @@ -3454,9 +3456,9 @@ "devOptional": true }, "node_modules/@types/react": { - "version": "18.3.3", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", - "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", + "version": "18.3.5", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.5.tgz", + "integrity": "sha512-WeqMfGJLGuLCqHGYRGHxnKrXcTitc6L/nBUWfWPcTarG3t9PsquqUMuVeXZeca+mglY4Vo5GZjCi0A3Or2lnxA==", "devOptional": true, "dependencies": { "@types/prop-types": "*", @@ -4537,18 +4539,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array.prototype.toreversed": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz", - "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - } - }, "node_modules/array.prototype.tosorted": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", @@ -6167,76 +6157,6 @@ "eslint-plugin-import": "*" } }, - "node_modules/eslint-config-next/node_modules/eslint-plugin-react": { - "version": "7.34.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.3.tgz", - "integrity": "sha512-aoW4MV891jkUulwDApQbPYTVZmeuSyFrudpbTAQuj5Fv8VL+o6df2xIGpw8B0hPjAaih1/Fb0om9grCdyFYemA==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.8", - "array.prototype.findlast": "^1.2.5", - "array.prototype.flatmap": "^1.3.2", - "array.prototype.toreversed": "^1.1.2", - "array.prototype.tosorted": "^1.1.4", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.19", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.8", - "object.fromentries": "^2.0.8", - "object.hasown": "^1.1.4", - "object.values": "^1.2.0", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.5", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.11" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-config-next/node_modules/eslint-plugin-react-hooks": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", - "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/eslint-config-next/node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/eslint-config-next/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", @@ -6362,6 +6282,76 @@ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" } }, + "node_modules/eslint-plugin-react": { + "version": "7.35.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.35.2.tgz", + "integrity": "sha512-Rbj2R9zwP2GYNcIak4xoAMV57hrBh3hTaR0k7hVjwCQgryE/pw5px4b13EYjduOI0hfXyZhwBxaGpOTbWSGzKQ==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.19", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.8", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.0", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.11", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/eslint-plugin-unused-imports": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-3.2.0.tgz", @@ -8945,23 +8935,6 @@ "node": ">= 0.4" } }, - "node_modules/object.hasown": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.4.tgz", - "integrity": "sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==", - "dev": true, - "dependencies": { - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/object.values": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", @@ -10535,6 +10508,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, "node_modules/string.prototype.trim": { "version": "1.2.9", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", @@ -11085,9 +11068,9 @@ } }, "node_modules/typescript": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", - "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==", + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz", + "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -11150,9 +11133,9 @@ } }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", "dev": true }, "node_modules/universalify": { diff --git a/{{cookiecutter.project_slug}}/frontend/package.json b/{{cookiecutter.project_slug}}/frontend/package.json index 398bf76a..2912263a 100644 --- a/{{cookiecutter.project_slug}}/frontend/package.json +++ b/{{cookiecutter.project_slug}}/frontend/package.json @@ -35,14 +35,16 @@ "@graphql-typed-document-node/core": "^3.2.0", "@testing-library/react": "^16.0.0", "@types/lodash": "^4.17.6", - "@types/node": "^20", - "@types/react": "^18", + "@types/node": "20.16.5", + "@types/react": "18.3.5", "@types/react-dom": "^18", "@vitejs/plugin-react": "^4.3.1", - "eslint": "^8", + "eslint": "^8.57.0", "eslint-config-next": "14.2.4", "eslint-plugin-import": "^2.29.1", "eslint-plugin-jsx-a11y": "^6.9.0", + "eslint-plugin-react": "^7.35.2", + "eslint-plugin-react-hooks": "^4.6.2", "graphql": "^16.9.0", "husky": "^9.0.11", "jsdom": "^24.1.0", @@ -50,7 +52,7 @@ "prettier": "^3.3.2", "prettier-plugin-tailwindcss": "^0.6.5", "tailwindcss": "^3.4.1", - "typescript": "^5.5.3", + "typescript": "5.6.2", "vitest": "^1.6.0" } } diff --git a/{{cookiecutter.project_slug}}/frontend/pages/_app.tsx b/{{cookiecutter.project_slug}}/frontend/pages/_app.tsx index bf9d9ec2..fdb84925 100644 --- a/{{cookiecutter.project_slug}}/frontend/pages/_app.tsx +++ b/{{cookiecutter.project_slug}}/frontend/pages/_app.tsx @@ -7,7 +7,6 @@ import ErrorBoundary from '@/components/ErrorBoundary' import Layout from '@/components/Layout' import '@/styles/globals.css' - export default function App({ Component, pageProps }: AppProps) { const apolloClient = useApollo(pageProps) return ( From afe2d849ad6db3ca05d812d1da12c02a9f127b96 Mon Sep 17 00:00:00 2001 From: sedatbasar <43781806+sedatbasar@users.noreply.github.com> Date: Thu, 12 Sep 2024 12:57:58 +0300 Subject: [PATCH 04/21] fix: Update logo (#373) Ekran Resmi 2024-09-11 18 23 27 --------- Co-authored-by: sedatbasar --- README.md | 2 +- .../frontend/public/scaf-logo.png | Bin 216601 -> 47188 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b5dc8dab..726bf8a1 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@

- +

**scaf** provides developers and DevOps engineers with a complete blueprint for diff --git a/{{cookiecutter.project_slug}}/frontend/public/scaf-logo.png b/{{cookiecutter.project_slug}}/frontend/public/scaf-logo.png index 2d924697d8c189a335740b332481c7d1ae94ac6d..521c0d9dc716defcf6d3db7ce3ec491700648f6e 100644 GIT binary patch literal 47188 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 literal 216601 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%0D^?XK}C^NHR0AE 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

5nc7IUzgIf)*$p3ELNyLHKgEapx$ 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ຊklVISFvv`MMx7;Rf8{-8TY6Sr$v^@{W7! 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 z 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 Date: Wed, 18 Sep 2024 00:57:26 +0500 Subject: [PATCH 05/21] feat: implement scaf challenge for session recording (#379) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## scaf challenge (complete) 1) Added --challenge flag into scaf cli 2) Added OAuthFlow to authorize scaf setup session with passage 3) Added session recording from installation to running scaffolding platform ### Snapshots Screenshot 2024-09-15 at 9 31 33 AM Screenshot 2024-09-15 at 7 16 55 AM Screenshot 2024-09-15 at 7 17 59 AM Screenshot 2024-09-15 at 9 24 57 AM ## Instructions ```bash export SCAF_SCRIPT_BRANCH="rehan/scaf-challenge" # Installation script curl -sSL https://raw.githubusercontent.com/sixfeetup/scaf/$SCAF_SCRIPT_BRANCH/install.sh | sh # Bootstrap project with challenge (Although I used `~/.local/bin/scaf` abs path) scaf demo --checkout=rehan/scaf-challenge --challenge # Bootstrap project without challenge scaf demo --checkout=rehan/scaf-challenge ``` Next: - [ ] Get rid of OIDC Secret via PKCE flow --- .gitignore | 3 + cookiecutter.json | 1 + hooks/post_gen_project.py | 74 +++---- scaf | 204 +++++++++++++++--- .../backend/config/settings/base.py | 12 ++ .../challenge/__init__.py | 0 .../challenge/admin.py | 8 + .../challenge/apps.py | 16 ++ .../challenge/migrations/0001_initial.py | 25 +++ .../challenge/migrations/__init__.py | 0 .../challenge/models.py | 13 ++ .../challenge/utils.py | 37 ++++ .../k8s/base/app.configmap.yaml | 7 +- 13 files changed, 331 insertions(+), 69 deletions(-) create mode 100644 {{cookiecutter.project_slug}}/backend/{{cookiecutter.project_slug}}/challenge/__init__.py create mode 100644 {{cookiecutter.project_slug}}/backend/{{cookiecutter.project_slug}}/challenge/admin.py create mode 100644 {{cookiecutter.project_slug}}/backend/{{cookiecutter.project_slug}}/challenge/apps.py create mode 100644 {{cookiecutter.project_slug}}/backend/{{cookiecutter.project_slug}}/challenge/migrations/0001_initial.py create mode 100644 {{cookiecutter.project_slug}}/backend/{{cookiecutter.project_slug}}/challenge/migrations/__init__.py create mode 100644 {{cookiecutter.project_slug}}/backend/{{cookiecutter.project_slug}}/challenge/models.py create mode 100644 {{cookiecutter.project_slug}}/backend/{{cookiecutter.project_slug}}/challenge/utils.py diff --git a/.gitignore b/.gitignore index adbfaa78..f1271e8f 100644 --- a/.gitignore +++ b/.gitignore @@ -385,3 +385,6 @@ dist *.tfvars.json .direnv + +# scaf challenge +.scaf-challenge.json diff --git a/cookiecutter.json b/cookiecutter.json index e591e980..f322ab36 100644 --- a/cookiecutter.json +++ b/cookiecutter.json @@ -16,6 +16,7 @@ "Amazon SES", "Other SMTP" ], + "_challenge": "n", "use_celery": "n", "use_sentry": "n", "debug": "n", diff --git a/hooks/post_gen_project.py b/hooks/post_gen_project.py index 521f5761..36f67d7f 100644 --- a/hooks/post_gen_project.py +++ b/hooks/post_gen_project.py @@ -4,7 +4,7 @@ import shutil import string import subprocess -import zipfile +import json try: # Inspired by @@ -128,18 +128,6 @@ def set_django_secret_key(file_path): return django_secret_key -def set_django_admin_url(file_path): - django_admin_url = set_flag( - file_path, - "!!!SET DJANGO_ADMIN_URL!!!", - formatted="{}/", - length=32, - using_digits=True, - using_ascii_letters=True, - ) - return django_admin_url - - def generate_random_user(): return generate_random_string(length=32, using_ascii_letters=True) @@ -148,11 +136,6 @@ def generate_postgres_user(debug=False): return DEBUG_VALUE if debug else generate_random_user() -def set_postgres_user(file_path, value): - postgres_user = set_flag(file_path, "!!!SET POSTGRES_USER!!!", value=value) - return postgres_user - - def set_postgres_password(file_path, value=None): postgres_password = set_flag( file_path, @@ -165,25 +148,6 @@ def set_postgres_password(file_path, value=None): return postgres_password -def set_celery_flower_user(file_path, value): - celery_flower_user = set_flag( - file_path, "!!!SET CELERY_FLOWER_USER!!!", value=value - ) - return celery_flower_user - - -def set_celery_flower_password(file_path, value=None): - celery_flower_password = set_flag( - file_path, - "!!!SET CELERY_FLOWER_PASSWORD!!!", - value=value, - length=64, - using_digits=True, - using_ascii_letters=True, - ) - return celery_flower_password - - def append_to_gitignore_file(s): with open(".gitignore", "a") as gitignore_file: gitignore_file.write(s) @@ -192,14 +156,29 @@ def append_to_gitignore_file(s): def set_flags_in_secrets(postgres_user, celery_flower_user, debug=False): local_secrets_path = os.path.join("k8s", "local", "secrets.yaml") - set_django_secret_key(os.path.join("k8s", "local", "secrets.yaml")) - - set_postgres_user(local_secrets_path, value=postgres_user) set_postgres_password(local_secrets_path, value=DEBUG_VALUE if debug else None) - set_celery_flower_user(local_secrets_path, value=celery_flower_user) - set_celery_flower_password(local_secrets_path, value=DEBUG_VALUE if debug else None) + +def set_challenge_settings_in_config_map(): + challenge_config = json.loads(os.getenv("CHALLENGE_CONFIG")) + local_configmap_path = os.path.join("k8s", "base", "app.configmap.yaml") + + set_flag( + local_configmap_path, + "__CHALLENGE_SESSION_ID__", + value=challenge_config['session_id'] + ) + set_flag( + local_configmap_path, + "__CHALLENGE_JWT_TOKEN__", + value=challenge_config['access_token'] + ) + set_flag( + local_configmap_path, + "__CHALLENGE_BASE_URL__", + value=challenge_config['base_url'] + ) def remove_sentry_files(): @@ -243,6 +222,11 @@ def remove_graphql_files(): ) +def remove_challenge_files(): + challenge_dir = os.path.join("backend", "{{ cookiecutter.project_slug }}", "challenge") + shutil.rmtree(challenge_dir) + + def init_git_repo(): print(INFO + "Initializing git repository..." + TERMINATOR) print(INFO + f"Current working directory: {os.getcwd()}" + TERMINATOR) @@ -274,6 +258,9 @@ def main(): debug=debug, ) + if "{{ cookiecutter._challenge }}".lower() == "y": + set_challenge_settings_in_config_map() + if "{{ cookiecutter.use_celery }}".lower() == "n": remove_celery_files() @@ -289,6 +276,9 @@ def main(): if "{{ cookiecutter.create_nextjs_frontend }}".lower() == "n": remove_graphql_files() + if "{{ cookiecutter._challenge }}".lower() == "n": + remove_challenge_files() + subprocess.run(shlex.split("black ./backend")) subprocess.run(shlex.split("isort --profile=black ./backend")) diff --git a/scaf b/scaf index b1e72571..66c151dd 100755 --- a/scaf +++ b/scaf @@ -1,5 +1,8 @@ #!/usr/bin/env bash +# Scaf challenge script +CHALLENGE_CONFIG_PATH=".scaf-challenge.json" + # Default repository URL if none is provided DEFAULT_REPO_URL="https://github.com/sixfeetup/scaf/" @@ -46,49 +49,198 @@ if [[ "$COOKIECUTTER_OPTIONS" != *"--no-input"* ]]; then DOCKER_RUN_OPTIONS="-it" fi +# Check if --challenge is in scaf cli arguments +SCAF_CHALLENGE="n" +if [[ $COOKIECUTTER_OPTIONS == *"--challenge"* ]]; then + SCAF_CHALLENGE="y" + # Remove `--challenge` from COOKIECUTTER_OPTIONS as these are carried forward and it is not a + # standard cookiecutter option. + COOKIECUTTER_OPTIONS=$(echo "${COOKIECUTTER_OPTIONS[@]}" | xargs -n1 | grep -v -- "--challenge" | xargs) +fi + party_popper() { - for i in {1..4}; do - echo -ne "\r🎉 POP! 💥" - sleep 0.3 - echo -ne "\r💥 POP! 🎉" - sleep 0.3 - done - echo -e "\r🎊 Congrats! Your $PROJECT_SLUG project is ready! 🎉" - echo - echo "To get started, run:" - echo "cd $PROJECT_SLUG" - echo "tilt up" - echo + for i in {1..4}; do + echo -ne "\r🎉 POP! 💥" + sleep 0.3 + echo -ne "\r💥 POP! 🎉" + sleep 0.3 + done + echo -e "\r🎊 Congrats! Your $PROJECT_SLUG project is ready! 🎉" + echo + echo "To get started, run:" + echo "cd $PROJECT_SLUG" + echo "tilt up" + echo } +start_challenge_oauthflow() { + # Create a temporary Python server for authorization code flow + cat << EOF > temp_server.py +from http.server import BaseHTTPRequestHandler, HTTPServer +from urllib.parse import urlparse, parse_qs +import os +import signal +import base64 + +class TokenHandler(BaseHTTPRequestHandler): + def do_GET(self): + parsed_path = urlparse(self.path) + query_params = parse_qs(parsed_path.query) + if 'code' in query_params: + code = query_params['code'][0] + with open('code.txt', 'w') as f: + f.write(code) + self.send_response(200) + self.send_header('Content-type', 'text/html') + self.end_headers() + encoded_success_resp = b'PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CiAgICA8bWV0YSBjaGFyc2V0PSJVVEYtOCI+CiAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCI+CiAgICA8dGl0bGU+U2NhZjwvdGl0bGU+CiAgICA8c3R5bGU+CiAgICAgICAgYm9keSB7CiAgICAgICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKICAgICAgICAgICAgbWFyZ2luOiAwOwogICAgICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgICAgICBoZWlnaHQ6IDEwMHZoOwogICAgICAgIH0KCiAgICAgICAgaGVhZGVyIHsKICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmNWE3ZDsKICAgICAgICAgICAgcGFkZGluZzogMjBweDsKICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIH0KCiAgICAgICAgaGVhZGVyIGltZyB7CiAgICAgICAgICAgIGhlaWdodDogMTAwcHg7CiAgICAgICAgfQoKICAgICAgICBtYWluIHsKICAgICAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgICAgICBwYWRkaW5nOiAyMHB4OwogICAgICAgIH0KCiAgICAgICAgaDEgewogICAgICAgICAgICBmb250LXNpemU6IDIuNWVtOwogICAgICAgICAgICBtYXJnaW4tYm90dG9tOiAwLjVlbTsKICAgICAgICB9CgogICAgICAgIGgzIHsKICAgICAgICAgICAgZm9udC1zaXplOiAxLjJlbTsKICAgICAgICAgICAgbWFyZ2luLXRvcDogMC41ZW07CiAgICAgICAgfQoKICAgICAgICBmb290ZXIgewogICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmY1YTdkOwogICAgICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICAgICAgcGFkZGluZzogMTBweDsKICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICBib3R0b206IDA7CiAgICAgICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIH0KICAgIDwvc3R5bGU+CjwvaGVhZD4KPGJvZHk+CiAgICA8aGVhZGVyPgogICAgICAgIDxpbWcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsIGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUE0UUFBQU9FQ0FZQUFBRDVUdjg3QUFDNEcwbEVRVlI0bk96ZGVhd2RWUUhIOGU4WXVscEsrN3BBTGFVYnRGQm9hUXUydENKSW9ZQUNjV05FQ1lyRWhlQVNkSENMcU1FbG1tQWNpU1pDSkNZdUdJUWhtaXBxaXlJV2tJS0lwUzJVc3J5MGRCRUtGR2hwQzBoMS9HTmVwZHRiN250ejc3bkw5NU5NNXI3NzdqM24xMytndjU0ek14SHFrenhPMm9ERGdiRjduTWZ0ODk0aHdRSktraVJKamVkcFlDT3dxZU84MXhGbDZSTUJzeldWS0hTQVJwSEh5WERnemNCeHdEVGdtSTdYUTBQbWtpUkprbHJVQnVCaFlIWEhzU0xLMG4rRWpkUjRMSVNkeU9Oa0tuQXFNQStZUzFFQUpVbVNKTlczdTRCN2didUJwVkdXYmcyY3A2NVpDRHZrY2ZKR1lBSHdkdUJzWUdMWVJKSWtTWkpLY0Jmd1IyQnhsS1hMUTRlcE55MWRDUE00R1FTY0I3eWZvZ2dPREp0SWtpUkpVaFZ0QUc0Q2JveXk5SitodzlTRGxpeUVlWndzQkM0RzNnME1EaHhIa2lSSlV1MjFBemNBUDQ2eTlGK2h3NFRTTW9XdzQyNmdsd0NYQWtjRmppTkpraVNwZml3Q3JvMnlkRW5vSUxYVzlJVXdqNU81d0dVVUs0S1NKRW1TMUptMXdMWEE5VkdXdmhnNlRDMDBiU0hNNCtRUzRCUEFpYUd6U0pJa1NXb29Md00zQXRkRVdib3FkSmhxYXFwQzJIR24wRThDVndDakE4ZVJKRW1TMVBodUI3NFJaZW1kb1lOVVExTVV3anhPRGdZdUJ6NERqQWdjUjVJa1NWTHp1Wk9pR040ZU9raVpHcjRRNW5GeU9mQTFvQzEwRmttU0pFbE5ieWx3ZVpTbEswSUhLVVBERnNJOFR0NEpYQTFNQ1oxRmtpUkpVc3Y1Q2ZEbEtFdWZDUjJrTHhxdUVPWnhNZ200SGxnUU9vc2tTWktrbHJZVHVDckswdStHRHRKYkRWVUk4emo1QW5BVk1DaHdGRW1TSkVuYTdVSGd3aWhMSHdrZHBGSU5VUWp6T0prQi9BeVlHVHFMSkVtU0pIWGlXMUdXZmpWMGlFclVmU0hzdUduTU5hRnpTSklrU1ZJUFBBQ2NIMlhwdXRCQmVxSnVDMkVlSjhPQlh3Rm5oczRpU1pJa1NSWFlEbndreXRLYlF3ZnB6aHRDQnppUVBFNU9BVlpqR1pRa1NaTFVlSVlBTitWeGNsM29JTjJwdXhYQ1BFNnVCTDRWT29ja1NaSWtsV0FWOE40b1N4OFBIZVJBNnFZUTVuSFNCdHdFbkJFNml5UkpraVNWYUFmdzRTaExid2tkWkY5MXNXVTBqNU9ad0Vvc2c1SWtTWkthenh1QkxJK1R1cnRaWnZBVndqeE96Z0orRFF3T25VV1NKRW1TcXV4VzRJSW9TM2VHRGdLQlZ3ZzdIaW14R011Z0pFbVNwTlp3THJBc2o1TkRRd2VCZ0N1RWVaeDhEMGhDelM5SmtpUkpBVzBFem9peTlOR1FJWUlVd2p4T3ZnOThKc1Rja2lSSmtsUW50Z0FMb2l4ZEdTcEF6YmVNV2dZbFNaSWtDWUFSd0YxNW5Kd1VLa0JOQzZGbFVKSWtTWkwyTWhTNEk0K1RCU0VtcjltV1VjdWdKRW1TSkhYcUZXQmhsS1YzMTNMU21xd1E1bkh5SFN5RGtpUkprdFNaZ2NDU1BFNU9ydVdrVlMrRWVaeDhIZmhTdGVlUkpFbVNwQVkzR0ZpY3g4bmNXazFZMVMyamVaeGNBUHlxbW5OSWtpUkpVcE41SHBnVlplbjZhazlVdFJYQ1BFNW1ZUm1VSkVtU3BFcTFBYmZXWXFLcUZNSThUa1lCdjYvRzJKSWtTWkxVQXFibmNmTExhazlTclJYQ1JjQ1lLbzB0U1pJa1NhM2d3anhPcnFqbUJLVmZRNWpIeVUrQmk4c2VWNUlrU1pKYTFNSW9TLzljallGTExZUjVuRndHL0tqTU1TVkpraVNweFcwRlRvaXl0TDNzZ1VzcmhCM1B5N2lyclBFa1NaSWtTZiszaHFJVTdpeHowRkt1SWN6alpDVHdtekxHa2lSSmtpVHQ1MmpnMnJJSExldW1NamNDSTBzYVM1SWtTWkswdncvbGNSS1hPV0NmdDR6bWNYSXBjRjBKV1NSSmtpUkpYZHNHSEIxbDZWTmxETmFuRmNJOFRvNEV2bDlHRUVtU0pFbFN0NFlDTjVRMVdGKzNqUDRjR0ZSR0VFbVNKRWxTanl6STQ2U1VSLzMxZXN0b0hpY1hBYjhvSTRRa1NaSWtxU0xQQVVkRldmcGlYd2JwMVFwaEhpZkRnR3Y2TXJFa1NaSWtxZGRHQXQvcDZ5QzlXaUhNNCtSSHdHVjluVnlTcENBR0RZVCsvV0JBUHhqUXYzamR2eCs4b1lmL1cveHZEcnQyd2E3L0ZNZHJ1MS92ZXYzblYvOWQzVCtESkVtRk9WR1czdC9iTHg5VTZSZnlPSm1HWlZDU1ZDOUdEWWRSYmNWNTVIQVkzUVlqaHhXbGIzZloyMzBlUExEMitWN1lCaS90Z0szYmkvTzI3YkJ0eDk2dmQ1KzN2bFQ3ZkpLa1J2Y0RZRjV2djF6eENtRWVKMHVCVTNvN29TUkpGUm5kVmhTKzBXMHdZaGdjMnZaNjhSdlZGanBkK1o1K0RqWnRobzJiWWVNenI3OSs1ZFhReVNSSjlldUNLRXR2N3MwWEt5cUVlWnljQy95dU54TkprdFNsbzQ2QUk4YkFoTEZ3K0dGdzJJaWlBS3F3YlR0czNnTFBiNFZuWHlpT3A1K0RwNTR0enBLa1Z2WmtsS1VUZXZQRlNndGhPekNwTnhOSmtnUVUyelluSHdHVHhyNWUvc2FQQ1oycXNiMzhDanoySkxSdmdNZWZoTWZYRndWU2t0Ukt2aGhsNmRXVmZxbkhoVENQazQ4QzExYzZnU1NweFkwZkEwZU5oeWtUaXZQWTBhRVR0WVl0VzZGOWZWRVExNnlGUjllRlRpUkpxcTRYZ1hGUmxsYjBMNEtWM0ZUbWE1WGxrU1Mxbkg0SHdkRVRZZHBrbURvUmpod0hBd2VFVHRXYVJod0NJNmJEbk9uRno2L3RLc3JoNnZhaUlLNVpDLzkrTFd4R1NWS1poZ0dmQTY2cTVFczlXaUhNNCtSVHdBOHJ6eVJKYW5wVEpzQ3hrMkhHRkRqMnlOQnBWSW4yRGZEd0UvRFFFMFZSdENCS1VxUGJUckZLMk9PSDFYZGJDUE00R1Fpc0IwYjFJWmdrcVZrTUhRSnpwOE9zWStDNEkxMEJiQ1lQUFFFUHJvRlZqOEhhVGFIVFNKSjY1OXRSbGw3WjB3LzNwQkIrRFBoeG55SkpraHJiaExGd3dqU1lmVXh4SGFDYTMvYWRzUEl4ZUdBMUxIK2srRm1TMUFpMkFXT2lMTzNSZjdoN2NnM2haL3VXUjVMVWtHWk1nZG5UNE0zSEZROTlWMnNaTWhqbXp5d09LTXJodlN0ZzJRclk4WExZYkpLa3Jnd0ZMZ2F1N2NtSHUxd2h6T05rSVhCYkNhRWtTZlZ1ME1CaUJmREVZNHZ0b0lNSGhrNmtlclY4RFN4N0VPNWJWVHp5UXBKVWI5cWpMTzNSaGYzZEZjTGZBKzhvSlpJa3FUNjk5UVE0NVFRNGZtcm9KR3BFeXgrQmUxYkFQY3VMTzVsS2t1ckYyVkdXTHVudVE1MFd3anhPeGdQcnlrd2tTYW9UUjR5QjAwK0N0ODR1dGdaS2ZmWHlxOFdXMHFYL0tPNVlLa2tLYlZHVXBlL3E3a05kRmNKdkFsOHBOWklrS1p4QkErRGsyYkJnTGt3ZUZ6cU5tdG16ejhPZEQ4QmY3NGZOVzBLbmthUldOanJLMG1lNytrQlhONVg1U01saEpFa2hIRE1KRnN5QitiT0tCOGRMMVRhcURkNjdzRGpXcklYYjc0T2w5NGRPSlVtdDZCTGc2cTQrY01BVndqeE96Z0Z1clVZaVNWSU5EQmtNcDgwcFZnUEhqZzZkUm9LWGRoUXJocmZkNDZxaEpOWE8yaWhMSjNYMWdjNEtZUWFjWDVWSWtxVHFtVEVGVHA4TDgyYUdUaUoxYnRWamNOc3l1RzlsNkNTUzFBcE9pckwwdnM1K3VkL2VvVHhPQmdIblZEV1NKS2s4aHd3cFZnUFBtQWVqMjBLbmtibzNmVXB4dkxBTmx2d05GdDhOTzMxOGhTUlZ5ZnVBbmhkQzRKM0FvS3JGa1NTVjQvaXBjT2I4NHNIeFVpTWFQaFRlLzNaNHp4bkZkdEpGZHhRM3BKRWtsZWxDNElyT2ZybmZsdEU4VG40RGRIdDdVa2xTSUhObkZIK0JuamcyZEJLcGZQZXVoRVYvZ2ZZTm9aTklVak9aSDJYcHNnUDlZcThWd2p4T2htQVpsS1Q2ZE9xSlJSRWNNeXAwRXFsNlRwcFJISSt1ZzkvZUFmYy9GRHFSSkRXRDg0SHVDeUh3dHFwSGtTUlY1clE1eGUzN3ZUNVFyV1RxQlBqOEpiQjJFOXk4QkI1NE9IUWlTV3BrWjlISnR0Rzl0b3ptY2ZJRDROTzFTQ1JKNnNiOG1jWDFWWWVOREoxRUNtL2RKcmpsVC9EM1ZhR1RTRktqT2pUSzBtZjJmWFBmRmNJemF4UkdrdFNaNDZmQ2hlZDRqYUMwcHdsajRYTWZodlZQd1MyM0ZkY2FTcElxY1RidzgzM2YvUDhLWVI0bmh3TmV3UzFKb1V3ZUJ4ODhENlpORHAxRXFuOVAvZ3R1dUJWV1BCbzZpU1ExaWw5R1dYclJ2bS91dVVLNG9JWmhKRW03alRnRUxqb1AzaklyZEJLcGNZeC9FMXo1Y1ZqZERqOWRWR3dwbFNSMTVXMEhlblBQRmNMcmdFdHJsVWFTV3Q2QS92RHUwK0hjVTZGL3Y5QnBwTVoyejROdzR4OWc4NWJRU1NTcG5vMkxzblRqbm0vc3VVSTR2OFpoSktsMW5UWUhQdkFPR0hadzZDUlNjNWcvc3ppVy9LMjRLK2xMTzBJbmtxUjZOQS9JOW56aklJQThUZzRHcG9kSUpFa3RaZXBFK09oN2l1MXVrc3AzMWx2ZzVObHc4Mkw0NDkyaDAwaFN2ZG12RVA0UEFBRC8vK3pkZVpEV0JSM0g4ZmZnN3JPN3JzdTUzSWdzS29pNGdBSUJuZ2loSmlLMzE3YklJUm9leUtIZ2JhUk9tcVUxbFhicTVKVE5PSlhaakRyWjZKU1Z4NlI1RkptWkhWWkRqam9lU0FRMlkzLzhXRndFWVlIbmViNi81L2Q3djJhZTJXY1AzUGNmak94bmY4ZlRkb1J3ZlBsYkpDbEh1bldHK2ROaHdxam9FaW43NnV0Z3djeGtISDd6QjdEMjVlZ2lTVXFMY1IvK1FOc2dIRkhtRUVuS2orbVRZTTZVNUpwQlNlWFRyeGRjZXo0OC9pemM5Uk40NCszb0lrbUtOdkxESCtpMDVhMm5pMHBTc1ExdGdsdFhRY3RVeDZBVWFjSW91UDBhbUQwbHVrU1NvdFcvUDNmRkFlMC8wSGFFMEVFb1NjWFNVQS96cHNGeFk2TkxKTFYzK2tsdzdCajR5dDN3MHQramF5UXBTak93OVgrQ2JVY0lqNGhwa2FTTStmaDQrTkpsamtFcHJmbzJ3ZzFMWWZFYzJMYzJ1a2FTSWh6Vy9wMnE5K2V1R0J4VklrbVowYThYTERrZGhnNktMcEhVRVZNbXdOakQ0TTRmSjljWVNsSitER24vVGhYUUZCUWlTZGt3WXhLY05UVzZRdEx1NnRvQXkxdmh1REh3OVh2Z3pYZWlpeVNwSEFhMWY2Y1REa0pKMmpQNzk0RWJsenNHcFVwM3hEQzRkVFVjT3pxNlJKTEtZVkQ3ZHp4Q0tFbDdZdmFVNUFZVmtySmgzMXE0OEN5WU1CSytkZys4L1c1MGtTU1Z5amI3cnhOd3dFZDhvU1Rwd3c3b0J6ZXZkQXhLV1RWNk9OeXlDc1o1QTNaSjJmWCszQldOYmMrcmdNYWRmSzBrcWMyY0UrQzBFNk1ySkpWYVF6MnNuQSsvZkJydXVCYzJiSXd1a3FSaWF3QmVoMlFRZG85dGthU1U2OTRsdWZIRVVNK3dsM0xsbU5Fd1lnaDg4YnV3OXMvUk5aSlVUQTF0VHpvQlBRSkRKQ25keGpYRHJhc2NnMUplZFdtQWE1ZkF0SW5SSlpKVVRQVnRUNnB3RUVyUzltcHJZTkdzNUhiMGt0UTZEWVlNZ3EvY0RaczJSOWRJMHQ3YTVnaGhsOEFRU1VxZnB2N3doVXNkZzVLMk5hNFpibG9PdmYxZHVxU0t0L1VJWWFmSUNrbEtuVGtud0Uwcm9HZTM2QkpKYWRTdkYzeHVKWXc5TExwRWt2WkdYZHNUQjZFa1FmSkQzczBydll1b3BGMnJxNEZMRjhBWm40Z3VrYVE5dFhVUVZrVldTRklxVEo4RUxWT2pLeVJWbWxrZmg0TUh3aTEzK2RJVWtpck52bTFQUEVJb0tiL3FhdUR5eFk1QlNYdXVlVWh5ZGtIVGdPZ1NTZG9kbmpJcUtlZjY5NGFiTDRIREQ0a3VrVlRwR3JzbE41dVpjbVIwaVNSMTFENXRUeHlFa3ZKbnpIQzRjUm4wNmg1ZElpbExGcytHWmExUVU0Z3VrYVFPOHhwQ1NmbHl3cEZ3enV6b0NrbFpkZVNvNVBUUno5MEIvM28xdWthU2Rza2poSkx5bzNXYVkxQlM2ZlZ0VEU0aFBmcUk2QkpKMmlVSG9hUjhXSEUyVEpzWVhTRXBMd3JWc0xRRnpwc2JYU0pKTytVZ2xKUnRoV3E0K2xNd2ZrUjBpYVE4bWp3ZVBuOUpjdFJRa2xMSVFTZ3B1Mm9LY09XNTBIeHdkSW1rUEJ2WUYyNWNBYU1QalM2UnBPMDRDQ1ZsVTMwZHJMa0FoZzJPTHBHazVIVlBWeStDVHh3ZFhTSkoyM0FRU3NxZWJwM2grcVV3MkJlS2xwUXlDMlo2WGFHa1ZIRVFTc3FXdm8zSkdPemZLN3BFa25aczhuaFlPVCs2UXBJQUI2R2tMQm5ZRno1ekVmVHNGbDBpU1RzM3JobFdMWXl1a0NRSG9hU01HTm9FMTEwRVhmYUxMcEdramhrejNGRW9LWnlEVUZMbEd6MGNycnN3dVdtREpGV1NNY05oNWRuUkZaSnl6RUVvcWJKTkhnK3IvUTI3cEFvMmJnUmN2amk2UWxKT09RZ2xWYTU1cDNxM1BrblpjUGdoeVV2bDFCU2lTeVRsaklOUVVtVmFQZzlPT1M2NlFwS0taOWhndUhZSjdGc2JYU0lwUnh5RWtpcExmUjFjZnhGTUdCbGRJa25GZDlCQXVQSmNqeFJLS2hzSG9hVEtVVjBGVjUwSFF3WkZsMGhTNlJ4OEFGd3lQN3BDVWs0NENDVlZqbFVMNGNEOW95c2txZlJHRHZYdW81TEt3a0VvcVRJc2EwMStRSktrdkJnM3dodG5TU281QjZHazlKczlCWTRjRlYwaFNlVTNlVHljZVhKMGhhUU1jeEJLU3JmbUlYRDZTZEVWa2hSbjVtUTQrWmpvQ2trWjVTQ1VsRjY5ZTNnTmpTUUJ6SjhCRThkR1YwaktJQWVocEhTcUtTUTNrZkgxdUNRcGNmNFp2dVNPcEtKekVFcEtwMHNYd1A1OW9pc2tLVjJXejRQUmgwWlhTTXFRcXVnQVNkck9vbGt3WWtoMFJUYTl2UjdlMlFCdnJZZDNOeVRQMTIrQTkwbGU1N0ZRblR6YVAyOTd2NmI5KzF2ZWVnUlhLci9WaTJETjdiRDJ6OUVsa2pMQVFTZ3BYVTQ2R2s0OEtyb2lPOTU1RjM3NkdEei9Jcno0dDlKOW41ckNsckZZdGYxby9LaVJ1YzJqYXZlK3Z0cC92cFJ6bDU4RGEyNkRsMTZKTHBGVTRmd1hWVko2akRvRUZzNk1yc2lHZGEvQkQzOEdqejVkbnUrM2FYUHlLTGU2Mm1STVZsVWxJN0g5bzJxZlpEeHUvVncxVk8vVDdua1ZkT29FdFlWMlg3UFBCNStycXRySmYzdkw1K284UXFvZ2hXcTQ0bHk0OXF2d3lycm9Ha2tWekVFb0tSMEc5SVlWODZJcnN1Rjc5OE45ajBSWGxNZkcvOExHNklndDZtby9lamhXdFJ1YU8veWE2aDBNMkowTTBSMk5YTWRwL3RUWHdkWG53VlZmaGxmZmlLNlJWS0VjaEpMaWRXMkFLOCtEMnByb2tzcTM1alpZKzNKMFJUNmxaWndXcXR1ZHdydmxlVTAxRkFvZlhBZmE5dm10Yjl0OS9xUCtiTnZYMVJTU2g5S2hTd05jc3dRdXV6VzVIbGlTZHBPRFVGS3NRblZ5TFV5UEx0RWxsZStHYnpnR0JadmZTeDZsMXFNcjlPa0JmUnBoUUova2xPLyt2VXIvZmJXOW50M2dpc1h3NmR0aVR0MldWTkVjaEpKaUxXdUZwZ0hSRlpYdjNvZmh1UmVqSzVRbmI3eVZQTnArQ2ZHZCs1SmhNbVo0Y25Pb3ZqMWorL0xtd1AyVDArNC8rNjNvRWtrVnh0Y2hsQlNuZFZyeXc2UDJ6ai8rRGQ5L0lMcENndGZlaEFkL0JSZmZDRis3SjduTHJjcm44R0hRY2twMGhhUUs0eUNVRkdQQ1NKZzJNYm9pRzc3OW8rZ0NhWHVQUEFrWDNBQVAvaks2SkYrbUh3L052bzZycEk1ekVFb3F2LzY5NGZ3em9pdXk0YS8vaEQ5NDNhQlNhdE5tdVBQSDhQVjdva3Z5NWVJVzZMeGZkSVdrQ3VFZ2xGUmV0VFZ3MlNMdlVsZ3NEL3dxdWtEYXRZZWZUSzR4VkhsMDNpOFpoWkxVQVE1Q1NlVjEwVm5RdTBkMFJUWnMyQWlQUFJOZElYWE0vWS9Dci8zN1dqYk5Rend0WDFLSE9BZ2xsYy8wNDJIc1lkRVYyZkhJay9EZS82SXJwSTY3NDk3a0Z4a3FqOVpwME5RL3VrSlN5amtJSlpYSHNNSGUvYTdZZnZGVWRJRzBlOVp2Z0I4OEZGMlJMeXZuUTExTmRJV2tGSE1RU2lxOTdsM2drdm5SRmRteTdqVjRaVjEwaGJUNzduOFUzbG9mWFpFZnZickR1WE9qS3lTbG1JTlFVdW10WGdnTjlkRVYyZkxZczlFRjBwNTc2TEhvZ253NTZuQ1lPRGE2UWxKS09RZ2xsZGJDbWRBMElMb2llNTU0THJwQTJuTS8vMDEwUWY0c21nVjlHNk1ySktXUWcxQlM2WXdjQ2ljZEhWMlJQVysrQTMvM2RGRlZzTmZmaEQvK05ib2lYMm9Lc0t3MXVrSlNDamtJSlpWR2ZSMWNjR1owUlRaNXVxaXk0SEgvSHBkZDB3Qm9tUnBkSVNsbEhJU1NTbVBKNmRDMUlib2ltNTc2ZlhTQnRQZWVmVEc2SUorbVQ0TGhCMFZYU0VvUkI2R2s0anRtTkh5c09ib2ltOTc5RDZ4OU9icEMybnZyWGt0ZWhrTGx0N1FsT1l0RGtuQVFTaXEySGwzaG5GblJGZG4xdURlVFVZYjg3cVhvZ256cTFoa3U5SlIrU1FrSG9hVGlXdG9DZGJYUkZkbjE1UFBSQlZMeC9NR2ozV0ZHRDRmSjQ2SXJKS1dBZzFCUzhVdzlGb1lOanE3SXJvMmI0UGsvUlZkSXhlUHB6N0htejREZVBhSXJKQVZ6RUVvcWpuNjk0T3pwMFJYWjVtc1BLbXYrOWFyWEVVYXFLY0NLZWRFVmtvSTVDQ1VWaHo5VWxONFRuaTZxRFBJb1lheW1BWENXTDBVaDVabURVTkxlbTNNQ0RPd2JYWkZ0R3pmQk15OUVWMGpGNTNXRThXWk1nb01HUmxkSUN1SWdsTFIzZW5hSDAwNk1yc2krcDlaR0YwaWw0U0JNaDZVdDBRV1NnamdJSmUwZGIxMWVIdDVkVkZuMXlqcXZJMHlEUG8zd3lWT2lLeVFGY0JCSzJuUEhqZld1b3VXdytUMTQ5by9SRlZMcHZQQ1g2QUlCbkhxOHA0NUtPZVFnbExSbkd1cGh3WXpvaW56NDdRdkpLSlN5eXRORzA4TlRSNlhjK1Q4QUFBRC8vK3pkNjFQVTF4M0g4VThiZGxkdUtvR0dJQ2dDWGhIaUJSVnZNV29TTlpta01YYVNkSkpPTzMzU2FmNk45bC9vMzlDbm5UN293M1F5VFkxM0RlVW1BU1hlNGlVWVNTRmN4SGI2NEVoQnJydkxzdDl6ZnIvM2E0WVpXSUY4TXJNenkyZlA5NXhESVFTUW5WKy9LeFZ4QVgxZU1DNktxT3RpaGRBYkwxZEl2M3pMT2dXQVBLSVFBc2pjMW5vM0xvcjh1TkpsblFCWVh0L2NkU2Zwd2crbjMzREZFRUFzVUFnQlpPN1RqNndUeE1mbEx2NVFSangwOVZrbndIUy8rOEE2QVlBOEtiQU9BQ0F3SDU3Z25lTjg4dWt5K2s4L2tvN3VmZjZ4c1hHM3YzSHlZK0xwODEvLy8yUDY0MCttdnA2WTUzdm5lcHhpSEcwZGZWTExOdXNVbU5TMFFkclRKRjNzc0U0Q1lKbFJDQUdrcitwbjdoSjY1TThsVC80WTI5czh1d3hLMG9xVSs4aW5tU1Ywd1NJNnM0eE96QzZpNHpOK2ZvSVNhcUtqMXpvQlp2cnRLUW9oRUFNVVFnRHArODE3MWduaXBhMUgrbkhVT29Xeng2T1ZHNHNTT2pxZTJXcG1XbVgwNmR5UHg3V0UzcnduRFk5SUpVWFdTVENwb2t4Ni8zWHBMNTlaSndHd2pDaUVBTkxUMkNEdDJtcWRJbDU4T2wyMGFhTjFBbHVGS2ZlUlQ2UGo4NHpWTGpKdUs3bC8rKzZ4ZExWYkdobkxiKzZsNk9pVDlyMWluUUxUblg1RCt2eWk5UGpmMWtrQUxCTUtJWUQwY09kZy9wMXZ0MDdncksrV3lsZGJwNGlmWEpUUTMvOGhzRUxZU3lIMFRTb3BmZktPOUtjL1d5Y0JzRXc0WlJUQTRnNjNTTFZyckZQRVM5ZDFhZWhINnhST2E3TjFBbVRqdThmUzl6OVlwOGhNSnllTmV1bHdpN1N1eWpvRmdHVkNJUVN3dUUvZXNVNFFQejZOaSs3ZmJwMEEyYmpneVFwekp1NCtsQWFIckZOZ0xyL2lkUUNJS2dvaGdJV2RPaWFWcmJST0VUOW4yNndUT05VdlNXdGVzazZCYklSWUNDVk9HL1hWamkxU2M4ejNFZ01SUlNFRU1ML2lRdWtYYjFxbmlKL2VtLzZza3JTeW55dEl3eU5TOXczckZObnBZR3pVVzV3MERVUVNoUkRBL0Q0NjZRNFVRSDc1ZEJrOWhUQk12cXd3WjRNVlFuK3RxNUwyNzdCT0FTREhLSVFBNWxaVklaMDhaSjBpbm56WlAxaFJKdFZWVzZkQU5ueDVEbVhqNGZmaEhZWVRKeCsvYlowQVFJNVJDQUhNN1dNT0VERFJmOWY5UWV3RERwTUowK2k0OUsrdnJWTXNUVnVQZFFMTXA3SmNPcmpUT2dXQUhLSVFBcGl0cHBLckJxejR0TExEZlhCaHV1RFJjeWhiN0NQMDI2blhyUk1BeUNFS0lZRFpQanhwblNDK3puNWxuY0JaWFNwdHJMVk9nV3ljQy9SMDBlbmFBMS9oakxyYUtuZnFLSUJJb0JBQ2VGNTFKU3REVnU0OGtPNE5XS2R3R0JjTjA1TUo2WEtuZFlxbEd4eVM3ajZ3VG9HRnZIZk1PZ0dBSEtFUUFuamVhVWFCelBnMExzcnBvbUc2RklFeU9JbXhVYjl0YTVBYTFscW5BSkFERkVJQVV5cktwRmRickZQRWx5L1hUWlFVU1kwTjFpbVFqZk1SR0JlZDFFa2g5TjdwTjZ3VEFNZ0JDaUdBS1Z4Q2IrZkJJK25tdDlZcEhFYUd3eFdGY2RGSm5kZXRFMkF4ZTVyY05nTUFRYU1RQW5ES1ZrcXZ0MXFuaUM5ZlZnY2x4a1ZEZGJIRDdTR01pcUVmcFZ2M3JGTmdNVDgvWXAwQXdCSlJDQUU0NzdOMzBKUXYrd2NMVTlMMnpkWXBrSTBMRVJvWG5jVFlxUCtPN3BWZVhHV2RBc0FTVUFnQlNLWEYwc2xEMWluaWEzQkk2cnRsbmNMWnkrcGdzS0pZQ0RsWUpnenZ2R2FkQU1BU1VBZ0JTS2M0UHR6VWw1N2NQU2hKKzVxdEV5QWJiVDNTNkxoMWl0enJ2bUdkQU9rNGZrQXFMclJPQVNCTEZFSWc3b29McFJNSHJWUEVteS9qb3NtRTFMTE5PZ1d5NGN0ektOZUdSNlQrdTlZcHNKaGtndGNSSUdBVVFpRHVqaDl3TCthd01Ueml6eXJJYnNwZ3NIdzZsQ2pYMkVjWWhuZVBXQ2NBa0NVS0lSQjN4M2xYMTlSWmo4WkZPVjAwVE4wMzNCc0xVVVVoREVOeG9mVG1BZXNVQUxKQUlRVGlyS1ZSS3VkME9GUG5QRGtJSkpsd3p3ZUVKOHFyZzVMVTVja0tPaGIzRm9lVEFTR2lFQUp4eHJ1NXRvWkhwUGF2clZNNDJ6Y3pPaHdxbjFhWmw4UG9tSFQ5dG5VS3BLT21VdHBTWjUwQ1FJWW9oRUJjbGErV2RtMjFUaEZ2Rnp1c0Uwelp4N2hva1BwdXVXdExvbzdySjhKeG5EY2FnZEJRQ0lHNDRrWGIzcmsyNndSVGRqZFpKMEEyem5zeWNyemMyRWNZamtPNzNOMjJBSUpCSVFUaTZzMzkxZ25pYlhSY3Vuck5Pb1d6YzR0VW1MSk9nV3o0OUtiQ2NycldiNTBBbVRqV2FwMEFRQVlvaEVBY0hkd3BsUlJacDRnM3I4WkZ0MXNuUURadTNwTWVQTEpPa1I5ajQxTFBOOVlwa0s0VFRLQUFJYUVRQW5IRXVLZzlueTRTcHhDRzZZSkh6NkY4WUd3MEhCVmxidklBUUJBb2hFRGNWSlpMVyt1dFU4VGJrd2wvVmdpYk56RXVHcXFvWHpjeEU0VXdMTWYyV1NjQWtDWUtJUkEzYngrMlRvQkxuZFlKcG5DNmFKZ0dIa3UzNzF1bnlDLzJFWWFsdGRsZFZnL0FleFJDSUU2U0Nlbm9IdXNVOE9rZ2tQMk1pd2JwaXl2V0NmSnY0cW5VelNYMVFYbTF4VG9CZ0RSUUNJRTQyZE1rcldBODBOeVZidXNFVG1NRGh3dUZ5cWMzRmZLSit3akRjb1EzSUlFUVVBaUJPRG0weXpvQnpyZTdQWVErWUZ3MFRBT1BwZjY3MWlsc3NJOHdMUFUxVWsybGRRb0FpNkFRQW5GUlhDaTFORnFuQUtlTFlxbk9mR1dkd0U3dlRUYzZpbkFjM1d1ZEFNQWlLSVJBWExCWHpBK1hQVGxRWnZONmFYV3BkUXBrSTY3am9wSXJnOXhIR0piRHU2MFRBRmdFaFJDSUN6YjMyN3ZjSlkyT1c2ZHdXaGtYRGRMZ2tIVDl0blVLVzR5TmhtVlZpYlNET3drQm4xRUlnVGdvWDhYZGd6N3c2ZDQ0OXBPRzZaOHhQRjEwSmc2V0NROFRLb0RYS0lSQUhCellhWjBBa25UQmswTFlzSlp4MFZENXRBZlZTazgvK3doRHMzdWJkUUlBQzZBUUFuSEFhcEM5dGg1L3hrVTVYVFJNZzBQc241dlVkZDA2QVRKUldpdzFiN1JPQVdBZUZFSWc2aXJMcGJwcTZ4VHdhVnowSUN2R1FUb2I0OE5rWm1JZllYall0d3g0aTBJSVJCMFhBL3ZCbDFHLzJqVlNSWmwxQ21RanpxZUx6a1FoREEvN0NBRnZVUWlCcUR2Q0hWRG1PdnVrNFJIckZBN2pvbUVhSHBHNmIxaW44RWZ2TFduTWt4RnNwS2UwV05wU1o1MEN3QndvaEVDVU5heDFKNHpDbGsvam9od3dGS1l2WTN3Wi9Yd295T0ZoYkJUd0VvVVFpREx1ZnZLREwrT2lOWlZTVllWMUNtU0RjZEhadUg0aVBJeU5BbDZpRUFKUlJpRzAxOVB2VG9mMHdUNytHQXZTOEFqbFp5N3NJd3pQaTZ1a2RWWFdLUURNUUNFRW9xcG9oYlI1dlhVSytEUXV5cmhXbUh4WllaYWtraUxwZytQV0tad2JkOWhIR0tLV1J1c0VBR2FnRUFKUnRYMnpkUUpJMHBtcjFnbWNxZ3FwbG5mbWcrVFRtd29uRGtydkhaTlNTZXNrVG51dmRRSmthaGVGRVBBTmhSQ0lLc1pGN2ZYZFlsd1VTek02THJYMVdLZVljbVNQbEV4SWpmWFdTUnpHUnNPemViMDdjUlNBTnlpRVFGUXhsbVBQcDFFL3hrWEQ1Tk56cUxaS3FpeDNuemR1c00weWlVSVlwbDFiclJNQW1JWkNDRVRSdWlwcFpZbDFDcHp4NUtxQWlqS3B2c1k2QmJMaDArbWkrM2RNZmI2dHdTN0hkRGZ2K1hQSEo5TEgyQ2pnRlFvaEVFV01pOXI3NXE0MDhOZzZoY05SNzJFYUc1ZXVkRnVubVBMYTdxblBONnlUVnFUc3NrekhLbUY0ZHZJYUJmaUVRZ2hFRVlYUW5rOEhnZkJ1ZkpndWRsZ25tTEsrV2lwZi9meGpXejNaUjhpVkhPRlprWkkyMWxxbkFQQU1oUkNJbWxSU2F2SmtmMCtjbmZWa1hGVHlaN3dQbWZIcFRZVzVWcGw5ZVY2eFFoaW1SaytlUHdCVVlCMEFRSTQxYmJST2dOdjNwWHNEMWltY2hyWFNvMEUzdnZxZi83ckhVa2wzVW1TaVFFb2twR1NCVkZBZ0ZYb3lBZ2czTHVyVEN1SGhsdG1QYmZQa2phYzdEOXcrd3BJaTZ5VElSR085OU5lL1c2Y0FJQW9oRUQydmJMSk9BSjlPaHJ4K1cvcjBqNW45VENyNXJDd1d6QzZPejMyZW1QRTl6NHBsS2pISDl6ejd2T0NGYWI5L3h1K2trRTY1MUdtZFlFcnRtdG5qb3BKN3M2RXc1YTdHc05iZXkxN1owR3p4Wk9RWUFJVVFpSndONjZ3VHdLZFJ2MnlNUDNFZlZoWXFwQVV2U01uay9JVjBWb0dkVVVnVEJlNzNweEx1OTZRU3o3NzI1S0wxU1orZHMwNHdaVy96L1AvVzJDQmQ3c3BmbHZsMDlGRUlRMU9Za3VwcXBQNDcxa21BMktNUUFsR3prVUpvYXVDeGRPdWVkWXF3V1JYU1dXVng4dk1aNVRHWm1MdFVUbjg4a1pCV1BQc2QwNzhua2NiTDd1Y1hwYzdyeS8vL202NTlDOXhoNlVzaFpCOWhtQnJyS1lTQUJ5aUVRSlN3T21qdml5dldDWkN0aWFmdVkzaVovenVwNU55RjhxYy9rUjc5SU4zM1pQK3BKRlZWU0d0Zm52L2ZmZGxIK08xRGFYQklXbDFxblFTWmFHeVEvdllQNnhSQTdGRUlnU2hoZGREZWhYYnJCUENkOVVodUpsb1hXQjJVcFBvYWQ0WEFtQWY3Q0R0NnBVTzdyRk1nRTF2cXJCTUFFTmRPQU5HeWdYdWRUQTBPdVVOY2dLaFlyQkJLL3F3UytqUm1pL1NVRmt0clhySk9BY1FlaFJDSUVsWUliWjI1YXAwQXlKMktNbmVTNkdLNGp4Qkx3ZXNXWUk1Q0NFUkY0UXJwNVFyckZQSG0wM1VUd0ZLMUxuQzY2SFMrckJEZUgzQ3I5QWdMZTk4QmN4UkNJQ28ycjdkT0VHL0RJOUsxZnVzVVFPNmtNeTRxU1hYVmJoK2hEOXEvdGs2QVRHMWlxd05nalVJSVJBVmpON2ErL01vNkFaQTdxMHN6Ty9DanlaTlZ3ZzdHUm9OVFYrT3ViQUZnaGtJSVJBVUh5dGhpWEJSUnNpZk5jZEZKdm95TnNvOHdUSFUxMWdtQVdLTVFBbEhCMkkyZDRSR3B2ZGM2QlpBNyt6SXRoSjRjTFBQd2UvWVJob2dKRjhBVWhSQ0lncktWVW5HaGRZcjR1dGhoblFESW5aSWlxWGxUWmorenZ0cjluQS9hcmxrblFLWW9oSUFwQ2lFUUJiVnJyQlBFMnpuR1JSRWh1N2RsOTNOYjYzT2JJMXNkM0VjWUhGN0RBRlAvQXdBQS8vL3MzZnRTVkZjV3gvRTFVV2toa2tFbFhCWERLRXE0S0JPakVsUHoxL3czVHpIdk1EV1BNVTgxbFhnYk5RYWFpeWhJRk5IWUJnd0VHcnAxNW85dHB4bGlsRzc2N0xYV09kOVBsVlZKcWZDenlyWjduYjMyV2hTRVFCcndacXBuYzB2azdyUjJDcUJ4OWpwZGREY3I5d2c1SWZTbnAwTWsxNlNkQXNnc0NrSWdEVDZqSUZUem43eDJBcUJ4bWc2SlhCeXE3L2RhdVVlNHVpYnkvS1YyQ3RUcVpKZDJBaUN6S0FpQk5PQ0VVQS9UUlpFbWwwYnEvNzJuZXV6Y0k1eWliZFFkM3NjQU5SU0VRQnFjNk5ST2tFM2JKWkh2YUU5RGlseXVjYnJvYmtOR1RnblpSK2dQblM2QUdncEN3THZUSjdVVFpOZnRxVkFVQW1sUmI3dG9oWlcyMFluNzJnbFFLMDRJQVRVVWhJQjN2SW5xb1YwVWFYSnBKTndoM0E4cmcyVlcxMFNXQzlvcFVJditYdTBFUUdaUkVBTGVVUkRxWWJvbzBxVGU2YUk3OVhVYnVrZEkyNmdydVNhUnp1UGFLWUJNb2lBRXZPdnIxazZRVGJmelllVUVrQmI3R1Npems1VzIwVHlEWmR6cDZkQk9BR1FTQlNIZ1hYZTdkb0pzWWhrOTBtUnNVS1E1MTVpdlphVnRkSEpPT3dGcXhmc1pvSUtDRVBEdTJCKzFFMlRUelFudEJFRGpYTm5uZE5HZHJCU0VxMnNpU3o5cXAwQXR1ai9WVGdCa0VnVWg0TmtwMmtWVjNKdWxYUlRwMG9qN2d4VW51N2hIaVBwMGNVSUlhS0FnQkR6cjRtbXFDdHBGa1NaRHB4dGZ3STBZT1NXYzVCNmhLNXdRQWlvb0NBSFBlSnFxNDlha2RnS2djUnA1T2xoaHBXMlVFMEpmT281cEp3QXlpWUlROEt5SHA2blI1UitLL0x5dW5RSm9uSzh1TlA1cldpa0lYNjJMUEg2bW5RSzFZUFVFRUIwRkllQVpUMVBqWXhrOTBtU2dUNlN0dGZGZjkwU25uWHVFZVU0SlhXRlFHaEFkQlNIZ1dmdFI3UVRaYy8yZWRnS2djWkpvRjYwWUhVanVhOWVDZllTK0hHL1RUZ0JrRGdVaDRCbXROWEhkZnhSRzJRTnBjWFVzdWE5dHBXMlVFMEpmam5OQ0NNUkdRUWg0eFp0bWZEZllQWWdVT2RXVGJKZkI4T25rdm5ZdDFqZEVGcGUxVTJDdmpuRkNDTVIyVURzQWdEcTFjMzh3dW11RzJrWC84ZmZxTXZHdGJaR25MMFEyaStIL3k2OUZ0a3UvL2JHMUxWSXF2L3ZuM3Zkam82ajJ4MFNDeGhOc0Z4VVI2WDE3ajNCOUk5bnZzeGY1Qit4dDlZS0huVUIwRklTQVZ4M2NINHhxNFlsSVlVVTdSVEIrdmxvTWlvamtta1Q2ZTVQL3ZzV3QzeWthNnlneTMvZWpVcmdpV1pkSFAveHI5dXY4V1pGdnYwdisrM3hJL29ISTMvNmluUUo3a2NTUUl3RHZSVUVJZUhXVXA2aFJXVnBHLzlkeG5lOTdPQmQreExSUkZDbVZRb0ZZS29maXMvUzJjQ3kvZnZ2ZlpaSHlqcDhybFVXSzJ5SnYzb1JmVi9tOWxaLzc5ZGZ2L0xueXJxOVZTbmRSMnQwdWNySXIrZTh6Zk5wR1FUZzlyNTBBZTlWNlJEc0JrRGtVaElCWGpPYU95OHAwMFkrYlJTNmMwMDRSVDh0aEVUbXNtMkd6K1AvRjVxL0Y2UWNLeXVKMitQMXYzb2o4OUVyaysxbVJsNjkwL3l3VjR3bnNIbnlYSVNPRFpkWTNSQmFXNHB5a1kzOCsrVmc3QVpBNUZJU0FWeFNFOFR4K0pySmMwRTRSWEJyUlRwQTl6WWRGbWh2d2RmNzVMenNGWVpMckpuYnE3UWd0Z0JhbTgrWWZVQkI2OEhFalhtd0Fhc0dVVWNDclk1OW9KOGdPUzh2b1kzMlFSMk50bDBRV24ycW5DTnFQaXZ6cFJMenZaMmI5QlBzSTNmaUV0bEVnSmdwQ3dLdFcybXFpc1ZJUU51ZEVMZzVwcDBBOXBnd1ZJMGxQRjkzTlRFSElQa0kzZUg4RG9xSWdCTHc2MHFLZElCdWV2N1N6dyt6TFllMEVxTmZkR2UwRVZWY2lUQmZkeWNvK3d1S1d5UHdUN1JUWWkxYmUzNENZS0FnQnIzaUNHb2VWWVRJaUlwZHBGM1hybW9GSm15TGhQdCs1L3JqZnMvdFRPNnNFSnVhMEUyQXZXcFFIU1FFWlEwRUllSlJyMGs2UUhWYldUVFFkaW4reWc4YVkrOEhHVUJXUk9Mc0gzMlZrUU9mNzdqWkYyNmdMelJTRVFFd1VoSUJIQnc5b0o4aUcxVFdSaDQrMVV3UmZmSzZkQVBXeWNnZFZSRzhva1pXMjBla0Y3UVRZQzA0SWdhZ29DQUdQS0FqaitPYXVkb0lxcG92NlpXRXh1MGk0ZHp5cWRGSm5aYkJNY1V0a2JsRTdCVDZFRTBJZ0tncEN3S01ERklSUldEclpZZitnVDQrV1JBb3IyaWtDemI5RFhlMTI3aEd5ZnNLKzVweDJBaUJUS0FnQmp3N3cwazNjNnBySWpKSDJzaStId3gxQytITmpRanRCbGZZcHM5YnA1RzZUREpZeHI0WGw5RUJNZktvRVBPS0VNSGszK1NDUEJyQXlwYlk1cDM4UDFVcmI2UFM4ZGdKOHlHRUdwd0V4VVJBQ0hsRVFKczlTdTZqV1pFanN6M0pCWk9sSDdSU0JoUjJXVmdyQ1VsbGs5cEYyQ3J3UGs3U0JxQ2dJQVk4Tzh0Sk4xUHFHblgxbFk0UGNwL0hxVzBORGljWXZhQ2NRNlR4dTV4N2hGUGNJVGFORkhvaUtUNVdBUng5eFFwaW9XNVBhQ2Fwb0YvWEwwZzVMSzBPSnpwL1ZUaEJNc28vUXRCd0ZJUkFUQlNIZ0VXc25rbVdwWFpSbDlENFZWa1FXbjJxbkNDNGFhQmV0c05JMk9zTTlRdE9hYUJrRllxSWdCRHc2ZEZBN1FYcHRib25jbWRaT0VZeWNDYnZqNE04M1JuWVBpb2lNR3pwbHRsSVFsc29pczBhbUNPTzNhQmtGb3FJZ0JEeGk3VVJ5N2t4cEo2aWlYZFF2SzZmTVRZZEVMZzVwcDZqcU9DYnk2VEh0RkFGdG8zYnhIZ2RFeFNzTzhJaVcwZVJZK1NBdkl2TDFuN1VUb0I2cmF5SVBmdEJPRVl3TjJqdHRHVHF0blNESVV4Q2FSVUVJUk1VckR2Q0l0UlBKc2RJdU90aFB1NmhYM3hwcUY3VjR5anhzcENCazlZUmRIL0h4RklpSlZ4emdFU2VFeWJnMUtiSmQwazRSV1B3Z2o3MnhkTXBzWWYvZ2JtT0QyZ21DVXBuMUUxWlJFQUpSOFlvRFBQb0RMOTFFM0RTMGJvSjJVWi9XTjBTbWpVeXcvT0p6bXpzczIxcnQzQ1BNVXhDYVJNc29FQld2T01DamNsazdRVHJkTkhLeWM2YlB6Z0p2MU9hYW9YWlJDOHZvZjgrSWtXbWozQ08wNmIvYUFZQnNvU0FFUENxLzFrNlFQdC9mRHlzbkxLQmQxSy9yRTlvSnFpei9QYkl5V0dadU1iU093cGJYdk1jQk1WRVFBaDd4WnRsNE53eDlrUDk2VERzQjZyRzVKVEp4WHp0RmNPR2N6WGJSaWd2bnRCTUVwYkxJL1VmYUtiQWI3M0ZBVkJTRWdFZWNFRGJlTFNNRjRXZTlJdTFIdFZPZ0h0ZnZhU2Vvc3JTTS9sM2FXa1U2ajJ1bkNOaEhhRS81alhZQ0lGTW9DQUdQZUhyYVdETUxZWGVjQlZkR3RST2dYcGFtaTFwdUY2MncwamJLcEZGNzN2QWVCOFJFUVFoNHhKMlh4ckwwUWY0cTAwVmQyaTdaMldFNWZNYkhEa3NyZzJXbTUvazMxUnE2WUlDb0tBZ0JqL2p3MGxoVzdnK2U2QlRwYnRkT2dYcmNNclN5eEhxN2FNWG9XZTBFVlRNTDJnbXdVOUhJZ0M4Z0l5Z0lBWStzTEU5UGc0VW5Jb1VWN1JTQmh6WS92TnQxUTZmTVh2NGV0YldLZEJsNUFNTDZDVnMyaXRvSmdFeWhJQVE4S201ckowZ1BLNmVESXJiM3h1SDl2cHZSVGhBTTl2dmFZVGxzNUI0aEJhRXR2MnhxSndBeWhZSVE4R2liZ3JCaHJCU0U3VWRGVG5WcnAwQTlia3lJYkJsNVRYbzVIYXdZTm5LUGNQWVJyZmlXY0VJSVJFVkJDSGhrWllHNmQ4c0ZrYVhuMmltQ3Erd2VkTXZTVUtLdm5RMGxHaG5RVGxERnRGRTdLQWlCcUNnSUFXU1hwYjF4M2s1MlVIVTdyNTBnT05QbnExMVVKT1MxTWtpSmd0QU9Xa2FCcUNnSUFhL1dON1FUK0dmbFpLZXRWV1NnVHpzRjZuRjMyczZKdlpmcG9ydFphUnRsUWIwZGE3OW9Kd0F5aFlJUThJb25xUHV6dWlZeS8wUTdSZkFWdzJUY3NqUmQxR3Zic1pXQ2NHNlJlNFJXdkZyVFRnQmtDZ1VoNEJVbmhQdnp6VjN0QkZXMGkvcGxaZjlnZjI4WVRPU1JsWUpRaEdtalZ2eThycDBBeUJRS1FzQXJDc0w5c2RJdWVxUkZaTWpJNkgzVVptTE96dXZRODBPRnRsYVJuZzd0RkFFRm9RMnZLQWlCbUNnSUFhK3NmQkQxNk5XYXlNeUNkb3JBOHdmNXJMUHlVRUZFNUN1bjdhSVZWazRKdVVkb3d5b3RvMEJNRklTQVZ4U0U5YnRwcE0xUFJPVEtxSFlDMU91bWtSMldKN3ZzVE9xc2w1VUY5UThmaXhTTkRBbktLZ2JLQU5GUkVBSmVVUkRXejhvSCtlYWN5TmlnZGdyVVkzYkJ6aW1HMSttaU81MC9xNTJnYW5wZU8wRzJjWDhRaUk2Q0VQREt5b2RSYnphS0l2ZG10Vk1FWDQ1b0owQzlMRTBYSFUvQmxOb2pMU0s5bmRvcEF0cEdkWEYvRUlpT2doRHc2dVdxZGdLZnJFeUZGRW5IeVU1VzNUQnl5dHpkSGxwRzA4QksyeWlEWlhRVmVHOERZcU1nQkx5aUlLeVBsWGJScGtPMGkzcjE4TEZJWVVVN1JaQ0cwOEVLSzRObDVwOXdqMUNUbGRjV2tDRVVoSUJYUEVXdDNYYkp6Z25oRjUrTEhEcW9uUUwxc1BKUVFTUmRwOHlqQTlvSnFqZ2wxRU5CQ0VSSFFRaDR4U1MyMnQyWjFrNVF4Ym9KdjY3ZjAwNFF0QjhWNlQraG5hSnhqclRZYVgvTlA5Uk9rRjA4N0FTaW95QUVQRnN1YUNmd3hkTGV1RXNNbEhIcDhUTTdyN3Vyem5jUHZzc1E5d2d6anhOQ0lEb0tRc0F6N2hIV3hzb0o0Y1doY0ljUS9saWFMcHJHVTJZcjl3Z1hsc0pFWXNUM2dvSVFpSTJDRVBCcytZVjJBai91VEl0c0d2bUFkNWxsOUc1WmFSZHRheFVaNk5OTzBYZ2pSZ3BDRVU0Sk5meXlLYksxclowQ3lCd0tRc0N6WjBaYTF6eXcxQzZhcHNtUVdWSllDUzJqRnFTeFhWUWszQ004MWFPZElwamlIbUYwdElzQ0tpZ0lBYzg0SWR3N0s5TkZSd2RFbW5QYUtWQ1BmOS9SVGxDVjVvY0tWazRKV1ZBZjMxUGUwd0FORklTQVoxYUdXMWlYZnlDeXZxR2RJa2pqdmErc3NITEszTllxTXRpdm5TSTVWdTRSTGo2MTgrOUdWaXc5MTA0QVpCSUZJZUFaYjU1N2M4UFEzcmkwdHZxbFhXRWxMQ3kzSU8wUEZheWNFSXJRTmhyYjBvL2FDWUJNb2lBRXZIdnhrM1lDKzZ3TUFqblhIKzVJd1o5clJ2NE9pYVIvS05IaG5KMzlpZ3lXaWVzSkR6a0JEZjhEQUFELy8remQyMVBWNXhYRzhhY05CNlhhYXFKUnFrWVJqVkcwSG1LTTFualI2VlV2Mm1udmU5SHBuOU4vSVRPOTdDU1RUQ1p0emswMEdoTVZQQWM1ZVVCVWlPSWhpQ0N3TjVycHhTc0Y1U0JzOXQ1ci9kNzMrNW5abzBFakQ1bU0vTlorMTNvWEJTR1FkYlNOenV6U2RlbitnSFdLNE0zSUgrUmo1dVdVZVZGTm1FT05uWmRUUXVZSXkrdmFEOVlKZ0NSUkVBSlp4OFV5TTJ0eU12Y2xTVy90c2s2QVF2UVBTQmU3ckZNRWIyeTFUbEFlWHVZSWI5eGlqckJjZXU5Wkp3Q1NSVUVJWkIyckoyYjIzVG5yQkVIZDZuQVpDTExIeS85RGtyUTM4dm5CTVZ2V1d5Y1l4eWxoZVRBL0NKaWhJQVN5anBtTDZWMjc2V2V2VlNvUDhqSHlNais0c0ZyYXVkazZSWGtzcUpicTExaW5DSmdqTEk5dUp6cytnUVJSRUFKWjE4WE14YlE4dFl2R3ZEY3VadjBEVXNkVjZ4VEI3a1RhUmNkNG1TT2tJQ3dQNWdjQk14U0VRTmIxRDRRWEptdHlzb3grOVFxcGRwbDFDaFRpR08yaVpyWTRLUWk3ZTZYK1Flc1U4ZXZzc1U0QUpJdUNFSWdCMzBnbnU5dm41eDNuMlBmR3hjeEx1MmhWWlRvWHlvenhja0lvU2EyY0VwWlVmcFM5dW9BaENrSWdCbDBVaEpONGVaQ1hXRGVSVmYwRFVydVhkdEVHNndUbFYxa2hiVnhyblNLNHdJTDZrdXJzdGs0QUpJMkNFSWpCVmI2WlR1SnBiOXk2VmRZcFVBaFg3YUtKenFCNk9TWGtoTEMwK0I0R21LSWdCR0p3bFJQQ3A5eDN0RGZPeXo0MXpOMEpKNWNTVlZWS3V4SzVYZlJaVytxdEV3UTl0OWxIV0VxTVBRQ21LQWlCR1BUZWszSjU2eFIrTkRwNWtKZWt6WTcycVdIMitnZWt0azdyRk1ITzEwSlJtQ0l2QmFFa25lK3dUaEN2emh2V0NZQ2tWVmdIQUZBa25kMFVIMk04RllUdmZSRm1QSmUvS1AxTTRjRis3RlZaK2ZRL1YxVk0rTFVKUDE5UWJmMVZwTWZWREdyQ2x4SlZWa2liNm55cy9taTVMTzNmYVowaVRqZllRUWhZb2lBRVl0SFZRMEVvU1ErSHBRdU81bjBlRGt1SFR4Ym56MXBRUGJsWW5GUklQbE5rUHZWN1ovdjdKbndzVlo3ZVZOaVQrS1ZFRGZWK0NrSVVYMGVYZFFJZ2VRbC90d2NpMDlFbC9lR0FkUXA3VFU0dWt5bUZrVng0bFZOMTFkUEY0ck9GWTBWRktEUXJLc0t2VFh4VlZJei9PMU8rS3FYS0Y1NzhXUEgwbjFWVklTMWNVTjZ2ZGN5ZFBxbkZ5YTJTcjI5SnQxMTBUTU1HNllPdnJGTklOKytHK2VRbGk2MlR4TVZMYXphUU1BcENJQlo4VXcyOFhBUVNpMXpleDN4cXpZSXBpc1luQlduRno2V3FxcG1MemVjVnBCVXZTTFhMcFh2M3BiZmZ0LzVxeDZXMmpINHFyOVZaSnhqWGZFazZzTXM2UlZ6YW5MejVBaVNNZ2hDSVJkOEQ2YzZQWVZZdFZmbFI2V3liZFFxVXd0Q0lkUUliZXlnSVZWa1IydUU5dk9uVmVwbUNzTmphSExRREE0bmpsbEVnSmw2V2FGczVlY0U2QVZBODJ6ZEpDN2xRU0pLZjlTMmU1cE5qY0xXNy9HM3dBQ2FoSUFSaWtucEJTTHNvWXBMcU12cXBlQ2tJZSsrRk9VSVVSNnVEVTE4QUZJUkFWRkl2Q00rMVd5Y0FpdWZOeEc4WG5haWgzcyt0dCtmNWU2Wm9QTFFCQTZBZ0JLSnk0NVkwbkdqN3pja0xQaTQvQVlwaDZ3WnBVWTExQ2w5ZVhXdWRJS0J0dEhoYXVWQUc4SUNDRUloTmE2SVBLN1NMSWlZcEw2T2ZqcGUyMGZNZDFnbmkwTjByRFE1WnB3QWdDa0lnUHFtMmpaN2lRaGxFWlA5TzZ3VCtlQ2tJN3crRVdVTE1EK3NtQURjb0NJSFllRm1vWFU3bjJ0TnRsVVY4TnErblhYUXFtOWY3bVNOc1NiUVRvNWk0VUFad2c0SVFpTTNsNjlLRFFlc1U1ZFhZYkowQUtCN2FSYWZuWlVrOUJlSDg4ZDhRY0lPQ0VJalJtY1NXc3pjeVA0aUkvSGFIZFFLL3R0UmJKd2lhTDFrbnlMYnVYdFozQUk1UUVBSXhPdE5xbmFCOFdxOXdNUUhpc2ZFVmFjbGk2eFIrYlhVMFIzanpqbldLN0RxZDBQY29JQU1vQ0lFWW5VMW9UeGJ0b29nSnkraG50cW5Penh3aDZ5Y0tkN3JGT2dHQUNTZ0lnUmpsOHVuTVp4dy9aNTBBS0o1OUZJVFB0WG05ZFlLQUhYcUZHUjVKOXpac3dDa0tRaUJXS2JUa1hMN09IQXJpVWJkYVdyYlVPb1YvWHRaUHBQS21XN0dkNG5RUThJYUNFSWhWQ2hmTDBDNkttT3psZHRGWjhUUkgyTk5yblNKN1RpWHdaaVdRTVJTRVFLeCt1QjMvOHVUdnpsb25BSXJud0M3ckJObXdjYTIwb05vNlJjQWM0ZHlkUzJqR0hjZ0lDa0lnWmpHMzV0eTRKZDN0czA0QkZNY3J0YlNMem9XWGZZUXNWNStiQzVmRERDRUFWeWdJZ1pnZGkvakNsUlBzSGtSRVdFWS9OMTdtQ0pzdldpZklGbTRYQlZ5aUlBUmlkdWxhdkpldXNJd2VNV0YrY0c0YW5DeW9IeHdLM1FxWW5hWUwxZ2tBVElHQ0VJamQwZFBXQ1lydmJwOTAvYVoxQ3FBNGFwZEphMVphcDhpV0RhOHdSNWcxUGJlbE96OWFwd0F3QlFwQ0lIYkh6MXNuS0Q0dWswRk05dTJ3VHBCTlc3enNJNlFnbkJYYVJRRzNLQWlCMkYyK0h0L2xLNnliUUV5WUh5eU1sem5DRmhiVXowcU1iMDRDa2FBZ0JGSVEwK1V5OXdkQ2tRdkVZTmxTcVc2VmRZcHM4bElRRGc1SjEzNndUdUZiejIzcHlnM3JGQUNtUVVFSXBDQ21kMmFQUjFUY0F2dHBGeTNZK3RYTUVXYkYxMDNXQ1FETWdJSVFTTUdWRy9HMGpkSXVpcGpRTGpvL1c1MmNFcmJTTmpxand5ZXRFd0NZQVFVaGtJcHZJN2lJNWNFZ0QxNkl4NUxGNGJaTUZNNUwyMmdMSjRUVE90OFIvdTRHNEJZRklaQ0tJeEc4UTh2cElHS3lmNmQxZ3V6enNvOXdhRVM2Mm0yZHdpZmFSUUgzS0FpQlZQVGNsanF1V3FlWW54TXNvMGRFV0VZL2YrdFdTWXRxckZNRXpCRk9sc3RMSjFsR0QzaEhRUWlrNUZDRzM2bDlPQ3cxWDdST0ViejBLNmwralZTN1BMVDlWVmRaSjBMV0xQMmx0S25PT2tVY3ZKd1MwczQrMmRFejB1Z2o2eFFBbnFQQ09nQ0FNanAyVHZyN1g3Slp3RFE2T2gzODZ4K25idmQ3T0J4YXg0YWZ2SVp5RTM0K0lnM25wTkZSS1RjcTVaKzhjdm54bjAvMXNhR1I4bjk5S0wwOTI2d1R4R1BMQmgvdDVPd2puSXpMWklCTW9DQUVVcExMUzkrZWtYNi8xenJKM0hscUYzMTl5OVFmLzhYQzhDcVZYRjU2L0pQMCtQSDRqNDhlU3ovOUZINTg5dU9qanlZWG1ST0wwZnlFd2pQM25BS1Z3clM0dUYyMGVMemNORHFTQ3pjNjE2K3hUdUxEN1IrbGkxM1dLUURNQWdVaGtKcURqZGtyQ0lkejBybDI2eFRCNncxMnU4ODhuT3lPNUNZWGxTUDU4ZUp6cGhQUDNET0Y2SFFucFErSHJiL0swbHBVNDZlSWljR2FsZUcvNmVDUWRaSncyeWdGWVhDbzBUb0JnRm1pSUFSU2MvbTYxTjByclY1aG5XVDJtaHkwZzQzWm0zaXIzNExxOGhYRXp4YVgvLy9uUjgvOFdqNTg3Tm5DY21MQjJkY3ZkVHE1QlpKMjBlTGJ0bEU2ZnQ0NlJXZ2IvZFB2ckZQNEVNUE4xa0FpS0FpQkZIMTFYUHJibjYxVHpONEpCdzk2WS9iUTZsYzIxVlhGT3hVOTFTTDk0NS9GK2JQbWkzYlI0bXZZNEtNZ2JPdTBUdUJENC9mU3ZYN3JGQUJtaVZ0R2dSUWRPV1dkWVBaR2N0THBWdXNVd2ZaTjBrS2pkbEhNVDNldmRZSmdZYlcwOHpYckZQSHhzcUIrSkJlNk1GTDM4VGZXQ1FETUFRVWhrS0tIdzlsWkZ1eHBoeFY3NDdLcitaSjFnbUQzVnVzRWNWcjFjbGdCNDBIcXQ0MTI5V1IvNXkyUUdBcENJRlgvT1d5ZFlIWTgzUzVLcTE4MkRlZjg3TERrVFlYUzJiclJPa0hRbXZpQytvK09XQ2NBTUVjVWhFQ3FlbnFsNzUwOEpFOG5QK3JuaExDaFB0eGtpT3p4TW9OYVZTbTl3UWxoeVhocEcyMUwrSFNzZjBBNmV0bzZCWUE1b2lBRVV2YXg4M2R5dlJTREVxZURXZWJsbEhtNi9aVW9EaStyUEVaeTBxVkU1d2cvLzg0NkFZQUNVQkFDS1R2WEhrNEt2Zkx5SUM5SmU3ZGJKMEFoaG5QUzJUYnJGQUZ2S3BUV2lwZjh6QkdtMmpiNkJRVWhrRVVVaEVEcXZKNFM1a2Y5UE1odld1Zm5RUk56NCttVWVYZURkWUw0YmQ5a25TQzRrR0JCZUtoUkdoeXlUZ0dnQUJTRVFPb09PdjBtZnFZdEZJVWVjTEtUWFY3bUIzYzNoQmxDbEphWE9jS09MdXNFNWNkbE1rQm1VUkFDa0Q3NzFqckJaRjRlNUNYcHJWM1dDVkNJL0doWVNPOEJieXFVeHc0bk94NUhjdEtsYTlZcHlxZjVrdS94QXdBem9pQUVJUDMzbUhXQ3ljNDRhUmV0WDBPN2FGWjVhaGZkczgwNlFScVdMSlplZnRFNlJaQlMyK2dubkE0Q1dVWkJDQ0JjRmY3cFVlc1U0NXFhd3p2c0huQ3lrMTFlVHBtM2I1SVdWbHVuU0llYmZZU0pMS2p2N3ZYekJoNkFnbEFRQWdqK2ZjZzZ3VGhQdDR1K3RkTTZBUXFSSDVYT3RsdW5DRmhHWDE1ZTVnaFRLUWpmK2N3NkFZQjVvaUFFRVBROThITmwrR2tuYzE5cmE2VmxTNjFUb0JDblc3bVVLRlhibkp3UWpqNlNMblpacHlpdDd0N1EwUUVnMHlnSUFZejc0Q3ZyQktFWUhLWmRGUFBrNVpTNW9WNWFWR09kSWkxTEZrdTF5NjFUQkMyUm54Syt5K2tnRUFNS1FnRGoraDVJWHg2M3plRGxRVjZpSU13eUw2Zk0vRDlrWTZ1VHR0R1dpQytXNmU2Vkdqa2RCR0pBUVFqZ2FSOGV0UDM4WHRxUGFwZEphMVphcDBBaG1wcjl0SXZ1M1c2ZElFMWU1Z2piT3EwVGxBNm5nMEEwS0FnQlBPMU9YMWhXYitGc3U1OTIwWDA3ckJPZ1VGNU9tVjlkeDhvU0s3OTUxVHBCTVBwSTZyaHFuYUw0T0IwRW9rSkJDR0N5RDc2MCtieGUxZ1JJdFBwbG1adDJVWFlQbWxsVUk2MWVZWjBpaUhHTzhOM1ByUk1BS0NJS1FnQ1RXWjBTZW1rWFhiWlVxbHRsblFLRjhIUXAwVDdhUlUxNWFSdU5yU0M4Y1V0cWRISUtENkFvS0FnQlRPMmR6MEs3VTdtYzc1QWVEcGZ2ODgyRUIvbnM4dEl1V3JlYWxTWFd2Q3lvYjQ5c2p2QzlMNndUQUNneUNrSUFVK3Nma0Q3NXBueWZ6OHVEdk1SRklGbm01WlNaWmZUMkd1cXRFd1NqajZUMlNPWUl1M3Q5L1YwTm9DZ29DQUZNNzhPRDVUdTE4ekkvdUdTeHRQRVY2eFFveFBrT1ArMmlCM1paSjhDaUdtbnRyNjFUQksyUnRJMHlPd2hFaVlJUXdQU0dSc3F6clA3Q1pVZnRvdHd1bWxsZVRpN1dyS1JkMUF2MkVSYlB4UzVtQjRGSVVSQUNtTmxIaDZWNy9hWDlIRjVPQnlWYS9iTE15OE1xTjlUNjRlVmltUmhhUnQ5KzN6b0JnQktoSUFUd2ZPK1VlQUd4bDMxV2kycWt6ZXV0VTZBUUxWZWt3U0hyRkFFRm9SOWVUZ2hISDJWN1NmM1hUZEsxbTlZcEFKUUlCU0dBNXp0eU1sdzFYZ3B0bmVFQ0d3OW9GODB1TDZlRHk1WkthMnV0VTJETWdtcHAvV3JyRkVGVzV3anpvOUsvUHJWT0FhQ0UvZ2NBQVAvLzdOMWRjMVhsR2NieGE0YnNoRVJ3eURTT3BCaGppR0F3cEJoOElWUTdQZWxCTzlPakhsZy9nNmM5NkFkb3B6T3RNN1d0MXRwMkNxMVNLVHFDUlFicldLVVdxNmk4cVVCQUlMd2xRaWlDTHlRN2U4ZEtEeDRpU1VoZ1oyV3RmZDlycmY5dkpwUEkzbG01R01QTXZ2YTZuK2VoRUFLb3pKcU55VnpYeXd0NVNlcmhJUEhVOGpKMmZIKzNkUUpNNW1Wc2RGOUsxeEUrKzdLZk4rMEFKSUpDQ0tBeSs0OG1NOXI1NXQ3NHJ4bkZEZlZTMTFMckZJamk4QW5wRXljdldGbUQ2bytYc2RFUGoxc25tTG5CajZYTjI2eFRBRWdZaFJCQTVmN3k5M2l2ZC9pa254Znk5M0YzTUxXODdDN2ExQ2kxdDFpbndHUmUxZ1dQZnBHK3NkRS92MkNkQUVBVlVBZ0JWTzdjaFhpUG9mQTBMc3BHSU9uMWxwTngwVlc4cWVEUzNEcHBTYXQxaWlCTngwOThjRmphZGNBNkJZQXFvQkFDbUpsTnIwb1hQb3ZuV2w3R1JldnJwSlhMckZNZ2ltTUQ0WTBLRDNoVHdTOHZZNk5wV2tmNGgrZXNFd0NvRWdvaGdKa3BsYVYxTDg3K09zZjYvYnlRdjd2VE9nR2k4bktYZWNGOHFhUE5PZ1dtNDJWam1kNitNRHJxM2RidFlmMGdnRnlnRUFLWXVlMjd3MFllcytGbDNaZkVuWjAwODFJSVdZUHFtNWQxaEpKMDZMaDFnbXNiS2tyUHZXeWRBa0FWVVFnQlJQUEVodGw5djVkeDBkcUMxTjFoblFKUm5ENG5EWnkxVGhId3BvSnZoUm8vZDNDOXJ5Tjhhbk1vaFFCeWcwSUlJSnFCUVdsOXhNT0tUNTcyTTQ3VTNSRktJZExuelQzV0NZSjVEVkxYRXVzVXVCNHZZNk9lQytHK0k5SzJkNnhUQUtneUNpR0E2RGE5S3ZYMXovejd2SXo1U2R6WlNiTWt6c1dNNHQ3bDFnbFFDUzhieXh3OEpwVkhyVk5jclZTV0huL0dPZ1VBQXhSQ0FMTVQ1UVhFdS92anp4RVZHOHFrMDdrTDB2RUI2eFFCaDlHblErZnRZWFRVZzBQSHJCTmNiYzBtNmZ5bjFpa0FHS0FRQXBpZC9rRnB3ejhxZi82RnoveThrRis1TEJ3NWdmVHhzaWxSZlozVXpaRWxxYkgwTnVzRXdYNW5COVF6S2dya0dvVVF3T3c5LzBybEpXK0hrMFBFSmNaRjA4ekwyUEU5M0dGT0ZTOWpvNTdXRVpiSzBtTi90VTRCd0JDRkVFQThmcnUrc3VlOXV5L1pIRFBSczhJNkFhTDQ1SE0vVy9mZng1c0txZUpsWTVsRHgwTVI4MkR0QzJGeUEwQnVVUWdCeE9QRTZldVBqaFpId21pU0IxMUxHQmROcTdlYzNHWG15SkwwNldqenM0N3dvSU4xaFB1T1NLKzliWjBDZ0RFS0lZRDRQUCtLZE9LajZSLzN0SmtNQjRtbmw1ZXg0KzVsSEZtU1JsNE9xVDlndkk2UVVWRUFsMUVJQWNUclYrdW1mOHpUdU9qOTNkWUpFTVhGWWFtM3p6cEZ3TzZpNmVSbGJOUjZXb0pSVVFDWFVRZ0J4R3RnVUhyNnhha2YyOU5iM1N6VHVhTXRIQ2FPOUhsenIzV0NLemgvTUoyOGJDeHorSVEwK29YTnoyWlVGTUE0RkVJQThYdnhYMWVmczdXNzE4OWh6TnpaU1M4djQ2SjNkekl1bWxaTFdxVzVUdFlQVzR5TkRvOXdBRDJBQ1NpRUFKTHgyRE1UZDlIemNreUF4TGhvV2wwY3RoK3pHOVBER3RSVTYyaXpUaEJZL0Q3L1poMEgwQU9ZZ0VJSUlCbG56MHRyTm9Xdnk2TitDdUhpVzZRRjg2MVRJQW92djBNU3gwMmtuWmQxaE5VK2ozREw2MkZhQXdER2NiTDNNb0JNMnZhTzFIaWpOUGh4R0ZQeWdNUG8wMnVIazBLNDRnNk9MRWs3TCtzSWo1eVVpcVhxL0Q0ZE9Tazl0VG41bndNZ2RTaUVBSksxOFovV0NTYjYxa3JyQklpaVdKTGVPMlNkSW1BTmF2cTF0NFIxaENNbDZ5VFN3YjV3aEVtU2lpWHAwYWVUL1JrQVVvdVJVUUQ1MGJKUWFtcTBUb0Vvdkd3bUkzR1hPU3M2MjYwVEJOVllSL2o0TTlKL3p5Zi9jd0NrRW9VUVFINXdaeWU5dkt3ZjdHem55SktzeU1zNndwZi80K3NNV0FEdVVBZ0I1QWNiZ2FSVHNlUm5JNHllRmRZSkVCY3ZoYkN2UDduUjFmNUI2VThiazdrMmdNeWdFQUxJaDZaR3FiWFpPZ1dpMk9ubzdnYmpvdG5SdHNqUDNkNGs3aEtXeXRJdjFzUi9YUUNaUXlFRWtBK2NQWmhlWG5ZWHZlTTJqaXpKbW1XTHJSTUVTYXdqZkdLRGRPWmMvTmNGa0RrVVFnRDVzSXFEeEZPcFBPcG4vUk4zQjdQSHk5am9nYVB4WHUrMXQ2VzM5c1o3VFFDWlJTRUVrSDBMNWt1MzMycWRBbEY0S1lPUzlBQkhsbVNPbDBKNGJDQytkWVJIVDBsUFBodlB0UURrQW9VUVFQWjk4eTdyQklqS3k3aG9ld3Zqb2xuVTJ1eG5IZUVIaDJkL2pZOC9sWDcyeDlsZkIwQ3VVQWdCWkIramZ1bFVIcFgyT05sZGxOK2g3UEp5bDNDMjZ3aUxJOUpQZnk5OVBoUlBIZ0M1UVNFRWtHM3pHdnhzSElHWjJkMGJTcUVIRDdBcFVXWXRkMUlJRDh5eUVQNThqVFF3R0U4V0FMbENJUVNRYmFzNU55NjFkcnhublNCb2JRN0hsaUNidk53aFBIRmF1amdjN1h0L3R5SCtqV2tBNUFhRkVFQzJNZXFYWGp2M1d5Y0krQjNLdGx0dTlyT09jSCtFVXJkNW03VHRuZml6QU1nTkNpR0FiR3RaYUowQVVieTd6OCs0S0lVdys3NngxRHBCTU5NRDZuY2RrTlp0U1NZTGdOeWdFQUxJdHNZYnJSTWdDaSs3aXpZMzhhWkNIbmdaRzUxSklUeDZTbnIwcWVTeUFNaU5HdXNBQUpDb0IzOGsxZGRKdDM1ZGFxaVRhZ3RTb1JBKzF4YWtRczJWcjJzTFVtM05kUjZmNHM4UnY1MU96aC9zWVExcUxualpXT2JVbWJDTzhIb2pyR1BIUzNpNWl3NGcxU2lFQUxLdldKSU9IVXYyWnpUTXZicHMxdFpjWFI2bmVuejhuMDhvb05OOFg4UGNaUDh1MXZZY0RQL1BQS0FRNWtQelRlR2N5VTgrdDA0U3ppTzgxbVpZcFRMSFN3Q0lGWVVRQU9Jd1BCSStxbW1zUUg3MVVaQUtjeTUvcnBGcWFrS3BIUCs1TVBsajhqVnFwdmpld3VYdm5YUDE4NU80US9yUzl2aXZHVVZUbzlTMnlEb0ZxbVg1RXVtTjNkWXB3dGpvdFFyaEkyczVYZ0pBckNpRUFKQlc1VkUvSTJOejY2WXVsb1dDVkRQblNubWRycVRPbVJPdTAzOUcybnZROXU4eWhpTkw4bVg1N1g0SzRYU2VmRlo2LzhQcVpRR1FDeFJDQU1Ec2paVENSNWIwc0x0b3J0elpicDBnR0RnNzlUckNUYTlLcjcxdGt3bEFwckhMS0FBQWt5MllMeTFwdFU2QmFsclk1R2RYNHNsM0FWOTZRMXEvMVNZTGdNeWpFQUlBTU5ucXU2d1R3SUtYNHlkNis2NTh2VzZMdEhhVFhSWUFtVWNoQkFCZ01zWkY4OG5MMk9pZTNyQkoxU05ycGMzYnJOTUF5RGpXRUFJQU1ONjhCbW5aWXVzVXNORHBwQkNlUFM4OS9KUHE3MXdNSUplNFF3Z0F3SGlNaStaWDgwMSsxaEZTQmdGVUNZVVFBSUR4ZXJxc0U4QVNkNGNCNUF5RkVBQ0FNZk1hcEs2bDFpbGd5Y3ZZS0FCVUNZVVFBSUF4OXk2M1RnQnJYamFXQVlBcW9SQUNBRENHM1VXeDZHWnAvZzNXS1FDZ2FpaUVBQUJJVW4yZDFMM01PZ1U4V083a1BFSUFxQUlLSVFBQWtuUlBwM1VDZU1IWUtJQWNvUkFDQUNCSlBTdXNFOEFMQ2lHQUhLRVFBZ0JRVzJCREdWelJzcEIxaEFCeWcwSUlBTUJLMWc1aUV1NFNBc2dKQ2lFQUFLdllYUlNUVUFnQjVBU0ZFQUFBeGtVeEdZVVFRRTVRQ0FFQStYYjNuV0VOSVRCZWF6UHJDQUhrQW9VUUFKQnZqSXRpT2gxdDFna0FJSEVVUWdCQXZsRUlNWjFPRHFnSGtIMFVRZ0JBZm5VdGxlcnJyRlBBcXpzWFd5Y0FnTVJSQ0FFQStkWFRaWjBBbnQyMmlEY01BR1FlaFJBQWtGK3I3N0pPQU84WUd3V1FjUlJDQUVBK2RiUko4eHFzVThBN2pwOEFrSEVVUWdCQVByR1pEQ3JSU1NFRWtHMFVRZ0JBUHQzZmJaMEFhZEIyQytzSUFXUWFoUkFBa0QvdExkS0MrZFlwa0JhTWpRTElNQW9oQUNCL0dCZkZUQ3h1c1U0QUFJbWhFQUlBOG1mMUN1c0VTSlBhR3VzRUFKQVlDaUVBSUY5YUZrbzNmODA2QmRMaTFCbHA2M2JyRkFDUUdON3lBb0JLZmYvYjBqMmQxMy9lLzc2VVJrcFNzU1FWUjZTTHc5S1hsNlo0NGlWcHBDeVZSOFBuVWtrcVhmN3ZxVnhTZUd6c09hV3lWQm9OUHdPVjYrSHVJQ3EwNDMzcGliK0ZmODhBa0ZFVVFnQ28xSmJYcGJwYTZZZmZ0VTR5dGFIaXhLSll2dnk1VkE1Zmo0d3ZrdU1lKzZxTWpvWVh2bU9QajVUQ1kwTkY2NzladkZaMVdTZUFkOE1qMHBxTjByOTNXU2NCZ01SUkNBRmdKcDUvUmRxNVgzcjRJYWx0a1hXYWlXNm9EeC9WVWg0Tkw1eUhpK0h6VUZINmJFaTZPQlMrdmlSSmw2UytmbW5YZ2VybHVwYW1SdW5XWnVzVThLeTNUL3IxT3VuOHA5WkpBS0FxS0lRQU1GTW5QcEorL0V2cEI5K1JIdnFlZFJvN3RZWHdjYjNqRzg1ZDhGTUlIK0RzUVV4ajlBdHAvZFl3Q1FBQU9mSi9BQUFBLy8vczNYdHNsZlVkeC9GUG9hVlFXb29VQVMwRnlsMVJtRVdLWStLbGM5NDJSWmRONXhLbmlaa3UyZjVZdG1VbUd2L2NYek16TS92RHVHV1M0YklJaXRzNkVCQnZMZmRicGJSaWdkcHlhVXZ2OTU2MkIzUi8vRFNnWEZ2TzgzeWY1enp2Vi9MTFNmbmpuQTlKRHp5ZjUvZDdmajhLSVFBTTE5ck43aG1qWHowbXpaNW1uU2E0ZXZxc0U1ekJjUk00bjJNTjBrdXJwTHBHNnlRQTREdDJHUVdBSzFIZkpEMzNaMmxWOFlVM2c0bTZzayt0RXpnVHIzSUgwZ05uZTJPRDlMc1hLWU1BSW9zWlFnQkloT0lQcGQwVjBpOS9JczNMdDA0VExEdjJXeWR3MkV3R1o5dGZKYjM2cHRUY1pwMEVBRXhSQ0FFZ1VVNjJTQy84UmJwOWlmVDRENlJ4bWRhSjdMVzBTelYxMWltY1Fnb2hKTFYyU0N2L0xlMDhZSjBFQUFLQlFnZ0FpZmJSYm1sUGhmVFkvZExkeTZ6VDJOb2VrTm5COFZuU2RUT3RVOERhZnorUTFteHl4Nm9BQUNSUkNBSEFHNzB4Nlc5dlNlL3RsSDd4WXlsL3FuVWlHenZLclJNNHpBNUdXOFVSOTMyc2I3Sk9BZ0NCUXlFRUFDL1ZuSkNlZlVuNjNqTHBwL2Y3ZTA2Z3RZNXU2ZkJSNnhRT3p3OUdVME96Mi9CcFQ2VjFFaVNMOUZGUzVoZ3BNMFBLR09OK0hwVW1wYVdlKzVwNm5zdnNubDdwMkVtcDhvai8yWUVMb0JBQ2dCL2UzZVkyVi9uUjNkSjl0MXFuOGNmMmo2MFRPSmtaMG8xenJWUEFUejE5MHB1YnBQV2wxa2tRTnFQU3BHblhTUG01MG94cnBkeko3bm53ekl4TG43azZGUHNPU2krL0x2WDFKKzQ5Z1dHaUVBS0FYN3A3cGRmZWx0YVhTRDk3VUZweWczVWlid1ZsdWVqTkM2d1R3RS9yU3FUVkc2VVlGOXE0aE5IcDB1dzhhV2JlbHdVd1Y4cWQ1TTluRjF6bi9oOTRaYlUvbndkY0JJVVFBUHpXMkNyOThUVjNQTVZURDd1TGtHVFQweWNkL013NmhjTmg5Tkd3bzF6NjUvL2M5d3M0bjFsNTB2ejhNd1Z3Nm1UYlBFVkxwVFVicGRaTzJ4eUlQQW9oQUZpcHFwRisveWRwK1dMM2ZHSE9lT3RFaVJPVTVhSmowcVhGMTF1bmdKZXFqMHQvWHlzZFBtYWRCRUUwYVlJN0NtaDVnVFJsb25XYWM4M01veERDSElVUUFLeVY3blhqL3VYU3c5K1ZzaFA0bklxVm9Dd1hMYUFNSnEybU51bGY2Nld0WmRaSkVEUVpvNlZiQzZUYkZrdHpaMWludWJoeFk2MFRBQlJDQUFpTTlhWFM1aDNTUGQrUkhpcVNza0o2b2REVEp4MDRiSjNDWWJsbzh1bU5TV3MzUzhVZldpZEIwT1JrU3cvY0tSVVZ1dWNEd3lCK3lqb0JRQ0VFZ0VBWmpMc0wzVTNiM0l6aGlpSjN0enRNZGxkWUozQkdwVWszemJkT2dVUVpHSFRmaTdXYlhTa0V2cEtmNjI2aUxWMG9qUmhobldabzRxZXRFd0FVUWdBSXBJRkI2ZTMzcEExYnBlL2Y1a1pZempEY0daRGxvb3ZtdVRQQ0VHN2R2ZEk3VzZSM1NpbUMrTHFjOGRLVEQ0WDduTkY0M0RvQlFDRUVnRUNMOWJ2ejFJby9sTzRzZE1Wd2NvNTFxZ3Niakx2enRZTGdGcGFMaGxwYnAvdTlmM2U3KzcwQ3ZwSTZVbnJnRHVtSGQ0WC9wZzlMUmhFQUZFSUFDSU9CUVduREZqZVdMcFFldkVPYU05MDYxYm5LQWxJR0plbm1KRC9uTVZtZGJKSCs4NzcwM2s3ckpBaWlHMlpMenp3UzdCdGpRM0dLUWdoN0ZFSUFDSnVkNVc3TW0rSHVraGNHYUxuVXJnUFdDWnliNXJzakp4QWVsZFhTK3BMZ1BJT0tZRWtkS1QyeHdtMjZsVXdHS1lTd1J5RUVnTENxcXBXcVZybzc1U3VLcE50dmx0S00vMWtQeW5MUlFwYUxoa0w4bExSbG4xc2FlcUxST2cyQ2FrSzI5T3hUYnZPWVpNTU1JUUtBUWdnQVlkZllLcjI2UmxwVkxOMnhSTHBubVhUdEpQOXpIRGdVbkUwL0Nsa3VHbWlkM1c2am1IZTN1MDFqZ0F0Wk1FdjZ6UlBoUFliblVuZytGZ0ZBSVFTQVpCSHJkenN4dmxNcTNUakhMYTN5Y3pucHJvQXM5VnN3SzNrdkhzTnVUNlZVdWxmYXZ0ODZDY0xndXBuU2MwL2JyM3p3MGltT25ZQzlKUDZHQVVDRUhUanN4bFhqcEx1WFNYZmRJbVZuZWZ1WlFUbHU0cFpGMWdsd3RxcGFWd0szbGdWbkJobkJOMmU2OU56UGs3c01Tc3dRSWhDUy9Gc0dBQkhYM2lXOXNjR041UVZ1U2VtTmN4UC9PZFhIcFk3dXhML3ZjQ3psK1VGekRjMVN5VjZwWkkvVTNHNmRCbUV6YzZyMHdqUGhQMUxpY2pCRGlBQ2dFQUpBVkpUdWN5TTdVN3Exd0kxWmVZbDU3NkRzTGpvL1h4cnY4VXdvenEralc5cjJzWnNOckQ1dW5RWmhsVFZXZXY1cGFYUkVkZ2xtaGhBQlFDRUVnS2pwN0pIV2xiZ3haYUowMjJKcCtlSXJPOWNyS004UHNselVYN0VCYVZlNXRLVk0ybDlsblFaaGw1SWkvZnJ4YUQwRHpDNmpDQUFLSVFCRTJja1dhZlZHTitiTmNPV3djS0diUlJ6S2U5UUY1TWdBbG90NkwzNUtLcStTUHRvajdmM0UvUXdrd29vNzNZWllVWEw2YytzRUFJVVFBUENscWxvMy92cVdsRDlWV255OUc1ZGFWcm96SU10RjUweVRjckt0VXlTbmxuYTNRK2plVDVnSmhEZG1UNU1ldmM4NmhiOEdCcTBUQUpJb2hBQ0E4Nms1NGNhYm02UnhtV2ZLNGNLNTV6N2JzNmZTSnVNM0xmSHhpSTBvT0hCWUtqc283VHNvMVRkWnAwRXlHNU11L2ZaSmFlUUk2eVQrWWtNWkJBU0ZFQUJ3Y1YwOTBnZTczSkNrUmZOY01TeTRYanJXSUZYVjJPYjd5bElLNFJWcGFaZktEN2xad1BKRHpGN0FQNC9lRjgzWmZUYVVRVUJRQ0FFQVE3Ty95bzFWeGRaSnpzaWRKRjF6dFhXS2NPbnBreXFPdUpuQWlrTlNRNHQxSWtSUmRwWjB6ekxyRkRiWVVBWUJRU0VFQUlSZkliT0RselF3S0gxYUkxVWNkaVh3c3hQV2lRRHAwWHVsa1NPdFU5Z1lwQkFpR0NpRUFJRHdveENlcTYxVHFxbHp4ZStUYXFueWlIVWk0T3NtVFpDS0NxMVQyR0dHRUFGQklRUUFoTnY0ckV2dmhKcnM2aHBkK2F1dC8vSzFUdXJ1dFU0RlhOd2o5MG9qSXJhUnpObVlJVVJBVUFnQkFPRzI1QWJyQlA0NTJlSkdmYk5VMStTSzM5RjZOcWRBK0dTTmxaWVhXS2V3eFF3aEFvSkNDQUFJdHhuWFdpZElyUG9tNldTcmUyMXFjd1d3b1ZscWJMVk9CaVJPVWFHVWttS2R3bGFjUW9oZ29CQUNBTUx0L1YxU1I0ODBicXcwWmFJYmszT3NVNTJydTFkcTY1TGFPOTN6ZlcyZFVudVgxTm9oZFhTN256dTZyVk1DL2loYWFwM0FYcHlaZlFRRGhSQUFFRzdWeDkzNHBzeU1NeU05VFVvZkphV2xTcW1wN3ZYc2tabzYvR2VaNG5FcE5pRDFEN2pYdnBqYjBUTTJjT2JQZTJOWDluY0Vrc21jNlJ3VEk3bWpYNEFBb0JBQ0FKSlRUeDhYWEVBUVJYbG4wYlBWMWxzbkFDUkpFZDdhQ1FBQUFMNUtTWkcrL1MzckZQWWFXNlVQZGxtbkFDUXhRd2dBQUFDL3pNaVZNa1picDdCMXRGNTZjYVhVMTIrZEJKQkVJUVFBQUlCZkZzMjFUdUM5NW5hcG84dHRHdFhSTFhYMVNGL0lIUTl6b2xIYVcybWRFUGdhQ2lFQUFBRDhzV2krZFlMRWErK1NkcFJMMno2V3FtcXMwd0JEUmlFRUFBQ0E5OUpIU1F0bVdhZEluSzFsMHVidFVtVzFkUkxnaWxBSUFRQUE0TDFrS1lOMVRkSXJxNWtOUk5LZ0VBSUFBTUI3aStaWko3Z3l2VEZwelVacHcxYnA4OCt0MHdBSlF5RUVBQUNBOStaTXQwNHdmTDB4NmZtWHBmb202eVJBd25FT0lRQUFBTHlYTjhVNndmREVUMGwvZUpVeWlLUkZJUVFBQUlDM2NzYTdUV1hDNk1XVjBwRmoxaWtBejFBSUFRQUE0SzFwMTFnbkdKNlBka3RsQjYxVEFKNmlFQUlBQU1CYllWd3VPakFvL2FQWU9nWGdPUW9oQUFBQXZKVTMyVHJCMEszWkpIWDNXcWNBUEVjaEJBQUFnTGNtNVZnbkdKckdWbWxkaVhVS3dCY1VRZ0FBQUhqcnFuSFdDWVptWFlsMCtyUjFDc0FYRkVJQUFBQjQ2K29KMWdtR1pzZCs2d1NBYnlpRUFBQUE4TTZZMGRMSUVGMXlWaCtYT3JxdFV3QytDZEczRXdBQUFLRVR0dVdpdXl1c0V3QytvaEFDQUFEQU8yRXJoSlhWMWdrQVgxRUlBUUFBNEoyd0ZjTGFPdXNFZ0s4b2hBQUFBUEJPbUFwaFU1czdrQjZJRUFvaEFBQUF2Sk14MmpyQjVUdGFiNTBBOEIyRkVBQUFBTjVKUzdWT2NQbU9OVmduQUh4SElRUUFBSUIzd2xRSWE1a2hSUFJRQ0FFQUFPQ2QxQkFWd3RZTzZ3U0E3eWlFQUFBQThFNllaZ2hqQTlZSkFOOVJDQUVBQU9DZE1CWEMvbjdyQklEdktJUUFBQUR3VHBpV2pESkRpQWlpRUFJQUFNQTdZWm9ocEJBaWdpaUVBQUFBOEU1S2luV0N5ek13S0gzeGhYVUt3SGNVUWdBQUFIZ29KQ1dybjlsQlJCT0ZFQUFBQUI0S3lRd2hFRkVVUWdBQUFBQ0lLQW9oQUFBQUFFUVVoUkFBQUFBQUlvcENDQUFBQUFBUlJTRUVBQUFBZ0lqNlB3QUFBUC8vN04xNWRGYlZ2Y2J4NzVzNWhDUmtnSVI1REdNUW1RVkJHUVFWUkJDbEttcHRyVmh0cmJhMnRhMnR0NzEyOFBaMjFkYmExdmJhcnJaV2E3RlNMYTFWRkZFcGdoUVJVUmtsRUVBbUlaQUFJUU5EN2grYmxFRWdlWlAzUGZ2c2M1N1BXbWNockJYMkF4N2VuTi9aZS8rMlF5ZUZpa2lEVWxNZ0pmblVLelVGRWhQZzhCR29QWHpxVlZOcmZsMmtYbW9LNU9kQWJqYmtaVU5PRnVTM01qL1BhQUdweCsrcjVKUHVzUlpwNW10UHY4ZnFmMTVUQ3djcVlXOEZsRldZSC9kV3dONXkyTEhIN3A5WC9DVW55OXgvK1RubXZtdDkvTDlidG9DMGxJOS94cVdtbUs4N1ZIM216N2Y5QjgwOVYxWnU3cms5NWVhKzI3M1A3cDlUUk1SSFZCQ0t1S1J6VzJpVGQrSmhxZjVCdlhXdStiR3BkdStEUGZ1T1A3Q1htMnRQT2V6Y0ExdDN4aTYvK0Vja0FvVjUwS1g5OGF1ZCtURW5xK20vWjNLU3VUTFNvL3U2M2Z1Z2RKdTVObTJEMHUzbWZwUmdLOHlIN2gxUFhOMDZuQ2p3b3RVaTdjU0xpY1k0ZXN6Y2IyczN3ZHFOc0dhVEtSNGxQckpiMms3UU9PbFIzRU1pQWFLQ1VNU1BDdk9ocUROMEtEaHh0VzBkdi9GYTU1anJUR3BxWWVPSDVrRjk0MWJ6c0w1bFIveXlTUHprNThESTgyRnczK1k5Zk1kYS9mMDN0UGpFcjFWV1FjbFdXTG5PWExybjNOZTlJL1RyQWYyTG9HZG51dy9maVFrbkN0SEpGNWxmMjdFSDFwZkM2aEpZdmxvRllxd1U5ekNmTnk1SVNZWUpJK0QxdDh3c3MwaElST3BtM0ZObk80Ukk2RVVpMEtzTERPNEhRL3BCK3phMkU1MWJWVFdzM2dpck5waXJkRHZVNmFQRWx6b1V3UER6WUZoLzZOcmVkcHFtSzZ1QWxXdmhuYlh3N25xelJGRDhMVC9IZko0Vjk0RGlvdWhtOFB5Z1pLdTUzMWFzTllWaW1FMGRCK09HUTl0ODIwbUNvYXdDM2wwSHY1bWpiUnRpMDMyUnZ6ejBJS2dnRkxGclVKOFREK3ZSTHJQems4b3FXTE1SbHErQ1JTdk1yS0xZazVzTlk0ZkJxRUgrZjduUVZFdFd3b0tsWnZaUS9HWEUrVEJ1R0F6b1pUdEo3RlJXd2VKMzRJVi93WWU3YktmeDFxZW13YVRSdGxNRTAvcFMrTllqdGxOSWVLa2dGTEdtYXdlNGFEQ01HZ2pabWJiVHhGNVZOU3hjRHZQZUNOK0RrMDFKaWViRnd0aGhjRjVQTStzY0JoL3RoVmZlTk1WaGhaYjRXZE02Qnk0WkFXT0dObThmcWd2V2JEU0Y0YkwzelY3RUlPdlREZjc3ODdaVEJOdnNGMkhPeTdaVFNEajlweURVSGtJUkwwUWladW5VdFBGUTFNbDJtdmhLVDROTEx6VFh1bEo0YVRHOHVWTExZdUlsSlJrbWpvU3BZNFA1Z3FFaGJYTGgra253aVV0aHdiL2gyVmZVa01aTDdkckFqSWxtYjJwWVhrTDA2V2F1ZmZ2TjU5djhKY0Y5R1hIRnhiWVRCTjlsbzFRUWluVXFDRVhpS1RIQkxOdWJPczdzNVFxYlhsM01kZE1VOHcxdi9wdHc5S2p0Vk1GUTMveGcycmh3Rm9LblMwdzBmeDlqaDhHclMrSFpCU29NNDZrdzN4VGhGdzRNVHlGNHVwd3N1UFl5bUg0SlBMOFFucDBQVlRXMlU4VldsM2EyRXdSZmRrdHpMKzNiYnp1SmhKZ0tRcEY0U0U2Q1N5NkFLOGFjdlh0bm1MVEtoTTlNTjIrYm41NEhpOTVXRTVxbVNrNDZQaU00enZ5OXlxbVNFbUhDU0JnNzNCU0djK2FiNDFRa05ncno0WnFKWnNsN1FvTHROUDZRbkdSZXpJd2RCck5mZ0ZlV0J1ZnpMVW1QaVo1SVNiYWRRRUpPLzlKRlltMVFINWcxd3h6cUxhY3F5SU12ekRRTkNoNmRyYU1Fb3RXbkc5dzVVeThaR3FPK01Cd3pEUDR5RCthK0JzY0N2dDhybnBJU1ljYWxjT1ZZcy9KQlBpNjdKZHcyQXk0ZkRiOS9EdDc3d0hZaUVaRkdVVUVvRWl2WkxlR1c2VEJpZ08way90ZTlJL3p3SHBqN0tqenprdllYTnFSRkd0dzgxY3hBU0hTU2syRG1aTE4wKzJkUDZpVkVVM1R2Q0hmZHFDTUhHcXRqSWR4L3UybXU5WnM1VUIyd1phUWlFamdxQ0VWaVlmeHd1SEdLMjBkSGVDMHhBYTRhYjVwUi9QTFBwbk9mZk55Z1BuREhkZWFGZ3pSZHA3Ym1KY1EvWGpQTGx2VVNvbUVweVhERFpOUDBJcXo3Qkp2am9zRm1WdjluVDVnR1d5SWlQcVdDVUtRNVVsUGdyaHRnYUxIdEpPNHF5RE50elJjc2hjZm42c0R4ZXBrWmNPdDBjNmFieEVaaWd0bDdPYWd2L09BeEtDdTNuY2kvQ3ZMZ0c3ZWFMcUxTZEsxejRJRTdUZmZidjh3TC9qRVZJdUlrYlFRUWFhcThWdkNEdTFVTXhzcTQ0ZkNqcjVnSDBiRHIyaDRldWxmRllMeDBMSVQvdlFmNmRyZWR4SjhHOURKL1B5b0dZeU1TTVoxSTc3OGQwbE50cHhFUitSZ1ZoQ0pOMGF1TGVXRHFXR2c3U2JDMHpvRUh2MmoyTElYVndEN3d2YnUwUkRUZU1qUE1BL3FsRjlwTzRpOVhUNEQ3WnBuelJDVzIrblkzLzdiVkhWaEVmRVlGb1VpMFJnK0M3MzdCUEZCSzdMVnNZWXJDd1gxdEovSGUxTEh3OWMrWVJpZ1NmNGtKNWppVU82NDFYVFREN2tzM21YUDF0Rjh3ZmpvV21yMnNlcGtvSWo2aWdsQWtHbU9Id1JkdXNKMGlITDcyR1JnOTJIWUs3OHk2R202NFFnL2pOb3dkQnY5MUI2U0ZkRGxmU2pKOCt3NHRVZlpLVHBhWktkU1NaUkh4Q1JXRUlvMTE4UkM0L1JPMlU0VExuZGZEQmVmWlRoRi90MXhsenN3VGUzcDNOVXRJdzFZVXBxZWFQM2UvSHJhVGhFdDZLbnpuYzlxRExpSytvSUpRcERIR1h3Q2Z1MDZ6TjE2TFJPQ0xOd1c3S0x4cGltbnJML1lWZFFwWFVaaVpZWmEvOStwaU8wbDRmZW1UMEwrbjdSUWlFbklxQ0VVYU1yUVlQanREeGFBdENRbW1LQnpTejNhUzJKc3hFYWFNc1oxQ1RoYVdvckIraHFwVFc5dEp3aTBwMGV3Yjd0UE5kaElSQ1RFVmhDTG4wckVRN3I3UmRncEpTSUF2M3d4Rm5XMG5pWjBwWTJER3BiWlR5SmtVZFlLdjNXTHV1eUJLVElCdnpGSmpFNzlJVGpLZFhZUDArU1lpVGdub2R6dVJHR2pad255VFRrbTJuVVFBRWhQaDNsdUNjUnpENEg1bXFhajRWNzhlTU9zYTJ5bmk0NjRielo1SjhZL1VGTGovczlDdGcrMGtJaEpDS2doRnppUVNNY1ZIWGl2YlNlUmsyUzNOLzVkRWg0OElLTXlIdTlXcDFnbmpod2Z2bk1LWmsySEVBTnNwNUV6U1V1R2J0MEcyemlrVUVXK3BJQlE1azA5ZXFUZm9mbFhVR1c2WlpqdEYweVFubWFXSVFkK2ZGaVNmbmhhY0RwekQrc08wY2JaVHlMbGtac0JYYmpiTGVrVkVQS0pQSEpIVDllc0JreSt5blVMT1pjSkljM2FjYTI3L0JMUXZzSjFDb3BHUUFQZCtHdHJrMms3U1BIblo4UG5yYmFlUXh1alYxY3praW9oNFJBV2h5TWtTRTNYV29DdHV2ZHF0SmIxRGkySDBZTnNwcENuUzArRExuM0szeVV3a1l2S25hMmJhR1ZQRzZJeENFZkdNbzkvZFJPSmt5c1ZRa0djN2hUUkdjcEk1ME4wRktjbkJiVkFTRmwzYnUzdEV5RFVUb0VjbjJ5a2tXcCs3RGpMU2JhY1FrUkJRUVNoU3IxVW1YRFBSZGdxSnh0QmlHTmpIZG9xR1hUL0ozRi9pdG1zdmc3YjV0bE5FcDBjbmZhNjVLaU1kYnA1cU80V0loSUFLUXBGNjExNnVJeVpjZE5zMVpyYlFyem9Xd3VXamJLZVFXRWhLaERzZDZoQ2JrQUIzM1dDV2pJcWJ4Z3lGWGwxc3B4Q1JnRk5CS0FLUWsyVys4WXA3OGxyQnhKRzJVNXhaSkdJYWViaTY5MHcrcnFpVGFXcmtnZ2tqekRFbjRyWTdyclYzMUU1VnRaMXh3K2JnSWRzSkpPVDBsQ0lDY09WWXRmbDIyWlZqemV5TjMxdzRVQWROQjlITVNmNWZUWkNlQnRkZGJqdUZ4RUs3Tm5EVmVEdGpiOTFwWjl3dzJiY2ZLcXRzcDVDUTB4T3dTRWE2ZVpNdTdzcko4dDh4RkpHSXZZYzRpYStNZFA4dkE1NCtYZzFKZ3VTcThYWWFucjI0eVBzeHcrYmxKYllUaUtnZ0ZHSFNSZjUvMnk4Tm16Yk9YM3VsQnZjMSt3Y2xtSzRjNjkvUGpad3N1T0ppMnlra2xwS1RUSE1xcjYwcWdXZGY4WDdjc0ZpMUFaNTV5WFlLRVh6Y2lVSEVBNUVJVE5Uc1lDQzB6b1hSZzJEaGN0dEpqQm5xN0Job21SbHd5UVh3ejMvWlR2SngweSt4dCtkTTRtZkVBSGg4THV5dDhIYmNwLzRKNzIrQWtRT2dUVzUwOTFhTE5PalNQbjdaNG1YN1IxQitJRDYvZHgyd3R4eldidExzb1BpR0NrSUp0ejdkSUR1Z3h3RlVWa0ZaT1pSVm1HOCs1UWZNdnFMMFZHaVJEaTFTVFV2NjlEVGJTV05uNGtoL0ZJVDlla0JYN1IwTXZLbmo0S1hGY09TbzdTUW5wS2FvUVZaUVJTTG1udnZkczk2UC9kNTZjelZGNTdid282L0VOazg4UGZ3RXZMSENkZ29SVDZrZ2xIQzdjS0R0QkxGUlZ3ZGJkc0thRWxoZFlwYjVIS2hzK09zU0VxQlBWeGphSDRiME0yOS9YZGF6aStrNldsWnVOOGQwN1IwTWhad3NHSDZldng0ZXh3MHpSYUVFMC9qaDhQU0xialVoMmJ6RHpJYjE3bW83U2NPcWF2ejE3MW5FSXlvSUpid1NFbURrK2JaVE5OL3lWZkQ0MzJISDd1aS85dGd4VXp5dUtvSGZQd2NEZXNIVkU5ejR4bjAyRncrQnY4NjNOMzVlSytqZjA5NzQ0cTJMQnZ2bkFUSVNNWHVpSmJoU2t1R3lVVERuWmR0Sm9sTlZZenRCNDlUVzJrNGdZb1VLUWdtdi9rVnVkK0hidEEzKzhEY3pJeGdySzllWnEwODMwOERBeGNKdzFDQzdCZUhvUWZiRzlzcW1EMkZubWRuTHRMZkN0RTNmZnhCYVpVSnU5b21yZlFHMGIyTTdiWHdON0FOWkxjMmYzN2JpSWp1ZEtMMXcrQWk4OXdHc0x6V3pZd2NQbVNzbDJkeHJPVm1RbHcxNU9WRGN3M2JhK0JvLzNMMkNVRVI4VFFXaGhOZWd2cllUTk4xTGkrRzNmelZMUmVOaHpVYjQ5aS9ncGludWRTdnNVQUNkMjhIbTdYYkdIekhBenJqeFZGbGxYaFNzV0FOdnIybmNjdVI2clhQTXY3WHplNXNIOVNBdVo3eHdJTHpnZytZeVFkdzcrTm95V1BJT3JGamIrSzlKU3pWTGVVY09NQVY3ME9UblFLOHVzSzdVZGhJUkNRZ1ZoQkpldmJ2WVRoQzl1anA0NGgvdzk5ZThHZXZ4dWJEdEk1aDF0VmxpNjRwUmcrd1VoSG10Z3RWTTVzaFIrTnNDTStONitFalRmby9kKzJEZUcrWktUelBIZzB3TzJGRXZGdzMyUjBFNHhPR1hYS2Q3ZVFrOHR3QjI3NDMrYTZ0cjRQVmw1c3BJTi9mYk5RSHIranR5b0FwQ0VZa1poNTd3UkdJb05jWE5CL2VmL3RHYll2QmtyN3dKUDNqTTJ6R2I2L3plZHNZZEZhRGxvaDlzaHEvK0dHYS8yUFJpOEhSVjFhYUYvZWUvRHd1V21qMnNRZEM5bzFteWFOUDV2WVBSTVhqemR2amlEK0d4WjVwV0RKNnVzZ3FlbmdkM1AyaFdQZ1RGeUFIK09uZFZSSnltZ2xEQ3FXY1gyd21pOTRlL3daS1Zkc1orZHozOCtBOTJ4bTZLVG9WMlpxQUdXaXBFWTIzdXEvQ3RSMkRicnZqOC9oVUg0RmRQbTJYSjBTdy85Yk8rM2UyT1A3eS8zZkdicTY0T25sOElYLytwT1FNdTFuYnNNZmZiTC84Y2pIc3VPelA0ZXlWRnhETXFDQ1djWEd1V3N2UTk4N0JrTmNPN1pyYklCWkVJOVBMNC8zRmlBaFIxOW5iTVdEdDJESDd4bEZtV0hLLzlxU2RiVndyM1BnUmJkOFovckhqcjI4M2UySkdJMlRQbnNpZWZOeSs5anNiNVRNZlhsc0hYZjJLV01ydHVaRUNPVFJJUjYxUVFTamk1VkJCdSt3aCsvaWZiS1l3NUw4T2l0MjJuYUp5ZUhoZG4zVHBBc3NQYnNxdHI0THUvaHRmZjhuYmNzbks0NzJGWTlyNjM0OGFhelJuQzNsMmhaUXQ3NHpmWDY4dk1yTFJYZHUrRCt4K0JYV1hlalJrUFFWbVJJQ0xXcVNDVWNPclUxbmFDeHZ2RlUxRGpvN09SZnZXME9XYkE3N3hlRnR6YjRneFJjMVhWd0RkL0JxczIyQm0vcGhaKzlEdFl2dHJPK0xIUXZzQWNQMkZEY1pHZGNXUGh2Zlh3Nk5QZWo3dTN3aXlMZHJrb3pNMDJIVWRGUkpwSkJhR0VUM0lTWkZ0NmNJdldPMnRod3hiYktVNVZlOWgwLy9PN3poNFgvUzdOT3AvdXQzUDhzV3p6NFNmTWpMaXJ1bHRxVk5XOW81MXhtNnVtRm43eVIzdk5oU29Pd0FPUHhxNXBrZzI5dXRoT0lDSUJvSUpRd3NlbGc1dWZmTjUyZ2pON2ViSC9ad2x6c3N5K1BxKzRXaEF1WHdVTGw5dE9ZVlRYd1AvOHh2em9vcmF0N1l4YjFNbk91TTMxM0FKenVMeE51L2VaNDNWYzVXS0ROQkh4SFJXRUVqNXRjbTBuYUp6U2JmWU9WMi9Ja2FQbTJBQS9pMFNnTU4rYnNYS3lJRFBEbTdGaWFmOUIrUGxUdGxPY2FsZVpPVjdGaTZZMnNXYWpJTXpMZHZQZXF6Z0kvM2pkZGdwajNodnd2cVhsMHMzbDlWNXBFUWtrRllRU1BxMGRLUWpmV21VN3dibjVQUjk0Tnh2czBxenp5V2JQTStlMCtjM2JhMkRSQ3RzcG90Zk9Ra0hZemRIbG9pOHQ5dGZlNkVlZTlGZWV4dXJXd2M0Uk95SVNLQ29JSlh4Y21TSDBlOEZWc3RYLzUzbXBJRHk3L1FmaFZSL1A4ajR6ejcxWlFoc3poSzd1SDF6b2NUZmJodXpiRDM5L3pYYUs2RVVpMEtIQWRnb1JjWndLUWdtZkxBZVdWKzNiRHhzL3RKMmlZVXZmczUzZzNBbzhXakxheHNHQzhJVkZadW12WCszWUEwdFcyazRSbmZ3Yzc0OGVhZC9HMi9GaW9XU3JQN3Q3emxzTVJ5MDF1R2tPVjE1eWlvaHZxU0NVOEVsSnNaMmdZU1ZiYlNkb25FMCtMMXE5NmlaYjZGaEJXSHNZWGx4a08wWEQ1aSt4blNCNnJiSzhIUyszbGJmanhZSmZ6ekt0T09EZmJPZmk0Z3NwRWZFVkZZUVNQcWtPRklSKzcrQlpyL3lBN1FUbmxwYnF6VGl1UFpETmY5T2Zld2RQdDNvakhLcTJuU0k2YVI1L3Z1Um1lenRlTEx6L2dlMEVaL2Y4UXRzSm9sZWdHVUlSYVI0VmhCSStxUTVzd0hlbUlQUjVUcThlemx0bGVqTk9yTHpoU01PV1k4ZmNPNnpleTRJd0VvRmNqMmNrbTZ1dXp0OW5UWlp1ZzlVbHRsTkV4N1VYVWlMaU95b0lKWHhjV0RMcVRFRjQwSGFDYy9OcWh0Q0ZXZWQ2aDQvQVJrZVdKQU1zOC9rKzFkTjVkYytCT2U0a0V2RnV2RmpZdWNmZmUxZkJ2YjJyMmtNb0lzMmtnbERDeDRVVzNhNGN6SDNRNTExR3ZTclV2RjRtMkJ3YnRyalZPR1BGV3Y4WEVDZno4dVZBam1Pemd3QmJkdHBPMExDMUcyMG5pRTZXUjN1bFJTU3dWQkJLK0xqd1F0MkZUcWd1OEtwUTgzSldxTG5XYnJLZElEbzF0V1pXeVJWZTNndkhIQ3JzNi9tOUVSV1lvclhLb2IyckxuMytpSWd2cVNDVThLazliRHRCd3pJZEtRaXJmRDZUbWVUQkVRQXV6RGlmekxYWkQ0Q0RoMnduYUR3djl5Z2ZjT2p2cGQ0YUIrNi91anBZVjJvN1JlTWw2bEZPUkpwSG55SVNQb2VQMkU3UU1GY0tRb0RkZTIwbk9Mc2R1K00vUnJwamIrZDNPRFRiVnMrRmpxajFFano4dHJwbkg3eTF5cnZ4bXV2TmQ5MG9DQUhXYjdhZElEb3RXOWhPSUNJT1UwRW80Vk5UYXp0Qnd6cTNzNTJnOGY3OXZ1MEVaL2R2RHhxU3VOUlFCdHdxcnVxNW1Oa3JQLytUMldmcFo4ZU93Vi9udzhOUDJFN1NlSzdOcEx2Mk9TUWl2dUxCZWlvUm4zRmhockIzVi9QRzE0V2xjck5maEdIRjBOcG5uZTQyYlBIbVRMRmt4NWFNSHZCNUk2QXpjV2svMTdFNmI4YzdWQTBQUG1aV0ZiVEo5VitEby8yVnNLdk1qYVg2Sjl2dXdlcUNXRkpCS0NMTm9JSlF3c2VWQjVNQnZkdzRMNjY2QnI3Nlk3aDVLaFQzc0Y4WTdpb3pNNE4vZnNHYjhWeG9VbFRQcGNMS1ZRbVdib2dEbFc0VyszNTF5TEYvSzY0dFhSY1JYMUZCS09Iandxd2J3S1RSYmhTRVlCNmVIcDF0TzRVZEhrOElOWXNyOTc3THRMdzFHS3ByVEhNWlY4NTVkSzI1bFlqNGl2WVFTdmlVbGR0TzBEaEZuYUZmRDlzcEpFajgzaFgyYkx4ZWh0a2NwZHR0SjVCWTBZeXJpSVNFQ2tJSkgxY0tRb0NaazJ3bmtJWTRNb0VBdURXYmViTHkvYllUTk02cUV0aitrZTBVRWl1VmppMGJGUkZwSWhXRUVqNWxGYllUTkY1Ulp4aC9nZTBVY2k1T0ZWbE9oVDNCaFFZZk8vZkFJMC9hVGlHeFZLa2wxaUlTRHRwREtPSGowZ3dod0szVFljTm0yTHpEZGhJUk81YStDNXUyUWRmMmRuTlUxNWhqYTZxUFgxWFZVSEhBTEJPZCs2b2JIWXlsOFZ4ZFlpMGlFaVVWaEJJK3U4cHNKNGhPWWlKOFl4WTg4Q3N0Ui9Namw1YU11aFgyVk4vN05keDFnK20rZXpaMWRhYUxjSFd0S2R6K1U3elZOUC9uS3ZaRVJDU2dWQkJLT08wcWc0STgyeWthTHpjYnZudW5lU2pldE0xMkdqbVpVNnN3blFwN3FnT1Y4UDMvTzNIZVhtSWkxTlNjbUsyck9WNjRpWWlJU0ZTMGgxRENxV1NyN1FUUnk4eUFCKzVVNTFHL2NXclN6YW13WjNhZzB2ejdYVjlxbGxIdktqUExObFVNaW9pSU5Ja0tRZ2tuRnd0Q2dOUVUrTlp0TUx5LzdTUWlJaUlpRWdBcUNDV2NObXl4bmFEcEVoUGhucHZWZlZSRVJFUkVtazBGb1lSVHlWYlRnTUpWa1FoOGRnWjg5ZE51N1lVVUVSRVJFVjlSUVNqaFZIc1lQdGhzTzBYekRTMkdoKzZGbVpQTmNsSVJFUkVSa1Npb0lKVHdXcmJLZG9MWVNFNkNhZVBna2Z2ZzRpRzIwNGlJaUlpSVEvNGZBQUQvLyt6ZGVYVFcxWjNIOFUvMmhKQ0VRRUlTQkFJb1JFQmxGMEYyZ1FwcUtkQ08wTnF4TGgyczFvWENhR2VzdG5ZNkhWeUdWcXUxdHRVemRYcEdaRlJHV3hXS2dLMkFvQUtWVmlrNnd5WmJXR1VKQWJJODg4Y2xsY3BpbnVUNVBkL25Qci8zNjV6ZlNYSTg1L0l4WWZsOWZ2Zis3cVVRSXJ6ZVNaSkMyS0JWbm5UTFZPbXh1NlZ4UTZUTURPdEVBQUFBU0hBVVFvVFh0a3IvRHFsdmpPTFcwblVUcFovZEsxMTl1WlNiWTUwSUFQeVNraUoxYW1lZEFnRGlnb1BwRVc1di8xbTZjcmgxaW1DMGJDRk5IaU5kTVV4YStLYjAwdXZ1dkRZQThGRjJsbHNpbjVrdVpXUzR6ek5PZko0ZXcrZmJ1UzNjOHZ1ODNOaU5DUUFKakVLSWNGdnlWdklXd2diWldkSlZJOXkxZUtYMDI5OUxXeXV0VXdHQVU5SkdLaTZVV2hkSWhmbFNxM3ozOGErZjU3bS94d0FBZ2FBUUl0dysyaW10MnlCMTcyS2RKRDVHRFhUWCsvOG52ZnFHMjFpbnZ0NDZGWUJrVjl4YTZsZ21sUlZKcFVXdUJEWjhCQUNZb2hBQzg1ZUdweEEyNkhHdXUvWitMUDF1dWZUYUN1bFFsWFVxQU1rZ0kxMDZyNlBVclZ6cWV1SXF6TGRPQlFBNEF3b2hzR0t0ZTdldUlNODZTZnkxYVNWTkhTOTljYXkwZkkzMDhodlNwbTNXcVFENHBrdDdxVjlQcVY4UDl6a0F3QnNVUWlBU2taNWJLTjB3eVRxSm5ZeDBhZmdBZDMyNFdYcDFxYlRpWGFtMnpqb1pnRVNVbWlyMTZDSU51TUJkUllYV2lRQUFUVVFoQkNTM0MrZjRvVkpac1hVU2V3MUx2SzZkNERhaCtkMXl0N1FVQURxV1NaKzdWQnJTUjhySnRrNERBSWdCQ2lFZ3VZMVZudjZOZE5mMTFra1NSMEZMYWVKbDBvU1IwcXIzcGZuTHBEOTlZSjBLUUx4bHBFdURlMHRqQmtuZE9sbW5BUURFR0lVUWFMRHFQV245SnFtaWszV1N4SkthK3NteXNCMjdwUVhMcENWdlM5VkhyWk1CQ0ZKSkcybnNZR25FQU03a0E0QWtSaUVFVHZiNHM5S0RNOXdUY1p5cXJGajYyaGZjUmpTTFYwb3ZMWkgySHJCT0JTQ1dpbHRMVThhNVphRXBLZFpwQUFBQjQ2NFhPTm4yWGRKVDg2UnBYN0pPa3RpeU1xVnhROTI3UkN2V1NpOHVsamF5T3luZ3RmeVcwdVF4Ym1sb2VwcDFHZ0JBbkZBSWdVOWJ0RUxxMzhOdG9ZNnpTMDExN3hZTjd1ME91Ly9ONjlMcWRXN25WZ0IreU1xVVBqOVN1bks0bEpObG5RWUFFR2NVUXVCMEhuMUdtbjBuaHlsSG8rR3creTA3cE9jWHVwbERpaUdRMkxwM2tXNi9SbXBkWUowRUFHQWsxVG9Ba0pDcXFxVWYva0txUG1hZHhEOGR5NlRwZnk4OU5OUE5IUElPRXBCNDB0S2thNjZVdm5jelpSQUFRbzVDQ0p6SjV1M1NEMy9PNGV4TjFhRlV1dU9yMHV4L2xJYjBwUmdDaWFLc1NMcC91bHNteXA5TEFBZzlDaUZ3TnVzM1NmLytIKzZjUWpUTk9TWFNiVjl4TTRZWGRyVk9BNFJibis3U0F6UGNURDRBQUtJUUFwOXQxZnZTVC83TE9vWC9PcFJLOTl3azNYVzltNkVBRUY4VFJrcmZ2c0Z0SWdNQXdBbHNLZ00weHJJMTBwNzkwcDNYYzBCemMvWHJLZlh1TGkxY0xzMWRJQjArWXAwSVNHNXBxZExOVTZXaGZhMlRBQUFTRURPRVFHT3QzeVRkT2R2dG9vbm1TVXVWTGg4aVBYYTNkTVV3NnpSQThzck5rYjUzQzJVUUFIQkdGRUlnR25zL2x1NStSRnF6empwSmNzakpscTZkSVAzcjdWSzd0dFpwZ09TU2t5VjkvNXRTUlNmckpBQ0FCRVloQktKMTdMZzA2MGxwM2lMckpNbWphMGZwd1JuU3hNdmM3Q0dBNWtsTGxmN3A2KzdkWFFBQXpvSTdMNkFwSWhIcG1WZWtIejB0MWRSYXAwa09HZW5TMVBIU3JPbFNlVHZyTklEZmJydEdPcit6ZFFvQWdBY29oRUJ6dlBtdTlKMUhwQU9IclpNa2ovSjIwcXc3cEV2N1dDY0IvRFJsbkRTb2wzVUtBSUFuS0lSQWMyM2NKbjNyQWJjVEtXSWpMVTI2L1JwM1l3dWc4WHBWU0pOR1c2Y0FBSGlFUWdqRXdxRXE2ZUZmUzdOK0tlMC9hSjBtZVV3YUxjMzRtbHRPQ3VEc2NyS2xXNzlzblFJQTRCa0tJUkJMcTlkSmQ4eVNGcTIwVHBJOEJsNG8vY3V0VWtHZWRSSWdzWDE5c3BUZjBqb0ZBTUF6RkVJZzFxcVBTVS9NbGI3N21MUjd2M1dhNU5DbHZmU0RXNlVDYm5hQjB4cHdnVFNFc3dZQkFOR2pFQUpCV2JkQm1uNi85UElmM0s2a2FKNlNOdEs5MzVEeWNxMlRBSWtsTjBlNmVZcDFDZ0NBcHlpRVFKQ08xMGkvZWxHYStaQmJUb3JtNlZBcTNYdVRPM0FiZ0RObG5DdUZBQUEwQVlVUWlJZVBkcm9OWis1NVZQcHdpM1VhdjVXM2svNzVINlNzVE9za2dMM0NmT215UzZ4VEFBQThSaUVFNG1uOVJ1bnVoNlVIbnBLMlZscW44VmRGSituYk4wcnBhZFpKQUZ0ZkdNV2ZBd0JBczFBSUFRdnZ2Q2ZOZUZENjZSeHBEeHZQTkVuUGM2VWJKMXVuQU96azVVcGpCbHVuQUFCNGprSUlXSWxFcE5mZmxtNzdOL2VlNGFFcTYwVCtHVFZRdXJTUGRRckF4cVRSekE0Q0FKcU4wNTRCYTdWMWJpZlNoVzlLSXkrV3hnMlIyclcxVHVXUG0vNU8ydkNSdEdPUGRSSWdmdkpiU21NR1dhZUlyNE9IcFkzYnBJTlY3dk8vWGxYU2tlclkvVHE1TGFUaC9kMVJIZ0FRQWhSQ0lGRWNyNUVXTEhOWHJ3cHAvRENwZDRXVWttS2RMTEZsWlVvenI1UHVtdTNLTlJBR2x3MlVNak9zVXdRbkVuR2JjYTNmS1AxbGsvdTRhMS84ZnYxMzNwT2UrQzVubndJSUJRb2hrSWplWGUrdWtqYlNGY09rRVFPa2JJNWFPS01PcGRLMUU2UW5YN0JPQXNUSDRON1dDWUpSVlMwdFd1RldUZXcvYUplanZsN2Fza082c0t0ZEJnQ0lFd29oa01ncTkwcFB6Wk9lZWNXOUwzZjVFRmNTY2FyUFhTb3QvNk8wYm9OMUVpQllwVVh1K0pWa3NtTzM5TW9iMHBLMzNHb0pBRURjVUFnQkgxUWZjMC9NWC82RDFLK0hOSGF3MUtlN2RhckVjOE1rYWVaRDFpbUFZQTN0YTUwZ2RtcHFwVG12U3IvOXZWc21DZ0NJT3dvaDRKdFY3N3VydUZBYVBjak5IUEtlaTlPeHpNMFVMbGhtblFRSXp0QisxZ2xpWThOVzZjZi9LZTFrUXlnQXNFUWhCSHkxZTc5YlNqcDNnWFRKUlc3V3NIc1g2MVQycG95VGxxNTI3eUlCeWFhOHpDMFo5Vmx0bmZUZkM2VC9XY3lzSUFBa0FBb2g0THU2T21uWkduZTFheXVOSHlvTjZ4ZmVUV2h5YzF3cFpJTVpKS1Blbmk4VnI2K1hIbmhLK3VOZnJKTUFBRTdnWUhvZ21XemZKZjN5ZVduYWZXNHptbTI3ckJQWkdEdFlhbDlpblFLSXZXN2wxZ21hNTdFNWxFRUFTREFVUWlBWlZSK1Q1aStWcHQ4di9lQUphYzI2Y0MzTlNrbVJKbzYyVGdIRTN2bWRyUk0wM1RPdlNHK3NzazRCQVBnVWxvd0N5Vzd0Qis0SzI1bUdsMXdrL2VJNTZlZ3g2eVJBYkpTMGtmSnlyVk0wemVLVjByeEYxaWtBQUtmQkRDRVFGZzFuR2s2N1QvclZpN2FIUHNkRFJybzBxSmQxQ2lCMktqcFpKMmlheXIzU3o1K3pUZ0VBT0FNS0lSQTJEV2NhVHJ0UGV2algwa2M3clJNRlozaC82d1JBN0hUclpKMmdhZWJPZDV2SkFBQVNFb1VRQ0xObGE5eEI3aysra0p6SE5QUTRWMnBUWUowQ2lBMGZad2kzN1pLV3JyRk9BUUE0Q3dvaEVIYVJpRHZJL2ZaWjB1dHZKOS9tTTZNR1dpY0FtaThsUldwZmFwMGllbk5lVGI2L1V3QWd5VkFJQVRnSEQwcy9uU1BkL1lpMGVZZDFtdGdaeHJKUkpJSENmQ25OczMreWp4eVYzdnFUZFFvQXdHZGdsMUVBZit0L3QwaDN6WmFtZlVrYWViRjFtdVlyYVNPVkZVczdkZ2N6dmxlVEgxNkZQYjNzTE9tY3RsSm1obnN2cmI1ZXFqdHhuZkoxblZRZk9mRjEzWW4vSHBHT0hiZit2NGhlY2FGMWd1aXRlby9aUVFEd0FJVVF3S25xNjZYSG41VjI3cEdtakhQTDFYeldwWDF3aFJEeE0yR1U5SlVyWWo5dVRhMHJqS2N0bFdmNnVrNnFyWk1PVlVtYnRrc3ZMWEhqQktYSXcwSzRlcDExQWdCQUkxQUlBWnpadkVXdUZIN3p5KzRZQjE5MWFlODIwSUcvcmhvUlRCbVUzTy90NXZ6K0huaVJOTFN2OVAyZlNmc094QzdYeVh5YklZeEVwRFVVUWdEd2dXY3ZKQUNJdXpmZmxlNTdYRHA4eERwSjAzVnViNTBBelZGVTZHYXFFMW03dHRJM3JnNXVmTjhLNFFlYjNUdUVBSUNFUnlFRThOaysyQ1RkODZpZjcxNUpVdWR6Z2h2YnE5VzBYb1g5UlArZWZzeFE5NnFRT2dTMEU2aHZTMGFaSFFRQWIxQUlBVFRPdGtycFIwLzd1VWxFYm83VXRuVXdZM3YxN2ZBcTdDZktpcTBUTkY2WGdHYWo4MXNHTTI1UXRpVFJUc1VBa09Rb2hBQWFiL1U2YWU0QzZ4Uk5FOVN5VVo4bTNUSXpyQk0wVGFwSDMrU2d2c2RabWNHTUd4U2ZsNWdEUU1oUUNBRkU1NFhYcEsyVjFpbWlWOUxHT29HOWxpMnNFNkNwc2p3cjg4bFFDTlBUckJNQVFGeFFDQUZFSnhLUm5wMXZuU0o2dVRuV0NleFJDUDJWbldXZElEcFYxZFlKbXE5Vm5uVUNBSWdMRDk3U0IyS3NNTjl0WWQrK3hIWUpYU1FpN2ZuWUhkNjhZcTFkanFaWXVWYmF2RjBxYjJlZHBQRnlBcnFocnEwTFp0d2dwS1JJT2RsU3RXZTdQL3EyWERJSXZuMFBEbFZaSjJnK0NpR0FrS0FRSWx3NmxFcmZtZVpLWWFJWTN0L051RDIvMERwSmRGNWJJZDB3eVRwRjR3VTFRK2pienFzdGMvd3JoQVhjbUh2MS9tZE5yVjhQU2s0bkk5MDlQQUdBRUdESktNSWpMVldhZVYxaWxjRUdWMTh1OVR6UE9rVjAvdnloZFlMb0JMVmM4bmhOTU9NR3hhY2RPeHUwOG15SHpWanpiWFl3UGMzTlJ2dXNWUUwrT3dFQUFhRVFJanlHOXBQS2lxeFRuTm5VQkQ5NCs5TzI3WkwySGJCTzBYaEJQZTMzN1YycHJ1WFdDYUxuMHd4aEVETmoyWjRWd3BRVXFZWG5zMnRoZndnQklGUW9oQWlQUkw4Ujd0YkpPa0gwTm0rM1R0QjRRVzRxVTFjZjNOaXhWdEhKT2tIMEVuRlcvMHlDbURIMmNiZEwzemR4Q3VxWUdnQklRQlJDaEljUFQ2eDl1NGs2Y05nNlFlTUZ1Y09tVDh0R2ZTdUU1V1YrTFQ4OEdzQTdwVFVldm8vbis0NjIvWHBZSndDQXVLRVFJandpRWVzRXllZkFJZXNFalJka3FUanUwY1l5T2RuU09TWFdLUnF2cjJjMzVrZVB4WDdNR284ZU9EVEk5YmdRcHFkSkYzYXpUZ0VBY1VNaFJIajQwQWQ5ZTZwKzBLT3Q1YXNEdUZGdjROTk1xU1JkZklGMWdzYnIzOU02UVhTQ0tJUSt6VUEzYU9maDVrVU5lbFg0dVV3WEFKcUlRb2p3OE9HbXFuV0JkWUxvK0hUVEZPUXMzcTU5d1kwZGhER0QvRmlHbVpjcm5kZlJPa1YwZ2ppR3hLZDNWQnY0dGpUNVpMN05TZ05BTTFFSUVSNUJQTG1QTmQrMk92ZnA0T1lnZi82VmU0TWJPd2hGaFg3TXZQbFNYRThXMUd5eGIrZGRWblMyVHRBMHVUblNrRDdXS1FBZ3JpaUVDQThmYnFoYWUxWUlmVG9PSUlqTlBocnM4cXdRU3RMWXdkWUp6cTVGdHZUNWtkWXBvbE5US3gwS2FCbTFEeXNjVGxaYzZOK0tCMG1hTW80RDZRR0VEb1VRNGVIRERLRnZ5K01LUERxcks4aWZ2MjlMUmlYcG9tNVNhUUtmeTNuVkNEOTJCajdaMXNyZ3hqNWVHOXpZUWZGdGxyQzB5TTFLQTBESVVBZ1JIa0hPRU1YS2dBdjhlUzh2SmNXdnM3bytEbkJIVk4rV2pFcnU1M2ZkUk9zVXA5Y2lXN3B5dUhXSzZBVTVVMXgxSkxpeGcrTGIwc3V2WGlXbGNsc0VJSHo0bXcvaDRjTVJDWmtaL3B4LzFhM2NyeG1jblh1Q0czdkhIcW5PdzdQaStwd3ZEZTFybmVKVXQweVZzakt0VTBRdnlBY0QrdzRFTjNaUSt2ZVV5anpaYmJScnVYc2dCd0FoUkNGRWVBUlpDR0xwa2w3V0NSckh0NTM0ZHV3T2J1eTZPdW5ETGNHTkg2UWJKeWZXMHQvSlkveTlNYThNY09td2o0VXdKVVg2NGhqckZKK3R1TFgwcld1dFV3Q0FtZjhIQUFELy8remRlWFJXOVozSDhVOEVRbGpDdnNoVzlyS1ZzdFVGbDlLT1cyM3R0SjFST3g1bkhHZkdNMVB0ekJ5TFUxdWNhY2Z4ZE1iQk9sU3dWbXVWVm90WVYwUkIxQUZaWmQ5Q1dBTlpNSUVReUFJaFpFK2UrZVByTTFDV2tKRG4zdCs5ejMyL3pya25oM0M0dnkvSjh5VDM4MXNKaElpT1EwZGRWOUE4VjM5UjZ0L0hkUlVYRjdaQWVNVGphWjFaZWQ3ZTN5c2QwcVFIN25KZGhaazBXcnJ6RnRkVlhMcThROTdkdTZ6Y3UzdDc2YnJKRnJpQ3FuY1A2YkYvbEhxR2NBTWNBRWdRQWlHaW83WXVIQWVJdDJrajNmOWQxMVUwYmVSZ2FYQS8xMVcwak5janhQdnl2TDIvbHlhTnRwRkNsNFlPdEZHYXNCMHpFVmRUSyswLzZOMzl3emhDS05uMzg0SHZCdlA3U2hnRUFFa0VRa1JOV0thTmpob2lYVC9GZFJVWDVqbzh0TlN4VXFuUjQ4Tzk5K1o2ZTMrdjNYeU45RTkzdTNsd256UkdldXo3NFZ3M0dPZjFsT0dTNDk3ZTMwdmpSa2gvZHFQckt2NVk3eDdTby9jVEJnRkFCRUpFVFZnQ29XU2hhM0IvMTFXYzYvb3AwdEFCcnF0b21ld0M3OXM0ZVNxY3gwK2M2ZnJKMG9OL0piWHg4VmZEdDc0cS9manZ3aDBHSldsUGpyZjNMd3ZCcGxoTnVmTVdDNFpCTU8wSzZjbUhnajJWRlFCOFJDQkV0T1Q0RUF3U3BVTjc2YWZmQzlZdWZaZjNrdjQyb0VjVk5DVnp2ei90Wk96MXB4MHZUWjBnUGY2Z05NVGowRCtnai9Ub0E5TGR0d1Z6T21GTDdjbjI5djZIUTdJRytrSlNVcVRwOTBoamhybXJJYjJUOU5DOTB2Zi9nc1BuQWVBTUJFSkV5MDZmZ2tHaXBIZXloK2FlM1Z4WFlyWDg1SHRTcHc2dUsybTVuVm4rdExNdXc1OTJ2RFprZ0RUekI5SzkzN2FPaVVUcW1HYWRDay8rVUJvN1BMSDNkcVdoMGZzMXBEVzE0WnJoY0Q3cG5hU2YzdS9tak1tSm82VlpEMHRYamZlL2JRQUl1TGF1Q3dCOGxYL0VOcFlKMGpiN0Y5TzlpNDBVUHY2Q3V3ZkM5cW5TalB1azN0M2R0TjhhcFNmc25FQS83TXFXS2lxbHpoMzlhYzlMS1NuUzE2KzNYVy9uTHBBMlpyYitmamRmWTFNSDB6c2xwc2FnMkxsZnFxdjN2cDNjUXpaS0gyWnRMcFB1K1ZQckRKZzl6NEt1bHlhT2xyNzVGV244U0cvYkFZQVFJeEFpZWpLemJDdjBNT25YVy9yNVE5THZGa3JMMXZ2YmR1L3Uwby92a3daZDdtKzdpWkxwMCtpZ0pNVmlOa3A0MDFULzJ2UmFqNjdTdjl4cmg2N3Z5SksyN1pGMkhwQ3FheTc4YjlJN1NUMjYyQnF0a1lPbDRZUHNZNkpIRzROaXhTWi8yc2t0c0NtOXllQkw0NlNuSDVHV3JKWSsvRVNxckU3Y3ZkdTBrYjQ4eFVZaXcvcHpDd0I4UkNCRTlHVHVEMThnbEd5VTdoL3VzQ2xQVDgrM1RVeTg5b1VSdHVZbWpOTkU0emJ1OUxlOXRkdVRLeERHOWUxcC82LzQvNjJtMWtKaFpZMVVYUzNWMU5sb2R0K2VidXYwVzFXTnRNbW4xMWl1aCtjY3V0QXRYYnJyNjlLZjMyUWRYZHYzU3J0ekxtM1VjUFJRdThhTnNGMmEwNUswOHdFQVBFQWdSUFJzMlMwMU5GZ3ZjaGhOSEMzTm1XRTk2NHRYU2FlcUV0OUc3eDdTWGJkSzEwNEs5NFlmcDZxa3pidjhiWE5QVHZKTUcyMUsrMVM3dXFhN3JzU3REVHZzakZNL0pGc2dqRXR0SjkxNnZWMlNuZWU0TjFjNmZsS3FxcmJRWFZrbE5jWnN4THBidWwxZDArM1BvNGU2clQ4SVlqSFhGUUFJTVFJaG9xZTh3a0xobFNIZVhLQlRCK24ybTIxSzFJZHJwZmRXMlArcnRkSTcyWDF2bWlxMURXbGdQdFBLemY0L0tEVTJTa3ZYUzkvK0UzL2JoUnVyTnZ2WFZubUZWRlp1STdISmJPUmd1OUI4WWU2NEErQWNnUkRSdEh4VHVBTmhYRnA3TzhmdHRtblN3Y08yMDJGV25uMHNMcnY0djA5dFo5dkFqeDB1alIwbURmOWNjZ1RCdUpVK3JlMDYyK0tWOWoxSnBxOGx6bFZRWkJzSitXbm5BVHN2RWdDQUJDRVFJcHEyN0pKT25FeWU2VzV0THBPR0RiVHIxdXRPZjc2aTBxWmJWVlhiOU1uVWRyYXhSNGMwMi80LzdJZUJOK1hUUW5kVDdFNVUyRVlqTjE3dHBuMzQ0ODJQL0IrQjNwUkpJQVFBSkJTQkVORzFZck9OcmlXenpoMlRmeTNiaFN4YTZiYjlkNVpKTjF6RlZLNWtkYVRZemJtVDIvWks5UTJNUGdNQUVvYUQ2UkZkSDZ5eEJ5c2tuNklTV3ovbzB0RlNhZjBPdHpYQU8yODRHQjJVYkFmT0hUNGVwUUlBU0hvRVFrUlh5WEU3L3dySjUvVVBnckhyM3Z6RnRxTXRra3R4bWJSbXE3djJOMlc2YXhzQWtIUUloSWkydDVkZTJwbFhDSzVEUjZVMTIxeFhZWXBLcEVXclhGZUJSSHZ4YmJjZERtc3orTGtGQUVnWUFpR2k3ZVFwTzdJQnlTTW9vNE54YjM1a1J3VWdPYXpMc0dOclhLcXFsbFp0Y1ZzREFDQnBFQWlCaGNzdEdDTDhkbVc3MmVpaktUVzEwa3NMWFZlQlJLaXNsdVl1Y0YyRldiTGFkUVVBZ0NSQklBUnFhcVhmOGNBZWVsWFYwcHg1cnFzNHY3WGJwWDI1cnF0QWE3MzhyaDFYRXdRRlJkS3VBNjZyQUFBa0FRSWhJRW1ydHdSdlpBa3RNL2VkWUUvTm5EUGZ6b0pFT08zSmtUN2U0THFLUDdaa2plc0tBQUJKZ0VBSXhEMzN1dTA4aXZESjJDZXQzT1M2aXFZZEs1Vm1CM1FFRTAwcnI1Q2UrcjNyS3M2MWFTYy9zd0FBclVZZ0JPS3FxcVZaTHdkclF4SmMzTEhTWUQ2c244LzJ2YlptRmVIUjBDQTkva0l3UjU5ak1lblY5MTFYQVFBSU9RSWhjS2I5QjFsUEdDYW5xcVNmL1RwY1V6SG5MMlk5WVpqODZqVXBPOTkxRlJlMmFndHJDUUVBclVJZ0JNNjJaTFcwbUxQakFpOCtjbE5ZN0xxU2xvbkZwQ2RmWW1mYk1IaC90YTB2RHJyblhyZjNBd0FBbDRCQUNKelB5KzlLR3pOZFY0R21QUE1IS1N2UGRSV1g1c1JKNldmUDJ6RUdDS1pkQjhKelhFaFJpYlJnbWVzcUFBQWhSU0FFemljV3MzVnBlM0pjVjRLenhXTFNDMjlKYTdhNnJxUjFjZ3VrLzNoV3FxaDBYUW5PbHAwdnpad2JydlhFYnkyVjlqSVZHUURRY2dSQzRFTHFHNlQvK28zdFlJbGdpTVdrWDg2WFBscnJ1cExFeUMyUUh2MFZvVEJJc3ZNdHFGZlh1SzZrWlJvYXBDZm1zdXNvQUtERkNJUkFVMnBxTFJRdVcrKzZFalEwMnFqdDZwQ1BESjd0MDBKQ1lWQ0VOUXpHVlZUYXo2dmFPdGVWQUFCQ2hFQUlYRXdzSnYzNkRWdFhHS1lwWk1ta3JsNTY0a1ZwWFliclNyenhhYUgwcjdPbEl5SGJJQ2VaWk9XRk93ekc1UitSbm43RmRSWGhsbitFVGtBQWtVSWdCSnByMFVycGlkL2FlWVh3ei9HVDBtUFBTdHYydXE3RVc0WEYwbzkrSWUzT2RsMUo5S3phWXFPMFlRK0RjUnN5cGRuelhGY1JUanV5cEJsUFdTZmdvU0xYMVFDQUx3aUVRRXRzMlNWTi83bWRWd2p2WmV5VGZqQlQycGZudWhKL1ZGVkxqejFuUjUvQWUvVU4wdk52MkxyVStpUTd0dUdUYlJac1RsUzRyaVE4OXVSSU0xODhQZVcydE54dFBRRGdFd0loMEZJbHg2V2YvRko2NjMrWlF1cVZoa2JwbFVYU2Z6NGZya1BuRTZHeFVmcnRPOUt6cjluWEFkNG9LNWYrYlk2ME5JbW5CbWJuU3cvL2owMkJSTk55Q216OVpWMjk2MG9Bd0hjRVF1QlNORFpLcjMwZy9mc3o5bUNKeENrNWJ1dnBGaTUzWFlsYnl6ZEtQNXBsNnd1UldLdTNTdE9mc0JDUTdNcktwVWRtTStyY2xOd0NtNVplVSt1NkVnQndna0FJdE1iZVhPbkIvNWJlVzJIYnZ1UFNOVFRZMS9IQm1kRjRVRytPVHd1bGgyZEpyNzdQeUVVaWxKWGJxUFBUcjBScjVMbW0xa2FkWnp4RkI4UFpNdlpKano0clZiSTJIRUIwdFhWZEFCQjZWVFhTNzkrVGxxNlQ3dm1XTkdXczY0ckNaOXNlYWU0Q3FhakVkU1hCMDlnb0xWZ21yYytRL3ZrdnBlR0RYRmNVUHJHWXZUL25MYkwzYTFSbDUxc0h3emUrTE4xNWk5USsxWFZGN3NSaTlyNTY3UU9tL2dPSVBBSWhrQ2lGeGJZaHdmaVIwbjIzUy8xNnVhNG8rQXFMcFJmZWxETDN1NjRrK0FxTGJlcmZOUk9sTzcvRzY2dTVpa3FrT2Erd0VWUmNZNk9OeEsvUGtQNytEbW5DS05jVithK20xczQwM2JMYmRTVUFFQWdFUWlEUk12ZmJ6cGhYalpkdW15YU5IT3k2b3VESktiQmpQTlp1dHdkVU5FOHNacnRIcnMrUXZuS0ZkUHZOVXM5dXJxc0twcUlTNmQzbDBzY2JtYzU5UHNmS2JQcnMxQW5TMzN4SDZwYnV1aUovN0R3Z1BmT3FyVlVHQUVnaUVBTGVhR3kwUTlUWFpWZ2d2RzJhQmNUTElyeHNOeGFUdHU2eElManJnT3Rxd3EyaFVWcTJRVnE1V2JybFd1azdOMGhkT3J1dUtoZ0tpcVIzbHRuR01Vd0Z2TGgxR2JhTzd1NXZTRGRPbFZKU1hGZmtqYkp5NmFXRjFnblZYQ2RPZWxkUG9nVjljN093ZkMwNWFnUVJSU0FFdkxiL29QU0xsNld1bmFXcEU2VnJKMHFmSDVLOEQxNW5PMVJrRCtjck45TXJuMmoxRGRMaVZkSkhhNldySjBnM1hDV05IZTY2S3YvVjFVc2JNNldQTjlnSUVFR3daU3FycGQrOEpiMjNVcnJ4YW1uYUZmYnpLbGw4K0lrMC8zMDc1N01sY2dxazZ5WjdVMU1pVlZSS1I0cGRWOUcwbkFLYjFSQjBCNWhham1oS2lkMHhuZCtjZ04rNmQ1R3VuV1Ryd1VaOHpuVTFpWGY4cEUxdFhMMkZIVVA5MXJmbjZZZjZaSjhHbUgvRVF1Q0tUZEhhTmRScmJTNlRyaHh2cjZNdmpBeG41MVZOcmIwdUZxKzY5TENVMWw2YU15UDQ3NlBuWHJmM1FaQ2x0cE5tejVCNmRuVmR5WVZWVmRzdTEwRWZiUVVTNTVHVU4yWTlMaEVJQWZkNmRKVW1qWkVtajVHKytQbHc3dnpYMEdnam9Sbjc3TXJPWjVUR3RaUVVhZFFRYWNvNDIvbDJZRi9YRlNWR1RhMU4rMXUyUWNyS2MxMU44dXZUUTdwcHF2VFZLOE14TGJtczNFTGcwbldKT1VwaStDQnArbDlMdmJ1My9sNWVlSHVwOUljbHJxdG9ucUVEcFIvZUsvVUs0TmV5dkVLYVBZOE56aEExQkVJZ3NDYU1zbkE0ZXBnMG9JLzFyQVpSN2lFTGZsdDMyelM5NmdodjV4OEd2YnRMWHhvblRSNHJqUnNodFczanVxTG1xYTJ6em9iZDJYWmxIZVJNUmxlR0Q3SXB5YU9IU21PR1NaMDd1cTdJSEN1MXRaQ2JkOW5ac0luV1B0VTY2d2IybGRvR1pLVk4yUWw3TDRUdFhNbTA5dExFVVZMZlhzSDQzZGJRWUJ0UTdjaVNUcDV5WFEzZ053SWhFQnE5dTB2OSsxZzRITkJINnRmSFB0ZTNwN2Z0MXRWTHBTZHNOOExDWTlMaG83WmhSK0V4NldpcHQyM0RlOE1IU1VNR1NJUDdTY01HU29QN0IyTjBPdStRbEhmWVB1WWVrdmJrdUs0SUZ6SzQvK21BT0hhWTFOV25xWldsSit4MWtaVm5uVkg1Ui94cEZ3Q1N5LzhId29CMGRRRzRvR05sZG1Yc08vZnZ1blMyTlJrOXU5blZ0Yk05MUtlMk8vZHEyMWFxcTdNUmw3T3ZtanBiOTFkNlhDbzVZWnUvMEZ1YTNMTHo3VHBUL3o3UzVUMXRTbGYzTGxLdmJqYWx1Y2RuSHp1MGIzMjc4WTZHMHM5ZVo4WEhyWk1oSGdBUkhnY1AyN1ZrdGYyNWZ4OExobU9HVzFCczdYcXhtbHJyZkNvcXNYV0FlWWRzQkpBT0tRQklLQUloRUdibEZYYnhJSTFFT0h6VXJxWjA3MkpUQlR0MStPeGpSNmx6QjZsRG1vVzlNenNkNnVvLzYzQ290UTZHMG5JNkdwSlovUFd6ZEwzOU9iV2QxREhOWGlzZDAyeTZZT2RPcHorWDJzNWVHL0dydWxhcXJaVXFxaXowaGVXb0FnQUlPUUloQUtENXlzclpoUS9ORSs4WU9FNndBNEFnaS9BcDJRQUFBQUFRYlFSQ0FBQUFBSWdvQWlFQUFBQUFSQlNCRUFBQUFBQWlpa0FJQUFBQUFCRkZJQVFBQUFDQWlDSVFBZ0FBQUVCRUVRZ0JBQUFBSUtJSWhBQUFBQUFRVVFSQ0FBQUFBSWdvQWlFQUFBQUFSQlNCRUFBQUFBQWlpa0FJQUFBQUFCRkZJQVFBQUFDQWlDSVFBZ0FBQUVCRUVRZ0JBQUFBSUtJSWhBQUFBQUFRVVFSQ0FBQUFBSWdvQWlFQUFBQUFSQlNCRUFBQUFBQWlpa0FJQUFBQUFCRkZJQVFBQUFDQWlDSVFBZ0FBQUVCRUVRZ0JBQUFBSUtJSWhBQUFBQUFRVVFSQ0FBQUFBSWdvQWlFQUFBQUFSQlNCRUFBQUFBQWk2djhBQUFELy8remRkM3lVWmJZSDhOOU1PaUdKQ1FRQ0pMU0VIbnJ2WFRxaUxMWlZkMTFVTEZ2VTY3cVd0VzI5dUZmWHVsN3Y2dG9BQzZMU2E1RGVJYlFBSWZUUVNVZ2pwR2Z1SDRkQWlKbk1jOTQyN1h3L24vbmNsZnZPdkEvRHpEdnZlWjd6bkNNQm9SQkNDQ0dFRUVMNEtRa0loUkJDQ0NHRUVNSlBTVUFvaEJCQ0NDR0VFSDVLQWtJaGhCQkNDQ0dFOEZNU0VBb2hoQkJDQ0NHRW41S0FVQWdoaEJCQ0NDSDhsQVNFUWdnaGhCQkNDT0duSkNBVVFnZ2hoQkJDQ0Q4bEFhRVFRZ2doaEJCQytDa0pDSVVRUWdnaGhCRENUMGxBS0lRUVFnZ2hoQkIrU2dKQ0lZUVFRZ2doaFBCVEVoQUtJWVFRUWdnaGhKK1NnRkFJSVlRUVFnZ2gvSlFFaEVJSUlZUVFRZ2pocHlRZ0ZFSUlJWVFRUWdnL0pRR2hFRUlJSVlRUVF2Z3BDUWlGRUVJSUlZUVF3azlKUUNpRUVFSUlJWVFRZmtvQ1FpR0VFRUlJSVlUd1V4SVFDaUdFRUVJSUlZU2Zrb0JRQ0NHRUVFSUlJZnlVQklSQ3VGdFlLQkFZNE81UkNDR01FQkpNRHlHRXNFcFlLQkFVNk81UkNDOG1ueDVobmFqNndKU1I3aDNEampRZzdZaTE1N1RaZ0tUbVFNZEVvR1ZUb0dFMEVCc05oSWNCd1VIMC93ZUE4Z3FncEJTNG5BZGs1UURuczRCREoyaTgrVmVzSFhOTlA3dVZ4cXRIV1RrOVNrcnA3NU9URDV5K0FHVG5Hak5HVDJIazU5emhBQ29xNkgwckxnVUtDbSs4YjFrNXhweEQxUU9UYjN4V1hibVFEU3piWU55NWs1b0RBN3VySDcvckFMQXZ3N2p6MXlZMkJ1aVRUR09MYnd6RVJORjN4SDV0bnJXeWt2N05MdWZSWi96a1dTRGpGTEFuSFNndTBYZnVWdkhBa0o1cXh4WVVBZ2VQMGNNc1lhRkF2eTVBMDBacWsxc1hzNEdsQm40KzlERGkybFpkYVJrOWlrdUFyRnk2anArOVNOOWhUMkQwMzVmcjFEbmd4MjExSHpPZ0c5Q21oZXZYeWkwQTltY0FSek9OR1p1cWJ1MkJOczJCZWdydjQrWTl3T0VUeHAwN3FUblF2VDNRT2dHSWF3akVSQUtoSVRldXpSV1ZRT0ZWdXU1Y3ZBd2NQd09rSHdmU2p0THZpUkJPU0VBb3JGTy9IakJoaUh2SGNEblBtb0RRWnFPTDlvRHU5SDhqd2wwL0p6QUFDQXlqSCt1RU9QcXpjWVBweHZMSUtXRHJQbURETGdvSXJEYWlEd1d5WnJoeUZUaHhsbjYwZGg2Z3Y2czNzK3B6WGxoRTcxdkdTWnJvTVBLbW96YmpCOThJZGx3NWVNellnREMrTWU4OXpTc3dMeURzM2g2NGJRVFF2bFhkNzRmZER0UUxwVWQ4WTZCck8vcnprbEs2T1Z1N0E5aXlSOXROMnVuelFLOU9RT01HYXNjN0hIUVQvci9mOE0vbFNvZld3SlAzQTlHUjZzOTVaN2J4NDlES3pHdGJsYkp5Q29TT1pRSzcwMm5Db3FMUzNITTZZOFhmdHk3Yjk3c09DQ3NxMUwvdkRnZE5Mbno2Zy82eHVSSWFBanoxQUYwRFZKU1ZBd3QrMUgvZUFEc3dxajh3YmhCTnVyZzZOckkrUFZvMkEvcDBwai9QS3dCU0R3RXBXK20zVm9nYUpDQVV3a2pCUWNESWZzRFlnVUNUV0dOZTAyNEgycmFreDExamdZMnB3TUkxdEVya0MrclhBNUtUNkRGMU5NMm1yOWtPck54TVFZK29YWGdZMENtUkhsTkdBT2V5Z0hVN2dLWHJnYXZGN2g2ZDcwbE9vdTlmdTFiNlhpY2tHT2pSZ1I2WEpnQUwxZ0NyTnZNQ2hMSnlZTTVpdWpsVlliTUJJL3JTaXNGM3F6UU51MVl4VWNBenYxU2I4S3FTZG9RbXR2eEpVQ0NRbUVDUDBRTm8xWFpIR2dVeUo4NjRlM1NlWjl0KzROSmxXb1YzeFdhanlhb3pGK2czdzB5L3VsMDlHQVNBMUlQNkozQkg5YU9NazBZSzcwVmRvaUtBWWIzcGtYRVMrSFlGQlloQ1hDTjdDSVV3eXBDZXdGdC9BQjZjWWx3d1dGTndFREM4RC9DUFo0QVowMmdXME5jMGJRVGNPd0Y0NTNsZzBqRDFORVYvMTZRaEJTeHZQdytNR2VqdTBmaVdxYU9CRjJmb0R3WnJpbzBCcHQ5QjMrZE9pYnpuYnQ0RDdEM01lODV0d3ltbDJTaDNqdUVGZ3hVVndPY0xqVHUvdDRvSXArdjR6S2VBRngraDlFTnhnOE1Cck52SmU4N0VvZWFNcFVwMEpEQzRCKzg1S1Z1MW42OWVLRTM0UERKTmZ6QllVNXNXd1BNUEE4ODlwQlowQzc4Z0FhRVFlc1ZHQXk4OUN2ejZYdXRTY1FMc3RCTDV6MmY1UDFMZUlpSWN1SDhTOE9yajlCNExOVkgxS2NoNDlsZVU0aVMwQ3drRy9qQ2RBdTBBRTM4dTR4dlROZVRPTWJ6bmZiR0F0emN0TEJTWU9JeDNEbWNhUmdPRG1OZWUxVnVCNDZlTk9iOHZzTmtvbGZqUHZ3R2V1TWZZWU4zYnBXeWxDUVJWVFdJcGZka3NRM29CQVl6aWIrZXphSVZRaTJhTmdiLytEdWpmVmR2elZmWG9BTHorTk5DM3M3bm5FVjVCQWtJaDlPaWREUHo5U2FCekcvZWNQeUtjQXRFWmQvcHVoYkVPcllGWG43aXhyMUtvNmRVSmVQRmhxWGlwVllDZDBpRjdkclRtZkhZN0Zmem8yMFg5T1NmUEFhdTI4TTR6cWgrbGFlczFhUmhsTEtqS3Z3Sjh0VXovZVgyUjNRNE03UVhNZkpxWGt1akxzbkpvdnlXSGFxRWxMZm94dnBjQWY0V3pTbXcwOE1KRFFETVhld1dORWg0Ry9QWSttWXdRRWhBS29kbVlnY0RUdjNCLzJxYk5Cb3pzU3lrZzlVTGRPeGF6eEVZRHowMm5QVXRDWGJ0V3dFTlQzVDBLNzNULzVCdUZZS3h5NWlLd2JSL3ZPZDhzbzJxTHFzTEQ5QmM5cXRxUHhERnZKZTJkRTg3RlJOR0s5RzBqM0QwU3o3Q2FtWExaTzltY2xmeUVPS0IxdlByeFplVkFDbk9pQnFEQ2NrL2ViMzBhNThaVUlNL05sY3lGMjBsQUtJUVd0dzJuRGVabXBwRnhKU2RSMnBuUEJvVXh0QklxZUliMHBETHBRbDF5RWhXR3N0cTNLL2hWUnd1TDZIa2N0dzZnOUZHdEpnMEZ3aGpweU1mUEFNczJhaitmUDdIYmdaOVBBQjY4M2QwamNiL3QxNHJMcUlxc2Y2T3FwcEdHOXVMdFpkK2xzWmpNN2FQVTJtMFlxYVFVbU11OGZnaWY1RUYzczBKNGllRjlxT2lKSnhZN1NVd0EvdXVYdnR2b3ZudDdmdXFPdjdQWlpNV0I2K2NUMVZ0c0dDWGpGTTNVYTdGaUU2OFhXMFE0bGJEWElqeU05aStyY2ppQVdRdWxCeHJYdUVIQWZSUGRQUXIzNDZaZWN2cVZxdUtrY1FQQWFnMnJnOUdSTk5GaXRWVmJlRUczOEZrK3V1bEkrSVFMMlRUVFppUzlCUTA2dEtZVVBMM0JZR0VSWFlUenJsQVQ0NnFlWlExdUFScmVvdTltdEhNYllQcFU0RU1UZW82cHlDMEFQcHYvMHo4UEM2Rkd2azFqZ1ZiTnFFZVNsdmR4NGxCZ3kxNzk0L1FVYVVlcDdZQXpJY0YwRXg3WEVHalhrdEtYdU85YmgxYlVzKzVDdHE2aCtvWHU3V2xpaGVQY0pWck5PSEdXdnRPT1N0cW5seEJIYWJzZEUxMVAwbnk5VlB1WUFlRHpCVlNBU2ZXek1XWWdzR2d0WFg4NHhnL2hOVGJmc3NlOG5wQldLeXQzdldjek9QREd0VHdoVHQ5SzdPVGh0TkswZUozMjE5QkQ1ZS9MZGVvczcvaFZXMmhDUzNXU3MyczcrbndhMWJJb09VbTkzeWRBMXdJdDdSekdEK0VWQVhNNGdQUVR3SjUwNmt0NnBZamVvOGh3b0ZVODNhdTR1bzRWRkJyYmhrWjROUWtJaGVjNmR3bjQ1SHQzaitLRyt2V0F4Ky9XWHJ6bFFqYjEzOXEydis3QU5MSSswSzBkMEw4YjNaeHFDUTVIOUFIMloyaGZjZENqdEV6dHZDMmFVdlhHWHAxNHI5K21CVzI0UDNOUjIvZzhUVTRlNzkrcFV4THd5TTk0clUzc2Rxb290OVRBWnZHK2FrZ3Y5V01ySzRFdmx3RHpuVFNmcnBxNGlJa0N4ZzJtZ2k2MUJWT3BoL2d0SkdvNmVJdytSNnFWUDZNaktTaGN1RWI5SEtFaGxHNnFxcWdFbUxWWS9YaFBWMXJHKzAyeTJhaWR5T0NlOU8raTViZmozZ25Ba1V6M05CUG4vbjNOa0owTDdEa0U5RlQ4blFnSnB2ZDZ1VUVweW9PWmhXcTBGcE1ad0tnb1dsQUl2RGZIZWVDNS9scWZ6MWJ4dE9yWXYydnRGVklYcjVOOXZlSTZTUmtWUXRYOWszZ3poVlh5cndDekZnRlB6UVMrWHVaNmxUTC9DdjJvelB3WWVPVjl1dEhqc3Rsb2o2TzdDOTdVNWVSWjRQWC8wSHZDWWJNQlBTeXEvT2lKMG80QWYvNFF5R01VRWdIbzVrQzRscHlrZnV5OFZjNkR3ZW91NXdHekZ3RlAvamNGNWRWWDViSnlnSS9tOGNkWm05bUxnYUppOWVQSERlS2xsNDhkeUt0R3VHaXRmNmVqT1J6QS9pUEFCMThEejc1QnE4amMxTm1nUU9DSnUza1ZYWDNONm0yODR3ZDBNK2E4Z1FHOENjdXljbjRoSElDdXphcUZaQndPNEswdjFGWWhqNThHM3BrTlBQY1dzRFB0NXMvZXZneGcvbXIrV0lYUGtoVkNJVlMwYVVFYnk3blNUd0QvODRuMkNsN3BKeWdvbkRTTUNnMXdWZ3Nqd21rRjd0L2ZhanUzVmVhdEJKckgwWXFvS201S242L0p5cUhBNHU1eDZzK1JYbzZ1Tld0RUZUUlZGQllCUDZUd1hqL3ZDcTI0L0pCQ0ZSRUJXa1hNTjZqQ1gzWXVzR0FOZmU5Vk5Jd0dSdmRYV3prT0NnVEdNUFlkWHNqbXZ6Kys3TXhGNEIrZlVFWG9oNmJ5ZXRyRk5RVHVHQVY4cFRPdDJGdHQzMCtmSjlVSjJYWXRqVW1SNzlPWmZrZFY3VHlnclpoTXU1YnF4KzdMNEtkZ256d0x6UHdQYmRQb2xFalhvYzI3Z1lwSzN1c0lueVlyaEVLb3VHYzhQM1Z6MTBIZ0x4OGFVODU1NFJyZ2cyOTRUYWdCU2gxdDFsai8rYzMyNVZMZXpMblZaYms5MGZiOXZPUDE3R1h5RjV6dnlyRk0vdmV4U2s0K0ZZSlpzY200WUxESy9OV1VicTlxL0JDMWFzbWorZ01OR0cxZjVpelIvdjc0c3BTdHdOdXorSHMzSnd6eDcwbWQ5WXhVVEx1ZGwvcnRESGVsVWN2cUlFQUJ2NnIwRTlyT0FRQW56bENhNklaZEVneUtuNUNBVUFoWDJyU2dXVFdPelBQQW01OVJTV2Vqck4zT0x5OGZFQUJNMU5senpBcm5zNEJUNTlTUE42S3h0cmZMUE0vN1VmZkFvcmdlaDFNc3BZUjVRMitWOGdwS0hWWFZ1QUV3ckUvZHh3VFlnZkdEMVY5ejMyRmFnUkMxMjdLWDlwNXloQVFERTRlWk1oeXZrTEtWUHR1cStqUDI1TlVtUEl6WGgvVGNKV0MzaG1JeUFLOVZsSkgzRkVKVUl3R2hFSzVNR01LcjZsaFdUbnRHdURQQUtyNVBvYXFVSEFPNzg5SmUzT1VpWTYrUnI3YlY0T0xjSEZ3eHFPcWVMK044ejVzeWl2cFliZHMrWHFYRGlVUHIvcnNQNjZPZXJsZGVBWHkrVVAzYy9tcnhPbjRob1dHOS9IY3lMRHNYU0dWVUhZOXZySytuMzZBZUZJU3JXcnREKzdrNGszWHhYcER4STd5U0JJUkMxQ1UwQk9qZWdmZWNWWnVCSTZmTUdROEFmUFF0VlRkVUZScGkzQ1o3TXhXVnFCOWJ6RGpXVjlsc1FDampodVdzajFSbE5STW53RzdhaUhxU2VxcFpDOVZUTnBzMUFvYlVVVTJSazJXd2FqUHRXUkt1ZlRTUHQ4b2ZGdW9kMTNLei9NZ3NMbFBYWjlvVnpncGpXVG10WUdyRm1UenUzMVdDUW1FS0NRaUZxRXUvTHRRL1QxVkZwZm1sL2M5YzVQYzU0amJXZFlkd1J0ck1WVVlsUlYvVnNpbHZYMnZhRWZQRzRpc3U1L0dPZjJncXRaTHdSSm5uYVkraXFrbkRhdi96d1QzVTkxYm1GUURmTEZjL3A3ODdud1hzWnZiYTlZWnJ1VmwycFBFS3hmVHBySzNYYld3TTBMNFZiMXpjcXMvVjVUTDJFWWNFQXkvT29QNm1RaGhJQWtJaDZzTFpRd0RRai92NUxIUEdVaDNuUmcrZ0ttYWM5QmQzNFBUVjR4VE44RldjbFlMc1BINFJHbjkwK2dLdnVGRlFJUERJTk9DVng0SE9iY3dibDFaemw2dFhQV3plaE5MTGE1bzhuSEcrRmNDVnErckhDMkE1ODFyZW9UV3ZnYm12NGZUNWk0N2s5N2tGcUtJNFo3Sk5hekdaS3R6ZnN3WlJ3S3VQVTE5a2J5Z2FKN3lDQklSQzFDV3BPZS80YlJiZGRLY2U1RlVuREFvRU9yWTJieng2eFRYa0JZUkhNODBiaXpkb0ZRK01aYlFBK0c2VlZKVlRVVkNvYlVLblV5THcwcVBBRzc4SHBvM3huSnUwcThXOEZic3BJMjcrN3dIZGdCWk4xWjU3TkpNL1VTV29FQW1uRW5WZ0FML0ltUzlKMmNLclhqdW9sa2tPVi9veFZtSFBYZ1QycFBQUFVkMmg0L3orbEFGMllGaHY0STFuZ0pjZkE4WXdlNFFLVVlNRWhFSTRFeFVCTkdLMk56akFMUGlpeC9FenZPUGJ0alJsR0lhWVBGdzl0YWV5VW5zMU4yOW5zOUcrdFpkbXFLLzQ3andBckpRYmRXVjZQbHNKY2NDMFc0RTNmdys4L2pUMUEweUlNMjVzV3FSc0FUSk9xaDNib3VuTnE0U3FxNE1PQisxWkZOb2NZMDV3ZWZLMTNHeVg4M2pmMFc0ZGVDMTNXc1hUYXJrcVBjVmtxbVRsQU1kT2EzdXUzUTRrSndIVDd3QStlSmttcHNZTnB0VlJJUmlrTWIwUXpqU1A0KzAveU03VjN3aVhJK01rTDZXVjArdklTcjJUcVYraXFuMFoxcjdQWm91S3VOR2t2S2JBUUNvY0V4TkZoVDg2SlBKNndhVWZwNTVuUXQyeURkUnpMMGpIejZQTlJrMmdXellEcG82bWxpcGI5bEpxR1hlZm9oRStYd2k4OXJoYUd0ekVvY0RHVktCelc2QjF2TnJyYjB6bFZ6OFdOeHc1eFN0ZUZxZFk4Vld2MEJEZ2xjZTBQLy9pWmFxNGJiU1VMYzZ2bVRXRmhRQUR1d0dydHFnZFA0elJ2N0NzWEgrNmFKVVZtNERIN3RMM0dvRUJsTHJldVEzd3dHUmFlZHl3aXg3U3JrSzRJQUdoOEZ5SkNmcCtqQUNxWFBuNmY3UTlseHRBV1YzRk1mTTg3L2lHSHRqVWVQUUE0SUZKdlAwYVM5ZWJOeDUzcVBvQk45cjZuY0NIYzgxcGYrTEx6bVhSRFpTUkZVU2JONkhISGFOb0wrZWlOVUNHaVpXSWEwby9EcXpmUlh1alhFbE1BRG9sQVNQN3FyMTJVVEUxb1JmYWNYcXdBbFQweEFvQmR2b3NhQlhKL0kxU3RldmFYbjNWMytnQjNkVURRdFZBRXdCMjdPZWwrOVpselhZcTdHUlVCZEVBTzZVV2Qwb0U3cHRJSzVtTDF0SnFwQkMxa0lCUWVLNkljSDAvUmdCUXFLUDMyaTBSdk9PdDd2TldVTWc3M2xQMkY4UkdBOTNhVTNYR1Zvb3JFRlYycHRITmdIRHVRall3YXhHd2RhKzdSK0s5dmxwS3ErOHhqTlZZRllFQlZEYStYeGNLREw5WWFOMXE5NXpGVkdBalBNejFzVk5HcUZkWlhMQkdiakwxeXZmU2E3azdyZDlKKzNWVmRHaE5FNkt1UHFmZDJ2TW1UdlcwbXFqSjRRQSttdzg4TngwSU1MalBibmdZTUg0d01Mby9aVURNWFNHdG04UlBTRUFvaERQQnpLcWNWcmRDS0dCVzg3T3F5bWgwSlBDMzM5MzhaellicFIrRmgvRUQ3U3E1QmNDbjgvV1B6MWVkT2tmTnJ0ZnRrQUl5ZXVYa0ErL09CbDU0UkYvcXFETTJHNVhFNzlJVytQaDdZTzEyNDg5UlUwNCtNSDgxY084RTE4ZXFwcUtmdTBTdktmVGhUdTV4ZjV0ODBhb3R3SlNSYXQvUEFEdXRqczliV2ZkeGczcW9uLy9NQldEdllmWGpWZXhKQjc1ZXB2WWQxU0lva0ZZaCszWUIvdm01RkdjVE41R2lNa0k0RXh6RU8vNnF4U3VFbkNxakFQL3ZvMVZRSUZWbnJmNUlUS0E5Y0ZxRHdiSnl1a0gzcGIyRFJtdldtTkw4cG95VUZRUWpwQjBGM3ZoVVg1YUJLNkVod09OM3FhOTA2TFZ3RGQzSUdtWE9ZcUM4d3JqWDgxZmNGVUtycnVXZUxDZWZxbTJyNnVlaTBYeHdFTkN6by9ycmNkcGZjUHl3bW9MQ1NoTW45UnJGQUM4L3lrdVBGVDVQQWtJaG5PRmVrQU10WG5EbnJ2aFZlT21OVzFFeHpXYnV5M0QzU0R4YmdKMnFEOTQxRm5qdlJXREdOQ0JTQWtOZGRoMEUvdlNCdVRQcE5odFZKaDNkMzd4elZLbW9wSFJpSSt3K0JHemRaOHhyK1R0L3VaWWJqWk95MmFKSjNVV1MrblZSUzZjR2FGKzJVY1ZrYWpOdkpmRE9iUFVlb2xxRWhRSy92a2U5Y0pUd2VSSVFDdUVNTjhlK3Z1S1BpVkc0Ti9zbFhsaGM1RndXOE5kL0F6dlMzRDBTN3hJU0RJenNCL3pQTXpJTHJOZnhNOEFMYndPZmZBOWN1bXplZVg0NWhiK25Wb3VkQitpaFIxazU3WDhVeG9nTTV4MHZoYUpJNmtINmpWQlZWMUdsQVl4K2hUdlRqQ3NtNDh5bTNjRFRyd05MMXB1M0hTVXNGSGpxQVZseEZnQWtJQlRDdVNKbVFGalA0b0NRRzRCNjB5YnlzbkpnNlFiZzJUZUF3eWZjUFJydmRVc0UvZUFQN2UzdWtYZzNoNE0rajcvK0cvRGVIR0RmWWVOWGFZSUNnYnZIR2Z1YXpzeGF5R3Z1WGRQS3pmd3F4OEs1Q0daQVdHVHhmblZQdHA2UnV0bW5jKzEvSGxtZlYrbDVsWW1yZzlVVkZnR2YvZ0E4OFJkZzltTGdCTFAzc0lyR0RhalZqUEI3VWxSR0NHZTRxd0ZhOThkcHhhMkFtSlZyemppTVZGWk94UUlXclRWM05jYVRuTXR5SGZRR0I5RitzOFl4VkdxZDA2WWpNQUI0ZUNxUWVVNTc4Mk5CSEE3YU83UnVKMzMvK25VQnVyWUhPclkycG1oVDkvWkF1NVpBK2duOXIxV1hNeGVwMnVDa1lmem41dVFEM3l3emZFaCtqWHN0ejdhd2w2V2VQYUxsT2lZZFZLVnNBVzVYTEM3VDRCYnE5MWh6NytIZ0h1ckZvMDVmb0FraEt4VVdVZkdtK2F1QkZrMkJ2cDNwdXBNWXovc3RjR2JDRUdEQmo3SWYyTTlKUUNpRU05eStnczJiMEkrS25wbDNqall0ZU1kN1E0QVZGRWpGWnh3T2Q0L0VPa2RQQWU5L3FYNThWQVF3b2cvZHpOZXZwL2FjNENCZytsVGd4YmMxRFJFQXdQa25zZHUwbjZjMk51YnJWVnJ3K2JtY1IrbGNTOVpUTU5pakE5MXNkbTFIbFhhMTZ0UFovSUFRQUw1ZFNXbHlEWmpCeURmTHJhK283T3ZhTk9jZGI5VzF2TEFJZVBDUDFweExxNXg4MnV2YjE4bnFYMDFEZXY0MElIUlZjS2E2ZFR2VWp6WER5YlAwK0dZNVhXZDZKZE8xcDJNaUVCYWk3VFVqd3VtNnBUZVZYSGcxQ1FpRjV6cDVGbGl4V2Q5cjZKbWhQSDJCMGtaVkw3SkJnZFM3eTZyaUo2MFRlTWR6bXgrN1M1ZTJ3RjkvQzh6OFdGYTBhcE5YQUh5ZlFudE1YbjVVdlVsMW0rWkE1N2JhWjdmTHk0RUF4Vld3c0ZCdDUzQkd0ZGhEbFpKU1k4K3ZjcjdOZStnQlVGQTN1cjk2KzRicXVyUTFkbXpPRkJVRGM1Y0RqOTZwL3B5am1iUWlJNHlWeUx5V24vU1NhN2xWVm05UkR3aDdkS0JzaTZvdEZFMWlnYmFLazZzbHBjRHFiZHJHYUlhY2ZHRGxKbnFFaHRBZXlWc0hBQWx4L05mcTNrRUNRajhuQWFId1hGVVhPM2VwcUtTYy9RNnQxWi9UTWRHYWdEQ3FQaERmbVBlY3RLUG1qS1dtdkFMYTcxQWxQSXhhVC9UdnFwN2VFaDBKUFA4dzhNZDNwTldFTXhleWdZKytBNTUvU1AwNWZUdHJEd2hMU3RYVEl1dTVPU0FzdGpnZ3JHbmJQbnAwYnc4OC9ETmVzK3U0aHVhTnE2Ymp6QW1YMHdhMnJCQWtzajcvQm42L1ZGeStTZW9oNm9uWkpOYjFzV0doMUlldnF2Zm53TzdxR1FnNzB2anRucXhTWEFJczN3aXMyRVJONk8rZHdPdWhxdkxlQ1o4bVJXV0VxTXVoNDd6amgvVGtwN2RwY2V0QWFqT2dLanZYMlA1amRTa3BBOVpzdi9GWXZBNTRleGJ3N2h4ZUs0K28rbFFXV3ppWGVoREl5bEUvUG9tWm1sWmRib0g2c1RGUi9DQ3VMdHlibFd6R2UyS20xRVBBYXgvdy9vMUNnbW0yWC9pSDBmMkJnQUQxNDdOekpUQ3ZEYWN2WUo5cWxaZTdNVmJ4eld3MVlSU0hnMzV6Ly9FSlRXcXJpbERjZmlCOHpmWDlGWFlBc2hsQUNHZXFVc0JVeGNiUVNwaVpiRFpnR0xOcTVDNFBTQVhabUVvQklrZTdWc0RZUWVhTXgxZHdiZzY1eFN1cTR4UWxzdHQ1Syt1dWNIdGxuYjFrM0xuMXVwQk5qYVk1dVB2NmhIZXkyV2cvTUllMDRLbmQ2cTNxKy9jN0pWR3hyZkF3SUZGeGtpenp2SGYxd3QxOTZNWXFxQXJWL2VqQzExenZZV01INE9iY0dpRTgySWt6L0wxM2s0ZnpWdSs0eGd3RVloa3BhQUN3aVJuWW11WHJaVlNvZ0dQYXJmcUtkUGc2VGdsNlBhdDIzRFlEUFRwcVAxZDFMWnBRYVhSVk9mbFU4TVdUYk4zSFd4MjNvaWlPY0w5Ui9kVDNBRmZabUdyT1dMeGRUcjc2SHJoNm9VQnlHOXF2cS9wYjdlNWlNbHJzUHFSK3JGeHkvSlVFaEVJbzQ2NXF0WTRIcG8weFp5ek5HZ0gzTUh1Vm5Ub0hwQjB4Wnp4Y09mbFUzcG9qSWh6NCtVUnp4dU1MUWhqcGhaeWdwS2FNazd6akIzWXpKbTEwN0NCZUdyWW5GaUlxTHVGTmhIQW5UWVQzaVd0SSs3dzRqbWJ5dHpINEUwNUtaL2YyNmxrTW5sWk1SdFVsUnFxNk4vVXBGa2E2dnF3dUFhRVFycXpjek45SVBubTQ4ZFVDUTBPQXgrL2hWM0JjdXNIWWNlaTFjQTBWQU9BWTNJUFhPTmlmTkdFVUlkSFRMbUR2WVY3MXpyQlE0TTZ4MnM4SFVNK3RRVDE0ejlscmNZOHdWYXI3QW91S1BiZHdoVEJHVUNEdzJGMzhDWk5GYTgwWmo2L1lmVWk5WFZSeUcrcjVxV0pIR2xCUXFIbFlic05KQS9XMHJBcGhsWnRXQ09XWFI0aTZsSlR5ZzZyQUFPRDNEeHEzbnpBcWdsb01jUHRWbmN2aTdTT3dRbmtGOE9VUzNuTnNOdUFYdDVtYml1dU5XamJqVmFXOHFLTmlhM0VKdjdyaG1BRlU1bDJMMEJEZzhidDVEZDhyS29BdEJxUkhSOWFuNys4bmZ3SGVmUUc0ZTV5K1ZocnRXcXBYL1BPay9ZL0NlT0Zod0F1UDhQZllIczJVZEZFVnFzVmw0aHNEelp1cUhXdFZxNVdrNXNEZm53USsreXN3ODJsZ1pGLzlyNmRLcmp2KzZubzZpaDJBRjNTckZzTE5GdndJbk0vaVBTY2tHUGp0ZmNDZFkzZzN0VFYxYVF2ODZRbHRGU0svWEV3Qm1LZlpzcGUvUWI5NUUrQzJFZWFNeDF2ZE01NlpUbmxHMy9tNDZkTjJPL0RVQTFUbW5TT3FQdkRTREtCVk05N3pVZzlSV3JJZUljRTArZEk3bVc3ZUd6Y0E3aGdGdlBFTWxhalhZbFEvOVdPUG5OSjJEdUg1V3NjRHJ6d0dkRXJrUGEreUV2aDhnVGxqOGpVcGlzVmxiRGExQ2NiTTg4QitDN1pjdEdvRy9IRUc5YVFNQzZYL25uRW44SmZmYVB2dEQ3RHpzaXNrRmRsZlhTOGZiZ2NnVGI2RWNLV3NuSDZRSGN5ZDF3RjI0R2UzQXY5OEZoZzlBQWdPVW45dW0rYkFINllETHo2aXJVZlF6Z01VZUhtcVdZdDRaYkVCQ2dnNUJVWjhWVkFnOE1UZHRBK0dRMisxMmEzN2dET0tLVmxWUW9LQnArNEhucmpIZFRFa200MktKcjMrWDBBYnhXYlIxUzFaeDM5T1RYZVBvOG1IbWhwR0E3KzdqMjdvMjdkU2Y3MlJmWUhCUGRXUGx5cVN2aWMybWxhNy8vWTdXdFhuV3JrWk9Iak0rSEg1b3J3Q1k3OURheTBxSmpQOWp0cjd0N1p0Q2Z6NU4vVDVVUzFBWkxNQmoweWptZ01xaWtxb2haSHdSOWNEd2tCSVFDaUVtaDFwd0xLTndEZ05iUkFhUmdNUFR3WHVtd0FjUEU3cFArZXpnTng4YXFKZFZRSTdOb2FxS3JackNUUmpOcDZ2TGljZitMKzUycDl2aGVPbktaMTFCQ010Sml3RWVHQXk5Vmp5UndseGxJSjU2d0IrZGNJTDJjQ2VkUDFqK0hZRkJVWWNkanN3dEJjd3FEdXRnQjA0Um50VzhndUIwR0JhRVd6VmpQYjFSSVJyRzFmcUlmMHorWWtKRkpEV3BWTVM4Tm9Ud09FVHdMcGR3TzZEUHkzZVlMTUJIVnNEWXdZQmZUdXJyK0pldW16TXY1RXdqNnZVMzVCZytndzNhVWlmcHc2SmxCNnFOZDM5MkduM3JnNXltcHVycUt6a1R3UnlyZDVxekhhTmtsTGdSd3VLeVV3WVFvR2ZNd0YyYWpVMXNEdE45RzdlVGRlSm1udkNnNE1vczJIaVVQcnNxVW85S0VWbC9OZjFsQm9KQ0lYZ21MVVFhTjJNK3VOcEVSWktOL1JhOTFXcEtDc0gvdldWL3RRNUszeTlqTklKT2NVVmVpY0RmVG9EMi9hWk55NHI5ZXdJdlBkaTNjY0VCOUhzTVdlRnVTYWpDbEpzVEtVZ1hrdVJuNEFBK3U1by9mNDRVMXBHMzAwOWJEYmdvYWswT2FOeWJOWGZ3K0VBY2d1QUsxZHBjaWMwR0doNGk3WTloeXMzODU4anJCTWVCc3llYWQzNXN2T0F0NzVRNzY5bk5EUCt2dHYzbXoraHR5ZWRNaGxVVjhpYzJiN2YvR0l5c2RHVVJhUWlLQkRvMTRVZUZSVTBxVlpZUkFGMldBalFxSUhhOWF1NnFrYjJ3bDlkcnlaa0I4Q3NKUzZFSHlzckIvN3hLYThadUpVcUsybGwwRnRXR2JTMG9RQ0EreWZwMjVmcFNjSkNnVVl4ZFQ5dWlkQVhEQjQvRGF3eU1OajR2N21lVlhYdnE2WDhQb2sxVFJyR20xV3ZZck5Sbjh5RU9FcnpUb2pURmd4ZXZBd3NXYzkvbnZCTkJZWEE2eC96OTY0TFlrVGZRQ3VLeVR4NHU3YjJQQUVCbENYU3NobGR0NW8yNGdlREFHMHI0YllVRXI3a2VqVWhPNEFUN2h1SEVGNG8vd3J3OTMvcnZ3RTFXa1VsOFBIMzF1MTVNSXFXTmhTTkc2alBxdnE3b21MZ2Y3OHhOazNyUXZhMTEvU0Fna1ViVS9XdmZzWkdBMU5IR1RNZUxSd080TFA1dE5JcHhLVWM0TThmQXNkMUZvSHlaNnUzNnZzK25Ub0hwQjAxYmp5MTZkY0Y2TlhKM0hQVUpmK0svc3dLNGRWc2M5L01yZnJmRWhBS29jV2xIT0MxRDRCMEQ2bk1WVklLdkRzYldMbkozU1BoMDlLR0FnREdENmJWR09GY1dUbnczcGZtM0ZodTN3OTg5SjIrWnZkNjdVa0gzdjlTLyt2azVBTTdkQmJjMFdQQmovUitDbkg0QlBEcSs4QUpDUVoxeWJzQzdOUlJYTWFLaWRVam1lNEwraXNxZ0EvbjhwclhDMTl6MDQrZUJJUkNhSlYvQlhqMVg1Ui83ODZiNHN6endNdnZBNXQydTI4TWVtbHBReEVVU09rMm9uWlhpNEYvZm01dW9KR3loUUpPZDZ4c2JVd0ZabjVzVEZ1VjhncWFVUGw2bWZYN3RkWnNCMll2dHZhY3d2T1VWd0RmcHdDdnZDODM2VVpKMmFydGVjVWwxaFNUeWNvQlh2dVg5Yi9kbFpYQXg5L0pKSlM0YVVYRGJwdjdaaDZrc0l3UTJsUlVVcXJYZjM5cy9iN0NzbklLUmw5NG0vYUllVHN0YlNpU2s0Q2h2YzBaanpjN21nbTg5SzQxTFF3MjdLS2Jtak1XZmY1THk0QXZGZ0p2enpLK3grYThsY0RMNzlIN1p6YUhnMVlHLy9XVitlY1NubTFQT3ZEOFc1UXBZWFlGVG4reTk3QzI2OUwyL1ZRa3lncFhpNmx3MER1enFVaU0yWXBMZ0hmbkFLc3MyQjhwUE4zaDZ2OVJWVTk0SDRCaGxnOUZDRit4K3hDdzd6QXdZU2lsTXNaRW1YZXV5a29xUFcxRUlRMVBjdncwc0dZYk1KTFJ4QnNBN2gwUDdOaFAxZGI4WFZZTzdhZGJ1b0hmTTFPUGpGUEFjMjhCVTBkVFd4YXpDdjdzU2FlSmc1Tm56WGw5Z0lMQjU5K2lOaGxUUnVxdlZGaWI3RHpnUHpKRDc5Y3FLNmxWeXBKMS9Pd0lvVzdkVHVDZThiem51Q05ZMnJDTHJnZVRod05qQjJwdnYxT1hqSk8wOTl1WDdodUVIamZOR0ZjRmhBY2dBYUVRK2xSVTBvei9rblZVbG45WWI2citwZHFEekpXQ1FtRGJmbUR4V3MrdGNxclg1d3VwSVhsdGpjR2RpWTZrSC95UDVwazNMazlXVVVHOUxUZnNvc3A2UnErYXFTb3BCZVlzcG4yc0U0WUNRM29DOWV2cGY5M0tTbURQWWZwZVdWazlkKzBPZXZUdEFvenVEM1JLcE1wK2V1UVYwTTNtL0IrbDc1Yy9jamhvejlqT05QcStucE1Lb3FaYnZaVW1xbFNyTko4OEJ4dzhadTZZbkNrcEJlWXVwL3VJa2RmdUlWbzIwLys2bWVkcG90Q0tORmpoVFp3R2hFSUlJNVJYQUNzMjBhTkpMRFdUYmRjU2FCM1BtL1dycktUQTc4Z3Bta25lc2QvMzA0bUtpb0dYM2dQdUhFUFYxMktpMUJvamoreEhOKysrV2o2N3FwbHpjUW4xdkx1Y1I1K05vNW0wT20xVmVwT0tTem5BcHo5UStsdnZaS0IzSnlDcEJWWHlWRlZVVERmT2U5SnBmODBGTis1cTJMcVhIbEVSd0lDdVFISWJJS2s1VFVTb0tDd0NEaDJqeVp3TnU5elhVMDVZbzd3Q0tDdWpucFM1K1VCV0xuMStNMDRCQjQ1UXNSTmhuYndybERvL29KdmE4VWEwcTlDcnBKUmEwQ3haRDhRM0J2cDNBenEwQmhMajFWdmFaT2ZTeXZPbTNmUWJJY1JQM2RUTTJRWUFqbWxQRHdldzJpM0RFY0tmTkltbEZMVEdEV2oxSkRTRUFwNktTcUMwbEc0aXNuS0I4NWRvVnU5cXNidEhMSVF4R3R3Q3RHeDZyYTlpSktXVkJnVmMrK3lYVVZCN0tRYzRlNGtxTEZxWjhxcEZYRU9xY3Rzazl0cDNPWml5QWNyS0tRaThkQms0ZFY2cVJRb2hqQkZnQnhLYVVKRFlLQWFvRjNvalBiK2tGTWd2QkM1bUEwZFAwL1ZIQ09kTzJlYSsyYUw2SC93L0FBQUEvLy90M1Yrc0hGVUJ4L0h2NlJzaXFBU2pVUk44MEVRa3hoZ3hhSGhBUkI0SVFrU2RKaHFSaUVRSlNFZ0dRcUkrOE5CZ0VNaEJzWUNHWXYxWGFUbitpeVZnRkVJcDFScUpVbG9JaWFBMWhtcTFsTmJiWG01ZmRIell1MlM5dlgvMno4eWMzYjNmVHpMSnZUc3o1L3hlZjN2T3puUy9laCtEcjBTa1ZlQWZCd1ovNTU0MERRNGU3aHpUWXYrTHZqUmNVbnYrODkvT0YweCt5YVRSSGZjSTNqVUFJY1Vqd0I5Ymp5TkpraVJKYXN2MmhSK3M2Zmw3UjR0QkpFbVNKRW50ZW56aEJ4WkNTWklrU1pwK1IwT0tUeTM4c0xjUVB0WmlHRW1TSkVsU2V4NVo3TU5YQ21GSThWL0FydGJpU0pJa1NaTGE4cXZGUGx6VHowV1NKRW1TcEluV1Z5SDhkUXRCSkVtU0pFbnRlU0drK1B4aUp4WVd3aDJBYjhLV0pFbVNwT214ZGFrVC8xY0lRNHJIZ0Y4MEhrZVNKRW1TMUphMDFJbUZLNFFBOXpjWVJKSWtTWkxVbmtNaHhVZVhPcmxZSVh3UW1Hc3VqeVJKa2lTcEpUOWE3dVJ4aFRDa09JZmJSaVZKa2lScEdteFo3dVJpSzRRQW14b0lJa21TSkVscXo5OURpbzh2ZDhHaWhUQ2t1QlU0MUVna1NaSWtTVklidnJQU0JVdXRFQUw4c01ZZ2tpUkprcVIyalZRSWYxQmpFRW1TSkVsU2UzYUdGUGV1ZE5HU2hUQ2srQVN3cDlaSWtpUkprcVEyM05QUFJjdXRFQUo4cllZZ2tpUkprcVQySEFncGJ1em53bVVMWVVoeEU3Q3Zsa2lTSkVtU3BEYmMwdStGSzYwUUF0dzZRaEJKa2lSSlVudU9BTi91OStKK0N1RUc0S1doNDBpU0pFbVMybkpIU1BGSXZ4ZXZXQWhEaXJQQTdTTkZraVJKa2lRMWJRNjRiWkFiK2xraEJMaVR6dEtqSkVtU0pHazgzUlZTUER6SURYMFZ3cERpSVdEOVVKRWtTWklrU1cyNGVkQWIrbDBoaE02MjBibEJKNUFrU1pJa05lNmJJY1VYQjcycDcwSVlVandBM0RUb0JKSWtTWktrUmgwQmJoem14akRvRFZWUjdnUGVOTXhra2lSSmtxVGFYUmRTak1QY09NaVcwYTRiaHBsSWtpUkprbFM3dncxYkJtR0lRaGhTM0FROE1leUVraVJKa3FUYVhEM0t6Y09zRUFKOGRwUkpKVW1TSkVrajJ4SlNmR0NVQVlZcWhDSEZaeGp5UjR1U0pFbVNwSkc5QkZ3MTZpQURQMVNtVjFXVVR3Tm5qQnBDa2lSSmtqU1FUNFVVN3h0MWtHRzNqSFpkT21vQVNaSWtTZEpBZmw1SEdZUVJDMkZJOFVuZ3kzVUVrU1JKa2lTdGFEOXdlVjJEamJSbHRLc3F5cDNBKytzWVM1SWtTWkswcEhOQ2l0dnJHbXpVTGFOZGE0SFptc2FTSkVtU0pCM3Y5anJMSU5TMFFnaFFGZVZhWUV0ZDQwbVNKRW1TWHJFN3BQanV1Z2V0YTRXUWtPTDl3RjExalNkSmtpUkpBdUFvY0hFVEE5ZTJRdGhWRmVVdW9QYm1La21TSkVtcjFNVWh4YTFOREZ6YkNtR1BTNENaQnNhVkpFbVNwTlhtdHFiS0lEU3dRZ2hRRmVVNXdMWW14cFlrU1pLa1ZlTEJrT0tGVFU3UXhBb2hJY1hIcVBIZEdKSWtTWksweXV3QlB0SDBKSTBVUW9DUTRrYmdwcWJHbHlSSmtxUXB0UTg0UDZRNDEvUkVqV3daN1ZVVjVRYmdjMDNQSTBtU0pFbFQ0QkJ3ZGtqeDJUWW1hMnlGc0N1a2VBVndUOVB6U0pJa1NkS0VPd3A4c0sweUNDMFVRb0NRNHVlQjlXM01KVW1TSkVrVDZHVTYyMFIzdHpscEs0VVFJS1I0RFJEYm1rK1NKRW1TSnNReDRNS1E0dS9hbnJpMVFnZ1FVcndPV05mbW5KSWtTWkkweG1hQmMwT0syM0pNM3ZoRFpSWlRGZVgxd0swNTVwWWtTWktrTVRFRGZDaWsrSWRjQWJJVVFvQ3FLSzhGdnA1cmZrbVNKRW5LNkNEdzRaRGlycHdoc2hWQ2dLb29Qd2I4SkdjR1NaSWtTV3JabjRBTFFvcC95UjBrYXlFRXFJcnlMT0FCNE5UY1dTUkpraVNwWVR1QWo0UVUvNTA3Q0l4QklRU29pdkt0d0VQQU96SkhrU1JKa3FTbTNEdi9udmF4MGVwVFJwY1NVdndyY0NidzQ4eFJKRW1TSktsdWM4QVY0MVlHWVV4V0NIdFZSZmtGNEZ1NWMwaVNKRWxTRFo0RFBoNVMzSk03eUdMR3JoQUNWRVg1SHVCbndHbTVzMGlTSkVuU2tEYlRXUm1jelIxa0tXTlpDQUdxb253MWNDK3dObmNXU1pJa1NSckFMSEJOU0hGajdpQXJHZHRDMkZVVjVXWEFuY0NKdWJOSWtpUkowZ3Flb3JORjlNKzVnL1JqN0FzaFFGV1Vid08rQzV5ZE9Zb2tTWklrTGVXckljV3Y1QTR4aUlrb2hGMVZVVjRGM0F5Y2xEdUxKRW1TSk0zYkJYeG1YQjhjczV5SktvUUFWVkcrR2JnYnVDaDNGa21TSkVtcjJqSGd4cERpTGJtRERHdmlDbUZYVlpUbkFldnhaZmFTSkVtUzJyY1IrRkpJOForNWc0eGlZZ3RoMS94N0M5Y0JyOCtkUlpJa1NkTFUrdzF3WlVqeDZkeEI2akR4aFJDZ0tzb1RnYXVCNjdFWVNwSWtTYXJmZG1CZFNQSGgzRUhxTkJXRnNLc3F5aE9BSzRFYmdEZG1qaU5Ka2lScDhqMU1wd2h1engya0NWTlZDSHRWUmZscDRJdkFXYm16U0pJa1Nab29Md1AzQWQrWXhDZUhEbUpxQzJGWFZaVHZCYTRGTHMyZFJaSWtTZEpZZXg2NEEvaGVTSEVtZDVnMlRIMGg3S3FLOHJYQTVYUzJsTDQ5Y3h4SmtpUko0K09ud04zVDl2dkFmcXlhUXRpcktzcnpnY3VBUzRCWFpZNGpTWklrcVgzUEFkOEhOb1FVOStjT2s4dXFMSVJkOHcraHVRajRKUERSekhFa1NaSWtOV3N2c0JuWUhGTGNuVHZNT0ZqVmhiRFgvS3NyemdNdW1EOU95NXRJa2lSSlVnMGVCUjRDZmpudEQ0Z1pob1Z3Q1ZWUm5nNmNTK2NwcFIvQTN4MUtraVJKNDI0VytEM3dXMkFuc0Mya09KczMwbml6RVBhcEtzcFRnUGNCN3dMZUNad0JuQTZjbERPWEpFbVN0RXJ0Qlo2WlA1NEZkb2NVbjh3YmFmSllDRWRVRmVXcHdGdDZqamNBcndOTzdqbE9BRTZoVXg1UEJsNlRKYXdrU1pJMG5nNEFNL1BIWWVCb3ovOHp3RUhnaGU0UlV0eWJLZWZVK1I5aUtPd3VqTTMyR2dBQUFBQkpSVTVFcmtKZ2dnPT0iIGFsdD0iU2NhZiBMb2dvIj4KICAgIDwvaGVhZGVyPgoKICAgIDxtYWluPgogICAgICAgIDxoMT5TdWNjZXNzIPCfmoA8L2gxPgogICAgICAgIDxoMz5GZWVsIGZyZWUgdG8gY2xvc2UgdGhpcyB3aW5kb3cgYW5kIGhlYWQgYmFjayB0byB5b3VyIHRlcm1pbmFsIHRvIGZpbmlzaCB0aGUgY3JlYXRpb24uPC9oMz4KICAgIDwvbWFpbj4KCiAgICA8Zm9vdGVyPgogICAgICAgIDxwPsKpIDIwMjQgU2l4IEZlZXQgVXAsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC48L3A+CiAgICA8L2Zvb3Rlcj4KPC9ib2R5Pgo8L2h0bWw+Cg==' + self.wfile.write(base64.b64decode(encoded_success_resp)) + # Signal the parent process + os.kill(os.getppid(), signal.SIGUSR1) + else: + self.send_response(400) + self.send_header('Content-type', 'text/html') + self.end_headers() + self.wfile.write(b"Error: No code provided in the URL.") + +def run_server(port=51111): + server_address = ('', port) + httpd = HTTPServer(server_address, TokenHandler) + httpd.serve_forever() + +if __name__ == '__main__': + run_server() +EOF + + # Function to handle the SIGUSR1 signal + code_received() { + # Token received. Proceeding to kill HTTP server process. + kill $server_pid + } + + # Set up the signal handler + trap code_received SIGUSR1 + + # Start the Python server in the background + python temp_server.py & + server_pid=$! + + # Example opening of the browser to auth/reg user + python -c "import webbrowser; webbrowser.open('https://scaf.withpassage.com/authorize?response_type=code&client_id=961JRDH4c4Sin8LYGGbI0Lb7&redirect_uri=http://localhost:51111&scope=openid%20email')" + + echo "Waiting for authorization..." + + # Wait for the Python script to exit + wait $server_pid + + # Read the code + code=$(cat code.txt) + + # Passage OIDC client credentials – move them? (for now, they are hardcoded) + oidc_client_id="961JRDH4c4Sin8LYGGbI0Lb7" + oidc_client_secret="gyrskWRKfYccaCffwJGKa0hqekPtbTNJ" + + # Perform the curl request and capture the response + response=$(curl -s --location --request POST "https://scaf.withpassage.com/token?grant_type=authorization_code&code=$code&redirect_uri=http%3A%2F%2Flocalhost%3A51111&client_id=$oidc_client_id&client_secret=$oidc_client_secret" \ + --header 'Content-Type: application/x-www-form-urlencoded' \ + --data '') + + # Use grep and sed to extract the access_token from the JSON response + access_token=$(echo $response | grep -o '"access_token":"[^"]*"' | sed -e 's/"access_token":"\([^"]*\)"/\1/') + + # Clean up the Python HTTP server script / code.txt + rm temp_server.py + rm code.txt + + # Check if the access_token exists and is not empty + if [[ -n "$access_token" ]]; then + echo "Authentication has been completed." + # write challenge metadata to .scaf-challenge.json + cat << EOF > .scaf-challenge.json +{ + "access_token": "$access_token", + "session_id": "$(uuidgen)", + "base_url": "https://dmxla4ubt9.execute-api.us-east-1.amazonaws.com" +} +EOF + else + echo "Error: Access token was not retrieved." + exit 1 + fi +} + +start_challenge_session() { + # Start a new session and report start timestamp to scaf challenge report API + echo "Starting challenge session..." + + # Extract token, session_id, and base_url from the challenge config file + config=$(cat $CHALLENGE_CONFIG_PATH) + token=$(echo $config | grep -o '"access_token": "[^"]*"' | sed -e 's/"access_token": "\([^"]*\)"/\1/') + base_url=$(echo $config | grep -o '"base_url": "[^"]*"' | sed -e 's/"base_url": "\([^"]*\)"/\1/') + session_id=$(echo $config | grep -o '"session_id": "[^"]*"' | sed -e 's/"session_id": "\([^"]*\)"/\1/') + start=$(python -c "import time; print('{:.6f}'.format(time.time()))") + + # Make report API call to kick off the session + status_code=$(curl -o /dev/null -s -w "%{http_code}" --location "$base_url/Prod/report" \ + --header "Content-Type: application/json" \ + --header "Authorization: Bearer $token" \ + --data "{ \"sessionid\": \"$session_id\", \"start\": \"$start\" }") + + # Check whether session has been started successfully + if [[ $status_code -ne 200 ]]; then + echo "Failed to start the challenge session: $status_code" + # Force skip challenge if failed to start the session + SCAF_CHALLENGE="n" + fi +} + +if [[ "$SCAF_CHALLENGE" == "y" ]]; then + start_challenge_oauthflow + if [[ -f "$CHALLENGE_CONFIG_PATH" ]]; then + start_challenge_session + else + # Force skip challenge as it cannot be started without config file + SCAF_CHALLENGE="n" + fi +else + echo "Skipping challenge." +fi + echo "DOCKER_RUN_OPTIONS: $DOCKER_RUN_OPTIONS" echo "COOKIECUTTER_OPTIONS: $COOKIECUTTER_OPTIONS" echo "REPO_URL: $REPO_URL" +# Challenge config shall exist now if SCAF_CHALLENGE is set to "y" at this point +CHALLENGE_CONFIG="" +if [[ "$SCAF_CHALLENGE" == "y" ]]; then + CHALLENGE_CONFIG=$(cat $CHALLENGE_CONFIG_PATH) +fi + IMAGE_TAG=${IMAGE_TAG:-latest} docker run --rm $DOCKER_RUN_OPTIONS -v "$(pwd):/home/scaf/out" \ -e HOST_UID="$(id -u)" \ -e HOST_GID="$(id -g)" \ + -e CHALLENGE_CONFIG="$CHALLENGE_CONFIG" \ docker.io/sixfeetup/scaf:$IMAGE_TAG \ cookiecutter \ $COOKIECUTTER_OPTIONS \ $REPO_URL \ - project_slug="$COOKIECUTTER_SLUG" + project_slug="$COOKIECUTTER_SLUG" \ + _challenge="$SCAF_CHALLENGE" + # Check if cookiecutter was successful if [ $? -eq 0 ]; then - kind create cluster --name $CLUSTER_SLUG - cd $COOKIECUTTER_SLUG - make compile - echo "Dependencies compiled successfully." - pwd - echo "Performing initial commit." - git add . - git commit -m "Initial commit" - echo - party_popper + kind create cluster --name $CLUSTER_SLUG + cd $COOKIECUTTER_SLUG + make compile + echo "Dependencies compiled successfully." + pwd + echo "Performing initial commit." + git add . + git commit -m "Initial commit" + party_popper else - echo "Failed to create project." - exit 1 + echo "Failed to create project." + exit 1 fi - diff --git a/{{cookiecutter.project_slug}}/backend/config/settings/base.py b/{{cookiecutter.project_slug}}/backend/config/settings/base.py index 139eefed..377015da 100644 --- a/{{cookiecutter.project_slug}}/backend/config/settings/base.py +++ b/{{cookiecutter.project_slug}}/backend/config/settings/base.py @@ -86,6 +86,9 @@ LOCAL_APPS = [ "{{ cookiecutter.project_slug }}.users.apps.UsersConfig", + {% if cookiecutter._challenge == "y" -%} + "{{ cookiecutter.project_slug }}.challenge.apps.ChallengeConfig", + {%- endif %} # Your stuff: custom apps go here ] # https://docs.djangoproject.com/en/dev/ref/settings/#installed-apps @@ -331,5 +334,14 @@ } {%- endif %} + +{%- if cookiecutter._challenge == "y" %} +# ------------------------------------------------------------------------------ +# CHALLENGE settings +CHALLENGE_SESSION_ID = env("CHALLENGE_SESSION_ID") +CHALLENGE_JWT_TOKEN = env("CHALLENGE_JWT_TOKEN") +CHALLENGE_BASE_URL = env("CHALLENGE_BASE_URL") +{%- endif %} + # Your stuff... # ------------------------------------------------------------------------------ diff --git a/{{cookiecutter.project_slug}}/backend/{{cookiecutter.project_slug}}/challenge/__init__.py b/{{cookiecutter.project_slug}}/backend/{{cookiecutter.project_slug}}/challenge/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/{{cookiecutter.project_slug}}/backend/{{cookiecutter.project_slug}}/challenge/admin.py b/{{cookiecutter.project_slug}}/backend/{{cookiecutter.project_slug}}/challenge/admin.py new file mode 100644 index 00000000..9bd3bf98 --- /dev/null +++ b/{{cookiecutter.project_slug}}/backend/{{cookiecutter.project_slug}}/challenge/admin.py @@ -0,0 +1,8 @@ +from django.contrib import admin + +from .models import Challenge + + +@admin.register(Challenge) +class ChallengeAdmin(admin.ModelAdmin): + list_display = ("id", "is_completed") diff --git a/{{cookiecutter.project_slug}}/backend/{{cookiecutter.project_slug}}/challenge/apps.py b/{{cookiecutter.project_slug}}/backend/{{cookiecutter.project_slug}}/challenge/apps.py new file mode 100644 index 00000000..aa671962 --- /dev/null +++ b/{{cookiecutter.project_slug}}/backend/{{cookiecutter.project_slug}}/challenge/apps.py @@ -0,0 +1,16 @@ +# {{cookiecutter.project_slug}}/challenge/apps.py +from django.apps import AppConfig + + +class ChallengeConfig(AppConfig): + name = "{{cookiecutter.project_slug}}.challenge" + + def ready(self): + from django.db.models.signals import post_migrate + # Connect post-migrate signal to make sure that this comes + # after migrations are done. + post_migrate.connect(self.report_readiness, sender=self) + + def report_readiness(self, **kwargs): + from .utils import report_readiness + report_readiness() diff --git a/{{cookiecutter.project_slug}}/backend/{{cookiecutter.project_slug}}/challenge/migrations/0001_initial.py b/{{cookiecutter.project_slug}}/backend/{{cookiecutter.project_slug}}/challenge/migrations/0001_initial.py new file mode 100644 index 00000000..e264ccec --- /dev/null +++ b/{{cookiecutter.project_slug}}/backend/{{cookiecutter.project_slug}}/challenge/migrations/0001_initial.py @@ -0,0 +1,25 @@ +# Generated by Django 5.1.1 on 2024-09-15 01:38 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Challenge', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('is_completed', models.BooleanField(default=False, help_text='Designates whether scaf challenge is completed or not.', verbose_name='completion status')), + ], + options={ + 'verbose_name': 'challenge', + 'verbose_name_plural': 'challenges', + }, + ), + ] diff --git a/{{cookiecutter.project_slug}}/backend/{{cookiecutter.project_slug}}/challenge/migrations/__init__.py b/{{cookiecutter.project_slug}}/backend/{{cookiecutter.project_slug}}/challenge/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/{{cookiecutter.project_slug}}/backend/{{cookiecutter.project_slug}}/challenge/models.py b/{{cookiecutter.project_slug}}/backend/{{cookiecutter.project_slug}}/challenge/models.py new file mode 100644 index 00000000..77ea0740 --- /dev/null +++ b/{{cookiecutter.project_slug}}/backend/{{cookiecutter.project_slug}}/challenge/models.py @@ -0,0 +1,13 @@ +from django.db import models + + +class Challenge(models.Model): + is_completed = models.BooleanField( + verbose_name="completion status", + help_text="Designates whether scaf challenge is completed or not.", + default=False, + ) + + class Meta: + verbose_name = "challenge" + verbose_name_plural = "challenges" diff --git a/{{cookiecutter.project_slug}}/backend/{{cookiecutter.project_slug}}/challenge/utils.py b/{{cookiecutter.project_slug}}/backend/{{cookiecutter.project_slug}}/challenge/utils.py new file mode 100644 index 00000000..b05afa6b --- /dev/null +++ b/{{cookiecutter.project_slug}}/backend/{{cookiecutter.project_slug}}/challenge/utils.py @@ -0,0 +1,37 @@ +import http.client +import json +import logging +import time + +from django.conf import settings + +from .models import Challenge + +logger = logging.getLogger(__name__) + + +def report_readiness(): + if Challenge.objects.filter(is_completed=True).exists(): + logger.info("Challenge already completed") + return + + base_url = settings.CHALLENGE_BASE_URL.replace("https://", "") + conn = http.client.HTTPSConnection(base_url) + payload = json.dumps( + { + "sessionid": settings.CHALLENGE_SESSION_ID, + "end": "{:.6f}".format(time.time()), + } + ) + headers = { + "Content-Type": "application/json", + "Authorization": f"Bearer {settings.CHALLENGE_JWT_TOKEN}", + } + conn.request("POST", "/Prod/report", payload, headers) + res = conn.getresponse() + data = res.read().decode("utf-8") + logger.info("Response[%d]: %s", res.status, data) + + if res.status == 200: + Challenge.objects.create(is_completed=True) + logger.info("Challenge completed") diff --git a/{{cookiecutter.project_slug}}/k8s/base/app.configmap.yaml b/{{cookiecutter.project_slug}}/k8s/base/app.configmap.yaml index 72e976c8..6961bb72 100644 --- a/{{cookiecutter.project_slug}}/k8s/base/app.configmap.yaml +++ b/{{cookiecutter.project_slug}}/k8s/base/app.configmap.yaml @@ -24,7 +24,12 @@ data: FLOWER_BROKER_URL: "redis://redis:6379/0" FLOWER_ADDRESS: "0.0.0.0" FLOWER_PORT: "5555"{%- endif %} - +{%- if cookiecutter._challenge == "y" %} + # Scaf challenge settings + CHALLENGE_SESSION_ID: __CHALLENGE_SESSION_ID__ + CHALLENGE_JWT_TOKEN: __CHALLENGE_JWT_TOKEN__ + CHALLENGE_BASE_URL: __CHALLENGE_BASE_URL__ +{%- endif %} # S3 storage access DJANGO_AWS_REGION_NAME: "{{ cookiecutter.aws_region }}" DJANGO_AWS_STORAGE_BUCKET_NAME: "CHANGEME_S3_BUCKET_NAME" From 603180d5751ab8a287b8a2cf495e39237556b637 Mon Sep 17 00:00:00 2001 From: Calvin Hendryx-Parker Date: Tue, 17 Sep 2024 17:16:39 -0400 Subject: [PATCH 06/21] ci: Fix GitHub action to build for amd and arm architectures and tag latest build with latest (#382) Related to #381 Update GitHub action to build and push Docker images for both amd and arm architectures, and tag the latest build with 'latest'. * **Build and push Docker image**: Update the `docker/build-push-action` step to build for both amd and arm architectures. * **Tagging**: Add a new tag `sixfeetup/scaf:latest` to the `tags` field in the `docker/build-push-action` step. * **Platforms**: Ensure the `platforms` field includes both `linux/amd64` and `linux/arm64`. --- For more details, open the [Copilot Workspace session](https://copilot-workspace.githubnext.com/sixfeetup/scaf/issues/381?shareId=6cb64e80-01c6-4e78-b9e5-14e4952cbd75). --- .github/workflows/setup-project.yaml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/setup-project.yaml b/.github/workflows/setup-project.yaml index 37c3d9f4..dbd133a3 100644 --- a/.github/workflows/setup-project.yaml +++ b/.github/workflows/setup-project.yaml @@ -24,11 +24,14 @@ jobs: uses: docker/build-push-action@v5 with: push: true - tags: sixfeetup/scaf:${{ github.sha }} + tags: | + sixfeetup/scaf:${{ github.sha }} + sixfeetup/scaf:latest context: . file: ./Dockerfile cache-from: type=gha cache-to: type=gha,mode=max + platforms: linux/amd64,linux/arm64 setup: environment: dev From 58090b56f65f35cb2c68258f0aa4f3aaf8509417 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roch=C3=A9=20Compaan?= Date: Wed, 18 Sep 2024 09:27:34 +0200 Subject: [PATCH 07/21] feat: op inject secrets (close #368) --- {{cookiecutter.project_slug}}/Makefile | 33 +++++++++++++++---- .../k8s/templates/secrets.yaml.template | 16 ++++----- 2 files changed, 35 insertions(+), 14 deletions(-) diff --git a/{{cookiecutter.project_slug}}/Makefile b/{{cookiecutter.project_slug}}/Makefile index 4ad36ac5..44203ff0 100644 --- a/{{cookiecutter.project_slug}}/Makefile +++ b/{{cookiecutter.project_slug}}/Makefile @@ -122,13 +122,34 @@ shell-frontend: secure: ## Analyze dependencies for security issues $(KUBECTL_EXEC_BACKEND) -c "safety check" -sandbox-secrets: ## Substitute with secrets template with env variable and run kubeseal - @echo "Sealing secrets from sandbox template to $$(kubectl config current-context)" - NAMESPACE={{ cookiecutter.project_dash }}-sandbox envsubst < k8s/templates/secrets.yaml.template | kubeseal --format yaml > k8s/sandbox/secrets.yaml +DEBUG ?= false +secrets: + @$(call check_var,ENVIRONMENT) + @echo "Creating sealed secrets for $$(kubectl config current-context) cluster" + kubectl config get-contexts --no-headers | \ + grep {{ cookiecutter.project_slug }}-$(ENVIRONMENT) && \ + kubectl config use-context admin@{{ cookiecutter.project_slug }}-$(ENVIRONMENT) + ENVIRONMENT=$(ENVIRONMENT) \ + envsubst < k8s/templates/secrets.yaml.template | op inject | if [ "$(DEBUG)" = "true" ]; then cat; else kubeseal -n {{ cookiecutter.project_slug }}-$(ENVIRONMENT) --format yaml > k8s/$(ENVIRONMENT)/secrets.yaml; fi + +sandbox-secrets: ## Create sealed secrets for sandbox + $(MAKE) secrets ENVIRONMENT=sandbox + +debug-sandbox-secrets: ## Debug sandbox secrets + $(MAKE) secrets ENVIRONMENT=sandbox DEBUG=true + +staging-secrets: ## Create sealed secrets for sandbox + $(MAKE) secrets ENVIRONMENT=sandbox + +debug-staging-secrets: ## Debug sandbox secrets + $(MAKE) secrets ENVIRONMENT=sandbox DEBUG=true + +prod-secrets: ## Create sealed secrets for prod + $(MAKE) secrets ENVIRONMENT=prod + +debug-prod-secrets: ## Create sealed secrets for prod + $(MAKE) secrets ENVIRONMENT=prod DEBUG=true -prod-secrets: ## Substitute with secrets template with env variable and run kubeseal - @echo "Sealing secrets from prod template to $$(kubectl config current-context)" - NAMESPACE={{ cookiecutter.project_dash }}-prod envsubst < k8s/templates/secrets.yaml.template | kubeseal --format yaml > k8s/prod/secrets.yaml argocd-app: envsubst < k8s/templates/argocd.application.yaml.template | kubeseal --format yaml > k8s/argocd/application.yaml diff --git a/{{cookiecutter.project_slug}}/k8s/templates/secrets.yaml.template b/{{cookiecutter.project_slug}}/k8s/templates/secrets.yaml.template index 58513ec0..e6bf337a 100644 --- a/{{cookiecutter.project_slug}}/k8s/templates/secrets.yaml.template +++ b/{{cookiecutter.project_slug}}/k8s/templates/secrets.yaml.template @@ -1,14 +1,14 @@ apiVersion: v1 stringData: - AWS_S3_ACCESS_KEY_ID: $AWS_S3_ACCESS_KEY_ID - AWS_S3_SECRET_ACCESS_KEY: $AWS_S3_SECRET_ACCESS_KEY - AWS_SES_ACCESS_KEY_ID: $AWS_SES_ACCESS_KEY_ID - AWS_SES_SECRET_ACCESS_KEY: $AWS_SES_SECRET_ACCESS_KEY - POSTGRES_PASSWORD: $POSTGRES_PASSWORD - DATABASE_URL: $DATABASE_URL - DJANGO_SECRET_KEY: $DJANGO_SECRET_KEY + AWS_S3_ACCESS_KEY_ID: op://{{ cookiecutter.project_name }}/$ENVIRONMENT secrets/AWS_S3_ACCESS_KEY_ID + AWS_S3_SECRET_ACCESS_KEY: op://{{ cookiecutter.project_name }}/$ENVIRONMENT secrets/AWS_S3_SECRET_ACCESS_KEY +{%- if cookiecutter.mail_service == 'Amazon SES' %} + AWS_SES_ACCESS_KEY_ID: op://{{ cookiecutter.project_name }}/$ENVIRONMENT secrets/AWS_SES_ACCESS_KEY_ID + AWS_SES_SECRET_ACCESS_KEY_ID: op://{{ cookiecutter.project_name }}/$ENVIRONMENT secrets/AWS_SES_SECRET_ACCESS_KEY_ID{% endif %} + DJANGO_SECRET_KEY: op://{{ cookiecutter.project_name }}/$ENVIRONMENT secrets/DJANGO_SECRET_KEY {%- if cookiecutter.mail_service == 'Mailgun' %} - MAILGUN_API_KEY: $MAILGUN_API_KEY{%- endif %} + MAILGUN_API_KEY: op://{{ cookiecutter.project_name }}/$ENVIRONMENT secrets/MAILGUN_API_KEY"{%- endif %} + kind: Secret metadata: name: secrets-config From cea1602d99e5a03e63fc8cffcc842844bf648897 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roch=C3=A9=20Compaan?= Date: Wed, 18 Sep 2024 09:35:32 +0200 Subject: [PATCH 08/21] fix: mailhog port config (closes #249) --- {{cookiecutter.project_slug}}/k8s/mailhog/mailhog.yaml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/{{cookiecutter.project_slug}}/k8s/mailhog/mailhog.yaml b/{{cookiecutter.project_slug}}/k8s/mailhog/mailhog.yaml index 420f23bd..f3f35171 100644 --- a/{{cookiecutter.project_slug}}/k8s/mailhog/mailhog.yaml +++ b/{{cookiecutter.project_slug}}/k8s/mailhog/mailhog.yaml @@ -10,7 +10,11 @@ spec: app: mailhog ports: - port: 8025 + targetPort: smtp-server-ui + name: smtp-server-ui + - port: 1025 targetPort: smtp-server + name: smtp-server --- apiVersion: apps/v1 kind: Deployment @@ -32,5 +36,7 @@ spec: - name: mailhog image: mailhog/mailhog:v1.0.0 ports: - - name: smtp-server + - name: smtp-server-ui containerPort: 8025 + - name: smtp-server + containerPort: 1025 From 32de8c76b260f81774e087dc221c237767a0049a Mon Sep 17 00:00:00 2001 From: daveoconnor Date: Thu, 19 Sep 2024 07:27:31 -0700 Subject: [PATCH 09/21] feat: added local registry support and improved setup (close #353) --- cookiecutter.json | 5 +- scaf | 2 +- {{cookiecutter.project_slug}}/Makefile | 67 ++++++++++++------ .../k8s/scripts/kind-with-registry.sh | 70 +++++++++++++++++++ 4 files changed, 122 insertions(+), 22 deletions(-) create mode 100755 {{cookiecutter.project_slug}}/k8s/scripts/kind-with-registry.sh diff --git a/cookiecutter.json b/cookiecutter.json index f322ab36..691c9702 100644 --- a/cookiecutter.json +++ b/cookiecutter.json @@ -36,5 +36,8 @@ } }, "repo_name": "{{ cookiecutter.project_slug }}", - "repo_url": "git@{{ cookiecutter.source_control_provider }}:{{ cookiecutter.source_control_organization_slug }}/{{ cookiecutter.project_slug }}.git" + "repo_url": "git@{{ cookiecutter.source_control_provider }}:{{ cookiecutter.source_control_organization_slug }}/{{ cookiecutter.project_slug }}.git", + "_copy_without_render": [ + "k8s/scripts/kind-with-registry.sh" + ] } diff --git a/scaf b/scaf index 66c151dd..04ba0ccb 100755 --- a/scaf +++ b/scaf @@ -231,8 +231,8 @@ docker run --rm $DOCKER_RUN_OPTIONS -v "$(pwd):/home/scaf/out" \ # Check if cookiecutter was successful if [ $? -eq 0 ]; then - kind create cluster --name $CLUSTER_SLUG cd $COOKIECUTTER_SLUG + make setup make compile echo "Dependencies compiled successfully." pwd diff --git a/{{cookiecutter.project_slug}}/Makefile b/{{cookiecutter.project_slug}}/Makefile index 44203ff0..f4167a12 100644 --- a/{{cookiecutter.project_slug}}/Makefile +++ b/{{cookiecutter.project_slug}}/Makefile @@ -2,15 +2,21 @@ KUBECTL_EXEC_BACKEND = kubectl exec -it $$(kubectl get pods -l app=backend -o js {% if cookiecutter.create_nextjs_frontend == "y" %} KUBECTL_EXEC_FRONTEND = kubectl exec -it $$(kubectl get pods -l app=frontend -o jsonpath="{.items[0].metadata.name}") -- bash {% endif %} +PREREQUISITE_COMMANDS := kubectl tilt kind -# colors -BLUE:=$(shell echo "\033[0;36m") -GREEN:=$(shell echo "\033[0;32m") -YELLOW:=$(shell echo "\033[0;33m") -RED:=$(shell echo "\033[0;31m") -END:=$(shell echo "\033[0m") +# escape character for colors +ESC := \033 + +# color variables +BLUE := $(ESC)[0;36m +GREEN := $(ESC)[0;32m +YELLOW := $(ESC)[0;33m +RED := $(ESC)[0;31m +END := $(ESC)[0m PROJECT_SLUG:="{{ cookiecutter.project_slug }}" +REGISTRY_HOSTNAME := localhost +REGISTRY_PORT := 5001 ## Release/Deployment Targets @@ -66,7 +72,7 @@ backend/requirements/production.txt: compile backend/requirements/tests.txt: compile setup: - @echo " $(YELLOW)⛭$(END) Checking if the setup is correct and all prerequisites are installed..." + @printf " $(YELLOW)⛭$(END) Checking if the setup is correct and all prerequisites are installed..." @MISSING=""; \ for exec in $(PREREQUISITE_COMMANDS); do \ if ! which $$exec > /dev/null 2>&1; then \ @@ -74,25 +80,46 @@ setup: fi; \ done; \ if [ -n "$$MISSING" ]; then \ - echo " $(RED)❌$(END)Missing executables:$$MISSING. These must be installed by you to continue"; \ + printf " $(RED)❌$(END)Missing executables:$$MISSING. These must be installed by you to continue"; \ false; \ else \ - echo " $(GREEN)✔️$(END) All prerequisites are installed."; \ + printf " $(GREEN)✔️$(END) All prerequisites are installed."; \ fi @CURRENT_CONTEXT="$$(kubectl config current-context 2>&1)"; \ - if [ "$$CURRENT_CONTEXT" = "kind-$(PROJECT_SLUG)" ]; then \ - echo " $(GREEN)✔️$(END) The kubectl context is correctly set to kind-$(PROJECT_SLUG). Run 'tilt up' to start your cluster!"; \ + CLUSTER_NAME=$(shell echo $(PROJECT_SLUG) | sed 's/_/-/g'); \ + NEW_CONTEXT=kind-$$CLUSTER_NAME; \ + CLUSTER_EXISTS = $(shell kind get clusters | grep -w $$CLUSTER_NAME$$ || true); \ + if [ -z "$$CLUSTER_EXISTS" ]; then \ + printf " $(YELLOW)⛭$(END) No cluster found for $$CLUSTER_NAME. Creating your cluster. Please wait, this may take a couple of minutes on a slower machine..."; \ + k8s/scripts/kind-with-registry.sh $$CLUSTER_NAME > /tmp/scaf_cluster.log 2>&1; \ + printf " $(GREEN)✔️$(END) $$NEW_CONTEXT cluster and context created."; \ + printf " $(BLUE)🗣️ $(END) Pre-loading upstream images into cluster."; \ + docker pull postgres:16; \ + docker pull redis:6.0.5; \ + docker pull mailhog/mailhog:v1.0.0; \ + kind load docker-image postgres:16 --name $$CLUSTER_NAME; \ + kind load docker-image redis:6.0.5 --name $$CLUSTER_NAME; \ + kind load docker-image mailhog/mailhog:v1.0.0 --name $$CLUSTER_NAME; \ + printf " $(GREEN)✔️$(END) $$NEW_CONTEXT cluster and context created."; \ + printf " $(BLUE)🗣️ Remember, you can safely run \"make setup\" any time to switch between Scaf projects.$(END)"; \ + printf " $(GREEN)✔️$(END) Finished! Run 'tilt up' to start your cluster! "; \ else \ - echo " $(YELLOW)⛭$(END) Current kubectl context is not 'kind-$(PROJECT_SLUG)'. Switching context now..."; \ - if [ -z "$$(kubectl config get-contexts -o name | grep -w 'kind-$(PROJECT_SLUG)$$')" ]; then \ - echo " $(YELLOW)⛭$(END) No context found for kind-$(PROJECT_SLUG). Creating one. Please wait, this may take a couple of minutes on a slower machine..."; \ - kind create cluster --name $(PROJECT_SLUG) 1>/dev/null 2>/tmp/scaf_error.log; \ - echo " $(GREEN)✔️$(END) kind-$(PROJECT_SLUG) cluster and context created."; \ - echo " $(BLUE)🗣️ Remember, you can safely run \"make setup\" any time to switch between Scaf projects.$(END)"; \ + if [ "$$CURRENT_CONTEXT" = "$$NEW_CONTEXT" ]; then \ + printf " $(GREEN)✔️$(END) The kubectl context is correctly set to '$$NEW_CONTEXT'. Run 'tilt up' to start your cluster!"; \ + else \ + kubectl config use-context $$NEW_CONTEXT 1>/dev/null 2>/tmp/scaf_error.log; \ + printf " $(GREEN)✔️$(END) Context switched to $$NEW_CONTEXT. Run 'tilt up' to start your cluster! "; \ fi; \ - kubectl config use-context kind-$(PROJECT_SLUG) 1>/dev/null 2>/tmp/scaf_error.log; \ - echo " $(GREEN)✔️$(END) Context switched to kind-$(PROJECT_SLUG). Run 'tilt up' to start your cluster! "; \ - fi + fi; \ + +list-local-docker-images: + @printf " $(YELLOW)⛭$(END) Listing local docker images..." + @curl -s "$(REGISTRY_HOSTNAME):$(REGISTRY_PORT)/v2/_catalog" | jq -r '.repositories[]' | while read REPO; do \ + echo "Repository: $$REPO"; \ + curl -s "$(REGISTRY_HOSTNAME):$(REGISTRY_PORT)/v2/$$REPO/tags/list" | jq -r '.tags[]' | while read TAG; do \ + echo " Tag: $$TAG"; \ + done; \ + done outdated: ## Show all the outdated packages with their latest versions in the container $(KUBECTL_EXEC_BACKEND) -c "pip list --outdated" diff --git a/{{cookiecutter.project_slug}}/k8s/scripts/kind-with-registry.sh b/{{cookiecutter.project_slug}}/k8s/scripts/kind-with-registry.sh new file mode 100755 index 00000000..7b026a64 --- /dev/null +++ b/{{cookiecutter.project_slug}}/k8s/scripts/kind-with-registry.sh @@ -0,0 +1,70 @@ +#!/bin/sh +set -o errexit + +# SCAF NOTE: +# This is a modified version of the script from the kind project. +# The original script can be found at: +# https://kind.sigs.k8s.io/docs/user/local-registry/ + +# 1. Create registry container unless it already exists +cluster_name="$1" +reg_name="scaf-registry" +reg_port='5001' +if [ "$(docker inspect -f '{{.State.Running}}' "${reg_name}" 2>/dev/null || true)" != 'true' ]; then + docker run \ + -d --restart=always -p "${reg_port}:5000" --network bridge --name "${reg_name}" \ + registry:2 +fi + +# 2. Create kind cluster with containerd registry config dir enabled +# TODO: kind will eventually enable this by default and this patch will +# be unnecessary. +# +# See: +# https://github.com/kubernetes-sigs/kind/issues/2875 +# https://github.com/containerd/containerd/blob/main/docs/cri/config.md#registry-configuration +# See: https://github.com/containerd/containerd/blob/main/docs/hosts.md +cat < Date: Fri, 20 Sep 2024 10:30:40 -0400 Subject: [PATCH 10/21] revert: added local registry support and improved setup (#387) Reverts sixfeetup/scaf#383 --- cookiecutter.json | 5 +- scaf | 2 +- {{cookiecutter.project_slug}}/Makefile | 67 ++++++------------ .../k8s/scripts/kind-with-registry.sh | 70 ------------------- 4 files changed, 22 insertions(+), 122 deletions(-) delete mode 100755 {{cookiecutter.project_slug}}/k8s/scripts/kind-with-registry.sh diff --git a/cookiecutter.json b/cookiecutter.json index 691c9702..f322ab36 100644 --- a/cookiecutter.json +++ b/cookiecutter.json @@ -36,8 +36,5 @@ } }, "repo_name": "{{ cookiecutter.project_slug }}", - "repo_url": "git@{{ cookiecutter.source_control_provider }}:{{ cookiecutter.source_control_organization_slug }}/{{ cookiecutter.project_slug }}.git", - "_copy_without_render": [ - "k8s/scripts/kind-with-registry.sh" - ] + "repo_url": "git@{{ cookiecutter.source_control_provider }}:{{ cookiecutter.source_control_organization_slug }}/{{ cookiecutter.project_slug }}.git" } diff --git a/scaf b/scaf index 04ba0ccb..66c151dd 100755 --- a/scaf +++ b/scaf @@ -231,8 +231,8 @@ docker run --rm $DOCKER_RUN_OPTIONS -v "$(pwd):/home/scaf/out" \ # Check if cookiecutter was successful if [ $? -eq 0 ]; then + kind create cluster --name $CLUSTER_SLUG cd $COOKIECUTTER_SLUG - make setup make compile echo "Dependencies compiled successfully." pwd diff --git a/{{cookiecutter.project_slug}}/Makefile b/{{cookiecutter.project_slug}}/Makefile index f4167a12..44203ff0 100644 --- a/{{cookiecutter.project_slug}}/Makefile +++ b/{{cookiecutter.project_slug}}/Makefile @@ -2,21 +2,15 @@ KUBECTL_EXEC_BACKEND = kubectl exec -it $$(kubectl get pods -l app=backend -o js {% if cookiecutter.create_nextjs_frontend == "y" %} KUBECTL_EXEC_FRONTEND = kubectl exec -it $$(kubectl get pods -l app=frontend -o jsonpath="{.items[0].metadata.name}") -- bash {% endif %} -PREREQUISITE_COMMANDS := kubectl tilt kind -# escape character for colors -ESC := \033 - -# color variables -BLUE := $(ESC)[0;36m -GREEN := $(ESC)[0;32m -YELLOW := $(ESC)[0;33m -RED := $(ESC)[0;31m -END := $(ESC)[0m +# colors +BLUE:=$(shell echo "\033[0;36m") +GREEN:=$(shell echo "\033[0;32m") +YELLOW:=$(shell echo "\033[0;33m") +RED:=$(shell echo "\033[0;31m") +END:=$(shell echo "\033[0m") PROJECT_SLUG:="{{ cookiecutter.project_slug }}" -REGISTRY_HOSTNAME := localhost -REGISTRY_PORT := 5001 ## Release/Deployment Targets @@ -72,7 +66,7 @@ backend/requirements/production.txt: compile backend/requirements/tests.txt: compile setup: - @printf " $(YELLOW)⛭$(END) Checking if the setup is correct and all prerequisites are installed..." + @echo " $(YELLOW)⛭$(END) Checking if the setup is correct and all prerequisites are installed..." @MISSING=""; \ for exec in $(PREREQUISITE_COMMANDS); do \ if ! which $$exec > /dev/null 2>&1; then \ @@ -80,46 +74,25 @@ setup: fi; \ done; \ if [ -n "$$MISSING" ]; then \ - printf " $(RED)❌$(END)Missing executables:$$MISSING. These must be installed by you to continue"; \ + echo " $(RED)❌$(END)Missing executables:$$MISSING. These must be installed by you to continue"; \ false; \ else \ - printf " $(GREEN)✔️$(END) All prerequisites are installed."; \ + echo " $(GREEN)✔️$(END) All prerequisites are installed."; \ fi @CURRENT_CONTEXT="$$(kubectl config current-context 2>&1)"; \ - CLUSTER_NAME=$(shell echo $(PROJECT_SLUG) | sed 's/_/-/g'); \ - NEW_CONTEXT=kind-$$CLUSTER_NAME; \ - CLUSTER_EXISTS = $(shell kind get clusters | grep -w $$CLUSTER_NAME$$ || true); \ - if [ -z "$$CLUSTER_EXISTS" ]; then \ - printf " $(YELLOW)⛭$(END) No cluster found for $$CLUSTER_NAME. Creating your cluster. Please wait, this may take a couple of minutes on a slower machine..."; \ - k8s/scripts/kind-with-registry.sh $$CLUSTER_NAME > /tmp/scaf_cluster.log 2>&1; \ - printf " $(GREEN)✔️$(END) $$NEW_CONTEXT cluster and context created."; \ - printf " $(BLUE)🗣️ $(END) Pre-loading upstream images into cluster."; \ - docker pull postgres:16; \ - docker pull redis:6.0.5; \ - docker pull mailhog/mailhog:v1.0.0; \ - kind load docker-image postgres:16 --name $$CLUSTER_NAME; \ - kind load docker-image redis:6.0.5 --name $$CLUSTER_NAME; \ - kind load docker-image mailhog/mailhog:v1.0.0 --name $$CLUSTER_NAME; \ - printf " $(GREEN)✔️$(END) $$NEW_CONTEXT cluster and context created."; \ - printf " $(BLUE)🗣️ Remember, you can safely run \"make setup\" any time to switch between Scaf projects.$(END)"; \ - printf " $(GREEN)✔️$(END) Finished! Run 'tilt up' to start your cluster! "; \ + if [ "$$CURRENT_CONTEXT" = "kind-$(PROJECT_SLUG)" ]; then \ + echo " $(GREEN)✔️$(END) The kubectl context is correctly set to kind-$(PROJECT_SLUG). Run 'tilt up' to start your cluster!"; \ else \ - if [ "$$CURRENT_CONTEXT" = "$$NEW_CONTEXT" ]; then \ - printf " $(GREEN)✔️$(END) The kubectl context is correctly set to '$$NEW_CONTEXT'. Run 'tilt up' to start your cluster!"; \ - else \ - kubectl config use-context $$NEW_CONTEXT 1>/dev/null 2>/tmp/scaf_error.log; \ - printf " $(GREEN)✔️$(END) Context switched to $$NEW_CONTEXT. Run 'tilt up' to start your cluster! "; \ + echo " $(YELLOW)⛭$(END) Current kubectl context is not 'kind-$(PROJECT_SLUG)'. Switching context now..."; \ + if [ -z "$$(kubectl config get-contexts -o name | grep -w 'kind-$(PROJECT_SLUG)$$')" ]; then \ + echo " $(YELLOW)⛭$(END) No context found for kind-$(PROJECT_SLUG). Creating one. Please wait, this may take a couple of minutes on a slower machine..."; \ + kind create cluster --name $(PROJECT_SLUG) 1>/dev/null 2>/tmp/scaf_error.log; \ + echo " $(GREEN)✔️$(END) kind-$(PROJECT_SLUG) cluster and context created."; \ + echo " $(BLUE)🗣️ Remember, you can safely run \"make setup\" any time to switch between Scaf projects.$(END)"; \ fi; \ - fi; \ - -list-local-docker-images: - @printf " $(YELLOW)⛭$(END) Listing local docker images..." - @curl -s "$(REGISTRY_HOSTNAME):$(REGISTRY_PORT)/v2/_catalog" | jq -r '.repositories[]' | while read REPO; do \ - echo "Repository: $$REPO"; \ - curl -s "$(REGISTRY_HOSTNAME):$(REGISTRY_PORT)/v2/$$REPO/tags/list" | jq -r '.tags[]' | while read TAG; do \ - echo " Tag: $$TAG"; \ - done; \ - done + kubectl config use-context kind-$(PROJECT_SLUG) 1>/dev/null 2>/tmp/scaf_error.log; \ + echo " $(GREEN)✔️$(END) Context switched to kind-$(PROJECT_SLUG). Run 'tilt up' to start your cluster! "; \ + fi outdated: ## Show all the outdated packages with their latest versions in the container $(KUBECTL_EXEC_BACKEND) -c "pip list --outdated" diff --git a/{{cookiecutter.project_slug}}/k8s/scripts/kind-with-registry.sh b/{{cookiecutter.project_slug}}/k8s/scripts/kind-with-registry.sh deleted file mode 100755 index 7b026a64..00000000 --- a/{{cookiecutter.project_slug}}/k8s/scripts/kind-with-registry.sh +++ /dev/null @@ -1,70 +0,0 @@ -#!/bin/sh -set -o errexit - -# SCAF NOTE: -# This is a modified version of the script from the kind project. -# The original script can be found at: -# https://kind.sigs.k8s.io/docs/user/local-registry/ - -# 1. Create registry container unless it already exists -cluster_name="$1" -reg_name="scaf-registry" -reg_port='5001' -if [ "$(docker inspect -f '{{.State.Running}}' "${reg_name}" 2>/dev/null || true)" != 'true' ]; then - docker run \ - -d --restart=always -p "${reg_port}:5000" --network bridge --name "${reg_name}" \ - registry:2 -fi - -# 2. Create kind cluster with containerd registry config dir enabled -# TODO: kind will eventually enable this by default and this patch will -# be unnecessary. -# -# See: -# https://github.com/kubernetes-sigs/kind/issues/2875 -# https://github.com/containerd/containerd/blob/main/docs/cri/config.md#registry-configuration -# See: https://github.com/containerd/containerd/blob/main/docs/hosts.md -cat < Date: Fri, 20 Sep 2024 20:58:24 +0200 Subject: [PATCH 11/21] docs: add disk space warning to README (#385) This PR adds a note to the README to warn users to check the disk space available to Docker before creating a new project. Checking the actual disk space available in a cross-platform manner is challenging. Figuring out whether one should check actual disk space or space available to Docker is even more complex. --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 726bf8a1..b31a63de 100644 --- a/README.md +++ b/README.md @@ -43,6 +43,10 @@ be found on your system. ## Creating a new project using this repo +NB: Before you continue, make sure that you have at least 5 to 10 GB of free +space available to Docker. Note that Docker Desktop on MacOS has its own +resource limits separate from the host. + Run `scaf myproject`, answer all the questions, and you'll have your new project! Inside `myproject/README.md`, you will have more From b5eef607dbc4b7bad9a6037bb8bc30dd81c100d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roch=C3=A9=20Compaan?= Date: Sat, 21 Sep 2024 08:49:56 +0200 Subject: [PATCH 12/21] fix: use GitHub token for semantic release workflow --- .github/workflows/semantic-release.yaml | 23 ++++++----------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/.github/workflows/semantic-release.yaml b/.github/workflows/semantic-release.yaml index 20da74aa..c192e3ab 100644 --- a/.github/workflows/semantic-release.yaml +++ b/.github/workflows/semantic-release.yaml @@ -5,25 +5,20 @@ on: branches: - main +permissions: + contents: write + issues: write + jobs: semantic-release: runs-on: ubuntu-latest environment: dev steps: - - name: Prepare workaround - # Create a GitHub App token to authenticate as the workaround app. - uses: actions/create-github-app-token@v1 - id: app-token - with: - app-id: ${{ vars.CI_VERSION_WORKAROUND_APP_ID }} - private-key: ${{ secrets.CI_VERSION_WORKAROUND_APP_PRIVATE_KEY }} - - name: Checkout - # Use the workaround app-token to pull all history and tags for the repository. uses: actions/checkout@v4 with: fetch-depth: 0 - token: ${{ steps.app-token.outputs.token }} + token: ${{ secrets.GITHUB_TOKEN }} persist-credentials: false - name: Setup Node.js @@ -38,12 +33,6 @@ jobs: run: npm audit signatures - name: Run Semantic Release - # Use the workaround app-token to authenticate as the workaround app in order to - # push tags to the protected branch. run: npx semantic-release env: - # Deprecated in favor of the app token. - #CI_VERSION_WORKAROUND_APP_ID: ${{ vars.CI_VERSION_WORKAROUND_APP_ID }} - #CI_VERSION_WORKAROUND_APP_PRIVATE_KEY: ${{ secrets.CI_VERSION_WORKAROUND_APP_PRIVATE_KEY }} - #GITHUB_TOKEN: ${{ secrets.CI_GITHUB_TOKEN }} # I think this is deprecated in favor of the app token - GITHUB_TOKEN: ${{ steps.app-token.outputs.token }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 24b4600ace51bdce7a541405be4593960f59f7bb Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sat, 21 Sep 2024 06:50:32 +0000 Subject: [PATCH 13/21] chore(release): 1.15.0 [skip ci] ## [1.15.0](https://github.com/sixfeetup/scaf/compare/v1.14.0...v1.15.0) (2024-09-21) ### Features * added local registry support and improved setup (close [#353](https://github.com/sixfeetup/scaf/issues/353)) ([32de8c7](https://github.com/sixfeetup/scaf/commit/32de8c76b260f81774e087dc221c237767a0049a)) * Gfranxman/313 prefer dotlocalbin as install location ([#342](https://github.com/sixfeetup/scaf/issues/342)) ([dbb3556](https://github.com/sixfeetup/scaf/commit/dbb3556e7258a57e5105f80063f95f3222d3fd6a)) * implement s3 storage for static and media files on production ([#339](https://github.com/sixfeetup/scaf/issues/339)) ([76afd23](https://github.com/sixfeetup/scaf/commit/76afd23da1aa0867422249584a3156f43b7b974e)) * implement scaf challenge for session recording ([#379](https://github.com/sixfeetup/scaf/issues/379)) ([0c091af](https://github.com/sixfeetup/scaf/commit/0c091afbd574632350f2c4cdb43420fadb8eb317)) * **install.sh:** force re-download of Scaf on each install ([#338](https://github.com/sixfeetup/scaf/issues/338)) ([f7ef3e3](https://github.com/sixfeetup/scaf/commit/f7ef3e3ac0876c70f4c6f3e1f34a41386321e9a3)) * op inject secrets (close [#368](https://github.com/sixfeetup/scaf/issues/368)) ([58090b5](https://github.com/sixfeetup/scaf/commit/58090b56f65f35cb2c68258f0aa4f3aaf8509417)) * reorder environment variables in k8s django config ([#350](https://github.com/sixfeetup/scaf/issues/350)) ([f2cb234](https://github.com/sixfeetup/scaf/commit/f2cb2349666ecd46f24145c49b5f42bbc189c9b4)) * script to test cookiecutter part of Scaf ([952e276](https://github.com/sixfeetup/scaf/commit/952e276852afe84cdbfca062da65fcae6cad6bc8)) ### Bug Fixes * Fixes frontend tests ([#363](https://github.com/sixfeetup/scaf/issues/363)) ([4a2a5b2](https://github.com/sixfeetup/scaf/commit/4a2a5b254891fd4b1688499d17240aa93356ce81)) * mailhog port config (closes [#249](https://github.com/sixfeetup/scaf/issues/249)) ([cea1602](https://github.com/sixfeetup/scaf/commit/cea1602d99e5a03e63fc8cffcc842844bf648897)) * Specify the full container path, including the host. ([#309](https://github.com/sixfeetup/scaf/issues/309)) ([2fa7276](https://github.com/sixfeetup/scaf/commit/2fa727672fc6b8ab2a0c40550f63cf27ba3b859c)), closes [#308](https://github.com/sixfeetup/scaf/issues/308) * Update logo ([#373](https://github.com/sixfeetup/scaf/issues/373)) ([afe2d84](https://github.com/sixfeetup/scaf/commit/afe2d849ad6db3ca05d812d1da12c02a9f127b96)) * use GitHub token for semantic release workflow ([b5eef60](https://github.com/sixfeetup/scaf/commit/b5eef607dbc4b7bad9a6037bb8bc30dd81c100d2)) ### Documentation * add disk space warning to README ([#385](https://github.com/sixfeetup/scaf/issues/385)) ([4262b2d](https://github.com/sixfeetup/scaf/commit/4262b2d0868edf3dd1b22a6aef5aac78ae203afb)) * update related to optional GraphQL ([#366](https://github.com/sixfeetup/scaf/issues/366)) ([92bfc8d](https://github.com/sixfeetup/scaf/commit/92bfc8d61f53d9845a3d7e952c96225b22e95a3d)), closes [#290](https://github.com/sixfeetup/scaf/issues/290) --- CHANGELOG.md | 26 ++++++++++++++++++++++++++ package.json | 2 +- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8a9e716a..bf03e20e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,31 @@ # Changelog +## [1.15.0](https://github.com/sixfeetup/scaf/compare/v1.14.0...v1.15.0) (2024-09-21) + +### Features + +* added local registry support and improved setup (close [#353](https://github.com/sixfeetup/scaf/issues/353)) ([32de8c7](https://github.com/sixfeetup/scaf/commit/32de8c76b260f81774e087dc221c237767a0049a)) +* Gfranxman/313 prefer dotlocalbin as install location ([#342](https://github.com/sixfeetup/scaf/issues/342)) ([dbb3556](https://github.com/sixfeetup/scaf/commit/dbb3556e7258a57e5105f80063f95f3222d3fd6a)) +* implement s3 storage for static and media files on production ([#339](https://github.com/sixfeetup/scaf/issues/339)) ([76afd23](https://github.com/sixfeetup/scaf/commit/76afd23da1aa0867422249584a3156f43b7b974e)) +* implement scaf challenge for session recording ([#379](https://github.com/sixfeetup/scaf/issues/379)) ([0c091af](https://github.com/sixfeetup/scaf/commit/0c091afbd574632350f2c4cdb43420fadb8eb317)) +* **install.sh:** force re-download of Scaf on each install ([#338](https://github.com/sixfeetup/scaf/issues/338)) ([f7ef3e3](https://github.com/sixfeetup/scaf/commit/f7ef3e3ac0876c70f4c6f3e1f34a41386321e9a3)) +* op inject secrets (close [#368](https://github.com/sixfeetup/scaf/issues/368)) ([58090b5](https://github.com/sixfeetup/scaf/commit/58090b56f65f35cb2c68258f0aa4f3aaf8509417)) +* reorder environment variables in k8s django config ([#350](https://github.com/sixfeetup/scaf/issues/350)) ([f2cb234](https://github.com/sixfeetup/scaf/commit/f2cb2349666ecd46f24145c49b5f42bbc189c9b4)) +* script to test cookiecutter part of Scaf ([952e276](https://github.com/sixfeetup/scaf/commit/952e276852afe84cdbfca062da65fcae6cad6bc8)) + +### Bug Fixes + +* Fixes frontend tests ([#363](https://github.com/sixfeetup/scaf/issues/363)) ([4a2a5b2](https://github.com/sixfeetup/scaf/commit/4a2a5b254891fd4b1688499d17240aa93356ce81)) +* mailhog port config (closes [#249](https://github.com/sixfeetup/scaf/issues/249)) ([cea1602](https://github.com/sixfeetup/scaf/commit/cea1602d99e5a03e63fc8cffcc842844bf648897)) +* Specify the full container path, including the host. ([#309](https://github.com/sixfeetup/scaf/issues/309)) ([2fa7276](https://github.com/sixfeetup/scaf/commit/2fa727672fc6b8ab2a0c40550f63cf27ba3b859c)), closes [#308](https://github.com/sixfeetup/scaf/issues/308) +* Update logo ([#373](https://github.com/sixfeetup/scaf/issues/373)) ([afe2d84](https://github.com/sixfeetup/scaf/commit/afe2d849ad6db3ca05d812d1da12c02a9f127b96)) +* use GitHub token for semantic release workflow ([b5eef60](https://github.com/sixfeetup/scaf/commit/b5eef607dbc4b7bad9a6037bb8bc30dd81c100d2)) + +### Documentation + +* add disk space warning to README ([#385](https://github.com/sixfeetup/scaf/issues/385)) ([4262b2d](https://github.com/sixfeetup/scaf/commit/4262b2d0868edf3dd1b22a6aef5aac78ae203afb)) +* update related to optional GraphQL ([#366](https://github.com/sixfeetup/scaf/issues/366)) ([92bfc8d](https://github.com/sixfeetup/scaf/commit/92bfc8d61f53d9845a3d7e952c96225b22e95a3d)), closes [#290](https://github.com/sixfeetup/scaf/issues/290) + ## [1.14.0](https://github.com/sixfeetup/scaf/compare/v1.13.2...v1.14.0) (2024-09-04) ### Features diff --git a/package.json b/package.json index 4b221b50..04d9446b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "scaf", - "version": "1.14.0", + "version": "1.15.0", "devDependencies": { "@semantic-release/changelog": "^6.0.3", "@semantic-release/git": "^10.0.1", From 7510477414c60b35a517c1416137164e98e7a5d8 Mon Sep 17 00:00:00 2001 From: Anthony Bosio Date: Sat, 21 Sep 2024 19:02:28 -0400 Subject: [PATCH 14/21] fix: check for python commands, fallback to python3 refs #386 (#389) Co-authored-by: abosio --- install.sh | 9 ++++++++- scaf | 16 +++++++++++++--- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/install.sh b/install.sh index aee1a34e..030011b1 100755 --- a/install.sh +++ b/install.sh @@ -34,7 +34,7 @@ command_exists() { check_top_level_dependencies() { # these are dependencies that we depend on the user to have installed - dependencies="bash curl make python3 docker git rsync" + dependencies="bash curl make docker git rsync" missing="" for dep in $dependencies; do @@ -43,6 +43,13 @@ check_top_level_dependencies() { fi done + # Check if python commands exist + if command -v python &>/dev/null || command -v python3 &>/dev/null; then + : + else + missing="$missing python3" + fi + if [ -z "$missing" ]; then echo "All top-level dependencies are installed." return 0 diff --git a/scaf b/scaf index 66c151dd..e45801ee 100755 --- a/scaf +++ b/scaf @@ -1,5 +1,15 @@ #!/usr/bin/env bash +# set python command +if command -v python &>/dev/null; then + PYTHON_CMD=python +elif command -v python3 &>/dev/null; then + PYTHON_CMD=python3 +else + echo "Missing python3 command. Please install python3." + exit 1; +fi + # Scaf challenge script CHALLENGE_CONFIG_PATH=".scaf-challenge.json" @@ -122,11 +132,11 @@ EOF trap code_received SIGUSR1 # Start the Python server in the background - python temp_server.py & + $PYTHON_CMD temp_server.py & server_pid=$! # Example opening of the browser to auth/reg user - python -c "import webbrowser; webbrowser.open('https://scaf.withpassage.com/authorize?response_type=code&client_id=961JRDH4c4Sin8LYGGbI0Lb7&redirect_uri=http://localhost:51111&scope=openid%20email')" + $PYTHON_CMD -c "import webbrowser; webbrowser.open('https://scaf.withpassage.com/authorize?response_type=code&client_id=961JRDH4c4Sin8LYGGbI0Lb7&redirect_uri=http://localhost:51111&scope=openid%20email')" echo "Waiting for authorization..." @@ -178,7 +188,7 @@ start_challenge_session() { token=$(echo $config | grep -o '"access_token": "[^"]*"' | sed -e 's/"access_token": "\([^"]*\)"/\1/') base_url=$(echo $config | grep -o '"base_url": "[^"]*"' | sed -e 's/"base_url": "\([^"]*\)"/\1/') session_id=$(echo $config | grep -o '"session_id": "[^"]*"' | sed -e 's/"session_id": "\([^"]*\)"/\1/') - start=$(python -c "import time; print('{:.6f}'.format(time.time()))") + start=$($PYTHON_CMD -c "import time; print('{:.6f}'.format(time.time()))") # Make report API call to kick off the session status_code=$(curl -o /dev/null -s -w "%{http_code}" --location "$base_url/Prod/report" \ From 3e62d02c4d2234f4650f1a84046fbdde13659126 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sat, 21 Sep 2024 23:02:57 +0000 Subject: [PATCH 15/21] chore(release): 1.15.1 [skip ci] ## [1.15.1](https://github.com/sixfeetup/scaf/compare/v1.15.0...v1.15.1) (2024-09-21) ### Bug Fixes * check for python commands, fallback to python3 refs [#386](https://github.com/sixfeetup/scaf/issues/386) ([#389](https://github.com/sixfeetup/scaf/issues/389)) ([7510477](https://github.com/sixfeetup/scaf/commit/7510477414c60b35a517c1416137164e98e7a5d8)) --- CHANGELOG.md | 6 ++++++ package.json | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bf03e20e..31f74cd3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## [1.15.1](https://github.com/sixfeetup/scaf/compare/v1.15.0...v1.15.1) (2024-09-21) + +### Bug Fixes + +* check for python commands, fallback to python3 refs [#386](https://github.com/sixfeetup/scaf/issues/386) ([#389](https://github.com/sixfeetup/scaf/issues/389)) ([7510477](https://github.com/sixfeetup/scaf/commit/7510477414c60b35a517c1416137164e98e7a5d8)) + ## [1.15.0](https://github.com/sixfeetup/scaf/compare/v1.14.0...v1.15.0) (2024-09-21) ### Features diff --git a/package.json b/package.json index 04d9446b..0e9931a3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "scaf", - "version": "1.15.0", + "version": "1.15.1", "devDependencies": { "@semantic-release/changelog": "^6.0.3", "@semantic-release/git": "^10.0.1", From 5288cf0ac843d7c474e6e16232b65795581f198f Mon Sep 17 00:00:00 2001 From: Anthony Bosio Date: Mon, 23 Sep 2024 17:09:46 -0400 Subject: [PATCH 16/21] feat: update text references to refer to Scaf instead of Sixie (#393) Co-authored-by: abosio --- .gitignore | 1 - cookiecutter.json | 4 ++-- test-configs/nextjs-django-github.yaml | 2 +- .../backend/{{cookiecutter.project_slug}}/templates/base.html | 2 +- 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index f1271e8f..b463e5a7 100644 --- a/.gitignore +++ b/.gitignore @@ -240,7 +240,6 @@ fabric.properties # VcsDirectoryMappings .idea/vcs.xml -.idea/cookiecutter-sixiedjango.iml .idea/inspectionProfiles/profiles_settings.xml .idea/misc.xml diff --git a/cookiecutter.json b/cookiecutter.json index f322ab36..1c2b4b35 100644 --- a/cookiecutter.json +++ b/cookiecutter.json @@ -1,9 +1,9 @@ { - "project_name": "My Awesome Sixie Project", + "project_name": "My Awesome Scaf Project", "project_slug": "{{ cookiecutter.project_name.lower()|replace(' ', '_')|replace('-', '_')|replace('.', '_')|trim() }}", "project_dash": "{{ cookiecutter.project_name.lower()|replace(' ', '-')|replace('_', '-')|replace('.', '-')|trim() }}", "description": "Behold My Awesome Project!", - "author_name": "Joe Sixie", + "author_name": "Joe Scaf", "domain_name": "sixfeetup.com", "email": "{{ cookiecutter.author_name.lower()|replace(' ', '-') }}@{{ cookiecutter.domain_name }}", "version": "0.1.0", diff --git a/test-configs/nextjs-django-github.yaml b/test-configs/nextjs-django-github.yaml index 61eab938..94397ea7 100644 --- a/test-configs/nextjs-django-github.yaml +++ b/test-configs/nextjs-django-github.yaml @@ -11,7 +11,7 @@ default_context: project_dash: my-awesome-scaf-project project_name: My Awesome Scaf Project project_slug: my_awesome_scaf_project - repo_name: my_awesome_sixie_project + repo_name: my_awesome_scaf_project repo_url: git@github.com:sixfeetup/my_awesome_scaf_project.git source_control_organization_slug: sixfeetup source_control_provider: github.com diff --git a/{{cookiecutter.project_slug}}/backend/{{cookiecutter.project_slug}}/templates/base.html b/{{cookiecutter.project_slug}}/backend/{{cookiecutter.project_slug}}/templates/base.html index 0cfb283b..77ca6ae6 100644 --- a/{{cookiecutter.project_slug}}/backend/{{cookiecutter.project_slug}}/templates/base.html +++ b/{{cookiecutter.project_slug}}/backend/{{cookiecutter.project_slug}}/templates/base.html @@ -80,7 +80,7 @@ {% endif %} {% block content %} -

Use this document as a way to quick start any new project.

+

Welcome to your brand-new Scaf-powered Django project! Your development journey starts here. Explore, build, and innovate with speed and ease.

{% endblock content %} From a3231a9a92b865ccdbfd5567467e2e5ecf5446b2 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Mon, 23 Sep 2024 21:10:14 +0000 Subject: [PATCH 17/21] chore(release): 1.16.0 [skip ci] ## [1.16.0](https://github.com/sixfeetup/scaf/compare/v1.15.1...v1.16.0) (2024-09-23) ### Features * update text references to refer to Scaf instead of Sixie ([#393](https://github.com/sixfeetup/scaf/issues/393)) ([5288cf0](https://github.com/sixfeetup/scaf/commit/5288cf0ac843d7c474e6e16232b65795581f198f)) --- CHANGELOG.md | 6 ++++++ package.json | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 31f74cd3..c2350fe1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## [1.16.0](https://github.com/sixfeetup/scaf/compare/v1.15.1...v1.16.0) (2024-09-23) + +### Features + +* update text references to refer to Scaf instead of Sixie ([#393](https://github.com/sixfeetup/scaf/issues/393)) ([5288cf0](https://github.com/sixfeetup/scaf/commit/5288cf0ac843d7c474e6e16232b65795581f198f)) + ## [1.15.1](https://github.com/sixfeetup/scaf/compare/v1.15.0...v1.15.1) (2024-09-21) ### Bug Fixes diff --git a/package.json b/package.json index 0e9931a3..544b2c16 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "scaf", - "version": "1.15.1", + "version": "1.16.0", "devDependencies": { "@semantic-release/changelog": "^6.0.3", "@semantic-release/git": "^10.0.1", From bd8e6470260a087ea639ad52eb735d7065fe6f88 Mon Sep 17 00:00:00 2001 From: sheepman4267 <75755727+sheepman4267@users.noreply.github.com> Date: Wed, 25 Sep 2024 13:04:12 -0400 Subject: [PATCH 18/21] fix: entrypoint.sh: Reorder commands so UID and GID checks work (#395) This allows the existing docker-based approach to work on more linux distributions without messing up local permissions. It would probably be better/clearer to actually use `return` statements, but moving the equality operations to the end of the functions also works. --- entrypoint.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/entrypoint.sh b/entrypoint.sh index 02f07c79..c0ff5304 100755 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -20,26 +20,26 @@ fi # Function to check if a group with the given GID already exists group_exists_with_gid() { + echo "Checking if user with UID $1 exists..." getent group | cut -d: -f3 | grep -q "^$1$" - echo "Checking if group with GID $1 exists..." } # Function to check if a user with the given UID already exists user_exists_with_uid() { - getent passwd | cut -d: -f3 | grep -q "^$1$" echo "Checking if user with UID $1 exists..." + getent passwd | cut -d: -f3 | grep -q "^$1$" } # Function to check if the scaf user already has the target UID scaf_has_uid() { - [ "$(id -u scaf)" -eq "$1" ] echo "Checking if scaf has UID $1..." + [ "$(id -u scaf)" -eq "$1" ] } # Function to check if the scaf group already has the target GID scaf_has_gid() { - [ "$(getent group scaf | cut -d: -f3)" -eq "$1" ] echo "Checking if scaf group has GID $1..." + [ "$(getent group scaf | cut -d: -f3)" -eq "$1" ] } # Modify the scaf user account to match the host user, adjusting for existing GID From 910fb3aff11123684ad8d512452b30109aa50d23 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Wed, 25 Sep 2024 17:04:43 +0000 Subject: [PATCH 19/21] chore(release): 1.16.1 [skip ci] ## [1.16.1](https://github.com/sixfeetup/scaf/compare/v1.16.0...v1.16.1) (2024-09-25) ### Bug Fixes * entrypoint.sh: Reorder commands so UID and GID checks work ([#395](https://github.com/sixfeetup/scaf/issues/395)) ([bd8e647](https://github.com/sixfeetup/scaf/commit/bd8e6470260a087ea639ad52eb735d7065fe6f88)) --- CHANGELOG.md | 6 ++++++ package.json | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c2350fe1..6a79fe76 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## [1.16.1](https://github.com/sixfeetup/scaf/compare/v1.16.0...v1.16.1) (2024-09-25) + +### Bug Fixes + +* entrypoint.sh: Reorder commands so UID and GID checks work ([#395](https://github.com/sixfeetup/scaf/issues/395)) ([bd8e647](https://github.com/sixfeetup/scaf/commit/bd8e6470260a087ea639ad52eb735d7065fe6f88)) + ## [1.16.0](https://github.com/sixfeetup/scaf/compare/v1.15.1...v1.16.0) (2024-09-23) ### Features diff --git a/package.json b/package.json index 544b2c16..6c188689 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "scaf", - "version": "1.16.0", + "version": "1.16.1", "devDependencies": { "@semantic-release/changelog": "^6.0.3", "@semantic-release/git": "^10.0.1", From 69386611ee96ec2e0278fbf57717db10bc484c7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roch=C3=A9=20Compaan?= Date: Sat, 5 Oct 2024 06:44:33 +0200 Subject: [PATCH 20/21] feat: deploy apps with ArgoCD This PR adds the feature to bootstrap a Talos cluster with ArgoCD using the app-of-apps pattern. ArgoCD, in turn, deploys all the dependencies required by the application and the application itself. --- .github/workflows/semantic-pull-request.yaml | 2 +- hooks/post_gen_project.py | 1 - test-scaf.sh | 2 +- .../.github/workflows/main.yaml | 65 +++++ {{cookiecutter.project_slug}}/.gitignore | 1 + .../.pre-commit-config.yaml | 1 + {{cookiecutter.project_slug}}/.yamlfmt | 5 + {{cookiecutter.project_slug}}/.yamllint | 29 +++ {{cookiecutter.project_slug}}/Makefile | 65 ++--- {{cookiecutter.project_slug}}/README.md | 13 +- .../argocd/base/argocd/app.yaml | 33 +++ .../argocd/base/argocd/kustomization.yaml | 5 + .../argocd/base/cert-manager/app.yaml | 33 +++ .../base/cert-manager/kustomization.yaml | 5 + .../argocd/base/cloudnative-pg/app.yaml | 33 +++ .../base/cloudnative-pg/kustomization.yaml | 5 + .../argocd/base/ingress/app.yaml | 28 +++ .../argocd/base/ingress/kustomization.yaml | 5 + .../base/kube-prometheus-stack/app.yaml | 46 ++++ .../kube-prometheus-stack/kustomization.yaml | 5 + .../local-path-provisioner/kustomization.yaml | 36 +++ .../argocd/base/reflector/app.yaml | 28 +++ .../argocd/base/reflector/kustomization.yaml | 5 + .../argocd/base/sealed-secrets/app.yaml | 31 +++ .../base/sealed-secrets/kustomization.yaml | 5 + .../argocd/base/traefik/app.yaml | 37 +++ .../argocd/base/traefik/kustomization.yaml | 5 + .../{{ cookiecutter.project_slug }}/app.yaml | 26 ++ .../kustomization.yaml | 5 + .../argocd/prod/apps/kustomization.yaml | 25 ++ .../argocd/prod/ingress/kustomization.yaml | 35 +++ .../argocd/sandbox/apps/kustomization.yaml | 40 ++++ .../sandbox/ingress/cert-manager-issuer.yaml | 33 +++ .../argocd/sandbox/ingress/certificates.yaml | 15 ++ .../argocd/sandbox/ingress/ingress.yaml | 59 +++++ .../argocd/sandbox/ingress/kustomization.yaml | 6 + .../utils/debugger.py | 4 +- .../bootstrap-cluster/.gitignore | 7 + .../bootstrap-cluster/README.md | 222 ++++++++++++++++++ .../bootstrap-cluster/argocd.yaml | 80 +++++++ .../patches/patch-control-plane.yaml | 10 + .../patches/patch-ecr-credential-helper.yaml | 15 ++ .../patches/patch-machine.yaml | 8 + .../bootstrap-cluster/prod/.env | 2 + .../bootstrap-cluster/root-app.template.yaml | 27 +++ .../bootstrap-cluster/sandbox/.env | 2 + .../bootstrap-cluster/staging/.env | 2 + .../bootstrap-cluster/talos.yaml | 202 ++++++++++++++++ .../bootstrap-cluster/taskfile.yaml | 15 ++ .../k8s/base/ingress.yaml | 8 +- .../k8s/prod/cluster-issuer.yaml | 37 --- .../k8s/prod/kustomization.yaml | 86 +++---- .../k8s/prod/patch-django.yaml | 16 -- .../k8s/prod/patch-react.yaml | 14 -- .../k8s/{prod => sandbox}/certificate.yaml | 6 +- .../k8s/{prod => sandbox}/ingress-route.yaml | 12 +- .../k8s/sandbox/kustomization.yaml | 90 ++++--- .../k8s/{prod => sandbox}/postgres.cnpg.yaml | 0 .../argocd.application.yaml.template | 38 --- .../k8s/templates/repocreds.yaml.template | 11 - .../k8s/templates/secrets.yaml.template | 10 +- .../terraform/.gitignore | 1 + .../terraform/README.md | 47 +++- .../terraform/github/oidc.tf | 9 +- .../terraform/modules/base/cloudfront.tf | 32 ++- .../terraform/modules/base/ec2-iam-role.tf | 48 +++- .../terraform/modules/base/ec2.tf | 18 +- .../terraform/modules/base/github-iam-role.tf | 4 +- .../terraform/modules/base/helm.tf | 87 ------- .../terraform/modules/base/iam.tf | 19 +- .../terraform/modules/base/kms.tf | 39 --- .../terraform/modules/base/outputs.tf | 30 +-- .../modules/base/repocreds.template.yaml | 12 - .../terraform/modules/base/route53.tf | 8 + .../terraform/modules/base/talos.tf | 156 ------------ .../terraform/modules/base/variables.tf | 7 +- .../terraform/modules/base/versions.tf | 4 - .../modules/global_variables/main.tf | 2 +- .../terraform/prod/outputs.tf | 29 +-- .../terraform/sandbox/cluster.tf | 4 +- .../terraform/sandbox/outputs.tf | 29 +-- .../terraform/staging/outputs.tf | 11 + 82 files changed, 1622 insertions(+), 671 deletions(-) create mode 100644 {{cookiecutter.project_slug}}/.yamlfmt create mode 100644 {{cookiecutter.project_slug}}/.yamllint create mode 100644 {{cookiecutter.project_slug}}/argocd/base/argocd/app.yaml create mode 100644 {{cookiecutter.project_slug}}/argocd/base/argocd/kustomization.yaml create mode 100644 {{cookiecutter.project_slug}}/argocd/base/cert-manager/app.yaml create mode 100644 {{cookiecutter.project_slug}}/argocd/base/cert-manager/kustomization.yaml create mode 100644 {{cookiecutter.project_slug}}/argocd/base/cloudnative-pg/app.yaml create mode 100644 {{cookiecutter.project_slug}}/argocd/base/cloudnative-pg/kustomization.yaml create mode 100644 {{cookiecutter.project_slug}}/argocd/base/ingress/app.yaml create mode 100644 {{cookiecutter.project_slug}}/argocd/base/ingress/kustomization.yaml create mode 100644 {{cookiecutter.project_slug}}/argocd/base/kube-prometheus-stack/app.yaml create mode 100644 {{cookiecutter.project_slug}}/argocd/base/kube-prometheus-stack/kustomization.yaml create mode 100644 {{cookiecutter.project_slug}}/argocd/base/local-path-provisioner/kustomization.yaml create mode 100644 {{cookiecutter.project_slug}}/argocd/base/reflector/app.yaml create mode 100644 {{cookiecutter.project_slug}}/argocd/base/reflector/kustomization.yaml create mode 100644 {{cookiecutter.project_slug}}/argocd/base/sealed-secrets/app.yaml create mode 100644 {{cookiecutter.project_slug}}/argocd/base/sealed-secrets/kustomization.yaml create mode 100644 {{cookiecutter.project_slug}}/argocd/base/traefik/app.yaml create mode 100644 {{cookiecutter.project_slug}}/argocd/base/traefik/kustomization.yaml create mode 100644 {{cookiecutter.project_slug}}/argocd/base/{{ cookiecutter.project_slug }}/app.yaml create mode 100644 {{cookiecutter.project_slug}}/argocd/base/{{ cookiecutter.project_slug }}/kustomization.yaml create mode 100644 {{cookiecutter.project_slug}}/argocd/prod/apps/kustomization.yaml create mode 100644 {{cookiecutter.project_slug}}/argocd/prod/ingress/kustomization.yaml create mode 100644 {{cookiecutter.project_slug}}/argocd/sandbox/apps/kustomization.yaml create mode 100644 {{cookiecutter.project_slug}}/argocd/sandbox/ingress/cert-manager-issuer.yaml create mode 100644 {{cookiecutter.project_slug}}/argocd/sandbox/ingress/certificates.yaml create mode 100644 {{cookiecutter.project_slug}}/argocd/sandbox/ingress/ingress.yaml create mode 100644 {{cookiecutter.project_slug}}/argocd/sandbox/ingress/kustomization.yaml create mode 100644 {{cookiecutter.project_slug}}/bootstrap-cluster/.gitignore create mode 100644 {{cookiecutter.project_slug}}/bootstrap-cluster/README.md create mode 100644 {{cookiecutter.project_slug}}/bootstrap-cluster/argocd.yaml create mode 100644 {{cookiecutter.project_slug}}/bootstrap-cluster/patches/patch-control-plane.yaml create mode 100644 {{cookiecutter.project_slug}}/bootstrap-cluster/patches/patch-ecr-credential-helper.yaml create mode 100644 {{cookiecutter.project_slug}}/bootstrap-cluster/patches/patch-machine.yaml create mode 100644 {{cookiecutter.project_slug}}/bootstrap-cluster/prod/.env create mode 100644 {{cookiecutter.project_slug}}/bootstrap-cluster/root-app.template.yaml create mode 100644 {{cookiecutter.project_slug}}/bootstrap-cluster/sandbox/.env create mode 100644 {{cookiecutter.project_slug}}/bootstrap-cluster/staging/.env create mode 100644 {{cookiecutter.project_slug}}/bootstrap-cluster/talos.yaml create mode 100644 {{cookiecutter.project_slug}}/bootstrap-cluster/taskfile.yaml delete mode 100644 {{cookiecutter.project_slug}}/k8s/prod/cluster-issuer.yaml delete mode 100644 {{cookiecutter.project_slug}}/k8s/prod/patch-django.yaml delete mode 100644 {{cookiecutter.project_slug}}/k8s/prod/patch-react.yaml rename {{cookiecutter.project_slug}}/k8s/{prod => sandbox}/certificate.yaml (56%) rename {{cookiecutter.project_slug}}/k8s/{prod => sandbox}/ingress-route.yaml (78%) rename {{cookiecutter.project_slug}}/k8s/{prod => sandbox}/postgres.cnpg.yaml (100%) delete mode 100644 {{cookiecutter.project_slug}}/k8s/templates/argocd.application.yaml.template delete mode 100644 {{cookiecutter.project_slug}}/k8s/templates/repocreds.yaml.template delete mode 100644 {{cookiecutter.project_slug}}/terraform/modules/base/helm.tf delete mode 100644 {{cookiecutter.project_slug}}/terraform/modules/base/kms.tf delete mode 100644 {{cookiecutter.project_slug}}/terraform/modules/base/repocreds.template.yaml delete mode 100644 {{cookiecutter.project_slug}}/terraform/modules/base/talos.tf diff --git a/.github/workflows/semantic-pull-request.yaml b/.github/workflows/semantic-pull-request.yaml index 819dce58..83ee2da0 100644 --- a/.github/workflows/semantic-pull-request.yaml +++ b/.github/workflows/semantic-pull-request.yaml @@ -19,4 +19,4 @@ jobs: steps: - uses: amannn/action-semantic-pull-request@v5 env: - GITHUB_TOKEN: ${{ secrets.CI_GITHUB_TOKEN }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/hooks/post_gen_project.py b/hooks/post_gen_project.py index 36f67d7f..2dbe6d57 100644 --- a/hooks/post_gen_project.py +++ b/hooks/post_gen_project.py @@ -27,7 +27,6 @@ shutil.rmtree("frontend") file_names = [ os.path.join("k8s", "base", "frontend.yaml"), - os.path.join("k8s", "prod", "patch-react.yaml"), ] for file_name in file_names: os.remove(file_name) diff --git a/test-scaf.sh b/test-scaf.sh index e7842bea..b5130f32 100755 --- a/test-scaf.sh +++ b/test-scaf.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # Default values BRANCH_NAME="" diff --git a/{{cookiecutter.project_slug}}/.github/workflows/main.yaml b/{{cookiecutter.project_slug}}/.github/workflows/main.yaml index 98417220..4a586a71 100644 --- a/{{cookiecutter.project_slug}}/.github/workflows/main.yaml +++ b/{{cookiecutter.project_slug}}/.github/workflows/main.yaml @@ -2,6 +2,10 @@ name: Main Workflow on: [ push, pull_request ] +env: + AWS_REGION: ${{ '{{ vars.AWS_REGION }}' }} + AWS_ACCOUNT_ID: ${{ '{{ vars.AWS_ACCOUNT_ID }}' }} + jobs: check-lint-and-formatting: runs-on: ubuntu-latest @@ -73,3 +77,64 @@ jobs: POSTGRES_HOST: postgres POSTGRES_PORT: 5432 {% if cookiecutter.use_celery == 'y' %} CELERY_BROKER_URL: redis://127.0.0.1:6379/0{% endif %} + + build-and-push-images: + if: github.ref == 'refs/heads/develop' || github.ref == 'refs/heads/main' + runs-on: ubuntu-latest + needs: [check-lint-and-formatting, backend-test] + + permissions: + id-token: write + contents: write + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + token: ${{ '{{secrets.GITHUB_TOKEN}}' }} + persist-credentials: false + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Configure AWS credentials from OIDC + uses: aws-actions/configure-aws-credentials@v4 + with: + role-to-assume: arn:aws:iam::${{ '{{ env.AWS_ACCOUNT_ID }}' }}:role/{{ cookiecutter.project_slug }}-github-oidc-role + aws-region: ${{ '{{ env.AWS_REGION }}' }} + + - name: Log in to Amazon ECR + id: login-ecr + uses: aws-actions/amazon-ecr-login@v1 + + - name: Set environment variables + run: | + echo "SHORT_SHA=$(git rev-parse --short HEAD)" >> $GITHUB_ENV + echo "BRANCH_NAME=$(echo ${{ '{{ github.ref }}' }} | sed s,refs/heads/,, | sed s,/,-,g)" >> $GITHUB_ENV + export TARGET_ENV=$(if [ "$BRANCH_NAME" = "main" ]; then echo "prod"; else echo "sandbox"; fi) + echo "TARGET_ENV=$TARGET_ENV" >> $GITHUB_ENV + echo "ECR_REPO_BACKEND=${{ '{{ env.AWS_ACCOUNT_ID }}' }}.dkr.ecr.${{ '{{ env.AWS_REGION }}' }}.amazonaws.com/{{ cookiecutter.project_dash }}-$TARGET_ENV-backend" >> $GITHUB_ENV + + - name: Build and push backend image + uses: docker/build-push-action@v5 + with: + context: ./backend + push: true + tags: ${{ '{{ env.ECR_REPO_BACKEND }}' }}:${{ '{{ env.SHORT_SHA }}' }},${{ '{{ env.ECR_REPO_BACKEND }}' }}:${{ '{{ env.BRANCH_NAME }}' }} + + - name: Tag Images + run: | + cd k8s/$TARGET_ENV + kustomize edit set image backend=$ECR_REPO_BACKEND:$SHORT_SHA + + - name: Commit & Push to GitHub + run: | + git config user.email "$GITHUB_EMAIL" + git config user.name "GitHub User" + git add k8s/$TARGET_ENV/kustomization.yaml + git commit -m "Update $TARGET_ENV image to $SHORT_SHA [skip ci]" + git push diff --git a/{{cookiecutter.project_slug}}/.gitignore b/{{cookiecutter.project_slug}}/.gitignore index 78a7796a..cddeeba0 100644 --- a/{{cookiecutter.project_slug}}/.gitignore +++ b/{{cookiecutter.project_slug}}/.gitignore @@ -28,6 +28,7 @@ dist/ # Unit test reports TEST*.xml +.coverage # Generated by MacOS .DS_Store diff --git a/{{cookiecutter.project_slug}}/.pre-commit-config.yaml b/{{cookiecutter.project_slug}}/.pre-commit-config.yaml index becbbb87..2b8f4df0 100644 --- a/{{cookiecutter.project_slug}}/.pre-commit-config.yaml +++ b/{{cookiecutter.project_slug}}/.pre-commit-config.yaml @@ -5,6 +5,7 @@ repos: - id: check-case-conflict - id: check-merge-conflict - id: debug-statements + exclude: ^backend/{{ cookiecutter.project_slug }}/utils/debugger.py - id: detect-aws-credentials args: ["--allow-missing-credentials"] - id: detect-private-key diff --git a/{{cookiecutter.project_slug}}/.yamlfmt b/{{cookiecutter.project_slug}}/.yamlfmt new file mode 100644 index 00000000..f77b07e0 --- /dev/null +++ b/{{cookiecutter.project_slug}}/.yamlfmt @@ -0,0 +1,5 @@ +formatter: + type: basic + include_document_start: false + drop_merge_tag: true + max_line_length: 0 diff --git a/{{cookiecutter.project_slug}}/.yamllint b/{{cookiecutter.project_slug}}/.yamllint new file mode 100644 index 00000000..83f5340c --- /dev/null +++ b/{{cookiecutter.project_slug}}/.yamllint @@ -0,0 +1,29 @@ +--- + +extends: default + +rules: + braces: + level: warning + max-spaces-inside: 1 + brackets: + level: warning + max-spaces-inside: 1 + colons: + level: warning + commas: + level: warning + comments: disable + comments-indentation: disable + document-start: disable + empty-lines: + level: warning + hyphens: + level: warning + indentation: + level: warning + indent-sequences: consistent + line-length: + level: warning + allow-non-breakable-inline-mappings: true + truthy: disable diff --git a/{{cookiecutter.project_slug}}/Makefile b/{{cookiecutter.project_slug}}/Makefile index 44203ff0..74f7608f 100644 --- a/{{cookiecutter.project_slug}}/Makefile +++ b/{{cookiecutter.project_slug}}/Makefile @@ -17,10 +17,14 @@ PROJECT_SLUG:="{{ cookiecutter.project_slug }}" .PHONY: ci ci: test secure build ## Execute the same checks used in CI/CD -check-lint-and-formatting: ## Execute check of lint and formatting using existing pre-commit hooks +.git/hooks/pre-commit: ## Install pre-commit hooks pip install pre-commit; \ cd backend/; \ - pre-commit install; \ + pre-commit install + +.PHONY: check-lint-and-formatting +check-lint-and-formatting: .git/hooks/pre-commit ## Execute check of lint and formatting using existing pre-commit hooks + cd backend; \ pre-commit run -a {% if cookiecutter.create_nextjs_frontend == 'y' %} @@ -34,11 +38,15 @@ check-lint-and-test-frontend: ## Frontend Lint & Typecheck & Test backend-test: ## Execute backend tests ifeq ($(CI),true) + pip install uv; \ cd backend; \ + uv venv ./venv; \ + . ./venv/bin/activate; \ uv pip install \ -r requirements/production.txt \ -r requirements/tests.txt; \ - cd {{ cookiecutter.project_slug }}; \ + cd scafman; \ + export DJANGO_SECRET_KEY="test"; \ pytest --cov=./ --cov-report html --ds=config.settings.test else $(KUBECTL_EXEC_BACKEND) -c "cd {{ cookiecutter.project_slug }} && pytest --cov=./ --cov-report html --ds=config.settings.test" @@ -127,8 +135,12 @@ secrets: @$(call check_var,ENVIRONMENT) @echo "Creating sealed secrets for $$(kubectl config current-context) cluster" kubectl config get-contexts --no-headers | \ - grep {{ cookiecutter.project_slug }}-$(ENVIRONMENT) && \ - kubectl config use-context admin@{{ cookiecutter.project_slug }}-$(ENVIRONMENT) + grep {{ cookiecutter.project_dash }}-$(ENVIRONMENT) && kubectl config use-context admin@{{ cookiecutter.project_dash }}-$(ENVIRONMENT) + AWS_S3_ACCESS_KEY_ID=$$(tofu -chdir=./terraform/$(ENVIRONMENT) output -raw cnpg_user_access_key) \ + AWS_S3_SECRET_ACCESS_KEY=$$(tofu -chdir=./terraform/$(ENVIRONMENT) output -raw cnpg_user_secret_key) \ +{% if cookiecutter.mail_service == "Amazon SES" %} AWS_SES_ACCESS_KEY_ID=$$(tofu -chdir=./terraform/$(ENVIRONMENT) output -raw amazon_ses_user_key) \ + AWS_SES_SECRET_ACCESS_KEY=$$(tofu -chdir=./terraform/$(ENVIRONMENT) output -raw amazon_ses_user_secret_key) \{% endif %} + DJANGO_SECRET_KEY=$$(LC_CTYPE=C tr -dc A-Za-z0-9 k8s/$(ENVIRONMENT)/secrets.yaml; fi @@ -150,49 +162,6 @@ prod-secrets: ## Create sealed secrets for prod debug-prod-secrets: ## Create sealed secrets for prod $(MAKE) secrets ENVIRONMENT=prod DEBUG=true - -argocd-app: - envsubst < k8s/templates/argocd.application.yaml.template | kubeseal --format yaml > k8s/argocd/application.yaml - envsubst < k8s/templates/repocreds.yaml.template | kubeseal --format yaml > k8s/argocd/repocreds.yaml - sed -i '/spec:/ {N; s/spec:\n/ annotations:\n sealedsecrets.bitnami.com\/managed: "true"\nspec:\n/}' k8s/argocd/repocreds.yaml - -## Monitoring -check_var = $(strip $(if $(filter undefined,$(origin $1)),$(error $1 is not set))) - -kube-prometheus-up: ## Install kube-prometheus - @$(call check_var,GRAFANA_ADMIN_PASSWORD) - @helm repo add prometheus-community https://prometheus-community.github.io/helm-charts - @helm repo update - @helm install kube-prometheus prometheus-community/kube-prometheus-stack --set grafana.sidecar.datasources.isDefaultDatasource=false,grafana.persistence.enabled=true,grafana.adminPassword=$(GRAFANA_ADMIN_PASSWORD) --namespace monitoring --create-namespace - -loki-up: ## Install loki - @helm repo add grafana https://grafana.github.io/helm-charts - @helm repo update - @helm install loki grafana/loki-stack --values k8s/_monitoring/loki-stack-values.yaml --namespace monitoring --create-namespace - -monitoring-up: kube-prometheus-up loki-up ## Install the monitoring stack - -loki-down: ## Uninstall loki - helm uninstall loki --namespace monitoring - -kube-prometheus-down: ## Uninstall kube-prometheus - helm uninstall kube-prometheus --namespace monitoring - -monitoring-down: loki-down kube-prometheus-down ## Uninstall the monitoring stack - -monitoring-login: ## Get the login credentials for the monitoring stack - @kubectl get secret --namespace monitoring kube-prometheus-grafana -o jsonpath='{.data.admin-user}' | base64 -d; echo - @kubectl get secret --namespace monitoring kube-prometheus-grafana -o jsonpath='{.data.admin-password}' | base64 -d; echo - -monitoring-port-forward: ## Forward the port for the monitoring stack - kubectl --namespace monitoring port-forward svc/kube-prometheus-grafana 8080:80 - -monitoring-dashboard: ## Create the dashboard for the monitoring stack - kubectl apply -f k8s/_monitoring/django-logs-table.yaml -n monitoring - -monitoring: ## Show the status of the monitoring stack - kubectl get all -n monitoring - ## Help help: ## Show the list of all the commands and their help text diff --git a/{{cookiecutter.project_slug}}/README.md b/{{cookiecutter.project_slug}}/README.md index 64418315..efe3b326 100644 --- a/{{cookiecutter.project_slug}}/README.md +++ b/{{cookiecutter.project_slug}}/README.md @@ -74,14 +74,15 @@ This project has a NextJS frontend configured. You can access it at [http://loca ## Infrastructure provisioning Terraform can be used to provision AWS resources for your project deployment. -terraform/ec2-cluster will create an EC2 instance running a kubernetes cluster for your project. -Check `terraform/ec2-cluster/README.md` for more information and steps for provisioning resources. +Read `terraform/README.md` for more information and steps for provisioning +resources. -## Project deployment +## Application deployment -ArgoCD and kubernetes can be used to automate the deployment of your project to your infrastructure. -ArgoCD will watch for changes in your repository and apply the kubernetes manifests. -Check `k8s/argocd/README.md` for more information on creating and setting up the ArgoCD application. +Use ArgoCD and Kubernetes to automate the deployment of your application to +your infrastructure. ArgoCD monitors changes within your repository, promptly +applying the relevant Kubernetes manifests. Read `bootstrap-cluster/README.md` +for more details. ## How to manage passwords and sensitive values diff --git a/{{cookiecutter.project_slug}}/argocd/base/argocd/app.yaml b/{{cookiecutter.project_slug}}/argocd/base/argocd/app.yaml new file mode 100644 index 00000000..1beedf5b --- /dev/null +++ b/{{cookiecutter.project_slug}}/argocd/base/argocd/app.yaml @@ -0,0 +1,33 @@ +apiVersion: argoproj.io/v1alpha1 +kind: Application +metadata: + name: argocd + namespace: argocd + annotations: + argocd.argoproj.io/sync-wave: "0" +spec: + project: default + source: + chart: argo-cd + repoURL: https://argoproj.github.io/argo-helm + targetRevision: 6.9.2 + helm: + releaseName: argocd + # https://argo-cd.readthedocs.io/en/stable/operator-manual/ingress/#traefik-v22 + valuesObject: + configs: + params: + server.insecure: true + destination: + server: "https://kubernetes.default.svc" + namespace: argocd + syncPolicy: + automated: + prune: true + selfHeal: true + retry: + limit: 5 + backoff: + duration: 5s + factor: 2 + maxDuration: 3m diff --git a/{{cookiecutter.project_slug}}/argocd/base/argocd/kustomization.yaml b/{{cookiecutter.project_slug}}/argocd/base/argocd/kustomization.yaml new file mode 100644 index 00000000..98860a01 --- /dev/null +++ b/{{cookiecutter.project_slug}}/argocd/base/argocd/kustomization.yaml @@ -0,0 +1,5 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +namespace: argocd +resources: +- app.yaml +kind: Kustomization diff --git a/{{cookiecutter.project_slug}}/argocd/base/cert-manager/app.yaml b/{{cookiecutter.project_slug}}/argocd/base/cert-manager/app.yaml new file mode 100644 index 00000000..78d17cfd --- /dev/null +++ b/{{cookiecutter.project_slug}}/argocd/base/cert-manager/app.yaml @@ -0,0 +1,33 @@ +apiVersion: argoproj.io/v1alpha1 +kind: Application +metadata: + name: cert-manager + namespace: argocd + annotations: + argocd.argoproj.io/sync-wave: "0" +spec: + project: default + source: + chart: cert-manager + repoURL: https://charts.jetstack.io + targetRevision: v1.14.5 + helm: + releaseName: cert-manager + parameters: + - name: "installCRDs" + value: "true" + destination: + server: "https://kubernetes.default.svc" + namespace: cert-manager + syncPolicy: + automated: + prune: true + selfHeal: true + retry: + limit: 5 + backoff: + duration: 5s + factor: 2 + maxDuration: 3m + syncOptions: + - CreateNamespace=true diff --git a/{{cookiecutter.project_slug}}/argocd/base/cert-manager/kustomization.yaml b/{{cookiecutter.project_slug}}/argocd/base/cert-manager/kustomization.yaml new file mode 100644 index 00000000..98860a01 --- /dev/null +++ b/{{cookiecutter.project_slug}}/argocd/base/cert-manager/kustomization.yaml @@ -0,0 +1,5 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +namespace: argocd +resources: +- app.yaml +kind: Kustomization diff --git a/{{cookiecutter.project_slug}}/argocd/base/cloudnative-pg/app.yaml b/{{cookiecutter.project_slug}}/argocd/base/cloudnative-pg/app.yaml new file mode 100644 index 00000000..842db5bc --- /dev/null +++ b/{{cookiecutter.project_slug}}/argocd/base/cloudnative-pg/app.yaml @@ -0,0 +1,33 @@ +apiVersion: argoproj.io/v1alpha1 +kind: Application +metadata: + name: cloudnative-pg + namespace: argocd + annotations: + argocd.argoproj.io/sync-wave: "0" +spec: + project: default + source: + chart: cloudnative-pg + repoURL: https://cloudnative-pg.github.io/charts + targetRevision: v0.19.1 + helm: + releaseName: cloudnative-pg + parameters: + - name: "fullnameOverride" + value: "cnpg-controller-manager" + destination: + server: "https://kubernetes.default.svc" + namespace: cnpg-system + syncPolicy: + automated: + prune: true + selfHeal: true + retry: + limit: 5 + backoff: + duration: 5s + factor: 2 + maxDuration: 3m + syncOptions: + - CreateNamespace=true diff --git a/{{cookiecutter.project_slug}}/argocd/base/cloudnative-pg/kustomization.yaml b/{{cookiecutter.project_slug}}/argocd/base/cloudnative-pg/kustomization.yaml new file mode 100644 index 00000000..98860a01 --- /dev/null +++ b/{{cookiecutter.project_slug}}/argocd/base/cloudnative-pg/kustomization.yaml @@ -0,0 +1,5 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +namespace: argocd +resources: +- app.yaml +kind: Kustomization diff --git a/{{cookiecutter.project_slug}}/argocd/base/ingress/app.yaml b/{{cookiecutter.project_slug}}/argocd/base/ingress/app.yaml new file mode 100644 index 00000000..8149f052 --- /dev/null +++ b/{{cookiecutter.project_slug}}/argocd/base/ingress/app.yaml @@ -0,0 +1,28 @@ +apiVersion: argoproj.io/v1alpha1 +kind: Application +metadata: + name: ingress + namespace: argocd + annotations: + argocd.argoproj.io/sync-wave: "3" +spec: + project: default + source: + repoURL: {{ cookiecutter.repo_url }} + targetRevision: main + path: argocd/prod/ingress + destination: + server: https://kubernetes.default.svc + namespace: default + syncPolicy: + automated: + prune: true + selfHeal: true + retry: + limit: 5 + backoff: + duration: 5s + factor: 2 + maxDuration: 3m + syncOptions: + - CreateNamespace=true diff --git a/{{cookiecutter.project_slug}}/argocd/base/ingress/kustomization.yaml b/{{cookiecutter.project_slug}}/argocd/base/ingress/kustomization.yaml new file mode 100644 index 00000000..98860a01 --- /dev/null +++ b/{{cookiecutter.project_slug}}/argocd/base/ingress/kustomization.yaml @@ -0,0 +1,5 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +namespace: argocd +resources: +- app.yaml +kind: Kustomization diff --git a/{{cookiecutter.project_slug}}/argocd/base/kube-prometheus-stack/app.yaml b/{{cookiecutter.project_slug}}/argocd/base/kube-prometheus-stack/app.yaml new file mode 100644 index 00000000..cbdc7686 --- /dev/null +++ b/{{cookiecutter.project_slug}}/argocd/base/kube-prometheus-stack/app.yaml @@ -0,0 +1,46 @@ +apiVersion: argoproj.io/v1alpha1 +kind: Application +metadata: + name: kube-prometheus-stack + namespace: argocd + annotations: + argocd.argoproj.io/sync-wave: "1" +spec: + project: default + source: + chart: kube-prometheus-stack + repoURL: https://prometheus-community.github.io/helm-charts + targetRevision: 60.3.0 + helm: + releaseName: kube-prometheus-stack + valuesObject: + alertmanager: + enabled: false + grafana: + enabled: false + prometheusOperator: + resources: + limits: + cpu: 100m + memory: 200Mi + requests: + cpu: 50m + memory: 100Mi + + destination: + server: "https://kubernetes.default.svc" + namespace: monitoring + syncPolicy: + automated: {} + # automated: + # prune: true + # selfHeal: true + retry: + limit: 5 + backoff: + duration: 5s + factor: 2 + maxDuration: 3m + syncOptions: + - CreateNamespace=true + - ServerSideApply=true diff --git a/{{cookiecutter.project_slug}}/argocd/base/kube-prometheus-stack/kustomization.yaml b/{{cookiecutter.project_slug}}/argocd/base/kube-prometheus-stack/kustomization.yaml new file mode 100644 index 00000000..98860a01 --- /dev/null +++ b/{{cookiecutter.project_slug}}/argocd/base/kube-prometheus-stack/kustomization.yaml @@ -0,0 +1,5 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +namespace: argocd +resources: +- app.yaml +kind: Kustomization diff --git a/{{cookiecutter.project_slug}}/argocd/base/local-path-provisioner/kustomization.yaml b/{{cookiecutter.project_slug}}/argocd/base/local-path-provisioner/kustomization.yaml new file mode 100644 index 00000000..5bddcd33 --- /dev/null +++ b/{{cookiecutter.project_slug}}/argocd/base/local-path-provisioner/kustomization.yaml @@ -0,0 +1,36 @@ +# kustomization.yaml +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +resources: +- github.com/rancher/local-path-provisioner/deploy?ref=v0.0.26 +patches: +- patch: |- + kind: ConfigMap + apiVersion: v1 + metadata: + name: local-path-config + namespace: local-path-storage + data: + config.json: |- + { + "nodePathMap":[ + { + "node":"DEFAULT_PATH_FOR_NON_LISTED_NODES", + "paths":["/var/local-path-provisioner"] + } + ] + } +- patch: |- + apiVersion: storage.k8s.io/v1 + kind: StorageClass + metadata: + name: local-path + annotations: + storageclass.kubernetes.io/is-default-class: "true" +- patch: |- + apiVersion: v1 + kind: Namespace + metadata: + name: local-path-storage + labels: + pod-security.kubernetes.io/enforce: privileged diff --git a/{{cookiecutter.project_slug}}/argocd/base/reflector/app.yaml b/{{cookiecutter.project_slug}}/argocd/base/reflector/app.yaml new file mode 100644 index 00000000..7fc3d814 --- /dev/null +++ b/{{cookiecutter.project_slug}}/argocd/base/reflector/app.yaml @@ -0,0 +1,28 @@ +apiVersion: argoproj.io/v1alpha1 +kind: Application +metadata: + name: reflector + namespace: argocd + annotations: + argocd.argoproj.io/sync-wave: "0" +spec: + project: default + source: + chart: reflector + repoURL: https://emberstack.github.io/helm-charts + targetRevision: 7.1.262 + helm: + releaseName: reflector + destination: + server: "https://kubernetes.default.svc" + namespace: kube-system + syncPolicy: + automated: + prune: true + selfHeal: true + retry: + limit: 5 + backoff: + duration: 5s + factor: 2 + maxDuration: 3m diff --git a/{{cookiecutter.project_slug}}/argocd/base/reflector/kustomization.yaml b/{{cookiecutter.project_slug}}/argocd/base/reflector/kustomization.yaml new file mode 100644 index 00000000..98860a01 --- /dev/null +++ b/{{cookiecutter.project_slug}}/argocd/base/reflector/kustomization.yaml @@ -0,0 +1,5 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +namespace: argocd +resources: +- app.yaml +kind: Kustomization diff --git a/{{cookiecutter.project_slug}}/argocd/base/sealed-secrets/app.yaml b/{{cookiecutter.project_slug}}/argocd/base/sealed-secrets/app.yaml new file mode 100644 index 00000000..54ed77cc --- /dev/null +++ b/{{cookiecutter.project_slug}}/argocd/base/sealed-secrets/app.yaml @@ -0,0 +1,31 @@ +apiVersion: argoproj.io/v1alpha1 +kind: Application +metadata: + name: sealed-secrets + namespace: argocd + annotations: + argocd.argoproj.io/sync-wave: "0" +spec: + project: default + source: + chart: sealed-secrets + repoURL: https://bitnami-labs.github.io/sealed-secrets + targetRevision: 2.13.2 + helm: + releaseName: sealed-secrets + parameters: + - name: "fullnameOverride" + value: sealed-secrets-controller + destination: + server: "https://kubernetes.default.svc" + namespace: kube-system + syncPolicy: + automated: + prune: true + selfHeal: true + retry: + limit: 5 + backoff: + duration: 5s + factor: 2 + maxDuration: 3m diff --git a/{{cookiecutter.project_slug}}/argocd/base/sealed-secrets/kustomization.yaml b/{{cookiecutter.project_slug}}/argocd/base/sealed-secrets/kustomization.yaml new file mode 100644 index 00000000..98860a01 --- /dev/null +++ b/{{cookiecutter.project_slug}}/argocd/base/sealed-secrets/kustomization.yaml @@ -0,0 +1,5 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +namespace: argocd +resources: +- app.yaml +kind: Kustomization diff --git a/{{cookiecutter.project_slug}}/argocd/base/traefik/app.yaml b/{{cookiecutter.project_slug}}/argocd/base/traefik/app.yaml new file mode 100644 index 00000000..9eb6ab8a --- /dev/null +++ b/{{cookiecutter.project_slug}}/argocd/base/traefik/app.yaml @@ -0,0 +1,37 @@ +apiVersion: argoproj.io/v1alpha1 +kind: Application +metadata: + name: traefik + namespace: argocd + annotations: + argocd.argoproj.io/sync-wave: "0" +spec: + project: default + source: + chart: traefik + repoURL: https://traefik.github.io/charts + targetRevision: 28.0.0 + helm: + releaseName: traefik + parameters: + - name: "service.type" + value: NodePort + - name: "ports.web.nodePort" + value: "30080" + - name: "ports.websecure.nodePort" + value: "30443" + - name: "deployment.kind" + value: DaemonSet + destination: + server: "https://kubernetes.default.svc" + namespace: kube-system + syncPolicy: + automated: + prune: true + selfHeal: true + retry: + limit: 5 + backoff: + duration: 5s + factor: 2 + maxDuration: 3m diff --git a/{{cookiecutter.project_slug}}/argocd/base/traefik/kustomization.yaml b/{{cookiecutter.project_slug}}/argocd/base/traefik/kustomization.yaml new file mode 100644 index 00000000..98860a01 --- /dev/null +++ b/{{cookiecutter.project_slug}}/argocd/base/traefik/kustomization.yaml @@ -0,0 +1,5 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +namespace: argocd +resources: +- app.yaml +kind: Kustomization diff --git a/{{cookiecutter.project_slug}}/argocd/base/{{ cookiecutter.project_slug }}/app.yaml b/{{cookiecutter.project_slug}}/argocd/base/{{ cookiecutter.project_slug }}/app.yaml new file mode 100644 index 00000000..96e4f4dc --- /dev/null +++ b/{{cookiecutter.project_slug}}/argocd/base/{{ cookiecutter.project_slug }}/app.yaml @@ -0,0 +1,26 @@ +apiVersion: argoproj.io/v1alpha1 +kind: Application +metadata: + name: {{ cookiecutter.project_slug }}-prod + namespace: argocd +spec: + project: default + source: + repoURL: {{ cookiecutter.repo_url }} + targetRevision: main + path: k8s/prod + destination: + server: https://kubernetes.default.svc + namespace: {{ cookiecutter.project_slug }}-prod + syncPolicy: + automated: + prune: true + selfHeal: true + retry: + limit: 5 + backoff: + duration: 5s + factor: 2 + maxDuration: 3m + syncOptions: + - CreateNamespace=true diff --git a/{{cookiecutter.project_slug}}/argocd/base/{{ cookiecutter.project_slug }}/kustomization.yaml b/{{cookiecutter.project_slug}}/argocd/base/{{ cookiecutter.project_slug }}/kustomization.yaml new file mode 100644 index 00000000..98860a01 --- /dev/null +++ b/{{cookiecutter.project_slug}}/argocd/base/{{ cookiecutter.project_slug }}/kustomization.yaml @@ -0,0 +1,5 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +namespace: argocd +resources: +- app.yaml +kind: Kustomization diff --git a/{{cookiecutter.project_slug}}/argocd/prod/apps/kustomization.yaml b/{{cookiecutter.project_slug}}/argocd/prod/apps/kustomization.yaml new file mode 100644 index 00000000..fdeb2bd7 --- /dev/null +++ b/{{cookiecutter.project_slug}}/argocd/prod/apps/kustomization.yaml @@ -0,0 +1,25 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +namespace: argocd +resources: +- ../../base/argocd +- ../../base/cert-manager +- ../../base/cloudnative-pg +- ../../base/ingress +- ../../base/kube-prometheus-stack +- ../../base/local-path-provisioner +- ../../base/reflector +- ../../base/sealed-secrets +- ../../base/traefik +- ../../base/{{ cookiecutter.project_slug }} +kind: Kustomization +patches: +- patch: |- + - op: replace + path: /spec/source/targetRevision + value: main + - op: replace + path: /spec/source/path + value: argocd/prod/ingress + target: + kind: Application + name: ingress diff --git a/{{cookiecutter.project_slug}}/argocd/prod/ingress/kustomization.yaml b/{{cookiecutter.project_slug}}/argocd/prod/ingress/kustomization.yaml new file mode 100644 index 00000000..c16b76dc --- /dev/null +++ b/{{cookiecutter.project_slug}}/argocd/prod/ingress/kustomization.yaml @@ -0,0 +1,35 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +resources: +- ../../sandbox/ingress +patches: +- patch: |- + - op: replace + path: /metadata/name + value: argocd-{{ cookiecutter.project_slug }}-tls + - op: replace + path: /spec/secretName + value: argocd-{{ cookiecutter.project_slug }}-tls + - op: replace + path: /spec/dnsNames + value: + - argocd.{{ cookiecutter.domain_name }} + target: + kind: Certificate + name: argocd-sandbox-{{ cookiecutter.project_slug }}-tls +- patch: |- + - op: replace + path: /metadata/name + value: argocd-{{ cookiecutter.project_slug }} + - op: replace + path: /spec/routes/0/match + value: Host(`argocd.{{ cookiecutter.domain_name }}`) + - op: replace + path: /spec/routes/1/match + value: Host(`argocd.{{ cookiecutter.domain_name }}`) && Headers(`Content-Type`, `application/grpc`) + - op: replace + path: /spec/tls + value: argocd-{{ cookiecutter.project_slug }}-tls + target: + kind: IngressRoute + name: argocd-sandbox-{{ cookiecutter.project_slug }} +kind: Kustomization diff --git a/{{cookiecutter.project_slug}}/argocd/sandbox/apps/kustomization.yaml b/{{cookiecutter.project_slug}}/argocd/sandbox/apps/kustomization.yaml new file mode 100644 index 00000000..96f0a07e --- /dev/null +++ b/{{cookiecutter.project_slug}}/argocd/sandbox/apps/kustomization.yaml @@ -0,0 +1,40 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +namespace: argocd +resources: +- ../../base/argocd +- ../../base/cert-manager +- ../../base/cloudnative-pg +- ../../base/ingress +- ../../base/local-path-provisioner +- ../../base/reflector +- ../../base/sealed-secrets +- ../../base/traefik +- ../../base/{{ cookiecutter.project_slug }} +kind: Kustomization +patches: +- patch: |- + - op: replace + path: /spec/source/targetRevision + value: develop + - op: replace + path: /spec/source/path + value: argocd/sandbox/ingress + target: + kind: Application + name: ingress +- patch: |- + - op: replace + path: /spec/source/targetRevision + value: develop + - op: replace + path: /metadata/name + value: {{ cookiecutter.project_slug }}-sandbox + - op: replace + path: /spec/source/path + value: k8s/sandbox + - op: replace + path: /spec/destination/namespace + value: {{ cookiecutter.project_slug }}-sandbox + target: + kind: Application + name: {{ cookiecutter.project_slug }}-prod diff --git a/{{cookiecutter.project_slug}}/argocd/sandbox/ingress/cert-manager-issuer.yaml b/{{cookiecutter.project_slug}}/argocd/sandbox/ingress/cert-manager-issuer.yaml new file mode 100644 index 00000000..f3b58484 --- /dev/null +++ b/{{cookiecutter.project_slug}}/argocd/sandbox/ingress/cert-manager-issuer.yaml @@ -0,0 +1,33 @@ +apiVersion: cert-manager.io/v1 +kind: ClusterIssuer +metadata: + name: letsencrypt-prod + annotations: + argocd.argoproj.io/sync-wave: "1" +spec: + acme: + server: https://acme-v02.api.letsencrypt.org/directory + email: {{ cookiecutter.email }} + privateKeySecretRef: + name: letsencrypt-prod + solvers: + - http01: + ingress: + class: traefik +--- +apiVersion: cert-manager.io/v1 +kind: ClusterIssuer +metadata: + name: letsencrypt-staging + annotations: + argocd.argoproj.io/sync-wave: "1" +spec: + acme: + server: https://acme-staging-v02.api.letsencrypt.org/directory + email: {{ cookiecutter.email }} + privateKeySecretRef: + name: letsencrypt-staging + solvers: + - http01: + ingress: + class: traefik diff --git a/{{cookiecutter.project_slug}}/argocd/sandbox/ingress/certificates.yaml b/{{cookiecutter.project_slug}}/argocd/sandbox/ingress/certificates.yaml new file mode 100644 index 00000000..01107ada --- /dev/null +++ b/{{cookiecutter.project_slug}}/argocd/sandbox/ingress/certificates.yaml @@ -0,0 +1,15 @@ +--- +apiVersion: cert-manager.io/v1 +kind: Certificate +metadata: + name: argocd-sandbox-{{ cookiecutter.project_slug }}-tls + namespace: argocd + annotations: + argocd.argoproj.io/sync-wave: "3" +spec: + secretName: argocd-sandbox-{{ cookiecutter.project_slug }}-tls + issuerRef: + name: letsencrypt-prod + kind: ClusterIssuer + dnsNames: + - argocd.sandbox.{{ cookiecutter.domain_name }} diff --git a/{{cookiecutter.project_slug}}/argocd/sandbox/ingress/ingress.yaml b/{{cookiecutter.project_slug}}/argocd/sandbox/ingress/ingress.yaml new file mode 100644 index 00000000..f7711494 --- /dev/null +++ b/{{cookiecutter.project_slug}}/argocd/sandbox/ingress/ingress.yaml @@ -0,0 +1,59 @@ +--- +apiVersion: traefik.io/v1alpha1 +kind: IngressRoute +metadata: + name: argocd-sandbox-{{ cookiecutter.project_slug }} + annotations: + argocd.argoproj.io/sync-wave: "2" + namespace: argocd +spec: + entryPoints: + - websecure + routes: + - kind: Rule + match: Host(`argocd.sandbox.{{ cookiecutter.domain_name }}`) + priority: 10 + services: + - name: argocd-server + port: 80 + - kind: Rule + match: Host(`argocd.sandbox.{{ cookiecutter.domain_name }}`) && Headers(`Content-Type`, `application/grpc`) + priority: 11 + services: + - name: argocd-server + port: 80 + scheme: h2c + tls: + secretName: argocd-sandbox-{{ cookiecutter.project_slug }}-tls +--- +apiVersion: traefik.io/v1alpha1 +kind: IngressRoute +metadata: + name: http-to-https-redirect + namespace: argocd + annotations: + argocd.argoproj.io/sync-wave: "5" +spec: + entryPoints: + - web + routes: + - kind: Rule + match: PathPrefix(`/`) + priority: 1 + middlewares: + - name: redirect-to-https + services: + - kind: TraefikService + name: noop@internal +--- +apiVersion: traefik.io/v1alpha1 +kind: Middleware +metadata: + name: redirect-to-https + namespace: argocd + annotations: + argocd.argoproj.io/sync-wave: "5" +spec: + redirectScheme: + scheme: https + permanent: true diff --git a/{{cookiecutter.project_slug}}/argocd/sandbox/ingress/kustomization.yaml b/{{cookiecutter.project_slug}}/argocd/sandbox/ingress/kustomization.yaml new file mode 100644 index 00000000..f8369620 --- /dev/null +++ b/{{cookiecutter.project_slug}}/argocd/sandbox/ingress/kustomization.yaml @@ -0,0 +1,6 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +resources: +- cert-manager-issuer.yaml +- certificates.yaml +- ingress.yaml +kind: Kustomization diff --git a/{{cookiecutter.project_slug}}/backend/{{cookiecutter.project_slug}}/utils/debugger.py b/{{cookiecutter.project_slug}}/backend/{{cookiecutter.project_slug}}/utils/debugger.py index 2cadfe6a..99ae6d05 100644 --- a/{{cookiecutter.project_slug}}/backend/{{cookiecutter.project_slug}}/utils/debugger.py +++ b/{{cookiecutter.project_slug}}/backend/{{cookiecutter.project_slug}}/utils/debugger.py @@ -6,11 +6,11 @@ def debugger_connect_pycharm(host_ip): - logger.info(f"Pycharm pydevd connecting...") + logger.info("Pycharm pydevd connecting...") import pydevd_pycharm try: pydevd_pycharm.settrace(host_ip, port=6400, stdoutToServer=True, stderrToServer=True) - except ConnectionRefusedError as e: + except ConnectionRefusedError: msg = "Debugger connection failed. Check IDE debugger is running and try again. Continuing without debugger." logger.error(msg.upper()) diff --git a/{{cookiecutter.project_slug}}/bootstrap-cluster/.gitignore b/{{cookiecutter.project_slug}}/bootstrap-cluster/.gitignore new file mode 100644 index 00000000..322b2ade --- /dev/null +++ b/{{cookiecutter.project_slug}}/bootstrap-cluster/.gitignore @@ -0,0 +1,7 @@ +!sandbox/.env +!staging/.env +!prod/.env +controlplane.yaml +kubeconfig +talosconfig +worker.yaml diff --git a/{{cookiecutter.project_slug}}/bootstrap-cluster/README.md b/{{cookiecutter.project_slug}}/bootstrap-cluster/README.md new file mode 100644 index 00000000..01d3595a --- /dev/null +++ b/{{cookiecutter.project_slug}}/bootstrap-cluster/README.md @@ -0,0 +1,222 @@ +# Bootstrap Talos and ArgoCD + +After deploying infrastructure using Terraform, we can proceed with configuring +Talos and bootstrapping ArgoCD. + +Terraform is solely utilized for deploying infrastructure. Any subsequent +configuration of Talos or ArgoCD is done using Taskfile tasks. + +To view a list of tasks and their descriptions, navigate to the +`bootstrap-cluster` directory and execute `task`. + +Note that there is a directory for each environment: sandbox, staging, and +cluster. + +We recommend opening the AWS serial console for each ec2 instance to monitor the +bootstrap process. + +### Bootstrapping Talos + +1. Navigate to the directory corresponding to the environment being set up and + run: + + ```shell + export ENV=sandbox + cd $ENV + ``` + +2. Review the `.env` file for the given environment: + + ```shell + CONTROL_PLANE_ENDPOINT: "https://k8s.sandbox.{{ cookiecutter.domain_name }}:6443" + CLUSTER_NAME: "{{ cookiecutter.project_dash }}-sandbox" + ``` + + Note that we use a Talos factory image. This image contains a system + extension that provides the ECR credential provider. + + ``` + siderolabs/ecr-credential-provider (v1.28.1) + + This system extension provides a binary which implements Kubelet's + CredentialProvider API to authenticate against AWS' Elastic Container + Registry and pull images. + ``` + +3. Bootstrap Talos with the following command: + + ``` + task talos:bootstrap + ``` + + To understand what this task will do, examine the Taskfile configuration: + + ``` + bootstrap: + desc: | + Run all tasks required to bootstrap the Talos and Kubernetes cluster. + requires: + vars: [ENV] + cmds: + - task: generate_configs + - task: set_node_ips + - task: store_controlplane_config + - task: store_talosconfig + - task: apply_talos_config + - sleep 30 + - task: bootstrap_kubernetes + - sleep 30 + - task: generate_kubeconfig + - task: store_kubeconfig + - task: upgrade_talos + - task: enable_ecr_credential_helper + ``` + + It takes a few minutes for the cluster nodes to register as etcd + members and synchronize. + + If the cluster fails to bootstrap, refer to the Troubleshooting section + below. + +4. Verify the health of your cluster with: + + ```shell + task talos:health + ``` + +5. Test kubectl access: + + ```shell + eval $(task talos:kubeconfig) + kubectl cluster-info + ``` + + This should return output similar to the following: + + ```shell + $ kubectl cluster-info + Kubernetes control plane is running at https://k8s.sandbox.{{ cookiecutter.domain_name }}:6443 + CoreDNS is running at https://k8s.sandbox.{{ cookiecutter.domain_name }}:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy + + To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'. + ``` + +### Bootstrapping ArgoCD + +1. Review the branches used for deployment to the sandbox, staging and + production environments. The default configuration will release the `develop` + branch to the Sandbox and the `main` branch to the Production environment. + Make sure to make the `develop` branch the default branch for PRs on a newly + created Git repository. + + Review the branch rule in `bootstrap_root_app` job in + `bootstrap-cluster/argocd.yaml`: + + ``` + vars: + BRANCH: + sh: ([ "$ENV" = "production" ] && echo "main" || echo "develop") + ``` + + Review the `targetRevision` in the `kustomization.yaml` files shown below: + + `argocd/sandbox/apps/kustomization.yaml`: + + ``` + patches: + - patch: |- + - op: replace + path: /spec/source/targetRevision + value: develop + target: + kind: Application + name: ingress + ... + - patch: |- + - op: replace + path: /spec/source/targetRevision + value: develop + target: + kind: Application + name: {{ cookiecutter.project_slug }}-prod + ``` + + `argocd/prod/apps/kustomization.yaml`: + + ``` + patches: + - patch: |- + - op: replace + path: /spec/source/targetRevision + value: main + target: + kind: Application + name: ingress + ``` + +2. Next, we need to create a GitHub deploy key to allow ArgoCD to monitor the + repo. This step requires access to the 1password vault for your project. + + Review the vault name in the `op` cli command in + `bootstrap-cluster/argocd.yaml`: + + ``` + - op item create + ... + --vault='{{ cookiecutter.project_name }}' + ``` + + Sign into 1password with `op signin` and generate the deploy key: + + ```shell + task argocd:generate_github_deploy_key + ``` + +3. Add the deploy key to your Git repository + +4. Proceed with installing ArgoCD by executing: + + ```shell + task argocd:bootstrap + ``` + +The `argocd:bootstrap` task configuration is as follows: + +``` + bootstrap: + desc: Setup ArgoCD + cmds: + - task: install + - task: create_repo_credentials_secret + - task: bootstrap_root_app +``` + +5. ArgoCD will install the Sealed Secrets operator in the cluster. Once it is + installed, we can generate secrets for the given environment. + + ```shell + cd .. + make debug-$ENV-secrets + make $ENV-secrets + ``` + +6. Commit the `secrets.yaml` file for the given environment and push it to the + repo. + +## Troubleshooting + +If bootstrapping Talos fails, we recommend resetting the config files and +recreating ec2 instances before trying again. + +1. Reset config and state with `task talos:reset_config` for the given + environment. + +2. Destroy and recreate ec2 instances: + + cd ../terraform/$ENV/ + terraform destroy \ + -target "module.cluster.module.control_plane_nodes[0].aws_instance.this[0]" \ + -target "module.c luster.module.control_plane_nodes[1].aws_instance.this[0]" \ + -target "module.c luster.module.control_plane_nodes[1].aws_instance.this[0]" + terraform plan -out="tfplan.out" + terraform apply tfplan.out diff --git a/{{cookiecutter.project_slug}}/bootstrap-cluster/argocd.yaml b/{{cookiecutter.project_slug}}/bootstrap-cluster/argocd.yaml new file mode 100644 index 00000000..6760a520 --- /dev/null +++ b/{{cookiecutter.project_slug}}/bootstrap-cluster/argocd.yaml @@ -0,0 +1,80 @@ +version: '3' + +env: + KUBECONFIG: ./{{ '{{.ENV}}' }}/kubeconfig + GITHUB_DEPLOY_KEY_TITLE: "{{ cookiecutter.project_name }} ArgoCD GitHub Deploy Key" + +tasks: + generate_github_deploy_key: + desc: | + Use the 1password CLI to generate a GitHub deploy key + requires: + vars: [ENV] + cmds: + - op item create + --category=ssh-key + --title='{{ '{{.GITHUB_DEPLOY_KEY_TITLE}}' }}' + --vault='{{ cookiecutter.project_name }}' + --ssh-generate-key ed25519 + + bootstrap: + desc: Setup ArgoCD + cmds: + - task: install + - task: create_repo_credentials_secret + - task: bootstrap_root_app + + install: + desc: Deploy ArgoCD using Helm + cmds: + - helm install argocd argo-cd + --repo https://argoproj.github.io/argo-helm + --version {{ '{{.ARGOCD_VERSION}}' }} + --namespace argocd + --create-namespace + --set configs.params.server.insecure=true + + create_repo_credentials_secret: + requires: + vars: [ENV] + vars: + GITHUB_DEPLOY_KEY_B64: + sh: op read "op://{{ cookiecutter.project_name }}/{{ '{{.GITHUB_DEPLOY_KEY_TITLE}}' }}/private key?ssh-format=openssh" | base64 -w0 + desc: Create and apply repo credentials secret for each repo + cmds: + - | + cat < ./{{ '{{.ENV}}' }}/kubeconfig + - | + aws secretsmanager get-secret-value \ + --secret-id "{{ '{{.ENV}}' }}_talosconfig_yaml" | \ + yq ".SecretString" | tr -d '"' | \ + base64 -d > ./{{ '{{.ENV}}' }}/talosconfig + - | + aws secretsmanager get-secret-value \ + --secret-id "{{ '{{.ENV}}' }}_talos_controlplane_yaml" | \ + yq ".SecretString" | tr -d '"' | \ + base64 -d > ./{{ '{{.ENV}}' }}/controlplane.yaml diff --git a/{{cookiecutter.project_slug}}/bootstrap-cluster/taskfile.yaml b/{{cookiecutter.project_slug}}/bootstrap-cluster/taskfile.yaml new file mode 100644 index 00000000..1a0a2e4b --- /dev/null +++ b/{{cookiecutter.project_slug}}/bootstrap-cluster/taskfile.yaml @@ -0,0 +1,15 @@ +version: '3' + +dotenv: ['.env', '{{ "{{.ENV}}" }}/.env'] + +includes: + argocd: ./argocd.yaml + talos: ./talos.yaml + +tasks: + default: + desc: | + List all available tasks in the Taskfile. + cmds: + - task --list + diff --git a/{{cookiecutter.project_slug}}/k8s/base/ingress.yaml b/{{cookiecutter.project_slug}}/k8s/base/ingress.yaml index 983fe952..d6e93f87 100644 --- a/{{cookiecutter.project_slug}}/k8s/base/ingress.yaml +++ b/{{cookiecutter.project_slug}}/k8s/base/ingress.yaml @@ -1,5 +1,5 @@ {% if cookiecutter.create_nextjs_frontend == "y" %} -apiVersion: traefik.containo.us/v1alpha1 +apiVersion: traefik.io/v1alpha1 kind: IngressRoute metadata: name: frontend-ingress @@ -19,7 +19,7 @@ spec: certResolver: letsencrypt --- {% endif %} -apiVersion: traefik.containo.us/v1alpha1 +apiVersion: traefik.io/v1alpha1 kind: IngressRoute metadata: name: backend-ingress @@ -38,7 +38,7 @@ spec: tls: certResolver: letsencrypt --- -apiVersion: traefik.containo.us/v1alpha1 +apiVersion: traefik.io/v1alpha1 kind: IngressRoute metadata: name: http-to-https-redirect @@ -55,7 +55,7 @@ spec: - kind: TraefikService name: noop@internal --- -apiVersion: traefik.containo.us/v1alpha1 +apiVersion: traefik.io/v1alpha1 kind: Middleware metadata: name: redirect-to-https diff --git a/{{cookiecutter.project_slug}}/k8s/prod/cluster-issuer.yaml b/{{cookiecutter.project_slug}}/k8s/prod/cluster-issuer.yaml deleted file mode 100644 index ad430bdf..00000000 --- a/{{cookiecutter.project_slug}}/k8s/prod/cluster-issuer.yaml +++ /dev/null @@ -1,37 +0,0 @@ -apiVersion: cert-manager.io/v1 -kind: ClusterIssuer -metadata: - name: letsencrypt-staging -spec: - acme: - # The ACME server URL for Let’s Encrypt’s staging environment - server: https://acme-staging-v02.api.letsencrypt.org/directory - # Email address used for ACME registration - email: {{ cookiecutter.email }} - # Name of a secret used to store the ACME account private key - privateKeySecretRef: - name: letsencrypt-staging - # Enable the HTTP-01 challenge provider - solvers: - - http01: - ingress: - class: traefik ---- -apiVersion: cert-manager.io/v1 -kind: ClusterIssuer -metadata: - name: letsencrypt-prod -spec: - acme: - # The ACME server URL for Let’s Encrypt’s production environment - server: https://acme-v02.api.letsencrypt.org/directory - # Email address used for ACME registration - email: {{ cookiecutter.email }} - # Name of a secret used to store the ACME account private key - privateKeySecretRef: - name: letsencrypt-prod - # Enable the HTTP-01 challenge provider - solvers: - - http01: - ingress: - class: traefik diff --git a/{{cookiecutter.project_slug}}/k8s/prod/kustomization.yaml b/{{cookiecutter.project_slug}}/k8s/prod/kustomization.yaml index 53668a28..456b9be5 100644 --- a/{{cookiecutter.project_slug}}/k8s/prod/kustomization.yaml +++ b/{{cookiecutter.project_slug}}/k8s/prod/kustomization.yaml @@ -3,69 +3,46 @@ kind: Kustomization namespace: {{ cookiecutter.project_dash }}-prod resources: - - ../base - - certificate.yaml - - cluster-issuer.yaml - - ingress-route.yaml - - postgres.cnpg.yaml + - ../sandbox - secrets.yaml patches: +- target: + kind: SealedSecret + name: secrets-config + path: secrets.yaml - patch: |- - op: replace - path: /spec/template/spec/containers/0/command - value: ["daphne"] + path: /spec/issuerRef/name + value: letsencrypt-prod - op: replace - path: /spec/template/spec/containers/0/args - value: ["--bind", "0.0.0.0", "--port", "8000", "--ping-interval", "15", "--ping-timeout", "5", "config.asgi:application"] - - op: add - path: /spec/template/spec/imagePullSecrets - value: - - name: regcred - - op: add - path: /spec/template/spec/initContainers/0/env + path: /spec/dnsNames value: - - name: POSTGRES_HOST - valueFrom: - secretKeyRef: - name: postgres-app - key: host + - api.{{ cookiecutter.domain_name }} + - k8s.{{ cookiecutter.domain_name }} + target: + kind: Certificate + name: cluster-cert +- patch: |- - op: replace - path: /spec/template/spec/initContainers/0/command - value: ["sh", "-c", "until pg_isready -h $(POSTGRES_HOST); do echo waiting for postgres; sleep 2; done;"] - - op: add - path: /spec/template/spec/initContainers/1/env - value: - - name: DATABASE_URL - valueFrom: - secretKeyRef: - name: postgres-app - key: uri - - op: add - path: /spec/template/spec/containers/0/env - value: - - name: POSTGRES_HOST - valueFrom: - secretKeyRef: - name: postgres-app - key: host - - name: DATABASE_URL - valueFrom: - secretKeyRef: - name: postgres-app - key: uri + path: /metadata/annotations/cert-manager.io~1cluster-issuer + value: letsencrypt-prod + - op: replace + path: /spec/routes/0/match + value: Host(`api.{{ cookiecutter.domain_name }}`) target: - kind: Deployment - name: backend -{% if cookiecutter.create_nextjs_frontend == "y" %} + kind: IngressRoute + name: backend-ingress - patch: |- - - op: add - path: /spec/template/spec/imagePullSecrets - value: - - name: regcred + - op: replace + path: /metadata/annotations/cert-manager.io~1cluster-issuer + value: letsencrypt-prod + - op: replace + path: /spec/routes/0/match + value: Host(`k8s.{{ cookiecutter.domain_name }}`) target: - kind: Deployment - name: frontend{% endif %} + kind: IngressRoute + name: k8s-ingress configMapGenerator: - name: app-config @@ -73,13 +50,14 @@ configMapGenerator: literals: - ENVIRONMENT="production" - DJANGO_SETTINGS_MODULE="config.settings.production" + - DJANGO_CSRF_TRUSTED_ORIGINS="https://{{ cookiecutter.domain_name }}" - AWS_S3_CUSTOM_DOMAIN="{{ cookiecutter.domain_name }}" images: - - name: backend + - name: {{ cookiecutter.aws_account_id }}.dkr.ecr.{{ cookiecutter.aws_region }}.amazonaws.com/{{ cookiecutter.project_dash }}-sandbox-backend newName: {{ cookiecutter.aws_account_id }}.dkr.ecr.{{ cookiecutter.aws_region }}.amazonaws.com/{{ cookiecutter.project_dash }}-backend newTag: latest {% if cookiecutter.create_nextjs_frontend == "y" %} - - name: frontend + - name: {{ cookiecutter.aws_account_id }}.dkr.ecr.{{ cookiecutter.aws_region }}.amazonaws.com/{{ cookiecutter.project_dash }}-sandbox-frontend newName: {{ cookiecutter.aws_account_id }}.dkr.ecr.{{ cookiecutter.aws_region }}.amazonaws.com/{{ cookiecutter.project_dash }}-frontend newTag: latest{% endif %} diff --git a/{{cookiecutter.project_slug}}/k8s/prod/patch-django.yaml b/{{cookiecutter.project_slug}}/k8s/prod/patch-django.yaml deleted file mode 100644 index eabfbc6b..00000000 --- a/{{cookiecutter.project_slug}}/k8s/prod/patch-django.yaml +++ /dev/null @@ -1,16 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: backend -spec: - selector: - matchLabels: - app: backend - template: - spec: - imagePullSecrets: - - name: regcred - containers: - - name: django - command: ["daphne"] - args: ["--bind", "0.0.0.0", "--port", "8000", "--ping-interval", "15", "--ping-timeout", "5", "config.asgi:application"] diff --git a/{{cookiecutter.project_slug}}/k8s/prod/patch-react.yaml b/{{cookiecutter.project_slug}}/k8s/prod/patch-react.yaml deleted file mode 100644 index 17678e4f..00000000 --- a/{{cookiecutter.project_slug}}/k8s/prod/patch-react.yaml +++ /dev/null @@ -1,14 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: frontend -spec: - selector: - matchLabels: - app: frontend - template: - spec: - imagePullSecrets: - - name: regcred - containers: - - name: frontend diff --git a/{{cookiecutter.project_slug}}/k8s/prod/certificate.yaml b/{{cookiecutter.project_slug}}/k8s/sandbox/certificate.yaml similarity index 56% rename from {{cookiecutter.project_slug}}/k8s/prod/certificate.yaml rename to {{cookiecutter.project_slug}}/k8s/sandbox/certificate.yaml index 4c2162e3..b639da40 100644 --- a/{{cookiecutter.project_slug}}/k8s/prod/certificate.yaml +++ b/{{cookiecutter.project_slug}}/k8s/sandbox/certificate.yaml @@ -5,8 +5,8 @@ metadata: spec: secretName: cluster-cert-tls issuerRef: - name: letsencrypt-prod + name: letsencrypt-staging kind: ClusterIssuer dnsNames: - - api.{{ cookiecutter.domain_name }} - - k8s.{{ cookiecutter.domain_name }} + - api.sandbox.{{ cookiecutter.domain_name }} + - k8s.sandbox.{{ cookiecutter.domain_name }} diff --git a/{{cookiecutter.project_slug}}/k8s/prod/ingress-route.yaml b/{{cookiecutter.project_slug}}/k8s/sandbox/ingress-route.yaml similarity index 78% rename from {{cookiecutter.project_slug}}/k8s/prod/ingress-route.yaml rename to {{cookiecutter.project_slug}}/k8s/sandbox/ingress-route.yaml index a0dec5d9..dee22479 100644 --- a/{{cookiecutter.project_slug}}/k8s/prod/ingress-route.yaml +++ b/{{cookiecutter.project_slug}}/k8s/sandbox/ingress-route.yaml @@ -1,4 +1,4 @@ -apiVersion: traefik.containo.us/v1alpha1 +apiVersion: traefik.io/v1alpha1 kind: IngressRoute metadata: name: backend-ingress @@ -9,7 +9,7 @@ spec: - websecure routes: - kind: Rule - match: Host(`api.{{ cookiecutter.domain_name }}`) + match: Host(`api.sandbox.{{ cookiecutter.domain_name }}`) priority: 10 services: - name: backend @@ -17,7 +17,7 @@ spec: tls: secretName: cluster-cert-tls --- -apiVersion: traefik.containo.us/v1alpha1 +apiVersion: traefik.io/v1alpha1 kind: IngressRoute metadata: name: k8s-ingress @@ -28,7 +28,7 @@ spec: - websecure routes: - kind: Rule - match: Host(`k8s.{{ cookiecutter.domain_name }}`) + match: Host(`k8s.sandbox.{{ cookiecutter.domain_name }}`) priority: 10 services: - name: backend @@ -36,7 +36,7 @@ spec: tls: secretName: cluster-cert-tls --- -apiVersion: traefik.containo.us/v1alpha1 +apiVersion: traefik.io/v1alpha1 kind: IngressRoute metadata: name: http-to-https-redirect @@ -53,7 +53,7 @@ spec: - kind: TraefikService name: noop@internal --- -apiVersion: traefik.containo.us/v1alpha1 +apiVersion: traefik.io/v1alpha1 kind: Middleware metadata: name: redirect-to-https diff --git a/{{cookiecutter.project_slug}}/k8s/sandbox/kustomization.yaml b/{{cookiecutter.project_slug}}/k8s/sandbox/kustomization.yaml index 0d0fd508..a8135c20 100644 --- a/{{cookiecutter.project_slug}}/k8s/sandbox/kustomization.yaml +++ b/{{cookiecutter.project_slug}}/k8s/sandbox/kustomization.yaml @@ -1,48 +1,70 @@ apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization -namespace: {{ cookiecutter.project_dash }}-sandbox +namespace: {{ cookiecutter.project_slug }}-sandbox resources: - - ../prod - - ../mailhog + - ../base + - certificate.yaml + - ingress-route.yaml + - postgres.cnpg.yaml + - secrets.yaml patches: -- target: - kind: SealedSecret - name: secrets-config - path: secrets.yaml - patch: |- - op: replace - path: /spec/issuerRef/name - value: letsencrypt-staging + path: /spec/template/spec/containers/0/command + value: ["daphne"] - op: replace - path: /spec/dnsNames + path: /spec/template/spec/containers/0/args + value: ["--bind", "0.0.0.0", "--port", "8000", "--ping-interval", "15", "--ping-timeout", "5", "config.asgi:application"] + - op: add + path: /spec/template/spec/imagePullSecrets + value: + - name: regcred + - op: add + path: /spec/template/spec/initContainers/0/env value: - - api.sandbox.{{ cookiecutter.domain_name }} - - k8s.sandbox.{{ cookiecutter.domain_name }} - target: - kind: Certificate - name: cluster-cert -- patch: |- + - name: POSTGRES_HOST + valueFrom: + secretKeyRef: + name: postgres-app + key: host - op: replace - path: /metadata/annotations/cert-manager.io~1cluster-issuer - value: letsencrypt-staging - - op: replace - path: /spec/routes/0/match - value: Host(`api.sandbox.{{ cookiecutter.domain_name }}`) + path: /spec/template/spec/initContainers/0/command + value: ["sh", "-c", "until pg_isready -h $(POSTGRES_HOST); do echo waiting for postgres; sleep 2; done;"] + - op: add + path: /spec/template/spec/initContainers/1/env + value: + - name: DATABASE_URL + valueFrom: + secretKeyRef: + name: postgres-app + key: uri + - op: add + path: /spec/template/spec/containers/0/env + value: + - name: POSTGRES_HOST + valueFrom: + secretKeyRef: + name: postgres-app + key: host + - name: DATABASE_URL + valueFrom: + secretKeyRef: + name: postgres-app + key: uri target: - kind: IngressRoute - name: backend-ingress + kind: Deployment + name: backend +{% if cookiecutter.create_nextjs_frontend == "y" %} - patch: |- - - op: replace - path: /metadata/annotations/cert-manager.io~1cluster-issuer - value: letsencrypt-staging - - op: replace - path: /spec/routes/0/match - value: Host(`k8s.sandbox.{{ cookiecutter.domain_name }}`) + - op: add + path: /spec/template/spec/imagePullSecrets + value: + - name: regcred target: - kind: IngressRoute - name: k8s-ingress + kind: Deployment + name: frontend{% endif %} configMapGenerator: - name: app-config @@ -54,8 +76,10 @@ configMapGenerator: - AWS_S3_CUSTOM_DOMAIN="sandbox.{{ cookiecutter.domain_name }}" images: - - name: {{ cookiecutter.aws_account_id }}.dkr.ecr.{{ cookiecutter.aws_region }}.amazonaws.com/{{ cookiecutter.project_dash }}-backend + - name: backend + newName: {{ cookiecutter.aws_account_id }}.dkr.ecr.{{ cookiecutter.aws_region }}.amazonaws.com/{{ cookiecutter.project_dash }}-sandbox-backend newTag: latest {% if cookiecutter.create_nextjs_frontend == "y" %} - - name: {{ cookiecutter.aws_account_id }}.dkr.ecr.{{ cookiecutter.aws_region }}.amazonaws.com/{{ cookiecutter.project_dash }}-frontend + - name: frontend + newName: {{ cookiecutter.aws_account_id }}.dkr.ecr.{{ cookiecutter.aws_region }}.amazonaws.com/{{ cookiecutter.project_dash }}-sandbox-frontend newTag: latest{% endif %} diff --git a/{{cookiecutter.project_slug}}/k8s/prod/postgres.cnpg.yaml b/{{cookiecutter.project_slug}}/k8s/sandbox/postgres.cnpg.yaml similarity index 100% rename from {{cookiecutter.project_slug}}/k8s/prod/postgres.cnpg.yaml rename to {{cookiecutter.project_slug}}/k8s/sandbox/postgres.cnpg.yaml diff --git a/{{cookiecutter.project_slug}}/k8s/templates/argocd.application.yaml.template b/{{cookiecutter.project_slug}}/k8s/templates/argocd.application.yaml.template deleted file mode 100644 index ed3b6c86..00000000 --- a/{{cookiecutter.project_slug}}/k8s/templates/argocd.application.yaml.template +++ /dev/null @@ -1,38 +0,0 @@ -apiVersion: argoproj.io/v1alpha1 -kind: Application -metadata: - name: {{ cookiecutter.project_dash }}-sandbox - namespace: argocd -spec: - project: default - source: - repoURL: ${REPO_URL} - targetRevision: HEAD - path: k8s/sandbox - destination: - server: https://${CLUSTER_IP}:6443 - namespace: {{ cookiecutter.project_dash }}-sandbox - syncPolicy: - automated: - prune: true - syncOptions: - - CreateNamespace=true ---- -apiVersion: argoproj.io/v1alpha1 -kind: Application -metadata: - name: {{ cookiecutter.project_dash }}-prod - namespace: argocd -spec: - project: default - source: - repoURL: ${REPO_URL} - targetRevision: HEAD - path: k8s/prod - destination: - server: https://${CLUSTER_IP}:6443 - namespace: {{ cookiecutter.project_dash }} - syncPolicy: - automated: {} - syncOptions: - - CreateNamespace=true diff --git a/{{cookiecutter.project_slug}}/k8s/templates/repocreds.yaml.template b/{{cookiecutter.project_slug}}/k8s/templates/repocreds.yaml.template deleted file mode 100644 index 1f161b90..00000000 --- a/{{cookiecutter.project_slug}}/k8s/templates/repocreds.yaml.template +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: v1 -kind: Secret -metadata: - name: {{ cookiecutter.project_dash }}-key - namespace: argocd - labels: - argocd.argoproj.io/secret-type: repo-creds -stringData: - url: ${REPO_URL} - type: helm - sshPrivateKey: ${SSH_PRIVATE_KEY} diff --git a/{{cookiecutter.project_slug}}/k8s/templates/secrets.yaml.template b/{{cookiecutter.project_slug}}/k8s/templates/secrets.yaml.template index e6bf337a..b0bf90d3 100644 --- a/{{cookiecutter.project_slug}}/k8s/templates/secrets.yaml.template +++ b/{{cookiecutter.project_slug}}/k8s/templates/secrets.yaml.template @@ -1,11 +1,11 @@ apiVersion: v1 stringData: - AWS_S3_ACCESS_KEY_ID: op://{{ cookiecutter.project_name }}/$ENVIRONMENT secrets/AWS_S3_ACCESS_KEY_ID - AWS_S3_SECRET_ACCESS_KEY: op://{{ cookiecutter.project_name }}/$ENVIRONMENT secrets/AWS_S3_SECRET_ACCESS_KEY + AWS_S3_ACCESS_KEY_ID: $AWS_S3_ACCESS_KEY_ID + AWS_S3_SECRET_ACCESS_KEY: $AWS_S3_SECRET_ACCESS_KEY {%- if cookiecutter.mail_service == 'Amazon SES' %} - AWS_SES_ACCESS_KEY_ID: op://{{ cookiecutter.project_name }}/$ENVIRONMENT secrets/AWS_SES_ACCESS_KEY_ID - AWS_SES_SECRET_ACCESS_KEY_ID: op://{{ cookiecutter.project_name }}/$ENVIRONMENT secrets/AWS_SES_SECRET_ACCESS_KEY_ID{% endif %} - DJANGO_SECRET_KEY: op://{{ cookiecutter.project_name }}/$ENVIRONMENT secrets/DJANGO_SECRET_KEY + AWS_SES_ACCESS_KEY_ID: $AWS_SES_ACCESS_KEY_ID + AWS_SES_SECRET_ACCESS_KEY: $AWS_SES_SECRET_ACCESS_KEY{%- endif %} + DJANGO_SECRET_KEY: $DJANGO_SECRET_KEY {%- if cookiecutter.mail_service == 'Mailgun' %} MAILGUN_API_KEY: op://{{ cookiecutter.project_name }}/$ENVIRONMENT secrets/MAILGUN_API_KEY"{%- endif %} diff --git a/{{cookiecutter.project_slug}}/terraform/.gitignore b/{{cookiecutter.project_slug}}/terraform/.gitignore index 1d6a5946..6e840fec 100644 --- a/{{cookiecutter.project_slug}}/terraform/.gitignore +++ b/{{cookiecutter.project_slug}}/terraform/.gitignore @@ -1,3 +1,4 @@ talosconfig kubeconfig repocreds.yaml +tfplan.out diff --git a/{{cookiecutter.project_slug}}/terraform/README.md b/{{cookiecutter.project_slug}}/terraform/README.md index 40688637..04f3253a 100644 --- a/{{cookiecutter.project_slug}}/terraform/README.md +++ b/{{cookiecutter.project_slug}}/terraform/README.md @@ -24,7 +24,37 @@ run the Terraform configurations. ## Setup Instructions -### Step 1: Bootstrap +### Step 1: AWS Authentication + +Ensure that you have installed AWS CLI version 2, as AWS SSO support is only +available in version 2 and above. Create a new AWS profile in `~/.aws/config`. +Here's an example of the `~/.aws/config` profile: +``` +[profile scaf] +sso_start_url = https://sixfeetup.awsapps.com/start +sso_region = us-east-1 +sso_account_id = +sso_role_name = admin +region = us-east-1 +output = json +``` + +Note the `sso_role_name` setting above. Make sure to use a role that provides +you with the necessary permissions to deploy infrastructure on your AWS account. + +Export the `AWS_PROFILE` environment variable and continue logging in: +``` +$ export AWS_PROFILE=scaf +$ aws sso login +``` + +This should open your browser, allowing you to sign in to your AWS account. Upon +successful login, you will see a message to confirm it: +``` +Successfully logged into Start URL: https://sixfeetup.awsapps.com/start +``` + +### Step 2: Bootstrap The first step is to bootstrap the Terraform state. This involves creating an S3 bucket and a DynamoDB table to manage the state and locking. @@ -49,7 +79,7 @@ bucket and a DynamoDB table to manage the state and locking. terraform apply tfplan.out ``` -### Step 2: GitHub OIDC Provider +### Step 3: GitHub OIDC Provider After bootstrapping the state, the next step is to set up the GitHub OIDC provider. @@ -74,7 +104,7 @@ provider. terraform apply tfplan.out ``` -### Step 3: Environment Configurations +### Step 4: Environment Configurations The final step is to set up the respective environment configurations (prod, sandbox, staging). @@ -91,12 +121,19 @@ sandbox, staging). terraform init ``` -3. Plan the Terraform configuration: +3. Restrict the IPs allowed to manage the cluster. Edit + `/cluster.tf` and set the following variables: + ``` + kubectl_allowed_ips = "10.0.0.1/32,10.0.0.2/32" + talos_allowed_ips = "10.0.0.1/32,10.0.0.2/32" + ``` + +4. Plan the Terraform configuration: ```bash terraform plan -out="tfplan.out" ``` -4. Apply the Terraform configuration: +5. Apply the Terraform configuration: ```bash terraform apply tfplan.out ``` diff --git a/{{cookiecutter.project_slug}}/terraform/github/oidc.tf b/{{cookiecutter.project_slug}}/terraform/github/oidc.tf index 22b8cb6f..f67d7276 100644 --- a/{{cookiecutter.project_slug}}/terraform/github/oidc.tf +++ b/{{cookiecutter.project_slug}}/terraform/github/oidc.tf @@ -35,7 +35,7 @@ resource "aws_iam_openid_connect_provider" "github" { # Define the IAM role resource "aws_iam_role" "github_oidc_role" { - name = "github-oidc-role" + name = "{{ cookiecutter.project_slug }}-github-oidc-role" assume_role_policy = < Date: Sat, 5 Oct 2024 04:44:59 +0000 Subject: [PATCH 21/21] chore(release): 1.17.0 [skip ci] ## [1.17.0](https://github.com/sixfeetup/scaf/compare/v1.16.1...v1.17.0) (2024-10-05) ### Features * deploy apps with ArgoCD ([6938661](https://github.com/sixfeetup/scaf/commit/69386611ee96ec2e0278fbf57717db10bc484c7e)) --- CHANGELOG.md | 6 ++++++ package.json | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6a79fe76..c53cd3cc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## [1.17.0](https://github.com/sixfeetup/scaf/compare/v1.16.1...v1.17.0) (2024-10-05) + +### Features + +* deploy apps with ArgoCD ([6938661](https://github.com/sixfeetup/scaf/commit/69386611ee96ec2e0278fbf57717db10bc484c7e)) + ## [1.16.1](https://github.com/sixfeetup/scaf/compare/v1.16.0...v1.16.1) (2024-09-25) ### Bug Fixes diff --git a/package.json b/package.json index 6c188689..56b65dc5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "scaf", - "version": "1.16.1", + "version": "1.17.0", "devDependencies": { "@semantic-release/changelog": "^6.0.3", "@semantic-release/git": "^10.0.1",