diff --git a/.gitignore b/.gitignore index 19cd298..45a9208 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,5 @@ local **/lcaac-tmp.yaml **/application-tmp.yaml +**/.venv +experiments/performance/.ipynb_checkpoints diff --git a/README.md b/README.md index f07733a..e99fb6d 100644 --- a/README.md +++ b/README.md @@ -94,6 +94,18 @@ The request takes the following form: "amount": 1.0, "unit": "hour" }, + "total_vcpu": { + "amount": 100.0, + "unit": "vCPU" + }, + "total_ram": { + "amount": 100.0, + "unit": "GB" + }, + "total_storage": { + "amount": 100.0, + "unit": "TB" + }, "virtual_machines": [ { "id": "vm-01", diff --git a/build.gradle.kts b/build.gradle.kts index 4e00c24..4525418 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -11,7 +11,7 @@ plugins { } group = "org.cloud_assess" -version = "1.8.2" +version = "2.0.0" java { sourceCompatibility = JavaVersion.VERSION_17 @@ -30,7 +30,7 @@ repositories { } dependencies { - val lcaacVersion = "1.7.12" + val lcaacVersion = "1.8.0" implementation("ch.kleis.lcaac:core:$lcaacVersion") implementation("ch.kleis.lcaac:grammar:$lcaacVersion") diff --git a/docker-compose.yaml b/docker-compose.yaml index 3c8e9ac..4f6f9bb 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -1,6 +1,6 @@ services: app: - image: "ghcr.io/kleis-technology/cloud-assess/cloud-assess-app:v1.8.3" + image: "ghcr.io/kleis-technology/cloud-assess/cloud-assess-app:v2.0.0" container_name: cloud-assess-app ports: - "8080:8080" diff --git a/experiments/performance/.gitignore b/experiments/performance/.gitignore new file mode 100644 index 0000000..e33609d --- /dev/null +++ b/experiments/performance/.gitignore @@ -0,0 +1 @@ +*.png diff --git a/experiments/performance/.python-version b/experiments/performance/.python-version new file mode 100644 index 0000000..24ee5b1 --- /dev/null +++ b/experiments/performance/.python-version @@ -0,0 +1 @@ +3.13 diff --git a/experiments/performance/README.md b/experiments/performance/README.md new file mode 100644 index 0000000..d2059a1 --- /dev/null +++ b/experiments/performance/README.md @@ -0,0 +1,7 @@ +# README + +## Run Jupyter +``` +uv run --with jupyter jupyter lab +``` + diff --git a/experiments/performance/perf_analysis_vm_assess.ipynb b/experiments/performance/perf_analysis_vm_assess.ipynb new file mode 100644 index 0000000..3b9b07c --- /dev/null +++ b/experiments/performance/perf_analysis_vm_assess.ipynb @@ -0,0 +1,310 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "aae48c52-68ea-4b02-8066-521959681586", + "metadata": {}, + "outputs": [], + "source": [ + "import requests\n", + "import json\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "7f38bad5-adf7-4165-8f8f-5baf34014017", + "metadata": {}, + "outputs": [], + "source": [ + "def assess_vm(vm_nb: int) -> requests.Response:\n", + " url = 'http://localhost:8080/virtual_machines/assess'\n", + " headers = {'User-Agent': 'XY', 'Content-type': 'application/json'}\n", + " vms = []\n", + " vm_ram = 4.0\n", + " vm_storage = 20.0\n", + " vm_vcpu = 1.0\n", + " for i in range(vm_nb):\n", + " vms.append({\n", + " \"id\": i,\n", + " \"pool_id\": \"client_vm\",\n", + " \"quantity\": {\n", + " \"amount\": 1.0,\n", + " \"unit\": \"u\"\n", + " },\n", + " \"ram\": {\n", + " \"amount\": vm_ram,\n", + " \"unit\": \"GB\"\n", + " },\n", + " \"storage\": {\n", + " \"amount\": vm_storage,\n", + " \"unit\": \"GB\"\n", + " },\n", + " \"vcpu\": {\n", + " \"amount\": vm_vcpu,\n", + " \"unit\": \"vCPU\"\n", + " }\n", + " })\n", + " \n", + " data = {\n", + " \"period\": {\n", + " \"amount\": 1.0,\n", + " \"unit\": \"hour\"\n", + " },\n", + " \"total_vcpu\": {\n", + " \"amount\": vm_nb * vm_vcpu,\n", + " \"unit\": \"vCPU\"\n", + " },\n", + " \"total_ram\": {\n", + " \"amount\": vm_nb * vm_ram,\n", + " \"unit\": \"GB\"\n", + " },\n", + " \"total_storage\": {\n", + " \"amount\": vm_nb * vm_storage,\n", + " \"unit\": \"TB\"\n", + " },\n", + " \"virtual_machines\": vms\n", + " }\n", + " return requests.post(url, headers = headers, data = json.dumps(data))\n", + "\n", + "def assess_vm_elapsed_time(vm_nb: int, assess_nb: int) -> list[float]: \n", + " return [assess_vm(vm_nb).elapsed.total_seconds() for _ in range(assess_nb)]" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "db1e25f0-0acf-4db5-8360-981ca4c3ee2b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.308479" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "assess_vm(1).elapsed.total_seconds()" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "id": "6a3b0cf0-e9f9-4375-86cb-9fae50e5ecf2", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[2.651261, 2.58381]" + ] + }, + "execution_count": 66, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "assess_vm_elapsed_time(2,2)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "c30442bc-600f-4b35-bccf-1fdb6e58f536", + "metadata": {}, + "outputs": [], + "source": [ + "vm_nbs = [1, 2, 5, 10, 20, 50, 100, 1000, 2000]\n", + "results = [assess_vm_elapsed_time(x, 1) for x in vm_nbs]" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "26f2cd85-311b-4419-b734-0b9a5aa9776d", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/pbl/Programming/kleis/cloud-assess/experiments/performance/.venv/lib/python3.13/site-packages/numpy/_core/_methods.py:222: RuntimeWarning: Degrees of freedom <= 0 for slice\n", + " ret = _var(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/pbl/Programming/kleis/cloud-assess/experiments/performance/.venv/lib/python3.13/site-packages/numpy/_core/_methods.py:214: RuntimeWarning: invalid value encountered in scalar divide\n", + " ret = ret.dtype.type(ret / rcount)\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA/MAAAPzCAYAAAD7/FyjAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjUsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvWftoOwAAAAlwSFlzAAAPYQAAD2EBqD+naQAAoAdJREFUeJzs3QWcVXX+P/73ANKh2Aq2rt26qysYlArY3bp269q5u7Zru+ba3RgoICACdtfaja0oqfT8H5/z/878BgQZYIZz4/l8PIa5987lznvuPffc8zqfqqisrKwMAAAAoGg0yLsAAAAAYNYI8wAAAFBkhHkAAAAoMsI8AAAAFBlhHgAAAIqMMA8AAABFRpgHAACAIiPMAwAAQJER5gEAAKDICPNArfz73/+OZZZZJho2bBhrrrlm3uUwm5ZaaqnYZ5996uWx0+Omx68LY8aMif333z8WWWSRqKioiKOPPrpOHhfmhs8//zzbbm+55ZZa3/eiiy6KYpHqPfzww6NUpNcp/U3ptShETz/9dFZf+l5qPvroo+jatWu0adMm+xsffvjhgn89oJAI81Ckqj7sqr6aNm0aK6ywQnaA9f3339fp73ryySfjhBNOiL/+9a9x8803x7nnnlunjw/TSttY2sYPOeSQuP3222PPPfesl9/z2muvZe+f00477Q8PNtN9jj322Oz6P/7xj+x6gwYNYtiwYb+7/6hRo6JZs2YlF3hKxRNPPJG9huXye6E2fv3112z7nNsnDPbee+94++2345xzzsn29euuu+5c/f1Q7BrlXQAwZ/71r3/F0ksvHePGjYtnnnkmrrnmmuyg8Z133onmzZvXye946qmnsuBy4403RuPGjevkMSk9//3vf2PKlCl1ts395S9/iTPPPDPq09prrx0rrrhi3H333XH22WdP9z533XVX9n2PPfaY6vYmTZpk/y+d6KrpoYceqseKmVNp/3jVVVfVa7Becskl47fffot55plnrv5emJMw/89//jO7vMkmm8yV35neI88//3yceuqpU534TCdvd9lll2wfC/wxLfNQ5LbYYossZKQuyaklM3VH/uyzz+KRRx6pkw/35IcffshaGusqyFdWVmYf4pSWFFzq6uArbXPzzjtv1JVJkybFhAkTpvuz3XffPT799NN44YUXpvvzFNhT4E/Bv6Ytt9wy+9n0wn/37t3rqHKKUVVvqTQsCcrZ2LFjZ/izH3/8Mfs+7b4+vW/S+ye9j4A/JsxDidlss82y7ynQV7njjjtinXXWyQJ527ZtszPe03YPTmfiV1111Xj11VejY8eOWav+Kaeckn2Ypq716QO5qkt/1TjQFJDOOuusWHbZZbMQl8ZLp/8zfvz4qR473d6jR4/o169f1oUu1XHddddVjwO87777shaBxRdfPFq1ahU77LBDjBw5MnucdHJioYUWipYtW8a+++77u8dOtaW/Od0n1bDyyitnvROmVVVD6r2w/vrrZwcKaQ6A22677Xf3HTFiRBxzzDHZ/0mP2a5du9hrr73ip59+qr5PqiO1Gi+33HLZfdq3b5+10E5b3/QMHTo0dtxxx1hiiSWq/2/6fdOe4Ehj0NPf/fXXX8c222yTXV5wwQXjuOOOi8mTJ0913zTedsMNN4z5558/e37T6/3AAw/8YR0pwKbn/9JLL/3dz5577rnsZ1VhdfTo0dlrUfWcpOe7S5cuWTf1Pxozf88992S1pNe1devWsdpqq8Xll18+w5qqtom0/T7++OPV21zV2MkU8v/2t7/FwgsvnL2Ga6yxRtx6660zHIN82WWXVW+f77777gzDfM0W+JrS++GDDz6ovk9Nu+22W7zxxhvx/vvvV9/23XffZb0K0s9qq7bb8CuvvBLdunWLBRZYIHuNU4+c/fbbb5af77R9p9cybXfp96Vt+IILLvhdr4qZPdbEiROz9+3yyy+fvRZp29too42if//+v9uGv/zyy+z9ly6n93lqoU5S99r0t7do0SJrzZ7ea1Cbemu+5tdff331a77eeuvFyy+/PFU9Vb+75jClGUlDK9LflU5AVjniiCOy/3PFFVdU35aGNqXbql63acfM1/b3/lHtf2Rm+6x0IuuMM87IXs80Njk93x06dIhBgwb97rHS85pe5/R6p9c17XM233zzbPubVhrfnD430u9cZZVVom/fvr+7T9p/pe00vWer7nfTTTfV6u+qj/37//73v+wx03soPU+pR86s9ChK7/f0GZU+S9PvSZ9pjz76aPXP0/OUXttp90tJ+gxMP+vdu3d2/YsvvohDDz00/vSnP2X1pG0tfTbUZqz4jOY/SZ/lNVvWa/Pap9+XXuckvaerts+avUjSfi39v/T/U/jeeuut47333pvqd1cNQUr72rQPnG+++bJ9wvSk+6b3fHL88cdn/6/q82PaMfNVvQPT31FT2l/UfN9BOdLNHkrMJ598kn1PBwVJGod2+umnx0477ZS13qcz4VdeeWUW2F9//fWpzogPHz48a+lPYT+19qeDr3Sgkg4wX3rppbjhhhuy+6XQmKTHSwcs6cDm73//e7z44otx3nnnZR/wvXr1mqquFIh23XXXOOigg+KAAw7IDl6qpP+TDmROOumk+Pjjj7P6Uitv+vD+5Zdfsg/91GqaPuBTgKn5gZ4+xNPB4VZbbRWNGjWKxx57LDs4Sgdnhx122FQ1pMdOtaYwmMbppQPKdDCUDnLSY1RNvJYOWNLfkA5AU2tsOiBOB2tfffVVFqTSY6fflw4cDzzwwFhppZWyUJJC8Ycffpgd4P6R+++/P+v1kMaDp9cpPbfpb06Pn35WUwrtKcD9+c9/zoLKgAED4uKLL84O+NP/r5IOvlNNKXSmg7cUxNJBYTponFErcTrYTfMg3HnnnVkQqCndlkJcOmBLDj744OzkQOoKmQ6o07aS/v70PE3bYl0lhbr0mnfq1CkLX0m6/7PPPhtHHXXUdP9Pei7TuMlUTzrQTttVkg4008mOdJCaXsdUR9oW0vOVXsMUZqZ9zBQE0vCT9BqlIJAOvqcnPU7aptNJpfQa1mxNrQqX0wvn6T2Uakz3ScNdknvvvTcLrLPSMl+bbTidxEiTRKXnIb1P0vs2HejW7NJfm+c7bXcbb7xxFrDSezGdUEonbk4++eT49ttvs5MftX2s9L5M7920H0gBKs0VkIJMOsGTTvTU3IbTfiU9XxdeeGG2baXXL4WC1L02bbPbbbddXHvttVkA3WCDDbLXZFbqrfl6pRNP6b7pID/9vvTY6cRV2qek27/55pvs70vb2cykfUHaJlIATKG16mRc2jel70ceeWT1bVXbxPTU5vfOrPYZqc0+K702af+dXtO0/02/Jw2bSvuWtP+pOalp2j+mfW16zdJrm07apr8v7YNrjmdO7/+0/aVtNe0r0smN7bffPjtxU/X5k05ypOEyVfNHpO23T58+2e9INc1sYsu63r+nk22bbrpp9jel91HaBtPnW/r8qY20HaR9ZjohVfX/034jnWx98MEHY9ttt82eo7RvTbenOmpK+4cUcNPznqSTNWl7Tp+5aV+S3tPpb077uRSI62KoXG1e+/S6pN+bPlPS35C2u2T11VfPvqfPnbQ9pL8rve/Tvjh9ZqXnIr3fpz2Jmz570km+NPdJzRNhNaXfkfZjaV+faks9ndK+c3rSyZf0uqf9TXqu0zae3v/pxFrnzp2zzycoW5VAUbr55pvTJ2TlgAEDKn/88cfKYcOGVd5zzz2V888/f2WzZs0qv/rqq8rPP/+8smHDhpXnnHPOVP/37bffrmzUqNFUt2+88cbZ41177bW/+1177713ZYsWLaa67Y033sjuv//++091+3HHHZfd/tRTT1XftuSSS2a39e3bd6r7Dho0KLt91VVXrZwwYUL17bvuumtlRUVF5RZbbDHV/TfYYIPssWr69ddff1dvt27dKpdZZpmpbquqYciQIdW3/fDDD5VNmjSp/Pvf/1592xlnnJHd76GHHvrd406ZMiX7fvvtt1c2aNCgcujQoVP9PD136f8+++yzv/u/M6v5vPPOy/7mL774YqrnPT3ev/71r6nuu9Zaa1Wus846f/iY6flMz+tmm232u+chPW6V6667Lvsd77333lT/d4EFFpjqfm3atKk87LDD/vDvSvev+focddRRla1bt66cNGlS5axKj9O9e/epbrvsssuyWu+4446pak3bRcuWLStHjRqV3fbZZ59l90u/O73GtXHVVVdl/6dfv37Vt02ePLly8cUXzx6/pjPPPDO7b3rfpe19ueWWq/7ZeuutV7nvvvtml9N9Zvac1XYb7tWrV/Z4L7/88gwfpzbP91lnnZW9lz/88MOpbj/ppJOyfcWXX35Z68daY401fvcaTatqGz733HOrb/vll1+yfVTa3tM+q8r777+f3Tc9v7Nab9VrnvZ/P//8c/X9Hnnkkez2xx57rPq29JrU9vAnbT/pvldffXV2fcSIEdl7f8cdd6xceOGFq+935JFHVrZt27Z6H1FVT9pPz+z3zkrt01ObfVZ6HcePHz/Vz9LrkP6G/fbbr/q2tN9Oj5X+nhk9VpLu07hx48qPP/64+rY333wzu/3KK6+svu1vf/tb5aKLLlr5008/TfVYu+yyS7ZPmd62X5/796OPPjq734svvjjV/VIt6fb0WvyRTp06Va622mqV48aNm+p52XDDDSuXX3756ttOPvnkynnmmWeq1zM9//POO+9Uz/f0/r7nn38+q+W222773Wdl+l7zb665j675WZ6+qtT2tU/7s2nff1XWXHPNyoUWWqhy+PDhU73e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fplllomhQ4cK8sx1WuYBAABm0fXXXx+NGjWKiy++OBZbbLG8y6EMCfMAAAC18N1338UiiyySXZ5vvvni7rvvzrskyphu9gAAADMxZMiQrCv95ZdfnncpkBHmAQAA/sCTTz6ZrSM/evToePTRR2Py5Ml5lwTCPAAAwIw88sgj0bNnz/jtt99iyy23jN69e1tHnoIgzAMAAExHGhO//fbbx4QJE7LvvXr1imbNmuVdFmSEeQAAgGnceOONsfvuu2dd6vfcc8+45557onHjxnmXBdWEeQAAgGn88ssvUVlZGQcffHDccsst2TJ0UEhskQAAANM47rjjYvXVV48uXbpERUVF3uXA72iZBwAAyl5qhb/66qtj5MiR1bd17dpVkKdgCfMAAECUe5A/+uij47DDDosePXrEpEmT8i4JZko3ewAAoGylCe4OOuigbMK7ZLfddjM+nqJgKwUAAMrSxIkTY++9986WoGvQoEHcdNNN2XUoBsI8AABQdsaNGxe77LJLPPLII1lL/F133RU77rhj3mVBrQnzAABA2Uld61OQb9KkSTz44IPRvXv3vEuCWWICPAAAoOyceOKJsdRSS8UTTzwhyFOUtMwDAABlM2t91VJzK6+8cnzwwQfRuHHjvMuC2aJlHgAAKHnff/99/OUvf4mnnnqq+jZBnmImzAMAACXtq6++io4dO8ZLL72UjZW3jjylQJgHAABK1qeffhodOnSIDz/8MJZYYono06ePdeQpCcI8AABQkt57770syH/++eex3HLLxdChQ7PvUAqEeQAAoOS88cYbsfHGG8c333wTq6yySgwZMiRrmYdSIcwDAAAl59prr40ff/wx1llnnRg8eHAsuuiieZcEdcpgEQAAoORceeWVseCCC8Zxxx0Xbdq0ybscqHNa5gEAgJLpWj9lypTs8jzzzBNnnXWWIE/JEuYBAICi16tXr1h//fXj0EMPjcrKyrzLgXonzAMAAEXtzjvvjB133DEmTpwYP//8s3XkKQvCPAAAULT++9//xp577hmTJ0+OffbZJ+6+++6siz2UOmEeAAAoSpdddlkceOCBWbf61L3+xhtvjIYNG+ZdFswVwjwAAFB0zj///DjmmGOyyyeccEL85z//iQYNxBvKh60dAAAoOiuuuGLWCv+vf/0rC/YVFRV5lwRzlXXmAQCAorPNNtvEO++8k4V6KEcF3TKfJrE4/fTTY+mll45mzZrFsssum60VaakJAAAoLykbnHjiifHZZ59V3ybIU84KumX+ggsuiGuuuSZuvfXWWGWVVeKVV16JfffdN9q0aRNHHnlk3uUBAABzQVpyLs1Yf++992bryacW+caNG+ddFuSqoMP8c889F1tvvXV07949u77UUktlS0289NJLeZcGAADMBePGjYuddtopHnvssWzJufPOO0+Qh0LvZr/hhhvGwIED48MPP8yuv/nmm/HMM8/EFltsMcP/M378+Bg1atRUXwAAQPEZO3Zs9OzZMwvyTZs2jYcffji23377vMuCglDQLfMnnXRSFsarZqpM42TOOeec2H333Wf4f9KZun/+859ztU4AAKBujRw5Muuh++yzz0aLFi2yQL/pppvmXRYUjIJumb/vvvvizjvvjLvuuitee+21bOz8RRddlH2fkZNPPjl741d9DRs2bK7WDAAAzLm0hnwK8mm+rAEDBgjyMI2KygKeGr59+/ZZ6/xhhx1WfdvZZ58dd9xxR7z//vu1eozUsp92ACnYt27duh6rBQAA6sqPP/4YO+ywQ1x22WWx1lpr5V0OzDW1zbAF3c3+119/jQYNpu48kLrbT5kyJbeaAACA+jv+b968eXZ5wQUXjKeffjoqKiryLgsKUkF3s0+TXaQx8o8//nh8/vnn2TIUl1xySWy77bZ5lwYAANShTz75JFuO+oYbbqi+TZCHIu1mP3r06Dj99NOzEP/DDz/EYostFrvuumucccYZtV6OQjd7AAAobO+++2507tw5vv3222zy6zfeeCOaNGmSd1mQi9pm2IIO83VBmAcAgML1+uuvR9euXeOnn36KVVddNfr37x+LLLJI3mVBwWfYgu5mDwAAlK7nn38+m6U+Bfl11103GyMvyEPtCPMAAMBcN2jQoOjSpUvW+rjRRhtly8/NP//8eZcFRUOYBwAA5rq0hvzYsWOzQN+3b9+sWzFQewW9NB0AAFCaTj311GjXrl3ssssu0bRp07zLgaKjZR4AAJgr0pLTqTW+atm5ffbZR5CH2STMAwAA9e7aa6+NHj16xDbbbBPjx4/PuxwoesI8AABQry655JI45JBDsssrrbRSzDPPPHmXBEVPmAcAAOpFZWVl/Otf/4q///3v2fWTTjopLr/88mjQQAyBOWUCPAAAoF6CfArvF154YXb9nHPOiVNOOSXvsqBkCPMAAECdO+2006qD/KWXXhpHH3103iVBSdG/BQAAqHPbb799zDfffHH99dcL8lAPtMwDAAB1bu21145PPvkkC/RA3dMyDwAAzLFx48bFrrvuGs8//3z1bYI81B8t8wAAwBwZM2ZMbL311vHUU0/F4MGDsxb5Zs2a5V0WlDRhHgAAmG0jRoyI7t27x3PPPRctW7aMe+65R5CHuUCYBwAAZstPP/0U3bp1i9deey3mnXfe6NevX6y//vp5lwVlQZgHAABm2bfffhtdunSJ//3vf7HgggtG//79Y4011si7LCgbwjwAADDLzj333CzIL7bYYjFw4MBYccUV8y4JyoowDwAAzLJ///vf8euvv8app54ayyyzTN7lQNkR5gEAgFr56quvYvHFF4+Kiopo2rRp3HjjjXmXBGXLOvMAAMBMvfrqq7HmmmvG8ccfH5WVlXmXA2VPmAcAAP7Qs88+G5tttlkMHz48hg4dGr/99lveJUHZE+YBAIAZSpPbde3aNUaNGhUdO3bMZq1v3rx53mVB2RPmAQCA6erdu3d07949m+guBfo+ffpE69at8y4LEOYBAIDpuf/++2PbbbeN8ePHx9Zbbx2PPvqoFnkoIMI8AADwOxMnTozJkyfHrrvumgX7Jk2a5F0SUIOl6QAAgN/Zbbfdol27dvHXv/41GjZsmHc5wDS0zAMAAJnrrrsuvvnmm+rracI7QR4KkzAPAABlLq0bf+aZZ8bBBx8cnTt3jrFjx+ZdEjATutkDAECZB/njjjsuLrnkkuz6nnvuGS1atMi7LGAmhHkAAChTU6ZMiUMPPTTrXp9cccUVccQRR+RdFlALwjwAAJShSZMmxX777Re33357VFRUxA033JBdB4qDMA8AAGXopJNOyoJ8o0aNsu+77LJL3iUBs8AEeAAAUIaOOeaYWGmlleLBBx8U5KEIaZkHAIAyGiPfoMH/3563+OKLx1tvvZW1zAPFR8s8AACUgV9++SU6dOgQd999d/VtgjwUL+9eAAAocT/++GN07do13njjjfj444+jZ8+e0bJly7zLAuaAMA8AACXsm2++ic6dO8d7770XCy20UAwYMECQhxIgzAMAQIn6/PPPo1OnTvHpp59Gu3btYuDAgbHCCivkXRZQB4yZBwCAEvThhx9mY+RTkF9mmWVi6NChgjyUEGEeAABKUJro7quvvsqWn0tBfqmllsq7JKAO6WYPAAAl6IwzzogmTZrE3/72t1hwwQXzLgeoY1rmAQCgRKTZ6seNG5ddrqioiJNOOkmQhxIlzAMAQAlIs9T/9a9/jV122SUmTpyYdzlAPRPmAQCgyD322GPRvXv3+PXXX2P8+PExadKkvEsC6pkwDwAARezee++N7bbbLiZMmBDbbrttPPzww9GsWbO8ywLqmTAPAABF6uabb47ddtsta4nfY4894r777ssmvQNKnzAPAABF6Lrrrov99tsvpkyZEgceeGDceuut0aiRxaqgXAjzAABQhFZbbbVo3rx5HHPMMXHttddGgwYO7aGcOHUHAABFaMMNN4y33norlllmmWwZOqC8OH0HAABFoLKyMk477bR4/fXXq29bdtllBXkoU8I8AAAUuMmTJ8dBBx0U55xzTmy++eYxcuTIvEsCcqabPQAAFLA0U/0+++wTd955ZzYu/oILLog2bdrkXRaQM2EeAAAK1Pjx42PXXXeNXr16ZTPV33HHHbHzzjvnXRZQAIR5AAAoQL/++mtst9120a9fv2zt+Pvvvz969uyZd1lAgRDmAQCgAP3rX//Kgnxafu6RRx6Jzp07510SUEBMgAcAAAXo9NNPjy233DKefPJJQR74HS3zAABQIEaPHh0tW7bMlptr0aJFPP7443mXBBQoLfMAAFAAvv7661hvvfWy7vUAMyPMAwBAzj777LPo0KFDfPDBB3HjjTfGiBEj8i4JKHDCPAAA5Oj999/PgnwK9Msuu2wMHTo05p133rzLAgqcMA8AADl56623omPHjlkX+5VXXjkL8ksuuWTeZQFFQJgHAIAcvPTSS7HJJpvEjz/+GGuttVYMHjw4Fl100bzLAoqEMA8AADl455134pdffokNNtggnnrqqVhggQXyLgkoIpamAwCAHOy3337RunXr2HzzzbPl6ABmhZZ5AACYS/r27Zt1q6+yww47CPLAbBHmAQBgLrjrrruiR48e0a1btxg1alTe5QBFTpgHAIB6dsMNN8Qee+wRkydPjtVXXz2aN2+ed0lAkRPmAQCgHl1++eVxwAEHRGVlZRxyyCFx0003RaNGpq4C5owwDwAA9eTcc8+No48+Ort83HHHxVVXXRUNGjgEB+acPQkAANSDSy65JE499dTs8j/+8Y+48MILo6KiIu+ygBIhzAMAQD3YdtttY/HFF49///vfceaZZwryQJ0yWAcAAOrB0ksvHf/73/+iTZs2eZcClCAt8wAAUAcmTpwYe+21Vzz66KPVtwnyQH0R5gEAYA6NGzcudthhh7j99ttj9913j+HDh+ddElDidLMHAIA58Ouvv8Y222wT/fv3jyZNmsQ999wT888/f95lASVOmAcAgNk0atSo6NGjRwwdOjRatGiRdbHfbLPN8i4LKAPCPAAAzIaff/45unXrFq+88ko2Nv6JJ56IDTfcMO+ygDIhzAMAwGy45pprsiCfutQ/+eSTsfbaa+ddElBGhHkAAJgNJ510Uvz000+x//77xyqrrJJ3OUCZEeYBAKCWvvrqq1h44YVjnnnmiYYNG8all16ad0lAmbI0HQAA1MJ7770Xf/7zn2OfffaJyZMn510OUOaEeQAAmIk33ngjOnbsGN988028+eabMXLkyLxLAsqcMA8AAH/ghRdeiE033TQbH7/OOuvE4MGDo23btnmXBZQ5YR4AAGbg6aefji5dusSIESPir3/9awwcODCbvR4gb8I8AABMR9++fWOLLbaIMWPGROfOnaNfv37ZevIAhUCYBwCA6Ugz1ldWVkbPnj3jscceixYtWuRdEkA1S9MBAMB0dOrUKYYMGRJrrbVWFuwBComWeQAA+D+33HJLvPvuu9XX119/fUEeKEjCPAAARMSll14a++67bzY+/ocffsi7HIA/JMwDAFDW0rj4s846K4499tjs+l577RULLrhg3mUB/CFj5gEAKOsgf/LJJ8cFF1yQXU+h/tRTT42Kioq8SwP4Q8I8AABlacqUKXHUUUfFf/7zn+z6JZdcEsccc0zeZQHUijAPAEBZuuiii7Ign1rhr7322jjwwAPzLgmg1oyZBwCgLB100EHZbPW33XabIA8UHS3zAACUjcmTJ0fDhg2zy23atInnnnuu+jpAMdEyDwBAWRg7dmxsvvnm2dj4KoI8UKyEeQAASt7IkSOjW7duMWDAgDjzzDPju+++y7skgDkizAMAUNKGDx8enTp1imeffTbmnXfe6N+/fyyyyCJ5lwUwR4yZBwCgZKUW+C5dusQ777wTCyywQBbk11xzzbzLAphjwjwAACXpyy+/jM6dO8dHH30Uiy66aAwcODBWWmmlvMsCqBO62QMAUJL69euXBfkll1wyhg4dKsgDJUXLPAAAJemAAw6I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se6662YTtSy00EKx1lprxX//+9+ZTuwyatSoqb4AAMrRCy+8EG+//XYsssgiMXjwYEEeoIQUdJj/9NNPswlall9++WyM1yGHHBJHHnlk3HrrrTP8P+edd160adOm+iu17AMAlKO0fvydd94ZQ4YMiVVXXTXvcgCoQxWVVeuSFKDGjRtnLfPPPfdc9W0pzL/88svx/PPPz7BlPn1VSS3zKdCPHDkyGycGAFDK3n///WjZsmW0a9cu71IAmA0pw6aG6Zll2IJumV900UVj5ZVXnuq2lVZaKb788ssZ/p8mTZpkf3DNLwCAcvDmm29Gx44do3PnzvH999/nXQ4A9aigw3yaaXXaNVA//PDDWHLJJXOrCQCgEL344ouxySabxI8//pgtP9ewYcO8SwKgXMP8Mccck03ccu6558bHH38cd911V1x//fVx2GGH5V0aAEDBSGPiU2v8iBEjYoMNNoinnnoqFlhggbzLAqBcw/x6660XvXr1irvvvjubtOWss86Kyy67LHbfffe8SwMAKAhpkuDNN988xowZE5tttlm2/Ny8886bd1kAlPMEeHNz8gAAgGIM8j179oyJEydG9+7d4/77749mzZrlXRYAcyHDNpqTXwIAQH5WW221WGKJJWLttdeOO+64I1sJCIDyIMwDABSpxRZbLJ555plsfHyjRg7rAMpJQY+ZBwBgapdffnnWCl9lkUUWEeQBypA9PwBAEUjTHKUVfk477bRs2bk11lgj62YPQHkS5gEAiiDIn3LKKXH++edn188444xspR8AypcwDwBQwKZMmRJHH310XHnlldn1iy66KP7+97/nXRYAORPmAQAK1OTJk+PAAw+Mm266Kbt+zTXXxMEHH5x3WQAUAGEeAKBA3XfffVmQb9CgQdx8882x11575V0SAAVCmAcAKFC77LJLvPTSS7HRRhvF9ttvn3c5ABQQYR4AoICMHTs2m62+adOmUVFREZdeemneJQFQgKwzDwBQIEaNGhWbb7557LjjjjFx4sS8ywGggGmZBwAoAMOHD8+C/CuvvBJt2rSJjz76KFZeeeW8ywKgQGmZBwDI2XfffRebbLJJFuQXWGCBGDRokCAPwB/SMg8AkKNhw4ZF586d48MPP4xFF100BgwYIMgDMFPCPABATj755JPo1KlTfPHFF7HkkkvGwIEDY9lll827LACKgG72AAA5+fHHH+Onn36K5ZdfPoYMGSLIA1BrWuYBAHLyl7/8Jfr165eF+EUWWSTvcgAoIsI8AMBc9MILL0Tjxo1j7bXXzq7/9a9/zbskAIqQbvYAAHPJ008/nU1217Vr1/jggw/yLgeAIibMAwDMBX369Iktttgixo4dG2uttVa0a9cu75IAKGLCPABAPXvwwQdj6623jnHjxkXPnj3jscceixYtWuRdFgBFTJgHAKhHt99+e+y0004xceLE2HnnnbNg37Rp07zLAqDICfMAAPWkd+/esffee8eUKVNi3333jTvvvDPmmWeevMsCoASYzR4AoJ5sttlmsdFGG8Uaa6wRl19+eTRooB0FgLohzAMA1KHKysrse0VFRTRv3jxbRz51q0/XAaCuOD0MAFCHQf6kk06Kf/zjH9W3NWvWTJAHoM5pmQcAqANpXPwRRxwRV199dXY9zVq/7rrr5l0WACVKmAcAmEOTJk2K/fffP2699dasFf7aa68V5AGoV8I8AMAcmDBhQuyxxx5x//33R8OGDbNAv/vuu+ddFgAlrlZhfrvttpvlB05npBdaaKHZqQkAoCiMGzcudtxxx2wJurTk3L333hvbbrtt3mUBUAZqFeYffvjh2GmnnbIJXGrjrrvuijFjxgjzAEBJGzhwYBbk02z1vXr1is033zzvkgAoExWVVeun/IG0Jup3331X63DeqlWrePPNN2OZZZaJvI0aNSratGkTI0eOjNatW+ddDgBQYq655ppYeeWVY+ONN867FABKQG0zbK1a5gcNGhRt27at9S/v06dPLL744rW+PwBAsfjpp5+ymeurGjkOOeSQvEsCoAzVqmW+mGmZBwDqyrfffhtdunTJJrqb1cYOAKjLDNsgZtFrr70Wb7/9dvX1Rx55JLbZZps45ZRTstlcAQBK0ZdffhkdO3aM//3vf1nrfPoCgLzMcpg/6KCD4sMPP8wuf/rpp7HLLrtE8+bNs+VYTjjhhPqoEQAgVx9//HF06NAh+77UUkvF0KFDY4UVVsi7LADK2CyH+RTk11xzzexyCvDpDHWavf6WW26JBx98sD5qBADITWqJT0E+tcynAJ+CfCFM8gtAeZvlMJ+G2KdJX5IBAwbElltumV1u37697mYAQEl54403slnq06o+q6++egwZMiTatWuXd1kAMOthft11142zzz47br/99hg8eHB07949u/2zzz6LhRdeuD5qBADIxbzzzhvNmjWL9dZbL5vwzrEOAIWiVkvT1XTZZZfF7rvvHg8//HCceuqpsdxyy2W3P/DAA7HhhhvWR40AALlI4+NT48UCCyxgVRwASnNpunHjxmXLtMwzzzxRSCxNBwDMiieeeCJboSet1gMAhZphZ7llfkaaNm1aVw8FAJCL1NNwt912yy4/++yzWfd6ACjaMfNt27adpcntllhiifjiiy/mpC4AgLnqtttui5133jkmTpwYO+ywQ/XqPQBQiGrVMj9ixIjo06dP1tRfG8OHD4/JkyfPaW0AAHPFNddcE4ceemh2+W9/+1tcd9112fBBAChUte5mv/fee9dvJQAAObjooovi+OOPzy4feeSRcemll0aDBrO84A8AFF6Yr1pXHgCglDz++OPVQf6UU07Jlt+tqKjIuywAmKk6mwAPAKDYbLHFFrHXXnvFn/70pyzMA0CxEOYBgLKSehymuX3ScrqpO/0tt9yiNR6AomNAGABQNiZNmhT77rtv7LHHHtWT9QryABQjLfMAQFmYMGFC7L777tla8mmm+hdffDE23HDDvMsCgNkizAMAJe+3337L1o5/4oknonHjxnHvvfcK8gCUXzf7Tz75JE477bTYdddd44cffshuS+vQ/+9//6vr+gAA5siYMWOie/fuWZBv1qxZPProo7HNNtvkXRYAzN0wP3jw4FhttdWyrmkPPfRQ9gGZvPnmm3HmmWfOWTUAAHVoxIgR0bVr1xg0aFC0atUq+vbtG926dcu7LACY+2H+pJNOytZg7d+/f9ZNrcpmm20WL7zwwpxXBABQR9577714/fXXY7755osBAwZEx44d8y4JAPIZM//222/HXXfd9bvbF1poofjpp5/qpioAgDqwwQYbxMMPPxyLLrporL766nmXAwD5hfl55503vv3221h66aWnuj2d9V588cXrrjIAgNnwxRdfxNixY2PllVfOrutWD0ApmuVu9rvsskuceOKJ8d1332Xrsk6ZMiWeffbZOO6442KvvfaqnyoBAGrhww8/jA4dOkSnTp3i448/zrscACicMH/uuefGiiuuGO3bt88mv0tnvdP4s7S8S5rhHgAgD++88052TDJs2LCsJ2GauR4ASlVFZWVl5ez8xy+//DL70EyBfq211orll18+CtGoUaOiTZs2MXLkyGjdunXe5QAA9eCVV17JutP//PPPscYaa8STTz6ZzecDAMWmthl2lsfMV1liiSWyLwCAPD3zzDOx5ZZbxujRo+PPf/5z9OnTJ5u9HgBK2SyH+dSQ/8ADD2Trtf7www/ZmPma0trzAABzQ1oWN7XI//rrr1kX+969e2fryQNAqZvlMH/00UfHddddF5tuumksvPDC2SR4AAB5SHP3pK8FFlggHnzwwWjevHneJQFAYY6Zb9u2bdxxxx1Zd7ZiYMw8AJS2X375JQvxTZo0ybsUAJhrGXaWZ7NPD7rMMsvMaX0AALPl5ptvjosuuqj6ehofL8gDUG5mOcz/4x//iH/+85/x22+/1U9FAAAzcNVVV8V+++0Xxx9/fDZ/DwCUq1keM7/TTjvF3XffnS33stRSS8U888wz1c9fe+21uqwPACBz4YUXxoknnlg9h88mm2ySd0kAUDxhfu+9945XX3019thjDxPgAQD1Lk3vc+aZZ8ZZZ52VXT/ttNPiX//6l2MQAMraLIf5xx9/PPr16xcbbbRR/VQEAFAjyP/973+PSy+9NLt+3nnnxUknnZR3WQBQfGG+ffv2ZoUHAOaKNC6+KshfccUVccQRR+RdEgAU5wR4F198cZxwwgnx+eef109FAAD/Z7PNNsta42+88UZBHgDmZJ35tPzLr7/+GpMmTcrWdJ12Aryff/45Col15gGguIwfPz7GjRuXfX4DQLkZVcsMO8vd7C+77LI5rQ0AYLrS0rfbbbddjBgxIp588slo1apV3iUBQOnMZg8AUNdGjx4dPXv2jMGDB2e9//73v//FX/7yl7zLAoDiDfOpmb+qeT9d/iO6sgMAs+qXX36JLbbYIl588cWsNf6JJ54Q5AFgTsN8Gif/7bffxkILLRTzzjvvdNd1TUPv0+2TJ0+ujzoBgBL1ww8/RNeuXePNN9+Mtm3bZkvgrrvuunmXBQDFH+afeuqp7MO1aokYAIC68PXXX0fnzp3j/fffj4UXXjj69+8fq622Wt5lAUBphPmNN964+vLSSy+drTU/bet8apkfNmxY3VcIAJSssWPHZl3s27VrFwMHDowVVlgh75IAoDQnwEthvqrL/bRL0qWf6WYPANRWCu8DBgyIli1bxlJLLZV3OQBQumG+amz8tMaMGRNNmzatq7oAgBL11ltvxffffx9dunTJrq+66qp5lwQApRvmjz322Ox7CvKnn356tmRMldQan2afXXPNNeunSgCgJLz88svRrVu3GDduXDYnjxnrAaCew/zrr79e3TL/9ttvR+PGjat/li6vscYacdxxx81mGQBAqRsyZEj06NEjW08+hfgVV1wx75IAoPTDfNUs9vvuu29cfvnl1pMHAGrtySefjG222SZ+++232HTTTePRRx/NxskDAHNpzPzNN988m78KAChHjzzySOy0004xYcKE2HLLLeOBBx6IZs2a5V0WABS1BnkXAACUrueeey623377LMin77169RLkASCPlnkAgNpaf/31Y+utt44WLVrETTfdFI0aOfQAgLrgExUAqHNVS9mm8H733Xdn3xs00CEQAOqKT1UAoE6dd955sf/++8eUKVOqV70R5AEgh5b5NONsbW211VZzUg8AUMSt8aeddlqce+652fUddtghtthii7zLAoDyDfNpKZmaUre59IFd83qVyZMn12V9AEARSMcFRx99dFxxxRXZ9X//+9+CPADUo1r1eUvd5Kq+0jqxa665ZvTp0ydGjBiRfT3xxBOx9tprR9++feuzVgCgAKUT+QcccEB1kL/66qvjuOOOy7ssAChpszwBXjrrfu2118ZGG21UfVu3bt2iefPmceCBB8Z7771X1zUCAAVq4sSJsffee2eT3KVx8WnG+nQdACiwMP/JJ5/EvPPO+7vb27RpE59//nld1QUAFIHXXnstHnjggWy2+rvuuit23HHHvEsCgLJQUVlz8HstdOzYMZo2bRq33357LLzwwtlt33//fey1114xbty4GDx4cBSSUaNGZScaRo4cGa1bt867HAAoOSnMN2vWLLp37553KQBQ9GqbYWe5ZT51n9t2221jiSWWiPbt22e3DRs2LJZffvl4+OGH56xqAKAoDjJ+/vnnWGqppapnrQcA5q5ZDvPLLbdcvPXWW9G/f/94//33s9tWWmml6Ny581Sz2gMApSeF+DRL/XfffRdDhw7NTu4DAEUQ5pMU2rt27Zp1uW/SpIkQDwBl4IcffoguXbpkJ/Xnn3/+GD58uDAPAIW8NF1NaXm6s846KxZffPFo2bJlfPbZZ9ntp59+etx44431USMAkLOvvvoqO4mfgvwiiyySzZGz1lpr5V0WAJStWQ7zZ599dtxyyy1x4YUXRuPGjatvX3XVVeOGG26o6/oAgJx9+umn0aFDh/jggw+ylvjUvX6VVVbJuywAKGuzHOZvu+22uP7662P33XePhg0bVt++xhprVI+hBwBKw0cffZS1yKflZ9O8OUOGDMm+AwBFNmb+66+/nu6HeOp+P3HixLqqCwAoAG3bto355psvWyJnwIABseiii+ZdEgAwO2F+5ZVXzrrXLbnkkr9bY9bYOQAoLWmiu7SCTaNGjWKBBRbIuxwAYHbD/BlnnBF777131kKfWuMfeuihbAxd6n7fu3fvWX04AKDApK706bP9gAMOyK6nCe8AgCIfM7/11lvHY489lnW1a9GiRRbu33vvvey2tFwNAFC8+vXrF5tvvnkceOCB0adPn7zLAQDqcp35NKNt6nIHAJSOXr16xc4775zNgdO9e/fYZJNN8i4JAKirlvlhw4Zla81Weemll+Loo4/OZrgHAIrTnXfeGTvuuGMW5NP3NIyuWbNmeZcFANRVmN9tt91i0KBB2eXvvvsuOnfunAX6U089Nf71r3/N6sMBADn773//G3vuuWdMnjw5mxfnrrvuisaNG+ddFgBQl2H+nXfeifXXXz+7fN9998Vqq60Wzz33XHZG/5ZbbpnVhwMAcpROyKfx8ZWVlXHooYfGTTfdlM1cDwAUtln+tE7d75o0aZJdTpPgbbXVVtnlFVdcMb799tu6rxAAqDfpBP3JJ58ckyZNigsuuCAqKiryLgkAqI8wv8oqq8S1116bTYyTJsE766yzstu/+eabbC1aAKCwpVb48ePHR9OmTbPr55xzTvZdkAeAEu5mn87aX3fdddkMt7vuumusscYa2e2PPvpodfd7AKAwTZkyJY488sjYYost4rfffqsO8YI8ABSXisp0en4WpQlyRo0aFfPNN1/1bZ9//nk0b948FlpooSgkqc42bdrEyJEjo3Xr1nmXAwC5SZ/fBxxwQNx8881ZeE8n4nv06JF3WQDAbGTY2ZrhpmHDhtnY+aFDh2bX//SnP8VSSy01Ow8FAMwF6XM7zVh/7733RoMGDbJJawV5ACijbvajR4/ODgYWX3zx2HjjjbOvdHmPPfbIzhwAAIVl3Lhxsf3222dBfp555slWo0mf5QBAGYX5/fffP1588cXo3bt3jBgxIvtKl1955ZU46KCD6qdKAGC2jB07Nnr27BmPPfZYNuHdww8/nAV7AKDMxsy3aNEi+vXrFxtttNFUt6cu95tvvnl20FBIjJkHoJy9//77seGGG8aECROyQL/pppvmXRIAkMeY+bT8XHrgaaXbak6IBwDkb8UVV8xOwqd15DfYYIO8ywEA8upmf9ppp8Wxxx4b3333XfVt6fLxxx8fp59+el3VBQDMpvS5/MILL1RfX2+99QR5ACj3bvZrrbVWfPzxxzF+/PhYYoklstu+/PLLaNKkSSy//PJT3fe1116LvOlmD0A5GTZsWHTq1CkL9AMHDsyCPABQPOqtm/0222wzp7UBAPXgk08+yYL8F198EUsuuWS0bds275IAgEJpmS82WuYBKAfvvvtudO7cOb799ttYYYUVYsCAAdG+ffu8ywIA6inDzvKYeQCgsLzxxhux8cYbZ0F+1VVXjSFDhgjyAFDiZrmb/eTJk+PSSy+N++67Lxsrn5a6qennn3+uy/oAgJm0yKfl5kaMGBHrrrtu9O3bN1t5BgAobbPcMv/Pf/4zLrnkkth5552zZv80s/12220XDRo0iH/84x/1UyUAMF3LLbdcNlP9RhttlHWtF+QBoDzM8pj5ZZddNq644oro3r17tGrVKuvaV3VbWgbnrrvuikJizDwApe63336LKVOmRIsWLfIuBQAo1DHzaamb1VZbLbvcsmXL7BckPXr0iMcff3xOagYAauHBBx+M4447LqrOxzdr1kyQB4AyM8thvl27dtkEO0lqkX/yySezyy+//HK21jwAUH9uv/322GmnneLiiy+Oe++9N+9yAIBiCfPbbrttDBw4MLt8xBFHxOmnnx7LL7987LXXXrHffvvVR40AQERcd911sffee2dd6tNn7o477ph3SQBAsa4z//zzz2dfKdD37NkzCo0x8wCUgjT57N///vfqk+mXXXZZNvksAFBaapthZ3lpummlGXTTFwBQ99I597POOivOPPPM7PpJJ50U5557blRUVORdGgCQo1qF+UcffbTWD7jVVlvNST0AQA1vv/12tixscvbZZ8epp56ad0kAQLF0s69tN77USjB58uQoJLrZA1Dsbr311vj555/jmGOOybsUAKCYutmniXYAgLlj0qRJWXhfaKGFsutp0jsAgJrMnAMABWTChAmx2267xUYbbRTfffdd3uUAAMUe5rfccsusmb/K+eefHyNGjKi+Pnz48Fh55ZXrvkIAKBPjxo2L7bbbLu6///74/PPP480338y7JACg2MN8v379Yvz48dXX00y6qQtgzS6BH3zwQd1XCABlYMyYMdG9e/d4/PHHo2nTptnks926dYtCNHlKZTz/yfB45I2vs+/pOgAwd9V6abpp58mbw+XpAYD/k3q6pSD/3HPPRcuWLaN3796x8cYbRyHq+8638c/H3o1vR46rvm3RNk3jzJ4rx+arLpprbQBQToyZB4Ac/fTTT9GpU6csyM8777wxYMCAgg7yh9zx2lRBPvlu5Ljs9vRzAKDAwnxadi59TXsbADD70jC1tATNggsuGE8//XT8+c9/jkKUutKnFvnp9curui39XJd7ACjAbvb77LNPNGnSpHqSnoMPPjhatGiRXa85nh4AqJ1FFlkkBg4cGL/++musuOKKUahe+uzn37XI15QifPp5ut8Gy84/V2sDgHJU6zA/7Rq3e+yxx+/us9dee9VNVQBQwj766KN4/fXXY6eddsquL7HEElHofhg9rk7vBwDMpTB/8803z+GvAgD+97//RefOneOHH36I5s2bR48ePaIYLNSqaZ3eDwCYMybAA4C55NVXX80mt/vuu+9i1VVXjfXWWy+KxfpLt81mrZ/RbDnp9vTzdD8AoP4J8wAwFzz77LOx2WabxfDhw2P99dePQYMGxcILLxzFomGDimz5uWTaQF91Pf083Q8AqH/CPADUszTBXdeuXbNZ6zt27Bj9+/ePtm2LrwU7rSN/zR5rxyJtpu5Kn66n260zDwAFOGYeAJh17733XnTv3j1b9SUF+l69emVj5YtVCuxdVl4km7U+TXaXxsinrvVa5AFg7hLmAaAepeXmDjjggPjqq6/innvuqV7itZil4G75OQDIlzAPAPVgypQp0aBBg6ioqIjLL788u96okY9dAKBuGDMPAHXs6quvjq222iomTJiQXU+hXpAHAOqSMA8Adejf//53HHbYYfH444/HXXfdlXc5AECJEuYBoA5UVlbGmWeeGSeccEJ2/dRTT429994777IAgBKlzx8A1EGQP/744+Piiy/Orp977rlx8skn510WAFDChHkAmANpYrvUrf7aa6/Nrl9xxRVxxBFH5F0WAFDihHkAmAOffPJJ3HHHHdms9TfccEPst99+eZcEAJQBYR4A5sDyyy+fTXb3zTffxC677JJ3OQBAmRDmAWAW/fbbb/HZZ5/FyiuvnF3v2LFj3iUBAGXGbPYAMAvGjBkT3bt3jw4dOsTbb7+ddzkAQJkS5gGglkaMGBFdu3aNQYMGxcSJE7PrAAB50M0eAGrhxx9/zIL8G2+8EfPNN1/07ds31l9//bzLAgDKlDAPADORJrfr3LlzvPfee7HQQgtF//79Y/XVV8+7LACgjBVVN/vzzz8/W/rn6KOPzrsUAMrEV199lU1wl4L84osvHkOGDBHkAYDcFU3L/MsvvxzXXXedAygA5qq2bdtGu3btorKyMgYMGBBLL7103iUBABRHy3yaOXj33XeP//73v9k4RQCYW5o3bx6PPfZYDB06VJAHAApGUYT5ww47LFsGKI1XnJnx48fHqFGjpvoCgFnxyiuvxHnnnVd9vVWrVrHYYovlWhMAQFF1s7/nnnvitddey7rZ10Y6+PrnP/9Z73UBUJqeeeaZ2HLLLWP06NGx6KKLxj777JN3SQAAxdUyP2zYsDjqqKPizjvvjKZNm9bq/5x88skxcuTI6q/0GABQG2mW+rT8XAryG2+8cWy//fZ5lwQAMF0VlWlGnwL18MMPx7bbbhsNGzasvm3y5MnZjPYNGjTIutTX/Nn0pG72bdq0yYJ969at50LVABSjNC5+hx12iAkTJsTmm28eDz74YDZeHgBgbqpthi3obvadOnWKt99+e6rb9t1331hxxRXjxBNPnGmQB4DauPfee2OPPfaISZMmZSeR77777mjSpEneZQEAFGeYTxMOrbrqqlPd1qJFi5h//vl/dzsAzI5PP/00WzEl9fxKgf7mm2+ORo0K+uMRAKCwwzwA1LdlllkmrrjiinjzzTfjmmuuyYZxAQAUuoIeM18XjJkHYHrGjh2b9faqkj4O05wsAADFkGE1PwBQVlJoP+2002KDDTaIn3/+ufp2QR4AKCbCPABlFeSPPfbYOOecc7IJVnv37p13SQAAs8WYeQDKQprg7pBDDon//ve/2fX//Oc/sddee+VdFgDAbBHmASh5acm5vffeO+66665sgrsbb7wx9tlnn7zLAgCYbcI8ACVt/Pjxseuuu0avXr2yJefuvPPO2GmnnfIuCwBgjgjzAJS04cOHx6uvvhpNmjSJBx54IHr06JF3SQAAc0yYB6CkLbbYYjFw4MD48ssvY7PNNsu7HACAOmE2ewBKTlpyrn///tXXl1tuOUEeACgpwjwAJeWHH36ITTfdNLp37x59+vTJuxwAgHohzANQMr7++uvo2LFjvPXWW9G2bdto37593iUBANQLY+YBKAmfffZZdOrUKfueQnwaJ7/88svnXRYAQL3QMg9A0fvggw+iQ4cOWZBfdtllY+jQoYI8AFDStMwDUNTSLPWpa30aK7/SSivFgAEDshnsAQBKmZZ5AIpau3btYsstt4w111wzBg8eLMgDAGVByzwARa1BgwZxww03xNixY6N169Z5lwMAMFdomQeg6Dz55JOx9957x6RJk7LrDRs2FOQBgLKiZR6AovLwww/HzjvvHBMmTIi11147jjrqqLxLAgCY67TMA1A07r777thhhx2yIL/99tvHIYcckndJAAC5EOYBKAppXPzuu+8ekydPjr322ivuueeeaNy4cd5lAQDkQpgHoOBdfvnlccABB0RlZWUcfPDBcfPNN0ejRkaKAQDlS5gHoKANGzYsTj755OzycccdF1dffXU2gz0AQDnTrAFAQWvfvn089NBD8fLLL8dpp50WFRUVeZcEAJC7isrUZ7GEjRo1Ktq0aRMjR460bBFAkZgyZUp888030a5du7xLAQAoyAyrnyIABSVNcHfggQfGuuuuGx9++GHe5QAAFCRhHoCCMXHixNhzzz3jxhtvjB9//DFef/31vEsCAChIxswDUBDGjRsXu+yySzzyyCPZTPVVa8oDAPB7wjwAufv1119jm222if79+0eTJk3iwQcfjO7du+ddFgBAwRLmAch9kpcePXrE0KFDo0WLFvHoo4/GZpttlndZAAAFTZgHIFdpqbnx48dns7Y+8cQTseGGG+ZdEgBAwRPmAchVq1atok+fPvHVV1/F6quvnnc5AABFwWz2AMx1Kbhff/311dfbtm0ryAMAzAIt8wDMVZ9++ml06tQpPv/882jYsGH87W9/y7skAICio2UegLnmvffeiw4dOmRBfrnllosuXbrkXRIAQFES5gGYK954443YeOON45tvvolVVlklhgwZEksssUTeZQEAFCVhHoB69+KLL8amm24aP/74Y6yzzjoxePDgWHTRRfMuCwCgaAnzANSrb7/9Njp37hwjRoyIv/71rzFw4MCYf/758y4LAKCoCfMA1KvUAn/aaadlgb5fv37ZevIAAMyZisrKysooYaNGjcoOHEeOHBmtW7fOuxyAsjFlypRo0OD/nTOeNGlSNGpkERUAgLrIsFrmAahzd955Z2y00UbZh1EVQR4AoO4I8wDUqf/+97+x5557xvPPPx/XXXdd3uUAAJQkYR6AOnPZZZfFgQceGGkE12GHHRZ///vf8y4JAKAkCfMAzLEU3s8+++w45phjsusnnHBCXHnllVONmQcAoO4YwAjAHAf5k08+OS644ILs+r/+9a9s9vqKioq8SwMAKFnCPABz5Icffohbbrklu3zxxRfHsccem3dJAAAlT5gHYI4svPDCMWDAgHjppZdiv/32y7scAICyIMwDMMsmTpwYb731VqyzzjrZ9VVXXTX7AgBg7jAzEQCzZNy4cbH99ttn68g//fTTeZcDAFCWhHkAam3s2LHRo0ePeOyxx7Lrv/32W94lAQCUJd3sAaiVkSNHRvfu3ePZZ5+NFi1aZIF+0003zbssAICyJMwDMFPDhw+Pbt26xauvvhpt2rSJvn37xl/+8pe8ywIAKFvCPAAzDfKbbLJJvPPOO7HAAgvEk08+GWuttVbeZQEAlDVhHoA/NO+888bKK6+chfqBAwfGSiutlHdJAABlT5gH4A81bNgwbr/99vj++++jffv2eZcDAIDZ7AGYnnfffTeOO+64mDJlSna9cePGgjwAQAHRMg/AVF577bXo2rVr1q1+/vnnj5NPPjnvkgAAmIaWeQCqPf/887HZZptlQX7dddeNAw88MO+SAACYDmEegMygQYOiS5cu2XryG220UQwYMCBrmQcAoPAI8wDEE088EVtuuWWMHTs2C/RpHfm0njwAAIVJmAcocz/99FPstNNOMW7cuNhqq63i0UcfjRYtWuRdFgAAf0CYByhzCyywQLb03B577BEPPPBANG3aNO+SAACYiYrKysrKKGGjRo3KuoqmMaCtW7fOuxyAgjF69Oho1apV3mUAADAbGVbLPEAZuvjii2PVVVeNL774Iu9SAACYDcI8QBlJnbH++c9/xnHHHRdffvllPPjgg3mXBADAbGg0O/8JgOIM8ieccEJcdNFF2fVzzjknjj322LzLAgBgNgjzAGVgypQpcfjhh8c111yTXb/sssviqKOOyrssAABmkzAPUOImTZoUf/vb3+K2226LioqKuP7662P//ffPuywAAOaAMA9Q4saOHRtvvPFGNGzYMAv0u+22W94lAQAwh4R5gBKXljbp379/vPrqq7HFFlvkXQ4AAHXAbPYAJWjMmDHRq1ev6usLLbSQIA8AUEKEeYASM2LEiOjWrVtst912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t19MmTIlDjjggLjmmmvyLgkAAJhFwjyUkQsvvDAOP/zw7PLRRx8d1113XTb5HQAAUFyEeSgDaZ7LM844I0488cTs+mmnnRaXXHJJVFRU5F0aAAAwGxrNzn8Cii/Mf/jhh9nl888/vzrUAwAAxUmYhzLQoEGDuP3222P33XePnj175l0OAAAwh3SzhxI1adKkuP7667OJ7pJ55plHkAcAgBIhzEMJGj9+fOy8885x0EEHxZFHHpl3OQAAQB3TzR5KzG+//Rbbbbdd9O3bNxo3bhxdu3bNuyQAAKCOCfNQQkaPHp11pR88eHA0b948HnnkkejcuXPeZQEAAHVMmIcS8csvv8QWW2wRL774YrRq1SqeeOKJ2GijjfIuCwAAqAfCPJSANMldVZBv27Zt9OvXL9Zdd928ywIAAOqJCfCgRJaeO/nkk6Ndu3bx9NNPC/IAAFDiKiorKyujhI0aNSratGkTI0eOjNatW+ddDtSp9PatqKiYavK7Zs2a5VoTAABQ/xlWyzwUqQ8++CA23HDD+Oyzz6pvE+QBAKA8CPNQhN56663o2LFjvPDCC3HEEUfkXQ4AADCXCfNQZF5++eXYZJNN4ocffog111wzbr755rxLAgAA5jJhHorI0KFDo1OnTtkydH/5y19i0KBBseCCC+ZdFgAAMJcJ81AknnzyyejWrVuMHj06Nt100+jfv3/MO++8eZcFAADkQJiHIpm1/swzz8xmq99yyy3j8ccfj5YtW+ZdFgAAkBNhHopAWn7u0UcfjeOOOy569epl1noAAChzwjwUsPfee6/6chob/+9//zsaN26ca00AAED+hHkoUFdeeWWsssoqccMNN+RdCgAAUGCEeShA559/fhx55JHZWPkPPvgg73IAAIACI8xDAUnh/bTTTouTTz45u54mvbvwwgvzLgsAACgwjfIuAPh/Qf6YY46Jyy+/PLueQvzxxx+fd1kAAEABEuahQIL8QQcdFP/973+z61dddVUceuiheZcFAAAUKGEeCmTpucUWWywaNGgQN910U+y99955lwQAABSwisrUJFjCRo0aFW3atImRI0dG69at8y4HZii9Fd98881Yc8018y4FAAAo8AxrAjzIya+//honnXRSjB07trp1XpAHAABqQzd7yOlsW48ePWLo0KHZ0nO9evXKuyQAAKCICPMwl/3888+xxRZbxEsvvZR1mznuuOPyLgkAACgywjzMRd9//3107do13nrrrZh//vmjX79+sc466+RdFgAAUGSEeZhLvvrqq+jcuXPWrX6RRRaJ/v37x6qrrpp3WQAAQBES5mEuzVS//fbbZ0G+ffv2MXDgwFh++eXzLgsAAChSZrOHuSDNVH/NNdfEuuuum016J8gDAABzQss81KPx48dHkyZNsstrr712NuldCvYAAABzQss81JMXX3wxa4F//vnnq28T5AEAgLogzEM9GDx4cDbZ3bBhw+Lss8/OuxwAAKDECPNQx/r27Rubb755jBkzJjbbbLO499578y4JAAAoMcI81KFevXrFVlttFePGjYvu3bvH448/Hi1btsy7LAAAoMQI81BH7rrrrthxxx1j4sSJ2feHHnoomjZtmndZAABACRLmoY7WkX/ggQdi8uTJsffee2fBvnHjxnmXBQAAlChL00EdSLPUpwB/4403xiGHHBINGjhPBgAA1B+JA+agNb5Pnz7Z9yR1qT/ssMMEeQAAoN5JHTAbUoA/5ZRTYsstt4zjjz8+73IAAIAyo5s9zKIpU6bE0UcfHVdeeWV2fbHFFsu7JAAAoMwI8zAL0gR3BxxwQNx8883ZOPlrrrkmDjrooLzLAgAAyowwD7WUlpzbc8894957783Gxd9yyy3ZdQAAgLlNmIdajpHfZZddsrXj55lnnrj77rtj++23z7ssAACgTJkAD2ohdalP4b158+bx8MMPC/IAAECuKiqr1tUqUaNGjYo2bdrEyJEjo3Xr1nmXQ5H74YcfYqGFFsq7DAAAoMwzrJZ5mIHhw4fHzjvvHN988031bYI8AABQCIyZh+n47rvvokuXLvHOO+9kl59++umsqz0AAEAhEOZhGsOGDYtOnTrFRx99FIsuumi2/JwgDwAAFBJhHmr45JNPsiD/xRdfxJJLLhkDBw6MZZddNu+yAAAApmLMPPyfd999Nzp06JAF+eWXXz6GDh0qyAMAAAVJmIf/W0f+4IMPjm+//TZWXXXVGDJkSLRv3z7vsgAAAKZLmIf/W0f+7rvvjh122CGb7G6RRRbJuyQAAIAZEuaJcl83vsriiy8e999/f8w///y51gQAADAzwjxlq0+fPrHMMstkLfIAAADFRJinLD344IOx9dZbx9ixY+OBBx7IxswDAAAUC2GesnP77bfHTjvtFBMnToydd945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UFbuQnm5B2XlLtkuKi+N6BrkExMTJSIiInxb5vXDV61aVdxC/7Cc/seF/6C83IOychfKyz0oK/egrNyF8nIPyspdYlxSXpdqkfdhADwAAAAAAFyGMA8AAAAAgMsQ5h2iTJkyMmHCBPMM56O83IOychfKyz0oK/egrNyF8nIPyspdQrG8Qn4APAAAAAAAQg0t8wAAAAAAuAxhHgAAAAAAlyHMAwAAAADgMoR5AAAAAABchjDvELNnz5YaNWpIdHS0tG3bVrZu3Wr3JoWdKVOmSOvWraVChQpy3XXXSa9evWT//v1B69x6663i8XiCHiNGjAha56uvvpLf/OY3Uq5cOfM+jz76qFy4cKGEP01omzhxYoFyuOGGG/zLz549K6NHj5YqVapI+fLlpXfv3vLtt98GvQflVHJ035a/vPShZaSoV/b5+OOPpUePHpKYmGh+72+++WbQch0j94knnpCEhAQpW7asdO7cWQ4cOBC0zg8//CB33323xMTESMWKFeXee++VH3/8MWid3bt3yy233GK+45KSkuSpp54qkc8XLmV1/vx5SU1NlcaNG8s111xj1hk4cKAcP378snVx6tSpQetQViVTtwYPHlygLFJSUoLWoW45o6wK+/7Sx7Rp0/zrULecc6x+tpiOAdesWSMtWrQwI9/XqVNHFixYIE5EmHeAJUuWyNixY82tErZv3y5NmzaVrl27SmZmpt2bFlbWrl1rKv/mzZtl1apV5uCoS5cu8tNPPwWtN2zYMElPT/c/AnfGubm5Zudw7tw52bhxo7z00kum8uvBMIrXjTfeGFQO69ev9y97+OGH5e2335alS5eactUD2jvuuMO/nHIqWZ988klQWWn9Un369PGvQ72yh+7f9DtHTygXRsvh6aeflueee062bNligqJ+P+nBko+Gjb1795pyXb58uTkwHj58uH95dna22ZdWr15dtm3bZg6A9YTcCy+8UCKfMRzK6vTp0+b44fHHHzfPy5YtMwe4PXv2LLDuk08+GVTXxowZ419GWZVc3VIa3gPLYtGiRUHLqVvOKKvAMtLHvHnzTFjXkBiIuuWMY/WHi+EY8PDhw2adDh06yM6dO+Whhx6S++67T9577z1xHL01HezVpk0ba/To0f7p3NxcKzEx0ZoyZYqt2xXuMjMz9baN1tq1a/3z2rdvbz344IMXfc0777xjRUREWBkZGf55c+bMsWJiYqyff/75qm9zuJgwYYLVtGnTQpedOnXKioqKspYuXeqf98UXX5iy3LRpk5mmnOyldah27dpWXl6emaZeOYPWkTfeeMM/reUTHx9vTZs2Lah+lSlTxlq0aJGZ/vzzz83rPvnkE/867777ruXxeKxjx46Z6WeffdaqVKlSUFmlpqZa9evXL6FPFvplVZitW7ea9Y4ePeqfV716dWvmzJkXfQ1lVXLlNWjQIOu222676GuoW86tW1puHTt2DJpH3XLGsfqpYjoG/MMf/mDdeOONQT+rb9++VteuXS2noWXeZnpWSM/QaddFn4iICDO9adMmW7ct3GVlZZnnypUrB83/xz/+IbGxsdKoUSMZP368aRHx0TLTbo5xcXH+edqKpWdk9ew6io929dUucbVq1TKtF9plSml90jO1gXVKu+BXq1bNX6coJ3v3eQsXLpShQ4ealg0f6pXzaMtERkZGUF3yer3mUrDAuqTdf1u1auVfR9fX7zFtyfet065dOyldunRQ+WnL8cmTJ0v0M4Xbd5jWMS2fQNr1V7ufNm/e3LQOBnYtpaxKlnbj1S6+9evXl5EjR8r333/vX0bdcibtrr1ixQpzyUN+1C37j9W3FdMxoK4T+B6+dZyYzUrZvQHh7sSJE6a7R+AflNLpffv22bZd4S4vL890qbnppptMuPC56667TBcpDZF67ZNeo6g7Yu3SqPTAt7Cy9C1D8dAwoV2i9ABIu7JNmjTJXIe2Z88e83vWL8v8B7BaDr4yoJzso9cinjp1ylwv6kO9cibf77aw331gXdIwEqhUqVLmwCpwnZo1axZ4D9+ySpUqXdXPEY70MgitR/379zfXW/s88MAD5hpQLR/tXqonznQfOmPGDLOcsio52sVeu/7q7/vQoUPy2GOPSbdu3UxYiIyMpG45lHbJ1uu1A7ttK+qWM47VM4rpGPBi62jgP3PmjBlDxikI80Ah9HocDYaB12GrwGvV9KyeDgrVqVMn80Vcu3ZtG7Y0POkBj0+TJk1MuNcw+OqrrzpqB4uC5s6da8pPg7sP9QooPtoqdeedd5rBC+fMmRO0TMfnCdx36kHv73//ezOolA7yhJLTr1+/oP2elofu77S1Xvd/cCa9Xl57A+ogdoGoW845Vg83dLO3mXYr1TOw+UdZ1On4+Hjbtiuc3X///WagmdWrV0vVqlUvua6GSHXw4EHzrGVWWFn6luHq0DOw9erVM+Wgv2ftyq2tvxerU5STPY4ePSoffPCBGUTmUqhXzuD73V7q+0mf8w/Wql1LdRRu6pt9QV7rmg4OFdgqf7G6puV15MgRM01Z2UcvGdNjwsD9HnXLWdatW2d6jV3uO0xRt+w5Vo8vpmPAi62j+1SnNRoR5m2mZ+5atmwpH374YVC3EZ1OTk62ddvCjbZi6M7hjTfekI8++qhAd6jC6AiXSlsSlZbZZ599FvQF7Dugatiw4VXc+vCmt+rRVlwtB61PUVFRQXVKv3z1mnpfnaKc7DF//nzTbVRHiL0U6pUz6D5QD2gC65J2MdTrdQPrkh406XWKPrr/1O8x30kZXUdH4dagGVh+epkMXUuLP8jreCJ60kyv3b0crWt6DbavOzdlZZ9vvvnGXDMfuN+jbjmvZ5keY+jI95dD3bLnWL1lMR0D6jqB7+Fbx5HZzO4R+GBZixcvNqMDL1iwwIxeOnz4cKtixYpBoyzi6hs5cqTl9XqtNWvWWOnp6f7H6dOnzfKDBw9aTz75pPXpp59ahw8ftt566y2rVq1aVrt27fzvceHCBatRo0ZWly5drJ07d1orV660rr32Wmv8+PE2frLQM27cOFNOWg4bNmywOnfubMXGxppRTdWIESOsatWqWR999JEpr+TkZPPwoZxKnt6lQ8tER+8NRL2yV05OjrVjxw7z0EOCGTNmmP/7RkCfOnWq+T7Sctm9e7cZxblmzZrWmTNn/O+RkpJiNW/e3NqyZYu1fv16q27dulb//v39y3V04bi4OGvAgAHWnj17zHdeuXLlrOeff96WzxyKZXXu3DmrZ8+eVtWqVU0dCfwO843OvHHjRjPati4/dOiQtXDhQlOPBg4c6P8ZlFXJlJcue+SRR8zo2rrf++CDD6wWLVqYunP27Fn/e1C3nLEfVFlZWeZ3q6Oe50fdcs6xenEdA3755ZemfB599FEzGv7s2bOtyMhIs67TEOYd4q9//av5wytdurS5Vd3mzZvt3qSwozvwwh7z5883y7/66isTMCpXrmxOvtSpU8dUct3BBzpy5IjVrVs3q2zZsiZgavA8f/68TZ8qNOntQRISEkx9uf766820hkIfDRqjRo0yt4HRnfHtt99udvaBKKeS9d5775n6tH///qD51Ct7rV69utD9nt42y3d7uscff9wchGr5dOrUqUAZfv/99yZglC9f3tzaZ8iQIebgONCuXbusm2++2byH1lk9SYDiKysNhBf7DtPXqW3btllt27Y1B8LR0dFWgwYNrMmTJweFR0VZXf3y0uChQUIDhN5GS29rNmzYsAKNONQtZ+wHlYZu/f7RUJ4fdcs5x+rFeQyofxfNmjUzx5rayBD4M5zEo//Y3TsAAAAAAAAUHdfMAwAAAADgMoR5AAAAAABchjAPAAAAAIDLEOYBAAAAAHAZwjwAAAAAAC5DmAcAAAAAwGUI8wAAAAAAuAxhHgAAAAAAlyHMAwAAW9WoUUNmzZpl92YAAOAqhHkAAByqR48ekpKSUuiydevWicfjkd27d8uRI0fM/yMjI+XYsWNB66Wnp0upUqXMcl0PAACEBsI8AAAOde+998qqVavkm2++KbBs/vz50qpVK2nSpIl/3vXXXy8vv/xy0HovvfSSmR9uzp07Z/cmAABwVRHmAQBwqN/+9rdy7bXXyoIFC4Lm//jjj7J06VIT9gMNGjTIhPxAOq3zi9LVffLkyTJ06FCpUKGCVKtWTV544QX/8jVr1pjW/VOnTvnn7dy5M6jFX7ezYsWKsnz5cqlfv76UK1dOfve738np06fNSQX9GZUqVZIHHnhAcnNzg35+Tk6O9O/fX6655hpz8mH27NlBy/Xn3nfffeb3ERMTIx07dpRdu3b5l0+cOFGaNWsmf/vb36RmzZoSHR192c8MAICbEeYBAHAo7R4/cOBAE5Ity/LP1yCvYVjDb6CePXvKyZMnZf369WZan3Vau+sXxfTp001r/44dO2TUqFEycuRI2b9//xVtswb3p59+WhYvXiwrV640JwFuv/12eeedd8zj73//uzz//PPy2muvBb1u2rRp0rRpU/Oz09LS5MEHHzS9Enz69OkjmZmZ8u6778q2bdukRYsW0qlTJ/nhhx/86xw8eFBef/11WbZsmTnRAABAKCPMAwDgYNpSfujQIVm7dm1Qa3vv3r3F6/UGrRsVFSX33HOPzJs3z0zrs07r/KLo3r27CfF16tSR1NRUiY2NldWrV1/R9p4/f17mzJkjzZs3l3bt2pmWeT2pMHfuXGnYsKHpbdChQ4cC73vTTTeZEF+vXj0ZM2aMed3MmTPNMn391q1bzUkMPdlQt25d+ctf/mJ6AQSeFNCu9XqZgf7swMsPAAAIRYR5AAAc7IYbbpBf/epX/oCurc86+F3+LvaB4V9Db0ZGhnnW6aIKDMDafT4+Pt60hl8J7Vpfu3Zt/3RcXJzpXl++fPmgefnfNzk5ucD0F198Yf6v3en10oIqVaqY9/E9Dh8+bE50+FSvXt10wwcAIByUsnsDAADApWlw19ZqvY5cW+U1LLdv377QdRs3bmxOAGgX/AYNGkijRo2K3OU8fwu+Bvq8vDzz/4iIf53/D+zur63wRXmPS71vUWiQT0hIMF3289PWeR+93h4AgHBByzwAAA535513mjD9yiuvmG7k2tqugfhidLkG3ytplb8cX4u33urOpzivS9+8eXOBaT0ZofT6eO1poGMI6CUAgQ+9FAAAgHBEmAcAwOG0S3nfvn1l/PjxJkwPHjz4kusPGzZMvvvuOzP6e3HR4JyUlGRGjT9w4ICsWLHCDJhXXDZs2CBPPfWU/POf/zQ9EPQSAR0ET3Xu3Nl0u+/Vq5e8//77ZvT8jRs3yh//+Ef59NNPi20bAABwE8I8AAAu6WqvI9N37dpVEhMTL7mutmBri7U+FxftKr9o0SLZt2+fubb+z3/+s/zpT38qtvcfN26cCeY6eJ2+74wZM8xnVdoLQUfC1wH1hgwZYgbJ69evnxw9etRcfw8AQDjyWIEXvwEAAAAAAMejZR4AAAAAAJchzAMAAAAA4DKEeQAAAAAAXIYwDwAAAACAyxDmAQAAAABwGcI8AAAAAAAuQ5gHAAAAAMBlCPMAAAAAALgMYR4AAAAAAJchzAMAAAAA4DKEeQAAAAAAxF3+H3jLHWhb/1GrAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "means = [np.mean(x) for x in results]\n", + "errors = [np.std(x, ddof=1) / np.sqrt(len(x)) for x in results]\n", + "\n", + "# Plot the graph\n", + "fig, ax = plt.subplots(figsize=(10, 10), layout='constrained')\n", + "\n", + "# linear regression\n", + "coef = np.polyfit(vm_nbs,means,1)\n", + "poly1d_fn = np.poly1d(coef) \n", + "ax.plot(vm_nbs, poly1d_fn(vm_nbs), '--k')\n", + "\n", + "# mean results with error bars\n", + "ax.errorbar(vm_nbs, means, errors, fmt='o', linewidth=2, capsize=6)\n", + "ax.set_title('Performance analysis for VM assessment with cache and evaluator fix')\n", + "ax.set_ylabel('Elapsed time [s]')\n", + "ax.set_xlabel('VM number')\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 144, + "id": "20caf548-ab01-424e-aabb-090cb14b5a3e", + "metadata": {}, + "outputs": [], + "source": [ + "filename = '001_perf_analysis_vm_assess_with_cache_and_eval_fix_04'" + ] + }, + { + "cell_type": "code", + "execution_count": 136, + "id": "1917911c-2184-448f-92d5-283695a5c428", + "metadata": {}, + "outputs": [], + "source": [ + "fig.savefig(filename+'.png') " + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "id": "22c2645b-faf7-4be5-8202-1a58a1bbe336", + "metadata": {}, + "outputs": [], + "source": [ + "# save results\n", + "import pickle\n", + "with open(filename, \"wb\") as fp: #Pickling\n", + " pickle.dump(results, fp)" + ] + }, + { + "cell_type": "code", + "execution_count": 109, + "id": "3b431c21-9c01-4c76-a7d7-31a174725301", + "metadata": {}, + "outputs": [], + "source": [ + "# load all results\n", + "\n", + "with open(\"001_perf_analysis_vm_assess_without_cache_and_with_eval_fix_02\", \"rb\") as fp: # Unpickling\n", + " wo_cache = pickle.load(fp)\n", + "\n", + "with open(\"001_perf_analysis_vm_assess_without_cache_and_extended_oracle_cache_and_with_eval_fix_02\", \"rb\") as fp: # Unpickling\n", + " wo_cache_and_extended_oracle_cache = pickle.load(fp)\n", + "\n", + "with open(\"001_perf_analysis_vm_assess_with_cache_and_with_eval_fix_02\", \"rb\") as fp: # Unpickling\n", + " w_cache = pickle.load(fp) \n", + "\n", + "with open(\"001_perf_analysis_vm_assess_with_cache_and_extended_oracle_cache_and_with_eval_fix_02\", \"rb\") as fp: # Unpickling\n", + " w_cache_and_extended_oracle_cache = pickle.load(fp)" + ] + }, + { + "cell_type": "code", + "execution_count": 112, + "id": "b84762e1-90c0-43f0-b149-a7ddd706e927", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA/MAAAPzCAYAAAD7/FyjAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjUsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvWftoOwAAAAlwSFlzAAAPYQAAD2EBqD+naQAA8WpJREFUeJzs3Qd0FFXDxvEnvUASCL333rsgSEdRsYuiAopSRGyICvYONkSligqC2AtioUsRRJAmvfcOgTRC+n7nXt7kSyBAAkl2N/n/zlmzMzs7c3d2gnnmNg+Hw+EQAAAAAABwG57OLgAAAAAAAMgawjwAAAAAAG6GMA8AAAAAgJshzAMAAAAA4GYI8wAAAAAAuBnCPAAAAAAAboYwDwAAAACAmyHMAwAAAADgZgjzAAAAAAC4GcI8AOCi3n33XVWuXFleXl5q2LChs4uDy1SxYkXdf//9ObJvs1+z/+wQHR2thx56SCVLlpSHh4eeeOKJbNkvAAB5DWEeANzM5MmTbchJefj7+6t69eoaNGiQjh49mq3HmjNnjp555hldffXVmjRpkt56661s3T9wLnONmWv84Ycf1tSpU9WzZ88cOc7q1avt788LL7xwwW22b99utxk8eLBdfuWVV+yyp6en9u/ff972kZGRCggIsNuY30e4lj/++MN+hwCQV3g7uwAAgMvz2muvqVKlSoqNjdWSJUs0btw4+8fqhg0bFBgYmC3H+PPPP21w+eyzz+Tr65st+0TeM3HiRCUnJ2fbNXfVVVfp5ZdfVk5q3Lixatasqa+//lpvvPFGhtt89dVX9ud9992Xbr2fn599n7nRldZPP/2UgyXGlTL/Po4ZM4ZADyDPoGYeANxU165dbcgwTZJNTaZpjrx792798ssvV7zvmJgY+/PYsWO2pjG7grzD4dCZM2eyZV9wHT4+PjbgZgdzzRUqVEjZJTExUfHx8Rm+du+992rXrl36559/MnzdBHYT+E3wT+v666+3r2UU/m+44YZsKjkAABdHmAeAPKJDhw72pwn0Kb788ks1adLEBvLQ0FDdfffd5zUPbteunerWratVq1bpmmuusbX6zz33nG0qbJrWnz59OrVJv7lpkBKQXn/9dVWpUsWGONNf2rwnLi4u3b7N+htvvFGzZ89W06ZNbTkmTJighQsX2v199913evXVV1WmTBkFBQXpjjvuUEREhN2PuTlRvHhxFSxYUA888MB5+zZlM5/ZbGPKULt2bds64VwpZTCtF5o3b267JZgxAKZMmXLetuHh4XryySfte8w+y5Ytq169eunEiROp25hymFrjqlWr2m3KlStna2jPLV9G/vrrL915550qX7586nvN8c69wWH6oJvPffDgQd1yyy32ebFixTRkyBAlJSWl2/a9995Tq1atVKRIEXt+zff9ww8/XLQcJsCa8//BBx+c99rff/9tX0sJq1FRUfa7SDkn5nx37tzZNlO/WJ/5b775xpbFfK/BwcGqV6+ePvzwwwuWKeWaMNfv77//nnrN7dmzJzXkP/jggypRooT9Dhs0aKAvvvgi3T7MtuY95pyMGjUq9frctGnTBcN82hr4tMzvw9atW1O3Seuee+7R2rVrtWXLltR1R44csa0KzGuZldlreOXKlbr22mtVtGhR+x2bFjl9+vTJ8vk217f5Ls11Z45nruG33377vFYVl9pXQkKC/b2tVq2a/S7Mtde6dWvNnTv3vGt437599vfPPDe/56Zm3Fi/fr397AUKFFCFChUy/A4yU9603/knn3yS+p03a9ZM//77b7rypBw7bTclAHBnNLMHgDxi586d9qf5w9p488039eKLL6p79+629v748eP6+OOPbWBfs2ZNutrPsLAwW9Nvwr6p7TeByYRv88fxihUr9Omnn9rtTGg0zP5MkDLh+6mnntLy5cs1fPhwbd68WT///HO6cplA1KNHD/Xv3199+/ZVjRo1Ul8z7zHhZOjQodqxY4ctn6nlNU37T506ZZvDmlpTcxPBBJiXXnop9b0m9NSpU0c33XSTvL299euvv2rgwIH2D/1HHnkkXRnMvk1ZTRjs3bu3Pv/8c/vHvQksZh8pA6+1adPGfgYTlExtrAnxM2bM0IEDB2yQMvs2xzM3Bvr166datWrZUGJC8bZt2zR9+vSLfkfff/+9bfVg+oOb78mcW/OZzf7Na2mZ0G4CXIsWLWxQmTdvnt5//30bVsz7U5iQZcpkQqepgTZBzNww+O233y5YS2xuZphxEKZNm2ZvJqRl1pkQd/PNN9vlAQMG2JsDpg+4CZvmWjGf35ync2usU5hQZ77zjh072vBlmO2XLl2qxx9/PMP3mHNp+sib8pibKOa6MsxNDHOzw9x0Mt+jKYe5Fsz5Mt+hCXzn7tOEZNP9xHxHJtiZG1kZMfsx17S5qWS+QzPIY4qUcJlRODe/Q6aMZhvT3cX49ttvbWDNSs18Zq5hcxOjS5cu9jyY3xPze2sCbNom/Zk53+a6a9u2rb1BZH4XzQ0lc+Nm2LBhOnz4sL35kdl9md9L87tr/h0wN8jMWAHmhoO5wWNu9KS9hs2/K+Z8vfPOO/baMt+fCfDPP/+8vWZvu+02jR8/3t40a9mypf1OslLetN+XufFktjUh3RzP7NvcuDL/ppj1hw4dsp/PXGcAkCc4AABuZdKkSQ7zz/e8efMcx48fd+zfv9/xzTffOIoUKeIICAhwHDhwwLFnzx6Hl5eX480330z33vXr1zu8vb3TrW/btq3d3/jx4887Vu/evR0FChRIt27t2rV2+4ceeijd+iFDhtj1f/75Z+q6ChUq2HWzZs1Kt+2CBQvs+rp16zri4+NT1/fo0cPh4eHh6Nq1a7rtW7ZsafeVVkxMzHnlvfbaax2VK1dOty6lDIsXL05dd+zYMYefn5/jqaeeSl330ksv2e1++umn8/abnJxsf06dOtXh6enp+Ouvv9K9bs6dee/SpUvPe++lyjx8+HD7mffu3ZvuvJv9vfbaa+m2bdSokaNJkyYX3ac5n+a8dujQ4bzzYPabYsKECfYYmzdvTvfeokWLptsuJCTE8cgjj1z0c5nt034/jz/+uCM4ONiRmJjoyCqznxtuuCHdulGjRtmyfvnll+nKaq6LggULOiIjI+263bt32+3Msc13nBljxoyx75k9e3bquqSkJEeZMmXs/tN6+eWX7bbm985c71WrVk19rVmzZo4HHnjAPjfbXOqcZfYa/vnnn+3+/v333wvuJzPn+/XXX7e/y9u2bUu3fujQofbfin379mV6Xw0aNDjvOzpXyjX81ltvpa47deqU/TfKXO/m36wUW7Zssdua85vV8qZ85+bfv5MnT6Zu98svv9j1v/76a+o6853wpy+AvIRm9gDgpjp16mRr60wTVFOjbmoFTa24acpqau1M7Z6plTe1yykPM92XaRq7YMGCdPsytZemKXtmB5EyUkb4TpFSk2qaSKdlatpMDXNGTG2cqTVLYWqhTRY6twmxWW+6B5jm/SlMjX4K0zTffD5Tk2dq4sxyWqZG2dS6pzDnzbQQMNum+PHHH23T7VtvvfW8cqY0xzW1waYG2fSjTnteU7o4nHtez5W2zKb7gnmvqRk2n9m0ljiXqRVPy3yGtGU+d5+mNYP57Ga7tM3gM2KuDdNE2tSWpjDdIUyZ0g74ZmqCTcsLU6uZWeY95vOlbXZ9Jcw1Z65dU2Ocwlw3jz32mG1RsWjRonTb33777fY7zoy77rrL7ittM2+zP1MjnFET+xSmxt60FDBNuVN+ZqWJfWav4ZQWNKalhWnefrnn21y75rooXLhwumvX/DtiatAXL16c6X2ZbTZu3GhH+78UU3uf9n3m987UzJvrL4VZZ15Le21ntrxpv0ezbYqU3/dzf18AIC8hzAOAmzL9P80f3CZAmj7B5o/WlNBs/sg2AdEEdxNq0j5Mk1nTdDctcwMgs4Pc7d271zaDN/1X0zJhy/xBbl5PK6XZbEZM09m0QkJC7E9zg+Lc9ebmRNqQbpr9mj/sTTAwxzWfzfTbN84N8+cexzB/+Jvwm7abghk74GLMeTUh5txzaqYGNM49r+cy/YdN03DT7DulH7wJbxmV2QTtcwPpuWVOCXlm9HezvdmveY9pvn3u/s5lzlm3bt3ShVgT7M21kHJzwjDNlc0MCeY7MU2qTRPrSwUk01TcnBPTxNo0Rzc3Z2bNmqXLZa4pcy2b6y4tc2Ml5fXMXnPnMt0dzO+NuRFmmuYb5pyYZu9pA+e5GjVqZG/qmG3NeTPXf9rzlhmZuYbN9WFuTpg+6qarh+n+YLoRpB2jITPn21y7Zt251645ftprNzP7Ml0LTPcGs53pT//0009r3bp1532+jK5h87ts9ntuf3WzPu21ndnyXuh3PCXYn/v7AgB5CX3mAcBNmWBl+rVnxARf88fyzJkz0/UDTmGC5IVqCDMrs4NHXWzfGZXtYuvPtmA+G7xNn14TpkaOHGmDprkZYWpwTd/ncwf0utT+Msvs14QXc8yMnHsTIi1Tm2j6E588eVLPPvusLbsJcaYG2AT8zJb53AH1TH9r0yd57NixKlWqlK1lNmEvowHFMmoZYWpATV9k87nM+AAmzKUNzSbQmlpOE3bnzJmjd9991/alNq0/TODLiBnQzQwQZ2r6zTVoHqZM5njnDlqXE7J6PZuWCOamiHmY82laaaT0U78YUxNvbpyYMQZMzfC5NxsuJrPXsPk9M2MWmLEjTJ96c05NwDbjJ5h15nc5M+fb7M9cf+dOp5ci5YZUZvZlrjdTfjNzhrkmzJgapsym73vamvjL/f3OSnmzsk8AyGsI8wCQB5lB0swfsaaG8tw/eq+UGXna/KFtas5SakaNo0eP2to683pOM6HG1Eya8Jm2Ru5Szdwvdc5MDfSltvnvv/9sCMvqSNhmoDwzSJ4JRCYYpbiSpugmdJraTxO80k4NZ8JXZlx33XU2sJqaZdOVwQw61rNnz/O2MzcJTMg3D1Mjaga+MwMsXijMGyaYmpp/8zDXi3mvmcnADMp4bquOSzHXlKn5NftJG5hTRpO/0mvOBHgTyM0NEHMzxNTmXqyJfdowbwZlNAOyZXVQtaxew6b1hXmY827KacpnBjtMCc+XOt/m2jVdElJqti8mM9+daQViuuaYh9mvCfim1UbaMH8lslLezGL0egB5Dc3sASAPMqM4m5oq0zT33Jops2xGJL9cZo5t49zRpFNqq3Njnu2UWri0n800S85siM2Iacpsgvq5o/GnPY6ppTY16RMnTjxvGzPiuulrnJUym+cXm67tUsw+TUBJO12dGen8UqPqpzBNyU0/dDOau5kxwNTO169fP/V1s99zm+ubmtvSpUtfdCq+c68vE8BT9puZKfwyuubM1G9mxPgUZvwEMxOAqZlO6apwJTX5ZqwEUytuatpNi4mU0fwvFTjN74EZ2d20lMmJa9jcWDj3d7hhw4bpzmVmzre5dpctW2Zv/JzL3IRLGY8iM/s6dxvzHZiQfznf7YVktrxZYb7XlPcDQF5AzTwA5EEmZLzxxht2GicT7sxc5abm0czhbcKqmbLLzFl+OcwgcWZ6NzNtnfmj2AQpM8WaqXE2x2nfvr1ymmkCnVJ7aKacMjV4JmCboGlqSS+H6fdrmjObad1MM2YzbZ1pEm9qTk3zYfO5Ta21Cb5mYDpTg2qmdzOB19QQm/UmeFyo64NpTm2+F3PezQ0BM3+3qVm/kj695saJuYliathNLbGpNTdjKZhglVEf5oyYVgIfffSR/TwpU5GlMFN9mf7NZlo/8/lNaDNT5JnB3kwz7wsxtbPm3Jk+5Ob9pk+7Cd4mhKZtzZFZ5no1NcOmO4KZ/93MaW++K9Pn3IRpc21fKdPUfsqUKfY7NLXeKcHvUi401V52XcPm98p0oTA3G8z1Y74Ts525flJurGXmfJvr21zLZs73lGkZzc0n02LEnEvz74Tpk5+ZfZkBJc1UgWYfpobeTEuXMn1hdslsebPC7MMwAyeacRLMDRUzeCgAuC1nD6cPALi8qekuNlVVih9//NHRunVrO8WTedSsWdNOz7R169Z0U9PVqVMnw/dnNDWdkZCQ4Hj11VcdlSpVcvj4+DjKlSvnGDZsmCM2NvaS04ylnZru+++/z9RnSzslWIoZM2Y46tev7/D393dUrFjR8fbbbzs+//xzu52ZrupSZTCf2zzSCgsLcwwaNMhOS+br6+soW7asPQcnTpxINyWaOZY5Z2Z6u8KFC9vp4sz5iIiIcFzMpk2bHJ06dbLTqZkp4Pr27ev477//bJnNZ7/UeU85D2l99tlnjmrVqtmymO/X7Cej7c6dmi4t81nMlHtmWsO04uLiHE8//bSdiiwoKMiWyTwfO3bsRaem++GHHxxdunRxFC9e3J7H8uXLO/r37+84fPjwRc/Pxb6vo0eP2qnfzHkz+6xXr166c5Z2mrJ3333XkVVmKrZSpUrZ9//xxx8ZbpPRdZiRzE5Nl5lrePXq1XbKRnMOzXdszumNN97oWLlyZZbPd1RUlP09NVPqme3MuWzVqpXjvffeS50iMjP7euONNxzNmzd3FCpUyE41Z647M91l2mkmL3QNX+jfm4y+98yU92Lf+bnT3Znv+NFHH3UUK1bMTo/Hn8EA3J2H+Y+zbygAAADnMSOzmxrW+fPnO7soAAAgk+gzDwBAPmaaSJvRy9MOygcAAFwfNfMAAORDZuR+0//c9H0/ceKEnTvejIwPAADcAzXzAADkQ2YQMTOtWEJCgr7++muCPAAAboaaeQAAAAAA3Aw18wAAAAAAuBnCPAAAAAAAbsbb2QVwRcnJyTp06JCCgoLk4eHh7OIAAAAAAPIJh8OhqKgolS5dWp6eF65/J8xnwAT5cuXKObsYAAAAAIB8av/+/SpbtuwFXyfMZ8DUyKecvODgYGcXBwAAAACQT0RGRtrK5ZRceiGE+QykNK03QZ4wDwAAAADIbZfq8s0AeAAAAAAAuBnCPAAAAAAAboYwDwAAAACAm6HP/BVMF5CYmKikpCRnFwUAnMbLy0ve3t5M4wkAAJDLCPOXIT4+XocPH1ZMTIyziwIAThcYGKhSpUrJ19fX2UUBAADINwjzWZScnKzdu3fb2qjSpUvbP16pkQKQX1somZubx48ft/8uVqtWTZ6e9N4CAADIDYT5LDJ/uJpAb+b9M7VRAJCfBQQEyMfHR3v37rX/Pvr7+zu7SAAAAPkCVSiXidonADiLfw8BAAByH3+BAQAAAADgZgjzAAAAAAC4GcI8MjR58mQVKlToktuZwf+mT58uV+KKZQIAAACA7ESYR4buuusubdu2LXX5lVdeUcOGDZ1aJgAAAADAWYxmjwuOUG0eAAAAAADXQ818NoqJT7zgIzYhKVu3zarffvvNNptPSjq777Vr19rm6EOHDk3d5qGHHtJ99913XjN78/zVV1/Vf//9Z99jHmZdihMnTujWW2+1U/WZeaZnzJhx0bLExcXp2WeftdP7+fn5qWrVqvrss8/sa6Z8Dz74oCpVqmRvJtSoUUMffvjhefv4/PPPVadOHfv+UqVKadCgQelev1SZNmzYoK5du6pgwYIqUaKEevbsad8DAAAAAO6AmvlsVPul2Rd8rX2NYpr0QPPU5Savz9OZc0J7ihaVQvVt/5apy63fXqCTp+PTbbNnxA1ZKlubNm0UFRWlNWvWqGnTplq0aJGKFi2qhQsXpm5j1pmQnVGTexN+Z82apXnz5tl1ISEhqa+boP/OO+/o3Xff1ccff6x7773XzjkdGhqaYVl69eqlZcuW6aOPPlKDBg20e/fu1CCdnJyssmXL6vvvv1eRIkX0999/q1+/fjawd+/e3W4zbtw4DR48WCNGjLCBPCIiQkuXLk13jIuVKTw8XB06dLA3Lz744AOdOXPGfm6z/z///DNL5xUAAAAAnIEwn0+Y8G36vJvwbsK8+fnkk0/a0BsdHW0D8Y4dO9S2bdvz3mtqyE0Ntre3t0qWLHne6/fff7969Ohhn7/11ls2pK9YsULXXXfdeduafvjfffed5s6dq06dOtl1lStXTn3dx8fHlimFqaE3wd+8JyXMv/HGG3rqqaf0+OOPp27XrFmzTJdp9OjRatSokV2ftqbftBQw5atevXoWzy4AAAAA5C7CfDba9Nq1F3zN08Mj3fKqFztletslz7bPhtLJBnUT4k0Q/uuvvzR8+HAbkpcsWaKTJ0+qdOnStkl6VtWvXz/1eYECBRQcHKxjx45luK1p3u/l5ZXhTYMUY8aMseF63759ttY8Pj4+dfA9s99Dhw6pY8eOl10m011gwYIF9gbFuXbu3EmYBwAAAODyCPPZKNDX2+nbXky7du1sSDZh1tSA16xZ064zAf/UqVMXDdgXY/aVlulTb5rLZ+RSg+p98803GjJkiN5//321bNlSQUFBtqn88uXLM/X+zJTJtETo1q2b3n777fPeZ5rzAwAAAICrI8znIyn95k0/8ZTgbsK86Xtuwrypsb8QX1/f1MHzrkS9evVsqDb981Oa2adl+r63atVKAwcOTFdbnsKE+4oVK2r+/Plq3/7yWiw0btxYP/74o92P6ToAAAAAAO6G0ezzkcKFC9vm59OmTbMh3rjmmmu0evVq21f8YjXzJviagepMM3kzWJ0Zkf5ymP307t1bffr00fTp0+0+TcsA09zfMM38V65cqdmzZ9syvfjii/r333/T7cPMeW9q7k0/+O3bt9vym0HuMuuRRx6x3QpMn3qzb3OzwBzvgQceyJYbFgAAAACQ0wjz+YwJ7CawpoR5M7p77dq17cB2Zhq4C7n99tvt4HGmNrxYsWL6+uuvL7sMZjT6O+64w9a+m6b+ffv21enTp+1r/fv312233WZH0G/RooXCwsLS1dIb5mbAqFGjNHbsWDs93Y033mhDfWaZsQFMCwBzHrp06WJbCzzxxBN2Kj5PT34lAAAAALg+D4fD4XB2IVxNZGSkHf3djPBuBk5LKzY21tYmm1HW/f39nVZGAHAV/LsIAACQO3k0LaohAQAAAABwM4R5AAAAAADcDGEeAAAAAAA3Q5gHAAAAAMDNEOYBAAAAAHAzhHkAAAAAANwMYR4AAAAAADdDmAcAAAAAwM0Q5gEAAAAAcDOEeWRo8uTJKlSo0CW38/Dw0PTp0+VKXLFM999/v2655ZaLbrNw4UJb9vDwcOVlFStW1KhRo65oH6+88ooaNmwoV9SuXTs98cQTclV79uyx19natWudXRQAAABcAcI8MnTXXXdp27ZtbhGe3MGHH35ob5C4YuDLzI0GAAAAAK7F29kFgGsKCAiwD2SPkJAQZxcBlxAfHy9fX19nFwMAAADIFGrms1FMQswFH3FJcZneNjYx9pLbZtVvv/1mm80nJSXZZdPE1jS1HTp0aOo2Dz30kO67777zmtmb56+++qr+++8/+x7zSFvLfOLECd16660KDAxUtWrVNGPGjIuWJS4uTs8++6zKlSsnPz8/Va1aVZ999pl9zZTvwQcfVKVKlezNhBo1atha7XN9/vnnqlOnjn1/qVKlNGjQoHSvX6pMGzZsUNeuXVWwYEGVKFFCPXv2tO/JrCFDhujGG29MXTbNxs15mTVrVuo687k+/fTT82q/zfNFixbZz5VyPk3T5xSrVq1S06ZNbdlbtWqlrVu3XrQs+/fvV/fu3e33FRoaqptvvjl1f1u2bLH7+eqrr1K3/+677+y53bRpk21x8cUXX+iXX35JLYtp7n+p/ab9TO+99579DooUKaJHHnlECQkJqdscO3ZM3bp1s8cz3+m0adPOK7/pVmCuvWLFiik4OFgdOnSw11paI0aMsN9TUFCQvT5iY9P/jmTEnOPmzZunXiPmWk9MTEzXOsJcN6aFRNGiRXXttdfa9SNHjlS9evVUoEABe40OHDhQ0dHR6fa9dOlS+35zbgsXLmzfe+rUqQte7+Z6KVOmjN1nixYtUs/xhZhz0r9/f/uZ/f39VbduXfs7bISFhalHjx52f+b4pqxff/11uvcnJyfrnXfesdeg+fzly5fXm2++mW6bXbt2qX379nYfDRo00LJly9K9vmTJErVp08Z+d+Y8PPbYYzp9+vQlzzsAAAByiQPniYiIcJhTY36e68yZM45NmzbZn+eqO7nuBR8Pz3043bbNvmx2wW3vn3l/um3bfN3mvG2yKjw83OHp6en4999/7fKoUaMcRYsWdbRo0SJ1m6pVqzomTpxon0+aNMkREhJin8fExDieeuopR506dRyHDx+2D7POMOepbNmyjq+++sqxfft2x2OPPeYoWLCgIyws7IJl6d69u6NcuXKOn376ybFz507HvHnzHN988419LT4+3vHSSy/Zcu7atcvx5ZdfOgIDAx3ffvtt6vvHjh3r8Pf3t59h69atjhUrVjg++OCD1NcvVaZTp045ihUr5hg2bJhj8+bNjtWrVzs6d+7saN++fabP54wZM+z5SUxMtMu33HKLPZ/PPvusXT5w4IAthzm+0bt3b8fNN9+c+l20bNnS0bdv39TzafazYMEC+x7znSxcuNCxceNGR5s2bRytWrW6YDnM+apVq5ajT58+jnXr1tlr85577nHUqFHDERcXZ7cZM2aMLevevXsd+/fvdxQuXNjx4Ycf2teioqLs93HdddellsW8LzP7NZ8pODjYMWDAAHsef/31V/tdffLJJ6nl69q1q6NBgwaOZcuWOVauXGk/S0BAQLrvq1OnTo5u3brZ73zbtm32WitSpEjq92W+ez8/P8enn37q2LJli+P55593BAUF2f1eiDn/piwDBw60Zfv555/t9/Pyyy+nbtO2bVt7XTz9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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "def plot_results(results, ax, label):\n", + " means = [np.mean(x) for x in results]\n", + " errors = [np.std(x, ddof=1) / np.sqrt(len(x)) for x in results]\n", + "\n", + " # linear regression\n", + " coef = np.polyfit(vm_nbs,means,1)\n", + " poly1d_fn = np.poly1d(coef) \n", + " ax.plot(vm_nbs, poly1d_fn(vm_nbs), '--', label=label)\n", + " ax.errorbar(vm_nbs, means, errors, fmt='o', linewidth=2, capsize=6)\n", + " \n", + "# Plot the graph\n", + "fig, ax = plt.subplots(figsize=(10, 10), layout='constrained')\n", + "#plot_results(wo_cache, ax, 'without cache')\n", + "plot_results(w_cache, ax, 'with cache')\n", + "#plot_results(wo_cache_and_extended_oracle_cache, ax, 'without cache, with extended oracle cache')\n", + "plot_results(w_cache_and_extended_oracle_cache, ax, 'with cache, with extended oracle cache')\n", + "ax.legend()\n", + "\n", + "\n", + "# mean results with error bars\n", + "ax.set_title('Performance analysis for VM assessment')\n", + "ax.set_ylabel('Elapsed time [s]')\n", + "ax.set_xlabel('VM number')\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 113, + "id": "d80677c5-61df-4438-b9d7-b9d420b2d640", + "metadata": {}, + "outputs": [], + "source": [ + "fig.savefig('001_perf_analysis_vm_assess_w_cache_and_extended_01.png') " + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.0" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/experiments/performance/pyproject.toml b/experiments/performance/pyproject.toml new file mode 100644 index 0000000..627a147 --- /dev/null +++ b/experiments/performance/pyproject.toml @@ -0,0 +1,11 @@ +[project] +name = "perfanalysis" +version = "0.1.0" +description = "Add your description here" +readme = "README.md" +requires-python = ">=3.13" +dependencies = [ + "matplotlib>=3.10.5", + "numpy>=2.3.2", + "requests>=2.32.4", +] diff --git a/experiments/performance/server_data_creator.ipynb b/experiments/performance/server_data_creator.ipynb new file mode 100644 index 0000000..08769a8 --- /dev/null +++ b/experiments/performance/server_data_creator.ipynb @@ -0,0 +1,101 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 4, + "id": "c35fd21b-7cc2-408f-84fc-f7f99de9c7d2", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CSV file 'workers.csv' created with 2000 workers.\n", + "CSV file 'workers_impacts.csv' created with 2000 hardware entries.\n" + ] + } + ], + "source": [ + "import csv\n", + "import random\n", + "\n", + "def generate_workers_csv(n, filename=\"workers.csv\"):\n", + " header = [\n", + " \"id\",\"pool_id\",\"dc_id\",\"power\",\"lifespan\",\"hdd_quantity\",\"hdd_unit_size\",\n", + " \"ssd_quantity\",\"ssd_unit_size\",\"ram_quantity\",\"ram_unit_size\",\"gpu_quantity\",\n", + " \"gpu_model_name\",\"fan_quantity\",\"psu_total_weight\",\"load_rate\",\"comment\",\"quantity\"\n", + " ]\n", + " \n", + " with open(filename, mode=\"w\", newline=\"\") as file:\n", + " writer = csv.writer(file)\n", + " writer.writerow(header)\n", + " \n", + " for i in range(n):\n", + " row = [\n", + " f\"worker-{i}\", # id\n", + " \"worker\", # pool_id\n", + " \"fr01\", # dc_id\n", + " random.uniform(50, 70), # power (random float)\n", + " 1, # lifespan\n", + " \"\", \"\", # hdd_quantity, hdd_unit_size\n", + " \"\", \"\", # ssd_quantity, ssd_unit_size\n", + " random.uniform(30, 64), # ram_quantity (GB)\n", + " \"GB\", # ram_unit_size\n", + " \"\", \"\", # gpu_quantity, gpu_model_name\n", + " \"\", \"\", # fan_quantity, psu_total_weight\n", + " \"\", \"\", # load_rate, comment\n", + " 1 # quantity\n", + " ]\n", + " writer.writerow(row)\n", + " \n", + " print(f\"CSV file '{filename}' created with {n} workers.\")\n", + "\n", + "def generate_workers_impact_csv(n, filename=\"workers_impacts.csv\"):\n", + " header = [\n", + " \"hw_id\",\"lc_step\",\"ADPe\",\"ADPf\",\"AP\",\"CTUe\",\"CTUh_c\",\"CTUh_nc\",\n", + " \"Epf\",\"Epm\",\"Ept\",\"GWP\",\"GWPf\",\"GWPlu\",\"IR\",\"LU\",\"ODP\",\"PM\",\n", + " \"POCP\",\"WU\",\"TPE\",\"GWPb\"\n", + " ]\n", + " \n", + " with open(filename, mode=\"w\", newline=\"\") as file:\n", + " writer = csv.writer(file)\n", + " writer.writerow(header)\n", + " \n", + " for i in range(n):\n", + " row = [\n", + " f\"worker-{i}\", # hw_id\n", + " \"manufacturing\", # lc_step\n", + " *[random.uniform(0, 100) for _ in range(len(header) - 2)]\n", + " ]\n", + " writer.writerow(row)\n", + " \n", + " print(f\"CSV file '{filename}' created with {n} hardware entries.\")\n", + "\n", + "# Example usage\n", + "generate_workers_csv(2000)\n", + "generate_workers_impact_csv(2000)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/experiments/performance/uv.lock b/experiments/performance/uv.lock new file mode 100644 index 0000000..0f580db --- /dev/null +++ b/experiments/performance/uv.lock @@ -0,0 +1,394 @@ +version = 1 +revision = 2 +requires-python = ">=3.13" + +[[package]] +name = "certifi" +version = "2025.8.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/dc/67/960ebe6bf230a96cda2e0abcf73af550ec4f090005363542f0765df162e0/certifi-2025.8.3.tar.gz", hash = "sha256:e564105f78ded564e3ae7c923924435e1daa7463faeab5bb932bc53ffae63407", size = 162386, upload-time = "2025-08-03T03:07:47.08Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/48/1549795ba7742c948d2ad169c1c8cdbae65bc450d6cd753d124b17c8cd32/certifi-2025.8.3-py3-none-any.whl", hash = "sha256:f6c12493cfb1b06ba2ff328595af9350c65d6644968e5d3a2ffd78699af217a5", size = 161216, upload-time = "2025-08-03T03:07:45.777Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e4/33/89c2ced2b67d1c2a61c19c6751aa8902d46ce3dacb23600a283619f5a12d/charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63", size = 126367, upload-time = "2025-05-02T08:34:42.01Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ea/12/a93df3366ed32db1d907d7593a94f1fe6293903e3e92967bebd6950ed12c/charset_normalizer-3.4.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0", size = 199622, upload-time = "2025-05-02T08:32:56.363Z" }, + { url = "https://files.pythonhosted.org/packages/04/93/bf204e6f344c39d9937d3c13c8cd5bbfc266472e51fc8c07cb7f64fcd2de/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf", size = 143435, upload-time = "2025-05-02T08:32:58.551Z" }, + { url = "https://files.pythonhosted.org/packages/22/2a/ea8a2095b0bafa6c5b5a55ffdc2f924455233ee7b91c69b7edfcc9e02284/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e", size = 153653, upload-time = "2025-05-02T08:33:00.342Z" }, + { url = "https://files.pythonhosted.org/packages/b6/57/1b090ff183d13cef485dfbe272e2fe57622a76694061353c59da52c9a659/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1", size = 146231, upload-time = "2025-05-02T08:33:02.081Z" }, + { url = "https://files.pythonhosted.org/packages/e2/28/ffc026b26f441fc67bd21ab7f03b313ab3fe46714a14b516f931abe1a2d8/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c", size = 148243, upload-time = "2025-05-02T08:33:04.063Z" }, + { url = "https://files.pythonhosted.org/packages/c0/0f/9abe9bd191629c33e69e47c6ef45ef99773320e9ad8e9cb08b8ab4a8d4cb/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691", size = 150442, upload-time = "2025-05-02T08:33:06.418Z" }, + { url = "https://files.pythonhosted.org/packages/67/7c/a123bbcedca91d5916c056407f89a7f5e8fdfce12ba825d7d6b9954a1a3c/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0", size = 145147, upload-time = "2025-05-02T08:33:08.183Z" }, + { url = "https://files.pythonhosted.org/packages/ec/fe/1ac556fa4899d967b83e9893788e86b6af4d83e4726511eaaad035e36595/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b", size = 153057, upload-time = "2025-05-02T08:33:09.986Z" }, + { url = "https://files.pythonhosted.org/packages/2b/ff/acfc0b0a70b19e3e54febdd5301a98b72fa07635e56f24f60502e954c461/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff", size = 156454, upload-time = "2025-05-02T08:33:11.814Z" }, + { url = "https://files.pythonhosted.org/packages/92/08/95b458ce9c740d0645feb0e96cea1f5ec946ea9c580a94adfe0b617f3573/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b", size = 154174, upload-time = "2025-05-02T08:33:13.707Z" }, + { url = "https://files.pythonhosted.org/packages/78/be/8392efc43487ac051eee6c36d5fbd63032d78f7728cb37aebcc98191f1ff/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148", size = 149166, upload-time = "2025-05-02T08:33:15.458Z" }, + { url = "https://files.pythonhosted.org/packages/44/96/392abd49b094d30b91d9fbda6a69519e95802250b777841cf3bda8fe136c/charset_normalizer-3.4.2-cp313-cp313-win32.whl", hash = "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7", size = 98064, upload-time = "2025-05-02T08:33:17.06Z" }, + { url = "https://files.pythonhosted.org/packages/e9/b0/0200da600134e001d91851ddc797809e2fe0ea72de90e09bec5a2fbdaccb/charset_normalizer-3.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980", size = 105641, upload-time = "2025-05-02T08:33:18.753Z" }, + { url = "https://files.pythonhosted.org/packages/20/94/c5790835a017658cbfabd07f3bfb549140c3ac458cfc196323996b10095a/charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", size = 52626, upload-time = "2025-05-02T08:34:40.053Z" }, +] + +[[package]] +name = "contourpy" +version = "1.3.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/58/01/1253e6698a07380cd31a736d248a3f2a50a7c88779a1813da27503cadc2a/contourpy-1.3.3.tar.gz", hash = "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880", size = 13466174, upload-time = "2025-07-26T12:03:12.549Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/68/35/0167aad910bbdb9599272bd96d01a9ec6852f36b9455cf2ca67bd4cc2d23/contourpy-1.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:177fb367556747a686509d6fef71d221a4b198a3905fe824430e5ea0fda54eb5", size = 293257, upload-time = "2025-07-26T12:01:39.367Z" }, + { url = "https://files.pythonhosted.org/packages/96/e4/7adcd9c8362745b2210728f209bfbcf7d91ba868a2c5f40d8b58f54c509b/contourpy-1.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d002b6f00d73d69333dac9d0b8d5e84d9724ff9ef044fd63c5986e62b7c9e1b1", size = 274034, upload-time = "2025-07-26T12:01:40.645Z" }, + { url = "https://files.pythonhosted.org/packages/73/23/90e31ceeed1de63058a02cb04b12f2de4b40e3bef5e082a7c18d9c8ae281/contourpy-1.3.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:348ac1f5d4f1d66d3322420f01d42e43122f43616e0f194fc1c9f5d830c5b286", size = 334672, upload-time = "2025-07-26T12:01:41.942Z" }, + { url = "https://files.pythonhosted.org/packages/ed/93/b43d8acbe67392e659e1d984700e79eb67e2acb2bd7f62012b583a7f1b55/contourpy-1.3.3-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:655456777ff65c2c548b7c454af9c6f33f16c8884f11083244b5819cc214f1b5", size = 381234, upload-time = "2025-07-26T12:01:43.499Z" }, + { url = "https://files.pythonhosted.org/packages/46/3b/bec82a3ea06f66711520f75a40c8fc0b113b2a75edb36aa633eb11c4f50f/contourpy-1.3.3-cp313-cp313-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:644a6853d15b2512d67881586bd03f462c7ab755db95f16f14d7e238f2852c67", size = 385169, upload-time = "2025-07-26T12:01:45.219Z" }, + { url = "https://files.pythonhosted.org/packages/4b/32/e0f13a1c5b0f8572d0ec6ae2f6c677b7991fafd95da523159c19eff0696a/contourpy-1.3.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4debd64f124ca62069f313a9cb86656ff087786016d76927ae2cf37846b006c9", size = 362859, upload-time = "2025-07-26T12:01:46.519Z" }, + { url = "https://files.pythonhosted.org/packages/33/71/e2a7945b7de4e58af42d708a219f3b2f4cff7386e6b6ab0a0fa0033c49a9/contourpy-1.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a15459b0f4615b00bbd1e91f1b9e19b7e63aea7483d03d804186f278c0af2659", size = 1332062, upload-time = "2025-07-26T12:01:48.964Z" }, + { url = "https://files.pythonhosted.org/packages/12/fc/4e87ac754220ccc0e807284f88e943d6d43b43843614f0a8afa469801db0/contourpy-1.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ca0fdcd73925568ca027e0b17ab07aad764be4706d0a925b89227e447d9737b7", size = 1403932, upload-time = "2025-07-26T12:01:51.979Z" }, + { url = "https://files.pythonhosted.org/packages/a6/2e/adc197a37443f934594112222ac1aa7dc9a98faf9c3842884df9a9d8751d/contourpy-1.3.3-cp313-cp313-win32.whl", hash = "sha256:b20c7c9a3bf701366556e1b1984ed2d0cedf999903c51311417cf5f591d8c78d", size = 185024, upload-time = "2025-07-26T12:01:53.245Z" }, + { url = "https://files.pythonhosted.org/packages/18/0b/0098c214843213759692cc638fce7de5c289200a830e5035d1791d7a2338/contourpy-1.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:1cadd8b8969f060ba45ed7c1b714fe69185812ab43bd6b86a9123fe8f99c3263", size = 226578, upload-time = "2025-07-26T12:01:54.422Z" }, + { url = "https://files.pythonhosted.org/packages/8a/9a/2f6024a0c5995243cd63afdeb3651c984f0d2bc727fd98066d40e141ad73/contourpy-1.3.3-cp313-cp313-win_arm64.whl", hash = "sha256:fd914713266421b7536de2bfa8181aa8c699432b6763a0ea64195ebe28bff6a9", size = 193524, upload-time = "2025-07-26T12:01:55.73Z" }, + { url = "https://files.pythonhosted.org/packages/c0/b3/f8a1a86bd3298513f500e5b1f5fd92b69896449f6cab6a146a5d52715479/contourpy-1.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:88df9880d507169449d434c293467418b9f6cbe82edd19284aa0409e7fdb933d", size = 306730, upload-time = "2025-07-26T12:01:57.051Z" }, + { url = "https://files.pythonhosted.org/packages/3f/11/4780db94ae62fc0c2053909b65dc3246bd7cecfc4f8a20d957ad43aa4ad8/contourpy-1.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d06bb1f751ba5d417047db62bca3c8fde202b8c11fb50742ab3ab962c81e8216", size = 287897, upload-time = "2025-07-26T12:01:58.663Z" }, + { url = "https://files.pythonhosted.org/packages/ae/15/e59f5f3ffdd6f3d4daa3e47114c53daabcb18574a26c21f03dc9e4e42ff0/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e4e6b05a45525357e382909a4c1600444e2a45b4795163d3b22669285591c1ae", size = 326751, upload-time = "2025-07-26T12:02:00.343Z" }, + { url = "https://files.pythonhosted.org/packages/0f/81/03b45cfad088e4770b1dcf72ea78d3802d04200009fb364d18a493857210/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ab3074b48c4e2cf1a960e6bbeb7f04566bf36b1861d5c9d4d8ac04b82e38ba20", size = 375486, upload-time = "2025-07-26T12:02:02.128Z" }, + { url = "https://files.pythonhosted.org/packages/0c/ba/49923366492ffbdd4486e970d421b289a670ae8cf539c1ea9a09822b371a/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c3d53c796f8647d6deb1abe867daeb66dcc8a97e8455efa729516b997b8ed99", size = 388106, upload-time = "2025-07-26T12:02:03.615Z" }, + { url = "https://files.pythonhosted.org/packages/9f/52/5b00ea89525f8f143651f9f03a0df371d3cbd2fccd21ca9b768c7a6500c2/contourpy-1.3.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50ed930df7289ff2a8d7afeb9603f8289e5704755c7e5c3bbd929c90c817164b", size = 352548, upload-time = "2025-07-26T12:02:05.165Z" }, + { url = "https://files.pythonhosted.org/packages/32/1d/a209ec1a3a3452d490f6b14dd92e72280c99ae3d1e73da74f8277d4ee08f/contourpy-1.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4feffb6537d64b84877da813a5c30f1422ea5739566abf0bd18065ac040e120a", size = 1322297, upload-time = "2025-07-26T12:02:07.379Z" }, + { url = "https://files.pythonhosted.org/packages/bc/9e/46f0e8ebdd884ca0e8877e46a3f4e633f6c9c8c4f3f6e72be3fe075994aa/contourpy-1.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2b7e9480ffe2b0cd2e787e4df64270e3a0440d9db8dc823312e2c940c167df7e", size = 1391023, upload-time = "2025-07-26T12:02:10.171Z" }, + { url = "https://files.pythonhosted.org/packages/b9/70/f308384a3ae9cd2209e0849f33c913f658d3326900d0ff5d378d6a1422d2/contourpy-1.3.3-cp313-cp313t-win32.whl", hash = "sha256:283edd842a01e3dcd435b1c5116798d661378d83d36d337b8dde1d16a5fc9ba3", size = 196157, upload-time = "2025-07-26T12:02:11.488Z" }, + { url = "https://files.pythonhosted.org/packages/b2/dd/880f890a6663b84d9e34a6f88cded89d78f0091e0045a284427cb6b18521/contourpy-1.3.3-cp313-cp313t-win_amd64.whl", hash = "sha256:87acf5963fc2b34825e5b6b048f40e3635dd547f590b04d2ab317c2619ef7ae8", size = 240570, upload-time = "2025-07-26T12:02:12.754Z" }, + { url = "https://files.pythonhosted.org/packages/80/99/2adc7d8ffead633234817ef8e9a87115c8a11927a94478f6bb3d3f4d4f7d/contourpy-1.3.3-cp313-cp313t-win_arm64.whl", hash = "sha256:3c30273eb2a55024ff31ba7d052dde990d7d8e5450f4bbb6e913558b3d6c2301", size = 199713, upload-time = "2025-07-26T12:02:14.4Z" }, + { url = "https://files.pythonhosted.org/packages/72/8b/4546f3ab60f78c514ffb7d01a0bd743f90de36f0019d1be84d0a708a580a/contourpy-1.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fde6c716d51c04b1c25d0b90364d0be954624a0ee9d60e23e850e8d48353d07a", size = 292189, upload-time = "2025-07-26T12:02:16.095Z" }, + { url = "https://files.pythonhosted.org/packages/fd/e1/3542a9cb596cadd76fcef413f19c79216e002623158befe6daa03dbfa88c/contourpy-1.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:cbedb772ed74ff5be440fa8eee9bd49f64f6e3fc09436d9c7d8f1c287b121d77", size = 273251, upload-time = "2025-07-26T12:02:17.524Z" }, + { url = "https://files.pythonhosted.org/packages/b1/71/f93e1e9471d189f79d0ce2497007731c1e6bf9ef6d1d61b911430c3db4e5/contourpy-1.3.3-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:22e9b1bd7a9b1d652cd77388465dc358dafcd2e217d35552424aa4f996f524f5", size = 335810, upload-time = "2025-07-26T12:02:18.9Z" }, + { url = "https://files.pythonhosted.org/packages/91/f9/e35f4c1c93f9275d4e38681a80506b5510e9327350c51f8d4a5a724d178c/contourpy-1.3.3-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a22738912262aa3e254e4f3cb079a95a67132fc5a063890e224393596902f5a4", size = 382871, upload-time = "2025-07-26T12:02:20.418Z" }, + { url = "https://files.pythonhosted.org/packages/b5/71/47b512f936f66a0a900d81c396a7e60d73419868fba959c61efed7a8ab46/contourpy-1.3.3-cp314-cp314-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:afe5a512f31ee6bd7d0dda52ec9864c984ca3d66664444f2d72e0dc4eb832e36", size = 386264, upload-time = "2025-07-26T12:02:21.916Z" }, + { url = "https://files.pythonhosted.org/packages/04/5f/9ff93450ba96b09c7c2b3f81c94de31c89f92292f1380261bd7195bea4ea/contourpy-1.3.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f64836de09927cba6f79dcd00fdd7d5329f3fccc633468507079c829ca4db4e3", size = 363819, upload-time = "2025-07-26T12:02:23.759Z" }, + { url = "https://files.pythonhosted.org/packages/3e/a6/0b185d4cc480ee494945cde102cb0149ae830b5fa17bf855b95f2e70ad13/contourpy-1.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1fd43c3be4c8e5fd6e4f2baeae35ae18176cf2e5cced681cca908addf1cdd53b", size = 1333650, upload-time = "2025-07-26T12:02:26.181Z" }, + { url = "https://files.pythonhosted.org/packages/43/d7/afdc95580ca56f30fbcd3060250f66cedbde69b4547028863abd8aa3b47e/contourpy-1.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6afc576f7b33cf00996e5c1102dc2a8f7cc89e39c0b55df93a0b78c1bd992b36", size = 1404833, upload-time = "2025-07-26T12:02:28.782Z" }, + { url = "https://files.pythonhosted.org/packages/e2/e2/366af18a6d386f41132a48f033cbd2102e9b0cf6345d35ff0826cd984566/contourpy-1.3.3-cp314-cp314-win32.whl", hash = "sha256:66c8a43a4f7b8df8b71ee1840e4211a3c8d93b214b213f590e18a1beca458f7d", size = 189692, upload-time = "2025-07-26T12:02:30.128Z" }, + { url = "https://files.pythonhosted.org/packages/7d/c2/57f54b03d0f22d4044b8afb9ca0e184f8b1afd57b4f735c2fa70883dc601/contourpy-1.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:cf9022ef053f2694e31d630feaacb21ea24224be1c3ad0520b13d844274614fd", size = 232424, upload-time = "2025-07-26T12:02:31.395Z" }, + { url = "https://files.pythonhosted.org/packages/18/79/a9416650df9b525737ab521aa181ccc42d56016d2123ddcb7b58e926a42c/contourpy-1.3.3-cp314-cp314-win_arm64.whl", hash = "sha256:95b181891b4c71de4bb404c6621e7e2390745f887f2a026b2d99e92c17892339", size = 198300, upload-time = "2025-07-26T12:02:32.956Z" }, + { url = "https://files.pythonhosted.org/packages/1f/42/38c159a7d0f2b7b9c04c64ab317042bb6952b713ba875c1681529a2932fe/contourpy-1.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:33c82d0138c0a062380332c861387650c82e4cf1747aaa6938b9b6516762e772", size = 306769, upload-time = "2025-07-26T12:02:34.2Z" }, + { url = "https://files.pythonhosted.org/packages/c3/6c/26a8205f24bca10974e77460de68d3d7c63e282e23782f1239f226fcae6f/contourpy-1.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ea37e7b45949df430fe649e5de8351c423430046a2af20b1c1961cae3afcda77", size = 287892, upload-time = "2025-07-26T12:02:35.807Z" }, + { url = "https://files.pythonhosted.org/packages/66/06/8a475c8ab718ebfd7925661747dbb3c3ee9c82ac834ccb3570be49d129f4/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d304906ecc71672e9c89e87c4675dc5c2645e1f4269a5063b99b0bb29f232d13", size = 326748, upload-time = "2025-07-26T12:02:37.193Z" }, + { url = "https://files.pythonhosted.org/packages/b4/a3/c5ca9f010a44c223f098fccd8b158bb1cb287378a31ac141f04730dc49be/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ca658cd1a680a5c9ea96dc61cdbae1e85c8f25849843aa799dfd3cb370ad4fbe", size = 375554, upload-time = "2025-07-26T12:02:38.894Z" }, + { url = "https://files.pythonhosted.org/packages/80/5b/68bd33ae63fac658a4145088c1e894405e07584a316738710b636c6d0333/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ab2fd90904c503739a75b7c8c5c01160130ba67944a7b77bbf36ef8054576e7f", size = 388118, upload-time = "2025-07-26T12:02:40.642Z" }, + { url = "https://files.pythonhosted.org/packages/40/52/4c285a6435940ae25d7410a6c36bda5145839bc3f0beb20c707cda18b9d2/contourpy-1.3.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7301b89040075c30e5768810bc96a8e8d78085b47d8be6e4c3f5a0b4ed478a0", size = 352555, upload-time = "2025-07-26T12:02:42.25Z" }, + { url = "https://files.pythonhosted.org/packages/24/ee/3e81e1dd174f5c7fefe50e85d0892de05ca4e26ef1c9a59c2a57e43b865a/contourpy-1.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2a2a8b627d5cc6b7c41a4beff6c5ad5eb848c88255fda4a8745f7e901b32d8e4", size = 1322295, upload-time = "2025-07-26T12:02:44.668Z" }, + { url = "https://files.pythonhosted.org/packages/3c/b2/6d913d4d04e14379de429057cd169e5e00f6c2af3bb13e1710bcbdb5da12/contourpy-1.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:fd6ec6be509c787f1caf6b247f0b1ca598bef13f4ddeaa126b7658215529ba0f", size = 1391027, upload-time = "2025-07-26T12:02:47.09Z" }, + { url = "https://files.pythonhosted.org/packages/93/8a/68a4ec5c55a2971213d29a9374913f7e9f18581945a7a31d1a39b5d2dfe5/contourpy-1.3.3-cp314-cp314t-win32.whl", hash = "sha256:e74a9a0f5e3fff48fb5a7f2fd2b9b70a3fe014a67522f79b7cca4c0c7e43c9ae", size = 202428, upload-time = "2025-07-26T12:02:48.691Z" }, + { url = "https://files.pythonhosted.org/packages/fa/96/fd9f641ffedc4fa3ace923af73b9d07e869496c9cc7a459103e6e978992f/contourpy-1.3.3-cp314-cp314t-win_amd64.whl", hash = "sha256:13b68d6a62db8eafaebb8039218921399baf6e47bf85006fd8529f2a08ef33fc", size = 250331, upload-time = "2025-07-26T12:02:50.137Z" }, + { url = "https://files.pythonhosted.org/packages/ae/8c/469afb6465b853afff216f9528ffda78a915ff880ed58813ba4faf4ba0b6/contourpy-1.3.3-cp314-cp314t-win_arm64.whl", hash = "sha256:b7448cb5a725bb1e35ce88771b86fba35ef418952474492cf7c764059933ff8b", size = 203831, upload-time = "2025-07-26T12:02:51.449Z" }, +] + +[[package]] +name = "cycler" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a9/95/a3dbbb5028f35eafb79008e7522a75244477d2838f38cbb722248dabc2a8/cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c", size = 7615, upload-time = "2023-10-07T05:32:18.335Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321, upload-time = "2023-10-07T05:32:16.783Z" }, +] + +[[package]] +name = "fonttools" +version = "4.59.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8a/27/ec3c723bfdf86f34c5c82bf6305df3e0f0d8ea798d2d3a7cb0c0a866d286/fonttools-4.59.0.tar.gz", hash = "sha256:be392ec3529e2f57faa28709d60723a763904f71a2b63aabe14fee6648fe3b14", size = 3532521, upload-time = "2025-07-16T12:04:54.613Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f3/bb/390990e7c457d377b00890d9f96a3ca13ae2517efafb6609c1756e213ba4/fonttools-4.59.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:78813b49d749e1bb4db1c57f2d4d7e6db22c253cb0a86ad819f5dc197710d4b2", size = 2758704, upload-time = "2025-07-16T12:04:22.217Z" }, + { url = "https://files.pythonhosted.org/packages/df/6f/d730d9fcc9b410a11597092bd2eb9ca53e5438c6cb90e4b3047ce1b723e9/fonttools-4.59.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:401b1941ce37e78b8fd119b419b617277c65ae9417742a63282257434fd68ea2", size = 2330764, upload-time = "2025-07-16T12:04:23.985Z" }, + { url = "https://files.pythonhosted.org/packages/75/b4/b96bb66f6f8cc4669de44a158099b249c8159231d254ab6b092909388be5/fonttools-4.59.0-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:efd7e6660674e234e29937bc1481dceb7e0336bfae75b856b4fb272b5093c5d4", size = 4890699, upload-time = "2025-07-16T12:04:25.664Z" }, + { url = "https://files.pythonhosted.org/packages/b5/57/7969af50b26408be12baa317c6147588db5b38af2759e6df94554dbc5fdb/fonttools-4.59.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:51ab1ff33c19e336c02dee1e9fd1abd974a4ca3d8f7eef2a104d0816a241ce97", size = 4952934, upload-time = "2025-07-16T12:04:27.733Z" }, + { url = "https://files.pythonhosted.org/packages/d6/e2/dd968053b6cf1f46c904f5bd409b22341477c017d8201619a265e50762d3/fonttools-4.59.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a9bf8adc9e1f3012edc8f09b08336272aec0c55bc677422273e21280db748f7c", size = 4892319, upload-time = "2025-07-16T12:04:30.074Z" }, + { url = "https://files.pythonhosted.org/packages/6b/95/a59810d8eda09129f83467a4e58f84205dc6994ebaeb9815406363e07250/fonttools-4.59.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:37e01c6ec0c98599778c2e688350d624fa4770fbd6144551bd5e032f1199171c", size = 5034753, upload-time = "2025-07-16T12:04:32.292Z" }, + { url = "https://files.pythonhosted.org/packages/a5/84/51a69ee89ff8d1fea0c6997e946657e25a3f08513de8435fe124929f3eef/fonttools-4.59.0-cp313-cp313-win32.whl", hash = "sha256:70d6b3ceaa9cc5a6ac52884f3b3d9544e8e231e95b23f138bdb78e6d4dc0eae3", size = 2199688, upload-time = "2025-07-16T12:04:34.444Z" }, + { url = "https://files.pythonhosted.org/packages/a0/ee/f626cd372932d828508137a79b85167fdcf3adab2e3bed433f295c596c6a/fonttools-4.59.0-cp313-cp313-win_amd64.whl", hash = "sha256:26731739daa23b872643f0e4072d5939960237d540c35c14e6a06d47d71ca8fe", size = 2248560, upload-time = "2025-07-16T12:04:36.034Z" }, + { url = "https://files.pythonhosted.org/packages/d0/9c/df0ef2c51845a13043e5088f7bb988ca6cd5bb82d5d4203d6a158aa58cf2/fonttools-4.59.0-py3-none-any.whl", hash = "sha256:241313683afd3baacb32a6bd124d0bce7404bc5280e12e291bae1b9bba28711d", size = 1128050, upload-time = "2025-07-16T12:04:52.687Z" }, +] + +[[package]] +name = "idna" +version = "3.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490, upload-time = "2024-09-15T18:07:39.745Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload-time = "2024-09-15T18:07:37.964Z" }, +] + +[[package]] +name = "kiwisolver" +version = "1.4.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/82/59/7c91426a8ac292e1cdd53a63b6d9439abd573c875c3f92c146767dd33faf/kiwisolver-1.4.8.tar.gz", hash = "sha256:23d5f023bdc8c7e54eb65f03ca5d5bb25b601eac4d7f1a042888a1f45237987e", size = 97538, upload-time = "2024-12-24T18:30:51.519Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/79/b3/e62464a652f4f8cd9006e13d07abad844a47df1e6537f73ddfbf1bc997ec/kiwisolver-1.4.8-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1c8ceb754339793c24aee1c9fb2485b5b1f5bb1c2c214ff13368431e51fc9a09", size = 124156, upload-time = "2024-12-24T18:29:45.368Z" }, + { url = "https://files.pythonhosted.org/packages/8d/2d/f13d06998b546a2ad4f48607a146e045bbe48030774de29f90bdc573df15/kiwisolver-1.4.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:54a62808ac74b5e55a04a408cda6156f986cefbcf0ada13572696b507cc92fa1", size = 66555, upload-time = "2024-12-24T18:29:46.37Z" }, + { url = "https://files.pythonhosted.org/packages/59/e3/b8bd14b0a54998a9fd1e8da591c60998dc003618cb19a3f94cb233ec1511/kiwisolver-1.4.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:68269e60ee4929893aad82666821aaacbd455284124817af45c11e50a4b42e3c", size = 65071, upload-time = "2024-12-24T18:29:47.333Z" }, + { url = "https://files.pythonhosted.org/packages/f0/1c/6c86f6d85ffe4d0ce04228d976f00674f1df5dc893bf2dd4f1928748f187/kiwisolver-1.4.8-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34d142fba9c464bc3bbfeff15c96eab0e7310343d6aefb62a79d51421fcc5f1b", size = 1378053, upload-time = "2024-12-24T18:29:49.636Z" }, + { url = "https://files.pythonhosted.org/packages/4e/b9/1c6e9f6dcb103ac5cf87cb695845f5fa71379021500153566d8a8a9fc291/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ddc373e0eef45b59197de815b1b28ef89ae3955e7722cc9710fb91cd77b7f47", size = 1472278, upload-time = "2024-12-24T18:29:51.164Z" }, + { url = "https://files.pythonhosted.org/packages/ee/81/aca1eb176de671f8bda479b11acdc42c132b61a2ac861c883907dde6debb/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:77e6f57a20b9bd4e1e2cedda4d0b986ebd0216236f0106e55c28aea3d3d69b16", size = 1478139, upload-time = "2024-12-24T18:29:52.594Z" }, + { url = "https://files.pythonhosted.org/packages/49/f4/e081522473671c97b2687d380e9e4c26f748a86363ce5af48b4a28e48d06/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08e77738ed7538f036cd1170cbed942ef749137b1311fa2bbe2a7fda2f6bf3cc", size = 1413517, upload-time = "2024-12-24T18:29:53.941Z" }, + { url = "https://files.pythonhosted.org/packages/8f/e9/6a7d025d8da8c4931522922cd706105aa32b3291d1add8c5427cdcd66e63/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5ce1e481a74b44dd5e92ff03ea0cb371ae7a0268318e202be06c8f04f4f1246", size = 1474952, upload-time = "2024-12-24T18:29:56.523Z" }, + { url = "https://files.pythonhosted.org/packages/82/13/13fa685ae167bee5d94b415991c4fc7bb0a1b6ebea6e753a87044b209678/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fc2ace710ba7c1dfd1a3b42530b62b9ceed115f19a1656adefce7b1782a37794", size = 2269132, upload-time = "2024-12-24T18:29:57.989Z" }, + { url = "https://files.pythonhosted.org/packages/ef/92/bb7c9395489b99a6cb41d502d3686bac692586db2045adc19e45ee64ed23/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:3452046c37c7692bd52b0e752b87954ef86ee2224e624ef7ce6cb21e8c41cc1b", size = 2425997, upload-time = "2024-12-24T18:29:59.393Z" }, + { url = "https://files.pythonhosted.org/packages/ed/12/87f0e9271e2b63d35d0d8524954145837dd1a6c15b62a2d8c1ebe0f182b4/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7e9a60b50fe8b2ec6f448fe8d81b07e40141bfced7f896309df271a0b92f80f3", size = 2376060, upload-time = "2024-12-24T18:30:01.338Z" }, + { url = "https://files.pythonhosted.org/packages/02/6e/c8af39288edbce8bf0fa35dee427b082758a4b71e9c91ef18fa667782138/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:918139571133f366e8362fa4a297aeba86c7816b7ecf0bc79168080e2bd79957", size = 2520471, upload-time = "2024-12-24T18:30:04.574Z" }, + { url = "https://files.pythonhosted.org/packages/13/78/df381bc7b26e535c91469f77f16adcd073beb3e2dd25042efd064af82323/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e063ef9f89885a1d68dd8b2e18f5ead48653176d10a0e324e3b0030e3a69adeb", size = 2338793, upload-time = "2024-12-24T18:30:06.25Z" }, + { url = "https://files.pythonhosted.org/packages/d0/dc/c1abe38c37c071d0fc71c9a474fd0b9ede05d42f5a458d584619cfd2371a/kiwisolver-1.4.8-cp313-cp313-win_amd64.whl", hash = "sha256:a17b7c4f5b2c51bb68ed379defd608a03954a1845dfed7cc0117f1cc8a9b7fd2", size = 71855, upload-time = "2024-12-24T18:30:07.535Z" }, + { url = "https://files.pythonhosted.org/packages/a0/b6/21529d595b126ac298fdd90b705d87d4c5693de60023e0efcb4f387ed99e/kiwisolver-1.4.8-cp313-cp313-win_arm64.whl", hash = "sha256:3cd3bc628b25f74aedc6d374d5babf0166a92ff1317f46267f12d2ed54bc1d30", size = 65430, upload-time = "2024-12-24T18:30:08.504Z" }, + { url = "https://files.pythonhosted.org/packages/34/bd/b89380b7298e3af9b39f49334e3e2a4af0e04819789f04b43d560516c0c8/kiwisolver-1.4.8-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:370fd2df41660ed4e26b8c9d6bbcad668fbe2560462cba151a721d49e5b6628c", size = 126294, upload-time = "2024-12-24T18:30:09.508Z" }, + { url = "https://files.pythonhosted.org/packages/83/41/5857dc72e5e4148eaac5aa76e0703e594e4465f8ab7ec0fc60e3a9bb8fea/kiwisolver-1.4.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:84a2f830d42707de1d191b9490ac186bf7997a9495d4e9072210a1296345f7dc", size = 67736, upload-time = "2024-12-24T18:30:11.039Z" }, + { url = "https://files.pythonhosted.org/packages/e1/d1/be059b8db56ac270489fb0b3297fd1e53d195ba76e9bbb30e5401fa6b759/kiwisolver-1.4.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7a3ad337add5148cf51ce0b55642dc551c0b9d6248458a757f98796ca7348712", size = 66194, upload-time = "2024-12-24T18:30:14.886Z" }, + { url = "https://files.pythonhosted.org/packages/e1/83/4b73975f149819eb7dcf9299ed467eba068ecb16439a98990dcb12e63fdd/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7506488470f41169b86d8c9aeff587293f530a23a23a49d6bc64dab66bedc71e", size = 1465942, upload-time = "2024-12-24T18:30:18.927Z" }, + { url = "https://files.pythonhosted.org/packages/c7/2c/30a5cdde5102958e602c07466bce058b9d7cb48734aa7a4327261ac8e002/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f0121b07b356a22fb0414cec4666bbe36fd6d0d759db3d37228f496ed67c880", size = 1595341, upload-time = "2024-12-24T18:30:22.102Z" }, + { url = "https://files.pythonhosted.org/packages/ff/9b/1e71db1c000385aa069704f5990574b8244cce854ecd83119c19e83c9586/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d6d6bd87df62c27d4185de7c511c6248040afae67028a8a22012b010bc7ad062", size = 1598455, upload-time = "2024-12-24T18:30:24.947Z" }, + { url = "https://files.pythonhosted.org/packages/85/92/c8fec52ddf06231b31cbb779af77e99b8253cd96bd135250b9498144c78b/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:291331973c64bb9cce50bbe871fb2e675c4331dab4f31abe89f175ad7679a4d7", size = 1522138, upload-time = "2024-12-24T18:30:26.286Z" }, + { url = "https://files.pythonhosted.org/packages/0b/51/9eb7e2cd07a15d8bdd976f6190c0164f92ce1904e5c0c79198c4972926b7/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:893f5525bb92d3d735878ec00f781b2de998333659507d29ea4466208df37bed", size = 1582857, upload-time = "2024-12-24T18:30:28.86Z" }, + { url = "https://files.pythonhosted.org/packages/0f/95/c5a00387a5405e68ba32cc64af65ce881a39b98d73cc394b24143bebc5b8/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b47a465040146981dc9db8647981b8cb96366fbc8d452b031e4f8fdffec3f26d", size = 2293129, upload-time = "2024-12-24T18:30:30.34Z" }, + { url = "https://files.pythonhosted.org/packages/44/83/eeb7af7d706b8347548313fa3a3a15931f404533cc54fe01f39e830dd231/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:99cea8b9dd34ff80c521aef46a1dddb0dcc0283cf18bde6d756f1e6f31772165", size = 2421538, upload-time = "2024-12-24T18:30:33.334Z" }, + { url = "https://files.pythonhosted.org/packages/05/f9/27e94c1b3eb29e6933b6986ffc5fa1177d2cd1f0c8efc5f02c91c9ac61de/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:151dffc4865e5fe6dafce5480fab84f950d14566c480c08a53c663a0020504b6", size = 2390661, upload-time = "2024-12-24T18:30:34.939Z" }, + { url = "https://files.pythonhosted.org/packages/d9/d4/3c9735faa36ac591a4afcc2980d2691000506050b7a7e80bcfe44048daa7/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:577facaa411c10421314598b50413aa1ebcf5126f704f1e5d72d7e4e9f020d90", size = 2546710, upload-time = "2024-12-24T18:30:37.281Z" }, + { url = "https://files.pythonhosted.org/packages/4c/fa/be89a49c640930180657482a74970cdcf6f7072c8d2471e1babe17a222dc/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:be4816dc51c8a471749d664161b434912eee82f2ea66bd7628bd14583a833e85", size = 2349213, upload-time = "2024-12-24T18:30:40.019Z" }, +] + +[[package]] +name = "matplotlib" +version = "3.10.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "contourpy" }, + { name = "cycler" }, + { name = "fonttools" }, + { name = "kiwisolver" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pillow" }, + { name = "pyparsing" }, + { name = "python-dateutil" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/43/91/f2939bb60b7ebf12478b030e0d7f340247390f402b3b189616aad790c366/matplotlib-3.10.5.tar.gz", hash = "sha256:352ed6ccfb7998a00881692f38b4ca083c691d3e275b4145423704c34c909076", size = 34804044, upload-time = "2025-07-31T18:09:33.805Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8d/05/4f3c1f396075f108515e45cb8d334aff011a922350e502a7472e24c52d77/matplotlib-3.10.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:354204db3f7d5caaa10e5de74549ef6a05a4550fdd1c8f831ab9bca81efd39ed", size = 8253586, upload-time = "2025-07-31T18:08:23.107Z" }, + { url = "https://files.pythonhosted.org/packages/2f/2c/e084415775aac7016c3719fe7006cdb462582c6c99ac142f27303c56e243/matplotlib-3.10.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b072aac0c3ad563a2b3318124756cb6112157017f7431626600ecbe890df57a1", size = 8110715, upload-time = "2025-07-31T18:08:24.675Z" }, + { url = "https://files.pythonhosted.org/packages/52/1b/233e3094b749df16e3e6cd5a44849fd33852e692ad009cf7de00cf58ddf6/matplotlib-3.10.5-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d52fd5b684d541b5a51fb276b2b97b010c75bee9aa392f96b4a07aeb491e33c7", size = 8669397, upload-time = "2025-07-31T18:08:26.778Z" }, + { url = "https://files.pythonhosted.org/packages/e8/ec/03f9e003a798f907d9f772eed9b7c6a9775d5bd00648b643ebfb88e25414/matplotlib-3.10.5-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee7a09ae2f4676276f5a65bd9f2bd91b4f9fbaedf49f40267ce3f9b448de501f", size = 9508646, upload-time = "2025-07-31T18:08:28.848Z" }, + { url = "https://files.pythonhosted.org/packages/91/e7/c051a7a386680c28487bca27d23b02d84f63e3d2a9b4d2fc478e6a42e37e/matplotlib-3.10.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ba6c3c9c067b83481d647af88b4e441d532acdb5ef22178a14935b0b881188f4", size = 9567424, upload-time = "2025-07-31T18:08:30.726Z" }, + { url = "https://files.pythonhosted.org/packages/36/c2/24302e93ff431b8f4173ee1dd88976c8d80483cadbc5d3d777cef47b3a1c/matplotlib-3.10.5-cp313-cp313-win_amd64.whl", hash = "sha256:07442d2692c9bd1cceaa4afb4bbe5b57b98a7599de4dabfcca92d3eea70f9ebe", size = 8107809, upload-time = "2025-07-31T18:08:33.928Z" }, + { url = "https://files.pythonhosted.org/packages/0b/33/423ec6a668d375dad825197557ed8fbdb74d62b432c1ed8235465945475f/matplotlib-3.10.5-cp313-cp313-win_arm64.whl", hash = "sha256:48fe6d47380b68a37ccfcc94f009530e84d41f71f5dae7eda7c4a5a84aa0a674", size = 7978078, upload-time = "2025-07-31T18:08:36.764Z" }, + { url = "https://files.pythonhosted.org/packages/51/17/521fc16ec766455c7bb52cc046550cf7652f6765ca8650ff120aa2d197b6/matplotlib-3.10.5-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b80eb8621331449fc519541a7461987f10afa4f9cfd91afcd2276ebe19bd56c", size = 8295590, upload-time = "2025-07-31T18:08:38.521Z" }, + { url = "https://files.pythonhosted.org/packages/f8/12/23c28b2c21114c63999bae129fce7fd34515641c517ae48ce7b7dcd33458/matplotlib-3.10.5-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:47a388908e469d6ca2a6015858fa924e0e8a2345a37125948d8e93a91c47933e", size = 8158518, upload-time = "2025-07-31T18:08:40.195Z" }, + { url = "https://files.pythonhosted.org/packages/81/f8/aae4eb25e8e7190759f3cb91cbeaa344128159ac92bb6b409e24f8711f78/matplotlib-3.10.5-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8b6b49167d208358983ce26e43aa4196073b4702858670f2eb111f9a10652b4b", size = 8691815, upload-time = "2025-07-31T18:08:42.238Z" }, + { url = "https://files.pythonhosted.org/packages/d0/ba/450c39ebdd486bd33a359fc17365ade46c6a96bf637bbb0df7824de2886c/matplotlib-3.10.5-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a8da0453a7fd8e3da114234ba70c5ba9ef0e98f190309ddfde0f089accd46ea", size = 9522814, upload-time = "2025-07-31T18:08:44.914Z" }, + { url = "https://files.pythonhosted.org/packages/89/11/9c66f6a990e27bb9aa023f7988d2d5809cb98aa39c09cbf20fba75a542ef/matplotlib-3.10.5-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:52c6573dfcb7726a9907b482cd5b92e6b5499b284ffacb04ffbfe06b3e568124", size = 9573917, upload-time = "2025-07-31T18:08:47.038Z" }, + { url = "https://files.pythonhosted.org/packages/b3/69/8b49394de92569419e5e05e82e83df9b749a0ff550d07631ea96ed2eb35a/matplotlib-3.10.5-cp313-cp313t-win_amd64.whl", hash = "sha256:a23193db2e9d64ece69cac0c8231849db7dd77ce59c7b89948cf9d0ce655a3ce", size = 8181034, upload-time = "2025-07-31T18:08:48.943Z" }, + { url = "https://files.pythonhosted.org/packages/47/23/82dc435bb98a2fc5c20dffcac8f0b083935ac28286413ed8835df40d0baa/matplotlib-3.10.5-cp313-cp313t-win_arm64.whl", hash = "sha256:56da3b102cf6da2776fef3e71cd96fcf22103a13594a18ac9a9b31314e0be154", size = 8023337, upload-time = "2025-07-31T18:08:50.791Z" }, + { url = "https://files.pythonhosted.org/packages/ac/e0/26b6cfde31f5383503ee45dcb7e691d45dadf0b3f54639332b59316a97f8/matplotlib-3.10.5-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:96ef8f5a3696f20f55597ffa91c28e2e73088df25c555f8d4754931515512715", size = 8253591, upload-time = "2025-07-31T18:08:53.254Z" }, + { url = "https://files.pythonhosted.org/packages/c1/89/98488c7ef7ea20ea659af7499628c240a608b337af4be2066d644cfd0a0f/matplotlib-3.10.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:77fab633e94b9da60512d4fa0213daeb76d5a7b05156840c4fd0399b4b818837", size = 8112566, upload-time = "2025-07-31T18:08:55.116Z" }, + { url = "https://files.pythonhosted.org/packages/52/67/42294dfedc82aea55e1a767daf3263aacfb5a125f44ba189e685bab41b6f/matplotlib-3.10.5-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:27f52634315e96b1debbfdc5c416592edcd9c4221bc2f520fd39c33db5d9f202", size = 9513281, upload-time = "2025-07-31T18:08:56.885Z" }, + { url = "https://files.pythonhosted.org/packages/e7/68/f258239e0cf34c2cbc816781c7ab6fca768452e6bf1119aedd2bd4a882a3/matplotlib-3.10.5-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:525f6e28c485c769d1f07935b660c864de41c37fd716bfa64158ea646f7084bb", size = 9780873, upload-time = "2025-07-31T18:08:59.241Z" }, + { url = "https://files.pythonhosted.org/packages/89/64/f4881554006bd12e4558bd66778bdd15d47b00a1f6c6e8b50f6208eda4b3/matplotlib-3.10.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:1f5f3ec4c191253c5f2b7c07096a142c6a1c024d9f738247bfc8e3f9643fc975", size = 9568954, upload-time = "2025-07-31T18:09:01.244Z" }, + { url = "https://files.pythonhosted.org/packages/06/f8/42779d39c3f757e1f012f2dda3319a89fb602bd2ef98ce8faf0281f4febd/matplotlib-3.10.5-cp314-cp314-win_amd64.whl", hash = "sha256:707f9c292c4cd4716f19ab8a1f93f26598222cd931e0cd98fbbb1c5994bf7667", size = 8237465, upload-time = "2025-07-31T18:09:03.206Z" }, + { url = "https://files.pythonhosted.org/packages/cf/f8/153fd06b5160f0cd27c8b9dd797fcc9fb56ac6a0ebf3c1f765b6b68d3c8a/matplotlib-3.10.5-cp314-cp314-win_arm64.whl", hash = "sha256:21a95b9bf408178d372814de7baacd61c712a62cae560b5e6f35d791776f6516", size = 8108898, upload-time = "2025-07-31T18:09:05.231Z" }, + { url = "https://files.pythonhosted.org/packages/9a/ee/c4b082a382a225fe0d2a73f1f57cf6f6f132308805b493a54c8641006238/matplotlib-3.10.5-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:a6b310f95e1102a8c7c817ef17b60ee5d1851b8c71b63d9286b66b177963039e", size = 8295636, upload-time = "2025-07-31T18:09:07.306Z" }, + { url = "https://files.pythonhosted.org/packages/30/73/2195fa2099718b21a20da82dfc753bf2af58d596b51aefe93e359dd5915a/matplotlib-3.10.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:94986a242747a0605cb3ff1cb98691c736f28a59f8ffe5175acaeb7397c49a5a", size = 8158575, upload-time = "2025-07-31T18:09:09.083Z" }, + { url = "https://files.pythonhosted.org/packages/f6/e9/a08cdb34618a91fa08f75e6738541da5cacde7c307cea18ff10f0d03fcff/matplotlib-3.10.5-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ff10ea43288f0c8bab608a305dc6c918cc729d429c31dcbbecde3b9f4d5b569", size = 9522815, upload-time = "2025-07-31T18:09:11.191Z" }, + { url = "https://files.pythonhosted.org/packages/4e/bb/34d8b7e0d1bb6d06ef45db01dfa560d5a67b1c40c0b998ce9ccde934bb09/matplotlib-3.10.5-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f6adb644c9d040ffb0d3434e440490a66cf73dbfa118a6f79cd7568431f7a012", size = 9783514, upload-time = "2025-07-31T18:09:13.307Z" }, + { url = "https://files.pythonhosted.org/packages/12/09/d330d1e55dcca2e11b4d304cc5227f52e2512e46828d6249b88e0694176e/matplotlib-3.10.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:4fa40a8f98428f789a9dcacd625f59b7bc4e3ef6c8c7c80187a7a709475cf592", size = 9573932, upload-time = "2025-07-31T18:09:15.335Z" }, + { url = "https://files.pythonhosted.org/packages/eb/3b/f70258ac729aa004aca673800a53a2b0a26d49ca1df2eaa03289a1c40f81/matplotlib-3.10.5-cp314-cp314t-win_amd64.whl", hash = "sha256:95672a5d628b44207aab91ec20bf59c26da99de12b88f7e0b1fb0a84a86ff959", size = 8322003, upload-time = "2025-07-31T18:09:17.416Z" }, + { url = "https://files.pythonhosted.org/packages/5b/60/3601f8ce6d76a7c81c7f25a0e15fde0d6b66226dd187aa6d2838e6374161/matplotlib-3.10.5-cp314-cp314t-win_arm64.whl", hash = "sha256:2efaf97d72629e74252e0b5e3c46813e9eeaa94e011ecf8084a971a31a97f40b", size = 8153849, upload-time = "2025-07-31T18:09:19.673Z" }, +] + +[[package]] +name = "numpy" +version = "2.3.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/37/7d/3fec4199c5ffb892bed55cff901e4f39a58c81df9c44c280499e92cad264/numpy-2.3.2.tar.gz", hash = "sha256:e0486a11ec30cdecb53f184d496d1c6a20786c81e55e41640270130056f8ee48", size = 20489306, upload-time = "2025-07-24T21:32:07.553Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1c/c0/c6bb172c916b00700ed3bf71cb56175fd1f7dbecebf8353545d0b5519f6c/numpy-2.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c8d9727f5316a256425892b043736d63e89ed15bbfe6556c5ff4d9d4448ff3b3", size = 20949074, upload-time = "2025-07-24T20:43:07.813Z" }, + { url = "https://files.pythonhosted.org/packages/20/4e/c116466d22acaf4573e58421c956c6076dc526e24a6be0903219775d862e/numpy-2.3.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:efc81393f25f14d11c9d161e46e6ee348637c0a1e8a54bf9dedc472a3fae993b", size = 14177311, upload-time = "2025-07-24T20:43:29.335Z" }, + { url = "https://files.pythonhosted.org/packages/78/45/d4698c182895af189c463fc91d70805d455a227261d950e4e0f1310c2550/numpy-2.3.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:dd937f088a2df683cbb79dda9a772b62a3e5a8a7e76690612c2737f38c6ef1b6", size = 5106022, upload-time = "2025-07-24T20:43:37.999Z" }, + { url = "https://files.pythonhosted.org/packages/9f/76/3e6880fef4420179309dba72a8c11f6166c431cf6dee54c577af8906f914/numpy-2.3.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:11e58218c0c46c80509186e460d79fbdc9ca1eb8d8aee39d8f2dc768eb781089", size = 6640135, upload-time = "2025-07-24T20:43:49.28Z" }, + { url = "https://files.pythonhosted.org/packages/34/fa/87ff7f25b3c4ce9085a62554460b7db686fef1e0207e8977795c7b7d7ba1/numpy-2.3.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5ad4ebcb683a1f99f4f392cc522ee20a18b2bb12a2c1c42c3d48d5a1adc9d3d2", size = 14278147, upload-time = "2025-07-24T20:44:10.328Z" }, + { url = "https://files.pythonhosted.org/packages/1d/0f/571b2c7a3833ae419fe69ff7b479a78d313581785203cc70a8db90121b9a/numpy-2.3.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:938065908d1d869c7d75d8ec45f735a034771c6ea07088867f713d1cd3bbbe4f", size = 16635989, upload-time = "2025-07-24T20:44:34.88Z" }, + { url = "https://files.pythonhosted.org/packages/24/5a/84ae8dca9c9a4c592fe11340b36a86ffa9fd3e40513198daf8a97839345c/numpy-2.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:66459dccc65d8ec98cc7df61307b64bf9e08101f9598755d42d8ae65d9a7a6ee", size = 16053052, upload-time = "2025-07-24T20:44:58.872Z" }, + { url = "https://files.pythonhosted.org/packages/57/7c/e5725d99a9133b9813fcf148d3f858df98511686e853169dbaf63aec6097/numpy-2.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a7af9ed2aa9ec5950daf05bb11abc4076a108bd3c7db9aa7251d5f107079b6a6", size = 18577955, upload-time = "2025-07-24T20:45:26.714Z" }, + { url = "https://files.pythonhosted.org/packages/ae/11/7c546fcf42145f29b71e4d6f429e96d8d68e5a7ba1830b2e68d7418f0bbd/numpy-2.3.2-cp313-cp313-win32.whl", hash = "sha256:906a30249315f9c8e17b085cc5f87d3f369b35fedd0051d4a84686967bdbbd0b", size = 6311843, upload-time = "2025-07-24T20:49:24.444Z" }, + { url = "https://files.pythonhosted.org/packages/aa/6f/a428fd1cb7ed39b4280d057720fed5121b0d7754fd2a9768640160f5517b/numpy-2.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:c63d95dc9d67b676e9108fe0d2182987ccb0f11933c1e8959f42fa0da8d4fa56", size = 12782876, upload-time = "2025-07-24T20:49:43.227Z" }, + { url = "https://files.pythonhosted.org/packages/65/85/4ea455c9040a12595fb6c43f2c217257c7b52dd0ba332c6a6c1d28b289fe/numpy-2.3.2-cp313-cp313-win_arm64.whl", hash = "sha256:b05a89f2fb84d21235f93de47129dd4f11c16f64c87c33f5e284e6a3a54e43f2", size = 10192786, upload-time = "2025-07-24T20:49:59.443Z" }, + { url = "https://files.pythonhosted.org/packages/80/23/8278f40282d10c3f258ec3ff1b103d4994bcad78b0cba9208317f6bb73da/numpy-2.3.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4e6ecfeddfa83b02318f4d84acf15fbdbf9ded18e46989a15a8b6995dfbf85ab", size = 21047395, upload-time = "2025-07-24T20:45:58.821Z" }, + { url = "https://files.pythonhosted.org/packages/1f/2d/624f2ce4a5df52628b4ccd16a4f9437b37c35f4f8a50d00e962aae6efd7a/numpy-2.3.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:508b0eada3eded10a3b55725b40806a4b855961040180028f52580c4729916a2", size = 14300374, upload-time = "2025-07-24T20:46:20.207Z" }, + { url = "https://files.pythonhosted.org/packages/f6/62/ff1e512cdbb829b80a6bd08318a58698867bca0ca2499d101b4af063ee97/numpy-2.3.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:754d6755d9a7588bdc6ac47dc4ee97867271b17cee39cb87aef079574366db0a", size = 5228864, upload-time = "2025-07-24T20:46:30.58Z" }, + { url = "https://files.pythonhosted.org/packages/7d/8e/74bc18078fff03192d4032cfa99d5a5ca937807136d6f5790ce07ca53515/numpy-2.3.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:a9f66e7d2b2d7712410d3bc5684149040ef5f19856f20277cd17ea83e5006286", size = 6737533, upload-time = "2025-07-24T20:46:46.111Z" }, + { url = "https://files.pythonhosted.org/packages/19/ea/0731efe2c9073ccca5698ef6a8c3667c4cf4eea53fcdcd0b50140aba03bc/numpy-2.3.2-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:de6ea4e5a65d5a90c7d286ddff2b87f3f4ad61faa3db8dabe936b34c2275b6f8", size = 14352007, upload-time = "2025-07-24T20:47:07.1Z" }, + { url = "https://files.pythonhosted.org/packages/cf/90/36be0865f16dfed20f4bc7f75235b963d5939707d4b591f086777412ff7b/numpy-2.3.2-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a3ef07ec8cbc8fc9e369c8dcd52019510c12da4de81367d8b20bc692aa07573a", size = 16701914, upload-time = "2025-07-24T20:47:32.459Z" }, + { url = "https://files.pythonhosted.org/packages/94/30/06cd055e24cb6c38e5989a9e747042b4e723535758e6153f11afea88c01b/numpy-2.3.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:27c9f90e7481275c7800dc9c24b7cc40ace3fdb970ae4d21eaff983a32f70c91", size = 16132708, upload-time = "2025-07-24T20:47:58.129Z" }, + { url = "https://files.pythonhosted.org/packages/9a/14/ecede608ea73e58267fd7cb78f42341b3b37ba576e778a1a06baffbe585c/numpy-2.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:07b62978075b67eee4065b166d000d457c82a1efe726cce608b9db9dd66a73a5", size = 18651678, upload-time = "2025-07-24T20:48:25.402Z" }, + { url = "https://files.pythonhosted.org/packages/40/f3/2fe6066b8d07c3685509bc24d56386534c008b462a488b7f503ba82b8923/numpy-2.3.2-cp313-cp313t-win32.whl", hash = "sha256:c771cfac34a4f2c0de8e8c97312d07d64fd8f8ed45bc9f5726a7e947270152b5", size = 6441832, upload-time = "2025-07-24T20:48:37.181Z" }, + { url = "https://files.pythonhosted.org/packages/0b/ba/0937d66d05204d8f28630c9c60bc3eda68824abde4cf756c4d6aad03b0c6/numpy-2.3.2-cp313-cp313t-win_amd64.whl", hash = "sha256:72dbebb2dcc8305c431b2836bcc66af967df91be793d63a24e3d9b741374c450", size = 12927049, upload-time = "2025-07-24T20:48:56.24Z" }, + { url = "https://files.pythonhosted.org/packages/e9/ed/13542dd59c104d5e654dfa2ac282c199ba64846a74c2c4bcdbc3a0f75df1/numpy-2.3.2-cp313-cp313t-win_arm64.whl", hash = "sha256:72c6df2267e926a6d5286b0a6d556ebe49eae261062059317837fda12ddf0c1a", size = 10262935, upload-time = "2025-07-24T20:49:13.136Z" }, + { url = "https://files.pythonhosted.org/packages/c9/7c/7659048aaf498f7611b783e000c7268fcc4dcf0ce21cd10aad7b2e8f9591/numpy-2.3.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:448a66d052d0cf14ce9865d159bfc403282c9bc7bb2a31b03cc18b651eca8b1a", size = 20950906, upload-time = "2025-07-24T20:50:30.346Z" }, + { url = "https://files.pythonhosted.org/packages/80/db/984bea9d4ddf7112a04cfdfb22b1050af5757864cfffe8e09e44b7f11a10/numpy-2.3.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:546aaf78e81b4081b2eba1d105c3b34064783027a06b3ab20b6eba21fb64132b", size = 14185607, upload-time = "2025-07-24T20:50:51.923Z" }, + { url = "https://files.pythonhosted.org/packages/e4/76/b3d6f414f4eca568f469ac112a3b510938d892bc5a6c190cb883af080b77/numpy-2.3.2-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:87c930d52f45df092f7578889711a0768094debf73cfcde105e2d66954358125", size = 5114110, upload-time = "2025-07-24T20:51:01.041Z" }, + { url = "https://files.pythonhosted.org/packages/9e/d2/6f5e6826abd6bca52392ed88fe44a4b52aacb60567ac3bc86c67834c3a56/numpy-2.3.2-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:8dc082ea901a62edb8f59713c6a7e28a85daddcb67454c839de57656478f5b19", size = 6642050, upload-time = "2025-07-24T20:51:11.64Z" }, + { url = "https://files.pythonhosted.org/packages/c4/43/f12b2ade99199e39c73ad182f103f9d9791f48d885c600c8e05927865baf/numpy-2.3.2-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:af58de8745f7fa9ca1c0c7c943616c6fe28e75d0c81f5c295810e3c83b5be92f", size = 14296292, upload-time = "2025-07-24T20:51:33.488Z" }, + { url = "https://files.pythonhosted.org/packages/5d/f9/77c07d94bf110a916b17210fac38680ed8734c236bfed9982fd8524a7b47/numpy-2.3.2-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed5527c4cf10f16c6d0b6bee1f89958bccb0ad2522c8cadc2efd318bcd545f5", size = 16638913, upload-time = "2025-07-24T20:51:58.517Z" }, + { url = "https://files.pythonhosted.org/packages/9b/d1/9d9f2c8ea399cc05cfff8a7437453bd4e7d894373a93cdc46361bbb49a7d/numpy-2.3.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:095737ed986e00393ec18ec0b21b47c22889ae4b0cd2d5e88342e08b01141f58", size = 16071180, upload-time = "2025-07-24T20:52:22.827Z" }, + { url = "https://files.pythonhosted.org/packages/4c/41/82e2c68aff2a0c9bf315e47d61951099fed65d8cb2c8d9dc388cb87e947e/numpy-2.3.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b5e40e80299607f597e1a8a247ff8d71d79c5b52baa11cc1cce30aa92d2da6e0", size = 18576809, upload-time = "2025-07-24T20:52:51.015Z" }, + { url = "https://files.pythonhosted.org/packages/14/14/4b4fd3efb0837ed252d0f583c5c35a75121038a8c4e065f2c259be06d2d8/numpy-2.3.2-cp314-cp314-win32.whl", hash = "sha256:7d6e390423cc1f76e1b8108c9b6889d20a7a1f59d9a60cac4a050fa734d6c1e2", size = 6366410, upload-time = "2025-07-24T20:56:44.949Z" }, + { url = "https://files.pythonhosted.org/packages/11/9e/b4c24a6b8467b61aced5c8dc7dcfce23621baa2e17f661edb2444a418040/numpy-2.3.2-cp314-cp314-win_amd64.whl", hash = "sha256:b9d0878b21e3918d76d2209c924ebb272340da1fb51abc00f986c258cd5e957b", size = 12918821, upload-time = "2025-07-24T20:57:06.479Z" }, + { url = "https://files.pythonhosted.org/packages/0e/0f/0dc44007c70b1007c1cef86b06986a3812dd7106d8f946c09cfa75782556/numpy-2.3.2-cp314-cp314-win_arm64.whl", hash = "sha256:2738534837c6a1d0c39340a190177d7d66fdf432894f469728da901f8f6dc910", size = 10477303, upload-time = "2025-07-24T20:57:22.879Z" }, + { url = "https://files.pythonhosted.org/packages/8b/3e/075752b79140b78ddfc9c0a1634d234cfdbc6f9bbbfa6b7504e445ad7d19/numpy-2.3.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:4d002ecf7c9b53240be3bb69d80f86ddbd34078bae04d87be81c1f58466f264e", size = 21047524, upload-time = "2025-07-24T20:53:22.086Z" }, + { url = "https://files.pythonhosted.org/packages/fe/6d/60e8247564a72426570d0e0ea1151b95ce5bd2f1597bb878a18d32aec855/numpy-2.3.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:293b2192c6bcce487dbc6326de5853787f870aeb6c43f8f9c6496db5b1781e45", size = 14300519, upload-time = "2025-07-24T20:53:44.053Z" }, + { url = "https://files.pythonhosted.org/packages/4d/73/d8326c442cd428d47a067070c3ac6cc3b651a6e53613a1668342a12d4479/numpy-2.3.2-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:0a4f2021a6da53a0d580d6ef5db29947025ae8b35b3250141805ea9a32bbe86b", size = 5228972, upload-time = "2025-07-24T20:53:53.81Z" }, + { url = "https://files.pythonhosted.org/packages/34/2e/e71b2d6dad075271e7079db776196829019b90ce3ece5c69639e4f6fdc44/numpy-2.3.2-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:9c144440db4bf3bb6372d2c3e49834cc0ff7bb4c24975ab33e01199e645416f2", size = 6737439, upload-time = "2025-07-24T20:54:04.742Z" }, + { url = "https://files.pythonhosted.org/packages/15/b0/d004bcd56c2c5e0500ffc65385eb6d569ffd3363cb5e593ae742749b2daa/numpy-2.3.2-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f92d6c2a8535dc4fe4419562294ff957f83a16ebdec66df0805e473ffaad8bd0", size = 14352479, upload-time = "2025-07-24T20:54:25.819Z" }, + { url = "https://files.pythonhosted.org/packages/11/e3/285142fcff8721e0c99b51686426165059874c150ea9ab898e12a492e291/numpy-2.3.2-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cefc2219baa48e468e3db7e706305fcd0c095534a192a08f31e98d83a7d45fb0", size = 16702805, upload-time = "2025-07-24T20:54:50.814Z" }, + { url = "https://files.pythonhosted.org/packages/33/c3/33b56b0e47e604af2c7cd065edca892d180f5899599b76830652875249a3/numpy-2.3.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:76c3e9501ceb50b2ff3824c3589d5d1ab4ac857b0ee3f8f49629d0de55ecf7c2", size = 16133830, upload-time = "2025-07-24T20:55:17.306Z" }, + { url = "https://files.pythonhosted.org/packages/6e/ae/7b1476a1f4d6a48bc669b8deb09939c56dd2a439db1ab03017844374fb67/numpy-2.3.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:122bf5ed9a0221b3419672493878ba4967121514b1d7d4656a7580cd11dddcbf", size = 18652665, upload-time = "2025-07-24T20:55:46.665Z" }, + { url = "https://files.pythonhosted.org/packages/14/ba/5b5c9978c4bb161034148ade2de9db44ec316fab89ce8c400db0e0c81f86/numpy-2.3.2-cp314-cp314t-win32.whl", hash = "sha256:6f1ae3dcb840edccc45af496f312528c15b1f79ac318169d094e85e4bb35fdf1", size = 6514777, upload-time = "2025-07-24T20:55:57.66Z" }, + { url = "https://files.pythonhosted.org/packages/eb/46/3dbaf0ae7c17cdc46b9f662c56da2054887b8d9e737c1476f335c83d33db/numpy-2.3.2-cp314-cp314t-win_amd64.whl", hash = "sha256:087ffc25890d89a43536f75c5fe8770922008758e8eeeef61733957041ed2f9b", size = 13111856, upload-time = "2025-07-24T20:56:17.318Z" }, + { url = "https://files.pythonhosted.org/packages/c1/9e/1652778bce745a67b5fe05adde60ed362d38eb17d919a540e813d30f6874/numpy-2.3.2-cp314-cp314t-win_arm64.whl", hash = "sha256:092aeb3449833ea9c0bf0089d70c29ae480685dd2377ec9cdbbb620257f84631", size = 10544226, upload-time = "2025-07-24T20:56:34.509Z" }, +] + +[[package]] +name = "packaging" +version = "25.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, +] + +[[package]] +name = "perfanalysis" +version = "0.1.0" +source = { virtual = "." } +dependencies = [ + { name = "matplotlib" }, + { name = "numpy" }, + { name = "requests" }, +] + +[package.metadata] +requires-dist = [ + { name = "matplotlib", specifier = ">=3.10.5" }, + { name = "numpy", specifier = ">=2.3.2" }, + { name = "requests", specifier = ">=2.32.4" }, +] + +[[package]] +name = "pillow" +version = "11.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/0d/d0d6dea55cd152ce3d6767bb38a8fc10e33796ba4ba210cbab9354b6d238/pillow-11.3.0.tar.gz", hash = "sha256:3828ee7586cd0b2091b6209e5ad53e20d0649bbe87164a459d0676e035e8f523", size = 47113069, upload-time = "2025-07-01T09:16:30.666Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/93/0952f2ed8db3a5a4c7a11f91965d6184ebc8cd7cbb7941a260d5f018cd2d/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:1c627742b539bba4309df89171356fcb3cc5a9178355b2727d1b74a6cf155fbd", size = 2128328, upload-time = "2025-07-01T09:14:35.276Z" }, + { url = "https://files.pythonhosted.org/packages/4b/e8/100c3d114b1a0bf4042f27e0f87d2f25e857e838034e98ca98fe7b8c0a9c/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:30b7c02f3899d10f13d7a48163c8969e4e653f8b43416d23d13d1bbfdc93b9f8", size = 2170652, upload-time = "2025-07-01T09:14:37.203Z" }, + { url = "https://files.pythonhosted.org/packages/aa/86/3f758a28a6e381758545f7cdb4942e1cb79abd271bea932998fc0db93cb6/pillow-11.3.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:7859a4cc7c9295f5838015d8cc0a9c215b77e43d07a25e460f35cf516df8626f", size = 2227443, upload-time = "2025-07-01T09:14:39.344Z" }, + { url = "https://files.pythonhosted.org/packages/01/f4/91d5b3ffa718df2f53b0dc109877993e511f4fd055d7e9508682e8aba092/pillow-11.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ec1ee50470b0d050984394423d96325b744d55c701a439d2bd66089bff963d3c", size = 5278474, upload-time = "2025-07-01T09:14:41.843Z" }, + { url = "https://files.pythonhosted.org/packages/f9/0e/37d7d3eca6c879fbd9dba21268427dffda1ab00d4eb05b32923d4fbe3b12/pillow-11.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7db51d222548ccfd274e4572fdbf3e810a5e66b00608862f947b163e613b67dd", size = 4686038, upload-time = "2025-07-01T09:14:44.008Z" }, + { url = "https://files.pythonhosted.org/packages/ff/b0/3426e5c7f6565e752d81221af9d3676fdbb4f352317ceafd42899aaf5d8a/pillow-11.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2d6fcc902a24ac74495df63faad1884282239265c6839a0a6416d33faedfae7e", size = 5864407, upload-time = "2025-07-03T13:10:15.628Z" }, + { url = "https://files.pythonhosted.org/packages/fc/c1/c6c423134229f2a221ee53f838d4be9d82bab86f7e2f8e75e47b6bf6cd77/pillow-11.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f0f5d8f4a08090c6d6d578351a2b91acf519a54986c055af27e7a93feae6d3f1", size = 7639094, upload-time = "2025-07-03T13:10:21.857Z" }, + { url = "https://files.pythonhosted.org/packages/ba/c9/09e6746630fe6372c67c648ff9deae52a2bc20897d51fa293571977ceb5d/pillow-11.3.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c37d8ba9411d6003bba9e518db0db0c58a680ab9fe5179f040b0463644bc9805", size = 5973503, upload-time = "2025-07-01T09:14:45.698Z" }, + { url = "https://files.pythonhosted.org/packages/d5/1c/a2a29649c0b1983d3ef57ee87a66487fdeb45132df66ab30dd37f7dbe162/pillow-11.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13f87d581e71d9189ab21fe0efb5a23e9f28552d5be6979e84001d3b8505abe8", size = 6642574, upload-time = "2025-07-01T09:14:47.415Z" }, + { url = "https://files.pythonhosted.org/packages/36/de/d5cc31cc4b055b6c6fd990e3e7f0f8aaf36229a2698501bcb0cdf67c7146/pillow-11.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:023f6d2d11784a465f09fd09a34b150ea4672e85fb3d05931d89f373ab14abb2", size = 6084060, upload-time = "2025-07-01T09:14:49.636Z" }, + { url = "https://files.pythonhosted.org/packages/d5/ea/502d938cbaeec836ac28a9b730193716f0114c41325db428e6b280513f09/pillow-11.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:45dfc51ac5975b938e9809451c51734124e73b04d0f0ac621649821a63852e7b", size = 6721407, upload-time = "2025-07-01T09:14:51.962Z" }, + { url = "https://files.pythonhosted.org/packages/45/9c/9c5e2a73f125f6cbc59cc7087c8f2d649a7ae453f83bd0362ff7c9e2aee2/pillow-11.3.0-cp313-cp313-win32.whl", hash = "sha256:a4d336baed65d50d37b88ca5b60c0fa9d81e3a87d4a7930d3880d1624d5b31f3", size = 6273841, upload-time = "2025-07-01T09:14:54.142Z" }, + { url = "https://files.pythonhosted.org/packages/23/85/397c73524e0cd212067e0c969aa245b01d50183439550d24d9f55781b776/pillow-11.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0bce5c4fd0921f99d2e858dc4d4d64193407e1b99478bc5cacecba2311abde51", size = 6978450, upload-time = "2025-07-01T09:14:56.436Z" }, + { url = "https://files.pythonhosted.org/packages/17/d2/622f4547f69cd173955194b78e4d19ca4935a1b0f03a302d655c9f6aae65/pillow-11.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:1904e1264881f682f02b7f8167935cce37bc97db457f8e7849dc3a6a52b99580", size = 2423055, upload-time = "2025-07-01T09:14:58.072Z" }, + { url = "https://files.pythonhosted.org/packages/dd/80/a8a2ac21dda2e82480852978416cfacd439a4b490a501a288ecf4fe2532d/pillow-11.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4c834a3921375c48ee6b9624061076bc0a32a60b5532b322cc0ea64e639dd50e", size = 5281110, upload-time = "2025-07-01T09:14:59.79Z" }, + { url = "https://files.pythonhosted.org/packages/44/d6/b79754ca790f315918732e18f82a8146d33bcd7f4494380457ea89eb883d/pillow-11.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5e05688ccef30ea69b9317a9ead994b93975104a677a36a8ed8106be9260aa6d", size = 4689547, upload-time = "2025-07-01T09:15:01.648Z" }, + { url = "https://files.pythonhosted.org/packages/49/20/716b8717d331150cb00f7fdd78169c01e8e0c219732a78b0e59b6bdb2fd6/pillow-11.3.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1019b04af07fc0163e2810167918cb5add8d74674b6267616021ab558dc98ced", size = 5901554, upload-time = "2025-07-03T13:10:27.018Z" }, + { url = "https://files.pythonhosted.org/packages/74/cf/a9f3a2514a65bb071075063a96f0a5cf949c2f2fce683c15ccc83b1c1cab/pillow-11.3.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f944255db153ebb2b19c51fe85dd99ef0ce494123f21b9db4877ffdfc5590c7c", size = 7669132, upload-time = "2025-07-03T13:10:33.01Z" }, + { url = "https://files.pythonhosted.org/packages/98/3c/da78805cbdbee9cb43efe8261dd7cc0b4b93f2ac79b676c03159e9db2187/pillow-11.3.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1f85acb69adf2aaee8b7da124efebbdb959a104db34d3a2cb0f3793dbae422a8", size = 6005001, upload-time = "2025-07-01T09:15:03.365Z" }, + { url = "https://files.pythonhosted.org/packages/6c/fa/ce044b91faecf30e635321351bba32bab5a7e034c60187fe9698191aef4f/pillow-11.3.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:05f6ecbeff5005399bb48d198f098a9b4b6bdf27b8487c7f38ca16eeb070cd59", size = 6668814, upload-time = "2025-07-01T09:15:05.655Z" }, + { url = "https://files.pythonhosted.org/packages/7b/51/90f9291406d09bf93686434f9183aba27b831c10c87746ff49f127ee80cb/pillow-11.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a7bc6e6fd0395bc052f16b1a8670859964dbd7003bd0af2ff08342eb6e442cfe", size = 6113124, upload-time = "2025-07-01T09:15:07.358Z" }, + { url = "https://files.pythonhosted.org/packages/cd/5a/6fec59b1dfb619234f7636d4157d11fb4e196caeee220232a8d2ec48488d/pillow-11.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:83e1b0161c9d148125083a35c1c5a89db5b7054834fd4387499e06552035236c", size = 6747186, upload-time = "2025-07-01T09:15:09.317Z" }, + { url = "https://files.pythonhosted.org/packages/49/6b/00187a044f98255225f172de653941e61da37104a9ea60e4f6887717e2b5/pillow-11.3.0-cp313-cp313t-win32.whl", hash = "sha256:2a3117c06b8fb646639dce83694f2f9eac405472713fcb1ae887469c0d4f6788", size = 6277546, upload-time = "2025-07-01T09:15:11.311Z" }, + { url = "https://files.pythonhosted.org/packages/e8/5c/6caaba7e261c0d75bab23be79f1d06b5ad2a2ae49f028ccec801b0e853d6/pillow-11.3.0-cp313-cp313t-win_amd64.whl", hash = "sha256:857844335c95bea93fb39e0fa2726b4d9d758850b34075a7e3ff4f4fa3aa3b31", size = 6985102, upload-time = "2025-07-01T09:15:13.164Z" }, + { url = "https://files.pythonhosted.org/packages/f3/7e/b623008460c09a0cb38263c93b828c666493caee2eb34ff67f778b87e58c/pillow-11.3.0-cp313-cp313t-win_arm64.whl", hash = "sha256:8797edc41f3e8536ae4b10897ee2f637235c94f27404cac7297f7b607dd0716e", size = 2424803, upload-time = "2025-07-01T09:15:15.695Z" }, + { url = "https://files.pythonhosted.org/packages/73/f4/04905af42837292ed86cb1b1dabe03dce1edc008ef14c473c5c7e1443c5d/pillow-11.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d9da3df5f9ea2a89b81bb6087177fb1f4d1c7146d583a3fe5c672c0d94e55e12", size = 5278520, upload-time = "2025-07-01T09:15:17.429Z" }, + { url = "https://files.pythonhosted.org/packages/41/b0/33d79e377a336247df6348a54e6d2a2b85d644ca202555e3faa0cf811ecc/pillow-11.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0b275ff9b04df7b640c59ec5a3cb113eefd3795a8df80bac69646ef699c6981a", size = 4686116, upload-time = "2025-07-01T09:15:19.423Z" }, + { url = "https://files.pythonhosted.org/packages/49/2d/ed8bc0ab219ae8768f529597d9509d184fe8a6c4741a6864fea334d25f3f/pillow-11.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0743841cabd3dba6a83f38a92672cccbd69af56e3e91777b0ee7f4dba4385632", size = 5864597, upload-time = "2025-07-03T13:10:38.404Z" }, + { url = "https://files.pythonhosted.org/packages/b5/3d/b932bb4225c80b58dfadaca9d42d08d0b7064d2d1791b6a237f87f661834/pillow-11.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2465a69cf967b8b49ee1b96d76718cd98c4e925414ead59fdf75cf0fd07df673", size = 7638246, upload-time = "2025-07-03T13:10:44.987Z" }, + { url = "https://files.pythonhosted.org/packages/09/b5/0487044b7c096f1b48f0d7ad416472c02e0e4bf6919541b111efd3cae690/pillow-11.3.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41742638139424703b4d01665b807c6468e23e699e8e90cffefe291c5832b027", size = 5973336, upload-time = "2025-07-01T09:15:21.237Z" }, + { url = "https://files.pythonhosted.org/packages/a8/2d/524f9318f6cbfcc79fbc004801ea6b607ec3f843977652fdee4857a7568b/pillow-11.3.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:93efb0b4de7e340d99057415c749175e24c8864302369e05914682ba642e5d77", size = 6642699, upload-time = "2025-07-01T09:15:23.186Z" }, + { url = "https://files.pythonhosted.org/packages/6f/d2/a9a4f280c6aefedce1e8f615baaa5474e0701d86dd6f1dede66726462bbd/pillow-11.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7966e38dcd0fa11ca390aed7c6f20454443581d758242023cf36fcb319b1a874", size = 6083789, upload-time = "2025-07-01T09:15:25.1Z" }, + { url = "https://files.pythonhosted.org/packages/fe/54/86b0cd9dbb683a9d5e960b66c7379e821a19be4ac5810e2e5a715c09a0c0/pillow-11.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:98a9afa7b9007c67ed84c57c9e0ad86a6000da96eaa638e4f8abe5b65ff83f0a", size = 6720386, upload-time = "2025-07-01T09:15:27.378Z" }, + { url = "https://files.pythonhosted.org/packages/e7/95/88efcaf384c3588e24259c4203b909cbe3e3c2d887af9e938c2022c9dd48/pillow-11.3.0-cp314-cp314-win32.whl", hash = "sha256:02a723e6bf909e7cea0dac1b0e0310be9d7650cd66222a5f1c571455c0a45214", size = 6370911, upload-time = "2025-07-01T09:15:29.294Z" }, + { url = "https://files.pythonhosted.org/packages/2e/cc/934e5820850ec5eb107e7b1a72dd278140731c669f396110ebc326f2a503/pillow-11.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:a418486160228f64dd9e9efcd132679b7a02a5f22c982c78b6fc7dab3fefb635", size = 7117383, upload-time = "2025-07-01T09:15:31.128Z" }, + { url = "https://files.pythonhosted.org/packages/d6/e9/9c0a616a71da2a5d163aa37405e8aced9a906d574b4a214bede134e731bc/pillow-11.3.0-cp314-cp314-win_arm64.whl", hash = "sha256:155658efb5e044669c08896c0c44231c5e9abcaadbc5cd3648df2f7c0b96b9a6", size = 2511385, upload-time = "2025-07-01T09:15:33.328Z" }, + { url = "https://files.pythonhosted.org/packages/1a/33/c88376898aff369658b225262cd4f2659b13e8178e7534df9e6e1fa289f6/pillow-11.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:59a03cdf019efbfeeed910bf79c7c93255c3d54bc45898ac2a4140071b02b4ae", size = 5281129, upload-time = "2025-07-01T09:15:35.194Z" }, + { url = "https://files.pythonhosted.org/packages/1f/70/d376247fb36f1844b42910911c83a02d5544ebd2a8bad9efcc0f707ea774/pillow-11.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f8a5827f84d973d8636e9dc5764af4f0cf2318d26744b3d902931701b0d46653", size = 4689580, upload-time = "2025-07-01T09:15:37.114Z" }, + { url = "https://files.pythonhosted.org/packages/eb/1c/537e930496149fbac69efd2fc4329035bbe2e5475b4165439e3be9cb183b/pillow-11.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ee92f2fd10f4adc4b43d07ec5e779932b4eb3dbfbc34790ada5a6669bc095aa6", size = 5902860, upload-time = "2025-07-03T13:10:50.248Z" }, + { url = "https://files.pythonhosted.org/packages/bd/57/80f53264954dcefeebcf9dae6e3eb1daea1b488f0be8b8fef12f79a3eb10/pillow-11.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c96d333dcf42d01f47b37e0979b6bd73ec91eae18614864622d9b87bbd5bbf36", size = 7670694, upload-time = "2025-07-03T13:10:56.432Z" }, + { url = "https://files.pythonhosted.org/packages/70/ff/4727d3b71a8578b4587d9c276e90efad2d6fe0335fd76742a6da08132e8c/pillow-11.3.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c96f993ab8c98460cd0c001447bff6194403e8b1d7e149ade5f00594918128b", size = 6005888, upload-time = "2025-07-01T09:15:39.436Z" }, + { url = "https://files.pythonhosted.org/packages/05/ae/716592277934f85d3be51d7256f3636672d7b1abfafdc42cf3f8cbd4b4c8/pillow-11.3.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41342b64afeba938edb034d122b2dda5db2139b9a4af999729ba8818e0056477", size = 6670330, upload-time = "2025-07-01T09:15:41.269Z" }, + { url = "https://files.pythonhosted.org/packages/e7/bb/7fe6cddcc8827b01b1a9766f5fdeb7418680744f9082035bdbabecf1d57f/pillow-11.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:068d9c39a2d1b358eb9f245ce7ab1b5c3246c7c8c7d9ba58cfa5b43146c06e50", size = 6114089, upload-time = "2025-07-01T09:15:43.13Z" }, + { url = "https://files.pythonhosted.org/packages/8b/f5/06bfaa444c8e80f1a8e4bff98da9c83b37b5be3b1deaa43d27a0db37ef84/pillow-11.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a1bc6ba083b145187f648b667e05a2534ecc4b9f2784c2cbe3089e44868f2b9b", size = 6748206, upload-time = "2025-07-01T09:15:44.937Z" }, + { url = "https://files.pythonhosted.org/packages/f0/77/bc6f92a3e8e6e46c0ca78abfffec0037845800ea38c73483760362804c41/pillow-11.3.0-cp314-cp314t-win32.whl", hash = "sha256:118ca10c0d60b06d006be10a501fd6bbdfef559251ed31b794668ed569c87e12", size = 6377370, upload-time = "2025-07-01T09:15:46.673Z" }, + { url = "https://files.pythonhosted.org/packages/4a/82/3a721f7d69dca802befb8af08b7c79ebcab461007ce1c18bd91a5d5896f9/pillow-11.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:8924748b688aa210d79883357d102cd64690e56b923a186f35a82cbc10f997db", size = 7121500, upload-time = "2025-07-01T09:15:48.512Z" }, + { url = "https://files.pythonhosted.org/packages/89/c7/5572fa4a3f45740eaab6ae86fcdf7195b55beac1371ac8c619d880cfe948/pillow-11.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:79ea0d14d3ebad43ec77ad5272e6ff9bba5b679ef73375ea760261207fa8e0aa", size = 2512835, upload-time = "2025-07-01T09:15:50.399Z" }, +] + +[[package]] +name = "pyparsing" +version = "3.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bb/22/f1129e69d94ffff626bdb5c835506b3a5b4f3d070f17ea295e12c2c6f60f/pyparsing-3.2.3.tar.gz", hash = "sha256:b9c13f1ab8b3b542f72e28f634bad4de758ab3ce4546e4301970ad6fa77c38be", size = 1088608, upload-time = "2025-03-25T05:01:28.114Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-py3-none-any.whl", hash = "sha256:a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf", size = 111120, upload-time = "2025-03-25T05:01:24.908Z" }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, +] + +[[package]] +name = "requests" +version = "2.32.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e1/0a/929373653770d8a0d7ea76c37de6e41f11eb07559b103b1c02cafb3f7cf8/requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422", size = 135258, upload-time = "2025-06-09T16:43:07.34Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7c/e4/56027c4a6b4ae70ca9de302488c5ca95ad4a39e190093d6c1a8ace08341b/requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c", size = 64847, upload-time = "2025-06-09T16:43:05.728Z" }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, +] + +[[package]] +name = "urllib3" +version = "2.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185, upload-time = "2025-06-18T14:07:41.644Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload-time = "2025-06-18T14:07:40.39Z" }, +] diff --git a/flake.lock b/flake.lock index 6428eea..62216e7 100644 --- a/flake.lock +++ b/flake.lock @@ -5,15 +5,16 @@ "nixpkgs": "nixpkgs" }, "locked": { - "lastModified": 1748014499, - "narHash": "sha256-1IxbHf7b/5j0UGFyDt38+zST8sLiJlsg45Q1kwX6lGA=", + "lastModified": 1753304108, + "narHash": "sha256-7qc7+PGkvRjjQKscqyNruSmIEwkXh6D707CE8IUwEI8=", "owner": "kleis-technology", "repo": "homebrew-lcaac", - "rev": "a1a34c96726a117d985a54616c93b21d0b65ab8e", + "rev": "657de71cd893d131a41d96e79ce00615ba20ae71", "type": "github" }, "original": { "owner": "kleis-technology", + "ref": "v1.7.13", "repo": "homebrew-lcaac", "type": "github" } diff --git a/flake.nix b/flake.nix index 9bbf10e..8d4aa2c 100644 --- a/flake.nix +++ b/flake.nix @@ -1,7 +1,7 @@ { description = "Cloud Assess flake"; inputs.lcaac-flake = { - url = "github:kleis-technology/homebrew-lcaac"; + url = "github:kleis-technology/homebrew-lcaac/v1.7.13"; }; outputs = inputs@{ nixpkgs, lcaac-flake, ...}: { @@ -15,6 +15,8 @@ packages = with pkgs; [ jdk23 gradle + python312 + python312Packages.uv lcaac-flake.packages.aarch64-darwin.lcaac-cli ]; }; diff --git a/openapi/api.yaml b/openapi/api.yaml index f747b30..8b85a60 100644 --- a/openapi/api.yaml +++ b/openapi/api.yaml @@ -145,11 +145,20 @@ components: type: object required: - period + - total_vcpu + - total_ram + - total_storage - request - impacts properties: period: $ref: '#/components/schemas/QuantityTimeDto' + total_vcpu: + $ref: '#/components/schemas/QuantityVCPUDto' + total_ram: + $ref: '#/components/schemas/QuantityMemoryDto' + total_storage: + $ref: '#/components/schemas/QuantityMemoryDto' request: $ref: '#/components/schemas/VirtualMachineDto' impacts: @@ -255,10 +264,19 @@ components: type: object required: - period + - total_vcpu + - total_ram + - total_storage - virtual_machines properties: period: $ref: '#/components/schemas/QuantityTimeDto' + total_vcpu: + $ref: '#/components/schemas/QuantityVCPUDto' + total_ram: + $ref: '#/components/schemas/QuantityMemoryDto' + total_storage: + $ref: '#/components/schemas/QuantityMemoryDto' virtual_machines: type: array items: @@ -578,10 +596,13 @@ components: type: object required: - period + - total_vcpu - compute_resources properties: period: $ref: '#/components/schemas/QuantityTimeDto' + total_vcpu: + $ref: '#/components/schemas/QuantityVCPUDto' compute_resources: type: array items: @@ -620,11 +641,14 @@ components: type: object required: - period + - total_vcpu - request - impacts properties: period: $ref: '#/components/schemas/QuantityTimeDto' + total_vcpu: + $ref: '#/components/schemas/QuantityVCPUDto' request: $ref: '#/components/schemas/ComputeResourceDto' impacts: @@ -633,10 +657,16 @@ components: type: object required: - period + - total_vcpu + - total_storage - storage_resources properties: period: $ref: '#/components/schemas/QuantityTimeDto' + total_vcpu: + $ref: '#/components/schemas/QuantityVCPUDto' + total_storage: + $ref: '#/components/schemas/QuantityMemoryDto' storage_resources: type: array items: @@ -676,11 +706,17 @@ components: type: object required: - period + - total_vcpu + - total_storage - request - impacts properties: period: $ref: '#/components/schemas/QuantityTimeDto' + total_vcpu: + $ref: '#/components/schemas/QuantityVCPUDto' + total_storage: + $ref: '#/components/schemas/QuantityMemoryDto' request: $ref: '#/components/schemas/StorageResourceDto' impacts: diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..01b11af --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6 @@ +{ + "name": "cloud-assess", + "lockfileVersion": 3, + "requires": true, + "packages": {} +} diff --git a/samples/virtual_machines.http b/samples/virtual_machines.http index ada6022..4983c0f 100644 --- a/samples/virtual_machines.http +++ b/samples/virtual_machines.http @@ -6,6 +6,18 @@ Content-Type: application/json "amount": 1.0, "unit": "hour" }, + "total_vcpu": { + "amount": 100.0, + "unit": "vCPU" + }, + "total_ram": { + "amount": 100.0, + "unit": "GB" + }, + "total_storage": { + "amount": 100.0, + "unit": "TB" + }, "virtual_machines": [ { "id": "vm-01", diff --git a/scripts/load-testing/jest.config.js b/scripts/load-testing/jest.config.js deleted file mode 100644 index b413e10..0000000 --- a/scripts/load-testing/jest.config.js +++ /dev/null @@ -1,5 +0,0 @@ -/** @type {import('ts-jest').JestConfigWithTsJest} */ -module.exports = { - preset: 'ts-jest', - testEnvironment: 'node', -}; \ No newline at end of file diff --git a/scripts/load-testing/models/DatasourceDto.ts b/scripts/load-testing/models/DatasourceDto.ts deleted file mode 100644 index 1e3f606..0000000 --- a/scripts/load-testing/models/DatasourceDto.ts +++ /dev/null @@ -1,77 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** - * Cloud Assess - * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - * - * The version of the OpenAPI document: 1.6.5 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - -import { mapValues } from '../runtime'; -import type { RecordDto } from './RecordDto'; -import { - RecordDtoFromJSON, - RecordDtoFromJSONTyped, - RecordDtoToJSON, -} from './RecordDto'; - -/** - * - * @export - * @interface DatasourceDto - */ -export interface DatasourceDto { - /** - * - * @type {string} - * @memberof DatasourceDto - */ - name: string; - /** - * - * @type {Array} - * @memberof DatasourceDto - */ - records: Array; -} - -/** - * Check if a given object implements the DatasourceDto interface. - */ -export function instanceOfDatasourceDto(value: object): value is DatasourceDto { - if (!('name' in value) || value['name'] === undefined) return false; - if (!('records' in value) || value['records'] === undefined) return false; - return true; -} - -export function DatasourceDtoFromJSON(json: any): DatasourceDto { - return DatasourceDtoFromJSONTyped(json, false); -} - -export function DatasourceDtoFromJSONTyped(json: any, ignoreDiscriminator: boolean): DatasourceDto { - if (json == null) { - return json; - } - return { - - 'name': json['name'], - 'records': ((json['records'] as Array).map(RecordDtoFromJSON)), - }; -} - -export function DatasourceDtoToJSON(value?: DatasourceDto | null): any { - if (value == null) { - return value; - } - return { - - 'name': value['name'], - 'records': ((value['records'] as Array).map(RecordDtoToJSON)), - }; -} - diff --git a/scripts/load-testing/models/DemandDto.ts b/scripts/load-testing/models/DemandDto.ts deleted file mode 100644 index 095ad64..0000000 --- a/scripts/load-testing/models/DemandDto.ts +++ /dev/null @@ -1,114 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** - * Cloud Assess - * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - * - * The version of the OpenAPI document: 1.6.5 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - -import { mapValues } from '../runtime'; -import type { QuantityDto } from './QuantityDto'; -import { - QuantityDtoFromJSON, - QuantityDtoFromJSONTyped, - QuantityDtoToJSON, -} from './QuantityDto'; -import type { ProcessLabelDto } from './ProcessLabelDto'; -import { - ProcessLabelDtoFromJSON, - ProcessLabelDtoFromJSONTyped, - ProcessLabelDtoToJSON, -} from './ProcessLabelDto'; -import type { ParameterDto } from './ParameterDto'; -import { - ParameterDtoFromJSON, - ParameterDtoFromJSONTyped, - ParameterDtoToJSON, -} from './ParameterDto'; - -/** - * - * @export - * @interface DemandDto - */ -export interface DemandDto { - /** - * - * @type {string} - * @memberof DemandDto - */ - productName: string; - /** - * - * @type {QuantityDto} - * @memberof DemandDto - */ - quantity: QuantityDto; - /** - * - * @type {string} - * @memberof DemandDto - */ - processName: string; - /** - * - * @type {Array} - * @memberof DemandDto - */ - params?: Array; - /** - * - * @type {Array} - * @memberof DemandDto - */ - labels?: Array; -} - -/** - * Check if a given object implements the DemandDto interface. - */ -export function instanceOfDemandDto(value: object): value is DemandDto { - if (!('productName' in value) || value['productName'] === undefined) return false; - if (!('quantity' in value) || value['quantity'] === undefined) return false; - if (!('processName' in value) || value['processName'] === undefined) return false; - return true; -} - -export function DemandDtoFromJSON(json: any): DemandDto { - return DemandDtoFromJSONTyped(json, false); -} - -export function DemandDtoFromJSONTyped(json: any, ignoreDiscriminator: boolean): DemandDto { - if (json == null) { - return json; - } - return { - - 'productName': json['productName'], - 'quantity': QuantityDtoFromJSON(json['quantity']), - 'processName': json['processName'], - 'params': json['params'] == null ? undefined : ((json['params'] as Array).map(ParameterDtoFromJSON)), - 'labels': json['labels'] == null ? undefined : ((json['labels'] as Array).map(ProcessLabelDtoFromJSON)), - }; -} - -export function DemandDtoToJSON(value?: DemandDto | null): any { - if (value == null) { - return value; - } - return { - - 'productName': value['productName'], - 'quantity': QuantityDtoToJSON(value['quantity']), - 'processName': value['processName'], - 'params': value['params'] == null ? undefined : ((value['params'] as Array).map(ParameterDtoToJSON)), - 'labels': value['labels'] == null ? undefined : ((value['labels'] as Array).map(ProcessLabelDtoToJSON)), - }; -} - diff --git a/scripts/load-testing/models/DimensionlessUnitsDto.ts b/scripts/load-testing/models/DimensionlessUnitsDto.ts deleted file mode 100644 index b5ba71b..0000000 --- a/scripts/load-testing/models/DimensionlessUnitsDto.ts +++ /dev/null @@ -1,48 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** - * Cloud Assess - * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - * - * The version of the OpenAPI document: 1.6.5 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - - -/** - * - * @export - */ -export const DimensionlessUnitsDto = { - U: 'u' -} as const; -export type DimensionlessUnitsDto = typeof DimensionlessUnitsDto[keyof typeof DimensionlessUnitsDto]; - - -export function instanceOfDimensionlessUnitsDto(value: any): boolean { - for (const key in DimensionlessUnitsDto) { - if (Object.prototype.hasOwnProperty.call(DimensionlessUnitsDto, key)) { - if (DimensionlessUnitsDto[key] === value) { - return true; - } - } - } - return false; -} - -export function DimensionlessUnitsDtoFromJSON(json: any): DimensionlessUnitsDto { - return DimensionlessUnitsDtoFromJSONTyped(json, false); -} - -export function DimensionlessUnitsDtoFromJSONTyped(json: any, ignoreDiscriminator: boolean): DimensionlessUnitsDto { - return json as DimensionlessUnitsDto; -} - -export function DimensionlessUnitsDtoToJSON(value?: DimensionlessUnitsDto | null): any { - return value as any; -} - diff --git a/scripts/load-testing/models/EntryDto.ts b/scripts/load-testing/models/EntryDto.ts deleted file mode 100644 index a0d0421..0000000 --- a/scripts/load-testing/models/EntryDto.ts +++ /dev/null @@ -1,77 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** - * Cloud Assess - * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - * - * The version of the OpenAPI document: 1.6.5 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - -import { mapValues } from '../runtime'; -import type { EntryValueDto } from './EntryValueDto'; -import { - EntryValueDtoFromJSON, - EntryValueDtoFromJSONTyped, - EntryValueDtoToJSON, -} from './EntryValueDto'; - -/** - * - * @export - * @interface EntryDto - */ -export interface EntryDto { - /** - * - * @type {string} - * @memberof EntryDto - */ - name: string; - /** - * - * @type {EntryValueDto} - * @memberof EntryDto - */ - value: EntryValueDto; -} - -/** - * Check if a given object implements the EntryDto interface. - */ -export function instanceOfEntryDto(value: object): value is EntryDto { - if (!('name' in value) || value['name'] === undefined) return false; - if (!('value' in value) || value['value'] === undefined) return false; - return true; -} - -export function EntryDtoFromJSON(json: any): EntryDto { - return EntryDtoFromJSONTyped(json, false); -} - -export function EntryDtoFromJSONTyped(json: any, ignoreDiscriminator: boolean): EntryDto { - if (json == null) { - return json; - } - return { - - 'name': json['name'], - 'value': EntryValueDtoFromJSON(json['value']), - }; -} - -export function EntryDtoToJSON(value?: EntryDto | null): any { - if (value == null) { - return value; - } - return { - - 'name': value['name'], - 'value': EntryValueDtoToJSON(value['value']), - }; -} - diff --git a/scripts/load-testing/models/HealthStatusDto.ts b/scripts/load-testing/models/HealthStatusDto.ts deleted file mode 100644 index 722a286..0000000 --- a/scripts/load-testing/models/HealthStatusDto.ts +++ /dev/null @@ -1,70 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** - * Cloud Assess - * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - * - * The version of the OpenAPI document: 1.6.5 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - -import { mapValues } from '../runtime'; -/** - * - * @export - * @interface HealthStatusDto - */ -export interface HealthStatusDto { - /** - * - * @type {string} - * @memberof HealthStatusDto - */ - status?: HealthStatusDtoStatusEnum; -} - - -/** - * @export - */ -export const HealthStatusDtoStatusEnum = { - Up: 'UP' -} as const; -export type HealthStatusDtoStatusEnum = typeof HealthStatusDtoStatusEnum[keyof typeof HealthStatusDtoStatusEnum]; - - -/** - * Check if a given object implements the HealthStatusDto interface. - */ -export function instanceOfHealthStatusDto(value: object): value is HealthStatusDto { - return true; -} - -export function HealthStatusDtoFromJSON(json: any): HealthStatusDto { - return HealthStatusDtoFromJSONTyped(json, false); -} - -export function HealthStatusDtoFromJSONTyped(json: any, ignoreDiscriminator: boolean): HealthStatusDto { - if (json == null) { - return json; - } - return { - - 'status': json['status'] == null ? undefined : json['status'], - }; -} - -export function HealthStatusDtoToJSON(value?: HealthStatusDto | null): any { - if (value == null) { - return value; - } - return { - - 'status': value['status'], - }; -} - diff --git a/scripts/load-testing/models/ImpactDto.ts b/scripts/load-testing/models/ImpactDto.ts deleted file mode 100644 index 818c51e..0000000 --- a/scripts/load-testing/models/ImpactDto.ts +++ /dev/null @@ -1,68 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** - * Cloud Assess - * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - * - * The version of the OpenAPI document: 1.6.5 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - -import { mapValues } from '../runtime'; -import type { QuantityDto } from './QuantityDto'; -import { - QuantityDtoFromJSON, - QuantityDtoFromJSONTyped, - QuantityDtoToJSON, -} from './QuantityDto'; - -/** - * - * @export - * @interface ImpactDto - */ -export interface ImpactDto { - /** - * - * @type {QuantityDto} - * @memberof ImpactDto - */ - total: QuantityDto; -} - -/** - * Check if a given object implements the ImpactDto interface. - */ -export function instanceOfImpactDto(value: object): value is ImpactDto { - if (!('total' in value) || value['total'] === undefined) return false; - return true; -} - -export function ImpactDtoFromJSON(json: any): ImpactDto { - return ImpactDtoFromJSONTyped(json, false); -} - -export function ImpactDtoFromJSONTyped(json: any, ignoreDiscriminator: boolean): ImpactDto { - if (json == null) { - return json; - } - return { - - 'total': QuantityDtoFromJSON(json['total']), - }; -} - -export function ImpactDtoToJSON(value?: ImpactDto | null): any { - if (value == null) { - return value; - } - return { - - 'total': QuantityDtoToJSON(value['total']), - }; -} - diff --git a/scripts/load-testing/models/ImpactsDto.ts b/scripts/load-testing/models/ImpactsDto.ts deleted file mode 100644 index aa26458..0000000 --- a/scripts/load-testing/models/ImpactsDto.ts +++ /dev/null @@ -1,203 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** - * Cloud Assess - * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - * - * The version of the OpenAPI document: 1.6.5 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - -import { mapValues } from '../runtime'; -import type { ImpactDto } from './ImpactDto'; -import { - ImpactDtoFromJSON, - ImpactDtoFromJSONTyped, - ImpactDtoToJSON, -} from './ImpactDto'; - -/** - * - * @export - * @interface ImpactsDto - */ -export interface ImpactsDto { - /** - * - * @type {ImpactDto} - * @memberof ImpactsDto - */ - aDPe: ImpactDto; - /** - * - * @type {ImpactDto} - * @memberof ImpactsDto - */ - aDPf: ImpactDto; - /** - * - * @type {ImpactDto} - * @memberof ImpactsDto - */ - aP: ImpactDto; - /** - * - * @type {ImpactDto} - * @memberof ImpactsDto - */ - gWP: ImpactDto; - /** - * - * @type {ImpactDto} - * @memberof ImpactsDto - */ - lU: ImpactDto; - /** - * - * @type {ImpactDto} - * @memberof ImpactsDto - */ - oDP: ImpactDto; - /** - * - * @type {ImpactDto} - * @memberof ImpactsDto - */ - pM: ImpactDto; - /** - * - * @type {ImpactDto} - * @memberof ImpactsDto - */ - pOCP: ImpactDto; - /** - * - * @type {ImpactDto} - * @memberof ImpactsDto - */ - wU: ImpactDto; - /** - * - * @type {ImpactDto} - * @memberof ImpactsDto - */ - cTUe: ImpactDto; - /** - * - * @type {ImpactDto} - * @memberof ImpactsDto - */ - cTUhC: ImpactDto; - /** - * - * @type {ImpactDto} - * @memberof ImpactsDto - */ - cTUhNc: ImpactDto; - /** - * - * @type {ImpactDto} - * @memberof ImpactsDto - */ - epf: ImpactDto; - /** - * - * @type {ImpactDto} - * @memberof ImpactsDto - */ - epm: ImpactDto; - /** - * - * @type {ImpactDto} - * @memberof ImpactsDto - */ - ept: ImpactDto; - /** - * - * @type {ImpactDto} - * @memberof ImpactsDto - */ - iR: ImpactDto; -} - -/** - * Check if a given object implements the ImpactsDto interface. - */ -export function instanceOfImpactsDto(value: object): value is ImpactsDto { - if (!('aDPe' in value) || value['aDPe'] === undefined) return false; - if (!('aDPf' in value) || value['aDPf'] === undefined) return false; - if (!('aP' in value) || value['aP'] === undefined) return false; - if (!('gWP' in value) || value['gWP'] === undefined) return false; - if (!('lU' in value) || value['lU'] === undefined) return false; - if (!('oDP' in value) || value['oDP'] === undefined) return false; - if (!('pM' in value) || value['pM'] === undefined) return false; - if (!('pOCP' in value) || value['pOCP'] === undefined) return false; - if (!('wU' in value) || value['wU'] === undefined) return false; - if (!('cTUe' in value) || value['cTUe'] === undefined) return false; - if (!('cTUhC' in value) || value['cTUhC'] === undefined) return false; - if (!('cTUhNc' in value) || value['cTUhNc'] === undefined) return false; - if (!('epf' in value) || value['epf'] === undefined) return false; - if (!('epm' in value) || value['epm'] === undefined) return false; - if (!('ept' in value) || value['ept'] === undefined) return false; - if (!('iR' in value) || value['iR'] === undefined) return false; - return true; -} - -export function ImpactsDtoFromJSON(json: any): ImpactsDto { - return ImpactsDtoFromJSONTyped(json, false); -} - -export function ImpactsDtoFromJSONTyped(json: any, ignoreDiscriminator: boolean): ImpactsDto { - if (json == null) { - return json; - } - return { - - 'aDPe': ImpactDtoFromJSON(json['ADPe']), - 'aDPf': ImpactDtoFromJSON(json['ADPf']), - 'aP': ImpactDtoFromJSON(json['AP']), - 'gWP': ImpactDtoFromJSON(json['GWP']), - 'lU': ImpactDtoFromJSON(json['LU']), - 'oDP': ImpactDtoFromJSON(json['ODP']), - 'pM': ImpactDtoFromJSON(json['PM']), - 'pOCP': ImpactDtoFromJSON(json['POCP']), - 'wU': ImpactDtoFromJSON(json['WU']), - 'cTUe': ImpactDtoFromJSON(json['CTUe']), - 'cTUhC': ImpactDtoFromJSON(json['CTUh_c']), - 'cTUhNc': ImpactDtoFromJSON(json['CTUh_nc']), - 'epf': ImpactDtoFromJSON(json['Epf']), - 'epm': ImpactDtoFromJSON(json['Epm']), - 'ept': ImpactDtoFromJSON(json['Ept']), - 'iR': ImpactDtoFromJSON(json['IR']), - }; -} - -export function ImpactsDtoToJSON(value?: ImpactsDto | null): any { - if (value == null) { - return value; - } - return { - - 'ADPe': ImpactDtoToJSON(value['aDPe']), - 'ADPf': ImpactDtoToJSON(value['aDPf']), - 'AP': ImpactDtoToJSON(value['aP']), - 'GWP': ImpactDtoToJSON(value['gWP']), - 'LU': ImpactDtoToJSON(value['lU']), - 'ODP': ImpactDtoToJSON(value['oDP']), - 'PM': ImpactDtoToJSON(value['pM']), - 'POCP': ImpactDtoToJSON(value['pOCP']), - 'WU': ImpactDtoToJSON(value['wU']), - 'CTUe': ImpactDtoToJSON(value['cTUe']), - 'CTUh_c': ImpactDtoToJSON(value['cTUhC']), - 'CTUh_nc': ImpactDtoToJSON(value['cTUhNc']), - 'Epf': ImpactDtoToJSON(value['epf']), - 'Epm': ImpactDtoToJSON(value['epm']), - 'Ept': ImpactDtoToJSON(value['ept']), - 'IR': ImpactDtoToJSON(value['iR']), - }; -} - diff --git a/scripts/load-testing/models/MemoryUnitsDto.ts b/scripts/load-testing/models/MemoryUnitsDto.ts deleted file mode 100644 index b3ccaaa..0000000 --- a/scripts/load-testing/models/MemoryUnitsDto.ts +++ /dev/null @@ -1,38 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** - * Cloud Assess - * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - * - * The version of the OpenAPI document: 1.6.5 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - - -/** - * - * @export - */ -export const MemoryUnitsDto = { - Gb: 'GB', - Tb: 'TB' -} as const; -export type MemoryUnitsDto = typeof MemoryUnitsDto[keyof typeof MemoryUnitsDto]; - - -export function MemoryUnitsDtoFromJSON(json: any): MemoryUnitsDto { - return MemoryUnitsDtoFromJSONTyped(json, false); -} - -export function MemoryUnitsDtoFromJSONTyped(json: any, ignoreDiscriminator: boolean): MemoryUnitsDto { - return json as MemoryUnitsDto; -} - -export function MemoryUnitsDtoToJSON(value?: MemoryUnitsDto | null): any { - return value as any; -} - diff --git a/scripts/load-testing/models/OptionsDto.ts b/scripts/load-testing/models/OptionsDto.ts deleted file mode 100644 index a8aecbb..0000000 --- a/scripts/load-testing/models/OptionsDto.ts +++ /dev/null @@ -1,60 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** - * Cloud Assess - * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - * - * The version of the OpenAPI document: 1.6.5 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - -import { mapValues } from '../runtime'; -/** - * - * @export - * @interface OptionsDto - */ -export interface OptionsDto { - /** - * - * @type {boolean} - * @memberof OptionsDto - */ - useDefaultDatasourceIfNotProvided?: boolean; -} - -/** - * Check if a given object implements the OptionsDto interface. - */ -export function instanceOfOptionsDto(value: object): value is OptionsDto { - return true; -} - -export function OptionsDtoFromJSON(json: any): OptionsDto { - return OptionsDtoFromJSONTyped(json, false); -} - -export function OptionsDtoFromJSONTyped(json: any, ignoreDiscriminator: boolean): OptionsDto { - if (json == null) { - return json; - } - return { - - 'useDefaultDatasourceIfNotProvided': json['useDefaultDatasourceIfNotProvided'] == null ? undefined : json['useDefaultDatasourceIfNotProvided'], - }; -} - -export function OptionsDtoToJSON(value?: OptionsDto | null): any { - if (value == null) { - return value; - } - return { - - 'useDefaultDatasourceIfNotProvided': value['useDefaultDatasourceIfNotProvided'], - }; -} - diff --git a/scripts/load-testing/models/ParameterDto.ts b/scripts/load-testing/models/ParameterDto.ts deleted file mode 100644 index efd8594..0000000 --- a/scripts/load-testing/models/ParameterDto.ts +++ /dev/null @@ -1,77 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** - * Cloud Assess - * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - * - * The version of the OpenAPI document: 1.6.5 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - -import { mapValues } from '../runtime'; -import type { ParameterValueDto } from './ParameterValueDto'; -import { - ParameterValueDtoFromJSON, - ParameterValueDtoFromJSONTyped, - ParameterValueDtoToJSON, -} from './ParameterValueDto'; - -/** - * - * @export - * @interface ParameterDto - */ -export interface ParameterDto { - /** - * - * @type {string} - * @memberof ParameterDto - */ - name: string; - /** - * - * @type {ParameterValueDto} - * @memberof ParameterDto - */ - value: ParameterValueDto; -} - -/** - * Check if a given object implements the ParameterDto interface. - */ -export function instanceOfParameterDto(value: object): value is ParameterDto { - if (!('name' in value) || value['name'] === undefined) return false; - if (!('value' in value) || value['value'] === undefined) return false; - return true; -} - -export function ParameterDtoFromJSON(json: any): ParameterDto { - return ParameterDtoFromJSONTyped(json, false); -} - -export function ParameterDtoFromJSONTyped(json: any, ignoreDiscriminator: boolean): ParameterDto { - if (json == null) { - return json; - } - return { - - 'name': json['name'], - 'value': ParameterValueDtoFromJSON(json['value']), - }; -} - -export function ParameterDtoToJSON(value?: ParameterDto | null): any { - if (value == null) { - return value; - } - return { - - 'name': value['name'], - 'value': ParameterValueDtoToJSON(value['value']), - }; -} - diff --git a/scripts/load-testing/models/PoolAssessmentDto.ts b/scripts/load-testing/models/PoolAssessmentDto.ts deleted file mode 100644 index 1494e1e..0000000 --- a/scripts/load-testing/models/PoolAssessmentDto.ts +++ /dev/null @@ -1,98 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** - * Cloud Assess - * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - * - * The version of the OpenAPI document: 1.6.5 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - -import { mapValues } from '../runtime'; -import type { PoolDto } from './PoolDto'; -import { - PoolDtoFromJSON, - PoolDtoFromJSONTyped, - PoolDtoToJSON, -} from './PoolDto'; -import type { QuantityTimeDto } from './QuantityTimeDto'; -import { - QuantityTimeDtoFromJSON, - QuantityTimeDtoFromJSONTyped, - QuantityTimeDtoToJSON, -} from './QuantityTimeDto'; -import type { ImpactsDto } from './ImpactsDto'; -import { - ImpactsDtoFromJSON, - ImpactsDtoFromJSONTyped, - ImpactsDtoToJSON, -} from './ImpactsDto'; - -/** - * - * @export - * @interface PoolAssessmentDto - */ -export interface PoolAssessmentDto { - /** - * - * @type {QuantityTimeDto} - * @memberof PoolAssessmentDto - */ - period: QuantityTimeDto; - /** - * - * @type {PoolDto} - * @memberof PoolAssessmentDto - */ - request: PoolDto; - /** - * - * @type {ImpactsDto} - * @memberof PoolAssessmentDto - */ - impacts: ImpactsDto; -} - -/** - * Check if a given object implements the PoolAssessmentDto interface. - */ -export function instanceOfPoolAssessmentDto(value: object): value is PoolAssessmentDto { - if (!('period' in value) || value['period'] === undefined) return false; - if (!('request' in value) || value['request'] === undefined) return false; - if (!('impacts' in value) || value['impacts'] === undefined) return false; - return true; -} - -export function PoolAssessmentDtoFromJSON(json: any): PoolAssessmentDto { - return PoolAssessmentDtoFromJSONTyped(json, false); -} - -export function PoolAssessmentDtoFromJSONTyped(json: any, ignoreDiscriminator: boolean): PoolAssessmentDto { - if (json == null) { - return json; - } - return { - - 'period': QuantityTimeDtoFromJSON(json['period']), - 'request': PoolDtoFromJSON(json['request']), - 'impacts': ImpactsDtoFromJSON(json['impacts']), - }; -} - -export function PoolAssessmentDtoToJSON(value?: PoolAssessmentDto | null): any { - if (value == null) { - return value; - } - return { - - 'period': QuantityTimeDtoToJSON(value['period']), - 'request': PoolDtoToJSON(value['request']), - 'impacts': ImpactsDtoToJSON(value['impacts']), - }; -} - diff --git a/scripts/load-testing/models/PoolDto.ts b/scripts/load-testing/models/PoolDto.ts deleted file mode 100644 index c3634aa..0000000 --- a/scripts/load-testing/models/PoolDto.ts +++ /dev/null @@ -1,86 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** - * Cloud Assess - * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - * - * The version of the OpenAPI document: 1.6.5 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - -import { mapValues } from '../runtime'; -import type { QuantityDimensionlessDto } from './QuantityDimensionlessDto'; -import { - QuantityDimensionlessDtoFromJSON, - QuantityDimensionlessDtoFromJSONTyped, - QuantityDimensionlessDtoToJSON, -} from './QuantityDimensionlessDto'; - -/** - * - * @export - * @interface PoolDto - */ -export interface PoolDto { - /** - * - * @type {string} - * @memberof PoolDto - */ - id: string; - /** - * - * @type {QuantityDimensionlessDto} - * @memberof PoolDto - */ - serviceLevel: QuantityDimensionlessDto; - /** - * - * @type {{ [key: string]: string; }} - * @memberof PoolDto - */ - meta: { [key: string]: string; }; -} - -/** - * Check if a given object implements the PoolDto interface. - */ -export function instanceOfPoolDto(value: object): value is PoolDto { - if (!('id' in value) || value['id'] === undefined) return false; - if (!('serviceLevel' in value) || value['serviceLevel'] === undefined) return false; - if (!('meta' in value) || value['meta'] === undefined) return false; - return true; -} - -export function PoolDtoFromJSON(json: any): PoolDto { - return PoolDtoFromJSONTyped(json, false); -} - -export function PoolDtoFromJSONTyped(json: any, ignoreDiscriminator: boolean): PoolDto { - if (json == null) { - return json; - } - return { - - 'id': json['id'], - 'serviceLevel': QuantityDimensionlessDtoFromJSON(json['service_level']), - 'meta': json['meta'], - }; -} - -export function PoolDtoToJSON(value?: PoolDto | null): any { - if (value == null) { - return value; - } - return { - - 'id': value['id'], - 'service_level': QuantityDimensionlessDtoToJSON(value['serviceLevel']), - 'meta': value['meta'], - }; -} - diff --git a/scripts/load-testing/models/PoolListAssessmentDto.ts b/scripts/load-testing/models/PoolListAssessmentDto.ts deleted file mode 100644 index 5beaed2..0000000 --- a/scripts/load-testing/models/PoolListAssessmentDto.ts +++ /dev/null @@ -1,68 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** - * Cloud Assess - * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - * - * The version of the OpenAPI document: 1.6.5 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - -import { mapValues } from '../runtime'; -import type { PoolAssessmentDto } from './PoolAssessmentDto'; -import { - PoolAssessmentDtoFromJSON, - PoolAssessmentDtoFromJSONTyped, - PoolAssessmentDtoToJSON, -} from './PoolAssessmentDto'; - -/** - * - * @export - * @interface PoolListAssessmentDto - */ -export interface PoolListAssessmentDto { - /** - * - * @type {Array} - * @memberof PoolListAssessmentDto - */ - pools: Array; -} - -/** - * Check if a given object implements the PoolListAssessmentDto interface. - */ -export function instanceOfPoolListAssessmentDto(value: object): value is PoolListAssessmentDto { - if (!('pools' in value) || value['pools'] === undefined) return false; - return true; -} - -export function PoolListAssessmentDtoFromJSON(json: any): PoolListAssessmentDto { - return PoolListAssessmentDtoFromJSONTyped(json, false); -} - -export function PoolListAssessmentDtoFromJSONTyped(json: any, ignoreDiscriminator: boolean): PoolListAssessmentDto { - if (json == null) { - return json; - } - return { - - 'pools': ((json['pools'] as Array).map(PoolAssessmentDtoFromJSON)), - }; -} - -export function PoolListAssessmentDtoToJSON(value?: PoolListAssessmentDto | null): any { - if (value == null) { - return value; - } - return { - - 'pools': ((value['pools'] as Array).map(PoolAssessmentDtoToJSON)), - }; -} - diff --git a/scripts/load-testing/models/PoolListDto.ts b/scripts/load-testing/models/PoolListDto.ts deleted file mode 100644 index b844b3a..0000000 --- a/scripts/load-testing/models/PoolListDto.ts +++ /dev/null @@ -1,83 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** - * Cloud Assess - * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - * - * The version of the OpenAPI document: 1.6.5 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - -import { mapValues } from '../runtime'; -import type { PoolDto } from './PoolDto'; -import { - PoolDtoFromJSON, - PoolDtoFromJSONTyped, - PoolDtoToJSON, -} from './PoolDto'; -import type { QuantityTimeDto } from './QuantityTimeDto'; -import { - QuantityTimeDtoFromJSON, - QuantityTimeDtoFromJSONTyped, - QuantityTimeDtoToJSON, -} from './QuantityTimeDto'; - -/** - * - * @export - * @interface PoolListDto - */ -export interface PoolListDto { - /** - * - * @type {QuantityTimeDto} - * @memberof PoolListDto - */ - period: QuantityTimeDto; - /** - * - * @type {Array} - * @memberof PoolListDto - */ - pools: Array; -} - -/** - * Check if a given object implements the PoolListDto interface. - */ -export function instanceOfPoolListDto(value: object): value is PoolListDto { - if (!('period' in value) || value['period'] === undefined) return false; - if (!('pools' in value) || value['pools'] === undefined) return false; - return true; -} - -export function PoolListDtoFromJSON(json: any): PoolListDto { - return PoolListDtoFromJSONTyped(json, false); -} - -export function PoolListDtoFromJSONTyped(json: any, ignoreDiscriminator: boolean): PoolListDto { - if (json == null) { - return json; - } - return { - - 'period': QuantityTimeDtoFromJSON(json['period']), - 'pools': ((json['pools'] as Array).map(PoolDtoFromJSON)), - }; -} - -export function PoolListDtoToJSON(value?: PoolListDto | null): any { - if (value == null) { - return value; - } - return { - - 'period': QuantityTimeDtoToJSON(value['period']), - 'pools': ((value['pools'] as Array).map(PoolDtoToJSON)), - }; -} - diff --git a/scripts/load-testing/models/ProcessLabelDto.ts b/scripts/load-testing/models/ProcessLabelDto.ts deleted file mode 100644 index 25a6d9a..0000000 --- a/scripts/load-testing/models/ProcessLabelDto.ts +++ /dev/null @@ -1,70 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** - * Cloud Assess - * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - * - * The version of the OpenAPI document: 1.6.5 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - -import { mapValues } from '../runtime'; -/** - * - * @export - * @interface ProcessLabelDto - */ -export interface ProcessLabelDto { - /** - * - * @type {string} - * @memberof ProcessLabelDto - */ - name: string; - /** - * - * @type {string} - * @memberof ProcessLabelDto - */ - value: string; -} - -/** - * Check if a given object implements the ProcessLabelDto interface. - */ -export function instanceOfProcessLabelDto(value: object): value is ProcessLabelDto { - if (!('name' in value) || value['name'] === undefined) return false; - if (!('value' in value) || value['value'] === undefined) return false; - return true; -} - -export function ProcessLabelDtoFromJSON(json: any): ProcessLabelDto { - return ProcessLabelDtoFromJSONTyped(json, false); -} - -export function ProcessLabelDtoFromJSONTyped(json: any, ignoreDiscriminator: boolean): ProcessLabelDto { - if (json == null) { - return json; - } - return { - - 'name': json['name'], - 'value': json['value'], - }; -} - -export function ProcessLabelDtoToJSON(value?: ProcessLabelDto | null): any { - if (value == null) { - return value; - } - return { - - 'name': value['name'], - 'value': value['value'], - }; -} - diff --git a/scripts/load-testing/models/QuantityDimensionlessDto.ts b/scripts/load-testing/models/QuantityDimensionlessDto.ts deleted file mode 100644 index f76a6ba..0000000 --- a/scripts/load-testing/models/QuantityDimensionlessDto.ts +++ /dev/null @@ -1,77 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** - * Cloud Assess - * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - * - * The version of the OpenAPI document: 1.6.5 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - -import { mapValues } from '../runtime'; -import type { DimensionlessUnitsDto } from './DimensionlessUnitsDto'; -import { - DimensionlessUnitsDtoFromJSON, - DimensionlessUnitsDtoFromJSONTyped, - DimensionlessUnitsDtoToJSON, -} from './DimensionlessUnitsDto'; - -/** - * - * @export - * @interface QuantityDimensionlessDto - */ -export interface QuantityDimensionlessDto { - /** - * - * @type {number} - * @memberof QuantityDimensionlessDto - */ - amount: number; - /** - * - * @type {DimensionlessUnitsDto} - * @memberof QuantityDimensionlessDto - */ - unit: DimensionlessUnitsDto; -} - -/** - * Check if a given object implements the QuantityDimensionlessDto interface. - */ -export function instanceOfQuantityDimensionlessDto(value: object): value is QuantityDimensionlessDto { - if (!('amount' in value) || value['amount'] === undefined) return false; - if (!('unit' in value) || value['unit'] === undefined) return false; - return true; -} - -export function QuantityDimensionlessDtoFromJSON(json: any): QuantityDimensionlessDto { - return QuantityDimensionlessDtoFromJSONTyped(json, false); -} - -export function QuantityDimensionlessDtoFromJSONTyped(json: any, ignoreDiscriminator: boolean): QuantityDimensionlessDto { - if (json == null) { - return json; - } - return { - - 'amount': json['amount'], - 'unit': DimensionlessUnitsDtoFromJSON(json['unit']), - }; -} - -export function QuantityDimensionlessDtoToJSON(value?: QuantityDimensionlessDto | null): any { - if (value == null) { - return value; - } - return { - - 'amount': value['amount'], - 'unit': DimensionlessUnitsDtoToJSON(value['unit']), - }; -} - diff --git a/scripts/load-testing/models/QuantityDto.ts b/scripts/load-testing/models/QuantityDto.ts deleted file mode 100644 index bb435fe..0000000 --- a/scripts/load-testing/models/QuantityDto.ts +++ /dev/null @@ -1,70 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** - * Cloud Assess - * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - * - * The version of the OpenAPI document: 1.6.5 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - -import { mapValues } from '../runtime'; -/** - * - * @export - * @interface QuantityDto - */ -export interface QuantityDto { - /** - * - * @type {number} - * @memberof QuantityDto - */ - amount: number; - /** - * - * @type {string} - * @memberof QuantityDto - */ - unit: string; -} - -/** - * Check if a given object implements the QuantityDto interface. - */ -export function instanceOfQuantityDto(value: object): value is QuantityDto { - if (!('amount' in value) || value['amount'] === undefined) return false; - if (!('unit' in value) || value['unit'] === undefined) return false; - return true; -} - -export function QuantityDtoFromJSON(json: any): QuantityDto { - return QuantityDtoFromJSONTyped(json, false); -} - -export function QuantityDtoFromJSONTyped(json: any, ignoreDiscriminator: boolean): QuantityDto { - if (json == null) { - return json; - } - return { - - 'amount': json['amount'], - 'unit': json['unit'], - }; -} - -export function QuantityDtoToJSON(value?: QuantityDto | null): any { - if (value == null) { - return value; - } - return { - - 'amount': value['amount'], - 'unit': value['unit'], - }; -} - diff --git a/scripts/load-testing/models/QuantityMemoryDto.ts b/scripts/load-testing/models/QuantityMemoryDto.ts deleted file mode 100644 index d029fcc..0000000 --- a/scripts/load-testing/models/QuantityMemoryDto.ts +++ /dev/null @@ -1,77 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** - * Cloud Assess - * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - * - * The version of the OpenAPI document: 1.6.5 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - -import { mapValues } from '../runtime'; -import type { MemoryUnitsDto } from './MemoryUnitsDto'; -import { - MemoryUnitsDtoFromJSON, - MemoryUnitsDtoFromJSONTyped, - MemoryUnitsDtoToJSON, -} from './MemoryUnitsDto'; - -/** - * - * @export - * @interface QuantityMemoryDto - */ -export interface QuantityMemoryDto { - /** - * - * @type {number} - * @memberof QuantityMemoryDto - */ - amount: number; - /** - * - * @type {MemoryUnitsDto} - * @memberof QuantityMemoryDto - */ - unit: MemoryUnitsDto; -} - -/** - * Check if a given object implements the QuantityMemoryDto interface. - */ -export function instanceOfQuantityMemoryDto(value: object): value is QuantityMemoryDto { - if (!('amount' in value) || value['amount'] === undefined) return false; - if (!('unit' in value) || value['unit'] === undefined) return false; - return true; -} - -export function QuantityMemoryDtoFromJSON(json: any): QuantityMemoryDto { - return QuantityMemoryDtoFromJSONTyped(json, false); -} - -export function QuantityMemoryDtoFromJSONTyped(json: any, ignoreDiscriminator: boolean): QuantityMemoryDto { - if (json == null) { - return json; - } - return { - - 'amount': json['amount'], - 'unit': MemoryUnitsDtoFromJSON(json['unit']), - }; -} - -export function QuantityMemoryDtoToJSON(value?: QuantityMemoryDto | null): any { - if (value == null) { - return value; - } - return { - - 'amount': value['amount'], - 'unit': MemoryUnitsDtoToJSON(value['unit']), - }; -} - diff --git a/scripts/load-testing/models/QuantityTimeDto.ts b/scripts/load-testing/models/QuantityTimeDto.ts deleted file mode 100644 index eb05fe2..0000000 --- a/scripts/load-testing/models/QuantityTimeDto.ts +++ /dev/null @@ -1,77 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** - * Cloud Assess - * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - * - * The version of the OpenAPI document: 1.6.5 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - -import { mapValues } from '../runtime'; -import type { TimeUnitsDto } from './TimeUnitsDto'; -import { - TimeUnitsDtoFromJSON, - TimeUnitsDtoFromJSONTyped, - TimeUnitsDtoToJSON, -} from './TimeUnitsDto'; - -/** - * - * @export - * @interface QuantityTimeDto - */ -export interface QuantityTimeDto { - /** - * - * @type {number} - * @memberof QuantityTimeDto - */ - amount: number; - /** - * - * @type {TimeUnitsDto} - * @memberof QuantityTimeDto - */ - unit: TimeUnitsDto; -} - -/** - * Check if a given object implements the QuantityTimeDto interface. - */ -export function instanceOfQuantityTimeDto(value: object): value is QuantityTimeDto { - if (!('amount' in value) || value['amount'] === undefined) return false; - if (!('unit' in value) || value['unit'] === undefined) return false; - return true; -} - -export function QuantityTimeDtoFromJSON(json: any): QuantityTimeDto { - return QuantityTimeDtoFromJSONTyped(json, false); -} - -export function QuantityTimeDtoFromJSONTyped(json: any, ignoreDiscriminator: boolean): QuantityTimeDto { - if (json == null) { - return json; - } - return { - - 'amount': json['amount'], - 'unit': TimeUnitsDtoFromJSON(json['unit']), - }; -} - -export function QuantityTimeDtoToJSON(value?: QuantityTimeDto | null): any { - if (value == null) { - return value; - } - return { - - 'amount': value['amount'], - 'unit': TimeUnitsDtoToJSON(value['unit']), - }; -} - diff --git a/scripts/load-testing/models/QuantityVCPUDto.ts b/scripts/load-testing/models/QuantityVCPUDto.ts deleted file mode 100644 index a975039..0000000 --- a/scripts/load-testing/models/QuantityVCPUDto.ts +++ /dev/null @@ -1,77 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** - * Cloud Assess - * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - * - * The version of the OpenAPI document: 1.6.5 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - -import { mapValues } from '../runtime'; -import type { VCPUUnitsDto } from './VCPUUnitsDto'; -import { - VCPUUnitsDtoFromJSON, - VCPUUnitsDtoFromJSONTyped, - VCPUUnitsDtoToJSON, -} from './VCPUUnitsDto'; - -/** - * - * @export - * @interface QuantityVCPUDto - */ -export interface QuantityVCPUDto { - /** - * - * @type {number} - * @memberof QuantityVCPUDto - */ - amount: number; - /** - * - * @type {VCPUUnitsDto} - * @memberof QuantityVCPUDto - */ - unit: VCPUUnitsDto; -} - -/** - * Check if a given object implements the QuantityVCPUDto interface. - */ -export function instanceOfQuantityVCPUDto(value: object): value is QuantityVCPUDto { - if (!('amount' in value) || value['amount'] === undefined) return false; - if (!('unit' in value) || value['unit'] === undefined) return false; - return true; -} - -export function QuantityVCPUDtoFromJSON(json: any): QuantityVCPUDto { - return QuantityVCPUDtoFromJSONTyped(json, false); -} - -export function QuantityVCPUDtoFromJSONTyped(json: any, ignoreDiscriminator: boolean): QuantityVCPUDto { - if (json == null) { - return json; - } - return { - - 'amount': json['amount'], - 'unit': VCPUUnitsDtoFromJSON(json['unit']), - }; -} - -export function QuantityVCPUDtoToJSON(value?: QuantityVCPUDto | null): any { - if (value == null) { - return value; - } - return { - - 'amount': value['amount'], - 'unit': VCPUUnitsDtoToJSON(value['unit']), - }; -} - diff --git a/scripts/load-testing/models/RecordDto.ts b/scripts/load-testing/models/RecordDto.ts deleted file mode 100644 index 1d35ebe..0000000 --- a/scripts/load-testing/models/RecordDto.ts +++ /dev/null @@ -1,68 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** - * Cloud Assess - * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - * - * The version of the OpenAPI document: 1.6.5 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - -import { mapValues } from '../runtime'; -import type { EntryDto } from './EntryDto'; -import { - EntryDtoFromJSON, - EntryDtoFromJSONTyped, - EntryDtoToJSON, -} from './EntryDto'; - -/** - * - * @export - * @interface RecordDto - */ -export interface RecordDto { - /** - * - * @type {Array} - * @memberof RecordDto - */ - elements: Array; -} - -/** - * Check if a given object implements the RecordDto interface. - */ -export function instanceOfRecordDto(value: object): value is RecordDto { - if (!('elements' in value) || value['elements'] === undefined) return false; - return true; -} - -export function RecordDtoFromJSON(json: any): RecordDto { - return RecordDtoFromJSONTyped(json, false); -} - -export function RecordDtoFromJSONTyped(json: any, ignoreDiscriminator: boolean): RecordDto { - if (json == null) { - return json; - } - return { - - 'elements': ((json['elements'] as Array).map(EntryDtoFromJSON)), - }; -} - -export function RecordDtoToJSON(value?: RecordDto | null): any { - if (value == null) { - return value; - } - return { - - 'elements': ((value['elements'] as Array).map(EntryDtoToJSON)), - }; -} - diff --git a/scripts/load-testing/models/TimeUnitsDto.ts b/scripts/load-testing/models/TimeUnitsDto.ts deleted file mode 100644 index b79046d..0000000 --- a/scripts/load-testing/models/TimeUnitsDto.ts +++ /dev/null @@ -1,37 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** - * Cloud Assess - * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - * - * The version of the OpenAPI document: 1.6.5 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - - -/** - * - * @export - */ -export const TimeUnitsDto = { - Hour: 'hour' -} as const; -export type TimeUnitsDto = typeof TimeUnitsDto[keyof typeof TimeUnitsDto]; - - -export function TimeUnitsDtoFromJSON(json: any): TimeUnitsDto { - return TimeUnitsDtoFromJSONTyped(json, false); -} - -export function TimeUnitsDtoFromJSONTyped(json: any, ignoreDiscriminator: boolean): TimeUnitsDto { - return json as TimeUnitsDto; -} - -export function TimeUnitsDtoToJSON(value?: TimeUnitsDto | null): any { - return value as any; -} - diff --git a/scripts/load-testing/models/TraceRequestDto.ts b/scripts/load-testing/models/TraceRequestDto.ts deleted file mode 100644 index a297916..0000000 --- a/scripts/load-testing/models/TraceRequestDto.ts +++ /dev/null @@ -1,119 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** - * Cloud Assess - * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - * - * The version of the OpenAPI document: 1.6.5 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - -import { mapValues } from '../runtime'; -import type { DemandDto } from './DemandDto'; -import { - DemandDtoFromJSON, - DemandDtoFromJSONTyped, - DemandDtoToJSON, -} from './DemandDto'; -import type { DatasourceDto } from './DatasourceDto'; -import { - DatasourceDtoFromJSON, - DatasourceDtoFromJSONTyped, - DatasourceDtoToJSON, -} from './DatasourceDto'; -import type { OptionsDto } from './OptionsDto'; -import { - OptionsDtoFromJSON, - OptionsDtoFromJSONTyped, - OptionsDtoToJSON, -} from './OptionsDto'; -import type { ParameterDto } from './ParameterDto'; -import { - ParameterDtoFromJSON, - ParameterDtoFromJSONTyped, - ParameterDtoToJSON, -} from './ParameterDto'; - -/** - * - * @export - * @interface TraceRequestDto - */ -export interface TraceRequestDto { - /** - * - * @type {string} - * @memberof TraceRequestDto - */ - requestId: string; - /** - * - * @type {OptionsDto} - * @memberof TraceRequestDto - */ - options?: OptionsDto; - /** - * - * @type {DemandDto} - * @memberof TraceRequestDto - */ - demand: DemandDto; - /** - * - * @type {Array} - * @memberof TraceRequestDto - */ - globals?: Array; - /** - * - * @type {Array} - * @memberof TraceRequestDto - */ - datasources?: Array; -} - -/** - * Check if a given object implements the TraceRequestDto interface. - */ -export function instanceOfTraceRequestDto(value: object): value is TraceRequestDto { - if (!('requestId' in value) || value['requestId'] === undefined) return false; - if (!('demand' in value) || value['demand'] === undefined) return false; - return true; -} - -export function TraceRequestDtoFromJSON(json: any): TraceRequestDto { - return TraceRequestDtoFromJSONTyped(json, false); -} - -export function TraceRequestDtoFromJSONTyped(json: any, ignoreDiscriminator: boolean): TraceRequestDto { - if (json == null) { - return json; - } - return { - - 'requestId': json['requestId'], - 'options': json['options'] == null ? undefined : OptionsDtoFromJSON(json['options']), - 'demand': DemandDtoFromJSON(json['demand']), - 'globals': json['globals'] == null ? undefined : ((json['globals'] as Array).map(ParameterDtoFromJSON)), - 'datasources': json['datasources'] == null ? undefined : ((json['datasources'] as Array).map(DatasourceDtoFromJSON)), - }; -} - -export function TraceRequestDtoToJSON(value?: TraceRequestDto | null): any { - if (value == null) { - return value; - } - return { - - 'requestId': value['requestId'], - 'options': OptionsDtoToJSON(value['options']), - 'demand': DemandDtoToJSON(value['demand']), - 'globals': value['globals'] == null ? undefined : ((value['globals'] as Array).map(ParameterDtoToJSON)), - 'datasources': value['datasources'] == null ? undefined : ((value['datasources'] as Array).map(DatasourceDtoToJSON)), - }; -} - diff --git a/scripts/load-testing/models/TraceRequestListDto.ts b/scripts/load-testing/models/TraceRequestListDto.ts deleted file mode 100644 index fdcf77f..0000000 --- a/scripts/load-testing/models/TraceRequestListDto.ts +++ /dev/null @@ -1,68 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** - * Cloud Assess - * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - * - * The version of the OpenAPI document: 1.6.5 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - -import { mapValues } from '../runtime'; -import type { TraceRequestDto } from './TraceRequestDto'; -import { - TraceRequestDtoFromJSON, - TraceRequestDtoFromJSONTyped, - TraceRequestDtoToJSON, -} from './TraceRequestDto'; - -/** - * - * @export - * @interface TraceRequestListDto - */ -export interface TraceRequestListDto { - /** - * - * @type {Array} - * @memberof TraceRequestListDto - */ - elements: Array; -} - -/** - * Check if a given object implements the TraceRequestListDto interface. - */ -export function instanceOfTraceRequestListDto(value: object): value is TraceRequestListDto { - if (!('elements' in value) || value['elements'] === undefined) return false; - return true; -} - -export function TraceRequestListDtoFromJSON(json: any): TraceRequestListDto { - return TraceRequestListDtoFromJSONTyped(json, false); -} - -export function TraceRequestListDtoFromJSONTyped(json: any, ignoreDiscriminator: boolean): TraceRequestListDto { - if (json == null) { - return json; - } - return { - - 'elements': ((json['elements'] as Array).map(TraceRequestDtoFromJSON)), - }; -} - -export function TraceRequestListDtoToJSON(value?: TraceRequestListDto | null): any { - if (value == null) { - return value; - } - return { - - 'elements': ((value['elements'] as Array).map(TraceRequestDtoToJSON)), - }; -} - diff --git a/scripts/load-testing/models/TraceResponseDto.ts b/scripts/load-testing/models/TraceResponseDto.ts deleted file mode 100644 index 5a0e775..0000000 --- a/scripts/load-testing/models/TraceResponseDto.ts +++ /dev/null @@ -1,75 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** - * Cloud Assess - * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - * - * The version of the OpenAPI document: 1.6.5 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - -import { mapValues } from '../runtime'; -import type { TraceResponseRowDto } from './TraceResponseRowDto'; -import { - TraceResponseRowDtoFromJSON, - TraceResponseRowDtoFromJSONTyped, - TraceResponseRowDtoToJSON, -} from './TraceResponseRowDto'; - -/** - * - * @export - * @interface TraceResponseDto - */ -export interface TraceResponseDto { - /** - * - * @type {string} - * @memberof TraceResponseDto - */ - requestId?: string; - /** - * - * @type {Array} - * @memberof TraceResponseDto - */ - trace?: Array; -} - -/** - * Check if a given object implements the TraceResponseDto interface. - */ -export function instanceOfTraceResponseDto(value: object): value is TraceResponseDto { - return true; -} - -export function TraceResponseDtoFromJSON(json: any): TraceResponseDto { - return TraceResponseDtoFromJSONTyped(json, false); -} - -export function TraceResponseDtoFromJSONTyped(json: any, ignoreDiscriminator: boolean): TraceResponseDto { - if (json == null) { - return json; - } - return { - - 'requestId': json['requestId'] == null ? undefined : json['requestId'], - 'trace': json['trace'] == null ? undefined : ((json['trace'] as Array).map(TraceResponseRowDtoFromJSON)), - }; -} - -export function TraceResponseDtoToJSON(value?: TraceResponseDto | null): any { - if (value == null) { - return value; - } - return { - - 'requestId': value['requestId'], - 'trace': value['trace'] == null ? undefined : ((value['trace'] as Array).map(TraceResponseRowDtoToJSON)), - }; -} - diff --git a/scripts/load-testing/models/TraceResponseListDto.ts b/scripts/load-testing/models/TraceResponseListDto.ts deleted file mode 100644 index 52ff167..0000000 --- a/scripts/load-testing/models/TraceResponseListDto.ts +++ /dev/null @@ -1,67 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** - * Cloud Assess - * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - * - * The version of the OpenAPI document: 1.6.5 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - -import { mapValues } from '../runtime'; -import type { TraceResponseDto } from './TraceResponseDto'; -import { - TraceResponseDtoFromJSON, - TraceResponseDtoFromJSONTyped, - TraceResponseDtoToJSON, -} from './TraceResponseDto'; - -/** - * - * @export - * @interface TraceResponseListDto - */ -export interface TraceResponseListDto { - /** - * - * @type {Array} - * @memberof TraceResponseListDto - */ - elements?: Array; -} - -/** - * Check if a given object implements the TraceResponseListDto interface. - */ -export function instanceOfTraceResponseListDto(value: object): value is TraceResponseListDto { - return true; -} - -export function TraceResponseListDtoFromJSON(json: any): TraceResponseListDto { - return TraceResponseListDtoFromJSONTyped(json, false); -} - -export function TraceResponseListDtoFromJSONTyped(json: any, ignoreDiscriminator: boolean): TraceResponseListDto { - if (json == null) { - return json; - } - return { - - 'elements': json['elements'] == null ? undefined : ((json['elements'] as Array).map(TraceResponseDtoFromJSON)), - }; -} - -export function TraceResponseListDtoToJSON(value?: TraceResponseListDto | null): any { - if (value == null) { - return value; - } - return { - - 'elements': value['elements'] == null ? undefined : ((value['elements'] as Array).map(TraceResponseDtoToJSON)), - }; -} - diff --git a/scripts/load-testing/models/TraceResponseRowDto.ts b/scripts/load-testing/models/TraceResponseRowDto.ts deleted file mode 100644 index a558226..0000000 --- a/scripts/load-testing/models/TraceResponseRowDto.ts +++ /dev/null @@ -1,150 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** - * Cloud Assess - * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - * - * The version of the OpenAPI document: 1.6.5 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - -import { mapValues } from '../runtime'; -import type { QuantityDto } from './QuantityDto'; -import { - QuantityDtoFromJSON, - QuantityDtoFromJSONTyped, - QuantityDtoToJSON, -} from './QuantityDto'; -import type { ProcessLabelDto } from './ProcessLabelDto'; -import { - ProcessLabelDtoFromJSON, - ProcessLabelDtoFromJSONTyped, - ProcessLabelDtoToJSON, -} from './ProcessLabelDto'; -import type { ImpactsDto } from './ImpactsDto'; -import { - ImpactsDtoFromJSON, - ImpactsDtoFromJSONTyped, - ImpactsDtoToJSON, -} from './ImpactsDto'; -import type { ParameterDto } from './ParameterDto'; -import { - ParameterDtoFromJSON, - ParameterDtoFromJSONTyped, - ParameterDtoToJSON, -} from './ParameterDto'; - -/** - * - * @export - * @interface TraceResponseRowDto - */ -export interface TraceResponseRowDto { - /** - * - * @type {number} - * @memberof TraceResponseRowDto - */ - depth: number; - /** - * - * @type {string} - * @memberof TraceResponseRowDto - */ - name?: string; - /** - * - * @type {string} - * @memberof TraceResponseRowDto - */ - processName?: string; - /** - * - * @type {Array} - * @memberof TraceResponseRowDto - */ - params?: Array; - /** - * - * @type {Array} - * @memberof TraceResponseRowDto - */ - labels?: Array; - /** - * - * @type {string} - * @memberof TraceResponseRowDto - */ - compartment?: string; - /** - * - * @type {string} - * @memberof TraceResponseRowDto - */ - subCompartment?: string; - /** - * - * @type {QuantityDto} - * @memberof TraceResponseRowDto - */ - supply?: QuantityDto; - /** - * - * @type {ImpactsDto} - * @memberof TraceResponseRowDto - */ - impacts?: ImpactsDto; -} - -/** - * Check if a given object implements the TraceResponseRowDto interface. - */ -export function instanceOfTraceResponseRowDto(value: object): value is TraceResponseRowDto { - if (!('depth' in value) || value['depth'] === undefined) return false; - return true; -} - -export function TraceResponseRowDtoFromJSON(json: any): TraceResponseRowDto { - return TraceResponseRowDtoFromJSONTyped(json, false); -} - -export function TraceResponseRowDtoFromJSONTyped(json: any, ignoreDiscriminator: boolean): TraceResponseRowDto { - if (json == null) { - return json; - } - return { - - 'depth': json['depth'], - 'name': json['name'] == null ? undefined : json['name'], - 'processName': json['processName'] == null ? undefined : json['processName'], - 'params': json['params'] == null ? undefined : ((json['params'] as Array).map(ParameterDtoFromJSON)), - 'labels': json['labels'] == null ? undefined : ((json['labels'] as Array).map(ProcessLabelDtoFromJSON)), - 'compartment': json['compartment'] == null ? undefined : json['compartment'], - 'subCompartment': json['subCompartment'] == null ? undefined : json['subCompartment'], - 'supply': json['supply'] == null ? undefined : QuantityDtoFromJSON(json['supply']), - 'impacts': json['impacts'] == null ? undefined : ImpactsDtoFromJSON(json['impacts']), - }; -} - -export function TraceResponseRowDtoToJSON(value?: TraceResponseRowDto | null): any { - if (value == null) { - return value; - } - return { - - 'depth': value['depth'], - 'name': value['name'], - 'processName': value['processName'], - 'params': value['params'] == null ? undefined : ((value['params'] as Array).map(ParameterDtoToJSON)), - 'labels': value['labels'] == null ? undefined : ((value['labels'] as Array).map(ProcessLabelDtoToJSON)), - 'compartment': value['compartment'], - 'subCompartment': value['subCompartment'], - 'supply': QuantityDtoToJSON(value['supply']), - 'impacts': ImpactsDtoToJSON(value['impacts']), - }; -} - diff --git a/scripts/load-testing/models/VCPUUnitsDto.ts b/scripts/load-testing/models/VCPUUnitsDto.ts deleted file mode 100644 index 574c08f..0000000 --- a/scripts/load-testing/models/VCPUUnitsDto.ts +++ /dev/null @@ -1,37 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** - * Cloud Assess - * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - * - * The version of the OpenAPI document: 1.6.5 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - - -/** - * - * @export - */ -export const VCPUUnitsDto = { - VCpu: 'vCPU' -} as const; -export type VCPUUnitsDto = typeof VCPUUnitsDto[keyof typeof VCPUUnitsDto]; - - -export function VCPUUnitsDtoFromJSON(json: any): VCPUUnitsDto { - return VCPUUnitsDtoFromJSONTyped(json, false); -} - -export function VCPUUnitsDtoFromJSONTyped(json: any, ignoreDiscriminator: boolean): VCPUUnitsDto { - return json as VCPUUnitsDto; -} - -export function VCPUUnitsDtoToJSON(value?: VCPUUnitsDto | null): any { - return value as any; -} - diff --git a/scripts/load-testing/models/VirtualMachineAssessmentDto.ts b/scripts/load-testing/models/VirtualMachineAssessmentDto.ts deleted file mode 100644 index f1f79b0..0000000 --- a/scripts/load-testing/models/VirtualMachineAssessmentDto.ts +++ /dev/null @@ -1,98 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** - * Cloud Assess - * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - * - * The version of the OpenAPI document: 1.6.5 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - -import { mapValues } from '../runtime'; -import type { VirtualMachineDto } from './VirtualMachineDto'; -import { - VirtualMachineDtoFromJSON, - VirtualMachineDtoFromJSONTyped, - VirtualMachineDtoToJSON, -} from './VirtualMachineDto'; -import type { QuantityTimeDto } from './QuantityTimeDto'; -import { - QuantityTimeDtoFromJSON, - QuantityTimeDtoFromJSONTyped, - QuantityTimeDtoToJSON, -} from './QuantityTimeDto'; -import type { ImpactsDto } from './ImpactsDto'; -import { - ImpactsDtoFromJSON, - ImpactsDtoFromJSONTyped, - ImpactsDtoToJSON, -} from './ImpactsDto'; - -/** - * - * @export - * @interface VirtualMachineAssessmentDto - */ -export interface VirtualMachineAssessmentDto { - /** - * - * @type {QuantityTimeDto} - * @memberof VirtualMachineAssessmentDto - */ - period: QuantityTimeDto; - /** - * - * @type {VirtualMachineDto} - * @memberof VirtualMachineAssessmentDto - */ - request: VirtualMachineDto; - /** - * - * @type {ImpactsDto} - * @memberof VirtualMachineAssessmentDto - */ - impacts: ImpactsDto; -} - -/** - * Check if a given object implements the VirtualMachineAssessmentDto interface. - */ -export function instanceOfVirtualMachineAssessmentDto(value: object): value is VirtualMachineAssessmentDto { - if (!('period' in value) || value['period'] === undefined) return false; - if (!('request' in value) || value['request'] === undefined) return false; - if (!('impacts' in value) || value['impacts'] === undefined) return false; - return true; -} - -export function VirtualMachineAssessmentDtoFromJSON(json: any): VirtualMachineAssessmentDto { - return VirtualMachineAssessmentDtoFromJSONTyped(json, false); -} - -export function VirtualMachineAssessmentDtoFromJSONTyped(json: any, ignoreDiscriminator: boolean): VirtualMachineAssessmentDto { - if (json == null) { - return json; - } - return { - - 'period': QuantityTimeDtoFromJSON(json['period']), - 'request': VirtualMachineDtoFromJSON(json['request']), - 'impacts': ImpactsDtoFromJSON(json['impacts']), - }; -} - -export function VirtualMachineAssessmentDtoToJSON(value?: VirtualMachineAssessmentDto | null): any { - if (value == null) { - return value; - } - return { - - 'period': QuantityTimeDtoToJSON(value['period']), - 'request': VirtualMachineDtoToJSON(value['request']), - 'impacts': ImpactsDtoToJSON(value['impacts']), - }; -} - diff --git a/scripts/load-testing/models/VirtualMachineDto.ts b/scripts/load-testing/models/VirtualMachineDto.ts deleted file mode 100644 index b4c470c..0000000 --- a/scripts/load-testing/models/VirtualMachineDto.ts +++ /dev/null @@ -1,119 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** - * Cloud Assess - * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - * - * The version of the OpenAPI document: 1.6.5 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - -import { mapValues } from '../runtime'; -import type { QuantityVCPUDto } from './QuantityVCPUDto'; -import { - QuantityVCPUDtoFromJSON, - QuantityVCPUDtoFromJSONTyped, - QuantityVCPUDtoToJSON, -} from './QuantityVCPUDto'; -import type { QuantityMemoryDto } from './QuantityMemoryDto'; -import { - QuantityMemoryDtoFromJSON, - QuantityMemoryDtoFromJSONTyped, - QuantityMemoryDtoToJSON, -} from './QuantityMemoryDto'; - -/** - * - * @export - * @interface VirtualMachineDto - */ -export interface VirtualMachineDto { - /** - * - * @type {string} - * @memberof VirtualMachineDto - */ - id: string; - /** - * - * @type {string} - * @memberof VirtualMachineDto - */ - poolId: string; - /** - * - * @type {QuantityMemoryDto} - * @memberof VirtualMachineDto - */ - ram: QuantityMemoryDto; - /** - * - * @type {QuantityMemoryDto} - * @memberof VirtualMachineDto - */ - storage: QuantityMemoryDto; - /** - * - * @type {QuantityVCPUDto} - * @memberof VirtualMachineDto - */ - vcpu: QuantityVCPUDto; - /** - * - * @type {{ [key: string]: string; }} - * @memberof VirtualMachineDto - */ - meta: { [key: string]: string; }; -} - -/** - * Check if a given object implements the VirtualMachineDto interface. - */ -export function instanceOfVirtualMachineDto(value: object): value is VirtualMachineDto { - if (!('id' in value) || value['id'] === undefined) return false; - if (!('poolId' in value) || value['poolId'] === undefined) return false; - if (!('ram' in value) || value['ram'] === undefined) return false; - if (!('storage' in value) || value['storage'] === undefined) return false; - if (!('vcpu' in value) || value['vcpu'] === undefined) return false; - if (!('meta' in value) || value['meta'] === undefined) return false; - return true; -} - -export function VirtualMachineDtoFromJSON(json: any): VirtualMachineDto { - return VirtualMachineDtoFromJSONTyped(json, false); -} - -export function VirtualMachineDtoFromJSONTyped(json: any, ignoreDiscriminator: boolean): VirtualMachineDto { - if (json == null) { - return json; - } - return { - - 'id': json['id'], - 'poolId': json['pool_id'], - 'ram': QuantityMemoryDtoFromJSON(json['ram']), - 'storage': QuantityMemoryDtoFromJSON(json['storage']), - 'vcpu': QuantityVCPUDtoFromJSON(json['vcpu']), - 'meta': json['meta'], - }; -} - -export function VirtualMachineDtoToJSON(value?: VirtualMachineDto | null): any { - if (value == null) { - return value; - } - return { - - 'id': value['id'], - 'pool_id': value['poolId'], - 'ram': QuantityMemoryDtoToJSON(value['ram']), - 'storage': QuantityMemoryDtoToJSON(value['storage']), - 'vcpu': QuantityVCPUDtoToJSON(value['vcpu']), - 'meta': value['meta'], - }; -} - diff --git a/scripts/load-testing/models/VirtualMachineListAssessmentDto.ts b/scripts/load-testing/models/VirtualMachineListAssessmentDto.ts deleted file mode 100644 index df82bec..0000000 --- a/scripts/load-testing/models/VirtualMachineListAssessmentDto.ts +++ /dev/null @@ -1,68 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** - * Cloud Assess - * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - * - * The version of the OpenAPI document: 1.6.5 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - -import { mapValues } from '../runtime'; -import type { VirtualMachineAssessmentDto } from './VirtualMachineAssessmentDto'; -import { - VirtualMachineAssessmentDtoFromJSON, - VirtualMachineAssessmentDtoFromJSONTyped, - VirtualMachineAssessmentDtoToJSON, -} from './VirtualMachineAssessmentDto'; - -/** - * - * @export - * @interface VirtualMachineListAssessmentDto - */ -export interface VirtualMachineListAssessmentDto { - /** - * - * @type {Array} - * @memberof VirtualMachineListAssessmentDto - */ - virtualMachines: Array; -} - -/** - * Check if a given object implements the VirtualMachineListAssessmentDto interface. - */ -export function instanceOfVirtualMachineListAssessmentDto(value: object): value is VirtualMachineListAssessmentDto { - if (!('virtualMachines' in value) || value['virtualMachines'] === undefined) return false; - return true; -} - -export function VirtualMachineListAssessmentDtoFromJSON(json: any): VirtualMachineListAssessmentDto { - return VirtualMachineListAssessmentDtoFromJSONTyped(json, false); -} - -export function VirtualMachineListAssessmentDtoFromJSONTyped(json: any, ignoreDiscriminator: boolean): VirtualMachineListAssessmentDto { - if (json == null) { - return json; - } - return { - - 'virtualMachines': ((json['virtual_machines'] as Array).map(VirtualMachineAssessmentDtoFromJSON)), - }; -} - -export function VirtualMachineListAssessmentDtoToJSON(value?: VirtualMachineListAssessmentDto | null): any { - if (value == null) { - return value; - } - return { - - 'virtual_machines': ((value['virtualMachines'] as Array).map(VirtualMachineAssessmentDtoToJSON)), - }; -} - diff --git a/scripts/load-testing/models/VirtualMachineListDto.ts b/scripts/load-testing/models/VirtualMachineListDto.ts deleted file mode 100644 index b31c54e..0000000 --- a/scripts/load-testing/models/VirtualMachineListDto.ts +++ /dev/null @@ -1,83 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** - * Cloud Assess - * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - * - * The version of the OpenAPI document: 1.6.5 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - -import { mapValues } from '../runtime'; -import type { VirtualMachineDto } from './VirtualMachineDto'; -import { - VirtualMachineDtoFromJSON, - VirtualMachineDtoFromJSONTyped, - VirtualMachineDtoToJSON, -} from './VirtualMachineDto'; -import type { QuantityTimeDto } from './QuantityTimeDto'; -import { - QuantityTimeDtoFromJSON, - QuantityTimeDtoFromJSONTyped, - QuantityTimeDtoToJSON, -} from './QuantityTimeDto'; - -/** - * - * @export - * @interface VirtualMachineListDto - */ -export interface VirtualMachineListDto { - /** - * - * @type {QuantityTimeDto} - * @memberof VirtualMachineListDto - */ - period: QuantityTimeDto; - /** - * - * @type {Array} - * @memberof VirtualMachineListDto - */ - virtualMachines: Array; -} - -/** - * Check if a given object implements the VirtualMachineListDto interface. - */ -export function instanceOfVirtualMachineListDto(value: object): value is VirtualMachineListDto { - if (!('period' in value) || value['period'] === undefined) return false; - if (!('virtualMachines' in value) || value['virtualMachines'] === undefined) return false; - return true; -} - -export function VirtualMachineListDtoFromJSON(json: any): VirtualMachineListDto { - return VirtualMachineListDtoFromJSONTyped(json, false); -} - -export function VirtualMachineListDtoFromJSONTyped(json: any, ignoreDiscriminator: boolean): VirtualMachineListDto { - if (json == null) { - return json; - } - return { - - 'period': QuantityTimeDtoFromJSON(json['period']), - 'virtualMachines': ((json['virtual_machines'] as Array).map(VirtualMachineDtoFromJSON)), - }; -} - -export function VirtualMachineListDtoToJSON(value?: VirtualMachineListDto | null): any { - if (value == null) { - return value; - } - return { - - 'period': QuantityTimeDtoToJSON(value['period']), - 'virtual_machines': ((value['virtualMachines'] as Array).map(VirtualMachineDtoToJSON)), - }; -} - diff --git a/scripts/load-testing/openapitools.json b/scripts/load-testing/openapitools.json deleted file mode 100644 index 5c50d6a..0000000 --- a/scripts/load-testing/openapitools.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "$schema": "./node_modules/@openapitools/openapi-generator-cli/config.schema.json", - "spaces": 2, - "generator-cli": { - "version": "7.6.0" - } -} diff --git a/scripts/load-testing/package-lock.json b/scripts/load-testing/package-lock.json deleted file mode 100644 index cd64edc..0000000 --- a/scripts/load-testing/package-lock.json +++ /dev/null @@ -1,5007 +0,0 @@ -{ - "name": "load-testing", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "load-testing", - "version": "1.0.0", - "license": "ISC", - "dependencies": { - "axios": "^1.7.3" - }, - "devDependencies": { - "@openapitools/openapi-generator-cli": "^2.13.4", - "@types/jest": "^29.5.12", - "jest": "^29.7.0", - "ts-jest": "^29.2.4", - "typescript": "^5.5.4" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.24.7", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz", - "integrity": "sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", - "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.0", - "@babel/helper-compilation-targets": "^7.25.2", - "@babel/helper-module-transforms": "^7.25.2", - "@babel/helpers": "^7.25.0", - "@babel/parser": "^7.25.0", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.2", - "@babel/types": "^7.25.2", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", - "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.25.0", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", - "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.25.2", - "@babel/helper-validator-option": "^7.24.8", - "browserslist": "^4.23.1", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", - "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", - "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7", - "@babel/traverse": "^7.25.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", - "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", - "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", - "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", - "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz", - "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/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, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/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, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/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, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/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, - "license": "MIT" - }, - "node_modules/@babel/highlight/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, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/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, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz", - "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.25.2" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", - "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz", - "integrity": "sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", - "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", - "dev": true, - "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", - "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.25.0", - "@babel/types": "^7.25.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.3.tgz", - "integrity": "sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.0", - "@babel/parser": "^7.25.3", - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.2", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz", - "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "jest-get-type": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@lukeed/csprng": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@lukeed/csprng/-/csprng-1.1.0.tgz", - "integrity": "sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@nestjs/axios": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@nestjs/axios/-/axios-3.0.2.tgz", - "integrity": "sha512-Z6GuOUdNQjP7FX+OuV2Ybyamse+/e0BFdTWBX5JxpBDKA+YkdLynDgG6HTF04zy6e9zPa19UX0WA2VDoehwhXQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@nestjs/common": "^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0", - "axios": "^1.3.1", - "rxjs": "^6.0.0 || ^7.0.0" - } - }, - "node_modules/@nestjs/common": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-10.3.0.tgz", - "integrity": "sha512-DGv34UHsZBxCM3H5QGE2XE/+oLJzz5+714JQjBhjD9VccFlQs3LRxo/epso4l7nJIiNlZkPyIUC8WzfU/5RTsQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "iterare": "1.2.1", - "tslib": "2.6.2", - "uid": "2.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nest" - }, - "peerDependencies": { - "class-transformer": "*", - "class-validator": "*", - "reflect-metadata": "^0.1.12", - "rxjs": "^7.1.0" - }, - "peerDependenciesMeta": { - "class-transformer": { - "optional": true - }, - "class-validator": { - "optional": true - } - } - }, - "node_modules/@nestjs/core": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-10.3.0.tgz", - "integrity": "sha512-N06P5ncknW/Pm8bj964WvLIZn2gNhHliCBoAO1LeBvNImYkecqKcrmLbY49Fa1rmMfEM3MuBHeDys3edeuYAOA==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@nuxtjs/opencollective": "0.3.2", - "fast-safe-stringify": "2.1.1", - "iterare": "1.2.1", - "path-to-regexp": "3.2.0", - "tslib": "2.6.2", - "uid": "2.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nest" - }, - "peerDependencies": { - "@nestjs/common": "^10.0.0", - "@nestjs/microservices": "^10.0.0", - "@nestjs/platform-express": "^10.0.0", - "@nestjs/websockets": "^10.0.0", - "reflect-metadata": "^0.1.12", - "rxjs": "^7.1.0" - }, - "peerDependenciesMeta": { - "@nestjs/microservices": { - "optional": true - }, - "@nestjs/platform-express": { - "optional": true - }, - "@nestjs/websockets": { - "optional": true - } - } - }, - "node_modules/@nuxtjs/opencollective": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@nuxtjs/opencollective/-/opencollective-0.3.2.tgz", - "integrity": "sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "consola": "^2.15.0", - "node-fetch": "^2.6.1" - }, - "bin": { - "opencollective": "bin/opencollective.js" - }, - "engines": { - "node": ">=8.0.0", - "npm": ">=5.0.0" - } - }, - "node_modules/@openapitools/openapi-generator-cli": { - "version": "2.13.4", - "resolved": "https://registry.npmjs.org/@openapitools/openapi-generator-cli/-/openapi-generator-cli-2.13.4.tgz", - "integrity": "sha512-4JKyrk55ohQK2FcuZbPdNvxdyXD14jjOIvE8hYjJ+E1cHbRbfXQXbYnjTODFE52Gx8eAxz8C9icuhDYDLn7nww==", - "dev": true, - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@nestjs/axios": "3.0.2", - "@nestjs/common": "10.3.0", - "@nestjs/core": "10.3.0", - "@nuxtjs/opencollective": "0.3.2", - "axios": "1.6.8", - "chalk": "4.1.2", - "commander": "8.3.0", - "compare-versions": "4.1.4", - "concurrently": "6.5.1", - "console.table": "0.10.0", - "fs-extra": "10.1.0", - "glob": "7.2.3", - "https-proxy-agent": "7.0.4", - "inquirer": "8.2.6", - "lodash": "4.17.21", - "reflect-metadata": "0.1.13", - "rxjs": "7.8.1", - "tslib": "2.6.2" - }, - "bin": { - "openapi-generator-cli": "main.js" - }, - "engines": { - "node": ">=10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/openapi_generator" - } - }, - "node_modules/@openapitools/openapi-generator-cli/node_modules/axios": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", - "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^3.0.0" - } - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", - "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/jest": { - "version": "29.5.12", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", - "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, - "node_modules/@types/node": { - "version": "22.1.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.1.0.tgz", - "integrity": "sha512-AOmuRF0R2/5j1knA3c6G3HOk523Ga+l+ZXltX8SF1+5oqcXijjfTd8fY3XRZqSihEu9XhtQnKYLmkFaoxgsJHw==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.13.0" - } - }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "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, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/async": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", - "dev": true, - "license": "MIT" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/axios": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.3.tgz", - "integrity": "sha512-Ar7ND9pU99eJ9GpoGQKhKf58GpUOgnzuaB7ueNQ5BMi0p+LZ5oaEnfF999fAArcTIBwXTCHAmGcHOZJaWPq9Nw==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "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, - "license": "MIT" - }, - "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==", - "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" - } - ], - "license": "MIT" - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.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, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", - "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "caniuse-lite": "^1.0.30001646", - "electron-to-chromium": "^1.5.4", - "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-json-stable-stringify": "2.x" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "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" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, - "license": "MIT" - }, - "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, - "license": "MIT", - "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, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001651", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz", - "integrity": "sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "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, - "license": "MIT", - "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/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true, - "license": "MIT" - }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cjs-module-lexer": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz", - "integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 10" - } - }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "dev": true, - "license": "MIT" - }, - "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, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "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, - "license": "MIT" - }, - "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==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "node_modules/compare-versions": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-4.1.4.tgz", - "integrity": "sha512-FemMreK9xNyL8gQevsdRMrvO4lFCkQP7qbuktn1q8ndcNk1+0mz7lgE7b/sNvbhVgY4w6tMN1FDp6aADjqw2rw==", - "dev": true, - "license": "MIT" - }, - "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, - "license": "MIT" - }, - "node_modules/concurrently": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-6.5.1.tgz", - "integrity": "sha512-FlSwNpGjWQfRwPLXvJ/OgysbBxPkWpiVjy1042b0U7on7S7qwwMIILRj7WTN1mTgqa582bG6NFuScOoh6Zgdag==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "date-fns": "^2.16.1", - "lodash": "^4.17.21", - "rxjs": "^6.6.3", - "spawn-command": "^0.0.2-1", - "supports-color": "^8.1.0", - "tree-kill": "^1.2.2", - "yargs": "^16.2.0" - }, - "bin": { - "concurrently": "bin/concurrently.js" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/concurrently/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/concurrently/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/concurrently/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, - "license": "0BSD" - }, - "node_modules/consola": { - "version": "2.15.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", - "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==", - "dev": true, - "license": "MIT" - }, - "node_modules/console.table": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/console.table/-/console.table-0.10.0.tgz", - "integrity": "sha512-dPyZofqggxuvSf7WXvNjuRfnsOk1YazkVP8FdxH4tcH2c37wc79/Yl6Bhr7Lsu00KMgy2ql/qCMuNu8xctZM8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "easy-table": "1.1.0" - }, - "engines": { - "node": "> 0.10" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - }, - "bin": { - "create-jest": "bin/create-jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "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, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/date-fns": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", - "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.21.0" - }, - "engines": { - "node": ">=0.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/date-fns" - } - }, - "node_modules/debug": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/dedent": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", - "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" - }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/easy-table": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/easy-table/-/easy-table-1.1.0.tgz", - "integrity": "sha512-oq33hWOSSnl2Hoh00tZWaIPi1ievrD9aFG82/IgjlycAnW9hHx5PkJiXpxPsgEE+H7BsbVQXFVFST8TEXS6/pA==", - "dev": true, - "license": "MIT", - "optionalDependencies": { - "wcwidth": ">=1.0.1" - } - }, - "node_modules/ejs": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", - "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.5.tgz", - "integrity": "sha512-QR7/A7ZkMS8tZuoftC/jfqNkZLQO779SSW3YuZHP4eXpj3EffGLFcB/Xu9AAZQzLccTiCV+EmUo3ha4mQ9wnlA==", - "dev": true, - "license": "ISC" - }, - "node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "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, - "license": "MIT" - }, - "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, - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", - "dev": true, - "license": "MIT", - "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, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "license": "MIT", - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "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, - "license": "MIT" - }, - "node_modules/fast-safe-stringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", - "dev": true, - "license": "MIT" - }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "minimatch": "^5.0.1" - } - }, - "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "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, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "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==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "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, - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "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/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, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "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, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true, - "license": "MIT" - }, - "node_modules/https-proxy-agent": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", - "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.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==", - "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" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/import-local": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", - "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", - "dev": true, - "license": "MIT", - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "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==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "license": "ISC", - "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==", - "dev": true, - "license": "ISC" - }, - "node_modules/inquirer": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.6.tgz", - "integrity": "sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.1", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.21", - "mute-stream": "0.0.8", - "ora": "^5.4.1", - "run-async": "^2.4.0", - "rxjs": "^7.5.5", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6", - "wrap-ansi": "^6.0.1" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "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, - "license": "MIT" - }, - "node_modules/is-core-module": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", - "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "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, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", - "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.23.9", - "@babel/parser": "^7.23.9", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/iterare": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/iterare/-/iterare-1.2.1.tgz", - "integrity": "sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=6" - } - }, - "node_modules/jake": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", - "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.4", - "minimatch": "^3.1.2" - }, - "bin": { - "jake": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", - "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/types": "^29.6.3", - "import-local": "^3.0.2", - "jest-cli": "^29.7.0" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", - "dev": true, - "license": "MIT", - "dependencies": { - "execa": "^5.0.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "create-jest": "^29.7.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "yargs": "^17.3.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-cli/node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/jest-cli/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/jest-cli/node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/jest-cli/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", - "dev": true, - "license": "MIT", - "dependencies": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", - "dev": true, - "license": "MIT", - "dependencies": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", - "semver": "^7.5.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.7.0", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "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==", - "dev": true, - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "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, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "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, - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "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, - "license": "MIT" - }, - "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, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true, - "license": "MIT" - }, - "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, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "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==", - "dev": true, - "license": "ISC" - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true, - "license": "MIT" - }, - "node_modules/micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "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==", - "license": "MIT", - "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==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "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, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "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==", - "dev": true, - "license": "MIT" - }, - "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true, - "license": "ISC" - }, - "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, - "license": "MIT" - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", - "dev": true, - "license": "MIT" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=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==", - "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "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, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-locate/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, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "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, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "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, - "license": "MIT", - "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/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, - "license": "MIT", - "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, - "license": "MIT", - "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, - "license": "MIT", - "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, - "license": "MIT" - }, - "node_modules/path-to-regexp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.2.0.tgz", - "integrity": "sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==", - "dev": true, - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" - }, - "node_modules/pure-rand": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", - "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ], - "license": "MIT" - }, - "node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "license": "MIT" - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/reflect-metadata": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true, - "license": "MIT" - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve.exports": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "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" - } - ], - "license": "MIT" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "license": "MIT" - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "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, - "license": "MIT", - "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, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "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, - "license": "ISC" - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true, - "license": "MIT" - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "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, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/spawn-command": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz", - "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==", - "dev": true - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "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, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "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, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "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, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "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, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true, - "license": "MIT" - }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true, - "license": "BSD-3-Clause" - }, - "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, - "license": "MIT", - "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, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true, - "license": "MIT" - }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true, - "license": "MIT", - "bin": { - "tree-kill": "cli.js" - } - }, - "node_modules/ts-jest": { - "version": "29.2.4", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.2.4.tgz", - "integrity": "sha512-3d6tgDyhCI29HlpwIq87sNuI+3Q6GLTTCeYRHCs7vDz+/3GCMwEtV9jezLyl4ZtnBgx00I7hm8PCP8cTksMGrw==", - "dev": true, - "license": "MIT", - "dependencies": { - "bs-logger": "0.x", - "ejs": "^3.1.10", - "fast-json-stable-stringify": "2.x", - "jest-util": "^29.0.0", - "json5": "^2.2.3", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "^7.5.3", - "yargs-parser": "^21.0.1" - }, - "bin": { - "ts-jest": "cli.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "@babel/core": ">=7.0.0-beta.0 <8", - "@jest/transform": "^29.0.0", - "@jest/types": "^29.0.0", - "babel-jest": "^29.0.0", - "jest": "^29.0.0", - "typescript": ">=4.3 <6" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "@jest/transform": { - "optional": true - }, - "@jest/types": { - "optional": true - }, - "babel-jest": { - "optional": true - }, - "esbuild": { - "optional": true - } - } - }, - "node_modules/ts-jest/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ts-jest/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true, - "license": "0BSD" - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", - "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/uid": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/uid/-/uid-2.0.2.tgz", - "integrity": "sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@lukeed/csprng": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/undici-types": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.13.0.tgz", - "integrity": "sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg==", - "dev": true, - "license": "MIT" - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", - "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.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, - "license": "MIT" - }, - "node_modules/v8-to-istanbul": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", - "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", - "dev": true, - "license": "ISC", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "license": "MIT", - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "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, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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==", - "dev": true, - "license": "ISC" - }, - "node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "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, - "license": "ISC", - "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, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/scripts/load-testing/package.json b/scripts/load-testing/package.json deleted file mode 100644 index 4225e47..0000000 --- a/scripts/load-testing/package.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "name": "load-testing", - "version": "1.0.0", - "main": "index.js", - "scripts": { - "compile": "tsc", - "generate:dtos": "openapi-generator-cli generate -i ../../openapi/api.yaml -g typescript-fetch -o . --global-property=models", - "test": "jest" - }, - "author": "", - "license": "ISC", - "description": "", - "devDependencies": { - "@openapitools/openapi-generator-cli": "^2.13.4", - "@types/jest": "^29.5.12", - "jest": "^29.7.0", - "ts-jest": "^29.2.4", - "typescript": "^5.5.4" - }, - "dependencies": { - "axios": "^1.7.3" - } -} diff --git a/scripts/load-testing/runtime.ts b/scripts/load-testing/runtime.ts deleted file mode 100644 index be14652..0000000 --- a/scripts/load-testing/runtime.ts +++ /dev/null @@ -1 +0,0 @@ -export function mapValues() {} \ No newline at end of file diff --git a/scripts/load-testing/tsconfig.json b/scripts/load-testing/tsconfig.json deleted file mode 100644 index f004a51..0000000 --- a/scripts/load-testing/tsconfig.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "compilerOptions": { - "module": "CommonJS", - "target": "ES2017", - "strict": true, - "outDir": "./built", - "sourceMap": true, - "resolveJsonModule": true, - "esModuleInterop": true, - }, - "include": [ - "**/*" - ], - "exclude": [ - "node_modules", - "**/*.spec.ts" - ] -} diff --git a/scripts/load-testing/vm.spec.ts b/scripts/load-testing/vm.spec.ts deleted file mode 100644 index 8bfad80..0000000 --- a/scripts/load-testing/vm.spec.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { VirtualMachineListDto, VirtualMachineListDtoToJSON } from './models/VirtualMachineListDto'; -import { VirtualMachineDto } from './models/VirtualMachineDto'; -import axios from 'axios'; -import { VCPUUnitsDto } from './models/VCPUUnitsDto'; -import { MemoryUnitsDto } from './models/MemoryUnitsDto'; - -function vm(id: number): VirtualMachineDto { - return { - id: `vm-${id}`, - meta: { - 'env': 'test', - }, - poolId: 'client_vm', - ram: { - amount: 32.0, - unit: MemoryUnitsDto.Gb, - }, - storage: { - amount: 1.0, - unit: MemoryUnitsDto.Tb, - }, - vcpu: { - amount: 8, - unit: VCPUUnitsDto.VCpu, - } - } as VirtualMachineDto -} - -function vms(n: number): VirtualMachineListDto { - return { - period: { - amount: 1.0, - unit: 'hour', - }, - virtualMachines: [...Array(n).keys()].map(idx => vm(idx)), - } -} - -describe('vm load testing', () => { - it('run', (done) => { - // given - const payload = vms(1000) - const options = { - method: 'POST', - url: 'http://localhost:8080/virtual_machines/assess', - headers: { - 'Content-Type': 'application/json', - }, - data: VirtualMachineListDtoToJSON(payload), - } - - // when - axios.request(options).then( (resp) => { - const { data } = resp - console.log(JSON.stringify(data, null, 4)) - done() - }).catch((err) => { - console.log(err) - fail(err) - }) - }, 60000) -}) diff --git a/src/main/kotlin/org/cloud_assess/config/LcaConfig.kt b/src/main/kotlin/org/cloud_assess/config/LcaConfig.kt index 096609d..a7777ae 100644 --- a/src/main/kotlin/org/cloud_assess/config/LcaConfig.kt +++ b/src/main/kotlin/org/cloud_assess/config/LcaConfig.kt @@ -5,7 +5,6 @@ import ch.kleis.lcaac.core.datasource.ConnectorFactory import ch.kleis.lcaac.core.datasource.DataSourceConnector import ch.kleis.lcaac.core.datasource.DefaultDataSourceOperations import ch.kleis.lcaac.core.datasource.cache.SourceOpsCache -import ch.kleis.lcaac.core.datasource.resilio_db.ResilioDbConnectorKeys import ch.kleis.lcaac.core.lang.SymbolTable import ch.kleis.lcaac.core.math.basic.BasicNumber import ch.kleis.lcaac.core.math.basic.BasicOperations @@ -73,13 +72,7 @@ class LcaConfig { yaml.decodeFromStream(LcaacConfig.serializer(), it) } else LcaacConfig() - val config = yamlConfig - .modifyConnector(ResilioDbConnectorKeys.RDB_CONNECTOR_NAME) { connector -> - connector - .modifyOption(ResilioDbConnectorKeys.RDB_URL) { rdbUrl } - .modifyOption(ResilioDbConnectorKeys.RDB_ACCESS_TOKEN) { rdbAccessToken } - } - return config + return yamlConfig } @Bean diff --git a/src/main/kotlin/org/cloud_assess/model/ResourceAnalysis.kt b/src/main/kotlin/org/cloud_assess/model/ResourceAnalysis.kt index 29600f4..48baa66 100644 --- a/src/main/kotlin/org/cloud_assess/model/ResourceAnalysis.kt +++ b/src/main/kotlin/org/cloud_assess/model/ResourceAnalysis.kt @@ -6,11 +6,9 @@ import ch.kleis.lcaac.core.lang.value.ProductValue import ch.kleis.lcaac.core.lang.value.QuantityValue import ch.kleis.lcaac.core.math.basic.BasicMatrix import ch.kleis.lcaac.core.math.basic.BasicNumber -import org.cloud_assess.dto.QuantityTimeDto class ResourceAnalysis( private val target: ProductMatcher, - val period: QuantityTimeDto, private val rawAnalysis: ContributionAnalysis, private val targetManufacturing: ProductMatcher = target .addLabel("phase", "embodied") diff --git a/src/main/kotlin/org/cloud_assess/service/AnalysisJobRunner.kt b/src/main/kotlin/org/cloud_assess/service/AnalysisJobRunner.kt deleted file mode 100644 index c827465..0000000 --- a/src/main/kotlin/org/cloud_assess/service/AnalysisJobRunner.kt +++ /dev/null @@ -1,40 +0,0 @@ -package org.cloud_assess.service - -import ch.kleis.lcaac.core.assessment.ContributionAnalysisProgram -import ch.kleis.lcaac.core.lang.evaluator.Evaluator -import ch.kleis.lcaac.core.lang.expression.EProcessTemplateApplication -import ch.kleis.lcaac.core.math.basic.BasicNumber -import org.cloud_assess.dto.QuantityTimeDto -import org.cloud_assess.model.ProductMatcher -import org.cloud_assess.model.ResourceAnalysis - -class AnalysisJobRunner( - private val jobSize: Int, - private val productMatcher: (String) -> ProductMatcher, - private val periodDto: QuantityTimeDto, - private val evaluator: Evaluator, - - ) { - fun run(cases: Map>): Map { - return cases.entries - .chunked(jobSize) - .parallelStream() - .map { job -> - job.map { - val trace = evaluator.with(it.value.template).trace(it.value.template, it.value.arguments) - val systemValue = trace.getSystemValue() - val entryPoint = trace.getEntryPoint() - val program = ContributionAnalysisProgram(systemValue, entryPoint) - val rawAnalysis = program.run() - mapOf( - it.key to ResourceAnalysis( - productMatcher(it.key), - periodDto, - rawAnalysis - ) - ) - }.fold(emptyMap()) { acc, element -> acc.plus(element) } - }.reduce { acc, element -> acc.plus(element) } - .orElse(emptyMap()) - } -} diff --git a/src/main/kotlin/org/cloud_assess/service/ComputeResourceService.kt b/src/main/kotlin/org/cloud_assess/service/ComputeResourceService.kt index ea2ce0f..18a6805 100644 --- a/src/main/kotlin/org/cloud_assess/service/ComputeResourceService.kt +++ b/src/main/kotlin/org/cloud_assess/service/ComputeResourceService.kt @@ -1,5 +1,6 @@ package org.cloud_assess.service +import ch.kleis.lcaac.core.assessment.ContributionAnalysisProgram import ch.kleis.lcaac.core.datasource.DefaultDataSourceOperations import ch.kleis.lcaac.core.datasource.in_memory.InMemoryConnector import ch.kleis.lcaac.core.datasource.in_memory.InMemoryConnectorKeys @@ -14,13 +15,10 @@ import ch.kleis.lcaac.core.math.basic.BasicOperations import org.cloud_assess.dto.ComputeResourceListDto import org.cloud_assess.model.ProductMatcher import org.cloud_assess.model.ResourceAnalysis -import org.springframework.beans.factory.annotation.Value import org.springframework.stereotype.Service @Service class ComputeResourceService( - @Value("\${COMPUTE_JOB_SIZE:100}") - private val jobSize: Int, private val parsingService: ParsingService, private val defaultDataSourceOperations: DefaultDataSourceOperations, private val symbolTable: SymbolTable, @@ -33,6 +31,7 @@ class ComputeResourceService( ) + @Suppress("DuplicatedCode") fun analyze(computeResources: ComputeResourceListDto): Map { val period = with(helper) { computeResources.period.toDataExpression() @@ -50,19 +49,29 @@ class ComputeResourceService( BasicOperations, sourceOps, ) - val jobRunner = AnalysisJobRunner( - jobSize = jobSize, - productMatcher = { id -> - ProductMatcher( - name = "compute", - process = "compute_fn", - arguments = mapOf("id" to id) + val productMatcher: (String) -> ProductMatcher = { id -> + ProductMatcher( + name = "compute", + process = "compute_fn", + arguments = mapOf("id" to id) + ) + } + val analysis = cases.entries + .map { + val arguments = it.value.arguments + val trace = evaluator.with(it.value.template) + .trace(it.value.template, arguments) + val systemValue = trace.getSystemValue() + val entryPoint = trace.getEntryPoint() + val program = ContributionAnalysisProgram(systemValue, entryPoint) + val rawAnalysis = program.run() + mapOf( + it.key to ResourceAnalysis( + productMatcher(it.key), + rawAnalysis + ) ) - }, - periodDto = computeResources.period, - evaluator = evaluator, - ) - val analysis = jobRunner.run(cases) + }.fold(emptyMap()) { acc, element -> acc.plus(element) } return analysis } @@ -93,6 +102,7 @@ class ComputeResourceService( private fun cases(computeResources: ComputeResourceListDto): Map> { val period = with(helper) { computeResources.period.toLcaac() } + val totalVcpu = with(helper) { computeResources.totalVcpu.toLcaac() } val cases = computeResources.computeResources.associate { val content = """ process __main__ { @@ -100,7 +110,7 @@ class ComputeResourceService( 1 u __main__ } inputs { - $period compute from compute_fn(id = "${it.id}") + $period compute from compute_fn(id = "${it.id}", total_vcpu = ${totalVcpu}) } } """.trimIndent() diff --git a/src/main/kotlin/org/cloud_assess/service/Helper.kt b/src/main/kotlin/org/cloud_assess/service/Helper.kt index eb04323..2574fde 100644 --- a/src/main/kotlin/org/cloud_assess/service/Helper.kt +++ b/src/main/kotlin/org/cloud_assess/service/Helper.kt @@ -44,6 +44,19 @@ class Helper( } } + fun QuantityMemoryDto.toLcaac(): String { + return when(this.unit) { + MemoryUnitsDto.gB -> "${this.amount} GB" + MemoryUnitsDto.tB -> "${this.amount} TB" + } + } + + fun QuantityVCPUDto.toLcaac(): String { + return when(this.unit) { + VCPUUnitsDto.vCPU -> "${this.amount} vCPU" + } + } + fun String.toDataExpression(): DataExpression = EStringLiteral(this) fun QuantityMemoryDto.toDataExpression(): DataExpression { diff --git a/src/main/kotlin/org/cloud_assess/service/MapperService.kt b/src/main/kotlin/org/cloud_assess/service/MapperService.kt index cdb38f7..1b3ccec 100644 --- a/src/main/kotlin/org/cloud_assess/service/MapperService.kt +++ b/src/main/kotlin/org/cloud_assess/service/MapperService.kt @@ -98,9 +98,7 @@ class MapperService { return impacts.entries.map { entry -> RawImpactDto( indicator = entry.key.getShortName(), - value = entry.value?.let { - it.toQuantityDto() - } ?: QuantityDto( amount = 0.0, unit = "") + value = entry.value?.toQuantityDto() ?: QuantityDto( amount = 0.0, unit = "") ) }.toList() } @@ -114,6 +112,7 @@ class MapperService { val computeResourceAnalysis = analysis[it.id] ?: throw IllegalStateException("Unknown compute_resource '${it.id}'") ComputeResourceAssessmentDto( period = dto.period, + totalVcpu = dto.totalVcpu, request = it, impacts = impactsDto(computeResourceAnalysis) ) @@ -146,6 +145,9 @@ class MapperService { val vmAnalysis = analysis[it.id] ?: throw IllegalStateException("Unknown virtual machines '${it.id}'") VirtualMachineAssessmentDto( period = dto.period, + totalVcpu = dto.totalVcpu, + totalRam = dto.totalRam, + totalStorage = dto.totalStorage, request = it, impacts = impactsDto(vmAnalysis), ) @@ -205,6 +207,8 @@ class MapperService { val storageResourceAnalysis = analysis[it.id] ?: throw IllegalStateException("Unknown storage_resource '${it.id}'") StorageResourceAssessmentDto( period = dto.period, + totalVcpu = dto.totalVcpu, + totalStorage = dto.totalStorage, request = it, impacts = impactsDto(storageResourceAnalysis), ) diff --git a/src/main/kotlin/org/cloud_assess/service/ParsingService.kt b/src/main/kotlin/org/cloud_assess/service/ParsingService.kt index 471b8e8..049b907 100644 --- a/src/main/kotlin/org/cloud_assess/service/ParsingService.kt +++ b/src/main/kotlin/org/cloud_assess/service/ParsingService.kt @@ -2,7 +2,6 @@ package org.cloud_assess.service import ch.kleis.lcaac.core.lang.expression.DataExpression import ch.kleis.lcaac.core.lang.expression.EProcessTemplateApplication -import ch.kleis.lcaac.core.lang.expression.QuantityExpression import ch.kleis.lcaac.core.lang.register.DataSourceRegister import ch.kleis.lcaac.core.math.basic.BasicNumber import ch.kleis.lcaac.core.math.basic.BasicOperations diff --git a/src/main/kotlin/org/cloud_assess/service/PoolService.kt b/src/main/kotlin/org/cloud_assess/service/PoolService.kt index 745e07c..301afa9 100644 --- a/src/main/kotlin/org/cloud_assess/service/PoolService.kt +++ b/src/main/kotlin/org/cloud_assess/service/PoolService.kt @@ -25,7 +25,6 @@ class PoolService( @Suppress("DuplicatedCode") fun analyze(pools: PoolListDto): Map { - val period = pools.period val cases = cases(pools) val evaluator = Evaluator(symbolTable, BasicOperations, defaultDataSourceOperations) val analysis = cases @@ -42,7 +41,7 @@ class PoolService( name = "service", process = "service_fn", arguments = mapOf("id" to it.key) - ), period, rawAnalysis + ), rawAnalysis ) ) }.reduce { acc, element -> acc.plus(element) } diff --git a/src/main/kotlin/org/cloud_assess/service/StorageResourceService.kt b/src/main/kotlin/org/cloud_assess/service/StorageResourceService.kt index 62fd6bf..36e0d3f 100644 --- a/src/main/kotlin/org/cloud_assess/service/StorageResourceService.kt +++ b/src/main/kotlin/org/cloud_assess/service/StorageResourceService.kt @@ -1,5 +1,6 @@ package org.cloud_assess.service +import ch.kleis.lcaac.core.assessment.ContributionAnalysisProgram import ch.kleis.lcaac.core.datasource.DefaultDataSourceOperations import ch.kleis.lcaac.core.datasource.in_memory.InMemoryConnector import ch.kleis.lcaac.core.datasource.in_memory.InMemoryConnectorKeys @@ -14,13 +15,10 @@ import ch.kleis.lcaac.core.math.basic.BasicOperations import org.cloud_assess.dto.StorageResourceListDto import org.cloud_assess.model.ProductMatcher import org.cloud_assess.model.ResourceAnalysis -import org.springframework.beans.factory.annotation.Value import org.springframework.stereotype.Service @Service class StorageResourceService( - @Value("\${COMPUTE_JOB_SIZE:100}") - private val jobSize: Int, private val parsingService: ParsingService, private val defaultDataSourceOperations: DefaultDataSourceOperations, private val symbolTable: SymbolTable, @@ -31,6 +29,8 @@ class StorageResourceService( defaultDataSourceOperations, symbolTable, ) + + @Suppress("DuplicatedCode") fun analyze(storageResources: StorageResourceListDto): Map { val period = with(helper) { storageResources.period.toDataExpression() @@ -48,19 +48,29 @@ class StorageResourceService( BasicOperations, sourceOps, ) - val jobRunner = AnalysisJobRunner( - jobSize = jobSize, - productMatcher = { id -> - ProductMatcher( - name = "storage", - process = "storage_space_fn", - arguments = mapOf("id" to id) + val productMatcher: (String) -> ProductMatcher = { id -> + ProductMatcher( + name = "storage", + process = "storage_space_fn", + arguments = mapOf("id" to id) + ) + } + val analysis = cases.entries + .map { + val arguments = it.value.arguments + val trace = evaluator.with(it.value.template) + .trace(it.value.template, arguments) + val systemValue = trace.getSystemValue() + val entryPoint = trace.getEntryPoint() + val program = ContributionAnalysisProgram(systemValue, entryPoint) + val rawAnalysis = program.run() + mapOf( + it.key to ResourceAnalysis( + productMatcher(it.key), + rawAnalysis + ) ) - }, - periodDto = storageResources.period, - evaluator = evaluator, - ) - val analysis = jobRunner.run(cases) + }.fold(emptyMap()) { acc, element -> acc.plus(element) } return analysis } @@ -90,6 +100,8 @@ class StorageResourceService( private fun cases(storageResources: StorageResourceListDto): Map> { val period = with(helper) { storageResources.period.toLcaac() } + val totalVcpu = with(helper) { storageResources.totalVcpu.toLcaac() } + val totalStorage = with(helper) { storageResources.totalStorage.toLcaac() } val cases = storageResources.storageResources.associate { val content = """ process __main__ { @@ -97,7 +109,11 @@ class StorageResourceService( 1 u __main__ } inputs { - $period storage from storage_space_fn(id = "${it.id}") + $period storage from storage_space_fn( + id = "${it.id}", + total_vcpu = ${totalVcpu}, + total_storage = ${totalStorage}, + ) } } """.trimIndent() diff --git a/src/main/kotlin/org/cloud_assess/service/VirtualMachineService.kt b/src/main/kotlin/org/cloud_assess/service/VirtualMachineService.kt index 68e483d..f7f9132 100644 --- a/src/main/kotlin/org/cloud_assess/service/VirtualMachineService.kt +++ b/src/main/kotlin/org/cloud_assess/service/VirtualMachineService.kt @@ -1,5 +1,6 @@ package org.cloud_assess.service +import ch.kleis.lcaac.core.assessment.ContributionAnalysisProgram import ch.kleis.lcaac.core.datasource.DefaultDataSourceOperations import ch.kleis.lcaac.core.datasource.in_memory.InMemoryConnector import ch.kleis.lcaac.core.datasource.in_memory.InMemoryConnectorKeys @@ -14,13 +15,10 @@ import ch.kleis.lcaac.core.math.basic.BasicOperations import org.cloud_assess.dto.VirtualMachineListDto import org.cloud_assess.model.ProductMatcher import org.cloud_assess.model.ResourceAnalysis -import org.springframework.beans.factory.annotation.Value import org.springframework.stereotype.Service @Service class VirtualMachineService( - @Value("\${COMPUTE_JOB_SIZE:100}") - private val jobSize: Int, private val parsingService: ParsingService, private val defaultDataSourceOperations: DefaultDataSourceOperations, private val symbolTable: SymbolTable, @@ -32,6 +30,7 @@ class VirtualMachineService( symbolTable, ) + @Suppress("DuplicatedCode") fun analyze(vms: VirtualMachineListDto): Map { val period = with(helper) { vms.period.toDataExpression() @@ -49,19 +48,29 @@ class VirtualMachineService( BasicOperations, sourceOps, ) - val jobRunner = AnalysisJobRunner( - jobSize = jobSize, - productMatcher = { id -> - ProductMatcher( - name = "vm", - process = "vm_fn", - arguments = mapOf("id" to id) + val productMatcher: (String) -> ProductMatcher = { id -> + ProductMatcher( + name = "vm", + process = "vm_fn", + arguments = mapOf("id" to id) + ) + } + val analysis = cases.entries + .map { + val arguments = it.value.arguments + val trace = evaluator.with(it.value.template) + .trace(it.value.template, arguments) + val systemValue = trace.getSystemValue() + val entryPoint = trace.getEntryPoint() + val program = ContributionAnalysisProgram(systemValue, entryPoint) + val rawAnalysis = program.run() + mapOf( + it.key to ResourceAnalysis( + productMatcher(it.key), + rawAnalysis + ) ) - }, - periodDto = vms.period, - evaluator = evaluator, - ) - val analysis = jobRunner.run(cases) + }.fold(emptyMap()) { acc, element -> acc.plus(element) } return analysis } @@ -69,6 +78,9 @@ class VirtualMachineService( vms: VirtualMachineListDto, ): Map> { val period = with(helper) { vms.period.toLcaac() } + val totalVcpu = with(helper) { vms.totalVcpu.toDataExpression() } + val totalRam = with(helper) { vms.totalRam.toDataExpression() } + val totalStorage = with(helper) { vms.totalStorage.toDataExpression() } val cases = vms.virtualMachines.associate { val content = """ process __main__ { @@ -76,7 +88,12 @@ class VirtualMachineService( 1 u __main__ } inputs { - $period vm from vm_fn(id = "${it.id}") + $period vm from vm_fn( + id = "${it.id}", + total_vcpu = ${totalVcpu}, + total_ram = ${totalRam}, + total_storage = ${totalStorage}, + ) } } """.trimIndent() diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 3b732df..3387722 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -4,8 +4,6 @@ lca: cors: enabled: false allowed-origin: -compute: - job-size: 100 resilio-db: url: https://db.resilio.tech access-token: dummy-token diff --git a/src/test/kotlin/org/cloud_assess/CloudAssessApplicationTest.kt b/src/test/kotlin/org/cloud_assess/CloudAssessApplicationTest.kt index 802f934..1b9754b 100644 --- a/src/test/kotlin/org/cloud_assess/CloudAssessApplicationTest.kt +++ b/src/test/kotlin/org/cloud_assess/CloudAssessApplicationTest.kt @@ -50,7 +50,6 @@ class CloudAssessApplicationTest( // then listOf("client_vm").forEach { id -> val pool = actual[id]!! - assertThat(pool.period).isEqualTo(QuantityTimeDto(1.0, TimeUnitsDto.hour)) val total = pool.total(Indicator.GWP) val manufacturing = pool.manufacturing(Indicator.GWP) @@ -91,6 +90,9 @@ class CloudAssessApplicationTest( // given val vms = VirtualMachineListDto( period = QuantityTimeDto(1.0, TimeUnitsDto.hour), + totalVcpu = QuantityVCPUDto(20.0, VCPUUnitsDto.vCPU), + totalRam = QuantityMemoryDto(200.0, MemoryUnitsDto.gB), + totalStorage = QuantityMemoryDto(200.0, MemoryUnitsDto.gB), virtualMachines = listOf( DtoFixture.virtualMachineDto("vm-01", "client_vm"), DtoFixture.virtualMachineDto("vm-02", "client_vm"), @@ -103,7 +105,6 @@ class CloudAssessApplicationTest( // then listOf("vm-01", "vm-02").forEach { id -> val vm = actual[id]!! - assertThat(vm.period).isEqualTo(QuantityTimeDto(1.0, TimeUnitsDto.hour)) val total = vm.total(Indicator.GWP) val manufacturing = vm.manufacturing(Indicator.GWP) @@ -111,11 +112,11 @@ class CloudAssessApplicationTest( val use = vm.use(Indicator.GWP) val endOfLife = vm.endOfLife(Indicator.GWP) - assertGWPKgCO2Eq(total, 2.458826278) - assertGWPKgCO2Eq(manufacturing, 0.63425488402) - assertGWPKgCO2Eq(transport, 0.62911701870) - assertGWPKgCO2Eq(use, 0.5662062951815) - assertGWPKgCO2Eq(endOfLife, 0.62924808042) + assertGWPKgCO2Eq(total, 0.2458826278) + assertGWPKgCO2Eq(manufacturing, 0.063425488402) + assertGWPKgCO2Eq(transport, 0.062911701870) + assertGWPKgCO2Eq(use, 0.05662062951815) + assertGWPKgCO2Eq(endOfLife, 0.062924808042) assertThat( total.amount.value ).isCloseTo( @@ -133,6 +134,7 @@ class CloudAssessApplicationTest( // given val computeResources = ComputeResourceListDto( period = QuantityTimeDto(1.0, TimeUnitsDto.hour), + totalVcpu = QuantityVCPUDto(20.0, VCPUUnitsDto.vCPU), computeResources = listOf( DtoFixture.computeResourceDto("comp-01", "client_compute"), DtoFixture.computeResourceDto("comp-02", "client_compute"), @@ -145,7 +147,6 @@ class CloudAssessApplicationTest( // then listOf("comp-01", "comp-02").forEach { id -> val computeResource = actual[id]!! - assertThat(computeResource.period).isEqualTo(QuantityTimeDto(1.0, TimeUnitsDto.hour)) val total = computeResource.total(Indicator.GWP) val manufacturing = computeResource.manufacturing(Indicator.GWP) @@ -153,11 +154,11 @@ class CloudAssessApplicationTest( val use = computeResource.use(Indicator.GWP) val endOfLife = computeResource.endOfLife(Indicator.GWP) - assertGWPKgCO2Eq(total, 3.72540688945756) - assertGWPKgCO2Eq(manufacturing, 0.953923318828) - assertGWPKgCO2Eq(transport, 0.945360209961) - assertGWPKgCO2Eq(use, 0.8805447145145) - assertGWPKgCO2Eq(endOfLife, 0.945578646152) + assertGWPKgCO2Eq(total, 0.372540688945756) + assertGWPKgCO2Eq(manufacturing, 0.0953923318828) + assertGWPKgCO2Eq(transport, 0.0945360209961) + assertGWPKgCO2Eq(use, 0.08805447145145) + assertGWPKgCO2Eq(endOfLife, 0.0945578646152) assertThat( total.amount.value ).isCloseTo( @@ -175,6 +176,8 @@ class CloudAssessApplicationTest( // given val storageResources = StorageResourceListDto( period = QuantityTimeDto(1.0, TimeUnitsDto.hour), + totalVcpu = QuantityVCPUDto(20.0, VCPUUnitsDto.vCPU), + totalStorage = QuantityMemoryDto(200.0, MemoryUnitsDto.gB), storageResources = listOf( DtoFixture.storageResourceDto("sto-sp-01", "client_storage_space"), DtoFixture.storageResourceDto("sto-sp-02", "client_storage_space"), @@ -187,7 +190,6 @@ class CloudAssessApplicationTest( // then listOf("sto-sp-01", "sto-sp-02").forEach { id -> val storageResource = actual[id]!! - assertThat(storageResource.period).isEqualTo(QuantityTimeDto(1.0, TimeUnitsDto.hour)) val total = storageResource.total(Indicator.GWP) val manufacturing = storageResource.manufacturing(Indicator.GWP) @@ -195,11 +197,11 @@ class CloudAssessApplicationTest( val use = storageResource.use(Indicator.GWP) val endOfLife = storageResource.endOfLife(Indicator.GWP) - assertGWPKgCO2Eq(total, 3.7885393335789) - assertGWPKgCO2Eq(manufacturing, 0.953923318828) - assertGWPKgCO2Eq(transport, 0.945360209961) - assertGWPKgCO2Eq(use, 0.9436771586359) - assertGWPKgCO2Eq(endOfLife, 0.945578646152) + assertGWPKgCO2Eq(total, 0.37885393335789) + assertGWPKgCO2Eq(manufacturing, 0.0953923318828) + assertGWPKgCO2Eq(transport, 0.0945360209961) + assertGWPKgCO2Eq(use, 0.09436771586359) + assertGWPKgCO2Eq(endOfLife, 0.0945578646152) assertThat( total.amount.value ).isCloseTo( diff --git a/src/test/kotlin/org/cloud_assess/PerformanceTest.kt b/src/test/kotlin/org/cloud_assess/PerformanceTest.kt deleted file mode 100644 index fd066d0..0000000 --- a/src/test/kotlin/org/cloud_assess/PerformanceTest.kt +++ /dev/null @@ -1,37 +0,0 @@ -package org.cloud_assess - -import org.assertj.core.api.Assertions.assertThat -import org.cloud_assess.dto.QuantityTimeDto -import org.cloud_assess.dto.TimeUnitsDto -import org.cloud_assess.dto.VirtualMachineListDto -import org.cloud_assess.fixtures.DtoFixture -import org.cloud_assess.service.VirtualMachineService -import org.junit.jupiter.api.Tag -import org.junit.jupiter.api.Test -import org.springframework.beans.factory.annotation.Autowired -import org.springframework.boot.test.context.SpringBootTest - -@SpringBootTest -@Tag("Performance") -class PerformanceTest( - @Autowired - private val virtualMachineService: VirtualMachineService, -) { - @Test - fun virtualMachines() { - // given - val n = 2000 - val vms = VirtualMachineListDto( - period = QuantityTimeDto(1.0, TimeUnitsDto.hour), - virtualMachines = (1..n).map { - DtoFixture.virtualMachineDto("vm-$it", "client_vm") - }, - ) - - // when - val actual = virtualMachineService.analyze(vms) - - // then - assertThat(actual).hasSize(n) - } -} diff --git a/src/test/kotlin/org/cloud_assess/fixtures/DtoFixture.kt b/src/test/kotlin/org/cloud_assess/fixtures/DtoFixture.kt index 682622e..3436885 100644 --- a/src/test/kotlin/org/cloud_assess/fixtures/DtoFixture.kt +++ b/src/test/kotlin/org/cloud_assess/fixtures/DtoFixture.kt @@ -1,6 +1,5 @@ package org.cloud_assess.fixtures -import io.mockk.mockk import org.cloud_assess.dto.* @Suppress("SameParameterValue") @@ -92,7 +91,7 @@ class DtoFixture { fun poolListDto(): PoolListDto { return PoolListDto( - period = quantityHour(1.0), + period = oneHour(), pools = listOf( poolDto("client_vm"), ) @@ -112,7 +111,10 @@ class DtoFixture { fun virtualMachineListDto(): VirtualMachineListDto { return VirtualMachineListDto( - period = quantityHour(1.0), + period = oneHour(), + totalVcpu = QuantityVCPUDto(1.0, VCPUUnitsDto.vCPU), + totalRam = QuantityMemoryDto(1.0, MemoryUnitsDto.gB), + totalStorage = QuantityMemoryDto(1.0, MemoryUnitsDto.gB), virtualMachines = listOf( virtualMachineDto("vm-01"), ) @@ -141,7 +143,8 @@ class DtoFixture { fun computeResourceListDto(): ComputeResourceListDto { return ComputeResourceListDto( - period = quantityHour(1.0), + period = oneHour(), + totalVcpu = QuantityVCPUDto(1.0, VCPUUnitsDto.vCPU), computeResources = listOf( computeResourceDto("comp-01"), ), @@ -168,7 +171,8 @@ class DtoFixture { id: String = "comp-01", ): ComputeResourceAssessmentDto { return ComputeResourceAssessmentDto( - period = quantityHour(1.0), + period = oneHour(), + totalVcpu = QuantityVCPUDto(1.0, VCPUUnitsDto.vCPU), request = computeResourceDto(id), impacts = impactsDto(), ) @@ -177,7 +181,9 @@ class DtoFixture { fun storageResourceListDto(): StorageResourceListDto { return StorageResourceListDto( - period = quantityHour(1.0), + period = oneHour(), + totalVcpu = QuantityVCPUDto(1.0, VCPUUnitsDto.vCPU), + totalStorage = QuantityMemoryDto(1.0, MemoryUnitsDto.gB), storageResources = listOf( storageResourceDto("sto-sp-01") ) @@ -206,7 +212,9 @@ class DtoFixture { id: String = "sto-sp-01", ): StorageResourceAssessmentDto { return StorageResourceAssessmentDto( - period = quantityHour(1.0), + period = oneHour(), + totalVcpu = QuantityVCPUDto(1.0, VCPUUnitsDto.vCPU), + totalStorage = QuantityMemoryDto(1.0, MemoryUnitsDto.gB), request = storageResourceDto(id), impacts = impactsDto(), ) @@ -231,7 +239,7 @@ class DtoFixture { ) } - private fun quantityHour(amount: Double = 1.0): QuantityTimeDto { + private fun oneHour(): QuantityTimeDto { return QuantityTimeDto(1.0, TimeUnitsDto.hour) } @@ -256,7 +264,10 @@ class DtoFixture { fun virtualMachineAssessmentDto(id: String): VirtualMachineAssessmentDto { return VirtualMachineAssessmentDto( - period = quantityHour(1.0), + period = oneHour(), + totalVcpu = QuantityVCPUDto(1.0, VCPUUnitsDto.vCPU), + totalRam = QuantityMemoryDto(1.0, MemoryUnitsDto.gB), + totalStorage = QuantityMemoryDto(1.0, MemoryUnitsDto.gB), request = virtualMachineDto(id), impacts = impactsDto(), ) @@ -264,7 +275,7 @@ class DtoFixture { fun poolAssessmentDto(id: String): PoolAssessmentDto { return PoolAssessmentDto( - period = quantityHour(1.0), + period = oneHour(), request = poolDto(id), impacts = impactsDto(), ) diff --git a/trusted_library/02-pooling/05-compute/compute.lca b/trusted_library/02-pooling/05-compute/compute.lca index 10d5b24..d4171fe 100644 --- a/trusted_library/02-pooling/05-compute/compute.lca +++ b/trusted_library/02-pooling/05-compute/compute.lca @@ -15,15 +15,16 @@ ENTRYPOINT process compute_fn { params { id = "comp-01" + total_vcpu = sum( compute_inventory match pool_id = "client_compute", quantity * vcpu_size ) } products { timewindow compute } inputs { - timewindow compute from compute_fn( id = id, lc_step = "manufacturing" ) match ( phase = "embodied" ) - timewindow compute from compute_fn( id = id, lc_step = "transport" ) match ( phase = "embodied" ) - timewindow compute from compute_fn( id = id ) match ( phase = "use" ) - timewindow compute from compute_fn( id = id, lc_step = "end-of-life" ) match ( phase = "embodied" ) + timewindow compute from compute_fn( id = id, lc_step = "manufacturing", total_vcpu = total_vcpu ) match ( phase = "embodied" ) + timewindow compute from compute_fn( id = id, lc_step = "transport", total_vcpu = total_vcpu ) match ( phase = "embodied" ) + timewindow compute from compute_fn( id = id, total_vcpu = total_vcpu ) match ( phase = "use" ) + timewindow compute from compute_fn( id = id, lc_step = "end-of-life", total_vcpu = total_vcpu ) match ( phase = "embodied" ) } } @@ -38,6 +39,7 @@ process compute_fn { params { id = "comp-01" lc_step = "manufacturing" + total_vcpu = sum( compute_inventory match pool_id = "client_compute", quantity * vcpu_size ) } variables { data = lookup compute_inventory match id = id @@ -46,7 +48,7 @@ process compute_fn { timewindow compute } inputs { - data.vcpu_size cpu from compute_pool_equipment( id = data.pool_id, lc_step = lc_step ) match ( phase = phase ) + data.vcpu_size cpu from compute_pool_equipment( id = data.pool_id, lc_step = lc_step, total_vcpu = total_vcpu ) match ( phase = phase ) } } @@ -56,6 +58,7 @@ process compute_fn { } params { id = "comp-01" + total_vcpu = sum( compute_inventory match pool_id = "client_compute", quantity * vcpu_size ) } variables { data = lookup compute_inventory match id = id @@ -64,6 +67,6 @@ process compute_fn { timewindow compute } inputs { - data.vcpu_size cpu from compute_pool_equipment( id = data.pool_id ) match ( phase = phase ) + data.vcpu_size cpu from compute_pool_equipment( id = data.pool_id, total_vcpu = total_vcpu ) match ( phase = phase ) } } diff --git a/trusted_library/02-pooling/05-compute/compute_pool_equipment.lca b/trusted_library/02-pooling/05-compute/compute_pool_equipment.lca index 9235c35..400796e 100644 --- a/trusted_library/02-pooling/05-compute/compute_pool_equipment.lca +++ b/trusted_library/02-pooling/05-compute/compute_pool_equipment.lca @@ -1,5 +1,3 @@ -// Difference wrt PCR: allocation based on reserved cores during the time window. - process compute_pool_equipment { labels { phase = "embodied" @@ -7,12 +5,10 @@ process compute_pool_equipment { params { id = "client_compute" lc_step = "manufacturing" - } - variables { - reserved_cpu = sum( compute_inventory match pool_id = id, quantity * vcpu_size ) + total_vcpu = sum( compute_inventory match pool_id = id, quantity * vcpu_size ) } products { - reserved_cpu cpu + total_vcpu cpu } inputs { timewindow pool_server from pool_server_fn( id = id, lc_step = lc_step ) match ( phase = "embodied" ) @@ -27,12 +23,10 @@ process compute_pool_equipment { } params { id = "client_compute" - } - variables { - reserved_cpu = sum( compute_inventory match pool_id = id, quantity * vcpu_size ) + total_vcpu = sum( compute_inventory match pool_id = id, quantity * vcpu_size ) } products { - reserved_cpu cpu + total_vcpu cpu } inputs { timewindow pool_server from pool_server_fn( id = id ) match ( phase = phase ) diff --git a/trusted_library/02-pooling/06-virtual-machine/vm.lca b/trusted_library/02-pooling/06-virtual-machine/vm.lca index 03d6c59..9556dc5 100644 --- a/trusted_library/02-pooling/06-virtual-machine/vm.lca +++ b/trusted_library/02-pooling/06-virtual-machine/vm.lca @@ -20,15 +20,26 @@ ENTRYPOINT process vm_fn { params { id = "vm-01" + total_vcpu = sum( vm_inventory match pool_id = "client_vm", quantity * vcpu_size ) + total_ram = sum( vm_inventory match pool_id = "client_vm", quantity * ram_size ) + total_storage = sum( vm_inventory match pool_id = "client_vm", quantity * storage_size ) } products { timewindow vm } inputs { - timewindow vm from vm_fn( id = id, lc_step = "manufacturing" ) match ( phase = "embodied" ) - timewindow vm from vm_fn( id = id, lc_step = "transport" )match ( phase = "embodied" ) - timewindow vm from vm_fn( id = id ) match ( phase = "use" ) - timewindow vm from vm_fn( id = id, lc_step = "end-of-life" )match ( phase = "embodied" ) + timewindow vm from vm_fn( id = id, lc_step = "manufacturing", + total_vcpu = total_vcpu, total_ram = total_ram, total_storage = total_storage + ) match ( phase = "embodied" ) + timewindow vm from vm_fn( id = id, lc_step = "transport", + total_vcpu = total_vcpu, total_ram = total_ram, total_storage = total_storage + ) match ( phase = "embodied" ) + timewindow vm from vm_fn( id = id, + total_vcpu = total_vcpu, total_ram = total_ram, total_storage = total_storage + ) match ( phase = "use" ) + timewindow vm from vm_fn( id = id, lc_step = "end-of-life", + total_vcpu = total_vcpu, total_ram = total_ram, total_storage = total_storage + ) match ( phase = "embodied" ) } } @@ -43,6 +54,9 @@ process vm_fn { params { id = "vm-01" lc_step = "manufacturing" + total_vcpu = sum( vm_inventory match pool_id = "client_vm", quantity * vcpu_size ) + total_ram = sum( vm_inventory match pool_id = "client_vm", quantity * ram_size ) + total_storage = sum( vm_inventory match pool_id = "client_vm", quantity * storage_size ) } variables { data = lookup vm_inventory match id = id @@ -52,9 +66,15 @@ process vm_fn { } inputs { - data.ram_size ram from vm_pool_equipment( id = data.pool_id ) match ( lc_step = lc_step ) - data.vcpu_size vcpu from vm_pool_equipment( id = data.pool_id ) match ( lc_step = lc_step ) - data.storage_size storage from vm_pool_equipment( id = data.pool_id ) match ( lc_step = lc_step ) + data.ram_size ram from vm_pool_equipment( id = data.pool_id, + total_vcpu = total_vcpu, total_ram = total_ram, total_storage = total_storage + ) match ( lc_step = lc_step ) + data.vcpu_size vcpu from vm_pool_equipment( id = data.pool_id, + total_vcpu = total_vcpu, total_ram = total_ram, total_storage = total_storage + ) match ( lc_step = lc_step ) + data.storage_size storage from vm_pool_equipment( id = data.pool_id, + total_vcpu = total_vcpu, total_ram = total_ram, total_storage = total_storage + ) match ( lc_step = lc_step ) } } @@ -64,6 +84,9 @@ process vm_fn { } params { id = "vm-01" + total_vcpu = sum( vm_inventory match pool_id = "client_vm", quantity * vcpu_size ) + total_ram = sum( vm_inventory match pool_id = "client_vm", quantity * ram_size ) + total_storage = sum( vm_inventory match pool_id = "client_vm", quantity * storage_size ) } variables { data = lookup vm_inventory match id = id @@ -73,8 +96,14 @@ process vm_fn { } inputs { - data.ram_size ram from vm_pool_equipment( id = data.pool_id ) match ( lc_step = phase ) - data.vcpu_size vcpu from vm_pool_equipment( id = data.pool_id ) match ( lc_step = phase ) - data.storage_size storage from vm_pool_equipment( id = data.pool_id ) match ( lc_step = phase ) + data.ram_size ram from vm_pool_equipment( id = data.pool_id, + total_vcpu = total_vcpu, total_ram = total_ram, total_storage = total_storage + ) match ( lc_step = phase ) + data.vcpu_size vcpu from vm_pool_equipment( id = data.pool_id, + total_vcpu = total_vcpu, total_ram = total_ram, total_storage = total_storage + ) match ( lc_step = phase ) + data.storage_size storage from vm_pool_equipment( id = data.pool_id, + total_vcpu = total_vcpu, total_ram = total_ram, total_storage = total_storage + ) match ( lc_step = phase ) } } diff --git a/trusted_library/02-pooling/06-virtual-machine/vm_pool_equipment.lca b/trusted_library/02-pooling/06-virtual-machine/vm_pool_equipment.lca index c9988fa..f1d8352 100644 --- a/trusted_library/02-pooling/06-virtual-machine/vm_pool_equipment.lca +++ b/trusted_library/02-pooling/06-virtual-machine/vm_pool_equipment.lca @@ -9,16 +9,14 @@ process vm_pool_equipment { } params { id = "client_vm" - } - variables { - reserved_vcpu = sum( vm_inventory match pool_id = id, quantity * vcpu_size ) - reserved_ram = sum( vm_inventory match pool_id = id, quantity * ram_size ) - reserved_storage = sum( vm_inventory match pool_id = id, quantity * storage_size ) + total_vcpu = sum( vm_inventory match pool_id = id, quantity * vcpu_size ) + total_ram = sum(vm_inventory match pool_id = id, quantity * ram_size) + total_storage = sum(vm_inventory match pool_id = id, quantity * storage_size) } products { - reserved_ram ram allocate ratio_ram - reserved_vcpu vcpu allocate ratio_cpu - reserved_storage storage allocate ratio_storage + total_ram ram allocate ratio_ram + total_vcpu vcpu allocate ratio_cpu + total_storage storage allocate ratio_storage } inputs { timewindow pool_server from pool_server_fn( id = id, lc_step = lc_step ) match ( phase = "embodied" ) @@ -37,16 +35,14 @@ process vm_pool_equipment { } params { id = "client_vm" - } - variables { - reserved_vcpu = sum( vm_inventory match pool_id = id, quantity * vcpu_size ) - reserved_ram = sum( vm_inventory match pool_id = id, quantity * ram_size ) - reserved_storage = sum( vm_inventory match pool_id = id, quantity * storage_size ) + total_vcpu = sum( vm_inventory match pool_id = id, quantity * vcpu_size ) + total_ram = sum(vm_inventory match pool_id = id, quantity * ram_size) + total_storage = sum(vm_inventory match pool_id = id, quantity * storage_size) } products { - reserved_ram ram allocate ratio_ram - reserved_vcpu vcpu allocate ratio_cpu - reserved_storage storage allocate ratio_storage + total_ram ram allocate ratio_ram + total_vcpu vcpu allocate ratio_cpu + total_storage storage allocate ratio_storage } inputs { timewindow pool_server from pool_server_fn( id = id, lc_step = lc_step ) match ( phase = "embodied" ) @@ -65,16 +61,14 @@ process vm_pool_equipment { } params { id = "client_vm" - } - variables { - reserved_vcpu = sum( vm_inventory match pool_id = id, quantity * vcpu_size ) - reserved_ram = sum( vm_inventory match pool_id = id, quantity * ram_size ) - reserved_storage = sum( vm_inventory match pool_id = id, quantity * storage_size ) + total_vcpu = sum( vm_inventory match pool_id = id, quantity * vcpu_size ) + total_ram = sum(vm_inventory match pool_id = id, quantity * ram_size) + total_storage = sum(vm_inventory match pool_id = id, quantity * storage_size) } products { - reserved_ram ram allocate ratio_ram - reserved_vcpu vcpu allocate ratio_cpu - reserved_storage storage allocate ratio_storage + total_ram ram allocate ratio_ram + total_vcpu vcpu allocate ratio_cpu + total_storage storage allocate ratio_storage } inputs { timewindow pool_server from pool_server_fn( id = id ) match ( phase = "use" ) @@ -93,17 +87,14 @@ process vm_pool_equipment { } params { id = "client_vm" - } - variables { - // According to PCR, allocation built with with respect to total "reserved" resources. - reserved_vcpu = sum( vm_inventory match pool_id = id, quantity * vcpu_size ) - reserved_ram = sum( vm_inventory match pool_id = id, quantity * ram_size ) - reserved_storage = sum( vm_inventory match pool_id = id, quantity * storage_size ) + total_vcpu = sum( vm_inventory match pool_id = id, quantity * vcpu_size ) + total_ram = sum(vm_inventory match pool_id = id, quantity * ram_size) + total_storage = sum(vm_inventory match pool_id = id, quantity * storage_size) } products { - reserved_ram ram allocate ratio_ram - reserved_vcpu vcpu allocate ratio_cpu - reserved_storage storage allocate ratio_storage + total_ram ram allocate ratio_ram + total_vcpu vcpu allocate ratio_cpu + total_storage storage allocate ratio_storage } inputs { timewindow pool_server from pool_server_fn( id = id, lc_step = lc_step ) match ( phase = "embodied" ) diff --git a/trusted_library/02-pooling/07-storage-space/space_pool_equipment.lca b/trusted_library/02-pooling/07-storage-space/space_pool_equipment.lca index ff9d319..7dafd84 100644 --- a/trusted_library/02-pooling/07-storage-space/space_pool_equipment.lca +++ b/trusted_library/02-pooling/07-storage-space/space_pool_equipment.lca @@ -11,18 +11,16 @@ process space_pool_equipment { params { id = "client_storage_space" lc_step = "manufacturing" + total_vcpu = sum( storage_space_inventory match pool_id = id, quantity * vcpu_size ) + total_storage = sum( storage_space_inventory match pool_id = id, quantity * volume ) } variables { ratio_cpu = 5 percent ratio_storage = 95 percent } - variables { - total_volume = sum( storage_space_inventory match pool_id = id, quantity * volume ) - total_vcpu = sum( storage_space_inventory match pool_id = id, quantity * vcpu_size ) - } products { - total_volume storage allocate ratio_storage total_vcpu vcpu allocate ratio_cpu + total_storage storage allocate ratio_storage } inputs { timewindow pool_server from pool_server_fn( id = id, lc_step = lc_step ) match ( phase = phase ) @@ -37,18 +35,16 @@ process space_pool_equipment { } params { id = "client_storage_space" + total_vcpu = sum( storage_space_inventory match pool_id = id, quantity * vcpu_size ) + total_storage = sum( storage_space_inventory match pool_id = id, quantity * volume ) } variables { ratio_cpu = 75 percent ratio_storage = 25 percent } - variables { - total_volume = sum( storage_space_inventory match pool_id = id, quantity * volume ) - total_vcpu = sum( storage_space_inventory match pool_id = id, quantity * vcpu_size ) - } products { - total_volume storage allocate ratio_storage total_vcpu vcpu allocate ratio_cpu + total_storage storage allocate ratio_storage } inputs { timewindow pool_server from pool_server_fn( id = id ) match ( phase = phase ) diff --git a/trusted_library/02-pooling/07-storage-space/storage_space.lca b/trusted_library/02-pooling/07-storage-space/storage_space.lca index 26b5028..123d2b4 100644 --- a/trusted_library/02-pooling/07-storage-space/storage_space.lca +++ b/trusted_library/02-pooling/07-storage-space/storage_space.lca @@ -17,15 +17,25 @@ ENTRYPOINT process storage_space_fn { params { id = "sto-sp-01" + total_vcpu = sum( storage_space_inventory match pool_id = "client_storage_space", quantity * vcpu_size ) + total_storage = sum( storage_space_inventory match pool_id = "client_storage_space", quantity * volume ) } products { 1 hour storage } inputs { - 1 hour storage from storage_space_fn( id = id, lc_step = "manufacturing" ) match ( phase = "embodied" ) - 1 hour storage from storage_space_fn( id = id, lc_step = "transport" ) match ( phase = "embodied" ) - 1 hour storage from storage_space_fn( id = id ) match ( phase = "use" ) - 1 hour storage from storage_space_fn( id = id, lc_step = "end-of-life" ) match ( phase = "embodied" ) + 1 hour storage from storage_space_fn( id = id, lc_step = "manufacturing", + total_vcpu = total_vcpu, total_storage = total_storage + ) match ( phase = "embodied" ) + 1 hour storage from storage_space_fn( id = id, lc_step = "transport", + total_vcpu = total_vcpu, total_storage = total_storage + ) match ( phase = "embodied" ) + 1 hour storage from storage_space_fn( id = id, + total_vcpu = total_vcpu, total_storage = total_storage + ) match ( phase = "use" ) + 1 hour storage from storage_space_fn( id = id, lc_step = "end-of-life", + total_vcpu = total_vcpu, total_storage = total_storage + ) match ( phase = "embodied" ) } } @@ -40,6 +50,8 @@ process storage_space_fn { params { id = "sto-sp-01" lc_step = "manufacturing" + total_vcpu = sum( storage_space_inventory match pool_id = "client_storage_space", quantity * vcpu_size ) + total_storage = sum( storage_space_inventory match pool_id = "client_storage_space", quantity * volume ) } variables { data = lookup storage_space_inventory match id = id @@ -49,8 +61,12 @@ process storage_space_fn { } inputs { - data.vcpu_size vcpu from space_pool_equipment( id = data.pool_id, lc_step = lc_step ) match ( phase = phase ) - data.volume storage from space_pool_equipment( id = data.pool_id, lc_step = lc_step ) match ( phase = phase ) + data.vcpu_size vcpu from space_pool_equipment( id = data.pool_id, lc_step = lc_step, + total_vcpu = total_vcpu, total_storage = total_storage + ) match ( phase = phase ) + data.volume storage from space_pool_equipment( id = data.pool_id, lc_step = lc_step, + total_vcpu = total_vcpu, total_storage = total_storage + ) match ( phase = phase ) } } @@ -60,6 +76,8 @@ process storage_space_fn { } params { id = "sto-sp-01" + total_vcpu = sum( storage_space_inventory match pool_id = "client_storage_space", quantity * vcpu_size ) + total_storage = sum( storage_space_inventory match pool_id = "client_storage_space", quantity * volume ) } variables { data = lookup storage_space_inventory match id = id @@ -68,7 +86,11 @@ process storage_space_fn { timewindow storage } inputs { - data.vcpu_size vcpu from space_pool_equipment( id = data.pool_id ) match ( phase = phase ) - data.volume storage from space_pool_equipment( id = data.pool_id ) match ( phase = phase ) + data.vcpu_size vcpu from space_pool_equipment( id = data.pool_id, + total_vcpu = total_vcpu, total_storage = total_storage + ) match ( phase = phase ) + data.volume storage from space_pool_equipment( id = data.pool_id, + total_vcpu = total_vcpu, total_storage = total_storage + ) match ( phase = phase ) } } diff --git a/trusted_library/02-pooling/pool.lca b/trusted_library/02-pooling/pool.lca index 636f4f1..ada1d85 100644 --- a/trusted_library/02-pooling/pool.lca +++ b/trusted_library/02-pooling/pool.lca @@ -2,6 +2,7 @@ Servers */ +@cached process pool_server_fn { params { id = "client_vm" @@ -17,6 +18,7 @@ process pool_server_fn { } } +@cached process pool_server_fn { labels { phase = "embodied" @@ -35,6 +37,7 @@ process pool_server_fn { } } +@cached process pool_server_fn { labels { phase = "use" @@ -56,6 +59,7 @@ process pool_server_fn { Network */ +@cached process pool_network_fn { params { id = "client_vm" @@ -71,6 +75,7 @@ process pool_network_fn { } } +@cached process pool_network_fn { labels { phase = "embodied" @@ -89,6 +94,7 @@ process pool_network_fn { } } +@cached process pool_network_fn { labels { phase = "use" @@ -110,6 +116,7 @@ process pool_network_fn { Storage */ +@cached process pool_storage_fn { params { id = "client_vm" @@ -125,6 +132,7 @@ process pool_storage_fn { } } +@cached process pool_storage_fn { labels { phase = "embodied" @@ -143,6 +151,7 @@ process pool_storage_fn { } } +@cached process pool_storage_fn { labels { phase = "use"