From 19d01dab5449b61b82f0754c416184af78303e1a Mon Sep 17 00:00:00 2001 From: ksenianeva <95441235+ksenianeva@users.noreply.github.com> Date: Fri, 16 Jun 2023 21:51:21 +0400 Subject: [PATCH] =?UTF-8?q?=D0=A7=D0=B5=D1=82=D0=B2=D0=B5=D1=80=D1=82?= =?UTF-8?q?=D0=B0=D1=8F=20=D0=BB=D0=B0=D0=B1=D0=BE=D1=80=D0=B0=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D0=BD=D0=B0=D1=8F=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0?= =?UTF-8?q?.=20React.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/lab/data.mv.db | Bin 77824 -> 143360 bytes .../DataBase/Controllers/CartController.java | 44 + .../Controllers/CountProdController.java | 69 + .../Controllers/CustomerController.java | 56 + .../ProductCategoryController.java | 57 + .../Controllers/ProductController.java | 62 + .../example/lab/DataBase/DTOs/CartDTO.java | 12 +- .../lab/DataBase/DTOs/CountProductDTO.java | 4 + .../example/lab/DataBase/DTOs/ProductDTO.java | 4 + .../lab/DataBase/Models/CountProduct.java | 3 +- .../example/lab/DataBase/Models/Product.java | 1 - .../DataBase/Repositories/CartRepository.java | 1 + .../Repositories/CountProductRepository.java | 5 + .../Services/CountProductService.java | 29 +- .../DataBase/Services/CustomerService.java | 8 +- front/images/arrow.png | Bin 0 -> 37173 bytes front/images/favicon.ico | Bin 0 -> 1150 bytes front/images/free-icon-search-2997940.png | Bin 0 -> 11895 bytes .../free-icon-shopping-cart-6518420.png | Bin 0 -> 9577 bytes front/images/logo.png | Bin 0 -> 6802 bytes front/images/logo_color.png | Bin 0 -> 25653 bytes front/index.html | 45 +- front/package-lock.json | 4691 +++++++++++++++-- front/package.json | 29 +- front/scripts.js | 34 - front/src/App.jsx | 45 + front/src/Main.jsx | 9 + front/src/components/common/CartTable.jsx | 103 + front/src/components/common/CartsTable.jsx | 73 + .../components/common/CountProductTable.jsx | 102 + front/src/components/common/CustomerTable.jsx | 117 + front/src/components/common/Header.jsx | 38 + front/src/components/common/Modal.jsx | 46 + .../common/ProductCategoryTable.jsx | 113 + front/src/components/common/ProductTable.jsx | 114 + front/src/components/common/Table.jsx | 73 + front/src/components/common/Table.module.css | 12 + front/src/components/common/TableProduct.jsx | 90 + front/src/components/common/Toolbar.jsx | 29 + .../src/components/common/Toolbar.module.css | 3 + .../src/components/common/ToolbarOnlyAdd.jsx | 15 + front/src/components/common/style.css | 473 ++ front/src/components/pages/cartPage.jsx | 84 + front/src/components/pages/cartsPage.jsx | 41 + front/src/components/pages/customerPage.jsx | 53 + .../components/pages/productCategoryPage.jsx | 43 + front/src/components/pages/productPage.jsx | 91 + front/src/models/cart.js | 6 + front/src/models/countProduct.js | 8 + front/src/models/customer.js | 8 + front/src/models/product.js | 9 + front/src/models/productCategory.js | 6 + front/src/services/DataService.js | 45 + front/src/style.css | 473 ++ front/vite.config.js | 7 + 55 files changed, 6951 insertions(+), 532 deletions(-) create mode 100644 backend/lab/src/main/java/com/example/lab/DataBase/Controllers/CartController.java create mode 100644 backend/lab/src/main/java/com/example/lab/DataBase/Controllers/CountProdController.java create mode 100644 backend/lab/src/main/java/com/example/lab/DataBase/Controllers/CustomerController.java create mode 100644 backend/lab/src/main/java/com/example/lab/DataBase/Controllers/ProductCategoryController.java create mode 100644 backend/lab/src/main/java/com/example/lab/DataBase/Controllers/ProductController.java create mode 100644 front/images/arrow.png create mode 100644 front/images/favicon.ico create mode 100644 front/images/free-icon-search-2997940.png create mode 100644 front/images/free-icon-shopping-cart-6518420.png create mode 100644 front/images/logo.png create mode 100644 front/images/logo_color.png delete mode 100644 front/scripts.js create mode 100644 front/src/App.jsx create mode 100644 front/src/Main.jsx create mode 100644 front/src/components/common/CartTable.jsx create mode 100644 front/src/components/common/CartsTable.jsx create mode 100644 front/src/components/common/CountProductTable.jsx create mode 100644 front/src/components/common/CustomerTable.jsx create mode 100644 front/src/components/common/Header.jsx create mode 100644 front/src/components/common/Modal.jsx create mode 100644 front/src/components/common/ProductCategoryTable.jsx create mode 100644 front/src/components/common/ProductTable.jsx create mode 100644 front/src/components/common/Table.jsx create mode 100644 front/src/components/common/Table.module.css create mode 100644 front/src/components/common/TableProduct.jsx create mode 100644 front/src/components/common/Toolbar.jsx create mode 100644 front/src/components/common/Toolbar.module.css create mode 100644 front/src/components/common/ToolbarOnlyAdd.jsx create mode 100644 front/src/components/common/style.css create mode 100644 front/src/components/pages/cartPage.jsx create mode 100644 front/src/components/pages/cartsPage.jsx create mode 100644 front/src/components/pages/customerPage.jsx create mode 100644 front/src/components/pages/productCategoryPage.jsx create mode 100644 front/src/components/pages/productPage.jsx create mode 100644 front/src/models/cart.js create mode 100644 front/src/models/countProduct.js create mode 100644 front/src/models/customer.js create mode 100644 front/src/models/product.js create mode 100644 front/src/models/productCategory.js create mode 100644 front/src/services/DataService.js create mode 100644 front/src/style.css create mode 100644 front/vite.config.js diff --git a/backend/lab/data.mv.db b/backend/lab/data.mv.db index cdafddd985c8297c5793b283da4b663e6008d923..69071b0df7261088f2492caf89adc0cf1bdb8865 100644 GIT binary patch literal 143360 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�-2v&hvlb7fdRS! zN8^H7Xz1r{HbDX#JI;ANvGoX+)8ryl;|oxv8LB7)VxD0`ZL9{kK;ll|xNL%UtQr^pU%?Grzuq zdTOEp&zob@mV40er+?Vb*)b+S<^Q#Edku3Vj2-aC%gr}~C?0QZ(`FWtGtnU4PCqYP zv)F@0{8-TzW_H?bQ@^&Z?yhWEyWPIAv4<9fxi;%tD2#Y%4h+E(;xKh*uodJ)Y$+vt zFk2?UujR+NK?|H$a^60&kH&G1GnQH4-tro>^WT=VlbBJ4Z{*yvW3BdAt^VG|%#PVz z);89R&ZfFIv*>0`J~Gu?WH{!HKZ8b6GWLrNTXOYT>lSegEB7yHyZx2z-Q{_8c6HWX zM4Rg~tNOaTxvVFz9A>%^zU3wv@g5uK5|A0A<+E&Vxs=WPzDTCJuiKXXS>%vX=b?~1i^(b#J=V@PQ(hnc@W~;Q(CqmqM+}1Dnek_ z1xg)X4QvYsXXzXFFVMr`4SdkQ=^fnif+O%0y(N>QIT>=mRG4pn5jj}~h=RW3A{B$r zE|BAEMiA(REw=+)1kwzU3aTOTdyxuWmN=&t5XL*^75doqLx0t~k$);O3|j@$qTFsh z+YOGLFKA*9%w?{ZB0oD|L_uh`16D594UXZ!)VJjUlY60G{z6uc^}CT_m&42XuI&a6 z=ygc9V=sdDsWPEp+D`L1E(nCWL?KjG&>T<@+3A84tb_1dH&#lxZ@M1%P1q>zqaNrT z$PmMxk5!OWDIrFrYqsiIumDyR57Qd3u2>dH)Ax$>2cQdib_sZK+_Wu#tUq+VcHsV5!z%1o6rb@l=n z)U)1^_c(nU8{zReaFWjOsq74AMcD$!Yh@RRQ^T)x_I`Gy@mBCFN3JCGpq{=;J;>R@ z>TsW=R3F8o;|Y2lFWu=&jZJpm;DX7)2a-!FndU9XEsC&Ym#$xONi93CP+>{Fz{n-_ z?2=hrlCPPpB%jLJDH)fP7fo#G0D+^MsgkAbJho(Zy^`M_X>Cx@m}XEO4QVL>y?jUuB64-RWH`lhHt4o=CyPo|HzS`**mrUzqU#E@yD;Nhy44 zgeTvTLPGwIfjtc75Ql=NT#8|6h(rMVb3&$`@ETQZnYoR15dS znCjS@AVqcJ|0xqG4}wB>Pv_nnD41IJ9P2KX#dZK8iJKPw*TK%L}Aj5Bzo}fP5!Bp#Qy(6{Vyvc#Qy(PFuMJ# zp8)&+hl*l+{n-~ULUw@mr+%?E@}hF_xz8q<04`s-I`R2eCtsWTf{HX9VsVwm{R2#W z4uU~ehel*PE{ulwSv5WjQ8QmH3H3|4-INE-NEnUq%9CL<&W$%J6xh;44dpx^fZ$pb zs8r}uH=qt4s07iILkB8VD6muGbITP9Y(AF<4-TwQV0k*00rAogE($D3Uh*>{9(yoY zcQ!cNPC%92QZ<{}05zDBi84 z_OY4l2UYw(%M(_`|C4NK1F#8-w$=A9{-25rbIWsW(==68-|L{&YpA>Jnue}fy=(Ic z(m)!YA~O}lH#rwfp$`J5NL4aOMkysP!%T^cB4movYLZqKPJCW%7M#L>w*9*jpa?-p zdMh$;#|G)~y3X9<#td3k*O#1~oxZhcs_xQSrjh9?OHocrfnko5$x^+NS>;Sn9DF5@ zBEd(|N_%@_c4=#NySs~)c6a9&I(=tpv$M0FyfQV4N|=-+)gfEFRAK}RSpMC6$MRBw zGb|T`mWaQl)g1&H$Adr;mDzT*$dgOVnxXtQJ$#@DGyu<`f)$$c~pRTJom%3Cu`X}0psLJnkRr}3;=XMIZwbPQkLck zxT^f~`me(~&W<)8Q^>Dz?NAur2meCi0R;rbZ=U%LLJRzO9v*rE>U)yif_uN-_#1Gq z3HQ#zJt%njvH0G9G4eNQxo?f02b!LMcRUIIlOf+ye*Emf90kgs86A+L0N#70`CIh8 z?~OhNl%9opNlFB$`mvvQtn--i;=ud`A>zS)C=|I0P$&WbQRv5aLve;h{sM&KyEusN zhLyzoh)BF~u7EI|Di8w4xWwzE5=HRnAe}`A8Mc7mM=nPj#T@2@Zy9{79wVwkwm7diC8w6f1F52OFf}v0V?_}c| zi*o_64OQ3U=^^dK}@H}4Cw;G~Mutw?789SQ-7q23Nx`TEN)jHkoJl?avPgp= z60xEPi$TjWMJCIYJQ74OE@N*@wHOC6(LCxhLv%tTCAuVe3=onK&4Hf%RH_hy6Uk=< z37mu^5q#k3AxRR!*L2HsATI=8IN>pJ!B%@aB#9U-wxq%x8!Ct|plV*5>5wE5VoXCP z#0ei*Z9HRy4%NnYPLd=-q@1v5&I(?eMQIbsc36^#*C7mZh9!%zAz8$$A1cZmTu;Kj zYXk00!vDMEct=sbNRA&W3Wg&|Ch-|K#thKPJo`kRV{Zwbci-wASuof1!oI zn@_r|@c%o@jmrLC+5g8kwmH(^C&vEIxa+(_s@^P|Nqfr@c;j( zQ^M;ASs8RZTtWtz<@l_Ul_6h!0`@>K|Kmvk=QrLw=p4R%a0FQ@>GsY^=lQDg|B1~? zmH+ShVen;06+ng12QmMj5JRh!baJM`Q>3I5B2qq~t_*zg7S4 zG4lVP9wh%azxnttoKapFXg|j|wtPq8EK*|${}}l{ehybw^GXv?`HAOkrw^T|hHU=?un1>cUHP<AjCbx;1mhsW2eYM$|F7cz`@Qz!TE8V*tt>LUXTrCi;VwhYCY){h|v0U@fA|7Z4ErrLN7^c?@TM9)F{zS)Rja?Z zF|%WKm$i*GqqC{*%`CbZn5J}}XB{0|W=`#H$EN74Q-$=~t!3Vw^@ z|6yH+MAW8RC=Z|F$JqZro5+vJ|979UFK&ezXXiTwndzcT{=YMn{7r;fz?;H{&xaKC|O9r_uyent)0Zkdvw&KJ2)}C!j3( zZm}kSt=fquAS(tQn|?Qmy#Xm*5}=B+?Z!dspQLQNMhW0UQFs93XB-8WiTQU>kt!hc z41k-EWWCU{eLpv7HPw*#Yj9P79ImcPssNJ{%`gB4>n}1yXSG3yNn2_Cg-jz24+uQ~ z9V#H&l!!Jt(RNBeO{8jz6V0?kCn7q>>7sZ;nMO`@U=|T=Nkm(m=#)xJ;X!iF;_dL%=1*0S?)XOJfP z3$_g1EB(cToSb=J^vI93AiRIOyVmJSmf(~my3^kg==y|0@1p_N3^n_O^O^ zYuetnvxL?c*0uKX?t-&!E@pLBTnABvS6^DkF?jVvzm^57*T4_zC-cbd0{<_Ozh%ie zmj5GU2X^@J+5c66)fG`2j`06CDK1m23fU1ds z!?*5P005K!f9@3W|3}Bj|LQ>bUw`b(spNkY#h7}Lkor+1;{Q<;W9mh56hS1S2;jq9 z$^Vu7U&;SDspR34{{?nDtQTAyVR7M!g}q2xB?xf0A$MyQo=^aO1yml%_yO3yiXvHD z^<6c}3sERaOp}BvYHwFfloI`fV*rYTke$P1`X%`(ap#{i+X&^ZoVNCoXo zh=A>DMc{hyZt)={bWlQFCnY(>jsdXta{dbRn?aHjqcYY8WE|J+s7M>&TUMy0*lT%_ znjgYINJ6!63`h|j%c$^~;6xAO&2Svi@poMEX7D8%sf_AFBMKn*fRKdfVz2-qqauKo zWPXOj2-e3DU8D_=Y2-vlh8Wq2U`+@~h#u@1Kn6V{S_DTPKRn_sQ$`zL1NtEOOKSss zE1{7QO}9{a#{g9#y4W!w(HW*aI+Hb{SZBy~dI_*)l-=o3vNcDSfh~&{3D}~fyhUUqnWBP@TyR)3DjNYoMWf}13G#1=3AIfc+1o5g3s+k7v@-PX_x>VZ)t@5 zpUB^0aB3hp$MV1H*nx#VHu<06B=cboW11p1v(bDSU}n(}8H71)$iK@gBL6ScE-Upj zHAQ*nLq++~Yl?F8x>Eb=zX;cm!R5FAfc{?l_Vbrsc>Z$J#PId;9j)p3j;n@9AN6&| zw6UfrXP+FMsMRkiO%$qDgsiBEA}vyp>cWW^>5dhQY6xKZaM;w4t?Pl0o0bf>+Y9ZEr)zq50hCOUWaH6YV7c>2)ZW$KbbKwLVx}(7fe6vE`)|ds|gG+d}v?ObX48fBh)lq@G()L6{hbR zt{dSdI0x%+;=)N3>adZ1>G0+oQ(w}i-g@WO(cw)z75Y~^aALL@9DCe)A`#bgeWkq}-n!fIbp5yvW-$0(``8u3< zu#$)VS>J?o1zOX$kQ)T#iNJ*Q-N2)MU}=D(4?keXfXKS09~vf(qL7@x176Vdqd;>^ z&29#c9@>G5nt=!V$-shNJlF6|s5sPY3wx&13~kMIEJtqwB|dy$;8x(-fdLhUSk>Xz z08XONGqKsk8um?$!X|w4LQp%{a1utoX~2o4yAIaj89PLl?*>imsW<{X4xD%)AgyCK z@jV>b8acrvk3kbhkV8O2PBVfp9OR%-n~~=F$UspuG7MWaT)1Tzjt^hZW@J0Mr~0TF zIU%%64@M(j^;9PqrW;Q*)*g-ut5y^)Bo7B$9>MWkHF;{_7qS}Ig%U$GY^q@c0;If` zye~6F%Wq&;4*f0I+k!T7)w}WX%=JURha-Fw9|ZViLhmCubYB~WORMTKhg3lk%tdz*37XtIOF z4h}nbw5&$|)#*=$&kg}Qg!Gn4|7ArjR*}W8*y9#^+zM$a3)AOq`mfVE@IY(*_Ca{K za`?s+nhb7Y?+A0Ta2kbP`T;HffK6*S^8D*~%F5n0C%=r}opvJdJf_~!-t}prp_0qF zCn)Dg?*rRGhTx(XVjn~}Ct?NPJP7gaDJ|C!UeI?u$eIU+aiG-k)d0k{;4FRP{snqC zynzq;H@$;fASQ$4d`l)rb28*uT0#4Z$jLH56a*b7QZb_B_?i&}x?#)h(6c=z6(q{h zRKd#<=hOnixa#l~`WP&ZtKN27fBd_farWe>Stiu~+=5e1>$4umzc zZg30-8Lll4nA{8f@)xpltly0+p}d^$+HT-Lcm(No>_zZCRVEZ%95O8w1%Xh|9F!L{ z2NXnhy5I!sApF)1_)-;eUubpXK7tPzZMhKfDIr2p46Dx1zOXh@n^5Rvcj^51*fQW@ zb`{Zs&(C`U}}GiP&vitk(#>FQdef`%9XEll)AFcOLZFZEhF^; zBlQBqNXF zw}M|eawVw;_4HNhLCzLdhx;U@`Y0Y9Ptfal=}up2Y_jtP7fcRr9&kw|)4T<_MG*p8 z^6NKWzvPlyc3z>vl6--YOG5tD^u#JInR+Lm%GoIymy{Pxp(kVSO~Z`6IW=GLs5Q`2i^-Gc&7-Gc&t-Gcw%m#B`+IIi4T*1mAHs>QIEMWV2=$ zr+C(RDsu2+;0|1n#g9682|pN%vNYq`ixBul6tGmz?at685cpNdJT?ASJd;G;Z02y9 zxNph*&Qm4p7^ai#I*kOG!gtzY7-}vUTM)8#DM zD$SP6k{uhwwil;CHp2iAqQS8c{=hHy1lf`qXSrJ>uYf>D#kDy$y&yG1=5m_Sm=AEc zAc>gS9Uc6};|l|_izOG1d?8l=hEjNp*QSHxTU^G3$3O*g2QnVdvm^20fot&Df#d5+ zvW(q+D^7{~uZSYXG1{fB|yQpEy~W(kBO43U;hZW98L$AkkAg{5E?1FJ@Y z%S`GfVy};)GAd5^JMsU2x%RH|japrKf9!h~m67+y#z($23h4eL-@8c9zW+2l^Gxju z#QBqF;O6%(!arn;JX8BLMEBEQ-y^@$N6$TX?mr$E(|?S<(TR17etZ^3@`rIGKaTa1 zSfKkMY**UIN*gJnN-J$-CBZh$*z_ zGHf9$rI$huL^Bf==;eV|p(F zlOTQBbjL0N8-Q0QA8i%^4@yCqrLvYc9Ri=wS*$x10i{N)JI%r(fc_5ti0(8+DWt|L z=zJ;cJ!E0;$oE2tqiO<+06=prC~z3OLB`K`r;x!LwB1-|E)i)!thN}TRC5Z+A3+J5 z8?r!1%wISsM;J)&ZX_Bx(GVd~Ky-pPh=3?Yv~2NF zqu&%-YAo;uhXJ6-5FH0Y$5eBOfeh6Nk&J4(Nz1c30UU&F38UIfh3-=wHP;G*hWK9S zsM!cUnU0$8Jnvpd%`0F!YH^X*QB&-`8AX}=P*JScL0=79$Ug<=e3A1q+hV7v z3-mCsJU&in7w92&je>!bfM+4hFjjmpEhXzSGZWnZE^yiA|L(hhSHQYJT%5EE);kN` z&T^x||Euu-KC$?JDfv73)Hw+N0NDRb$T{SlP*gtdaUuWv0;&lKi!O64AUjal&Lx`< zD{Z*71SV6MY(7kE7%qIC<90yh2K{* z1Xq%ehTuys&W@+D&?=4R;MJ@A)f>IV)pl>MwcOp4AYl2g`|#`jT=rE3NT^EVvyk%T ztL>G3x7X^oXI4t_WC!GW>8!79v9u)Qof2VJ$Ds{*jLbBVO5^!fYwQMZR;LXs^K6ck zghRlYt?{epNS}}MUuiawnZtwprEuGzDzGjsjbP8a%RZMJ)DeC#i_^*8sK; z7;HswrG;HFppIm~_PTT39>E&kl13WgYzD4WX~47@yIIQ8mDSGt=E~g6*0rsPSTum5C$4;v~JKIWztkk5rU(DX%ui)=Mx!zBYJ*u3wuP|krxL@>J4+L zI}d9@yVq;)k=Zg1T|3KZkfylAK6zRjnb{$Y7NzkLbk?nsC5Mcv@*YaMZ6BR>!%H%rIoYmjL6PDc)@00G%3|udf^^0Qd8qm8n5vR zPX^@`;O|Ez{5`?6FJ0@ioQBa!J~l;MF0JF3IWNr&Xc`qul*UyUr|$_4Z?7!^)H}>b z`0Pm24bsRDkrOSy*+`+p!>9DPj{N-b z99hv8W_H?bQ@^&Z?yhWEyWPIAv47;RA7Y8Q4?G&7*`sHFx}?w@WzX?y`j)xbSsX1JEmxVh!F z+h5tbRiHWg;_LFqSm2=x5)k|uvA$YREq z=#1p_P^Je|8YTGwxGXx?HUYRz)%QAR^&0AKyQZOQR`1$8@3!LvM6o#Lg&2L%08RDC zprKhxUuI}ZbQFDgORGtmS-8L9)#kQ01~l&9-K#ZyZW%VxU1x4_V+Jj&>r2kgPT$%z zRd;DE)5`RmF3p2l`i0=Fg)dxTYg5(d+HAt4{7UJhTxoA_%r0%sZg+Rl((dm3LZ|O6 zZFY9nlXs>jrRcEKJIPi<+#vhD^iJ6VrhoU|F};-H4AUioiiTEcHA%w@nO!opl;*EK zceSp(P!OT!#(o{H$l3@HVZtZGi=);&PyFV`zxgQsEs1#3EANogc!&I&u(G+rG>BLL z7`Qs|JPLs)+p;;7FBsN{@>ADh%c}tMhC4S8509oT049Jx$ej%}iV!d#xv*5{%{rbG zwgQw;W433?#%yFqShZu@yDN->h$ZxrEXBlLpR>JldQohH1xy0wtz`;wsaZ-l!o;R+ z0=c$r=gD5<3!P_^ygW%n1$;Aa)#E66dx-@qS zeQ^MhgscbBz!3c9E)7_71l6Bp ziXjkNhU#3RU- zs>u}^`-6bS{@{;85Ix7A`1>5h8@>ep_&YTJT;or6WDxIj|EC1v?Q<}1hOdntSP*af zI1uj?wsH>Rvv z3$W_UKyyARAl}dXTm|AiRe^ZtQYlm*-cqg#0XbfQc;8bHZy$iX1HkJ1e_lK~4#Yc1 zAh}~FsAJ%~WB01Cg3Y;g8po*E(@3^HrS0{_m=xS#FF8b{?*N zjvIkM9@ZF8RpJ{{;Bmrnu{B3{aA_GjZ7{GC2MEB<0N0@y!y7Vu3J(YxsIP*9m!Efu z2qlCEpo`eJP~^*AJ(4%q!+<`nrP0R;O!mD;AC~|q00x~f6+EhBun(<5A17n>9-)uN zu3RvhnbXcNNZB6q*f9h+e%6)CW}cD6l`Hl*1CS!kgPF({06MWy2}F@R2AHcPLV-L6 z)F@uO!q`nR>&jKKcrn_+-%daj36yUEM$Y_yGGOFoYk*8Dca!v0E46rmw~@^dn)D#L zYrquhY(zYVY=G3J9!kvHNT7m0kf7dRm?xm#zfHW2URTciqYgU~MF|1<{u6RvQO-W| zi}YCiQ*of;K*fQI0~H4<4pbbdI8bq*;y}fLiUSn~9#Ren{C^1%TK1cd{r^MXfDChL za5~TVTxsF|kA+$l9Q+62|7U?ty+T-DtN}=K+zhCjXz_e}Z@m9oEr$Ppy9EFLC6Wn% zNb>-~tBG!g}-h@q|Wl42Ss8z7S0 zIAjakWU{akW~t-@;swOj7kv4l!^of1CmNfwnNwt!!9$or~xU-&XX-_kaqB-4C(+ALn^u2u>u&47m32rCKxN1b_iYz6ltl zlz<35A?Hy#aaf929s|Fr&VwKK}& z=f@P{PV)X3`S*Jl!LMZG{mbBrq(1fU&wK+Ocz^7B7vTqZV4OVh9(jm6pumHd$n(?{ z<{IWI{04a=+&T|8#@Kt5XP-Ja`!`5I`28&W4n@iP z;rF@Gze%6}*64Y7HK~vM{@JH~r1?$wol*?-e{1yp%kiyeANx&q>%CF>>iE{P7ygfP zzeV5j-so9)oIB7wcJTbyA6H)dL3qW)VZhj{JYXIX519X6m=DWiV++iOJg67Nxcr*X zNpoO+VNA0$6EfV#LA{abi}V51Sj&{udHbQ4D6WAn8q}+)a{BEkQuV}nM*ztO)Nc*| z`*}(Urzk}Or`-T$KF=I3AlWh3ryJCc=L6cHgmhlw5CcYoSjS!*DjWH_7emK~0+rq3 zE`EYk2;xkVN$?yEItlK*J?)49Pn+xgH9;qfK-A47zSE4t5E~+Jx_z{RZ{B+I@L(Fj zixWB-BD^I6LXh$BA;`ism87Qj(@7b)Nt=Z6##6~sA(k9WQ<59OFv|ceBP6!p z_flB|?8N;c=RGS1tvqCT8jPI#!wGz9Peym*cqLsItK0@NS={UYfgCQ*n@bY+3fOE=V+tVaUHADiZ`DzYs z68d?YrCfk)4vuqP#63eE1`RIah-h-b7EwEd^a-}eDnbLNnYoe&PV?GK2ht~qs!5zS zT+rHJ=mb!kxCqtcA_S1w_zpm)sg|eNrZl}HHoaZXPTqWqGlu{F6vzMn5b*!6DaxNoj+=8rH;G*U>Eyq>^J1Sy6^*R`txIiG}~L_WOw@(=be^Dm*_{1Mnxd`5v`ci7O z=^g%*K(&8)&I^tXZ@x?5`m0<7H{T_B3#wcMr=NNc{_<5V!c&l2X6^0k*HcN89{i50 zD0~#A=Y!wNAnCmN#Mqf<>dJegUIxVsf9C?&E8#IkdF*S?e(UUU z=D;|Cd8mt^_HbZmJdV?#V_%fOVSI)wbKoOl4*XVZ4lJ{&6=>7%fklm41DVPyZwg(Thy z7Br+nlW7;)Ok#n#J*@?Co^)Z^6532=E3h>)N$GB>0CVkl1%amW&?vURxt|mZ+$YB* z^s8d3;kfff#G0_V6~q1td*NM$vgOx>Fj*IX5^BAI@HWYM6$NUtE?{AR73eyGR(X_` z*awA?O;}$cr8iZ%XCm%gPmEDMzf{907_>6oA*I{(9f@o;`XJ`8u*Nb5qu8|pSu)vf z$~qXrJ!Tx#xp7c54>qvaZq}D2rC{L7{tx!f%KlGRnChR?azNPsCHs3~|Bn*;e+b`A z6I;$H%;rT!h5bJg7-R_3PlTEJsGF|vSA?u9%;hKKE~ zQ+-IetRa%+*~d*y^TC`RMorE1G*`v&i|whdYon$XV%=9E1GKJT4_gtO=#XeaH~l8y zv{-P@g%fP(4tNIWcBqEBtv7WqGM&h_nmX9%?Z6G;#6gyZ0yuH42x@2=P^$|7U~m#> z0ftu?YUDY#Wi<^8?EcvEn}$b>{0`j0o~J{Wh^7(gnytFAi>Z%4v+SZ)Wysn&N!s-6Pz-dDDAWScHF&3{jNx*U$Zz_4;LH)Yrkc3f!=K z-48v-^_#wdJk9fUIDzb7M(CgQP0%C36W|pV1muapg!SFPqkdq4;~4n?JBEhTrXLz6 zj-rs9zyn^;^rJv?OwDcvjt*aT6*a-<%m9Zh_{DP#pEzoT8aQQnrqc{<4g9;ny$dMu z;R6G=0?!T%s4&E;4!;I)5`~_L%_i2cZ(QRe_stb%?Q450O6xHBhB>@xW6?c1Dwnt z!4o-geE5PkBiqqE)kn?90e>`bZX1n!)l;2&?^`y^xH!?^y)PBsmzUmiwmclIxaVxC zDy%HS*WbqdcW+?f*Hq1v!d*`_Q>vNrAj}l)@MhLIapln80*^%R4ZP~zczNdfq2I$1 zzKIV4{4$x@kKoXKZ5S@C;v?@-WzaCIJjg&VJoR6l8L8D21yogyfAtgeIQqYT@!1zI zf*|tpi|xk9vr4UgrZIAMwE5UMfFgL}$xnUysi!}4;h7(LR=L!=d~K`SZ*_XzcE7tn zv%R=7+X7)@yfr@dUXA_Q+TQB+T8ne7we^0hdu?&6zttKizm2!H+AICm6%-oCh2Rp; zHzG?5^ee4}_SQn{ii!;vyG{tZeAA608~GqOgf=!E9daofChYk^iKUx??xM)?kmgt( zhA3Reib#&Bodm)OVM(J14HE=Q z?pJESb?A{{cmN!nZFSbyw)(v`X}rX-_(wvSME=#|XaH8tcCSfQrCUjm;l6!bcWrO= z*H>W#@jfc=o(_L<9~#o@Zf%XXIt%SyyF(bT0}NkWo4*Qv78AVR<`w}ym59|>W?zhH1IHpJV z+&R8OhTtvG*8%>|t*p2ES2bfIJLUMh_B*iT%&+(M_UD$x>^e8``4e#+IT^Oc?VwzL z6}W!8nCs%fp_ooyb26?&iAiAlSNZrEv}~p4x#)pomaTN5{elT}ZsIi{K&($C1Z2BH zyuF}4KEnp}|G9}N=)H}h=Zs$5dGWviY%emrzW}}X(*t`kDKS)c!h28FoBDX;Q>~ZA zdc0*@-OcUpS||4bg5Tkr*oTF^wY%6~XrUG?S;-|}3?P`QP|0c+*5aAHmZ>&A4fXB} zs8_6i$JA}Q1$93Kb$_wE?ri7pAM*|fYR}XEG`wT`_;(yrbs=j$1B2pOT5j1sHt);+}kQ2apVl z<$ABXIKM{r5AXrb6O~`%2UM4Epx2%2_Q+6$EnB=<5=$SOU9dXCma4Pdcm~*gRLbrd zw6fJ+UtR6$+T48GnAcX#xm9~s>+zSN;<*e{I5*75a-ZVy4*`$=sD#IY*z$=zw_HkF zhOb4G6fw56zND>#7@Mp{84f=S3-T`<^C3?4{qf6j$@Z1(Et9V*U%Ex}lN;wI6y>S* z`R2&Ti^|34KKuL&FMh6dY5b*^U%7nc>crtwprEuGzDzGjsjbPPc!|WG`Aiufp<~=o!}* zL9WUvGq#uaXEv>CJ#DAIW0@nb)nQc2Z<9P5(e;=F~QH0@l>8 z70a3QbCNDUUcRmlqIkTuO`BOn&O`-sU(A*Y=6>MVFJ97QAu_wJ5j{=0tk-t?E8Dxv z^XlyCti6af*JoDsb$4@FKiPC6LI_bLr6w6s=KOxi#^q$QY;L)f&dlzG)=M-=xwU0L z9Z6e@*;}v~tkT@|_SOc$_z%rV4aVnBmTs%(+9voPtNLCCtzJXjZPzq(&FWp7=Y0n9 zSo(92nF`WwHa$2in0wjeG~f$2w+!a8t~0l|F@u)X^(AL#r*CbVs=Kt7oqICxx5#>s zpM~(fT+tS0cG_)IzqYRKu54Mm-M+E0hZe-90gGa7DyUJBC_jz8=Ew8kwNZ`)K+j=Oed;-1+tqURu6|58m`fe)-b&N6&tweWb#3fBGXWe(Iwi{XONi z->bLuCHeM(xFF_k{V$B-y7DcGP61f?fA|>%U@4$N;tqU4_nHy82|vd_j_b>h)wqHD z{5QTs4di40^Uj5d5lBus<$~4x9s5Vl)h;Nb!tXc@W~;Q(CSeoKoNMR0KJg38eyT@+^Jh{snqCynzq;H@$;ffc^!D;kRURG$%uj zr4_Wlh@30~L_r@Qpj8a{Nr4<+GlD=jY`GnJw#TG`Y6$F+3tpBurxp+f0Gz%ap;zc* z;5`IhMER$LBemRaJ=+bAoi8ZBN>k)#2aG5P?RFrPm~{h30hI?#?uCB&3t2hV??$GB z9A3_MZ8vZ<_CD-IfI6zmglcM8K_C=d>&pw80}3KLU2uYR5Ps_hxN;S8UxYoyeFPp} zwB^DFo)RJ=sbJOlS#9?5+Jr(UyG!T4$Cd#Pv#W?6e3cy#JFr#BXN!(+updo252p6V z2$fTO9;vA-Ep=t4u3Y&_N2x38yi}(l-!f7!Fj6lttkjc^d}XG}nL2v`3~Car@i=`O z8{zReaFWjOsq74AMcD$!Yh@RRQ^T)x_I`Gy@mBCFN3JCGpq{=;J;>R@>TsW=R3F8o z;|Y2lFWu=&jZJpm;DX7)}{CBd>1Zx)Ickux?p(E2#Tw-A8p_tNVK0H|oAwb8A-3sp&Pd?m+>k z?m+>+Zoz->OH@Z@9a%N|3~X}Xe+{s>{<{9Zo&UjLap4$?E2^-#Dl9IZ-$sUj;m9== z78ilN&tnBiU^b8nhlIjs(%*b?vA7Ztu^5gC21W{tt6-qOCiJvGTpZ+x;0)v$4x&aZ zY!xGOMRD$yQf!{BFe8J6ziOfGs9 zr}`>~?J6f+I|XLf(1aI*ctxKeJghh;8Hg|b^}_&wpF}bb0XGIQ#xk4JC?DEgW%(F5 z`+yP(jRu)Nq+x8(#6Ao;B=9Vf*oR-(m?ZWQXkEuZcd;@Yx{F;H5D*PHgLrMOOA`C= z3lEWmI~-E${zG?t`+2}8d0lCI7vew2k;H$%5#m1p((85Q{Ga_fMY#yaU-}S^ca-!0 zEzy#}_4^%mBwADzY zN>PfGCWw(1E{Zlqiv|ILAW0FRNYfyVo2EdU{D_<6Pm4AUkTfXzBWTeUMS=ni`pYO< zr0;y}=j|Sk@+p$75d`kX&Cb5_%$x+?&^2H7Emc#d{Oz5q)-Ggo)7!azc^i_!1O63n*Lm67 znXzS2^kofA2>c&MfFr;W;0SO8I0762jsQo1Bft^h2yg^A0{04m1+M?!E9m)qIRYF3 zjsQo1Bft^h2yg^A0vrL307rl$@N+|et?`S27l1T%#oGd#z*XzojAg;$)(rAgaq61& zl6QSZncCUj-kniI1N;L-#r9QgYWMP0Z$`5XQ8OW3=mY>cUc0Gp^1kNJ@V+`#~wd&^w<+mKK0ILPQ0u9Y~|#s z(`STd%gh75-a7(p;rs^Zh5U!ZqT)(u~>2}H$ ze6LdORF}KuGssntsmq#WE50T<@|p5NwX;w@BYKMInTCrLq?*33Bil4QSNBvymJCTz z71NM4PgWh-M807m$|kXp3RA+Foo{+Z$y_854`$-GsZF)k?Xw68kMv zvUU9XhE!w@~fxDQf@*)+VxJSQm!pj+tnHdU>yKoT$w*Bsp=%F zx5i?-)7@ODHtTyNT(0hsZesEbRPVyT)vKnfH!NZWN;i2HD(-_h^%kTYsIuTaiORy6 z_pK2XelH*T!X7okzMZ`*WB_bIz8c`)SZ-CjXC-Aa{mHR+ZPuX6nQyf>HXBR9*EKQu z{Ju~}Mhf<@90c_j0QFnhs0RrL0v*3*f2hL~F9PgA_mI+~XCB zl<|%u@Q&`@@7N=2UF`+tD72)HvYgZXePhY2udXgGh@#fmXf15aUs}|W(d{msU*9BY z2OaBr2e>jGnLB0DjZcmqgO>NNLmBP*hzuQ7t6g85U%_KH41T>r_4coQvWpOC*BkXV zZl^F^3MVQ-w?jWI=ow);Q(GE+0^r`wg?kn)cdD&svo1@G`KmH6HPuE_pOf0`WhnbY zhVQqhmEo>7f$@`o@xSC?90;5LRX3J$WlQ0jB}o>rx%ow9?FVes6{QeSA-LtwhzikI7pS;djC~aE;Y%|8W3juF!dPf>9uVEE*ouBPp3f zX8b%cIrRnde+3Xe-3P|UOJ&oxEG^T&Z zX-rx3-F^)#w@OkCi{zU*3u-Lo<`GqEW@Ey6ve7U6L_uddw37?ya^mK>wLlwA?)Q_{L&wG3d3xQg-IZzZH%bgg1^9Ucvv$g|Rn| zbi7;E)oWM08thkjX?y23Bs+HGXT>iT3Ia`Z{EZ`UZ_IzBKYrEQwWcq-2e5%`8jaI~K`$kGQ0ZOEe60|e-9)ze#wKPrG^Vd>%`)SNDxw-8N)Wbs5cR!KRFH(&K26<_KnpNshNaBp zl_{38kHr;{?7>bhW|Rf_G+Eo1ybh69SDl!+qW+aYT$hO}4-71zNb6o_@=Afcr0x~V zcjNfFrks>l^m_4iBYa(oujqBMGAg_PDc!X!99={C9_0P5DMo6;l&eza6k}7Uz-(# z=g$eFUx(fo{*8Wf9q$?R-zLp2tjoM+hXB63%0&26*PLBK!M}Q;15xDOV z2o!;6{XLqB$F|W+mTt?Ist;lLJdwo&d%qOS>l8BgpmPkzB`Sv%OgPo#gj2Ce4~;ZS zWfM3XsjvpFM6)vl`QkZ`VS9)?dh-xD zT;6iMTho%5xRMfAYU0X_U&$zOr5%jrslW90t!HE*lCV{KixoL!irU8j%kTJ{xhn&nC_5R-;o$@Km7N@As8 zS4KROL_#@vl}N~7p?R2(66tomtJju^+<{(36HJ+p?c{r)&)L zWa6E)=_$a|ku9xlm`L zp%mGwq`+1sS>c%-o;fL#RMHgn1*UYO9?!49paXzMO6Q$Bg!O8~F{YSoC$X3UDw>}S z1eGkN9#dNx7$BIf3_PvkqRK=+c5E_sNe=u*RjR;u%_6FV?l^(j0fsM02R*gN%z)sP z;b;u!cqEe~En#RdBKZQFlShWon0yippb?ZxQogkQu2@8W*Bum$s#HEn&ydfF$wv)M zk|cRC{50dMA%20S34xIbeEj;EnizU8zEjf;Sd=J;fwj>lwx*c1kqK!AwwrJ&&{O|X zTxhEHD~1-6Swz_AKqnW>v_LTlE|@OpiU?)`Fzypwkc|Iu4c3NV?vf+_!x7*Ja0EC4 z9D(~5fnNPPnsK-hjh-o*rX{NOn^K%J9uD>Yw7nYp|1|>c#1Ii%60cRTD<6Jf?8_<4#~~H&)+vnCrZiYKMWd)@IJ9otw`cI)UN6OCK9-rwrX>7H-c<`|M(; zx$F&RDF^e6gy59;_Vh*@Jqts7w5@Pu5%zKP>|I)0+MKppYPM2`$=3WuaRPAi8DEhH#_}i z(B5dmEIgK_h1vCLRh2Kb#EZ)v?P9&FtZtx%z*{@LwJ_+uQzgifAqffIFZD`)C&+!l zk}G(BSf*fG%X`@j5caP0Z1#yy+4kBugEF?wya>hoaZWL@6XoD#Y%CdCv)k0V8>_SH zYJEvsT~TTm#EscSGu@TNh3;f`X#E;e)bz96TI1QLeOvLiu>9R6RkORic5!K5oNLbM zi|9gYwkfyF3rlkJ%0a$1j9bq)hWC#3-4Kv!qWvZ>xpJnFW|CyN*5>9Bl{Fh)$TN+q z2&e}8`_c~Djip+%-Dz*ENE>U$dDL2HN!6u`3r0&_WN+F_Zz1ilXM+U-JpVqgDFKqdlIy?TsH&2M{i2D&jb$9 z9;hBL<$jGbkx4%=bHz)68Fb1yc;;pkl`<1gmTkImDp0on%xNfrB>VXGU~_!kXe_SI zq9w6)-dJDnY8O<|Jin4EWHQU#UM_cBV1Sp1w{4$bU3E$a4iwK^_PS@?`aRx!FYJ&V)L< zUBNo*w;%i8qVUkb>#X65tNWm=xRU4~(TXPX78=TmYutAzd&Sk|E3U-5f2b?2pAT1w z(~e-lD!Z0g#HRiLckUq8yDA*7_|R!AzACKrUlpddXuL!WtHQ+L9IV6msJtKS#o!S3 z9lk0|fZ%^P0vrL307rl$z!A9D2n6f@(fWI|{_jQW|CS8v|MFd2{|~l=1si7L>;HP- z252%bK$Gp>wTY{utf?lW0VM1HmLK!*l-RyP9AiS_ENlM&#Eko}_H$Z7Mlaom=8!F;0Bu)4 zU~_2+kHd)Y@xTKlZ%9b2Mea$NoHKpJy%AmlrDHfFM+?5i=!c0(Q2Ndu`tRbgg7A}Z zVeBX4E$8y??K&llT3EbkZJoz|wr@hZ(+8g%d7>cv;D9jpg9B|wDz&<^?cQ*9OW!&* z_B+QQQTbqV6bPu`9Ii8%rw$+drLm`RCN#Nl^x)zFuOPe%FMo9$-Va#_hY$YcxR3AA z>(OfIjgs)_po>s$xCrH?7NHmu72}>lTEI-jj#hG8Aib-x)SC8|*(UgkIKuTMI6eixzYibb+JYne8}UAwbe`ku|6w;9+h-l# z@%8^?w;10Q&e#7*2hRU+1ULd50geDifFp2UA`qg{XZZtqTItN4yAo?6h+cUd_;G&%Rm1iy#9Z>@O7a`_W!>w z2pVv|0uNxZ{?0Qmlnfve!=zqyG6w8HFhE!5~S<*#QE2+8%JPDdpQW@=ADd3zdskW(@rtg(h7ucFj--Hw2m65NM zR8Q7@5E4!-$3mtBCzNllq#+4ey6eITP`a76TGC`mQjiZPifvmEUa+KTvMdouB+dJO0YfrD-xN>FPx^lzA9E084*F2u) z!Ng}O)i!o-O|R3K1D;D72yPsw8o)0J0UA!H5<^33Z+|doLP4t0G1`l#Q}04f)3djC zz3R@6bvtEM;v-*%6Wj8901Hk$QPP!?4@6eTHN=vyz#IeOBjXdpMlRgZ4cQWHRPqhikX_kH zck}#C3ZsQ10*Q5kXyg;5(JO-iB7bS16vZaLC^SNf;*y_K@|QlU z(Tp^9MU!hZxkkgXXdX$glfQ-@i^tIuY(mY5#=(rM@#oBR?1nzi8L{_4_=;4diL3{i zIhH=iqQLY7gJ2Ibb&y1;2n?qrips=XNi*rAb1ee)G#ne zpg+dTA)^!ku?NF=8Nq`zzzU6=B4!B2D&{l+7&-yy40=-q%3!?Qa=ID}z4yVuJf09g z-C%+TnZi!1fmyWU4W{RXcK!?Lb1aZb3NC{^$CQ8iK4t)j3ktN#$%Ym_2$ls<(DNTu z`#cD?iNu4Gv}uR&ax%)qg5ZR81RXU=6=>}wzhFfJ$5wjR-;516wvt6U5Xa`Rm3V9= zh{}|Rb42?V9$N{zudw$GOl^sHPU(RHL69pF@rv0c$!DDP>T++$z2^m>N%%vV;n!~?nyNAgnH&RiT z_O;!E1TxeeHwc+b1T=glDR5?pC^Hu8zznu~#6vKN{^vrNgS{ybPYH)$ip7Y!r!lPX zCI#wDtLiom<(%-Wr2(@TvsNPZE{?hT3ii8z<2hmMSMiD=9C18GID%dQM?o0>t8NA> z7i>uYFWr$}{1Hv_w?7cZ|Lzl4yqdM^y#&j_aQE=Zuascd)KAC8{`e?PboAt>AA(&| zpNFkjpFaQ_r|`YQCx2@Kc1?xXkDdIVhrbMdAqAWUhle_L^1lxL3AusF__3ej1?0z0 ze&^6vXsVx%;Z%=Qo`2*ud;?#=mGS7GhF6CxXAgfBU%}(}*Ta?LkNsKVy7c(h$Ti6u ze!q3(&tun>%6pFzm22^Jq4dw|f&j;de!LzFRe9>Uj~(MGS2BnpSGmHWI~?@6$_1f3 zA5@jAa^VTCa`AAsff)s_r{-(&@u0LY*GO6!LbV_f2$!o|yB_mSn+Xx(DwlNERIV}c z?Dmtw@vI&0a;Ru2;h7qqX({FF&FyffPg^cKdhF=aqb;%{Vn>M`Wp-59QGLrOeNjMI zIiWg%N|LYi=_Hyi@`6Zk7Ss8HNN@&G`5+QpOyv_D6++F@UDGq5QHkJMWU=e&ZuqT9 zYD|NYi3WvqJrQJAj}%pf$?OmXs;{C-WmaH2H49=JL;^;kqDrFJCKXlDvCTkAEOlIQ zjZ3Y?q=x8s5E@v zAh8&M<;vqP83o%Cvqh#sOAT$ud1|2Y3&rCeLc{$_CSsa3{iw|AEa zJbc+hSIn{~x%n-!=X}lok4H$ozkjks&|k z|Lf-S7X}ry2mha$!7Rw>|2X|$I4va)KuXodssd%i>j>Ma!LPtJ$o}Qe(cV z%u7wR(bVUp_S=#E@9}f*`t>3Y5gtz26U4fG;(*5H&pbpps4|^EdBN)zYu$4qNh4s) z`75p3LcO-cLxe{LKpatkhX~J#T0S{C)DYnrnkEks9+|8gO9O<>PFQV--8nIB4(Ec{ zjF^}U@(|%XM0l;F!@yytNj?s*jM$e|@K?m|X|Q%4fy1nxt6%6*6i?*{iFmDM}(Cy{kK za32c&OL~Ja_%TPE>>v#K*TM}L5zQv{!RhPr#ALpM;FrwhX+W8y0GSErArbY2j!5jv zpe{IB@y^-KiuatryA@zp#S`Sn|8N920vrL307rl$z!BgGa0EC4_Z$J{{~zk) zUg-a?0Y!_Zt1feaAKGCect2wP|31^+uUgk;SgbtB>*4=**oJvvj;DG$)pb-9>0&@4 zME(D*yW#(Ty6^{-|9|-$<^P9c2LJ!}IsZTB|L5@t?olj;eG%9VM&Qi(|5;3pARq$g z|L5^W;;~lt_07FKxJQRxWWxXdf1LlH^ZyHj^67K_e;VqE^Z)loHsZZ(ChPmqyY2fw zL*5cHTf#ko<(|Cs{%@jO!Uut_f9SQ$`TvI>&tT}41jg>l(VtQNf3TMlo=!NX`TyU+ z`TtXdX`GCblTiYf_Du^@lhb&-4>PeXw?F6aN}{QsQ)KS_lgWAP8EfU{Wq zmA5?qzq1$rzcYOPf2ZiU5YpsxPk-q^wnP6OZv25mzbwAp9Qq?l!X#IHhJUwBi2|J- zM*-@xtUD-h?4}O=Qb7Gr9r}SNvX>VU+#f<$2+5|-1dlLdR~G`7h7_2B;sG zC3Wn!Apb4z*6xg&_C+VY4M+n?W4;YYag)C2dy4E5kqtX8v8Z$Rc@`wXCJyYfrkZgV z63ds8FaxDzf0zGU_xUjDLg-tAXye!`>cSncUiOF>Z@h3GFk!|#{6z!%_ftn27IlGM zV3&Rf!I1FpzoV!N5NZJaasPh;1OLMj;0SO8I0762jsQo1Bft^39}wvEzYmpO@SqR< z{|yWL|DC(&|1Sm6320 getCarts(){ + return cartService.getAllCarts().stream() + .map(CartDTO::new) + .toList(); + } + + @PutMapping("/{add}") + public void addProduct( @RequestParam("productId") Long productId, + @RequestParam("cartId") Long cartId){ + cartService.addProduct(cartId, productId); + } + + @PutMapping("/{delete}") + public void deleteProduct( @RequestParam("productId") Long productId, + @RequestParam("cartId") Long cartId){ + cartService.deleteProduct(cartId, productId); + } +} diff --git a/backend/lab/src/main/java/com/example/lab/DataBase/Controllers/CountProdController.java b/backend/lab/src/main/java/com/example/lab/DataBase/Controllers/CountProdController.java new file mode 100644 index 0000000..188faac --- /dev/null +++ b/backend/lab/src/main/java/com/example/lab/DataBase/Controllers/CountProdController.java @@ -0,0 +1,69 @@ +package com.example.lab.DataBase.Controllers; + +import com.example.lab.DataBase.DTOs.CountProductDTO; +import com.example.lab.DataBase.Models.Cart; +import com.example.lab.DataBase.Models.Product; +import com.example.lab.DataBase.Services.CartService; +import com.example.lab.DataBase.Services.CountProductService; +import com.example.lab.DataBase.Services.ProductService; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/countProduct") +public class CountProdController { + private final CountProductService countProductService; + private final CartService cartService; + private final ProductService productService; + + public CountProdController(CountProductService countProductService, CartService cartService, ProductService productService){ + this.countProductService = countProductService; + this.cartService = cartService; + this.productService = productService; + } + + @GetMapping("/{id}") + public List getProductsForCart(@PathVariable Long id){ + return countProductService.getProductsForCart(id).stream().map(CountProductDTO::new).toList(); + } + + @PostMapping + public CountProductDTO deliverProduct(@RequestParam("cartId") Long cartId, + @RequestParam("productId") Long productId){ + if (countProductService.getCountProduct(productId, cartId) != null){ + return new CountProductDTO(countProductService.incrementProduct(productId, cartId)); + } + else { + Product product = productService.getProduct(productId); + Cart cart = cartService.getCart(cartId); + return new CountProductDTO(countProductService.addCountProduct(product, cart)); + } + } + + @PutMapping("/{id}") + public CountProductDTO incrementProduct(@PathVariable Long id){ + var countProd = countProductService.getCountProductById(id); + if (countProd != null){ + return new CountProductDTO(countProductService.incrementProductById(id)); + } + else { + return null; + } + } + + @DeleteMapping + public CountProductDTO reduceProduct(@RequestParam("id") Long id){ + var countProd = countProductService.getCountProductById(id); + if (countProd != null){ + if (countProd.getAmount() == 1){ + countProductService.deleteCountProductById(id); + return null; + } + else return new CountProductDTO(countProductService.decrementProductById(id)); + } + else{ + return null; + } + } +} diff --git a/backend/lab/src/main/java/com/example/lab/DataBase/Controllers/CustomerController.java b/backend/lab/src/main/java/com/example/lab/DataBase/Controllers/CustomerController.java new file mode 100644 index 0000000..8044aa0 --- /dev/null +++ b/backend/lab/src/main/java/com/example/lab/DataBase/Controllers/CustomerController.java @@ -0,0 +1,56 @@ +package com.example.lab.DataBase.Controllers; + +import com.example.lab.DataBase.Models.Customer; +import com.example.lab.DataBase.DTOs.CustomerDTO; +import com.example.lab.DataBase.Services.CustomerService; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/customer") +public class CustomerController { + private final CustomerService customerService; + + public CustomerController(CustomerService customerService){ + this.customerService = customerService; + } + + @GetMapping("/{id}") + public CustomerDTO getCustomer(@PathVariable Long id){ + return new CustomerDTO(customerService.getCustomer(id)); + } + + @GetMapping + public List getCustomers(){ + return customerService.getAllCustomers().stream() + .map(CustomerDTO::new) + .toList(); + } + + @PostMapping + public CustomerDTO createCustomer(@RequestParam("customerLastName") String customerLastName, + @RequestParam("customerFirstName") String customerFirstName, + @RequestParam("customerAddress") String customerAddress){ + final Customer customer = customerService.addCustomer(customerLastName, customerFirstName, customerAddress); + return new CustomerDTO(customer); + } + + @PutMapping("/{id}") + public CustomerDTO updateCustomer(@RequestParam("customerLastName") String customerLastName, + @RequestParam("customerFirstName") String customerFirstName, + @RequestParam("customerAddress") String customerAddress, + @PathVariable Long id){ + return new CustomerDTO(customerService.updateCustomer(id, customerLastName, customerFirstName, customerAddress)); + } + + @DeleteMapping("/{id}") + public CustomerDTO deleteCustomer(@PathVariable Long id){ + return new CustomerDTO(customerService.deleteCustomer(id)); + } + + @DeleteMapping() + public void deleteAllCustomers(){ + customerService.deleteAllCustomers(); + } +} \ No newline at end of file diff --git a/backend/lab/src/main/java/com/example/lab/DataBase/Controllers/ProductCategoryController.java b/backend/lab/src/main/java/com/example/lab/DataBase/Controllers/ProductCategoryController.java new file mode 100644 index 0000000..a4eac8a --- /dev/null +++ b/backend/lab/src/main/java/com/example/lab/DataBase/Controllers/ProductCategoryController.java @@ -0,0 +1,57 @@ +package com.example.lab.DataBase.Controllers; + +import com.example.lab.DataBase.DTOs.ProductCategoryDTO; +import com.example.lab.DataBase.Models.ProductCategory; +import com.example.lab.DataBase.Services.ProductCategoryService; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + + +@RestController +@RequestMapping("/productCategory") +public class ProductCategoryController { + + private final ProductCategoryService productCategoryService; + + public ProductCategoryController(ProductCategoryService productCategoryService){ + this.productCategoryService = productCategoryService; + } + + @GetMapping("/{id}") + public ProductCategoryDTO getProductCategory(@PathVariable Long id){ + return new ProductCategoryDTO(productCategoryService.getProductCategory(id)); + } + + @GetMapping + public List getProductCategories(){ + return productCategoryService.getAllProductCategorys().stream() + .map(ProductCategoryDTO::new) + .toList(); + } + + @PostMapping + public ProductCategoryDTO createProductCategory(@RequestParam("name") String name){ + final ProductCategory productCategory = productCategoryService. + addProductCategory(name); + return new ProductCategoryDTO(productCategory); + } + + @PutMapping("/{id}") + public ProductCategoryDTO updateProduct(@RequestParam("name") String name, + @PathVariable Long id){ + return new ProductCategoryDTO(productCategoryService.updateProductCategory + (id, name)); + } + + @DeleteMapping("/{id}") + public ProductCategoryDTO deleteProductCategory(@PathVariable Long id){ + return new ProductCategoryDTO(productCategoryService.deleteProductCategory(id)); + } + + @DeleteMapping() + public void deleteAllProductCategories(){ + productCategoryService.deleteAllProductCategories(); + } + +} diff --git a/backend/lab/src/main/java/com/example/lab/DataBase/Controllers/ProductController.java b/backend/lab/src/main/java/com/example/lab/DataBase/Controllers/ProductController.java new file mode 100644 index 0000000..570754d --- /dev/null +++ b/backend/lab/src/main/java/com/example/lab/DataBase/Controllers/ProductController.java @@ -0,0 +1,62 @@ +package com.example.lab.DataBase.Controllers; + +import com.example.lab.DataBase.Models.Product; +import com.example.lab.DataBase.DTOs.ProductDTO; +import com.example.lab.DataBase.Models.ProductCategory; +import com.example.lab.DataBase.Services.ProductCategoryService; +import com.example.lab.DataBase.Services.ProductService; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + + +@RestController +@RequestMapping("/product") +public class ProductController { + private final ProductService productService; + private final ProductCategoryService productCategoryService; + + public ProductController(ProductService productService, ProductCategoryService productCategoryService){ + this.productService = productService; + this.productCategoryService = productCategoryService; + } + + @GetMapping("/{id}") + public ProductDTO getProduct(@PathVariable Long id){ + return new ProductDTO(productService.getProduct(id)); + } + + @GetMapping + public List getProducts(){ + return productService.getAllProducts().stream() + .map(ProductDTO::new) + .toList(); + } + + @PostMapping + public ProductDTO createProduct(@RequestParam("productName") String name, + @RequestParam("price") String price, + @RequestParam("productCategoryId") long productCategoryId){ + final Product product = productService.addProduct(name, Float.parseFloat(price) , + productCategoryService.getProductCategory(productCategoryId)); + return new ProductDTO(product); + } + + @PutMapping("/{id}") + public ProductDTO updateProduct(@RequestParam("productName") String name, + @RequestParam("price") float price, + @PathVariable Long id){ + return new ProductDTO(productService.updateProduct(id, name, price)); + } + + @DeleteMapping("/{id}") + public ProductDTO deleteProduct(@PathVariable Long id){ + return new ProductDTO(productService.deleteProduct(id)); + } + + @DeleteMapping() + public void deleteAllProducts(){ + productService.deleteAllProducts(); + } + +} diff --git a/backend/lab/src/main/java/com/example/lab/DataBase/DTOs/CartDTO.java b/backend/lab/src/main/java/com/example/lab/DataBase/DTOs/CartDTO.java index b47204e..72bffd8 100644 --- a/backend/lab/src/main/java/com/example/lab/DataBase/DTOs/CartDTO.java +++ b/backend/lab/src/main/java/com/example/lab/DataBase/DTOs/CartDTO.java @@ -3,10 +3,12 @@ import java.util.List; import com.example.lab.DataBase.Models.Cart; public class CartDTO { - public Long id;; + public Long id; + public String customer; public CartDTO(Cart cart){ this.id = cart.getId(); + this.customer = cart.getCustomer().getLastName() + " " + cart.getCustomer().getFirstName(); } public Long getId() { @@ -16,4 +18,12 @@ public class CartDTO { public void setId(Long id){ this.id = id; } + + public String getCustomer() { + return customer; + } + + public void setCustomer(String customer) { + this.customer = customer; + } } diff --git a/backend/lab/src/main/java/com/example/lab/DataBase/DTOs/CountProductDTO.java b/backend/lab/src/main/java/com/example/lab/DataBase/DTOs/CountProductDTO.java index 300d8b9..20b4cc8 100644 --- a/backend/lab/src/main/java/com/example/lab/DataBase/DTOs/CountProductDTO.java +++ b/backend/lab/src/main/java/com/example/lab/DataBase/DTOs/CountProductDTO.java @@ -5,11 +5,15 @@ import jakarta.persistence.Column; public class CountProductDTO { private Long id; + public String name; public Integer amount; + public float price; public CountProductDTO(CountProduct countProduct){ this.id = countProduct.getId(); + this.name = countProduct.getProduct().getName(); this.amount = countProduct.getAmount(); + this.price = this.amount * countProduct.getProduct().getPrice(); } public Long getId() { diff --git a/backend/lab/src/main/java/com/example/lab/DataBase/DTOs/ProductDTO.java b/backend/lab/src/main/java/com/example/lab/DataBase/DTOs/ProductDTO.java index c9091d7..ce339fe 100644 --- a/backend/lab/src/main/java/com/example/lab/DataBase/DTOs/ProductDTO.java +++ b/backend/lab/src/main/java/com/example/lab/DataBase/DTOs/ProductDTO.java @@ -5,11 +5,15 @@ public class ProductDTO { public Long id; public String name; public float price; + public Long productCategoryId; + public String categoryName; public ProductDTO(Product product){ this.id = product.getId(); this.name = product.getName(); this.price = product.getPrice(); + this.productCategoryId = product.getProductCategory().getId(); + this.categoryName = product.getProductCategory().getName(); } public Long getId() { return id; diff --git a/backend/lab/src/main/java/com/example/lab/DataBase/Models/CountProduct.java b/backend/lab/src/main/java/com/example/lab/DataBase/Models/CountProduct.java index 56bd4af..247c3b3 100644 --- a/backend/lab/src/main/java/com/example/lab/DataBase/Models/CountProduct.java +++ b/backend/lab/src/main/java/com/example/lab/DataBase/Models/CountProduct.java @@ -11,7 +11,6 @@ public class CountProduct { private Long id; @Column - @NotBlank(message = "Amount can't be empty, only 0") private Integer amount; @ManyToOne(fetch = FetchType.EAGER) @@ -27,7 +26,7 @@ public class CountProduct { public CountProduct(Cart cart, Product product) { this.cart = cart; this.product = product; - this.amount = 0; + this.amount = 1; this.cart.addCountProduct(this); this.product.addCountProduct(this); } diff --git a/backend/lab/src/main/java/com/example/lab/DataBase/Models/Product.java b/backend/lab/src/main/java/com/example/lab/DataBase/Models/Product.java index 1f2f787..0d3d066 100644 --- a/backend/lab/src/main/java/com/example/lab/DataBase/Models/Product.java +++ b/backend/lab/src/main/java/com/example/lab/DataBase/Models/Product.java @@ -17,7 +17,6 @@ public class Product { @NotBlank(message = "Product's name can't be empty") private String name; @Column - @NotBlank(message = "Price can't be empty") private float price; @OneToMany diff --git a/backend/lab/src/main/java/com/example/lab/DataBase/Repositories/CartRepository.java b/backend/lab/src/main/java/com/example/lab/DataBase/Repositories/CartRepository.java index 160c923..ee60a89 100644 --- a/backend/lab/src/main/java/com/example/lab/DataBase/Repositories/CartRepository.java +++ b/backend/lab/src/main/java/com/example/lab/DataBase/Repositories/CartRepository.java @@ -4,4 +4,5 @@ import com.example.lab.DataBase.Models.Cart; import org.springframework.data.jpa.repository.JpaRepository; public interface CartRepository extends JpaRepository { + } diff --git a/backend/lab/src/main/java/com/example/lab/DataBase/Repositories/CountProductRepository.java b/backend/lab/src/main/java/com/example/lab/DataBase/Repositories/CountProductRepository.java index b49c973..eca22a5 100644 --- a/backend/lab/src/main/java/com/example/lab/DataBase/Repositories/CountProductRepository.java +++ b/backend/lab/src/main/java/com/example/lab/DataBase/Repositories/CountProductRepository.java @@ -2,6 +2,11 @@ package com.example.lab.DataBase.Repositories; import com.example.lab.DataBase.Models.CountProduct; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; + +import java.util.Collection; public interface CountProductRepository extends JpaRepository { + @Query("SELECT p FROM CountProduct p WHERE p.cart.id = ?1") + Collection findAllProductsByCartId(Long cartId); } \ No newline at end of file diff --git a/backend/lab/src/main/java/com/example/lab/DataBase/Services/CountProductService.java b/backend/lab/src/main/java/com/example/lab/DataBase/Services/CountProductService.java index f138c5f..d5cef94 100644 --- a/backend/lab/src/main/java/com/example/lab/DataBase/Services/CountProductService.java +++ b/backend/lab/src/main/java/com/example/lab/DataBase/Services/CountProductService.java @@ -32,14 +32,13 @@ public class CountProductService { @Transactional public CountProduct getCountProduct(long productId, long cartId){ var count = getAllCountProducts(); - var countProduct = count.stream().filter(x -> x.getProduct().getId() == productId - && x.getCart().getId() == cartId ).findFirst(); + var countProduct = count.stream().filter(x -> x.getProduct().getId() == productId && x.getCart().getId() == cartId ).findFirst(); if(countProduct.isEmpty()) return null; else return countProduct.get(); } @Transactional - public CountProduct getCountProductGeneral(long id){ + public CountProduct getCountProductById(long id){ return countProductRepository.findById(id).orElseThrow(() -> new CustomerNotFoundException(id)); } @@ -50,6 +49,13 @@ public class CountProductService { return countProductRepository.save(countProduct); } + @Transactional + public CountProduct incrementProductById(long id){ + CountProduct countProduct = getCountProductById(id); + countProduct.incrementAmount(); + return countProductRepository.save(countProduct); + } + @Transactional public CountProduct decrementProduct (long productId, long cartId){ CountProduct countProduct = getCountProduct(productId, cartId); @@ -57,6 +63,13 @@ public class CountProductService { return countProductRepository.save(countProduct); } + @Transactional + public CountProduct decrementProductById (Long id){ + CountProduct countProduct = getCountProductById(id); + countProduct.decrementAmount(); + return countProductRepository.save(countProduct); + } + @Transactional public CountProduct deleteCountProduct(long productId, long cartId){ CountProduct countProduct = getCountProduct(productId,cartId); @@ -64,6 +77,13 @@ public class CountProductService { return countProduct; } + @Transactional + public CountProduct deleteCountProductById(long id){ + CountProduct countProduct = getCountProductById(id); + countProductRepository.delete(countProduct); + return countProduct; + } + @Transactional public void deleteAll(){ countProductRepository.deleteAll(); @@ -73,4 +93,7 @@ public class CountProductService { public List getAllCountProducts(){ return countProductRepository.findAll(); } + + @Transactional + public List getProductsForCart(Long cartId) { return countProductRepository.findAllProductsByCartId(cartId).stream().toList();} } \ No newline at end of file diff --git a/backend/lab/src/main/java/com/example/lab/DataBase/Services/CustomerService.java b/backend/lab/src/main/java/com/example/lab/DataBase/Services/CustomerService.java index cffc40f..1f4c1a7 100644 --- a/backend/lab/src/main/java/com/example/lab/DataBase/Services/CustomerService.java +++ b/backend/lab/src/main/java/com/example/lab/DataBase/Services/CustomerService.java @@ -13,11 +13,13 @@ import java.util.List; @Service public class CustomerService { private final CustomerRepository customerRepository; + private final CartService cartService; private final ValidatorUtil validatorUtil; - public CustomerService(CustomerRepository customerRepository, + public CustomerService(CustomerRepository customerRepository, CartService cartService, ValidatorUtil validatorUtil){ this.customerRepository = customerRepository; + this.cartService = cartService; this.validatorUtil = validatorUtil; } @@ -25,7 +27,9 @@ public class CustomerService { public Customer addCustomer(String customerFirstName, String customerLastName, String customerAddress){ Customer customer = new Customer(customerLastName, customerFirstName, customerAddress); validatorUtil.validate(customer); - return customerRepository.save(customer); + var cus = customerRepository.save(customer); + cartService.addCart(cus); + return cus; } @Transactional() diff --git a/front/images/arrow.png b/front/images/arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..9a3a8c152ae45949c9624fd6b89bc6eb9e6cb28e GIT binary patch literal 37173 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%0DUp zuf1#kX{(Ck7ubSklWJ5T1`1m)k430qpvxF7urlHDD9S*{M5w_4&H|$}Hk1|`7bQj( z^i~3H;bCBy0);NbKpnVi%-D(yM?wu+fs&OKE5c~fb>$H}=bn38{s_)b?K$WBIG^u1 z-|si)o_mk|r5Hx~HHgU6Z~;eL%RmYr$cWc#OnybLAZF!ogFX0m9$$Tz0SO)pRmTOb zt)s|=#Y1&kKG1Thb;b@tdb+jQeP+N}1vtuhI!T0GButmGK|3(=3yB(QIXP+)cD%|+ zn}yD7VG(cAaeo;?i0I+ldX%DR7*I1c@c9^}@J%!`Dy2e|!208&OiKMZoJ@c0Ty$dB zkq4xFbp!qwmT|q|h~w{EoxRFbz+E2k zX#0Tw!{bQJL^ypVPtA6p1ZL%khG_nhHtQuaH=px;3*sM2UorLPI_Ns8>HN0Z5Ss#R^qHG32Gglp1Z%`a*KyEh0 z1_$1}0~T{6^8GYcfn6h9st+k2{^c@sdQ++7Cj>8_^Pvq@TLiR&b~Tcvg{@+yQVe&A z7iN!{{1!lF4V4Stf?@YRXadbm>blih_JOFrrb z9BZh%m~2>zS-wGZardLZ%T2IY`bu(D$DcC1d<8H#Cnf8+)U9U{c$^*-Dy=JH@4}BZ z2dxA=fH87Y5CBfM!bW`=O`;S$T6(Ly3Ro4Eg_pZ)Yg`7}X~Msw%QppqEP>G91VU7~ zy@VVoY_$j&B2iTVAH&4`+#KnfMuYtXnp;#go$P&gjtI~s6-@NXkx=kV!mlfHZ?n<0 zyZe|{1JnphM5>I9Ei|RUOXD!q|D%jH0$5~I6=vwgKzU8Z+rRzA@Xz-*RvG;w;Rg>a zvZWkpoUwhNSw^k093Kfft)JRQM%#Cb=~#qm;3ZR66g3fU37KUQ22QhGsTO6Nv+%Dh zC6D%&Ku-DE87*fvOTj8kWvgPHbM>ckSx`D|#S;K}CAij_r3tjWujM?fYxK~ZA0j8n z?HBp?nCS!}_sp5RuwENuFJRQ8mm=yn;+rU-fRU(one-I=wq}#1X{?fJ zWsI>DB{85Wg%?pDoz%Ie~I!aRjO?YdByMdh} z*nJJL#CT!Q=9ZE-yd8hX4NO1)O^ye++^bSomZQnd|MXrbAs0VL;)h2W?>Us8g^Dh zyykTU_wX4!0LJqQQw4?DQ-xSj!M;{lx>rcQz!9%K0?dbwfXFcrJp*EwfPD)rJ^-mF zz>C#uzRhkwlTG_~YLlo^lZFSe%YmaQXKI!lqz+d=Wwe~8Kt++hb zZ{l@sT1!5fmG?|Lzulcb|9_?ZWe-o@P=A>FM|j~hFYo$l#+UjH@xz54eEa#Cc(;G& zi$I+FSI5=5d44~{7e8IUX4-W|$LF*0bNz!mfVB$*_JOfHAoWMjfjOR^#0`*i=OBg~I7A3EguG#!g-O=v@L?6RM cUvCYO9M=`mf=G=h9&x3_TEr%@bFE6g0Y&j@AOHXW literal 0 HcmV?d00001 diff --git a/front/images/free-icon-search-2997940.png b/front/images/free-icon-search-2997940.png new file mode 100644 index 0000000000000000000000000000000000000000..3f202a8eef71e7f6b884526f8a38b0fdee8e97d7 GIT binary patch literal 11895 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 literal 0 HcmV?d00001 diff --git a/front/images/free-icon-shopping-cart-6518420.png b/front/images/free-icon-shopping-cart-6518420.png new file mode 100644 index 0000000000000000000000000000000000000000..3014e323aa84f51b512c24b83cc735baf509afea GIT binary patch literal 9577 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 Pi-KT7ixY*%TyFe7;S`hMlcBFSi6Y007{%v@mgC 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 $KJ}sCi?lGU? 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 literal 0 HcmV?d00001 diff --git a/front/images/logo_color.png b/front/images/logo_color.png new file mode 100644 index 0000000000000000000000000000000000000000..e5808c3e993d89d93ec91407391377938c122bbe GIT binary patch literal 25653 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 literal 0 HcmV?d00001 diff --git a/front/index.html b/front/index.html index b1f0ba6..c5be340 100644 --- a/front/index.html +++ b/front/index.html @@ -1,32 +1,17 @@ - - - - Интернет программирование - - - - - - -

Вычисления

-
- - - - - -
-
- - - - -
- - + + + + + + + + 4th lab + + +
+
+ +
+ \ No newline at end of file diff --git a/front/package-lock.json b/front/package-lock.json index d4af1ef..0c938c5 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -1,30 +1,634 @@ { - "name": "thistore", + "name": "test", "version": "1.0.0", "lockfileVersion": 2, "requires": true, "packages": { "": { - "name": "thistore", + "name": "test", "version": "1.0.0", - "license": "ISC", "dependencies": { - "@fortawesome/fontawesome-free": "6.2.0", - "bootstrap": "5.2.1" + "@fortawesome/fontawesome-free": "^6.2.1", + "axios": "^1.1.3", + "bootstrap": "^5.2.2", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-router-dom": "^6.4.4" }, "devDependencies": { - "http-server": "14.1.1" + "@types/react": "^18.0.24", + "@types/react-dom": "^18.0.8", + "@vitejs/plugin-react": "^2.2.0", + "npm-run-all": "^4.1.5", + "vite": "^3.2.3" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", + "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.21.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.7.tgz", + "integrity": "sha512-KYMqFYTaenzMK4yUtf4EW9wc4N9ef80FsbMtkwool5zpwl4YrT1SdWYSTRcT94KO4hannogdS+LxY7L+arP3gA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.21.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.8.tgz", + "integrity": "sha512-YeM22Sondbo523Sz0+CirSPnbj9bG3P0CdHcBZdqUuaeOaYEFbOLoGU7lebvGP6P5J/WE9wOn7u7C4J9HvS1xQ==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.21.4", + "@babel/generator": "^7.21.5", + "@babel/helper-compilation-targets": "^7.21.5", + "@babel/helper-module-transforms": "^7.21.5", + "@babel/helpers": "^7.21.5", + "@babel/parser": "^7.21.8", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/core/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 + }, + "node_modules/@babel/generator": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.5.tgz", + "integrity": "sha512-SrKK/sRv8GesIW1bDagf9cCG38IOMYZusoe1dfg0D8aiUe3Amvoj1QtjTPAWcfrZFvIwlleLb0gxzQidL9w14w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.21.5", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.5.tgz", + "integrity": "sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.21.5", + "@babel/helper-validator-option": "^7.21.0", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz", + "integrity": "sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", + "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.20.7", + "@babel/types": "^7.21.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", + "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.21.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz", + "integrity": "sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.21.5", + "@babel/helper-module-imports": "^7.21.4", + "@babel/helper-simple-access": "^7.21.5", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz", + "integrity": "sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz", + "integrity": "sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz", + "integrity": "sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", + "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.5.tgz", + "integrity": "sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA==", + "dev": true, + "dependencies": { + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/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, + "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, + "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, + "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 + }, + "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, + "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, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.21.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.8.tgz", + "integrity": "sha512-6zavDGdzG3gUqAdWvlLFfk+36RilI+Pwyuuh7HItyeScCWP3k6i8vKclAQ0bM/0y/Kz/xiwvxhMv9MgTJP5gmA==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz", + "integrity": "sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.21.5.tgz", + "integrity": "sha512-ELdlq61FpoEkHO6gFRpfj0kUgSwQTGoaEU8eMRoS8Dv3v6e7BjEAj5WMtIBRdHUeAioMhKP5HyxNzNnP+heKbA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-module-imports": "^7.21.4", + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/plugin-syntax-jsx": "^7.21.4", + "@babel/types": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", + "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", + "dev": true, + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.21.0.tgz", + "integrity": "sha512-f/Eq+79JEu+KUANFks9UZCcvydOOGMgF7jBrcwjHa5jTZD8JivnhCJYvmlhR/WTXBWonDExPoW0eO/CR4QJirA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.19.6.tgz", + "integrity": "sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.5.tgz", + "integrity": "sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.21.4", + "@babel/generator": "^7.21.5", + "@babel/helper-environment-visitor": "^7.21.5", + "@babel/helper-function-name": "^7.21.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.21.5", + "@babel/types": "^7.21.5", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/traverse/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 + }, + "node_modules/@babel/types": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.5.tgz", + "integrity": "sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.21.5", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz", + "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz", + "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, "node_modules/@fortawesome/fontawesome-free": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.2.0.tgz", - "integrity": "sha512-CNR7qRIfCwWHNN7FnKUniva94edPdyQzil/zCwk3v6k4R6rR2Fr8i4s3PM7n/lyfPA6Zfko9z5WDzFxG9SW1uQ==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.4.0.tgz", + "integrity": "sha512-0NyytTlPJwB/BF5LtRV8rrABDbe3TdTXqNB3PdZ+UUUZAEIrdOJdmABqKjt4AXwIoJNaRVVZEXxpNrqvE1GAYQ==", "hasInstallScript": true, "engines": { "node": ">=6" } }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, "node_modules/@popperjs/core": { "version": "2.11.6", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz", @@ -35,46 +639,117 @@ "url": "https://opencollective.com/popperjs" } }, - "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==", + "node_modules/@remix-run/router": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.6.1.tgz", + "integrity": "sha512-YUkWj+xs0oOzBe74OgErsuR3wVn+efrFhXBWrit50kOiED+pvQe2r6MWY0iJMQU/mSVKxvNzL4ZaYvjdX+G7ZA==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", + "dev": true + }, + "node_modules/@types/react": { + "version": "18.2.6", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.6.tgz", + "integrity": "sha512-wRZClXn//zxCFW+ye/D2qY65UsYP1Fpex2YXorHc8awoNamkMZSvBxwxdYVInsHOZZd2Ppq8isnSzJL5Mpf8OA==", "dev": true, "dependencies": { - "color-convert": "^2.0.1" + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.2.4", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.4.tgz", + "integrity": "sha512-G2mHoTMTL4yoydITgOGwWdWMVd8sNgyEP85xVmMKAPUBwQWm9wBPQUmvbeF4V3WBY1P7mmL4BkjQ0SqUpf1snw==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", + "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", + "dev": true + }, + "node_modules/@vitejs/plugin-react": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-2.2.0.tgz", + "integrity": "sha512-FFpefhvExd1toVRlokZgxgy2JtnBOdp4ZDsq7ldCWaqGSGn9UhWMAVm/1lxPL14JfNS5yGz+s9yFrQY6shoStA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.19.6", + "@babel/plugin-transform-react-jsx": "^7.19.0", + "@babel/plugin-transform-react-jsx-development": "^7.18.6", + "@babel/plugin-transform-react-jsx-self": "^7.18.6", + "@babel/plugin-transform-react-jsx-source": "^7.19.6", + "magic-string": "^0.26.7", + "react-refresh": "^0.14.0" }, "engines": { - "node": ">=8" + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^3.0.0" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dev": true, - "dependencies": { - "lodash": "^4.17.14" - } + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, - "node_modules/basic-auth": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", - "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", "dev": true, - "dependencies": { - "safe-buffer": "5.1.2" - }, "engines": { - "node": ">= 0.8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/axios": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", + "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.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 + }, "node_modules/bootstrap": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.2.1.tgz", - "integrity": "sha512-UQi3v2NpVPEi1n35dmRRzBJFlgvWHYwyem6yHhuT6afYF+sziEt46McRbT//kVXZ7b1YUYEVGdXEH74Nx3xzGA==", + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.2.3.tgz", + "integrity": "sha512-cEKPM+fwb3cT8NzQZYEu4HilJ3anCrWqh3CHAok1p9jXqMPsPTBhU25fBckEJHJ/p+tTxTFTsFQGM+gaHpi3QQ==", "funding": [ { "type": "github", @@ -89,6 +764,44 @@ "@popperjs/core": "^2.11.6" } }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/browserslist": { + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -102,69 +815,577 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/caniuse-lite": { + "version": "1.0.30001487", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001487.tgz", + "integrity": "sha512-83564Z3yWGqXsh2vaH/mhXfEM0wX+NlBCm1jYHOb97TrTWJEmPTccZgeLTPBUUb0PNVo+oomb7wkimZBIERClA==", "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" + } + ] + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "delayed-stream": "~1.0.0" }, "engines": { - "node": ">=10" + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/cross-spawn/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", + "dev": true + }, + "node_modules/define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.396", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.396.tgz", + "integrity": "sha512-pqKTdqp/c5vsrc0xUPYXTDBo9ixZuGY8es4ZOjjd6HD6bFYbu5QA09VoW3fkY4LF1T0zYk86lN6bZnNlBuOpdQ==", + "dev": true + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, "dependencies": { - "color-name": "~1.1.4" + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.21.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", + "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.0", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" }, "engines": { - "node": ">=7.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/corser": { + "node_modules/es-set-tostringtag": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", - "integrity": "sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", "dev": true, "dependencies": { - "ms": "^2.1.1" + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" } }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", + "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.15.18", + "@esbuild/linux-loong64": "0.15.18", + "esbuild-android-64": "0.15.18", + "esbuild-android-arm64": "0.15.18", + "esbuild-darwin-64": "0.15.18", + "esbuild-darwin-arm64": "0.15.18", + "esbuild-freebsd-64": "0.15.18", + "esbuild-freebsd-arm64": "0.15.18", + "esbuild-linux-32": "0.15.18", + "esbuild-linux-64": "0.15.18", + "esbuild-linux-arm": "0.15.18", + "esbuild-linux-arm64": "0.15.18", + "esbuild-linux-mips64le": "0.15.18", + "esbuild-linux-ppc64le": "0.15.18", + "esbuild-linux-riscv64": "0.15.18", + "esbuild-linux-s390x": "0.15.18", + "esbuild-netbsd-64": "0.15.18", + "esbuild-openbsd-64": "0.15.18", + "esbuild-sunos-64": "0.15.18", + "esbuild-windows-32": "0.15.18", + "esbuild-windows-64": "0.15.18", + "esbuild-windows-arm64": "0.15.18" + } + }, + "node_modules/esbuild-android-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz", + "integrity": "sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-android-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz", + "integrity": "sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz", + "integrity": "sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz", + "integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz", + "integrity": "sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz", + "integrity": "sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-32": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz", + "integrity": "sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz", + "integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz", + "integrity": "sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz", + "integrity": "sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-mips64le": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz", + "integrity": "sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-ppc64le": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz", + "integrity": "sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-riscv64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz", + "integrity": "sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-s390x": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz", + "integrity": "sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-netbsd-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz", + "integrity": "sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-openbsd-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz", + "integrity": "sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-sunos-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz", + "integrity": "sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-32": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz", + "integrity": "sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz", + "integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz", + "integrity": "sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } }, "node_modules/follow-redirects": { "version": "1.15.2", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "dev": true, "funding": [ { "type": "individual", @@ -180,12 +1401,84 @@ } } }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/get-intrinsic": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", @@ -200,6 +1493,64 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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 + }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -212,13 +1563,37 @@ "node": ">= 0.4.0" } }, - "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==", + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", "dev": true, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-symbols": { @@ -233,125 +1608,510 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "bin": { - "he": "bin/he" - } - }, - "node_modules/html-encoding-sniffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", - "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", "dev": true, "dependencies": { - "whatwg-encoding": "^2.0.0" + "has-symbols": "^1.0.2" }, "engines": { - "node": ">=12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/http-server": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz", - "integrity": "sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==", - "dev": true, - "dependencies": { - "basic-auth": "^2.0.1", - "chalk": "^4.1.2", - "corser": "^2.0.1", - "he": "^1.2.0", - "html-encoding-sniffer": "^3.0.0", - "http-proxy": "^1.18.1", - "mime": "^1.6.0", - "minimist": "^1.2.6", - "opener": "^1.5.1", - "portfinder": "^1.0.28", - "secure-compare": "3.0.1", - "union": "~0.5.0", - "url-join": "^4.0.1" - }, - "bin": { - "http-server": "bin/http-server" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "node_modules/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", + "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true, "bin": { - "mime": "cli.js" + "jsesc": "bin/jsesc" }, "engines": { "node": ">=4" } }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" } }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", "dev": true, "dependencies": { - "minimist": "^1.2.6" + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" }, - "bin": { - "mkdirp": "bin/cmd.js" + "engines": { + "node": ">=4" } }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/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, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.26.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.7.tgz", + "integrity": "sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "node_modules/node-releases": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", + "dev": true + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/npm-run-all": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", + "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "memorystream": "^0.3.1", + "minimatch": "^3.0.4", + "pidtree": "^0.3.0", + "read-pkg": "^3.0.0", + "shell-quote": "^1.6.1", + "string.prototype.padend": "^3.0.0" + }, + "bin": { + "npm-run-all": "bin/npm-run-all/index.js", + "run-p": "bin/run-p/index.js", + "run-s": "bin/run-s/index.js" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/npm-run-all/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/npm-run-all/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/npm-run-all/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/object-inspect": { "version": "1.12.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", @@ -361,67 +2121,318 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, - "bin": { - "opener": "bin/opener-bin.js" + "engines": { + "node": ">= 0.4" } }, - "node_modules/portfinder": { - "version": "1.0.32", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", - "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dev": true, "dependencies": { - "async": "^2.6.4", - "debug": "^3.2.7", - "mkdirp": "^0.5.6" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" }, "engines": { - "node": ">= 0.12.0" - } - }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dev": true, - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/requires-port": { + "node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/picocolors": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", "dev": true }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "node_modules/pidtree": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", + "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", + "dev": true, + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "engines": { + "node": ">=4" + } }, - "node_modules/secure-compare": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz", - "integrity": "sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==", - "dev": true + "node_modules/postcss": { + "version": "8.4.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz", + "integrity": "sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "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==" + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-refresh": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", + "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-router": { + "version": "6.11.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.11.1.tgz", + "integrity": "sha512-OZINSdjJ2WgvAi7hgNLazrEV8SGn6xrKA+MkJe9wVDMZ3zQ6fdJocUjpCUCI0cNrelWjcvon0S/QK/j0NzL3KA==", + "dependencies": { + "@remix-run/router": "1.6.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.11.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.11.1.tgz", + "integrity": "sha512-dPC2MhoPeTQ1YUOt5uIK376SMNWbwUxYRWk2ZmTT4fZfwlOvabF8uduRKKJIyfkCZvMgiF0GSCQckmkGGijIrg==", + "dependencies": { + "@remix-run/router": "1.6.1", + "react-router": "6.11.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "dev": true, + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dev": true, + "dependencies": { + "is-core-module": "^2.11.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/rollup": { + "version": "2.79.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", + "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/side-channel": { "version": "1.0.4", @@ -437,54 +2448,762 @@ "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/union": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz", - "integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==", - "dev": true, - "dependencies": { - "qs": "^6.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/url-join": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", "dev": true }, - "node_modules/whatwg-encoding": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", - "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, "dependencies": { - "iconv-lite": "0.6.3" + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "dev": true + }, + "node_modules/string.prototype.padend": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.4.tgz", + "integrity": "sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "engines": { - "node": ">=12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "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" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/vite": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-3.2.6.tgz", + "integrity": "sha512-nTXTxYVvaQNLoW5BQ8PNNQ3lPia57gzsQU/Khv+JvzKPku8kNZL6NMUR/qwXhMG6E+g1idqEPanomJ+VZgixEg==", + "dev": true, + "dependencies": { + "esbuild": "^0.15.9", + "postcss": "^8.4.18", + "resolve": "^1.22.1", + "rollup": "^2.79.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true } }, "dependencies": { + "@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@babel/code-frame": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", + "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.18.6" + } + }, + "@babel/compat-data": { + "version": "7.21.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.7.tgz", + "integrity": "sha512-KYMqFYTaenzMK4yUtf4EW9wc4N9ef80FsbMtkwool5zpwl4YrT1SdWYSTRcT94KO4hannogdS+LxY7L+arP3gA==", + "dev": true + }, + "@babel/core": { + "version": "7.21.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.8.tgz", + "integrity": "sha512-YeM22Sondbo523Sz0+CirSPnbj9bG3P0CdHcBZdqUuaeOaYEFbOLoGU7lebvGP6P5J/WE9wOn7u7C4J9HvS1xQ==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.21.4", + "@babel/generator": "^7.21.5", + "@babel/helper-compilation-targets": "^7.21.5", + "@babel/helper-module-transforms": "^7.21.5", + "@babel/helpers": "^7.21.5", + "@babel/parser": "^7.21.8", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "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 + } + } + }, + "@babel/generator": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.5.tgz", + "integrity": "sha512-SrKK/sRv8GesIW1bDagf9cCG38IOMYZusoe1dfg0D8aiUe3Amvoj1QtjTPAWcfrZFvIwlleLb0gxzQidL9w14w==", + "dev": true, + "requires": { + "@babel/types": "^7.21.5", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.5.tgz", + "integrity": "sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.21.5", + "@babel/helper-validator-option": "^7.21.0", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", + "semver": "^6.3.0" + } + }, + "@babel/helper-environment-visitor": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz", + "integrity": "sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ==", + "dev": true + }, + "@babel/helper-function-name": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", + "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", + "dev": true, + "requires": { + "@babel/template": "^7.20.7", + "@babel/types": "^7.21.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-module-imports": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", + "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", + "dev": true, + "requires": { + "@babel/types": "^7.21.4" + } + }, + "@babel/helper-module-transforms": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz", + "integrity": "sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.21.5", + "@babel/helper-module-imports": "^7.21.4", + "@babel/helper-simple-access": "^7.21.5", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz", + "integrity": "sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg==", + "dev": true + }, + "@babel/helper-simple-access": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz", + "integrity": "sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==", + "dev": true, + "requires": { + "@babel/types": "^7.21.5" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-string-parser": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz", + "integrity": "sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", + "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", + "dev": true + }, + "@babel/helpers": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.5.tgz", + "integrity": "sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA==", + "dev": true, + "requires": { + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5" + } + }, + "@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "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 + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/parser": { + "version": "7.21.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.8.tgz", + "integrity": "sha512-6zavDGdzG3gUqAdWvlLFfk+36RilI+Pwyuuh7HItyeScCWP3k6i8vKclAQ0bM/0y/Kz/xiwvxhMv9MgTJP5gmA==", + "dev": true + }, + "@babel/plugin-syntax-jsx": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz", + "integrity": "sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.20.2" + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.21.5.tgz", + "integrity": "sha512-ELdlq61FpoEkHO6gFRpfj0kUgSwQTGoaEU8eMRoS8Dv3v6e7BjEAj5WMtIBRdHUeAioMhKP5HyxNzNnP+heKbA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-module-imports": "^7.21.4", + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/plugin-syntax-jsx": "^7.21.4", + "@babel/types": "^7.21.5" + } + }, + "@babel/plugin-transform-react-jsx-development": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", + "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", + "dev": true, + "requires": { + "@babel/plugin-transform-react-jsx": "^7.18.6" + } + }, + "@babel/plugin-transform-react-jsx-self": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.21.0.tgz", + "integrity": "sha512-f/Eq+79JEu+KUANFks9UZCcvydOOGMgF7jBrcwjHa5jTZD8JivnhCJYvmlhR/WTXBWonDExPoW0eO/CR4QJirA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.20.2" + } + }, + "@babel/plugin-transform-react-jsx-source": { + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.19.6.tgz", + "integrity": "sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.19.0" + } + }, + "@babel/template": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" + } + }, + "@babel/traverse": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.5.tgz", + "integrity": "sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.21.4", + "@babel/generator": "^7.21.5", + "@babel/helper-environment-visitor": "^7.21.5", + "@babel/helper-function-name": "^7.21.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.21.5", + "@babel/types": "^7.21.5", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "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 + } + } + }, + "@babel/types": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.5.tgz", + "integrity": "sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.21.5", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + } + }, + "@esbuild/android-arm": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz", + "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz", + "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==", + "dev": true, + "optional": true + }, "@fortawesome/fontawesome-free": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.2.0.tgz", - "integrity": "sha512-CNR7qRIfCwWHNN7FnKUniva94edPdyQzil/zCwk3v6k4R6rR2Fr8i4s3PM7n/lyfPA6Zfko9z5WDzFxG9SW1uQ==" + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.4.0.tgz", + "integrity": "sha512-0NyytTlPJwB/BF5LtRV8rrABDbe3TdTXqNB3PdZ+UUUZAEIrdOJdmABqKjt4AXwIoJNaRVVZEXxpNrqvE1GAYQ==" + }, + "@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + }, + "dependencies": { + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + } + } }, "@popperjs/core": { "version": "2.11.6", @@ -492,39 +3211,123 @@ "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==", "peer": true }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "@remix-run/router": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.6.1.tgz", + "integrity": "sha512-YUkWj+xs0oOzBe74OgErsuR3wVn+efrFhXBWrit50kOiED+pvQe2r6MWY0iJMQU/mSVKxvNzL4ZaYvjdX+G7ZA==" + }, + "@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", + "dev": true + }, + "@types/react": { + "version": "18.2.6", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.6.tgz", + "integrity": "sha512-wRZClXn//zxCFW+ye/D2qY65UsYP1Fpex2YXorHc8awoNamkMZSvBxwxdYVInsHOZZd2Ppq8isnSzJL5Mpf8OA==", "dev": true, "requires": { - "color-convert": "^2.0.1" + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" } }, - "async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "@types/react-dom": { + "version": "18.2.4", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.4.tgz", + "integrity": "sha512-G2mHoTMTL4yoydITgOGwWdWMVd8sNgyEP85xVmMKAPUBwQWm9wBPQUmvbeF4V3WBY1P7mmL4BkjQ0SqUpf1snw==", "dev": true, "requires": { - "lodash": "^4.17.14" + "@types/react": "*" } }, - "basic-auth": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", - "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "@types/scheduler": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", + "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", + "dev": true + }, + "@vitejs/plugin-react": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-2.2.0.tgz", + "integrity": "sha512-FFpefhvExd1toVRlokZgxgy2JtnBOdp4ZDsq7ldCWaqGSGn9UhWMAVm/1lxPL14JfNS5yGz+s9yFrQY6shoStA==", "dev": true, "requires": { - "safe-buffer": "5.1.2" + "@babel/core": "^7.19.6", + "@babel/plugin-transform-react-jsx": "^7.19.0", + "@babel/plugin-transform-react-jsx-development": "^7.18.6", + "@babel/plugin-transform-react-jsx-self": "^7.18.6", + "@babel/plugin-transform-react-jsx-source": "^7.19.6", + "magic-string": "^0.26.7", + "react-refresh": "^0.14.0" } }, + "array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + } + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true + }, + "axios": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", + "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", + "requires": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "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 + }, "bootstrap": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.2.1.tgz", - "integrity": "sha512-UQi3v2NpVPEi1n35dmRRzBJFlgvWHYwyem6yHhuT6afYF+sziEt46McRbT//kVXZ7b1YUYEVGdXEH74Nx3xzGA==", + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.2.3.tgz", + "integrity": "sha512-cEKPM+fwb3cT8NzQZYEu4HilJ3anCrWqh3CHAok1p9jXqMPsPTBhU25fBckEJHJ/p+tTxTFTsFQGM+gaHpi3QQ==", "requires": {} }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "browserslist": { + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" + } + }, "call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -535,57 +3338,365 @@ "get-intrinsic": "^1.0.2" } }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "caniuse-lite": { + "version": "1.0.30001487", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001487.tgz", + "integrity": "sha512-83564Z3yWGqXsh2vaH/mhXfEM0wX+NlBCm1jYHOb97TrTWJEmPTccZgeLTPBUUb0PNVo+oomb7wkimZBIERClA==", "dev": true }, - "corser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", - "integrity": "sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==", - "dev": true - }, - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "requires": { - "ms": "^2.1.1" + "delayed-stream": "~1.0.0" } }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", + "dev": true + }, + "define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "electron-to-chromium": { + "version": "1.4.396", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.396.tgz", + "integrity": "sha512-pqKTdqp/c5vsrc0xUPYXTDBo9ixZuGY8es4ZOjjd6HD6bFYbu5QA09VoW3fkY4LF1T0zYk86lN6bZnNlBuOpdQ==", + "dev": true + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.21.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", + "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.0", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.0", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" + } + }, + "es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "esbuild": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", + "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==", + "dev": true, + "requires": { + "@esbuild/android-arm": "0.15.18", + "@esbuild/linux-loong64": "0.15.18", + "esbuild-android-64": "0.15.18", + "esbuild-android-arm64": "0.15.18", + "esbuild-darwin-64": "0.15.18", + "esbuild-darwin-arm64": "0.15.18", + "esbuild-freebsd-64": "0.15.18", + "esbuild-freebsd-arm64": "0.15.18", + "esbuild-linux-32": "0.15.18", + "esbuild-linux-64": "0.15.18", + "esbuild-linux-arm": "0.15.18", + "esbuild-linux-arm64": "0.15.18", + "esbuild-linux-mips64le": "0.15.18", + "esbuild-linux-ppc64le": "0.15.18", + "esbuild-linux-riscv64": "0.15.18", + "esbuild-linux-s390x": "0.15.18", + "esbuild-netbsd-64": "0.15.18", + "esbuild-openbsd-64": "0.15.18", + "esbuild-sunos-64": "0.15.18", + "esbuild-windows-32": "0.15.18", + "esbuild-windows-64": "0.15.18", + "esbuild-windows-arm64": "0.15.18" + } + }, + "esbuild-android-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz", + "integrity": "sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==", + "dev": true, + "optional": true + }, + "esbuild-android-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz", + "integrity": "sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==", + "dev": true, + "optional": true + }, + "esbuild-darwin-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz", + "integrity": "sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==", + "dev": true, + "optional": true + }, + "esbuild-darwin-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz", + "integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz", + "integrity": "sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz", + "integrity": "sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==", + "dev": true, + "optional": true + }, + "esbuild-linux-32": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz", + "integrity": "sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==", + "dev": true, + "optional": true + }, + "esbuild-linux-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz", + "integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz", + "integrity": "sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz", + "integrity": "sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==", + "dev": true, + "optional": true + }, + "esbuild-linux-mips64le": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz", + "integrity": "sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-ppc64le": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz", + "integrity": "sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==", + "dev": true, + "optional": true + }, + "esbuild-linux-riscv64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz", + "integrity": "sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==", + "dev": true, + "optional": true + }, + "esbuild-linux-s390x": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz", + "integrity": "sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==", + "dev": true, + "optional": true + }, + "esbuild-netbsd-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz", + "integrity": "sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==", + "dev": true, + "optional": true + }, + "esbuild-openbsd-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz", + "integrity": "sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==", + "dev": true, + "optional": true + }, + "esbuild-sunos-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz", + "integrity": "sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==", + "dev": true, + "optional": true + }, + "esbuild-windows-32": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz", + "integrity": "sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==", + "dev": true, + "optional": true + }, + "esbuild-windows-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz", + "integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==", + "dev": true, + "optional": true + }, + "esbuild-windows-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz", + "integrity": "sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==", + "dev": true, + "optional": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true }, "follow-redirects": { "version": "1.15.2", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "dev": true + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" + }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "requires": { + "is-callable": "^1.1.3" + } + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true }, "function-bind": { "version": "1.1.1", @@ -593,6 +3704,30 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + } + }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, "get-intrinsic": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", @@ -604,6 +3739,46 @@ "has-symbols": "^1.0.3" } }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "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 + }, + "globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3" + } + }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3" + } + }, + "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 + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -613,10 +3788,25 @@ "function-bind": "^1.1.1" } }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true + }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", "dev": true }, "has-symbols": { @@ -625,149 +3815,583 @@ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "html-encoding-sniffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", - "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", "dev": true, "requires": { - "whatwg-encoding": "^2.0.0" + "has-symbols": "^1.0.2" } }, - "http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - } - }, - "http-server": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz", - "integrity": "sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==", - "dev": true, - "requires": { - "basic-auth": "^2.0.1", - "chalk": "^4.1.2", - "corser": "^2.0.1", - "he": "^1.2.0", - "html-encoding-sniffer": "^3.0.0", - "http-proxy": "^1.18.1", - "mime": "^1.6.0", - "minimist": "^1.2.6", - "opener": "^1.5.1", - "portfinder": "^1.0.28", - "secure-compare": "3.0.1", - "union": "~0.5.0", - "url-join": "^4.0.1" - } - }, - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - }, - "minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true - }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", "dev": true, "requires": { - "minimist": "^1.2.6" + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" } }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true + }, + "is-core-module": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", + "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true + }, + "is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + } + }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "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, + "requires": { + "yallist": "^3.0.2" + } + }, + "magic-string": { + "version": "0.26.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.7.tgz", + "integrity": "sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.8" + } + }, + "memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", + "dev": true + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-releases": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "npm-run-all": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", + "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "memorystream": "^0.3.1", + "minimatch": "^3.0.4", + "pidtree": "^0.3.0", + "read-pkg": "^3.0.0", + "shell-quote": "^1.6.1", + "string.prototype.padend": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "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 + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "object-inspect": { "version": "1.12.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", "dev": true }, - "opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, - "portfinder": { - "version": "1.0.32", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", - "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", + "object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dev": true, "requires": { - "async": "^2.6.4", - "debug": "^3.2.7", - "mkdirp": "^0.5.6" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" } }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", "dev": true, "requires": { - "side-channel": "^1.0.4" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" } }, - "requires-port": { + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "picocolors": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", "dev": true }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "pidtree": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", + "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", "dev": true }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "dev": true }, - "secure-compare": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz", - "integrity": "sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==", + "postcss": { + "version": "8.4.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz", + "integrity": "sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==", + "dev": true, + "requires": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "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==" + }, + "react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "requires": { + "loose-envify": "^1.1.0" + } + }, + "react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "requires": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + } + }, + "react-refresh": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", + "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", + "dev": true + }, + "react-router": { + "version": "6.11.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.11.1.tgz", + "integrity": "sha512-OZINSdjJ2WgvAi7hgNLazrEV8SGn6xrKA+MkJe9wVDMZ3zQ6fdJocUjpCUCI0cNrelWjcvon0S/QK/j0NzL3KA==", + "requires": { + "@remix-run/router": "1.6.1" + } + }, + "react-router-dom": { + "version": "6.11.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.11.1.tgz", + "integrity": "sha512-dPC2MhoPeTQ1YUOt5uIK376SMNWbwUxYRWk2ZmTT4fZfwlOvabF8uduRKKJIyfkCZvMgiF0GSCQckmkGGijIrg==", + "requires": { + "@remix-run/router": "1.6.1", + "react-router": "6.11.1" + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + } + }, + "resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dev": true, + "requires": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "rollup": { + "version": "2.79.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", + "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "dev": true, + "requires": { + "fsevents": "~2.3.2" + } + }, + "safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + } + }, + "scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "requires": { + "loose-envify": "^1.1.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true + }, + "shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", "dev": true }, "side-channel": { @@ -781,38 +4405,209 @@ "object-inspect": "^1.9.0" } }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "union": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz", - "integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==", - "dev": true, - "requires": { - "qs": "^6.4.0" - } - }, - "url-join": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", "dev": true }, - "whatwg-encoding": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", - "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, "requires": { - "iconv-lite": "0.6.3" + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "dev": true + }, + "string.prototype.padend": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.4.tgz", + "integrity": "sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true + }, + "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 + }, + "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 + }, + "typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + } + }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + }, + "update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "dev": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "vite": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-3.2.6.tgz", + "integrity": "sha512-nTXTxYVvaQNLoW5BQ8PNNQ3lPia57gzsQU/Khv+JvzKPku8kNZL6NMUR/qwXhMG6E+g1idqEPanomJ+VZgixEg==", + "dev": true, + "requires": { + "esbuild": "^0.15.9", + "fsevents": "~2.3.2", + "postcss": "^8.4.18", + "resolve": "^1.22.1", + "rollup": "^2.79.1" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true } } } diff --git a/front/package.json b/front/package.json index 4caee79..31af2d7 100644 --- a/front/package.json +++ b/front/package.json @@ -1,19 +1,26 @@ { - "name": "thistore", + "name": "test", "version": "1.0.0", - "description": "Internet Programming labs", - "main": "MainPage.html", + "type": "module", "scripts": { - "start": "http-server -p 3000 ./", - "test": "echo \"Error: no test specified\" && exit 1" + "dev": "vite", + "start": "npm-run-all --parallel dev", + "build": "vite build", + "preview": "vite preview" }, - "author": "Nevaeva Ksenia", - "license": "ISC", "dependencies": { - "bootstrap": "5.2.1", - "@fortawesome/fontawesome-free": "6.2.0" + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-router-dom": "^6.4.4", + "axios": "^1.1.3", + "bootstrap": "^5.2.2", + "@fortawesome/fontawesome-free": "^6.2.1" }, "devDependencies": { - "http-server": "14.1.1" + "@types/react": "^18.0.24", + "@types/react-dom": "^18.0.8", + "vite": "^3.2.3", + "@vitejs/plugin-react": "^2.2.0", + "npm-run-all": "^4.1.5" } -} +} \ No newline at end of file diff --git a/front/scripts.js b/front/scripts.js deleted file mode 100644 index f94e57a..0000000 --- a/front/scripts.js +++ /dev/null @@ -1,34 +0,0 @@ -function Okclick(clicked) { - var obj1 = document.getElementById("obj1Input").value - var obj2 = document.getElementById("obj2Input").value - var typeInp = document.getElementById("typeSelect").value - var id = clicked; - var argument = ""; - console.log(typeInp); - if (document.getElementById("typeSelect").value == "arr"){ - console.log("aaa"); - obj1= encodeURIComponent(obj1); - obj2 = encodeURIComponent(obj2); - console.log(obj1); - console.log(obj2); - } - if(id == "1"){ - argument = ("GetSum?obj1=" + obj1 +"&obj2=" + obj2 + "&typeInp=" + typeInp); - } - else if (id == "2"){ - argument = ("GetMinus?obj1=" + obj1 + "&obj2=" + obj2 + "&typeInp=" + typeInp); - } - else if( id == "3"){ - argument = ("GetMult?obj1=" + obj1 + "&obj2=" + obj2 + "&typeInp=" + typeInp); - } - else if (id == "4"){ - argument = ("GetDiv?obj1=" + obj1 + "&obj2=" + obj2 + "&typeInp=" + typeInp); - } - fetch ("http://127.0.0.1:8080/" + argument) - .then(response => response.text()) - .then((response) => { - console.log(response) - document.getElementById("res").innerHTML = "Результат = " + response - }) - -} diff --git a/front/src/App.jsx b/front/src/App.jsx new file mode 100644 index 0000000..1e7894a --- /dev/null +++ b/front/src/App.jsx @@ -0,0 +1,45 @@ +import { useRoutes, Outlet, BrowserRouter } from 'react-router-dom'; +import Header from './components/common/Header'; +import CustomerPage from './components/pages/customerPage'; +import ProductPage from './components/pages/productPage'; +import ProductCategoryPage from './components/pages/productCategoryPage'; +import CartsPage from './components/pages/cartsPage'; +import CartPage from './components/pages/cartPage'; +import './style.css'; + +function Router(props) { + return useRoutes(props.rootRoute); +} + +export default function App() { + const routes = [ + { index: true, element: }, + { path: 'customer', element: , label:'Покупатели'}, + { path: 'carts', element: , label: 'Корзины' }, + { path: 'product', element: , label: 'Товары' }, + { path: 'productCategory', element: , label: 'Категории товаров'}, + { path: 'cart', element: }, + ]; + const links = routes.filter(route => route.hasOwnProperty('label')); + const rootRoute = [ + { path: '/', element: render(links), children: routes } + ]; + + function render(links) { + console.info('render links'); + return ( + <> +
+
+ +
+ + ); + } + + return ( + + + + ); +} \ No newline at end of file diff --git a/front/src/Main.jsx b/front/src/Main.jsx new file mode 100644 index 0000000..73c2191 --- /dev/null +++ b/front/src/Main.jsx @@ -0,0 +1,9 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import App from './App' + +ReactDOM.createRoot(document.getElementById('app')).render( + + + +) \ No newline at end of file diff --git a/front/src/components/common/CartTable.jsx b/front/src/components/common/CartTable.jsx new file mode 100644 index 0000000..4bcc65e --- /dev/null +++ b/front/src/components/common/CartTable.jsx @@ -0,0 +1,103 @@ +import { useState, useEffect } from "react"; +import Modal from './Modal'; +import DataService from '../../services/DataService'; +import Toolbar from './Toolbar'; +import Table from './CartsTable'; + +export default function CartTable(props){ + const [items, setItems] = useState([]); + const [modalHeader, setModalHeader] = useState(''); + const [modalConfirm, setModalConfirm] = useState(''); + const [modalVisible, setModalVisible] = useState(false); + const [isEdit, setEdit] = useState(false); + + let selectedItems = []; + + useEffect(() => { + loadItems(); + }, []); + + function loadItems() { + DataService.readAll(props.getAllUrl, props.transformer) + .then(data => setItems(data)); + } + + function saveItem() { + if (!isEdit) { + DataService.create(props.url, "?customerLastName=" + props.data.lastName + + "&customerFirstName=" + props.data.firstName + + "&customerAddress=" + props.data.customerAddress).then(() => loadItems()); + } else { + DataService.update(props.getUrl + props.data.id, "?customerLastName=" + props.data.lastName + + "&customerFirstName=" + props.data.firstName + + "&customerAddress=" + props.data.customerAddress).then(() => loadItems()); + } + } + + function handleAdd() { + setEdit(false); + setModalHeader('Создание'); + setModalConfirm('Создать'); + setModalVisible(true); + props.onAdd(); + } + + function handleEdit() { + if (selectedItems.length === 0) { + return; + } + edit(selectedItems[0]); + } + + function edit(editedId) { + DataService.read(props.getUrl + editedId, props.transformer) + .then(data => { + setEdit(true); + setModalHeader('Редактирование пользователя'); + setModalConfirm('Сохранить'); + setModalVisible(true); + props.onEdit(data); + }); + } + + function handleRemove() { + if (selectedItems.length === 0) { + return; + } + if (confirm('Удалить выбранные элементы?')) { + const promises = []; + selectedItems.forEach(item => { + promises.push(DataService.delete(props.getUrl + item)); + }); + Promise.all(promises).then((results) => { + selectedItems.length = 0; + loadItems(); + }); + } + } + + function handleTableClick(tableSelectedItems) { + selectedItems = tableSelectedItems; + } + + function handleTableDblClick(tableSelectedItem) { + edit(tableSelectedItem); + } + + function handleModalHide() { + setModalVisible(false); + } + + function handleModalDone() { + saveItem(); + } + + return( + <> + + + ) +} \ No newline at end of file diff --git a/front/src/components/common/CartsTable.jsx b/front/src/components/common/CartsTable.jsx new file mode 100644 index 0000000..02a98b3 --- /dev/null +++ b/front/src/components/common/CartsTable.jsx @@ -0,0 +1,73 @@ +import { useState } from 'react'; +import styles from './Table.module.css'; + +export default function Table(props) { + const [tableUpdate, setTableUpdate] = useState(false); + const [selectedItems, setSelectedItems] = useState([]); + + function isSelected(id) { + if (!props.selectable) { + return false; + } + return selectedItems.includes(id); + } + + function click(id) { + if (!props.selectable) { + return; + } + if (isSelected(id)) { + var index = selectedItems.indexOf(id); + if (index !== -1) { + selectedItems.splice(index, 1); + setSelectedItems(selectedItems); + setTableUpdate(!tableUpdate); + } + } else { + selectedItems.push(id); + setSelectedItems(selectedItems); + setTableUpdate(!tableUpdate); + } + props.onClick(selectedItems); + } + + function dblClick(id) { + if (!props.selectable) { + return; + } + props.onDblClick(id); + } + + return ( +
+ + + + { + props.headers.map(header => + + ) + } + + + + { + props.items.map((item, index) => + click(item.id, e)} onDoubleClick={(e) => dblClick(item.id, e)}> + + { + props.headers.map(header => + + ) + } + + ) + } + +
# + {header.label} +
{index + 1}{item[header.name]}
+ ); + } \ No newline at end of file diff --git a/front/src/components/common/CountProductTable.jsx b/front/src/components/common/CountProductTable.jsx new file mode 100644 index 0000000..412c120 --- /dev/null +++ b/front/src/components/common/CountProductTable.jsx @@ -0,0 +1,102 @@ +import { useState, useEffect } from "react"; +import Modal from './Modal'; +import DataService from '../../services/DataService'; +import Toolbar from './ToolbarOnlyAdd' +import Table from './TableProduct'; + +export default function CustomerTable(props){ + const [items, setItems] = useState([]); + const [cartId, setCartId] = useState(0); + const [modalHeader, setModalHeader] = useState(''); + const [modalConfirm, setModalConfirm] = useState(''); + const [modalVisible, setModalVisible] = useState(false); + const [isEdit, setEdit] = useState(false); + + let selectedItems = []; + + useEffect(() => { + loadItems(); + }, []); + + function loadItems() { + const queryString = window.location.search; + const urlParams = new URLSearchParams(queryString); + var cartId = urlParams.get('id'); + console.log(cartId); + setCartId(cartId); + DataService.readAll(props.getAllUrl + cartId, props.transformer) + .then(data => setItems(data)); + } + + function saveItem() { + DataService.create(props.getUrl, "?cartId=" + cartId + + "&productId=" + props.data.productId).then(() => loadItems()); + } + + function handleAdd() { + setEdit(false); + setModalHeader('Регистрация'); + setModalConfirm('Добавить'); + setModalVisible(true); + props.onAdd(); + } + + function edit(editedId) { + DataService.read(props.getUrl + editedId, props.transformer) + .then(data => { + setEdit(true); + setModalHeader('Редактирование пользователя'); + setModalConfirm('Сохранить'); + setModalVisible(true); + props.onEdit(data); + }); + } + + function add(prodId){ + console.log(prodId); + DataService.update(props.url, prodId).then((results) => loadItems()); + } + + function remove(prodId) { + DataService.delete(props.getUrl + "?id=" + prodId).then((results) => loadItems()); + } + + function handleTableClick(tableSelectedItems) { + selectedItems = tableSelectedItems; + } + + function handleTableDblClick(tableSelectedItem) { + edit(tableSelectedItem); + } + + function handleModalHide() { + setModalVisible(false); + } + + function handleModalDone() { + saveItem(); + } + + return( + <> +

Корзина №{cartId}

+ + + + {props.children} + + + ) +} \ No newline at end of file diff --git a/front/src/components/common/CustomerTable.jsx b/front/src/components/common/CustomerTable.jsx new file mode 100644 index 0000000..e727d2c --- /dev/null +++ b/front/src/components/common/CustomerTable.jsx @@ -0,0 +1,117 @@ +import { useState, useEffect } from "react"; +import Modal from './Modal'; +import DataService from '../../services/DataService'; +import Toolbar from './Toolbar'; +import Table from './Table'; + +export default function CustomerTable(props){ + const [items, setItems] = useState([]); + const [modalHeader, setModalHeader] = useState(''); + const [modalConfirm, setModalConfirm] = useState(''); + const [modalVisible, setModalVisible] = useState(false); + const [isEdit, setEdit] = useState(false); + + let selectedItems = []; + + useEffect(() => { + loadItems(); + }, []); + + function loadItems() { + DataService.readAll(props.getAllUrl, props.transformer) + .then(data => setItems(data)); + } + + function saveItem() { + if (!isEdit) { + DataService.create(props.url, "?customerLastName=" + props.data.lastName + + "&customerFirstName=" + props.data.firstName + + "&customerAddress=" + props.data.customerAddress).then(() => loadItems()); + } else { + DataService.update(props.getUrl + props.data.id, "?customerLastName=" + props.data.lastName + + "&customerFirstName=" + props.data.firstName + + "&customerAddress=" + props.data.customerAddress).then(() => loadItems()); + } + } + + function handleAdd() { + setEdit(false); + setModalHeader('Регистрация'); + setModalConfirm('Добавить'); + setModalVisible(true); + props.onAdd(); + } + + function handleEdit() { + if (selectedItems.length === 0) { + return; + } + edit(selectedItems[0]); + } + + function edit(editedId) { + DataService.read(props.getUrl + editedId, props.transformer) + .then(data => { + setEdit(true); + setModalHeader('Редактирование пользователя'); + setModalConfirm('Сохранить'); + setModalVisible(true); + props.onEdit(data); + }); + } + + function handleRemove() { + if (selectedItems.length === 0) { + return; + } + if (confirm('Удалить выбранные элементы?')) { + const promises = []; + selectedItems.forEach(item => { + promises.push(DataService.delete(props.getUrl + item)); + }); + Promise.all(promises).then((results) => { + selectedItems.length = 0; + loadItems(); + }); + } + } + + function handleTableClick(tableSelectedItems) { + selectedItems = tableSelectedItems; + } + + function handleTableDblClick(tableSelectedItem) { + edit(tableSelectedItem); + } + + function handleModalHide() { + setModalVisible(false); + } + + function handleModalDone() { + saveItem(); + } + + return( + <> + +
+ + {props.children} + + + ) +} \ No newline at end of file diff --git a/front/src/components/common/Header.jsx b/front/src/components/common/Header.jsx new file mode 100644 index 0000000..c9bf50a --- /dev/null +++ b/front/src/components/common/Header.jsx @@ -0,0 +1,38 @@ +import { NavLink } from 'react-router-dom'; +import './style.css'; + +export default function Header(props) { + return ( +
+
+
+ + + +
+
+ ThiStore +
+
+
+
+ +
+ ); +} \ No newline at end of file diff --git a/front/src/components/common/Modal.jsx b/front/src/components/common/Modal.jsx new file mode 100644 index 0000000..71ff72a --- /dev/null +++ b/front/src/components/common/Modal.jsx @@ -0,0 +1,46 @@ +import React from "react"; + +export default function Modal(props) { + const formRef = React.createRef(); + + function hide() { + props.onHide(); + } + + function done(e) { + e.preventDefault(); + if (formRef.current.checkValidity()) { + props.onDone(); + hide(); + } else { + formRef.current.reportValidity(); + } + + } + + return ( + + ); +} \ No newline at end of file diff --git a/front/src/components/common/ProductCategoryTable.jsx b/front/src/components/common/ProductCategoryTable.jsx new file mode 100644 index 0000000..de5aded --- /dev/null +++ b/front/src/components/common/ProductCategoryTable.jsx @@ -0,0 +1,113 @@ +import { useState, useEffect } from "react"; +import Modal from './Modal'; +import DataService from '../../services/DataService'; +import Toolbar from './Toolbar'; +import Table from './Table'; + +export default function ProductCategoryTable(props){ + const [items, setItems] = useState([]); + const [modalHeader, setModalHeader] = useState(''); + const [modalConfirm, setModalConfirm] = useState(''); + const [modalVisible, setModalVisible] = useState(false); + const [isEdit, setEdit] = useState(false); + + let selectedItems = []; + + useEffect(() => { + loadItems(); + }, []); + + function loadItems() { + DataService.readAll(props.getAllUrl, props.transformer) + .then(data => setItems(data)); + } + + function saveItem() { + if (!isEdit) { + DataService.create(props.url, "?name=" + props.data.name).then(() => loadItems()); + } else { + DataService.update(props.getUrl + props.data.id, "?name=" + props.data.name).then(() => loadItems()); + } + } + + function handleAdd() { + setEdit(false); + setModalHeader('Добавления категории'); + setModalConfirm('Добавить'); + setModalVisible(true); + props.onAdd(); + } + + function handleEdit() { + if (selectedItems.length === 0) { + return; + } + edit(selectedItems[0]); + } + + function edit(editedId) { + DataService.read(props.getUrl + editedId, props.transformer) + .then(data => { + setEdit(true); + setModalHeader('Редактирование пользователя'); + setModalConfirm('Сохранить'); + setModalVisible(true); + props.onEdit(data); + }); + } + + function handleRemove() { + if (selectedItems.length === 0) { + return; + } + if (confirm('Удалить выбранные элементы?')) { + const promises = []; + selectedItems.forEach(item => { + promises.push(DataService.delete(props.getUrl + item)); + }); + Promise.all(promises).then((results) => { + selectedItems.length = 0; + loadItems(); + }); + } + } + + function handleTableClick(tableSelectedItems) { + selectedItems = tableSelectedItems; + } + + function handleTableDblClick(tableSelectedItem) { + edit(tableSelectedItem); + } + + function handleModalHide() { + setModalVisible(false); + } + + function handleModalDone() { + saveItem(); + } + + return( + <> + +
+ + {props.children} + + + ) +} \ No newline at end of file diff --git a/front/src/components/common/ProductTable.jsx b/front/src/components/common/ProductTable.jsx new file mode 100644 index 0000000..099e752 --- /dev/null +++ b/front/src/components/common/ProductTable.jsx @@ -0,0 +1,114 @@ +import { useState, useEffect } from "react"; +import Modal from './Modal'; +import DataService from '../../services/DataService'; +import Toolbar from './Toolbar'; +import Table from './Table'; + +export default function ProductTable(props){ + const [items, setItems] = useState([]); + const [modalHeader, setModalHeader] = useState(''); + const [modalConfirm, setModalConfirm] = useState(''); + const [modalVisible, setModalVisible] = useState(false); + const [isEdit, setEdit] = useState(false); + + let selectedItems = []; + + useEffect(() => { + loadItems(); + }, []); + + function loadItems() { + DataService.readAll(props.getAllUrl, props.transformer) + .then(data => setItems(data)); + } + + function saveItem() { + console.log("Createing product"); + if (!isEdit) { + DataService.create(props.url, "?productName=" + props.data.name + "&price=" + props.data.price + "&productCategoryId=" + props.data.productCategoryId).then(() => loadItems()); + } else { + DataService.update(props.getUrl + props.data.id, "?productName=" + props.data.name + "&price=" + props.data.price + "&productCategoryId=" + props.data.productCategoryId).then(() => loadItems()); + } + } + + function handleAdd() { + setEdit(false); + setModalHeader('Добавления товара'); + setModalConfirm('Добавить'); + setModalVisible(true); + props.onAdd(); + } + + function handleEdit() { + if (selectedItems.length === 0) { + return; + } + edit(selectedItems[0]); + } + + function edit(editedId) { + DataService.read(props.getUrl + editedId, props.transformer) + .then(data => { + setEdit(true); + setModalHeader('Редактирование пользователя'); + setModalConfirm('Сохранить'); + setModalVisible(true); + props.onEdit(data); + }); + } + + function handleRemove() { + if (selectedItems.length === 0) { + return; + } + if (confirm('Удалить выбранные элементы?')) { + const promises = []; + selectedItems.forEach(item => { + promises.push(DataService.delete(props.getUrl + item)); + }); + Promise.all(promises).then((results) => { + selectedItems.length = 0; + loadItems(); + }); + } + } + + function handleTableClick(tableSelectedItems) { + selectedItems = tableSelectedItems; + } + + function handleTableDblClick(tableSelectedItem) { + edit(tableSelectedItem); + } + + function handleModalHide() { + setModalVisible(false); + } + + function handleModalDone() { + saveItem(); + } + + return( + <> + +
+ + {props.children} + + + ) +} \ No newline at end of file diff --git a/front/src/components/common/Table.jsx b/front/src/components/common/Table.jsx new file mode 100644 index 0000000..93efb44 --- /dev/null +++ b/front/src/components/common/Table.jsx @@ -0,0 +1,73 @@ +import { useState } from 'react'; +import styles from './Table.module.css'; + +export default function Table(props) { + const [tableUpdate, setTableUpdate] = useState(false); + const [selectedItems, setSelectedItems] = useState([]); + + function isSelected(id) { + if (!props.selectable) { + return false; + } + return selectedItems.includes(id); + } + + function click(id) { + if (!props.selectable) { + return; + } + if (isSelected(id)) { + var index = selectedItems.indexOf(id); + if (index !== -1) { + selectedItems.splice(index, 1); + setSelectedItems(selectedItems); + setTableUpdate(!tableUpdate); + } + } else { + selectedItems.push(id); + setSelectedItems(selectedItems); + setTableUpdate(!tableUpdate); + } + props.onClick(selectedItems); + } + + function dblClick(id) { + if (!props.selectable) { + return; + } + props.onDblClick(id); + } + + return ( +
+ + + + { + props.headers.map(header => + + ) + } + + + + { + props.items.map((item, index) => + click(item.id, e)} onDoubleClick={(e) => dblClick(item.id, e)}> + + { + props.headers.map(header => + + ) + } + + ) + } + +
# + {header.label} +
{index + 1}{item[header.name]}
+ ); + } \ No newline at end of file diff --git a/front/src/components/common/Table.module.css b/front/src/components/common/Table.module.css new file mode 100644 index 0000000..f300e07 --- /dev/null +++ b/front/src/components/common/Table.module.css @@ -0,0 +1,12 @@ +.table tbody tr { + user-select: none; +} + +.selectable tbody tr:hover { + cursor: pointer; +} + +.selected { + background-color: #0d6efd; + opacity: 80%; +} \ No newline at end of file diff --git a/front/src/components/common/TableProduct.jsx b/front/src/components/common/TableProduct.jsx new file mode 100644 index 0000000..dc0bd1e --- /dev/null +++ b/front/src/components/common/TableProduct.jsx @@ -0,0 +1,90 @@ +import { useState } from 'react'; +import styles from './Table.module.css'; + +export default function Table(props) { + const [tableUpdate, setTableUpdate] = useState(false); + const [selectedItems, setSelectedItems] = useState([]); + + function isSelected(id) { + if (!props.selectable) { + return false; + } + return selectedItems.includes(id); + } + + function click(id) { + if (!props.selectable) { + return; + } + if (isSelected(id)) { + var index = selectedItems.indexOf(id); + if (index !== -1) { + selectedItems.splice(index, 1); + setSelectedItems(selectedItems); + setTableUpdate(!tableUpdate); + } + } else { + selectedItems.push(id); + setSelectedItems(selectedItems); + setTableUpdate(!tableUpdate); + } + props.onClick(selectedItems); + } + + function dblClick(id) { + if (!props.selectable) { + return; + } + props.onDblClick(id); + } + + function add(prodId){ + props.add(prodId); + } + + function remove(prodId){ + props.remove(prodId); + } + + return ( + + + + + { + props.headers.map(header => + + ) + } + + + + + { + props.items.map((item, index) => + click(item.id, e)} onDoubleClick={(e) => dblClick(item.id, e)}> + + { + props.headers.map(header => + + ) + } + + + ) + } + +
# + {header.label} +
{index + 1}{item[header.name]} + + +
+ ); + } \ No newline at end of file diff --git a/front/src/components/common/Toolbar.jsx b/front/src/components/common/Toolbar.jsx new file mode 100644 index 0000000..255847b --- /dev/null +++ b/front/src/components/common/Toolbar.jsx @@ -0,0 +1,29 @@ +import styles from './Toolbar.module.css'; + +export default function Toolbar(props) { + function add() { + props.onAdd(); + } + + function edit() { + props.onEdit(); + } + + function remove() { + props.onRemove(); + } + + return ( +
+ + + +
+ ); +} \ No newline at end of file diff --git a/front/src/components/common/Toolbar.module.css b/front/src/components/common/Toolbar.module.css new file mode 100644 index 0000000..b169b69 --- /dev/null +++ b/front/src/components/common/Toolbar.module.css @@ -0,0 +1,3 @@ +.btn { + min-width: 140px; +} \ No newline at end of file diff --git a/front/src/components/common/ToolbarOnlyAdd.jsx b/front/src/components/common/ToolbarOnlyAdd.jsx new file mode 100644 index 0000000..a8a9297 --- /dev/null +++ b/front/src/components/common/ToolbarOnlyAdd.jsx @@ -0,0 +1,15 @@ +import styles from './Toolbar.module.css'; + +export default function Toolbar(props) { + function add() { + props.onAdd(); + } + + return ( +
+ +
+ ); +} \ No newline at end of file diff --git a/front/src/components/common/style.css b/front/src/components/common/style.css new file mode 100644 index 0000000..a850281 --- /dev/null +++ b/front/src/components/common/style.css @@ -0,0 +1,473 @@ +.mainHtml{ + background-color: #ffb84b !important; +} +.hide{ + display: none; +} +.active{ + display: block; +} +.active img { + height: auto; +} +header { + height: fit-content; + background-image: linear-gradient(to right, #ff8400 , #ffc156); + align-items: center; +} + +img.center { + display: block; + margin: 0 auto; +} +div.colorBG{ + background-color: #ffb84b; +} + +.firstPart div { + display: flex; +} + +.firstPart figcaption { + color: white; + text-align: center; +} + +#salePrice{ + font-family: 'Agency FB Bold', arial; + margin-top: -10px; +} + +.adIphone { + color: white; + font-family: 'Antipasto Pro', sans-serif; + font-size: 28px; +} + +#saleText{ + color: red; + font-size: 35px; +} + +#specialText{ + font-size: 40px; + color: red; +} + +.adIphone figure img{ + text-align: justify-all; +} + +.menu { + flex-grow: 1; +} + +.menu a, +.menu .active { + font-family: 'Antipasto Pro', sans-serif; + display: block; + padding: 8px 10px; + color: white; + font-size: 22px; + text-decoration: none; +} + +.menu .active { + color: #fff; + background-color: #ff3d00; + border-radius: 8px; +} + +#siteName{ + color: white; + font-family: 'Agency FB Bold', arial; + font-size: 36px; +} + +#mainPage{ + font-size: 27px; +} + +#mainPage a{ + font-family: 'Antipasto Pro', sans-serif; + color: white; + text-decoration: none; +} +div.colorBG{ + background-color: #ffb84b; +} + +.firstPart{ + background-image: url(images/banner.png); + background-repeat: no-repeat; + background-size: 107%; +} + +.firstPart figure { + margin-inline-start: 10px; + margin-block-start: 10px; +} + +footer { + background-image: linear-gradient(to right, #ff8400 , #ffc156); +} + +.socialMedia{ + margin-right: 5px; + margin-left: auto; +} + +.socialMedia figcaption{ + font-family: 'Antipasto Pro', sans-serif; +} +.copyright { + margin-right: 10px; + flex-basis: 98%; + text-align: right; + color: white; + font-family: 'Agency FB', arial; +} +#weInSocial { + color: white; +} + +.aboutUsFooter{ + font-family: 'Antipasto Pro', sans-serif; +} + +.aboutUsFooter a{ + text-decoration: none; + color: white; +} + +.aboutUsFooter li{ + list-style-type: none; + margin: 7px 0; +} + +.aboutUsText figcaption { + color: #ff8400; + font-family: 'Antipasto Pro', sans-serif; + font-size: 46px; +} + +#loremIpsumText{ + color: black; + font-size: 20px; + margin-right: 15%; + margin-left: 15%; +} + +#leftColumn{ + flex-direction: column; +} + +#middleColumn{ + flex-direction: column; +} + +#rightColumn{ + text-align: center; + display: flex; + flex-direction: column; +} + +.item{ + text-align: center; + font-family: Segoe UI; + font-weight: bold; + font-size: 18px; +} + +.item figcaption{ + color: black; +} + +#Items { + columns: 3; + column-gap: 1em; +} + +* {box-sizing: border-box;} +form { + position: relative; + width: 400px; + margin-top: 20px; + margin-left: auto; + margin-right: auto; + background-image: linear-gradient(to right, #ff8400 , #ffc156); +} +input, button { + border: none; + outline: none; + background: transparent; +} +input { + height: 42px; +} +.searchbutton{ + height: 42px; + width: 42px; + position: absolute; + top: 0; + right: 0; + cursor: pointer; +} +button .searchbutton:before { + font-family: FontAwesome; + font-size: 16px; + color: #F9F0DA; +} + +.orders{ + width: 1000px; + display: block; + float: none; + height: 350px; + background: #ffc156; + border: 1px solid #C1C1C1; + overflow: auto; +} + +#activeOrders { + font-family: 'Antipasto Pro', sans-serif; + text-align: center; + font-size: 20px; + margin-top: 10px; + color: #c06300; +} + +#listOfInf{ + background-color: #ffc156; + height: 150px; + width: 900px; + vertical-align: center; + margin-top: 15px; + display: flex; +} + +#listOfInf li{ + color: #c06300; + list-style-type: none; + font-family: 'Antipasto Pro', sans-serif; + margin: 9px 0; +} + +.orderItem{ + display: flex; +} + +.nameItem{ + margin-top: 20px; + color: white; + font-family: 'Antipasto Pro', sans-serif; + margin-left: 0px; +} + +.priceItem { + color: white; + font-family: 'Antipasto Pro', sans-serif; + margin-bottom: 30px; + margin-top: auto; + margin-right: 100px; + margin-left: auto; +} + +.deleteItem button{ + color: white; + width: auto; + height: 25px; + font-family: 'Antipasto Pro', sans-serif; + font-size: 16px; + position: relative; + left: 10%; + top: 73%; + transform: translate(-70%, 0); + background: #ff8400; + +} + +.ordersCart{ + margin-left: auto; + margin-right: auto; + margin-bottom: 30px; + margin-top: 30px; + width: 1000px; + display: block; + float: none; + height: auto; + background: #ffc156; + border: 1px solid #C1C1C1; + overflow: auto; +} + +.orderItems button{ + color: white; + width: auto; + height: 40px; + font-family: 'Antipasto Pro', sans-serif; + font-size: 36px; + position: relative; + left: 85%; + top: 73%; + transform: translate(-70%, 0); + background: #ff8400; + margin-bottom: 50px; +} + +/* change the link color */ +.navbar-custom .navbar-nav .nav-link { + color: white; + font-family: 'Antipasto Pro', sans-serif; +} + +@media (max-width: 550px){ + .nameItem{ + font-size: 12px; + } + .deleteItem{ + font-size: 12px; + } + .priceItem{ + font-size: 12px; + } + .orderItem img{ + height: 120px; + width: auto; + } + .orderItems button { + font-size: 16px; + } +} +@media(max-width: 500px){ + header{ + flex-direction: column; + } + #mainPage{ + margin-top: 0px; + } + #leftPart a{ + font-size: 12px; + text-align: left; + margin-top: 0; + padding-top: 0; + } + .logo img{ + margin-top: 10px; + width: 35px; + height: 35px; + margin-top: 10px; + margin-bottom: 10px; + } + #siteName{ + font-size: 14px; + margin-top: 24px !important; + } + #profile li{ + font-size: 6px !important; + } + #profile ul{ + padding-left: 6px; + } + #activeOrders{ + font-size: 8px !important; + } + footer{ + font-size: 8px !important; + } + .socialMedia img{ + width: 20px; + height: 20px; + } + #Items { + columns: 1; + } + #textIphone{ + font-size: 10px; + } + #specialText{ + font-size: 12px; + } + #saleText{ + font-size: 12px; + } + #salePrice{ + font-size: 12px; + padding-top: 10px; + } +} + +@media(max-width: 700px){ + .firstPart img{ + width:80px !important; + height: auto; + } + .firstPart figcaption{ + font-size: 8px; + } + #textIphone{ + font-size: 12px; + } + #specialText{ + font-size: 14px; + } + #saleText{ + font-size: 16px; + } + #salePrice{ + font-size: 14px; + } +} +@media(max-width: 600px){ + .firstPart img{ + width:60px !important; + height: auto; + } + .firstPart figcaption{ + font-size: 6px; + } +} +@media(max-width: 800px){ + #profile li{ + font-size: 12px; + } + #activeOrders{ + font-size: 12px; + } + #avatar{ + width: 110px; + } + #profile ul{ + padding-left: 6px; + } + .socialMedia img{ + width: 35px; + height: 35px; + } + .firstPart img{ + width:90px; + height: auto; + } + .firstPart figcaption{ + font-size: 10px; + } + footer{ + font-size: 12px; + } + .navbar-toggler{ + margin-top: 10px !important; + } + #Items { + columns: 1; + } +} +@media(max-width: 900px){ + .firstPart img{ + width:100px; + height: auto; + } + .firstPart figcaption{ + font-size: 12px; + } +} + diff --git a/front/src/components/pages/cartPage.jsx b/front/src/components/pages/cartPage.jsx new file mode 100644 index 0000000..3e431b1 --- /dev/null +++ b/front/src/components/pages/cartPage.jsx @@ -0,0 +1,84 @@ +import CountProduct from '../../models/countProduct'; +import Product from '../../models/product'; +import CountProductTable from '../common/CountProductTable' +import DataService from '../../services/DataService'; +import { useState, useEffect} from "react"; + +import '../common/style.css'; + +export default function CartPage(){ + const url = 'countProduct/'; + const getUrl = 'countProduct'; + const getProductUrl = 'product' + const transformer = (data) => new CountProduct(data); + const transformerProd = (data) => new Product(data); + const catalogCountProductHeaders = [ + {name: 'name', label: 'Название' }, + {name: 'amount', label: 'Количество' }, + {name: 'price', label: 'Цена' }, + ]; + + const [data, setData] = useState(new CountProduct()); + const [productOptions, setProductOptions] = useState([]); + + function handleOnAdd() { + setData(new CountProduct()); + } + + function handleOnEdit(data) { + setData(new CountProduct(data)); + } + + function handleFormChange(event) { + setData({ ...data, [event.target.id]: event.target.value }) + } + + useEffect(() => { + loadOptions(); + }, []); + + async function loadOptions(){ + loadProdOptions(await DataService.readAll(getProductUrl, transformerProd)); + } + + function loadProdOptions(dataProduct){ + const products = []; + + dataProduct.forEach((value) => { + products.push({ + key: value.name, + value: value.id, + }) + }) + console.log(products); + setProductOptions(products); + } + + + return( +
+ + + + +
+ ) +} \ No newline at end of file diff --git a/front/src/components/pages/cartsPage.jsx b/front/src/components/pages/cartsPage.jsx new file mode 100644 index 0000000..f1d3755 --- /dev/null +++ b/front/src/components/pages/cartsPage.jsx @@ -0,0 +1,41 @@ +import Cart from "../../models/cart" +import CartTable from '../common/CartTable' +import { useState, useEffect} from "react"; + +import '../common/style.css'; + +export default function CartsPage(){ + const url = 'cart'; + const getUrl = 'cart/'; + const transformer = (data) => new Cart(data); + const catalogCartHeaders = [ + {name: 'customer', label: 'Покупатель' }, + ]; + + const [data, setData] = useState(new Cart()); + + function handleOnAdd() { + setData(new Cart()); + } + + function handleOnEdit(data) { + setData(new Cart(data)); + } + + function handleFormChange(event) { + setData({ ...data, [event.target.id]: event.target.value }) + } + return( +
+ + +
+ ) +} \ No newline at end of file diff --git a/front/src/components/pages/customerPage.jsx b/front/src/components/pages/customerPage.jsx new file mode 100644 index 0000000..aaac809 --- /dev/null +++ b/front/src/components/pages/customerPage.jsx @@ -0,0 +1,53 @@ +import Customer from "../../models/customer" +import CustomerTable from '../common/CustomerTable' +import { useState, useEffect} from "react"; + +export default function CustomerPage(){ + const url = 'customer'; + const getUrl = 'customer/'; + const transformer = (data) => new Customer(data); + const catalogCustomerHeaders = [ + { name: 'lastName', label: 'Фамилия' }, + {name: 'firstName', label: 'Имя'}, + {name: 'customerAddress', label: 'Адрес'} + ]; + + const [data, setData] = useState(new Customer()); + + function handleOnAdd() { + setData(new Customer()); + } + + function handleOnEdit(data) { + setData(new Customer(data)); + } + + function handleFormChange(event) { + setData({ ...data, [event.target.id]: event.target.value }) + } + return( +
+ +
+ + +
+
+ + +
+
+ + +
+
+
+ ) +} \ No newline at end of file diff --git a/front/src/components/pages/productCategoryPage.jsx b/front/src/components/pages/productCategoryPage.jsx new file mode 100644 index 0000000..5f69f36 --- /dev/null +++ b/front/src/components/pages/productCategoryPage.jsx @@ -0,0 +1,43 @@ +import ProductCategory from "../../models/productCategory" +import ProductCategoryTable from '../common/productCategoryTable' +import { useState, useEffect} from "react"; + +export default function ProductCategoryPage(){ + const url = 'productCategory'; + const getUrl = 'productCategory/'; + const transformer = (data) => new ProductCategory(data); + const catalogCustomerHeaders = [ + { name: 'name', label: 'Название категории' }, + ]; + + const [data, setData] = useState(new ProductCategory()); + + function handleOnAdd() { + setData(new ProductCategory()); + } + + function handleOnEdit(data) { + setData(new ProductCategory(data)); + } + + function handleFormChange(event) { + setData({ ...data, [event.target.id]: event.target.value }) + } + return( +
+ +
+ + +
+
+
+ ) +} \ No newline at end of file diff --git a/front/src/components/pages/productPage.jsx b/front/src/components/pages/productPage.jsx new file mode 100644 index 0000000..ac030b7 --- /dev/null +++ b/front/src/components/pages/productPage.jsx @@ -0,0 +1,91 @@ +import Product from "../../models/product" +import ProductCategory from "../../models/productCategory" +import DataService from '../../services/DataService'; +import ProductTable from '../common/productTable' +import { useState, useEffect} from "react"; + +export default function ProductPage(){ + const url = 'product'; + const getUrl = 'product/'; + const getCatUrl = 'productCategory'; + const transformer = (data) => new Product(data); + const transformerCat = (data) => new ProductCategory(data); + const catalogProductHeaders = [ + { name: 'name', label: 'Название товара' }, + { name: 'price', label: 'Цена' }, + { name: 'categoryName', label: 'Категория товара' } + ]; + + const [data, setData] = useState(new Product()); + const [productCategoryOptions, setProductCategoryOptions] = useState([]); + + function handleOnAdd() { + setData(new Product()); + } + + function handleOnEdit(data) { + setData(new Product(data)); + } + + function handleFormChange(event) { + setData({ ...data, [event.target.id]: event.target.value }) + } + + //подтягиваем список категорий в селект + + useEffect(() => { + loadOptions(); + }, []); + + async function loadOptions(){ + loadCatOptions(await DataService.readAll(getCatUrl, transformerCat)); + } + + function loadCatOptions(dataProductCategory){ + const productCategories = []; + + dataProductCategory.forEach((value) => { + productCategories.push({ + key: value.name, + value: value.id, + }) + }) + console.log(productCategories); + setProductCategoryOptions(productCategories); + } + + return( +
+ +
+ + +
+
+ + +
+ + +
+
+ ) +} \ No newline at end of file diff --git a/front/src/models/cart.js b/front/src/models/cart.js new file mode 100644 index 0000000..68f50cc --- /dev/null +++ b/front/src/models/cart.js @@ -0,0 +1,6 @@ +export default class Cart { + constructor(data) { + this.id = data?.id; + this.customer = data?.customer || ''; + } +} \ No newline at end of file diff --git a/front/src/models/countProduct.js b/front/src/models/countProduct.js new file mode 100644 index 0000000..8a6807b --- /dev/null +++ b/front/src/models/countProduct.js @@ -0,0 +1,8 @@ +export default class CountProduct { + constructor(data) { + this.id = data?.id; + this.name = data?.name || ''; + this.amount = data?.amount || ''; + this.price = data?.price || ''; + } +} \ No newline at end of file diff --git a/front/src/models/customer.js b/front/src/models/customer.js new file mode 100644 index 0000000..23ccdd0 --- /dev/null +++ b/front/src/models/customer.js @@ -0,0 +1,8 @@ +export default class Customer { + constructor(data) { + this.id = data?.id; + this.lastName = data?.lastName || ''; + this.firstName = data?.firstName || ''; + this.customerAddress = data?.customerAddress || ''; + } +} \ No newline at end of file diff --git a/front/src/models/product.js b/front/src/models/product.js new file mode 100644 index 0000000..5be6fd9 --- /dev/null +++ b/front/src/models/product.js @@ -0,0 +1,9 @@ +export default class Product { + constructor(data) { + this.id = data?.id; + this.name = data?.name || ''; + this.price = data?.price || ''; + this.productCategoryId = data?.productCategoryId || ''; + this.categoryName = data?.categoryName || ''; + } +} \ No newline at end of file diff --git a/front/src/models/productCategory.js b/front/src/models/productCategory.js new file mode 100644 index 0000000..b13c64e --- /dev/null +++ b/front/src/models/productCategory.js @@ -0,0 +1,6 @@ +export default class Product { + constructor(data) { + this.id = data?.id; + this.name = data?.name || ''; + } +} \ No newline at end of file diff --git a/front/src/services/DataService.js b/front/src/services/DataService.js new file mode 100644 index 0000000..f4e5cff --- /dev/null +++ b/front/src/services/DataService.js @@ -0,0 +1,45 @@ +import axios from 'axios'; + +function toJSON(data) { + const jsonObj = {}; + const fields = Object.getOwnPropertyNames(data); + for (const field of fields) { + if (data[field] === undefined) { + continue; + } + jsonObj[field] = data[field]; + } + return jsonObj; +} + +export default class DataService { + static dataUrlPrefix = 'http://localhost:8080/'; + + static async readAll(url, transformer) { + const response = await axios.get(this.dataUrlPrefix + url); + return response.data.map(item => transformer(item)); + } + + static async read(url, transformer) { + const response = await axios.get(this.dataUrlPrefix + url); + return transformer(response.data); + } + + static async create(url, data) { + console.log("Create " + this.dataUrlPrefix + url + data); + const response = await axios.post(this.dataUrlPrefix + url + data); + return true; + } + + static async update(url, data) { + console.log("UPD") + const response = await axios.put(this.dataUrlPrefix + url + data); + console.log("Done upd") + return true; + } + + static async delete(url) { + const response = await axios.delete(this.dataUrlPrefix + url); + return response.data.id; + } +} \ No newline at end of file diff --git a/front/src/style.css b/front/src/style.css new file mode 100644 index 0000000..a850281 --- /dev/null +++ b/front/src/style.css @@ -0,0 +1,473 @@ +.mainHtml{ + background-color: #ffb84b !important; +} +.hide{ + display: none; +} +.active{ + display: block; +} +.active img { + height: auto; +} +header { + height: fit-content; + background-image: linear-gradient(to right, #ff8400 , #ffc156); + align-items: center; +} + +img.center { + display: block; + margin: 0 auto; +} +div.colorBG{ + background-color: #ffb84b; +} + +.firstPart div { + display: flex; +} + +.firstPart figcaption { + color: white; + text-align: center; +} + +#salePrice{ + font-family: 'Agency FB Bold', arial; + margin-top: -10px; +} + +.adIphone { + color: white; + font-family: 'Antipasto Pro', sans-serif; + font-size: 28px; +} + +#saleText{ + color: red; + font-size: 35px; +} + +#specialText{ + font-size: 40px; + color: red; +} + +.adIphone figure img{ + text-align: justify-all; +} + +.menu { + flex-grow: 1; +} + +.menu a, +.menu .active { + font-family: 'Antipasto Pro', sans-serif; + display: block; + padding: 8px 10px; + color: white; + font-size: 22px; + text-decoration: none; +} + +.menu .active { + color: #fff; + background-color: #ff3d00; + border-radius: 8px; +} + +#siteName{ + color: white; + font-family: 'Agency FB Bold', arial; + font-size: 36px; +} + +#mainPage{ + font-size: 27px; +} + +#mainPage a{ + font-family: 'Antipasto Pro', sans-serif; + color: white; + text-decoration: none; +} +div.colorBG{ + background-color: #ffb84b; +} + +.firstPart{ + background-image: url(images/banner.png); + background-repeat: no-repeat; + background-size: 107%; +} + +.firstPart figure { + margin-inline-start: 10px; + margin-block-start: 10px; +} + +footer { + background-image: linear-gradient(to right, #ff8400 , #ffc156); +} + +.socialMedia{ + margin-right: 5px; + margin-left: auto; +} + +.socialMedia figcaption{ + font-family: 'Antipasto Pro', sans-serif; +} +.copyright { + margin-right: 10px; + flex-basis: 98%; + text-align: right; + color: white; + font-family: 'Agency FB', arial; +} +#weInSocial { + color: white; +} + +.aboutUsFooter{ + font-family: 'Antipasto Pro', sans-serif; +} + +.aboutUsFooter a{ + text-decoration: none; + color: white; +} + +.aboutUsFooter li{ + list-style-type: none; + margin: 7px 0; +} + +.aboutUsText figcaption { + color: #ff8400; + font-family: 'Antipasto Pro', sans-serif; + font-size: 46px; +} + +#loremIpsumText{ + color: black; + font-size: 20px; + margin-right: 15%; + margin-left: 15%; +} + +#leftColumn{ + flex-direction: column; +} + +#middleColumn{ + flex-direction: column; +} + +#rightColumn{ + text-align: center; + display: flex; + flex-direction: column; +} + +.item{ + text-align: center; + font-family: Segoe UI; + font-weight: bold; + font-size: 18px; +} + +.item figcaption{ + color: black; +} + +#Items { + columns: 3; + column-gap: 1em; +} + +* {box-sizing: border-box;} +form { + position: relative; + width: 400px; + margin-top: 20px; + margin-left: auto; + margin-right: auto; + background-image: linear-gradient(to right, #ff8400 , #ffc156); +} +input, button { + border: none; + outline: none; + background: transparent; +} +input { + height: 42px; +} +.searchbutton{ + height: 42px; + width: 42px; + position: absolute; + top: 0; + right: 0; + cursor: pointer; +} +button .searchbutton:before { + font-family: FontAwesome; + font-size: 16px; + color: #F9F0DA; +} + +.orders{ + width: 1000px; + display: block; + float: none; + height: 350px; + background: #ffc156; + border: 1px solid #C1C1C1; + overflow: auto; +} + +#activeOrders { + font-family: 'Antipasto Pro', sans-serif; + text-align: center; + font-size: 20px; + margin-top: 10px; + color: #c06300; +} + +#listOfInf{ + background-color: #ffc156; + height: 150px; + width: 900px; + vertical-align: center; + margin-top: 15px; + display: flex; +} + +#listOfInf li{ + color: #c06300; + list-style-type: none; + font-family: 'Antipasto Pro', sans-serif; + margin: 9px 0; +} + +.orderItem{ + display: flex; +} + +.nameItem{ + margin-top: 20px; + color: white; + font-family: 'Antipasto Pro', sans-serif; + margin-left: 0px; +} + +.priceItem { + color: white; + font-family: 'Antipasto Pro', sans-serif; + margin-bottom: 30px; + margin-top: auto; + margin-right: 100px; + margin-left: auto; +} + +.deleteItem button{ + color: white; + width: auto; + height: 25px; + font-family: 'Antipasto Pro', sans-serif; + font-size: 16px; + position: relative; + left: 10%; + top: 73%; + transform: translate(-70%, 0); + background: #ff8400; + +} + +.ordersCart{ + margin-left: auto; + margin-right: auto; + margin-bottom: 30px; + margin-top: 30px; + width: 1000px; + display: block; + float: none; + height: auto; + background: #ffc156; + border: 1px solid #C1C1C1; + overflow: auto; +} + +.orderItems button{ + color: white; + width: auto; + height: 40px; + font-family: 'Antipasto Pro', sans-serif; + font-size: 36px; + position: relative; + left: 85%; + top: 73%; + transform: translate(-70%, 0); + background: #ff8400; + margin-bottom: 50px; +} + +/* change the link color */ +.navbar-custom .navbar-nav .nav-link { + color: white; + font-family: 'Antipasto Pro', sans-serif; +} + +@media (max-width: 550px){ + .nameItem{ + font-size: 12px; + } + .deleteItem{ + font-size: 12px; + } + .priceItem{ + font-size: 12px; + } + .orderItem img{ + height: 120px; + width: auto; + } + .orderItems button { + font-size: 16px; + } +} +@media(max-width: 500px){ + header{ + flex-direction: column; + } + #mainPage{ + margin-top: 0px; + } + #leftPart a{ + font-size: 12px; + text-align: left; + margin-top: 0; + padding-top: 0; + } + .logo img{ + margin-top: 10px; + width: 35px; + height: 35px; + margin-top: 10px; + margin-bottom: 10px; + } + #siteName{ + font-size: 14px; + margin-top: 24px !important; + } + #profile li{ + font-size: 6px !important; + } + #profile ul{ + padding-left: 6px; + } + #activeOrders{ + font-size: 8px !important; + } + footer{ + font-size: 8px !important; + } + .socialMedia img{ + width: 20px; + height: 20px; + } + #Items { + columns: 1; + } + #textIphone{ + font-size: 10px; + } + #specialText{ + font-size: 12px; + } + #saleText{ + font-size: 12px; + } + #salePrice{ + font-size: 12px; + padding-top: 10px; + } +} + +@media(max-width: 700px){ + .firstPart img{ + width:80px !important; + height: auto; + } + .firstPart figcaption{ + font-size: 8px; + } + #textIphone{ + font-size: 12px; + } + #specialText{ + font-size: 14px; + } + #saleText{ + font-size: 16px; + } + #salePrice{ + font-size: 14px; + } +} +@media(max-width: 600px){ + .firstPart img{ + width:60px !important; + height: auto; + } + .firstPart figcaption{ + font-size: 6px; + } +} +@media(max-width: 800px){ + #profile li{ + font-size: 12px; + } + #activeOrders{ + font-size: 12px; + } + #avatar{ + width: 110px; + } + #profile ul{ + padding-left: 6px; + } + .socialMedia img{ + width: 35px; + height: 35px; + } + .firstPart img{ + width:90px; + height: auto; + } + .firstPart figcaption{ + font-size: 10px; + } + footer{ + font-size: 12px; + } + .navbar-toggler{ + margin-top: 10px !important; + } + #Items { + columns: 1; + } +} +@media(max-width: 900px){ + .firstPart img{ + width:100px; + height: auto; + } + .firstPart figcaption{ + font-size: 12px; + } +} + diff --git a/front/vite.config.js b/front/vite.config.js new file mode 100644 index 0000000..3f43fc4 --- /dev/null +++ b/front/vite.config.js @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()] +}) \ No newline at end of file