diff --git a/.github/workflows/backend.yml b/.github/workflows/backend.yml index 5bd2295f..5639c2e8 100644 --- a/.github/workflows/backend.yml +++ b/.github/workflows/backend.yml @@ -78,22 +78,20 @@ jobs: echo "${FLORA_DB_HOST}:${FLORA_DB_PORT}:${FLORA_DB_DATABASE}:${FLORA_DB_USER}:${FLORA_DB_PASSWORD}" > .pgpass cat ~/.pgpass cabal update - cabal freeze - - name: Cache uses: actions/cache@v4.0.0 with: path: ${{ steps.setup-haskell.outputs.cabal-store }} - key: ${{ runner.os }}-ghc-${{ matrix.ghc }}-cabal-${{ hashFiles('**/plan.json') }} + key: ${{ runner.os }}-ghc-${{ matrix.ghc }}-cabal-${{ hashFiles('./.plan.json') }} restore-keys: ${{ runner.os }}-ghc-${{ matrix.ghc }}- - name: Build run: | + cabal install postgresql-migration make soufflé make assets-deps make build-assets make build - cabal install postgresql-migration - name: Test run: | set -x diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 28aa6657..db78546b 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -25,12 +25,12 @@ jobs: - uses: actions/checkout@v4 - name: 'Set up HLint' - uses: rwe/actions-hlint-setup@v1 + uses: haskell-actions/hlint-setup@v2 with: version: '3.8' - name: 'Run HLint' - uses: rwe/actions-hlint-run@v2 + uses: haskell-actions/hlint-run@v2 with: - path: '["src/", "app/", "test/"]' + path: '["src/", "test/", "app/"]' fail-on: warning diff --git a/.github/workflows/nix-check.yml b/.github/workflows/nix-check.yml index 9eb169ac..3d95664f 100644 --- a/.github/workflows/nix-check.yml +++ b/.github/workflows/nix-check.yml @@ -1,8 +1,4 @@ name: "Flora nix check" -on: - pull_request: - push: - branches: ["main", "development"] jobs: tests: runs-on: ubuntu-latest diff --git a/.gitignore b/.gitignore index e628620e..2e2d0d86 100644 --- a/.gitignore +++ b/.gitignore @@ -36,3 +36,4 @@ design/node_modules *.dump-timings _build/cabal-store +storage/ diff --git a/.plan.json b/.plan.json new file mode 100644 index 00000000..2b7d2171 --- /dev/null +++ b/.plan.json @@ -0,0 +1 @@ +{"cabal-version":"3.11.0.0","cabal-lib-version":"3.11.0.0","compiler-id":"ghc-9.6.4","os":"linux","arch":"x86_64","install-plan":[{"type":"pre-existing","id":"Cabal-3.10.1.0","pkg-name":"Cabal","pkg-version":"3.10.1.0","depends":["Cabal-syntax-3.10.1.0","array-0.5.6.0","base-4.18.2.0","bytestring-0.11.5.3","containers-0.6.7","deepseq-1.4.8.1","directory-1.3.8.1","filepath-1.4.200.1","mtl-2.3.1","parsec-3.1.16.1","pretty-1.1.3.6","process-1.6.17.0","text-2.0.2","time-1.12.2","transformers-0.6.1.0","unix-2.8.4.0"]},{"type":"pre-existing","id":"Cabal-syntax-3.10.1.0","pkg-name":"Cabal-syntax","pkg-version":"3.10.1.0","depends":["array-0.5.6.0","base-4.18.2.0","binary-0.8.9.1","bytestring-0.11.5.3","containers-0.6.7","deepseq-1.4.8.1","directory-1.3.8.1","filepath-1.4.200.1","mtl-2.3.1","parsec-3.1.16.1","pretty-1.1.3.6","text-2.0.2","time-1.12.2","transformers-0.6.1.0","unix-2.8.4.0"]},{"type":"configured","id":"HUnit-1.6.2.0-d1570da0a2808fb4ce9b1c3f1e99a0cf4a27d7c4071d9714ae835af7748ace92","pkg-name":"HUnit","pkg-version":"1.6.2.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"1a79174e8af616117ad39464cac9de205ca923da6582825e97c10786fda933a4","pkg-src-sha256":"b0b7538871ffc058486fc00740886d2f3172f8fa6869936bfe83a5e10bd744ab","depends":["base-4.18.2.0","call-stack-0.4.0-a0fd887e5d06d11a75269d5dfed7da6fe2656edbbd7cc1697fb2a2b8ad4fe392","deepseq-1.4.8.1"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"JuicyPixels-3.3.8-295ba873739530be2ad2e0f5ef3880f23fb240b49297676915db7967d6106794","pkg-name":"JuicyPixels","pkg-version":"3.3.8","flags":{"mmap":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"c9721541b4c9d9de57dd271ead1f433cf3e3acc6c16baf2dba91368c8aa675bd","pkg-src-sha256":"d3a0f6ca3515a1b3d526cbf79f2e0b0aab57f208ab216f9c26437bbcd86fb63e","depends":["base-4.18.2.0","binary-0.8.9.1","bytestring-0.11.5.3","containers-0.6.7","deepseq-1.4.8.1","mtl-2.3.1","primitive-0.9.0.0-a6aa61bd9fff8d6cfd4880894dd85d8e644fbcf178b2bff38f87569871ea4a0d","transformers-0.6.1.0","vector-0.13.1.0-eb53bdac16f057ad838f4e8cb865b51b400abac71a36dc5bfde93ea1d0859eae","zlib-0.6.3.0-61cb40f46d103a622525dc3a70a9004984ec56d61deea65d2dc01c964606b7e9"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"OneTuple-0.4.1.1-8e8d21c288285c8a6e306ca430dcdc949a96b5c76772aaa2b31f79c6abb3541e","pkg-name":"OneTuple","pkg-version":"0.4.1.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"632dfded172086fb9f0e26d3578bcfffa3fb6d135ea5a8de17b7a33ff6e6e682","pkg-src-sha256":"c9e764d4ee1e57cad8341bd5d0de33ba3a52b6793fc1309679f2bf60c030bb2b","depends":["base-4.18.2.0","ghc-prim-0.10.0","template-haskell-2.20.0.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"Only-0.1-914e2ddfdd5fc0b9704050502cc99fcb5926b3ef60f86855ee94bd6fc8c46a18","pkg-name":"Only","pkg-version":"0.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"c6033d181e0f802e9e8543f683fa9c50aeb01cfdf6c83cd5bb72fb47aa863b07","pkg-src-sha256":"ab7aa193e8c257d3bda6b0b3c1cbcf74cdaa85ab08cb20c2dd62ba248c1ab265","depends":["base-4.18.2.0","deepseq-1.4.8.1"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"PyF-0.11.2.1-136109de9a2dff073e8ac6c2d415f86bbe2b3b9b72015bfb5fd638fdd22d1843","pkg-name":"PyF","pkg-version":"0.11.2.1","flags":{"python_test":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"3bd749eac5f91e44c148adf97f20c7424662e0cf1235d399f3f4848379c6038e","pkg-src-sha256":"e865c45a9323fc60f0a35f0aedf9e9f5c12258a6344bbd49031c09211b82220a","depends":["base-4.18.2.0","bytestring-0.11.5.3","ghc-9.6.4","mtl-2.3.1","parsec-3.1.16.1","template-haskell-2.20.0.0","text-2.0.2","time-1.12.2"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"QuickCheck-2.14.3-091d344acf9c963200a9b2af6c5417d91912262a9a84b607d918b50fdf8a8b02","pkg-name":"QuickCheck","pkg-version":"2.14.3","flags":{"old-random":false,"templatehaskell":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"f03d2f404d5ba465453d0fbc1944832789a759fe7c4f9bf8616bc1378a02fde4","pkg-src-sha256":"5c0f22b36b28a1a8fa110b3819818d3f29494a3b0dedbae299f064123ca70501","depends":["base-4.18.2.0","containers-0.6.7","deepseq-1.4.8.1","random-1.2.1.2-cc746490e13a1f967de173a54c09753b2ccdb5d95056b0f1206a29c62c83de45","splitmix-0.1.0.5-4c4c1f33537354cbf1e3da145a4775d1633faaa320080e06e92a1f67dbed4227","template-haskell-2.20.0.0","transformers-0.6.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"RSA-2.4.1-b4c924e20cf67b5e5898315a61da3d3144fe72c89c2d8d7467b5705a0e72d092","pkg-name":"RSA","pkg-version":"2.4.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"d2e711da52c19e332d374b3c0202a77d3088b59a0ba64abe6107569752fd1e24","pkg-src-sha256":"72c5d8c45ef1013e0e8aff763bb8894df0f022f28e698e33ae87bbdb33d69041","depends":["SHA-1.6.4.4-e6c31f0f5d851572b6ee53a36a002efa9780db2fdc8b31c1410f129bd3d58934","base-4.18.2.0","binary-0.8.9.1","bytestring-0.11.5.3","crypto-api-0.13.3-7a787ea36d9a45cc1748699175ede37f55426b32db3712140ca048f1a888c44f","crypto-pubkey-types-0.4.3-0e51728f266377e9408460fc3416717740bf7a0fd1ea1d3d056abfa0f9de4241"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"SHA-1.6.4.4-e6c31f0f5d851572b6ee53a36a002efa9780db2fdc8b31c1410f129bd3d58934","pkg-name":"SHA","pkg-version":"1.6.4.4","flags":{"exe":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"3b7523df3e2186ae8c5ac78c745efb586814afe9c775b886a747556d9f4d429c","pkg-src-sha256":"6bd950df6b11a3998bb1452d875d2da043ee43385459afc5f16d471d25178b44","depends":["array-0.5.6.0","base-4.18.2.0","binary-0.8.9.1","bytestring-0.11.5.3"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"StateVar-1.2.2-ad33ce876594474d931417853bfd72c6eb94d534a6634dcbf0af13ec95c0e031","pkg-name":"StateVar","pkg-version":"1.2.2","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"3c022c00485fe165e3080d5da6b3ca9c9b02f62c5deebc584d1b3d1309ce673e","pkg-src-sha256":"5e4b39da395656a59827b0280508aafdc70335798b50e5d6fd52596026251825","depends":["base-4.18.2.0","stm-2.5.1.0","transformers-0.6.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"abstract-deque-0.3-58da01f2d5856552665a639ed7e62652de2627cfca39d756a0f29f4265e71d1b","pkg-name":"abstract-deque","pkg-version":"0.3","flags":{"usecas":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"308bff92bb8b6621ed1dae718e859da145c8f31b8a9050aeacac40a8a21c9c90","pkg-src-sha256":"09aa10f38193a8275a7791b92a4f3a7192a304874637e2a35c897dde25d75ca2","depends":["array-0.5.6.0","base-4.18.2.0","containers-0.6.7","random-1.2.1.2-cc746490e13a1f967de173a54c09753b2ccdb5d95056b0f1206a29c62c83de45","time-1.12.2"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"adjunctions-4.4.2-f3221dcb76f82009b3161054c42f2ac113ea03b7e3e1a3d9dff315fac6299a27","pkg-name":"adjunctions","pkg-version":"4.4.2","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"30206ae6b78d3d523c2ff73640f84b51fa204ac3f05267a5f0c77c486b96781d","pkg-src-sha256":"147b5f8db810bca0ea8952ef974982ffc447cecd21f01e1ea1121df77e276518","depends":["array-0.5.6.0","base-4.18.2.0","comonad-5.0.8-8505feb1b75f0b6bf19ef9b666132d0031c1214df6db91aab78f0a9def57751c","containers-0.6.7","contravariant-1.5.5-45cb856efb41788f255562487551496b619a1cf555a23fc4a29495fda3e0c50f","distributive-0.6.2.1-70a2f4c4bffafd7749c1d755f27db885f954a9d9be1cd7db8a6e99887121ec8c","free-5.2-841f6f1c7522ed92dbed9d024b48671e79a9cdd76652f8bdbf9c0e63908771e7","mtl-2.3.1","profunctors-5.6.2-8b084a9552445e5776f01a7b42f1722ce1ecf20cf9a8e839007b9baea33b9fa4","semigroupoids-6.0.0.1-e83bc6491c75c3522014917ab4d3335127e2ee3b4989f0a49f9791f8bead28c6","semigroups-0.20-b7dd1b9febe28a509d4e029a8add1506aac955b99fce2599f25e63f8127812a9","tagged-0.8.8-5d06ce789c37adf39496775b08f7d82bb9509e4c2a3f973b0c868e35bca55ad5","transformers-0.6.1.0","transformers-compat-0.7.2-15ca92c51f3c4b3e5a349c3cc2a7f406ca01ba50aecd92a631a1c4d508b1230f","void-0.7.3-0dce7608060d286489a924498d4580dafe61112f075ee061dc6545c66ff6e691"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"aeson-2.2.1.0-2595d249b227784b9febcd5a91568775f66fd262ac45c82c44f7b4a55e9d4c27","pkg-name":"aeson","pkg-version":"2.2.1.0","flags":{"ordered-keymap":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"a23a61aada8233e10573e1612c0b2efe5a1aba0d59b05dbe2f63301822f136cb","pkg-src-sha256":"914eefd0e80d12db5c721daa2cbab427acee39795f125c5460c1fe48cf9a5d7f","depends":["OneTuple-0.4.1.1-8e8d21c288285c8a6e306ca430dcdc949a96b5c76772aaa2b31f79c6abb3541e","QuickCheck-2.14.3-091d344acf9c963200a9b2af6c5417d91912262a9a84b607d918b50fdf8a8b02","base-4.18.2.0","bytestring-0.11.5.3","containers-0.6.7","data-fix-0.3.2-5add57223d3c0b4ba49ecf522767d4a71475f5e86cefa1a15e9af611e468b46f","deepseq-1.4.8.1","dlist-1.0-1ec91dd3ad8405ed390138bce1c7d55220d4758eda9fb3ad6fbb8b1ee6dc0c94","exceptions-0.10.7","generically-0.1.1-bdc1b22218832bf69277f07778576bdaa3d8df05d3081150e9ff6dabe4f79249","ghc-prim-0.10.0","hashable-1.4.3.0-17b447e0ce504d4e093d6bf5a9838da3805c7caa5d16355da40827d004febbc8","indexed-traversable-0.1.3-8f7210e35c0cb4bf73ec163bed4014cbba70e17aa189447497a492e60990637b","integer-conversion-0.1.0.1-8c064ed0d1fb658105e6fb4ccc9c29b5609d33ee30393dfe431660a716d124d0","integer-logarithms-1.0.3.1-49bf09c2474200e80cd296b047116a8ad20403e42301ba2d71d615b2824b3fcd","network-uri-2.6.4.2-d62d36021f4a84b02c9243cbe37e9dfd5b7ba840b4aaedb5e002f05582564fc4","primitive-0.9.0.0-a6aa61bd9fff8d6cfd4880894dd85d8e644fbcf178b2bff38f87569871ea4a0d","scientific-0.3.7.0-ad7c6f4dff0f6cf6540942c40157e54f8c090b5d960104c70801b0a2f7c99215","semialign-1.3-d56979a02604b49151cb0b8ca42b64e13b0f633dac64c7e0a9a02902d973b559","strict-0.5-84b2c7152a9fd6aee3e1d1082edade7580c5af3226a0afc18e19724ada9d7fe4","tagged-0.8.8-5d06ce789c37adf39496775b08f7d82bb9509e4c2a3f973b0c868e35bca55ad5","template-haskell-2.20.0.0","text-2.0.2","text-iso8601-0.1-ca672f6e92319e19ff854d44b5ac9b4e7c827c1996a06b87b8a221dbacac85fb","text-short-0.1.5-e014e79f76c5438274db6ad0455e870f44faf95f73a43bdf4e1c22851755dbaa","th-abstraction-0.6.0.0-b49a83d27ea2604c7977c309bd302e93941309c5040c248dbdb6b55147976b2b","these-1.2-a7d4e934136841dac2b8ed0dc77fee3f581d8c4e25fe99bdad5b76406c57bf16","time-1.12.2","time-compat-1.9.6.1-2b2aa066adc7c0d5baad9d0716626a41574966c2265b4ff355b83a2bfd5ca61a","unordered-containers-0.2.20-013ecc3e94c07bd5bdb23da8c9cf4d68ac66e04c4144b4096b291104672db345","uuid-types-1.0.5.1-c19e00cab51fb72d8874dd99ac787f44fda9996af8117c2d227cfb3294e06a9c","vector-0.13.1.0-eb53bdac16f057ad838f4e8cb865b51b400abac71a36dc5bfde93ea1d0859eae","witherable-0.4.2-1767ce3334bad414dff74c30d2272bb1f265e0098708c8aa764f138b1a282619"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"aeson-pretty-0.8.10-9bd6a60b424b6a69fcd0507ef3b99938ee971580bc5bfa89249b16ff60b2c117","pkg-name":"aeson-pretty","pkg-version":"0.8.10","flags":{"lib-only":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"6b0d3c1004dc696cdfea45b442dd025b5ca62ecce44bf8669775529d5b672114","pkg-src-sha256":"2a21f2cd78adcb149ceba770239ed664519552911e7680172b18ff695cfa7ae5","depends":["aeson-2.2.1.0-2595d249b227784b9febcd5a91568775f66fd262ac45c82c44f7b4a55e9d4c27","base-4.18.2.0","base-compat-0.13.1-f0385202d32a5d6c7b36f9e6f39a361e139bf7a5858ef12f1c89ce0c83283469","bytestring-0.11.5.3","scientific-0.3.7.0-ad7c6f4dff0f6cf6540942c40157e54f8c090b5d960104c70801b0a2f7c99215","text-2.0.2","unordered-containers-0.2.20-013ecc3e94c07bd5bdb23da8c9cf4d68ac66e04c4144b4096b291104672db345","vector-0.13.1.0-eb53bdac16f057ad838f4e8cb865b51b400abac71a36dc5bfde93ea1d0859eae"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"aeson-pretty-0.8.10-e-aeson-pretty-b5fd8b2889d4e80f43983202a91dcfdb587598c0ed194ffee06d355a65ed67f9","pkg-name":"aeson-pretty","pkg-version":"0.8.10","flags":{"lib-only":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"6b0d3c1004dc696cdfea45b442dd025b5ca62ecce44bf8669775529d5b672114","pkg-src-sha256":"2a21f2cd78adcb149ceba770239ed664519552911e7680172b18ff695cfa7ae5","depends":["aeson-2.2.1.0-2595d249b227784b9febcd5a91568775f66fd262ac45c82c44f7b4a55e9d4c27","aeson-pretty-0.8.10-9bd6a60b424b6a69fcd0507ef3b99938ee971580bc5bfa89249b16ff60b2c117","attoparsec-0.14.4-5061b5f729de9f72f69961345d54e0249a28df7c232bb9cf2b0525b6f17a253a","attoparsec-aeson-2.2.0.1-768c79d04d1cb0ad1b116957e8c9aabf909372ca2c907dc42310e8efd0a37a03","base-4.18.2.0","bytestring-0.11.5.3","cmdargs-0.10.22-f5bcda1abe20b4892a5dd9a037b87b25157ad0148e6ed24d10071b61bda0375c"],"exe-depends":[],"component-name":"exe:aeson-pretty","bin-file":"/home/hecate/Projects/Flora/1-flora-server/_build/cabal-store/ghc-9.6.4/aeson-pretty-0.8.10-e-aeson-pretty-b5fd8b2889d4e80f43983202a91dcfdb587598c0ed194ffee06d355a65ed67f9/bin/aeson-pretty"},{"type":"configured","id":"ansi-terminal-1.0.2-f2271bf25e5299c165409ab78d5917aeba79c479959932bb5fb284c513226fc0","pkg-name":"ansi-terminal","pkg-version":"1.0.2","flags":{"example":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"1f90bb88e670ce63fbf2c9216d50857f2419582f1c6791e542c3eab97ecfd364","pkg-src-sha256":"46e516cbf66c7807940ba9896c2d71ba5ffdaa35a4fb80dea9313703efa8d834","depends":["ansi-terminal-types-0.11.5-a44e7be0d661302c2158cac2d1ab7efe513e657bcc7a366e4c289e6e43a0b2f6","base-4.18.2.0","colour-2.3.6-b9efcf2f194d8cd3334d28c9a0c2645a368b8c516a5d80ca0692194cbd33006d"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"ansi-terminal-types-0.11.5-a44e7be0d661302c2158cac2d1ab7efe513e657bcc7a366e4c289e6e43a0b2f6","pkg-name":"ansi-terminal-types","pkg-version":"0.11.5","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"f78440dfd95c4509e88855ac7cc2d9566ddf956a92c1290404cac93ad1a1b00a","pkg-src-sha256":"bf7b230389f43105100a6d5740822598a88b38eaaf7d042de595ccf72db4fdd1","depends":["base-4.18.2.0","colour-2.3.6-b9efcf2f194d8cd3334d28c9a0c2645a368b8c516a5d80ca0692194cbd33006d"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"appar-0.1.8-588a61c15c8bd457e6a1dd16deebaeef67d39cbf3527f952054c1230e05fa294","pkg-name":"appar","pkg-version":"0.1.8","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"a5d529bacbb74d566e4c5f9479af0637eac5957705f6db4d2670517489795de8","pkg-src-sha256":"c4ceeddc26525b58d82c41b6d3e32141371a200a6794aae185b6266ccc81631f","components":{"lib":{"depends":["base-4.18.2.0","bytestring-0.11.5.3"],"exe-depends":[]}}},{"type":"pre-existing","id":"array-0.5.6.0","pkg-name":"array","pkg-version":"0.5.6.0","depends":["base-4.18.2.0"]},{"type":"configured","id":"asn1-encoding-0.9.6-9bf64732d7af18045ee22a12f781934262d76015cf823acd133e41c1341a5fb9","pkg-name":"asn1-encoding","pkg-version":"0.9.6","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"27ed8f6043aed79630313bb931f7c8e2b510f0b4586cd55c16ae040c7d1ea098","pkg-src-sha256":"d9f8deabd3b908e5cf83c0d813c08dc0143b3ec1c0d97f660d2cfa02c1c8da0a","depends":["asn1-types-0.3.4-09d5674972306ee58c9f15c425744939cc04dad257e3b9dd8f0168fbdc38ab70","base-4.18.2.0","bytestring-0.11.5.3","hourglass-0.2.12-ff77f9ff09de83d24a0ee40cfa0cec90de8666d5167809a314d26ad4a7544cdd"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"asn1-parse-0.9.5-2a949cca1e96d33a3cea78e8f484af2b63e4592b43690a951c967874e85dcf09","pkg-name":"asn1-parse","pkg-version":"0.9.5","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"77c0126d63070df2d82cb4cfa4febb26c4e280f6d854bc778c2fa4d80ce692b8","pkg-src-sha256":"8f1fe1344d30b39dc594d74df2c55209577722af1497204b4c2b6d6e8747f39e","components":{"lib":{"depends":["asn1-encoding-0.9.6-9bf64732d7af18045ee22a12f781934262d76015cf823acd133e41c1341a5fb9","asn1-types-0.3.4-09d5674972306ee58c9f15c425744939cc04dad257e3b9dd8f0168fbdc38ab70","base-4.18.2.0","bytestring-0.11.5.3"],"exe-depends":[]}}},{"type":"configured","id":"asn1-types-0.3.4-09d5674972306ee58c9f15c425744939cc04dad257e3b9dd8f0168fbdc38ab70","pkg-name":"asn1-types","pkg-version":"0.3.4","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"8e879b3a5bbdd0031232eb84d904b5a3a2c20a18847692b996d774f4ff811355","pkg-src-sha256":"78ee92a251379298ca820fa53edbf4b33c539b9fcd887c86f520c30e3b4e21a8","components":{"lib":{"depends":["base-4.18.2.0","bytestring-0.11.5.3","hourglass-0.2.12-ff77f9ff09de83d24a0ee40cfa0cec90de8666d5167809a314d26ad4a7544cdd","memory-0.18.0-273ad672f1703dee0dfe07994633c93d17f815a149738659ef6afa30cbe4f6a8"],"exe-depends":[]}}},{"type":"configured","id":"assoc-1.1-44564689989a4d2721c54fe7433f3b2450e556c3fe6c52752ad54623647f561c","pkg-name":"assoc","pkg-version":"1.1","flags":{"tagged":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"56d0fd1c17aaf6268e81bf19ba5afe186128d7f88126bd546d5b3151ab692652","pkg-src-sha256":"7aa2e6548b3d9d49a286ac20639479aaf6c47a1446113ed784d98737c5f60df4","depends":["base-4.18.2.0","tagged-0.8.8-5d06ce789c37adf39496775b08f7d82bb9509e4c2a3f973b0c868e35bca55ad5"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"async-2.2.4-2107e60f1bee7c70ffed77e551ffc7db01e350edd8784cc9493cc782305122d0","pkg-name":"async","pkg-version":"2.2.4","flags":{"bench":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"9b8ceefce014e490f9e1335fa5f511161309926c55d01cec795016f4363b5d2d","pkg-src-sha256":"484df85be0e76c4fed9376451e48e1d0c6e97952ce79735b72d54297e7e0a725","depends":["base-4.18.2.0","hashable-1.4.3.0-17b447e0ce504d4e093d6bf5a9838da3805c7caa5d16355da40827d004febbc8","stm-2.5.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"atomic-primops-0.8.5-619a7ba3c59ea074ae39e3adf75904b21a27146e973f334ea4ab876a9cc1e3c2","pkg-name":"atomic-primops","pkg-version":"0.8.5","flags":{"debug":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"6496469ffe3847c71b38283d33e3bb392cc90e23fa0083c8ef0f8e509c57fe3c","pkg-src-sha256":"1ca55794c3adb8077c747e7cf1b3083b9938dbdadeab27555babbfdc87fa8b1f","depends":["base-4.18.2.0","ghc-prim-0.10.0","primitive-0.9.0.0-a6aa61bd9fff8d6cfd4880894dd85d8e644fbcf178b2bff38f87569871ea4a0d"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"attoparsec-0.14.4-5061b5f729de9f72f69961345d54e0249a28df7c232bb9cf2b0525b6f17a253a","pkg-name":"attoparsec","pkg-version":"0.14.4","flags":{"developer":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"ec709539b881d6431620bd7c40fbfa680aaf4a98c6f35b51536d8f455682b1ae","pkg-src-sha256":"3f337fe58624565de12426f607c23e60c7b09c86b4e3adfc827ca188c9979e6c","depends":["array-0.5.6.0","attoparsec-0.14.4-l-attoparsec-internal-f600b7076f93db9231c3b18ae83441a8fa6c0ca8eb782110fd08fd0479e72589","base-4.18.2.0","bytestring-0.11.5.3","containers-0.6.7","deepseq-1.4.8.1","ghc-prim-0.10.0","scientific-0.3.7.0-ad7c6f4dff0f6cf6540942c40157e54f8c090b5d960104c70801b0a2f7c99215","text-2.0.2","transformers-0.6.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"attoparsec-0.14.4-l-attoparsec-internal-f600b7076f93db9231c3b18ae83441a8fa6c0ca8eb782110fd08fd0479e72589","pkg-name":"attoparsec","pkg-version":"0.14.4","flags":{"developer":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"ec709539b881d6431620bd7c40fbfa680aaf4a98c6f35b51536d8f455682b1ae","pkg-src-sha256":"3f337fe58624565de12426f607c23e60c7b09c86b4e3adfc827ca188c9979e6c","depends":["array-0.5.6.0","base-4.18.2.0","bytestring-0.11.5.3","text-2.0.2"],"exe-depends":[],"component-name":"lib:attoparsec-internal"},{"type":"configured","id":"attoparsec-aeson-2.2.0.1-768c79d04d1cb0ad1b116957e8c9aabf909372ca2c907dc42310e8efd0a37a03","pkg-name":"attoparsec-aeson","pkg-version":"2.2.0.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"00026bb205aaa087215a4c3a65a62c4561c3fb58e882778c9607c63e2aa960e9","pkg-src-sha256":"cfc5f23a7b45d00c1121cbd94aef7ff0b3d997039931862c460340599a01c409","depends":["aeson-2.2.1.0-2595d249b227784b9febcd5a91568775f66fd262ac45c82c44f7b4a55e9d4c27","attoparsec-0.14.4-5061b5f729de9f72f69961345d54e0249a28df7c232bb9cf2b0525b6f17a253a","base-4.18.2.0","bytestring-0.11.5.3","integer-conversion-0.1.0.1-8c064ed0d1fb658105e6fb4ccc9c29b5609d33ee30393dfe431660a716d124d0","primitive-0.9.0.0-a6aa61bd9fff8d6cfd4880894dd85d8e644fbcf178b2bff38f87569871ea4a0d","scientific-0.3.7.0-ad7c6f4dff0f6cf6540942c40157e54f8c090b5d960104c70801b0a2f7c99215","text-2.0.2","vector-0.13.1.0-eb53bdac16f057ad838f4e8cb865b51b400abac71a36dc5bfde93ea1d0859eae"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"authenticate-oauth-1.7-17cbc43210a12a6ae641a7faea62b4f2f2c36ac4c243d15ee4ff7bbccaf8c6d1","pkg-name":"authenticate-oauth","pkg-version":"1.7","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"af2b03698756b2bbb42b8d30236b4d012e31db2b7ce63753158f63d5b0a81da5","pkg-src-sha256":"746ff695fec1bd7c7b90f1952847ce3453fadf0f18a31db206753360b3219b78","depends":["RSA-2.4.1-b4c924e20cf67b5e5898315a61da3d3144fe72c89c2d8d7467b5705a0e72d092","SHA-1.6.4.4-e6c31f0f5d851572b6ee53a36a002efa9780db2fdc8b31c1410f129bd3d58934","base-4.18.2.0","base64-bytestring-1.2.1.0-ecb3bf792eac6ec696f20e02e528e8a7b2a76a5b32c46409c4645e1bfbd71cf4","blaze-builder-0.4.2.3-60676f992d653075aeba6aad80b2dd0b054859608a5712ecfc9d4a4968aefdb8","bytestring-0.11.5.3","crypto-pubkey-types-0.4.3-0e51728f266377e9408460fc3416717740bf7a0fd1ea1d3d056abfa0f9de4241","data-default-0.7.1.1-fb1a461d5390de89b4af18b225f51df41ca3a345d820ee4756653e4cd2f3cd8e","http-client-0.7.16-08ac6af6261aa24f586bbb528e8ea2f0bd2e7510d1883948d770173e7ea8b633","http-types-0.12.4-0f52a9ec33f3c65ef0b77ad8ce14b65f9164f8a761e42800dc9c80ee1768aacc","random-1.2.1.2-cc746490e13a1f967de173a54c09753b2ccdb5d95056b0f1206a29c62c83de45","time-1.12.2","transformers-0.6.1.0","transformers-compat-0.7.2-15ca92c51f3c4b3e5a349c3cc2a7f406ca01ba50aecd92a631a1c4d508b1230f"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"auto-update-0.1.6-3f7af882e90ee16fd9e6ebf1ca739ba4ad18afcdae045a3375fe3adefea17239","pkg-name":"auto-update","pkg-version":"0.1.6","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"10adca282e131a2fa01fb7a411b02811685c1cea02e9813df2d7fb468b5ef638","pkg-src-sha256":"f4e023dc8713c387ecf20d851247597fd012cabea3872310b35e911105eb66c4","depends":["base-4.18.2.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"barbies-2.1.1.0-a2e90384bd5520adcdbd08bf5d3ad4beac274ed17c2784dd44f1bf5a9ba6ef3f","pkg-name":"barbies","pkg-version":"2.1.1.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"ec928dbc06fa00e1f323b9b7f4f5ba3cffcaa1e0d7d3cc275789a40a5a32f053","pkg-src-sha256":"73972093f6a5f8e8daaeb5f1058abbd0944d3fcb9f073f2ad3cdb94095d4d2b7","depends":["base-4.18.2.0","distributive-0.6.2.1-70a2f4c4bffafd7749c1d755f27db885f954a9d9be1cd7db8a6e99887121ec8c","transformers-0.6.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"base-4.18.2.0","pkg-name":"base","pkg-version":"4.18.2.0","depends":["ghc-bignum-1.3","ghc-prim-0.10.0","rts-1.0.2"]},{"type":"configured","id":"base-compat-0.13.1-f0385202d32a5d6c7b36f9e6f39a361e139bf7a5858ef12f1c89ce0c83283469","pkg-name":"base-compat","pkg-version":"0.13.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"70632b4e8d8355a1993d3a1bffd8a2022570c859b486b5d114021ee838427940","pkg-src-sha256":"db1d9e8d56c8bb0066d313a3b5bc4143c021698d377f4c51b3ba010cff1e8421","depends":["base-4.18.2.0","ghc-prim-0.10.0","unix-2.8.4.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"base-compat-batteries-0.13.1-25e7385abd281169497a6f5094374b17c8dd67030772349b80bd82c47b483cae","pkg-name":"base-compat-batteries","pkg-version":"0.13.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"19463f09774812886b51be4c02d524063454a0dfaec3bfc6df7fb40520fafecd","pkg-src-sha256":"3e525b51a1db32a0d5d826ee3000e8436aa142505f24467737b9519545a7a802","depends":["base-4.18.2.0","base-compat-0.13.1-f0385202d32a5d6c7b36f9e6f39a361e139bf7a5858ef12f1c89ce0c83283469","ghc-prim-0.10.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"base-orphans-0.9.1-61d128d6a3318593c785a97751f2418cc86b42b03e2b46ed92e9b27fc5da689c","pkg-name":"base-orphans","pkg-version":"0.9.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"c4733d09f798fc4304e936924a1a7d9fc2425aefad6c46ad4592035254b46051","pkg-src-sha256":"5bbf2da382c5b212d6a8be2f8c49edee0eba30f272a15fd32c13e6e4091ef172","depends":["base-4.18.2.0","ghc-prim-0.10.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"base16-1.0-a724bafd7515d95cb8fc6e89e9d0f282f5ab5b792fe4d5387e65ac02f31e861c","pkg-name":"base16","pkg-version":"1.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"9366318622ec10e124929591015f1814e48c882a59d33ac612213935e8902003","pkg-src-sha256":"86366364910b78609677817cf3f987bf1690e1f75bba04bc91a5ed993d619cde","depends":["base-4.18.2.0","bytestring-0.11.5.3","deepseq-1.4.8.1","primitive-0.9.0.0-a6aa61bd9fff8d6cfd4880894dd85d8e644fbcf178b2bff38f87569871ea4a0d","text-2.0.2","text-short-0.1.5-e014e79f76c5438274db6ad0455e870f44faf95f73a43bdf4e1c22851755dbaa"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"base16-bytestring-1.0.2.0-b470eb3428775005093b18dbb34dd687b575cadcc3d709cf63c09611d917e654","pkg-name":"base16-bytestring","pkg-version":"1.0.2.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"a694e88f9ec9fc79f0b03f233d3fea592b68f70a34aac2ddb5bcaecb6562e2fd","pkg-src-sha256":"1d5a91143ef0e22157536093ec8e59d226a68220ec89378d5dcaeea86472c784","depends":["base-4.18.2.0","bytestring-0.11.5.3"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"base32-0.4-3d897481f9dfd13903e614afd99fb6b4ab13c775030063f288dd112a84583017","pkg-name":"base32","pkg-version":"0.4","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"123184f74db39ca58ccc3f9a3952497e585f49c693ebd83ba33db3477854f09e","pkg-src-sha256":"9ae7861d509528d3e8f4ecd946051b05f7141e907216e672d18e26d242a908d4","depends":["base-4.18.2.0","bytestring-0.11.5.3","deepseq-1.4.8.1","text-2.0.2","text-short-0.1.5-e014e79f76c5438274db6ad0455e870f44faf95f73a43bdf4e1c22851755dbaa"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"base64-1.0-dd5d13a79aacb87c11501514ee42d94f31fb8135c9427a7dddef0b4e4e537062","pkg-name":"base64","pkg-version":"1.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"304b260d9dba7cb04118e6fe84e1eb2de72212461460e4eea3684115c059dfa6","pkg-src-sha256":"7942239f1804945fd6d319a953f26c53b64518076cd294141fda983f2ff1b2b6","depends":["base-4.18.2.0","bytestring-0.11.5.3","deepseq-1.4.8.1","text-2.0.2","text-short-0.1.5-e014e79f76c5438274db6ad0455e870f44faf95f73a43bdf4e1c22851755dbaa"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"base64-bytestring-1.2.1.0-ecb3bf792eac6ec696f20e02e528e8a7b2a76a5b32c46409c4645e1bfbd71cf4","pkg-name":"base64-bytestring","pkg-version":"1.2.1.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"45305ccf8914c66d385b518721472c7b8c858f1986945377f74f85c1e0d49803","pkg-src-sha256":"fbf8ed30edde271eb605352021431d8f1b055f95a56af31fe2eacf6bdfdc49c9","depends":["base-4.18.2.0","bytestring-0.11.5.3"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"basement-0.0.16-2ba9d181df7bdd547d6fedd5acdec581f03e379e22b0e08ff998fb0462257d08","pkg-name":"basement","pkg-version":"0.0.16","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"e9458cbe67f396fb81900ec65852a582a2b7febd09b17a85adee576c8d7cc321","pkg-src-sha256":"7fb77e249aef76ba5aed3059d556800ce02b614597c488ba01f0a16449146300","depends":["base-4.18.2.0","ghc-prim-0.10.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"bifunctors-5.6.1-3bfddc97d0532e0f4bedd1f64454f96744d2fe805f93a5f9e443c2c5e1035ff1","pkg-name":"bifunctors","pkg-version":"5.6.1","flags":{"tagged":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"82fa7ed8f69f0bfa375de117ab36414c0b96a97ee046edc3ac6da7a295a94755","pkg-src-sha256":"06381471b5be16516a1b2c4b21a5101a3d991038bface8e0cad144c0044d57fc","depends":["assoc-1.1-44564689989a4d2721c54fe7433f3b2450e556c3fe6c52752ad54623647f561c","base-4.18.2.0","comonad-5.0.8-8505feb1b75f0b6bf19ef9b666132d0031c1214df6db91aab78f0a9def57751c","containers-0.6.7","tagged-0.8.8-5d06ce789c37adf39496775b08f7d82bb9509e4c2a3f973b0c868e35bca55ad5","template-haskell-2.20.0.0","th-abstraction-0.6.0.0-b49a83d27ea2604c7977c309bd302e93941309c5040c248dbdb6b55147976b2b","transformers-0.6.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"binary-0.8.9.1","pkg-name":"binary","pkg-version":"0.8.9.1","depends":["array-0.5.6.0","base-4.18.2.0","bytestring-0.11.5.3","containers-0.6.7"]},{"type":"configured","id":"bitvec-1.1.5.0-134351d7461857a38c09b3cd302761a8b59d5482f7705b4680a47926f8628740","pkg-name":"bitvec","pkg-version":"1.1.5.0","flags":{"simd":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"7c5639f95c8ce9d5be810152bfcaf701aac3b7d7f08685a869c7eda63dc2cd76","pkg-src-sha256":"83d27cee5be1d5342ddbf39999d0c8ea54cb433d0891eea5471fbfaa29f8dec5","depends":["base-4.18.2.0","bytestring-0.11.5.3","deepseq-1.4.8.1","ghc-bignum-1.3","primitive-0.9.0.0-a6aa61bd9fff8d6cfd4880894dd85d8e644fbcf178b2bff38f87569871ea4a0d","vector-0.13.1.0-eb53bdac16f057ad838f4e8cb865b51b400abac71a36dc5bfde93ea1d0859eae"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"blaze-builder-0.4.2.3-60676f992d653075aeba6aad80b2dd0b054859608a5712ecfc9d4a4968aefdb8","pkg-name":"blaze-builder","pkg-version":"0.4.2.3","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"3f2ff408e858e3ecac30183f98bbb14ce6cf6314c654bd9107e51defd386d5ef","pkg-src-sha256":"66291874236b7342adab033e3cddae414a23a2865dfb44095dfc4e0b9d46703b","depends":["base-4.18.2.0","bytestring-0.11.5.3","deepseq-1.4.8.1","ghc-prim-0.10.0","text-2.0.2"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"blaze-html-0.9.1.2-3a4f994094b15669094f06ad98d568adb79b03a7829eff4349476c2fafb25845","pkg-name":"blaze-html","pkg-version":"0.9.1.2","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"2e40ad3828320b72122f09754091fb686fa0fd4c083769f17ef84584972ec450","pkg-src-sha256":"60503f42546c6c1b954014d188ea137e43d74dcffd2bf6157c113fd91a0c394c","depends":["base-4.18.2.0","blaze-builder-0.4.2.3-60676f992d653075aeba6aad80b2dd0b054859608a5712ecfc9d4a4968aefdb8","blaze-markup-0.8.3.0-2e784e1507a2d7d5a307522e712dffb50117e7a08a6219ee2f5a0daa30ff9ab0","bytestring-0.11.5.3","text-2.0.2"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"blaze-markup-0.8.3.0-2e784e1507a2d7d5a307522e712dffb50117e7a08a6219ee2f5a0daa30ff9ab0","pkg-name":"blaze-markup","pkg-version":"0.8.3.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"a8365ac8b98738065c2867682dbcd9b0baeb7a5cd1eaa8e508279edfd19227b9","pkg-src-sha256":"8606ac8b4a1f7f8f1bbc0770b2752e9b6f88ccc9fbdcbb33aa20577d0e5930e8","depends":["base-4.18.2.0","blaze-builder-0.4.2.3-60676f992d653075aeba6aad80b2dd0b054859608a5712ecfc9d4a4968aefdb8","bytestring-0.11.5.3","text-2.0.2"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"boring-0.2.1-9a8dc8e41ea918a09754ff07614d4843b0ebe75d8757fd3273e17938f5bf6233","pkg-name":"boring","pkg-version":"0.2.1","flags":{"tagged":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"9e2566d93e8db00ea7c428bf6a4052f8479ef6b6a86294d65c6086d45a842e4b","pkg-src-sha256":"b1ffddf0f9d50ac8742aa01b270856d57937cc8f7aae783e3b5f3abee7aa3154","depends":["base-4.18.2.0","tagged-0.8.8-5d06ce789c37adf39496775b08f7d82bb9509e4c2a3f973b0c868e35bca55ad5","transformers-0.6.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"bsb-http-chunked-0.0.0.4-f0471e0efa2dd6ebef9e206b6727cf6fe5e8a009c301af9a3b7199515a1e2c08","pkg-name":"bsb-http-chunked","pkg-version":"0.0.0.4","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"1cce7371c31b1d3cfa3eb155e2aecffc0ec212d1d8a7e7c8a3b00ef76818a43b","pkg-src-sha256":"148309e23eb8b261c1de374712372d62d8c8dc8ee504c392809c7ec33c0a0e7c","depends":["base-4.18.2.0","bytestring-0.11.5.3"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"bytebuild-0.3.16.2-cdc53c5f9fe77d8a2e07a053df6e6cc49bf0b599080e951bea083f37245f23ad","pkg-name":"bytebuild","pkg-version":"0.3.16.2","flags":{"checked":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"313814827be2536850fe6fd5b9b53174f44cb7988475724fdbb15e2ed79c575a","pkg-src-sha256":"2cb53fb854682ee38bccd560291ebd0651b4d54d6ba27f9e2a17b5168ed49687","depends":["base-4.18.2.0","byteslice-0.2.13.2-93a4f1e735c3da2a6b67f70d01ac2fe3652393dc05bb13f3b274ebaf67729ba4","bytestring-0.11.5.3","haskell-src-meta-0.8.13-d3053a08f8d9deda4e92997b870b23096956d6c11736d5eed8f387ed509f1133","integer-logarithms-1.0.3.1-49bf09c2474200e80cd296b047116a8ad20403e42301ba2d71d615b2824b3fcd","natural-arithmetic-0.2.1.0-327b3d0462a9fdccd1f5901b636a5c6f1c1996b903146b3f4bf006389c9d4483","primitive-0.9.0.0-a6aa61bd9fff8d6cfd4880894dd85d8e644fbcf178b2bff38f87569871ea4a0d","primitive-offset-0.2.0.0-b93fd3063a232ecde01c2f1c6c7f349f7bbfba6a51590e6011e8c669dc2ff008","run-st-0.1.3.3-af1ad044a973fec4afa0830cc37bb6f0f7961cd9e6ffb5b32198ce4b6d73c331","template-haskell-2.20.0.0","text-2.0.2","text-short-0.1.5-e014e79f76c5438274db6ad0455e870f44faf95f73a43bdf4e1c22851755dbaa","wide-word-0.1.6.0-701ecedac0a6c9b47e334c978d1acbc2be6ad5ec17436c6d5c3ac80532b45795","zigzag-0.1.0.0-566d257af37db43b1ea7fe61e93ddea5f662ad8c5b1df04c1e845b14b13bcf67"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"byteorder-1.0.4-fa2515b96f172f97bd2e2638b538e2286cb035eb8b87892a4857a50c6e738631","pkg-name":"byteorder","pkg-version":"1.0.4","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"a952817dcbe20af0346fb55a28c13e95e2ddbf3e99f9b4fffdc063f150f13b20","pkg-src-sha256":"bd20bbb586947f99c38a4c93d9d0266f49f6fc581767b51ba568f6d5d52d2919","components":{"lib":{"depends":["base-4.18.2.0"],"exe-depends":[]}}},{"type":"configured","id":"byteslice-0.2.13.2-93a4f1e735c3da2a6b67f70d01ac2fe3652393dc05bb13f3b274ebaf67729ba4","pkg-name":"byteslice","pkg-version":"0.2.13.2","flags":{"avoid-rawmemchr":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"0dd9dc4bf4679b9ae413b97bf22140adac6278807759329cc1b2ee791b150079","pkg-src-sha256":"67c7b30f862aad1deef05f807d438db57866ca99d3d0461716d9666d21943ffc","depends":["base-4.18.2.0","bytestring-0.11.5.3","natural-arithmetic-0.2.1.0-327b3d0462a9fdccd1f5901b636a5c6f1c1996b903146b3f4bf006389c9d4483","primitive-0.9.0.0-a6aa61bd9fff8d6cfd4880894dd85d8e644fbcf178b2bff38f87569871ea4a0d","primitive-addr-0.1.0.2-1d786758faf617b086ce4cbc72b559d853b44b3c0637695f91811d3095dde6e1","primitive-unlifted-2.1.0.0-aea76574320ac1dea77e342956c3de02d6d7ed0b25f80413b31e3a4622eea123","run-st-0.1.3.3-af1ad044a973fec4afa0830cc37bb6f0f7961cd9e6ffb5b32198ce4b6d73c331","text-2.0.2","text-short-0.1.5-e014e79f76c5438274db6ad0455e870f44faf95f73a43bdf4e1c22851755dbaa","tuples-0.1.0.0-c9da1e31c493a9db3a026d6ed37a9f2e238abe29b118611180b8b3b5a28d1337","vector-0.13.1.0-eb53bdac16f057ad838f4e8cb865b51b400abac71a36dc5bfde93ea1d0859eae"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"bytesmith-0.3.11.0-110aed7be9e82cf40e2b317b574dcf8dfef014f7e0dbb78475aca851e3d498dd","pkg-name":"bytesmith","pkg-version":"0.3.11.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"4680a3268248b87376db1faa940fb3248a517b14eb9c014d6f2181e723c8a9ed","pkg-src-sha256":"7f6bd1b77dcb1428c9e10d073646c757046c46b41aeb21e6c34e7796db7d3a31","depends":["base-4.18.2.0","byteslice-0.2.13.2-93a4f1e735c3da2a6b67f70d01ac2fe3652393dc05bb13f3b274ebaf67729ba4","bytestring-0.11.5.3","contiguous-0.6.4.2-05fdf6e288b8c7809eb95c94784c40e7f5746e0c73b7ad5b8a9f9a3c7449d34f","natural-arithmetic-0.2.1.0-327b3d0462a9fdccd1f5901b636a5c6f1c1996b903146b3f4bf006389c9d4483","primitive-0.9.0.0-a6aa61bd9fff8d6cfd4880894dd85d8e644fbcf178b2bff38f87569871ea4a0d","run-st-0.1.3.3-af1ad044a973fec4afa0830cc37bb6f0f7961cd9e6ffb5b32198ce4b6d73c331","text-short-0.1.5-e014e79f76c5438274db6ad0455e870f44faf95f73a43bdf4e1c22851755dbaa","wide-word-0.1.6.0-701ecedac0a6c9b47e334c978d1acbc2be6ad5ec17436c6d5c3ac80532b45795"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"bytestring-0.11.5.3","pkg-name":"bytestring","pkg-version":"0.11.5.3","depends":["base-4.18.2.0","deepseq-1.4.8.1","ghc-prim-0.10.0","template-haskell-2.20.0.0"]},{"type":"configured","id":"bytestring-builder-0.10.8.2.0-e19114b40bd07b22b89d1b66ea0a2320498dd92342a0ffbe5a84431b412d2a4c","pkg-name":"bytestring-builder","pkg-version":"0.10.8.2.0","flags":{"bytestring_has_builder":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"6b2b812cdac53f5a2c82376a416dde04adbb5ca3e1604c0d075368a0498f762b","pkg-src-sha256":"27faef6db27c5be5a3715fd68b93725853e0e668849eaf92ce7c33cef9cb2c3f","depends":["base-4.18.2.0","bytestring-0.11.5.3","deepseq-1.4.8.1"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"cabal-doctest-1.0.9-4a685fb2745cdab49526ff8fe3801bf6bd4ab5085239033fcfd51613f7e3fd76","pkg-name":"cabal-doctest","pkg-version":"1.0.9","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"6dea0dbd1457f43d96ce1cfb1bab8b9f55d4fb82940e2bfa5aad78e6e2260656","pkg-src-sha256":"5556088496111d33810c4ae6c4a065bb37fa3315e9e8891e8000b1ab6707ba73","depends":["Cabal-3.10.1.0","base-4.18.2.0","directory-1.3.8.1","filepath-1.4.200.1"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"call-stack-0.4.0-a0fd887e5d06d11a75269d5dfed7da6fe2656edbbd7cc1697fb2a2b8ad4fe392","pkg-name":"call-stack","pkg-version":"0.4.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"ac44d2c00931dc20b01750da8c92ec443eb63a7231e8550188cb2ac2385f7feb","pkg-src-sha256":"430bcf8a3404f7e55319573c0b807b1356946f0c8f289bb3d9afb279c636b87b","depends":["base-4.18.2.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"case-insensitive-1.2.1.0-5255eaf892b10e8489fdad145ca833a10864bd951f3e69d04088fbcadf28ec6d","pkg-name":"case-insensitive","pkg-version":"1.2.1.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"9dfd3171fc7698cf8d931727d3af3a7b389135b583e46b5adac1f9d2026fff61","pkg-src-sha256":"296dc17e0c5f3dfb3d82ced83e4c9c44c338ecde749b278b6eae512f1d04e406","depends":["base-4.18.2.0","bytestring-0.11.5.3","deepseq-1.4.8.1","hashable-1.4.3.0-17b447e0ce504d4e093d6bf5a9838da3805c7caa5d16355da40827d004febbc8","text-2.0.2"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"cborg-0.2.10.0-cfaa438104ce487b61248b85071f08fb39e16a23a8eb0f32a1ad8b086d37fb6b","pkg-name":"cborg","pkg-version":"0.2.10.0","flags":{"optimize-gmp":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"61655189275a1d3f74553e918c90ae87448bc4af6c5f41159c01849b22b1ee75","pkg-src-sha256":"17fe070c38fc498cab49bcb9d6215b7747d53bedf96502e9bcce9cad73b9c797","depends":["array-0.5.6.0","base-4.18.2.0","bytestring-0.11.5.3","containers-0.6.7","deepseq-1.4.8.1","ghc-bignum-1.3","ghc-prim-0.10.0","half-0.3.1-abaa8d4e544e24e38c9200d7b5cfb6731ae8b4aec4a1d27bf34cec5836e12ff6","primitive-0.9.0.0-a6aa61bd9fff8d6cfd4880894dd85d8e644fbcf178b2bff38f87569871ea4a0d","text-2.0.2"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"cereal-0.5.8.3-930e90604013ce2a32c6d28d3567d1d966e50eb1bf0c18108838f2b4ff0d64ca","pkg-name":"cereal","pkg-version":"0.5.8.3","flags":{"bytestring-builder":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"87a227c7b510217ea059db3dd59d9665edd8f0d1d3d8de39458e371a1d9402fb","pkg-src-sha256":"99905220661b26e5bd91130bd9772554938608a5b1d717240a6eb331121e0f6a","depends":["array-0.5.6.0","base-4.18.2.0","bytestring-0.11.5.3","containers-0.6.7","ghc-prim-0.10.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"chronos-1.1.6.1-e20dbb7d5779b22a2f3541a6e640402e4330514b14ff822947c4209317b25bd6","pkg-name":"chronos","pkg-version":"1.1.6.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"79f83f2db47065c9019ab8d958e82c0c3e211e9714840746bd8bd038f4ae7eb0","pkg-src-sha256":"3998e5495247338506e0cc35bd5aecf5c8e89f79a069d2c5338b3c72c27e4259","depends":["aeson-2.2.1.0-2595d249b227784b9febcd5a91568775f66fd262ac45c82c44f7b4a55e9d4c27","attoparsec-0.14.4-5061b5f729de9f72f69961345d54e0249a28df7c232bb9cf2b0525b6f17a253a","base-4.18.2.0","bytebuild-0.3.16.2-cdc53c5f9fe77d8a2e07a053df6e6cc49bf0b599080e951bea083f37245f23ad","byteslice-0.2.13.2-93a4f1e735c3da2a6b67f70d01ac2fe3652393dc05bb13f3b274ebaf67729ba4","bytesmith-0.3.11.0-110aed7be9e82cf40e2b317b574dcf8dfef014f7e0dbb78475aca851e3d498dd","bytestring-0.11.5.3","deepseq-1.4.8.1","hashable-1.4.3.0-17b447e0ce504d4e093d6bf5a9838da3805c7caa5d16355da40827d004febbc8","natural-arithmetic-0.2.1.0-327b3d0462a9fdccd1f5901b636a5c6f1c1996b903146b3f4bf006389c9d4483","primitive-0.9.0.0-a6aa61bd9fff8d6cfd4880894dd85d8e644fbcf178b2bff38f87569871ea4a0d","text-2.0.2","text-short-0.1.5-e014e79f76c5438274db6ad0455e870f44faf95f73a43bdf4e1c22851755dbaa","torsor-0.1.0.1-264ad98156300f7b86fb968625df8515c2fbbce5479b450f036ac11b2f5c7444","vector-0.13.1.0-eb53bdac16f057ad838f4e8cb865b51b400abac71a36dc5bfde93ea1d0859eae"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"clock-0.8.4-ad97d5c0d9c88bea3fcc07810f4bfa48bfd5e30af51e35ab1d3d70d0ad238573","pkg-name":"clock","pkg-version":"0.8.4","flags":{"llvm":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"b938655b00cf204ce69abfff946021bed111d2609a9f7a9c22e28a1a202e9115","pkg-src-sha256":"6ae9898afe788a5e334cd5fad5d18a3c2e8e59fa09aaf7b957dbb38a4767df2e","depends":["base-4.18.2.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"cmark-gfm-0.2.6-75f7486f403003de2a2443033871ceb43cdf01f5fac50f7409807d10e27f29bc","pkg-name":"cmark-gfm","pkg-version":"0.2.6","flags":{"pkgconfig":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"8672b9388f5ddfa8ece691e59b4272fa807a2ddf0698970cd73af9bebb98058d","pkg-src-sha256":"958cfb3bd54b1bfa9e1e2d9cd1748e76c10d2b30a3cceeab3f6a852205c1a869","depends":["base-4.18.2.0","bytestring-0.11.5.3","text-2.0.2"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"cmdargs-0.10.22-f5bcda1abe20b4892a5dd9a037b87b25157ad0148e6ed24d10071b61bda0375c","pkg-name":"cmdargs","pkg-version":"0.10.22","flags":{"quotation":true,"testprog":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"0d1a33c3978fbcdda4f2543e62ac3ed8ad36152e141cdeebeece7e08d6529d63","pkg-src-sha256":"b8b12e7f8795cf13037bb062d453b86c788eae62558586f59e9419aabe6e9bef","depends":["base-4.18.2.0","filepath-1.4.200.1","process-1.6.17.0","template-haskell-2.20.0.0","transformers-0.6.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"colour-2.3.6-b9efcf2f194d8cd3334d28c9a0c2645a368b8c516a5d80ca0692194cbd33006d","pkg-name":"colour","pkg-version":"2.3.6","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"ebdcbf15023958838a527e381ab3c3b1e99ed12d1b25efeb7feaa4ad8c37664a","pkg-src-sha256":"2cd35dcd6944a5abc9f108a5eb5ee564b6b1fa98a9ec79cefcc20b588991f871","depends":["base-4.18.2.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"colourista-0.1.0.2-f2248bbbb4ee79cbf9fe81e61effe11fd685506de3685fc7950c57e7408058a6","pkg-name":"colourista","pkg-version":"0.1.0.2","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"87b6c096563c3dc5afb1161f06891235370862fc3406406f1f10f1864e55e0a1","pkg-src-sha256":"96afae0b54b12205a9871ecb4c7ee173e8b9f05363d843c15d373d394d08063c","depends":["ansi-terminal-1.0.2-f2271bf25e5299c165409ab78d5917aeba79c479959932bb5fb284c513226fc0","base-4.18.2.0","bytestring-0.11.5.3","text-2.0.2"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"commonmark-0.2.5.1-42b2b423f134ce671347ac1eb3ef3f9f8d898f5b6f290e2c7f708d870c7508f8","pkg-name":"commonmark","pkg-version":"0.2.5.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"cd1a6f9bc24459643a8f7b73190d92ff7d2eab4151694de4299e5fd3af2f6558","pkg-src-sha256":"cdd629cf07be861ba9ae2395b4caca61138bc281fc27f457f1f8cce31719c548","depends":["base-4.18.2.0","bytestring-0.11.5.3","containers-0.6.7","parsec-3.1.16.1","text-2.0.2","transformers-0.6.1.0","unicode-data-0.4.0.1-2cec5f4ee6f7dac835f9656497f58d5132b6da46ac07f33c15ef93dbfe67a942","unicode-transforms-0.4.0.1-8c67b0eaf2d5104e81ffbe7caf4900a211ea1e275b21ae6aca8253bd0b8d074b"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"commonmark-extensions-0.2.5.2-59454db801b34e805acb6c8d83dde32037a0c2284a4baf2daa746c128a386e1d","pkg-name":"commonmark-extensions","pkg-version":"0.2.5.2","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"4fa3a7dd7f5f1325ebaf23d1f73cc21abc1b124e74cf49dc7157a88874b6f504","pkg-src-sha256":"ec8d2ced4f126aed144e98888f1af845402395a351d8b1c291a372723a7811ab","depends":["base-4.18.2.0","commonmark-0.2.5.1-42b2b423f134ce671347ac1eb3ef3f9f8d898f5b6f290e2c7f708d870c7508f8","containers-0.6.7","emojis-0.1.3-f8293844dfb248bd5ce62ece3582fb79ba4132f2e1ac9c78fac78b46fb1d71d5","filepath-1.4.200.1","network-uri-2.6.4.2-d62d36021f4a84b02c9243cbe37e9dfd5b7ba840b4aaedb5e002f05582564fc4","parsec-3.1.16.1","text-2.0.2","transformers-0.6.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"comonad-5.0.8-8505feb1b75f0b6bf19ef9b666132d0031c1214df6db91aab78f0a9def57751c","pkg-name":"comonad","pkg-version":"5.0.8","flags":{"containers":true,"distributive":true,"indexed-traversable":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"4a4dbfbd03fb4963987710fca994e8b5624bd05a33e5f95b7581b26f8229c5e3","pkg-src-sha256":"ef6cdf2cc292cc43ee6aa96c581b235fdea8ab44a0bffb24dc79ae2b2ef33d13","depends":["base-4.18.2.0","containers-0.6.7","distributive-0.6.2.1-70a2f4c4bffafd7749c1d755f27db885f954a9d9be1cd7db8a6e99887121ec8c","indexed-traversable-0.1.3-8f7210e35c0cb4bf73ec163bed4014cbba70e17aa189447497a492e60990637b","tagged-0.8.8-5d06ce789c37adf39496775b08f7d82bb9509e4c2a3f973b0c868e35bca55ad5","transformers-0.6.1.0","transformers-compat-0.7.2-15ca92c51f3c4b3e5a349c3cc2a7f406ca01ba50aecd92a631a1c4d508b1230f"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"concurrent-output-1.10.20-c4a120b1daa3b0b9738f4f9f1b441737023740231d880696da957f2afe7f5fcc","pkg-name":"concurrent-output","pkg-version":"1.10.20","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"b0ebf122b3f22c9739045825334bd02bd2814752933a92db41e5b4648527139c","pkg-src-sha256":"8e23b5aa95fb9ed5224173f2587a9e4af244322c40249fe24e948bd6007421ca","depends":["ansi-terminal-1.0.2-f2271bf25e5299c165409ab78d5917aeba79c479959932bb5fb284c513226fc0","async-2.2.4-2107e60f1bee7c70ffed77e551ffc7db01e350edd8784cc9493cc782305122d0","base-4.18.2.0","directory-1.3.8.1","exceptions-0.10.7","process-1.6.17.0","stm-2.5.1.0","terminal-size-0.3.4-172d551b468144cc78b519639c232b4d8e46869dd22d4d30ed85ae123e1301e8","text-2.0.2","transformers-0.6.1.0","unix-2.8.4.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"conduit-1.3.5-96fa916ebd7a150aa66076e6ed1e4a9d7982e51658f9fd750ad31ce33c46afd7","pkg-name":"conduit","pkg-version":"1.3.5","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"22665df25c9c158d5fcfb299e46b0b642868add42a6bb13b79d457dc7ff7be1a","pkg-src-sha256":"2bb0d3e0eecc43e3d1d8cfc2125914f9175cde752be2d5908a1e120f321c782d","depends":["base-4.18.2.0","bytestring-0.11.5.3","directory-1.3.8.1","exceptions-0.10.7","filepath-1.4.200.1","mono-traversable-1.0.15.3-ee2c72a88a7e0e61e75d356539364a91ed39c83311aa5272b47ebaa5412d78cc","mtl-2.3.1","primitive-0.9.0.0-a6aa61bd9fff8d6cfd4880894dd85d8e644fbcf178b2bff38f87569871ea4a0d","resourcet-1.3.0-0f210c6e8ffe9f595ad8fd1a6cf6726e42a6695abb7febee22452f40436a2bc5","text-2.0.2","transformers-0.6.1.0","unix-2.8.4.0","unliftio-core-0.2.1.0-1e6dce1dfe73ef335e0615b0af7f06b171c3572cf7a04fe671b6cec407b73dee","vector-0.13.1.0-eb53bdac16f057ad838f4e8cb865b51b400abac71a36dc5bfde93ea1d0859eae"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"conduit-extra-1.3.6-a9b74b7c97cb9e39e8f4262bfd1952b446fe950cb07e127ba073c16301e30755","pkg-name":"conduit-extra","pkg-version":"1.3.6","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"83303e6fea78a683fdbb41682fc8dbc47b1d8830da1f09e88940f9a744a7f984","pkg-src-sha256":"8950c38049d892c38590d389bed49ecf880671f58ec63dd4709d9fe3d4b8f153","depends":["async-2.2.4-2107e60f1bee7c70ffed77e551ffc7db01e350edd8784cc9493cc782305122d0","attoparsec-0.14.4-5061b5f729de9f72f69961345d54e0249a28df7c232bb9cf2b0525b6f17a253a","base-4.18.2.0","bytestring-0.11.5.3","conduit-1.3.5-96fa916ebd7a150aa66076e6ed1e4a9d7982e51658f9fd750ad31ce33c46afd7","directory-1.3.8.1","filepath-1.4.200.1","network-3.1.4.0-9d41c9df77e8d21da5aaf51c19540d3c0fc11e5e2c2940bea5411915b8a462ff","primitive-0.9.0.0-a6aa61bd9fff8d6cfd4880894dd85d8e644fbcf178b2bff38f87569871ea4a0d","process-1.6.17.0","resourcet-1.3.0-0f210c6e8ffe9f595ad8fd1a6cf6726e42a6695abb7febee22452f40436a2bc5","stm-2.5.1.0","streaming-commons-0.2.2.6-9fa4239301ef39252b6218423c0a2438611fe43c2ddbebd4f8953d4455c07935","text-2.0.2","transformers-0.6.1.0","typed-process-0.2.11.1-4907353577cf7b0488b9e45d5074486e7c2bbc62c713aeaa26212d7c9d609d10","unliftio-core-0.2.1.0-1e6dce1dfe73ef335e0615b0af7f06b171c3572cf7a04fe671b6cec407b73dee"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"constraints-0.14-ab15a9f94938365a9f7a935af490e603978d84c5e110ef254a28de6613181c00","pkg-name":"constraints","pkg-version":"0.14","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"0af61e4b5f982bd0113640692c409e6344e7b3fe3690d51212a4a6fa84d02872","pkg-src-sha256":"b809322abced0f6b6bf4ceed9e4e823bfdeda808664563b860add1dff3cdc4a5","depends":["base-4.18.2.0","binary-0.8.9.1","boring-0.2.1-9a8dc8e41ea918a09754ff07614d4843b0ebe75d8757fd3273e17938f5bf6233","deepseq-1.4.8.1","ghc-prim-0.10.0","hashable-1.4.3.0-17b447e0ce504d4e093d6bf5a9838da3805c7caa5d16355da40827d004febbc8","mtl-2.3.1","transformers-0.6.1.0","type-equality-1-0b6d3f1475843f8a2ec92f8308f7e4e437169ac42b8e9e6533f304adcd6f533e"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"containers-0.6.7","pkg-name":"containers","pkg-version":"0.6.7","depends":["array-0.5.6.0","base-4.18.2.0","deepseq-1.4.8.1","template-haskell-2.20.0.0"]},{"type":"configured","id":"contiguous-0.6.4.2-05fdf6e288b8c7809eb95c94784c40e7f5746e0c73b7ad5b8a9f9a3c7449d34f","pkg-name":"contiguous","pkg-version":"0.6.4.2","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"5b9908787d229f98e80c03030439697863aaf7c42a943bfb07a4481d191e3839","pkg-src-sha256":"a8ead64063b68e5a0bf35b8b51f829de4f7815ab5cb380be58433e115b86c02b","depends":["base-4.18.2.0","deepseq-1.4.8.1","primitive-0.9.0.0-a6aa61bd9fff8d6cfd4880894dd85d8e644fbcf178b2bff38f87569871ea4a0d","primitive-unlifted-2.1.0.0-aea76574320ac1dea77e342956c3de02d6d7ed0b25f80413b31e3a4622eea123","run-st-0.1.3.3-af1ad044a973fec4afa0830cc37bb6f0f7961cd9e6ffb5b32198ce4b6d73c331"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"contravariant-1.5.5-45cb856efb41788f255562487551496b619a1cf555a23fc4a29495fda3e0c50f","pkg-name":"contravariant","pkg-version":"1.5.5","flags":{"semigroups":true,"statevar":true,"tagged":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"470ed0e040e879e2da4af1b2c8f94e199f6135852a8107858d5ae0a95365835f","pkg-src-sha256":"062fd66580d7aad0b5ba93e644ffa7feee69276ef50f20d4ed9f1deb7642dffa","depends":["StateVar-1.2.2-ad33ce876594474d931417853bfd72c6eb94d534a6634dcbf0af13ec95c0e031","base-4.18.2.0","transformers-0.6.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"cookie-0.4.6-0f17f671a430f9d3670a38aa989d096c8a941ff590a1a1a5bc4f595def792f73","pkg-name":"cookie","pkg-version":"0.4.6","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"00f3a7d5604a3ccbfe89b9c52f8eb1edea753dc273d015333895118f32683ecd","pkg-src-sha256":"8c41a956c32b9733d525a53d43b0338a236a34d36658ecc4364c8249a6664baa","depends":["base-4.18.2.0","bytestring-0.11.5.3","data-default-class-0.1.2.0-4350681fcf6087f7ee4836ea8af486e6eeb8f64bb56f88dbd081081499b0bef6","deepseq-1.4.8.1","text-2.0.2","time-1.12.2"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"crypto-api-0.13.3-7a787ea36d9a45cc1748699175ede37f55426b32db3712140ca048f1a888c44f","pkg-name":"crypto-api","pkg-version":"0.13.3","flags":{"all_cpolys":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"e572c0cdc58ba6773ea200ea5261d6bf5fc116d910b52cf1c671d85b940ed6fc","pkg-src-sha256":"298a9ea7ce97c8ccf4bfe46d4864092c3a007a56bede73560070db3bf1ac7aa5","components":{"lib":{"depends":["base-4.18.2.0","bytestring-0.11.5.3","cereal-0.5.8.3-930e90604013ce2a32c6d28d3567d1d966e50eb1bf0c18108838f2b4ff0d64ca","entropy-0.4.1.10-8c6fb48b38b19d07f9b370b6707c9d29f3ebf9f4746fb1c84bdfc52bb55247e8","tagged-0.8.8-5d06ce789c37adf39496775b08f7d82bb9509e4c2a3f973b0c868e35bca55ad5","transformers-0.6.1.0"],"exe-depends":[]}}},{"type":"configured","id":"crypto-pubkey-types-0.4.3-0e51728f266377e9408460fc3416717740bf7a0fd1ea1d3d056abfa0f9de4241","pkg-name":"crypto-pubkey-types","pkg-version":"0.4.3","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"9bcf9ec7045f1043edac2b8331d9120bc055083578dbd953a3cccfc7452d9e8c","pkg-src-sha256":"7ed9f52281ec4e34021a91818fe45288e33d65bff937f60334a3f45be5a71c60","components":{"lib":{"depends":["asn1-encoding-0.9.6-9bf64732d7af18045ee22a12f781934262d76015cf823acd133e41c1341a5fb9","asn1-types-0.3.4-09d5674972306ee58c9f15c425744939cc04dad257e3b9dd8f0168fbdc38ab70","base-4.18.2.0"],"exe-depends":[]}}},{"type":"configured","id":"cryptohash-md5-0.11.101.0-3dd4c39d92ff47630ac61716ac3e4f1bd76b570bf3eb70cf3c6a25610e31a06c","pkg-name":"cryptohash-md5","pkg-version":"0.11.101.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"71a6e856a4ce0b844a27eb4ba58e214e4263ffbde9c8f406eed3f9a43ad8efec","pkg-src-sha256":"3b08db0ae39df2b44e83053ad30d7546a4c6200a852c22a240a7e03ae1080f05","depends":["base-4.18.2.0","bytestring-0.11.5.3"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"cryptohash-sha1-0.11.101.0-a3ef13c78463fdd04d9d6245ad7391e038dbf79d9c19ec5ab64f9b19a6fb91a8","pkg-name":"cryptohash-sha1","pkg-version":"0.11.101.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"bc5d3373ed5bbfd34b9deea62dc3b2ba21dde5b89e41d2a2399de7562543c621","pkg-src-sha256":"a4042c97ad02eb68e766577ca35c01970c33e96cfd74ccb4dd403e3476a23241","depends":["base-4.18.2.0","bytestring-0.11.5.3"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"cryptohash-sha256-0.11.102.1-fcfb37d142b9653401581f09c5dcc32f0ef1d86e4c59d0d3f29420dde251f653","pkg-name":"cryptohash-sha256","pkg-version":"0.11.102.1","flags":{"exe":false,"use-cbits":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"03db065161987f614a3a2bbcd16264f78e47efe231fb5bd161be2043eaf20488","pkg-src-sha256":"73a7dc7163871a80837495039a099967b11f5c4fe70a118277842f7a713c6bf6","depends":["base-4.18.2.0","bytestring-0.11.5.3"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"crypton-0.34-c8d7db2766b56c26f144f8f589058be74cfcc7e68ff2d08f8f41d2ef1a1fa0e8","pkg-name":"crypton","pkg-version":"0.34","flags":{"check_alignment":false,"integer-gmp":true,"old_toolchain_inliner":false,"support_aesni":true,"support_deepseq":true,"support_pclmuldq":true,"support_rdrand":true,"support_sse":false,"use_target_attributes":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"9e4b50d79d1fba681befa08151db7223d2b4bb72564853e8530e614105d53a1a","pkg-src-sha256":"4444846924ca55615fce104913a5a68675a180cfeadc350ab2b124fba1bc1ed6","depends":["base-4.18.2.0","basement-0.0.16-2ba9d181df7bdd547d6fedd5acdec581f03e379e22b0e08ff998fb0462257d08","bytestring-0.11.5.3","deepseq-1.4.8.1","ghc-prim-0.10.0","integer-gmp-1.1","memory-0.18.0-273ad672f1703dee0dfe07994633c93d17f815a149738659ef6afa30cbe4f6a8"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"crypton-connection-0.3.2-804034b7a3e50ed75e1849613e844c1579d8bd18848efe958529bc613747e852","pkg-name":"crypton-connection","pkg-version":"0.3.2","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"c7937edc25ab022bcf167703f2ec5ab73b62908e545bb587d2aa42b33cd6f6cc","pkg-src-sha256":"208be23bc910f8e5f9431995b9c011ed376bb947d79f74c8f51a5e4ecd9e991e","depends":["base-4.18.2.0","basement-0.0.16-2ba9d181df7bdd547d6fedd5acdec581f03e379e22b0e08ff998fb0462257d08","bytestring-0.11.5.3","containers-0.6.7","crypton-x509-1.7.6-ace8f9d140333c88f85ccfc3589bf27f34ff44a133899eca8703ad0a2550cbd2","crypton-x509-store-1.6.9-a22fb54b4d19ed5d96223b9252ac458efdc316468954bf7427b768e536d62b27","crypton-x509-system-1.6.7-4263b9110e48de6418ac901ce9fe1729cf296cecbfa131cfcac7f4c1050d1761","crypton-x509-validation-1.6.12-7d625ee1af564079d6fbb1cad937bb153313fe0a40e0d69ba93055d71efd6686","data-default-class-0.1.2.0-4350681fcf6087f7ee4836ea8af486e6eeb8f64bb56f88dbd081081499b0bef6","network-3.1.4.0-9d41c9df77e8d21da5aaf51c19540d3c0fc11e5e2c2940bea5411915b8a462ff","socks-0.6.1-6b9e88c9a8f5eb4e1297331a35574d1481e0bfa053fb8eb954e442854a2c7b98","tls-2.0.1-b47e0fd7dac1558b195f1752f4ccbcc31081e04ec060bb63474359a715d7657d"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"crypton-x509-1.7.6-ace8f9d140333c88f85ccfc3589bf27f34ff44a133899eca8703ad0a2550cbd2","pkg-name":"crypton-x509","pkg-version":"1.7.6","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"c567657a705b6d6521f9dd2de999bf530d618ec00f3b939df76a41fb0fe94281","pkg-src-sha256":"ebb74aca2d00261e2fb4927d211ba1a174e190e5257f309e190f019727f8caff","depends":["asn1-encoding-0.9.6-9bf64732d7af18045ee22a12f781934262d76015cf823acd133e41c1341a5fb9","asn1-parse-0.9.5-2a949cca1e96d33a3cea78e8f484af2b63e4592b43690a951c967874e85dcf09","asn1-types-0.3.4-09d5674972306ee58c9f15c425744939cc04dad257e3b9dd8f0168fbdc38ab70","base-4.18.2.0","bytestring-0.11.5.3","containers-0.6.7","crypton-0.34-c8d7db2766b56c26f144f8f589058be74cfcc7e68ff2d08f8f41d2ef1a1fa0e8","hourglass-0.2.12-ff77f9ff09de83d24a0ee40cfa0cec90de8666d5167809a314d26ad4a7544cdd","memory-0.18.0-273ad672f1703dee0dfe07994633c93d17f815a149738659ef6afa30cbe4f6a8","pem-0.2.4-fc2f4716715ce340b3916ffcbdd4e6509f0d10442951de390cdd9d623db1033a","transformers-0.6.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"crypton-x509-store-1.6.9-a22fb54b4d19ed5d96223b9252ac458efdc316468954bf7427b768e536d62b27","pkg-name":"crypton-x509-store","pkg-version":"1.6.9","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"422b9b9f87a7382c66385d047615b16fc86a68c08ea22b1e0117c143a2d44050","pkg-src-sha256":"3e6218af12e039cc291d19792db044df1647b5cf0bbc60b909a027e7595a256f","depends":["asn1-encoding-0.9.6-9bf64732d7af18045ee22a12f781934262d76015cf823acd133e41c1341a5fb9","asn1-types-0.3.4-09d5674972306ee58c9f15c425744939cc04dad257e3b9dd8f0168fbdc38ab70","base-4.18.2.0","bytestring-0.11.5.3","containers-0.6.7","crypton-0.34-c8d7db2766b56c26f144f8f589058be74cfcc7e68ff2d08f8f41d2ef1a1fa0e8","crypton-x509-1.7.6-ace8f9d140333c88f85ccfc3589bf27f34ff44a133899eca8703ad0a2550cbd2","directory-1.3.8.1","filepath-1.4.200.1","mtl-2.3.1","pem-0.2.4-fc2f4716715ce340b3916ffcbdd4e6509f0d10442951de390cdd9d623db1033a"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"crypton-x509-system-1.6.7-4263b9110e48de6418ac901ce9fe1729cf296cecbfa131cfcac7f4c1050d1761","pkg-name":"crypton-x509-system","pkg-version":"1.6.7","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"023ed573d82983bc473a37a89e0434a085b413be9f68d07e085361056afd4637","pkg-src-sha256":"a436261e5f5e83d85080f57a5509c8224c9e75a6e56d0c43a7d2967052b634ca","depends":["base-4.18.2.0","bytestring-0.11.5.3","containers-0.6.7","crypton-x509-1.7.6-ace8f9d140333c88f85ccfc3589bf27f34ff44a133899eca8703ad0a2550cbd2","crypton-x509-store-1.6.9-a22fb54b4d19ed5d96223b9252ac458efdc316468954bf7427b768e536d62b27","directory-1.3.8.1","filepath-1.4.200.1","mtl-2.3.1","pem-0.2.4-fc2f4716715ce340b3916ffcbdd4e6509f0d10442951de390cdd9d623db1033a","process-1.6.17.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"crypton-x509-validation-1.6.12-7d625ee1af564079d6fbb1cad937bb153313fe0a40e0d69ba93055d71efd6686","pkg-name":"crypton-x509-validation","pkg-version":"1.6.12","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"85989721b64be4b90de9f66ef641c26f57575cffed1a50d707065fb60176f386","pkg-src-sha256":"0e60b7e237a4fd5e7e6e7200018c7947314292ef63751cbb51877836ebe650f6","depends":["asn1-encoding-0.9.6-9bf64732d7af18045ee22a12f781934262d76015cf823acd133e41c1341a5fb9","asn1-types-0.3.4-09d5674972306ee58c9f15c425744939cc04dad257e3b9dd8f0168fbdc38ab70","base-4.18.2.0","bytestring-0.11.5.3","containers-0.6.7","crypton-0.34-c8d7db2766b56c26f144f8f589058be74cfcc7e68ff2d08f8f41d2ef1a1fa0e8","crypton-x509-1.7.6-ace8f9d140333c88f85ccfc3589bf27f34ff44a133899eca8703ad0a2550cbd2","crypton-x509-store-1.6.9-a22fb54b4d19ed5d96223b9252ac458efdc316468954bf7427b768e536d62b27","data-default-class-0.1.2.0-4350681fcf6087f7ee4836ea8af486e6eeb8f64bb56f88dbd081081499b0bef6","hourglass-0.2.12-ff77f9ff09de83d24a0ee40cfa0cec90de8666d5167809a314d26ad4a7544cdd","memory-0.18.0-273ad672f1703dee0dfe07994633c93d17f815a149738659ef6afa30cbe4f6a8","mtl-2.3.1","pem-0.2.4-fc2f4716715ce340b3916ffcbdd4e6509f0d10442951de390cdd9d623db1033a"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"cryptonite-0.30-a4317e7e07f60749ecfe221f105aa6192fceaa0071302418f9317d0ad2cd4d81","pkg-name":"cryptonite","pkg-version":"0.30","flags":{"check_alignment":false,"integer-gmp":true,"old_toolchain_inliner":false,"support_aesni":true,"support_deepseq":true,"support_pclmuldq":false,"support_rdrand":true,"support_sse":false,"use_target_attributes":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"12c85dea7be63e5ad90bcb487eb3846bf3c413347f94336fa1dede7b28f9936a","pkg-src-sha256":"56099c8a8aa01d2ee914b670c97c1f818186dbb886e2025b73d9c2afe3496b1d","depends":["base-4.18.2.0","basement-0.0.16-2ba9d181df7bdd547d6fedd5acdec581f03e379e22b0e08ff998fb0462257d08","bytestring-0.11.5.3","deepseq-1.4.8.1","ghc-prim-0.10.0","integer-gmp-1.1","memory-0.18.0-273ad672f1703dee0dfe07994633c93d17f815a149738659ef6afa30cbe4f6a8"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"cryptonite-conduit-0.2.2-dc6649104789f26beacba5c896f4efecfdc457327c1993ac619628030998d8a7","pkg-name":"cryptonite-conduit","pkg-version":"0.2.2","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"bfbae677a44f3a5cf3bf7f36271682979a402825f3d1e8767cfd62f2ddb702c2","pkg-src-sha256":"705d69ab3f79b7b8810c7b9e7da81a1c6686b6a4323b1e78150576a25a658dae","depends":["base-4.18.2.0","bytestring-0.11.5.3","conduit-1.3.5-96fa916ebd7a150aa66076e6ed1e4a9d7982e51658f9fd750ad31ce33c46afd7","conduit-extra-1.3.6-a9b74b7c97cb9e39e8f4262bfd1952b446fe950cb07e127ba073c16301e30755","cryptonite-0.30-a4317e7e07f60749ecfe221f105aa6192fceaa0071302418f9317d0ad2cd4d81","exceptions-0.10.7","memory-0.18.0-273ad672f1703dee0dfe07994633c93d17f815a149738659ef6afa30cbe4f6a8","resourcet-1.3.0-0f210c6e8ffe9f595ad8fd1a6cf6726e42a6695abb7febee22452f40436a2bc5","transformers-0.6.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"data-default-0.7.1.1-fb1a461d5390de89b4af18b225f51df41ca3a345d820ee4756653e4cd2f3cd8e","pkg-name":"data-default","pkg-version":"0.7.1.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"2804e8d14f521a1edee88b68b66347448e7f3b685868290fdc55930e4471f5a9","pkg-src-sha256":"b0f95d279cd75cacaa8152a01590dc3460f7134f6840b37052abb3ba3cb2a511","components":{"lib":{"depends":["base-4.18.2.0","data-default-class-0.1.2.0-4350681fcf6087f7ee4836ea8af486e6eeb8f64bb56f88dbd081081499b0bef6","data-default-instances-containers-0.0.1-3b2bd3972f1fe587fa0e2b950640dd67b79a64674b8dbf89500902c3c9c31e3f","data-default-instances-dlist-0.0.1-834ba711e749a3311d3bc2d831127402fe965724977bf227862f4c25e9a2e22e","data-default-instances-old-locale-0.0.1-7212215bbe1bf7a79167a625399e4c186658fb645ff6a90daef2696377a0f5af"],"exe-depends":[]}}},{"type":"configured","id":"data-default-class-0.1.2.0-4350681fcf6087f7ee4836ea8af486e6eeb8f64bb56f88dbd081081499b0bef6","pkg-name":"data-default-class","pkg-version":"0.1.2.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"63e62120b7efd733a5a17cf59ceb43268e9a929c748127172d7d42f4a336e327","pkg-src-sha256":"4f01b423f000c3e069aaf52a348564a6536797f31498bb85c3db4bd2d0973e56","components":{"lib":{"depends":["base-4.18.2.0"],"exe-depends":[]}}},{"type":"configured","id":"data-default-instances-containers-0.0.1-3b2bd3972f1fe587fa0e2b950640dd67b79a64674b8dbf89500902c3c9c31e3f","pkg-name":"data-default-instances-containers","pkg-version":"0.0.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"6e1f4b28028a3bc455aaf4b5a9104b71ea72cff78b1b8041863df7afd1a8deb3","pkg-src-sha256":"a55e07af005c9815d82f3fc95e125db82994377c9f4a769428878701d4ec081a","components":{"lib":{"depends":["base-4.18.2.0","containers-0.6.7","data-default-class-0.1.2.0-4350681fcf6087f7ee4836ea8af486e6eeb8f64bb56f88dbd081081499b0bef6"],"exe-depends":[]}}},{"type":"configured","id":"data-default-instances-dlist-0.0.1-834ba711e749a3311d3bc2d831127402fe965724977bf227862f4c25e9a2e22e","pkg-name":"data-default-instances-dlist","pkg-version":"0.0.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"4286abacbb256c392907701be16986a6e07f2beaf2778e7bd925465655d9e301","pkg-src-sha256":"7d683711cbf08abd7adcd5ac2be825381308d220397315a5570fe61b719b5959","components":{"lib":{"depends":["base-4.18.2.0","data-default-class-0.1.2.0-4350681fcf6087f7ee4836ea8af486e6eeb8f64bb56f88dbd081081499b0bef6","dlist-1.0-1ec91dd3ad8405ed390138bce1c7d55220d4758eda9fb3ad6fbb8b1ee6dc0c94"],"exe-depends":[]}}},{"type":"configured","id":"data-default-instances-old-locale-0.0.1-7212215bbe1bf7a79167a625399e4c186658fb645ff6a90daef2696377a0f5af","pkg-name":"data-default-instances-old-locale","pkg-version":"0.0.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"d4a757f68f0f83531fcb34a4525fe6769c54a45182e28ffdfff19c2b0ace42fb","pkg-src-sha256":"60d3b02922958c4908d7bf2b24ddf61511665745f784227d206745784b0c0802","components":{"lib":{"depends":["base-4.18.2.0","data-default-class-0.1.2.0-4350681fcf6087f7ee4836ea8af486e6eeb8f64bb56f88dbd081081499b0bef6","old-locale-1.0.0.7-682418540979bf75be932863a87a0db4ab12d3f7ec5faaeba30e4175347cd126"],"exe-depends":[]}}},{"type":"configured","id":"data-fix-0.3.2-5add57223d3c0b4ba49ecf522767d4a71475f5e86cefa1a15e9af611e468b46f","pkg-name":"data-fix","pkg-version":"0.3.2","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"cd7d6ff8b68aca3b51d8116870fc8ccdbc557989562cd3d5c941e4f0b7bc5af1","pkg-src-sha256":"3a172d3bc0639c327345e965f9d9023e099425814b28dcdb7b60ff66d66219cc","depends":["base-4.18.2.0","deepseq-1.4.8.1","hashable-1.4.3.0-17b447e0ce504d4e093d6bf5a9838da3805c7caa5d16355da40827d004febbc8"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"dec-0.0.5-df077fdbf908bb3fdbc8e113d90c87e216153ded7ddd81017ddf01027a3a495b","pkg-name":"dec","pkg-version":"0.0.5","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"1044421ac555d062a843865b06941b8c744261e122930f680524c0bd2095b6ed","pkg-src-sha256":"e18043c7c7e68168489f164921a02efede0c0175a5012ed5451ec2242338df88","depends":["base-4.18.2.0","boring-0.2.1-9a8dc8e41ea918a09754ff07614d4843b0ebe75d8757fd3273e17938f5bf6233"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"deepseq-1.4.8.1","pkg-name":"deepseq","pkg-version":"1.4.8.1","depends":["array-0.5.6.0","base-4.18.2.0","ghc-prim-0.10.0"]},{"type":"configured","id":"deriving-aeson-0.2.9-f86850669d5d4b90b08e438464fff4f49c8d0959ce8a2fd31d585b5dec88f689","pkg-name":"deriving-aeson","pkg-version":"0.2.9","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"957bd6da5a4f40f74ea8c485084c3e48dd9278073f95809f068b02bdcf9c3892","pkg-src-sha256":"c0b2975df7ed5ba668982ba442318c36adfe8be3c32dcf136c13bf9662261833","depends":["aeson-2.2.1.0-2595d249b227784b9febcd5a91568775f66fd262ac45c82c44f7b4a55e9d4c27","base-4.18.2.0"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"directory-1.3.8.1","pkg-name":"directory","pkg-version":"1.3.8.1","depends":["base-4.18.2.0","filepath-1.4.200.1","time-1.12.2","unix-2.8.4.0"]},{"type":"configured","id":"distributive-0.6.2.1-70a2f4c4bffafd7749c1d755f27db885f954a9d9be1cd7db8a6e99887121ec8c","pkg-name":"distributive","pkg-version":"0.6.2.1","flags":{"semigroups":true,"tagged":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"0f99f5541cca04acf89b64432b03422b6408e830a8dff30e6c4334ef1a48680c","pkg-src-sha256":"d7351392e078f58caa46630a4b9c643e1e2e9dddee45848c5c8358e7b1316b91","depends":["base-4.18.2.0","base-orphans-0.9.1-61d128d6a3318593c785a97751f2418cc86b42b03e2b46ed92e9b27fc5da689c","tagged-0.8.8-5d06ce789c37adf39496775b08f7d82bb9509e4c2a3f973b0c868e35bca55ad5","transformers-0.6.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"dlist-1.0-1ec91dd3ad8405ed390138bce1c7d55220d4758eda9fb3ad6fbb8b1ee6dc0c94","pkg-name":"dlist","pkg-version":"1.0","flags":{"werror":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"55ff69d20ce638fc7727342ee67f2f868da61d3dcf3763f790bf9aa0b145e568","pkg-src-sha256":"173d637328bb173fcc365f30d29ff4a94292a1e0e5558aeb3dfc11de81510115","depends":["base-4.18.2.0","deepseq-1.4.8.1"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"easy-file-0.2.5-5fa303965280a30fe8c9bcd5e7d5323c903dc206d322c6c1f552800a235b3607","pkg-name":"easy-file","pkg-version":"0.2.5","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"1c93b6bd30cac2ccad359d1e3e50d71b77f599730407a7f3481c8c67a856fb6b","pkg-src-sha256":"ee0fa0914b3bb3662838a689d7cd23a2785ccbc29def366664f994bc524ff2bb","depends":["base-4.18.2.0","directory-1.3.8.1","filepath-1.4.200.1","time-1.12.2","unix-2.8.4.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"effectful-2.3.0.0-52623768742e178fa9448f87d55f19ed0d8237dc80135fee9505d1c022c6ed6f","pkg-name":"effectful","pkg-version":"2.3.0.0","flags":{"benchmark-foreign-libraries":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"7d9b9913f29c2ab640e449bcd1d196ac0d0f74b1e2c8c7ddec459353d75976db","pkg-src-sha256":"6742be657fc65af9aa4f0cedfc7e90b76fba9cb5c736494075182a153244d90f","depends":["async-2.2.4-2107e60f1bee7c70ffed77e551ffc7db01e350edd8784cc9493cc782305122d0","base-4.18.2.0","bytestring-0.11.5.3","directory-1.3.8.1","effectful-core-2.3.0.1-011d84ab0bc8bb2010bac83565500e3039592cab57d902e9a2a502684b92d90f","process-1.6.17.0","stm-2.5.1.0","time-1.12.2","unliftio-0.2.25.0-494677154ed69a76841d775b50166f52e9d0797a41ece2fd3d94e08aebf372f3"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"effectful-core-2.3.0.1-011d84ab0bc8bb2010bac83565500e3039592cab57d902e9a2a502684b92d90f","pkg-name":"effectful-core","pkg-version":"2.3.0.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"377b9057b43d65d100f36ceb22f2d675e927fe47d678a51ae7dea6998aa9ebf9","pkg-src-sha256":"3cb1e1e12542e15c03856be8865111e2f71f40d9b108ad7de27612efa52e739b","depends":["base-4.18.2.0","containers-0.6.7","exceptions-0.10.7","monad-control-1.0.3.1-2bf3452c923aa94707518b6d970f4377279fd8c4ccca1256725eef18b6097440","primitive-0.9.0.0-a6aa61bd9fff8d6cfd4880894dd85d8e644fbcf178b2bff38f87569871ea4a0d","transformers-base-0.4.6-91c64a4b19c3f5f9f196345e9032803d52322bd0857ba94ea6c4260a27a2ff07","unliftio-core-0.2.1.0-1e6dce1dfe73ef335e0615b0af7f06b171c3572cf7a04fe671b6cec407b73dee"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"either-5.0.2-d8d7bb84305283af81161a95ec2aebe67483cc07c71e171fc392eccfafdfb663","pkg-name":"either","pkg-version":"5.0.2","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"fb3d130c37df6b4c7aa5f093e83bb4527fe13d8a72f94bce3d6ab00764ee59f0","pkg-src-sha256":"bfa45b967fd77b1c7c952e156377441e3c42b6dc873ab1f06a7421a3222287be","depends":["base-4.18.2.0","bifunctors-5.6.1-3bfddc97d0532e0f4bedd1f64454f96744d2fe805f93a5f9e443c2c5e1035ff1","mtl-2.3.1","profunctors-5.6.2-8b084a9552445e5776f01a7b42f1722ce1ecf20cf9a8e839007b9baea33b9fa4","semigroupoids-6.0.0.1-e83bc6491c75c3522014917ab4d3335127e2ee3b4989f0a49f9791f8bead28c6"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"emojis-0.1.3-f8293844dfb248bd5ce62ece3582fb79ba4132f2e1ac9c78fac78b46fb1d71d5","pkg-name":"emojis","pkg-version":"0.1.3","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"75a6953d8ad064415cb5aac2b52040a1e2bcf7a923d99055038f17219d4b8852","pkg-src-sha256":"817fc6c4d0040418d981b82349e389566db6ce0e0337dc70fe5d1483e1d91af8","depends":["base-4.18.2.0","containers-0.6.7","text-2.0.2"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"entropy-0.4.1.10-8c6fb48b38b19d07f9b370b6707c9d29f3ebf9f4746fb1c84bdfc52bb55247e8","pkg-name":"entropy","pkg-version":"0.4.1.10","flags":{"donotgetentropy":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"82bd7b600fb8df540dd292ed91dc781f4523eecef3bb588b14787b4851722cb1","pkg-src-sha256":"85ac1d53f1d1c095aedd23fdb20c8e3ada04a7fd8aa6d7e6445ae6a59a277de5","components":{"lib":{"depends":["base-4.18.2.0","bytestring-0.11.5.3","unix-2.8.4.0"],"exe-depends":[]},"setup":{"depends":["Cabal-3.10.1.0","base-4.18.2.0","directory-1.3.8.1","filepath-1.4.200.1","process-1.6.17.0"],"exe-depends":[]}}},{"type":"configured","id":"envparse-0.5.0-c225ff1d783744cd1f9863f791cab7f87b9c995b2fca94b0138f73571480411e","pkg-name":"envparse","pkg-version":"0.5.0","flags":{},"style":"global","pkg-src":{"type":"source-repo","source-repo":{"type":"git","location":"https://github.com/supki/envparse","tag":"503a699"}},"pkg-src-sha256":"3a8c0b34bb5290d1fa7d691c2e7d28c350973a5f6db8388b527a82e39ead8d3f","depends":["base-4.18.2.0","containers-0.6.7"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"erf-2.0.0.0-5e00dd8595b2d92c48d9f543d9269f193e14d19af8d53cfaa38744b61539cdae","pkg-name":"erf","pkg-version":"2.0.0.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"11c5d3747d17b589009cbe9656ca792e4b5b2560d4aa44f6f1e80044794b1a8b","pkg-src-sha256":"24f0b79c7e1d25cb2cd44c2258d7a464bf6db8079775b50b60b54a254616b337","components":{"lib":{"depends":["base-4.18.2.0"],"exe-depends":[]}}},{"type":"pre-existing","id":"exceptions-0.10.7","pkg-name":"exceptions","pkg-version":"0.10.7","depends":["base-4.18.2.0","mtl-2.3.1","stm-2.5.1.0","template-haskell-2.20.0.0","transformers-0.6.1.0"]},{"type":"configured","id":"extensible-exceptions-0.1.1.4-9ada676787e2c2f8f4d2dc78ab24d80159488100b1a4433d25572f0c9366f79f","pkg-name":"extensible-exceptions","pkg-version":"0.1.1.4","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"eb5fe684a7ffe8d1ed2ed6cdaec7dfb29efc780811ea7158a64edc2abc516f47","pkg-src-sha256":"6ce5e8801760385a408dab71b53550f87629e661b260bdc2cd41c6a439b6e388","components":{"lib":{"depends":["base-4.18.2.0"],"exe-depends":[]}}},{"type":"configured","id":"extra-1.7.14-f1add2fd140928c4ff98846cf958be82c050721a89872d0804fd7c0b0133cad4","pkg-name":"extra","pkg-version":"1.7.14","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"e3d3ce1dc7746b1132930e48c59fb5e8c51a09e92e0c031316be031067a273fb","pkg-src-sha256":"b6a909f8f0e4b8076a1653b4d34815a782f0a8c1e83d5267f4d00496471ef567","depends":["base-4.18.2.0","clock-0.8.4-ad97d5c0d9c88bea3fcc07810f4bfa48bfd5e30af51e35ab1d3d70d0ad238573","directory-1.3.8.1","filepath-1.4.200.1","process-1.6.17.0","time-1.12.2","unix-2.8.4.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"fast-logger-3.2.2-f2b66566923a1fa76e5c48eecb73e2ef0a379b38ce325b13b8e81e8022003d26","pkg-name":"fast-logger","pkg-version":"3.2.2","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"9b17bc98ed0dc8f29f855560ac9b0dc6791392e6de36f9a6060dd201c3f2aed1","pkg-src-sha256":"575bbe9fc2d130fe665bb6d135349200b4825fcb60b59533f89c2a8c9844afdd","depends":["array-0.5.6.0","auto-update-0.1.6-3f7af882e90ee16fd9e6ebf1ca739ba4ad18afcdae045a3375fe3adefea17239","base-4.18.2.0","bytestring-0.11.5.3","directory-1.3.8.1","easy-file-0.2.5-5fa303965280a30fe8c9bcd5e7d5323c903dc206d322c6c1f552800a235b3607","filepath-1.4.200.1","stm-2.5.1.0","text-2.0.2","unix-compat-0.7.1-d99eb5acf38b31b458b2a5f48db2ff44a4954123ddfa4c9c3d585ea4ef03206d","unix-time-0.4.12-45eb997f2b10c03cbe95532ca065341d046b4309aac2f8aad0358668133acf67"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"file-embed-0.0.16.0-d63ac8c371cd44fa36b87af3f4672e6a9da8a4dd85e53dc2781049b6fa1aeeda","pkg-name":"file-embed","pkg-version":"0.0.16.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"2e8983240c1faae020b4acef6d30f0281f5ec87c2f38736dc1dc5456355e22a5","pkg-src-sha256":"5f18672eff936355557cdd163905451205d7ee22742edac313dd27cf42a3f415","depends":["base-4.18.2.0","bytestring-0.11.5.3","directory-1.3.8.1","filepath-1.4.200.1","template-haskell-2.20.0.0"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"filepath-1.4.200.1","pkg-name":"filepath","pkg-version":"1.4.200.1","depends":["base-4.18.2.0","bytestring-0.11.5.3","deepseq-1.4.8.1","exceptions-0.10.7","template-haskell-2.20.0.0"]},{"type":"configured","id":"flora-1.0.15-inplace","pkg-name":"flora","pkg-version":"1.0.15","flags":{"prod":false},"style":"local","pkg-src":{"type":"local","path":"/home/hecate/Projects/Flora/1-flora-server/."},"dist-dir":"/home/hecate/Projects/Flora/1-flora-server/dist-newstyle/build/x86_64-linux/ghc-9.6.4/flora-1.0.15","build-info":"/home/hecate/Projects/Flora/1-flora-server/dist-newstyle/build/x86_64-linux/ghc-9.6.4/flora-1.0.15/build-info.json","depends":["Cabal-syntax-3.10.1.0","JuicyPixels-3.3.8-295ba873739530be2ad2e0f5ef3880f23fb240b49297676915db7967d6106794","aeson-2.2.1.0-2595d249b227784b9febcd5a91568775f66fd262ac45c82c44f7b4a55e9d4c27","base-4.18.2.0","base16-bytestring-1.0.2.0-b470eb3428775005093b18dbb34dd687b575cadcc3d709cf63c09611d917e654","base64-1.0-dd5d13a79aacb87c11501514ee42d94f31fb8135c9427a7dddef0b4e4e537062","blaze-builder-0.4.2.3-60676f992d653075aeba6aad80b2dd0b054859608a5712ecfc9d4a4968aefdb8","bytestring-0.11.5.3","colourista-0.1.0.2-f2248bbbb4ee79cbf9fe81e61effe11fd685506de3685fc7950c57e7408058a6","containers-0.6.7","cryptohash-md5-0.11.101.0-3dd4c39d92ff47630ac61716ac3e4f1bd76b570bf3eb70cf3c6a25610e31a06c","cryptohash-sha256-0.11.102.1-fcfb37d142b9653401581f09c5dcc32f0ef1d86e4c59d0d3f29420dde251f653","cryptonite-0.30-a4317e7e07f60749ecfe221f105aa6192fceaa0071302418f9317d0ad2cd4d81","cryptonite-conduit-0.2.2-dc6649104789f26beacba5c896f4efecfdc457327c1993ac619628030998d8a7","deepseq-1.4.8.1","deriving-aeson-0.2.9-f86850669d5d4b90b08e438464fff4f49c8d0959ce8a2fd31d585b5dec88f689","directory-1.3.8.1","effectful-core-2.3.0.1-011d84ab0bc8bb2010bac83565500e3039592cab57d902e9a2a502684b92d90f","envparse-0.5.0-c225ff1d783744cd1f9863f791cab7f87b9c995b2fca94b0138f73571480411e","filepath-1.4.200.1","http-api-data-0.6-f8db4c3e7ff814c1476ac3873683211db56d23f0c28cabdd051460114fc3de4f","http-media-0.8.1.1-82ac8def17fc7bb0c409983a665f6b7cccbfddad16ad03396e0ea28fa6b4797e","iso8601-time-0.1.5-613661a1ea46bf04f83cf7f01f86b46eac75038540215814c13f119e8c47a17d","log-base-0.12.0.1-f6c93830f52a9d5925fa4be3f430d1262c4e2bbf3222e6a925872b2eec0a9d75","log-effectful-1.0.0.0-1daa99a173049071f9677770e30ef537619d4b74217444ebd179050ac6230f31","lucid-2.11.20230408-181c7ed44fa9b37af3ac434ed53e16dbe6a7ca9ec7ef1f7e5c921196d628f3c0","memory-0.18.0-273ad672f1703dee0dfe07994633c93d17f815a149738659ef6afa30cbe4f6a8","monad-time-effectful-1.0.0.0-3bcc12595825f15e6c956704de800593d9caa43c86932b7456205b4fcd7a3fee","odd-jobs-0.2.3-2ea7e869e131ba9271dc166fb94494d9c4695adf80a10aeb2c6885388c248e44","openapi3-3.2.4-36a3dd9c34b66f8d7bf989194c80a50284551837b7d8417e8ce95b4a35d15c2e","optics-core-0.4.1.1-f8d9a3ddd3e59e269ad03738aca54bb92446a15ba98a2b4ae8ec19ed7d20df70","pcre2-2.2.1-497aee97a6283223eea2bb30f3bd7127ff8bb3d2b6ece9c4e0a73371dc66b90c","pg-entity-0.0.4.4-c09d4801d2c9b8aac6587451fb3276698aa673bffbbe13e20e92459744a89058","pg-transact-0.3.2.0-154eca34326a8779919f5450f98657e0bdd42098d5eb39bd64fe3ab6b57ef08c","pg-transact-effectful-0.0.1.0-19059a8ff842cc019bf692ea57228ae755836f0ae48aa91885f40683ea8347a6","poolboy-0.2.2.0-2b5751910b4c714d0b69899eea5770ca156a5f1311f953bd68bceb7c3f9f9275","postgresql-simple-0.6.5.1-ec621799555c8b1b15b3683ac92cdc3770e891696c7afc3195aa6f26571cbbe0","pretty-1.1.3.6","qrcode-core-0.9.9-26498b4ed47f926f2f064d25ff1a73747fe531dce4fe1eaf0dd664493c00bbbc","qrcode-juicypixels-0.8.5-6838fee4a1ce854292c21f8a386f97468fe4ea877b3c81266871b5ccf74fbeb5","resource-pool-0.4.0.0-b943f9aab32b14d553510f77b995882007d913763eb4c8a34a077c78a8909098","sel-0.0.1.0-a107cece4307b775602a0ac4fef5e5489f9cf07913069de7b0aebbe27daff576","servant-0.20.1-b63507222e1b19c7b8333551fd2fbdae76248ba97753767f7ab4d32b7816d39d","servant-lucid-0.9.0.6-3245f97c511011e42d95122d5373c12ebeb20de76226f6491768d04935bf6b52","servant-server-0.20-3dbcc60207566a1f80874e61a86b73ab8a41f98f3231692dec244b2ce96f8132","slugify-0.1.0.1-4ab88c5012a98f82389b22741a6da4533ceb4b7336ca607b4e641118933d2d75","souffle-haskell-4.0.0-122eb0210bf095a8300c9247fb7467920a26f76fde9fbfed4d1bae48e6666480","streamly-0.10.1-355a5bd5db83dc8d0325992ae963a6091c0eb61a91ecdda01c0d7d997bd43408","streamly-core-0.2.2-1de2fd5320df2135ec5ee591367a8233ec85c39bfb2366f77b325fca4e8a6657","tar-0.6.1.0-2355dea2b7e5a1fb20c6753c9c6e0e55e2208d19d4f800ee0c38ad10afdd8945","text-2.0.2","text-display-0.0.5.1-ae9f66e9765923d9edec209058cc153706fead0e7c7287c2994a985da1c39623","time-1.12.2","unliftio-0.2.25.0-494677154ed69a76841d775b50166f52e9d0797a41ece2fd3d94e08aebf372f3","utf8-string-1.0.2-5e8d116496349c38d20293f85d47a22c703548b74e7d267d8d6d20ff907c03cd","uuid-1.3.15-413cef239f477249b51ed712d27bea33e15b08237221be1f41f0bc89ce5e1463","vector-0.13.1.0-eb53bdac16f057ad838f4e8cb865b51b400abac71a36dc5bfde93ea1d0859eae","vector-algorithms-0.9.0.1-0d5de6c527fb6ba0e7be854c1685b82a6a99d5798a407e65dc55cac4091e272a","zlib-0.6.3.0-61cb40f46d103a622525dc3a70a9004984ec56d61deea65d2dc01c964606b7e9"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"flora-1.0.15-inplace-flora-cli","pkg-name":"flora","pkg-version":"1.0.15","flags":{"prod":false},"style":"local","pkg-src":{"type":"local","path":"/home/hecate/Projects/Flora/1-flora-server/."},"dist-dir":"/home/hecate/Projects/Flora/1-flora-server/dist-newstyle/build/x86_64-linux/ghc-9.6.4/flora-1.0.15/x/flora-cli","build-info":"/home/hecate/Projects/Flora/1-flora-server/dist-newstyle/build/x86_64-linux/ghc-9.6.4/flora-1.0.15/x/flora-cli/build-info.json","depends":["Cabal-syntax-3.10.1.0","PyF-0.11.2.1-136109de9a2dff073e8ac6c2d415f86bbe2b3b9b72015bfb5fd638fdd22d1843","base-4.18.2.0","bytestring-0.11.5.3","effectful-core-2.3.0.1-011d84ab0bc8bb2010bac83565500e3039592cab57d902e9a2a502684b92d90f","envparse-0.5.0-c225ff1d783744cd1f9863f791cab7f87b9c995b2fca94b0138f73571480411e","filepath-1.4.200.1","flora-1.0.15-inplace","flora-1.0.15-inplace-flora-web","log-base-0.12.0.1-f6c93830f52a9d5925fa4be3f430d1262c4e2bbf3222e6a925872b2eec0a9d75","log-effectful-1.0.0.0-1daa99a173049071f9677770e30ef537619d4b74217444ebd179050ac6230f31","lucid-2.11.20230408-181c7ed44fa9b37af3ac434ed53e16dbe6a7ca9ec7ef1f7e5c921196d628f3c0","monad-time-effectful-1.0.0.0-3bcc12595825f15e6c956704de800593d9caa43c86932b7456205b4fcd7a3fee","optics-core-0.4.1.1-f8d9a3ddd3e59e269ad03738aca54bb92446a15ba98a2b4ae8ec19ed7d20df70","optparse-applicative-0.18.1.0-1de8f12cfc2915bc6d323ba97415a7e0795036a6b613e7301735aedf9d0425be","pg-transact-effectful-0.0.1.0-19059a8ff842cc019bf692ea57228ae755836f0ae48aa91885f40683ea8347a6","sel-0.0.1.0-a107cece4307b775602a0ac4fef5e5489f9cf07913069de7b0aebbe27daff576","text-2.0.2","text-display-0.0.5.1-ae9f66e9765923d9edec209058cc153706fead0e7c7287c2994a985da1c39623","transformers-0.6.1.0","uuid-1.3.15-413cef239f477249b51ed712d27bea33e15b08237221be1f41f0bc89ce5e1463","vector-0.13.1.0-eb53bdac16f057ad838f4e8cb865b51b400abac71a36dc5bfde93ea1d0859eae","zlib-0.6.3.0-61cb40f46d103a622525dc3a70a9004984ec56d61deea65d2dc01c964606b7e9"],"exe-depends":[],"component-name":"exe:flora-cli","bin-file":"/home/hecate/Projects/Flora/1-flora-server/dist-newstyle/build/x86_64-linux/ghc-9.6.4/flora-1.0.15/x/flora-cli/build/flora-cli/flora-cli"},{"type":"configured","id":"flora-1.0.15-inplace-flora-jobs","pkg-name":"flora","pkg-version":"1.0.15","flags":{"prod":false},"style":"local","pkg-src":{"type":"local","path":"/home/hecate/Projects/Flora/1-flora-server/."},"dist-dir":"/home/hecate/Projects/Flora/1-flora-server/dist-newstyle/build/x86_64-linux/ghc-9.6.4/flora-1.0.15/l/flora-jobs","build-info":"/home/hecate/Projects/Flora/1-flora-server/dist-newstyle/build/x86_64-linux/ghc-9.6.4/flora-1.0.15/l/flora-jobs/build-info.json","depends":["Cabal-syntax-3.10.1.0","aeson-2.2.1.0-2595d249b227784b9febcd5a91568775f66fd262ac45c82c44f7b4a55e9d4c27","base-4.18.2.0","bytestring-0.11.5.3","commonmark-0.2.5.1-42b2b423f134ce671347ac1eb3ef3f9f8d898f5b6f290e2c7f708d870c7508f8","commonmark-extensions-0.2.5.2-59454db801b34e805acb6c8d83dde32037a0c2284a4baf2daa746c128a386e1d","containers-0.6.7","effectful-core-2.3.0.1-011d84ab0bc8bb2010bac83565500e3039592cab57d902e9a2a502684b92d90f","flora-1.0.15-inplace","http-client-0.7.16-08ac6af6261aa24f586bbb528e8ea2f0bd2e7510d1883948d770173e7ea8b633","http-media-0.8.1.1-82ac8def17fc7bb0c409983a665f6b7cccbfddad16ad03396e0ea28fa6b4797e","http-types-0.12.4-0f52a9ec33f3c65ef0b77ad8ce14b65f9164f8a761e42800dc9c80ee1768aacc","log-base-0.12.0.1-f6c93830f52a9d5925fa4be3f430d1262c4e2bbf3222e6a925872b2eec0a9d75","log-effectful-1.0.0.0-1daa99a173049071f9677770e30ef537619d4b74217444ebd179050ac6230f31","lucid-2.11.20230408-181c7ed44fa9b37af3ac434ed53e16dbe6a7ca9ec7ef1f7e5c921196d628f3c0","monad-time-effectful-1.0.0.0-3bcc12595825f15e6c956704de800593d9caa43c86932b7456205b4fcd7a3fee","odd-jobs-0.2.3-2ea7e869e131ba9271dc166fb94494d9c4695adf80a10aeb2c6885388c248e44","pg-entity-0.0.4.4-c09d4801d2c9b8aac6587451fb3276698aa673bffbbe13e20e92459744a89058","pg-transact-effectful-0.0.1.0-19059a8ff842cc019bf692ea57228ae755836f0ae48aa91885f40683ea8347a6","postgresql-simple-0.6.5.1-ec621799555c8b1b15b3683ac92cdc3770e891696c7afc3195aa6f26571cbbe0","req-3.13.2-58b3576f35ee75f77b2d839cec460285be510fca18162b9b1542b8ae69fa9e34","resource-pool-0.4.0.0-b943f9aab32b14d553510f77b995882007d913763eb4c8a34a077c78a8909098","servant-0.20.1-b63507222e1b19c7b8333551fd2fbdae76248ba97753767f7ab4d32b7816d39d","servant-client-0.20-ffd6b2eca0816fa09c64c230d34ebe7b6ee3f06a805980e86e28fb7d902f65e2","servant-client-core-0.20-9e603d4d82c8eefde573caf5b7328a91ee474d7e0ede0539645efa20a15a89d4","text-2.0.2","text-display-0.0.5.1-ae9f66e9765923d9edec209058cc153706fead0e7c7287c2994a985da1c39623","time-1.12.2","vector-0.13.1.0-eb53bdac16f057ad838f4e8cb865b51b400abac71a36dc5bfde93ea1d0859eae"],"exe-depends":[],"component-name":"lib:flora-jobs"},{"type":"configured","id":"flora-1.0.15-inplace-flora-server","pkg-name":"flora","pkg-version":"1.0.15","flags":{"prod":false},"style":"local","pkg-src":{"type":"local","path":"/home/hecate/Projects/Flora/1-flora-server/."},"dist-dir":"/home/hecate/Projects/Flora/1-flora-server/dist-newstyle/build/x86_64-linux/ghc-9.6.4/flora-1.0.15/x/flora-server","build-info":"/home/hecate/Projects/Flora/1-flora-server/dist-newstyle/build/x86_64-linux/ghc-9.6.4/flora-1.0.15/x/flora-server/build-info.json","depends":["base-4.18.2.0","flora-1.0.15-inplace-flora-web"],"exe-depends":[],"component-name":"exe:flora-server","bin-file":"/home/hecate/Projects/Flora/1-flora-server/dist-newstyle/build/x86_64-linux/ghc-9.6.4/flora-1.0.15/x/flora-server/build/flora-server/flora-server"},{"type":"configured","id":"flora-1.0.15-inplace-flora-test","pkg-name":"flora","pkg-version":"1.0.15","flags":{"prod":false},"style":"local","pkg-src":{"type":"local","path":"/home/hecate/Projects/Flora/1-flora-server/."},"dist-dir":"/home/hecate/Projects/Flora/1-flora-server/dist-newstyle/build/x86_64-linux/ghc-9.6.4/flora-1.0.15/t/flora-test","build-info":"/home/hecate/Projects/Flora/1-flora-server/dist-newstyle/build/x86_64-linux/ghc-9.6.4/flora-1.0.15/t/flora-test/build-info.json","depends":["Cabal-syntax-3.10.1.0","aeson-2.2.1.0-2595d249b227784b9febcd5a91568775f66fd262ac45c82c44f7b4a55e9d4c27","base-4.18.2.0","bytestring-0.11.5.3","containers-0.6.7","effectful-core-2.3.0.1-011d84ab0bc8bb2010bac83565500e3039592cab57d902e9a2a502684b92d90f","exceptions-0.10.7","filepath-1.4.200.1","flora-1.0.15-inplace","flora-1.0.15-inplace-flora-web","hedgehog-1.4-6a1134b766e3ee92aee20c92175e4b367d76546ac9575a629ee2eb67aab3a3cb","http-client-0.7.16-08ac6af6261aa24f586bbb528e8ea2f0bd2e7510d1883948d770173e7ea8b633","log-base-0.12.0.1-f6c93830f52a9d5925fa4be3f430d1262c4e2bbf3222e6a925872b2eec0a9d75","log-effectful-1.0.0.0-1daa99a173049071f9677770e30ef537619d4b74217444ebd179050ac6230f31","monad-time-effectful-1.0.0.0-3bcc12595825f15e6c956704de800593d9caa43c86932b7456205b4fcd7a3fee","optics-core-0.4.1.1-f8d9a3ddd3e59e269ad03738aca54bb92446a15ba98a2b4ae8ec19ed7d20df70","pg-entity-0.0.4.4-c09d4801d2c9b8aac6587451fb3276698aa673bffbbe13e20e92459744a89058","pg-transact-0.3.2.0-154eca34326a8779919f5450f98657e0bdd42098d5eb39bd64fe3ab6b57ef08c","pg-transact-effectful-0.0.1.0-19059a8ff842cc019bf692ea57228ae755836f0ae48aa91885f40683ea8347a6","postgresql-migration-0.2.1.7-559534ce1dd13a52b2fe575db34bd39f392a7c262dc6d5bd81bff72f2e148d8e","postgresql-simple-0.6.5.1-ec621799555c8b1b15b3683ac92cdc3770e891696c7afc3195aa6f26571cbbe0","resource-pool-0.4.0.0-b943f9aab32b14d553510f77b995882007d913763eb4c8a34a077c78a8909098","sel-0.0.1.0-a107cece4307b775602a0ac4fef5e5489f9cf07913069de7b0aebbe27daff576","servant-0.20.1-b63507222e1b19c7b8333551fd2fbdae76248ba97753767f7ab4d32b7816d39d","servant-client-0.20-ffd6b2eca0816fa09c64c230d34ebe7b6ee3f06a805980e86e28fb7d902f65e2","servant-server-0.20-3dbcc60207566a1f80874e61a86b73ab8a41f98f3231692dec244b2ce96f8132","tar-0.6.1.0-2355dea2b7e5a1fb20c6753c9c6e0e55e2208d19d4f800ee0c38ad10afdd8945","tasty-1.5-fd9a969b42a912ece8c4543e101cd6e26eee76689c8c5a012bcea4edbf273551","tasty-hunit-0.10.1-d5d74b078c2fc7d0540add40bfcb063d16fc8fc5e21d9467944dfc172c67d6a5","text-2.0.2","time-1.12.2","uuid-1.3.15-413cef239f477249b51ed712d27bea33e15b08237221be1f41f0bc89ce5e1463","vector-0.13.1.0-eb53bdac16f057ad838f4e8cb865b51b400abac71a36dc5bfde93ea1d0859eae","vector-algorithms-0.9.0.1-0d5de6c527fb6ba0e7be854c1685b82a6a99d5798a407e65dc55cac4091e272a","zlib-0.6.3.0-61cb40f46d103a622525dc3a70a9004984ec56d61deea65d2dc01c964606b7e9"],"exe-depends":[],"component-name":"test:flora-test","bin-file":"/home/hecate/Projects/Flora/1-flora-server/dist-newstyle/build/x86_64-linux/ghc-9.6.4/flora-1.0.15/t/flora-test/build/flora-test/flora-test"},{"type":"configured","id":"flora-1.0.15-inplace-flora-web","pkg-name":"flora","pkg-version":"1.0.15","flags":{"prod":false},"style":"local","pkg-src":{"type":"local","path":"/home/hecate/Projects/Flora/1-flora-server/."},"dist-dir":"/home/hecate/Projects/Flora/1-flora-server/dist-newstyle/build/x86_64-linux/ghc-9.6.4/flora-1.0.15/l/flora-web","build-info":"/home/hecate/Projects/Flora/1-flora-server/dist-newstyle/build/x86_64-linux/ghc-9.6.4/flora-1.0.15/l/flora-web/build-info.json","depends":["Cabal-syntax-3.10.1.0","PyF-0.11.2.1-136109de9a2dff073e8ac6c2d415f86bbe2b3b9b72015bfb5fd638fdd22d1843","aeson-2.2.1.0-2595d249b227784b9febcd5a91568775f66fd262ac45c82c44f7b4a55e9d4c27","async-2.2.4-2107e60f1bee7c70ffed77e551ffc7db01e350edd8784cc9493cc782305122d0","base-4.18.2.0","base32-0.4-3d897481f9dfd13903e614afd99fb6b4ab13c775030063f288dd112a84583017","bytestring-0.11.5.3","chronos-1.1.6.1-e20dbb7d5779b22a2f3541a6e640402e4330514b14ff822947c4209317b25bd6","cmark-gfm-0.2.6-75f7486f403003de2a2443033871ceb43cdf01f5fac50f7409807d10e27f29bc","colourista-0.1.0.2-f2248bbbb4ee79cbf9fe81e61effe11fd685506de3685fc7950c57e7408058a6","containers-0.6.7","cookie-0.4.6-0f17f671a430f9d3670a38aa989d096c8a941ff590a1a1a5bc4f595def792f73","data-default-0.7.1.1-fb1a461d5390de89b4af18b225f51df41ca3a345d820ee4756653e4cd2f3cd8e","deepseq-1.4.8.1","deriving-aeson-0.2.9-f86850669d5d4b90b08e438464fff4f49c8d0959ce8a2fd31d585b5dec88f689","effectful-2.3.0.0-52623768742e178fa9448f87d55f19ed0d8237dc80135fee9505d1c022c6ed6f","effectful-core-2.3.0.1-011d84ab0bc8bb2010bac83565500e3039592cab57d902e9a2a502684b92d90f","extra-1.7.14-f1add2fd140928c4ff98846cf958be82c050721a89872d0804fd7c0b0133cad4","flora-1.0.15-inplace","flora-1.0.15-inplace-flora-jobs","haddock-library-1.11.0-326b2de9b01f2443dad3c93dff0450ea221702c5b8e9319df728d76c9762159c","http-api-data-0.6-f8db4c3e7ff814c1476ac3873683211db56d23f0c28cabdd051460114fc3de4f","http-client-0.7.16-08ac6af6261aa24f586bbb528e8ea2f0bd2e7510d1883948d770173e7ea8b633","http-client-tls-0.3.6.3-67f7c5e1b646b6720d31cd47b325354e5e9c257cef0d9522c9b4a5648422c65e","http-media-0.8.1.1-82ac8def17fc7bb0c409983a665f6b7cccbfddad16ad03396e0ea28fa6b4797e","http-types-0.12.4-0f52a9ec33f3c65ef0b77ad8ce14b65f9164f8a761e42800dc9c80ee1768aacc","log-base-0.12.0.1-f6c93830f52a9d5925fa4be3f430d1262c4e2bbf3222e6a925872b2eec0a9d75","log-effectful-1.0.0.0-1daa99a173049071f9677770e30ef537619d4b74217444ebd179050ac6230f31","lucid-2.11.20230408-181c7ed44fa9b37af3ac434ed53e16dbe6a7ca9ec7ef1f7e5c921196d628f3c0","lucid-alpine-0.1.0.7-b7f14424060b05c5c69e15f1069098caf1990249242463a26aa1a08d9cb5e98c","lucid-svg-0.7.1.1-2b919f949d217797fe4a4bf74b5ae72e72599c4304e6d78dc5d24024c6bb957f","monad-time-0.4.0.0-1b1c52822cdc65b1e9b65bdb86f7b0aec26973256197697f3b44b64ee669d1f7","monad-time-effectful-1.0.0.0-3bcc12595825f15e6c956704de800593d9caa43c86932b7456205b4fcd7a3fee","mtl-2.3.1","network-uri-2.6.4.2-d62d36021f4a84b02c9243cbe37e9dfd5b7ba840b4aaedb5e002f05582564fc4","odd-jobs-0.2.3-2ea7e869e131ba9271dc166fb94494d9c4695adf80a10aeb2c6885388c248e44","one-time-password-3.0.0.0-cbe2caf30a2aa172cf2c5cdfc1edad8761e857fde6fe8f0adb23c2013d6f8108","openapi3-3.2.4-36a3dd9c34b66f8d7bf989194c80a50284551837b7d8417e8ce95b4a35d15c2e","optics-core-0.4.1.1-f8d9a3ddd3e59e269ad03738aca54bb92446a15ba98a2b4ae8ec19ed7d20df70","pg-entity-0.0.4.4-c09d4801d2c9b8aac6587451fb3276698aa673bffbbe13e20e92459744a89058","pg-transact-effectful-0.0.1.0-19059a8ff842cc019bf692ea57228ae755836f0ae48aa91885f40683ea8347a6","postgresql-simple-0.6.5.1-ec621799555c8b1b15b3683ac92cdc3770e891696c7afc3195aa6f26571cbbe0","pretty-1.1.3.6","raven-haskell-0.1.4.1-44d3b6ed541acb7607ead7976c2238c005386ee5ef27fe0c44b3443d3c3d76b7","resource-pool-0.4.0.0-b943f9aab32b14d553510f77b995882007d913763eb4c8a34a077c78a8909098","safe-exceptions-0.1.7.4-51b8325bd2c9c2c32246cef5b80f09fba6aa9b6005978a7b87ef943c7ddd1182","sel-0.0.1.0-a107cece4307b775602a0ac4fef5e5489f9cf07913069de7b0aebbe27daff576","servant-0.20.1-b63507222e1b19c7b8333551fd2fbdae76248ba97753767f7ab4d32b7816d39d","servant-client-0.20-ffd6b2eca0816fa09c64c230d34ebe7b6ee3f06a805980e86e28fb7d902f65e2","servant-client-core-0.20-9e603d4d82c8eefde573caf5b7328a91ee474d7e0ede0539645efa20a15a89d4","servant-lucid-0.9.0.6-3245f97c511011e42d95122d5373c12ebeb20de76226f6491768d04935bf6b52","servant-openapi3-2.0.1.6-92378e8ee0bea5a4e54c3dd4fc1e97b9c790b2fcc65c5a79e54d520319677c44","servant-server-0.20-3dbcc60207566a1f80874e61a86b73ab8a41f98f3231692dec244b2ce96f8132","text-2.0.2","text-display-0.0.5.1-ae9f66e9765923d9edec209058cc153706fead0e7c7287c2994a985da1c39623","time-1.12.2","torsor-0.1.0.1-264ad98156300f7b86fb968625df8515c2fbbce5479b450f036ac11b2f5c7444","uuid-1.3.15-413cef239f477249b51ed712d27bea33e15b08237221be1f41f0bc89ce5e1463","vector-0.13.1.0-eb53bdac16f057ad838f4e8cb865b51b400abac71a36dc5bfde93ea1d0859eae","vector-algorithms-0.9.0.1-0d5de6c527fb6ba0e7be854c1685b82a6a99d5798a407e65dc55cac4091e272a","wai-3.2.4-acf062ae483a435740bc88b21ee81f62d3f94a62faea15a5bf17463ace439645","wai-app-static-3.1.8-d2d0c9be3a5bd2980a68b3225b620c023885a62d44f09cee23e1325fcbe6c50c","wai-log-0.4.0.1-479434afc1461896e7a927d8fb2df0160b14dae19bb9a79688f196ec7d42177b","wai-middleware-heartbeat-0.0.1.0-de5d48bf3f801ad6a7c2e1238d0d30545239fd081520428e7cfa1d9f6b41c104","warp-3.3.31-3a081a14799ab48e5efe3a315077d1e89ea4da61799497b4990d5fc7e0dcb380","xml-conduit-1.9.1.3-bf19b431d216b0a2413840aa01a4a651624a00a392ce27bb32e3cbe5522c5d28","xml-conduit-writer-0.1.1.5-af45083ef430fdd7f499ccdbcbffc63138c7fd12623f1529c3a0777b83867c2e"],"exe-depends":[],"component-name":"lib:flora-web"},{"type":"configured","id":"foreign-store-0.2-38a004231d79ea11822d0929a9cc1c95c0b47fcefc2bf90dbf83bf2d93adaf90","pkg-name":"foreign-store","pkg-version":"0.2","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"5673289d703e523dfec904555e132c46e70c9221c4c9a75fcbc3e587c0b9e63c","pkg-src-sha256":"06718a214d068eaa494cc82376f23b2059a141b01048cd7efcf2176a6c3383dc","depends":["base-4.18.2.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"free-5.2-841f6f1c7522ed92dbed9d024b48671e79a9cdd76652f8bdbf9c0e63908771e7","pkg-name":"free","pkg-version":"5.2","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"4dd76c1a19f81d7866e7b75682350f1ef3e0441b19b4d07eccdd9ef326a0be70","pkg-src-sha256":"72867f7c89173263765736e8d395e94291f1aaea626ecb1d673d72ce90b94f89","depends":["base-4.18.2.0","comonad-5.0.8-8505feb1b75f0b6bf19ef9b666132d0031c1214df6db91aab78f0a9def57751c","containers-0.6.7","distributive-0.6.2.1-70a2f4c4bffafd7749c1d755f27db885f954a9d9be1cd7db8a6e99887121ec8c","exceptions-0.10.7","indexed-traversable-0.1.3-8f7210e35c0cb4bf73ec163bed4014cbba70e17aa189447497a492e60990637b","mtl-2.3.1","profunctors-5.6.2-8b084a9552445e5776f01a7b42f1722ce1ecf20cf9a8e839007b9baea33b9fa4","semigroupoids-6.0.0.1-e83bc6491c75c3522014917ab4d3335127e2ee3b4989f0a49f9791f8bead28c6","template-haskell-2.20.0.0","th-abstraction-0.6.0.0-b49a83d27ea2604c7977c309bd302e93941309c5040c248dbdb6b55147976b2b","transformers-0.6.1.0","transformers-base-0.4.6-91c64a4b19c3f5f9f196345e9032803d52322bd0857ba94ea6c4260a27a2ff07"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"friendly-time-0.4.1-abf55dee5aabd3d8d1a3bf852e9269ad8c33f771fd59ecb030b252f999bd9e16","pkg-name":"friendly-time","pkg-version":"0.4.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"fa350c6bb17352281415359355ce8f9408a4676f051388e9ea266ed5b172d624","pkg-src-sha256":"9af3443227c3f271f5d11ed8c3c15c77a59de3ab82d87d93ac1f8455a54393c8","depends":["base-4.18.2.0","old-locale-1.0.0.7-682418540979bf75be932863a87a0db4ab12d3f7ec5faaeba30e4175347cd126","time-1.12.2"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"fusion-plugin-types-0.1.0-af0a0db9279412adcb5a431d750045b40fdb99350a31564d7ec80e2944df0ac3","pkg-name":"fusion-plugin-types","pkg-version":"0.1.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"0f11bbc445ab8ae3dbbb3d5d2ea198bdb1ac020518b7f4f7579035dc89182438","pkg-src-sha256":"6d0453886b0aca46ab311b8ac8031fd249417e96a1b675248fca196565f59f92","depends":["base-4.18.2.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"generic-deriving-1.14.5-a1fd2d043c8cafb22abedc758c45dbc284b28f5354f3eb1c717c80c43a96a9e6","pkg-name":"generic-deriving","pkg-version":"1.14.5","flags":{"base-4-9":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"8069afb7fa52c2fdae001c43d3b4d98cb68dffa0dc07ebe1ebba72e08c7762bb","pkg-src-sha256":"ea9f74049bdfae8159738e42beed07ca7ecd7483192407fd29afdde11a339449","depends":["base-4.18.2.0","containers-0.6.7","ghc-prim-0.10.0","template-haskell-2.20.0.0","th-abstraction-0.6.0.0-b49a83d27ea2604c7977c309bd302e93941309c5040c248dbdb6b55147976b2b"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"generically-0.1.1-bdc1b22218832bf69277f07778576bdaa3d8df05d3081150e9ff6dabe4f79249","pkg-name":"generically","pkg-version":"0.1.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"378ec049bc2853b8011df116647fbd34bb9f00edce9840e4957f98abc097597c","pkg-src-sha256":"04c5a436bec4b041f71a733f56a1bd7f435f63dde8d3eb5c1f48d55b4dbc43cf","depends":["base-4.18.2.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"generics-sop-0.5.1.4-7f93bc69a981e910350e3e463cbbc84ff4d890645a9659a18c10b5d43ad5b6aa","pkg-name":"generics-sop","pkg-version":"0.5.1.4","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"db1929b3c61a6ed4cb5fe99c5a6a1baf0c4e36846d5a3dbb5052f39cc042fcb2","pkg-src-sha256":"616a1c2176097469f9514e76d979fffdbc12d569f44fd01deb14377c7888797e","depends":["base-4.18.2.0","ghc-prim-0.10.0","sop-core-0.5.0.2-916ec985869f4742a9c9e1c1cdd20338928cdc574be8814bb09c58ce2e7bf566","template-haskell-2.20.0.0","th-abstraction-0.6.0.0-b49a83d27ea2604c7977c309bd302e93941309c5040c248dbdb6b55147976b2b"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"ghc-9.6.4","pkg-name":"ghc","pkg-version":"9.6.4","depends":["array-0.5.6.0","base-4.18.2.0","binary-0.8.9.1","bytestring-0.11.5.3","containers-0.6.7","deepseq-1.4.8.1","directory-1.3.8.1","exceptions-0.10.7","filepath-1.4.200.1","ghc-boot-9.6.4","ghc-heap-9.6.4","ghci-9.6.4","hpc-0.6.2.0","process-1.6.17.0","stm-2.5.1.0","template-haskell-2.20.0.0","time-1.12.2","transformers-0.6.1.0","unix-2.8.4.0"]},{"type":"pre-existing","id":"ghc-bignum-1.3","pkg-name":"ghc-bignum","pkg-version":"1.3","depends":["ghc-prim-0.10.0"]},{"type":"pre-existing","id":"ghc-boot-9.6.4","pkg-name":"ghc-boot","pkg-version":"9.6.4","depends":["base-4.18.2.0","binary-0.8.9.1","bytestring-0.11.5.3","containers-0.6.7","deepseq-1.4.8.1","directory-1.3.8.1","filepath-1.4.200.1","ghc-boot-th-9.6.4","unix-2.8.4.0"]},{"type":"pre-existing","id":"ghc-boot-th-9.6.4","pkg-name":"ghc-boot-th","pkg-version":"9.6.4","depends":["base-4.18.2.0"]},{"type":"pre-existing","id":"ghc-heap-9.6.4","pkg-name":"ghc-heap","pkg-version":"9.6.4","depends":["base-4.18.2.0","containers-0.6.7","ghc-prim-0.10.0","rts-1.0.2"]},{"type":"pre-existing","id":"ghc-prim-0.10.0","pkg-name":"ghc-prim","pkg-version":"0.10.0","depends":["rts-1.0.2"]},{"type":"pre-existing","id":"ghci-9.6.4","pkg-name":"ghci","pkg-version":"9.6.4","depends":["array-0.5.6.0","base-4.18.2.0","binary-0.8.9.1","bytestring-0.11.5.3","containers-0.6.7","deepseq-1.4.8.1","filepath-1.4.200.1","ghc-boot-9.6.4","ghc-heap-9.6.4","ghc-prim-0.10.0","rts-1.0.2","template-haskell-2.20.0.0","transformers-0.6.1.0","unix-2.8.4.0"]},{"type":"configured","id":"haddock-library-1.11.0-326b2de9b01f2443dad3c93dff0450ea221702c5b8e9319df728d76c9762159c","pkg-name":"haddock-library","pkg-version":"1.11.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"17af50285f4aa50b1dcf67ecf25ffc84cb62790340120099ddeb86ad5abc0d27","pkg-src-sha256":"7c075ec9a378b0a2d9d605e72135201e6c7ff316564f2c974113582f43bea20a","depends":["base-4.18.2.0","containers-0.6.7","parsec-3.1.16.1","text-2.0.2"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"half-0.3.1-abaa8d4e544e24e38c9200d7b5cfb6731ae8b4aec4a1d27bf34cec5836e12ff6","pkg-name":"half","pkg-version":"0.3.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"f43f16671b42bdc92b4be9e0b0ce1bcff817c928d0a50f13a6264a24586c1a7c","pkg-src-sha256":"e2afc32724e11bf5c695d797b9169d9d9b2dc62a530aed31284c8187af1615d1","depends":["base-4.18.2.0","binary-0.8.9.1","deepseq-1.4.8.1","template-haskell-2.20.0.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"happy-1.20.1.1-e-happy-182aa5abbcffb81f5451895cca70d0e3fc7d8d0e3c5bdde45132d65f06643d40","pkg-name":"happy","pkg-version":"1.20.1.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"a381633c5e8f9e9e5a8e1900930ce13172397b4677fcfcc08cd38eb3f73b61b1","pkg-src-sha256":"8b4e7dc5a6c5fd666f8f7163232931ab28746d0d17da8fa1cbd68be9e878881b","depends":["array-0.5.6.0","base-4.18.2.0","containers-0.6.7","mtl-2.3.1"],"exe-depends":[],"component-name":"exe:happy","bin-file":"/home/hecate/Projects/Flora/1-flora-server/_build/cabal-store/ghc-9.6.4/happy-1.20.1.1-e-happy-182aa5abbcffb81f5451895cca70d0e3fc7d8d0e3c5bdde45132d65f06643d40/bin/happy"},{"type":"configured","id":"hashable-1.4.3.0-17b447e0ce504d4e093d6bf5a9838da3805c7caa5d16355da40827d004febbc8","pkg-name":"hashable","pkg-version":"1.4.3.0","flags":{"integer-gmp":true,"random-initial-seed":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"f3bf68acfa0df7a064a378ef2cdcfeb55e6fb96100675f4c593556dcbf3d7194","pkg-src-sha256":"32efb16c2891786209b7cbe5c39df9b3a9ae51e836f1a54f646bc4602b7ab0f5","depends":["base-4.18.2.0","bytestring-0.11.5.3","containers-0.6.7","deepseq-1.4.8.1","filepath-1.4.200.1","ghc-bignum-1.3","ghc-prim-0.10.0","text-2.0.2"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"haskell-lexer-1.1.1-833f66de7c919d07c41146e9931dfd902b8b694cd3302de1c3d836c85a3c47a3","pkg-name":"haskell-lexer","pkg-version":"1.1.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"4ce310678b7e56b51acb558c0233d2f71a3f3553f8a88e9b48c0bc68301f799b","pkg-src-sha256":"c8eeda569a30f115244c17920247ba2c45d11b3e30805f648a878f7855d8f349","depends":["base-4.18.2.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"haskell-src-exts-1.23.1-f41334025207b7f06d64532205cdb691bfd3b10cf027d5c23c98ee25bf2c9f5e","pkg-name":"haskell-src-exts","pkg-version":"1.23.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"339841f4a6710e915a0bac8df18d8a454c11d626131aee4d05b6be150b7f863e","pkg-src-sha256":"67853047169fff7d3e5d87acef214ee185a6ab8c6a104ed9c59e389574cf6c05","depends":["array-0.5.6.0","base-4.18.2.0","ghc-prim-0.10.0","pretty-1.1.3.6"],"exe-depends":["happy-1.20.1.1-e-happy-182aa5abbcffb81f5451895cca70d0e3fc7d8d0e3c5bdde45132d65f06643d40"],"component-name":"lib"},{"type":"configured","id":"haskell-src-meta-0.8.13-d3053a08f8d9deda4e92997b870b23096956d6c11736d5eed8f387ed509f1133","pkg-name":"haskell-src-meta","pkg-version":"0.8.13","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"ed2fa4b98106500bcd44df5144f4bcb9227d3fb26101dbaa9c70ca8b8d56510b","pkg-src-sha256":"ea0281c916585d3ff4ce0594b000ac844031cab6e0eb16fba4fe0f019aa2c025","depends":["base-4.18.2.0","haskell-src-exts-1.23.1-f41334025207b7f06d64532205cdb691bfd3b10cf027d5c23c98ee25bf2c9f5e","pretty-1.1.3.6","syb-0.7.2.4-80d2f5060ad894d00e83dbe185e57c37c081728996394fa6f5a2fa912bb894f4","template-haskell-2.20.0.0","th-orphans-0.13.14-16db0f9bff8b7cf7d9193a41514705710e6bf8cf8d36317661b9cbe3736fdc28"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"hdaemonize-0.5.7-554f4deed801598a70abe3e63685f792ae09fe10e60f21faf1abe49687142f9f","pkg-name":"hdaemonize","pkg-version":"0.5.7","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"b75b877f0704bcea84bf641c23d5f16e1e220a6147ed4ecabe0b916c128b9cfd","pkg-src-sha256":"748823288eec23252335c00576384fc322e4f91c8e86f456530ba5d7c727f01b","depends":["base-4.18.2.0","bytestring-0.11.5.3","extensible-exceptions-0.1.1.4-9ada676787e2c2f8f4d2dc78ab24d80159488100b1a4433d25572f0c9366f79f","filepath-1.4.200.1","hsyslog-5.0.2-9ac10b37c77c7762f93b70afc58e9b363345f68fafa0faa62d9b9e8fc01b8031","mtl-2.3.1","unix-2.8.4.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"heaps-0.4-8352de6c15db4be4912bb7418446dab1e2d80f26647938794abadafee6111c60","pkg-name":"heaps","pkg-version":"0.4","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"66b19fcd813b0e4db3e0bac541bd46606c3b13d3d081d9f9666f4be0f5ff14b8","pkg-src-sha256":"89329df8b95ae99ef272e41e7a2d0fe2f1bb7eacfcc34bc01664414b33067cfd","depends":["base-4.18.2.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"hedgehog-1.4-6a1134b766e3ee92aee20c92175e4b367d76546ac9575a629ee2eb67aab3a3cb","pkg-name":"hedgehog","pkg-version":"1.4","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"9195af7e03f6255b087f0a09b4100ba3d805d303aef64b3a8543b2123f7851a2","pkg-src-sha256":"f54afb31552e0f809030becad349cbfe19a65753a778771dc7314b2a6c41e6eb","depends":["ansi-terminal-1.0.2-f2271bf25e5299c165409ab78d5917aeba79c479959932bb5fb284c513226fc0","async-2.2.4-2107e60f1bee7c70ffed77e551ffc7db01e350edd8784cc9493cc782305122d0","barbies-2.1.1.0-a2e90384bd5520adcdbd08bf5d3ad4beac274ed17c2784dd44f1bf5a9ba6ef3f","base-4.18.2.0","bytestring-0.11.5.3","concurrent-output-1.10.20-c4a120b1daa3b0b9738f4f9f1b441737023740231d880696da957f2afe7f5fcc","containers-0.6.7","deepseq-1.4.8.1","directory-1.3.8.1","erf-2.0.0.0-5e00dd8595b2d92c48d9f543d9269f193e14d19af8d53cfaa38744b61539cdae","exceptions-0.10.7","lifted-async-0.10.2.5-0e5383cde07ceba316c6eb9f965038eb2ea32a6c803d5b96f22bdcdba63bfe14","mmorph-1.2.0-967f2a66454abded96663c19c27c375e74faace9a8cd232a9ae738ec2604ffa1","monad-control-1.0.3.1-2bf3452c923aa94707518b6d970f4377279fd8c4ccca1256725eef18b6097440","mtl-2.3.1","pretty-show-1.10-39ae5e05ab98b3c924fb13a2d338f92ec77dadc8f9be190ec6bbf2401618cf8f","primitive-0.9.0.0-a6aa61bd9fff8d6cfd4880894dd85d8e644fbcf178b2bff38f87569871ea4a0d","random-1.2.1.2-cc746490e13a1f967de173a54c09753b2ccdb5d95056b0f1206a29c62c83de45","resourcet-1.3.0-0f210c6e8ffe9f595ad8fd1a6cf6726e42a6695abb7febee22452f40436a2bc5","safe-exceptions-0.1.7.4-51b8325bd2c9c2c32246cef5b80f09fba6aa9b6005978a7b87ef943c7ddd1182","stm-2.5.1.0","template-haskell-2.20.0.0","text-2.0.2","time-1.12.2","transformers-0.6.1.0","transformers-base-0.4.6-91c64a4b19c3f5f9f196345e9032803d52322bd0857ba94ea6c4260a27a2ff07","wl-pprint-annotated-0.1.0.1-2ffc62f3d112419f639c5f9a11a9f5522560693bebb7563fb4d9e6fbf7d077e8"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"hostname-1.0-5085af94c98cc8316318de7e81d25ddb5a73601cfd27bfccc90a5b913cd9891b","pkg-name":"hostname","pkg-version":"1.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"8203b6ecd14ca1ef12f73a471b0a6a4be3ad4568d8b84f2bc4bc9e0abb8c4153","pkg-src-sha256":"9b43dab1b6da521f35685b20555da00738c8e136eb972458c786242406a9cf5c","components":{"lib":{"depends":["base-4.18.2.0"],"exe-depends":[]}}},{"type":"configured","id":"hourglass-0.2.12-ff77f9ff09de83d24a0ee40cfa0cec90de8666d5167809a314d26ad4a7544cdd","pkg-name":"hourglass","pkg-version":"0.2.12","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"e083f5e030dfebe432e30a9c0fa07a99a54eac992f622442646be561fd7a44e8","pkg-src-sha256":"44335b5c402e80c60f1db6a74462be4ea29d1a9043aa994334ffee1164f1ca4a","depends":["base-4.18.2.0","deepseq-1.4.8.1"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"hpc-0.6.2.0","pkg-name":"hpc","pkg-version":"0.6.2.0","depends":["base-4.18.2.0","containers-0.6.7","deepseq-1.4.8.1","directory-1.3.8.1","filepath-1.4.200.1","time-1.12.2"]},{"type":"configured","id":"hsc2hs-0.68.10-e-hsc2hs-3b4e464e6a657183d9f83bd37c6d876421d9f6d00ca34e12b12ca3365e55159d","pkg-name":"hsc2hs","pkg-version":"0.68.10","flags":{"in-ghc-tree":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"488cca2a179a5141da8f35a3a7e6699a0ef690f834f589d6b152c4947aa8fe2d","pkg-src-sha256":"6f4e34d788fe2ca7091ee0a10307ee8a7c060a1ba890f2bffad16a7d4d5cef76","depends":["base-4.18.2.0","containers-0.6.7","directory-1.3.8.1","filepath-1.4.200.1","process-1.6.17.0"],"exe-depends":[],"component-name":"exe:hsc2hs","bin-file":"/home/hecate/Projects/Flora/1-flora-server/_build/cabal-store/ghc-9.6.4/hsc2hs-0.68.10-e-hsc2hs-3b4e464e6a657183d9f83bd37c6d876421d9f6d00ca34e12b12ca3365e55159d/bin/hsc2hs"},{"type":"configured","id":"hspec-2.11.7-e5ff04a60a8c23d1953854fc051870a447d8cf15eac67b388ed88c8c0711ecd0","pkg-name":"hspec","pkg-version":"2.11.7","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"2869580a2a29e7beb6268ea3dc561583f4ae229ed1f47fb1c92e8c09ce35acec","pkg-src-sha256":"2a3e108abd9ba4133f96131cf22e5e4e4c77f3f125b377e6d4c14719746e3096","depends":["QuickCheck-2.14.3-091d344acf9c963200a9b2af6c5417d91912262a9a84b607d918b50fdf8a8b02","base-4.18.2.0","hspec-core-2.11.7-bd08de6d39a4a92bb0f77a0acddbefeb44097fad60030fb9a37560e06da00a3d","hspec-discover-2.11.7-0a5ad2b844295ffaf106e018fc6b84c09cb732bdd31518d7d2ef593ad4cb5b27","hspec-expectations-0.8.4-4186df589755fef0bfbd675b6f8cdae8d4fa1bb936ff33dcfeeeef23aca9e02b"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"hspec-core-2.11.7-bd08de6d39a4a92bb0f77a0acddbefeb44097fad60030fb9a37560e06da00a3d","pkg-name":"hspec-core","pkg-version":"2.11.7","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"90d8873356d7e15f843bc523360e206e8e356ff6b82a1fa4b3889dc31d073ea1","pkg-src-sha256":"6ffa9b86b8a79bb7e8de47c4c850a2e2500f770827d6645ff478ea50f731b134","depends":["HUnit-1.6.2.0-d1570da0a2808fb4ce9b1c3f1e99a0cf4a27d7c4071d9714ae835af7748ace92","QuickCheck-2.14.3-091d344acf9c963200a9b2af6c5417d91912262a9a84b607d918b50fdf8a8b02","ansi-terminal-1.0.2-f2271bf25e5299c165409ab78d5917aeba79c479959932bb5fb284c513226fc0","array-0.5.6.0","base-4.18.2.0","call-stack-0.4.0-a0fd887e5d06d11a75269d5dfed7da6fe2656edbbd7cc1697fb2a2b8ad4fe392","deepseq-1.4.8.1","directory-1.3.8.1","filepath-1.4.200.1","haskell-lexer-1.1.1-833f66de7c919d07c41146e9931dfd902b8b694cd3302de1c3d836c85a3c47a3","hspec-expectations-0.8.4-4186df589755fef0bfbd675b6f8cdae8d4fa1bb936ff33dcfeeeef23aca9e02b","process-1.6.17.0","quickcheck-io-0.2.0-72cfeb1839042c70144c107e73cbb146738a02891278b479561ca9d6da09e7d6","random-1.2.1.2-cc746490e13a1f967de173a54c09753b2ccdb5d95056b0f1206a29c62c83de45","stm-2.5.1.0","tf-random-0.5-d20b981bd0edba50c6bca263adb1566e44b7f7cb2b92de86a3f3b07af9e476eb","time-1.12.2","transformers-0.6.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"hspec-discover-2.11.7-0a5ad2b844295ffaf106e018fc6b84c09cb732bdd31518d7d2ef593ad4cb5b27","pkg-name":"hspec-discover","pkg-version":"2.11.7","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"6307eb16d308258a99a242025df50217d835ba0a3f205b1202a100a175877b38","pkg-src-sha256":"2862b230bb45eb320dd985659b81b482de98f869f4ed88398555a6a7cd12d82a","depends":["base-4.18.2.0","directory-1.3.8.1","filepath-1.4.200.1"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"hspec-discover-2.11.7-e-hspec-discover-052bee0253fffdc2b9ca8c624ab1ff0f1164b1a50fb6477f7c1f138014bb4b61","pkg-name":"hspec-discover","pkg-version":"2.11.7","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"6307eb16d308258a99a242025df50217d835ba0a3f205b1202a100a175877b38","pkg-src-sha256":"2862b230bb45eb320dd985659b81b482de98f869f4ed88398555a6a7cd12d82a","depends":["base-4.18.2.0","directory-1.3.8.1","filepath-1.4.200.1","hspec-discover-2.11.7-0a5ad2b844295ffaf106e018fc6b84c09cb732bdd31518d7d2ef593ad4cb5b27"],"exe-depends":[],"component-name":"exe:hspec-discover","bin-file":"/home/hecate/Projects/Flora/1-flora-server/_build/cabal-store/ghc-9.6.4/hspec-discover-2.11.7-e-hspec-discover-052bee0253fffdc2b9ca8c624ab1ff0f1164b1a50fb6477f7c1f138014bb4b61/bin/hspec-discover"},{"type":"configured","id":"hspec-expectations-0.8.4-4186df589755fef0bfbd675b6f8cdae8d4fa1bb936ff33dcfeeeef23aca9e02b","pkg-name":"hspec-expectations","pkg-version":"0.8.4","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"4237f094a7931202ff57ac6475542b0b314b50a7024550e2b6eb87cfb0d4ff93","pkg-src-sha256":"7b8dde7e230ecfda90c95fd80478b244a45e68602fb3dd4a76f4710619be21ff","depends":["HUnit-1.6.2.0-d1570da0a2808fb4ce9b1c3f1e99a0cf4a27d7c4071d9714ae835af7748ace92","base-4.18.2.0","call-stack-0.4.0-a0fd887e5d06d11a75269d5dfed7da6fe2656edbbd7cc1697fb2a2b8ad4fe392"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"hsyslog-5.0.2-9ac10b37c77c7762f93b70afc58e9b363345f68fafa0faa62d9b9e8fc01b8031","pkg-name":"hsyslog","pkg-version":"5.0.2","flags":{"install-examples":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"0b604c9f3d1bcbe7cd223b1b530110309ae01f2d7c57bc08ffc4fc31ad21324c","pkg-src-sha256":"3eec43c8fb42c23d03f1db7b0b594d39cd94275c2284dcd0c64aa4d680bd7ece","depends":["base-4.18.2.0"],"exe-depends":["hsc2hs-0.68.10-e-hsc2hs-3b4e464e6a657183d9f83bd37c6d876421d9f6d00ca34e12b12ca3365e55159d"],"component-name":"lib"},{"type":"configured","id":"http-api-data-0.6-f8db4c3e7ff814c1476ac3873683211db56d23f0c28cabdd051460114fc3de4f","pkg-name":"http-api-data","pkg-version":"0.6","flags":{"use-text-show":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"fb724ab5d42656b1f0f982ffb73ccb457ef73c6d6461f6a1b2b0a70d41d05d6e","pkg-src-sha256":"74904382dfd0774a34fef881d895afafdb856bd57f162db275cfe550a1dc1346","depends":["base-4.18.2.0","bytestring-0.11.5.3","containers-0.6.7","cookie-0.4.6-0f17f671a430f9d3670a38aa989d096c8a941ff590a1a1a5bc4f595def792f73","hashable-1.4.3.0-17b447e0ce504d4e093d6bf5a9838da3805c7caa5d16355da40827d004febbc8","http-types-0.12.4-0f52a9ec33f3c65ef0b77ad8ce14b65f9164f8a761e42800dc9c80ee1768aacc","tagged-0.8.8-5d06ce789c37adf39496775b08f7d82bb9509e4c2a3f973b0c868e35bca55ad5","text-2.0.2","text-iso8601-0.1-ca672f6e92319e19ff854d44b5ac9b4e7c827c1996a06b87b8a221dbacac85fb","time-compat-1.9.6.1-2b2aa066adc7c0d5baad9d0716626a41574966c2265b4ff355b83a2bfd5ca61a","transformers-0.6.1.0","unordered-containers-0.2.20-013ecc3e94c07bd5bdb23da8c9cf4d68ac66e04c4144b4096b291104672db345","uuid-types-1.0.5.1-c19e00cab51fb72d8874dd99ac787f44fda9996af8117c2d227cfb3294e06a9c"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"http-client-0.7.16-08ac6af6261aa24f586bbb528e8ea2f0bd2e7510d1883948d770173e7ea8b633","pkg-name":"http-client","pkg-version":"0.7.16","flags":{"network-uri":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"af80ec3d34534d1db1148ef6a54eb87d5364261236ade169ba0603a2e441fb8f","pkg-src-sha256":"3a84ca8f94306084aef3ff5128db231cb6bb7c606fbee16910f8d0df400c6291","depends":["array-0.5.6.0","async-2.2.4-2107e60f1bee7c70ffed77e551ffc7db01e350edd8784cc9493cc782305122d0","base-4.18.2.0","base64-bytestring-1.2.1.0-ecb3bf792eac6ec696f20e02e528e8a7b2a76a5b32c46409c4645e1bfbd71cf4","blaze-builder-0.4.2.3-60676f992d653075aeba6aad80b2dd0b054859608a5712ecfc9d4a4968aefdb8","bytestring-0.11.5.3","case-insensitive-1.2.1.0-5255eaf892b10e8489fdad145ca833a10864bd951f3e69d04088fbcadf28ec6d","containers-0.6.7","cookie-0.4.6-0f17f671a430f9d3670a38aa989d096c8a941ff590a1a1a5bc4f595def792f73","deepseq-1.4.8.1","exceptions-0.10.7","filepath-1.4.200.1","ghc-prim-0.10.0","http-types-0.12.4-0f52a9ec33f3c65ef0b77ad8ce14b65f9164f8a761e42800dc9c80ee1768aacc","iproute-1.7.12-1154efefaf645ab127d46e471b4ebe1968e3b3f8497cc0b74c21385bb289cbb0","mime-types-0.1.2.0-3d20aa710271c28a90c1e88feb88ab239804502c494312d5102d19e4b368709f","network-3.1.4.0-9d41c9df77e8d21da5aaf51c19540d3c0fc11e5e2c2940bea5411915b8a462ff","network-uri-2.6.4.2-d62d36021f4a84b02c9243cbe37e9dfd5b7ba840b4aaedb5e002f05582564fc4","random-1.2.1.2-cc746490e13a1f967de173a54c09753b2ccdb5d95056b0f1206a29c62c83de45","stm-2.5.1.0","streaming-commons-0.2.2.6-9fa4239301ef39252b6218423c0a2438611fe43c2ddbebd4f8953d4455c07935","text-2.0.2","time-1.12.2","transformers-0.6.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"http-client-tls-0.3.6.3-67f7c5e1b646b6720d31cd47b325354e5e9c257cef0d9522c9b4a5648422c65e","pkg-name":"http-client-tls","pkg-version":"0.3.6.3","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"a5909ce412ee65c141b8547f8fe22236f175186c95c708e86a46b5547394f910","pkg-src-sha256":"38dcfc3d772eb6898b4a8856d6159824d13f65eb291733619f625a802dad9095","depends":["base-4.18.2.0","bytestring-0.11.5.3","case-insensitive-1.2.1.0-5255eaf892b10e8489fdad145ca833a10864bd951f3e69d04088fbcadf28ec6d","containers-0.6.7","crypton-0.34-c8d7db2766b56c26f144f8f589058be74cfcc7e68ff2d08f8f41d2ef1a1fa0e8","crypton-connection-0.3.2-804034b7a3e50ed75e1849613e844c1579d8bd18848efe958529bc613747e852","data-default-class-0.1.2.0-4350681fcf6087f7ee4836ea8af486e6eeb8f64bb56f88dbd081081499b0bef6","exceptions-0.10.7","http-client-0.7.16-08ac6af6261aa24f586bbb528e8ea2f0bd2e7510d1883948d770173e7ea8b633","http-types-0.12.4-0f52a9ec33f3c65ef0b77ad8ce14b65f9164f8a761e42800dc9c80ee1768aacc","memory-0.18.0-273ad672f1703dee0dfe07994633c93d17f815a149738659ef6afa30cbe4f6a8","network-3.1.4.0-9d41c9df77e8d21da5aaf51c19540d3c0fc11e5e2c2940bea5411915b8a462ff","network-uri-2.6.4.2-d62d36021f4a84b02c9243cbe37e9dfd5b7ba840b4aaedb5e002f05582564fc4","text-2.0.2","tls-2.0.1-b47e0fd7dac1558b195f1752f4ccbcc31081e04ec060bb63474359a715d7657d","transformers-0.6.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"http-conduit-2.3.8.3-4ad7853d8f1fc07a23d239e66fd76a570e24733747408dace515a7e5a7be3940","pkg-name":"http-conduit","pkg-version":"2.3.8.3","flags":{"aeson":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"82f7d4d5d1d4d9bf99c008ee91c221952560096161c77577fa941e799d3d3677","pkg-src-sha256":"6a5109528a2d2a795bac6a7de9486436a7f09d2d3b8949af11b5372bd9ddd7f4","depends":["aeson-2.2.1.0-2595d249b227784b9febcd5a91568775f66fd262ac45c82c44f7b4a55e9d4c27","attoparsec-0.14.4-5061b5f729de9f72f69961345d54e0249a28df7c232bb9cf2b0525b6f17a253a","attoparsec-aeson-2.2.0.1-768c79d04d1cb0ad1b116957e8c9aabf909372ca2c907dc42310e8efd0a37a03","base-4.18.2.0","bytestring-0.11.5.3","conduit-1.3.5-96fa916ebd7a150aa66076e6ed1e4a9d7982e51658f9fd750ad31ce33c46afd7","conduit-extra-1.3.6-a9b74b7c97cb9e39e8f4262bfd1952b446fe950cb07e127ba073c16301e30755","http-client-0.7.16-08ac6af6261aa24f586bbb528e8ea2f0bd2e7510d1883948d770173e7ea8b633","http-client-tls-0.3.6.3-67f7c5e1b646b6720d31cd47b325354e5e9c257cef0d9522c9b4a5648422c65e","http-types-0.12.4-0f52a9ec33f3c65ef0b77ad8ce14b65f9164f8a761e42800dc9c80ee1768aacc","mtl-2.3.1","resourcet-1.3.0-0f210c6e8ffe9f595ad8fd1a6cf6726e42a6695abb7febee22452f40436a2bc5","transformers-0.6.1.0","unliftio-core-0.2.1.0-1e6dce1dfe73ef335e0615b0af7f06b171c3572cf7a04fe671b6cec407b73dee"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"http-date-0.0.11-4d5bd8aa95bbcd52e33572812314a340168d474209374f7c85b86a113b02b6f3","pkg-name":"http-date","pkg-version":"0.0.11","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"b278b07f880705e3b0b073206ad26954548b666d616733c9a6b5d50993f547d4","pkg-src-sha256":"32f923ac1ad9bdfeadce7c52a03c9ba6225ba60dc14137cb1cdf32ea84ccf4d3","depends":["array-0.5.6.0","attoparsec-0.14.4-5061b5f729de9f72f69961345d54e0249a28df7c232bb9cf2b0525b6f17a253a","base-4.18.2.0","bytestring-0.11.5.3","time-1.12.2"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"http-media-0.8.1.1-82ac8def17fc7bb0c409983a665f6b7cccbfddad16ad03396e0ea28fa6b4797e","pkg-name":"http-media","pkg-version":"0.8.1.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"d39d81cac3e183d8a1659efb26e3bcda788721e07058be024a91621c60ed8a6e","pkg-src-sha256":"1920adf31b15d167f60374fbfd0a53a1fbe7820fd7fd459beacf6eb00d03f183","depends":["base-4.18.2.0","bytestring-0.11.5.3","case-insensitive-1.2.1.0-5255eaf892b10e8489fdad145ca833a10864bd951f3e69d04088fbcadf28ec6d","containers-0.6.7","utf8-string-1.0.2-5e8d116496349c38d20293f85d47a22c703548b74e7d267d8d6d20ff907c03cd"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"http-types-0.12.4-0f52a9ec33f3c65ef0b77ad8ce14b65f9164f8a761e42800dc9c80ee1768aacc","pkg-name":"http-types","pkg-version":"0.12.4","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"c8bdda528c9d74dea90effb30958fdacdb09b116c61a63b6f1b233ffea72b776","pkg-src-sha256":"4d4b1bb0cc817e5fef0c9c76c9647f69f4d300c45a105043493eff86381be549","depends":["array-0.5.6.0","base-4.18.2.0","bytestring-0.11.5.3","case-insensitive-1.2.1.0-5255eaf892b10e8489fdad145ca833a10864bd951f3e69d04088fbcadf28ec6d","text-2.0.2"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"http2-5.0.1-751b9c3f95a93da8cddfb732f2965a32e07b1353df03d60f755b561f5ddd83d2","pkg-name":"http2","pkg-version":"5.0.1","flags":{"devel":false,"h2spec":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"3efc2b788a6e76e4f1ae47a29ff6dd6ae0ebf730a607c8fda7a767e98c10a862","pkg-src-sha256":"3bf0f51b8753b7c3f9e80aab6d5af40c49ed3b3c16dc6498c3f1d42301a499d5","depends":["array-0.5.6.0","async-2.2.4-2107e60f1bee7c70ffed77e551ffc7db01e350edd8784cc9493cc782305122d0","base-4.18.2.0","bytestring-0.11.5.3","case-insensitive-1.2.1.0-5255eaf892b10e8489fdad145ca833a10864bd951f3e69d04088fbcadf28ec6d","containers-0.6.7","http-types-0.12.4-0f52a9ec33f3c65ef0b77ad8ce14b65f9164f8a761e42800dc9c80ee1768aacc","network-3.1.4.0-9d41c9df77e8d21da5aaf51c19540d3c0fc11e5e2c2940bea5411915b8a462ff","network-byte-order-0.1.7-6187e46250f032410d7a0260e366b7a19b0a14bfb995a55c702a814854302ac5","network-control-0.0.2-7c769723340179dac91438f2426d2634daade0d81c9bc8565a97df5f0784660c","stm-2.5.1.0","time-manager-0.0.1-bda26b5ab69166d31b9d00a6f11da4ed98f23c5730095e52dea9d4e88200bb30","unix-time-0.4.12-45eb997f2b10c03cbe95532ca065341d046b4309aac2f8aad0358668133acf67","unliftio-0.2.25.0-494677154ed69a76841d775b50166f52e9d0797a41ece2fd3d94e08aebf372f3"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"indexed-profunctors-0.1.1.1-8d925dea1c4443bc16b2bc6a7c10d1b7794d7d65d9ab1d1c3b10993e592e1e9e","pkg-name":"indexed-profunctors","pkg-version":"0.1.1.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"c9beac8df06dda097d9dc7a8d60f9e5fb6ecaf56c40938bb30b132ee09f15c87","pkg-src-sha256":"2e69bb2900bb7e562efffff7bcf3f72daf79f013232ce603263a57595412c398","depends":["base-4.18.2.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"indexed-traversable-0.1.3-8f7210e35c0cb4bf73ec163bed4014cbba70e17aa189447497a492e60990637b","pkg-name":"indexed-traversable","pkg-version":"0.1.3","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"911f96592752ce4ffbeda00b1155dbbfac5135c71d6755ae02c00552819a9b17","pkg-src-sha256":"1d32925fb6f78e3a52a849b29fc4360df51c97be95ba8ac642517d3ff01a53d9","depends":["array-0.5.6.0","base-4.18.2.0","containers-0.6.7","transformers-0.6.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"indexed-traversable-instances-0.1.1.2-23d2e9c28613d77bfd5595533e39512e3e8b808382cee8d422cee021acbf7fc4","pkg-name":"indexed-traversable-instances","pkg-version":"0.1.1.2","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"00d5e3e149e2bee0f7a547e0093294c306d4276e73a619abe7d8e69f7ce03c7b","pkg-src-sha256":"0f9b4e895ccc819f74d15f913c93613cc74cab74dbb05d7e305aa387bdbe374a","depends":["OneTuple-0.4.1.1-8e8d21c288285c8a6e306ca430dcdc949a96b5c76772aaa2b31f79c6abb3541e","base-4.18.2.0","indexed-traversable-0.1.3-8f7210e35c0cb4bf73ec163bed4014cbba70e17aa189447497a492e60990637b","tagged-0.8.8-5d06ce789c37adf39496775b08f7d82bb9509e4c2a3f973b0c868e35bca55ad5","unordered-containers-0.2.20-013ecc3e94c07bd5bdb23da8c9cf4d68ac66e04c4144b4096b291104672db345","vector-0.13.1.0-eb53bdac16f057ad838f4e8cb865b51b400abac71a36dc5bfde93ea1d0859eae"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"insert-ordered-containers-0.2.5.3-3706f6956e9c93eb40f4960ef2def44ebba2c69366f9391e537c47e536d7a5e7","pkg-name":"insert-ordered-containers","pkg-version":"0.2.5.3","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"7648a0e91b0af2ed553d3950f098438b999c50d885781fc256823b7032d7d389","pkg-src-sha256":"f04f6e59795d8e362d15422a62d7c7c48312c2d97d2bc4372002a8a9b9a2436c","depends":["aeson-2.2.1.0-2595d249b227784b9febcd5a91568775f66fd262ac45c82c44f7b4a55e9d4c27","base-4.18.2.0","deepseq-1.4.8.1","hashable-1.4.3.0-17b447e0ce504d4e093d6bf5a9838da3805c7caa5d16355da40827d004febbc8","indexed-traversable-0.1.3-8f7210e35c0cb4bf73ec163bed4014cbba70e17aa189447497a492e60990637b","lens-5.2.3-fd9d842bd7b66c837b8b9d8ed9b74a1913e207465f21d80d3c84691d23c5c119","optics-core-0.4.1.1-f8d9a3ddd3e59e269ad03738aca54bb92446a15ba98a2b4ae8ec19ed7d20df70","optics-extra-0.4.2.1-14425af293a1407bfbe91e7d352b65135de2d1e89bcd3809c37b7b5300219c9f","semigroupoids-6.0.0.1-e83bc6491c75c3522014917ab4d3335127e2ee3b4989f0a49f9791f8bead28c6","text-2.0.2","transformers-0.6.1.0","unordered-containers-0.2.20-013ecc3e94c07bd5bdb23da8c9cf4d68ac66e04c4144b4096b291104672db345"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"integer-conversion-0.1.0.1-8c064ed0d1fb658105e6fb4ccc9c29b5609d33ee30393dfe431660a716d124d0","pkg-name":"integer-conversion","pkg-version":"0.1.0.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"0e57a82635323f015b5d6c242bcfbbeeaa9854fe9c8058e57052254dbb24bb14","pkg-src-sha256":"20ac70cf1cb65458bba2c562c209a8930e45bdb89886182d644d0a457fc46f39","depends":["base-4.18.2.0","bytestring-0.11.5.3","primitive-0.9.0.0-a6aa61bd9fff8d6cfd4880894dd85d8e644fbcf178b2bff38f87569871ea4a0d","text-2.0.2"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"integer-gmp-1.1","pkg-name":"integer-gmp","pkg-version":"1.1","depends":["base-4.18.2.0","ghc-bignum-1.3","ghc-prim-0.10.0"]},{"type":"configured","id":"integer-logarithms-1.0.3.1-49bf09c2474200e80cd296b047116a8ad20403e42301ba2d71d615b2824b3fcd","pkg-name":"integer-logarithms","pkg-version":"1.0.3.1","flags":{"check-bounds":false,"integer-gmp":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"4d0dfc334e64ff57bb1a08717afa4a4a7f28e4cdc46615dd287be31ef63ec00d","pkg-src-sha256":"9b0a9f9fab609b15cd015865721fb05f744a1bc77ae92fd133872de528bbea7f","depends":["array-0.5.6.0","base-4.18.2.0","ghc-bignum-1.3","ghc-prim-0.10.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"invariant-0.6.2-8ec7276e1c699d2bb785b2aeacbc2b3a667b510a0c0b568bb58241106a6d17a2","pkg-name":"invariant","pkg-version":"0.6.2","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"4338158fe36c3ff9ee741eeff79cb886222cab9da3f476071956cb01b0d9bbff","pkg-src-sha256":"c36485e8088a57e9df1a93881211a1c09e8920ce1b14bfa141cac9f75b7ee108","depends":["StateVar-1.2.2-ad33ce876594474d931417853bfd72c6eb94d534a6634dcbf0af13ec95c0e031","array-0.5.6.0","base-4.18.2.0","bifunctors-5.6.1-3bfddc97d0532e0f4bedd1f64454f96744d2fe805f93a5f9e443c2c5e1035ff1","comonad-5.0.8-8505feb1b75f0b6bf19ef9b666132d0031c1214df6db91aab78f0a9def57751c","containers-0.6.7","contravariant-1.5.5-45cb856efb41788f255562487551496b619a1cf555a23fc4a29495fda3e0c50f","ghc-prim-0.10.0","profunctors-5.6.2-8b084a9552445e5776f01a7b42f1722ce1ecf20cf9a8e839007b9baea33b9fa4","stm-2.5.1.0","tagged-0.8.8-5d06ce789c37adf39496775b08f7d82bb9509e4c2a3f973b0c868e35bca55ad5","template-haskell-2.20.0.0","th-abstraction-0.6.0.0-b49a83d27ea2604c7977c309bd302e93941309c5040c248dbdb6b55147976b2b","transformers-0.6.1.0","transformers-compat-0.7.2-15ca92c51f3c4b3e5a349c3cc2a7f406ca01ba50aecd92a631a1c4d508b1230f","unordered-containers-0.2.20-013ecc3e94c07bd5bdb23da8c9cf4d68ac66e04c4144b4096b291104672db345"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"iproute-1.7.12-1154efefaf645ab127d46e471b4ebe1968e3b3f8497cc0b74c21385bb289cbb0","pkg-name":"iproute","pkg-version":"1.7.12","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"85d181599fab8ceebf4c849110ad571bea2834d6c8c95ae7da33856c42453f40","pkg-src-sha256":"f1751d1579fcbc1d9f86d9d1c9ede48cb71cbeb1d7b2043491c6216e4f236b63","depends":["appar-0.1.8-588a61c15c8bd457e6a1dd16deebaeef67d39cbf3527f952054c1230e05fa294","base-4.18.2.0","byteorder-1.0.4-fa2515b96f172f97bd2e2638b538e2286cb035eb8b87892a4857a50c6e738631","bytestring-0.11.5.3","containers-0.6.7","network-3.1.4.0-9d41c9df77e8d21da5aaf51c19540d3c0fc11e5e2c2940bea5411915b8a462ff"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"iso8601-time-0.1.5-613661a1ea46bf04f83cf7f01f86b46eac75038540215814c13f119e8c47a17d","pkg-name":"iso8601-time","pkg-version":"0.1.5","flags":{"new-time":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"4b690a86f4948557c802b5298e07d9076ef4ea7142baaad20c9847a9030a8c40","pkg-src-sha256":"f2cd444b2be68402c773a4b451912817f06d33093aea691b42ebeed3630ff0c8","depends":["base-4.18.2.0","time-1.12.2"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"kan-extensions-5.2.5-60f11eb11e93cf481fad2a42529d0965e7472bd8d512eba70477a626921ed65c","pkg-name":"kan-extensions","pkg-version":"5.2.5","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"fbdba767565f40faf515b044a774cc3b371eb6ce8a082d9f659411cea88698cf","pkg-src-sha256":"b914dccc040caf1d8764b99df1028dad3e4fdf46c262192e54b59c9da66ead22","depends":["adjunctions-4.4.2-f3221dcb76f82009b3161054c42f2ac113ea03b7e3e1a3d9dff315fac6299a27","array-0.5.6.0","base-4.18.2.0","comonad-5.0.8-8505feb1b75f0b6bf19ef9b666132d0031c1214df6db91aab78f0a9def57751c","containers-0.6.7","contravariant-1.5.5-45cb856efb41788f255562487551496b619a1cf555a23fc4a29495fda3e0c50f","distributive-0.6.2.1-70a2f4c4bffafd7749c1d755f27db885f954a9d9be1cd7db8a6e99887121ec8c","free-5.2-841f6f1c7522ed92dbed9d024b48671e79a9cdd76652f8bdbf9c0e63908771e7","invariant-0.6.2-8ec7276e1c699d2bb785b2aeacbc2b3a667b510a0c0b568bb58241106a6d17a2","mtl-2.3.1","profunctors-5.6.2-8b084a9552445e5776f01a7b42f1722ce1ecf20cf9a8e839007b9baea33b9fa4","semigroupoids-6.0.0.1-e83bc6491c75c3522014917ab4d3335127e2ee3b4989f0a49f9791f8bead28c6","tagged-0.8.8-5d06ce789c37adf39496775b08f7d82bb9509e4c2a3f973b0c868e35bca55ad5","transformers-0.6.1.0","transformers-compat-0.7.2-15ca92c51f3c4b3e5a349c3cc2a7f406ca01ba50aecd92a631a1c4d508b1230f"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"lens-5.2.3-fd9d842bd7b66c837b8b9d8ed9b74a1913e207465f21d80d3c84691d23c5c119","pkg-name":"lens","pkg-version":"5.2.3","flags":{"benchmark-uniplate":false,"dump-splices":false,"inlining":true,"j":false,"test-hunit":true,"test-properties":true,"test-templates":true,"trustworthy":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"637287c76adff383063b3206a4213640de1a74839ec16008cc71b5b407f7d05e","pkg-src-sha256":"df1e8ca8dd89d884994e0c80761a972088326fa43ed5d47c01b14abb710b994d","depends":["array-0.5.6.0","assoc-1.1-44564689989a4d2721c54fe7433f3b2450e556c3fe6c52752ad54623647f561c","base-4.18.2.0","base-orphans-0.9.1-61d128d6a3318593c785a97751f2418cc86b42b03e2b46ed92e9b27fc5da689c","bifunctors-5.6.1-3bfddc97d0532e0f4bedd1f64454f96744d2fe805f93a5f9e443c2c5e1035ff1","bytestring-0.11.5.3","call-stack-0.4.0-a0fd887e5d06d11a75269d5dfed7da6fe2656edbbd7cc1697fb2a2b8ad4fe392","comonad-5.0.8-8505feb1b75f0b6bf19ef9b666132d0031c1214df6db91aab78f0a9def57751c","containers-0.6.7","contravariant-1.5.5-45cb856efb41788f255562487551496b619a1cf555a23fc4a29495fda3e0c50f","distributive-0.6.2.1-70a2f4c4bffafd7749c1d755f27db885f954a9d9be1cd7db8a6e99887121ec8c","exceptions-0.10.7","filepath-1.4.200.1","free-5.2-841f6f1c7522ed92dbed9d024b48671e79a9cdd76652f8bdbf9c0e63908771e7","ghc-prim-0.10.0","hashable-1.4.3.0-17b447e0ce504d4e093d6bf5a9838da3805c7caa5d16355da40827d004febbc8","indexed-traversable-0.1.3-8f7210e35c0cb4bf73ec163bed4014cbba70e17aa189447497a492e60990637b","indexed-traversable-instances-0.1.1.2-23d2e9c28613d77bfd5595533e39512e3e8b808382cee8d422cee021acbf7fc4","kan-extensions-5.2.5-60f11eb11e93cf481fad2a42529d0965e7472bd8d512eba70477a626921ed65c","mtl-2.3.1","parallel-3.2.2.0-86a50f94aa82e9af5f21bfb4d27ed83c8cf2231ac3fb348b2b433b2f10943c05","profunctors-5.6.2-8b084a9552445e5776f01a7b42f1722ce1ecf20cf9a8e839007b9baea33b9fa4","reflection-2.1.7-6e3964bab098962c0f1cc95d37584b10d2c12c8d4578f9c794643c142cc40415","semigroupoids-6.0.0.1-e83bc6491c75c3522014917ab4d3335127e2ee3b4989f0a49f9791f8bead28c6","strict-0.5-84b2c7152a9fd6aee3e1d1082edade7580c5af3226a0afc18e19724ada9d7fe4","tagged-0.8.8-5d06ce789c37adf39496775b08f7d82bb9509e4c2a3f973b0c868e35bca55ad5","template-haskell-2.20.0.0","text-2.0.2","th-abstraction-0.6.0.0-b49a83d27ea2604c7977c309bd302e93941309c5040c248dbdb6b55147976b2b","these-1.2-a7d4e934136841dac2b8ed0dc77fee3f581d8c4e25fe99bdad5b76406c57bf16","transformers-0.6.1.0","transformers-compat-0.7.2-15ca92c51f3c4b3e5a349c3cc2a7f406ca01ba50aecd92a631a1c4d508b1230f","unordered-containers-0.2.20-013ecc3e94c07bd5bdb23da8c9cf4d68ac66e04c4144b4096b291104672db345","vector-0.13.1.0-eb53bdac16f057ad838f4e8cb865b51b400abac71a36dc5bfde93ea1d0859eae"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"libsodium-bindings-0.0.1.1-203ee47d320ef77833137696f6f56e75297ffec7d7a2503d46941bdb48c428b0","pkg-name":"libsodium-bindings","pkg-version":"0.0.1.1","flags":{"homebrew-libsodium":false,"use-pkg-config":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"1fb61987c7c70cd3f203b66b54370d8bce7382d8204452cf32aca780700dcb35","pkg-src-sha256":"aaada3df0291c982ee4d65975ad0332aa6cb72875c7d0feb5023d07c08d7d33d","depends":["base-4.18.2.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"lifted-async-0.10.2.5-0e5383cde07ceba316c6eb9f965038eb2ea32a6c803d5b96f22bdcdba63bfe14","pkg-name":"lifted-async","pkg-version":"0.10.2.5","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"2025bfa72a42232b5dee72ed16440762996415c912e6a26957fbaa7bd79cc0a3","pkg-src-sha256":"16a0d603a220724c013270cad78f56b8fc23ca428a9df844061ad32bc6961ed2","depends":["async-2.2.4-2107e60f1bee7c70ffed77e551ffc7db01e350edd8784cc9493cc782305122d0","base-4.18.2.0","constraints-0.14-ab15a9f94938365a9f7a935af490e603978d84c5e110ef254a28de6613181c00","lifted-base-0.2.3.12-40327bf54bf51ef75eab04e6e7c88e46b7f1de3255d1ec5ed76d02fc71c9cdf5","monad-control-1.0.3.1-2bf3452c923aa94707518b6d970f4377279fd8c4ccca1256725eef18b6097440","transformers-base-0.4.6-91c64a4b19c3f5f9f196345e9032803d52322bd0857ba94ea6c4260a27a2ff07"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"lifted-base-0.2.3.12-40327bf54bf51ef75eab04e6e7c88e46b7f1de3255d1ec5ed76d02fc71c9cdf5","pkg-name":"lifted-base","pkg-version":"0.2.3.12","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"e94ad0692c9c5d85c373e508f23654f2da8ac8c3e475c2b65ffbc04fb165ad69","pkg-src-sha256":"c134a95f56750aae806e38957bb03c59627cda16034af9e00a02b699474317c5","depends":["base-4.18.2.0","monad-control-1.0.3.1-2bf3452c923aa94707518b6d970f4377279fd8c4ccca1256725eef18b6097440","transformers-base-0.4.6-91c64a4b19c3f5f9f196345e9032803d52322bd0857ba94ea6c4260a27a2ff07"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"lockfree-queue-0.2.4-db50ab392a0002236dd2987e766180a4fb8a8cc2c59dcf98973caca190b12610","pkg-name":"lockfree-queue","pkg-version":"0.2.4","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"156e7ccc193fc5d8b43f065e9cd31c3171c79ec25863283d546900d92930846d","pkg-src-sha256":"a0f6770cdcbe0c4f86ba2a498af06933db615d83ff5457a1750f733f6ef399ee","depends":["abstract-deque-0.3-58da01f2d5856552665a639ed7e62652de2627cfca39d756a0f29f4265e71d1b","atomic-primops-0.8.5-619a7ba3c59ea074ae39e3adf75904b21a27146e973f334ea4ab876a9cc1e3c2","base-4.18.2.0","ghc-prim-0.10.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"log-base-0.12.0.1-f6c93830f52a9d5925fa4be3f430d1262c4e2bbf3222e6a925872b2eec0a9d75","pkg-name":"log-base","pkg-version":"0.12.0.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"cd22a5277c58117aef574a846afd6cad17dfec3e505da6c03662246fdd9ee7b0","pkg-src-sha256":"44e37f318de0f415eff5116d1614e5c0ec6ba41acf690f072bf8f8f726872c08","depends":["aeson-2.2.1.0-2595d249b227784b9febcd5a91568775f66fd262ac45c82c44f7b4a55e9d4c27","aeson-pretty-0.8.10-9bd6a60b424b6a69fcd0507ef3b99938ee971580bc5bfa89249b16ff60b2c117","base-4.18.2.0","bytestring-0.11.5.3","deepseq-1.4.8.1","exceptions-0.10.7","mmorph-1.2.0-967f2a66454abded96663c19c27c375e74faace9a8cd232a9ae738ec2604ffa1","monad-control-1.0.3.1-2bf3452c923aa94707518b6d970f4377279fd8c4ccca1256725eef18b6097440","mtl-2.3.1","semigroups-0.20-b7dd1b9febe28a509d4e029a8add1506aac955b99fce2599f25e63f8127812a9","stm-2.5.1.0","text-2.0.2","time-1.12.2","transformers-base-0.4.6-91c64a4b19c3f5f9f196345e9032803d52322bd0857ba94ea6c4260a27a2ff07","unliftio-core-0.2.1.0-1e6dce1dfe73ef335e0615b0af7f06b171c3572cf7a04fe671b6cec407b73dee","unordered-containers-0.2.20-013ecc3e94c07bd5bdb23da8c9cf4d68ac66e04c4144b4096b291104672db345"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"log-effectful-1.0.0.0-1daa99a173049071f9677770e30ef537619d4b74217444ebd179050ac6230f31","pkg-name":"log-effectful","pkg-version":"1.0.0.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"126f328c9325c10998289378191dc69e55b5ffdc37a7845f2d0ee57f6f13392e","pkg-src-sha256":"5dff1f43d29299efb8de1a186c0798009b8146b451c31365cc0bb0fbe0fe20a6","depends":["base-4.18.2.0","effectful-core-2.3.0.1-011d84ab0bc8bb2010bac83565500e3039592cab57d902e9a2a502684b92d90f","log-base-0.12.0.1-f6c93830f52a9d5925fa4be3f430d1262c4e2bbf3222e6a925872b2eec0a9d75","text-2.0.2","time-1.12.2"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"lucid-2.11.20230408-181c7ed44fa9b37af3ac434ed53e16dbe6a7ca9ec7ef1f7e5c921196d628f3c0","pkg-name":"lucid","pkg-version":"2.11.20230408","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"1a3bd496343dd314e2e4937ae7ae63f819a6f6ddd42a3177075712d7d35963bd","pkg-src-sha256":"0f112990fee9c5b1c62c64c926147272534781ed8a7225d39dd0248a670f441d","depends":["base-4.18.2.0","blaze-builder-0.4.2.3-60676f992d653075aeba6aad80b2dd0b054859608a5712ecfc9d4a4968aefdb8","bytestring-0.11.5.3","containers-0.6.7","hashable-1.4.3.0-17b447e0ce504d4e093d6bf5a9838da3805c7caa5d16355da40827d004febbc8","mmorph-1.2.0-967f2a66454abded96663c19c27c375e74faace9a8cd232a9ae738ec2604ffa1","mtl-2.3.1","text-2.0.2","transformers-0.6.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"lucid-alpine-0.1.0.7-b7f14424060b05c5c69e15f1069098caf1990249242463a26aa1a08d9cb5e98c","pkg-name":"lucid-alpine","pkg-version":"0.1.0.7","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"0f62a7bf2c4c97fa3a30cbeae84526e6f98dcbc4df35519f2044edc7a0d1f6ad","pkg-src-sha256":"fd7919480fa483ce19ac5c8774eac78ed541f62be12d36d690fcd8b8baacccdc","depends":["base-4.18.2.0","lucid-2.11.20230408-181c7ed44fa9b37af3ac434ed53e16dbe6a7ca9ec7ef1f7e5c921196d628f3c0","text-2.0.2"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"lucid-alpine-0.1.0.7-e-lucid-alpine-exe-4fb5011bfc617e99d75df24c8bbbadc3b290cd02eeb350e6355203ac92a8462e","pkg-name":"lucid-alpine","pkg-version":"0.1.0.7","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"0f62a7bf2c4c97fa3a30cbeae84526e6f98dcbc4df35519f2044edc7a0d1f6ad","pkg-src-sha256":"fd7919480fa483ce19ac5c8774eac78ed541f62be12d36d690fcd8b8baacccdc","depends":["base-4.18.2.0","lucid-2.11.20230408-181c7ed44fa9b37af3ac434ed53e16dbe6a7ca9ec7ef1f7e5c921196d628f3c0","lucid-alpine-0.1.0.7-b7f14424060b05c5c69e15f1069098caf1990249242463a26aa1a08d9cb5e98c","text-2.0.2"],"exe-depends":[],"component-name":"exe:lucid-alpine-exe","bin-file":"/home/hecate/Projects/Flora/1-flora-server/_build/cabal-store/ghc-9.6.4/lucid-alpine-0.1.0.7-e-lucid-alpine-exe-4fb5011bfc617e99d75df24c8bbbadc3b290cd02eeb350e6355203ac92a8462e/bin/lucid-alpine-exe"},{"type":"configured","id":"lucid-svg-0.7.1.1-2b919f949d217797fe4a4bf74b5ae72e72599c4304e6d78dc5d24024c6bb957f","pkg-name":"lucid-svg","pkg-version":"0.7.1.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"52f3842a4fdec8a0f2661b437305fbedae480568428daef93aead58a91ef2c67","pkg-src-sha256":"2dbb8f0575ec7a731442a449d86437e997626d07a1bb2516e20c95baac93d19b","depends":["base-4.18.2.0","blaze-builder-0.4.2.3-60676f992d653075aeba6aad80b2dd0b054859608a5712ecfc9d4a4968aefdb8","lucid-2.11.20230408-181c7ed44fa9b37af3ac434ed53e16dbe6a7ca9ec7ef1f7e5c921196d628f3c0","text-2.0.2","transformers-0.6.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"megaparsec-9.6.1-ff48fb0fe697114f4c52b8871db38a94f339b62ffe366244b49c58b0b23ad4a5","pkg-name":"megaparsec","pkg-version":"9.6.1","flags":{"dev":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"8d8f8ee5aca5d5c16aa4219afd13687ceab8be640f40ba179359f2b42a628241","pkg-src-sha256":"a32257be847dbe71ac22d512ab115f9ce26fa08bcdbea7ca8b5256a1700dcbff","depends":["base-4.18.2.0","bytestring-0.11.5.3","case-insensitive-1.2.1.0-5255eaf892b10e8489fdad145ca833a10864bd951f3e69d04088fbcadf28ec6d","containers-0.6.7","deepseq-1.4.8.1","mtl-2.3.1","parser-combinators-1.3.0-702f2638f70c15b6b5b11fbe7dcdd3e6d0d73f0193261f85b4d42c011d1949f6","scientific-0.3.7.0-ad7c6f4dff0f6cf6540942c40157e54f8c090b5d960104c70801b0a2f7c99215","text-2.0.2","transformers-0.6.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"memory-0.18.0-273ad672f1703dee0dfe07994633c93d17f815a149738659ef6afa30cbe4f6a8","pkg-name":"memory","pkg-version":"0.18.0","flags":{"support_bytestring":true,"support_deepseq":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"e12bde756b01c1a28c62e46f0f8433c4890898051a786794a7d88907ca14abca","pkg-src-sha256":"fd4eb6f638e24b81b4e6cdd68772a531726f2f67686c8969d3407d82f7862e3e","depends":["base-4.18.2.0","basement-0.0.16-2ba9d181df7bdd547d6fedd5acdec581f03e379e22b0e08ff998fb0462257d08","bytestring-0.11.5.3","deepseq-1.4.8.1","ghc-prim-0.10.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"microlens-0.4.13.1-7fc67fa4a915fe46c53bdefdd38fdb5fc86a0fe5166c99a699781b2db9bc2c2f","pkg-name":"microlens","pkg-version":"0.4.13.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"fc256e2b5d78e8e4f39b3dd359c57b8c19df50853a86eaf8f154a17441a5a51d","pkg-src-sha256":"0a54abee8ff4f6aeb4bea0783409a3dbd28a4e7a892bac916b0fb6a71382d7fc","depends":["base-4.18.2.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"mime-types-0.1.2.0-3d20aa710271c28a90c1e88feb88ab239804502c494312d5102d19e4b368709f","pkg-name":"mime-types","pkg-version":"0.1.2.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"3ddd330c16da943651db37e237d44dc0593ef9b1a63d39e98a48811644615bf6","pkg-src-sha256":"013ae48a4c1726a4f91a64e882f3fe1fb903a7d4b8c14da51286fe5e4b974f61","depends":["base-4.18.2.0","bytestring-0.11.5.3","containers-0.6.7","text-2.0.2"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"mmorph-1.2.0-967f2a66454abded96663c19c27c375e74faace9a8cd232a9ae738ec2604ffa1","pkg-name":"mmorph","pkg-version":"1.2.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"df9b213ec18f811cb3137b478d148f3f1680ee43f841cb775835fa282fdb0295","pkg-src-sha256":"61338058eb676b466a462ca45d59f436a77a3bd6b816e4268c6d88522b6a4280","depends":["base-4.18.2.0","mtl-2.3.1","transformers-0.6.1.0","transformers-compat-0.7.2-15ca92c51f3c4b3e5a349c3cc2a7f406ca01ba50aecd92a631a1c4d508b1230f"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"modern-uri-0.3.6.1-c2deadb57eaf5495142288d2ce86c3ffbf3db59eea2c3ffe34643053cf0d66a0","pkg-name":"modern-uri","pkg-version":"0.3.6.1","flags":{"dev":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"183005f5554c040ea7c0a2c63ef99351594d048ccea3787cb5c3248d15ca1530","pkg-src-sha256":"0246f9cfced1227abe3a6403eeacc6b5f79f7e3319759a4dd1fd341c12454fe9","depends":["QuickCheck-2.14.3-091d344acf9c963200a9b2af6c5417d91912262a9a84b607d918b50fdf8a8b02","base-4.18.2.0","bytestring-0.11.5.3","containers-0.6.7","deepseq-1.4.8.1","exceptions-0.10.7","hashable-1.4.3.0-17b447e0ce504d4e093d6bf5a9838da3805c7caa5d16355da40827d004febbc8","megaparsec-9.6.1-ff48fb0fe697114f4c52b8871db38a94f339b62ffe366244b49c58b0b23ad4a5","mtl-2.3.1","profunctors-5.6.2-8b084a9552445e5776f01a7b42f1722ce1ecf20cf9a8e839007b9baea33b9fa4","reflection-2.1.7-6e3964bab098962c0f1cc95d37584b10d2c12c8d4578f9c794643c142cc40415","tagged-0.8.8-5d06ce789c37adf39496775b08f7d82bb9509e4c2a3f973b0c868e35bca55ad5","template-haskell-2.20.0.0","text-2.0.2"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"monad-control-1.0.3.1-2bf3452c923aa94707518b6d970f4377279fd8c4ccca1256725eef18b6097440","pkg-name":"monad-control","pkg-version":"1.0.3.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"2d657279839e1a760c86a69f00f0c36473ef6972d413ec0f83a40249c70e098e","pkg-src-sha256":"ae0baea04d99375ef788140367179994a7178d400a8ce0d9026846546772713c","depends":["base-4.18.2.0","stm-2.5.1.0","transformers-0.6.1.0","transformers-base-0.4.6-91c64a4b19c3f5f9f196345e9032803d52322bd0857ba94ea6c4260a27a2ff07","transformers-compat-0.7.2-15ca92c51f3c4b3e5a349c3cc2a7f406ca01ba50aecd92a631a1c4d508b1230f"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"monad-logger-0.3.40-9d168f3d26e168d935793595f1fdbe137ac850b43b0a75ed5c41cd97c589de1e","pkg-name":"monad-logger","pkg-version":"0.3.40","flags":{"template_haskell":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"8337b8396d2e1bc414771e68d987f54d6e371bfaad14aa43ed7a41400e44c5ca","pkg-src-sha256":"cbed8667cff6dede6ceac5127bc713b30b700c480fd1405028bd0493f424cea9","depends":["base-4.18.2.0","bytestring-0.11.5.3","conduit-1.3.5-96fa916ebd7a150aa66076e6ed1e4a9d7982e51658f9fd750ad31ce33c46afd7","conduit-extra-1.3.6-a9b74b7c97cb9e39e8f4262bfd1952b446fe950cb07e127ba073c16301e30755","exceptions-0.10.7","fast-logger-3.2.2-f2b66566923a1fa76e5c48eecb73e2ef0a379b38ce325b13b8e81e8022003d26","lifted-base-0.2.3.12-40327bf54bf51ef75eab04e6e7c88e46b7f1de3255d1ec5ed76d02fc71c9cdf5","monad-control-1.0.3.1-2bf3452c923aa94707518b6d970f4377279fd8c4ccca1256725eef18b6097440","monad-loops-0.4.3-7c6b911eed42bfc1b833e8549c1b3cebeb50ddc4be71019205db41fa458f5032","mtl-2.3.1","resourcet-1.3.0-0f210c6e8ffe9f595ad8fd1a6cf6726e42a6695abb7febee22452f40436a2bc5","stm-2.5.1.0","stm-chans-3.0.0.9-577989fa35770d28044d742360c9f0596a5d84e540cf2b1ce7716c9d1fa528e0","template-haskell-2.20.0.0","text-2.0.2","transformers-0.6.1.0","transformers-base-0.4.6-91c64a4b19c3f5f9f196345e9032803d52322bd0857ba94ea6c4260a27a2ff07","transformers-compat-0.7.2-15ca92c51f3c4b3e5a349c3cc2a7f406ca01ba50aecd92a631a1c4d508b1230f","unliftio-core-0.2.1.0-1e6dce1dfe73ef335e0615b0af7f06b171c3572cf7a04fe671b6cec407b73dee"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"monad-loops-0.4.3-7c6b911eed42bfc1b833e8549c1b3cebeb50ddc4be71019205db41fa458f5032","pkg-name":"monad-loops","pkg-version":"0.4.3","flags":{"base4":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"ada4f1295ece07f9a7398bc5b40c4532f95a733a8604d2a2f57f05f878766df2","pkg-src-sha256":"7eaaaf6bc43661e9e86e310ff8c56fbea16eb6bf13c31a2e28103138ac164c18","depends":["base-4.18.2.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"monad-time-0.4.0.0-1b1c52822cdc65b1e9b65bdb86f7b0aec26973256197697f3b44b64ee669d1f7","pkg-name":"monad-time","pkg-version":"0.4.0.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"421f648c30f4bb1b276d3088cf7ee74a45e36d0d12b4a7a542506aa0e301a4e1","pkg-src-sha256":"b4493edf9e7f839cb4ccfcdd53845de493bffbb3ceb4fbb54ba173db68192960","depends":["base-4.18.2.0","mtl-2.3.1","time-1.12.2"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"monad-time-effectful-1.0.0.0-3bcc12595825f15e6c956704de800593d9caa43c86932b7456205b4fcd7a3fee","pkg-name":"monad-time-effectful","pkg-version":"1.0.0.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"4994617545bb4b25ba01eaf2bdb1c2c74f7cefab36945af8eb92dca9842fc4b6","pkg-src-sha256":"693e4222d6252c8607f6ee3e32a0ca949eb8f01eb1e0c46d66b6ddbc517eb5bf","depends":["base-4.18.2.0","effectful-core-2.3.0.1-011d84ab0bc8bb2010bac83565500e3039592cab57d902e9a2a502684b92d90f","monad-time-0.4.0.0-1b1c52822cdc65b1e9b65bdb86f7b0aec26973256197697f3b44b64ee669d1f7","time-1.12.2"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"mono-traversable-1.0.15.3-ee2c72a88a7e0e61e75d356539364a91ed39c83311aa5272b47ebaa5412d78cc","pkg-name":"mono-traversable","pkg-version":"1.0.15.3","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"059bf3c05cdbef2d06b765333fe41c2168ced2503a23de674e2a59ceb2548c48","pkg-src-sha256":"98b220f3313d74227a4249210c8818e839678343e62b3ebb1b8c867cf2b974b7","depends":["base-4.18.2.0","bytestring-0.11.5.3","containers-0.6.7","hashable-1.4.3.0-17b447e0ce504d4e093d6bf5a9838da3805c7caa5d16355da40827d004febbc8","split-0.2.5-f91000d531a43d0958a6d552a0e528a48098723972009db93c4b79044dc4bd51","text-2.0.2","transformers-0.6.1.0","unordered-containers-0.2.20-013ecc3e94c07bd5bdb23da8c9cf4d68ac66e04c4144b4096b291104672db345","vector-0.13.1.0-eb53bdac16f057ad838f4e8cb865b51b400abac71a36dc5bfde93ea1d0859eae","vector-algorithms-0.9.0.1-0d5de6c527fb6ba0e7be854c1685b82a6a99d5798a407e65dc55cac4091e272a"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"mtl-2.3.1","pkg-name":"mtl","pkg-version":"2.3.1","depends":["base-4.18.2.0","transformers-0.6.1.0"]},{"type":"configured","id":"mtl-compat-0.2.2-9b77842584114154ec5c5ab666cf431f0be7716025713aae3e0ce53ce1b7ad9f","pkg-name":"mtl-compat","pkg-version":"0.2.2","flags":{"two-point-one":false,"two-point-two":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"4257fb56e5690734973aad060010bec6c2857f5c1ac6cf87fc335ed3bc7c85f4","pkg-src-sha256":"1955398fe2115674f47f553b2caaf928c6aa3424271a5cd13bc191e54bfe3a9e","depends":["base-4.18.2.0","mtl-2.3.1"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"natural-arithmetic-0.2.1.0-327b3d0462a9fdccd1f5901b636a5c6f1c1996b903146b3f4bf006389c9d4483","pkg-name":"natural-arithmetic","pkg-version":"0.2.1.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"1296ff4149f878df02d15a9b0197c6f27f311d56d478223d7e7935f030e293f0","pkg-src-sha256":"36e6e214473eed1bde1bd390d0b697e0e1b1d9682a9fd6747438836982006d9e","depends":["base-4.18.2.0","unlifted-0.2.2.0-331af0eb9d6315f1de30144f92ea1bd99f7de6c15dd09cf6c2850c461258375e"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"network-3.1.4.0-9d41c9df77e8d21da5aaf51c19540d3c0fc11e5e2c2940bea5411915b8a462ff","pkg-name":"network","pkg-version":"3.1.4.0","flags":{"devel":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"e152cdb03243afb52bbc740cfbe96905ca298a6f6342f0c47b3f2e227ff19def","pkg-src-sha256":"b452a2afac95d9207357eb3820c719c7c7d27871ef4b6ed7bfcd03a036b9158e","components":{"lib":{"depends":["base-4.18.2.0","bytestring-0.11.5.3","deepseq-1.4.8.1","directory-1.3.8.1"],"exe-depends":["hsc2hs-0.68.10-e-hsc2hs-3b4e464e6a657183d9f83bd37c6d876421d9f6d00ca34e12b12ca3365e55159d"]}}},{"type":"configured","id":"network-byte-order-0.1.7-6187e46250f032410d7a0260e366b7a19b0a14bfb995a55c702a814854302ac5","pkg-name":"network-byte-order","pkg-version":"0.1.7","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"3b6e875fe2f363817b157ecc9c45411ac84544bfa4a30364943e49e817db7fdf","pkg-src-sha256":"480ce0ad7f67364ec8d4ce8d815f463d9e4074e3789be22a5722cfdebed08679","depends":["base-4.18.2.0","bytestring-0.11.5.3"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"network-control-0.0.2-7c769723340179dac91438f2426d2634daade0d81c9bc8565a97df5f0784660c","pkg-name":"network-control","pkg-version":"0.0.2","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"b30f0dc9635a6b1ebda2f77785cec2afef909edecbc2a101d25bcd2b89b5bd99","pkg-src-sha256":"134e9c6f309641bfbb508d8c3957bca76a2715e71138f4c058dba675b06326d4","depends":["base-4.18.2.0","psqueues-0.2.8.0-3b5625b932d73ea3cc0319c7b0eff1a4b49b3ba87f855df869f83ada38fcc584","unix-time-0.4.12-45eb997f2b10c03cbe95532ca065341d046b4309aac2f8aad0358668133acf67"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"network-info-0.2.1-cbd12ac17ed981e872c92e3a8fd70b4ca80c64afdcc8cd7ebfd75eaa846f81c9","pkg-name":"network-info","pkg-version":"0.2.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"2798c2e4cc2c32108bd4b05efa921ce6f054ebc381c5e465c9bd74c7d538af17","pkg-src-sha256":"9b2d88312fc8280351d5003200cc07decbb865f85d3aa7b1094b238bd6a8b404","depends":["base-4.18.2.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"network-uri-2.6.4.2-d62d36021f4a84b02c9243cbe37e9dfd5b7ba840b4aaedb5e002f05582564fc4","pkg-name":"network-uri","pkg-version":"2.6.4.2","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"6fffb57373962b5651a2db8b0af732098b3bf029a7ced76a9855615de2026588","pkg-src-sha256":"9c188973126e893250b881f20e8811dca06c223c23402b06f7a1f2e995797228","depends":["base-4.18.2.0","deepseq-1.4.8.1","parsec-3.1.16.1","template-haskell-2.20.0.0","th-compat-0.1.4-102530325c2b6ccd251d9c304ca6729eb04836a98ab4cdda25fa565147ccb66e"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"odd-jobs-0.2.3-2ea7e869e131ba9271dc166fb94494d9c4695adf80a10aeb2c6885388c248e44","pkg-name":"odd-jobs","pkg-version":"0.2.3","flags":{},"style":"global","pkg-src":{"type":"source-repo","source-repo":{"type":"git","location":"https://github.com/saurabhnanda/odd-jobs","tag":"411d5d0"}},"pkg-src-sha256":"9276e626c2d938fb0880b134b7dc4b9482db3dce26787821f74d99482afe4e47","depends":["aeson-2.2.1.0-2595d249b227784b9febcd5a91568775f66fd262ac45c82c44f7b4a55e9d4c27","async-2.2.4-2107e60f1bee7c70ffed77e551ffc7db01e350edd8784cc9493cc782305122d0","base-4.18.2.0","bytestring-0.11.5.3","containers-0.6.7","directory-1.3.8.1","either-5.0.2-d8d7bb84305283af81161a95ec2aebe67483cc07c71e171fc392eccfafdfb663","fast-logger-3.2.2-f2b66566923a1fa76e5c48eecb73e2ef0a379b38ce325b13b8e81e8022003d26","filepath-1.4.200.1","friendly-time-0.4.1-abf55dee5aabd3d8d1a3bf852e9269ad8c33f771fd59ecb030b252f999bd9e16","generic-deriving-1.14.5-a1fd2d043c8cafb22abedc758c45dbc284b28f5354f3eb1c717c80c43a96a9e6","hdaemonize-0.5.7-554f4deed801598a70abe3e63685f792ae09fe10e60f21faf1abe49687142f9f","hostname-1.0-5085af94c98cc8316318de7e81d25ddb5a73601cfd27bfccc90a5b913cd9891b","lucid-2.11.20230408-181c7ed44fa9b37af3ac434ed53e16dbe6a7ca9ec7ef1f7e5c921196d628f3c0","monad-control-1.0.3.1-2bf3452c923aa94707518b6d970f4377279fd8c4ccca1256725eef18b6097440","monad-logger-0.3.40-9d168f3d26e168d935793595f1fdbe137ac850b43b0a75ed5c41cd97c589de1e","mtl-2.3.1","optparse-applicative-0.18.1.0-1de8f12cfc2915bc6d323ba97415a7e0795036a6b613e7301735aedf9d0425be","postgresql-simple-0.6.5.1-ec621799555c8b1b15b3683ac92cdc3770e891696c7afc3195aa6f26571cbbe0","resource-pool-0.4.0.0-b943f9aab32b14d553510f77b995882007d913763eb4c8a34a077c78a8909098","safe-0.3.21-31bf385773e1c6ef212139e0505190c20d1e3d1af99bcbfc189c01c3a1e0e739","servant-0.20.1-b63507222e1b19c7b8333551fd2fbdae76248ba97753767f7ab4d32b7816d39d","servant-lucid-0.9.0.6-3245f97c511011e42d95122d5373c12ebeb20de76226f6491768d04935bf6b52","servant-server-0.20-3dbcc60207566a1f80874e61a86b73ab8a41f98f3231692dec244b2ce96f8132","servant-static-th-1.0.0.0-fa0f3ab3712e7a8402c328f207cfc41d9d7c81ead2eb76b54e22775de96a15db","string-conv-0.2.0-2b20138e5715fec3a0be370b62f70071e607c80729c0151ebac083484fb380fb","text-2.0.2","text-conversions-0.3.1.1-b955b2970b27e7be4b7afdac05f3480d3269bc092ad183c3d72cd22fe91a90cd","time-1.12.2","timing-convenience-0.1-532d7dc3aaa5fc1300afadca7cc392ec1bf3c6b6c0600c8609536b7b4d87e195","unix-2.8.4.0","unliftio-0.2.25.0-494677154ed69a76841d775b50166f52e9d0797a41ece2fd3d94e08aebf372f3","unliftio-core-0.2.1.0-1e6dce1dfe73ef335e0615b0af7f06b171c3572cf7a04fe671b6cec407b73dee","unordered-containers-0.2.20-013ecc3e94c07bd5bdb23da8c9cf4d68ac66e04c4144b4096b291104672db345","wai-3.2.4-acf062ae483a435740bc88b21ee81f62d3f94a62faea15a5bf17463ace439645","warp-3.3.31-3a081a14799ab48e5efe3a315077d1e89ea4da61799497b4990d5fc7e0dcb380"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"odd-jobs-0.2.3-e-devel-b12e6088114ebd4e8a5f5b848d0e940855c41da1b623872663251e9109531a2c","pkg-name":"odd-jobs","pkg-version":"0.2.3","flags":{},"style":"global","pkg-src":{"type":"source-repo","source-repo":{"type":"git","location":"https://github.com/saurabhnanda/odd-jobs","tag":"411d5d0"}},"pkg-src-sha256":"9276e626c2d938fb0880b134b7dc4b9482db3dce26787821f74d99482afe4e47","depends":["aeson-2.2.1.0-2595d249b227784b9febcd5a91568775f66fd262ac45c82c44f7b4a55e9d4c27","async-2.2.4-2107e60f1bee7c70ffed77e551ffc7db01e350edd8784cc9493cc782305122d0","base-4.18.2.0","bytestring-0.11.5.3","containers-0.6.7","directory-1.3.8.1","either-5.0.2-d8d7bb84305283af81161a95ec2aebe67483cc07c71e171fc392eccfafdfb663","fast-logger-3.2.2-f2b66566923a1fa76e5c48eecb73e2ef0a379b38ce325b13b8e81e8022003d26","filepath-1.4.200.1","foreign-store-0.2-38a004231d79ea11822d0929a9cc1c95c0b47fcefc2bf90dbf83bf2d93adaf90","friendly-time-0.4.1-abf55dee5aabd3d8d1a3bf852e9269ad8c33f771fd59ecb030b252f999bd9e16","generic-deriving-1.14.5-a1fd2d043c8cafb22abedc758c45dbc284b28f5354f3eb1c717c80c43a96a9e6","hdaemonize-0.5.7-554f4deed801598a70abe3e63685f792ae09fe10e60f21faf1abe49687142f9f","hostname-1.0-5085af94c98cc8316318de7e81d25ddb5a73601cfd27bfccc90a5b913cd9891b","lucid-2.11.20230408-181c7ed44fa9b37af3ac434ed53e16dbe6a7ca9ec7ef1f7e5c921196d628f3c0","monad-control-1.0.3.1-2bf3452c923aa94707518b6d970f4377279fd8c4ccca1256725eef18b6097440","monad-logger-0.3.40-9d168f3d26e168d935793595f1fdbe137ac850b43b0a75ed5c41cd97c589de1e","mtl-2.3.1","odd-jobs-0.2.3-2ea7e869e131ba9271dc166fb94494d9c4695adf80a10aeb2c6885388c248e44","optparse-applicative-0.18.1.0-1de8f12cfc2915bc6d323ba97415a7e0795036a6b613e7301735aedf9d0425be","postgresql-simple-0.6.5.1-ec621799555c8b1b15b3683ac92cdc3770e891696c7afc3195aa6f26571cbbe0","resource-pool-0.4.0.0-b943f9aab32b14d553510f77b995882007d913763eb4c8a34a077c78a8909098","safe-0.3.21-31bf385773e1c6ef212139e0505190c20d1e3d1af99bcbfc189c01c3a1e0e739","servant-0.20.1-b63507222e1b19c7b8333551fd2fbdae76248ba97753767f7ab4d32b7816d39d","servant-lucid-0.9.0.6-3245f97c511011e42d95122d5373c12ebeb20de76226f6491768d04935bf6b52","servant-server-0.20-3dbcc60207566a1f80874e61a86b73ab8a41f98f3231692dec244b2ce96f8132","servant-static-th-1.0.0.0-fa0f3ab3712e7a8402c328f207cfc41d9d7c81ead2eb76b54e22775de96a15db","string-conv-0.2.0-2b20138e5715fec3a0be370b62f70071e607c80729c0151ebac083484fb380fb","text-2.0.2","text-conversions-0.3.1.1-b955b2970b27e7be4b7afdac05f3480d3269bc092ad183c3d72cd22fe91a90cd","time-1.12.2","timing-convenience-0.1-532d7dc3aaa5fc1300afadca7cc392ec1bf3c6b6c0600c8609536b7b4d87e195","unix-2.8.4.0","unliftio-0.2.25.0-494677154ed69a76841d775b50166f52e9d0797a41ece2fd3d94e08aebf372f3","unliftio-core-0.2.1.0-1e6dce1dfe73ef335e0615b0af7f06b171c3572cf7a04fe671b6cec407b73dee","unordered-containers-0.2.20-013ecc3e94c07bd5bdb23da8c9cf4d68ac66e04c4144b4096b291104672db345","wai-3.2.4-acf062ae483a435740bc88b21ee81f62d3f94a62faea15a5bf17463ace439645","warp-3.3.31-3a081a14799ab48e5efe3a315077d1e89ea4da61799497b4990d5fc7e0dcb380"],"exe-depends":[],"component-name":"exe:devel","bin-file":"/home/hecate/Projects/Flora/1-flora-server/_build/cabal-store/ghc-9.6.4/odd-jobs-0.2.3-e-devel-b12e6088114ebd4e8a5f5b848d0e940855c41da1b623872663251e9109531a2c/bin/devel"},{"type":"configured","id":"odd-jobs-0.2.3-e-odd-jobs-cli-example-b48478a9ae62e6e29ddf07360cc7cfb1595f39f470dd278891aa0af1d0aeb51a","pkg-name":"odd-jobs","pkg-version":"0.2.3","flags":{},"style":"global","pkg-src":{"type":"source-repo","source-repo":{"type":"git","location":"https://github.com/saurabhnanda/odd-jobs","tag":"411d5d0"}},"pkg-src-sha256":"9276e626c2d938fb0880b134b7dc4b9482db3dce26787821f74d99482afe4e47","depends":["aeson-2.2.1.0-2595d249b227784b9febcd5a91568775f66fd262ac45c82c44f7b4a55e9d4c27","async-2.2.4-2107e60f1bee7c70ffed77e551ffc7db01e350edd8784cc9493cc782305122d0","base-4.18.2.0","bytestring-0.11.5.3","directory-1.3.8.1","either-5.0.2-d8d7bb84305283af81161a95ec2aebe67483cc07c71e171fc392eccfafdfb663","fast-logger-3.2.2-f2b66566923a1fa76e5c48eecb73e2ef0a379b38ce325b13b8e81e8022003d26","filepath-1.4.200.1","friendly-time-0.4.1-abf55dee5aabd3d8d1a3bf852e9269ad8c33f771fd59ecb030b252f999bd9e16","generic-deriving-1.14.5-a1fd2d043c8cafb22abedc758c45dbc284b28f5354f3eb1c717c80c43a96a9e6","hdaemonize-0.5.7-554f4deed801598a70abe3e63685f792ae09fe10e60f21faf1abe49687142f9f","hostname-1.0-5085af94c98cc8316318de7e81d25ddb5a73601cfd27bfccc90a5b913cd9891b","lucid-2.11.20230408-181c7ed44fa9b37af3ac434ed53e16dbe6a7ca9ec7ef1f7e5c921196d628f3c0","monad-control-1.0.3.1-2bf3452c923aa94707518b6d970f4377279fd8c4ccca1256725eef18b6097440","monad-logger-0.3.40-9d168f3d26e168d935793595f1fdbe137ac850b43b0a75ed5c41cd97c589de1e","mtl-2.3.1","odd-jobs-0.2.3-2ea7e869e131ba9271dc166fb94494d9c4695adf80a10aeb2c6885388c248e44","optparse-applicative-0.18.1.0-1de8f12cfc2915bc6d323ba97415a7e0795036a6b613e7301735aedf9d0425be","postgresql-simple-0.6.5.1-ec621799555c8b1b15b3683ac92cdc3770e891696c7afc3195aa6f26571cbbe0","resource-pool-0.4.0.0-b943f9aab32b14d553510f77b995882007d913763eb4c8a34a077c78a8909098","safe-0.3.21-31bf385773e1c6ef212139e0505190c20d1e3d1af99bcbfc189c01c3a1e0e739","servant-0.20.1-b63507222e1b19c7b8333551fd2fbdae76248ba97753767f7ab4d32b7816d39d","servant-lucid-0.9.0.6-3245f97c511011e42d95122d5373c12ebeb20de76226f6491768d04935bf6b52","servant-server-0.20-3dbcc60207566a1f80874e61a86b73ab8a41f98f3231692dec244b2ce96f8132","servant-static-th-1.0.0.0-fa0f3ab3712e7a8402c328f207cfc41d9d7c81ead2eb76b54e22775de96a15db","string-conv-0.2.0-2b20138e5715fec3a0be370b62f70071e607c80729c0151ebac083484fb380fb","text-2.0.2","text-conversions-0.3.1.1-b955b2970b27e7be4b7afdac05f3480d3269bc092ad183c3d72cd22fe91a90cd","time-1.12.2","timing-convenience-0.1-532d7dc3aaa5fc1300afadca7cc392ec1bf3c6b6c0600c8609536b7b4d87e195","unix-2.8.4.0","unliftio-0.2.25.0-494677154ed69a76841d775b50166f52e9d0797a41ece2fd3d94e08aebf372f3","unliftio-core-0.2.1.0-1e6dce1dfe73ef335e0615b0af7f06b171c3572cf7a04fe671b6cec407b73dee","unordered-containers-0.2.20-013ecc3e94c07bd5bdb23da8c9cf4d68ac66e04c4144b4096b291104672db345","wai-3.2.4-acf062ae483a435740bc88b21ee81f62d3f94a62faea15a5bf17463ace439645","warp-3.3.31-3a081a14799ab48e5efe3a315077d1e89ea4da61799497b4990d5fc7e0dcb380"],"exe-depends":[],"component-name":"exe:odd-jobs-cli-example","bin-file":"/home/hecate/Projects/Flora/1-flora-server/_build/cabal-store/ghc-9.6.4/odd-jobs-0.2.3-e-odd-jobs-cli-example-b48478a9ae62e6e29ddf07360cc7cfb1595f39f470dd278891aa0af1d0aeb51a/bin/odd-jobs-cli-example"},{"type":"configured","id":"old-locale-1.0.0.7-682418540979bf75be932863a87a0db4ab12d3f7ec5faaeba30e4175347cd126","pkg-name":"old-locale","pkg-version":"1.0.0.7","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"fa998be2c7e00cd26a6e9075bea790caaf3932caa3e9497ad69bc20380dd6911","pkg-src-sha256":"dbaf8bf6b888fb98845705079296a23c3f40ee2f449df7312f7f7f1de18d7b50","depends":["base-4.18.2.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"old-time-1.1.0.4-41f5636c376ef03b6ed0709860b733d4263cbb5dd153bb15926d2e3fb2df8cee","pkg-name":"old-time","pkg-version":"1.1.0.4","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"6e3dfb5b1d7cb24ed7ea9bbca1153485ae38fa0534b0581886dd42eeedf82447","pkg-src-sha256":"1e22eb7f7b924a676f52e317917b3b5eeceee11c74ef4bc609c0bcec624c166f","components":{"lib":{"depends":["base-4.18.2.0","old-locale-1.0.0.7-682418540979bf75be932863a87a0db4ab12d3f7ec5faaeba30e4175347cd126"],"exe-depends":["hsc2hs-0.68.10-e-hsc2hs-3b4e464e6a657183d9f83bd37c6d876421d9f6d00ca34e12b12ca3365e55159d"]}}},{"type":"configured","id":"one-time-password-3.0.0.0-cbe2caf30a2aa172cf2c5cdfc1edad8761e857fde6fe8f0adb23c2013d6f8108","pkg-name":"one-time-password","pkg-version":"3.0.0.0","flags":{},"style":"global","pkg-src":{"type":"source-repo","source-repo":{"type":"git","location":"https://github.com/haskell-cryptography/one-time-password","tag":"2ca2313"}},"pkg-src-sha256":"98e30a1469139de37b2ee690a0a745c52465abbe661b292301b70994f838d0e3","depends":["base-4.18.2.0","bytestring-0.11.5.3","cereal-0.5.8.3-930e90604013ce2a32c6d28d3567d1d966e50eb1bf0c18108838f2b4ff0d64ca","chronos-1.1.6.1-e20dbb7d5779b22a2f3541a6e640402e4330514b14ff822947c4209317b25bd6","cryptohash-sha1-0.11.101.0-a3ef13c78463fdd04d9d6245ad7391e038dbf79d9c19ec5ab64f9b19a6fb91a8","network-uri-2.6.4.2-d62d36021f4a84b02c9243cbe37e9dfd5b7ba840b4aaedb5e002f05582564fc4","sel-0.0.1.0-a107cece4307b775602a0ac4fef5e5489f9cf07913069de7b0aebbe27daff576","text-2.0.2","text-display-0.0.5.1-ae9f66e9765923d9edec209058cc153706fead0e7c7287c2994a985da1c39623","torsor-0.1.0.1-264ad98156300f7b86fb968625df8515c2fbbce5479b450f036ac11b2f5c7444"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"openapi3-3.2.4-36a3dd9c34b66f8d7bf989194c80a50284551837b7d8417e8ce95b4a35d15c2e","pkg-name":"openapi3","pkg-version":"3.2.4","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"d3d63e66b1dd9fa0cfffbc271a53a7d8e1647dea14f1f228bde3776740693322","pkg-src-sha256":"dbcb90464b4712a03c37fa3fcaca3a6784ace2794d85730a8a8c5d9b3ea14ba0","components":{"lib":{"depends":["QuickCheck-2.14.3-091d344acf9c963200a9b2af6c5417d91912262a9a84b607d918b50fdf8a8b02","aeson-2.2.1.0-2595d249b227784b9febcd5a91568775f66fd262ac45c82c44f7b4a55e9d4c27","aeson-pretty-0.8.10-9bd6a60b424b6a69fcd0507ef3b99938ee971580bc5bfa89249b16ff60b2c117","base-4.18.2.0","base-compat-batteries-0.13.1-25e7385abd281169497a6f5094374b17c8dd67030772349b80bd82c47b483cae","bytestring-0.11.5.3","containers-0.6.7","cookie-0.4.6-0f17f671a430f9d3670a38aa989d096c8a941ff590a1a1a5bc4f595def792f73","generics-sop-0.5.1.4-7f93bc69a981e910350e3e463cbbc84ff4d890645a9659a18c10b5d43ad5b6aa","hashable-1.4.3.0-17b447e0ce504d4e093d6bf5a9838da3805c7caa5d16355da40827d004febbc8","http-media-0.8.1.1-82ac8def17fc7bb0c409983a665f6b7cccbfddad16ad03396e0ea28fa6b4797e","insert-ordered-containers-0.2.5.3-3706f6956e9c93eb40f4960ef2def44ebba2c69366f9391e537c47e536d7a5e7","lens-5.2.3-fd9d842bd7b66c837b8b9d8ed9b74a1913e207465f21d80d3c84691d23c5c119","mtl-2.3.1","optics-core-0.4.1.1-f8d9a3ddd3e59e269ad03738aca54bb92446a15ba98a2b4ae8ec19ed7d20df70","optics-th-0.4.1-90f0163ff0ce0756a0c2b2710d750aca3af41c9fde2d3cd29f09811f71392eff","scientific-0.3.7.0-ad7c6f4dff0f6cf6540942c40157e54f8c090b5d960104c70801b0a2f7c99215","template-haskell-2.20.0.0","text-2.0.2","time-1.12.2","transformers-0.6.1.0","unordered-containers-0.2.20-013ecc3e94c07bd5bdb23da8c9cf4d68ac66e04c4144b4096b291104672db345","uuid-types-1.0.5.1-c19e00cab51fb72d8874dd99ac787f44fda9996af8117c2d227cfb3294e06a9c","vector-0.13.1.0-eb53bdac16f057ad838f4e8cb865b51b400abac71a36dc5bfde93ea1d0859eae"],"exe-depends":[]},"exe:example":{"depends":["aeson-2.2.1.0-2595d249b227784b9febcd5a91568775f66fd262ac45c82c44f7b4a55e9d4c27","base-4.18.2.0","lens-5.2.3-fd9d842bd7b66c837b8b9d8ed9b74a1913e207465f21d80d3c84691d23c5c119","text-2.0.2"],"exe-depends":[],"bin-file":"/home/hecate/Projects/Flora/1-flora-server/_build/cabal-store/ghc-9.6.4/openapi3-3.2.4-36a3dd9c34b66f8d7bf989194c80a50284551837b7d8417e8ce95b4a35d15c2e/bin/example"},"setup":{"depends":["Cabal-3.10.1.0","base-4.18.2.0","cabal-doctest-1.0.9-4a685fb2745cdab49526ff8fe3801bf6bd4ab5085239033fcfd51613f7e3fd76"],"exe-depends":[]}}},{"type":"configured","id":"optics-core-0.4.1.1-f8d9a3ddd3e59e269ad03738aca54bb92446a15ba98a2b4ae8ec19ed7d20df70","pkg-name":"optics-core","pkg-version":"0.4.1.1","flags":{"explicit-generic-labels":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"45b92b72475c266134bfbdfcb4801df3a6487453e8a6c389623b7161661f8bfa","pkg-src-sha256":"3e817e3c66a0120ac4b4b6d790e659b75f8c0fb27c5f65f3974f4c697b7bb3fb","depends":["array-0.5.6.0","base-4.18.2.0","containers-0.6.7","indexed-profunctors-0.1.1.1-8d925dea1c4443bc16b2bc6a7c10d1b7794d7d65d9ab1d1c3b10993e592e1e9e","indexed-traversable-0.1.3-8f7210e35c0cb4bf73ec163bed4014cbba70e17aa189447497a492e60990637b","transformers-0.6.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"optics-extra-0.4.2.1-14425af293a1407bfbe91e7d352b65135de2d1e89bcd3809c37b7b5300219c9f","pkg-name":"optics-extra","pkg-version":"0.4.2.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"a40b0175bfaba71ac48b00c9eb30b4294dbbb3c8afeb992de8953cbeefa9ea70","pkg-src-sha256":"7e23a7a325e3448354614d3d958279c9ac2fdd0831ceee2808830e7a962fca41","depends":["array-0.5.6.0","base-4.18.2.0","bytestring-0.11.5.3","containers-0.6.7","hashable-1.4.3.0-17b447e0ce504d4e093d6bf5a9838da3805c7caa5d16355da40827d004febbc8","indexed-profunctors-0.1.1.1-8d925dea1c4443bc16b2bc6a7c10d1b7794d7d65d9ab1d1c3b10993e592e1e9e","indexed-traversable-instances-0.1.1.2-23d2e9c28613d77bfd5595533e39512e3e8b808382cee8d422cee021acbf7fc4","mtl-2.3.1","optics-core-0.4.1.1-f8d9a3ddd3e59e269ad03738aca54bb92446a15ba98a2b4ae8ec19ed7d20df70","text-2.0.2","transformers-0.6.1.0","unordered-containers-0.2.20-013ecc3e94c07bd5bdb23da8c9cf4d68ac66e04c4144b4096b291104672db345","vector-0.13.1.0-eb53bdac16f057ad838f4e8cb865b51b400abac71a36dc5bfde93ea1d0859eae"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"optics-th-0.4.1-90f0163ff0ce0756a0c2b2710d750aca3af41c9fde2d3cd29f09811f71392eff","pkg-name":"optics-th","pkg-version":"0.4.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"d306ba320a4235338dcac597042fc1174fbc7d3b095c6c1fa3f824fe0e36150f","pkg-src-sha256":"d73857b79dcd8f7c7e70fa4727f134145b62902e8d3e448f8b25c38a9da4fd17","depends":["base-4.18.2.0","containers-0.6.7","mtl-2.3.1","optics-core-0.4.1.1-f8d9a3ddd3e59e269ad03738aca54bb92446a15ba98a2b4ae8ec19ed7d20df70","template-haskell-2.20.0.0","th-abstraction-0.6.0.0-b49a83d27ea2604c7977c309bd302e93941309c5040c248dbdb6b55147976b2b","transformers-0.6.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"optparse-applicative-0.18.1.0-1de8f12cfc2915bc6d323ba97415a7e0795036a6b613e7301735aedf9d0425be","pkg-name":"optparse-applicative","pkg-version":"0.18.1.0","flags":{"process":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"b4cf8d9018e5e67cb1f14edb5130b6d05ad8bc1b5f6bd4efaa6ec0b7f28f559d","pkg-src-sha256":"63811ab4fd26e829b8868364325a88be3acc79819f5bb5005b2dd3b961ecc491","depends":["base-4.18.2.0","prettyprinter-1.7.1-990f242c6c8062a20fcaf6f8bd5136049b2bbd93d07db5eae42d61de7c9d6c8c","prettyprinter-ansi-terminal-1.1.3-2b2de842f45b3d06338f00062771358f66ec85709eb8a1df5b48b49bf0d58c33","process-1.6.17.0","text-2.0.2","transformers-0.6.1.0","transformers-compat-0.7.2-15ca92c51f3c4b3e5a349c3cc2a7f406ca01ba50aecd92a631a1c4d508b1230f"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"os-string-2.0.2-c94c7716dceda9adcf8c3208c87dc23b7f71b84fca751a70ffc309850517a402","pkg-name":"os-string","pkg-version":"2.0.2","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"32fa47f8345a2c0662fb602fc42e4b674e41ec48079b68bdecb4b6f68032c24e","pkg-src-sha256":"0953126e962966719753c98d71f596f5fea07e100bce191b7453735a1ff2caa1","depends":["base-4.18.2.0","bytestring-0.11.5.3","deepseq-1.4.8.1","exceptions-0.10.7","template-haskell-2.20.0.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"parallel-3.2.2.0-86a50f94aa82e9af5f21bfb4d27ed83c8cf2231ac3fb348b2b433b2f10943c05","pkg-name":"parallel","pkg-version":"3.2.2.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"b993406e98fe9126eff4a69d28e7e361037dd1c0892a9fd6c26e1f92eb9c4fa4","pkg-src-sha256":"170453a71a2a8b31cca63125533f7771d7debeb639700bdabdd779c34d8a6ef6","depends":["array-0.5.6.0","base-4.18.2.0","containers-0.6.7","deepseq-1.4.8.1","ghc-prim-0.10.0"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"parsec-3.1.16.1","pkg-name":"parsec","pkg-version":"3.1.16.1","depends":["base-4.18.2.0","bytestring-0.11.5.3","mtl-2.3.1","text-2.0.2"]},{"type":"configured","id":"parser-combinators-1.3.0-702f2638f70c15b6b5b11fbe7dcdd3e6d0d73f0193261f85b4d42c011d1949f6","pkg-name":"parser-combinators","pkg-version":"1.3.0","flags":{"dev":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"8659573e0d443d573f5b53f81b81dafbdc988d282b90c11e3da73562b4ea7876","pkg-src-sha256":"9310ef0d49f8a8922acda10b1cded9854cbee04dea717effc6ee5983072e4447","depends":["base-4.18.2.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"pcre2-2.2.1-497aee97a6283223eea2bb30f3bd7127ff8bb3d2b6ece9c4e0a73371dc66b90c","pkg-name":"pcre2","pkg-version":"2.2.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"057bd6337dbb681708f5df7ce2d13884e93830f1b2f4f51f8e7096dd87358285","pkg-src-sha256":"d48d8669d68f2858d825fb08b3730cfeb49eed964b093b39e78052fd1f510870","depends":["base-4.18.2.0","containers-0.6.7","microlens-0.4.13.1-7fc67fa4a915fe46c53bdefdd38fdb5fc86a0fe5166c99a699781b2db9bc2c2f","mtl-2.3.1","template-haskell-2.20.0.0","text-2.0.2"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"pem-0.2.4-fc2f4716715ce340b3916ffcbdd4e6509f0d10442951de390cdd9d623db1033a","pkg-name":"pem","pkg-version":"0.2.4","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"cc8e62118b783e284dc0fa032f54fe386a3861a948ec88079370a433c103a705","pkg-src-sha256":"770c4c1b9cd24b3db7f511f8a48404a0d098999e28573c3743a8a296bb96f8d4","depends":["base-4.18.2.0","basement-0.0.16-2ba9d181df7bdd547d6fedd5acdec581f03e379e22b0e08ff998fb0462257d08","bytestring-0.11.5.3","memory-0.18.0-273ad672f1703dee0dfe07994633c93d17f815a149738659ef6afa30cbe4f6a8"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"pg-entity-0.0.4.4-c09d4801d2c9b8aac6587451fb3276698aa673bffbbe13e20e92459744a89058","pkg-name":"pg-entity","pkg-version":"0.0.4.4","flags":{"book":false,"prod":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"c1b547bfa22b09f1ebf0b9c7cac6dc70292bd1bac2aeacadbe89acceb908bfa0","pkg-src-sha256":"02d6e5b4464caeeeec549f9086a84f5bb89a252bdb1c00f7a8045d0389f67a75","depends":["base-4.18.2.0","bytestring-0.11.5.3","colourista-0.1.0.2-f2248bbbb4ee79cbf9fe81e61effe11fd685506de3685fc7950c57e7408058a6","parsec-3.1.16.1","pg-transact-0.3.2.0-154eca34326a8779919f5450f98657e0bdd42098d5eb39bd64fe3ab6b57ef08c","postgresql-simple-0.6.5.1-ec621799555c8b1b15b3683ac92cdc3770e891696c7afc3195aa6f26571cbbe0","resource-pool-0.4.0.0-b943f9aab32b14d553510f77b995882007d913763eb4c8a34a077c78a8909098","template-haskell-2.20.0.0","text-2.0.2","text-display-0.0.5.1-ae9f66e9765923d9edec209058cc153706fead0e7c7287c2994a985da1c39623","text-manipulate-0.3.1.0-bbaadf2af0a73d136732896cbf24da16ec9680c37b15a75cb7d27e4488f229a7","time-1.12.2","uuid-1.3.15-413cef239f477249b51ed712d27bea33e15b08237221be1f41f0bc89ce5e1463","vector-0.13.1.0-eb53bdac16f057ad838f4e8cb865b51b400abac71a36dc5bfde93ea1d0859eae"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"pg-transact-0.3.2.0-154eca34326a8779919f5450f98657e0bdd42098d5eb39bd64fe3ab6b57ef08c","pkg-name":"pg-transact","pkg-version":"0.3.2.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"585184bbbc95d2c59885377cc713383d808686df62044f4da8d708184bbec215","pkg-src-sha256":"af109e82fee758d159654b9c02c396197852cbd909b5f02dbbd4ef0613270432","depends":["base-4.18.2.0","bytestring-0.11.5.3","exceptions-0.10.7","monad-control-1.0.3.1-2bf3452c923aa94707518b6d970f4377279fd8c4ccca1256725eef18b6097440","postgresql-simple-0.6.5.1-ec621799555c8b1b15b3683ac92cdc3770e891696c7afc3195aa6f26571cbbe0","transformers-0.6.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"pg-transact-effectful-0.0.1.0-19059a8ff842cc019bf692ea57228ae755836f0ae48aa91885f40683ea8347a6","pkg-name":"pg-transact-effectful","pkg-version":"0.0.1.0","flags":{},"style":"global","pkg-src":{"type":"source-repo","source-repo":{"type":"git","location":"https://github.com/kleidukos/pg-transact-effectful","tag":"d3f3f3d"}},"pkg-src-sha256":"ffd239fca5c580205e8553dc36d5eddf59dc951a7b1e8ee121d2f0bdd92c09fa","depends":["base-4.18.2.0","deepseq-1.4.8.1","effectful-core-2.3.0.1-011d84ab0bc8bb2010bac83565500e3039592cab57d902e9a2a502684b92d90f","mtl-2.3.1","pg-transact-0.3.2.0-154eca34326a8779919f5450f98657e0bdd42098d5eb39bd64fe3ab6b57ef08c","postgresql-simple-0.6.5.1-ec621799555c8b1b15b3683ac92cdc3770e891696c7afc3195aa6f26571cbbe0","resource-pool-0.4.0.0-b943f9aab32b14d553510f77b995882007d913763eb4c8a34a077c78a8909098"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"poolboy-0.2.2.0-2b5751910b4c714d0b69899eea5770ca156a5f1311f953bd68bceb7c3f9f9275","pkg-name":"poolboy","pkg-version":"0.2.2.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"1e69e86bcf2ad4e28dc3d5ff6053879de836923e6a274f9733c7346e8e56fc46","pkg-src-sha256":"c36dd0e6c4edfb6e161dad6934a1781fb0ff4532fbade6dfb6878fe33cee1434","depends":["async-2.2.4-2107e60f1bee7c70ffed77e551ffc7db01e350edd8784cc9493cc782305122d0","base-4.18.2.0","stm-2.5.1.0","unliftio-0.2.25.0-494677154ed69a76841d775b50166f52e9d0797a41ece2fd3d94e08aebf372f3"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"postgresql-libpq-0.9.5.0-071d9ee8ef83b1f776abe0db562cc5fd3ddb99923740b0f31e6cd7ac1d8703e8","pkg-name":"postgresql-libpq","pkg-version":"0.9.5.0","flags":{"use-pkg-config":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"6680ac3c947bf8fbe1d181d0ce1abb9bd0691316fa1e2dfd547b631b2a4be609","pkg-src-sha256":"d1592bd805c088bb0c136c03eea92af9c1d7dbd85e32d0b6d522fd940f325470","components":{"lib":{"depends":["base-4.18.2.0","bytestring-0.11.5.3","unix-2.8.4.0"],"exe-depends":["hsc2hs-0.68.10-e-hsc2hs-3b4e464e6a657183d9f83bd37c6d876421d9f6d00ca34e12b12ca3365e55159d"]},"setup":{"depends":["Cabal-3.10.1.0","base-4.18.2.0"],"exe-depends":[]}}},{"type":"configured","id":"postgresql-migration-0.2.1.7-559534ce1dd13a52b2fe575db34bd39f392a7c262dc6d5bd81bff72f2e148d8e","pkg-name":"postgresql-migration","pkg-version":"0.2.1.7","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"7b511be780305beb7940c99476911de47231a448f4eee5b50cbe40bdac63b3e8","pkg-src-sha256":"e838a5f15eb1f5614cda1c6078fe534589768421fad6b5d54ea4149092af1765","depends":["base-4.18.2.0","base64-bytestring-1.2.1.0-ecb3bf792eac6ec696f20e02e528e8a7b2a76a5b32c46409c4645e1bfbd71cf4","bytestring-0.11.5.3","cryptohash-md5-0.11.101.0-3dd4c39d92ff47630ac61716ac3e4f1bd76b570bf3eb70cf3c6a25610e31a06c","directory-1.3.8.1","filepath-1.4.200.1","postgresql-simple-0.6.5.1-ec621799555c8b1b15b3683ac92cdc3770e891696c7afc3195aa6f26571cbbe0","text-2.0.2","time-1.12.2"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"postgresql-migration-0.2.1.7-e-migrate-1a1cee7879444d74e7f41af0ac61ebdfa8fb20f515c4c982254ad7f1e55fd446","pkg-name":"postgresql-migration","pkg-version":"0.2.1.7","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"7b511be780305beb7940c99476911de47231a448f4eee5b50cbe40bdac63b3e8","pkg-src-sha256":"e838a5f15eb1f5614cda1c6078fe534589768421fad6b5d54ea4149092af1765","depends":["base-4.18.2.0","base64-bytestring-1.2.1.0-ecb3bf792eac6ec696f20e02e528e8a7b2a76a5b32c46409c4645e1bfbd71cf4","bytestring-0.11.5.3","cryptohash-md5-0.11.101.0-3dd4c39d92ff47630ac61716ac3e4f1bd76b570bf3eb70cf3c6a25610e31a06c","directory-1.3.8.1","postgresql-migration-0.2.1.7-559534ce1dd13a52b2fe575db34bd39f392a7c262dc6d5bd81bff72f2e148d8e","postgresql-simple-0.6.5.1-ec621799555c8b1b15b3683ac92cdc3770e891696c7afc3195aa6f26571cbbe0","text-2.0.2","time-1.12.2"],"exe-depends":[],"component-name":"exe:migrate","bin-file":"/home/hecate/Projects/Flora/1-flora-server/_build/cabal-store/ghc-9.6.4/postgresql-migration-0.2.1.7-e-migrate-1a1cee7879444d74e7f41af0ac61ebdfa8fb20f515c4c982254ad7f1e55fd446/bin/migrate"},{"type":"configured","id":"postgresql-simple-0.6.5.1-ec621799555c8b1b15b3683ac92cdc3770e891696c7afc3195aa6f26571cbbe0","pkg-name":"postgresql-simple","pkg-version":"0.6.5.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"527939755637c1ea3fdad2819a7725e63d0a01931678e631549367c9faedc620","pkg-src-sha256":"c861410b73d279c6d1b712dc20632c37612a1098f23593f6475a995b14191b6c","depends":["Only-0.1-914e2ddfdd5fc0b9704050502cc99fcb5926b3ef60f86855ee94bd6fc8c46a18","aeson-2.2.1.0-2595d249b227784b9febcd5a91568775f66fd262ac45c82c44f7b4a55e9d4c27","attoparsec-0.14.4-5061b5f729de9f72f69961345d54e0249a28df7c232bb9cf2b0525b6f17a253a","base-4.18.2.0","bytestring-0.11.5.3","bytestring-builder-0.10.8.2.0-e19114b40bd07b22b89d1b66ea0a2320498dd92342a0ffbe5a84431b412d2a4c","case-insensitive-1.2.1.0-5255eaf892b10e8489fdad145ca833a10864bd951f3e69d04088fbcadf28ec6d","containers-0.6.7","hashable-1.4.3.0-17b447e0ce504d4e093d6bf5a9838da3805c7caa5d16355da40827d004febbc8","postgresql-libpq-0.9.5.0-071d9ee8ef83b1f776abe0db562cc5fd3ddb99923740b0f31e6cd7ac1d8703e8","scientific-0.3.7.0-ad7c6f4dff0f6cf6540942c40157e54f8c090b5d960104c70801b0a2f7c99215","template-haskell-2.20.0.0","text-2.0.2","time-compat-1.9.6.1-2b2aa066adc7c0d5baad9d0716626a41574966c2265b4ff355b83a2bfd5ca61a","transformers-0.6.1.0","uuid-types-1.0.5.1-c19e00cab51fb72d8874dd99ac787f44fda9996af8117c2d227cfb3294e06a9c","vector-0.13.1.0-eb53bdac16f057ad838f4e8cb865b51b400abac71a36dc5bfde93ea1d0859eae"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"pretty-1.1.3.6","pkg-name":"pretty","pkg-version":"1.1.3.6","depends":["base-4.18.2.0","deepseq-1.4.8.1","ghc-prim-0.10.0"]},{"type":"configured","id":"pretty-show-1.10-39ae5e05ab98b3c924fb13a2d338f92ec77dadc8f9be190ec6bbf2401618cf8f","pkg-name":"pretty-show","pkg-version":"1.10","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"bfef8da0ac4db4fc7f41edfec9e9a701ac206418d70702bff1e40f20d6a2b1f1","pkg-src-sha256":"307f9086e0b063d439dc4f513e36a145e8a57f23de448aefae2a6c00f6da6fd2","depends":["array-0.5.6.0","base-4.18.2.0","filepath-1.4.200.1","ghc-prim-0.10.0","haskell-lexer-1.1.1-833f66de7c919d07c41146e9931dfd902b8b694cd3302de1c3d836c85a3c47a3","pretty-1.1.3.6","text-2.0.2"],"exe-depends":["happy-1.20.1.1-e-happy-182aa5abbcffb81f5451895cca70d0e3fc7d8d0e3c5bdde45132d65f06643d40"],"component-name":"lib"},{"type":"configured","id":"pretty-show-1.10-e-ppsh-544a1a4ea59118346d01876f1be198e7af495917d88b621a8de8213ba3aa2987","pkg-name":"pretty-show","pkg-version":"1.10","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"bfef8da0ac4db4fc7f41edfec9e9a701ac206418d70702bff1e40f20d6a2b1f1","pkg-src-sha256":"307f9086e0b063d439dc4f513e36a145e8a57f23de448aefae2a6c00f6da6fd2","depends":["base-4.18.2.0","pretty-show-1.10-39ae5e05ab98b3c924fb13a2d338f92ec77dadc8f9be190ec6bbf2401618cf8f"],"exe-depends":[],"component-name":"exe:ppsh","bin-file":"/home/hecate/Projects/Flora/1-flora-server/_build/cabal-store/ghc-9.6.4/pretty-show-1.10-e-ppsh-544a1a4ea59118346d01876f1be198e7af495917d88b621a8de8213ba3aa2987/bin/ppsh"},{"type":"configured","id":"prettyprinter-1.7.1-990f242c6c8062a20fcaf6f8bd5136049b2bbd93d07db5eae42d61de7c9d6c8c","pkg-name":"prettyprinter","pkg-version":"1.7.1","flags":{"buildreadme":false,"text":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"9c43c9d8c3cd9f445596e5a2379574bba87f935a4d1fa41b5407ee3cf4edc743","pkg-src-sha256":"5e6ea6903114fa118fcc359633dfb7ecddecb92c06c853d02a77b72b251f0b45","depends":["base-4.18.2.0","text-2.0.2"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"prettyprinter-ansi-terminal-1.1.3-2b2de842f45b3d06338f00062771358f66ec85709eb8a1df5b48b49bf0d58c33","pkg-name":"prettyprinter-ansi-terminal","pkg-version":"1.1.3","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"b00f727b964cf13adff7acf575a71fa7e405f5240aff50b07f10df76ab89f8d3","pkg-src-sha256":"813739308ad6050620578994effe21058a170a341716acf52573fae42b5b1db3","depends":["ansi-terminal-1.0.2-f2271bf25e5299c165409ab78d5917aeba79c479959932bb5fb284c513226fc0","base-4.18.2.0","prettyprinter-1.7.1-990f242c6c8062a20fcaf6f8bd5136049b2bbd93d07db5eae42d61de7c9d6c8c","text-2.0.2"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"primitive-0.9.0.0-a6aa61bd9fff8d6cfd4880894dd85d8e644fbcf178b2bff38f87569871ea4a0d","pkg-name":"primitive","pkg-version":"0.9.0.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"1ceb39f67c0e614180f2992a6d30f26603ab2cd23c4f8e25b30213f98807f6f1","pkg-src-sha256":"696d4bd291c94d736142d6182117dca4258d3ef28bfefdb649ac8b5ecd0999c7","depends":["base-4.18.2.0","deepseq-1.4.8.1","template-haskell-2.20.0.0","transformers-0.6.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"primitive-addr-0.1.0.2-1d786758faf617b086ce4cbc72b559d853b44b3c0637695f91811d3095dde6e1","pkg-name":"primitive-addr","pkg-version":"0.1.0.2","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"f6e102445287c5406f256da95f8bdb6ff58290144b348e64a3062453bb5928e8","pkg-src-sha256":"4281c3a429bc03ab2940d072a6cbd63948bdf2607561456d972ba3ca4db9211b","depends":["base-4.18.2.0","primitive-0.9.0.0-a6aa61bd9fff8d6cfd4880894dd85d8e644fbcf178b2bff38f87569871ea4a0d"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"primitive-offset-0.2.0.0-b93fd3063a232ecde01c2f1c6c7f349f7bbfba6a51590e6011e8c669dc2ff008","pkg-name":"primitive-offset","pkg-version":"0.2.0.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"f8006927d5c0a3e83707610bbc5514aabe8f84a907ecb07edd2c815f58299dea","pkg-src-sha256":"b15e7de9ebf36ec12b4e2fac2a2c3cefd2b99afa76231fbd0b5cf5d03f6d572b","depends":["base-4.18.2.0","primitive-0.9.0.0-a6aa61bd9fff8d6cfd4880894dd85d8e644fbcf178b2bff38f87569871ea4a0d"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"primitive-unlifted-2.1.0.0-aea76574320ac1dea77e342956c3de02d6d7ed0b25f80413b31e3a4622eea123","pkg-name":"primitive-unlifted","pkg-version":"2.1.0.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"ef1113c8796391ef098a026f16dc827abd32a15cb847acdf2d83af9eba103299","pkg-src-sha256":"613421078a2f4c012a99233dbc7a8ff0a17a0cb5abfd9baf544f4695751a3d1e","depends":["array-0.5.6.0","base-4.18.2.0","bytestring-0.11.5.3","primitive-0.9.0.0-a6aa61bd9fff8d6cfd4880894dd85d8e644fbcf178b2bff38f87569871ea4a0d","text-short-0.1.5-e014e79f76c5438274db6ad0455e870f44faf95f73a43bdf4e1c22851755dbaa"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"process-1.6.17.0","pkg-name":"process","pkg-version":"1.6.17.0","depends":["base-4.18.2.0","deepseq-1.4.8.1","directory-1.3.8.1","filepath-1.4.200.1","unix-2.8.4.0"]},{"type":"configured","id":"profunctors-5.6.2-8b084a9552445e5776f01a7b42f1722ce1ecf20cf9a8e839007b9baea33b9fa4","pkg-name":"profunctors","pkg-version":"5.6.2","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"e178ba4468982326656626e2089e296f64485e68fdddc9f4476dcd5d612b4f78","pkg-src-sha256":"65955d7b50525a4a3bccdab1d982d2ae342897fd38140d5a94b5ef3800d8c92a","depends":["base-4.18.2.0","base-orphans-0.9.1-61d128d6a3318593c785a97751f2418cc86b42b03e2b46ed92e9b27fc5da689c","bifunctors-5.6.1-3bfddc97d0532e0f4bedd1f64454f96744d2fe805f93a5f9e443c2c5e1035ff1","comonad-5.0.8-8505feb1b75f0b6bf19ef9b666132d0031c1214df6db91aab78f0a9def57751c","contravariant-1.5.5-45cb856efb41788f255562487551496b619a1cf555a23fc4a29495fda3e0c50f","distributive-0.6.2.1-70a2f4c4bffafd7749c1d755f27db885f954a9d9be1cd7db8a6e99887121ec8c","tagged-0.8.8-5d06ce789c37adf39496775b08f7d82bb9509e4c2a3f973b0c868e35bca55ad5","transformers-0.6.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"psqueues-0.2.8.0-3b5625b932d73ea3cc0319c7b0eff1a4b49b3ba87f855df869f83ada38fcc584","pkg-name":"psqueues","pkg-version":"0.2.8.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"e71ef88119df3449e3018ecdd487ad844e112352baae0df8c229f76b009d399d","pkg-src-sha256":"b36de238414845d5f0e8e521154e670b2129a21b98070a02fd6b7c873b46e462","depends":["base-4.18.2.0","deepseq-1.4.8.1","ghc-prim-0.10.0","hashable-1.4.3.0-17b447e0ce504d4e093d6bf5a9838da3805c7caa5d16355da40827d004febbc8"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"qrcode-core-0.9.9-26498b4ed47f926f2f064d25ff1a73747fe531dce4fe1eaf0dd664493c00bbbc","pkg-name":"qrcode-core","pkg-version":"0.9.9","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"5ecfe933786a3b13be59ada3126dd13ba03e3fd3dbc5ec234bf85054a313c063","pkg-src-sha256":"bc596ab168b4d2fdc34ad2ffe4fa3e52f30e8a8ef3215a798a8851f7409050ad","depends":["base-4.18.2.0","binary-0.8.9.1","bytestring-0.11.5.3","case-insensitive-1.2.1.0-5255eaf892b10e8489fdad145ca833a10864bd951f3e69d04088fbcadf28ec6d","containers-0.6.7","dlist-1.0-1ec91dd3ad8405ed390138bce1c7d55220d4758eda9fb3ad6fbb8b1ee6dc0c94","primitive-0.9.0.0-a6aa61bd9fff8d6cfd4880894dd85d8e644fbcf178b2bff38f87569871ea4a0d","text-2.0.2","vector-0.13.1.0-eb53bdac16f057ad838f4e8cb865b51b400abac71a36dc5bfde93ea1d0859eae"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"qrcode-juicypixels-0.8.5-6838fee4a1ce854292c21f8a386f97468fe4ea877b3c81266871b5ccf74fbeb5","pkg-name":"qrcode-juicypixels","pkg-version":"0.8.5","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"2a35d88a67e10a39dccd0e9e6f3c199b762c683316758031911578a21aac4507","pkg-src-sha256":"6f594f2e03c5aec83e3244919a2032a3a74ad1fc16919e0527a0fb784e6cec61","depends":["JuicyPixels-3.3.8-295ba873739530be2ad2e0f5ef3880f23fb240b49297676915db7967d6106794","base-4.18.2.0","base64-bytestring-1.2.1.0-ecb3bf792eac6ec696f20e02e528e8a7b2a76a5b32c46409c4645e1bfbd71cf4","bytestring-0.11.5.3","qrcode-core-0.9.9-26498b4ed47f926f2f064d25ff1a73747fe531dce4fe1eaf0dd664493c00bbbc","text-2.0.2","vector-0.13.1.0-eb53bdac16f057ad838f4e8cb865b51b400abac71a36dc5bfde93ea1d0859eae"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"quickcheck-io-0.2.0-72cfeb1839042c70144c107e73cbb146738a02891278b479561ca9d6da09e7d6","pkg-name":"quickcheck-io","pkg-version":"0.2.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"7bf0b68fb90873825eb2e5e958c1b76126dcf984debb998e81673e6d837e0b2d","pkg-src-sha256":"fb779119d79fe08ff4d502fb6869a70c9a8d5fd8ae0959f605c3c937efd96422","depends":["HUnit-1.6.2.0-d1570da0a2808fb4ce9b1c3f1e99a0cf4a27d7c4071d9714ae835af7748ace92","QuickCheck-2.14.3-091d344acf9c963200a9b2af6c5417d91912262a9a84b607d918b50fdf8a8b02","base-4.18.2.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"random-1.2.1.2-cc746490e13a1f967de173a54c09753b2ccdb5d95056b0f1206a29c62c83de45","pkg-name":"random","pkg-version":"1.2.1.2","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"32397de181e20ccaacf806ec70de9308cf044f089a2be37c936f3f8967bde867","pkg-src-sha256":"790f4dc2d2327c453ff6aac7bf15399fd123d55e927935f68f84b5df42d9a4b4","depends":["base-4.18.2.0","bytestring-0.11.5.3","deepseq-1.4.8.1","mtl-2.3.1","splitmix-0.1.0.5-4c4c1f33537354cbf1e3da145a4775d1633faaa320080e06e92a1f67dbed4227"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"raven-haskell-0.1.4.1-44d3b6ed541acb7607ead7976c2238c005386ee5ef27fe0c44b3443d3c3d76b7","pkg-name":"raven-haskell","pkg-version":"0.1.4.1","flags":{"tests":false},"style":"global","pkg-src":{"type":"source-repo","source-repo":{"type":"git","location":"https://gitlab.com/dpwiz/raven-haskell.git/","tag":"180088b26fb79515627644545955aed5c50d804a","subdir":"./raven-haskell"}},"pkg-src-sha256":"823a05623175b3429dd26af367e5d7a253c252087676a3c576afbba8e7fccbe4","depends":["aeson-2.2.1.0-2595d249b227784b9febcd5a91568775f66fd262ac45c82c44f7b4a55e9d4c27","base-4.18.2.0","bytestring-0.11.5.3","http-conduit-2.3.8.3-4ad7853d8f1fc07a23d239e66fd76a570e24733747408dace515a7e5a7be3940","mtl-2.3.1","network-3.1.4.0-9d41c9df77e8d21da5aaf51c19540d3c0fc11e5e2c2940bea5411915b8a462ff","random-1.2.1.2-cc746490e13a1f967de173a54c09753b2ccdb5d95056b0f1206a29c62c83de45","resourcet-1.3.0-0f210c6e8ffe9f595ad8fd1a6cf6726e42a6695abb7febee22452f40436a2bc5","text-2.0.2","time-1.12.2","unordered-containers-0.2.20-013ecc3e94c07bd5bdb23da8c9cf4d68ac66e04c4144b4096b291104672db345","uuid-types-1.0.5.1-c19e00cab51fb72d8874dd99ac787f44fda9996af8117c2d227cfb3294e06a9c"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"recv-0.1.0-d170336de78e6c12b94f8cc756fe783212924d934de94f3714815c10ebbd9fad","pkg-name":"recv","pkg-version":"0.1.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"04058c90ed3d2821b92e589dd3428f5a6e9d49ab405296dda3583304cb0b9bb3","pkg-src-sha256":"f664905cffb44b7f9cba604cd75bd69011a666ba06bccbcb7f3fae0cd4f14d5b","depends":["base-4.18.2.0","bytestring-0.11.5.3","network-3.1.4.0-9d41c9df77e8d21da5aaf51c19540d3c0fc11e5e2c2940bea5411915b8a462ff"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"reflection-2.1.7-6e3964bab098962c0f1cc95d37584b10d2c12c8d4578f9c794643c142cc40415","pkg-name":"reflection","pkg-version":"2.1.7","flags":{"slow":false,"template-haskell":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"f2b5b3f0983a605d16e53af489ebba62967d2c80353473ca66cc1734222b3a04","pkg-src-sha256":"6cbb18a8b02871533bb8b641dc6f76813a097d94404e5808bb5d52b0f0e415fd","depends":["base-4.18.2.0","template-haskell-2.20.0.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"req-3.13.2-58b3576f35ee75f77b2d839cec460285be510fca18162b9b1542b8ae69fa9e34","pkg-name":"req","pkg-version":"3.13.2","flags":{"dev":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"18760b5d2d5aebee4d5337056d42a64979a28f7b48b0ab3285db452c72bbe750","pkg-src-sha256":"5bbe4029906138e509d50c68730a7537aa7890900bd15aa5c8c5129c8975b0de","depends":["aeson-2.2.1.0-2595d249b227784b9febcd5a91568775f66fd262ac45c82c44f7b4a55e9d4c27","authenticate-oauth-1.7-17cbc43210a12a6ae641a7faea62b4f2f2c36ac4c243d15ee4ff7bbccaf8c6d1","base-4.18.2.0","blaze-builder-0.4.2.3-60676f992d653075aeba6aad80b2dd0b054859608a5712ecfc9d4a4968aefdb8","bytestring-0.11.5.3","case-insensitive-1.2.1.0-5255eaf892b10e8489fdad145ca833a10864bd951f3e69d04088fbcadf28ec6d","containers-0.6.7","crypton-connection-0.3.2-804034b7a3e50ed75e1849613e844c1579d8bd18848efe958529bc613747e852","exceptions-0.10.7","http-api-data-0.6-f8db4c3e7ff814c1476ac3873683211db56d23f0c28cabdd051460114fc3de4f","http-client-0.7.16-08ac6af6261aa24f586bbb528e8ea2f0bd2e7510d1883948d770173e7ea8b633","http-client-tls-0.3.6.3-67f7c5e1b646b6720d31cd47b325354e5e9c257cef0d9522c9b4a5648422c65e","http-types-0.12.4-0f52a9ec33f3c65ef0b77ad8ce14b65f9164f8a761e42800dc9c80ee1768aacc","modern-uri-0.3.6.1-c2deadb57eaf5495142288d2ce86c3ffbf3db59eea2c3ffe34643053cf0d66a0","monad-control-1.0.3.1-2bf3452c923aa94707518b6d970f4377279fd8c4ccca1256725eef18b6097440","mtl-2.3.1","retry-0.9.3.1-2d114b37a558b4b151118167182e7d5cccd7193b8d2085b56dd490d68f56aea0","template-haskell-2.20.0.0","text-2.0.2","transformers-0.6.1.0","transformers-base-0.4.6-91c64a4b19c3f5f9f196345e9032803d52322bd0857ba94ea6c4260a27a2ff07","unliftio-core-0.2.1.0-1e6dce1dfe73ef335e0615b0af7f06b171c3572cf7a04fe671b6cec407b73dee"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"resource-pool-0.4.0.0-b943f9aab32b14d553510f77b995882007d913763eb4c8a34a077c78a8909098","pkg-name":"resource-pool","pkg-version":"0.4.0.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"9c1e448a159875e21a7e68697feee2b61a4e584720974fa465a2fa1bc0776c73","pkg-src-sha256":"8c0d783e3e75788d65f79157309132999f1bbb70684bacc2ea5dd18f904ae9b1","depends":["base-4.18.2.0","hashable-1.4.3.0-17b447e0ce504d4e093d6bf5a9838da3805c7caa5d16355da40827d004febbc8","primitive-0.9.0.0-a6aa61bd9fff8d6cfd4880894dd85d8e644fbcf178b2bff38f87569871ea4a0d","time-1.12.2"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"resourcet-1.3.0-0f210c6e8ffe9f595ad8fd1a6cf6726e42a6695abb7febee22452f40436a2bc5","pkg-name":"resourcet","pkg-version":"1.3.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"faa760fb28fb5c98fbe4867e375a775495cabc00926da81fa102dc991017d2c5","pkg-src-sha256":"ec601785ee42a201f32adb205b8685c983f18757b1bd33d2e806d571e0f9996b","depends":["base-4.18.2.0","containers-0.6.7","exceptions-0.10.7","mtl-2.3.1","primitive-0.9.0.0-a6aa61bd9fff8d6cfd4880894dd85d8e644fbcf178b2bff38f87569871ea4a0d","transformers-0.6.1.0","unliftio-core-0.2.1.0-1e6dce1dfe73ef335e0615b0af7f06b171c3572cf7a04fe671b6cec407b73dee"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"retry-0.9.3.1-2d114b37a558b4b151118167182e7d5cccd7193b8d2085b56dd490d68f56aea0","pkg-name":"retry","pkg-version":"0.9.3.1","flags":{"lib-werror":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"1a61625dc1c3dd6677ffde1c8142004026dfb08085d0d0af5848088d56ec6110","pkg-src-sha256":"622e35114b920f76fa2e1ae6515575b9973fac19c679f5426ea6574a5d0b7ed6","depends":["base-4.18.2.0","exceptions-0.10.7","ghc-prim-0.10.0","mtl-2.3.1","mtl-compat-0.2.2-9b77842584114154ec5c5ab666cf431f0be7716025713aae3e0ce53ce1b7ad9f","random-1.2.1.2-cc746490e13a1f967de173a54c09753b2ccdb5d95056b0f1206a29c62c83de45","transformers-0.6.1.0","unliftio-core-0.2.1.0-1e6dce1dfe73ef335e0615b0af7f06b171c3572cf7a04fe671b6cec407b73dee"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"rts-1.0.2","pkg-name":"rts","pkg-version":"1.0.2","depends":[]},{"type":"configured","id":"run-st-0.1.3.3-af1ad044a973fec4afa0830cc37bb6f0f7961cd9e6ffb5b32198ce4b6d73c331","pkg-name":"run-st","pkg-version":"0.1.3.3","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"da932d882d3fefc9cd53fb367375a64c1dd6ffd702702854d26c8d5af6a4fd59","pkg-src-sha256":"97585d13dcffc30a6b29d83296d1fb2c8eb52d7ffd2d605e78e8dc8ac8d8a654","depends":["base-4.18.2.0","primitive-0.9.0.0-a6aa61bd9fff8d6cfd4880894dd85d8e644fbcf178b2bff38f87569871ea4a0d","primitive-unlifted-2.1.0.0-aea76574320ac1dea77e342956c3de02d6d7ed0b25f80413b31e3a4622eea123"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"safe-0.3.21-31bf385773e1c6ef212139e0505190c20d1e3d1af99bcbfc189c01c3a1e0e739","pkg-name":"safe","pkg-version":"0.3.21","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"b928ea1645876788155b38ce85c7e46d157a1bb41d2b05f5770b13d60bc6a3f7","pkg-src-sha256":"2c81fea42bbe79ec488774043c1ec54f30efba059df9a4f3681ce83d85007f01","depends":["base-4.18.2.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"safe-exceptions-0.1.7.4-51b8325bd2c9c2c32246cef5b80f09fba6aa9b6005978a7b87ef943c7ddd1182","pkg-name":"safe-exceptions","pkg-version":"0.1.7.4","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"8bb7261bd54bd58acfcb154be6a161fb6d0d31a1852aadc8e927d2ad2d7651d1","pkg-src-sha256":"3c51d8d50c9b60ff8bf94f942fd92e3bea9e62c5afa778dfc9f707b79da41ef6","depends":["base-4.18.2.0","deepseq-1.4.8.1","exceptions-0.10.7","transformers-0.6.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"scientific-0.3.7.0-ad7c6f4dff0f6cf6540942c40157e54f8c090b5d960104c70801b0a2f7c99215","pkg-name":"scientific","pkg-version":"0.3.7.0","flags":{"bytestring-builder":false,"integer-simple":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"909755ab19b453169ff85281323da1488407776b2360bd9f7afdd219fd306ef2","pkg-src-sha256":"a3a121c4b3d68fb8b9f8c709ab012e48f090ed553609247a805ad070d6b343a9","depends":["base-4.18.2.0","binary-0.8.9.1","bytestring-0.11.5.3","containers-0.6.7","deepseq-1.4.8.1","hashable-1.4.3.0-17b447e0ce504d4e093d6bf5a9838da3805c7caa5d16355da40827d004febbc8","integer-logarithms-1.0.3.1-49bf09c2474200e80cd296b047116a8ad20403e42301ba2d71d615b2824b3fcd","primitive-0.9.0.0-a6aa61bd9fff8d6cfd4880894dd85d8e644fbcf178b2bff38f87569871ea4a0d","template-haskell-2.20.0.0","text-2.0.2"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"sel-0.0.1.0-a107cece4307b775602a0ac4fef5e5489f9cf07913069de7b0aebbe27daff576","pkg-name":"sel","pkg-version":"0.0.1.0","flags":{},"style":"global","pkg-src":{"type":"source-repo","source-repo":{"type":"git","location":"https://github.com/haskell-cryptography/libsodium-bindings","tag":"86161d48","subdir":"./sel"}},"pkg-src-sha256":"a2ec222a3a7b3b7163483325bf2a0eca8d3a3416fb5ff10225526e99d362d145","depends":["base-4.18.2.0","base16-1.0-a724bafd7515d95cb8fc6e89e9d0f282f5ab5b792fe4d5387e65ac02f31e861c","bytestring-0.11.5.3","libsodium-bindings-0.0.1.1-203ee47d320ef77833137696f6f56e75297ffec7d7a2503d46941bdb48c428b0","text-2.0.2","text-display-0.0.5.1-ae9f66e9765923d9edec209058cc153706fead0e7c7287c2994a985da1c39623"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"semialign-1.3-d56979a02604b49151cb0b8ca42b64e13b0f633dac64c7e0a9a02902d973b559","pkg-name":"semialign","pkg-version":"1.3","flags":{"semigroupoids":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"7be9ef5ca1d6b052991f68c053aab68b9d1ab3b1938c9557ac84c97937815223","pkg-src-sha256":"628e43319f584a8dd46c124ee0685cac586e0f6f877c5ceff37c3dbb2e3cc56c","depends":["base-4.18.2.0","containers-0.6.7","hashable-1.4.3.0-17b447e0ce504d4e093d6bf5a9838da3805c7caa5d16355da40827d004febbc8","indexed-traversable-0.1.3-8f7210e35c0cb4bf73ec163bed4014cbba70e17aa189447497a492e60990637b","indexed-traversable-instances-0.1.1.2-23d2e9c28613d77bfd5595533e39512e3e8b808382cee8d422cee021acbf7fc4","semigroupoids-6.0.0.1-e83bc6491c75c3522014917ab4d3335127e2ee3b4989f0a49f9791f8bead28c6","tagged-0.8.8-5d06ce789c37adf39496775b08f7d82bb9509e4c2a3f973b0c868e35bca55ad5","these-1.2-a7d4e934136841dac2b8ed0dc77fee3f581d8c4e25fe99bdad5b76406c57bf16","transformers-0.6.1.0","unordered-containers-0.2.20-013ecc3e94c07bd5bdb23da8c9cf4d68ac66e04c4144b4096b291104672db345","vector-0.13.1.0-eb53bdac16f057ad838f4e8cb865b51b400abac71a36dc5bfde93ea1d0859eae"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"semigroupoids-6.0.0.1-e83bc6491c75c3522014917ab4d3335127e2ee3b4989f0a49f9791f8bead28c6","pkg-name":"semigroupoids","pkg-version":"6.0.0.1","flags":{"comonad":true,"containers":true,"contravariant":true,"distributive":true,"tagged":true,"unordered-containers":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"47a23b451c114e65361e713e8fe36828fca3a84285325e8f444254b2ab0c43c5","pkg-src-sha256":"7da38a9891bdf8205fd6522cdb712956b8c0bf5c52983da60295c8e057d77934","depends":["base-4.18.2.0","base-orphans-0.9.1-61d128d6a3318593c785a97751f2418cc86b42b03e2b46ed92e9b27fc5da689c","bifunctors-5.6.1-3bfddc97d0532e0f4bedd1f64454f96744d2fe805f93a5f9e443c2c5e1035ff1","comonad-5.0.8-8505feb1b75f0b6bf19ef9b666132d0031c1214df6db91aab78f0a9def57751c","containers-0.6.7","contravariant-1.5.5-45cb856efb41788f255562487551496b619a1cf555a23fc4a29495fda3e0c50f","distributive-0.6.2.1-70a2f4c4bffafd7749c1d755f27db885f954a9d9be1cd7db8a6e99887121ec8c","hashable-1.4.3.0-17b447e0ce504d4e093d6bf5a9838da3805c7caa5d16355da40827d004febbc8","tagged-0.8.8-5d06ce789c37adf39496775b08f7d82bb9509e4c2a3f973b0c868e35bca55ad5","template-haskell-2.20.0.0","transformers-0.6.1.0","transformers-compat-0.7.2-15ca92c51f3c4b3e5a349c3cc2a7f406ca01ba50aecd92a631a1c4d508b1230f","unordered-containers-0.2.20-013ecc3e94c07bd5bdb23da8c9cf4d68ac66e04c4144b4096b291104672db345"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"semigroups-0.20-b7dd1b9febe28a509d4e029a8add1506aac955b99fce2599f25e63f8127812a9","pkg-name":"semigroups","pkg-version":"0.20","flags":{"binary":true,"bytestring":true,"bytestring-builder":false,"containers":true,"deepseq":true,"hashable":true,"tagged":true,"template-haskell":true,"text":true,"transformers":true,"unordered-containers":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"925341e6f7eb104cb490bef06eab93bb7995c7c67c51ee938185a2ddefa7aaf2","pkg-src-sha256":"902d2e33c96b40a89de5957f2a9e097197afcc35e257e45b32ebe770993673e1","depends":["base-4.18.2.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"serialise-0.2.6.1-9a84217bb1945b5559a174f6d6db34ff78ae2ce9f9cba7b4a3abdeedb09747ca","pkg-name":"serialise","pkg-version":"0.2.6.1","flags":{"newtime15":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"48e55f150c7e3bac9003adeb49fcd4573814780c374c494a46ffccc2b2043df8","pkg-src-sha256":"63949799ffd10675ef70ea701c1eb63e618629b3b2f7b25f07c5a966e24e77f4","depends":["array-0.5.6.0","base-4.18.2.0","bytestring-0.11.5.3","cborg-0.2.10.0-cfaa438104ce487b61248b85071f08fb39e16a23a8eb0f32a1ad8b086d37fb6b","containers-0.6.7","ghc-prim-0.10.0","half-0.3.1-abaa8d4e544e24e38c9200d7b5cfb6731ae8b4aec4a1d27bf34cec5836e12ff6","hashable-1.4.3.0-17b447e0ce504d4e093d6bf5a9838da3805c7caa5d16355da40827d004febbc8","primitive-0.9.0.0-a6aa61bd9fff8d6cfd4880894dd85d8e644fbcf178b2bff38f87569871ea4a0d","strict-0.5-84b2c7152a9fd6aee3e1d1082edade7580c5af3226a0afc18e19724ada9d7fe4","text-2.0.2","these-1.2-a7d4e934136841dac2b8ed0dc77fee3f581d8c4e25fe99bdad5b76406c57bf16","time-1.12.2","unordered-containers-0.2.20-013ecc3e94c07bd5bdb23da8c9cf4d68ac66e04c4144b4096b291104672db345","vector-0.13.1.0-eb53bdac16f057ad838f4e8cb865b51b400abac71a36dc5bfde93ea1d0859eae"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"servant-0.20.1-b63507222e1b19c7b8333551fd2fbdae76248ba97753767f7ab4d32b7816d39d","pkg-name":"servant","pkg-version":"0.20.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"3f0850b019cfcb66501048e6e881a005b2decfee9abb36efc8a2bb5e4f76fe8c","pkg-src-sha256":"94f773f9bdff67eb2d7aec9c67f80e8af79d531ba6f52fad2e142d8ce4551be9","depends":["QuickCheck-2.14.3-091d344acf9c963200a9b2af6c5417d91912262a9a84b607d918b50fdf8a8b02","aeson-2.2.1.0-2595d249b227784b9febcd5a91568775f66fd262ac45c82c44f7b4a55e9d4c27","attoparsec-0.14.4-5061b5f729de9f72f69961345d54e0249a28df7c232bb9cf2b0525b6f17a253a","base-4.18.2.0","base-compat-0.13.1-f0385202d32a5d6c7b36f9e6f39a361e139bf7a5858ef12f1c89ce0c83283469","bifunctors-5.6.1-3bfddc97d0532e0f4bedd1f64454f96744d2fe805f93a5f9e443c2c5e1035ff1","bytestring-0.11.5.3","case-insensitive-1.2.1.0-5255eaf892b10e8489fdad145ca833a10864bd951f3e69d04088fbcadf28ec6d","constraints-0.14-ab15a9f94938365a9f7a935af490e603978d84c5e110ef254a28de6613181c00","deepseq-1.4.8.1","http-api-data-0.6-f8db4c3e7ff814c1476ac3873683211db56d23f0c28cabdd051460114fc3de4f","http-media-0.8.1.1-82ac8def17fc7bb0c409983a665f6b7cccbfddad16ad03396e0ea28fa6b4797e","http-types-0.12.4-0f52a9ec33f3c65ef0b77ad8ce14b65f9164f8a761e42800dc9c80ee1768aacc","mmorph-1.2.0-967f2a66454abded96663c19c27c375e74faace9a8cd232a9ae738ec2604ffa1","mtl-2.3.1","network-uri-2.6.4.2-d62d36021f4a84b02c9243cbe37e9dfd5b7ba840b4aaedb5e002f05582564fc4","singleton-bool-0.1.7-fbe38d0a2a0228b679b4c8812d28d8c40fc5a0ec6c5d0e43b3986b92d3dfc0aa","sop-core-0.5.0.2-916ec985869f4742a9c9e1c1cdd20338928cdc574be8814bb09c58ce2e7bf566","string-conversions-0.4.0.1-84561bf691f05f917e60aa94bd28d55750bb3e08ac9a7bd02c365e1ff133b25f","tagged-0.8.8-5d06ce789c37adf39496775b08f7d82bb9509e4c2a3f973b0c868e35bca55ad5","text-2.0.2","transformers-0.6.1.0","vault-0.3.1.5-20d43e8d257de908486713884f035343ca6659f91d72e14d1c91b355c58e3031"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"servant-blaze-0.9.1-da2a7530394d74e561426e042173ccf4cf339c8817d4384d3298e88abfef4266","pkg-name":"servant-blaze","pkg-version":"0.9.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"88f4c23a97ea014909755de651800c12eda66e9f8d0cdfddbbacf1eef61889ad","pkg-src-sha256":"264aa17b95400a13cf23f7421f54b3a3160119c15380a31a96bdfc4a40f2db21","depends":["base-4.18.2.0","blaze-html-0.9.1.2-3a4f994094b15669094f06ad98d568adb79b03a7829eff4349476c2fafb25845","http-media-0.8.1.1-82ac8def17fc7bb0c409983a665f6b7cccbfddad16ad03396e0ea28fa6b4797e","servant-0.20.1-b63507222e1b19c7b8333551fd2fbdae76248ba97753767f7ab4d32b7816d39d"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"servant-client-0.20-ffd6b2eca0816fa09c64c230d34ebe7b6ee3f06a805980e86e28fb7d902f65e2","pkg-name":"servant-client","pkg-version":"0.20","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"d89d787d3b35fc0aa6721b6f33e78271fa2d5b3181ade11ca9150921844e932b","pkg-src-sha256":"765d30f3579b74bebfe79f59a4aacfd9dec0c02c7d355f389caa604f0ac3b276","depends":["base-4.18.2.0","base-compat-0.13.1-f0385202d32a5d6c7b36f9e6f39a361e139bf7a5858ef12f1c89ce0c83283469","bytestring-0.11.5.3","containers-0.6.7","deepseq-1.4.8.1","exceptions-0.10.7","http-client-0.7.16-08ac6af6261aa24f586bbb528e8ea2f0bd2e7510d1883948d770173e7ea8b633","http-media-0.8.1.1-82ac8def17fc7bb0c409983a665f6b7cccbfddad16ad03396e0ea28fa6b4797e","http-types-0.12.4-0f52a9ec33f3c65ef0b77ad8ce14b65f9164f8a761e42800dc9c80ee1768aacc","kan-extensions-5.2.5-60f11eb11e93cf481fad2a42529d0965e7472bd8d512eba70477a626921ed65c","monad-control-1.0.3.1-2bf3452c923aa94707518b6d970f4377279fd8c4ccca1256725eef18b6097440","mtl-2.3.1","semigroupoids-6.0.0.1-e83bc6491c75c3522014917ab4d3335127e2ee3b4989f0a49f9791f8bead28c6","servant-0.20.1-b63507222e1b19c7b8333551fd2fbdae76248ba97753767f7ab4d32b7816d39d","servant-client-core-0.20-9e603d4d82c8eefde573caf5b7328a91ee474d7e0ede0539645efa20a15a89d4","stm-2.5.1.0","text-2.0.2","time-1.12.2","transformers-0.6.1.0","transformers-base-0.4.6-91c64a4b19c3f5f9f196345e9032803d52322bd0857ba94ea6c4260a27a2ff07","transformers-compat-0.7.2-15ca92c51f3c4b3e5a349c3cc2a7f406ca01ba50aecd92a631a1c4d508b1230f"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"servant-client-core-0.20-9e603d4d82c8eefde573caf5b7328a91ee474d7e0ede0539645efa20a15a89d4","pkg-name":"servant-client-core","pkg-version":"0.20","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"fb4d8c3ee3bcb09afbea93994cc9d0d54278d5460213b8002c36b08deb76070b","pkg-src-sha256":"a6744916079ec769c248ff5f7a2cc62d7eb03abb445be6c1fa7811c2866b4b04","depends":["aeson-2.2.1.0-2595d249b227784b9febcd5a91568775f66fd262ac45c82c44f7b4a55e9d4c27","base-4.18.2.0","base-compat-0.13.1-f0385202d32a5d6c7b36f9e6f39a361e139bf7a5858ef12f1c89ce0c83283469","base64-bytestring-1.2.1.0-ecb3bf792eac6ec696f20e02e528e8a7b2a76a5b32c46409c4645e1bfbd71cf4","bytestring-0.11.5.3","constraints-0.14-ab15a9f94938365a9f7a935af490e603978d84c5e110ef254a28de6613181c00","containers-0.6.7","deepseq-1.4.8.1","exceptions-0.10.7","free-5.2-841f6f1c7522ed92dbed9d024b48671e79a9cdd76652f8bdbf9c0e63908771e7","http-media-0.8.1.1-82ac8def17fc7bb0c409983a665f6b7cccbfddad16ad03396e0ea28fa6b4797e","http-types-0.12.4-0f52a9ec33f3c65ef0b77ad8ce14b65f9164f8a761e42800dc9c80ee1768aacc","network-uri-2.6.4.2-d62d36021f4a84b02c9243cbe37e9dfd5b7ba840b4aaedb5e002f05582564fc4","safe-0.3.21-31bf385773e1c6ef212139e0505190c20d1e3d1af99bcbfc189c01c3a1e0e739","servant-0.20.1-b63507222e1b19c7b8333551fd2fbdae76248ba97753767f7ab4d32b7816d39d","sop-core-0.5.0.2-916ec985869f4742a9c9e1c1cdd20338928cdc574be8814bb09c58ce2e7bf566","template-haskell-2.20.0.0","text-2.0.2","transformers-0.6.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"servant-effectful-0.0.1.0-c4ee2e1edab9dee5d08c4d73546b8e7f68d11d1fb84ee678884d3202776c376f","pkg-name":"servant-effectful","pkg-version":"0.0.1.0","flags":{},"style":"global","pkg-src":{"type":"source-repo","source-repo":{"type":"git","location":"https://github.com/kleidukos/servant-effectful","tag":"cec4d54"}},"pkg-src-sha256":"447e32a04da1415d62bad0b7f243962f235b353a738e2005241d5378a4fc2024","depends":["base-4.18.2.0","effectful-core-2.3.0.1-011d84ab0bc8bb2010bac83565500e3039592cab57d902e9a2a502684b92d90f","mtl-2.3.1","servant-server-0.20-3dbcc60207566a1f80874e61a86b73ab8a41f98f3231692dec244b2ce96f8132","warp-3.3.31-3a081a14799ab48e5efe3a315077d1e89ea4da61799497b4990d5fc7e0dcb380"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"servant-lucid-0.9.0.6-3245f97c511011e42d95122d5373c12ebeb20de76226f6491768d04935bf6b52","pkg-name":"servant-lucid","pkg-version":"0.9.0.6","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"b7de9f07a056037a10cc012136e7cabc2e685403791d2c0cb0a92f16e3ade6ac","pkg-src-sha256":"a03973035722f9aee7a67fcbb6f44a2d515284e21b0bbf236fda3207132709fd","depends":["base-4.18.2.0","http-media-0.8.1.1-82ac8def17fc7bb0c409983a665f6b7cccbfddad16ad03396e0ea28fa6b4797e","lucid-2.11.20230408-181c7ed44fa9b37af3ac434ed53e16dbe6a7ca9ec7ef1f7e5c921196d628f3c0","servant-0.20.1-b63507222e1b19c7b8333551fd2fbdae76248ba97753767f7ab4d32b7816d39d","text-2.0.2"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"servant-openapi3-2.0.1.6-92378e8ee0bea5a4e54c3dd4fc1e97b9c790b2fcc65c5a79e54d520319677c44","pkg-name":"servant-openapi3","pkg-version":"2.0.1.6","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"bd35a4d7c9d6c1d01763ab65461978a0c1212d6070c72f4cf745b78918145d0f","pkg-src-sha256":"322a2181fb2becb20b80ad8319dd3ce1874d89cd344a8d8a4e17d1428d1dbfc3","components":{"lib":{"depends":["QuickCheck-2.14.3-091d344acf9c963200a9b2af6c5417d91912262a9a84b607d918b50fdf8a8b02","aeson-2.2.1.0-2595d249b227784b9febcd5a91568775f66fd262ac45c82c44f7b4a55e9d4c27","aeson-pretty-0.8.10-9bd6a60b424b6a69fcd0507ef3b99938ee971580bc5bfa89249b16ff60b2c117","base-4.18.2.0","base-compat-0.13.1-f0385202d32a5d6c7b36f9e6f39a361e139bf7a5858ef12f1c89ce0c83283469","bytestring-0.11.5.3","hspec-2.11.7-e5ff04a60a8c23d1953854fc051870a447d8cf15eac67b388ed88c8c0711ecd0","http-media-0.8.1.1-82ac8def17fc7bb0c409983a665f6b7cccbfddad16ad03396e0ea28fa6b4797e","insert-ordered-containers-0.2.5.3-3706f6956e9c93eb40f4960ef2def44ebba2c69366f9391e537c47e536d7a5e7","lens-5.2.3-fd9d842bd7b66c837b8b9d8ed9b74a1913e207465f21d80d3c84691d23c5c119","openapi3-3.2.4-36a3dd9c34b66f8d7bf989194c80a50284551837b7d8417e8ce95b4a35d15c2e","servant-0.20.1-b63507222e1b19c7b8333551fd2fbdae76248ba97753767f7ab4d32b7816d39d","singleton-bool-0.1.7-fbe38d0a2a0228b679b4c8812d28d8c40fc5a0ec6c5d0e43b3986b92d3dfc0aa","text-2.0.2","unordered-containers-0.2.20-013ecc3e94c07bd5bdb23da8c9cf4d68ac66e04c4144b4096b291104672db345"],"exe-depends":[]},"setup":{"depends":["Cabal-3.10.1.0","base-4.18.2.0","cabal-doctest-1.0.9-4a685fb2745cdab49526ff8fe3801bf6bd4ab5085239033fcfd51613f7e3fd76"],"exe-depends":[]}}},{"type":"configured","id":"servant-server-0.20-3dbcc60207566a1f80874e61a86b73ab8a41f98f3231692dec244b2ce96f8132","pkg-name":"servant-server","pkg-version":"0.20","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"6f312610f197b0162dc198250c553c9bcfeeb8d2f960929909a1d21e278d37f8","pkg-src-sha256":"13b2fe785be1aae07e15d139fa1f94c7c5db6c8d36d0fc7789576b31a9bee8be","depends":["base-4.18.2.0","base-compat-0.13.1-f0385202d32a5d6c7b36f9e6f39a361e139bf7a5858ef12f1c89ce0c83283469","base64-bytestring-1.2.1.0-ecb3bf792eac6ec696f20e02e528e8a7b2a76a5b32c46409c4645e1bfbd71cf4","bytestring-0.11.5.3","constraints-0.14-ab15a9f94938365a9f7a935af490e603978d84c5e110ef254a28de6613181c00","containers-0.6.7","exceptions-0.10.7","filepath-1.4.200.1","http-api-data-0.6-f8db4c3e7ff814c1476ac3873683211db56d23f0c28cabdd051460114fc3de4f","http-media-0.8.1.1-82ac8def17fc7bb0c409983a665f6b7cccbfddad16ad03396e0ea28fa6b4797e","http-types-0.12.4-0f52a9ec33f3c65ef0b77ad8ce14b65f9164f8a761e42800dc9c80ee1768aacc","monad-control-1.0.3.1-2bf3452c923aa94707518b6d970f4377279fd8c4ccca1256725eef18b6097440","mtl-2.3.1","network-3.1.4.0-9d41c9df77e8d21da5aaf51c19540d3c0fc11e5e2c2940bea5411915b8a462ff","network-uri-2.6.4.2-d62d36021f4a84b02c9243cbe37e9dfd5b7ba840b4aaedb5e002f05582564fc4","resourcet-1.3.0-0f210c6e8ffe9f595ad8fd1a6cf6726e42a6695abb7febee22452f40436a2bc5","servant-0.20.1-b63507222e1b19c7b8333551fd2fbdae76248ba97753767f7ab4d32b7816d39d","sop-core-0.5.0.2-916ec985869f4742a9c9e1c1cdd20338928cdc574be8814bb09c58ce2e7bf566","string-conversions-0.4.0.1-84561bf691f05f917e60aa94bd28d55750bb3e08ac9a7bd02c365e1ff133b25f","tagged-0.8.8-5d06ce789c37adf39496775b08f7d82bb9509e4c2a3f973b0c868e35bca55ad5","text-2.0.2","transformers-0.6.1.0","transformers-base-0.4.6-91c64a4b19c3f5f9f196345e9032803d52322bd0857ba94ea6c4260a27a2ff07","wai-3.2.4-acf062ae483a435740bc88b21ee81f62d3f94a62faea15a5bf17463ace439645","wai-app-static-3.1.8-d2d0c9be3a5bd2980a68b3225b620c023885a62d44f09cee23e1325fcbe6c50c","word8-0.1.3-f7afede617c5019b5fe8b27341f573a6ee2d2232a9ed28ec7e4caca5e3512696"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"servant-server-0.20-e-greet-c4c2dabfbf5e13a9abbac418346eb7480bf780a0e30e97504f50adc6ed1fe689","pkg-name":"servant-server","pkg-version":"0.20","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"6f312610f197b0162dc198250c553c9bcfeeb8d2f960929909a1d21e278d37f8","pkg-src-sha256":"13b2fe785be1aae07e15d139fa1f94c7c5db6c8d36d0fc7789576b31a9bee8be","depends":["aeson-2.2.1.0-2595d249b227784b9febcd5a91568775f66fd262ac45c82c44f7b4a55e9d4c27","base-4.18.2.0","base-compat-0.13.1-f0385202d32a5d6c7b36f9e6f39a361e139bf7a5858ef12f1c89ce0c83283469","servant-0.20.1-b63507222e1b19c7b8333551fd2fbdae76248ba97753767f7ab4d32b7816d39d","servant-server-0.20-3dbcc60207566a1f80874e61a86b73ab8a41f98f3231692dec244b2ce96f8132","text-2.0.2","wai-3.2.4-acf062ae483a435740bc88b21ee81f62d3f94a62faea15a5bf17463ace439645","warp-3.3.31-3a081a14799ab48e5efe3a315077d1e89ea4da61799497b4990d5fc7e0dcb380"],"exe-depends":[],"component-name":"exe:greet","bin-file":"/home/hecate/Projects/Flora/1-flora-server/_build/cabal-store/ghc-9.6.4/servant-server-0.20-e-greet-c4c2dabfbf5e13a9abbac418346eb7480bf780a0e30e97504f50adc6ed1fe689/bin/greet"},{"type":"configured","id":"servant-static-th-1.0.0.0-fa0f3ab3712e7a8402c328f207cfc41d9d7c81ead2eb76b54e22775de96a15db","pkg-name":"servant-static-th","pkg-version":"1.0.0.0","flags":{"buildexample":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"7dc46a426d8c78ee0386729159e8bbc18ff98e0dd700a2c723c87901b204fa6c","pkg-src-sha256":"25d4ca76d10bcaef4ae33571c3629d015b92297bb0391806d7f06f91e6327ec6","depends":["base-4.18.2.0","blaze-html-0.9.1.2-3a4f994094b15669094f06ad98d568adb79b03a7829eff4349476c2fafb25845","bytestring-0.11.5.3","containers-0.6.7","directory-1.3.8.1","filepath-1.4.200.1","http-media-0.8.1.1-82ac8def17fc7bb0c409983a665f6b7cccbfddad16ad03396e0ea28fa6b4797e","semigroups-0.20-b7dd1b9febe28a509d4e029a8add1506aac955b99fce2599f25e63f8127812a9","servant-0.20.1-b63507222e1b19c7b8333551fd2fbdae76248ba97753767f7ab4d32b7816d39d","servant-blaze-0.9.1-da2a7530394d74e561426e042173ccf4cf339c8817d4384d3298e88abfef4266","servant-server-0.20-3dbcc60207566a1f80874e61a86b73ab8a41f98f3231692dec244b2ce96f8132","template-haskell-2.20.0.0","text-2.0.2"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"simple-sendfile-0.2.32-40d1e9f7a944730d0ccd2218dd6dd93bb24e35bc984ac0852a20de36b49e40dc","pkg-name":"simple-sendfile","pkg-version":"0.2.32","flags":{"allow-bsd":true,"fallback":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"133f419b9b6b8a4db8541f381c20b8dfca962a59e82ba203e66d6bef41cf8ea4","pkg-src-sha256":"9f28d0a67ac3d956d2dd78eb19ea922c0a9192bbbeeeead20d39f561636828a3","depends":["base-4.18.2.0","bytestring-0.11.5.3","network-3.1.4.0-9d41c9df77e8d21da5aaf51c19540d3c0fc11e5e2c2940bea5411915b8a462ff","unix-2.8.4.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"singleton-bool-0.1.7-fbe38d0a2a0228b679b4c8812d28d8c40fc5a0ec6c5d0e43b3986b92d3dfc0aa","pkg-name":"singleton-bool","pkg-version":"0.1.7","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"ec20e246f8bbe46c17789113b5f2154abdddf14b8a06efc4724832f657680dab","pkg-src-sha256":"1c2d196386c3697e884fcc8bef530506045a4860a5f669cc8416358b473bb29b","depends":["base-4.18.2.0","boring-0.2.1-9a8dc8e41ea918a09754ff07614d4843b0ebe75d8757fd3273e17938f5bf6233","dec-0.0.5-df077fdbf908bb3fdbc8e113d90c87e216153ded7ddd81017ddf01027a3a495b","deepseq-1.4.8.1","some-1.0.6-b5e68e5a2560a2bb7914b23d969585e8eec636a7a4ee9bccb9ebc0ce020bbc67"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"slugify-0.1.0.1-4ab88c5012a98f82389b22741a6da4533ceb4b7336ca607b4e641118933d2d75","pkg-name":"slugify","pkg-version":"0.1.0.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"0764c30a5d6d6342ca055a97f0a7b4279a26b42b9483b73420d1b364d3f8fb38","pkg-src-sha256":"7b6304a31eef16fe291fd24b539a875795500e53f4b2d244a6203438c65db4c0","depends":["base-4.18.2.0","text-2.0.2","unicode-transforms-0.4.0.1-8c67b0eaf2d5104e81ffbe7caf4900a211ea1e275b21ae6aca8253bd0b8d074b"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"socks-0.6.1-6b9e88c9a8f5eb4e1297331a35574d1481e0bfa053fb8eb954e442854a2c7b98","pkg-name":"socks","pkg-version":"0.6.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"ac190808eea704672df18f702e8f2ad0b7a4d0af528e95ee55ea6ee0be672e2a","pkg-src-sha256":"734447558bb061ce768f53a0df1f2401902c6bee396cc96ce627edd986ef6a73","depends":["base-4.18.2.0","basement-0.0.16-2ba9d181df7bdd547d6fedd5acdec581f03e379e22b0e08ff998fb0462257d08","bytestring-0.11.5.3","cereal-0.5.8.3-930e90604013ce2a32c6d28d3567d1d966e50eb1bf0c18108838f2b4ff0d64ca","network-3.1.4.0-9d41c9df77e8d21da5aaf51c19540d3c0fc11e5e2c2940bea5411915b8a462ff"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"some-1.0.6-b5e68e5a2560a2bb7914b23d969585e8eec636a7a4ee9bccb9ebc0ce020bbc67","pkg-name":"some","pkg-version":"1.0.6","flags":{"newtype-unsafe":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"563f5e0db06772cb1c64d690a07fa9976a1a2dc43ee85a8de52e058d579c4d77","pkg-src-sha256":"f7a606ad5df4a07459986364f7d739eb653495fbbe1d7158582fb29a4584bfb9","depends":["base-4.18.2.0","base-orphans-0.9.1-61d128d6a3318593c785a97751f2418cc86b42b03e2b46ed92e9b27fc5da689c","deepseq-1.4.8.1"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"sop-core-0.5.0.2-916ec985869f4742a9c9e1c1cdd20338928cdc574be8814bb09c58ce2e7bf566","pkg-name":"sop-core","pkg-version":"0.5.0.2","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"9d857199f5eab3e2467be69336568d147fa24116a0999000100e4f0739719966","pkg-src-sha256":"87bffd2254b98ded822d449fcd1c33dbd74d2ce96bf35e7a6714abc5a2297265","depends":["base-4.18.2.0","deepseq-1.4.8.1"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"souffle-haskell-4.0.0-122eb0210bf095a8300c9247fb7467920a26f76fde9fbfed4d1bae48e6666480","pkg-name":"souffle-haskell","pkg-version":"4.0.0","flags":{},"style":"global","pkg-src":{"type":"source-repo","source-repo":{"type":"git","location":"https://github.com/tchoutri/souffle-haskell","tag":"3afe53f"}},"pkg-src-sha256":"fa4cf59eff0d2b759c3c8ad720a5f849c988431a3d024e993b4d12c740ef5d37","depends":["array-0.5.6.0","base-4.18.2.0","bytestring-0.11.5.3","deepseq-1.4.8.1","directory-1.3.8.1","filepath-1.4.200.1","mtl-2.3.1","process-1.6.17.0","profunctors-5.6.2-8b084a9552445e5776f01a7b42f1722ce1ecf20cf9a8e839007b9baea33b9fa4","temporary-1.3-8e8fc8e7de23013c321e5cc7c7df5ece76432805295711c83110e9fdced98b05","text-2.0.2","vector-0.13.1.0-eb53bdac16f057ad838f4e8cb865b51b400abac71a36dc5bfde93ea1d0859eae"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"split-0.2.5-f91000d531a43d0958a6d552a0e528a48098723972009db93c4b79044dc4bd51","pkg-name":"split","pkg-version":"0.2.5","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"5bc1ae848bfded3087ea3e568908f1b75f56ecde6f02df3fad1a138dd5c783d5","pkg-src-sha256":"52da404e8397c1ab238354c8d4fd9a7e9c5cac8849cc2ce2e45facc85e74a913","depends":["base-4.18.2.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"splitmix-0.1.0.5-4c4c1f33537354cbf1e3da145a4775d1633faaa320080e06e92a1f67dbed4227","pkg-name":"splitmix","pkg-version":"0.1.0.5","flags":{"optimised-mixer":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"bac0ae8d46a04e410666b0c8081cff63f060f29157983b569ca86ddb6e6e0dc6","pkg-src-sha256":"9df07a9611ef45f1b1258a0b412f4d02c920248f69d2e2ce8ccda328f7e13002","depends":["base-4.18.2.0","deepseq-1.4.8.1"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"stm-2.5.1.0","pkg-name":"stm","pkg-version":"2.5.1.0","depends":["array-0.5.6.0","base-4.18.2.0"]},{"type":"configured","id":"stm-chans-3.0.0.9-577989fa35770d28044d742360c9f0596a5d84e540cf2b1ce7716c9d1fa528e0","pkg-name":"stm-chans","pkg-version":"3.0.0.9","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"b2d4b54b2859da7a002819165fae0b051582036af7c313c23e9e0d28562e1938","pkg-src-sha256":"7a060df537cb93c98380a770f88d4a1ff08b79fe07203c859be7bc815dc1325d","depends":["base-4.18.2.0","stm-2.5.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"streaming-commons-0.2.2.6-9fa4239301ef39252b6218423c0a2438611fe43c2ddbebd4f8953d4455c07935","pkg-name":"streaming-commons","pkg-version":"0.2.2.6","flags":{"use-bytestring-builder":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"d5c6fb99efd4e71bdb0351d55f2d87e16c11880f42998e39363eb63f057ae24b","pkg-src-sha256":"0180958a882eb0f6262b812fe886c2b1b8285474b5b958f814ae4f05409fbf79","depends":["array-0.5.6.0","async-2.2.4-2107e60f1bee7c70ffed77e551ffc7db01e350edd8784cc9493cc782305122d0","base-4.18.2.0","bytestring-0.11.5.3","directory-1.3.8.1","network-3.1.4.0-9d41c9df77e8d21da5aaf51c19540d3c0fc11e5e2c2940bea5411915b8a462ff","process-1.6.17.0","random-1.2.1.2-cc746490e13a1f967de173a54c09753b2ccdb5d95056b0f1206a29c62c83de45","stm-2.5.1.0","text-2.0.2","transformers-0.6.1.0","unix-2.8.4.0","zlib-0.6.3.0-61cb40f46d103a622525dc3a70a9004984ec56d61deea65d2dc01c964606b7e9"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"streamly-0.10.1-355a5bd5db83dc8d0325992ae963a6091c0eb61a91ecdda01c0d7d997bd43408","pkg-name":"streamly","pkg-version":"0.10.1","flags":{"debug":false,"dev":false,"fusion-plugin":false,"has-llvm":false,"inspection":false,"limit-build-mem":false,"opt":true,"use-unliftio":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"f63db612bd97182c3eca4e23f0ddc6bbf45d025db155e113335e7b07ccdef49f","pkg-src-sha256":"b66b832aec36db07edb6e00901cbfe32c55ef245a5bbc6ab2c9cbb4d25ccdbc7","components":{"lib":{"depends":["atomic-primops-0.8.5-619a7ba3c59ea074ae39e3adf75904b21a27146e973f334ea4ab876a9cc1e3c2","base-4.18.2.0","containers-0.6.7","deepseq-1.4.8.1","directory-1.3.8.1","exceptions-0.10.7","hashable-1.4.3.0-17b447e0ce504d4e093d6bf5a9838da3805c7caa5d16355da40827d004febbc8","heaps-0.4-8352de6c15db4be4912bb7418446dab1e2d80f26647938794abadafee6111c60","lockfree-queue-0.2.4-db50ab392a0002236dd2987e766180a4fb8a8cc2c59dcf98973caca190b12610","monad-control-1.0.3.1-2bf3452c923aa94707518b6d970f4377279fd8c4ccca1256725eef18b6097440","mtl-2.3.1","network-3.1.4.0-9d41c9df77e8d21da5aaf51c19540d3c0fc11e5e2c2940bea5411915b8a462ff","streamly-core-0.2.2-1de2fd5320df2135ec5ee591367a8233ec85c39bfb2366f77b325fca4e8a6657","template-haskell-2.20.0.0","transformers-0.6.1.0","unicode-data-0.4.0.1-2cec5f4ee6f7dac835f9656497f58d5132b6da46ac07f33c15ef93dbfe67a942","unordered-containers-0.2.20-013ecc3e94c07bd5bdb23da8c9cf4d68ac66e04c4144b4096b291104672db345"],"exe-depends":[]}}},{"type":"configured","id":"streamly-core-0.2.2-1de2fd5320df2135ec5ee591367a8233ec85c39bfb2366f77b325fca4e8a6657","pkg-name":"streamly-core","pkg-version":"0.2.2","flags":{"debug":false,"dev":false,"has-llvm":false,"limit-build-mem":false,"opt":true,"use-folds":false,"use-unfolds":false,"use-unliftio":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"e44a0f6e4870df7a206dbaad531deac7907a73a883fbdb5a460d63a8e086efe7","pkg-src-sha256":"ca94773dece7e0cc0c8afbdca15c5f62d48c769b781833abd231bf80d88cd583","components":{"lib":{"depends":["base-4.18.2.0","containers-0.6.7","directory-1.3.8.1","exceptions-0.10.7","filepath-1.4.200.1","fusion-plugin-types-0.1.0-af0a0db9279412adcb5a431d750045b40fdb99350a31564d7ec80e2944df0ac3","ghc-bignum-1.3","ghc-prim-0.10.0","heaps-0.4-8352de6c15db4be4912bb7418446dab1e2d80f26647938794abadafee6111c60","monad-control-1.0.3.1-2bf3452c923aa94707518b6d970f4377279fd8c4ccca1256725eef18b6097440","template-haskell-2.20.0.0","transformers-0.6.1.0","unix-2.8.4.0"],"exe-depends":[]}}},{"type":"configured","id":"strict-0.5-84b2c7152a9fd6aee3e1d1082edade7580c5af3226a0afc18e19724ada9d7fe4","pkg-name":"strict","pkg-version":"0.5","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"bd57d7b3655951dfaa7d1e1374d7352dfe83f82a9c98309bf3a6587ef8cbd87d","pkg-src-sha256":"3f4f0995dec2d520d0e321542f71412dac023658fdab603db04364d75269a0fd","depends":["assoc-1.1-44564689989a4d2721c54fe7433f3b2450e556c3fe6c52752ad54623647f561c","base-4.18.2.0","binary-0.8.9.1","bytestring-0.11.5.3","deepseq-1.4.8.1","ghc-prim-0.10.0","hashable-1.4.3.0-17b447e0ce504d4e093d6bf5a9838da3805c7caa5d16355da40827d004febbc8","text-2.0.2","these-1.2-a7d4e934136841dac2b8ed0dc77fee3f581d8c4e25fe99bdad5b76406c57bf16","transformers-0.6.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"string-conv-0.2.0-2b20138e5715fec3a0be370b62f70071e607c80729c0151ebac083484fb380fb","pkg-name":"string-conv","pkg-version":"0.2.0","flags":{"lib-werror":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"5aaa21ad20be79ec6fedcc6f45ef2d34b32797da8715e48d803ac467059b7333","pkg-src-sha256":"39cea3010eb1c52b6dd21c4108e23b89926f0f21b872ad1f5f644328c73a9096","depends":["base-4.18.2.0","bytestring-0.11.5.3","text-2.0.2"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"string-conversions-0.4.0.1-84561bf691f05f917e60aa94bd28d55750bb3e08ac9a7bd02c365e1ff133b25f","pkg-name":"string-conversions","pkg-version":"0.4.0.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"9af49d61d1dcbc8b90b66f1b6580996b7927f745273edb59141ad6744aef7cbc","pkg-src-sha256":"46bcce6d9ce62c558b7658a75d9c6a62f7259d6b0473d011d8078234ad6a1994","depends":["base-4.18.2.0","bytestring-0.11.5.3","text-2.0.2","utf8-string-1.0.2-5e8d116496349c38d20293f85d47a22c703548b74e7d267d8d6d20ff907c03cd"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"syb-0.7.2.4-80d2f5060ad894d00e83dbe185e57c37c081728996394fa6f5a2fa912bb894f4","pkg-name":"syb","pkg-version":"0.7.2.4","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"936d5a92084ad9d88c5a9dd2e622deab57ce48ce85be93e6273b3f8eb64c12ca","pkg-src-sha256":"ec7c1e8822d62ab910386361cdcee40a22a26cd344c34741fadd982302291e60","depends":["base-4.18.2.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"tagged-0.8.8-5d06ce789c37adf39496775b08f7d82bb9509e4c2a3f973b0c868e35bca55ad5","pkg-name":"tagged","pkg-version":"0.8.8","flags":{"deepseq":true,"transformers":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"c4fdbd3e1c423af0ccf8eb9e9962620106c34e32ed8e0cc647fb06899a703e04","pkg-src-sha256":"a083fa7835516203c168433a1c8dfc0290a94b05fedab566ad0640fc9137a6a7","depends":["base-4.18.2.0","deepseq-1.4.8.1","template-haskell-2.20.0.0","transformers-0.6.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"tar-0.6.1.0-2355dea2b7e5a1fb20c6753c9c6e0e55e2208d19d4f800ee0c38ad10afdd8945","pkg-name":"tar","pkg-version":"0.6.1.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"3ed979ee1bb00b4e488537988ee6bb3c2c67e66678804125e2df08a527822b4e","pkg-src-sha256":"edfef2e126440839d34f23fff7f3616d0bfffa0345ea13d4d0fee9a669d305da","depends":["tar-0.6.1.0-l-tar-internal-1aae186eb408d3785bd7f67a0382b0e7a4c4edeff6562f680c56aba961b4dd7a"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"tar-0.6.1.0-l-tar-internal-1aae186eb408d3785bd7f67a0382b0e7a4c4edeff6562f680c56aba961b4dd7a","pkg-name":"tar","pkg-version":"0.6.1.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"3ed979ee1bb00b4e488537988ee6bb3c2c67e66678804125e2df08a527822b4e","pkg-src-sha256":"edfef2e126440839d34f23fff7f3616d0bfffa0345ea13d4d0fee9a669d305da","depends":["array-0.5.6.0","base-4.18.2.0","bytestring-0.11.5.3","containers-0.6.7","deepseq-1.4.8.1","directory-1.3.8.1","filepath-1.4.200.1","os-string-2.0.2-c94c7716dceda9adcf8c3208c87dc23b7f71b84fca751a70ffc309850517a402","time-1.12.2","transformers-0.6.1.0"],"exe-depends":[],"component-name":"lib:tar-internal"},{"type":"configured","id":"tasty-1.5-fd9a969b42a912ece8c4543e101cd6e26eee76689c8c5a012bcea4edbf273551","pkg-name":"tasty","pkg-version":"1.5","flags":{"unix":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"8da3f47fff790714f7d676692f1207aac156b41f705c55f14d1d8147a751264b","pkg-src-sha256":"ca5cf7852a210e691d4dce67ee34de7ccb8ae390a3a68ecffde307e326d029ac","depends":["ansi-terminal-1.0.2-f2271bf25e5299c165409ab78d5917aeba79c479959932bb5fb284c513226fc0","base-4.18.2.0","containers-0.6.7","optparse-applicative-0.18.1.0-1de8f12cfc2915bc6d323ba97415a7e0795036a6b613e7301735aedf9d0425be","stm-2.5.1.0","tagged-0.8.8-5d06ce789c37adf39496775b08f7d82bb9509e4c2a3f973b0c868e35bca55ad5","transformers-0.6.1.0","unix-2.8.4.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"tasty-hunit-0.10.1-d5d74b078c2fc7d0540add40bfcb063d16fc8fc5e21d9467944dfc172c67d6a5","pkg-name":"tasty-hunit","pkg-version":"0.10.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"ebc17b490750d4796b21d44001b852688cc39f9c34e387d5e7958e09b9b3f3b9","pkg-src-sha256":"9ceb423bd258b04c893b8b43434f50b7ff487c7afd092fe2ef9415ca8c2c2083","depends":["base-4.18.2.0","call-stack-0.4.0-a0fd887e5d06d11a75269d5dfed7da6fe2656edbbd7cc1697fb2a2b8ad4fe392","tasty-1.5-fd9a969b42a912ece8c4543e101cd6e26eee76689c8c5a012bcea4edbf273551"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"template-haskell-2.20.0.0","pkg-name":"template-haskell","pkg-version":"2.20.0.0","depends":["base-4.18.2.0","ghc-boot-th-9.6.4","ghc-prim-0.10.0","pretty-1.1.3.6"]},{"type":"configured","id":"temporary-1.3-8e8fc8e7de23013c321e5cc7c7df5ece76432805295711c83110e9fdced98b05","pkg-name":"temporary","pkg-version":"1.3","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"3a66c136f700dbf42f3c5000ca93e80b26dead51e54322c83272b236c1ec8ef1","pkg-src-sha256":"8c442993694b5ffca823ce864af95bd2841fb5264ee511c61cf48cc71d879890","depends":["base-4.18.2.0","directory-1.3.8.1","exceptions-0.10.7","filepath-1.4.200.1","random-1.2.1.2-cc746490e13a1f967de173a54c09753b2ccdb5d95056b0f1206a29c62c83de45","transformers-0.6.1.0","unix-2.8.4.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"terminal-size-0.3.4-172d551b468144cc78b519639c232b4d8e46869dd22d4d30ed85ae123e1301e8","pkg-name":"terminal-size","pkg-version":"0.3.4","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"f0318c54273d04afb65109683b442792dcb67af1ad01ab5ec64423a28bb97715","pkg-src-sha256":"b0f070d6926cdaacf3a412c5518e5c23afca1e0ed00808a5328c96e468b67f49","depends":["base-4.18.2.0"],"exe-depends":["hsc2hs-0.68.10-e-hsc2hs-3b4e464e6a657183d9f83bd37c6d876421d9f6d00ca34e12b12ca3365e55159d"],"component-name":"lib"},{"type":"pre-existing","id":"text-2.0.2","pkg-name":"text","pkg-version":"2.0.2","depends":["array-0.5.6.0","base-4.18.2.0","binary-0.8.9.1","bytestring-0.11.5.3","deepseq-1.4.8.1","ghc-prim-0.10.0","template-haskell-2.20.0.0"]},{"type":"configured","id":"text-conversions-0.3.1.1-b955b2970b27e7be4b7afdac05f3480d3269bc092ad183c3d72cd22fe91a90cd","pkg-name":"text-conversions","pkg-version":"0.3.1.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"35dc3ee494275509a3a771d5d27fc02d4af34478a40126cba87cdc6f007d551e","pkg-src-sha256":"c8770fba789ce80334cae628285103c49abec0fa074773cbb5a88e26f5a7725d","depends":["base-4.18.2.0","base16-bytestring-1.0.2.0-b470eb3428775005093b18dbb34dd687b575cadcc3d709cf63c09611d917e654","base64-bytestring-1.2.1.0-ecb3bf792eac6ec696f20e02e528e8a7b2a76a5b32c46409c4645e1bfbd71cf4","bytestring-0.11.5.3","text-2.0.2"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"text-display-0.0.5.1-ae9f66e9765923d9edec209058cc153706fead0e7c7287c2994a985da1c39623","pkg-name":"text-display","pkg-version":"0.0.5.1","flags":{"book":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"da3515adb03b5c01d8e8f0ca81ac0cce4f3ae36f7b74e8566108220a1da670eb","pkg-src-sha256":"1885fc8e32ac66f7396b8356dc216685a43e53693df3979854f4158c3277228f","depends":["base-4.18.2.0","bytestring-0.11.5.3","text-2.0.2"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"text-iso8601-0.1-ca672f6e92319e19ff854d44b5ac9b4e7c827c1996a06b87b8a221dbacac85fb","pkg-name":"text-iso8601","pkg-version":"0.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"ac86f2500ca751db3c0de029dd7e7826bef7366d59dc0085b00fc695c43b9f76","pkg-src-sha256":"f58e7a46f951f1f13d2929e0a2f84f6db7894d55a641169aaf300aea9ada5fcf","depends":["base-4.18.2.0","integer-conversion-0.1.0.1-8c064ed0d1fb658105e6fb4ccc9c29b5609d33ee30393dfe431660a716d124d0","text-2.0.2","time-1.12.2","time-compat-1.9.6.1-2b2aa066adc7c0d5baad9d0716626a41574966c2265b4ff355b83a2bfd5ca61a"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"text-manipulate-0.3.1.0-bbaadf2af0a73d136732896cbf24da16ec9680c37b15a75cb7d27e4488f229a7","pkg-name":"text-manipulate","pkg-version":"0.3.1.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"aa2b074d0bba21a15e2d4b5b3ff439dea75f3b114b25436b75e615e7cebe9d66","pkg-src-sha256":"9a67efef74bf8a0166436e11bc5b668c10a943c5454fdac3c8de366668a306bc","depends":["base-4.18.2.0","text-2.0.2"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"text-short-0.1.5-e014e79f76c5438274db6ad0455e870f44faf95f73a43bdf4e1c22851755dbaa","pkg-name":"text-short","pkg-version":"0.1.5","flags":{"asserts":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"9c73c9c9182ca69ee92ce3758f515b1c078cd167d882ccc8c46f92f68c65e190","pkg-src-sha256":"a35ec6cde2ada084c1a050dc5885be5ab01f851b93d744cf0facbc1c18002dda","depends":["base-4.18.2.0","binary-0.8.9.1","bytestring-0.11.5.3","deepseq-1.4.8.1","ghc-prim-0.10.0","hashable-1.4.3.0-17b447e0ce504d4e093d6bf5a9838da3805c7caa5d16355da40827d004febbc8","template-haskell-2.20.0.0","text-2.0.2"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"tf-random-0.5-d20b981bd0edba50c6bca263adb1566e44b7f7cb2b92de86a3f3b07af9e476eb","pkg-name":"tf-random","pkg-version":"0.5","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"14012837d0f0e18fdbbe3d56e67da8622ee5e20b180abce952dd50bd9f36b326","pkg-src-sha256":"2e30cec027b313c9e1794d326635d8fc5f79b6bf6e7580ab4b00186dadc88510","depends":["base-4.18.2.0","primitive-0.9.0.0-a6aa61bd9fff8d6cfd4880894dd85d8e644fbcf178b2bff38f87569871ea4a0d","random-1.2.1.2-cc746490e13a1f967de173a54c09753b2ccdb5d95056b0f1206a29c62c83de45","time-1.12.2"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"th-abstraction-0.6.0.0-b49a83d27ea2604c7977c309bd302e93941309c5040c248dbdb6b55147976b2b","pkg-name":"th-abstraction","pkg-version":"0.6.0.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"d8959fa6a2812afcdd5f6f255fd6be8b3e0ca01e425586a554544fcb70b0ec7c","pkg-src-sha256":"69ea6eca1f0c00b6e1e1f8329c908ec76e73855e2ce6e91ace2f8bbf92c51a30","depends":["base-4.18.2.0","containers-0.6.7","ghc-prim-0.10.0","template-haskell-2.20.0.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"th-compat-0.1.4-102530325c2b6ccd251d9c304ca6729eb04836a98ab4cdda25fa565147ccb66e","pkg-name":"th-compat","pkg-version":"0.1.4","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"f5f2c679ecc1c1b83d2d68db6cc564e5c78d53425e69e1b9e36784820e122d37","pkg-src-sha256":"d8f97ac14ab47b6b8a7b0fdb4ff95426322ec56badd01652ac15da4a44d4bab8","depends":["base-4.18.2.0","template-haskell-2.20.0.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"th-expand-syns-0.4.11.0-3f181234350a5a4d61570069da1a928aba2739a9b90cb8092c414ac27d235846","pkg-name":"th-expand-syns","pkg-version":"0.4.11.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"d1c1d48d5a27e0c52c68ab0d783c649046723b566600e1440f26027eca45e221","pkg-src-sha256":"8acd59ce73078ec6fb39f7555c4bb6cf1e49c256859c30aa8a4fda6d029bf7d0","depends":["base-4.18.2.0","containers-0.6.7","syb-0.7.2.4-80d2f5060ad894d00e83dbe185e57c37c081728996394fa6f5a2fa912bb894f4","template-haskell-2.20.0.0","th-abstraction-0.6.0.0-b49a83d27ea2604c7977c309bd302e93941309c5040c248dbdb6b55147976b2b"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"th-lift-0.8.4-b78b8ae6ed3a29479941c4c76a4210b30bb4ca9e4875ac5a71d61b9bd84dfece","pkg-name":"th-lift","pkg-version":"0.8.4","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"1bb5bab13b61be2bdecf977d5cf274e8ba2ed76b5058a15a021687ebc159b36f","pkg-src-sha256":"f9c577238d4ba65fe3e78bc77f0cca54f17d02c0f6075b2487da5c63bdb4a61b","depends":["base-4.18.2.0","ghc-prim-0.10.0","template-haskell-2.20.0.0","th-abstraction-0.6.0.0-b49a83d27ea2604c7977c309bd302e93941309c5040c248dbdb6b55147976b2b"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"th-orphans-0.13.14-16db0f9bff8b7cf7d9193a41514705710e6bf8cf8d36317661b9cbe3736fdc28","pkg-name":"th-orphans","pkg-version":"0.13.14","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"dcdcebb070b68681de623c74e80450b1aace3a52568bb19abecb6849663c4bce","pkg-src-sha256":"9ddb2a1a0f6afeb8b6697256bfa5930f1f75e99624e370931c4b48bd16c3077c","depends":["base-4.18.2.0","mtl-2.3.1","template-haskell-2.20.0.0","th-compat-0.1.4-102530325c2b6ccd251d9c304ca6729eb04836a98ab4cdda25fa565147ccb66e","th-lift-0.8.4-b78b8ae6ed3a29479941c4c76a4210b30bb4ca9e4875ac5a71d61b9bd84dfece","th-reify-many-0.1.10-05fb0efe7385d7f849bd174d4d29a2933ccfd13505ca108b3b9058761bdaa899"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"th-reify-many-0.1.10-05fb0efe7385d7f849bd174d4d29a2933ccfd13505ca108b3b9058761bdaa899","pkg-name":"th-reify-many","pkg-version":"0.1.10","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"1827dcffb0c9f214e9739053fc808683336ea65c3749ff2d6148db189cbbd2a4","pkg-src-sha256":"9d250e61242f2fb887dedc9d28c0141832ff256e63bebc2bf5abff81037be4a5","depends":["base-4.18.2.0","containers-0.6.7","mtl-2.3.1","safe-0.3.21-31bf385773e1c6ef212139e0505190c20d1e3d1af99bcbfc189c01c3a1e0e739","template-haskell-2.20.0.0","th-expand-syns-0.4.11.0-3f181234350a5a4d61570069da1a928aba2739a9b90cb8092c414ac27d235846"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"these-1.2-a7d4e934136841dac2b8ed0dc77fee3f581d8c4e25fe99bdad5b76406c57bf16","pkg-name":"these","pkg-version":"1.2","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"011e22f6891ca028f87c04ea48796696c92d593313a9c699f7ff4f9ffd7aec6e","pkg-src-sha256":"a8ed7174b7f790764360f48aab72fea382a6093ed369c7bc6881fae1abacd4b8","depends":["assoc-1.1-44564689989a4d2721c54fe7433f3b2450e556c3fe6c52752ad54623647f561c","base-4.18.2.0","binary-0.8.9.1","deepseq-1.4.8.1","hashable-1.4.3.0-17b447e0ce504d4e093d6bf5a9838da3805c7caa5d16355da40827d004febbc8"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"time-1.12.2","pkg-name":"time","pkg-version":"1.12.2","depends":["base-4.18.2.0","deepseq-1.4.8.1"]},{"type":"configured","id":"time-compat-1.9.6.1-2b2aa066adc7c0d5baad9d0716626a41574966c2265b4ff355b83a2bfd5ca61a","pkg-name":"time-compat","pkg-version":"1.9.6.1","flags":{"old-locale":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"17631ef01a03a6f55fbe131690f87f6dee9a1572acc99b6c06f04882470ffb52","pkg-src-sha256":"ad07bb00eb9678c2136d3680752b00acc4cbc522654bb3199bf31c61ef1e6b80","depends":["base-4.18.2.0","base-orphans-0.9.1-61d128d6a3318593c785a97751f2418cc86b42b03e2b46ed92e9b27fc5da689c","deepseq-1.4.8.1","hashable-1.4.3.0-17b447e0ce504d4e093d6bf5a9838da3805c7caa5d16355da40827d004febbc8","time-1.12.2"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"time-manager-0.0.1-bda26b5ab69166d31b9d00a6f11da4ed98f23c5730095e52dea9d4e88200bb30","pkg-name":"time-manager","pkg-version":"0.0.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"4445d343847df0d140972f3d45ca1429d71d186690c2f5fd67a049b4cf66f281","pkg-src-sha256":"07492523fabc69b8ec308f6276cc93df3dd060c91f23df2ac8a1f56d331ea05b","depends":["auto-update-0.1.6-3f7af882e90ee16fd9e6ebf1ca739ba4ad18afcdae045a3375fe3adefea17239","base-4.18.2.0","unliftio-0.2.25.0-494677154ed69a76841d775b50166f52e9d0797a41ece2fd3d94e08aebf372f3"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"timing-convenience-0.1-532d7dc3aaa5fc1300afadca7cc392ec1bf3c6b6c0600c8609536b7b4d87e195","pkg-name":"timing-convenience","pkg-version":"0.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"7ff807a9a9e5596f2b18d45c5a01aefb91d4a98f6a1008d183b5c550f68f7cb7","pkg-src-sha256":"72200ea2c942bfb4ac4c5ae53222353ac3af0c40058f4a9179c99df5ff33171d","components":{"lib":{"depends":["base-4.18.2.0","time-1.12.2"],"exe-depends":[]}}},{"type":"configured","id":"tls-2.0.1-b47e0fd7dac1558b195f1752f4ccbcc31081e04ec060bb63474359a715d7657d","pkg-name":"tls","pkg-version":"2.0.1","flags":{"devel":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"6f93816f1b67efafe63a91296e047d6218ccdfd355cd17cd47c798871c871444","pkg-src-sha256":"98658cb0394a9cd08c56c5fe11a6c96f16c892a2a594db421cd72e0e7f7be684","depends":["asn1-encoding-0.9.6-9bf64732d7af18045ee22a12f781934262d76015cf823acd133e41c1341a5fb9","asn1-types-0.3.4-09d5674972306ee58c9f15c425744939cc04dad257e3b9dd8f0168fbdc38ab70","async-2.2.4-2107e60f1bee7c70ffed77e551ffc7db01e350edd8784cc9493cc782305122d0","base-4.18.2.0","base16-bytestring-1.0.2.0-b470eb3428775005093b18dbb34dd687b575cadcc3d709cf63c09611d917e654","bytestring-0.11.5.3","cereal-0.5.8.3-930e90604013ce2a32c6d28d3567d1d966e50eb1bf0c18108838f2b4ff0d64ca","crypton-0.34-c8d7db2766b56c26f144f8f589058be74cfcc7e68ff2d08f8f41d2ef1a1fa0e8","crypton-x509-1.7.6-ace8f9d140333c88f85ccfc3589bf27f34ff44a133899eca8703ad0a2550cbd2","crypton-x509-store-1.6.9-a22fb54b4d19ed5d96223b9252ac458efdc316468954bf7427b768e536d62b27","crypton-x509-validation-1.6.12-7d625ee1af564079d6fbb1cad937bb153313fe0a40e0d69ba93055d71efd6686","data-default-class-0.1.2.0-4350681fcf6087f7ee4836ea8af486e6eeb8f64bb56f88dbd081081499b0bef6","memory-0.18.0-273ad672f1703dee0dfe07994633c93d17f815a149738659ef6afa30cbe4f6a8","mtl-2.3.1","network-3.1.4.0-9d41c9df77e8d21da5aaf51c19540d3c0fc11e5e2c2940bea5411915b8a462ff","serialise-0.2.6.1-9a84217bb1945b5559a174f6d6db34ff78ae2ce9f9cba7b4a3abdeedb09747ca","transformers-0.6.1.0","unix-time-0.4.12-45eb997f2b10c03cbe95532ca065341d046b4309aac2f8aad0358668133acf67"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"torsor-0.1.0.1-264ad98156300f7b86fb968625df8515c2fbbce5479b450f036ac11b2f5c7444","pkg-name":"torsor","pkg-version":"0.1.0.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"a16c1308705d4cab73dc55b21893e725a4749530bb991ada8a2ffe1eea962346","pkg-src-sha256":"a901845703fe42d0d852ccefb1b7b9210623289203dccd875e0ea70036ed4c52","depends":["base-4.18.2.0"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"transformers-0.6.1.0","pkg-name":"transformers","pkg-version":"0.6.1.0","depends":["base-4.18.2.0"]},{"type":"configured","id":"transformers-base-0.4.6-91c64a4b19c3f5f9f196345e9032803d52322bd0857ba94ea6c4260a27a2ff07","pkg-name":"transformers-base","pkg-version":"0.4.6","flags":{"orphaninstances":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"6f18f320e371c8954c4b6b211e2fdd5d15a6d6310bd605b9d640f47ede408961","pkg-src-sha256":"323bf8689eb691b122661cffa41a25e00fea7a768433fe2dde35d3da7d32cf90","depends":["base-4.18.2.0","base-orphans-0.9.1-61d128d6a3318593c785a97751f2418cc86b42b03e2b46ed92e9b27fc5da689c","stm-2.5.1.0","transformers-0.6.1.0","transformers-compat-0.7.2-15ca92c51f3c4b3e5a349c3cc2a7f406ca01ba50aecd92a631a1c4d508b1230f"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"transformers-compat-0.7.2-15ca92c51f3c4b3e5a349c3cc2a7f406ca01ba50aecd92a631a1c4d508b1230f","pkg-name":"transformers-compat","pkg-version":"0.7.2","flags":{"five":false,"five-three":true,"four":false,"generic-deriving":true,"mtl":true,"three":false,"two":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"044fb9955f63ee138fcebedfdcbe54afe741f2d5892a2d0bdf3a8052bd342643","pkg-src-sha256":"b62c7304c9f3cbc9463d0739aa85cb9489f217ea092b9d625d417514fbcc9d6a","depends":["base-4.18.2.0","ghc-prim-0.10.0","transformers-0.6.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"tuples-0.1.0.0-c9da1e31c493a9db3a026d6ed37a9f2e238abe29b118611180b8b3b5a28d1337","pkg-name":"tuples","pkg-version":"0.1.0.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"0b3f3fe4f65b976e6e449eea77686e9407033f69bba1418a09c6babe3571a821","pkg-src-sha256":"2590bb956598066fb5182d820827de0040f7e43d558bcbea6c35b5830115014f","depends":["base-4.18.2.0","primitive-0.9.0.0-a6aa61bd9fff8d6cfd4880894dd85d8e644fbcf178b2bff38f87569871ea4a0d"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"type-equality-1-0b6d3f1475843f8a2ec92f8308f7e4e437169ac42b8e9e6533f304adcd6f533e","pkg-name":"type-equality","pkg-version":"1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"ebf53eaf3881b946d4ab56112a19f8b635c0f19cb5252c08fbf2588bc1ea22a5","pkg-src-sha256":"4728b502a211454ef682a10d7a3e817c22d06ba509df114bb267ef9d43a08ce8","depends":["base-4.18.2.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"typed-process-0.2.11.1-4907353577cf7b0488b9e45d5074486e7c2bbc62c713aeaa26212d7c9d609d10","pkg-name":"typed-process","pkg-version":"0.2.11.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"79e8555666f27a3e4e67fedf430000631d95c937147190b3f10817daca1874b0","pkg-src-sha256":"d5c5dda091d61bac35de4ed6d9ddb530e4eb2564ca3c0b93e577762b63d94148","depends":["async-2.2.4-2107e60f1bee7c70ffed77e551ffc7db01e350edd8784cc9493cc782305122d0","base-4.18.2.0","bytestring-0.11.5.3","process-1.6.17.0","stm-2.5.1.0","transformers-0.6.1.0","unliftio-core-0.2.1.0-1e6dce1dfe73ef335e0615b0af7f06b171c3572cf7a04fe671b6cec407b73dee"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"unicode-data-0.4.0.1-2cec5f4ee6f7dac835f9656497f58d5132b6da46ac07f33c15ef93dbfe67a942","pkg-name":"unicode-data","pkg-version":"0.4.0.1","flags":{"ucd2haskell":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"5edc785e09ba1c8ded8262f35187e8d7bfa5fa8bf9f8e3911cd3003314d7f3ec","pkg-src-sha256":"37a5dea6801940beb65c4ac4b9d0f7e653a686cf773507f0ca61c210e0b06080","depends":["base-4.18.2.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"unicode-transforms-0.4.0.1-8c67b0eaf2d5104e81ffbe7caf4900a211ea1e275b21ae6aca8253bd0b8d074b","pkg-name":"unicode-transforms","pkg-version":"0.4.0.1","flags":{"bench-show":false,"dev":false,"has-icu":false,"has-llvm":false,"use-gauge":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"49bc0f4a277e7a83de66d6584dddd6c3cdf96f11daf5e15ae78d0bbd7ca2a699","pkg-src-sha256":"3278e1e1d648da4bcd7368658ae091a89080e88a2f44db9df5136711e99649fc","depends":["base-4.18.2.0","bytestring-0.11.5.3","ghc-prim-0.10.0","text-2.0.2","unicode-data-0.4.0.1-2cec5f4ee6f7dac835f9656497f58d5132b6da46ac07f33c15ef93dbfe67a942"],"exe-depends":[],"component-name":"lib"},{"type":"pre-existing","id":"unix-2.8.4.0","pkg-name":"unix","pkg-version":"2.8.4.0","depends":["base-4.18.2.0","bytestring-0.11.5.3","filepath-1.4.200.1","time-1.12.2"]},{"type":"configured","id":"unix-compat-0.7.1-d99eb5acf38b31b458b2a5f48db2ff44a4954123ddfa4c9c3d585ea4ef03206d","pkg-name":"unix-compat","pkg-version":"0.7.1","flags":{"old-time":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"bd5bb4e04b2ed707f3e3466470a452354310389506cf0a7a73bf10e4d533f6d1","pkg-src-sha256":"c04806e8835ac261de6c9b1bbf886dfc1ea3ab38e0b12581f9d2bff18803e33f","depends":["base-4.18.2.0","unix-2.8.4.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"unix-time-0.4.12-45eb997f2b10c03cbe95532ca065341d046b4309aac2f8aad0358668133acf67","pkg-name":"unix-time","pkg-version":"0.4.12","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"97abf524e631f9a6fba975c67b4f34f6ba678986c620e1efcef41ded4af58916","pkg-src-sha256":"50a57298e5cba81e9db2be9f4c24c7e514af96e541a97df05a5ecd411aaf97e2","components":{"lib":{"depends":["base-4.18.2.0","binary-0.8.9.1","bytestring-0.11.5.3","old-time-1.1.0.4-41f5636c376ef03b6ed0709860b733d4263cbb5dd153bb15926d2e3fb2df8cee"],"exe-depends":["hsc2hs-0.68.10-e-hsc2hs-3b4e464e6a657183d9f83bd37c6d876421d9f6d00ca34e12b12ca3365e55159d"]}}},{"type":"configured","id":"unlifted-0.2.2.0-331af0eb9d6315f1de30144f92ea1bd99f7de6c15dd09cf6c2850c461258375e","pkg-name":"unlifted","pkg-version":"0.2.2.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"9c7711677e2acb7d27b688a6c5d9d72aab8839d30bad2ecd822a900f10be9e3b","pkg-src-sha256":"7d92ea399142e4c19c05614c1839c780fe99cd8c1a9d7680eda01f25a7a7f01a","depends":["base-4.18.2.0","bytestring-0.11.5.3","text-short-0.1.5-e014e79f76c5438274db6ad0455e870f44faf95f73a43bdf4e1c22851755dbaa"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"unliftio-0.2.25.0-494677154ed69a76841d775b50166f52e9d0797a41ece2fd3d94e08aebf372f3","pkg-name":"unliftio","pkg-version":"0.2.25.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"d015242554890370bcbc3a575019be691d0edc279736ef97d29412fb9d0c4349","pkg-src-sha256":"fb85a22291e78f9e58cd7f5e563a726500ad1a004b3b335b93c0975b828a112b","depends":["async-2.2.4-2107e60f1bee7c70ffed77e551ffc7db01e350edd8784cc9493cc782305122d0","base-4.18.2.0","bytestring-0.11.5.3","deepseq-1.4.8.1","directory-1.3.8.1","filepath-1.4.200.1","process-1.6.17.0","safe-exceptions-0.1.7.4-51b8325bd2c9c2c32246cef5b80f09fba6aa9b6005978a7b87ef943c7ddd1182","stm-2.5.1.0","time-1.12.2","transformers-0.6.1.0","unix-2.8.4.0","unliftio-core-0.2.1.0-1e6dce1dfe73ef335e0615b0af7f06b171c3572cf7a04fe671b6cec407b73dee"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"unliftio-core-0.2.1.0-1e6dce1dfe73ef335e0615b0af7f06b171c3572cf7a04fe671b6cec407b73dee","pkg-name":"unliftio-core","pkg-version":"0.2.1.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"28800633b20e0f7bfbdda1248c28022749aa0935aea10b1e3fc9c88cbebb06de","pkg-src-sha256":"99384cba8d56d9d61b85e38a313a93ebcdb78be6566367f0930ef580597fe3e3","depends":["base-4.18.2.0","transformers-0.6.1.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"unordered-containers-0.2.20-013ecc3e94c07bd5bdb23da8c9cf4d68ac66e04c4144b4096b291104672db345","pkg-name":"unordered-containers","pkg-version":"0.2.20","flags":{"debug":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"746c32b23f93cb13e52309e54e82d69e4315105f9815b1fcac25a57071505cff","pkg-src-sha256":"d9cfb287cf00592d39dc9c3cac8b99627ea08f2c01798e70130fc39f7c90f11d","depends":["base-4.18.2.0","deepseq-1.4.8.1","hashable-1.4.3.0-17b447e0ce504d4e093d6bf5a9838da3805c7caa5d16355da40827d004febbc8","template-haskell-2.20.0.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"utf8-string-1.0.2-5e8d116496349c38d20293f85d47a22c703548b74e7d267d8d6d20ff907c03cd","pkg-name":"utf8-string","pkg-version":"1.0.2","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"79416292186feeaf1f60e49ac5a1ffae9bf1b120e040a74bf0e81ca7f1d31d3f","pkg-src-sha256":"ee48deada7600370728c4156cb002441de770d0121ae33a68139a9ed9c19b09a","depends":["base-4.18.2.0","bytestring-0.11.5.3"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"uuid-1.3.15-413cef239f477249b51ed712d27bea33e15b08237221be1f41f0bc89ce5e1463","pkg-name":"uuid","pkg-version":"1.3.15","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"7d553f95a750502228fc8411a5ad7e672d9b95272e3a61e5c711f19a49143821","pkg-src-sha256":"f885958d8934930b7c0f9b91f980722f7f992c9383fc98f075cf9df64c800564","depends":["base-4.18.2.0","binary-0.8.9.1","bytestring-0.11.5.3","cryptohash-md5-0.11.101.0-3dd4c39d92ff47630ac61716ac3e4f1bd76b570bf3eb70cf3c6a25610e31a06c","cryptohash-sha1-0.11.101.0-a3ef13c78463fdd04d9d6245ad7391e038dbf79d9c19ec5ab64f9b19a6fb91a8","entropy-0.4.1.10-8c6fb48b38b19d07f9b370b6707c9d29f3ebf9f4746fb1c84bdfc52bb55247e8","network-info-0.2.1-cbd12ac17ed981e872c92e3a8fd70b4ca80c64afdcc8cd7ebfd75eaa846f81c9","random-1.2.1.2-cc746490e13a1f967de173a54c09753b2ccdb5d95056b0f1206a29c62c83de45","text-2.0.2","time-1.12.2","uuid-types-1.0.5.1-c19e00cab51fb72d8874dd99ac787f44fda9996af8117c2d227cfb3294e06a9c"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"uuid-types-1.0.5.1-c19e00cab51fb72d8874dd99ac787f44fda9996af8117c2d227cfb3294e06a9c","pkg-name":"uuid-types","pkg-version":"1.0.5.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"918c8a115a0bc427cdaa4d1f51c1634bf3ac53679d0bbe039b77b9c1b62cfcbd","pkg-src-sha256":"0bec6d6982b3c92bfa5eab1d213be2d4b6696b9a2c3a1f1f05812dc3762dca2c","depends":["base-4.18.2.0","binary-0.8.9.1","bytestring-0.11.5.3","deepseq-1.4.8.1","hashable-1.4.3.0-17b447e0ce504d4e093d6bf5a9838da3805c7caa5d16355da40827d004febbc8","random-1.2.1.2-cc746490e13a1f967de173a54c09753b2ccdb5d95056b0f1206a29c62c83de45","template-haskell-2.20.0.0","text-2.0.2"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"vault-0.3.1.5-20d43e8d257de908486713884f035343ca6659f91d72e14d1c91b355c58e3031","pkg-name":"vault","pkg-version":"0.3.1.5","flags":{"useghc":true},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"a3096e7709951eed5e3891ad92f6c3f960438a0f80028cbf755d65d720928682","pkg-src-sha256":"ac2a6b6adf58598c5c8faa931ae961a8a2aa50ddb2f0f7a2044ff6e8c3d433a0","depends":["base-4.18.2.0","containers-0.6.7","hashable-1.4.3.0-17b447e0ce504d4e093d6bf5a9838da3805c7caa5d16355da40827d004febbc8","unordered-containers-0.2.20-013ecc3e94c07bd5bdb23da8c9cf4d68ac66e04c4144b4096b291104672db345"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"vector-0.13.1.0-eb53bdac16f057ad838f4e8cb865b51b400abac71a36dc5bfde93ea1d0859eae","pkg-name":"vector","pkg-version":"0.13.1.0","flags":{"boundschecks":true,"internalchecks":false,"unsafechecks":false,"wall":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"4650d28eb918812a3158130f833b5ff5020259b28a8f9ee5d28701ce60cf8a16","pkg-src-sha256":"63f272279eab8ab9411a0fffb1252ac309b297313f8e33be9ebbc2f981edecee","depends":["base-4.18.2.0","deepseq-1.4.8.1","primitive-0.9.0.0-a6aa61bd9fff8d6cfd4880894dd85d8e644fbcf178b2bff38f87569871ea4a0d","vector-stream-0.1.0.1-3c90690d1f553232c8d2479a7997ff1cd5a15df3f660a90ce0ab774b7b6aee75"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"vector-algorithms-0.9.0.1-0d5de6c527fb6ba0e7be854c1685b82a6a99d5798a407e65dc55cac4091e272a","pkg-name":"vector-algorithms","pkg-version":"0.9.0.1","flags":{"bench":true,"boundschecks":true,"internalchecks":false,"llvm":false,"properties":true,"unsafechecks":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"222b01a4c0b9e13d73d04fba7c65930df16d1647acc07d84c47ef0356fa33dba","pkg-src-sha256":"2ba7c0d3a8f26ef3ada24ff4abe81609225ecbab3b5754f048f8a0a3ecc33841","depends":["base-4.18.2.0","bitvec-1.1.5.0-134351d7461857a38c09b3cd302761a8b59d5482f7705b4680a47926f8628740","bytestring-0.11.5.3","primitive-0.9.0.0-a6aa61bd9fff8d6cfd4880894dd85d8e644fbcf178b2bff38f87569871ea4a0d","vector-0.13.1.0-eb53bdac16f057ad838f4e8cb865b51b400abac71a36dc5bfde93ea1d0859eae"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"vector-stream-0.1.0.1-3c90690d1f553232c8d2479a7997ff1cd5a15df3f660a90ce0ab774b7b6aee75","pkg-name":"vector-stream","pkg-version":"0.1.0.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"be36ab2bee3ec5b7bccc92af5ce27ddd07b7e630cd6bd912344413329ea1652c","pkg-src-sha256":"d0f507334bdea5431a2f07f525a97f29e76522c32210f5de6d5a2b4f1d42bf7c","depends":["base-4.18.2.0","ghc-prim-0.10.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"void-0.7.3-0dce7608060d286489a924498d4580dafe61112f075ee061dc6545c66ff6e691","pkg-name":"void","pkg-version":"0.7.3","flags":{"safe":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"13d30f62fcdf065e595d679d4ac8b4b0c1bb1a1b73db7b5b5a8f857cb5c8a546","pkg-src-sha256":"53af758ddc37dc63981671e503438d02c6f64a2d8744e9bec557a894431f7317","depends":["base-4.18.2.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"wai-3.2.4-acf062ae483a435740bc88b21ee81f62d3f94a62faea15a5bf17463ace439645","pkg-name":"wai","pkg-version":"3.2.4","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"e14fde953183f9db8c10da79b44a2b24d241c1203426c5636995069e2dacb1fe","pkg-src-sha256":"a6088f847d886d7c767092d170c03c7690d197eb3189d7cc67dbaaab33bf6d94","depends":["base-4.18.2.0","bytestring-0.11.5.3","http-types-0.12.4-0f52a9ec33f3c65ef0b77ad8ce14b65f9164f8a761e42800dc9c80ee1768aacc","network-3.1.4.0-9d41c9df77e8d21da5aaf51c19540d3c0fc11e5e2c2940bea5411915b8a462ff","text-2.0.2","vault-0.3.1.5-20d43e8d257de908486713884f035343ca6659f91d72e14d1c91b355c58e3031"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"wai-app-static-3.1.8-d2d0c9be3a5bd2980a68b3225b620c023885a62d44f09cee23e1325fcbe6c50c","pkg-name":"wai-app-static","pkg-version":"3.1.8","flags":{"crypton":true,"print":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"22c5b1e83e8f14c6639bf1d0ddca02a6710b74492f7c70f16e058ca7db0a5bc9","pkg-src-sha256":"1a7081096bd425533d87fc40eca7a0f3ed3e3eb08c3a7ef93eecc6f1cf012f02","depends":["base-4.18.2.0","blaze-html-0.9.1.2-3a4f994094b15669094f06ad98d568adb79b03a7829eff4349476c2fafb25845","blaze-markup-0.8.3.0-2e784e1507a2d7d5a307522e712dffb50117e7a08a6219ee2f5a0daa30ff9ab0","bytestring-0.11.5.3","containers-0.6.7","crypton-0.34-c8d7db2766b56c26f144f8f589058be74cfcc7e68ff2d08f8f41d2ef1a1fa0e8","directory-1.3.8.1","file-embed-0.0.16.0-d63ac8c371cd44fa36b87af3f4672e6a9da8a4dd85e53dc2781049b6fa1aeeda","filepath-1.4.200.1","http-date-0.0.11-4d5bd8aa95bbcd52e33572812314a340168d474209374f7c85b86a113b02b6f3","http-types-0.12.4-0f52a9ec33f3c65ef0b77ad8ce14b65f9164f8a761e42800dc9c80ee1768aacc","memory-0.18.0-273ad672f1703dee0dfe07994633c93d17f815a149738659ef6afa30cbe4f6a8","mime-types-0.1.2.0-3d20aa710271c28a90c1e88feb88ab239804502c494312d5102d19e4b368709f","old-locale-1.0.0.7-682418540979bf75be932863a87a0db4ab12d3f7ec5faaeba30e4175347cd126","optparse-applicative-0.18.1.0-1de8f12cfc2915bc6d323ba97415a7e0795036a6b613e7301735aedf9d0425be","template-haskell-2.20.0.0","text-2.0.2","time-1.12.2","transformers-0.6.1.0","unix-compat-0.7.1-d99eb5acf38b31b458b2a5f48db2ff44a4954123ddfa4c9c3d585ea4ef03206d","unordered-containers-0.2.20-013ecc3e94c07bd5bdb23da8c9cf4d68ac66e04c4144b4096b291104672db345","wai-3.2.4-acf062ae483a435740bc88b21ee81f62d3f94a62faea15a5bf17463ace439645","wai-extra-3.1.14-cd0dcb1edc3ae39df542a453943fecc32333d2e7ec94bbfbe140ffe95cb27e37","warp-3.3.31-3a081a14799ab48e5efe3a315077d1e89ea4da61799497b4990d5fc7e0dcb380","zlib-0.6.3.0-61cb40f46d103a622525dc3a70a9004984ec56d61deea65d2dc01c964606b7e9"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"wai-app-static-3.1.8-e-warp-0ca15beb0733735df77c986700e682b297230e1049c5c4c674df8d2591f7ad52","pkg-name":"wai-app-static","pkg-version":"3.1.8","flags":{"crypton":true,"print":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"22c5b1e83e8f14c6639bf1d0ddca02a6710b74492f7c70f16e058ca7db0a5bc9","pkg-src-sha256":"1a7081096bd425533d87fc40eca7a0f3ed3e3eb08c3a7ef93eecc6f1cf012f02","depends":["base-4.18.2.0","wai-app-static-3.1.8-d2d0c9be3a5bd2980a68b3225b620c023885a62d44f09cee23e1325fcbe6c50c"],"exe-depends":[],"component-name":"exe:warp","bin-file":"/home/hecate/Projects/Flora/1-flora-server/_build/cabal-store/ghc-9.6.4/wai-app-static-3.1.8-e-warp-0ca15beb0733735df77c986700e682b297230e1049c5c4c674df8d2591f7ad52/bin/warp"},{"type":"configured","id":"wai-extra-3.1.14-cd0dcb1edc3ae39df542a453943fecc32333d2e7ec94bbfbe140ffe95cb27e37","pkg-name":"wai-extra","pkg-version":"3.1.14","flags":{"build-example":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"1b093366842dc0057cebb4a23dbf9a29269321d70fd242c7695ce0bbd80d32fb","pkg-src-sha256":"5704f51b09ce16417f174885b99fd2c24d70e31b653187801716254dcd8f64b5","depends":["HUnit-1.6.2.0-d1570da0a2808fb4ce9b1c3f1e99a0cf4a27d7c4071d9714ae835af7748ace92","aeson-2.2.1.0-2595d249b227784b9febcd5a91568775f66fd262ac45c82c44f7b4a55e9d4c27","ansi-terminal-1.0.2-f2271bf25e5299c165409ab78d5917aeba79c479959932bb5fb284c513226fc0","base-4.18.2.0","base64-bytestring-1.2.1.0-ecb3bf792eac6ec696f20e02e528e8a7b2a76a5b32c46409c4645e1bfbd71cf4","bytestring-0.11.5.3","call-stack-0.4.0-a0fd887e5d06d11a75269d5dfed7da6fe2656edbbd7cc1697fb2a2b8ad4fe392","case-insensitive-1.2.1.0-5255eaf892b10e8489fdad145ca833a10864bd951f3e69d04088fbcadf28ec6d","containers-0.6.7","cookie-0.4.6-0f17f671a430f9d3670a38aa989d096c8a941ff590a1a1a5bc4f595def792f73","data-default-class-0.1.2.0-4350681fcf6087f7ee4836ea8af486e6eeb8f64bb56f88dbd081081499b0bef6","directory-1.3.8.1","fast-logger-3.2.2-f2b66566923a1fa76e5c48eecb73e2ef0a379b38ce325b13b8e81e8022003d26","http-types-0.12.4-0f52a9ec33f3c65ef0b77ad8ce14b65f9164f8a761e42800dc9c80ee1768aacc","iproute-1.7.12-1154efefaf645ab127d46e471b4ebe1968e3b3f8497cc0b74c21385bb289cbb0","network-3.1.4.0-9d41c9df77e8d21da5aaf51c19540d3c0fc11e5e2c2940bea5411915b8a462ff","resourcet-1.3.0-0f210c6e8ffe9f595ad8fd1a6cf6726e42a6695abb7febee22452f40436a2bc5","streaming-commons-0.2.2.6-9fa4239301ef39252b6218423c0a2438611fe43c2ddbebd4f8953d4455c07935","text-2.0.2","time-1.12.2","transformers-0.6.1.0","unix-2.8.4.0","vault-0.3.1.5-20d43e8d257de908486713884f035343ca6659f91d72e14d1c91b355c58e3031","wai-3.2.4-acf062ae483a435740bc88b21ee81f62d3f94a62faea15a5bf17463ace439645","wai-logger-2.4.0-0b88ea4c877c6b91e325a6e5662dda948a3ac06bb58a6408dd648183671b5845","warp-3.3.31-3a081a14799ab48e5efe3a315077d1e89ea4da61799497b4990d5fc7e0dcb380","word8-0.1.3-f7afede617c5019b5fe8b27341f573a6ee2d2232a9ed28ec7e4caca5e3512696"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"wai-log-0.4.0.1-479434afc1461896e7a927d8fb2df0160b14dae19bb9a79688f196ec7d42177b","pkg-name":"wai-log","pkg-version":"0.4.0.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"0b4b57ae218cf5ec59523c8cf405802a588d4e299436b5a663a6001ea34bb7e6","pkg-src-sha256":"19d21d688e3093289afd7632d33bfaf27c0ab49e5956f153ad72c81ce85e990a","depends":["aeson-2.2.1.0-2595d249b227784b9febcd5a91568775f66fd262ac45c82c44f7b4a55e9d4c27","base-4.18.2.0","bytestring-0.11.5.3","http-types-0.12.4-0f52a9ec33f3c65ef0b77ad8ce14b65f9164f8a761e42800dc9c80ee1768aacc","log-base-0.12.0.1-f6c93830f52a9d5925fa4be3f430d1262c4e2bbf3222e6a925872b2eec0a9d75","string-conversions-0.4.0.1-84561bf691f05f917e60aa94bd28d55750bb3e08ac9a7bd02c365e1ff133b25f","text-2.0.2","time-1.12.2","uuid-1.3.15-413cef239f477249b51ed712d27bea33e15b08237221be1f41f0bc89ce5e1463","wai-3.2.4-acf062ae483a435740bc88b21ee81f62d3f94a62faea15a5bf17463ace439645"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"wai-logger-2.4.0-0b88ea4c877c6b91e325a6e5662dda948a3ac06bb58a6408dd648183671b5845","pkg-name":"wai-logger","pkg-version":"2.4.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"630b3d573dce5c6a84dfb372d69f8d15f9dbb52d6a04df43e57a44f0ca0eab0a","pkg-src-sha256":"057e635acd35a39d6ddae4ba4c5dfa1425e251579bbd3239c7f4b557bc96290a","components":{"lib":{"depends":["base-4.18.2.0","byteorder-1.0.4-fa2515b96f172f97bd2e2638b538e2286cb035eb8b87892a4857a50c6e738631","bytestring-0.11.5.3","fast-logger-3.2.2-f2b66566923a1fa76e5c48eecb73e2ef0a379b38ce325b13b8e81e8022003d26","http-types-0.12.4-0f52a9ec33f3c65ef0b77ad8ce14b65f9164f8a761e42800dc9c80ee1768aacc","network-3.1.4.0-9d41c9df77e8d21da5aaf51c19540d3c0fc11e5e2c2940bea5411915b8a462ff","wai-3.2.4-acf062ae483a435740bc88b21ee81f62d3f94a62faea15a5bf17463ace439645"],"exe-depends":[]},"setup":{"depends":["Cabal-3.10.1.0","base-4.18.2.0","cabal-doctest-1.0.9-4a685fb2745cdab49526ff8fe3801bf6bd4ab5085239033fcfd51613f7e3fd76"],"exe-depends":[]}}},{"type":"configured","id":"wai-middleware-heartbeat-0.0.1.0-de5d48bf3f801ad6a7c2e1238d0d30545239fd081520428e7cfa1d9f6b41c104","pkg-name":"wai-middleware-heartbeat","pkg-version":"0.0.1.0","flags":{},"style":"global","pkg-src":{"type":"source-repo","source-repo":{"type":"git","location":"https://github.com/flora-pm/wai-middleware-heartbeat","tag":"5b56e1d"}},"pkg-src-sha256":"14dc4f4c511394b4ebe8f0d5ceaf3e942998e5606a6e41c8a24f5254c398c723","depends":["base-4.18.2.0","http-types-0.12.4-0f52a9ec33f3c65ef0b77ad8ce14b65f9164f8a761e42800dc9c80ee1768aacc","wai-3.2.4-acf062ae483a435740bc88b21ee81f62d3f94a62faea15a5bf17463ace439645"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"warp-3.3.31-3a081a14799ab48e5efe3a315077d1e89ea4da61799497b4990d5fc7e0dcb380","pkg-name":"warp","pkg-version":"3.3.31","flags":{"allow-sendfilefd":true,"network-bytestring":false,"warp-debug":false,"x509":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"b855196d0e6f65c648662647f9c749fbbf193e97d9b0c034429731f9e34c5ddc","pkg-src-sha256":"7ca9c7df2ba44ffe225df63866f32b14b70ea2c045ff9301bac982ce377ec38d","depends":["array-0.5.6.0","auto-update-0.1.6-3f7af882e90ee16fd9e6ebf1ca739ba4ad18afcdae045a3375fe3adefea17239","base-4.18.2.0","bsb-http-chunked-0.0.0.4-f0471e0efa2dd6ebef9e206b6727cf6fe5e8a009c301af9a3b7199515a1e2c08","bytestring-0.11.5.3","case-insensitive-1.2.1.0-5255eaf892b10e8489fdad145ca833a10864bd951f3e69d04088fbcadf28ec6d","containers-0.6.7","ghc-prim-0.10.0","hashable-1.4.3.0-17b447e0ce504d4e093d6bf5a9838da3805c7caa5d16355da40827d004febbc8","http-date-0.0.11-4d5bd8aa95bbcd52e33572812314a340168d474209374f7c85b86a113b02b6f3","http-types-0.12.4-0f52a9ec33f3c65ef0b77ad8ce14b65f9164f8a761e42800dc9c80ee1768aacc","http2-5.0.1-751b9c3f95a93da8cddfb732f2965a32e07b1353df03d60f755b561f5ddd83d2","iproute-1.7.12-1154efefaf645ab127d46e471b4ebe1968e3b3f8497cc0b74c21385bb289cbb0","network-3.1.4.0-9d41c9df77e8d21da5aaf51c19540d3c0fc11e5e2c2940bea5411915b8a462ff","recv-0.1.0-d170336de78e6c12b94f8cc756fe783212924d934de94f3714815c10ebbd9fad","simple-sendfile-0.2.32-40d1e9f7a944730d0ccd2218dd6dd93bb24e35bc984ac0852a20de36b49e40dc","stm-2.5.1.0","streaming-commons-0.2.2.6-9fa4239301ef39252b6218423c0a2438611fe43c2ddbebd4f8953d4455c07935","text-2.0.2","time-manager-0.0.1-bda26b5ab69166d31b9d00a6f11da4ed98f23c5730095e52dea9d4e88200bb30","unix-2.8.4.0","unliftio-0.2.25.0-494677154ed69a76841d775b50166f52e9d0797a41ece2fd3d94e08aebf372f3","vault-0.3.1.5-20d43e8d257de908486713884f035343ca6659f91d72e14d1c91b355c58e3031","wai-3.2.4-acf062ae483a435740bc88b21ee81f62d3f94a62faea15a5bf17463ace439645","word8-0.1.3-f7afede617c5019b5fe8b27341f573a6ee2d2232a9ed28ec7e4caca5e3512696"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"wide-word-0.1.6.0-701ecedac0a6c9b47e334c978d1acbc2be6ad5ec17436c6d5c3ac80532b45795","pkg-name":"wide-word","pkg-version":"0.1.6.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"3df0e04e5c18e9540daba074f2a670fa3ee9f145dfaa8df008d318767c6a40dc","pkg-src-sha256":"df6aa01a18d2b191f96793fab1cb4b43d465f8c9ad5239f9df4ca9255b059797","depends":["base-4.18.2.0","binary-0.8.9.1","deepseq-1.4.8.1","ghc-prim-0.10.0","hashable-1.4.3.0-17b447e0ce504d4e093d6bf5a9838da3805c7caa5d16355da40827d004febbc8","primitive-0.9.0.0-a6aa61bd9fff8d6cfd4880894dd85d8e644fbcf178b2bff38f87569871ea4a0d"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"witherable-0.4.2-1767ce3334bad414dff74c30d2272bb1f265e0098708c8aa764f138b1a282619","pkg-name":"witherable","pkg-version":"0.4.2","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"cec516b35df0ff53ab0068e70a912a0ba7b65c672fbc554727183faa195ad3b8","pkg-src-sha256":"790d2bb274283419173bd89104439860675a9410f70f21912973ecd9098b4104","depends":["base-4.18.2.0","base-orphans-0.9.1-61d128d6a3318593c785a97751f2418cc86b42b03e2b46ed92e9b27fc5da689c","containers-0.6.7","hashable-1.4.3.0-17b447e0ce504d4e093d6bf5a9838da3805c7caa5d16355da40827d004febbc8","indexed-traversable-0.1.3-8f7210e35c0cb4bf73ec163bed4014cbba70e17aa189447497a492e60990637b","indexed-traversable-instances-0.1.1.2-23d2e9c28613d77bfd5595533e39512e3e8b808382cee8d422cee021acbf7fc4","transformers-0.6.1.0","unordered-containers-0.2.20-013ecc3e94c07bd5bdb23da8c9cf4d68ac66e04c4144b4096b291104672db345","vector-0.13.1.0-eb53bdac16f057ad838f4e8cb865b51b400abac71a36dc5bfde93ea1d0859eae"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"wl-pprint-annotated-0.1.0.1-2ffc62f3d112419f639c5f9a11a9f5522560693bebb7563fb4d9e6fbf7d077e8","pkg-name":"wl-pprint-annotated","pkg-version":"0.1.0.1","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"79d12e6d7302c8bea0986cb713fcbfc33225cca3ee158ac741cf1a468f5ed8bc","pkg-src-sha256":"6b662b244b2e318a2923dc7057d707369a29ea4a0e721b4710eac7239cc727af","depends":["base-4.18.2.0","containers-0.6.7","deepseq-1.4.8.1","text-2.0.2"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"word8-0.1.3-f7afede617c5019b5fe8b27341f573a6ee2d2232a9ed28ec7e4caca5e3512696","pkg-name":"word8","pkg-version":"0.1.3","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"e5464d0600821a116467d4b12fef12b15ff040c3599500e5f0274225e78c6faf","pkg-src-sha256":"2630934c75728bfbf390c1f0206b225507b354f68d4047b06c018a36823b5d8a","depends":["base-4.18.2.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"xml-conduit-1.9.1.3-bf19b431d216b0a2413840aa01a4a651624a00a392ce27bb32e3cbe5522c5d28","pkg-name":"xml-conduit","pkg-version":"1.9.1.3","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"7cbc7829804ce4cd297f3df16bd15e7808c608ae4e0bcc4013e0e456dc4e1ab8","pkg-src-sha256":"d8e9169562c71c9e6bc616f15832f521a68c362aa4fc03682748a809755f1bf4","components":{"lib":{"depends":["attoparsec-0.14.4-5061b5f729de9f72f69961345d54e0249a28df7c232bb9cf2b0525b6f17a253a","base-4.18.2.0","blaze-html-0.9.1.2-3a4f994094b15669094f06ad98d568adb79b03a7829eff4349476c2fafb25845","blaze-markup-0.8.3.0-2e784e1507a2d7d5a307522e712dffb50117e7a08a6219ee2f5a0daa30ff9ab0","bytestring-0.11.5.3","conduit-1.3.5-96fa916ebd7a150aa66076e6ed1e4a9d7982e51658f9fd750ad31ce33c46afd7","conduit-extra-1.3.6-a9b74b7c97cb9e39e8f4262bfd1952b446fe950cb07e127ba073c16301e30755","containers-0.6.7","data-default-class-0.1.2.0-4350681fcf6087f7ee4836ea8af486e6eeb8f64bb56f88dbd081081499b0bef6","deepseq-1.4.8.1","resourcet-1.3.0-0f210c6e8ffe9f595ad8fd1a6cf6726e42a6695abb7febee22452f40436a2bc5","text-2.0.2","transformers-0.6.1.0","xml-types-0.3.8-d2a265fd20021a57d6f815997b9b3d3ac55b25363a4801f11d0a9db2d0cc2488"],"exe-depends":[]},"setup":{"depends":["Cabal-3.10.1.0","base-4.18.2.0","cabal-doctest-1.0.9-4a685fb2745cdab49526ff8fe3801bf6bd4ab5085239033fcfd51613f7e3fd76"],"exe-depends":[]}}},{"type":"configured","id":"xml-conduit-writer-0.1.1.5-af45083ef430fdd7f499ccdbcbffc63138c7fd12623f1529c3a0777b83867c2e","pkg-name":"xml-conduit-writer","pkg-version":"0.1.1.5","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"7b62f92e91d5f7c2c4440b2021d6b9309f9966598b110017b2cbcf3fcd1107df","pkg-src-sha256":"c10527f535e5d3e1fe89bb42a8ad28afb601045e45363a2caa30db398d2a42d5","depends":["base-4.18.2.0","containers-0.6.7","data-default-0.7.1.1-fb1a461d5390de89b4af18b225f51df41ca3a345d820ee4756653e4cd2f3cd8e","dlist-1.0-1ec91dd3ad8405ed390138bce1c7d55220d4758eda9fb3ad6fbb8b1ee6dc0c94","mtl-2.3.1","text-2.0.2","xml-conduit-1.9.1.3-bf19b431d216b0a2413840aa01a4a651624a00a392ce27bb32e3cbe5522c5d28","xml-types-0.3.8-d2a265fd20021a57d6f815997b9b3d3ac55b25363a4801f11d0a9db2d0cc2488"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"xml-types-0.3.8-d2a265fd20021a57d6f815997b9b3d3ac55b25363a4801f11d0a9db2d0cc2488","pkg-name":"xml-types","pkg-version":"0.3.8","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"0d1420f967a5f6439dc03f554b4d77cf15f9ff0aa58fa408efc52ca16459119b","pkg-src-sha256":"dad5e4ce602b7d1f4be37c0cfd99a261a4573746bfd80d917dc955b72da84c80","depends":["base-4.18.2.0","deepseq-1.4.8.1","text-2.0.2"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"zigzag-0.1.0.0-566d257af37db43b1ea7fe61e93ddea5f662ad8c5b1df04c1e845b14b13bcf67","pkg-name":"zigzag","pkg-version":"0.1.0.0","flags":{},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"794afe9e8f7a8abd79d77ae4bb0bb2eeb14b56bc49d2e2cbd8220b6778eecb70","pkg-src-sha256":"f538e7db692aa6c760f092473fa69b416207b9e58c8c640c192b98f6778eafb3","depends":["base-4.18.2.0"],"exe-depends":[],"component-name":"lib"},{"type":"configured","id":"zlib-0.6.3.0-61cb40f46d103a622525dc3a70a9004984ec56d61deea65d2dc01c964606b7e9","pkg-name":"zlib","pkg-version":"0.6.3.0","flags":{"bundled-c-zlib":false,"non-blocking-ffi":false,"pkg-config":false},"style":"global","pkg-src":{"type":"repo-tar","repo":{"type":"secure-repo","uri":"https://hackage.haskell.org/"}},"pkg-cabal-sha256":"19eb7759af71957811d5ec10ddb1e2f4c98700ddb9c0da6860c0441d811f0e6d","pkg-src-sha256":"9eaa989ad4534438b5beb51c1d3a4c8f6a088fdff0b259a5394fbf39aaee04da","depends":["base-4.18.2.0","bytestring-0.11.5.3"],"exe-depends":[],"component-name":"lib"}]} \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index fbcca093..4a8e2907 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # CHANGELOG +## 1.0.16 -- 2024-02-26 + +* Add badge component for custom build type ([#517](https://github.com/flora-pm/flora-server/pull/517)) + ## 1.0.15 -- 2024-02-16 * Show 3 digits in version if using 0x scheme. ([#490](https://github.com/flora-pm/flora-server/pull/490)) * Deduplicate dependencies listed in package overview ([#492](https://github.com/flora-pm/flora-server/pull/492)) diff --git a/assets/css/3-screens/1-package/1-package.css b/assets/css/3-screens/1-package/1-package.css index 0bda37af..7caf2e83 100644 --- a/assets/css/3-screens/1-package/1-package.css +++ b/assets/css/3-screens/1-package/1-package.css @@ -1,5 +1,23 @@ /* stylelint-disable selector-class-pattern */ /* stylelint-disable declaration-block-no-redundant-longhand-properties */ + +#package-install-section { + p { + display: inline-block; + } + + .package-build-type-custom { + background-color: #ffc107; + border-radius: 0.25rem; + color: white; + font-size: 50%; + font-weight: 700; + padding-left: 0.5rem; + padding-right: 0.5rem; + margin-left: 0.5rem; + } +} + .package-install-string { background-color: transparent; border-color: var(--install-string-border); @@ -46,7 +64,7 @@ .package-body-section { font-size: 1.5rem; line-height: 2rem; - margin-bottom: 0.75rem; + margin-bottom: 0.5rem; } .package-right-column { diff --git a/assets/css/3-screens/5-package-version.css b/assets/css/3-screens/5-settings/1-dashboard.css similarity index 76% rename from assets/css/3-screens/5-package-version.css rename to assets/css/3-screens/5-settings/1-dashboard.css index 07e42822..c79be52f 100644 --- a/assets/css/3-screens/5-package-version.css +++ b/assets/css/3-screens/5-settings/1-dashboard.css @@ -1,2 +1,6 @@ /* stylelint-disable selector-class-pattern */ /* stylelint-disable declaration-block-no-redundant-longhand-properties */ + +#subheader { + text-align: right; +} diff --git a/assets/css/styles.css b/assets/css/styles.css index 631dfa54..e4841d08 100644 --- a/assets/css/styles.css +++ b/assets/css/styles.css @@ -20,6 +20,7 @@ @import "3-screens/2-categories.css"; @import "3-screens/3-about.css"; @import "3-screens/4-front-page.css"; +@import "3-screens/5-settings/1-dashboard.css"; @import "4-helpers.css"; diff --git a/cabal.project b/cabal.project index 3c4a46a2..8a19b1b6 100644 --- a/cabal.project +++ b/cabal.project @@ -1,27 +1,20 @@ packages: ./ --- profiling: True -executable-dynamic: True - -with-compiler: ghc-9.4.7 +with-compiler: ghc-9.6.4 active-repositories: hackage.haskell.org -store-dir: _build/cabal-store - tests: True -documentation: True - allow-newer: type-errors-pretty:base - , prometheus-proc:base - , prometheus-proc:text , souffle-haskell:text , servant-lucid:text , lucid-svg:text + , lucid-svg:transformers , lucid-aria:text , lucid-alpine:text + , hashable:filepath allow-older: pg-entity:time @@ -50,18 +43,10 @@ source-repository-package location: https://github.com/supki/envparse tag: 503a699 -source-repository-package - type: git - location: https://github.com/fimad/prometheus-haskell - tag: 43f19da - subdir: ./prometheus-metrics-ghc - ./prometheus-client - ./wai-middleware-prometheus - source-repository-package type: git location: https://github.com/flora-pm/wai-middleware-heartbeat - tag: 336523a + tag: 5b56e1d source-repository-package type: git @@ -82,3 +67,8 @@ source-repository-package type: git location: https://github.com/haskell-cryptography/one-time-password tag: 2ca2313 + +source-repository-package + type: git + location: https://github.com/tchoutri/souffle-haskell + tag: 3afe53f diff --git a/cabal.project.freeze b/cabal.project.freeze index 06b08fa5..35e288d0 100644 --- a/cabal.project.freeze +++ b/cabal.project.freeze @@ -1,6 +1,6 @@ active-repositories: hackage.haskell.org:merge -constraints: any.Cabal ==3.8.1.0, - any.Cabal-syntax ==3.8.1.0, +constraints: any.Cabal ==3.10.1.0, + any.Cabal-syntax ==3.10.1.0, any.HUnit ==1.6.2.0, any.JuicyPixels ==3.3.8, JuicyPixels -mmap, @@ -25,7 +25,7 @@ constraints: any.Cabal ==3.8.1.0, ansi-terminal -example, any.ansi-terminal-types ==0.11.5, any.appar ==0.1.8, - any.array ==0.5.4.0, + any.array ==0.5.6.0, any.asn1-encoding ==0.9.6, any.asn1-parse ==0.9.5, any.asn1-types ==0.3.4, @@ -33,7 +33,7 @@ constraints: any.Cabal ==3.8.1.0, assoc +tagged, any.async ==2.2.4, async -bench, - any.atomic-primops ==0.8.4, + any.atomic-primops ==0.8.5, atomic-primops -debug, any.attoparsec ==0.14.4, attoparsec -developer, @@ -41,14 +41,14 @@ constraints: any.Cabal ==3.8.1.0, any.authenticate-oauth ==1.7, any.auto-update ==0.1.6, any.barbies ==2.1.1.0, - any.base ==4.17.2.0, + any.base ==4.18.2.0, any.base-compat ==0.13.1, any.base-compat-batteries ==0.13.1, any.base-orphans ==0.9.1, any.base16 ==1.0, any.base16-bytestring ==1.0.2.0, any.base32 ==0.4, - any.base64 ==0.4.2.4, + any.base64 ==1.0, any.base64-bytestring ==1.2.1.0, any.basement ==0.0.16, any.bifunctors ==5.6.1, @@ -68,7 +68,7 @@ constraints: any.Cabal ==3.8.1.0, any.byteslice ==0.2.13.2, byteslice +avoid-rawmemchr, any.bytesmith ==0.3.11.0, - any.bytestring ==0.11.5.2, + any.bytestring ==0.11.5.3, any.bytestring-builder ==0.10.8.2.0, bytestring-builder +bytestring_has_builder, any.cabal-doctest ==1.0.9, @@ -78,7 +78,7 @@ constraints: any.Cabal ==3.8.1.0, cborg +optimize-gmp, any.cereal ==0.5.8.3, cereal -bytestring-builder, - any.chronos ==1.1.6.0, + any.chronos ==1.1.6.1, any.clock ==0.8.4, clock -llvm, any.cmark-gfm ==0.2.6, @@ -87,8 +87,8 @@ constraints: any.Cabal ==3.8.1.0, cmdargs +quotation -testprog, any.colour ==2.3.6, any.colourista ==0.1.0.2, - any.commonmark ==0.2.5, - any.commonmark-extensions ==0.2.5.1, + any.commonmark ==0.2.5.1, + any.commonmark-extensions ==0.2.5.2, any.comonad ==5.0.8, comonad +containers +distributive +indexed-traversable, any.concurrent-output ==1.10.20, @@ -123,12 +123,10 @@ constraints: any.Cabal ==3.8.1.0, any.data-default-instances-dlist ==0.0.1, any.data-default-instances-old-locale ==0.0.1, any.data-fix ==0.3.2, - any.data-sketches ==0.3.1.0, - any.data-sketches-core ==0.1.0.0, any.dec ==0.0.5, - any.deepseq ==1.4.8.0, + any.deepseq ==1.4.8.1, any.deriving-aeson ==0.2.9, - any.directory ==1.3.7.1, + any.directory ==1.3.8.1, any.distributive ==0.6.2.1, distributive +semigroups +tagged, any.dlist ==1.0, @@ -143,17 +141,13 @@ constraints: any.Cabal ==3.8.1.0, entropy -donotgetentropy, any.envparse ==0.5.0, any.erf ==2.0.0.0, - any.exceptions ==0.10.5, + any.exceptions ==0.10.7, any.extensible-exceptions ==0.1.1.4, any.extra ==1.7.14, any.fast-logger ==3.2.2, any.file-embed ==0.0.16.0, - any.filepath ==1.4.2.2, - any.filtrable ==0.1.6.0, - filtrable +containers, + any.filepath ==1.4.200.1, flora -prod, - any.foldable1-classes-compat ==0.1, - foldable1-classes-compat +tagged, any.foreign-store ==0.2, any.free ==5.2, any.friendly-time ==0.4.1, @@ -162,13 +156,13 @@ constraints: any.Cabal ==3.8.1.0, generic-deriving +base-4-9, any.generically ==0.1.1, any.generics-sop ==0.5.1.4, - any.ghc ==9.4.7, + any.ghc ==9.6.4, any.ghc-bignum ==1.3, - any.ghc-boot ==9.4.7, - any.ghc-boot-th ==9.4.7, - any.ghc-heap ==9.4.7, - any.ghc-prim ==0.9.1, - any.ghci ==9.4.7, + any.ghc-boot ==9.6.4, + any.ghc-boot-th ==9.6.4, + any.ghc-heap ==9.6.4, + any.ghc-prim ==0.10.0, + any.ghci ==9.6.4, any.haddock-library ==1.11.0, any.half ==0.3.1, any.happy ==1.20.1.1, @@ -182,7 +176,7 @@ constraints: any.Cabal ==3.8.1.0, any.hedgehog ==1.4, any.hostname ==1.0, any.hourglass ==0.2.12, - any.hpc ==0.6.1.0, + any.hpc ==0.6.2.0, any.hsc2hs ==0.68.10, hsc2hs -in-ghc-tree, any.hspec ==2.11.7, @@ -228,8 +222,6 @@ constraints: any.Cabal ==3.8.1.0, any.lucid ==2.11.20230408, any.lucid-alpine ==0.1.0.7, any.lucid-svg ==0.7.1.1, - any.math-functions ==0.3.4.3, - math-functions +system-erf +system-expm1, any.megaparsec ==9.6.1, megaparsec -dev, any.memory ==0.18.0, @@ -247,10 +239,9 @@ constraints: any.Cabal ==3.8.1.0, any.monad-time ==0.4.0.0, any.monad-time-effectful ==1.0.0.0, any.mono-traversable ==1.0.15.3, - any.mtl ==2.2.2, + any.mtl ==2.3.1, any.mtl-compat ==0.2.2, mtl-compat -two-point-one -two-point-two, - any.mwc-random ==0.15.0.2, any.natural-arithmetic ==0.2.1.0, any.network ==3.1.4.0, network -devel, @@ -296,9 +287,6 @@ constraints: any.Cabal ==3.8.1.0, any.primitive-unlifted ==2.1.0.0, any.process ==1.6.17.0, any.profunctors ==5.6.2, - any.prometheus-client ==1.1.0, - any.prometheus-metrics-ghc ==1.0.1.2, - any.prometheus-proc ==0.1.5.0, any.psqueues ==0.2.8.0, any.qrcode-core ==0.9.9, any.qrcode-juicypixels ==0.8.5, @@ -309,7 +297,6 @@ constraints: any.Cabal ==3.8.1.0, any.recv ==0.1.0, any.reflection ==2.1.7, reflection -slow +template-haskell, - any.regex-applicative ==0.3.4, any.req ==3.13.2, req -dev, any.resource-pool ==0.4.0.0, @@ -317,7 +304,7 @@ constraints: any.Cabal ==3.8.1.0, any.retry ==0.9.3.1, retry -lib-werror, any.rts ==1.0.2, - any.run-st ==0.1.3.2, + any.run-st ==0.1.3.3, any.safe ==0.3.21, any.safe-exceptions ==0.1.7.4, any.scientific ==0.3.7.0, @@ -349,7 +336,7 @@ constraints: any.Cabal ==3.8.1.0, any.some ==1.0.6, some +newtype-unsafe, any.sop-core ==0.5.0.2, - any.souffle-haskell ==3.5.1, + any.souffle-haskell ==4.0.0, any.split ==0.2.5, any.splitmix ==0.1.0.5, splitmix -optimised-mixer, @@ -372,10 +359,9 @@ constraints: any.Cabal ==3.8.1.0, any.tasty ==1.5, tasty +unix, any.tasty-hunit ==0.10.1, - any.template-haskell ==2.19.0.0, + any.template-haskell ==2.20.0.0, any.temporary ==1.3, any.terminal-size ==0.3.4, - any.terminfo ==0.4.1.5, any.text ==2.0.2, any.text-conversions ==0.3.1.1, any.text-display ==0.0.5.1, @@ -397,10 +383,10 @@ constraints: any.Cabal ==3.8.1.0, time-compat -old-locale, any.time-manager ==0.0.1, any.timing-convenience ==0.1, - any.tls ==2.0.0, + any.tls ==2.0.1, tls -devel, any.torsor ==0.1.0.1, - any.transformers ==0.5.6.2, + any.transformers ==0.6.1.0, any.transformers-base ==0.4.6, transformers-base +orphaninstances, any.transformers-compat ==0.7.2, @@ -412,10 +398,9 @@ constraints: any.Cabal ==3.8.1.0, unicode-data -ucd2haskell, any.unicode-transforms ==0.4.0.1, unicode-transforms -bench-show -dev -has-icu -has-llvm -use-gauge, - any.unix ==2.7.3, + any.unix ==2.8.4.0, any.unix-compat ==0.7.1, unix-compat -old-time, - any.unix-memory ==0.1.2, any.unix-time ==0.4.12, any.unlifted ==0.2.2.0, any.unliftio ==0.2.25.0, @@ -442,7 +427,6 @@ constraints: any.Cabal ==3.8.1.0, any.wai-log ==0.4.0.1, any.wai-logger ==2.4.0, any.wai-middleware-heartbeat ==0.0.1.0, - any.wai-middleware-prometheus ==1.0.0.1, any.warp ==3.3.31, warp +allow-sendfilefd -network-bytestring -warp-debug -x509, any.wide-word ==0.1.6.0, @@ -455,4 +439,4 @@ constraints: any.Cabal ==3.8.1.0, any.zigzag ==0.1.0.0, any.zlib ==0.6.3.0, zlib -bundled-c-zlib -non-blocking-ffi -pkg-config -index-state: hackage.haskell.org 2024-02-13T10:07:10Z +index-state: hackage.haskell.org 2024-02-21T10:56:14Z diff --git a/design/package-lock.json b/design/package-lock.json index 61a82500..67724d8b 100644 --- a/design/package-lock.json +++ b/design/package-lock.json @@ -7954,9 +7954,9 @@ } }, "node_modules/ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.1.tgz", + "integrity": "sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==", "dev": true }, "node_modules/ipaddr.js": { @@ -18067,9 +18067,9 @@ } }, "ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.1.tgz", + "integrity": "sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==", "dev": true }, "ipaddr.js": { diff --git a/flora.cabal b/flora.cabal index ef409872..d2873cae 100644 --- a/flora.cabal +++ b/flora.cabal @@ -1,6 +1,6 @@ cabal-version: 3.0 name: flora -version: 1.0.15 +version: 1.0.16 homepage: https://github.com/flora-pm/flora-server/#readme bug-reports: https://github.com/flora-pm/flora-server/issues author: Théophile Choutri @@ -12,7 +12,7 @@ extra-source-files: LICENSE README.md -tested-with: GHC ==9.4.7 +tested-with: GHC ==9.6.4 source-repository head type: git @@ -81,6 +81,7 @@ library Data.Time.Orphans Database.PostgreSQL.Simple.Orphans Distribution.Orphans + Distribution.Orphans.BuildType Distribution.Orphans.CompilerFlavor Distribution.Orphans.ConfVar Distribution.Orphans.PackageFlag @@ -138,7 +139,7 @@ library build-depends: , aeson - , base ^>=4.17 + , base ^>=4.18.2 , base16-bytestring , base64 , blaze-builder @@ -155,7 +156,6 @@ library , directory , effectful-core , envparse - , extra , filepath , http-api-data , http-media @@ -166,7 +166,6 @@ library , lucid , memory , monad-time-effectful - , mtl , odd-jobs , openapi3 , optics-core @@ -185,7 +184,7 @@ library , servant-lucid , servant-server , slugify - , souffle-haskell ==3.5.1 + , souffle-haskell ==4.0.0 , streamly , streamly-core , tar @@ -217,7 +216,6 @@ library flora-web FloraWeb.Common.Auth.TwoFactor FloraWeb.Common.Auth.Types FloraWeb.Common.Guards - FloraWeb.Common.Metrics FloraWeb.Common.OpenSearch FloraWeb.Common.Pagination FloraWeb.Common.Tracing @@ -233,6 +231,7 @@ library flora-web FloraWeb.Components.PackageListHeader FloraWeb.Components.PackageListItem FloraWeb.Components.PaginationNav + FloraWeb.Components.Pill FloraWeb.Components.SlimSearchBar FloraWeb.Components.Utils FloraWeb.Components.VersionListHeader @@ -277,12 +276,11 @@ library flora-web build-depends: , aeson , async - , base ^>=4.17 + , base ^>=4.18.2 , base32 , bytestring , Cabal-syntax , chronos - , clock , cmark-gfm , colourista , containers @@ -318,9 +316,6 @@ library flora-web , pg-transact-effectful , postgresql-simple , pretty - , prometheus-client - , prometheus-metrics-ghc - , prometheus-proc , PyF , raven-haskell , resource-pool @@ -343,7 +338,6 @@ library flora-web , wai-app-static , wai-log , wai-middleware-heartbeat - , wai-middleware-prometheus , warp , xml-conduit , xml-conduit-writer @@ -474,7 +468,6 @@ test-suite flora-test , tasty-hunit , text , time - , typed-process , uuid , vector , vector-algorithms diff --git a/migrations/20240225155408_add_buildtype_to_releases.sql b/migrations/20240225155408_add_buildtype_to_releases.sql new file mode 100644 index 00000000..fd8ca575 --- /dev/null +++ b/migrations/20240225155408_add_buildtype_to_releases.sql @@ -0,0 +1,5 @@ +create type build_type as enum + ('Simple', 'Configure', 'Make', 'Custom'); + +alter table releases + add column build_type build_type not null default 'Simple'; diff --git a/src/core/Flora/Environment.hs b/src/core/Flora/Environment.hs index 98e23bd4..4487c734 100644 --- a/src/core/Flora/Environment.hs +++ b/src/core/Flora/Environment.hs @@ -78,7 +78,7 @@ newtype FeatureEnv = FeatureEnv {blobStoreImpl :: Maybe BlobStoreImpl} instance ToJSON FeatureEnv --- In future we'll want to error for conflicting options +-- In future we'll want to error for conflicting o ptions featureConfigToEnv :: FeatureConfig -> Eff es FeatureEnv featureConfigToEnv FeatureConfig{..} = case blobStoreFS of diff --git a/src/core/Flora/Environment/Config.hs b/src/core/Flora/Environment/Config.hs index 5cd36aea..a455098b 100644 --- a/src/core/Flora/Environment/Config.hs +++ b/src/core/Flora/Environment/Config.hs @@ -22,6 +22,7 @@ import Control.Monad ((>=>)) import Crypto.Hash (Digest, SHA256) import Crypto.Hash.Conduit (hashFile) import Data.Aeson qualified as Aeson +import Data.Base64.Types qualified as B64 import Data.Bifunctor (Bifunctor (second)) import Data.ByteArray qualified as BA import Data.ByteString (ByteString) @@ -269,4 +270,4 @@ getAssetHash hashedAssetPath = do hashBundle :: IOE :> es => Text -> Eff es Text hashBundle path = do digest :: Digest SHA256 <- hashFile (Text.unpack path) - pure . display . B64.encodeBase64 . BA.convert $ digest + pure . display . B64.extractBase64 . B64.encodeBase64 . BA.convert $ digest diff --git a/src/core/Flora/Import/Package.hs b/src/core/Flora/Import/Package.hs index 112a91aa..31fdedde 100644 --- a/src/core/Flora/Import/Package.hs +++ b/src/core/Flora/Import/Package.hs @@ -21,7 +21,6 @@ module Flora.Import.Package where import Control.DeepSeq (force) import Control.Exception -import Control.Monad.Except import Data.ByteString qualified as BS import Data.Maybe import Data.Pool (Pool, withResource) @@ -69,6 +68,7 @@ import Optics.Core import System.Directory qualified as System import System.FilePath +import Control.Monad (forM_, unless, void) import Flora.Environment.Config (PoolConfig (..)) import Flora.Import.Categories.Tuning qualified as Tuning import Flora.Import.Package.Types @@ -318,6 +318,7 @@ extractPackageDataFromCabal userId (repositoryName, repositoryPackages) uploadTi let packageDesc = genericDesc.packageDescription let flags = Vector.fromList genericDesc.genPackageFlags let packageName = force $ packageDesc ^. #package % #pkgName % to unPackageName % to pack % to PackageName + let buildType = Cabal.buildType genericDesc.packageDescription let packageVersion = force packageDesc.package.pkgVersion let namespace = chooseNamespace packageName repositoryName repositoryPackages let packageId = deterministicPackageId namespace packageName @@ -367,6 +368,7 @@ extractPackageDataFromCabal userId (repositoryName, repositoryPackages) uploadTi , testedWith = getVersions . extractTestedWith . Vector.fromList $ packageDesc.testedWith , deprecated = Nothing , revisedAt = Nothing + , buildType = buildType } let lib = extractLibrary package (repositoryName, repositoryPackages) release Nothing [] <$> allLibraries packageDesc diff --git a/src/core/Flora/Model/Release/Types.hs b/src/core/Flora/Model/Release/Types.hs index 09f27096..5172fb3c 100644 --- a/src/core/Flora/Model/Release/Types.hs +++ b/src/core/Flora/Model/Release/Types.hs @@ -40,8 +40,10 @@ import Control.DeepSeq import Data.Text.Lazy qualified as Text import Deriving.Aeson import Distribution.Orphans () +import Distribution.Orphans.BuildType () import Distribution.Orphans.CompilerFlavor () import Distribution.Orphans.PackageFlag () +import Distribution.Types.BuildType (BuildType) import Flora.Model.BlobStore.Types import Flora.Model.Package @@ -104,6 +106,7 @@ data Release = Release , deprecated :: Maybe Bool , repository :: Maybe Text , revisedAt :: Maybe UTCTime + , buildType :: BuildType } deriving stock (Eq, Show, Generic) deriving anyclass (FromRow, ToRow, NFData) diff --git a/src/core/Flora/QRCode.hs b/src/core/Flora/QRCode.hs index 9849fc20..86c4d565 100644 --- a/src/core/Flora/QRCode.hs +++ b/src/core/Flora/QRCode.hs @@ -3,6 +3,7 @@ module Flora.QRCode where import Codec.Picture import Codec.QRCode import Codec.QRCode.JuicyPixels +import Data.Base64.Types (extractBase64) import Data.ByteString (StrictByteString) import Data.ByteString.Base64 import Data.ByteString.Lazy qualified as BSL @@ -18,3 +19,4 @@ generateQRCode uri = & encodePng & BSL.toStrict & encodeBase64' + & extractBase64 diff --git a/src/datatypes/Distribution/Orphans/BuildType.hs b/src/datatypes/Distribution/Orphans/BuildType.hs new file mode 100644 index 00000000..08bf2c3f --- /dev/null +++ b/src/datatypes/Distribution/Orphans/BuildType.hs @@ -0,0 +1,32 @@ +{-# LANGUAGE TemplateHaskell #-} +{-# OPTIONS_GHC -fno-warn-orphans #-} + +module Distribution.Orphans.BuildType where + +import Data.Aeson (camelTo2) +import Data.Aeson.TH +import Data.ByteString (ByteString) +import Data.ByteString.Char8 qualified as C8 +import Database.PostgreSQL.Simple.FromField +import Database.PostgreSQL.Simple.ToField +import Distribution.Parsec +import Distribution.Pretty qualified as Pretty +import Distribution.Types.BuildType (BuildType (..)) +import Distribution.Utils.Generic (fromUTF8BS) + +instance FromField BuildType where + fromField :: Field -> Maybe ByteString -> Conversion BuildType + fromField f mdata = + case mdata of + Nothing -> returnError UnexpectedNull f "" + Just bs -> + case simpleParsec (fromUTF8BS bs) of + Just (a :: BuildType) -> pure a + Nothing -> + returnError ConversionFailed f $ + "Conversion error: Expected valid Build Type for 'build_type', got: " <> fromUTF8BS bs + +instance ToField BuildType where + toField = Escape . C8.pack . Pretty.prettyShow + +$(deriveJSON defaultOptions{fieldLabelModifier = camelTo2 '_'} ''BuildType) diff --git a/src/web/FloraWeb/API/Server.hs b/src/web/FloraWeb/API/Server.hs index e12bcda2..9d63a6a7 100644 --- a/src/web/FloraWeb/API/Server.hs +++ b/src/web/FloraWeb/API/Server.hs @@ -6,7 +6,7 @@ import FloraWeb.API.Routes qualified as API import FloraWeb.API.Server.Packages qualified as PackagesAPI import FloraWeb.Types -apiServer :: ServerT API.Routes FloraAPI +apiServer :: ServerT API.Routes FloraEff apiServer = API.Routes' { packages = PackagesAPI.packagesServer diff --git a/src/web/FloraWeb/API/Server/Packages.hs b/src/web/FloraWeb/API/Server/Packages.hs index e83bed88..68b042a6 100644 --- a/src/web/FloraWeb/API/Server/Packages.hs +++ b/src/web/FloraWeb/API/Server/Packages.hs @@ -4,8 +4,13 @@ import Data.Function import Data.Maybe (fromMaybe) import Data.Vector qualified as Vector import Distribution.Version (Version) -import Servant +import Effectful (Eff, (:>)) +import Servant hiding ((:>)) +import Effectful.Error.Static (Error) +import Effectful.Log (Log) +import Effectful.PostgreSQL.Transact.Effect (DB) +import Effectful.Time (Time) import Flora.Model.Component.Query qualified as Query import Flora.Model.Package.Types import Flora.Model.Release.Query qualified as Query @@ -16,13 +21,13 @@ import FloraWeb.API.Routes.Packages.Types (PackageDTO, toPackageDTO) import FloraWeb.Common.Guards import FloraWeb.Types -packagesServer :: ServerT Packages.API FloraAPI +packagesServer :: ServerT Packages.API FloraEff packagesServer = Packages.API' { withPackage = withPackageServer } -withPackageServer :: Namespace -> PackageName -> ServerT Packages.PackageAPI FloraAPI +withPackageServer :: Namespace -> PackageName -> ServerT Packages.PackageAPI FloraEff withPackageServer namespace packageName = Packages.PackageAPI' { getPackage = getPackageHandler namespace packageName @@ -30,12 +35,13 @@ withPackageServer namespace packageName = } getPackageHandler - :: Namespace + :: (Time :> es, Log :> es, DB :> es, Error ServerError :> es) + => Namespace -> PackageName - -> FloraAPI (PackageDTO 0) + -> (Eff es) (PackageDTO 0) getPackageHandler namespace packageName = do package <- guardThatPackageExists namespace packageName packageNotFound - releases <- Query.getReleases (package.packageId) + releases <- Query.getReleases package.packageId let latestRelease = releases & Vector.filter (\r -> not (fromMaybe False r.deprecated)) @@ -50,10 +56,11 @@ getPackageHandler namespace packageName = do pure $ toPackageDTO package release components getVersionedPackageHandler - :: Namespace + :: (Time :> es, Log :> es, DB :> es, Error ServerError :> es) + => Namespace -> PackageName -> Version - -> FloraAPI (PackageDTO 0) + -> (Eff es) (PackageDTO 0) getVersionedPackageHandler namespace packageName version = do package <- guardThatPackageExists namespace packageName packageNotFound release <- diff --git a/src/web/FloraWeb/Common/Auth.hs b/src/web/FloraWeb/Common/Auth.hs index ebb896dd..7db7fa23 100644 --- a/src/web/FloraWeb/Common/Auth.hs +++ b/src/web/FloraWeb/Common/Auth.hs @@ -4,6 +4,7 @@ module FloraWeb.Common.Auth , StrictAuthContext , optionalAuthHandler , strictAuthHandler + , adminAuthHandler ) where @@ -11,9 +12,9 @@ import Data.Function ((&)) import Data.List qualified as List import Data.Text (Text) import Data.UUID qualified as UUID +import Debug.Trace import Effectful import Effectful.Error.Static (Error, runErrorNoCallStack, throwError) -import Effectful.Log (Log) import Effectful.PostgreSQL.Transact.Effect (DB) import Effectful.PostgreSQL.Transact.Effect qualified as DB import Log (Logger) @@ -39,17 +40,16 @@ import FloraWeb.Session import FloraWeb.Types import Servant qualified -type OptionalAuthContext = AuthHandler Request (Headers '[Header "Set-Cookie" SetCookie] Session) -type StrictAuthContext = AuthHandler Request (Headers '[Header "Set-Cookie" SetCookie] Session) +type OptionalAuthContext = AuthHandler Request (Headers '[Header "Set-Cookie" SetCookie] (Session (Maybe User))) +type StrictAuthContext = AuthHandler Request (Headers '[Header "Set-Cookie" SetCookie] (Session User)) optionalAuthHandler :: Logger -> FloraEnv -> OptionalAuthContext optionalAuthHandler logger floraEnv = mkAuthHandler ( \request -> - handler False floraEnv request + handler floraEnv request & Logging.runLog floraEnv.environment logger & DB.runDB floraEnv.pool - & runVisitorSession & effToHandler ) @@ -57,39 +57,85 @@ strictAuthHandler :: Logger -> FloraEnv -> StrictAuthContext strictAuthHandler logger floraEnv = mkAuthHandler ( \request -> - handler True floraEnv request + requireUserHandler floraEnv request & Logging.runLog floraEnv.environment logger & DB.runDB floraEnv.pool - & runVisitorSession & effToHandler ) +adminAuthHandler :: Logger -> FloraEnv -> StrictAuthContext +adminAuthHandler logger floraEnv = + mkAuthHandler + ( \request -> + requireAdminHandler floraEnv request + & Logging.runLog floraEnv.environment logger + & DB.runDB floraEnv.pool + & effToHandler + ) + +requireUserHandler + :: (DB :> es, Error ServerError :> es, IOE :> es) + => FloraEnv + -> Request + -> Eff es (Headers '[Header "Set-Cookie" SetCookie] (Session User)) +requireUserHandler floraEnv req = do + let cookies = getCookies req + mbPersistentSessionId <- handlerToEff $ getSessionId cookies + mbPersistentSession <- getInTheFuckingSessionShinji mbPersistentSessionId + mUserInfo <- fetchUser mbPersistentSession + requestID <- liftIO $ getRequestID req + (user, sessionId) <- do + case mUserInfo of + Nothing -> throwError $ err401{errBody = "Log-in first"} + Just (user, userSession) -> pure (user, userSession.persistentSessionId) + webEnvStore <- liftIO $ newWebEnvStore (WebEnv floraEnv) + let sessionCookie = craftSessionCookie sessionId False + pure $ addCookie sessionCookie (Session{..}) + handler - :: Bool - -> FloraEnv + :: (DB :> es, Error ServerError :> es, IOE :> es) + => FloraEnv -> Request - -> Eff - '[Log, DB, IsVisitor, Error ServerError, IOE] - (Headers '[Header "Set-Cookie" SetCookie] Session) -handler mustBeConnected floraEnv req = do + -> Eff es (Headers '[Header "Set-Cookie" SetCookie] (Session (Maybe User))) +handler floraEnv req = do let cookies = getCookies req mbPersistentSessionId <- handlerToEff $ getSessionId cookies mbPersistentSession <- getInTheFuckingSessionShinji mbPersistentSessionId mUserInfo <- fetchUser mbPersistentSession requestID <- liftIO $ getRequestID req - (mUser, sessionId) <- do + traceM $ "User info: " <> show mUserInfo + (user, sessionId) <- do case mUserInfo of - Nothing -> - if mustBeConnected - then throwError $ err401{errBody = "Log-in first"} - else do - nSessionId <- liftIO newPersistentSessionId - pure (Nothing, nSessionId) + Nothing -> do + nSessionId <- liftIO newPersistentSessionId + pure (Nothing, nSessionId) Just (user, userSession) -> pure (Just user, userSession.persistentSessionId) webEnvStore <- liftIO $ newWebEnvStore (WebEnv floraEnv) let sessionCookie = craftSessionCookie sessionId False pure $ addCookie sessionCookie (Session{..}) +requireAdminHandler + :: (DB :> es, Error ServerError :> es, IOE :> es) + => FloraEnv + -> Request + -> Eff es (Headers '[Header "Set-Cookie" SetCookie] (Session User)) +requireAdminHandler floraEnv req = do + let cookies = getCookies req + mbPersistentSessionId <- handlerToEff $ getSessionId cookies + mbPersistentSession <- getInTheFuckingSessionShinji mbPersistentSessionId + mUserInfo <- fetchUser mbPersistentSession + requestID <- liftIO $ getRequestID req + (user, sessionId) <- do + case mUserInfo of + Nothing -> throwError $ err401{errBody = "Log-in first"} + Just (user, userSession) -> + if user.userFlags.isAdmin + then pure (user, userSession.persistentSessionId) + else throwError $ err404{errBody = "Not Found"} + webEnvStore <- liftIO $ newWebEnvStore (WebEnv floraEnv) + let sessionCookie = craftSessionCookie sessionId False + pure $ addCookie sessionCookie (Session{..}) + getCookies :: Request -> Cookies getCookies req = maybe [] parseCookies (List.lookup hCookie headers) diff --git a/src/web/FloraWeb/Common/Auth/Types.hs b/src/web/FloraWeb/Common/Auth/Types.hs index 72c811a6..51061417 100644 --- a/src/web/FloraWeb/Common/Auth/Types.hs +++ b/src/web/FloraWeb/Common/Auth/Types.hs @@ -2,98 +2,43 @@ module FloraWeb.Common.Auth.Types where import Data.Kind (Type) import Data.OpenApi () +import Data.Text (Text) import Effectful -import Effectful.Dispatch.Static import Effectful.Error.Static (Error) import Effectful.Log (Log) -import Effectful.PostgreSQL.Transact.Effect (DB) import Effectful.Reader.Static (Reader) -import Effectful.Time (Time) import GHC.Generics import Servant.API (AuthProtect, Header, Headers) import Servant.Server import Servant.Server.Experimental.Auth (AuthServerData) import Web.Cookie (SetCookie) -import Data.Text (Text) -import Flora.Environment -import Flora.Model.BlobStore.API import Flora.Model.PersistentSession import Flora.Model.User import FloraWeb.Types -data Session = Session +data Session (a :: Type) = Session { sessionId :: PersistentSessionId - , mUser :: Maybe User + , user :: a , webEnvStore :: WebEnvStore , requestID :: Text } deriving stock (Generic) -data IsAdmin :: Effect - -type instance DispatchOf IsAdmin = Static NoSideEffects -newtype instance StaticRep IsAdmin = IsAdmin () - -runAdminSession - :: forall (es :: [Effect]) (a :: Type) - . () - => Eff (IsAdmin : es) a - -> Eff es a -runAdminSession computation = evalStaticRep (IsAdmin ()) computation - -data IsVisitor :: Effect - -type instance DispatchOf IsVisitor = Static NoSideEffects -newtype instance StaticRep IsVisitor = IsVisitor () - -runVisitorSession - :: forall (es :: [Effect]) (a :: Type) - . () - => Eff (IsVisitor : es) a - -> Eff es a -runVisitorSession computation = evalStaticRep (IsVisitor ()) computation - -putVisitorTag - :: forall (es :: [Effect]) (a :: Type) - . () - => Eff es a - -> Eff (IsVisitor : es) a -putVisitorTag m = raise m - -demoteSession - :: forall (es :: [Effect]) (a :: Type) - . () - => Eff (IsAdmin : es) a - -> Eff (IsVisitor : es) a -demoteSession = putVisitorTag . runAdminSession - -type BaseEffects = - '[ DB - , Time - , Reader (Headers '[Header "Set-Cookie" SetCookie] Session) - , Reader FeatureEnv - , BlobStoreAPI - , Log - , Error ServerError - , IOE - ] - --- | Datatypes used for every route that doesn't *need* an authenticated user -type FloraPage = - Eff (IsVisitor ': BaseEffects) - --- | Datatypes used for routes that *need* an admin -type FloraAdmin = - Eff (IsAdmin ': BaseEffects) +type SessionWithCookies a = + (Headers '[Header "Set-Cookie" SetCookie] (Session a)) -- | The effect stack for the development websockets type FloraDevSocket = Eff [Reader (), Log, Error ServerError, IOE] type instance AuthServerData (AuthProtect "optional-cookie-auth") = - (Headers '[Header "Set-Cookie" SetCookie] Session) + SessionWithCookies (Maybe User) type instance AuthServerData (AuthProtect "cookie-auth") = - (Headers '[Header "Set-Cookie" SetCookie] Session) + SessionWithCookies User + +type instance + AuthServerData (AuthProtect "cookie-admin") = + SessionWithCookies User diff --git a/src/web/FloraWeb/Common/Guards.hs b/src/web/FloraWeb/Common/Guards.hs index 2eb3902b..5edeb115 100644 --- a/src/web/FloraWeb/Common/Guards.hs +++ b/src/web/FloraWeb/Common/Guards.hs @@ -20,10 +20,11 @@ import Flora.Model.PackageIndex.Query as Query import Flora.Model.PackageIndex.Types (PackageIndex) import Flora.Model.Release.Query qualified as Query import Flora.Model.Release.Types (Release) -import FloraWeb.Common.Auth +import Flora.Model.User (User) import FloraWeb.Pages.Routes.Sessions (CreateSessionResponses) import FloraWeb.Pages.Templates.Screens.Sessions qualified as Sessions -import FloraWeb.Session (getSession) +import FloraWeb.Session (Session) +import FloraWeb.Types (FloraEff) guardThatPackageExists :: (DB :> es, Log :> es, Time :> es) @@ -67,16 +68,16 @@ guardThatPackageIndexExists namespace action = do Nothing -> action namespace guardThatUserHasProvidedTOTP - :: Maybe Text - -> (Text -> FloraPage (Union CreateSessionResponses)) - -> FloraPage (Union CreateSessionResponses) -guardThatUserHasProvidedTOTP mTOTP action = do + :: Session (Maybe User) + -> Maybe Text + -> (Text -> FloraEff (Union CreateSessionResponses)) + -> FloraEff (Union CreateSessionResponses) +guardThatUserHasProvidedTOTP session mTOTP action = do case mTOTP of Just totp -> action totp Nothing -> do - session <- getSession Log.logInfo_ "User did not provide a TOTP code" - templateDefaults <- fromSession session defaultTemplateEnv + templateDefaults <- templateFromSession session defaultTemplateEnv let templateEnv = templateDefaults & (#flashError ?~ mkError "Must provide an OTP code") diff --git a/src/web/FloraWeb/Common/Metrics.hs b/src/web/FloraWeb/Common/Metrics.hs deleted file mode 100644 index 6f1c9df0..00000000 --- a/src/web/FloraWeb/Common/Metrics.hs +++ /dev/null @@ -1,82 +0,0 @@ -module FloraWeb.Common.Metrics - ( prometheusMiddleware - ) -where - -import Data.Text (Text) -import Data.Text qualified as T -import Data.Text.Display -import Data.Text.Encoding -import Flora.Environment -import Network.HTTP.Types qualified as HTTP -import Network.Wai (Application, Request) -import Network.Wai qualified as Wai -import Network.Wai.Middleware.Prometheus (PrometheusSettings (..)) -import Network.Wai.Middleware.Prometheus qualified as P -import Prometheus as P -import System.Clock (Clock (..), getTime) - -prometheusMiddleware :: DeploymentEnv -> LoggingEnv -> Application -> Application -prometheusMiddleware environment LoggingEnv{prometheusEnabled} = - if prometheusEnabled - then P.prometheus config . instrument - else id - where - config = PrometheusSettings ["metrics"] False True - instrument :: Application -> Application - instrument = - instrumentHandlerValueWithFilter environment P.ignoreRawResponses normalizeWaiRequestRoute - -normalizeWaiRequestRoute :: Request -> Text -normalizeWaiRequestRoute req = pathInfo - where - pathInfo :: Text - pathInfo = "/" <> T.intercalate "/" (Wai.pathInfo req) - -countRoute - :: Text - -- ^ handler - -> Text - -- ^ method - -> Text - -- ^ status - -> Text - -- ^ environment - -> IO () -countRoute handler method status_code environment = - P.withLabel routeCounter (handler, method, status_code, environment) P.incCounter - -routeCounter :: P.Vector P.Label4 P.Counter -routeCounter = - P.unsafeRegister $ - P.vector ("handler", "method", "status_code", "environment") $ - P.counter info - where - info = P.Info "route_counter" "How many times was this route accessed" -{-# NOINLINE routeCounter #-} - -instrumentHandlerValueWithFilter - :: DeploymentEnv - -> (Wai.Response -> Maybe Wai.Response) - -- ^ Response filter - -> (Wai.Request -> Text) - -- ^ The function used to derive the "handler" value in Prometheus - -> Wai.Application - -- ^ The app to instrument - -> Wai.Application - -- ^ The instrumented app -instrumentHandlerValueWithFilter environment resFilter f app req respond = do - start <- getTime Monotonic - app - req - ( \res -> do - case resFilter res of - Nothing -> return () - Just res' -> do - end <- getTime Monotonic - let method = decodeUtf8 (Wai.requestMethod req) - let status_code = display (show (HTTP.statusCode (Wai.responseStatus res'))) - countRoute (f req) method status_code (display environment) - P.observeSeconds (f req) (Just method) (Just status_code) start end - respond res - ) diff --git a/src/web/FloraWeb/Components/Header.hs b/src/web/FloraWeb/Components/Header.hs index 2c1615eb..ba70dade 100644 --- a/src/web/FloraWeb/Components/Header.hs +++ b/src/web/FloraWeb/Components/Header.hs @@ -2,6 +2,7 @@ module FloraWeb.Components.Header where +import Control.Monad (unless) import Control.Monad.Reader import Data.Text (Text) import Lucid diff --git a/src/web/FloraWeb/Components/Navbar.hs b/src/web/FloraWeb/Components/Navbar.hs index 8c0c1f41..a07d9085 100644 --- a/src/web/FloraWeb/Components/Navbar.hs +++ b/src/web/FloraWeb/Components/Navbar.hs @@ -4,11 +4,9 @@ module FloraWeb.Components.Navbar where import Control.Monad.Reader (ask, asks) import Data.Text (Text) -import Data.Text.Display (display) import Lucid import Lucid.Alpine -import Flora.Model.PersistentSession (PersistentSessionId (..)) import Flora.Model.User (User (..), UserFlags (..)) import FloraWeb.Components.Utils import FloraWeb.Pages.Templates.Types @@ -77,7 +75,6 @@ navbarDropdown aboutNav packagesNav = do navBarLink' "/about" "About" aboutNav navBarLink' "/categories" "Categories" packagesNav navBarLink' "/packages" "Packages" packagesNav - -- userMenu themeToggle navBarLink @@ -102,10 +99,9 @@ navBarLink' = navBarLink "" userMenu :: FloraHTML userMenu = do ActiveElements{adminDashboard} <- asks activeElements - TemplateEnv{mUser, sessionId} <- ask + TemplateEnv{mUser} <- ask getUsernameOrLogin mUser adminLink adminDashboard mUser - logOff mUser sessionId navbarSearch :: FloraHTML navbarSearch = do @@ -130,13 +126,6 @@ navbarSearch = do ++ contentValue else pure mempty -logOff :: Maybe User -> PersistentSessionId -> FloraHTML -logOff Nothing _ = "" -logOff (Just _) sessionId = - form_ [action_ ("/sessions/delete/" <> display sessionId), method_ "post", id_ "logoff"] $ do - let btnClasses = "font-bold inline-flex items-center py-3 mx-4 text-white dark:text-gray-100 " - button_ [type_ "submit", class_ btnClasses] "Sign out" - adminLink :: Bool -> Maybe User -> FloraHTML adminLink active (Just user) | user.userFlags.isAdmin = navBarLink' "/admin" "Admin Dashboard" active @@ -167,8 +156,8 @@ themeToggle = do input_ [type_ "checkbox", name_ "", id_ "darkmode-toggle", class_ "hidden", xModel_ [] "theme"] getUsernameOrLogin :: Maybe User -> FloraHTML -getUsernameOrLogin Nothing = navBarLink' "/sessions/new" "Login/Signup" False -getUsernameOrLogin _ = "" -- navBarLink' "#" "Profile" False +getUsernameOrLogin Nothing = navBarLink' "/sessions/new" "Login" False +getUsernameOrLogin _ = navBarLink' "/settings/" "Profile" False isActive :: Bool -> Text isActive True = " active" diff --git a/src/web/FloraWeb/Components/Pill.hs b/src/web/FloraWeb/Components/Pill.hs new file mode 100644 index 00000000..635d57a7 --- /dev/null +++ b/src/web/FloraWeb/Components/Pill.hs @@ -0,0 +1,13 @@ +module FloraWeb.Components.Pill + ( customBuildType + ) where + +import Lucid + +import FloraWeb.Pages.Templates.Types (FloraHTML) + +import FloraWeb.Components.Utils (dataText_) + +customBuildType :: FloraHTML +customBuildType = + span_ [dataText_ "This package uses the Custom cabal build type", class_ "package-build-type-custom"] "Custom" diff --git a/src/web/FloraWeb/Components/Utils.hs b/src/web/FloraWeb/Components/Utils.hs index 777694d7..d25f3785 100644 --- a/src/web/FloraWeb/Components/Utils.hs +++ b/src/web/FloraWeb/Components/Utils.hs @@ -43,3 +43,7 @@ xId_ = makeAttribute "x-id" id'_ :: Text -> Attribute id'_ = makeAttribute ":id" + +-- | @datalist@ element +dataText_ :: Text -> Attribute +dataText_ = makeAttribute "data-text" diff --git a/src/web/FloraWeb/Pages/Routes.hs b/src/web/FloraWeb/Pages/Routes.hs index 703a5ade..7014ee1c 100644 --- a/src/web/FloraWeb/Pages/Routes.hs +++ b/src/web/FloraWeb/Pages/Routes.hs @@ -14,14 +14,14 @@ import Servant.HTML.Lucid type Routes = NamedRoutes Routes' data Routes' mode = Routes' - { home :: mode :- Get '[HTML] (Html ()) - , about :: mode :- "about" :> Get '[HTML] (Html ()) + { home :: mode :- AuthProtect "optional-cookie-auth" :> Get '[HTML] (Html ()) + , about :: mode :- AuthProtect "optional-cookie-auth" :> "about" :> Get '[HTML] (Html ()) , admin :: mode :- "admin" :> Admin.Routes - , sessions :: mode :- "sessions" :> Sessions.Routes + , sessions :: mode :- AuthProtect "optional-cookie-auth" :> "sessions" :> Sessions.Routes , packages :: mode :- "packages" :> Packages.Routes - , categories :: mode :- "categories" :> Categories.Routes - , search :: mode :- "search" :> Search.Routes - , settings :: mode :- AuthProtect "cookie-auth" :> "settings" :> Settings.Routes - , notFound :: mode :- Get '[HTML] (Html ()) + , categories :: mode :- AuthProtect "optional-cookie-auth" :> "categories" :> Categories.Routes + , search :: mode :- AuthProtect "optional-cookie-auth" :> "search" :> Search.Routes + , settings :: mode :- "settings" :> Settings.Routes + , notFound :: mode :- AuthProtect "optional-cookie-auth" :> Get '[HTML] (Html ()) } deriving stock (Generic) diff --git a/src/web/FloraWeb/Pages/Routes/Admin.hs b/src/web/FloraWeb/Pages/Routes/Admin.hs index 63cb3179..a921c0df 100644 --- a/src/web/FloraWeb/Pages/Routes/Admin.hs +++ b/src/web/FloraWeb/Pages/Routes/Admin.hs @@ -18,11 +18,9 @@ type FetchMetadataResponse = Headers '[Header "Location" Text] NoContent data Routes' mode = Routes' - { index :: mode :- Get '[HTML] (Html ()) - , fetchMetadata :: mode :- FetchMetadata - , oddJobs :: mode :- "odd-jobs" :> OddJobs.FinalAPI -- they compose :o - , users :: mode :- "users" :> AdminUsersRoutes - , packages :: mode :- "packages" :> PackagesAdminRoutes + { index :: mode :- AuthProtect "cookie-admin" :> Get '[HTML] (Html ()) + , fetchMetadata :: mode :- AuthProtect "cookie-admin" :> FetchMetadata + , oddJobs :: mode :- AuthProtect "cookie-admin" :> "odd-jobs" :> OddJobs.FinalAPI -- they compose :o } deriving stock (Generic) diff --git a/src/web/FloraWeb/Pages/Routes/Packages.hs b/src/web/FloraWeb/Pages/Routes/Packages.hs index 73e54008..d97f13f9 100644 --- a/src/web/FloraWeb/Pages/Routes/Packages.hs +++ b/src/web/FloraWeb/Pages/Routes/Packages.hs @@ -20,21 +20,25 @@ type Routes = NamedRoutes Routes' data Routes' mode = Routes' { index :: mode - :- QueryParam "page" (Positive Word) + :- AuthProtect "optional-cookie-auth" + :> QueryParam "page" (Positive Word) :> Get '[HTML] (Html ()) , showNamespace :: mode - :- Capture "namespace" Namespace + :- AuthProtect "optional-cookie-auth" + :> Capture "namespace" Namespace :> QueryParam "page" (Positive Word) :> Get '[HTML] (Html ()) , showPackage :: mode - :- Capture "namespace" Namespace + :- AuthProtect "optional-cookie-auth" + :> Capture "namespace" Namespace :> Capture "package" PackageName :> Get '[HTML] (Html ()) , showDependents :: mode - :- Capture "namespace" Namespace + :- AuthProtect "optional-cookie-auth" + :> Capture "namespace" Namespace :> Capture "package" PackageName :> "dependents" :> QueryParam "page" (Positive Word) @@ -42,7 +46,8 @@ data Routes' mode = Routes' :> Get '[HTML] (Html ()) , showVersionDependents :: mode - :- Capture "namespace" Namespace + :- AuthProtect "optional-cookie-auth" + :> Capture "namespace" Namespace :> Capture "package" PackageName :> Capture "version" Version :> "dependents" @@ -51,45 +56,52 @@ data Routes' mode = Routes' :> Get '[HTML] (Html ()) , showDependencies :: mode - :- Capture "namespace" Namespace + :- AuthProtect "optional-cookie-auth" + :> Capture "namespace" Namespace :> Capture "package" PackageName :> "dependencies" :> Get '[HTML] (Html ()) , showVersionDependencies :: mode - :- Capture "namespace" Namespace + :- AuthProtect "optional-cookie-auth" + :> Capture "namespace" Namespace :> Capture "package" PackageName :> Capture "version" Version :> "dependencies" :> Get '[HTML] (Html ()) , showChangelog :: mode - :- Capture "namespace" Namespace + :- AuthProtect "optional-cookie-auth" + :> Capture "namespace" Namespace :> Capture "package" PackageName :> "changelog" :> Get '[HTML] (Html ()) , showVersionChangelog :: mode - :- Capture "namespace" Namespace + :- AuthProtect "optional-cookie-auth" + :> Capture "namespace" Namespace :> Capture "package" PackageName :> Capture "version" Version :> "changelog" :> Get '[HTML] (Html ()) , showVersion :: mode - :- Capture "namespace" Namespace + :- AuthProtect "optional-cookie-auth" + :> Capture "namespace" Namespace :> Capture "package" PackageName :> Capture "version" Version :> Get '[HTML] (Html ()) , listVersions :: mode - :- Capture "namespace" Namespace + :- AuthProtect "optional-cookie-auth" + :> Capture "namespace" Namespace :> Capture "package" PackageName :> "versions" :> Get '[HTML] (Html ()) , getTarball :: mode - :- Capture "namespace" Namespace + :- AuthProtect "optional-cookie-auth" + :> Capture "namespace" Namespace :> Capture "package" PackageName :> Capture "version" Version :> Capture "tarball" Text diff --git a/src/web/FloraWeb/Pages/Routes/Settings.hs b/src/web/FloraWeb/Pages/Routes/Settings.hs index ad4033ea..d647f257 100644 --- a/src/web/FloraWeb/Pages/Routes/Settings.hs +++ b/src/web/FloraWeb/Pages/Routes/Settings.hs @@ -20,14 +20,17 @@ type Routes = NamedRoutes Routes' type GetUserSettings = - Get '[HTML] (Html ()) + AuthProtect "cookie-auth" + :> Get '[HTML] (Html ()) type GetUserSecuritySettings = - "security" + AuthProtect "cookie-auth" + :> "security" :> Get '[HTML] (Html ()) type GetTwoFactorSettingsPage = - "security" + AuthProtect "cookie-auth" + :> "security" :> "two-factor" :> Get '[HTML] (Html ()) @@ -43,14 +46,16 @@ data TwoFactorConfirmationForm = TwoFactorConfirmationForm deriving anyclass (FromForm, ToForm) type PostTwoFactorSetup = - "security" + AuthProtect "cookie-auth" + :> "security" :> "two-factor" :> "setup" :> ReqBody '[FormUrlEncoded] TwoFactorConfirmationForm :> UVerb 'POST '[HTML] TwoFactorSetupResponses type DeleteTwoFactorSetup = - "security" + AuthProtect "cookie-auth" + :> "security" :> "two-factor" :> "delete" :> Verb 'POST 301 '[HTML] DeleteTwoFactorSetupResponse diff --git a/src/web/FloraWeb/Pages/Server.hs b/src/web/FloraWeb/Pages/Server.hs index 41f41f49..3b51b7f1 100644 --- a/src/web/FloraWeb/Pages/Server.hs +++ b/src/web/FloraWeb/Pages/Server.hs @@ -6,6 +6,7 @@ import Lucid import Optics.Core import Servant +import Flora.Model.User (User) import FloraWeb.Common.Auth import FloraWeb.Pages.Routes import FloraWeb.Pages.Server.Admin qualified as Admin @@ -17,11 +18,11 @@ import FloraWeb.Pages.Server.Settings qualified as Settings import FloraWeb.Pages.Templates import FloraWeb.Pages.Templates.Error (web404) import FloraWeb.Pages.Templates.Screens.Home qualified as Home -import FloraWeb.Session +import FloraWeb.Types (FloraEff) import OddJobs.Endpoints qualified as OddJobs import OddJobs.Types qualified as OddJobs -server :: OddJobs.UIConfig -> OddJobs.Env -> ServerT Routes FloraPage +server :: OddJobs.UIConfig -> OddJobs.Env -> ServerT Routes FloraEff server cfg env = Routes' { home = homeHandler @@ -31,21 +32,19 @@ server cfg env = , packages = Packages.server , categories = Categories.server , search = Search.server - , settings = \_ -> hoistServerWithContext (Proxy @Settings.Routes) (Proxy @'[OptionalAuthContext]) id Settings.server + , settings = Settings.server , notFound = serveNotFound } -homeHandler :: FloraPage (Html ()) -homeHandler = do - session <- getSession - templateDefaults <- fromSession session defaultTemplateEnv +homeHandler :: Headers ls (Session (Maybe User)) -> FloraEff (Html ()) +homeHandler (Headers session _) = do + templateDefaults <- templateFromSession session defaultTemplateEnv let templateEnv = templateDefaults & #displayNavbarSearch .~ False render templateEnv Home.show -aboutHandler :: FloraPage (Html ()) -aboutHandler = do - session <- getSession - templateDefaults <- fromSession session defaultTemplateEnv +aboutHandler :: SessionWithCookies (Maybe User) -> FloraEff (Html ()) +aboutHandler (Headers session _) = do + templateDefaults <- templateFromSession session defaultTemplateEnv let (templateEnv :: TemplateEnv) = templateDefaults & #activeElements @@ -53,5 +52,5 @@ aboutHandler = do .~ True render templateEnv Home.about -serveNotFound :: FloraPage (Html ()) -serveNotFound = web404 +serveNotFound :: SessionWithCookies (Maybe User) -> FloraEff (Html ()) +serveNotFound (Headers session _) = web404 session diff --git a/src/web/FloraWeb/Pages/Server/Admin.hs b/src/web/FloraWeb/Pages/Server/Admin.hs index c9f0c258..1a80b20e 100644 --- a/src/web/FloraWeb/Pages/Server/Admin.hs +++ b/src/web/FloraWeb/Pages/Server/Admin.hs @@ -1,3 +1,5 @@ +{-# LANGUAGE PartialTypeSignatures #-} + module FloraWeb.Pages.Server.Admin where import Control.Concurrent (forkIO) @@ -5,74 +7,46 @@ import Control.Concurrent.Async qualified as Async import Control.Monad (void, when) import Control.Monad.IO.Class import Data.Maybe (isJust) -import Data.Proxy (Proxy (..)) import Database.PostgreSQL.Entity.DBT import Effectful.Reader.Static (ask) import Log qualified import Lucid -import Network.HTTP.Types.Status (notFound404) import OddJobs.Endpoints qualified as OddJobs import OddJobs.Types qualified as OddJobs import Optics.Core -import Servant (HasServer (..), hoistServer) +import Servant (HasServer (..), Headers (..)) import Flora.Environment (FeatureEnv (..), FloraEnv (..)) import Flora.Model.Admin.Report -import Flora.Model.Package.Query qualified as Query import Flora.Model.Release.Query qualified as Query import Flora.Model.User -import Flora.Model.User.Query qualified as Query import FloraJobs.Scheduler import FloraWeb.Common.Auth import FloraWeb.Common.Utils (handlerToEff, redirect) import FloraWeb.Pages.Routes.Admin -import FloraWeb.Pages.Templates (ActiveElements (..), TemplateEnv (..), defaultTemplateEnv, fromSession, render) +import FloraWeb.Pages.Templates (ActiveElements (..), TemplateEnv (..), defaultTemplateEnv, render, templateFromSession) import FloraWeb.Pages.Templates.Admin qualified as Templates -import FloraWeb.Pages.Templates.Admin.Packages qualified as Templates -import FloraWeb.Pages.Templates.Admin.Users qualified as Templates -import FloraWeb.Pages.Templates.Error -import FloraWeb.Session (getSession) -import FloraWeb.Types (fetchFloraEnv) +import FloraWeb.Types (FloraEff, fetchFloraEnv) -server :: OddJobs.UIConfig -> OddJobs.Env -> ServerT Routes FloraPage +server :: OddJobs.UIConfig -> OddJobs.Env -> ServerT Routes FloraEff server cfg env = - ensureAdmin $ - Routes' - { index = indexHandler - , users = adminUsersHandler - , packages = adminPackagesHandler - , oddJobs = OddJobs.server cfg env handlerToEff - , fetchMetadata = fetchMetadataHandler - } - --- | This function converts a sub-tree of routes that require 'Admin' role --- to a sub-tree of Flora pages. --- It acts as the safeguard that rejects non-admins from protected routes. -ensureAdmin :: ServerT Routes FloraAdmin -> ServerT Routes FloraPage -ensureAdmin adminServer = hoistServer (Proxy :: Proxy Routes) checkAdmin adminServer - where - checkAdmin :: FloraAdmin a -> FloraPage a - checkAdmin adminRoutes = do - session@Session{mUser} <- getSession - templateEnv <- fromSession session defaultTemplateEnv - case mUser ^? _Just % #userFlags % #isAdmin of - Just False -> renderError templateEnv notFound404 - Nothing -> renderError templateEnv notFound404 - Just True -> demoteSession adminRoutes + Routes' + { index = indexHandler + , oddJobs = \_ -> OddJobs.server cfg env handlerToEff + , fetchMetadata = fetchMetadataHandler + } -indexHandler :: FloraAdmin (Html ()) -indexHandler = do - session <- getSession +indexHandler :: SessionWithCookies User -> FloraEff (Html ()) +indexHandler (Headers session _) = do templateEnv <- - fromSession session defaultTemplateEnv + templateFromSession session defaultTemplateEnv >>= \te -> pure $ set (#activeElements % #adminDashboard) True te FloraEnv{pool} <- liftIO $ fetchFloraEnv session.webEnvStore report <- liftIO $ withPool pool getReport render templateEnv (Templates.index report) -fetchMetadataHandler :: FloraAdmin FetchMetadataResponse -fetchMetadataHandler = do - session <- getSession +fetchMetadataHandler :: SessionWithCookies User -> FloraEff FetchMetadataResponse +fetchMetadataHandler (Headers session _) = do FloraEnv{jobsPool} <- liftIO $ fetchFloraEnv session.webEnvStore liftIO $ void $ schedulePackageDeprecationListJob jobsPool @@ -106,7 +80,7 @@ fetchMetadataHandler = do features <- ask @FeatureEnv Log.logAttention "features" features - when (isJust $ features.blobStoreImpl) $ do + when (isJust features.blobStoreImpl) $ do releasesWithoutTarball <- Query.getHackagePackageReleasesWithoutTarball liftIO $! void $! @@ -128,62 +102,3 @@ fetchMetadataHandler = do void $ scheduleRefreshLatestVersions jobsPool pure $ redirect "/admin" - -adminUsersHandler :: ServerT AdminUsersRoutes FloraAdmin -adminUsersHandler = - AdminUsersRoutes' - { userIndex = userIndexHandler - , withUser = withUserHandler - } - -userIndexHandler :: FloraAdmin (Html ()) -userIndexHandler = do - session <- getSession - users <- Query.getAllUsers - templateEnv <- fromSession session defaultTemplateEnv - render templateEnv (Templates.indexUsers users) - -withUserHandler :: UserId -> ServerT AdminWithUserRoutes FloraAdmin -withUserHandler userId = - AdminWithUserRoutes' - { showUser = showUserHandler userId - } - -showUserHandler :: UserId -> FloraAdmin (Html ()) -showUserHandler userId = do - session <- getSession - result <- Query.getUserById userId - templateEnv <- fromSession session defaultTemplateEnv - case result of - Nothing -> renderError templateEnv notFound404 - Just user -> render templateEnv (Templates.showUser user) - -adminPackagesHandler :: ServerT PackagesAdminRoutes FloraAdmin -adminPackagesHandler = - PackagesAdminRoutes' - { packageIndex = packageIndexHandler - -- , withPackage = withPackageHandler - } - -packageIndexHandler :: FloraAdmin (Html ()) -packageIndexHandler = do - session <- getSession - packages <- Query.getAllPackages - templateEnv <- fromSession session defaultTemplateEnv - render templateEnv (Templates.indexPackages packages) - --- withPackageHandler :: -> ServerT WithPackageAdminRoutes FloraAdmin --- withPackageHandler packageId = WithPackageAdminRoutes' --- { showPackage = showPackageHandler packageId --- } - --- showPackageHandler :: PackageId -> FloraAdmin (Html ()) --- showPackageHandler packageId = do --- session <- getSession --- FloraEnv{pool} <- liftIO $ fetchFloraEnv (session.webEnvStore) --- result <- liftIO $ withPool pool $ Query.getPackageById packageId --- templateEnv <- fromSession session defaultTemplateEnv --- case result of --- Nothing -> renderError templateEnv notFound404 --- Just package -> do --- render templateEnv (Templates.showPackage package) diff --git a/src/web/FloraWeb/Pages/Server/Categories.hs b/src/web/FloraWeb/Pages/Server/Categories.hs index a50f6f18..adb92f92 100644 --- a/src/web/FloraWeb/Pages/Server/Categories.hs +++ b/src/web/FloraWeb/Pages/Server/Categories.hs @@ -1,41 +1,52 @@ module FloraWeb.Pages.Server.Categories where import Data.Text (Text) +import Effectful (Eff, IOE, (:>)) import Lucid (Html) import Network.HTTP.Types (notFound404) -import Servant (ServerT) +import Servant (Headers (..), ServerError, ServerT) +import Effectful.Error.Static (Error) +import Effectful.PostgreSQL.Transact.Effect (DB) +import Effectful.Reader.Static (Reader) +import Flora.Environment (FeatureEnv) import Flora.Model.Category.Query qualified as Query import Flora.Model.Category.Types (Category (..)) import Flora.Model.Package.Query qualified as Query +import Flora.Model.User (User) import FloraWeb.Common.Auth import FloraWeb.Pages.Routes.Categories -import FloraWeb.Pages.Templates (defaultTemplateEnv, fromSession, render) +import FloraWeb.Pages.Templates (defaultTemplateEnv, render, templateFromSession) import FloraWeb.Pages.Templates.Error import FloraWeb.Pages.Templates.Screens.Categories qualified as Template -import FloraWeb.Session (getSession) +import FloraWeb.Types (FloraEff) -server :: ServerT Routes FloraPage -server = +server :: SessionWithCookies (Maybe User) -> ServerT Routes FloraEff +server sessionWithCookies = Routes' - { index = indexHandler - , show = showHandler + { index = indexHandler sessionWithCookies + , show = showHandler sessionWithCookies } -indexHandler :: FloraPage (Html ()) -indexHandler = do - session <- getSession - templateEnv <- fromSession session defaultTemplateEnv +indexHandler + :: (Reader FeatureEnv :> es, IOE :> es, DB :> es) + => SessionWithCookies (Maybe User) + -> Eff es (Html ()) +indexHandler (Headers session _) = do + templateEnv <- templateFromSession session defaultTemplateEnv categories <- Query.getAllCategories render templateEnv $ Template.index categories -showHandler :: Text -> FloraPage (Html ()) -showHandler categorySlug = do - session <- getSession - templateEnv <- fromSession session defaultTemplateEnv +showHandler + :: (Reader FeatureEnv :> es, IOE :> es, DB :> es, Error ServerError :> es) + => SessionWithCookies (Maybe User) + -> Text + -> Eff es (Html ()) +showHandler (Headers session _) categorySlug = do + templateEnv <- templateFromSession session defaultTemplateEnv result <- Query.getCategoryBySlug categorySlug case result of Nothing -> renderError templateEnv notFound404 Just cat -> do - packagesInfo <- Query.getPackagesFromCategoryWithLatestVersion (cat.categoryId) + packagesInfo <- Query.getPackagesFromCategoryWithLatestVersion cat.categoryId render templateEnv $ Template.showCategory cat packagesInfo diff --git a/src/web/FloraWeb/Pages/Server/Packages.hs b/src/web/FloraWeb/Pages/Server/Packages.hs index a292d4fa..492d820e 100644 --- a/src/web/FloraWeb/Pages/Server/Packages.hs +++ b/src/web/FloraWeb/Pages/Server/Packages.hs @@ -16,24 +16,30 @@ import Data.Text.Display (display) import Data.Vector qualified as Vector import Distribution.Orphans () import Distribution.Types.Version (Version) -import Effectful.Error.Static (throwError) -import Effectful.Reader.Static (ask) +import Effectful (Eff, IOE, (:>)) +import Effectful.Error.Static (Error, throwError) +import Effectful.Reader.Static (Reader, ask) import Log (object, (.=)) import Log qualified import Lucid import Lucid.Orphans () -import Servant (ServerT) +import Servant (Headers (..), ServerError, ServerT) import Servant.Server (err404) +import Effectful.Log (Log) +import Effectful.PostgreSQL.Transact.Effect (DB) +import Effectful.Time (Time) import Flora.Environment (FeatureEnv (..)) import Flora.Logging import Flora.Model.BlobIndex.Query qualified as Query +import Flora.Model.BlobStore.API (BlobStoreAPI) import Flora.Model.Package import Flora.Model.Package.Query qualified as Query import Flora.Model.PackageIndex.Query qualified as Query import Flora.Model.PackageIndex.Types (PackageIndex (..)) import Flora.Model.Release.Query qualified as Query import Flora.Model.Release.Types +import Flora.Model.User (User) import Flora.Search qualified as Search import FloraWeb.Common.Auth import FloraWeb.Common.Guards @@ -44,10 +50,10 @@ import FloraWeb.Pages.Templates.Error import FloraWeb.Pages.Templates.Packages qualified as Package import FloraWeb.Pages.Templates.Screens.Packages qualified as Packages import FloraWeb.Pages.Templates.Screens.Search qualified as Search -import FloraWeb.Session +import FloraWeb.Types (FloraEff) import Network.HTTP.Types (notFound404) -server :: ServerT Routes FloraPage +server :: ServerT Routes FloraEff server = Routes' { index = listPackagesHandler @@ -64,19 +70,26 @@ server = , getTarball = getTarballHandler } -listPackagesHandler :: Maybe (Positive Word) -> FloraPage (Html ()) -listPackagesHandler pageParam = do +listPackagesHandler + :: (DB :> es, Reader FeatureEnv :> es, IOE :> es) + => SessionWithCookies (Maybe User) + -> Maybe (Positive Word) + -> Eff es (Html ()) +listPackagesHandler (Headers session _) pageParam = do let pageNumber = pageParam ?: PositiveUnsafe 1 - session <- getSession - templateDefaults <- fromSession session defaultTemplateEnv + templateDefaults <- templateFromSession session defaultTemplateEnv (count', results) <- Search.listAllPackages (fromPage pageNumber) render templateDefaults $ Search.showAllPackages count' pageNumber results -showNamespaceHandler :: Namespace -> Maybe (Positive Word) -> FloraPage (Html ()) -showNamespaceHandler namespace pageParam = do +showNamespaceHandler + :: (DB :> es, Reader FeatureEnv :> es, Time :> es, Error ServerError :> es, Log :> es, IOE :> es) + => SessionWithCookies (Maybe User) + -> Namespace + -> Maybe (Positive Word) + -> Eff es (Html ()) +showNamespaceHandler (Headers session _) namespace pageParam = do let pageNumber = pageParam ?: PositiveUnsafe 1 - session <- getSession - templateDefaults <- fromSession session defaultTemplateEnv + templateDefaults <- templateFromSession session defaultTemplateEnv (count', results) <- Search.listAllPackagesInNamespace (fromPage pageNumber) namespace if extractNamespaceText namespace == "haskell" then do @@ -106,26 +119,42 @@ showNamespaceHandler namespace pageParam = do render templateEnv $ Search.showAllPackagesInNamespace namespace packageIndex.description count' pageNumber results -showPackageHandler :: Namespace -> PackageName -> FloraPage (Html ()) -showPackageHandler namespace packageName = showPackageVersion namespace packageName Nothing +showPackageHandler + :: (DB :> es, Reader FeatureEnv :> es, Time :> es, Error ServerError :> es, Log :> es, IOE :> es) + => SessionWithCookies (Maybe User) + -> Namespace + -> PackageName + -> Eff es (Html ()) +showPackageHandler sessionWithCookies namespace packageName = showPackageVersion sessionWithCookies namespace packageName Nothing -showVersionHandler :: Namespace -> PackageName -> Version -> FloraPage (Html ()) -showVersionHandler namespace packageName version = - showPackageVersion namespace packageName (Just version) +showVersionHandler + :: (DB :> es, Reader FeatureEnv :> es, Time :> es, Error ServerError :> es, Log :> es, IOE :> es) + => SessionWithCookies (Maybe User) + -> Namespace + -> PackageName + -> Version + -> Eff es (Html ()) +showVersionHandler sessionWithCookies namespace packageName version = + showPackageVersion sessionWithCookies namespace packageName (Just version) -showPackageVersion :: Namespace -> PackageName -> Maybe Version -> FloraPage (Html ()) -showPackageVersion namespace packageName mversion = do - session <- getSession - templateEnv' <- fromSession session defaultTemplateEnv - package <- guardThatPackageExists namespace packageName (\_ _ -> web404) - packageIndex <- guardThatPackageIndexExists namespace $ const web404 +showPackageVersion + :: (DB :> es, Reader FeatureEnv :> es, Time :> es, Error ServerError :> es, Log :> es, IOE :> es) + => SessionWithCookies (Maybe User) + -> Namespace + -> PackageName + -> Maybe Version + -> Eff es (Html ()) +showPackageVersion (Headers session _) namespace packageName mversion = do + templateEnv' <- templateFromSession session defaultTemplateEnv + package <- guardThatPackageExists namespace packageName (\_ _ -> web404 session) + packageIndex <- guardThatPackageIndexExists namespace $ const (web404 session) releases <- Query.getReleases package.packageId let latestRelease = releases & Vector.filter (\r -> r.deprecated /= Just True) & maximumBy (compare `on` (.version)) version = fromMaybe latestRelease.version mversion - release <- guardThatReleaseExists package.packageId version $ const web404 + release <- guardThatReleaseExists package.packageId version $ const (web404 session) numberOfReleases <- Query.getNumberOfReleases package.packageId dependents <- Query.getPackageDependents namespace packageName releaseDependencies <- Query.getRequirements package.name release.releaseId @@ -175,33 +204,36 @@ showPackageVersion namespace packageName mversion = do categories showDependentsHandler - :: Namespace + :: (DB :> es, Reader FeatureEnv :> es, Time :> es, Error ServerError :> es, Log :> es, IOE :> es) + => SessionWithCookies (Maybe User) + -> Namespace -> PackageName -> Maybe (Positive Word) -> Maybe Text - -> FloraPage (Html ()) -showDependentsHandler namespace packageName mPage mSearch = do - package <- guardThatPackageExists namespace packageName (\_ _ -> web404) + -> Eff es (Html ()) +showDependentsHandler s@(Headers session _) namespace packageName mPage mSearch = do + package <- guardThatPackageExists namespace packageName (\_ _ -> web404 session) releases <- Query.getAllReleases package.packageId let latestRelease = maximumBy (compare `on` (.version)) releases - showVersionDependentsHandler namespace packageName latestRelease.version mPage mSearch + showVersionDependentsHandler s namespace packageName latestRelease.version mPage mSearch showVersionDependentsHandler - :: Namespace + :: (DB :> es, Reader FeatureEnv :> es, Log :> es, Time :> es, Error ServerError :> es, IOE :> es) + => SessionWithCookies (Maybe User) + -> Namespace -> PackageName -> Version -> Maybe (Positive Word) -> Maybe Text - -> FloraPage (Html ()) -showVersionDependentsHandler namespace packageName version Nothing mSearch = - showVersionDependentsHandler namespace packageName version (Just $ PositiveUnsafe 1) mSearch -showVersionDependentsHandler namespace packageName version pageNumber (Just "") = - showVersionDependentsHandler namespace packageName version pageNumber Nothing -showVersionDependentsHandler namespace packageName version (Just pageNumber) mSearch = do - session <- getSession - templateEnv' <- fromSession session defaultTemplateEnv - package <- guardThatPackageExists namespace packageName (\_ _ -> web404) - release <- guardThatReleaseExists package.packageId version (const web404) + -> Eff es (Html ()) +showVersionDependentsHandler s namespace packageName version Nothing mSearch = + showVersionDependentsHandler s namespace packageName version (Just $ PositiveUnsafe 1) mSearch +showVersionDependentsHandler s namespace packageName version pageNumber (Just "") = + showVersionDependentsHandler s namespace packageName version pageNumber Nothing +showVersionDependentsHandler (Headers session _) namespace packageName version (Just pageNumber) mSearch = do + templateEnv' <- templateFromSession session defaultTemplateEnv + package <- guardThatPackageExists namespace packageName (\_ _ -> web404 session) + release <- guardThatReleaseExists package.packageId version (const (web404 session)) let templateEnv = templateEnv' { title = display namespace <> "/" <> display packageName @@ -225,19 +257,18 @@ showVersionDependentsHandler namespace packageName version (Just pageNumber) mSe results pageNumber -showDependenciesHandler :: Namespace -> PackageName -> FloraPage (Html ()) -showDependenciesHandler namespace packageName = do - package <- guardThatPackageExists namespace packageName (\_ _ -> web404) +showDependenciesHandler :: (DB :> es, Reader FeatureEnv :> es, Time :> es, Log :> es, Error ServerError :> es, IOE :> es) => SessionWithCookies (Maybe User) -> Namespace -> PackageName -> Eff es (Html ()) +showDependenciesHandler s@(Headers session _) namespace packageName = do + package <- guardThatPackageExists namespace packageName (\_ _ -> web404 session) releases <- Query.getAllReleases package.packageId let latestRelease = maximumBy (compare `on` (.version)) releases - showVersionDependenciesHandler namespace packageName latestRelease.version + showVersionDependenciesHandler s namespace packageName latestRelease.version -showVersionDependenciesHandler :: Namespace -> PackageName -> Version -> FloraPage (Html ()) -showVersionDependenciesHandler namespace packageName version = do - session <- getSession - templateEnv' <- fromSession session defaultTemplateEnv - package <- guardThatPackageExists namespace packageName (\_ _ -> web404) - release <- guardThatReleaseExists package.packageId version $ const web404 +showVersionDependenciesHandler :: (DB :> es, Reader FeatureEnv :> es, IOE :> es, Log :> es, Time :> es, Error ServerError :> es) => SessionWithCookies (Maybe User) -> Namespace -> PackageName -> Version -> Eff es (Html ()) +showVersionDependenciesHandler (Headers session _) namespace packageName version = do + templateEnv' <- templateFromSession session defaultTemplateEnv + package <- guardThatPackageExists namespace packageName (\_ _ -> web404 session) + release <- guardThatReleaseExists package.packageId version $ const (web404 session) let templateEnv = templateEnv' { title = display namespace <> "/" <> display packageName @@ -259,20 +290,30 @@ showVersionDependenciesHandler namespace packageName version = do render templateEnv $ Package.showDependencies namespace packageName release releaseDependencies -showChangelogHandler :: Namespace -> PackageName -> FloraPage (Html ()) -showChangelogHandler namespace packageName = do - package <- guardThatPackageExists namespace packageName (\_ _ -> web404) +showChangelogHandler + :: (DB :> es, Reader FeatureEnv :> es, Time :> es, Log :> es, Error ServerError :> es, IOE :> es) + => SessionWithCookies (Maybe User) + -> Namespace + -> PackageName + -> Eff es (Html ()) +showChangelogHandler s@(Headers session _) namespace packageName = do + package <- guardThatPackageExists namespace packageName (\_ _ -> web404 session) releases <- Query.getAllReleases package.packageId let latestRelease = maximumBy (compare `on` (.version)) releases - showVersionChangelogHandler namespace packageName latestRelease.version + showVersionChangelogHandler s namespace packageName latestRelease.version -showVersionChangelogHandler :: Namespace -> PackageName -> Version -> FloraPage (Html ()) -showVersionChangelogHandler namespace packageName version = do +showVersionChangelogHandler + :: (DB :> es, Reader FeatureEnv :> es, Log :> es, Time :> es, IOE :> es, Error ServerError :> es) + => SessionWithCookies (Maybe User) + -> Namespace + -> PackageName + -> Version + -> Eff es (Html ()) +showVersionChangelogHandler (Headers session _) namespace packageName version = do Log.logInfo_ $ display namespace - session <- getSession - templateEnv' <- fromSession session defaultTemplateEnv - package <- guardThatPackageExists namespace packageName (\_ _ -> web404) - release <- guardThatReleaseExists package.packageId version $ const web404 + templateEnv' <- templateFromSession session defaultTemplateEnv + package <- guardThatPackageExists namespace packageName (\_ _ -> web404 session) + release <- guardThatReleaseExists package.packageId version $ const (web404 session) let templateEnv = templateEnv' { title = display namespace <> "/" <> display packageName @@ -281,11 +322,15 @@ showVersionChangelogHandler namespace packageName version = do render templateEnv $ Package.showChangelog namespace packageName version release.changelog -listVersionsHandler :: Namespace -> PackageName -> FloraPage (Html ()) -listVersionsHandler namespace packageName = do - session <- getSession - templateEnv' <- fromSession session defaultTemplateEnv - package <- guardThatPackageExists namespace packageName (\_ _ -> web404) +listVersionsHandler + :: (DB :> es, Reader FeatureEnv :> es, IOE :> es, Log :> es, Time :> es, Error ServerError :> es) + => SessionWithCookies (Maybe User) + -> Namespace + -> PackageName + -> Eff es (Html ()) +listVersionsHandler (Headers session _) namespace packageName = do + templateEnv' <- templateFromSession session defaultTemplateEnv + package <- guardThatPackageExists namespace packageName (\_ _ -> web404 session) let templateEnv = templateEnv' { title = display namespace <> "/" <> display packageName @@ -297,12 +342,19 @@ listVersionsHandler namespace packageName = do constructTarballPath :: PackageName -> Version -> Text constructTarballPath pname v = display pname <> "-" <> display v <> ".tar.gz" -getTarballHandler :: Namespace -> PackageName -> Version -> Text -> FloraPage ByteString -getTarballHandler namespace packageName version tarballName = do +getTarballHandler + :: (DB :> es, Reader FeatureEnv :> es, Log :> es, Time :> es, IOE :> es, Error ServerError :> es, BlobStoreAPI :> es) + => SessionWithCookies (Maybe User) + -> Namespace + -> PackageName + -> Version + -> Text + -> Eff es ByteString +getTarballHandler (Headers session _) namespace packageName version tarballName = do features <- ask @FeatureEnv unless (isJust features.blobStoreImpl) $ throwError err404 - package <- guardThatPackageExists namespace packageName $ \_ _ -> web404 - release <- guardThatReleaseExists package.packageId version $ const web404 + package <- guardThatPackageExists namespace packageName $ \_ _ -> web404 session + release <- guardThatReleaseExists package.packageId version $ const (web404 session) case release.tarballRootHash of Just rootHash | constructTarballPath packageName version == tarballName -> diff --git a/src/web/FloraWeb/Pages/Server/Search.hs b/src/web/FloraWeb/Pages/Server/Search.hs index 91cc1a76..24e7bbb5 100644 --- a/src/web/FloraWeb/Pages/Server/Search.hs +++ b/src/web/FloraWeb/Pages/Server/Search.hs @@ -4,28 +4,29 @@ import Data.Positive import Data.Text (Text) import Data.Vector qualified as Vector import Lucid (Html) -import Servant (ServerT) +import Servant (Headers (..), ServerT) import Flora.Model.Package.Types +import Flora.Model.User (User) import Flora.Search qualified as Search import FloraWeb.Common.Pagination import FloraWeb.Pages.Routes.Search (Routes, Routes' (..)) import FloraWeb.Pages.Templates import FloraWeb.Pages.Templates.Screens.Search qualified as Search import FloraWeb.Session +import FloraWeb.Types (FloraEff) -server :: ServerT Routes FloraPage -server = +server :: SessionWithCookies (Maybe User) -> ServerT Routes FloraEff +server s = Routes' - { displaySearch = searchHandler + { displaySearch = searchHandler s } -searchHandler :: Maybe Text -> Maybe (Positive Word) -> FloraPage (Html ()) -searchHandler Nothing pageParam = searchHandler (Just "") pageParam -searchHandler (Just searchString) pageParam = do +searchHandler :: SessionWithCookies (Maybe User) -> Maybe Text -> Maybe (Positive Word) -> FloraEff (Html ()) +searchHandler s Nothing pageParam = searchHandler s (Just "") pageParam +searchHandler (Headers session _) (Just searchString) pageParam = do let pageNumber = pageParam ?: PositiveUnsafe 1 - session <- getSession - templateDefaults <- fromSession session defaultTemplateEnv + templateDefaults <- templateFromSession session defaultTemplateEnv let templateEnv = templateDefaults { navbarSearchContent = Just searchString diff --git a/src/web/FloraWeb/Pages/Server/Sessions.hs b/src/web/FloraWeb/Pages/Server/Sessions.hs index 5fd518cc..df4b8839 100644 --- a/src/web/FloraWeb/Pages/Server/Sessions.hs +++ b/src/web/FloraWeb/Pages/Server/Sessions.hs @@ -22,36 +22,35 @@ import FloraWeb.Pages.Routes.Sessions import FloraWeb.Pages.Templates import FloraWeb.Pages.Templates.Screens.Sessions as Sessions import FloraWeb.Session +import FloraWeb.Types (FloraEff) -server :: ServerT Routes FloraPage -server = +server :: SessionWithCookies (Maybe User) -> ServerT Routes FloraEff +server s = Routes' - { new = newSessionHandler - , create = createSessionHandler + { new = newSessionHandler s + , create = createSessionHandler s , delete = deleteSessionHandler } -newSessionHandler :: FloraPage (Union NewSessionResponses) -newSessionHandler = do - session <- getSession - let mUser = session.mUser +newSessionHandler :: SessionWithCookies (Maybe User) -> FloraEff (Union NewSessionResponses) +newSessionHandler (Headers session _) = do + let mUser = session.user case mUser of Nothing -> do Log.logInfo_ "[+] No user logged-in" - templateDefaults <- fromSession session defaultTemplateEnv + templateDefaults <- templateFromSession session defaultTemplateEnv respond $ WithStatus @200 $ renderUVerb templateDefaults Sessions.newSession Just u -> do Log.logInfo_ $ "[+] User is already logged: " <> display u respond $ WithStatus @301 (redirect "/") -createSessionHandler :: LoginForm -> FloraPage (Union CreateSessionResponses) -createSessionHandler LoginForm{email, password, totp} = do - session <- getSession +createSessionHandler :: SessionWithCookies (Maybe User) -> LoginForm -> FloraEff (Union CreateSessionResponses) +createSessionHandler (Headers session _) LoginForm{email, password, totp} = do mUser <- Query.getUserByEmail email case mUser of Nothing -> do Log.logInfo_ "[+] Couldn't find user" - templateDefaults <- fromSession session defaultTemplateEnv + templateDefaults <- templateFromSession session defaultTemplateEnv let templateEnv = templateDefaults & (#flashError ?~ mkError "Could not authenticate") @@ -62,33 +61,33 @@ createSessionHandler LoginForm{email, password, totp} = do if Sel.verifyText user.password password then do if user.totpEnabled - then guardThatUserHasProvidedTOTP totp $ \userCode -> do - checkTOTPIsValid userCode user + then guardThatUserHasProvidedTOTP session totp $ \userCode -> do + checkTOTPIsValid session userCode user else do sessionId <- persistSession session.sessionId user.userId let sessionCookie = craftSessionCookie sessionId True respond $ WithStatus @301 $ redirectWithCookie "/" sessionCookie else do Log.logInfo_ "Invalid password" - templateDefaults <- fromSession session defaultTemplateEnv + templateDefaults <- templateFromSession session defaultTemplateEnv let templateEnv = templateDefaults & (#flashError ?~ mkError "Could not authenticate") respond $ WithStatus @401 $ renderUVerb templateEnv Sessions.newSession else do Log.logInfo_ "User not allowed to log-in" - templateDefaults <- fromSession session defaultTemplateEnv + templateDefaults <- templateFromSession session defaultTemplateEnv let templateEnv = templateDefaults & (#flashError ?~ mkError "Could not authenticate") respond $ WithStatus @401 $ renderUVerb templateEnv Sessions.newSession checkTOTPIsValid - :: Text + :: Session (Maybe User) + -> Text -> User - -> FloraPage (Union CreateSessionResponses) -checkTOTPIsValid userCode user = do - session <- getSession + -> FloraEff (Union CreateSessionResponses) +checkTOTPIsValid session userCode user = do validated <- liftIO $ TwoFactor.validateTOTP (fromJust user.totpKey) userCode if validated then do @@ -98,13 +97,13 @@ checkTOTPIsValid userCode user = do respond $ WithStatus @301 $ redirectWithCookie "/" sessionCookie else do Log.logInfo_ "[+] Couldn't authenticate user's TOTP code" - templateDefaults <- fromSession session defaultTemplateEnv + templateDefaults <- templateFromSession session defaultTemplateEnv let templateEnv = templateDefaults & (#flashError ?~ mkError "Could not authenticate") respond $ WithStatus @401 $ renderUVerb templateEnv Sessions.newSession -deleteSessionHandler :: PersistentSessionId -> FloraPage DeleteSessionResponse +deleteSessionHandler :: PersistentSessionId -> FloraEff DeleteSessionResponse deleteSessionHandler sessionId = do Log.logInfo_ $ "[+] Logging-off session " <> display sessionId deleteSession sessionId diff --git a/src/web/FloraWeb/Pages/Server/Settings.hs b/src/web/FloraWeb/Pages/Server/Settings.hs index 3b78de23..7f1ebcc3 100644 --- a/src/web/FloraWeb/Pages/Server/Settings.hs +++ b/src/web/FloraWeb/Pages/Server/Settings.hs @@ -5,14 +5,18 @@ module FloraWeb.Pages.Server.Settings import Control.Monad.IO.Class import Data.ByteString.Base32 qualified as Base32 -import Data.Maybe (fromJust) import Data.Text.Encoding qualified as Text +import Effectful (Eff, IOE, (:>)) +import Effectful.Reader.Static (Reader) import Log qualified import Lucid import Optics.Core import Sel.HMAC.SHA256 qualified as HMAC -import Servant +import Servant (HasServer (..), Headers (..), Union, WithStatus (..), respond) +import Effectful.Log (Log) +import Effectful.PostgreSQL.Transact.Effect (DB) +import Effectful.Time (Time) import Flora.Environment import Flora.Model.User import Flora.Model.User.Update qualified as Update @@ -24,8 +28,9 @@ import FloraWeb.Pages.Templates (render, renderUVerb) import FloraWeb.Pages.Templates.Screens.Settings qualified as Settings import FloraWeb.Pages.Templates.Types import FloraWeb.Session +import FloraWeb.Types (FloraEff) -server :: ServerT Routes FloraPage +server :: ServerT Routes FloraEff server = Routes' { index = userSettingsHandler @@ -35,22 +40,20 @@ server = , deleteTwoFactorSetup = deleteTwoFactorSetupHandler } -userSettingsHandler :: FloraPage (Html ()) -userSettingsHandler = do - session <- getSession - templateEnv' <- fromSession session defaultTemplateEnv +userSettingsHandler :: (Reader FeatureEnv :> es, IOE :> es) => SessionWithCookies User -> Eff es (Html ()) +userSettingsHandler (Headers session _) = do + let user = session.user + templateEnv' <- templateFromSession session defaultTemplateEnv let templateEnv = templateEnv' & #title .~ "Account settings" - let user = fromJust session.mUser render templateEnv $ - Settings.dashboard user + Settings.dashboard session.sessionId user -userSecuritySettingsHandler :: FloraPage (Html ()) -userSecuritySettingsHandler = do - session <- getSession - templateEnv' <- fromSession session defaultTemplateEnv +userSecuritySettingsHandler :: (Reader FeatureEnv :> es, IOE :> es) => SessionWithCookies User -> Eff es (Html ()) +userSecuritySettingsHandler (Headers session _) = do + templateEnv' <- templateFromSession session defaultTemplateEnv let templateEnv = templateEnv' & #title @@ -59,16 +62,22 @@ userSecuritySettingsHandler = do templateEnv Settings.securitySettings -getTwoFactorSettingsHandler :: FloraPage (Html ()) -getTwoFactorSettingsHandler = do - FloraEnv{domain} <- getEnv - session <- getSession - templateEnv' <- fromSession session defaultTemplateEnv +getTwoFactorSettingsHandler + :: ( Reader FeatureEnv :> es + , IOE :> es + , DB :> es + , Time :> es + ) + => SessionWithCookies User + -> Eff es (Html ()) +getTwoFactorSettingsHandler (Headers session _) = do + let user = session.user + FloraEnv{domain} <- getEnv session + templateEnv' <- templateFromSession session defaultTemplateEnv let templateEnv = templateEnv' & #title .~ "Security settings" - let user = fromJust session.mUser case user.totpKey of Nothing -> do userKey <- liftIO HMAC.newAuthenticationKey @@ -94,11 +103,19 @@ getTwoFactorSettingsHandler = do qrCode (Base32.encodeBase32Unpadded $ HMAC.unsafeAuthenticationKeyToBinary userKey) -postTwoFactorSetupHandler :: TwoFactorConfirmationForm -> FloraPage (Union TwoFactorSetupResponses) -postTwoFactorSetupHandler TwoFactorConfirmationForm{code = userCode} = do - session <- getSession - templateEnv' <- fromSession session defaultTemplateEnv - let user = fromJust session.mUser +postTwoFactorSetupHandler + :: ( Reader FeatureEnv :> es + , IOE :> es + , DB :> es + , Time :> es + , Log :> es + ) + => SessionWithCookies User + -> TwoFactorConfirmationForm + -> Eff es (Union TwoFactorSetupResponses) +postTwoFactorSetupHandler (Headers session _) TwoFactorConfirmationForm{code = userCode} = do + let user = session.user + templateEnv' <- templateFromSession session defaultTemplateEnv case user.totpKey of Nothing -> respond $ WithStatus @301 (redirect "/settings/security/two-factor") Just userKey -> do @@ -127,9 +144,8 @@ postTwoFactorSetupHandler TwoFactorConfirmationForm{code = userCode} = do qrCode (Base32.encodeBase32Unpadded $ HMAC.unsafeAuthenticationKeyToBinary userKey) -deleteTwoFactorSetupHandler :: FloraPage DeleteTwoFactorSetupResponse -deleteTwoFactorSetupHandler = do - session <- getSession - let user = fromJust session.mUser +deleteTwoFactorSetupHandler :: (DB :> es, Time :> es) => SessionWithCookies User -> Eff es DeleteTwoFactorSetupResponse +deleteTwoFactorSetupHandler (Headers session _) = do + let user = session.user Update.unSetTOTP user.userId pure $ redirect "/settings/security" diff --git a/src/web/FloraWeb/Pages/Templates/Error.hs b/src/web/FloraWeb/Pages/Templates/Error.hs index 8a4d9154..050ee9d8 100644 --- a/src/web/FloraWeb/Pages/Templates/Error.hs +++ b/src/web/FloraWeb/Pages/Templates/Error.hs @@ -14,10 +14,10 @@ import Effectful import Effectful.Error.Static (Error, throwError) import Effectful.Reader.Static (Reader) import Flora.Environment (FeatureEnv) +import Flora.Model.User (User) import FloraWeb.Pages.Templates import FloraWeb.Session -import Servant (Header, Headers, ServerError (..)) -import Web.Cookie (SetCookie) +import Servant (ServerError (..)) renderError :: forall (es :: [Effect]) (a :: Type) @@ -39,13 +39,12 @@ renderError env status = do web404 :: ( Error ServerError :> es , IOE :> es - , Reader (Headers '[Header "Set-Cookie" SetCookie] Session) :> es , Reader FeatureEnv :> es ) - => Eff es a -web404 = do - session <- getSession - templateEnv <- fromSession session defaultTemplateEnv + => Session (Maybe User) + -> Eff es a +web404 session = do + templateEnv <- templateFromSession session defaultTemplateEnv renderError templateEnv notFound404 showError :: Status -> FloraHTML diff --git a/src/web/FloraWeb/Pages/Templates/Packages.hs b/src/web/FloraWeb/Pages/Templates/Packages.hs index 303eed57..98b641a4 100644 --- a/src/web/FloraWeb/Pages/Templates/Packages.hs +++ b/src/web/FloraWeb/Pages/Templates/Packages.hs @@ -19,6 +19,7 @@ import Data.Vector.Algorithms.Intro qualified as MVector import Distribution.Orphans () import Distribution.Pretty (pretty) import Distribution.SPDX.License qualified as SPDX +import Distribution.Types.BuildType (BuildType (..)) import Distribution.Types.Flag (PackageFlag (..)) import Distribution.Types.Flag qualified as Flag import Distribution.Types.Version (Version, mkVersion, versionNumbers) @@ -37,6 +38,7 @@ import Flora.Search (SearchAction (..)) import FloraWeb.Components.Icons import FloraWeb.Components.PackageListItem (licenseIcon, packageListItem, requirementListItem) import FloraWeb.Components.PaginationNav (paginationNav) +import FloraWeb.Components.Pill (customBuildType) import FloraWeb.Components.Utils import FloraWeb.Links qualified as Links import FloraWeb.Pages.Templates (FloraHTML, TemplateEnv (..)) @@ -322,7 +324,9 @@ showAll target mVersion namespace packageName = do displayInstructions :: Namespace -> PackageName -> Release -> FloraHTML displayInstructions namespace packageName latestRelease = li_ [class_ ""] $ do - h3_ [class_ "package-body-section"] "Installation" + h3_ [class_ "package-body-section", id_ "package-install-section"] $ do + p_ [] "Installation" + when (latestRelease.buildType == Custom) customBuildType div_ [class_ "items-top"] $ div_ [class_ ""] $ do label_ [for_ "install-string", class_ "font-light"] "In your cabal file:" input_ @@ -469,10 +473,6 @@ defaultMarker :: Bool -> FloraHTML defaultMarker True = em_ "(on by default)" defaultMarker False = em_ "(off by default)" --- | @datalist@ element -dataText_ :: Text -> Attribute -dataText_ = makeAttribute "data-text" - intercalateVec :: a -> Vector a -> Vector a intercalateVec sep vector = if Vector.null vector @@ -489,6 +489,6 @@ formatInstallString packageName Release{version} = rangedVersion = "^>=" <> majMin majMin :: Doc majMin = - if (List.head $ versionNumbers version) == 0 + if List.head (versionNumbers version) == 0 then pretty $ mkVersion $ List.take 3 $ versionNumbers version else pretty $ mkVersion $ List.take 2 $ versionNumbers version diff --git a/src/web/FloraWeb/Pages/Templates/Screens/Settings.hs b/src/web/FloraWeb/Pages/Templates/Screens/Settings.hs index 6a935cf8..78f746ce 100644 --- a/src/web/FloraWeb/Pages/Templates/Screens/Settings.hs +++ b/src/web/FloraWeb/Pages/Templates/Screens/Settings.hs @@ -1,27 +1,35 @@ module FloraWeb.Pages.Templates.Screens.Settings where +import Data.Text (Text) +import Data.Text.Display (display) import Lucid -import Data.Text (Text) +import Flora.Model.PersistentSession (PersistentSessionId (..)) import Flora.Model.User import FloraWeb.Components.Button (button) import FloraWeb.Pages.Templates --- import FloraWeb.Components.Button - -dashboard :: User -> FloraHTML -dashboard user = main_ $ +dashboard :: PersistentSessionId -> User -> FloraHTML +dashboard sessionId _user = main_ $ div_ [class_ "container"] $ do div_ [class_ "divider"] $ do div_ [class_ "page-title"] $ do h1_ "Account settings" + header_ [id_ "subheader"] $ do + logOff sessionId section_ [class_ "settings_menu"] $ do ul_ [] $ do li_ $ a_ [href_ "/settings/profile"] "Profile" li_ $ a_ [href_ "/settings/security"] "Security" +logOff :: PersistentSessionId -> FloraHTML +logOff sessionId = + form_ [action_ ("/sessions/delete/" <> display sessionId), method_ "post", id_ "logoff"] $ do + let btnClasses = "font-bold inline-flex items-center py-3 mx-4 text-white dark:text-gray-100 " + button_ [type_ "submit", class_ btnClasses] "Sign out" + profileSettings :: User -> FloraHTML -profileSettings user = do +profileSettings _user = do div_ [class_ "container"] $ do div_ [class_ "divider"] $ do div_ [class_ "page-title"] $ do diff --git a/src/web/FloraWeb/Pages/Templates/Types.hs b/src/web/FloraWeb/Pages/Templates/Types.hs index b1987aa7..e71d91d2 100644 --- a/src/web/FloraWeb/Pages/Templates/Types.hs +++ b/src/web/FloraWeb/Pages/Templates/Types.hs @@ -6,9 +6,9 @@ module FloraWeb.Pages.Templates.Types , mkError , TemplateEnv (..) , defaultsToEnv - , fromSession , ActiveElements (..) , defaultTemplateEnv + , FromSession (..) ) where @@ -119,21 +119,35 @@ defaultsToEnv assets TemplateDefaults{..} = let sessionId = PersistentSessionId UUID.nil in TemplateEnv{..} -fromSession - :: (Reader FeatureEnv :> es, IOE :> es) - => Session - -> TemplateDefaults - -> Eff es TemplateEnv -fromSession session defaults = do - let sessionId = session.sessionId - let muser = session.mUser - let webEnvStore = session.webEnvStore - floraEnv <- liftIO $ fetchFloraEnv webEnvStore - featuresEnv <- ask @FeatureEnv - let assets = floraEnv.assets - let TemplateDefaults{..} = - defaults - & (#mUser .~ muser) - & (#environment .~ floraEnv.environment) - & (#features .~ featuresEnv) - pure TemplateEnv{..} +class FromSession a where + templateFromSession :: (Reader FeatureEnv :> es, IOE :> es) => a -> TemplateDefaults -> Eff es TemplateEnv + +instance FromSession (Session User) where + templateFromSession session defaults = do + let sessionId = session.sessionId + let muser = Just session.user + let webEnvStore = session.webEnvStore + floraEnv <- liftIO $ fetchFloraEnv webEnvStore + featuresEnv <- ask @FeatureEnv + let assets = floraEnv.assets + let TemplateDefaults{..} = + defaults + & (#mUser .~ muser) + & (#environment .~ floraEnv.environment) + & (#features .~ featuresEnv) + pure TemplateEnv{..} + +instance FromSession (Session (Maybe User)) where + templateFromSession session defaults = do + let sessionId = session.sessionId + let muser = session.user + let webEnvStore = session.webEnvStore + floraEnv <- liftIO $ fetchFloraEnv webEnvStore + featuresEnv <- ask @FeatureEnv + let assets = floraEnv.assets + let TemplateDefaults{..} = + defaults + & (#mUser .~ muser) + & (#environment .~ floraEnv.environment) + & (#features .~ featuresEnv) + pure TemplateEnv{..} diff --git a/src/web/FloraWeb/Server.hs b/src/web/FloraWeb/Server.hs index cfe99f02..807ff1d5 100644 --- a/src/web/FloraWeb/Server.hs +++ b/src/web/FloraWeb/Server.hs @@ -4,20 +4,17 @@ import Colourista.IO (blueMessage) import Control.Exception (bracket) import Control.Exception.Safe qualified as Safe import Control.Monad (void, when) -import Data.Aeson qualified as Aeson import Data.Maybe (isJust) import Data.OpenApi (OpenApi) -import Data.Pool (Pool) import Data.Pool qualified as Pool import Data.Text.Display (display) -import Database.PostgreSQL.Simple (Connection) import Effectful import Effectful.Concurrent import Effectful.Dispatch.Static -import Effectful.Error.Static (runErrorNoCallStack) +import Effectful.Error.Static (runErrorNoCallStack, runErrorWith) import Effectful.Fail (runFailIO) import Effectful.PostgreSQL.Transact.Effect (runDB) -import Effectful.Reader.Static (runReader, withReader) +import Effectful.Reader.Static (runReader) import Effectful.Time (runTime) import Log (Logger) import Log qualified @@ -36,29 +33,25 @@ import OddJobs.Endpoints qualified as OddJobs import OddJobs.Job (startJobRunner) import OddJobs.Types qualified as OddJobs import Optics.Core -import Prometheus qualified -import Prometheus.Metric.GHC (ghcMetrics) -import Prometheus.Metric.Proc (procMetrics) import Sel import Servant ( Application , Context (..) , ErrorFormatters , Handler - , HasServer (hoistServerWithContext) , NotFoundErrorFormatter , Proxy (Proxy) , defaultErrorFormatters , err404 - , hoistServer , notFoundErrorFormatter , serveDirectoryWebApp , serveDirectoryWith + , serveWithContextT ) -import Servant.API (getResponse) import Servant.OpenApi -import Servant.Server.Generic (AsServerT, genericServeTWithContext) +import Servant.Server.Generic (AsServerT) +import Control.Monad.Except qualified as Except import Flora.Environment (BlobStoreImpl (..), DeploymentEnv, FeatureEnv (..), FloraEnv (..), LoggingEnv (..), getFloraEnv) import Flora.Environment.Config (Assets) import Flora.Logging (runLog) @@ -68,19 +61,23 @@ import FloraJobs.Runner (runner) import FloraJobs.Types (JobsRunnerEnv (..), makeConfig, makeUIConfig) import FloraWeb.API.Routes qualified as API import FloraWeb.API.Server qualified as API -import FloraWeb.Common.Auth (OptionalAuthContext, StrictAuthContext, optionalAuthHandler, requestID, runVisitorSession, strictAuthHandler) -import FloraWeb.Common.Metrics +import FloraWeb.Common.Auth (OptionalAuthContext, StrictAuthContext, adminAuthHandler, optionalAuthHandler, strictAuthHandler) import FloraWeb.Common.OpenSearch import FloraWeb.Common.Tracing -import FloraWeb.Common.Utils import FloraWeb.Embedded -import FloraWeb.Pages.Routes qualified as Pages import FloraWeb.Pages.Server qualified as Pages import FloraWeb.Pages.Templates (defaultTemplateEnv, defaultsToEnv) import FloraWeb.Pages.Templates.Error (renderError) import FloraWeb.Routes import FloraWeb.Types +type FloraAuthContext = + '[ OptionalAuthContext + , StrictAuthContext + , StrictAuthContext + , ErrorFormatters + ] + runFlora :: IO () runFlora = secureMain $ @@ -92,10 +89,6 @@ runFlora = let baseURL = "http://localhost:" <> display env.httpPort liftIO $ blueMessage $ "🌺 Starting Flora server on " <> baseURL liftIO $ when (isJust env.logging.sentryDSN) (blueMessage "📋 Connected to Sentry endpoint") - liftIO $ when env.logging.prometheusEnabled $ do - blueMessage $ "📋 Service Prometheus metrics on " <> baseURL <> "/metrics" - void $ Prometheus.register ghcMetrics - void $ Prometheus.register procMetrics let withLogger = Logging.makeLogger env.logging.logger withLogger ( \appLogger -> @@ -152,8 +145,7 @@ runServer appLogger floraEnv = do defaultSettings liftIO $ runSettings warpSettings - $ prometheusMiddleware floraEnv.environment floraEnv.logging - . heartbeatMiddleware + $ heartbeatMiddleware . loggingMiddleware . const $ server @@ -166,77 +158,63 @@ mkServer -> OddJobs.Env -> Application mkServer logger webEnvStore floraEnv cfg jobsRunnerEnv = - genericServeTWithContext - (naturalTransform floraEnv.environment floraEnv.features logger webEnvStore) - (floraServer floraEnv.pool cfg jobsRunnerEnv) + serveWithContextT + (Proxy @ServerRoutes) (genAuthServerContext logger floraEnv) + (naturalTransform floraEnv logger webEnvStore) + (floraServer cfg jobsRunnerEnv) --- What the fuck is happening here: --- --- In 'pages' and 'api', we have to reconcile two list of effects: --- pages has effects: --- [IsVisitor, DB, Time, Reader (Headers '[Header "Set-Cookie" SetCookie] Session), Log, Error ServerError, IOE] --- api has effects: --- [DB, Time, Reader (), Log, Error ServerError, IOE] --- And the intermediate effect list of effects: --- [Reader WebEnvStore, Log, Error ServerError, IOE] --- --- What must happen is that the list of effects of 'pages' and 'api' must correspond to the intermediate 'Flora' --- list of effects. For 'pages', we can change the 'Reader Session' to a 'Reader WebEnvStore', --- but for 'api' there is no such Reader to transform in the first place, so we put an artificial --- Reader that we can transform to make the types match. floraServer - :: Pool Connection - -> OddJobs.UIConfig + :: OddJobs.UIConfig -> OddJobs.Env - -> Routes (AsServerT Flora) -floraServer pool cfg jobsRunnerEnv = + -> Routes (AsServerT FloraEff) +floraServer cfg jobsRunnerEnv = Routes { assets = serveDirectoryWebApp "./static" , openSearch = openSearchHandler - , pages = \sessionWithCookies -> - hoistServerWithContext - (Proxy @Pages.Routes) - (Proxy @'[OptionalAuthContext]) - ( \floraPage -> - floraPage - & runVisitorSession - & runDB pool - & Log.localData [("request_id", Aeson.String $ requestID . getResponse $ sessionWithCookies)] - & runTime - & withReader (const sessionWithCookies) - ) - (Pages.server cfg jobsRunnerEnv) - , api = - hoistServer - (Proxy @API.Routes) - ( \floraPage -> - floraPage - & runDB pool - & runTime - & withReader (const ()) - ) - API.apiServer + , pages = \_ -> Pages.server cfg jobsRunnerEnv + , api = API.apiServer , openApi = pure openApiHandler , docs = serveDirectoryWith docsBundler } -naturalTransform :: DeploymentEnv -> FeatureEnv -> Logger -> WebEnvStore -> Flora a -> Handler a -naturalTransform deploymentEnv features logger webEnvStore app = - app - & runReader webEnvStore - & runReader features - & ( case features.blobStoreImpl of - Just (BlobStoreFS fp) -> runBlobStoreFS fp - _ -> runBlobStorePure - ) - & runLog deploymentEnv logger - & effToHandler +naturalTransform :: FloraEnv -> Logger -> WebEnvStore -> FloraEff a -> Handler a +naturalTransform floraEnv logger _webEnvStore app = do + result <- + liftIO $ + Right + <$> app + & runDB floraEnv.pool + & runTime + & runReader floraEnv.features + & ( case floraEnv.features.blobStoreImpl of + Just (BlobStoreFS fp) -> runBlobStoreFS fp + _ -> runBlobStorePure + ) + & runLog floraEnv.environment logger + & runErrorWith handleServerError + & runEff + either Except.throwError pure result + +handleServerError :: w +-- :: CallStack +-- -> ServerError +-- -> Either ServerError a +handleServerError = undefined -- _cs err = Left err + +-- & runReader webEnvStore +-- & runReader floraEnv.features +-- & ( case features.blobStoreImpl of +-- Just (BlobStoreFS fp) -> runBlobStoreFS fp +-- _ -> runBlobStorePure +-- ) +-- & runLog deploymentEnv logger -genAuthServerContext :: Logger -> FloraEnv -> Context '[OptionalAuthContext, StrictAuthContext, ErrorFormatters] +genAuthServerContext :: Logger -> FloraEnv -> Context FloraAuthContext genAuthServerContext logger floraEnv = optionalAuthHandler logger floraEnv :. strictAuthHandler logger floraEnv + :. adminAuthHandler logger floraEnv :. errorFormatters floraEnv.assets :. EmptyContext diff --git a/src/web/FloraWeb/Session.hs b/src/web/FloraWeb/Session.hs index 4385bc52..14b23c70 100644 --- a/src/web/FloraWeb/Session.hs +++ b/src/web/FloraWeb/Session.hs @@ -2,35 +2,27 @@ module FloraWeb.Session ( module FloraWeb.Common.Auth.Types - , getSession - , getEnv , craftSessionCookie , emptySessionCookie + , getEnv , addCookie , deleteCookie ) where import Data.UUID qualified as UUID -import Servant (Header, Headers, addHeader, getResponse) +import Effectful (Eff) +import Effectful.Internal.Monad (unsafeEff_) +import Servant (Header, Headers, addHeader) import Web.Cookie -import Effectful (Eff, type (:>)) -import Effectful.Dispatch.Static (unsafeEff_) -import Effectful.Reader.Static (Reader, asks) -import Flora.Environment +import Flora.Environment (FloraEnv) import Flora.Model.PersistentSession import FloraWeb.Common.Auth.Types import FloraWeb.Types (fetchFloraEnv) -getSession - :: Reader (Headers '[Header "Set-Cookie" SetCookie] Session) :> es - => Eff es Session -getSession = asks (getResponse @'[Header "Set-Cookie" SetCookie]) - -getEnv :: Reader (Headers '[Header "Set-Cookie" SetCookie] Session) :> es => Eff es FloraEnv -getEnv = do - Session{webEnvStore} <- getSession +getEnv :: Session a -> Eff es FloraEnv +getEnv Session{webEnvStore} = do unsafeEff_ $ fetchFloraEnv webEnvStore -- | This function builds a cookie with the provided content diff --git a/src/web/FloraWeb/Types.hs b/src/web/FloraWeb/Types.hs index 6a7b06e1..4407d066 100644 --- a/src/web/FloraWeb/Types.hs +++ b/src/web/FloraWeb/Types.hs @@ -1,8 +1,8 @@ {-# OPTIONS_GHC -Wno-orphans #-} module FloraWeb.Types - ( Flora - , FloraAPI + ( FloraEff + , RouteEffects , WebEnvStore , GetCookies (..) , WebEnv (..) @@ -16,7 +16,6 @@ where import Control.Concurrent.MVar import Control.Monad.IO.Class import Control.Monad.Time (MonadTime (..)) -import Data.Kind (Type) import Data.Text.Encoding qualified as TE import Effectful import Effectful.Error.Static (Error) @@ -32,30 +31,19 @@ import Web.Cookie import Flora.Environment import Flora.Model.BlobStore.API -type Flora :: Type -> Type -type Flora = - Eff - '[ Reader WebEnvStore - , Reader FeatureEnv - , BlobStoreAPI - , Log - , Error ServerError - , IOE - ] +newtype WebEnvStore = WebEnvStore (MVar WebEnv) -type FloraAPI = - Eff - '[ DB - , Time - , Reader () - , Reader FeatureEnv - , BlobStoreAPI - , Log - , Error ServerError - , IOE - ] +type FloraEff = Eff RouteEffects -newtype WebEnvStore = WebEnvStore (MVar WebEnv) +type RouteEffects = + '[ DB + , Time + , Reader FeatureEnv + , BlobStoreAPI + , Log + , Error ServerError + , IOE + ] data WebEnv = WebEnv { floraEnv :: FloraEnv @@ -64,7 +52,7 @@ data WebEnv = WebEnv fetchFloraEnv :: WebEnvStore -> IO FloraEnv fetchFloraEnv (WebEnvStore mvar) = - readMVar mvar >>= \webEnv -> pure $ webEnv.floraEnv + readMVar mvar >>= \webEnv -> pure webEnv.floraEnv getWebEnv :: WebEnvStore -> IO WebEnv getWebEnv (WebEnvStore mvar) = readMVar mvar