diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..61a7393 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,45 @@ +# This file excludes paths from the Docker build context. +# +# By default, Docker's build context includes all files (and folders) in the +# current directory. Even if a file isn't copied into the container it is still sent to +# the Docker daemon. +# +# There are multiple reasons to exclude files from the build context: +# +# 1. Prevent nested folders from being copied into the container (ex: exclude +# /assets/node_modules when copying /assets) +# 2. Reduce the size of the build context and improve build time (ex. /build, /deps, /doc) +# 3. Avoid sending files containing sensitive information +# +# More information on using .dockerignore is available here: +# https://docs.docker.com/engine/reference/builder/#dockerignore-file + +.dockerignore + +# Ignore git, but keep git HEAD and refs to access current commit hash if needed: +# +# $ cat .git/HEAD | awk '{print ".git/"$2}' | xargs cat +# d0b8727759e1e0e7aa3d41707d12376e373d5ecc +.git +!.git/HEAD +!.git/refs + +# Common development/test artifacts +/cover/ +/doc/ +/test/ +/tmp/ +.elixir_ls + +# Mix artifacts +/_build/ +/deps/ +*.ez + +# Generated on crash by the VM +erl_crash.dump + +# Static artifacts - These should be fetched and built inside the Docker image +/assets/node_modules/ +/priv/static/assets/ +/priv/static/cache_manifest.json diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index 411a04e..0000000 --- a/.editorconfig +++ /dev/null @@ -1,14 +0,0 @@ -root = true - -[*] -charset = utf-8 -end_of_line = lf -indent_size = 2 -indent_style = space -insert_final_newline = true -max_line_length = 100 -trim_trailing_whitespace = true - -[*.md] -max_line_length = 0 -trim_trailing_whitespace = false \ No newline at end of file diff --git a/.env.dev.sample b/.env.dev.sample new file mode 100644 index 0000000..d8b8c67 --- /dev/null +++ b/.env.dev.sample @@ -0,0 +1,2 @@ +export GOOGLE_CLIENT_ID= +export GOOGLE_CLIENT_SECRET= \ No newline at end of file diff --git a/.env.sample b/.env.sample deleted file mode 100644 index d0932e3..0000000 --- a/.env.sample +++ /dev/null @@ -1,7 +0,0 @@ -AUTH0_SECRET= -AUTH0_BASE_URL=http://localhost:3000 -AUTH0_ISSUER_BASE_URL= -AUTH0_CLIENT_ID= -AUTH0_CLIENT_SECRET= -NEXT_PUBLIC_APP_URL=http://localhost:3000 -MONGODB_URI=mongodb://root:secret@localhost:27017/redirects?authSource=admin&w=1retryWrites=true&w=majority diff --git a/.env.stg.sample b/.env.stg.sample new file mode 100644 index 0000000..717faca --- /dev/null +++ b/.env.stg.sample @@ -0,0 +1,3 @@ +export DATABASE_URL=ecto://:@db:/cesium.link_stg +export GOOGLE_CLIENT_ID= +export GOOGLE_CLIENT_SECRET= \ No newline at end of file diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index 57e7e03..0000000 --- a/.eslintrc.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "extends": ["next", "next/core-web-vitals", "prettier"], - "plugins": ["import", "unused-imports"], - "rules": { - "import/no-anonymous-default-export": "off" - }, - "settings": { - "import/resolver": { - "alias": { - "map": [ - ["~/components", "./components"], - ["~/data", "./data"], - ["~/hooks", "./hooks"], - ["~/lib", "./lib"], - ["~/models", "./models"], - ["~/styles", "./styles"], - ["~/utils", "./utils"] - ], - "extensions": [".js"] - } - } - } -} diff --git a/.formatter.exs b/.formatter.exs new file mode 100644 index 0000000..da48747 --- /dev/null +++ b/.formatter.exs @@ -0,0 +1,12 @@ +[ + import_deps: [:ecto, :phoenix], + plugins: [Phoenix.LiveView.HTMLFormatter, TailwindFormatter.MultiFormatter, DoctestFormatter], + heex_line_length: 300, + inputs: [ + "*.{heex,ex,exs}", + "priv/*/seeds.exs", + "priv/repo/seeds/*.exs", + "{config,lib,test}/**/*.{heex,ex,exs}" + ], + subdirectories: ["priv/*/migrations"] +] diff --git a/.github/ISSUE_TEMPLATE/0-feature_request.yml b/.github/ISSUE_TEMPLATE/0-feature_request.yml new file mode 100644 index 0000000..1fa1a3a --- /dev/null +++ b/.github/ISSUE_TEMPLATE/0-feature_request.yml @@ -0,0 +1,24 @@ +name: Feature Request +description: Suggest an idea for this project. +labels: ["enhancement"] +body: + - type: checkboxes + attributes: + label: Check for existing issues + description: Check the backlog of issues to reduce the chances of creating duplicates; if an issue already exists, place a `+1` (👍) on it. + options: + - label: Completed + required: true + - type: textarea + attributes: + label: Describe the feature + description: A clear and concise description of what you want to happen. + validations: + required: true + - type: textarea + attributes: + label: | + If applicable, add mockups / screenshots to help present your vision of the feature + description: Drag images into the text input below. + validations: + required: false \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/1-bug_report.yml b/.github/ISSUE_TEMPLATE/1-bug_report.yml new file mode 100644 index 0000000..e1f5860 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/1-bug_report.yml @@ -0,0 +1,33 @@ +name: Bug Report +description: Create a bug report to help us improve. +labels: ["bug"] +body: + - type: checkboxes + attributes: + label: Check for existing issues + description: Check the backlog of issues to reduce the chances of creating duplicates; if an issue already exists, place a `+1` (👍) on it. + options: + - label: Completed + required: true + - type: textarea + attributes: + label: Describe the bug / provide steps to reproduce it + description: A clear and concise description of what the bug is. + validations: + required: true + - type: dropdown + id: browsers + attributes: + label: What browsers are you seeing the problem on? + multiple: true + options: + - Firefox + - Chrome + - Safari + - Microsoft Edge + - type: textarea + attributes: + label: If applicable, add screenshots to help explain present your vision of the bug + description: Drag issues into the text input below. + validations: + required: false \ No newline at end of file diff --git a/.github/actions/action.yml b/.github/actions/action.yml new file mode 100644 index 0000000..180b906 --- /dev/null +++ b/.github/actions/action.yml @@ -0,0 +1,98 @@ +name: Setup Elixir Project +description: Checks out the code, configures Elixir, fetches dependencies, and manages build caching. +inputs: + otp-version: + required: true + type: string + description: OTP version to set up + elixir-version: + required: true + type: string + description: Elixir version to set up + build-deps: + required: false + type: boolean + default: true + description: True if we should compile dependencies + build-app: + required: false + type: boolean + default: true + description: True if we should compile the application itself + build-flags: + required: false + type: string + default: '--all-warnings' + description: Flags to pass to mix compile + install-rebar: + required: false + type: boolean + default: true + description: By default, we will install Rebar (mix local.rebar --force). + install-hex: + required: false + type: boolean + default: true + description: By default, we will install Hex (mix local.hex --force). + cache-key: + required: false + type: string + default: 'v1' + description: If you need to reset the cache for some reason, you can change this key. +runs: + using: "composite" + steps: + - name: Setup Elixir + uses: erlef/setup-beam@v1 + with: + otp-version: ${{ inputs.otp-version }} + elixir-version: ${{ inputs.elixir-version }} + + - name: Get deps cache + uses: actions/cache@v3 + id: deps-cache + with: + path: deps/ + key: ${{ runner.os }}-mix-${{ hashFiles(format('{0}{1}', github.workspace, '**/mix.lock')) }} + restore-keys: | + ${{ runner.os }}-mix- + + - name: Get build cache + uses: actions/cache@v3 + id: build-cache + with: + path: _build/${{env.MIX_ENV}}/ + key: build-${{ inputs.cache-key }}-${{ runner.os }}-${{ inputs.otp-version }}-${{ inputs.elixir-version }}-${{ env.MIX_ENV }}-${{ hashFiles('**/mix.lock') }} + restore-keys: | + build-${{ inputs.cache-key }}-${{ runner.os }}-${{ inputs.otp-version }}-${{ inputs.elixir-version }}-${{ env.MIX_ENV }}- + + - name: Clean to rule out incremental build as a source of flakiness + if: github.run_attempt != '1' + run: | + mix deps.clean --all + mix clean + shell: sh + + - name: Install Rebar + run: mix local.rebar --force + shell: sh + if: inputs.install-rebar == 'true' + + - name: Install Hex + run: mix local.hex --force + shell: sh + if: inputs.install-hex == 'true' + + - name: Install Dependencies + run: mix deps.get + shell: sh + + - name: Compile Dependencies + run: mix deps.compile + shell: sh + if: inputs.build-deps == 'true' + + - name: Compile Application + run: mix compile ${{ inputs.build-flags }} + shell: sh + if: inputs.build-app == 'true' \ No newline at end of file diff --git a/.github/brand/cesium-link.ai b/.github/brand/cesium-link.ai deleted file mode 100644 index ddc06ae..0000000 --- a/.github/brand/cesium-link.ai +++ /dev/null @@ -1,1389 +0,0 @@ -%PDF-1.6 % -1 0 obj <>/OCGs[22 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream - - - - - application/pdf - - - cesium_link - - - Adobe Illustrator 25.4 (Macintosh) - 2022-05-28T19:28:43+01:00 - 2022-05-28T19:28:44+01:00 - 2022-05-28T19:28:44+01:00 - - - - 256 - 40 - JPEG - /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAKAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXin5+/kFrH5m6xpV/Yarb6emn27wOk6O5Yu/Oo4Yq9ls4Db2cEBPIxRohYdCVUCuKq2Kux V2KuxV2KuxV2KuxV2KuxV51rP/k0rH/nl/xE5q8v+MB32D/EpfF6Lm0dC8l/5yP/ACt8y/mL5W0z S9Aa2S5tL76zKbqRo14ei6bFVferjFWU/lB5T1Tyj+W+ieXdVMTahp8UiTmBi8dXmeQcWIUnZx2x VmOKuxV2Ksd/ML/lD9Q/54/8n0zF1v8AdH4fe5/Zn9/H4/cVH8u5I4/J9vJIwSNGmZ3YgAAOxJJO R0RrEPiz7TBOcgeX3IRvzE+s65DYaTZPfW/Kk8qg8iOnKMbABfFvw65D87c+GIsNg7L4cZlklwn8 c3j/AOY3/OTHm2585zeTPyt0ldUvrWR4Z70xPctJJFtJ6ESFQEjIIMj1B9huc91KRXn5p/8AOXek 276jf+Wg1naj1Jw1hzXgOpYQvz4+JHTFXsn5G/nZp35naLcubcafrmmlF1GxDckKyA8JomO5RipF Dup2PYlVmfmnzNbaBYCeRfVuJSVt4K05EdST2Ud8o1GcY431cvR6Q5pUNgObEIfM35k3kYubaxHo Sbx8Yfhp7cjUj3zBGfPLcDb3O0lpNJA0Zb+9EaZ5/wBXs9SSw8y2ogEhFJuJjZQxoGI3DL7jJ49Z KMuHIKYZuzcc4cWE29AqKVrt45snRvljW/8AnJH81vN3mq90v8qNEW60zTyf9IMBuJpUDcfVclhH Gjn7C9ffsFUJqP5sf85b6LZS6rqfl5U0+zX1bp5LEFFjX7Rf035hR3I6Yq91/Jf81rL8yvKA1iOA WeoW0pttSsgxZUmVQwZCQCUdWBHhuN6VxViX/OSH51+avyy/w7+gbWxuf0v9c+s/Xo5pOP1b0OHD 0pYaV9Zq1r2xV7VirxX/AJxv/OvzV+Zv+Iv09a2Nt+iPqf1b6jHNHy+s+vz5+rLNWnorSlO+Kvas VeHeTPzy82a3+fGsfl/d2lgmjafLepDcRRzC6ItTROTtM0e/eiDFU7/5yI/NfzF+W3ljTdV0O3s7 m4vL36rKl8ksiBPSeSqiKSE1qg74q8mtPz4/5yR85W0WpeTvK6LpkcaRTTxWrSxy3CqBMyPM9OPM Hiq14jZiTviqtpv/ADkx+a/kvXILP81fLbpp13Vkmitzb3CgUq0VW9GYLX4lqCK/a7Yqh4fz/wD+ chvOt3dX3kLy0o0KGQxxcbY3BHcCSeRlRpKbkIBTFURp3/OSf5ueTPMFpZ/mp5e9HS741E627W8y ICAzxEM0UoStWT7XuMVfUlpd215aw3drIs1tcRrLBMhqrxuAysp8CDXFVXFXnWs/+TSsf+eX/ETm ry/4wHfYP8Sl8XoubR0Lzb8/vzJ138vPI0ev6LBa3F497DamO9SR4uEiSMTSKSFuXwD9rFWQ/lh5 o1DzV5A0PzFqEcUV7qVsJ547cMsQYsRRA7OwG3djiqTXn5l6hbatf2P1FJvRlkgtQnLkzpJxUtua /CDsB1zWS10hIxp3kOyYShGXFVgE/JTPnP8AMMb/AKDoP+YW5/5qwfms/wDN+wsvyGl/1T/ZRTvy j55i1uZrK6hFtqCAkID8Lgfa413BHhmRptWMho7ScPW9nnCOKJuKI/ML/lD9Q/54/wDJ9Mlrf7o/ D72HZn9/H4/cXm1nqt5f6bZeXY50s7MMzXU8rhEPJy1XJI+FR0Hc/RmqjkMojHdB6CeGMJyykcUu geqeWdJ0TTrAR6W0cyn+9uVZXZ2H8zL+rNxgxwjH0vNavNkySue3k+aP+cHLeCS8853siB7uNNPj SdhVwkrXLSKG60Zo1J+Qy9xX1dirDPJv5Q+Q/J2uX+t+X7FrS/1JWS6PrSOhV5BKQsbMVX4htQYq lH5qsP0rpgc/uwjEg9N3Ff1Zqu0Pqi9B2MPRKmVjzz5RUADUEAGwASSgH/A5mfm8Xe6z+Ts/837m H/mPruh6rbWX1C4WeaJ35EKwIVgP5gO4zB12aEwOE27XsrT5MZlxCgWfWkcl35chj5fvLizVeR/m eICpp882mI+ke50WcVOXvL5A/wCcZ/zP8rfllqfmjRPOzyaTNcSQr6xgll4TWZlSSGRYVkkBrJt8 NOuTanvE/wDzk3+QdzBJbz+Y1lhmUxyxvY6gVZXFGVgbfoQcVZb+XNn+Wq6O+o+QYNPj0u+YGaXT VREd4xsJAoBDqG+ywqK4q8A/5zn/AOmJ/wC3p/2J4q+qsVfKv/ODH/Tbf9uv/scxV9VYq+Svyu/9 bA8zf8Z9V/4lirK/+c2v+UB0L/tqj/qGlxV67+UMEMP5U+TkiQIp0XT3KqKDlJbI7n5szEnFXmf/ ADmZbwP+VNrM8atLDqtv6UhHxLyimDUPv3xVm3/OPcEMP5MeVFiQIrWfNgopVnkdmPzLEnFWE/8A OZttBJ+VNpM8atNDq0HpSEfEvKGYNQ+/fFXov5LMzflJ5QLEk/om0FTvsIlAH3YqzTFXnWs/+TSs f+eX/ETmry/4wHfYP8Sl8XoubR0Lwr/nMn/yUcP/AG1bb/k1NirNvyB/8k15T/5gV/4k2KobyhDF J+Y2ss6hmia7eMn9lvrAWo/2LEZqtMLzy+P3u/10iNJDz4fuekZtXQPONTjSD807QwqIzI0bPx2q WQhj9PfNVkFakU7/ABEnRG/Nkv5hf8ofqH/PH/k+mZet/uj8Pvdf2Z/fx+P3Fh/k7yBZ6xpn6Qvp 5ESRmWGOEqDRTQliwbv2pmDptGJx4iXa67tKWKfDED4u1nR7nyTqlnqOn3MklnK3GVH6njuUfjRW DL02xy4jp5CUTsuDONXCUJgcQeSf84Nzwpdec7V3C3Mi6dIkJ2YrEblXNP8AJMig/PNw82+rcVYn 5W/NXyD5r1y/0Py/qovtU0wO17AsNwgQRyCJiJJI0jf4zT4WNfliqQ/mqqnVdN57IY2BJ2FOYrvm q7Q+qL0HYx9EmRj8uPKRFRbPT/jLJ/XMr8ji7nA/lTP3/YEPeeSvINkUF4UtjJXh61yY+VOtOTCt K5CWlwx57fFshr9VP6d/dFkzS6fpumGaaaO20+yh5yXErhY44YkqXeRiAFVVqWJzNiABQdZKRJJP NgGp/lv+Rf5m3MmtSWmm+YJ42EVxqGnXbVLhRRZpLKVOTBafbNaYWKXzf84sfkZJE6J5daFmUhZU vb4spI+0vOdlqPcEYq8l/wCcO7i703z/AOcPLUc7SadFE0nBuhktrn0VenQFkkNae3hiqI/5zn/6 Yn/t6f8AYnir6qxV8pf84OTxR3XnS0kbjcuunOsJ2YrEblXNP8kyKD88VfVuKvkn8q3R/wDnL/zM yMGX6xqwqpqKh6Hp4HFWWf8AObX/ACgOhf8AbVH/AFDS4q9g/Kf/AMlZ5N/7Yem/9QceKvNP+cyf /JRw/wDbVtv+TU2Ks2/IH/yTXlP/AJgV/wCJNirCf+cyf/JRw/8AbVtv+TU2KvQPyU/8lH5Q/wC2 Va/8mhirNcVec6+6w/mdYPIeCH0aMem9VH45q8xrUD4O/wBML0cgPN6Nm0dA8K/5zJ/8lHD/ANtW 2/5NTYqzb8gf/JNeU/8AmBX/AIk2KqPkz/yYmu/9HX/USmavS/38vj97vtf/AIpj/wA3/cvRc2jo XnWs/wDk0rH/AJ5f8ROavL/jAd9g/wASl8WR/mF/yh+of88f+T6Zla3+6Pw+9wOzP7+Px+4qf5cf 8ona/wCvL/ycODQ/3QZdq/35+H3Jb+bH/HGs/wDmJ/5ltlXaP0D3t/Yv94f6v6XjPn7/AJxv8/6L 53n84/lPqK2kl3I8sliJhbywvM3KRIyw9J4WO/BqU6UNM2Dp0uuvKH/OaWoW72VzqrR2844Sul3Y wkKdj8cAEg/2O+KvWfyC/JCL8s9Iupb25S+8xapw+vzxV9GNI6lIoSwViKsSzEDl4bYqznzd5Wh1 +xWPmIruAlreUio3+0rezUGY+p04yDzDm6LWHBK+cTzYnBo35oWUQtra4rBH8MZ9SNhQdKep8VMw hi1EdgXZyz6KZsjf3H9Cvp/kjzDqeqRX3macPHDSkPIOzgGoX4fhVa9clDSTnK8hYZe0MWOBjhHN nWo2FrqOn3On3ieraXkT29xGejRyqUdfpU5s3RPlCD8h/wDnIb8vtZ1CH8udVEujXjBlmWeCNmRS eHrQ3I4CRQackr8+2KouXy1/zmxNE8L6mypICrMlzpyMAdtmQBlPuDXFXpn/ADjz+Rtx+W+nX19r FzHdeYtWCLceiS0UESEsI1ZgpdmZqu1KbADpUqpV/wA5P/lD5y/MT/DX+G44JP0X9e+t+vKIqfWP q/p8ag1/uWrir3XFXzJ+YP8Azjj5/wBI88XHnT8p9RW0nvJHllsPVFvJE8xrIsbN+6kidvi4PSnT fFUAfKX/ADmnfD6ncax9WguP3clx9Zso+CtsW5wKZRTxTfFUy/I//nHrz55E/NQ63qj29zo8UFzC t5HL+8kMgAVvSNWFfc4qzn/nJb8svNP5geVNL03y7HDJdWl/9ZmE8giX0/RdNia1NWGKvQvIWj3u i+RvLujXwVb3TdMsrO6CHkolgt0jfi3cclO+KsM/5yK/L7zH578gR6J5fSJ75b+G5KzSCJfTjSRW +I96uMVZJ+VHlzU/LX5daDoOqKi6hp9qIblY25oHDE7MOvXFWN/85Ffl95j89+QI9E8vpE98t/Dc lZpBEvpxpIrfEe9XGKsj8j+W9U0b8r9J8u3gVdTs9LSzmCNyQTLFwNGHavfIzFxIDZikBME8gVHy J5Z1zR7u6k1EqUljVY6Pz3DVzC0mCcCeJ2XaOrx5YgQ6I/zj5Oj1+OOWKQQX0AKxyMKqynfi1NxQ 9Dlmp03ibjm06HXHASCLiUD5a0jzxZ6rD+lLv19PjVlZfU51+EheoDHfIYMeaMvUfS3avPppQPAK l7kh/wCcivy+8x+e/IEeieX0ie+W/huSs0giX040kVviPerjM51LJPyo8uan5a/LrQdB1RUXUNPt RDcrG3NA4YnZh164qs8ueWdUsPN+qapcKgtLv1/RKsC37yZXWo/1RmDgwSjllI8jf3u11WrhPBGA +qNfYKZfmc6piGo+WdUuPPFrrEap9Si9PmS1G+EEH4cwZ4JHMJ9Ha4tXCOmOM/UU483aZdap5eu7 G1ANxN6fAMeI+GVWO/yXL9TjM4EDm4mizRx5RKXIX9yzydpV3pWgwWV2FE8bOWCnkKM5I3+nBpsZ hAA82WuzRyZTKPJB+fdA1HWtOt4LEK0kc3qNzbiOPEj+OQ1mGWSIA723s3UwwzJl3P8A/9k= - - - - proof:pdf - uuid:65E6390686CF11DBA6E2D887CEACB407 - xmp.did:5c477d2a-c089-44d0-8942-01ee9a1a40d6 - uuid:64461ced-d415-7541-bbc6-4f0477da696f - - xmp.iid:c5c4e1a3-ecce-4dc6-8d72-53f23c978154 - xmp.did:c5c4e1a3-ecce-4dc6-8d72-53f23c978154 - uuid:65E6390686CF11DBA6E2D887CEACB407 - proof:pdf - - - - - saved - xmp.iid:a2ad9868-0311-4084-8755-a96d935573da - 2021-12-13T15:44:51Z - Adobe Illustrator CC 23.1 (Macintosh) - / - - - saved - xmp.iid:5c477d2a-c089-44d0-8942-01ee9a1a40d6 - 2022-05-28T19:28:40+01:00 - Adobe Illustrator 25.4 (Macintosh) - / - - - - Web - AIRobin - Document - 1 - False - False - - 161.029201 - 24.237604 - Pixels - - - - Cyan - Magenta - Yellow - Black - - - - - - Default Swatch Group - 0 - - - - Branco - RGB - PROCESS - 255 - 255 - 255 - - - Preto - RGB - PROCESS - 0 - 0 - 0 - - - Vermelho RGB - RGB - PROCESS - 255 - 0 - 0 - - - Amarelo RGB - RGB - PROCESS - 255 - 255 - 0 - - - Verde RGB - RGB - PROCESS - 0 - 255 - 0 - - - Ciano RGB - RGB - PROCESS - 0 - 255 - 255 - - - Azul RGB - RGB - PROCESS - 0 - 0 - 255 - - - Magenta RGB - RGB - PROCESS - 255 - 0 - 255 - - - R=193 G=39 B=45 - RGB - PROCESS - 193 - 39 - 45 - - - R=237 G=28 B=36 - RGB - PROCESS - 237 - 28 - 36 - - - R=241 G=90 B=36 - RGB - PROCESS - 241 - 90 - 36 - - - R=247 G=147 B=30 - RGB - PROCESS - 247 - 147 - 30 - - - R=251 G=176 B=59 - RGB - PROCESS - 251 - 176 - 59 - - - R=252 G=238 B=33 - RGB - PROCESS - 252 - 238 - 33 - - - R=217 G=224 B=33 - RGB - PROCESS - 217 - 224 - 33 - - - R=140 G=198 B=63 - RGB - PROCESS - 140 - 198 - 63 - - - R=57 G=181 B=74 - RGB - PROCESS - 57 - 181 - 74 - - - R=0 G=146 B=69 - RGB - PROCESS - 0 - 146 - 69 - - - R=0 G=104 B=55 - RGB - PROCESS - 0 - 104 - 55 - - - R=34 G=181 B=115 - RGB - PROCESS - 34 - 181 - 115 - - - R=0 G=169 B=157 - RGB - PROCESS - 0 - 169 - 157 - - - R=41 G=171 B=226 - RGB - PROCESS - 41 - 171 - 226 - - - R=0 G=113 B=188 - RGB - PROCESS - 0 - 113 - 188 - - - R=46 G=49 B=146 - RGB - PROCESS - 46 - 49 - 146 - - - R=27 G=20 B=100 - RGB - PROCESS - 27 - 20 - 100 - - - R=102 G=45 B=145 - RGB - PROCESS - 102 - 45 - 145 - - - R=147 G=39 B=143 - RGB - PROCESS - 147 - 39 - 143 - - - R=158 G=0 B=93 - RGB - PROCESS - 158 - 0 - 93 - - - R=212 G=20 B=90 - RGB - PROCESS - 212 - 20 - 90 - - - R=237 G=30 B=121 - RGB - PROCESS - 237 - 30 - 121 - - - R=199 G=178 B=153 - RGB - PROCESS - 199 - 178 - 153 - - - R=153 G=134 B=117 - RGB - PROCESS - 153 - 134 - 117 - - - R=115 G=99 B=87 - RGB - PROCESS - 115 - 99 - 87 - - - R=83 G=71 B=65 - RGB - PROCESS - 83 - 71 - 65 - - - R=198 G=156 B=109 - RGB - PROCESS - 198 - 156 - 109 - - - R=166 G=124 B=82 - RGB - PROCESS - 166 - 124 - 82 - - - R=140 G=98 B=57 - RGB - PROCESS - 140 - 98 - 57 - - - R=117 G=76 B=36 - RGB - PROCESS - 117 - 76 - 36 - - - R=96 G=56 B=19 - RGB - PROCESS - 96 - 56 - 19 - - - R=66 G=33 B=11 - RGB - PROCESS - 66 - 33 - 11 - - - C=0 M=64 Y=68 K=0 - PROCESS - 100.000000 - RGB - 238 - 119 - 81 - - - C=50 M=40 Y=40 K=100 1 - PROCESS - 100.000000 - RGB - 9 - 10 - 8 - - - - - - Cinzas - 1 - - - - R=0 G=0 B=0 - RGB - PROCESS - 0 - 0 - 0 - - - R=26 G=26 B=26 - RGB - PROCESS - 26 - 26 - 26 - - - R=51 G=51 B=51 - RGB - PROCESS - 51 - 51 - 51 - - - R=77 G=77 B=77 - RGB - PROCESS - 77 - 77 - 77 - - - R=102 G=102 B=102 - RGB - PROCESS - 102 - 102 - 102 - - - R=128 G=128 B=128 - RGB - PROCESS - 128 - 128 - 128 - - - R=153 G=153 B=153 - RGB - PROCESS - 153 - 153 - 153 - - - R=179 G=179 B=179 - RGB - PROCESS - 179 - 179 - 179 - - - R=204 G=204 B=204 - RGB - PROCESS - 204 - 204 - 204 - - - R=230 G=230 B=230 - RGB - PROCESS - 230 - 230 - 230 - - - R=242 G=242 B=242 - RGB - PROCESS - 242 - 242 - 242 - - - - - - Grupo de cores da Web - 1 - - - - R=63 G=169 B=245 - RGB - PROCESS - 63 - 169 - 245 - - - R=122 G=201 B=67 - RGB - PROCESS - 122 - 201 - 67 - - - R=255 G=147 B=30 - RGB - PROCESS - 255 - 147 - 30 - - - R=255 G=29 B=37 - RGB - PROCESS - 255 - 29 - 37 - - - R=255 G=123 B=172 - RGB - PROCESS - 255 - 123 - 172 - - - R=189 G=204 B=212 - RGB - PROCESS - 189 - 204 - 212 - - - - - - - Adobe PDF library 16.00 - 21.0.0 - - - - - - - - - - - - - - - - - - - - - - - - - endstream endobj 3 0 obj <> endobj 5 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/Thumb 27 0 R/TrimBox[0.0 0.0 161.029 24.2376]/Type/Page>> endobj 24 0 obj <>stream -HWI7+arIW hX֡$@$zzdL3o˧׸}JHbmܿm/GSmwIEBkK -i_72~Kݱ< -MV\nzkaKDF⹉5t=-yb"M8*둃X2-}6<xj1 |̦M9zHI=^4 PJ3Q O{KG:2eѮx[hK@gn9 K+Vgݴ: Rqe-9ӹ='dvP0N - @蘥*dhB"m0A֪ײETdAm~K402{5~aC`h:5L@lfsi R_Zщ`-ۨ&Kj}hW$PUږ).)43)ha4gQneQGl36 Fپ k "k 3v -yq-<Ihz-E]e.$2ŏ - J3/sJL h$=l$ĻX~b͵0*L2KZK\.Z-X~u$`.6Zvp#W=nZWb+7 =`=C8~Pp[(A`ɠ׉} H/ F}XCo-m}\0;FLX7D `VΕ۬Ef0bHq/',^5XFOX`R3u%pE,u$~çXGvg ۨ}B$u EHrTXih=4&No+q/Ik>]s̎W!>w`RiPYc׬&Y"s_iφ|BxV~0A 'pE!tI犵½M}%2$M -j2^ć[O;~`& endstream endobj 27 0 obj <>stream -8;Ue`3&-Hp#3MHVnj*,`9Aj8,jtb.D!TIUh!sgR\_'oqD~> endstream endobj 28 0 obj [/Indexed/DeviceRGB 255 29 0 R] endobj 29 0 obj <>stream -8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 -b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` -E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn -6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( -l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 22 0 obj <> endobj 30 0 obj [/View/Design] endobj 31 0 obj <>>> endobj 26 0 obj <> endobj 25 0 obj [/ICCBased 32 0 R] endobj 32 0 obj <>stream -HyTSwoɞc [5laQIBHADED2mtFOE.c}08׎8GNg9w߽'0 ֠Jb  - 2y.-;!KZ ^i"L0- @8(r;q7Ly&Qq4j|9 -V)gB0iW8#8wթ8_٥ʨQQj@&A)/g>'Kt;\ ӥ$պFZUn(4T%)뫔0C&Zi8bxEB;Pӓ̹A om?W= -x-[0}y)7ta>jT7@tܛ`q2ʀ&6ZLĄ?_yxg)˔zçLU*uSkSeO4?׸c. R ߁-25 S>ӣVd`rn~Y&+`;A4 A9=-tl`;~p Gp| [`L`< "A YA+Cb(R,*T2B- -ꇆnQt}MA0alSx k&^>0|>_',G!"F$H:R!zFQd?r 9\A&G rQ hE]a4zBgE#H *B=0HIpp0MxJ$D1D, VĭKĻYdE"EI2EBGt4MzNr!YK ?%_&#(0J:EAiQ(()ӔWT6U@P+!~mD eԴ!hӦh/']B/ҏӿ?a0nhF!X8܌kc&5S6lIa2cKMA!E#ƒdV(kel }}Cq9 -N')].uJr - wG xR^[oƜchg`>b$*~ :Eb~,m,-ݖ,Y¬*6X[ݱF=3뭷Y~dó ti zf6~`{v.Ng#{}}jc1X6fm;'_9 r:8q:˜O:ϸ8uJqnv=MmR 4 -n3ܣkGݯz=[==<=GTB(/S,]6*-W:#7*e^YDY}UjAyT`#D="b{ų+ʯ:!kJ4Gmt}uC%K7YVfFY .=b?SƕƩȺy چ k5%4m7lqlioZlG+Zz͹mzy]?uuw|"űNwW&e֥ﺱ*|j5kyݭǯg^ykEklD_p߶7Dmo꿻1ml{Mś nLl<9O[$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! -zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km endstream endobj 7 0 obj <> endobj 16 0 obj <> endobj 17 0 obj <>stream -%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 24.0 %%AI8_CreatorVersion: 25.4.1 %%For: (Luis Araujo) () %%Title: (cesium_link.ai) %%CreationDate: 28/05/2022 19:28 %%Canvassize: 16383 %%BoundingBox: 5 -89 164 -65 %%HiResBoundingBox: 5.38626563385333 -88.5951004439285 163.296081542969 -65.3450927734375 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 14.0 %AI12_BuildNumber: 498 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0.936189711093903 0.469284594058991 0.319366574287415 (C=0 M=64 Y=68 K=0) %%+ 0.037422258406878 0.042941607534885 0.033991955220699 (C=50 M=40 Y=40 K=100 1) %%+ 0 0 0 ([Registro]) %AI3_Cropmarks: 4 -88.9376967245298 165.029201311163 -64.700092340272 %AI3_TemplateBox: 90.5 -90.5 90.5 -90.5 %AI3_TileBox: -318.485399344419 -356.3188945324 464.514600655581 202.681105467599 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI24_LargeCanvasScale: 1 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI17_Begin_Content_if_version_gt:24 4 %AI10_OpenToVie: -131.734705568801 86.6851561373069 2.66373363361787 0 8167.48331192977 8150.96514380489 1428 849 18 1 0 6 45 0 0 0 1 1 0 1 1 0 0 %AI17_Alternate_Content %AI9_OpenToView: -131.734705568801 86.6851561373069 2.66373363361787 1428 849 18 1 0 6 45 0 0 0 1 1 0 1 1 0 0 %AI17_End_Versioned_Content %AI5_OpenViewLayers: 7 %AI17_Begin_Content_if_version_gt:24 4 %AI17_Alternate_Content %AI17_End_Versioned_Content %%PageOrigin:-310 -390 %AI7_GridSettings: 72 8 72 8 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 18 0 obj <>stream -%AI24_ZStandard_Data(/X 3UBK}F lj}NR&)Ln$>C/!VW i$S7sUKVv|PŨ  PT  < Bxp@A*XpAŅPƒ$ !ƒ:01!A  Axph t2)ťQ:Ghm8|@  0PB &$d㹜;2XapJtZ2␔re!0ĢC11ĂnA`@4(|@(0H(<=PP4$T(† -[nL93ÁX +1(H}5 \.O(5fcힵf{e}Gi.dztXe2 m3cɌ_6iܒ|=7u?Q'N83|9v=HXx JKgE6$B -b.82(fCˈxpȬac]kU(3=ЗNAXl`H`gD'F&Q3W.qzW~홽ssqbp)@, 0"JFVmgi~7c\AVf\ -[ OWFX|˺Hw ap(b! sLDbu ' E-X, 21  6T5` Hu(:`!Y E= >+!Psb8$!P$ictHX B(ޤ(ta "xDq0E:VN8b>1C33$I2{{Z=L=s}2$qݸ +:-p@G & B -* 1nCL\wVΉY0D0ܠ+;D|ٱMCXDyV~GfJ<Ϊ0d861irتK,Ξp蠈8Ll1- -&n Q" g7"NKZ`pˆ).1 -KЅippXMwEPFDV1@KPXHl8(ȡ'ɀ @ P,1( - [@vaQE~1 &tQ *D 1 - ā x)U)H9"Q4;jY2c͎,=9~C+kHfXf2BfW7-K,8u)9CrJ7h(32,4_Uy̢ *DzCە9 a;Ks $ <8` cJAI<  Ơ`8dC!H(C&2 WӰH$C: LaqNhnP lg@$( ^D% -Pfv˄% )q%n&}2<呪DY,@0T"U": PX(i{3*BháCqDqP0ږ"-C!OgE=jR0blDMC-*QkjhC]ЂJµH$0 R,[8E Y%ba 84tDTdtdBJ:!(A -Z5Tʅuz!*QZC5X̆vCX0k]ݝ/)nq pqM.6:}# 3EBC#b T'NCT"!=nx/B08H р8L JTpxH$E!ѐE().W( -Ebja[xC.@, b`X4, P p f@d8b1 mkp" E(TvV -#*;cX|̉bqR1ΘG$ -)5Θ o8P,|) Ó f8c(b 2 CÂaX, X E-h -BP W0E)JA*Fѐ`H,"D&p%*$ @ G$F"p/xynü!rL$"KJd2c"Ѱ83XF8ms\nqK~y;:^1 ̬6PRT^YXUT1 &Ҧ @ J(Hy.E̢׫Uۆb0bI$>187wS6TĀCq))MHYQC m(CІAx_DWEm"1A> yU砀C u8 1pt`XF08P &PAP!1\000AL1 --XPL@LA -$0 "p` (D@*D` (H#00 D@A&p! 0Ё F0\@ႄ *`A$P0 -"tP -pAqą&*PX,X0 ZAbt0…&\`A 00 .t)`, 1 -,p0RЁLX``L  P!T !B a DP1 2Ё &l  $B @-Tp,P &`8Ё<8B )H*01cFL1L`-@{޿.p\;ȌX 00XăC: #B @t\,4LB{"p/<0"\0&0*Db X, BPaB -Z aY!lq㓔;.e6IFU]VLLڝd?DDY9e9"znsuI;Y=>uo7N~|d+{kB4KQ_m&ǯb.ͷq]OI7 I!وn_z1fXnv6iT){o弖kڋk zx9$9%;?2U%+Yz!s-m6E&^Do:9w;Zi˛5c(Vuw|_ 8)%}]ڨrʩ|/uid:cuGX6{F_UBW(*;FȐ&g (Yh ~6VE'Ghhr距]*&#Q -RmS)IW#S}\\cv5XOS_ߣ$4v3Ye"#^iFbꨚe 6]j[dH(T2[6*V;iwiz/ >C흷'I6sɽf^Chi~=)G/*\ZyeE{!ڏ0C*!U"[Mz/;I)^4H=%B:yؔ A{dG)?u4u)C\zJ&Ι+&}DbտF9RmgI&-=vP0oR;7z)R7)]VʧEO4Ijؤ?)# v냿\dw[ϙ#KDrTҷQ}^XeZVXv1+Tft"51/:NЊV+UݞM$a5E;))vڒ66#ɒaڕn2z]Ԡ$5iiK0 O93D7K_m/$r^"lB8;Bw11{kJ(P5WI+]RفF%xwzuR裆o?L|Ph/ -YLJSWui@,РLvJwg`;|+ztNc%#|N7k+4K,{*Ǝw4rзd|Su>V^v(M Ӧ,u\7>oDͶ\aʉ -ױLqޭ0l*uL1ij;LMW5>T櫧r۽Ɏx=I͜܍:zm?B=#˴aع 2G}Uw$<,uH)(䊵tJ67xa1@;oyJ^ Fm$< dO락띮`iT,Rf{BsbfFo)aZy$dd51cF/$F-=CS -9вjIhԕ>ځT'21}m^4.>6d;]4}z%4n1bg^TK2U^%d4|u4[$qk*-g# -Ǭh'YWM\4ʪr5>Yh2FRl_?e ;%;YY\72U׌v zщ :_,^ǾYf"˫SRG#W>Ŷ\Gz&6 $3WOjr5,6Jgu+?vb7Y=q ڠ(LZѴ2Mb6n;[mDvo=JnO;[?ƭ%Ͱİt%HhO&IFΩ7݅#'2I0NV' gҌ%H&4>gHGr%Axp0^VeI& /x- mi|n5(edY!vq -c7ҳ3sƩc!Z lƎ,ꡏ:2Lu%n~ݕ^zkwh:sWS7YGj>Nd}&gh;D}Dssz^S%z(z^ZHC))HrZpPёT! EBI1+,԰\m[2LzuLA:g.QO|B;٤Vt$Td?_1Ҡ~ʮ)v/ M*X3R&ب2ƝΧ#.$$$}jRSH1#<ֵW>ƾ!Z[L<L *YI؞lK]nIL$l ڰRKLR/d#FFL<\ҾhvW.5%㑝s:zKQ>iS$Ւ$}L&IC?KC'u*DɴXNhTb4:=W׽ʞ#Rh)G!!{ٗzR#GhBWUr;ΔXPN(O:J|n:H*[ޓČ&E'<=9h'qlJY;!,JClf7_էeevUIeZ"&/Y#Ǒp=E~NsUחלLcq#Owrʩ=Ir9n3h$]G5BxiQlۨaey]C'v% GG݋r~{Qa[)sf:31REgNiܼMHRMryhL{!8'28s{>u{\s8$zО7SL|4|=EgdpA;|ZQM>ā"9)7h#95g)Şg1˴ng:ˢn)W /g䩝KUCW]HYS,Uzw.>0'E+ʽ5;wȐt(RLw$ "!~ln, Y?hXiAc3"IK'^y)J'Mם}nH'_'9Yӝ%C:B#QrtKldBW_VUnjw,4MHvwϵcw/Ӊ%<ј}OYk䐐j2 -V*R~ƖI]<—efѯud5mVe.%džqXSjxe w(5?;|Kޗg՟b -]5< ;AocXyRWq -m1 63Jz.͕ҙSרi=":Jk],2DstOZrp;B3˦ED$U IxO:X_1Im> F8Gyn3W6F섙jF2cƝ3 4vO)&tD"AAܠBc (@`.T  -9 $0D@a   T`A!/pp`AB` .N2`P.pAh\UB *Pp$:qƒ|Ŧ)Ki"e.u%'v' MQH#VW)DdА*tXi#ON1 {BSMB!IRg31 ƒ*:gNJ.NY -a^^,%I4Ad&4S(G6274!i~, gh9$]l6Q -ȗ&,Q -(M3ơcd'9JkLtʯ:ʬi$ЭX{K(SDשK-ǨT4.Tu-Y)I&&yx('}*_FiEɣk~CzNW9lK6t]o7$tM:#Wj-ʙ;"EirErZ7V"=,}/D3yC lMm*N#ޔW(k֑pjXgFYfQ̰璀?bS^ɒD5ʕ,q(|y! ^v[n4u&*šB*̤&!NF 驤q:zeFiM6*]IxK:ND9+5(y\{7WQ֦lgC33vĖѠt|뜸fI>i%ud8g7IcK,۳Jڞa)%YצD.=wodzIK4X*]bEXѨv<"2$N͒,8w;%I4ʌ.j|˔4i*Gȕy$;cSIIis),obT;}y:XJ,Z`xM6-ׯɔnC~+sGjޥ*cp4ң>.̻M2d4KsnfڔFGidS"\7ҲFќsfie` 汙[l5o)ͭcv1&4p+Ol!_&8ȧ'rPG٣CaEyus\wU]gDq*WWy7b3{EGӢ#}9kgbYOXD#ݚ47iՍw;GI w2>lX]"~6'ߩq6UNjFvX|TM4DŽ'̑|U63ϼɬu)dIWUYD1?yEvdiBYz o9xܲ;$TF;35is1]\w -ko.kNXgUOQ6Yָ^R%mc*9\gW[m^YfC,sxΫ$o|xuFozVWEeFK+9._7_#؟cWǯ_SêjXYQm:H5$/wE %Md nҰ&M!!2+tq>:LKwIXvB8yx$w-Be 0#%C#sɜ"ՖCE9/F p7l<3dQf`? W9:f[=RМyˬ1So~GGSxx?wx{F̢Xb,A~1WHCv u.E9fXFdCI3j1+k)VѵXNEj)Rej9D#SȈXtJR+х{ƮʏǖֳW7c5.UeQ=ͫBjtUu%QTd7鸊LԡzF,egc5vORUiuX*L9>v12 J~ڻ|ed1^VN$wXϓe+\Y/=jIGjWw -;4;9:T;:}gU]Uo2zԔUՉ 9t"K){<7;%9VDxqYM8n5s2J FJDyvB -/GVqȨTP'p+4*VUX*LrBOr?AD;zfT$=uĹ]r=FuK$ /{PBڶgm"N>q#=GF+OQn*6<<2feti0Vxyzyf$߮LZc%sky|}I7~b*.5enդA-KDa{zu6ɳS}9VEu2VVe^./Duu)%=KA糺=1IJ͐02)Bt4 I'mSSG#ơYKxvHg $!-CdC׌4b͆Юfk٨zhUtGsih%3ñ"y0F7nj⫎yZW߸g kC&3RgMZkavkЖi՘Z&%+)ѵV5;bM5k2J(l<ŷ3ALJxbiؐze% g^Ϯ{:W4jI Un!J 3us&8|\M k쎵_t| 8x}(6p;$^.682ؑxG'jdR:Ŝ03(+a5OLԖN.1;$$hݵ1͸$TKt19L.j!}7Kqr|Nh"ݱtvA3h"Jf6>sDKXAW>N1Lm.Ҭ(lHn}eJe.cIV+{a7.sw尔+ĺ΍|TZ8df%2%CJIz|65ʨ6ˌ -J0?Q֛S.ٕdxbӰl,gI;ڱdEgE̺UZ1Uu4:vEj3yR+z Y0ӵ:ќ3T| -ڬy8hi=BC|Nm{rc(kcSXI*p.mW»Vuه!Q[jЦu\3ݹj+;Ӆuj\GN;cV\!5JIÚch=իj,Mg#6k>VǶY&n<4㢻qd_8f¼UM;<=)!%jO꣆nM*YS -;a';Y -Ɖ^}J.+^ ͹L-&@-SDۏצFs21MΜ0-i22"xJJۭg -MyAC>?#=GhQeya3uMܫ! + ޶K<vH>1O?"P>枱 {r,w?Sܨ1oM*?vŧ)r6/./N1d0 x_ey8^!.BgAƭ!;UxZ,q+9Am8mڒze8y9-& -t K+e ZR2"ŸtO3|m3Po:'_r;4Rƭ8MHˠX2d&,)Z !SR q(B4"ewtrr K!fCr4żb77wŧ3_k+u^wGnqߞ! kkmxvrN)cQ@!Z~ -;|T#HreQq*ȻAws'U {$ me&>&X҆^W z)}4QZQ1sZ,B'W0e(s;N|5۬uWOT k/!BPūjao{ggFy׵/MvAD@,r WBKq2t_2^n1v8Np:ϸڀ9}78ܚ->GWYLC2%ѯ/85B^Zt57nҫz]J_m-!S"2ܱBXdЎ3rMS:uY=]Ǵڑ`2n+g/`N 2‚:a"\G'wg 3V߇X)vNɻ3l5`?F(0>XjLoL|=IT~4kpLќ>QY %`mm -J` O"|]nLmps9fD`@7 Ks.5~CpDO I~Di(K;RU*,"ڂ/5&'>QD{}6(v -/HCbn?T Ytaj8W:l{K.S(Ey4s7@߿O5 -pG>wCN*OcV )$K$ j/gfh7UV5BmHQKғ.W$N۬tcQWl9-7v Yl;cȌAnP!x2Of,J ԩ.:(n*܈=Q^upxRB.=~H8;YȠjiqO7&3!C6Y+/AkxCqBnmY Kn䍲w($ :JYTȣ+DZ'үÝGwW /)z6(q,Dw!7 -OZ-'W!*5/%BBoW4%H]]e/횢1)mM,"R;D,lÇhslǴ[FN͡-~drMհZ&:f9~;9 8%O@跡 %⳨%v}elhc5БkrUk -RVE99O} Uf=I?K$ɺu8 =݁;ź>^عԠlua/W58|~t.=@ tr%)N1-F/31Jx$"%Kûs.B[Xԁhʎάnfjc7FY>򀙂"*bvV $g* /Eڌdf-k +"b9X^"S=OsVEŬ6MI0GVy[ʔ|K(Bd I% :w. 2wY4GUUBh$Mk {Z7#Ǖxo9n,O;^FG:OWs/izq}"krA+oځ,Zl8VȄK N\j )x4u9腝Y|d< opQ䢍H.<=8/L3OTEN{uaD:w@+aRUu> 2\H/{*V^}Ǒ1ˁ&9+aջ7JPC} P9>[EQD)Ĭ3g}7~0Y,kS|s3N[oul|dR:x ب=Y;.^=~XHGe0IVs ID%ɼ/ԧYߎ."$Z7S9BqXgu'&0~룼g̣)|!L͋*)Kـj_x@׏W^hcL5`! .jɤ C5ƬeN:"(-#5)a:ǭmfl!{\a޽w9- IZ u4-ZVA`#(9l6&F+F8ۍ>_%kW9NR@-kVLAd(;ryRI /#$[nJP` f/>Ü%9W~4F{fHksf$ - S8x^?0z2ķXH>Ȼ{-U 4tavDEFY n P;݀]ϙ$d~X08;Q[ 3g5)v{9ԉ2|$5$veD - B͟ TIm!7з C7\uH$st VZ9]dkYQv+.ccK Z,􃟍5(O*O{:"$}\V7NΛ,數$c6&!@6"J߻=ƘU^!Wt/kwiO@T:ssuf.Pl.] zVکAtXSу >!FJ$|nkOaR[6.]|+7M8'>.=(^nPbLHTBS77sNWoa γ/*H@%\"}Kd#x6͖,.#$FVG:]?XSCK'<9 QV4pFsꗞUңIƩECTk(U dٖmʷwC eC rO ˣjpi`\>GvlpQ>V[Xz@LTx=<.O'$ECeu0t0a뾂Qvhb}/4Z , Z_E 2능 ?fkӺ%WY 4ڪ;Hp1й=DҾE;\?/>_7˛R] l -r*Pjhy)D]4*Ye3[o~'ZV #rph.c FVj)+] -i3RXg1v>Ys?ws_&~QT^Y?K'TA {lMor: fPnk0|c @nh!<ܣF >8*/3@D4$Vf6x0<:BxX.$k`S񴱙!~eFKZy,?mru2\J, ͤ }D=WpxI]9)0\xǏ~km)nͩ?ض_HmW膐܍#t-}; -R 1yxsel K`)9I -|"srw-9a}4g ܨiX΄W (Hݠf% Rb"JQōD -Re@МD`z~ [n[o.RD1=('$sU"-6첝$>% |.fN!WV9*N뇪J99p[dn㠖 wC&:k& J7l|4.(xىavmnIL0 Ю6'GwΛ;\i<Ԫe!߹AgԴKh1dBj20ap߽줶 9Dc@1E*hgcs]NR ُPx1h ^TD($JȡzH0o26sc̹@`BSRX4Bxti 2UϏe禖 k`\?"]k! /)gClk5]#;X*wL2 ]kwqð)\#;GCS4@>%o5+_?qI$WCô_5uU ~F6|SBzƃ@)_(݀eD4F&XROGkEyք -wAC'.򩰜(\hpj_<\τoi -;K3f|!H3y7[REi4@ Ƞ$bXan咃AP>'Xq(o4]`H CA؞܈l6q%/r19"lOVR:\0A̺@-OJ k\Lބw56kPC.=!`E]js3FŷX]BM\fʗ1\)%I -nNpC$56<|(v*TYtӦ%N]|,s"!҉#+}e_fL_9 rEWme[9eE-u0 9e\Am"|)Eᖆ卡׺<<=^ëz0)qwZ yt]ߣq/SÈ왃%5[*D-fyq~|ïABIea6W/ZRni܈t}b? c"}؜q,. %S34YbP">zUY`PB^X r Cpl6{G5p&`Ƅ;ڧuz [Dk$sOXNQ7 -IsH77Ze6J+Z - /Njܠc*DS7Bj2Àq22rj~cS$U9×]7`9x),ڤé0˖Di|/\ҤO ,W5{vaI)ʾt .{# -~6$v=@Aʪ<@흖[<]9aN ՖĜ74$s:k9B/P@_y3M‰L*PZ\KB{ébN9o/\UOY2sn$@\H"d)fJ8T%Yfdr -PD١X!־:Ej D^&lb zEwPԴ%qNYDjĹM$q7ۮM8Y=RNaB_\[+uLO m%j}JbDM^/>EPy}, 4ܹ7w0 o"ƈQSi -u2TJ;7|Q?creeS=/O@k 7ATlxCck>OT)wKc O@(M߂Q]'v`ظ:5< ݢ|.BQ\1"m6mRO rR J!4PJĺ<\\ˁ.J1KQhu0?(+~Y9y e)<>D(ϔ\qJIfH0*2r)ri&(SݔK=U" c8⟷-Ӥ ͻ5S1)^<N* mF8Ӂ.w}e*$k*ZV6;劖$")EXg.J5 o[ +ctvp`Āa U' o-(iV&̮ MA0kxRTj;'6 Zǯy[Ù,d5W -Zwߙ>}`-UƏі۬)}-|;zg{Ay&zv.Iƭ٬35fQ øΉBwㄇNV4@]83V64oߖQ$Mcgm{MaU$sj/J8|\ߌɫ֛7hD nFo{ =T3F+Ulѡq0d ]o*UJ6 eQ啚BTH]iB}4sE_C`T|NͺsB~vGz1#?@l#Kau{Lp#%q4 V_FX ăm/:;!HM=ŽWPo9;;:+M'$g~ R Fe@#Ҳ2 njdrl&_(-|&Uţ5#zIx<|}]{3H7GKkO *<#P|Lٷ!57T@Pv[r(9aЋYvCSQj5m)=#qIU[q"ABSS~%I@7f >)Dũu5]FK) OQ??if&T2肖WzŨ/֊(^l{<"^~} f2zL)f#\ - M~c?ŇP(u *Uz$$j -yR+܁!8KV1ےK~ эchb^(uܲ50=hpgIYğnQN6J]rykBveR+xFU}:1YrIbƃbaJˬ(+{~ "7uFXNyG$оB!D./#Xyjx|Yԝ,BqdW.PJ*FԺKb5nqO8]OѶͷχ#n7De{2* :V骜 f{)&&h4y3 wRûY~nقn m" :24|`PRL,lI-J,3R\.y/Oz L#Q}x\D; -LI% G"F,d(_E/Ft,rmP@%NK^D@<>PPp=ł{_VdΑ7i߲WPT5)24>H&܌ƊԼ'"ZW~/X~adk_CdlT+X3NW$A=* -=>H9f ɦjo:gKSK&p*?m*HPEK2AϜ"vY'];QQ-7M)1nB:z= Z@'W.bB|%H)[خ%'%B%*+NeNl<-ʡ];ub$ͬq9 ?..$>aR-OIyl).,yEmy7uxZfOHz]  !CZ5f6c2sU|6 -/j[D9aTrj fzLIݔM^z%к:ՠ -ތ~I9bFkٚ;3ō˷hKX4:Jd* *[] _ &>Svg J5 S*dž -s*YE1)A͇Pe%WB O̖D)S rx>E,fD4.O6cSO9%xSA˔Vz¨3SZ$]nSyʶ0e@zph6g@VY)[pSۏΒ?sKdik2ϢxQ-2-*Uzpn ]nA!Ұ W舓KA86!Mth]:Av.-6%遢ڋ㋍v -T#,[ȸ*+U ycycN9F9(6bN/$+Vb4 OzbDκla2$# LF'3MQW e0^`I&y P0f{IAB[] M^0+uC"2KXϘD!⭬z3c<d:*.VnqQSƗkjj#kjVp~5aFx$y x* YFy6\OXm0g[7,7V˿9׼XhPrO+-DAΤ>ZvO 0ɨjd,1zT,BD(N r%ɥN'jX90v8nhpu_xS֖o{ehN/#tUL ~A2kY &=O6#HCFhv,r -,$mU/ёRu]lL a]r3_;:]<$dMoKq,0_#ҔP%2cBRND`b !keY>w-IRur50/x2+[7,CҊ0r94(?fr(o yP*o= /cȧGVVVɇg9L03|srJi#A[C:g@X -!j~iB*-5R=C=@whs L zF~yer[}>@HD$Dz.٥|Re#Ov@B[Q2`1ǥ,|t\(_;.Ґ&^Ltj[C6w l*CA#E`"wŘsj{O:s;Fp,x43>c -4TNr kp0$H;ml`2Q k3\Ihz u8% 6hLVMPƆmaK.=E~}=C0&:P;JTH|'l2c uAs|~H=T!*v8Pе-U44P ~ - 0U Kp/0 YևP6kojP ܞ6-e~2h/Yh%X@LRjHF6ܴLZG@ @vop`B-8G =~&?-?w}r#@!uZb_wE%Jp>120fp RiJZA=66 -ӣ,r¨Ux1# 웘蜸4?Dj‘V ܲ5h}TLrዠamHT)L*a"j:r Tx/GnV)ye}i$%D}ϘO,=%j}JvH+^qB_}EӍ3*Ct 2Y^~2)Hgf%Di4U[\T-B=jο+{jQ $t\[-UUDR(vi`++g{ZB > SF햌JLVG\lBfvP3y@1ms!`u:M[TGftkaAKx0)ϠHkR-&tT -m%-*ZC+&>%PlTg+GLq9U|MG1K W{ XCe#=ss2&|tEfE0[W0JufT4#WaӦdq6}ϷKvinZ~p#mP?)$LXQ\EKݵU)pru5l9BI Xy%C=~WR1&KL򍡷Q~"#A2e -a}[!d(ubY@ p Al&)IVXkįu,_f|vIG;tZ"ze0&u|| -G>B}0UB زh^ʤCP/C-K]>χ3%% Q>v=uUGDBl)j8!gЪqmNzﮝ]K bs鳯ePUG |1NhP6ݖTB1!6|XoDuח=us)} -3{/O 9al*;IWXI( L/!i<{yjٓ1}U_,5,5F?vuoċ>܉/>M'rvd`[zO -LHA6hPrOgkk?Q( FVOMM x=;GuL6\Y -I+IGOQ .9q -?n?x--Kj_s l -VT~Kp~}:?r>V23` y:sm:%C<֧;t !V&ME]W<@36]@.'ex<%deBO^ R)Ktz<ꌄ嗚&AbNEgxzv$F 8.B=nn!ASTF{ԩ""J ܐ$!ւ-H{Ǖo򵩓>3~DQ~vGzlz" @&_:Hs}"48H(/+95Jjsi@t+F(",XDȧs p}հSzIwrk@0`rgPEC-!~[d@8dߚY09B5Ҿ>mf7[dV-}TEi~]%vgs)ëb.LoS}?Qի&5WhyE1%ry*ʻ3x/2jr|_y.0/^F^bWrW^r{%~X+3U{43 e[DAm'0jf'_wc烽# -Y&x*3WNGbu9V-.xOk~lMf|A3p -Vasq/> o0,nXg5ϡvWwBS,80`"扜r*b@zoIyNJ`mHɹ *L~P(|xa9cP te -=@USKb -@J6Lv ) 5cG;vcnJk Q,EWs4yj-F$@Ϲ`m=W@쥝4+7*Rf=p -bIr`P`*~8:x]F xzݏф1u4,_0t L -@KKub -}3Zv:au4 9uw:) )H[h-RpߤETpIej,0X$ Q{-8aS@$trFl`}dHNL~*FخK`2AQA=ڒEԾ<V%x ?Io-Gż1!vq#q`ݸmxӡ@%TC+Yy@Ą -nLҿ(/՟Xz衸]_*|Ol.hob9{ZU ?7</L1J T-w$(:@^ oG5k^jn;+AJ$t7)Y_ScЂ!!.`A'JR9/PB&hf*ոR 5u: /wrzgiD^l\3 m#N:^/Թk85~V=/47_(XUa)8$< cMr$4"(_ ;Nu pCmU@s j|PL}2p4*VX6dbCy4ist5IK̫Z)`T #S&ofi~̈́X?=>7敔QK4&InkC`9Bnm&4&dOAɃU)$lcXf6wɿO!'G]"-4E؉G\a=\P- *ztj?k:ΘJ #ɞvrR7猠#^ ^tDc=Md[ڷN 4+nu{|vA'C4@B9eFUCȅ\Uvb޹4ݚ -t n h/`MO㰽1PS>I/<fG@:6ǂ s \Q"ĉГ)қ]6"|U @rlw#N@x[1i-.&il'*1 r$@>pTKnN/pƀqEAY4d ao11AKMR5a'7XB-Ho;듻l?֙<4,%o,-P\.kTZ6*C -M;[mht"*q%O_mST_EHMm~0=SR-/?u!2o'.F*+NSQ&2 ǒ=%k=Rgb"vh%_I$~Ίbِ(uF:o.Zz|6͠]`WV6¹-]MƮ#m-,mp>fm@7:?ì> m8Tr"kO?5z-Dնְ5 'ZCD@bm0U9Bm# }%AO <'x$]žUɃ%OʸJV(VퟰxbK6mR9$>FsO.;u%ZRҷU^4pąp$Io7/7/ Y͂6d.ɂ ",bkl̀/m;%QM㑜S@eG=G\>"P^NBYwxNN̍K~L0WRKL5Mm>to.p[T߷5/ -ŀcy5B$ -z70?by'OW,B"<"MdM -i%S@_U> ~E tQNJЫe.{SlъzX=_6Q4A+qeGw5ĺkHHy7zQ/wĵ&& *vLK-ZY-z#n#LRshA򏖜 qr&q*KyLdԣ椐  -Z@qM -| :=m݋>t*o>WP \4Y_YhE'Kt\"ny |~ 1]3ب\;qA!yz2y>#]mF\A=逝4&Jds1ંPq)L jؑ)MK&.!툤Z4U[p^hÍ9J.>uFu:ReO,pT}pXo_%IT[._A - I{nheezl!p s!Jőx o,CrE?Kx:wA;m?H⏚'P!ؓGYSsYK :dx¤ :w(fUUꎦKd?Xsk7)DQ)jUt˛7w| LE߶T.E8S+'7$zR.%@w3e+?^Qv/Ƞ:Q^;J7M9@unSѧ"T sD࢔H`jX=G|k yIV:a*m?)Joq <$@Gs!I#M{6^ddsy(YLJnG]-dK9iީ' -k (OḢvki(,.2-[O.B1 r|H0h(R#̸:ZQ\I brH'BxeNd -1{.xĹj_n_DIF =uޑ|bTs'05ې3L[[53BTn}:$h%W5$ĕx|X!DC=u=xB'>:=2U𧦟P/&v)jLaۍP@UR6cwM7@uMR|AiV$Z)VƘ\8③mW"aJJ;j1 Qa%*Q%fF_g0:@G0 lP5F׺B ^TzIq SjЇި8`~`=G:Xx{J̌LIFV^ -4nĬItidH d_R^{%"hKpC1"fG - x:- E"w)HVIX#B(! 75֨EAP!;MliZ*ȁjG^uim5_ -ihyaI$!}fR萼ʍRz`p|.w]Ѳ{`p2D?!F-%DNp[fX~:T:,_CE?lygŶ+Q7M)2DA4(yiDmShɦHE0zсW`Λ3AT {JE&0άr4YϙB(b.*K!y1KX*u.JSzk\DHR.l߿"_i:}+E8KJFVkq9cctڍxV*!`8&,:Oa -l8\ -o/WH\ -͔P(CdU?uf/#bS[DdJx/B$y|bDr[L -@h~$Xg@a}|,*R|*(p W%RG7Ԑ]i1ټSn.:&GDW` >00RaۼgEZz`lyuY/fE 1wPb6ÍM "*8H$p"@G tTBZ ` ,dPi -|;~k+9LP: Ĉ`Dyo 40{,^N\ r@dm e"%Y |#]jEm(S%K -)I}f)ӏ7>&Jy}BkBWZ`=~&VQJܲ(M<1NzCC\4֏M6YsfE6 H7&е6f6#e{M+6fO{-c4,Yͷw6Qsc1cb0Z_jr<;z|f>/&b xdy8},xq45}o ˠ_p3T(S ~PtO2Z-ޭj -Y4DLYA1STV -Lj1e/y3# R$tJߪXڅVPT=ݪJvhiZb@Qi3⩏ ! H-*D˳rU"bY+^;#^-C2 u0h`!RC1|QTUcY]lD^u[ȿ"\[um s w@!B@?c#I>hCNIa}?|Qiɀ< -"&}wrE!hev+}u-|B[c<=^]qZBՊԊa Q%ds]q:Z!cxhXnAYXC&P0\#EaAJBvoRz4Ev2C f|yb@Zg}Y/Gש#{YgcH}$և̕NKW 91=l-ˏ7{0Z?ԨA0|Zec -hꬺ MnY;U"6>lvfU~Z,枑ZFZx(}#/_/cwm$j%Swzji@>25ޛKrǘ: -FT/JԠr+/&Ґ5='|Cױp > }'s' :q?n`K9)ƃp:K0a{$zQ r@ܯ {֫QmnjXn4EځhA Գl*sYl)IHVd؀bEvb*X_]~ŖSu حl Q꾙y3CRM]|@鵉cM%S|(14z)Thn9#^&Z> -4B[ IZ`܆@AS7*Gʂz B_/ȶa\]U%Xa0X3ղmm&NuuQr JĤӢܐdHx# pD^©n (EP m#-^Ao03 U  -7B4#D>:wU.v|- Dsʓ Pd#jnʦl{Z / ѽoˮ9ABX@02"Q#!@AܥRD]ͣٚ ^7Бm0}fF[ϐ@xzW 4+w FN/8FL:bDlP*@%SW$՗@8em;o t> -8i%.)bhbك`#4zIZyǺ .ڹ[+<<-ٟhkB5G^ ʀ#P@*-_E -;OhzX9683ekDL'{ x9 .++`|LA&w2z4ԶvHPr -,Bm"0t -&I/>8BF`ۻZP14:Wb&.N×g* ZVw;ы8[̓xJ ci6㮎ݝj8fb -ܮlG]z 2x>ZcX+25pGV#t{MhthT u&|喜]5ٕq]/c -YYٽ%@n=(80 FRBO t6ְ)$╅[3+2yNGZGeE@֮ (J2 nFK? ΀CDheV,tyr;wQ?pGaDiJ}nSS -{ -ߊSPMBԐQ΢2$S >n>T8kNuۡ4u#Oe*өn8y?A^ >ba Z|1D!զ$ 56 yֹfb -*ƝC\775sYRP`ybרy`, -*C4˔~aO1+ qוj"Frʗ͓b&d2yM_-KH~* -24dǟɒF -X鬠XccL u0LNpZAwCxC;W'@p4"ʏx56%{ Y'_ந 5()8 Ї[.É$I\17Tcj^=X1U!;j$꼔8/&,P\'zy"^klO÷3m,+!YEä[?1V2Q˗a|Fm$f^AD))H5b;őj(IZXcX"PWpWp\-SLmbU5E}4)kuk -IM͵26ij%Pbjt^ĐeBd2Ҍ -F&oWed/YT Y8FbZ`eYh4a:t$"H!Z|bE0{LJ '*$$b˜2`I BHbz$(<Ȃ l!Err1|B[!X^i@ 1#s1Ixx> E$\.BH\((YM$e(rUj:j:on\}!- 6C:" D -4] -@S0T7 -}M03PFbB9!q(DJ -jd,szƚH]a*`BMA&C%5au) -I*VLX)ԄN' 4PSP3 5}5 #wdžfq~).HAJJ@P-4CMH(zs3b? l*:>JlSH t <(DXcFUp7Q{d#qSLC7Njtٱi}0{H+`<èe9=HiN55i,{) ='1i-JV*!Q &'!%k5n#KJF%eXEI|Gt$Jry) -E(uBIdKh:+F)l4U2@BDQ dOD[&2RלJHKf]nLUM5/5/IJi fx>"ɥeBDα Aɦd!UwaPA/^<򎼎2k yFpȢQnL!䡼ʮH#*.16y}nJLJ^J'lUEZbD̦Sc<ӇJ]1 97\_(H#3KWD)PۈMPH.]zDVAt$٧$ $E!DMbkd3VN.U 2կˎ+jAh,eeA%FFHa**5Mno V[fA^i#$'ZP.d.S$QngKbt'"K8llqNӯJ6>XrAThƒ4[$S)zThBq(}!8%In!A4 mBmcEH S5dx()Ց6xS_Y#e.9.EJM&%2:6,RxJ2BZ_#MԹ 0@4\KJQ -S=RAJ&^"T8M&C.F Q3" -j1aEYlvmhBCˉ@! &PQ#i$+ 'LW<3n ?J\bU%$*i%: K%j ûJen:LB]Ç xxբUxےh\PBnN8 T8ϝyФ| - ) 5(|7Tf}Td]QQ0[(631.D=i EAqpװ(h$N"zU5ypGꋱMc/y܎ W/ & €zU/rj_"OFC8rkf`䱃e1(R3#2IO2ܙj"+HkQfG7j̪((4Ub$*061\NjpSV 9(°XqZ"U4bu"eq:P5c A%a54ǤLuɕ)DW&UUUUP(Nbo%:v{\mJ]ފ^ЍUQc+á[yh6ۈ! Q& MR;5eOZu;9OA 4 x@r ӷ?24W2?UkKiUg.8CTyHT1e5s IIbE죊%Qi VEŊ -;"dU5bG%W< -3e5(V\sG.ƗjǚUfugѢ&is*]lb5!FF>k3M7ω'qҐ:3oBWfNEt:Adbt]lz%?ΰ3b5|7O7{U|$2K;bǺ}z_FTwZ#Ql1o.DjٺyI/nc.> d(\%K[.4Uzh(b:I0d #](O(! -8 w)Le"|¿r8E"Q&%H&G#S"h#3Q6E؈U4n R"w*٩hUpM - -\vXuU.rPQlZ\z5cLtM,lrB&=xDAU4AAB5$2Tx6JD7PE:4}/%Q _3WV*=ťƞv w]wMB9`}ٱgrO '歅ÐǏ޷j(ծ< b L.ŇPe:T o(Dt,2SSi.xmhQhKm=6<1͌]1@'^S0+ )P[ӊ_PHUJ&D9Jj2+ڦ@F;h: VP)FNxE -/qh;NQD:M]y'0UDjDDT}vf m/Q,4=CZ o&P4L*0"a`KZBQiBỹ/(), & S RL |R0_`Ҁ90D+@("@A -p@ Crx8DC"A,&* yۿ~ : qc,ω̵kR#l Trp]Kئe$b_$x< -l~5͟sٍ"rGQ%Ų:fI&2LDp'9š" -T=ضAZ5 1!U+,s t\Y PV-X:K M}&uN4DоD">_k]f .,>š?8MWn 9qxes<gTvA*ޞ>2$/p5^;=. -qc: uN}vT:H݀y+)8?&#od*''oT@:F62Ȁ)2Zq=0bڷciY1b2#YB;Ed'ҙZh*-hJUCpX"(vg6a -tcU/i _CzǤm17{sv-r0) e?4(."r@VM9("_8i3ﲁ5տ'~%ڊZjQj6vX( `nw"H!Q'A0~MbM )u<$2 ½h^I0֚1n(i.BiHx; D}ZШf@ N|*X؉ǓKy XKF\/ -MO~<\첷$ڐȽiǥoy]h/Ji 9bp@8D׬s""m+6.GJ:/텉SSسq蔊#`驈f]VH906#wMdkcXѬw7U>2yH]@ <`&8B|^'hά,,Z)++ Ov6c%wb5Ça{S2!}f-ӡ҉680M0r'ιO 7  ]3( Q8ôa_j) ?"M% ]a k z/f :)IkKe$"3  Y(#{c"@\@oZ.^ m)!F*RDUV)5~X,{?)-.r@o;1{+eA%MphW~>?{:H}p)N1oR{ZedDUx!4 "ZmBX00_+f1fH5`䱛.zDA_ c2kH6Yv\ʖ:zN*֚dbڅgp8jRX& %;71a=#PVN!|ۤ._r`2 -\}vR<%/u/ƒ!j ^zLc=:9!yCן +$zeoh3~l, @i0\3hcb9 a8ikUڏA,=C\[Aw-Em -:켢xrFCeInY$~$azΩ>g56V j",B餒o)Q9mK$N  #n0dWFiDr ` 9k}oav|A@>Nx,NJʭ I=Ⱦ1 m.; $=Y~۶`AbהnW:"g6!z4]vd+\?F0/}Rpt&  FU7F[͉'숒Q4B3`"G Xu zu3-B3 9 G -4͟ƂdӼ}$\6R״1{U薒ѷnE,4%:!'.Z;$X)һaR,en䃝-‰k@psA/ ©W`gI_}h2dLv+K_0[n a{[I{s61sR5ZZW=fR-+1dknEԶ|R@^;]lv@Z2?i QE1.Sk4íI=O޿mrbe`zEF?<bPv"Ր(g -BS_q0hJNieOQz ,R~[">xqσJѢ*2Obu18P.8)Q9vfNWH!w3YN]6"չF-B|]W^5CG"* VH|q&Ƃu.7fI$Ob 8ߛD-RV4wL`d?JPx+0ZL'楱%']5n2twId,(䂄F\z2J˨1:!*?@6[$ibHk$@'Q5S70IiBe{߷mY+ - 1)%n:9:}TڟnvgUQ-۾_wgf F @9=x@Ar;"@d]/r*GFgeR¤Ҡf'l` .Ⱦ81?ryP2 S>3Q6 nH!ނgsڳXAXFB4q* {ڠ?{x莝D#8eY(l]uc0YZ${e,L[M0 X?EEuHJf3_`q*W.Ri/\UA=Lɓk3򱘌q.{՛ۗ8N(0;NlLgxEԵn@:uj#*acAC bǚWQJ?ν+3X$tحB)Y 2i Oʡ,0axuIdNw?aaH5Kť4x*KgesN<5QUԶ<#^fK0wQ"e8++cG0 09'N:[v٦o&|pOyoVTq}$R,.haxU&e@1 n/솾j-NoXp N)(ac5oK^Cs68wRYpn? -W㌢*煑71`$<1h~3Q؂!\c3O`P8@-# Ck,|ny5zbb~|::'>^BXӌ]oh%Og6`:)_|Q;!BW") -=>'|65H@|pU -_OYaR eu.ߴDyKk8M0X 7֤G55$y&`f kLB fQk_&:]aXSgx2*L#!֊&(e9O؎1jbw`~#/rz)]f*5enB~&f;!Hi:p]O 1Mڳ]2 -^OP䭖֩+SEn$fk*~@;mxLCn;Ę{b6_V>B8#Y7K'VLftd2dR٧PҦhM)Bj,:ᕽCF h argDN;Vo3e~F]f, xy@RsDAXC(-.M|fjv/;k-_C1GpE+`Bs &4Xe+:QԇVhNd. -$޿khqgVZs?:QDJ7L_ê9.<2@¡rMqn߰8S]4/gEH8l jfR_QJE6"<.4WVYMrO, A *%99>&kB@Q{BUp'F,nI&SYYM'&-LN^uii_1*f.R_!@}W!4/G@0@PN+Fq.oGHɼu#MI 9d-}lD3֪~VXd$궣(!h)EEf.qFO -6'1b~ ;5s&٦+|D*(9`7a)~k6%4+Gݧe8&#q|ºh4b] -}tçN[ZDzF=Ӧ#JJBʻ0 - FiihXgI-gx8!2eS\-Y:JLxO־RgUvHύxL0$Ga럹qy=(Iz+AM?G({ӗC'2G.PV?IHJKɷӣq%2Nnsdk!b1qӲd`O"[,'˦m.Dej `CS@b$ƭ9} D~'pu*C['A+c$4|?9 fǠ1jTهƌU Y= -+iJJ "g"7oXOS+5Mi\oNML+uI]uВ(Z"XU(M" U Wv~-uL=r 9{-kPAD% -~‚8__N.ñX;m@ m- RS%ZSRq\?2~ Zak o;!8ܶP xPgLͶdGlp T11"h *YOijk>/ -hL^EvnqҸldK'\U?sF-(=X0cT?"VӢm2T -X`gFE]zDcv±; [c.9sVQ7Ad\١ۢr o7_6$g.c9%^{d_샜fIĞ(\rf(|d-̺BjF,j cWLۋ 0٘O-hEHp"Rͽ톪p yBЮѹPn[uҚW 8;ՃqiuB-(1ݿxTpe 6G* *N"`QlY|UT&/NqfL s_Sl>Pp)S EhSmɻTԌp Sv;N,AqS>Zc!lHKV`)Q”(@ЖQKu8ōvgPDgg]QzU,Z'y97'5*)ix:EZ~H¨p.9?a9TSrH}WTݥN -<!ysڐm2(g%TzFj\o&[WZ'm+tv.:}D##;ω7/t,q-b%*u= Rj7(WoxX>{' Dg%UE*κd 7<yMz1P\ܡ>nblϾ:Gu=o{}c -G"_~NX4ad]N\ʟM{@x5RVʆmgx̅ [~B!k( -yr -^u2y_\cow3a c/s̋;OI?9_g !-V^y;`˃S'yt\ =Is)Gj#cZw9 "7[Ij>~(4'{"2ݲ品'9h"!oY>.^O4f"{"Z妁M 2φmX`"ET'HCt©Rt7܁C3ZYBaȞzIdA"j]<YL:L/"Ao"b~v:DB;HbY)B΃"!uٻ=|XA>!Op~%CPݐue ɴjZ?CwAAc CRI!ȅ D< -\ -qy=D|^ة_aX! Qh{P~qS9NȦA,j>%e11.: SHD -đ@% `咈 nqDHIDT"%[ 2xtC܃(%'%]KİHY"D, f"UDEhtOkl 2:9?C;!\fg$ipŔNWmqyף_iaӣz.Od,",<EZyC0CA.yخEBCZxً_xHEڭ IG\<\(х.څ4cPEXz u.Л; ^_h}Zb8ɀ( -M vava0ǎTC6T_:BCƈgu(SutlMG qt+=kDȰ#52`ޒEtL B -X1Zϡȳsf$sșIjF48z3rS9QŮ^9WS*/4^<9hJ,F< jp8x!qD`š^8Z -f! ؈J9ẪdcQ }G<)m](].!C<7V t!ްɍt#7 Mh7.ٍ.ԍҖHEt#fKEHǍp 7pF(NXm8kq6@k#/ɡzڀRA-gc̡=I/MWux͆:Ԃbİ}X% xȆOXWc#T,Śje'tڴ^Hzt| 6<)1g-l Is-c{LΣ6!W^Ȥk) %{55؄57Zk1pj\SBP 0j-jFRisA44#iE1g=Js@!ll4lE't}74<$qhJAW#y鲦r垱eN0gqg(gT.qIUfT -'LvJ<3ʌYН1#Z*Gi//cB.ܗcثI  h)É8X'Isdd92C"#j!C&loƮ>m7cu CZcA+)2 W^bp*'!bn 0nrW`v08;XfF!a jy P%_9vA/P/_ܺ" o_pYJde9^D41t"{8ʱ_5Tj92ޘ{+PɕNhGȱHcsč5ǒ}|1BO;g0>2U)aݣCy!98:0u wbTb܌ t.:tQ1r`jrq99[С(\"Au4Bdo W[BCp\ ICk!g[_ѡZt nGӂ;SwlPuZx?g18 f1xh_sŌCkH<6"XD<2cb=&'zaQ"Eu-ذ=$C=D ˮX%tC:x>$ۇh[1Vb~7+hCX?"l*cYVdhL* -NTQTHS ??*Eŀ$PQM -)O~ S = S$M!BBV" SG!-Eu+WJ@8)\4IC!"\Ha‡GQ- o3 -t/%P (Ru(,_ P ! r@" P@= W<|8=QqpCh$L$ķ%qyP""HZ#|$ -Dt!rj"!'E".H/$͊l#Ծ}[,"Xd̹xĂr39:<(ubFi24`S`,#oH0bG#^TpP'-bE̬~DH"X3H"uqC"v&=" DHH0$A$!oIz7$ZPmijCqdԆh!D B\@JD[J$,2k>({F8 d'Ҿr=j"&P@:= y`Wy8ND!]D_pWbӡCu;9iq'"ZIsu!9q8PZ,DZ'P-'Dh8G':Yol7DщzX'p`:J DcNd[mơp5ip9Ȇjả!}kźÉ0k8ѵ< '??NlSt"Fqj -'sB8pd4T9y v uw5Na$`Iw2VTb'\lĚz Okm*!?qwq!8"tɟAJnA l23Xa(d}%9e3Cs( |kp(s(|ziK=& (PL(v.1J<^/%lM8gB nM %Nd/lbVPr\GM@7 -ۺVD?iia5Jg̀@ C (zJ! 0J*xAdЃm Am$æ"BdH(+!(C;L(6GAGbpfGz2㣈1XH0QG~%%G`R y30(/Mz`2e-_()Bnʗ^(*䅺;^(SO ۺzP CT> 2*ɅB*[qK2qM.;PElREOUZ-,}ΦR;-*h]e,4_eRhe#%PgVVX(%(Bٴz -yo8%mqq% -pʭ%^UW؝h V($mx*,ppՅ%̇%MXF48ӋE0ñ|Y -SS,3"ЁEzONgaފuRccErPr- -F -5,r#Pk9Odr -}:-n }Eܢ~- zℳp 2p'.95A*Ƞ Jb`{skLtcDKYC|Y-E%`.QW%=%.a%ӓ/1g%\IԼE3zPB  S{ :(u}#ȓ_6*A_EA1#"%0j+"I0Z)`NL"QőGp Hdab ᴆ@0)ه*! 12a$/b,&u -Ƙ?cAnr(f}usN |k4 ^d$py4O^s@@ȁϋ2*0@L\Sv;[eಃW:E$*upYp@n*ʌr1xM3YQŁa^3m>>g2p3|;B9=7Rgo`kE̳l0:@#5H(` i0}ohTa,' $Р{fTh6ΠG3i/p2W<4fd4:FӨ&Fa>j˚m,nVhͪ0(W"2@C j]{5Խm%عW k݂]N--5u2֜ Žnk\жZVp|n5TP|y -jxSP|ͩ)JA )L -@Qy[6*h6`5 -IB&K6s;nDۄ͞\ 7?Fd{Y#nw{ɪ6zLސ1 !#UZ#)'l>Y `p@cY]P7CGmĉd8Pɦ+ 9GL'%`A͊px GK0Y(T=Ordޝɒ6+GGPr9`ΐFPP9X6@=G:_t)q/JvBr -`K8MB0f ;!$pҪ=)AGa0Z)#ϼ "mutAPM[..w~P.$m,^DR*~6S,-hd__MЯED`7v4-:%7НHY#8GjQ G_g=CL2?b~yDN -Wz0,@r.* S7t%;D|0(Ե*ލR>c~1Ij1McABRb~>6Q XÂDxZ6WkX)GJ-| Jq{훍,=탖x+:nĉ~t΃r]cHw+h 7ggºDaF{ήڇ^0iOW$w@\Uyx8 .t l$ߌ5"]uM2 ;FP. m'"=&$pN[r=ʁC(vVqW]98qKm 4TfQp -T>׻m @L)g6y$ 0NB -4X " JR UBXɺIZpK+`I}S赬!0cD -3QH(pb{12:ݡ#q 8 ^ qS:!Ii #K@ү!LT` 6 d2c H9ҟ -UDZi%V& lV@7WN[~3qG=h Z ^xRܫ(\CWn gfj&0xY]w^YrxF yDx q&g`)W+fLV)4qL^1ՐeL -.#mE #|߅ PbBX&@DŽ@hb pWoDp+8nr`8/(?#AP![|K{Mtm#%rhkJa ү29W/}ʈHb^1`Z{i!37 QbӢ jvc1`)(s*s" Kgq|o -U? -czA_TI -O'd̲YL@*vB0 - Q>Z6f OOȑݗX!2Nf⎇ZAX"/唸lH@<.@m8F@`f -xgJ]ލF^ӕaPn.NfM=@saoqb%Tػp .(!w܁xIcp|y8}SQE\%ÖZW$g;? [ɩ( 3&1u$3D~ PItAN#-o {bIAl"48~ ˜IM'e%b|6c, romzYB#)N!?<^j"*[C@Jc{tc~O0z+ݧ#87)#PJ5̅ъ9L.y'?PI]? Yf^;0ߦ^ʇR9{/ϿPK<3VL6'*CPSM=BM/roW=+D4~Kt3i' ]޿.gǔ~!d^ҵqޙ8DED)Rd?h49X: jON$?eb)kG1 1"ޝ I6l ߃?#-8O>ϞRD//&z98鎋oU@I /+n]ōo:}gfKIvn]'L7%rdUmW/(-'~S}OM AU_h*1XU׊m(}o|_,F33 o>o/|_\={7rBvߒU6Q_囙4}jYtVk"Edڇ"nDz,WCơ5j95Oe$g഍(Eb)G/ -XZWhD壚|g g__AR!ʭl3 -@i+=ފ;gY~Vy6o>i4eN{W~Ts^VU7՗Su^q_ }P -1uO-^)Αп/-K|~zixTZJ|alT0Rڅ*4|j]h|$Л4c~pt+/ wڊ?rgpBa/,>Y|vFjWY|vWt3M`ó y,iBRb7(!4{ {=A0 oO{')/ۜ[kv}\G_NaoL 4R~^ *-Y]p@՘7gR :F{<޷|``\z/ *A`]Bqo8ZH%7gf~V9.+vZ~ Lẏj"+=Ysc$^{ЕH-iNdD7`Njhڷ]Tfok۸ђCbKRYV8dUO\GX+3ah%~=b07LٰAt="+s:b?yZj׃{ sX.qbρU?xӂoswYjezvslS?TV$"I.BY xL|R*nIPك[$?yr! Oxv1'-DDJ\z%lnt+Os.4`zBU{?uNz~P"}&2҈GTXYf3ۂUQ7E`)T4\S ɕ;yH/GDp;]jk-+!f+g EqZe)2U=p$ePaJE,N,<(9dQ)8ΛNZ*,3[$!R1Mp}%`SD#[N͗ž­ ٔ%32N؞E+p@eE7P]/_~i!FW۳]jihˏ?xݓZL-<!h[y(A m)9m*oAR[R({jAy1Fv.N^/ UÉ7 ̿4ڢ6tX+SUߥ%]RȐ0 Z˅R$h^zeDi7ʊސ 33Q}$7Z(I"R|{ij=nV=: {]SbXfm#a(U6Vk|rϋT dFmU{aϚvF>@:?Ǘ5uƖ"<@[~R.uQ#_ i iu@4Ǧh"i83UCƵp| xک1xUC#su5dy% sB`%vs>:aВx!Du<ŇyeY+abXLx# ӵwxҸ ` ,x ~ox, [xs>dG})eL G/pY/w2+؅xqL\ %IqOG t>/ǭ D飖 tȨPjS^ɖZ0J Il]tF:m b}ۤW@J[VIC(I0DtrBayV`Ǎ0g%j+Av(0A7T! E0~8TDT$i̷YK ,8  v oHW:[dj#qC'Tsr}~鹠")3ӡVT&+yP̊y\BsݛWH>+"V)A:m)a=%85ؗ!IJw~p_7} ۹8Z~!$9 ,[cqrC -I4ZŒ8'&#j!oΗ;nnpG(WZo8F(-l.hj(^R!so#/&F#5w j夹w^n32gS%2M{˸b -1~9rv[#kE8̻ۄطu}PEK"\smQF\"NΗO_0;ڳ9`,3K1ʗe®DP|fL{Q[I Q2oHLePhl(*Po(,pO'*Q΄`Q䅷?YG@@RlM!l~h'!Yd;ʘ;l'% -t?o -A[;dhEW=*{k$F!H`dCUC\I$xB7kgg'7!L8($LlKgK"z ̣~MfmgI=9R@Jm2L\2CmຒE&v$˫HoaRa, Yp{^A|:.'iF>'7$*6{#7_݋}\SEGw! -7y/є-#okˢ@H}"QF߮uJDm[{\B/Dw 3W -H$3 DcrB4|=s ] e{XM+s7k񏽻_)F4蹑LDrw3(ۤ ڼd\[޸ қ\/4P#nB'i<іTVہn2=,Ͻ*2uwv*yIGa]~'-Sv{bd<~ݎ  -.zG2nH.KaOħ8:ĤB(϶~|@7(vU%6g0 if␱f\%917w^;|s{p~KMω/cT&%>r:bKX 铖6*mDV`֒.F w8!1'(VO- w 6 w,7jOq;A;UYp# eHS@8G ?"-(Inm ԕγF>stream -d/ 1?ꄏ?nHn-_ZYFrL#=Hn: 1F;dDKj -*Ha'wTqۭd?n8gCMsYA;q;<.}GD'-In_Or]YJ@x!DܫuTLuQ.hr.Сw$7bO~{{*|w c %VJx)Unq|4`z ;Ub{>KBހL n^YGZ62(Dgze2)Bpl3I(E;"ܨ%x\/B׬=m擙k~][W{d&uA?s} Egw15?pAm FO[͘sΉyb?O6B7-D{tWU]h*~k*R!5ٚIW/x'pMWtΦ%蛽%D5bAۃ\XbfPn)~#Py'Ɗ$'2e' [8-iC4?R#;Wmk$-"[ ?6a<@@ R`T,v flbko,؆%؞|c}R͞{*quK$q:_CH!6e-Q2px) -C8]k!NVVs^ N~=tX - >P="[q=-RMCL\TǨ#~=WY`U`^{n=af b#95 ;OEی6XSvmT{C-u^xn]+O)}+H -a┎c -G[eg7z %.%o{빵B0-5_"xXkԉ1YKͿ|0Sم$ GH/:'ւc"'l [ [Z#fzs:E|¥iP9Fst9BF7:F/l$`Nj}ݖU(d뛮01;E0a^oPjMK:SNDK"%@3TjW |: f #YuQĿ.|zcx̱v9a{?H*Bȯ|W,Лhaz~D_)+o!<'͛eznTUrpl3( - mA\*0[*58Dֵf;Χ.Gf_~5n ޑv\PVIq"tV2@Cz`.FgzЉO+#Alf㘳 9CFekRLa k(jʌB]5MK'*,Ԭ5I}HA*T -pA3|P_ig'5(w䝁"SȲ97_b+xfh $oAȗu*`v{sdҸrxٶ=R|ˮ6粓7-Cre)[>~Ue1HZEI;)]G.NtEUi{xz+t ;3~Lh8 -,ddŎșwh::V9 [WD_e |:]+Wӫx+W'^VSyZNR-wn8N:O OGFyDS73 9N!fku*{n =Keg?5AB=#m1Y=k6hghswWGLIg7{eI? F;7`ah ;`SGXc4J(UoA/]2s<.1q2,t>+P1{ X9n1JyBt*9@ED1*(jҥ&D#n-.Ӻzgf4r[Q_?@G(x꣞K^ ƛΐO#sEjvӄ9V0z\IQT3%=n$8it4ŐuIGCɜAY)$n+*(ZS.tp|0mg7#fjwjh^WMŏ6?*]T -LY:sӢd5letDSiD/&?tZ<%Z"p5[#˖cnKZzl5:φOʋx:@AΙѓN=ISJU*;|XNC}T#TWbx< W0Uf_YM!٧U!L/WlZJj"xXW/MS* !=a~- dk*jM|FR_iEDZfVje UhW"iu.Z}k=bk磬u 5L [< -\ 9'IZUByy -"'_ -OD]m -^f LlLk/~2jYi^ Xm `F[%⽂Y"nIXdy F kXӇ=bSI>r.X^XX=ѱH>來@`vE -\}NdEJ^* -` [05FVo.D^1ZesԬTl*9۱,ɏ{ֵxéL 1v-h'$KmMl{x>CwT[1վczlmLȺiyQ [AWBM6dBgHe{'< 46_&sKCZ|hO,!J qXoiomU\q{k1o})v6zzMq.qAQ nfJPjD5NVO&I)M&le)!ν?kCņ],pẂ͕fo7uNі[3຀af`2":#1):dhs7+݁t>xa# *& / -gK1yr˫9'ׇ Xz$`+WEfEYMO^f|(X߮|ޫ&_l&>k+?w}s-bPx}a}M#0uWD"_̍~ FĞFT g5Y٩BQyֽOϋ!BA*ƱbڿjW^BCz_ekoA4p("eV-e’ x?pWa u̠+N&hw[:UQToN UT| ҿgzݚHk?{XO+܌ [G0_ᰟ20οf U\Ր[t1"@U.2ಫ_~c+|Ovh49 +Z=,iSvAΨ_.8Ū7֚wFݙ4b 0#E̜=_,3m7oǞOM_ɐ;,s\A~ 66,~Uٰob`sTAy U_,lo =˞E:GPBQe )H?R𣉿oz\bE`ݢ|(įTsߔ=7;o wb'l^YfaÛ/3Vv_#GW@(;p7= -ZF6DjX7Yrqh/ي=@& ur>E1b/DJ+"3T1o^ `ù2:͏}Li}W~ ѻAKG$?w.G(~ cB߮feTfq~4sP=JPBr~[`MCeN@3%@0d1I;e>eDb+~?DMA]kq+@P#)~ulNH?F2{-AѾ`WW;ܴ} I8S/J ӿPN=A ?ȗ|!+Ƞjvu:A~ -W,zhl?(n\o¤<lk6@.S0b^S:@.wT/t?-~eKè)on{8Xa6bqe.+8~A @ L.qփo]UQ9qoэ'\;v<` f+E;<90ΕSKp.V'ߍFA5F$" ^З7xDv! -E6޴W. g*jfM -{b WĚ-D6Læ,Y]&E Q"qvy4gZ7tB;PCXI1Hrq+vh| b-v1`QS"GI>km)xr qPx9F|}`xeX~xp #1QdM141q$A#N{Oҵfb\&' %\gPsdNG.-׆0[wljo-93ر%3؆drFkB| -Ӻ6 % &c=5 -&ê@l -v’F_`uzi)M&U|ɜN(U9''BIr bDZePyD+زV;^ej(Z&-9FT9i, +7 -q@?OgKl$29mceNrhf&-3'6 7inOU]&=)JW͹utk*X|te-X윕tVڒݸӻkM+4lT`:j-8. grcu вP 86fjADv4 M,,}:rׇn5F(:t#~&Ew8X Foܠ/E^&ȳj?)83cX9^fu +gQꄝȑe<_\,tglZKKoȘϘgtnX?4jFpsyiPWFE$GrJHZSW<$6"AR>I\q&IH]/CU_t؅U%R{"L+>R Cm]#!;fS<6ԨKX=/5jecЬQm1Fg N1kFh ͐Fi^SuFVmQK|I^8wg2EKؽQrj$R\ͨwj ^ uMQ_|qGҿv QCy?"'700[2ھ bS}CQ6(52iD&롥OecMԥ1jE8U͢PVm2 55dwHԺsqSH -AuTڪ9O:Mwe=zNx ODO {O_L{?vm1a:1(뭙!vӷ)şXg\i\yz\)G{0Bi46(2L?e= Pv|zŞHA llˡڂrL0mJ HKO*zJӤ:-y3*i+sp*\>և %U -fи9u:>=}i~ZŪ6.C]я>g+ R{_.LEMwd5V,m^zD1HuR@ :0VQ\zNbXA~eT:f&Zm8ڼGi,\\ՅZ\ 7kA{[ȂksAC_Gnw@u` kYWQm1YT>ij5ϸHw{}k[~{+}~˸e-MH/׷,k<.EKY]с ? l"Xƺ(Vl,o5) C^z2eʺZu~JjgQTGY ]>dFp*vveWPք;wae4QMBr'E d\9Y I)'kR a&^I6rzYؚӅ>U *b=ͱ[J!~Va!NlGOfS<󍰳/v9gTŮΐvd9Ι2զ:p@Y/KN?#m]mCg4zvƶؿ n 7S"lzć8n :]r#L L ٌt#'9tcYN߈&n2|6X`A(BN-ǼөWu]fu^H@ztYƺJ(g~ ޘ(0Cx0ήǰأ}уZOd.D-e.2TN 0 vŏdUwoӂ n\^mJGqoܺ{w/U?9])|'wÕ[ꖏ ?7 ?Ou,#)伱/S\>g[A_7A@8qB^ѻwF>Hzoj饁zV&[H֟yݨ"֦F_?j:eFq̭_a0ր}2QaQb?lF%KϘOm-/"7K.6r/ *˰نXpYy"LՈBc+ '=}DQ;vupU/p {z‡AH -U// j?A?N]!t //|DX@(׈2Zԑc/ܝ.d"Ḡ=IOLxLK9JDٶ "vf֢EA1yڄJ;M1/#*euc҂$-OPuLB= 3˴,)~}S@GE^FcY4Wȹ] oyBQB#y^@6 do117n$܅+φ% n\ GK8_$`(hOˀeKDF3܉kkcyO&BǠpl8vڃZn[u¾kPkM|lh3#G@(cp 餋I6>JuY@h<ČͥThH>Y"`,6?LwbD$?ÑhrŶ5{qB}ux>Sl#XU:~bsu]qۧ͟kuu{D<wLTM[oyo~!3ROT ē^ -r01" ş] --=xGF ɳwX7f;1vf8;K6X8t˚6LOmxW](Chu2;D -e5tkq弌 X0z';Ijx>hV - \@[D:#}ikM#Ne-A'dVKPTqM}#ķU){?5:H鵟D FN7<&P}B9n{g&9쓙k98nO]efAZaW~#n1v~h P<$ @$o -+X؟F$N/[D hlAF0BöumXay@%McW*w/uShb!J=xQ*e7q?k=2Yԫz84i: w3qqu=&9uRT -qs4MbX!ܴS4 ŎĢG@bF&JǘzjZ@v/,'%- zdT,$?mwuwh!7jGgcv!ՠEUpT -&G!HhM!I g F?÷V8q깒x~-wVB}~:ݼO$x(}ø;3aa7yl 3)'m~Q{X5㍳:mB?ç6QWѹ˕G :h:~h2#mvg~JM bHV62i.&k9>6>;5CL`zJ9޺ |X <#:`:g9<϶|0w Se5Y/m#vQ$[URkՄSzDwK2ՙd eM%r.F>ӵMu]"h'HؗD?{{ EG9 IZDc0$tnB =R$j}.Y̳FvGP"G&5}p9EAz74xn?zO7s'waN ""I߻21>xXž >Tif웭b0teZIA-X#, &iMv4.>{^/m+ ^DIߎeYՆq9a[ ?rE F&?|4_հW6,Rh'^=nf4::LV2|i1xe;2yomKa sel۝ź1<3y&PM9bf4?ɴbގr`M3FC~#uv=O"oaڸ ZY7^][YZ=,Z-kB~K_;ɳ+4w1̫{bQk=LvөV |O]>x4mN]} aʶ5p3&g --B|F0@:xt͟[]y&Opbgx:A ;T9lP}q?jO=\MD)(TgIAv$ߝӥ2ukL^[|~ӕy{ǰ%?|M#Xw Eq0$tٵ( 0!=zgܱ2wiϣ^C[Ḥyܩm,4 a%T%[/-#rQ$㭛T䓆 -q42y5_#qoᜧk0udۘ<3l;M`689F2b~+gmgdEڦVإmc83:ƮL:sQ#AϠdWb2yhb7 H^]me웽}aYlܭ#edL{)^ضb?z|G.4st5<& 9ߺn3mẎIB豯|#:kfsaȴ1xi[;r'yv"Kcvj'T9޺oi:kW#08KPR)8=M4j0m!I@qsq]!ʿww6o?9_*!h3 E|l6o(*$NȱuΓ׃qse -Q-4 qs}OmqMb'yvR3!9Kx# Tmܸ^CD> H@ӝ=zA~#uo?xv\n\-m~Y,7;& @|F6cK,Fg>A~%`M9XmNc 5E8 J>ϣG$u)>BOGeE"ݗ;aȶ0sfbb˚}/kCgQ yK/4eֶ0teZ::?z'yz=3|lb]?*L,z!zG 8o#kN]ILFح3}m`D"vbC;;W'k(5z`j ?|RKEIRU VD^T T;[qq~,q Ż/g] -EqsP Icxqq^l$d/IJ_ -Fzl8~2=j\F >zfoô;:{ k?r4mżԨw 8^o#cf>;=7`S( ߇[͆ȱa@Zh;?~_$y#A[Ila@|FOSmT)x-=bH ;[m:4n>;[ss%=T0M?T,lLB;ikIA}oh}qc Uh#m -4zk>ΌQgqqVkkv6Hi J>ٵBdN9mߺL-TR~(; 2}j\}Aosh,& iں |8ݺNWclv5~no<2:l!|5n}Z6ZhyB;/'G&ôrL?zG17tMSh.v :"^@}}ǰ5p5Qw"sBot 'UDod9޺󵫕@~d z>vi/q~"JDT0,i6*AoTl] -~!ȿø*2ú#}h7P?J56@~G\g(!>[h0}!F@[{i|Nw95{q]n?|זh7HhLmMLmP@sЎahGr6 $]kϢWHݏ@{ !QvQDȱ6o>ȑ =7gH&ؾ X2f }l-s+wI}BWVqY9ݺ6p&=eW$ήoꜰcXׅ&%w* ToC"9]8:`nRٵHjP &-%B?H]U|C*D ?P#zܳu -|wxb Ըw E>}PQ -~Ai  jhY>aPإ5pu^)7q>Kw6?cmg?wd~1td4[ۯa6L+Cw6oM y/ܟ[n} 0wց*Ƕu틚{a^d99;[y 1>IBC.9ݺCgjltФ_>yΡ}I؝R (}6mJE}=4{Hw6}Gi꙽k_ʶZvG\gu ""tOG#=0>V\~@a W )0:P1 wf&DCrQ%fc5.>P:K<.ax 4nc 1_8 6\e8 ;71AuX =`̺gPgS!p5n<Q*qxZ%:+ǽ"CH+ qQe B Ap\v4ܑ)az!RgS\p'J/Ic 8ٹqbƮxrwrLD\p~mx:\(? 5E'd+؅XxJ Wӏǯ]=^?#;4@a&^Z - {LF=a"d҉ 8/TKY4Tn",AaOI#F9[55 ZAتHJ;6=V/P)CO PeG@H TD$VIx&Uěbp#č8O0\XA0p#FMq ć81/ WI91Kld~R0 N؜D41BBd1W&%ˎx@f|@v3"ܺJ9De ".UB饷K'2W_HU]0[]PB9-/<#ɔ[ rHXoL0EibH T4iy02Ɩ2 |r 26"y6M&~M|X -&Ia%bjIe~MvL5ّ:$7$ҤkvZJ]H$!Hp"JkGq.\fOTBLb.0<8rDvc싥 - HqS $sȗsHXcfcLD TH~M|?%Bl(:<$CW)37Lq+eW.^ 5.ذ$la9hEGH\~tr62>=QPq/%lEUԁlr~|ff&%-e9YRZJܨB'gQoHuT523K$^"Jh بբv-r.[;'=%)f>){aYQqmia.*<טU@E8h0h&xi&)W K#3&[cү I?'7&SrHL1M'%uҶYEY*2qLRxcK-wbWn\_2C`',eBp p'`O*rTOxH,VO+] `gT^EUDM9;32$\-dM8[!1-*3BH#~IPA xG$I?%9,I<4id!祓@RW=Q0cHI<ōG;"?<7ɊaJZv{aIRUR byRgָ ?bWVJ6k{C٭IdB3"rx e}E} *XoEĀ?:ӯ)[6w]w\j-Bh1,3M&}E18f2I !QId{$UI"&[,*>*1ugڅ0ɔJYS­Jn AH-nͰ"wak29(6lX?4 -E>W{$L~"PFVZgn|H.=.uvX# 8!V$JZ2C@yuJ#c<$l" ܛ+F& *&q ,$BʙDٯq0 PEU 0`1&؊gƨY#KwM$[=(E8(?ʌ`hرvH™ZѨ`tɋngdm'D-WƤ}VFFsîS)q:rqA^qxVȓ2?'Alۊzfrÿ=QV}KaխZ} JU}J)lZ̙%m"|$rYJw ---¥Nh%qQH1,4@df%* -XD.i[L{RZәCTI;. ;PH0 g`d>xpߎ0r=tber `UKs!~)`B@ -%7_ k|Dx7>DdPf 'os9/pI aEj%Z5 &Mqlu ٤]d ١kI檃*V y;EИm*/JBcbΛRƣ2]j1V^Z),f9JHfQfx3'+l: z̊ ~r R nUJeMTt3-E{]2(. -lJ#1[5]geHmv'`cKY;f7zuYvWl[xjߢhR -] eFf%sȠ ?VIMI_>9AsrZ{A9]RJ TPi.djFLmr\W?UuOpIo!,%z[\m>mW2 - 36䆴0+Kr{?A2b] 1Yrֈv9JY$*)W>.&(o*ErB R%:%DV?*bn욕<,`5KA-W WHiSJd'@l<}BO % b`^WR;Zi& eRJ,,<ٕH\?:Ⱥ`81zhc0rg QB{gx [H} 1SX90k5(k+j ╵AqQFV[J!!ǖ̀F [X6[%m?q^]\&-EOL*-~6ܯϲ-00N (1rBaA +K-,)OقkJip%J:oHrZ"$sV.XT&e{Z{A9XA2i*5&+2Sy)uH$-nUO^t4-Eb3D rr]eE]GIѳRF UNγ-J ϶D?2',z¢m!QIQkxrJG9WH:kؤj`X8*=Tj(r6YXfThy j+}Jh@@%-Hgu$:ygrѐ S"DŽmoA.1,4 fU Πd7$Cηȕis6FL& hrLJߞg?6pNSaȴ2}j:7 Zon}/m6|8a$ÞA}P>DiH_Do0t my[I@V;0i?|sЎ"pF2S."֏YQLZc I/eb7l}iH5 -P0Pd0㞍9B5T G0X4vQQ{RUQ N~G%>R O'q 98s0qN!]RG`TMƲen f,h#Λeܴ4ms(aM_l ^ڼXב>~ -G6(4k"z KJeqiUò75jN>T e"J)P[ϚFmEXU#S9'@XR"L mA jXv-4 duf!?"%SpTnv2uAş鵋.x -N8F0@RDTZ@E/Eb'(h$Mi{ U}ZlyK& }?Sh74* =T CcsEd/ #WS -ahXS/P7+k#uh#9ZA6FHGK> ]AǺJeR5>m$}Gr1j'&>IհܫX~Tz5 eT~~R=JLi FB# uT(CR# Mzʄ?Kb[3p R2nOW<:.CgF,a/3'oV2e*R#"BF\QP{+i);xQIMp]97];׍.4=)c9Z9Be/$,Ai?j8|%XZcpӎ >]iB|\([DQt\E: Jc}>QOSh;`xC"NbfjR%*M ZDcGz7Cg'6 #!3оz^a7AQ#ڀ4WX7{쥬C;wϤMG/HWWպCѯE#=5Ey6Z/m; H?QI_0'n ȧ#D0U4&*̀X T;(g L>?);#$!tў㓆JEst&os8r L0V3(=ɳ0inP҆"U{NB{OzQ9E"m~gڶ4m?" NPe[V0(ʩ$t~@ò~*X7k--;tvУShu -h#גFfPDgZ;c I^GT16S*"C;.cFܬ~bMpu?o)ߩ4l I1qg5,LWcA}|#m;CG6cݾַ>yA I[s{i?9[.cϼC(9TQ=H1MI.<ʚC-q3zm4P#߇JEF[Ym[˾>al(*o=q9da]nvWH?|4ΡJدXP =NyDoͮ dI^e_{0]MFh!ʿ?dgocw 鼁*9(|\\Hg+] CPFe%rO?Hg2zFo<:%m8 DR&Dzx5< o)V;EZ[c>'ٻG^Ag%Yc蔣F,H?ϤxaRPmmԻC4hAqopQWp2*{1IU-*;2=A Ǝaۙ6m(a7@""hFMܓzmf!?n̈́"h!J@Mo $WeAsQ`2a؃&i$oP%Ue d@嬴)8uG)S(*E>6ѩ'qcոVbFg=?Pdq0..;Z# qkst[a c'Ti$~0}.% -RLEjb}ɪ6ʈ͕ƟsZ` ʲͺIF|.'3U ZJczZ_H2JWhR*X]6 gSw𢒖Y(smnlZ6ld5~lP%žgY2|iX8n6-{X7̝fkx  kd4 fؗb!U-.* [ [XP&n{*DZ.ȢIAE`&xElnǰۖtEjp&,|70)~KvVZnor΢xG/k RJe*[,%I/juA|i6:NN,VYcʲ6: 掛YH3$p*]AAaA!W}28;8Ȩh` X4V8 0]M HuS3& %n@4%!4Qv)JUR$QacإH^*ƣ]a#h44̵_  8+ XV\EO4ηNn2 {Y+i¡U嗲Ek:nwwLW0?~[:41.Ձmi0/Ǽ8/C AJw Mq*N>FERqR(Gppn1tAnhm<~sQfzXf)t9r@IRǽ賕-!S4,\GaYF+*h0+&f*ۮ+s4QZPy ?z(SP:8#~lӍX]ZJ: %0}*f\=Ftɼtpkn2 8n iVrQ-mƬEGmFBBQAA)Q_jN HCZ’PY’O ʙsaoo3'ˉZ+#ڤ/=5Pdt[( fG,=y8]ǭfc|dp)7(vB;~ɰf-Ϻzp 'tsOEYe8藴,!π5Kۮ >y5ŎR1@2`&h)'8IS٠H+$kQVX1 KLi"AG/hXsJGXby:*(h [ Am| Zs8t}GgfY[G4|G%lU].q3}jr v-xΤ?1lZO=/BR&l  BDYIKؕu8r2-2 0ni!I˲ؘo+\+7d-+BeU[st 8@@}uR藆8_؜3\NPe E<F8 [FlgW]ۏ6 W:9K-üxYkMKX8q(};zrTypS/m/,sH*g hVH ĘRuXWZmq!g0U"J i9*e*ۮP -,J_Rbظ?f|ajǥ<mR>9aiq@ڗ1vX؅1 -aq9 jc -BjɨۤQ|Y((+kO@: :5}G:-&\r{x$f@UkOIی0+e$*,쉴l' `]8 \,(pV .p8ϐE̽,L o1<̂BOL"A@blLl,L!`Xh*!)GR0<%?d)e]]J RBx^[Rg2sWH:5!1L9"żJlSktˀdD6d X@~A:.sY0Պx\Mg&!7u]>17L h.[1?zVqB"F'1d ĭ]|HCYέQ6M4'%[!M:&j$Jm!4Z(#xw`6!XXa!4SmúReHhv.#h MHBL -8W~@9ˀ-( -QN0*%!eRm+YRZeL`2Wsd kw[e _oTFYj"7ˊq4hm1h>*C<'5& ^l,BO>Zc1s el@l+YE S4ZB!\G$XlZJ;2& Ix!T&@}km`chJMu_ xKw:g*w) b[_k;GGR˹ް^kIe-x݁z(DQlnĊpECo،^XL]&cXx`-۰.u.\S7>~!@Dða%^F2,!Ą"Y1%K:N;?\'~3KǭaC܎6\juVZCnV%wLǐ%IAcИlj{tX+%&bXn%76@ŢV#@0%b(b4xHXܸXmD 8y<L+7RV7x34HgX9Jf <a#Aklx4ŽF-rY<1kx;2KHR1;zf®AY )pN8OPa -=6v-2@xLJ56r_I:;[9N=^+;FCx oc [<$`,䯌>^Xv\ -<,܊-.| BBO8@ܩ&qñXMfЄ,"l-*y$,RqQB;J1gڰ9#Kɔ>Idk6.Bƭ #Xb }+lP@OIBZwdqc%^G6@@)[40^e, RR>[-np avmqYx'mZ~SO ? q/}{vC{gapst fs+BRR>$Ť\1?( qW>{] --xJ׃1 IzXaKAF &׊7~0nX>K%56jlKj\ÂҘuN,pwePn0 bRDi_("ZDBP@p[82!&b#"n@xbt&/fꥷH]~Ꮳ|؎|q+`"+c&`SD&V«&W9W7Cdj:砦M3=bZ 2k,8Lx$DC8PMQ PoAn$"\0V - -i$Q@wKo]2,<^h.F^z:|Gn|1 -|0Rѷ3cER (eN@0aXx -BZ&)а,_NF|j'7p"NēbL!=:3v汖b EHBj '"PN,WTIT]"GYP 76a<% *`fYqNk︢r4'k%q@HA ~8&<eAq -Zא %~33e HPa,dܘX!)ls1qag j3 qaj%dJ." [`QJ',aDyRۢ6.)(0Ip'%q,##UijVT30 OFCZj rpNt lexO"TFF -.A@tpI$U> jz}븱#QgeEEV'kqXָ׃q Fc:M$`P=c \&^FE78q#" j8z2% #,?p#S{W -0f -:dh@%Lb9(DF7o&E.4L`>ޘ,EBgHC-7"va$ -8J&֦{^ -O<ʉ5hfSM4q q'"> @Hp& n !M8B(pFFPm/DR-0lDsqHWo8pT JGQ x]V|xKXq I!p6aIHpnÃ5& hsh7Iӯ-!XP?H95j%3q'!98'Q=p6&5f,=x\CGB T:?w@ĩt"Z@FF-gl8 ⷅ{+g&xGLo74 $q-cwGI0I)45r7≚vjLbnK3der89~s üp,Hfodtҏ/ J#D,ABpN _⦉PQ"NF!D™M2Wa>di 3*L6`KͰ8)?"Á851<p>02pι 9[ı8q8ؠ7@6Sjm%qIH$Hjf"H"74 m먡#fa_248Nd2 8䀹Jp޷3`C p_ar_axmXXS6rp.&_0.=d`z})S53'L7nlf*Lҗ≛eO Hb\It Aa*,Q5B._ üà ׁ3^qPN@BL rYz_+#tet2$S5 -!K]/.=LtF1ŌG 60 b{VzuXU6V펻|c.١#xU q;pNkx r9X9s91|pns Xi8=q)#)FFll7YMc:s:N[VV*,*)-**,),,XiVSi[kTSZYXgj XmU]aABҺz5euf5ue6vv BVՃvS:>ha5UQU]5ři̬42kJCC[;{TZ֔ZTU֚ٔlg,f&.4:49AS*,+,ZfWkVZSghZZSkЪִIi qQUyjД L)B0;<Z-%LZ)طYh=H$ =NZ gMÒ*@Ò^ح -:E=20.$;k/$Hު@O[IŚ0_o ,==?zf/||ixH= Izn?`jhC.Y H@+ GFp8Vu0^cߗ"BŶNǸ\֎WL9h/(h)qq> J =#AīqR7~ޝ@|A uؙDI(7o`lUòC&~?9zI԰[Дvp~R$$&SÎH^9HÒ)7L_fhDuWZWDPiMzK@/$X;Lbgd{+&?"z*VPe6!uB(~%/dV-#Eީ4$z4ZՃ[GVm.'T^O:K89Wp rT'"Rgqcs)#-Nf}[%NLz+6  zf7$S+U)5| y1ޑI̋7r5Z-T@XP_ǢaC»OVyOŸ`Do(Fz0r^ bh -Faً2ɲZ:LW:^-CFMzF/a"\>@'9l$L ŚAe-)hJFx MD5)CqYO IC9k; L8vA6%mê,8Zcm)G07J`Sr_;F+= LŚ0}~߈rО:heW=8 3SC^cO`DhW)X|$Ø e%ߗ;mݼ7X轒z CDoxQFYOhTm\v#&P"Ķh$i~~B+ggiz=f"5#0q8cw6nuf?*k/ ԰L[-F9tNnR sR C@iw"喵4yn5hI_հMOFsnV˵^`lź[oa̫~)Y1qe4lpz-T_eU1mDA@EdW%:wD@Ĕ+]a.F7.̴HJx_ &5TRbPuѥ9Kp?"Qi2!:&(sβYOV"lDz5lجLHv'S*LwR3Pg_=[.~!sI Pò mUzikoƼUA @7$J^hG@I`\Yv.:\ٖcaswCbDH2A|݃gl"@{Ϭqgn :#~tz+qqX:< 2$?I>#aI2rkD -:=} HZKLut22ZCRgsZ䳡P ~҆R5F(b1dh[<8i-uJ{AůzD,F.%*EFРw$n7j؛J {u! PNtWҎds*& 7tM \y<V< D؍u{#f_IJmML{+]BO%D\PS&$}% y#J:v`z*uޟcg/D)5G" P<tUd}h"7@ p]scdl[{9ӊݲNA4hf.^p"U -QH2Kw@,; _A_4M#bjM \DzXW@2*LLx PJosqAyvm4QZ;6 JB,=I[c=CHMц"UJ^n$o<* ̺){94FImU@_0B7uE6$؞*hC&vx5nL[pmUD ́ < -I++)=fO$qcj C>, egbѮdTt~01&p -HFestWQ?GgmEc?!I@_d Jŗ>:0 ȞFd D@1rd ۜ}1j{l+ ^/+HsN4|&2pKa#JB[j6iyo=|//'u~*栏KovoM6=z]ڬ#=LWT_,>5zr5m&;qe2GKp"s65~o5W)Rp GYmۗYy+iZҦFrAؖ`Jޙ>#gضZq#in"G{)Dzx5< oUE&k%To` IAgStnbORO"%zK2HdF~e8^;钐u"RڣRc_O(>Au#*2JUґY_v#vאQ_#7zC}IijW(P)ij 颗 -:pХ3uipz -lFosN{q6w;}!i,Y9/0aBl-CQ=`!sU2(gK@R Pc ƥy?fbc:tުe]c.2yf2`|iٗ.ƿV͇q/۰90BUV382.k(Dpu)? ߠ2IhU -C_D 8B-?zD &陽4?G#CA~wm$95aK'l=#ǭgҼwGLwĕ2z 71I=2yh3pc8"3ziu ̣G+v!ԸJ;:gx>_,u}?:rG@aNB GPiNC%ȟV>J^QC;ˆf [mC,4}m]y=ov5j Ǯyg8,,);k;t}ۯ0=?aLA6ɩI) 仕6=zG#f_h `ڜ=xh4KhZC(/c})^d0l ?zm}+c2~MmF`p10ɺ4j %2U}<Η>dTv%/cݏ -QŪ1i3vo9IҧV?{>13Юt7:;*D!׊_7s;ijnq._eZZ+U2rm= . ǾŃ:6.#t89HSU뛬aHR1.k]+bU&|zw"Y$$g E]Dz&Y -887;F[ș2rh挌iklZVm0HiO:ߺ?ٸiصxnA~sd4'gl-vͦa?ؓb[Rz_p"JUy,Y6FO-K X_ȤxܛRS %%4W*Hdm (ᕔ{pr껎~+}Aǜ]Z]S._j-6P(^CT6]~)F ?h Aˮ} yb,MڬUk`iB|Ի oN7Eچ0, KXwM!Z&dbNBx=R%b;kmr1 ^0te[ʊNxH\PXT\Sj.pdD;aH{za/O99;Fά(8_{GLwc-L\mcд76 [)Ą&a~(֧TDţ2xhF 7}mG;5z8p.?}^ZˇIqs4 -L,o숤И3tmkqѠUNBX3IG8zPP% =RSÑѺ iu%$γej<{VkuvAE'ن$vj \c<ςRً(eyEou -<'.$R)ms]{SVYvOI@tN! -XЕmeд9rsT -EZYGT*gj٩4<ӧFü;_<{ h<|\\GeUT% A$AcDR 0H [_LIUl|cY݀}9I]B+:I!ɧգtzNgQQJ\L›^ -%4=Qu96Ϟif%QpX4r0^ dmՃpdԶ6=uߧQGrX8Hw [ve;vu#R/m=010ݜX'LEt30(!z(VۡN -QHNi)Oi#Ľ>_t]FB?DL숪Ub!i}6,։| )&wWPĺQo(j!YSPb0DNFY -x^Ik QH J@-"axGtfD=jb6S@/dכV}+Ifͅtn ,ض;;=*B*5N] HzqtN8;Ἒǐ ZDbJFt KL=8k/#Z90p:Hϋ%Qe'' PmŮYHFԡL{.bM:a/c6tSĢt*?zo9_/dV&lQJ^nSIH&3ֱm^k}{:$G=b~\Y6H2΀eg^W %O#6o(zdxj^V J)TlȩͼΊMF G`܃ ܂ \:lMq*fĹR.-aɧ %"|HiBDLÔ)Db=&cnm%_jxS1e_K7]Э~qطt\_YXi,% cζ;x4*sɪsf3@x+D6f"O2:k$ R4~ @B-uQ-Fx纃 {ώ`Ģ |2zfM_]izڌ=Znc0m\kЙ|z$ϡa:-69m OLg$oڝ:G)`fYhԾ -aH6gepdkHBڥF4"no -5P1we3`a2uic/>Voúq>{ Eo3{9ۆ\]kj_Ee Wx ×9gd8p4 8ɳXP.V&[*{P?`PT5Z+&-tAYOS*"$_,IHw²n" K@B?hUi$MEQ ԊyX - EE){ >~q{%$+ sKhJ4A~^lƲZ<9ȱn,-0sl+8w̋u00uV/-AXZ ^жjnf༣7")D?+%±o3dIxQ#gh޷a|  ۶'FS(W69mtG$1wgۘ3$Vb}amӍ_1ɽjF%-u‘^B(  iHAg!y{FAႬ8Qq+i9hүf*{̿qprtyLk -53~h5Gha_1ygbX;em!Gle"eY\k.ƕ--,ڬ ۪3.X>:HL[G<&6QDi}Sv#{hbՂ0ˣbM -4YӪ2 N8z(EŚTjY'u~̝|SV#0X+_dִ:u4_}89z >^fM~P!H/TI.5] l5Y~gl";Wҭwkjn+%ga\9JZR-.!d\BS.*$o?jܸpMԈF!J?5BwxrZk7ą 6q_ CgŮm"~ %d}!̵T^sE͏}1nܬch7yI=Grܛ> ׇ.i!LS^R-D]mGUvJ:kɦsʒ"bj{: mdIIJx-^Gi Ⱦ]8yACodð%MÏ+[Д=TQ1TsBV>s2b%~|?A?dA[eTߤELPm'U11wJw99 1Z%S/tYWȤ#NpRSdTTdF fLv@SPs aв1zdښ8m$ dׇ2k&pO~1so=0 L!JN-$ #wŶZŨYPPHaHC0A&S@8\|:f$c -B!"""""$I B':;.:` =%i6?:kƒcv SinrԻ&~(ze29 }2pvxș[y^3Ul(4tX9R9sd+stiy -xB7 ^2m:0bMmO]%N}D59I^fkS veπfY}S_:1tFSUcz5 ]q f}JqGptInTƇgzn?9yos$}#Meq?su8~}u|>Hyz~6¿[P@puVi:/˟-vDDq#rBɥ;\s^V].\in/^}GzNvn]g̟%o5j;g8b?+)|őS]=&anGl4oV&l6Aqrޓie7'|;;:X9SLzWa?@fd&߸<> *OϪgs -c7ګ OuǗ7OΥiQ9Zg{7}H|aw)ٽl7`}zc`VY~p?Ocm[gv^$QJ -iϊ]nkNpF{^w묰a(6~fST7Y7/X׬<g7OETsCsLg5sC{,^wrEC=ўG0å?kl\}}AY~g{b)7S^eBl/~77cvV |8%cot8yֹWXۜ˕fĿ?Dp7Yj՞J!k|k>[t=m~;_xp{}T{߃V1i۟ziw<-9)C9)]'7feܞ6;׆>C(X:M.m 1uL7s]OFA3ުn[~;94~K3%cC^V#XՊCLvS3o)5..eiqǭTipZդɏ-zwꘆnxɧ:.sV\ ,q&?R<4k6|)ǫpqv -#|K涄dր̵Y_V_ud/⾅kգw@X"e|W{OmG\ө\} ?L2`U86}^PZ 3=S;VsVE_^sst0uG^ nZP4xQ3LZ6k!Jnq&VsH;+l](deG:n"*_Rr d֥xٴ1jGf=uoRhCYq%\J7sTfb^&^󡃞·=^Ye;13$^1~\<>fI[2luy[t:jɛ FlXkxWSkn`QG-|,_=^ʭg3JeWxdžQ<>?&tS1 =;'q\'mӀ: c6?-ƧFa .[˝yoV;VX~{hDF{U_|KİGǠr#ㅟ>4I81oҔQjOgf>W2w'̼ ᵹ::8_0Fޑ>ϼFE860!T?t kpSb: -۱C@O `Zm~jF&>Ɣ>BoaVq܈PeɣR7Ķ4ix5}FfѦإ-DpfqUXBGsٶph]V:Ki-B_ -n$>P;@n9vW]* -{5GEuǪMcwwh0b1[4jjɫ(^BFCó̵/cXPLCzzh TzMIapM6t$B@0&siB]r]|HϪ_jAW)<zmi0BStEu/rDMdԨ<ƉyŪ+T0Rh>g?l {%`Gq+ys&0oSF"]+o! G9d3PAVeaRg CHZ Fdxm99"}qZӸS -x]=pͣ1BPO#KQ@eQVrK卟9$ 1 9ȋxK;zg5w8Dx 8\BvuH]Qy VTu 3 -:FEN2;4`E\i5[%= fi{۹,q2EܾkY|qO?z UAIR65BB} ΃9̋OBF!zDbycMG'%#cee1٠$t|@֣ȓoHO-!B̍3M"B[%O9bdgʁe&럄 -H_]sY=ESF@0RlvFF|[G ¥ziT`8V*uK],?SRe\_.PnOY;PJ!*=L}10 V-8{2j0mDRb ds >z@1%D}tgTODP li#a+ɳx)8#v3<aiYe4G2W CwU ̎%*V73 ˄D$Br\gߕ6 7m|qcZW"UeA0Kx!O/\3Vo>>%Hިư}WK,1$:f),o\=nkk4Zp`c+nw1+r"G:`hl -?EEGyXnnloYCwT6xPQ i{Kif##A6[;WGpކ}|tEOͭEa[2, 6BS/q\ToBYX0yO2}*IpW - ȩ]G= _Pv(eXܱY^bClS RrmANTt^!KObjü:|SWL}K:K6m7DM&wC{fY;L8d쉽$}->%y/V00Q#yiՁI^ T -205cecdc8-2d61-47dc-b744-19873a587c6f21f57297-4852-460f-9f72-97aedb94565324 688.252177a685b51-d6ad-4760-ad8a-a5276606e6b23221ac5f-a1d6-4f9d-8871-da87d741722e2512513. QK!"<5 pGl3UDhS "u<c~jR6ķs\ -tذ#}<~ =;y{,j koNSx0kFiT &&\z>w 4t7pI:ZAcm2l}ziZQ?V-DN*^`RP.C:bZX#ouV)MhA;&ӅMnfdzx7E#ƺ0IP-L! M SFPJRs&P@)Rs7Eѷ0 -JRٕ;{70D& 00hB:cI-Bڀ#ba ` k[ -KD&2F![#_>y2_bC|j[)5]= SE!7hB& u+h?ƺ6HkMIk @ݻŒ P&9B:PFВΝ/˅&]gS 38a:l Pt7#cmD~ԯQ]q AtSly[ X&_]w|k^;fUf3c~rld{&H.qN7reiq6']\$ѱJ⃯o.G ]15ؔ7N؜ο*c(_[|7X37\bt7w˷%-:sƽqͻ;8>ݙ_Qiַ^aaaH(Pd[ -e -LyDJ~5(`le?ߥ1M[/ T5|aGͲ420w49X tFe0ؓ&o4^c|=gca|d74}dƞ9ݜ?{$ưˁyә81= :V56tM_kѼ%ּ`Vh'k@;MMaHnGKL(dLGqG#sq޸.6[t4{fNgYdY+;8888888888Q(˂&3_ VйΥ吏I-] >J6ǘB3#$IhpHH '#53AY$ b`@  a"9b(BP1G -)rZe~jxU:u|X+6$,4'|AP\=?Rh8Ctע$ ZՏ -}GMn+Ϲ4 Lz;o'd$z naE-&"lAZ tJ^Qk;3m0eQR?:XBJCM0fU pY_¯ICNZf`lʼlqĒ迆#W13ïtvho`zLc0Qg2$Zf[XbtN\`ޯU FM:dݸ37~ZYK CK9Sa03RrFܙ:-*CU~^'44oqؙA+G590'ҵ"L"USOOUf"J 'UŻ -aj`%tx],2%-13 Vh6qgkIu -T>ᒨ|n^tu>THɣw<@q#Ѫ#Ή#smș G-sG\ʟ7jҦ!c!"P\@f&H+\ȴR4%F\ *DCe|(2^&3JXң>F!e\Laxs%Mտ:)]^F{|R%>!_:'"6!c5,TF$Iag\357q( _Ёe 53:0|9p#b!!vYЍTסp&@0i&1 $tc˜n8m*:im?B9U2܍7йְǛR/V )PZI#ز;I$wpr#ሩ0 -Ց -5OlQ*%*U(˜`&"Idm8\G[*a*NP&S$;41#0Wa2Fk(`V"SkҴ{4-bf^팹UdrGHHJDy4)?!ٸ%1N9 @mnGWweh7\1A` -ɪ/ EAD. - )G߮@AA#d eV捤rXb_$6! ?&İX'_Σ6~Q -X!5s1BfG6݇&i~0m_E-ŭxD?NXt3 R+ܛдP~b")1QRWQlj*FnPd_#QAЉOs>SJjh=@&G܍e:,]E3m!&""A@S.|j418-n#6U I1:pGl`>3,\ 9>}[}XhHkyTϝ*Y\u9]AC !mȮF)8YC{uUKy,B鳲EZ:Pp~ mj );4VgT$ Av#'%BϽA9d"QŸ~>ae6NR^Xt\e6=ڙ7 A .&C0ѡ?)G34D\\ Ř~ y(WY}T5+sP]tEK]ə$q‘(-WGRo1MICfL9-Iu؀}[C3?rR& -]Ƶ +>,k) 9m5ӊu ű 0:L"boFCW <^ⰥeۮaQcF|$ǩ|H'\rH)*&zwKuDۡf1yD -̯8$?mA XҳTΔ'^ ;/AR( *&T6zׅ֒{0ip -ɾYc`FU1+(]yV'-Zh -/:gH;D@Od{;i;:i`2lZbDQE1,O2إ"%T[76<)[6 -;;o28u;>g}̏Z. YrNd. E&ݴ L%R$.d;&kay62`l,#2(wM=xqL/tR,+ ,3n֮2g#s:[E5r.C紎PEDsQ|vag>d -lWbVƆD)gkљVG-m5-aa b-GaW1%Zr"3?@>6"(8BiŠD{;\xE2Z*ʺ˶[*+F"q@SXHc? q$(nʥDUo}SgK$?8j+P6y/4U +KT'D؉2Q_S 1(/ a# @?IyB*@6b.d@0V40x%~Ǹ@Wp%W`z -8BiGV( -I)0a@KQQ - U0%lNOM266X-G.F DA.qg>}"JCOߥONrm'XQB;~$ZZ( -3Z6i逞Pjڄ1*>5wl!q -PBA@ [!!N4B5`DϱICL5lX\~8W>54GlߨYF I%ٌw6Uc+ Y[k'^tQ$50CXZ360ǩ)?# l9Dg6F*E ]3V\gU`p\DUq] |ڮ wL9 N,~[(>{!I󈍷˂gLD+Ů @*XT'Bn,A|_NO:ʁ>i0z;U!?F LҴɻq~\JS)-{ '˂pćMqIZ`)ǭmU4M˕{fgl0Ӹ\4\dAβ$<ΊY}ł%<(K┙=ӛΪV~3<e=?͌hV*u3xN Ѕ M9iwR* ÂL(%F/hh`ʼn4hеx]à^j}{tLn%w͆).benr(1"Pm -ؾ 5+CkӲ.~3XuK}Yfv |@@F50L%ljA}AɵvV j",ڌGLcBuD-L+xek -z ζ2|R`iEfE/t3q&֑y~JA9;j࣎QirIeU[vb+;l2y7]oSZun0(ٞX7UzV`ZLL>s~ߊ5瓅KKfoiVW(X*XPO^&4 -'W` lS ҉ b3|r4kN?*NF0ҎCPҋV~[* ۲E El" BH p`BT]3!0f5D,)))'m`q -$ -* c_@/-jދc> -A}WW̵U۝]z -coȷof ʱ*XluGr@Dg,!zFB$vojour띠Hl X -4S2 -K,*Gg -\8fI11e`"*cf[-3Vjh(}MYTs^MEw|6ckQ,5NXfN@~y5{o7^VluYlu^]s;97pՙ?wXc7s4/;Ӡ>^M5߬~7Goκgq3/WVu1ǻZ^-9[uX{Pe^QN?򬣟~ss4wEC9Ia(3^csq={ygm3>PK07b_3+RӼ곎o߳Wr稿6((8|%Xy߫-˞Ö*<Ś˼ѽ:ߊqus4<&x^^yNw<ﴝvڼ;mYlrJw<\O4柊\ -V9pcy59Jsn3VPν.뼬z^{Yu^{w˺m3W}e9lY7nb}usY^z\˺UU5Ӟ{e]絿*×3\'~a(:Wǂ-3{{1d%5טd(E pe'l유yEW9S&B QDAc>1dhA2,A2vMEIPU&""Hg(~ʂH`c(](ݹ -.Xwu9bgzi'n@9ARgn>qs~ "HPO`a`Xz;+S_G$Qu> IAX(OB h ip5"zq#_cوk}23=d Q [4$c$O\z5g( Uz:P{/.kHiH_Hc*?=c+5\Rz'ɏߤdR0H'(z޼ҏ+1j=J -T (j>̐cٙU/[?jUy ^@;V -(#§ 6gh "]|s޻w}jhݖQĢc{~s{^s˵o~[4ԲDf)~c~csk}2YnIZeg- 2bef[-b~|o|7-ʿ7[wwloco^|kϵϿo[-j9ngܻ{5<-k?sw-߾۾sm[4vfq{g|k9z|c5[-C~lvvwr^Csߋ}k|~gnw9{swwkzuyb|q?㛻=ob}~[jwǻs[ߢ~ߍ9g~՛gןY߮{kw jumZyc[{-j{v/_[Ӿgܳ\o5["*RD>Ә}&eYJ'(~"svmX'#P>D%SeHBR)ƾ GJ3u cTw(9FC1gzq㝫2*yu~"joq9{[|o޻+B -4AH _ꜰp]XwheJ|Nzzb%,]t+YG3h--,$, D(pK-I/ - 8&Q(=ӥ&>IsYp +i\h-|PJ(PjlAXxn{,c!T2t~b11 $d4d5pH riATlj )lLPߨbMɃZu -I.tyP-JRh,4%4X` Ȭ XV 'qUXhR!h[=P*#K̆aDT 8̃ ˖u,0\*P˥\\V - %,b"0Bbq 'vDN8Ơ(. l-0i(hNAACD8) 8/ACE ! g0Hx!ؖť$Ty[yvC}N\mdS>&&ݠD(G?hJwVDC{~EVtQ~]ha$C^$P=ub9S 3aƆKdmIH[0ܻe^]ٝPb*YTocA&( QFeCV J> BXWF#r քx -)--d  Z VkAP\pbq%.p .tr8kp.ԋ/RYTA0S!cr&F)Be}8)Ճ0(( A7 PPiRH(LT '&1G NL26|x %cM3$[qm@t -&UEsT#x^(]E5IcAsFՈTPEREA9D. -(b2p"ǰD -_Ոf@"[Ap{A(|b2B@0 -DE -} z\@(  ! -A8pGd=th <0 X(qc"1qEF ПJ{R+r]06b hFĆP;iX@[H+.9FQ6ض3ж9Ɂyh-Vo@TP x -*Ā$ l -htp8Q׃0 @cA`u&`eՍ`-X:O9p@$gpp -KJp6 cepq0wPc;|DNPha1P9["QA:^?F~'tj4 E Ѐ5BP?^4HVȈ(Ҡ4"P(؍-{nn| ۸La1`jEiHG#}F&8 T橡Qˈ(xi oliEHJ#J(`;\hbLږ,' C0F=샦AfP ڇ?DaNi9G  !CG;9&:m3)h CXF )\.ZxX-;S)B{(tktf ck!ӑ5Wkf YM¡ഒE@4(Z5Xh##&DLDe;dyhZo4 C+x4iiV$&E xHǡiV -44m &ZA5*&iکѴhhFR]C+Pi6[mCpxV)3zBCC -.L^Q5YD5[>i(#b!#(N(īkj`(@tV1MP*VHX/ E[PpU -H2gxJOa2P -,aWJ-pt:1d- (P@Fd  -\ NLLcq]6 VlYQh(3xneCjiiХiDJM+e'iCr9 ᚬ$V@ry*N`΁BQ.lg[#Cٲlc -L 8Ph8pȈ&O0^Ӱ(Nbu^; _ZXi_$r2Jp.iɍf38i e54M#'d*ijei+ 44MkD4M#sϤ -R!Oh&ɨ(!lMӴ"h>j~} |&ɂ GAl9D>  -K!NGѐW::L:ѽ fQ쓪)`F}P7f ˊ1DqL`"CYQ#hEMj܀flAQS$-?1&]eU8@!`a)CeC4> ±l(879-D\{nssgd -&.-$VrEH8<|8]l4*$ZD$țUQȃÓNäeeQp[p+MGonq`U -Cl8b8( Itl *6Ţx@*u$6[W[, -ƒℊ (.GTP0`Ȅ2k: -l`Ӥ]e.b<¤\I!˓Rn<-ȠȠJ/Uf@VdQp&v)3e.9<$;3`r0I"L"۽D ɴ5R1QxEt@ -/H@VxMb -sZAs`>dD0d-;J h, ,oɵ)q% oZ xbaӻG!Y  85è 8 -$Aᠠ\cADu9j(qd|.0 -\EQhp2Ȱ`>stream -MREl2iR`4̋6o8tlEiiIkB)QA}P*KUMױgp$6MD8t:YA. T+VR#Ҁ2nPٲf+!5p[&Ae"ɤ[y DyLDyje1I+[q[,\#+oL&JyD -Vs4 -5k׸ -5q4ʎ&\GFI+Qp. -Lˤ̱<<L(.S2' h+~l=T権(w[_(6/煲e %{4"lY@IZˤ 1/g/ၑ<Kˣ01G eFGIȨ sNX .QQ*'hL9ݲP ҙ>\Gf5 7PVe4/&@KD\([1} !0e@Vv,y.Σ@Q6 Q C ,Ep.NXxa[G,s,$ -_BLJD`ȇA :LJɖ9$ q. XX , >-۶` a;%q`Ep&mVEIKfr5/!E\(#`\.?n&<2U8 -顲݄(es4"jFC&E^1J|Ѓ*W9, U# tAfaVDhc_-sp;[.beDox d\|-x uREF( -,CAi/,+%jԅ0li"$cˇH- -Ie%>k/Bpʲ*;9ؘ0(r[am`'LvPph$p U,X硲=B"VnYHgl$zA{AruAH!1d-PW/nhtp%Lx"qQpF$WvOed,TqmK8<!L!;aà4LBND.p8Y[P*&0v/be38ز1bb "cfTGB[g喝;~,YD2 (#L*3*4@8Oܲ ^d2$2ɨpU؎5Eh LZ@ ([0\ QDaNhH2$c_XHSEi#Fe y.rEte,PH!6\0:BEdm&⡲g_(  x4.Thfrȭ5,]I3Z< 6HGn˸ 模#,KvR -`6N  -vB&aw$6l Gdre.,$ 2ybf<%I"l Z&;X -CAi3Q.&8Sё/1ha6U -@p,JumQHB" exkT99'A %o(ZD B89nFD泌 ._m4&4䂆Ag C([A0~/4tm @X`_,  -["b H#O,XH`b؂ ?iCd"e&1=}r*Kkؗ e -e$/N$YL\P"'(gVR0 ?)tE:@x]^ 7pď0]=)T,P0>)2 ' -B %Jek-m4]Ӄb}2άrb&*W#N5%˜&)eFIT%H42@5>$ -cDBhDH0p(uȨdR.vPH0P FbHqA -!DB!*T ,mΔ(CGWR`| 2LQ8Afrxֵ=E;{Ԁ0㾵l͖ɾ\h\fWN9rLah >^¡,nRRT9{7vQe8CO~0]cȜhrfg b:ZGNm>6eNaFʚhF|tHCc"0% f5E|S^ xdi˲)vߘ8?R\9ڹ~c -^X[.ۋ飴yI>k]ƶ.|HO{jif-5fN^Ny$ɖJ=2J 0Q`bdڸTN$(˄>rnLtV]&!v,m*%oo~rEgM" 9T@YAjh -԰3(!OYi9ee mK̢qO95GM/yYpebȢu GѰL َ_3Z]vEwXU3Yګ"T] 5XG7h/iE8$+ -uJx% `è11W!&4]Hx/16Y 0W|..7u p/ペ7 d@\vэWLo}/o 2&[nz!fLi)Xo_V))U[ SMK1;;"D-x?],UŒRW]t< eCYjZb'r?V3ka - {TPr!$uJu TΪJ)KR( gn@6Ro.0W_߿: -֛D^ک ߔĩ>CI#Zk[3ËPܴV?$%B1źRB|"~~,Q6Ge>jwKFJ>" b}& - --6ĠS`0V#+PS ?.D^ ǺdIn%e-\ ˹~?Ѩ{,dp^?hZ^.ÿxG߫fg=O{ +zmhks(C`7k=+̱I -M}l=߸ p b^@ n%Vx$[Zi 1,工j8_!!t/ A]ǟpj -\\0dAMt$K9l8Nn%8\$"InHLi'.dUzq_ -Z->C"8? -3aRvl[#Ů3X-<r쏡">!)Ŋ3P Ġ=d*v AV~) !$CY+ -+ zԐKºSՂڇ67 FܺSn8~.(hYDƳ^㾁Ԏe|fլZ{%VƂG* h~fnhV FK@l:6#϶u/;~^ -M ]˷=V i"^?y<}"0ÒGetalu>5D_' `.AM&Ër|tZde.f8=}~zW= 9{UK#(%Sq t)aX*52 \!+b@h$%]j --lWK#^C,߰)Hp ;j1 ak R˵;‡{[\+&ZN2EX F ^@QMR&?-yJkO5 bmAՠt-ޕ,Ԟоl bFx^ ч*Q^}7Ȭ,*9TmQ[2h2ד 䜎KR/ LMmKx4͡:Y}BY8Nu -/MclV1wล;CMy LrD#\=)6Ru4NA [`]s/#!}XweߎwQSH`w}]B Q8x:JC-}AyfL>1^t *~2Ju&Bsaemїt#L5EV -pZOmx'4S"~YL[=P#~MḺD}5MO80[Uqy߳N{A&EO? ]"&aY? ę^qڶK,tue^R@˦ZOٕfLh'`@{l簈-`~x˲qZ/KpD=w#%dzr哀"`꺸| zp$M!10AB)m/lfY,5;_7M J;4`dqEZ[* Lx8<\0BxBzXn(r22|l@P"c$s%40MPiD@2l0KT!ao;5i#̃ع@yRBrK -ìMcSBBC;8M.>`!w ,|s_XCɎj xѱKmUn9e+m# ֠:T0? YhLvvT'/G%̨.H g:QV%Z!ǃ E5Ey%̪![0&E܏/m_9ݤWݥ#j_Á9C *%bU{R+\$4TRntӊ@Iȅ-2~Rxsm~ahA4g -$S0NzAb4={y99sRPo}#EiR=֕Y{ܷOsbcr$\9IPDAin zde&l띨 - 3E#,r\(.n_6!;X-$(`\!uc`b5lY6Kl1b=k DFÌV,7tXtR|"/:vC}j2iV4=-:0Gn[&BHޙFS% bH!?jWzjy24)jA%gc2NQ@ -}j0*:,S/jkVG "kAڞ=YdXYV1h/N,wdH!u5Mp%w[史F&`WEP.iHi:svLvT7Ȋ/!QY s9F4*ᴜÁ+~Gݖ$a"IǢvY܁!my0~[![νX1yG߭6s_0YB[JR6\% s^)pT4 }` 8,RD|{L05z)z18cmkpD - v+cf0OZflE^8VfbcpCE(pXi2h_+lPU#8%jҒ]2Tw*5 qhe x 1 xkŽ,rO^i> e9d3b=mYFӲ.̭,|P7`(8 yUi@%UX8ۢh;BJ*O|)pNde{gdl2:*}\ބ"gx em3Vn߽vpRc`T#!xY7 ?:OV -]V?=HZHSuz8HF? - -Y7 = G3L;qF:ps, -BNTqP:&>C*|,?:<;Cnr'~83f!+CY5B$E# -)x z-mG*ʊ3֝'q㭃lPi)e2FǠINX@~|&@QrGO}ۋ`9%fB:F - w̸?MD[f˃ *=\-ɭ|x硲*(l!QVB!랋x8Yx' 鞨d +[~4)ðl;Osb(1`|@%kYD.嘞/@Uu݊f[SeLubxYYڅ[ 0# vllo/W UVp=%YO}Λ5ļؽ 8M(H7-caxwtIі9N/|r0O"_>yE[W9Nzj& ?KP7` -&(KiDbAұ]ñ %R!%z[| '͠⾉8{bG U*YBC={)04ܮ?E.-z5&=yK.%M/*u-XJjnI^λ=rk6LM o, z廨oWmYوK-Ǘ +$r]Y zHJ -CVx Zfq˖mHnX?vŸgݎX~ǢĪ̐ٺ1Wl,ȔPPlhYVYa:Qۂ~[m~/OM-w!NJBU@*8A3+Z"稏2 -HNrvぉP43 k%]ygʈVyWv_LV4jl~-TV-mCv -~{q0ԠBH5RH`Yq!yԋb@KD"tND 5kZL}(\A߅WQ5 !5˥-aLOAȧcW3`HV:([Yy"/%d R\OԉN -1 УLoB1l^&$PrM4_vӂGeɮJfAOSƢkYO/l!ƚu6-^q[~>ف0S\#]".SfW w DbJOUjhPb5?Њp'ҌB WxAVSpO%AO -•E'._"ư+WuvZ5k֛Ni`k4^V#&|B"zCО#]n}3:b#n::JE t/R/G'xO`.]dO]VVtf2ѰoM.IBRzWH|&tM{㠫es6$mc.4mcx|n |Ju6ZDAE@ՙ@xX3"04_,}LW9ú6`Y6#%wQ -ma± -%ݟ>'V7{3L)ҳC^#hdn-m6(pXs=2-s)Z@BֶK - sE2K"9xRt+n3e\ -1اmh7Hc׀JD08쓌 -CL[k)ᶚҩnFD]X)aa\ǢHHP Sb4Dx;Eky;֨)mof`=M.~BfPdN:he=d +_qCD\#i+΋ٽVwP) .F~ͬ6{8L*|~sm2Kc%BN3MI-=T"]`#U+% YsYH&kf%y!ApF9l^ʇ4?uX|-IY2X`"Ryy}zvD`-s"Tभh -+z{RQ Hn#P6'~"'| nUݾz+T^VDWh+5a=b@*l}d4P f͒&P)H kUAX> $(Z'51ߚc|!K/8_ - Ex&5n F)P1F )m6#7;Ma8553\A0&~tPubT>7̔6'aEWdȔa6"Y\=#,r. -fEMC> z`$ͤ' & -ɉ<8q Გiplв+c0]p(18؂{ PtQC2x`-1ȸ¡e>0zn.\fVml2 :AoNXuqހ< -(o0x~ qOXy;zRnFԉk<)#-SoVoa@0a<q*i7|\P2w㬠F*BIiƂMi)/m78j֋!z41s-U lmD3Q"f\5:Pqa Jq{Ed|0`]Bi5J2&Xzx0X[4(X̶ܻ0o};{`^%zk=0LR`>h4Dʼnf(fzJOPWDz ՒzX4`ŷ<},SgTNҧ<bٌ5`Z5x`,vH,P#S\5G/7'mL<c -wFppz(ݞ,h"lMU?RbtrF5 ,3>sϪ̩(Xsp`֢WE^em܎P J6O9`6 ƝHJ,nV?ۅ#qK`S*S}RB- qYA՚ptJ!m}6I}[5ɓ%0<\͜VMnQ -Po0q8'gw|$} fo[-@-b,aWr ġr@p±햃>n6aj@EހO"xLXN|K$PcVhXC2їQC=>َXp'`R  - >;iDZ7>fD,Ʒ}%l[>@{}BS]X3b$$^16#E:Mj"[d !Lenvl: WoޛeHs1ڲ%tؚ1˴,y&-3TOp4sڂu\GT;:+07@Н"Pp5Můaa!K*j-핁+ ~DD?I+Í"ЮٳMnVɥ¥P8&φ28t) > Nt=K>?=T+X{Vȶ~5Fz_o `YYc_"u|]NTT3Gy:t &j&tܑΰ@=R-idBIkd"q;]e1!퓫1Q3E z|8eT >>8u/J>1hg-wGS"e߇^92qۛ3 %ygFE> ,N{$qKKծLGI,}B|@5Udz-4y}j@/КBoXH& 8־sT eeGnݮPZ߄+btD15SI~<aW$ԁ2NPc:mdzؖ'Sph_ׅNߵb@GT>jF#,d3& heml!SY"- m2?k?8m$ZȖQLoǷAp!/bPd):{\ k>%Sf!;,cdҵ&bT6 tF#9k4;cɁ?VCa;ʈ`$*3M ҏ6 ҊfB$=`@A0BpUk24/\`vQ˙5i5մM_ZV+3 -kK¯P-+8<$8w4)&hQWH^#05g{f/=H"|%m=րa;b|TzF <\`Gn.4OgZ =Y=  -‡0sB9ZNsIB\6Ą2sA\{D=E2JjUQڹw󇆮AH&PgQ{^rOA\}*`@ ,_@{g_38[TwtֆP - :mDKA -(}f! O*d[KDN:)]ܓQ|}pfRxQARK|| `j]Rj+XDKy/x-]n}, N*u^ $^T?#c|V,Zu &ե̻&$G=yj̖5rd*`]g,%2]zeS0 -pk9cI`!S9ú!#z15rIJx ׅ)2k6ޗHm f)өH*yȉ9nNCf WrL$c 긴 -p35i}DqއǑ?!Ly)ǎM_sXV7;pݼĩa΍S <dAf"/ P}$HOd͵9 ;3\{rP2'ڛDxvIb8=٣17b/?& MT{ZIX>M~v6Gj1]ST)Izi0-}‚)`֮@}" xUvmIA l;BPe-4q(d?Fz_H2i -]?.꼺^ -hPQ$`Z8Rȥ8r\uSӕ[WfO?YyFO -詺-N|&;ݏv9%-bDlN#X rf:Hf`f'V{**uσOdp &1lZ5pnCwb^tY=j"ƃ̀)+>"V3_ˍ]R*x*;\Ð*x~ӣ,=;h%O*5A&}iF2hP5DGK+8)x].ʭV꨿麡^o>L*NiA-8}M IN5@cifq"pl5ѽ0A7UӋTu?F*~}_MvdSpa`=^ -Yy3R̂mӂ)HR:S# IeT;9àgУaqv̇AcSK4*l^T/u3NY'tXF1᤽q1";aB`dPk{OX|ODMbSӹx4td8" -r.d$;Qf \ ӳ}"><"Vn䋽Ԝnh kP8KW"ϧ*@!RRAՆ1s)ra!m"j*Sn_8oHܘ7lw6Cnn5Id`\P8%xIdO)$I(x^+uir3]gl@.(` Z0cBA%9 ܗ!4ם bhoj\ͭG2toMx;)QrH> o1 {YhHX3_ q8ߦ^4}<ٜ"zBgbǮϞ/BzSJ)Z+Yc@ʿM6֐&3H~48Jk5s. u$|,0])yuK!z.Vzo)2LI ޽ԬEU'1ԬOXXh=iضIsˡg]/':\ʢ" -9L/CŰ}@91 l`[D"jHa&bk%`ڄNқϬ7@I"1&,3;EZ0O1$`ۛ -+lyb iBjUjV57qo$vP c [ET ع 4WExӌRء*Z[AH2|+HO`r,40,@V>8uQHrkNy)sdob( PNrr^6\fmפnmq7 -tV(P0'P9<j+GNSTyJkC Nߖ.Cz=Q^) )puckB̓"zZr(4d`[y'',%39#R@pޣ=,cB!F6̅5f -D$0dd:F陬voâYG ;5boN?&GzR;V2j"gB` DJɤ+Dfp5QbٮK?+y5 -7 d\dެ}x󈋵CH]/pPK agR1G -J.kX` b^rt܋4{{K930B, -Hmjfǐ2T&;chu0okYT*Ln"q]( y:D%ܼ1]R6dVp@9-NS[=~;2=30 ؔL5(?6sЄ5v €6t޾ťDuS]HJWx+&V(5 uwB͐>)eծٍNnZ^ȩZS| -y8eUQNyIj/X8B"ZПyq܁p֠p3ژtG - `oשdQa+ H*--]$tc;Vxs+ebM -jpp9lQ qWbՆ,>m -abƑ Qɠ d.[E-`ž8~%z^ջWN1νOz@N _ˣlc~HOX0Be5iTK)Y2Vl9LE҃LÐr(V7[̜R69:蚼;ͼR,Q`exUzq_$ҽfT|KgM -P,D$6pܙzu;3_W]}NvLv&b,.v"zE"#qu ō7o -&F h} ,E(-^Xz3 r%`IDoju ni)^C Ц -+i3XuL4Ō"Ō".ۙ AD*V6J~4p{\81 LJJllՓ -HNK| x b) L#crMNOƚ$2,Rk`،nc u[Ĉ3һ\ %i1Flj\|Pu[cL[\D|ȶ)0o1%oĭBQyV>((!9@AB0> P!^9ȁR.LOcڈ,4[B ޴'}x%?P!."-k>va%e ԭD%F1OSCUFd" 5"4 e*ZهҞ`DgcN'W!䴡f /'6-U%"@3_ B Ol#O&r6 -Ldhi( Y|Edڒ,_ڃiCi?bq!u` R"@c$c` } ӕ'bi mɊ}`<0@G@(DyyA.<)PKN>ATKB+3,kbX2 BI-Tt!k"& nr1X uà1d)q$t0eL`J}0}LVh@Peb&FPM, #cTh\Ȃj"DXDa0FlbM!̃A,Pla6`*yMܴX@'6p#WO>G?6 B+dQpy2٦`Ҝs=`ER(I{&B it>& @=03 -d!V2  KP -6퓥:  NaYH )m#4/ rk2* h} -S8=ʌf(q qFc ABvA -VoTxGq*R8')=n1-s,5p50n?,/_O\`e!H2҃ D|ě"/{pl1V T:0pti]݂D - 6cpUYt) kӤkUˇTud4ŵuZqoBC(b4G`b ^G R:H$cؒǣPzU1q䩈8g X&YD̢L6;h>nG&)OW0C h6Kp:!%$q`E; bR%fjy3RLthq &}P:B3y݆P\^n"@c39fRIH}H=Md>dG6<}, #QOb x[u-8휉X,<)VeIg00 -:> M# ; S,Jr4@ڴ#cpu8rH)O[x{E#"B"8Ds0s.a.Q\ Svlo9=?]B*ݞΧNOZiq|*}~SVvZ\W IeXӸ~$ -sr$^]\Jk+l^=wgl~O')V*i[j/w6d u]=IVw껬$v%/t>N.ztXvJ{S-x_C=J Yj/sgV9a)!K$oyH!w֥K#5ډFBqbe\:ĬE A -G -8>(YG&QXjzG! }M`Agۦ'bW٪Y;u0"2+ZI'3,i)0+[ -UX=Ka>V?7*]ċ(=!2A -"kz -tIamۦ2\!јI`2L!eB`". ,,C:di%4.?۬ܗvYQ_Zrl8g*NI_Z&ܯr'n3R.V걵\,%5ڳ*%:]߽#e8gG ) BLBEOt [~wDk\rrV锶Ku9S֝QhF8#%?gO9;>HR){a|ޯug gM䏴'vs$iu -eu)黌,~˟ә3v^ e(7>}BI].Nt =ҍB99.YN -JW󾬐eδa?u=Ɩg}NTIog -kúrvC~P5:WHݟ{ӯK*הausyOvwsvګzfH鬽\٥DžsV)?t\>eH'ətݧsFN<%OV\?ž)ӇSNܒ៚YN>OY6lZW_'m*)˕ӡ3s얕:?,C.u -'sG䧳GcFTVN]Bce9w#_wܭFsȼkjJk=2M7eIusN%[9rM\L'Gii֪⬵;gϑW%¦ttvU~9B)N?FU{/KT\-TST#u {倫JTRΧ;iӹ봹oIitOuNy~pkG%;Fvwzoo/ k8k?]:?ru'.INLasGߝK:ϕ҅rjdǯOΗ[3$}Gmޟ+?/'~X}W~rgN8u_}FeI_wY2C[cMR{wh/ {\ؾ[nםp)G)+N|vr>mOitFu9 B44c0`, -٢V|zF*66:,0H!i80 c ]Hۋ2m}HcE̋q(ȝ#{giM H.}NƼEdc43DgfmjF iDs4Q8%(d)3jn"r;~9&CL#6:Ox -7oP`ʃvͲ'פRK3]RYl!sZPϦDGԧtNZa zvG:5iloDtB46&*Sq!PEFNB^#cdDsPIɫK,d ҥC v@:JAT#fmI`jZ X)a0;>QN& t6i֐ -gm`mFB|TBrb5) "Og@]2qAo40 -7P -þ;VߋWC<cO_C]e!ob>%Y83PmMZ`$zfiG]S4j8A8순nͤ'ݗC_nzӔd6 㗐Nךo;T۠8x< -xCRq+ yؓ0ܣ俼_',!4|؜,+5eyfm9QF7UOn" -5Pd?\ b#âM3N>$mm2ɠ3Ƙ21 tR} >>H54FCn#%c@S$u9:Q"ᵆ -$hR>1V0Y)-O%P? ja4QFݎ;X wuFz4.aZ'r WLjz^Y1Cwd56YK*^SRhxHHG4ql?E,.~2HFƓ- UpD]#]d;9A`G?YB Re`9V4UQLڅwf&r$ %]ꃛYI:~`.u'x,'C팖]5-TK{A3}4Fy/pŏ  4l/:Y!芯reCUDrZ2BN"{p$ Zq91\8 X|4yI.I5u&Cj'42O''RYƂv26uCMrbgN\Y|''&ӎuH F|6.# N$>>ҙ̴4Ic6A`!b[Ydeڃ -O"1A\Ѕۢ QMpIbR8w2.񶸈ןMg`x FsR #,%?UPyD͵x4'm77] -0 GKUDu7è;,":>LM&eՁ(+ؼӍ"lD[p@ ysC -xh()$-PA&PTjV.ClץR mM}^6ͥ^BAcSdnj\ Q~y)u8r%i%d_a@ښ*|7.e'j:V[Ez`'݀8}iU@CWHѶ&;D\[N= } -,@ D LERȨ2.SkJTb041E4otۦ6sMy36HnfmV%os4WvmvL5~ŲT!Y9nm3%|!oZ Y:gfR)afI6>낡BYy8h/+(խQ#@|_:/xZە]q+հC(M!O^-FesE;I/-;gBy7 Ѫ5rM;Eçm$Et))` F9R̠ .zΘ{#s0f֯Ɉ(A~k }W@ߍd X8Y3e23ᬆC yFAoر5W/FX:wydBW Hp]v8= -"z -)ұ)- I._WQDH$^!R; )pPXV$>ds3~(p;Љ}tI|x^"4YV*?Ӄ0 lR-;XHî Zu& \=xAGyJE(eCmf%uY(a६S/ȢHvZr[)or{cIt>_iY _fQ<+gyS3IJ6mq1&+]C | ֽۤCl/Am>=ZcNMĎ wQHB6g9v&:Ï4"0kw X A{Oj^ȰUށ`2n/ O-fV kDK_i#$lХn(šɈui?Iz Gd^!-ygO6yA -di8uzCw\cɏJfbP4᪲RځƏ^+qFǬUZ6#%,Iv#j{R"!9jZ2\L0y!=\8H\|Qq"ެ#a>%\vJ\̸CjЮ$͐-sM2N !+Pa@o'3+? XңխZ̹ 24d1X*x2e;C)j vρ^*rb͍HOj6Qyd[mPyhSRFLnN-O;.ie++6ܪHg0-#>E']+![]meOyy&Bi_NAlvnR EhGYsSk h̸qTO A,n|dWM!#AKB۫mbSiY֙jnDKZԼwY{Ցt :b#(Xn=S|US>#G5ߘS{u% YpN(z>{9~.6h$S˖|G$fFz7g*uURVLFQٯQBo nP-7rߙnP6z%?Ar|GN8~|h4ꦍl_Ӳ[RDIAtmV@X$dѕm VjMX a4W )N.J?E/$L Vu4PJ  A`g?l|@eXpay &1Kg2xHCqD>H1̄-27^au/.2>zݴ<暒7,[:drbE~>`~m+0yyԵȲAG6_pCʵͮebZV ۱!F^W?9]!¡5O/Rl -# z`V$]IAGqȓioȴ[s.^;:jױVqMNx[VjY6YLp@Cb~X vF;A* -L?,GDN̢NZ5F|6d-kwdI);)2?Ml,X=15<6iǻ#IW'BJ}ԧ ƨ0F3 u'O}pēfx39txr"Wz_' >Y SO ,Vs,td^=kakq34Ad%@u^1l]&oG=D _'IO!.2Pu‡3Chj4^bjlD -\M ѩ#QcR1f;&Bx*ѱB$fa4r׉BO- .ߐNRphevQZi 5$#QCa - PM6RHA"AJE6cra-vQ$/_bS"Siܦ -ڭcs{N (VXeWtŭAPhNJ&avX\`TwňfGWu6]ʘQԹMELŠ l3DXfn<,b9NU7h+QOIOww~4N(7.3Ϥ O*^~oxW%-/dW[;SF'Ɵ69'̓؋Eh?kK,)34N63 ߧUА:I `*f|k[$4vSzBiGFb!Ex@t1<zTX\B{7]!i9g@'OuߘP1e峠^1Ͳ"uݮI H6"dCZ+m-r x1ث&pz^ Q%sJ8"e.dJ'n'xsCdK*o_tDx,F]|euWajaςY#'[?2APG SF%015=^0Ly)Sŏg7<'in~3H>p{ȴd{I+ܳ2]Q2c;LLӲ0DRKH$Ϧ2HM9ޓIx@Xh^Uܠ6tuw7DR?s?DL -[nX3f/ O ҙ)ؙڢ}i86t02 U!#7\IOYη˼ʴ-_Āepҿ' ֙MFYy{jl)! =m+п&sٕ!X~x*G*OCd|mf!E{刭reem_,ֵ4"xPZԄm3e*ۏ djed;#4}>o;ȉ*®loY$^Nw DUc8+eQ"6mq3¥RE@،%tJiHXRLgiL%b^ C;Nֱ߳8&&S[thbIfO5dNc`Ef>9"I`^ImF*fNJb t4^5 WcE0~Jm ش]Ѱw,@N?K~LwθofT* 5FjQ:5VlV&l$(Y0j;`Uh4L}-qЦpt[ -FiJ톩>x1I/2N7uZMh@?H (^(:wTA 9o0o -DlW KM 1JN+ 'yC=@`!#9ĖzJ]Pq%'ԋ-Ӟ[m3ԸFK'_fPov ml" ۢN=4nP޸5]ܮ:BGrlb-7۽NMRC84Lk}UzN\+V qS׋.2 s҉O_t#ѹiEB 6رLpS"a $]%A(uvpI`eL'ն&.'IR~(Bp1z رT,lSDNjBXrS1}GL -w?)5Yӥx+p\_2DK}E>z+P<^ޣYW'yTm/{z#jv%6iaf ĢDQKt2`L/ȡ58I۞!nE~ F|.D`FS2Oջ7tz3#9|#WCkFdIp+MU -%U9Cw檲41$s% 9r$T.1OzgՙZ^S.z*"RHy/J+07^;hxiBcJ!,Zケ%_~ -pQ)- ˝5҄*rh/>hzXPP&[xJ,9{"8?+3 H|h%sFޝz׹Y)6){H Bj=%2YXQ"Sq〽 _Xy@(RʔK:>bO4配a$_}7lް> endobj xref -0 34 -0000000004 65535 f -0000000016 00000 n -0000000147 00000 n -0000040904 00000 n -0000000000 00000 f -0000040955 00000 n -0000000000 00000 f -0000046816 00000 n -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000046889 00000 n -0000047085 00000 n -0000048845 00000 n -0000114433 00000 n -0000180021 00000 n -0000000000 00000 f -0000043832 00000 n -0000213422 00000 n -0000041362 00000 n -0000044133 00000 n -0000044020 00000 n -0000043085 00000 n -0000043271 00000 n -0000043319 00000 n -0000043904 00000 n -0000043935 00000 n -0000044168 00000 n -0000213447 00000 n -trailer <<9AE36D56C18B40C39F07529669AB939F>]>> startxref 213661 %%EOF \ No newline at end of file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml deleted file mode 100644 index d3f8ae9..0000000 --- a/.github/workflows/ci.yml +++ /dev/null @@ -1,34 +0,0 @@ -name: CI - -on: - push: - branches: - - main - pull_request: - types: [opened, synchronize] - -jobs: - style: - name: Style - timeout-minutes: 15 - runs-on: ubuntu-latest - - strategy: - matrix: - node-version: [16.x] - - steps: - - name: ☁️ Checkout repository - uses: actions/checkout@v3 - - - name: 🟩 Setup Node.js ${{ matrix.node }} - uses: actions/setup-node@v3 - with: - node-version: ${{ matrix.node }} - cache: 'npm' - - - name: 🗂️ Install dependencies - run: npm ci - - - name: 🔍 Lint the code - run: npm run lint:check diff --git a/.github/workflows/style.yml b/.github/workflows/style.yml new file mode 100644 index 0000000..1fe1e07 --- /dev/null +++ b/.github/workflows/style.yml @@ -0,0 +1,37 @@ +name: Code Quality + +on: + pull_request: + branches: [main] + types: [opened, synchronize] + paths: + - '**/*.ex' + - '**/*.exs' + - '**/*.html.heex' + +jobs: + style: + runs-on: ubuntu-latest + name: Code Quality + + strategy: + matrix: + otp: [26.x] + elixir: [1.14.x] + + steps: + - name: ☁️ Checkout repository + uses: actions/checkout@v3 + + - name: 💧 Setup Elixir ${{ matrix.elixir }} (OTP ${{matrix.otp}}) + uses: ./.github/actions + with: + otp-version: ${{ matrix.otp }} + elixir-version: ${{ matrix.elixir }} + build-flags: --all-warnings --warnings-as-errors + + - name: 🎨 Check code formating + run: mix format --check-formatted + + - name: 🔍 Lint the code + run: mix credo --all --strict \ No newline at end of file diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..faddcbb --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,52 @@ +name: Build and Test + +on: + push: + branches: [main] + paths: + - '**/*.ex' + - '**/*.exs' + - '**/*.html.heex' + pull_request: + branches: [main] + types: [opened, synchronize] + paths: + - '**/*.ex' + - '**/*.exs' + - '**/*.html.heex' + +jobs: + build: + runs-on: ubuntu-latest + name: OTP ${{matrix.otp}} / Elixir ${{matrix.elixir}} + env: + MIX_ENV: test + + strategy: + matrix: + otp: [26.x] + elixir: [1.14.x] + + services: + db: + image: postgres:14.1 + ports: + - 5432:5432 + env: + POSTGRES_USERNAME: postgres + POSTGRES_PASSWORD: postgres + POSTGRES_HOSTNAME: 0.0.0.0 + + steps: + - name: ☁️ Checkout repository + uses: actions/checkout@v3 + + - name: 💧 Setup Elixir ${{ matrix.elixir }} (OTP ${{matrix.otp}}) + uses: ./.github/actions + with: + otp-version: ${{ matrix.otp }} + elixir-version: ${{ matrix.elixir }} + build-flags: --all-warnings --warnings-as-errors + + - name: 🔬 Run the tests + run: mix test --warnings-as-errors \ No newline at end of file diff --git a/.gitignore b/.gitignore index 22c8bbc..6947cd1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,32 +1,41 @@ -# dependencies -/node_modules -/.pnp -.pnp.js - -# testing -/coverage - -# next.js -/.next/ -/out/ - -# production -/build - -# misc -.DS_Store -*.pem - -# debug -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -# local env files -.env.local -.env.development.local -.env.test.local -.env.production.local - -# vercel -.vercel +.env +.env.* +!.env.*.sample +.envrc + +# The directory Mix will write compiled artifacts to. +/_build/ + +# If you run "mix test --cover", coverage assets end up here. +/cover/ + +# The directory Mix downloads your dependencies sources to. +/deps/ + +# Where 3rd-party dependencies like ExDoc output generated docs. +/doc/ + +# Ignore .fetch files in case you like to edit your project deps locally. +/.fetch + +# If the VM crashes, it generates a dump, let's ignore it too. +erl_crash.dump + +# Also ignore archive artifacts (built via "mix archive.build"). +*.ez + +# Ignore package tarball (built via "mix hex.build"). +store-*.tar + +# Ignore assets that are produced by build tools. +/priv/static/assets/ + +# Ignore digested assets cache. +/priv/static/cache_manifest.json + +# In case you use Node.js/npm, you want to ignore these. +npm-debug.log +/assets/node_modules/ + +# Ignore uploads +/priv/uploads \ No newline at end of file diff --git a/.nvmrc b/.nvmrc deleted file mode 100644 index 94f5f26..0000000 --- a/.nvmrc +++ /dev/null @@ -1 +0,0 @@ -16.18.0 diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index 6f0d00a..0000000 --- a/.prettierrc +++ /dev/null @@ -1,8 +0,0 @@ -{ - "semi": true, - "singleQuote": true, - "trailingComma": "none", - "importOrder": ["^~/(.*)$", "^[./]"], - "importOrderSeparation": true, - "importOrderSortSpecifiers": true -} diff --git a/.stylelintrc b/.stylelintrc deleted file mode 100644 index 4ed5ec6..0000000 --- a/.stylelintrc +++ /dev/null @@ -1,5 +0,0 @@ -extends: - - stylelint-a11y - - stylelint-config-prettier - - stylelint-config-standard - - stylelint-config-css-modules diff --git a/.tool-versions b/.tool-versions new file mode 100644 index 0000000..be48942 --- /dev/null +++ b/.tool-versions @@ -0,0 +1,2 @@ +elixir 1.14.4-otp-26 +erlang 26.1.1 \ No newline at end of file diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 0c7241b..044d3cc 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -1,75 +1,132 @@ -# Contributor Covenant Code of Conduct +Contributor Covenant Code of Conduct ## Our Pledge -In the interest of fostering an open and welcoming environment, we as -contributors and maintainers pledge to making participation in our project and -our community a harassment-free experience for everyone, regardless of age, -body size, disability, ethnicity, gender identity and expression, level of -experience, nationality, personal appearance, race, religion, or sexual +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, caste, color, religion, or sexual identity and orientation. -## Our Standards - -Examples of behavior that contributes to creating a positive environment -include: - -- Using welcoming and inclusive language -- Being respectful of differing viewpoints and experiences -- Gracefully accepting constructive criticism -- Focusing on what is best for the community -- Showing empathy towards other community members +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. - Examples of unacceptable behavior by participants include: +## Our Standards -- The use of sexualized language or imagery and unwelcome sexual attention or - advances -- Trolling, insulting/derogatory comments, and personal or political attacks -- Public or private harassment -- Publishing others' private information, such as a physical or electronic - address, without explicit permission -- Other conduct which could reasonably be considered inappropriate in a +Examples of behavior that contributes to a positive environment for our +community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the overall + community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or advances of + any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email address, + without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a professional setting -## Our Responsibilities +## Enforcement Responsibilities -Project maintainers are responsible for clarifying the standards of acceptable -behavior and are expected to take appropriate and fair corrective action in -response to any instances of unacceptable behavior. +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. -Project maintainers have the right and responsibility to remove, edit, or -reject comments, commits, code, wiki edits, issues, and other contributions -that are not aligned to this Code of Conduct, or to ban temporarily or -permanently any contributor for other behaviors that they deem inappropriate, -threatening, offensive, or harmful. +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. ## Scope -This Code of Conduct applies both within project spaces and in public spaces -when an individual is representing the project or its community. Examples of -representing a project or community include using an official project e-mail -address, posting via an official social media account, or acting as an -appointed representative at an online or offline event. Representation of a -project may be further defined and clarified by project maintainers. +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported by contacting the project team at . All -complaints will be reviewed and investigated and will result in a response that -is deemed necessary and appropriate to the circumstances. The project team is -obligated to maintain confidentiality with regard to the reporter of an -incident. Further details of specific enforcement policies may be posted -separately. +reported to the community leaders responsible for enforcement at +caos@cesium.di.uminho.pt. +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. -Project maintainers who do not follow or enforce the Code of Conduct in good -faith may face temporary or permanent repercussions as determined by other -members of the project's leadership. +### 2. Warning + +**Community Impact**: A violation through a single incident or series of +actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or permanent +ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within the +community. ## Attribution This Code of Conduct is adapted from the [Contributor Covenant][homepage], -version 1.4, available -[here](https://www.contributor-covenant.org/version/1/4/code-of-conduct.html). +version 2.1, available at +[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1]. + +Community Impact Guidelines were inspired by +[Mozilla's code of conduct enforcement ladder][Mozilla CoC]. + +For answers to common questions about this code of conduct, see the FAQ at +[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at +[https://www.contributor-covenant.org/translations][translations]. [homepage]: https://www.contributor-covenant.org +[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html +[Mozilla CoC]: https://github.com/mozilla/diversity +[FAQ]: https://www.contributor-covenant.org/faq +[translations]: https://www.contributor-covenant.org/translations \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 31daa80..1350b81 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,5 +1,4 @@ [asdf-vm]: https://asdf-vm.com/ -[auth0-docs]: https://auth0.com/docs/get-started/auth0-overview/create-applications # 🚀 Getting Started @@ -10,50 +9,91 @@ local machine for development and testing purposes. The following software is required to be installed on your system: -- [Node.js 16.17+](https://nodejs.org/en/download/) -- [MongoDB 5+](https://www.mongodb.com/) +- [Erlang 26+](https://www.erlang.org/downloads) +- [Elixir 1.14+](https://elixir-lang.org/install.html) +- [PostgreSQL 13+](https://www.postgresql.org/download/)(see [this section](#-docker) for setting up with docker) -We recommend using [asdf version manager][asdf-vm] to install and manage all the -programming languages' requirements. +We recommend using [asdf version manager][asdf-vm] to install and manage all +the programming languages' requirements. -## 👽 Third-party dependencies - -This project uses the [Auth0](https://auth0.com/) for authentication and -authorization (with a custom javascript script). You need to create an App for -a SPA to interact with it in development [here][auth0-docs]. +If you prefer to use docker, see the [section below](#-docker). ## 🔧 Setup -Install all dependencies. +First, clone the repository: ``` -npm install +git clone git@github.com:cesium/cesium.link.git +cd cesium.link ``` -Then, create your local environment file and fill in all the required details. +Then, run the setup script to get all dependencies configured. Make sure the database is up and running. ``` -cp -n .env.sample .env.local +bin/setup ``` +Then you should change the `.env.dev` file as needed. Run this script again if +needed. + ## 🔨 Development -Starting the development server. +Start the development server and then you can visit `http://localhost:4000` +from your browser. ``` -npm run develop +bin/server ``` -Test your code against common guidelines. +Run the tests. ``` -npm run test +bin/test ``` Lint your code. ``` -npm run lint +bin/lint +``` + +Format your code. + +``` +bin/format +``` + +## 🐳 Docker + +For data persistence this project uses a PostgreSQL database. You should have +PostgreSQL up and running. + +If you want to setup the required database using docker containers you can +easily do it with [docker-compose](https://docs.docker.com/compose/install/). + +Create and start the database containers. You should use `linux.yml` if running on Linux and `darwin.yml` if running on macOS. + +``` +cp .env.dev.sample .env.dev +docker-compose -f docker-compose.dev.yml -f {linux,darwin}.yml up db +``` + +Start the previously created containers. + +``` +docker-compose -f docker-compose.dev.yml -f {linux,darwin}.yml start +``` + +Stop the containers. + +``` +docker-compose -f docker-compose.dev.yml -f {linux,darwin}.yml stop +``` + +Destroy the containers and volumes created. + +``` +docker-compose -f docker-compose.dev.yml -f {linux,darwin}.yml down -v ``` ## 🔗 References @@ -61,6 +101,9 @@ npm run lint You can use these resources to learn more about the technologies this project uses. -- [Getting Started with React](https://reactjs.org/docs/getting-started.html) -- [Learn Next.js](https://nextjs.org/learn) -- [Ant Design Components Overview](https://ant.design/components/overview/) +- [Getting Started with Elixir](https://elixir-lang.org/getting-started/introduction.html) +- [Erlang/Elixir Syntax: A Crash Course](https://elixir-lang.org/crash-course.html) +- [Elixir School Course](https://elixirschool.com/en/) +- [Phoenix Guides Overview](https://hexdocs.pm/phoenix/overview.html) +- [Phoenix Documentation](https://hexdocs.pm/phoenix) +- [Ecto Documentation](https://hexdocs.pm/ecto) \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..afe48ea --- /dev/null +++ b/Dockerfile @@ -0,0 +1,93 @@ +# This file is based on these images: +# +# - https://hub.docker.com/r/hexpm/elixir/tags - for the build image +# - https://hub.docker.com/_/debian?tab=tags&page=1&name=bullseye-20230612-slim - for the release image +# - https://pkgs.org/ - resource for finding needed packages +# - Ex: hexpm/elixir:1.15.7-erlang-26.1.1-debian-bullseye-20230612-slim +# +ARG ELIXIR_VERSION=1.15.7 +ARG OTP_VERSION=26.1.1 +ARG DEBIAN_VERSION=bullseye-20230612-slim + +ARG BUILDER_IMAGE="hexpm/elixir:${ELIXIR_VERSION}-erlang-${OTP_VERSION}-debian-${DEBIAN_VERSION}" +ARG RUNNER_IMAGE="debian:${DEBIAN_VERSION}" + +FROM ${BUILDER_IMAGE} as builder + +# install build dependencies +RUN apt-get update -y && apt-get install -y build-essential git \ + && apt-get clean && rm -f /var/lib/apt/lists/*_* + +# prepare build dir +WORKDIR /app + +# install hex + rebar +RUN mix local.hex --force && \ + mix local.rebar --force + +# set build ENV +ENV MIX_ENV="prod" + +# install mix dependencies +COPY mix.exs mix.lock ./ +RUN mix deps.get --only $MIX_ENV +RUN mkdir config + +# copy compile-time config files before we compile dependencies +# to ensure any relevant config change will trigger the dependencies +# to be re-compiled. +COPY config/config.exs config/${MIX_ENV}.exs config/ +RUN mix deps.compile + +COPY priv priv + +COPY lib lib + +COPY assets assets + +# compile assets +RUN mix assets.deploy + +# Compile the release +RUN mix compile + +# Changes to config/runtime.exs don't require recompiling the code +COPY config/runtime.exs config/ + +COPY rel rel +RUN mix release + +# start a new build stage so that the final image will only contain +# the compiled release and other runtime necessities +FROM ${RUNNER_IMAGE} + +RUN apt-get update -y && \ + apt-get install -y libstdc++6 openssl libncurses5 locales ca-certificates \ + && apt-get clean && rm -f /var/lib/apt/lists/*_* + +# Set the locale +RUN sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen && locale-gen + +ENV LANG en_US.UTF-8 +ENV LANGUAGE en_US:en +ENV LC_ALL en_US.UTF-8 + +WORKDIR "/app" +RUN chown nobody /app + +# set runner ENV +ENV MIX_ENV="prod" + +# Only copy the final release from the build stage +COPY --from=builder --chown=nobody:root /app/_build/${MIX_ENV}/rel/cesium_link ./ + +USER nobody + +# If using an environment that doesn't automatically reap zombie processes, it is +# advised to add an init process such as tini via `apt-get install` +# above and adding an entrypoint. See https://github.com/krallin/tini for details +# ENTRYPOINT ["/tini", "--"] + +CMD ["/app/bin/server"] + +ENV ERL_AFLAGS "-proto_dist inet6_tcp" \ No newline at end of file diff --git a/Dockerfile.dev b/Dockerfile.dev new file mode 100644 index 0000000..92a161e --- /dev/null +++ b/Dockerfile.dev @@ -0,0 +1,12 @@ +FROM elixir:1.14-alpine + +# Install build dependencies +RUN apk add --no-cache build-base git python3 + +# Install hex + rebar +RUN mix local.hex --force && \ + mix local.rebar --force + +WORKDIR /app + +CMD [ "sh", "-c", "mix setup; mix phx.server" ] \ No newline at end of file diff --git a/LICENSE.txt b/LICENSE.txt index bed24ab..deb1b5d 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2020 CeSIUM - Centro de Estudantes de Eng. Informática da UMinho +Copyright (c) 2024 CeSIUM - Centro de Estudantes de Eng. Informática da UMinho Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index ce13435..52ed8a5 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ We have a [Contributing Guide][contributing] to help you getting started. -Copyright (c) 2020, CeSIUM. +Copyright (c) 2024, CeSIUM. This project is licensed under the MIT License - see the [LICENSE][license] file for details. diff --git a/assets/css/app.css b/assets/css/app.css new file mode 100644 index 0000000..fc1207c --- /dev/null +++ b/assets/css/app.css @@ -0,0 +1,27 @@ +@import "tailwindcss/base"; +@import "tailwindcss/components"; +@import "tailwindcss/utilities"; + +.emoji-mart-emoji { + @apply flex; + @apply items-center; +} + +.animate-attention { + animation-delay: 2s; + animation-name: shakeX; + animation-duration: 1s; + annimation-fill-mode: both; +} + +@keyframes shakeX { + 0%, 100% { + transform: translateZ(0); + } + 10%, 30%, 50%, 70%, 90% { + transform: translate3d(-10px, 0, 0); + } + 20%, 40%, 60%, 80% { + transform: translate3d(10px, 0, 0); + } +} \ No newline at end of file diff --git a/assets/js/app.js b/assets/js/app.js new file mode 100644 index 0000000..9e122be --- /dev/null +++ b/assets/js/app.js @@ -0,0 +1,55 @@ +// If you want to use Phoenix channels, run `mix help phx.gen.channel` +// to get started and then uncomment the line below. +// import "./user_socket.js" + +// You can include dependencies in two ways. +// +// The simplest option is to put them in assets/vendor and +// import them using relative paths: +// +// import "../vendor/some-package.js" +// +// Alternatively, you can `npm install some-package --prefix assets` and import +// them using a path starting with the package name: +// +// import "some-package" +// + +// Include phoenix_html to handle method=PUT/DELETE in forms and buttons. +import "phoenix_html" +// Establish Phoenix Socket and LiveView configuration. +import {Socket} from "phoenix" +import {LiveSocket} from "phoenix_live_view" +import topbar from "../vendor/topbar" +import { Sorting } from "./hooks/sorting" +import { EmojiPicker } from "./hooks/emoji" +import { QRCodeGenerator } from "./hooks/qrcode-generator" + +// JS Hooks +let Hooks = {} +Hooks.Sorting = Sorting; +Hooks.EmojiPicker = EmojiPicker; +Hooks.QRCodeGenerator = QRCodeGenerator; + +let csrfToken = document.querySelector("meta[name='csrf-token']").getAttribute("content") +let liveSocket = new LiveSocket("/live", Socket, { + longPollFallbackMs: 2500, + params: {_csrf_token: csrfToken}, + hooks: Hooks +}) + +// Show progress bar on live navigation and form submits +topbar.config({barColors: {0: "#f47c58"}, shadowColor: "rgba(0, 0, 0, .3)"}) +window.addEventListener("phx:page-loading-start", _info => topbar.show(300)) +window.addEventListener("phx:page-loading-stop", _info => topbar.hide()) + +// connect if there are any LiveViews on the page +liveSocket.connect() + +// expose liveSocket on window for web console debug logs and latency simulation: +// >> liveSocket.enableDebug() +// >> liveSocket.enableLatencySim(1000) // enabled for duration of browser session +// >> liveSocket.disableLatencySim() +window.liveSocket = liveSocket + +EmojiMart.init({}); diff --git a/assets/js/hooks/emoji.js b/assets/js/hooks/emoji.js new file mode 100644 index 0000000..2a2ec10 --- /dev/null +++ b/assets/js/hooks/emoji.js @@ -0,0 +1,27 @@ +import "../../vendor/emojimart"; + +export const EmojiPicker = { + mounted() { + this.el.addEventListener("click", (event) => + { + if (this.el.parentElement.querySelector("em-emoji-picker") == null) { + const picker = new EmojiMart.Picker({onEmojiSelect: (data) => {updateEmojiInput(this.el.id, data.id); }, theme: "light", set: "native", autoFocus: true, onClickOutside: () => {picker.remove()}}); + picker.style.position = "absolute"; + picker.style.left = "100px"; + this.el.parentElement.appendChild(picker); + event.stopPropagation(); + } else { + removeEmojiPicker(this.el.parentElement); + } + }); + } +} + +function updateEmojiInput(id, emoji) { + document.getElementById("input-" + id).value = emoji; + document.getElementById(id).parentElement.querySelector("em-emoji-picker").style.display = "none"; +} + +function removeEmojiPicker(element) { + element.querySelector("em-emoji-picker").remove(); +} \ No newline at end of file diff --git a/assets/js/hooks/qrcode-generator.js b/assets/js/hooks/qrcode-generator.js new file mode 100644 index 0000000..5ad627c --- /dev/null +++ b/assets/js/hooks/qrcode-generator.js @@ -0,0 +1,27 @@ +import { QRCodeSVG } from "../../vendor/qrcode" + +export const QRCodeGenerator = { + mounted() { + this.el.querySelector("#qr-code-input").addEventListener("input", e => { + updateQRCodeView(this.el, e.target.value); + }); + + updateQRCodeView(this.el, "cesium.link"); + } +}; + +function updateQRCodeView(element, value){ + const code = new QRCodeSVG(value, { + level: "H", + fgColor: "#f47c58", + image: { + source: "/images/cesium.svg", + height: "20%", + width: "20%", + x: "center", + y: "center", + } + }); + + element.querySelector("#qr-code-view").innerHTML = code.toString(); +} \ No newline at end of file diff --git a/assets/js/hooks/sorting.js b/assets/js/hooks/sorting.js new file mode 100644 index 0000000..bd90520 --- /dev/null +++ b/assets/js/hooks/sorting.js @@ -0,0 +1,21 @@ +import Sortable from "../../vendor/sortable"; + +export const Sorting = { + mounted() { + const placeholder = document.createElement('div'); + new Sortable(this.el, { + animation: 150, + ghostClass: "bg-slate-100", + dragClass: "shadow-2xl", + handle: ".handle", + onEnd: () => { + const elements = Array.from(this.el.children) + const ids = elements.map(elm => elm.id) + this.pushEvent("update-sorting", {ids: ids}) + }, + setData: (dataTransfer, _) => { + dataTransfer.setDragImage(placeholder, 0, 0); + } + }) + } +} \ No newline at end of file diff --git a/assets/tailwind.config.js b/assets/tailwind.config.js new file mode 100644 index 0000000..8879260 --- /dev/null +++ b/assets/tailwind.config.js @@ -0,0 +1,75 @@ +// See the Tailwind configuration guide for advanced usage +// https://tailwindcss.com/docs/configuration + +const plugin = require("tailwindcss/plugin") +const fs = require("fs") +const path = require("path") + +module.exports = { + content: [ + "./js/**/*.js", + "../lib/cesium_link_web.ex", + "../lib/cesium_link_web/**/*.*ex" + ], + theme: { + extend: { + colors: { + brand: "#f47c58", + } + }, + }, + plugins: [ + require("@tailwindcss/forms"), + // Allows prefixing tailwind classes with LiveView classes to add rules + // only when LiveView classes are applied, for example: + // + // + """ + end + + @doc """ + Renders a data list. + + ## Examples + + <.list> + <:item title="Title"><%= @post.title %> + <:item title="Views"><%= @post.views %> + + """ + slot :item, required: true do + attr :title, :string, required: true + end + + def list(assigns) do + ~H""" +
+
+
+
<%= item.title %>
+
<%= render_slot(item) %>
+
+
+
+ """ + end + + @doc """ + Renders a back navigation link. + + ## Examples + + <.back navigate={~p"/posts"}>Back to posts + """ + attr :navigate, :any, required: true + slot :inner_block, required: true + + def back(assigns) do + ~H""" +
+ <.link navigate={@navigate} class="text-sm font-semibold leading-6 text-zinc-900 hover:text-zinc-700"> + <.icon name="hero-arrow-left-solid" class="h-3 w-3" /> + <%= render_slot(@inner_block) %> + +
+ """ + end + + @doc """ + Renders a [Heroicon](https://heroicons.com). + + Heroicons come in three styles – outline, solid, and mini. + By default, the outline style is used, but solid and mini may + be applied by using the `-solid` and `-mini` suffix. + + You can customize the size and colors of the icons by setting + width, height, and background color classes. + + Icons are extracted from the `deps/heroicons` directory and bundled within + your compiled app.css by the plugin in your `assets/tailwind.config.js`. + + ## Examples + + <.icon name="hero-x-mark-solid" /> + <.icon name="hero-arrow-path" class="ml-1 w-3 h-3 animate-spin" /> + """ + attr :name, :string, required: true + attr :class, :string, default: nil + + def icon(%{name: "hero-" <> _} = assigns) do + ~H""" + + """ + end + + ## JS Commands + + def show(js \\ %JS{}, selector) do + JS.show(js, + to: selector, + transition: + {"transition-all transform ease-out duration-300", + "opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95", + "opacity-100 translate-y-0 sm:scale-100"} + ) + end + + def hide(js \\ %JS{}, selector) do + JS.hide(js, + to: selector, + time: 200, + transition: + {"transition-all transform ease-in duration-200", + "opacity-100 translate-y-0 sm:scale-100", + "opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95"} + ) + end + + def show_modal(js \\ %JS{}, id) when is_binary(id) do + js + |> JS.show(to: "##{id}") + |> JS.show( + to: "##{id}-bg", + transition: {"transition-all transform ease-out duration-300", "opacity-0", "opacity-100"} + ) + |> show("##{id}-container") + |> JS.add_class("overflow-hidden", to: "body") + |> JS.focus_first(to: "##{id}-content") + end + + def hide_modal(js \\ %JS{}, id) do + js + |> JS.hide( + to: "##{id}-bg", + transition: {"transition-all transform ease-in duration-200", "opacity-100", "opacity-0"} + ) + |> hide("##{id}-container") + |> JS.hide(to: "##{id}", transition: {"block", "block", "hidden"}) + |> JS.remove_class("overflow-hidden", to: "body") + |> JS.pop_focus() + end + + @doc """ + Returns a relative datetime string for the given datetime. + + ## Examples + + iex> relative_datetime(Timex.today() |> Timex.shift(years: -3)) + "3 years ago" + + iex> relative_datetime(Timex.today() |> Timex.shift(years: 3)) + "in 3 years" + + iex> relative_datetime(Timex.today() |> Timex.shift(months: -8)) + "8 months ago" + + iex> relative_datetime(Timex.today() |> Timex.shift(months: 8)) + "in 8 months" + + iex> relative_datetime(Timex.today() |> Timex.shift(days: -1)) + "yesterday" + + """ + def relative_datetime(nil), do: "" + + def relative_datetime(""), do: "" + + def relative_datetime(datetime) do + Relative.lformat!(datetime, "{relative}", Gettext.get_locale()) + end + + @doc """ + Returns the frontend URL for the application. + """ + def frontend_url do + CesiumLinkWeb.Endpoint.url() + end + + @doc """ + Translates an error message using gettext. + """ + def translate_error({msg, opts}) do + # When using gettext, we typically pass the strings we want + # to translate as a static argument: + # + # # Translate the number of files with plural rules + # dngettext("errors", "1 file", "%{count} files", count) + # + # However the error messages in our forms and APIs are generated + # dynamically, so we need to translate them by calling Gettext + # with our gettext backend as first argument. Translations are + # available in the errors.po file (as we use the "errors" domain). + if count = opts[:count] do + Gettext.dngettext(CesiumLinkWeb.Gettext, "errors", msg, msg, count, opts) + else + Gettext.dgettext(CesiumLinkWeb.Gettext, "errors", msg, opts) + end + end + + @doc """ + Translates the errors for a field from a keyword list of errors. + """ + def translate_errors(errors, field) when is_list(errors) do + for {^field, {msg, opts}} <- errors, do: translate_error({msg, opts}) + end + + @doc """ + Truncates a string to a given length and appends an ellipsis if the string is longer. + """ + def truncate_elipsis(str, len) do + if String.length(str) > len do + String.slice(str, 0, len) <> "..." + else + str + end + end +end diff --git a/lib/cesium_link_web/components/emoji.ex b/lib/cesium_link_web/components/emoji.ex new file mode 100644 index 0000000..385f252 --- /dev/null +++ b/lib/cesium_link_web/components/emoji.ex @@ -0,0 +1,17 @@ +defmodule CesiumLinkWeb.Components.Emoji do + @moduledoc """ + Emoji rendering component. + """ + use Phoenix.Component + + attr :code, :string, required: true + attr :class, :string, default: "" + + def emoji(assigns) do + ~H""" + + + + """ + end +end diff --git a/lib/cesium_link_web/components/footer.ex b/lib/cesium_link_web/components/footer.ex new file mode 100644 index 0000000..4a154eb --- /dev/null +++ b/lib/cesium_link_web/components/footer.ex @@ -0,0 +1,32 @@ +defmodule CesiumLinkWeb.Components.Footer do + @moduledoc """ + Application footer component. + """ + use Phoenix.Component + + def footer(assigns) do + ~H""" +
+ +
+ <.link href="https://instagram.com/cesiuminho" target="_blank"> + Instagram + + <.link href="https://facebook.com/cesiuminho" target="_blank"> + Facebook + + <.link href="https://x.com/cesiuminho" target="_blank"> + X + + <.link href="https://github.com/cesium" target="_blank"> + GitHub + +
+ + <.link href="https://cesium.pt" target="_blank" class="flex w-full select-none items-center justify-center py-4"> + hacked with 🧡 by CeSIUM + +
+ """ + end +end diff --git a/lib/cesium_link_web/components/google_oauth_button.ex b/lib/cesium_link_web/components/google_oauth_button.ex new file mode 100644 index 0000000..2dff9c5 --- /dev/null +++ b/lib/cesium_link_web/components/google_oauth_button.ex @@ -0,0 +1,15 @@ +defmodule CesiumLinkWeb.Components.GoogleOAuthButton do + @moduledoc """ + A component for rendering a Google OAuth button. + """ + use Phoenix.Component + + def google_oauth_button(assigns) do + ~H""" +
+ +

Sign in with Google

+
+ """ + end +end diff --git a/lib/cesium_link_web/components/layouts.ex b/lib/cesium_link_web/components/layouts.ex new file mode 100644 index 0000000..f16b3d8 --- /dev/null +++ b/lib/cesium_link_web/components/layouts.ex @@ -0,0 +1,14 @@ +defmodule CesiumLinkWeb.Layouts do + @moduledoc """ + This module holds different layouts used by your application. + + See the `layouts` directory for all templates available. + The "root" layout is a skeleton rendered as part of the + application router. The "app" layout is set as the default + layout on both `use CesiumLinkWeb, :controller` and + `use CesiumLinkWeb, :live_view`. + """ + use CesiumLinkWeb, :html + + embed_templates "layouts/*" +end diff --git a/lib/cesium_link_web/components/layouts/app.html.heex b/lib/cesium_link_web/components/layouts/app.html.heex new file mode 100644 index 0000000..6a431b0 --- /dev/null +++ b/lib/cesium_link_web/components/layouts/app.html.heex @@ -0,0 +1,87 @@ +
+ + +
+ +
+
+ +
+
+ <.flash_group flash={@flash} /> + <%= @inner_content %> +
+
diff --git a/lib/cesium_link_web/components/layouts/root.html.heex b/lib/cesium_link_web/components/layouts/root.html.heex new file mode 100644 index 0000000..d568448 --- /dev/null +++ b/lib/cesium_link_web/components/layouts/root.html.heex @@ -0,0 +1,18 @@ + + + + + + + <.live_title> + <%= assigns[:page_title] || "cesium.link" %> + + + + + + + <%= @inner_content %> + + diff --git a/lib/cesium_link_web/controllers/error_html.ex b/lib/cesium_link_web/controllers/error_html.ex new file mode 100644 index 0000000..257de6e --- /dev/null +++ b/lib/cesium_link_web/controllers/error_html.ex @@ -0,0 +1,24 @@ +defmodule CesiumLinkWeb.ErrorHTML do + @moduledoc """ + This module is invoked by your endpoint in case of errors on HTML requests. + + See config/config.exs. + """ + use CesiumLinkWeb, :html + + # If you want to customize your error pages, + # uncomment the embed_templates/1 call below + # and add pages to the error directory: + # + # * lib/cesium_link_web/controllers/error_html/404.html.heex + # * lib/cesium_link_web/controllers/error_html/500.html.heex + # + # embed_templates "error_html/*" + + # The default is to render a plain text page based on + # the template name. For example, "404.html" becomes + # "Not Found". + def render(template, _assigns) do + Phoenix.Controller.status_message_from_template(template) + end +end diff --git a/lib/cesium_link_web/controllers/error_json.ex b/lib/cesium_link_web/controllers/error_json.ex new file mode 100644 index 0000000..5695d5e --- /dev/null +++ b/lib/cesium_link_web/controllers/error_json.ex @@ -0,0 +1,21 @@ +defmodule CesiumLinkWeb.ErrorJSON do + @moduledoc """ + This module is invoked by your endpoint in case of errors on JSON requests. + + See config/config.exs. + """ + + # If you want to customize a particular status code, + # you may add your own clauses, such as: + # + # def render("500.json", _assigns) do + # %{errors: %{detail: "Internal Server Error"}} + # end + + # By default, Phoenix returns the status message from + # the template name. For example, "404.json" becomes + # "Not Found". + def render(template, _assigns) do + %{errors: %{detail: Phoenix.Controller.status_message_from_template(template)}} + end +end diff --git a/lib/cesium_link_web/controllers/google_auth_controller.ex b/lib/cesium_link_web/controllers/google_auth_controller.ex new file mode 100644 index 0000000..61c3f2e --- /dev/null +++ b/lib/cesium_link_web/controllers/google_auth_controller.ex @@ -0,0 +1,45 @@ +defmodule CesiumLinkWeb.GoogleAuthController do + use CesiumLinkWeb, :controller + + alias CesiumLink.Accounts + alias CesiumLinkWeb.UserAuth + + @doc """ + Handles the callback from Google Auth API redirect. + """ + def index(conn, %{"code" => code}) do + case ElixirAuthGoogle.get_token(code, CesiumLinkWeb.Endpoint.url()) do + {:ok, token} -> + handle_google_auth(conn, token) + + {:error, _} -> + conn + |> put_flash(:error, "Error logging in with Google Auth") + |> redirect(to: "/") + end + end + + defp handle_google_auth(conn, token) do + {:ok, profile} = ElixirAuthGoogle.get_user_profile(token.access_token) + + case get_user_by_email(profile.email) do + {:ok, user} -> + conn + |> UserAuth.log_in_user(user, %{email: user.email}) + + {:error, _} -> + conn + |> put_flash(:error, "Error logging in with Google Auth") + |> redirect(to: "/") + end + end + + # Returns an account for the given email (if one doesn't exist, it creates it) + defp get_user_by_email(email) do + Accounts.get_user_by_email(email) + |> case do + nil -> Accounts.register_user(%{email: email}) + user -> {:ok, user} + end + end +end diff --git a/lib/cesium_link_web/controllers/redirect_controller.ex b/lib/cesium_link_web/controllers/redirect_controller.ex new file mode 100644 index 0000000..a5fcab3 --- /dev/null +++ b/lib/cesium_link_web/controllers/redirect_controller.ex @@ -0,0 +1,22 @@ +defmodule CesiumLinkWeb.RedirectController do + use CesiumLinkWeb, :controller + + alias CesiumLink.Redirects + + def redirect_regular(conn, %{"slug" => slug}) do + conn + |> redirect(slug, :default) + end + + def redirect_form(conn, %{"slug" => slug}) do + conn + |> redirect(slug, :form) + end + + defp redirect(conn, slug, type) do + case Redirects.redirect_action(slug, type) do + {:ok, url} -> conn |> redirect(external: url) + {:error, _} -> conn |> put_status(404) + end + end +end diff --git a/lib/cesium_link_web/controllers/user_session_controller.ex b/lib/cesium_link_web/controllers/user_session_controller.ex new file mode 100644 index 0000000..150ced0 --- /dev/null +++ b/lib/cesium_link_web/controllers/user_session_controller.ex @@ -0,0 +1,11 @@ +defmodule CesiumLinkWeb.UserSessionController do + use CesiumLinkWeb, :controller + + alias CesiumLinkWeb.UserAuth + + def delete(conn, _params) do + conn + |> put_flash(:info, "Logged out successfully.") + |> UserAuth.log_out_user() + end +end diff --git a/lib/cesium_link_web/endpoint.ex b/lib/cesium_link_web/endpoint.ex new file mode 100644 index 0000000..fcd8a1c --- /dev/null +++ b/lib/cesium_link_web/endpoint.ex @@ -0,0 +1,54 @@ +defmodule CesiumLinkWeb.Endpoint do + @moduledoc false + use Phoenix.Endpoint, otp_app: :cesium_link + + # The session will be stored in the cookie and signed, + # this means its contents can be read but not tampered with. + # Set :encryption_salt if you would also like to encrypt it. + @session_options [ + store: :cookie, + key: "_cesium_link_key", + signing_salt: "CNV8klGF", + same_site: "Lax" + ] + + socket "/live", Phoenix.LiveView.Socket, + websocket: [connect_info: [session: @session_options]], + longpoll: [connect_info: [session: @session_options]] + + # Serve at "/" the static files from "priv/static" directory. + # + # You should set gzip to true if you are running phx.digest + # when deploying your static files in production. + plug Plug.Static, + at: "/", + from: :cesium_link, + gzip: false, + only: CesiumLinkWeb.static_paths() + + # Code reloading can be explicitly enabled under the + # :code_reloader configuration of your endpoint. + if code_reloading? do + socket "/phoenix/live_reload/socket", Phoenix.LiveReloader.Socket + plug Phoenix.LiveReloader + plug Phoenix.CodeReloader + plug Phoenix.Ecto.CheckRepoStatus, otp_app: :cesium_link + end + + plug Phoenix.LiveDashboard.RequestLogger, + param_key: "request_logger", + cookie_key: "request_logger" + + plug Plug.RequestId + plug Plug.Telemetry, event_prefix: [:phoenix, :endpoint] + + plug Plug.Parsers, + parsers: [:urlencoded, :multipart, :json], + pass: ["*/*"], + json_decoder: Phoenix.json_library() + + plug Plug.MethodOverride + plug Plug.Head + plug Plug.Session, @session_options + plug CesiumLinkWeb.Router +end diff --git a/lib/cesium_link_web/gettext.ex b/lib/cesium_link_web/gettext.ex new file mode 100644 index 0000000..fe7884a --- /dev/null +++ b/lib/cesium_link_web/gettext.ex @@ -0,0 +1,24 @@ +defmodule CesiumLinkWeb.Gettext do + @moduledoc """ + A module providing Internationalization with a gettext-based API. + + By using [Gettext](https://hexdocs.pm/gettext), + your module gains a set of macros for translations, for example: + + import CesiumLinkWeb.Gettext + + # Simple translation + gettext("Here is the string to translate") + + # Plural translation + ngettext("Here is the string to translate", + "Here are the strings to translate", + 3) + + # Domain-based translation + dgettext("errors", "Here is the error message to translate") + + See the [Gettext Docs](https://hexdocs.pm/gettext) for detailed usage. + """ + use Gettext, otp_app: :cesium_link +end diff --git a/lib/cesium_link_web/live/auth_live/index.ex b/lib/cesium_link_web/live/auth_live/index.ex new file mode 100644 index 0000000..32c40a3 --- /dev/null +++ b/lib/cesium_link_web/live/auth_live/index.ex @@ -0,0 +1,37 @@ +defmodule CesiumLinkWeb.AuthLive.Index do + use CesiumLinkWeb, :live_view + + import CesiumLinkWeb.Components.GoogleOAuthButton + + @impl true + def render(assigns) do + ~H""" + + """ + end + + @impl true + def mount(_params, _session, socket) do + {:ok, socket} + end + + @impl true + def handle_params(_params, _url, socket) do + {:noreply, + socket + |> assign(:oauth_google_url, fetch_oauth_google_url()) + |> assign(:page_title, "cesium.link - Log In")} + end + + def fetch_oauth_google_url do + CesiumLinkWeb.Endpoint.url() + |> ElixirAuthGoogle.generate_oauth_url() + end +end diff --git a/lib/cesium_link_web/live/home_live/index.ex b/lib/cesium_link_web/live/home_live/index.ex new file mode 100644 index 0000000..b4ebcfe --- /dev/null +++ b/lib/cesium_link_web/live/home_live/index.ex @@ -0,0 +1,25 @@ +defmodule CesiumLinkWeb.HomeLive.Index do + use CesiumLinkWeb, :live_view + + import CesiumLinkWeb.Components.{Card, Footer} + + alias CesiumLink.Links + + @impl true + def mount(_params, _session, socket) do + {:ok, stream(socket, :links, Links.list_unarchived_links_by_index())} + end + + @impl true + def handle_params(_params, _url, socket) do + {:noreply, + socket + |> assign(:page_title, "CeSIUM")} + end + + @impl true + def handle_event("click", %{"id" => id}, socket) do + Links.increment_link_visits(Links.get_link!(id)) + {:noreply, socket} + end +end diff --git a/lib/cesium_link_web/live/home_live/index.html.heex b/lib/cesium_link_web/live/home_live/index.html.heex new file mode 100644 index 0000000..bb972d5 --- /dev/null +++ b/lib/cesium_link_web/live/home_live/index.html.heex @@ -0,0 +1,13 @@ +
+
+ CeSIUM +

CeSIUM

+

Centro de Estudantes de Engenharia Informática da UMinho

+
+ <%= for {id, link} <- @streams.links do %> + <.card id={id} link={link} /> + <% end %> +
+
+ <.footer /> +
diff --git a/lib/cesium_link_web/live/link_live/archived_live/index.ex b/lib/cesium_link_web/live/link_live/archived_live/index.ex new file mode 100644 index 0000000..53283eb --- /dev/null +++ b/lib/cesium_link_web/live/link_live/archived_live/index.ex @@ -0,0 +1,66 @@ +defmodule CesiumLinkWeb.ArchivedLive.Index do + use CesiumLinkWeb, :admin_live_view + + alias CesiumLink.Links + + @impl true + def mount(_params, _session, socket) do + {:ok, stream(socket, :links, Links.list_archived_links())} + end + + @impl true + def handle_params(params, _url, socket) do + {:noreply, apply_action(socket, socket.assigns.live_action, params)} + end + + defp apply_action(socket, :edit, %{"id" => id}) do + socket + |> assign(:page_title, "Edit Link") + |> assign(:link, Links.get_link!(id)) + end + + defp apply_action(socket, :unarchive, %{"id" => id}) do + socket + |> assign(:page_title, "Unarchive Link") + |> assign(:link, Links.get_link!(id)) + end + + defp apply_action(socket, :delete, %{"id" => id}) do + socket + |> assign(:page_title, "Delete Link") + |> assign(:link, Links.get_link!(id)) + end + + defp apply_action(socket, :index, _params) do + socket + |> assign(:page_title, "Archived Links") + |> assign(:link, nil) + end + + @impl true + def handle_info({CesiumLinkWeb.LinkLive.FormComponent, {:saved, link}}, socket) do + {:noreply, stream_insert(socket, :links, link)} + end + + @impl true + def handle_event("delete", %{"id" => id}, socket) do + link = Links.get_link!(id) + {:ok, _} = Links.delete_link(link) + + {:noreply, + stream_delete(socket, :links, link) + |> push_patch(to: ~p"/admin/links/archived") + |> put_flash(:info, "Link deleted successfully")} + end + + @impl true + def handle_event("unarchive", %{"id" => id}, socket) do + link = Links.get_link!(id) + {:ok, _} = Links.unarchive_link(link) + + {:noreply, + stream_delete(socket, :links, link) + |> push_patch(to: ~p"/admin/links/archived") + |> put_flash(:info, "Link unarchived successfully")} + end +end diff --git a/lib/cesium_link_web/live/link_live/archived_live/index.html.heex b/lib/cesium_link_web/live/link_live/archived_live/index.html.heex new file mode 100644 index 0000000..83db8a8 --- /dev/null +++ b/lib/cesium_link_web/live/link_live/archived_live/index.html.heex @@ -0,0 +1,86 @@ +<.header> + Archived Links + <:actions> + <.link patch={~p"/admin/links"}> + <.button> + <.icon name="hero-arrow-left" class="w-5 h-5" /> + + + + +<.table id="links" rows={@streams.links}> + <:col :let={{_id, link}} label="Name"><%= link.name %> + <:col :let={{_id, link}} label="Emoji"> + <.emoji code={link.emoji} /> + + <:col :let={{_id, link}} label="URL"> + <.link target="_blank" class="hover:text-brand hover:underline" navigate={link.url}> + <%= truncate_elipsis(link.url, 50) %> + + + <:col :let={{_id, link}} label="Clicks"><%= link.visits %> + <:col :let={{_id, link}} label="Attention"> + + + <:action :let={{_id, link}}> + <.link patch={~p"/admin/links/archived/#{link}/edit"}> + <.icon name="hero-pencil" class="w-5 h-5" /> + + + <:action :let={{_id, link}}> + <.link patch={~p"/admin/links/archived/#{link}/unarchive"}> + <.icon name="hero-archive-box-x-mark" class="w-5 h-5" /> + + + <:action :let={{_id, link}}> + <.link patch={~p"/admin/links/archived/#{link}/delete"}> + <.icon name="hero-trash" class="w-5 h-5" /> + + + + +<.modal :if={@live_action in [:new, :edit]} id="link-modal" show on_cancel={JS.patch(~p"/admin/links/archived")}> + <.live_component module={CesiumLinkWeb.LinkLive.FormComponent} id={@link.id || :new} title={@page_title} action={@live_action} link={@link} patch={~p"/admin/links/archived"} /> + + +<.modal :if={@live_action == :unarchive} id="unarchive-modal" show on_cancel={JS.patch(~p"/admin/links/archived")}> +
+ <.header> + <%= gettext("Unarchive Link") %> + <:subtitle> + <%= gettext("Are you sure you want to turn this link public again?") %> + + +
+ <.link patch={~p"/admin/links/archived"} class="w-full outline-none"> + <.button class="w-full"> + <%= gettext("Cancel") %> + + + <.button phx-click="unarchive" phx-value-id={@link.id} class="w-full"> + <%= gettext("Confirm") %> + +
+
+ + +<.modal :if={@live_action == :delete} id="delete-modal" show on_cancel={JS.patch(~p"/admin/links/archived")}> +
+ <.header> + <%= gettext("Delete Link") %> + <:subtitle> + <%= gettext("Are you sure you want to delete this link? This action is irreversible.") %> + + +
+ <.link patch={~p"/admin/links/archived"} class="w-full outline-none"> + <.button class="w-full"> + <%= gettext("Cancel") %> + + + <.button phx-click="delete" phx-value-id={@link.id} class="w-full"> + <%= gettext("Confirm") %> + +
+
+ diff --git a/lib/cesium_link_web/live/link_live/form_component.ex b/lib/cesium_link_web/live/link_live/form_component.ex new file mode 100644 index 0000000..dff7386 --- /dev/null +++ b/lib/cesium_link_web/live/link_live/form_component.ex @@ -0,0 +1,96 @@ +defmodule CesiumLinkWeb.LinkLive.FormComponent do + use CesiumLinkWeb, :live_component + + alias CesiumLink.Links + + @impl true + def render(assigns) do + ~H""" +
+ <.header> + <%= @title %> + <:subtitle> + <%= gettext("Links appear as highlights on the home page of the app.") %> + + + + <.simple_form for={@form} id="link-form" phx-target={@myself} phx-change="validate" phx-submit="save"> + <.input field={@form[:name]} type="text" label="Name" /> + <.input field={@form[:emoji]} type="emoji" label="Emoji" /> + <.input field={@form[:url]} type="text" label="URL" /> + <.input field={@form[:attention]} type="checkbox" label="Attention" /> + <:actions> + <.button phx-disable-with="Saving...">Save Link + + +
+ """ + end + + @impl true + def update(%{link: link} = assigns, socket) do + changeset = Links.change_link(link) + + {:ok, + socket + |> assign(assigns) + |> assign_form(changeset)} + end + + @impl true + def handle_event("validate", %{"link" => link_params}, socket) do + changeset = + socket.assigns.link + |> Links.change_link(link_params) + |> Map.put(:action, :validate) + + {:noreply, assign_form(socket, changeset)} + end + + def handle_event("save", %{"link" => link_params}, socket) do + save_link(socket, socket.assigns.action, link_params) + end + + defp save_link(socket, :edit, link_params) do + case Links.update_link( + socket.assigns.link, + link_params |> Map.put_new("edited_at", Timex.now()) + ) do + {:ok, link} -> + notify_parent({:saved, link}) + + {:noreply, + socket + |> put_flash(:info, "Link updated successfully") + |> push_patch(to: socket.assigns.patch)} + + {:error, %Ecto.Changeset{} = changeset} -> + {:noreply, assign_form(socket, changeset)} + end + end + + defp save_link(socket, :new, link_params) do + case Links.create_link( + link_params + |> Map.put_new("index", Links.get_next_link_index()) + |> Map.put_new("edited_at", Timex.now()) + ) do + {:ok, link} -> + notify_parent({:saved, link}) + + {:noreply, + socket + |> put_flash(:info, "Link created successfully") + |> push_patch(to: socket.assigns.patch)} + + {:error, %Ecto.Changeset{} = changeset} -> + {:noreply, assign_form(socket, changeset)} + end + end + + defp assign_form(socket, %Ecto.Changeset{} = changeset) do + assign(socket, :form, to_form(changeset)) + end + + defp notify_parent(msg), do: send(self(), {__MODULE__, msg}) +end diff --git a/lib/cesium_link_web/live/link_live/index.ex b/lib/cesium_link_web/live/link_live/index.ex new file mode 100644 index 0000000..a1fa7c3 --- /dev/null +++ b/lib/cesium_link_web/live/link_live/index.ex @@ -0,0 +1,69 @@ +defmodule CesiumLinkWeb.LinkLive.Index do + use CesiumLinkWeb, :admin_live_view + + alias CesiumLink.Links + alias CesiumLink.Links.Link + + @impl true + def mount(_params, _session, socket) do + {:ok, stream(socket, :links, Links.list_unarchived_links())} + end + + @impl true + def handle_params(params, _url, socket) do + {:noreply, apply_action(socket, socket.assigns.live_action, params)} + end + + defp apply_action(socket, :edit, %{"id" => id}) do + socket + |> assign(:page_title, "Edit Link") + |> assign(:link, Links.get_link!(id)) + end + + defp apply_action(socket, :archive, %{"id" => id}) do + socket + |> assign(:page_title, "Archive Link") + |> assign(:link, Links.get_link!(id)) + end + + defp apply_action(socket, :new, _params) do + socket + |> assign(:page_title, "New Link") + |> assign(:link, %Link{}) + end + + defp apply_action(socket, :index, _params) do + socket + |> assign(:page_title, "Links") + |> assign(:link, nil) + end + + @impl true + def handle_info({CesiumLinkWeb.LinkLive.FormComponent, {:saved, link}}, socket) do + {:noreply, stream_insert(socket, :links, link)} + end + + @impl true + def handle_event("archive", %{"id" => id}, socket) do + link = Links.get_link!(id) + {:ok, _} = Links.archive_link(link) + + {:noreply, + stream_delete(socket, :links, link) + |> push_patch(to: ~p"/admin/links") + |> put_flash(:info, "Link archived successfully")} + end + + @impl true + def handle_event("update-sorting", %{"ids" => ids}, socket) do + ids + |> Enum.with_index(0) + |> Enum.each(fn {"links-" <> id, index} -> + id + |> Links.get_link!() + |> Links.update_link(%{index: index}) + end) + + {:noreply, socket} + end +end diff --git a/lib/cesium_link_web/live/link_live/index.html.heex b/lib/cesium_link_web/live/link_live/index.html.heex new file mode 100644 index 0000000..3be9618 --- /dev/null +++ b/lib/cesium_link_web/live/link_live/index.html.heex @@ -0,0 +1,69 @@ +<.header> + Links + <:actions> + <.link class="pr-2" patch={~p"/admin/links/archived"}> + <.button> + <.icon name="hero-archive-box" class="w-5 h-5" /> + + + <.link patch={~p"/admin/links/new"}> + <.button> + <.icon name="hero-plus" class="w-5 h-5" /> New Link + + + + + +<.table id="links" rows={@streams.links} phx-hook="Sorting"> + <:col :let={{_id, _link}}><.icon name="hero-bars-3 cursor-pointer ml-4" class="handle w-5 h-5" /> + <:col :let={{_id, link}} label="Name"> +

<%= link.name %>

+ + <:col :let={{_id, link}} label="Emoji"> + <.emoji code={link.emoji} /> + + <:col :let={{_id, link}} label="URL"> + <.link target="_blank" class="hover:text-brand hover:underline" navigate={link.url}> + <%= truncate_elipsis(link.url, 50) %> + + + <:col :let={{_id, link}} label="Clicks"><%= link.visits %> + <:col :let={{_id, link}} label="Attention"> + + + <:action :let={{_id, link}}> + <.link patch={~p"/admin/links/#{link}/edit"}> + <.icon name="hero-pencil" class="w-5 h-5" /> + + + <:action :let={{_id, link}}> + <.link patch={~p"/admin/links/#{link}/archive"}> + <.icon name="hero-archive-box" class="w-5 h-5" /> + + + + +<.modal :if={@live_action in [:new, :edit]} id="link-modal" show on_cancel={JS.patch(~p"/admin/links")}> + <.live_component module={CesiumLinkWeb.LinkLive.FormComponent} id={@link.id || :new} title={@page_title} action={@live_action} link={@link} patch={~p"/admin/links"} /> + + +<.modal :if={@live_action == :archive} id="archive-modal" show on_cancel={JS.patch(~p"/admin/links")}> +
+ <.header> + <%= gettext("Archive Link") %> + <:subtitle> + <%= gettext("Are you sure you want to archive this link?") %> + + +
+ <.link patch={~p"/admin/links"} class="w-full outline-none"> + <.button class="w-full"> + <%= gettext("Cancel") %> + + + <.button phx-click="archive" phx-value-id={@link.id} class="w-full"> + <%= gettext("Confirm") %> + +
+
+ diff --git a/lib/cesium_link_web/live/qrcode_live/index.ex b/lib/cesium_link_web/live/qrcode_live/index.ex new file mode 100644 index 0000000..ea7c005 --- /dev/null +++ b/lib/cesium_link_web/live/qrcode_live/index.ex @@ -0,0 +1,27 @@ +defmodule CesiumLinkWeb.QRCodeLive.Index do + use CesiumLinkWeb, :admin_live_view + + @impl true + def render(assigns) do + ~H""" +
+
+ <.input id="qr-code-input" name="URL" label="URL" placeholder="URL to encode" value="cesium.link" spellcheck="false" /> +
+
+
+ """ + end + + @impl true + def mount(_params, _session, socket) do + {:ok, socket} + end + + @impl true + def handle_params(_params, _url, socket) do + {:noreply, + socket + |> assign(:page_title, "QR Code Generator")} + end +end diff --git a/lib/cesium_link_web/live/redirect_live/form_component.ex b/lib/cesium_link_web/live/redirect_live/form_component.ex new file mode 100644 index 0000000..8682cf9 --- /dev/null +++ b/lib/cesium_link_web/live/redirect_live/form_component.ex @@ -0,0 +1,92 @@ +defmodule CesiumLinkWeb.RedirectLive.FormComponent do + use CesiumLinkWeb, :live_component + + alias CesiumLink.Redirects + + @impl true + def render(assigns) do + ~H""" +
+ <.header> + <%= @title %> + <:subtitle> + <%= gettext("URL shortener with custom slug.") %> + + + + <.simple_form for={@form} id="redirect-form" phx-target={@myself} phx-change="validate" phx-submit="save"> + <.input field={@form[:name]} type="text" label="Name" /> + <.input field={@form[:slug]} type="text" label="Slug" /> + <.input field={@form[:url]} type="text" label="URL" /> + <.input field={@form[:type]} type="select" label="Type" prompt="Choose a value" options={[Default: :default, Form: :form]} /> + <:actions> + <.button phx-disable-with="Saving...">Save Redirect + + +
+ """ + end + + @impl true + def update(%{redirect: redirect} = assigns, socket) do + changeset = Redirects.change_redirect(redirect) + + {:ok, + socket + |> assign(assigns) + |> assign_form(changeset)} + end + + @impl true + def handle_event("validate", %{"redirect" => redirect_params}, socket) do + changeset = + socket.assigns.redirect + |> Redirects.change_redirect(redirect_params) + |> Map.put(:action, :validate) + + {:noreply, assign_form(socket, changeset)} + end + + def handle_event("save", %{"redirect" => redirect_params}, socket) do + save_redirect(socket, socket.assigns.action, redirect_params) + end + + defp save_redirect(socket, :edit, redirect_params) do + case Redirects.update_redirect( + socket.assigns.redirect, + redirect_params |> Map.put_new("edited_at", Timex.now()) + ) do + {:ok, redirect} -> + notify_parent({:saved, redirect}) + + {:noreply, + socket + |> put_flash(:info, "Redirect updated successfully") + |> push_patch(to: socket.assigns.patch)} + + {:error, %Ecto.Changeset{} = changeset} -> + {:noreply, assign_form(socket, changeset)} + end + end + + defp save_redirect(socket, :new, redirect_params) do + case Redirects.create_redirect(redirect_params |> Map.put_new("edited_at", Timex.now())) do + {:ok, redirect} -> + notify_parent({:saved, redirect}) + + {:noreply, + socket + |> put_flash(:info, "Redirect created successfully") + |> push_patch(to: socket.assigns.patch)} + + {:error, %Ecto.Changeset{} = changeset} -> + {:noreply, assign_form(socket, changeset)} + end + end + + defp assign_form(socket, %Ecto.Changeset{} = changeset) do + assign(socket, :form, to_form(changeset)) + end + + defp notify_parent(msg), do: send(self(), {__MODULE__, msg}) +end diff --git a/lib/cesium_link_web/live/redirect_live/index.ex b/lib/cesium_link_web/live/redirect_live/index.ex new file mode 100644 index 0000000..19290e9 --- /dev/null +++ b/lib/cesium_link_web/live/redirect_live/index.ex @@ -0,0 +1,64 @@ +defmodule CesiumLinkWeb.RedirectLive.Index do + use CesiumLinkWeb, :admin_live_view + + alias CesiumLink.Redirects + alias CesiumLink.Redirects.Redirect + + @impl true + def mount(_params, _session, socket) do + {:ok, stream(socket, :redirects, Redirects.list_redirects())} + end + + @impl true + def handle_params(params, _url, socket) do + {:noreply, apply_action(socket, socket.assigns.live_action, params)} + end + + defp apply_action(socket, :edit, %{"id" => id}) do + socket + |> assign(:page_title, "Edit Redirect") + |> assign(:redirect, Redirects.get_redirect!(id)) + end + + defp apply_action(socket, :delete, %{"id" => id}) do + socket + |> assign(:page_title, "Delete Redirect") + |> assign(:redirect, Redirects.get_redirect!(id)) + end + + defp apply_action(socket, :new, _params) do + socket + |> assign(:page_title, "New Redirect") + |> assign(:redirect, %Redirect{}) + end + + defp apply_action(socket, :index, _params) do + socket + |> assign(:page_title, "Redirects") + |> assign(:redirect, nil) + end + + @impl true + def handle_info({CesiumLinkWeb.RedirectLive.FormComponent, {:saved, redirect}}, socket) do + {:noreply, stream_insert(socket, :redirects, redirect)} + end + + @impl true + def handle_event("delete", %{"id" => id}, socket) do + redirect = Redirects.get_redirect!(id) + {:ok, _} = Redirects.delete_redirect(redirect) + + {:noreply, + stream_delete(socket, :redirects, redirect) + |> push_patch(to: ~p"/admin/redirects") + |> put_flash(:info, "Redirect deleted successfully")} + end + + defp get_redirect_url(%Redirect{slug: slug, type: type}) do + CesiumLinkWeb.Endpoint.url() <> + case type do + :default -> "/r/#{slug}" + :form -> "/f/#{slug}" + end + end +end diff --git a/lib/cesium_link_web/live/redirect_live/index.html.heex b/lib/cesium_link_web/live/redirect_live/index.html.heex new file mode 100644 index 0000000..c4eaf77 --- /dev/null +++ b/lib/cesium_link_web/live/redirect_live/index.html.heex @@ -0,0 +1,70 @@ +<.header> + Redirects + <:actions> + <.link patch={~p"/admin/redirects/new"}> + <.button><.icon name="hero-plus" class="w-5 h-5" /> New Redirect + + + + +<.table id="redirects" rows={@streams.redirects}> + <:col :let={{_id, redirect}} label="Name"><%= redirect.name %> + <:col :let={{_id, redirect}} label="Slug"><%= redirect.slug %> + <:col :let={{_id, redirect}} label="URL"> + <.link target="_blank" class="hover:text-brand transition-all hover:underline" navigate={redirect.url}> + <%= truncate_elipsis(redirect.url, 50) %> + + + <:col :let={{_id, redirect}} label="Link"> + <.link target="_blank" class="hover:text-brand transition-all hover:underline" navigate={get_redirect_url(redirect)}> + <%= get_redirect_url(redirect) %> + + + <.icon name="hero-clipboard" class="w-4 h-4 mb-1 ml-1" /> + + + <:col :let={{_id, redirect}} label="Visits"><%= redirect.visits %> + <:col :let={{_id, redirect}} label="Type"> + + <%= redirect.type %> + + + <:col :let={{_id, redirect}} label="Last Edited"> + <%= relative_datetime(redirect.edited_at) %> + + <:action :let={{_id, redirect}}> + <.link patch={~p"/admin/redirects/#{redirect}/edit"}> + <.icon name="hero-pencil" class="w-5 h-5" /> + + + <:action :let={{_id, redirect}}> + <.link patch={~p"/admin/redirects/#{redirect}/delete"}> + <.icon name="hero-trash" class="w-5 h-5" /> + + + + +<.modal :if={@live_action in [:new, :edit]} id="redirect-modal" show on_cancel={JS.patch(~p"/admin/redirects")}> + <.live_component module={CesiumLinkWeb.RedirectLive.FormComponent} id={@redirect.id || :new} title={@page_title} action={@live_action} redirect={@redirect} patch={~p"/admin/redirects"} /> + + +<.modal :if={@live_action == :delete} id="delete-modal" show on_cancel={JS.patch(~p"/admin/redirects")}> +
+ <.header> + <%= gettext("Delete Redirect") %> + <:subtitle> + <%= gettext("Are you sure you want to delete this redirect? This action is irreversible.") %> + + +
+ <.link patch={~p"/admin/redirects"} class="w-full outline-none"> + <.button class="w-full"> + <%= gettext("Cancel") %> + + + <.button phx-click="delete" phx-value-id={@redirect.id} class="w-full"> + <%= gettext("Confirm") %> + +
+
+ diff --git a/lib/cesium_link_web/router.ex b/lib/cesium_link_web/router.ex new file mode 100644 index 0000000..314f81a --- /dev/null +++ b/lib/cesium_link_web/router.ex @@ -0,0 +1,100 @@ +defmodule CesiumLinkWeb.Router do + @moduledoc """ + The application router. + """ + use CesiumLinkWeb, :router + + import CesiumLinkWeb.UserAuth + + pipeline :browser do + plug :accepts, ["html"] + plug :fetch_session + plug :fetch_live_flash + plug :put_root_layout, html: {CesiumLinkWeb.Layouts, :root} + plug :protect_from_forgery + plug :put_secure_browser_headers + plug :fetch_current_user + end + + pipeline :api do + plug :accepts, ["json"] + end + + scope "/", CesiumLinkWeb do + pipe_through :browser + + live "/", HomeLive.Index, :index + + get "/auth/google/callback", GoogleAuthController, :index + + get "/r/:slug", RedirectController, :redirect_regular + get "/f/:slug", RedirectController, :redirect_form + end + + # Other scopes may use custom stacks. + # scope "/api", CesiumLinkWeb do + # pipe_through :api + # end + + # Enable LiveDashboard in development + if Application.compile_env(:cesium_link, :dev_routes) do + # If you want to use the LiveDashboard in production, you should put + # it behind authentication and allow only admins to access it. + # If your application does not have an admins-only section yet, + # you can use Plug.BasicAuth to set up some basic authentication + # as long as you are also using SSL (which you should anyway). + import Phoenix.LiveDashboard.Router + + scope "/dev" do + pipe_through :browser + + live_dashboard "/dashboard", metrics: CesiumLinkWeb.Telemetry + end + end + + ## Authentication routes + + scope "/", CesiumLinkWeb do + pipe_through [:browser, :redirect_if_user_is_authenticated] + + live_session :redirect_if_user_is_authenticated, + on_mount: [{CesiumLinkWeb.UserAuth, :redirect_if_user_is_authenticated}] do + live "/admin", AuthLive.Index, :index + end + + post "/users/log_in", UserSessionController, :create + end + + ## Authenticated routes + + scope "/", CesiumLinkWeb do + pipe_through [:browser, :require_authenticated_user] + + live_session :require_authenticated_user, + on_mount: [{CesiumLinkWeb.UserAuth, :ensure_authenticated}] do + scope "/admin" do + live "/links", LinkLive.Index, :index + live "/links/new", LinkLive.Index, :new + live "/links/archived", ArchivedLive.Index, :index + live "/links/:id/edit", LinkLive.Index, :edit + live "/links/:id/archive", LinkLive.Index, :archive + live "/links/archived/:id/edit", ArchivedLive.Index, :edit + live "/links/archived/:id/unarchive", ArchivedLive.Index, :unarchive + live "/links/archived/:id/delete", ArchivedLive.Index, :delete + + live "/redirects", RedirectLive.Index, :index + live "/redirects/new", RedirectLive.Index, :new + live "/redirects/:id/edit", RedirectLive.Index, :edit + live "/redirects/:id/delete", RedirectLive.Index, :delete + + live "/qrcode", QRCodeLive.Index, :index + end + end + end + + scope "/", CesiumLinkWeb do + pipe_through [:browser] + + delete "/users/log_out", UserSessionController, :delete + end +end diff --git a/lib/cesium_link_web/telemetry.ex b/lib/cesium_link_web/telemetry.ex new file mode 100644 index 0000000..e5c1cb0 --- /dev/null +++ b/lib/cesium_link_web/telemetry.ex @@ -0,0 +1,95 @@ +defmodule CesiumLinkWeb.Telemetry do + @moduledoc """ + Telemetry events and metrics for the application. + """ + use Supervisor + import Telemetry.Metrics + + def start_link(arg) do + Supervisor.start_link(__MODULE__, arg, name: __MODULE__) + end + + @impl true + def init(_arg) do + children = [ + # Telemetry poller will execute the given period measurements + # every 10_000ms. Learn more here: https://hexdocs.pm/telemetry_metrics + {:telemetry_poller, measurements: periodic_measurements(), period: 10_000} + # Add reporters as children of your supervision tree. + # {Telemetry.Metrics.ConsoleReporter, metrics: metrics()} + ] + + Supervisor.init(children, strategy: :one_for_one) + end + + def metrics do + [ + # Phoenix Metrics + summary("phoenix.endpoint.start.system_time", + unit: {:native, :millisecond} + ), + summary("phoenix.endpoint.stop.duration", + unit: {:native, :millisecond} + ), + summary("phoenix.router_dispatch.start.system_time", + tags: [:route], + unit: {:native, :millisecond} + ), + summary("phoenix.router_dispatch.exception.duration", + tags: [:route], + unit: {:native, :millisecond} + ), + summary("phoenix.router_dispatch.stop.duration", + tags: [:route], + unit: {:native, :millisecond} + ), + summary("phoenix.socket_connected.duration", + unit: {:native, :millisecond} + ), + summary("phoenix.channel_joined.duration", + unit: {:native, :millisecond} + ), + summary("phoenix.channel_handled_in.duration", + tags: [:event], + unit: {:native, :millisecond} + ), + + # Database Metrics + summary("cesium_link.repo.query.total_time", + unit: {:native, :millisecond}, + description: "The sum of the other measurements" + ), + summary("cesium_link.repo.query.decode_time", + unit: {:native, :millisecond}, + description: "The time spent decoding the data received from the database" + ), + summary("cesium_link.repo.query.query_time", + unit: {:native, :millisecond}, + description: "The time spent executing the query" + ), + summary("cesium_link.repo.query.queue_time", + unit: {:native, :millisecond}, + description: "The time spent waiting for a database connection" + ), + summary("cesium_link.repo.query.idle_time", + unit: {:native, :millisecond}, + description: + "The time the connection spent waiting before being checked out for the query" + ), + + # VM Metrics + summary("vm.memory.total", unit: {:byte, :kilobyte}), + summary("vm.total_run_queue_lengths.total"), + summary("vm.total_run_queue_lengths.cpu"), + summary("vm.total_run_queue_lengths.io") + ] + end + + defp periodic_measurements do + [ + # A module, function and arguments to be invoked periodically. + # This function must call :telemetry.execute/3 and a metric must be added above. + # {CesiumLinkWeb, :count_users, []} + ] + end +end diff --git a/lib/cesium_link_web/user_auth.ex b/lib/cesium_link_web/user_auth.ex new file mode 100644 index 0000000..5676325 --- /dev/null +++ b/lib/cesium_link_web/user_auth.ex @@ -0,0 +1,229 @@ +defmodule CesiumLinkWeb.UserAuth do + @moduledoc """ + User authentication handling. + """ + use CesiumLinkWeb, :verified_routes + + import Plug.Conn + import Phoenix.Controller + + alias CesiumLink.Accounts + + # Make the remember me cookie valid for 60 days. + # If you want bump or reduce this value, also change + # the token expiry itself in UserToken. + @max_age 60 * 60 * 24 * 60 + @remember_me_cookie "_cesium_link_web_user_remember_me" + @remember_me_options [sign: true, max_age: @max_age, same_site: "Lax"] + + @doc """ + Logs the user in. + + It renews the session ID and clears the whole session + to avoid fixation attacks. See the renew_session + function to customize this behaviour. + + It also sets a `:live_socket_id` key in the session, + so LiveView sessions are identified and automatically + disconnected on log out. The line can be safely removed + if you are not using LiveView. + """ + def log_in_user(conn, user, params \\ %{}) do + token = Accounts.generate_user_session_token(user) + user_return_to = get_session(conn, :user_return_to) + + conn + |> renew_session() + |> put_token_in_session(token) + |> maybe_write_remember_me_cookie(token, params) + |> redirect(to: user_return_to || signed_in_path(conn)) + end + + defp maybe_write_remember_me_cookie(conn, token, %{"remember_me" => "true"}) do + put_resp_cookie(conn, @remember_me_cookie, token, @remember_me_options) + end + + defp maybe_write_remember_me_cookie(conn, _token, _params) do + conn + end + + # This function renews the session ID and erases the whole + # session to avoid fixation attacks. If there is any data + # in the session you may want to preserve after log in/log out, + # you must explicitly fetch the session data before clearing + # and then immediately set it after clearing, for example: + # + # defp renew_session(conn) do + # preferred_locale = get_session(conn, :preferred_locale) + # + # conn + # |> configure_session(renew: true) + # |> clear_session() + # |> put_session(:preferred_locale, preferred_locale) + # end + # + defp renew_session(conn) do + delete_csrf_token() + + conn + |> configure_session(renew: true) + |> clear_session() + end + + @doc """ + Logs the user out. + + It clears all session data for safety. See renew_session. + """ + def log_out_user(conn) do + user_token = get_session(conn, :user_token) + user_token && Accounts.delete_user_session_token(user_token) + + if live_socket_id = get_session(conn, :live_socket_id) do + CesiumLinkWeb.Endpoint.broadcast(live_socket_id, "disconnect", %{}) + end + + conn + |> renew_session() + |> delete_resp_cookie(@remember_me_cookie) + |> redirect(to: ~p"/") + end + + @doc """ + Authenticates the user by looking into the session + and remember me token. + """ + def fetch_current_user(conn, _opts) do + {user_token, conn} = ensure_user_token(conn) + user = user_token && Accounts.get_user_by_session_token(user_token) + assign(conn, :current_user, user) + end + + defp ensure_user_token(conn) do + if token = get_session(conn, :user_token) do + {token, conn} + else + conn = fetch_cookies(conn, signed: [@remember_me_cookie]) + + if token = conn.cookies[@remember_me_cookie] do + {token, put_token_in_session(conn, token)} + else + {nil, conn} + end + end + end + + @doc """ + Handles mounting and authenticating the current_user in LiveViews. + + ## `on_mount` arguments + + * `:mount_current_user` - Assigns current_user + to socket assigns based on user_token, or nil if + there's no user_token or no matching user. + + * `:ensure_authenticated` - Authenticates the user from the session, + and assigns the current_user to socket assigns based + on user_token. + Redirects to login page if there's no logged user. + + * `:redirect_if_user_is_authenticated` - Authenticates the user from the session. + Redirects to signed_in_path if there's a logged user. + + ## Examples + + Use the `on_mount` lifecycle macro in LiveViews to mount or authenticate + the current_user: + + defmodule CesiumLinkWeb.PageLive do + use CesiumLinkWeb, :live_view + + on_mount {CesiumLinkWeb.UserAuth, :mount_current_user} + ... + end + + Or use the `live_session` of your router to invoke the on_mount callback: + + live_session :authenticated, on_mount: [{CesiumLinkWeb.UserAuth, :ensure_authenticated}] do + live "/profile", ProfileLive, :index + end + """ + def on_mount(:mount_current_user, _params, session, socket) do + {:cont, mount_current_user(socket, session)} + end + + def on_mount(:ensure_authenticated, _params, session, socket) do + socket = mount_current_user(socket, session) + + if socket.assigns.current_user do + {:cont, socket} + else + socket = + socket + |> Phoenix.LiveView.put_flash(:error, "You must log in to access this page.") + |> Phoenix.LiveView.redirect(to: ~p"/admin") + + {:halt, socket} + end + end + + def on_mount(:redirect_if_user_is_authenticated, _params, session, socket) do + socket = mount_current_user(socket, session) + + if socket.assigns.current_user do + {:halt, Phoenix.LiveView.redirect(socket, to: signed_in_path(socket))} + else + {:cont, socket} + end + end + + defp mount_current_user(socket, session) do + Phoenix.Component.assign_new(socket, :current_user, fn -> + if user_token = session["user_token"] do + Accounts.get_user_by_session_token(user_token) + end + end) + end + + @doc """ + Used for routes that require the user to not be authenticated. + """ + def redirect_if_user_is_authenticated(conn, _opts) do + if conn.assigns[:current_user] do + conn + |> redirect(to: signed_in_path(conn)) + |> halt() + else + conn + end + end + + @doc """ + Used for routes that require the user to be authenticated. + """ + def require_authenticated_user(conn, _opts) do + if conn.assigns[:current_user] do + conn + else + conn + |> put_flash(:error, "You must log in to access this page.") + |> maybe_store_return_to() + |> redirect(to: ~p"/admin") + |> halt() + end + end + + defp put_token_in_session(conn, token) do + conn + |> put_session(:user_token, token) + |> put_session(:live_socket_id, "users_sessions:#{Base.url_encode64(token)}") + end + + defp maybe_store_return_to(%{method: "GET"} = conn) do + put_session(conn, :user_return_to, current_path(conn)) + end + + defp maybe_store_return_to(conn), do: conn + + defp signed_in_path(_conn), do: ~p"/admin/links" +end diff --git a/lib/config.ts b/lib/config.ts deleted file mode 100644 index 1b46a70..0000000 --- a/lib/config.ts +++ /dev/null @@ -1,27 +0,0 @@ -export type Configuration = { - app: string; - description: string; - version: string; - url: string; - license: string; -}; - -export const getVersion = () => ({ - tag: process.env.APP_VERSION, - env: process.env.NODE_ENV, - ref: process.env.COMMIT_HASH -}); - -export const getUrl = () => process.env.NEXT_PUBLIC_APP_URL || process.env.NEXT_PUBLIC_VERCEL_URL; - -export const getAppConfig = () => { - const { tag, env, ref } = getVersion(); - - return { - app: process.env.APP_NAME, - description: process.env.APP_DESCRIPTION, - version: `v${tag}-${env}.${ref.substring(0, 8)}`, - url: getUrl(), - license: process.env.APP_LICENSE - }; -}; diff --git a/lib/database.ts b/lib/database.ts deleted file mode 100644 index f67d412..0000000 --- a/lib/database.ts +++ /dev/null @@ -1,38 +0,0 @@ -import mongoose from 'mongoose'; - -const MONGODB_URI = process.env.MONGODB_URI; - -if (!MONGODB_URI) { - throw new Error('Please define the MONGODB_URI environment variable inside .env.local'); -} - -/** - * Global is used here to maintain a cached connection across hot reloads - * in development. This prevents connections growing exponentially - * during API Route usage. - */ -let cached = global.mongoose; - -if (!cached) { - cached = global.mongoose = { conn: null, promise: null }; -} - -export default async function dbConnect() { - if (cached.conn) { - return cached.conn; - } - - if (!cached.promise) { - const opts = { - bufferCommands: false - }; - - cached.promise = mongoose.connect(MONGODB_URI, opts).then((mongoose) => { - return mongoose; - }); - } - - cached.conn = await cached.promise; - - return cached.conn; -} diff --git a/lib/mix/tasks/convert.ex b/lib/mix/tasks/convert.ex new file mode 100644 index 0000000..929a59e --- /dev/null +++ b/lib/mix/tasks/convert.ex @@ -0,0 +1,121 @@ +defmodule Mix.Tasks.Convert do + @moduledoc """ + Task to read data exported (in CSV files, one for each table) from the old cesium.link project and import it to database following the new schemas. + Takes in 3 files as arguments in the following order: links, redirects, forms. + """ + use Mix.Task + + alias CesiumLink.Links.Link + alias CesiumLink.Redirects.Redirect + alias CesiumLink.Repo + + def run(files) do + case length(files) do + 3 -> + Mix.Task.run("app.start") + + convert_links(Enum.at(files, 0)) + convert_redirects(Enum.at(files, 1)) + convert_forms(Enum.at(files, 2)) + + _ -> + Mix.shell().error("Invalid number of arguments") + end + end + + defp convert_links(file) do + file + |> parse_csv() + |> Enum.each(fn [ + _id, + _version, + archived, + attention, + visits, + created_at, + emoji, + index, + _slug, + title, + updated_at, + url + ] -> + %Link{ + archived: to_bool(archived), + attention: to_bool(attention), + visits: String.to_integer(visits), + inserted_at: to_datetime(created_at), + emoji: to_emoji(emoji), + index: String.to_integer(index), + name: title, + edited_at: to_datetime(updated_at), + url: url + } + |> Repo.insert() + end) + end + + defp convert_redirects(file) do + file + |> parse_csv() + |> Enum.each(fn [_id, _version, created_at, name, slug, updated_at, url, visits] -> + %Redirect{ + inserted_at: to_datetime(created_at), + name: name, + slug: slug, + edited_at: to_datetime(updated_at), + url: url, + visits: String.to_integer(visits), + type: :default + } + |> Repo.insert() + end) + end + + defp convert_forms(file) do + file + |> parse_csv() + |> Enum.each(fn [_id, _version, created_at, name, slug, updated_at, url, visits] -> + %Redirect{ + inserted_at: to_datetime(created_at), + name: name, + slug: slug, + edited_at: to_datetime(updated_at), + url: url, + visits: String.to_integer(visits), + type: :form + } + |> Repo.insert() + end) + end + + defp parse_csv(path) do + case path |> File.read() do + {:ok, content} -> + content + |> String.replace(~r/\r\n/, "\n") + |> String.split("\n") + |> Enum.map(&String.split(&1, ",")) + |> Enum.drop(-1) + + {:error, reason} -> + raise reason + end + end + + defp to_bool("true"), do: true + defp to_bool("false"), do: false + + defp to_datetime(date) do + case Timex.parse(date, "{ISO:Extended}") do + {:ok, date} -> date |> DateTime.truncate(:second) + {:error, _} -> Timex.now() |> DateTime.truncate(:second) + end + end + + defp to_emoji(emoji) do + emoji + |> String.replace(":", "") + |> String.trim(" ") + end +end diff --git a/lib/services.ts b/lib/services.ts deleted file mode 100644 index a93a1f9..0000000 --- a/lib/services.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { ApiService } from '~/services/ApiService'; - -export let APP_URL = process.env.NEXT_PUBLIC_APP_URL || process.env.NEXT_PUBLIC_VERCEL_URL; - -if (!/^https?:\/\//i.test(APP_URL)) { - APP_URL = 'http://' + APP_URL; -} - -export const API = new ApiService(APP_URL); diff --git a/lib/utils/date.ts b/lib/utils/date.ts deleted file mode 100644 index 6fc39e6..0000000 --- a/lib/utils/date.ts +++ /dev/null @@ -1,6 +0,0 @@ -import dayjs from 'dayjs'; -import relativeTime from 'dayjs/plugin/relativeTime'; - -dayjs.extend(relativeTime); - -export const formatFromNow = (date: dayjs.ConfigType) => dayjs(date).fromNow(); diff --git a/lib/utils/index.ts b/lib/utils/index.ts deleted file mode 100644 index 8e126f5..0000000 --- a/lib/utils/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './object'; -export * from './date'; diff --git a/lib/utils/object.ts b/lib/utils/object.ts deleted file mode 100644 index 0b4b6e2..0000000 --- a/lib/utils/object.ts +++ /dev/null @@ -1,3 +0,0 @@ -export function pick(obj: Record, keys: string[]) { - return Object.assign({}, ...keys.map((key) => ({ [key]: obj[key] }))); -} diff --git a/linux.yml b/linux.yml new file mode 100644 index 0000000..59c81bc --- /dev/null +++ b/linux.yml @@ -0,0 +1,7 @@ +version: "3" + +services: + db: + network_mode: "host" + web: + network_mode: "host" \ No newline at end of file diff --git a/mix.exs b/mix.exs new file mode 100644 index 0000000..ddca022 --- /dev/null +++ b/mix.exs @@ -0,0 +1,106 @@ +defmodule CesiumLink.MixProject do + use Mix.Project + + def project do + [ + app: :cesium_link, + version: "0.1.0", + elixir: "~> 1.14", + elixirc_paths: elixirc_paths(Mix.env()), + start_permanent: Mix.env() == :prod, + aliases: aliases(), + deps: deps() + ] + end + + # Configuration for the OTP application. + # + # Type `mix help compile.app` for more information. + def application do + [ + mod: {CesiumLink.Application, []}, + extra_applications: [:logger, :runtime_tools] + ] + end + + # Specifies which paths to compile per environment. + defp elixirc_paths(:test), do: ["lib", "test/support"] + defp elixirc_paths(_), do: ["lib"] + + # Specifies your project dependencies. + # + # Type `mix help deps` for examples and options. + defp deps do + [ + # core + {:phoenix, "~> 1.7.12"}, + {:phoenix_live_view, "~> 0.20.2"}, + {:phoenix_live_reload, "~> 1.2", only: :dev}, + + # database + {:ecto_sql, "~> 3.10"}, + {:phoenix_ecto, "~> 4.4"}, + {:postgrex, ">= 0.0.0"}, + + # auth + {:elixir_auth_google, "~> 1.6.9"}, + + # frontend + {:tailwind, "~> 0.2", runtime: Mix.env() == :dev}, + {:heroicons, + github: "tailwindlabs/heroicons", + tag: "v2.1.1", + sparse: "optimized", + app: false, + compile: false, + depth: 1}, + {:esbuild, "~> 0.8", runtime: Mix.env() == :dev}, + + # monitoring + {:telemetry_metrics, "~> 1.0"}, + {:telemetry_poller, "~> 1.0"}, + {:phoenix_live_dashboard, "~> 0.8.3"}, + + # utilities + {:gettext, "~> 0.20"}, + {:jason, "~> 1.2"}, + + # server + {:bandit, "~> 1.2"}, + {:dns_cluster, "~> 0.1.1"}, + + # testing + {:floki, ">= 0.30.0", only: :test}, + + # tools + {:timex, "~> 3.0"}, + {:credo, "~> 1.6", only: [:dev, :test], runtime: false}, + {:tailwind_formatter, "~> 0.3.7", only: [:dev, :test], runtime: false}, + {:doctest_formatter, "~> 0.2.0", runtime: false} + ] + end + + # Aliases are shortcuts or tasks specific to the current project. + # For example, to install project dependencies and perform other setup tasks, run: + # + # $ mix setup + # + # See the documentation for `Mix` for more info on aliases. + defp aliases do + [ + setup: ["deps.get", "ecto.setup", "assets.setup", "assets.build"], + "ecto.setup": ["ecto.create", "ecto.migrate", "run priv/repo/seeds.exs"], + "ecto.seed": ["run priv/repo/seeds.exs"], + "ecto.reset": ["ecto.drop", "ecto.setup"], + test: ["ecto.create --quiet", "ecto.migrate --quiet", "test"], + "assets.setup": ["tailwind.install --if-missing", "esbuild.install --if-missing"], + "assets.build": ["tailwind cesium_link", "esbuild cesium_link"], + "assets.deploy": [ + "tailwind cesium_link --minify", + "esbuild cesium_link --minify", + "phx.digest" + ], + lint: ["credo -C default"] + ] + end +end diff --git a/mix.lock b/mix.lock new file mode 100644 index 0000000..98e8447 --- /dev/null +++ b/mix.lock @@ -0,0 +1,53 @@ +%{ + "bandit": {:hex, :bandit, "1.5.7", "6856b1e1df4f2b0cb3df1377eab7891bec2da6a7fd69dc78594ad3e152363a50", [:mix], [{:hpax, "~> 1.0.0", [hex: :hpax, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:thousand_island, "~> 1.0", [hex: :thousand_island, repo: "hexpm", optional: false]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "f2dd92ae87d2cbea2fa9aa1652db157b6cba6c405cb44d4f6dd87abba41371cd"}, + "bunt": {:hex, :bunt, "1.0.0", "081c2c665f086849e6d57900292b3a161727ab40431219529f13c4ddcf3e7a44", [:mix], [], "hexpm", "dc5f86aa08a5f6fa6b8096f0735c4e76d54ae5c9fa2c143e5a1fc7c1cd9bb6b5"}, + "castore": {:hex, :castore, "1.0.8", "dedcf20ea746694647f883590b82d9e96014057aff1d44d03ec90f36a5c0dc6e", [:mix], [], "hexpm", "0b2b66d2ee742cb1d9cb8c8be3b43c3a70ee8651f37b75a8b982e036752983f1"}, + "certifi": {:hex, :certifi, "2.12.0", "2d1cca2ec95f59643862af91f001478c9863c2ac9cb6e2f89780bfd8de987329", [:rebar3], [], "hexpm", "ee68d85df22e554040cdb4be100f33873ac6051387baf6a8f6ce82272340ff1c"}, + "combine": {:hex, :combine, "0.10.0", "eff8224eeb56498a2af13011d142c5e7997a80c8f5b97c499f84c841032e429f", [:mix], [], "hexpm", "1b1dbc1790073076580d0d1d64e42eae2366583e7aecd455d1215b0d16f2451b"}, + "credo": {:hex, :credo, "1.7.7", "771445037228f763f9b2afd612b6aa2fd8e28432a95dbbc60d8e03ce71ba4446", [:mix], [{:bunt, "~> 0.2.1 or ~> 1.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "8bc87496c9aaacdc3f90f01b7b0582467b69b4bd2441fe8aae3109d843cc2f2e"}, + "db_connection": {:hex, :db_connection, "2.7.0", "b99faa9291bb09892c7da373bb82cba59aefa9b36300f6145c5f201c7adf48ec", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "dcf08f31b2701f857dfc787fbad78223d61a32204f217f15e881dd93e4bdd3ff"}, + "decimal": {:hex, :decimal, "2.1.1", "5611dca5d4b2c3dd497dec8f68751f1f1a54755e8ed2a966c2633cf885973ad6", [:mix], [], "hexpm", "53cfe5f497ed0e7771ae1a475575603d77425099ba5faef9394932b35020ffcc"}, + "dns_cluster": {:hex, :dns_cluster, "0.1.3", "0bc20a2c88ed6cc494f2964075c359f8c2d00e1bf25518a6a6c7fd277c9b0c66", [:mix], [], "hexpm", "46cb7c4a1b3e52c7ad4cbe33ca5079fbde4840dedeafca2baf77996c2da1bc33"}, + "doctest_formatter": {:hex, :doctest_formatter, "0.2.1", "61d5674463ae0bf3249f58ae965c33f24e304662b03e7ebc1d46ceab584b545c", [:mix], [], "hexpm", "b2dad6d81b36800a4fd22888adcfdd97c955d9acf20d57cedc92c638125925a6"}, + "ecto": {:hex, :ecto, "3.12.0", "9014a3ccac7f91e680b9d237d461ebe3d4e16d62ca8e355d540e2c6afdc28309", [:mix], [{:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "41e781a76e131093af8e1edf68b1319bf320878faff58da41ffa4b10fc6ff678"}, + "ecto_sql": {:hex, :ecto_sql, "3.12.0", "73cea17edfa54bde76ee8561b30d29ea08f630959685006d9c6e7d1e59113b7d", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.12", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.7", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.19 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "dc9e4d206f274f3947e96142a8fdc5f69a2a6a9abb4649ef5c882323b6d512f0"}, + "elixir_auth_google": {:hex, :elixir_auth_google, "1.6.9", "e954d292471bc77eb78d193476eeb819844b32bc6ac51070753e70e7c18fbbe3", [:mix], [{:httpoison, "~> 2.1.0", [hex: :httpoison, repo: "hexpm", optional: false]}, {:jason, "~> 1.2", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "ec418ed10a2b5c6ab3997df3efa00f8b6f7460cd412c3d7f28cb428b78145021"}, + "esbuild": {:hex, :esbuild, "0.8.1", "0cbf919f0eccb136d2eeef0df49c4acf55336de864e63594adcea3814f3edf41", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "25fc876a67c13cb0a776e7b5d7974851556baeda2085296c14ab48555ea7560f"}, + "expo": {:hex, :expo, "1.0.0", "647639267e088717232f4d4451526e7a9de31a3402af7fcbda09b27e9a10395a", [:mix], [], "hexpm", "18d2093d344d97678e8a331ca0391e85d29816f9664a25653fd7e6166827827c"}, + "file_system": {:hex, :file_system, "1.0.0", "b689cc7dcee665f774de94b5a832e578bd7963c8e637ef940cd44327db7de2cd", [:mix], [], "hexpm", "6752092d66aec5a10e662aefeed8ddb9531d79db0bc145bb8c40325ca1d8536d"}, + "floki": {:hex, :floki, "0.36.2", "a7da0193538c93f937714a6704369711998a51a6164a222d710ebd54020aa7a3", [:mix], [], "hexpm", "a8766c0bc92f074e5cb36c4f9961982eda84c5d2b8e979ca67f5c268ec8ed580"}, + "gettext": {:hex, :gettext, "0.25.0", "98a95a862a94e2d55d24520dd79256a15c87ea75b49673a2e2f206e6ebc42e5d", [:mix], [{:expo, "~> 0.5.1 or ~> 1.0", [hex: :expo, repo: "hexpm", optional: false]}], "hexpm", "38e5d754e66af37980a94fb93bb20dcde1d2361f664b0a19f01e87296634051f"}, + "hackney": {:hex, :hackney, "1.20.1", "8d97aec62ddddd757d128bfd1df6c5861093419f8f7a4223823537bad5d064e2", [:rebar3], [{:certifi, "~> 2.12.0", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "~> 6.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "~> 1.0.0", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~> 1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.4.1", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "~> 1.1.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}, {:unicode_util_compat, "~> 0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "fe9094e5f1a2a2c0a7d10918fee36bfec0ec2a979994cff8cfe8058cd9af38e3"}, + "heroicons": {:git, "https://github.com/tailwindlabs/heroicons.git", "88ab3a0d790e6a47404cba02800a6b25d2afae50", [tag: "v2.1.1", sparse: "optimized"]}, + "hpax": {:hex, :hpax, "1.0.0", "28dcf54509fe2152a3d040e4e3df5b265dcb6cb532029ecbacf4ce52caea3fd2", [:mix], [], "hexpm", "7f1314731d711e2ca5fdc7fd361296593fc2542570b3105595bb0bc6d0fad601"}, + "httpoison": {:hex, :httpoison, "2.1.0", "655fd9a7b0b95ee3e9a3b535cf7ac8e08ef5229bab187fa86ac4208b122d934b", [:mix], [{:hackney, "~> 1.17", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "fc455cb4306b43827def4f57299b2d5ac8ac331cb23f517e734a4b78210a160c"}, + "idna": {:hex, :idna, "6.1.1", "8a63070e9f7d0c62eb9d9fcb360a7de382448200fbbd1b106cc96d3d8099df8d", [:rebar3], [{:unicode_util_compat, "~> 0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea"}, + "jason": {:hex, :jason, "1.4.4", "b9226785a9aa77b6857ca22832cffa5d5011a667207eb2a0ad56adb5db443b8a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "c5eb0cab91f094599f94d55bc63409236a8ec69a21a67814529e8d5f6cc90b3b"}, + "metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm", "69b09adddc4f74a40716ae54d140f93beb0fb8978d8636eaded0c31b6f099f16"}, + "mime": {:hex, :mime, "2.0.6", "8f18486773d9b15f95f4f4f1e39b710045fa1de891fada4516559967276e4dc2", [:mix], [], "hexpm", "c9945363a6b26d747389aac3643f8e0e09d30499a138ad64fe8fd1d13d9b153e"}, + "mimerl": {:hex, :mimerl, "1.3.0", "d0cd9fc04b9061f82490f6581e0128379830e78535e017f7780f37fea7545726", [:rebar3], [], "hexpm", "a1e15a50d1887217de95f0b9b0793e32853f7c258a5cd227650889b38839fe9d"}, + "parse_trans": {:hex, :parse_trans, "3.4.1", "6e6aa8167cb44cc8f39441d05193be6e6f4e7c2946cb2759f015f8c56b76e5ff", [:rebar3], [], "hexpm", "620a406ce75dada827b82e453c19cf06776be266f5a67cff34e1ef2cbb60e49a"}, + "phoenix": {:hex, :phoenix, "1.7.14", "a7d0b3f1bc95987044ddada111e77bd7f75646a08518942c72a8440278ae7825", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.1", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.7", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:websock_adapter, "~> 0.5.3", [hex: :websock_adapter, repo: "hexpm", optional: false]}], "hexpm", "c7859bc56cc5dfef19ecfc240775dae358cbaa530231118a9e014df392ace61a"}, + "phoenix_ecto": {:hex, :phoenix_ecto, "4.6.2", "3b83b24ab5a2eb071a20372f740d7118767c272db386831b2e77638c4dcc606d", [:mix], [{:ecto, "~> 3.5", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.1", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.16 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}], "hexpm", "3f94d025f59de86be00f5f8c5dd7b5965a3298458d21ab1c328488be3b5fcd59"}, + "phoenix_html": {:hex, :phoenix_html, "4.1.1", "4c064fd3873d12ebb1388425a8f2a19348cef56e7289e1998e2d2fa758aa982e", [:mix], [], "hexpm", "f2f2df5a72bc9a2f510b21497fd7d2b86d932ec0598f0210fed4114adc546c6f"}, + "phoenix_live_dashboard": {:hex, :phoenix_live_dashboard, "0.8.4", "4508e481f791ce62ec6a096e13b061387158cbeefacca68c6c1928e1305e23ed", [:mix], [{:ecto, "~> 3.6.2 or ~> 3.7", [hex: :ecto, repo: "hexpm", optional: true]}, {:ecto_mysql_extras, "~> 0.5", [hex: :ecto_mysql_extras, repo: "hexpm", optional: true]}, {:ecto_psql_extras, "~> 0.7", [hex: :ecto_psql_extras, repo: "hexpm", optional: true]}, {:ecto_sqlite3_extras, "~> 1.1.7 or ~> 1.2.0", [hex: :ecto_sqlite3_extras, repo: "hexpm", optional: true]}, {:mime, "~> 1.6 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:phoenix_live_view, "~> 0.19 or ~> 1.0", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 0.6 or ~> 1.0", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}], "hexpm", "2984aae96994fbc5c61795a73b8fb58153b41ff934019cfb522343d2d3817d59"}, + "phoenix_live_reload": {:hex, :phoenix_live_reload, "1.5.3", "f2161c207fda0e4fb55165f650f7f8db23f02b29e3bff00ff7ef161d6ac1f09d", [:mix], [{:file_system, "~> 0.3 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.4", [hex: :phoenix, repo: "hexpm", optional: false]}], "hexpm", "b4ec9cd73cb01ff1bd1cac92e045d13e7030330b74164297d1aee3907b54803c"}, + "phoenix_live_view": {:hex, :phoenix_live_view, "0.20.17", "f396bbdaf4ba227b82251eb75ac0afa6b3da5e509bc0d030206374237dfc9450", [:mix], [{:floki, "~> 0.36", [hex: :floki, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6.15 or ~> 1.7.0", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 3.3 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.15", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a61d741ffb78c85fdbca0de084da6a48f8ceb5261a79165b5a0b59e5f65ce98b"}, + "phoenix_pubsub": {:hex, :phoenix_pubsub, "2.1.3", "3168d78ba41835aecad272d5e8cd51aa87a7ac9eb836eabc42f6e57538e3731d", [:mix], [], "hexpm", "bba06bc1dcfd8cb086759f0edc94a8ba2bc8896d5331a1e2c2902bf8e36ee502"}, + "phoenix_template": {:hex, :phoenix_template, "1.0.4", "e2092c132f3b5e5b2d49c96695342eb36d0ed514c5b252a77048d5969330d639", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}], "hexpm", "2c0c81f0e5c6753faf5cca2f229c9709919aba34fab866d3bc05060c9c444206"}, + "plug": {:hex, :plug, "1.16.1", "40c74619c12f82736d2214557dedec2e9762029b2438d6d175c5074c933edc9d", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a13ff6b9006b03d7e33874945b2755253841b238c34071ed85b0e86057f8cddc"}, + "plug_crypto": {:hex, :plug_crypto, "2.1.0", "f44309c2b06d249c27c8d3f65cfe08158ade08418cf540fd4f72d4d6863abb7b", [:mix], [], "hexpm", "131216a4b030b8f8ce0f26038bc4421ae60e4bb95c5cf5395e1421437824c4fa"}, + "postgrex": {:hex, :postgrex, "0.19.0", "f7d50e50cb42e0a185f5b9a6095125a9ab7e4abccfbe2ab820ab9aa92b71dbab", [:mix], [{:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "dba2d2a0a8637defbf2307e8629cb2526388ba7348f67d04ec77a5d6a72ecfae"}, + "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.7", "354c321cf377240c7b8716899e182ce4890c5938111a1296add3ec74cf1715df", [:make, :mix, :rebar3], [], "hexpm", "fe4c190e8f37401d30167c8c405eda19469f34577987c76dde613e838bbc67f8"}, + "tailwind": {:hex, :tailwind, "0.2.3", "277f08145d407de49650d0a4685dc062174bdd1ae7731c5f1da86163a24dfcdb", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}], "hexpm", "8e45e7a34a676a7747d04f7913a96c770c85e6be810a1d7f91e713d3a3655b5d"}, + "tailwind_formatter": {:hex, :tailwind_formatter, "0.3.7", "2728d031e6803dfddf63f1dd7c64b5b9fd70ffdf635709c50f47589f4fb48861", [:mix], [{:phoenix_live_view, ">= 0.17.6", [hex: :phoenix_live_view, repo: "hexpm", optional: true]}], "hexpm", "3d91ac4d4622505b09c0f4678512281515b4fbe7644f012da1bd2722f5880185"}, + "telemetry": {:hex, :telemetry, "1.2.1", "68fdfe8d8f05a8428483a97d7aab2f268aaff24b49e0f599faa091f1d4e7f61c", [:rebar3], [], "hexpm", "dad9ce9d8effc621708f99eac538ef1cbe05d6a874dd741de2e689c47feafed5"}, + "telemetry_metrics": {:hex, :telemetry_metrics, "1.0.0", "29f5f84991ca98b8eb02fc208b2e6de7c95f8bb2294ef244a176675adc7775df", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "f23713b3847286a534e005126d4c959ebcca68ae9582118ce436b521d1d47d5d"}, + "telemetry_poller": {:hex, :telemetry_poller, "1.1.0", "58fa7c216257291caaf8d05678c8d01bd45f4bdbc1286838a28c4bb62ef32999", [:rebar3], [{:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "9eb9d9cbfd81cbd7cdd24682f8711b6e2b691289a0de6826e58452f28c103c8f"}, + "thousand_island": {:hex, :thousand_island, "1.3.5", "6022b6338f1635b3d32406ff98d68b843ba73b3aa95cfc27154223244f3a6ca5", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "2be6954916fdfe4756af3239fb6b6d75d0b8063b5df03ba76fd8a4c87849e180"}, + "timex": {:hex, :timex, "3.7.11", "bb95cb4eb1d06e27346325de506bcc6c30f9c6dea40d1ebe390b262fad1862d1", [:mix], [{:combine, "~> 0.10", [hex: :combine, repo: "hexpm", optional: false]}, {:gettext, "~> 0.20", [hex: :gettext, repo: "hexpm", optional: false]}, {:tzdata, "~> 1.1", [hex: :tzdata, repo: "hexpm", optional: false]}], "hexpm", "8b9024f7efbabaf9bd7aa04f65cf8dcd7c9818ca5737677c7b76acbc6a94d1aa"}, + "tzdata": {:hex, :tzdata, "1.1.1", "20c8043476dfda8504952d00adac41c6eda23912278add38edc140ae0c5bcc46", [:mix], [{:hackney, "~> 1.17", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "a69cec8352eafcd2e198dea28a34113b60fdc6cb57eb5ad65c10292a6ba89787"}, + "unicode_util_compat": {:hex, :unicode_util_compat, "0.7.0", "bc84380c9ab48177092f43ac89e4dfa2c6d62b40b8bd132b1059ecc7232f9a78", [:rebar3], [], "hexpm", "25eee6d67df61960cf6a794239566599b09e17e668d3700247bc498638152521"}, + "websock": {:hex, :websock, "0.5.3", "2f69a6ebe810328555b6fe5c831a851f485e303a7c8ce6c5f675abeb20ebdadc", [:mix], [], "hexpm", "6105453d7fac22c712ad66fab1d45abdf049868f253cf719b625151460b8b453"}, + "websock_adapter": {:hex, :websock_adapter, "0.5.7", "65fa74042530064ef0570b75b43f5c49bb8b235d6515671b3d250022cb8a1f9e", [:mix], [{:bandit, ">= 0.6.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.6", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "d0f478ee64deddfec64b800673fd6e0c8888b079d9f3444dd96d2a98383bdbd1"}, +} diff --git a/models/Form.ts b/models/Form.ts deleted file mode 100644 index 314f000..0000000 --- a/models/Form.ts +++ /dev/null @@ -1,35 +0,0 @@ -import mongoose, { Model, Schema } from 'mongoose'; - -import { APP_URL } from '~/lib/api'; - -export interface IForm { - id: string; - name: string; - slug: string; - url: string; - link: string; - visits: number; - created: Date; - updated: Date; -} - -const Form = new Schema( - { - name: { type: String, required: true }, - slug: { type: String, unique: true, index: true, required: true }, - url: { type: String, required: true }, - visits: { type: Number, default: 0 }, - created: { type: Date, default: Date.now }, - updated: { type: Date, default: Date.now } - }, - { - toJSON: { virtuals: true }, - toObject: { virtuals: true } - } -); - -Form.virtual('link').get(function () { - return `${APP_URL}/f/${this.slug}`; -}); - -export default (mongoose.models.Form as Model) || mongoose.model('Form', Form); diff --git a/models/Link.ts b/models/Link.ts deleted file mode 100644 index ebc65b7..0000000 --- a/models/Link.ts +++ /dev/null @@ -1,44 +0,0 @@ -import mongoose, { Model, Schema } from 'mongoose'; -import { nanoid } from 'nanoid'; - -import { APP_URL } from '~/lib/api'; - -export interface ILink { - id: string; - title: string; - url: string; - emoji: string; - attention: boolean; - index: number; - slug: string; - link: string; - clicks: number; - archived: boolean; - created: Date; - updated: Date; -} - -const Link = new Schema( - { - title: { type: String, required: true }, - url: { type: String, required: true }, - emoji: { type: String, required: true }, - attention: { type: Boolean, default: false }, - index: { type: Number, required: true, index: true }, - slug: { type: String, unique: true, index: true, required: true, default: () => nanoid(10) }, - clicks: { type: Number, default: 0 }, - archived: { type: Boolean, default: false }, - created: { type: Date, default: Date.now }, - updated: { type: Date, default: Date.now } - }, - { - toJSON: { virtuals: true }, - toObject: { virtuals: true } - } -); - -Link.virtual('link').get(function () { - return `${APP_URL}/u/${this.slug}`; -}); - -export default (mongoose.models.Link as Model) || mongoose.model('Link', Link); diff --git a/models/Redirect.ts b/models/Redirect.ts deleted file mode 100644 index dfbe722..0000000 --- a/models/Redirect.ts +++ /dev/null @@ -1,37 +0,0 @@ -import mongoose, { Model, Schema } from 'mongoose'; -import { nanoid } from 'nanoid'; - -import { APP_URL } from '~/lib/api'; - -export interface IRedirect { - id: string; - name: string; - slug: string; - url: string; - link: string; - visits: number; - created: Date; - updated: Date; -} - -const Redirect = new Schema( - { - name: { type: String, required: true }, - slug: { type: String, unique: true, index: true, required: true, default: () => nanoid(5) }, - url: { type: String, required: true }, - visits: { type: Number, default: 0 }, - created: { type: Date, default: Date.now }, - updated: { type: Date, default: Date.now } - }, - { - toJSON: { virtuals: true }, - toObject: { virtuals: true } - } -); - -Redirect.virtual('link').get(function () { - return `${APP_URL}/r/${this.slug}`; -}); - -export default (mongoose.models.Redirect as Model) || - mongoose.model('Redirect', Redirect); diff --git a/next-env.d.ts b/next-env.d.ts deleted file mode 100644 index 4f11a03..0000000 --- a/next-env.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -/// -/// - -// NOTE: This file should not be edited -// see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/next.config.js b/next.config.js deleted file mode 100644 index 429e52b..0000000 --- a/next.config.js +++ /dev/null @@ -1,17 +0,0 @@ -const pkg = require('./package.json'); - -// starts a command line process to get the git hash -const commitHash = require('child_process').execSync('git rev-parse HEAD').toString().trim(); - -module.exports = { - env: { - APP_NAME: pkg.name, - APP_DESCRIPTION: pkg.description, - APP_VERSION: pkg.version, - APP_LICENSE: pkg.license, - HOMEPAGE: pkg.homepage, - BUG_TRACKER: pkg.bugs, - REPOSITORY_URL: pkg.repository.url, - COMMIT_HASH: commitHash - } -}; diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index c369c09..0000000 --- a/package-lock.json +++ /dev/null @@ -1,14554 +0,0 @@ -{ - "name": "cesium.link", - "version": "2.0.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "cesium.link", - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "@ant-design/icons": "^4.7.0", - "@auth0/nextjs-auth0": "^1.9.1", - "@tanstack/react-query": "^4.8.0", - "animate.css": "^4.1.1", - "antd": "^5.0.0", - "array-move": "^4.0.0", - "axios": "^0.27.2", - "clsx": "^1.2.1", - "dayjs": "^1.11.5", - "mongoose": "^6.6.3", - "nanoid": "^4.0.0", - "next": "^12.3.1", - "react": "^17.0.2", - "react-dom": "^17.0.2", - "react-emoji-render": "^1.2.4", - "react-icons": "^4.4.0", - "react-qrcode-logo": "^2.8.0", - "react-sortable-hoc": "^2.0.0", - "redaxios": "^0.5.1" - }, - "devDependencies": { - "@trivago/prettier-plugin-sort-imports": "^3.3.0", - "@types/antd": "^1.0.0", - "@types/luxon": "^3.0.0", - "@types/mongoose": "^5.11.97", - "@types/node": "^18.7.13", - "@types/react": "^17.0.44", - "@types/react-dom": "^18.0.6", - "eslint": "^8.14.0", - "eslint-config-next": "^12.1.6", - "eslint-config-prettier": "^8.5.0", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-unused-imports": "^2.0.0", - "npm-run-all": "^4.1.5", - "prettier": "^2.6.2", - "stylelint": "^13.13.1", - "stylelint-a11y": "^1.2.3", - "stylelint-config-css-modules": "^2.3.0", - "stylelint-config-prettier": "^8.0.2", - "stylelint-config-standard": "^20.0.0" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@ant-design/colors": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-6.0.0.tgz", - "integrity": "sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==", - "dependencies": { - "@ctrl/tinycolor": "^3.4.0" - } - }, - "node_modules/@ant-design/cssinjs": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/@ant-design/cssinjs/-/cssinjs-1.5.6.tgz", - "integrity": "sha512-1S7LUPC9BMyQ/CUYgzfePJJwEfsbVHJe3Tpd9zhujTxRM/6LYpN9N4FTaPHVqpnPazm0S2vG0WBkh2T5Erwuug==", - "dependencies": { - "@babel/runtime": "^7.11.1", - "@emotion/hash": "^0.8.0", - "@emotion/unitless": "^0.7.5", - "classnames": "^2.3.1", - "csstype": "^3.0.10", - "rc-util": "^5.27.0", - "stylis": "^4.0.13" - }, - "peerDependencies": { - "react": ">=16.0.0", - "react-dom": ">=16.0.0" - } - }, - "node_modules/@ant-design/icons": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-4.7.0.tgz", - "integrity": "sha512-aoB4Z7JA431rt6d4u+8xcNPPCrdufSRMUOpxa1ab6mz1JCQZOEVolj2WVs/tDFmN62zzK30mNelEsprLYsSF3g==", - "dependencies": { - "@ant-design/colors": "^6.0.0", - "@ant-design/icons-svg": "^4.2.1", - "@babel/runtime": "^7.11.2", - "classnames": "^2.2.6", - "rc-util": "^5.9.4" - }, - "engines": { - "node": ">=8" - }, - "peerDependencies": { - "react": ">=16.0.0", - "react-dom": ">=16.0.0" - } - }, - "node_modules/@ant-design/icons-svg": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.2.1.tgz", - "integrity": "sha512-EB0iwlKDGpG93hW8f85CTJTs4SvMX7tt5ceupvhALp1IF44SeUFOMhKUOYqpsoYWQKAOuTRDMqn75rEaKDp0Xw==" - }, - "node_modules/@ant-design/react-slick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@ant-design/react-slick/-/react-slick-1.0.0.tgz", - "integrity": "sha512-OKxZsn8TAf8fYxP79rDXgLs9zvKMTslK6dJ4iLhDXOujUqC5zJPBRszyrcEHXcMPOm1Sgk40JgyF3yiL/Swd7w==", - "dependencies": { - "@babel/runtime": "^7.10.4", - "classnames": "^2.2.5", - "json2mq": "^0.2.0", - "resize-observer-polyfill": "^1.5.1", - "throttle-debounce": "^5.0.0" - }, - "peerDependencies": { - "react": ">=16.9.0" - } - }, - "node_modules/@auth0/nextjs-auth0": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@auth0/nextjs-auth0/-/nextjs-auth0-1.9.1.tgz", - "integrity": "sha512-GvX1Ke9YzZRogIvSZhRRuZFwvw5DNuQv233VBUHrUwNi+z/XFE6ZRC0y22NgLsz4xsVdG9WicEwqoFT4rNL/Bw==", - "dependencies": { - "base64url": "^3.0.1", - "cookie": "^0.5.0", - "debug": "^4.3.4", - "futoin-hkdf": "^1.5.0", - "http-errors": "^1.8.1", - "joi": "^17.6.0", - "jose": "^2.0.5", - "on-headers": "^1.0.2", - "openid-client": "^4.9.1", - "tslib": "^2.4.0", - "url-join": "^4.0.1" - }, - "engines": { - "node": "^10.13.0 || >=12.0.0" - }, - "peerDependencies": { - "next": ">=10" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.0.tgz", - "integrity": "sha512-y5rqgTTPTmaF5e2nVhOxw+Ur9HDJLsWb6U/KpgUzRZEdPfE6VOubXBKLdbcUTijzRptednSBDQbYZBOSqJxpJw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.8.tgz", - "integrity": "sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.7", - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helpers": "^7.17.8", - "@babel/parser": "^7.17.8", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.7.tgz", - "integrity": "sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.17.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.0.tgz", - "integrity": "sha512-Ai5bNWXIvwDvWM7njqsG3feMlL9hCVQsPYXodsZyLwshYkZVJt59Gftau4VrE8S9IT9asd2uSP1hG6wCNw+sXA==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.19.0", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.20.2", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", - "dev": true, - "dependencies": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name/node_modules/@babel/types": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", - "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables/node_modules/@babel/types": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", - "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports/node_modules/@babel/types": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", - "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.0.tgz", - "integrity": "sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.0", - "@babel/types": "^7.19.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms/node_modules/@babel/generator": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.0.tgz", - "integrity": "sha512-S1ahxf1gZ2dpoiFgA+ohK9DIpz50bJ0CWs7Zlzb54Z4sG8qmdIrGrVqmy1sAtTVRb+9CU6U8VqT9L0Zj7hxHVg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.19.0", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms/node_modules/@babel/parser": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.0.tgz", - "integrity": "sha512-74bEXKX2h+8rrfQUfsBfuZZHzsEs6Eql4pqy/T4Nn6Y9wNPggQOqD6z6pn5Bl8ZfysKouFZT/UXEH94ummEeQw==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/helper-module-transforms/node_modules/@babel/traverse": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.0.tgz", - "integrity": "sha512-4pKpFRDh+utd2mbRC8JLnlsMUii3PMHjpL6a0SZ4NMZy7YFP9aXORxEhdMVOc9CpWtDF09IkciQLEhK7Ml7gRA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.0", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.19.0", - "@babel/types": "^7.19.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms/node_modules/@babel/types": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", - "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", - "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access/node_modules/@babel/types": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", - "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration/node_modules/@babel/types": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", - "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", - "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.19.0.tgz", - "integrity": "sha512-DRBCKGwIEdqY3+rPJgG/dKfQy9+08rHIAJx8q2p+HSWP87s2HCrQmaAMMyMll2kIXKCW0cO1RdQskx15Xakftg==", - "dev": true, - "dependencies": { - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.0", - "@babel/types": "^7.19.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers/node_modules/@babel/generator": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.0.tgz", - "integrity": "sha512-S1ahxf1gZ2dpoiFgA+ohK9DIpz50bJ0CWs7Zlzb54Z4sG8qmdIrGrVqmy1sAtTVRb+9CU6U8VqT9L0Zj7hxHVg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.19.0", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers/node_modules/@babel/parser": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.0.tgz", - "integrity": "sha512-74bEXKX2h+8rrfQUfsBfuZZHzsEs6Eql4pqy/T4Nn6Y9wNPggQOqD6z6pn5Bl8ZfysKouFZT/UXEH94ummEeQw==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/helpers/node_modules/@babel/traverse": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.0.tgz", - "integrity": "sha512-4pKpFRDh+utd2mbRC8JLnlsMUii3PMHjpL6a0SZ4NMZy7YFP9aXORxEhdMVOc9CpWtDF09IkciQLEhK7Ml7gRA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.0", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.19.0", - "@babel/types": "^7.19.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers/node_modules/@babel/types": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", - "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.8.tgz", - "integrity": "sha512-BoHhDJrJXqcg+ZL16Xv39H9n+AqJ4pcDrQBGZN+wHxIysrLZ3/ECwCBUch/1zUNhnsXULcONU3Ei5Hmkfk6kiQ==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", - "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", - "dependencies": { - "regenerator-runtime": "^0.13.11" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/runtime-corejs3": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.19.0.tgz", - "integrity": "sha512-JyXXoCu1N8GLuKc2ii8y5RGma5FMpFeO2nAQIe0Yzrbq+rQnN+sFj47auLblR5ka6aHNGPDgv8G/iI2Grb0ldQ==", - "dev": true, - "dependencies": { - "core-js-pure": "^3.20.2", - "regenerator-runtime": "^0.13.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template/node_modules/@babel/parser": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.0.tgz", - "integrity": "sha512-74bEXKX2h+8rrfQUfsBfuZZHzsEs6Eql4pqy/T4Nn6Y9wNPggQOqD6z6pn5Bl8ZfysKouFZT/UXEH94ummEeQw==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/template/node_modules/@babel/types": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", - "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", - "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.3", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.3", - "@babel/types": "^7.17.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@ctrl/tinycolor": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.0.tgz", - "integrity": "sha512-/Z3l6pXthq0JvMYdUFyX9j0MaCltlIn6mfh9jLyQwg5aPKxkyNa0PTHtU1AlFXLNk55ZuAeJRcpvq+tmLfKmaQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/@emotion/hash": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", - "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" - }, - "node_modules/@emotion/unitless": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", - "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" - }, - "node_modules/@eslint/eslintrc": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.1.tgz", - "integrity": "sha512-OhSY22oQQdw3zgPOOwdoj01l/Dzl1Z+xyUP33tkSN+aqyEhymJCcPHyXt+ylW8FSe0TfRC2VG+ROQOapD0aZSQ==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.4.0", - "globals": "^13.15.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" - }, - "node_modules/@hapi/topo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", - "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/gitignore-to-minimatch": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", - "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.15", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", - "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@next/env": { - "version": "12.3.1", - "resolved": "https://registry.npmjs.org/@next/env/-/env-12.3.1.tgz", - "integrity": "sha512-9P9THmRFVKGKt9DYqeC2aKIxm8rlvkK38V1P1sRE7qyoPBIs8l9oo79QoSdPtOWfzkbDAVUqvbQGgTMsb8BtJg==" - }, - "node_modules/@next/eslint-plugin-next": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-12.3.0.tgz", - "integrity": "sha512-jVdq1qYTNDjUtulnE8/hkPv0pHILV4jMg5La99iaY/FFm20WxVnsAZtbNnMvlPbf8dc010oO304SX9yXbg5PAw==", - "dev": true, - "dependencies": { - "glob": "7.1.7" - } - }, - "node_modules/@next/swc-android-arm-eabi": { - "version": "12.3.1", - "resolved": "https://registry.npmjs.org/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-12.3.1.tgz", - "integrity": "sha512-i+BvKA8tB//srVPPQxIQN5lvfROcfv4OB23/L1nXznP+N/TyKL8lql3l7oo2LNhnH66zWhfoemg3Q4VJZSruzQ==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-android-arm64": { - "version": "12.3.1", - "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-12.3.1.tgz", - "integrity": "sha512-CmgU2ZNyBP0rkugOOqLnjl3+eRpXBzB/I2sjwcGZ7/Z6RcUJXK5Evz+N0ucOxqE4cZ3gkTeXtSzRrMK2mGYV8Q==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-darwin-arm64": { - "version": "12.3.1", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.3.1.tgz", - "integrity": "sha512-hT/EBGNcu0ITiuWDYU9ur57Oa4LybD5DOQp4f22T6zLfpoBMfBibPtR8XktXmOyFHrL/6FC2p9ojdLZhWhvBHg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-darwin-x64": { - "version": "12.3.1", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-12.3.1.tgz", - "integrity": "sha512-9S6EVueCVCyGf2vuiLiGEHZCJcPAxglyckTZcEwLdJwozLqN0gtS0Eq0bQlGS3dH49Py/rQYpZ3KVWZ9BUf/WA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-freebsd-x64": { - "version": "12.3.1", - "resolved": "https://registry.npmjs.org/@next/swc-freebsd-x64/-/swc-freebsd-x64-12.3.1.tgz", - "integrity": "sha512-qcuUQkaBZWqzM0F1N4AkAh88lLzzpfE6ImOcI1P6YeyJSsBmpBIV8o70zV+Wxpc26yV9vpzb+e5gCyxNjKJg5Q==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm-gnueabihf": { - "version": "12.3.1", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.3.1.tgz", - "integrity": "sha512-diL9MSYrEI5nY2wc/h/DBewEDUzr/DqBjIgHJ3RUNtETAOB3spMNHvJk2XKUDjnQuluLmFMloet9tpEqU2TT9w==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-gnu": { - "version": "12.3.1", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.3.1.tgz", - "integrity": "sha512-o/xB2nztoaC7jnXU3Q36vGgOolJpsGG8ETNjxM1VAPxRwM7FyGCPHOMk1XavG88QZSQf+1r+POBW0tLxQOJ9DQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-musl": { - "version": "12.3.1", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.3.1.tgz", - "integrity": "sha512-2WEasRxJzgAmP43glFNhADpe8zB7kJofhEAVNbDJZANp+H4+wq+/cW1CdDi8DqjkShPEA6/ejJw+xnEyDID2jg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-gnu": { - "version": "12.3.1", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.3.1.tgz", - "integrity": "sha512-JWEaMyvNrXuM3dyy9Pp5cFPuSSvG82+yABqsWugjWlvfmnlnx9HOQZY23bFq3cNghy5V/t0iPb6cffzRWylgsA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-musl": { - "version": "12.3.1", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.3.1.tgz", - "integrity": "sha512-xoEWQQ71waWc4BZcOjmatuvPUXKTv6MbIFzpm4LFeCHsg2iwai0ILmNXf81rJR+L1Wb9ifEke2sQpZSPNz1Iyg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-arm64-msvc": { - "version": "12.3.1", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.3.1.tgz", - "integrity": "sha512-hswVFYQYIeGHE2JYaBVtvqmBQ1CppplQbZJS/JgrVI3x2CurNhEkmds/yqvDONfwfbttTtH4+q9Dzf/WVl3Opw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-ia32-msvc": { - "version": "12.3.1", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.3.1.tgz", - "integrity": "sha512-Kny5JBehkTbKPmqulr5i+iKntO5YMP+bVM8Hf8UAmjSMVo3wehyLVc9IZkNmcbxi+vwETnQvJaT5ynYBkJ9dWA==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-x64-msvc": { - "version": "12.3.1", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.3.1.tgz", - "integrity": "sha512-W1ijvzzg+kPEX6LAc+50EYYSEo0FVu7dmTE+t+DM4iOLqgGHoW9uYSz9wCVdkXOEEMP9xhXfGpcSxsfDucyPkA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@panva/asn1.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@panva/asn1.js/-/asn1.js-1.0.0.tgz", - "integrity": "sha512-UdkG3mLEqXgnlKsWanWcgb6dOjUzJ+XC5f+aWw30qrtjxeNUSfKX1cd5FBzOaXQumoe9nIqeZUvrRJS03HCCtw==", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@rc-component/context": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@rc-component/context/-/context-1.3.0.tgz", - "integrity": "sha512-6QdaCJ7Wn5UZLJs15IEfqy4Ru3OaL5ctqpQYWd5rlfV9wwzrzdt6+kgAQZV/qdB0MUPN4nhyBfRembQCIvBf+w==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "rc-util": "^5.27.0" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/@rc-component/mini-decimal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rc-component/mini-decimal/-/mini-decimal-1.0.1.tgz", - "integrity": "sha512-9N8nRk0oKj1qJzANKl+n9eNSMUGsZtjwNuDCiZ/KA+dt1fE3zq5x2XxclRcAbOIXnZcJ53ozP2Pa60gyELXagA==", - "dependencies": { - "@babel/runtime": "^7.18.0" - }, - "engines": { - "node": ">=8.x" - } - }, - "node_modules/@rc-component/mutate-observer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@rc-component/mutate-observer/-/mutate-observer-1.0.0.tgz", - "integrity": "sha512-okqRJSfNisXdI6CUeOLZC5ukBW/8kir2Ii4PJiKpUt+3+uS7dxwJUMxsUZquxA1rQuL8YcEmKVp/TCnR+yUdZA==", - "dependencies": { - "@babel/runtime": "^7.18.0", - "classnames": "^2.3.2", - "rc-util": "^5.24.4" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/@rc-component/portal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rc-component/portal/-/portal-1.1.0.tgz", - "integrity": "sha512-tbXM9SB1r5FOuZjRCljERFByFiEUcMmCWMXLog/NmgCzlAzreXyf23Vei3ZpSMxSMavzPnhCovfZjZdmxS3d1w==", - "dependencies": { - "@babel/runtime": "^7.18.0", - "classnames": "^2.3.2", - "rc-util": "^5.24.4" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/@rc-component/tour": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@rc-component/tour/-/tour-1.6.0.tgz", - "integrity": "sha512-b/s7LCb7bW4wxpWfZyNpl7khHUzSyObSlsLaIScRGd+W/v1wFVk8F7gRytl/z8ik9ZSXbLWx9EvexIuHoO/RcQ==", - "dependencies": { - "@babel/runtime": "^7.18.0", - "@rc-component/portal": "^1.0.0-9", - "classnames": "^2.3.2", - "rc-trigger": "^5.3.4", - "rc-util": "^5.24.4" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/@rushstack/eslint-patch": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.1.4.tgz", - "integrity": "sha512-LwzQKA4vzIct1zNZzBmRKI9QuNpLgTQMEjsQLf3BXuGYb3QPTP4Yjf6mkdX+X1mYttZ808QpOwAzZjv28kq7DA==", - "dev": true - }, - "node_modules/@sideway/address": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", - "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "node_modules/@sideway/formula": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz", - "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==" - }, - "node_modules/@sideway/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" - }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@stylelint/postcss-css-in-js": { - "version": "0.37.3", - "resolved": "https://registry.npmjs.org/@stylelint/postcss-css-in-js/-/postcss-css-in-js-0.37.3.tgz", - "integrity": "sha512-scLk3cSH1H9KggSniseb2KNAU5D9FWc3H7BxCSAIdtU9OWIyw0zkEZ9qEKHryRM+SExYXRKNb7tOOVNAsQ3iwg==", - "dev": true, - "dependencies": { - "@babel/core": "^7.17.9" - }, - "peerDependencies": { - "postcss": ">=7.0.0", - "postcss-syntax": ">=0.36.2" - } - }, - "node_modules/@stylelint/postcss-css-in-js/node_modules/@babel/core": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.0.tgz", - "integrity": "sha512-reM4+U7B9ss148rh2n1Qs9ASS+w94irYXga7c2jaQv9RVzpS7Mv1a9rnYYwuDa45G+DkORt9g6An2k/V4d9LbQ==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.0", - "@babel/helper-compilation-targets": "^7.19.0", - "@babel/helper-module-transforms": "^7.19.0", - "@babel/helpers": "^7.19.0", - "@babel/parser": "^7.19.0", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.0", - "@babel/types": "^7.19.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@stylelint/postcss-css-in-js/node_modules/@babel/generator": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.0.tgz", - "integrity": "sha512-S1ahxf1gZ2dpoiFgA+ohK9DIpz50bJ0CWs7Zlzb54Z4sG8qmdIrGrVqmy1sAtTVRb+9CU6U8VqT9L0Zj7hxHVg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.19.0", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@stylelint/postcss-css-in-js/node_modules/@babel/parser": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.0.tgz", - "integrity": "sha512-74bEXKX2h+8rrfQUfsBfuZZHzsEs6Eql4pqy/T4Nn6Y9wNPggQOqD6z6pn5Bl8ZfysKouFZT/UXEH94ummEeQw==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@stylelint/postcss-css-in-js/node_modules/@babel/traverse": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.0.tgz", - "integrity": "sha512-4pKpFRDh+utd2mbRC8JLnlsMUii3PMHjpL6a0SZ4NMZy7YFP9aXORxEhdMVOc9CpWtDF09IkciQLEhK7Ml7gRA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.0", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.19.0", - "@babel/types": "^7.19.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@stylelint/postcss-css-in-js/node_modules/@babel/types": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", - "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@stylelint/postcss-css-in-js/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@stylelint/postcss-markdown": { - "version": "0.36.2", - "resolved": "https://registry.npmjs.org/@stylelint/postcss-markdown/-/postcss-markdown-0.36.2.tgz", - "integrity": "sha512-2kGbqUVJUGE8dM+bMzXG/PYUWKkjLIkRLWNh39OaADkiabDRdw8ATFCgbMz5xdIcvwspPAluSL7uY+ZiTWdWmQ==", - "deprecated": "Use the original unforked package instead: postcss-markdown", - "dev": true, - "dependencies": { - "remark": "^13.0.0", - "unist-util-find-all-after": "^3.0.2" - }, - "peerDependencies": { - "postcss": ">=7.0.0", - "postcss-syntax": ">=0.36.2" - } - }, - "node_modules/@swc/helpers": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.11.tgz", - "integrity": "sha512-rEUrBSGIoSFuYxwBYtlUFMlE2CwGhmW+w9355/5oduSw8e5h2+Tj4UrAGNNgP9915++wj5vkQo0UuOBqOAq4nw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", - "dependencies": { - "defer-to-connect": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@tanstack/query-core": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-4.8.0.tgz", - "integrity": "sha512-PVcSqAWboFA86eNgtHTOjfHjBkNuFGAM6kPH82p1ibx1R76f7EjedZ+LZi4ZnW4ppoSl/+hUtCgWsiNQ2ViLTw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@tanstack/react-query": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-4.8.0.tgz", - "integrity": "sha512-e3QzL/S8XeA5MYqOUUABet4oZDBc1MbeUIo32r0cxEDoDJS+9oqx0az9AbBxacZ7SjM/Fy4u/eXQFBjsKGFQ6A==", - "dependencies": { - "@tanstack/query-core": "4.8.0", - "use-sync-external-store": "^1.2.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-native": "*" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, - "node_modules/@trivago/prettier-plugin-sort-imports": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@trivago/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-3.3.0.tgz", - "integrity": "sha512-1y44bVZuIN0RsS3oIiGd5k8Vm3IZXYZnp4VsP2Z/S5L9WAOw43HE2clso66M2S/dDeJ+8sKPqnHsEfh39Vjs3w==", - "dev": true, - "dependencies": { - "@babel/core": "7.17.8", - "@babel/generator": "7.17.7", - "@babel/parser": "7.17.8", - "@babel/traverse": "7.17.3", - "@babel/types": "7.17.0", - "javascript-natural-sort": "0.7.1", - "lodash": "4.17.21" - }, - "peerDependencies": { - "prettier": "2.x" - } - }, - "node_modules/@types/antd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/antd/-/antd-1.0.0.tgz", - "integrity": "sha512-wnRh+S6vPMahsuSN6lFJQzNXuhUKr9JKic1L/NMdIChsuu9Fc+mDyF7H17eFPQlgpLVdT0DyYIgB1di8DA9AuQ==", - "deprecated": "This is a stub types definition for antd (https://github.com/ant-design/ant-design). antd provides its own type definitions, so you don't need @types/antd installed!", - "dev": true, - "dependencies": { - "antd": "*" - } - }, - "node_modules/@types/cacheable-request": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", - "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==", - "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "*", - "@types/node": "*", - "@types/responselike": "*" - } - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, - "node_modules/@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/luxon": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.0.1.tgz", - "integrity": "sha512-/LAvk1cMOJt0ghzMFrZEvByUhsiEfeeT2IF53Le+Ki3A538yEL9pRZ7a6MuCxdrYK+YNqNIDmrKU/r2nnw04zQ==", - "dev": true - }, - "node_modules/@types/mdast": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz", - "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==", - "dev": true, - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", - "dev": true - }, - "node_modules/@types/mongoose": { - "version": "5.11.97", - "resolved": "https://registry.npmjs.org/@types/mongoose/-/mongoose-5.11.97.tgz", - "integrity": "sha512-cqwOVYT3qXyLiGw7ueU2kX9noE8DPGRY6z8eUxudhXY8NZ7DMKYAxyZkLSevGfhCX3dO/AoX5/SO9lAzfjon0Q==", - "deprecated": "Mongoose publishes its own types, so you do not need to install this package.", - "dev": true, - "dependencies": { - "mongoose": "*" - } - }, - "node_modules/@types/node": { - "version": "18.7.16", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.16.tgz", - "integrity": "sha512-EQHhixfu+mkqHMZl1R2Ovuvn47PUw18azMJOTwSZr9/fhzHNGXAJ0ma0dayRVchprpCj0Kc1K1xKoWaATWF1qg==" - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", - "dev": true - }, - "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true - }, - "node_modules/@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", - "dev": true - }, - "node_modules/@types/react": { - "version": "17.0.49", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.49.tgz", - "integrity": "sha512-CCBPMZaPhcKkYUTqFs/hOWqKjPxhTEmnZWjlHHgIMop67DsXywf9B5Os9Hz8KSacjNOgIdnZVJamwl232uxoPg==", - "dev": true, - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.0.6", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.6.tgz", - "integrity": "sha512-/5OFZgfIPSwy+YuIBP/FgJnQnsxhZhjjrnxudMddeblOouIodEQ75X14Rr4wGSG/bknL+Omy9iWlLo1u/9GzAA==", - "dev": true, - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/scheduler": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", - "dev": true - }, - "node_modules/@types/unist": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", - "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==", - "dev": true - }, - "node_modules/@types/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog==" - }, - "node_modules/@types/whatwg-url": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz", - "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==", - "dependencies": { - "@types/node": "*", - "@types/webidl-conversions": "*" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "5.36.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.36.2.tgz", - "integrity": "sha512-qS/Kb0yzy8sR0idFspI9Z6+t7mqk/oRjnAYfewG+VN73opAUvmYL3oPIMmgOX6CnQS6gmVIXGshlb5RY/R22pA==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.36.2", - "@typescript-eslint/types": "5.36.2", - "@typescript-eslint/typescript-estree": "5.36.2", - "debug": "^4.3.4" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.36.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.36.2.tgz", - "integrity": "sha512-cNNP51L8SkIFSfce8B1NSUBTJTu2Ts4nWeWbFrdaqjmn9yKrAaJUBHkyTZc0cL06OFHpb+JZq5AUHROS398Orw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.36.2", - "@typescript-eslint/visitor-keys": "5.36.2" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "5.36.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.36.2.tgz", - "integrity": "sha512-9OJSvvwuF1L5eS2EQgFUbECb99F0mwq501w0H0EkYULkhFa19Qq7WFbycdw1PexAc929asupbZcgjVIe6OK/XQ==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.36.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.36.2.tgz", - "integrity": "sha512-8fyH+RfbKc0mTspfuEjlfqA4YywcwQK2Amcf6TDOwaRLg7Vwdu4bZzyvBZp4bjt1RRjQ5MDnOZahxMrt2l5v9w==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.36.2", - "@typescript-eslint/visitor-keys": "5.36.2", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.36.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.36.2.tgz", - "integrity": "sha512-BtRvSR6dEdrNt7Net2/XDjbYKU5Ml6GqJgVfXT0CxTCJlnIqK7rAGreuWKMT2t8cFUT2Msv5oxw0GMRD7T5J7A==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.36.2", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/animate.css": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/animate.css/-/animate.css-4.1.1.tgz", - "integrity": "sha512-+mRmCTv6SbCmtYJCN4faJMNFVNN5EuCTTprDTAo7YzIGji2KADmakjVA3+8mVDkZ2Bf09vayB35lSQIex2+QaQ==" - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/antd": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/antd/-/antd-5.2.2.tgz", - "integrity": "sha512-IHuMyGvgI+pPmoZNJFfhVykb0eW6+iO/39/9qPE0ub9gKAnI4vaK+hA5li6aX+mjM/EqgckdWgLpaIP98kGrvw==", - "dependencies": { - "@ant-design/colors": "^7.0.0", - "@ant-design/cssinjs": "^1.5.6", - "@ant-design/icons": "^5.0.0", - "@ant-design/react-slick": "~1.0.0", - "@babel/runtime": "^7.18.3", - "@ctrl/tinycolor": "^3.6.0", - "@rc-component/mutate-observer": "^1.0.0", - "@rc-component/tour": "~1.6.0", - "classnames": "^2.2.6", - "copy-to-clipboard": "^3.2.0", - "dayjs": "^1.11.1", - "qrcode.react": "^3.1.0", - "rc-cascader": "~3.8.0", - "rc-checkbox": "~2.3.0", - "rc-collapse": "~3.5.2", - "rc-dialog": "~9.0.2", - "rc-drawer": "~6.1.1", - "rc-dropdown": "~4.0.0", - "rc-field-form": "~1.27.0", - "rc-image": "~5.13.0", - "rc-input": "~0.2.1", - "rc-input-number": "~7.4.0", - "rc-mentions": "~2.0.0", - "rc-menu": "~9.8.2", - "rc-motion": "^2.6.1", - "rc-notification": "~5.0.0", - "rc-pagination": "~3.2.0", - "rc-picker": "~3.1.1", - "rc-progress": "~3.4.1", - "rc-rate": "~2.9.0", - "rc-resize-observer": "^1.2.0", - "rc-segmented": "~2.1.2", - "rc-select": "~14.2.0", - "rc-slider": "~10.1.0", - "rc-steps": "~6.0.0", - "rc-switch": "~4.0.0", - "rc-table": "~7.30.2", - "rc-tabs": "~12.5.6", - "rc-textarea": "~1.0.0", - "rc-tooltip": "~5.3.1", - "rc-tree": "~5.7.0", - "rc-tree-select": "~5.6.0", - "rc-trigger": "^5.3.4", - "rc-upload": "~4.3.0", - "rc-util": "^5.27.0", - "scroll-into-view-if-needed": "^3.0.3", - "throttle-debounce": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/ant-design" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/antd/node_modules/@ant-design/colors": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-7.0.0.tgz", - "integrity": "sha512-iVm/9PfGCbC0dSMBrz7oiEXZaaGH7ceU40OJEfKmyuzR9R5CRimJYPlRiFtMQGQcbNMea/ePcoIebi4ASGYXtg==", - "dependencies": { - "@ctrl/tinycolor": "^3.4.0" - } - }, - "node_modules/antd/node_modules/@ant-design/icons": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-5.0.1.tgz", - "integrity": "sha512-ZyF4ksXCcdtwA/1PLlnFLcF/q8/MhwxXhKHh4oCHDA4Ip+ZzAHoICtyp4wZWfiCVDP0yuz3HsjyvuldHFb3wjA==", - "dependencies": { - "@ant-design/colors": "^7.0.0", - "@ant-design/icons-svg": "^4.2.1", - "@babel/runtime": "^7.11.2", - "classnames": "^2.2.6", - "rc-util": "^5.9.4" - }, - "engines": { - "node": ">=8" - }, - "peerDependencies": { - "react": ">=16.0.0", - "react-dom": ">=16.0.0" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/aria-query": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", - "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.10.2", - "@babel/runtime-corejs3": "^7.10.2" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/array-includes": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", - "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5", - "get-intrinsic": "^1.1.1", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-move": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/array-move/-/array-move-4.0.0.tgz", - "integrity": "sha512-+RY54S8OuVvg94THpneQvFRmqWdAHeqtMzgMW6JNurHxe8rsS07cHQdfGkXnTUXiBcyZ0j3SiDIxxj0RPiqCkQ==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/array-tree-filter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-tree-filter/-/array-tree-filter-2.1.0.tgz", - "integrity": "sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==" - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz", - "integrity": "sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz", - "integrity": "sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", - "dev": true - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/async-validator": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", - "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/autoprefixer": { - "version": "9.8.8", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.8.tgz", - "integrity": "sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==", - "dev": true, - "dependencies": { - "browserslist": "^4.12.0", - "caniuse-lite": "^1.0.30001109", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "picocolors": "^0.2.1", - "postcss": "^7.0.32", - "postcss-value-parser": "^4.1.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "funding": { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - } - }, - "node_modules/autoprefixer/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "node_modules/autoprefixer/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/autoprefixer/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/axe-core": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.3.tgz", - "integrity": "sha512-32+ub6kkdhhWick/UjvEwRchgoetXqTK14INLqbGm5U2TzBkBNF3nQtLYm8ovxSkQWArjEQvftCKryjZaATu3w==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/axios": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", - "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", - "dependencies": { - "follow-redirects": "^1.14.9", - "form-data": "^4.0.0" - } - }, - "node_modules/axobject-query": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", - "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", - "dev": true - }, - "node_modules/bail": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", - "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/base64url": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", - "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", - "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001370", - "electron-to-chromium": "^1.4.202", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.5" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bson": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.0.tgz", - "integrity": "sha512-VrlEE4vuiO1WTpfof4VmaVolCVYkYTgB9iWgYNOrVlnifpME/06fhFRmONgBhClD5pFC1t9ZWqFUQEQAzY43bA==", - "dependencies": { - "buffer": "^5.6.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", - "engines": { - "node": ">=10.6.0" - } - }, - "node_modules/cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/camelcase-keys/node_modules/quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001414", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001414.tgz", - "integrity": "sha512-t55jfSaWjCdocnFdKQoO+d2ct9C59UZg4dY3OnUlSZ447r8pUtIKdp0hpAzrGFultmTC+Us+KpKi4GZl/LXlFg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } - ] - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/character-entities": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", - "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-legacy": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", - "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-reference-invalid": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", - "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/classnames": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", - "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/clone-regexp": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-2.2.0.tgz", - "integrity": "sha512-beMpP7BOtTipFuW8hrJvREQ2DrRu3BE7by0ZpibtfBA+qfHYvMGTc2Yb1JMYPKg/JUw0CHYvpg796aNTSW9z7Q==", - "dev": true, - "dependencies": { - "is-regexp": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "dependencies": { - "mimic-response": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/compute-scroll-into-view": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.0.0.tgz", - "integrity": "sha512-Yk1An4qzo5++Cu6peT9PsmRKIU8tALpmdoE09n//AfGQFcPfx21/tMGMsmKYmLJWaBJrGOJ5Jz5hoU+7cZZUWQ==" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.1" - } - }, - "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/copy-to-clipboard": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.2.tgz", - "integrity": "sha512-Vme1Z6RUDzrb6xAI7EZlVZ5uvOk2F//GaxKUxajDqm9LhOVM1inxNAD2vy+UZDYsd0uyA9s7b3/FVZPSxqrCfg==", - "dependencies": { - "toggle-selection": "^1.0.6" - } - }, - "node_modules/core-js-pure": { - "version": "3.25.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.25.1.tgz", - "integrity": "sha512-7Fr74bliUDdeJCBMxkkIuQ4xfxn/SwrVg+HkJUAoNEXVqYLv55l6Af0dJ5Lq2YBUW9yKqSkLXaS5SYPK6MGa/A==", - "dev": true, - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", - "dev": true, - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cosmiconfig/node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/csstype": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", - "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==" - }, - "node_modules/damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", - "dev": true - }, - "node_modules/dayjs": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.5.tgz", - "integrity": "sha512-CAdX5Q3YW3Gclyo5Vpqkgpj8fSdLQcRuzfX6mC6Phy0nfJ0eGYOeS7m4mt2plDWLAtA4TqTakvbboHvUxfe4iA==" - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg==", - "dev": true, - "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decamelize-keys/node_modules/map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "engines": { - "node": ">=10" - } - }, - "node_modules/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/denque": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", - "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dom-align": { - "version": "1.12.4", - "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.12.4.tgz", - "integrity": "sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==" - }, - "node_modules/dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "dev": true, - "dependencies": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - } - }, - "node_modules/dom-serializer/node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/dom-serializer/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true - }, - "node_modules/domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "dev": true, - "dependencies": { - "domelementtype": "1" - } - }, - "node_modules/domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "dev": true, - "dependencies": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.247", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.247.tgz", - "integrity": "sha512-FLs6R4FQE+1JHM0hh3sfdxnYjKvJpHZyhQDjc2qFq/xFvmmRt/TATNToZhrcGUFzpF2XjeiuozrA8lI0PZmYYw==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", - "dev": true - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-abstract": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.2.tgz", - "integrity": "sha512-XxXQuVNrySBNlEkTYJoDNFe5+s2yIOpzq80sUHEdPdQr0S5nTLz4ZPPPswNIpKseDDUS5yghX1gfLIHQZ1iNuQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.2", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/eslint": { - "version": "8.23.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.23.0.tgz", - "integrity": "sha512-pBG/XOn0MsJcKcTRLr27S5HpzQo4kLr+HjLQIyK4EiCsijDl/TB+h5uEuJU6bQ8Edvwz1XWOjpaP2qgnXGpTcA==", - "dev": true, - "dependencies": { - "@eslint/eslintrc": "^1.3.1", - "@humanwhocodes/config-array": "^0.10.4", - "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", - "@humanwhocodes/module-importer": "^1.0.1", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.15.0", - "globby": "^11.1.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-next": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-12.3.0.tgz", - "integrity": "sha512-guHSkNyKnTBB8HU35COgAMeMV0E026BiYRYvyEVVaTOeFcnU3i1EI8/Da0Rl7H3Sgua5FEvoA0vYd2s8kdIUXg==", - "dev": true, - "dependencies": { - "@next/eslint-plugin-next": "12.3.0", - "@rushstack/eslint-patch": "^1.1.3", - "@typescript-eslint/parser": "^5.21.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-import-resolver-typescript": "^2.7.1", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.29.4", - "eslint-plugin-react-hooks": "^4.5.0" - }, - "peerDependencies": { - "eslint": "^7.23.0 || ^8.0.0", - "typescript": ">=3.3.1" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/eslint-config-prettier": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", - "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", - "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", - "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", - "dev": true, - "dependencies": { - "debug": "^3.2.7", - "resolve": "^1.20.0" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-import-resolver-typescript": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-2.7.1.tgz", - "integrity": "sha512-00UbgGwV8bSgUv34igBDbTOtKhqoRMy9bFjNehT40bXg6585PNIct8HhXZ0SybqB9rWtXj9crcku8ndDn/gIqQ==", - "dev": true, - "dependencies": { - "debug": "^4.3.4", - "glob": "^7.2.0", - "is-glob": "^4.0.3", - "resolve": "^1.22.0", - "tsconfig-paths": "^3.14.1" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "*", - "eslint-plugin-import": "*" - } - }, - "node_modules/eslint-import-resolver-typescript/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", - "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", - "dev": true, - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", - "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.4", - "array.prototype.flat": "^1.2.5", - "debug": "^2.6.9", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.3", - "has": "^1.0.3", - "is-core-module": "^2.8.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.values": "^1.1.5", - "resolve": "^1.22.0", - "tsconfig-paths": "^3.14.1" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.1.tgz", - "integrity": "sha512-sXgFVNHiWffBq23uiS/JaP6eVR622DqwB4yTzKvGZGcPq6/yZ3WmOZfuBks/vHWo9GaFOqC2ZK4i6+C35knx7Q==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.18.9", - "aria-query": "^4.2.2", - "array-includes": "^3.1.5", - "ast-types-flow": "^0.0.7", - "axe-core": "^4.4.3", - "axobject-query": "^2.2.0", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "has": "^1.0.3", - "jsx-ast-utils": "^3.3.2", - "language-tags": "^1.0.5", - "minimatch": "^3.1.2", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=4.0" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-react": { - "version": "7.31.8", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.8.tgz", - "integrity": "sha512-5lBTZmgQmARLLSYiwI71tiGVTLUuqXantZM6vlSY39OaDSV0M7+32K5DnLkmFrwTe+Ksz0ffuLUC91RUviVZfw==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.5", - "array.prototype.flatmap": "^1.3.0", - "doctrine": "^2.1.0", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.5", - "object.fromentries": "^2.0.5", - "object.hasown": "^1.1.1", - "object.values": "^1.1.5", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.3", - "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", - "dev": true, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", - "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", - "dev": true, - "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/eslint-plugin-unused-imports": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-2.0.0.tgz", - "integrity": "sha512-3APeS/tQlTrFa167ThtP0Zm0vctjr4M44HMpeg1P4bK6wItarumq0Ma82xorMKdFsWpphQBlRPzw/pxiVELX1A==", - "dev": true, - "dependencies": { - "eslint-rule-composer": "^0.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^5.0.0", - "eslint": "^8.0.0" - }, - "peerDependenciesMeta": { - "@typescript-eslint/eslint-plugin": { - "optional": true - } - } - }, - "node_modules/eslint-rule-composer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", - "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/espree": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", - "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", - "dev": true, - "dependencies": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/execall": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/execall/-/execall-2.0.0.tgz", - "integrity": "sha512-0FU2hZ5Hh6iQnarpRtQurM/aAvp3RIbfvgLHrcqJYzhXyV2KFruhuChf9NC6waAhiUR7FFtlugkI4p7f2Fqlow==", - "dev": true, - "dependencies": { - "clone-regexp": "^2.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "dev": true, - "engines": { - "node": ">= 4.9.1" - } - }, - "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "node_modules/follow-redirects": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", - "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/futoin-hkdf": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/futoin-hkdf/-/futoin-hkdf-1.5.1.tgz", - "integrity": "sha512-g5d0Qp7ks55hYmYmfqn4Nz18XH49lcCR+vvIvHT92xXnsJaGZmY1EtWQWilJ6BQp57heCIXM/rRo+AFep8hGgg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-stdin": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", - "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dev": true, - "dependencies": { - "global-prefix": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dev": true, - "dependencies": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/global-prefix/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globjoin": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", - "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==", - "dev": true - }, - "node_modules/gonzales-pe": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-4.3.0.tgz", - "integrity": "sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "gonzales": "bin/gonzales.js" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/got": { - "version": "11.8.5", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", - "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", - "dependencies": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=10.19.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "node_modules/hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/html-tags": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz", - "integrity": "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "dev": true, - "dependencies": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" - }, - "node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-lazy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "node_modules/internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" - }, - "node_modules/is-alphabetical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", - "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-alphanumerical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", - "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", - "dev": true, - "dependencies": { - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "engines": { - "node": ">=4" - } - }, - "node_modules/is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-decimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", - "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-hexadecimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", - "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-regexp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-2.1.0.tgz", - "integrity": "sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/javascript-natural-sort": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz", - "integrity": "sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==", - "dev": true - }, - "node_modules/joi": { - "version": "17.6.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.6.0.tgz", - "integrity": "sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw==", - "dependencies": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.3", - "@sideway/formula": "^3.0.0", - "@sideway/pinpoint": "^2.0.0" - } - }, - "node_modules/jose": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/jose/-/jose-2.0.6.tgz", - "integrity": "sha512-FVoPY7SflDodE4lknJmbAHSUjLCzE2H1F6MS0RYKMQ8SR+lNccpMf8R4eqkNYyyUjR5qZReOzZo5C5YiHOCjjg==", - "dependencies": { - "@panva/asn1.js": "^1.0.0" - }, - "engines": { - "node": ">=10.13.0 < 13 || >=13.7.0" - }, - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" - }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/json2mq": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz", - "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==", - "dependencies": { - "string-convert": "^0.2.0" - } - }, - "node_modules/json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsx-ast-utils": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", - "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.5", - "object.assign": "^4.1.3" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/kareem": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.4.1.tgz", - "integrity": "sha512-aJ9opVoXroQUPfovYP5kaj2lM7Jn02Gw13bL0lg9v0V7SaUc0qavPs0Eue7d2DcC3NjqI6QAUElXNsuZSeM+EA==" - }, - "node_modules/keyv": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.0.tgz", - "integrity": "sha512-2YvuMsA+jnFGtBareKqgANOEKe1mk3HKiXu2fRmAfyxG0MJAywNhi5ttWA3PMjl4NmpyjZNbFifR2vNjW1znfA==", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/known-css-properties": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.21.0.tgz", - "integrity": "sha512-sZLUnTqimCkvkgRS+kbPlYW5o8q5w1cu+uIisKpEWkj31I8mx8kNG162DwRav8Zirkva6N5uoFsm9kzK4mUXjw==", - "dev": true - }, - "node_modules/language-subtag-registry": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", - "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", - "dev": true - }, - "node_modules/language-tags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", - "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", - "dev": true, - "dependencies": { - "language-subtag-registry": "~0.3.2" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==" - }, - "node_modules/lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/log-symbols/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/log-symbols/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/log-symbols/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/longest-streak": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz", - "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" - }, - "node_modules/map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mathml-tag-names": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", - "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/mdast-util-from-markdown": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz", - "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==", - "dev": true, - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-to-string": "^2.0.0", - "micromark": "~2.11.0", - "parse-entities": "^2.0.0", - "unist-util-stringify-position": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-markdown": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz", - "integrity": "sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0", - "longest-streak": "^2.0.0", - "mdast-util-to-string": "^2.0.0", - "parse-entities": "^2.0.0", - "repeat-string": "^1.0.0", - "zwitch": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", - "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/memory-pager": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", - "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", - "optional": true - }, - "node_modules/memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", - "dev": true, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/meow": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", - "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", - "dev": true, - "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize": "^1.2.0", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/meow/node_modules/normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/meow/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromark": { - "version": "2.11.4", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz", - "integrity": "sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "debug": "^4.0.0", - "parse-entities": "^2.0.0" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, - "node_modules/minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/mongodb": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.9.1.tgz", - "integrity": "sha512-ZhgI/qBf84fD7sI4waZBoLBNJYPQN5IOC++SBCiPiyhzpNKOxN/fi0tBHvH2dEC42HXtNEbFB0zmNz4+oVtorQ==", - "dependencies": { - "bson": "^4.7.0", - "denque": "^2.1.0", - "mongodb-connection-string-url": "^2.5.3", - "socks": "^2.7.0" - }, - "engines": { - "node": ">=12.9.0" - }, - "optionalDependencies": { - "saslprep": "^1.0.3" - } - }, - "node_modules/mongodb-connection-string-url": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.5.3.tgz", - "integrity": "sha512-f+/WsED+xF4B74l3k9V/XkTVj5/fxFH2o5ToKXd8Iyi5UhM+sO9u0Ape17Mvl/GkZaFtM0HQnzAG5OTmhKw+tQ==", - "dependencies": { - "@types/whatwg-url": "^8.2.1", - "whatwg-url": "^11.0.0" - } - }, - "node_modules/mongoose": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.6.3.tgz", - "integrity": "sha512-2Ye018PNBBXJd717qhfjBGo7k8HQb/pKziO9d5wY14iZSUI7hxqL7bwNDg+poeBwnlhBYLncZkips15Blfgxbw==", - "dependencies": { - "bson": "^4.6.5", - "kareem": "2.4.1", - "mongodb": "4.9.1", - "mpath": "0.9.0", - "mquery": "4.0.3", - "ms": "2.1.3", - "sift": "16.0.0" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mongoose" - } - }, - "node_modules/mongoose/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/mpath": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", - "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mquery": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/mquery/-/mquery-4.0.3.tgz", - "integrity": "sha512-J5heI+P08I6VJ2Ky3+33IpCdAvlYGTSUjwTPxkAr8i8EoduPMBX2OY/wa3IKZIQl7MU4SbFk8ndgSKyB/cl1zA==", - "dependencies": { - "debug": "4.x" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/nanoid": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-4.0.0.tgz", - "integrity": "sha512-IgBP8piMxe/gf73RTQx7hmnhwz0aaEXYakvqZyE302IXW3HyVNhdNGC+O2MwMAVhLEnvXlvKtGbtJf6wvHihCg==", - "bin": { - "nanoid": "bin/nanoid.js" - }, - "engines": { - "node": "^14 || ^16 || >=18" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/next": { - "version": "12.3.1", - "resolved": "https://registry.npmjs.org/next/-/next-12.3.1.tgz", - "integrity": "sha512-l7bvmSeIwX5lp07WtIiP9u2ytZMv7jIeB8iacR28PuUEFG5j0HGAPnMqyG5kbZNBG2H7tRsrQ4HCjuMOPnANZw==", - "dependencies": { - "@next/env": "12.3.1", - "@swc/helpers": "0.4.11", - "caniuse-lite": "^1.0.30001406", - "postcss": "8.4.14", - "styled-jsx": "5.0.7", - "use-sync-external-store": "1.2.0" - }, - "bin": { - "next": "dist/bin/next" - }, - "engines": { - "node": ">=12.22.0" - }, - "optionalDependencies": { - "@next/swc-android-arm-eabi": "12.3.1", - "@next/swc-android-arm64": "12.3.1", - "@next/swc-darwin-arm64": "12.3.1", - "@next/swc-darwin-x64": "12.3.1", - "@next/swc-freebsd-x64": "12.3.1", - "@next/swc-linux-arm-gnueabihf": "12.3.1", - "@next/swc-linux-arm64-gnu": "12.3.1", - "@next/swc-linux-arm64-musl": "12.3.1", - "@next/swc-linux-x64-gnu": "12.3.1", - "@next/swc-linux-x64-musl": "12.3.1", - "@next/swc-win32-arm64-msvc": "12.3.1", - "@next/swc-win32-ia32-msvc": "12.3.1", - "@next/swc-win32-x64-msvc": "12.3.1" - }, - "peerDependencies": { - "fibers": ">= 3.1.0", - "node-sass": "^6.0.0 || ^7.0.0", - "react": "^17.0.2 || ^18.0.0-0", - "react-dom": "^17.0.2 || ^18.0.0-0", - "sass": "^1.3.0" - }, - "peerDependenciesMeta": { - "fibers": { - "optional": true - }, - "node-sass": { - "optional": true - }, - "sass": { - "optional": true - } - } - }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node_modules/node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", - "dev": true - }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-selector": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/normalize-selector/-/normalize-selector-0.2.0.tgz", - "integrity": "sha512-dxvWdI8gw6eAvk9BlPffgEoGfM7AdijoCwOEJge3e3ulT2XLgmU7KvvxprOaCu05Q1uGRHmOhHe1r6emZoKyFw==", - "dev": true - }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-all": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", - "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "chalk": "^2.4.1", - "cross-spawn": "^6.0.5", - "memorystream": "^0.3.1", - "minimatch": "^3.0.4", - "pidtree": "^0.3.0", - "read-pkg": "^3.0.0", - "shell-quote": "^1.6.1", - "string.prototype.padend": "^3.0.0" - }, - "bin": { - "npm-run-all": "bin/npm-run-all/index.js", - "run-p": "bin/run-p/index.js", - "run-s": "bin/run-s/index.js" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/npm-run-all/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/npm-run-all/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm-run-all/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/npm-run-all/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-all/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-all/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==", - "dev": true - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", - "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", - "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz", - "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.hasown": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.1.tgz", - "integrity": "sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.values": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", - "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/oidc-token-hash": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.0.1.tgz", - "integrity": "sha512-EvoOtz6FIEBzE+9q253HsLCVRiK/0doEJ2HCvvqMQb3dHZrP3WlJKYtJ55CRTw4jmYomzH4wkPuCj/I3ZvpKxQ==", - "engines": { - "node": "^10.13.0 || >=12.0.0" - } - }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/openid-client": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-4.9.1.tgz", - "integrity": "sha512-DYUF07AHjI3QDKqKbn2F7RqozT4hyi4JvmpodLrq0HHoNP7t/AjeG/uqiBK1/N2PZSAQEThVjDLHSmJN4iqu/w==", - "dependencies": { - "aggregate-error": "^3.1.0", - "got": "^11.8.0", - "jose": "^2.0.5", - "lru-cache": "^6.0.0", - "make-error": "^1.3.6", - "object-hash": "^2.0.1", - "oidc-token-hash": "^5.0.1" - }, - "engines": { - "node": "^10.19.0 || >=12.0.0 < 13 || >=13.7.0 < 14 || >= 14.2.0" - }, - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", - "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", - "dev": true, - "dependencies": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dev": true, - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pidtree": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", - "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", - "dev": true, - "bin": { - "pidtree": "bin/pidtree.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss": { - "version": "8.4.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", - "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - } - ], - "dependencies": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-html": { - "version": "0.36.0", - "resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-0.36.0.tgz", - "integrity": "sha512-HeiOxGcuwID0AFsNAL0ox3mW6MHH5cstWN1Z3Y+n6H+g12ih7LHdYxWwEA/QmrebctLjo79xz9ouK3MroHwOJw==", - "dev": true, - "dependencies": { - "htmlparser2": "^3.10.0" - }, - "peerDependencies": { - "postcss": ">=5.0.0", - "postcss-syntax": ">=0.36.0" - } - }, - "node_modules/postcss-less": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-3.1.4.tgz", - "integrity": "sha512-7TvleQWNM2QLcHqvudt3VYjULVB49uiW6XzEUFmvwHzvsOEF5MwBrIXZDJQvJNFGjJQTzSzZnDoCJ8h/ljyGXA==", - "dev": true, - "dependencies": { - "postcss": "^7.0.14" - }, - "engines": { - "node": ">=6.14.4" - } - }, - "node_modules/postcss-less/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "node_modules/postcss-less/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/postcss-less/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-media-query-parser": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", - "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", - "dev": true - }, - "node_modules/postcss-resolve-nested-selector": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz", - "integrity": "sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==", - "dev": true - }, - "node_modules/postcss-safe-parser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz", - "integrity": "sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g==", - "dev": true, - "dependencies": { - "postcss": "^7.0.26" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-safe-parser/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "node_modules/postcss-safe-parser/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/postcss-safe-parser/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-sass": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/postcss-sass/-/postcss-sass-0.4.4.tgz", - "integrity": "sha512-BYxnVYx4mQooOhr+zer0qWbSPYnarAy8ZT7hAQtbxtgVf8gy+LSLT/hHGe35h14/pZDTw1DsxdbrwxBN++H+fg==", - "dev": true, - "dependencies": { - "gonzales-pe": "^4.3.0", - "postcss": "^7.0.21" - } - }, - "node_modules/postcss-sass/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "node_modules/postcss-sass/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/postcss-sass/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-scss": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-2.1.1.tgz", - "integrity": "sha512-jQmGnj0hSGLd9RscFw9LyuSVAa5Bl1/KBPqG1NQw9w8ND55nY4ZEsdlVuYJvLPpV+y0nwTV5v/4rHPzZRihQbA==", - "dev": true, - "dependencies": { - "postcss": "^7.0.6" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-scss/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "node_modules/postcss-scss/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/postcss-scss/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", - "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-syntax": { - "version": "0.36.2", - "resolved": "https://registry.npmjs.org/postcss-syntax/-/postcss-syntax-0.36.2.tgz", - "integrity": "sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w==", - "dev": true, - "peerDependencies": { - "postcss": ">=5.0.0" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "node_modules/postcss/node_modules/nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", - "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/qrcode-generator": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/qrcode-generator/-/qrcode-generator-1.4.4.tgz", - "integrity": "sha512-HM7yY8O2ilqhmULxGMpcHSF1EhJJ9yBj8gvDEuZ6M+KGJ0YY2hKpnXvRD+hZPLrDVck3ExIGhmPtSdcjC+guuw==" - }, - "node_modules/qrcode.react": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/qrcode.react/-/qrcode.react-3.1.0.tgz", - "integrity": "sha512-oyF+Urr3oAMUG/OiOuONL3HXM+53wvuH3mtIWQrYmsXoAq0DkvZp2RYUWFSMFtbdOpuS++9v+WAkzNVkMlNW6Q==", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/rc-align": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/rc-align/-/rc-align-4.0.15.tgz", - "integrity": "sha512-wqJtVH60pka/nOX7/IspElA8gjPNQKIx/ZqJ6heATCkXpe1Zg4cPVrMD2vC96wjsFFL8WsmhPbx9tdMo1qqlIA==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "2.x", - "dom-align": "^1.7.0", - "rc-util": "^5.26.0", - "resize-observer-polyfill": "^1.5.1" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-cascader": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/rc-cascader/-/rc-cascader-3.8.1.tgz", - "integrity": "sha512-VdsxbiNYmcbMqKzydODr8oehBzIvIk2ICMPu5S95b3SzuKspgkV2uSxBCUa6dsp26lUvRI/PA+k8Q00o5bsSZA==", - "dependencies": { - "@babel/runtime": "^7.12.5", - "array-tree-filter": "^2.1.0", - "classnames": "^2.3.1", - "rc-select": "~14.2.0", - "rc-tree": "~5.7.0", - "rc-util": "^5.6.1" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-checkbox": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/rc-checkbox/-/rc-checkbox-2.3.2.tgz", - "integrity": "sha512-afVi1FYiGv1U0JlpNH/UaEXdh6WUJjcWokj/nUN2TgG80bfG+MDdbfHKlLcNNba94mbjy2/SXJ1HDgrOkXGAjg==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.1" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-collapse": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/rc-collapse/-/rc-collapse-3.5.2.tgz", - "integrity": "sha512-/TNiT3DW1t3sUCiVD/DPUYooJZ3BLA93/2rZsB3eM2bGJCCla2X9D2E4tgm7LGMQGy5Atb2lMUn2FQuvQNvavQ==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "2.x", - "rc-motion": "^2.3.4", - "rc-util": "^5.27.0" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-dialog": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-9.0.2.tgz", - "integrity": "sha512-s3U+24xWUuB6Bn2Lk/Qt6rufy+uT+QvWkiFhNBcO9APLxcFFczWamaq7x9h8SCuhfc1nHcW4y8NbMsnAjNnWyg==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "@rc-component/portal": "^1.0.0-8", - "classnames": "^2.2.6", - "rc-motion": "^2.3.0", - "rc-util": "^5.21.0" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-drawer": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/rc-drawer/-/rc-drawer-6.1.3.tgz", - "integrity": "sha512-AvHisO90A+xMLMKBw2zs89HxjWxusM2BUABlgK60RhweIHF8W/wk0hSOrxBlUXoA9r1F+10na3g6GZ97y1qDZA==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "@rc-component/portal": "^1.0.0-6", - "classnames": "^2.2.6", - "rc-motion": "^2.6.1", - "rc-util": "^5.21.2" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-dropdown": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-4.0.1.tgz", - "integrity": "sha512-OdpXuOcme1rm45cR0Jzgfl1otzmU4vuBVb+etXM8vcaULGokAKVpKlw8p6xzspG7jGd/XxShvq+N3VNEfk/l5g==", - "dependencies": { - "@babel/runtime": "^7.18.3", - "classnames": "^2.2.6", - "rc-trigger": "^5.3.1", - "rc-util": "^5.17.0" - }, - "peerDependencies": { - "react": ">=16.11.0", - "react-dom": ">=16.11.0" - } - }, - "node_modules/rc-field-form": { - "version": "1.27.1", - "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-1.27.1.tgz", - "integrity": "sha512-RShegnwFu6TH8tl2olCxn+B4Wyh5EiQH8c/7wucbkLNyue05YiH5gomUAg1vbZjp71yFKwegClctsEG5CNBWAA==", - "dependencies": { - "@babel/runtime": "^7.18.0", - "async-validator": "^4.1.0", - "rc-util": "^5.8.0" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-image": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/rc-image/-/rc-image-5.13.0.tgz", - "integrity": "sha512-iZTOmw5eWo2+gcrJMMcnd7SsxVHl3w5xlyCgsULUdJhJbnuI8i/AL0tVOsE7aLn9VfOh1qgDT3mC2G75/c7mqg==", - "dependencies": { - "@babel/runtime": "^7.11.2", - "@rc-component/portal": "^1.0.2", - "classnames": "^2.2.6", - "rc-dialog": "~9.0.0", - "rc-motion": "^2.6.2", - "rc-util": "^5.0.6" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-input": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/rc-input/-/rc-input-0.2.2.tgz", - "integrity": "sha512-xgkVcFgtRO0Hl9hmvslZhObNyxbSpTmy3nR1Tk4XrjjZ9lFJ7GcJBy6ss30Pdb0oX36cHzLN8I7VCjBGeRNB9A==", - "dependencies": { - "@babel/runtime": "^7.11.1", - "classnames": "^2.2.1", - "rc-util": "^5.18.1" - }, - "peerDependencies": { - "react": ">=16.0.0", - "react-dom": ">=16.0.0" - } - }, - "node_modules/rc-input-number": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-7.4.1.tgz", - "integrity": "sha512-UwZOteqSKeWVuC6nMl/FZqbfVUR4G2PLMGNFrVeQMmq2iFHlIlDCb1Dh4i+EIPnb3d8k8+NL86KjG02LpYBS3w==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "@rc-component/mini-decimal": "^1.0.1", - "classnames": "^2.2.5", - "rc-util": "^5.25.0" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-mentions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-2.0.0.tgz", - "integrity": "sha512-58NSeM6R5MrgYAhR2TH27JgAN7ivp3iBTmty3q6gvrrGHelPMdGxpJ5aH7AIlodCrPWLAm1lT4XoiuI4s9snXA==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.6", - "rc-input": "^0.2.2", - "rc-menu": "~9.8.0", - "rc-textarea": "^1.0.0", - "rc-trigger": "^5.0.4", - "rc-util": "^5.22.5" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-menu": { - "version": "9.8.2", - "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-9.8.2.tgz", - "integrity": "sha512-EahOJVjLuEnJsThoPN+mGnVm431RzVzDLZWHRS/YnXTQULa7OsgdJa/Y7qXxc3Z5sz8mgT6xYtgpmBXLxrZFaQ==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "2.x", - "rc-motion": "^2.4.3", - "rc-overflow": "^1.2.8", - "rc-trigger": "^5.1.2", - "rc-util": "^5.27.0" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-motion": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.6.3.tgz", - "integrity": "sha512-xFLkes3/7VL/J+ah9jJruEW/Akbx5F6jVa2wG5o/ApGKQKSOd5FR3rseHLL9+xtJg4PmCwo6/1tqhDO/T+jFHA==", - "dependencies": { - "@babel/runtime": "^7.11.1", - "classnames": "^2.2.1", - "rc-util": "^5.21.0" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-notification": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/rc-notification/-/rc-notification-5.0.2.tgz", - "integrity": "sha512-74wUFiLlyr6lRGEY1m1BaTiDp+0lIT4FRAblMnh9FApyK2JGdsSLbrQ/1rgM7d2N/IX5UIr8kLLW3TdXxFt/jQ==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "2.x", - "rc-motion": "^2.6.0", - "rc-util": "^5.20.1" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-overflow": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc-overflow/-/rc-overflow-1.2.8.tgz", - "integrity": "sha512-QJ0UItckWPQ37ZL1dMEBAdY1dhfTXFL9k6oTTcyydVwoUNMnMqCGqnRNA98axSr/OeDKqR6DVFyi8eA5RQI/uQ==", - "dependencies": { - "@babel/runtime": "^7.11.1", - "classnames": "^2.2.1", - "rc-resize-observer": "^1.0.0", - "rc-util": "^5.19.2" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-pagination": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/rc-pagination/-/rc-pagination-3.2.0.tgz", - "integrity": "sha512-5tIXjB670WwwcAJzAqp2J+cOBS9W3cH/WU1EiYwXljuZ4vtZXKlY2Idq8FZrnYBz8KhN3vwPo9CoV/SJS6SL1w==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.1" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-picker": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-3.1.5.tgz", - "integrity": "sha512-Hh3ml+u+5mxLfl4ahVWlRGiX5+0EJrALR6tSW9yP0eea+6j+YjvjfetbvuVidViMDMweZa38dr8HTfAFLG6GFw==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.1", - "rc-trigger": "^5.0.4", - "rc-util": "^5.27.0" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "date-fns": ">= 2.x", - "dayjs": ">= 1.x", - "moment": ">= 2.x", - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - }, - "peerDependenciesMeta": { - "date-fns": { - "optional": true - }, - "dayjs": { - "optional": true - }, - "moment": { - "optional": true - } - } - }, - "node_modules/rc-progress": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/rc-progress/-/rc-progress-3.4.1.tgz", - "integrity": "sha512-eAFDHXlk8aWpoXl0llrenPMt9qKHQXphxcVsnKs0FHC6eCSk1ebJtyaVjJUzKe0233ogiLDeEFK1Uihz3s67hw==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.6", - "rc-util": "^5.16.1" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-rate": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/rc-rate/-/rc-rate-2.9.2.tgz", - "integrity": "sha512-SaiZFyN8pe0Fgphv8t3+kidlej+cq/EALkAJAc3A0w0XcPaH2L1aggM8bhe1u6GAGuQNAoFvTLjw4qLPGRKV5g==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.5", - "rc-util": "^5.0.1" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-resize-observer": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.3.1.tgz", - "integrity": "sha512-iFUdt3NNhflbY3mwySv5CA1TC06zdJ+pfo0oc27xpf4PIOvfZwZGtD9Kz41wGYqC4SLio93RVAirSSpYlV/uYg==", - "dependencies": { - "@babel/runtime": "^7.20.7", - "classnames": "^2.2.1", - "rc-util": "^5.27.0", - "resize-observer-polyfill": "^1.5.1" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-segmented": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/rc-segmented/-/rc-segmented-2.1.2.tgz", - "integrity": "sha512-qGo1bCr83ESXpXVOCXjFe1QJlCAQXyi9KCiy8eX3rIMYlTeJr/ftySIaTnYsitL18SvWf5ZEHsfqIWoX0EMfFQ==", - "dependencies": { - "@babel/runtime": "^7.11.1", - "classnames": "^2.2.1", - "rc-motion": "^2.4.4", - "rc-util": "^5.17.0" - }, - "peerDependencies": { - "react": ">=16.0.0", - "react-dom": ">=16.0.0" - } - }, - "node_modules/rc-select": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-14.2.0.tgz", - "integrity": "sha512-tvxHmbAA0EIhBkB7dyaRhcBUIWHocQbUFY/fBlezj2jg5p65a5VQ/UhBg2I9TA1wjpsr5CCx0ruZPkYcUMjDoQ==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "2.x", - "rc-motion": "^2.0.1", - "rc-overflow": "^1.0.0", - "rc-trigger": "^5.0.4", - "rc-util": "^5.16.1", - "rc-virtual-list": "^3.4.13" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": "*", - "react-dom": "*" - } - }, - "node_modules/rc-slider": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-10.1.1.tgz", - "integrity": "sha512-gn8oXazZISEhnmRinI89Z/JD/joAaM35jp+gDtIVSTD/JJMCCBqThqLk1SVJmvtfeiEF/kKaFY0+qt4SDHFUDw==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.5", - "rc-util": "^5.27.0" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-steps": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/rc-steps/-/rc-steps-6.0.0.tgz", - "integrity": "sha512-+KfMZIty40mYCQSDvYbZ1jwnuObLauTiIskT1hL4FFOBHP6ZOr8LK0m143yD3kEN5XKHSEX1DIwCj3AYZpoeNQ==", - "dependencies": { - "@babel/runtime": "^7.16.7", - "classnames": "^2.2.3", - "rc-util": "^5.16.1" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-switch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/rc-switch/-/rc-switch-4.0.0.tgz", - "integrity": "sha512-IfrYC99vN0gKaTyjQdqYuADU0eH00SAFHg3jOp8HrmUpJruhV1SohJzrCbPqPraZeX/6X/QKkdLfkdnUub05WA==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.1", - "rc-util": "^5.0.1" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-table": { - "version": "7.30.4", - "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.30.4.tgz", - "integrity": "sha512-NXfitP7CEXAnnuxdEYZNwEMyWmWOSsv9WgiP2yI10pyy0BwomFn4aa8nX/9x832edLwuIlrYuL6ojfOK60An2w==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "@rc-component/context": "^1.3.0", - "classnames": "^2.2.5", - "rc-resize-observer": "^1.1.0", - "rc-util": "^5.27.1" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-tabs": { - "version": "12.5.7", - "resolved": "https://registry.npmjs.org/rc-tabs/-/rc-tabs-12.5.7.tgz", - "integrity": "sha512-i9gY2TcwCNmBM+bXCDDTvb6mnRYIDkkNm+UGoIqrLOFnRRbAqjsSf+tgyvzhBvbK8XcSrMhzKKLaOMbGyND8YA==", - "dependencies": { - "@babel/runtime": "^7.11.2", - "classnames": "2.x", - "rc-dropdown": "~4.0.0", - "rc-menu": "~9.8.0", - "rc-motion": "^2.6.2", - "rc-resize-observer": "^1.0.0", - "rc-util": "^5.16.0" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-textarea": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rc-textarea/-/rc-textarea-1.0.1.tgz", - "integrity": "sha512-dtIm96apjJpCUcCeTtbnLGJaVlqbOqVgN0P9z+bqMSi7rcV5QVeUtBnG+jQTGk/uD183Z7jbhc8Dx7G3luDCwg==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.1", - "rc-input": "^0.2.1", - "rc-resize-observer": "^1.0.0", - "rc-util": "^5.27.0" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-tooltip": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-5.3.1.tgz", - "integrity": "sha512-e6H0dMD38EPaSPD2XC8dRfct27VvT2TkPdoBSuNl3RRZ5tspiY/c5xYEmGC0IrABvMBgque4Mr2SMZuliCvoiQ==", - "dependencies": { - "@babel/runtime": "^7.11.2", - "classnames": "^2.3.1", - "rc-trigger": "^5.3.1" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-tree": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-5.7.2.tgz", - "integrity": "sha512-nmnL6qLnfwVckO5zoqKL2I9UhwDqzyCtjITQCkwhimyz1zfuFkG5ZPIXpzD/Guzso94qQA/QrMsvzic5W6QDjg==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "2.x", - "rc-motion": "^2.0.1", - "rc-util": "^5.16.1", - "rc-virtual-list": "^3.4.8" - }, - "engines": { - "node": ">=10.x" - }, - "peerDependencies": { - "react": "*", - "react-dom": "*" - } - }, - "node_modules/rc-tree-select": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-5.6.0.tgz", - "integrity": "sha512-XG6pu0a9l6+mzhQqUYfR2VIONbe/3LjVc3wKt28k6uBMZsI1j+SSxRyt/7jWRq8Kok8jHJBQASlDg6ehr9Sp0w==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "2.x", - "rc-select": "~14.2.0", - "rc-tree": "~5.7.0", - "rc-util": "^5.16.1" - }, - "peerDependencies": { - "react": "*", - "react-dom": "*" - } - }, - "node_modules/rc-trigger": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-5.3.4.tgz", - "integrity": "sha512-mQv+vas0TwKcjAO2izNPkqR4j86OemLRmvL2nOzdP9OWNWA1ivoTt5hzFqYNW9zACwmTezRiN8bttrC7cZzYSw==", - "dependencies": { - "@babel/runtime": "^7.18.3", - "classnames": "^2.2.6", - "rc-align": "^4.0.0", - "rc-motion": "^2.0.0", - "rc-util": "^5.19.2" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-upload": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/rc-upload/-/rc-upload-4.3.4.tgz", - "integrity": "sha512-uVbtHFGNjHG/RyAfm9fluXB6pvArAGyAx8z7XzXXyorEgVIWj6mOlriuDm0XowDHYz4ycNK0nE0oP3cbFnzxiQ==", - "dependencies": { - "@babel/runtime": "^7.18.3", - "classnames": "^2.2.5", - "rc-util": "^5.2.0" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-util": { - "version": "5.28.0", - "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.28.0.tgz", - "integrity": "sha512-KYDjhGodswVj29v0TRciKTqRPgumIFvFDndbCD227pitQ+0Cei196rxk+OXb/blu6V8zdTRK5RjCJn+WmHLvBA==", - "dependencies": { - "@babel/runtime": "^7.18.3", - "react-is": "^16.12.0" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-virtual-list": { - "version": "3.4.13", - "resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.4.13.tgz", - "integrity": "sha512-cPOVDmcNM7rH6ANotanMDilW/55XnFPw0Jh/GQYtrzZSy3AmWvCnqVNyNC/pgg3lfVmX2994dlzAhuUrd4jG7w==", - "dependencies": { - "@babel/runtime": "^7.20.0", - "classnames": "^2.2.6", - "rc-resize-observer": "^1.0.0", - "rc-util": "^5.15.0" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": "*", - "react-dom": "*" - } - }, - "node_modules/react": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", - "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", - "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" - }, - "peerDependencies": { - "react": "17.0.2" - } - }, - "node_modules/react-emoji-render": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/react-emoji-render/-/react-emoji-render-1.2.4.tgz", - "integrity": "sha512-AqktVXV38uDpgf02BoCXrzLYFsHAsxfdWwjrLexSJ22l1JgB01y1KejjxW/zTuCzod6O7BZfiMS866LEEfMHmA==", - "dependencies": { - "classnames": "^2.2.5", - "emoji-regex": "^6.4.1", - "lodash.flatten": "^4.4.0", - "prop-types": "^15.5.8", - "string-replace-to-array": "^1.0.1" - }, - "peerDependencies": { - "react": ">=0.14.0", - "react-dom": ">=0.14.0" - } - }, - "node_modules/react-emoji-render/node_modules/emoji-regex": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-6.5.1.tgz", - "integrity": "sha512-PAHp6TxrCy7MGMFidro8uikr+zlJJKJ/Q6mm2ExZ7HwkyR9lSVFfE3kt36qcwa24BQL7y0G9axycGjK1A/0uNQ==" - }, - "node_modules/react-icons": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.4.0.tgz", - "integrity": "sha512-fSbvHeVYo/B5/L4VhB7sBA1i2tS8MkT0Hb9t2H1AVPkwGfVHLJCqyr2Py9dKMxsyM63Eng1GkdZfbWj+Fmv8Rg==", - "peerDependencies": { - "react": "*" - } - }, - "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/react-qrcode-logo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/react-qrcode-logo/-/react-qrcode-logo-2.8.0.tgz", - "integrity": "sha512-dbEgjsg6C4tK6+oGmCRDlJ7urQAWqybaGBLJtp8Z6ZYvVUP302HBXk/F7VRk54yWTwzlHwig3VK6HMKCha2YFw==", - "dependencies": { - "lodash.isequal": "^4.5.0", - "qrcode-generator": "^1.4.1" - }, - "peerDependencies": { - "react": ">=16.4.1", - "react-dom": ">=16.4.1" - } - }, - "node_modules/react-sortable-hoc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/react-sortable-hoc/-/react-sortable-hoc-2.0.0.tgz", - "integrity": "sha512-JZUw7hBsAHXK7PTyErJyI7SopSBFRcFHDjWW5SWjcugY0i6iH7f+eJkY8cJmGMlZ1C9xz1J3Vjz0plFpavVeRg==", - "dependencies": { - "@babel/runtime": "^7.2.0", - "invariant": "^2.2.4", - "prop-types": "^15.5.7" - }, - "peerDependencies": { - "prop-types": "^15.5.7", - "react": "^16.3.0 || ^17.0.0", - "react-dom": "^16.3.0 || ^17.0.0" - } - }, - "node_modules/read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", - "dev": true, - "dependencies": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg/node_modules/path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/redaxios": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/redaxios/-/redaxios-0.5.1.tgz", - "integrity": "sha512-FSD2AmfdbkYwl7KDExYQlVvIrFz6Yd83pGfaGjBzM9F6rpq8g652Q4Yq5QD4c+nf4g2AgeElv1y+8ajUPiOYMg==" - }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" - }, - "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/remark": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/remark/-/remark-13.0.0.tgz", - "integrity": "sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA==", - "dev": true, - "dependencies": { - "remark-parse": "^9.0.0", - "remark-stringify": "^9.0.0", - "unified": "^9.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-parse": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz", - "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==", - "dev": true, - "dependencies": { - "mdast-util-from-markdown": "^0.8.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-stringify": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-9.0.1.tgz", - "integrity": "sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg==", - "dev": true, - "dependencies": { - "mdast-util-to-markdown": "^0.6.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resize-observer-polyfill": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", - "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" - }, - "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", - "dependencies": { - "lowercase-keys": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/saslprep": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", - "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", - "optional": true, - "dependencies": { - "sparse-bitfield": "^3.0.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "node_modules/scroll-into-view-if-needed": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.0.6.tgz", - "integrity": "sha512-x+CW0kOzlFNOnseF0DBr0AJ5m+TgGmSOdEZwyiZW0gV87XBvxQKw5A8DvFFgabznA68XqLgVX+PwPX8OzsFvRA==", - "dependencies": { - "compute-scroll-into-view": "^3.0.0" - } - }, - "node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", - "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==", - "dev": true - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/sift": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.0.tgz", - "integrity": "sha512-ILTjdP2Mv9V1kIxWMXeMTIRbOBrqKc4JAXmFMnFq3fKeyQ2Qwa3Dw1ubcye3vR+Y6ofA0b9gNDr/y2t6eUeIzQ==" - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/slice-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/slice-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.0.tgz", - "integrity": "sha512-scnOe9y4VuiNUULJN72GrM26BNOjVsfPXI+j+98PkyEfsIXroa5ofyjT+FzGvn/xHs73U2JtoBYAVx9Hl4quSA==", - "dependencies": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sparse-bitfield": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", - "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", - "optional": true, - "dependencies": { - "memory-pager": "^1.0.2" - } - }, - "node_modules/spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", - "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", - "dev": true - }, - "node_modules/specificity": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.4.1.tgz", - "integrity": "sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==", - "dev": true, - "bin": { - "specificity": "bin/specificity" - } - }, - "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/string-convert": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz", - "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==" - }, - "node_modules/string-replace-to-array": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string-replace-to-array/-/string-replace-to-array-1.0.3.tgz", - "integrity": "sha512-QIdKvmfXbdFvblXAAz6IIjR7A+C6SU6m2A+e7fE/0EYDC5yfeWNMJQ193fPsW7nG+9q52dv/UjnVrDaNVZXpmQ==", - "dependencies": { - "invariant": "^2.2.1", - "lodash.flatten": "^4.2.0", - "lodash.isstring": "^4.0.1" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/string.prototype.matchall": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz", - "integrity": "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", - "get-intrinsic": "^1.1.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.1", - "side-channel": "^1.0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.padend": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.3.tgz", - "integrity": "sha512-jNIIeokznm8SD/TZISQsZKYu7RJyheFNt84DUPrh482GC8RVp2MKqm2O5oBRdGxbDQoXrhhWtPIWQOiy20svUg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", - "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", - "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/style-search": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", - "integrity": "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==", - "dev": true - }, - "node_modules/styled-jsx": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.0.7.tgz", - "integrity": "sha512-b3sUzamS086YLRuvnaDigdAewz1/EFYlHpYBP5mZovKEdQQOIIYq8lApylub3HHZ6xFjV051kkGU7cudJmrXEA==", - "engines": { - "node": ">= 12.0.0" - }, - "peerDependencies": { - "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/stylelint": { - "version": "13.13.1", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.13.1.tgz", - "integrity": "sha512-Mv+BQr5XTUrKqAXmpqm6Ddli6Ief+AiPZkRsIrAoUKFuq/ElkUh9ZMYxXD0iQNZ5ADghZKLOWz1h7hTClB7zgQ==", - "dev": true, - "dependencies": { - "@stylelint/postcss-css-in-js": "^0.37.2", - "@stylelint/postcss-markdown": "^0.36.2", - "autoprefixer": "^9.8.6", - "balanced-match": "^2.0.0", - "chalk": "^4.1.1", - "cosmiconfig": "^7.0.0", - "debug": "^4.3.1", - "execall": "^2.0.0", - "fast-glob": "^3.2.5", - "fastest-levenshtein": "^1.0.12", - "file-entry-cache": "^6.0.1", - "get-stdin": "^8.0.0", - "global-modules": "^2.0.0", - "globby": "^11.0.3", - "globjoin": "^0.1.4", - "html-tags": "^3.1.0", - "ignore": "^5.1.8", - "import-lazy": "^4.0.0", - "imurmurhash": "^0.1.4", - "known-css-properties": "^0.21.0", - "lodash": "^4.17.21", - "log-symbols": "^4.1.0", - "mathml-tag-names": "^2.1.3", - "meow": "^9.0.0", - "micromatch": "^4.0.4", - "normalize-selector": "^0.2.0", - "postcss": "^7.0.35", - "postcss-html": "^0.36.0", - "postcss-less": "^3.1.4", - "postcss-media-query-parser": "^0.2.3", - "postcss-resolve-nested-selector": "^0.1.1", - "postcss-safe-parser": "^4.0.2", - "postcss-sass": "^0.4.4", - "postcss-scss": "^2.1.1", - "postcss-selector-parser": "^6.0.5", - "postcss-syntax": "^0.36.2", - "postcss-value-parser": "^4.1.0", - "resolve-from": "^5.0.0", - "slash": "^3.0.0", - "specificity": "^0.4.1", - "string-width": "^4.2.2", - "strip-ansi": "^6.0.0", - "style-search": "^0.1.0", - "sugarss": "^2.0.0", - "svg-tags": "^1.0.0", - "table": "^6.6.0", - "v8-compile-cache": "^2.3.0", - "write-file-atomic": "^3.0.3" - }, - "bin": { - "stylelint": "bin/stylelint.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/stylelint" - } - }, - "node_modules/stylelint-a11y": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stylelint-a11y/-/stylelint-a11y-1.2.3.tgz", - "integrity": "sha512-S/iiKFUsYBfa4suxP0pYQqoPB9R1+SnvxVuzHHlz9al0IWxLZzXlnZEqEez0zNOhVh5iO3rATUmDnbZE5wm/pQ==", - "dev": true, - "engines": { - "node": ">=8.7.0" - }, - "peerDependencies": { - "stylelint": "^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0" - } - }, - "node_modules/stylelint-config-css-modules": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/stylelint-config-css-modules/-/stylelint-config-css-modules-2.3.0.tgz", - "integrity": "sha512-nSxwaJMv9wBrTAi+O4qXubyi1AR9eB36tJpY0uaFhKgEc3fwWGUzUK1Edl8AQHAoU7wmUeKtsuYjblyRP/V7rw==", - "dev": true, - "peerDependencies": { - "stylelint": "11.x - 14.x" - } - }, - "node_modules/stylelint-config-prettier": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/stylelint-config-prettier/-/stylelint-config-prettier-8.0.2.tgz", - "integrity": "sha512-TN1l93iVTXpF9NJstlvP7nOu9zY2k+mN0NSFQ/VEGz15ZIP9ohdDZTtCWHs5LjctAhSAzaILULGbgiM0ItId3A==", - "dev": true, - "bin": { - "stylelint-config-prettier": "bin/check.js", - "stylelint-config-prettier-check": "bin/check.js" - }, - "engines": { - "node": ">= 10", - "npm": ">= 5" - }, - "peerDependencies": { - "stylelint": ">=11.0.0" - } - }, - "node_modules/stylelint-config-recommended": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-3.0.0.tgz", - "integrity": "sha512-F6yTRuc06xr1h5Qw/ykb2LuFynJ2IxkKfCMf+1xqPffkxh0S09Zc902XCffcsw/XMFq/OzQ1w54fLIDtmRNHnQ==", - "dev": true, - "peerDependencies": { - "stylelint": ">=10.1.0" - } - }, - "node_modules/stylelint-config-standard": { - "version": "20.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-20.0.0.tgz", - "integrity": "sha512-IB2iFdzOTA/zS4jSVav6z+wGtin08qfj+YyExHB3LF9lnouQht//YyB0KZq9gGz5HNPkddHOzcY8HsUey6ZUlA==", - "dev": true, - "dependencies": { - "stylelint-config-recommended": "^3.0.0" - }, - "peerDependencies": { - "stylelint": ">=10.1.0" - } - }, - "node_modules/stylelint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/stylelint/node_modules/balanced-match": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", - "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", - "dev": true - }, - "node_modules/stylelint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/stylelint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/stylelint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/stylelint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/stylelint/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "node_modules/stylelint/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/stylelint/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/stylelint/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stylelint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/stylis": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz", - "integrity": "sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==" - }, - "node_modules/sugarss": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-2.0.0.tgz", - "integrity": "sha512-WfxjozUk0UVA4jm+U1d736AUpzSrNsQcIbyOkoE364GrtWmIrFdk5lksEupgWMD4VaT/0kVx1dobpiDumSgmJQ==", - "dev": true, - "dependencies": { - "postcss": "^7.0.2" - } - }, - "node_modules/sugarss/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "node_modules/sugarss/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/sugarss/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/svg-tags": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", - "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", - "dev": true - }, - "node_modules/table": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz", - "integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==", - "dev": true, - "dependencies": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/table/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/table/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/throttle-debounce": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.0.tgz", - "integrity": "sha512-2iQTSgkkc1Zyk0MeVrt/3BvuOXYPl/R8Z0U2xxo9rjwNciaHDG3R+Lm6dh4EeUci49DanvBnuqI6jshoQQRGEg==", - "engines": { - "node": ">=12.22" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toggle-selection": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", - "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tr46": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/trough": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", - "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", - "dev": true, - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typescript": { - "version": "4.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.3.tgz", - "integrity": "sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==", - "dev": true, - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/unified": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz", - "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==", - "dev": true, - "dependencies": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unified/node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/unist-util-find-all-after": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/unist-util-find-all-after/-/unist-util-find-all-after-3.0.2.tgz", - "integrity": "sha512-xaTC/AGZ0rIM2gM28YVRAFPIZpzbpDtU3dRmp7EXlNVA8ziQc4hY3H7BHXM1J49nEmiqc3svnqMReW+PGqbZKQ==", - "dev": true, - "dependencies": { - "unist-util-is": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-is": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", - "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-stringify-position": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", - "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.7.tgz", - "integrity": "sha512-iN/XYesmZ2RmmWAiI4Z5rq0YqSiv0brj9Ce9CfhNE4xIW2h+MFxcgkxIzZ+ShkFPUkjU3gQ+3oypadD3RAMtrg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist-lint": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url-join": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==" - }, - "node_modules/use-sync-external-store": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", - "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/vfile": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", - "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^2.0.0", - "vfile-message": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-message": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", - "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-url": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", - "dependencies": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zwitch": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", - "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@ant-design/colors": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-6.0.0.tgz", - "integrity": "sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==", - "requires": { - "@ctrl/tinycolor": "^3.4.0" - } - }, - "@ant-design/cssinjs": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/@ant-design/cssinjs/-/cssinjs-1.5.6.tgz", - "integrity": "sha512-1S7LUPC9BMyQ/CUYgzfePJJwEfsbVHJe3Tpd9zhujTxRM/6LYpN9N4FTaPHVqpnPazm0S2vG0WBkh2T5Erwuug==", - "requires": { - "@babel/runtime": "^7.11.1", - "@emotion/hash": "^0.8.0", - "@emotion/unitless": "^0.7.5", - "classnames": "^2.3.1", - "csstype": "^3.0.10", - "rc-util": "^5.27.0", - "stylis": "^4.0.13" - } - }, - "@ant-design/icons": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-4.7.0.tgz", - "integrity": "sha512-aoB4Z7JA431rt6d4u+8xcNPPCrdufSRMUOpxa1ab6mz1JCQZOEVolj2WVs/tDFmN62zzK30mNelEsprLYsSF3g==", - "requires": { - "@ant-design/colors": "^6.0.0", - "@ant-design/icons-svg": "^4.2.1", - "@babel/runtime": "^7.11.2", - "classnames": "^2.2.6", - "rc-util": "^5.9.4" - } - }, - "@ant-design/icons-svg": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.2.1.tgz", - "integrity": "sha512-EB0iwlKDGpG93hW8f85CTJTs4SvMX7tt5ceupvhALp1IF44SeUFOMhKUOYqpsoYWQKAOuTRDMqn75rEaKDp0Xw==" - }, - "@ant-design/react-slick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@ant-design/react-slick/-/react-slick-1.0.0.tgz", - "integrity": "sha512-OKxZsn8TAf8fYxP79rDXgLs9zvKMTslK6dJ4iLhDXOujUqC5zJPBRszyrcEHXcMPOm1Sgk40JgyF3yiL/Swd7w==", - "requires": { - "@babel/runtime": "^7.10.4", - "classnames": "^2.2.5", - "json2mq": "^0.2.0", - "resize-observer-polyfill": "^1.5.1", - "throttle-debounce": "^5.0.0" - } - }, - "@auth0/nextjs-auth0": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@auth0/nextjs-auth0/-/nextjs-auth0-1.9.1.tgz", - "integrity": "sha512-GvX1Ke9YzZRogIvSZhRRuZFwvw5DNuQv233VBUHrUwNi+z/XFE6ZRC0y22NgLsz4xsVdG9WicEwqoFT4rNL/Bw==", - "requires": { - "base64url": "^3.0.1", - "cookie": "^0.5.0", - "debug": "^4.3.4", - "futoin-hkdf": "^1.5.0", - "http-errors": "^1.8.1", - "joi": "^17.6.0", - "jose": "^2.0.5", - "on-headers": "^1.0.2", - "openid-client": "^4.9.1", - "tslib": "^2.4.0", - "url-join": "^4.0.1" - } - }, - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dev": true, - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@babel/compat-data": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.0.tgz", - "integrity": "sha512-y5rqgTTPTmaF5e2nVhOxw+Ur9HDJLsWb6U/KpgUzRZEdPfE6VOubXBKLdbcUTijzRptednSBDQbYZBOSqJxpJw==", - "dev": true - }, - "@babel/core": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.8.tgz", - "integrity": "sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.7", - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helpers": "^7.17.8", - "@babel/parser": "^7.17.8", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0" - } - }, - "@babel/generator": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.7.tgz", - "integrity": "sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==", - "dev": true, - "requires": { - "@babel/types": "^7.17.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.0.tgz", - "integrity": "sha512-Ai5bNWXIvwDvWM7njqsG3feMlL9hCVQsPYXodsZyLwshYkZVJt59Gftau4VrE8S9IT9asd2uSP1hG6wCNw+sXA==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.19.0", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.20.2", - "semver": "^6.3.0" - } - }, - "@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "dev": true - }, - "@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", - "dev": true, - "requires": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" - }, - "dependencies": { - "@babel/types": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", - "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - }, - "dependencies": { - "@babel/types": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", - "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - }, - "dependencies": { - "@babel/types": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", - "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-module-transforms": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.0.tgz", - "integrity": "sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.0", - "@babel/types": "^7.19.0" - }, - "dependencies": { - "@babel/generator": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.0.tgz", - "integrity": "sha512-S1ahxf1gZ2dpoiFgA+ohK9DIpz50bJ0CWs7Zlzb54Z4sG8qmdIrGrVqmy1sAtTVRb+9CU6U8VqT9L0Zj7hxHVg==", - "dev": true, - "requires": { - "@babel/types": "^7.19.0", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - } - }, - "@babel/parser": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.0.tgz", - "integrity": "sha512-74bEXKX2h+8rrfQUfsBfuZZHzsEs6Eql4pqy/T4Nn6Y9wNPggQOqD6z6pn5Bl8ZfysKouFZT/UXEH94ummEeQw==", - "dev": true - }, - "@babel/traverse": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.0.tgz", - "integrity": "sha512-4pKpFRDh+utd2mbRC8JLnlsMUii3PMHjpL6a0SZ4NMZy7YFP9aXORxEhdMVOc9CpWtDF09IkciQLEhK7Ml7gRA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.0", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.19.0", - "@babel/types": "^7.19.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", - "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - } - }, - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } - } - }, - "@babel/helper-simple-access": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", - "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - }, - "dependencies": { - "@babel/types": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", - "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - }, - "dependencies": { - "@babel/types": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", - "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-string-parser": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", - "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", - "dev": true - }, - "@babel/helpers": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.19.0.tgz", - "integrity": "sha512-DRBCKGwIEdqY3+rPJgG/dKfQy9+08rHIAJx8q2p+HSWP87s2HCrQmaAMMyMll2kIXKCW0cO1RdQskx15Xakftg==", - "dev": true, - "requires": { - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.0", - "@babel/types": "^7.19.0" - }, - "dependencies": { - "@babel/generator": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.0.tgz", - "integrity": "sha512-S1ahxf1gZ2dpoiFgA+ohK9DIpz50bJ0CWs7Zlzb54Z4sG8qmdIrGrVqmy1sAtTVRb+9CU6U8VqT9L0Zj7hxHVg==", - "dev": true, - "requires": { - "@babel/types": "^7.19.0", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - } - }, - "@babel/parser": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.0.tgz", - "integrity": "sha512-74bEXKX2h+8rrfQUfsBfuZZHzsEs6Eql4pqy/T4Nn6Y9wNPggQOqD6z6pn5Bl8ZfysKouFZT/UXEH94ummEeQw==", - "dev": true - }, - "@babel/traverse": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.0.tgz", - "integrity": "sha512-4pKpFRDh+utd2mbRC8JLnlsMUii3PMHjpL6a0SZ4NMZy7YFP9aXORxEhdMVOc9CpWtDF09IkciQLEhK7Ml7gRA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.0", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.19.0", - "@babel/types": "^7.19.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", - "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - } - }, - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } - } - }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.8.tgz", - "integrity": "sha512-BoHhDJrJXqcg+ZL16Xv39H9n+AqJ4pcDrQBGZN+wHxIysrLZ3/ECwCBUch/1zUNhnsXULcONU3Ei5Hmkfk6kiQ==", - "dev": true - }, - "@babel/runtime": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", - "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", - "requires": { - "regenerator-runtime": "^0.13.11" - } - }, - "@babel/runtime-corejs3": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.19.0.tgz", - "integrity": "sha512-JyXXoCu1N8GLuKc2ii8y5RGma5FMpFeO2nAQIe0Yzrbq+rQnN+sFj47auLblR5ka6aHNGPDgv8G/iI2Grb0ldQ==", - "dev": true, - "requires": { - "core-js-pure": "^3.20.2", - "regenerator-runtime": "^0.13.4" - } - }, - "@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" - }, - "dependencies": { - "@babel/parser": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.0.tgz", - "integrity": "sha512-74bEXKX2h+8rrfQUfsBfuZZHzsEs6Eql4pqy/T4Nn6Y9wNPggQOqD6z6pn5Bl8ZfysKouFZT/UXEH94ummEeQw==", - "dev": true - }, - "@babel/types": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", - "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/traverse": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", - "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.3", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.3", - "@babel/types": "^7.17.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" - } - }, - "@ctrl/tinycolor": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.0.tgz", - "integrity": "sha512-/Z3l6pXthq0JvMYdUFyX9j0MaCltlIn6mfh9jLyQwg5aPKxkyNa0PTHtU1AlFXLNk55ZuAeJRcpvq+tmLfKmaQ==" - }, - "@emotion/hash": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", - "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" - }, - "@emotion/unitless": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", - "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" - }, - "@eslint/eslintrc": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.1.tgz", - "integrity": "sha512-OhSY22oQQdw3zgPOOwdoj01l/Dzl1Z+xyUP33tkSN+aqyEhymJCcPHyXt+ylW8FSe0TfRC2VG+ROQOapD0aZSQ==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.4.0", - "globals": "^13.15.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - } - } - }, - "@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" - }, - "@hapi/topo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", - "requires": { - "@hapi/hoek": "^9.0.0" - } - }, - "@humanwhocodes/config-array": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", - "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - } - }, - "@humanwhocodes/gitignore-to-minimatch": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", - "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", - "dev": true - }, - "@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.15", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", - "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@next/env": { - "version": "12.3.1", - "resolved": "https://registry.npmjs.org/@next/env/-/env-12.3.1.tgz", - "integrity": "sha512-9P9THmRFVKGKt9DYqeC2aKIxm8rlvkK38V1P1sRE7qyoPBIs8l9oo79QoSdPtOWfzkbDAVUqvbQGgTMsb8BtJg==" - }, - "@next/eslint-plugin-next": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-12.3.0.tgz", - "integrity": "sha512-jVdq1qYTNDjUtulnE8/hkPv0pHILV4jMg5La99iaY/FFm20WxVnsAZtbNnMvlPbf8dc010oO304SX9yXbg5PAw==", - "dev": true, - "requires": { - "glob": "7.1.7" - } - }, - "@next/swc-android-arm-eabi": { - "version": "12.3.1", - "resolved": "https://registry.npmjs.org/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-12.3.1.tgz", - "integrity": "sha512-i+BvKA8tB//srVPPQxIQN5lvfROcfv4OB23/L1nXznP+N/TyKL8lql3l7oo2LNhnH66zWhfoemg3Q4VJZSruzQ==", - "optional": true - }, - "@next/swc-android-arm64": { - "version": "12.3.1", - "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-12.3.1.tgz", - "integrity": "sha512-CmgU2ZNyBP0rkugOOqLnjl3+eRpXBzB/I2sjwcGZ7/Z6RcUJXK5Evz+N0ucOxqE4cZ3gkTeXtSzRrMK2mGYV8Q==", - "optional": true - }, - "@next/swc-darwin-arm64": { - "version": "12.3.1", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.3.1.tgz", - "integrity": "sha512-hT/EBGNcu0ITiuWDYU9ur57Oa4LybD5DOQp4f22T6zLfpoBMfBibPtR8XktXmOyFHrL/6FC2p9ojdLZhWhvBHg==", - "optional": true - }, - "@next/swc-darwin-x64": { - "version": "12.3.1", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-12.3.1.tgz", - "integrity": "sha512-9S6EVueCVCyGf2vuiLiGEHZCJcPAxglyckTZcEwLdJwozLqN0gtS0Eq0bQlGS3dH49Py/rQYpZ3KVWZ9BUf/WA==", - "optional": true - }, - "@next/swc-freebsd-x64": { - "version": "12.3.1", - "resolved": "https://registry.npmjs.org/@next/swc-freebsd-x64/-/swc-freebsd-x64-12.3.1.tgz", - "integrity": "sha512-qcuUQkaBZWqzM0F1N4AkAh88lLzzpfE6ImOcI1P6YeyJSsBmpBIV8o70zV+Wxpc26yV9vpzb+e5gCyxNjKJg5Q==", - "optional": true - }, - "@next/swc-linux-arm-gnueabihf": { - "version": "12.3.1", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.3.1.tgz", - "integrity": "sha512-diL9MSYrEI5nY2wc/h/DBewEDUzr/DqBjIgHJ3RUNtETAOB3spMNHvJk2XKUDjnQuluLmFMloet9tpEqU2TT9w==", - "optional": true - }, - "@next/swc-linux-arm64-gnu": { - "version": "12.3.1", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.3.1.tgz", - "integrity": "sha512-o/xB2nztoaC7jnXU3Q36vGgOolJpsGG8ETNjxM1VAPxRwM7FyGCPHOMk1XavG88QZSQf+1r+POBW0tLxQOJ9DQ==", - "optional": true - }, - "@next/swc-linux-arm64-musl": { - "version": "12.3.1", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.3.1.tgz", - "integrity": "sha512-2WEasRxJzgAmP43glFNhADpe8zB7kJofhEAVNbDJZANp+H4+wq+/cW1CdDi8DqjkShPEA6/ejJw+xnEyDID2jg==", - "optional": true - }, - "@next/swc-linux-x64-gnu": { - "version": "12.3.1", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.3.1.tgz", - "integrity": "sha512-JWEaMyvNrXuM3dyy9Pp5cFPuSSvG82+yABqsWugjWlvfmnlnx9HOQZY23bFq3cNghy5V/t0iPb6cffzRWylgsA==", - "optional": true - }, - "@next/swc-linux-x64-musl": { - "version": "12.3.1", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.3.1.tgz", - "integrity": "sha512-xoEWQQ71waWc4BZcOjmatuvPUXKTv6MbIFzpm4LFeCHsg2iwai0ILmNXf81rJR+L1Wb9ifEke2sQpZSPNz1Iyg==", - "optional": true - }, - "@next/swc-win32-arm64-msvc": { - "version": "12.3.1", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.3.1.tgz", - "integrity": "sha512-hswVFYQYIeGHE2JYaBVtvqmBQ1CppplQbZJS/JgrVI3x2CurNhEkmds/yqvDONfwfbttTtH4+q9Dzf/WVl3Opw==", - "optional": true - }, - "@next/swc-win32-ia32-msvc": { - "version": "12.3.1", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.3.1.tgz", - "integrity": "sha512-Kny5JBehkTbKPmqulr5i+iKntO5YMP+bVM8Hf8UAmjSMVo3wehyLVc9IZkNmcbxi+vwETnQvJaT5ynYBkJ9dWA==", - "optional": true - }, - "@next/swc-win32-x64-msvc": { - "version": "12.3.1", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.3.1.tgz", - "integrity": "sha512-W1ijvzzg+kPEX6LAc+50EYYSEo0FVu7dmTE+t+DM4iOLqgGHoW9uYSz9wCVdkXOEEMP9xhXfGpcSxsfDucyPkA==", - "optional": true - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@panva/asn1.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@panva/asn1.js/-/asn1.js-1.0.0.tgz", - "integrity": "sha512-UdkG3mLEqXgnlKsWanWcgb6dOjUzJ+XC5f+aWw30qrtjxeNUSfKX1cd5FBzOaXQumoe9nIqeZUvrRJS03HCCtw==" - }, - "@rc-component/context": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@rc-component/context/-/context-1.3.0.tgz", - "integrity": "sha512-6QdaCJ7Wn5UZLJs15IEfqy4Ru3OaL5ctqpQYWd5rlfV9wwzrzdt6+kgAQZV/qdB0MUPN4nhyBfRembQCIvBf+w==", - "requires": { - "@babel/runtime": "^7.10.1", - "rc-util": "^5.27.0" - } - }, - "@rc-component/mini-decimal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rc-component/mini-decimal/-/mini-decimal-1.0.1.tgz", - "integrity": "sha512-9N8nRk0oKj1qJzANKl+n9eNSMUGsZtjwNuDCiZ/KA+dt1fE3zq5x2XxclRcAbOIXnZcJ53ozP2Pa60gyELXagA==", - "requires": { - "@babel/runtime": "^7.18.0" - } - }, - "@rc-component/mutate-observer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@rc-component/mutate-observer/-/mutate-observer-1.0.0.tgz", - "integrity": "sha512-okqRJSfNisXdI6CUeOLZC5ukBW/8kir2Ii4PJiKpUt+3+uS7dxwJUMxsUZquxA1rQuL8YcEmKVp/TCnR+yUdZA==", - "requires": { - "@babel/runtime": "^7.18.0", - "classnames": "^2.3.2", - "rc-util": "^5.24.4" - } - }, - "@rc-component/portal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rc-component/portal/-/portal-1.1.0.tgz", - "integrity": "sha512-tbXM9SB1r5FOuZjRCljERFByFiEUcMmCWMXLog/NmgCzlAzreXyf23Vei3ZpSMxSMavzPnhCovfZjZdmxS3d1w==", - "requires": { - "@babel/runtime": "^7.18.0", - "classnames": "^2.3.2", - "rc-util": "^5.24.4" - } - }, - "@rc-component/tour": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@rc-component/tour/-/tour-1.6.0.tgz", - "integrity": "sha512-b/s7LCb7bW4wxpWfZyNpl7khHUzSyObSlsLaIScRGd+W/v1wFVk8F7gRytl/z8ik9ZSXbLWx9EvexIuHoO/RcQ==", - "requires": { - "@babel/runtime": "^7.18.0", - "@rc-component/portal": "^1.0.0-9", - "classnames": "^2.3.2", - "rc-trigger": "^5.3.4", - "rc-util": "^5.24.4" - } - }, - "@rushstack/eslint-patch": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.1.4.tgz", - "integrity": "sha512-LwzQKA4vzIct1zNZzBmRKI9QuNpLgTQMEjsQLf3BXuGYb3QPTP4Yjf6mkdX+X1mYttZ808QpOwAzZjv28kq7DA==", - "dev": true - }, - "@sideway/address": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", - "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", - "requires": { - "@hapi/hoek": "^9.0.0" - } - }, - "@sideway/formula": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz", - "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==" - }, - "@sideway/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" - }, - "@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==" - }, - "@stylelint/postcss-css-in-js": { - "version": "0.37.3", - "resolved": "https://registry.npmjs.org/@stylelint/postcss-css-in-js/-/postcss-css-in-js-0.37.3.tgz", - "integrity": "sha512-scLk3cSH1H9KggSniseb2KNAU5D9FWc3H7BxCSAIdtU9OWIyw0zkEZ9qEKHryRM+SExYXRKNb7tOOVNAsQ3iwg==", - "dev": true, - "requires": { - "@babel/core": "^7.17.9" - }, - "dependencies": { - "@babel/core": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.0.tgz", - "integrity": "sha512-reM4+U7B9ss148rh2n1Qs9ASS+w94irYXga7c2jaQv9RVzpS7Mv1a9rnYYwuDa45G+DkORt9g6An2k/V4d9LbQ==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.0", - "@babel/helper-compilation-targets": "^7.19.0", - "@babel/helper-module-transforms": "^7.19.0", - "@babel/helpers": "^7.19.0", - "@babel/parser": "^7.19.0", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.0", - "@babel/types": "^7.19.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" - } - }, - "@babel/generator": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.0.tgz", - "integrity": "sha512-S1ahxf1gZ2dpoiFgA+ohK9DIpz50bJ0CWs7Zlzb54Z4sG8qmdIrGrVqmy1sAtTVRb+9CU6U8VqT9L0Zj7hxHVg==", - "dev": true, - "requires": { - "@babel/types": "^7.19.0", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - } - }, - "@babel/parser": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.0.tgz", - "integrity": "sha512-74bEXKX2h+8rrfQUfsBfuZZHzsEs6Eql4pqy/T4Nn6Y9wNPggQOqD6z6pn5Bl8ZfysKouFZT/UXEH94ummEeQw==", - "dev": true - }, - "@babel/traverse": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.0.tgz", - "integrity": "sha512-4pKpFRDh+utd2mbRC8JLnlsMUii3PMHjpL6a0SZ4NMZy7YFP9aXORxEhdMVOc9CpWtDF09IkciQLEhK7Ml7gRA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.0", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.19.0", - "@babel/types": "^7.19.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", - "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - } - }, - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } - } - }, - "@stylelint/postcss-markdown": { - "version": "0.36.2", - "resolved": "https://registry.npmjs.org/@stylelint/postcss-markdown/-/postcss-markdown-0.36.2.tgz", - "integrity": "sha512-2kGbqUVJUGE8dM+bMzXG/PYUWKkjLIkRLWNh39OaADkiabDRdw8ATFCgbMz5xdIcvwspPAluSL7uY+ZiTWdWmQ==", - "dev": true, - "requires": { - "remark": "^13.0.0", - "unist-util-find-all-after": "^3.0.2" - } - }, - "@swc/helpers": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.11.tgz", - "integrity": "sha512-rEUrBSGIoSFuYxwBYtlUFMlE2CwGhmW+w9355/5oduSw8e5h2+Tj4UrAGNNgP9915++wj5vkQo0UuOBqOAq4nw==", - "requires": { - "tslib": "^2.4.0" - } - }, - "@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", - "requires": { - "defer-to-connect": "^2.0.0" - } - }, - "@tanstack/query-core": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-4.8.0.tgz", - "integrity": "sha512-PVcSqAWboFA86eNgtHTOjfHjBkNuFGAM6kPH82p1ibx1R76f7EjedZ+LZi4ZnW4ppoSl/+hUtCgWsiNQ2ViLTw==" - }, - "@tanstack/react-query": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-4.8.0.tgz", - "integrity": "sha512-e3QzL/S8XeA5MYqOUUABet4oZDBc1MbeUIo32r0cxEDoDJS+9oqx0az9AbBxacZ7SjM/Fy4u/eXQFBjsKGFQ6A==", - "requires": { - "@tanstack/query-core": "4.8.0", - "use-sync-external-store": "^1.2.0" - } - }, - "@trivago/prettier-plugin-sort-imports": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@trivago/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-3.3.0.tgz", - "integrity": "sha512-1y44bVZuIN0RsS3oIiGd5k8Vm3IZXYZnp4VsP2Z/S5L9WAOw43HE2clso66M2S/dDeJ+8sKPqnHsEfh39Vjs3w==", - "dev": true, - "requires": { - "@babel/core": "7.17.8", - "@babel/generator": "7.17.7", - "@babel/parser": "7.17.8", - "@babel/traverse": "7.17.3", - "@babel/types": "7.17.0", - "javascript-natural-sort": "0.7.1", - "lodash": "4.17.21" - } - }, - "@types/antd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/antd/-/antd-1.0.0.tgz", - "integrity": "sha512-wnRh+S6vPMahsuSN6lFJQzNXuhUKr9JKic1L/NMdIChsuu9Fc+mDyF7H17eFPQlgpLVdT0DyYIgB1di8DA9AuQ==", - "dev": true, - "requires": { - "antd": "*" - } - }, - "@types/cacheable-request": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", - "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==", - "requires": { - "@types/http-cache-semantics": "*", - "@types/keyv": "*", - "@types/node": "*", - "@types/responselike": "*" - } - }, - "@types/http-cache-semantics": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" - }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, - "@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "requires": { - "@types/node": "*" - } - }, - "@types/luxon": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.0.1.tgz", - "integrity": "sha512-/LAvk1cMOJt0ghzMFrZEvByUhsiEfeeT2IF53Le+Ki3A538yEL9pRZ7a6MuCxdrYK+YNqNIDmrKU/r2nnw04zQ==", - "dev": true - }, - "@types/mdast": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz", - "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==", - "dev": true, - "requires": { - "@types/unist": "*" - } - }, - "@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", - "dev": true - }, - "@types/mongoose": { - "version": "5.11.97", - "resolved": "https://registry.npmjs.org/@types/mongoose/-/mongoose-5.11.97.tgz", - "integrity": "sha512-cqwOVYT3qXyLiGw7ueU2kX9noE8DPGRY6z8eUxudhXY8NZ7DMKYAxyZkLSevGfhCX3dO/AoX5/SO9lAzfjon0Q==", - "dev": true, - "requires": { - "mongoose": "*" - } - }, - "@types/node": { - "version": "18.7.16", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.16.tgz", - "integrity": "sha512-EQHhixfu+mkqHMZl1R2Ovuvn47PUw18azMJOTwSZr9/fhzHNGXAJ0ma0dayRVchprpCj0Kc1K1xKoWaATWF1qg==" - }, - "@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", - "dev": true - }, - "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true - }, - "@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", - "dev": true - }, - "@types/react": { - "version": "17.0.49", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.49.tgz", - "integrity": "sha512-CCBPMZaPhcKkYUTqFs/hOWqKjPxhTEmnZWjlHHgIMop67DsXywf9B5Os9Hz8KSacjNOgIdnZVJamwl232uxoPg==", - "dev": true, - "requires": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "@types/react-dom": { - "version": "18.0.6", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.6.tgz", - "integrity": "sha512-/5OFZgfIPSwy+YuIBP/FgJnQnsxhZhjjrnxudMddeblOouIodEQ75X14Rr4wGSG/bknL+Omy9iWlLo1u/9GzAA==", - "dev": true, - "requires": { - "@types/react": "*" - } - }, - "@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", - "requires": { - "@types/node": "*" - } - }, - "@types/scheduler": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", - "dev": true - }, - "@types/unist": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", - "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==", - "dev": true - }, - "@types/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog==" - }, - "@types/whatwg-url": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz", - "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==", - "requires": { - "@types/node": "*", - "@types/webidl-conversions": "*" - } - }, - "@typescript-eslint/parser": { - "version": "5.36.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.36.2.tgz", - "integrity": "sha512-qS/Kb0yzy8sR0idFspI9Z6+t7mqk/oRjnAYfewG+VN73opAUvmYL3oPIMmgOX6CnQS6gmVIXGshlb5RY/R22pA==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.36.2", - "@typescript-eslint/types": "5.36.2", - "@typescript-eslint/typescript-estree": "5.36.2", - "debug": "^4.3.4" - } - }, - "@typescript-eslint/scope-manager": { - "version": "5.36.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.36.2.tgz", - "integrity": "sha512-cNNP51L8SkIFSfce8B1NSUBTJTu2Ts4nWeWbFrdaqjmn9yKrAaJUBHkyTZc0cL06OFHpb+JZq5AUHROS398Orw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.36.2", - "@typescript-eslint/visitor-keys": "5.36.2" - } - }, - "@typescript-eslint/types": { - "version": "5.36.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.36.2.tgz", - "integrity": "sha512-9OJSvvwuF1L5eS2EQgFUbECb99F0mwq501w0H0EkYULkhFa19Qq7WFbycdw1PexAc929asupbZcgjVIe6OK/XQ==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.36.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.36.2.tgz", - "integrity": "sha512-8fyH+RfbKc0mTspfuEjlfqA4YywcwQK2Amcf6TDOwaRLg7Vwdu4bZzyvBZp4bjt1RRjQ5MDnOZahxMrt2l5v9w==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.36.2", - "@typescript-eslint/visitor-keys": "5.36.2", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "dependencies": { - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.36.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.36.2.tgz", - "integrity": "sha512-BtRvSR6dEdrNt7Net2/XDjbYKU5Ml6GqJgVfXT0CxTCJlnIqK7rAGreuWKMT2t8cFUT2Msv5oxw0GMRD7T5J7A==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.36.2", - "eslint-visitor-keys": "^3.3.0" - } - }, - "acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "animate.css": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/animate.css/-/animate.css-4.1.1.tgz", - "integrity": "sha512-+mRmCTv6SbCmtYJCN4faJMNFVNN5EuCTTprDTAo7YzIGji2KADmakjVA3+8mVDkZ2Bf09vayB35lSQIex2+QaQ==" - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "antd": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/antd/-/antd-5.2.2.tgz", - "integrity": "sha512-IHuMyGvgI+pPmoZNJFfhVykb0eW6+iO/39/9qPE0ub9gKAnI4vaK+hA5li6aX+mjM/EqgckdWgLpaIP98kGrvw==", - "requires": { - "@ant-design/colors": "^7.0.0", - "@ant-design/cssinjs": "^1.5.6", - "@ant-design/icons": "^5.0.0", - "@ant-design/react-slick": "~1.0.0", - "@babel/runtime": "^7.18.3", - "@ctrl/tinycolor": "^3.6.0", - "@rc-component/mutate-observer": "^1.0.0", - "@rc-component/tour": "~1.6.0", - "classnames": "^2.2.6", - "copy-to-clipboard": "^3.2.0", - "dayjs": "^1.11.1", - "qrcode.react": "^3.1.0", - "rc-cascader": "~3.8.0", - "rc-checkbox": "~2.3.0", - "rc-collapse": "~3.5.2", - "rc-dialog": "~9.0.2", - "rc-drawer": "~6.1.1", - "rc-dropdown": "~4.0.0", - "rc-field-form": "~1.27.0", - "rc-image": "~5.13.0", - "rc-input": "~0.2.1", - "rc-input-number": "~7.4.0", - "rc-mentions": "~2.0.0", - "rc-menu": "~9.8.2", - "rc-motion": "^2.6.1", - "rc-notification": "~5.0.0", - "rc-pagination": "~3.2.0", - "rc-picker": "~3.1.1", - "rc-progress": "~3.4.1", - "rc-rate": "~2.9.0", - "rc-resize-observer": "^1.2.0", - "rc-segmented": "~2.1.2", - "rc-select": "~14.2.0", - "rc-slider": "~10.1.0", - "rc-steps": "~6.0.0", - "rc-switch": "~4.0.0", - "rc-table": "~7.30.2", - "rc-tabs": "~12.5.6", - "rc-textarea": "~1.0.0", - "rc-tooltip": "~5.3.1", - "rc-tree": "~5.7.0", - "rc-tree-select": "~5.6.0", - "rc-trigger": "^5.3.4", - "rc-upload": "~4.3.0", - "rc-util": "^5.27.0", - "scroll-into-view-if-needed": "^3.0.3", - "throttle-debounce": "^5.0.0" - }, - "dependencies": { - "@ant-design/colors": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-7.0.0.tgz", - "integrity": "sha512-iVm/9PfGCbC0dSMBrz7oiEXZaaGH7ceU40OJEfKmyuzR9R5CRimJYPlRiFtMQGQcbNMea/ePcoIebi4ASGYXtg==", - "requires": { - "@ctrl/tinycolor": "^3.4.0" - } - }, - "@ant-design/icons": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-5.0.1.tgz", - "integrity": "sha512-ZyF4ksXCcdtwA/1PLlnFLcF/q8/MhwxXhKHh4oCHDA4Ip+ZzAHoICtyp4wZWfiCVDP0yuz3HsjyvuldHFb3wjA==", - "requires": { - "@ant-design/colors": "^7.0.0", - "@ant-design/icons-svg": "^4.2.1", - "@babel/runtime": "^7.11.2", - "classnames": "^2.2.6", - "rc-util": "^5.9.4" - } - } - } - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "aria-query": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", - "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", - "dev": true, - "requires": { - "@babel/runtime": "^7.10.2", - "@babel/runtime-corejs3": "^7.10.2" - } - }, - "array-includes": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", - "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5", - "get-intrinsic": "^1.1.1", - "is-string": "^1.0.7" - } - }, - "array-move": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/array-move/-/array-move-4.0.0.tgz", - "integrity": "sha512-+RY54S8OuVvg94THpneQvFRmqWdAHeqtMzgMW6JNurHxe8rsS07cHQdfGkXnTUXiBcyZ0j3SiDIxxj0RPiqCkQ==" - }, - "array-tree-filter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-tree-filter/-/array-tree-filter-2.1.0.tgz", - "integrity": "sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==" - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "array.prototype.flat": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz", - "integrity": "sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", - "es-shim-unscopables": "^1.0.0" - } - }, - "array.prototype.flatmap": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz", - "integrity": "sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", - "es-shim-unscopables": "^1.0.0" - } - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "dev": true - }, - "ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", - "dev": true - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, - "async-validator": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", - "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==" - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "autoprefixer": { - "version": "9.8.8", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.8.tgz", - "integrity": "sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==", - "dev": true, - "requires": { - "browserslist": "^4.12.0", - "caniuse-lite": "^1.0.30001109", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "picocolors": "^0.2.1", - "postcss": "^7.0.32", - "postcss-value-parser": "^4.1.0" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "axe-core": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.3.tgz", - "integrity": "sha512-32+ub6kkdhhWick/UjvEwRchgoetXqTK14INLqbGm5U2TzBkBNF3nQtLYm8ovxSkQWArjEQvftCKryjZaATu3w==", - "dev": true - }, - "axios": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", - "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", - "requires": { - "follow-redirects": "^1.14.9", - "form-data": "^4.0.0" - } - }, - "axobject-query": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", - "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", - "dev": true - }, - "bail": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", - "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==", - "dev": true - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - }, - "base64url": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", - "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==" - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browserslist": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", - "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001370", - "electron-to-chromium": "^1.4.202", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.5" - } - }, - "bson": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.0.tgz", - "integrity": "sha512-VrlEE4vuiO1WTpfof4VmaVolCVYkYTgB9iWgYNOrVlnifpME/06fhFRmONgBhClD5pFC1t9ZWqFUQEQAzY43bA==", - "requires": { - "buffer": "^5.6.0" - } - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==" - }, - "cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - }, - "dependencies": { - "quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true - } - } - }, - "caniuse-lite": { - "version": "1.0.30001414", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001414.tgz", - "integrity": "sha512-t55jfSaWjCdocnFdKQoO+d2ct9C59UZg4dY3OnUlSZ447r8pUtIKdp0hpAzrGFultmTC+Us+KpKi4GZl/LXlFg==" - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "character-entities": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", - "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", - "dev": true - }, - "character-entities-legacy": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", - "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", - "dev": true - }, - "character-reference-invalid": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", - "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", - "dev": true - }, - "classnames": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", - "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" - }, - "clone-regexp": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-2.2.0.tgz", - "integrity": "sha512-beMpP7BOtTipFuW8hrJvREQ2DrRu3BE7by0ZpibtfBA+qfHYvMGTc2Yb1JMYPKg/JUw0CHYvpg796aNTSW9z7Q==", - "dev": true, - "requires": { - "is-regexp": "^2.0.0" - } - }, - "clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "requires": { - "mimic-response": "^1.0.0" - } - }, - "clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==" - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "compute-scroll-into-view": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.0.0.tgz", - "integrity": "sha512-Yk1An4qzo5++Cu6peT9PsmRKIU8tALpmdoE09n//AfGQFcPfx21/tMGMsmKYmLJWaBJrGOJ5Jz5hoU+7cZZUWQ==" - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" - }, - "copy-to-clipboard": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.2.tgz", - "integrity": "sha512-Vme1Z6RUDzrb6xAI7EZlVZ5uvOk2F//GaxKUxajDqm9LhOVM1inxNAD2vy+UZDYsd0uyA9s7b3/FVZPSxqrCfg==", - "requires": { - "toggle-selection": "^1.0.6" - } - }, - "core-js-pure": { - "version": "3.25.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.25.1.tgz", - "integrity": "sha512-7Fr74bliUDdeJCBMxkkIuQ4xfxn/SwrVg+HkJUAoNEXVqYLv55l6Af0dJ5Lq2YBUW9yKqSkLXaS5SYPK6MGa/A==", - "dev": true - }, - "cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "dependencies": { - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - } - } - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - }, - "csstype": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", - "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==" - }, - "damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", - "dev": true - }, - "dayjs": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.5.tgz", - "integrity": "sha512-CAdX5Q3YW3Gclyo5Vpqkgpj8fSdLQcRuzfX6mC6Phy0nfJ0eGYOeS7m4mt2plDWLAtA4TqTakvbboHvUxfe4iA==" - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true - }, - "decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg==", - "dev": true, - "requires": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", - "dev": true - } - } - }, - "decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "requires": { - "mimic-response": "^3.1.0" - }, - "dependencies": { - "mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==" - } - } - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==" - }, - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" - }, - "denque": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", - "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==" - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==" - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dom-align": { - "version": "1.12.4", - "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.12.4.tgz", - "integrity": "sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==" - }, - "dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - }, - "dependencies": { - "domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true - }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true - } - } - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true - }, - "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "dev": true, - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "electron-to-chromium": { - "version": "1.4.247", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.247.tgz", - "integrity": "sha512-FLs6R4FQE+1JHM0hh3sfdxnYjKvJpHZyhQDjc2qFq/xFvmmRt/TATNToZhrcGUFzpF2XjeiuozrA8lI0PZmYYw==", - "dev": true - }, - "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "requires": { - "once": "^1.4.0" - } - }, - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", - "dev": true - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.2.tgz", - "integrity": "sha512-XxXQuVNrySBNlEkTYJoDNFe5+s2yIOpzq80sUHEdPdQr0S5nTLz4ZPPPswNIpKseDDUS5yghX1gfLIHQZ1iNuQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.2", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" - } - }, - "es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "eslint": { - "version": "8.23.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.23.0.tgz", - "integrity": "sha512-pBG/XOn0MsJcKcTRLr27S5HpzQo4kLr+HjLQIyK4EiCsijDl/TB+h5uEuJU6bQ8Edvwz1XWOjpaP2qgnXGpTcA==", - "dev": true, - "requires": { - "@eslint/eslintrc": "^1.3.1", - "@humanwhocodes/config-array": "^0.10.4", - "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", - "@humanwhocodes/module-importer": "^1.0.1", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.15.0", - "globby": "^11.1.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - } - } - }, - "eslint-config-next": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-12.3.0.tgz", - "integrity": "sha512-guHSkNyKnTBB8HU35COgAMeMV0E026BiYRYvyEVVaTOeFcnU3i1EI8/Da0Rl7H3Sgua5FEvoA0vYd2s8kdIUXg==", - "dev": true, - "requires": { - "@next/eslint-plugin-next": "12.3.0", - "@rushstack/eslint-patch": "^1.1.3", - "@typescript-eslint/parser": "^5.21.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-import-resolver-typescript": "^2.7.1", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.29.4", - "eslint-plugin-react-hooks": "^4.5.0" - } - }, - "eslint-config-prettier": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", - "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", - "dev": true, - "requires": {} - }, - "eslint-import-resolver-node": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", - "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", - "dev": true, - "requires": { - "debug": "^3.2.7", - "resolve": "^1.20.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-import-resolver-typescript": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-2.7.1.tgz", - "integrity": "sha512-00UbgGwV8bSgUv34igBDbTOtKhqoRMy9bFjNehT40bXg6585PNIct8HhXZ0SybqB9rWtXj9crcku8ndDn/gIqQ==", - "dev": true, - "requires": { - "debug": "^4.3.4", - "glob": "^7.2.0", - "is-glob": "^4.0.3", - "resolve": "^1.22.0", - "tsconfig-paths": "^3.14.1" - }, - "dependencies": { - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, - "eslint-module-utils": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", - "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", - "dev": true, - "requires": { - "debug": "^3.2.7" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-plugin-import": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", - "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", - "dev": true, - "requires": { - "array-includes": "^3.1.4", - "array.prototype.flat": "^1.2.5", - "debug": "^2.6.9", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.3", - "has": "^1.0.3", - "is-core-module": "^2.8.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.values": "^1.1.5", - "resolve": "^1.22.0", - "tsconfig-paths": "^3.14.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "eslint-plugin-jsx-a11y": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.1.tgz", - "integrity": "sha512-sXgFVNHiWffBq23uiS/JaP6eVR622DqwB4yTzKvGZGcPq6/yZ3WmOZfuBks/vHWo9GaFOqC2ZK4i6+C35knx7Q==", - "dev": true, - "requires": { - "@babel/runtime": "^7.18.9", - "aria-query": "^4.2.2", - "array-includes": "^3.1.5", - "ast-types-flow": "^0.0.7", - "axe-core": "^4.4.3", - "axobject-query": "^2.2.0", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "has": "^1.0.3", - "jsx-ast-utils": "^3.3.2", - "language-tags": "^1.0.5", - "minimatch": "^3.1.2", - "semver": "^6.3.0" - } - }, - "eslint-plugin-react": { - "version": "7.31.8", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.8.tgz", - "integrity": "sha512-5lBTZmgQmARLLSYiwI71tiGVTLUuqXantZM6vlSY39OaDSV0M7+32K5DnLkmFrwTe+Ksz0ffuLUC91RUviVZfw==", - "dev": true, - "requires": { - "array-includes": "^3.1.5", - "array.prototype.flatmap": "^1.3.0", - "doctrine": "^2.1.0", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.5", - "object.fromentries": "^2.0.5", - "object.hasown": "^1.1.1", - "object.values": "^1.1.5", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.3", - "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.7" - }, - "dependencies": { - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "resolve": { - "version": "2.0.0-next.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", - "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", - "dev": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - } - } - }, - "eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", - "dev": true, - "requires": {} - }, - "eslint-plugin-unused-imports": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-2.0.0.tgz", - "integrity": "sha512-3APeS/tQlTrFa167ThtP0Zm0vctjr4M44HMpeg1P4bK6wItarumq0Ma82xorMKdFsWpphQBlRPzw/pxiVELX1A==", - "dev": true, - "requires": { - "eslint-rule-composer": "^0.3.0" - } - }, - "eslint-rule-composer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", - "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==", - "dev": true - }, - "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - } - } - }, - "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true - }, - "espree": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", - "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", - "dev": true, - "requires": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" - } - }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "execall": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/execall/-/execall-2.0.0.tgz", - "integrity": "sha512-0FU2hZ5Hh6iQnarpRtQurM/aAvp3RIbfvgLHrcqJYzhXyV2KFruhuChf9NC6waAhiUR7FFtlugkI4p7f2Fqlow==", - "dev": true, - "requires": { - "clone-regexp": "^2.1.0" - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "dev": true - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "follow-redirects": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", - "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==" - }, - "form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - } - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, - "functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true - }, - "futoin-hkdf": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/futoin-hkdf/-/futoin-hkdf-1.5.1.tgz", - "integrity": "sha512-g5d0Qp7ks55hYmYmfqn4Nz18XH49lcCR+vvIvHT92xXnsJaGZmY1EtWQWilJ6BQp57heCIXM/rRo+AFep8hGgg==" - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true - }, - "get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "get-stdin": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", - "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", - "dev": true - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "requires": { - "pump": "^3.0.0" - } - }, - "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dev": true, - "requires": { - "global-prefix": "^3.0.0" - } - }, - "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dev": true, - "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "dependencies": { - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "globjoin": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", - "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==", - "dev": true - }, - "gonzales-pe": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-4.3.0.tgz", - "integrity": "sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "got": { - "version": "11.8.5", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", - "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", - "requires": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - } - }, - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.1" - } - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "html-tags": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz", - "integrity": "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==", - "dev": true - }, - "htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "dev": true, - "requires": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - } - }, - "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" - }, - "http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - } - }, - "http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "requires": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - } - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "import-lazy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - } - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "requires": { - "loose-envify": "^1.0.0" - } - }, - "ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" - }, - "is-alphabetical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", - "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", - "dev": true - }, - "is-alphanumerical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", - "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", - "dev": true, - "requires": { - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "requires": { - "has-bigints": "^1.0.1" - } - }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "dev": true - }, - "is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", - "dev": true - }, - "is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-decimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", - "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-hexadecimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", - "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", - "dev": true - }, - "is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "dev": true - }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-regexp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-2.1.0.tgz", - "integrity": "sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA==", - "dev": true - }, - "is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, - "is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true - }, - "is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "javascript-natural-sort": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz", - "integrity": "sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==", - "dev": true - }, - "joi": { - "version": "17.6.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.6.0.tgz", - "integrity": "sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw==", - "requires": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.3", - "@sideway/formula": "^3.0.0", - "@sideway/pinpoint": "^2.0.0" - } - }, - "jose": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/jose/-/jose-2.0.6.tgz", - "integrity": "sha512-FVoPY7SflDodE4lknJmbAHSUjLCzE2H1F6MS0RYKMQ8SR+lNccpMf8R4eqkNYyyUjR5qZReOzZo5C5YiHOCjjg==", - "requires": { - "@panva/asn1.js": "^1.0.0" - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "json2mq": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz", - "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==", - "requires": { - "string-convert": "^0.2.0" - } - }, - "json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", - "dev": true - }, - "jsx-ast-utils": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", - "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", - "dev": true, - "requires": { - "array-includes": "^3.1.5", - "object.assign": "^4.1.3" - } - }, - "kareem": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.4.1.tgz", - "integrity": "sha512-aJ9opVoXroQUPfovYP5kaj2lM7Jn02Gw13bL0lg9v0V7SaUc0qavPs0Eue7d2DcC3NjqI6QAUElXNsuZSeM+EA==" - }, - "keyv": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.0.tgz", - "integrity": "sha512-2YvuMsA+jnFGtBareKqgANOEKe1mk3HKiXu2fRmAfyxG0MJAywNhi5ttWA3PMjl4NmpyjZNbFifR2vNjW1znfA==", - "requires": { - "json-buffer": "3.0.1" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "known-css-properties": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.21.0.tgz", - "integrity": "sha512-sZLUnTqimCkvkgRS+kbPlYW5o8q5w1cu+uIisKpEWkj31I8mx8kNG162DwRav8Zirkva6N5uoFsm9kzK4mUXjw==", - "dev": true - }, - "language-subtag-registry": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", - "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", - "dev": true - }, - "language-tags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", - "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", - "dev": true, - "requires": { - "language-subtag-registry": "~0.3.2" - } - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==" - }, - "lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" - }, - "lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true - }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "longest-streak": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz", - "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==", - "dev": true - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" - }, - "map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true - }, - "mathml-tag-names": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", - "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", - "dev": true - }, - "mdast-util-from-markdown": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz", - "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==", - "dev": true, - "requires": { - "@types/mdast": "^3.0.0", - "mdast-util-to-string": "^2.0.0", - "micromark": "~2.11.0", - "parse-entities": "^2.0.0", - "unist-util-stringify-position": "^2.0.0" - } - }, - "mdast-util-to-markdown": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz", - "integrity": "sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "longest-streak": "^2.0.0", - "mdast-util-to-string": "^2.0.0", - "parse-entities": "^2.0.0", - "repeat-string": "^1.0.0", - "zwitch": "^1.0.0" - } - }, - "mdast-util-to-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", - "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==", - "dev": true - }, - "memory-pager": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", - "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", - "optional": true - }, - "memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", - "dev": true - }, - "meow": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", - "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", - "dev": true, - "requires": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize": "^1.2.0", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "dependencies": { - "hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "requires": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - } - }, - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromark": { - "version": "2.11.4", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz", - "integrity": "sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==", - "dev": true, - "requires": { - "debug": "^4.0.0", - "parse-entities": "^2.0.0" - } - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" - }, - "min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, - "minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - } - }, - "mongodb": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.9.1.tgz", - "integrity": "sha512-ZhgI/qBf84fD7sI4waZBoLBNJYPQN5IOC++SBCiPiyhzpNKOxN/fi0tBHvH2dEC42HXtNEbFB0zmNz4+oVtorQ==", - "requires": { - "bson": "^4.7.0", - "denque": "^2.1.0", - "mongodb-connection-string-url": "^2.5.3", - "saslprep": "^1.0.3", - "socks": "^2.7.0" - } - }, - "mongodb-connection-string-url": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.5.3.tgz", - "integrity": "sha512-f+/WsED+xF4B74l3k9V/XkTVj5/fxFH2o5ToKXd8Iyi5UhM+sO9u0Ape17Mvl/GkZaFtM0HQnzAG5OTmhKw+tQ==", - "requires": { - "@types/whatwg-url": "^8.2.1", - "whatwg-url": "^11.0.0" - } - }, - "mongoose": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.6.3.tgz", - "integrity": "sha512-2Ye018PNBBXJd717qhfjBGo7k8HQb/pKziO9d5wY14iZSUI7hxqL7bwNDg+poeBwnlhBYLncZkips15Blfgxbw==", - "requires": { - "bson": "^4.6.5", - "kareem": "2.4.1", - "mongodb": "4.9.1", - "mpath": "0.9.0", - "mquery": "4.0.3", - "ms": "2.1.3", - "sift": "16.0.0" - }, - "dependencies": { - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - } - } - }, - "mpath": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", - "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==" - }, - "mquery": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/mquery/-/mquery-4.0.3.tgz", - "integrity": "sha512-J5heI+P08I6VJ2Ky3+33IpCdAvlYGTSUjwTPxkAr8i8EoduPMBX2OY/wa3IKZIQl7MU4SbFk8ndgSKyB/cl1zA==", - "requires": { - "debug": "4.x" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "nanoid": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-4.0.0.tgz", - "integrity": "sha512-IgBP8piMxe/gf73RTQx7hmnhwz0aaEXYakvqZyE302IXW3HyVNhdNGC+O2MwMAVhLEnvXlvKtGbtJf6wvHihCg==" - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "next": { - "version": "12.3.1", - "resolved": "https://registry.npmjs.org/next/-/next-12.3.1.tgz", - "integrity": "sha512-l7bvmSeIwX5lp07WtIiP9u2ytZMv7jIeB8iacR28PuUEFG5j0HGAPnMqyG5kbZNBG2H7tRsrQ4HCjuMOPnANZw==", - "requires": { - "@next/env": "12.3.1", - "@next/swc-android-arm-eabi": "12.3.1", - "@next/swc-android-arm64": "12.3.1", - "@next/swc-darwin-arm64": "12.3.1", - "@next/swc-darwin-x64": "12.3.1", - "@next/swc-freebsd-x64": "12.3.1", - "@next/swc-linux-arm-gnueabihf": "12.3.1", - "@next/swc-linux-arm64-gnu": "12.3.1", - "@next/swc-linux-arm64-musl": "12.3.1", - "@next/swc-linux-x64-gnu": "12.3.1", - "@next/swc-linux-x64-musl": "12.3.1", - "@next/swc-win32-arm64-msvc": "12.3.1", - "@next/swc-win32-ia32-msvc": "12.3.1", - "@next/swc-win32-x64-msvc": "12.3.1", - "@swc/helpers": "0.4.11", - "caniuse-lite": "^1.0.30001406", - "postcss": "8.4.14", - "styled-jsx": "5.0.7", - "use-sync-external-store": "1.2.0" - } - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", - "dev": true - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true - }, - "normalize-selector": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/normalize-selector/-/normalize-selector-0.2.0.tgz", - "integrity": "sha512-dxvWdI8gw6eAvk9BlPffgEoGfM7AdijoCwOEJge3e3ulT2XLgmU7KvvxprOaCu05Q1uGRHmOhHe1r6emZoKyFw==", - "dev": true - }, - "normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==" - }, - "npm-run-all": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", - "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "chalk": "^2.4.1", - "cross-spawn": "^6.0.5", - "memorystream": "^0.3.1", - "minimatch": "^3.0.4", - "pidtree": "^0.3.0", - "read-pkg": "^3.0.0", - "shell-quote": "^1.6.1", - "string.prototype.padend": "^3.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" - }, - "object-hash": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", - "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==" - }, - "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - } - }, - "object.entries": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", - "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - } - }, - "object.fromentries": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz", - "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - } - }, - "object.hasown": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.1.tgz", - "integrity": "sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==", - "dev": true, - "requires": { - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - } - }, - "object.values": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", - "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - } - }, - "oidc-token-hash": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.0.1.tgz", - "integrity": "sha512-EvoOtz6FIEBzE+9q253HsLCVRiK/0doEJ2HCvvqMQb3dHZrP3WlJKYtJ55CRTw4jmYomzH4wkPuCj/I3ZvpKxQ==" - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "requires": { - "wrappy": "1" - } - }, - "openid-client": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-4.9.1.tgz", - "integrity": "sha512-DYUF07AHjI3QDKqKbn2F7RqozT4hyi4JvmpodLrq0HHoNP7t/AjeG/uqiBK1/N2PZSAQEThVjDLHSmJN4iqu/w==", - "requires": { - "aggregate-error": "^3.1.0", - "got": "^11.8.0", - "jose": "^2.0.5", - "lru-cache": "^6.0.0", - "make-error": "^1.3.6", - "object-hash": "^2.0.1", - "oidc-token-hash": "^5.0.1" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==" - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", - "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", - "dev": true, - "requires": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pidtree": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", - "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", - "dev": true - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true - }, - "postcss": { - "version": "8.4.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", - "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", - "requires": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "dependencies": { - "nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==" - } - } - }, - "postcss-html": { - "version": "0.36.0", - "resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-0.36.0.tgz", - "integrity": "sha512-HeiOxGcuwID0AFsNAL0ox3mW6MHH5cstWN1Z3Y+n6H+g12ih7LHdYxWwEA/QmrebctLjo79xz9ouK3MroHwOJw==", - "dev": true, - "requires": { - "htmlparser2": "^3.10.0" - } - }, - "postcss-less": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-3.1.4.tgz", - "integrity": "sha512-7TvleQWNM2QLcHqvudt3VYjULVB49uiW6XzEUFmvwHzvsOEF5MwBrIXZDJQvJNFGjJQTzSzZnDoCJ8h/ljyGXA==", - "dev": true, - "requires": { - "postcss": "^7.0.14" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "postcss-media-query-parser": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", - "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", - "dev": true - }, - "postcss-resolve-nested-selector": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz", - "integrity": "sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==", - "dev": true - }, - "postcss-safe-parser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz", - "integrity": "sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g==", - "dev": true, - "requires": { - "postcss": "^7.0.26" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "postcss-sass": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/postcss-sass/-/postcss-sass-0.4.4.tgz", - "integrity": "sha512-BYxnVYx4mQooOhr+zer0qWbSPYnarAy8ZT7hAQtbxtgVf8gy+LSLT/hHGe35h14/pZDTw1DsxdbrwxBN++H+fg==", - "dev": true, - "requires": { - "gonzales-pe": "^4.3.0", - "postcss": "^7.0.21" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "postcss-scss": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-2.1.1.tgz", - "integrity": "sha512-jQmGnj0hSGLd9RscFw9LyuSVAa5Bl1/KBPqG1NQw9w8ND55nY4ZEsdlVuYJvLPpV+y0nwTV5v/4rHPzZRihQbA==", - "dev": true, - "requires": { - "postcss": "^7.0.6" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "postcss-selector-parser": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", - "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "postcss-syntax": { - "version": "0.36.2", - "resolved": "https://registry.npmjs.org/postcss-syntax/-/postcss-syntax-0.36.2.tgz", - "integrity": "sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w==", - "dev": true, - "requires": {} - }, - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", - "dev": true - }, - "prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "qrcode-generator": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/qrcode-generator/-/qrcode-generator-1.4.4.tgz", - "integrity": "sha512-HM7yY8O2ilqhmULxGMpcHSF1EhJJ9yBj8gvDEuZ6M+KGJ0YY2hKpnXvRD+hZPLrDVck3ExIGhmPtSdcjC+guuw==" - }, - "qrcode.react": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/qrcode.react/-/qrcode.react-3.1.0.tgz", - "integrity": "sha512-oyF+Urr3oAMUG/OiOuONL3HXM+53wvuH3mtIWQrYmsXoAq0DkvZp2RYUWFSMFtbdOpuS++9v+WAkzNVkMlNW6Q==", - "requires": {} - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==" - }, - "rc-align": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/rc-align/-/rc-align-4.0.15.tgz", - "integrity": "sha512-wqJtVH60pka/nOX7/IspElA8gjPNQKIx/ZqJ6heATCkXpe1Zg4cPVrMD2vC96wjsFFL8WsmhPbx9tdMo1qqlIA==", - "requires": { - "@babel/runtime": "^7.10.1", - "classnames": "2.x", - "dom-align": "^1.7.0", - "rc-util": "^5.26.0", - "resize-observer-polyfill": "^1.5.1" - } - }, - "rc-cascader": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/rc-cascader/-/rc-cascader-3.8.1.tgz", - "integrity": "sha512-VdsxbiNYmcbMqKzydODr8oehBzIvIk2ICMPu5S95b3SzuKspgkV2uSxBCUa6dsp26lUvRI/PA+k8Q00o5bsSZA==", - "requires": { - "@babel/runtime": "^7.12.5", - "array-tree-filter": "^2.1.0", - "classnames": "^2.3.1", - "rc-select": "~14.2.0", - "rc-tree": "~5.7.0", - "rc-util": "^5.6.1" - } - }, - "rc-checkbox": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/rc-checkbox/-/rc-checkbox-2.3.2.tgz", - "integrity": "sha512-afVi1FYiGv1U0JlpNH/UaEXdh6WUJjcWokj/nUN2TgG80bfG+MDdbfHKlLcNNba94mbjy2/SXJ1HDgrOkXGAjg==", - "requires": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.1" - } - }, - "rc-collapse": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/rc-collapse/-/rc-collapse-3.5.2.tgz", - "integrity": "sha512-/TNiT3DW1t3sUCiVD/DPUYooJZ3BLA93/2rZsB3eM2bGJCCla2X9D2E4tgm7LGMQGy5Atb2lMUn2FQuvQNvavQ==", - "requires": { - "@babel/runtime": "^7.10.1", - "classnames": "2.x", - "rc-motion": "^2.3.4", - "rc-util": "^5.27.0" - } - }, - "rc-dialog": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-9.0.2.tgz", - "integrity": "sha512-s3U+24xWUuB6Bn2Lk/Qt6rufy+uT+QvWkiFhNBcO9APLxcFFczWamaq7x9h8SCuhfc1nHcW4y8NbMsnAjNnWyg==", - "requires": { - "@babel/runtime": "^7.10.1", - "@rc-component/portal": "^1.0.0-8", - "classnames": "^2.2.6", - "rc-motion": "^2.3.0", - "rc-util": "^5.21.0" - } - }, - "rc-drawer": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/rc-drawer/-/rc-drawer-6.1.3.tgz", - "integrity": "sha512-AvHisO90A+xMLMKBw2zs89HxjWxusM2BUABlgK60RhweIHF8W/wk0hSOrxBlUXoA9r1F+10na3g6GZ97y1qDZA==", - "requires": { - "@babel/runtime": "^7.10.1", - "@rc-component/portal": "^1.0.0-6", - "classnames": "^2.2.6", - "rc-motion": "^2.6.1", - "rc-util": "^5.21.2" - } - }, - "rc-dropdown": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-4.0.1.tgz", - "integrity": "sha512-OdpXuOcme1rm45cR0Jzgfl1otzmU4vuBVb+etXM8vcaULGokAKVpKlw8p6xzspG7jGd/XxShvq+N3VNEfk/l5g==", - "requires": { - "@babel/runtime": "^7.18.3", - "classnames": "^2.2.6", - "rc-trigger": "^5.3.1", - "rc-util": "^5.17.0" - } - }, - "rc-field-form": { - "version": "1.27.1", - "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-1.27.1.tgz", - "integrity": "sha512-RShegnwFu6TH8tl2olCxn+B4Wyh5EiQH8c/7wucbkLNyue05YiH5gomUAg1vbZjp71yFKwegClctsEG5CNBWAA==", - "requires": { - "@babel/runtime": "^7.18.0", - "async-validator": "^4.1.0", - "rc-util": "^5.8.0" - } - }, - "rc-image": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/rc-image/-/rc-image-5.13.0.tgz", - "integrity": "sha512-iZTOmw5eWo2+gcrJMMcnd7SsxVHl3w5xlyCgsULUdJhJbnuI8i/AL0tVOsE7aLn9VfOh1qgDT3mC2G75/c7mqg==", - "requires": { - "@babel/runtime": "^7.11.2", - "@rc-component/portal": "^1.0.2", - "classnames": "^2.2.6", - "rc-dialog": "~9.0.0", - "rc-motion": "^2.6.2", - "rc-util": "^5.0.6" - } - }, - "rc-input": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/rc-input/-/rc-input-0.2.2.tgz", - "integrity": "sha512-xgkVcFgtRO0Hl9hmvslZhObNyxbSpTmy3nR1Tk4XrjjZ9lFJ7GcJBy6ss30Pdb0oX36cHzLN8I7VCjBGeRNB9A==", - "requires": { - "@babel/runtime": "^7.11.1", - "classnames": "^2.2.1", - "rc-util": "^5.18.1" - } - }, - "rc-input-number": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-7.4.1.tgz", - "integrity": "sha512-UwZOteqSKeWVuC6nMl/FZqbfVUR4G2PLMGNFrVeQMmq2iFHlIlDCb1Dh4i+EIPnb3d8k8+NL86KjG02LpYBS3w==", - "requires": { - "@babel/runtime": "^7.10.1", - "@rc-component/mini-decimal": "^1.0.1", - "classnames": "^2.2.5", - "rc-util": "^5.25.0" - } - }, - "rc-mentions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-2.0.0.tgz", - "integrity": "sha512-58NSeM6R5MrgYAhR2TH27JgAN7ivp3iBTmty3q6gvrrGHelPMdGxpJ5aH7AIlodCrPWLAm1lT4XoiuI4s9snXA==", - "requires": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.6", - "rc-input": "^0.2.2", - "rc-menu": "~9.8.0", - "rc-textarea": "^1.0.0", - "rc-trigger": "^5.0.4", - "rc-util": "^5.22.5" - } - }, - "rc-menu": { - "version": "9.8.2", - "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-9.8.2.tgz", - "integrity": "sha512-EahOJVjLuEnJsThoPN+mGnVm431RzVzDLZWHRS/YnXTQULa7OsgdJa/Y7qXxc3Z5sz8mgT6xYtgpmBXLxrZFaQ==", - "requires": { - "@babel/runtime": "^7.10.1", - "classnames": "2.x", - "rc-motion": "^2.4.3", - "rc-overflow": "^1.2.8", - "rc-trigger": "^5.1.2", - "rc-util": "^5.27.0" - } - }, - "rc-motion": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.6.3.tgz", - "integrity": "sha512-xFLkes3/7VL/J+ah9jJruEW/Akbx5F6jVa2wG5o/ApGKQKSOd5FR3rseHLL9+xtJg4PmCwo6/1tqhDO/T+jFHA==", - "requires": { - "@babel/runtime": "^7.11.1", - "classnames": "^2.2.1", - "rc-util": "^5.21.0" - } - }, - "rc-notification": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/rc-notification/-/rc-notification-5.0.2.tgz", - "integrity": "sha512-74wUFiLlyr6lRGEY1m1BaTiDp+0lIT4FRAblMnh9FApyK2JGdsSLbrQ/1rgM7d2N/IX5UIr8kLLW3TdXxFt/jQ==", - "requires": { - "@babel/runtime": "^7.10.1", - "classnames": "2.x", - "rc-motion": "^2.6.0", - "rc-util": "^5.20.1" - } - }, - "rc-overflow": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc-overflow/-/rc-overflow-1.2.8.tgz", - "integrity": "sha512-QJ0UItckWPQ37ZL1dMEBAdY1dhfTXFL9k6oTTcyydVwoUNMnMqCGqnRNA98axSr/OeDKqR6DVFyi8eA5RQI/uQ==", - "requires": { - "@babel/runtime": "^7.11.1", - "classnames": "^2.2.1", - "rc-resize-observer": "^1.0.0", - "rc-util": "^5.19.2" - } - }, - "rc-pagination": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/rc-pagination/-/rc-pagination-3.2.0.tgz", - "integrity": "sha512-5tIXjB670WwwcAJzAqp2J+cOBS9W3cH/WU1EiYwXljuZ4vtZXKlY2Idq8FZrnYBz8KhN3vwPo9CoV/SJS6SL1w==", - "requires": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.1" - } - }, - "rc-picker": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-3.1.5.tgz", - "integrity": "sha512-Hh3ml+u+5mxLfl4ahVWlRGiX5+0EJrALR6tSW9yP0eea+6j+YjvjfetbvuVidViMDMweZa38dr8HTfAFLG6GFw==", - "requires": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.1", - "rc-trigger": "^5.0.4", - "rc-util": "^5.27.0" - } - }, - "rc-progress": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/rc-progress/-/rc-progress-3.4.1.tgz", - "integrity": "sha512-eAFDHXlk8aWpoXl0llrenPMt9qKHQXphxcVsnKs0FHC6eCSk1ebJtyaVjJUzKe0233ogiLDeEFK1Uihz3s67hw==", - "requires": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.6", - "rc-util": "^5.16.1" - } - }, - "rc-rate": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/rc-rate/-/rc-rate-2.9.2.tgz", - "integrity": "sha512-SaiZFyN8pe0Fgphv8t3+kidlej+cq/EALkAJAc3A0w0XcPaH2L1aggM8bhe1u6GAGuQNAoFvTLjw4qLPGRKV5g==", - "requires": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.5", - "rc-util": "^5.0.1" - } - }, - "rc-resize-observer": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.3.1.tgz", - "integrity": "sha512-iFUdt3NNhflbY3mwySv5CA1TC06zdJ+pfo0oc27xpf4PIOvfZwZGtD9Kz41wGYqC4SLio93RVAirSSpYlV/uYg==", - "requires": { - "@babel/runtime": "^7.20.7", - "classnames": "^2.2.1", - "rc-util": "^5.27.0", - "resize-observer-polyfill": "^1.5.1" - } - }, - "rc-segmented": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/rc-segmented/-/rc-segmented-2.1.2.tgz", - "integrity": "sha512-qGo1bCr83ESXpXVOCXjFe1QJlCAQXyi9KCiy8eX3rIMYlTeJr/ftySIaTnYsitL18SvWf5ZEHsfqIWoX0EMfFQ==", - "requires": { - "@babel/runtime": "^7.11.1", - "classnames": "^2.2.1", - "rc-motion": "^2.4.4", - "rc-util": "^5.17.0" - } - }, - "rc-select": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-14.2.0.tgz", - "integrity": "sha512-tvxHmbAA0EIhBkB7dyaRhcBUIWHocQbUFY/fBlezj2jg5p65a5VQ/UhBg2I9TA1wjpsr5CCx0ruZPkYcUMjDoQ==", - "requires": { - "@babel/runtime": "^7.10.1", - "classnames": "2.x", - "rc-motion": "^2.0.1", - "rc-overflow": "^1.0.0", - "rc-trigger": "^5.0.4", - "rc-util": "^5.16.1", - "rc-virtual-list": "^3.4.13" - } - }, - "rc-slider": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-10.1.1.tgz", - "integrity": "sha512-gn8oXazZISEhnmRinI89Z/JD/joAaM35jp+gDtIVSTD/JJMCCBqThqLk1SVJmvtfeiEF/kKaFY0+qt4SDHFUDw==", - "requires": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.5", - "rc-util": "^5.27.0" - } - }, - "rc-steps": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/rc-steps/-/rc-steps-6.0.0.tgz", - "integrity": "sha512-+KfMZIty40mYCQSDvYbZ1jwnuObLauTiIskT1hL4FFOBHP6ZOr8LK0m143yD3kEN5XKHSEX1DIwCj3AYZpoeNQ==", - "requires": { - "@babel/runtime": "^7.16.7", - "classnames": "^2.2.3", - "rc-util": "^5.16.1" - } - }, - "rc-switch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/rc-switch/-/rc-switch-4.0.0.tgz", - "integrity": "sha512-IfrYC99vN0gKaTyjQdqYuADU0eH00SAFHg3jOp8HrmUpJruhV1SohJzrCbPqPraZeX/6X/QKkdLfkdnUub05WA==", - "requires": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.1", - "rc-util": "^5.0.1" - } - }, - "rc-table": { - "version": "7.30.4", - "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.30.4.tgz", - "integrity": "sha512-NXfitP7CEXAnnuxdEYZNwEMyWmWOSsv9WgiP2yI10pyy0BwomFn4aa8nX/9x832edLwuIlrYuL6ojfOK60An2w==", - "requires": { - "@babel/runtime": "^7.10.1", - "@rc-component/context": "^1.3.0", - "classnames": "^2.2.5", - "rc-resize-observer": "^1.1.0", - "rc-util": "^5.27.1" - } - }, - "rc-tabs": { - "version": "12.5.7", - "resolved": "https://registry.npmjs.org/rc-tabs/-/rc-tabs-12.5.7.tgz", - "integrity": "sha512-i9gY2TcwCNmBM+bXCDDTvb6mnRYIDkkNm+UGoIqrLOFnRRbAqjsSf+tgyvzhBvbK8XcSrMhzKKLaOMbGyND8YA==", - "requires": { - "@babel/runtime": "^7.11.2", - "classnames": "2.x", - "rc-dropdown": "~4.0.0", - "rc-menu": "~9.8.0", - "rc-motion": "^2.6.2", - "rc-resize-observer": "^1.0.0", - "rc-util": "^5.16.0" - } - }, - "rc-textarea": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rc-textarea/-/rc-textarea-1.0.1.tgz", - "integrity": "sha512-dtIm96apjJpCUcCeTtbnLGJaVlqbOqVgN0P9z+bqMSi7rcV5QVeUtBnG+jQTGk/uD183Z7jbhc8Dx7G3luDCwg==", - "requires": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.1", - "rc-input": "^0.2.1", - "rc-resize-observer": "^1.0.0", - "rc-util": "^5.27.0" - } - }, - "rc-tooltip": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-5.3.1.tgz", - "integrity": "sha512-e6H0dMD38EPaSPD2XC8dRfct27VvT2TkPdoBSuNl3RRZ5tspiY/c5xYEmGC0IrABvMBgque4Mr2SMZuliCvoiQ==", - "requires": { - "@babel/runtime": "^7.11.2", - "classnames": "^2.3.1", - "rc-trigger": "^5.3.1" - } - }, - "rc-tree": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-5.7.2.tgz", - "integrity": "sha512-nmnL6qLnfwVckO5zoqKL2I9UhwDqzyCtjITQCkwhimyz1zfuFkG5ZPIXpzD/Guzso94qQA/QrMsvzic5W6QDjg==", - "requires": { - "@babel/runtime": "^7.10.1", - "classnames": "2.x", - "rc-motion": "^2.0.1", - "rc-util": "^5.16.1", - "rc-virtual-list": "^3.4.8" - } - }, - "rc-tree-select": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-5.6.0.tgz", - "integrity": "sha512-XG6pu0a9l6+mzhQqUYfR2VIONbe/3LjVc3wKt28k6uBMZsI1j+SSxRyt/7jWRq8Kok8jHJBQASlDg6ehr9Sp0w==", - "requires": { - "@babel/runtime": "^7.10.1", - "classnames": "2.x", - "rc-select": "~14.2.0", - "rc-tree": "~5.7.0", - "rc-util": "^5.16.1" - } - }, - "rc-trigger": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-5.3.4.tgz", - "integrity": "sha512-mQv+vas0TwKcjAO2izNPkqR4j86OemLRmvL2nOzdP9OWNWA1ivoTt5hzFqYNW9zACwmTezRiN8bttrC7cZzYSw==", - "requires": { - "@babel/runtime": "^7.18.3", - "classnames": "^2.2.6", - "rc-align": "^4.0.0", - "rc-motion": "^2.0.0", - "rc-util": "^5.19.2" - } - }, - "rc-upload": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/rc-upload/-/rc-upload-4.3.4.tgz", - "integrity": "sha512-uVbtHFGNjHG/RyAfm9fluXB6pvArAGyAx8z7XzXXyorEgVIWj6mOlriuDm0XowDHYz4ycNK0nE0oP3cbFnzxiQ==", - "requires": { - "@babel/runtime": "^7.18.3", - "classnames": "^2.2.5", - "rc-util": "^5.2.0" - } - }, - "rc-util": { - "version": "5.28.0", - "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.28.0.tgz", - "integrity": "sha512-KYDjhGodswVj29v0TRciKTqRPgumIFvFDndbCD227pitQ+0Cei196rxk+OXb/blu6V8zdTRK5RjCJn+WmHLvBA==", - "requires": { - "@babel/runtime": "^7.18.3", - "react-is": "^16.12.0" - } - }, - "rc-virtual-list": { - "version": "3.4.13", - "resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.4.13.tgz", - "integrity": "sha512-cPOVDmcNM7rH6ANotanMDilW/55XnFPw0Jh/GQYtrzZSy3AmWvCnqVNyNC/pgg3lfVmX2994dlzAhuUrd4jG7w==", - "requires": { - "@babel/runtime": "^7.20.0", - "classnames": "^2.2.6", - "rc-resize-observer": "^1.0.0", - "rc-util": "^5.15.0" - } - }, - "react": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", - "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "react-dom": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", - "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" - } - }, - "react-emoji-render": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/react-emoji-render/-/react-emoji-render-1.2.4.tgz", - "integrity": "sha512-AqktVXV38uDpgf02BoCXrzLYFsHAsxfdWwjrLexSJ22l1JgB01y1KejjxW/zTuCzod6O7BZfiMS866LEEfMHmA==", - "requires": { - "classnames": "^2.2.5", - "emoji-regex": "^6.4.1", - "lodash.flatten": "^4.4.0", - "prop-types": "^15.5.8", - "string-replace-to-array": "^1.0.1" - }, - "dependencies": { - "emoji-regex": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-6.5.1.tgz", - "integrity": "sha512-PAHp6TxrCy7MGMFidro8uikr+zlJJKJ/Q6mm2ExZ7HwkyR9lSVFfE3kt36qcwa24BQL7y0G9axycGjK1A/0uNQ==" - } - } - }, - "react-icons": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.4.0.tgz", - "integrity": "sha512-fSbvHeVYo/B5/L4VhB7sBA1i2tS8MkT0Hb9t2H1AVPkwGfVHLJCqyr2Py9dKMxsyM63Eng1GkdZfbWj+Fmv8Rg==", - "requires": {} - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "react-qrcode-logo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/react-qrcode-logo/-/react-qrcode-logo-2.8.0.tgz", - "integrity": "sha512-dbEgjsg6C4tK6+oGmCRDlJ7urQAWqybaGBLJtp8Z6ZYvVUP302HBXk/F7VRk54yWTwzlHwig3VK6HMKCha2YFw==", - "requires": { - "lodash.isequal": "^4.5.0", - "qrcode-generator": "^1.4.1" - } - }, - "react-sortable-hoc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/react-sortable-hoc/-/react-sortable-hoc-2.0.0.tgz", - "integrity": "sha512-JZUw7hBsAHXK7PTyErJyI7SopSBFRcFHDjWW5SWjcugY0i6iH7f+eJkY8cJmGMlZ1C9xz1J3Vjz0plFpavVeRg==", - "requires": { - "@babel/runtime": "^7.2.0", - "invariant": "^2.2.4", - "prop-types": "^15.5.7" - } - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - }, - "dependencies": { - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } - } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "redaxios": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/redaxios/-/redaxios-0.5.1.tgz", - "integrity": "sha512-FSD2AmfdbkYwl7KDExYQlVvIrFz6Yd83pGfaGjBzM9F6rpq8g652Q4Yq5QD4c+nf4g2AgeElv1y+8ajUPiOYMg==" - }, - "redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "requires": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - } - }, - "regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" - }, - "regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - } - }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, - "remark": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/remark/-/remark-13.0.0.tgz", - "integrity": "sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA==", - "dev": true, - "requires": { - "remark-parse": "^9.0.0", - "remark-stringify": "^9.0.0", - "unified": "^9.1.0" - } - }, - "remark-parse": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz", - "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==", - "dev": true, - "requires": { - "mdast-util-from-markdown": "^0.8.0" - } - }, - "remark-stringify": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-9.0.1.tgz", - "integrity": "sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg==", - "dev": true, - "requires": { - "mdast-util-to-markdown": "^0.6.0" - } - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "dev": true - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "resize-observer-polyfill": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", - "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" - }, - "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", - "requires": { - "lowercase-keys": "^2.0.0" - } - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "saslprep": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", - "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", - "optional": true, - "requires": { - "sparse-bitfield": "^3.0.3" - } - }, - "scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "scroll-into-view-if-needed": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.0.6.tgz", - "integrity": "sha512-x+CW0kOzlFNOnseF0DBr0AJ5m+TgGmSOdEZwyiZW0gV87XBvxQKw5A8DvFFgabznA68XqLgVX+PwPX8OzsFvRA==", - "requires": { - "compute-scroll-into-view": "^3.0.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "shell-quote": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", - "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==", - "dev": true - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "sift": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.0.tgz", - "integrity": "sha512-ILTjdP2Mv9V1kIxWMXeMTIRbOBrqKc4JAXmFMnFq3fKeyQ2Qwa3Dw1ubcye3vR+Y6ofA0b9gNDr/y2t6eUeIzQ==" - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } - } - }, - "smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==" - }, - "socks": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.0.tgz", - "integrity": "sha512-scnOe9y4VuiNUULJN72GrM26BNOjVsfPXI+j+98PkyEfsIXroa5ofyjT+FzGvn/xHs73U2JtoBYAVx9Hl4quSA==", - "requires": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true - }, - "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" - }, - "sparse-bitfield": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", - "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", - "optional": true, - "requires": { - "memory-pager": "^1.0.2" - } - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", - "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", - "dev": true - }, - "specificity": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.4.1.tgz", - "integrity": "sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==", - "dev": true - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==" - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } - } - }, - "string-convert": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz", - "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==" - }, - "string-replace-to-array": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string-replace-to-array/-/string-replace-to-array-1.0.3.tgz", - "integrity": "sha512-QIdKvmfXbdFvblXAAz6IIjR7A+C6SU6m2A+e7fE/0EYDC5yfeWNMJQ193fPsW7nG+9q52dv/UjnVrDaNVZXpmQ==", - "requires": { - "invariant": "^2.2.1", - "lodash.flatten": "^4.2.0", - "lodash.isstring": "^4.0.1" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - } - } - }, - "string.prototype.matchall": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz", - "integrity": "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", - "get-intrinsic": "^1.1.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.1", - "side-channel": "^1.0.4" - } - }, - "string.prototype.padend": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.3.tgz", - "integrity": "sha512-jNIIeokznm8SD/TZISQsZKYu7RJyheFNt84DUPrh482GC8RVp2MKqm2O5oBRdGxbDQoXrhhWtPIWQOiy20svUg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - } - }, - "string.prototype.trimend": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", - "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - } - }, - "string.prototype.trimstart": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", - "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true - }, - "strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "requires": { - "min-indent": "^1.0.0" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "style-search": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", - "integrity": "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==", - "dev": true - }, - "styled-jsx": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.0.7.tgz", - "integrity": "sha512-b3sUzamS086YLRuvnaDigdAewz1/EFYlHpYBP5mZovKEdQQOIIYq8lApylub3HHZ6xFjV051kkGU7cudJmrXEA==", - "requires": {} - }, - "stylelint": { - "version": "13.13.1", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.13.1.tgz", - "integrity": "sha512-Mv+BQr5XTUrKqAXmpqm6Ddli6Ief+AiPZkRsIrAoUKFuq/ElkUh9ZMYxXD0iQNZ5ADghZKLOWz1h7hTClB7zgQ==", - "dev": true, - "requires": { - "@stylelint/postcss-css-in-js": "^0.37.2", - "@stylelint/postcss-markdown": "^0.36.2", - "autoprefixer": "^9.8.6", - "balanced-match": "^2.0.0", - "chalk": "^4.1.1", - "cosmiconfig": "^7.0.0", - "debug": "^4.3.1", - "execall": "^2.0.0", - "fast-glob": "^3.2.5", - "fastest-levenshtein": "^1.0.12", - "file-entry-cache": "^6.0.1", - "get-stdin": "^8.0.0", - "global-modules": "^2.0.0", - "globby": "^11.0.3", - "globjoin": "^0.1.4", - "html-tags": "^3.1.0", - "ignore": "^5.1.8", - "import-lazy": "^4.0.0", - "imurmurhash": "^0.1.4", - "known-css-properties": "^0.21.0", - "lodash": "^4.17.21", - "log-symbols": "^4.1.0", - "mathml-tag-names": "^2.1.3", - "meow": "^9.0.0", - "micromatch": "^4.0.4", - "normalize-selector": "^0.2.0", - "postcss": "^7.0.35", - "postcss-html": "^0.36.0", - "postcss-less": "^3.1.4", - "postcss-media-query-parser": "^0.2.3", - "postcss-resolve-nested-selector": "^0.1.1", - "postcss-safe-parser": "^4.0.2", - "postcss-sass": "^0.4.4", - "postcss-scss": "^2.1.1", - "postcss-selector-parser": "^6.0.5", - "postcss-syntax": "^0.36.2", - "postcss-value-parser": "^4.1.0", - "resolve-from": "^5.0.0", - "slash": "^3.0.0", - "specificity": "^0.4.1", - "string-width": "^4.2.2", - "strip-ansi": "^6.0.0", - "style-search": "^0.1.0", - "sugarss": "^2.0.0", - "svg-tags": "^1.0.0", - "table": "^6.6.0", - "v8-compile-cache": "^2.3.0", - "write-file-atomic": "^3.0.3" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "balanced-match": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", - "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "stylelint-a11y": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stylelint-a11y/-/stylelint-a11y-1.2.3.tgz", - "integrity": "sha512-S/iiKFUsYBfa4suxP0pYQqoPB9R1+SnvxVuzHHlz9al0IWxLZzXlnZEqEez0zNOhVh5iO3rATUmDnbZE5wm/pQ==", - "dev": true, - "requires": {} - }, - "stylelint-config-css-modules": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/stylelint-config-css-modules/-/stylelint-config-css-modules-2.3.0.tgz", - "integrity": "sha512-nSxwaJMv9wBrTAi+O4qXubyi1AR9eB36tJpY0uaFhKgEc3fwWGUzUK1Edl8AQHAoU7wmUeKtsuYjblyRP/V7rw==", - "dev": true, - "requires": {} - }, - "stylelint-config-prettier": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/stylelint-config-prettier/-/stylelint-config-prettier-8.0.2.tgz", - "integrity": "sha512-TN1l93iVTXpF9NJstlvP7nOu9zY2k+mN0NSFQ/VEGz15ZIP9ohdDZTtCWHs5LjctAhSAzaILULGbgiM0ItId3A==", - "dev": true, - "requires": {} - }, - "stylelint-config-recommended": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-3.0.0.tgz", - "integrity": "sha512-F6yTRuc06xr1h5Qw/ykb2LuFynJ2IxkKfCMf+1xqPffkxh0S09Zc902XCffcsw/XMFq/OzQ1w54fLIDtmRNHnQ==", - "dev": true, - "requires": {} - }, - "stylelint-config-standard": { - "version": "20.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-20.0.0.tgz", - "integrity": "sha512-IB2iFdzOTA/zS4jSVav6z+wGtin08qfj+YyExHB3LF9lnouQht//YyB0KZq9gGz5HNPkddHOzcY8HsUey6ZUlA==", - "dev": true, - "requires": { - "stylelint-config-recommended": "^3.0.0" - } - }, - "stylis": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz", - "integrity": "sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==" - }, - "sugarss": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-2.0.0.tgz", - "integrity": "sha512-WfxjozUk0UVA4jm+U1d736AUpzSrNsQcIbyOkoE364GrtWmIrFdk5lksEupgWMD4VaT/0kVx1dobpiDumSgmJQ==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "svg-tags": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", - "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", - "dev": true - }, - "table": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz", - "integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==", - "dev": true, - "requires": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - } - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "throttle-debounce": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.0.tgz", - "integrity": "sha512-2iQTSgkkc1Zyk0MeVrt/3BvuOXYPl/R8Z0U2xxo9rjwNciaHDG3R+Lm6dh4EeUci49DanvBnuqI6jshoQQRGEg==" - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "toggle-selection": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", - "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" - }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" - }, - "tr46": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", - "requires": { - "punycode": "^2.1.1" - } - }, - "trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "dev": true - }, - "trough": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", - "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", - "dev": true - }, - "tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", - "dev": true, - "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - } - } - }, - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typescript": { - "version": "4.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.3.tgz", - "integrity": "sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==", - "dev": true, - "peer": true - }, - "unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - } - }, - "unified": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz", - "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==", - "dev": true, - "requires": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" - }, - "dependencies": { - "is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true - } - } - }, - "unist-util-find-all-after": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/unist-util-find-all-after/-/unist-util-find-all-after-3.0.2.tgz", - "integrity": "sha512-xaTC/AGZ0rIM2gM28YVRAFPIZpzbpDtU3dRmp7EXlNVA8ziQc4hY3H7BHXM1J49nEmiqc3svnqMReW+PGqbZKQ==", - "dev": true, - "requires": { - "unist-util-is": "^4.0.0" - } - }, - "unist-util-is": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", - "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", - "dev": true - }, - "unist-util-stringify-position": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", - "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", - "dev": true, - "requires": { - "@types/unist": "^2.0.2" - } - }, - "update-browserslist-db": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.7.tgz", - "integrity": "sha512-iN/XYesmZ2RmmWAiI4Z5rq0YqSiv0brj9Ce9CfhNE4xIW2h+MFxcgkxIzZ+ShkFPUkjU3gQ+3oypadD3RAMtrg==", - "dev": true, - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "url-join": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==" - }, - "use-sync-external-store": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", - "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", - "requires": {} - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "vfile": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", - "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^2.0.0", - "vfile-message": "^2.0.0" - } - }, - "vfile-message": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", - "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^2.0.0" - } - }, - "webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==" - }, - "whatwg-url": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", - "requires": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - }, - "zwitch": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", - "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==", - "dev": true - } - } -} diff --git a/package.json b/package.json deleted file mode 100644 index c8c11d2..0000000 --- a/package.json +++ /dev/null @@ -1,70 +0,0 @@ -{ - "name": "cesium.link", - "description": "Mapping CeSIUM's website to shorter urls", - "version": "2.0.0", - "license": "MIT", - "homepage": "https://cesium.link", - "bugs": "https://github.com/cesium/cesium.link/issues", - "repository": { - "type": "git", - "url": "https://github.com/cesium/cesium.link" - }, - "private": true, - "scripts": { - "develop": "npm-run-all dev", - "dev": "next dev", - "build": "next build", - "start": "next start", - "lint": "npm run lint:fix", - "lint:fix": "npm run eslint:fix && npm run stylelint:fix && npm run prettier:fix", - "lint:check": "npm run eslint:check && npm run stylelint:check && npm run prettier:check", - "eslint:fix": "next lint --fix", - "eslint:check": "next lint", - "stylelint:fix": "stylelint --fix './**/*.{css,js,ts,tsx}' --ignore-path .gitignore", - "stylelint:check": "stylelint './**/*.{css,js,ts,tsx}' --ignore-path .gitignore", - "prettier:fix": "prettier --write . --ignore-path .gitignore", - "prettier:check": "prettier --check . --ignore-path .gitignore" - }, - "dependencies": { - "@ant-design/icons": "^4.7.0", - "@auth0/nextjs-auth0": "^1.9.1", - "@tanstack/react-query": "^4.8.0", - "animate.css": "^4.1.1", - "antd": "^5.0.0", - "array-move": "^4.0.0", - "axios": "^0.27.2", - "clsx": "^1.2.1", - "dayjs": "^1.11.5", - "mongoose": "^6.6.3", - "nanoid": "^4.0.0", - "next": "^12.3.1", - "react": "^17.0.2", - "react-dom": "^17.0.2", - "react-emoji-render": "^1.2.4", - "react-icons": "^4.4.0", - "react-qrcode-logo": "^2.8.0", - "react-sortable-hoc": "^2.0.0", - "redaxios": "^0.5.1" - }, - "devDependencies": { - "@trivago/prettier-plugin-sort-imports": "^3.3.0", - "@types/antd": "^1.0.0", - "@types/luxon": "^3.0.0", - "@types/mongoose": "^5.11.97", - "@types/node": "^18.7.13", - "@types/react": "^17.0.44", - "@types/react-dom": "^18.0.6", - "eslint": "^8.14.0", - "eslint-config-next": "^12.1.6", - "eslint-config-prettier": "^8.5.0", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-unused-imports": "^2.0.0", - "npm-run-all": "^4.1.5", - "prettier": "^2.6.2", - "stylelint": "^13.13.1", - "stylelint-a11y": "^1.2.3", - "stylelint-config-css-modules": "^2.3.0", - "stylelint-config-prettier": "^8.0.2", - "stylelint-config-standard": "^20.0.0" - } -} diff --git a/pages/[redirect]/[key].tsx b/pages/[redirect]/[key].tsx deleted file mode 100644 index e63f0e0..0000000 --- a/pages/[redirect]/[key].tsx +++ /dev/null @@ -1,86 +0,0 @@ -import { GetServerSideProps } from 'next'; -import ErrorPage from 'next/error'; - -import { SETTINGS } from '~/data/config'; -import API from '~/lib/api'; - -const repos = { - gh: SETTINGS.github, - gl: SETTINGS.gitlab -}; - -const maps = { - a: 'activities', - n: 'articles', - j: 'jobs' -}; - -const collections = { - f: 'forms', - r: 'redirects', - u: 'links' -}; - -export const getServerSideProps: GetServerSideProps = async ({ params }) => { - const { key, redirect } = params; - - if (Array.isArray(redirect) || Array.isArray(key)) { - return { - notFound: true - }; - } - - if (redirect in repos) { - return { - redirect: { - destination: `${repos[redirect].base_url}/${repos[redirect].username}/${key}`, - permanent: false - } - }; - } - - if (redirect in maps) { - return { - redirect: { - destination: `${SETTINGS.domain}/${maps[redirect]}/${key}`, - permanent: false - } - }; - } - - if (redirect in collections) { - const response = await API.get<{ url: string }>(`/api/${collections[redirect]}/${key}/url`) - .then((response) => { - return response; - }) - .catch((error) => { - return error; - }); - - if (!response.ok) { - return { - props: { - code: response.status, - message: response.data.error.message || response.statusText - } - }; - } - - return { - redirect: { - destination: response.data.url, - permanent: false - } - }; - } - - return { - notFound: true - }; -}; - -const Redirect = ({ message = 'This page could not be found.', code = 404 }) => ( - -); - -export default Redirect; diff --git a/pages/[redirect]/index.tsx b/pages/[redirect]/index.tsx deleted file mode 100644 index d1d689c..0000000 --- a/pages/[redirect]/index.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import { GetServerSideProps } from 'next'; -import ErrorPage from 'next/error'; - -import { SETTINGS } from '~/data/config'; -import API from '~/lib/api'; - -export const getServerSideProps: GetServerSideProps = async ({ params }) => { - const { redirect } = params; - - const response = await API.get(`/api/redirects/${redirect}/url`) - .then((response) => { - return response; - }) - .catch((error) => { - return error; - }); - - if (!response.ok) { - return { - redirect: { - destination: `${SETTINGS.domain}/${redirect}`, - permanent: false - } - }; - } - - return { - redirect: { - destination: response.data.url, - permanent: false - } - }; -}; - -const Redirect = ({ message = 'This page could not be found.', code = 404 }) => ( - -); - -export default Redirect; diff --git a/pages/_app.tsx b/pages/_app.tsx deleted file mode 100644 index 73ad161..0000000 --- a/pages/_app.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import { UserProvider } from '@auth0/nextjs-auth0'; -import type { NextPage } from 'next'; -import type { AppProps } from 'next/app'; -import type { ReactElement, ReactNode } from 'react'; - -import '~/styles/globals.css'; - -type NextPageWithLayout = NextPage & { - getLayout?: (page: ReactElement) => ReactNode; -}; - -type AppPropsWithLayout = AppProps & { - Component: NextPageWithLayout; -}; - -const App = ({ Component, pageProps }: AppPropsWithLayout) => { - const getLayout = Component.getLayout ?? ((page) => page); - - return {getLayout()}; -}; - -export default App; diff --git a/pages/_version.tsx b/pages/_version.tsx deleted file mode 100644 index 3a4c214..0000000 --- a/pages/_version.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { getVersion } from '~/lib/config'; - -export default function Version() { - return `${getVersion().ref}`; -} diff --git a/pages/admin/about.tsx b/pages/admin/about.tsx deleted file mode 100644 index 28decdd..0000000 --- a/pages/admin/about.tsx +++ /dev/null @@ -1,66 +0,0 @@ -import { withPageAuthRequired } from '@auth0/nextjs-auth0'; -import { Badge, Col, Descriptions, Row, Typography } from 'antd'; -import Image from 'next/image'; - -import AdminLayout from '~/components/AdminLayout'; -import { getUrl, getVersion } from '~/lib/config'; - -const VERSION = getVersion(); -const URL = getUrl(); - -const About = () => ( - - - CeSIUM's T-shirt 2020/21 - - - - CeSIUM - - - - - - {process.env.APP_NAME} - - - {process.env.APP_DESCRIPTION} - - - v{VERSION.tag}-{VERSION.env}. - - {VERSION.ref.substring(0, 8)} - - - - {URL} - - - - - - {process.env.HOMEPAGE} - - - {process.env.REPOSITORY_URL} - - - {process.env.BUG_TRACKER} - - - - {process.env.APP_LICENSE} - - - - - -); - -About.getLayout = function getLayout(page) { - return {page}; -}; - -export const getServerSideProps = withPageAuthRequired(); - -export default About; diff --git a/pages/admin/archived.tsx b/pages/admin/archived.tsx deleted file mode 100644 index bad70c5..0000000 --- a/pages/admin/archived.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import { withPageAuthRequired } from '@auth0/nextjs-auth0'; - -import AdminLayout from '~/components/AdminLayout'; -import ArchivedLinksTable from '~/components/ArchivedLinksTable'; - -function Page() { - return ; -} - -Page.getLayout = function getLayout(page) { - return {page}; -}; - -export const getServerSideProps = withPageAuthRequired(); - -export default Page; diff --git a/pages/admin/forms.tsx b/pages/admin/forms.tsx deleted file mode 100644 index bf71277..0000000 --- a/pages/admin/forms.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { withPageAuthRequired } from '@auth0/nextjs-auth0'; -import { Form } from 'antd'; - -import AdminLayout from '~/components/AdminLayout'; -import FormsTable from '~/components/FormsTable'; -import { EditingProvider } from '~/hooks/Editing'; - -function Page() { - const [form] = Form.useForm(); - - return ( - - - - ); -} - -Page.getLayout = function getLayout(page) { - return {page}; -}; - -export const getServerSideProps = withPageAuthRequired(); - -export default Page; diff --git a/pages/admin/index.tsx b/pages/admin/index.tsx deleted file mode 100644 index e2ff911..0000000 --- a/pages/admin/index.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import { withPageAuthRequired } from '@auth0/nextjs-auth0'; - -import AdminLayout from '~/components/AdminLayout'; -import LinksTable from '~/components/LinksTable'; - -function Page() { - return ; -} - -Page.getLayout = function getLayout(page) { - return {page}; -}; - -export const getServerSideProps = withPageAuthRequired(); - -export default Page; diff --git a/pages/admin/qrcodes.tsx b/pages/admin/qrcodes.tsx deleted file mode 100644 index 76642f5..0000000 --- a/pages/admin/qrcodes.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import { LinkOutlined } from '@ant-design/icons'; -import { withPageAuthRequired } from '@auth0/nextjs-auth0'; -import { Input, Row, Space } from 'antd'; -import { useState } from 'react'; -import { QRCode } from 'react-qrcode-logo'; - -import AdminLayout from '~/components/AdminLayout'; - -function Page() { - const [url, setUrl] = useState(''); - - return ( - - - } - value={url} - onChange={(e) => setUrl(e.target.value)} - /> - {url && ( - - )} - - - ); -} - -Page.getLayout = function getLayout(page) { - return {page}; -}; - -export const getServerSideProps = withPageAuthRequired(); - -export default Page; diff --git a/pages/admin/redirects.tsx b/pages/admin/redirects.tsx deleted file mode 100644 index e16f24e..0000000 --- a/pages/admin/redirects.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { withPageAuthRequired } from '@auth0/nextjs-auth0'; -import { Form } from 'antd'; - -import AdminLayout from '~/components/AdminLayout'; -import RedirectsTable from '~/components/RedirectsTable'; -import { EditingProvider } from '~/hooks/Editing'; - -function Page() { - const [form] = Form.useForm(); - - return ( - - - - ); -} - -Page.getLayout = function getLayout(page) { - return {page}; -}; - -export const getServerSideProps = withPageAuthRequired(); - -export default Page; diff --git a/pages/api/auth/[...auth0].ts b/pages/api/auth/[...auth0].ts deleted file mode 100644 index 304b401..0000000 --- a/pages/api/auth/[...auth0].ts +++ /dev/null @@ -1,3 +0,0 @@ -import { handleAuth } from '@auth0/nextjs-auth0'; - -export default handleAuth(); diff --git a/pages/api/forms/[id]/index.ts b/pages/api/forms/[id]/index.ts deleted file mode 100644 index d477775..0000000 --- a/pages/api/forms/[id]/index.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { withApiAuthRequired } from '@auth0/nextjs-auth0'; -import type { NextApiRequest, NextApiResponse } from 'next'; - -import dbConnect from '~/lib/database'; -import Form, { IForm } from '~/models/Form'; - -type Error = { - error: { - message: string; - }; -}; - -type Success = { form: IForm }; - -type Response = Success | Error; - -export default withApiAuthRequired(async (req: NextApiRequest, res: NextApiResponse) => { - const { - query: { id }, - method - } = req; - - if (Array.isArray(id)) { - return res.status(400).json({ error: { message: "ID field can't be a list" } }); - } - - await dbConnect(); - - switch (method) { - case 'GET': - try { - const form = await Form.findById(id); - - if (!form) { - return res.status(404).json({ error: { message: 'Form not found' } }); - } - res.status(200).json({ form }); - } catch (error) { - res.status(400).json({ error: { message: error.message } }); - } - break; - - case 'PUT': - try { - const form: IForm = await Form.findByIdAndUpdate( - id, - { ...req.body, updated: Date.now() }, - { - new: true, - runValidators: true - } - ); - - if (!form) { - return res.status(404).json({ error: { message: 'Form not found' } }); - } - res.status(200).json({ form }); - } catch (error) { - console.error(error); - res.status(400).json({ error: { message: error.message } }); - } - break; - - case 'DELETE': - try { - const deleted = await Form.findByIdAndDelete(id); - if (!deleted) { - return res.status(400).json({ error: { message: 'Form could not be deleted' } }); - } - res.status(204).end(); - } catch (error) { - console.error(error); - res.status(400).json({ error: { message: error.message } }); - } - break; - default: - res.setHeader('Allow', ['GET', 'PUT', 'DELETE']); - res.status(405).json({ - error: { message: `Method ${method} Not Allowed` } - }); - break; - } -}); diff --git a/pages/api/forms/[id]/url.ts b/pages/api/forms/[id]/url.ts deleted file mode 100644 index 59e8e04..0000000 --- a/pages/api/forms/[id]/url.ts +++ /dev/null @@ -1,51 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from 'next'; - -import dbConnect from '~/lib/database'; -import Form, { IForm } from '~/models/Form'; - -type Error = { - error: { - message: string; - }; -}; - -type Success = { - url: string; -}; - -type Response = Success | Error; - -export default async (req: NextApiRequest, res: NextApiResponse) => { - const { - query: { id: slug }, - method - } = req; - - await dbConnect(); - - switch (method) { - case 'GET': - try { - const form: IForm = await Form.findOneAndUpdate( - { slug }, - { $inc: { visits: 1 } }, - { new: true } - ); - - if (!form) { - return res.status(404).json({ error: { message: 'Form not found' } }); - } - res.status(200).json({ url: form.url }); - } catch (error) { - console.error(error); - res.status(400).json({ error: { message: error.message } }); - } - break; - default: - res.setHeader('Allow', ['GET']); - res.status(405).json({ - error: { message: `Method ${method} Not Allowed` } - }); - break; - } -}; diff --git a/pages/api/forms/index.ts b/pages/api/forms/index.ts deleted file mode 100644 index 24545f2..0000000 --- a/pages/api/forms/index.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { withApiAuthRequired } from '@auth0/nextjs-auth0'; -import type { NextApiRequest, NextApiResponse } from 'next'; - -import dbConnect from '~/lib/database'; -import Form, { IForm } from '~/models/Form'; - -type Error = { - error: { - message: string; - }; -}; - -type Success = { form: IForm } | { data: IForm[] }; - -type Response = Success | Error; - -export default withApiAuthRequired(async (req: NextApiRequest, res: NextApiResponse) => { - const { method } = req; - - await dbConnect(); - - switch (method) { - case 'GET': - try { - const forms: IForm[] = await Form.find({}).sort({ created: 'asc' }); - res.status(200).json({ data: forms }); - } catch (error) { - console.error(error); - res.status(400).json({ error: { message: error.message } }); - } - break; - case 'POST': - try { - const form: IForm = await Form.create(req.body); - res.status(201).json({ form: form }); - } catch (error) { - console.error(error); - res.status(400).json({ error: { message: error.message } }); - } - break; - default: - res.setHeader('Allow', ['GET', 'POST']); - res.status(405).json({ error: { message: `Method ${method} Not Allowed` } }); - break; - } -}); diff --git a/pages/api/index.ts b/pages/api/index.ts deleted file mode 100644 index 215efd5..0000000 --- a/pages/api/index.ts +++ /dev/null @@ -1,14 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from 'next'; - -import { Configuration, getAppConfig } from '~/lib/config'; - -export default async (req: NextApiRequest, res: NextApiResponse) => { - const { method } = req; - - switch (method) { - default: - res.setHeader('Allow', ['GET']); - res.status(200).json(getAppConfig()); - break; - } -}; diff --git a/pages/api/links/[id]/index.ts b/pages/api/links/[id]/index.ts deleted file mode 100644 index 2dc3638..0000000 --- a/pages/api/links/[id]/index.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { withApiAuthRequired } from '@auth0/nextjs-auth0'; -import type { NextApiRequest, NextApiResponse } from 'next'; - -import dbConnect from '~/lib/database'; -import Link, { ILink } from '~/models/Link'; - -type Error = { - error: { - message: string; - }; -}; - -type Success = { link: ILink }; - -type Response = Success | Error; - -export default withApiAuthRequired(async (req: NextApiRequest, res: NextApiResponse) => { - const { - query: { id }, - method - } = req; - - if (Array.isArray(id)) { - return res.status(400).json({ error: { message: "ID field can't be a list" } }); - } - - await dbConnect(); - - switch (method) { - case 'GET': - try { - const link: ILink = await Link.findById(id); - - if (!link) { - return res.status(404).json({ error: { message: 'Link not found' } }); - } - res.status(200).json({ link: link }); - } catch (error) { - console.error(error); - res.status(400).json({ error: { message: error.message } }); - } - break; - - case 'PUT': - try { - const link: ILink = await Link.findByIdAndUpdate(id, req.body, { - new: true, - runValidators: true - }); - if (!link) { - return res.status(404).json({ error: { message: 'Link not found' } }); - } - res.status(200).json({ link: link }); - } catch (error) { - console.error(error); - res.status(400).json({ error: { message: error.message } }); - } - break; - - case 'DELETE': - try { - const deleted = await Link.deleteOne({ _id: id }); - if (!deleted) { - return res.status(400).json({ error: { message: 'Link could not be deleted' } }); - } - res.status(204).end(); - } catch (error) { - console.error(error); - res.status(400).json({ error: { message: error.message } }); - } - break; - default: - res.setHeader('Allow', ['GET', 'PUT', 'DELETE']); - res.status(405).json({ - error: { message: `Method ${method} Not Allowed` } - }); - break; - } -}); diff --git a/pages/api/links/[id]/url.ts b/pages/api/links/[id]/url.ts deleted file mode 100644 index 7b6b0f7..0000000 --- a/pages/api/links/[id]/url.ts +++ /dev/null @@ -1,50 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from 'next'; - -import dbConnect from '~/lib/database'; -import Link, { ILink } from '~/models/Link'; - -type Error = { - error: { - message: string; - }; -}; - -type Success = { - url: string; -}; - -type Response = Success | Error; - -export default async (req: NextApiRequest, res: NextApiResponse) => { - const { - query: { id: slug }, - method - } = req; - - await dbConnect(); - - switch (method) { - case 'GET': - try { - const link: ILink = await Link.findOneAndUpdate( - { slug }, - { $inc: { clicks: 1 } }, - { new: true } - ); - - if (!link) { - return res.status(404).json({ error: { message: 'Link not found' } }); - } - - res.status(200).json({ url: link.url }); - } catch (error) { - console.error(error); - res.status(400).json({ error: { message: error.message } }); - } - break; - default: - res.setHeader('Allow', ['GET']); - res.status(405).json({ error: { message: `Method ${method} Not Allowed` } }); - break; - } -}; diff --git a/pages/api/links/index.ts b/pages/api/links/index.ts deleted file mode 100644 index 088dfcb..0000000 --- a/pages/api/links/index.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { withApiAuthRequired } from '@auth0/nextjs-auth0'; -import type { NextApiRequest, NextApiResponse } from 'next'; - -import dbConnect from '~/lib/database'; -import Link, { ILink } from '~/models/Link'; - -type Error = { - error: { - message: string; - }; -}; - -type Success = { link: ILink } | { data: ILink[] }; - -type Response = Success | Error; - -export default withApiAuthRequired(async (req: NextApiRequest, res: NextApiResponse) => { - const { method, query } = req; - - await dbConnect(); - - switch (method) { - case 'GET': - try { - const { status } = query; - - if (status === 'archived') { - const links = await Link.find({ $or: [{ archived: true }] }).sort({ index: 'asc' }); - res.status(200).json({ data: links }); - } else { - const links = await Link.find({ - $or: [{ archived: false }, { archived: { $exists: false } }] - }).sort({ index: 'asc' }); - res.status(200).json({ data: links }); - } - } catch (error) { - console.error(error); - res.status(400).json({ error: { message: error.message } }); - } - break; - case 'POST': - try { - const link = await Link.create(req.body); - res.status(201).json({ link: link }); - } catch (error) { - console.error(error); - res.status(400).json({ error: { message: error.message } }); - } - break; - default: - res.setHeader('Allow', ['GET', 'POST']); - res.status(405).json({ error: { message: `Method ${method} Not Allowed` } }); - break; - } -}); diff --git a/pages/api/redirects/[id]/index.ts b/pages/api/redirects/[id]/index.ts deleted file mode 100644 index 234db7b..0000000 --- a/pages/api/redirects/[id]/index.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { withApiAuthRequired } from '@auth0/nextjs-auth0'; -import type { NextApiRequest, NextApiResponse } from 'next'; - -import dbConnect from '~/lib/database'; -import Redirect, { IRedirect } from '~/models/Redirect'; - -type Error = { - error: { - message: string; - }; -}; - -type Success = { redirect: IRedirect }; - -type Response = Success | Error; - -export default withApiAuthRequired(async (req: NextApiRequest, res: NextApiResponse) => { - const { - query: { id }, - method - } = req; - - if (Array.isArray(id)) { - return res.status(400).json({ error: { message: "ID field can't be a list" } }); - } - - await dbConnect(); - - switch (method) { - case 'GET': - try { - const redirect: IRedirect = await Redirect.findById(id); - - if (!redirect) { - return res.status(404).json({ error: { message: 'Redirect not found' } }); - } - res.status(200).json({ redirect }); - } catch (error) { - console.error(error); - res.status(400).json({ error: { message: error.message } }); - } - break; - - case 'PUT': - try { - const redirect: IRedirect = await Redirect.findByIdAndUpdate( - id, - { ...req.body, updated: Date.now() }, - { - new: true, - runValidators: true - } - ); - if (!redirect) { - return res.status(404).json({ error: { message: 'Redirect not found' } }); - } - res.status(200).json({ redirect }); - } catch (error) { - console.error(error); - res.status(400).json({ error: { message: error.message } }); - } - break; - - case 'DELETE': - try { - const deleted = await Redirect.findByIdAndDelete(id); - if (!deleted) { - return res.status(400).json({ error: { message: 'Form could not be deleted' } }); - } - res.status(204).end(); - } catch (error) { - console.error(error); - res.status(400).json({ error: { message: error.message } }); - } - break; - default: - res.setHeader('Allow', ['GET', 'PUT', 'DELETE']); - res.status(405).json({ - error: { message: `Method ${method} Not Allowed` } - }); - break; - } -}); diff --git a/pages/api/redirects/[id]/url.ts b/pages/api/redirects/[id]/url.ts deleted file mode 100644 index b2d5f86..0000000 --- a/pages/api/redirects/[id]/url.ts +++ /dev/null @@ -1,51 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from 'next'; - -import dbConnect from '~/lib/database'; -import Redirect, { IRedirect } from '~/models/Redirect'; - -type Error = { - error: { - message: string; - }; -}; - -type Success = { - url: string; -}; - -type Response = Success | Error; - -export default async (req: NextApiRequest, res: NextApiResponse) => { - const { - query: { id: slug }, - method - } = req; - - await dbConnect(); - - switch (method) { - case 'GET': - try { - const redirect: IRedirect = await Redirect.findOneAndUpdate( - { slug }, - { $inc: { visits: 1 } }, - { new: true } - ); - - if (!redirect) { - return res.status(404).json({ error: { message: 'Redirect not found' } }); - } - res.status(200).json({ url: redirect.url }); - } catch (error) { - console.error(error); - res.status(400).json({ error: { message: error.message } }); - } - break; - default: - res.setHeader('Allow', ['GET']); - res.status(405).json({ - error: { message: `Method ${method} Not Allowed` } - }); - break; - } -}; diff --git a/pages/api/redirects/index.ts b/pages/api/redirects/index.ts deleted file mode 100644 index e06784a..0000000 --- a/pages/api/redirects/index.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { withApiAuthRequired } from '@auth0/nextjs-auth0'; -import type { NextApiRequest, NextApiResponse } from 'next'; - -import dbConnect from '~/lib/database'; -import Redirect, { IRedirect } from '~/models/Redirect'; - -type Error = { - error: { - message: string; - }; -}; - -type Success = { redirect: IRedirect } | { data: IRedirect[] }; - -type Response = Success | Error; - -export default withApiAuthRequired(async (req: NextApiRequest, res: NextApiResponse) => { - const { method } = req; - - await dbConnect(); - - switch (method) { - case 'GET': - try { - const redirects = await Redirect.find({}).sort({ created: 'asc' }); - res.status(200).json({ data: redirects }); - } catch (error) { - console.error(error); - res.status(400).json({ error: { message: error.message } }); - } - break; - case 'POST': - try { - const redirect = await Redirect.create(req.body); - res.status(201).json({ redirect: redirect }); - } catch (error) { - console.error(error); - res.status(400).json({ error: { message: error.message } }); - } - break; - default: - res.setHeader('Allow', ['GET', 'POST']); - res.status(405).json({ - error: { message: `Method ${method} Not Allowed` } - }); - break; - } -}); diff --git a/pages/index.tsx b/pages/index.tsx deleted file mode 100644 index a372cae..0000000 --- a/pages/index.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import type { GetStaticProps, InferGetStaticPropsType, NextPage } from 'next'; -import Image from 'next/image'; - -import Card from '~/components/Card'; -import Layout from '~/components/Layout'; -import dbConnect from '~/lib/database'; -import { pick } from '~/lib/utils'; -import Link, { ILink } from '~/models/Link'; -import styles from '~/styles/Home.module.css'; - -export const getStaticProps: GetStaticProps<{ links: ILink[] }> = async () => { - await dbConnect(); - - const result = await Link.find({ - $or: [{ archived: false }, { archived: { $exists: false } }] - }).sort({ - index: 'asc' - }); - const links = result.map((doc) => { - const link = doc.toObject(); - - return pick(link, ['id', 'emoji', 'title', 'link', 'attention']) as ILink; - }); - - return { props: { links }, revalidate: 5 }; -}; - -const Home: NextPage> = ({ links }) => ( - - CeSIUM's T-shirt 2020/21 - -

CeSIUM

- -

Centro de Estudantes de Engenharia Informática da UMinho

- -
- {links.map((link) => ( - - ))} -
-
-); - -export default Home; diff --git a/priv/gettext/en/LC_MESSAGES/errors.po b/priv/gettext/en/LC_MESSAGES/errors.po new file mode 100644 index 0000000..844c4f5 --- /dev/null +++ b/priv/gettext/en/LC_MESSAGES/errors.po @@ -0,0 +1,112 @@ +## `msgid`s in this file come from POT (.pot) files. +## +## Do not add, change, or remove `msgid`s manually here as +## they're tied to the ones in the corresponding POT file +## (with the same domain). +## +## Use `mix gettext.extract --merge` or `mix gettext.merge` +## to merge POT files into PO files. +msgid "" +msgstr "" +"Language: en\n" + +## From Ecto.Changeset.cast/4 +msgid "can't be blank" +msgstr "" + +## From Ecto.Changeset.unique_constraint/3 +msgid "has already been taken" +msgstr "" + +## From Ecto.Changeset.put_change/3 +msgid "is invalid" +msgstr "" + +## From Ecto.Changeset.validate_acceptance/3 +msgid "must be accepted" +msgstr "" + +## From Ecto.Changeset.validate_format/3 +msgid "has invalid format" +msgstr "" + +## From Ecto.Changeset.validate_subset/3 +msgid "has an invalid entry" +msgstr "" + +## From Ecto.Changeset.validate_exclusion/3 +msgid "is reserved" +msgstr "" + +## From Ecto.Changeset.validate_confirmation/3 +msgid "does not match confirmation" +msgstr "" + +## From Ecto.Changeset.no_assoc_constraint/3 +msgid "is still associated with this entry" +msgstr "" + +msgid "are still associated with this entry" +msgstr "" + +## From Ecto.Changeset.validate_length/3 +msgid "should have %{count} item(s)" +msgid_plural "should have %{count} item(s)" +msgstr[0] "" +msgstr[1] "" + +msgid "should be %{count} character(s)" +msgid_plural "should be %{count} character(s)" +msgstr[0] "" +msgstr[1] "" + +msgid "should be %{count} byte(s)" +msgid_plural "should be %{count} byte(s)" +msgstr[0] "" +msgstr[1] "" + +msgid "should have at least %{count} item(s)" +msgid_plural "should have at least %{count} item(s)" +msgstr[0] "" +msgstr[1] "" + +msgid "should be at least %{count} character(s)" +msgid_plural "should be at least %{count} character(s)" +msgstr[0] "" +msgstr[1] "" + +msgid "should be at least %{count} byte(s)" +msgid_plural "should be at least %{count} byte(s)" +msgstr[0] "" +msgstr[1] "" + +msgid "should have at most %{count} item(s)" +msgid_plural "should have at most %{count} item(s)" +msgstr[0] "" +msgstr[1] "" + +msgid "should be at most %{count} character(s)" +msgid_plural "should be at most %{count} character(s)" +msgstr[0] "" +msgstr[1] "" + +msgid "should be at most %{count} byte(s)" +msgid_plural "should be at most %{count} byte(s)" +msgstr[0] "" +msgstr[1] "" + +## From Ecto.Changeset.validate_number/3 +msgid "must be less than %{number}" +msgstr "" + +msgid "must be greater than %{number}" +msgstr "" + +msgid "must be less than or equal to %{number}" +msgstr "" + +msgid "must be greater than or equal to %{number}" +msgstr "" + +msgid "must be equal to %{number}" +msgstr "" diff --git a/priv/gettext/errors.pot b/priv/gettext/errors.pot new file mode 100644 index 0000000..eef2de2 --- /dev/null +++ b/priv/gettext/errors.pot @@ -0,0 +1,109 @@ +## This is a PO Template file. +## +## `msgid`s here are often extracted from source code. +## Add new translations manually only if they're dynamic +## translations that can't be statically extracted. +## +## Run `mix gettext.extract` to bring this file up to +## date. Leave `msgstr`s empty as changing them here has no +## effect: edit them in PO (`.po`) files instead. +## From Ecto.Changeset.cast/4 +msgid "can't be blank" +msgstr "" + +## From Ecto.Changeset.unique_constraint/3 +msgid "has already been taken" +msgstr "" + +## From Ecto.Changeset.put_change/3 +msgid "is invalid" +msgstr "" + +## From Ecto.Changeset.validate_acceptance/3 +msgid "must be accepted" +msgstr "" + +## From Ecto.Changeset.validate_format/3 +msgid "has invalid format" +msgstr "" + +## From Ecto.Changeset.validate_subset/3 +msgid "has an invalid entry" +msgstr "" + +## From Ecto.Changeset.validate_exclusion/3 +msgid "is reserved" +msgstr "" + +## From Ecto.Changeset.validate_confirmation/3 +msgid "does not match confirmation" +msgstr "" + +## From Ecto.Changeset.no_assoc_constraint/3 +msgid "is still associated with this entry" +msgstr "" + +msgid "are still associated with this entry" +msgstr "" + +## From Ecto.Changeset.validate_length/3 +msgid "should have %{count} item(s)" +msgid_plural "should have %{count} item(s)" +msgstr[0] "" +msgstr[1] "" + +msgid "should be %{count} character(s)" +msgid_plural "should be %{count} character(s)" +msgstr[0] "" +msgstr[1] "" + +msgid "should be %{count} byte(s)" +msgid_plural "should be %{count} byte(s)" +msgstr[0] "" +msgstr[1] "" + +msgid "should have at least %{count} item(s)" +msgid_plural "should have at least %{count} item(s)" +msgstr[0] "" +msgstr[1] "" + +msgid "should be at least %{count} character(s)" +msgid_plural "should be at least %{count} character(s)" +msgstr[0] "" +msgstr[1] "" + +msgid "should be at least %{count} byte(s)" +msgid_plural "should be at least %{count} byte(s)" +msgstr[0] "" +msgstr[1] "" + +msgid "should have at most %{count} item(s)" +msgid_plural "should have at most %{count} item(s)" +msgstr[0] "" +msgstr[1] "" + +msgid "should be at most %{count} character(s)" +msgid_plural "should be at most %{count} character(s)" +msgstr[0] "" +msgstr[1] "" + +msgid "should be at most %{count} byte(s)" +msgid_plural "should be at most %{count} byte(s)" +msgstr[0] "" +msgstr[1] "" + +## From Ecto.Changeset.validate_number/3 +msgid "must be less than %{number}" +msgstr "" + +msgid "must be greater than %{number}" +msgstr "" + +msgid "must be less than or equal to %{number}" +msgstr "" + +msgid "must be greater than or equal to %{number}" +msgstr "" + +msgid "must be equal to %{number}" +msgstr "" diff --git a/priv/repo/migrations/.formatter.exs b/priv/repo/migrations/.formatter.exs new file mode 100644 index 0000000..49f9151 --- /dev/null +++ b/priv/repo/migrations/.formatter.exs @@ -0,0 +1,4 @@ +[ + import_deps: [:ecto_sql], + inputs: ["*.exs"] +] diff --git a/priv/repo/migrations/20240418190329_create_redirects.exs b/priv/repo/migrations/20240418190329_create_redirects.exs new file mode 100644 index 0000000..168b2f5 --- /dev/null +++ b/priv/repo/migrations/20240418190329_create_redirects.exs @@ -0,0 +1,19 @@ +defmodule CesiumLink.Repo.Migrations.CreateRedirects do + use Ecto.Migration + + def change do + create table(:redirects, primary_key: false) do + add :id, :binary_id, primary_key: true + add :name, :string + add :slug, :string + add :url, :string + add :visits, :integer + add :type, :string + add :edited_at, :utc_datetime + + timestamps(type: :utc_datetime) + end + + create unique_index(:redirects, [:slug, :type]) + end +end diff --git a/priv/repo/migrations/20240418234531_create_links.exs b/priv/repo/migrations/20240418234531_create_links.exs new file mode 100644 index 0000000..20ece26 --- /dev/null +++ b/priv/repo/migrations/20240418234531_create_links.exs @@ -0,0 +1,19 @@ +defmodule CesiumLink.Repo.Migrations.CreateLinks do + use Ecto.Migration + + def change do + create table(:links, primary_key: false) do + add :id, :binary_id, primary_key: true + add :name, :string + add :emoji, :string + add :url, :string + add :visits, :integer + add :index, :integer + add :attention, :boolean, default: false, null: false + add :archived, :boolean, default: false, null: false + add :edited_at, :utc_datetime + + timestamps(type: :utc_datetime) + end + end +end diff --git a/priv/repo/migrations/20240419191956_create_users_auth_tables.exs b/priv/repo/migrations/20240419191956_create_users_auth_tables.exs new file mode 100644 index 0000000..0e8217a --- /dev/null +++ b/priv/repo/migrations/20240419191956_create_users_auth_tables.exs @@ -0,0 +1,25 @@ +defmodule CesiumLink.Repo.Migrations.CreateUsersAuthTables do + use Ecto.Migration + + def change do + execute "CREATE EXTENSION IF NOT EXISTS citext", "" + + create table(:users) do + add :email, :citext, null: false + timestamps(type: :utc_datetime) + end + + create unique_index(:users, [:email]) + + create table(:users_tokens) do + add :user_id, references(:users, on_delete: :delete_all), null: false + add :token, :binary, null: false + add :context, :string, null: false + add :sent_to, :string + timestamps(updated_at: false) + end + + create index(:users_tokens, [:user_id]) + create unique_index(:users_tokens, [:context, :token]) + end +end diff --git a/priv/repo/seeds.exs b/priv/repo/seeds.exs new file mode 100644 index 0000000..9aaca26 --- /dev/null +++ b/priv/repo/seeds.exs @@ -0,0 +1,20 @@ +defmodule CesiumLink.Repo.Seeds do + @moduledoc """ + Script for populating the database. + You can run it as: + $ mix run priv/repo/seeds.exs # or mix ecto.seed + """ + @seeds_dir "priv/repo/seeds" + + def run do + [ + "links.exs", + "redirects.exs" + ] + |> Enum.each(fn file -> + Code.require_file("#{@seeds_dir}/#{file}") + end) + end +end + +CesiumLink.Repo.Seeds.run() diff --git a/priv/repo/seeds/links.exs b/priv/repo/seeds/links.exs new file mode 100644 index 0000000..a2d09a4 --- /dev/null +++ b/priv/repo/seeds/links.exs @@ -0,0 +1,100 @@ +defmodule CesiumLink.Repo.Seeds.Links do + alias CesiumLink.Repo + alias CesiumLink.Links + alias CesiumLink.Links.Link + + @links [ + %{ + name: "Calendarium", + emoji: "date", + url: "https://calendario.cesium.di.uminho.pt" + }, + %{ + name: "CeSIUM Store", + emoji: "shopping_trolley", + url: "https://store.cesium.di.uminho.pt" + }, + %{ + name: "CeSIUM Pelo Mundo", + emoji: "world_map", + url: "https://pelomundo.cesium.di.uminho.pt" + }, + %{ + name: "CoderDojo Braga", + emoji: "yin_yang", + url: "https://coderdojobraga.org" + }, + %{ + name: "Periférico", + emoji: "studio_microphone", + url: "https://periferico.cesium.di.uminho.pt" + }, + %{ + name: "About Us", + emoji: "star", + url: "https://cesium.di.uminho.pt/about" + } + ] + + @archived_links [ + %{ + name: "SEI", + emoji: "robot_face", + url: "https://seium.org" + }, + %{ + name: "JOIN", + emoji: "ladybug", + url: "https://join.di.uminho.pt" + }, + %{ + name: "Hackathon Bugsbyte", + emoji: "beetle", + url: "https://bugsbyte.org" + }, + %{ + name: "Codeweek", + emoji: "minidisc", + url: "https://codeweek.cesium.di.uminho.pt" + } + ] + + def run do + case Repo.all(Link) do + [] -> + seed_links() + seed_archived_links() + + _ -> + Mix.shell().error("Found links, aborting seeding links.") + end + end + + def seed_links do + Enum.each(@links, fn link -> + Link.changeset( + %Link{}, + link + |> Map.put(:edited_at, DateTime.utc_now()) + |> Map.put(:index, Links.get_next_link_index()) + |> Map.put(:visits, :rand.uniform(1000)) + ) + |> Repo.insert() + end) + end + + def seed_archived_links do + Enum.each(@archived_links, fn link -> + Link.changeset( + %Link{}, + link + |> Map.put(:edited_at, DateTime.utc_now()) + |> Map.put(:visits, :rand.uniform(1000)) + |> Map.put(:archived, true) + ) + |> Repo.insert() + end) + end +end + +CesiumLink.Repo.Seeds.Links.run() diff --git a/priv/repo/seeds/redirects.exs b/priv/repo/seeds/redirects.exs new file mode 100644 index 0000000..757ed57 --- /dev/null +++ b/priv/repo/seeds/redirects.exs @@ -0,0 +1,85 @@ +defmodule CesiumLink.Repo.Seeds.Redirects do + alias CesiumLink.Repo + alias CesiumLink.Redirects.Redirect + + @redirects [ + %{ + name: "CeSIUM Store", + slug: "store", + type: :default, + url: "https://store.cesium.di.uminho.pt" + }, + %{ + name: "SEI", + slug: "sei", + type: :default, + url: "https://seium.org" + }, + %{ + name: "LIP Script", + slug: "lip.sh", + type: :default, + url: "https://raw.githubusercontent.com/cesium/LIP/master/install.sh" + }, + %{ + name: "log/CeSIUM", + slug: "log", + type: :default, + url: "https://issuu.com/cesiuminho" + }, + %{ + name: "Recrutamento", + slug: "recrutamento", + type: :form, + url: "https://docs.google.com/forms" + }, + %{ + name: "Recrutamento de colaboradores", + slug: "recrutamento", + type: :form, + url: "https://docs.google.com/forms" + }, + %{ + name: "Inscrição de sócios", + slug: "socios", + type: :form, + url: "https://docs.google.com/forms" + }, + %{ + name: "Recrutamento CoderDojo Braga", + slug: "coderdojo", + type: :form, + url: "https://docs.google.com/forms" + }, + %{ + name: "Requisição de material", + slug: "material", + type: :form, + url: "https://docs.google.com/forms" + } + ] + + def run do + case Repo.all(Redirect) do + [] -> + seed_redirects() + + _ -> + Mix.shell().error("Found links, aborting seeding links.") + end + end + + defp seed_redirects do + Enum.each(@redirects, fn redirect -> + Redirect.changeset( + %Redirect{}, + redirect + |> Map.put(:edited_at, DateTime.utc_now()) + |> Map.put(:visits, :rand.uniform(1000)) + ) + |> Repo.insert() + end) + end +end + +CesiumLink.Repo.Seeds.Redirects.run() diff --git a/priv/static/favicon.ico b/priv/static/favicon.ico new file mode 100644 index 0000000..7f372bf Binary files /dev/null and b/priv/static/favicon.ico differ diff --git a/public/2020.png b/priv/static/images/cesium-badge.png similarity index 100% rename from public/2020.png rename to priv/static/images/cesium-badge.png diff --git a/priv/static/images/cesium-link.svg b/priv/static/images/cesium-link.svg new file mode 100644 index 0000000..8255fcd --- /dev/null +++ b/priv/static/images/cesium-link.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/cesium.svg b/priv/static/images/cesium-logo.svg similarity index 100% rename from public/cesium.svg rename to priv/static/images/cesium-logo.svg diff --git a/priv/static/images/cesium.svg b/priv/static/images/cesium.svg new file mode 100644 index 0000000..84d2c8e --- /dev/null +++ b/priv/static/images/cesium.svg @@ -0,0 +1,47 @@ + + + + + CeSIUM + + + + + + + + + + diff --git a/priv/static/images/google.svg b/priv/static/images/google.svg new file mode 100644 index 0000000..813405a --- /dev/null +++ b/priv/static/images/google.svg @@ -0,0 +1 @@ + diff --git a/priv/static/images/socials/facebook.svg b/priv/static/images/socials/facebook.svg new file mode 100644 index 0000000..3e9e4ec --- /dev/null +++ b/priv/static/images/socials/facebook.svg @@ -0,0 +1 @@ +Facebook \ No newline at end of file diff --git a/priv/static/images/socials/github.svg b/priv/static/images/socials/github.svg new file mode 100644 index 0000000..cb58bb4 --- /dev/null +++ b/priv/static/images/socials/github.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/priv/static/images/socials/instagram.svg b/priv/static/images/socials/instagram.svg new file mode 100644 index 0000000..5c0384e --- /dev/null +++ b/priv/static/images/socials/instagram.svg @@ -0,0 +1 @@ +Instagram \ No newline at end of file diff --git a/priv/static/images/socials/x.svg b/priv/static/images/socials/x.svg new file mode 100644 index 0000000..15b652e --- /dev/null +++ b/priv/static/images/socials/x.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/priv/static/robots.txt b/priv/static/robots.txt new file mode 100644 index 0000000..26e06b5 --- /dev/null +++ b/priv/static/robots.txt @@ -0,0 +1,5 @@ +# See https://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file +# +# To ban all spiders from the entire site uncomment the next two lines: +# User-agent: * +# Disallow: / diff --git a/public/cesium.png b/public/cesium.png deleted file mode 100644 index e79406f..0000000 Binary files a/public/cesium.png and /dev/null differ diff --git a/public/favicon.ico b/public/favicon.ico deleted file mode 100644 index 19373ae..0000000 Binary files a/public/favicon.ico and /dev/null differ diff --git a/public/humans.txt b/public/humans.txt deleted file mode 100644 index 9825e9a..0000000 --- a/public/humans.txt +++ /dev/null @@ -1,36 +0,0 @@ - - . - -/##/:- - .:/#########/-. - -- .-/############/:- - .:/####/:. .:/############/-. - -:###########/:- .-/############/:. - .:/##################/-. .:/############/-. - -:#########################/:- .-/############/:. - -/###########/:. .:/###########/- -##############/. - /- -/#####/- -/#/:- .-/####/:- .-/############/:. .-: - ###/:. .-. .:/########/-. .-. .:/############/-. -:/##/ - #######: -/############/:-/############/:- .-/######/ - #######/ :/:. .:/#####################/-. .:/#########/ - #######/ :###/:- .-/##############/:- .-/############/: - #######/ :#######/-. .:/#######/:. .:/############/-. - #######/ :##########/:- .-/#:- -/############/:- - #######/ .:/############/- .:/############/-. - ########/:- .-/###########: /##########/:- .-. :. - ############/-. .:/#######: /#######/:. .:/##- ###/- - -/############/: .-/####: /####:- -/######- ####/:. - /:. .:/########## ./-. .:/: //:. .:/#########- #/-. .:/ - ####:- .-/####### .###/:. -/############/. .-/###/ - #######/:. .:/### .#######- /############/:. .:/######/ - ##########/:- .-/ .#######: /#########:- -/##########/ - :/############/-. .#######: /#######. .:/############/- - -/############//#######: /####### -###########/:- - .:/#################: /####### -########/:. - .-/##############: /####### -####/:- - .:/##########: /####### -#/:. - .-/#######: /######/ - -:/###: /###/:. - .-/: //- - - CeSIUM - Centro de Estudantes de Informática - diff --git a/public/logo.png b/public/logo.png deleted file mode 100644 index 11f8b69..0000000 Binary files a/public/logo.png and /dev/null differ diff --git a/public/logo.svg b/public/logo.svg deleted file mode 100644 index b434b63..0000000 --- a/public/logo.svg +++ /dev/null @@ -1 +0,0 @@ -cesium \ No newline at end of file diff --git a/rel/env.sh.eex b/rel/env.sh.eex new file mode 100755 index 0000000..2bdface --- /dev/null +++ b/rel/env.sh.eex @@ -0,0 +1,8 @@ +#!/bin/sh + +# configure node for distributed erlang with IPV6 support +export ERL_AFLAGS="-proto_dist inet6_tcp" +export ECTO_IPV6="true" +export DNS_CLUSTER_QUERY="${FLY_APP_NAME}.internal" +export RELEASE_DISTRIBUTION="name" +export RELEASE_NODE="${FLY_APP_NAME}-${FLY_IMAGE_REF##*-}@${FLY_PRIVATE_IP}" diff --git a/rel/overlays/bin/migrate b/rel/overlays/bin/migrate new file mode 100755 index 0000000..026e458 --- /dev/null +++ b/rel/overlays/bin/migrate @@ -0,0 +1,5 @@ +#!/bin/sh +set -eu + +cd -P -- "$(dirname -- "$0")" +exec ./cesium_link eval CesiumLink.Release.migrate diff --git a/rel/overlays/bin/migrate.bat b/rel/overlays/bin/migrate.bat new file mode 100755 index 0000000..29ac3d2 --- /dev/null +++ b/rel/overlays/bin/migrate.bat @@ -0,0 +1 @@ +call "%~dp0\cesium_link" eval CesiumLink.Release.migrate diff --git a/rel/overlays/bin/server b/rel/overlays/bin/server new file mode 100755 index 0000000..c480e75 --- /dev/null +++ b/rel/overlays/bin/server @@ -0,0 +1,5 @@ +#!/bin/sh +set -eu + +cd -P -- "$(dirname -- "$0")" +PHX_SERVER=true exec ./cesium_link start diff --git a/rel/overlays/bin/server.bat b/rel/overlays/bin/server.bat new file mode 100755 index 0000000..0dec749 --- /dev/null +++ b/rel/overlays/bin/server.bat @@ -0,0 +1,2 @@ +set PHX_SERVER=true +call "%~dp0\cesium_link" start diff --git a/scripts/colors.sh b/scripts/colors.sh new file mode 100644 index 0000000..4bcb2ac --- /dev/null +++ b/scripts/colors.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash + +RED=$(tput setaf 1) +ORANGE=$(tput setaf 3) +GREEN=$(tput setaf 2) +PURPLE=$(tput setaf 5) +CYAN=$(tput setaf 4) +BLUE=$(tput setaf 6) +WHITE=$(tput setaf 7) +BOLD=$(tput bold) +RESET=$(tput sgr0) \ No newline at end of file diff --git a/scripts/helpers.sh b/scripts/helpers.sh new file mode 100644 index 0000000..c4e096c --- /dev/null +++ b/scripts/helpers.sh @@ -0,0 +1,34 @@ +#!/usr/bin/env bash + +set -Eeuo pipefail + +import() { + local -r SCRIPTS_DIR=$(dirname "${BASH_SOURCE[0]:-$0}") + + # shellcheck source=/dev/null + . "${SCRIPTS_DIR}/${1}" +} + +# shellcheck source=./colors.sh +import colors.sh + +function display_version() { + local program="${2:-$(basename "$0")}" + local version=${1:?"You need to give a version number"} + + if [ -x "$(command -v figlet)" ]; then + echo -n "${BLUE}${BOLD}" + figlet "${program} script" + echo -n "${RESET}" + echo "version ${version}" + else + echo "${program} script version ${version}" + fi +} + +function help_title_section() { + local -r TITLE=$(echo "$@" | tr '[:lower:]' '[:upper:]') + echo -e "${BOLD}${TITLE}${RESET}" +} + +[ "$0" = "${BASH_SOURCE[0]}" ] && display_version 0.5.5 || true \ No newline at end of file diff --git a/scripts/logging.sh b/scripts/logging.sh new file mode 100644 index 0000000..0b3472c --- /dev/null +++ b/scripts/logging.sh @@ -0,0 +1,55 @@ +#!/usr/bin/env bash + +set -Eeuo pipefail + +import() { + local -r SCRIPTS_DIR=$(dirname "${BASH_SOURCE[0]:-$0}") + + # shellcheck source=/dev/null + . "${SCRIPTS_DIR}/${1}" +} + +# shellcheck source=./helpers.sh +import helpers.sh + +function __log() { + local LABEL="$1" + local COLOR="$2" + shift 2 + local MSG=("$@") + + local SIZE + [[ $(tput cols) -ge 80 ]] && SIZE=80 || SIZE=$(tput cols) + + # Get symbols from https://coolsymbol.com/ + printf "_${COLOR}${BOLD}${LABEL}${RESET}_╞%*s\n" $((SIZE - ${#LABEL} - 3)) " " | sed -e 's/ /═/g' | sed -e 's/_/ /g' + for M in "${MSG[@]}"; do + echo "• $M" + done + printf "%*s\n" "$SIZE" " " | sed -e 's/ /═/g' +} + +function log_error() { + __log "FAIL" "$RED" "$@" +} + +function log_warn() { + __log "WARN" "$ORANGE" "$@" +} + +function log_success() { + __log "OK" "$GREEN" "$@" +} + +function log_info() { + local LABEL="INFO" + + if ! [ "$#" -eq 1 ]; then + LABEL=$(echo "$1" | tr '[:lower:]' '[:upper:]') + shift 1 + fi + + __log "${LABEL}" "$CYAN" "$@" +} + +[ "$0" = "${BASH_SOURCE[0]}" ] && display_version 0.5.5 || true \ No newline at end of file diff --git a/scripts/utils.sh b/scripts/utils.sh new file mode 100644 index 0000000..5c318b2 --- /dev/null +++ b/scripts/utils.sh @@ -0,0 +1,55 @@ +#!/usr/bin/env bash + +set -Eeuo pipefail + +import() { + local -r SCRIPTS_DIR=$(dirname "${BASH_SOURCE[0]:-$0}") + + # shellcheck source=/dev/null + . "${SCRIPTS_DIR}/${1}" +} + +# shellcheck source=./helpers.sh +import helpers.sh + +function not_installed() { + [ ! -x "$(command -v "$@")" ] +} + +function load_env_file() { + local file="${1:-.env}" + if [ -f "$file" ]; then + log_info "Environment" "Loading ${BLUE}${file}${RESET}..." $(cat "${file}") + set -o allexport + source "$file" + set +o allexport + else + log_warn "${file} file not found, skipping..." + fi +} + +function ask_for_sudo() { + # Ask for the administrator password upfront. + sudo -v &>/dev/null + + # Update existing `sudo` time stamp + # until this script has finished. + # + # https://gist.github.com/cowboy/3118588 + while true; do + sudo -n true + sleep 60 + kill -0 "$$" || exit + done &>/dev/null & +} + +function ensure_confirmation() { + read -r "confirmation?please confirm you want to continue [y/n] (default: y) " + confirmation=${confirmation:-"y"} + + if [ "$confirmation" != "y" ]; then + exit 1 + fi +} + +[ "$0" = "${BASH_SOURCE[0]}" ] && display_version 0.5.5 || true \ No newline at end of file diff --git a/services/ApiService.ts b/services/ApiService.ts deleted file mode 100644 index 102a0fe..0000000 --- a/services/ApiService.ts +++ /dev/null @@ -1,87 +0,0 @@ -import axios, { AxiosInstance, AxiosPromise } from 'axios'; - -import { IForm } from '~/models/Form'; -import { ILink } from '~/models/Link'; -import { IRedirect } from '~/models/Redirect'; - -export class ApiService { - axios: AxiosInstance; - - constructor(base_url: string) { - this.axios = axios.create({ - baseURL: base_url, - responseType: 'json', - headers: { - 'Content-Type': 'application/json' - } - }); - } - - getArchivedLinks = async (): Promise<{ data: ILink[] }> => { - return (await this.axios.get<{ data: ILink[] }>('/api/links?status=archived')).data; - }; - - getLinks = async (): Promise<{ data: ILink[] }> => { - return (await this.axios.get<{ data: ILink[] }>('/api/links')).data; - }; - - getLink = async (id: string): Promise<{ link: ILink }> => { - return (await this.axios.get<{ link: ILink }>(`/api/links/${id}`)).data; - }; - - createLink = async (link: Partial): Promise<{ link: ILink }> => { - return (await this.axios.post<{ link: ILink }>('/api/links', link)).data; - }; - - updateLink = async (link: Partial & Pick): Promise<{ link: ILink }> => { - return (await this.axios.put<{ link: ILink }>(`/api/links/${link.id}`, link)).data; - }; - - deleteLink = async (id: string): Promise<{ link: ILink }> => { - return (await this.axios.delete<{ link: ILink }>(`/api/links/${id}`)).data; - }; - - getForms = async (): Promise<{ data: IForm[] }> => { - return (await this.axios.get<{ data: IForm[] }>('/api/forms')).data; - }; - - getForm = async (id: string): Promise<{ form: IForm }> => { - return (await this.axios.get<{ form: IForm }>(`/api/forms/${id}`)).data; - }; - - createForm = async (form: Partial): Promise<{ form: IForm }> => { - return (await this.axios.post<{ form: IForm }>('/api/forms', form)).data; - }; - - updateForm = async (form: Partial & Pick): Promise<{ form: IForm }> => { - return (await this.axios.put<{ form: IForm }>(`/api/forms/${form.id}`, form)).data; - }; - - deleteForm = async (id: string): Promise<{ form: IForm }> => { - return (await this.axios.delete<{ form: IForm }>(`/api/forms/${id}`)).data; - }; - - getRedirects = async (): Promise<{ data: IRedirect[] }> => { - return (await this.axios.get<{ data: IRedirect[] }>('/api/redirects')).data; - }; - - getRedirect = async (id: string): Promise<{ redirect: IRedirect }> => { - return (await this.axios.get<{ redirect: IRedirect }>(`/api/redirects/${id}`)).data; - }; - - createRedirect = async (redirect: Partial): Promise<{ redirect: IRedirect }> => { - return (await this.axios.post<{ redirect: IRedirect }>('/api/redirects', redirect)).data; - }; - - updateRedirect = async ( - redirect: Partial & Pick - ): Promise<{ redirect: IRedirect }> => { - return ( - await this.axios.put<{ redirect: IRedirect }>(`/api/redirects/${redirect.id}`, redirect) - ).data; - }; - - deleteRedirect = async (id: string): Promise<{ redirect: IRedirect }> => { - return (await this.axios.delete<{ redirect: IRedirect }>(`/api/redirects/${id}`)).data; - }; -} diff --git a/styles/Home.module.css b/styles/Home.module.css deleted file mode 100644 index ba180ed..0000000 --- a/styles/Home.module.css +++ /dev/null @@ -1,43 +0,0 @@ -.title a { - color: #0070f3; - text-decoration: none; -} - -.title a:hover, -.title a:focus, -.title a:active { - text-decoration: underline; -} - -.title { - line-height: 1.15; - font-size: 2rem; -} - -.title, -.description { - margin: 0.3rem; - text-align: center; -} - -.description { - line-height: 1.5; - font-size: 1rem; -} - -.grid { - display: flex; - align-items: center; - justify-content: center; - flex-wrap: wrap; - max-width: 1050px; -} - -@media (max-width: 1050px) { - .grid { - width: 100%; - flex-direction: column; - align-items: center; - justify-content: center; - } -} diff --git a/styles/colors.css b/styles/colors.css deleted file mode 100644 index 3b6c467..0000000 --- a/styles/colors.css +++ /dev/null @@ -1,2 +0,0 @@ -@value blue: #0070f3; -@value orange: #f47c58; diff --git a/styles/globals.css b/styles/globals.css deleted file mode 100644 index 2e49afd..0000000 --- a/styles/globals.css +++ /dev/null @@ -1,18 +0,0 @@ -html, -body { - padding: 0; - margin: 0; - /* stylelint-disable declaration-colon-newline-after, value-list-comma-newline-after */ - font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, Ubuntu, Cantarell, - Fira Sans, Droid Sans, Helvetica Neue, sans-serif; - /* stylelint-enable declaration-colon-newline-after, value-list-comma-newline-after */ -} - -a { - color: inherit; - text-decoration: none; -} - -* { - box-sizing: border-box; -} diff --git a/test/cesium_link/accounts_test.exs b/test/cesium_link/accounts_test.exs new file mode 100644 index 0000000..15012d4 --- /dev/null +++ b/test/cesium_link/accounts_test.exs @@ -0,0 +1,84 @@ +defmodule CesiumLink.AccountsTest do + use CesiumLink.DataCase + + alias CesiumLink.Accounts + + import CesiumLink.AccountsFixtures + alias CesiumLink.Accounts.{User, UserToken} + + describe "get_user_by_email/1" do + test "does not return the user if the email does not exist" do + refute Accounts.get_user_by_email("unknown@example.com") + end + + test "returns the user if the email exists" do + %{id: id} = user = user_fixture() + assert %User{id: ^id} = Accounts.get_user_by_email(user.email) + end + end + + describe "get_user!/1" do + test "raises if id is invalid" do + assert_raise Ecto.NoResultsError, fn -> + Accounts.get_user!(-1) + end + end + + test "returns the user with the given id" do + %{id: id} = user = user_fixture() + assert %User{id: ^id} = Accounts.get_user!(user.id) + end + end + + describe "generate_user_session_token/1" do + setup do + %{user: user_fixture()} + end + + test "generates a token", %{user: user} do + token = Accounts.generate_user_session_token(user) + assert user_token = Repo.get_by(UserToken, token: token) + assert user_token.context == "session" + + # Creating the same token for another user should fail + assert_raise Ecto.ConstraintError, fn -> + Repo.insert!(%UserToken{ + token: user_token.token, + user_id: user_fixture().id, + context: "session" + }) + end + end + end + + describe "get_user_by_session_token/1" do + setup do + user = user_fixture() + token = Accounts.generate_user_session_token(user) + %{user: user, token: token} + end + + test "returns user by token", %{user: user, token: token} do + assert session_user = Accounts.get_user_by_session_token(token) + assert session_user.id == user.id + end + + test "does not return user for invalid token" do + refute Accounts.get_user_by_session_token("oops") + end + + test "does not return user for expired token", %{token: token} do + {1, nil} = Repo.update_all(UserToken, set: [inserted_at: ~N[2020-01-01 00:00:00]]) + refute Accounts.get_user_by_session_token(token) + end + end + + describe "delete_user_session_token/1" do + test "deletes the token" do + user = user_fixture() + token = Accounts.generate_user_session_token(user) + assert Accounts.delete_user_session_token(token) == :ok + refute Accounts.get_user_by_session_token(token) + end + end +end diff --git a/test/cesium_link/links_test.exs b/test/cesium_link/links_test.exs new file mode 100644 index 0000000..84da490 --- /dev/null +++ b/test/cesium_link/links_test.exs @@ -0,0 +1,91 @@ +defmodule CesiumLink.LinksTest do + use CesiumLink.DataCase + + alias CesiumLink.Links + alias CesiumLink.Links.Link + alias Ecto.UUID + + import CesiumLink.LinksFixtures + + describe "list_links/0" do + test "returns all links" do + link = link_fixture() + links = Links.list_links() |> Enum.map(& &1.id) + + assert links == [link.id] + end + end + + describe "get_link!/1" do + test "raises if id is invalid" do + assert_raise Ecto.NoResultsError, fn -> + Links.get_link!(UUID.generate()) + end + end + + test "returns the link with the given id" do + %{id: id} = link = link_fixture() + assert %Link{id: ^id} = Links.get_link!(link.id) + end + end + + describe "archive_link/1" do + test "archives the link" do + link = link_fixture() + assert not link.archived + + Links.archive_link(link) + link = Links.get_link!(link.id) + assert link.archived + end + end + + describe "unarhive_link/1" do + test "unarchives the link" do + link = link_fixture(archived: true) + Links.archive_link(link) + assert link.archived + + Links.unarchive_link(link) + link = Links.get_link!(link.id) + assert not link.archived + end + end + + describe "list_archived_links/0" do + test "returns only archived links" do + archived_links = Links.list_archived_links() + + assert Enum.all?(archived_links, fn link -> link.archived end) + end + end + + describe "list_unarchived_links/0" do + test "returns only unarchived links" do + unarchived_links = Links.list_unarchived_links() + + assert Enum.all?(unarchived_links, fn link -> not link.archived end) + end + end + + describe "get_next_link_index/0" do + test "returns the next index" do + link_fixture(index: 0) + link_fixture(index: 1) + link_fixture(index: 2) + + assert Links.get_next_link_index() == 3 + end + end + + describe "increment_link_visits/1" do + test "increments the number of visits" do + link = link_fixture() + assert link.visits == 0 + + Links.increment_link_visits(link) + link = Links.get_link!(link.id) + assert link.visits == 1 + end + end +end diff --git a/test/cesium_link/redirects_test.exs b/test/cesium_link/redirects_test.exs new file mode 100644 index 0000000..00eb603 --- /dev/null +++ b/test/cesium_link/redirects_test.exs @@ -0,0 +1,38 @@ +defmodule CesiumLink.RedirectsTest do + use CesiumLink.DataCase + + alias CesiumLink.Redirects + alias CesiumLink.Redirects.Redirect + alias Ecto.UUID + + import CesiumLink.RedirectsFixtures + + describe "list_redirects/0" do + test "returns all redirects" do + redirect = redirect_fixture() + redirects = Redirects.list_redirects() |> Enum.map(& &1.id) + + assert redirects == [redirect.id] + end + end + + describe "get_redirect!/1" do + test "raises if id is invalid" do + assert_raise Ecto.NoResultsError, fn -> + Redirects.get_redirect!(UUID.generate()) + end + end + + test "returns the redirect with the given id" do + %{id: id} = redirect = redirect_fixture() + assert %Redirect{id: ^id} = Redirects.get_redirect!(redirect.id) + end + end + + describe "get_redirect_by_slug/1" do + test "returns the redirect with the given slug" do + %{slug: slug} = redirect = redirect_fixture() + assert %Redirect{slug: ^slug} = Redirects.get_redirect_by_slug(redirect.slug) + end + end +end diff --git a/test/cesium_link_web/controllers/error_html_test.exs b/test/cesium_link_web/controllers/error_html_test.exs new file mode 100644 index 0000000..2caddcf --- /dev/null +++ b/test/cesium_link_web/controllers/error_html_test.exs @@ -0,0 +1,14 @@ +defmodule CesiumLinkWeb.ErrorHTMLTest do + use CesiumLinkWeb.ConnCase, async: true + + # Bring render_to_string/4 for testing custom views + import Phoenix.Template + + test "renders 404.html" do + assert render_to_string(CesiumLinkWeb.ErrorHTML, "404", "html", []) == "Not Found" + end + + test "renders 500.html" do + assert render_to_string(CesiumLinkWeb.ErrorHTML, "500", "html", []) == "Internal Server Error" + end +end diff --git a/test/cesium_link_web/controllers/error_json_test.exs b/test/cesium_link_web/controllers/error_json_test.exs new file mode 100644 index 0000000..c589f77 --- /dev/null +++ b/test/cesium_link_web/controllers/error_json_test.exs @@ -0,0 +1,12 @@ +defmodule CesiumLinkWeb.ErrorJSONTest do + use CesiumLinkWeb.ConnCase, async: true + + test "renders 404" do + assert CesiumLinkWeb.ErrorJSON.render("404.json", %{}) == %{errors: %{detail: "Not Found"}} + end + + test "renders 500" do + assert CesiumLinkWeb.ErrorJSON.render("500.json", %{}) == + %{errors: %{detail: "Internal Server Error"}} + end +end diff --git a/test/cesium_link_web/controllers/page_controller_test.exs b/test/cesium_link_web/controllers/page_controller_test.exs new file mode 100644 index 0000000..6957c53 --- /dev/null +++ b/test/cesium_link_web/controllers/page_controller_test.exs @@ -0,0 +1,3 @@ +defmodule CesiumLinkWeb.PageControllerTest do + use CesiumLinkWeb.ConnCase +end diff --git a/test/cesium_link_web/controllers/redirect_controller_test.exs b/test/cesium_link_web/controllers/redirect_controller_test.exs new file mode 100644 index 0000000..d311cb6 --- /dev/null +++ b/test/cesium_link_web/controllers/redirect_controller_test.exs @@ -0,0 +1,14 @@ +defmodule CesiumLinkWeb.RedirectControllerTest do + use CesiumLinkWeb.ConnCase + + import CesiumLink.RedirectsFixtures + + setup do + %{redirect: redirect_fixture()} + end + + test "redirects to the redirect's url", %{conn: conn, redirect: redirect} do + conn = get(conn, ~p"/r/#{redirect.slug}") + assert redirected_to(conn) == redirect.url + end +end diff --git a/test/cesium_link_web/controllers/user_session_controller_test.exs b/test/cesium_link_web/controllers/user_session_controller_test.exs new file mode 100644 index 0000000..d7c17ff --- /dev/null +++ b/test/cesium_link_web/controllers/user_session_controller_test.exs @@ -0,0 +1,25 @@ +defmodule CesiumLinkWeb.UserSessionControllerTest do + use CesiumLinkWeb.ConnCase, async: true + + import CesiumLink.AccountsFixtures + + setup do + %{user: user_fixture()} + end + + describe "DELETE /users/log_out" do + test "logs the user out", %{conn: conn, user: user} do + conn = conn |> log_in_user(user) |> delete(~p"/users/log_out") + assert redirected_to(conn) == ~p"/" + refute get_session(conn, :user_token) + assert Phoenix.Flash.get(conn.assigns.flash, :info) =~ "Logged out successfully" + end + + test "succeeds even if the user is not logged in", %{conn: conn} do + conn = delete(conn, ~p"/users/log_out") + assert redirected_to(conn) == ~p"/" + refute get_session(conn, :user_token) + assert Phoenix.Flash.get(conn.assigns.flash, :info) =~ "Logged out successfully" + end + end +end diff --git a/test/cesium_link_web/live/home_live_test.exs b/test/cesium_link_web/live/home_live_test.exs new file mode 100644 index 0000000..2a368cf --- /dev/null +++ b/test/cesium_link_web/live/home_live_test.exs @@ -0,0 +1,29 @@ +defmodule CesiumLinkWeb.HomeLiveTest do + use CesiumLinkWeb.ConnCase, async: true + + import Phoenix.LiveViewTest + import CesiumLink.LinksFixtures + alias CesiumLink.Links + + describe "Home page" do + test "renders the home page", %{conn: conn} do + {:ok, _, html} = + conn + |> live(~p"/") + + assert html =~ "Centro de Estudantes de Engenharia Informática da UMinho" + end + + test "link click increments visits", %{conn: conn} do + link = link_fixture() + + {:ok, view, _html} = + conn + |> live(~p"/") + + view |> element("#links-#{link.id}") |> render_click() + + assert Links.get_link!(link.id).visits == 1 + end + end +end diff --git a/test/cesium_link_web/live/link_live_test.exs b/test/cesium_link_web/live/link_live_test.exs new file mode 100644 index 0000000..13d5440 --- /dev/null +++ b/test/cesium_link_web/live/link_live_test.exs @@ -0,0 +1,40 @@ +defmodule CesiumLinkWeb.LinkLiveTest do + use CesiumLinkWeb.ConnCase, async: true + + import Phoenix.LiveViewTest + import CesiumLink.LinksFixtures + import CesiumLink.AccountsFixtures + + describe "Links page" do + test "renders the links page", %{conn: conn} do + {:ok, _, html} = + conn + |> log_in_user(user_fixture()) + |> live(~p"/admin/links") + + assert html =~ "Link" + assert html =~ "New Link" + end + + test "renders the link form", %{conn: conn} do + {:ok, _, html} = + conn + |> log_in_user(user_fixture()) + |> live(~p"/admin/links/new") + + assert html =~ "Name" + end + + test "render the link form with a link", %{conn: conn} do + link = link_fixture() + + {:ok, _, html} = + conn + |> log_in_user(user_fixture()) + |> live(~p"/admin/links/#{link.id}/edit") + + assert html =~ "Name" + assert html =~ link.name + end + end +end diff --git a/test/cesium_link_web/live/redirect_live_test.exs b/test/cesium_link_web/live/redirect_live_test.exs new file mode 100644 index 0000000..0cc87c5 --- /dev/null +++ b/test/cesium_link_web/live/redirect_live_test.exs @@ -0,0 +1,40 @@ +defmodule CesiumLinkWeb.RedirectLiveTest do + use CesiumLinkWeb.ConnCase, async: true + + import Phoenix.LiveViewTest + import CesiumLink.RedirectsFixtures + import CesiumLink.AccountsFixtures + + describe "Redirects page" do + test "renders the redirects page", %{conn: conn} do + {:ok, _, html} = + conn + |> log_in_user(user_fixture()) + |> live(~p"/admin/redirects") + + assert html =~ "Redirect" + assert html =~ "New Redirect" + end + + test "renders the redirect form", %{conn: conn} do + {:ok, _, html} = + conn + |> log_in_user(user_fixture()) + |> live(~p"/admin/redirects/new") + + assert html =~ "Name" + end + + test "render the redirect form with a redirect", %{conn: conn} do + redirect = redirect_fixture() + + {:ok, _, html} = + conn + |> log_in_user(user_fixture()) + |> live(~p"/admin/redirects/#{redirect.id}/edit") + + assert html =~ "Name" + assert html =~ redirect.name + end + end +end diff --git a/test/cesium_link_web/live/user_login_live_test.exs b/test/cesium_link_web/live/user_login_live_test.exs new file mode 100644 index 0000000..887d789 --- /dev/null +++ b/test/cesium_link_web/live/user_login_live_test.exs @@ -0,0 +1,24 @@ +defmodule CesiumLinkWeb.UserLoginLiveTest do + use CesiumLinkWeb.ConnCase, async: true + + import Phoenix.LiveViewTest + import CesiumLink.AccountsFixtures + + describe "Log in page" do + test "renders log in page", %{conn: conn} do + {:ok, _lv, html} = live(conn, ~p"/admin") + + assert html =~ "Sign in with Google" + end + + test "redirects if already logged in", %{conn: conn} do + result = + conn + |> log_in_user(user_fixture()) + |> live(~p"/admin") + |> follow_redirect(conn, "/admin/links") + + assert {:ok, _conn} = result + end + end +end diff --git a/test/cesium_link_web/user_auth_test.exs b/test/cesium_link_web/user_auth_test.exs new file mode 100644 index 0000000..80f740e --- /dev/null +++ b/test/cesium_link_web/user_auth_test.exs @@ -0,0 +1,273 @@ +defmodule CesiumLinkWeb.UserAuthTest do + use CesiumLinkWeb.ConnCase, async: true + + alias CesiumLink.Accounts + alias CesiumLinkWeb.UserAuth + alias Phoenix.LiveView + + import CesiumLink.AccountsFixtures + + @remember_me_cookie "_cesium_link_web_user_remember_me" + + setup %{conn: conn} do + conn = + conn + |> Map.replace!(:secret_key_base, CesiumLinkWeb.Endpoint.config(:secret_key_base)) + |> init_test_session(%{}) + + %{user: user_fixture(), conn: conn} + end + + describe "log_in_user/3" do + test "stores the user token in the session", %{conn: conn, user: user} do + conn = UserAuth.log_in_user(conn, user) + assert token = get_session(conn, :user_token) + assert get_session(conn, :live_socket_id) == "users_sessions:#{Base.url_encode64(token)}" + assert redirected_to(conn) == ~p"/admin/links" + assert Accounts.get_user_by_session_token(token) + end + + test "clears everything previously stored in the session", %{conn: conn, user: user} do + conn = conn |> put_session(:to_be_removed, "value") |> UserAuth.log_in_user(user) + refute get_session(conn, :to_be_removed) + end + + test "redirects to the configured path", %{conn: conn, user: user} do + conn = conn |> put_session(:user_return_to, "/hello") |> UserAuth.log_in_user(user) + assert redirected_to(conn) == "/hello" + end + + test "writes a cookie if remember_me is configured", %{conn: conn, user: user} do + conn = conn |> fetch_cookies() |> UserAuth.log_in_user(user, %{"remember_me" => "true"}) + assert get_session(conn, :user_token) == conn.cookies[@remember_me_cookie] + + assert %{value: signed_token, max_age: max_age} = conn.resp_cookies[@remember_me_cookie] + assert signed_token != get_session(conn, :user_token) + assert max_age == 5_184_000 + end + end + + describe "logout_user/1" do + test "erases session and cookies", %{conn: conn, user: user} do + user_token = Accounts.generate_user_session_token(user) + + conn = + conn + |> put_session(:user_token, user_token) + |> put_req_cookie(@remember_me_cookie, user_token) + |> fetch_cookies() + |> UserAuth.log_out_user() + + refute get_session(conn, :user_token) + refute conn.cookies[@remember_me_cookie] + assert %{max_age: 0} = conn.resp_cookies[@remember_me_cookie] + assert redirected_to(conn) == ~p"/" + refute Accounts.get_user_by_session_token(user_token) + end + + test "broadcasts to the given live_socket_id", %{conn: conn} do + live_socket_id = "users_sessions:abcdef-token" + CesiumLinkWeb.Endpoint.subscribe(live_socket_id) + + conn + |> put_session(:live_socket_id, live_socket_id) + |> UserAuth.log_out_user() + + assert_receive %Phoenix.Socket.Broadcast{event: "disconnect", topic: ^live_socket_id} + end + + test "works even if user is already logged out", %{conn: conn} do + conn = conn |> fetch_cookies() |> UserAuth.log_out_user() + refute get_session(conn, :user_token) + assert %{max_age: 0} = conn.resp_cookies[@remember_me_cookie] + assert redirected_to(conn) == ~p"/" + end + end + + describe "fetch_current_user/2" do + test "authenticates user from session", %{conn: conn, user: user} do + user_token = Accounts.generate_user_session_token(user) + conn = conn |> put_session(:user_token, user_token) |> UserAuth.fetch_current_user([]) + assert conn.assigns.current_user.id == user.id + end + + test "authenticates user from cookies", %{conn: conn, user: user} do + logged_in_conn = + conn |> fetch_cookies() |> UserAuth.log_in_user(user, %{"remember_me" => "true"}) + + user_token = logged_in_conn.cookies[@remember_me_cookie] + %{value: signed_token} = logged_in_conn.resp_cookies[@remember_me_cookie] + + conn = + conn + |> put_req_cookie(@remember_me_cookie, signed_token) + |> UserAuth.fetch_current_user([]) + + assert conn.assigns.current_user.id == user.id + assert get_session(conn, :user_token) == user_token + + assert get_session(conn, :live_socket_id) == + "users_sessions:#{Base.url_encode64(user_token)}" + end + + test "does not authenticate if data is missing", %{conn: conn, user: user} do + _ = Accounts.generate_user_session_token(user) + conn = UserAuth.fetch_current_user(conn, []) + refute get_session(conn, :user_token) + refute conn.assigns.current_user + end + end + + describe "on_mount :mount_current_user" do + test "assigns current_user based on a valid user_token", %{conn: conn, user: user} do + user_token = Accounts.generate_user_session_token(user) + session = conn |> put_session(:user_token, user_token) |> get_session() + + {:cont, updated_socket} = + UserAuth.on_mount(:mount_current_user, %{}, session, %LiveView.Socket{}) + + assert updated_socket.assigns.current_user.id == user.id + end + + test "assigns nil to current_user assign if there isn't a valid user_token", %{conn: conn} do + user_token = "invalid_token" + session = conn |> put_session(:user_token, user_token) |> get_session() + + {:cont, updated_socket} = + UserAuth.on_mount(:mount_current_user, %{}, session, %LiveView.Socket{}) + + assert updated_socket.assigns.current_user == nil + end + + test "assigns nil to current_user assign if there isn't a user_token", %{conn: conn} do + session = conn |> get_session() + + {:cont, updated_socket} = + UserAuth.on_mount(:mount_current_user, %{}, session, %LiveView.Socket{}) + + assert updated_socket.assigns.current_user == nil + end + end + + describe "on_mount :ensure_authenticated" do + test "authenticates current_user based on a valid user_token", %{conn: conn, user: user} do + user_token = Accounts.generate_user_session_token(user) + session = conn |> put_session(:user_token, user_token) |> get_session() + + {:cont, updated_socket} = + UserAuth.on_mount(:ensure_authenticated, %{}, session, %LiveView.Socket{}) + + assert updated_socket.assigns.current_user.id == user.id + end + + test "redirects to login page if there isn't a valid user_token", %{conn: conn} do + user_token = "invalid_token" + session = conn |> put_session(:user_token, user_token) |> get_session() + + socket = %LiveView.Socket{ + endpoint: CesiumLinkWeb.Endpoint, + assigns: %{__changed__: %{}, flash: %{}} + } + + {:halt, updated_socket} = UserAuth.on_mount(:ensure_authenticated, %{}, session, socket) + assert updated_socket.assigns.current_user == nil + end + + test "redirects to login page if there isn't a user_token", %{conn: conn} do + session = conn |> get_session() + + socket = %LiveView.Socket{ + endpoint: CesiumLinkWeb.Endpoint, + assigns: %{__changed__: %{}, flash: %{}} + } + + {:halt, updated_socket} = UserAuth.on_mount(:ensure_authenticated, %{}, session, socket) + assert updated_socket.assigns.current_user == nil + end + end + + describe "on_mount :redirect_if_user_is_authenticated" do + test "redirects if there is an authenticated user ", %{conn: conn, user: user} do + user_token = Accounts.generate_user_session_token(user) + session = conn |> put_session(:user_token, user_token) |> get_session() + + assert {:halt, _updated_socket} = + UserAuth.on_mount( + :redirect_if_user_is_authenticated, + %{}, + session, + %LiveView.Socket{} + ) + end + + test "doesn't redirect if there is no authenticated user", %{conn: conn} do + session = conn |> get_session() + + assert {:cont, _updated_socket} = + UserAuth.on_mount( + :redirect_if_user_is_authenticated, + %{}, + session, + %LiveView.Socket{} + ) + end + end + + describe "redirect_if_user_is_authenticated/2" do + test "redirects if user is authenticated", %{conn: conn, user: user} do + conn = conn |> assign(:current_user, user) |> UserAuth.redirect_if_user_is_authenticated([]) + assert conn.halted + assert redirected_to(conn) == ~p"/admin/links" + end + + test "does not redirect if user is not authenticated", %{conn: conn} do + conn = UserAuth.redirect_if_user_is_authenticated(conn, []) + refute conn.halted + refute conn.status + end + end + + describe "require_authenticated_user/2" do + test "redirects if user is not authenticated", %{conn: conn} do + conn = conn |> fetch_flash() |> UserAuth.require_authenticated_user([]) + assert conn.halted + + assert redirected_to(conn) == ~p"/admin" + + assert Phoenix.Flash.get(conn.assigns.flash, :error) == + "You must log in to access this page." + end + + test "stores the path to redirect to on GET", %{conn: conn} do + halted_conn = + %{conn | path_info: ["foo"], query_string: ""} + |> fetch_flash() + |> UserAuth.require_authenticated_user([]) + + assert halted_conn.halted + assert get_session(halted_conn, :user_return_to) == "/foo" + + halted_conn = + %{conn | path_info: ["foo"], query_string: "bar=baz"} + |> fetch_flash() + |> UserAuth.require_authenticated_user([]) + + assert halted_conn.halted + assert get_session(halted_conn, :user_return_to) == "/foo?bar=baz" + + halted_conn = + %{conn | path_info: ["foo"], query_string: "bar", method: "POST"} + |> fetch_flash() + |> UserAuth.require_authenticated_user([]) + + assert halted_conn.halted + refute get_session(halted_conn, :user_return_to) + end + + test "does not redirect if user is authenticated", %{conn: conn, user: user} do + conn = conn |> assign(:current_user, user) |> UserAuth.require_authenticated_user([]) + refute conn.halted + refute conn.status + end + end +end diff --git a/test/support/conn_case.ex b/test/support/conn_case.ex new file mode 100644 index 0000000..006e396 --- /dev/null +++ b/test/support/conn_case.ex @@ -0,0 +1,64 @@ +defmodule CesiumLinkWeb.ConnCase do + @moduledoc """ + This module defines the test case to be used by + tests that require setting up a connection. + + Such tests rely on `Phoenix.ConnTest` and also + import other functionality to make it easier + to build common data structures and query the data layer. + + Finally, if the test case interacts with the database, + we enable the SQL sandbox, so changes done to the database + are reverted at the end of every test. If you are using + PostgreSQL, you can even run database tests asynchronously + by setting `use CesiumLinkWeb.ConnCase, async: true`, although + this option is not recommended for other databases. + """ + + use ExUnit.CaseTemplate + + using do + quote do + # The default endpoint for testing + @endpoint CesiumLinkWeb.Endpoint + + use CesiumLinkWeb, :verified_routes + + # Import conveniences for testing with connections + import Plug.Conn + import Phoenix.ConnTest + import CesiumLinkWeb.ConnCase + end + end + + setup tags do + CesiumLink.DataCase.setup_sandbox(tags) + {:ok, conn: Phoenix.ConnTest.build_conn()} + end + + @doc """ + Setup helper that registers and logs in users. + + setup :register_and_log_in_user + + It stores an updated connection and a registered user in the + test context. + """ + def register_and_log_in_user(%{conn: conn}) do + user = CesiumLink.AccountsFixtures.user_fixture() + %{conn: log_in_user(conn, user), user: user} + end + + @doc """ + Logs the given `user` into the `conn`. + + It returns an updated `conn`. + """ + def log_in_user(conn, user) do + token = CesiumLink.Accounts.generate_user_session_token(user) + + conn + |> Phoenix.ConnTest.init_test_session(%{}) + |> Plug.Conn.put_session(:user_token, token) + end +end diff --git a/test/support/data_case.ex b/test/support/data_case.ex new file mode 100644 index 0000000..2005533 --- /dev/null +++ b/test/support/data_case.ex @@ -0,0 +1,60 @@ +defmodule CesiumLink.DataCase do + @moduledoc """ + This module defines the setup for tests requiring + access to the application's data layer. + + You may define functions here to be used as helpers in + your tests. + + Finally, if the test case interacts with the database, + we enable the SQL sandbox, so changes done to the database + are reverted at the end of every test. If you are using + PostgreSQL, you can even run database tests asynchronously + by setting `use CesiumLink.DataCase, async: true`, although + this option is not recommended for other databases. + """ + + use ExUnit.CaseTemplate + + alias Ecto.Adapters.SQL + + using do + quote do + alias CesiumLink.Repo + + import Ecto + import Ecto.Changeset + import Ecto.Query + import CesiumLink.DataCase + end + end + + setup tags do + CesiumLink.DataCase.setup_sandbox(tags) + :ok + end + + @doc """ + Sets up the sandbox based on the test tags. + """ + def setup_sandbox(tags) do + pid = SQL.Sandbox.start_owner!(CesiumLink.Repo, shared: not tags[:async]) + on_exit(fn -> SQL.Sandbox.stop_owner(pid) end) + end + + @doc """ + A helper that transforms changeset errors into a map of messages. + + assert {:error, changeset} = Accounts.create_user(%{password: "short"}) + assert "password is too short" in errors_on(changeset).password + assert %{password: ["password is too short"]} = errors_on(changeset) + + """ + def errors_on(changeset) do + Ecto.Changeset.traverse_errors(changeset, fn {message, opts} -> + Regex.replace(~r"%{(\w+)}", message, fn _, key -> + opts |> Keyword.get(String.to_existing_atom(key), key) |> to_string() + end) + end) + end +end diff --git a/test/support/fixtures/accounts_fixtures.ex b/test/support/fixtures/accounts_fixtures.ex new file mode 100644 index 0000000..62e3062 --- /dev/null +++ b/test/support/fixtures/accounts_fixtures.ex @@ -0,0 +1,29 @@ +defmodule CesiumLink.AccountsFixtures do + @moduledoc """ + This module defines test helpers for creating + entities via the `CesiumLink.Accounts` context. + """ + + def unique_user_email, do: "user#{System.unique_integer()}@example.com" + + def valid_user_attributes(attrs \\ %{}) do + Enum.into(attrs, %{ + email: unique_user_email() + }) + end + + def user_fixture(attrs \\ %{}) do + {:ok, user} = + attrs + |> valid_user_attributes() + |> CesiumLink.Accounts.register_user() + + user + end + + def extract_user_token(fun) do + {:ok, captured_email} = fun.(&"[TOKEN]#{&1}[TOKEN]") + [_, token | _] = String.split(captured_email.text_body, "[TOKEN]") + token + end +end diff --git a/test/support/fixtures/links_fixtures.ex b/test/support/fixtures/links_fixtures.ex new file mode 100644 index 0000000..3ced31a --- /dev/null +++ b/test/support/fixtures/links_fixtures.ex @@ -0,0 +1,26 @@ +defmodule CesiumLink.LinksFixtures do + @moduledoc """ + This module defines test helpers for creating + entities via the `CesiumLink.LinksFixtures` context. + """ + + def valid_link_attributes(attrs \\ %{}) do + Enum.into(attrs, %{ + name: "some name", + url: "https://example.com", + index: 1, + emoji: "an emoji", + archived: false, + edited_at: DateTime.utc_now() + }) + end + + def link_fixture(attrs \\ %{}) do + {:ok, link} = + attrs + |> valid_link_attributes() + |> CesiumLink.Links.create_link() + + link + end +end diff --git a/test/support/fixtures/redirects_fixtures.ex b/test/support/fixtures/redirects_fixtures.ex new file mode 100644 index 0000000..27153c3 --- /dev/null +++ b/test/support/fixtures/redirects_fixtures.ex @@ -0,0 +1,25 @@ +defmodule CesiumLink.RedirectsFixtures do + @moduledoc """ + This module defines test helpers for creating + entities via the `CesiumLink.RedirectsFixtures` context. + """ + + def valid_redirect_attributes(attrs \\ %{}) do + Enum.into(attrs, %{ + name: "some name", + slug: "slug", + url: "https://example.com", + type: "default", + edited_at: DateTime.utc_now() + }) + end + + def redirect_fixture(attrs \\ %{}) do + {:ok, redirect} = + attrs + |> valid_redirect_attributes() + |> CesiumLink.Redirects.create_redirect() + + redirect + end +end diff --git a/test/test_helper.exs b/test/test_helper.exs new file mode 100644 index 0000000..eafd459 --- /dev/null +++ b/test/test_helper.exs @@ -0,0 +1,2 @@ +ExUnit.start() +Ecto.Adapters.SQL.Sandbox.mode(CesiumLink.Repo, :manual) diff --git a/tsconfig.json b/tsconfig.json deleted file mode 100644 index c022feb..0000000 --- a/tsconfig.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "compilerOptions": { - "target": "es5", - "lib": ["dom", "dom.iterable", "esnext"], - "allowJs": true, - "skipLibCheck": true, - "strict": false, - "forceConsistentCasingInFileNames": true, - "noEmit": true, - "module": "esnext", - "moduleResolution": "node", - "resolveJsonModule": true, - "esModuleInterop": true, - "isolatedModules": true, - "jsx": "preserve", - "baseUrl": ".", - "paths": { - "~/components/*": ["components/*"], - "~/data/*": ["data/*"], - "~/hooks/*": ["hooks/*"], - "~/layouts/*": ["layouts/*"], - "~/lib/*": ["lib/*"], - "~/models/*": ["models/*"], - "~/services/*": ["services/*"], - "~/styles/*": ["styles/*"], - "~/utils/*": ["utils/*"] - }, - "incremental": true - }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], - "exclude": ["node_modules"] -}
+ // + plugin(({addVariant}) => addVariant("phx-no-feedback", [".phx-no-feedback&", ".phx-no-feedback &"])), + plugin(({addVariant}) => addVariant("phx-click-loading", [".phx-click-loading&", ".phx-click-loading &"])), + plugin(({addVariant}) => addVariant("phx-submit-loading", [".phx-submit-loading&", ".phx-submit-loading &"])), + plugin(({addVariant}) => addVariant("phx-change-loading", [".phx-change-loading&", ".phx-change-loading &"])), + + // Embeds Heroicons (https://heroicons.com) into your app.css bundle + // See your `CoreComponents.icon/1` for more information. + // + plugin(function({matchComponents, theme}) { + let iconsDir = path.join(__dirname, "../deps/heroicons/optimized") + let values = {} + let icons = [ + ["", "/24/outline"], + ["-solid", "/24/solid"], + ["-mini", "/20/solid"], + ["-micro", "/16/solid"] + ] + icons.forEach(([suffix, dir]) => { + fs.readdirSync(path.join(iconsDir, dir)).forEach(file => { + let name = path.basename(file, ".svg") + suffix + values[name] = {name, fullPath: path.join(iconsDir, dir, file)} + }) + }) + matchComponents({ + "hero": ({name, fullPath}) => { + let content = fs.readFileSync(fullPath).toString().replace(/\r?\n|\r/g, "") + let size = theme("spacing.6") + if (name.endsWith("-mini")) { + size = theme("spacing.5") + } else if (name.endsWith("-micro")) { + size = theme("spacing.4") + } + return { + [`--hero-${name}`]: `url('data:image/svg+xml;utf8,${content}')`, + "-webkit-mask": `var(--hero-${name})`, + "mask": `var(--hero-${name})`, + "mask-repeat": "no-repeat", + "background-color": "currentColor", + "vertical-align": "middle", + "display": "inline-block", + "width": size, + "height": size + } + } + }, {values}) + }) + ] +} diff --git a/assets/vendor/emojimart.js b/assets/vendor/emojimart.js new file mode 100644 index 0000000..6dbcada --- /dev/null +++ b/assets/vendor/emojimart.js @@ -0,0 +1,2 @@ +!function(){function e(e,t,r,n){Object.defineProperty(e,t,{get:r,set:n,enumerable:!0,configurable:!0})}function t(e){return e&&e.__esModule?e.default:e}var r={};function n(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function o(e,t,r,n,o,i,a){try{var s=e[i](a),c=s.value}catch(e){return void r(e)}s.done?t(c):Promise.resolve(c).then(n,o)}function i(e){return function(){var t=this,r=arguments;return new Promise((function(n,i){var a=e.apply(t,r);function s(e){o(a,n,i,s,c,"next",e)}function c(e){o(a,n,i,s,c,"throw",e)}s(void 0)}))}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function s(e,t){for(var r=0;re.length)&&(t=e.length);for(var r=0,n=new Array(t);r=0;--i){var a=this.tryEntries[i],s=a.completion;if("root"===a.tryLoc)return o("end");if(a.tryLoc<=this.prev){var c=n.call(a,"catchLoc"),l=n.call(a,"finallyLoc");if(c&&l){if(this.prev=0;--r){var o=this.tryEntries[r];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev=0;--t){var r=this.tryEntries[t];if(r.finallyLoc===e)return this.complete(r.completion,r.afterLoc),L(r),v}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var r=this.tryEntries[t];if(r.tryLoc===e){var n=r.completion;if("throw"===n.type){var o=n.arg;L(r)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(e,r,n){return this.delegate={iterator:z(e),resultName:r,nextLoc:n},"next"===this.method&&(this.arg=t),v}},e}(z);try{regeneratorRuntime=E}catch(e){"object"==typeof globalThis?globalThis.regeneratorRuntime=E:Function("r","regeneratorRuntime = r")(E)}var P,R,O,B,A,T,H={},I=[],D=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;function F(e,t){for(var r in t)e[r]=t[r];return e}function V(e){var t=e.parentNode;t&&t.removeChild(e)}function U(e,t,r){var n,o,i,a={};for(i in t)"key"==i?n=t[i]:"ref"==i?o=t[i]:a[i]=t[i];if(arguments.length>2&&(a.children=arguments.length>3?P.call(arguments,2):r),"function"==typeof e&&null!=e.defaultProps)for(i in e.defaultProps)void 0===a[i]&&(a[i]=e.defaultProps[i]);return N(e,a,n,o,null)}function N(e,t,r,n,o){var i={type:e,props:t,key:r,ref:n,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:null==o?++O:o};return null==o&&null!=R.vnode&&R.vnode(i),i}function q(e){return e.children}function W(e,t){this.props=e,this.context=t}function G(e,t){if(null==t)return e.__?G(e.__,e.__.__k.indexOf(e)+1):null;for(var r;t0?N(p.type,p.props,p.key,null,p.__v):p)){if(p.__=r,p.__b=r.__b+1,null===(h=m[u])||h&&p.key==h.key&&p.type===h.type)m[u]=void 0;else for(d=0;d<_;d++){if((h=m[d])&&p.key==h.key&&p.type===h.type){m[d]=void 0;break}h=null}oe(e,p,h=h||H,o,i,a,s,c,l),f=p.__e,(d=p.ref)&&h.ref!=d&&(g||(g=[]),h.ref&&g.push(h.ref,null,p),g.push(d,p.__c||f,p)),null!=f?(null==v&&(v=f),"function"==typeof p.type&&p.__k===h.__k?p.__d=c=J(p,c,e):c=Q(e,p,h,m,f,c),"function"==typeof r.type&&(r.__d=c)):c&&h.__e==c&&c.parentNode!=e&&(c=G(h))}for(r.__e=v,u=_;u--;)null!=m[u]&&("function"==typeof r.type&&null!=m[u].__e&&m[u].__e==r.__d&&(r.__d=G(n,u+1)),se(m[u],m[u]));if(g)for(u=0;u=o)return!1;var a=t+i/4%t,s=Math.floor(i/4/t),c=e.getImageData(a,s,1,1).data;return n[i]===c[0]&&n[i+2]===c[2]&&!(e.measureText(r).width>=t)}}(),me={latestVersion:function(){var e=!0,t=!1,r=void 0;try{for(var n,o=fe[Symbol.iterator]();!(e=(n=o.next()).done);e=!0){var i=n.value,a=i.v;if(ve(i.emoji))return a}}catch(e){t=!0,r=e}finally{try{e||null==o.return||o.return()}finally{if(t)throw r}}},noCountryFlags:function(){return!ve("🇨🇦")}},_e=["+1","grinning","kissing_heart","heart_eyes","laughing","stuck_out_tongue_winking_eye","sweat_smile","joy","scream","disappointed","unamused","weary","sob","sunglasses","heart"],be=null;var ye,ke={add:function(e){be||(be=he.get("frequently")||{});var t=e.id||e;t&&(be[t]||(be[t]=0),be[t]+=1,he.set("last",t),he.set("frequently",be))},get:function(e){var t=e.maxFrequentRows,r=e.perLine;if(!t)return[];be||(be=he.get("frequently"));var n=[];if(!be){for(var o in be={},_e.slice(0,r)){var i=_e[o];be[i]=r-o,n.push(i)}return n}var a=t*r,s=he.get("last");for(var c in be)n.push(c);if(n.sort((function(e,t){var r=be[t],n=be[e];return r==n?e.localeCompare(t):r-n})),n.length>a){var l=n.slice(a);n=n.slice(0,a);var u=!0,d=!1,h=void 0;try{for(var p,f=l[Symbol.iterator]();!(u=(p=f.next()).done);u=!0){var v=p.value;v!=s&&delete be[v]}}catch(e){d=!0,h=e}finally{try{u||null==f.return||f.return()}finally{if(d)throw h}}s&&-1==n.indexOf(s)&&(delete be[n[n.length-1]],n.splice(-1,1,s)),he.set("frequently",be)}return n},DEFAULTS:_e};ye=JSON.parse('{"search":"Search","search_no_results_1":"Oh no!","search_no_results_2":"That emoji couldn’t be found","pick":"Pick an emoji…","add_custom":"Add custom emoji","categories":{"activity":"Activity","custom":"Custom","flags":"Flags","foods":"Food & Drink","frequent":"Frequently used","nature":"Animals & Nature","objects":"Objects","people":"Smileys & People","places":"Travel & Places","search":"Search Results","symbols":"Symbols"},"skins":{"1":"Default","2":"Light","3":"Medium-Light","4":"Medium","5":"Medium-Dark","6":"Dark","choose":"Choose default skin tone"}}');var we={autoFocus:{value:!1},dynamicWidth:{value:!1},emojiButtonColors:{value:null},emojiButtonRadius:{value:"100%"},emojiButtonSize:{value:36},emojiSize:{value:24},emojiVersion:{value:15,choices:[1,2,3,4,5,11,12,12.1,13,13.1,14,15]},exceptEmojis:{value:[]},icons:{value:"auto",choices:["auto","outline","solid"]},locale:{value:"en",choices:["en","ar","be","cs","de","es","fa","fi","fr","hi","it","ja","ko","nl","pl","pt","ru","sa","tr","uk","vi","zh"]},maxFrequentRows:{value:4},navPosition:{value:"top",choices:["top","bottom","none"]},noCountryFlags:{value:!1},noResultsEmoji:{value:null},perLine:{value:9},previewEmoji:{value:null},previewPosition:{value:"bottom",choices:["top","bottom","none"]},searchPosition:{value:"sticky",choices:["sticky","static","none"]},set:{value:"native",choices:["native","apple","facebook","google","twitter"]},skin:{value:1,choices:[1,2,3,4,5,6]},skinTonePosition:{value:"preview",choices:["preview","search","none"]},theme:{value:"auto",choices:["auto","light","dark"]},categories:null,categoryIcons:null,custom:null,data:null,i18n:null,getImageURL:null,getSpritesheetURL:null,onAddCustomEmoji:null,onClickOutside:null,onEmojiSelect:null,stickySearch:{deprecated:!0,value:!0}},xe=null,Ce=null,Se={};function je(e){return Le.apply(this,arguments)}function Le(){return(Le=i(t(z).mark((function e(r){var n,o;return t(z).wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!Se[r]){e.next=2;break}return e.abrupt("return",Se[r]);case 2:return e.next=4,fetch(r);case 4:return n=e.sent,e.next=7,n.json();case 7:return o=e.sent,Se[r]=o,e.abrupt("return",o);case 10:case"end":return e.stop()}}),e)})))).apply(this,arguments)}var Me=null,ze=null,Ee=!1;function Pe(e){var t=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:{}).caller;return Me||(Me=new Promise((function(e){ze=e}))),e?Re(e):t&&!Ee&&console.warn("`".concat(t,"` requires data to be initialized first. Promise will be pending until `init` is called.")),Me}function Re(e){return Oe.apply(this,arguments)}function Oe(){return(Oe=i(t(z).mark((function e(r){var n,o,i,a,s,c,l,u,d,h,p,f,v,g,m,_,y,k,w,x,C,S,j,L,M,E,P,R,O,B,A,T,H,I,D,F,V,U,N,q,W,G,K;return t(z).wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(Ee=!0,n=r.emojiVersion,o=r.set,i=r.locale,n||(n=we.emojiVersion.value),o||(o=we.set.value),i||(i=we.locale.value),Ce){e.next=36;break}if("function"!=typeof r.data){e.next=12;break}return e.next=9,r.data();case 9:e.t1=e.sent,e.next=13;break;case 12:e.t1=r.data;case 13:if(e.t0=e.t1,e.t0){e.next=18;break}return e.next=17,je("https://cdn.jsdelivr.net/npm/@emoji-mart/data@latest/sets/".concat(n,"/").concat(o,".json"));case 17:e.t0=e.sent;case 18:(Ce=e.t0).emoticons={},Ce.natives={},Ce.categories.unshift({id:"frequent",emojis:[]}),e.t2=regeneratorRuntime.keys(Ce.aliases);case 23:if((e.t3=e.t2()).done){e.next=33;break}if(a=e.t3.value,s=Ce.aliases[a],c=Ce.emojis[s]){e.next=29;break}return e.abrupt("continue",23);case 29:c.aliases||(c.aliases=[]),c.aliases.push(a),e.next=23;break;case 33:Ce.originalCategories=Ce.categories,e.next=37;break;case 36:Ce.categories=Ce.categories.filter((function(e){return!!!e.name}));case 37:if("function"!=typeof r.i18n){e.next=43;break}return e.next=40,r.i18n();case 40:e.t5=e.sent,e.next=44;break;case 43:e.t5=r.i18n;case 44:if(e.t4=e.t5,e.t4){e.next=54;break}if("en"!=i){e.next=50;break}e.t6=t(ye),e.next=53;break;case 50:return e.next=52,je("https://cdn.jsdelivr.net/npm/@emoji-mart/data@latest/i18n/".concat(i,".json"));case 52:e.t6=e.sent;case 53:e.t4=e.t6;case 54:if(xe=e.t4,!r.custom){e.next=87;break}e.t7=regeneratorRuntime.keys(r.custom);case 57:if((e.t8=e.t7()).done){e.next=87;break}if(l=e.t8.value,l=parseInt(l),u=r.custom[l],d=r.custom[l-1],u.emojis&&u.emojis.length){e.next=64;break}return e.abrupt("continue",57);case 64:for(u.id||(u.id="custom_".concat(l+1)),u.name||(u.name=xe.categories.custom),d&&!u.icon&&(u.target=d.target||d),Ce.categories.push(u),h=!0,p=!1,f=void 0,e.prev=69,v=u.emojis[Symbol.iterator]();!(h=(g=v.next()).done);h=!0)m=g.value,Ce.emojis[m.id]=m;e.next=77;break;case 73:e.prev=73,e.t9=e.catch(69),p=!0,f=e.t9;case 77:e.prev=77,e.prev=78,h||null==v.return||v.return();case 80:if(e.prev=80,!p){e.next=83;break}throw f;case 83:return e.finish(80);case 84:return e.finish(77);case 85:e.next=57;break;case 87:r.categories&&(Ce.categories=Ce.originalCategories.filter((function(e){return-1!=r.categories.indexOf(e.id)})).sort((function(e,t){return r.categories.indexOf(e.id)-r.categories.indexOf(t.id)}))),_=null,y=null,"native"==o&&(_=me.latestVersion(),y=r.noCountryFlags||me.noCountryFlags()),k=Ce.categories.length,w=!1;case 93:if(!k--){e.next=179;break}if("frequent"==(x=Ce.categories[k]).id&&(C=r.maxFrequentRows,S=r.perLine,C=C>=0?C:we.maxFrequentRows.value,S||(S=we.perLine.value),x.emojis=ke.get({maxFrequentRows:C,perLine:S})),x.emojis&&x.emojis.length){e.next=99;break}return Ce.categories.splice(k,1),e.abrupt("continue",93);case 99:(j=r.categoryIcons)&&(L=j[x.id])&&!x.icon&&(x.icon=L),M=x.emojis.length;case 102:if(!M--){e.next=177;break}if(E=x.emojis[M],P=E.id?E:Ce.emojis[E],R=function(){x.emojis.splice(M,1)},!(!P||r.exceptEmojis&&r.exceptEmojis.includes(P.id))){e.next=109;break}return R(),e.abrupt("continue",102);case 109:if(!(_&&P.version>_)){e.next=112;break}return R(),e.abrupt("continue",102);case 112:if(!y||"flags"!=x.id){e.next=116;break}if(De.includes(P.id)){e.next=116;break}return R(),e.abrupt("continue",102);case 116:if(P.search){e.next=175;break}if(w=!0,P.search=","+[[P.id,!1],[P.name,!0],[P.keywords,!1],[P.emoticons,!1]].map((function(e){var t=b(e,2),r=t[0],n=t[1];if(r)return(Array.isArray(r)?r:[r]).map((function(e){return(n?e.split(/[-|_|\s]+/):[e]).map((function(e){return e.toLowerCase()}))})).flat()})).flat().filter((function(e){return e&&e.trim()})).join(","),O=!0,B=!1,A=void 0,!P.emoticons){e.next=145;break}e.prev=121,T=P.emoticons[Symbol.iterator]();case 123:if(O=(H=T.next()).done){e.next=131;break}if(I=H.value,!Ce.emoticons[I]){e.next=127;break}return e.abrupt("continue",128);case 127:Ce.emoticons[I]=P.id;case 128:O=!0,e.next=123;break;case 131:e.next=137;break;case 133:e.prev=133,e.t10=e.catch(121),B=!0,A=e.t10;case 137:e.prev=137,e.prev=138,O||null==T.return||T.return();case 140:if(e.prev=140,!B){e.next=143;break}throw A;case 143:return e.finish(140);case 144:return e.finish(137);case 145:D=0,F=!0,V=!1,U=void 0,e.prev=147,N=P.skins[Symbol.iterator]();case 149:if(F=(q=N.next()).done){e.next=161;break}if(W=q.value){e.next=153;break}return e.abrupt("continue",158);case 153:D++,(G=W.native)&&(Ce.natives[G]=P.id,P.search+=",".concat(G)),K=1==D?"":":skin-tone-".concat(D,":"),W.shortcodes=":".concat(P.id,":").concat(K);case 158:F=!0,e.next=149;break;case 161:e.next=167;break;case 163:e.prev=163,e.t11=e.catch(147),V=!0,U=e.t11;case 167:e.prev=167,e.prev=168,F||null==N.return||N.return();case 170:if(e.prev=170,!V){e.next=173;break}throw U;case 173:return e.finish(170);case 174:return e.finish(167);case 175:e.next=102;break;case 177:e.next=93;break;case 179:w&&Ie.reset(),ze();case 181:case"end":return e.stop()}}),e,null,[[69,73,77,85],[78,,80,84],[121,133,137,145],[138,,140,144],[147,163,167,175],[168,,170,174]])})))).apply(this,arguments)}function Be(e,t,r){e||(e={});var n={};for(var o in t)n[o]=Ae(o,e,t,r);return n}function Ae(e,t,r,n){var o=r[e],i=n&&n.getAttribute(e)||(null!=t[e]&&null!=t[e]?t[e]:null);return o?(null!=i&&o.value&&j(o.value)!=(void 0===i?"undefined":j(i))&&(i="boolean"==typeof o.value?"false"!=i:o.value.constructor(i)),o.transform&&i&&(i=o.transform(i)),(null==i||o.choices&&-1==o.choices.indexOf(i))&&(i=o.value),i):i}var Te=null;function He(){return He=i(t(z).mark((function e(r){var n,o,i,a,s,c,l,u,d,h,p,f,v,g,m,_,b,y,k,w,x=arguments;return t(z).wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=x.length>1&&void 0!==x[1]?x[1]:{},o=n.maxResults,i=n.caller,r&&r.trim().length){e.next=3;break}return e.abrupt("return",null);case 3:return o||(o=90),e.next=6,Pe(null,{caller:i||"SearchIndex.search"});case 6:if((a=r.toLowerCase().replace(/(\w)-/,"$1 ").split(/[\s|,]+/).filter((function(e,t,r){return e.trim()&&r.indexOf(e)==t}))).length){e.next=9;break}return e.abrupt("return");case 9:s=Te||(Te=Object.values(Ce.emojis)),u=!0,d=!1,h=void 0,e.prev=12,p=a[Symbol.iterator]();case 14:if(u=(f=p.next()).done){e.next=54;break}if(v=f.value,s.length){e.next=18;break}return e.abrupt("break",54);case 18:c=[],l={},g=!0,m=!1,_=void 0,e.prev=21,b=s[Symbol.iterator]();case 23:if(g=(y=b.next()).done){e.next=36;break}if((k=y.value).search){e.next=27;break}return e.abrupt("continue",33);case 27:if(-1!=(w=k.search.indexOf(",".concat(v)))){e.next=30;break}return e.abrupt("continue",33);case 30:c.push(k),l[k.id]||(l[k.id]=0),l[k.id]+=k.id==v?0:w+1;case 33:g=!0,e.next=23;break;case 36:e.next=42;break;case 38:e.prev=38,e.t0=e.catch(21),m=!0,_=e.t0;case 42:e.prev=42,e.prev=43,g||null==b.return||b.return();case 45:if(e.prev=45,!m){e.next=48;break}throw _;case 48:return e.finish(45);case 49:return e.finish(42);case 50:s=c;case 51:u=!0,e.next=14;break;case 54:e.next=60;break;case 56:e.prev=56,e.t1=e.catch(12),d=!0,h=e.t1;case 60:e.prev=60,e.prev=61,u||null==p.return||p.return();case 63:if(e.prev=63,!d){e.next=66;break}throw h;case 66:return e.finish(63);case 67:return e.finish(60);case 68:if(!(c.length<2)){e.next=70;break}return e.abrupt("return",c);case 70:return c.sort((function(e,t){var r=l[e.id],n=l[t.id];return r==n?e.id.localeCompare(t.id):r-n})),c.length>o&&(c=c.slice(0,o)),e.abrupt("return",c);case 73:case"end":return e.stop()}}),e,null,[[12,56,60,68],[21,38,42,50],[43,,45,49],[61,,63,67]])}))),He.apply(this,arguments)}var Ie={search:function(e){return He.apply(this,arguments)},get:function(e){return e.id?e:Ce.emojis[e]||Ce.emojis[Ce.aliases[e]]||Ce.emojis[Ce.natives[e]]},reset:function(){Te=null},SHORTCODES_REGEX:/^(?:\:([^\:]+)\:)(?:\:skin-tone-(\d)\:)?$/},De=["checkered_flag","crossed_flags","pirate_flag","rainbow-flag","transgender_flag","triangular_flag_on_post","waving_black_flag","waving_white_flag"];function Fe(){return Ve.apply(this,arguments)}function Ve(){return Ve=i(t(z).mark((function e(){var r,n=arguments;return t(z).wrap((function(e){for(;;)switch(e.prev=e.next){case 0:r=n.length>0&&void 0!==n[0]?n[0]:1,e.t0=regeneratorRuntime.keys(w(Array(r).keys()));case 2:if((e.t1=e.t0()).done){e.next=8;break}return e.t1.value,e.next=6,new Promise(requestAnimationFrame);case 6:e.next=2;break;case 8:case"end":return e.stop()}}),e)}))),Ve.apply(this,arguments)}function Ue(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=t.skinIndex,n=void 0===r?0:r,o=e.skins[n]||(n=0,e.skins[n]),i={id:e.id,name:e.name,native:o.native,unified:o.unified,keywords:e.keywords,shortcodes:o.shortcodes||e.shortcodes};return e.skins.length>1&&(i.skin=n+1),o.src&&(i.src=o.src),e.aliases&&e.aliases.length&&(i.aliases=e.aliases),e.emoticons&&e.emoticons.length&&(i.emoticons=e.emoticons),i}function Ne(e){return qe.apply(this,arguments)}function qe(){return(qe=i(t(z).mark((function e(r){var n,o,i,a,s,c,l,u;return t(z).wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Ie.search(r,{maxResults:1,caller:"getEmojiDataFromNative"});case 2:if((n=e.sent)&&n.length){e.next=5;break}return e.abrupt("return",null);case 5:o=n[0],i=0,a=!0,s=!1,c=void 0,e.prev=8,l=o.skins[Symbol.iterator]();case 10:if(a=(u=l.next()).done){e.next=18;break}if(u.value.native!=r){e.next=14;break}return e.abrupt("break",18);case 14:i++;case 15:a=!0,e.next=10;break;case 18:e.next=24;break;case 20:e.prev=20,e.t0=e.catch(8),s=!0,c=e.t0;case 24:e.prev=24,e.prev=25,a||null==l.return||l.return();case 27:if(e.prev=27,!s){e.next=30;break}throw c;case 30:return e.finish(27);case 31:return e.finish(24);case 32:return e.abrupt("return",Ue(o,{skinIndex:i}));case 33:case"end":return e.stop()}}),e,null,[[8,20,24,32],[25,,27,31]])})))).apply(this,arguments)}var We={categories:{activity:{outline:de("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",children:de("path",{d:"M12 0C5.373 0 0 5.372 0 12c0 6.627 5.373 12 12 12 6.628 0 12-5.373 12-12 0-6.628-5.372-12-12-12m9.949 11H17.05c.224-2.527 1.232-4.773 1.968-6.113A9.966 9.966 0 0 1 21.949 11M13 11V2.051a9.945 9.945 0 0 1 4.432 1.564c-.858 1.491-2.156 4.22-2.392 7.385H13zm-2 0H8.961c-.238-3.165-1.536-5.894-2.393-7.385A9.95 9.95 0 0 1 11 2.051V11zm0 2v8.949a9.937 9.937 0 0 1-4.432-1.564c.857-1.492 2.155-4.221 2.393-7.385H11zm4.04 0c.236 3.164 1.534 5.893 2.392 7.385A9.92 9.92 0 0 1 13 21.949V13h2.04zM4.982 4.887C5.718 6.227 6.726 8.473 6.951 11h-4.9a9.977 9.977 0 0 1 2.931-6.113M2.051 13h4.9c-.226 2.527-1.233 4.771-1.969 6.113A9.972 9.972 0 0 1 2.051 13m16.967 6.113c-.735-1.342-1.744-3.586-1.968-6.113h4.899a9.961 9.961 0 0 1-2.931 6.113"})}),solid:de("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",children:de("path",{d:"M16.17 337.5c0 44.98 7.565 83.54 13.98 107.9C35.22 464.3 50.46 496 174.9 496c9.566 0 19.59-.4707 29.84-1.271L17.33 307.3C16.53 317.6 16.17 327.7 16.17 337.5zM495.8 174.5c0-44.98-7.565-83.53-13.98-107.9c-4.688-17.54-18.34-31.23-36.04-35.95C435.5 27.91 392.9 16 337 16c-9.564 0-19.59 .4707-29.84 1.271l187.5 187.5C495.5 194.4 495.8 184.3 495.8 174.5zM26.77 248.8l236.3 236.3c142-36.1 203.9-150.4 222.2-221.1L248.9 26.87C106.9 62.96 45.07 177.2 26.77 248.8zM256 335.1c0 9.141-7.474 16-16 16c-4.094 0-8.188-1.564-11.31-4.689L164.7 283.3C161.6 280.2 160 276.1 160 271.1c0-8.529 6.865-16 16-16c4.095 0 8.189 1.562 11.31 4.688l64.01 64C254.4 327.8 256 331.9 256 335.1zM304 287.1c0 9.141-7.474 16-16 16c-4.094 0-8.188-1.564-11.31-4.689L212.7 235.3C209.6 232.2 208 228.1 208 223.1c0-9.141 7.473-16 16-16c4.094 0 8.188 1.562 11.31 4.688l64.01 64.01C302.5 279.8 304 283.9 304 287.1zM256 175.1c0-9.141 7.473-16 16-16c4.094 0 8.188 1.562 11.31 4.688l64.01 64.01c3.125 3.125 4.688 7.219 4.688 11.31c0 9.133-7.468 16-16 16c-4.094 0-8.189-1.562-11.31-4.688l-64.01-64.01C257.6 184.2 256 180.1 256 175.1z"})})},custom:de("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 448 512",children:de("path",{d:"M417.1 368c-5.937 10.27-16.69 16-27.75 16c-5.422 0-10.92-1.375-15.97-4.281L256 311.4V448c0 17.67-14.33 32-31.1 32S192 465.7 192 448V311.4l-118.3 68.29C68.67 382.6 63.17 384 57.75 384c-11.06 0-21.81-5.734-27.75-16c-8.828-15.31-3.594-34.88 11.72-43.72L159.1 256L41.72 187.7C26.41 178.9 21.17 159.3 29.1 144C36.63 132.5 49.26 126.7 61.65 128.2C65.78 128.7 69.88 130.1 73.72 132.3L192 200.6V64c0-17.67 14.33-32 32-32S256 46.33 256 64v136.6l118.3-68.29c3.838-2.213 7.939-3.539 12.07-4.051C398.7 126.7 411.4 132.5 417.1 144c8.828 15.31 3.594 34.88-11.72 43.72L288 256l118.3 68.28C421.6 333.1 426.8 352.7 417.1 368z"})}),flags:{outline:de("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",children:de("path",{d:"M0 0l6.084 24H8L1.916 0zM21 5h-4l-1-4H4l3 12h3l1 4h13L21 5zM6.563 3h7.875l2 8H8.563l-2-8zm8.832 10l-2.856 1.904L12.063 13h3.332zM19 13l-1.5-6h1.938l2 8H16l3-2z"})}),solid:de("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",children:de("path",{d:"M64 496C64 504.8 56.75 512 48 512h-32C7.25 512 0 504.8 0 496V32c0-17.75 14.25-32 32-32s32 14.25 32 32V496zM476.3 0c-6.365 0-13.01 1.35-19.34 4.233c-45.69 20.86-79.56 27.94-107.8 27.94c-59.96 0-94.81-31.86-163.9-31.87C160.9 .3055 131.6 4.867 96 15.75v350.5c32-9.984 59.87-14.1 84.85-14.1c73.63 0 124.9 31.78 198.6 31.78c31.91 0 68.02-5.971 111.1-23.09C504.1 355.9 512 344.4 512 332.1V30.73C512 11.1 495.3 0 476.3 0z"})})},foods:{outline:de("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",children:de("path",{d:"M17 4.978c-1.838 0-2.876.396-3.68.934.513-1.172 1.768-2.934 4.68-2.934a1 1 0 0 0 0-2c-2.921 0-4.629 1.365-5.547 2.512-.064.078-.119.162-.18.244C11.73 1.838 10.798.023 9.207.023 8.579.022 7.85.306 7 .978 5.027 2.54 5.329 3.902 6.492 4.999 3.609 5.222 0 7.352 0 12.969c0 4.582 4.961 11.009 9 11.009 1.975 0 2.371-.486 3-1 .629.514 1.025 1 3 1 4.039 0 9-6.418 9-11 0-5.953-4.055-8-7-8M8.242 2.546c.641-.508.943-.523.965-.523.426.169.975 1.405 1.357 3.055-1.527-.629-2.741-1.352-2.98-1.846.059-.112.241-.356.658-.686M15 21.978c-1.08 0-1.21-.109-1.559-.402l-.176-.146c-.367-.302-.816-.452-1.266-.452s-.898.15-1.266.452l-.176.146c-.347.292-.477.402-1.557.402-2.813 0-7-5.389-7-9.009 0-5.823 4.488-5.991 5-5.991 1.939 0 2.484.471 3.387 1.251l.323.276a1.995 1.995 0 0 0 2.58 0l.323-.276c.902-.78 1.447-1.251 3.387-1.251.512 0 5 .168 5 6 0 3.617-4.187 9-7 9"})}),solid:de("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",children:de("path",{d:"M481.9 270.1C490.9 279.1 496 291.3 496 304C496 316.7 490.9 328.9 481.9 337.9C472.9 346.9 460.7 352 448 352H64C51.27 352 39.06 346.9 30.06 337.9C21.06 328.9 16 316.7 16 304C16 291.3 21.06 279.1 30.06 270.1C39.06 261.1 51.27 256 64 256H448C460.7 256 472.9 261.1 481.9 270.1zM475.3 388.7C478.3 391.7 480 395.8 480 400V416C480 432.1 473.3 449.3 461.3 461.3C449.3 473.3 432.1 480 416 480H96C79.03 480 62.75 473.3 50.75 461.3C38.74 449.3 32 432.1 32 416V400C32 395.8 33.69 391.7 36.69 388.7C39.69 385.7 43.76 384 48 384H464C468.2 384 472.3 385.7 475.3 388.7zM50.39 220.8C45.93 218.6 42.03 215.5 38.97 211.6C35.91 207.7 33.79 203.2 32.75 198.4C31.71 193.5 31.8 188.5 32.99 183.7C54.98 97.02 146.5 32 256 32C365.5 32 457 97.02 479 183.7C480.2 188.5 480.3 193.5 479.2 198.4C478.2 203.2 476.1 207.7 473 211.6C469.1 215.5 466.1 218.6 461.6 220.8C457.2 222.9 452.3 224 447.3 224H64.67C59.73 224 54.84 222.9 50.39 220.8zM372.7 116.7C369.7 119.7 368 123.8 368 128C368 131.2 368.9 134.3 370.7 136.9C372.5 139.5 374.1 141.6 377.9 142.8C380.8 143.1 384 144.3 387.1 143.7C390.2 143.1 393.1 141.6 395.3 139.3C397.6 137.1 399.1 134.2 399.7 131.1C400.3 128 399.1 124.8 398.8 121.9C397.6 118.1 395.5 116.5 392.9 114.7C390.3 112.9 387.2 111.1 384 111.1C379.8 111.1 375.7 113.7 372.7 116.7V116.7zM244.7 84.69C241.7 87.69 240 91.76 240 96C240 99.16 240.9 102.3 242.7 104.9C244.5 107.5 246.1 109.6 249.9 110.8C252.8 111.1 256 112.3 259.1 111.7C262.2 111.1 265.1 109.6 267.3 107.3C269.6 105.1 271.1 102.2 271.7 99.12C272.3 96.02 271.1 92.8 270.8 89.88C269.6 86.95 267.5 84.45 264.9 82.7C262.3 80.94 259.2 79.1 256 79.1C251.8 79.1 247.7 81.69 244.7 84.69V84.69zM116.7 116.7C113.7 119.7 112 123.8 112 128C112 131.2 112.9 134.3 114.7 136.9C116.5 139.5 118.1 141.6 121.9 142.8C124.8 143.1 128 144.3 131.1 143.7C134.2 143.1 137.1 141.6 139.3 139.3C141.6 137.1 143.1 134.2 143.7 131.1C144.3 128 143.1 124.8 142.8 121.9C141.6 118.1 139.5 116.5 136.9 114.7C134.3 112.9 131.2 111.1 128 111.1C123.8 111.1 119.7 113.7 116.7 116.7L116.7 116.7z"})})},frequent:{outline:de("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",children:[de("path",{d:"M13 4h-2l-.001 7H9v2h2v2h2v-2h4v-2h-4z"}),de("path",{d:"M12 0C5.373 0 0 5.373 0 12s5.373 12 12 12 12-5.373 12-12S18.627 0 12 0m0 22C6.486 22 2 17.514 2 12S6.486 2 12 2s10 4.486 10 10-4.486 10-10 10"})]}),solid:de("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",children:de("path",{d:"M256 512C114.6 512 0 397.4 0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256C512 397.4 397.4 512 256 512zM232 256C232 264 236 271.5 242.7 275.1L338.7 339.1C349.7 347.3 364.6 344.3 371.1 333.3C379.3 322.3 376.3 307.4 365.3 300L280 243.2V120C280 106.7 269.3 96 255.1 96C242.7 96 231.1 106.7 231.1 120L232 256z"})})},nature:{outline:de("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",children:[de("path",{d:"M15.5 8a1.5 1.5 0 1 0 .001 3.001A1.5 1.5 0 0 0 15.5 8M8.5 8a1.5 1.5 0 1 0 .001 3.001A1.5 1.5 0 0 0 8.5 8"}),de("path",{d:"M18.933 0h-.027c-.97 0-2.138.787-3.018 1.497-1.274-.374-2.612-.51-3.887-.51-1.285 0-2.616.133-3.874.517C7.245.79 6.069 0 5.093 0h-.027C3.352 0 .07 2.67.002 7.026c-.039 2.479.276 4.238 1.04 5.013.254.258.882.677 1.295.882.191 3.177.922 5.238 2.536 6.38.897.637 2.187.949 3.2 1.102C8.04 20.6 8 20.795 8 21c0 1.773 2.35 3 4 3 1.648 0 4-1.227 4-3 0-.201-.038-.393-.072-.586 2.573-.385 5.435-1.877 5.925-7.587.396-.22.887-.568 1.104-.788.763-.774 1.079-2.534 1.04-5.013C23.929 2.67 20.646 0 18.933 0M3.223 9.135c-.237.281-.837 1.155-.884 1.238-.15-.41-.368-1.349-.337-3.291.051-3.281 2.478-4.972 3.091-5.031.256.015.731.27 1.265.646-1.11 1.171-2.275 2.915-2.352 5.125-.133.546-.398.858-.783 1.313M12 22c-.901 0-1.954-.693-2-1 0-.654.475-1.236 1-1.602V20a1 1 0 1 0 2 0v-.602c.524.365 1 .947 1 1.602-.046.307-1.099 1-2 1m3-3.48v.02a4.752 4.752 0 0 0-1.262-1.02c1.092-.516 2.239-1.334 2.239-2.217 0-1.842-1.781-2.195-3.977-2.195-2.196 0-3.978.354-3.978 2.195 0 .883 1.148 1.701 2.238 2.217A4.8 4.8 0 0 0 9 18.539v-.025c-1-.076-2.182-.281-2.973-.842-1.301-.92-1.838-3.045-1.853-6.478l.023-.041c.496-.826 1.49-1.45 1.804-3.102 0-2.047 1.357-3.631 2.362-4.522C9.37 3.178 10.555 3 11.948 3c1.447 0 2.685.192 3.733.57 1 .9 2.316 2.465 2.316 4.48.313 1.651 1.307 2.275 1.803 3.102.035.058.068.117.102.178-.059 5.967-1.949 7.01-4.902 7.19m6.628-8.202c-.037-.065-.074-.13-.113-.195a7.587 7.587 0 0 0-.739-.987c-.385-.455-.648-.768-.782-1.313-.076-2.209-1.241-3.954-2.353-5.124.531-.376 1.004-.63 1.261-.647.636.071 3.044 1.764 3.096 5.031.027 1.81-.347 3.218-.37 3.235"})]}),solid:de("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 576 512",children:de("path",{d:"M332.7 19.85C334.6 8.395 344.5 0 356.1 0C363.6 0 370.6 3.52 375.1 9.502L392 32H444.1C456.8 32 469.1 37.06 478.1 46.06L496 64H552C565.3 64 576 74.75 576 88V112C576 156.2 540.2 192 496 192H426.7L421.6 222.5L309.6 158.5L332.7 19.85zM448 64C439.2 64 432 71.16 432 80C432 88.84 439.2 96 448 96C456.8 96 464 88.84 464 80C464 71.16 456.8 64 448 64zM416 256.1V480C416 497.7 401.7 512 384 512H352C334.3 512 320 497.7 320 480V364.8C295.1 377.1 268.8 384 240 384C211.2 384 184 377.1 160 364.8V480C160 497.7 145.7 512 128 512H96C78.33 512 64 497.7 64 480V249.8C35.23 238.9 12.64 214.5 4.836 183.3L.9558 167.8C-3.331 150.6 7.094 133.2 24.24 128.1C41.38 124.7 58.76 135.1 63.05 152.2L66.93 167.8C70.49 182 83.29 191.1 97.97 191.1H303.8L416 256.1z"})})},objects:{outline:de("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",children:[de("path",{d:"M12 0a9 9 0 0 0-5 16.482V21s2.035 3 5 3 5-3 5-3v-4.518A9 9 0 0 0 12 0zm0 2c3.86 0 7 3.141 7 7s-3.14 7-7 7-7-3.141-7-7 3.14-7 7-7zM9 17.477c.94.332 1.946.523 3 .523s2.06-.19 3-.523v.834c-.91.436-1.925.689-3 .689a6.924 6.924 0 0 1-3-.69v-.833zm.236 3.07A8.854 8.854 0 0 0 12 21c.965 0 1.888-.167 2.758-.451C14.155 21.173 13.153 22 12 22c-1.102 0-2.117-.789-2.764-1.453z"}),de("path",{d:"M14.745 12.449h-.004c-.852-.024-1.188-.858-1.577-1.824-.421-1.061-.703-1.561-1.182-1.566h-.009c-.481 0-.783.497-1.235 1.537-.436.982-.801 1.811-1.636 1.791l-.276-.043c-.565-.171-.853-.691-1.284-1.794-.125-.313-.202-.632-.27-.913-.051-.213-.127-.53-.195-.634C7.067 9.004 7.039 9 6.99 9A1 1 0 0 1 7 7h.01c1.662.017 2.015 1.373 2.198 2.134.486-.981 1.304-2.058 2.797-2.075 1.531.018 2.28 1.153 2.731 2.141l.002-.008C14.944 8.424 15.327 7 16.979 7h.032A1 1 0 1 1 17 9h-.011c-.149.076-.256.474-.319.709a6.484 6.484 0 0 1-.311.951c-.429.973-.79 1.789-1.614 1.789"})]}),solid:de("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 384 512",children:de("path",{d:"M112.1 454.3c0 6.297 1.816 12.44 5.284 17.69l17.14 25.69c5.25 7.875 17.17 14.28 26.64 14.28h61.67c9.438 0 21.36-6.401 26.61-14.28l17.08-25.68c2.938-4.438 5.348-12.37 5.348-17.7L272 415.1h-160L112.1 454.3zM191.4 .0132C89.44 .3257 16 82.97 16 175.1c0 44.38 16.44 84.84 43.56 115.8c16.53 18.84 42.34 58.23 52.22 91.45c.0313 .25 .0938 .5166 .125 .7823h160.2c.0313-.2656 .0938-.5166 .125-.7823c9.875-33.22 35.69-72.61 52.22-91.45C351.6 260.8 368 220.4 368 175.1C368 78.61 288.9-.2837 191.4 .0132zM192 96.01c-44.13 0-80 35.89-80 79.1C112 184.8 104.8 192 96 192S80 184.8 80 176c0-61.76 50.25-111.1 112-111.1c8.844 0 16 7.159 16 16S200.8 96.01 192 96.01z"})})},people:{outline:de("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",children:[de("path",{d:"M12 0C5.373 0 0 5.373 0 12s5.373 12 12 12 12-5.373 12-12S18.627 0 12 0m0 22C6.486 22 2 17.514 2 12S6.486 2 12 2s10 4.486 10 10-4.486 10-10 10"}),de("path",{d:"M8 7a2 2 0 1 0-.001 3.999A2 2 0 0 0 8 7M16 7a2 2 0 1 0-.001 3.999A2 2 0 0 0 16 7M15.232 15c-.693 1.195-1.87 2-3.349 2-1.477 0-2.655-.805-3.347-2H15m3-2H6a6 6 0 1 0 12 0"})]}),solid:de("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",children:de("path",{d:"M0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256zM256 432C332.1 432 396.2 382 415.2 314.1C419.1 300.4 407.8 288 393.6 288H118.4C104.2 288 92.92 300.4 96.76 314.1C115.8 382 179.9 432 256 432V432zM176.4 160C158.7 160 144.4 174.3 144.4 192C144.4 209.7 158.7 224 176.4 224C194 224 208.4 209.7 208.4 192C208.4 174.3 194 160 176.4 160zM336.4 224C354 224 368.4 209.7 368.4 192C368.4 174.3 354 160 336.4 160C318.7 160 304.4 174.3 304.4 192C304.4 209.7 318.7 224 336.4 224z"})})},places:{outline:de("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",children:[de("path",{d:"M6.5 12C5.122 12 4 13.121 4 14.5S5.122 17 6.5 17 9 15.879 9 14.5 7.878 12 6.5 12m0 3c-.275 0-.5-.225-.5-.5s.225-.5.5-.5.5.225.5.5-.225.5-.5.5M17.5 12c-1.378 0-2.5 1.121-2.5 2.5s1.122 2.5 2.5 2.5 2.5-1.121 2.5-2.5-1.122-2.5-2.5-2.5m0 3c-.275 0-.5-.225-.5-.5s.225-.5.5-.5.5.225.5.5-.225.5-.5.5"}),de("path",{d:"M22.482 9.494l-1.039-.346L21.4 9h.6c.552 0 1-.439 1-.992 0-.006-.003-.008-.003-.008H23c0-1-.889-2-1.984-2h-.642l-.731-1.717C19.262 3.012 18.091 2 16.764 2H7.236C5.909 2 4.738 3.012 4.357 4.283L3.626 6h-.642C1.889 6 1 7 1 8h.003S1 8.002 1 8.008C1 8.561 1.448 9 2 9h.6l-.043.148-1.039.346a2.001 2.001 0 0 0-1.359 2.097l.751 7.508a1 1 0 0 0 .994.901H3v1c0 1.103.896 2 2 2h2c1.104 0 2-.897 2-2v-1h6v1c0 1.103.896 2 2 2h2c1.104 0 2-.897 2-2v-1h1.096a.999.999 0 0 0 .994-.901l.751-7.508a2.001 2.001 0 0 0-1.359-2.097M6.273 4.857C6.402 4.43 6.788 4 7.236 4h9.527c.448 0 .834.43.963.857L19.313 9H4.688l1.585-4.143zM7 21H5v-1h2v1zm12 0h-2v-1h2v1zm2.189-3H2.811l-.662-6.607L3 11h18l.852.393L21.189 18z"})]}),solid:de("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",children:de("path",{d:"M39.61 196.8L74.8 96.29C88.27 57.78 124.6 32 165.4 32H346.6C387.4 32 423.7 57.78 437.2 96.29L472.4 196.8C495.6 206.4 512 229.3 512 256V448C512 465.7 497.7 480 480 480H448C430.3 480 416 465.7 416 448V400H96V448C96 465.7 81.67 480 64 480H32C14.33 480 0 465.7 0 448V256C0 229.3 16.36 206.4 39.61 196.8V196.8zM109.1 192H402.9L376.8 117.4C372.3 104.6 360.2 96 346.6 96H165.4C151.8 96 139.7 104.6 135.2 117.4L109.1 192zM96 256C78.33 256 64 270.3 64 288C64 305.7 78.33 320 96 320C113.7 320 128 305.7 128 288C128 270.3 113.7 256 96 256zM416 320C433.7 320 448 305.7 448 288C448 270.3 433.7 256 416 256C398.3 256 384 270.3 384 288C384 305.7 398.3 320 416 320z"})})},symbols:{outline:de("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",children:de("path",{d:"M0 0h11v2H0zM4 11h3V6h4V4H0v2h4zM15.5 17c1.381 0 2.5-1.116 2.5-2.493s-1.119-2.493-2.5-2.493S13 13.13 13 14.507 14.119 17 15.5 17m0-2.986c.276 0 .5.222.5.493 0 .272-.224.493-.5.493s-.5-.221-.5-.493.224-.493.5-.493M21.5 19.014c-1.381 0-2.5 1.116-2.5 2.493S20.119 24 21.5 24s2.5-1.116 2.5-2.493-1.119-2.493-2.5-2.493m0 2.986a.497.497 0 0 1-.5-.493c0-.271.224-.493.5-.493s.5.222.5.493a.497.497 0 0 1-.5.493M22 13l-9 9 1.513 1.5 8.99-9.009zM17 11c2.209 0 4-1.119 4-2.5V2s.985-.161 1.498.949C23.01 4.055 23 6 23 6s1-1.119 1-3.135C24-.02 21 0 21 0h-2v6.347A5.853 5.853 0 0 0 17 6c-2.209 0-4 1.119-4 2.5s1.791 2.5 4 2.5M10.297 20.482l-1.475-1.585a47.54 47.54 0 0 1-1.442 1.129c-.307-.288-.989-1.016-2.045-2.183.902-.836 1.479-1.466 1.729-1.892s.376-.871.376-1.336c0-.592-.273-1.178-.818-1.759-.546-.581-1.329-.871-2.349-.871-1.008 0-1.79.293-2.344.879-.556.587-.832 1.181-.832 1.784 0 .813.419 1.748 1.256 2.805-.847.614-1.444 1.208-1.794 1.784a3.465 3.465 0 0 0-.523 1.833c0 .857.308 1.56.924 2.107.616.549 1.423.823 2.42.823 1.173 0 2.444-.379 3.813-1.137L8.235 24h2.819l-2.09-2.383 1.333-1.135zm-6.736-6.389a1.02 1.02 0 0 1 .73-.286c.31 0 .559.085.747.254a.849.849 0 0 1 .283.659c0 .518-.419 1.112-1.257 1.784-.536-.651-.805-1.231-.805-1.742a.901.901 0 0 1 .302-.669M3.74 22c-.427 0-.778-.116-1.057-.349-.279-.232-.418-.487-.418-.766 0-.594.509-1.288 1.527-2.083.968 1.134 1.717 1.946 2.248 2.438-.921.507-1.686.76-2.3.76"})}),solid:de("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",children:de("path",{d:"M500.3 7.251C507.7 13.33 512 22.41 512 31.1V175.1C512 202.5 483.3 223.1 447.1 223.1C412.7 223.1 383.1 202.5 383.1 175.1C383.1 149.5 412.7 127.1 447.1 127.1V71.03L351.1 90.23V207.1C351.1 234.5 323.3 255.1 287.1 255.1C252.7 255.1 223.1 234.5 223.1 207.1C223.1 181.5 252.7 159.1 287.1 159.1V63.1C287.1 48.74 298.8 35.61 313.7 32.62L473.7 .6198C483.1-1.261 492.9 1.173 500.3 7.251H500.3zM74.66 303.1L86.5 286.2C92.43 277.3 102.4 271.1 113.1 271.1H174.9C185.6 271.1 195.6 277.3 201.5 286.2L213.3 303.1H239.1C266.5 303.1 287.1 325.5 287.1 351.1V463.1C287.1 490.5 266.5 511.1 239.1 511.1H47.1C21.49 511.1-.0019 490.5-.0019 463.1V351.1C-.0019 325.5 21.49 303.1 47.1 303.1H74.66zM143.1 359.1C117.5 359.1 95.1 381.5 95.1 407.1C95.1 434.5 117.5 455.1 143.1 455.1C170.5 455.1 191.1 434.5 191.1 407.1C191.1 381.5 170.5 359.1 143.1 359.1zM440.3 367.1H496C502.7 367.1 508.6 372.1 510.1 378.4C513.3 384.6 511.6 391.7 506.5 396L378.5 508C372.9 512.1 364.6 513.3 358.6 508.9C352.6 504.6 350.3 496.6 353.3 489.7L391.7 399.1H336C329.3 399.1 323.4 395.9 321 389.6C318.7 383.4 320.4 376.3 325.5 371.1L453.5 259.1C459.1 255 467.4 254.7 473.4 259.1C479.4 263.4 481.6 271.4 478.7 278.3L440.3 367.1zM116.7 219.1L19.85 119.2C-8.112 90.26-6.614 42.31 24.85 15.34C51.82-8.137 93.26-3.642 118.2 21.83L128.2 32.32L137.7 21.83C162.7-3.642 203.6-8.137 231.6 15.34C262.6 42.31 264.1 90.26 236.1 119.2L139.7 219.1C133.2 225.6 122.7 225.6 116.7 219.1H116.7z"})})}},search:{loupe:de("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",children:de("path",{d:"M12.9 14.32a8 8 0 1 1 1.41-1.41l5.35 5.33-1.42 1.42-5.33-5.34zM8 14A6 6 0 1 0 8 2a6 6 0 0 0 0 12z"})}),delete:de("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",children:de("path",{d:"M10 8.586L2.929 1.515 1.515 2.929 8.586 10l-7.071 7.071 1.414 1.414L10 11.414l7.071 7.071 1.414-1.414L11.414 10l7.071-7.071-1.414-1.414L10 8.586z"})})}};function Ge(e){var t=e.id,r=e.skin,n=e.emoji;if(e.shortcodes){var o=e.shortcodes.match(Ie.SHORTCODES_REGEX);o&&(t=o[1],o[2]&&(r=o[2]))}if(n||(n=Ie.get(t||e.native)),!n)return e.fallback;var i=n.skins[r-1]||n.skins[0],a=i.src||("native"==e.set||e.spritesheet?void 0:"function"==typeof e.getImageURL?e.getImageURL(e.set,i.unified):"https://cdn.jsdelivr.net/npm/emoji-datasource-".concat(e.set,"@15.0.1/img/").concat(e.set,"/64/").concat(i.unified,".png")),s="function"==typeof e.getSpritesheetURL?e.getSpritesheetURL(e.set):"https://cdn.jsdelivr.net/npm/emoji-datasource-".concat(e.set,"@15.0.1/img/").concat(e.set,"/sheets-256/64.png");return de("span",{class:"emoji-mart-emoji","data-emoji-set":e.set,children:a?de("img",{style:{maxWidth:e.size||"1em",maxHeight:e.size||"1em",display:"inline-block"},alt:i.native||i.shortcodes,src:a}):"native"==e.set?de("span",{style:{fontSize:e.size,fontFamily:'"EmojiMart", "Segoe UI Emoji", "Segoe UI Symbol", "Segoe UI", "Apple Color Emoji", "Twemoji Mozilla", "Noto Color Emoji", "Android Emoji"'},children:i.native}):de("span",{style:{display:"block",width:e.size,height:e.size,backgroundImage:"url(".concat(s,")"),backgroundSize:"".concat(100*Ce.sheet.cols,"% ").concat(100*Ce.sheet.rows,"%"),backgroundPosition:"".concat(100/(Ce.sheet.cols-1)*i.x,"% ").concat(100/(Ce.sheet.rows-1)*i.y,"%")}})})}function Ke(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}function $e(e,t,r){return($e=Ke()?Reflect.construct:function(e,t,r){var n=[null];n.push.apply(n,t);var o=new(Function.bind.apply(e,n));return r&&d(o,r.prototype),o}).apply(null,arguments)}function Xe(e,t,r){return $e.apply(null,arguments)}function Ye(e){var t="function"==typeof Map?new Map:void 0;return Ye=function(e){if(null===e||(r=e,-1===Function.toString.call(r).indexOf("[native code]")))return e;var r;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,n)}function n(){return Xe(e,arguments,S(this).constructor)}return n.prototype=Object.create(e.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),d(n,e)},Ye(e)}function Je(e){return Ye(e)}var Ze=function(e){"use strict";h(r,e);var t=M(r);function r(){var e,o=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(a(this,r),(e=t.call(this)).props=o,o.parent||o.ref){var i=null,s=o.parent||(i=o.ref&&o.ref.current);i&&(i.innerHTML=""),s&&s.appendChild(n(e))}return e}return c(r,[{key:"update",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};for(var t in e)this.attributeChangedCallback(t,null,e[t])}},{key:"attributeChangedCallback",value:function(e,t,r){if(this.component){var n=Ae(e,l({},e,r),this.constructor.Props,this);this.component.componentWillReceiveProps?this.component.componentWillReceiveProps(l({},e,n)):(this.component.props[e]=n,this.component.forceUpdate())}}},{key:"disconnectedCallback",value:function(){this.disconnected=!0,this.component&&this.component.unregister&&this.component.unregister()}}],[{key:"observedAttributes",get:function(){return Object.keys(this.Props)}}]),r}("undefined"!=typeof window&&window.HTMLElement?window.HTMLElement:Object),Qe=function(e){"use strict";h(r,e);var t=M(r);function r(e){var n,o=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:{}).styles;return a(this,r),(n=t.call(this,e)).setShadow(),n.injectStyles(o),n}return c(r,[{key:"setShadow",value:function(){this.attachShadow({mode:"open"})}},{key:"injectStyles",value:function(e){if(e){var t=document.createElement("style");t.textContent=e,this.shadowRoot.insertBefore(t,this.shadowRoot.firstChild)}}}]),r}(Je(Ze)),et={fallback:"",id:"",native:"",shortcodes:"",size:{value:"",transform:function(e){return/\D/.test(e)?e:"".concat(e,"px")}},set:we.set,skin:we.skin},tt=function(e){"use strict";h(n,e);var r=M(n);function n(e){return a(this,n),r.call(this,e)}return c(n,[{key:"connectedCallback",value:function(){var e=this;return i(t(z).mark((function r(){var n;return t(z).wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return(n=Be(e.props,et,e)).element=e,n.ref=function(t){e.component=t},t.next=5,Pe();case 5:if(!e.disconnected){t.next=7;break}return t.abrupt("return");case 7:le(de(Ge,p({},n)),e);case 8:case"end":return t.stop()}}),r)})))()}}]),n}(Je(Ze));l(tt,"Props",et),"undefined"==typeof customElements||customElements.get("em-emoji")||customElements.define("em-emoji",tt);var rt,nt,ot=[],it=R.__b,at=R.__r,st=R.diffed,ct=R.__c,lt=R.unmount;function ut(){var e;for(ot.sort((function(e,t){return e.__v.__b-t.__v.__b}));e=ot.pop();)if(e.__P)try{e.__H.__h.forEach(ht),e.__H.__h.forEach(pt),e.__H.__h=[]}catch(t){e.__H.__h=[],R.__e(t,e.__v)}}R.__b=function(e){rt=null,it&&it(e)},R.__r=function(e){at&&at(e),0;var t=(rt=e.__c).__H;t&&(t.__h.forEach(ht),t.__h.forEach(pt),t.__h=[])},R.diffed=function(e){st&&st(e);var t=e.__c;t&&t.__H&&t.__H.__h.length&&(1!==ot.push(t)&&nt===R.requestAnimationFrame||((nt=R.requestAnimationFrame)||function(e){var t,r=function(){clearTimeout(n),dt&&cancelAnimationFrame(t),setTimeout(e)},n=setTimeout(r,100);dt&&(t=requestAnimationFrame(r))})(ut)),rt=null},R.__c=function(e,t){t.some((function(e){try{e.__h.forEach(ht),e.__h=e.__h.filter((function(e){return!e.__||pt(e)}))}catch(r){t.some((function(e){e.__h&&(e.__h=[])})),t=[],R.__e(r,e.__v)}})),ct&&ct(e,t)},R.unmount=function(e){lt&<(e);var t,r=e.__c;r&&r.__H&&(r.__H.__.forEach((function(e){try{ht(e)}catch(e){t=e}})),t&&R.__e(t,r.__v))};var dt="function"==typeof requestAnimationFrame;function ht(e){var t=rt,r=e.__c;"function"==typeof r&&(e.__c=void 0,r()),rt=t}function pt(e){var t=rt;e.__c=e.__(),rt=t}function ft(e,t){for(var r in t)e[r]=t[r];return e}function vt(e,t){for(var r in e)if("__source"!==r&&!(r in t))return!0;for(var n in t)if("__source"!==n&&e[n]!==t[n])return!0;return!1}function gt(e){this.props=e}(gt.prototype=new W).isPureReactComponent=!0,gt.prototype.shouldComponentUpdate=function(e,t){return vt(this.props,e)||vt(this.state,t)};var mt=R.__b;R.__b=function(e){e.type&&e.type.__f&&e.ref&&(e.props.ref=e.ref,e.ref=null),mt&&mt(e)};"undefined"!=typeof Symbol&&Symbol.for&&Symbol.for("react.forward_ref");var _t=R.__e;R.__e=function(e,t,r){if(e.then)for(var n,o=t;o=o.__;)if((n=o.__c)&&n.__c)return null==t.__e&&(t.__e=r.__e,t.__k=r.__k),n.__c(e,t);_t(e,t,r)};var bt=R.unmount;function yt(){this.__u=0,this.t=null,this.__b=null}function kt(e){var t=e.__.__c;return t&&t.__e&&t.__e(e)}function wt(){this.u=null,this.o=null}R.unmount=function(e){var t=e.__c;t&&t.__R&&t.__R(),t&&!0===e.__h&&(e.type=null),bt&&bt(e)},(yt.prototype=new W).__c=function(e,t){var r=t.__c,n=this;null==n.t&&(n.t=[]),n.t.push(r);var o=kt(n.__v),i=!1,a=function(){i||(i=!0,r.__R=null,o?o(s):s())};r.__R=a;var s=function(){if(!--n.__u){if(n.state.__e){var e=n.state.__e;n.__v.__k[0]=function e(t,r,n){return t&&(t.__v=null,t.__k=t.__k&&t.__k.map((function(t){return e(t,r,n)})),t.__c&&t.__c.__P===r&&(t.__e&&n.insertBefore(t.__e,t.__d),t.__c.__e=!0,t.__c.__P=n)),t}(e,e.__c.__P,e.__c.__O)}var t;for(n.setState({__e:n.__b=null});t=n.t.pop();)t.forceUpdate()}},c=!0===t.__h;n.__u++||c||n.setState({__e:n.__b=n.__v.__k[0]}),e.then(a,a)},yt.prototype.componentWillUnmount=function(){this.t=[]},yt.prototype.render=function(e,t){if(this.__b){if(this.__v.__k){var r=document.createElement("div"),n=this.__v.__k[0].__c;this.__v.__k[0]=function e(t,r,n){return t&&(t.__c&&t.__c.__H&&(t.__c.__H.__.forEach((function(e){"function"==typeof e.__c&&e.__c()})),t.__c.__H=null),null!=(t=ft({},t)).__c&&(t.__c.__P===n&&(t.__c.__P=r),t.__c=null),t.__k=t.__k&&t.__k.map((function(t){return e(t,r,n)}))),t}(this.__b,r,n.__O=n.__P)}this.__b=null}var o=t.__e&&U(q,null,e.fallback);return o&&(o.__h=null),[U(q,null,t.__e?null:e.children),o]};var xt=function(e,t,r){if(++r[1]===r[0]&&e.o.delete(t),e.props.revealOrder&&("t"!==e.props.revealOrder[0]||!e.o.size))for(r=e.u;r;){for(;r.length>3;)r.pop()();if(r[1]0&&void 0!==arguments[0]?arguments[0]:this.props;return{skin:he.get("skin")||e.skin,theme:this.initTheme(e.theme)}}},{key:"componentWillMount",value:function(){this.dir=xe.rtl?"rtl":"ltr",this.refs={menu:{current:null},navigation:{current:null},scroll:{current:null},search:{current:null},searchInput:{current:null},skinToneButton:{current:null},skinToneRadio:{current:null}},this.initGrid(),0==this.props.stickySearch&&"sticky"==this.props.searchPosition&&(console.warn("[EmojiMart] Deprecation warning: `stickySearch` has been renamed `searchPosition`."),this.props.searchPosition="static")}},{key:"componentDidMount",value:function(){if(this.register(),this.shadowRoot=this.base.parentNode,this.props.autoFocus){var e=this.refs.searchInput;e.current&&e.current.focus()}}},{key:"componentWillReceiveProps",value:function(e){var t=this;for(var r in this.nextState||(this.nextState={}),e)this.nextState[r]=e[r];clearTimeout(this.nextStateTimer),this.nextStateTimer=setTimeout((function(){var e=!1;for(var r in t.nextState)t.props[r]=t.nextState[r],"custom"!==r&&"categories"!==r||(e=!0);delete t.nextState;var n=t.getInitialState();if(e)return t.reset(n);t.setState(n)}))}},{key:"componentWillUnmount",value:function(){this.unregister()}},{key:"reset",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=this;return i(t(z).mark((function n(){return t(z).wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,Pe(r.props);case 2:r.initGrid(),r.unobserve(),r.setState(e,(function(){r.observeCategories(),r.observeRows()}));case 5:case"end":return t.stop()}}),n)})))()}},{key:"register",value:function(){document.addEventListener("click",this.handleClickOutside),this.observe()}},{key:"unregister",value:function(){var e;document.removeEventListener("click",this.handleClickOutside),null===(e=this.darkMedia)||void 0===e||e.removeEventListener("change",this.darkMediaCallback),this.unobserve()}},{key:"observe",value:function(){this.observeCategories(),this.observeRows()}},{key:"unobserve",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.except,r=void 0===t?[]:t;Array.isArray(r)||(r=[r]);var n=!0,o=!1,i=void 0;try{for(var a,s=this.observers[Symbol.iterator]();!(n=(a=s.next()).done);n=!0){var c=a.value;r.includes(c)||c.disconnect()}}catch(e){o=!0,i=e}finally{try{n||null==s.return||s.return()}finally{if(o)throw i}}this.observers=[].concat(r)}},{key:"initGrid",value:function(){var e=this,t=Ce.categories;this.refs.categories=new Map;var r=Ce.categories.map((function(e){return e.id})).join(",");this.navKey&&this.navKey!=r&&this.refs.scroll.current&&(this.refs.scroll.current.scrollTop=0),this.navKey=r,this.grid=[],this.grid.setsize=0;var n=function(t,r){var n=[];n.__categoryId=r.id,n.__index=t.length,e.grid.push(n);var o=e.grid.length-1,i=o%Ht?{}:{current:null};return i.index=o,i.posinset=e.grid.setsize+1,t.push(i),n},o=!0,i=!1,a=void 0;try{for(var s,c=t[Symbol.iterator]();!(o=(s=c.next()).done);o=!0){var l=s.value,u=[],d=n(u,l),h=!0,p=!1,f=void 0;try{for(var v,g=l.emojis[Symbol.iterator]();!(h=(v=g.next()).done);h=!0){var m=v.value;d.length==this.getPerLine()&&(d=n(u,l)),this.grid.setsize+=1,d.push(m)}}catch(e){p=!0,f=e}finally{try{h||null==g.return||g.return()}finally{if(p)throw f}}this.refs.categories.set(l.id,{root:{current:null},rows:u})}}catch(e){i=!0,a=e}finally{try{o||null==c.return||c.return()}finally{if(i)throw a}}}},{key:"initTheme",value:function(e){if("auto"!=e)return e;if(!this.darkMedia){if(this.darkMedia=matchMedia("(prefers-color-scheme: dark)"),this.darkMedia.media.match(/^not/))return"light";this.darkMedia.addEventListener("change",this.darkMediaCallback)}return this.darkMedia.matches?"dark":"light"}},{key:"initDynamicPerLine",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.props,t=this;if(e.dynamicWidth){var r=e.element,n=e.emojiButtonSize,o=function(){var e=r.getBoundingClientRect().width;return Math.floor(e/n)},i=new ResizeObserver((function(){var e=t;t.unobserve({except:i}),t.setState({perLine:o()},(function(){var t=e;e.initGrid(),e.forceUpdate((function(){t.observeCategories(),t.observeRows()}))}))}));return i.observe(r),this.observers.push(i),o()}}},{key:"getPerLine",value:function(){return this.state.perLine||this.props.perLine}},{key:"getEmojiByPos",value:function(e){var t=b(e,2),r=t[0],n=t[1],o=this.state.searchResults||this.grid,i=o[r]&&o[r][n];if(i)return Ie.get(i)}},{key:"observeCategories",value:function(){var e=this.refs.navigation.current;if(e){var t=new Map,r={root:this.refs.scroll.current,threshold:[0,1]},n=new IntersectionObserver((function(r){var n=!0,o=!1,i=void 0;try{for(var a,s=r[Symbol.iterator]();!(n=(a=s.next()).done);n=!0){var c=a.value,l=c.target.dataset.id;t.set(l,c.intersectionRatio)}}catch(e){o=!0,i=e}finally{try{n||null==s.return||s.return()}finally{if(o)throw i}}var u,d=w(t),h=!0,p=!1,f=void 0;try{for(var v,g=d[Symbol.iterator]();!(h=(v=g.next()).done);h=!0){var m=b(v.value,2),_=m[0];if(m[1]){(u=_)!=e.state.categoryId&&e.setState({categoryId:u});break}}}catch(e){p=!0,f=e}finally{try{h||null==g.return||g.return()}finally{if(p)throw f}}}),r),o=!0,i=!1,a=void 0;try{for(var s,c=this.refs.categories.values()[Symbol.iterator]();!(o=(s=c.next()).done);o=!0){var l=s.value.root;n.observe(l.current)}}catch(e){i=!0,a=e}finally{try{o||null==c.return||c.return()}finally{if(i)throw a}}this.observers.push(n)}}},{key:"observeRows",value:function(){var e=this,t=p({},this.state.visibleRows),r=new IntersectionObserver((function(r){var n=!0,o=!1,i=void 0;try{for(var a,s=r[Symbol.iterator]();!(n=(a=s.next()).done);n=!0){var c=a.value,l=parseInt(c.target.dataset.index);c.isIntersecting?t[l]=!0:delete t[l]}}catch(e){o=!0,i=e}finally{try{n||null==s.return||s.return()}finally{if(o)throw i}}e.setState({visibleRows:t})}),{root:this.refs.scroll.current,rootMargin:"".concat(this.props.emojiButtonSize*(Ht+5),"px 0px ").concat(this.props.emojiButtonSize*Ht,"px")}),n=!0,o=!1,i=void 0;try{for(var a,s=this.refs.categories.values()[Symbol.iterator]();!(n=(a=s.next()).done);n=!0){var c=a.value.rows,l=!0,u=!1,d=void 0;try{for(var h,f=c[Symbol.iterator]();!(l=(h=f.next()).done);l=!0){var v=h.value;v.current&&r.observe(v.current)}}catch(e){u=!0,d=e}finally{try{l||null==f.return||f.return()}finally{if(u)throw d}}}}catch(e){o=!0,i=e}finally{try{n||null==s.return||s.return()}finally{if(o)throw i}}this.observers.push(r)}},{key:"preventDefault",value:function(e){e.preventDefault()}},{key:"unfocusSearch",value:function(){var e=this.refs.searchInput.current;e&&e.blur()}},{key:"navigate",value:function(e){var t=e.e,r=e.input,n=e.left,o=e.right,i=e.up,a=e.down,s=this,c=this.state.searchResults||this.grid;if(c.length){var l=b(this.state.pos,2),u=l[0],d=l[1],h=function(){if(0==u&&0==d&&!t.repeat&&(n||i))return null;if(-1==u)return t.repeat||!o&&!a||r.selectionStart!=r.value.length?null:[0,0];if(n||o){var e=c[u],s=n?-1:1;if(!e[d+=s]){if(!(e=c[u+=s]))return u=n?0:c.length-1,d=n?0:c[u].length-1,[u,d];d=n?e.length-1:0}return[u,d]}if(i||a){var l=c[u+=i?-1:1];return l?(l[d]||(d=l.length-1),[u,d]):(u=i?0:c.length-1,d=i?0:c[u].length-1,[u,d])}}();h?(t.preventDefault(),this.setState({pos:h,keyboard:!0},(function(){s.scrollTo({row:h[0]})}))):this.state.pos[0]>-1&&this.setState({pos:[-1,-1]})}}},{key:"scrollTo",value:function(e){var t=e.categoryId,r=e.row,n=this.state.searchResults||this.grid;if(n.length){var o=this.refs.scroll.current,i=o.getBoundingClientRect(),a=0;if(r>=0&&(t=n[r].__categoryId),t)a=(this.refs[t]||this.refs.categories.get(t).root).current.getBoundingClientRect().top-(i.top-o.scrollTop)+1;if(r>=0)if(r){var s=a+n[r].__index*this.props.emojiButtonSize,c=s+this.props.emojiButtonSize+.88*this.props.emojiButtonSize;if(so.scrollTop+i.height))return;a=c-i.height}}else a=0;this.ignoreMouse(),o.scrollTop=a}}},{key:"ignoreMouse",value:function(){var e=this;this.mouseIsIgnored=!0,clearTimeout(this.ignoreMouseTimer),this.ignoreMouseTimer=setTimeout((function(){delete e.mouseIsIgnored}),100)}},{key:"handleEmojiOver",value:function(e){this.mouseIsIgnored||this.state.showSkins||this.setState({pos:e||[-1,-1],keyboard:!1})}},{key:"handleEmojiClick",value:function(e){var t=e.e,r=e.emoji,n=e.pos;if(this.props.onEmojiSelect&&(!r&&n&&(r=this.getEmojiByPos(n)),r)){var o=Ue(r,{skinIndex:this.state.skin-1});this.props.maxFrequentRows&&ke.add(o,this.props),this.props.onEmojiSelect(o,t)}}},{key:"closeSkins",value:function(){this.state.showSkins&&(this.setState({showSkins:null,tempSkin:null}),this.base.removeEventListener("click",this.handleBaseClick),this.base.removeEventListener("keydown",this.handleBaseKeydown))}},{key:"handleSkinMouseOver",value:function(e){this.setState({tempSkin:e})}},{key:"handleSkinClick",value:function(e){this.ignoreMouse(),this.closeSkins(),this.setState({skin:e,tempSkin:null}),he.set("skin",e)}},{key:"renderNav",value:function(){return de(At,{ref:this.refs.navigation,icons:this.props.icons,theme:this.state.theme,dir:this.dir,unfocused:!!this.state.searchResults,position:this.props.navPosition,onClick:this.handleCategoryClick},this.navKey)}},{key:"renderPreview",value:function(){var e=this.getEmojiByPos(this.state.pos),t=this.state.searchResults&&!this.state.searchResults.length;return de("div",{id:"preview",class:"flex flex-middle",dir:this.dir,"data-position":this.props.previewPosition,children:[de("div",{class:"flex flex-middle flex-grow",children:[de("div",{class:"flex flex-auto flex-middle flex-center",style:{height:this.props.emojiButtonSize,fontSize:this.props.emojiButtonSize},children:de(Ge,{emoji:e,id:t?this.props.noResultsEmoji||"cry":this.props.previewEmoji||("top"==this.props.previewPosition?"point_down":"point_up"),set:this.props.set,size:this.props.emojiButtonSize,skin:this.state.tempSkin||this.state.skin,spritesheet:!0,getSpritesheetURL:this.props.getSpritesheetURL})}),de("div",{class:"margin-".concat(this.dir[0]),children:de("div",e||t?{class:"padding-".concat(this.dir[2]," align-").concat(this.dir[0]),children:[de("div",{class:"preview-title ellipsis",children:e?e.name:xe.search_no_results_1}),de("div",{class:"preview-subtitle ellipsis color-c",children:e?e.skins[0].shortcodes:xe.search_no_results_2})]}:{class:"preview-placeholder color-c",children:xe.pick})})]}),!e&&"preview"==this.props.skinTonePosition&&this.renderSkinToneButton()]})}},{key:"renderEmojiButton",value:function(e,t){var r,n,o=t.pos,i=t.posinset,a=t.grid,s=this,c=this.props.emojiButtonSize,l=this.state.tempSkin||this.state.skin,u=(e.skins[l-1]||e.skins[0]).native,d=(r=this.state.pos,n=o,Array.isArray(r)&&Array.isArray(n)&&r.length===n.length&&r.every((function(e,t){return e==n[t]}))),h=o.concat(e.id).join("");return de(Tt,{selected:d,skin:l,size:c,children:de("button",{"aria-label":u,"aria-selected":d||void 0,"aria-posinset":i,"aria-setsize":a.setsize,"data-keyboard":this.state.keyboard,title:"none"==this.props.previewPosition?e.name:void 0,type:"button",class:"flex flex-center flex-middle",tabindex:"-1",onClick:function(t){return s.handleEmojiClick({e:t,emoji:e})},onMouseEnter:function(){return s.handleEmojiOver(o)},onMouseLeave:function(){return s.handleEmojiOver()},style:{width:this.props.emojiButtonSize,height:this.props.emojiButtonSize,fontSize:this.props.emojiSize,lineHeight:0},children:[de("div",{"aria-hidden":"true",class:"background",style:{borderRadius:this.props.emojiButtonRadius,backgroundColor:this.props.emojiButtonColors?this.props.emojiButtonColors[(i-1)%this.props.emojiButtonColors.length]:void 0}}),de(Ge,{emoji:e,set:this.props.set,size:this.props.emojiSize,skin:l,spritesheet:!0,getSpritesheetURL:this.props.getSpritesheetURL})]})},h)}},{key:"renderSearch",value:function(){var e="none"==this.props.previewPosition||"search"==this.props.skinTonePosition;return de("div",{children:[de("div",{class:"spacer"}),de("div",{class:"flex flex-middle",children:[de("div",{class:"search relative flex-grow",children:[de("input",{type:"search",ref:this.refs.searchInput,placeholder:xe.search,onClick:this.handleSearchClick,onInput:this.handleSearchInput,onKeyDown:this.handleSearchKeyDown,autoComplete:"off"}),de("span",{class:"icon loupe flex",children:We.search.loupe}),this.state.searchResults&&de("button",{title:"Clear","aria-label":"Clear",type:"button",class:"icon delete flex",onClick:this.clearSearch,onMouseDown:this.preventDefault,children:We.search.delete})]}),e&&this.renderSkinToneButton()]})]})}},{key:"renderSearchResults",value:function(){var e=this,t=this.state.searchResults;return t?de("div",{class:"category",ref:this.refs.search,children:[de("div",{class:"sticky padding-small align-".concat(this.dir[0]),children:xe.categories.search}),de("div",{children:t.length?t.map((function(r,n){var o=e;return de("div",{class:"flex",children:r.map((function(e,r){return o.renderEmojiButton(e,{pos:[n,r],posinset:n*o.props.perLine+r+1,grid:t})}))})})):de("div",{class:"padding-small align-".concat(this.dir[0]),children:this.props.onAddCustomEmoji&&de("a",{onClick:this.props.onAddCustomEmoji,children:xe.add_custom})})})]}):null}},{key:"renderCategories",value:function(){var e=this,t=Ce.categories,r=!!this.state.searchResults,n=this.getPerLine();return de("div",{style:{visibility:r?"hidden":void 0,display:r?"none":void 0,height:"100%"},children:t.map((function(t){var r=e,o=e.refs.categories.get(t.id),i=o.root,a=o.rows;return de("div",{"data-id":t.target?t.target.id:t.id,class:"category",ref:i,children:[de("div",{class:"sticky padding-small align-".concat(e.dir[0]),children:t.name||xe.categories[t.id]}),de("div",{class:"relative",style:{height:a.length*e.props.emojiButtonSize},children:a.map((function(e,o){var i,a=r,s=e.index-e.index%Ht,c=r.state.visibleRows[s],l="current"in e?e:void 0;if(!c&&!l)return null;var u=o*n,d=u+n,h=t.emojis.slice(u,d);return h.length*{position:relative}.category button .background{opacity:0;background-color:var(--em-color-border);transition:opacity var(--duration-fast)var(--easing)var(--duration-instant);position:absolute;top:0;bottom:0;left:0;right:0}.category button:hover .background{transition-duration:var(--duration-instant);transition-delay:0s}.category button[aria-selected] .background{opacity:1}.category button[data-keyboard] .background{transition:none}.row{width:100%;position:absolute;top:0;left:0}.skin-tone-button{border:1px solid transparent;border-radius:100%}.skin-tone-button:hover{border-color:var(--em-color-border)}.skin-tone-button:active .skin-tone{transform:scale(.85)!important}.skin-tone-button .skin-tone{transition:transform var(--duration)var(--easing)}.skin-tone-button[aria-selected]{background-color:var(--em-color-border);border-top-color:rgba(0,0,0,.05);border-bottom-color:transparent;border-left-width:0;border-right-width:0}.skin-tone-button[aria-selected] .skin-tone{transform:scale(.9)}.menu{z-index:2;white-space:nowrap;border:1px solid var(--em-color-border);background-color:rgba(var(--em-rgb-background),.9);-webkit-backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);transition-property:opacity,transform;transition-duration:var(--duration);transition-timing-function:var(--easing);border-radius:10px;padding:4px;position:absolute;box-shadow:1px 1px 5px rgba(0,0,0,.05)}.menu.hidden{opacity:0}.menu[data-position=bottom]{transform-origin:100% 100%}.menu[data-position=bottom].hidden{transform:scale(.9)rotate(-3deg)translateY(5%)}.menu[data-position=top]{transform-origin:100% 0}.menu[data-position=top].hidden{transform:scale(.9)rotate(3deg)translateY(-5%)}.menu input[type=radio]{clip:rect(0 0 0 0);width:1px;height:1px;border:0;margin:0;padding:0;position:absolute;overflow:hidden}.menu input[type=radio]:checked+.option{box-shadow:0 0 0 2px rgb(var(--em-rgb-accent))}.option{width:100%;border-radius:6px;padding:4px 6px}.option:hover{color:#fff;background-color:rgb(var(--em-rgb-accent))}.skin-tone{width:16px;height:16px;border-radius:100%;display:inline-block;position:relative;overflow:hidden}.skin-tone:after{content:"";mix-blend-mode:overlay;background:linear-gradient(rgba(255,255,255,.2),transparent);border:1px solid rgba(0,0,0,.8);border-radius:100%;position:absolute;top:0;bottom:0;left:0;right:0;box-shadow:inset 0 -2px 3px #000,inset 0 1px 2px #fff}.skin-tone-1{background-color:#ffc93a}.skin-tone-2{background-color:#ffdab7}.skin-tone-3{background-color:#e7b98f}.skin-tone-4{background-color:#c88c61}.skin-tone-5{background-color:#a46134}.skin-tone-6{background-color:#5d4437}[data-index]{justify-content:space-between}[data-emoji-set=twitter] .skin-tone:after{box-shadow:none;border-color:rgba(0,0,0,.5)}[data-emoji-set=twitter] .skin-tone-1{background-color:#fade72}[data-emoji-set=twitter] .skin-tone-2{background-color:#f3dfd0}[data-emoji-set=twitter] .skin-tone-3{background-color:#eed3a8}[data-emoji-set=twitter] .skin-tone-4{background-color:#cfad8d}[data-emoji-set=twitter] .skin-tone-5{background-color:#a8805d}[data-emoji-set=twitter] .skin-tone-6{background-color:#765542}[data-emoji-set=google] .skin-tone:after{box-shadow:inset 0 0 2px 2px rgba(0,0,0,.4)}[data-emoji-set=google] .skin-tone-1{background-color:#f5c748}[data-emoji-set=google] .skin-tone-2{background-color:#f1d5aa}[data-emoji-set=google] .skin-tone-3{background-color:#d4b48d}[data-emoji-set=google] .skin-tone-4{background-color:#aa876b}[data-emoji-set=google] .skin-tone-5{background-color:#916544}[data-emoji-set=google] .skin-tone-6{background-color:#61493f}[data-emoji-set=facebook] .skin-tone:after{border-color:rgba(0,0,0,.4);box-shadow:inset 0 -2px 3px #000,inset 0 1px 4px #fff}[data-emoji-set=facebook] .skin-tone-1{background-color:#f5c748}[data-emoji-set=facebook] .skin-tone-2{background-color:#f1d5aa}[data-emoji-set=facebook] .skin-tone-3{background-color:#d4b48d}[data-emoji-set=facebook] .skin-tone-4{background-color:#aa876b}[data-emoji-set=facebook] .skin-tone-5{background-color:#916544}[data-emoji-set=facebook] .skin-tone-6{background-color:#61493f}',window.EmojiMart=r}(); +//# sourceMappingURL=browser.js.map diff --git a/assets/vendor/qrcode.js b/assets/vendor/qrcode.js new file mode 100644 index 0000000..06a8d68 --- /dev/null +++ b/assets/vendor/qrcode.js @@ -0,0 +1 @@ +module.exports=function(t){var e={};function r(n){if(e[n])return e[n].exports;var o=e[n]={i:n,l:!1,exports:{}};return t[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}return r.m=t,r.c=e,r.d=function(t,e,n){r.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:n})},r.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r.t=function(t,e){if(1&e&&(t=r(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)r.d(n,o,function(e){return t[e]}.bind(null,o));return n},r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,"a",e),e},r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.p="",r(r.s=9)}([function(t,e){t.exports={L:1,M:0,Q:3,H:2}},function(t,e){t.exports={MODE_NUMBER:1,MODE_ALPHA_NUM:2,MODE_8BIT_BYTE:4,MODE_KANJI:8}},function(t,e,r){var n=r(3);function o(t,e){if(null==t.length)throw new Error(t.length+"/"+e);for(var r=0;r=256;)t-=255;return r.EXP_TABLE[t]},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)},n=0;n<8;n++)r.EXP_TABLE[n]=1<=7&&this.setupTypeNumber(t),null==this.dataCache&&(this.dataCache=l.createData(this.typeNumber,this.errorCorrectLevel,this.dataList)),this.mapData(this.dataCache,e)},c.setupPositionProbePattern=function(t,e){for(var r=-1;r<=7;r++)if(!(t+r<=-1||this.moduleCount<=t+r))for(var n=-1;n<=7;n++)e+n<=-1||this.moduleCount<=e+n||(this.modules[t+r][e+n]=0<=r&&r<=6&&(0==n||6==n)||0<=n&&n<=6&&(0==r||6==r)||2<=r&&r<=4&&2<=n&&n<=4)},c.getBestMaskPattern=function(){for(var t=0,e=0,r=0;r<8;r++){this.makeImpl(!0,r);var n=a.getLostPoint(this);(0==r||t>n)&&(t=n,e=r)}return e},c.createMovieClip=function(t,e,r){var n=t.createEmptyMovieClip(e,r);this.make();for(var o=0;o>r&1);this.modules[Math.floor(r/3)][r%3+this.moduleCount-8-3]=n}for(r=0;r<18;r++){n=!t&&1==(e>>r&1);this.modules[r%3+this.moduleCount-8-3][Math.floor(r/3)]=n}},c.setupTypeInfo=function(t,e){for(var r=this.errorCorrectLevel<<3|e,n=a.getBCHTypeInfo(r),o=0;o<15;o++){var i=!t&&1==(n>>o&1);o<6?this.modules[o][8]=i:o<8?this.modules[o+1][8]=i:this.modules[this.moduleCount-15+o][8]=i}for(o=0;o<15;o++){i=!t&&1==(n>>o&1);o<8?this.modules[8][this.moduleCount-o-1]=i:o<9?this.modules[8][15-o-1+1]=i:this.modules[8][15-o-1]=i}this.modules[this.moduleCount-8][8]=!t},c.mapData=function(t,e){for(var r=-1,n=this.moduleCount-1,o=7,i=0,u=this.moduleCount-1;u>0;u-=2)for(6==u&&u--;;){for(var l=0;l<2;l++)if(null==this.modules[n][u-l]){var c=!1;i>>o&1)),a.getMask(e,n,u-l)&&(c=!c),this.modules[n][u-l]=c,-1==--o&&(i++,o=7)}if((n+=r)<0||this.moduleCount<=n){n-=r,r=-r;break}}},l.PAD0=236,l.PAD1=17,l.createData=function(t,e,r){for(var n=o.getRSBlocks(t,e),u=new i,c=0;c8*f)throw new Error("code length overflow. ("+u.getLengthInBits()+">"+8*f+")");for(u.getLengthInBits()+4<=8*f&&u.put(0,4);u.getLengthInBits()%8!=0;)u.putBit(!1);for(;!(u.getLengthInBits()>=8*f||(u.put(l.PAD0,8),u.getLengthInBits()>=8*f));)u.put(l.PAD1,8);return l.createBytes(u,n)},l.createBytes=function(t,e){for(var r=0,n=0,o=0,i=new Array(e.length),l=new Array(e.length),c=0;c=0?p.get(y):0}}var v=0;for(h=0;h>>7-t%8&1)},put:function(t,e){for(var r=0;r>>e-r-1&1))},getLengthInBits:function(){return this.length},putBit:function(t){var e=Math.floor(this.length/8);this.buffer.length<=e&&this.buffer.push(0),t&&(this.buffer[e]|=128>>>this.length%8),this.length++}},t.exports=r},function(t,e,r){var n=r(1),o=r(2),i=r(3),a=0,u=1,l=2,c=3,s=4,f=5,h=6,g=7,p={PATTERN_POSITION_TABLE:[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],G15:1335,G18:7973,G15_MASK:21522,getBCHTypeInfo:function(t){for(var e=t<<10;p.getBCHDigit(e)-p.getBCHDigit(p.G15)>=0;)e^=p.G15<=0;)e^=p.G18<>>=1;return e},getPatternPosition:function(t){return p.PATTERN_POSITION_TABLE[t-1]},getMask:function(t,e,r){switch(t){case a:return(e+r)%2==0;case u:return e%2==0;case l:return r%3==0;case c:return(e+r)%3==0;case s:return(Math.floor(e/2)+Math.floor(r/3))%2==0;case f:return e*r%2+e*r%3==0;case h:return(e*r%2+e*r%3)%2==0;case g:return(e*r%3+(e+r)%2)%2==0;default:throw new Error("bad maskPattern:"+t)}},getErrorCorrectPolynomial:function(t){for(var e=new o([1],0),r=0;r5&&(r+=3+i-5)}for(n=0;n1&&void 0!==arguments[1]?arguments[1]:{};!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),h(this,"value",void 0),h(this,"level",void 0),h(this,"typeNumber",void 0),h(this,"padding",void 0),h(this,"errorsEnabled",void 0),h(this,"qrCodeData",void 0);var n=function(t){for(var e=1;e0?Math.round(parseFloat(t)/100*e)||0:parseFloat(t)||0}},{key:"calculatePosition",value:function(t,e,r){if("number"==typeof t)return t;if("string"!=typeof t)return 0;if("left"===t||"top"===t)return 0;if("right"===t||"bottom"===t)return r-e;if("center"===t)return Math.round((r-e)/2);var n=t.match(/^(?:(right|bottom|left|top)\s+)?(-?[0-9.]+)(%)?$/);if(!n)return 0;var o="right"===n[1]||"bottom"===n[1],i=!!n[3],a=parseFloat(n[2])||0;return i&&(a=Math.round(a/100*r)),o&&(a=r-a-e),Math.round(a)}}],(r=null)&&y(e.prototype,r),n&&y(e,n),t}();function d(t){return(d="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function b(t,e){for(var r=0;r1&&void 0!==arguments[1]?arguments[1]:{};!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,e),n=this,r=!(o=w(e).call(this,t,i))||"object"!==d(o)&&"function"!=typeof o?O(n):o,_(O(O(r)),"image",null),_(O(O(r)),"imageConfig",null);var a=function(t){for(var e=1;e1&&void 0!==arguments[1]?arguments[1]:{};!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,e),n=this,r=!(o=T(e).call(this,t,i))||"object"!==S(o)&&"function"!=typeof o?A(n):o,x(A(A(r)),"fgColor",void 0),x(A(A(r)),"bgColor",void 0),x(A(A(r)),"scale",void 0),x(A(A(r)),"size",void 0),x(A(A(r)),"canvas",void 0),x(A(A(r)),"canvasContext",void 0);var a=function(t){for(var e=1;e0&&void 0!==arguments[0]?arguments[0]:null,e=this.getDataSize();if(!e)return null;var r=this.getData();if(!r)return null;var n=i.convertHexColorToBytes(this.fgColor),o=i.convertHexColorToBytes(this.bgColor),a=0,u=new Uint8ClampedArray(4*Math.pow(e,2));r.forEach(function(t){t.forEach(function(t){t?u.set(n,a):u.set(o,a),a+=4})});var l=new ImageData(u,e,e);this.canvas.width=e,this.canvas.height=e,this.canvasContext.putImageData(l,0,0);var c=this._getCanvasSize(),s=t||document.createElement("canvas");s.width=c,s.height=c;var f=s.getContext("2d");f.imageSmoothingEnabled=!1,f.drawImage(this.canvas,0,0,c,c);var h=this._drawImage(f,c/e);return h instanceof Promise?h.then(function(){return s}):s}},{key:"_getImageSource",value:function(t){var e=this,r=t.source;return"string"==typeof r?k.load(r).then(function(r){return e.image.source=r,t.source=r,r}):r instanceof Image?r:r instanceof HTMLCanvasElement?r:null}},{key:"_drawImage",value:function(t,e){var r=this._getImageConfig();return r?r.source instanceof Promise?r.source.then(function(n){t.drawImage(n,r.x*e,r.y*e,r.width*e,r.height*e)}):(t.drawImage(r.source,r.x*e,r.y*e,r.width*e,r.height*e),!0):null}},{key:"getCanvas",value:function(){return this.draw()}},{key:"toDataUrl",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"image/png",e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:.92,r=this.draw();return r?r instanceof Promise?r.then(function(r){return r.toDataURL(t,e)}):r.toDataURL(t,e):null}}])&&j(r.prototype,n),o&&j(r,o),e}();function R(t){return(R="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function N(t,e){for(var r=0;r1&&void 0!==arguments[1]?arguments[1]:{};!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,e),n=this,r=!(o=H(e).call(this,t,i))||"object"!==R(o)&&"function"!=typeof o?G(n):o,z(G(G(r)),"fgColor",void 0),z(G(G(r)),"bgColor",void 0),z(G(G(r)),"qrCodeSVG",null),z(G(G(r)),"qrCodeDataUrl",null);var a=function(t){for(var e=1;e')];this.bgColor&&n.push('')),t.forEach(function(t){if(t.width&&t.height){var r=t.id?'id="'.concat(t.id,'" '):"";n.push("'))}else n.push(''))});var o=this._getImageConfig();return o&&o.width&&o.height&&n.push('')),n.push(""),n.join("")}},{key:"toString",value:function(){if(!this.qrCodeSVG){if(!this.getDataSize())return null;var t=this._getRects();if(!t)return null;this.qrCodeSVG=this._buildSVG(t)}return this.qrCodeSVG}},{key:"toDataUrl",value:function(){if(!this.qrCodeDataUrl){if(!this.getDataSize())return null;var t=this._getRelativeRects();if(!t)return null;var e=this._buildSVG(t);this.qrCodeDataUrl="data:image/svg+xml;base64,".concat(btoa(e))}return this.qrCodeDataUrl}}])&&N(r.prototype,n),o&&N(r,o),e}();function V(t){return(V="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function Q(t,e){for(var r=0;r1&&void 0!==arguments[1]?arguments[1]:{};!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,e),n=this,r=!(o=Y(e).call(this,t,i))||"object"!==V(o)&&"function"!=typeof o?$(n):o,W($($(r)),"blackSymbol",void 0),W($($(r)),"whiteSymbol",void 0),W($($(r)),"qrCodeText",null);var a=function(t){for(var e=1;et.length)&&(e=t.length);for(var n=0,o=new Array(e);n"===e[0]&&(e=e.substring(1)),t))try{if(t.matches)return t.matches(e);if(t.msMatchesSelector)return t.msMatchesSelector(e);if(t.webkitMatchesSelector)return t.webkitMatchesSelector(e)}catch(t){return}}function P(t,e,n,o){if(t){n=n||document;do{if(null!=e&&(">"!==e[0]||t.parentNode===n)&&p(t,e)||o&&t===n)return t}while(t!==n&&(t=(i=t).host&&i!==document&&i.host.nodeType?i.host:i.parentNode))}var i;return null}var g,m=/\s+/g;function k(t,e,n){var o;t&&e&&(t.classList?t.classList[n?"add":"remove"](e):(o=(" "+t.className+" ").replace(m," ").replace(" "+e+" "," "),t.className=(o+(n?" "+e:"")).replace(m," ")))}function R(t,e,n){var o=t&&t.style;if(o){if(void 0===n)return document.defaultView&&document.defaultView.getComputedStyle?n=document.defaultView.getComputedStyle(t,""):t.currentStyle&&(n=t.currentStyle),void 0===e?n:n[e];o[e=!(e in o||-1!==e.indexOf("webkit"))?"-webkit-"+e:e]=n+("string"==typeof n?"":"px")}}function v(t,e){var n="";if("string"==typeof t)n=t;else do{var o=R(t,"transform")}while(o&&"none"!==o&&(n=o+" "+n),!e&&(t=t.parentNode));var i=window.DOMMatrix||window.WebKitCSSMatrix||window.CSSMatrix||window.MSCSSMatrix;return i&&new i(n)}function b(t,e,n){if(t){var o=t.getElementsByTagName(e),i=0,r=o.length;if(n)for(;i=n.left-e&&i<=n.right+e,e=r>=n.top-e&&r<=n.bottom+e;return o&&e?a=t:void 0}}),a);if(e){var n,o={};for(n in t)t.hasOwnProperty(n)&&(o[n]=t[n]);o.target=o.rootEl=e,o.preventDefault=void 0,o.stopPropagation=void 0,e[K]._onDragOver(o)}}var i,r,a}function Bt(t){V&&V.parentNode[K]._isOutsideThisEl(t.target)}function Ft(t,e){if(!t||!t.nodeType||1!==t.nodeType)throw"Sortable: `el` must be an HTMLElement, not ".concat({}.toString.call(t));this.el=t,this.options=e=a({},e),t[K]=this;var n,o,i={group:null,sort:!0,disabled:!1,store:null,handle:null,draggable:/^[uo]l$/i.test(t.nodeName)?">li":">*",swapThreshold:1,invertSwap:!1,invertedSwapThreshold:null,removeCloneOnHide:!0,direction:function(){return Pt(t,this.options)},ghostClass:"sortable-ghost",chosenClass:"sortable-chosen",dragClass:"sortable-drag",ignore:"a, img",filter:null,preventOnFilter:!0,animation:0,easing:null,setData:function(t,e){t.setData("Text",e.textContent)},dropBubble:!1,dragoverBubble:!1,dataIdAttr:"data-id",delay:0,delayOnTouchOnly:!1,touchStartThreshold:(Number.parseInt?Number:window).parseInt(window.devicePixelRatio,10)||1,forceFallback:!1,fallbackClass:"sortable-fallback",fallbackOnBody:!1,fallbackTolerance:0,fallbackOffset:{x:0,y:0},supportPointer:!1!==Ft.supportPointer&&"PointerEvent"in window&&!u,emptyInsertThreshold:5};for(n in W.initializePlugins(this,t,i),i)n in e||(e[n]=i[n]);for(o in kt(e),this)"_"===o.charAt(0)&&"function"==typeof this[o]&&(this[o]=this[o].bind(this));this.nativeDraggable=!e.forceFallback&&Nt,this.nativeDraggable&&(this.options.touchStartThreshold=1),e.supportPointer?h(t,"pointerdown",this._onTapStart):(h(t,"mousedown",this._onTapStart),h(t,"touchstart",this._onTapStart)),this.nativeDraggable&&(h(t,"dragover",this),h(t,"dragenter",this)),Dt.push(this.el),e.store&&e.store.get&&this.sort(e.store.get(this)||[]),a(this,x())}function jt(t,e,n,o,i,r,a,l){var s,c,u=t[K],d=u.options.onMove;return!window.CustomEvent||y||w?(s=document.createEvent("Event")).initEvent("move",!0,!0):s=new CustomEvent("move",{bubbles:!0,cancelable:!0}),s.to=e,s.from=t,s.dragged=n,s.draggedRect=o,s.related=i||e,s.relatedRect=r||X(e),s.willInsertAfter=l,s.originalEvent=a,t.dispatchEvent(s),c=d?d.call(u,s,a):c}function Ht(t){t.draggable=!1}function Lt(){Tt=!1}function Kt(t){return setTimeout(t,0)}function Wt(t){return clearTimeout(t)}Ft.prototype={constructor:Ft,_isOutsideThisEl:function(t){this.el.contains(t)||t===this.el||(mt=null)},_getDirection:function(t,e){return"function"==typeof this.options.direction?this.options.direction.call(this,t,e,V):this.options.direction},_onTapStart:function(e){if(e.cancelable){var n=this,o=this.el,t=this.options,i=t.preventOnFilter,r=e.type,a=e.touches&&e.touches[0]||e.pointerType&&"touch"===e.pointerType&&e,l=(a||e).target,s=e.target.shadowRoot&&(e.path&&e.path[0]||e.composedPath&&e.composedPath()[0])||l,c=t.filter;if(!function(t){xt.length=0;var e=t.getElementsByTagName("input"),n=e.length;for(;n--;){var o=e[n];o.checked&&xt.push(o)}}(o),!V&&!(/mousedown|pointerdown/.test(r)&&0!==e.button||t.disabled)&&!s.isContentEditable&&(this.nativeDraggable||!u||!l||"SELECT"!==l.tagName.toUpperCase())&&!((l=P(l,t.draggable,o,!1))&&l.animated||tt===l)){if(ot=j(l),rt=j(l,t.draggable),"function"==typeof c){if(c.call(this,e,l,this))return q({sortable:n,rootEl:s,name:"filter",targetEl:l,toEl:o,fromEl:o}),G("filter",n,{evt:e}),void(i&&e.cancelable&&e.preventDefault())}else if(c=c&&c.split(",").some(function(t){if(t=P(s,t.trim(),o,!1))return q({sortable:n,rootEl:t,name:"filter",targetEl:l,fromEl:o,toEl:o}),G("filter",n,{evt:e}),!0}))return void(i&&e.cancelable&&e.preventDefault());t.handle&&!P(s,t.handle,o,!1)||this._prepareDragStart(e,a,l)}}},_prepareDragStart:function(t,e,n){var o,i=this,r=i.el,a=i.options,l=r.ownerDocument;n&&!V&&n.parentNode===r&&(o=X(n),Q=r,Z=(V=n).parentNode,J=V.nextSibling,tt=n,lt=a.group,ct={target:Ft.dragged=V,clientX:(e||t).clientX,clientY:(e||t).clientY},ft=ct.clientX-o.left,pt=ct.clientY-o.top,this._lastX=(e||t).clientX,this._lastY=(e||t).clientY,V.style["will-change"]="all",o=function(){G("delayEnded",i,{evt:t}),Ft.eventCanceled?i._onDrop():(i._disableDelayedDragEvents(),!s&&i.nativeDraggable&&(V.draggable=!0),i._triggerDragStart(t,e),q({sortable:i,name:"choose",originalEvent:t}),k(V,a.chosenClass,!0))},a.ignore.split(",").forEach(function(t){b(V,t.trim(),Ht)}),h(l,"dragover",Yt),h(l,"mousemove",Yt),h(l,"touchmove",Yt),h(l,"mouseup",i._onDrop),h(l,"touchend",i._onDrop),h(l,"touchcancel",i._onDrop),s&&this.nativeDraggable&&(this.options.touchStartThreshold=4,V.draggable=!0),G("delayStart",this,{evt:t}),!a.delay||a.delayOnTouchOnly&&!e||this.nativeDraggable&&(w||y)?o():Ft.eventCanceled?this._onDrop():(h(l,"mouseup",i._disableDelayedDrag),h(l,"touchend",i._disableDelayedDrag),h(l,"touchcancel",i._disableDelayedDrag),h(l,"mousemove",i._delayedDragTouchMoveHandler),h(l,"touchmove",i._delayedDragTouchMoveHandler),a.supportPointer&&h(l,"pointermove",i._delayedDragTouchMoveHandler),i._dragStartTimer=setTimeout(o,a.delay)))},_delayedDragTouchMoveHandler:function(t){t=t.touches?t.touches[0]:t;Math.max(Math.abs(t.clientX-this._lastX),Math.abs(t.clientY-this._lastY))>=Math.floor(this.options.touchStartThreshold/(this.nativeDraggable&&window.devicePixelRatio||1))&&this._disableDelayedDrag()},_disableDelayedDrag:function(){V&&Ht(V),clearTimeout(this._dragStartTimer),this._disableDelayedDragEvents()},_disableDelayedDragEvents:function(){var t=this.el.ownerDocument;f(t,"mouseup",this._disableDelayedDrag),f(t,"touchend",this._disableDelayedDrag),f(t,"touchcancel",this._disableDelayedDrag),f(t,"mousemove",this._delayedDragTouchMoveHandler),f(t,"touchmove",this._delayedDragTouchMoveHandler),f(t,"pointermove",this._delayedDragTouchMoveHandler)},_triggerDragStart:function(t,e){e=e||"touch"==t.pointerType&&t,!this.nativeDraggable||e?this.options.supportPointer?h(document,"pointermove",this._onTouchMove):h(document,e?"touchmove":"mousemove",this._onTouchMove):(h(V,"dragend",this),h(Q,"dragstart",this._onDragStart));try{document.selection?Kt(function(){document.selection.empty()}):window.getSelection().removeAllRanges()}catch(t){}},_dragStarted:function(t,e){var n;wt=!1,Q&&V?(G("dragStarted",this,{evt:e}),this.nativeDraggable&&h(document,"dragover",Bt),n=this.options,t||k(V,n.dragClass,!1),k(V,n.ghostClass,!0),Ft.active=this,t&&this._appendGhost(),q({sortable:this,name:"start",originalEvent:e})):this._nulling()},_emulateDragOver:function(){if(ut){this._lastX=ut.clientX,this._lastY=ut.clientY,Rt();for(var t=document.elementFromPoint(ut.clientX,ut.clientY),e=t;t&&t.shadowRoot&&(t=t.shadowRoot.elementFromPoint(ut.clientX,ut.clientY))!==e;)e=t;if(V.parentNode[K]._isOutsideThisEl(t),e)do{if(e[K])if(e[K]._onDragOver({clientX:ut.clientX,clientY:ut.clientY,target:t,rootEl:e})&&!this.options.dragoverBubble)break}while(e=(t=e).parentNode);Xt()}},_onTouchMove:function(t){if(ct){var e=this.options,n=e.fallbackTolerance,o=e.fallbackOffset,i=t.touches?t.touches[0]:t,r=$&&v($,!0),a=$&&r&&r.a,l=$&&r&&r.d,e=Mt&&yt&&E(yt),a=(i.clientX-ct.clientX+o.x)/(a||1)+(e?e[0]-Ct[0]:0)/(a||1),l=(i.clientY-ct.clientY+o.y)/(l||1)+(e?e[1]-Ct[1]:0)/(l||1);if(!Ft.active&&!wt){if(n&&Math.max(Math.abs(i.clientX-this._lastX),Math.abs(i.clientY-this._lastY))D.right+10||S.clientY>x.bottom&&S.clientX>x.left:S.clientY>D.bottom+10||S.clientX>x.right&&S.clientY>x.top)||m.animated)){if(m&&(t=n,e=r,C=X(B((_=this).el,0,_.options,!0)),_=L(_.el,_.options,$),e?t.clientX<_.left-10||t.clientY topbar.show(), delay); + } else { + showing = true; + if (fadeTimerId !== null) window.cancelAnimationFrame(fadeTimerId); + if (!canvas) createCanvas(); + canvas.style.opacity = 1; + canvas.style.display = "block"; + topbar.progress(0); + if (options.autoRun) { + (function loop() { + progressTimerId = window.requestAnimationFrame(loop); + topbar.progress( + "+" + 0.05 * Math.pow(1 - Math.sqrt(currentProgress), 2) + ); + })(); + } + } + }, + progress: function (to) { + if (typeof to === "undefined") return currentProgress; + if (typeof to === "string") { + to = + (to.indexOf("+") >= 0 || to.indexOf("-") >= 0 + ? currentProgress + : 0) + parseFloat(to); + } + currentProgress = to > 1 ? 1 : to; + repaint(); + return currentProgress; + }, + hide: function () { + clearTimeout(delayTimerId); + delayTimerId = null; + if (!showing) return; + showing = false; + if (progressTimerId != null) { + window.cancelAnimationFrame(progressTimerId); + progressTimerId = null; + } + (function loop() { + if (topbar.progress("+.1") >= 1) { + canvas.style.opacity -= 0.05; + if (canvas.style.opacity <= 0.05) { + canvas.style.display = "none"; + fadeTimerId = null; + return; + } + } + fadeTimerId = window.requestAnimationFrame(loop); + })(); + }, + }; + + if (typeof module === "object" && typeof module.exports === "object") { + module.exports = topbar; + } else if (typeof define === "function" && define.amd) { + define(function () { + return topbar; + }); + } else { + this.topbar = topbar; + } +}.call(this, window, document)); diff --git a/bin/deploy b/bin/deploy new file mode 100644 index 0000000..897b472 --- /dev/null +++ b/bin/deploy @@ -0,0 +1,67 @@ +#!/usr/bin/env bash + +set -Eeuo pipefail + +BASE_DIR=$(dirname "${BASH_SOURCE[0]:-$0}") +cd "${BASE_DIR}/.." || exit 127 + +# shellcheck source=../scripts/helpers.sh +. scripts/helpers.sh +# shellcheck source=../scripts/logging.sh +. scripts/logging.sh +# shellcheck source=../scripts/utils.sh +. scripts/utils.sh + +PROGRAM=$(basename "${BASH_SOURCE[0]:-$0}") +VERSION=0.5.5 + +function display_help() { + cat < + + $(help_title_section Commands) + prod Deploy to production environment. + stg Deploy to staging environment [default command]. + + $(help_title_section Options) + -h --help Show this screen. + -v --version Show version. +EOF +} + +function deploy() { + local file + local env + + env=${1:-stg} + file="fly-${env}.toml" + + load_env_file ".env.${env}" + export MIX_ENV="${env}" + + if ! command -v flyctl &>/dev/null; then + log_error "flyctl is not installed. Please install it and authenticate." + exit 1 + fi + + fly deploy --config "${file}" + + log_success "Successfully deployed ${env} to fly.io" +} + +case ${1:-stg} in + -h | --help) + display_help + ;; + -v | --version) + display_version "${VERSION}" "${PROGRAM}" + ;; + prod | stg) + deploy "${1:-stg}" + ;; + *) + display_help >&2 + exit 1 + ;; +esac \ No newline at end of file diff --git a/bin/format b/bin/format new file mode 100644 index 0000000..79cb322 --- /dev/null +++ b/bin/format @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +mix format \ No newline at end of file diff --git a/bin/lint b/bin/lint new file mode 100644 index 0000000..c72038a --- /dev/null +++ b/bin/lint @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +mix credo --strict --all \ No newline at end of file diff --git a/bin/server b/bin/server new file mode 100644 index 0000000..c929a46 --- /dev/null +++ b/bin/server @@ -0,0 +1,50 @@ +#!/usr/bin/env bash + +set -Eeuo pipefail + +BASE_DIR=$(dirname "${BASH_SOURCE[0]:-$0}") +cd "${BASE_DIR}/.." || exit 127 + +# shellcheck source=../scripts/helpers.sh +. scripts/helpers.sh +# shellcheck source=../scripts/logging.sh +. scripts/logging.sh +# shellcheck source=../scripts/utils.sh +. scripts/utils.sh + +PROGRAM=$(basename "${BASH_SOURCE[0]:-$0}") +VERSION=0.5.4 + +function display_help() { + cat < + + $(help_title_section Commands) + local Start development server in your own machine [default command]. + docker Start development server from a docker container. + + $(help_title_section Options) + -h --help Show this screen. + -v --version Show version. +EOF +} + +case ${1:-local} in + -h | --help) + display_help + ;; + -v | --version) + display_version "${VERSION}" "${PROGRAM}" + ;; + docker) + docker-compose -f docker-compose.dev.yml up -d + ;; + local) + mix phx.server + ;; + *) + display_help >&2 + exit 1 + ;; +esac \ No newline at end of file diff --git a/bin/setup b/bin/setup new file mode 100644 index 0000000..f8c4fb0 --- /dev/null +++ b/bin/setup @@ -0,0 +1,114 @@ +#!/usr/bin/env bash + +set -Eeuo pipefail + +BASE_DIR=$(dirname "${BASH_SOURCE[0]:-$0}") +cd "${BASE_DIR}/.." || exit 127 + +# shellcheck source=../scripts/helpers.sh +. scripts/helpers.sh +# shellcheck source=../scripts/logging.sh +. scripts/logging.sh +# shellcheck source=../scripts/utils.sh +. scripts/utils.sh + +PROGRAM=$(basename "${BASH_SOURCE[0]:-$0}") +VERSION=0.5.4 + +function display_help() { + cat < + + $(help_title_section Environments) + dev Development environment [default environment]. + prod Production environment. + + $(help_title_section Modes) + -d --docker Setup the project using docker [default mode]. + -l --local Setup the project locally. + + $(help_title_section Options) + -h --help Show this screen. + -v --version Show version. +EOF +} + +ENV='dev' +MODE='docker' +OS=$(uname | tr '[:upper:]' '[:lower:]') + +while [ ! $# -eq 0 ]; do + case "$1" in + -h | --help) + display_help + exit 0 + ;; + -v | --version) + display_version "${VERSION}" "${PROGRAM}" + exit 0 + ;; + -l | --local) + MODE='local' + ;; + -d | --docker) + MODE='docker' + ;; + *) + display_help >&2 + exit 1 + ;; + esac + + shift +done + +log_info "setup" "Setting up the .env.${ENV}..." +if [ ! -f ".env.${ENV}" ]; then + cp ".env.${ENV}.sample" ".env.${ENV}" + log_success ".env.${ENV} file created, you might want to open .env and set the + correct values. Make sure you export them into your environment before + runing this script again." + exit +else + log_warn ".env.${ENV} file already exists, skipping..." +fi + +if [ $MODE == "local" ]; then + log_info "setup" "Installing required languages..." + if not_installed "asdf"; then + log_error " + We are using asdf (https://github.com/asdf-vm/asdf) to manage tool + dependencies, since it was not found on your system we cannot ensure that you + are using the correct versions of all the tools. Please install it and run + this script again, or proceed at your own peril. + " + + ensure_confirmation + else + set +e + asdf plugin-add erlang https://github.com/asdf-vm/asdf-erlang.git 2>/dev/null + asdf plugin-add elixir https://github.com/asdf-vm/asdf-elixir.git 2>/dev/null + set -e + + asdf install + fi + + load_env_file ".env.${ENV}" + + log_info "setup" "Installing dependencies..." + MIX_ENV=$ENV mix local.hex --force + MIX_ENV=$ENV mix local.rebar --force + MIX_ENV=$ENV mix deps.get + + log_info "setup" "Creating, running migrations and populating database..." + MIX_ENV=$ENV mix ecto.setup + + log_info "setup" "You're good to go! Run bin/server to get the development server running." +else + log_info "setup" "Building Docker image for Elixir." + + docker-compose -f docker-compose.dev.yml -f "${OS}.yml" build + + log_info "setup" "Image created you can now start the containers." +fi \ No newline at end of file diff --git a/bin/test b/bin/test new file mode 100644 index 0000000..05a7bbf --- /dev/null +++ b/bin/test @@ -0,0 +1,47 @@ +#!/usr/bin/env bash + +set -Eeuo pipefail + +BASE_DIR=$(dirname "${BASH_SOURCE[0]:-$0}") +cd "${BASE_DIR}/.." || exit 127 + +# shellcheck source=../scripts/helpers.sh +. scripts/helpers.sh +# shellcheck source=../scripts/logging.sh +. scripts/logging.sh +# shellcheck source=../scripts/utils.sh +. scripts/utils.sh + +PROGRAM=$(basename "${BASH_SOURCE[0]:-$0}") +VERSION=0.5.4 + +function display_help() { + cat < + + $(help_title_section Environments) [default: test] + --test Run all tests in test environment. + --dev Run all tests in dev environment. + + $(help_title_section Options) + -h --help Show this screen. + -v --version Show version. +EOF +} + +case ${1:---test} in + -h | --help) + display_help + ;; + -v | --version) + display_version "${VERSION}" "${PROGRAM}" + ;; + --test) + mix test + ;; + *) + display_help >&2 + exit 1 + ;; +esac \ No newline at end of file diff --git a/components/AdminLayout/AdminLayout.tsx b/components/AdminLayout/AdminLayout.tsx deleted file mode 100644 index d6c37f7..0000000 --- a/components/AdminLayout/AdminLayout.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; -import { PropsWithChildren } from 'react'; - -import Footer from '~/components/Footer'; -import Navbar from '~/components/Navbar'; - -import { NAVBAR_ENTRIES } from './config'; -import styles from './style.module.css'; - -const queryClient = new QueryClient(); - -interface Props { - tab: string; -} - -export default function AdminLayout({ tab, children }: PropsWithChildren) { - return ( - -
-
- - {children} -
-
-
-
- ); -} diff --git a/components/AdminLayout/config.tsx b/components/AdminLayout/config.tsx deleted file mode 100644 index a790fdd..0000000 --- a/components/AdminLayout/config.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import { - FormOutlined, - InboxOutlined, - InfoCircleOutlined, - LinkOutlined, - QrcodeOutlined, - TagsOutlined -} from '@ant-design/icons'; - -export const NAVBAR_ENTRIES = [ - { - key: 'links', - path: '/admin', - icon: , - title: 'Links' - }, - { - key: 'forms', - path: '/admin/forms', - icon: , - title: 'Forms' - }, - { - key: 'redirects', - path: '/admin/redirects', - icon: , - title: 'Redirects' - }, - { - key: 'archived', - path: '/admin/archived', - icon: , - title: 'Archived' - }, - { - key: 'qrcodes', - path: '/admin/qrcodes', - icon: , - title: 'QR Codes' - }, - { - key: 'about', - path: '/admin/about', - icon: , - title: 'About' - } -]; diff --git a/components/AdminLayout/index.ts b/components/AdminLayout/index.ts deleted file mode 100644 index 753780c..0000000 --- a/components/AdminLayout/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default } from './AdminLayout'; diff --git a/components/AdminLayout/style.module.css b/components/AdminLayout/style.module.css deleted file mode 100644 index ab0a3ae..0000000 --- a/components/AdminLayout/style.module.css +++ /dev/null @@ -1,6 +0,0 @@ -.Container { - display: flex; - flex-direction: column; - justify-content: space-between; - min-height: 100vh; -} diff --git a/components/ArchivedLinksTable/Actions.tsx b/components/ArchivedLinksTable/Actions.tsx deleted file mode 100644 index a51d501..0000000 --- a/components/ArchivedLinksTable/Actions.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import { Button, Popconfirm, Space } from 'antd'; -import { useState } from 'react'; - -import { useDeleteLink, useUpdateLink } from '~/hooks/links'; - -function Actions({ record }) { - const [isVisible, setVisible] = useState(false); - const { isLoading: isUpdateLoading, mutate: updateLink } = useUpdateLink(); - const { isLoading: isDeleteLoading, mutate: deleteLink } = useDeleteLink(); - - const isLoading = isUpdateLoading || isDeleteLoading; - - const archiveLink = () => { - updateLink({ ...record, archived: false }); - }; - - const destroyLink = () => { - deleteLink(record); - }; - - return ( - - - setVisible(false)} - > - - - - ); -} - -export default Actions; diff --git a/components/ArchivedLinksTable/config.tsx b/components/ArchivedLinksTable/config.tsx deleted file mode 100644 index b0d129b..0000000 --- a/components/ArchivedLinksTable/config.tsx +++ /dev/null @@ -1,60 +0,0 @@ -import { Dropdown, Space, Typography } from 'antd'; -import type { ColumnsType } from 'antd/es/table'; -import { Twemoji } from 'react-emoji-render'; -import { QRCode } from 'react-qrcode-logo'; - -import { ILink } from '~/models/Link'; - -import LinkWithQRCode from '../LinkWithQRCode'; -import Actions from './Actions'; -import styles from './style.module.css'; - -export const COLUMNS: ColumnsType = [ - { - title: 'Emoji', - dataIndex: 'emoji', - fixed: 'left', - align: 'center', - width: 40, - className: styles.Visible, - render: function Emoji(emoji) { - return ; - } - }, - { - title: 'Title', - dataIndex: 'title', - width: 250, - className: styles.Visible - }, - { - title: 'URL', - dataIndex: 'url', - className: styles.Visible, - render: function Url(url) { - return
{url}; - } - }, - { - title: 'Link', - width: 400, - dataIndex: 'link', - render: function UrlLink(url) { - return ; - } - }, - { - title: 'Clicks', - dataIndex: 'clicks', - align: 'center', - width: 40, - className: styles.Visible - }, - { - title: 'Action', - fixed: 'right', - render: function Action(_, record) { - return ; - } - } -]; diff --git a/components/ArchivedLinksTable/index.tsx b/components/ArchivedLinksTable/index.tsx deleted file mode 100644 index 9c53a2c..0000000 --- a/components/ArchivedLinksTable/index.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { Table } from 'antd'; - -import { useArchivedLinks } from '~/hooks/links'; - -import { COLUMNS } from './config'; - -function LinksTable() { - const { isLoading, data: links } = useArchivedLinks(); - - return ( - - ); -} - -export default LinksTable; diff --git a/components/ArchivedLinksTable/style.module.css b/components/ArchivedLinksTable/style.module.css deleted file mode 100644 index fd87240..0000000 --- a/components/ArchivedLinksTable/style.module.css +++ /dev/null @@ -1,3 +0,0 @@ -.Visible { - visibility: visible; -} diff --git a/components/Card/Card.tsx b/components/Card/Card.tsx deleted file mode 100644 index d1a5d28..0000000 --- a/components/Card/Card.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import 'animate.css'; -import classNames from 'classnames'; -import { Twemoji } from 'react-emoji-render'; - -import { ILink } from '~/models/Link'; - -import styles from './style.module.css'; - -type Props = ILink; - -const Card = ({ title, emoji, link, attention }: Props) => ( - -
-

- -

-
-); - -export default Card; diff --git a/components/Card/index.ts b/components/Card/index.ts deleted file mode 100644 index c68311d..0000000 --- a/components/Card/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default } from './Card'; diff --git a/components/Card/style.module.css b/components/Card/style.module.css deleted file mode 100644 index e197262..0000000 --- a/components/Card/style.module.css +++ /dev/null @@ -1,56 +0,0 @@ -@value colors: "../../styles/colors.css"; -@value blue from colors; -@value orange from colors; - -.card { - position: relative; - overflow: hidden; - cursor: pointer; - flex-basis: 45%; - padding: 1.5rem; - min-width: 20rem; - text-align: left; - color: inherit; - text-decoration: none; - margin: 1rem; - border: 1px solid #eaeaea; - border-radius: 10px; - transition: all 0.45s ease-out; - user-select: none; -} - -.underline { - width: 100%; - height: 5px; - margin-top: 10px; - align-self: flex-end; - left: -100%; - background: orange; - position: absolute; - transition: all 0.3s ease-out; - bottom: 0; -} - -.card:focus, -.card:active, -.card:hover .underline { - left: 0; -} - -.card h3 { - margin: 0; - font-size: 1.5rem; -} - -.card p { - margin: 1rem 0 0 0; - font-size: 1.25rem; - line-height: 1.5; -} - -@media (max-width: 1050px) { - .card { - margin: 0.8rem 0; - width: 85%; - } -} diff --git a/components/EditableTable/EditableCell.js b/components/EditableTable/EditableCell.js deleted file mode 100644 index ebe39c6..0000000 --- a/components/EditableTable/EditableCell.js +++ /dev/null @@ -1,38 +0,0 @@ -import { Form, Input, InputNumber } from 'antd'; - -const EditableCell = ({ - editing, - dataIndex, - required = true, - title, - inputType = 'text', - children, - ...restProps -}) => { - const inputNode = inputType === 'number' ? : ; - - return ( -
- ); -}; - -export default EditableCell; diff --git a/components/EditableTable/EditableTable.js b/components/EditableTable/EditableTable.js deleted file mode 100644 index dfd2dba..0000000 --- a/components/EditableTable/EditableTable.js +++ /dev/null @@ -1,38 +0,0 @@ -import { Form, Table } from 'antd'; - -import EditableCell from './EditableCell'; - -const EditableTable = ({ form, isEditing, columns, ...props }) => { - const mergedColumns = columns.map((col) => { - if (!col.editable) { - return col; - } - - return { - ...col, - onCell: (record) => ({ - record, - inputType: col.inputType || 'text', - dataIndex: col.dataIndex, - title: col.title, - editing: isEditing(record) - }) - }; - }); - - return ( - -
- {editing ? ( - - {inputNode} - - ) : ( - children - )} -
- - ); -}; - -export default EditableTable; diff --git a/components/EditableTable/index.js b/components/EditableTable/index.js deleted file mode 100644 index 5603343..0000000 --- a/components/EditableTable/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from './EditableTable'; diff --git a/components/Footer/config.ts b/components/Footer/config.ts deleted file mode 100644 index 9bad02e..0000000 --- a/components/Footer/config.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { ESocialIcon, ISocialIcon } from '~/components/SocialIcon'; - -export const DEFAULT_SOCIAL_NETWORKS: ISocialIcon[] = [ - { - name: 'Facebook', - tag: ESocialIcon.Facebook, - base_url: 'https://facebook.com', - username: 'cesiuminho' - }, - - { - name: 'Instagram', - tag: ESocialIcon.Instagram, - base_url: 'https://instagram.com', - username: 'cesiuminho' - }, - - { - name: 'Twitter', - tag: ESocialIcon.Twitter, - base_url: 'https://twitter.com', - username: 'cesiuminho' - }, - - { - name: 'GitHub', - tag: ESocialIcon.GitHub, - base_url: 'https://github.com', - username: 'cesium' - } -]; diff --git a/components/Footer/index.tsx b/components/Footer/index.tsx deleted file mode 100644 index c23d185..0000000 --- a/components/Footer/index.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import Image from 'next/image'; -import { IoHeart } from 'react-icons/io5'; - -import SocialIcon, { ISocialIcon } from '~/components/SocialIcon'; -import { SETTINGS } from '~/data/config'; - -import logo from '../../public/cesium.svg'; -import { DEFAULT_SOCIAL_NETWORKS } from './config'; -import styles from './style.module.css'; - -interface Props { - social?: ISocialIcon[]; -} - -const Footer = ({ social = DEFAULT_SOCIAL_NETWORKS }: Props) => ( - -); - -export default Footer; diff --git a/components/Footer/style.module.css b/components/Footer/style.module.css deleted file mode 100644 index f4cda2e..0000000 --- a/components/Footer/style.module.css +++ /dev/null @@ -1,50 +0,0 @@ -@value colors: "../../styles/colors.css"; -@value orange from colors; - -.footer { - width: 100%; - height: 150px; - border-top: 1px solid #eaeaea; - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; -} - -.footer img { - margin-left: 0.5rem; -} - -.footer a { - display: flex; - justify-content: center; - align-items: center; - color: black; - font-size: 1rem; -} - -.social { - margin: 1em; -} - -.social a { - display: inline; - margin: 10px; -} - -.footer a:hover { - color: black; -} - -.social a:hover { - color: orange; -} - -.copyright { - margin: 1em; -} - -.heart { - margin: 0 0.2em; - color: orange; -} diff --git a/components/FormsTable/Actions.js b/components/FormsTable/Actions.js deleted file mode 100644 index 4c3091b..0000000 --- a/components/FormsTable/Actions.js +++ /dev/null @@ -1,85 +0,0 @@ -import { CloseOutlined, DeleteOutlined, EditOutlined, SaveOutlined } from '@ant-design/icons'; -import { Button, Popconfirm, Space, notification } from 'antd'; -import { useState } from 'react'; - -import { useEditing } from '~/hooks/Editing'; -import { useDeleteForm, useForms, useUpdateForm } from '~/hooks/forms'; - -function DeleteEntry({ record }) { - const [isVisible, setVisible] = useState(false); - const [loading, setLoading] = useState(false); - const { mutate } = useDeleteForm(); - - const confirm = () => { - setLoading(true); - mutate(record.id); - setVisible(false); - setLoading(false); - }; - - return ( - setVisible(false)} - > - - - ); -} - -function Actions({ record }) { - const { isLoading, data: forms } = useForms(); - const { mutate } = useUpdateForm(); - const { editing, dispatch: dispatchEditing } = useEditing(); - - const edit = (record) => { - editing.form.setFieldsValue({ - name: '', - slug: '', - url: '', - ...record - }); - dispatchEditing({ type: 'EDIT', key: record._id }); - }; - - const save = async (id) => { - if (isLoading) return; - const row = await editing.form.validateFields(); - if (forms.some((elem) => elem.slug === row.slug && row.slug !== record.slug)) { - notification['error']({ - message: 'Invalid fields', - description: 'Slug already exists' - }); - } else { - mutate({ ...row, id }); - dispatchEditing({ type: 'CANCEL' }); - } - }; - - return record._id === editing.key ? ( - - - - - ) : ( - - - - - ); -} - -export default Actions; diff --git a/components/FormsTable/NewForm.tsx b/components/FormsTable/NewForm.tsx deleted file mode 100644 index 9876cfc..0000000 --- a/components/FormsTable/NewForm.tsx +++ /dev/null @@ -1,96 +0,0 @@ -import { QuestionCircleOutlined } from '@ant-design/icons'; -import { Button, Form, Input, Modal, Space, Tooltip } from 'antd'; -import { useState } from 'react'; - -import { useCreateForm, useForms } from '~/hooks/forms'; -import { IForm } from '~/models/Form'; - -const { Item } = Form; - -function NewForm() { - const { isLoading, data: forms } = useForms(); - const { mutate } = useCreateForm(); - const [isVisible, setVisible] = useState(false); - const [form] = Form.useForm(); - - const ok = () => { - form.submit(); - setVisible(false); - }; - - const onFinish = (values: Partial) => { - mutate(values); - form.resetFields(); - }; - - return ( - <> - - setVisible(false)}> -
- - Name - - - - - } - rules={[ - { - required: true, - message: 'Please insert a name.' - } - ]} - > - - - { - if (isLoading) return; - if (forms.some((elem) => elem.slug === value)) { - return Promise.reject(new Error('Slug already exists')); - } else { - Promise.resolve(); - } - } - } - ]} - > - - - - - - -
- - ); -} - -export default NewForm; diff --git a/components/FormsTable/config.tsx b/components/FormsTable/config.tsx deleted file mode 100644 index 531992c..0000000 --- a/components/FormsTable/config.tsx +++ /dev/null @@ -1,63 +0,0 @@ -import { Dropdown, Space, Typography } from 'antd'; -import { QRCode } from 'react-qrcode-logo'; - -import { formatFromNow } from '~/lib/utils/date'; - -import LinkWithQRCode from '../LinkWithQRCode'; -import Actions from './Actions'; - -export const FORMS_COLUMNS = [ - { - title: 'Name', - editable: true, - required: false, - width: 250, - dataIndex: 'name' - }, - { - title: 'Slug', - editable: true, - width: 175, - dataIndex: 'slug' - }, - { - title: 'URL', - editable: true, - dataIndex: 'url', - render: function Url(url) { - return {url}; - } - }, - { - title: 'Link', - editable: false, - width: 400, - dataIndex: 'link', - render: function UrlLink(url) { - return ; - } - }, - { - title: 'Visits', - editable: false, - align: 'center', - width: 40, - dataIndex: 'visits' - }, - { - title: 'Last edited', - editable: false, - width: 150, - dataIndex: 'updated', - render: function Updated(updated) { - return {formatFromNow(updated)}; - } - }, - { - title: 'Actions', - fixed: 'right', - render: function Action(_, record) { - return ; - } - } -]; diff --git a/components/FormsTable/index.js b/components/FormsTable/index.js deleted file mode 100644 index 06df152..0000000 --- a/components/FormsTable/index.js +++ /dev/null @@ -1,34 +0,0 @@ -import EditableTable from '~/components/EditableTable'; -import { useEditing } from '~/hooks/Editing'; -import { useForms } from '~/hooks/forms'; - -import NewForm from './NewForm'; -import { FORMS_COLUMNS } from './config'; - -function FormsTable() { - const { isLoading, data: forms } = useForms(); - const { editing, dispatch } = useEditing(); - - const isEditing = (record) => record._id === editing.key; - - if (isLoading) return null; - - return ( - dispatch({ type: 'CANCEL' }), - position: ['bottomCenter'] - }} - footer={() => } - /> - ); -} - -export default FormsTable; diff --git a/components/Layout/Layout.tsx b/components/Layout/Layout.tsx deleted file mode 100644 index 864a261..0000000 --- a/components/Layout/Layout.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import Head from 'next/head'; -import { PropsWithChildren } from 'react'; - -import Footer from '~/components/Footer'; - -import styles from './style.module.css'; - -interface Props { - title: string; -} - -const Layout = ({ children, title }: PropsWithChildren) => ( -
- - {title} - - - - -
{children}
- -
-
-); - -export default Layout; diff --git a/components/Layout/index.ts b/components/Layout/index.ts deleted file mode 100644 index 9592f29..0000000 --- a/components/Layout/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default } from './Layout'; diff --git a/components/Layout/style.module.css b/components/Layout/style.module.css deleted file mode 100644 index e4b964f..0000000 --- a/components/Layout/style.module.css +++ /dev/null @@ -1,16 +0,0 @@ -.Container { - min-height: 100vh; - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; -} - -.Main { - padding: 1rem 0; - flex: 1; - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; -} diff --git a/components/LinkWithQRCode/LinkWithQRCode.tsx b/components/LinkWithQRCode/LinkWithQRCode.tsx deleted file mode 100644 index d4faf7e..0000000 --- a/components/LinkWithQRCode/LinkWithQRCode.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import { Dropdown, Space, Typography } from 'antd'; -import { QRCode } from 'react-qrcode-logo'; - -const LinkWithQRCode = ({ link }) => ( - - - {link} - - - - } - trigger={['click']} - > - e.preventDefault()}>(QR Code) - - -); - -export default LinkWithQRCode; diff --git a/components/LinkWithQRCode/index.ts b/components/LinkWithQRCode/index.ts deleted file mode 100644 index e25ad13..0000000 --- a/components/LinkWithQRCode/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default } from './LinkWithQRCode'; diff --git a/components/LinksTable/Actions.tsx b/components/LinksTable/Actions.tsx deleted file mode 100644 index 1f4a97f..0000000 --- a/components/LinksTable/Actions.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import { Button, Space } from 'antd'; - -import { useUpdateLink } from '~/hooks/links'; - -function Actions({ record }) { - const { mutate } = useUpdateLink(); - - const archiveLink = () => { - mutate({ ...record, archived: true }); - }; - - return ( - - - - ); -} - -export default Actions; diff --git a/components/LinksTable/NewLink.tsx b/components/LinksTable/NewLink.tsx deleted file mode 100644 index 8fdcc8a..0000000 --- a/components/LinksTable/NewLink.tsx +++ /dev/null @@ -1,90 +0,0 @@ -import { QuestionCircleOutlined } from '@ant-design/icons'; -import { Button, Checkbox, Form, Input, Modal, Tooltip } from 'antd'; -import { useState } from 'react'; - -import { useLinks } from '~/hooks/links'; -import { useCreateLink } from '~/hooks/links/useCreateLink'; -import { ILink } from '~/models/Link'; - -const { Item } = Form; - -function NewLink() { - const { data: links } = useLinks(); - const { mutate } = useCreateLink(); - const [isVisible, setVisible] = useState(false); - const [form] = Form.useForm(); - - const ok = () => { - form.submit(); - setVisible(false); - }; - - const onFinish = (values: Partial) => { - mutate({ ...values, index: links.length }); - form.resetFields(); - }; - - return ( - <> - - setVisible(false)}> -
- - Emoji  - - - - - } - rules={[ - { - required: true, - message: 'Please select an emoji.' - } - ]} - > - - - - - - - - - - Attention - - -
- - ); -} - -export default NewLink; diff --git a/components/LinksTable/config.tsx b/components/LinksTable/config.tsx deleted file mode 100644 index faf2ffd..0000000 --- a/components/LinksTable/config.tsx +++ /dev/null @@ -1,78 +0,0 @@ -import { Checkbox, Dropdown, Space, Typography } from 'antd'; -import type { ColumnsType } from 'antd/es/table'; -import { Twemoji } from 'react-emoji-render'; -import { QRCode } from 'react-qrcode-logo'; - -import { Dragger } from '~/components/Table'; -import { ILink } from '~/models/Link'; - -import LinkWithQRCode from '../LinkWithQRCode'; -import Actions from './Actions'; -import styles from './style.module.css'; - -export const COLUMNS: ColumnsType = [ - { - title: '#', - width: 40, - className: styles.visible, - render: function Order() { - return ; - } - }, - { - title: 'Emoji', - dataIndex: 'emoji', - fixed: 'left', - align: 'center', - width: 40, - className: styles.visible, - render: function Emoji(emoji) { - return ; - } - }, - { - title: 'Title', - dataIndex: 'title', - width: 250, - className: styles.visible - }, - { - title: 'Attention', - dataIndex: 'attention', - align: 'center', - width: 40, - render: function Attention(state) { - return ; - } - }, - { - title: 'URL', - dataIndex: 'url', - className: styles.visible, - render: function Url(url) { - return {url}; - } - }, - { - title: 'Link', - width: 400, - dataIndex: 'link', - render: function UrlLink(url) { - return ; - } - }, - { - title: 'Clicks', - dataIndex: 'clicks', - align: 'center', - width: 40, - className: styles.visible - }, - { - title: 'Action', - fixed: 'right', - render: function Action(_, record) { - return ; - } - } -]; diff --git a/components/LinksTable/index.tsx b/components/LinksTable/index.tsx deleted file mode 100644 index 752ecca..0000000 --- a/components/LinksTable/index.tsx +++ /dev/null @@ -1,68 +0,0 @@ -import { Table } from 'antd'; -import { arrayMoveImmutable } from 'array-move'; - -import { SortableBody, SortableItem } from '~/components/Table'; -import { useLinks, useUpdateLink } from '~/hooks/links'; - -import NewLink from './NewLink'; -import { COLUMNS } from './config'; -import styles from './style.module.css'; - -const sortLinks = (links, mutate, { oldIndex, newIndex }) => { - if (oldIndex !== newIndex) { - return arrayMoveImmutable([].concat(links), oldIndex, newIndex) - .filter((elem) => !!elem) - .map((elem, index) => { - mutate({ ...elem, index }); - }); - } - - return links; -}; - -const DraggableContainer = (props) => { - const { data: links } = useLinks(); - const { mutate } = useUpdateLink(); - - return ( - sortLinks(links, mutate, args)} - {...props} - /> - ); -}; - -const DraggableBodyRow = ({ ...restProps }) => { - const { isLoading, data: links } = useLinks(); - if (isLoading) return null; - // function findIndex base on Table rowKey props and should always be a right array index - const index = links.findIndex((x) => x.index === restProps['data-row-key']); - return ; -}; - -function LinksTable() { - const { isLoading, data: links } = useLinks(); - - return ( -
} - /> - ); -} - -export default LinksTable; diff --git a/components/LinksTable/style.module.css b/components/LinksTable/style.module.css deleted file mode 100644 index 698f15b..0000000 --- a/components/LinksTable/style.module.css +++ /dev/null @@ -1,13 +0,0 @@ -.dragging { - background: #fafafa; - border: 1px solid #ccc; -} - -.dragging td { - padding: 16px; - visibility: hidden; -} - -.dragging .visible { - visibility: visible; -} diff --git a/components/Navbar/Navbar.tsx b/components/Navbar/Navbar.tsx deleted file mode 100644 index 8637c0c..0000000 --- a/components/Navbar/Navbar.tsx +++ /dev/null @@ -1,45 +0,0 @@ -import { UserOutlined } from '@ant-design/icons'; -import { useUser } from '@auth0/nextjs-auth0'; -import { Avatar, Col, Menu, Row, Space, Typography } from 'antd'; -import Link from 'next/link'; - -import { DEFAULT_NAVBAR_ENTRIES } from './config'; -import styles from './style.module.css'; - -interface Props { - selected: string; - entries?: { key: string; path: string; title: string; icon: JSX.Element }[]; -} - -function Navbar({ selected, entries = DEFAULT_NAVBAR_ENTRIES }: Props) { - const { user } = useUser(); - - return ( - - - - {entries.map(({ key, path, title, icon }) => ( - - {title} - - ))} - - } /> - {user?.name} - - } - > - - logout - - - - - - ); -} - -export default Navbar; diff --git a/components/Navbar/config.tsx b/components/Navbar/config.tsx deleted file mode 100644 index c28e052..0000000 --- a/components/Navbar/config.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import { - FormOutlined, - InboxOutlined, - InfoCircleOutlined, - LinkOutlined, - QrcodeOutlined, - TagsOutlined -} from '@ant-design/icons'; - -export const DEFAULT_NAVBAR_ENTRIES = [ - { - key: 'links', - path: '/admin', - icon: , - title: 'Links' - }, - { - key: 'forms', - path: '/admin/forms', - icon: , - title: 'Forms' - }, - { - key: 'redirects', - path: '/admin/redirects', - icon: , - title: 'Redirects' - }, - { - key: 'archived', - path: '/admin/archived', - icon: , - title: 'Archived' - }, - { - key: 'qrcodes', - path: '/admin/qrcodes', - icon: , - title: 'QR Codes' - }, - { - key: 'about', - path: '/admin/about', - icon: , - title: 'About' - } -]; diff --git a/components/Navbar/index.ts b/components/Navbar/index.ts deleted file mode 100644 index 86d1b79..0000000 --- a/components/Navbar/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default } from './Navbar'; diff --git a/components/Navbar/style.module.css b/components/Navbar/style.module.css deleted file mode 100644 index 2d0d9b3..0000000 --- a/components/Navbar/style.module.css +++ /dev/null @@ -1,4 +0,0 @@ -.avatar { - margin-left: auto; - margin-right: 0; -} diff --git a/components/RedirectsTable/Actions.js b/components/RedirectsTable/Actions.js deleted file mode 100644 index 3374bbd..0000000 --- a/components/RedirectsTable/Actions.js +++ /dev/null @@ -1,85 +0,0 @@ -import { CloseOutlined, DeleteOutlined, EditOutlined, SaveOutlined } from '@ant-design/icons'; -import { Button, Popconfirm, Space, notification } from 'antd'; -import { useState } from 'react'; - -import { useEditing } from '~/hooks/Editing'; -import { useDeleteRedirect, useRedirects, useUpdateRedirect } from '~/hooks/redirects'; - -function DeleteEntry({ record }) { - const [isVisible, setVisible] = useState(false); - const [loading, setLoading] = useState(false); - const { mutate } = useDeleteRedirect(); - - const confirm = () => { - setLoading(true); - mutate(record.id); - setVisible(false); - setLoading(false); - }; - - return ( - setVisible(false)} - > - - - ); -} - -function Actions({ record }) { - const { isLoading, data: redirects } = useRedirects(); - const { mutate } = useUpdateRedirect(); - const { editing, dispatch: dispatchEditing } = useEditing(); - - const edit = (record) => { - editing.form.setFieldsValue({ - name: '', - slug: '', - url: '', - ...record - }); - dispatchEditing({ type: 'EDIT', key: record._id }); - }; - - const save = async (id) => { - if (isLoading) return; - const row = await editing.form.validateFields(); - if (redirects.some((elem) => elem.slug === row.slug && row.slug !== record.slug)) { - notification['error']({ - message: 'Invalid fields', - description: 'Slug already exists' - }); - } else { - mutate({ ...row, id }); - dispatchEditing({ type: 'CANCEL' }); - } - }; - - return record._id === editing.key ? ( - - - - - ) : ( - - - - - ); -} - -export default Actions; diff --git a/components/RedirectsTable/NewRedirect.tsx b/components/RedirectsTable/NewRedirect.tsx deleted file mode 100644 index 54880fa..0000000 --- a/components/RedirectsTable/NewRedirect.tsx +++ /dev/null @@ -1,97 +0,0 @@ -import { QuestionCircleOutlined } from '@ant-design/icons'; -import { Button, Form, Input, Modal, Space, Tooltip } from 'antd'; -import { useState } from 'react'; - -import { useCreateRedirect, useRedirects } from '~/hooks/redirects'; -import { IForm } from '~/models/Form'; -import { IRedirect } from '~/models/Redirect'; - -const { Item } = Form; - -function NewRedirect() { - const { isLoading, data: redirects } = useRedirects(); - const { mutate } = useCreateRedirect(); - const [isVisible, setVisible] = useState(false); - const [form] = Form.useForm(); - - const ok = () => { - form.submit(); - setVisible(false); - }; - - const onFinish = (values: Partial) => { - mutate(values); - form.resetFields(); - }; - - return ( - <> - - setVisible(false)}> -
- - Name - - - - - } - rules={[ - { - required: true, - message: 'Please insert a name.' - } - ]} - > - - - { - if (isLoading) return; - if (redirects.some((elem) => elem.slug === value)) { - return Promise.reject(new Error('Slug already exists')); - } else { - Promise.resolve(); - } - } - } - ]} - > - - - - - - -
- - ); -} - -export default NewRedirect; diff --git a/components/RedirectsTable/config.tsx b/components/RedirectsTable/config.tsx deleted file mode 100644 index 365e1f9..0000000 --- a/components/RedirectsTable/config.tsx +++ /dev/null @@ -1,63 +0,0 @@ -import { Dropdown, Space, Typography } from 'antd'; -import { QRCode } from 'react-qrcode-logo'; - -import { formatFromNow } from '~/lib/utils/date'; - -import LinkWithQRCode from '../LinkWithQRCode'; -import Actions from './Actions'; - -export const REDIRECTS_COLUMNS = [ - { - title: 'Name', - editable: true, - required: false, - width: 250, - dataIndex: 'name' - }, - { - title: 'Slug', - editable: true, - width: 175, - dataIndex: 'slug' - }, - { - title: 'URL', - editable: true, - dataIndex: 'url', - render: function Url(url) { - return {url}; - } - }, - { - title: 'Link', - editable: false, - width: 400, - dataIndex: 'link', - render: function UrlLink(url) { - return ; - } - }, - { - title: 'Visits', - editable: false, - align: 'center', - width: 40, - dataIndex: 'visits' - }, - { - title: 'Last edited', - editable: false, - width: 150, - dataIndex: 'updated', - render: function Updated(updated) { - return {formatFromNow(updated)}; - } - }, - { - title: 'Actions', - fixed: 'right', - render: function Action(_, record) { - return ; - } - } -]; diff --git a/components/RedirectsTable/index.js b/components/RedirectsTable/index.js deleted file mode 100644 index b1ec03f..0000000 --- a/components/RedirectsTable/index.js +++ /dev/null @@ -1,34 +0,0 @@ -import EditableTable from '~/components/EditableTable'; -import { useEditing } from '~/hooks/Editing'; -import { useRedirects } from '~/hooks/redirects'; - -import NewRedirect from './NewRedirect'; -import { REDIRECTS_COLUMNS } from './config'; - -function RedirectsTable() { - const { isLoading, data: redirects } = useRedirects(); - const { editing, dispatch } = useEditing(); - - const isEditing = (record) => record._id === editing.key; - - if (isLoading) return null; - - return ( - dispatch({ type: 'CANCEL' }), - position: ['bottomCenter'] - }} - footer={() => } - /> - ); -} - -export default RedirectsTable; diff --git a/components/SocialIcon/SocialIcon.tsx b/components/SocialIcon/SocialIcon.tsx deleted file mode 100644 index 4715e3b..0000000 --- a/components/SocialIcon/SocialIcon.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import { SOCIAL_ICONS } from './config'; -import { ISocialIcon } from './types'; - -type Props = ISocialIcon; - -const SocialIcon = ({ name, base_url, username, tag }: Props) => { - const Icon = SOCIAL_ICONS[tag]; - - return ( - - - - ); -}; - -export default SocialIcon; diff --git a/components/SocialIcon/config.ts b/components/SocialIcon/config.ts deleted file mode 100644 index e859d8f..0000000 --- a/components/SocialIcon/config.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { IoLogoFacebook, IoLogoGithub, IoLogoInstagram, IoLogoTwitter } from 'react-icons/io5'; -import { IconType } from 'react-icons/lib'; - -import { ESocialIcon } from './types'; - -export const SOCIAL_ICONS: { [key in ESocialIcon]: IconType } = { - facebook: IoLogoFacebook, - instagram: IoLogoInstagram, - twitter: IoLogoTwitter, - github: IoLogoGithub -}; diff --git a/components/SocialIcon/index.ts b/components/SocialIcon/index.ts deleted file mode 100644 index 107257d..0000000 --- a/components/SocialIcon/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export { default } from './SocialIcon'; -export * from './config'; -export * from './types'; diff --git a/components/SocialIcon/types.ts b/components/SocialIcon/types.ts deleted file mode 100644 index 15c0742..0000000 --- a/components/SocialIcon/types.ts +++ /dev/null @@ -1,13 +0,0 @@ -export enum ESocialIcon { - GitHub = 'github', - Facebook = 'facebook', - Instagram = 'instagram', - Twitter = 'twitter' -} - -export interface ISocialIcon { - name: string; - base_url: string; - username: string; - tag: ESocialIcon; -} diff --git a/components/Table/Dragger.tsx b/components/Table/Dragger.tsx deleted file mode 100644 index ef07d38..0000000 --- a/components/Table/Dragger.tsx +++ /dev/null @@ -1,6 +0,0 @@ -import { MenuOutlined } from '@ant-design/icons'; -import { SortableHandle } from 'react-sortable-hoc'; - -export const Dragger = SortableHandle(() => ( - -)); diff --git a/components/Table/SortableBody.tsx b/components/Table/SortableBody.tsx deleted file mode 100644 index ff3ad81..0000000 --- a/components/Table/SortableBody.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { SortableContainer } from 'react-sortable-hoc'; - -export const SortableBody = SortableContainer( - (props: React.HTMLAttributes) =>
-); diff --git a/components/Table/SortableItem.tsx b/components/Table/SortableItem.tsx deleted file mode 100644 index 5638f1a..0000000 --- a/components/Table/SortableItem.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { SortableElement } from 'react-sortable-hoc'; - -export const SortableItem = SortableElement((props: React.HTMLAttributes) => ( - -)); diff --git a/components/Table/index.ts b/components/Table/index.ts deleted file mode 100644 index 2d9de76..0000000 --- a/components/Table/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './Dragger'; -export * from './SortableBody'; -export * from './SortableItem'; diff --git a/config/config.exs b/config/config.exs new file mode 100644 index 0000000..e18ccff --- /dev/null +++ b/config/config.exs @@ -0,0 +1,57 @@ +# This file is responsible for configuring your application +# and its dependencies with the aid of the Config module. +# +# This configuration file is loaded before any dependency and +# is restricted to this project. + +# General application configuration +import Config + +config :cesium_link, + ecto_repos: [CesiumLink.Repo], + generators: [timestamp_type: :utc_datetime] + +# Configures the endpoint +config :cesium_link, CesiumLinkWeb.Endpoint, + url: [host: "localhost"], + adapter: Bandit.PhoenixAdapter, + render_errors: [ + formats: [html: CesiumLinkWeb.ErrorHTML, json: CesiumLinkWeb.ErrorJSON], + layout: false + ], + pubsub_server: CesiumLink.PubSub, + live_view: [signing_salt: "R50KmcDZ"] + +# Configure esbuild (the version is required) +config :esbuild, + version: "0.17.11", + cesium_link: [ + args: + ~w(js/app.js --bundle --target=es2017 --outdir=../priv/static/assets --external:/fonts/* --external:/images/*), + cd: Path.expand("../assets", __DIR__), + env: %{"NODE_PATH" => Path.expand("../deps", __DIR__)} + ] + +# Configure tailwind (the version is required) +config :tailwind, + version: "3.4.0", + cesium_link: [ + args: ~w( + --config=tailwind.config.js + --input=css/app.css + --output=../priv/static/assets/app.css + ), + cd: Path.expand("../assets", __DIR__) + ] + +# Configures Elixir's Logger +config :logger, :console, + format: "$time $metadata[$level] $message\n", + metadata: [:request_id] + +# Use Jason for JSON parsing in Phoenix +config :phoenix, :json_library, Jason + +# Import environment specific config. This must remain at the bottom +# of this file so it overrides the configuration defined above. +import_config "#{config_env()}.exs" diff --git a/config/dev.exs b/config/dev.exs new file mode 100644 index 0000000..609d754 --- /dev/null +++ b/config/dev.exs @@ -0,0 +1,82 @@ +import Config + +# Configure your database +config :cesium_link, CesiumLink.Repo, + username: "postgres", + password: "postgres", + hostname: "localhost", + database: "cesium_link_dev", + stacktrace: true, + show_sensitive_data_on_connection_error: true, + pool_size: 10 + +# For development, we disable any cache and enable +# debugging and code reloading. +# +# The watchers configuration can be used to run external +# watchers to your application. For example, we can use it +# to bundle .js and .css sources. +config :cesium_link, CesiumLinkWeb.Endpoint, + # Binding to loopback ipv4 address prevents access from other machines. + # Change to `ip: {0, 0, 0, 0}` to allow access from other machines. + http: [ip: {127, 0, 0, 1}, port: 4000], + check_origin: false, + code_reloader: true, + debug_errors: true, + secret_key_base: "6u3rGnb0UXmh9e8TXewRiiEYUFNvzvvgHTrDY0EqxJq7t44sm8gVtVO9+7AfQtQV", + watchers: [ + esbuild: {Esbuild, :install_and_run, [:cesium_link, ~w(--sourcemap=inline --watch)]}, + tailwind: {Tailwind, :install_and_run, [:cesium_link, ~w(--watch)]} + ] + +# ## SSL Support +# +# In order to use HTTPS in development, a self-signed +# certificate can be generated by running the following +# Mix task: +# +# mix phx.gen.cert +# +# Run `mix help phx.gen.cert` for more information. +# +# The `http:` config above can be replaced with: +# +# https: [ +# port: 4001, +# cipher_suite: :strong, +# keyfile: "priv/cert/selfsigned_key.pem", +# certfile: "priv/cert/selfsigned.pem" +# ], +# +# If desired, both `http:` and `https:` keys can be +# configured to run both http and https servers on +# different ports. + +# Watch static and templates for browser reloading. +config :cesium_link, CesiumLinkWeb.Endpoint, + live_reload: [ + patterns: [ + ~r"priv/static/(?!uploads/).*(js|css|png|jpeg|jpg|gif|svg)$", + ~r"priv/gettext/.*(po)$", + ~r"lib/cesium_link_web/(controllers|live|components)/.*(ex|heex)$" + ] + ] + +# Enable dev routes for dashboard and mailbox +config :cesium_link, dev_routes: true + +# Do not include metadata nor timestamps in development logs +config :logger, :console, format: "[$level] $message\n" + +# Set a higher stacktrace during development. Avoid configuring such +# in production as building large stacktraces may be expensive. +config :phoenix, :stacktrace_depth, 20 + +# Initialize plugs at runtime for faster development compilation +config :phoenix, :plug_init_mode, :runtime + +config :phoenix_live_view, + # Include HEEx debug annotations as HTML comments in rendered markup + debug_heex_annotations: true, + # Enable helpful, but potentially expensive runtime checks + enable_expensive_runtime_checks: true diff --git a/config/prod.exs b/config/prod.exs new file mode 100644 index 0000000..208cb4c --- /dev/null +++ b/config/prod.exs @@ -0,0 +1,15 @@ +import Config + +# Note we also include the path to a cache manifest +# containing the digested version of static files. This +# manifest is generated by the `mix assets.deploy` task, +# which you should run after static files are built and +# before starting your production server. +config :cesium_link, CesiumLinkWeb.Endpoint, + cache_static_manifest: "priv/static/cache_manifest.json" + +# Do not print debug messages in production +config :logger, level: :info + +# Runtime production configuration, including reading +# of environment variables, is done on config/runtime.exs. diff --git a/config/runtime.exs b/config/runtime.exs new file mode 100644 index 0000000..60c00d7 --- /dev/null +++ b/config/runtime.exs @@ -0,0 +1,113 @@ +import Config + +# config/runtime.exs is executed for all environments, including +# during releases. It is executed after compilation and before the +# system starts, so it is typically used to load production configuration +# and secrets from environment variables or elsewhere. Do not define +# any compile-time configuration in here, as it won't be applied. +# The block below contains prod specific runtime configuration. + +# ## Using releases +# +# If you use `mix release`, you need to explicitly enable the server +# by passing the PHX_SERVER=true when you start it: +# +# PHX_SERVER=true bin/cesium_link start +# +# Alternatively, you can use `mix phx.gen.release` to generate a `bin/server` +# script that automatically sets the env var above. +if System.get_env("PHX_SERVER") do + config :cesium_link, CesiumLinkWeb.Endpoint, server: true +end + +if config_env() in [:prod, :stg] do + database_url = + System.get_env("DATABASE_URL") || + raise """ + environment variable DATABASE_URL is missing. + For example: ecto://USER:PASS@HOST/DATABASE + """ + + %URI{host: database_host} = URI.parse(database_url) + + # Location of root certificates to verify database SSL connections + database_ca_cert_filepath = + System.get_env("DATABASE_CA_CERT_FILEPATH") || "/etc/ssl/certs/ca-certificates.crt" + + maybe_ipv6 = if System.get_env("ECTO_IPV6") in ~w(true 1), do: [:inet6], else: [] + + config :cesium_link, CesiumLink.Repo, + ssl: true, + ssl_opts: [ + verify: :verify_peer, + cacertfile: database_ca_cert_filepath, + server_name_indication: to_charlist(database_host), + customize_hostname_check: [ + match_fun: :public_key.pkix_verify_hostname_match_fun(:https) + ] + ], + url: database_url, + pool_size: String.to_integer(System.get_env("POOL_SIZE") || "10"), + socket_options: maybe_ipv6 + + # The secret key base is used to sign/encrypt cookies and other secrets. + # A default value is used in config/dev.exs and config/test.exs but you + # want to use a different value for prod and you most likely don't want + # to check this value into version control, so we use an environment + # variable instead. + secret_key_base = + System.get_env("SECRET_KEY_BASE") || + raise """ + environment variable SECRET_KEY_BASE is missing. + You can generate one by calling: mix phx.gen.secret + """ + + host = System.get_env("PHX_HOST") || "cesium.link" + port = String.to_integer(System.get_env("PORT") || "4000") + + config :cesium_link, :dns_cluster_query, System.get_env("DNS_CLUSTER_QUERY") + + config :cesium_link, CesiumLinkWeb.Endpoint, + url: [host: host, port: 443, scheme: "https"], + http: [ + # Enable IPv6 and bind on all interfaces. + # Set it to {0, 0, 0, 0, 0, 0, 0, 1} for local network only access. + # See the documentation on https://hexdocs.pm/bandit/Bandit.html#t:options/0 + # for details about using IPv6 vs IPv4 and loopback vs public addresses. + ip: {0, 0, 0, 0, 0, 0, 0, 0}, + port: port + ], + secret_key_base: secret_key_base + + # ## SSL Support + # + # To get SSL working, you will need to add the `https` key + # to your endpoint configuration: + # + # config :cesium_link, CesiumLinkWeb.Endpoint, + # https: [ + # ..., + # port: 443, + # cipher_suite: :strong, + # keyfile: System.get_env("SOME_APP_SSL_KEY_PATH"), + # certfile: System.get_env("SOME_APP_SSL_CERT_PATH") + # ] + # + # The `cipher_suite` is set to `:strong` to support only the + # latest and more secure SSL ciphers. This means old browsers + # and clients may not be supported. You can set it to + # `:compatible` for wider support. + # + # `:keyfile` and `:certfile` expect an absolute path to the key + # and cert in disk or a relative path inside priv, for example + # "priv/ssl/server.key". For all supported SSL configuration + # options, see https://hexdocs.pm/plug/Plug.SSL.html#configure/1 + # + # We also recommend setting `force_ssl` in your config/prod.exs, + # ensuring no data is ever sent via http, always redirecting to https: + # + # config :cesium_link, CesiumLinkWeb.Endpoint, + # force_ssl: [hsts: true] + # + # Check `Plug.SSL` for all available options in `force_ssl`. +end diff --git a/config/stg.exs b/config/stg.exs new file mode 100644 index 0000000..ff420bc --- /dev/null +++ b/config/stg.exs @@ -0,0 +1,11 @@ +import Config + +# ## SSL Support +# +# To get SSL working, you will need to add the `https` key +# to the previous section and set your `:url` port to 443: +# +config :cesium_link, CesiumLink.Endpoint, + url: [scheme: "https", host: "stg.cesium.link", port: 443], + force_ssl: [rewrite_on: [:x_forwarded_proto]], + cache_static_manifest: "priv/static/cache_manifest.json" diff --git a/config/test.exs b/config/test.exs new file mode 100644 index 0000000..eec6a0b --- /dev/null +++ b/config/test.exs @@ -0,0 +1,31 @@ +import Config + +# Configure your database +# +# The MIX_TEST_PARTITION environment variable can be used +# to provide built-in test partitioning in CI environment. +# Run `mix help test` for more information. +config :cesium_link, CesiumLink.Repo, + username: "postgres", + password: "postgres", + hostname: "localhost", + database: "cesium_link_test#{System.get_env("MIX_TEST_PARTITION")}", + pool: Ecto.Adapters.SQL.Sandbox, + pool_size: System.schedulers_online() * 2 + +# We don't run a server during test. If one is required, +# you can enable the server option below. +config :cesium_link, CesiumLinkWeb.Endpoint, + http: [ip: {127, 0, 0, 1}, port: 4002], + secret_key_base: "S3eFlLAxJdMkBj4Tgyq0AZZBUuZ9lrk5rDcekfCRtHnCu5YaioE6+Vt7ip7C9eWB", + server: false + +# Print only warnings and errors during test +config :logger, level: :warning + +# Initialize plugs at runtime for faster test compilation +config :phoenix, :plug_init_mode, :runtime + +config :phoenix_live_view, + # Enable helpful, but potentially expensive runtime checks + enable_expensive_runtime_checks: true diff --git a/darwin.yml b/darwin.yml new file mode 100644 index 0000000..3250756 --- /dev/null +++ b/darwin.yml @@ -0,0 +1,9 @@ +version: "3" + +services: + db: + ports: + - ${DB_PORT:-5555}:5432 + web: + ports: + - ${PORT:-4000}:4000 \ No newline at end of file diff --git a/data/config.ts b/data/config.ts deleted file mode 100644 index a9e0f32..0000000 --- a/data/config.ts +++ /dev/null @@ -1,11 +0,0 @@ -export const SETTINGS = { - domain: 'https://cesium.di.uminho.pt', - github: { - base_url: 'https://github.com', - username: 'cesium' - }, - gitlab: { - base_url: 'https://gitlab.com', - username: 'cesiuminho' - } -}; diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml new file mode 100644 index 0000000..bb3d1de --- /dev/null +++ b/docker-compose.dev.yml @@ -0,0 +1,28 @@ +version: "3" + +services: + db: + image: postgres:14.1 + container_name: cesium_link_db + env_file: .env.dev + environment: + POSTGRES_USER: ${DB_USERNAME:-postgres} + POSTGRES_PASSWORD: ${DB_PASSWORD:-postgres} + POSTGRES_HOST: ${DB_HOST:-localhost} + volumes: + - /var/lib/postgresql/data + web: + container_name: cesium_link_web + env_file: .env.dev + environment: + MIX_ENV: ${MIX_ENV:-dev} + build: + context: . + dockerfile: Dockerfile.dev + depends_on: + - db + volumes: + - ./:/app + - /app/_build + - /app/deps + - /app/priv/uploads \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index 3b15a5a..0000000 --- a/docker-compose.yml +++ /dev/null @@ -1,15 +0,0 @@ -version: '3.7' -services: - db: - image: mongo:latest - environment: - MONGO_INITDB_ROOT_USERNAME: root - MONGO_INITDB_ROOT_PASSWORD: secret - ports: - - 27017:27017 - volumes: - - mdbdata:/data/db - command: mongod --auth - -volumes: - mdbdata: diff --git a/fly-stg.toml b/fly-stg.toml new file mode 100644 index 0000000..b0d97c3 --- /dev/null +++ b/fly-stg.toml @@ -0,0 +1,29 @@ +app = "cesium-link-stg" +primary_region = "mad" +kill_signal = "SIGTERM" + +[deploy] + release_command = "/app/bin/migrate" + +[env] + MIX_ENV = "stg" + PHX_HOST = "stg.cesium.link" + PORT = "8080" + +[http_service] + internal_port = 8080 + force_https = true + auto_stop_machines = true + auto_start_machines = true + min_machines_running = 0 + processes = ["app"] + + [http_service.concurrency] + type = "connections" + hard_limit = 1000 + soft_limit = 1000 + +[[vm]] + memory = "512mb" + cpu_kind = "shared" + cpus = 1 diff --git a/hooks/Editing/EditingContext.tsx b/hooks/Editing/EditingContext.tsx deleted file mode 100644 index 88120a1..0000000 --- a/hooks/Editing/EditingContext.tsx +++ /dev/null @@ -1,3 +0,0 @@ -import { createContext } from 'react'; - -export const EditingContext = createContext(null); diff --git a/hooks/Editing/EditingProvider.tsx b/hooks/Editing/EditingProvider.tsx deleted file mode 100644 index ad90493..0000000 --- a/hooks/Editing/EditingProvider.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import { PropsWithChildren } from 'react'; - -import useAsyncReducer from '~/hooks/useAsyncReducer'; - -import { EditingContext } from './EditingContext'; -import { ActionType } from './types'; - -const reducer = async (editing, action: { type: ActionType; key: string }) => { - const { type, key } = action; - - switch (type) { - case 'EDIT': - return { ...editing, key }; - case 'CANCEL': - return { ...editing, key: '' }; - default: - throw new Error(`Unknown action: ${type}`); - } -}; - -type EditingProviderProps = { - initialState: T; -}; - -export function EditingProvider({ - children, - initialState -}: PropsWithChildren>) { - const [editing, dispatchEditing] = useAsyncReducer(reducer, initialState); - - return ( - - {children} - - ); -} diff --git a/hooks/Editing/index.ts b/hooks/Editing/index.ts deleted file mode 100644 index b40f9ce..0000000 --- a/hooks/Editing/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './EditingContext'; -export * from './EditingProvider'; -export * from './useEditing'; diff --git a/hooks/Editing/types.ts b/hooks/Editing/types.ts deleted file mode 100644 index 63a9d53..0000000 --- a/hooks/Editing/types.ts +++ /dev/null @@ -1,4 +0,0 @@ -export enum ActionType { - Edit = 'EDIT', - Cancel = 'CANCEL' -} diff --git a/hooks/Editing/useEditing.tsx b/hooks/Editing/useEditing.tsx deleted file mode 100644 index 5cb476c..0000000 --- a/hooks/Editing/useEditing.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { useContext } from 'react'; - -import { EditingContext } from './EditingContext'; - -export const useEditing = () => useContext(EditingContext); diff --git a/hooks/forms/index.ts b/hooks/forms/index.ts deleted file mode 100644 index da4cdac..0000000 --- a/hooks/forms/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export * from './useForms'; -export * from './useForm'; -export * from './useCreateForm'; -export * from './useUpdateForm'; -export * from './useDeleteForm'; diff --git a/hooks/forms/useCreateForm.tsx b/hooks/forms/useCreateForm.tsx deleted file mode 100644 index 9b5e5df..0000000 --- a/hooks/forms/useCreateForm.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import { useMutation, useQueryClient } from '@tanstack/react-query'; - -import { API } from '~/lib/services'; - -export function useCreateForm() { - const cache = useQueryClient(); - - return useMutation(API.createForm, { - onSuccess: () => { - cache.invalidateQueries(['forms']); - } - }); -} diff --git a/hooks/forms/useDeleteForm.tsx b/hooks/forms/useDeleteForm.tsx deleted file mode 100644 index 4f17102..0000000 --- a/hooks/forms/useDeleteForm.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import { useMutation, useQueryClient } from '@tanstack/react-query'; - -import { API } from '~/lib/services'; - -export function useDeleteForm() { - const cache = useQueryClient(); - - return useMutation(API.deleteForm, { - onSuccess: () => { - cache.invalidateQueries(['forms']); - } - }); -} diff --git a/hooks/forms/useForm.tsx b/hooks/forms/useForm.tsx deleted file mode 100644 index ba36d96..0000000 --- a/hooks/forms/useForm.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import { useQuery } from '@tanstack/react-query'; - -import { API } from '~/lib/services'; - -export function useForm(id: string) { - return useQuery(['forms', id], async () => { - return API.getForm(id).then(({ form }) => form); - }); -} diff --git a/hooks/forms/useForms.tsx b/hooks/forms/useForms.tsx deleted file mode 100644 index a544f82..0000000 --- a/hooks/forms/useForms.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import { useQuery } from '@tanstack/react-query'; - -import { API } from '~/lib/services'; - -export function useForms() { - return useQuery(['forms'], () => { - return API.getForms().then(({ data }) => data); - }); -} diff --git a/hooks/forms/useUpdateForm.tsx b/hooks/forms/useUpdateForm.tsx deleted file mode 100644 index 26ffed6..0000000 --- a/hooks/forms/useUpdateForm.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import { useMutation, useQueryClient } from '@tanstack/react-query'; - -import { API } from '~/lib/services'; - -export function useUpdateForm() { - const cache = useQueryClient(); - - return useMutation(API.updateForm, { - onSuccess: () => { - cache.invalidateQueries(['forms']); - } - }); -} diff --git a/hooks/links/index.ts b/hooks/links/index.ts deleted file mode 100644 index 322126e..0000000 --- a/hooks/links/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export * from './useArchivedLinks'; -export * from './useLinks'; -export * from './useLink'; -export * from './useUpdateLink'; -export * from './useDeleteLink'; diff --git a/hooks/links/useArchivedLinks.ts b/hooks/links/useArchivedLinks.ts deleted file mode 100644 index 71f9c22..0000000 --- a/hooks/links/useArchivedLinks.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { useQuery } from '@tanstack/react-query'; - -import { API } from '~/lib/services'; - -export function useArchivedLinks() { - return useQuery(['archived'], () => { - return API.getArchivedLinks().then(({ data }) => data); - }); -} diff --git a/hooks/links/useCreateLink.ts b/hooks/links/useCreateLink.ts deleted file mode 100644 index 8b76ed9..0000000 --- a/hooks/links/useCreateLink.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { useMutation, useQueryClient } from '@tanstack/react-query'; - -import { API } from '~/lib/services'; - -export function useCreateLink() { - const cache = useQueryClient(); - - return useMutation(API.createLink, { - onSuccess: () => { - cache.invalidateQueries(['links']); - } - }); -} diff --git a/hooks/links/useDeleteLink.tsx b/hooks/links/useDeleteLink.tsx deleted file mode 100644 index 4a891b0..0000000 --- a/hooks/links/useDeleteLink.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import { useMutation, useQueryClient } from '@tanstack/react-query'; - -import { API } from '~/lib/services'; - -export function useDeleteLink() { - const cache = useQueryClient(); - - return useMutation(API.deleteLink, { - onSuccess: () => { - cache.invalidateQueries(['links']); - cache.invalidateQueries(['archived']); - } - }); -} diff --git a/hooks/links/useLink.ts b/hooks/links/useLink.ts deleted file mode 100644 index ded23fd..0000000 --- a/hooks/links/useLink.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { useQuery } from '@tanstack/react-query'; - -import { API } from '~/lib/services'; - -export function useLink(id: string) { - return useQuery(['links', id], async () => { - return API.getLink(id).then(({ link }) => link); - }); -} diff --git a/hooks/links/useLinks.ts b/hooks/links/useLinks.ts deleted file mode 100644 index 0eb9f3a..0000000 --- a/hooks/links/useLinks.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { useQuery } from '@tanstack/react-query'; - -import { API } from '~/lib/services'; - -export function useLinks() { - return useQuery(['links'], () => { - return API.getLinks().then(({ data }) => data); - }); -} diff --git a/hooks/links/useUpdateLink.ts b/hooks/links/useUpdateLink.ts deleted file mode 100644 index bcba274..0000000 --- a/hooks/links/useUpdateLink.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { useMutation, useQueryClient } from '@tanstack/react-query'; - -import { API } from '~/lib/services'; - -export function useUpdateLink() { - const cache = useQueryClient(); - - return useMutation(API.updateLink, { - onSuccess: () => { - cache.invalidateQueries(['links']); - cache.invalidateQueries(['archived']); - } - }); -} diff --git a/hooks/redirects/index.ts b/hooks/redirects/index.ts deleted file mode 100644 index 996866f..0000000 --- a/hooks/redirects/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export * from './useRedirects'; -export * from './useRedirect'; -export * from './useCreateRedirect'; -export * from './useUpdateRedirect'; -export * from './useDeleteRedirect'; diff --git a/hooks/redirects/useCreateRedirect.tsx b/hooks/redirects/useCreateRedirect.tsx deleted file mode 100644 index b2db49e..0000000 --- a/hooks/redirects/useCreateRedirect.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import { useMutation, useQueryClient } from '@tanstack/react-query'; - -import { API } from '~/lib/services'; - -export function useCreateRedirect() { - const cache = useQueryClient(); - - return useMutation(API.createRedirect, { - onSuccess: () => { - cache.invalidateQueries(['redirects']); - } - }); -} diff --git a/hooks/redirects/useDeleteRedirect.tsx b/hooks/redirects/useDeleteRedirect.tsx deleted file mode 100644 index fd73d1b..0000000 --- a/hooks/redirects/useDeleteRedirect.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import { useMutation, useQueryClient } from '@tanstack/react-query'; - -import { API } from '~/lib/services'; - -export function useDeleteRedirect() { - const cache = useQueryClient(); - - return useMutation(API.deleteRedirect, { - onSuccess: () => { - cache.invalidateQueries(['redirects']); - } - }); -} diff --git a/hooks/redirects/useRedirect.tsx b/hooks/redirects/useRedirect.tsx deleted file mode 100644 index ce46aaf..0000000 --- a/hooks/redirects/useRedirect.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import { useQuery } from '@tanstack/react-query'; - -import { API } from '~/lib/services'; - -export function useRedirect(id: string) { - return useQuery(['redirects', id], async () => { - return API.getRedirect(id).then(({ redirect }) => redirect); - }); -} diff --git a/hooks/redirects/useRedirects.tsx b/hooks/redirects/useRedirects.tsx deleted file mode 100644 index 8ea1235..0000000 --- a/hooks/redirects/useRedirects.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import { useQuery } from '@tanstack/react-query'; - -import { API } from '~/lib/services'; - -export function useRedirects() { - return useQuery(['redirects'], () => { - return API.getRedirects().then(({ data }) => data); - }); -} diff --git a/hooks/redirects/useUpdateRedirect.tsx b/hooks/redirects/useUpdateRedirect.tsx deleted file mode 100644 index 495b67b..0000000 --- a/hooks/redirects/useUpdateRedirect.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import { useMutation, useQueryClient } from '@tanstack/react-query'; - -import { API } from '~/lib/services'; - -export function useUpdateRedirect() { - const cache = useQueryClient(); - - return useMutation(API.updateRedirect, { - onSuccess: () => { - cache.invalidateQueries(['redirects']); - } - }); -} diff --git a/hooks/useAsyncReducer.tsx b/hooks/useAsyncReducer.tsx deleted file mode 100644 index 98d1c33..0000000 --- a/hooks/useAsyncReducer.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import { useState } from 'react'; - -export default function useAsyncReducer( - reducer: (state: T, action) => Promise, - initState: T -) { - const [state, setState] = useState(initState); - const dispatchState = async (action) => setState(await reducer(state, action)); - - return [state, dispatchState]; -} diff --git a/lib/api.ts b/lib/api.ts deleted file mode 100644 index 4d353ee..0000000 --- a/lib/api.ts +++ /dev/null @@ -1,19 +0,0 @@ -import axios from 'redaxios'; - -import { getUrl } from './config'; - -export let APP_URL = getUrl(); - -if (!/^https?:\/\//i.test(APP_URL)) { - APP_URL = 'http://' + APP_URL; -} - -const API = axios.create({ - baseURL: `${APP_URL}`, - responseType: 'json', - headers: { - 'Content-Type': 'application/json' - } -}); - -export default API; diff --git a/lib/cesium_link.ex b/lib/cesium_link.ex new file mode 100644 index 0000000..4a85fb4 --- /dev/null +++ b/lib/cesium_link.ex @@ -0,0 +1,9 @@ +defmodule CesiumLink do + @moduledoc """ + CesiumLink keeps the contexts that define your domain + and business logic. + + Contexts are also responsible for managing your data, regardless + if it comes from the database, an external API or others. + """ +end diff --git a/lib/cesium_link/accounts.ex b/lib/cesium_link/accounts.ex new file mode 100644 index 0000000..f9eb12a --- /dev/null +++ b/lib/cesium_link/accounts.ex @@ -0,0 +1,91 @@ +defmodule CesiumLink.Accounts do + @moduledoc """ + The Accounts context. + """ + + import Ecto.Query, warn: false + alias CesiumLink.Repo + + alias CesiumLink.Accounts.{User, UserToken} + + ## Database getters + + @doc """ + Gets a user by email. + + ## Examples + + iex> get_user_by_email("foo@example.com") + %User{} + + iex> get_user_by_email("unknown@example.com") + nil + + """ + def get_user_by_email(email) when is_binary(email) do + Repo.get_by(User, email: email) + end + + @doc """ + Gets a single user. + + Raises `Ecto.NoResultsError` if the User does not exist. + + ## Examples + + iex> get_user!(123) + %User{} + + iex> get_user!(456) + ** (Ecto.NoResultsError) + + """ + def get_user!(id), do: Repo.get!(User, id) + + ## User registration + + @doc """ + Registers a user. + + ## Examples + + iex> register_user(%{field: value}) + {:ok, %User{}} + + iex> register_user(%{field: bad_value}) + {:error, %Ecto.Changeset{}} + + """ + def register_user(attrs) do + %User{} + |> User.registration_changeset(attrs) + |> Repo.insert() + end + + ## Session + + @doc """ + Generates a session token. + """ + def generate_user_session_token(user) do + {token, user_token} = UserToken.build_session_token(user) + Repo.insert!(user_token) + token + end + + @doc """ + Gets the user with the given signed token. + """ + def get_user_by_session_token(token) do + {:ok, query} = UserToken.verify_session_token_query(token) + Repo.one(query) + end + + @doc """ + Deletes the signed token with the given context. + """ + def delete_user_session_token(token) do + Repo.delete_all(UserToken.by_token_and_context_query(token, "session")) + :ok + end +end diff --git a/lib/cesium_link/accounts/user.ex b/lib/cesium_link/accounts/user.ex new file mode 100644 index 0000000..be65eb2 --- /dev/null +++ b/lib/cesium_link/accounts/user.ex @@ -0,0 +1,55 @@ +defmodule CesiumLink.Accounts.User do + @moduledoc """ + User schema. + """ + use Ecto.Schema + import Ecto.Changeset + + schema "users" do + field :email, :string + + timestamps(type: :utc_datetime) + end + + @doc """ + A user changeset for registration. + """ + def registration_changeset(user, attrs, opts \\ []) do + user + |> cast(attrs, [:email]) + |> validate_email(opts) + end + + defp validate_email(changeset, opts) do + changeset + |> validate_required([:email]) + |> validate_format(:email, ~r/^[^\s]+@[^\s]+$/, message: "must have the @ sign and no spaces") + |> validate_length(:email, max: 160) + |> maybe_validate_unique_email(opts) + end + + defp maybe_validate_unique_email(changeset, opts) do + if Keyword.get(opts, :validate_email, true) do + changeset + |> unsafe_validate_unique(:email, CesiumLink.Repo) + |> unique_constraint(:email) + else + changeset + end + end + + @doc """ + A user changeset for changing the email. + + It requires the email to change otherwise an error is added. + """ + def email_changeset(user, attrs, opts \\ []) do + user + |> cast(attrs, [:email]) + |> validate_email(opts) + |> case do + %{changes: %{email: _}} = changeset -> changeset + %{} = changeset -> add_error(changeset, :email, "did not change") + end + end +end diff --git a/lib/cesium_link/accounts/user_token.ex b/lib/cesium_link/accounts/user_token.ex new file mode 100644 index 0000000..05fbcba --- /dev/null +++ b/lib/cesium_link/accounts/user_token.ex @@ -0,0 +1,81 @@ +defmodule CesiumLink.Accounts.UserToken do + @moduledoc """ + User tokens for session management. + """ + use Ecto.Schema + import Ecto.Query + alias CesiumLink.Accounts.UserToken + + @rand_size 32 + + @session_validity_in_days 60 + + schema "users_tokens" do + field :token, :binary + field :context, :string + field :sent_to, :string + belongs_to :user, CesiumLink.Accounts.User + + timestamps(updated_at: false) + end + + @doc """ + Generates a token that will be stored in a signed place, + such as session or cookie. As they are signed, those + tokens do not need to be hashed. + + The reason why we store session tokens in the database, even + though Phoenix already provides a session cookie, is because + Phoenix' default session cookies are not persisted, they are + simply signed and potentially encrypted. This means they are + valid indefinitely, unless you change the signing/encryption + salt. + + Therefore, storing them allows individual user + sessions to be expired. The token system can also be extended + to store additional data, such as the device used for logging in. + You could then use this information to display all valid sessions + and devices in the UI and allow users to explicitly expire any + session they deem invalid. + """ + def build_session_token(user) do + token = :crypto.strong_rand_bytes(@rand_size) + {token, %UserToken{token: token, context: "session", user_id: user.id}} + end + + @doc """ + Checks if the token is valid and returns its underlying lookup query. + + The query returns the user found by the token, if any. + + The token is valid if it matches the value in the database and it has + not expired (after @session_validity_in_days). + """ + def verify_session_token_query(token) do + query = + from token in by_token_and_context_query(token, "session"), + join: user in assoc(token, :user), + where: token.inserted_at > ago(@session_validity_in_days, "day"), + select: user + + {:ok, query} + end + + @doc """ + Returns the token struct for the given token value and context. + """ + def by_token_and_context_query(token, context) do + from UserToken, where: [token: ^token, context: ^context] + end + + @doc """ + Gets all tokens for the given user for the given contexts. + """ + def by_user_and_contexts_query(user, :all) do + from t in UserToken, where: t.user_id == ^user.id + end + + def by_user_and_contexts_query(user, [_ | _] = contexts) do + from t in UserToken, where: t.user_id == ^user.id and t.context in ^contexts + end +end diff --git a/lib/cesium_link/application.ex b/lib/cesium_link/application.ex new file mode 100644 index 0000000..fe1ac5f --- /dev/null +++ b/lib/cesium_link/application.ex @@ -0,0 +1,34 @@ +defmodule CesiumLink.Application do + # See https://hexdocs.pm/elixir/Application.html + # for more information on OTP Applications + @moduledoc false + + use Application + + @impl true + def start(_type, _args) do + children = [ + CesiumLinkWeb.Telemetry, + CesiumLink.Repo, + {DNSCluster, query: Application.get_env(:cesium_link, :dns_cluster_query) || :ignore}, + {Phoenix.PubSub, name: CesiumLink.PubSub}, + # Start a worker by calling: CesiumLink.Worker.start_link(arg) + # {CesiumLink.Worker, arg}, + # Start to serve requests, typically the last entry + CesiumLinkWeb.Endpoint + ] + + # See https://hexdocs.pm/elixir/Supervisor.html + # for other strategies and supported options + opts = [strategy: :one_for_one, name: CesiumLink.Supervisor] + Supervisor.start_link(children, opts) + end + + # Tell Phoenix to update the endpoint configuration + # whenever the application is updated. + @impl true + def config_change(changed, _new, removed) do + CesiumLinkWeb.Endpoint.config_change(changed, removed) + :ok + end +end diff --git a/lib/cesium_link/links.ex b/lib/cesium_link/links.ex new file mode 100644 index 0000000..9d05aa4 --- /dev/null +++ b/lib/cesium_link/links.ex @@ -0,0 +1,204 @@ +defmodule CesiumLink.Links do + @moduledoc """ + The Links context. + """ + + import Ecto.Query, warn: false + alias CesiumLink.Repo + + alias CesiumLink.Links.Link + + @doc """ + Returns the list of links. + + ## Examples + + iex> list_links() + [%Link{}, ...] + + """ + def list_links do + Link + |> Repo.all() + end + + @doc """ + Returns the list of unarchived links. + + ## Examples + + iex> list_unarchived_links() + [%Link{}, ...] + + """ + def list_unarchived_links do + Link + |> where([l], l.archived == false) + |> order_by(asc: :index) + |> Repo.all() + end + + @doc """ + Returns the list of archived links. + + ## Examples + + iex> list_archived_links() + [%Link{}, ...] + + """ + def list_archived_links do + Link + |> where([l], l.archived == true) + |> order_by(asc: :index) + |> Repo.all() + end + + @doc """ + Returns the list of unarchived links. + + ## Examples + + iex> list_unarchived_links() + [%Link{}, ...] + + """ + def list_unarchived_links_by_index do + Repo.all(from l in Link, where: l.archived == false, order_by: [asc: l.index]) + end + + @doc """ + Gets a single link. + + Raises `Ecto.NoResultsError` if the Link does not exist. + + ## Examples + + iex> get_link!("eae0d8c5-1cd4-40e4-9fe1-28b3a9fb5e76") + %Link{} + + iex> get_link!("626fffb7-72e0-48e0-91cc-1038bc1a4532") + ** (Ecto.NoResultsError) + + """ + def get_link!(id), do: Repo.get!(Link, id) + + @doc """ + Creates a link. + + ## Examples + + iex> create_link(%{field: value}) + {:ok, %Link{}} + + iex> create_link(%{field: bad_value}) + {:error, %Ecto.Changeset{}} + + """ + def create_link(attrs \\ %{}) do + %Link{} + |> Link.changeset(attrs) + |> Repo.insert() + end + + @doc """ + Updates a link. + + ## Examples + + iex> update_link(link, %{field: new_value}) + {:ok, %Link{}} + + iex> update_link(link, %{field: bad_value}) + {:error, %Ecto.Changeset{}} + + """ + def update_link(%Link{} = link, attrs) do + link + |> Link.changeset(attrs) + |> Repo.update() + end + + @doc """ + Deletes a link. + + ## Examples + + iex> delete_link(link) + {:ok, %Link{}} + + iex> delete_link(link) + {:error, %Ecto.Changeset{}} + + """ + def delete_link(%Link{} = link) do + Repo.delete(link) + end + + @doc """ + Archives a link. + + ## Examples + + iex> archive_link(link) + %Link{} + + """ + def archive_link(%Link{} = link) do + link + |> update_link(%{archived: true, index: nil}) + end + + @doc """ + Unarchives a link. + + ## Examples + + iex> unarchive_link(link) + %Link{} + + """ + def unarchive_link(%Link{} = link) do + link + |> update_link(%{archived: false, index: get_next_link_index()}) + end + + @doc """ + Returns an `%Ecto.Changeset{}` for tracking link changes. + + ## Examples + + iex> change_link(link) + %Ecto.Changeset{data: %Link{}} + + """ + def change_link(%Link{} = link, attrs \\ %{}) do + Link.changeset(link, attrs) + end + + @doc """ + Returns the next index a link should have. + + ## Examples + + iex> get_next_link_index() + 5 + """ + def get_next_link_index do + (Repo.aggregate(from(l in Link), :max, :index) || -1) + 1 + end + + @doc """ + Increments the number of visits for a link. + + ## Examples + + iex> increment_link_visits(link) + %Link{} + + """ + def increment_link_visits(%Link{} = link) do + link + |> update_link(%{visits: link.visits + 1}) + end +end diff --git a/lib/cesium_link/links/link.ex b/lib/cesium_link/links/link.ex new file mode 100644 index 0000000..e30d9d5 --- /dev/null +++ b/lib/cesium_link/links/link.ex @@ -0,0 +1,31 @@ +defmodule CesiumLink.Links.Link do + @moduledoc """ + Link schema. + """ + use CesiumLink.Schema + + @required_fields ~w(name emoji url attention edited_at)a + @optional_fields ~w(index archived visits)a + + schema "links" do + field :archived, :boolean, default: false + field :attention, :boolean, default: false + field :emoji, :string + field :index, :integer + field :name, :string + field :url, :string + field :visits, :integer, default: 0 + field :edited_at, :utc_datetime + + timestamps(type: :utc_datetime) + end + + @doc false + def changeset(link, attrs) do + link + |> cast(attrs, @required_fields ++ @optional_fields) + |> unique_constraint(:index) + |> validate_required(@required_fields) + |> validate_url(:url) + end +end diff --git a/lib/cesium_link/redirects.ex b/lib/cesium_link/redirects.ex new file mode 100644 index 0000000..bb4e09f --- /dev/null +++ b/lib/cesium_link/redirects.ex @@ -0,0 +1,162 @@ +defmodule CesiumLink.Redirects do + @moduledoc """ + The Redirects context. + """ + + import Ecto.Query, warn: false + alias CesiumLink.Repo + + alias CesiumLink.Redirects.Redirect + + @doc """ + Returns the list of redirects. + + ## Examples + + iex> list_redirects() + [%Redirect{}, ...] + + """ + def list_redirects do + Repo.all(Redirect) + end + + @doc """ + Gets a single redirect. + + Raises `Ecto.NoResultsError` if the Redirect does not exist. + + ## Examples + + iex> get_redirect!("eae0d8c5-1cd4-40e4-9fe1-28b3a9fb5e76") + %Redirect{} + + iex> get_redirect!("626fffb7-72e0-48e0-91cc-1038bc1a4532") + ** (Ecto.NoResultsError) + + """ + def get_redirect!(id), do: Repo.get!(Redirect, id) + + @doc """ + Creates a redirect. + + ## Examples + + iex> create_redirect(%{field: value}) + {:ok, %Redirect{}} + + iex> create_redirect(%{field: bad_value}) + {:error, %Ecto.Changeset{}} + + """ + def create_redirect(attrs \\ %{}) do + %Redirect{} + |> Redirect.changeset(attrs) + |> Repo.insert() + end + + @doc """ + Updates a redirect. + + ## Examples + + iex> update_redirect(redirect, %{field: new_value}) + {:ok, %Redirect{}} + + iex> update_redirect(redirect, %{field: bad_value}) + {:error, %Ecto.Changeset{}} + + """ + def update_redirect(%Redirect{} = redirect, attrs) do + redirect + |> Redirect.changeset(attrs) + |> Repo.update() + end + + @doc """ + Deletes a redirect. + + ## Examples + + iex> delete_redirect(redirect) + {:ok, %Redirect{}} + + iex> delete_redirect(redirect) + {:error, %Ecto.Changeset{}} + + """ + def delete_redirect(%Redirect{} = redirect) do + Repo.delete(redirect) + end + + @doc """ + Returns an `%Ecto.Changeset{}` for tracking redirect changes. + + ## Examples + + iex> change_redirect(redirect) + %Ecto.Changeset{data: %Redirect{}} + + """ + def change_redirect(%Redirect{} = redirect, attrs \\ %{}) do + Redirect.changeset(redirect, attrs) + end + + @doc """ + Increments the number of visits for a redirect. + + ## Examples + + iex> increment_redirect_visits(redirect) + %Redirect{} + + """ + def increment_redirect_visits(%Redirect{} = redirect) do + redirect + |> update_redirect(%{visits: redirect.visits + 1}) + end + + @doc """ + Returns a redirect by slug. + + ## Examples + + iex> get_redirect_by_slug("slug") + %Redirect{} + + iex> get_redirect_by_slug("slug") + nil + + """ + def get_redirect_by_slug(slug) do + query = from(r in Redirect, where: r.slug == ^slug) + Repo.one(query) + end + + @doc """ + Gets the redirect URL by slug, checks redirect type and updates view count. + + ## Examples + + iex> redirect_action("slug", :default) + {:ok, "http://example.com"} + + iex> redirect_action("slug", :form) + {:error, "Redirect not found"} + + """ + def redirect_action(slug, type) do + case get_redirect_by_slug(slug) do + %Redirect{url: url, type: redirect_type} = redirect -> + if redirect_type == type do + increment_redirect_visits(redirect) + {:ok, url} + else + {:error, "Wrong redirect type"} + end + + nil -> + {:error, "Redirect not found"} + end + end +end diff --git a/lib/cesium_link/redirects/redirect.ex b/lib/cesium_link/redirects/redirect.ex new file mode 100644 index 0000000..3ed2f83 --- /dev/null +++ b/lib/cesium_link/redirects/redirect.ex @@ -0,0 +1,32 @@ +defmodule CesiumLink.Redirects.Redirect do + @moduledoc """ + Redirect schema. + """ + use CesiumLink.Schema + + @required_fields ~w(name slug url type edited_at)a + @optional_fields ~w(visits)a + + schema "redirects" do + field :name, :string + field :slug, :string + field :type, Ecto.Enum, values: [:default, :form] + field :url, :string + field :visits, :integer, default: 0 + field :edited_at, :utc_datetime + + timestamps(type: :utc_datetime) + end + + @doc false + def changeset(redirect, attrs) do + redirect + |> cast(attrs, @required_fields ++ @optional_fields) + |> validate_required(@required_fields) + |> validate_url(:url) + |> validate_format(:slug, ~r{^[a-z0-9-]+$}, + message: "must contain only lowercase letters, numbers, and hyphens" + ) + |> unique_constraint([:slug, :type], message: "already in use") + end +end diff --git a/lib/cesium_link/release.ex b/lib/cesium_link/release.ex new file mode 100644 index 0000000..1ffe4ee --- /dev/null +++ b/lib/cesium_link/release.ex @@ -0,0 +1,29 @@ +defmodule CesiumLink.Release do + @moduledoc """ + Used for executing DB release tasks when run in production without Mix + installed. + """ + @app :cesium_link + + def migrate do + load_app() + + for repo <- repos() do + {:ok, _, _} = Ecto.Migrator.with_repo(repo, &Ecto.Migrator.run(&1, :up, all: true)) + end + end + + def rollback(repo, version) do + load_app() + {:ok, _, _} = Ecto.Migrator.with_repo(repo, &Ecto.Migrator.run(&1, :down, to: version)) + end + + defp repos do + Application.fetch_env!(@app, :ecto_repos) + end + + defp load_app do + Application.ensure_all_started(:ssl) + Application.load(@app) + end +end diff --git a/lib/cesium_link/repo.ex b/lib/cesium_link/repo.ex new file mode 100644 index 0000000..5efa792 --- /dev/null +++ b/lib/cesium_link/repo.ex @@ -0,0 +1,5 @@ +defmodule CesiumLink.Repo do + use Ecto.Repo, + otp_app: :cesium_link, + adapter: Ecto.Adapters.Postgres +end diff --git a/lib/cesium_link/schema.ex b/lib/cesium_link/schema.ex new file mode 100644 index 0000000..b02dc32 --- /dev/null +++ b/lib/cesium_link/schema.ex @@ -0,0 +1,26 @@ +defmodule CesiumLink.Schema do + @moduledoc """ + The application Schema for all the modules, providing Ecto.UUIDs as default + id. + """ + import Ecto.Changeset + + defmacro __using__(_) do + quote do + use Ecto.Schema + import Ecto.Changeset + + @primary_key {:id, :binary_id, autogenerate: true} + @foreign_key_type :binary_id + + def validate_url(changeset, field) do + changeset + |> validate_format( + :url, + ~r/^https?:\/\/(?:www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b(?:[-a-zA-Z0-9()@:%_\+.~#?&\/=]*)$/, + message: "must start with http:// or https:// and have a valid domain" + ) + end + end + end +end diff --git a/lib/cesium_link_web.ex b/lib/cesium_link_web.ex new file mode 100644 index 0000000..628e7f4 --- /dev/null +++ b/lib/cesium_link_web.ex @@ -0,0 +1,123 @@ +defmodule CesiumLinkWeb do + @moduledoc """ + The entrypoint for defining your web interface, such + as controllers, components, channels, and so on. + + This can be used in your application as: + + use CesiumLinkWeb, :controller + use CesiumLinkWeb, :html + + The definitions below will be executed for every controller, + component, etc, so keep them short and clean, focused + on imports, uses and aliases. + + Do NOT define functions inside the quoted expressions + below. Instead, define additional modules and import + those modules here. + """ + + def static_paths, do: ~w(assets fonts images favicon.ico robots.txt) + + def router do + quote do + use Phoenix.Router, helpers: false + + # Import common connection and controller functions to use in pipelines + import Plug.Conn + import Phoenix.Controller + import Phoenix.LiveView.Router + end + end + + def channel do + quote do + use Phoenix.Channel + end + end + + def controller do + quote do + use Phoenix.Controller, + formats: [:html, :json], + layouts: [html: CesiumLinkWeb.Layouts] + + import Plug.Conn + import CesiumLinkWeb.Gettext + + unquote(verified_routes()) + end + end + + def admin_live_view do + quote do + use Phoenix.LiveView, + layout: {CesiumLinkWeb.Layouts, :app} + + unquote(html_helpers()) + end + end + + def live_view do + quote do + use Phoenix.LiveView, + layout: {CesiumLinkWeb.Layouts, :root} + + unquote(html_helpers()) + end + end + + def live_component do + quote do + use Phoenix.LiveComponent + + unquote(html_helpers()) + end + end + + def html do + quote do + use Phoenix.Component + + # Import convenience functions from controllers + import Phoenix.Controller, + only: [get_csrf_token: 0, view_module: 1, view_template: 1] + + # Include general helpers for rendering HTML + unquote(html_helpers()) + end + end + + defp html_helpers do + quote do + # HTML escaping functionality + import Phoenix.HTML + # Core UI components and translation + import CesiumLinkWeb.CoreComponents + import CesiumLinkWeb.Gettext + import CesiumLinkWeb.Components.Emoji + + # Shortcut for generating JS commands + alias Phoenix.LiveView.JS + + # Routes generation with the ~p sigil + unquote(verified_routes()) + end + end + + def verified_routes do + quote do + use Phoenix.VerifiedRoutes, + endpoint: CesiumLinkWeb.Endpoint, + router: CesiumLinkWeb.Router, + statics: CesiumLinkWeb.static_paths() + end + end + + @doc """ + When used, dispatch to the appropriate controller/live_view/etc. + """ + defmacro __using__(which) when is_atom(which) do + apply(__MODULE__, which, []) + end +end diff --git a/lib/cesium_link_web/components/card.ex b/lib/cesium_link_web/components/card.ex new file mode 100644 index 0000000..9c3ef30 --- /dev/null +++ b/lib/cesium_link_web/components/card.ex @@ -0,0 +1,31 @@ +defmodule CesiumLinkWeb.Components.Card do + @moduledoc """ + Component for rendering a link card. + """ + use Phoenix.Component + + alias Phoenix.LiveView.JS + + import CesiumLinkWeb.Components.Emoji + + attr :id, :string, required: true + attr :link, :map, required: true + + def card(assigns) do + ~H""" + <.link + id={@id} + phx-update="ignore" + phx-click={JS.push("click", value: %{id: @link.id})} + href={@link.url} + class="group relative overflow-hidden cursor-pointer basis-[45%] p-[1.5rem] min-w-[20rem] text-left m-[1rem] border-[1px] rounded-[10px] transition-all ease-out duration-[0.45s] select-none hover:left-0 lg:w-[85%] w-full lg:mx-[0.8rem] mx-0" + > +
+

+ <.emoji code={@link.emoji} class="flex h-full pr-3" /> + <%= @link.name %> +

+ + """ + end +end diff --git a/lib/cesium_link_web/components/core_components.ex b/lib/cesium_link_web/components/core_components.ex new file mode 100644 index 0000000..f95a87e --- /dev/null +++ b/lib/cesium_link_web/components/core_components.ex @@ -0,0 +1,677 @@ +defmodule CesiumLinkWeb.CoreComponents do + @moduledoc """ + Provides core UI components. + + At first glance, this module may seem daunting, but its goal is to provide + core building blocks for your application, such as modals, tables, and + forms. The components consist mostly of markup and are well-documented + with doc strings and declarative assigns. You may customize and style + them in any way you want, based on your application growth and needs. + + The default components use Tailwind CSS, a utility-first CSS framework. + See the [Tailwind CSS documentation](https://tailwindcss.com) to learn + how to customize them or feel free to swap in another framework altogether. + + Icons are provided by [heroicons](https://heroicons.com). See `icon/1` for usage. + """ + use Phoenix.Component + + alias Phoenix.HTML.Form + alias Phoenix.LiveView.JS + alias Timex.Format.DateTime.Formatters.Relative + + import CesiumLinkWeb.Gettext + + @doc """ + Renders a modal. + + ## Examples + + <.modal id="confirm-modal"> + This is a modal. + + + JS commands may be passed to the `:on_cancel` to configure + the closing/cancel event, for example: + + <.modal id="confirm" on_cancel={JS.navigate(~p"/posts")}> + This is another modal. + + + """ + attr :id, :string, required: true + attr :show, :boolean, default: false + attr :on_cancel, JS, default: %JS{} + slot :inner_block, required: true + + def modal(assigns) do + ~H""" + + """ + end + + def input(%{type: "select"} = assigns) do + ~H""" +
+ <.label for={@id}><%= @label %> + + <.error :for={msg <- @errors}><%= msg %> +
+ """ + end + + def input(%{type: "textarea"} = assigns) do + ~H""" +
+ <.label for={@id}><%= @label %> + + <.error :for={msg <- @errors}><%= msg %> +
+ """ + end + + def input(%{type: "emoji"} = assigns) do + ~H""" +
+ <.label for={@id}><%= @label %> +
+
+ <.icon name="hero-face-smile" class="text-zinc-800" /> +
+ @id} type={@type} name={@name} value={Phoenix.HTML.Form.normalize_value(@type, @value)} class="pl-2 outline-none hover:cursor-default" readonly {@rest} /> +
+ <.error :for={msg <- @errors}><%= msg %> +
+ """ + end + + # All other inputs text, datetime-local, url, password, etc. are handled here... + def input(assigns) do + ~H""" +
+ <.label for={@id}><%= @label %> + + <.error :for={msg <- @errors}><%= msg %> +
+ """ + end + + @doc """ + Renders a label. + """ + attr :for, :string, default: nil + slot :inner_block, required: true + + def label(assigns) do + ~H""" + + """ + end + + @doc """ + Generates a generic error message. + """ + slot :inner_block, required: true + + def error(assigns) do + ~H""" +

+ <.icon name="hero-exclamation-circle-mini" class="mt-0.5 h-5 w-5 flex-none" /> + <%= render_slot(@inner_block) %> +

+ """ + end + + @doc """ + Renders a header with title. + """ + attr :class, :string, default: nil + + slot :inner_block, required: true + slot :subtitle + slot :actions + + def header(assigns) do + ~H""" +
+
+

+ <%= render_slot(@inner_block) %> +

+

+ <%= render_slot(@subtitle) %> +

+
+
<%= render_slot(@actions) %>
+
+ """ + end + + @doc ~S""" + Renders a table with generic styling. + + ## Examples + + <.table id="users" rows={@users}> + <:col :let={user} label="id"><%= user.id %> + <:col :let={user} label="username"><%= user.username %> + + """ + attr :id, :string, required: true + attr :rows, :list, required: true + attr :row_id, :any, default: nil, doc: "the function for generating the row id" + attr :row_click, :any, default: nil, doc: "the function for handling phx-click on each row" + + attr :row_item, :any, + default: &Function.identity/1, + doc: "the function for mapping each row before calling the :col and :action slots" + + attr :rest, :global + + slot :col, required: true do + attr :label, :string + end + + slot :action, doc: "the slot for showing user actions in the last table column" + + def table(assigns) do + assigns = + with %{rows: %Phoenix.LiveView.LiveStream{}} <- assigns do + assign(assigns, row_id: assigns.row_id || fn {id, _item} -> id end) + end + + ~H""" +
+
+ + + + + + + + + + + + +
<%= col[:label] %> + <%= gettext("Actions") %> +
+
+ + + <%= render_slot(col, @row_item.(row)) %> + +
+
+
+ + + <%= render_slot(action, @row_item.(row)) %> + +
+
+