{"_id":"@antoinedao/backstage-provider-kubernetes","_rev":"1-e5a5f4c514fb27b0a5b90e738418499f","name":"@antoinedao/backstage-provider-kubernetes","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.1":{"name":"@antoinedao/backstage-provider-kubernetes","description":"A Backstage catalog provider and processor for Kubernetes","version":"0.1.1","main":"src/index.ts","types":"src/index.ts","license":"Apache-2.0","private":false,"publishConfig":{"access":"public","main":"dist/index.cjs.js","types":"dist/index.d.ts"},"backstage":{"role":"backend-plugin-module"},"repository":{"type":"git","url":"git+https://github.com/antoinedao/backstage-provider-kubernetes.git"},"keywords":["backstage"],"scripts":{"build":"backstage-cli package build","lint":"backstage-cli package lint","test":"backstage-cli package test","prepack":"backstage-cli package prepack","postpack":"backstage-cli package postpack","clean":"backstage-cli package clean","start":"backstage-cli package start","release":"semantic-release","tsc":"tsc"},"dependencies":{"@backstage/backend-common":"^0.17.0","@backstage/backend-tasks":"^0.5.0","@backstage/catalog-client":"^1.2.0","@backstage/catalog-model":"^1.1.4","@backstage/config":"^1.0.5","@backstage/errors":"^1.1.4","@backstage/plugin-catalog-backend":"^1.6.0","@backstage/plugin-kubernetes-backend":"^0.9.2","@backstage/types":"^1.0.2","@kubernetes/client-node":"^0.18.1","crypto-js":"^4.1.1","link2aws":"^1.0.8","lodash":"^4.17.21","p-limit":"^3.0.2","uuid":"^9.0.0","winston":"^3.2.1"},"devDependencies":{"@backstage/cli":"^0.22.0","@semantic-release/exec":"^6.0.3","@semantic-release/github":"^8.0.7","@types/crypto-js":"^4.1.1","@types/fs-extra":"^11.0.1","@types/link2aws":"^1.0.0","@types/lodash":"^4.14.151","@types/node-fetch":"^2.6.3","@types/uuid":"^9.0.1","aws-sdk-client-mock":"^0.6.2","commitizen":"^4.3.0","eslint":"^8.38.0","eslint-plugin-typescript":"^0.14.0","semantic-release":"^21.0.1","yaml":"^1.9.2"},"configSchema":"config.d.ts","gitHead":"c55ab74656045f2c52d0109d2d25d37d894bdaab","bugs":{"url":"https://github.com/antoinedao/backstage-provider-kubernetes/issues"},"homepage":"https://github.com/antoinedao/backstage-provider-kubernetes#readme","_id":"@antoinedao/backstage-provider-kubernetes@0.1.1","_nodeVersion":"18.15.0","_npmVersion":"9.6.4","dist":{"integrity":"sha512-OBFfvdDzyRLG7ze2HcyoZ1jqlvpJ0K590CyafU4A9SOyZ6rid0E8WCYZFFeyR+PgtQaftyK2n7LfGgmKB7trvQ==","shasum":"ef6a1a43781296ccef044f61a36f7802f45aae5c","tarball":"https://registry.npmjs.org/@antoinedao/backstage-provider-kubernetes/-/backstage-provider-kubernetes-0.1.1.tgz","fileCount":6,"unpackedSize":29212,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDXXqITRnNBxLxwWIY7VRuevsda19YfHl1zcvSuWnJOsQIhAIb1l+DWhJszdIEKAs1HFepEAxuy1F/S4AONyFW0sA5O"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkM9Q3ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrcmxAAm91lX1PmGJLqrO/S55Sr2IvpSJ3QUvqf1dQgW07yTvWmDxin\r\n9eR6j/5xKVMWA5JaOOqAkg225djW7G1weJpqQ+ABcJpTqt4YD9lO7gVyKDry\r\nCDdaZMO0puVjxI7iVRH+gsVwhZ3oXCaJaUk4HJXnS/9YpeE10q6s5onVJw/W\r\nIm+D4wWODr75qbnViCFMHQpuKDxq5l6t1+/tjRUdMT5DG6WFMluHg1jZX7QA\r\nJ6zqu9GxxDRhV1mxfeb4KXenXGoO7KvYWKk5S/Di3tWZD2EYa0lb4pxvljtH\r\nQQNqOQBdbf88G+Rv71e1GIpCKHrYch8Zj6V4M+4tXURuLp7GBtjxZU2fMmZw\r\nTK8umhdsgo0A+AvXrfDh9OirPGJUYkcWOVeMN7IYq0FZaTm4NgjKGrcUNdeH\r\nh8dFpAgg3hGq2d7Zxp3MgmaAhXwd1Liov66VfLp/gV/ZASyqSjEtcTIdJ9UF\r\nwe33b+O6OxU+eeTd4vGa5qGKH84vLuY8/UJF94COpcUw8yHCOVqELt3Qy01B\r\nIoXEsYz8h8EIE5r7mulKL8CxE9Gae9qa4wrRuLbPi+lQ96PBW8Vw8wNBDUjg\r\nJpOWGQG3O4L0WZqa8c+rRQSunHagIJNRF3aHk8aIYkG/tFeVR+OzoC25wjEW\r\n9CX8CLDMD4Dk8MU/oDbbqQrakok/iRfbwSY=\r\n=YCj9\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"antoinedao","email":"antoinedao1@gmail.com"},"directories":{},"maintainers":[{"name":"antoinedao","email":"antoinedao1@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/backstage-provider-kubernetes_0.1.1_1681118263663_0.4728887729268372"},"_hasShrinkwrap":false},"0.1.2":{"name":"@antoinedao/backstage-provider-kubernetes","description":"A Backstage catalog provider and processor for Kubernetes","version":"0.1.2","main":"src/index.ts","types":"src/index.ts","license":"Apache-2.0","private":false,"publishConfig":{"access":"public","main":"dist/index.cjs.js","types":"dist/index.d.ts"},"backstage":{"role":"backend-plugin-module"},"repository":{"type":"git","url":"git+https://github.com/antoinedao/backstage-provider-kubernetes.git"},"keywords":["backstage"],"scripts":{"build":"backstage-cli package build","lint":"backstage-cli package lint","test":"backstage-cli package test","prepack":"backstage-cli package prepack","postpack":"backstage-cli package postpack","clean":"backstage-cli package clean","start":"backstage-cli package start","release":"semantic-release","tsc":"tsc"},"dependencies":{"@backstage/backend-common":"^0.17.0","@backstage/backend-tasks":"^0.5.0","@backstage/catalog-client":"^1.2.0","@backstage/catalog-model":"^1.1.4","@backstage/config":"^1.0.5","@backstage/errors":"^1.1.4","@backstage/plugin-catalog-backend":"^1.6.0","@backstage/plugin-kubernetes-backend":"^0.9.2","@backstage/types":"^1.0.2","@kubernetes/client-node":"^0.18.1","crypto-js":"^4.1.1","link2aws":"^1.0.8","lodash":"^4.17.21","p-limit":"^3.0.2","uuid":"^9.0.0","winston":"^3.2.1"},"devDependencies":{"@backstage/cli":"^0.22.0","@semantic-release/exec":"^6.0.3","@semantic-release/github":"^8.0.7","@types/crypto-js":"^4.1.1","@types/fs-extra":"^11.0.1","@types/link2aws":"^1.0.0","@types/lodash":"^4.14.151","@types/node-fetch":"^2.6.3","@types/uuid":"^9.0.1","aws-sdk-client-mock":"^0.6.2","commitizen":"^4.3.0","eslint":"^8.38.0","eslint-plugin-typescript":"^0.14.0","semantic-release":"^21.0.1","yaml":"^1.9.2"},"configSchema":"config.d.ts","gitHead":"3a528f277a79562b3283bc09092304cc92634b4d","bugs":{"url":"https://github.com/antoinedao/backstage-provider-kubernetes/issues"},"homepage":"https://github.com/antoinedao/backstage-provider-kubernetes#readme","_id":"@antoinedao/backstage-provider-kubernetes@0.1.2","_nodeVersion":"18.15.0","_npmVersion":"9.6.4","dist":{"integrity":"sha512-dNpL0mIo0Nomo+PBPX5yvN89hoA8kjDiLyVoBHek7Y7bwyIQqaQdR+PDLQj2RIpk87AjoU98PwwQQXj+LNYs8Q==","shasum":"6a7575189633ed8ddd625dfb9a170d1b922a345f","tarball":"https://registry.npmjs.org/@antoinedao/backstage-provider-kubernetes/-/backstage-provider-kubernetes-0.1.2.tgz","fileCount":6,"unpackedSize":38604,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIC17fiM5MAk7rBGnQ89LXlB2iJUUXs683zUd0AKHk90UAiAgm0w3NtQZN/TOOYE0hzUmannEx+3H+ILm5fVeNvrGqg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkM/a3ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqUFA//Sxy/jc1mnjeDWm6FfS5JjIX+hO3j2biBWbmJDWJLrmshWfKU\r\nYTVCeROBBUPswpKgcV+pRmGl2Tb/q5B4t7QHxVHfIm3kK3xLOCo3gaqWPBpy\r\nUtp48LIswAjgt904qp7wUF2NH7d1K0Ih0cD0kn8ATJeqy6NSWUDckrlP6TLH\r\n5rACw7ikHLwxRwB8TX/dIBQq5tt2Iq2Wjjm2oRTPI8GXbEpLRGVpP71E1+JC\r\n3OipY1PAeeinFgRXLTVlQkqVXwqy5nar0useTz1pa9YiaWaNGt6EQG1tjYbC\r\nR23NJS4Um2QIxMJuU6QL0JzP0v/FUtwqL/so0q248xNugmHyBHJuEM0IYkLz\r\ngcFhtRptz5JUFmJ4kN13mY+9qs6mwTZW+vC/vDilIlYGMMMKd7S04VfSdPKc\r\nD799mNjJtGN+6gKIxNJngfCwUYEVCprg62rK+HiCq1dX6BEcuI8mZqOCA+Ao\r\nwAiv56ZRihlmpjiQa0agej5iKsrnkz5fcf/rdDT5GvDcKaIaPeAN9gUyO8hm\r\neAQ0hcZxlQLqF87YpfPovSlUMkghvGPXiVYLF+Dclh69bRAQKe3pYt7LAZmi\r\nVOU5cR8B1jhZ0Hq16XjsV9IMZoMbw/1gJepeXfBviHRCRNfV3OwX2r4jhUrI\r\nrZrfuBlO8sbhuhoJt2ThMIV7Lcz8W5gzJWA=\r\n=5BxC\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"antoinedao","email":"antoinedao1@gmail.com"},"directories":{},"maintainers":[{"name":"antoinedao","email":"antoinedao1@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/backstage-provider-kubernetes_0.1.2_1681127094914_0.28434524395785066"},"_hasShrinkwrap":false}},"time":{"created":"2023-04-10T09:17:43.610Z","0.1.1":"2023-04-10T09:17:43.816Z","modified":"2023-04-10T11:44:55.198Z","0.1.2":"2023-04-10T11:44:55.056Z"},"maintainers":[{"name":"antoinedao","email":"antoinedao1@gmail.com"}],"description":"A Backstage catalog provider and processor for Kubernetes","homepage":"https://github.com/antoinedao/backstage-provider-kubernetes#readme","keywords":["backstage"],"repository":{"type":"git","url":"git+https://github.com/antoinedao/backstage-provider-kubernetes.git"},"bugs":{"url":"https://github.com/antoinedao/backstage-provider-kubernetes/issues"},"license":"Apache-2.0","readme":"# Backstage Provider Kubernetes\nA Backstage plugin with entity providers to read Kubernetes objects as Backstage Entities.\n\n## Getting started\n### Installing The Plugin\nYou will have to add the provider in the catalog initialization code of your backend. They are not installed by default, therefore you have to add a dependency on @antoinedao/backstage-provider-kubernetes to your backend package.\n\n```console\nyarn add --cwd packages/backend @antoinedao/backstage-provider-kubernetes\n```\n\nAnd then add the entity provider to your catalog builder:\n\n\n```ts title=\"packages/backend/src/plugins/catalog.ts\"\n/* highlight-add-next-line */\nimport { KubernetesEntityProvider } from '@antoinedao/backstage-provider-kubernetes';\n\nexport default async function createPlugin(\n  env: PluginEnvironment,\n): Promise<Router> {\n  const builder = await CatalogBuilder.create(env);\n\n  builder.addEntityProvider([\n    ... await KubernetesEntityProvider.fromConfig(env, {\n      logger: env.logger,\n      scheduler: env.scheduler,\n    })\n  ])\n\n  // ..\n}\n```\n\n### Configuration\nConfiguring the Backstage Kubernetes provider is managed in Backstage's `app-config.yaml` file and involves two steps:\n\n1. Defining remote Kubernetes cluster configuration and authentication methods. This re-uses the config definition for the [Backstage Kubernetes Plugin](https://backstage.io/docs/features/kubernetes/) which is documented [here](https://backstage.io/docs/features/kubernetes/configuration).\n   > ⚠️ [`clusterLocatorMethod`](https://backstage.io/docs/features/kubernetes/configuration#clusterlocatormethods) of type `config` is the only tests method for no, other methods might not work or produce unexpected results \n   ```yaml\n   kubernetes:\n    serviceLocatorMethod:\n      type: 'multiTenant'\n    clusterLocatorMethods:\n      - type: 'config'\n        clusters:\n          - url: https://127.0.0.1:6443\n            name: docker-desktop\n            authProvider: 'serviceAccount'\n            skipTLSVerify: false\n            skipMetricsLookup: true\n            serviceAccountToken: ${K8S_DOCKER_DESKTOP_SA_TOKEN}\n            caData: ${K8S_DOCKER_DESKTOP_CONFIG_CA_DATA}\n\n          - url: https://33.33.33.33\n            name: k8s-staging\n            authProvider: googleServiceAccount\n            skipTLSVerify: false\n            skipMetricsLookup: true    \n            caData: ${K8S_STAGING_CONFIG_CA_DATA}\n   ```\n2. Adding `kubernetes` configurations to the catalog providers configuration\n    ```yaml\n    catalog:\n      rules:\n        - allow: [Component, System, API, Resource, Location]\n      providers:\n        kubernetes:\n          local-cluster:\n            cluster: docker-desktop\n            processor:\n              namespaceOverride: default\n              defaultOwner: guests\n            schedule:\n              frequency:\n                seconds: 30\n              timeout:\n                seconds: 5\n\n          staging:\n            cluster: k8s-staging\n            processor:\n              namespaceOverride: default\n              defaultOwner: guests\n            filters:\n              resources:\n              - group: serving.knative.dev\n                apiVersion: v1\n                plural: services\n                objectType: Service \n            schedule:\n              frequency:\n                minutes: 30\n              timeout:\n                minutes: 1\n    ```\n\n### Catalog Provider Configuration\nThis section covers in detail the configuration options for the catalog provider section. \n\nThe Catalog Providers are defined in configuration file at the following path: `catalog.providers.kubernetes.<name-of-provider-config>`. Multiple concurrent providers are supported so you can import data from multiple clusters or within the same cluster with different processor overrides. \n\nThe values for each key are objects with the following properties:\n\n* `cluster` (required): a string that specifies the name of the Kubernetes cluster. It should match the name of the cluster inside the cluster locator methods defined in the global config at `kubernetes.clusterLocatorMethods.clusters.name`\n\n* `filters` (optional): an optional object that contains properties for filtering resources.\n  * `resources` (optional): property is an optional array of any type of data. The default configuration fetches `[deployments, jobs, cronjobs, statefulsets, daemonsets]`\n  * `namespace` (optional): property is an optional string that specifies a namespace to filter for\n  * `labelSelector` (optional): property is an optional string that specifies a label selector.\n\n* `processor` (optional): an optional object that contains properties to populate required fields in the provided [Backtstage Components](https://backstage.io/docs/features/software-catalog/descriptor-format#kind-component)\n  * `namespaceOverride`  (optional): set this to the [Backstage Namespace](https://backstage.io/docs/features/software-catalog/descriptor-format#namespace-optional) the Component should be assigned to. This will default to the Kubernetes object's `namespace` if left blank\n  * `lifecyle` (optional): set this to specify the [Backstage Component Lifecycle](https://backstage.io/docs/features/software-catalog/descriptor-format#speclifecycle-required) property (defaults to `production`)\n  * `defaultOwner` (optional): set this to specify the [Backstage Component Owner](https://backstage.io/docs/features/software-catalog/descriptor-format#specowner-required) property (defaults to `unknown`)\n  \n* `schedule` (optional): an optional object that contains properties for the schedule. The `TaskScheduleDefinitionConfig` interface is used to define the properties.\n  * `frequency`: How often you want the task to run. The system does its best to avoid overlapping invocations.\n  * `timeout`: The maximum amount of time that a single task invocation can take.\n  * `initialDelay` (optional): The amount of time that should pass before the first invocation happens.\n  * `scope` (optional): 'global' or 'local'. Sets the scope of concurrency control.\n\n### Example\n\nHere is a full example config for local development with Docker Desktop as a source:\n\n```yaml\napp:\n  title: Scaffolded Backstage App\n  baseUrl: http://localhost:3000\n\norganization:\n  name: My Company\n\nbackend:\n  baseUrl: http://localhost:7007\n  listen:\n    port: 7007\n  csp:\n    connect-src: [\"'self'\", 'http:', 'https:']\n  cors:\n    origin: http://localhost:3000\n    methods: [GET, HEAD, PATCH, POST, PUT, DELETE]\n    credentials: true\n  database:\n    client: better-sqlite3\n    connection: ':memory:'\n  cache:\n    store: memory\n\nintegrations:\n  github:\n    - host: github.com\n      token: ${GITHUB_TOKEN}\n\ntechdocs:\n  builder: 'local' # Alternatives - 'external'\n  generator:\n    runIn: 'docker' # Alternatives - 'local'\n  publisher:\n    type: 'local' # Alternatives - 'googleGcs' or 'awsS3'. Read documentation for using alternatives.\n\nauth:\n  providers: {}\n\nscaffolder: {}\n\ncatalog:\n  import:\n    entityFilename: catalog-info.yaml\n    pullRequestBranchName: backstage-integration\n  rules:\n    - allow: [Component, System, API, Resource, Location]\n  providers:\n    kubernetes:\n      local-cluster:\n        cluster: docker-desktop\n        processor:\n          namespaceOverride: default\n          defaultOwner: guests\n        schedule:\n          frequency:\n            seconds: 30\n          timeout:\n            seconds: 5\n          \n  locations: []\n\nkubernetes:\n  serviceLocatorMethod:\n    type: 'multiTenant'\n  clusterLocatorMethods:\n    - type: 'config'\n      clusters:\n        - url: https://127.0.0.1:6443\n          name: docker-desktop\n          authProvider: 'serviceAccount'\n          skipTLSVerify: false\n          skipMetricsLookup: true\n          serviceAccountToken: eyJhbGciOiJSUzI1NiIsImtpZCI6Ik1QbVNBSWZic3VCaDRCcWNpZzg0X0FNT0dlZDhNNnpGQjZuR1FfTVRTbG8ifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImRlZmF1bHQtc2VjcmV0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImRlZmF1bHQiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiIzNWVjNTA4Mi01MzlkLTQ1MDYtYTExYi01MmIxYTI5ZDI4ZmEiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6ZGVmYXVsdDpkZWZhdWx0In0.ovf5WTpl-_xxOQxbvKFnNlBITFDMKBVvrP6e0ig9gCmWvj0ck_euEYdtBcddPCXeHWHqaW-OH6RtWiqlFStvND11uyK3tyLVUMZKyay2oERg0VHxxjnaGwwHVbMnUr_1D6aZXhj7BZ5zyibbxlhgq4l2uWHQKzYIBU5tprtnIRJsVj3fLApsMMX81zRfI7AaNhxkdaNQeIeEYbFhDdWtnkc2hN-_ZpkmoXrjRt_Ri7iepg6x01pqC4R9w-jZ3tr9Rj-jt3Lv59Mtwxli4OQWEekuWNYsUdP4sefzD7FrjnLD3sSwyzrMD9-fzwMaxfonaA3p1S8cBNxbDeJ3PgjVtw\n          caData: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMvakNDQWVhZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJek1EUXdOVEl4TVRrMU9Wb1hEVE16TURRd01qSXhNVGsxT1Zvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTWZnCmVnZDQ5Z2w4UlRPOGhleFFwSlMwU1BKbVZLQ2lNZ1hSSzUvVWhLVXlTQWxDa3dDWlhnSG1HUUpTcklxR0VENmcKbHErREUveHJDSDZrcVYvWXFhVUZFMFB1cUhTdStMTjRqQiswbFNldVZYYWR5NWtvc1BUenpwQ1NKSnVrSGc2VwpBU21EV0t5OGpEZ3EyTW93RDhUTy84K1FvL05oSWg3eGlmUVN2VTFLdzVDbEtlUU13ZmZ6SHRzSUIwS2NiQ05kCnBEekF3dUlLMTVuaElZYy9jNmJmeDFQTVBldkxvM0d1Z25WZTJZR3cvTUJpY1A2NFFlVTBzTzBaVjRmVUR1d2QKV1pYTlBWdDlINkdXaFpjTFQxOU5JVzBRb1NMNk1jcERRUk1VNG1MMXR6Ris0WW5EOE50d3J5d2lHUE0zcExSeApmNE56emlxNTAzOThLNFdrcU5rQ0F3RUFBYU5aTUZjd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZHUXNqcUp0OWhyY0dUYmVqV0RmTFp0bU82ZUlNQlVHQTFVZEVRUU8KTUF5Q0NtdDFZbVZ5Ym1WMFpYTXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBSVNESHphbjZ0SUFOQWZDRVBhegowVEJjRUsxeXV2cnpvNEdXYVlWaWpxSWhPMzNEZzVJUDhzT2t5cXRSZVJSZE9HQ0tMZmlRNlRrWXB5YmEwa2ZhClBWaVR1WHdaNk9qVG56RTB4czR6UWdQY1hIVzdEQW9aTlN5ZzZYR2ZreDhaVDRZNUVYd09MaWZsN0Y1MzRPc3EKQ2g0RmVDWDRDTEVFQndybEpINkJsTTVFdzZ1M1VmR2RrRWhKU3BNdk9QRWFjT0JocEpCem9jazVTM1U2NWlXcQpKU1d4UDNWdUxlU28xcTNGWWpxQmM5UzFmeko0WWpFRG1NMmZFU2pWdnZYYkFLQzUrbCtiVjFLMWE4ZDlXcnRCCms1czZKZndFaWpYZGxGbldoelJ6QVVVZVN3K2wxRUdMQnpMbENUN0dLUGlXWTdhc1pZckZmQzJua1dXNDFPVGsKbDZvPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==\n```\n","readmeFilename":"README.md"}